IyEgL3Vzci9iaW4vZW52IHB5dGhvbjMKIyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQojIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBCYXJyeSBXYXJzYXcgPGJhcnJ5QHpvcGUuY29tPgojCiMgTWluaW1hbGx5IHBhdGNoZWQgdG8gbWFrZSBpdCBldmVuIG1vcmUgeGdldHRleHQgY29tcGF0aWJsZQojIGJ5IFBldGVyIEZ1bmsgPHBmQGFydGNvbS1nbWJoLmRlPgojCiMgMjAwMi0xMS0yMiBK/HJnZW4gSGVybWFubiA8amhAd2ViLmRlPgojIEFkZGVkIGNoZWNrcyB0aGF0IF8oKSBvbmx5IGNvbnRhaW5zIHN0cmluZyBsaXRlcmFscywgYW5kCiMgY29tbWFuZCBsaW5lIGFyZ3MgYXJlIHJlc29sdmVkIHRvIG1vZHVsZSBsaXN0cywgaS5lLiB5b3UKIyBjYW4gbm93IHBhc3MgYSBmaWxlbmFtZSwgYSBtb2R1bGUgb3IgcGFja2FnZSBuYW1lLCBvciBhCiMgZGlyZWN0b3J5IChpbmNsdWRpbmcgZ2xvYmJpbmcgY2hhcnMsIGltcG9ydGFudCBmb3IgV2luMzIpLgojIE1hZGUgZG9jc3RyaW5nIGZpdCBpbiA4MCBjaGFycyB3aWRlIGRpc3BsYXlzIHVzaW5nIHB5ZG9jLgojCgojIGZvciBzZWxmdGVzdGluZwp0cnk6CiAgICBpbXBvcnQgZmludGwKICAgIF8gPSBmaW50bC5nZXR0ZXh0CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIF8gPSBsYW1iZGEgczogcwoKX19kb2NfXyA9IF8oIiIicHlnZXR0ZXh0IC0tIFB5dGhvbiBlcXVpdmFsZW50IG9mIHhnZXR0ZXh0KDEpCgpNYW55IHN5c3RlbXMgKFNvbGFyaXMsIExpbnV4LCBHbnUpIHByb3ZpZGUgZXh0ZW5zaXZlIHRvb2xzIHRoYXQgZWFzZSB0aGUKaW50ZXJuYXRpb25hbGl6YXRpb24gb2YgQyBwcm9ncmFtcy4gTW9zdCBvZiB0aGVzZSB0b29scyBhcmUgaW5kZXBlbmRlbnQgb2YKdGhlIHByb2dyYW1taW5nIGxhbmd1YWdlIGFuZCBjYW4gYmUgdXNlZCBmcm9tIHdpdGhpbiBQeXRob24gcHJvZ3JhbXMuCk1hcnRpbiB2b24gTG9ld2lzJyB3b3JrWzFdIGhlbHBzIGNvbnNpZGVyYWJseSBpbiB0aGlzIHJlZ2FyZC4KClRoZXJlJ3Mgb25lIHByb2JsZW0gdGhvdWdoOyB4Z2V0dGV4dCBpcyB0aGUgcHJvZ3JhbSB0aGF0IHNjYW5zIHNvdXJjZSBjb2RlCmxvb2tpbmcgZm9yIG1lc3NhZ2Ugc3RyaW5ncywgYnV0IGl0IGdyb2tzIG9ubHkgQyAob3IgQysrKS4gUHl0aG9uCmludHJvZHVjZXMgYSBmZXcgd3JpbmtsZXMsIHN1Y2ggYXMgZHVhbCBxdW90aW5nIGNoYXJhY3RlcnMsIHRyaXBsZSBxdW90ZWQKc3RyaW5ncywgYW5kIHJhdyBzdHJpbmdzLiB4Z2V0dGV4dCB1bmRlcnN0YW5kcyBub25lIG9mIHRoaXMuCgpFbnRlciBweWdldHRleHQsIHdoaWNoIHVzZXMgUHl0aG9uJ3Mgc3RhbmRhcmQgdG9rZW5pemUgbW9kdWxlIHRvIHNjYW4KUHl0aG9uIHNvdXJjZSBjb2RlLCBnZW5lcmF0aW5nIC5wb3QgZmlsZXMgaWRlbnRpY2FsIHRvIHdoYXQgR05VIHhnZXR0ZXh0WzJdCmdlbmVyYXRlcyBmb3IgQyBhbmQgQysrIGNvZGUuIEZyb20gdGhlcmUsIHRoZSBzdGFuZGFyZCBHTlUgdG9vbHMgY2FuIGJlCnVzZWQuCgpBIHdvcmQgYWJvdXQgbWFya2luZyBQeXRob24gc3RyaW5ncyBhcyBjYW5kaWRhdGVzIGZvciB0cmFuc2xhdGlvbi4gR05VCnhnZXR0ZXh0IHJlY29nbml6ZXMgdGhlIGZvbGxvd2luZyBrZXl3b3JkczogZ2V0dGV4dCwgZGdldHRleHQsIGRjZ2V0dGV4dCwKYW5kIGdldHRleHRfbm9vcC4gQnV0IHRob3NlIGNhbiBiZSBhIGxvdCBvZiB0ZXh0IHRvIGluY2x1ZGUgYWxsIG92ZXIgeW91cgpjb2RlLiBDIGFuZCBDKysgaGF2ZSBhIHRyaWNrOiB0aGV5IHVzZSB0aGUgQyBwcmVwcm9jZXNzb3IuIE1vc3QKaW50ZXJuYXRpb25hbGl6ZWQgQyBzb3VyY2UgaW5jbHVkZXMgYSAjZGVmaW5lIGZvciBnZXR0ZXh0KCkgdG8gXygpIHNvIHRoYXQKd2hhdCBoYXMgdG8gYmUgd3JpdHRlbiBpbiB0aGUgc291cmNlIGlzIG11Y2ggbGVzcy4gVGh1cyB0aGVzZSBhcmUgYm90aAp0cmFuc2xhdGFibGUgc3RyaW5nczoKCiAgICBnZXR0ZXh0KCJUcmFuc2xhdGFibGUgU3RyaW5nIikKICAgIF8oIlRyYW5zbGF0YWJsZSBTdHJpbmciKQoKUHl0aG9uIG9mIGNvdXJzZSBoYXMgbm8gcHJlcHJvY2Vzc29yIHNvIHRoaXMgZG9lc24ndCB3b3JrIHNvIHdlbGwuICBUaHVzLApweWdldHRleHQgc2VhcmNoZXMgb25seSBmb3IgXygpIGJ5IGRlZmF1bHQsIGJ1dCBzZWUgdGhlIC1rLy0ta2V5d29yZCBmbGFnCmJlbG93IGZvciBob3cgdG8gYXVnbWVudCB0aGlzLgoKIFsxXSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvd29ya3Nob3BzLzE5OTctMTAvcHJvY2VlZGluZ3MvbG9ld2lzLmh0bWwKIFsyXSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2V0dGV4dC9nZXR0ZXh0Lmh0bWwKCk5PVEU6IHB5Z2V0dGV4dCBhdHRlbXB0cyB0byBiZSBvcHRpb24gYW5kIGZlYXR1cmUgY29tcGF0aWJsZSB3aXRoIEdOVQp4Z2V0dGV4dCB3aGVyZSBldmVyIHBvc3NpYmxlLiBIb3dldmVyIHNvbWUgb3B0aW9ucyBhcmUgc3RpbGwgbWlzc2luZyBvciBhcmUKbm90IGZ1bGx5IGltcGxlbWVudGVkLiBBbHNvLCB4Z2V0dGV4dCdzIHVzZSBvZiBjb21tYW5kIGxpbmUgc3dpdGNoZXMgd2l0aApvcHRpb24gYXJndW1lbnRzIGlzIGJyb2tlbiwgYW5kIGluIHRoZXNlIGNhc2VzLCBweWdldHRleHQganVzdCBkZWZpbmVzCmFkZGl0aW9uYWwgc3dpdGNoZXMuCgpVc2FnZTogcHlnZXR0ZXh0IFtvcHRpb25zXSBpbnB1dGZpbGUgLi4uCgpPcHRpb25zOgoKICAgIC1hCiAgICAtLWV4dHJhY3QtYWxsCiAgICAgICAgRXh0cmFjdCBhbGwgc3RyaW5ncy4KCiAgICAtZCBuYW1lCiAgICAtLWRlZmF1bHQtZG9tYWluPW5hbWUKICAgICAgICBSZW5hbWUgdGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUgZnJvbSBtZXNzYWdlcy5wb3QgdG8gbmFtZS5wb3QuCgogICAgLUUKICAgIC0tZXNjYXBlCiAgICAgICAgUmVwbGFjZSBub24tQVNDSUkgY2hhcmFjdGVycyB3aXRoIG9jdGFsIGVzY2FwZSBzZXF1ZW5jZXMuCgogICAgLUQKICAgIC0tZG9jc3RyaW5ncwogICAgICAgIEV4dHJhY3QgbW9kdWxlLCBjbGFzcywgbWV0aG9kLCBhbmQgZnVuY3Rpb24gZG9jc3RyaW5ncy4gIFRoZXNlIGRvCiAgICAgICAgbm90IG5lZWQgdG8gYmUgd3JhcHBlZCBpbiBfKCkgbWFya2VycywgYW5kIGluIGZhY3QgY2Fubm90IGJlIGZvcgogICAgICAgIFB5dGhvbiB0byBjb25zaWRlciB0aGVtIGRvY3N0cmluZ3MuIChTZWUgYWxzbyB0aGUgLVggb3B0aW9uKS4KCiAgICAtaAogICAgLS1oZWxwCiAgICAgICAgUHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCgogICAgLWsgd29yZAogICAgLS1rZXl3b3JkPXdvcmQKICAgICAgICBLZXl3b3JkcyB0byBsb29rIGZvciBpbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdCBzZXQsIHdoaWNoIGFyZToKICAgICAgICAlKERFRkFVTFRLRVlXT1JEUylzCgogICAgICAgIFlvdSBjYW4gaGF2ZSBtdWx0aXBsZSAtayBmbGFncyBvbiB0aGUgY29tbWFuZCBsaW5lLgoKICAgIC1LCiAgICAtLW5vLWRlZmF1bHQta2V5d29yZHMKICAgICAgICBEaXNhYmxlIHRoZSBkZWZhdWx0IHNldCBvZiBrZXl3b3JkcyAoc2VlIGFib3ZlKS4gIEFueSBrZXl3b3JkcwogICAgICAgIGV4cGxpY2l0bHkgYWRkZWQgd2l0aCB0aGUgLWsvLS1rZXl3b3JkIG9wdGlvbiBhcmUgc3RpbGwgcmVjb2duaXplZC4KCiAgICAtLW5vLWxvY2F0aW9uCiAgICAgICAgRG8gbm90IHdyaXRlIGZpbGVuYW1lL2xpbmVubyBsb2NhdGlvbiBjb21tZW50cy4KCiAgICAtbgogICAgLS1hZGQtbG9jYXRpb24KICAgICAgICBXcml0ZSBmaWxlbmFtZS9saW5lbm8gbG9jYXRpb24gY29tbWVudHMgaW5kaWNhdGluZyB3aGVyZSBlYWNoCiAgICAgICAgZXh0cmFjdGVkIHN0cmluZyBpcyBmb3VuZCBpbiB0aGUgc291cmNlLiAgVGhlc2UgbGluZXMgYXBwZWFyIGJlZm9yZQogICAgICAgIGVhY2ggbXNnaWQuICBUaGUgc3R5bGUgb2YgY29tbWVudHMgaXMgY29udHJvbGxlZCBieSB0aGUgLVMvLS1zdHlsZQogICAgICAgIG9wdGlvbi4gIFRoaXMgaXMgdGhlIGRlZmF1bHQuCgogICAgLW8gZmlsZW5hbWUKICAgIC0tb3V0cHV0PWZpbGVuYW1lCiAgICAgICAgUmVuYW1lIHRoZSBkZWZhdWx0IG91dHB1dCBmaWxlIGZyb20gbWVzc2FnZXMucG90IHRvIGZpbGVuYW1lLiAgSWYKICAgICAgICBmaWxlbmFtZSBpcyBgLScgdGhlbiB0aGUgb3V0cHV0IGlzIHNlbnQgdG8gc3RhbmRhcmQgb3V0LgoKICAgIC1wIGRpcgogICAgLS1vdXRwdXQtZGlyPWRpcgogICAgICAgIE91dHB1dCBmaWxlcyB3aWxsIGJlIHBsYWNlZCBpbiBkaXJlY3RvcnkgZGlyLgoKICAgIC1TIHN0eWxlbmFtZQogICAgLS1zdHlsZSBzdHlsZW5hbWUKICAgICAgICBTcGVjaWZ5IHdoaWNoIHN0eWxlIHRvIHVzZSBmb3IgbG9jYXRpb24gY29tbWVudHMuICBUd28gc3R5bGVzIGFyZQogICAgICAgIHN1cHBvcnRlZDoKCiAgICAgICAgU29sYXJpcyAgIyBGaWxlOiBmaWxlbmFtZSwgbGluZTogbGluZS1udW1iZXIKICAgICAgICBHTlUgICAgICAjOiBmaWxlbmFtZTpsaW5lCgogICAgICAgIFRoZSBzdHlsZSBuYW1lIGlzIGNhc2UgaW5zZW5zaXRpdmUuICBHTlUgc3R5bGUgaXMgdGhlIGRlZmF1bHQuCgogICAgLXYKICAgIC0tdmVyYm9zZQogICAgICAgIFByaW50IHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgYmVpbmcgcHJvY2Vzc2VkLgoKICAgIC1WCiAgICAtLXZlcnNpb24KICAgICAgICBQcmludCB0aGUgdmVyc2lvbiBvZiBweWdldHRleHQgYW5kIGV4aXQuCgogICAgLXcgY29sdW1ucwogICAgLS13aWR0aD1jb2x1bW5zCiAgICAgICAgU2V0IHdpZHRoIG9mIG91dHB1dCB0byBjb2x1bW5zLgoKICAgIC14IGZpbGVuYW1lCiAgICAtLWV4Y2x1ZGUtZmlsZT1maWxlbmFtZQogICAgICAgIFNwZWNpZnkgYSBmaWxlIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIHN0cmluZ3MgdGhhdCBhcmUgbm90IGJlCiAgICAgICAgZXh0cmFjdGVkIGZyb20gdGhlIGlucHV0IGZpbGVzLiAgRWFjaCBzdHJpbmcgdG8gYmUgZXhjbHVkZWQgbXVzdAogICAgICAgIGFwcGVhciBvbiBhIGxpbmUgYnkgaXRzZWxmIGluIHRoZSBmaWxlLgoKICAgIC1YIGZpbGVuYW1lCiAgICAtLW5vLWRvY3N0cmluZ3M9ZmlsZW5hbWUKICAgICAgICBTcGVjaWZ5IGEgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBmaWxlcyAob25lIHBlciBsaW5lKSB0aGF0CiAgICAgICAgc2hvdWxkIG5vdCBoYXZlIHRoZWlyIGRvY3N0cmluZ3MgZXh0cmFjdGVkLiAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBpbgogICAgICAgIGNvbmp1bmN0aW9uIHdpdGggdGhlIC1EIG9wdGlvbiBhYm92ZS4KCklmIGBpbnB1dGZpbGUnIGlzIC0sIHN0YW5kYXJkIGlucHV0IGlzIHJlYWQuCiIiIikKCmltcG9ydCBvcwppbXBvcnQgaW1wCmltcG9ydCBzeXMKaW1wb3J0IGdsb2IKaW1wb3J0IHRpbWUKaW1wb3J0IGdldG9wdAppbXBvcnQgdG9rZW4KaW1wb3J0IHRva2VuaXplCmltcG9ydCBvcGVyYXRvcgoKX192ZXJzaW9uX18gPSAnMS41JwoKZGVmYXVsdF9rZXl3b3JkcyA9IFsnXyddCkRFRkFVTFRLRVlXT1JEUyA9ICcsICcuam9pbihkZWZhdWx0X2tleXdvcmRzKQoKRU1QVFlTVFJJTkcgPSAnJwoKCgwKIyBUaGUgbm9ybWFsIHBvdC1maWxlIGhlYWRlci4gbXNnbWVyZ2UgYW5kIEVtYWNzJ3MgcG8tbW9kZSB3b3JrIGJldHRlciBpZiBpdCdzCiMgdGhlcmUuCnBvdF9oZWFkZXIgPSBfKCcnJ1wKIyBTT01FIERFU0NSSVBUSVZFIFRJVExFLgojIENvcHlyaWdodCAoQykgWUVBUiBPUkdBTklaQVRJT04KIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgojCm1zZ2lkICIiCm1zZ3N0ciAiIgoiUHJvamVjdC1JZC1WZXJzaW9uOiBQQUNLQUdFIFZFUlNJT05cXG4iCiJQT1QtQ3JlYXRpb24tRGF0ZTogJSh0aW1lKXNcXG4iCiJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcXG4iCiJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cXG4iCiJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxcbiIKIk1JTUUtVmVyc2lvbjogMS4wXFxuIgoiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcXG4iCiJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xcbiIKIkdlbmVyYXRlZC1CeTogcHlnZXR0ZXh0LnB5ICUodmVyc2lvbilzXFxuIgoKJycnKQoKDApkZWYgdXNhZ2UoY29kZSwgbXNnPScnKToKICAgIHByaW50KF9fZG9jX18gJSBnbG9iYWxzKCksIGZpbGU9c3lzLnN0ZGVycikKICAgIGlmIG1zZzoKICAgICAgICBwcmludChtc2csIGZpbGU9c3lzLnN0ZGVycikKICAgIHN5cy5leGl0KGNvZGUpCgoKDAplc2NhcGVzID0gW10KCmRlZiBtYWtlX2VzY2FwZXMocGFzc19pc284ODU5KToKICAgIGdsb2JhbCBlc2NhcGVzCiAgICBpZiBwYXNzX2lzbzg4NTk6CiAgICAgICAgIyBBbGxvdyBpc28tODg1OSBjaGFyYWN0ZXJzIHRvIHBhc3MgdGhyb3VnaCBzbyB0aGF0IGUuZy4gJ21zZ2lkCiAgICAgICAgIyAiSPZoZSInIHdvdWxkIHJlc3VsdCBub3QgcmVzdWx0IGluICdtc2dpZCAiSFwzNjZoZSInLiAgT3RoZXJ3aXNlIHdlCiAgICAgICAgIyBlc2NhcGUgYW55IGNoYXJhY3RlciBvdXRzaWRlIHRoZSAzMi4uMTI2IHJhbmdlLgogICAgICAgIG1vZCA9IDEyOAogICAgZWxzZToKICAgICAgICBtb2QgPSAyNTYKICAgIGZvciBpIGluIHJhbmdlKDI1Nik6CiAgICAgICAgaWYgMzIgPD0gKGkgJSBtb2QpIDw9IDEyNjoKICAgICAgICAgICAgZXNjYXBlcy5hcHBlbmQoY2hyKGkpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGVzY2FwZXMuYXBwZW5kKCJcXCUwM28iICUgaSkKICAgIGVzY2FwZXNbb3JkKCdcXCcpXSA9ICdcXFxcJwogICAgZXNjYXBlc1tvcmQoJ1x0JyldID0gJ1xcdCcKICAgIGVzY2FwZXNbb3JkKCdccicpXSA9ICdcXHInCiAgICBlc2NhcGVzW29yZCgnXG4nKV0gPSAnXFxuJwogICAgZXNjYXBlc1tvcmQoJ1wiJyldID0gJ1xcIicKCgpkZWYgZXNjYXBlKHMpOgogICAgZ2xvYmFsIGVzY2FwZXMKICAgIHMgPSBsaXN0KHMpCiAgICBmb3IgaSBpbiByYW5nZShsZW4ocykpOgogICAgICAgIHNbaV0gPSBlc2NhcGVzW29yZChzW2ldKV0KICAgIHJldHVybiBFTVBUWVNUUklORy5qb2luKHMpCgoKZGVmIHNhZmVfZXZhbChzKToKICAgICMgdW53cmFwIHF1b3Rlcywgc2FmZWx5CiAgICByZXR1cm4gZXZhbChzLCB7J19fYnVpbHRpbnNfXyc6e319LCB7fSkKCgpkZWYgbm9ybWFsaXplKHMpOgogICAgIyBUaGlzIGNvbnZlcnRzIHRoZSB2YXJpb3VzIFB5dGhvbiBzdHJpbmcgdHlwZXMgaW50byBhIGZvcm1hdCB0aGF0IGlzCiAgICAjIGFwcHJvcHJpYXRlIGZvciAucG8gZmlsZXMsIG5hbWVseSBtdWNoIGNsb3NlciB0byBDIHN0eWxlLgogICAgbGluZXMgPSBzLnNwbGl0KCdcbicpCiAgICBpZiBsZW4obGluZXMpID09IDE6CiAgICAgICAgcyA9ICciJyArIGVzY2FwZShzKSArICciJwogICAgZWxzZToKICAgICAgICBpZiBub3QgbGluZXNbLTFdOgogICAgICAgICAgICBkZWwgbGluZXNbLTFdCiAgICAgICAgICAgIGxpbmVzWy0xXSA9IGxpbmVzWy0xXSArICdcbicKICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obGluZXMpKToKICAgICAgICAgICAgbGluZXNbaV0gPSBlc2NhcGUobGluZXNbaV0pCiAgICAgICAgbGluZXRlcm0gPSAnXFxuIlxuIicKICAgICAgICBzID0gJyIiXG4iJyArIGxpbmV0ZXJtLmpvaW4obGluZXMpICsgJyInCiAgICByZXR1cm4gcwoKDApkZWYgY29udGFpbnNBbnkoc3RyLCBzZXQpOgogICAgIiIiQ2hlY2sgd2hldGhlciAnc3RyJyBjb250YWlucyBBTlkgb2YgdGhlIGNoYXJzIGluICdzZXQnIiIiCiAgICByZXR1cm4gMSBpbiBbYyBpbiBzdHIgZm9yIGMgaW4gc2V0XQoKCmRlZiBfdmlzaXRfcHlmaWxlcyhsaXN0LCBkaXJuYW1lLCBuYW1lcyk6CiAgICAiIiJIZWxwZXIgZm9yIGdldEZpbGVzRm9yTmFtZSgpLiIiIgogICAgIyBnZXQgZXh0ZW5zaW9uIGZvciBweXRob24gc291cmNlIGZpbGVzCiAgICBpZiAnX3B5X2V4dCcgbm90IGluIGdsb2JhbHMoKToKICAgICAgICBnbG9iYWwgX3B5X2V4dAogICAgICAgIF9weV9leHQgPSBbdHJpcGxlWzBdIGZvciB0cmlwbGUgaW4gaW1wLmdldF9zdWZmaXhlcygpCiAgICAgICAgICAgICAgICAgICBpZiB0cmlwbGVbMl0gPT0gaW1wLlBZX1NPVVJDRV1bMF0KCiAgICAjIGRvbid0IHJlY3Vyc2UgaW50byBDVlMgZGlyZWN0b3JpZXMKICAgIGlmICdDVlMnIGluIG5hbWVzOgogICAgICAgIG5hbWVzLnJlbW92ZSgnQ1ZTJykKCiAgICAjIGFkZCBhbGwgKi5weSBmaWxlcyB0byBsaXN0CiAgICBsaXN0LmV4dGVuZCgKICAgICAgICBbb3MucGF0aC5qb2luKGRpcm5hbWUsIGZpbGUpIGZvciBmaWxlIGluIG5hbWVzCiAgICAgICAgIGlmIG9zLnBhdGguc3BsaXRleHQoZmlsZSlbMV0gPT0gX3B5X2V4dF0KICAgICAgICApCgoKZGVmIF9nZXRfbW9kcGtnX3BhdGgoZG90dGVkX25hbWUsIHBhdGhsaXN0PU5vbmUpOgogICAgIiIiR2V0IHRoZSBmaWxlc3lzdGVtIHBhdGggZm9yIGEgbW9kdWxlIG9yIGEgcGFja2FnZS4KCiAgICBSZXR1cm4gdGhlIGZpbGUgc3lzdGVtIHBhdGggdG8gYSBmaWxlIGZvciBhIG1vZHVsZSwgYW5kIHRvIGEgZGlyZWN0b3J5IGZvcgogICAgYSBwYWNrYWdlLiBSZXR1cm4gTm9uZSBpZiB0aGUgbmFtZSBpcyBub3QgZm91bmQsIG9yIGlzIGEgYnVpbHRpbiBvcgogICAgZXh0ZW5zaW9uIG1vZHVsZS4KICAgICIiIgogICAgIyBzcGxpdCBvZmYgdG9wLW1vc3QgbmFtZQogICAgcGFydHMgPSBkb3R0ZWRfbmFtZS5zcGxpdCgnLicsIDEpCgogICAgaWYgbGVuKHBhcnRzKSA+IDE6CiAgICAgICAgIyB3ZSBoYXZlIGEgZG90dGVkIHBhdGgsIGltcG9ydCB0b3AtbGV2ZWwgcGFja2FnZQogICAgICAgIHRyeToKICAgICAgICAgICAgZmlsZSwgcGF0aG5hbWUsIGRlc2NyaXB0aW9uID0gaW1wLmZpbmRfbW9kdWxlKHBhcnRzWzBdLCBwYXRobGlzdCkKICAgICAgICAgICAgaWYgZmlsZTogZmlsZS5jbG9zZSgpCiAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAjIGNoZWNrIGlmIGl0J3MgaW5kZWVkIGEgcGFja2FnZQogICAgICAgIGlmIGRlc2NyaXB0aW9uWzJdID09IGltcC5QS0dfRElSRUNUT1JZOgogICAgICAgICAgICAjIHJlY3Vyc2l2ZWx5IGhhbmRsZSB0aGUgcmVtYWluaW5nIG5hbWUgcGFydHMKICAgICAgICAgICAgcGF0aG5hbWUgPSBfZ2V0X21vZHBrZ19wYXRoKHBhcnRzWzFdLCBbcGF0aG5hbWVdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhdGhuYW1lID0gTm9uZQogICAgZWxzZToKICAgICAgICAjIHBsYWluIG5hbWUKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGUsIHBhdGhuYW1lLCBkZXNjcmlwdGlvbiA9IGltcC5maW5kX21vZHVsZSgKICAgICAgICAgICAgICAgIGRvdHRlZF9uYW1lLCBwYXRobGlzdCkKICAgICAgICAgICAgaWYgZmlsZToKICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKQogICAgICAgICAgICBpZiBkZXNjcmlwdGlvblsyXSBub3QgaW4gW2ltcC5QWV9TT1VSQ0UsIGltcC5QS0dfRElSRUNUT1JZXToKICAgICAgICAgICAgICAgIHBhdGhuYW1lID0gTm9uZQogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgcGF0aG5hbWUgPSBOb25lCgogICAgcmV0dXJuIHBhdGhuYW1lCgoKZGVmIGdldEZpbGVzRm9yTmFtZShuYW1lKToKICAgICIiIkdldCBhIGxpc3Qgb2YgbW9kdWxlIGZpbGVzIGZvciBhIGZpbGVuYW1lLCBhIG1vZHVsZSBvciBwYWNrYWdlIG5hbWUsCiAgICBvciBhIGRpcmVjdG9yeS4KICAgICIiIgogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgogICAgICAgICMgY2hlY2sgZm9yIGdsb2IgY2hhcnMKICAgICAgICBpZiBjb250YWluc0FueShuYW1lLCAiKj9bXSIpOgogICAgICAgICAgICBmaWxlcyA9IGdsb2IuZ2xvYihuYW1lKQogICAgICAgICAgICBsaXN0ID0gW10KICAgICAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICBsaXN0LmV4dGVuZChnZXRGaWxlc0Zvck5hbWUoZmlsZSkpCiAgICAgICAgICAgIHJldHVybiBsaXN0CgogICAgICAgICMgdHJ5IHRvIGZpbmQgbW9kdWxlIG9yIHBhY2thZ2UKICAgICAgICBuYW1lID0gX2dldF9tb2Rwa2dfcGF0aChuYW1lKQogICAgICAgIGlmIG5vdCBuYW1lOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICBpZiBvcy5wYXRoLmlzZGlyKG5hbWUpOgogICAgICAgICMgZmluZCBhbGwgcHl0aG9uIGZpbGVzIGluIGRpcmVjdG9yeQogICAgICAgIGxpc3QgPSBbXQogICAgICAgIG9zLndhbGsobmFtZSwgX3Zpc2l0X3B5ZmlsZXMsIGxpc3QpCiAgICAgICAgcmV0dXJuIGxpc3QKICAgIGVsaWYgb3MucGF0aC5leGlzdHMobmFtZSk6CiAgICAgICAgIyBhIHNpbmdsZSBmaWxlCiAgICAgICAgcmV0dXJuIFtuYW1lXQoKICAgIHJldHVybiBbXQoKDApjbGFzcyBUb2tlbkVhdGVyOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbnMpOgogICAgICAgIHNlbGYuX19vcHRpb25zID0gb3B0aW9ucwogICAgICAgIHNlbGYuX19tZXNzYWdlcyA9IHt9CiAgICAgICAgc2VsZi5fX3N0YXRlID0gc2VsZi5fX3dhaXRpbmcKICAgICAgICBzZWxmLl9fZGF0YSA9IFtdCiAgICAgICAgc2VsZi5fX2xpbmVubyA9IC0xCiAgICAgICAgc2VsZi5fX2ZyZXNobW9kdWxlID0gMQogICAgICAgIHNlbGYuX19jdXJmaWxlID0gTm9uZQoKICAgIGRlZiBfX2NhbGxfXyhzZWxmLCB0dHlwZSwgdHN0cmluZywgc3R1cCwgZXR1cCwgbGluZSk6CiAgICAgICAgIyBkaXNwYXRjaAojIyAgICAgICAgaW1wb3J0IHRva2VuCiMjICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAndHR5cGU6JywgdG9rZW4udG9rX25hbWVbdHR5cGVdLCBcCiMjICAgICAgICAgICAgICAndHN0cmluZzonLCB0c3RyaW5nCiAgICAgICAgc2VsZi5fX3N0YXRlKHR0eXBlLCB0c3RyaW5nLCBzdHVwWzBdKQoKICAgIGRlZiBfX3dhaXRpbmcoc2VsZiwgdHR5cGUsIHRzdHJpbmcsIGxpbmVubyk6CiAgICAgICAgb3B0cyA9IHNlbGYuX19vcHRpb25zCiAgICAgICAgIyBEbyBkb2NzdHJpbmcgZXh0cmFjdGlvbnMsIGlmIGVuYWJsZWQKICAgICAgICBpZiBvcHRzLmRvY3N0cmluZ3MgYW5kIG5vdCBvcHRzLm5vZG9jc3RyaW5ncy5nZXQoc2VsZi5fX2N1cmZpbGUpOgogICAgICAgICAgICAjIG1vZHVsZSBkb2NzdHJpbmc/CiAgICAgICAgICAgIGlmIHNlbGYuX19mcmVzaG1vZHVsZToKICAgICAgICAgICAgICAgIGlmIHR0eXBlID09IHRva2VuaXplLlNUUklORzoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9fYWRkZW50cnkoc2FmZV9ldmFsKHRzdHJpbmcpLCBsaW5lbm8sIGlzZG9jc3RyaW5nPTEpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2ZyZXNobW9kdWxlID0gMAogICAgICAgICAgICAgICAgZWxpZiB0dHlwZSBub3QgaW4gKHRva2VuaXplLkNPTU1FTlQsIHRva2VuaXplLk5MKToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9fZnJlc2htb2R1bGUgPSAwCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgIyBjbGFzcyBkb2NzdHJpbmc/CiAgICAgICAgICAgIGlmIHR0eXBlID09IHRva2VuaXplLk5BTUUgYW5kIHRzdHJpbmcgaW4gKCdjbGFzcycsICdkZWYnKToKICAgICAgICAgICAgICAgIHNlbGYuX19zdGF0ZSA9IHNlbGYuX19zdWl0ZXNlZW4KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIHR0eXBlID09IHRva2VuaXplLk5BTUUgYW5kIHRzdHJpbmcgaW4gb3B0cy5rZXl3b3JkczoKICAgICAgICAgICAgc2VsZi5fX3N0YXRlID0gc2VsZi5fX2tleXdvcmRzZWVuCgogICAgZGVmIF9fc3VpdGVzZWVuKHNlbGYsIHR0eXBlLCB0c3RyaW5nLCBsaW5lbm8pOgogICAgICAgICMgaWdub3JlIGFueXRoaW5nIHVudGlsIHdlIHNlZSB0aGUgY29sb24KICAgICAgICBpZiB0dHlwZSA9PSB0b2tlbml6ZS5PUCBhbmQgdHN0cmluZyA9PSAnOic6CiAgICAgICAgICAgIHNlbGYuX19zdGF0ZSA9IHNlbGYuX19zdWl0ZWRvY3N0cmluZwoKICAgIGRlZiBfX3N1aXRlZG9jc3RyaW5nKHNlbGYsIHR0eXBlLCB0c3RyaW5nLCBsaW5lbm8pOgogICAgICAgICMgaWdub3JlIGFueSBpbnRlcnZlbmluZyBub2lzZQogICAgICAgIGlmIHR0eXBlID09IHRva2VuaXplLlNUUklORzoKICAgICAgICAgICAgc2VsZi5fX2FkZGVudHJ5KHNhZmVfZXZhbCh0c3RyaW5nKSwgbGluZW5vLCBpc2RvY3N0cmluZz0xKQogICAgICAgICAgICBzZWxmLl9fc3RhdGUgPSBzZWxmLl9fd2FpdGluZwogICAgICAgIGVsaWYgdHR5cGUgbm90IGluICh0b2tlbml6ZS5ORVdMSU5FLCB0b2tlbml6ZS5JTkRFTlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuaXplLkNPTU1FTlQpOgogICAgICAgICAgICAjIHRoZXJlIHdhcyBubyBjbGFzcyBkb2NzdHJpbmcKICAgICAgICAgICAgc2VsZi5fX3N0YXRlID0gc2VsZi5fX3dhaXRpbmcKCiAgICBkZWYgX19rZXl3b3Jkc2VlbihzZWxmLCB0dHlwZSwgdHN0cmluZywgbGluZW5vKToKICAgICAgICBpZiB0dHlwZSA9PSB0b2tlbml6ZS5PUCBhbmQgdHN0cmluZyA9PSAnKCc6CiAgICAgICAgICAgIHNlbGYuX19kYXRhID0gW10KICAgICAgICAgICAgc2VsZi5fX2xpbmVubyA9IGxpbmVubwogICAgICAgICAgICBzZWxmLl9fc3RhdGUgPSBzZWxmLl9fb3BlbnNlZW4KICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9fc3RhdGUgPSBzZWxmLl9fd2FpdGluZwoKICAgIGRlZiBfX29wZW5zZWVuKHNlbGYsIHR0eXBlLCB0c3RyaW5nLCBsaW5lbm8pOgogICAgICAgIGlmIHR0eXBlID09IHRva2VuaXplLk9QIGFuZCB0c3RyaW5nID09ICcpJzoKICAgICAgICAgICAgIyBXZSd2ZSBzZWVuIHRoZSBsYXN0IG9mIHRoZSB0cmFuc2xhdGFibGUgc3RyaW5ncy4gIFJlY29yZCB0aGUKICAgICAgICAgICAgIyBsaW5lIG51bWJlciBvZiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgc3RyaW5ncyBhbmQgdXBkYXRlIHRoZSBsaXN0CiAgICAgICAgICAgICMgb2YgbWVzc2FnZXMgc2Vlbi4gIFJlc2V0IHN0YXRlIGZvciB0aGUgbmV4dCBiYXRjaC4gIElmIHRoZXJlCiAgICAgICAgICAgICMgd2VyZSBubyBzdHJpbmdzIGluc2lkZSBfKCksIHRoZW4ganVzdCBpZ25vcmUgdGhpcyBlbnRyeS4KICAgICAgICAgICAgaWYgc2VsZi5fX2RhdGE6CiAgICAgICAgICAgICAgICBzZWxmLl9fYWRkZW50cnkoRU1QVFlTVFJJTkcuam9pbihzZWxmLl9fZGF0YSkpCiAgICAgICAgICAgIHNlbGYuX19zdGF0ZSA9IHNlbGYuX193YWl0aW5nCiAgICAgICAgZWxpZiB0dHlwZSA9PSB0b2tlbml6ZS5TVFJJTkc6CiAgICAgICAgICAgIHNlbGYuX19kYXRhLmFwcGVuZChzYWZlX2V2YWwodHN0cmluZykpCiAgICAgICAgZWxpZiB0dHlwZSBub3QgaW4gW3Rva2VuaXplLkNPTU1FTlQsIHRva2VuLklOREVOVCwgdG9rZW4uREVERU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5ORVdMSU5FLCB0b2tlbml6ZS5OTF06CiAgICAgICAgICAgICMgd2FybiBpZiB3ZSBzZWUgYW55dGhpbmcgZWxzZSB0aGFuIFNUUklORyBvciB3aGl0ZXNwYWNlCiAgICAgICAgICAgIHByaW50KF8oCiAgICAgICAgICAgICAgICAnKioqICUoZmlsZSlzOiUobGluZW5vKXM6IFNlZW4gdW5leHBlY3RlZCB0b2tlbiAiJSh0b2tlbilzIicKICAgICAgICAgICAgICAgICkgJSB7CiAgICAgICAgICAgICAgICAndG9rZW4nOiB0c3RyaW5nLAogICAgICAgICAgICAgICAgJ2ZpbGUnOiBzZWxmLl9fY3VyZmlsZSwKICAgICAgICAgICAgICAgICdsaW5lbm8nOiBzZWxmLl9fbGluZW5vCiAgICAgICAgICAgICAgICB9LCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgICAgIHNlbGYuX19zdGF0ZSA9IHNlbGYuX193YWl0aW5nCgogICAgZGVmIF9fYWRkZW50cnkoc2VsZiwgbXNnLCBsaW5lbm89Tm9uZSwgaXNkb2NzdHJpbmc9MCk6CiAgICAgICAgaWYgbGluZW5vIGlzIE5vbmU6CiAgICAgICAgICAgIGxpbmVubyA9IHNlbGYuX19saW5lbm8KICAgICAgICBpZiBub3QgbXNnIGluIHNlbGYuX19vcHRpb25zLnRvZXhjbHVkZToKICAgICAgICAgICAgZW50cnkgPSAoc2VsZi5fX2N1cmZpbGUsIGxpbmVubykKICAgICAgICAgICAgc2VsZi5fX21lc3NhZ2VzLnNldGRlZmF1bHQobXNnLCB7fSlbZW50cnldID0gaXNkb2NzdHJpbmcKCiAgICBkZWYgc2V0X2ZpbGVuYW1lKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICBzZWxmLl9fY3VyZmlsZSA9IGZpbGVuYW1lCiAgICAgICAgc2VsZi5fX2ZyZXNobW9kdWxlID0gMQoKICAgIGRlZiB3cml0ZShzZWxmLCBmcCk6CiAgICAgICAgb3B0aW9ucyA9IHNlbGYuX19vcHRpb25zCiAgICAgICAgdGltZXN0YW1wID0gdGltZS5zdHJmdGltZSgnJVktJW0tJWQgJUg6JU0rJVonKQogICAgICAgICMgVGhlIHRpbWUgc3RhbXAgaW4gdGhlIGhlYWRlciBkb2Vzbid0IGhhdmUgdGhlIHNhbWUgZm9ybWF0IGFzIHRoYXQKICAgICAgICAjIGdlbmVyYXRlZCBieSB4Z2V0dGV4dC4uLgogICAgICAgIHByaW50KHBvdF9oZWFkZXIgJSB7J3RpbWUnOiB0aW1lc3RhbXAsICd2ZXJzaW9uJzogX192ZXJzaW9uX199LCBmaWxlPWZwKQogICAgICAgICMgU29ydCB0aGUgZW50cmllcy4gIEZpcnN0IHNvcnQgZWFjaCBwYXJ0aWN1bGFyIGVudHJ5J3Mga2V5cywgdGhlbgogICAgICAgICMgc29ydCBhbGwgdGhlIGVudHJpZXMgYnkgdGhlaXIgZmlyc3QgaXRlbS4KICAgICAgICByZXZlcnNlID0ge30KICAgICAgICBmb3IgaywgdiBpbiBzZWxmLl9fbWVzc2FnZXMuaXRlbXMoKToKICAgICAgICAgICAga2V5cyA9IHNvcnRlZCh2LmtleXMoKSkKICAgICAgICAgICAgcmV2ZXJzZS5zZXRkZWZhdWx0KHR1cGxlKGtleXMpLCBbXSkuYXBwZW5kKChrLCB2KSkKICAgICAgICBya2V5cyA9IHNvcnRlZChyZXZlcnNlLmtleXMoKSkKICAgICAgICBmb3IgcmtleSBpbiBya2V5czoKICAgICAgICAgICAgcmVudHJpZXMgPSByZXZlcnNlW3JrZXldCiAgICAgICAgICAgIHJlbnRyaWVzLnNvcnQoKQogICAgICAgICAgICBmb3IgaywgdiBpbiByZW50cmllczoKICAgICAgICAgICAgICAgICMgSWYgdGhlIGVudHJ5IHdhcyBnbGVhbmVkIG91dCBvZiBhIGRvY3N0cmluZywgdGhlbiBhZGQgYQogICAgICAgICAgICAgICAgIyBjb21tZW50IHN0YXRpbmcgc28uICBUaGlzIGlzIHRvIGFpZCB0cmFuc2xhdG9ycyB3aG8gbWF5IHdpc2gKICAgICAgICAgICAgICAgICMgdG8gc2tpcCB0cmFuc2xhdGluZyBzb21lIHVuaW1wb3J0YW50IGRvY3N0cmluZ3MuCiAgICAgICAgICAgICAgICBpc2RvY3N0cmluZyA9IGFueSh2LnZhbHVlcygpKQogICAgICAgICAgICAgICAgIyBrIGlzIHRoZSBtZXNzYWdlIHN0cmluZywgdiBpcyBhIGRpY3Rpb25hcnktc2V0IG9mIChmaWxlbmFtZSwKICAgICAgICAgICAgICAgICMgbGluZW5vKSB0dXBsZXMuICBXZSB3YW50IHRvIHNvcnQgdGhlIGVudHJpZXMgaW4gdiBmaXJzdCBieQogICAgICAgICAgICAgICAgIyBmaWxlIG5hbWUgYW5kIHRoZW4gYnkgbGluZSBudW1iZXIuCiAgICAgICAgICAgICAgICB2ID0gc29ydGVkKHYua2V5cygpKQogICAgICAgICAgICAgICAgaWYgbm90IG9wdGlvbnMud3JpdGVsb2NhdGlvbnM6CiAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgIyBsb2NhdGlvbiBjb21tZW50cyBhcmUgZGlmZmVyZW50IGIvdyBTb2xhcmlzIGFuZCBHTlU6CiAgICAgICAgICAgICAgICBlbGlmIG9wdGlvbnMubG9jYXRpb25zdHlsZSA9PSBvcHRpb25zLlNPTEFSSVM6CiAgICAgICAgICAgICAgICAgICAgZm9yIGZpbGVuYW1lLCBsaW5lbm8gaW4gdjoKICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHsnZmlsZW5hbWUnOiBmaWxlbmFtZSwgJ2xpbmVubyc6IGxpbmVub30KICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoXygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjIEZpbGU6ICUoZmlsZW5hbWUpcywgbGluZTogJShsaW5lbm8pZCcpICUgZCwgZmlsZT1mcCkKICAgICAgICAgICAgICAgIGVsaWYgb3B0aW9ucy5sb2NhdGlvbnN0eWxlID09IG9wdGlvbnMuR05VOgogICAgICAgICAgICAgICAgICAgICMgZml0IGFzIG1hbnkgbG9jYXRpb25zIG9uIG9uZSBsaW5lLCBhcyBsb25nIGFzIHRoZQogICAgICAgICAgICAgICAgICAgICMgcmVzdWx0aW5nIGxpbmUgbGVuZ3RoIGRvZXNuJ3QgZXhjZWVkcyAnb3B0aW9ucy53aWR0aCcKICAgICAgICAgICAgICAgICAgICBsb2NsaW5lID0gJyM6JwogICAgICAgICAgICAgICAgICAgIGZvciBmaWxlbmFtZSwgbGluZW5vIGluIHY6CiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSB7J2ZpbGVuYW1lJzogZmlsZW5hbWUsICdsaW5lbm8nOiBsaW5lbm99CiAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBfKCcgJShmaWxlbmFtZSlzOiUobGluZW5vKWQnKSAlIGQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGxvY2xpbmUpICsgbGVuKHMpIDw9IG9wdGlvbnMud2lkdGg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NsaW5lID0gbG9jbGluZSArIHMKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGxvY2xpbmUsIGZpbGU9ZnApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NsaW5lID0gIiM6IiArIHMKICAgICAgICAgICAgICAgICAgICBpZiBsZW4obG9jbGluZSkgPiAyOgogICAgICAgICAgICAgICAgICAgICAgICBwcmludChsb2NsaW5lLCBmaWxlPWZwKQogICAgICAgICAgICAgICAgaWYgaXNkb2NzdHJpbmc6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoJyMsIGRvY3N0cmluZycsIGZpbGU9ZnApCiAgICAgICAgICAgICAgICBwcmludCgnbXNnaWQnLCBub3JtYWxpemUoayksIGZpbGU9ZnApCiAgICAgICAgICAgICAgICBwcmludCgnbXNnc3RyICIiXG4nLCBmaWxlPWZwKQoKCgwKZGVmIG1haW4oKToKICAgIGdsb2JhbCBkZWZhdWx0X2tleXdvcmRzCiAgICB0cnk6CiAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoCiAgICAgICAgICAgIHN5cy5hcmd2WzE6XSwKICAgICAgICAgICAgJ2FkOkRFaGs6S25vOnA6UzpWdnc6eDpYOicsCiAgICAgICAgICAgIFsnZXh0cmFjdC1hbGwnLCAnZGVmYXVsdC1kb21haW49JywgJ2VzY2FwZScsICdoZWxwJywKICAgICAgICAgICAgICdrZXl3b3JkPScsICduby1kZWZhdWx0LWtleXdvcmRzJywKICAgICAgICAgICAgICdhZGQtbG9jYXRpb24nLCAnbm8tbG9jYXRpb24nLCAnb3V0cHV0PScsICdvdXRwdXQtZGlyPScsCiAgICAgICAgICAgICAnc3R5bGU9JywgJ3ZlcmJvc2UnLCAndmVyc2lvbicsICd3aWR0aD0nLCAnZXhjbHVkZS1maWxlPScsCiAgICAgICAgICAgICAnZG9jc3RyaW5ncycsICduby1kb2NzdHJpbmdzJywKICAgICAgICAgICAgIF0pCiAgICBleGNlcHQgZ2V0b3B0LmVycm9yIGFzIG1zZzoKICAgICAgICB1c2FnZSgxLCBtc2cpCgogICAgIyBmb3IgaG9sZGluZyBvcHRpb24gdmFsdWVzCiAgICBjbGFzcyBPcHRpb25zOgogICAgICAgICMgY29uc3RhbnRzCiAgICAgICAgR05VID0gMQogICAgICAgIFNPTEFSSVMgPSAyCiAgICAgICAgIyBkZWZhdWx0cwogICAgICAgIGV4dHJhY3RhbGwgPSAwICMgRklYTUU6IGN1cnJlbnRseSB0aGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGF0IGFsbC4KICAgICAgICBlc2NhcGUgPSAwCiAgICAgICAga2V5d29yZHMgPSBbXQogICAgICAgIG91dHBhdGggPSAnJwogICAgICAgIG91dGZpbGUgPSAnbWVzc2FnZXMucG90JwogICAgICAgIHdyaXRlbG9jYXRpb25zID0gMQogICAgICAgIGxvY2F0aW9uc3R5bGUgPSBHTlUKICAgICAgICB2ZXJib3NlID0gMAogICAgICAgIHdpZHRoID0gNzgKICAgICAgICBleGNsdWRlZmlsZW5hbWUgPSAnJwogICAgICAgIGRvY3N0cmluZ3MgPSAwCiAgICAgICAgbm9kb2NzdHJpbmdzID0ge30KCiAgICBvcHRpb25zID0gT3B0aW9ucygpCiAgICBsb2NhdGlvbnMgPSB7J2dudScgOiBvcHRpb25zLkdOVSwKICAgICAgICAgICAgICAgICAnc29sYXJpcycgOiBvcHRpb25zLlNPTEFSSVMsCiAgICAgICAgICAgICAgICAgfQoKICAgICMgcGFyc2Ugb3B0aW9ucwogICAgZm9yIG9wdCwgYXJnIGluIG9wdHM6CiAgICAgICAgaWYgb3B0IGluICgnLWgnLCAnLS1oZWxwJyk6CiAgICAgICAgICAgIHVzYWdlKDApCiAgICAgICAgZWxpZiBvcHQgaW4gKCctYScsICctLWV4dHJhY3QtYWxsJyk6CiAgICAgICAgICAgIG9wdGlvbnMuZXh0cmFjdGFsbCA9IDEKICAgICAgICBlbGlmIG9wdCBpbiAoJy1kJywgJy0tZGVmYXVsdC1kb21haW4nKToKICAgICAgICAgICAgb3B0aW9ucy5vdXRmaWxlID0gYXJnICsgJy5wb3QnCiAgICAgICAgZWxpZiBvcHQgaW4gKCctRScsICctLWVzY2FwZScpOgogICAgICAgICAgICBvcHRpb25zLmVzY2FwZSA9IDEKICAgICAgICBlbGlmIG9wdCBpbiAoJy1EJywgJy0tZG9jc3RyaW5ncycpOgogICAgICAgICAgICBvcHRpb25zLmRvY3N0cmluZ3MgPSAxCiAgICAgICAgZWxpZiBvcHQgaW4gKCctaycsICctLWtleXdvcmQnKToKICAgICAgICAgICAgb3B0aW9ucy5rZXl3b3Jkcy5hcHBlbmQoYXJnKQogICAgICAgIGVsaWYgb3B0IGluICgnLUsnLCAnLS1uby1kZWZhdWx0LWtleXdvcmRzJyk6CiAgICAgICAgICAgIGRlZmF1bHRfa2V5d29yZHMgPSBbXQogICAgICAgIGVsaWYgb3B0IGluICgnLW4nLCAnLS1hZGQtbG9jYXRpb24nKToKICAgICAgICAgICAgb3B0aW9ucy53cml0ZWxvY2F0aW9ucyA9IDEKICAgICAgICBlbGlmIG9wdCBpbiAoJy0tbm8tbG9jYXRpb24nLCk6CiAgICAgICAgICAgIG9wdGlvbnMud3JpdGVsb2NhdGlvbnMgPSAwCiAgICAgICAgZWxpZiBvcHQgaW4gKCctUycsICctLXN0eWxlJyk6CiAgICAgICAgICAgIG9wdGlvbnMubG9jYXRpb25zdHlsZSA9IGxvY2F0aW9ucy5nZXQoYXJnLmxvd2VyKCkpCiAgICAgICAgICAgIGlmIG9wdGlvbnMubG9jYXRpb25zdHlsZSBpcyBOb25lOgogICAgICAgICAgICAgICAgdXNhZ2UoMSwgXygnSW52YWxpZCB2YWx1ZSBmb3IgLS1zdHlsZTogJXMnKSAlIGFyZykKICAgICAgICBlbGlmIG9wdCBpbiAoJy1vJywgJy0tb3V0cHV0Jyk6CiAgICAgICAgICAgIG9wdGlvbnMub3V0ZmlsZSA9IGFyZwogICAgICAgIGVsaWYgb3B0IGluICgnLXAnLCAnLS1vdXRwdXQtZGlyJyk6CiAgICAgICAgICAgIG9wdGlvbnMub3V0cGF0aCA9IGFyZwogICAgICAgIGVsaWYgb3B0IGluICgnLXYnLCAnLS12ZXJib3NlJyk6CiAgICAgICAgICAgIG9wdGlvbnMudmVyYm9zZSA9IDEKICAgICAgICBlbGlmIG9wdCBpbiAoJy1WJywgJy0tdmVyc2lvbicpOgogICAgICAgICAgICBwcmludChfKCdweWdldHRleHQucHkgKHhnZXR0ZXh0IGZvciBQeXRob24pICVzJykgJSBfX3ZlcnNpb25fXykKICAgICAgICAgICAgc3lzLmV4aXQoMCkKICAgICAgICBlbGlmIG9wdCBpbiAoJy13JywgJy0td2lkdGgnKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3B0aW9ucy53aWR0aCA9IGludChhcmcpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgdXNhZ2UoMSwgXygnLS13aWR0aCBhcmd1bWVudCBtdXN0IGJlIGFuIGludGVnZXI6ICVzJykgJSBhcmcpCiAgICAgICAgZWxpZiBvcHQgaW4gKCcteCcsICctLWV4Y2x1ZGUtZmlsZScpOgogICAgICAgICAgICBvcHRpb25zLmV4Y2x1ZGVmaWxlbmFtZSA9IGFyZwogICAgICAgIGVsaWYgb3B0IGluICgnLVgnLCAnLS1uby1kb2NzdHJpbmdzJyk6CiAgICAgICAgICAgIGZwID0gb3BlbihhcmcpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm5vZG9jc3RyaW5nc1tsaW5lWzotMV1dID0gMQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgZnAuY2xvc2UoKQoKICAgICMgY2FsY3VsYXRlIGVzY2FwZXMKICAgIG1ha2VfZXNjYXBlcyhvcHRpb25zLmVzY2FwZSkKCiAgICAjIGNhbGN1bGF0ZSBhbGwga2V5d29yZHMKICAgIG9wdGlvbnMua2V5d29yZHMuZXh0ZW5kKGRlZmF1bHRfa2V5d29yZHMpCgogICAgIyBpbml0aWFsaXplIGxpc3Qgb2Ygc3RyaW5ncyB0byBleGNsdWRlCiAgICBpZiBvcHRpb25zLmV4Y2x1ZGVmaWxlbmFtZToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZwID0gb3BlbihvcHRpb25zLmV4Y2x1ZGVmaWxlbmFtZSkKICAgICAgICAgICAgb3B0aW9ucy50b2V4Y2x1ZGUgPSBmcC5yZWFkbGluZXMoKQogICAgICAgICAgICBmcC5jbG9zZSgpCiAgICAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgICAgIHByaW50KF8oCiAgICAgICAgICAgICAgICAiQ2FuJ3QgcmVhZCAtLWV4Y2x1ZGUtZmlsZTogJXMiKSAlIG9wdGlvbnMuZXhjbHVkZWZpbGVuYW1lLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgICAgIHN5cy5leGl0KDEpCiAgICBlbHNlOgogICAgICAgIG9wdGlvbnMudG9leGNsdWRlID0gW10KCiAgICAjIHJlc29sdmUgYXJncyB0byBtb2R1bGUgbGlzdHMKICAgIGV4cGFuZGVkID0gW10KICAgIGZvciBhcmcgaW4gYXJnczoKICAgICAgICBpZiBhcmcgPT0gJy0nOgogICAgICAgICAgICBleHBhbmRlZC5hcHBlbmQoYXJnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGV4cGFuZGVkLmV4dGVuZChnZXRGaWxlc0Zvck5hbWUoYXJnKSkKICAgIGFyZ3MgPSBleHBhbmRlZAoKICAgICMgc2x1cnAgdGhyb3VnaCBhbGwgdGhlIGZpbGVzCiAgICBlYXRlciA9IFRva2VuRWF0ZXIob3B0aW9ucykKICAgIGZvciBmaWxlbmFtZSBpbiBhcmdzOgogICAgICAgIGlmIGZpbGVuYW1lID09ICctJzoKICAgICAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlOgogICAgICAgICAgICAgICAgcHJpbnQoXygnUmVhZGluZyBzdGFuZGFyZCBpbnB1dCcpKQogICAgICAgICAgICBmcCA9IHN5cy5zdGRpbgogICAgICAgICAgICBjbG9zZXAgPSAwCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlOgogICAgICAgICAgICAgICAgcHJpbnQoXygnV29ya2luZyBvbiAlcycpICUgZmlsZW5hbWUpCiAgICAgICAgICAgIGZwID0gb3BlbihmaWxlbmFtZSkKICAgICAgICAgICAgY2xvc2VwID0gMQogICAgICAgIHRyeToKICAgICAgICAgICAgZWF0ZXIuc2V0X2ZpbGVuYW1lKGZpbGVuYW1lKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0b2tlbnMgPSB0b2tlbml6ZS5nZW5lcmF0ZV90b2tlbnMoZnAucmVhZGxpbmUpCiAgICAgICAgICAgICAgICBmb3IgX3Rva2VuIGluIHRva2VuczoKICAgICAgICAgICAgICAgICAgICBlYXRlcigqX3Rva2VuKQogICAgICAgICAgICBleGNlcHQgdG9rZW5pemUuVG9rZW5FcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcHJpbnQoJyVzOiAlcywgbGluZSAlZCwgY29sdW1uICVkJyAlICgKICAgICAgICAgICAgICAgICAgICBlLmFyZ3NbMF0sIGZpbGVuYW1lLCBlLmFyZ3NbMV1bMF0sIGUuYXJnc1sxXVsxXSksCiAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGlmIGNsb3NlcDoKICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKCiAgICAjIHdyaXRlIHRoZSBvdXRwdXQKICAgIGlmIG9wdGlvbnMub3V0ZmlsZSA9PSAnLSc6CiAgICAgICAgZnAgPSBzeXMuc3Rkb3V0CiAgICAgICAgY2xvc2VwID0gMAogICAgZWxzZToKICAgICAgICBpZiBvcHRpb25zLm91dHBhdGg6CiAgICAgICAgICAgIG9wdGlvbnMub3V0ZmlsZSA9IG9zLnBhdGguam9pbihvcHRpb25zLm91dHBhdGgsIG9wdGlvbnMub3V0ZmlsZSkKICAgICAgICBmcCA9IG9wZW4ob3B0aW9ucy5vdXRmaWxlLCAndycpCiAgICAgICAgY2xvc2VwID0gMQogICAgdHJ5OgogICAgICAgIGVhdGVyLndyaXRlKGZwKQogICAgZmluYWxseToKICAgICAgICBpZiBjbG9zZXA6CiAgICAgICAgICAgIGZwLmNsb3NlKCkKCgwKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIG1haW4oKQogICAgIyBzb21lIG1vcmUgdGVzdCBzdHJpbmdzCiAgICAjIHRoaXMgb25lIGNyZWF0ZXMgYSB3YXJuaW5nCiAgICBfKCcqKiogU2VlbiB1bmV4cGVjdGVkIHRva2VuICIlKHRva2VuKXMiJykgJSB7J3Rva2VuJzogJ3Rlc3QnfQogICAgXygnbW9yZScgJ3RoYW4nICdvbmUnICdzdHJpbmcnKQo=