# mem_self_register v0.9.3 # User self registration. Read the help to install. # Michael Manfre # http://manfre.net/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YToxMDp7czo0OiJuYW1lIjtzOjE3OiJtZW1fc2VsZl9yZWdpc3RlciI7czo3OiJ2ZXJzaW9u IjtzOjU6IjAuOS4zIjtzOjY6ImF1dGhvciI7czoxNDoiTWljaGFlbCBNYW5mcmUiO3M6MTA6 ImF1dGhvcl91cmkiO3M6MTg6Imh0dHA6Ly9tYW5mcmUubmV0LyI7czoxMToiZGVzY3JpcHRp b24iO3M6NDk6IlVzZXIgc2VsZiByZWdpc3RyYXRpb24uIFJlYWQgdGhlIGhlbHAgdG8gaW5z dGFsbC4iO3M6NDoidHlwZSI7aToxO3M6NDoiaGVscCI7czoxMDA1NzoiCTxoMSBjbGFzcz0i dGl0bGUiPlVzZXIgU2VsZiBSZWdpc3RyYXRpb248L2gxPgoKCTxoMiBjbGFzcz0ic2VjdGlv biBzdW1tYXJ5Ij5TdW1tYXJ5PC9oMj4KCgk8cD5UaGlzIHBsdWdpbiBpcyBkZXNpZ25lZCB0 byBlbmFibGUgY29tbXVuaXR5IGRyaXZlbiBzaXRlcy4gVXNlcnMgd2lsbCBiZSBhYmxlIHRv IHJlZ2lzdGVyIHRoZW1zZWx2ZXMgZm9yIGFuIGFjY291bnQgdG8gYWNjZXNzIHRoZSBzeXN0 ZW0uIFRoaXMgcGx1Z2luIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgaWduX3VzZXJfcGFzc3dv cmQgcGx1Z2luIGFsdGVybmF0ZSB1c2VyIHRhYmxlLiBUaGlzIHBsdWdpbiBwcm92aWRlcyB1 c2VyIHNpZGUgdGFncyBmb3IgZ2VuZXJhdGluZyBhbiBodG1sIGZvcm0gd2hlcmUgdXNlcnMg Y2FuIGVkaXQgdGhlaXIgYWNjb3VudCBpbmZvcm1hdGlvbi48L3A+CgoJPGgyIGNsYXNzPSJz ZWN0aW9uIGNvbnRhY3QiPkF1dGhvciBDb250YWN0PC9oMj4KCgk8cD48YSBocmVmPSJtYWls dG86bW1hbmZyZUBnbWFpbC5jb20/c3ViamVjdD1UZXh0cGF0dGVybiUyMG1lbV9zZWxmX3Jl Z2lzdGVyJTIwcGx1Z2luIj5NaWNoYWVsIE1hbmZyZTwvYT48YnIgLz4KPGEgaHJlZj0iaHR0 cDovL21hbmZyZS5uZXQiPmh0dHA6Ly9tYW5mcmUubmV0PC9hPjwvcD4KCgk8aDIgY2xhc3M9 InNlY3Rpb24gbGljZW5zZSI+TGljZW5zZTwvaDI+CgoJPHA+VGhpcyBwbHVnaW4gaXMgbGlj ZW5zZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZnNmLm9yZy9saWNlbnNpbmcv bGljZW5zZXMvaW5mby9HUEx2Mi5odG1sIj5HUEx2MjwvYT4uPC9wPgoKCTxoMiBjbGFzcz0i c2VjdGlvbiBpbnN0YWxsYXRpb24iPkluc3RhbGxhdGlvbjwvaDI+CgoJPHA+VGhpcyBwbHVn aW4gcmVxdWlyZXMgdGhlIHBsdWdpbiBtZW1fZm9ybSA8YSBocmVmPSIuL2luZGV4LnBocD9l dmVudD1wbHVnaW4mYW1wO3N0ZXA9cGx1Z2luX2hlbHAmYW1wO25hbWU9bWVtX2Zvcm0iPiho ZWxwKTwvYT4uPC9wPgoKCTxwPjxhIGhyZWY9Ii4vaW5kZXgucGhwP2V2ZW50PXNlbGYtcmVn JmFtcDtzdGVwPXByZWluc3RhbGwmYW1wO2FyZWE9YWRtaW4iPlN0YXJ0IEluc3RhbGwgV2l6 YXJkPC9hPjwvcD4KCgk8aDIgY2xhc3M9InNlY3Rpb24gdGFncyI+VGFnczwvaDI+CgoJPHVs PgoJCTxsaT48YSBocmVmPSIjbWVtX3NlbGZfcmVnaXN0ZXJfZm9ybSI+bWVtX3NlbGZfcmVn aXN0ZXJfZm9ybTwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIjbWVtX2NoYW5nZV9wYXNzd29y ZF9mb3JtIj5tZW1fY2hhbmdlX3Bhc3N3b3JkX2Zvcm08L2E+PC9saT4KCQk8bGk+PGEgaHJl Zj0iI21lbV9zZWxmX3VzZXJfZWRpdF9mb3JtIj5tZW1fc2VsZl91c2VyX2VkaXRfZm9ybTwv YT48L2xpPgoJCTxsaT48YSBocmVmPSIjbWVtX3Byb2ZpbGUiPm1lbV9wcm9maWxlPC9hPjwv bGk+CgkJPGxpPjxhIGhyZWY9IiNzZWxmX3JlZ2lzdGVyX2VtYWlsX21lc3NhZ2UiPnNlbGZf cmVnaXN0ZXJfZW1haWxfbWVzc2FnZTwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIjc2VsZl9y ZWdpc3Rlcl9zdGF0dXNfbWVzc2FnZSI+c2VsZl9yZWdpc3Rlcl9zdGF0dXNfbWVzc2FnZTwv YT48L2xpPgoJCTxsaT48YSBocmVmPSIjaWZfc2VsZl9yZWdpc3RlcmVkIj5pZl9zZWxmX3Jl Z2lzdGVyZWQ8L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0iI21lbV9zZWxmX3VzZXJfY291bnQi Pm1lbV9zZWxmX3VzZXJfY291bnQ8L2E+PC9saT4KCTwvdWw+CgoJPGgzIGNsYXNzPSJ0YWci IGlkPSJtZW1fc2VsZl9yZWdpc3Rlcl9mb3JtIj5tZW1fc2VsZl9yZWdpc3Rlcl9mb3JtPC9o Mz4KCgk8cCBjbGFzcz0idGFnLXN1bW1hcnkiPlRoaXMgd2lsbCBvdXRwdXQgYW4gPHNwYW4g Y2xhc3M9ImNhcHMiPkhUTUw8L3NwYW4+IGZvcm0gdGhhdCB3aWxsIGFsbG93IGEgdXNlciB0 byByZWdpc3RlciB0aGVtc2VsdmVzIHdpdGggYW4gYWNjb3VudC48L3A+CgoJPHVsIGNsYXNz PSJhdHRzIj4KCQk8bGk+PHNwYW4gY2xhc3M9ImF0dHMtbmFtZSI+Zm9ybTwvc3Bhbj4gPHNw YW4gY2xhc3M9ImF0dHMtdHlwZSI+c3RyaW5nPC9zcGFuPiBTcGVjaWZpZXMgd2hpY2ggZm9y bSBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImNhcHMiPkhUTUw8L3NwYW4+IGZvcm0gdGVt cGxhdGUuIERlZmF1bHQgaXMgJiM4MjIwO3NlbGZfcmVnaXN0ZXJfZm9ybSYjODIyMTsuPC9s aT4KCQk8bGk+PHNwYW4gY2xhc3M9ImF0dHMtbmFtZSI+ZW1haWxfZm9ybTwvc3Bhbj4gPHNw YW4gY2xhc3M9ImF0dHMtdHlwZSI+c3RyaW5nPC9zcGFuPiBTcGVjaWZpZXMgd2hpY2ggZm9y bSBjb250YWlucyB0aGUgZW1haWwgbWVzc2FnZSB0ZW1wbGF0ZSB0aGF0IHdpbGwgYmUgc2Vu dCB0byBhIHVzZXIgdXBvbiByZWdpc3RlcmluZy4gRGVmYXVsdCBpcyAmIzgyMjA7c2VsZl9y ZWdpc3Rlcl9lbWFpbCYjODIyMTsuPC9saT4KCQk8bGk+PHNwYW4gY2xhc3M9ImF0dHMtbmFt ZSI+ZnJvbTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImF0dHMtdHlwZSI+c3RyaW5nPC9zcGFuPiBS ZWdpc3RyYXRpb24gZW1haWwmIzgyMTc7cyBGcm9tIGFkZHJlc3MuIERlZmF1bHRzIHRvIG1l bV9zZWxmX2FkbWluX2VtYWlsIHByZWZlcmVuY2UuPC9saT4KCQk8bGk+PHNwYW4gY2xhc3M9 ImF0dHMtbmFtZSI+cmVwbHk8L3NwYW4+IDxzcGFuIGNsYXNzPSJhdHRzLXR5cGUiPnN0cmlu Zzwvc3Bhbj4gUmVnaXN0cmF0aW9uIGVtYWlsJiM4MjE3O3MgUmVwbHkgVG8gYWRkcmVzcy48 L2xpPgoJCTxsaT48c3BhbiBjbGFzcz0iYXR0cy1uYW1lIj5zdWJqZWN0PC9zcGFuPiA8c3Bh biBjbGFzcz0iYXR0cy10eXBlIj5zdHJpbmc8L3NwYW4+IFN1YmplY3QgZm9yIGVtYWlsLiBE ZWZhdWx0IGlzICYjODIyMDtbU0lURU5BTUVdIFlvdXIgTG9naW4gSW5mbyYjODIyMTs8L2xp PgoJCTxsaT48c3BhbiBjbGFzcz0iYXR0cy1uYW1lIj5sb2dpbl91cmw8L3NwYW4+IDxzcGFu IGNsYXNzPSJhdHRzLXR5cGUiPnN0cmluZzwvc3Bhbj4gPHNwYW4gY2xhc3M9ImNhcHMiPlVS TDwvc3Bhbj4gdG8gdGhlIGxvZ2luIHBhZ2UuIERlZmF1bHQgaXMgVGV4cGF0dGVybiBhZG1p biBpbnRlcmZhY2UuPC9saT4KCTwvdWw+CgoJPHA+U3RhcnRlciBUZW1wbGF0ZTo8L3A+CgoJ PHA+PGNvZGU+Cgk8ZmllbGRzZXQ+Cgk8bGVnZW5kPlJlZ2lzdGVyPC9sZWdlbmQ+CgkJPHR4 cDptZW1fZm9ybV90ZXh0IG5hbWU9IlJlYWxOYW1lIiBsYWJlbD0iRnVsbCBOYW1lIiAvPjxi ciAvPgoKCQk8YnIgLz4KPC9wPgoKCTxwPgkJPHR4cDptZW1fZm9ybV90ZXh0IG5hbWU9Im5h bWUiIGxhYmVsPSJVc2VybmFtZSIgLz48YnIgLz4KCgkJPGJyIC8+CjwvcD4KCgk8cD4JCTx0 eHA6bWVtX2Zvcm1fZW1haWwgbmFtZT0iZW1haWwiIGxhYmVsPSJFLU1haWwiIC8+PGJyIC8+ CgoJCTxiciAvPgo8L3A+CgoJPHA+CQk8dHhwOm1lbV9mb3JtX3N1Ym1pdCAvPgoJPC9maWVs ZHNldD48YnIgLz4KPC9jb2RlPjwvcD4KCgk8cD5UZW1wbGF0ZSB0YWdzIHRoYXQgY2FuIGJl IHVzZWQgd2l0aGluIHRoZSBlbWFpbCB0ZW1wbGF0ZSBmb3JtLiBJbiBhZGRpdGlvbiB0byB0 aGUgdGFncyBsaXN0ZWQgYmVsb3csIGFueSBvdGhlciBUZXh0cGF0dGVybiB0YWcgY2FuIGJl IHVzZWQuPC9wPgoKCTx1bD4KCQk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fbmFtZSAvJmd0Ozwv Y29kZT4gJiM4MjEyOyBUaGUgbmFtZSBzdWJtaXR0ZWQgYnkgdGhlIHVzZXIuPC9saT4KCQk8 bGk+PGNvZGU+Jmx0O3R4cDptZW1fdXNlcm5hbWUgLyZndDs8L2NvZGU+ICYjODIxMjsgVGhl IHVzZXJuYW1lIHN1Ym1pdHRlZCBieSB0aGUgdXNlci48L2xpPgoJCTxsaT48Y29kZT4mbHQ7 dHhwOm1lbV9lbWFpbCAvJmd0OzwvY29kZT4gJiM4MjEyOyBUaGUgZW1haWwgYWRkcmVzcyBz dWJtaXR0ZWQgYnkgdGhlIHVzZXIuPC9saT4KCQk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fcGFz c3dvcmQgLyZndDs8L2NvZGU+ICYjODIxMjsgVGhlIHBhc3N3b3JkIGdlbmVyYXRlZCBmb3Ig dGhlIHVzZXIuPC9saT4KCQk8bGk+PGNvZGU+Jmx0O3R4cDptZW1fc2l0ZW5hbWUgLyZndDs8 L2NvZGU+ICYjODIxMjsgVGhlIHNpdGUgbmFtZSBhcyBzcGVjaWZpZWQgaW4gdGhlIFNpdGUg Q29uZmlndXJhdGlvbiAocHJlZnMgdGFiKS48L2xpPgoJCTxsaT48Y29kZT4mbHQ7dHhwOm1l bV9zaXRldXJsIC8mZ3Q7PC9jb2RlPiAmIzgyMTI7IFRoZSB1cmwgdG8gdGhlIGZyb250IHBh Z2Ugb2YgdGhpcyBzaXRlLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX2xvZ2ludXJs IC8mZ3Q7PC9jb2RlPiAmIzgyMTI7IFRoZSB1cmwgdG8gdGhlIFRleHRwYXR0ZXJuIGxvZyBp biBwYWdlLjwvbGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX2FkbWluX25hbWUgLyZndDs8 L2NvZGU+ICYjODIxMjsgVGhlIG5hbWUgb2YgdGhlIGFkbWluaXN0cmF0aXZlIGNvbnRhY3Qu IFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluIHRoZSBlbWFpbCBmcm9tIGZpZWxkLjwv bGk+CgkJPGxpPjxjb2RlPiZsdDt0eHA6bWVtX2FkbWluX2VtYWlsIC8mZ3Q7PC9jb2RlPiAm IzgyMTI7IFRoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSBhZG1pbmlzdHJhdGl2ZSBjb250YWN0 LiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBpbiB0aGUgZW1haWwgZnJvbSBmaWVsZC48 L2xpPgoJPC91bD4KCgk8cD5TdGFydGVyIFRlbXBsYXRlOjwvcD4KCgk8cD48Y29kZT48YnIg Lz4KRGVhciA8dHhwOm1lbV9uYW1lIC8+LAogIFRoYW5rIHlvdSBmb3IgcmVnaXN0ZXJpbmcg Zm9yIDx0eHA6bWVtX3NpdGVuYW1lIC8+LiBCZWxvdyBhcmUgeW91IHVzZXIgYWNjb3VudCBk ZXRhaWxzLjwvcD4KCgk8cD5Vc2VybmFtZTogPHR4cDptZW1fdXNlcm5hbWUgLz48YnIgLz4K UGFzc3dvcmQ6IDx0eHA6bWVtX3Bhc3N3b3JkIC8+PGJyIC8+ClNpdGUgPHNwYW4gY2xhc3M9 ImNhcHMiPlVSTDwvc3Bhbj46IDx0eHA6bWVtX3NpdGV1cmwgLz48YnIgLz4KTG9naW4gPHNw YW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj46IDx0eHA6bWVtX2xvZ2ludXJsIC8+PC9wPgoK CTxwPlNpbmNlcmVseSw8YnIgLz4KPHR4cDptZW1fYWRtaW5fbmFtZSAvPjxiciAvPgpFbWFp bDogPHR4cDptZW1fYWRtaW5fZW1haWwgLz48YnIgLz4KPC9jb2RlPjwvcD4KCgk8cD5FeGFt cGxlOjwvcD4KCgk8cD49PTxjb2RlPjxiciAvPgo8dHhwOm1lbV9zZWxmX3JlZ2lzdGVyX2Zv cm0gZnJvbT0iYWRtaW5AbXlzaXRlLmNvbSIgc3ViamVjdD0iW015U2l0ZV0gWW91ciBhY2Nv dW50IGluZm8iIHRoYW5rc19mb3JtPSJyZWdpc3RlcmVkX2Zvcm0iPgoJPGZpZWxkc2V0PgoJ PGxlZ2VuZD5SZWdpc3RlcjwvbGVnZW5kPgoJCTx0eHA6bWVtX2Zvcm1fdGV4dCBuYW1lPSJS ZWFsTmFtZSIgbGFiZWw9IkZ1bGwgTmFtZSIgLz48YnIgLz4KCgkJPGJyIC8+CjwvcD4KCgk8 cD4JCTx0eHA6bWVtX2Zvcm1fdGV4dCBuYW1lPSJuYW1lIiBsYWJlbD0iVXNlcm5hbWUiIC8+ PGJyIC8+CgoJCTxiciAvPgo8L3A+CgoJPHA+CQk8dHhwOm1lbV9mb3JtX2VtYWlsIG5hbWU9 ImVtYWlsIiBsYWJlbD0iRS1NYWlsIiAvPjxiciAvPgoKCQk8YnIgLz4KPC9wPgoKCTxwPgkJ PHR4cDptZW1fZm9ybV9zdWJtaXQgLz4KCTwvZmllbGRzZXQ+PGJyIC8+CjwvdHhwOm1lbV9z ZWxmX3JlZ2lzdGVyX2Zvcm0+PGJyIC8+CjwvY29kZT49PTwvcD4KCjxociAvPgoKCTxoMyBj bGFzcz0idGFnIiBpZD0iaWZfc2VsZl9yZWdpc3RlcmVkIj5pZl9zZWxmX3JlZ2lzdGVyZWQ8 L2gzPgoKCTxwIGNsYXNzPSJ0YWctc3VtbWFyeSI+VGhpcyB3aWxsIG91dHB1dCB0aGUgY29u dGVudHMgb2YgdGhlIHRhZyBpZiB0aGUgdXNlciBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVy ZWQuIFRvIHdvcmsgcHJvcGVybHksIHRoaXMgcmVxdWlyZXMgYnJvd3NlciBjb29raWVzIGFm dGVyIHRoZSBpbml0aWFsIGZvcm0gc3VibWlzc2lvbi4gVGhpcyB0YWcgc3VwcG9ydHMgPGNv ZGU+Jmx0O3R4cDplbHNlIC8mZ3Q7PC9jb2RlPjwvcD4KCgk8cD5FeGFtcGxlOjwvcD4KCgk8 cD48Y29kZT4KPHR4cDppZl9zZWxmX3JlZ2lzdGVyZWQ+CllvdSBhbHJlYWR5IGhhdmUgYW4g YWNjb3VudC4KPHR4cDplbHNlIC8+Ci4uLnJlZ2lzdHJhdGlvbiBmb3JtLi4uCjwvdHhwOmlm X3NlbGZfcmVnaXN0ZXJlZD4KPC9jb2RlPjwvcD4KCgk8aDMgY2xhc3M9InRhZyIgaWQ9Im1l bV9zZWxmX2NoYW5nZV9wYXNzd29yZF9mb3JtIj5tZW1fc2VsZl9jaGFuZ2VfcGFzc3dvcmRf Zm9ybTwvaDM+CgoJPHAgY2xhc3M9InRhZy1zdW1tYXJ5Ij5UaGlzIHRhZyBhbGxvd3MgYSBj aGFuZ2UgcGFzc3dvcmQgZm9ybSB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIHVzZXIgcG9ydGlv biBvZiB0aGUgd2Vic2l0ZS4gVGhpcyBpcyBtZWFudCB0byBiZSB1c2VkIHdpdGggdGhlIGln bl9wYXNzd29yZF9wcm90ZWN0IHBsdWdpbi4gVGhpcyB0YWcgc3VwcG9ydHMgdGhlIHRhZyB0 eHA6bWVtX3Byb2ZpbGUgKHNlZSBiZWxvdykuPC9wPgoKCTx1bCBjbGFzcz0iYXR0cyI+CgkJ PGxpPjxzcGFuIGNsYXNzPSJhdHRzLW5hbWUiPmZvcm08L3NwYW4+IDxzcGFuIGNsYXNzPSJh dHRzLXR5cGUiPnN0cmluZzwvc3Bhbj4gU3BlY2lmaWVzIHdoaWNoIGZvcm0gY29udGFpbnMg dGhlIDxzcGFuIGNsYXNzPSJjYXBzIj5IVE1MPC9zcGFuPiBmb3JtIHRlbXBsYXRlLjwvbGk+ CgkJPGxpPjxzcGFuIGNsYXNzPSJhdHRzLW5hbWUiPmVtYWlsX2Zvcm08L3NwYW4+IDxzcGFu IGNsYXNzPSJhdHRzLXR5cGUiPnN0cmluZzwvc3Bhbj4gU3BlY2lmaWVzIHdoaWNoIGZvcm0g Y29udGFpbnMgdGhlIGVtYWlsIG1lc3NhZ2UgdGVtcGxhdGUgdGhhdCB3aWxsIGJlIHNlbnQg dG8gYSB1c2VyIHVwb24gcmVnaXN0ZXJpbmcuPC9saT4KCQk8bGk+PHNwYW4gY2xhc3M9ImF0 dHMtbmFtZSI+ZnJvbTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImF0dHMtdHlwZSI+c3RyaW5nPC9z cGFuPiBSZWdpc3RyYXRpb24gZW1haWwmIzgyMTc7cyBGcm9tIGFkZHJlc3MuIERlZmF1bHRz IHRvIG1lbV9zZWxmX2FkbWluX2VtYWlsIHByZWZlcmVuY2UuPC9saT4KCQk8bGk+PHNwYW4g Y2xhc3M9ImF0dHMtbmFtZSI+cmVwbHk8L3NwYW4+IDxzcGFuIGNsYXNzPSJhdHRzLXR5cGUi PnN0cmluZzwvc3Bhbj4gUmVnaXN0cmF0aW9uIGVtYWlsJiM4MjE3O3MgUmVwbHkgVG8gYWRk cmVzcy48L2xpPgoJCTxsaT48c3BhbiBjbGFzcz0iYXR0cy1uYW1lIj5zdWJqZWN0PC9zcGFu PiA8c3BhbiBjbGFzcz0iYXR0cy10eXBlIj5zdHJpbmc8L3NwYW4+IFN1YmplY3QgZm9yIGVt YWlsLiBEZWZhdWx0IGlzICYjODIyMDtbU0lURU5BTUVdIFBhc3N3b3JkIENoYW5nZWQmIzgy MjE7PC9saT4KCTwvdWw+CgoJPGgzIGNsYXNzPSJ0YWciIGlkPSJtZW1fc2VsZl91c2VyX2Vk aXRfZm9ybSI+bWVtX3NlbGZfdXNlcl9lZGl0X2Zvcm08L2gzPgoKCTxwIGNsYXNzPSJ0YWct c3VtbWFyeSI+VGhpcyB0YWcgYWxsb3dzIGEgZm9ybSB0byBtb2RpZnkgdXNlciBpbmZvcm1h dGlvbiB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIHVzZXIgcG9ydGlvbiBvZiB0aGUgd2Vic2l0 ZS4gVGhpcyBpcyBtZWFudCB0byBiZSB1c2VkIHdpdGggdGhlIGlnbl9wYXNzd29yZF9wcm90 ZWN0IHBsdWdpbi4gVGhpcyB0YWcgc3VwcG9ydHMgdGhlIHRhZyB0eHA6bWVtX3Byb2ZpbGUu PC9wPgoKCTxoMyBjbGFzcz0idGFnIiBpZD0ibWVtX3Byb2ZpbGUiPm1lbV9wcm9maWxlPC9o Mz4KCgk8cCBjbGFzcz0idGFnLXN1bW1hcnkiPlRoaXMgdGFnIHdpbGwgb3V0cHV0IHRoZSB2 YWx1ZXMgb2YgdGhlIHVzZXImIzgyMTc7cyBwcm9maWxlLjwvcD4KCgk8cD5UYWcgQXR0cmli dXRlczo8L3A+CgoJPHVsPgoJCTxsaT48c3Ryb25nPnZhcjwvc3Ryb25nPiAmIzgyMTI7IFNw ZWNpZmllcyB0aGUgcHJvZmlsZSB2YWx1ZSBuYW1lIHRvIG91dHB1dC4gU3VwcG9ydGVkIHZh bHVlcyBhcmUgJiM4MjIwO3VzZXJfaWQmIzgyMjE7LCAmIzgyMjA7dXNlciYjODIyMTssICYj ODIyMDtSZWFsTmFtZSYjODIyMTssICYjODIyMDtlbWFpbCYjODIyMTssIGFuZCBhbnkgb3Ro ZXIgZGIgZmllbGQuPC9saT4KCQk8bGk+PHN0cm9uZz5mb3JtPC9zdHJvbmc+ICYjODIxMjsg QSBmb3JtIGNvbnRhaW5pbmcgb3RoZXIgdGFncyB0byBwYXJzZS48L2xpPgoJCTxsaT48c3Ry b25nPnVzZXJpZDwvc3Ryb25nPiAmIzgyMTI7IElmIHNwZWNpZmllZCwgdGhlIHByb2ZpbGUg aW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiB1c2VyX2lkIHdpbGwgYmUgZmV0Y2hlZC48L2xp PgoJCTxsaT48c3Ryb25nPnVzZXI8L3N0cm9uZz4gJiM4MjEyOyBJZiBzcGVjaWZpZWQsIHRo ZSBwcm9maWxlIGluZm9ybWF0aW9uIGZvciB0aGUgdXNlciB3aXRoIHRoZSBnaXZlbiBuYW1l IHdpbGwgYmUgZmV0Y2hlZC48L2xpPgoJPC91bD4KCgk8cD5FeGFtcGxlIGZvciBub24gbG9n Z2VkIGluIHVzZXI8YnIgLz4KPGNvZGU+Jmx0O3R4cDptZW1fcHJvZmlsZSB1c2VyPSZxdW90 O2pkb2UmcXVvdDsmZ3Q7CglUaGUgZW1haWwgYWRkcmVzcyBmb3IgJmx0O3R4cDptZW1fcHJv ZmlsZSB2YXI9JnF1b3Q7UmVhbE5hbWUmcXVvdDsgLyZndDsgaXMgJmx0O3R4cDptZW1fcHJv ZmlsZSB2YXI9JnF1b3Q7ZW1haWwmcXVvdDsgLyZndDsuCgkmbHQ7dHhwOmVsc2UgLyZndDsK CQlJJiMzOTttIHNvcnJ5LCBidXQgd2UgZG8gbm90IGhhdmUgYSByZWNvcmQgZm9yIHRoaXMg dXNlci4KJmx0Oy90eHA6bWVtX3Byb2ZpbGUmZ3Q7PC9jb2RlPjwvcD4KCgk8cD5FeGFtcGxl IGZvciBsb2dnZWQgaW4gdXNlcjxiciAvPgo8Y29kZT5XZWxjb21lIGJhY2sgJmx0O3R4cDpt ZW1fcHJvZmlsZSB2YXI9JnF1b3Q7UmVhbE5hbWUmcXVvdDsgLyZndDs8L2NvZGU+PC9wPgoK CTxoMyBjbGFzcz0idGFnIiBpZD0ibWVtX3NlbGZfcGFzc3dvcmRfcmVzZXRfZm9ybSI+bWVt X3NlbGZfcGFzc3dvcmRfcmVzZXRfZm9ybTwvaDM+CgoJPHAgY2xhc3M9InRhZy1zdW1tYXJ5 Ij5UaGlzIHRhZyB3aWxsIGFsbG93IGEgdXNlciB0byByZXF1ZXN0IGEgbmV3IHBhc3N3b3Jk IHRvIGJlIHNlbnQgdG8gdGhlaXIgZW1haWwgYWRkcmVzcy48L3A+CgoJPHA+U3RhcnRlciBU ZW1wbGF0ZTxiciAvPgo8Y29kZT4KJmx0O3R4cDptZW1fc2VsZl9wYXNzd29yZF9yZXNldF9m b3JtIGZvcm1fbWFpbD0mcXVvdDtyZXNldF9wYXNzd29yZF9mb3JtJnF1b3Q7Jmd0OwoJJmx0 O3R4cDptZW1fZm9ybV90ZXh0IG5hbWU9JnF1b3Q7bmFtZSZxdW90OyBsYWJlbD0mcXVvdDtV c2VybmFtZTomcXVvdDsgLyZndDsKCSZsdDticiAvJmd0OwoJJmx0O3R4cDptZW1fZm9ybV90 ZXh0IG5hbWU9JnF1b3Q7ZW1haWwmcXVvdDsgbGFiZWw9JnF1b3Q7RW1haWwgQWRkcmVzczom cXVvdDsgLyZndDsKCSZsdDticiAvJmd0OwoJJmx0O3R4cDptZW1fZm9ybV9zdWJtaXQgbmFt ZT0mcXVvdDtzdWJtaXQmcXVvdDsgbGFiZWw9JnF1b3Q7U3VibWl0JnF1b3Q7IC8mZ3Q7CiZs dDsvdHhwOm1lbV9zZWxmX3Bhc3N3b3JkX3Jlc2V0X2Zvcm0mZ3Q7CjwvY29kZT48L3A+CgoJ PGgzIGNsYXNzPSJ0YWciIGlkPSJtZW1fc2VsZl91c2VyX2NvdW50Ij5tZW1fc2VsZl91c2Vy X2NvdW50PC9oMz4KCgk8cCBjbGFzcz0idGFnLXN1bW1hcnkiPlJldHVybnMgdGhlIG51bWJl ciBvZiB1c2Vycy48L3A+CgoJPHVsIGNsYXNzPSJhdHRzIj4KCQk8bGk+PHNwYW4gY2xhc3M9 ImF0dHMtbmFtZSI+dXNlcl9sZXZlbHM8L3NwYW4+IDxzcGFuIGNsYXNzPSJhdHRzLXR5cGUi PnN0cmluZzwvc3Bhbj4gQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdXNlciBsZXZlbHMgdGhh dCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGNvdW50LiBEZWZhdWx0IGlzIGFsbCAmIzgy MjA7MCwxLDIsMyw0LDUsNiYjODIyMTs8L2xpPgoJCTxsaT48c3BhbiBjbGFzcz0iYXR0cy1u YW1lIj53cmFwdGFnPC9zcGFuPiA8c3BhbiBjbGFzcz0iYXR0cy10eXBlIj5zdHJpbmc8L3Nw YW4+IDxzcGFuIGNsYXNzPSJjYXBzIj5IVE1MPC9zcGFuPiB0YWcgdG8gd3JhcCBhcm91bmQg dGhlIHJlc3VsdC48L2xpPgoJCTxsaT48c3BhbiBjbGFzcz0iYXR0cy1uYW1lIj5jbGFzczwv c3Bhbj4gPHNwYW4gY2xhc3M9ImF0dHMtdHlwZSI+c3RyaW5nPC9zcGFuPiA8c3BhbiBjbGFz cz0iY2FwcyI+Q1NTPC9zcGFuPiBjbGFzcyBuYW1lIGZvciB3cmFwdGFnLjwvbGk+Cgk8L3Vs PiI7czo0OiJjb2RlIjtzOjMzNDI1OiIKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFBsdWdpbiBtZW1fc2VsZl9yZWdp c3RlcgovLyBBdXRob3I6IE1pY2hhZWwgTWFuZnJlIChodHRwOi8vbWFuZnJlLm5ldC8pCi8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLwpyZXF1aXJlX3BsdWdpbignbWVtX2Zvcm0nKTsKCi8vIE1MUApnbG9iYWwgJG1lbV9z ZWxmX2xhbmc7CmlmICghaXNfYXJyYXkoJG1lbV9zZWxmX2xhbmcpKQp7CgkkbWVtX3NlbGZf bGFuZyA9IGFycmF5KAoJCSdhY2NvdW50X2NyZWF0ZWRfbWFpbF9mYWlsZWQnCT0+CSdZb3Vy IGFjY291bnQgaGFzIGJlZW4gY3JlYXRlZCwgYnV0IGFuIGVycm9yIHdhcyBlbmNvdW50ZXJl ZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGVtYWlsIHlvdXIgdGhlIGFjY291bnQgaW5mb3JtYXRp b24uIFBsZWFzZSBjb250YWN0IHRoZSBzaXRlIGFkbWluaXN0cmF0b3IgZm9yIGhlbHAuJywK CQknYWRtaW5fbmFtZScJCT0+CSdBZG1pbiBOYW1lJywKCQknYWRtaW5fZW1haWwnCQk9Pgkn QWRtaW4gRW1haWwnLAoJCSdlcnJvcl9hZGRpbmdfbmV3X2F1dGhvcicJPT4JJ0Vycm9yIGFk ZGluZyBuZXcgYXV0aG9yJywKCQknZ3JlZXRpbmcnCQkJPT4JJ0hlbGxvIHtuYW1lfScsCgkJ J2ludmFsaWRfZm9ybV90YWdzJyA9PgknSW52YWxpZCBmb3JtIHRhZ3MgcHJvdmlkZWQgdG8g Zm9ybSAie2Zvcm19IicsCgkJJ2xvZ19pbl9hdCcJCQk9PgknTG9nIGluIGF0IHt1cmx9JywK CQknbG9nX2FkZGVkX3ByZWYnCT0+CSdBZGRlZCBwcmVmIHtuYW1lfScsCgkJJ2xvZ19wcmVm X2ZhaWxlZCcJPT4JJ0ZhaWxlZCB0byBhZGQgcHJlZiB7bmFtZX0uIHtlcnJvcn0nLAoJCSds b2dfcHJlZl9leGlzdHMnCT0+CSdQcmVmIHtuYW1lfSBpcyBhbHJlYWR5IGluc3RhbGxlZC4g Q3VycmVudCB2YWx1ZSBpcyAie3ZhbHVlfSInLAoJCSdsb2dfY29sX2FkZGVkJwkJPT4JJ0Fk ZGVkIGNvbHVtbiB7bmFtZX0gdG8gdXNlciB0YWJsZSB7dGFibGV9JywKCQknbG9nX2NvbF9m YWlsZWQnCT0+CSdGYWlsZWQgdG8gYWRkIGNvbHVtbiB7bmFtZX0gdG8gdGFibGUge3RhYmxl fS4ge2Vycm9yfScsCgkJJ2xvZ19jb2xfZXhpc3RzJwk9PgknVGFibGUge3RhYmxlfSBhbHJl YWR5IGhhcyBjb2x1bW4ge25hbWV9JywKCQknbG9nX2Zvcm1fYWRkZWQnCT0+CSdBZGRlZCBm b3JtIHtuYW1lfScsCgkJJ2xvZ19mb3JtX2ZhaWxlZCcJPT4JJ0ZhaWxlZCB0byBhZGQgZm9y bSB7bmFtZX0uIHtlcnJvcn08YnI+WW91IG5lZWQgdG8gbWFudWFsbHkgY3JlYXRlIGEgZm9y bSB0ZW1wbGF0ZS4gSGVyZSBpcyBhbiBleGFtcGxlLicsCgkJJ2xvZ19mb3JtX2ZvdW5kJwk9 PgknRm91bmQgZm9ybSB7bmFtZX0uIFNraXBwaW5nIGluc3RhbGxhdGlvbiBvZiBkZWZhdWx0 IGZvcm0uJywKCQknbG9nX3htcGxfdGFnJwkJPT4JJ0V4YW1wbGUgdGFnIHRvIHVzZSBpbiB5 b3VyIHBhZ2UgdGVtcGxhdGUuJywKCQknbWFpbF9zb3JyeScJCT0+CSdPdXIgbWFpbCBzeXN0 ZW0gaXMgY3VycmVudGx5IGRvd24uIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJywKCQknbWlz c2luZ19mb3JtX2ZpZWxkJwk9PgknVGhlIHJlcXVpcmVkIGZvcm0gZmllbGQge25hbWV9IGlz IGVtcHR5IG9yIG1pc3NpbmcuJywKCQkncGFzc3dvcmRfY2hhbmdlZCcJPT4JJ1Bhc3N3b3Jk IGNoYW5nZWQnLAoJCSdwYXNzd29yZF9jaGFuZ2VfZmFpbGVkJwk9PgknRmFpbGVkIHRvIGNo YW5nZSBwYXNzd29yZCcsCgkJJ3Bhc3N3b3JkX2ludmFsaWQnCT0+ICdJbnZhbGlkIHBhc3N3 b3JkJywKCQkncGFzc3dvcmRfc2VudF90bycJPT4JJ1Bhc3N3b3JkIHNlbnQgdG8ge2VtYWls fScsCgkJJ3NhdmVkX3VzZXJfcHJvZmlsZScJPT4JJ1NhdmVkIFVzZXIgUHJvZmlsZScsCgkJ J3VzZXJfZXhpc3RzJwkJPT4JJ1VzZXJuYW1lIGFscmVhZHkgZXhpc3RzLiBQbGVhc2UgdHJ5 IGFub3RoZXIgbmFtZScsCgkJJ3VzZXJfbm90X2ZvdW5kJwk9PgknQSB1c2VyIGFjY291bnQg Y291bGQgbm90IGJlIGZvdW5kIHdpdGggdGhlIHByb3ZpZGVkIGluZm9ybWF0aW9uLicsCgkJ J3lvdXJfbG9naW5faW5mbycJPT4JJ1lvdXIgTG9naW4gSW5mbycsCgkJJ3lvdXJfbmV3X3Bh c3N3b3JkJwk9PgknWW91ciBuZXcgcGFzc3dvcmQnLAoJCSd5b3VyX3Bhc3N3b3JkX2lzJwk9 PgknWW91ciBwYXNzd29yZCBpcyB7cGFzc3dvcmR9JywKCSk7Cn0KCmRlZmluZSggJ01FTV9T RUxGX1BSRUZJWCcgLCAnbWVtX3NlbGYnICk7CgpyZWdpc3Rlcl9jYWxsYmFjayggJ21lbV9z ZWxmX2VudW1lcmF0ZV9zdHJpbmdzJyAsICdsMTBuLmVudW1lcmF0ZV9zdHJpbmdzJyApOwpm dW5jdGlvbiBtZW1fc2VsZl9lbnVtZXJhdGVfc3RyaW5ncygkZXZlbnQgLCAkc3RlcD0nJyAs ICRwcmU9MCkKewoJZ2xvYmFsICRtZW1fc2VsZl9sYW5nOwoJJHIgPSBhcnJheQkoCgkJCQkn b3duZXInCQk9PiAnbWVtX3NlbGZfcmVnaXN0ZXInLAkJCSMJQ2hhbmdlIHRvIHlvdXIgcGx1 Z2luJ3MgbmFtZQoJCQkJJ3ByZWZpeCcJPT4gTUVNX1NFTEZfUFJFRklYLAkJCQkjCUl0cyB1 bmlxdWUgc3RyaW5nIHByZWZpeAoJCQkJJ2xhbmcnCQk9PiAnZW4tZ2InLAkJCQkJCSMJVGhl IGxhbmd1YWdlIG9mIHRoZSBpbml0aWFsIHN0cmluZ3MuCgkJCQknZXZlbnQnCQk9PiAncHVi bGljJywJCQkJCSMJcHVibGljL2FkbWluL2NvbW1vbiA9IHdoaWNoIGludGVyZmFjZSB0aGUg c3RyaW5ncyB3aWxsIGJlIGxvYWRlZCBpbnRvCgkJCQknc3RyaW5ncycJPT4gJG1lbV9zZWxm X2xhbmcsCQkJCSMJVGhlIHN0cmluZ3MgdGhlbXNlbHZlcy4KCQkJCSk7CglyZXR1cm4gJHI7 Cn0KZnVuY3Rpb24gbWVtX3NlbGZfZ1R4dCgkd2hhdCwkYXJncyA9IGFycmF5KCkpCnsKCWds b2JhbCAkbWVtX3NlbGZfbGFuZywgJHRleHRhcnJheTsKCgkka2V5ID0gc3RydG9sb3dlcigg TUVNX1NFTEZfUFJFRklYIC4gJy0nIC4gJHdoYXQgKTsKCglpZiAoaXNzZXQoJHRleHRhcnJh eVska2V5XSkpCgl7CgkJJHN0ciA9ICR0ZXh0YXJyYXlbJGtleV07Cgl9CgllbHNlCgl7CgkJ JGtleSA9IHN0cnRvbG93ZXIoJHdoYXQpOwoKCQlpZiAoaXNzZXQoJG1lbV9zZWxmX2xhbmdb JGtleV0pKQoJCQkkc3RyID0gJG1lbV9zZWxmX2xhbmdbJGtleV07CgkJZWxzZWlmIChpc3Nl dCgkdGV4dGFycmF5WyRrZXldKSkKCQkJJHN0ciA9ICR0ZXh0YXJyYXlbJGtleV07CgkJZWxz ZQoJCQkkc3RyID0gJHdoYXQ7Cgl9CgoJaWYoICFlbXB0eSgkYXJncykgKQoJCSRzdHIgPSBz dHJ0ciggJHN0ciAsICRhcmdzICk7CgoJcmV0dXJuICRzdHI7Cn0KCmdsb2JhbCAkZXZlbnQs ICRsZXZlbHM7CgoKaWYgKHR4cGludGVyZmFjZSA9PSAncHVibGljJyBvciAkZXZlbnQgIT0g J2FkbWluJykKewoJaWYgKGZpbGVfZXhpc3RzKCB0eHBhdGguJy9saWIvdHhwbGliX2FkbWlu LnBocCcgKSkKCXsKCQlyZXF1aXJlX29uY2UgdHhwYXRoLicvbGliL3R4cGxpYl9hZG1pbi5w aHAnOwoJfQoKCXJlcXVpcmVfb25jZSB0eHBhdGguJy9pbmNsdWRlL3R4cF9hZG1pbi5waHAn OwoKCWlmIChlbXB0eSgkbGV2ZWxzKSkKCXsKCQkvLyBjb3BpZWQgZnJvbSB0eHBfYWRtaW4u cGhwCgkJJGxldmVscyA9IGFycmF5KAoJCQkwID0+IG1lbV9zZWxmX2dUeHQoJ25vbmUnKSwK CQkJNiA9PiBtZW1fc2VsZl9nVHh0KCdkZXNpZ25lcicpLAoJCQk1ID0+IG1lbV9zZWxmX2dU eHQoJ2ZyZWVsYW5jZXInKSwKCQkJNCA9PiBtZW1fc2VsZl9nVHh0KCdzdGFmZl93cml0ZXIn KSwKCQkJMyA9PiBtZW1fc2VsZl9nVHh0KCdjb3B5X2VkaXRvcicpLAoJCQkyID0+IG1lbV9z ZWxmX2dUeHQoJ21hbmFnaW5nX2VkaXRvcicpLAoJCQkxID0+IG1lbV9zZWxmX2dUeHQoJ3B1 Ymxpc2hlcicpCgkJKTsKCX0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3By aXZfbGV2ZWxzJykpIHsKCQlmdW5jdGlvbiBwcml2X2xldmVscygkaXRlbSwgJHZhcikgewoJ CQlnbG9iYWwgJGxldmVsczsKCgkJCXJldHVybiBzZWxlY3RJbnB1dCgkaXRlbSwgJGxldmVs cywgJHZhcik7CgkJfQoJfQp9CgoKZ2xvYmFsICRtZW1fc2VsZiwgJHByZWZzOwoKJG1lbV9z ZWxmID0gYXJyYXkoCgkJCQknYWRtaW5fZW1haWwnCQk9PgknJywKCQkJCSdhZG1pbl9uYW1l JwkJPT4JJycsCgkJCQknYWRtaW5fYmNjJwkJCT0+CScwJywKCQkJCSduZXdfdXNlcl9wcml2 JwkJPT4JJzAnLAoJCQkJJ3N0YXR1cycJCQk9PglmYWxzZSwKCQkJCSdzdGF0dXNfbWVzc2Fn ZScJPT4JJ1lvdSBhcmUgYWxyZWFkeSByZWdpc3RlcmVkLicsCgkJCQknZW1haWxfbWVzc2Fn ZScJCT0+CScnCgkJCSk7CgokbWVtX3NlbGZbJ2FkbWluX2VtYWlsJ10gPSBpc3NldCgkcHJl ZnNbJ21lbV9zZWxmX2FkbWluX2VtYWlsJ10pID8gJHByZWZzWydtZW1fc2VsZl9hZG1pbl9l bWFpbCddIDogJyc7CiRtZW1fc2VsZlsnYWRtaW5fbmFtZSddID0gaXNzZXQoJHByZWZzWydt ZW1fc2VsZl9hZG1pbl9uYW1lJ10pID8gJHByZWZzWydtZW1fc2VsZl9hZG1pbl9uYW1lJ10g OiAnJzsKJG1lbV9zZWxmWyduZXdfdXNlcl9wcml2J10gPSBpc3NldCgkcHJlZnNbJ21lbV9z ZWxmX25ld191c2VyX3ByaXYnXSkgPyAkcHJlZnNbJ21lbV9zZWxmX25ld191c2VyX3ByaXYn XSA6ICcwJzsKJG1lbV9zZWxmWydhZG1pbl9iY2MnXSA9IGlzc2V0KCRwcmVmc1snbWVtX3Nl bGZfYWRtaW5fYmNjJ10pID8gJHByZWZzWydtZW1fc2VsZl9hZG1pbl9iY2MnXSA6ICcwJzsK CmlmICggQHR4cGludGVyZmFjZSA9PSAnYWRtaW4nICkgewoJYWRkX3ByaXZzKCdzZWxmLXJl ZycsJzEnKTsKCglyZWdpc3Rlcl9jYWxsYmFjaygnbWVtX3NlbGZfcmVnaXN0ZXInLCdzZWxm LXJlZycsJycsIDEpOwoJaWYgKCRldmVudD09J3NlbGYtcmVnJykgewoJCS8vIGZha2UgdGFi cyB3aGVuIHVzaW5nIHRoZW0uIFNpbGVuY2VzIHdhcm5pbmdzIGZyb20gcGFnZVRvcCgpCgkJ cmVnaXN0ZXJfdGFiKCdhZG1pbicsJ3NlbGYtcmVnJywnc2VsZi1yZWcnKTsKCgkJaW5jbHVk ZV9vbmNlIHR4cGF0aC4nL3B1Ymxpc2gvdGFnaGFuZGxlcnMucGhwJzsKCX0KCglmdW5jdGlv biBtZW1fc2VsZl9yZWdpc3RlcigkZXZlbnQsICRzdGVwKQoJewoJCWdsb2JhbCAkcHJlZnM7 CgoJCWV4dHJhY3QoJHByZWZzKTsKCgkJaWYgKCRldmVudCE9J3NlbGYtcmVnJykKCQkJcmV0 dXJuOwoKCQlwYWdlVG9wKCdTZWxmIFJlZ2lzdHJhdGlvbicsJycpOwoKCQlpZiAoJHN0ZXAg PT0gJ2luc3RhbGwnKSB7CgkJCWVjaG8gbWVtX3NlbGZfcmVnaXN0ZXJfaW5zdGFsbCgpOwoJ CX0gZWxzZSBpZiAoJHN0ZXA9PSdwcmVpbnN0YWxsJykgewoJCQkkbWVtX3h0cmFfY29sdW1u cwk9IG1lbV9nZXRfZXh0cmFfdXNlcl9jb2x1bW5zKCk7CgoJCQkkbWVtX2FkbWluX25hbWUg PSAhZW1wdHkoJG1lbV9hZG1pbl9uYW1lKSA/ICRtZW1fYWRtaW5fbmFtZSA6ICdBZG1pbic7 CgkJCSRtZW1fYWRtaW5fZW1haWwgPSAhZW1wdHkoJG1lbV9hZG1pbl9lbWFpbCkgPyAkbWVt X2FkbWluX2VtYWlsIDogJ0FkbWluQHlvdXJkb21haW4uY29tJzsKCQkJJG1lbV9uZXdfdXNl X3ByaXYgPSAhZW1wdHkoJG1lbV9uZXdfdXNlX3ByaXYpID8gJG1lbV9uZXdfdXNlX3ByaXYg OiAnMCc7CgkJCSRtZW1fc2VsZl9hZG1pbl9iY2MgPSAhZW1wdHkoJG1lbV9zZWxmX2FkbWlu X2JjYykgPyAkbWVtX3NlbGZfYWRtaW5fYmNjIDogJzAnOwoKCQkJJHVzZV9pZ25faW5wdXQg PSAnJzsKCQkJLy8gaXMgaWduX3Bhc3N3b3JkX3Byb3RlY3QgbG9hZGVkIG9uIHRoZSBzeXN0 ZW0/CgkJCWlmIChsb2FkX3BsdWdpbignaWduX3Bhc3N3b3JkX3Byb3RlY3QnKSB8fCAoaXNz ZXQoJG1lbV91c2VfaWduX2RiKSAmJiAkbWVtX3VzZV9pZ25fZGIpKSB7CgkJCQkkbWVtX3Vz ZV9pZ25fZGIgPSAhZW1wdHkoJG1lbV91c2VfaWduX2RiKSA/ICRtZW1fdXNlX2lnbl9kYiA6 ICcwJzsKCQkJCSR1c2VfaWduX2lucHV0ID0geWVzbm9yYWRpbygndXNlX2lnbl9kYicsJG1l bV91c2VfaWduX2RiKTsKCQkJfQoKCQkJJHh0cmFfY29sdW1ucyA9IG1lbV9nZXRfZXh0cmFf dXNlcl9jb2x1bW5zKCk7CgkJCSRoYXNfYWRkcmVzcyA9IGluX2FycmF5KCdhZGRyZXNzJywk eHRyYV9jb2x1bW5zKTsKCQkJJGhhc19waG9uZSA9IGluX2FycmF5KCdwaG9uZScsJHh0cmFf Y29sdW1ucyk7CgoJCQkkYWRkX2FkZHJlc3NfaW5wdXQgPSB5ZXNub3JhZGlvKCdhZGRfYWRk cmVzcycsJzAnKTsKCQkJJGFkZF9waG9uZV9pbnB1dCA9IHllc25vcmFkaW8oJ2FkZF9waG9u ZScsJzAnKTsKCgkJCWVjaG8gZm9ybSgKCQkJCWVJbnB1dCgnc2VsZi1yZWcnKS5zSW5wdXQo J2luc3RhbGwnKS4KCQkJCXN0YXJ0VGFibGUoJ2VkaXQnKSAuCgkJCQkJdHIoIGZMYWJlbENl bGwoJ2FkbWluX25hbWUnKQkuIHRkYShmSW5wdXQoJ3RleHQnLCdhZG1pbl9uYW1lJywkbWVt X2FkbWluX25hbWUsJ2VkaXQnKSkgKSAuCgkJCQkJdHIoIGZMYWJlbENlbGwoJ2FkbWluX2Vt YWlsJykJLiB0ZGEoZklucHV0KCd0ZXh0JywnYWRtaW5fZW1haWwnLCRtZW1fYWRtaW5fZW1h aWwsJ2VkaXQnKSkgKSAuCgkJCQkJdHIoIGZMYWJlbENlbGwoJ2FkbWluX2JjYycpCS4gdGRh KHllc25vUmFkaW8oJ2FkbWluX2JjYycsJG1lbV9zZWxmX2FkbWluX2JjYykpICkgLgoJCQkJ CXRyKCBmTGFiZWxDZWxsKCduZXdfdXNlcl9wcml2JykJLiB0ZGEocHJpdl9sZXZlbHMoJ25l d191c2VyX3ByaXYnLCRtZW1fbmV3X3VzZV9wcml2KSkgKSAuCgkJCQkJdHIoIGZMYWJlbENl bGwoJ3VzZV9pZ25fZGInKQkuIHRkYSgkdXNlX2lnbl9pbnB1dCkgKSAuCgkJCQkJKCRoYXNf YWRkcmVzcyA/ICcnIDogdHIoIGZMYWJlbENlbGwoJ2FkZF9hZGRyZXNzX2ZpZWxkJykgLiB0 ZGEoJGFkZF9hZGRyZXNzX2lucHV0KSApICkgLgoJCQkJCSgkaGFzX3Bob25lID8gJycgOiB0 ciggZkxhYmVsQ2VsbCgnYWRkX3Bob25lX2ZpZWxkJykgLiB0ZGEoJGFkZF9waG9uZV9pbnB1 dCkgKSApIC4KCQkJCQl0ciggdGQoKSAuIHRkKCBmSW5wdXQoInN1Ym1pdCIsICdzdWJtaXQn LG1lbV9zZWxmX2dUeHQoJ2luc3RhbGwnKSwiUHVibGlzaCIpLCAyICkgKSAuCgkJCQllbmRU YWJsZSgpCgkJCQkpOwoJCX0gZWxzZSB7CgkJCWVjaG8gJzxkaXY+PGEgaHJlZj0iP2V2ZW50 PXNlbGYtcmVnJnN0ZXA9cHJlaW5zdGFsbCI+Jy5tZW1fc2VsZl9nVHh0KCdpbnN0YWxsJyku JzwvYT48L2Rpdj4nOwoJCX0KCX0KCgoJZnVuY3Rpb24gbWVtX3NlbGZfcmVnaXN0ZXJfaW5z dGFsbCgpCgl7CgkJZ2xvYmFsICRtZW1fc2VsZjsKCgkJZXh0cmFjdChkb1NsYXNoKGdwc2Eo YXJyYXkoCgkJCSdhZG1pbl9lbWFpbCcsCgkJCSdhZG1pbl9uYW1lJywKCQkJJ25ld191c2Vy X3ByaXYnLAoJCQkndXNlX2lnbl9kYicsCgkJCSdhZGRfYWRkcmVzcycsCgkJCSdhZGRfcGhv bmUnCgkJKSkpKTsKCgkJaWYgKCFpc3NldCgkbmV3X3VzZXJfcHJpdikgfHwgZW1wdHkoJG5l d191c2VyX3ByaXYpKSAkbmV3X3VzZXJfcHJpdiA9ICcwJzsKCgkJJGxvZyA9IGFycmF5KCk7 CgoJCWlmICghKCRycz1zYWZlX2ZpZWxkKCd2YWwsaHRtbCcsJ3R4cF9wcmVmcycsIm5hbWU9 J21lbV9zZWxmX3VzZV9pZ25fZGInIikpKSB7CgkJCWlmICggc2V0X3ByZWYoJ21lbV9zZWxm X3VzZV9pZ25fZGInLCR1c2VfaWduX2RiLCdzZWxmX3JlZycsMSwwLCd5ZXNub3JhZGlvJykp IHsKCQkJCSRsb2dbXSA9IG1lbV9zZWxmX2dUeHQoJ2xvZ19hZGRlZF9wcmVmJywgYXJyYXko J3tuYW1lfSc9PidtZW1fc2VsZl91c2VfaWduX2RiJykpOwoJCQl9IGVsc2UgewoJCQkJJGxv Z1tdID0gbWVtX3NlbGZfZ1R4dCgnbG9nX3ByZWZfZmFpbGVkJywgYXJyYXkoJ3tuYW1lfSc9 PidtZW1fc2VsZl91c2VfaWduX2RiJywne2Vycm9yfSc9Pm15c3FsX2Vycm9yKCkpKTsKCQkJ fQoJCX0gZWxzZSB7CgkJCWlmICgkcnNbJ2h0bWwnXSAhPSAneWVzbm9yYWRpbycpIHsKCQkJ CXNhZmVfdXBkYXRlKCd0eHBfcHJlZnMnLCJodG1sPSd5ZXNub3JhZGlvJyIsIm5hbWU9J21l bV9zZWxmX3VzZV9pZ25fZGInIik7CgkJCX0KCQkJJGxvZ1tdID0gbWVtX3NlbGZfZ1R4dCgn bG9nX3ByZWZfZXhpc3RzJywgYXJyYXkoJ3tuYW1lfSc9PidtZW1fc2VsZl91c2VfaWduX2Ri Jywne3ZhbHVlfSc9PiRycykpOwoJCX0KCgkJJHVzZXJfdGFibGUgPSBtZW1fZ2V0X3VzZXJf dGFibGVfbmFtZSgpOwoKCQkkeHRyYV9jb2x1bW5zID0gbWVtX2dldF9leHRyYV91c2VyX2Nv bHVtbnMoKTsKCQlpZiAoJGFkZF9hZGRyZXNzKSB7CgkJCWlmICghaW5fYXJyYXkoJ2FkZHJl c3MnLCR4dHJhX2NvbHVtbnMpKSB7CgkJCQlpZiAoc2FmZV9hbHRlcigkdXNlcl90YWJsZSwi QUREIGBhZGRyZXNzYCBWQVJDSEFSKCAxMjggKSIpKSB7CgkJCQkJJGxvZ1tdID0gbWVtX3Nl bGZfZ1R4dCgnbG9nX2NvbF9hZGRlZCcsIGFycmF5KCd7bmFtZX0nPT4nYWRkcmVzcycsJ3t0 YWJsZX0nPT4kdXNlcl90YWJsZSkpOwoJCQkJfSBlbHNlIHsKCQkJCQkkbG9nW10gPSBtZW1f c2VsZl9nVHh0KCdsb2dfY29sX2ZhaWxlZCcsIGFycmF5KCd7bmFtZX0nPT4nYWRkcmVzcycs J3t0YWJsZX0nPT4kdXNlcl90YWJsZSwne2Vycm9yfSc9Pm15c3FsX2Vycm9yKCkpKTsKCQkJ CX0KCQkJfSBlbHNlIHsKCQkJCSRsb2dbXSA9IG1lbV9zZWxmX2dUeHQoJ2xvZ19jb2xfZXhp c3RzJywgYXJyYXkoJ3tuYW1lfSc9PidhZGRyZXNzJywne3RhYmxlfSc9PiR1c2VyX3RhYmxl KSk7CgkJCX0KCQl9CgkJaWYgKCRhZGRfcGhvbmUpIHsKCQkJaWYgKCFpbl9hcnJheSgncGhv bmUnLCR4dHJhX2NvbHVtbnMpKSB7CgkJCQlpZiAoc2FmZV9hbHRlcigkdXNlcl90YWJsZSwi QUREIGBwaG9uZWAgVkFSQ0hBUiggMzIgKSIpKSB7CgkJCQkJJGxvZ1tdID0gbWVtX3NlbGZf Z1R4dCgnbG9nX2NvbF9hZGRlZCcsIGFycmF5KCd7bmFtZX0nPT4ncGhvbmUnLCd7dGFibGV9 Jz0+JHVzZXJfdGFibGUpKTsKCQkJCX0gZWxzZSB7CgkJCQkJJGxvZ1tdID0gbWVtX3NlbGZf Z1R4dCgnbG9nX2NvbF9mYWlsZWQnLCBhcnJheSgne25hbWV9Jz0+J3Bob25lJywne3RhYmxl fSc9PiR1c2VyX3RhYmxlLCd7ZXJyb3J9Jz0+bXlzcWxfZXJyb3IoKSkpOwoJCQkJfQoJCQl9 IGVsc2UgewoJCQkJJGxvZ1tdID0gbWVtX3NlbGZfZ1R4dCgnbG9nX2NvbF9leGlzdHMnLCBh cnJheSgne25hbWV9Jz0+J3Bob25lJywne3RhYmxlfSc9PiR1c2VyX3RhYmxlKSk7CgkJCX0K CQl9CgoJCWlmICghKCRycz1zYWZlX2ZpZWxkKCd2YWwnLCd0eHBfcHJlZnMnLCJuYW1lPSdt ZW1fc2VsZl9hZG1pbl9lbWFpbCciKSkpIHsKCQkJaWYgKCBzZXRfcHJlZignbWVtX3NlbGZf YWRtaW5fZW1haWwnLCRhZG1pbl9lbWFpbCwnc2VsZl9yZWcnLDEpKSB7CgkJCQkkbG9nW10g PSBtZW1fc2VsZl9nVHh0KCdsb2dfYWRkZWRfcHJlZicsIGFycmF5KCd7bmFtZX0nPT4nbWVt X3NlbGZfYWRtaW5fZW1haWwnKSk7CgkJCX0gZWxzZSB7CgkJCQkkbG9nW10gPSBtZW1fc2Vs Zl9nVHh0KCdsb2dfcHJlZl9mYWlsZWQnLCBhcnJheSgne25hbWV9Jz0+J21lbV9zZWxmX2Fk bWluX2VtYWlsJywne2Vycm9yfSc9Pm15c3FsX2Vycm9yKCkpKTsKCQkJfQoJCX0gZWxzZSB7 CgkJCSRsb2dbXSA9IG1lbV9zZWxmX2dUeHQoJ2xvZ19wcmVmX2V4aXN0cycsIGFycmF5KCd7 bmFtZX0nPT4nbWVtX3NlbGZfYWRtaW5fZW1haWwnLCd7dmFsdWV9Jz0+JHJzKSk7CgkJfQoJ CWlmICghKCRycz1zYWZlX2ZpZWxkKCd2YWwnLCd0eHBfcHJlZnMnLCJuYW1lPSdtZW1fc2Vs Zl9hZG1pbl9uYW1lJyIpKSkgewoJCQlpZiAoIHNldF9wcmVmKCdtZW1fc2VsZl9hZG1pbl9u YW1lJywkYWRtaW5fbmFtZSwnc2VsZl9yZWcnLDEpKSB7CgkJCQkkbG9nW10gPSBtZW1fc2Vs Zl9nVHh0KCdsb2dfYWRkZWRfcHJlZicsIGFycmF5KCd7bmFtZX0nPT4nbWVtX3NlbGZfYWRt aW5fbmFtZScpKTsKCQkJfSBlbHNlIHsKCQkJCSRsb2dbXSA9IG1lbV9zZWxmX2dUeHQoJ2xv Z19wcmVmX2ZhaWxlZCcsIGFycmF5KCd7bmFtZX0nPT4nbWVtX3NlbGZfYWRtaW5fbmFtZScs J3tlcnJvcn0nPT5teXNxbF9lcnJvcigpKSk7CgkJCX0KCQl9IGVsc2UgewoJCQkkbG9nW10g PSBtZW1fc2VsZl9nVHh0KCdsb2dfcHJlZl9leGlzdHMnLCBhcnJheSgne25hbWV9Jz0+J21l bV9zZWxmX2FkbWluX25hbWUnLCd7dmFsdWV9Jz0+JHJzKSk7CgkJfQoJCWlmICghKCRycz1z YWZlX3JvdygndmFsLGh0bWwnLCd0eHBfcHJlZnMnLCJuYW1lPSdtZW1fc2VsZl9uZXdfdXNl cl9wcml2JyIpKSkgewoJCQlpZiAoIHNldF9wcmVmKCdtZW1fc2VsZl9uZXdfdXNlcl9wcml2 JywkbmV3X3VzZXJfcHJpdiwnc2VsZl9yZWcnLDEsMCwncHJpdl9sZXZlbHMnKSkgewoJCQkJ JGxvZ1tdID0gbWVtX3NlbGZfZ1R4dCgnbG9nX2FkZGVkX3ByZWYnLCBhcnJheSgne25hbWV9 Jz0+J21lbV9zZWxmX25ld191c2VyX3ByaXYnKSk7CgkJCQkkbWVtX3NlbGZbJ25ld191c2Vy X3ByaXYnXSA9ICRuZXdfdXNlcl9wcml2OwoJCQl9IGVsc2UgewoJCQkJJGxvZ1tdID0gbWVt X3NlbGZfZ1R4dCgnbG9nX3ByZWZfZmFpbGVkJywgYXJyYXkoJ3tuYW1lfSc9PidtZW1fc2Vs Zl9uZXd1c2VyX3ByaXYnLCd7ZXJyb3J9Jz0+bXlzcWxfZXJyb3IoKSkpOwoJCQl9CgkJfSBl bHNlIHsKCQkJc2FmZV91cGRhdGUoJ3R4cF9wcmVmcycsImh0bWw9J3ByaXZfbGV2ZWxzJyIs Im5hbWU9J21lbV9zZWxmX25ld191c2VyX3ByaXYnIik7CgoJCQkkbG9nW10gPSBtZW1fc2Vs Zl9nVHh0KCdsb2dfcHJlZl9leGlzdHMnLCBhcnJheSgne25hbWV9Jz0+J21lbV9zZWxmX25l d191c2VyX3ByaXYnLCd7dmFsdWV9JyA9PiAkcnMpKTsKCQl9CgkJaWYgKCEoJHJzPXNhZmVf ZmllbGQoJ3ZhbCcsJ3R4cF9wcmVmcycsIm5hbWU9J21lbV9zZWxmX2FkbWluX2JjYyciKSkp IHsKCQkJaWYgKCBzZXRfcHJlZignbWVtX3NlbGZfYWRtaW5fYmNjJywnMCcsJ3NlbGZfcmVn JywxLCd5ZXNub3JhZGlvJykpIHsKCQkJCSRsb2dbXSA9IG1lbV9zZWxmX2dUeHQoJ2xvZ19h ZGRlZF9wcmVmJywgYXJyYXkoJ3tuYW1lfSc9PidtZW1fc2VsZl9hZG1pbl9iY2MnKSk7CgkJ CX0gZWxzZSB7CgkJCQkkbG9nW10gPSBtZW1fc2VsZl9nVHh0KCdsb2dfcHJlZl9mYWlsZWQn LCBhcnJheSgne25hbWV9Jz0+J21lbV9zZWxmX2FkbWluX2JjYycsJ3tlcnJvcn0nPT5teXNx bF9lcnJvcigpKSk7CgkJCX0KCQl9IGVsc2UgewoJCQkkbG9nW10gPSBtZW1fc2VsZl9nVHh0 KCdsb2dfcHJlZl9leGlzdHMnLCBhcnJheSgne25hbWV9Jz0+J21lbV9zZWxmX2FkbWluX2Jj YycsJ3t2YWx1ZX0nPT4kcnMpKTsKCQl9CgoJCS8vIGNyZWF0ZSBkZWZhdWx0IHJlZ2lzdHJh dGlvbiBmb3JtCgkJJGZvcm1faHRtbCA9IDw8PEVPRgoJPGZpZWxkc2V0PgoJPGxlZ2VuZD5S ZWdpc3RlcjwvbGVnZW5kPgoJCTx0eHA6bWVtX2Zvcm1fdGV4dCBuYW1lPSJSZWFsTmFtZSIg bGFiZWw9IkZ1bGwgTmFtZSIgLz48YnIgLz4KCQk8YnIgLz4KCgkJPHR4cDptZW1fZm9ybV90 ZXh0IG5hbWU9Im5hbWUiIGxhYmVsPSJVc2VybmFtZSIgLz48YnIgLz4KCQk8YnIgLz4KCgkJ PHR4cDptZW1fZm9ybV9lbWFpbCBuYW1lPSJlbWFpbCIgbGFiZWw9IkUtTWFpbCIgLz48YnIg Lz4KCQk8YnIgLz4KCgkJPHR4cDptZW1fZm9ybV9zdWJtaXQgLz4KCTwvZmllbGRzZXQ+CkVP RjsKCgkJJGZvcm0gPSBmZXRjaCgnRm9ybScsJ3R4cF9mb3JtJywnbmFtZScsJ3NlbGZfcmVn aXN0ZXJfZm9ybScpOwoJCWlmICghJGZvcm0pIHsKCQkJaWYgKHNhZmVfaW5zZXJ0KCd0eHBf Zm9ybScsIm5hbWU9J3NlbGZfcmVnaXN0ZXJfZm9ybScsdHlwZT0nbWlzYycsRm9ybT0neyRm b3JtX2h0bWx9JyIpKSB7CgkJCQkkbG9nW10gPSBtZW1fc2VsZl9nVHh0KCdsb2dfZm9ybV9h ZGRlZCcsIGFycmF5KCd7bmFtZX0nPT4nc2VsZl9yZWdpc3Rlcl9mb3JtJykpOwoJCQl9IGVs c2UgewoJCQkJJGxvZ1tdID0gbWVtX3NlbGZfZ1R4dCgnbG9nX2Zvcm1fZmFpbGVkJywgYXJy YXkoJ3tuYW1lfSc9PidzZWxmX3JlZ2lzdGVyX2Zvcm0nLCd7ZXJyb3J9Jz0+bXlzcWxfZXJy b3IoKSkpLmJyLgoJCQkJCSc8dGV4dHBhdHRlcm4gc3R5bGU9IndpZHRoOjMwMHB4O2hlaWdo dDoxNTBweDsiPicuaHRtbHNwZWNpYWxjaGFycygkZm9ybV9odG1sKS4nPC90ZXh0YXJlYT4n OwoJCQl9CgkJfSBlbHNlIHsKCQkJJGxvZ1tdID0gbWVtX3NlbGZfZ1R4dCgnbG9nX2Zvcm1f Zm91bmQnLCBhcnJheSgne25hbWV9Jz0+J3NlbGZfcmVnaXN0ZXJfZm9ybScpKTsKCQl9CgoJ CS8vIGNyZWF0ZSBkZWZhdWx0IHN1Y2Nlc3NmdWwgcmVnaXN0cmF0aW9uIGZvcm0gdG8gc2hv dyB0aGUgdXNlcgoJCSRmb3JtX2h0bWwgPSA8PDxFT0YKPGgzPkFjY291bnQgQ3JlYXRlZDwv aDM+CjxwPkFuIGVtYWlsIGNvbnRhaW5pbmcgeW91ciBwYXNzd29yZCBoYXMgYmVlbiBzZW50 IHRvIDx0eHA6bWVtX3Byb2ZpbGUgdmFyPSJlbWFpbCIgLz4uPC9wPgpFT0Y7CgoJCSRmb3Jt ID0gZmV0Y2goJ0Zvcm0nLCd0eHBfZm9ybScsJ25hbWUnLCdzZWxmX3JlZ2lzdGVyX3N1Y2Nl c3MnKTsKCQlpZiAoISRmb3JtKSB7CgkJCWlmIChzYWZlX2luc2VydCgndHhwX2Zvcm0nLCJu YW1lPSdzZWxmX3JlZ2lzdGVyX3N1Y2Nlc3MnLHR5cGU9J21pc2MnLEZvcm09J3skZm9ybV9o dG1sfSciKSkgewoJCQkJJGxvZ1tdID0gbWVtX3NlbGZfZ1R4dCgnbG9nX2Zvcm1fYWRkZWQn LCBhcnJheSgne25hbWV9Jz0+J3NlbGZfcmVnaXN0ZXJfc3VjY2VzcycpKTsKCQkJfSBlbHNl IHsKCQkJCSRsb2dbXSA9IG1lbV9zZWxmX2dUeHQoJ2xvZ19mb3JtX2ZhaWxlZCcsIGFycmF5 KCd7bmFtZX0nPT4nc2VsZl9yZWdpc3Rlcl9zdWNjZXNzJywne2Vycm9yfSc9Pm15c3FsX2Vy cm9yKCkpKS5ici4KCQkJCQknPHRleHRwYXR0ZXJuIHN0eWxlPSJ3aWR0aDozMDBweDtoZWln aHQ6MTUwcHg7Ij4nLmh0bWxzcGVjaWFsY2hhcnMoJGZvcm1faHRtbCkuJzwvdGV4dGFyZWE+ JzsKCQkJfQoJCX0gZWxzZSB7CgkJCSRsb2dbXSA9IG1lbV9zZWxmX2dUeHQoJ2xvZ19mb3Jt X2ZvdW5kJywgYXJyYXkoJ3tuYW1lfSc9PidzZWxmX3JlZ2lzdGVyX3N1Y2Nlc3MnKSk7CgkJ fQoKCQkvLyBjcmVhdGUgZGVmYXVsdCBzdWNjZXNzZnVsIHJlZ2lzdHJhdGlvbiBlbWFpbCBm b3JtCgkJJGZvcm1faHRtbCA9IDw8PEVPRgpEZWFyIDx0eHA6bWVtX25hbWUgLz4sCgpUaGFu ayB5b3UgZm9yIHJlZ2lzdGVyaW5nIGF0IDx0eHA6bWVtX3NpdGV1cmwgLz4uCgpZb3VyIGxv Z2luIG5hbWU6IDx0eHA6bWVtX3VzZXJuYW1lIC8+CllvdXIgcGFzc3dvcmQ6IDx0eHA6bWVt X3Bhc3N3b3JkIC8+CgpJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIHBsZWFzZSByZXBseSB0 byB0aGlzIGVtYWlsIGFkZHJlc3MuCgpTaW5jZXJlbHksCjx0eHA6bWVtX2FkbWluX25hbWUg Lz4KPHR4cDptZW1fYWRtaW5fZW1haWwgLz4KRU9GOwoKCQkkZm9ybSA9IGZldGNoKCdGb3Jt JywndHhwX2Zvcm0nLCduYW1lJywnc2VsZl9yZWdpc3Rlcl9lbWFpbCcpOwoJCWlmICghJGZv cm0pIHsKCQkJaWYgKHNhZmVfaW5zZXJ0KCd0eHBfZm9ybScsIm5hbWU9J3NlbGZfcmVnaXN0 ZXJfZW1haWwnLHR5cGU9J21pc2MnLEZvcm09J3skZm9ybV9odG1sfSciKSkgewoJCQkJJGxv Z1tdID0gbWVtX3NlbGZfZ1R4dCgnbG9nX2Zvcm1fYWRkZWQnLCBhcnJheSgne25hbWV9Jz0+ J3NlbGZfcmVnaXN0ZXJfZW1haWwnKSk7CgkJCX0gZWxzZSB7CgkJCQkkbG9nW10gPSBtZW1f c2VsZl9nVHh0KCdsb2dfZm9ybV9mYWlsZWQnLCBhcnJheSgne25hbWV9Jz0+J3NlbGZfcmVn aXN0ZXJfZW1haWwnLCd7ZXJyb3J9Jz0+bXlzcWxfZXJyb3IoKSkpLmJyLgoJCQkJCSc8dGV4 dHBhdHRlcm4gc3R5bGU9IndpZHRoOjMwMHB4O2hlaWdodDoxNTBweDsiPicuaHRtbHNwZWNp YWxjaGFycygkZm9ybV9odG1sKS4nPC90ZXh0YXJlYT4nOwoJCQl9CgkJfSBlbHNlIHsKCQkJ JGxvZ1tdID0gbWVtX3NlbGZfZ1R4dCgnbG9nX2Zvcm1fZm91bmQnLCBhcnJheSgne25hbWV9 Jz0+J3NlbGZfcmVnaXN0ZXJfZW1haWwnKSk7CgkJfQoKCQkkdGFnX2hlbHAgPSAnPHR4cDpt ZW1fc2VsZl9yZWdpc3Rlcl9mb3JtIGZvcm09InNlbGZfcmVnaXN0ZXJfZm9ybSIgLz4nOwoJ CSRsb2dbXSA9IG1lbV9zZWxmX2dUeHQoJ2xvZ194bXBsX3RhZycpLmJyLgoJCQknPHRleHRh cmVhIHN0eWxlPSJ3aWR0aDo0MDBweDtoZWlnaHQ6NDBweDsiPicuaHRtbHNwZWNpYWxjaGFy cygkdGFnX2hlbHApLic8L3RleHRhcmVhPic7CgoJCXJldHVybiBkb1dyYXAoJGxvZywndWwn LCdsaScpOwoJfQp9CgoKcmVnaXN0ZXJfY2FsbGJhY2soJ21lbV9zZWxmX3JlZ2lzdGVyX2Zv cm1fc3VibWl0JywnbWVtX2Zvcm0uc3VibWl0Jyk7CgpmdW5jdGlvbiBtZW1fc2VsZl9yZWdp c3Rlcl9mb3JtKCRhdHRzLCR0aGluZz0nJykKewoJZ2xvYmFsICRwcmVmcywgJHNpdGVuYW1l LCAkcHJvZHVjdGlvbl9zdGF0dXM7CgoJaWYgKCFpc19jYWxsYWJsZSgnbWFpbCcpKQoJewoJ CXJldHVybiAoJHByb2R1Y3Rpb25fc3RhdHVzID09ICdsaXZlJykgPwoJCQltZW1fc2VsZl9n VHh0KCdtYWlsX3NvcnJ5JykgOgoJCQlnVHh0KCd3YXJuX21haWxfdW5hdmFpbGFibGUnKTsK CX0KCglleHRyYWN0KGxBdHRzKGFycmF5KAoJCSdmb3JtJwkJPT4gJycsCgkJJ2VtYWlsX2Zv cm0nCT0+ICcnLAoJCSdmcm9tJwkJPT4gJHByZWZzWydtZW1fc2VsZl9hZG1pbl9lbWFpbCdd LAoJCSdyZXBseScJCT0+ICcnLAoJCSdzdWJqZWN0Jwk9PiAnWycuJHNpdGVuYW1lLiddICcu IG1lbV9zZWxmX2dUeHQoJ3lvdXJfbG9naW5faW5mbycpLAoJCSdsb2dpbl91cmwnCT0+IHJ0 cmltKGh1LCcvJykuJy90ZXh0cGF0dGVybi9pbmRleC5waHAnLAoJKSwkYXR0cyxmYWxzZSkp OwoKCWlmICghZW1wdHkoJGZvcm0pKSB7CgkJJHRoaW5nID0gZmV0Y2hfZm9ybSgkZm9ybSk7 CgkJdW5zZXQoJGF0dHNbJ2Zvcm0nXSk7Cgl9CgoJZm9yZWFjaChhcnJheSgnZnJvbScsJ3Jl cGx5Jywnc3ViamVjdCcsJ2xvZ2luX3VybCcsJ2VtYWlsX2Zvcm0nKSBhcyAkYSkgewoJCSR0 aGluZyAuPSAnPHR4cDptZW1fZm9ybV9zZWNyZXQgbmFtZT0iJy4kYS4nIiB2YWx1ZT0iJy4k JGEuJyIgLz4nOwoJCXVuc2V0KCRhdHRzWyRhXSk7Cgl9CgoJcmV0dXJuIG1lbV9mb3JtKCRh dHRzK2FycmF5KCd0eXBlJz0+J21lbV9zZWxmX3JlZ2lzdGVyJyksJHRoaW5nKTsKfQoKLy8g LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQpmdW5jdGlvbiBtZW1fc2VsZl9yZWdpc3Rlcl9mb3JtX3N1Ym1pdCgpCnsKCWds b2JhbCAkcHJlZnMsICRtZW1fc2VsZiwgJHNpdGVuYW1lLCAkbWVtX3Byb2ZpbGUsICRtZW1f Zm9ybV90eXBlLCAkbWVtX2Zvcm1fdmFsdWVzLCAkbWVtX2Zvcm1fdGhhbmtzX2Zvcm07CgoJ aWYgKCRtZW1fZm9ybV90eXBlICE9ICdtZW1fc2VsZl9yZWdpc3RlcicpIHJldHVybjsKCgll eHRyYWN0KCRtZW1fc2VsZik7CgoJJHB3ID0gZ2VuZXJhdGVfcGFzc3dvcmQoMTApOwoKCWlm ICghJG1lbV9wcm9maWxlKSAkbWVtX3Byb2ZpbGUgPSBhcnJheSgpOwoKCSRtZW1fcHJvZmls ZVsnbm9uY2UnXSA9ICRub25jZSA9IG1kNSggdW5pcWlkKCByYW5kKCksIHRydWUgKSApOwoJ JG1lbV9wcm9maWxlWydSZWFsTmFtZSddID0gJG5hbWUgPSAkbWVtX2Zvcm1fdmFsdWVzWydS ZWFsTmFtZSddOwoJJG1lbV9wcm9maWxlWydlbWFpbCddID0gJGVtYWlsID0gJG1lbV9mb3Jt X3ZhbHVlc1snZW1haWwnXTsKCSRtZW1fcHJvZmlsZVsnbmFtZSddID0gJHVzZXJuYW1lID0g JG1lbV9mb3JtX3ZhbHVlc1snbmFtZSddOwoJJG1lbV9wcm9maWxlWydwcml2cyddID0gJG5l d191c2VyX3ByaXY7CgoJaWYgKHNhZmVfcm93KCd1c2VyX2lkJywgbWVtX2dldF91c2VyX3Rh YmxlX25hbWUoKSwgIm5hbWUgPSAnIi5kb1NsYXNoKCR1c2VybmFtZSkuIiciKSkgewoJCXJl dHVybiBtZW1fZm9ybV9lcnJvcihtZW1fc2VsZl9nVHh0KCd1c2VyX2V4aXN0cycpKTsKCX0K CgkkeHRyYV9jb2x1bW5zID0gbWVtX2dldF9leHRyYV91c2VyX2NvbHVtbnMoKTsKCglmb3Jl YWNoKCR4dHJhX2NvbHVtbnMgYXMgJGMpIHsKCQkkY19uYW1lID0gdHJpbSggJGNbJ0ZpZWxk J10gKTsKCgkJaWYgKGlzc2V0KCRtZW1fZm9ybV92YWx1ZXNbJGNfbmFtZV0pKQoJCQkkbWVt X3Byb2ZpbGVbJGNfbmFtZV0gPSAkbWVtX2Zvcm1fdmFsdWVzWyRjX25hbWVdOwoJfQoKCSRy cyA9IGZhbHNlOwoKCSR4dHJhID0gbWVtX2dldF9leHRyYV91c2VyX2NvbHVtbnNfaW5zZXJ0 X3N0cmluZygpOwoKCSRycyA9IHNhZmVfaW5zZXJ0KAoJCW1lbV9nZXRfdXNlcl90YWJsZV9u YW1lKCksCgkJInByaXZzICAgID0gJyIuZG9TbGFzaCgkbmV3X3VzZXJfcHJpdikuIicsCgkJ IG5hbWUgICAgID0gJyIuZG9TbGFzaCgkdXNlcm5hbWUpLiInLAoJCSBlbWFpbCAgICA9ICci LmRvU2xhc2goJGVtYWlsKS4iJywKCQkgUmVhbE5hbWUgPSAnIi5kb1NsYXNoKCRuYW1lKS4i JywKCQkgcGFzcyAgICAgPSAgcGFzc3dvcmQobG93ZXIoJyIuZG9TbGFzaCgkcHcpLiInKSks CgkJIG5vbmNlICAgID0gJyIuZG9TbGFzaCgkbm9uY2UpLiInIiAuICR4dHJhCgkpOwoKCWlm ICgkcnMpIHsKCQkkbWVtX3Byb2ZpbGVbJ3VzZXJfaWQnXSA9ICRyczsKCQkkbWVtX3Byb2Zp bGVbJ2xhc3RfYWNjZXNzJ10gPSAwOwoKCQkkbWVzc2FnZSA9IEBmZXRjaF9mb3JtKCRtZW1f Zm9ybV92YWx1ZXNbJ2VtYWlsX2Zvcm0nXSk7CgoJCWlmIChlbXB0eSgkbWVzc2FnZSkpIHsK CQkJJG1lc3NhZ2UgPSA8PDxFT0YKe1JlYWxOYW1lfSwKCVlvdSBoYXZlIHN1Y2Nlc3NmdWxs eSByZWdpc3RlcmVkIGF0IHtzaXRlbmFtZX0uIFlvdSBjYW4gbG9naW4gYXQge2xvZ2luX3Vy bH0uCgpVc2VybmFtZToge3VzZXJuYW1lfQpQYXNzd29yZDoge3Bhc3N3b3JkfQoKUmVnYXJk cywKe2FkbWluX25hbWV9CkVPRjsKCQl9CgoJCWlmICghZW1wdHkoJG1lc3NhZ2UpKSB7CgkJ CSR2YWxzID0gJG1lbV9mb3JtX3ZhbHVlczsKCQkJJHZhbHNbJ3NpdGVuYW1lJ10JPSAkc2l0 ZW5hbWU7CgkJCSR2YWxzWydhZG1pbl9uYW1lJ10JPSAkcHJlZnNbJ21lbV9zZWxmX2FkbWlu X25hbWUnXTsKCQkJJHZhbHNbJ2FkbWluX2VtYWlsJ10JPSAkdmFsc1snZnJvbSddOwoJCQkk dmFsc1sncGFzc3dvcmQnXQkJPSAkcHc7CgkJCSR2YWxzWydzaXRldXJsJ10JCT0gaHU7CgkJ CSR2YWxzWyd1c2VybmFtZSddCQk9ICR2YWxzWyduYW1lJ107CgoJCQlmb3JlYWNoICgkdmFs cyBhcyAkYT0+JGIpIHsKCQkJCSRtZXNzYWdlID0gc3RyX3JlcGxhY2UoJzx0eHA6bWVtXycu JGEuJyAvPicsICRiLCAkbWVzc2FnZSk7CgkJCQkkbWVzc2FnZSA9IHN0cl9yZXBsYWNlKCd7 Jy4kYS4nfScsICRiLCAkbWVzc2FnZSk7CgkJCQkkbWVtX2Zvcm1fdGhhbmtzX2Zvcm0gPSBz dHJfcmVwbGFjZSgnPHR4cDptZW1fJy4kYS4nIC8+JywgJGIsICRtZW1fZm9ybV90aGFua3Nf Zm9ybSk7CgkJCQkkbWVtX2Zvcm1fdGhhbmtzX2Zvcm0gPSBzdHJfcmVwbGFjZSgneycuJGEu J30nLCAkYiwgJG1lbV9mb3JtX3RoYW5rc19mb3JtKTsKCQkJfQoKCQkJJG1lc3NhZ2UgPSBw YXJzZSgkbWVzc2FnZSk7CgkJCSR0byA9ICRtZW1fcHJvZmlsZVsnZW1haWwnXTsKCQkJJGZy b20gPSAkbWVtX2Zvcm1fdmFsdWVzWydmcm9tJ107CgkJCSRyZXBseSA9ICRtZW1fZm9ybV92 YWx1ZXNbJ3JlcGx5J107CgkJCSRzdWJqZWN0ID0gJG1lbV9mb3JtX3ZhbHVlc1snc3ViamVj dCddOwoKCQkJaWYgKCRtZW1fc2VsZlsnYWRtaW5fYmNjJ10pCgkJCXsKCQkJCSRzZXAgPSAh aXNfd2luZG93cygpID8gIlxuIiA6ICJcclxuIjsKCQkJCSRmcm9tIC49ICRzZXAgLiAnQmNj OiAnIC4gJGZyb207CgkJCX0KCgkJCSRzZW50ID0gbWVtX2Zvcm1fbWFpbCgkZnJvbSwkcmVw bHksJHRvLCRzdWJqZWN0LCRtZXNzYWdlKTsKCgkJCSRtZW1fc2VsZlsnZW1haWxfc3RhdHVz J10gPSAkc2VudDsKCQkJJG1lbV9zZWxmWydlbWFpbF9tZXNzYWdlJ10gPSAkbWVzc2FnZTsK CQkJJG1lbV9zZWxmWydzdGF0dXMnXSA9IHRydWU7CgoJCQlpZiAoJHNlbnQpIHsKCQkJCSRj b29raWV0aW1lID0gdGltZSgpICsgKDM2NSoyNCozNjAwKTsKCQkJCXNldGNvb2tpZSgidHhw X3NlbGZfcmVnaXN0ZXJlZCIsICIxIiwgICRjb29raWV0aW1lLCAiLyIpOwoKCQkJCSRtZW1f c2VsZlsnc3RhdHVzX21lc3NhZ2UnXSA9IG1lbV9zZWxmX2dUeHQoJ3Bhc3N3b3JkX3NlbnRf dG8nLCBhcnJheSgnZW1haWwnPT4kZW1haWwpKTsKCQkJfSBlbHNlIHsKCQkJCS8vIGZhaWxl ZCB0byBzZW5kIGVtYWlsCgkJCQlyZXR1cm4gbWVtX2Zvcm1fZXJyb3IoIG1lbV9zZWxmX2dU eHQoJ2FjY291bnRfY3JlYXRlZF9tYWlsX2ZhaWxlZCcpICk7CgkJCX0KCQl9Cgl9IGVsc2Ug ewoJCXJldHVybiBtZW1fZm9ybV9lcnJvciggbWVtX3NlbGZfZ1R4dCgnZXJyb3JfYWRkaW5n X25ld19hdXRob3InKSApOwoJfQp9CgoKLyoqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHVz ZXIgdGFibGUgKHdpdGhvdXQgUEZYUykgKi8KZnVuY3Rpb24gbWVtX2dldF91c2VyX3RhYmxl X25hbWUoKSB7CglnbG9iYWwgJHByZWZzOwoKCWV4dHJhY3QoJHByZWZzKTsKCgkkdGFibGVf bmFtZSA9ICd0eHBfdXNlcnMnOwoKCWlmIChpc3NldCgkbWVtX3NlbGZfdXNlX2lnbl9kYikg JiYgJG1lbV9zZWxmX3VzZV9pZ25fZGIgPT0gJzEnKSB7CgoJCWlmIChpc3NldCgkaWduX3Vz ZV9jdXN0b20pICYmICRpZ25fdXNlX2N1c3RvbT09JzEnKSB7CgoJCQlpZiAoaXNzZXQoJGln bl91c2VyX2RiKSAmJiAhZW1wdHkoJGlnbl91c2VyX2RiKSkKCQkJCSR0YWJsZV9uYW1lID0g JGlnbl91c2VyX2RiOwoJCX0KCX0KCXJldHVybiAkdGFibGVfbmFtZTsKfQoKLyoqIFNRTCBz dHJpbmcgYnVpbGRlciBmb3Igbm9uLXN0YW5kYXJkIGZpZWxkcyAqLwpmdW5jdGlvbiBtZW1f Z2V0X2V4dHJhX3VzZXJfY29sdW1uc19pbnNlcnRfc3RyaW5nKCkgewoJJHh0cmFfY29sdW1u cyA9IG1lbV9nZXRfZXh0cmFfdXNlcl9jb2x1bW5zKCk7CgoJJHh0cmEgPSAnJzsKCglmb3Jl YWNoICgkeHRyYV9jb2x1bW5zIGFzICR4Y29sKSB7CgkJJG5hbWUgPSAkeGNvbFsnRmllbGQn XTsKCQkkdHlwZSA9IHN0cnRvbG93ZXIoJHhjb2xbJ1R5cGUnXSk7CgkJJHZhbCA9IGdwcygk bmFtZSk7CgoJCWlmICggc3Ryc3RyKCR0eXBlLCdpbnQnKQoJCQkJfHwgJHR5cGU9PSdmbG9h dCcKCQkJCXx8ICR0eXBlPT0nZGVjaW1hbCcKCQkJCXx8ICR0eXBlPT0nZG91YmxlJwoJCQkJ fHwgJHR5cGU9PSdib29sJyApIHsKCQkJLy8gZG9uJ3QgcXVvdGUgdmFsdWUKCQkJaWYgKCFp bnR2YWwoJHZhbCkpCgkJCQkkdmFsID0gKCAkdmFsPT0neWVzJyB8fCAkdmFsPT0nb24nICkg PyAkdmFsID0gMSA6ICR2YWwgPSAwOwoKCQkJJHh0cmEgLj0gIiwgeyRuYW1lfT0iIC4gKCR2 YWwgPT0gZmFsc2UgPyAnMCcgOiBkb1NsYXNoKCR2YWwpKTsKCQl9IGVsc2UgewoJCQkvLyBx dW90ZSB2YWx1ZQoJCQkkeHRyYSAuPSAiLCB7JG5hbWV9PSciIC4gZG9TbGFzaCgkdmFsKSAu IiciOwoJCX0KCX0KCglyZXR1cm4gJHh0cmE7Cn0KCi8qKiBEaWZmIHVzZXIgdGFibGUgYW5k IHJldHVybiBub24tc3RhbmRhcmQgY29sdW1ucyAqLwpmdW5jdGlvbiBtZW1fZ2V0X2V4dHJh X3VzZXJfY29sdW1ucygpCnsKCXN0YXRpYyAkZGVmYXVsdF9jb2x1bW5zID0gYXJyYXkoJ3Vz ZXJfaWQnLCduYW1lJywncGFzcycsJ1JlYWxOYW1lJywnZW1haWwnLCdwcml2cycsJ2xhc3Rf YWNjZXNzJywnbm9uY2UnKTsKCXN0YXRpYyAkeHRyYV9jb2x1bW5zID0gZmFsc2U7CgoJaWYg KGlzX2FycmF5KCR4dHJhX2NvbHVtbnMpKQoJCXJldHVybiAkeHRyYV9jb2x1bW5zOwoKCSR0 YWJsZV9uYW1lID0gbWVtX2dldF91c2VyX3RhYmxlX25hbWUoKTsKCSR0eHBkZXNjID0gZ2V0 Um93cygnZGVzY3JpYmUgJy5QRlguICR0YWJsZV9uYW1lKTsKCgkkeHRyYV9jb2xzID0gYXJy YXkoKTsKCgkkZGNvbHMgPSAkZGVmYXVsdF9jb2x1bW5zOwoKCWZvcmVhY2goJHR4cGRlc2Mg YXMgJHIpIHsKCQlpZiAoICFpbl9hcnJheSgkclsnRmllbGQnXSwgJGRlZmF1bHRfY29sdW1u cykgKQoJCQkkeHRyYV9jb2xzW10gPSAkcjsKCX0KCglyZXR1cm4gJHh0cmFfY29sczsKfQoK Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQpmdW5jdGlvbiBtZW1fc2VsZl9yZWdpc3Rlcl9lbWFpbF9tZXNzYWdlKCRh dHRzKQp7CglnbG9iYWwgJG1lbV9zZWxmOwoJcmV0dXJuICRtZW1fc2VsZlsnZW1haWxfbWVz c2FnZSddOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIG1lbV9zZWxmX3JlZ2lzdGVyX3N0YXR1 c19tZXNzYWdlKCRhdHRzKQp7CglnbG9iYWwgJG1lbV9zZWxmOwoJcmV0dXJuICRtZW1fc2Vs Zlsnc3RhdHVzX21lc3NhZ2UnXTsKfQoKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZnVuY3Rpb24gbWVtX2lmX21l c3NhZ2Vfc2VudCgkYXR0cywkdGhpbmcpCnsKCWdsb2JhbCAkbWVtX3NlbGY7CgkkY29uZGl0 aW9uID0gKCRtZW1fc2VsZlsnZW1haWxfc3RhdHVzJ10pOwoJcmV0dXJuIHBhcnNlKEV2YWxF bHNlKCR0aGluZywgJGNvbmRpdGlvbikpOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIG1lbV9p Zl9zZWxmX3JlZ2lzdGVyZWQoJGF0dHMsJHRoaW5nKQp7CglnbG9iYWwgJG1lbV9zZWxmLCR0 eHBfdXNlciwkaWduX3VzZXI7CgkkY29uZGl0aW9uID0gKCRtZW1fc2VsZlsnc3RhdHVzJ10g b3IgIWVtcHR5KCRfQ09PS0lFWyd0eHBfc2VsZl9yZWdpc3RlcmVkJ10pIG9yICFlbXB0eSgk dHhwX3VzZXIpIG9yICFlbXB0eSgkaWduX3VzZXIpICk7CglyZXR1cm4gcGFyc2UoRXZhbEVs c2UoJHRoaW5nLCAkY29uZGl0aW9uKSk7Cn0KCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLwovLyBVc2VyIFNpZGUgUHJvZmlsZSBhbmQgUGFzc3dvcmQgQ2hhbmdlIEZvcm1zCi8v IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KaWYgKHR4cGludGVyZmFjZSAhPSAnYWRtaW4nIGFuZCAhZnVuY3Rpb25fZXhp c3RzKCd0eHBfdmFsaWRhdGUnKSkgewoJcmVxdWlyZV9vbmNlIHR4cGF0aC4nL2luY2x1ZGUv dHhwX2F1dGgucGhwJzsKfQoKZnVuY3Rpb24gbWVtX3NlbGZfcGFzc3dvcmRfcmVzZXRfZm9y bSgkYXR0cywkdGhpbmc9JycpCnsKCWdsb2JhbCAkbWVtX3NlbGYsICRzaXRlbmFtZSwgJHBy b2R1Y3Rpb25fc3RhdHVzOwoKCWV4dHJhY3QobEF0dHMoYXJyYXkoCgkJJ2Zvcm0nCQk9PiAn JywKCQknZm9ybV9tYWlsJwk9PiAnJywKCQknZnJvbScJCT0+ICRtZW1fc2VsZlsnYWRtaW5f ZW1haWwnXSwKCQkncmVwbHknCQk9PiAnJywKCQknc3ViamVjdCcJPT4gIlskc2l0ZW5hbWVd ICIubWVtX3NlbGZfZ1R4dCgncGFzc3dvcmRfcmVzZXRfY29uZmlybWF0aW9uX3JlcXVlc3Qn KSwKCQknY29uZmlybV91cmwnCT0+ICcnLAoJCSdjaGVja19uYW1lJwk9PiAxLAoJCSdjaGVj a19lbWFpbCcJPT4gMQoJKSwkYXR0cyxmYWxzZSkpOwoKCWlmICghaXNfY2FsbGFibGUoJ21h aWwnKSkKCXsKCQlyZXR1cm4gKCRwcm9kdWN0aW9uX3N0YXR1cyA9PSAnbGl2ZScpID8KCQkJ bWVtX3NlbGZfZ1R4dCgnbWFpbF9zb3JyeScpIDoKCQkJZ1R4dCgnd2Fybl9tYWlsX3VuYXZh aWxhYmxlJyk7Cgl9CgoKCWlmIChncHMoJ21lbV9zZWxmX2NvbmZpcm0nKSkKCXsKCQlzbGVl cCgzKTsKCgkJJGNvbmZpcm0gPSBwYWNrKCdIKicsIGdwcygnbWVtX3NlbGZfY29uZmlybScp KTsKCQkkbmFtZSAgICA9IHN1YnN0cigkY29uZmlybSwgNSk7CgkJJG5vbmNlICAgPSBzYWZl X2ZpZWxkKCdub25jZScsICd0eHBfdXNlcnMnLCAibmFtZSA9ICciLmRvU2xhc2goJG5hbWUp LiInIik7CgoJCWlmICgkbm9uY2UgYW5kICRjb25maXJtID09PSBwYWNrKCdIKicsIHN1YnN0 cihtZDUoJG5vbmNlKSwgMCwgMTApKS4kbmFtZSkKCQl7CgkJCSRlbWFpbCA9IHNhZmVfZmll bGQoJ2VtYWlsJywgJ3R4cF91c2VycycsICJuYW1lID0gJyIuZG9TbGFzaCgkbmFtZSkuIici KTsKCQkJJG5ld19wYXNzID0gZG9TbGFzaChnZW5lcmF0ZV9wYXNzd29yZCgxMCkpOwoKCQkJ JHJzID0gc2FmZV91cGRhdGUoJ3R4cF91c2VycycsICJwYXNzID0gcGFzc3dvcmQobG93ZXIo JyRuZXdfcGFzcycpKSIsICJuYW1lID0gJyIuZG9TbGFzaCgkbmFtZSkuIiciKTsKCgkJCWlm ICgkcnMpCgkJCXsKCQkJCWlmIChzZW5kX25ld19wYXNzd29yZCgkbmV3X3Bhc3MsICRlbWFp bCwgJG5hbWUpKQoJCQkJCXJldHVybiBtZW1fc2VsZl9nVHh0KCdwYXNzd29yZF9zZW50X3Rv JywgYXJyYXkoJ3tlbWFpbH0nPT4kZW1haWwpKTsKCQkJCWVsc2UKCQkJCQlyZXR1cm4gbWVt X3NlbGZfZ1R4dCgnbWFpbF9zb3JyeScpOwoJCQl9CgkJCWVsc2UKCQkJCXJldHVybiBtZW1f c2VsZl9nVHh0KCdwYXNzd29yZF9jaGFuZ2VfZmFpbGVkJyk7CgkJfQoJfQoKCWlmICghJGNo ZWNrX25hbWUgYW5kICEkY2hlY2tfZW1haWwpCgkJcmV0dXJuIG1lbV9zZWxmX2dUeHQoJ2lu dmFsaWRfZm9ybV90YWdzJyxhcnJheSgne2Zvcm19Jz0+J21lbV9zZWxmX3Bhc3N3b3JkX3Jl c2V0X2Zvcm0nKSk7CgoJaWYgKCFlbXB0eSgkZm9ybSkpIHsKCQkkdGhpbmcgPSBmZXRjaF9m b3JtKCRmb3JtKTsKCQl1bnNldCgkYXR0c1snZm9ybSddKTsKCX0KCgkkc2VjcmV0cyA9IGFy cmF5KCdmb3JtX21haWwnLCdmcm9tJywncmVwbHknLCdzdWJqZWN0JywnY29uZmlybV91cmwn LCAnY2hlY2tfbmFtZScsICdjaGVja19lbWFpbCcpOwoKCWZvcmVhY2goJHNlY3JldHMgYXMg JGEpIHsKCQkkdGhpbmcgLj0gJzx0eHA6bWVtX2Zvcm1fc2VjcmV0IG5hbWU9IicuJGEuJyIg dmFsdWU9IicuJCRhLiciIC8+JzsKCQl1bnNldCgkYXR0c1skYV0pOwoJfQoKCXJldHVybiBt ZW1fZm9ybSgkYXR0cyArIGFycmF5KCd0eXBlJz0+J21lbV9zZWxmX3Bhc3N3b3JkX3Jlc2V0 JyksJHRoaW5nKTsKfQoKcmVnaXN0ZXJfY2FsbGJhY2soJ21lbV9zZWxmX3Bhc3N3b3JkX3Jl c2V0X2Zvcm1fc3VibWl0JywnbWVtX2Zvcm0uc3VibWl0Jyk7CgpmdW5jdGlvbiBtZW1fc2Vs Zl9wYXNzd29yZF9yZXNldF9mb3JtX3N1Ym1pdCgpCnsKCWdsb2JhbCAkbWVtX2Zvcm1fdHlw ZSwgJG1lbV9mb3JtX3ZhbHVlcywgJG1lbV9wcm9maWxlLCAkcHJlZnMsICRzaXRlbmFtZTsK CglpZiAoJG1lbV9mb3JtX3R5cGUgIT0gJ21lbV9zZWxmX3Bhc3N3b3JkX3Jlc2V0JykKCQly ZXR1cm47CgoJJGNoZWNrX25hbWUgPSAkbWVtX2Zvcm1fdmFsdWVzWydjaGVja19uYW1lJ107 CgkkY2hlY2tfZW1haWwgPSAkbWVtX2Zvcm1fdmFsdWVzWydjaGVja19lbWFpbCddOwoKCSR3 aGVyZSA9IGFycmF5KCk7CgoJaWYgKCRjaGVja19uYW1lKSB7CgkJZm9yZWFjaChhcnJheSgn bmFtZScsJ3BfdXNlcmlkJywndXNlcm5hbWUnKSBhcyAkbikKCQl7CgkJCWlmIChpc3NldCgk bWVtX2Zvcm1fdmFsdWVzWyRuXSkpIHsKCQkJCSRuYW1lID0gJG1lbV9mb3JtX3ZhbHVlc1sk bl07CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJaWYgKCFpc3NldCgkbmFtZSkpCgkJCXJldHVy biBtZW1fc2VsZl9nVHh0KCdtaXNzaW5nX2Zvcm1fZmllbGQnLGFycmF5KCd7bmFtZX0nPT4n bmFtZScpKTsKCgkJJHdoZXJlW10gPSAibmFtZSA9ICciLmRvU2xhc2goJG5hbWUpLiInIjsK CX0KCglpZiAoJGNoZWNrX2VtYWlsKSB7CgkJJGVtYWlsID0gQCRtZW1fZm9ybV92YWx1ZXNb J2VtYWlsJ107CgoJCWlmIChlbXB0eSgkZW1haWwpKQoJCQlyZXR1cm4gbWVtX3NlbGZfZ1R4 dCgnbWlzc2luZ19mb3JtX2ZpZWxkJyxhcnJheSgne25hbWV9Jz0+J2VtYWlsJykpOwoKCQkk d2hlcmVbXSA9ICJlbWFpbCA9ICciLmRvU2xhc2goJGVtYWlsKS4iJyI7Cgl9CgoJaWYgKGVt cHR5KCR3aGVyZSkpCgkJcmV0dXJuIG1lbV9zZWxmX2dUeHQoJ21pc3NpbmdfZm9ybV9maWVs ZCcsYXJyYXkoJ3tuYW1lfSc9PiduYW1lJykpOwoKCSRycyA9IHNhZmVfcm93KCduYW1lLCBl bWFpbCwgbm9uY2UsIFJlYWxOYW1lJywgbWVtX2dldF91c2VyX3RhYmxlX25hbWUoKSwgam9p bignIGFuZCAnLCR3aGVyZSkpOwoKCWlmICgkcnMpCgl7CgkJJHVybCA9IEAkbWVtX2Zvcm1f dmFsdWVzWydjb25maXJtX3VybCddOwoJCSR1cmwgPSBlbXB0eSgkdXJsKSA/IGh1Lid0ZXh0 cGF0dGVybi9pbmRleC5waHAnIDogaHUubHRyaW0oJHVybCwnLycpOwoJCSR1cmwgLj0gKHN0 cnN0cigkdXJsLCAnPycpPT09ZmFsc2UpID8gJz8nIDogJyYnOwoKCQlleHRyYWN0KCRycyk7 CgoJCSRjb25maXJtID0gYmluMmhleChwYWNrKCdIKicsIHN1YnN0cihtZDUoJG5vbmNlKSwg MCwgMTApKS4kbmFtZSk7CgoJCSRtZXNzYWdlID0gZmV0Y2hfZm9ybSgkbWVtX2Zvcm1fdmFs dWVzWydmb3JtX21haWwnXSk7CgoJCWlmIChlbXB0eSgkbWVzc2FnZSkpIHsKCQkJJG1zZyA9 IG1lbV9zZWxmX2dUeHQoJ2dyZWV0aW5nJykuJyAnLiRuYW1lLicsJy4KCQkJCQluLm4ubWVt X3NlbGZfZ1R4dCgncGFzc3dvcmRfcmVzZXRfY29uZmlybWF0aW9uJykuJzogJy4KCQkJCQlu LiAkdXJsIC4gJ21lbV9zZWxmX2NvbmZpcm09Jy4kY29uZmlybTsKCQl9CgkJZWxzZSB7CgkJ CSR2YWxzID0gJG1lbV9mb3JtX3ZhbHVlczsKCQkJJHZhbHNbJ3NpdGVuYW1lJ10JPSAkc2l0 ZW5hbWU7CgkJCSR2YWxzWydhZG1pbl9uYW1lJ10JPSAkcHJlZnNbJ21lbV9zZWxmX2FkbWlu X25hbWUnXTsKCQkJJHZhbHNbJ2FkbWluX2VtYWlsJ10JPSAkdmFsc1snZnJvbSddOwoJCQkv LyR2YWxzWydwYXNzd29yZCddCQk9ICRwdzsKCQkJJHZhbHNbJ2NvbmZpcm1fdXJsJ10gPSAk dXJsOwoJCQkkdmFsc1snc2l0ZXVybCddCQk9IGh1OwoJCQkkdmFsc1sndXNlcm5hbWUnXQkJ PSAkdmFsc1snbmFtZSddOwoKCQkJZm9yZWFjaCAoJHZhbHMgYXMgJGE9PiRiKSB7CgkJCQkk bWVzc2FnZSA9IHN0cl9yZXBsYWNlKCd7Jy4kYS4nfScsICRiLCAkbWVzc2FnZSk7CgkJCQkk bWVzc2FnZSA9IHN0cl9yZXBsYWNlKCc8dHhwOm1lbV8nLiRhLicgLz4nLCRiLCRtZXNzYWdl KTsKCQkJfQoKCQkJJG1zZyA9IHBhcnNlKCRtZXNzYWdlKTsKCQl9CgoJCSR0byA9ICRlbWFp bDsKCQkkZnJvbSA9ICRtZW1fZm9ybV92YWx1ZXNbJ2Zyb20nXTsKCQkkcmVwbHkgPSAkbWVt X2Zvcm1fdmFsdWVzWydyZXBseSddOwoJCSRzdWJqZWN0ID0gJG1lbV9mb3JtX3ZhbHVlc1sn c3ViamVjdCddOwoKCQlpZiAobWVtX2Zvcm1fbWFpbCgkZnJvbSwkcmVwbHksJHRvLCRzdWJq ZWN0LCRtc2cpKQoJCQlyZXR1cm4gbWVtX3NlbGZfZ1R4dCgncGFzc3dvcmRfcmVzZXRfY29u ZmlybWF0aW9uX3JlcXVlc3Rfc2VudCcpOwoJCWVsc2UKCQkJcmV0dXJuIG1lbV9zZWxmX2dU eHQoJ21haWxfc29ycnknKTsKCX0KCWVsc2UKCQlyZXR1cm4gbWVtX3NlbGZfZ1R4dCgndXNl cl9ub3RfZm91bmQnKTsKfQoKCmZ1bmN0aW9uIG1lbV9zZWxmX2NoYW5nZV9wYXNzd29yZF9m b3JtKCRhdHRzLCR0aGluZz0nJykKewoJZ2xvYmFsICRtZW1fc2VsZiwgJHNpdGVuYW1lLCAk cHJvZHVjdGlvbl9zdGF0dXM7CgoJaGVhZGVyKCdDYWNoZS1Db250cm9sOiBuby1jYWNoZScp OwoJaGVhZGVyKCdQcmFnbWE6IG5vLWNhY2hlJyk7CgoJaWYgKCFpc19jYWxsYWJsZSgnbWFp bCcpKQoJewoJCXJldHVybiAoJHByb2R1Y3Rpb25fc3RhdHVzID09ICdsaXZlJykgPwoJCQlt ZW1fc2VsZl9nVHh0KCdtYWlsX3NvcnJ5JykgOgoJCQlnVHh0KCd3YXJuX21haWxfdW5hdmFp bGFibGUnKTsKCX0KCglleHRyYWN0KGxBdHRzKGFycmF5KAoJCSdmb3JtJwkJPT4gJycsCgkJ J2VtYWlsX2Zvcm0nCT0+ICcnLAoJCSdmcm9tJwkJPT4gJG1lbV9zZWxmWydhZG1pbl9lbWFp bCddLAoJCSdyZXBseScJCT0+ICcnLAoJCSdzdWJqZWN0Jwk9PiAnWycuJHNpdGVuYW1lLidd ICcuIG1lbV9zZWxmX2dUeHQoJ3Bhc3N3b3JkX2NoYW5nZWQnKSwKCSksJGF0dHMsZmFsc2Up KTsKCglpZiAoIWVtcHR5KCRmb3JtKSkgewoJCSR0aGluZyA9IGZldGNoX2Zvcm0oJGZvcm0p OwoJCXVuc2V0KCRhdHRzWydmb3JtJ10pOwoJfQoKCWZvcmVhY2goYXJyYXkoJ2Zyb20nLCdy ZXBseScsJ3N1YmplY3QnLCdlbWFpbF9mb3JtJykgYXMgJGEpIHsKCQkkdGhpbmcgLj0gJzx0 eHA6bWVtX2Zvcm1fc2VjcmV0IG5hbWU9IicuJGEuJyIgdmFsdWU9IicuJCRhLiciIC8+JzsK CQl1bnNldCgkYXR0c1skYV0pOwoJfQoKCXJldHVybiBtZW1fZm9ybSgkYXR0cyArIGFycmF5 KCd0eXBlJz0+J21lbV9zZWxmX3Bhc3N3b3JkJyksJHRoaW5nKTsKfQoKcmVnaXN0ZXJfY2Fs bGJhY2soJ21lbV9zZWxmX3Bhc3N3b3JkX2Zvcm1fc3VibWl0JywnbWVtX2Zvcm0uc3VibWl0 Jyk7CgpmdW5jdGlvbiBtZW1fc2VsZl9wYXNzd29yZF9mb3JtX3N1Ym1pdCgpCnsKCWdsb2Jh bCAkcHJlZnMsICR0eHBfdXNlciwgJGlnbl91c2VyLCAkbWVtX2Zvcm1fdHlwZSwgJG1lbV9m b3JtX3ZhbHVlcywgJG1lbV9mb3JtX3RoYW5rc19mb3JtLCAkbWVtX3NlbGY7CgoJaWYgKCRt ZW1fZm9ybV90eXBlICE9ICdtZW1fc2VsZl9wYXNzd29yZCcpCgkJcmV0dXJuOwoKCSR2ZXJp Znlfb2xkID0gYXJyYXlfa2V5X2V4aXN0cygnb2xkX3Bhc3N3b3JkJywgJG1lbV9mb3JtX3Zh bHVlcyk7CgkkY29uZmlybSA9IGFycmF5X2tleV9leGlzdHMoJ3Bhc3N3b3JkX2NvbmZyaW0n LCAkbWVtX2Zvcm1fdmFsdWVzKTsKCgkkbmV3X3Bhc3MgPSAkbWVtX2Zvcm1fdmFsdWVzWydw YXNzd29yZCddOwoJJG9sZF9wYXNzID0gJG1lbV9mb3JtX3ZhbHVlc1snb2xkX3Bhc3N3b3Jk J107CgoJJHVzZXIgPSBpc3NldCgkaWduX3VzZXIpID8gJGlnbl91c2VyIDogJHR4cF91c2Vy OwoKCSR3aGVyZSA9ICJuYW1lID0gJyIuZG9TbGFzaCgkdXNlcikuIiciOwoKCSRpc192YWxp ZCA9ICR2ZXJpZnlfb2xkID8gdHhwX3ZhbGlkYXRlKCR1c2VyLCRvbGRfcGFzcykgOiB0cnVl OwoKCWlmICghJGlzX3ZhbGlkKSB7CgkJcmV0dXJuIG1lbV9mb3JtX2Vycm9yKG1lbV9zZWxm X2dUeHQoJ3Bhc3N3b3JkX2ludmFsaWQnKSk7Cgl9CgoJaWYgKCRjb25maXJtIGFuZCAoJG5l d19wYXNzICE9ICRtZW1fZm9ybV92YWx1ZXNbJ3Bhc3N3b3JkX2NvbmZpcm0nXSkpIHsKCQly ZXR1cm4gbWVtX2Zvcm1fZXJyb3IobWVtX3NlbGZfZ1R4dCgncGFzc3dvcmRfbWlzbWF0Y2gn KSk7Cgl9CgoJJHJzID0gc2FmZV91cGRhdGUoIG1lbV9nZXRfdXNlcl90YWJsZV9uYW1lKCks ICJwYXNzID0gcGFzc3dvcmQobG93ZXIoJyRuZXdfcGFzcycpKSIsICR3aGVyZSk7CgoJaWYg KCEkcnMpIHsKCQlyZXR1cm4gbWVtX2Zvcm1fZXJyb3IobWVtX3NlbGZfZ1R4dCgncGFzc3dv cmRfY2hhbmdlX2ZhaWxlZCcpKTsKCX0KCgkvLyBzdWNjZXNzZnVsCgkkbWVtX3Byb2ZpbGUg PSBzYWZlX3JvdygnKicsbWVtX2dldF91c2VyX3RhYmxlX25hbWUoKSwibmFtZSA9ICd7JHVz ZXJ9JyIpOwoKCWlmICgkbWVtX3Byb2ZpbGUpCgl7CgkJJG1lbV9wcm9maWxlWyduZXdfcGFz cyddID0gJG5ld19wYXNzOwoKCQkkbWVzc2FnZSA9IEBmZXRjaF9mb3JtKCRtZW1fZm9ybV92 YWx1ZXNbJ2VtYWlsX2Zvcm0nXSk7CgoJCWlmICghZW1wdHkoJG1lc3NhZ2UpKQoJCXsKCQkJ JHZhbHMgPSAkbWVtX2Zvcm1fdmFsdWVzOwoJCQkkdmFsc1snc2l0ZW5hbWUnXQk9ICRzaXRl bmFtZTsKCQkJJHZhbHNbJ2FkbWluX25hbWUnXQk9ICRwcmVmc1snbWVtX3NlbGZfYWRtaW5f bmFtZSddOwoJCQkkdmFsc1snYWRtaW5fZW1haWwnXQk9ICR2YWxzWydmcm9tJ107CgkJCSR2 YWxzWydwYXNzd29yZCddCQk9ICRtZW1fcHJvZmlsZVsnbmV3X3Bhc3MnXTsKCQkJJHZhbHNb J3NpdGV1cmwnXQkJPSBodTsKCQkJJHZhbHNbJ3VzZXJuYW1lJ10JCT0gJHZhbHNbJ25hbWUn XTsKCgkJCWZvcmVhY2ggKCR2YWxzIGFzICRhPT4kYikgewoJCQkJJG1lc3NhZ2UgPSBzdHJf cmVwbGFjZSgneycuJGEuJ30nLCAkYiwgJG1lc3NhZ2UpOwoJCQkJJG1lc3NhZ2UgPSBzdHJf cmVwbGFjZSgnPHR4cDptZW1fJy4kYS4nIC8+JywkYiwkbWVzc2FnZSk7CgkJCX0KCgkJfQoJ CWVsc2UgewoJCQkkbWVzc2FnZSA9IG1lbV9zZWxmX2dUeHQoJ2dyZWV0aW5nJywgYXJyYXko J3tuYW1lfSc9PiRtZW1fZm9ybV92YWx1ZXNbJ1JlYWxOYW1lJ10pKS4iXHJcbiIuCgkJCQlt ZW1fc2VsZl9nVHh0KCd5b3VyX3Bhc3N3b3JkX2lzJywgYXJyYXkoJ3twYXNzd29yZH0nPT4k bmV3X3Bhc3MpKS4iXHJcbiIuCgkJCQltZW1fc2VsZl9nVHh0KCdsb2dfaW5fYXQnLCBhcnJh eSgne3VybH0nPT4gJG1lbV9mb3JtX3ZhbHVlc1snbG9naW5fdXJsJ10pKTsKCQl9CgoJCSRt c2cgPSBwYXJzZSgkbWVzc2FnZSk7CgoJCSR0byA9ICRtZW1fcHJvZmlsZVsnZW1haWwnXTsK CQkkZnJvbSA9ICRtZW1fZm9ybV92YWx1ZXNbJ2Zyb20nXTsKCQkkcmVwbHkgPSAkbWVtX2Zv cm1fdmFsdWVzWydyZXBseSddOwoJCSRzdWJqZWN0ID0gJG1lbV9mb3JtX3ZhbHVlc1snc3Vi amVjdCddOwoKCQlpZiAobWVtX2Zvcm1fbWFpbCgkZnJvbSwkcmVwbHksJHRvLCRzdWJqZWN0 LCRtc2cpKQoJCQlyZXR1cm4gbWVtX3NlbGZfZ1R4dCgncGFzc3dvcmRfY2hhbmdlZCcpOwoJ CWVsc2UKCQkJcmV0dXJuIG1lbV9zZWxmX2dUeHQoJ3Bhc3N3b3JkX2NoYW5nZWRfbWFpbF9m YWlsZWQnKTsKCX0KCWVsc2UgewoJCS8vIG5vIGVtYWlsLCBmYWlsIHNpbGVudGx5Cgl9Cgp9 CgpyZWdpc3Rlcl9jYWxsYmFjaygnbWVtX3NlbGZfdXNlcl9lZGl0X3N1Ym1pdCcsJ21lbV9m b3JtLnN1Ym1pdCcpOwpyZWdpc3Rlcl9jYWxsYmFjaygnbWVtX3NlbGZfcmVnaXN0ZXJfZGVm YXVsdHMnLCdtZW1fZm9ybS5kZWZhdWx0cycpOwoKZnVuY3Rpb24gbWVtX3NlbGZfdXNlcl9l ZGl0X2Zvcm0oJGF0dHMsJHRoaW5nPScnKQp7CgloZWFkZXIoJ0NhY2hlLUNvbnRyb2w6IG5v LWNhY2hlJyk7CgloZWFkZXIoJ1ByYWdtYTogbm8tY2FjaGUnKTsKCglyZXR1cm4gbWVtX2Zv cm0oJGF0dHMgKyBhcnJheSgndHlwZSc9PidtZW1fc2VsZl91c2VyX2VkaXQnKSwkdGhpbmcp Owp9CgpmdW5jdGlvbiBtZW1fc2VsZl9yZWdpc3Rlcl9kZWZhdWx0cygpCnsKCWdsb2JhbCAk dHhwX3VzZXIsICRpZ25fdXNlciwgJG1lbV9mb3JtX3R5cGUsICRtZW1fcHJvZmlsZTsKCglp ZiAoJG1lbV9mb3JtX3R5cGUgIT0gJ21lbV9zZWxmX3VzZXJfZWRpdCcpIHJldHVybjsKCgkk dXNlciA9IGlzc2V0KCRpZ25fdXNlcikgPyAkaWduX3VzZXIgOiAkdHhwX3VzZXI7CgoKCSRt ZW1fcHJvZmlsZSA9IHNhZmVfcm93KCcqJyxtZW1fZ2V0X3VzZXJfdGFibGVfbmFtZSgpLCJu YW1lID0gJ3skdXNlcn0nIik7CgoJaWYgKCRtZW1fcHJvZmlsZSkgewoJCW1lbV9mb3JtX2Rl ZmF1bHQoJG1lbV9wcm9maWxlKTsKCX0KfQoKZnVuY3Rpb24gbWVtX3NlbGZfdXNlcl9lZGl0 X3N1Ym1pdCgpCnsKCWdsb2JhbCAkcHJlZnMsICR0eHBfdXNlciwgJGlnbl91c2VyLCAkbWVt X2Zvcm1fdHlwZSwgJG1lbV9mb3JtX3ZhbHVlcywgJG1lbV9mb3JtX3RoYW5rc19mb3JtLCAk bWVtX3Byb2ZpbGU7CgoJaWYgKCRtZW1fZm9ybV90eXBlICE9ICdtZW1fc2VsZl91c2VyX2Vk aXQnKQoJCXJldHVybjsKCglpZiAoaXNzZXQoJGlnbl91c2VyKSkgJHR4cF91c2VyID0gJGln bl91c2VyOwoKCSRuYW1lID0gaXNzZXQoJG1lbV9mb3JtX3ZhbHVlc1snbmFtZSddKSA/IHRy aW0oJG1lbV9mb3JtX3ZhbHVlc1snbmFtZSddKSA6ICcnOwoKCSR4dHJhID0gbWVtX2dldF9l eHRyYV91c2VyX2NvbHVtbnNfaW5zZXJ0X3N0cmluZygpOwoKCSRtZW1fcHJvZmlsZSA9IGFy cmF5KCk7CgoJJHNxbCA9ICcnOwoKCWlmICghZW1wdHkoJG1lbV9mb3JtX3ZhbHVlc1snZW1h aWwnXSkpCgkJJHNxbCAgPSAiZW1haWwgPSAnIi5kb1NsYXNoKCRtZW1fZm9ybV92YWx1ZXNb J2VtYWlsJ10pLiInIjsKCWlmICghZW1wdHkoJG1lbV9mb3JtX3ZhbHVlc1snUmVhbE5hbWUn XSkpCgkJJHNxbCAuPSAiLCBSZWFsTmFtZSA9ICciLmRvU2xhc2goJG1lbV9mb3JtX3ZhbHVl c1snUmVhbE5hbWUnXSkuIiciOwoKCWlmICghZW1wdHkoJG5hbWUpKQoJewoJCSRzcWwgLj0g IiwgbmFtZSA9ICciLmRvU2xhc2goJG5hbWUpLiInIjsKCgkJLy8gbmVlZCB0byByZW1vdmUg dGhlIGlnbl9wYXNzd29yZF9wcm90ZWN0IGNvb2tpZQoJCXNldGNvb2tpZSgnaWduX2xvZ2lu JywgJycsIHRpbWUoKS04NjQwMCk7Cgl9CgoJaWYgKGVtcHR5KCRzcWwpKQoJCXJldHVybiBt ZW1fc2VsZl9nVHh0KCdzYXZlZF91c2VyX3Byb2ZpbGVfZmFpbGVkJyk7CgoJJHJzID0gc2Fm ZV91cGRhdGUoIG1lbV9nZXRfdXNlcl90YWJsZV9uYW1lKCksCgkJCQkkc3FsIC4gJHh0cmEs CgkJCQkibmFtZSA9ICd7JHR4cF91c2VyfSciKTsKCglpZiAoJHJzKSB7CgkJcmV0dXJuIG1l bV9zZWxmX2dUeHQoJ3NhdmVkX3VzZXJfcHJvZmlsZScpOwoJfQoJZWxzZSB7CgkJcmV0dXJu IG1lbV9zZWxmX2dUeHQoJ3NhdmVkX3VzZXJfcHJvZmlsZV9mYWlsZWQnKTsKCX0KfQoKCmZ1 bmN0aW9uIG1lbV9wcm9maWxlKCRhdHRzLCAkYm9keT0nJykKewoJZ2xvYmFsICRtZW1fcHJv ZmlsZSwkdHhwX3VzZXIsJGlnbl91c2VyOwoKCWlmIChpc3NldCgkaWduX3VzZXIpKSAkdHhw X3VzZXIgPSAkaWduX3VzZXI7CgoJZXh0cmFjdChsQXR0cyhhcnJheSgKCQkndXNlcicJCT0+ ICcnLAoJCSd1c2VyaWQnCT0+ICcnLAoJCSd2YXInCQkJPT4gJ1JlYWxOYW1lJywKCQknZm9y bScJCT0+ICcnCgkpLCRhdHRzKSk7CgoJaWYgKGVtcHR5KCR1c2VyKSAmJiBlbXB0eSgkdXNl cmlkKSkgewoJCS8vIHVzZSB0aGUgb2xkIG1ldGhvZAoJCWlmICghaXNfYXJyYXkoJG1lbV9w cm9maWxlKSAmJiAkdHhwX3VzZXIpCgkJCSRtZW1fcHJvZmlsZSA9IHNhZmVfcm93KCcqJyxt ZW1fZ2V0X3VzZXJfdGFibGVfbmFtZSgpLCJuYW1lID0gJyIuIGRvU2xhc2goJHR4cF91c2Vy KS4iJyIpOwoJfSBlbHNlIHsKCQkkbWVtX3Byb2ZpbGUgPSAoaXNfYXJyYXkoJG1lbV9wcm9m aWxlKSA/ICRtZW1fcHJvZmlsZSA6IGFycmF5KCkpOwoKCQkvLyBsb29rIHVwIGEgcG90ZW50 aWFsbHkgbmV3IHVzZXIKCQlpZiAoIWVtcHR5KCR1c2VyKSkgewoJCQlpZiAoIWFycmF5X2tl eV9leGlzdHMoJ25hbWUnLCAkbWVtX3Byb2ZpbGUpIHx8IHN0cmNtcCgkbWVtX3Byb2ZpbGVb J25hbWUnXSwkdXNlcikhPTApCgkJCQkkbWVtX3Byb2ZpbGUgPSBzYWZlX3JvdygnKicsbWVt X2dldF91c2VyX3RhYmxlX25hbWUoKSwibmFtZSA9ICciLiBkb1NsYXNoKCR1c2VyKS4iJyIp OwoJCX0KCgkJaWYgKCFlbXB0eSgkdXNlcmlkKSAmJiBpc19udW1lcmljKCR1c2VyaWQpKSB7 CgkJCWlmICghYXJyYXlfa2V5X2V4aXN0cygndXNlcl9pZCcsICRtZW1fcHJvZmlsZSkgfHwg c3RyY21wKCRtZW1fcHJvZmlsZVsndXNlcl9pZCddLCR1c2VyaWQpIT0wKQoJCQkJJG1lbV9w cm9maWxlID0gc2FmZV9yb3coJyonLG1lbV9nZXRfdXNlcl90YWJsZV9uYW1lKCksInVzZXJf aWQgPSAiLiBkb1NsYXNoKCR1c2VyaWQpKTsKCQl9Cgl9CgoJJG91dCA9ICcnOwoKCWlmIChl bXB0eSgkZm9ybSkgJiYgZW1wdHkoJGJvZHkpKSB7CgkJaWYgKCRtZW1fcHJvZmlsZSkKCQkJ JG91dCA9IGFycmF5X2tleV9leGlzdHMoJHZhciwkbWVtX3Byb2ZpbGUpID8gJG1lbV9wcm9m aWxlWyR2YXJdIDogJyc7Cgl9IGVsc2UgewoJCSR0aGluZyA9IGVtcHR5KCRib2R5KSA/IGZl dGNoX2Zvcm0oJGZvcm0pIDogJGJvZHk7CgoJCSRvdXQgPSBwYXJzZShFdmFsRWxzZSgkdGhp bmcsICFlbXB0eSgkbWVtX3Byb2ZpbGUpKSk7Cgl9CgoJcmV0dXJuICRvdXQ7Cn0KCgpmdW5j dGlvbiBtZW1fc3VibWl0KCRhdHRzKSB7CglleHRyYWN0KCRhdHRzKTsKCWlmIChpc3NldCgk dmFsdWUpKSB7CgkJJGF0dHNbJ2xhYmVsJ10gPSAkdmFsdWU7CgkJdW5zZXQoJGF0dHNbJ3Zh bHVlJ10pOwoJfQoJJGF0dHNbJ25hbWUnXSA9ICdzYXZlJzsKCXJldHVybiBtZW1fZm9ybV9z dWJtaXQoJGF0dHMpOwp9CmZ1bmN0aW9uIG1lbV9wYXNzd29yZF9pbnB1dCgkYXR0cykgewoJ Z2xvYmFsICRtZW1fcHJvZmlsZTsKCSRhdHRzWydwYXNzd29yZCddID0gMTsKCXJldHVybiBt ZW1fZm9ybV90ZXh0KCBtZW1fc2VsZl9tYXBfdGFnKCRhdHRzLCduZXdfcGFzcycsJycpICk7 Cn0KZnVuY3Rpb24gbWVtX3JlYWxuYW1lX2lucHV0KCRhdHRzKSB7CglnbG9iYWwgJG1lbV9w cm9maWxlOwoJcmV0dXJuIG1lbV9mb3JtX3RleHQoIG1lbV9zZWxmX21hcF90YWcoJGF0dHMs J1JlYWxOYW1lJywkbWVtX3Byb2ZpbGVbJ1JlYWxOYW1lJ10pICk7Cn0KZnVuY3Rpb24gbWVt X2VtYWlsX2lucHV0KCRhdHRzKSB7CglnbG9iYWwgJG1lbV9wcm9maWxlOwoJcmV0dXJuIG1l bV9mb3JtX2VtYWlsKCBtZW1fc2VsZl9tYXBfdGFnKCRhdHRzLCdlbWFpbCcsJG1lbV9wcm9m aWxlWydlbWFpbCddKSApOwp9CmZ1bmN0aW9uIG1lbV9waG9uZV9pbnB1dCgkYXR0cykgewoJ Z2xvYmFsICRtZW1fcHJvZmlsZTsKCXJldHVybiBtZW1fZm9ybV90ZXh0KCBtZW1fc2VsZl9t YXBfdGFnKCRhdHRzLCdwaG9uZScsJG1lbV9wcm9maWxlWydwaG9uZSddKSApOwp9CmZ1bmN0 aW9uIG1lbV9hZGRyZXNzX2lucHV0KCRhdHRzKSB7CglnbG9iYWwgJG1lbV9wcm9maWxlOwoJ cmV0dXJuIG1lbV9mb3JtX3RleHRhcmVhKCBtZW1fc2VsZl9tYXBfdGFnKCRhdHRzLCdhZGRy ZXNzJywgJG1lbV9wcm9maWxlWydhZGRyZXNzJ10pICk7Cn0KZnVuY3Rpb24gbWVtX3NlbGZf bWFwX3RhZygkYXR0cywkbmFtZSwkZGVmYXVsdCkgewoJJGF0dHNbJ25hbWUnXSA9ICRuYW1l OwoJaWYgKCFlbXB0eSgkZGVmYXVsdCkpCgkJJGF0dHNbJ2RlZmF1bHQnXSA9ICRkZWZhdWx0 OwoJcmV0dXJuICRhdHRzOwp9CgpmdW5jdGlvbiBtZW1fc2VsZl91c2VyX2NvdW50KCRhdHRz KQp7CglnbG9iYWwgJG1lbV9zZWxmOwoKCWV4dHJhY3QobEF0dHMoYXJyYXkoCgkJJ3VzZXJf bGV2ZWxzJwk9PiAnMCwxLDIsMyw0LDUsNicsCgkJJ3dyYXB0YWcnCT0+ICcnLAoJCSdjbGFz cycJCT0+ICcnCgkpLCRhdHRzKSk7CgoJaWYgKCFlbXB0eSgkdXNlcl9sZXZlbHMpIHx8ICR1 c2VyX2xldmVscz09JzAnKQoJCSR1c2VyX2xldmVscyA9IGRvU2xhc2goc3BsaXQoJywnLCR1 c2VyX2xldmVscykpOwoJZWxzZQoJCSR1c2VyX2xldmVscyA9IGFycmF5KCRtZW1fc2VsZlsn bmV3X3VzZXJfcHJpdiddKTsKCgkkbGV2ZWxzID0gam9pbignLCcsJHVzZXJfbGV2ZWxzKTsK CSRjb3VudCA9IHNhZmVfZmllbGQoJ0NPVU5UKCopJywgbWVtX2dldF91c2VyX3RhYmxlX25h bWUoKSwgInByaXZzIElOICh7JGxldmVsc30pIik7CgoJcmV0dXJuIGRvVGFnKCRjb3VudCwk d3JhcHRhZywkY2xhc3MpOwp9CgoKCiI7czo4OiJoZWxwX3JhdyI7czo3Njk1OiJoMSh0aXRs ZSkuIFVzZXIgU2VsZiBSZWdpc3RyYXRpb24KCmgyKHNlY3Rpb24gc3VtbWFyeSkuIFN1bW1h cnkKCnAuIFRoaXMgcGx1Z2luIGlzIGRlc2lnbmVkIHRvIGVuYWJsZSBjb21tdW5pdHkgZHJp dmVuIHNpdGVzLiBVc2VycyB3aWxsIGJlIGFibGUgdG8gcmVnaXN0ZXIgdGhlbXNlbHZlcyBm b3IgYW4gYWNjb3VudCB0byBhY2Nlc3MgdGhlIHN5c3RlbS4gVGhpcyBwbHVnaW4gaXMgY29t cGF0aWJsZSB3aXRoIHRoZSBpZ25fdXNlcl9wYXNzd29yZCBwbHVnaW4gYWx0ZXJuYXRlIHVz ZXIgdGFibGUuIFRoaXMgcGx1Z2luIHByb3ZpZGVzIHVzZXIgc2lkZSB0YWdzIGZvciBnZW5l cmF0aW5nIGFuIGh0bWwgZm9ybSB3aGVyZSB1c2VycyBjYW4gZWRpdCB0aGVpciBhY2NvdW50 IGluZm9ybWF0aW9uLgoKaDIoc2VjdGlvbiBjb250YWN0KS4gQXV0aG9yIENvbnRhY3QKCiJN aWNoYWVsIE1hbmZyZSI6bWFpbHRvOm1tYW5mcmVAZ21haWwuY29tP3N1YmplY3Q9VGV4dHBh dHRlcm4lMjBtZW1fc2VsZl9yZWdpc3RlciUyMHBsdWdpbgoiaHR0cDovL21hbmZyZS5uZXQi Omh0dHA6Ly9tYW5mcmUubmV0CgpoMihzZWN0aW9uIGxpY2Vuc2UpLiBMaWNlbnNlCgpwLiBU aGlzIHBsdWdpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgIkdQTHYyIjpodHRwOi8vd3d3LmZz Zi5vcmcvbGljZW5zaW5nL2xpY2Vuc2VzL2luZm8vR1BMdjIuaHRtbC4KCmgyKHNlY3Rpb24g aW5zdGFsbGF0aW9uKS4gSW5zdGFsbGF0aW9uCgpwLiBUaGlzIHBsdWdpbiByZXF1aXJlcyB0 aGUgcGx1Z2luIG1lbV9mb3JtICIoaGVscCkiOi4vaW5kZXgucGhwP2V2ZW50PXBsdWdpbiZz dGVwPXBsdWdpbl9oZWxwJm5hbWU9bWVtX2Zvcm0uCgpwLiAiU3RhcnQgSW5zdGFsbCBXaXph cmQiOi4vaW5kZXgucGhwP2V2ZW50PXNlbGYtcmVnJnN0ZXA9cHJlaW5zdGFsbCZhcmVhPWFk bWluCgoKaDIoc2VjdGlvbiB0YWdzKS4gVGFncwoKKiAibWVtX3NlbGZfcmVnaXN0ZXJfZm9y bSI6I21lbV9zZWxmX3JlZ2lzdGVyX2Zvcm0KKiAibWVtX2NoYW5nZV9wYXNzd29yZF9mb3Jt IjojbWVtX2NoYW5nZV9wYXNzd29yZF9mb3JtCiogIm1lbV9zZWxmX3VzZXJfZWRpdF9mb3Jt IjojbWVtX3NlbGZfdXNlcl9lZGl0X2Zvcm0KKiAibWVtX3Byb2ZpbGUiOiNtZW1fcHJvZmls ZQoqICJzZWxmX3JlZ2lzdGVyX2VtYWlsX21lc3NhZ2UiOiNzZWxmX3JlZ2lzdGVyX2VtYWls X21lc3NhZ2UKKiAic2VsZl9yZWdpc3Rlcl9zdGF0dXNfbWVzc2FnZSI6I3NlbGZfcmVnaXN0 ZXJfc3RhdHVzX21lc3NhZ2UKKiAiaWZfc2VsZl9yZWdpc3RlcmVkIjojaWZfc2VsZl9yZWdp c3RlcmVkCiogIm1lbV9zZWxmX3VzZXJfY291bnQiOiNtZW1fc2VsZl91c2VyX2NvdW50Cgpo Myh0YWcjbWVtX3NlbGZfcmVnaXN0ZXJfZm9ybSkuIG1lbV9zZWxmX3JlZ2lzdGVyX2Zvcm0K CnAodGFnLXN1bW1hcnkpLiBUaGlzIHdpbGwgb3V0cHV0IGFuIEhUTUwgZm9ybSB0aGF0IHdp bGwgYWxsb3cgYSB1c2VyIHRvIHJlZ2lzdGVyIHRoZW1zZWx2ZXMgd2l0aCBhbiBhY2NvdW50 LgoKKihhdHRzKSAlKGF0dHMtbmFtZSlmb3JtJSAlKGF0dHMtdHlwZSlzdHJpbmclIFNwZWNp ZmllcyB3aGljaCBmb3JtIGNvbnRhaW5zIHRoZSBIVE1MIGZvcm0gdGVtcGxhdGUuIERlZmF1 bHQgaXMgInNlbGZfcmVnaXN0ZXJfZm9ybSIuCiogJShhdHRzLW5hbWUpZW1haWxfZm9ybSUg JShhdHRzLXR5cGUpc3RyaW5nJSBTcGVjaWZpZXMgd2hpY2ggZm9ybSBjb250YWlucyB0aGUg ZW1haWwgbWVzc2FnZSB0ZW1wbGF0ZSB0aGF0IHdpbGwgYmUgc2VudCB0byBhIHVzZXIgdXBv biByZWdpc3RlcmluZy4gRGVmYXVsdCBpcyAic2VsZl9yZWdpc3Rlcl9lbWFpbCIuCiogJShh dHRzLW5hbWUpZnJvbSUgJShhdHRzLXR5cGUpc3RyaW5nJSBSZWdpc3RyYXRpb24gZW1haWwn cyBGcm9tIGFkZHJlc3MuIERlZmF1bHRzIHRvIG1lbV9zZWxmX2FkbWluX2VtYWlsIHByZWZl cmVuY2UuCiogJShhdHRzLW5hbWUpcmVwbHklICUoYXR0cy10eXBlKXN0cmluZyUgUmVnaXN0 cmF0aW9uIGVtYWlsJ3MgUmVwbHkgVG8gYWRkcmVzcy4KKiAlKGF0dHMtbmFtZSlzdWJqZWN0 JSAlKGF0dHMtdHlwZSlzdHJpbmclIFN1YmplY3QgZm9yIGVtYWlsLiBEZWZhdWx0IGlzICJb U0lURU5BTUVdIFlvdXIgTG9naW4gSW5mbyIKKiAlKGF0dHMtbmFtZSlsb2dpbl91cmwlICUo YXR0cy10eXBlKXN0cmluZyUgVVJMIHRvIHRoZSBsb2dpbiBwYWdlLiBEZWZhdWx0IGlzIFRl eHBhdHRlcm4gYWRtaW4gaW50ZXJmYWNlLgoKcC4gU3RhcnRlciBUZW1wbGF0ZToKCjxjb2Rl PgoJPGZpZWxkc2V0PgoJPGxlZ2VuZD5SZWdpc3RlcjwvbGVnZW5kPgoJCTx0eHA6bWVtX2Zv cm1fdGV4dCBuYW1lPSJSZWFsTmFtZSIgbGFiZWw9IkZ1bGwgTmFtZSIgLz48YnIgLz4KCQk8 YnIgLz4KCgkJPHR4cDptZW1fZm9ybV90ZXh0IG5hbWU9Im5hbWUiIGxhYmVsPSJVc2VybmFt ZSIgLz48YnIgLz4KCQk8YnIgLz4KCgkJPHR4cDptZW1fZm9ybV9lbWFpbCBuYW1lPSJlbWFp bCIgbGFiZWw9IkUtTWFpbCIgLz48YnIgLz4KCQk8YnIgLz4KCgkJPHR4cDptZW1fZm9ybV9z dWJtaXQgLz4KCTwvZmllbGRzZXQ+CjwvY29kZT4KCnAuIFRlbXBsYXRlIHRhZ3MgdGhhdCBj YW4gYmUgdXNlZCB3aXRoaW4gdGhlIGVtYWlsIHRlbXBsYXRlIGZvcm0uIEluIGFkZGl0aW9u IHRvIHRoZSB0YWdzIGxpc3RlZCBiZWxvdywgYW55IG90aGVyIFRleHRwYXR0ZXJuIHRhZyBj YW4gYmUgdXNlZC4KCiogPGNvZGU+PHR4cDptZW1fbmFtZSAvPjwvY29kZT4gLS0gVGhlIG5h bWUgc3VibWl0dGVkIGJ5IHRoZSB1c2VyLgoqIDxjb2RlPjx0eHA6bWVtX3VzZXJuYW1lIC8+ PC9jb2RlPiAtLSBUaGUgdXNlcm5hbWUgc3VibWl0dGVkIGJ5IHRoZSB1c2VyLgoqIDxjb2Rl Pjx0eHA6bWVtX2VtYWlsIC8+PC9jb2RlPiAtLSBUaGUgZW1haWwgYWRkcmVzcyBzdWJtaXR0 ZWQgYnkgdGhlIHVzZXIuCiogPGNvZGU+PHR4cDptZW1fcGFzc3dvcmQgLz48L2NvZGU+IC0t IFRoZSBwYXNzd29yZCBnZW5lcmF0ZWQgZm9yIHRoZSB1c2VyLgoqIDxjb2RlPjx0eHA6bWVt X3NpdGVuYW1lIC8+PC9jb2RlPiAtLSBUaGUgc2l0ZSBuYW1lIGFzIHNwZWNpZmllZCBpbiB0 aGUgU2l0ZSBDb25maWd1cmF0aW9uIChwcmVmcyB0YWIpLgoqIDxjb2RlPjx0eHA6bWVtX3Np dGV1cmwgLz48L2NvZGU+IC0tIFRoZSB1cmwgdG8gdGhlIGZyb250IHBhZ2Ugb2YgdGhpcyBz aXRlLgoqIDxjb2RlPjx0eHA6bWVtX2xvZ2ludXJsIC8+PC9jb2RlPiAtLSBUaGUgdXJsIHRv IHRoZSBUZXh0cGF0dGVybiBsb2cgaW4gcGFnZS4KKiA8Y29kZT48dHhwOm1lbV9hZG1pbl9u YW1lIC8+PC9jb2RlPiAtLSBUaGUgbmFtZSBvZiB0aGUgYWRtaW5pc3RyYXRpdmUgY29udGFj dC4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaW4gdGhlIGVtYWlsIGZyb20gZmllbGQu CiogPGNvZGU+PHR4cDptZW1fYWRtaW5fZW1haWwgLz48L2NvZGU+IC0tIFRoZSBlbWFpbCBh ZGRyZXNzIG9mIHRoZSBhZG1pbmlzdHJhdGl2ZSBjb250YWN0LiBUaGlzIHdpbGwgYXV0b21h dGljYWxseSBiZSBpbiB0aGUgZW1haWwgZnJvbSBmaWVsZC4KCnAuIFN0YXJ0ZXIgVGVtcGxh dGU6Cgo8Y29kZT4KRGVhciA8dHhwOm1lbV9uYW1lIC8+LAogIFRoYW5rIHlvdSBmb3IgcmVn aXN0ZXJpbmcgZm9yIDx0eHA6bWVtX3NpdGVuYW1lIC8+LiBCZWxvdyBhcmUgeW91IHVzZXIg YWNjb3VudCBkZXRhaWxzLgoKVXNlcm5hbWU6IDx0eHA6bWVtX3VzZXJuYW1lIC8+ClBhc3N3 b3JkOiA8dHhwOm1lbV9wYXNzd29yZCAvPgpTaXRlIFVSTDogPHR4cDptZW1fc2l0ZXVybCAv PgpMb2dpbiBVUkw6IDx0eHA6bWVtX2xvZ2ludXJsIC8+CgpTaW5jZXJlbHksCjx0eHA6bWVt X2FkbWluX25hbWUgLz4KRW1haWw6IDx0eHA6bWVtX2FkbWluX2VtYWlsIC8+CjwvY29kZT4K CgpwLiBFeGFtcGxlOgoKPT08Y29kZT4KPHR4cDptZW1fc2VsZl9yZWdpc3Rlcl9mb3JtIGZy b209ImFkbWluQG15c2l0ZS5jb20iIHN1YmplY3Q9IltNeVNpdGVdIFlvdXIgYWNjb3VudCBp bmZvIiB0aGFua3NfZm9ybT0icmVnaXN0ZXJlZF9mb3JtIj4KCTxmaWVsZHNldD4KCTxsZWdl bmQ+UmVnaXN0ZXI8L2xlZ2VuZD4KCQk8dHhwOm1lbV9mb3JtX3RleHQgbmFtZT0iUmVhbE5h bWUiIGxhYmVsPSJGdWxsIE5hbWUiIC8+PGJyIC8+CgkJPGJyIC8+CgoJCTx0eHA6bWVtX2Zv cm1fdGV4dCBuYW1lPSJuYW1lIiBsYWJlbD0iVXNlcm5hbWUiIC8+PGJyIC8+CgkJPGJyIC8+ CgoJCTx0eHA6bWVtX2Zvcm1fZW1haWwgbmFtZT0iZW1haWwiIGxhYmVsPSJFLU1haWwiIC8+ PGJyIC8+CgkJPGJyIC8+CgoJCTx0eHA6bWVtX2Zvcm1fc3VibWl0IC8+Cgk8L2ZpZWxkc2V0 Pgo8L3R4cDptZW1fc2VsZl9yZWdpc3Rlcl9mb3JtPgo8L2NvZGU+PT0KCjxociAvPgoKCmgz KHRhZyNpZl9zZWxmX3JlZ2lzdGVyZWQpLiBpZl9zZWxmX3JlZ2lzdGVyZWQKCnAodGFnLXN1 bW1hcnkpLiBUaGlzIHdpbGwgb3V0cHV0IHRoZSBjb250ZW50cyBvZiB0aGUgdGFnIGlmIHRo ZSB1c2VyIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZC4gVG8gd29yayBwcm9wZXJseSwg dGhpcyByZXF1aXJlcyBicm93c2VyIGNvb2tpZXMgYWZ0ZXIgdGhlIGluaXRpYWwgZm9ybSBz dWJtaXNzaW9uLiBUaGlzIHRhZyBzdXBwb3J0cyA8Y29kZT48dHhwOmVsc2UgLz48L2NvZGU+ CgpwLiBFeGFtcGxlOgoKPT08Y29kZT4KPHR4cDppZl9zZWxmX3JlZ2lzdGVyZWQ+CllvdSBh bHJlYWR5IGhhdmUgYW4gYWNjb3VudC4KPHR4cDplbHNlIC8+Ci4uLnJlZ2lzdHJhdGlvbiBm b3JtLi4uCjwvdHhwOmlmX3NlbGZfcmVnaXN0ZXJlZD4KPC9jb2RlPj09CgoKaDModGFnI21l bV9zZWxmX2NoYW5nZV9wYXNzd29yZF9mb3JtKS4gbWVtX3NlbGZfY2hhbmdlX3Bhc3N3b3Jk X2Zvcm0KCnAodGFnLXN1bW1hcnkpLiBUaGlzIHRhZyBhbGxvd3MgYSBjaGFuZ2UgcGFzc3dv cmQgZm9ybSB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIHVzZXIgcG9ydGlvbiBvZiB0aGUgd2Vi c2l0ZS4gVGhpcyBpcyBtZWFudCB0byBiZSB1c2VkIHdpdGggdGhlIGlnbl9wYXNzd29yZF9w cm90ZWN0IHBsdWdpbi4gVGhpcyB0YWcgc3VwcG9ydHMgdGhlIHRhZyB0eHA6bWVtX3Byb2Zp bGUgKHNlZSBiZWxvdykuCgoqKGF0dHMpICUoYXR0cy1uYW1lKWZvcm0lICUoYXR0cy10eXBl KXN0cmluZyUgU3BlY2lmaWVzIHdoaWNoIGZvcm0gY29udGFpbnMgdGhlIEhUTUwgZm9ybSB0 ZW1wbGF0ZS4KKiAlKGF0dHMtbmFtZSllbWFpbF9mb3JtJSAlKGF0dHMtdHlwZSlzdHJpbmcl IFNwZWNpZmllcyB3aGljaCBmb3JtIGNvbnRhaW5zIHRoZSBlbWFpbCBtZXNzYWdlIHRlbXBs YXRlIHRoYXQgd2lsbCBiZSBzZW50IHRvIGEgdXNlciB1cG9uIHJlZ2lzdGVyaW5nLgoqICUo YXR0cy1uYW1lKWZyb20lICUoYXR0cy10eXBlKXN0cmluZyUgUmVnaXN0cmF0aW9uIGVtYWls J3MgRnJvbSBhZGRyZXNzLiBEZWZhdWx0cyB0byBtZW1fc2VsZl9hZG1pbl9lbWFpbCBwcmVm ZXJlbmNlLgoqICUoYXR0cy1uYW1lKXJlcGx5JSAlKGF0dHMtdHlwZSlzdHJpbmclIFJlZ2lz dHJhdGlvbiBlbWFpbCdzIFJlcGx5IFRvIGFkZHJlc3MuCiogJShhdHRzLW5hbWUpc3ViamVj dCUgJShhdHRzLXR5cGUpc3RyaW5nJSBTdWJqZWN0IGZvciBlbWFpbC4gRGVmYXVsdCBpcyAi W1NJVEVOQU1FXSBQYXNzd29yZCBDaGFuZ2VkIgoKCmgzKHRhZyNtZW1fc2VsZl91c2VyX2Vk aXRfZm9ybSkuIG1lbV9zZWxmX3VzZXJfZWRpdF9mb3JtCgpwKHRhZy1zdW1tYXJ5KS4gVGhp cyB0YWcgYWxsb3dzIGEgZm9ybSB0byBtb2RpZnkgdXNlciBpbmZvcm1hdGlvbiB0byBiZSBk aXNwbGF5ZWQgb24gdGhlIHVzZXIgcG9ydGlvbiBvZiB0aGUgd2Vic2l0ZS4gVGhpcyBpcyBt ZWFudCB0byBiZSB1c2VkIHdpdGggdGhlIGlnbl9wYXNzd29yZF9wcm90ZWN0IHBsdWdpbi4g VGhpcyB0YWcgc3VwcG9ydHMgdGhlIHRhZyB0eHA6bWVtX3Byb2ZpbGUuCgoKaDModGFnI21l bV9wcm9maWxlKS4gbWVtX3Byb2ZpbGUKCnAodGFnLXN1bW1hcnkpLiBUaGlzIHRhZyB3aWxs IG91dHB1dCB0aGUgdmFsdWVzIG9mIHRoZSB1c2VyJ3MgcHJvZmlsZS4KCnAuIFRhZyBBdHRy aWJ1dGVzOgoKKiAqdmFyKiAtLSBTcGVjaWZpZXMgdGhlIHByb2ZpbGUgdmFsdWUgbmFtZSB0 byBvdXRwdXQuIFN1cHBvcnRlZCB2YWx1ZXMgYXJlICJ1c2VyX2lkIiwgInVzZXIiLCAiUmVh bE5hbWUiLCAiZW1haWwiLCBhbmQgYW55IG90aGVyIGRiIGZpZWxkLgoqICpmb3JtKiAtLSBB IGZvcm0gY29udGFpbmluZyBvdGhlciB0YWdzIHRvIHBhcnNlLgoqICp1c2VyaWQqIC0tIElm IHNwZWNpZmllZCwgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiB1c2Vy X2lkIHdpbGwgYmUgZmV0Y2hlZC4KKiAqdXNlciogLS0gSWYgc3BlY2lmaWVkLCB0aGUgcHJv ZmlsZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHVzZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSB3aWxs IGJlIGZldGNoZWQuCgpwLiBFeGFtcGxlIGZvciBub24gbG9nZ2VkIGluIHVzZXIKPGNvZGU+ PHR4cDptZW1fcHJvZmlsZSB1c2VyPSJqZG9lIj4KCVRoZSBlbWFpbCBhZGRyZXNzIGZvciA8 dHhwOm1lbV9wcm9maWxlIHZhcj0iUmVhbE5hbWUiIC8+IGlzIDx0eHA6bWVtX3Byb2ZpbGUg dmFyPSJlbWFpbCIgLz4uCgk8dHhwOmVsc2UgLz4KCQlJJ20gc29ycnksIGJ1dCB3ZSBkbyBu b3QgaGF2ZSBhIHJlY29yZCBmb3IgdGhpcyB1c2VyLgo8L3R4cDptZW1fcHJvZmlsZT48L2Nv ZGU+CgpwLiBFeGFtcGxlIGZvciBsb2dnZWQgaW4gdXNlcgo8Y29kZT5XZWxjb21lIGJhY2sg PHR4cDptZW1fcHJvZmlsZSB2YXI9IlJlYWxOYW1lIiAvPjwvY29kZT4KCmgzKHRhZyNtZW1f c2VsZl9wYXNzd29yZF9yZXNldF9mb3JtKS4gbWVtX3NlbGZfcGFzc3dvcmRfcmVzZXRfZm9y bQoKcCh0YWctc3VtbWFyeSkuIFRoaXMgdGFnIHdpbGwgYWxsb3cgYSB1c2VyIHRvIHJlcXVl c3QgYSBuZXcgcGFzc3dvcmQgdG8gYmUgc2VudCB0byB0aGVpciBlbWFpbCBhZGRyZXNzLgoK cC4gU3RhcnRlciBUZW1wbGF0ZQo8Y29kZT4KPHR4cDptZW1fc2VsZl9wYXNzd29yZF9yZXNl dF9mb3JtIGZvcm1fbWFpbD0icmVzZXRfcGFzc3dvcmRfZm9ybSI+Cgk8dHhwOm1lbV9mb3Jt X3RleHQgbmFtZT0ibmFtZSIgbGFiZWw9IlVzZXJuYW1lOiIgLz4KCTxiciAvPgoJPHR4cDpt ZW1fZm9ybV90ZXh0IG5hbWU9ImVtYWlsIiBsYWJlbD0iRW1haWwgQWRkcmVzczoiIC8+Cgk8 YnIgLz4KCTx0eHA6bWVtX2Zvcm1fc3VibWl0IG5hbWU9InN1Ym1pdCIgbGFiZWw9IlN1Ym1p dCIgLz4KPC90eHA6bWVtX3NlbGZfcGFzc3dvcmRfcmVzZXRfZm9ybT4KPC9jb2RlPgoKaDMo dGFnI21lbV9zZWxmX3VzZXJfY291bnQpLiBtZW1fc2VsZl91c2VyX2NvdW50CgpwKHRhZy1z dW1tYXJ5KS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHVzZXJzLgoKKihhdHRzKSAlKGF0dHMt bmFtZSl1c2VyX2xldmVscyUgJShhdHRzLXR5cGUpc3RyaW5nJSBDb21tYSBzZXBhcmF0ZWQg bGlzdCBvZiB1c2VyIGxldmVscyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgY291 bnQuIERlZmF1bHQgaXMgYWxsICIwLDEsMiwzLDQsNSw2IgoqICUoYXR0cy1uYW1lKXdyYXB0 YWclICUoYXR0cy10eXBlKXN0cmluZyUgSFRNTCB0YWcgdG8gd3JhcCBhcm91bmQgdGhlIHJl c3VsdC4KKiAlKGF0dHMtbmFtZSljbGFzcyUgJShhdHRzLXR5cGUpc3RyaW5nJSBDU1MgY2xh c3MgbmFtZSBmb3Igd3JhcHRhZy4iO3M6MzoibWQ1IjtzOjMyOiI2YTI3ZjI4NGRkY2JlNzI2 OTg0ZDY0N2Y1MTlmZmM0ZSI7fQ==