ZG5sICRJZCQKZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCgpBQ19QUkVSRVEoMi41NykKCmRubCBXZSBkb24ndCBrbm93IHRoZSB2ZXJzaW9uIG51bWJlciAic3RhdGljbHkiIHNvIHdlIHVzZSBhIGRhc2ggaGVyZQpBQ19JTklUKGN1cmwsIFstXSwgW2Egc3VpdGFibGUgY3VybCBtYWlsaW5nIGxpc3QgPT4gaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL10pCgpkbmwgY29uZmlndXJlIHNjcmlwdCBjb3B5cmlnaHQKQUNfQ09QWVJJR0hUKFtDb3B5cmlnaHQgKGMpIDE5OTggLSAyMDA1IERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPgpUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQgYW5kIG1vZGlmaWVkIHVuZGVyIHRoZSAKdGVybXMgb2YgdGhlIGN1cmwgbGljZW5zZTsgc2VlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlsc10pCgpBQ19DT05GSUdfU1JDRElSKFtsaWIvdXJsZGF0YS5oXSkKQU1fQ09ORklHX0hFQURFUihsaWIvY29uZmlnLmggc3JjL2NvbmZpZy5oKQpBTV9NQUlOVEFJTkVSX01PREUKCmRubCBTRUQgaXMgbmVlZGVkIGJ5IHNvbWUgb2YgdGhlIHRvb2xzCkFDX1BBVEhfUFJPRyggU0VELCBzZWQsIHNlZC13YXMtbm90LWZvdW5kLWJ5LWNvbmZpZ3VyZSwKICAgICAgICAgICAgICAkUEFUSDovdXNyL2JpbjovdXNyL2xvY2FsL2JpbikKQUNfU1VCU1QoU0VEKQoKaWYgdGVzdCAieCRTRUQiID0gInhzZWQtd2FzLW5vdC1mb3VuZC1ieS1jb25maWd1cmUiOyB0aGVuCiAgQUNfTVNHX1dBUk4oW3NlZCB3YXMgbm90IGZvdW5kLCB0aGlzIG1heSBydWluIHlvdXIgY2hhbmNlcyB0byBidWlsZCBmaW5lXSkKZmkKCmRubCBBUiBpcyB1c2VkIGJ5IGxpYnRvb2wsIGFuZCB0cnkgdGhlIG9kZCBTb2xhcmlzIHBhdGggdG9vCmRubCB3ZSB1c2UgQUNfQ0hFQ0tfVE9PTCBzaW5jZSB0aGlzIHNob3VsZCBtYWtlIGEgbGlicmFyeSBmb3IgdGhlIHRhcmdldApkbmwgcGxhdGZvcm0KQUNfQ0hFQ0tfVE9PTChBUiwgYXIsCiAgICAgICAgICAgICAgYXItd2FzLW5vdC1mb3VuZC1ieS1jb25maWd1cmUsCiAgICAgICAgICAgICAgJFBBVEg6L3Vzci9iaW46L3Vzci9sb2NhbC9iaW46L3Vzci9jY3MvYmluKQpBQ19TVUJTVChBUikKaWYgdGVzdCAieCRBUiIgPSAieGFyLXdhcy1ub3QtZm91bmQtYnktY29uZmlndXJlIjsgdGhlbgogIEFDX01TR19XQVJOKFthciB3YXMgbm90IGZvdW5kLCB0aGlzIG1heSBydWluIHlvdXIgY2hhbmNlcyB0byBidWlsZCBmaW5lXSkKZmkKCmRubCBmaWd1cmUgb3V0IHRoZSBsaWJjdXJsIHZlcnNpb24KVkVSU0lPTj1gJFNFRCAtbmUgJ3MvXiNkZWZpbmUgTElCQ1VSTF9WRVJTSU9OICJcKC4qXCkiL1wxL3AnICR7c3JjZGlyfS9pbmNsdWRlL2N1cmwvY3VybHZlci5oYApBTV9JTklUX0FVVE9NQUtFKGN1cmwsJFZFUlNJT04pCkFDX01TR19DSEVDS0lORyhbY3VybCB2ZXJzaW9uXSkKQUNfTVNHX1JFU1VMVCgkVkVSU0lPTikKCmRubApkbmwgd2UgZXh0cmFjdCB0aGUgbnVtZXJpY2FsIHZlcnNpb24gZm9yIGN1cmwtY29uZmlnIG9ubHkKVkVSU0lPTk5VTT1gJFNFRCAtbmUgJ3MvXiNkZWZpbmUgTElCQ1VSTF9WRVJTSU9OX05VTSAweFwoLipcKS9cMS9wJyAke3NyY2Rpcn0vaW5jbHVkZS9jdXJsL2N1cmx2ZXIuaGAKQUNfU1VCU1QoVkVSU0lPTk5VTSkKCmRubCBTb2xhcmlzIHBrZ2FkZCBzdXBwb3J0IGRlZmluaXRpb25zClBLR0FERF9QS0c9IkhBWFhjdXJsIgpQS0dBRERfTkFNRT0iY1VSTCAtIGEgY2xpZW50IHRoYXQgZ3Jva3MgVVJMcyIKUEtHQUREX1ZFTkRPUj0iY3VybC5oYXh4LnNlIgpBQ19TVUJTVChQS0dBRERfUEtHKQpBQ19TVUJTVChQS0dBRERfTkFNRSkKQUNfU1VCU1QoUEtHQUREX1ZFTkRPUikKCmRubApkbmwgaW5pdGlhbGl6ZSBhbGwgdGhlIGluZm8gdmFyaWFibGVzCiAgICBjdXJsX3NzbF9tc2c9Im5vICAgICAgKC0td2l0aC1zc2wgLyAtLXdpdGgtZ251dGxzKSIKICAgY3VybF96bGliX21zZz0ibm8gICAgICAoLS13aXRoLXpsaWIpIgogICBjdXJsX2tyYjRfbXNnPSJubyAgICAgICgtLXdpdGgta3JiNCopIgogICAgY3VybF9nc3NfbXNnPSJubyAgICAgICgtLXdpdGgtZ3NzYXBpKSIKIGN1cmxfc3BuZWdvX21zZz0ibm8gICAgICAoLS13aXRoLXNwbmVnbykiCiAgIGN1cmxfYXJlc19tc2c9Im5vICAgICAgKC0tZW5hYmxlLWFyZXMpIgogICBjdXJsX2lwdjZfbXNnPSJubyAgICAgICgtLWVuYWJsZS1pcHY2KSIKICAgIGN1cmxfaWRuX21zZz0ibm8gICAgICAoLS13aXRoLWxpYmlkbikiCiBjdXJsX21hbnVhbF9tc2c9Im5vICAgICAgKC0tZW5hYmxlLW1hbnVhbCkiCmN1cmxfdmVyYm9zZV9tc2c9ImVuYWJsZWQgKC0tZGlzYWJsZS12ZXJib3NlKSIKICAgY3VybF9zc3BpX21zZz0ibm8gICAgICAoLS1lbmFibGUtc3NwaSkiCgpkbmwKZG5sIERldGVjdCB0aGUgY2Fub25pY2FsIGhvc3QgYW5kIHRhcmdldCBidWlsZCBlbnZpcm9ubWVudApkbmwKCkFDX0NBTk9OSUNBTF9IT1NUCmRubCBHZXQgc3lzdGVtIGNhbm9uaWNhbCBuYW1lCkFDX0RFRklORV9VTlFVT1RFRChPUywgIiR7aG9zdH0iLCBbY3B1LW1hY2hpbmUtT1NdKQoKZG5sIENoZWNrIGZvciBBSVggd2VpcmRvcwpBQ19BSVgKCmRubCBDaGVja3MgZm9yIHByb2dyYW1zLgpBQ19QUk9HX0NDCgpkbmwgY2hlY2sgZm9yIGhvdyB0byBkbyBsYXJnZSBmaWxlcwpBQ19TWVNfTEFSR0VGSUxFCgpkbmwgY2hlY2sgZm9yIGN5Z3dpbiBzdHVmZgpBQ19MSUJUT09MX1dJTjMyX0RMTAoKZG5sIGxpYnRvb2wgc2V0dXAKQUNfUFJPR19MSUJUT09MCgpBQ19NU0dfQ0hFQ0tJTkcoW2lmIHdlIG5lZWQgLW5vLXVuZGVmaW5lZF0pCmNhc2UgJGhvc3QgaW4KICAqLSotY3lnd2luIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKikKICAgIG5lZWRfbm9fdW5kZWZpbmVkPXllcwogICAgOzsKICAqKQogICAgbmVlZF9ub191bmRlZmluZWQ9bm8KICAgIDs7CmVzYWMKQUNfTVNHX1JFU1VMVCgkbmVlZF9ub191bmRlZmluZWQpCkFNX0NPTkRJVElPTkFMKE5PX1VOREVGSU5FRCwgdGVzdCB4JG5lZWRfbm9fdW5kZWZpbmVkID0geHllcykKCkFDX01TR19DSEVDS0lORyhbaWYgd2UgbmVlZCAtbWltcHVyZS10ZXh0XSkKbWltcHVyZT1ubwpjYXNlICRob3N0IGluCiAgKi0qLXNvbGFyaXMyKikKICAgIGlmIHRlc3QgIiRHQ0MiID0gInllcyI7IHRoZW4KICAgICAgbWltcHVyZT0ieWVzIgogICAgZmkKICAgIDs7CiAgKikKICAgIDs7CmVzYWMKQUNfTVNHX1JFU1VMVCgkbWltcHVyZSkKQU1fQ09ORElUSU9OQUwoTUlNUFVSRSwgdGVzdCB4JG1pbXB1cmUgPSB4eWVzKQoKQUNfTVNHX0NIRUNLSU5HKFtpZiB3ZSBuZWVkIEJVSUxESU5HX0xJQkNVUkxdKQpjYXNlICRob3N0IGluCiAgKi0qLW1pbmd3KikKICAgIEFDX0RFRklORShCVUlMRElOR19MSUJDVVJMLCAxLCBbd2hlbiBidWlsZGluZyBsaWJjdXJsIGl0c2VsZl0pCiAgICBBQ19NU0dfUkVTVUxUKHllcykKIKAgoEFDX01TR19DSEVDS0lORyhbaWYgd2UgbmVlZCBDVVJMX1NUQVRJQ0xJQl0pCiAgICBpZiB0ZXN0ICJYJGVuYWJsZV9zaGFyZWQiID0gIlhubyIKICAgIHRoZW4KICAgICAgQUNfREVGSU5FKENVUkxfU1RBVElDTElCLCAxLCBbd2hlbiBub3QgYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeV0pCiAgICAgIEFDX01TR19SRVNVTFQoeWVzKQogoCCgZWxzZQogoCCgIKBBQ19NU0dfUkVTVUxUKG5vKQogICAgZmkKICAgIDs7CiAgKikKICAgIEFDX01TR19SRVNVTFQobm8pCiAgICA7Owplc2FjCgpkbmwgVGhlIGluc3RhbGwgc3R1ZmYgaGFzIGFscmVhZHkgYmVlbiB0YWtlbiBjYXJlIG9mIGJ5IHRoZSBhdXRvbWFrZSBzdHVmZgpkbmwgQUNfUFJPR19JTlNUQUxMCkFDX1BST0dfTUFLRV9TRVQKCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZG5sIHN3aXRjaCBvZmYgcGFydGljdWxhciBwcm90b2NvbHMKZG5sCkFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBzdXBwb3J0IGh0dHBdKQpBQ19BUkdfRU5BQkxFKGh0dHAsCkFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1odHRwXSxbRW5hYmxlIEhUVFAgc3VwcG9ydF0pCkFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtaHR0cF0sW0Rpc2FibGUgSFRUUCBzdXBwb3J0XSksClsgY2FzZSAiJGVuYWJsZXZhbCIgaW4KICBubykKICAgICAgIEFDX01TR19SRVNVTFQobm8pCiAgICAgICBBQ19ERUZJTkUoQ1VSTF9ESVNBQkxFX0hUVFAsIDEsIFt0byBkaXNhYmxlIEhUVFBdKQogICAgICAgQUNfTVNHX1dBUk4oW2Rpc2FibGUgSFRUUCBkaXNhYmxlcyBGVFAgb3ZlciBwcm94eSBhbmQgR09QSEVSIHRvb10pCiAgICAgICBBQ19ERUZJTkUoQ1VSTF9ESVNBQkxFX0dPUEhFUiwgMSwgW3RvIGRpc2FibGUgR09QSEVSXSkKICAgICAgIEFDX1NVQlNUKENVUkxfRElTQUJMRV9IVFRQLCBbMV0pCiAgICAgICBBQ19TVUJTVChDVVJMX0RJU0FCTEVfR09QSEVSLCBbMV0pCiAgICAgICA7OwogICopICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICA7OwogIGVzYWMgXSwKICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQopCkFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBzdXBwb3J0IGZ0cF0pCkFDX0FSR19FTkFCTEUoZnRwLApBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZnRwXSxbRW5hYmxlIEZUUCBzdXBwb3J0XSkKQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1mdHBdLFtEaXNhYmxlIEZUUCBzdXBwb3J0XSksClsgY2FzZSAiJGVuYWJsZXZhbCIgaW4KICBubykKICAgICAgIEFDX01TR19SRVNVTFQobm8pCiAgICAgICBBQ19ERUZJTkUoQ1VSTF9ESVNBQkxFX0ZUUCwgMSwgW3RvIGRpc2FibGUgRlRQXSkKICAgICAgIEFDX1NVQlNUKENVUkxfRElTQUJMRV9GVFAsIFsxXSkKICAgICAgIDs7CiAgKikgICBBQ19NU0dfUkVTVUxUKHllcykKICAgICAgIDs7CiAgZXNhYyBdLAogICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCikKQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIHN1cHBvcnQgZ29waGVyXSkKQUNfQVJHX0VOQUJMRShnb3BoZXIsCkFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1nb3BoZXJdLFtFbmFibGUgR09QSEVSIHN1cHBvcnRdKQpBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWdvcGhlcl0sW0Rpc2FibGUgR09QSEVSIHN1cHBvcnRdKSwKWyBjYXNlICIkZW5hYmxldmFsIiBpbgogIG5vKQogICAgICAgQUNfTVNHX1JFU1VMVChubykKICAgICAgIEFDX0RFRklORShDVVJMX0RJU0FCTEVfR09QSEVSLCAxLCBbdG8gZGlzYWJsZSBHT1BIRVJdKQogICAgICAgQUNfU1VCU1QoQ1VSTF9ESVNBQkxFX0dPUEhFUiwgWzFdKQogICAgICAgOzsKICAqKSAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgICAgOzsKICBlc2FjIF0sCiAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKQpBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gc3VwcG9ydCBmaWxlXSkKQUNfQVJHX0VOQUJMRShmaWxlLApBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtZmlsZV0sW0VuYWJsZSBGSUxFIHN1cHBvcnRdKQpBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWZpbGVdLFtEaXNhYmxlIEZJTEUgc3VwcG9ydF0pLApbIGNhc2UgIiRlbmFibGV2YWwiIGluCiAgbm8pCiAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQogICAgICAgQUNfREVGSU5FKENVUkxfRElTQUJMRV9GSUxFLCAxLCBbdG8gZGlzYWJsZSBGSUxFXSkKICAgICAgIEFDX1NVQlNUKENVUkxfRElTQUJMRV9GSUxFLCBbMV0pCiAgICAgICA7OwogICopICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICA7OwogIGVzYWMgXSwKICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQopCkFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBzdXBwb3J0IGxkYXBdKQpBQ19BUkdfRU5BQkxFKGxkYXAsCkFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1sZGFwXSxbRW5hYmxlIExEQVAgc3VwcG9ydF0pCkFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbGRhcF0sW0Rpc2FibGUgTERBUCBzdXBwb3J0XSksClsgY2FzZSAiJGVuYWJsZXZhbCIgaW4KICBubykKICAgICAgIEFDX01TR19SRVNVTFQobm8pCiAgICAgICBBQ19ERUZJTkUoQ1VSTF9ESVNBQkxFX0xEQVAsIDEsIFt0byBkaXNhYmxlIExEQVBdKQogICAgICAgQUNfU1VCU1QoQ1VSTF9ESVNBQkxFX0xEQVAsIFsxXSkKICAgICAgIDs7CiAgKikgICBBQ19NU0dfUkVTVUxUKHllcykKICAgICAgIDs7CiAgZXNhYyBdLAogICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCikKQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIHN1cHBvcnQgZGljdF0pCkFDX0FSR19FTkFCTEUoZGljdCwKQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWRpY3RdLFtFbmFibGUgRElDVCBzdXBwb3J0XSkKQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1kaWN0XSxbRGlzYWJsZSBESUNUIHN1cHBvcnRdKSwKWyBjYXNlICIkZW5hYmxldmFsIiBpbgogIG5vKQogICAgICAgQUNfTVNHX1JFU1VMVChubykKICAgICAgIEFDX0RFRklORShDVVJMX0RJU0FCTEVfRElDVCwgMSwgW3RvIGRpc2FibGUgRElDVF0pCiAgICAgICBBQ19TVUJTVChDVVJMX0RJU0FCTEVfRElDVCwgWzFdKQogICAgICAgOzsKICAqKSAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgICAgOzsKICBlc2FjIF0sCiAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKQpBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gc3VwcG9ydCB0ZWxuZXRdKQpBQ19BUkdfRU5BQkxFKHRlbG5ldCwKQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXRlbG5ldF0sW0VuYWJsZSBURUxORVQgc3VwcG9ydF0pCkFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtdGVsbmV0XSxbRGlzYWJsZSBURUxORVQgc3VwcG9ydF0pLApbIGNhc2UgIiRlbmFibGV2YWwiIGluCiAgbm8pCiAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQogICAgICAgQUNfREVGSU5FKENVUkxfRElTQUJMRV9URUxORVQsIDEsIFt0byBkaXNhYmxlIFRFTE5FVF0pCiAgICAgICBBQ19TVUJTVChDVVJMX0RJU0FCTEVfVEVMTkVULCBbMV0pCiAgICAgICA7OwogICopICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICA7OwogIGVzYWMgXSwKICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQopCgpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkbmwgQ2hlY2sgZm9yIGJ1aWx0LWluIG1hbnVhbApkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIHByb3ZpZGUgYnVpbHQtaW4gbWFudWFsXSkKQUNfQVJHX0VOQUJMRShtYW51YWwsCkFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1tYW51YWxdLFtFbmFibGUgYnVpbHQtaW4gbWFudWFsXSkKQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1tYW51YWxdLFtEaXNhYmxlIGJ1aWx0LWluIG1hbnVhbF0pLApbIGNhc2UgIiRlbmFibGV2YWwiIGluCiAgbm8pCiAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQogICAgICAgOzsKICAqKSAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgICAgVVNFX01BTlVBTD0iMSIKICAgICAgIDs7CiAgZXNhYyBdLAogICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICBVU0VfTUFOVUFMPSIxIgopCmRubCBUaGUgYWN0dWFsIHVzZSBvZiB0aGUgVVNFX01BTlVBTCB2YXJpYWJsZSBpcyBkb25lIG11Y2ggbGF0ZXIgaW4gdGhpcwpkbmwgc2NyaXB0IHRvIGFsbG93IG90aGVyIGFjdGlvbnMgdG8gZGlzYWJsZSBpdCBhcyB3ZWxsLgoKCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRubCBDaGVja3MgZm9yIGxpYnJhcmllcy4KZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCmRubCBnZXRob3N0YnluYW1lIHdpdGhvdXQgbGliIG9yIGluIHRoZSBuc2wgbGliPwpBQ19DSEVDS19GVU5DKGdldGhvc3RieW5hbWUsCiAgICAgICAgICAgICAgW0hBVkVfR0VUSE9TVEJZTkFNRT0iMSIKICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgIFsgQUNfQ0hFQ0tfTElCKG5zbCwgZ2V0aG9zdGJ5bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSEFWRV9HRVRIT1NUQllOQU1FPSIxIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQlM9IiRMSUJTIC1sbnNsIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgICAgXSkKCmlmIHRlc3QgIiRIQVZFX0dFVEhPU1RCWU5BTUUiICE9ICIxIgp0aGVuCiAgZG5sIGdldGhvc3RieW5hbWUgaW4gdGhlIHNvY2tldCBsaWI/CiAgQUNfQ0hFQ0tfTElCKHNvY2tldCwgZ2V0aG9zdGJ5bmFtZSwKICAgICAgICAgICAgICAgW0hBVkVfR0VUSE9TVEJZTkFNRT0iMSIKICAgICAgICAgICAgICAgTElCUz0iJExJQlMgLWxzb2NrZXQiCiAgICAgICAgICAgICAgIF0pCmZpCgpkbmwgQXQgbGVhc3Qgb25lIHN5c3RlbSBoYXMgYmVlbiBpZGVudGlmaWVkIHRvIHJlcXVpcmUgQk9USCBuc2wgYW5kIHNvY2tldApkbmwgbGlicyBhdCB0aGUgc2FtZSB0aW1lIHRvIGxpbmsgcHJvcGVybHkuCmlmIHRlc3QgIiRIQVZFX0dFVEhPU1RCWU5BTUUiICE9ICIxIgp0aGVuCiAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgZ2V0aG9zdGJ5bmFtZSB3aXRoIGJvdGggbnNsIGFuZCBzb2NrZXQgbGlic10pCiAgbXlfYWNfc2F2ZV9MSUJTPSRMSUJTCiAgTElCUz0iLWxuc2wgLWxzb2NrZXQgJExJQlMiCiAgQUNfVFJZX0xJTksoICwKICAgICAgICAgICAgIFtnZXRob3N0YnluYW1lKCk7XSwKICAgICAgICAgICAgIFsgZG5sIGZvdW5kIGl0IQogICAgICAgICAgICAgSEFWRV9HRVRIT1NUQllOQU1FPSIxIgogICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSldLAogICAgICAgICAgICAgWyBkbmwgZmFpbGVkIQogICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQogICAgICAgICAgICAgZG5sIHJlc3RvcmUgTElCUwogICAgICAgICAgICAgTElCUz0kbXlfYWNfc2F2ZV9MSUJTXQogICAgICAgICAgICAgKQpmaQoKaWYgdGVzdCAiJEhBVkVfR0VUSE9TVEJZTkFNRSIgIT0gIjEiCnRoZW4KICBkbmwgVGhpcyBpcyBmb3IgTXN5cy9NaW5ndwogIEFDX01TR19DSEVDS0lORyhbZm9yIGdldGhvc3RieW5hbWUgaW4gd3MyXzMyXSkKICBteV9hY19zYXZlX0xJQlM9JExJQlMKICBMSUJTPSItbHdzMl8zMiAkTElCUyIKICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHdpbnNvY2syLmg+XSwKICAgICAgICAgICAgICAgW2dldGhvc3RieW5hbWUoInd3dy5kdW1teXNpdGUuY29tIik7XSwKICAgICAgICAgICAgICAgWyBkbmwgd29ya2VkIQogICAgICAgICAgICAgICB3czI9InllcyIKICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKICAgICAgICAgICAgICAgSEFWRV9HRVRIT1NUQllOQU1FPSIxIl0sCiAgICAgICAgICAgICAgIFsgZG5sIGZhaWxlZCwgcmVzdG9yZSBMSUJTCiAgICAgICAgICAgICAgIExJQlM9JG15X2FjX3NhdmVfTElCUwogICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKV0KICAgICAgICAgICAgICkKZmkKCmlmIHRlc3QgIiRIQVZFX0dFVEhPU1RCWU5BTUUiICE9ICIxIgp0aGVuCiAgZG5sIGdldGhvc3RieW5hbWUgaW4gdGhlIG5ldCBsaWIgLSBmb3IgQmVPUwogIEFDX0NIRUNLX0xJQihuZXQsIGdldGhvc3RieW5hbWUsCiAgICAgICAgICAgICAgIFtIQVZFX0dFVEhPU1RCWU5BTUU9IjEiCiAgICAgICAgICAgICAgIExJQlM9IiRMSUJTIC1sbmV0IgogICAgICAgICAgICAgICBdKQpmaQoKCmlmIHRlc3QgIiRIQVZFX0dFVEhPU1RCWU5BTUUiID0gIjEiOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfR0VUSE9TVEJZTkFNRSwgMSwgW0lmIHlvdSBoYXZlIGdldGhvc3RieW5hbWVdKQplbHNlCiAgQUNfTVNHX0VSUk9SKFtjb3VsZG4ndCBmaW5kIGxpYnJhcmllcyBmb3IgZ2V0aG9zdGJ5bmFtZSgpXSkKZmkKCmRubCByZXNvbHZlIGxpYj8KQUNfQ0hFQ0tfRlVOQyhzdHJjYXNlY21wLCAsIFsgQUNfQ0hFQ0tfTElCKHJlc29sdmUsIHN0cmNhc2VjbXApIF0pCgppZiB0ZXN0ICIkYWNfY3ZfbGliX3Jlc29sdmVfc3RyY2FzZWNtcCIgPSAiJGFjX2N2X2Z1bmNfc3RyY2FzZWNtcCI7IHRoZW4KICBBQ19DSEVDS19MSUIocmVzb2x2ZSwgc3RyY2FzZWNtcCwKICAgICAgICAgICAgICBbTElCUz0iLWxyZXNvbHZlICRMSUJTIl0sCiAgICAgICAgICAgICAgICwKICAgICAgICAgICAgICAgLWxuc2wpCmZpCgpkbmwgc29ja2V0IGxpYj8KQUNfQ0hFQ0tfRlVOQyhjb25uZWN0LCAsIFsgQUNfQ0hFQ0tfTElCKHNvY2tldCwgY29ubmVjdCkgXSkKCmRubCBkbCBsaWI/CkFDX0NIRUNLX0ZVTkMoZGxjbG9zZSwgLCBbIEFDX0NIRUNLX0xJQihkbCwgZGxvcGVuKSBdKQoKQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIHVzZSBsaWJnY2NdKQpBQ19BUkdfRU5BQkxFKGxpYmdjYywKQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWxpYmdjY10sW3VzZSBsaWJnY2Mgd2hlbiBsaW5raW5nXSksClsgY2FzZSAiJGVuYWJsZXZhbCIgaW4KICB5ZXMpCiAgICAgICAgTElCUz0iJExJQlMgLWxnY2MiCiAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKICAgICAgIDs7CiAgKikgICBBQ19NU0dfUkVTVUxUKG5vKQogICAgICAgOzsKICBlc2FjIF0sCiAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQopCgpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkbmwgQ2hlY2sgZm9yIHRoZSBuYW1lIG9mIGR5bmFtaWMgT3BlbkxEQVAgbGlicmFyaWVzCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpMREFQTElCTkFNRT0iIgpBQ19BUkdfV0lUSChsZGFwLWxpYiwKQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1sZGFwLWxpYj1saWJuYW1lXSxbU3BlY2lmeSBuYW1lIG9mIGR5bmFtaWMgbGRhcCBsaWIgZmlsZV0pLAogW0xEQVBMSUJOQU1FPSIkd2l0aHZhbCJdKQoKTEJFUkxJQk5BTUU9IiIKQUNfQVJHX1dJVEgobGJlci1saWIsCkFDX0hFTFBfU1RSSU5HKFstLXdpdGgtbGJlci1saWI9bGlibmFtZV0sW1NwZWNpZnkgbmFtZSBvZiBkeW5hbWljIGxiZXIgbGliIGZpbGVdKSwKIFtMQkVSTElCTkFNRT0iJHdpdGh2YWwiXSkKCmlmIHRlc3QgeCRDVVJMX0RJU0FCTEVfTERBUCAhPSB4MSA7IHRoZW4KCiAgaWYgdGVzdCAteiAiJExEQVBMSUJOQU1FIiA7IHRoZW4KICAgIGNhc2UgJGhvc3QgaW4KICAgICAgKi0qLWN5Z3dpbiB8ICotKi1taW5ndyogfCAqLSotcHczMiopCiAgICAgICAgZG5sIFdpbmRvd3MgdXNlcyBhIHNpbmdsZSBhbmQgdW5pcXVlIE9wZW5MREFQIERMTCBuYW1lCiAgICAgICAgTERBUExJQk5BTUU9IndsZGFwMzIuZGxsIgogICAgICAgIExCRVJMSUJOQU1FPSJubyIKICAgICAgICA7OwogICAgZXNhYwogIGZpCgogIGlmIHRlc3QgIiRMREFQTElCTkFNRSIgOyB0aGVuCiAgICBBQ19ERUZJTkVfVU5RVU9URUQoRExfTERBUF9GSUxFLCAiJExEQVBMSUJOQU1FIikKICAgIEFDX01TR19DSEVDS0lORyhbbmFtZSBvZiBkeW5hbWljIGxpYnJhcnkgbGRhcF0pCiAgICBBQ19NU0dfUkVTVUxUKCRMREFQTElCTkFNRSkKICBlbHNlCiAgICBkbmwgVHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IGxkYXAgbGlicmFyeSBuYW1lIGZvciB0aGlzIHN5c3RlbQogICAgQ1VSTF9ETExJQl9OQU1FKERMX0xEQVBfRklMRSwgbGRhcCkKICBmaQoKICBpZiB0ZXN0ICIkTEJFUkxJQk5BTUUiIDsgdGhlbgogICAgZG5sIElmIG5hbWUgaXMgIm5vIiB0aGVuIGRvbid0IGRlZmluZSB0aGlzIHZhcmlhYmxlIGF0IGFsbAogICAgZG5sIChpdCdzIG9ubHkgbmVlZGVkIGlmIGxpYmxkYXAuc28ncyBkZXBlbmRlbmNpZXMgYXJlIGJyb2tlbikuCiAgICBpZiB0ZXN0ICIkTEJFUkxJQk5BTUUiICE9ICJubyIgOyB0aGVuIAogICAgICBBQ19ERUZJTkVfVU5RVU9URUQoRExfTEJFUl9GSUxFLCAiJExCRVJMSUJOQU1FIikKICAgIGZpCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW25hbWUgb2YgZHluYW1pYyBsaWJyYXJ5IGxiZXJdKQogICAgQUNfTVNHX1JFU1VMVCgkTEJFUkxJQk5BTUUpCiAgZWxzZQogICAgZG5sIFRyeSB0byBmaW5kIHRoZSByaWdodCBsYmVyIGxpYnJhcnkgbmFtZSBmb3IgdGhpcyBzeXN0ZW0KICAgIENVUkxfRExMSUJfTkFNRShETF9MQkVSX0ZJTEUsIGxiZXIpCiAgZmkKZmkKCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRubCBDaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIHRoZSB3aW5tbSBsaWJyYXJ5LgpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKQUNfTVNHX0NIRUNLSU5HKFtmb3IgdGltZUdldFRpbWUgaW4gd2lubW1dKQpteV9hY19zYXZlX0xJQlM9JExJQlMKTElCUz0iLWx3aW5tbSAkTElCUyIKQUNfVFJZX0xJTksoWyNpbmNsdWRlIDx3aW5kZWYuaD4KICAgICAgICAgICAgICNpbmNsdWRlIDxtbXN5c3RlbS5oPgogICAgICAgICAgICAgXSwKICAgICAgICAgICAgIFt0aW1lR2V0VGltZSgpO10sCiAgICAgICAgICAgICBbIGRubCB3b3JrZWQhCiAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQogICAgICAgICAgICAgXSwKICAgICAgICAgICAgIFsgZG5sIGZhaWxlZCwgcmVzdG9yZSBMSUJTCiAgICAgICAgICAgICBMSUJTPSRteV9hY19zYXZlX0xJQlMKICAgICAgICAgICAgIEFDX01TR19SRVNVTFQobm8pXQogICAgICAgICAgICkKCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRubCBDaGVja3MgZm9yIElQdjYKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCkFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgaXB2Nl0pCkFDX0FSR19FTkFCTEUoaXB2NiwKQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWlwdjZdLFtFbmFibGUgaXB2NiAod2l0aCBpcHY0KSBzdXBwb3J0XSkKQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1pcHY2XSxbRGlzYWJsZSBpcHY2IHN1cHBvcnRdKSwKWyBjYXNlICIkZW5hYmxldmFsIiBpbgogIG5vKQogICAgICAgQUNfTVNHX1JFU1VMVChubykKICAgICAgIGlwdjY9bm8KICAgICAgIDs7CiAgKikgICBBQ19NU0dfUkVTVUxUKHllcykKICAgICAgIGlwdjY9eWVzCiAgICAgICA7OwogIGVzYWMgXSwKCiAgQUNfVFJZX1JVTihbIC8qIGlzIEFGX0lORVQ2IGF2YWlsYWJsZT8gKi8KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgptYWluKCkKewogaWYgKHNvY2tldChBRl9JTkVUNiwgU09DS19TVFJFQU0sIDApIDwgMCkKICAgZXhpdCgxKTsKIGVsc2UKICAgZXhpdCgwKTsKfQpdLAogIEFDX01TR19SRVNVTFQoeWVzKQogIGlwdjY9eWVzLAogIEFDX01TR19SRVNVTFQobm8pCiAgaXB2Nj1ubywKICBBQ19NU0dfUkVTVUxUKG5vKQogIGlwdjY9bm8KKSkKCmlmIHRlc3QgIiRpcHY2IiA9ICJ5ZXMiOyB0aGVuCiAgY3VybF9pcHY2X21zZz0iZW5hYmxlZCIKCiAgQ1VSTF9DSEVDS19XT1JLSU5HX0dFVEFERFJJTkZPCgogIENVUkxfQ0hFQ0tfTklfV0lUSFNDT1BFSUQKZmkKCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRubCBDaGVjayBob3cgbm9uLWJsb2NraW5nIHNvY2tldHMgYXJlIHNldApkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpBQ19BUkdfRU5BQkxFKG5vbmJsb2NraW5nLApBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtbm9uYmxvY2tpbmddLFtFbmFibGUgZGV0ZWN0aW5nIGhvdyB0byBkbyBpdF0pCkFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbm9uYmxvY2tpbmddLFtEaXNhYmxlIG5vbi1ibG9ja2luZyBzb2NrZXQgZGV0ZWN0aW9uXSksClsKICBpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyIgOyB0aGVuCiAgICBBQ19NU0dfV0FSTihbbm9uLWJsb2NraW5nIHNvY2tldHMgZGlzYWJsZWRdKQogICAgQUNfREVGSU5FKEhBVkVfRElTQUJMRURfTk9OQkxPQ0tJTkcsIDEsCiAgICBbdG8gZGlzYWJsZSBOT04tQkxPQ0tJTkcgY29ubmVjdGlvbnNdKQogIGVsc2UKICAgIENVUkxfQ0hFQ0tfTk9OQkxPQ0tJTkdfU09DS0VUCiAgZmkKXSwKWwogIENVUkxfQ0hFQ0tfTk9OQkxPQ0tJTkdfU09DS0VUCl0pCgpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkbmwgQ2hlY2sgaWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gYWxsb3dzIHByb2dyYW1zIHRvIHdyaXRlIHRvIHRoZWlyIG93biBhcmd2W10KZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCkFDX01TR19DSEVDS0lORyhbaWYgYXJndiBjYW4gYmUgd3JpdHRlbiB0b10pCkFDX0NBQ0hFX1ZBTChjdXJsX2N2X3dyaXRhYmxlX2FyZ3YsIFsKQUNfUlVOX0lGRUxTRShbWwppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KSB7Cglhcmd2WzBdWzBdID0gJyAnOwoJcmV0dXJuIChhcmd2WzBdWzBdID09ICcgJyk/MDoxOwp9CgldXSwKCWN1cmxfY3Zfd3JpdGFibGVfYXJndj15ZXMsCgljdXJsX2N2X3dyaXRhYmxlX2FyZ3Y9bm8sCgljdXJsX2N2X3dyaXRhYmxlX2FyZ3Y9Y3Jvc3MpCl0pCmNhc2UgJGN1cmxfY3Zfd3JpdGFibGVfYXJndiBpbgp5ZXMpCglBQ19ERUZJTkUoSEFWRV9XUklUQUJMRV9BUkdWLCAxLCBbRGVmaW5lIHRoaXMgc3ltYm9sIGlmIHlvdXIgT1Mgc3VwcG9ydHMgY2hhbmdpbmcgdGhlIGNvbnRlbnRzIG9mIGFyZ3ZdKQoJQUNfTVNHX1JFU1VMVCh5ZXMpCgk7OwpubykKCUFDX01TR19SRVNVTFQobm8pCgk7OwoqKQogICAgICAgIEFDX01TR19SRVNVTFQobm8pCiAgICAgICAgQUNfTVNHX1dBUk4oW3RoZSBwcmV2aW91cyBjaGVjayBjb3VsZCBub3QgYmUgbWFkZSBkZWZhdWx0IHdhcyB1c2VkXSkKCTs7CmVzYWMKCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRubCBDaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIEtlcmJlcm9zNCBsaWJyYXJpZXMgYW5kIGhlYWRlcnMKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCkFDX0FSR19XSVRIKGtyYjQtaW5jbHVkZXMsCkFDX0hFTFBfU1RSSU5HKFstLXdpdGgta3JiNC1pbmNsdWRlcz1ESVJdLAogICAgICAgICAgICAgICBbU3BlY2lmeSBsb2NhdGlvbiBvZiBrZXJiZXJvczQgaGVhZGVyc10pLFsKIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkd2l0aHZhbCIKIEtSQjRJTkM9IiR3aXRodmFsIgogd2FudF9rcmI0PXllcwogXSkKCkFDX0FSR19XSVRIKGtyYjQtbGlicywKQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1rcmI0LWxpYnM9RElSXSxbU3BlY2lmeSBsb2NhdGlvbiBvZiBrZXJiZXJvczQgbGlic10pLFsKIExERkxBR1M9IiRMREZMQUdTIC1MJHdpdGh2YWwiCiBLUkI0TElCPSIkd2l0aHZhbCIKIHdhbnRfa3JiND15ZXMKIF0pCgoKT1BUX0tSQjQ9b2ZmCkFDX0FSR19XSVRIKGtyYjQsZG5sCkFDX0hFTFBfU1RSSU5HKFstLXdpdGgta3JiND1ESVJdLFt3aGVyZSB0byBsb29rIGZvciBLZXJiZXJvczRdKSxbCiAgT1BUX0tSQjQ9IiR3aXRodmFsIgogIGlmIHRlc3QgWCIkT1BUX0tSQjQiICE9IFh5ZXMKICB0aGVuCiAgICBMREZMQUdTPSIkTERGTEFHUyAtTCRPUFRfS1JCNC9saWIkbGlic3VmZiIKICAgIEtSQjRMSUI9IiRPUFRfS1JCNC9saWIkbGlic3VmZiIKICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkT1BUX0tSQjQvaW5jbHVkZSIKICAgIEtSQjRJTkM9IiRPUFRfS1JCNC9pbmNsdWRlIgogIGZpCiAgd2FudF9rcmI0PSJ5ZXMiCiBdKQoKQUNfTVNHX0NIRUNLSU5HKFtpZiBLZXJiZXJvczQgc3VwcG9ydCBpcyByZXF1ZXN0ZWRdKQoKaWYgdGVzdCAiJHdhbnRfa3JiNCIgPSB5ZXMKdGhlbgogIGlmIHRlc3QgIiRpcHY2IiA9ICJ5ZXMiOyB0aGVuCiAgICBlY2hvIGtyYjQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBJUHY2CiAgICBleGl0IDEKICBmaQogIEFDX01TR19SRVNVTFQoeWVzKQoKICBkbmwgQ2hlY2sgZm9yICYgaGFuZGxlIGFyZ3VtZW50IHRvIC0td2l0aC1rcmI0CgogIEFDX01TR19DSEVDS0lORyh3aGVyZSB0byBsb29rIGZvciBLZXJiZXJvczQpCiAgaWYgdGVzdCBYIiRPUFRfS1JCNCIgPSBYeWVzCiAgdGhlbgogICAgQUNfTVNHX1JFU1VMVChbZGVmYXVsdHNdKQogIGVsc2UKICAgIEFDX01TR19SRVNVTFQoW2xpYnMgaW4gJEtSQjRMSUIsIGhlYWRlcnMgaW4gJEtSQjRJTkNdKQogIGZpCgogIGRubCBDaGVjayBmb3IgREVTIGxpYnJhcnkKICBBQ19DSEVDS19MSUIoZGVzLCBkZXNfcGNiY19lbmNyeXB0LAogIFsKICAgIEFDX0NIRUNLX0hFQURFUlMoZGVzLmgpCgogICAgZG5sIHJlc29sdiBsaWI/CiAgICBBQ19DSEVDS19GVU5DKHJlc19zZWFyY2gsICwgW0FDX0NIRUNLX0xJQihyZXNvbHYsIHJlc19zZWFyY2gpXSkKCiAgICBkbmwgQ2hlY2sgZm9yIHRoZSBLZXJiZXJvczQgbGlicmFyeQogICAgQUNfQ0hFQ0tfTElCKGtyYiwga3JiX25ldF9yZWFkLAogICAgWwogICAgICBkbmwgQ2hlY2sgZm9yIGhlYWRlciBmaWxlcwogICAgICBBQ19DSEVDS19IRUFERVJTKGtyYi5oKQoKICAgICAgZG5sIHdlIGZvdW5kIHRoZSByZXF1aXJlZCBsaWJyYXJpZXMsIGFkZCB0byBMSUJTCiAgICAgIExJQlM9Ii1sa3JiIC1sY29tX2VyciAtbGRlcyAkTElCUyIKCiAgICAgIGRubCBDaGVjayBmb3IgZnVuY3Rpb24ga3JiX2dldF9vdXJfaXBfZm9yX3JlYWxtCiAgICAgIGRubCB0aGlzIGlzIG5lZWRlZCBmb3IgTkFUIG5ldHdvcmtzCiAgICAgIEFDX0NIRUNLX0ZVTkNTKGtyYl9nZXRfb3VyX2lwX2Zvcl9yZWFsbSkKCiAgICAgIGRubCBhZGQgZGVmaW5lIEtSQjQKICAgICAgQUNfREVGSU5FKEhBVkVfS1JCNCwgMSwKICAgICAgW2lmIHlvdSBoYXZlIHRoZSBLZXJiZXJvczQgbGlicmFyaWVzIChpbmNsdWRpbmcgLWxkZXMpXSkKCiAgICAgIGRubCBzdWJzdGl0dXRlIGl0IHRvbyEKICAgICAgS1JCNF9FTkFCTEVEPTEKICAgICAgQUNfU1VCU1QoS1JCNF9FTkFCTEVEKQoKICAgICAgY3VybF9rcmI0X21zZz0iZW5hYmxlZCIKCiAgICAgIGRubCB0aGUga3JiNCBzdHVmZiBuZWVkcyBhIHN0cmxjcHkoKQogICAgICBBQ19DSEVDS19GVU5DUyhzdHJsY3B5KQoKICAgIF0pCiAgXSkKZWxzZQogIEFDX01TR19SRVNVTFQobm8pCmZpCgpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkbmwgQ2hlY2sgZm9yIEZCb3BlbnNzbChTUE5FR08pIGxpYnJhcmllcwpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKQUNfQVJHX1dJVEgoc3BuZWdvLAogIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtc3BuZWdvPURJUl0sCiAgICAgICAgICAgICAgICAgW1NwZWNpZnkgbG9jYXRpb24gb2YgU1BORUdPIGxpYnJhcnkgZmJvcGVuc3NsXSksCiAgWyBTUE5FR09fUk9PVD0iJHdpdGh2YWwiCiAgICB3YW50X3NwbmVnbz0ieWVzIiBdCikKQUNfTVNHX0NIRUNLSU5HKFtpZiBTUE5FR08gc3VwcG9ydCBpcyByZXF1ZXN0ZWRdKQppZiB0ZXN0IHgiJHdhbnRfc3BuZWdvIiA9IHh5ZXM7IHRoZW4KCiAgaWYgdGVzdCBYIiRTUE5FR09fUk9PVCIgPSBYeWVzOyB0aGVuCiAgICAgQUNfTVNHX0VSUk9SKFtGQk9wZW5TU0wgbGlicyBhbmQvb3IgZGlyZWN0b3JpZXMgd2VyZSBub3QgZm91bmQgd2hlcmUgc3BlY2lmaWVkIV0pCiAgICAgQUNfTVNHX1JFU1VMVChubykKICBlbHNlCiAgICAgaWYgdGVzdCAteiAiJFNQTkVHT19MSUJfRElSIjsgdGhlbgogICAgICAgIExERkxBR1M9IiRMREZMQUdTIC1MJFNQTkVHT19ST09UIC1sZmJvcGVuc3NsIgogICAgIGVsc2UKICAgICAgICBMREZMQUdTPSIkTERGTEFHUyAkU1BORUdPX0xJQl9ESVIiCiAgICAgZmkKIAogICAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgIEFDX0RFRklORShIQVZFX1NQTkVHTywgMSwKICAgICAgICAgICAgICAgW0RlZmluZSB0aGlzIGlmIHlvdSBoYXZlIHRoZSBTUE5FR08gbGlicmFyeSBmYm9wZW5zc2xdKQogICAgIGN1cmxfc3BuZWdvX21zZz0iZW5hYmxlZCIKICBmaQplbHNlCiAgQUNfTVNHX1JFU1VMVChubykKZmkKCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRubCBDaGVjayBmb3IgR1NTLUFQSSBsaWJyYXJpZXMKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCkFDX0FSR19XSVRIKGdzc2FwaS1pbmNsdWRlcywKICBBQ19IRUxQX1NUUklORyhbLS13aXRoLWdzc2FwaS1pbmNsdWRlcz1ESVJdLAogICAgICAgICAgICAgICAgIFtTcGVjaWZ5IGxvY2F0aW9uIG9mIEdTU0FQSSBoZWFkZXJdKSwKICBbIEdTU0FQSV9JTkNTPSItSSR3aXRodmFsIiAKICAgIHdhbnRfZ3NzPSJ5ZXMiIF0KKQoKQUNfQVJHX1dJVEgoZ3NzYXBpLWxpYnMsCiAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1nc3NhcGktbGlicz1ESVJdLAogIAkJIFtTcGVjaWZ5IGxvY2F0aW9uIG9mIEdTU0FQSSBsaWJzXSksCiAgWyBHU1NBUElfTElCUz0iLUwkd2l0aHZhbCAtbGdzc2FwaSIKICAgIHdhbnRfZ3NzPSJ5ZXMiIF0KKQoKQUNfQVJHX1dJVEgoZ3NzYXBpLAogIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtZ3NzYXBpPURJUl0sCiAgICAgICAgICAgICAgICAgW1doZXJlIHRvIGxvb2sgZm9yIEdTU0FQSV0pLAogIFsgR1NTQVBJX1JPT1Q9IiR3aXRodmFsIgogICAgd2FudF9nc3M9InllcyIgXQopCgpBQ19NU0dfQ0hFQ0tJTkcoW2lmIEdTU0FQSSBzdXBwb3J0IGlzIHJlcXVlc3RlZF0pCmlmIHRlc3QgeCIkd2FudF9nc3MiID0geHllczsgdGhlbgogIGlmIHRlc3QgLXogIiRHU1NBUElfSU5DUyI7IHRoZW4KICAgICBpZiB0ZXN0IC1mICIkR1NTQVBJX1JPT1QvYmluL2tyYjUtY29uZmlnIjsgdGhlbgogICAgICAgIEdTU0FQSV9JTkNTPWAkR1NTQVBJX1JPT1QvYmluL2tyYjUtY29uZmlnIC0tY2ZsYWdzIGdzc2FwaWAKICAgICBlbGlmIHRlc3QgIiRHU1NBUElfUk9PVCIgIT0gInllcyI7IHRoZW4KICAgICAgICBHU1NBUElfSU5DUz0iLUkkR1NTQVBJX1JPT1QvaW5jbHVkZSIKICAgICBmaQogIGZpCiAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkR1NTQVBJX0lOQ1MiCiAgCiAgaWYgdGVzdCAteiAiJEdTU0FQSV9MSUJfRElSIjsgdGhlbgogICAgIGlmIHRlc3QgLWYgIiRHU1NBUElfUk9PVC9iaW4va3JiNS1jb25maWciOyB0aGVuCiAgICAgICAgZ3NzX2xkZmxhZ3M9YCRHU1NBUElfUk9PVC9iaW4va3JiNS1jb25maWcgLS1saWJzIGdzc2FwaWAKCUxERkxBR1M9IiRMREZMQUdTICRnc3NfbGRmbGFncyIKICAgICBlbGlmIHRlc3QgIiRHU1NBUElfUk9PVCIgIT0gInllcyI7IHRoZW4KICAgICAgICBMREZMQUdTPSIkTERGTEFHUyAtTCRHU1NBUElfUk9PVC9saWIkbGlic3VmZiAtbGdzc2FwaSIKICAgICBlbHNlCiAgICAgICAgTERGTEFHUz0iJExERkxBR1MgLWxnc3NhcGkiCiAgICAgZmkKICBlbHNlCiAgICAgTERGTEFHUz0iJExERkxBR1MgJEdTU0FQSV9MSUJfRElSIgogIGZpCgogIEFDX01TR19SRVNVTFQoeWVzKQogIEFDX0RFRklORShIQVZFX0dTU0FQSSwgMSwgW2lmIHlvdSBoYXZlIHRoZSBnc3NhcGkgbGlicmFyaWVzXSkKCiAgY3VybF9nc3NfbXNnPSJlbmFibGVkIgoKICBBQ19DSEVDS19IRUFERVIoZ3NzYXBpLmgsCiAgICBbCiAgICAgICBkbmwgZm91bmQgaW4gdGhlIGdpdmVuIGRpcnMKICAgICAgQUNfREVGSU5FKEhBVkVfR1NTSEVJTURBTCwgMSwgW2lmIHlvdSBoYXZlIHRoZSBIZWltZGFsIGdzc2FwaSBsaWJyYXJpZXNdKQogICAgXSwKICAgIFsKICAgICAgZG5sIG5vdCBmb3VuZCwgY2hlY2sgaW4gZ3NzYXBpLyBzdWJkaXIgCiAgICAgIEFDX0NIRUNLX0hFQURFUihnc3NhcGkvZ3NzYXBpLmgsCiAgICAgICAgZG5sIGZvdW5kIAogICAgICAgIEFDX0RFRklORShIQVZFX0dTU01JVCwgMSwgW2lmIHlvdSBoYXZlIHRoZSBNSVQgZ3NzYXBpIGxpYnJhcmllc10pCiAgICAgICkKICAgICAgCiAgICBdCiAgKQoKZWxzZQogIEFDX01TR19SRVNVTFQobm8pCmZpCiAgCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRubCBDaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIFNTTCBsaWJyYXJpZXMgYW5kIGhlYWRlcnMKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCmRubCBEZWZhdWx0IHRvIGNvbXBpbGVyICYgbGlua2VyIGRlZmF1bHRzIGZvciBTU0wgZmlsZXMgJiBsaWJyYXJpZXMuCk9QVF9TU0w9b2ZmCmRubCBEZWZhdWx0IHRvIG5vIENBIGJ1bmRsZQpjYT0ibm8iCkFDX0FSR19XSVRIKHNzbCxkbmwKQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1zc2w9UEFUSF0sW3doZXJlIHRvIGxvb2sgZm9yIFNTTCwgUEFUSCBwb2ludHMgdG8gdGhlIFNTTCBpbnN0YWxsYXRpb24gKGRlZmF1bHQ6IC91c3IvbG9jYWwvc3NsKV0pCkFDX0hFTFBfU1RSSU5HKFstLXdpdGhvdXQtc3NsXSwgW2Rpc2FibGUgU1NMXSksCiAgT1BUX1NTTD0kd2l0aHZhbCkKCmlmIHRlc3QgWCIkT1BUX1NTTCIgIT0gWG5vOyB0aGVuCiAgZG5sIGJhY2t1cCB0aGUgcHJlLXNzbCB2YXJpYWJsZXMKICBDTEVBTkxERkxBR1M9IiRMREZMQUdTIgogIENMRUFOQ1BQRkxBR1M9IiRDUFBGTEFHUyIKICBDTEVBTkxJQlM9IiRMSUJTIgoKICBjYXNlICIkT1BUX1NTTCIgaW4KICB5ZXMpCiAgICBkbmwgLS13aXRoLXNzbCAod2l0aG91dCBwYXRoKSB1c2VkCiAgICBpZiB0ZXN0IHgkY3Jvc3NfY29tcGlsaW5nICE9IHh5ZXM7IHRoZW4KICAgICAgZG5sIG9ubHkgZG8gcGtnLWNvbmZpZyBtYWdpYyB3aGVuIG5vdCBjcm9zcy1jb21waWxpbmcKICAgICAgUEtHVEVTVD0ieWVzIgogICAgZmkKICAgIEVYVFJBX1NTTD0vdXNyL2xvY2FsL3NzbCA7OwogIG9mZikKICAgIGRubCBubyAtLXdpdGgtc3NsIG9wdGlvbiBnaXZlbiwganVzdCBjaGVjayBkZWZhdWx0IHBsYWNlcwogICAgaWYgdGVzdCB4JGNyb3NzX2NvbXBpbGluZyAhPSB4eWVzOyB0aGVuCiAgICAgIGRubCBvbmx5IGRvIHBrZy1jb25maWcgbWFnaWMgd2hlbiBub3QgY3Jvc3MtY29tcGlsaW5nCiAgICAgIFBLR1RFU1Q9InllcyIKICAgIGZpCiAgICBFWFRSQV9TU0w9IDs7CiAgKikKICAgIGRubCBjaGVjayB0aGUgZ2l2ZW4gLS13aXRoLXNzbCBzcG90CiAgICBQS0dURVNUPSJubyIKICAgIEVYVFJBX1NTTD0kT1BUX1NTTAogICAgTERGTEFHUz0iJExERkxBR1MgLUwkRVhUUkFfU1NML2xpYiRsaWJzdWZmIgogICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSRFWFRSQV9TU0wvaW5jbHVkZS9vcGVuc3NsIC1JJEVYVFJBX1NTTC9pbmNsdWRlIgogICAgOzsKICBlc2FjCgogIGlmIHRlc3QgIiRQS0dURVNUIiA9ICJ5ZXMiOyB0aGVuCgogICAgZG5sIERldGVjdCB0aGUgcGtnLWNvbmZpZyB0b29sLCBhcyBpdCBtYXkgaGF2ZSBleHRyYSBpbmZvIGFib3V0IHRoZQogICAgZG5sIG9wZW5zc2wgaW5zdGFsbGF0aW9uIHdlIGNhbiB1c2UuIEkgKmJlbGlldmUqIHRoaXMgaXMgd2hhdCB3ZSBhcmUKICAgIGRubCBleHBlY3RlZCB0byBkbyBvbiByZWFsbHkgcmVjZW50IFJlZGhhdCBMaW51eCBob3N0cy4KCiAgICBBQ19QQVRIX1BST0coIFBLR0NPTkZJRywgcGtnLWNvbmZpZywgbm8sICRQQVRIOi91c3IvYmluOi91c3IvbG9jYWwvYmluKQogICAgaWYgdGVzdCAiJFBLR0NPTkZJRyIgIT0gIm5vIiA7IHRoZW4KICAgICAgQUNfTVNHX0NIRUNLSU5HKFtPcGVuU1NMIG9wdGlvbnMgd2l0aCBwa2ctY29uZmlnXSkKCiAgICAgICRQS0dDT05GSUcgLS1leGlzdHMgb3BlbnNzbAogICAgICBTU0xfRVhJU1RTPSQ/CgogICAgICBpZiB0ZXN0ICIkU1NMX0VYSVNUUyIgLWVxICIwIjsgdGhlbgogICAgICAgIFNTTF9MSUJTPWAkUEtHQ09ORklHIC0tbGlicy1vbmx5LWwgb3BlbnNzbCAyPi9kZXYvbnVsbGAKICAgICAgICBTU0xfTERGTEFHUz1gJFBLR0NPTkZJRyAtLWxpYnMtb25seS1MIG9wZW5zc2wgMj4vZGV2L251bGxgCiAgICAgICAgU1NMX0NQUEZMQUdTPWAkUEtHQ09ORklHIC0tY2ZsYWdzLW9ubHktSSBvcGVuc3NsIDI+L2Rldi9udWxsYAoKICAgICAgICBkbmwgdXNlIHRoZSB2YWx1ZXMgcGtnLWNvbmZpZyByZXBvcnRlZAogICAgICAgIExJQlM9IiRMSUJTICRTU0xfTElCUyIKICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTICRTU0xfQ1BQRkxBR1MiCiAgICAgICAgTERGTEFHUz0iJExERkxBR1MgJFNTTF9MREZMQUdTIgogICAgICAgIEFDX01TR19SRVNVTFQoW2ZvdW5kXSkKICAgICAgZWxzZQogICAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKICAgICAgZmkKICAgIGZpCiAgZmkKCiAgZG5sIFRoaXMgaXMgZm9yIE1zeXMvTWluZ3cKICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBnZGkzMl0pCiAgbXlfYWNfc2F2ZV9MSUJTPSRMSUJTCiAgTElCUz0iLWxnZGkzMiAkTElCUyIKICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHdpbmRlZi5oPgogICAgICAgICAgICAgICAjaW5jbHVkZSA8d2luZ2RpLmg+XSwKICAgICAgICAgICAgICAgW0dkaUZsdXNoKCk7XSwKICAgICAgICAgICAgICAgWyBkbmwgd29ya2VkIQogICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCiAgICAgICAgICAgICAgIFsgZG5sIGZhaWxlZCwgcmVzdG9yZSBMSUJTCiAgICAgICAgICAgICAgIExJQlM9JG15X2FjX3NhdmVfTElCUwogICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKV0KICAgICAgICAgICAgICApCgogIEFDX0NIRUNLX0xJQihjcnlwdG8sIENSWVBUT19sb2NrLFsKICAgICBIQVZFQ1JZUFRPPSJ5ZXMiCiAgICAgTElCUz0iLWxjcnlwdG8gJExJQlMiCiAgICAgXSxbCiAgICAgTERGTEFHUz0iJENMRUFOTERGTEFHUyAtTCRFWFRSQV9TU0wvbGliJGxpYnN1ZmYiCiAgICAgQ1BQRkxBR1M9IiRDTEVBTkNQUEZMQUdTIC1JJEVYVFJBX1NTTC9pbmNsdWRlL29wZW5zc2wgLUkkRVhUUkFfU1NML2luY2x1ZGUiCiAgICAgQUNfQ0hFQ0tfTElCKGNyeXB0bywgQ1JZUFRPX2FkZF9sb2NrLFsKICAgICAgIEhBVkVDUllQVE89InllcyIKICAgICAgIExJQlM9Ii1sY3J5cHRvICRMSUJTIl0sIFsKICAgICAgIExERkxBR1M9IiRDTEVBTkxERkxBR1MiCiAgICAgICBDUFBGTEFHUz0iJENMRUFOQ1BQRkxBR1MiCiAgICAgICBMSUJTPSIkQ0xFQU5MSUJTIgogICAgICAgXSkKICAgIF0pCgoKICBpZiB0ZXN0IFgiJEhBVkVDUllQVE8iID0gWCJ5ZXMiOyB0aGVuCiAgICBkbmwgVGhpcyBpcyBvbmx5IHJlYXNvbmFibGUgdG8gZG8gaWYgY3J5cHRvIGFjdHVhbGx5IGlzIHRoZXJlOiBjaGVjayBmb3IKICAgIGRubCBTU0wgbGlicyBOT1RFOiBpdCBpcyBpbXBvcnRhbnQgdG8gZG8gdGhpcyBBRlRFUiB0aGUgY3J5cHRvIGxpYgoKICAgIEFDX0NIRUNLX0xJQihzc2wsIFNTTF9jb25uZWN0KQoKICAgIGlmIHRlc3QgIiRhY19jdl9saWJfc3NsX1NTTF9jb25uZWN0IiAhPSB5ZXM7IHRoZW4KICAgICAgICBkbmwgd2UgZGlkbid0IGZpbmQgdGhlIFNTTCBsaWIsIHRyeSB0aGUgUlNBZ2x1ZS9yc2FyZWYgc3R1ZmYKICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIHNzbCB3aXRoIFJTQWdsdWUvcnNhcmVmIGxpYnMgaW4gdXNlKTsKICAgICAgICBPTElCUz0kTElCUwogICAgICAgIExJQlM9IiRMSUJTIC1sUlNBZ2x1ZSAtbHJzYXJlZiIKICAgICAgICBBQ19DSEVDS19MSUIoc3NsLCBTU0xfY29ubmVjdCkKICAgICAgICBpZiB0ZXN0ICIkYWNfY3ZfbGliX3NzbF9TU0xfY29ubmVjdCIgIT0geWVzOyB0aGVuCiAgICAgICAgICAgIGRubCBzdGlsbCBubyBTU0xfY29ubmVjdAogICAgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQogICAgICAgICAgICBMSUJTPSRPTElCUwogICAgICAgIGVsc2UKICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICAgZmkKCiAgICBlbHNlCgogICAgICBkbmwgSGF2ZSB0aGUgbGlicmFyaWVzLS1jaGVjayBmb3IgU1NMZWF5L09wZW5TU0wgaGVhZGVycwogICAgICBBQ19DSEVDS19IRUFERVJTKG9wZW5zc2wveDUwOS5oIG9wZW5zc2wvcnNhLmggb3BlbnNzbC9jcnlwdG8uaCBcCiAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNzbC9wZW0uaCBvcGVuc3NsL3NzbC5oIG9wZW5zc2wvZXJyLmgsCiAgICAgICAgY3VybF9zc2xfbXNnPSJlbmFibGVkIChPcGVuU1NMKSIKICAgICAgICBPUEVOU1NMX0VOQUJMRUQ9MQogICAgICAgIEFDX0RFRklORShVU0VfT1BFTlNTTCwgMSwgW2lmIE9wZW5TU0wgaXMgaW4gdXNlXSkpCgogICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfb3BlbnNzbF94NTA5X2ggPSBubzsgdGhlbgogICAgICAgIEFDX0NIRUNLX0hFQURFUlMoeDUwOS5oIHJzYS5oIGNyeXB0by5oIHBlbS5oIHNzbC5oIGVyci5oLAogICAgICAgICAgY3VybF9zc2xfbXNnPSJlbmFibGVkIChPcGVuU1NMKSIKICAgICAgICAgIE9QRU5TU0xfRU5BQkxFRD0xKQogICAgICBmaQogICAgZmkKCiAgICBpZiB0ZXN0IFgiJE9QRU5TU0xfRU5BQkxFRCIgPSBYIjEiOyB0aGVuCiAgICAgICBBQ19ERUZJTkUoVVNFX1NTTEVBWSwgMSwgW2lmIFNTTCBpcyBlbmFibGVkXSkKCiAgICAgICBkbmwgaXMgdGhlcmUgYSBwa2NzMTIuaCBoZWFkZXIgcHJlc2VudD8KICAgICAgIEFDX0NIRUNLX0hFQURFUlMob3BlbnNzbC9wa2NzMTIuaCkKICAgIGVsc2UKICAgICAgIExJQlM9IiRDTEVBTkxJQlMiCiAgICBmaQogICAgZG5sIFVTRV9TU0xFQVkgaXMgdGhlIGhpc3RvcmljYWwgbmFtZSBmb3Igd2hhdCBjb25maWd1cmUgY2FsbHMKICAgIGRubCBPUEVOU1NMX0VOQUJMRUQ7IHRoZSBuYW1lcyBzaG91bGQgcmVhbGx5IGJlIHVuaWZpZWQKICAgIFVTRV9TU0xFQVk9IiRPUEVOU1NMX0VOQUJMRUQiCiAgICBBQ19TVUJTVChVU0VfU1NMRUFZKQoKICAgIGlmIHRlc3QgWCIkT1BUX1NTTCIgIT0gWG9mZiAmJgogICAgICAgdGVzdCAiJE9QRU5TU0xfRU5BQkxFRCIgIT0gIjEiOyB0aGVuCiAgICAgIEFDX01TR19FUlJPUihbT3BlblNTTCBsaWJzIGFuZC9vciBkaXJlY3RvcmllcyB3ZXJlIG5vdCBmb3VuZCB3aGVyZSBzcGVjaWZpZWQhXSkKICAgIGZpCiAgZmkKCiAgaWYgdGVzdCBYIiRPUEVOU1NMX0VOQUJMRUQiID0gWCIxIjsgdGhlbgogICAgZG5sIElmIHRoZSBFTkdJTkUgbGlicmFyeSBzZWVtcyB0byBiZSBhcm91bmQsIGNoZWNrIGZvciB0aGUgT3BlblNTTCBlbmdpbmUKICAgIGRubCBzdHVmZiwgaXQgaXMga2luZCBvZiAic2VwYXJhdGVkIiBmcm9tIHRoZSBtYWluIFNTTCBjaGVjawogICAgQUNfQ0hFQ0tfRlVOQyhFTkdJTkVfaW5pdCwKICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICBBQ19DSEVDS19IRUFERVJTKG9wZW5zc2wvZW5naW5lLmgpCiAgICAgICAgICAgICAgICBBQ19DSEVDS19GVU5DUyggRU5HSU5FX2xvYWRfYnVpbHRpbl9lbmdpbmVzICkKICAgICAgICAgICAgICBdKQoKICAgIGRubCB0aGVzZSBjYW4gb25seSBleGlzdCBpZiBvcGVuc3NsIGV4aXN0cwoKICAgIEFDX0NIRUNLX0ZVTkNTKCBSQU5EX3N0YXR1cyBcCiAgICAgICAgICAgICAgICAgICAgUkFORF9zY3JlZW4gXAogICAgICAgICAgICAgICAgICAgIFJBTkRfZWdkIFwKICAgICAgICAgICAgICAgICAgICBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSApCgogIGZpCgogIGlmIHRlc3QgIiRPUEVOU1NMX0VOQUJMRUQiID0gIjEiOyB0aGVuCiAgICBkbmwgd2hlbiB0aGUgc3NsIHNoYXJlZCBsaWJzIHdlcmUgZm91bmQgaW4gYSBwYXRoIHRoYXQgdGhlIHJ1bi10aW1lIGxpbmtlcgogICAgZG5sIGRvZXNuJ3Qgc2VhcmNoIHRocm91Z2gsIHdlIG5lZWQgdG8gYWRkIGl0IHRvIExEX0xJQlJBUllfUEFUSCB0bwogICAgZG5sIHByZXZlbnQgZnVydGhlciBjb25maWd1cmUgdGVzdHMgdG8gZmFpbCBkdWUgdG8gdGhpcwogICAgTERfTElCUkFSWV9QQVRIPSIkTERfTElCUkFSWV9QQVRIOiRFWFRSQV9TU0wvbGliJGxpYnN1ZmYiCiAgICBleHBvcnQgTERfTElCUkFSWV9QQVRICiAgZmkKCmZpCgpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkbmwgQ2hlY2sgZm9yIHRoZSByYW5kb20gc2VlZCBwcmVmZXJlbmNlcyAKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCmlmIHRlc3QgWCIkT1BFTlNTTF9FTkFCTEVEIiA9IFgiMSI7IHRoZW4KICBBQ19BUkdfV0lUSChlZ2Qtc29ja2V0LAogIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtZWdkLXNvY2tldD1GSUxFXSwKICAgICAgICAgICAgICAgICBbRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uIHNvY2tldCBwYXRobmFtZV0pLAogICAgICBbIEVHRF9TT0NLRVQ9IiR3aXRodmFsIiBdCiAgKQogIGlmIHRlc3QgLW4gIiRFR0RfU09DS0VUIiA7IHRoZW4KICAgICAgICAgIEFDX0RFRklORV9VTlFVT1RFRChFR0RfU09DS0VULCAiJEVHRF9TT0NLRVQiLAogICAgICAgICAgW3lvdXIgRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uIHNvY2tldCBwYXRobmFtZV0gKQogIGZpCgogIGRubCBDaGVjayBmb3IgdXNlci1zcGVjaWZpZWQgcmFuZG9tIGRldmljZQogIEFDX0FSR19XSVRIKHJhbmRvbSwKICBBQ19IRUxQX1NUUklORyhbLS13aXRoLXJhbmRvbT1GSUxFXSwKICAgICAgICAgICAgICAgICBbcmVhZCByYW5kb21uZXNzIGZyb20gRklMRSAoZGVmYXVsdD0vZGV2L3VyYW5kb20pXSksCiAgICAgIFsgUkFORE9NX0ZJTEU9IiR3aXRodmFsIiBdLAogICAgICBbCiAgICAgICAgICBkbmwgQ2hlY2sgZm9yIHJhbmRvbSBkZXZpY2UKICAgICAgICAgIEFDX0NIRUNLX0ZJTEUoIi9kZXYvdXJhbmRvbSIsIFsgUkFORE9NX0ZJTEU9Ii9kZXYvdXJhbmRvbSJdICkKICAgICAgXQogICkKICBpZiB0ZXN0IC1uICIkUkFORE9NX0ZJTEUiICYmIHRlc3QgWCIkUkFORE9NX0ZJTEUiICE9IFhubyA7IHRoZW4KICAgICAgICAgIEFDX1NVQlNUKFJBTkRPTV9GSUxFKQogICAgICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKFJBTkRPTV9GSUxFLCAiJFJBTkRPTV9GSUxFIiwKICAgICAgICAgIFthIHN1aXRhYmxlIGZpbGUgdG8gcmVhZCByYW5kb20gZGF0YSBmcm9tXSkKICBmaQpmaQoKZG5sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZG5sIEZJWDogb25seSBjaGVjayBmb3IgR251VExTIGlmIE9wZW5TU0wgaXMgbm90IGVuYWJsZWQKZG5sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmRubCBEZWZhdWx0IHRvIGNvbXBpbGVyICYgbGlua2VyIGRlZmF1bHRzIGZvciBHbnVUTFMgZmlsZXMgJiBsaWJyYXJpZXMuCk9QVF9HTlVUTFM9b2ZmCgpBQ19BUkdfV0lUSChnbnV0bHMsZG5sCkFDX0hFTFBfU1RSSU5HKFstLXdpdGgtZ251dGxzPVBBVEhdLFt3aGVyZSB0byBsb29rIGZvciBHbnVUTFMsIFBBVEggcG9pbnRzIHRvIHRoZSBpbnN0YWxsYXRpb24gcm9vdCAoZGVmYXVsdDogL3Vzci9sb2NhbC8pXSkKQUNfSEVMUF9TVFJJTkcoWy0td2l0aG91dC1nbnV0bHNdLCBbZGlzYWJsZSBHbnVUTFMgZGV0ZWN0aW9uXSksCiAgT1BUX0dOVVRMUz0kd2l0aHZhbCkKCmlmIHRlc3QgIiRPUEVOU1NMX0VOQUJMRUQiICE9ICIxIjsgdGhlbgoKICBpZiB0ZXN0IFgiJE9QVF9HTlVUTFMiICE9IFhvZmY7IHRoZW4KICAgIGlmIHRlc3QgIngkT1BUX0dOVVRMUyIgPSAieHllcyI7IHRoZW4KICAgICBjaGVjaz1gbGliZ251dGxzLWNvbmZpZyAtLXZlcnNpb24gMj4vZGV2L251bGxgCiAgICAgaWYgdGVzdCAtbiAiJGNoZWNrIjsgdGhlbgogICAgICAgYWRkbGliPWBsaWJnbnV0bHMtY29uZmlnIC0tbGlic2AKICAgICAgIGFkZGNmbGFncz1gbGliZ251dGxzLWNvbmZpZyAtLWNmbGFnc2AKICAgICAgIHZlcnNpb249YGxpYmdudXRscy1jb25maWcgLS12ZXJzaW9uYAogICAgICAgZ3Rsc3ByZWZpeD1gbGliZ251dGxzLWNvbmZpZyAtLXByZWZpeGAKICAgICBmaQogICAgZWxzZQogICAgICBhZGRsaWI9YCRPUFRfR05VVExTL2Jpbi9saWJnbnV0bHMtY29uZmlnIC0tbGlic2AKICAgICAgYWRkY2ZsYWdzPWAkT1BUX0dOVVRMUy9iaW4vbGliZ251dGxzLWNvbmZpZyAtLWNmbGFnc2AKICAgICAgdmVyc2lvbj1gJE9QVF9HTlVUTFMvYmluL2xpYmdudXRscy1jb25maWcgLS12ZXJzaW9uIDI+L2Rldi9udWxsYAogICAgICBndGxzcHJlZml4PSRPUFRfR05VVExTCiAgICAgIGlmIHRlc3QgLXogIiR2ZXJzaW9uIjsgdGhlbgogICAgICAgIHZlcnNpb249InVua25vd24iCiAgICAgIGZpCiAgICBmaQogICAgaWYgdGVzdCAtbiAiJGFkZGxpYiI7IHRoZW4KCiAgICAgIENMRUFOTERGTEFHUz0iJExERkxBR1MiCiAgICAgIENMRUFOQ1BQRkxBR1M9IiRDUFBGTEFHUyIKICAKICAgICAgTERGTEFHUz0iJExERkxBR1MgJGFkZGxpYiIKICAgICAgaWYgdGVzdCAiJGFkZGNmbGFncyIgIT0gIi1JL3Vzci9pbmNsdWRlIjsgdGhlbgogICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTICRhZGRjZmxhZ3MiCiAgICAgIGZpCiAgCiAgICAgIEFDX0NIRUNLX0xJQihnbnV0bHMsIGdudXRsc19jaGVja192ZXJzaW9uLAogICAgICAgWwogICAgICAgQUNfREVGSU5FKFVTRV9HTlVUTFMsIDEsIFtpZiBHbnVUTFMgaXMgZW5hYmxlZF0pCiAgICAgICBBQ19TVUJTVChVU0VfR05VVExTLCBbMV0pCiAgICAgICBVU0VfR05VVExTPSJ5ZXMiCiAgICAgICBjdXJsX3NzbF9tc2c9ImVuYWJsZWQgKEdudVRMUykiCiAgICAgICBdLAogICAgICAgWwogICAgICAgICBMREZMQUdTPSIkQ0xFQU5MREZMQUdTIgogICAgICAgICBDUFBGTEFHUz0iJENMRUFOQ1BQRkxBR1MiCiAgICAgICBdKQogIAogICAgICBpZiB0ZXN0ICJ4JFVTRV9HTlVUTFMiID0gInh5ZXMiOyB0aGVuCiAgICAgICAgQUNfTVNHX05PVElDRShbZGV0ZWN0ZWQgR251VExTIHZlcnNpb24gJHZlcnNpb25dKQoKICAgICAgICBkbmwgd2hlbiBzaGFyZWQgbGlicyB3ZXJlIGZvdW5kIGluIGEgcGF0aCB0aGF0IHRoZSBydW4tdGltZQogICAgICAgIGRubCBsaW5rZXIgZG9lc24ndCBzZWFyY2ggdGhyb3VnaCwgd2UgbmVlZCB0byBhZGQgaXQgdG8KICAgICAgICBkbmwgTERfTElCUkFSWV9QQVRIIHRvIHByZXZlbnQgZnVydGhlciBjb25maWd1cmUgdGVzdHMgdG8gZmFpbAogICAgICAgIGRubCBkdWUgdG8gdGhpcwoKICAgICAgICBMRF9MSUJSQVJZX1BBVEg9IiRMRF9MSUJSQVJZX1BBVEg6JGd0bHNwcmVmaXgvbGliJGxpYnN1ZmYiCiAgICAgICAgZXhwb3J0IExEX0xJQlJBUllfUEFUSAogICAgICBmaQoKICAgIGZpCgogIGZpIGRubCBHTlVUTFMgbm90IGRpc2FibGVkCgogIGlmIHRlc3QgWCIkVVNFX0dOVVRMUyIgIT0gIlh5ZXMiOyB0aGVuCiAgICBBQ19NU0dfV0FSTihbU1NMIGRpc2FibGVkLCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byB1c2UgSFRUUFMsIEZUUFMsIE5UTE0gYW5kIG1vcmUuXSkKICAgIEFDX01TR19XQVJOKFtVc2UgLS13aXRoLXNzbCBvciAtLXdpdGgtZ251dGxzIHRvIGFkZHJlc3MgdGhpcy5dKQogIGZpCgpmaSBkbmwgT1BFTlNTTCAhPSAxCgpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkbmwgQ2hlY2sgZm9yIHRoZSBDQSBidW5kbGUKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCmlmIHRlc3QgWCIkVVNFX0dOVVRMUyRPUEVOU1NMX0VOQUJMRUQiICE9ICJYIjsgdGhlbgoKICBBQ19NU0dfQ0hFQ0tJTkcoW0NBIGNlcnQgYnVuZGxlIGluc3RhbGwgcGF0aF0pCgogIEFDX0FSR19XSVRIKGNhLWJ1bmRsZSwKQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1jYS1idW5kbGU9RklMRV0sIFtGaWxlIG5hbWUgdG8gaW5zdGFsbCB0aGUgQ0EgYnVuZGxlIGFzXSkKQUNfSEVMUF9TVFJJTkcoWy0td2l0aG91dC1jYS1idW5kbGVdLCBbRG9uJ3QgaW5zdGFsbCB0aGUgQ0EgYnVuZGxlXSksCiAgICBbIGNhPSIkd2l0aHZhbCIgXSwKICAgIFsKICAgICAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCiAgICAgICAgY2E9Ilwke3ByZWZpeH0vc2hhcmUvY3VybC9jdXJsLWNhLWJ1bmRsZS5jcnQiCiAgICAgIGVsc2UKICAgICAgICBjYT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2N1cmwvY3VybC1jYS1idW5kbGUuY3J0IgogICAgICBmaQogICAgXSApCgogICAgaWYgdGVzdCAieCRjYSIgIT0gInhubyI7IHRoZW4KICAgICAgQ1VSTF9DQV9CVU5ETEU9JyInJGNhJyInCiAgICAgIEFDX1NVQlNUKENVUkxfQ0FfQlVORExFKSAgCiAgICBmaQogICAgQUNfTVNHX1JFU1VMVChbJGNhXSkKZmkgZG5sIG9ubHkgZG9uZSBpZiBzb21lIGtpbmQgb2YgU1NMIHdhcyBlbmFibGVkCgpBTV9DT05ESVRJT05BTChDQUJVTkRMRSwgdGVzdCB4JGNhICE9IHhubykKCgoKICAKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZG5sIENoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgWkxJQiBsaWJyYXJpZXMgYW5kIGhlYWRlcnMKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCmRubCBDaGVjayBmb3IgJiBoYW5kbGUgYXJndW1lbnQgdG8gLS13aXRoLXpsaWIuCgpfY3BwZmxhZ3M9JENQUEZMQUdTCl9sZGZsYWdzPSRMREZMQUdTCkFDX0FSR19XSVRIKHpsaWIsCkFDX0hFTFBfU1RSSU5HKFstLXdpdGgtemxpYj1QQVRIXSxbc2VhcmNoIGZvciB6bGliIGluIFBBVEhdKQpBQ19IRUxQX1NUUklORyhbLS13aXRob3V0LXpsaWJdLFtkaXNhYmxlIHVzZSBvZiB6bGliXSksCiAgICAgICAgICAgICAgIFtPUFRfWkxJQj0iJHdpdGh2YWwiXSkKCmlmIHRlc3QgIiRPUFRfWkxJQiIgPSAibm8iIDsgdGhlbgogICAgQUNfTVNHX1dBUk4oW3psaWIgZGlzYWJsZWRdKQplbHNlCiAgaWYgdGVzdCAiJE9QVF9aTElCIiA9ICJ5ZXMiIDsgdGhlbgogICAgIE9QVF9aTElCPSIiCiAgZmkKCiAgaWYgdGVzdCAteiAiJE9QVF9aTElCIiA7IHRoZW4KICAgIGRubCBjaGVjayBmb3IgdGhlIGxpYiBmaXJzdCB3aXRob3V0IHNldHRpbmcgYW55IG5ldyBwYXRoLCBzaW5jZSBtYW55CiAgICBkbmwgcGVvcGxlIGhhdmUgaXQgaW4gdGhlIGRlZmF1bHQgcGF0aAoKICAgIEFDX0NIRUNLX0xJQih6LCBpbmZsYXRlRW5kLAogICAgICAgICAgICAgICAgICAgZG5sIGxpYnogZm91bmQsIHNldCB0aGUgdmFyaWFibGUKICAgICAgICAgICAgICAgICAgIFtIQVZFX0xJQlo9IjEiXSwKICAgICAgICAgICAgICAgICAgIGRubCBpZiBubyBsaWIgZm91bmQsIHRyeSAvdXNyL2xvY2FsCiAgICAgICAgICAgICAgICAgICBbT1BUX1pMSUI9Ii91c3IvbG9jYWwiXSkKCiAgZmkKCiAgZG5sIEFkZCBhIG5vbmVtcHR5IHBhdGggdG8gdGhlIGNvbXBpbGVyIGZsYWdzCiAgaWYgdGVzdCAtbiAiJE9QVF9aTElCIjsgdGhlbgogICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkT1BUX1pMSUIvaW5jbHVkZSIKICAgICBMREZMQUdTPSIkTERGTEFHUyAtTCRPUFRfWkxJQi9saWIkbGlic3VmZiIKICBmaQoKICBBQ19DSEVDS19IRUFERVIoemxpYi5oLAogICAgWwogICAgZG5sIHpsaWIuaCB3YXMgZm91bmQKICAgIEhBVkVfWkxJQl9IPSIxIgogICAgZG5sIGlmIHRoZSBsaWIgd2Fzbid0IGZvdW5kIGFscmVhZHksIHRyeSBhZ2FpbiB3aXRoIHRoZSBuZXcgcGF0aHMKICAgIGlmIHRlc3QgIiRIQVZFX0xJQloiICE9ICIxIjsgdGhlbgogICAgICBBQ19DSEVDS19MSUIoeiwgZ3pyZWFkLAogICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgZG5sIHRoZSBsaWIgd2FzIGZvdW5kIQogICAgICAgICAgICAgICAgICAgSEFWRV9MSUJaPSIxIgogICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgIFsgQ1BQRkxBR1M9JF9jcHBmbGFncwogICAgICAgICAgICAgICAgICAgTERGTEFHUz0kX2xkZmxhZ3NdKQogICAgZmkKICAgIF0sCiAgICBbCiAgICAgIGRubCB6bGliLmggd2FzIG5vdCBmb3VuZCwgcmVzdG9yZSB0aGUgZmxhZ3MKICAgICAgQ1BQRkxBR1M9JF9jcHBmbGFncwogICAgICBMREZMQUdTPSRfbGRmbGFnc10KICAgICkKCiAgaWYgdGVzdCAiJEhBVkVfTElCWiIgPSAiMSIgJiYgdGVzdCAiJEhBVkVfWkxJQl9IIiAhPSAiMSIKICB0aGVuCiAgICBBQ19NU0dfV0FSTihbY29uZmlndXJlIGZvdW5kIG9ubHkgdGhlIGxpYnogbGliLCBub3QgdGhlIGhlYWRlciBmaWxlIV0pCiAgZWxpZiB0ZXN0ICIkSEFWRV9MSUJaIiAhPSAiMSIgJiYgdGVzdCAiJEhBVkVfWkxJQl9IIiA9ICIxIgogIHRoZW4KICAgIEFDX01TR19XQVJOKFtjb25maWd1cmUgZm91bmQgb25seSB0aGUgbGlieiBoZWFkZXIgZmlsZSwgbm90IHRoZSBsaWIhXSkKICBlbGlmIHRlc3QgIiRIQVZFX0xJQloiID0gIjEiICYmIHRlc3QgIiRIQVZFX1pMSUJfSCIgPSAiMSIKICB0aGVuCiAgICBkbmwgYm90aCBoZWFkZXIgYW5kIGxpYiB3ZXJlIGZvdW5kIQogICAgQUNfU1VCU1QoSEFWRV9MSUJaKQogICAgQUNfREVGSU5FKEhBVkVfWkxJQl9ILCAxLCBbaWYgeW91IGhhdmUgdGhlIHpsaWIuaCBoZWFkZXIgZmlsZV0pCiAgICBBQ19ERUZJTkUoSEFWRV9MSUJaLCAxLCBbaWYgemxpYiBpcyBhdmFpbGFibGVdKQoKICAgIExJQlM9IiRMSUJTIC1seiIKCiAgICBkbmwgcmVwbGFjZSAnSEFWRV9MSUJaJyBpbiB0aGUgYXV0b21ha2UgbWFrZWZpbGUuYW1zCiAgICBBTUZJWExJQj0iMSIKICAgIEFDX01TR19OT1RJQ0UoW2ZvdW5kIGJvdGggbGlieiBhbmQgbGliei5oIGhlYWRlcl0pCiAgICBjdXJsX3psaWJfbXNnPSJlbmFibGVkIgogIGZpCmZpCgpkbmwgc2V0IHZhcmlhYmxlIGZvciB1c2UgaW4gYXV0b21ha2VmaWxlKHMpCkFNX0NPTkRJVElPTkFMKEhBVkVfTElCWiwgdGVzdCB4IiRBTUZJWExJQiIgPSB4MSkKCkFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCB3aXRoIGxpYmlkbl0pCkFDX0FSR19XSVRIKGxpYmlkbiwKQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1saWJpZG49UEFUSF0sW0VuYWJsZSBsaWJpZG4gdXNhZ2VdKQpBQ19IRUxQX1NUUklORyhbLS13aXRob3V0LWxpYmlkbl0sW0Rpc2FibGUgbGliaWRuIHVzYWdlXSksCiAgW0xJQklETj0iJHdpdGh2YWwiXSkKCmNhc2UgIiRMSUJJRE4iIGluCiAgbm8pCiAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQogICAgICAgOzsKICAqKSAgIEFDX01TR19SRVNVTFQoeWVzKQoKICAgICAgIGlkbj0iIgogICAgICAgZG5sIGlmIHRoZXJlIGlzIGEgZ2l2ZW4gcGF0aCwgY2hlY2sgdGhhdCBGSVJTVAogICAgICAgaWYgdGVzdCAtbiAiJExJQklETiI7IHRoZW4KICAgICAgICAgaWYgdGVzdCAieCRMSUJJRE4iICE9ICJ4eWVzIjsgdGhlbgogICAgICAgICAgICBBQ19NU0dfV0FSTihbbW9vIG1vbyAkTElCSUROXSkKICAgICAgICAgICAgb2xkTERGTEFHUz0kTERGTEFHUwogICAgICAgICAgICBvbGRDUFBGTEFHUz0kQ1BQRkxBR1MKICAgICAgICAgICAgTERGTEFHUz0iJExERkxBR1MgLUwkTElCSUROL2xpYiIKICAgICAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSRMSUJJRE4vaW5jbHVkZSIKICAgICAgICAgICAgaWRuPSJ5ZXMiCiAgICAgICAgICAgIEFDX0NIRUNLX0xJQihpZG4sIGlkbmFfdG9fYXNjaWlfNGksICwKICAgICAgICAgICAgICAgICAgICAgICAgIGlkbj0iIgogICAgICAgICAgICAgICAgICAgICAgICAgTERGTEFHUz0kb2xkTERGTEFHUwogICAgICAgICAgICAgICAgICAgICAgICAgQ1BQRkxBR1M9JG9sZENQUEZMQUdTKQogICAgICAgICBmaQogICAgICAgZmkKCiAgICAgICBpZiB0ZXN0ICJ4JGlkbiIgIT0gInh5ZXMiOyB0aGVuCiAgICAgICAgICBkbmwgY2hlY2sgd2l0aCBkZWZhdWx0IHBhdGhzCiAgICAgICAgICBpZG49InllcyIKICAgICAgICAgIEFDX0NIRUNLX0xJQihpZG4sIGlkbmFfdG9fYXNjaWlfbHosICwKICAgICAgICAgICAgICAgICAgICAgICBpZG49IiIpCiAgICAgICBmaQoKICAgICAgIGlmIHRlc3QgIngkaWRuIiA9ICJ4eWVzIjsgdGhlbgogICAgICAgICBjdXJsX2lkbl9tc2c9ImVuYWJsZWQiCiAgICAgICAgIEFDX1NVQlNUKElETl9FTkFCTEVELCBbMV0pCiAgICAgICAgIGRubCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgbGliaWRuIGhhdmUgZGlmZmVyZW50IHNldHVwcyBvZiB0aGVzZToKICAgICAgICAgQUNfQ0hFQ0tfRlVOQ1MoIGlkbl9mcmVlIGlkbmFfc3RyZXJyb3IgdGxkX3N0cmVycm9yKQogICAgICAgICBBQ19DSEVDS19IRUFERVJTKCBpZG4tZnJlZS5oIHRsZC5oICkKICAgICAgIGZpCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICA7OyAKZXNhYwoKZG5sIERlZmF1bHQgaXMgdG8gdHJ5IHRoZSB0aHJlYWQtc2FmZSB2ZXJzaW9ucyBvZiBhIGZldyBmdW5jdGlvbnMKT1BUX1RIUkVBRD1vbgoKZG5sIGRldGVjdCBBSVggNC4zIG9yIGxhdGVyCmRubCBzZWUgZnVsbCBkb2NzIG9uIHRoaXMgcmVhc29uaW5nIGluIHRoZSBsaWIvaG9zdGlwLmMgc291cmNlIGZpbGUKQUNfTVNHX0NIRUNLSU5HKFtBSVggNC4zIG9yIGxhdGVyXSkKQUNfUFJFUFJPQ19JRkVMU0UoWwojaWYgZGVmaW5lZChfQUlYKSAmJiBkZWZpbmVkKF9BSVg0MykKcHJpbnRmKCJqdXN0IGZpbmUiKTsKI2Vsc2UKI2Vycm9yICJ0aGlzIGlzIG5vdCBBSVggNC4zIG9yIGxhdGVyIgojZW5kaWYKXSwKIFsgQUNfTVNHX1JFU1VMVChbeWVzXSkKICAgUkVDRU5UQUlYPXllcwogICBPUFRfVEhSRUFEPW9mZiBdLAogWyBBQ19NU0dfUkVTVUxUKFtub10pIF0KKQoKQUNfQVJHX0VOQUJMRSh0aHJlYWQsZG5sCkFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtdGhyZWFkXSxbZG9uJ3QgbG9vayBmb3IgdGhyZWFkLXNhZmUgZnVuY3Rpb25zXSkKQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXRocmVhZF0sW2xvb2sgZm9yIHRocmVhZC1zYWZlIGZ1bmN0aW9uc10pLApbIGNhc2UgIiRlbmFibGV2YWwiIGluCiAgbm8pCiAgICBPUFRfVEhSRUFEPW9mZgogICAgQUNfTVNHX1dBUk4obGliY3VybCB3aWxsIG5vdCBnZXQgYnVpbHQgdXNpbmcgdGhyZWFkLXNhZmUgZnVuY3Rpb25zKQogICAgOzsKICAqKQogICAgOzsKICBlc2FjCl0KKQoKaWYgdGVzdCBYIiRPUFRfVEhSRUFEIiA9IFhvZmYKdGhlbgogIEFDX0RFRklORShESVNBQkxFRF9USFJFQURTQUZFLCAxLCBcClNldCB0byBleHBsaWNpdGx5IHNwZWNpZnkgd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhyZWFkLXNhZmUgZnVuY3Rpb25zKQplbHNlCiAgaWYgdGVzdCAiJGlwdjYiICE9ICJ5ZXMiOyB0aGVuCiAgICBkbmwgZGlnIGFyb3VuZCBmb3IgZ2V0aG9zdGJ5bmFtZV9yKCkKICAgIENVUkxfQ0hFQ0tfR0VUSE9TVEJZTkFNRV9SKCkKCiAgICBkbmwgZGlnIGFyb3VuZCBmb3IgZ2V0aG9zdGJ5YWRkcl9yKCkKICAgIGRubCBDVVJMX0NIRUNLX0dFVEhPU1RCWUFERFJfUigpCiAgZmkKCiAgZG5sIHBva2UgYXJvdW5kIGZvciBpbmV0X250b2FfcigpCiAgQ1VSTF9DSEVDS19JTkVUX05UT0FfUigpCgogIGRubCBpcyB0aGVyZSBhIGxvY2FsdGltZV9yKCkKICBDVVJMX0NIRUNLX0xPQ0FMVElNRV9SKCkKCiAgZG5sIGlzIHRoZXJlIGEgc3RyZXJyb3JfcigpCiAgQ1VSTF9DSEVDS19TVFJFUlJPUl9SKCkKCiAgQUNfQ0hFQ0tfRlVOQ1MoIGdtdGltZV9yICkKZmkKCmRubCBmb3IgcmVjZW50IEFJWCB2ZXJzaW9ucywgd2Ugc2tpcCBhbGwgdGhlIHRocmVhZC1zYWZlIGNoZWNrcyBhYm92ZSBzaW5jZQpkbmwgdGhleSBjbGFpbSBhIHRocmVhZC1zYWZlIGxpYmMgdXNpbmcgdGhlIHN0YW5kYXJkIEFQSS4gQnV0IHRoZXJlIGFyZQpkbmwgc29tZSBmdW5jdGlvbnMgc3RpbGwgbm90IHRocmVhZC1zYWZlLiBDaGVjayBmb3IgdGhlc2UhCgpkbmwgTGV0J3MgaG9wZSB0aGlzIHNwbGl0IFVSTCByZW1haW5zIHdvcmtpbmc6CmRubCBodHRwOi8vcHVibGlibi5ib3VsZGVyLmlibS5jb20vZG9jX2xpbmsvZW5fVVMvYV9kb2NfbGliL2FpeHByZ2dkLyBcCmRubCBnZW5wcm9nYy90aHJlYWRfcXVpY2tfcmVmLmh0bQoKaWYgdGVzdCAieCRSRUNFTlRBSVgiID0gInh5ZXMiOyB0aGVuCgogIEFDX0RFRklORShfVEhSRUFEX1NBRkUsIDEsIFtkZWZpbmUgdGhpcyBpZiB5b3UgbmVlZCBpdCB0byBjb21waWxlIHRocmVhZC1zYWZlIGNvZGVdKQoKICBkbmwgY2hlY2sgaWYgdGhpcyBpcyB0aGUgSU1CIHhsYyBjb21waWxlcgogIGRubCBEZXRhaWxzIHRoYW5rcyB0byA9PiBodHRwOi8vcHJlZGVmLnNvdXJjZWZvcmdlLm5ldC8KICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIHRoaXMgaXMgdGhlIHhsYyBjb21waWxlcl0pCiAgQUNfRUdSRVBfQ1BQKFteX194bENfX10sIFtfX3hsQ19fXSwKICAgICAgICAgZG5sIGFjdGlvbiBpZiB0aGUgdGV4dCBpcyBmb3VuZCwgdGhpcyBpdCBoYXMgbm90IGJlZW4gcmVwbGFjZWQgYnkgdGhlCiAgICAgICAgIGRubCBjcHAKICAgICAgICAgWExDPSJubyIKICAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKSwKICAgICAgICAgZG5sIHRoZSB0ZXh0IHdhcyBub3QgZm91bmQsIGl0IHdhcyByZXBsYWNlZCBieSB0aGUgY3BwCiAgICAgICAgIFhMQz0ieWVzIgogICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQogICAgICAgICBDRkxBR1M9IiRDRkxBR1MgLXF0aHJlYWRlZCIKICAgICAgICkKCgogIGRubCBpcyB0aGVyZSBhIGxvY2FsdGltZV9yKCkKICBDVVJMX0NIRUNLX0xPQ0FMVElNRV9SKCkKCiAgZG5sIGlzIHRoZXJlIGEgc3RyZXJyb3JfcigpCiAgQ1VSTF9DSEVDS19TVFJFUlJPUl9SKCkKCiAgQUNfQ0hFQ0tfRlVOQ1MoIGdtdGltZV9yICkKZmkKCgpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkbmwgQmFjayB0byAibm9ybWFsIiBjb25maWd1cmluZwpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKZG5sIENoZWNrcyBmb3IgaGVhZGVyIGZpbGVzLgpBQ19IRUFERVJfU1REQwoKZG5sIEZpcnN0IGNoZWNrIGZvciB0aGUgdmVyeSBtb3N0IGJhc2ljIGhlYWRlcnMuIFRoZW4gd2UgY2FuIHVzZSB0aGVzZQpkbmwgb25lcyBhcyBkZWZhdWx0LWhlYWRlcnMgd2hlbiBjaGVja2luZyBmb3IgdGhlIHJlc3QhCkFDX0NIRUNLX0hFQURFUlMoCiAgICAgICAgc3lzL3R5cGVzLmggXAogICAgICAgIHN5cy90aW1lLmggXAogICAgICAgIHN5cy9zZWxlY3QuaCBcCiAgICAgICAgc3lzL3NvY2tldC5oIFwKICAgICAgICBzeXMvaW9jdGwuaCBcCiAgICAgICAgYXNzZXJ0LmggXAogICAgICAgIHVuaXN0ZC5oIFwKICAgICAgICBtYWxsb2MuaCBcCiAgICAgICAgc3RkbGliLmggXAogICAgICAgIGxpbWl0cy5oIFwKICAgICAgICBhcnBhL2luZXQuaCBcCiAgICAgICAgbmV0L2lmLmggXAogICAgICAgIG5ldGluZXQvaW4uaCBcCiAgICAgICAgbmV0aW5ldC90Y3AuaCBcCiAgICAgICAgbmV0ZGIuaCBcCiAgICAgICAgc3lzL3NvY2tpby5oIFwKICAgICAgICBzeXMvc3RhdC5oIFwKICAgICAgICBzeXMvcGFyYW0uaCBcCiAgICAgICAgdGVybWlvcy5oIFwKICAgICAgICB0ZXJtaW8uaCBcCiAgICAgICAgc2d0dHkuaCBcCiAgICAgICAgZmNudGwuaCBcCiAgICAgICAgZGxmY24uaCBcCiAgICAgICAgYWxsb2NhLmggXAogICAgICAgIHdpbnNvY2suaCBcCiAgICAgICAgd2luc29jazIuaCBcCiAgICAgICAgdGltZS5oIFwKICAgICAgICBpby5oIFwKICAgICAgICBwd2QuaCBcCiAgICAgICAgdXRpbWUuaCBcCiAgICAgICAgc3lzL3V0aW1lLmggXAogICAgICAgIHN5cy9wb2xsLmggXAogICAgICAgIHN5cy9yZXNvdXJjZS5oIFwKICAgICAgICBsaWJnZW4uaCBcCiAgICAgICAgbG9jYWxlLmggXAogICAgICAgIGVycm5vLmggXAogICAgICAgIHNldGptcC5oLApkbmwgdG8gZG8gaWYgbm90IGZvdW5kCltdLApkbmwgdG8gZG8gaWYgZm91bmQKW10sCmRubCBkZWZhdWx0IGluY2x1ZGVzClsKI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19TRUxFQ1RfSAojaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgojaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCl0KKQoKZG5sIENoZWNrcyBmb3IgdHlwZWRlZnMsIHN0cnVjdHVyZXMsIGFuZCBjb21waWxlciBjaGFyYWN0ZXJpc3RpY3MuCkFDX0NfQ09OU1QKQUNfVFlQRV9TSVpFX1QKQUNfSEVBREVSX1RJTUUKCkFDX0NIRUNLX1NJWkVPRihjdXJsX29mZl90LCAsWwojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgIiRzcmNkaXIvaW5jbHVkZS9jdXJsL2N1cmwuaCIKXSkKQUNfQ0hFQ0tfU0laRU9GKHNpemVfdCkKQUNfQ0hFQ0tfU0laRU9GKGxvbmcpCkFDX0NIRUNLX1NJWkVPRih0aW1lX3QpCgpBQ19DSEVDS19UWVBFKGxvbmcgbG9uZywKICAgW0FDX0RFRklORShIQVZFX0xPTkdMT05HLCAxLCBbaWYgeW91ciBjb21waWxlciBzdXBwb3J0cyBsb25nIGxvbmddKV0KICAgbG9uZ2xvbmc9InllcyIgIAopCgppZiB0ZXN0ICJ4eWVzIiA9ICJ4JGxvbmdsb25nIjsgdGhlbgogIEFDX01TR19DSEVDS0lORyhbaWYgbnVtYmVyTEwgd29ya3NdKQogIEFDX0NPTVBJTEVfSUZFTFNFKFtsb25nIGxvbmcgdmFsID0gMTAwMExMO10sCiAgIFtBQ19ERUZJTkUoSEFWRV9MTCwgMSwgW2lmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgTExdKV0KICAgQUNfTVNHX1JFU1VMVCh5ZXMpLAogICBBQ19NU0dfUkVTVUxUKG5vKQogICkKZmkKCgojIGNoZWNrIGZvciBzc2l6ZV90CkFDX0NIRUNLX1RZUEUoc3NpemVfdCwgLAogICBBQ19ERUZJTkUoc3NpemVfdCwgaW50LCBbdGhlIHNpZ25lZCB2ZXJzaW9uIG9mIHNpemVfdF0pKQoKVFlQRV9TT0NLTEVOX1QKVFlQRV9JTl9BRERSX1QKClRZUEVfU09DS0FERFJfU1RPUkFHRQoKQUNfRlVOQ19TRUxFQ1RfQVJHVFlQRVMKCmRubCBDaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLgpkbmwgQUNfUFJPR19HQ0NfVFJBRElUSU9OQUwKQUNfVFlQRV9TSUdOQUwKZG5sIEFDX0ZVTkNfVlBSSU5URgpBQ19DSEVDS19GVU5DUyggc3RydG9sbCBcCiAgICAgICAgICAgICAgICBzb2NrZXQgXAogICAgICAgICAgICAgICAgc2VsZWN0IFwKICAgICAgICAgICAgICAgIHN0cmR1cCBcCiAgICAgICAgICAgICAgICBzdHJzdHIgXAogICAgICAgICAgICAgICAgc3RydG9rX3IgXAogICAgICAgICAgICAgICAgdW5hbWUgXAogICAgICAgICAgICAgICAgc3RyY2FzZWNtcCBcCiAgICAgICAgICAgICAgICBzdHJpY21wIFwKICAgICAgICAgICAgICAgIHN0cmNtcGkgXAogICAgICAgICAgICAgICAgZ2V0aG9zdGJ5YWRkciBcCiAgICAgICAgICAgICAgICBnZXR0aW1lb2ZkYXkgXAogICAgICAgICAgICAgICAgaW5ldF9hZGRyIFwKICAgICAgICAgICAgICAgIGluZXRfbnRvYSBcCiAgICAgICAgICAgICAgICBpbmV0X3B0b24gXAogICAgICAgICAgICAgICAgcGVycm9yIFwKICAgICAgICAgICAgICAgIGNsb3Nlc29ja2V0IFwKICAgICAgICAgICAgICAgIHNpZ2ludGVycnVwdCBcCiAgICAgICAgICAgICAgICBzaWdhY3Rpb24gXAogICAgICAgICAgICAgICAgc2lnbmFsIFwKICAgICAgICAgICAgICAgIGdldHBhc3NfciBcCiAgICAgICAgICAgICAgICBzdHJsY2F0IFwKICAgICAgICAgICAgICAgIGdldHB3dWlkIFwKICAgICAgICAgICAgICAgIGdldGV1aWQgXAogICAgICAgICAgICAgICAgZGxvcGVuIFwKICAgICAgICAgICAgICAgIHV0aW1lIFwKICAgICAgICAgICAgICAgIHNpZ3NldGptcCBcCiAgICAgICAgICAgICAgICBiYXNlbmFtZSBcCiAgICAgICAgICAgICAgICBzZXRsb2NhbGUgXAogICAgICAgICAgICAgICAgZnRydW5jYXRlIFwKICAgICAgICAgICAgICAgIHBpcGUgXAogICAgICAgICAgICAgICAgcG9sbCBcCiAgICAgICAgICAgICAgICBnZXRybGltaXQgXAogICAgICAgICAgICAgICAgc2V0cmxpbWl0LApkbmwgaWYgZm91bmQKW10sCmRubCBpZiBub3QgZm91bmQsICRhY19mdW5jIGlzIHRoZSBuYW1lIHdlIGNoZWNrIGZvcgogIGZ1bmM9IiRhY19mdW5jIgogIEFDX01TR19DSEVDS0lORyhbZGVlcGVyIGZvciAkZnVuY10pCiAgQUNfVFJZX0xJTksoIFtdLAogICAgICAgICAgICAgICBbICRmdW5jICgpO10sCiAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzISkKICAgICAgICAgICAgICAgZXZhbCAiYWNfY3ZfZnVuY18kZnVuYz15ZXMiCiAgICAgICAgICAgICAgIGRlZj1gZWNobyAiSEFWRV8kZnVuYyIgfCB0ciAnYS16JyAnQS1aJ2AKICAgICAgICAgICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKCRkZWYsIDEsIFtJZiB5b3UgaGF2ZSAkZnVuY10pLAogICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKGJ1dCBzdGlsbCBubykKICAgICAgICAgICAgICAgKQoKKQoKZG5sIEZvciBzb21lIHJlYXNvbiwgdGhlIGNoZWNrIGFib3ZlIGRvZXNuJ3QgcHJvcGVybHkgZGV0ZWN0IHNlbGVjdCgpIHdpdGgKZG5sIE1zeXMvTWluZ3cKaWYgdGVzdCAiJGFjX2N2X2Z1bmNfc2VsZWN0IiAhPSAieWVzIjsgdGhlbgogIEFDX01TR19DSEVDS0lORyhbZm9yIHNlbGVjdCBpbiB3czJfMzJdKQogIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8d2luc29jazIuaD5dLAogICAgICAgICAgICAgICBbc2VsZWN0KDAsKGZkX3NldCAqKU5VTEwsKGZkX3NldCAqKU5VTEwsKGZkX3NldCAqKU5VTEwsKHN0cnVjdCB0aW1ldmFsICopTlVMTCk7XSwKICAgICAgICAgICAgICAgWyBkbmwgd29ya2VkIQogICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQogICAgICAgICAgICAgICBIQVZFX1NFTEVDVD0iMSIKICAgICAgICAgICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKEhBVkVfU0VMRUNULDEpXSwKICAgICAgICAgICAgICAgW0FDX01TR19FUlJPUihZb3UgY2FuJ3QgY29tcGlsZSB3aXRob3V0IGEgc2VsZWN0KV0KICAgICAgICAgICAgICkKZmkKCmRubCBzaWdzZXRqbXAoKSBtaWdodCBiZSBhIG1hY3JvIGFuZCBubyBmdW5jdGlvbiBzbyBpZiBpdCBpc24ndCBmb3VuZCBhbHJlYWR5CmRubCB3ZSBtYWtlIGFuIGV4dHJhIGNoZWNrIGhlcmUhCmlmIHRlc3QgIiRhY19jdl9mdW5jX3NpZ3NldGptcCIgIT0gInllcyI7IHRoZW4KICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzaWdzZXRqbXAgZGVmaW5lZCBhcyBtYWNyb10pCiAgQUNfVFJZX0xJTksoIFsjaW5jbHVkZSA8c2V0am1wLmg+XSwKICAgICAgICAgICAgICAgW3NpZ2ptcF9idWYgam1wZW52OwogICAgICAgICAgICAgICAgc2lnc2V0am1wKGptcGVudiwgMSk7XSwKICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICAgICAgICAgIEFDX0RFRklORShIQVZFX1NJR1NFVEpNUCwgMSwgW0lmIHlvdSBoYXZlIHNpZ3NldGptcF0pLAogICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQogICAgICAgICAgICAgICApCmZpCgpBQ19DSEVDS19ERUNMKGJhc2VuYW1lLCAsCiAgICAgICAgICAgICAgQUNfREVGSU5FKE5FRURfQkFTRU5BTUVfUFJPVE8sIDEsIFtJZiB5b3UgbGFjayBhIGZpbmUgYmFzZW5hbWUoKSBwcm90b3R5cGVdKSwKI2lmZGVmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZW5kaWYKI2lmZGVmIEhBVkVfTElCR0VOX0gKI2luY2x1ZGUgPGxpYmdlbi5oPgojZW5kaWYKKQoKQUNfTVNHX0NIRUNLSU5HKFtpZiB3ZSBhcmUgTWFjIE9TIFggKHRvIGRpc2FibGUgcG9sbCldKQpkaXNhYmxlX3BvbGw9bm8KY2FzZSAkaG9zdCBpbgogICotKi1kYXJ3aW4qKQogICAgZGlzYWJsZV9wb2xsPSJ5ZXMiOwogICAgOzsKICAqKQogICAgOzsKZXNhYwpBQ19NU0dfUkVTVUxUKCRkaXNhYmxlX3BvbGwpCgppZiB0ZXN0ICIkZGlzYWJsZV9wb2xsIiA9ICJubyI7IHRoZW4KCiAgZG5sIHBvbGwoKSBtaWdodCBiZSBiYWRseSBlbXVsYXRlZCwgYXMgaW4gTWFjIE9TIFggMTAuMyAoYW5kIG90aGVyIEJTRHM/KSBhbmQKICBkbmwgdG8gZmluZCBvdXQgd2UgbWFrZSBhbiBleHRyYSBjaGVjayBoZXJlIQogIGlmIHRlc3QgIiRhY19jdl9mdW5jX3BvbGwiID0gInllcyI7IHRoZW4KICAgIEFDX01TR19DSEVDS0lORyhbaWYgcG9sbCB3b3JrcyB3aXRoIE5VTEwgaW5wdXRzXSkKICAgIEFDX1JVTl9JRkVMU0UoWwojaWZkZWYgSEFWRV9TWVNfUE9MTF9ICiNpbmNsdWRlIDxzeXMvcG9sbC5oPgojZW5kaWYKCiAgaW50IG1haW4odm9pZCkKICB7CiAgICAvKiBtYWtlIHRoaXMgcmV0dXJuIDAgPT0gdGltZW91dCBzaW5jZSB0aGVyZSdzIG5vdGhpbmcgdG8gcmVhZCBmcm9tICovCiAgICByZXR1cm4gcG9sbCgodm9pZCAqKTAsIDAsIDEwIC8qbXMqLyk7CiAgfQpdLAogICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICBBQ19ERUZJTkUoSEFWRV9QT0xMX0ZJTkUsIDEsIFtJZiB5b3UgaGF2ZSBhIGZpbmUgcG9sbF0pLAogICAgQUNfTVNHX1JFU1VMVChubyksCiAgICBBQ19NU0dfUkVTVUxUKGNyb3NzLWNvbXBpbGluZyBhc3N1bWVzIHllcykKICAgIEFDX0RFRklORShIQVZFX1BPTExfRklORSwgMSwgW0lmIHlvdSBoYXZlIGEgZmluZSBwb2xsXSkKICAgICkgZG5sIGVuZCBvZiBBQ19SVU5fSUZFTFNFCiAgZmkgZG5sIHBvbGwoKSB3YXMgZm91bmQKZmkgZG5sIHBvbGwoKS1jaGVjayBpcyBub3QgZGlzYWJsZWQKCgpBQ19QQVRIX1BST0coIFBFUkwsIHBlcmwsICwgCiAgJFBBVEg6L3Vzci9sb2NhbC9iaW4vcGVybDovdXNyL2Jpbi86L3Vzci9sb2NhbC9iaW4gKQpBQ19TVUJTVChQRVJMKQoKQUNfUEFUSF9QUk9HUyggTlJPRkYsIGducm9mZiBucm9mZiwgLCAKICAkUEFUSDovdXNyL2Jpbi86L3Vzci9sb2NhbC9iaW4gKQpBQ19TVUJTVChOUk9GRikKCmlmIHRlc3QgLW4gIiROUk9GRiI7IHRoZW4KICBkbmwgb25seSBjaGVjayBmb3IgbnJvZmYgb3B0aW9ucyBpZiBhbiBucm9mZiBjb21tYW5kIHdhcyBmb3VuZAoKICBBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byB1c2UgKm5yb2ZmIHRvIGdldCBwbGFpbiB0ZXh0IGZyb20gbWFuIHBhZ2VzXSkKICBNQU5PUFQ9Ii1tYW4iCiAgbWFuY2hlY2s9YGVjaG8gZm9vIHwgJE5ST0ZGICRNQU5PUFQgMj4vZGV2L251bGxgCiAgaWYgdGVzdCAteiAiJG1hbmNoZWNrIjsgdGhlbgogICAgTUFOT1BUPSItbWFuZG9jIgogICBtYW5jaGVjaz1gZWNobyBmb28gfCAkTlJPRkYgJE1BTk9QVCAyPi9kZXYvbnVsbGAKICAgIGlmIHRlc3QgLXogIiRtYW5jaGVjayI7IHRoZW4KICAgICAgTUFOT1BUPSIiCiAgICAgIEFDX01TR19SRVNVTFQoW2ZhaWxlZF0pCiAgICAgIEFDX01TR19XQVJOKFtmb3VuZCBubyAqbnJvZmYgb3B0aW9uIHRvIGdldCBwbGFpbnRleHQgZnJvbSBtYW4gcGFnZXNdKQogICAgZWxzZQogICAgICBBQ19NU0dfUkVTVUxUKFskTUFOT1BUXSkKICAgIGZpCiAgZWxzZQogICAgQUNfTVNHX1JFU1VMVChbJE1BTk9QVF0pCiAgZmkKICBBQ19TVUJTVChNQU5PUFQpCmZpCgppZiB0ZXN0IC16ICIkTUFOT1BUIgp0aGVuCiAgZG5sIGlmIG5vIG5yb2ZmIHRvb2wgd2FzIGZvdW5kLCBvciBubyBvcHRpb24gdGhhdCBjb3VsZCBjb252ZXJ0IG1hbiBwYWdlcwogIGRubCB3YXMgZm91bmQsIHRoZW4gZGlzYWJsZSB0aGUgYnVpbHQtaW4gbWFudWFsIHN0dWZmCiAgQUNfTVNHX1dBUk4oW2Rpc2FibGluZyBidWlsdC1pbiBtYW51YWxdKQogIFVTRV9NQU5VQUw9Im5vIjsKZmkKCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRubCBJZiB0aGUgbWFudWFsIHZhcmlhYmxlIHN0aWxsIGlzIHNldCwgdGhlbiB3ZSBnbyB3aXRoIHByb3ZpZGluZyBhIGJ1aWx0LWluCmRubCBtYW51YWwKCmlmIHRlc3QgIiRVU0VfTUFOVUFMIiA9ICIxIjsgdGhlbgogIEFDX0RFRklORShVU0VfTUFOVUFMLCAxLCBbSWYgeW91IHdhbnQgdG8gYnVpbGQgY3VybCB3aXRoIHRoZSBidWlsdC1pbiBtYW51YWxdKQogIGN1cmxfbWFudWFsX21zZz0iZW5hYmxlZCIKZmkKCmRubCBzZXQgdmFyaWFibGUgZm9yIHVzZSBpbiBhdXRvbWFrZWZpbGUocykKQU1fQ09ORElUSU9OQUwoVVNFX01BTlVBTCwgdGVzdCB4IiRVU0VfTUFOVUFMIiA9IHgxKQoKQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBhcmVzXSkKQUNfQVJHX0VOQUJMRShhcmVzLApBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtYXJlcz1QQVRIXSxbRW5hYmxlIGFyZXMgZm9yIG5hbWUgbG9va3Vwc10pCkFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtYXJlc10sW0Rpc2FibGUgYXJlcyBmb3IgbmFtZSBsb29rdXBzXSksClsgY2FzZSAiJGVuYWJsZXZhbCIgaW4KICBubykKICAgICAgIEFDX01TR19SRVNVTFQobm8pCiAgICAgICA7OwogICopICAgQUNfTVNHX1JFU1VMVCh5ZXMpCgogICAgICAgaWYgdGVzdCAieCRJUFY2X0VOQUJMRUQiID0gIngxIjsgdGhlbgogICAgICAgICBBQ19NU0dfRVJST1IoW2FyZXMgZG9lc24ndCB3b3JrIHdpdGggaXB2NiwgZGlzYWJsZSBpcHY2IHRvIHVzZSBhcmVzXSkKICAgICAgIGZpCgogICAgICAgQUNfREVGSU5FKFVTRV9BUkVTLCAxLCBbRGVmaW5lIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBhcmVzIHN1cHBvcnRdKQogICAgICAgZG5sIHN1YnN0aXR1dGUgSEFWRV9BUkVTIGZvciBjdXJsLWNvbmZpZyBhbmQgc2ltaWxhcgogICAgICAgSEFWRV9BUkVTPSIxIgogICAgICAgQUNfU1VCU1QoSEFWRV9BUkVTKQogICAgICAgY3VybF9hcmVzX21zZz0iZW5hYmxlZCIKCiAgICAgICBMSUJTPSIkTElCUyAtbGNhcmVzIgoKICAgICAgIGRubCBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZGVmYXVsdCB0byBpbmNsdWRlcy9saWIgaW4gc3JjZGlyL2FyZXMKICAgICAgIGRubCBJZiBhIHZhbHVlIGlzIHNwZWNpZmllZCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGxpYnMgYXJlIGluICR2YWwvbGliCiAgICAgICBkbmwgYW5kIHRoZSBpbmNsdWRlcyBhcmUgaW4gJHZhbC9pbmNsdWRlLiBUaGlzIGlzIHRoZSBkZWZhdWx0IHNldHVwIGZvcgogICAgICAgZG5sIGFyZXMgc28gaXQgc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0uCiAgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZXZhbCIgPSAieHllcyIgOyB0aGVuCiAgICAgICAgIGlmIHRlc3QgLWQgIiRzcmNkaXIvYXJlcyI7IHRoZW4KICAgICAgICAgICAgYXJlc2VtYmVkZGVkPSJ5ZXMiCiAgICAgICAgICAgIEFDX0NPTkZJR19TVUJESVJTKGFyZXMpCiAgICAgICAgICAgIGFyZXNpbmM9YGNkICRzcmNkaXIvYXJlcyAmJiBwd2RgCiAgICAgICAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkYXJlc2luYyIKCiAgICAgICAgICAgIGRubCB0aGUgcHdkPSBiZWxvdyBjYW5ub3QgJ2NkJyBpbnRvIHRoZSBhcmVzIGRpciB0byBnZXQgdGhlIGZ1bGwKICAgICAgICAgICAgZG5sIHBhdGggdG8gaXQsIHNpbmNlIGl0IG1heSBub3QgZXhpc3QgeWV0IGlmIHdlIGJ1aWxkIG91dHNpZGUgb2YKICAgICAgICAgICAgZG5sIHRoZSBzb3VyY2UgdHJlZQogICAgICAgICAgICBwd2Q9YHB3ZGAKICAgICAgICAgICAgTERGTEFHUz0iJExERkxBR1MgLUwkcHdkL2FyZXMiCiAgICAgICAgIGZpCiAgICAgICBlbHNlCiAgICAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkZW5hYmxldmFsL2luY2x1ZGUiCiAgICAgICAgIExERkxBR1M9IiRMREZMQUdTIC1MJGVuYWJsZXZhbC9saWIiCiAgICAgICBmaQoKICAgICAgIGlmIHRlc3QgLXogIiRhcmVzZW1iZWRkZWQiOyB0aGVuCiAgICAgICAgIGRubCB2ZXJpZnkgdGhhdCBhIHN1ZmZpY2llbnQgYy1hcmVzIGlzIGhlcmUgaWYgd2UgaGF2ZSBwb2ludGVkIG9uZQogICAgICAgICBkbmwgb3V0IGFuZCBkb24ndCB1c2UgdGhlICJlbWJlZGRlZCIgYXJlcyBkaXIgKGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QKICAgICAgICAgZG5sIGNoZWNrIGl0IGJlY2F1c2UgaXQgbWlnaHQgbm90IGhhdmUgYmVlbiBidWlsdCB5ZXQpCiAgICAgICAgIEFDX01TR19DSEVDS0lORyhbdGhhdCBjLWFyZXMgaXMgZ29vZCBhbmQgcmVjZW50IGVub3VnaF0pCiAgICAgICAgIEFDX0xJTktfSUZFTFNFKCBbCiNpbmNsdWRlIDxhcmVzLmg+Ci8qIHByb3ZpZGUgYSBzZXQgb2YgZHVtbXkgZnVuY3Rpb25zIGluIGNhc2UgYy1hcmVzIHdhcyBidWlsdCB3aXRoIGRlYnVnICovCnZvaWQgY3VybF9kb2ZyZWUoKSB7IH0Kdm9pZCBjdXJsX3NjbG9zZSgpIHsgfQp2b2lkIGN1cmxfZG9tYWxsb2MoKSB7IH0KCmludCBtYWluKHZvaWQpCnsKICBhcmVzX2NoYW5uZWwgY2hhbm5lbDsKICBhcmVzX2NhbmNlbChjaGFubmVsKTsKICByZXR1cm4gMDsKfQpdLAogICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpLAogICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKICAgICAgICAgIEFDX01TR19FUlJPUihbYy1hcmVzIGxpYnJhcnkgZGVmZWN0aXZlIG9yIHRvbyBvbGRdKQogICAgICAgICAgKQogICAgICAgZmkKICAgICAgIDs7CiAgZXNhYyBdLAogICAgICAgQUNfTVNHX1JFU1VMVChubykKKQoKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkbmwgZGlzYWJsZSB2ZXJib3NlIHRleHQgc3RyaW5ncwpkbmwKQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSB2ZXJib3NlIHN0cmluZ3NdKQpBQ19BUkdfRU5BQkxFKHZlcmJvc2UsCkFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS12ZXJib3NlXSxbRW5hYmxlIHZlcmJvc2Ugc3RyaW5nc10pCkFDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtdmVyYm9zZV0sW0Rpc2FibGUgdmVyYm9zZSBzdHJpbmdzXSksClsgY2FzZSAiJGVuYWJsZXZhbCIgaW4KICBubykKICAgICAgIEFDX01TR19SRVNVTFQobm8pCiAgICAgICBBQ19ERUZJTkUoQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUywgMSwgW3RvIGRpc2FibGUgdmVyYm9zZSBzdHJpbmdzXSkKICAgICAgIEFDX1NVQlNUKENVUkxfRElTQUJMRV9WRVJCT1NFX1NUUklOR1MpCiAgICAgICBjdXJsX3ZlcmJvc2VfbXNnPSJubyIKICAgICAgIDs7CiAgKikgICBBQ19NU0dfUkVTVUxUKHllcykKICAgICAgIDs7CiAgZXNhYyBdLAogICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCikKCmRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZG5sIGVuYWJsZSBTU1BJIHN1cHBvcnQKZG5sCkFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgU1NQSSBzdXBwb3J0ICh3aW4zMiBidWlsZHMgb25seSldKQpBQ19BUkdfRU5BQkxFKHNzcGksCkFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zc3BpXSxbRW5hYmxlIFNTUEldKQpBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXNzcGldLFtEaXNhYmxlIFNTUEldKSwKWyBjYXNlICIkZW5hYmxldmFsIiBpbgogIHllcykKICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgICAgQUNfREVGSU5FKFVTRV9XSU5ET1dTX1NTUEksIDEsIFt0byBlbmFibGUgU1NQSSBzdXBwb3J0XSkKICAgICAgIEFDX1NVQlNUKFVTRV9XSU5ET1dTX1NTUEkpCiAgICAgICBMSUJTPSIkTElCUyAtbHNlY3VyMzIiCiAgICAgICBjdXJsX3NzcGlfbXNnPSJ5ZXMiCiAgICAgICA7OwogICopCiAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQogICAgICAgOzsKICBlc2FjIF0sCiAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQopCgpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRubCBsYW1lIG9wdGlvbiB0byBzd2l0Y2ggb24gZGVidWcgb3B0aW9ucwpkbmwKQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBkZWJ1ZyBvcHRpb25zXSkKQUNfQVJHX0VOQUJMRShkZWJ1ZywKQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWRlYnVnXSxbRW5hYmxlIHBlZGFudGljIGRlYnVnIG9wdGlvbnNdKQpBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWRlYnVnXSxbRGlzYWJsZSBkZWJ1ZyBvcHRpb25zXSksClsgY2FzZSAiJGVuYWJsZXZhbCIgaW4KICBubykKICAgICAgIEFDX01TR19SRVNVTFQobm8pCiAgICAgICA7OwogICopICAgQUNfTVNHX1JFU1VMVCh5ZXMpCgogICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRENVUkxERUJVRyIKICAgIENGTEFHUz0iJENGTEFHUyAtZyIKCiAgICBkbmwgc2V0IGNvbXBpbGVyICJkZWJ1ZyIgb3B0aW9ucyB0byBiZWNvbWUgbW9yZSBwaWNreSwgYW5kIHJlbW92ZQogICAgZG5sIG9wdGltaXplIG9wdGlvbnMgZnJvbSBDRkxBR1MKICAgIENVUkxfQ0NfREVCVUdfT1BUUwogICAgICAgOzsKICBlc2FjCiBdLAogICAgICAgQUNfTVNHX1JFU1VMVChubykKKQoKZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkbmwgZGlzYWJsZSBjcnlwdG9ncmFwaGljIGF1dGhlbnRpY2F0aW9uCmRubApBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIGNyeXB0b2dyYXBoaWMgYXV0aGVudGljYXRpb24gbWV0aG9kc10pCkFDX0FSR19FTkFCTEUoY3J5cHRvLWF1dGgsCkFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1jcnlwdG8tYXV0aF0sW0VuYWJsZSBjcnlwdG9ncmFwaGljIGF1dGhlbnRpY2F0aW9uXSkKQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1jcnlwdG8tYXV0aF0sW0Rpc2FibGUgY3J5cHRvZ3JhcGhpYyBhdXRoZW50aWNhdGlvbl0pLApbIGNhc2UgIiRlbmFibGV2YWwiIGluCiAgbm8pCiAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQogICAgICAgQUNfREVGSU5FKENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCwgMSwgW3RvIGRpc2FibGUgY3J5cHRvZ3JhcGhpYyBhdXRoZW50aWNhdGlvbl0pCiAgICAgICBBQ19TVUJTVChDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEgpCiAgICAgICA7OwogICopICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICA7OwogIGVzYWMgXSwKICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQopCgpkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRubCBkaXNhYmxlIGNvb2tpZXMgc3VwcG9ydApkbmwKQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBjb29raWVzXSkKQUNfQVJHX0VOQUJMRShjb29raWVzLApBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtY29va2llc10sW0VuYWJsZSBjb29raWVzIHN1cHBvcnRdKQpBQ19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWNvb2tpZXNdLFtEaXNhYmxlIGNvb2tpZXMgc3VwcG9ydF0pLApbIGNhc2UgIiRlbmFibGV2YWwiIGluCiAgbm8pCiAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQogICAgICAgQUNfREVGSU5FKENVUkxfRElTQUJMRV9DT09LSUVTLCAxLCBbdG8gZGlzYWJsZSBjb29raWVzIHN1cHBvcnRdKQogICAgICAgQUNfU1VCU1QoQ1VSTF9ESVNBQkxFX0NPT0tJRVMpCiAgICAgICA7OwogICopICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICA7OwogIGVzYWMgXSwKICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQopCgppZiB0ZXN0ICJ4JHdzMiIgPSAieHllcyI7IHRoZW4KCiAgZG5sIElmIHdzMl8zMiBpcyB3YW50ZWQsIG1ha2Ugc3VyZSBpdCBpcyB0aGUgX2xhc3RfIGxpYiBpbiBMSUJTIChtYWtlcwogIGRubCB0aGluZ3Mgd29yayB3aGVuIGJ1aWx0IHdpdGggYy1hcmVzKS4gQnV0IHdlIGNhbid0IGp1c3QgbW92ZSBpdCBsYXN0CiAgZG5sIHNpbmNlIHRoZW4gb3RoZXIgc3R1ZmYgKFNTTCkgd29uJ3QgYnVpbGQuIFNvIHdlIHNpbXBseSBhcHBlbmQgaXQgdG8gdGhlCiAgZG5sIGVuZC4KCiAgTElCUz0iJExJQlMgLWx3czJfMzIiCgpmaQoKQU1fQ09ORElUSU9OQUwoQ1JPU1NDT01QSUxJTkcsIHRlc3QgeCRjcm9zc19jb21waWxpbmcgPSB4eWVzKQoKQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZSBcCgkgICBkb2NzL01ha2VmaWxlIFwKICAgICAgICAgICBkb2NzL2V4YW1wbGVzL01ha2VmaWxlIFwKICAgICAgICAgICBkb2NzL2xpYmN1cmwvTWFrZWZpbGUgXAoJICAgaW5jbHVkZS9NYWtlZmlsZSBcCgkgICBpbmNsdWRlL2N1cmwvTWFrZWZpbGUgXAoJICAgc3JjL01ha2VmaWxlIFwKICAgICAgICAgICBsaWIvTWFrZWZpbGUgXAogICAgICAgICAgIHRlc3RzL01ha2VmaWxlIFwKICAgICAgICAgICB0ZXN0cy9kYXRhL01ha2VmaWxlIFwKICAgICAgICAgICB0ZXN0cy9zZXJ2ZXIvTWFrZWZpbGUgXAogICAgICAgICAgIHRlc3RzL2xpYnRlc3QvTWFrZWZpbGUgXAoJICAgcGFja2FnZXMvTWFrZWZpbGUgXAoJICAgcGFja2FnZXMvV2luMzIvTWFrZWZpbGUgXAoJICAgcGFja2FnZXMvV2luMzIvY3lnd2luL01ha2VmaWxlIFwKCSAgIHBhY2thZ2VzL0xpbnV4L01ha2VmaWxlIFwKCSAgIHBhY2thZ2VzL0xpbnV4L1JQTS9NYWtlZmlsZSBcCgkgICBwYWNrYWdlcy9MaW51eC9SUE0vY3VybC5zcGVjIFwKCSAgIHBhY2thZ2VzL0xpbnV4L1JQTS9jdXJsLXNzbC5zcGVjIFwKICAgICAgICAgICBwYWNrYWdlcy9Tb2xhcmlzL01ha2VmaWxlIFwKICAgICAgICAgICBwYWNrYWdlcy9ET1MvTWFrZWZpbGUgXAogICAgICAgICAgIHBhY2thZ2VzL0VQTS9jdXJsLmxpc3QgXAogICAgICAgICAgIHBhY2thZ2VzL0VQTS9NYWtlZmlsZSBcCiAgICAgICAgICAgcGFja2FnZXMvdm1zL01ha2VmaWxlIFwKICAgICAgICAgICBjdXJsLWNvbmZpZyBcCiAgICAgICAgICAgbGliY3VybC5wYwpdKQpBQ19PVVRQVVQKCkFDX01TR19OT1RJQ0UoW0NvbmZpZ3VyZWQgdG8gYnVpbGQgY3VybC9saWJjdXJsOgoKICBjdXJsIHZlcnNpb246ICAgICR7VkVSU0lPTn0KICBIb3N0IHNldHVwOiAgICAgICR7aG9zdH0KICBJbnN0YWxsIHByZWZpeDogICR7cHJlZml4fQogIENvbXBpbGVyOiAgICAgICAgJHtDQ30KICBTU0wgc3VwcG9ydDogICAgICR7Y3VybF9zc2xfbXNnfQogIHpsaWIgc3VwcG9ydDogICAgJHtjdXJsX3psaWJfbXNnfQogIGtyYjQgc3VwcG9ydDogICAgJHtjdXJsX2tyYjRfbXNnfQogIEdTU0FQSSBzdXBwb3J0OiAgJHtjdXJsX2dzc19tc2d9CiAgU1BORUdPIHN1cHBvcnQ6ICAke2N1cmxfc3BuZWdvX21zZ30KICBjLWFyZXMgc3VwcG9ydDogICR7Y3VybF9hcmVzX21zZ30KICBpcHY2IHN1cHBvcnQ6ICAgICR7Y3VybF9pcHY2X21zZ30KICBJRE4gc3VwcG9ydDogICAgICR7Y3VybF9pZG5fbXNnfQogIEJ1aWxkIGxpYmN1cmw6ICAgU2hhcmVkPSR7ZW5hYmxlX3NoYXJlZH0sIFN0YXRpYz0ke2VuYWJsZV9zdGF0aWN9IAogIEJ1aWx0LWluIG1hbnVhbDogJHtjdXJsX21hbnVhbF9tc2d9CiAgVmVyYm9zZSBlcnJvcnM6ICAke2N1cmxfdmVyYm9zZV9tc2d9CiAgU1NQSSBzdXBwb3J0OiAgICAke2N1cmxfc3NwaV9tc2d9CiAgY2EgY2VydCBwYXRoOiAgICAke2NhfQpdKQo=