# Name: gbp_permanent_links v0.11.669 # Last modified: 2008-01-27 # MD5: c3fab3ec1b096f7a0a8103499a3ebe18 # Custom permanent links rules # Author: Graeme Porteous # URL: http://rgbp.co.uk/projects/textpattern/gbp_permanent_links/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YToxMzp7czozOiJ1cmwiO3M6NzU6IiRIZWFkVVJMOiBodHRwOi8vcmdicC5jby51ay9zdm4v dHhwX3BsdWdpbnMvdHJ1bmsvZ2JwX3Blcm1hbmVudF9saW5rcy5waHAgJCI7czo0OiJkYXRl IjtzOjEwOiIyMDA4LTAxLTI3IjtzOjg6InJldmlzaW9uIjtzOjI3OiIkTGFzdENoYW5nZWRS ZXZpc2lvbjogNjY5ICQiO3M6NDoibmFtZSI7czoxOToiZ2JwX3Blcm1hbmVudF9saW5rcyI7 czo3OiJ2ZXJzaW9uIjtzOjg6IjAuMTEuNjY5IjtzOjY6ImF1dGhvciI7czoxNToiR3JhZW1l IFBvcnRlb3VzIjtzOjEwOiJhdXRob3JfdXJpIjtzOjU5OiJodHRwOi8vcmdicC5jby51ay9w cm9qZWN0cy90ZXh0cGF0dGVybi9nYnBfcGVybWFuZW50X2xpbmtzLyI7czoxMToiZGVzY3Jp cHRpb24iO3M6Mjg6IkN1c3RvbSBwZXJtYW5lbnQgbGlua3MgcnVsZXMiO3M6NDoidHlwZSI7 czoxOiIxIjtzOjQ6ImhlbHAiO3M6MTE5OiI8ZGl2IGlkPSJwZXJtbGlua19oZWxwIj4KCmgx KCN0b3ApLiBnYnBfcGVybWFuZW50X2xpbmtzLgoKUHJvdmlkZXMgY3VzdG9tLCB1c2VyIGRl ZmluZWQsIHBlcm1hbmVudCBsaW5rcyBydWxlcy4KCjwvZGl2PiI7czo0OiJjb2RlIjtzOjY0 NDc0OiIKLy8gQ29uc3RhbnRzCkBkZWZpbmUoJ2dicF9zYXZlJywgJ3NhdmUnKTsKQGRlZmlu ZSgnZ2JwX3Bvc3QnLCAncG9zdCcpOwpAZGVmaW5lKCdnYnBfc2VwYXJhdG9yJywgJyZ+Jn4m Jyk7CgovLyByZXF1aXJlX3BsdWdpbigpIHdpbGwgcmVzZXQgdGhlICR0eHBfY3VycmVudF9w bHVnaW4gZ2xvYmFsCmdsb2JhbCAkdHhwX2N1cnJlbnRfcGx1Z2luOwokZ2JwX2N1cnJlbnRf cGx1Z2luID0gJHR4cF9jdXJyZW50X3BsdWdpbjsKcmVxdWlyZV9wbHVnaW4oJ2dicF9hZG1p bl9saWJyYXJ5Jyk7CiR0eHBfY3VycmVudF9wbHVnaW4gPSAkZ2JwX2N1cnJlbnRfcGx1Z2lu OwoKY2xhc3MgUGVybWFuZW50TGlua3MgZXh0ZW5kcyBHQlBQbHVnaW4KewoJdmFyICRwcmVm ZXJlbmNlcyA9IGFycmF5KAoJCSdzaG93X3ByZWZpeCcgPT4gYXJyYXkoJ3ZhbHVlJyA9PiAw LCAndHlwZScgPT4gJ3llc25vcmFkaW8nKSwKCQknc2hvd19zdWZmaXgnID0+IGFycmF5KCd2 YWx1ZScgPT4gMCwgJ3R5cGUnID0+ICd5ZXNub3JhZGlvJyksCgkJJ29taXRfdHJhaWxpbmdf c2xhc2gnID0+IGFycmF5KCd2YWx1ZScgPT4gMCAsICd0eXBlJyA9PiAneWVzbm9yYWRpbycp LAoJCSdyZWRpcmVjdF9tdF9zdHlsZV9saW5rcycgPT4gYXJyYXkoJ3ZhbHVlJyA9PiAxICwg J3R5cGUnID0+ICd5ZXNub3JhZGlvJyksCgkJJ2NsZWFuX3BhZ2VfYXJjaGl2ZV9saW5rcycg PT4gYXJyYXkoJ3ZhbHVlJyA9PiAxICwgJ3R5cGUnID0+ICd5ZXNub3JhZGlvJyksCgkJJ2pv aW5fcHJldGV4dF90b19wYWdlbGlua3MnID0+IGFycmF5KCd2YWx1ZScgPT4gMSAsICd0eXBl JyA9PiAneWVzbm9yYWRpbycpLAoJCSdmb3JjZV9sb3dlcmNhc2VfdXJscycgPT4gYXJyYXko J3ZhbHVlJyA9PiAxICwgJ3R5cGUnID0+ICd5ZXNub3JhZGlvJyksCgkJJ2F1dG9tYXRpY2Fs bHlfYXBwZW5kX3RpdGxlJyA9PiBhcnJheSgndmFsdWUnID0+IDEgLCAndHlwZScgPT4gJ3ll c25vcmFkaW8nKSwKCQkncGVybWxpbmtfcmVkaXJlY3RfaHR0cF9zdGF0dXMnID0+IGFycmF5 KCd2YWx1ZScgPT4gJzMwMScgLCAndHlwZScgPT4gJ3RleHRfaW5wdXQnKSwKCQkndXJsX3Jl ZGlyZWN0X2h0dHBfc3RhdHVzJyA9PiBhcnJheSgndmFsdWUnID0+ICczMDInICwgJ3R5cGUn ID0+ICd0ZXh0X2lucHV0JyksCgkJJ2RlYnVnJyA9PiBhcnJheSgndmFsdWUnID0+IDAsICd0 eXBlJyA9PiAneWVzbm9yYWRpbycpLAoJKTsKCXZhciAkbWF0Y2hlZF9wZXJtbGluayA9IGFy cmF5KCk7Cgl2YXIgJHBhcnRpYWxfbWF0Y2hlcyA9IGFycmF5KCk7Cgl2YXIgJGNsZWF2ZXJf cGFydGlhbF9tYXRjaDsKCXZhciAkYnVmZmVyX2RlYnVnID0gYXJyYXkoKTsKCglmdW5jdGlv biBwcmVsb2FkICgpIHsKCQluZXcgUGVybWFuZW50TGlua3NMaXN0VGFiVmlldygnbGlzdCcs ICdsaXN0JywgJHRoaXMpOwoJCW5ldyBQZXJtYW5lbnRMaW5rc0J1aWxkVGFiVmlldygnYnVp bGQnLCAnYnVpbGQnLCAkdGhpcyk7CgkJbmV3IEdCUFByZWZlcmVuY2VUYWJWaWV3KCR0aGlz KTsKCX0KCglmdW5jdGlvbiBtYWluICgpIHsKCQlyZXF1aXJlX3ByaXZzKCR0aGlzLT5ldmVu dCk7Cgl9CgoJZnVuY3Rpb24gZ2V0X2FsbF9wZXJtbGlua3MgKCRzb3J0ID0gMCwgJGV4Y2x1 ZGUgPSBhcnJheSgpKSB7CgkJc3RhdGljICRyczsKCQlpZiAoIWlzc2V0KCRycykpCgkJCSRy cyA9IHNhZmVfY29sdW1uKAoJCQkJIlJFUExBQ0UobmFtZSwgJ3skdGhpcy0+cGx1Z2luX25h bWV9XycsICcnKSBBUyBpZCIsICd0eHBfcHJlZnMnLAoJCQkJImBldmVudGAgPSAneyR0aGlz LT5ldmVudH0nIEFORCBgbmFtZWAgUkVHRVhQICdeeyR0aGlzLT5wbHVnaW5fbmFtZX1fLnsx M30kJyIKCQkJKTsKCgkJaWYgKEB0eHBpbnRlcmZhY2UgPT0gJ3B1YmxpYycpCgkJCSR0aGlz LT5kZWJ1ZygnTG9hZGluZyBwZXJtbGlua3MgZnJvbSBkYicpOwoJCSRpID0gMDsKCgkJJHBl cm1saW5rcyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoJHJzIGFzICRpZCkgewoJCQkkcGwgPSAk dGhpcy0+Z2V0X3Blcm1saW5rKCRpZCk7CgoJCQlpZiAoY291bnQoJGV4Y2x1ZGUpID4gMCkK CQkJCWZvcmVhY2ggKCRwbFsnY29tcG9uZW50cyddIGFzICRwbF9jKSB7CgkJCQkJaWYgKGlz X2FycmF5KCRleGNsdWRlKSAmJiBpbl9hcnJheSgkcGxfY1sndHlwZSddLCAkZXhjbHVkZSkp CgkJCQkJCWNvbnRpbnVlIDI7CgkJCQkJaWYgKGlzX3N0cmluZygkZXhjbHVkZSkgJiYgJHBs X2NbJ3R5cGUnXSA9PT0gJGV4Y2x1ZGUpCgkJCQkJCWNvbnRpbnVlIDI7CgkJCQl9CgoJCQkk cGVybWxpbmtzWyRpZF0gPSAkcGw7CgoJCQlpZiAoQHR4cGludGVyZmFjZSA9PSAncHVibGlj JykKCQkJCSR0aGlzLT5kZWJ1ZygrKyRpLic6ICcuJHBsWydzZXR0aW5ncyddWydwbF9uYW1l J10uJyAoJy4kcGxbJ3NldHRpbmdzJ11bJ3BsX3ByZXZpZXcnXS4nKScpOwoKCQkJaWYgKCRz b3J0KQoJCQkJJHByZWNlZGVuY2VbJGlkXSA9ICRwZXJtbGlua3NbJGlkXVsnc2V0dGluZ3Mn XVsncGxfcHJlY2VkZW5jZSddOwoJCX0KCgkJLy8gSWYgbW9yZSB0aGFuIG9uZSBwZXJtYW5l bnQgbGluaywgc29ydCBieSB0aGVpciBwcmVjZWRlbmNlIHZhbHVlLgoJCWlmICgkc29ydCAm JiBjb3VudCgkcGVybWxpbmtzKSA+IDEpCgkJCWFycmF5X211bHRpc29ydCgkcHJlY2VkZW5j ZSwgU09SVF9ERVNDLCAkcGVybWxpbmtzKTsKCgkJcmV0dXJuICRwZXJtbGlua3M7Cgl9CgoJ ZnVuY3Rpb24gZ2V0X3Blcm1saW5rICgkaWQpIHsKCQkkcGVybWxpbmsgPSAkdGhpcy0+cHJl ZigkaWQpOwoJCXJldHVybiBpc19hcnJheSgkcGVybWxpbmspID8gJHBlcm1saW5rIDogYXJy YXkoKTsKCX0KCglmdW5jdGlvbiByZW1vdmVfcGVybWxpbmsgKCRpZCkgewoJCSRwZXJtbGlu ayA9ICR0aGlzLT5nZXRfcGVybWxpbmsoJGlkKTsKCQlzYWZlX2RlbGV0ZSgndHhwX3ByZWZz JywgImBldmVudGAgPSAneyR0aGlzLT5ldmVudH0nIEFORCBgbmFtZWAgTElLRSAneyR0aGlz LT5wbHVnaW5fbmFtZX1feyRpZH0lJyIpOwoJCXJldHVybiAkcGVybWxpbmtbJ3NldHRpbmdz J11bJ3BsX25hbWUnXTsKCX0KCglmdW5jdGlvbiBfZmVlZF9lbnRyeSAoKSB7CgkJc3RhdGlj ICRzZXQ7CgkJaWYgKCFpc3NldCgkc2V0KSkgewoJCQkvLyBXZSdyZSBpbiBhIGZlZWQgZm9y Y2UgZGVidWdnaW5nIG9mZi4KCQkJJHRoaXMtPnByZWZlcmVuY2VzWydkZWJ1ZyddWyd2YWx1 ZSddID0gJEdMT0JBTFNbJ3ByZWZzJ11bJHRoaXMtPnBsdWdpbl9uYW1lLidfZGVidWcnXSA9 IDA7CgoJCQkkdGhpcy0+c2V0X3Blcm1saW5rX21vZGUodHJ1ZSk7CgkJCSRzZXQgPSB0cnVl OwoJCX0KCX0KCglmdW5jdGlvbiBfdGV4dHBhdHRlcm4gKCkgewoJCWdsb2JhbCAkcGx1Z2lu c192ZXIsICRwcmV0ZXh0LCAkcHJlZnMsICRwbHVnaW5fY2FsbGJhY2s7CgoJCSR0aGlzLT5k ZWJ1ZygnUGx1Z2luOiAnLiR0aGlzLT5wbHVnaW5fbmFtZS4nIC0gJy4kcGx1Z2luc192ZXJb JHRoaXMtPnBsdWdpbl9uYW1lXSk7CgkJJHRoaXMtPmRlYnVnKCdGdW5jdGlvbjogJy5fX0ZV TkNUSU9OX18uJygpJyk7CgoJCS8vIFVSSQoJCSRyZXEgPSAkcHJldGV4dFsncmVxJ107CgkJ JHJlcSA9IHByZWdfcmVwbGFjZSgnJVw/W15cL10rJCUnLCAnJywgJHJlcSk7CgkJJHRoaXMt PmRlYnVnKCdSZXF1ZXN0IFVSSTogJy4kcmVxKTsKCQkkdXJpID0gZXhwbG9kZSgnLycsIHRy aW0oJHJlcSwgJy8nKSk7CgoJCS8vIFRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBjb21lcyBp biB1c2VmdWwgd2hlbiBkZXRlcm1pbmluZyB0aGUgYmVzdCBwYXJ0aWFsIG1hdGNoLgoJCSR1 cmlfY29tcG9uZW50X2NvdW50ID0gY291bnQoJHVyaSk7CgoJCS8vIFBlcm1hbmVudCBsaW5r cwoJCSRwZXJtbGlua3MgPSAkdGhpcy0+Z2V0X2FsbF9wZXJtbGlua3MoMSk7CgoJCS8vIEZv cmNlIFRleHRwYXR0ZXJuIGFuZCB0YWdzIHRvIHVzZSBtZXNzeSBVUkxzIC0gdGhlc2UgYXJl IGVhc2llciB0bwoJCS8vIGZpbmQgaW4gcmVnZXgKCQkkdGhpcy0+c2V0X3Blcm1saW5rX21v ZGUoKTsKCgkJaWYgKGNvdW50KCRwZXJtbGlua3MpKSB7CgoJCQkvLyBXZSBhbHNvIHdhbnQg dG8gbWF0Y2ggdGhlIGZyb250IHBhZ2Ugb2YgdGhlIHNpdGUgKGZvciBwYWdlIG51bWJlcnMg LyBmZWVkcyBldGMuLikuCgkJCS8vIEFkZCBhIHBlcm1saW5rcyBydWxlIHdoaWNoIHdpbGwg ZG8gdGhhdC4KCQkJJHBlcm1saW5rc1snZGVmYXVsdCddID0gYXJyYXkoCgkJCQknY29tcG9u ZW50cycgPT4gYXJyYXkoKSwKCQkJCSdzZXR0aW5ncycgPT4gYXJyYXkoCgkJCQkJJ3BsX25h bWUnID0+ICdnYnBfcGVybWFuZW50X2xpbmtzX2RlZmF1bHQnLCAncGxfcHJlY2VkZW5jZScg PT4gJycsICdwbF9wcmV2aWV3JyA9PiAnLycsCgkJCQkJJ2Nvbl9zZWN0aW9uJyA9PiAnJywg J2Nvbl9jYXRlZ29yeScgPT4gJycsICdkZXNfc2VjdGlvbicgPT4gJycsICdkZXNfY2F0ZWdv cnknID0+ICcnLAoJCQkJCSdkZXNfcGVybWxpbmsnID0+ICcnLCAnZGVzX2ZlZWQnID0+ICcn LCAnZGVzX2xvY2F0aW9uJyA9PiAnJywKCQkJKSk7CgoJCQkvLyBFeHRlbmQgdGhlIHByZXRl eHRfcmVwbGFjZW1lbnQgc2NvcGUgb3V0c2lkZSB0aGUgZm9yZWFjaCBwZXJtbGluayBsb29w CgkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50ID0gTlVMTDsKCgkJCWZvcmVhY2goJHBlcm1saW5r cyBhcyAkaWQgPT4gJHBsKSB7CgkJCQkvLyBFeHRyYWN0IHRoZSBwZXJtbGluayBzZXR0aW5n cwoJCQkJJHBsX3NldHRpbmdzID0gJHBsWydzZXR0aW5ncyddOwoJCQkJZXh0cmFjdCgkcGxf c2V0dGluZ3MpOwoKCQkJCSR0aGlzLT5kZWJ1ZygnUGVybWxpbmsgbmFtZTogJy4kcGxfbmFt ZSk7CgkJCQkkdGhpcy0+ZGVidWcoJ1Blcm1saW5rIGlkOiAnLiRpZCk7CgkJCQkkdGhpcy0+ ZGVidWcoJ1ByZXZpZXc6ICcuJHBsX3ByZXZpZXcpOwoKCQkJCSRwbF9jb21wb25lbnRzID0g JHBsWydjb21wb25lbnRzJ107CgoJCQkJLy8gVVJJIGNvbXBvbmVudHMKCQkJCSR1cmlfY29t cG9uZW50cyA9ICR1cmk7CgoJCQkJJHRoaXMtPmRlYnVnKCdQTCBjb21wb25lbnQgY291bnQ6 ICcuY291bnQoJHBsX2NvbXBvbmVudHMpKTsKCQkJCSR0aGlzLT5kZWJ1ZygnVVJMIGNvbXBv bmVudCBjb3VudDogJy5jb3VudCgkdXJpX2NvbXBvbmVudHMpKTsKCgkJCQkkZGF0ZSA9IGZh bHNlOyAkdGl0bGVfcGFnZV9mZWVkID0gZmFsc2U7CgkJCQlmb3JlYWNoKCRwbF9jb21wb25l bnRzIGFzICRwbF9jKQoJCQkJCS8vIEFyZSB3ZSBleHBlY3RpbmcgYSBkYXRlIGNvbXBvbmVu dD8gSWYgc28gdGhlIG51bWJlciBvZiBwbCBhbmQgdXJpIGNvbXBvbmVudHMgd29uJ3QgbWF0 Y2gKCQkJCQlpZiAoJHBsX2NbJ3R5cGUnXSA9PSAnZGF0ZScpCgkJCQkJIAkkZGF0ZSA9IHRy dWU7CgkJCQkJLy8gRG8gd2UgaGF2ZSBlaXRoZXIgYSB0aXRsZSwgcGFnZSBvciBhIGZlZWQg Y29tcG9uZW50PwoJCQkJCWVsc2UgaWYgKGluX2FycmF5KCRwbF9jWyd0eXBlJ10sIGFycmF5 KCd0aXRsZScsICdwYWdlJywgJ2ZlZWQnKSkpCgkJCQkJCSR0aXRsZV9wYWdlX2ZlZWQgPSB0 cnVlOwoKCQkJCWlmICghJHRpdGxlX3BhZ2VfZmVlZCkKCQkJCQkvLyBJZiB0aGVyZSBpc24n dCBhIHRpdGxlLCBwYWdlIG9yIGZlZWQgY29tcG9uZW50IHRoZW4gYXBwZW5kIGEgc3BlY2lh bCB0eXBlIGZvciBjbGVhdmVyIHBhcnRpYWwgbWF0Y2hpbmcKCQkJCQkkcGxfY29tcG9uZW50 c1tdID0gYXJyYXkoJ3R5cGUnID0+ICd0aXRsZV9wYWdlX2ZlZWQnLCAncHJlZml4JyA9PiAn JywgJ3N1ZmZpeCcgPT4gJycsICdyZWdleCcgPT4gJycsICd0ZXh0JyA9PiAnJyk7CgoJCQkJ Ly8gRXhpdCBlYXJseSBpZiB0aGVyZSBhcmUgbW9yZSBVUkwgY29tcG9uZW50cyB0aGFuIFBM IGNvbXBvbmVudHMsCgkJCQkvLyB0YWtpbmcgaW50byBhY2NvdW50IHdoZXRoZXIgdGhlcmUg aXMgYSBkYXRhIGNvbXBvbmVudAoJCQkJaWYgKCEkdXJpX2NvbXBvbmVudHNbMF0gfHwgY291 bnQoJHVyaV9jb21wb25lbnRzKSA+IGNvdW50KCRwbF9jb21wb25lbnRzKSArICgkZGF0ZSA/ IDIgOiAwKSkgewoJCQkJCSR0aGlzLT5kZWJ1ZygnTW9yZSBVUkwgY29tcG9uZW50cyB0aGFu IFBMIGNvbXBvbmVudHMnKTsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkvLyBSZXNldCBw cmV0ZXh0X3JlcGxhY2VtZW50IGFzIHdlIGFyZSBhYm91dCB0byBzdGFydCBhbm90aGVyIGNv bXBhcmlzb24KCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50ID0gYXJyYXkoJ3Blcm1saW5rX2lk JyA9PiAkaWQpOwoKCQkJCS8vIFJlc2V0IHRoZSBhcnRpY2xlIGNvbnRleHQgc3RyaW5nCgkJ CQkkY29udGV4dCA9IGFycmF5KCk7CgkJCQl1bnNldCgkY29udGV4dF9zdHIpOwoJCQkJaWYg KCFlbXB0eSgkZGVzX3NlY3Rpb24pKQoJCQkJCSRjb250ZXh0W10gPSAiYFNlY3Rpb25gID0g JyRkZXNfc2VjdGlvbiciOwoJCQkJaWYgKCFlbXB0eSgkZGVzX2NhdGVnb3J5KSkKCQkJCQkk Y29udGV4dFtdID0gIihgQ2F0ZWdvcnkxYCA9ICckZGVzX2NhdGVnb3J5JyBPUiBgQ2F0ZWdv cnkyYCA9ICckZGVzX2NhdGVnb3J5JykiOwoJCQkJJGNvbnRleHRfc3RyID0gKGNvdW50KCRj b250ZXh0KSA+IDAgPyAnYW5kICcuam9pbignIGFuZCAnLCAkY29udGV4dCkgOiAnJyk7CgoJ CQkJLy8gQXNzdW1lIHRoZXJlIGlzIG5vIG1hdGNoCgkJCQkkcGFydGlhbF9tYXRjaCA9IGZh bHNlOwoJCQkJJGNsZWF2ZXJfcGFydGlhbF9tYXRjaCA9IGZhbHNlOwoKCQkJCS8vIExvb3Ag dGhyb3VnaCB0aGUgcGVybWxpbmsgY29tcG9uZW50cwoJCQkJZm9yZWFjaCAoJHBsX2NvbXBv bmVudHMgYXMgJHBsX2NfaW5kZXggPT4gJHBsX2MpIHsKCQkJCQkvLyBBc3N1bWUgdGhlcmUg aXMgbm8gbWF0Y2gKCQkJCQkkbWF0Y2ggPSBmYWxzZTsKCgkJCQkJLy8gQ2hlY2sgdG8gc2Vl IGlmIHRoZXJlIGFyZSBzdGlsbCBVUkkgY29tcG9uZW50cyB0byBiZSBjaGVja2VkLgoJCQkJ CWlmIChjb3VudCgkdXJpX2NvbXBvbmVudHMpKQoJCQkJCQkvLyBHZXQgdGhlIG5leHQgY29t cG9uZW50LgoJCQkJCQkkdXJpX2MgPSBhcnJheV9zaGlmdCgkdXJpX2NvbXBvbmVudHMpOwoK CQkJCQllbHNlIGlmICghJHRpdGxlX3BhZ2VfZmVlZCAmJiBjb3VudCgkcGxfY29tcG9uZW50 cykgLSAxID09ICR1cmlfY29tcG9uZW50X2NvdW50KSB7CgkJCQkJCS8vIElmIHdlIGFwcGVu ZGVkIGEgdGl0bGVfcGFnZV9mZWVkIGNvbXBvbmVudCBlYXJsaWVyIGFuZCBwZXJtbGluayBh bmQgVVJJIGNvbXBvbmVudHMKCQkJCQkJLy8gY291bnRzIGFyZSBlcXVhbCwgd2UgbXVzdCBv ZiBmaW5pc2hlZCBjaGVja2luZyB0aGlzIHBlcm1saW5rLCBhbmQgaXQgbWF0Y2hlcyBzbyBi cmVhay4KCQkJCQkJJG1hdGNoID0gdHJ1ZTsKCQkJCQkJYnJlYWs7CgoJCQkJCX0gZWxzZSB7 CgkJCQkJCS8vIElmIHRoZXJlIGFyZSBubyBtb3JlIFVSSSBjb21wb25lbnRzIHRoZW4gd2Ug aGF2ZSBhIHBhcnRpYWwgbWF0Y2guCgkJCQkJCS8vIFN0b3JlIHRoZSBwYXJ0aWFsIG1hdGNo IGRhdGEgdW5sZXNzIHRoZXJlIGhhcyBiZWVuIGEgcHJlY2VkaW5nIHBlcm1saW5rIHdpdGgg dGhlCgkJCQkJCS8vIHNhbWUgbnVtYmVyIG9mIGNvbXBvbmVudHMsIGFzIHBlcm1saW5rIGhh dmUgYWxyZWFkeSBiZWVuIHNvcnRlZCBieSBwcmVjZWRlbmNlLgoJCQkJCQlpZiAoIWFycmF5 X2tleV9leGlzdHMoJHVyaV9jb21wb25lbnRfY291bnQsICR0aGlzLT5wYXJ0aWFsX21hdGNo ZXMpKQoJCQkJCQkJJHRoaXMtPnBhcnRpYWxfbWF0Y2hlc1skdXJpX2NvbXBvbmVudF9jb3Vu dF0gPSAkcHJldGV4dF9yZXBsYWNlbWVudDsKCgkJCQkJCS8vIFVuc2V0IHByZXRleHRfcmVw bGFjZW1lbnQgYXMgY2hhbmdlcyBjb3VsZCBvZiBiZWVuIG1hZGUgaW4gYSBwcmVjZWRpbmcg Y29tcG9uZW50CgkJCQkJCXVuc2V0KCRwcmV0ZXh0X3JlcGxhY2VtZW50KTsKCgkJCQkJCS8v IEJyZWFrIGVhcmx5IGZvcm0gdGhlIGZvcmVhY2ggcGVybWxpbmsgY29tcG9uZW50cyBsb29w LgoJCQkJCQkkcGFydGlhbF9tYXRjaCA9IHRydWU7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCgkJ CQkJLy8gRXh0cmFjdCB0aGUgcGVybWxpbmsgY29tcG9uZW50cy4KCQkJCQlleHRyYWN0KCRw bF9jKTsKCgkJCQkJLy8gSWYgaXQncyBhIGRhdGUsIGdyYWIgYW5kIGNvbWJpbmUgdGhlIG5l eHQgdHdvIFVSSSBjb21wb25lbnRzLgoJCQkJCWlmICgkdHlwZSA9PSAnZGF0ZScpCgkJCQkJ CSR1cmlfYyAuPSAnLycuYXJyYXlfc2hpZnQoJHVyaV9jb21wb25lbnRzKS4nLycuYXJyYXlf c2hpZnQoJHVyaV9jb21wb25lbnRzKTsKCgkJCQkJLy8gRGVjb2RlIHRoZSBVUkwKCQkJCQkk dXJpX2MgPSB1cmxkZWNvZGUoJHVyaV9jKTsKCgkJCQkJLy8gQWx3YXlzIGNoZWNrIHRoZSB0 eXBlIHVubGVzcyB0aGUgcHJlZml4IG9yIHN1ZmZpeCBhcmVuJ3QgdGhlcmUKCQkJCQkkY2hl Y2tfdHlwZSA9IHRydWU7CgoJCQkJCS8vIENoZWNrIHByZWZpeAoJCQkJCWlmICgkcHJlZml4 ICYmICR0aGlzLT5wcmVmKCdzaG93X3ByZWZpeCcpKSB7CgkJCQkJCSRzYW5pdGl6ZWRfcHJl Zml4ID0gdXJsZGVjb2RlKCR0aGlzLT5lbmNvZGVfdXJsKCRwcmVmaXgpKTsKCQkJCQkJaWYg KCgkcG9zID0gc3RycG9zKCR1cmlfYywgJHNhbml0aXplZF9wcmVmaXgpKSA9PT0gZmFsc2Ug fHwgJHBvcyAhPSAwKSB7CgkJCQkJCQkkY2hlY2tfdHlwZSA9IGZhbHNlOwoJCQkJCQkJJHRo aXMtPmRlYnVnKCdDYW5cJ3QgZmluZCBwcmVmaXg6ICcuJHByZWZpeCk7CgkJCQkJCX0gZWxz ZQoJCQkJCQkJLy8gQ2hlY2sgcGFzc2VkLCByZW1vdmUgcHJlZml4IHJlYWR5IGZvciB0aGUg bmV4dCBjaGVjawoJCQkJCQkJJHVyaV9jID0gc3Vic3RyX3JlcGxhY2UoJHVyaV9jLCAnJywg MCwgc3RybGVuKCRzYW5pdGl6ZWRfcHJlZml4KSk7CgkJCQkJfQoKCQkJCQkvLyBDaGVjayBz dWZmaXgKCQkJCQlpZiAoJGNoZWNrX3R5cGUgJiYgJHN1ZmZpeCAmJiAkdGhpcy0+cHJlZign c2hvd19zdWZmaXgnKSkgewoJCQkJCQkkc2FuaXRpemVkX3N1ZmZpeCA9IHVybGRlY29kZSgk dGhpcy0+ZW5jb2RlX3VybCgkc3VmZml4KSk7CgkJCQkJCWlmICgoJHBvcyA9IHN0cnJwb3Mo JHVyaV9jLCAkc2FuaXRpemVkX3N1ZmZpeCkpID09PSBmYWxzZSkgewoJCQkJCQkJJGNoZWNr X3R5cGUgPSBmYWxzZTsKCQkJCQkJCSR0aGlzLT5kZWJ1ZygnQ2FuXCd0IGZpbmQgc3VmZml4 OiAnLiRzdWZmaXgpOwoJCQkJCQl9IGVsc2UKCQkJCQkJCS8vIENoZWNrIHBhc3NlZCwgcmVt b3ZlIHN1ZmZpeCByZWFkeSBmb3IgdGhlIG5leHQgY2hlY2sKCQkJCQkJCSR1cmlfYyA9IHN1 YnN0cl9yZXBsYWNlKCR1cmlfYywgJycsICRwb3MsIHN0cmxlbigkc2FuaXRpemVkX3N1ZmZp eCkpOwoJCQkJCX0KCgkJCQkJLy8gQm90aCB0aGUgcHJlZml4IGFuZCBzdWZmaXggc2V0dGlu Z3MgaGF2ZSBwYXNzZWQKCQkJCQlpZiAoJGNoZWNrX3R5cGUpIHsKCQkJCQkJJHRoaXMtPmRl YnVnKCdDaGVja2luZyBpZiAiJy4kdXJpX2MuJyIgaXMgb2YgdHlwZSAiJy4kdHlwZS4nIicp OwoJCQkJCQkkdXJpX2MgPSBkb1NsYXNoKCR1cmlfYyk7CgoJCQkJCQkvLwoJCQkJCQlpZiAo JHByZWZzWydwZXJtYWxpbmtfdGl0bGVfZm9ybWF0J10pIHsKCQkJCQkJCSRtdF9zZWFyY2gg PSBhcnJheSgnL18vJywgJy9cLmh0bWwkLycpOwoJCQkJCQkJJG10X3JlcGxhY2UgPSBhcnJh eSgnLScsICcnKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRtdF9zZWFyY2ggPSBhcnJheSgn Lyg/Ol58XykoLikvZScsICcvXC5odG1sJC8nKTsKCQkJCQkJCSRtdF9yZXBsYWNlID0gYXJy YXkoInN0cnRvdXBwZXIoJ1xcMScpIiwgJycpOwoJCQkJCQl9CgkJCQkJCSRtdF91cmlfYyA9 ICR0aGlzLT5wcmVmKCdyZWRpcmVjdF9tdF9zdHlsZV9saW5rcycpCgkJCQkJCQk/IHByZWdf cmVwbGFjZSgkbXRfc2VhcmNoLCAkbXRfcmVwbGFjZSwgJHVyaV9jKQoJCQkJCQkJOiAnJzsK CgkJCQkJCS8vIENvbXBhcmUgYmFzZWQgb24gdHlwZQoJCQkJCQlzd2l0Y2ggKCR0eXBlKSB7 CgkJCQkJCQljYXNlICdzZWN0aW9uJzoKCQkJCQkJCQlpZiAoJHJzID0gc2FmZV9yb3coJ25h bWUnLCAndHhwX3NlY3Rpb24nLCAiKGBuYW1lYCBsaWtlICckdXJpX2MnIG9yIGBuYW1lYCBs aWtlICckbXRfdXJpX2MnKSBsaW1pdCAxIikpIHsKCQkJCQkJCQkJJHRoaXMtPmRlYnVnKCdT ZWN0aW9uIG5hbWU6ICcuJHJzWyduYW1lJ10pOwoJCQkJCQkJCQkkcHJldGV4dF9yZXBsYWNl bWVudFsncyddID0gJHJzWyduYW1lJ107CgkJCQkJCQkJCSRjb250ZXh0W10gPSAiYFNlY3Rp b25gID0gJ3skcnNbJ25hbWUnXX0nIjsKCQkJCQkJCQkJJG1hdGNoID0gdHJ1ZTsKCQkJCQkJ CQl9CgkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ2NhdGVnb3J5JzoKCQkJCQkJCQlpZiAo JHJzID0gc2FmZV9yb3coJ25hbWUnLCAndHhwX2NhdGVnb3J5JywgIihgbmFtZWAgbGlrZSAn JHVyaV9jJyBvciBgbmFtZWAgbGlrZSAnJG10X3VyaV9jJykgYW5kIGB0eXBlYCA9ICdhcnRp Y2xlJyBsaW1pdCAxIikpIHsKCQkJCQkJCQkJJHRoaXMtPmRlYnVnKCdDYXRlZ29yeSBuYW1l OiAnLiRyc1snbmFtZSddKTsKCQkJCQkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ2MnXSA9 ICRyc1snbmFtZSddOwoJCQkJCQkJCQkkY29udGV4dFtdID0gIihgQ2F0ZWdvcnkxYCA9ICd7 JHJzWyduYW1lJ119JyBPUiBgQ2F0ZWdvcnkyYCA9ICckdXJpX2MnKSI7CgkJCQkJCQkJCSRt YXRjaCA9IHRydWU7CgkJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICd0aXRs ZSc6CgkJCQkJCQkJaWYgKCRycyA9IHNhZmVfcm93KCdJRCwgUG9zdGVkJywgJ3RleHRwYXR0 ZXJuJywgIihgdXJsX3RpdGxlYCBsaWtlICckdXJpX2MnIG9yIGB1cmxfdGl0bGVgIGxpa2Ug JyRtdF91cmlfYycpICRjb250ZXh0X3N0ciBhbmQgYFN0YXR1c2AgPj0gNCBsaW1pdCAxIikp IHsKCQkJCQkJCQkJJHRoaXMtPmRlYnVnKCdBcnRpY2xlIGlkOiAnLiRyc1snSUQnXSk7CgkJ CQkJCQkJCSRtdF9yZWRpcmVjdCA9ICgkdXJpX2MgIT0gJG10X3VyaV9jKTsKCQkJCQkJCQkJ JHByZXRleHRfcmVwbGFjZW1lbnRbJ2lkJ10gPSAkcnNbJ0lEJ107CgkJCQkJCQkJCSRwcmV0 ZXh0X3JlcGxhY2VtZW50WydQb3N0ZWQnXSA9ICRyc1snUG9zdGVkJ107CgkJCQkJCQkJCSRw cmV0ZXh0WydudW1QYWdlcyddID0gMTsKCQkJCQkJCQkJJHByZXRleHRbJ2lzX2FydGljbGVf bGlzdCddID0gZmFsc2U7CgkJCQkJCQkJCSRtYXRjaCA9IHRydWU7CgkJCQkJCQkJfQoJCQkJ CQkJYnJlYWs7CgkJCQkJCQljYXNlICdpZCc6CgkJCQkJCQkJaWYgKCRycyA9IHNhZmVfcm93 KCdJRCwgUG9zdGVkJywgJ3RleHRwYXR0ZXJuJywgImBJRGAgPSAnJHVyaV9jJyAkY29udGV4 dF9zdHIgYW5kIGBTdGF0dXNgID49IDQgbGltaXQgMSIpKSB7CgkJCQkJCQkJCSRwcmV0ZXh0 X3JlcGxhY2VtZW50WydpZCddID0gJHJzWydJRCddOwoJCQkJCQkJCQkkcHJldGV4dF9yZXBs YWNlbWVudFsnUG9zdGVkJ10gPSAkcnNbJ1Bvc3RlZCddOwoJCQkJCQkJCQkkcHJldGV4dFsn bnVtUGFnZXMnXSA9IDE7CgkJCQkJCQkJCSRwcmV0ZXh0Wydpc19hcnRpY2xlX2xpc3QnXSA9 IGZhbHNlOwoJCQkJCQkJCQkkbWF0Y2ggPSB0cnVlOwoJCQkJCQkJCX0KCQkJCQkJCWJyZWFr OwoJCQkJCQkJY2FzZSAnYXV0aG9yJzoKCQkJCQkJCQlpZiAoJGF1dGhvciA9IHNhZmVfZmll bGQoJ25hbWUnLCAndHhwX3VzZXJzJywgIlJlYWxOYW1lIGxpa2UgJyR1cmlfYycgbGltaXQg MSIpKSB7CgkJCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WydhdXRob3InXSA9ICRhdXRo b3I7CgkJCQkJCQkJCSRjb250ZXh0W10gPSAiYEF1dGhvcklEYCA9ICckYXV0aG9yJyI7CgkJ CQkJCQkJCSRtYXRjaCA9IHRydWU7CgkJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCQlj YXNlICdsb2dpbic6CgkJCQkJCQkJaWYgKCRhdXRob3IgPSBzYWZlX2ZpZWxkKCduYW1lJywg J3R4cF91c2VycycsICJuYW1lIGxpa2UgJyR1cmlfYycgbGltaXQgMSIpKSB7CgkJCQkJCQkJ CSRwcmV0ZXh0X3JlcGxhY2VtZW50WydhdXRob3InXSA9ICRhdXRob3I7CgkJCQkJCQkJCSRj b250ZXh0W10gPSAiYEF1dGhvcklEYCA9ICckYXV0aG9yJyI7CgkJCQkJCQkJCSRtYXRjaCA9 IHRydWU7CgkJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdjdXN0b20nOgoJ CQkJCQkJCSRjdXN0b21fb3B0aW9ucyA9IGFycmF5X3ZhbHVlcyhhcnJheV9tYXAoYXJyYXko JHRoaXMsICJlbmNvZGVfdXJsIiksIHNhZmVfY29sdW1uKCJjdXN0b21fJGN1c3RvbSIsICd0 ZXh0cGF0dGVybicsICJjdXN0b21fJGN1c3RvbSAhPSAnJyIpKSk7CgkJCQkJCQkJaWYgKCR0 aGlzLT5wcmVmKCdmb3JjZV9sb3dlcmNhc2VfdXJscycpKQoJCQkJCQkJCQkkY3VzdG9tX29w dGlvbnMgPSBhcnJheV9tYXAoInN0cnRvbG93ZXIiLCAkY3VzdG9tX29wdGlvbnMpOwoJCQkJ CQkJCWlmIChpbl9hcnJheSgkdXJpX2MsICRjdXN0b21fb3B0aW9ucykpIHsKCQkJCQkJCQkJ JG1hdGNoID0gdHJ1ZTsKCQkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ2Rh dGUnOgoJCQkJCQkJCWlmIChwcmVnX21hdGNoKCcvXlxkezR9XC9cZHsyfVwvXGR7Mn0kLycs ICR1cmlfYykpIHsKCQkJCQkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ2RhdGUnXSA9IHN0 cl9yZXBsYWNlKCcvJywgJy0nLCAkdXJpX2MpOwoJCQkJCQkJCQkkbWF0Y2ggPSB0cnVlOwoJ CQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAneWVhcic6CgkJCQkJCQkJaWYg KHByZWdfbWF0Y2goJy9eXGR7NH0kLycsICR1cmlfYykpIHsKCQkJCQkJCQkJJHByZXRleHRf cmVwbGFjZW1lbnRbJ3llYXInXSA9ICR1cmlfYzsKCQkJCQkJCQkJJG1hdGNoID0gdHJ1ZTsK CQkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ21vbnRoJzoKCQkJCQkJCWNh c2UgJ2RheSc6CgkJCQkJCQkJaWYgKHByZWdfbWF0Y2goJy9eXGR7Mn0kLycsICR1cmlfYykp IHsKCQkJCQkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJHR5cGVdID0gJHVyaV9jOwoJCQkJ CQkJCQkkbWF0Y2ggPSB0cnVlOwoJCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2Fz ZSAncGFnZSc6CgkJCQkJCQkJaWYgKGlzX251bWVyaWMoJHVyaV9jKSkgewoJCQkJCQkJCQkk cHJldGV4dF9yZXBsYWNlbWVudFsncGcnXSA9ICR1cmlfYzsKCQkJCQkJCQkJJG1hdGNoID0g dHJ1ZTsKCQkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ2ZlZWQnOgoJCQkJ CQkJCWlmIChpbl9hcnJheSgkdXJpX2MsIGFycmF5KCdyc3MnLCAnYXRvbScpKSkgewoJCQkJ CQkJCQkkcHJldGV4dF9yZXBsYWNlbWVudFskdXJpX2NdID0gMTsKCQkJCQkJCQkJJG1hdGNo ID0gdHJ1ZTsKCQkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3NlYXJjaCc6 CgkJCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WydxJ10gPSAkdXJpX2M7CgkJCQkJCQkJ CSRtYXRjaCA9IHRydWU7CgkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3RleHQnOgoJCQkJ CQkJCWlmICgkdGhpcy0+ZW5jb2RlX3VybCgkdGV4dCkgPT0gJHVyaV9jKSB7CgkJCQkJCQkJ CSRtYXRjaCA9IHRydWU7CgkJCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WyJwZXJtbGlu a190ZXh0X3skbmFtZX0iXSA9ICR1cmlfYzsKCQkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJ CQkJCWNhc2UgJ3JlZ2V4JzoKCQkJCQkJCQkvLyBDaGVjayB0byBzZWUgaWYgcmVnZXggaXMg dmFsaWQgd2l0aG91dCBvdXRwdXR0aW5nIGVycm9yIG1lc3NhZ2VzLgoJCQkJCQkJCW9iX3N0 YXJ0KCk7CgkJCQkJCQkJcHJlZ19tYXRjaCgkcmVnZXgsICR1cmlfYywgJHJlZ2V4X21hdGNo ZXMpOwoJCQkJCQkJCSRpc192YWxpZF9yZWdleCA9ICEob2JfZ2V0X2NsZWFuKCkpOwoJCQkJ CQkJCWlmICgkaXNfdmFsaWRfcmVnZXggJiYgQCRyZWdleF9tYXRjaGVzWzBdKSB7CgkJCQkJ CQkJCSRtYXRjaCA9IHRydWU7CgkJCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WyJwZXJt bGlua19yZWdleF97JG5hbWV9Il0gPSAkcmVnZXhfbWF0Y2hlc1swXTsKCQkJCQkJCQl9CgkJ CQkJCQlicmVhazsKCQkJCQkJfSAvLyBzd2l0Y2ggdHlwZSBlbmQKCgkJCQkJCS8vIFVwZGF0 ZSB0aGUgYXJ0aWNsZSBjb250ZXh0IHN0cmluZwoJCQkJCQkkY29udGV4dF9zdHIgPSAoY291 bnQoJGNvbnRleHQpID4gMCA/ICdhbmQgJy5qb2luKCcgYW5kICcsICRjb250ZXh0KSA6ICcn KTsKCgkJCQkJCSR0aGlzLT5kZWJ1ZygoJG1hdGNoID09IHRydWUpID8gJ1lFUycgOiAnTk8n KTsKCgkJCQkJCWlmICghJG1hdGNoICYmICEkY2xlYXZlcl9wYXJ0aWFsX21hdGNoKSB7CgkJ CQkJCQkvLyBUaGVyZSBoYXNuJ3QgYmVlbiBhIG1hdGNoIG9yIGEgY29tcGxldGUgY2xlYXZl ciBwYXJ0aWFsIG1hdGNoLiBMZXRzIHRyeSB0byBiZSBjbGVhdmVyIGFuZAoJCQkJCQkJLy8g Y2hlY2sgdG8gc2VlIGlmIHRoaXMgY29tcG9uZW50IGlzIGVpdGhlciBhIHRpdGxlLCBwYWdl IG9yIGEgZmVlZC4gVGhpcyBtYWtlcyBpdCBtb3JlIHByb2JhYmxlCgkJCQkJCQkvLyBhIHN1 Y2Nlc3NmdWwgbWF0Y2ggZm9yIGEgZ2l2ZW4gcGVybWxpbmsgcnVsZSBvY2N1cnMuCgkJCQkJ CQkkdGhpcy0+ZGVidWcoJ0NoZWNraW5nIGlmICInLiR1cmlfYy4nIiBpcyBvZiB0eXBlICJ0 aXRsZV9wYWdlX2ZlZWQiJyk7CgoJCQkJCQkJaWYgKCR0eXBlICE9ICd0aXRsZScgJiYgJElE ID0gc2FmZV9maWVsZCgnSUQnLCAndGV4dHBhdHRlcm4nLCAiYHVybF90aXRsZWAgbGlrZSAn JHVyaV9jJyAkY29udGV4dF9zdHIgYW5kIGBTdGF0dXNgID49IDQgbGltaXQgMSIpKSB7CgkJ CQkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ2lkJ10gPSAkSUQ7CgkJCQkJCQkJJHByZXRl eHRbJ251bVBhZ2VzJ10gPSAxOwoJCQkJCQkJCSRwcmV0ZXh0Wydpc19hcnRpY2xlX2xpc3Qn XSA9IGZhbHNlOwoJCQkJCQkJCSRjbGVhdmVyX3BhcnRpYWxfbWF0Y2ggPSB0cnVlOwoJCQkJ CQkJfSBlbHNlIGlmICgkdGhpcy0+cHJlZignY2xlYW5fcGFnZV9hcmNoaXZlX2xpbmtzJykg JiYgJHR5cGUgIT0gJ3BhZ2UnICYmIGlzX251bWVyaWMoJHVyaV9jKSkgewoJCQkJCQkJCSRw cmV0ZXh0X3JlcGxhY2VtZW50WydwZyddID0gJHVyaV9jOwoJCQkJCQkJCSRjbGVhdmVyX3Bh cnRpYWxfbWF0Y2ggPSB0cnVlOwoJCQkJCQkJfSBlbHNlIGlmICgkdHlwZSAhPSAnZmVlZCcg JiYgaW5fYXJyYXkoJHVyaV9jLCBhcnJheSgncnNzJywgJ2F0b20nKSkpIHsKCQkJCQkJCQkk cHJldGV4dF9yZXBsYWNlbWVudFskdXJpX2NdID0gMTsKCQkJCQkJCQkkY2xlYXZlcl9wYXJ0 aWFsX21hdGNoID0gdHJ1ZTsKCQkJCQkJCX0KCgkJCQkJCQkkdGhpcy0+ZGVidWcoKCRjbGVh dmVyX3BhcnRpYWxfbWF0Y2ggPT0gdHJ1ZSkgPyAnWUVTJyA6ICdOTycpOwoKCQkJCQkJCWlm ICgkY2xlYXZlcl9wYXJ0aWFsX21hdGNoKSB7CgkJCQkJCQkJJHRoaXMtPmNsZWF2ZXJfcGFy dGlhbF9tYXRjaCA9ICRwcmV0ZXh0X3JlcGxhY2VtZW50OwoKCQkJCQkJCQkvLyBVbnNldCBw cmV0ZXh0X3JlcGxhY2VtZW50IGFzIGNoYW5nZXMgY291bGQgb2YgYmVlbiBtYWRlIGluIGEg cHJlY2VkaW5nIGNvbXBvbmVudAoJCQkJCQkJCXVuc2V0KCRwcmV0ZXh0X3JlcGxhY2VtZW50 KTsKCgkJCQkJCQkJJGNsZWF2ZXJfcGFydGlhbF9tYXRjaCA9IHRydWU7CgkJCQkJCQkJY29u dGludWUgMjsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0gLy8gY2hlY2sgdHlwZSBlbmQKCgkJ CQkJLy8gQnJlYWsgZWFybHkgaWYgdGhlIGNvbXBvbmVudCBkb2Vzbid0IG1hdGNoLCBhcyB0 aGVyZSBpcyBubyBwb2ludCBjb250aW51aW5nCgkJCQkJaWYgKCRtYXRjaCA9PSBmYWxzZSkg ewoJCQkJCQkvLyBVbnNldCBwcmV0ZXh0X3JlcGxhY2VtZW50IGFzIGNoYW5nZXMgY291bGQg b2YgYmVlbiBtYWRlIGluIGEgcHJlY2VkaW5nIGNvbXBvbmVudAoJCQkJCQl1bnNldCgkcHJl dGV4dF9yZXBsYWNlbWVudCk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0gLy8gZm9yZWFj aCBwZXJtbGluayBjb21wb25lbnQgZW5kCgoJCQkJaWYgKCRtYXRjaCB8fCAkcGFydGlhbF9t YXRjaCB8fCAkY2xlYXZlcl9wYXJ0aWFsX21hdGNoKSB7CgkJCQkJaWYgKCRtYXRjaCAmJiBp c3NldCgkcHJldGV4dF9yZXBsYWNlbWVudCkpCgkJCQkJCSR0aGlzLT5kZWJ1ZygnV2UgaGF2 ZSBhIG1hdGNoIScpOwoKCQkJCQllbHNlIGlmICgkcGFydGlhbF9tYXRjaCAmJiBjb3VudCgk dGhpcy0+cGFydGlhbF9tYXRjaGVzKSkKCQkJCQkJJHRoaXMtPmRlYnVnKCdXZSBoYXZlIGEg XCdwYXJ0aWFsIG1hdGNoXCcnKTsKCgkJCQkJZWxzZSBpZiAoJGNsZWF2ZXJfcGFydGlhbF9t YXRjaCAmJiBpc3NldCgkY2xlYXZlcl9wYXJ0aWFsX21hdGNoKSkgewoJCQkJCQkkdGhpcy0+ ZGVidWcoJ1dlIGhhdmUgYSBcJ2NsZWF2ZXIgcGFydGlhbCBtYXRjaFwnJyk7CgoJCQkJCX0g ZWxzZSB7CgkJCQkJCSR0aGlzLT5kZWJ1ZygnRXJyb3I6IENhblwndCBkZXRlcm1pbmUgdGhl IGNvcnJlY3QgdHlwZSBtYXRjaCcpOwoJCQkJCQkvLyBUaGlzIHBlcm1saW5rIGhhcyBmYWls ZWQsIGNvbnRpbnVlIGV4ZWN1dGlvbiBvZiB0aGUgZm9yZWFjaCBwZXJtbGlua3MgbG9vcAoJ CQkJCQl1bnNldCgkcHJldGV4dF9yZXBsYWNlbWVudCk7CgkJCQkJfQoJCQkJfQoKCQkJCS8v IFdlIGhhdmUgYSBtYXRjaAoJCQkJaWYgKEAkcHJldGV4dF9yZXBsYWNlbWVudCkKCQkJCQli cmVhazsKCgkJCX0gLy8gZm9yZWFjaCBwZXJtbGlua3MgZW5kCgoJCQkvLyBJZiB0aGVyZSBp cyBubyBtYXRjaCByZXN0b3JlIHRoZSBtb3N0IGxpa2VseSBwYXJ0aWFsIG1hdGNoLiBTb3J0 ZWQgYnkgbnVtYmVyIG9mIGNvbXBvbmVudHMgYW5kIHRoZW4gcHJlY2VkZW5jZQoJCQlpZiAo IUAkcHJldGV4dF9yZXBsYWNlbWVudCAmJiBjb3VudCgkdGhpcy0+cGFydGlhbF9tYXRjaGVz KSkKCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50ID0gYXJyYXlfc2hpZnQoYXJyYXlfc2xpY2Uo JHRoaXMtPnBhcnRpYWxfbWF0Y2hlcywgLTEpKTsKCQkJdW5zZXQoJHRoaXMtPnBhcnRpYWxf bWF0Y2hlcyk7CgoJCQkvLyBSZXN0b3JlIHRoZSBjbGVhdmVyX3BhcnRpYWxfbWF0Y2ggaWYg dGhlcmUgaXMgbm8gb3RoZXIgbWF0Y2hlcwoJCQlpZiAoIUAkcHJldGV4dF9yZXBsYWNlbWVu dCAmJiAkdGhpcy0+Y2xlYXZlcl9wYXJ0aWFsX21hdGNoKQoJCQkJJHByZXRleHRfcmVwbGFj ZW1lbnQgPSAkdGhpcy0+Y2xlYXZlcl9wYXJ0aWFsX21hdGNoOwoJCQl1bnNldCgkdGhpcy0+ Y2xlYXZlcl9wYXJ0aWFsX21hdGNoKTsKCgkJCS8vIEV4dHJhY3QgdGhlIHNldHRpbmdzIGZv ciB0aGlzIHBlcm1saW5rCgkJCUBleHRyYWN0KCRwZXJtbGlua3NbJHByZXRleHRfcmVwbGFj ZW1lbnRbJ3Blcm1saW5rX2lkJ11dWydzZXR0aW5ncyddKTsKCgkJCS8vIENoZWNrIHRoZSBw ZXJtbGluayBzZWN0aW9uIGFuZCBjYXRlZ29yeSBjb25kaXRpb25zCgkJCWlmICgoIWVtcHR5 KCRjb25fc2VjdGlvbikgJiYgJGNvbl9zZWN0aW9uICE9IEAkcHJldGV4dF9yZXBsYWNlbWVu dFsncyddKSB8fAoJCQkoIWVtcHR5KCRjb25fY2F0ZWdvcnkpICYmICRjb25fY2F0ZWdvcnkg IT0gQCRwcmV0ZXh0X3JlcGxhY2VtZW50WydjJ10pKSB7CgkJCQkkdGhpcy0+ZGVidWcoJ1Bl cm1saW5rIGNvbmRpdGlvbnMgZmFpbGVkJyk7CgkJCQlpZiAoQCRjb25fc2VjdGlvbikgJHRo aXMtPmRlYnVnKCdjb25fc2VjdGlvbiA9ICcuICRjb25fc2VjdGlvbik7CgkJCQlpZiAoQCRj b25fY2F0ZWdvcnkpICR0aGlzLT5kZWJ1ZygnY29uX2NhdGVnb3J5ID0gJy4gJGNvbl9jYXRl Z29yeSk7CgoJCQkJdW5zZXQoJHByZXRleHRfcmVwbGFjZW1lbnQpOwoJCQl9CgoJCQkvLyBJ ZiBwcmV0ZXh0X3JlcGxhY2VtZW50IGlzIHN0aWxsIHNldCBoZXJlIHRoZW4gd2UgaGF2ZSBh IG1hdGNoCgkJCWlmIChAJHByZXRleHRfcmVwbGFjZW1lbnQpIHsKCQkJCSR0aGlzLT5kZWJ1 ZygnUHJldGV4dCBSZXBsYWNlbWVudCAnLnByaW50X3IoJHByZXRleHRfcmVwbGFjZW1lbnQs IDEpKTsKCgkJCQlpZiAoIWVtcHR5KCRkZXNfc2VjdGlvbikpCgkJCQkJJHByZXRleHRfcmVw bGFjZW1lbnRbJ3MnXSA9ICRkZXNfc2VjdGlvbjsKCQkJCWlmICghZW1wdHkoJGRlc19jYXRl Z29yeSkpCgkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ2MnXSA9ICRkZXNfY2F0ZWdvcnk7 CgkJCQlpZiAoIWVtcHR5KCRkZXNfZmVlZCkpCgkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRb JGRlc19mZWVkXSA9IDE7CgoJCQkJaWYgKEAkcHJldGV4dF9yZXBsYWNlbWVudFsnaWQnXSAm JiBAJHByZXRleHRfcmVwbGFjZW1lbnRbJ1Bvc3RlZCddKSB7CgkJCQkgCWlmICgkbnAgPSBn ZXROZXh0UHJldigkcHJldGV4dF9yZXBsYWNlbWVudFsnaWQnXSwgJHByZXRleHRfcmVwbGFj ZW1lbnRbJ1Bvc3RlZCddLCBAJHByZXRleHRfcmVwbGFjZW1lbnRbJ3MnXSkpCgkJCQkJCSRw cmV0ZXh0X3JlcGxhY2VtZW50ID0gYXJyYXlfbWVyZ2UoJHByZXRleHRfcmVwbGFjZW1lbnQs ICRucCk7CgkJCQl9CgkJCQl1bnNldCgkcHJldGV4dF9yZXBsYWNlbWVudFsnUG9zdGVkJ10p OwoKCQkJCS8vIElmIHRoZXJlIGlzIGEgbWF0Y2ggdGhlbiB3ZSBtb3N0IHNldCB0aGUgaHR0 cCBzdGF0dXMgY29ycmVjdGx5IGFzIHR4cCdzIHByZXRleHQgbWlnaHQgc2V0IGl0IHRvIDQw NAoJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ3N0YXR1cyddID0gJzIwMCc7CgoJCQkJLy8g U3RvcmUgdGhlIG9yZ2luaWFsIEhUVFAgc3RhdHVzIGNvZGUKCQkJCS8vIFdlIG1pZ2h0IG5l ZWQgdG8gbG9nIHRoZSBwYWdlIGhpdCBpZiBpdCBlcXVhbHMgNDA0CgkJCQkkb3JnaW5pYWxf c3RhdHVzID0gJHByZXRleHRbJ3N0YXR1cyddOwoKCQkJCS8vIFR4cCBvbmx5IGxvb2tzIGF0 IHRoZSBtb250aCwgYnV0IGR1ZSB0byBob3cgd2UgcGhhc2UgdGhlIG1vbnRoIHdlIGNhbiBt YW5pcHVsYXRlIHRoZSBzcWwgdG8gb3VyIG5lZWRzCgkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0 cygnZGF0ZScsICRwcmV0ZXh0X3JlcGxhY2VtZW50KSkgewoJCQkJCSRwcmV0ZXh0X3JlcGxh Y2VtZW50Wydtb250aCddID0gJHByZXRleHRfcmVwbGFjZW1lbnRbJ2RhdGUnXTsKCQkJCQl1 bnNldCgkcHJldGV4dF9yZXBsYWNlbWVudFsnZGF0ZSddKTsKCQkJCX0gZWxzZSBpZiAoYXJy YXlfa2V5X2V4aXN0cygneWVhcicsICRwcmV0ZXh0X3JlcGxhY2VtZW50KSB8fAoJCQkJYXJy YXlfa2V5X2V4aXN0cygnbW9udGgnLCAkcHJldGV4dF9yZXBsYWNlbWVudCkgfHwKCQkJCWFy cmF5X2tleV9leGlzdHMoJ2RheScsICRwcmV0ZXh0X3JlcGxhY2VtZW50KSkgewoJCQkJCSRt b250aCA9ICcnOwoJCQkJCSRtb250aCAuPSAoYXJyYXlfa2V5X2V4aXN0cygneWVhcicsICRw cmV0ZXh0X3JlcGxhY2VtZW50KSkKCQkJCQkJPyAkcHJldGV4dF9yZXBsYWNlbWVudFsneWVh ciddLictJyA6ICdfX19fLSc7CgkJCQkJJG1vbnRoIC49IChhcnJheV9rZXlfZXhpc3RzKCdt b250aCcsICRwcmV0ZXh0X3JlcGxhY2VtZW50KSkKCQkJCQkJPyAkcHJldGV4dF9yZXBsYWNl bWVudFsnbW9udGgnXS4nLScgOiAnX18tJzsKCQkJCQkkbW9udGggLj0gKGFycmF5X2tleV9l eGlzdHMoJ2RheScsICRwcmV0ZXh0X3JlcGxhY2VtZW50KSkKCQkJCQkJPyAkcHJldGV4dF9y ZXBsYWNlbWVudFsnZGF5J10uJyAnIDogJ19fICc7CgoJCQkJCSRwcmV0ZXh0X3JlcGxhY2Vt ZW50Wydtb250aCddID0gJG1vbnRoOwoJCQkJCXVuc2V0KCRwcmV0ZXh0X3JlcGxhY2VtZW50 Wyd5ZWFyJ10pOwoJCQkJCXVuc2V0KCRwcmV0ZXh0X3JlcGxhY2VtZW50WydkYXknXSk7CgkJ CQl9CgoJCQkJLy8gU2VjdGlvbiBuZWVkcyB0byBiZSBkZWZpbmVkIHNvIHdlIGNhbiBhbHdh eXMgZ2V0IGEgcGFnZSB0ZW1wbGF0ZS4KCQkJCWlmICghYXJyYXlfa2V5X2V4aXN0cygncycs ICRwcmV0ZXh0X3JlcGxhY2VtZW50KSkKCQkJCXsKCQkJCQlpZiAoIUAkcHJldGV4dF9yZXBs YWNlbWVudFsnaWQnXSkKCQkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ3MnXSA9ICdkZWZh dWx0JzsKCQkJCQllbHNlCgkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WydzJ10gPSBzYWZl X2ZpZWxkKCdTZWN0aW9uJywgJ3RleHRwYXR0ZXJuJywgJ0lEID0gJy4kcHJldGV4dF9yZXBs YWNlbWVudFsnaWQnXSk7CgkJCQl9CgoJCQkJLy8gU2V0IHRoZSBwYWdlIHRlbXBsYXRlLCBv dGhlcndpc2Ugd2UgZ2V0IGFuIHVua25vd24gc2VjdGlvbiBlcnJvcgoJCQkJJHBhZ2UgPSAo QCRkZXNfcGFnZSkKCQkJCQk/ICRkZXNfcGFnZQoJCQkJCTogc2FmZV9maWVsZCgncGFnZScs ICd0eHBfc2VjdGlvbicsICJuYW1lID0gJ3skcHJldGV4dF9yZXBsYWNlbWVudFsncyddfScg bGltaXQgMSIpOwoJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ3BhZ2UnXSA9ICRwYWdlOwoK CQkJCSR0aGlzLT5tYXRjaGVkX3Blcm1saW5rID0gJHByZXRleHRfcmVwbGFjZW1lbnQ7CgoJ CQkJZ2xvYmFsICRwZXJtbGlua19tb2RlOwoKCQkJCWlmIChpbl9hcnJheSgkcHJlZnNbJ3Bl cm1saW5rX21vZGUnXSwgYXJyYXkoJ2lkX3RpdGxlJywgJ3NlY3Rpb25faWRfdGl0bGUnKSkg JiYgQCRwcmV0ZXh0X3JlcGxhY2VtZW50WydwZyddICYmICFAJHByZXRleHRfcmVwbGFjZW1l bnRbJ2lkJ10pIHsKCQkJCQkkcHJldGV4dF9yZXBsYWNlbWVudFsnaWQnXSA9ICcnOwoJCQkJ CSRwcmV0ZXh0X3JlcGxhY2VtZW50Wydpc19hcnRpY2xlX2xpc3QnXSA9IHRydWU7CgkJCQl9 CgoJCQkJLy8gTWVyZ2UgcHJldGV4dF9yZXBsYWNlbWVudCB3aXRoIHByZXRleHQKCQkJCSRw cmV0ZXh0ID0gYXJyYXlfbWVyZ2UoJHByZXRleHQsICRwcmV0ZXh0X3JlcGxhY2VtZW50KTsK CgkJCQlpZiAoaXNfbnVtZXJpYyhAJHByZXRleHRbJ2lkJ10pKSB7CgkJCQkJJGEgPSBzYWZl X3JvdygnKiwgdW5peF90aW1lc3RhbXAoUG9zdGVkKSBhcyB1UG9zdGVkJywgJ3RleHRwYXR0 ZXJuJywgJ0lEPScuaW50dmFsKCRwcmV0ZXh0WydpZCddKS4nIGFuZCBTdGF0dXMgPj0gNCcp OwoJCQkJCXBvcHVsYXRlQXJ0aWNsZURhdGEoJGEpOwoJCQkJfQoKCQkJCS8vIEV4cG9ydCBy ZXF1aXJlZCB2YWx1ZXMgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UKCQkJCWZvcmVhY2ggKGFy cmF5KCdpZCcsICdzJywgJ2MnLCAncGcnLCAnaXNfYXJ0aWNsZV9saXN0JywgJ3ByZXZfaWQn LCAncHJldl90aXRsZScsICduZXh0X2lkJywgJ25leHRfdGl0bGUnKSBhcyAka2V5KSB7CgkJ CQkJaWYgKGFycmF5X2tleV9leGlzdHMoJGtleSwgJHByZXRleHQpKQoJCQkJCQkkR0xPQkFM U1ska2V5XSA9ICRwcmV0ZXh0WyRrZXldOwoJCQkJfQoKCQkJCWlmIChjb3VudCgkdGhpcy0+ bWF0Y2hlZF9wZXJtbGluaykgfHwgQCRtdF9yZWRpcmVjdCkgewoJCQkJCSRwbF9pbmRleCA9 ICRwcmV0ZXh0WydwZXJtbGlua19pZCddOwoJCQkJCWlmICghQCRtdF9yZWRpcmVjdCB8fCAh JHRoaXMtPnByZWYoJ3JlZGlyZWN0X210X3N0eWxlX2xpbmtzJykpIHsKCQkJCQkJJHBsID0g JHRoaXMtPmdldF9wZXJtbGluaygkcHJldGV4dFsncGVybWxpbmtfaWQnXSk7CgkJCQkJCSRw bF9pbmRleCA9IEAkcGxbJ3NldHRpbmdzJ11bJ2Rlc19wZXJtbGluayddOwoJCQkJCX0KCgkJ CQkJaWYgKEAkcHJldGV4dFsnaWQnXSAmJiAkcGxfaW5kZXgpIHsKCQkJCQkJaWYgKGNvdW50 KCR0aGlzLT5nZXRfcGVybWxpbmsoJHBsX2luZGV4KSkgPiAwKSB7CgkJCQkJCQlvYl9jbGVh bigpOwoJCQkJCQkJZ2xvYmFsICRzaXRldXJsOwoJCQkJCQkJJHJzID0gc2FmZV9yb3coJyos IElEIGFzIHRoaXNpZCwgdW5peF90aW1lc3RhbXAoUG9zdGVkKSBhcyBwb3N0ZWQnLCAndGV4 dHBhdHRlcm4nLCAiSUQgPSAneyRwcmV0ZXh0WydpZCddfSciKTsKCQkJCQkJCSRob3N0ID0g cnRyaW0oc3RyX3JlcGxhY2UocnRyaW0oZG9TdHJpcCgkcHJldGV4dFsnc3VicGF0aCddKSwg Jy8nKSwgJycsIGh1KSwgJy8nKTsKCQkJCQkJCSR0aGlzLT5yZWRpcmVjdCgkaG9zdC4kdGhp cy0+X3Blcm1saW5rdXJsKCRycywgJHBsX2luZGV4KSwgJHRoaXMtPnByZWYoJ3Blcm1saW5r X3JlZGlyZWN0X2h0dHBfc3RhdHVzJykpOwoJCQkJCQl9CgkJCQkJfSBlbHNlIGlmICgkdXJs ID0gQCRwbFsnc2V0dGluZ3MnXVsnZGVzX2xvY2F0aW9uJ10pIHsKCQkJCQkJb2JfY2xlYW4o KTsKCQkJCQkJJHRoaXMtPnJlZGlyZWN0KCR1cmwsICR0aGlzLT5wcmVmKCd1cmxfcmVkaXJl Y3RfaHR0cF9zdGF0dXMnKSk7CgkJCQkJfQoJCQkJfQoKCQkJCWlmIChAJHByZXRleHRbJ3Jz cyddKSB7CgkJCQkJaWYgKEAkcHJldGV4dFsncyddKQoJCQkJCQkkX1BPU1RbJ3NlY3Rpb24n XSA9ICRwcmV0ZXh0WydzJ107CgkJCQkJaWYgKEAkcHJldGV4dFsnYyddKQoJCQkJCQkkX1BP U1RbJ2NhdGVnb3J5J10gPSAkcHJldGV4dFsnYyddOwoJCQkJCW9iX2NsZWFuKCk7CgkJCQkJ aW5jbHVkZSB0eHBhdGguJy9wdWJsaXNoL3Jzcy5waHAnOwoJCQkJCWV4aXQocnNzKCkpOwoJ CQkJfQoKCQkJCWlmIChAJHByZXRleHRbJ2F0b20nXSkgewoJCQkJCWlmIChAJHByZXRleHRb J3MnXSkKCQkJCQkJJF9QT1NUWydzZWN0aW9uJ10gPSAkcHJldGV4dFsncyddOwoJCQkJCWlm IChAJHByZXRleHRbJ2MnXSkKCQkJCQkJJF9QT1NUWydjYXRlZ29yeSddID0gJHByZXRleHRb J2MnXTsKCQkJCQlvYl9jbGVhbigpOwoJCQkJCWluY2x1ZGUgdHhwYXRoLicvcHVibGlzaC9h dG9tLnBocCc7CgkJCQkJZXhpdChhdG9tKCkpOwoJCQkJfQoKCQkJCSR0aGlzLT5kZWJ1Zygn UHJldGV4dCAnLnByaW50X3IoJHByZXRleHQsIDEpKTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlz LT5kZWJ1ZygnTk8gQ0hBTkdFUyBNQURFJyk7CgkJCX0KCgkJCS8vIExvZyB0aGlzIHBhZ2Ug aGl0CgkJCWlmIChAJG9yZ2luaWFsX3N0YXR1cyA9PSA0MDQpCgkJCQlsb2dfaGl0KCRwcmV0 ZXh0WydzdGF0dXMnXSk7CgoJCQkvLyBTdGFydCBvdXRwdXQgYnVmZmVyaW5nIGFuZCBwc2V1 ZG8gY2FsbGJhY2sgdG8gdGV4dHBhdHRlcm5fZW5kCgkJCW9iX3N0YXJ0KGFycmF5KCYkdGhp cywgJ190ZXh0cGF0dGVybl9lbmRfY2FsbGJhY2snKSk7CgoJCQkvLyBUeFAgNC4wLjUgKHIy NDM2KSBpbnRyb2R1Y2VkIHRoZSB0ZXh0cGF0dGVybl9lbmQgY2FsbGJhY2sgbWFraW5nIHRo ZSBmb2xsb3dpbmcgcmVkdW5kYW50CgkJCSR2ZXJzaW9uID0gYXJyYXlfc3VtKGFycmF5X21h cCgKCQkJCWNyZWF0ZV9mdW5jdGlvbignJGxpbmUnLCAnaWYgKHByZWdfbWF0Y2goXCcvXlwk Jy4nTGFzdENoYW5nZWRSZXZpc2lvbjogKFx3KykgXCQvXCcsICRsaW5lLCAkbWF0Y2gpKSBy ZXR1cm4gJG1hdGNoWzFdOycpLAoJCQkJQGZpbGUodHhwYXRoIC4gJy9wdWJsaXNoLnBocCcp CgkJCSkpOwoJCQlpZiAoJHZlcnNpb24gPj0gJzI0MzYnKSByZXR1cm47CgoJCQkvLyBSZW1v dmUgdGhlIHBsdWdpbiBjYWxsYmFja3Mgd2hpY2ggaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVk CgkJCWZ1bmN0aW9uIGZpbHRlcl9jYWxsYmFja3MoJGMpIHsKCQkJCWlmICgkY1snZXZlbnQn XSE9J3RleHRwYXR0ZXJuJykgcmV0dXJuIHRydWU7CgkJCQlpZiAoQCRjWydmdW5jdGlvbidd WzBdLT5wbHVnaW5fbmFtZSA9PSAnZ2JwX3Blcm1hbmVudF9saW5rcycgJiYKCQkJCQkJQCRj WydmdW5jdGlvbiddWzFdID09ICdfdGV4dHBhdHRlcm4nKQoJCQkJewoJCQkJCSRHTE9CQUxT WydnYnBfZm91bmRfc2VsZiddID0gdHJ1ZTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJ CQlyZXR1cm4gQCRHTE9CQUxTWydnYnBfZm91bmRfc2VsZiddOwoJCQl9CgkJCSRwbHVnaW5f Y2FsbGJhY2sgPSBhcnJheV9maWx0ZXIoJHBsdWdpbl9jYWxsYmFjaywgJ2ZpbHRlcl9jYWxs YmFja3MnKTsKCQkJdW5zZXQoJEdMT0JBTFNbJ2dicF9mb3VuZF9zZWxmJ10pOwoKCQkJLy8g UmUtY2FsbCB0ZXh0cGF0dGVybgoJCQl0ZXh0cGF0dGVybigpOwoKCQkJLy8gQ2FsbCBjdXN0 b20gdGV4dHBhdHRlcm5fZW5kIGNhbGxiYWNrCgkJCSR0aGlzLT5fdGV4dHBhdHRlcm5fZW5k KCk7CgoJCQkvLyB0ZXh0cGF0dGVybigpIGhhcyBydW4sIGtpbGwgdGhlIGNvbm5lY3Rpb24K CQkJZGllKCk7CgkJfQoKCX0gLy8gZnVuY3Rpb24gX3RleHRwYXR0ZXJuIGVuZAoKCWZ1bmN0 aW9uIF90ZXh0cGF0dGVybl9lbmQgKCkgewoJCS8vIFJlZGlyZWN0IHRvIGEgNDA0IGlmIHRo ZSBwYWdlIG51bWJlciBpcyBncmVhdGVyIHRoYW4gdGhlIG1heCBudW1iZXIgb2YgcGFnZXMK CQkvLyBIYXMgdG8gYmUgYWZ0ZXIgdGV4dHBhdHRlcm4oKSBhcyAkdGhpc3BhZ2UgaXMgc2V0 IGR1cmluZyA8dHhwOmFydGljbGUgLz4KCQlnbG9iYWwgJHRoaXNwYWdlLCAkcHJldGV4dDsK CQlpZiAoKEAkcHJldGV4dFsncGcnXSAmJiBpc3NldCgkdGhpc3BhZ2UpKSAmJgoJCSgkdGhp c3BhZ2VbJ251bVBhZ2VzJ10gPCAkcHJldGV4dFsncGcnXSkpIHsKCQkJb2JfZW5kX2NsZWFu KCk7CgkJCXR4cF9kaWUoZ1R4dCgnNDA0X25vdF9mb3VuZCcpLCAnNDA0Jyk7CgkJfQoKCQkv LyBTdG9wIG91dHB1dCBidWZmZXJpbmcsIHRoaXMgc2VuZHMgdGhlIGJ1ZmZlciB0byBfdGV4 dHBhdHRlcm5fZW5kX2NhbGxiYWNrKCkKCQl3aGlsZSAoQG9iX2VuZF9mbHVzaCgpKTsKCgl9 IC8vIGZ1bmN0aW9uIF90ZXh0cGF0dGVybl9lbmQgZW5kCgoJZnVuY3Rpb24gX3RleHRwYXR0 ZXJuX2VuZF9jYWxsYmFjayAoJGh0bWwsICRvdmVycmlkZSA9ICcnKSB7CgkJZ2xvYmFsICRw cmV0ZXh0LCAkcHJvZHVjdGlvbl9zdGF0dXM7CgoJCWlmICgkb3ZlcnJpZGUpICRwcmV0ZXh0 WydwZXJtbGlua19vdmVycmlkZSddID0gJG92ZXJyaWRlOwoJCSRodG1sID0gcHJlZ19yZXBs YWNlX2NhbGxiYWNrKAoJCQknJWhyZWY9IignLmh1Lid8XD8pKFteIl0qKSIlJywKCQkJYXJy YXkoJiR0aGlzLCAnX3BhZ2VsaW5rdXJsJyksCgkJCSRodG1sCgkJKTsKCQl1bnNldCgkcHJl dGV4dFsncGVybWxpbmtfb3ZlcnJpZGUnXSk7CgoJCWlmICgkdGhpcy0+cHJlZignZGVidWcn KSAmJiBpbl9hcnJheSgkcHJvZHVjdGlvbl9zdGF0dXMsIGFycmF5KCdkZWJ1ZycsICd0ZXN0 aW5nJykpKSB7CgkJCSRkZWJ1ZyA9IGpvaW4obiwgJHRoaXMtPmJ1ZmZlcl9kZWJ1Zyk7CgkJ CSR0aGlzLT5idWZmZXJfZGVidWcgPSBhcnJheSgpOwoJCQlpZiAoJGRlYnVnKQoJCQkJJGh0 bWwgPSBjb21tZW50KG4uJGRlYnVnLm4pIC4gJGh0bWw7CgkJfQoKCQlyZXR1cm4gJGh0bWw7 Cgl9IC8vIGZ1bmN0aW9uIF90ZXh0cGF0dGVybl9lbmRfY2FsbGJhY2sgZW5kCgoJZnVuY3Rp b24gY2hlY2tfcGVybWxpbmtfY29uZGl0aW9ucyAoJHBsLCAkYXJ0aWNsZV9hcnJheSkgewoJ CWlmIChlbXB0eSgkYXJ0aWNsZV9hcnJheVsnc2VjdGlvbiddKSkgJGFydGljbGVfYXJyYXlb J3NlY3Rpb24nXSA9IEAkYXJ0aWNsZV9hcnJheVsnU2VjdGlvbiddOwoJCWlmIChlbXB0eSgk YXJ0aWNsZV9hcnJheVsnY2F0ZWdvcnkxJ10pKSAkYXJ0aWNsZV9hcnJheVsnY2F0ZWdvcnkx J10gPSBAJGFydGljbGVfYXJyYXlbJ0NhdGVnb3J5MSddOwoJCWlmIChlbXB0eSgkYXJ0aWNs ZV9hcnJheVsnY2F0ZWdvcnkyJ10pKSAkYXJ0aWNsZV9hcnJheVsnY2F0ZWdvcnkyJ10gPSBA JGFydGljbGVfYXJyYXlbJ0NhdGVnb3J5MiddOwoKCQlpZiAoQCRwbFsnc2V0dGluZ3MnXVsn Y29uX2NhdGVnb3J5J10gJiYgKCRwbFsnc2V0dGluZ3MnXVsnY29uX2NhdGVnb3J5J10gIT0g JGFydGljbGVfYXJyYXlbJ2NhdGVnb3J5MSddIHx8ICRwbFsnc2V0dGluZ3MnXVsnY29uX2Nh dGVnb3J5J10gIT0gJGFydGljbGVfYXJyYXlbJ2NhdGVnb3J5MiddKSkKCQkJcmV0dXJuIGZh bHNlOwoJCWlmIChAJHBsWydzZXR0aW5ncyddWydjb25fc2VjdGlvbiddICYmICRwbFsnc2V0 dGluZ3MnXVsnY29uX3NlY3Rpb24nXSAhPSAkYXJ0aWNsZV9hcnJheVsnc2VjdGlvbiddKQoJ CQlyZXR1cm4gZmFsc2U7CgoJCXJldHVybiB0cnVlOwoJfQoKCWZ1bmN0aW9uIF9wZXJtbGlu a3VybCAoJGFydGljbGVfYXJyYXksICRwbF9pbmRleCA9IE5VTEwpIHsKCQlnbG9iYWwgJHBy ZXRleHQsICRwcmVmcywgJHByb2R1Y3Rpb25fc3RhdHVzOwoKCQlpZiAoZW1wdHkoJGFydGlj bGVfYXJyYXkpKSByZXR1cm47CgoJCWlmICgkcGxfaW5kZXgpCgkJCSRwbCA9ICR0aGlzLT5n ZXRfcGVybWxpbmsoJHBsX2luZGV4KTsKCQllbHNlIHsKCQkJLy8gR2V0IHRoZSBtYXRjaGVk IHByZXRleHQgcmVwbGFjZW1lbnQgYXJyYXkuCgkJCSRtYXRjaGVkID0gKGNvdW50KCR0aGlz LT5tYXRjaGVkX3Blcm1saW5rKSkKCQkJPyAkdGhpcy0+bWF0Y2hlZF9wZXJtbGluawoJCQk6 IEBhcnJheV9zaGlmdChhcnJheV9zbGljZSgkdGhpcy0+cGFydGlhbF9tYXRjaGVzLCAtMSkp OwoKCQkJaWYgKCFpc3NldCgkcGwpICYmICRtYXRjaGVkICYmIGFycmF5X2tleV9leGlzdHMo J2lkJywgJG1hdGNoZWQpKSB7CgkJCQkvLyBUaGUgcGVybWxpbmsgaWQgaXMgc3RvcmVkIGlu IHRoZSBwcmV0ZXh0IHJlcGxhY2VtZW50IGFycmF5LCBzbyB3ZSBjYW4gZmluZCB0aGUgcGVy bWxpbmsuCgkJCQkkcGwgPSAkdGhpcy0+Z2V0X3Blcm1saW5rKCRtYXRjaGVkWydwZXJtbGlu a19pZCddKTsKCQkJCWZvcmVhY2ggKCRwbFsnY29tcG9uZW50cyddIGFzICRwbF9jKQoJCQkJ CWlmIChpbl9hcnJheSgkcGxfY1sndHlwZSddLCBhcnJheSgnZmVlZCcsICdwYWdlJykpIHx8 ICEkdGhpcy0+Y2hlY2tfcGVybWxpbmtfY29uZGl0aW9ucygkcGwsICRhcnRpY2xlX2FycmF5 KSkgewoJCQkJCQl1bnNldCgkcGwpOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCX0KCgkJCWlm ICghaXNzZXQoJHBsKSkgewoJCQkJLy8gV2UgaGF2ZSBubyBwZXJtbGluayBpZCBzbyBncmFi IHRoZSBwZXJtbGluayB3aXRoIHRoZSBoaWdoZXN0IHByZWNlZGVuY2UuCgkJCQkkcGVybWxp bmtzID0gJHRoaXMtPmdldF9hbGxfcGVybWxpbmtzKDEsIGFycmF5KCdmZWVkJywgJ3BhZ2Un KSk7CgkJCQlmb3JlYWNoICgkcGVybWxpbmtzIGFzICRrZXkgPT4gJHBsKQoJCQkJCWlmICgh JHRoaXMtPmNoZWNrX3Blcm1saW5rX2NvbmRpdGlvbnMoJHBsLCAkYXJ0aWNsZV9hcnJheSkp CgkJCQkJCXVuc2V0KCRwZXJtbGlua3NbJGtleV0pOwoJCQkJJHBsID0gYXJyYXlfc2hpZnQo JHBlcm1saW5rcyk7CgkJCX0KCQl9CgoJCSR1cmkgPSAnJzsKCgkJaWYgKGlzX2FycmF5KCRw bCkgJiYgYXJyYXlfa2V5X2V4aXN0cygnY29tcG9uZW50cycsICRwbCkpIHsKCQkJZXh0cmFj dCgkYXJ0aWNsZV9hcnJheSk7CgoJCQlpZiAoIWlzc2V0KCR0aXRsZSkpICR0aXRsZSA9ICRU aXRsZTsKCQkJaWYgKGVtcHR5KCR1cmxfdGl0bGUpKSAkdXJsX3RpdGxlID0gc3RyaXBTcGFj ZSgkdGl0bGUpOwoJCQlpZiAoZW1wdHkoJHNlY3Rpb24pKSAkc2VjdGlvbiA9ICRTZWN0aW9u OwoJCQlpZiAoZW1wdHkoJHBvc3RlZCkpICRwb3N0ZWQgPSAkUG9zdGVkOwoJCQlpZiAoZW1w dHkoJGF1dGhvcmlkKSkgJGF1dGhvcmlkID0gQCRBdXRob3JJRDsKCQkJaWYgKGVtcHR5KCRj YXRlZ29yeTEpKSAkY2F0ZWdvcnkxID0gQCRDYXRlZ29yeTE7CgkJCWlmIChlbXB0eSgkY2F0 ZWdvcnkyKSkgJGNhdGVnb3J5MiA9IEAkQ2F0ZWdvcnkyOwoJCQlpZiAoZW1wdHkoJHRoaXNp ZCkpICR0aGlzaWQgPSAkSUQ7CgoJCQkkcGxfY29tcG9uZW50cyA9ICRwbFsnY29tcG9uZW50 cyddOwoKCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgdGl0bGUgY29tcG9uZW50 LgoJCQkkdGl0bGUgPSBmYWxzZTsKCQkJZm9yZWFjaCgkcGxfY29tcG9uZW50cyBhcyAkcGxf YykKCQkJCWlmICgkcGxfY1sndHlwZSddID09ICd0aXRsZScgfHwgJHBsX2NbJ3R5cGUnXSA9 PSAnaWQnKQoJCQkJCSR0aXRsZSA9IHRydWU7CgoJCQkvLyBJZiB0aGVyZSBpc24ndCBhIHRp dGxlIGNvbXBvbmVudCB0aGVuIHdlIG5lZWQgdG8gYXBwZW5kIG9uZSB0byB0aGUgZW5kIG9m IHRoZSBVUkkKCQkJaWYgKCEkdGl0bGUgJiYgJHRoaXMtPnByZWYoJ2F1dG9tYXRpY2FsbHlf YXBwZW5kX3RpdGxlJykpCgkJCQkkcGxfY29tcG9uZW50c1tdID0gYXJyYXkoJ3R5cGUnID0+ ICd0aXRsZScsICdwcmVmaXgnID0+ICcnLCAnc3VmZml4JyA9PiAnJywgJ3JlZ2V4JyA9PiAn JywgJ3RleHQnID0+ICcnKTsKCgkJCSR1cmkgPSBydHJpbShkb1N0cmlwKEAkcHJldGV4dFsn c3VicGF0aCddKSwgJy8nKTsKCQkJZm9yZWFjaCAoJHBsX2NvbXBvbmVudHMgYXMgJHBsX2Mp IHsKCQkJCSR1cmkgLj0gJy8nOwoKCQkJCSR0eXBlID0gJHBsX2NbJ3R5cGUnXTsKCQkJCXN3 aXRjaCAoJHR5cGUpIHsKCQkJCQljYXNlICdjYXRlZ29yeSc6CgkJCQkJCWlmICghQCRwbF9j WydjYXRlZ29yeSddKSAkcGxfY1snY2F0ZWdvcnknXSA9IDE7CgkJCQkJCSRwcmltYXJ5ID0g J2NhdGVnb3J5Jy4gJHBsX2NbJ2NhdGVnb3J5J107CgkJCQkJCSRzZWNvbmRhcnkgPSAnY2F0 ZWdvcnknLiAoMy0oaW50KSRwbF9jWydjYXRlZ29yeSddKTsKCQkJCQkJaWYgKCR1cmlfYyA9 ICQkcHJpbWFyeSk7CgkJCQkJCWVsc2UgaWYgKCR1cmlfYyA9ICQkc2Vjb25kYXJ5KTsKCQkJ CQkJZWxzZSBpZiAoJHRoaXMtPnByZWYoJ2RlYnVnJykgJiYgaW5fYXJyYXkoJHByb2R1Y3Rp b25fc3RhdHVzLCBhcnJheSgnZGVidWcnLCAndGVzdGluZycpKSkKCQkJCQkJCSR1cmlfYyA9 ICctLUlOVkFMSURfQ0FURUdPUlktLSc7CgkJCQkJCWVsc2UgewoJCQkJCQkJdW5zZXQoJHVy aSk7CgkJCQkJCQlicmVhayAyOwoJCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnc2Vj dGlvbic6ICR1cmlfYyA9ICRzZWN0aW9uOyBicmVhazsKCQkJCQljYXNlICd0aXRsZSc6ICR1 cmlfYyA9ICR1cmxfdGl0bGU7IGJyZWFrOwoJCQkJCWNhc2UgJ2lkJzogJHVyaV9jID0gJHRo aXNpZDsgYnJlYWs7CgkJCQkJY2FzZSAnYXV0aG9yJzogJHVyaV9jID0gc2FmZV9maWVsZCgn UmVhbE5hbWUnLCAndHhwX3VzZXJzJywgIm5hbWUgbGlrZSAneyRhdXRob3JpZH0nIik7IGJy ZWFrOwoJCQkJCWNhc2UgJ2xvZ2luJzogJHVyaV9jID0gJGF1dGhvcmlkOyBicmVhazsKCQkJ CQljYXNlICdkYXRlJzogJHVyaV9jID0gZXhwbG9kZSgnLycsIGRhdGUoJ1kvbS9kJywgJHBv c3RlZCkpOyBicmVhazsKCQkJCQljYXNlICd5ZWFyJzogJHVyaV9jID0gZGF0ZSgnWScsICRw b3N0ZWQpOyBicmVhazsKCQkJCQljYXNlICdtb250aCc6ICR1cmlfYyA9IGRhdGUoJ20nLCAk cG9zdGVkKTsgYnJlYWs7CgkJCQkJY2FzZSAnZGF5JzogJHVyaV9jID0gZGF0ZSgnZCcsICRw b3N0ZWQpOyBicmVhazsKCQkJCQljYXNlICdjdXN0b20nOgoJCQkJCQlpZiAoJHVyaV9jID0g QCRhcnRpY2xlX2FycmF5WyRwcmVmc1siY3VzdG9tX3skcGxfY1snY3VzdG9tJ119X3NldCJd XSk7CgkJCQkJCWVsc2UgaWYgKCR1cmlfYyA9IEAkYXJ0aWNsZV9hcnJheVsiY3VzdG9tX3sk cGxfY1snY3VzdG9tJ119Il0pOwoJCQkJCQllbHNlIGlmICgkdGhpcy0+cHJlZignZGVidWcn KSAmJiBpbl9hcnJheSgkcHJvZHVjdGlvbl9zdGF0dXMsIGFycmF5KCdkZWJ1ZycsICd0ZXN0 aW5nJykpKQoJCQkJCQkJJHVyaV9jID0gJy0tVU5TRVRfQ1VTVE9NX0ZJRUxELS0nOwoJCQkJ CQllbHNlIHsKCQkJCQkJCXVuc2V0KCR1cmkpOwoJCQkJCQkJYnJlYWsgMjsKCQkJCQkJfQoJ CQkJCWJyZWFrOwoJCQkJCWNhc2UgJ3RleHQnOiAkdXJpX2MgPSAkcGxfY1sndGV4dCddOyBi cmVhazsKCQkJCQljYXNlICdyZWdleCc6CgkJCQkJCS8vIENoZWNrIHRvIHNlZSBpZiByZWdl eCBpcyB2YWxpZCB3aXRob3V0IG91dHB1dHRpbmcgZXJyb3IgbWVzc2FnZXMuCgkJCQkJCW9i X3N0YXJ0KCk7CgkJCQkJCXByZWdfbWF0Y2goJHBsX2NbJ3JlZ2V4J10sICRwbF9jWydyZWdl eCddLCAkcmVnZXhfbWF0Y2hlcyk7CgkJCQkJCSRpc192YWxpZF9yZWdleCA9ICEob2JfZ2V0 X2NsZWFuKCkpOwoJCQkJCQlpZiAoJGlzX3ZhbGlkX3JlZ2V4KSB7CgkJCQkJCQkka2V5ID0g InBlcm1saW5rX3JlZ2V4X3skcGxfY1snbmFtZSddfSI7CgkJCQkJCQkkdXJpX2MgPSAoYXJy YXlfa2V5X2V4aXN0cygka2V5LCAkcHJldGV4dCkpID8gJHByZXRleHRbJGtleV0gOiAkcmVn ZXhfbWF0Y2hlc1swXTsKCQkJCQkJfSBlbHNlIGlmICgkdGhpcy0+cHJlZignZGVidWcnKSkK CQkJCQkJCSR1cmlfYyA9ICctLUlOVkFMSURfUkVHRVgtLSc7CgkJCQkJYnJlYWs7CgkJCQl9 CgoJCQkJaWYgKGVtcHR5KCR1cmlfYykpCgkJCQkJaWYgKCR0aGlzLT5wcmVmKCdkZWJ1Zycp ICYmIGluX2FycmF5KCRwcm9kdWN0aW9uX3N0YXR1cywgYXJyYXkoJ2RlYnVnJywgJ3Rlc3Rp bmcnKSkpCgkJCQkJCSR1cmlfYyA9ICctLVBFUk1MSU5LX0ZPUk1BVF9FUlJPUi0tJzsKCQkJ CQllbHNlIHsKCQkJCQkJdW5zZXQoJHVyaSk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCgkJCQlp ZiAoQCRwbF9jWydwcmVmaXgnXSkKCQkJCQkkdXJpIC49ICR0aGlzLT5lbmNvZGVfdXJsKCRw bF9jWydwcmVmaXgnXSk7CgoJCQkJaWYgKGlzX2FycmF5KCR1cmlfYykpIHsKCQkJCQlmb3Jl YWNoICgkdXJpX2MgYXMgJHVyaV9jMikKCQkJCQkJJHVyaSAuPSAkdGhpcy0+ZW5jb2RlX3Vy bCgkdXJpX2MyKSAuICcvJzsKCQkJCQkkdXJpID0gcnRyaW0oJHVyaSwgJy8nKTsKCQkJCX0g ZWxzZQoJCQkJCSR1cmkgLj0gJHRoaXMtPmVuY29kZV91cmwoJHVyaV9jKTsKCgkJCQlpZiAo QCRwbF9jWydzdWZmaXgnXSkKCQkJCQkkdXJpIC49ICR0aGlzLT5lbmNvZGVfdXJsKCRwbF9j WydzdWZmaXgnXSk7CgoJCQkJdW5zZXQoJHVyaV9jKTsKCQkJfQoKCQkJaWYgKGlzc2V0KCR1 cmkpKQoJCQkJJHVyaSAuPSAnLyc7CgkJfQoKCQlpZiAoJHVyaV9lbXB0eSA9IGVtcHR5KCR1 cmkpKSB7CgkJCS8vIEl0IGlzIHBvc3NpYmxlIHRoZSB1cmkgaXMgc3RpbGwgZW1wdHkgaWYg dGhlcmUgaXMgbm8gbWF0Y2ggb3IgaWYgd2UncmUgdXNpbmcKCQkJLy8gc3RyaWN0IG1hdGNo aW5nIGlmIHNvIHRyeSB0aGUgZGVmYXVsdCBwZXJtbGluayBtb2RlLgoJCQkkdXJpID0gJHRo aXMtPnRvZ2dsZV9wZXJtbGlua19tb2RlKCdwZXJtbGlua3VybCcsICRhcnRpY2xlX2FycmF5 KTsKCQl9CgoJCWlmICgkdGhpcy0+cHJlZignb21pdF90cmFpbGluZ19zbGFzaCcpKQoJCQkk dXJpID0gcnRyaW0oJHVyaSwgJy8nKTsKCgkJaWYgKCEkdXJpX2VtcHR5ICYmIGluX2FycmF5 KHR4cGF0aC4nL3B1Ymxpc2gvcnNzLnBocCcsIGdldF9pbmNsdWRlZF9maWxlcygpKSB8fCBp bl9hcnJheSh0eHBhdGguJy9wdWJsaXNoL2F0b20ucGhwJywgZ2V0X2luY2x1ZGVkX2ZpbGVz KCkpKSB7CgkJCSRob3N0ID0gcnRyaW0oc3RyX3JlcGxhY2UocnRyaW0oZG9TdHJpcChAJHBy ZXRleHRbJ3N1YnBhdGgnXSksICcvJyksICcnLCBodSksICcvJyk7CgkJCSR1cmkgPSAkaG9z dCAuICR1cmk7CgkJfQoKCQlyZXR1cm4gKCR0aGlzLT5wcmVmKCdmb3JjZV9sb3dlcmNhc2Vf dXJscycpKSA/IHN0cnRvbG93ZXIoJHVyaSkgOiAkdXJpOwoJfQoKCWZ1bmN0aW9uIF9wYWdl bGlua3VybCAoJHBhcnRzKSB7CgkJZXh0cmFjdChsQXR0cyhhcnJheSgKCQkJJ3BhdGgnCQk9 PiAnaW5kZXgucGhwJywKCQkJJ3F1ZXJ5JwkJPT4gJycsCgkJCSdmcmFnbWVudCcJPT4gJycs CgkJKSwgcGFyc2VfdXJsKGh0bWxfZW50aXR5X2RlY29kZShzdHJfcmVwbGFjZSgnJiMzODsn LCAnJicsICRwYXJ0c1syXSkpKSkpOwoKCQkvLyBUaWR5IHVwIGxpbmtzIGJhY2sgdG8gdGhl IHNpdGUgaG9tZXBhZ2UKCQlpZiAoJHBhdGggPT0gJ2luZGV4LnBocCcgJiYgZW1wdHkoJHF1 ZXJ5KSkKCQkJcmV0dXJuICdocmVmPSInIC5odS4gJyInOwoKCQkvLyBGaXggbWF0Y2hlcyBs aWtlIGhyZWY9Ij9zPWZvbyIKCQllbHNlIGlmICgkcGF0aCAmJiBlbXB0eSgkcXVlcnkpICYm ICRwYXJ0c1sxXSA9PSAnPycpIHsKCQkJJHF1ZXJ5ID0gJHBhdGg7CgkJCSRwYXRoID0gJ2lu ZGV4LnBocCc7CgkJfQoKCQkvLyBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgcXVlcnkgdG8g d29yayB3aXRoLgoJCWVsc2UgaWYgKGVtcHR5KCRxdWVyeSkgfHwgJHBhdGggIT0gJ2luZGV4 LnBocCcgfHwgc3RycG9zKCRxdWVyeSwgJy8nKSA9PT0gdHJ1ZSkKCQkJcmV0dXJuICRwYXJ0 c1swXTsKCgkJLy8gJyZhbXA7JyB3aWxsIGJyZWFrIHBhcnNlX3N0cigpIGlmIHRoZXkgYXJl IGZvdW5kIGluIGEgcXVlcnkgc3RyaW5nCgkJJHF1ZXJ5ID0gc3RyX3JlcGxhY2UoJyZhbXA7 JywgJyYnLCAkcXVlcnkpOwoKCQlpZiAoJGZyYWdtZW50KQoJCQkkZnJhZ21lbnQgPSAnIycu JGZyYWdtZW50OwoKCQlnbG9iYWwgJHByZXRleHQ7CgkJcGFyc2Vfc3RyKCRxdWVyeSwgJHF1 ZXJ5X3BhcnQpOwoJCWlmICghYXJyYXlfa2V5X2V4aXN0cygncGcnLCAkcXVlcnlfcGFydCkp CgkJCSRxdWVyeV9wYXJ0WydwZyddID0gMDsKCQlpZiAoIWFycmF5X2tleV9leGlzdHMoJ2lk JywgJHF1ZXJ5X3BhcnQpKQoJCQkkcXVlcnlfcGFydFsnaWQnXSA9IDA7CgkJaWYgKCFhcnJh eV9rZXlfZXhpc3RzKCdyc3MnLCAkcXVlcnlfcGFydCkpCgkJCSRxdWVyeV9wYXJ0Wydyc3Mn XSA9IDA7CgkJaWYgKCFhcnJheV9rZXlfZXhpc3RzKCdhdG9tJywgJHF1ZXJ5X3BhcnQpKQoJ CQkkcXVlcnlfcGFydFsnYXRvbSddID0gMDsKCQlpZiAoJHRoaXMtPnByZWYoJ2pvaW5fcHJl dGV4dF90b19wYWdlbGlua3MnKSkKCQkJZXh0cmFjdChhcnJheV9tZXJnZSgkcHJldGV4dCwg JHF1ZXJ5X3BhcnQpKTsKCQllbHNlCgkJCWV4dHJhY3QoJHF1ZXJ5X3BhcnQpOwoKCQkvLyBX ZSBoYXZlIGEgaWQsIHBhc3MgdG8gcGVybWxpbmt1cmwoKQoJCWlmICgkaWQpIHsKCQkJaWYg KEAkcyA9PSAnZmlsZV9kb3dubG9hZCcpIHsKCQkJCSR1cmwgPSAkdGhpcy0+dG9nZ2xlX3Bl cm1saW5rX21vZGUoJ2ZpbGVkb3dubG9hZHVybCcsICRpZCk7CgkJCX0gZWxzZSB7CgkJCQkk cnMgPSBzYWZlX3JvdygnKiwgSUQgYXMgdGhpc2lkLCB1bml4X3RpbWVzdGFtcChQb3N0ZWQp IGFzIHBvc3RlZCcsICd0ZXh0cGF0dGVybicsICJJRCA9ICd7JGlkfSciKTsKCQkJCSR1cmwg PSAkdGhpcy0+X3Blcm1saW5rdXJsKCRycykgLiAkZnJhZ21lbnQ7CgkJCX0KCQkJcmV0dXJu ICdocmVmPSInLiAkdXJsIC4nIic7CgkJfQoKCQlpZiAoQCRzID09ICdkZWZhdWx0JykKCQkJ dW5zZXQoJHMpOwoKCQkvLyBTb21lIFR4UCB0YWdzLCBlLmcuIDx0eHA6ZmVlZF9saW5rIC8+ IHVzZSAnc2VjdGlvbicgb3IgJ2NhdGVnb3J5JyBpbmNvbnNpc3RlbnQKCQkvLyB3aXRoIG1v c3Qgb3RoZXIgdGFncy4gUHJvY2VzcyB0aGVzZSBub3cgc28gd2Ugb25seSBoYXZlIHRvIGNo ZWNrICRzIGFuZCAkYy4KCQlpZiAoQCRzZWN0aW9uICYmICEkcykKCQkJJHMgPSAkc2VjdGlv bjsKCQlpZiAoQCRjYXRlZ29yeSAmJiAhJGMpCgkJCSRjID0gJGNhdGVnb3J5OwoKCQkvLyBE ZWJ1Z2dpbmcgZm9yIGJ1ZmZlcnMKCQkkdGhpcy0+YnVmZmVyX2RlYnVnW10gPSAndXJsOiAn LnN0cl9yZXBsYWNlKCcmYW1wOycsICcmJywgJHBhcnRzWzFdLiRwYXJ0c1syXSk7CgkJJHRo aXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ3BhdGg6ICcuJHBhdGg7CgkJJHRoaXMtPmJ1ZmZlcl9k ZWJ1Z1tdID0gJ3F1ZXJ5OiAnLiRxdWVyeTsKCQlpZiAoJGZyYWdtZW50KSAkdGhpcy0+YnVm ZmVyX2RlYnVnW10gPSAnZnJhZ21lbnQ6ICcuJGZyYWdtZW50OwoKCQlpZiAoQCRpZCkgJHRo aXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ2lkOiAnLiRpZDsKCQlpZiAoQCRzKSAkdGhpcy0+YnVm ZmVyX2RlYnVnW10gPSAnczogJy4kczsKCQlpZiAoQCRjKSAkdGhpcy0+YnVmZmVyX2RlYnVn W10gPSAnYzogJy4kYzsKCQlpZiAoQCRyc3MpICR0aGlzLT5idWZmZXJfZGVidWdbXSA9ICdy c3M6ICcuJHJzczsKCQlpZiAoQCRhdG9tKSAkdGhpcy0+YnVmZmVyX2RlYnVnW10gPSAnYXRv bTogJy4kYXRvbTsKCQlpZiAoQCRwZykgJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ3BnOiAn LiRwZzsKCQlpZiAoQCRxKSAkdGhpcy0+YnVmZmVyX2RlYnVnW10gPSAncTogJy4kcTsKCgkJ aWYgKEAkcHJldGV4dFsncGVybWxpbmtfb3ZlcnJpZGUnXSkgewoJCQkkb3ZlcnJpZGVfaWRz ID0gZXhwbG9kZSgnLCcsICRwcmV0ZXh0WydwZXJtbGlua19vdmVycmlkZSddKTsKCQkJZm9y ZWFjaCAoJG92ZXJyaWRlX2lkcyBhcyAkb3ZlcnJpZGVfaWQpIHsKCQkJCSRwbCA9ICR0aGlz LT5nZXRfcGVybWxpbmsoJG92ZXJyaWRlX2lkKTsKCQkJCWlmIChjb3VudCgkcGwpID4gMCkg JHBlcm1saW5rc1tdID0gJHBsOwoJCQl9CgkJfQoKCQlpZiAoZW1wdHkoJHBlcm1saW5rcykp IHsKCQkJJHBlcm1saW5rcyA9ICR0aGlzLT5nZXRfYWxsX3Blcm1saW5rcygxKTsKCgkJCSRw ZXJtbGlua3NbJ2dicF9wZXJtYW5lbnRfbGlua3NfZGVmYXVsdCddID0gYXJyYXkoCgkJCQkn Y29tcG9uZW50cycgPT4gYXJyYXkoCgkJCQkJYXJyYXkoJ3R5cGUnID0+ICd0ZXh0JywgJ3Rl eHQnID0+IHN0cnRvbG93ZXIodXJsZW5jb2RlKGdUeHQoJ2NhdGVnb3J5JykpKSksCgkJCQkJ YXJyYXkoJ3R5cGUnID0+ICdjYXRlZ29yeScpLAoJCQkJKSwKCQkJCSdzZXR0aW5ncycgPT4g YXJyYXkoCgkJCQkJJ3BsX25hbWUnID0+ICdnYnBfcGVybWFuZW50X2xpbmtzX2RlZmF1bHQn LCAncGxfcHJlY2VkZW5jZScgPT4gJycsICdwbF9wcmV2aWV3JyA9PiAnJywKCQkJCQknY29u X3NlY3Rpb24nID0+ICcnLCAnY29uX2NhdGVnb3J5JyA9PiAnJywgJ2Rlc19zZWN0aW9uJyA9 PiAnJywgJ2Rlc19jYXRlZ29yeScgPT4gJycsCgkJCQkJJ2Rlc19wZXJtbGluaycgPT4gJycs ICdkZXNfZmVlZCcgPT4gJycsICdkZXNfbG9jYXRpb24nID0+ICcnLAoJCQkpKTsKCQl9CgoJ CSRoaWdoZXN0X21hdGNoX2NvdW50ID0gbnVsbDsKCQlmb3JlYWNoICgkcGVybWxpbmtzIGFz ICRrZXkgPT4gJHBsKSB7CgkJCSR0aGlzLT5idWZmZXJfZGVidWdbXSA9ICdUZXN0aW5nIHBl cm1saW5rOiAnLiAkcGxbJ3NldHRpbmdzJ11bJ3BsX25hbWUnXSAuJyAtICcuICRrZXk7CgkJ CSR0aGlzLT5idWZmZXJfZGVidWdbXSA9ICdQcmV2aWV3OiAnLiAkcGxbJ3NldHRpbmdzJ11b J3BsX3ByZXZpZXcnXTsKCQkJJG91dCA9IGFycmF5KCk7ICRtYXRjaF9jb3VudCA9IDA7CgkJ CWZvcmVhY2ggKCRwbFsnY29tcG9uZW50cyddIGFzICRwbF9jKSB7CgkJCQlzd2l0Y2ggKCRw bF9jWyd0eXBlJ10pIHsKCQkJCQljYXNlICd0ZXh0JzoKCQkJCQkJJG91dFtdID0gJHBsX2Nb J3RleHQnXTsKCQkJCQkJJG1hdGNoX2NvdW50LS07CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAn cmVnZXgnOgoJCQkJCQkkb3V0W10gPSAkcHJldGV4dFsncGVybWxpbmtfcmVnZXhfJy4kcGxf Y1snbmFtZSddXTsKCQkJCQkJJG1hdGNoX2NvdW50LS07CgkJCQkJYnJlYWs7CgkJCQkJY2Fz ZSAnc2VjdGlvbic6CgkJCQkJCWlmIChAJHMpICRvdXRbXSA9ICRzOwoJCQkJCQllbHNlIGJy ZWFrIDI7CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnY2F0ZWdvcnknOgoJCQkJCQlpZiAoQCRj KSAkb3V0W10gPSAkYzsKCQkJCQkJZWxzZSBicmVhayAyOwoJCQkJCWJyZWFrOwoJCQkJCWNh c2UgJ2ZlZWQnOgoJCQkJCQlpZiAoQCRyc3MpICRvdXRbXSA9ICdyc3MnOwoJCQkJCQllbHNl IGlmIChAJGF0b20pICRvdXRbXSA9ICdhdG9tJzsKCQkJCQkJZWxzZSBicmVhayAyOwoJCQkJ CWJyZWFrOwoJCQkJCWNhc2UgJ3NlYXJjaCc6CgkJCQkJCWlmIChAJHEpICRvdXRbXSA9ICRx OwoJCQkJCQllbHNlIGJyZWFrIDI7CgkJCQkJYnJlYWs7CgkJCQkJZGVmYXVsdDogYnJlYWsg MjsKCQkJCX0KCQkJCQlpZiAoIWluX2FycmF5KCRwbF9jWyd0eXBlJ10sIGFycmF5KCd0aXRs ZScsICdpZCcpKSkKCQkJCQkJJG1hdGNoX2NvdW50Kys7CgkJCQkJZWxzZSBicmVhazsKCQkJ fQoKCQkJJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ01hdGNoIGNvdW50OiAnLiAkbWF0Y2hf Y291bnQ7CgoJCQkvLyBUb2RvOiBTdG9yZSBhY2NvcmRpbmcgdG8gdGhlIHByZWNlZGVuY2Ug dmFsdWUKCQkJaWYgKGNvdW50KCRvdXQpID4gMCAmJiAoJG1hdGNoX2NvdW50ID4gJGhpZ2hl c3RfbWF0Y2hfY291bnQgfHwgIWlzc2V0KCRoaWdoZXN0X21hdGNoX2NvdW50KSkgJiYKCQkJ ISgka2V5ID09ICdnYnBfcGVybWFuZW50X2xpbmtzX2RlZmF1bHQnICYmICEkbWF0Y2hfY291 bnQpKSB7CgkJCQlleHRyYWN0KCRwbFsnc2V0dGluZ3MnXSk7CgkJCQlpZiAoKGVtcHR5KCRz KSAmJiBlbXB0eSgkYykpIHx8CgkJCQkoZW1wdHkoJGNvbl9zZWN0aW9uKSB8fCBAJHMgPT0g JGNvbl9zZWN0aW9uKSB8fAoJCQkJKGVtcHR5KCRjb25fY2F0ZWdvcnkpIHx8IEAkYyA9PSAk Y29uX2NhdGVnb3J5KSkgewoJCQkJCSR0aGlzLT5idWZmZXJfZGVidWdbXSA9ICdOZXcgaGln aGVzdCBtYXRjaCEgJy4gaW1wbG9kZSgnLycsICRvdXQpOwoJCQkJCSRoaWdoZXN0X21hdGNo X2NvdW50ID0gJG1hdGNoX2NvdW50OwoJCQkJCSRtYXRjaCA9ICRvdXQ7CgkJCQl9CgkJCX0K CQl9CgoJCWlmIChlbXB0eSgkbWF0Y2gpICYmICghKEAkcGcgJiYgJHRoaXMtPnByZWYoJ2Ns ZWFuX3BhZ2VfYXJjaGl2ZV9saW5rcycpKSB8fCAoQCRwZyAmJiBAJHEpKSkgewoJCQlnbG9i YWwgJHByZWZzLCAkcHJldGV4dCwgJHBlcm1saW5rX21vZGU7CgkJCSR0aGlzLT5idWZmZXJf ZGVidWdbXSA9ICdObyBtYXRjaCc7CgkJCSR0aGlzLT5idWZmZXJfZGVidWdbXSA9ICctLS0t JzsKCQkJJHByZXRleHRbJ3Blcm1saW5rX21vZGUnXSA9ICRwZXJtbGlua19tb2RlID0gJHBy ZWZzWydwZXJtbGlua19tb2RlJ107CgkJCSR1cmwgPSBwYWdlbGlua3VybCgkcXVlcnlfcGFy dCk7CgkJCSRwcmV0ZXh0WydwZXJtbGlua19tb2RlJ10gPSAkcGVybWxpbmtfbW9kZSA9ICdt ZXNzeSc7CgkJCXJldHVybiAnaHJlZj0iJy4gJHVybCAuJyInOwoJCX0KCgkJJHRoaXMtPmJ1 ZmZlcl9kZWJ1Z1tdID0gc2VyaWFsaXplKCRtYXRjaCk7CgoJCSR1cmwgPSAnLycuam9pbign LycsICRtYXRjaCk7CgkJJHVybCA9IHJ0cmltKGh1LCAnLycpLnJ0cmltKCR1cmwsICcvJyku Jy8nOwoKCQlpZiAoJHJzcykKCQkJJHVybCAuPSAncnNzJzsKCQllbHNlIGlmICgkYXRvbSkK CQkJJHVybCAuPSAnYXRvbSc7CgkJZWxzZSBpZiAoJHRoaXMtPnByZWYoJ2NsZWFuX3BhZ2Vf YXJjaGl2ZV9saW5rcycpICYmICRwZykKCQkJJHVybCAuPSAkcGc7CgkJZWxzZSBpZiAoJHBn KSB7CgkJCSR1cmwgLj0gJz9wZz0nLiAkcGc7CgkJCSRvbWl0X3RyYWlsaW5nX3NsYXNoID0g dHJ1ZTsKCQl9CgoJCSR1cmwgPSBydHJpbSgkdXJsLCAnLycpIC4gJy8nOwoKCQlpZiAoQCRv bWl0X3RyYWlsaW5nX3NsYXNoIHx8ICR0aGlzLT5wcmVmKCdvbWl0X3RyYWlsaW5nX3NsYXNo JykpCgkJCSR1cmwgPSBydHJpbSgkdXJsLCAnLycpOwoKCQkkdGhpcy0+YnVmZmVyX2RlYnVn W10gPSAkdXJsOwoJCSR0aGlzLT5idWZmZXJfZGVidWdbXSA9ICctLS0tJzsKCgkJaWYgKCRw YXRoID09ICdpbmRleC5waHAnICYmICR1cmwgIT0gaHUpCgkJCXJldHVybiAnaHJlZj0iJy4g JHVybCAuICRmcmFnbWVudCAuJyInOwoKCQkvKgoJCTEgPSBpbmRleCwgdGV4dHBhdHRlcm4v Y3NzLCBOVUxMICg9aW5kZXgpCgkJMiA9IGlkLCBzLCBzZWN0aW9uLCBjLCBjYXRlZ29yeSwg cnNzLCBhdG9tLCBwZywgcSwgKG4sIHAsIG1vbnRoLCBhdXRob3IpCgkJKi8KCgkJcmV0dXJu ICgkdGhpcy0+cHJlZignZm9yY2VfbG93ZXJjYXNlX3VybHMnKSkgPyBzdHJ0b2xvd2VyKCRw YXJ0c1swXSkgOiAkcGFydHNbMF07Cgl9CgoJZnVuY3Rpb24gc2V0X3Blcm1saW5rX21vZGUg KCRyZXNldF9mdW5jdGlvbiA9IGZhbHNlKSB7CgkJZ2xvYmFsICRwcmVmcywgJHByZXRleHQs ICRwZXJtbGlua19tb2RlOwoJCSRwcmVmc1snY3VzdG9tX3VybF9mdW5jJ10gPSBhcnJheSgm JHRoaXMsICdfcGVybWxpbmt1cmwnKTsKCgkJaWYgKCEkcmVzZXRfZnVuY3Rpb24pCgkJCSRw cmV0ZXh0WydwZXJtbGlua19tb2RlJ10gPSAkcGVybWxpbmtfbW9kZSA9ICdtZXNzeSc7CgkJ ZWxzZQoJCQkkcHJldGV4dFsncGVybWxpbmtfbW9kZSddID0gJHBlcm1saW5rX21vZGUgPSAk cHJlZnNbJ3Blcm1saW5rX21vZGUnXTsKCX0KCglmdW5jdGlvbiByZXNldF9wZXJtbGlua19t b2RlICgpIHsKCQlnbG9iYWwgJHByZWZzLCAkcHJldGV4dCwgJHBlcm1saW5rX21vZGU7CgkJ dW5zZXQoJHByZWZzWydjdXN0b21fdXJsX2Z1bmMnXSk7CgkJJHByZXRleHRbJ3Blcm1saW5r X21vZGUnXSA9ICRwZXJtbGlua19tb2RlID0gJHByZWZzWydwZXJtbGlua19tb2RlJ107Cgl9 CgoJZnVuY3Rpb24gdG9nZ2xlX3Blcm1saW5rX21vZGUgKCRmdW5jLCAkYXR0cyA9IE5VTEwp IHsKCQlnbG9iYWwgJHByZWZzLCAkcHJldGV4dCwgJHBlcm1saW5rX21vZGU7CgoJCSRfY2Fs bF91c2VyX2Z1bmMgPSBAJHByZWZzWydjdXN0b21fdXJsX2Z1bmMnXTsKCQkkX3Blcm1saW5r X21vZGUgPSAkcGVybWxpbmtfbW9kZTsKCgkJdW5zZXQoJHByZWZzWydjdXN0b21fdXJsX2Z1 bmMnXSk7CgkJJHByZXRleHRbJ3Blcm1saW5rX21vZGUnXSA9ICRwZXJtbGlua19tb2RlID0g JHByZWZzWydwZXJtbGlua19tb2RlJ107CgoJCWlmIChpc19jYWxsYWJsZSgkZnVuYykpCgkJ CSRycyA9IGNhbGxfdXNlcl9mdW5jKCRmdW5jLCAkYXR0cyk7CgoJCSRwcmVmc1snY3VzdG9t X3VybF9mdW5jJ10gPSAkX2NhbGxfdXNlcl9mdW5jOwoJCSRwcmV0ZXh0WydwZXJtbGlua19t b2RlJ10gPSAkcGVybWxpbmtfbW9kZSA9ICRfcGVybWxpbmtfbW9kZTsKCgkJcmV0dXJuICRy czsKCX0KCglmdW5jdGlvbiBlbmNvZGVfdXJsICgkdGV4dCkgewoJCXJldHVybiB1cmxlbmNv ZGUodHJpbShkdW1iRG93bih1cmxkZWNvZGUoJHRleHQpKSkpOwoJfQoKCWZ1bmN0aW9uIGRl YnVnICgpIHsKCQlpZiAoJHRoaXMtPnByZWYoJ2RlYnVnJykpIHsKCQkJZ2xvYmFsICRwcm9k dWN0aW9uX3N0YXR1czsKCQkJJGEgPSBmdW5jX2dldF9hcmdzKCk7CgoJCQlpZiAoQHR4cGlu dGVyZmFjZSA9PSAnYWRtaW4nKQoJCQkJZm9yZWFjaCAoJGEgYXMgJHRoaW5nKQoJCQkJCWRt cCgkdGhpbmcpOwoKCQkJaWYgKEB0eHBpbnRlcmZhY2UgPT0gJ3B1YmxpYycgJiYgaW5fYXJy YXkoJHByb2R1Y3Rpb25fc3RhdHVzLCBhcnJheSgnZGVidWcnLCAndGVzdGluZycpKSkKCQkJ CWZvcmVhY2ggKCRhIGFzICR0aGluZykKCQkJCQllY2hvIGNvbW1lbnQoaXNfc2NhbGFyKCR0 aGluZykgPyBzdHJ2YWwoJHRoaW5nKSA6IHZhcl9leHBvcnQoJHRoaW5nLCB0cnVlKSksbjsK CQl9Cgl9Cn0KCmNsYXNzIFBlcm1hbmVudExpbmtzQnVpbGRUYWJWaWV3IGV4dGVuZHMgR0JQ QWRtaW5UYWJWaWV3CnsKCWZ1bmN0aW9uIHByZWxvYWQgKCkgewoJCXJlZ2lzdGVyX2NhbGxi YWNrKGFycmF5KCYkdGhpcywgJ3Bvc3Rfc2F2ZV9wZXJtbGluaycpLCAkdGhpcy0+cGFyZW50 LT5ldmVudCwgZ2JwX3NhdmUsIDEpOwoJCXJlZ2lzdGVyX2NhbGxiYWNrKGFycmF5KCYkdGhp cywgJ3Bvc3Rfc2F2ZV9wZXJtbGluaycpLCAkdGhpcy0+cGFyZW50LT5ldmVudCwgZ2JwX3Bv c3QsIDEpOwoJfQoKCWZ1bmN0aW9uIG1haW4gKCkgewoJCWdsb2JhbCAkcHJlZnM7CgkJZXh0 cmFjdChncHNhKGFycmF5KCdzdGVwJywgZ2JwX2lkKSkpOwoKCQkvLyBXaXRoIGhhdmUgYW4g SUQsIGVpdGhlciB0aGUgcGVybWxpbmsgaGFzIGp1c3QgYmVlbiBzYXZlZCBvciB0aGUgdXNl ciB3YW50cyB0byBlZGl0IGl0CgkJaWYgKCRpZCkgewoJCQkvLyBOZXdseSBzYXZlZCBvciBi ZWVuaW5nIGVkaXRlZCwgZWl0aGVyIHdheSB3ZSdyZSBlZGl0aW5nIGEgcGVybWxpbmsKCQkJ JHN0ZXAgPSBnYnBfc2F2ZTsKCgkJCS8vIFVzZSB0aGUgSUQgdG8gZ3JhYiB0aGUgcGVybWxp bmsgZGF0YSAoY29tcG9uZW50cyAmIHNldHRpbmdzKQoJCQkkcGVybWxpbmsgPSAkdGhpcy0+ cGFyZW50LT5nZXRfcGVybWxpbmsoJGlkKTsKCQkJJGNvbXBvbmVudHMgPSAkdGhpcy0+cGhw QXJyYXlUb0pzQXJyYXkoJ2NvbXBvbmVudHMnLCAkcGVybWxpbmtbJ2NvbXBvbmVudHMnXSk7 CgkJCSRzZXR0aW5ncyA9ICRwZXJtbGlua1snc2V0dGluZ3MnXTsKCQl9IGVsc2UgewoJCQkv LyBDcmVhdGluZyBhIG5ldyBJRCBhbmQgcGVybWxpbmsuCgkJCSRzdGVwID0gZ2JwX3Bvc3Q7 CgkJCSRpZCA9IHVuaXFpZCgnJyk7CgoJCQkvLyBTZXQgdGhlIGRlZmF1bHQgc2V0IG9mIGNv bXBvbmVudHMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlcmUgaXMgcGFyZW50IHBlcm1saW5r CgkJCSRjb21wb25lbnRzID0gJHRoaXMtPnBocEFycmF5VG9Kc0FycmF5KCdjb21wb25lbnRz JywgYXJyYXkoCgkJCQlhcnJheSgndHlwZScgPT4gJ3NlY3Rpb24nLCAncHJlZml4JyA9PiAn JywgJ3N1ZmZpeCcgPT4gJycsICdyZWdleCcgPT4gJycsICd0ZXh0JyA9PiAnJyksCgkJCQlh cnJheSgndHlwZScgPT4gJ2NhdGVnb3J5JywgJ3ByZWZpeCcgPT4gJycsICdzdWZmaXgnID0+ ICcnLCAncmVnZXgnID0+ICcnLCAndGV4dCcgPT4gJycsICdjYXRlZ29yeScgPT4gJzEnKSwK CQkJCWFycmF5KCd0eXBlJyA9PiAndGl0bGUnLCAncHJlZml4JyA9PiAnJywgJ3N1ZmZpeCcg PT4gJycsICdyZWdleCcgPT4gJycsICd0ZXh0JyA9PiAnJyksCgkJCSkpOwoKCQkJJHNldHRp bmdzID0gYXJyYXkoCgkJCQkncGxfbmFtZScgPT4gJ1VudGl0bGVkJywgJ3BsX3ByZWNlZGVu Y2UnID0+ICcwJywKCQkJCSdjb25fc2VjdGlvbicgPT4gJycsICdjb25fY2F0ZWdvcnknID0+ ICcnLAoJCQkJJ2Rlc19zZWN0aW9uJyA9PiAnJywgJ2Rlc19jYXRlZ29yeScgPT4gJycsICdk ZXNfcGFnZScgPT4gJycsCgkJCQknZGVzX3Blcm1saW5rJyA9PiAnJywgJ2Rlc19mZWVkJyA9 PiAnJywgJ2Rlc19sb2NhdGlvbicgPT4gJycsCgkJCSk7CgkJfQoKCQkvLyBFeHRyYWN0IHNl dHRpbmdzIC0gdGhpcyB3aWxsIGJlIHVzZWZ1bCB3aGVuIGNyZWF0aW5nIHRoZSB1c2VyIGlu dGVyZmFjZQoJCWV4dHJhY3QoJHNldHRpbmdzKTsKCgkJLy8gUEhQICYgSmF2YXNjcmlwdCBj b25zdGFudHM7CgkJJHNlcGFyYXRvciA9IGdicF9zZXBhcmF0b3I7CgkJJGNvbXBvbmVudHNf ZGl2ID0gJ3Blcm1saW5rX2NvbXBvbmVudHNfdWknOwoJCSRjb21wb25lbnRzX2Zvcm0gPSAn cGVybWxpbmtfY29tcG9uZW50cyc7CgkJJHNldHRpbmdzX2Zvcm0gPSAncGVybWxpbmtfc2V0 dGluZ3MnOwoJCSRzaG93X3ByZWZpeCA9ICR0aGlzLT5wcmVmKCdzaG93X3ByZWZpeCcpOwoJ CSRzaG93X3N1ZmZpeCA9ICR0aGlzLT5wcmVmKCdzaG93X3N1ZmZpeCcpOwoKCQkvLyBBIGxp dHRsZSBjcmVkaXQgaGVyZSBhbmQgdGhlcmUgZG9lc24ndCBodXJ0CgkJJG91dFtdID0gIjwh LS0geyR0aGlzLT5wYXJlbnQtPnBsdWdpbl9uYW1lfSBieSBHcmFlbWUgUG9ydGVvdXMgLS0+ IjsKCgkJLy8gVGhlIEphdmFzY3JpcHQKJG91dFtdID0gPDw8SFRNTAoJPHNjcmlwdCB0eXBl PSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYt OCI+CgkvLyA8IVtDREFUQVsKCgkvLyBHbG9iYWwgdmFyaWFibGVzCnZhciB7JGNvbXBvbmVu dHN9Ly8gY29tcG9uZW50cyBhcnJheSBmb3IgYWxsIHRoZSBkYXRhCgoJdmFyIF9jdXJyZW50 ID0gMDsgLy8gSW5kZXggb2YgdGhlIGNvbXBvbmVudHMgYXJyYXksIG9mIHRoZSBjdXJyZW50 bHkgc2VsZWN0ZWQgY29tcG9uZW50Cgl2YXIgY192YWxzID0gbmV3IEFycmF5KCd0eXBlJywg J2N1c3RvbScsICdjYXRlZ29yeScsICduYW1lJywgJ3ByZWZpeCcsICdzdWZmaXgnLCAncmVn ZXgnLCAndGV4dCcpOwoKCXdpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbigpIHsKCQljb21wb25l bnRfcmVmcmVzaF9hbGwoKTsKCQljb21wb25lbnRfc3dpdGNoKGNvbXBvbmVudChfY3VycmVu dCkpOwoJfQoKCWZ1bmN0aW9uIGNvbXBvbmVudF9hZGQgKCkgewoJCS8vIENyZWF0ZSBkYXRh IHNldAoJCXZhciBkYXRhID0gbmV3IEFycmF5KCk7CgkJZm9yIChrZXkgaW4gY192YWxzKSB7 CgkJCWRhdGFbY192YWxzW2tleV1dID0gJyc7CgkJfQoKCQkvLyBBZGQgZGF0YQoJCWNvbXBv bmVudHMucHVzaChkYXRhKTsKCgkJLy8gUmVzZXQgY29tcG9uZW50IHR5cGUgbGlzdAoJCWZv cm0oJ3skY29tcG9uZW50c19mb3JtfScpLnR5cGUudmFsdWUgPSAnJzsKCgkJLy8gU3dpdGNo IHRvIHRoZSBuZXcgY29tcG9uZW50CgkJX2N1cnJlbnQgPSBjb21wb25lbnRzLmxlbmd0aCAt IDE7CgoJCS8vIFJlZnJlc2ggVUkKCQljb21wb25lbnRfcmVmcmVzaF9hbGwoKTsKCQljb21w b25lbnRfdXBkYXRlKCk7Cgl9CgoJZnVuY3Rpb24gY29tcG9uZW50X3JlZnJlc2ggKGVsZW1l bnQpIHsKCQl2YXIgYyA9IGNvbXBvbmVudHNbZWxlbWVudC5pZF07CgoJCS8vIENTUwoJCWlm IChfY3VycmVudCA9PSBlbGVtZW50LmlkKQoJCQllbGVtZW50LnN0eWxlWydiYWNrZ3JvdW5k Q29sb3InXSA9ICdyZ2IoMjQ5LCAyMDYsIDczKSc7CgkJZWxzZQoJCQllbGVtZW50LnN0eWxl WydiYWNrZ3JvdW5kQ29sb3InXSA9ICdyZ2IoMjU1LCAyNTQsIDIxMSknOwoJCWVsZW1lbnQu c3R5bGVbJ2NvbG9yJ10gPSAncmdiKDAsIDAsIDApJzsKCQllbGVtZW50LnN0eWxlWydmb250 RmFtaWx5J10gPSAnQXJpYWwnOwoJCWVsZW1lbnQuc3R5bGVbJ2ZvbnRXZWlnaHQnXSA9ICdi b2xkJzsKCQllbGVtZW50LnN0eWxlWyd2ZXJ0aWNhbEFsaWduJ10gPSAnbWlkZGxlJzsKCQll bGVtZW50LnN0eWxlWyd0ZXh0QWxpZ24nXSA9ICdjZW50ZXInOwoJCWVsZW1lbnQuc3R5bGVb J2xpbmVIZWlnaHQnXSA9ICcxLjVlbSc7CgkJZWxlbWVudC5zdHlsZVsnaGVpZ2h0J10gPSAn MS41ZW0nOwoJCWVsZW1lbnQuc3R5bGVbJ3BhZGRpbmcnXSA9ICcwIDVweCc7CgkJZWxlbWVu dC5zdHlsZVsnbWFyZ2luUmlnaHQnXSA9ICc1cHgnOwoJCWVsZW1lbnQuc3R5bGVbJ2Nzc0Zs b2F0J10gPSAnbGVmdCc7CgkJZWxlbWVudC5zdHlsZVsnZGlzcGxheSddID0gJ2lubGluZSc7 CgoJCS8vIFJlbW92ZSBhbGwgY2hpbGQgbm9kZXMKCQl3aGlsZSAoZWxlbWVudC5oYXNDaGls ZE5vZGVzKCkpIHsgZWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50LmZpcnN0Q2hpbGQpOyB9 CgoJCS8vIENyZWF0ZSB0aGUgdmlzaWJsZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgY29t cG9uZW50CgkJc3dpdGNoIChjWyd0eXBlJ10pIHsKCQkJY2FzZSAnJyA6CgkJCQlzdHJpbmcg PSAnLyc7CgkJCQlicmVhazsKCQkJY2FzZSAncmVnZXgnIDoKCQkJY2FzZSAndGV4dCcgOgoJ CQkJc3RyaW5nID0gY1tjWyd0eXBlJ11dICsgJyAvJzsKCQkJCWJyZWFrOwoJCQljYXNlICdk YXRlJyA6CgkJCQlzdHJpbmcgPSBjWyd0eXBlJ10gKyAnIC8nOwoJCQkJYnJlYWs7CgkJCWNh c2UgJ2N1c3RvbScgOgoJCQkJc3RyaW5nID0gY1sncHJlZml4J10gKyAnY3VzdG9tXycgKyBj WydjdXN0b20nXSArIGNbJ3N1ZmZpeCddICsgJyAvJzsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0 IDoKCQkJCXN0cmluZyA9IGNbJ3ByZWZpeCddICsgY1sndHlwZSddICsgY1snc3VmZml4J10g KyAnIC8nOwoJCQlicmVhazsKCQl9CgoJCS8vIFNldCB0aGUgdmlzaWJsZSBzdHJpbmcKCQll bGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHN0cmluZykpOwoK CQlyZXR1cm4gZWxlbWVudDsKCX0KCglmdW5jdGlvbiBjb21wb25lbnRfcmVmcmVzaF9hbGwg KCkgewoJCS8vIFJlbW92ZSBhbGwgY2hpbGQgbm9kZXMKCQl3aGlsZSAocGVybWxpbmtfZGl2 KCkuaGFzQ2hpbGROb2RlcygpKSB7IHBlcm1saW5rX2RpdigpLnJlbW92ZUNoaWxkKHBlcm1s aW5rX2RpdigpLmZpcnN0Q2hpbGQpOyB9CgoJCWZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9u ZW50cy5sZW5ndGg7IGkrKykgewoJCQl2YXIgYyA9IGNvbXBvbmVudHNbaV07CgoJCQkvLyBD cmVhdGUgdGhlIG5ldyBjb21wb25lbnQKCQkJdmFyIG5ld19jb21wb25lbnQgPSBkb2N1bWVu dC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKCgkJCS8vIFNldCB0aGUgaWQgaW50ZXJnZXIgZm9y IHRoaXMgY29tcG9uZW50CgkJCW5ld19jb21wb25lbnQuaWQgPSBpOwoKCQkJLy8gSmF2YXNj cmlwdCwgb25tb3VzZXVwIHNldHRpbmcKCQkJbmV3X2NvbXBvbmVudC5zZXRBdHRyaWJ1dGUo J29ubW91c2Vkb3duJywgJ2NvbXBvbmVudF9zd2l0Y2godGhpcyk7Jyk7CgkJCW5ld19jb21w b25lbnQub25tb3VzZWRvd24gPSBmdW5jdGlvbigpIHsgY29tcG9uZW50X3N3aXRjaCh0aGlz KTsgfTsKCgkJCS8vIFJlZnJlc2ggdGhlIGxvb2sgb2YgdGhlIGNvbXBvbmVudAoJCQluZXdf Y29tcG9uZW50ID0gY29tcG9uZW50X3JlZnJlc2gobmV3X2NvbXBvbmVudCk7CgoJCQkvLyBB bmQgYWRkIHRoZSBuZXcgY29tcG9uZW50IHRvIHRoZSB1aQoJCQlwZXJtbGlua19kaXYoKS5h cHBlbmRDaGlsZChuZXdfY29tcG9uZW50KTsKCQl9Cgl9CgoJZnVuY3Rpb24gY29tcG9uZW50 X3JlbW92ZSAoKSB7CgkJaWYgKGNvbXBvbmVudHMubGVuZ3RoID4gMSkgewoJCQljb21wb25l bnRzLnNwbGljZShfY3VycmVudCwgMSk7CgoJCQlpZiAoX2N1cnJlbnQgPj0gY29tcG9uZW50 cy5sZW5ndGgpCgkJCQlfY3VycmVudCA9IGNvbXBvbmVudHMubGVuZ3RoIC0gMTsKCgkJCWNv bXBvbmVudF9yZWZyZXNoX2FsbCgpOwoJCX0KCX0KCglmdW5jdGlvbiBjb21wb25lbnRfc3dp dGNoIChlbGVtZW50KSB7CgkJLy8gVXBkYXRlIGN1cnJlbnQgaW5kZXgKCQlfY3VycmVudCA9 IGVsZW1lbnQuaWQ7CgoJCS8vIFJlZnJlc2ggVUkKCQljb21wb25lbnRfcmVmcmVzaF9hbGwo KTsKCgkJLy8gU2V0IGZvcm0gaW5wdXQgdmFsdWVzCgkJdmFyIGMgPSBjb21wb25lbnRzW19j dXJyZW50XTsKCQlmb3IgKGtleSBpbiBjX3ZhbHMpIHsKCQkJdmFyIGsgPSBjX3ZhbHNba2V5 XTsKCQkJdmFyIGUgPSBmb3JtKCd7JGNvbXBvbmVudHNfZm9ybX0nKS5lbGVtZW50cy5uYW1l ZEl0ZW0oayk7CgoJCQlpZiAoY1trXSkgZS52YWx1ZSA9IGNba107CgkJCWVsc2UgZS52YWx1 ZSA9ICcnOwoJCX0KCgkJLy8gSGlkZSB1bm5lZWRlZCBmb3JtIGlucHV0cwoJCWNvbXBvbmVu dF91cGRhdGUoKTsKCX0KCglmdW5jdGlvbiBjb21wb25lbnRfdXBkYXRlIChlbGVtZW50KSB7 CgkJLy8gU3RvcmUgdGhlIGRhdGEgaW4gZm9ybSBpbnB1dHMsIGFuZCBoaWRlIGFsbCBmb3Jt IGlucHV0cwoJCXZhciBjID0gbmV3IEFycmF5KCkKCQlmb3IgKGtleSBpbiBjX3ZhbHMpIHsK CQkJdmFyIGsgPSBjX3ZhbHNba2V5XTsKCQkJdmFyIGUgPSBmb3JtKCd7JGNvbXBvbmVudHNf Zm9ybX0nKS5lbGVtZW50cy5uYW1lZEl0ZW0oayk7CgoJCQljW2tdID0gZS52YWx1ZTsKCgkJ CWUucGFyZW50Tm9kZS5zdHlsZVsnZGlzcGxheSddID0gJ25vbmUnOwoJCX0KCgkJLy8gUmVz aG93IHR5cGUgb3B0aW9uIGxpc3QKCQlmb3JtKCd7JGNvbXBvbmVudHNfZm9ybX0nKS50eXBl LnBhcmVudE5vZGUuc3R5bGVbJ2Rpc3BsYXknXSA9ICcnOwoKCQkvLyBTZXQgb3RoZXIgZm9y bSBpbnB1dHMgdG8gdGhlIGNvcnJlY3QgdmlzaWJpbGl0eSBzdGF0ZSwgZGVwZW5kZW50IG9u IHR5cGUKCQlzd2l0Y2ggKGNbJ3R5cGUnXSkgewoJCQljYXNlICcnIDoKCQkJY2FzZSAnZGF0 ZScgOiBicmVhazsKCQkJY2FzZSAncmVnZXgnIDoKCQkJCWZvcm0oJ3skY29tcG9uZW50c19m b3JtfScpLm5hbWUucGFyZW50Tm9kZS5zdHlsZVsnZGlzcGxheSddID0gJyc7CgkJCQlmb3Jt KCd7JGNvbXBvbmVudHNfZm9ybX0nKS5yZWdleC5wYXJlbnROb2RlLnN0eWxlWydkaXNwbGF5 J10gPSAnJzsKCQkJYnJlYWs7CgkJCWNhc2UgJ3RleHQnIDoKCQkJCWZvcm0oJ3skY29tcG9u ZW50c19mb3JtfScpLm5hbWUucGFyZW50Tm9kZS5zdHlsZVsnZGlzcGxheSddID0gJyc7CgkJ CQlmb3JtKCd7JGNvbXBvbmVudHNfZm9ybX0nKS50ZXh0LnBhcmVudE5vZGUuc3R5bGVbJ2Rp c3BsYXknXSA9ICcnOwoJCQlicmVhazsKCQkJY2FzZSAnY3VzdG9tJyA6CgkJCQlmb3JtKCd7 JGNvbXBvbmVudHNfZm9ybX0nKS5jdXN0b20ucGFyZW50Tm9kZS5zdHlsZVsnZGlzcGxheSdd ID0gJyc7CgkJCQlkaXNwbGF5X2ZpeGVzKCk7CgkJCWJyZWFrOwoJCQljYXNlICdjYXRlZ29y eScgOgoJCQkJZm9ybSgneyRjb21wb25lbnRzX2Zvcm19JykuY2F0ZWdvcnkucGFyZW50Tm9k ZS5zdHlsZVsnZGlzcGxheSddID0gJyc7CgkJCQlkaXNwbGF5X2ZpeGVzKCk7CgkJCWJyZWFr OwoJCQlkZWZhdWx0IDoKCQkJCWRpc3BsYXlfZml4ZXMoKTsKCQkJYnJlYWs7CgkJfQoKCQkv LyBTYXZlIGRhdGEKCQljb21wb25lbnRzW19jdXJyZW50XSA9IGM7CgoJCS8vIFJlZnJlc2gg Y29tcG9uZW50IHRvIHJlZmxlY3QgbmV3IGRhdGEKCQljb21wb25lbnRfcmVmcmVzaChjb21w b25lbnQoX2N1cnJlbnQpKTsKCgkJLy8gUmUtZm9jdXMgdGhlIGFjdGl2ZSBmb3JtIGlucHV0 CgkJaWYgKGVsZW1lbnQpCgkJCWVsZW1lbnQuZm9jdXMoKTsKCX0KCglmdW5jdGlvbiBkaXNw bGF5X2ZpeGVzICgpIHsKCQlpZiAoJ3skc2hvd19wcmVmaXh9JykKCQkJZm9ybSgneyRjb21w b25lbnRzX2Zvcm19JykucHJlZml4LnBhcmVudE5vZGUuc3R5bGVbJ2Rpc3BsYXknXSA9ICcn OwoJCWlmICgneyRzaG93X3N1ZmZpeH0nKQoJCQlmb3JtKCd7JGNvbXBvbmVudHNfZm9ybX0n KS5zdWZmaXgucGFyZW50Tm9kZS5zdHlsZVsnZGlzcGxheSddID0gJyc7Cgl9CgoJZnVuY3Rp b24gY29tcG9uZW50X2xlZnQgKCkgewoJCWlmIChjb21wb25lbnRzLmxlbmd0aCA+IDEgJiYg X2N1cnJlbnQgPiAwKSB7CgkJCS8vIFN0b3JlIGN1cnJlbnQgY29tcG9uZW50CgkJCXZhciBj ID0gY29tcG9uZW50c1tfY3VycmVudF07CgoJCQkvLyBSZW1vdmUgY3VycmVudCBjb21wb25l bnQKCQkJY29tcG9uZW50cy5zcGxpY2UoX2N1cnJlbnQsIDEpOwoKCQkJLy8gVXBkYXRlIGN1 cnJlbnQgaW5kZXgKCQkJX2N1cnJlbnQtLTsKCgkJCS8vIFJlLWFkZCBjdXJyZW50IGNvbXBv bmVudAoJCQljb21wb25lbnRzLnNwbGljZShfY3VycmVudCwgMCwgYyk7CgoJCQkvLyBSZWZy ZXNoIFVJCgkJCWNvbXBvbmVudF9yZWZyZXNoX2FsbCgpOwoJCX0KCX0KCglmdW5jdGlvbiBj b21wb25lbnRfcmlnaHQgKCkgewoJCWlmIChfY3VycmVudCA8IGNvbXBvbmVudHMubGVuZ3Ro IC0gMSkgewoJCQkvLyBTdG9yZSBjdXJyZW50IGNvbXBvbmVudAoJCQl2YXIgYyA9IGNvbXBv bmVudHNbX2N1cnJlbnRdOwoKCQkJLy8gUmVtb3ZlIGN1cnJlbnQgY29tcG9uZW50CgkJCWNv bXBvbmVudHMuc3BsaWNlKF9jdXJyZW50LCAxKTsKCgkJCS8vIFVwZGF0ZSBjdXJyZW50IGlu ZGV4CgkJCV9jdXJyZW50Kys7CgoJCQkvLyBSZS1hZGQgY3VycmVudCBjb21wb25lbnQKCQkJ Y29tcG9uZW50cy5zcGxpY2UoX2N1cnJlbnQsIDAsIGMpOwoKCQkJLy8gUmVmcmVzaCBVSQoJ CQljb21wb25lbnRfcmVmcmVzaF9hbGwoKTsKCQl9Cgl9CgoJZnVuY3Rpb24gc2F2ZSAoZm9y bSkgewoJCXZhciBjID0gJyc7IHZhciBpc19wZXJtbGluayA9IGZhbHNlOyB2YXIgaGFzX3Bh Z2Vfb3Jfc2VhcmNoID0gZmFsc2U7CgkJZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb25lbnRz Lmxlbmd0aDsgaSsrKSB7CgkJCWlmIChjb21wb25lbnRzW2ldWyd0eXBlJ10gPT0gJ3RpdGxl JyB8fCBjb21wb25lbnRzW2ldWyd0eXBlJ10gPT0gJ2lkJykKCQkJCWlzX3Blcm1saW5rID0g dHJ1ZTsKCQkJaWYgKGNvbXBvbmVudHNbaV1bJ3R5cGUnXSA9PSAncGFnZScgfHwgY29tcG9u ZW50c1tpXVsndHlwZSddID09ICdmZWVkJyB8fCBjb21wb25lbnRzW2ldWyd0eXBlJ10gPT0g J3NlYXJjaCcpCgkJCQloYXNfcGFnZV9mZWVkX3NlYXJjaCA9IHRydWU7CgkJCWMgPSBjICsg anNBcnJheVRvUGhwQXJyYXkoY29tcG9uZW50c1tpXSkgKyAneyRzZXBhcmF0b3J9JzsKCQl9 CgoJCWlmIChpc19wZXJtbGluayAmJiBoYXNfcGFnZV9vcl9zZWFyY2gpCgkJCWFsZXJ0KCJZ b3VyIHBlcm1hbmVudCBsaW5rIGNhbid0IGNvbnRhaW4gZWl0aGVyIGEgJ3BhZ2UnLCAnZmVl ZCcgb3IgYSAnc2VhcmNoJyBjb21wb25lbnQgd2l0aCAndGl0bGUnIG9yICdpZCcgY29tcG9u ZW50cy4iKTsKCgkJZWxzZSBpZiAoaXNfcGVybWxpbmsgJiYgKGZvcm0ucGxfbmFtZS52YWx1 ZSA9PSAnJyB8fCBmb3JtLnBsX25hbWUudmFsdWUgPT0gJ1VudGl0bGVkJykpIHsKCQkJZG9j dW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzJykuc3R5bGVbJ2Rpc3BsYXknXSA9ICcn OwoJCQlmb3JtLnBsX25hbWUuc3R5bGVbJ2JvcmRlciddID0gJzNweCBzb2xpZCByZ2IoMjIx LCAwLCAwKSc7CgkJCWZvcm0ucGxfcHJlY2VkZW5jZS5zdHlsZVsnYm9yZGVyJ10gPSAnJzsK CQkJYWxlcnQoJ1BsZWFzZSBlbnRlciBhIG5hbWUgZm9yIHRoaXMgcGVybWFuZW50IGxpbmsg cnVsZS4nKTsKCQl9IGVsc2UgaWYgKGZvcm0ucGxfcHJlY2VkZW5jZS52YWx1ZSA9PSAnJykg ewoJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dGluZ3MnKS5zdHlsZVsnZGlzcGxh eSddID0gJyc7CgkJCWZvcm0ucGxfcHJlY2VkZW5jZS5zdHlsZVsnYm9yZGVyJ10gPSAnM3B4 IHNvbGlkIHJnYigyMjEsIDAsIDApJzsKCQkJZm9ybS5wbF9uYW1lLnN0eWxlWydib3JkZXIn XSA9ICcnOwoJCQlhbGVydCgnUGxlYXNlIGVudGVyIGEgcHJlY2VkZW5jZSB2YWx1ZSBmb3Ig dGhpcyBwZXJtYW5lbnQgbGluayBydWxlLicpOwoJCX0gZWxzZSB7CgkJCWZvcm0uY29tcG9u ZW50cy52YWx1ZSA9IGM7CgkJCWlmIChwZXJtbGlua19kaXYoKS50ZXh0Q29udGVudCkKCQkJ CWZvcm0ucGxfcHJldmlldy52YWx1ZSA9IHBlcm1saW5rX2RpdigpLnRleHRDb250ZW50OwoJ CQllbHNlIGlmIChwZXJtbGlua19kaXYoKS5pbm5lclRleHQpCgkJCQlmb3JtLnBsX3ByZXZp ZXcudmFsdWUgPSBwZXJtbGlua19kaXYoKS5pbm5lclRleHQ7CgkJCXJldHVybiB0cnVlOwoJ CX0KCgkJcmV0dXJuIGZhbHNlOwoJfQoKCWZ1bmN0aW9uIGpzQXJyYXlUb1BocEFycmF5IChh cnJheSkgewoJCS8vIGh0dHA6Ly9mYXJtLnR1Y293cy5jb20vYmxvZy9fYXJjaGl2ZXMvMjAw NS81LzMwLzg5NTkwMS5odG1sCgkJdmFyIGFycmF5X3BocCA9ICIiOwoJCXZhciB0b3RhbCA9 IDA7CgkJZm9yICh2YXIga2V5IGluIGFycmF5KSB7CgkJCSsrIHRvdGFsOwoJCQlhcnJheV9w aHAgPSBhcnJheV9waHAgKyAiczoiICsKCQkJCVN0cmluZyhrZXkpLmxlbmd0aCArICI6XCIi ICsgU3RyaW5nKGtleSkgKyAiXCI7czoiICsKCQkJCVN0cmluZyhhcnJheVtrZXldKS5sZW5n dGggKyAiOlwiIiArIFN0cmluZyhhcnJheVtrZXldKSArICJcIjsiOwoJCX0KCQlhcnJheV9w aHAgPSAiYToiICsgdG90YWwgKyAiOnsiICsgYXJyYXlfcGhwICsgIn0iOwoJCXJldHVybiBh cnJheV9waHA7Cgl9CgoJZnVuY3Rpb24gcGVybWxpbmtfZGl2ICgpIHsKCQkvLyBSZXR1cm4g dGhlIHBlcm1saW5rIHJ1bGUgZWxlbWVudAoJCXJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50 QnlJZCgneyRjb21wb25lbnRzX2Rpdn0nKTsKCX0KCglmdW5jdGlvbiBmb3JtIChuYW1lKSB7 CgkJaWYgKCFuYW1lKQoJCQluYW1lID0gJ3skY29tcG9uZW50c19mb3JtfScKCQkvLyBSZXR1 cm4gdGhlIGZvcm0gZWxlbWVudCB3aXRoIG5hbWUKCQlyZXR1cm4gZG9jdW1lbnQuZm9ybXMu bmFtZWRJdGVtKG5hbWUpOwoJfQoKCWZ1bmN0aW9uIGNvbXBvbmVudCAoaW5kZXgpIHsKCQkv LyBSZXR1cm4gY29tcG9uZW50IHdpdGggaW5kZXgKCQlyZXR1cm4gcGVybWxpbmtfZGl2KCku Y2hpbGROb2Rlc1tpbmRleF07Cgl9CgoJLy8gXV0+Cgk8L3NjcmlwdD4KSFRNTDsKCgkJLy8g LS0tIFJ1bGUgLS0tIC8vCgoJCSRvdXRbXSA9IGhlZCgnUGVybWFuZW50IGxpbmsgcnVsZScs IDIpOwoJCSRvdXRbXSA9ICc8ZGl2IGlkPSInLiRjb21wb25lbnRzX2Rpdi4nIiBzdHlsZT0i YmFja2dyb3VuZC1jb2xvcjogcmdiKDIzMCwgMjMwLCAyMzApOyB3aWR0aDogYXV0bzsgaGVp Z2h0OiAxLjVlbTsgbWFyZ2luOiAxMHB4IDA7IHBhZGRpbmc6IDVweDsiPjwvZGl2Pic7CgkJ JG91dFtdID0gZ3JhZgoJCQkoCgkJCSR0aGlzLT5mSW5wdXQoJ2J1dHRvbicsICdjb21wb25l bnRfYWRkJywgJ0FkZCBjb21wb25lbnQnLCBhcnJheSgnY2xpY2snID0+ICdjb21wb25lbnRf YWRkKCk7JykpLm4uCgkJCSR0aGlzLT5mSW5wdXQoJ2J1dHRvbicsICdjb21wb25lbnRfcmVt b3ZlJywgJ1JlbW92ZSBjb21wb25lbnQnLCBhcnJheSgnY2xpY2snID0+ICdjb21wb25lbnRf cmVtb3ZlKCk7JykpLm4uCgkJCSR0aGlzLT5mSW5wdXQoJ2J1dHRvbicsICdjb21wb25lbnRf bGVmdCcsICdNb3ZlIGxlZnQnLCBhcnJheSgnY2xpY2snID0+ICdjb21wb25lbnRfbGVmdCgp OycpKS5uLgoJCQkkdGhpcy0+ZklucHV0KCdidXR0b24nLCAnY29tcG9uZW50X3JpZ2h0Jywg J01vdmUgcmlnaHQnLCBhcnJheSgnY2xpY2snID0+ICdjb21wb25lbnRfcmlnaHQoKTsnKSkK CQkJKTsKCgkJLy8gLS0tIENvbXBvbmVudCBmb3JtIC0tLSAvLwoKCQkkb3V0W10gPSAnPGZv cm0gYWN0aW9uPSJpbmRleC5waHAiIG5hbWU9IicuJGNvbXBvbmVudHNfZm9ybS4nIiBvbnN1 Ym1pdD0icmV0dXJuIGZhbHNlOyI+JzsKCgkJLy8gLS0tIENvbXBvbmVudCB0eXBlIC0tLSAv LwoKCQkkY29tcG9uZW50X3R5cGVzID0gYXJyYXkgKAoJCQknc2VjdGlvbicgPT4gJ1NlY3Rp b24nLCAnY2F0ZWdvcnknID0+ICdDYXRlZ29yeScsCgkJCSd0aXRsZScgPT4gJ1RpdGxlJywg J2lkJyA9PiAnSUQnLAoJCQknZGF0ZScgPT4gJ0RhdGUgKHl5eXkvbW0vZGQpJywgJ3llYXIn ID0+ICdZZWFyJywKCQkJJ21vbnRoJyA9PiAnTW9udGgnLCAnZGF5JyA9PiAnRGF5JywKCQkJ J2F1dGhvcicgPT4gJ0F1dGhvciAoUmVhbCBuYW1lKScsICdsb2dpbicgPT4gJ0F1dGhvciAo TG9naW4pJywKCQkJJ2N1c3RvbScgPT4gJ0N1c3RvbSBGaWVsZCcsICdwYWdlJyA9PiAnUGFn ZSBOdW1iZXInLAoJCQknZmVlZCcgPT4gJ0ZlZWQnLCAnc2VhcmNoJyA9PiAnU2VhcmNoIHJl cXVlc3QnLAoJCQkndGV4dCcgPT4gJ1BsYWluIFRleHQnLCAncmVnZXgnID0+ICdSZWd1bGFy IEV4cHJlc3Npb24nCgkJKTsKCQkkb3V0W10gPSBncmFmKCR0aGlzLT5mU2VsZWN0KCd0eXBl JywgJGNvbXBvbmVudF90eXBlcywgJycsIDEsICdDb21wb25lbnQgdHlwZScsICcgb25jaGFu Z2U9ImNvbXBvbmVudF91cGRhdGUoKTsiJykpOwoKCQkvLyAtLS0gQ29tcG9uZW50IGRhdGEg LS0tIC8vCgoJCS8vIEdyYWIgdGhlIGN1c3RvbSBmaWVsZCB0aXRsZXMKCQkkY3VzdG9tX2Zp ZWxkcyA9IGFycmF5KCk7CgkJZm9yICgkaSA9IDE7ICRpIDw9IDEwOyAkaSsrKSB7CgkJCWlm ICgkdiA9ICRwcmVmc1siY3VzdG9tX3skaX1fc2V0Il0pCgkJCQkkY3VzdG9tX2ZpZWxkc1sk aV0gPSAkdjsKCQl9CgoJCSRvdXRbXSA9IGdyYWYgKAoJCQkkdGhpcy0+ZlNlbGVjdCgnY3Vz dG9tJywgJGN1c3RvbV9maWVsZHMsICcnLCAwLCAnQ3VzdG9tJywgJyBvbmNoYW5nZT0iY29t cG9uZW50X3VwZGF0ZSh0aGlzKTsiJykubi4KCQkJJHRoaXMtPmZTZWxlY3QoJ2NhdGVnb3J5 JywgYXJyYXkoJzEnID0+ICdDYXRlZ29yeSAxJywgJzInID0+ICdDYXRlZ29yeSAyJyksICcn LCAwLCAnUHJpbWFyeSBDYXRlZ29yeScsICcgb25jaGFuZ2U9ImNvbXBvbmVudF91cGRhdGUo dGhpcyk7IicpLm4uCgkJCSR0aGlzLT5mSW5wdXQoJ3RleHQnLCAnbmFtZScsICcnLCBhcnJh eSgna2V5dXAnID0+ICdjb21wb25lbnRfdXBkYXRlKHRoaXMpOycpLCAnTmFtZScpLm4uCgkJ CSR0aGlzLT5mSW5wdXQoJ3RleHQnLCAncHJlZml4JywgJycsIGFycmF5KCdrZXl1cCcgPT4g J2NvbXBvbmVudF91cGRhdGUodGhpcyk7JyksICdQcmVmaXgnKS5uLgoJCQkkdGhpcy0+Zklu cHV0KCd0ZXh0JywgJ3JlZ2V4JywgJycsIGFycmF5KCdrZXl1cCcgPT4gJ2NvbXBvbmVudF91 cGRhdGUodGhpcyk7JyksICdSZWd1bGFyIEV4cHJlc3Npb24nKS5uLgoJCQkkdGhpcy0+Zklu cHV0KCd0ZXh0JywgJ3N1ZmZpeCcsICcnLCBhcnJheSgna2V5dXAnID0+ICdjb21wb25lbnRf dXBkYXRlKHRoaXMpOycpLCAnU3VmZml4Jykubi4KCQkJJHRoaXMtPmZJbnB1dCgndGV4dCcs ICd0ZXh0JywgJycsIGFycmF5KCdrZXl1cCcgPT4gJ2NvbXBvbmVudF91cGRhdGUodGhpcyk7 JyksICdUZXh0JykKCQkpOwoJCSRociA9ICc8aHIgc3R5bGU9ImJvcmRlcjogMDsgaGVpZ2h0 OiAxcHg7IGJhY2tncm91bmQtY29sb3I6IHJnYigyMDAsIDIwMCwgMjAwKTsgY29sb3I6IHJn YigyMDAsIDIwMCwgMjAwKTsgbWFyZ2luLWJvdHRvbTogMTBweDsiIC8+JzsKCQkkb3V0W10g PSAkaHI7CgkJJG91dFtdID0gJzwvZm9ybT4nOwoKCQkvLyAtLS0gU2V0dGluZ3MgZm9ybSAt LS0gLy8KCgkJJG91dFtdID0gJzxmb3JtIGFjdGlvbj0iaW5kZXgucGhwIiBtZXRob2Q9InBv c3QiIG5hbWU9IicuJHNldHRpbmdzX2Zvcm0uJyIgb25zdWJtaXQ9InJldHVybiBzYXZlKHRo aXMpOyI+JzsKCgkJLy8gLS0tIFNldHRpbmdzIC0tLSAvLwoKCQkkb3V0W10gPSBoZWQoJzxh IGhyZWY9IiMiIG9uY2xpY2s9InRvZ2dsZURpc3BsYXkoXCdzZXR0aW5nc1wnKTsgcmV0dXJu IGZhbHNlOyI+U2V0dGluZ3M8L2E+JywgMik7CgkJJG91dFtdID0gJzxkaXYgaWQ9InNldHRp bmdzIj4nOwoJCSRvdXRbXSA9IGdyYWYoJHRoaXMtPmZJbnB1dCgndGV4dCcsICdwbF9uYW1l JywgJHBsX25hbWUsIE5VTEwsICdOYW1lJykpOwoJCSRvdXRbXSA9IGdyYWYoJHRoaXMtPmZJ bnB1dCgndGV4dCcsICdwbF9wcmVjZWRlbmNlJywgJHBsX3ByZWNlZGVuY2UsIE5VTEwsICdQ cmVjZWRlbmNlJykpOwoJCSRvdXRbXSA9ICc8L2Rpdj4nOwoJCSRvdXRbXSA9ICRocjsKCgkJ Ly8gLS0tIENvbmRpdGlvbnMgLS0tIC8vCgoJCSRvdXRbXSA9IGhlZCgnPGEgaHJlZj0iIyIg b25jbGljaz0idG9nZ2xlRGlzcGxheShcJ2NvbmRpdGlvbnNcJyk7IHJldHVybiBmYWxzZTsi PkNvbmRpdGlvbnM8L2E+JywgMik7CgkJJG91dFtdID0gJzxkaXYgaWQ9ImNvbmRpdGlvbnMi IHN0eWxlPSJkaXNwbGF5Om5vbmUiPic7CgkJJG91dFtdID0gZ3JhZihzdHJvbmcoJ09ubHkg dXNlIHRoaXMgcGVybWFuZW50IGxpbmsgaWYgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFw cGx5Li4uJykpOwoKCQkvLyBHZW5lcmF0ZSBhIHNlY3Rpb25zIGFycmF5IChuYW1lPT50aXRs ZSkKCQkkc2VjdGlvbnMgPSBhcnJheSgpOwoJCSRycyA9IHNhZmVfcm93cygnbmFtZSwgdGl0 bGUnLCAndHhwX3NlY3Rpb24nLCAibmFtZSAhPSAnZGVmYXVsdCcgb3JkZXIgYnkgbmFtZSIp OwoJCWZvcmVhY2ggKCRycyBhcyAkc2VjKSB7CgkJCSRzZWN0aW9uc1skc2VjWyduYW1lJ11d ID0gJHNlY1sndGl0bGUnXTsKCQl9CgoJCS8vIEdlbmVyYXRlIGEgY2F0ZWdvcmllcyBhcnJh eSAobmFtZT0+dGl0bGUpCgkJJGNhdGVnb3JpZXMgPSBhcnJheSgpOwoJCSRycyA9IHNhZmVf cm93cygnbmFtZSwgdGl0bGUnLCAndHhwX2NhdGVnb3J5JywgInR5cGUgPSAnYXJ0aWNsZScg YW5kIG5hbWUgIT0gJ3Jvb3QnIG9yZGVyIGJ5IG5hbWUiKTsKCQlmb3JlYWNoICgkcnMgYXMg JHNlYykgewoJCQkkY2F0ZWdvcmllc1skc2VjWyduYW1lJ11dID0gJHNlY1sndGl0bGUnXTsK CQl9CgoJCSRvdXRbXSA9IGdyYWYgKAoJCQkkdGhpcy0+ZlNlbGVjdCgnY29uX3NlY3Rpb24n LCAkc2VjdGlvbnMsICRjb25fc2VjdGlvbiwgMSwgJ1dpdGhpbiBzZWN0aW9uJykubi4KCQkJ JHRoaXMtPmZTZWxlY3QoJ2Nvbl9jYXRlZ29yeScsICRjYXRlZ29yaWVzLCAkY29uX2NhdGVn b3J5LCAxLCAnV2l0aGluIGNhdGVnb3J5JykKCQkpOwoJCSRvdXRbXSA9ICc8L2Rpdj4nOwoJ CSRvdXRbXSA9ICRocjsKCgkJLy8gLS0tIERlc3RpbmF0aW9uIC0tLSAvLwoKCQkkb3V0W10g PSBoZWQoJzxhIGhyZWY9IiMiIG9uY2xpY2s9InRvZ2dsZURpc3BsYXkoXCdkZXN0aW5hdGlv blwnKTsgcmV0dXJuIGZhbHNlOyI+RGVzdGluYXRpb248L2E+JywgMik7CgkJJG91dFtdID0g JzxkaXYgaWQ9ImRlc3RpbmF0aW9uIiBzdHlsZT0iZGlzcGxheTpub25lIj4nOwoJCSRvdXRb XSA9IGdyYWYoc3Ryb25nKCdGb3J3YXJkIHRoaXMgcGVybWFuZW50IGxpbmsgdG8uLi4nKSk7 CgkJJG91dFtdID0gZ3JhZiAoCgkJCSR0aGlzLT5mU2VsZWN0KCdkZXNfc2VjdGlvbicsICRz ZWN0aW9ucywgJGRlc19zZWN0aW9uLCAxLCAnU2VjdGlvbicpLm4uCgkJCSR0aGlzLT5mU2Vs ZWN0KCdkZXNfY2F0ZWdvcnknLCAkY2F0ZWdvcmllcywgJGRlc19jYXRlZ29yeSwgMSwgJ0Nh dGVnb3J5JykKCQkpOwoJCSRvdXRbXSA9IGdyYWYoJHRoaXMtPmZTZWxlY3QoJ2Rlc19wYWdl Jywgc2FmZV9jb2x1bW4oJ25hbWUnLCAndHhwX3BhZ2UnLCAiMSIpLCBAJGRlc19wYWdlLCAx LCAnUGFnZScpKTsKCQkkb3V0W10gPSBncmFmKCR0aGlzLT5mQm94ZXMoJ2Rlc19mZWVkJywg YXJyYXkoJ3JzcycsICdhdG9tJywgJycpLCAkZGVzX2ZlZWQsIE5VTEwsIGFycmF5KCdSU1Mg ZmVlZCcsICdBdG9tIGZlZWQnLCAnTmVpdGhlcicpKSk7CgkJJG91dFtdID0gZ3JhZihzdHJv bmcoJ1JlZGlyZWN0IHRoaXMgcGVybWFuZW50IGxpbmsgdG8uLi4nKSk7CgkJLy8gR2VuZXJh dGUgYSBwZXJtbGlua3MgYXJyYXkKCQkkcGVybWxpbmtzID0gJHRoaXMtPnBhcmVudC0+Z2V0 X2FsbF9wZXJtbGlua3MoMSk7CgkJZm9yZWFjaCAoJHBlcm1saW5rcyBhcyAka2V5ID0+ICRw bCkgewoJCQkkcGVybWxpbmtzWyRrZXldID0gJHBsWydzZXR0aW5ncyddWydwbF9uYW1lJ107 CgkJfQoJCXVuc2V0KCRwZXJtbGlua3NbJGlkXSk7CgkJJG91dFtdID0gZ3JhZigkdGhpcy0+ ZlNlbGVjdCgnZGVzX3Blcm1saW5rJywgJHBlcm1saW5rcywgQCRkZXNfcGVybWxpbmssIDEs ICdQZXJtYW5lbnQgbGluaycpKTsKCQkkb3V0W10gPSBncmFmKCR0aGlzLT5mSW5wdXQoJ3Rl eHQnLCAnZGVzX2xvY2F0aW9uJywgJGRlc19sb2NhdGlvbiwgTlVMTCwgJ0hUVFAgbG9jYXRp b24nKSk7CgkJJG91dFtdID0gJzwvZGl2Pic7CgkJJG91dFtdID0gJGhyOwoKCQkvLyBTYXZl IGJ1dHRvbgoJCSRvdXRbXSA9IGZJbnB1dCgnc3VibWl0JywgJycsICdTYXZlIHBlcm1hbmVu dCBsaW5rJyk7CgoJCS8vIEV4dHJhIGZvcm0gaW5wdXRzIHdoaWNoIGdldCBmaWxsZWQgb24g c3VibWl0CgkJJG91dFtdID0gaElucHV0KCdjb21wb25lbnRzJywgJycpOwoJCSRvdXRbXSA9 IGhJbnB1dCgncGxfcHJldmlldycsICcnKTsKCQkvLyBFdmVudCBhbmQgdGFiIGZvcm0gaW5w dXRzCgkJJG91dFtdID0gJHRoaXMtPmZvcm1faW5wdXRzKCk7CgkJLy8gU3RlcCBhbmQgSUQg Zm9ybSBpbnB1dHMKCQkkb3V0W10gPSBzSW5wdXQoJHN0ZXApOwoJCSRvdXRbXSA9IGhJbnB1 dChnYnBfaWQsICRpZCk7CgoJCSRvdXRbXSA9ICc8L2Zvcm0+JzsKCgkJLy8gTGV0cyBlY2hv IGV2ZXJ5dGhpbmcgb3V0LiBZYWghCgkJZWNobyBqb2luKG4sICRvdXQpOwoJfQoKCWZ1bmN0 aW9uIGZMYWJlbCAoJGxhYmVsLCAkY29udGVudHMgPSAnJywgJGxhYmVsX3JpZ2h0ID0gZmFs c2UpIHsKCQkvLyA8bGFiZWw+IHRoZSBjb250ZW50cyB3aXRoIHRoZSBuYW1lICRsYWJsZQoJ CSRjb250ZW50cyA9ICgkbGFiZWxfcmlnaHQpCgkJPyAkY29udGVudHMuJGxhYmVsCgkJOiAk bGFiZWwuKCRjb250ZW50cyA/ICc6ICcuJGNvbnRlbnRzIDogJycpOwoJCXJldHVybiB0YWco JGNvbnRlbnRzLCAnbGFiZWwnKTsKCX0KCglmdW5jdGlvbiBmQm94ZXMgKCRuYW1lID0gJycs ICR2YWx1ZSA9ICcnLCAkY2hlY2tlZF92YWx1ZSA9ICcnLCAkb24gPSBhcnJheSgpLCAkbGFi ZWwgPSAnJykgewoJCSRvdXQgPSBhcnJheSgpOwoJCWlmIChpc19hcnJheSgkdmFsdWUpKSB7 CgkJCSRpID0gMDsKCQkJZm9yZWFjaCAoJHZhbHVlIGFzICR2YWwpIHsKCQkJCSRvID0gJzxp bnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iJy4kbmFtZS4nIiB2YWx1ZT0iJy4kdmFsLiciJzsK CQkJCSRvIC49ICgkY2hlY2tlZF92YWx1ZSA9PSAkdmFsKSA/ICcgY2hlY2tlZD0iY2hlY2tl ZCInIDogJyc7CgkJCQlpZiAoaXNfYXJyYXkoJG9uKSkgZm9yZWFjaCgkb24gYXMgJGsgPT4g JHYpCgkJCQkJJG8gLj0gKCRvbikgPyAnIG9uJy4kay4nPSInLiR2LiciJyA6ICcnOwoJCQkJ JG8gLj0gJyAvPic7CgkJCQkkb3V0W10gPSAkdGhpcy0+ZkxhYmVsKCRsYWJlbFskaSsrXSwg JG8sIHRydWUpOwoJCQl9CgkJfSBlbHNlIHsKCQkJJG8gPSAnPGlucHV0IHR5cGU9ImNoZWNr Ym94IiBuYW1lPSInLiRuYW1lLiciIHZhbHVlPSInLiR2YWx1ZS4nIic7CgkJCSRvIC49ICgk Y2hlY2tlZF92YWx1ZSA9PSAkdmFsdWUpID8gJyBjaGVja2VkPSJjaGVja2VkIicgOiAnJzsK CQkJaWYgKGlzX2FycmF5KCRvbikpIGZvcmVhY2goJG9uIGFzICRrID0+ICR2KQoJCQkJJG8g Lj0gKCRvbikgPyAnIG9uJy4kay4nPSInLiR2LiciJyA6ICcnOwoJCQkkbyAuPSAnIC8+JzsK CQkJJG91dFtdID0gJHRoaXMtPmZMYWJlbCgkbGFiZWwsICRvLCB0cnVlKTsKCQl9CgoJCXJl dHVybiBqb2luKCcnLCAkb3V0KTsKCX0KCglmdW5jdGlvbiBmSW5wdXQgKCR0eXBlLCAkbmFt ZSA9ICcnLCAkdmFsdWUgPSAnJywgJG9uID0gYXJyYXkoKSwgJGxhYmVsID0gJycpIHsKCQlp ZiAoJHR5cGUgPT0gJ3JhZGlvJyB8fCAkdHlwZSA9PSAnY2hlY2tib3gnKQoJCQlyZXR1cm4g JHRoaXMtPmZCb3hlcygkbmFtZSwgJHZhbHVlLCAkb24sICRsYWJlbCk7CgoJCSRvID0gJzxp bnB1dCB0eXBlPSInLiR0eXBlLiciIG5hbWU9IicuJG5hbWUuJyIgdmFsdWU9IicuJHZhbHVl LiciJzsKCQlpZiAoaXNfYXJyYXkoJG9uKSkgZm9yZWFjaCgkb24gYXMgJGsgPT4gJHYpCgkJ CSRvIC49ICgkb24pID8gJyBvbicuJGsuJz0iJy4kdi4nIicgOiAnJzsKCQkkbyAuPSAnIC8+ JzsKCQlyZXR1cm4gKCRsYWJlbCkgPyAkdGhpcy0+ZkxhYmVsKCRsYWJlbCwgJG8pIDogJG87 Cgl9CgoJZnVuY3Rpb24gZlNlbGVjdCAoJG5hbWUgPSAnJywgJGFycmF5ID0gJycsICR2YWx1 ZSA9ICcnLCAkYmxhbmtfZmlyc3QgPSAnJywgJGxhYmVsID0gJycsICRvbl9zdWJtaXQgPSAn JykgewoJCSRvID0gc2VsZWN0SW5wdXQoJG5hbWUsICRhcnJheSwgJHZhbHVlLCAkYmxhbmtf Zmlyc3QsICRvbl9zdWJtaXQpOwoJCXJldHVybiAoJGxhYmVsID8gJHRoaXMtPmZMYWJlbCgk bGFiZWwsICRvKSA6ICRvKTsKCX0KCglmdW5jdGlvbiBwb3N0X3NhdmVfcGVybWxpbmsgKCkg ewoJCS8vIFRoZSBmdW5jdGlvbiBwb3N0cyBvciBzYXZlcyBhIHBlcm1hbmVudCBsaW5rIHRv IHR4cF9wcmVmcwoKCQlleHRyYWN0KGdwc2EoYXJyYXkoJ3N0ZXAnLCBnYnBfaWQpKSk7CgoJ CS8vIEdyYWIgdGhlIHVzZXIgZGVmaW5lZCBzZXR0aW5ncyBmcm9tIHRoZSBmb3JtIFBPU1Qg ZGF0YQoJCSRzZXR0aW5ncyA9IGdwc2EoYXJyYXkoCgkJCSdwbF9uYW1lJywgJ3BsX3ByZWNl ZGVuY2UnLCAncGxfcHJldmlldycsCgkJCSdjb25fc2VjdGlvbicsICdjb25fY2F0ZWdvcnkn LAoJCQknZGVzX3NlY3Rpb24nLCAnZGVzX2NhdGVnb3J5JywgJ2Rlc19wYWdlJywKCQkJJ2Rl c19wZXJtbGluaycsICdkZXNfZmVlZCcsICdkZXNfbG9jYXRpb24nLAoJCSkpOwoKCQkvLyBS ZW1vdmUgc3BhY2VzIGZyb20gdGhlIHBlcm1hbmVudCBsaW5rIHByZXZpZXcKCQkkc2V0dGlu Z3NbJ3BsX3ByZXZpZXcnXSA9IHByZWdfcmVwbGFjZSgnJVxzKy9ccyolJywgJy8nLCAkc2V0 dGluZ3NbJ3BsX3ByZXZpZXcnXSk7CgoJCS8vIEV4cGxvZGUgdGhlIHNlcGFyYXRlZCBzdHJp bmcgb2Ygc2VyaWFsaXplIGNvbXBvbmVudHMgLSB0aGlzIHdhcyBtYWRlIGJ5IEphdmFTY3Jp cHQuCgkJJHNlcmlhbGl6ZV9jb21wb25lbnRzID0gZXhwbG9kZShnYnBfc2VwYXJhdG9yLCBy dHJpbShncHMoJ2NvbXBvbmVudHMnKSwgZ2JwX3NlcGFyYXRvcikpOwoKCQkvLyBVbnNlcmlh bGl6ZSB0aGUgY29tcG9uZW50cwoJCSRjb21wb25lbnRzID0gYXJyYXkoKTsKCQlmb3JlYWNo ICgkc2VyaWFsaXplX2NvbXBvbmVudHMgYXMgJGMpCgkJCSRjb21wb25lbnRzW10gPSB1bnNl cmlhbGl6ZShzdHJpcHNsYXNoZXMoJGMpKTsKCgkJLy8gQ29tcGxldGUgdGhlIHBlcm1hbmVu dCBsaW5rIGFycmF5IC0gdGhpcyBpcyBleGFjdGx5IHdoYXQgbmVlZHMgdG8gYmUgc3RvcmVk IGluIHRoZSBkYgoJCSRwZXJtbGluayA9IGFycmF5KCdzZXR0aW5ncycgPT4gJHNldHRpbmdz LCAnY29tcG9uZW50cycgPT4gJGNvbXBvbmVudHMpOwoKCQkvLyBTYXZlIGl0CgkJJHRoaXMt PnNldF9wcmVmZXJlbmNlKCRpZCwgJHBlcm1saW5rLCAnZ2JwX3NlcmlhbGl6ZWQnKTsKCgkJ JHRoaXMtPnBhcmVudC0+bWVzc2FnZSA9IG1lc3NlbmdlcignJywgJHNldHRpbmdzWydwbF9u YW1lJ10sICdzYXZlZCcpOwoJfQoKCWZ1bmN0aW9uIHBocEFycmF5VG9Kc0FycmF5ICgkbmFt ZSwgJGFycmF5KSB7CgkJLy8gRnJvbSBQSFAubmV0CgkJaWYgKGlzX2FycmF5KCRhcnJheSkp IHsKCQkJJHJlc3VsdCA9ICRuYW1lLicgPSBuZXcgQXJyYXkoKTsnLm47CgkJCWZvcmVhY2gg KCRhcnJheSBhcyAka2V5ID0+ICR2YWx1ZSkKCQkJCSRyZXN1bHQgLj0gJHRoaXMtPnBocEFy cmF5VG9Kc0FycmF5KCRuYW1lLidbXCcnLiRrZXkuJ1wnXScsJHZhbHVlLCcnKS5uOwoJCX0g ZWxzZSB7CgkJCSRyZXN1bHQgPSAkbmFtZS4nID0gXCcnLiRhcnJheS4nXCc7JzsKCQl9CgkJ cmV0dXJuICRyZXN1bHQ7Cgl9Cn0KCmNsYXNzIFBlcm1hbmVudExpbmtzTGlzdFRhYlZpZXcg ZXh0ZW5kcyBHQlBBZG1pblRhYlZpZXcKewoJZnVuY3Rpb24gcHJlbG9hZCAoKSB7CgkJcmVn aXN0ZXJfY2FsbGJhY2soYXJyYXkoJiR0aGlzLCAkdGhpcy0+cGFyZW50LT5ldmVudC4nX211 bHRpX2VkaXQnKSwgJHRoaXMtPnBhcmVudC0+ZXZlbnQsICR0aGlzLT5wYXJlbnQtPmV2ZW50 LidfbXVsdGlfZWRpdCcsIDEpOwoJCXJlZ2lzdGVyX2NhbGxiYWNrKGFycmF5KCYkdGhpcywg JHRoaXMtPnBhcmVudC0+ZXZlbnQuJ19jaGFuZ2VfcGFnZWJ5JyksICR0aGlzLT5wYXJlbnQt PmV2ZW50LCAkdGhpcy0+cGFyZW50LT5ldmVudC4nX2NoYW5nZV9wYWdlYnknLCAxKTsKCX0K CglmdW5jdGlvbiBtYWluICgpIHsKCQlleHRyYWN0KGdwc2EoYXJyYXkoJ3BhZ2UnLCAnc29y dCcsICdkaXInLCAnY3JpdCcsICdzZWFyY2hfbWV0aG9kJykpKTsKCgkJJGV2ZW50ID0gJHRo aXMtPnBhcmVudC0+ZXZlbnQ7CgoJCSRwZXJtbGlua3MgPSAkdGhpcy0+cGFyZW50LT5nZXRf YWxsX3Blcm1saW5rcygpOwoJCSR0b3RhbCA9IGNvdW50KCRwZXJtbGlua3MpOwoKCQlpZiAo JHRvdGFsIDwgMSkgewoJCQllY2hvIGdyYWYoJ1lvdSBoYXZlblwndCBjcmVhdGVkIGFueSBj dXN0b20gcGVybWFuZW50IGxpbmtzIHJ1bGVzIHlldC4nLCAnIHN0eWxlPSJ0ZXh0LWFsaWdu OiBjZW50ZXI7IicpLgoJCQkJIGdyYWYoJzxhIGhyZWY9IicuJHRoaXMtPnVybChhcnJheShn YnBfdGFiID0+ICdidWlsZCcpLCB0cnVlKS4nIj5DbGljayBoZXJlPC9hPiB0byBhZGQgb25l LicsICcgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiJyk7CgkJCXJldHVybjsKCQl9CgoJ CSRsaW1pdCA9IG1heCgkdGhpcy0+cHJlZignbGlzdF9wYWdlYnknKSwgMTUpOwoKCQlsaXN0 KCRwYWdlLCAkb2Zmc2V0LCAkbnVtUGFnZXMpID0gJHRoaXMtPnBhZ2VyKCR0b3RhbCwgJGxp bWl0LCAkcGFnZSk7CgoJCWlmIChlbXB0eSgkc29ydCkpCgkJCSRzb3J0ID0gJ3BsX3ByZWNl ZGVuY2UnOwoKCQlpZiAoZW1wdHkoJGRpcikpCgkJCSRkaXIgPSAnZGVzYyc7CgoJCSRkaXIg PSAoJGRpciA9PSAnZGVzYycpID8gJ2Rlc2MnIDogJ2FzYyc7CgoJCS8vIFNvcnQgdGhlIHBl cm1saW5rcyB2aWEgdGhlIHNlbGVjdGVkIGNvbHVtbiBhbmQgdGhlbiB0aGVpciBuYW1lcy4K CQlmb3JlYWNoICgkcGVybWxpbmtzIGFzICRpZCA9PiAkcGVybWxpbmspIHsKCQkJJHNvcnRf a2V5c1skaWRdID0gJHBlcm1saW5rWydzZXR0aW5ncyddWyRzb3J0XTsKCQkJJG5hbWVbJGlk XSA9ICRwZXJtbGlua1snc2V0dGluZ3MnXVsncGxfbmFtZSddOwoJCX0KCQlhcnJheV9tdWx0 aXNvcnQoJHNvcnRfa2V5cywgKCgkZGlyID09ICdkZXNjJykgPyBTT1JUX0RFU0MgOiBTT1JU X0FTQyksICRuYW1lLCBTT1JUX0FTQywgJHBlcm1saW5rcyk7CgoJCSRzd2l0Y2hfZGlyID0g KCRkaXIgPT0gJ2Rlc2MnKSA/ICdhc2MnIDogJ2Rlc2MnOwoKCQkkcGVybWxpbmtzID0gYXJy YXlfc2xpY2UoJHBlcm1saW5rcywgJG9mZnNldCwgJGxpbWl0KTsKCgkJaWYgKGNvdW50KCRw ZXJtbGlua3MpKSB7CgkJCWVjaG8gbi5uLic8Zm9ybSBuYW1lPSJsb25nZm9ybSIgbWV0aG9k PSJwb3N0IiBhY3Rpb249ImluZGV4LnBocCIgb25zdWJtaXQ9InJldHVybiB2ZXJpZnkoXCcn LmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPicuCgoJCQkJbi5zdGFydFRhYmxlKCdsaXN0 JykuCgkJCQluLnRyKAoJCQkJCW4uY29sdW1uX2hlYWQoJ25hbWUnLCAncGxfbmFtZScsICRl dmVudCwgdHJ1ZSwgJHN3aXRjaF9kaXIsICRjcml0LCAkc2VhcmNoX21ldGhvZCkuCgkJCQkJ aENlbGwoKS4KCQkJCQljb2x1bW5faGVhZCgncHJldmlldycsICdwbF9wcmV2aWV3JywgJGV2 ZW50LCB0cnVlLCAkc3dpdGNoX2RpciwgJGNyaXQsICRzZWFyY2hfbWV0aG9kKS4KCQkJCQlj b2x1bW5faGVhZCgncHJlY2VkZW5jZScsICdwbF9wcmVjZWRlbmNlJywgJGV2ZW50LCB0cnVl LCAkc3dpdGNoX2RpciwgJGNyaXQsICRzZWFyY2hfbWV0aG9kKS4KCQkJCQloQ2VsbCgpCgkJ CQkpOwoKCQkJaW5jbHVkZV9vbmNlIHR4cGF0aC4nL3B1Ymxpc2gvdGFnaGFuZGxlcnMucGhw JzsKCgkJCWZvcmVhY2ggKCRwZXJtbGlua3MgYXMgJGlkID0+ICRwZXJtbGluaykgewoJCQkJ ZXh0cmFjdCgkcGVybWxpbmtbJ3NldHRpbmdzJ10pOwoKCQkJCSRtYW5hZ2UgPSBuLic8dWwn Lih2ZXJzaW9uX2NvbXBhcmUoJEdMT0JBTFNbJ3RoaXN2ZXJzaW9uJ10sICc0LjAuMycsICc8 PScpID8gJyBzdHlsZT0ibWFyZ2luOjA7cGFkZGluZzowO2xpc3Qtc3R5bGUtdHlwZTpub25l OyI+JyA6ICc+JykuCgkJCQkJCW4udC4nPGxpPicuaHJlZihnVHh0KCdlZGl0JyksICR0aGlz LT51cmwoYXJyYXkoZ2JwX3RhYiA9PiAnYnVpbGQnLCBnYnBfaWQgPT4gJGlkKSwgdHJ1ZSkp Lic8L2xpPicuCgkJCQkJCW4uJzwvdWw+JzsKCgkJCQllY2hvIG4ubi50cigKCgkJCQkJdGQo CgkJCQkJCWhyZWYoJHBsX25hbWUsICR0aGlzLT51cmwoYXJyYXkoZ2JwX3RhYiA9PiAnYnVp bGQnLCBnYnBfaWQgPT4gJGlkKSwgdHJ1ZSkpCgkJCQkJLCA3NSkuCgoJCQkJCXRkKCRtYW5h Z2UsIDM1KS4KCgkJCQkJdGQoJHBsX3ByZXZpZXcsIDE3NSkuCgkJCQkJdGQoJHBsX3ByZWNl ZGVuY2UuJyZuYnNwOycsIDUwKS4KCgkJCQkJdGQoCgkJCQkJCWZJbnB1dCgnY2hlY2tib3gn LCAnc2VsZWN0ZWRbXScsICRpZCkKCQkJCQkpCgkJCQkpOwoJCQl9CgoJCQllY2hvIG4ubi50 cigKCQkJCXRkYSgKCQkJCQlzZWxlY3RfYnV0dG9ucygpLgoJCQkJCSR0aGlzLT5wZXJtbGlu a3NfbXVsdGllZGl0X2Zvcm0oJHBhZ2UsICRzb3J0LCAkZGlyLCAkY3JpdCwgJHNlYXJjaF9t ZXRob2QpCgkJCQksJyBjb2xzcGFuPSI0IiBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7IGJv cmRlcjogbm9uZTsiJykKCQkJKS4KCgkJCW4uZW5kVGFibGUoKS4KCQkJbi4nPC9mb3JtPicu CgoJCQluLiR0aGlzLT5uYXZfZm9ybSgkZXZlbnQsICRwYWdlLCAkbnVtUGFnZXMsICRzb3J0 LCAkZGlyLCAkY3JpdCwgJHNlYXJjaF9tZXRob2QpLgoKCQkJbi5wYWdlYnlfZm9ybSgkZXZl bnQsICR0aGlzLT5wcmVmKCdsaXN0X3BhZ2VieScpKTsKCQl9Cgl9CgoJZnVuY3Rpb24gcGFn ZXIgKCR0b3RhbCwgJGxpbWl0LCAkcGFnZSkgewoJCWlmIChmdW5jdGlvbl9leGlzdHMoJ3Bh Z2VyJykpCgkJCXJldHVybiBwYWdlcigkdG90YWwsICRsaW1pdCwgJHBhZ2UpOwoKCQkvLyBU aGlzIGlzIHRha2VuIGZyb20gdHhwbGliX21pc2MucGhwIHIxNTg4IGl0IGlzIHJlcXVpcmVk IGZvciA0LjAuMyBjb21wYXRpYml0bHkKCQkkbnVtX3BhZ2VzID0gY2VpbCgkdG90YWwgLyAk bGltaXQpOwoJCSRwYWdlID0gJHBhZ2UgPyAoaW50KSAkcGFnZSA6IDE7CgkJJHBhZ2UgPSBt aW4obWF4KCRwYWdlLCAxKSwgJG51bV9wYWdlcyk7CgkJJG9mZnNldCA9IG1heCgoJHBhZ2Ug LSAxKSAqICRsaW1pdCwgMCk7CgkJcmV0dXJuIGFycmF5KCRwYWdlLCAkb2Zmc2V0LCAkbnVt X3BhZ2VzKTsKCX0KCglmdW5jdGlvbiBuYXZfZm9ybSAoJGV2ZW50LCAkcGFnZSwgJG51bVBh Z2VzLCAkc29ydCwgJGRpciwgJGNyaXQsICRtZXRob2QpIHsKCQlpZiAoZnVuY3Rpb25fZXhp c3RzKCduYXZfZm9ybScpKQoJCQlyZXR1cm4gbmF2X2Zvcm0oJGV2ZW50LCAkcGFnZSwgJG51 bVBhZ2VzLCAkc29ydCwgJGRpciwgJGNyaXQsICRtZXRob2QpOwoKCQkvLyBUaGlzIGlzIGJh c2ljYWxseSBzdG9sZW4gZnJvbSB0aGUgNC4wLjMgdmVyc2lvbiBvZiBpbmNsdWRlcy90eHBf bGlzdC5waHAKCQkvLyAtIGxpc3RfbmF2X2Zvcm0oKSBmb3IgNC4wLjMgY29tcGF0aWJpdGx5 CgkJJG5hdltdID0gKCRwYWdlID4gMSkKCQkJPyBQcmV2TmV4dExpbmsoJGV2ZW50LCAkcGFn ZS0xLCBnVHh0KCdwcmV2JyksICdwcmV2JywgJHNvcnQsICRkaXIpIDogJyc7CgkJJG5hdltd ID0gc3Auc21hbGwoJHBhZ2UuICcvJy4kbnVtUGFnZXMpLnNwOwoJCSRuYXZbXSA9ICgkcGFn ZSAhPSAkbnVtUGFnZXMpCgkJCT8gUHJldk5leHRMaW5rKCRldmVudCwgJHBhZ2UrMSwgZ1R4 dCgnbmV4dCcpLCAnbmV4dCcsICRzb3J0LCAkZGlyKSA6ICcnOwoJCXJldHVybiAoJG5hdikK CQkJPyBncmFmKGpvaW4oJycsICRuYXYpLCAnIGFsaWduPSJjZW50ZXIiJykgOiAnJzsKCX0K CglmdW5jdGlvbiBwZXJtbGlua3NfbXVsdGllZGl0X2Zvcm0gKCRwYWdlLCAkc29ydCwgJGRp ciwgJGNyaXQsICRzZWFyY2hfbWV0aG9kKSB7CgkJJG1ldGhvZHMgPSBhcnJheSgKCQkJJ2Rl bGV0ZScgPT4gZ1R4dCgnZGVsZXRlJyksCgkJKTsKCgkJcmV0dXJuIGV2ZW50X211bHRpZWRp dF9mb3JtKCR0aGlzLT5wYXJlbnQtPmV2ZW50LCAkbWV0aG9kcywgJHBhZ2UsICRzb3J0LCAk ZGlyLCAkY3JpdCwgJHNlYXJjaF9tZXRob2QpOwoJfQoKCWZ1bmN0aW9uIHBlcm1saW5rc19j aGFuZ2VfcGFnZWJ5ICgpIHsKCQkkdGhpcy0+c2V0X3ByZWZlcmVuY2UoJ2xpc3RfcGFnZWJ5 JywgZ3BzKCdxdHknKSk7Cgl9CgoJZnVuY3Rpb24gcGVybWxpbmtzX211bHRpX2VkaXQgKCkg ewoJCSRtZXRob2QgPSBncHMoJ2VkaXRfbWV0aG9kJykKCQkJPyBncHMoJ2VkaXRfbWV0aG9k JykgLy8gRnJvbSBUeHAgNC4wLjQgYW5kIGdyZWF0ZXIKCQkJOiBncHMoJ21ldGhvZCcpOyAv LyBVcCB0byBUeHAgNC4wLjMKCgkJc3dpdGNoICgkbWV0aG9kKSB7CgkJCWNhc2UgJ2RlbGV0 ZSc6CgkJCQlmb3JlYWNoIChncHMoJ3NlbGVjdGVkJykgYXMgJGlkKSB7CgkJCQkJCQkkZGVs ZXRlZFtdID0gJHRoaXMtPnBhcmVudC0+cmVtb3ZlX3Blcm1saW5rKCRpZCk7CgkJCQl9CgkJ CWJyZWFrOwoJCX0KCgkJJHRoaXMtPnBhcmVudC0+bWVzc2FnZSA9IChpc3NldCgkZGVsZXRl ZCkgJiYgaXNfYXJyYXkoJGRlbGV0ZWQpICYmIGNvdW50KCRkZWxldGVkKSkKCQkJPyBtZXNz ZW5nZXIoJycsIGpvaW4oJywgJywgJGRlbGV0ZWQpICwnZGVsZXRlZCcpCgkJCTogbWVzc2Vu Z2VyKCdhbiBlcnJvciBvY2N1cnJlZCcsICcnLCAnJyk7Cgl9Cn0KCmdsb2JhbCAkZ2JwX3Bs OwokZ2JwX3BsID0gbmV3IFBlcm1hbmVudExpbmtzKCdQZXJtYW5lbnQgTGlua3MnLCAncGVy bWxpbmtzJywgJ2FkbWluJyk7CmlmIChAdHhwaW50ZXJmYWNlID09ICdwdWJsaWMnKSB7Cgly ZWdpc3Rlcl9jYWxsYmFjayhhcnJheSgmJGdicF9wbCwgJ19mZWVkX2VudHJ5JyksICdyc3Nf ZW50cnknKTsKCXJlZ2lzdGVyX2NhbGxiYWNrKGFycmF5KCYkZ2JwX3BsLCAnX2ZlZWRfZW50 cnknKSwgJ2F0b21fZW50cnknKTsKCXJlZ2lzdGVyX2NhbGxiYWNrKGFycmF5KCYkZ2JwX3Bs LCAnX3RleHRwYXR0ZXJuJyksICd0ZXh0cGF0dGVybicpOwoJcmVnaXN0ZXJfY2FsbGJhY2so YXJyYXkoJiRnYnBfcGwsICdfdGV4dHBhdHRlcm5fZW5kJyksICd0ZXh0cGF0dGVybl9lbmQn KTsKCglmdW5jdGlvbiBnYnBfaWZfcmVnZXggKCRhdHRzLCAkdGhpbmcpIHsKCQlnbG9iYWwg JHByZXRleHQ7CgkJZXh0cmFjdChsQXR0cyhhcnJheSgKCQkJJ25hbWUnID0+ICcnLAoJCQkn dmFsJyAgPT4gJycsCgkJKSwkYXR0cykpOwoJCSRtYXRjaCA9IChAJHByZXRleHRbInBlcm1s aW5rX3JlZ2V4X3skbmFtZX0iXSA9PSAkdmFsKTsKCQlyZXR1cm4gcGFyc2UoRXZhbEVsc2Uo JHRoaW5nLCAkbWF0Y2gpKTsKCX0KCglmdW5jdGlvbiBnYnBfaWZfdGV4dCAoJGF0dHMsICR0 aGluZykgewoJCWdsb2JhbCAkcHJldGV4dDsKCQlleHRyYWN0KGxBdHRzKGFycmF5KAoJCQkn bmFtZScgPT4gJycsCgkJCSd2YWwnICA9PiAnJywKCQkpLCRhdHRzKSk7CgoJCSRtYXRjaCA9 IGZhbHNlOwoJCWlmICghZW1wdHkoJG5hbWUpKSB7CgkJCWlmIChlbXB0eSgkdmFsKSkKCQkJ CSRtYXRjaCA9IChpc3NldCgkcHJldGV4dFsicGVybWxpbmtfdGV4dF97JG5hbWV9Il0pKTsK CQkJZWxzZQoJCQkJJG1hdGNoID0gKEAkcHJldGV4dFsicGVybWxpbmtfdGV4dF97JG5hbWV9 Il0gPT0gJHZhbCk7CgkJfQoJCXJldHVybiBwYXJzZShFdmFsRWxzZSgkdGhpbmcsICRtYXRj aCkpOwoJfQoKCWZ1bmN0aW9uIGdicF91c2VfcGFnZWxpbmsgKCRhdHRzLCAkdGhpbmcgPSAn JykgewoJCWdsb2JhbCAkZ2JwX3BsOwoJCWV4dHJhY3QobEF0dHMoYXJyYXkoCgkJCSdydWxl JyA9PiAnJywKCQkpLCRhdHRzKSk7CgkJcmV0dXJuICRnYnBfcGwtPl90ZXh0cGF0dGVybl9l bmQocGFyc2UoJHRoaW5nKSwgJHJ1bGUpOwoJfQoKCWZ1bmN0aW9uIGdicF9kaXNhYmxlX3Bl cm1saW5rcyAoJGF0dHMsICR0aGluZyA9ICcnKSB7CgkJZ2xvYmFsICRnYnBfcGw7CgkJcmV0 dXJuICRnYnBfcGwtPnRvZ2dsZV9wZXJtbGlua19tb2RlKCdwYXJzZScsICR0aGluZyk7Cgl9 Cn0KIjtzOjg6ImhlbHBfcmF3IjtzOjExOToiPGRpdiBpZD0icGVybWxpbmtfaGVscCI+Cgpo MSgjdG9wKS4gZ2JwX3Blcm1hbmVudF9saW5rcy4KClByb3ZpZGVzIGN1c3RvbSwgdXNlciBk ZWZpbmVkLCBwZXJtYW5lbnQgbGlua3MgcnVsZXMuCgo8L2Rpdj4iO3M6MzoibWQ1IjtzOjMy OiJjM2ZhYjNlYzFiMDk2ZjdhMGE4MTAzNDk5YTNlYmUxOCI7fQ==