diff --git a/modules/duktape-debugger.js b/modules/duktape-debugger.js index 3c1b481..98568a1 100644 --- a/modules/duktape-debugger.js +++ b/modules/duktape-debugger.js @@ -130,7 +130,7 @@ var events = require('events'); var Promise = require('promise'); -var dbgHTML = '77u/PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KPGh0bWw+DQo8aGVhZD4NCjxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPg0KPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1FREdFIiAvPg0KPG1ldGEgbmFtZT0iZm9ybWF0LWRldGVjdGlvbiIgY29udGVudD0idGVsZXBob25lPW5vIiAvPg0KPHRpdGxlPldlYlJUQyBEZWJ1ZzwvdGl0bGU+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KYm9keSANCnsNCiAgICBtYXJnaW46IDA7DQoJcGFkZGluZzogMDsNCglib3JkZXI6IDA7DQoJY29sb3I6IGJsYWNrOw0KCWZvbnQtc2l6ZTogMTNweDsNCglmb250LWZhbWlseTogIlRyZWJ1Y2hldCBNUyIsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQoJYmFja2dyb3VuZC1jb2xvcjogI2QzZDlkNjsNCn0NCiNjb250YWluZXIgew0KCWJhY2tncm91bmQtY29sb3I6ICNmZmY7DQoJd2lkdGg6IDk2MHB4Ow0KCW1hcmdpbjogMCBhdXRvOw0KCWJvcmRlci10b3A6IDA7DQoJYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2I3YjdiNzsNCglib3JkZXItYm90dG9tOiAwOw0KCWJvcmRlci1sZWZ0OiAxcHggc29saWQgI2I3YjdiNzsNCglwYWRkaW5nOiAwOw0KfQ0KI21hc3RoZWFkIHsNCgl3aWR0aDogYXV0bzsNCgltYXJnaW46IDA7DQoJcGFkZGluZzogMDsNCglvdmVyZmxvdzogYXV0bzsNCgl0ZXh0LWFsaWduOiByaWdodDsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMDM2Ow0KCXdpZHRoOiA5NjBweDsNCg0KICAgIGJhY2tncm91bmQ6IHJnYig0NSw4NiwxMzcpOyAvKiBPbGQgYnJvd3NlcnMgKi8NCiAgICBiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCAgcmdiYSg0NSw4NiwxMzcsMSkgMCUsIHJnYmEoMCw1MSwxMDIsMSkgMjklKTsgLyogRkYzLjYrICovDQogICAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCByaWdodCB0b3AsIGNvbG9yLXN0b3AoMCUscmdiYSg0NSw4NiwxMzcsMSkpLCBjb2xvci1zdG9wKDI5JSxyZ2JhKDAsNTEsMTAyLDEpKSk7IC8qIENocm9tZSxTYWZhcmk0KyAqLw0KICAgIGJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsICByZ2JhKDQ1LDg2LDEzNywxKSAwJSxyZ2JhKDAsNTEsMTAyLDEpIDI5JSk7IC8qIENocm9tZTEwKyxTYWZhcmk1LjErICovDQogICAgYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsICByZ2JhKDQ1LDg2LDEzNywxKSAwJSxyZ2JhKDAsNTEsMTAyLDEpIDI5JSk7IC8qIE9wZXJhIDExLjEwKyAqLw0KICAgIGJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgIHJnYmEoNDUsODYsMTM3LDEpIDAlLHJnYmEoMCw1MSwxMDIsMSkgMjklKTsgLyogSUUxMCsgKi8NCiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICByZ2JhKDQ1LDg2LDEzNywxKSAwJSxyZ2JhKDAsNTEsMTAyLDEpIDI5JSk7IC8qIFczQyAqLw0KICAgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KCBzdGFydENvbG9yc3RyPScjMmQ1Njg5JywgZW5kQ29sb3JzdHI9JyMwMDMzNjYnLEdyYWRpZW50VHlwZT0xICk7IC8qIElFNi05ICovDQp9DQojY29sdW1uX2wgew0KCXBvc2l0aW9uOiByZWxhdGl2ZTsNCglmbG9hdDogbGVmdDsNCgl3aWR0aDogOTMwcHg7DQoJbWFyZ2luOiAwOw0KCXBhZGRpbmc6IDAgMTVweDsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KfQ0KI2Zvb3RlciB7DQoJY2xlYXI6IGJvdGg7DQoJb3ZlcmZsb3c6IGF1dG87DQoJd2lkdGg6IDk2MHB4Ow0KCXRleHQtYWxpZ246IGNlbnRlcjsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMTEzOTYyOw0KCXBhZGRpbmctdG9wOiA1cHg7DQoJcGFkZGluZy1ib3R0b206IDVweDsNCn0NCiNmb290ZXIgYSB7DQoJY29sb3I6ICNmZmY7DQoJdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQp9DQojZm9vdGVyIGE6aG92ZXIgew0KCWNvbG9yOiAjZmZmOw0KCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCn0NCmEgew0KCWNvbG9yOiAjMDM2Ow0KCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOw0KfQ0KLnN0eWxlMyB7DQoJdGV4dC1hbGlnbjogY2VudGVyOw0KCWNvbG9yOiB3aGl0ZTsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjODA4MDgwOw0KCWZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KLnN0eWxlNiB7DQogICAgcGFkZGluZy10b3A6IDJweDsNCiAgICBwYWRkaW5nLWJvdHRvbTogMnB4Ow0KCWJhY2tncm91bmQtY29sb3I6ICNDMEMwQzA7DQp9DQoueHNlY3Rpb24gew0KICAgIGJhY2tncm91bmQtY29sb3I6ICNFMEUwRTA7DQogICAgcGFkZGluZzogNXB4IDIwcHggMjVweCAyMHB4Ow0KICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7DQp9DQouZml4ZWRmb250IHsNCiAgICBmb250LWZhbWlseTpjb3VyaWVyLCAiY291cmllciBuZXciLCBtb25vc3BhY2U7DQp9DQouaW5mb2VudHJ5IHsNCiAgICBwYWRkaW5nLXRvcDoxcHg7DQp9DQouR0VORVJJQ19NT0RVTEV7DQogICAgY29sb3I6YmxhY2s7DQp9DQouVkFSUVVFUll7DQogICAgY29sb3I6YmxhY2s7DQp9DQouVkFSUkVTVUxUew0KICAgIGNvbG9yOmRhcmtncmVlbjsNCn0NCi5CUkVBS1BPSU5Uew0KICAgIGNvbG9yOmRhcmt2aW9sZXQNCn0NCi5CUkVBS1BPSU5UOmhvdmVyIA0Kew0KCWJhY2tncm91bmQtY29sb3I6ICNFRUU7DQp9DQouU1RBVEVDSEFOR0V7DQogICAgY29sb3I6ZGFya3Zpb2xldA0KfQ0KLlNPVVJDRUNPREVQQVJFTlQgDQp7DQogICAgd2lkdGg6MTAwMDBweA0KfQ0KLlNPVVJDRUNPREVQQVJFTlQ6aG92ZXIgDQp7DQoJYmFja2dyb3VuZC1jb2xvcjogI0VFRTsNCn0NCi5TT1VSQ0VDT0RFew0KICAgIGNvbG9yOmRhcmtncmVlbjsNCiAgICBwYWRkaW5nLWxlZnQ6MTBweDsNCiAgICBkaXNwbGF5OmlubGluZS1ibG9jazsNCn0NCi5TT1VSQ0VDT0RFTElORQ0Kew0KICAgIHdpZHRoOjMwcHg7DQogICAgdGV4dC1hbGlnbjpyaWdodDsNCiAgICBjb2xvcjpncmF5Ow0KICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrOw0KICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTsNCiAgICAta2h0bWwtdXNlci1zZWxlY3Q6bm9uZTsNCiAgICAtbW96LXVzZXItc2VsZWN0Om5vbmU7DQogICAgLW1zLXVzZXItc2VsZWN0Om5vbmU7DQogICAgLW8tdXNlci1zZWxlY3Q6bm9uZTsNCiAgICAtdXNlci1zZWxlY3Q6bm9uZTsNCn0NCi5DQUxMU1RBQ0sNCnsNCiAgICBjb2xvcjpzYWRkbGVicm93bjsNCiAgICBmb250LXdlaWdodDpub3JtYWw7DQogICAgLXdlYmtpdC11c2VyLXNlbGVjdDpub25lOw0KICAgIC1raHRtbC11c2VyLXNlbGVjdDpub25lOw0KICAgIC1tb3otdXNlci1zZWxlY3Q6bm9uZTsNCiAgICAtbXMtdXNlci1zZWxlY3Q6bm9uZTsNCiAgICAtby11c2VyLXNlbGVjdDpub25lOw0KICAgIC11c2VyLXNlbGVjdDpub25lOw0KfQ0KLkNBTExTVEFDSzpob3Zlcg0Kew0KCWJhY2tncm91bmQtY29sb3I6ICNFRUU7DQp9DQouRVJST1J7DQogICAgY29sb3I6cmVkOw0KfQ0KLlVOS05PV05fTU9EVUxFew0KICAgIGNvbG9yOnJlZDsNCn0NCjwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keSBvbmxvYWQ9ImlmICh0eXBlb2Yoc3RhcnR1cCkgIT09ICd1bmRlZmluZWQnKSBzdGFydHVwKCk7Ij4NCgk8ZGl2IGlkPSJjb250YWluZXIiPg0KCQk8ZGl2IGlkPSJtYXN0aGVhZCIgc3R5bGU9ImhlaWdodDogNjZweDsgd2lkdGg6IDEwMCU7IG92ZXJmbG93OmhpZGRlbiI+DQoJICAgICAgICA8ZGl2IHN0eWxlPSJmbG9hdDpsZWZ0OyBoZWlnaHQ6IDY2cHg7IGNvbG9yOiNjOGM4Yzg7IHBhZGRpbmctbGVmdDoyMHB4OyBwYWRkaW5nLXRvcDo4cHgiPjxzdHJvbmc+PGZvbnQgc3R5bGU9ImZvbnQtc2l6ZTo0NnB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsiPkJ1aWx0LWluIEpTIERlYnVnZ2VyPC9mb250Pjwvc3Ryb25nPjwvZGl2Pg0KCSAgICAgICAgPGRpdiBzdHlsZT0iZmxvYXQ6bGVmdDsgaGVpZ2h0OiA2NnB4OyBjb2xvcjojYzhjOGM4OyBwYWRkaW5nLWxlZnQ6NXB4OyBwYWRkaW5nLXRvcDoxNHB4Ij48c3Ryb25nPjxmb250IHN0eWxlPSJmb250LXNpemU6MTRweDsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ij48c3BhbiBpZD0idGl0bGVob3N0Ij48L3NwYW4+PC9mb250Pjwvc3Ryb25nPjwvZGl2Pg0KCQk8L2Rpdj4NCgkJPGRpdiBpZD0idG9wYmFyIj4NCgkJCTx0YWJsZSBzdHlsZT0id2lkdGg6IDEwMCU7IGhlaWdodDogMjJweDsiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9InN0eWxlMSI+DQoJCQkJPHRyPg0KCQkJCQk8dGQgaWQ9IkF0dGFjaEJ1dHRvbiIgc3R5bGU9IndpZHRoOiAxMDBweDsgaGVpZ2h0OiAyNHB4OyBjdXJzb3I6ZGVmYXVsdDsiIG9uY2xpY2s9ImF0dGFjaERlYnVnZ2VyKCkiIGNsYXNzPSJzdHlsZTMiPkFUVEFDSDwvdGQ+DQoJCQkJCTx0ZCBpZD0iUGF1c2VSZXN1bWVCdXR0b24iIHN0eWxlPSJ3aWR0aDogMTAwcHg7IGhlaWdodDogMjRweDsgY3Vyc29yOmRlZmF1bHQ7IiBvbmNsaWNrPSJwYXVzZVJlc3VtZSgpIiBjbGFzcz0ic3R5bGUzIj5QQVVTRTwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDx0ZCBpZD0iU3RlcE92ZXJCdXR0b24iIHN0eWxlPSJ3aWR0aDogMTAwcHg7IGhlaWdodDogMjRweDsgY3Vyc29yOmRlZmF1bHQ7IiBvbmNsaWNrPSJzdGVwT3ZlcigpIiBjbGFzcz0ic3R5bGUzIj5TdGVwLU92ZXI8L3RkPg0KICAgICAgICAgICAgICAgICAgICA8dGQgaWQ9IlN0ZXBJbnRvQnV0dG9uIiBzdHlsZT0id2lkdGg6IDEwMHB4OyBoZWlnaHQ6IDI0cHg7IGN1cnNvcjpkZWZhdWx0OyIgb25jbGljaz0ic3RlcEludG8oKSIgY2xhc3M9InN0eWxlMyI+U3RlcC1JbnRvPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPHRkIGlkPSJTdGVwT3V0QnV0dG9uIiBzdHlsZT0id2lkdGg6IDEwMHB4OyBoZWlnaHQ6IDI0cHg7IGN1cnNvcjpkZWZhdWx0OyIgb25jbGljaz0ic3RlcE91dCgpIiBjbGFzcz0ic3R5bGUzIj5TdGVwLU91dDwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDwhLS08dGQgaWQ9IkhlYXBCdXR0b24iIHN0eWxlPSJ3aWR0aDogMTAwcHg7IGhlaWdodDogMjRweDsgY3Vyc29yOmRlZmF1bHQ7IiBvbmNsaWNrPSJvbkR1bXBIZWFwKCkiIGNsYXNzPSJzdHlsZTMiPlZpZXcgSGVhcDwvdGQ+IC0tPg0KCQkJCTwvdHI+DQoJCQk8L3RhYmxlPg0KICAgICAgICAgICAgPGRpdiBpZD0iY29sdW1uX2wiPg0KICAgICAgICAgICAgICAgIDxkaXYgaWQ9InN0YXR1c3RleHQiIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJoZWlnaHQ6MjBweDsgZm9udC1zaXplOjE1cHgiPg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQoJCTwvZGl2Pg0KCQk8ZGl2IGlkPSJwYWdlX2NvbnRlbnQiPg0KICAgICAgICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDc1JTsgZmxvYXQ6bGVmdCI+DQogICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2FsbHN0YWNrV2luZG93IiBzdHlsZT0id2lkdGg6IDEwMCU7aGVpZ2h0OjEwMHB4O292ZXJmbG93LXk6c2Nyb2xsIj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4JDQogICAgICAgICAgICAgICAgPGRpdiBpZD0iTG9nV2luZG93IiBzdHlsZT0id2lkdGg6IDEwMCU7aGVpZ2h0OjUwMHB4O292ZXJmbG93LXk6c2Nyb2xsIj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4JDQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiAyNSU7IGZsb2F0OnJpZ2h0Ij4NCiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJMb2dXaW5kb3cyIiBzdHlsZT0id2lkdGg6IDEwMCU7aGVpZ2h0OjYwMHB4O292ZXJmbG93LXk6c2Nyb2xsIj4NCiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJsb2FkU291cmNlVGV4dCIgZGlzYWJsZWQgc3R5bGU9IndpZHRoOjk1JTtoZWlnaHQ6MzBweCI+PC90ZXh0YXJlYT4NCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJsb2FkU291cmNlQnV0dG9uIiB0eXBlPSJidXR0b24iIHZhbHVlPSJMb2FkIFNvdXJjZSIgZGlzYWJsZWQgb25jbGljaz0ibWFudWFsbHlMb2FkU291cmNlKCkiIC8+DQogICAgICAgICAgICAgICAgICAgIDxwLz4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nR0VORVJJQ19NT0RVTEUnPkJyZWFrcG9pbnRzPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkN1cnJlbnRCcmVha3BvaW50cyIgc3R5bGU9IndpZHRoOiA5NSU7aGVpZ2h0OjIwMHB4O292ZXJmbG93LXk6c2Nyb2xsIj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iZGVsQnJlYWtwb2ludEJ1dHRvbiIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iRGVsIEJyZWFrcG9pbnQiIGRpc2FibGVkIG9uY2xpY2s9ImRlbEJyZWFrcG9pbnQoKSIgLz4NCiAgICAgICAgICAgICAgICAgICAgPHAgLz4NCiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJxdWVyeVRleHQiIGRpc2FibGVkIHN0eWxlPSJ3aWR0aDo5NSU7aGVpZ2h0OjE1cHgiPjwvdGV4dGFyZWE+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0icXVlcnlCdXR0b24iIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IlF1ZXJ5IiBkaXNhYmxlZCBvbmNsaWNrPSJxdWVyeVZhbCgpIiAvPg0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9ImV2YWxCdXR0b24iIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IkV2YWwiIGRpc2FibGVkIG9uY2xpY2s9ImV2YWxTdHJpbmcoKSIgLz4NCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJjbGVhckJ1dHRvbiIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iQ2xlYXIiIGRpc2FibGVkIG9uY2xpY2s9ImNsZWFyUXVlcnkoKSIgLz4NCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJsb2NhbHNCdXR0b24iIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IkxvY2FscyIgZGlzYWJsZWQgb25jbGljaz0ibG9jYWxzUXVlcnkoKSIgLz4NCiAgICAgICAgICAgICAgICAgICAgPHAgLz4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nR0VORVJJQ19NT0RVTEUnPlJlc3VsdHM8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0icXVlcnlSZXN1bHRzIiBzdHlsZT0id2lkdGg6IDk1JTtoZWlnaHQ6MjAwcHg7b3ZlcmZsb3cteTpzY3JvbGwiPg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4JDQoNCiAgICAgICAgICAgICAgICA8L2Rpdj4JDQogICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgPGRpdiBpZD0iZm9vdGVyIj4NCiAgICAgICAgICAgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIxMCIgc3R5bGU9IndpZHRoOiAxMDAlIj4NCiAgICAgICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGlkPSd4Zm9vdGVyJyBzdHlsZT0idGV4dC1hbGlnbjpsZWZ0OyBkaXNwbGF5Om5vbmUiPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO2NvbG9yOmxpZ2h0Z3JheSI+VG90YWwgTWVtb3J5IEFsbG9jYXRpb246IDxiIGlkPSJtZW11c2FnZSIgc3R5bGU9ImNvbG9yOnllbGxvdyI+PC9iPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IGlkPSJnY0J1dHRvbiIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iR0MiIG9uY2xpY2s9ImZvcmNlR0MoKSIgLz48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICA8L3RhYmxlPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgPC9kaXY+DQoNCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DSAgICAgICAgdmFyIGJyZWFrcG9pbnRJRCA9IDA7DSAgICAgICAgdmFyIHNlbGVjdGVkQnJlYWtwb2ludCA9ICIiOw0gICAgICAgIHZhciB3c29ja2V0Ow0gICAgICAgIHZhciBjb25uZWN0ZWQgPSBmYWxzZTsNICAgICAgICB2YXIgY3VycmVudExpbmUgPSAwOw0gICAgICAgIHZhciBjdXJyZW50TW9kdWxlID0gJyc7DSAgICAgICAgdmFyIGN1cnJlbnRNb2R1bGVUb2tlbnMgPSBudWxsOw0gICAgICAgIHZhciBzb3VyY2VIaWdobGlnaHQgPSAneWVsbG93JzsNICAgICAgICB2YXIgZXhjZXB0aW9uSGlnaGxpZ2h0ID0gJ2RlZXBwaW5rJzsNICAgICAgICB2YXIgYnBDb2xvciA9ICdibHVlJzsNICAgICAgICB2YXIgZXhjZXB0aW9uTWVzc2FnZSA9IG51bGw7DSAgICAgICAgdmFyIGhpZ2hsaWdodCA9IHNvdXJjZUhpZ2hsaWdodDsNICAgICAgICB2YXIgY2FsbHN0YWNrX3Njb3BlID0gJ3JveWFsYmx1ZSc7DSAgICAgICAgdmFyIGNhbGxzdGFja19kZWZhdWx0ID0gJ3NhZGRsZWJyb3duJzsNICAgICAgICB2YXIgY3VycmVudENhbGxzdGFjayA9IFtdOw0gICAgICAgIHZhciBpc05hdGl2ZSA9IGZhbHNlOw0NICAgICAgICBmdW5jdGlvbiBRKHgpIHsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHgpOyB9IC8vICJRIg0KICAgICAgICBmdW5jdGlvbiBRQyh4LCB5KSB7IFFTKHgpWyJjdXJzb3IiXSA9IHk7fQ0KICAgICAgICBmdW5jdGlvbiBRUyh4KSB7IHJldHVybiBRKHgpLnN0eWxlOyB9ICAgICAgICAgICAgICAgIC8vICJRIiBzdHlsZQ0KICAgICAgICBmdW5jdGlvbiBRRSh4LCB5KSB7IFEoeCkuZGlzYWJsZWQgPSAheTsgfSAgICAgICAgICAgIC8vICJRIiBlbmFibGUNCiAgICAgICAgZnVuY3Rpb24gUVYoeCwgeSkgeyBRUyh4KS5kaXNwbGF5ID0gKHkgPyAnJyA6ICdub25lJyk7IH0gLy8gIlEiIHZpc2libGUNCiAgICAgICAgZnVuY3Rpb24gUUEoeCwgeSkgeyBRKHgpLmlubmVySFRNTCArPSB5OyB9ICAgICAgICAgICAvLyAiUSIgYXBwZW5kDQogICAgICAgIGZ1bmN0aW9uIFFIKHgsIHkpIHsgUSh4KS5pbm5lckhUTUwgPSB5OyB9ICAgICAgICAgICAgLy8gIlEiIGh0bWwNCiAgICAgICAgZnVuY3Rpb24gUUhWQUwoeCkgeyByZXR1cm4gKFEoeCkuaW5uZXJIVE1MKTsgfQ0KICAgICAgICBmdW5jdGlvbiBRVkFMKHgsIHkpIHsgaWYgKHkgPT0gdW5kZWZpbmVkKSB7IHJldHVybiAoUSh4KS52YWx1ZSk7IH0gZWxzZSB7IFEoeCkudmFsdWUgPSB5OyB9IH0NCiAgICAgICAgZnVuY3Rpb24gUUJDKHgsIHkpIHsgUVMoeClbImJhY2tncm91bmQtY29sb3IiXSA9IHk7IH0NCiAgICAgICAgZnVuY3Rpb24gUUNISUxEUkVOKHgpIHsgcmV0dXJuIChRKHgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdkaXYnKSk7IH0NDSAgICAgICAgZnVuY3Rpb24gSW50MzJUb1N0cih2KSB7IHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKCh2ID4+IDI0KSAmIDB4RkYsICh2ID4+IDE2KSAmIDB4RkYsICh2ID4+IDgpICYgMHhGRiwgdiAmIDB4RkYpOyB9DQogICAgICAgIGZ1bmN0aW9uIEludDE2VG9TdHIodikgeyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgodiA+PiA4KSAmIDB4RkYsIHYgJiAweEZGKTsgfQ0KICAgICAgICBmdW5jdGlvbiBSZWFkU2hvcnQoZGF0YSwgcHRyKSB7IHJldHVybiAoZGF0YS5jaGFyQ29kZUF0KHB0cikgPDwgOCkgKyBkYXRhLmNoYXJDb2RlQXQocHRyICsgMSk7IH0NCiAgICAgICAgZnVuY3Rpb24gUmVhZEludChkYXRhLCBwdHIpIHsgcmV0dXJuIChkYXRhLmNoYXJDb2RlQXQocHRyKSAqIDE2Nzc3MjE2KSArIChkYXRhLmNoYXJDb2RlQXQocHRyICsgMSkgKiA2NTUzNikgKyAoZGF0YS5jaGFyQ29kZUF0KHB0ciArIDIpICogMjU2KSArIGRhdGEuY2hhckNvZGVBdChwdHIgKyAzKTsgfQ0KICAgICAgICBmdW5jdGlvbiBSZWFkTG9uZyhkYXRhLCBwdHIpIHsgcmV0dXJuICgoZGF0YS5jaGFyQ29kZUF0KHB0cikgKiA3MjA1NzU5NDAzNzkyNzkzNikgKyAoZGF0YS5jaGFyQ29kZUF0KHB0ciArIDEpICogMjgxNDc0OTc2NzEwNjU2KSArIChkYXRhLmNoYXJDb2RlQXQocHRyICsgMikgKiAxMDk5NTExNjI3Nzc2KSArIChkYXRhLmNoYXJDb2RlQXQocHRyICsgMykgKiA0Mjk0OTY3Mjk2KSArIGRhdGEuY2hhckNvZGVBdChwdHIgKyA0KSAqIDE2Nzc3MjE2KSArIChkYXRhLmNoYXJDb2RlQXQocHRyICsgNSkgKiA2NTUzNikgKyAoZGF0YS5jaGFyQ29kZUF0KHB0ciArIDYpICogMjU2KSArIGRhdGEuY2hhckNvZGVBdChwdHIgKyA3KTsgfQ0KDSAgICAgICAgZnVuY3Rpb24gU2VuZENvbW1hbmQoY21kLCBkYXRhKQ0KICAgICAgICB7DQogICAgICAgICAgICB3c29ja2V0LnNlbmQoSW50MTZUb1N0cihjbWQpICsgZGF0YSk7DQogICAgICAgIH0NDSAgICAgICAgZnVuY3Rpb24gQWRkTG9nKGNvZGUsIG1zZykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGRjbGFzcyA9ICIiOw0KICAgICAgICAgICAgaWYgKG1zZyA9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICBRQSgiTG9nV2luZG93IiwgIjxkaXYgY2xhc3M9J0dFTkVSSUNfTU9EVUxFJyA+ICIgKyBjb2RlICsgIjwvYnI+PC9kaXY+Iik7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBkY2xhc3MgPSBjb2RlOw0KDQogICAgICAgICAgICBRQSgiTG9nV2luZG93IiwgIjxkaXYgY2xhc3M9JyIgKyBkY2xhc3MgKyAiJyA+ICIgKyBtc2cgKyAiPC9icj48L2Rpdj4iKTsNCiAgICAgICAgfQ0gICAgICAgIGZ1bmN0aW9uIHN0YXJ0dXAoKQ0KICAgICAgICB7DQogICAgICAgICAgICBkaXNwbGF5U3RhdHVzKCJFc3RhYmxpc2hpbmcgY29ubmVjdGlvbi4uLiIpOyAgICAgICAgICANCiAgICAgICAgICAgIHdzb2NrZXQgPSBuZXcgV2ViU29ja2V0KCJ3czovLyIgKyB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgKyAiOiIgKyB3aW5kb3cubG9jYXRpb24ucG9ydCArICIvIik7DQogICAgICAgICAgICB3c29ja2V0LmJpbmFyeVR5cGUgPSAiYXJyYXlidWZmZXIiOw0KICAgICAgICAgICAgd3NvY2tldC5vbm9wZW4gPSBmdW5jdGlvbiAoZXZ0KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IHRydWU7IGRpc3BsYXlTdGF0dXMoIkRlYnVnIENsaWVudCBDb25uZWN0ZWQuLi4iKTsNCiAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiQXR0YWNoQnV0dG9uIiksIDEpOw0KICAgICAgICAgICAgICAgIGF0dGFjaERlYnVnZ2VyKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB3c29ja2V0Lm9uY2xvc2UgPSBmdW5jdGlvbiAoZXZ0KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IGZhbHNlOyBkaXNwbGF5U3RhdHVzKCJEZWJ1ZyBDbGllbnQgQ29ubmVjdGlvbiBsb3N0Li4uIFJldHJ5aW5nLi4uIik7DQogICAgICAgICAgICAgICAgdG9nZ2xlQ29sb3IoUVMoIkF0dGFjaEJ1dHRvbiIpLCAwKTsNCiAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiU3RlcE92ZXJCdXR0b24iKSwgMCk7DQogICAgICAgICAgICAgICAgdG9nZ2xlQ29sb3IoUVMoIlN0ZXBJbnRvQnV0dG9uIiksIDApOw0KICAgICAgICAgICAgICAgIHRvZ2dsZUNvbG9yKFFTKCJTdGVwT3V0QnV0dG9uIiksIDApOw0KICAgICAgICAgICAgICAgIHRvZ2dsZUNvbG9yKFFTKCJQYXVzZVJlc3VtZUJ1dHRvbiIpLCAwKTsNCiAgICAgICAgICAgICAgICBRRSgibG9hZFNvdXJjZUJ1dHRvbiIsIDApOw0KICAgICAgICAgICAgICAgIFFFKCJsb2FkU291cmNlVGV4dCIsIDApOw0KICAgICAgICAgICAgICAgIFFFKCdxdWVyeUJ1dHRvbicsIDApOw0KICAgICAgICAgICAgICAgIFFFKCdjbGVhckJ1dHRvbicsIDApOw0KICAgICAgICAgICAgICAgIFFFKCdsb2NhbHNCdXR0b24nLCAwKTsNCiAgICAgICAgICAgICAgICBRRSgnZXZhbEJ1dHRvbicsIDApOw0KICAgICAgICAgICAgICAgIFFWKCdwYWdlX2NvbnRlbnQnLCBmYWxzZSk7DQogICAgICAgICAgICAgICAgc2V0VGltZW91dChzZXJ2ZXJQb2xsLCAxMDAwKTsNCiAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlID0gJyc7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB3c29ja2V0Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChldnQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIG1zZyA9IEpTT04ucGFyc2UoZXZ0LmRhdGEpOw0KDQogICAgICAgICAgICAgICAgc3dpdGNoKG1zZy5jbWQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICdNRU1PUlknOg0KICAgICAgICAgICAgICAgICAgICAgICAgUUgoJ21lbXVzYWdlJywgTWF0aC5yb3VuZChtc2cudG90YWwvMTAyNCkgKyAnIGtiJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnQVRUQUNIJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTdGF0dXMoJ0F0dGFjaGVkLi4uJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBRSCgiQXR0YWNoQnV0dG9uIiwgIkRFVEFDSCIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlQ29sb3IoUVMoIlBhdXNlUmVzdW1lQnV0dG9uIiksIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgUUUoImxvYWRTb3VyY2VCdXR0b24iLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFFFKCJsb2FkU291cmNlVGV4dCIsIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgUVYoJ3BhZ2VfY29udGVudCcsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ1BBVVNFJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlzTmF0aXZlID0gbXNnLm5hdGl2ZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpZ2hsaWdodCA9PSBleGNlcHRpb25IaWdobGlnaHQpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgUUgoJ3N0YXR1c3RleHQnLCAnPGRpdiBjbGFzcz0iU1RBVEVDSEFOR0UiPicgKyBleGNlcHRpb25NZXNzYWdlICsgJyBpbiAnICsgbXNnLmZpbGUgKyAnOicgKyBtc2cubGluZSArICc8L2Rpdj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXNnLm5hdGl2ZSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFIKCdzdGF0dXN0ZXh0JywgJzxkaXYgY2xhc3M9IlNUQVRFQ0hBTkdFIj5QQVVTRUQgaW4gW05BVElWRSBDT0RFXTwvZGl2PicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRSCgnTG9nV2luZG93JywgJycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRSCgnc3RhdHVzdGV4dCcsICc8ZGl2IGNsYXNzPSJTVEFURUNIQU5HRSI+UEFVU0VEIGluICcgKyBtc2cuZmlsZSArICc6JyArIG1zZy5saW5lICsgJzwvZGl2PicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlQ29sb3IoUVMoIlN0ZXBPdmVyQnV0dG9uIiksIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlQ29sb3IoUVMoIlN0ZXBJbnRvQnV0dG9uIiksIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlQ29sb3IoUVMoIlN0ZXBPdXRCdXR0b24iKSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBRSCgiUGF1c2VSZXN1bWVCdXR0b24iLCAiUkVTVU1FIik7DQogICAgICAgICAgICAgICAgICAgICAgICBRRSgncXVlcnlUZXh0JywgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBRRSgncXVlcnlCdXR0b24nLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFFFKCdjbGVhckJ1dHRvbicsIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgUUUoJ2xvY2Fsc0J1dHRvbicsIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgUUUoJ2V2YWxCdXR0b24nLCAxKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5maWxlID09IGN1cnJlbnRNb2R1bGUpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgUUJDKHNvdXJjZUxpbmVEaXYobXNnLmxpbmUpLCBoaWdobGlnaHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gbXNnLmxpbmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgUShzb3VyY2VMaW5lRGl2KGN1cnJlbnRMaW5lKSkuc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiAnY2VudGVyJ30pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gbXNnLmxpbmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpqID0geyBjbWQ6ICdTT1VSQ0UnLCBuYW1lOiBtc2cuZmlsZSB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShqaikpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ1JVTk5JTkcnOg0KICAgICAgICAgICAgICAgICAgICAgICAgUUgoJ3N0YXR1c3RleHQnLCAnPGRpdiBjbGFzcz0iU1RBVEVDSEFOR0UiPlJVTk5JTkcgJyArIG1zZy5maWxlICsgJzwvZGl2PicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgUUgoIlBhdXNlUmVzdW1lQnV0dG9uIiwgIlBBVVNFIik7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiU3RlcE92ZXJCdXR0b24iKSwgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiU3RlcEludG9CdXR0b24iKSwgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiU3RlcE91dEJ1dHRvbiIpLCAwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFFFKCdxdWVyeVRleHQnLCAwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFFFKCdxdWVyeUJ1dHRvbicsIDApOw0KICAgICAgICAgICAgICAgICAgICAgICAgUUUoJ2NsZWFyQnV0dG9uJywgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICBRRSgnbG9jYWxzQnV0dG9uJywgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICBRRSgnZXZhbEJ1dHRvbicsIDApOw0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdUSFJPVyc6DQogICAgICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHQgPSBleGNlcHRpb25IaWdobGlnaHQ7DQogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25NZXNzYWdlID0gJyoqICcgKyBtc2cubXNnICsgJyAqKic7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnREVUQUNIJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTdGF0dXMoIkRlYnVnZ2VyIERldGFjaGVkLi4uIik7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiUGF1c2VSZXN1bWVCdXR0b24iKSwgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICBRSCgiQXR0YWNoQnV0dG9uIiwgIkFUVEFDSCIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiU3RlcE92ZXJCdXR0b24iKSwgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiU3RlcEludG9CdXR0b24iKSwgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiU3RlcE91dEJ1dHRvbiIpLCAwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFFFKCJsb2FkU291cmNlQnV0dG9uIiwgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICBRRSgibG9hZFNvdXJjZVRleHQiLCAwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFFFKCdxdWVyeVRleHQnLCAwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFFFKCdxdWVyeUJ1dHRvbicsIDApOw0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1vZHVsZSA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ1FVRVJZJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIFFBKCJxdWVyeVJlc3VsdHMiLCAnPGRpdiBjbGFzcz0iVkFSUVVFUlkiPicgKyBtc2cudmFyICsgJz08L2Rpdj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFFBKCJxdWVyeVJlc3VsdHMiLCAnPGRpdiBjbGFzcz0iVkFSUkVTVUxUIj4gICAnICsgbXNnLnZhbCArICc8L2Rpdj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdFVkFMJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIFFBKCJxdWVyeVJlc3VsdHMiLCAnPGRpdiBjbGFzcz0iVkFSUVVFUlkiPicgKyBtc2cuZXZhbCArICc9PC9kaXY+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICBRQSgicXVlcnlSZXN1bHRzIiwgJzxkaXYgY2xhc3M9IlZBUlJFU1VMVCI+ICAgJyArIG1zZy52YWwgKyAnPC9kaXY+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnU09VUkNFJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb2R1bGUgPSBtc2cubmFtZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb2R1bGVUb2tlbnMgPSBtc2cuc291cmNlLnNwbGl0KCdccicpLmpvaW4oJycpLnNwbGl0KCcgJykuam9pbignJm5ic3A7Jykuc3BsaXQoJ1x0Jykuam9pbignJm5ic3A7Jm5ic3A7Jm5ic3A7Jykuc3BsaXQoJ1xuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBRSCgnTG9nV2luZG93JywgJycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmVzID0gW107DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnRNb2R1bGVUb2tlbnMubGVuZ3RoOysraSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCc8ZGl2IGNsYXNzPSJTT1VSQ0VDT0RFUEFSRU5UIiBvbmRibGNsaWNrPSJvblRvZ2dsZUJyZWFrcG9pbnQoJyArIChpKzEpICsgJykiPicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJzxkaXYgY2xhc3M9IlNPVVJDRUNPREVMSU5FIiBpZD0iTCcgKyBzb3VyY2VMaW5lRGl2KGkgKyAxKSArICciPicgKyAoaSArIDEpICsgJzwvZGl2PicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJzxkaXYgY2xhc3M9IlNPVVJDRUNPREUiIGlkPSInICsgc291cmNlTGluZURpdihpICsgMSkgKyAnIj48Y29kZSBzdHlsZT0id2hpdGUtc3BhY2U6bm9ybWFsIj4nICsgY3VycmVudE1vZHVsZVRva2Vuc1tpXSArICc8L2NvZGU+PC9kaXY+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaCgnPC9kaXY+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbGluZSA9IGdldFNvdXJjZUxpbmUoKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgUUEoJ0xvZ1dpbmRvdycsIGxpbmVzLmpvaW4oJycpKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaW5lID49IDApDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgUUJDKHNvdXJjZUxpbmVEaXYoY2xpbmUpLCBoaWdobGlnaHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFEoc291cmNlTGluZURpdihjbGluZSkpLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdjZW50ZXInIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFEoJ0wnICsgc291cmNlTGluZURpdihjbGluZSkpLnNjcm9sbEludG9WaWV3KHsgaW5saW5lOiAnc3RhcnQnIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGl2cyA9IFFDSElMRFJFTigiQ3VycmVudEJyZWFrcG9pbnRzIik7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGRpdnMpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY3VycmVudE1vZHVsZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcuanMnKSB8fCBjdXJyZW50TW9kdWxlID09ICc8PE5BVElWRT4+JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRpdnNbaV0uaWQuc3RhcnRzV2l0aCgnX2JwX18nKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUJDKCdMJyArIHNvdXJjZUxpbmVEaXYoZGl2c1tpXS5pZC5zbGljZSg1KSksIGJwQ29sb3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXZzW2ldLmlkLnN0YXJ0c1dpdGgoJ19icF8nICsgY3VycmVudE1vZHVsZSArICdfJykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFCQygnTCcgKyBzb3VyY2VMaW5lRGl2KGRpdnNbaV0uaWQuc2xpY2UoNSArIGN1cnJlbnRNb2R1bGUubGVuZ3RoKSksIGJwQ29sb3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ0JSRUFLUE9JTlQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1zID0gW107DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIG1zZy5saXN0KQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IG1zZy5saXN0W2ldLmZpbGVOYW1lOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmbi50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcuanMnKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gJ19icF9fJyArIG1zZy5saXN0W2ldLmxpbmVOdW1iZXI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goJzxkaXYgaWQ9IicgKyBpZCArICciIGNsYXNzPSJCUkVBS1BPSU5UIiBvbmNsaWNrPSJvbkJyZWFrcG9pbnRDbGljayhcJycgKyBpZCArICdcJykiPjonICsgbXNnLmxpc3RbaV0ubGluZU51bWJlciArICc8L2Rpdj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSAnX2JwXycgKyBtc2cubGlzdFtpXS5maWxlTmFtZSArICdfJyArIG1zZy5saXN0W2ldLmxpbmVOdW1iZXI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goJzxkaXYgaWQ9IicgKyBpZCArICciIGNsYXNzPSJCUkVBS1BPSU5UIiBvbmNsaWNrPSJvbkJyZWFrcG9pbnRDbGljayhcJycgKyBpZCArICdcJykiPicgKyBtc2cubGlzdFtpXS5maWxlTmFtZSArICc6JyArIG1zZy5saXN0W2ldLmxpbmVOdW1iZXIgKyAnPC9kaXY+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgUUgoIkN1cnJlbnRCcmVha3BvaW50cyIsIGl0ZW1zLmpvaW4oJycpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdDQUxMU1RBQ0snOg0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENhbGxzdGFjayA9IG1zZy5jYWxsc3RhY2s7DQogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Q2FsbHN0YWNrKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdMT0NBTFMnOg0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdiBpbiBtc2cudmFsKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2cudmFsW3ZdLnR5cGUgPT0gJ3VuZGVmaW5lZCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQSgicXVlcnlSZXN1bHRzIiwgJzxkaXYgY2xhc3M9IlZBUlFVRVJZIj4nICsgbXNnLnZhbFt2XS5rZXkgKyAnPTwvZGl2PicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c29ja2V0LnNlbmQoJ3siY21kIjogIlFVRVJZIiwgInZhciI6ICInICsgbXNnLnZhbFt2XS5rZXkgKyAnIiwgImxldmVsIjogJyArIGdldENhbGxzdGFja0xldmVsKCkgKyAnfScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0NICAgICAgICBmdW5jdGlvbiBnZXRTb3VyY2VMaW5lKCkNICAgICAgICB7DSAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBjdXJyZW50Q2FsbHN0YWNrLmxlbmd0aDsgKytpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmIChRUygnX3N0YWNrXycgKyBpKS5jb2xvciA9PSBjYWxsc3RhY2tfc2NvcGUgJiYgY3VycmVudENhbGxzdGFja1tpXS5maWxlTmFtZSA9PSBjdXJyZW50TW9kdWxlKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjdXJyZW50Q2FsbHN0YWNrW2ldLmxpbmVOdW1iZXIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAoLTEpOw0KICAgICAgICB9DQ0gICAgICAgIGZ1bmN0aW9uIHRvZ2dsZUNvbG9yKGlzdHlsZSwgc3RhdGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlzdHlsZVsiYmFja2dyb3VuZC1jb2xvciJdID0gc3RhdGUgPyAnYmx1ZScgOiAnZ3JleSc7DQogICAgICAgICAgICBpc3R5bGVbImN1cnNvciJdID0gc3RhdGUgPyAncG9pbnRlcicgOiAnZGVmYXVsdCc7DQogICAgICAgIH0NDSAgICAgICAgZnVuY3Rpb24gYXR0YWNoRGVidWdnZXIoKQ0KICAgICAgICB7DQogICAgICAgICAgICBzd2l0Y2goUSgiQXR0YWNoQnV0dG9uIikuaW5uZXJIVE1MKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNhc2UgJ0FUVEFDSCc6DQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTdGF0dXMoIkF0dGFjaGluZyBkZWJ1Z2dlci4uLiIpOw0KICAgICAgICAgICAgICAgICAgICB3c29ja2V0LnNlbmQoJ3siY21kIjogIkFUVEFDSCJ9Jyk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ0RFVEFDSCc6DQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDYWxsc3RhY2sgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheUNhbGxzdGFjaygpOw0KDQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTdGF0dXMoIkRldGFjaGluZyBkZWJ1Z2dlci4uLiIpOw0KICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlID0gJyc7DQogICAgICAgICAgICAgICAgICAgIHdzb2NrZXQuc2VuZCgneyJjbWQiOiAiREVUQUNIIn0nKTsNCiAgICAgICAgICAgICAgICAgICAgUVYoJ3BhZ2VfY29udGVudCcsIGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NICAgICAgICBmdW5jdGlvbiBwYXVzZVJlc3VtZSgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHN3aXRjaChRKCJQYXVzZVJlc3VtZUJ1dHRvbiIpLmlubmVySFRNTCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICdQQVVTRSc6DQogICAgICAgICAgICAgICAgICAgIHdzb2NrZXQuc2VuZCgneyJjbWQiOiAiUEFVU0UifScpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdSRVNVTUUnOg0KICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHQgPSBzb3VyY2VIaWdobGlnaHQ7DQogICAgICAgICAgICAgICAgICAgIHdzb2NrZXQuc2VuZCgneyJjbWQiOiAiUkVTVU1FIn0nKTsNCiAgICAgICAgICAgICAgICAgICAgUUJDKHNvdXJjZUxpbmVEaXYoY3VycmVudExpbmUpLCAnd2hpdGUnKTsNCg0KICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2FsbHN0YWNrID0gW107DQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXlDYWxsc3RhY2soKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NICAgICAgICBmdW5jdGlvbiBzdGVwT3ZlcigpDQogICAgICAgIHsNCiAgICAgICAgICAgIGhpZ2hsaWdodCA9IHNvdXJjZUhpZ2hsaWdodDsNCiAgICAgICAgICAgIFFCQyhzb3VyY2VMaW5lRGl2KGN1cnJlbnRMaW5lKSwgJ3doaXRlJyk7DQogICAgICAgICAgICB3c29ja2V0LnNlbmQoJ3siY21kIjogIlNURVBPVkVSIn0nKTsNCiAgICAgICAgfQ0gICAgICAgIGZ1bmN0aW9uIHN0ZXBJbnRvKCkNICAgICAgICB7DQogICAgICAgICAgICBoaWdobGlnaHQgPSBzb3VyY2VIaWdobGlnaHQ7DQogICAgICAgICAgICBRQkMoc291cmNlTGluZURpdihjdXJyZW50TGluZSksICd3aGl0ZScpOw0KICAgICAgICAgICAgd3NvY2tldC5zZW5kKCd7ImNtZCI6ICJTVEVQSU5UTyJ9Jyk7DQogICAgICAgIH0NICAgICAgICBmdW5jdGlvbiBzdGVwT3V0KCkNCiAgICAgICAgew0KICAgICAgICAgICAgaGlnaGxpZ2h0ID0gc291cmNlSGlnaGxpZ2h0Ow0KICAgICAgICAgICAgUUJDKHNvdXJjZUxpbmVEaXYoY3VycmVudExpbmUpLCAnd2hpdGUnKTsNCiAgICAgICAgICAgIHdzb2NrZXQuc2VuZCgneyJjbWQiOiAiU1RFUE9VVCJ9Jyk7DQogICAgICAgIH0NICAgICAgICANICAgICAgICBmdW5jdGlvbiBkZWxCcmVha3BvaW50KCkNICAgICAgICB7DQogICAgICAgICAgICBRVihzZWxlY3RlZEJyZWFrcG9pbnQsIDApOw0KICAgICAgICAgICAgc2VsZWN0ZWRCcmVha3BvaW50ID0gIiI7DQogICAgICAgICAgICBRRSgiZGVsQnJlYWtwb2ludEJ1dHRvbiIsIDApOw0KICAgICAgICB9DSAgICAgICAgZnVuY3Rpb24gb25CcmVha3BvaW50Q2xpY2soaWQpDSAgICAgICAgew0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkQnJlYWtwb2ludCA9PSBpZCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBRUyhpZClbImJhY2tncm91bmQtY29sb3IiXSA9ICd3aGl0ZSc7DQogICAgICAgICAgICAgICAgc2VsZWN0ZWRCcmVha3BvaW50ID0gIiI7DQogICAgICAgICAgICAgICAgUUUoImRlbEJyZWFrcG9pbnRCdXR0b24iLCAwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRCcmVha3BvaW50ICE9ICIiKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgUVMoc2VsZWN0ZWRCcmVha3BvaW50KVsiYmFja2dyb3VuZC1jb2xvciJdID0gJ3doaXRlJzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgUVMoaWQpWyJiYWNrZ3JvdW5kLWNvbG9yIl0gPSAneWVsbG93JzsNCiAgICAgICAgICAgICAgICBzZWxlY3RlZEJyZWFrcG9pbnQgPSBpZDsNCiAgICAgICAgICAgICAgICBRRSgiZGVsQnJlYWtwb2ludEJ1dHRvbiIsIDEpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnRDYWxsc3RhY2subGVuZ3RoOyArK2kpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgUVMoJ19zdGFja18nICsgaSkuY29sb3IgPSBjYWxsc3RhY2tfZGVmYXVsdDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBicCA9IFFIVkFMKGlkKS5zcGxpdCgnOicpWzBdOw0KICAgICAgICAgICAgdmFyIGpqID0geyBjbWQ6ICdTT1VSQ0UnLCBuYW1lOiBicCA9PSAnJyA/ICc8PE5BVElWRT4+JyA6IGJwIH07DQogICAgICAgICAgICB3c29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoamopKTsgICAgICAgIA0KICAgICAgICB9DSAgICAgICAgZnVuY3Rpb24gZ2V0Q2FsbHN0YWNrTGV2ZWwoKQ0gICAgICAgIHsNCiAgICAgICAgICAgIC8vIERldGVybWluZSB0aGUgQ2FsbHN0YWNrIExldmVsDQogICAgICAgICAgICB2YXIgbGV2ZWwgPSAtMTsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VycmVudENhbGxzdGFjay5sZW5ndGg7ICsraSkgew0KICAgICAgICAgICAgICAgIGlmIChRUygnX3N0YWNrXycgKyBpKS5jb2xvciA9PSBjYWxsc3RhY2tfc2NvcGUpIHsNCiAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAwIC0gKGkgKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIChsZXZlbCk7DQogICAgICAgIH0NICAgICAgICBmdW5jdGlvbiBxdWVyeVZhbCgpDSAgICAgICAgew0KICAgICAgICAgICAgLy9RQSgicXVlcnlSZXN1bHRzIiwgJzxkaXYgY2xhc3M9IlZBUlFVRVJZIj4nICsgUVZBTCgncXVlcnlUZXh0JykgKyAnPTwvZGl2PicpOw0KICAgICAgICAgICAgd3NvY2tldC5zZW5kKCd7ImNtZCI6ICJRVUVSWSIsICJ2YXIiOiAiJyArIFFWQUwoJ3F1ZXJ5VGV4dCcpICsgJyIsICJsZXZlbCI6ICcgKyBnZXRDYWxsc3RhY2tMZXZlbCgpICsgJ30nKTsNCiAgICAgICAgICAgIFFWQUwoJ3F1ZXJ5VGV4dCcsICIiKTsNCiAgICAgICAgfQ0gICAgICAgIGZ1bmN0aW9uIGV2YWxTdHJpbmcoKQ0gICAgICAgIHsNCiAgICAgICAgICAgIHdzb2NrZXQuc2VuZCgneyJjbWQiOiAiRVZBTCIsICJldmFsIjogIicgKyBRVkFMKCdxdWVyeVRleHQnKSArICciLCAibGV2ZWwiOiAnICsgZ2V0Q2FsbHN0YWNrTGV2ZWwoKSArICd9Jyk7DQogICAgICAgICAgICBRVkFMKCdxdWVyeVRleHQnLCAiIik7DQogICAgICAgIH0NICAgICAgICBmdW5jdGlvbiBsb2NhbHNRdWVyeSgpDSAgICAgICAgew0KICAgICAgICAgICAgUUEoInF1ZXJ5UmVzdWx0cyIsICc8ZGl2IGNsYXNzPSJWQVJRVUVSWSI+TG9jYWxzOiZuYnNwOzwvZGl2PicpOw0KICAgICAgICAgICAgd3NvY2tldC5zZW5kKCd7ImNtZCI6ICJMT0NBTFMiLCAibGV2ZWwiOiAnICsgZ2V0Q2FsbHN0YWNrTGV2ZWwoKSArICd9Jyk7DQogICAgICAgIH0NICAgICAgICBmdW5jdGlvbiBjbGVhclF1ZXJ5KCkNICAgICAgICB7DQogICAgICAgICAgICBRSCgncXVlcnlSZXN1bHRzJywgJycpOw0KICAgICAgICB9DSAgICAgICAgZnVuY3Rpb24gZGlzcGxheVN0YXR1cyhtc2csIG1zZ0NsYXNzKQ0gICAgICAgIHsNCiAgICAgICAgICAgIFFIKCdzdGF0dXN0ZXh0JywgJzxkaXYgY2xhc3M9IicgKyAobXNnQ2xhc3M/bXNnQ2xhc3M6J0dFTkVSSUNfTU9EVUxFJykgKyAnIj4nICsgbXNnICsgJzwvZGl2PicpOw0KICAgICAgICB9DSAgICAgICAgZnVuY3Rpb24gc291cmNlTGluZURpdihsaW5lKQ0gICAgICAgIHsNCiAgICAgICAgICAgIHJldHVybiAoJ19fc3JjJyArIGxpbmUpOw0KICAgICAgICB9DQ0gICAgICAgIGZ1bmN0aW9uIG9uVG9nZ2xlQnJlYWtwb2ludChsaW5lKQ0gICAgICAgIHsNCiAgICAgICAgICAgIFFCQygnTCcgKyBzb3VyY2VMaW5lRGl2KGxpbmUpLCBicENvbG9yKTsNCiAgICAgICAgICAgIHZhciBmbiA9ICcnOw0KDQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnRDYWxsc3RhY2subGVuZ3RoOyArK2kpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKFFTKCdfc3RhY2tfJyArIGkpLmNvbG9yID09IGNhbGxzdGFja19zY29wZSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGZuID0gY3VycmVudENhbGxzdGFja1tpXS5maWxlTmFtZS5zcGxpdCgnXFwnKS5qb2luKCdcXFxcJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB3c29ja2V0LnNlbmQoJ3siY21kIjogIkJSRUFLUE9JTlQiLCAiZmlsZSI6IicgKyBmbiArICciLCAibGluZSI6JyArIGxpbmUgKyAnLCAibW9kZSI6ImFkZCJ9Jyk7DQogICAgICAgIH0NICAgICAgICBmdW5jdGlvbiBvbkR1bXBIZWFwKCkNICAgICAgICB7DQogICAgICAgICAgICB3c29ja2V0LnNlbmQoJ3siY21kIjogIkhFQVAifScpOw0KICAgICAgICB9DSAgICAgICAgZnVuY3Rpb24gZm9yY2VHQygpDSAgICAgICAgew0KICAgICAgICAgICAgd3NvY2tldC5zZW5kKCd7ImNtZCI6ICJHQyJ9Jyk7DQogICAgICAgIH0NICAgICAgICBmdW5jdGlvbiBkaXNwbGF5Q2FsbHN0YWNrKCkNICAgICAgICB7DQogICAgICAgICAgICB2YXIgZGlzcGxheSA9IFtdOw0KICAgICAgICAgICAgdmFyIGluZGVudCA9ICctLT4mbmJzcDsnOw0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdXJyZW50Q2FsbHN0YWNrLmxlbmd0aDsgKytpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q2FsbHN0YWNrW2ldLmZ1bmNOYW1lID09ICcnKSB7IGN1cnJlbnRDYWxsc3RhY2tbaV0uZnVuY05hbWUgPSAnKGFub255bW91cyknOyB9DQogICAgICAgICAgICAgICAgdmFyIGZuYW1lID0gY3VycmVudENhbGxzdGFja1tpXS5maWxlTmFtZS5zcGxpdCgnXFwnKS5qb2luKCdcXFxcJyk7DQoNCiAgICAgICAgICAgICAgICBkaXNwbGF5LnB1c2goJzxkaXYgZGVwdGg9IicgKyAoaSsxKSArICciIGlkPSJfc3RhY2tfJyArIGkgKyAnIiBjbGFzcz0iQ0FMTFNUQUNLIiBvbmNsaWNrPSJvbkNhbGxzdGFja0NsaWNrKFwnJyArIGN1cnJlbnRDYWxsc3RhY2subGVuZ3RoICsgJ1wnLCBcJ19zdGFja18nICsgaSArICdcJywgXCcnICsgZm5hbWUgKyAnXCcpIj4nICsgaW5kZW50ICsgY3VycmVudENhbGxzdGFja1tpXS5mdW5jTmFtZSArICc6JyArIGN1cnJlbnRDYWxsc3RhY2tbaV0ubGluZU51bWJlciArICc8L2Rpdj4nKTsNCiAgICAgICAgICAgICAgICBpbmRlbnQgPSAnJm5ic3A7Jm5ic3A7Jm5ic3A7JyArIGluZGVudDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIFFIKCdDYWxsc3RhY2tXaW5kb3cnLCBkaXNwbGF5LmpvaW4oJycpKTsNCg0KICAgICAgICAgICAgaWYgKGN1cnJlbnRDYWxsc3RhY2subGVuZ3RoID4gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBRUygnX3N0YWNrXzAnKS5jb2xvciA9IGNhbGxzdGFja19zY29wZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0gICAgICAgIGZ1bmN0aW9uIG9uQ2FsbHN0YWNrQ2xpY2sobGVuLCBpZCwgZmlsZW5hbWUpDSAgICAgICAgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBRUygnX3N0YWNrXycgKyBpKS5jb2xvciA9IGNhbGxzdGFja19kZWZhdWx0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgUVMoaWQpLmNvbG9yID0gY2FsbHN0YWNrX3Njb3BlOw0KICAgICAgICAgICAgdmFyIGpqID0geyBjbWQ6ICdTT1VSQ0UnLCBuYW1lOiBmaWxlbmFtZSB9Ow0KICAgICAgICAgICAgd3NvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KGpqKSk7DQogICAgICAgIH0NICAgICAgICBmdW5jdGlvbiBtYW51YWxseUxvYWRTb3VyY2UoKQ0gICAgICAgIHsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VycmVudENhbGxzdGFjay5sZW5ndGg7ICsraSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBRUygnX3N0YWNrXycgKyBpKS5jb2xvciA9IGNhbGxzdGFja19kZWZhdWx0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgUUgoJ0xvZ1dpbmRvdycsICcnKTsNCg0KICAgICAgICAgICAgdmFyIGpqID0geyBjbWQ6ICdTT1VSQ0UnLCBuYW1lOiBRVkFMKCdsb2FkU291cmNlVGV4dCcpID09ICcnPyc8PE5BVElWRT4+JzpRVkFMKCdsb2FkU291cmNlVGV4dCcpIH07DQogICAgICAgICAgICB3c29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoamopKTsNCiAgICAgICAgfQ0gICAgICAgIC8vIFBvbGwgdGhlIHNlcnZlciwgaWYgaXQgcmVzcG9uZHMsIHJlZnJlc2ggdGhlIHBhZ2UuDQogICAgICAgIGZ1bmN0aW9uIHNlcnZlclBvbGwoKQ0KICAgICAgICB7DQogICAgICAgICAgICB4ZHIgPSBudWxsOw0KICAgICAgICAgICAgdHJ5IHsgeGRyID0gbmV3IFhEb21haW5SZXF1ZXN0KCk7IH0gY2F0Y2ggKGUpIHsgfQ0KICAgICAgICAgICAgaWYgKCF4ZHIpIHhkciA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOw0KICAgICAgICAgICAgeGRyLm9wZW4oIkhFQUQiLCB3aW5kb3cubG9jYXRpb24uaHJlZik7DQogICAgICAgICAgICB4ZHIudGltZW91dCA9IDE1MDAwOw0KICAgICAgICAgICAgeGRyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsgcmVsb2FkKCk7IH07DQogICAgICAgICAgICB4ZHIub25lcnJvciA9IHhkci5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7IHNldFRpbWVvdXQoc2VydmVyUG9sbCwgMjAwMCk7IH07DQogICAgICAgICAgICB4ZHIuc2VuZCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gcmVsb2FkKCkgeyB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOyB9DQoNICAgIDwvc2NyaXB0Pg0KPC9ib2R5Pg0KPC9odG1sPg0K'; +var dbgHTML = '77u/PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KPGh0bWw+DQo8aGVhZD4NCjxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPg0KPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1FREdFIiAvPg0KPG1ldGEgbmFtZT0iZm9ybWF0LWRldGVjdGlvbiIgY29udGVudD0idGVsZXBob25lPW5vIiAvPg0KPHRpdGxlPldlYlJUQyBEZWJ1ZzwvdGl0bGU+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KYm9keSANCnsNCiAgICBtYXJnaW46IDA7DQoJcGFkZGluZzogMDsNCglib3JkZXI6IDA7DQoJY29sb3I6IGJsYWNrOw0KCWZvbnQtc2l6ZTogMTNweDsNCglmb250LWZhbWlseTogIlRyZWJ1Y2hldCBNUyIsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQoJYmFja2dyb3VuZC1jb2xvcjogI2QzZDlkNjsNCn0NCiNjb250YWluZXIgew0KCWJhY2tncm91bmQtY29sb3I6ICNmZmY7DQoJd2lkdGg6IDk2MHB4Ow0KCW1hcmdpbjogMCBhdXRvOw0KCWJvcmRlci10b3A6IDA7DQoJYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2I3YjdiNzsNCglib3JkZXItYm90dG9tOiAwOw0KCWJvcmRlci1sZWZ0OiAxcHggc29saWQgI2I3YjdiNzsNCglwYWRkaW5nOiAwOw0KfQ0KI21hc3RoZWFkIHsNCgl3aWR0aDogYXV0bzsNCgltYXJnaW46IDA7DQoJcGFkZGluZzogMDsNCglvdmVyZmxvdzogYXV0bzsNCgl0ZXh0LWFsaWduOiByaWdodDsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMDM2Ow0KCXdpZHRoOiA5NjBweDsNCg0KICAgIGJhY2tncm91bmQ6IHJnYig0NSw4NiwxMzcpOyAvKiBPbGQgYnJvd3NlcnMgKi8NCiAgICBiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCAgcmdiYSg0NSw4NiwxMzcsMSkgMCUsIHJnYmEoMCw1MSwxMDIsMSkgMjklKTsgLyogRkYzLjYrICovDQogICAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCByaWdodCB0b3AsIGNvbG9yLXN0b3AoMCUscmdiYSg0NSw4NiwxMzcsMSkpLCBjb2xvci1zdG9wKDI5JSxyZ2JhKDAsNTEsMTAyLDEpKSk7IC8qIENocm9tZSxTYWZhcmk0KyAqLw0KICAgIGJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsICByZ2JhKDQ1LDg2LDEzNywxKSAwJSxyZ2JhKDAsNTEsMTAyLDEpIDI5JSk7IC8qIENocm9tZTEwKyxTYWZhcmk1LjErICovDQogICAgYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsICByZ2JhKDQ1LDg2LDEzNywxKSAwJSxyZ2JhKDAsNTEsMTAyLDEpIDI5JSk7IC8qIE9wZXJhIDExLjEwKyAqLw0KICAgIGJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgIHJnYmEoNDUsODYsMTM3LDEpIDAlLHJnYmEoMCw1MSwxMDIsMSkgMjklKTsgLyogSUUxMCsgKi8NCiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICByZ2JhKDQ1LDg2LDEzNywxKSAwJSxyZ2JhKDAsNTEsMTAyLDEpIDI5JSk7IC8qIFczQyAqLw0KICAgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KCBzdGFydENvbG9yc3RyPScjMmQ1Njg5JywgZW5kQ29sb3JzdHI9JyMwMDMzNjYnLEdyYWRpZW50VHlwZT0xICk7IC8qIElFNi05ICovDQp9DQojY29sdW1uX2wgew0KCXBvc2l0aW9uOiByZWxhdGl2ZTsNCglmbG9hdDogbGVmdDsNCgl3aWR0aDogOTMwcHg7DQoJbWFyZ2luOiAwOw0KCXBhZGRpbmc6IDAgMTVweDsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KfQ0KI2Zvb3RlciB7DQoJY2xlYXI6IGJvdGg7DQoJb3ZlcmZsb3c6IGF1dG87DQoJd2lkdGg6IDk2MHB4Ow0KCXRleHQtYWxpZ246IGNlbnRlcjsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMTEzOTYyOw0KCXBhZGRpbmctdG9wOiA1cHg7DQoJcGFkZGluZy1ib3R0b206IDVweDsNCn0NCiNmb290ZXIgYSB7DQoJY29sb3I6ICNmZmY7DQoJdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQp9DQojZm9vdGVyIGE6aG92ZXIgew0KCWNvbG9yOiAjZmZmOw0KCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCn0NCmEgew0KCWNvbG9yOiAjMDM2Ow0KCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOw0KfQ0KLnN0eWxlMyB7DQoJdGV4dC1hbGlnbjogY2VudGVyOw0KCWNvbG9yOiB3aGl0ZTsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjODA4MDgwOw0KCWZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KLnN0eWxlNiB7DQogICAgcGFkZGluZy10b3A6IDJweDsNCiAgICBwYWRkaW5nLWJvdHRvbTogMnB4Ow0KCWJhY2tncm91bmQtY29sb3I6ICNDMEMwQzA7DQp9DQoueHNlY3Rpb24gew0KICAgIGJhY2tncm91bmQtY29sb3I6ICNFMEUwRTA7DQogICAgcGFkZGluZzogNXB4IDIwcHggMjVweCAyMHB4Ow0KICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7DQp9DQouZml4ZWRmb250IHsNCiAgICBmb250LWZhbWlseTpjb3VyaWVyLCAiY291cmllciBuZXciLCBtb25vc3BhY2U7DQp9DQouaW5mb2VudHJ5IHsNCiAgICBwYWRkaW5nLXRvcDoxcHg7DQp9DQouR0VORVJJQ19NT0RVTEV7DQogICAgY29sb3I6YmxhY2s7DQp9DQouVkFSUVVFUll7DQogICAgY29sb3I6YmxhY2s7DQp9DQouVkFSUkVTVUxUew0KICAgIGNvbG9yOmRhcmtncmVlbjsNCn0NCi5CUkVBS1BPSU5Uew0KICAgIGNvbG9yOmRhcmt2aW9sZXQNCn0NCi5CUkVBS1BPSU5UOmhvdmVyIA0Kew0KCWJhY2tncm91bmQtY29sb3I6ICNFRUU7DQp9DQouU1RBVEVDSEFOR0V7DQogICAgY29sb3I6ZGFya3Zpb2xldA0KfQ0KLlNPVVJDRUNPREVQQVJFTlQgDQp7DQogICAgd2lkdGg6MTAwMDBweA0KfQ0KLlNPVVJDRUNPREVQQVJFTlQ6aG92ZXIgDQp7DQoJYmFja2dyb3VuZC1jb2xvcjogI0VFRTsNCn0NCi5TT1VSQ0VDT0RFew0KICAgIGNvbG9yOmRhcmtncmVlbjsNCiAgICBwYWRkaW5nLWxlZnQ6MTBweDsNCiAgICBkaXNwbGF5OmlubGluZS1ibG9jazsNCn0NCi5TT1VSQ0VDT0RFTElORQ0Kew0KICAgIHdpZHRoOjMwcHg7DQogICAgdGV4dC1hbGlnbjpyaWdodDsNCiAgICBjb2xvcjpncmF5Ow0KICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrOw0KICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTsNCiAgICAta2h0bWwtdXNlci1zZWxlY3Q6bm9uZTsNCiAgICAtbW96LXVzZXItc2VsZWN0Om5vbmU7DQogICAgLW1zLXVzZXItc2VsZWN0Om5vbmU7DQogICAgLW8tdXNlci1zZWxlY3Q6bm9uZTsNCiAgICAtdXNlci1zZWxlY3Q6bm9uZTsNCn0NCi5DQUxMU1RBQ0sNCnsNCiAgICBjb2xvcjpzYWRkbGVicm93bjsNCiAgICBmb250LXdlaWdodDpub3JtYWw7DQogICAgLXdlYmtpdC11c2VyLXNlbGVjdDpub25lOw0KICAgIC1raHRtbC11c2VyLXNlbGVjdDpub25lOw0KICAgIC1tb3otdXNlci1zZWxlY3Q6bm9uZTsNCiAgICAtbXMtdXNlci1zZWxlY3Q6bm9uZTsNCiAgICAtby11c2VyLXNlbGVjdDpub25lOw0KICAgIC11c2VyLXNlbGVjdDpub25lOw0KfQ0KLkNBTExTVEFDSzpob3Zlcg0Kew0KCWJhY2tncm91bmQtY29sb3I6ICNFRUU7DQp9DQouRVJST1J7DQogICAgY29sb3I6cmVkOw0KfQ0KLlVOS05PV05fTU9EVUxFew0KICAgIGNvbG9yOnJlZDsNCn0NCjwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keSBvbmxvYWQ9ImlmICh0eXBlb2Yoc3RhcnR1cCkgIT09ICd1bmRlZmluZWQnKSBzdGFydHVwKCk7Ij4NCgk8ZGl2IGlkPSJjb250YWluZXIiPg0KCQk8ZGl2IGlkPSJtYXN0aGVhZCIgc3R5bGU9ImhlaWdodDogNjZweDsgd2lkdGg6IDEwMCU7IG92ZXJmbG93OmhpZGRlbiI+DQoJICAgICAgICA8ZGl2IHN0eWxlPSJmbG9hdDpsZWZ0OyBoZWlnaHQ6IDY2cHg7IGNvbG9yOiNjOGM4Yzg7IHBhZGRpbmctbGVmdDoyMHB4OyBwYWRkaW5nLXRvcDo4cHgiPjxzdHJvbmc+PGZvbnQgc3R5bGU9ImZvbnQtc2l6ZTo0NnB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsiPkJ1aWx0LWluIEpTIERlYnVnZ2VyPC9mb250Pjwvc3Ryb25nPjwvZGl2Pg0KCSAgICAgICAgPGRpdiBzdHlsZT0iZmxvYXQ6bGVmdDsgaGVpZ2h0OiA2NnB4OyBjb2xvcjojYzhjOGM4OyBwYWRkaW5nLWxlZnQ6NXB4OyBwYWRkaW5nLXRvcDoxNHB4Ij48c3Ryb25nPjxmb250IHN0eWxlPSJmb250LXNpemU6MTRweDsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ij48c3BhbiBpZD0idGl0bGVob3N0Ij48L3NwYW4+PC9mb250Pjwvc3Ryb25nPjwvZGl2Pg0KCQk8L2Rpdj4NCgkJPGRpdiBpZD0idG9wYmFyIj4NCgkJCTx0YWJsZSBzdHlsZT0id2lkdGg6IDEwMCU7IGhlaWdodDogMjJweDsiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9InN0eWxlMSI+DQoJCQkJPHRyPg0KCQkJCQk8dGQgaWQ9IkF0dGFjaEJ1dHRvbiIgc3R5bGU9IndpZHRoOiAxMDBweDsgaGVpZ2h0OiAyNHB4OyBjdXJzb3I6ZGVmYXVsdDsiIG9uY2xpY2s9ImF0dGFjaERlYnVnZ2VyKCkiIGNsYXNzPSJzdHlsZTMiPkFUVEFDSDwvdGQ+DQoJCQkJCTx0ZCBpZD0iUGF1c2VSZXN1bWVCdXR0b24iIHN0eWxlPSJ3aWR0aDogMTAwcHg7IGhlaWdodDogMjRweDsgY3Vyc29yOmRlZmF1bHQ7IiBvbmNsaWNrPSJwYXVzZVJlc3VtZSgpIiBjbGFzcz0ic3R5bGUzIj5QQVVTRTwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDx0ZCBpZD0iU3RlcE92ZXJCdXR0b24iIHN0eWxlPSJ3aWR0aDogMTAwcHg7IGhlaWdodDogMjRweDsgY3Vyc29yOmRlZmF1bHQ7IiBvbmNsaWNrPSJzdGVwT3ZlcigpIiBjbGFzcz0ic3R5bGUzIj5TdGVwLU92ZXI8L3RkPg0KICAgICAgICAgICAgICAgICAgICA8dGQgaWQ9IlN0ZXBJbnRvQnV0dG9uIiBzdHlsZT0id2lkdGg6IDEwMHB4OyBoZWlnaHQ6IDI0cHg7IGN1cnNvcjpkZWZhdWx0OyIgb25jbGljaz0ic3RlcEludG8oKSIgY2xhc3M9InN0eWxlMyI+U3RlcC1JbnRvPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPHRkIGlkPSJTdGVwT3V0QnV0dG9uIiBzdHlsZT0id2lkdGg6IDEwMHB4OyBoZWlnaHQ6IDI0cHg7IGN1cnNvcjpkZWZhdWx0OyIgb25jbGljaz0ic3RlcE91dCgpIiBjbGFzcz0ic3R5bGUzIj5TdGVwLU91dDwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDwhLS08dGQgaWQ9IkhlYXBCdXR0b24iIHN0eWxlPSJ3aWR0aDogMTAwcHg7IGhlaWdodDogMjRweDsgY3Vyc29yOmRlZmF1bHQ7IiBvbmNsaWNrPSJvbkR1bXBIZWFwKCkiIGNsYXNzPSJzdHlsZTMiPlZpZXcgSGVhcDwvdGQ+IC0tPg0KCQkJCTwvdHI+DQoJCQk8L3RhYmxlPg0KICAgICAgICAgICAgPGRpdiBpZD0iY29sdW1uX2wiPg0KICAgICAgICAgICAgICAgIDxkaXYgaWQ9InN0YXR1c3RleHQiIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJoZWlnaHQ6MjBweDsgZm9udC1zaXplOjE1cHgiPg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQoJCTwvZGl2Pg0KCQk8ZGl2IGlkPSJwYWdlX2NvbnRlbnQiPg0KICAgICAgICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDc1JTsgZmxvYXQ6bGVmdCI+DQogICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2FsbHN0YWNrV2luZG93IiBzdHlsZT0id2lkdGg6IDEwMCU7aGVpZ2h0OjEwMHB4O292ZXJmbG93LXk6c2Nyb2xsIj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4JDQogICAgICAgICAgICAgICAgPGRpdiBpZD0iTG9nV2luZG93IiBzdHlsZT0id2lkdGg6IDEwMCU7aGVpZ2h0OjUwMHB4O292ZXJmbG93LXk6c2Nyb2xsIj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4JDQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiAyNSU7IGZsb2F0OnJpZ2h0Ij4NCiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJMb2dXaW5kb3cyIiBzdHlsZT0id2lkdGg6IDEwMCU7aGVpZ2h0OjYwMHB4O292ZXJmbG93LXk6c2Nyb2xsIj4NCiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJsb2FkU291cmNlVGV4dCIgZGlzYWJsZWQgc3R5bGU9IndpZHRoOjk1JTtoZWlnaHQ6MzBweCI+PC90ZXh0YXJlYT4NCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJsb2FkU291cmNlQnV0dG9uIiB0eXBlPSJidXR0b24iIHZhbHVlPSJMb2FkIFNvdXJjZSIgZGlzYWJsZWQgb25jbGljaz0ibWFudWFsbHlMb2FkU291cmNlKCkiIC8+DQogICAgICAgICAgICAgICAgICAgIDxwLz4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nR0VORVJJQ19NT0RVTEUnPkJyZWFrcG9pbnRzPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkN1cnJlbnRCcmVha3BvaW50cyIgc3R5bGU9IndpZHRoOiA5NSU7aGVpZ2h0OjIwMHB4O292ZXJmbG93LXk6c2Nyb2xsIj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iZGVsQnJlYWtwb2ludEJ1dHRvbiIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iRGVsIEJyZWFrcG9pbnQiIGRpc2FibGVkIG9uY2xpY2s9ImRlbEJyZWFrcG9pbnQoKSIgLz4NCiAgICAgICAgICAgICAgICAgICAgPHAgLz4NCiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJxdWVyeVRleHQiIGRpc2FibGVkIHN0eWxlPSJ3aWR0aDo5NSU7aGVpZ2h0OjE1cHgiPjwvdGV4dGFyZWE+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0icXVlcnlCdXR0b24iIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IlF1ZXJ5IiBkaXNhYmxlZCBvbmNsaWNrPSJxdWVyeVZhbCgpIiAvPg0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9ImV2YWxCdXR0b24iIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IkV2YWwiIGRpc2FibGVkIG9uY2xpY2s9ImV2YWxTdHJpbmcoKSIgLz4NCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJjbGVhckJ1dHRvbiIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iQ2xlYXIiIGRpc2FibGVkIG9uY2xpY2s9ImNsZWFyUXVlcnkoKSIgLz4NCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJsb2NhbHNCdXR0b24iIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IkxvY2FscyIgZGlzYWJsZWQgb25jbGljaz0ibG9jYWxzUXVlcnkoKSIgLz4NCiAgICAgICAgICAgICAgICAgICAgPHAgLz4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nR0VORVJJQ19NT0RVTEUnPlJlc3VsdHM8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0icXVlcnlSZXN1bHRzIiBzdHlsZT0id2lkdGg6IDk1JTtoZWlnaHQ6MjAwcHg7b3ZlcmZsb3cteTpzY3JvbGwiPg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4JDQoNCiAgICAgICAgICAgICAgICA8L2Rpdj4JDQogICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgPGRpdiBpZD0iZm9vdGVyIj4NCiAgICAgICAgICAgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIxMCIgc3R5bGU9IndpZHRoOiAxMDAlIj4NCiAgICAgICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGlkPSd4Zm9vdGVyJyBzdHlsZT0idGV4dC1hbGlnbjpsZWZ0OyBkaXNwbGF5Om5vbmUiPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO2NvbG9yOmxpZ2h0Z3JheSI+VG90YWwgTWVtb3J5IEFsbG9jYXRpb246IDxiIGlkPSJtZW11c2FnZSIgc3R5bGU9ImNvbG9yOnllbGxvdyI+PC9iPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IGlkPSJnY0J1dHRvbiIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iR0MiIG9uY2xpY2s9ImZvcmNlR0MoKSIgLz48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICA8L3RhYmxlPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgPC9kaXY+DQoNCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DSAgICAgICAgdmFyIGJyZWFrcG9pbnRJRCA9IDA7DSAgICAgICAgdmFyIHNlbGVjdGVkQnJlYWtwb2ludCA9ICIiOw0gICAgICAgIHZhciB3c29ja2V0Ow0gICAgICAgIHZhciBjb25uZWN0ZWQgPSBmYWxzZTsNICAgICAgICB2YXIgY3VycmVudExpbmUgPSAwOw0gICAgICAgIHZhciBjdXJyZW50TW9kdWxlID0gJyc7DSAgICAgICAgdmFyIGN1cnJlbnRNb2R1bGVUb2tlbnMgPSBudWxsOw0gICAgICAgIHZhciBzb3VyY2VIaWdobGlnaHQgPSAneWVsbG93JzsNICAgICAgICB2YXIgZXhjZXB0aW9uSGlnaGxpZ2h0ID0gJ2RlZXBwaW5rJzsNICAgICAgICB2YXIgYnBDb2xvciA9ICdibHVlJzsNICAgICAgICB2YXIgZXhjZXB0aW9uTWVzc2FnZSA9IG51bGw7DSAgICAgICAgdmFyIGhpZ2hsaWdodCA9IHNvdXJjZUhpZ2hsaWdodDsNICAgICAgICB2YXIgY2FsbHN0YWNrX3Njb3BlID0gJ3JveWFsYmx1ZSc7DSAgICAgICAgdmFyIGNhbGxzdGFja19kZWZhdWx0ID0gJ3NhZGRsZWJyb3duJzsNICAgICAgICB2YXIgY3VycmVudENhbGxzdGFjayA9IFtdOw0gICAgICAgIHZhciBpc05hdGl2ZSA9IGZhbHNlOw0NICAgICAgICBmdW5jdGlvbiBRKHgpIHsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHgpOyB9IC8vICJRIg0KICAgICAgICBmdW5jdGlvbiBRQyh4LCB5KSB7IFFTKHgpWyJjdXJzb3IiXSA9IHk7fQ0KICAgICAgICBmdW5jdGlvbiBRUyh4KSB7IHJldHVybiBRKHgpLnN0eWxlOyB9ICAgICAgICAgICAgICAgIC8vICJRIiBzdHlsZQ0KICAgICAgICBmdW5jdGlvbiBRRSh4LCB5KSB7IFEoeCkuZGlzYWJsZWQgPSAheTsgfSAgICAgICAgICAgIC8vICJRIiBlbmFibGUNCiAgICAgICAgZnVuY3Rpb24gUVYoeCwgeSkgeyBRUyh4KS5kaXNwbGF5ID0gKHkgPyAnJyA6ICdub25lJyk7IH0gLy8gIlEiIHZpc2libGUNCiAgICAgICAgZnVuY3Rpb24gUUEoeCwgeSkgeyBRKHgpLmlubmVySFRNTCArPSB5OyB9ICAgICAgICAgICAvLyAiUSIgYXBwZW5kDQogICAgICAgIGZ1bmN0aW9uIFFIKHgsIHkpIHsgUSh4KS5pbm5lckhUTUwgPSB5OyB9ICAgICAgICAgICAgLy8gIlEiIGh0bWwNCiAgICAgICAgZnVuY3Rpb24gUUhWQUwoeCkgeyByZXR1cm4gKFEoeCkuaW5uZXJIVE1MKTsgfQ0KICAgICAgICBmdW5jdGlvbiBRVkFMKHgsIHkpIHsgaWYgKHkgPT0gdW5kZWZpbmVkKSB7IHJldHVybiAoUSh4KS52YWx1ZSk7IH0gZWxzZSB7IFEoeCkudmFsdWUgPSB5OyB9IH0NCiAgICAgICAgZnVuY3Rpb24gUUJDKHgsIHkpIHsgUVMoeClbImJhY2tncm91bmQtY29sb3IiXSA9IHk7IH0NCiAgICAgICAgZnVuY3Rpb24gUUNISUxEUkVOKHgpIHsgcmV0dXJuIChRKHgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdkaXYnKSk7IH0NDSAgICAgICAgZnVuY3Rpb24gSW50MzJUb1N0cih2KSB7IHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKCh2ID4+IDI0KSAmIDB4RkYsICh2ID4+IDE2KSAmIDB4RkYsICh2ID4+IDgpICYgMHhGRiwgdiAmIDB4RkYpOyB9DQogICAgICAgIGZ1bmN0aW9uIEludDE2VG9TdHIodikgeyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgodiA+PiA4KSAmIDB4RkYsIHYgJiAweEZGKTsgfQ0KICAgICAgICBmdW5jdGlvbiBSZWFkU2hvcnQoZGF0YSwgcHRyKSB7IHJldHVybiAoZGF0YS5jaGFyQ29kZUF0KHB0cikgPDwgOCkgKyBkYXRhLmNoYXJDb2RlQXQocHRyICsgMSk7IH0NCiAgICAgICAgZnVuY3Rpb24gUmVhZEludChkYXRhLCBwdHIpIHsgcmV0dXJuIChkYXRhLmNoYXJDb2RlQXQocHRyKSAqIDE2Nzc3MjE2KSArIChkYXRhLmNoYXJDb2RlQXQocHRyICsgMSkgKiA2NTUzNikgKyAoZGF0YS5jaGFyQ29kZUF0KHB0ciArIDIpICogMjU2KSArIGRhdGEuY2hhckNvZGVBdChwdHIgKyAzKTsgfQ0KICAgICAgICBmdW5jdGlvbiBSZWFkTG9uZyhkYXRhLCBwdHIpIHsgcmV0dXJuICgoZGF0YS5jaGFyQ29kZUF0KHB0cikgKiA3MjA1NzU5NDAzNzkyNzkzNikgKyAoZGF0YS5jaGFyQ29kZUF0KHB0ciArIDEpICogMjgxNDc0OTc2NzEwNjU2KSArIChkYXRhLmNoYXJDb2RlQXQocHRyICsgMikgKiAxMDk5NTExNjI3Nzc2KSArIChkYXRhLmNoYXJDb2RlQXQocHRyICsgMykgKiA0Mjk0OTY3Mjk2KSArIGRhdGEuY2hhckNvZGVBdChwdHIgKyA0KSAqIDE2Nzc3MjE2KSArIChkYXRhLmNoYXJDb2RlQXQocHRyICsgNSkgKiA2NTUzNikgKyAoZGF0YS5jaGFyQ29kZUF0KHB0ciArIDYpICogMjU2KSArIGRhdGEuY2hhckNvZGVBdChwdHIgKyA3KTsgfQ0KDSAgICAgICAgZnVuY3Rpb24gU2VuZENvbW1hbmQoY21kLCBkYXRhKQ0KICAgICAgICB7DQogICAgICAgICAgICB3c29ja2V0LnNlbmQoSW50MTZUb1N0cihjbWQpICsgZGF0YSk7DQogICAgICAgIH0NDSAgICAgICAgZnVuY3Rpb24gQWRkTG9nKGNvZGUsIG1zZykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGRjbGFzcyA9ICIiOw0KICAgICAgICAgICAgaWYgKG1zZyA9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICBRQSgiTG9nV2luZG93IiwgIjxkaXYgY2xhc3M9J0dFTkVSSUNfTU9EVUxFJyA+ICIgKyBjb2RlICsgIjwvYnI+PC9kaXY+Iik7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBkY2xhc3MgPSBjb2RlOw0KDQogICAgICAgICAgICBRQSgiTG9nV2luZG93IiwgIjxkaXYgY2xhc3M9JyIgKyBkY2xhc3MgKyAiJyA+ICIgKyBtc2cgKyAiPC9icj48L2Rpdj4iKTsNCiAgICAgICAgfQ0gICAgICAgIGZ1bmN0aW9uIHN0YXJ0dXAoKQ0KICAgICAgICB7DQogICAgICAgICAgICBkaXNwbGF5U3RhdHVzKCJFc3RhYmxpc2hpbmcgY29ubmVjdGlvbi4uLiIpOyAgICAgICAgICANCiAgICAgICAgICAgIHdzb2NrZXQgPSBuZXcgV2ViU29ja2V0KCJ3czovLyIgKyB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgKyAiOiIgKyB3aW5kb3cubG9jYXRpb24ucG9ydCArICIvIik7DQogICAgICAgICAgICB3c29ja2V0LmJpbmFyeVR5cGUgPSAiYXJyYXlidWZmZXIiOw0KICAgICAgICAgICAgd3NvY2tldC5vbm9wZW4gPSBmdW5jdGlvbiAoZXZ0KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IHRydWU7IGRpc3BsYXlTdGF0dXMoIkRlYnVnIENsaWVudCBDb25uZWN0ZWQuLi4iKTsNCiAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiQXR0YWNoQnV0dG9uIiksIDEpOw0KICAgICAgICAgICAgICAgIGF0dGFjaERlYnVnZ2VyKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB3c29ja2V0Lm9uY2xvc2UgPSBmdW5jdGlvbiAoZXZ0KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IGZhbHNlOyBkaXNwbGF5U3RhdHVzKCJEZWJ1ZyBDbGllbnQgQ29ubmVjdGlvbiBsb3N0Li4uIFJldHJ5aW5nLi4uIik7DQogICAgICAgICAgICAgICAgdG9nZ2xlQ29sb3IoUVMoIkF0dGFjaEJ1dHRvbiIpLCAwKTsNCiAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiU3RlcE92ZXJCdXR0b24iKSwgMCk7DQogICAgICAgICAgICAgICAgdG9nZ2xlQ29sb3IoUVMoIlN0ZXBJbnRvQnV0dG9uIiksIDApOw0KICAgICAgICAgICAgICAgIHRvZ2dsZUNvbG9yKFFTKCJTdGVwT3V0QnV0dG9uIiksIDApOw0KICAgICAgICAgICAgICAgIHRvZ2dsZUNvbG9yKFFTKCJQYXVzZVJlc3VtZUJ1dHRvbiIpLCAwKTsNCiAgICAgICAgICAgICAgICBRRSgibG9hZFNvdXJjZUJ1dHRvbiIsIDApOw0KICAgICAgICAgICAgICAgIFFFKCJsb2FkU291cmNlVGV4dCIsIDApOw0KICAgICAgICAgICAgICAgIFFFKCdxdWVyeUJ1dHRvbicsIDApOw0KICAgICAgICAgICAgICAgIFFFKCdjbGVhckJ1dHRvbicsIDApOw0KICAgICAgICAgICAgICAgIFFFKCdsb2NhbHNCdXR0b24nLCAwKTsNCiAgICAgICAgICAgICAgICBRRSgnZXZhbEJ1dHRvbicsIDApOw0KICAgICAgICAgICAgICAgIFFWKCdwYWdlX2NvbnRlbnQnLCBmYWxzZSk7DQogICAgICAgICAgICAgICAgc2V0VGltZW91dChzZXJ2ZXJQb2xsLCAxMDAwKTsNCiAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlID0gJyc7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB3c29ja2V0Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChldnQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIG1zZyA9IEpTT04ucGFyc2UoZXZ0LmRhdGEpOw0KDQogICAgICAgICAgICAgICAgc3dpdGNoKG1zZy5jbWQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICdNRU1PUlknOg0KICAgICAgICAgICAgICAgICAgICAgICAgUUgoJ21lbXVzYWdlJywgTWF0aC5yb3VuZChtc2cudG90YWwvMTAyNCkgKyAnIGtiJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnQVRUQUNIJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTdGF0dXMoJ0F0dGFjaGVkLi4uJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBRSCgiQXR0YWNoQnV0dG9uIiwgIkRFVEFDSCIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlQ29sb3IoUVMoIlBhdXNlUmVzdW1lQnV0dG9uIiksIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgUUUoImxvYWRTb3VyY2VCdXR0b24iLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFFFKCJsb2FkU291cmNlVGV4dCIsIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgUVYoJ3BhZ2VfY29udGVudCcsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ1BBVVNFJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlzTmF0aXZlID0gbXNnLm5hdGl2ZTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpZ2hsaWdodCA9PSBleGNlcHRpb25IaWdobGlnaHQpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgUUgoJ3N0YXR1c3RleHQnLCAnPGRpdiBjbGFzcz0iU1RBVEVDSEFOR0UiPicgKyBleGNlcHRpb25NZXNzYWdlICsgJyBpbiAnICsgbXNnLmZpbGUgKyAnOicgKyBtc2cubGluZSArICc8L2Rpdj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXNnLm5hdGl2ZSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFIKCdzdGF0dXN0ZXh0JywgJzxkaXYgY2xhc3M9IlNUQVRFQ0hBTkdFIj5QQVVTRUQgaW4gW05BVElWRSBDT0RFXTwvZGl2PicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRSCgnTG9nV2luZG93JywgJycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRSCgnc3RhdHVzdGV4dCcsICc8ZGl2IGNsYXNzPSJTVEFURUNIQU5HRSI+UEFVU0VEIGluICcgKyBtc2cuZmlsZSArICc6JyArIG1zZy5saW5lICsgJzwvZGl2PicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlQ29sb3IoUVMoIlN0ZXBPdmVyQnV0dG9uIiksIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlQ29sb3IoUVMoIlN0ZXBJbnRvQnV0dG9uIiksIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlQ29sb3IoUVMoIlN0ZXBPdXRCdXR0b24iKSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBRSCgiUGF1c2VSZXN1bWVCdXR0b24iLCAiUkVTVU1FIik7DQogICAgICAgICAgICAgICAgICAgICAgICBRRSgncXVlcnlUZXh0JywgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBRRSgncXVlcnlCdXR0b24nLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFFFKCdjbGVhckJ1dHRvbicsIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgUUUoJ2xvY2Fsc0J1dHRvbicsIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgUUUoJ2V2YWxCdXR0b24nLCAxKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5maWxlID09IGN1cnJlbnRNb2R1bGUpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgUUJDKHNvdXJjZUxpbmVEaXYobXNnLmxpbmUpLCBoaWdobGlnaHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gbXNnLmxpbmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgUShzb3VyY2VMaW5lRGl2KGN1cnJlbnRMaW5lKSkuc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiAnY2VudGVyJ30pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gbXNnLmxpbmU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpqID0geyBjbWQ6ICdTT1VSQ0UnLCBuYW1lOiBtc2cuZmlsZSB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShqaikpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ1JVTk5JTkcnOg0KICAgICAgICAgICAgICAgICAgICAgICAgUUgoJ3N0YXR1c3RleHQnLCAnPGRpdiBjbGFzcz0iU1RBVEVDSEFOR0UiPlJVTk5JTkcgJyArIG1zZy5maWxlICsgJzwvZGl2PicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgUUgoIlBhdXNlUmVzdW1lQnV0dG9uIiwgIlBBVVNFIik7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiU3RlcE92ZXJCdXR0b24iKSwgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiU3RlcEludG9CdXR0b24iKSwgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiU3RlcE91dEJ1dHRvbiIpLCAwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFFFKCdxdWVyeVRleHQnLCAwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFFFKCdxdWVyeUJ1dHRvbicsIDApOw0KICAgICAgICAgICAgICAgICAgICAgICAgUUUoJ2NsZWFyQnV0dG9uJywgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICBRRSgnbG9jYWxzQnV0dG9uJywgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICBRRSgnZXZhbEJ1dHRvbicsIDApOw0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdUSFJPVyc6DQogICAgICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHQgPSBleGNlcHRpb25IaWdobGlnaHQ7DQogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25NZXNzYWdlID0gJyoqICcgKyBtc2cubXNnICsgJyAqKic7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnREVUQUNIJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTdGF0dXMoIkRlYnVnZ2VyIERldGFjaGVkLi4uIik7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiUGF1c2VSZXN1bWVCdXR0b24iKSwgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICBRSCgiQXR0YWNoQnV0dG9uIiwgIkFUVEFDSCIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiU3RlcE92ZXJCdXR0b24iKSwgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiU3RlcEludG9CdXR0b24iKSwgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVDb2xvcihRUygiU3RlcE91dEJ1dHRvbiIpLCAwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFFFKCJsb2FkU291cmNlQnV0dG9uIiwgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICBRRSgibG9hZFNvdXJjZVRleHQiLCAwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFFFKCdxdWVyeVRleHQnLCAwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFFFKCdxdWVyeUJ1dHRvbicsIDApOw0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1vZHVsZSA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ1FVRVJZJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIFFBKCJxdWVyeVJlc3VsdHMiLCAnPGRpdiBjbGFzcz0iVkFSUVVFUlkiPicgKyBtc2cudmFyICsgJz08L2Rpdj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFFBKCJxdWVyeVJlc3VsdHMiLCAnPGRpdiBjbGFzcz0iVkFSUkVTVUxUIj4gICAnICsgbXNnLnZhbCArICc8L2Rpdj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdFVkFMJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIFFBKCJxdWVyeVJlc3VsdHMiLCAnPGRpdiBjbGFzcz0iVkFSUVVFUlkiPicgKyBtc2cuZXZhbCArICc9PC9kaXY+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICBRQSgicXVlcnlSZXN1bHRzIiwgJzxkaXYgY2xhc3M9IlZBUlJFU1VMVCI+ICAgJyArIG1zZy52YWwgKyAnPC9kaXY+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnU09VUkNFJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb2R1bGUgPSBtc2cubmFtZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb2R1bGVUb2tlbnMgPSBtc2cuc291cmNlLnNwbGl0KCdccicpLmpvaW4oJycpLnNwbGl0KCcgJykuam9pbignJm5ic3A7Jykuc3BsaXQoJ1x0Jykuam9pbignJm5ic3A7Jm5ic3A7Jm5ic3A7Jykuc3BsaXQoJ1xuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBRSCgnTG9nV2luZG93JywgJycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmVzID0gW107DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnRNb2R1bGVUb2tlbnMubGVuZ3RoOysraSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCc8ZGl2IGNsYXNzPSJTT1VSQ0VDT0RFUEFSRU5UIiBvbmRibGNsaWNrPSJvblRvZ2dsZUJyZWFrcG9pbnQoJyArIChpKzEpICsgJykiPicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJzxkaXYgY2xhc3M9IlNPVVJDRUNPREVMSU5FIiBpZD0iTCcgKyBzb3VyY2VMaW5lRGl2KGkgKyAxKSArICciPicgKyAoaSArIDEpICsgJzwvZGl2PicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJzxkaXYgY2xhc3M9IlNPVVJDRUNPREUiIGlkPSInICsgc291cmNlTGluZURpdihpICsgMSkgKyAnIj48Y29kZSBzdHlsZT0id2hpdGUtc3BhY2U6bm9ybWFsIj4nICsgY3VycmVudE1vZHVsZVRva2Vuc1tpXSArICc8L2NvZGU+PC9kaXY+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaCgnPC9kaXY+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbGluZSA9IGdldFNvdXJjZUxpbmUoKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgUUEoJ0xvZ1dpbmRvdycsIGxpbmVzLmpvaW4oJycpKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaW5lID49IDApDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgUUJDKHNvdXJjZUxpbmVEaXYoY2xpbmUpLCBoaWdobGlnaHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFEoc291cmNlTGluZURpdihjbGluZSkpLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdjZW50ZXInIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFEoJ0wnICsgc291cmNlTGluZURpdihjbGluZSkpLnNjcm9sbEludG9WaWV3KHsgaW5saW5lOiAnc3RhcnQnIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGl2cyA9IFFDSElMRFJFTigiQ3VycmVudEJyZWFrcG9pbnRzIik7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGRpdnMpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY3VycmVudE1vZHVsZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcuanMnKSB8fCBjdXJyZW50TW9kdWxlID09ICc8PE5BVElWRT4+JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRpdnNbaV0uaWQuc3RhcnRzV2l0aCgnX2JwX18nKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUJDKCdMJyArIHNvdXJjZUxpbmVEaXYoZGl2c1tpXS5pZC5zbGljZSg1KSksIGJwQ29sb3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXZzW2ldLmlkLnN0YXJ0c1dpdGgoJ19icF8nICsgY3VycmVudE1vZHVsZSArICdfJykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFCQygnTCcgKyBzb3VyY2VMaW5lRGl2KGRpdnNbaV0uaWQuc2xpY2UoNSArIGN1cnJlbnRNb2R1bGUubGVuZ3RoKSksIGJwQ29sb3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ0JSRUFLUE9JTlQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1zID0gW107DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIG1zZy5saXN0KQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IG1zZy5saXN0W2ldLmZpbGVOYW1lOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmbi50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcuanMnKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gJ19icF9fJyArIG1zZy5saXN0W2ldLmxpbmVOdW1iZXI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goJzxkaXYgaWQ9IicgKyBpZCArICciIGNsYXNzPSJCUkVBS1BPSU5UIiBvbmNsaWNrPSJvbkJyZWFrcG9pbnRDbGljayhcJycgKyBpZCArICdcJykiPjonICsgbXNnLmxpc3RbaV0ubGluZU51bWJlciArICc8L2Rpdj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSAnX2JwXycgKyBtc2cubGlzdFtpXS5maWxlTmFtZSArICdfJyArIG1zZy5saXN0W2ldLmxpbmVOdW1iZXI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goJzxkaXYgaWQ9IicgKyBpZCArICciIGNsYXNzPSJCUkVBS1BPSU5UIiBvbmNsaWNrPSJvbkJyZWFrcG9pbnRDbGljayhcJycgKyBpZCArICdcJykiPicgKyBtc2cubGlzdFtpXS5maWxlTmFtZSArICc6JyArIG1zZy5saXN0W2ldLmxpbmVOdW1iZXIgKyAnPC9kaXY+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgUUgoIkN1cnJlbnRCcmVha3BvaW50cyIsIGl0ZW1zLmpvaW4oJycpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdDQUxMU1RBQ0snOg0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENhbGxzdGFjayA9IG1zZy5jYWxsc3RhY2s7DQogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Q2FsbHN0YWNrKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdMT0NBTFMnOg0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdiBpbiBtc2cudmFsKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2cudmFsW3ZdLnR5cGUgPT0gJ3VuZGVmaW5lZCcpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQSgicXVlcnlSZXN1bHRzIiwgJzxkaXYgY2xhc3M9IlZBUlFVRVJZIj4nICsgbXNnLnZhbFt2XS5rZXkgKyAnPTwvZGl2PicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c29ja2V0LnNlbmQoJ3siY21kIjogIlFVRVJZIiwgInZhciI6ICInICsgbXNnLnZhbFt2XS5rZXkgKyAnIiwgImxldmVsIjogJyArIGdldENhbGxzdGFja0xldmVsKCkgKyAnfScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0NICAgICAgICBmdW5jdGlvbiBnZXRTb3VyY2VMaW5lKCkNICAgICAgICB7DSAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBjdXJyZW50Q2FsbHN0YWNrLmxlbmd0aDsgKytpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmIChRUygnX3N0YWNrXycgKyBpKS5jb2xvciA9PSBjYWxsc3RhY2tfc2NvcGUgJiYgY3VycmVudENhbGxzdGFja1tpXS5maWxlTmFtZSA9PSBjdXJyZW50TW9kdWxlKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjdXJyZW50Q2FsbHN0YWNrW2ldLmxpbmVOdW1iZXIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiAoLTEpOw0KICAgICAgICB9DQ0gICAgICAgIGZ1bmN0aW9uIHRvZ2dsZUNvbG9yKGlzdHlsZSwgc3RhdGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlzdHlsZVsiYmFja2dyb3VuZC1jb2xvciJdID0gc3RhdGUgPyAnYmx1ZScgOiAnZ3JleSc7DQogICAgICAgICAgICBpc3R5bGVbImN1cnNvciJdID0gc3RhdGUgPyAncG9pbnRlcicgOiAnZGVmYXVsdCc7DQogICAgICAgIH0NDSAgICAgICAgZnVuY3Rpb24gYXR0YWNoRGVidWdnZXIoKQ0KICAgICAgICB7DQogICAgICAgICAgICBzd2l0Y2goUSgiQXR0YWNoQnV0dG9uIikuaW5uZXJIVE1MKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNhc2UgJ0FUVEFDSCc6DQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTdGF0dXMoIkF0dGFjaGluZyBkZWJ1Z2dlci4uLiIpOw0KICAgICAgICAgICAgICAgICAgICB3c29ja2V0LnNlbmQoJ3siY21kIjogIkFUVEFDSCJ9Jyk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ0RFVEFDSCc6DQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDYWxsc3RhY2sgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheUNhbGxzdGFjaygpOw0KDQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTdGF0dXMoIkRldGFjaGluZyBkZWJ1Z2dlci4uLiIpOw0KICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlID0gJyc7DQogICAgICAgICAgICAgICAgICAgIHdzb2NrZXQuc2VuZCgneyJjbWQiOiAiREVUQUNIIn0nKTsNCiAgICAgICAgICAgICAgICAgICAgUVYoJ3BhZ2VfY29udGVudCcsIGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NICAgICAgICBmdW5jdGlvbiBwYXVzZVJlc3VtZSgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHN3aXRjaChRKCJQYXVzZVJlc3VtZUJ1dHRvbiIpLmlubmVySFRNTCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICdQQVVTRSc6DQogICAgICAgICAgICAgICAgICAgIHdzb2NrZXQuc2VuZCgneyJjbWQiOiAiUEFVU0UifScpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdSRVNVTUUnOg0KICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHQgPSBzb3VyY2VIaWdobGlnaHQ7DQogICAgICAgICAgICAgICAgICAgIHdzb2NrZXQuc2VuZCgneyJjbWQiOiAiUkVTVU1FIn0nKTsNCiAgICAgICAgICAgICAgICAgICAgUUJDKHNvdXJjZUxpbmVEaXYoY3VycmVudExpbmUpLCAnd2hpdGUnKTsNCg0KICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2FsbHN0YWNrID0gW107DQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXlDYWxsc3RhY2soKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NICAgICAgICBmdW5jdGlvbiBzdGVwT3ZlcigpDQogICAgICAgIHsNCiAgICAgICAgICAgIGhpZ2hsaWdodCA9IHNvdXJjZUhpZ2hsaWdodDsNCiAgICAgICAgICAgIFFCQyhzb3VyY2VMaW5lRGl2KGN1cnJlbnRMaW5lKSwgJ3doaXRlJyk7DQogICAgICAgICAgICB3c29ja2V0LnNlbmQoJ3siY21kIjogIlNURVBPVkVSIn0nKTsNCiAgICAgICAgfQ0gICAgICAgIGZ1bmN0aW9uIHN0ZXBJbnRvKCkNICAgICAgICB7DQogICAgICAgICAgICBoaWdobGlnaHQgPSBzb3VyY2VIaWdobGlnaHQ7DQogICAgICAgICAgICBRQkMoc291cmNlTGluZURpdihjdXJyZW50TGluZSksICd3aGl0ZScpOw0KICAgICAgICAgICAgd3NvY2tldC5zZW5kKCd7ImNtZCI6ICJTVEVQSU5UTyJ9Jyk7DQogICAgICAgIH0NICAgICAgICBmdW5jdGlvbiBzdGVwT3V0KCkNCiAgICAgICAgew0KICAgICAgICAgICAgaGlnaGxpZ2h0ID0gc291cmNlSGlnaGxpZ2h0Ow0KICAgICAgICAgICAgUUJDKHNvdXJjZUxpbmVEaXYoY3VycmVudExpbmUpLCAnd2hpdGUnKTsNCiAgICAgICAgICAgIHdzb2NrZXQuc2VuZCgneyJjbWQiOiAiU1RFUE9VVCJ9Jyk7DQogICAgICAgIH0NICAgICAgICANICAgICAgICBmdW5jdGlvbiBkZWxCcmVha3BvaW50KCkNICAgICAgICB7DQogICAgICAgICAgICBRVihzZWxlY3RlZEJyZWFrcG9pbnQsIDApOw0KICAgICAgICAgICAgc2VsZWN0ZWRCcmVha3BvaW50ID0gIiI7DQogICAgICAgICAgICBRRSgiZGVsQnJlYWtwb2ludEJ1dHRvbiIsIDApOw0KICAgICAgICB9DSAgICAgICAgZnVuY3Rpb24gb25CcmVha3BvaW50Q2xpY2soaWQpDSAgICAgICAgew0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkQnJlYWtwb2ludCA9PSBpZCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBRUyhpZClbImJhY2tncm91bmQtY29sb3IiXSA9ICd3aGl0ZSc7DQogICAgICAgICAgICAgICAgc2VsZWN0ZWRCcmVha3BvaW50ID0gIiI7DQogICAgICAgICAgICAgICAgUUUoImRlbEJyZWFrcG9pbnRCdXR0b24iLCAwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRCcmVha3BvaW50ICE9ICIiKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgUVMoc2VsZWN0ZWRCcmVha3BvaW50KVsiYmFja2dyb3VuZC1jb2xvciJdID0gJ3doaXRlJzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgUVMoaWQpWyJiYWNrZ3JvdW5kLWNvbG9yIl0gPSAneWVsbG93JzsNCiAgICAgICAgICAgICAgICBzZWxlY3RlZEJyZWFrcG9pbnQgPSBpZDsNCiAgICAgICAgICAgICAgICBRRSgiZGVsQnJlYWtwb2ludEJ1dHRvbiIsIDEpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnRDYWxsc3RhY2subGVuZ3RoOyArK2kpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgUVMoJ19zdGFja18nICsgaSkuY29sb3IgPSBjYWxsc3RhY2tfZGVmYXVsdDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBicCA9IFFIVkFMKGlkKS5zcGxpdCgnOicpWzBdOw0KICAgICAgICAgICAgdmFyIGpqID0geyBjbWQ6ICdTT1VSQ0UnLCBuYW1lOiBicCA9PSAnJyA/ICc8PE5BVElWRT4+JyA6IGJwIH07DQogICAgICAgICAgICB3c29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoamopKTsgICAgICAgIA0KICAgICAgICB9DSAgICAgICAgZnVuY3Rpb24gZ2V0Q2FsbHN0YWNrTGV2ZWwoKQ0gICAgICAgIHsNCiAgICAgICAgICAgIC8vIERldGVybWluZSB0aGUgQ2FsbHN0YWNrIExldmVsDQogICAgICAgICAgICB2YXIgbGV2ZWwgPSAtMTsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VycmVudENhbGxzdGFjay5sZW5ndGg7ICsraSkgew0KICAgICAgICAgICAgICAgIGlmIChRUygnX3N0YWNrXycgKyBpKS5jb2xvciA9PSBjYWxsc3RhY2tfc2NvcGUpIHsNCiAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAwIC0gKGkgKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIChsZXZlbCk7DQogICAgICAgIH0NICAgICAgICBmdW5jdGlvbiBxdWVyeVZhbCgpDSAgICAgICAgew0KICAgICAgICAgICAgLy9RQSgicXVlcnlSZXN1bHRzIiwgJzxkaXYgY2xhc3M9IlZBUlFVRVJZIj4nICsgUVZBTCgncXVlcnlUZXh0JykgKyAnPTwvZGl2PicpOw0KICAgICAgICAgICAgd3NvY2tldC5zZW5kKCd7ImNtZCI6ICJRVUVSWSIsICJ2YXIiOiAiJyArIFFWQUwoJ3F1ZXJ5VGV4dCcpICsgJyIsICJsZXZlbCI6ICcgKyBnZXRDYWxsc3RhY2tMZXZlbCgpICsgJ30nKTsNCiAgICAgICAgICAgIFFWQUwoJ3F1ZXJ5VGV4dCcsICIiKTsNCiAgICAgICAgfQ0gICAgICAgIGZ1bmN0aW9uIGV2YWxTdHJpbmcoKQ0gICAgICAgIHsNCiAgICAgICAgICAgIHdzb2NrZXQuc2VuZCgneyJjbWQiOiAiRVZBTCIsICJldmFsIjogIicgKyBRVkFMKCdxdWVyeVRleHQnKSArICciLCAibGV2ZWwiOiAnICsgZ2V0Q2FsbHN0YWNrTGV2ZWwoKSArICd9Jyk7DQogICAgICAgICAgICBRVkFMKCdxdWVyeVRleHQnLCAiIik7DQogICAgICAgIH0NICAgICAgICBmdW5jdGlvbiBsb2NhbHNRdWVyeSgpDSAgICAgICAgew0KICAgICAgICAgICAgUUEoInF1ZXJ5UmVzdWx0cyIsICc8ZGl2IGNsYXNzPSJWQVJRVUVSWSI+TG9jYWxzOiZuYnNwOzwvZGl2PicpOw0KICAgICAgICAgICAgd3NvY2tldC5zZW5kKCd7ImNtZCI6ICJMT0NBTFMiLCAibGV2ZWwiOiAnICsgZ2V0Q2FsbHN0YWNrTGV2ZWwoKSArICd9Jyk7DQogICAgICAgIH0NICAgICAgICBmdW5jdGlvbiBjbGVhclF1ZXJ5KCkNICAgICAgICB7DQogICAgICAgICAgICBRSCgncXVlcnlSZXN1bHRzJywgJycpOw0KICAgICAgICB9DSAgICAgICAgZnVuY3Rpb24gZGlzcGxheVN0YXR1cyhtc2csIG1zZ0NsYXNzKQ0gICAgICAgIHsNCiAgICAgICAgICAgIFFIKCdzdGF0dXN0ZXh0JywgJzxkaXYgY2xhc3M9IicgKyAobXNnQ2xhc3M/bXNnQ2xhc3M6J0dFTkVSSUNfTU9EVUxFJykgKyAnIj4nICsgbXNnICsgJzwvZGl2PicpOw0KICAgICAgICB9DSAgICAgICAgZnVuY3Rpb24gc291cmNlTGluZURpdihsaW5lKQ0gICAgICAgIHsNCiAgICAgICAgICAgIHJldHVybiAoJ19fc3JjJyArIGxpbmUpOw0KICAgICAgICB9DQ0gICAgICAgIGZ1bmN0aW9uIG9uVG9nZ2xlQnJlYWtwb2ludChsaW5lKQ0gICAgICAgIHsNCiAgICAgICAgICAgIFFCQygnTCcgKyBzb3VyY2VMaW5lRGl2KGxpbmUpLCBicENvbG9yKTsNCiAgICAgICAgICAgIHZhciBmbiA9IGN1cnJlbnRNb2R1bGU7DQoNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VycmVudENhbGxzdGFjay5sZW5ndGg7ICsraSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoUVMoJ19zdGFja18nICsgaSkuY29sb3IgPT0gY2FsbHN0YWNrX3Njb3BlKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgZm4gPSBjdXJyZW50Q2FsbHN0YWNrW2ldLmZpbGVOYW1lLnNwbGl0KCdcXCcpLmpvaW4oJ1xcXFwnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHdzb2NrZXQuc2VuZCgneyJjbWQiOiAiQlJFQUtQT0lOVCIsICJmaWxlIjoiJyArIGZuICsgJyIsICJsaW5lIjonICsgbGluZSArICcsICJtb2RlIjoiYWRkIn0nKTsNCiAgICAgICAgfQ0gICAgICAgIGZ1bmN0aW9uIG9uRHVtcEhlYXAoKQ0gICAgICAgIHsNCiAgICAgICAgICAgIHdzb2NrZXQuc2VuZCgneyJjbWQiOiAiSEVBUCJ9Jyk7DQogICAgICAgIH0NICAgICAgICBmdW5jdGlvbiBmb3JjZUdDKCkNICAgICAgICB7DQogICAgICAgICAgICB3c29ja2V0LnNlbmQoJ3siY21kIjogIkdDIn0nKTsNCiAgICAgICAgfQ0gICAgICAgIGZ1bmN0aW9uIGRpc3BsYXlDYWxsc3RhY2soKQ0gICAgICAgIHsNCiAgICAgICAgICAgIHZhciBkaXNwbGF5ID0gW107DQogICAgICAgICAgICB2YXIgaW5kZW50ID0gJy0tPiZuYnNwOyc7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnRDYWxsc3RhY2subGVuZ3RoOyArK2kpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDYWxsc3RhY2tbaV0uZnVuY05hbWUgPT0gJycpIHsgY3VycmVudENhbGxzdGFja1tpXS5mdW5jTmFtZSA9ICcoYW5vbnltb3VzKSc7IH0NCiAgICAgICAgICAgICAgICB2YXIgZm5hbWUgPSBjdXJyZW50Q2FsbHN0YWNrW2ldLmZpbGVOYW1lLnNwbGl0KCdcXCcpLmpvaW4oJ1xcXFwnKTsNCg0KICAgICAgICAgICAgICAgIGRpc3BsYXkucHVzaCgnPGRpdiBkZXB0aD0iJyArIChpKzEpICsgJyIgaWQ9Il9zdGFja18nICsgaSArICciIGNsYXNzPSJDQUxMU1RBQ0siIG9uY2xpY2s9Im9uQ2FsbHN0YWNrQ2xpY2soXCcnICsgY3VycmVudENhbGxzdGFjay5sZW5ndGggKyAnXCcsIFwnX3N0YWNrXycgKyBpICsgJ1wnLCBcJycgKyBmbmFtZSArICdcJykiPicgKyBpbmRlbnQgKyBjdXJyZW50Q2FsbHN0YWNrW2ldLmZ1bmNOYW1lICsgJzonICsgY3VycmVudENhbGxzdGFja1tpXS5saW5lTnVtYmVyICsgJzwvZGl2PicpOw0KICAgICAgICAgICAgICAgIGluZGVudCA9ICcmbmJzcDsmbmJzcDsmbmJzcDsnICsgaW5kZW50Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgUUgoJ0NhbGxzdGFja1dpbmRvdycsIGRpc3BsYXkuam9pbignJykpOw0KDQogICAgICAgICAgICBpZiAoY3VycmVudENhbGxzdGFjay5sZW5ndGggPiAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFFTKCdfc3RhY2tfMCcpLmNvbG9yID0gY2FsbHN0YWNrX3Njb3BlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DSAgICAgICAgZnVuY3Rpb24gb25DYWxsc3RhY2tDbGljayhsZW4sIGlkLCBmaWxlbmFtZSkNICAgICAgICB7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFFTKCdfc3RhY2tfJyArIGkpLmNvbG9yID0gY2FsbHN0YWNrX2RlZmF1bHQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBRUyhpZCkuY29sb3IgPSBjYWxsc3RhY2tfc2NvcGU7DQogICAgICAgICAgICB2YXIgamogPSB7IGNtZDogJ1NPVVJDRScsIG5hbWU6IGZpbGVuYW1lIH07DQogICAgICAgICAgICB3c29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoamopKTsNCiAgICAgICAgfQ0gICAgICAgIGZ1bmN0aW9uIG1hbnVhbGx5TG9hZFNvdXJjZSgpDSAgICAgICAgew0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdXJyZW50Q2FsbHN0YWNrLmxlbmd0aDsgKytpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFFTKCdfc3RhY2tfJyArIGkpLmNvbG9yID0gY2FsbHN0YWNrX2RlZmF1bHQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBRSCgnTG9nV2luZG93JywgJycpOw0KDQogICAgICAgICAgICB2YXIgamogPSB7IGNtZDogJ1NPVVJDRScsIG5hbWU6IFFWQUwoJ2xvYWRTb3VyY2VUZXh0JykgPT0gJyc/Jzw8TkFUSVZFPj4nOlFWQUwoJ2xvYWRTb3VyY2VUZXh0JykgfTsNCiAgICAgICAgICAgIHdzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShqaikpOw0KICAgICAgICB9DSAgICAgICAgLy8gUG9sbCB0aGUgc2VydmVyLCBpZiBpdCByZXNwb25kcywgcmVmcmVzaCB0aGUgcGFnZS4NCiAgICAgICAgZnVuY3Rpb24gc2VydmVyUG9sbCgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHhkciA9IG51bGw7DQogICAgICAgICAgICB0cnkgeyB4ZHIgPSBuZXcgWERvbWFpblJlcXVlc3QoKTsgfSBjYXRjaCAoZSkgeyB9DQogICAgICAgICAgICBpZiAoIXhkcikgeGRyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7DQogICAgICAgICAgICB4ZHIub3BlbigiSEVBRCIsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsNCiAgICAgICAgICAgIHhkci50aW1lb3V0ID0gMTUwMDA7DQogICAgICAgICAgICB4ZHIub25sb2FkID0gZnVuY3Rpb24gKCkgeyByZWxvYWQoKTsgfTsNCiAgICAgICAgICAgIHhkci5vbmVycm9yID0geGRyLm9udGltZW91dCA9IGZ1bmN0aW9uICgpIHsgc2V0VGltZW91dChzZXJ2ZXJQb2xsLCAyMDAwKTsgfTsNCiAgICAgICAgICAgIHhkci5zZW5kKCk7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiByZWxvYWQoKSB7IHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7IH0NCg0gICAgPC9zY3JpcHQ+DQo8L2JvZHk+DQo8L2h0bWw+DQo='; var optTargetHost = '127.0.0.1'; var optTargetPort = 9091;