-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathradlexWordCloud.html
20 lines (19 loc) · 102 KB
/
radlexWordCloud.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<style>body{background-color:white;}</style>
<script src="data:application/javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gdHJ5RXZhbCh0YXNrKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8gQXR0ZW1wdCBldmFsKCkgYm90aCB3aXRoIGFuZCB3aXRob3V0IGVuY2xvc2luZyBpbiBwYXJlbnRoZXNlcy4KICAvLyBOb3RlIHRoYXQgZW5jbG9zaW5nIGNvZXJjZXMgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpbnRvCiAgLy8gYW4gZXhwcmVzc2lvbiB0aGF0IGV2YWwoKSBjYW4gcGFyc2UKICAvLyAob3RoZXJ3aXNlLCBhIFN5bnRheEVycm9yIGlzIHRocm93bikKICBmdW5jdGlvbiB0cnlFdmFsKGNvZGUpIHsKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgdHJ5IHsKICAgICAgcmVzdWx0ID0gZXZhbCgiKCIgKyBjb2RlICsgIikiKTsKICAgIH0gY2F0Y2goZXJyb3IpIHsKICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBTeW50YXhFcnJvcikpIHsKICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIHJlc3VsdCA9IGV2YWwoY29kZSk7CiAgICAgIH0gY2F0Y2goZSkgewogICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHsKICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGZ1bmN0aW9uIGluaXRTaXppbmcoZWwpIHsKICAgIHZhciBzaXppbmcgPSBzaXppbmdQb2xpY3koZWwpOwogICAgaWYgKCFzaXppbmcpCiAgICAgIHJldHVybjsKCiAgICB2YXIgY2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImh0bWx3aWRnZXRfY29udGFpbmVyIik7CiAgICBpZiAoIWNlbCkKICAgICAgcmV0dXJuOwoKICAgIGlmICh0eXBlb2Yoc2l6aW5nLnBhZGRpbmcpICE9PSAidW5kZWZpbmVkIikgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm1hcmdpbiA9ICIwIjsKICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nID0gcGFkZGluZ1RvQ3NzKHVucGFja1BhZGRpbmcoc2l6aW5nLnBhZGRpbmcpKTsKICAgIH0KCiAgICBpZiAoc2l6aW5nLmZpbGwpIHsKICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLndpZHRoID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmhlaWdodCA9ICIxMDAlIjsKICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLndpZHRoID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBpZiAoY2VsKSB7CiAgICAgICAgY2VsLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgICAgICB2YXIgcGFkID0gdW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZyk7CiAgICAgICAgY2VsLnN0eWxlLnRvcCA9IHBhZC50b3AgKyAicHgiOwogICAgICAgIGNlbC5zdHlsZS5yaWdodCA9IHBhZC5yaWdodCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmJvdHRvbSA9IHBhZC5ib3R0b20gKyAicHgiOwogICAgICAgIGNlbC5zdHlsZS5sZWZ0ID0gcGFkLmxlZnQgKyAicHgiOwogICAgICAgIGVsLnN0eWxlLndpZHRoID0gIjEwMCUiOwogICAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICIxMDAlIjsKICAgICAgfQoKICAgICAgcmV0dXJuIHsKICAgICAgICBnZXRXaWR0aDogZnVuY3Rpb24oKSB7IHJldHVybiBjZWwub2Zmc2V0V2lkdGg7IH0sCiAgICAgICAgZ2V0SGVpZ2h0OiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKCiAgICB9IGVsc2UgewogICAgICBlbC5zdHlsZS53aWR0aCA9IHB4KHNpemluZy53aWR0aCk7CiAgICAgIGVsLnN0eWxlLmhlaWdodCA9IHB4KHNpemluZy5oZWlnaHQpOwoKICAgICAgcmV0dXJuIHsKICAgICAgICBnZXRXaWR0aDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZWwub2Zmc2V0SGVpZ2h0OyB9CiAgICAgIH07CiAgICB9CiAgfQoKICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9ucyBmb3IgbWV0aG9kcwogIHZhciBkZWZhdWx0cyA9IHsKICAgIGZpbmQ6IGZ1bmN0aW9uKHNjb3BlKSB7CiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCAiLiIgKyB0aGlzLm5hbWUpOwogICAgfSwKICAgIHJlbmRlckVycm9yOiBmdW5jdGlvbihlbCwgZXJyKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKCiAgICAgIHRoaXMuY2xlYXJFcnJvcihlbCk7CgogICAgICAvLyBBZGQgYWxsIHRoZXNlIGVycm9yIGNsYXNzZXMsIGFzIFNoaW55IGRvZXMKICAgICAgdmFyIGVyckNsYXNzID0gInNoaW55LW91dHB1dC1lcnJvciI7CiAgICAgIGlmIChlcnIudHlwZSAhPT0gbnVsbCkgewogICAgICAgIC8vIHVzZSB0aGUgY2xhc3NlcyBvZiB0aGUgZXJyb3IgY29uZGl0aW9uIGFzIENTUyBjbGFzcyBuYW1lcwogICAgICAgIGVyckNsYXNzID0gZXJyQ2xhc3MgKyAiICIgKyAkLm1hcChhc0FycmF5KGVyci50eXBlKSwgZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgcmV0dXJuIGVyckNsYXNzICsgIi0iICsgdHlwZTsKICAgICAgICB9KS5qb2luKCIgIik7CiAgICAgIH0KICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgaHRtbHdpZGdldHMtZXJyb3IiOwoKICAgICAgLy8gSXMgZWwgaW5saW5lIG9yIGJsb2NrPyBJZiBpbmxpbmUgb3IgaW5saW5lLWJsb2NrLCBqdXN0IGRpc3BsYXk6bm9uZSBpdAogICAgICAvLyBhbmQgYWRkIGFuIGlubGluZSBlcnJvci4KICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuY3NzKCJkaXNwbGF5Iik7CiAgICAgICRlbC5kYXRhKCJyZXN0b3JlLWRpc3BsYXktbW9kZSIsIGRpc3BsYXkpOwoKICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7CiAgICAgICAgJGVsLmhpZGUoKTsKICAgICAgICBpZiAoZXJyLm1lc3NhZ2UgIT09ICIiKSB7CiAgICAgICAgICB2YXIgZXJyb3JTcGFuID0gJCgiPHNwYW4+IikuYWRkQ2xhc3MoZXJyQ2xhc3MpOwogICAgICAgICAgZXJyb3JTcGFuLnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yU3Bhbik7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpIHsKICAgICAgICAvLyBJZiBibG9jaywgYWRkIGFuIGVycm9yIGp1c3QgYWZ0ZXIgdGhlIGVsLCBzZXQgdmlzaWJpbGl0eTpub25lIG9uIHRoZQogICAgICAgIC8vIGVsLCBhbmQgcG9zaXRpb24gdGhlIGVycm9yIHRvIGJlIG9uIHRvcCBvZiB0aGUgZWwuCiAgICAgICAgLy8gTWFyayBpdCB3aXRoIGEgdW5pcXVlIElEIGFuZCBDU1MgY2xhc3Mgc28gd2UgY2FuIHJlbW92ZSBpdCBsYXRlci4KICAgICAgICAkZWwuY3NzKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvckRpdiA9ICQoIjxkaXY+IikuYWRkQ2xhc3MoZXJyQ2xhc3MpLmNzcygicG9zaXRpb24iLCAiYWJzb2x1dGUiKQogICAgICAgICAgICAuY3NzKCJ0b3AiLCBlbC5vZmZzZXRUb3ApCiAgICAgICAgICAgIC5jc3MoImxlZnQiLCBlbC5vZmZzZXRMZWZ0KQogICAgICAgICAgICAvLyBzZXR0aW5nIHdpZHRoIGNhbiBwdXNoIG91dCB0aGUgcGFnZSBzaXplLCBmb3JjaW5nIG90aGVyd2lzZQogICAgICAgICAgICAvLyB1bm5lY2Vzc2FyeSBzY3JvbGxiYXJzIHRvIGFwcGVhciBhbmQgbWFraW5nIGl0IGltcG9zc2libGUgZm9yCiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHRvIHNocmluazsgc28gdXNlIG1heC13aWR0aCBpbnN0ZWFkCiAgICAgICAgICAgIC5jc3MoIm1heFdpZHRoIiwgZWwub2Zmc2V0V2lkdGgpCiAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICBlcnJvckRpdi50ZXh0KGVyci5tZXNzYWdlKTsKICAgICAgICAgICRlbC5hZnRlcihlcnJvckRpdik7CgogICAgICAgICAgLy8gUmVhbGx5IGR1bWIgd2F5IHRvIGtlZXAgdGhlIHNpemUvcG9zaXRpb24gb2YgdGhlIGVycm9yIGluIHN5bmMgd2l0aAogICAgICAgICAgLy8gdGhlIHBhcmVudCBlbGVtZW50IGFzIHRoZSB3aW5kb3cgaXMgcmVzaXplZCBvciB3aGF0ZXZlci4KICAgICAgICAgIHZhciBpbnRJZCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIWVycm9yRGl2WzBdLnBhcmVudEVsZW1lbnQpIHsKICAgICAgICAgICAgICBjbGVhckludGVydmFsKGludElkKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3JEaXYKICAgICAgICAgICAgICAuY3NzKCJ0b3AiLCBlbC5vZmZzZXRUb3ApCiAgICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgICAuY3NzKCJoZWlnaHQiLCBlbC5vZmZzZXRIZWlnaHQpOwogICAgICAgICAgfSwgNTAwKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBjbGVhckVycm9yOiBmdW5jdGlvbihlbCkgewogICAgICB2YXIgJGVsID0gJChlbCk7CiAgICAgIHZhciBkaXNwbGF5ID0gJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIik7CiAgICAgICRlbC5kYXRhKCJyZXN0b3JlLWRpc3BsYXktbW9kZSIsIG51bGwpOwoKICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7CiAgICAgICAgaWYgKGRpc3BsYXkpCiAgICAgICAgICAkZWwuY3NzKCJkaXNwbGF5IiwgZGlzcGxheSk7CiAgICAgICAgJChlbC5uZXh0U2libGluZykuZmlsdGVyKCIuaHRtbHdpZGdldHMtZXJyb3IiKS5yZW1vdmUoKTsKICAgICAgfSBlbHNlIGlmIChkaXNwbGF5ID09PSAiYmxvY2siKXsKICAgICAgICAkZWwuY3NzKCJ2aXNpYmlsaXR5IiwgImluaGVyaXQiKTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9CiAgICB9LAogICAgc2l6aW5nOiB7fQogIH07CgogIC8vIENhbGxlZCBieSB3aWRnZXQgYmluZGluZ3MgdG8gcmVnaXN0ZXIgYSBuZXcgdHlwZSBvZiB3aWRnZXQuIFRoZSBkZWZpbml0aW9uCiAgLy8gb2JqZWN0IGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKICAvLyAtIG5hbWUgKHJlcXVpcmVkKSAtIEEgc3RyaW5nIGluZGljYXRpbmcgdGhlIGJpbmRpbmcgbmFtZSwgd2hpY2ggd2lsbCBiZQogIC8vICAgdXNlZCBieSBkZWZhdWx0IGFzIHRoZSBDU1MgY2xhc3NuYW1lIHRvIGxvb2sgZm9yLgogIC8vIC0gaW5pdGlhbGl6ZSAob3B0aW9uYWwpIC0gQSBmdW5jdGlvbihlbCkgdGhhdCB3aWxsIGJlIGNhbGxlZCBvbmNlIHBlcgogIC8vICAgd2lkZ2V0IGVsZW1lbnQ7IGlmIGEgdmFsdWUgaXMgcmV0dXJuZWQsIGl0IHdpbGwgYmUgcGFzc2VkIGFzIHRoZSB0aGlyZAogIC8vICAgdmFsdWUgdG8gcmVuZGVyVmFsdWUuCiAgLy8gLSByZW5kZXJWYWx1ZSAocmVxdWlyZWQpIC0gQSBmdW5jdGlvbihlbCwgZGF0YSwgaW5pdFZhbHVlKSB0aGF0IHdpbGwgYmUKICAvLyAgIGNhbGxlZCB3aXRoIGRhdGEuIFN0YXRpYyBjb250ZXh0cyB3aWxsIGNhdXNlIHRoaXMgdG8gYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICBlbGVtZW50OyBTaGlueSBhcHBzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgcGVyCiAgLy8gICBlbGVtZW50LCBhcyB0aGUgZGF0YSBjaGFuZ2VzLgogIHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXQgPSBmdW5jdGlvbihkZWZpbml0aW9uKSB7CiAgICBpZiAoIWRlZmluaXRpb24ubmFtZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldpZGdldCBtdXN0IGhhdmUgYSBuYW1lIik7CiAgICB9CiAgICBpZiAoIWRlZmluaXRpb24udHlwZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldpZGdldCBtdXN0IGhhdmUgYSB0eXBlIik7CiAgICB9CiAgICAvLyBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IG91dHB1dCB3aWRnZXRzCiAgICBpZiAoZGVmaW5pdGlvbi50eXBlICE9PSAib3V0cHV0IikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCB3aWRnZXQgdHlwZSAnIiArIGRlZmluaXRpb24udHlwZSArICInIik7CiAgICB9CiAgICAvLyBUT0RPOiBWZXJpZnkgdGhhdCAubmFtZSBpcyBhIHZhbGlkIENTUyBjbGFzc25hbWUKCiAgICAvLyBTdXBwb3J0IG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucy4gT2xkLXN0eWxlIGNsYXNzLWJvdW5kCiAgICAvLyBkZWZpbml0aW9ucyBoYXZlIG9uZSB3aWRnZXQgIm9iamVjdCIgcGVyIHdpZGdldCBwZXIgdHlwZS9jbGFzcyBvZgogICAgLy8gd2lkZ2V0OyB0aGUgcmVuZGVyVmFsdWUgYW5kIHJlc2l6ZSBtZXRob2RzIG9uIHN1Y2ggd2lkZ2V0IG9iamVjdHMKICAgIC8vIHRha2UgZWwgYW5kIGluc3RhbmNlIGFyZ3VtZW50cywgYmVjYXVzZSB0aGUgd2lkZ2V0IG9iamVjdCBjYW4ndAogICAgLy8gc3RvcmUgdGhlbS4gTmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldAogICAgLy8gb2JqZWN0IHBlciB3aWRnZXQgaW5zdGFuY2U7IHRoZSBkZWZpbml0aW9uIHRoYXQncyBwYXNzZWQgaW4gZG9lc24ndAogICAgLy8gcHJvdmlkZSByZW5kZXJWYWx1ZSBvciByZXNpemUgbWV0aG9kcyBhdCBhbGwsIGp1c3QgdGhlIHNpbmdsZSBtZXRob2QKICAgIC8vICAgZmFjdG9yeShlbCwgd2lkdGgsIGhlaWdodCkKICAgIC8vIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IHRoYXQgaGFzIHJlbmRlclZhbHVlKHgpIGFuZCByZXNpemUodywgaCkuCiAgICAvLyBUaGlzIGVuYWJsZXMgYSBmYXIgbW9yZSBuYXR1cmFsIHByb2dyYW1taW5nIHN0eWxlIGZvciB0aGUgd2lkZ2V0CiAgICAvLyBhdXRob3IsIHdobyBjYW4gc3RvcmUgcGVyLWluc3RhbmNlIHN0YXRlIHVzaW5nIGVpdGhlciBPTy1zdHlsZQogICAgLy8gaW5zdGFuY2UgZmllbGRzIG9yIGZ1bmN0aW9uYWwtc3R5bGUgY2xvc3VyZSB2YXJpYWJsZXMgKEkgZ3Vlc3MgdGhpcwogICAgLy8gaXMgaW4gY29udHJhc3QgdG8gd2hhdCBjYW4gb25seSBiZSBjYWxsZWQgQy1zdHlsZSBwc2V1ZG8tT08gd2hpY2ggaXMKICAgIC8vIHdoYXQgd2UgcmVxdWlyZWQgYmVmb3JlKS4KICAgIGlmIChkZWZpbml0aW9uLmZhY3RvcnkpIHsKICAgICAgZGVmaW5pdGlvbiA9IGNyZWF0ZUxlZ2FjeURlZmluaXRpb25BZGFwdGVyKGRlZmluaXRpb24pOwogICAgfQoKICAgIGlmICghZGVmaW5pdGlvbi5yZW5kZXJWYWx1ZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldpZGdldCBtdXN0IGhhdmUgYSByZW5kZXJWYWx1ZSBmdW5jdGlvbiIpOwogICAgfQoKICAgIC8vIEZvciBzdGF0aWMgcmVuZGVyaW5nIChub24tU2hpbnkpLCB1c2UgYSBzaW1wbGUgd2lkZ2V0IHJlZ2lzdHJhdGlvbgogICAgLy8gc2NoZW1lLiBXZSBhbHNvIHVzZSB0aGlzIHNjaGVtZSBmb3IgU2hpbnkgYXBwcy9kb2N1bWVudHMgdGhhdCBhbHNvCiAgICAvLyBjb250YWluIHN0YXRpYyB3aWRnZXRzLgogICAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgPSB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyB8fCBbXTsKICAgIC8vIE1lcmdlIGRlZmF1bHRzIGludG8gdGhlIGRlZmluaXRpb247IGRvbid0IG11dGF0ZSB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbi4KICAgIHZhciBzdGF0aWNCaW5kaW5nID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgZGVmaW5pdGlvbik7CiAgICBvdmVycmlkZU1ldGhvZChzdGF0aWNCaW5kaW5nLCAiZmluZCIsIGZ1bmN0aW9uKHN1cGVyZnVuYykgewogICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IHN1cGVyZnVuYyhzY29wZSk7CiAgICAgICAgLy8gRmlsdGVyIG91dCBTaGlueSBvdXRwdXRzLCB3ZSBvbmx5IHdhbnQgdGhlIHN0YXRpYyBraW5kCiAgICAgICAgcmV0dXJuIGZpbHRlckJ5Q2xhc3MocmVzdWx0cywgImh0bWwtd2lkZ2V0LW91dHB1dCIsIGZhbHNlKTsKICAgICAgfTsKICAgIH0pOwogICAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMucHVzaChzdGF0aWNCaW5kaW5nKTsKCiAgICBpZiAoc2hpbnlNb2RlKSB7CiAgICAgIC8vIFNoaW55IGlzIHJ1bm5pbmcuIFJlZ2lzdGVyIHRoZSBkZWZpbml0aW9uIHdpdGggYW4gb3V0cHV0IGJpbmRpbmcuCiAgICAgIC8vIFRoZSBkZWZpbml0aW9uIGl0c2VsZiB3aWxsIG5vdCBiZSB0aGUgb3V0cHV0IGJpbmRpbmcsIGluc3RlYWQKICAgICAgLy8gd2Ugd2lsbCBtYWtlIGFuIG91dHB1dCBiaW5kaW5nIG9iamVjdCB0aGF0IGRlbGVnYXRlcyB0byB0aGUKICAgICAgLy8gZGVmaW5pdGlvbi4gVGhpcyBpcyBiZWNhdXNlIHdlIGZvb2xpc2hseSB1c2VkIHRoZSBzYW1lIG1ldGhvZAogICAgICAvLyBuYW1lIChyZW5kZXJWYWx1ZSkgZm9yIGh0bWx3aWRnZXRzIGRlZmluaXRpb24gYW5kIFNoaW55IGJpbmRpbmdzCiAgICAgIC8vIGJ1dCB0aGV5IGFjdHVhbGx5IGhhdmUgcXVpdGUgZGlmZmVyZW50IHNlbWFudGljcyAodGhlIFNoaW55CiAgICAgIC8vIGJpbmRpbmdzIHJlY2VpdmUgZGF0YSB0aGF0IGluY2x1ZGVzIGxvdHMgb2YgbWV0YWRhdGEgdGhhdCBpdAogICAgICAvLyBzdHJpcHMgb2ZmIGJlZm9yZSBjYWxsaW5nIGh0bWx3aWRnZXRzIHJlbmRlclZhbHVlKS4gV2UgY2FuJ3QKICAgICAgLy8ganVzdCBpZ25vcmUgdGhlIGRpZmZlcmVuY2UgYmVjYXVzZSBpbiBzb21lIHdpZGdldHMgaXQncyBoZWxwZnVsCiAgICAgIC8vIHRvIGNhbGwgdGhpcy5yZW5kZXJWYWx1ZSgpIGZyb20gaW5zaWRlIG9mIHJlc2l6ZSgpLCBhbmQgaWYKICAgICAgLy8gd2UncmUgbm90IGRlbGVnYXRpbmcsIHRoZW4gdGhhdCBjYWxsIHdpbGwgZ28gdG8gdGhlIFNoaW55CiAgICAgIC8vIHZlcnNpb24gaW5zdGVhZCBvZiB0aGUgaHRtbHdpZGdldHMgdmVyc2lvbi4KCiAgICAgIC8vIE1lcmdlIGRlZmF1bHRzIHdpdGggZGVmaW5pdGlvbiwgd2l0aG91dCBtdXRhdGluZyBlaXRoZXIuCiAgICAgIHZhciBiaW5kaW5nRGVmID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgZGVmaW5pdGlvbik7CgogICAgICAvLyBUaGlzIG9iamVjdCB3aWxsIGJlIG91ciBhY3R1YWwgU2hpbnkgYmluZGluZy4KICAgICAgdmFyIHNoaW55QmluZGluZyA9IG5ldyBTaGlueS5PdXRwdXRCaW5kaW5nKCk7CgogICAgICAvLyBXaXRoIGEgZmV3IGV4Y2VwdGlvbnMsIHdlJ2xsIHdhbnQgdG8gc2ltcGx5IHVzZSB0aGUgYmluZGluZ0RlZidzCiAgICAgIC8vIHZlcnNpb24gb2YgbWV0aG9kcyBpZiB0aGV5IGFyZSBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8KICAgICAgLy8gU2hpbnkncyBkZWZhdWx0cy4gTk9URTogSWYgU2hpbnkncyBvdXRwdXQgYmluZGluZ3MgZ2FpbiBhZGRpdGlvbmFsCiAgICAgIC8vIG1ldGhvZHMgaW4gdGhlIGZ1dHVyZSwgYW5kIHdlIHdhbnQgdGhlbSB0byBiZSBvdmVycmlkZWFibGUgYnkKICAgICAgLy8gSFRNTFdpZGdldCBiaW5kaW5nIGRlZmluaXRpb25zLCB0aGVuIHdlJ2xsIG5lZWQgdG8gYWRkIHRoZW0gdG8gdGhpcwogICAgICAvLyBsaXN0LgogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJnZXRJZCIpOwogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJvblZhbHVlQ2hhbmdlIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVFcnJvciIpOwogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJyZW5kZXJFcnJvciIpOwogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJjbGVhckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInNob3dQcm9ncmVzcyIpOwoKICAgICAgLy8gVGhlIGZpbmQsIHJlbmRlclZhbHVlLCBhbmQgcmVzaXplIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCBiZWNhdXNlIHdlCiAgICAgIC8vIHdhbnQgdG8gYWN0dWFsbHkgZGVjb3JhdGUgdGhlIGJlaGF2aW9yIG9mIHRoZSBiaW5kaW5nRGVmIG1ldGhvZHMuCgogICAgICBzaGlueUJpbmRpbmcuZmluZCA9IGZ1bmN0aW9uKHNjb3BlKSB7CiAgICAgICAgdmFyIHJlc3VsdHMgPSBiaW5kaW5nRGVmLmZpbmQoc2NvcGUpOwoKICAgICAgICAvLyBPbmx5IHJldHVybiBlbGVtZW50cyB0aGF0IGFyZSBTaGlueSBvdXRwdXRzLCBub3Qgc3RhdGljIG9uZXMKICAgICAgICB2YXIgZHluYW1pY1Jlc3VsdHMgPSByZXN1bHRzLmZpbHRlcigiLmh0bWwtd2lkZ2V0LW91dHB1dCIpOwoKICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgd2hhdGV2ZXIgY2F1c2VkIFNoaW55IHRvIHRoaW5rIHRoZXJlIG1pZ2h0IGJlCiAgICAgICAgLy8gbmV3IGR5bmFtaWMgb3V0cHV0cywgYWxzbyBjYXVzZWQgdGhlcmUgdG8gYmUgbmV3IHN0YXRpYyBvdXRwdXRzLgogICAgICAgIC8vIFNpbmNlIHRoZXJlIG1pZ2h0IGJlIGxvdHMgb2YgZGlmZmVyZW50IGh0bWx3aWRnZXRzIGJpbmRpbmdzLCB3ZQogICAgICAgIC8vIHNjaGVkdWxlIGV4ZWN1dGlvbiBmb3IgbGF0ZXItLW5vIG5lZWQgdG8gc3RhdGljUmVuZGVyIG11bHRpcGxlCiAgICAgICAgLy8gdGltZXMuCiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9PSBkeW5hbWljUmVzdWx0cy5sZW5ndGgpCiAgICAgICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlcigpOwoKICAgICAgICByZXR1cm4gZHluYW1pY1Jlc3VsdHM7CiAgICAgIH07CgogICAgICAvLyBXcmFwIHJlbmRlclZhbHVlIHRvIGhhbmRsZSBpbml0aWFsaXphdGlvbiwgd2hpY2ggdW5mb3J0dW5hdGVseSBpc24ndAogICAgICAvLyBzdXBwb3J0ZWQgbmF0aXZlbHkgYnkgU2hpbnkgYXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLgoKICAgICAgc2hpbnlCaW5kaW5nLnJlbmRlclZhbHVlID0gZnVuY3Rpb24oZWwsIGRhdGEpIHsKICAgICAgICBTaGlueS5yZW5kZXJEZXBlbmRlbmNpZXMoZGF0YS5kZXBzKTsKICAgICAgICAvLyBSZXNvbHZlIHN0cmluZ3MgbWFya2VkIGFzIGphdmFzY3JpcHQgbGl0ZXJhbHMgdG8gb2JqZWN0cwogICAgICAgIGlmICghKGRhdGEuZXZhbHMgaW5zdGFuY2VvZiBBcnJheSkpIGRhdGEuZXZhbHMgPSBbZGF0YS5ldmFsc107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGRhdGEuZXZhbHMgJiYgaSA8IGRhdGEuZXZhbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5ldmFsdWF0ZVN0cmluZ01lbWJlcihkYXRhLngsIGRhdGEuZXZhbHNbaV0pOwogICAgICAgIH0KICAgICAgICBpZiAoIWJpbmRpbmdEZWYucmVuZGVyT25OdWxsVmFsdWUpIHsKICAgICAgICAgIGlmIChkYXRhLnggPT09IG51bGwpIHsKICAgICAgICAgICAgZWwuc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImluaGVyaXQiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgewogICAgICAgICAgaW5pdFNpemluZyhlbCk7CgogICAgICAgICAgZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIsIHRydWUpOwogICAgICAgICAgaWYgKGJpbmRpbmdEZWYuaW5pdGlhbGl6ZSkgewogICAgICAgICAgICB2YXIgcmVzdWx0ID0gYmluZGluZ0RlZi5pbml0aWFsaXplKGVsLCBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgICBlbC5vZmZzZXRIZWlnaHQpOwogICAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYmluZGluZ0RlZi5yZW5kZXJWYWx1ZShlbCwgZGF0YS54LCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IikpOwogICAgICAgIGV2YWxBbmRSdW4oZGF0YS5qc0hvb2tzLnJlbmRlciwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpLCBbZWwsIGRhdGEueF0pOwogICAgICB9OwoKICAgICAgLy8gT25seSBvdmVycmlkZSByZXNpemUgaWYgYmluZGluZ0RlZiBpbXBsZW1lbnRzIGl0CiAgICAgIGlmIChiaW5kaW5nRGVmLnJlc2l6ZSkgewogICAgICAgIHNoaW55QmluZGluZy5yZXNpemUgPSBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgewogICAgICAgICAgLy8gU2hpbnkgY2FuIGNhbGwgcmVzaXplIGJlZm9yZSBpbml0aWFsaXplL3JlbmRlclZhbHVlIGhhdmUgYmVlbgogICAgICAgICAgLy8gY2FsbGVkLCB3aGljaCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHdpZGdldHMuCiAgICAgICAgICBpZiAoZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICAgIGJpbmRpbmdEZWYucmVzaXplKGVsLCB3aWR0aCwgaGVpZ2h0LCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IikpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0KCiAgICAgIFNoaW55Lm91dHB1dEJpbmRpbmdzLnJlZ2lzdGVyKHNoaW55QmluZGluZywgYmluZGluZ0RlZi5uYW1lKTsKICAgIH0KICB9OwoKICB2YXIgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gbnVsbDsKICBmdW5jdGlvbiBzY2hlZHVsZVN0YXRpY1JlbmRlcigpIHsKICAgIGlmICghc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkKSB7CiAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gbnVsbDsKICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICAgIH0sIDEpOwogICAgfQogIH0KCiAgLy8gUmVuZGVyIHN0YXRpYyB3aWRnZXRzIGFmdGVyIHRoZSBkb2N1bWVudCBmaW5pc2hlcyBsb2FkaW5nCiAgLy8gU3RhdGljYWxseSByZW5kZXIgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIG9mIHRoaXMgd2lkZ2V0J3MgY2xhc3MKICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgYmluZGluZ3MgPSB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyB8fCBbXTsKICAgIGZvckVhY2goYmluZGluZ3MsIGZ1bmN0aW9uKGJpbmRpbmcpIHsKICAgICAgdmFyIG1hdGNoZXMgPSBiaW5kaW5nLmZpbmQoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTsKICAgICAgZm9yRWFjaChtYXRjaGVzLCBmdW5jdGlvbihlbCkgewogICAgICAgIHZhciBzaXplT2JqID0gaW5pdFNpemluZyhlbCwgYmluZGluZyk7CgogICAgICAgIGlmIChoYXNDbGFzcyhlbCwgImh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCIpKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGVsLmNsYXNzTmFtZSA9IGVsLmNsYXNzTmFtZSArICIgaHRtbC13aWRnZXQtc3RhdGljLWJvdW5kIjsKCiAgICAgICAgdmFyIGluaXRSZXN1bHQ7CiAgICAgICAgaWYgKGJpbmRpbmcuaW5pdGlhbGl6ZSkgewogICAgICAgICAgaW5pdFJlc3VsdCA9IGJpbmRpbmcuaW5pdGlhbGl6ZShlbCwKICAgICAgICAgICAgc2l6ZU9iaiA/IHNpemVPYmouZ2V0V2lkdGgoKSA6IGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICBzaXplT2JqID8gc2l6ZU9iai5nZXRIZWlnaHQoKSA6IGVsLm9mZnNldEhlaWdodAogICAgICAgICAgKTsKICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCBpbml0UmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIGlmIChiaW5kaW5nLnJlc2l6ZSkgewogICAgICAgICAgdmFyIGxhc3RTaXplID0gewogICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgIGg6IHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICB9OwogICAgICAgICAgdmFyIHJlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBzaXplID0gewogICAgICAgICAgICAgIHc6IHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgICBoOiBzaXplT2JqID8gc2l6ZU9iai5nZXRIZWlnaHQoKSA6IGVsLm9mZnNldEhlaWdodAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSAwICYmIHNpemUuaCA9PT0gMCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgbGFzdFNpemUgPSBzaXplOwogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOwogICAgICAgICAgfTsKCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsKCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgY2FzZXMgd2hlcmUgd2UncmUgcnVubmluZyBpbiBhIFNoaW55CiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dAogICAgICAgICAgLy8gcmF0aGVyIGEgc2ltcGxlIHN0YXRpYyB3aWRnZXQuIE9uZSBleGFtcGxlIG9mIHRoaXMgaXMKICAgICAgICAgIC8vIGFuIHJtYXJrZG93biBkb2N1bWVudCB0aGF0IGhhcyBydW50aW1lOnNoaW55IGFuZCB3aWRnZXQKICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8KICAgICAgICAgIC8vIGNhbGwgcmVzaXplIGhhbmRsZXJzIGZvciBTaGlueSBvdXRwdXRzLCBub3QgZm9yIHN0YXRpYwogICAgICAgICAgLy8gd2lkZ2V0cywgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLgogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgInNob3duLmh0bWx3aWRnZXRzIHNob3duLmJzLnRhYi5odG1sd2lkZ2V0cyBzaG93bi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgICB3aW5kb3cualF1ZXJ5KGRvY3VtZW50KS5vbigKICAgICAgICAgICAgICAiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMgaGlkZGVuLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwKICAgICAgICAgICAgICByZXNpemVIYW5kbGVyCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBzcGVjaWZpYyBjYXNlIG9mIGlvc2xpZGVzLCB3aGljaAogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLgogICAgICAgICAgLy8gSWRlYWxseSB3ZSB3b3VsZCBub3QgaGF2ZSB0byBoYXZlIGlvc2xpZGUtc3BlY2lmaWMgY29kZQogICAgICAgICAgLy8gaGVyZSwgYnV0IHJhdGhlciBoYXZlIGlvc2xpZGVzIHJhaXNlIGEgZ2VuZXJpYyBldmVudCwKICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlCiAgICAgICAgICAvLyB3aW5kb3cgdG8gZ2V0dGluZyB0aGF0IGZpeGVkIG1heSBiZSBsb25nLgogICAgICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAvLyBicm93c2VycyBiZWNhdXNlIGlvc2xpZGVzIGl0c2VsZiBvbmx5IHN1cHBvcnRzCiAgICAgICAgICAgIC8vIHN1Y2ggYnJvd3NlcnMuCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOwogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlbGVhdmUiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhciBzY3JpcHREYXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vanNvbiddIik7CiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsKICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShzY3JpcHREYXRhLnRleHRDb250ZW50IHx8IHNjcmlwdERhdGEudGV4dCk7CiAgICAgICAgICAvLyBSZXNvbHZlIHN0cmluZ3MgbWFya2VkIGFzIGphdmFzY3JpcHQgbGl0ZXJhbHMgdG8gb2JqZWN0cwogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBkYXRhLmV2YWxzICYmIGsgPCBkYXRhLmV2YWxzLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5ldmFsdWF0ZVN0cmluZ01lbWJlcihkYXRhLngsIGRhdGEuZXZhbHNba10pOwogICAgICAgICAgfQogICAgICAgICAgYmluZGluZy5yZW5kZXJWYWx1ZShlbCwgZGF0YS54LCBpbml0UmVzdWx0KTsKICAgICAgICAgIGV2YWxBbmRSdW4oZGF0YS5qc0hvb2tzLnJlbmRlciwgaW5pdFJlc3VsdCwgW2VsLCBkYXRhLnhdKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CgogICAgaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCk7CiAgfQoKCiAgZnVuY3Rpb24gaGFzX2pRdWVyeTMoKSB7CiAgICBpZiAoIXdpbmRvdy5qUXVlcnkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdmFyICR2ZXJzaW9uID0gd2luZG93LmpRdWVyeS5mbi5qcXVlcnk7CiAgICB2YXIgJG1ham9yX3ZlcnNpb24gPSBwYXJzZUludCgkdmVyc2lvbi5zcGxpdCgiLiIpWzBdKTsKICAgIHJldHVybiAkbWFqb3JfdmVyc2lvbiA+PSAzOwogIH0KCiAgLyoKICAvIFNoaW55IDEuNCBidW1wZWQgalF1ZXJ5IGZyb20gMS54IHRvIDMueCB3aGljaCBtZWFucyBqUXVlcnkncwogIC8gb24tcmVhZHkgaGFuZGxlciAoaS5lLiwgJChmbikpIGlzIG5vdyBhc3luY3Jvbm91cyAoaS5lLiwgaXQgbm93CiAgLyByZWFsbHkgbWVhbnMgJChzZXRUaW1lb3V0KGZuKSkuCiAgLyBodHRwczovL2pxdWVyeS5jb20vdXBncmFkZS1ndWlkZS8zLjAvI2JyZWFraW5nLWNoYW5nZS1kb2N1bWVudC1yZWFkeS1oYW5kbGVycy1hcmUtbm93LWFzeW5jaHJvbm91cwogIC8KICAvIFNpbmNlIFNoaW55IHVzZXMgJCgpIHRvIHNjaGVkdWxlIGluaXRTaGlueSwgc2hpbnk+PTEuNCBjYWxscyBpbml0U2hpbnkKICAvIG9uZSB0aWNrIGxhdGVyIHRoYW4gaXQgZGlkIGJlZm9yZSwgd2hpY2ggbWVhbnMgc3RhdGljUmVuZGVyKCkgaXMKICAvIGNhbGxlZCByZW5kZXJWYWx1ZSgpIGVhcmxpZXIgdGhhbiAoYWR2YW5jZWQpIHdpZGdldCBhdXRob3JzIG1pZ2h0IGJlIGV4cGVjdGluZy4KICAvIGh0dHBzOi8vZ2l0aHViLmNvbS9yc3R1ZGlvL3NoaW55L2lzc3Vlcy8yNjMwCiAgLwogIC8gRm9yIGEgY29uY3JldGUgZXhhbXBsZSwgbGVhZmxldCBoYXMgc29tZSBtZXRob2RzIChlLmcuLCB1cGRhdGVCb3VuZHMpCiAgLyB3aGljaCByZWZlcmVuY2UgU2hpbnkgbWV0aG9kcyByZWdpc3RlcmVkIGluIGluaXRTaGlueSAoZS5nLiwgc2V0SW5wdXRWYWx1ZSkuCiAgLyBTaW5jZSBsZWFmbGV0IGlzIHByaXZ5IHRvIHRoaXMgbGlmZS1jeWNsZSwgaXQga25vd3MgdG8gdXNlIHNldFRpbWVvdXQoKSB0bwogIC8gZGVsYXkgZXhlY3V0aW9uIG9mIHRob3NlIG1ldGhvZHMgKHVudGlsIFNoaW55IG1ldGhvZHMgYXJlIHJlYWR5KQogIC8gaHR0cHM6Ly9naXRodWIuY29tL3JzdHVkaW8vbGVhZmxldC9ibG9iLzE4ZWM5ODEvamF2YXNjcmlwdC9zcmMvaW5kZXguanMjTDI2Ni1MMjY4CiAgLwogIC8gSWRlYWxseSB3aWRnZXQgYXV0aG9ycyB3b3VsZG4ndCBuZWVkIHRvIHVzZSB0aGlzIHNldFRpbWVvdXQoKSBoYWNrIHRoYXQKICAvIGxlYWZsZXQgdXNlcyB0byBjYWxsIFNoaW55IG1ldGhvZHMgb24gYSBzdGF0aWNSZW5kZXIoKS4gSW4gdGhlIGxvbmcgcnVuLAogIC8gdGhlIGxvZ2ljIGluaXRTaGlueSBzaG91bGQgYmUgYnJva2VuIHVwIHNvIHRoYXQgbWV0aG9kIHJlZ2lzdHJhdGlvbiBoYXBwZW5zCiAgLyByaWdodCBhd2F5LCBidXQgYmluZGluZyBoYXBwZW5zIGxhdGVyLgogICovCiAgZnVuY3Rpb24gbWF5YmVTdGF0aWNSZW5kZXJMYXRlcigpIHsKICAgIGlmIChzaGlueU1vZGUgJiYgaGFzX2pRdWVyeTMoKSkgewogICAgICB3aW5kb3cualF1ZXJ5KHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIpOwogICAgfSBlbHNlIHsKICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgfQogIH0KCiAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsKICAgICAgbWF5YmVTdGF0aWNSZW5kZXJMYXRlcigpOwogICAgfSwgZmFsc2UpOwogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsKICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpIHsKICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgICAgbWF5YmVTdGF0aWNSZW5kZXJMYXRlcigpOwogICAgICB9CiAgICB9KTsKICB9CgoKICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0QXR0YWNobWVudFVybCA9IGZ1bmN0aW9uKGRlcG5hbWUsIGtleSkgewogICAgLy8gSWYgbm8ga2V5LCBkZWZhdWx0IHRvIHRoZSBmaXJzdCBpdGVtCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSAxOwoKICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQXR0YWNobWVudCAiICsgZGVwbmFtZSArICIvIiArIGtleSArICIgbm90IGZvdW5kIGluIGRvY3VtZW50Iik7CiAgICB9CiAgICByZXR1cm4gbGluay5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyA9IGZ1bmN0aW9uKGRmKSB7CiAgICB2YXIgbmFtZXMgPSBbXTsKICAgIHZhciBsZW5ndGg7CiAgICBmb3IgKHZhciBuYW1lIGluIGRmKSB7CiAgICAgICAgaWYgKGRmLmhhc093blByb3BlcnR5KG5hbWUpKQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIGlmICh0eXBlb2YoZGZbbmFtZV0pICE9PSAib2JqZWN0IiB8fCB0eXBlb2YoZGZbbmFtZV0ubGVuZ3RoKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIik7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCIpOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7CiAgICB9CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGl0ZW07CiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBsZW5ndGg7IHJvdysrKSB7CiAgICAgICAgaXRlbSA9IHt9OwogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsKICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdXSA9IGRmW25hbWVzW2NvbF1dW3Jvd107CiAgICAgICAgfQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy50cmFuc3Bvc2VBcnJheTJEID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5OwogICAgICB2YXIgbmV3QXJyYXkgPSBhcnJheVswXS5tYXAoZnVuY3Rpb24oY29sLCBpKSB7CiAgICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICAgICAgICAgIHJldHVybiByb3dbaV0KICAgICAgICAgIH0pCiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3QXJyYXk7CiAgfTsKICAvLyBTcGxpdCB2YWx1ZSBhdCBzcGxpdENoYXIsIGJ1dCBhbGxvdyBzcGxpdENoYXIgdG8gYmUgZXNjYXBlZAogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcgogIC8vIHdpbGwgYmUgaW5jbHVkZWQgYXMgdXN1YWwgKGluY2x1ZGluZyBlc2NhcGVDaGFyIGl0c2VsZikuCiAgZnVuY3Rpb24gc3BsaXRXaXRoRXNjYXBlKHZhbHVlLCBzcGxpdENoYXIsIGVzY2FwZUNoYXIpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgdmFyIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsKICAgICAgaWYgKCFlc2NhcGVNb2RlKSB7CiAgICAgICAgaWYgKHZhbHVlW3Bvc10gPT09IHNwbGl0Q2hhcikgewogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgICAgICAgY3VycmVudFJlc3VsdCA9ICIiOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWVbcG9zXSA9PT0gZXNjYXBlQ2hhcikgewogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7CiAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvLyBGdW5jdGlvbiBhdXRob3JlZCBieSBZaWh1aS9KSiBBbGxhaXJlCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7CiAgICB2YXIgcGFydHMgPSBzcGxpdFdpdGhFc2NhcGUobWVtYmVyLCAnLicsICdcXCcpOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgLy8gcGFydCBtYXkgYmUgYSBjaGFyYWN0ZXIgb3IgJ251bWVyaWMnIG1lbWJlciBuYW1lCiAgICAgIGlmIChvICE9PSBudWxsICYmIHR5cGVvZiBvID09PSAib2JqZWN0IiAmJiBwYXJ0IGluIG8pIHsKICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlCiAgICAgICAgICBpZiAodHlwZW9mIG9bcGFydF0gPT09ICJzdHJpbmciKQogICAgICAgICAgICBvW3BhcnRdID0gdHJ5RXZhbChvW3BhcnRdKTsKICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QKICAgICAgICAgIG8gPSBvW3BhcnRdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07CgogIC8vIFJldHJpZXZlIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YgYW4KICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0Iik7CiAgfTsKCiAgLy8gRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoYXQgZWxlbWVudCwgaWYgYW55LiBJZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmQgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgZWwgPSBzY29wZS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIGlmIChlbCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UoZWwpOwogICAgfQogIH07CgogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZAogIC8vIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2VzIChpLmUuIHRoZSByZXR1cm4gdmFsdWVzIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdAogIC8vIG1hdGNoIHRoZSBzZWxlY3RvciBkb24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgSFRNTFdpZGdldAogIC8vIGluc3RhbmNlLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBjb250YWluIG51bGxzLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kQWxsID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIG5vZGVzID0gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICByZXN1bHRzLnB1c2god2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKG5vZGVzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB2YXIgcG9zdFJlbmRlckhhbmRsZXJzID0gW107CiAgZnVuY3Rpb24gaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCkgewogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsKICAgICAgdmFyIGhhbmRsZXIgPSBwb3N0UmVuZGVySGFuZGxlcnMuc2hpZnQoKTsKICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICBoYW5kbGVyKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFJlZ2lzdGVyIHRoZSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmFkZFBvc3RSZW5kZXJIYW5kbGVyID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHBvc3RSZW5kZXJIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTsKICB9OwoKICAvLyBUYWtlcyBhIG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9uLCBhbmQgcmV0dXJucyBhbgogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nCiAgLy8gdG8gcmV3cml0ZSBhbGwgdGhlIGxvZ2ljIGluIHRoaXMgZmlsZSB0byBhY2NvbW9kYXRlIGJvdGgKICAvLyB0eXBlcyBvZiBkZWZpbml0aW9ucy4KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7CiAgICB2YXIgcmVzdWx0ID0gewogICAgICBuYW1lOiBkZWZuLm5hbWUsCiAgICAgIHR5cGU6IGRlZm4udHlwZSwKICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICByZXR1cm4gZGVmbi5mYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgfSwKICAgICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZW5kZXJWYWx1ZSh4KTsKICAgICAgfSwKICAgICAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVzaXplKHdpZHRoLCBoZWlnaHQpOwogICAgICB9CiAgICB9OwoKICAgIGlmIChkZWZuLmZpbmQpCiAgICAgIHJlc3VsdC5maW5kID0gZGVmbi5maW5kOwogICAgaWYgKGRlZm4ucmVuZGVyRXJyb3IpCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7CiAgICBpZiAoZGVmbi5jbGVhckVycm9yKQogICAgICByZXN1bHQuY2xlYXJFcnJvciA9IGRlZm4uY2xlYXJFcnJvcjsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSkoKTsKCg=="></script>
<link href="data:text/css,%0A%2EwcLabel%20%7B%0Aposition%3A%20absolute%3B%0Aborder%3A%202px%20solid%20%23fff%3B%0Abox%2Dshadow%3A%200%200%204px%200%20%23008%3B%0Apadding%3A%202px%3B%0A%0Apointer%2Devents%3A%20none%3B%20%7D%0A%2EwcSpan%20%7B%0Aposition%3A%20absolute%3B%0Atop%3A%20100%25%3B%0Aleft%3A%200%3B%0Abackground%2Dcolor%3A%20rgba%28255%2C%20255%2C%20255%2C%200%2E8%29%3B%0Acolor%3A%20%23333%3B%0Amargin%2Dtop%3A%206px%3B%0Apadding%3A%200%200%2E5em%3B%0Aborder%2Dradius%3A%200%2E5em%3B%0Awhite%2Dspace%3A%20nowrap%3B%20%7D%0A" rel="stylesheet" />
<script src="data:application/javascript;base64,LyohCiAqIHdvcmRjbG91ZDIuanMKICogaHR0cDovL3RpbWRyZWFtLm9yZy93b3JkY2xvdWQyLmpzLwogKgogKiBDb3B5cmlnaHQgMjAxMSAtIDIwMTMgVGltIENoaWVuCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKi8KCid1c2Ugc3RyaWN0JzsKCi8vIHNldEltbWVkaWF0ZQppZiAoIXdpbmRvdy5zZXRJbW1lZGlhdGUpIHsKICB3aW5kb3cuc2V0SW1tZWRpYXRlID0gKGZ1bmN0aW9uIHNldHVwU2V0SW1tZWRpYXRlKCkgewogICAgcmV0dXJuIHdpbmRvdy5tc1NldEltbWVkaWF0ZSB8fAogICAgd2luZG93LndlYmtpdFNldEltbWVkaWF0ZSB8fAogICAgd2luZG93Lm1velNldEltbWVkaWF0ZSB8fAogICAgd2luZG93Lm9TZXRJbW1lZGlhdGUgfHwKICAgIChmdW5jdGlvbiBzZXR1cFNldFplcm9UaW1lb3V0KCkgewogICAgICBpZiAoIXdpbmRvdy5wb3N0TWVzc2FnZSB8fCAhd2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgICAgdmFyIGNhbGxiYWNrcyA9IFt1bmRlZmluZWRdOwogICAgICB2YXIgbWVzc2FnZSA9ICd6ZXJvLXRpbWVvdXQtbWVzc2FnZSc7CgogICAgICAvLyBMaWtlIHNldFRpbWVvdXQsIGJ1dCBvbmx5IHRha2VzIGEgZnVuY3Rpb24gYXJndW1lbnQuICBUaGVyZSdzCiAgICAgIC8vIG5vIHRpbWUgYXJndW1lbnQgKGFsd2F5cyB6ZXJvKSBhbmQgbm8gYXJndW1lbnRzICh5b3UgaGF2ZSB0bwogICAgICAvLyB1c2UgYSBjbG9zdXJlKS4KICAgICAgdmFyIHNldFplcm9UaW1lb3V0ID0gZnVuY3Rpb24gc2V0WmVyb1RpbWVvdXQoY2FsbGJhY2spIHsKICAgICAgICB2YXIgaWQgPSBjYWxsYmFja3MubGVuZ3RoOwogICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTsKICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2UobWVzc2FnZSArIGlkLnRvU3RyaW5nKDM2KSwgJyonKTsKCiAgICAgICAgcmV0dXJuIGlkOwogICAgICB9OwoKICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiBzZXRaZXJvVGltZW91dE1lc3NhZ2UoZXZ0KSB7CiAgICAgICAgLy8gU2tpcHBpbmcgY2hlY2tpbmcgZXZlbnQgc291cmNlLCByZXRhcmRlZCBJRSBjb25mdXNlZCB0aGlzIHdpbmRvdwogICAgICAgIC8vIG9iamVjdCB3aXRoIGFub3RoZXIgaW4gdGhlIHByZXNlbmNlIG9mIGlmcmFtZQogICAgICAgIGlmICh0eXBlb2YgZXZ0LmRhdGEgIT09ICdzdHJpbmcnIHx8CiAgICAgICAgICAgIGV2dC5kYXRhLnN1YnN0cigwLCBtZXNzYWdlLmxlbmd0aCkgIT09IG1lc3NhZ2UvKiB8fAogICAgICAgICAgICBldnQuc291cmNlICE9PSB3aW5kb3cgKi8pIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKCiAgICAgICAgdmFyIGlkID0gcGFyc2VJbnQoZXZ0LmRhdGEuc3Vic3RyKG1lc3NhZ2UubGVuZ3RoKSwgMzYpOwogICAgICAgIGlmICghY2FsbGJhY2tzW2lkXSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgY2FsbGJhY2tzW2lkXSgpOwogICAgICAgIGNhbGxiYWNrc1tpZF0gPSB1bmRlZmluZWQ7CiAgICAgIH0sIHRydWUpOwoKICAgICAgLyogc3BlY2lmeSBjbGVhckltbWVkaWF0ZSgpIGhlcmUgc2luY2Ugd2UgbmVlZCB0aGUgc2NvcGUgKi8KICAgICAgd2luZG93LmNsZWFySW1tZWRpYXRlID0gZnVuY3Rpb24gY2xlYXJaZXJvVGltZW91dChpZCkgewogICAgICAgIGlmICghY2FsbGJhY2tzW2lkXSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgY2FsbGJhY2tzW2lkXSA9IHVuZGVmaW5lZDsKICAgICAgfTsKCiAgICAgIHJldHVybiBzZXRaZXJvVGltZW91dDsKICAgIH0pKCkgfHwKICAgIC8vIGZhbGxiYWNrCiAgICBmdW5jdGlvbiBzZXRJbW1lZGlhdGVGYWxsYmFjayhmbikgewogICAgICB3aW5kb3cuc2V0VGltZW91dChmbiwgMCk7CiAgICB9OwogIH0pKCk7Cn0KCmlmICghd2luZG93LmNsZWFySW1tZWRpYXRlKSB7CiAgd2luZG93LmNsZWFySW1tZWRpYXRlID0gKGZ1bmN0aW9uIHNldHVwQ2xlYXJJbW1lZGlhdGUoKSB7CiAgICByZXR1cm4gd2luZG93Lm1zQ2xlYXJJbW1lZGlhdGUgfHwKICAgIHdpbmRvdy53ZWJraXRDbGVhckltbWVkaWF0ZSB8fAogICAgd2luZG93Lm1vekNsZWFySW1tZWRpYXRlIHx8CiAgICB3aW5kb3cub0NsZWFySW1tZWRpYXRlIHx8CiAgICAvLyAiY2xlYXJaZXJvVGltZW91dCIgaXMgaW1wbGVtZW50IG9uIHRoZSBwcmV2aW91cyBibG9jayB8fAogICAgLy8gZmFsbGJhY2sKICAgIGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlRmFsbGJhY2sodGltZXIpIHsKICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcik7CiAgICB9OwogIH0pKCk7Cn0KCihmdW5jdGlvbihnbG9iYWwpIHsKCiAgLy8gQ2hlY2sgaWYgV29yZENsb3VkIGNhbiBydW4gb24gdGhpcyBicm93c2VyCiAgdmFyIGlzU3VwcG9ydGVkID0gKGZ1bmN0aW9uIGlzU3VwcG9ydGVkKCkgewogICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOwogICAgaWYgKCFjYW52YXMgfHwgIWNhbnZhcy5nZXRDb250ZXh0KSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CiAgICBpZiAoIWN0eC5nZXRJbWFnZURhdGEpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKCFjdHguZmlsbFRleHQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmICghQXJyYXkucHJvdG90eXBlLnNvbWUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKCFBcnJheS5wcm90b3R5cGUucHVzaCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcmV0dXJuIHRydWU7CiAgfSgpKTsKCiAgLy8gRmluZCBvdXQgaWYgdGhlIGJyb3dzZXIgaW1wb3NlIG1pbml1bSBmb250IHNpemUgYnkKICAvLyBkcmF3aW5nIHNtYWxsIHRleHRzIG9uIGEgY2FudmFzIGFuZCBtZWFzdXJlIGl0J3Mgd2lkdGguCiAgdmFyIG1pbkZvbnRTaXplID0gKGZ1bmN0aW9uIGdldE1pbkZvbnRTaXplKCkgewogICAgaWYgKCFpc1N1cHBvcnRlZCkgewogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGN0eCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJzJkJyk7CgogICAgLy8gc3RhcnQgZnJvbSAyMAogICAgdmFyIHNpemUgPSAyMDsKCiAgICAvLyB0d28gc2l6ZXMgdG8gbWVhc3VyZQogICAgdmFyIGhhbldpZHRoLCBtV2lkdGg7CgogICAgd2hpbGUgKHNpemUpIHsKICAgICAgY3R4LmZvbnQgPSBzaXplLnRvU3RyaW5nKDEwKSArICdweCBzYW5zLXNlcmlmJzsKICAgICAgaWYgKChjdHgubWVhc3VyZVRleHQoJ1x1RkYzNycpLndpZHRoID09PSBoYW5XaWR0aCkgJiYKICAgICAgICAgIChjdHgubWVhc3VyZVRleHQoJ20nKS53aWR0aCkgPT09IG1XaWR0aCkgewogICAgICAgIHJldHVybiAoc2l6ZSArIDEpOwogICAgICB9CgogICAgICBoYW5XaWR0aCA9IGN0eC5tZWFzdXJlVGV4dCgnXHVGRjM3Jykud2lkdGg7CiAgICAgIG1XaWR0aCA9IGN0eC5tZWFzdXJlVGV4dCgnbScpLndpZHRoOwoKICAgICAgc2l6ZS0tOwogICAgfQoKICAgIHJldHVybiAwOwogIH0pKCk7CgogIC8vIEJhc2VkIG9uIGh0dHA6Ly9qc2Zyb21oZWxsLmNvbS9hcnJheS9zaHVmZmxlCiAgdmFyIHNodWZmbGVBcnJheSA9IGZ1bmN0aW9uIHNodWZmbGVBcnJheShhcnIpIHsKICAgIGZvciAodmFyIGosIHgsIGkgPSBhcnIubGVuZ3RoOyBpOwogICAgICBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogaSksCiAgICAgIHggPSBhcnJbLS1pXSwgYXJyW2ldID0gYXJyW2pdLAogICAgICBhcnJbal0gPSB4KSB7fQogICAgcmV0dXJuIGFycjsKICB9OwoKICB2YXIgV29yZENsb3VkID0gZnVuY3Rpb24gV29yZENsb3VkKGVsZW1lbnRzLCBvcHRpb25zKSB7CiAgICBpZiAoIWlzU3VwcG9ydGVkKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZWxlbWVudHMpKSB7CiAgICAgIGVsZW1lbnRzID0gW2VsZW1lbnRzXTsKICAgIH0KCiAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGVsLCBpKSB7CiAgICAgIGlmICh0eXBlb2YgZWwgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgZWxlbWVudHNbaV0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbCk7CiAgICAgICAgaWYgKCFlbGVtZW50c1tpXSkgewogICAgICAgICAgdGhyb3cgJ1RoZSBlbGVtZW50IGlkIHNwZWNpZmllZCBpcyBub3QgZm91bmQuJzsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoIWVsLnRhZ05hbWUgJiYgIWVsLmFwcGVuZENoaWxkKSB7CiAgICAgICAgdGhyb3cgJ1lvdSBtdXN0IHBhc3MgdmFsaWQgSFRNTCBlbGVtZW50cywgb3IgSUQgb2YgdGhlIGVsZW1lbnQuJzsKICAgICAgfQogICAgfSk7CgogICAgLyogRGVmYXVsdCB2YWx1ZXMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgb3B0aW9ucyBvYmplY3QgKi8KICAgIHZhciBzZXR0aW5ncyA9IHsKICAgICAgbGlzdDogW10sCiAgICAgIGZvbnRGYW1pbHk6ICciVHJlYnVjaGV0IE1TIiwgIkhlaXRpIFRDIiwgIuW+rui7n+ato+m7kemrlCIsICcgKwogICAgICAgICAgICAgICAgICAnIkFyaWFsIFVuaWNvZGUgTVMiLCAiRHJvaWQgRmFsbGJhY2sgU2FucyIsIHNhbnMtc2VyaWYnLAogICAgICBmb250V2VpZ2h0OiAnbm9ybWFsJywKICAgICAgY29sb3I6ICdyYW5kb20tZGFyaycsCiAgICAgIG1pblNpemU6IDAsIC8vIDAgdG8gZGlzYWJsZQogICAgICB3ZWlnaHRGYWN0b3I6IDEsCiAgICAgIGNsZWFyQ2FudmFzOiB0cnVlLAogICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmJywgIC8vIG9wYXF1ZSB3aGl0ZSA9IHJnYmEoMjU1LCAyNTUsIDI1NSwgMSkKCiAgICAgIGdyaWRTaXplOiA4LAogICAgICBvcmlnaW46IG51bGwsCgogICAgICBkcmF3TWFzazogZmFsc2UsCiAgICAgIG1hc2tDb2xvcjogJ3JnYmEoMjU1LDAsMCwwLjMpJywKICAgICAgbWFza0dhcFdpZHRoOiAwLjMsCgogICAgICB3YWl0OiAwLAogICAgICBhYm9ydFRocmVzaG9sZDogMCwgLy8gZGlzYWJsZWQKICAgICAgYWJvcnQ6IGZ1bmN0aW9uIG5vb3AoKSB7fSwKCiAgICAgIG1pblJvdGF0aW9uOiAtIE1hdGguUEkgLyAyLAogICAgICBtYXhSb3RhdGlvbjogTWF0aC5QSSAvIDIsCgogICAgICBzaHVmZmxlOiB0cnVlLAogICAgICByb3RhdGVSYXRpbzogMC4xLAoKICAgICAgc2hhcGU6ICdjaXJjbGUnLAogICAgICBlbGxpcHRpY2l0eTogMC42NSwKCiAgICAgIGNsYXNzZXM6IG51bGwsCgogICAgICBob3ZlcjogbnVsbCwKICAgICAgY2xpY2s6IG51bGwKICAgIH07CgogICAgaWYgKG9wdGlvbnMpIHsKICAgICAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMpIHsKICAgICAgICBpZiAoa2V5IGluIHNldHRpbmdzKSB7CiAgICAgICAgICBzZXR0aW5nc1trZXldID0gb3B0aW9uc1trZXldOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qIENvbnZlcnQgd2VpZ2h0RmFjdG9yIGludG8gYSBmdW5jdGlvbiAqLwogICAgaWYgKHR5cGVvZiBzZXR0aW5ncy53ZWlnaHRGYWN0b3IgIT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIGZhY3RvciA9IHNldHRpbmdzLndlaWdodEZhY3RvcjsKICAgICAgc2V0dGluZ3Mud2VpZ2h0RmFjdG9yID0gZnVuY3Rpb24gd2VpZ2h0RmFjdG9yKHB0KSB7CiAgICAgICAgcmV0dXJuIHB0ICogZmFjdG9yOyAvL2luIHB4CiAgICAgIH07CiAgICB9CgogICAgLyogQ29udmVydCBzaGFwZSBpbnRvIGEgZnVuY3Rpb24gKi8KICAgIGlmICh0eXBlb2Ygc2V0dGluZ3Muc2hhcGUgIT09ICdmdW5jdGlvbicpIHsKICAgICAgc3dpdGNoIChzZXR0aW5ncy5zaGFwZSkgewogICAgICAgIGNhc2UgJ2NpcmNsZSc6CiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAvLyAnY2lyY2xlJyBpcyB0aGUgZGVmYXVsdCBhbmQgYSBzaG9ydGN1dCBpbiB0aGUgY29kZSBsb29wLgogICAgICAgICAgc2V0dGluZ3Muc2hhcGUgPSAnY2lyY2xlJzsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdjYXJkaW9pZCc6CiAgICAgICAgICBzZXR0aW5ncy5zaGFwZSA9IGZ1bmN0aW9uIHNoYXBlQ2FyZGlvaWQodGhldGEpIHsKICAgICAgICAgICAgcmV0dXJuIDEgLSBNYXRoLnNpbih0aGV0YSk7CiAgICAgICAgICB9OwogICAgICAgICAgYnJlYWs7CgogICAgICAgIC8qCgogICAgICAgIFRvIHdvcmsgb3V0IGFuIFgtZ29uLCBvbmUgaGFzIHRvIGNhbGN1bGF0ZSAibSIsCiAgICAgICAgd2hlcmUgMS8oY29zKDIqUEkvWCkrbSpzaW4oMipQSS9YKSkgPSAxLyhjb3MoMCkrbSpzaW4oMCkpCiAgICAgICAgaHR0cDovL3d3dy53b2xmcmFtYWxwaGEuY29tL2lucHV0Lz9pPTElMkYlMjhjb3MlMjgyKlBJJTJGWCUyOSUyQm0qc2luJTI4CiAgICAgICAgMipQSSUyRlglMjklMjkrJTNEKzElMkYlMjhjb3MlMjgwJTI5JTJCbSpzaW4lMjgwJTI5JTI5CgogICAgICAgIENvcHkgdGhlIHNvbHV0aW9uIGludG8gcG9sYXIgZXF1YXRpb24gciA9IDEvKGNvcyh0JykgKyBtKnNpbih0JykpCiAgICAgICAgd2hlcmUgdCcgZXF1YWxzIHRvIG1vZCh0LCAyUEkvWCk7CgogICAgICAgICovCgogICAgICAgIGNhc2UgJ2RpYW1vbmQnOgogICAgICAgIGNhc2UgJ3NxdWFyZSc6CiAgICAgICAgICAvLyBodHRwOi8vd3d3LndvbGZyYW1hbHBoYS5jb20vaW5wdXQvP2k9cGxvdCtyKyUzRCsxJTJGJTI4Y29zJTI4bW9kKwogICAgICAgICAgLy8gJTI4dCUyQytQSSUyRjIlMjklMjklMkJzaW4lMjhtb2QrJTI4dCUyQytQSSUyRjIlMjklMjklMjklMkMrdCslM0QKICAgICAgICAgIC8vICswKy4uKzIqUEkKICAgICAgICAgIHNldHRpbmdzLnNoYXBlID0gZnVuY3Rpb24gc2hhcGVTcXVhcmUodGhldGEpIHsKICAgICAgICAgICAgdmFyIHRoZXRhUHJpbWUgPSB0aGV0YSAlICgyICogTWF0aC5QSSAvIDQpOwogICAgICAgICAgICByZXR1cm4gMSAvIChNYXRoLmNvcyh0aGV0YVByaW1lKSArIE1hdGguc2luKHRoZXRhUHJpbWUpKTsKICAgICAgICAgIH07CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAndHJpYW5nbGUtZm9yd2FyZCc6CiAgICAgICAgICAvLyBodHRwOi8vd3d3LndvbGZyYW1hbHBoYS5jb20vaW5wdXQvP2k9cGxvdCtyKyUzRCsxJTJGJTI4Y29zJTI4bW9kKwogICAgICAgICAgLy8gJTI4dCUyQysyKlBJJTJGMyUyOSUyOSUyQnNxcnQlMjgzJTI5c2luJTI4bW9kKyUyOHQlMkMrMipQSSUyRjMlMjkKICAgICAgICAgIC8vICUyOSUyOSUyQyt0KyUzRCswKy4uKzIqUEkKICAgICAgICAgIHNldHRpbmdzLnNoYXBlID0gZnVuY3Rpb24gc2hhcGVUcmlhbmdsZSh0aGV0YSkgewogICAgICAgICAgICB2YXIgdGhldGFQcmltZSA9IHRoZXRhICUgKDIgKiBNYXRoLlBJIC8gMyk7CiAgICAgICAgICAgIHJldHVybiAxIC8gKE1hdGguY29zKHRoZXRhUHJpbWUpICsKICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5zcXJ0KDMpICogTWF0aC5zaW4odGhldGFQcmltZSkpOwogICAgICAgICAgfTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICd0cmlhbmdsZSc6CiAgICAgICAgY2FzZSAndHJpYW5nbGUtdXByaWdodCc6CiAgICAgICAgICBzZXR0aW5ncy5zaGFwZSA9IGZ1bmN0aW9uIHNoYXBlVHJpYW5nbGUodGhldGEpIHsKICAgICAgICAgICAgdmFyIHRoZXRhUHJpbWUgPSAodGhldGEgKyBNYXRoLlBJICogMyAvIDIpICUgKDIgKiBNYXRoLlBJIC8gMyk7CiAgICAgICAgICAgIHJldHVybiAxIC8gKE1hdGguY29zKHRoZXRhUHJpbWUpICsKICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5zcXJ0KDMpICogTWF0aC5zaW4odGhldGFQcmltZSkpOwogICAgICAgICAgfTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdwZW50YWdvbic6CiAgICAgICAgICBzZXR0aW5ncy5zaGFwZSA9IGZ1bmN0aW9uIHNoYXBlUGVudGFnb24odGhldGEpIHsKICAgICAgICAgICAgdmFyIHRoZXRhUHJpbWUgPSAodGhldGEgKyAwLjk1NSkgJSAoMiAqIE1hdGguUEkgLyA1KTsKICAgICAgICAgICAgcmV0dXJuIDEgLyAoTWF0aC5jb3ModGhldGFQcmltZSkgKwogICAgICAgICAgICAgICAgICAgICAgICAwLjcyNjU0MyAqIE1hdGguc2luKHRoZXRhUHJpbWUpKTsKICAgICAgICAgIH07CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnc3Rhcic6CiAgICAgICAgICBzZXR0aW5ncy5zaGFwZSA9IGZ1bmN0aW9uIHNoYXBlU3Rhcih0aGV0YSkgewogICAgICAgICAgICB2YXIgdGhldGFQcmltZSA9ICh0aGV0YSArIDAuOTU1KSAlICgyICogTWF0aC5QSSAvIDEwKTsKICAgICAgICAgICAgaWYgKCh0aGV0YSArIDAuOTU1KSAlICgyICogTWF0aC5QSSAvIDUpIC0gKDIgKiBNYXRoLlBJIC8gMTApID49IDApIHsKICAgICAgICAgICAgICByZXR1cm4gMSAvIChNYXRoLmNvcygoMiAqIE1hdGguUEkgLyAxMCkgLSB0aGV0YVByaW1lKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgMy4wNzc2OCAqIE1hdGguc2luKCgyICogTWF0aC5QSSAvIDEwKSAtIHRoZXRhUHJpbWUpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gMSAvIChNYXRoLmNvcyh0aGV0YVByaW1lKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgMy4wNzc2OCAqIE1hdGguc2luKHRoZXRhUHJpbWUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgLyogTWFrZSBzdXJlIGdyaWRTaXplIGlzIGEgd2hvbGUgbnVtYmVyIGFuZCBpcyBub3Qgc21hbGxlciB0aGFuIDRweCAqLwogICAgc2V0dGluZ3MuZ3JpZFNpemUgPSBNYXRoLm1heChNYXRoLmZsb29yKHNldHRpbmdzLmdyaWRTaXplKSwgNCk7CgogICAgLyogc2hvcnRoYW5kICovCiAgICB2YXIgZyA9IHNldHRpbmdzLmdyaWRTaXplOwogICAgdmFyIG1hc2tSZWN0V2lkdGggPSBnIC0gc2V0dGluZ3MubWFza0dhcFdpZHRoOwoKICAgIC8qIG5vcm1hbGl6ZSByb3RhdGlvbiBzZXR0aW5ncyAqLwogICAgdmFyIHJvdGF0aW9uUmFuZ2UgPSBNYXRoLmFicyhzZXR0aW5ncy5tYXhSb3RhdGlvbiAtIHNldHRpbmdzLm1pblJvdGF0aW9uKTsKICAgIHZhciBtaW5Sb3RhdGlvbiA9IE1hdGgubWluKHNldHRpbmdzLm1heFJvdGF0aW9uLCBzZXR0aW5ncy5taW5Sb3RhdGlvbik7CgogICAgLyogaW5mb3JtYXRpb24vb2JqZWN0IGF2YWlsYWJsZSB0byBhbGwgZnVuY3Rpb25zLCBzZXQgd2hlbiBzdGFydCgpICovCiAgICB2YXIgZ3JpZCwgLy8gMmQgYXJyYXkgY29udGFpbmluZyBmaWxsaW5nIGluZm9ybWF0aW9uCiAgICAgIG5neCwgbmd5LCAvLyB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBncmlkCiAgICAgIGNlbnRlciwgLy8gcG9zaXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgY2xvdWQKICAgICAgbWF4UmFkaXVzOwoKICAgIC8qIHRpbWVzdGFtcCBmb3IgbWVhc3VyaW5nIGVhY2ggcHV0V29yZCgpIGFjdGlvbiAqLwogICAgdmFyIGVzY2FwZVRpbWU7CgogICAgLyogZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIGNvbG9yIG9mIHRoZSB0ZXh0ICovCiAgICB2YXIgZ2V0VGV4dENvbG9yOwogICAgZnVuY3Rpb24gcmFuZG9tX2hzbF9jb2xvcihtaW4sIG1heCkgewogICAgICByZXR1cm4gJ2hzbCgnICsKICAgICAgICAoTWF0aC5yYW5kb20oKSAqIDM2MCkudG9GaXhlZCgpICsgJywnICsKICAgICAgICAoTWF0aC5yYW5kb20oKSAqIDMwICsgNzApLnRvRml4ZWQoKSArICclLCcgKwogICAgICAgIChNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikgKyBtaW4pLnRvRml4ZWQoKSArICclKSc7CiAgICB9CiAgICBzd2l0Y2ggKHNldHRpbmdzLmNvbG9yKSB7CiAgICAgIGNhc2UgJ3JhbmRvbS1kYXJrJzoKICAgICAgICBnZXRUZXh0Q29sb3IgPSBmdW5jdGlvbiBnZXRSYW5kb21EYXJrQ29sb3IoKSB7CiAgICAgICAgICByZXR1cm4gcmFuZG9tX2hzbF9jb2xvcigxMCwgNTApOwogICAgICAgIH07CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdyYW5kb20tbGlnaHQnOgogICAgICAgIGdldFRleHRDb2xvciA9IGZ1bmN0aW9uIGdldFJhbmRvbUxpZ2h0Q29sb3IoKSB7CiAgICAgICAgICByZXR1cm4gcmFuZG9tX2hzbF9jb2xvcig1MCwgOTApOwogICAgICAgIH07CiAgICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OgogICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MuY29sb3IgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGdldFRleHRDb2xvciA9IHNldHRpbmdzLmNvbG9yOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KCiAgICAvKiBmdW5jdGlvbiBmb3IgZ2V0dGluZyB0aGUgY2xhc3NlcyBvZiB0aGUgdGV4dCAqLwogICAgdmFyIGdldFRleHRDbGFzc2VzID0gbnVsbDsKICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MuY2xhc3NlcyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBnZXRUZXh0Q2xhc3NlcyA9IHNldHRpbmdzLmNsYXNzZXM7CiAgICB9CgogICAgLyogSW50ZXJhY3RpdmUgKi8KICAgIHZhciBpbnRlcmFjdGl2ZSA9IGZhbHNlOwogICAgdmFyIGluZm9HcmlkID0gW107CiAgICB2YXIgaG92ZXJlZDsKCiAgICB2YXIgZ2V0SW5mb0dyaWRGcm9tTW91c2VUb3VjaEV2ZW50ID0KICAgIGZ1bmN0aW9uIGdldEluZm9HcmlkRnJvbU1vdXNlVG91Y2hFdmVudChldnQpIHsKICAgICAgdmFyIGNhbnZhcyA9IGV2dC5jdXJyZW50VGFyZ2V0OwogICAgICB2YXIgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgdmFyIGNsaWVudFg7CiAgICAgIHZhciBjbGllbnRZOwogICAgICAvKiogRGV0ZWN0IGlmIHRvdWNoZXMgYXJlIGF2YWlsYWJsZSAqLwogICAgICBpZiAoZXZ0LnRvdWNoZXMpIHsKICAgICAgICBjbGllbnRYID0gZXZ0LnRvdWNoZXNbMF0uY2xpZW50WDsKICAgICAgICBjbGllbnRZID0gZXZ0LnRvdWNoZXNbMF0uY2xpZW50WTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjbGllbnRYID0gZXZ0LmNsaWVudFg7CiAgICAgICAgY2xpZW50WSA9IGV2dC5jbGllbnRZOwogICAgICB9CiAgICAgIHZhciBldmVudFggPSBjbGllbnRYIC0gcmVjdC5sZWZ0OwogICAgICB2YXIgZXZlbnRZID0gY2xpZW50WSAtIHJlY3QudG9wOwoKICAgICAgdmFyIHggPSBNYXRoLmZsb29yKGV2ZW50WCAqICgoY2FudmFzLndpZHRoIC8gcmVjdC53aWR0aCkgfHwgMSkgLyBnKTsKICAgICAgdmFyIHkgPSBNYXRoLmZsb29yKGV2ZW50WSAqICgoY2FudmFzLmhlaWdodCAvIHJlY3QuaGVpZ2h0KSB8fCAxKSAvIGcpOwoKICAgICAgcmV0dXJuIGluZm9HcmlkW3hdW3ldOwogICAgfTsKCiAgICB2YXIgd29yZGNsb3VkaG92ZXIgPSBmdW5jdGlvbiB3b3JkY2xvdWRob3ZlcihldnQpIHsKICAgICAgdmFyIGluZm8gPSBnZXRJbmZvR3JpZEZyb21Nb3VzZVRvdWNoRXZlbnQoZXZ0KTsKCiAgICAgIGlmIChob3ZlcmVkID09PSBpbmZvKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBob3ZlcmVkID0gaW5mbzsKICAgICAgaWYgKCFpbmZvKSB7CiAgICAgICAgc2V0dGluZ3MuaG92ZXIodW5kZWZpbmVkLCB1bmRlZmluZWQsIGV2dCk7CgogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgc2V0dGluZ3MuaG92ZXIoaW5mby5pdGVtLCBpbmZvLmRpbWVuc2lvbiwgZXZ0KTsKCiAgICB9OwoKICAgIHZhciB3b3JkY2xvdWRjbGljayA9IGZ1bmN0aW9uIHdvcmRjbG91ZGNsaWNrKGV2dCkgewogICAgICB2YXIgaW5mbyA9IGdldEluZm9HcmlkRnJvbU1vdXNlVG91Y2hFdmVudChldnQpOwogICAgICBpZiAoIWluZm8pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHNldHRpbmdzLmNsaWNrKGluZm8uaXRlbSwgaW5mby5kaW1lbnNpb24sIGV2dCk7CiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpOwogICAgfTsKCiAgICAvKiBHZXQgcG9pbnRzIG9uIHRoZSBncmlkIGZvciBhIGdpdmVuIHJhZGl1cyBhd2F5IGZyb20gdGhlIGNlbnRlciAqLwogICAgdmFyIHBvaW50c0F0UmFkaXVzID0gW107CiAgICB2YXIgZ2V0UG9pbnRzQXRSYWRpdXMgPSBmdW5jdGlvbiBnZXRQb2ludHNBdFJhZGl1cyhyYWRpdXMpIHsKICAgICAgaWYgKHBvaW50c0F0UmFkaXVzW3JhZGl1c10pIHsKICAgICAgICByZXR1cm4gcG9pbnRzQXRSYWRpdXNbcmFkaXVzXTsKICAgICAgfQoKICAgICAgLy8gTG9vayBmb3IgdGhlc2UgbnVtYmVyIG9mIHBvaW50cyBvbiBlYWNoIHJhZGl1cwogICAgICB2YXIgVCA9IHJhZGl1cyAqIDg7CgogICAgICAvLyBHZXR0aW5nIGFsbCB0aGUgcG9pbnRzIGF0IHRoaXMgcmFkaXVzCiAgICAgIHZhciB0ID0gVDsKICAgICAgdmFyIHBvaW50cyA9IFtdOwoKICAgICAgaWYgKHJhZGl1cyA9PT0gMCkgewogICAgICAgIHBvaW50cy5wdXNoKFtjZW50ZXJbMF0sIGNlbnRlclsxXSwgMF0pOwogICAgICB9CgogICAgICB3aGlsZSAodC0tKSB7CiAgICAgICAgLy8gZGlzdG9ydCB0aGUgcmFkaXVzIHRvIHB1dCB0aGUgY2xvdWQgaW4gc2hhcGUKICAgICAgICB2YXIgcnggPSAxOwogICAgICAgIGlmIChzZXR0aW5ncy5zaGFwZSAhPT0gJ2NpcmNsZScpIHsKICAgICAgICAgIHJ4ID0gc2V0dGluZ3Muc2hhcGUodCAvIFQgKiAyICogTWF0aC5QSSk7IC8vIDAgdG8gMQogICAgICAgIH0KCiAgICAgICAgLy8gUHVzaCBbeCwgeSwgdF07IHQgaXMgdXNlZCBzb2xlbHkgZm9yIGdldFRleHRDb2xvcigpCiAgICAgICAgcG9pbnRzLnB1c2goWwogICAgICAgICAgY2VudGVyWzBdICsgcmFkaXVzICogcnggKiBNYXRoLmNvcygtdCAvIFQgKiAyICogTWF0aC5QSSksCiAgICAgICAgICBjZW50ZXJbMV0gKyByYWRpdXMgKiByeCAqIE1hdGguc2luKC10IC8gVCAqIDIgKiBNYXRoLlBJKSAqCiAgICAgICAgICAgIHNldHRpbmdzLmVsbGlwdGljaXR5LAogICAgICAgICAgdCAvIFQgKiAyICogTWF0aC5QSV0pOwogICAgICB9CgogICAgICBwb2ludHNBdFJhZGl1c1tyYWRpdXNdID0gcG9pbnRzOwogICAgICByZXR1cm4gcG9pbnRzOwogICAgfTsKCiAgICAvKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYWQgc3BlbnQgdG9vIG11Y2ggdGltZSAqLwogICAgdmFyIGV4Y2VlZFRpbWUgPSBmdW5jdGlvbiBleGNlZWRUaW1lKCkgewogICAgICByZXR1cm4gKChzZXR0aW5ncy5hYm9ydFRocmVzaG9sZCA+IDApICYmCiAgICAgICAgKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLSBlc2NhcGVUaW1lID4gc2V0dGluZ3MuYWJvcnRUaHJlc2hvbGQpKTsKICAgIH07CgogICAgLyogR2V0IHRoZSBkZWcgb2Ygcm90YXRpb24gYWNjb3JkaW5nIHRvIHNldHRpbmdzLCBhbmQgbHVjay4gKi8KICAgIHZhciBnZXRSb3RhdGVEZWcgPSBmdW5jdGlvbiBnZXRSb3RhdGVEZWcoKSB7CiAgICAgIGlmIChzZXR0aW5ncy5yb3RhdGVSYXRpbyA9PT0gMCkgewogICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICBpZiAoTWF0aC5yYW5kb20oKSA+IHNldHRpbmdzLnJvdGF0ZVJhdGlvKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIGlmIChyb3RhdGlvblJhbmdlID09PSAwKSB7CiAgICAgICAgcmV0dXJuIG1pblJvdGF0aW9uOwogICAgICB9CgogICAgICByZXR1cm4gbWluUm90YXRpb24gKyBNYXRoLnJhbmRvbSgpICogcm90YXRpb25SYW5nZTsKICAgIH07CgogICAgdmFyIGdldFRleHRJbmZvID0gZnVuY3Rpb24gZ2V0VGV4dEluZm8od29yZCwgd2VpZ2h0LCByb3RhdGVEZWcpIHsKICAgICAgLy8gY2FsY3VsYXRlIHRoZSBhY3V0YWwgZm9udCBzaXplCiAgICAgIC8vIGZvbnRTaXplID09PSAwIG1lYW5zIHdlaWdodEZhY3RvciBmdW5jdGlvbiB3YW50cyB0aGUgdGV4dCBza2lwcGVkLAogICAgICAvLyBhbmQgc2l6ZSA8IG1pblNpemUgbWVhbnMgd2UgY2Fubm90IGRyYXcgdGhlIHRleHQuCiAgICAgIHZhciBkZWJ1ZyA9IGZhbHNlOwogICAgICB2YXIgZm9udFNpemUgPSBzZXR0aW5ncy53ZWlnaHRGYWN0b3Iod2VpZ2h0KTsKICAgICAgaWYgKGZvbnRTaXplIDw9IHNldHRpbmdzLm1pblNpemUpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8vIFNjYWxlIGZhY3RvciBoZXJlIGlzIHRvIG1ha2Ugc3VyZSBmaWxsVGV4dCBpcyBub3QgbGltaXRlZCBieQogICAgICAvLyB0aGUgbWluaXVtIGZvbnQgc2l6ZSBzZXQgYnkgYnJvd3Nlci4KICAgICAgLy8gSXQgd2lsbCBhbHdheXMgYmUgMSBvciAybi4KICAgICAgdmFyIG11ID0gMTsKICAgICAgaWYgKGZvbnRTaXplIDwgbWluRm9udFNpemUpIHsKICAgICAgICBtdSA9IChmdW5jdGlvbiBjYWxjdWxhdGVTY2FsZUZhY3RvcigpIHsKICAgICAgICAgIHZhciBtdSA9IDI7CiAgICAgICAgICB3aGlsZSAobXUgKiBmb250U2l6ZSA8IG1pbkZvbnRTaXplKSB7CiAgICAgICAgICAgIG11ICs9IDI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbXU7CiAgICAgICAgfSkoKTsKICAgICAgfQoKICAgICAgdmFyIGZjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgICAgdmFyIGZjdHggPSBmY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7CgogICAgICBmY3R4LmZvbnQgPSBzZXR0aW5ncy5mb250V2VpZ2h0ICsgJyAnICsKICAgICAgICAoZm9udFNpemUgKiBtdSkudG9TdHJpbmcoMTApICsgJ3B4ICcgKyBzZXR0aW5ncy5mb250RmFtaWx5OwoKICAgICAgLy8gRXN0aW1hdGUgdGhlIGRpbWVuc2lvbiBvZiB0aGUgdGV4dCB3aXRoIG1lYXN1cmVUZXh0KCkuCiAgICAgIHZhciBmdyA9IGZjdHgubWVhc3VyZVRleHQod29yZCkud2lkdGggLyBtdTsKICAgICAgdmFyIGZoID0gTWF0aC5tYXgoZm9udFNpemUgKiBtdSwKICAgICAgICAgICAgICAgICAgICAgICAgZmN0eC5tZWFzdXJlVGV4dCgnbScpLndpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICBmY3R4Lm1lYXN1cmVUZXh0KCdcdUZGMzcnKS53aWR0aCkgLyBtdTsKCiAgICAgIC8vIENyZWF0ZSBhIGJvdW5kYXJ5IGJveCB0aGF0IGlzIGxhcmdlciB0aGFuIG91ciBlc3RpbWF0ZXMsCiAgICAgIC8vIHNvIHRleHQgZG9uJ3QgZ2V0IGN1dCBvZiAoaXQgc2lsbCBtaWdodCkKICAgICAgdmFyIGJveFdpZHRoID0gZncgKyBmaCAqIDI7CiAgICAgIHZhciBib3hIZWlnaHQgPSBmaCAqIDM7CiAgICAgIHZhciBmZ3cgPSBNYXRoLmNlaWwoYm94V2lkdGggLyBnKTsKICAgICAgdmFyIGZnaCA9IE1hdGguY2VpbChib3hIZWlnaHQgLyBnKTsKICAgICAgYm94V2lkdGggPSBmZ3cgKiBnOwogICAgICBib3hIZWlnaHQgPSBmZ2ggKiBnOwoKICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBwcm9wZXIgb2Zmc2V0cyB0byBtYWtlIHRoZSB0ZXh0IGNlbnRlcmVkIGF0CiAgICAgIC8vIHRoZSBwcmVmZXJyZWQgcG9zaXRpb24uCgogICAgICAvLyBUaGlzIGlzIHNpbXBseSBoYWxmIG9mIHRoZSB3aWR0aC4KICAgICAgdmFyIGZpbGxUZXh0T2Zmc2V0WCA9IC0gZncgLyAyOwogICAgICAvLyBJbnN0ZWFkIG9mIG1vdmluZyB0aGUgYm94IHRvIHRoZSBleGFjdCBtaWRkbGUgb2YgdGhlIHByZWZlcnJlZAogICAgICAvLyBwb3NpdGlvbiwgZm9yIFktb2Zmc2V0IHdlIG1vdmUgMC40IGluc3RlYWQsIHNvIExhdGluIGFscGhhYmV0cyBsb29rCiAgICAgIC8vIHZlcnRpY2FsIGNlbnRlcmVkLgogICAgICB2YXIgZmlsbFRleHRPZmZzZXRZID0gLSBmaCAqIDAuNDsKCiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgYWN0dWFsIGRpbWVuc2lvbiBvZiB0aGUgY2FudmFzLCBjb25zaWRlcmluZyB0aGUgcm90YXRpb24uCiAgICAgIHZhciBjZ2ggPSBNYXRoLmNlaWwoKGJveFdpZHRoICogTWF0aC5hYnMoTWF0aC5zaW4ocm90YXRlRGVnKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICBib3hIZWlnaHQgKiBNYXRoLmFicyhNYXRoLmNvcyhyb3RhdGVEZWcpKSkgLyBnKTsKICAgICAgdmFyIGNndyA9IE1hdGguY2VpbCgoYm94V2lkdGggKiBNYXRoLmFicyhNYXRoLmNvcyhyb3RhdGVEZWcpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveEhlaWdodCAqIE1hdGguYWJzKE1hdGguc2luKHJvdGF0ZURlZykpKSAvIGcpOwogICAgICB2YXIgd2lkdGggPSBjZ3cgKiBnOwogICAgICB2YXIgaGVpZ2h0ID0gY2doICogZzsKCiAgICAgIGZjYW52YXMuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHdpZHRoKTsKICAgICAgZmNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGhlaWdodCk7CgogICAgICBpZiAoZGVidWcpIHsKICAgICAgICAvLyBBdHRhY2ggZmNhbnZhcyB0byB0aGUgRE9NCiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmY2FudmFzKTsKICAgICAgICAvLyBTYXZlIGl0J3Mgc3RhdGUgc28gdGhhdCB3ZSBjb3VsZCByZXN0b3JlIGFuZCBkcmF3IHRoZSBncmlkIGNvcnJlY3RseS4KICAgICAgICBmY3R4LnNhdmUoKTsKICAgICAgfQoKICAgICAgLy8gU2NhbGUgdGhlIGNhbnZhcyB3aXRoIHxtdXwuCiAgICAgIGZjdHguc2NhbGUoMSAvIG11LCAxIC8gbXUpOwogICAgICBmY3R4LnRyYW5zbGF0ZSh3aWR0aCAqIG11IC8gMiwgaGVpZ2h0ICogbXUgLyAyKTsKICAgICAgZmN0eC5yb3RhdGUoLSByb3RhdGVEZWcpOwoKICAgICAgLy8gT25jZSB0aGUgd2lkdGgvaGVpZ2h0IGlzIHNldCwgY3R4IGluZm8gd2lsbCBiZSByZXNldC4KICAgICAgLy8gU2V0IGl0IGFnYWluIGhlcmUuCiAgICAgIGZjdHguZm9udCA9IHNldHRpbmdzLmZvbnRXZWlnaHQgKyAnICcgKwogICAgICAgIChmb250U2l6ZSAqIG11KS50b1N0cmluZygxMCkgKyAncHggJyArIHNldHRpbmdzLmZvbnRGYW1pbHk7CgogICAgICAvLyBGaWxsIHRoZSB0ZXh0IGludG8gdGhlIGZjYW52YXMuCiAgICAgIC8vIFhYWDogV2UgY2Fubm90IGJlY2F1c2UgdGV4dEJhc2VsaW5lID0gJ3RvcCcgaGVyZSBiZWNhdXNlCiAgICAgIC8vIEZpcmVmb3ggYW5kIENocm9tZSB1c2VzIGRpZmZlcmVudCBkZWZhdWx0IGxpbmUtaGVpZ2h0IGZvciBjYW52YXMuCiAgICAgIC8vIFBsZWFzZSByZWFkIGh0dHBzOi8vYnVnemlsLmxhLzczNzg1MiNjNi4KICAgICAgLy8gSGVyZSwgd2UgdXNlIHRleHRCYXNlbGluZSA9ICdtaWRkbGUnIGFuZCBkcmF3IHRoZSB0ZXh0IGF0IGV4YWN0bHkKICAgICAgLy8gMC41ICogZm9udFNpemUgbG93ZXIuCiAgICAgIGZjdHguZmlsbFN0eWxlID0gJyMwMDAnOwogICAgICBmY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnOwogICAgICBmY3R4LmZpbGxUZXh0KHdvcmQsIGZpbGxUZXh0T2Zmc2V0WCAqIG11LAogICAgICAgICAgICAgICAgICAgIChmaWxsVGV4dE9mZnNldFkgKyBmb250U2l6ZSAqIDAuNSkgKiBtdSk7CgogICAgICAvLyBHZXQgdGhlIHBpeGVscyBvZiB0aGUgdGV4dAogICAgICB2YXIgaW1hZ2VEYXRhID0gZmN0eC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCkuZGF0YTsKCiAgICAgIGlmIChleGNlZWRUaW1lKCkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIGlmIChkZWJ1ZykgewogICAgICAgIC8vIERyYXcgdGhlIGJveCBvZiB0aGUgb3JpZ2luYWwgZXN0aW1hdGlvbgogICAgICAgIGZjdHguc3Ryb2tlUmVjdChmaWxsVGV4dE9mZnNldFggKiBtdSwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFRleHRPZmZzZXRZLCBmdyAqIG11LCBmaCAqIG11KTsKICAgICAgICBmY3R4LnJlc3RvcmUoKTsKICAgICAgfQoKICAgICAgLy8gUmVhZCB0aGUgcGl4ZWxzIGFuZCBzYXZlIHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgb2NjdXBpZWQgYXJyYXkKICAgICAgdmFyIG9jY3VwaWVkID0gW107CiAgICAgIHZhciBneCA9IGNndywgZ3ksIHgsIHk7CiAgICAgIHZhciBib3VuZHMgPSBbY2doIC8gMiwgY2d3IC8gMiwgY2doIC8gMiwgY2d3IC8gMl07CiAgICAgIHdoaWxlIChneC0tKSB7CiAgICAgICAgZ3kgPSBjZ2g7CiAgICAgICAgd2hpbGUgKGd5LS0pIHsKICAgICAgICAgIHkgPSBnOwogICAgICAgICAgc2luZ2xlR3JpZExvb3A6IHsKICAgICAgICAgICAgd2hpbGUgKHktLSkgewogICAgICAgICAgICAgIHggPSBnOwogICAgICAgICAgICAgIHdoaWxlICh4LS0pIHsKICAgICAgICAgICAgICAgIGlmIChpbWFnZURhdGFbKChneSAqIGcgKyB5KSAqIHdpZHRoICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChneCAqIGcgKyB4KSkgKiA0ICsgM10pIHsKICAgICAgICAgICAgICAgICAgb2NjdXBpZWQucHVzaChbZ3gsIGd5XSk7CgogICAgICAgICAgICAgICAgICBpZiAoZ3ggPCBib3VuZHNbM10pIHsKICAgICAgICAgICAgICAgICAgICBib3VuZHNbM10gPSBneDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoZ3ggPiBib3VuZHNbMV0pIHsKICAgICAgICAgICAgICAgICAgICBib3VuZHNbMV0gPSBneDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoZ3kgPCBib3VuZHNbMF0pIHsKICAgICAgICAgICAgICAgICAgICBib3VuZHNbMF0gPSBneTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoZ3kgPiBib3VuZHNbMl0pIHsKICAgICAgICAgICAgICAgICAgICBib3VuZHNbMl0gPSBneTsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnKSB7CiAgICAgICAgICAgICAgICAgICAgZmN0eC5maWxsU3R5bGUgPSAncmdiYSgyNTUsIDAsIDAsIDAuNSknOwogICAgICAgICAgICAgICAgICAgIGZjdHguZmlsbFJlY3QoZ3ggKiBnLCBneSAqIGcsIGcgLSAwLjUsIGcgLSAwLjUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGJyZWFrIHNpbmdsZUdyaWRMb29wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGVidWcpIHsKICAgICAgICAgICAgICBmY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDAsIDAsIDI1NSwgMC41KSc7CiAgICAgICAgICAgICAgZmN0eC5maWxsUmVjdChneCAqIGcsIGd5ICogZywgZyAtIDAuNSwgZyAtIDAuNSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChkZWJ1ZykgewogICAgICAgIGZjdHguZmlsbFN0eWxlID0gJ3JnYmEoMCwgMjU1LCAwLCAwLjUpJzsKICAgICAgICBmY3R4LmZpbGxSZWN0KGJvdW5kc1szXSAqIGcsCiAgICAgICAgICAgICAgICAgICAgICBib3VuZHNbMF0gKiBnLAogICAgICAgICAgICAgICAgICAgICAgKGJvdW5kc1sxXSAtIGJvdW5kc1szXSArIDEpICogZywKICAgICAgICAgICAgICAgICAgICAgIChib3VuZHNbMl0gLSBib3VuZHNbMF0gKyAxKSAqIGcpOwogICAgICB9CgogICAgICAvLyBSZXR1cm4gaW5mb3JtYXRpb24gbmVlZGVkIHRvIGNyZWF0ZSB0aGUgdGV4dCBvbiB0aGUgcmVhbCBjYW52YXMKICAgICAgcmV0dXJuIHsKICAgICAgICBtdTogbXUsCiAgICAgICAgb2NjdXBpZWQ6IG9jY3VwaWVkLAogICAgICAgIGJvdW5kczogYm91bmRzLAogICAgICAgIGd3OiBjZ3csCiAgICAgICAgZ2g6IGNnaCwKICAgICAgICBmaWxsVGV4dE9mZnNldFg6IGZpbGxUZXh0T2Zmc2V0WCwKICAgICAgICBmaWxsVGV4dE9mZnNldFk6IGZpbGxUZXh0T2Zmc2V0WSwKICAgICAgICBmaWxsVGV4dFdpZHRoOiBmdywKICAgICAgICBmaWxsVGV4dEhlaWdodDogZmgsCiAgICAgICAgZm9udFNpemU6IGZvbnRTaXplCiAgICAgIH07CiAgICB9OwoKICAgIC8qIERldGVybWluZSBpZiB0aGVyZSBpcyByb29tIGF2YWlsYWJsZSBpbiB0aGUgZ2l2ZW4gZGltZW5zaW9uICovCiAgICB2YXIgY2FuRml0VGV4dCA9IGZ1bmN0aW9uIGNhbkZpdFRleHQoZ3gsIGd5LCBndywgZ2gsIG9jY3VwaWVkKSB7CiAgICAgIC8vIEdvIHRocm91Z2ggdGhlIG9jY3VwaWVkIHBvaW50cywKICAgICAgLy8gcmV0dXJuIGZhbHNlIGlmIHRoZSBzcGFjZSBpcyBub3QgYXZhaWxhYmxlLgogICAgICB2YXIgaSA9IG9jY3VwaWVkLmxlbmd0aDsKICAgICAgd2hpbGUgKGktLSkgewogICAgICAgIHZhciBweCA9IGd4ICsgb2NjdXBpZWRbaV1bMF07CiAgICAgICAgdmFyIHB5ID0gZ3kgKyBvY2N1cGllZFtpXVsxXTsKCiAgICAgICAgaWYgKHB4ID49IG5neCB8fCBweSA+PSBuZ3kgfHwgcHggPCAwIHx8IHB5IDwgMCB8fCAhZ3JpZFtweF1bcHldKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfTsKCiAgICAvKiBBY3R1YWxseSBkcmF3IHRoZSB0ZXh0IG9uIHRoZSBncmlkICovCiAgICB2YXIgZHJhd1RleHQgPSBmdW5jdGlvbiBkcmF3VGV4dChneCwgZ3ksIGluZm8sIHdvcmQsIHdlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlLCB0aGV0YSwgcm90YXRlRGVnLCBhdHRyaWJ1dGVzKSB7CgogICAgICB2YXIgZm9udFNpemUgPSBpbmZvLmZvbnRTaXplOwogICAgICB2YXIgY29sb3I7CiAgICAgIGlmIChnZXRUZXh0Q29sb3IpIHsKICAgICAgICBjb2xvciA9IGdldFRleHRDb2xvcih3b3JkLCB3ZWlnaHQsIGZvbnRTaXplLCBkaXN0YW5jZSwgdGhldGEpOwogICAgICB9IGVsc2UgaWYgKHNldHRpbmdzLmNvbG9yIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICBjb2xvciA9IHNldHRpbmdzLmNvbG9yLnNoaWZ0KCkgfHwgJ2JsYWNrJzsgLy8gcGFzcyBhIGFycmF5IGluIHNldHRpbmcsIGRlZmF1bHQgJ2JsYWNrJwogICAgICB9IGVsc2UgewogICAgICAgIGNvbG9yID0gc2V0dGluZ3MuY29sb3I7CiAgICAgIH0KCiAgICAgIHZhciBjbGFzc2VzOwogICAgICBpZiAoZ2V0VGV4dENsYXNzZXMpIHsKICAgICAgICBjbGFzc2VzID0gZ2V0VGV4dENsYXNzZXMod29yZCwgd2VpZ2h0LCBmb250U2l6ZSwgZGlzdGFuY2UsIHRoZXRhKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjbGFzc2VzID0gc2V0dGluZ3MuY2xhc3NlczsKICAgICAgfQoKICAgICAgdmFyIGRpbWVuc2lvbjsKICAgICAgdmFyIGJvdW5kcyA9IGluZm8uYm91bmRzOwogICAgICBkaW1lbnNpb24gPSB7CiAgICAgICAgeDogKGd4ICsgYm91bmRzWzNdKSAqIGcsCiAgICAgICAgeTogKGd5ICsgYm91bmRzWzBdKSAqIGcsCiAgICAgICAgdzogKGJvdW5kc1sxXSAtIGJvdW5kc1szXSArIDEpICogZywKICAgICAgICBoOiAoYm91bmRzWzJdIC0gYm91bmRzWzBdICsgMSkgKiBnCiAgICAgIH07CgogICAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgaWYgKGVsLmdldENvbnRleHQpIHsKICAgICAgICAgIHZhciBjdHggPSBlbC5nZXRDb250ZXh0KCcyZCcpOwogICAgICAgICAgdmFyIG11ID0gaW5mby5tdTsKCiAgICAgICAgICAvLyBTYXZlIHRoZSBjdXJyZW50IHN0YXRlIGJlZm9yZSBtZXNzaW5nIGl0CiAgICAgICAgICBjdHguc2F2ZSgpOwogICAgICAgICAgY3R4LnNjYWxlKDEgLyBtdSwgMSAvIG11KTsKCiAgICAgICAgICBjdHguZm9udCA9IHNldHRpbmdzLmZvbnRXZWlnaHQgKyAnICcgKwogICAgICAgICAgICAgICAgICAgICAoZm9udFNpemUgKiBtdSkudG9TdHJpbmcoMTApICsgJ3B4ICcgKyBzZXR0aW5ncy5mb250RmFtaWx5OwogICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yOwoKICAgICAgICAgIC8vIFRyYW5zbGF0ZSB0aGUgY2FudmFzIHBvc2l0aW9uIHRvIHRoZSBvcmlnaW4gY29vcmRpbmF0ZSBvZiB3aGVyZQogICAgICAgICAgLy8gdGhlIHRleHQgc2hvdWxkIGJlIHB1dC4KICAgICAgICAgIGN0eC50cmFuc2xhdGUoKGd4ICsgaW5mby5ndyAvIDIpICogZyAqIG11LAogICAgICAgICAgICAgICAgICAgICAgICAoZ3kgKyBpbmZvLmdoIC8gMikgKiBnICogbXUpOwoKICAgICAgICAgIGlmIChyb3RhdGVEZWcgIT09IDApIHsKICAgICAgICAgICAgY3R4LnJvdGF0ZSgtIHJvdGF0ZURlZyk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gRmluYWxseSwgZmlsbCB0aGUgdGV4dC4KCiAgICAgICAgICAvLyBYWFg6IFdlIGNhbm5vdCBiZWNhdXNlIHRleHRCYXNlbGluZSA9ICd0b3AnIGhlcmUgYmVjYXVzZQogICAgICAgICAgLy8gRmlyZWZveCBhbmQgQ2hyb21lIHVzZXMgZGlmZmVyZW50IGRlZmF1bHQgbGluZS1oZWlnaHQgZm9yIGNhbnZhcy4KICAgICAgICAgIC8vIFBsZWFzZSByZWFkIGh0dHBzOi8vYnVnemlsLmxhLzczNzg1MiNjNi4KICAgICAgICAgIC8vIEhlcmUsIHdlIHVzZSB0ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJyBhbmQgZHJhdyB0aGUgdGV4dCBhdCBleGFjdGx5CiAgICAgICAgICAvLyAwLjUgKiBmb250U2l6ZSBsb3dlci4KICAgICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJzsKICAgICAgICAgIGN0eC5maWxsVGV4dCh3b3JkLCBpbmZvLmZpbGxUZXh0T2Zmc2V0WCAqIG11LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmZvLmZpbGxUZXh0T2Zmc2V0WSArIGZvbnRTaXplICogMC41KSAqIG11KTsKCiAgICAgICAgICAvLyBUaGUgYmVsb3cgYm94IGlzIGFsd2F5cyBtYXRjaGVzIGhvdyA8c3Bhbj5zIGFyZSBwb3NpdGlvbmVkCiAgICAgICAgICAvKiBjdHguc3Ryb2tlUmVjdChpbmZvLmZpbGxUZXh0T2Zmc2V0WCwgaW5mby5maWxsVGV4dE9mZnNldFksCiAgICAgICAgICAgIGluZm8uZmlsbFRleHRXaWR0aCwgaW5mby5maWxsVGV4dEhlaWdodCk7ICovCgogICAgICAgICAgLy8gUmVzdG9yZSB0aGUgc3RhdGUuCiAgICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBkcmF3VGV4dCBvbiBESVYgZWxlbWVudAogICAgICAgICAgdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgICB2YXIgdHJhbnNmb3JtUnVsZSA9ICcnOwogICAgICAgICAgdHJhbnNmb3JtUnVsZSA9ICdyb3RhdGUoJyArICgtIHJvdGF0ZURlZyAvIE1hdGguUEkgKiAxODApICsgJ2RlZykgJzsKICAgICAgICAgIGlmIChpbmZvLm11ICE9PSAxKSB7CiAgICAgICAgICAgIHRyYW5zZm9ybVJ1bGUgKz0KICAgICAgICAgICAgICAndHJhbnNsYXRlWCgtJyArIChpbmZvLmZpbGxUZXh0V2lkdGggLyA0KSArICdweCkgJyArCiAgICAgICAgICAgICAgJ3NjYWxlKCcgKyAoMSAvIGluZm8ubXUpICsgJyknOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHN0eWxlUnVsZXMgPSB7CiAgICAgICAgICAgICdwb3NpdGlvbic6ICdhYnNvbHV0ZScsCiAgICAgICAgICAgICdkaXNwbGF5JzogJ2Jsb2NrJywKICAgICAgICAgICAgJ2ZvbnQnOiBzZXR0aW5ncy5mb250V2VpZ2h0ICsgJyAnICsKICAgICAgICAgICAgICAgICAgICAoZm9udFNpemUgKiBpbmZvLm11KSArICdweCAnICsgc2V0dGluZ3MuZm9udEZhbWlseSwKICAgICAgICAgICAgJ2xlZnQnOiAoKGd4ICsgaW5mby5ndyAvIDIpICogZyArIGluZm8uZmlsbFRleHRPZmZzZXRYKSArICdweCcsCiAgICAgICAgICAgICd0b3AnOiAoKGd5ICsgaW5mby5naCAvIDIpICogZyArIGluZm8uZmlsbFRleHRPZmZzZXRZKSArICdweCcsCiAgICAgICAgICAgICd3aWR0aCc6IGluZm8uZmlsbFRleHRXaWR0aCArICdweCcsCiAgICAgICAgICAgICdoZWlnaHQnOiBpbmZvLmZpbGxUZXh0SGVpZ2h0ICsgJ3B4JywKICAgICAgICAgICAgJ2xpbmVIZWlnaHQnOiBmb250U2l6ZSArICdweCcsCiAgICAgICAgICAgICd3aGl0ZVNwYWNlJzogJ25vd3JhcCcsCiAgICAgICAgICAgICd0cmFuc2Zvcm0nOiB0cmFuc2Zvcm1SdWxlLAogICAgICAgICAgICAnd2Via2l0VHJhbnNmb3JtJzogdHJhbnNmb3JtUnVsZSwKICAgICAgICAgICAgJ21zVHJhbnNmb3JtJzogdHJhbnNmb3JtUnVsZSwKICAgICAgICAgICAgJ3RyYW5zZm9ybU9yaWdpbic6ICc1MCUgNDAlJywKICAgICAgICAgICAgJ3dlYmtpdFRyYW5zZm9ybU9yaWdpbic6ICc1MCUgNDAlJywKICAgICAgICAgICAgJ21zVHJhbnNmb3JtT3JpZ2luJzogJzUwJSA0MCUnCiAgICAgICAgICB9OwogICAgICAgICAgaWYgKGNvbG9yKSB7CiAgICAgICAgICAgIHN0eWxlUnVsZXMuY29sb3IgPSBjb2xvcjsKICAgICAgICAgIH0KICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB3b3JkOwogICAgICAgICAgZm9yICh2YXIgY3NzUHJvcCBpbiBzdHlsZVJ1bGVzKSB7CiAgICAgICAgICAgIHNwYW4uc3R5bGVbY3NzUHJvcF0gPSBzdHlsZVJ1bGVzW2Nzc1Byb3BdOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgZm9yICh2YXIgYXR0cmlidXRlIGluIGF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGF0dHJpYnV0ZXNbYXR0cmlidXRlXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChjbGFzc2VzKSB7CiAgICAgICAgICAgIHNwYW4uY2xhc3NOYW1lICs9IGNsYXNzZXM7CiAgICAgICAgICB9CiAgICAgICAgICBlbC5hcHBlbmRDaGlsZChzcGFuKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfTsKCiAgICAvKiBIZWxwIGZ1bmN0aW9uIHRvIHVwZGF0ZUdyaWQgKi8KICAgIHZhciBmaWxsR3JpZEF0ID0gZnVuY3Rpb24gZmlsbEdyaWRBdCh4LCB5LCBkcmF3TWFzaywgZGltZW5zaW9uLCBpdGVtKSB7CiAgICAgIGlmICh4ID49IG5neCB8fCB5ID49IG5neSB8fCB4IDwgMCB8fCB5IDwgMCkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgZ3JpZFt4XVt5XSA9IGZhbHNlOwoKICAgICAgaWYgKGRyYXdNYXNrKSB7CiAgICAgICAgdmFyIGN0eCA9IGVsZW1lbnRzWzBdLmdldENvbnRleHQoJzJkJyk7CiAgICAgICAgY3R4LmZpbGxSZWN0KHggKiBnLCB5ICogZywgbWFza1JlY3RXaWR0aCwgbWFza1JlY3RXaWR0aCk7CiAgICAgIH0KCiAgICAgIGlmIChpbnRlcmFjdGl2ZSkgewogICAgICAgIGluZm9HcmlkW3hdW3ldID0geyBpdGVtOiBpdGVtLCBkaW1lbnNpb246IGRpbWVuc2lvbiB9OwogICAgICB9CiAgICB9OwoKICAgIC8qIFVwZGF0ZSB0aGUgZmlsbGluZyBpbmZvcm1hdGlvbiBvZiB0aGUgZ2l2ZW4gc3BhY2Ugd2l0aCBvY2N1cGllZCBwb2ludHMuCiAgICAgICBEcmF3IHRoZSBtYXNrIG9uIHRoZSBjYW52YXMgaWYgbmVjZXNzYXJ5LiAqLwogICAgdmFyIHVwZGF0ZUdyaWQgPSBmdW5jdGlvbiB1cGRhdGVHcmlkKGd4LCBneSwgZ3csIGdoLCBpbmZvLCBpdGVtKSB7CiAgICAgIHZhciBvY2N1cGllZCA9IGluZm8ub2NjdXBpZWQ7CiAgICAgIHZhciBkcmF3TWFzayA9IHNldHRpbmdzLmRyYXdNYXNrOwogICAgICB2YXIgY3R4OwogICAgICBpZiAoZHJhd01hc2spIHsKICAgICAgICBjdHggPSBlbGVtZW50c1swXS5nZXRDb250ZXh0KCcyZCcpOwogICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHNldHRpbmdzLm1hc2tDb2xvcjsKICAgICAgfQoKICAgICAgdmFyIGRpbWVuc2lvbjsKICAgICAgaWYgKGludGVyYWN0aXZlKSB7CiAgICAgICAgdmFyIGJvdW5kcyA9IGluZm8uYm91bmRzOwogICAgICAgIGRpbWVuc2lvbiA9IHsKICAgICAgICAgIHg6IChneCArIGJvdW5kc1szXSkgKiBnLAogICAgICAgICAgeTogKGd5ICsgYm91bmRzWzBdKSAqIGcsCiAgICAgICAgICB3OiAoYm91bmRzWzFdIC0gYm91bmRzWzNdICsgMSkgKiBnLAogICAgICAgICAgaDogKGJvdW5kc1syXSAtIGJvdW5kc1swXSArIDEpICogZwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHZhciBpID0gb2NjdXBpZWQubGVuZ3RoOwogICAgICB3aGlsZSAoaS0tKSB7CiAgICAgICAgZmlsbEdyaWRBdChneCArIG9jY3VwaWVkW2ldWzBdLCBneSArIG9jY3VwaWVkW2ldWzFdLAogICAgICAgICAgICAgICAgICAgZHJhd01hc2ssIGRpbWVuc2lvbiwgaXRlbSk7CiAgICAgIH0KCiAgICAgIGlmIChkcmF3TWFzaykgewogICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICAgIH0KICAgIH07CgogICAgLyogcHV0V29yZCgpIHByb2Nlc3NlcyBlYWNoIGl0ZW0gb24gdGhlIGxpc3QsCiAgICAgICBjYWxjdWxhdGUgaXQncyBzaXplIGFuZCBkZXRlcm1pbmUgaXQncyBwb3NpdGlvbiwgYW5kIGFjdHVhbGx5CiAgICAgICBwdXQgaXQgb24gdGhlIGNhbnZhcy4gKi8KICAgIHZhciBwdXRXb3JkID0gZnVuY3Rpb24gcHV0V29yZChpdGVtKSB7CiAgICAgIHZhciB3b3JkLCB3ZWlnaHQsIGF0dHJpYnV0ZXM7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7CiAgICAgICAgd29yZCA9IGl0ZW1bMF07CiAgICAgICAgd2VpZ2h0ID0gaXRlbVsxXTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3b3JkID0gaXRlbS53b3JkOwogICAgICAgIHdlaWdodCA9IGl0ZW0ud2VpZ2h0OwogICAgICAgIGF0dHJpYnV0ZXMgPSBpdGVtLmF0dHJpYnV0ZXM7CiAgICAgIH0KICAgICAgdmFyIHJvdGF0ZURlZyA9IGdldFJvdGF0ZURlZygpOwoKICAgICAgLy8gZ2V0IGluZm8gbmVlZGVkIHRvIHB1dCB0aGUgdGV4dCBvbnRvIHRoZSBjYW52YXMKICAgICAgdmFyIGluZm8gPSBnZXRUZXh0SW5mbyh3b3JkLCB3ZWlnaHQsIHJvdGF0ZURlZyk7CgogICAgICAvLyBub3QgZ2V0dGluZyB0aGUgaW5mbyBtZWFucyB3ZSBzaG91bGRuJ3QgYmUgZHJhd2luZyB0aGlzIG9uZS4KICAgICAgaWYgKCFpbmZvKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICBpZiAoZXhjZWVkVGltZSgpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICAvLyBTa2lwIHRoZSBsb29wIGlmIHdlIGhhdmUgYWxyZWFkeSBrbm93IHRoZSBib3VuZGluZyBib3ggb2YKICAgICAgLy8gd29yZCBpcyBsYXJnZXIgdGhhbiB0aGUgY2FudmFzLgogICAgICB2YXIgYm91bmRzID0gaW5mby5ib3VuZHM7CiAgICAgIGlmICgoYm91bmRzWzFdIC0gYm91bmRzWzNdICsgMSkgPiBuZ3ggfHwKICAgICAgICAoYm91bmRzWzJdIC0gYm91bmRzWzBdICsgMSkgPiBuZ3kpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gdG8gcHV0IHRoZSB0ZXh0IGJ5CiAgICAgIC8vIHN0YXJ0IGxvb2tpbmcgZm9yIHRoZSBuZWFyZXN0IHBvaW50cwogICAgICB2YXIgciA9IG1heFJhZGl1cyArIDE7CgogICAgICB2YXIgdHJ5VG9QdXRXb3JkQXRQb2ludCA9IGZ1bmN0aW9uKGd4eSkgewogICAgICAgIHZhciBneCA9IE1hdGguZmxvb3IoZ3h5WzBdIC0gaW5mby5ndyAvIDIpOwogICAgICAgIHZhciBneSA9IE1hdGguZmxvb3IoZ3h5WzFdIC0gaW5mby5naCAvIDIpOwogICAgICAgIHZhciBndyA9IGluZm8uZ3c7CiAgICAgICAgdmFyIGdoID0gaW5mby5naDsKCiAgICAgICAgLy8gSWYgd2UgY2Fubm90IGZpdCB0aGUgdGV4dCBhdCB0aGlzIHBvc2l0aW9uLCByZXR1cm4gZmFsc2UKICAgICAgICAvLyBhbmQgZ28gdG8gdGhlIG5leHQgcG9zaXRpb24uCiAgICAgICAgaWYgKCFjYW5GaXRUZXh0KGd4LCBneSwgZ3csIGdoLCBpbmZvLm9jY3VwaWVkKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gQWN0dWFsbHkgcHV0IHRoZSB0ZXh0IG9uIHRoZSBjYW52YXMKICAgICAgICBkcmF3VGV4dChneCwgZ3ksIGluZm8sIHdvcmQsIHdlaWdodCwKICAgICAgICAgICAgICAgICAobWF4UmFkaXVzIC0gciksIGd4eVsyXSwgcm90YXRlRGVnLCBhdHRyaWJ1dGVzKTsKCiAgICAgICAgLy8gTWFyayB0aGUgc3BhY2VzIG9uIHRoZSBncmlkIGFzIGZpbGxlZAogICAgICAgIHVwZGF0ZUdyaWQoZ3gsIGd5LCBndywgZ2gsIGluZm8sIGl0ZW0pOwoKICAgICAgICAvLyBSZXR1cm4gdHJ1ZSBzbyBzb21lKCkgd2lsbCBzdG9wIGFuZCBhbHNvIHJldHVybiB0cnVlLgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9OwoKICAgICAgd2hpbGUgKHItLSkgewogICAgICAgIHZhciBwb2ludHMgPSBnZXRQb2ludHNBdFJhZGl1cyhtYXhSYWRpdXMgLSByKTsKCiAgICAgICAgaWYgKHNldHRpbmdzLnNodWZmbGUpIHsKICAgICAgICAgIHBvaW50cyA9IFtdLmNvbmNhdChwb2ludHMpOwogICAgICAgICAgc2h1ZmZsZUFycmF5KHBvaW50cyk7CiAgICAgICAgfQoKICAgICAgICAvLyBUcnkgdG8gZml0IHRoZSB3b3JkcyBieSBsb29raW5nIGF0IGVhY2ggcG9pbnQuCiAgICAgICAgLy8gYXJyYXkuc29tZSgpIHdpbGwgc3RvcCBhbmQgcmV0dXJuIHRydWUKICAgICAgICAvLyB3aGVuIHB1dFdvcmRBdFBvaW50KCkgcmV0dXJucyB0cnVlLgogICAgICAgIC8vIElmIGFsbCB0aGUgcG9pbnRzIHJldHVybnMgZmFsc2UsIGFycmF5LnNvbWUoKSByZXR1cm5zIGZhbHNlLgogICAgICAgIHZhciBkcmF3biA9IHBvaW50cy5zb21lKHRyeVRvUHV0V29yZEF0UG9pbnQpOwoKICAgICAgICBpZiAoZHJhd24pIHsKICAgICAgICAgIC8vIGxlYXZlIHB1dFdvcmQoKSBhbmQgcmV0dXJuIHRydWUKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyB3ZSB0cmllZCBhbGwgZGlzdGFuY2VzIGJ1dCB0ZXh0IHdvbid0IGZpdCwgcmV0dXJuIGZhbHNlCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH07CgogICAgLyogU2VuZCBET00gZXZlbnQgdG8gYWxsIGVsZW1lbnRzLiBXaWxsIHN0b3Agc2VuZGluZyBldmVudCBhbmQgcmV0dXJuCiAgICAgICBpZiB0aGUgcHJldmlvdXMgb25lIGlzIGNhbmNlbGVkIChmb3IgY2FuY2VsYWJsZSBldmVudHMpLiAqLwogICAgdmFyIHNlbmRFdmVudCA9IGZ1bmN0aW9uIHNlbmRFdmVudCh0eXBlLCBjYW5jZWxhYmxlLCBkZXRhaWwpIHsKICAgICAgaWYgKGNhbmNlbGFibGUpIHsKICAgICAgICByZXR1cm4gIWVsZW1lbnRzLnNvbWUoZnVuY3Rpb24oZWwpIHsKICAgICAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTsKICAgICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQodHlwZSwgdHJ1ZSwgY2FuY2VsYWJsZSwgZGV0YWlsIHx8IHt9KTsKICAgICAgICAgIHJldHVybiAhZWwuZGlzcGF0Y2hFdmVudChldnQpOwogICAgICAgIH0sIHRoaXMpOwogICAgICB9IGVsc2UgewogICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWwpIHsKICAgICAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTsKICAgICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQodHlwZSwgdHJ1ZSwgY2FuY2VsYWJsZSwgZGV0YWlsIHx8IHt9KTsKICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQoZXZ0KTsKICAgICAgICB9LCB0aGlzKTsKICAgICAgfQogICAgfTsKCiAgICAvKiBTdGFydCBkcmF3aW5nIG9uIGEgY2FudmFzICovCiAgICB2YXIgc3RhcnQgPSBmdW5jdGlvbiBzdGFydCgpIHsKICAgICAgLy8gRm9yIGRpbWVuc2lvbnMsIGNsZWFyQ2FudmFzIGV0Yy4sCiAgICAgIC8vIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgZmlyc3QgZWxlbWVudC4KICAgICAgdmFyIGNhbnZhcyA9IGVsZW1lbnRzWzBdOwoKICAgICAgaWYgKGNhbnZhcy5nZXRDb250ZXh0KSB7CiAgICAgICAgbmd4ID0gTWF0aC5mbG9vcihjYW52YXMud2lkdGggLyBnKTsKICAgICAgICBuZ3kgPSBNYXRoLmZsb29yKGNhbnZhcy5oZWlnaHQgLyBnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBuZ3ggPSBNYXRoLmZsb29yKHJlY3Qud2lkdGggLyBnKTsKICAgICAgICBuZ3kgPSBNYXRoLmZsb29yKHJlY3QuaGVpZ2h0IC8gZyk7CiAgICAgIH0KCiAgICAgIC8vIFNlbmRpbmcgYSB3b3JkY2xvdWRzdGFydCBldmVudCB3aGljaCBjYXVzZSB0aGUgcHJldmlvdXMgbG9vcCB0byBzdG9wLgogICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZSBldmVudCBpcyBjYW5jZWxlZC4KICAgICAgaWYgKCFzZW5kRXZlbnQoJ3dvcmRjbG91ZHN0YXJ0JywgdHJ1ZSkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIC8vIERldGVybWluZSB0aGUgY2VudGVyIG9mIHRoZSB3b3JkIGNsb3VkCiAgICAgIGNlbnRlciA9IChzZXR0aW5ncy5vcmlnaW4pID8KICAgICAgICBbc2V0dGluZ3Mub3JpZ2luWzBdL2csIHNldHRpbmdzLm9yaWdpblsxXS9nXSA6CiAgICAgICAgW25neCAvIDIsIG5neSAvIDJdOwoKICAgICAgLy8gTWF4aXVtIHJhZGl1cyB0byBsb29rIGZvciBzcGFjZQogICAgICBtYXhSYWRpdXMgPSBNYXRoLmZsb29yKE1hdGguc3FydChuZ3ggKiBuZ3ggKyBuZ3kgKiBuZ3kpKTsKCiAgICAgIC8qIENsZWFyIHRoZSBjYW52YXMgb25seSBpZiB0aGUgY2xlYXJDYW52YXMgaXMgc2V0LAogICAgICAgICBpZiBub3QsIHVwZGF0ZSB0aGUgZ3JpZCB0byB0aGUgY3VycmVudCBjYW52YXMgc3RhdGUgKi8KICAgICAgZ3JpZCA9IFtdOwoKICAgICAgdmFyIGd4LCBneSwgaTsKICAgICAgaWYgKCFjYW52YXMuZ2V0Q29udGV4dCB8fCBzZXR0aW5ncy5jbGVhckNhbnZhcykgewogICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWwpIHsKICAgICAgICAgIGlmIChlbC5nZXRDb250ZXh0KSB7CiAgICAgICAgICAgIHZhciBjdHggPSBlbC5nZXRDb250ZXh0KCcyZCcpOwogICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gc2V0dGluZ3MuYmFja2dyb3VuZENvbG9yOwogICAgICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIG5neCAqIChnICsgMSksIG5neSAqIChnICsgMSkpOwogICAgICAgICAgICBjdHguZmlsbFJlY3QoMCwgMCwgbmd4ICogKGcgKyAxKSwgbmd5ICogKGcgKyAxKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlbC50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICBlbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBzZXR0aW5ncy5iYWNrZ3JvdW5kQ29sb3I7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8qIGZpbGwgdGhlIGdyaWQgd2l0aCBlbXB0eSBzdGF0ZSAqLwogICAgICAgIGd4ID0gbmd4OwogICAgICAgIHdoaWxlIChneC0tKSB7CiAgICAgICAgICBncmlkW2d4XSA9IFtdOwogICAgICAgICAgZ3kgPSBuZ3k7CiAgICAgICAgICB3aGlsZSAoZ3ktLSkgewogICAgICAgICAgICBncmlkW2d4XVtneV0gPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvKiBEZXRlcm1pbmUgYmdQaXhlbCBieSBjcmVhdGluZwogICAgICAgICAgIGFub3RoZXIgY2FudmFzIGFuZCBmaWxsIHRoZSBzcGVjaWZpZWQgYmFja2dyb3VuZCBjb2xvci4gKi8KICAgICAgICB2YXIgYmN0eCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJzJkJyk7CgogICAgICAgIGJjdHguZmlsbFN0eWxlID0gc2V0dGluZ3MuYmFja2dyb3VuZENvbG9yOwogICAgICAgIGJjdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7CiAgICAgICAgdmFyIGJnUGl4ZWwgPSBiY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKS5kYXRhOwoKICAgICAgICAvKiBSZWFkIGJhY2sgdGhlIHBpeGVscyBvZiB0aGUgY2FudmFzIHdlIGdvdCB0byB0ZWxsIHdoaWNoIHBhcnQgb2YgdGhlCiAgICAgICAgICAgY2FudmFzIGlzIGVtcHR5LgogICAgICAgICAgIChubyBjbGVhckNhbnZhcyBvbmx5IHdvcmtzIHdpdGggYSBjYW52YXMsIG5vdCBkaXZzKSAqLwogICAgICAgIHZhciBpbWFnZURhdGEgPQogICAgICAgICAgY2FudmFzLmdldENvbnRleHQoJzJkJykuZ2V0SW1hZ2VEYXRhKDAsIDAsIG5neCAqIGcsIG5neSAqIGcpLmRhdGE7CgogICAgICAgIGd4ID0gbmd4OwogICAgICAgIHZhciB4LCB5OwogICAgICAgIHdoaWxlIChneC0tKSB7CiAgICAgICAgICBncmlkW2d4XSA9IFtdOwogICAgICAgICAgZ3kgPSBuZ3k7CiAgICAgICAgICB3aGlsZSAoZ3ktLSkgewogICAgICAgICAgICB5ID0gZzsKICAgICAgICAgICAgc2luZ2xlR3JpZExvb3A6IHdoaWxlICh5LS0pIHsKICAgICAgICAgICAgICB4ID0gZzsKICAgICAgICAgICAgICB3aGlsZSAoeC0tKSB7CiAgICAgICAgICAgICAgICBpID0gNDsKICAgICAgICAgICAgICAgIHdoaWxlIChpLS0pIHsKICAgICAgICAgICAgICAgICAgaWYgKGltYWdlRGF0YVsoKGd5ICogZyArIHkpICogbmd4ICogZyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChneCAqIGcgKyB4KSkgKiA0ICsgaV0gIT09IGJnUGl4ZWxbaV0pIHsKICAgICAgICAgICAgICAgICAgICBncmlkW2d4XVtneV0gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhayBzaW5nbGVHcmlkTG9vcDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZ3JpZFtneF1bZ3ldICE9PSBmYWxzZSkgewogICAgICAgICAgICAgIGdyaWRbZ3hdW2d5XSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGltYWdlRGF0YSA9IGJjdHggPSBiZ1BpeGVsID0gdW5kZWZpbmVkOwogICAgICB9CgogICAgICAvLyBmaWxsIHRoZSBpbmZvR3JpZCB3aXRoIGVtcHR5IHN0YXRlIGlmIHdlIG5lZWQgaXQKICAgICAgaWYgKHNldHRpbmdzLmhvdmVyIHx8IHNldHRpbmdzLmNsaWNrKSB7CgogICAgICAgIGludGVyYWN0aXZlID0gdHJ1ZTsKCiAgICAgICAgLyogZmlsbCB0aGUgZ3JpZCB3aXRoIGVtcHR5IHN0YXRlICovCiAgICAgICAgZ3ggPSBuZ3ggKyAxOwogICAgICAgIHdoaWxlIChneC0tKSB7CiAgICAgICAgICBpbmZvR3JpZFtneF0gPSBbXTsKICAgICAgICB9CgogICAgICAgIGlmIChzZXR0aW5ncy5ob3ZlcikgewogICAgICAgICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHdvcmRjbG91ZGhvdmVyKTsKICAgICAgICB9CgogICAgICAgIGlmIChzZXR0aW5ncy5jbGljaykgewogICAgICAgICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgd29yZGNsb3VkY2xpY2spOwogICAgICAgICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB3b3JkY2xvdWRjbGljayk7CiAgICAgICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIGNhbnZhcy5zdHlsZS53ZWJraXRUYXBIaWdobGlnaHRDb2xvciA9ICdyZ2JhKDAsIDAsIDAsIDApJzsKICAgICAgICB9CgogICAgICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3b3JkY2xvdWRzdGFydCcsIGZ1bmN0aW9uIHN0b3BJbnRlcmFjdGlvbigpIHsKICAgICAgICAgIGNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCd3b3JkY2xvdWRzdGFydCcsIHN0b3BJbnRlcmFjdGlvbik7CgogICAgICAgICAgY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHdvcmRjbG91ZGhvdmVyKTsKICAgICAgICAgIGNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHdvcmRjbG91ZGNsaWNrKTsKICAgICAgICAgIGhvdmVyZWQgPSB1bmRlZmluZWQ7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGkgPSAwOwogICAgICB2YXIgbG9vcGluZ0Z1bmN0aW9uLCBzdG9wcGluZ0Z1bmN0aW9uOwogICAgICBpZiAoc2V0dGluZ3Mud2FpdCAhPT0gMCkgewogICAgICAgIGxvb3BpbmdGdW5jdGlvbiA9IHdpbmRvdy5zZXRUaW1lb3V0OwogICAgICAgIHN0b3BwaW5nRnVuY3Rpb24gPSB3aW5kb3cuY2xlYXJUaW1lb3V0OwogICAgICB9IGVsc2UgewogICAgICAgIGxvb3BpbmdGdW5jdGlvbiA9IHdpbmRvdy5zZXRJbW1lZGlhdGU7CiAgICAgICAgc3RvcHBpbmdGdW5jdGlvbiA9IHdpbmRvdy5jbGVhckltbWVkaWF0ZTsKICAgICAgfQoKICAgICAgdmFyIGFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbCkgewogICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7CiAgICAgICAgfSwgdGhpcyk7CiAgICAgIH07CgogICAgICB2YXIgcmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTsKICAgICAgICB9LCB0aGlzKTsKICAgICAgfTsKCiAgICAgIHZhciBhbm90aGVyV29yZENsb3VkU3RhcnQgPSBmdW5jdGlvbiBhbm90aGVyV29yZENsb3VkU3RhcnQoKSB7CiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcignd29yZGNsb3Vkc3RhcnQnLCBhbm90aGVyV29yZENsb3VkU3RhcnQpOwogICAgICAgIHN0b3BwaW5nRnVuY3Rpb24odGltZXIpOwogICAgICB9OwoKICAgICAgYWRkRXZlbnRMaXN0ZW5lcignd29yZGNsb3Vkc3RhcnQnLCBhbm90aGVyV29yZENsb3VkU3RhcnQpOwoKICAgICAgdmFyIHRpbWVyID0gbG9vcGluZ0Z1bmN0aW9uKGZ1bmN0aW9uIGxvb3AoKSB7CiAgICAgICAgaWYgKGkgPj0gc2V0dGluZ3MubGlzdC5sZW5ndGgpIHsKICAgICAgICAgIHN0b3BwaW5nRnVuY3Rpb24odGltZXIpOwogICAgICAgICAgc2VuZEV2ZW50KCd3b3JkY2xvdWRzdG9wJywgZmFsc2UpOwogICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcignd29yZGNsb3Vkc3RhcnQnLCBhbm90aGVyV29yZENsb3VkU3RhcnQpOwoKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZXNjYXBlVGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CiAgICAgICAgdmFyIGRyYXduID0gcHV0V29yZChzZXR0aW5ncy5saXN0W2ldKTsKICAgICAgICB2YXIgY2FuY2VsZWQgPSAhc2VuZEV2ZW50KCd3b3JkY2xvdWRkcmF3bicsIHRydWUsIHsKICAgICAgICAgIGl0ZW06IHNldHRpbmdzLmxpc3RbaV0sIGRyYXduOiBkcmF3biB9KTsKICAgICAgICBpZiAoZXhjZWVkVGltZSgpIHx8IGNhbmNlbGVkKSB7CiAgICAgICAgICBzdG9wcGluZ0Z1bmN0aW9uKHRpbWVyKTsKICAgICAgICAgIHNldHRpbmdzLmFib3J0KCk7CiAgICAgICAgICBzZW5kRXZlbnQoJ3dvcmRjbG91ZGFib3J0JywgZmFsc2UpOwogICAgICAgICAgc2VuZEV2ZW50KCd3b3JkY2xvdWRzdG9wJywgZmFsc2UpOwogICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcignd29yZGNsb3Vkc3RhcnQnLCBhbm90aGVyV29yZENsb3VkU3RhcnQpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpKys7CiAgICAgICAgdGltZXIgPSBsb29waW5nRnVuY3Rpb24obG9vcCwgc2V0dGluZ3Mud2FpdCk7CiAgICAgIH0sIHNldHRpbmdzLndhaXQpOwogICAgfTsKCiAgICAvLyBBbGwgc2V0LCBzdGFydCB0aGUgZHJhd2luZwogICAgc3RhcnQoKTsKICB9OwoKICBXb3JkQ2xvdWQuaXNTdXBwb3J0ZWQgPSBpc1N1cHBvcnRlZDsKICBXb3JkQ2xvdWQubWluRm9udFNpemUgPSBtaW5Gb250U2l6ZTsKCiAgLy8gRXhwb3NlIHRoZSBsaWJyYXJ5IGFzIGFuIEFNRCBtb2R1bGUKICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICBkZWZpbmUoJ3dvcmRjbG91ZCcsIFtdLCBmdW5jdGlvbigpIHsgcmV0dXJuIFdvcmRDbG91ZDsgfSk7CiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgewogICAgbW9kdWxlLmV4cG9ydHMgPSBXb3JkQ2xvdWQ7CiAgfSBlbHNlIHsKICAgIGdsb2JhbC5Xb3JkQ2xvdWQgPSBXb3JkQ2xvdWQ7CiAgfQoKfSkodGhpcyk7IC8vanNoaW50IGlnbm9yZTpsaW5lCg=="></script>
<script src="data:application/javascript;base64,Ly8gY3JlYXRlIGVsZW1lbnQKZnVuY3Rpb24gbmV3bGFiZWwoZWwpewogIHZhciBuZXdEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICB2YXIgbmV3U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICB2YXIgaWQgPSBlbC5pZAogIG5ld0Rpdi5pZCA9IGlkICsgIndjTGFiZWwiOwogIG5ld0Rpdi5jbGFzc05hbWUgKz0gIndjTGFiZWwiOwogIG5ld1NwYW4uaWQgPSBpZCArICJ3Y1NwYW4iOwogIG5ld1NwYW4uY2xhc3NOYW1lICs9ICJ3Y1NwYW4iOwogIGVsLmFwcGVuZENoaWxkKG5ld0Rpdik7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQgKyAid2NMYWJlbCIpLmFwcGVuZENoaWxkKG5ld1NwYW4pOwp9CgovLyBob3ZlciBmdW5jdGlvbgpmdW5jdGlvbiBjdl9oYW5kbGVIb3ZlcihpdGVtLCBkaW1lbnNpb24sIGV2dCkgewogIHZhciBwYXRoID0gZXZ0LnBhdGggfHwgKGV2dC5jb21wb3NlZFBhdGggJiYgZXZ0LmNvbXBvc2VkUGF0aCgpKTsKICB2YXIgaWQgPSBwYXRoWzFdLmlkCiAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQgKyAid2NMYWJlbCIpOwogIHZhciB0YXJnZXQgPSBldnQudGFyZ2V0IHx8IGV2dC5zcmNFbGVtZW50OwogIGlmICghaXRlbSkgewogICAgZWwuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCB0cnVlKTsKCiAgICByZXR1cm47CiAgfQoKICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2hpZGRlbicpOwoKICBlbC5zdHlsZS5sZWZ0ID0gZGltZW5zaW9uLnggKyB0YXJnZXQub2Zmc2V0TGVmdCArICdweCc7CiAgZWwuc3R5bGUudG9wID0gZGltZW5zaW9uLnkgKyB0YXJnZXQub2Zmc2V0VG9wICsgJ3B4JzsKICBlbC5zdHlsZS53aWR0aCA9IGRpbWVuc2lvbi53ICsgJ3B4JzsKICBlbC5zdHlsZS5oZWlnaHQgPSBkaW1lbnNpb24uaCArICdweCc7CgogIHRoaXMuaG92ZXJEaW1lbnNpb24gPSBkaW1lbnNpb247CgogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkICsgIndjU3BhbiIpLnNldEF0dHJpYnV0ZSgKICAgICdkYXRhLWwxMG4tYXJncycsIEpTT04uc3RyaW5naWZ5KHsgd29yZDogaXRlbVswXSwgY291bnQ6IGl0ZW1bMV0gfSkpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkICsgIndjU3BhbiIpLmlubmVySFRNTCA9aXRlbVswXSsiOiIgKyBpdGVtWzFdOwoKfQoKLy9tYXNrIGZ1bmN0aW9uCmZ1bmN0aW9uIG1hc2tJbml0KGVsLHgpewogIHN0ciA9IHguZmlnQmFzZTY0OwogIHZhciBuZXdJbWcgPSBuZXcgSW1hZ2UoKTsKICBuZXdJbWcuc3JjID0gc3RyOwogIG5ld0ltZy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CiAgbmV3SW1nLnN0eWxlLmxlZnQgPSAwOwogIG5ld0ltZy53aWR0aCA9IGVsLmNsaWVudFdpZHRoOwogIG5ld0ltZy5oZWlnaHQgPSBlbC5jbGllbnRIZWlnaHQ7CiAgLy8gbWFza0NhbnZhcyA9IGluaXQoZWwsIHgsIG5ld0ltZyk7CiAgdnZhbHVlID0gMTI4CiAgdmFyIG1hc2tDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICBtYXNrQ2FudmFzLndpZHRoID0gbmV3SW1nLndpZHRoOwogIG1hc2tDYW52YXMuaGVpZ2h0ID0gbmV3SW1nLmhlaWdodDsKICB2YXIgY3R4ID0gbWFza0NhbnZhcy5nZXRDb250ZXh0KCcyZCcpOwogIGN0eC5kcmF3SW1hZ2UobmV3SW1nLCAwLCAwLCBuZXdJbWcud2lkdGgsIG5ld0ltZy5oZWlnaHQpOwogIHZhciBpbWFnZURhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIG1hc2tDYW52YXMud2lkdGgsIG1hc2tDYW52YXMuaGVpZ2h0KTsKICB2YXIgbmV3SW1hZ2VEYXRhID0gY3R4LmNyZWF0ZUltYWdlRGF0YShpbWFnZURhdGEpOwogIC8vIE0gPSAwCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbWFnZURhdGEuZGF0YS5sZW5ndGg7IGkgKz0gNCkgewogICAgdmFyIHRvbmUgPSBpbWFnZURhdGEuZGF0YVtpXSArCiAgICAgIGltYWdlRGF0YS5kYXRhW2kgKyAxXSArCiAgICAgIGltYWdlRGF0YS5kYXRhW2kgKyAyXTsKICAgIHZhciBhbHBoYSA9IGltYWdlRGF0YS5kYXRhW2kgKyAzXTsKCiAgICBpZiAoYWxwaGEgPCB2dmFsdWUgfHwgdG9uZSA+IHZ2YWx1ZSAqIDMpIHsKICAgICAgLy8gQXJlYSBub3QgdG8gZHJhdwogICAgICBuZXdJbWFnZURhdGEuZGF0YVtpXSA9CiAgICAgICAgbmV3SW1hZ2VEYXRhLmRhdGFbaSArIDFdID0KICAgICAgICBuZXdJbWFnZURhdGEuZGF0YVtpICsgMl0gPSAyNTU7CiAgICAgIG5ld0ltYWdlRGF0YS5kYXRhW2kgKyAzXSA9IDA7CiAgICB9IGVsc2UgewogICAgICAvLyBBcmVhIHRvIGRyYXcKICAgICAgbmV3SW1hZ2VEYXRhLmRhdGFbaV0gPQogICAgICAgIG5ld0ltYWdlRGF0YS5kYXRhW2kgKyAxXSA9CiAgICAgICAgbmV3SW1hZ2VEYXRhLmRhdGFbaSArIDJdID0gMDsKICAgICAgbmV3SW1hZ2VEYXRhLmRhdGFbaSArIDNdID0gMjU1OwogICAgfQoKICB9CgogIGN0eC5wdXRJbWFnZURhdGEobmV3SW1hZ2VEYXRhLCAwLCAwKTsKLy9tYXNrKGVsLCB4LCBtYXNrQ2FudmFzKTsKICB2YXIgYmN0eCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJzJkJyk7CiAgYmN0eC5maWxsU3R5bGUgPSB4LmJhY2tncm91bmRDb2xvciB8fCAnI2ZmZic7CiAgYmN0eC5maWxsUmVjdCgwLCAwLCAxLCAxKTsKICB2YXIgYmdQaXhlbCA9IGJjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpLmRhdGE7CiAgdmFyIG1hc2tDYW52YXNTY2FsZWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICBtYXNrQ2FudmFzU2NhbGVkLndpZHRoID0gZWwuY2xpZW50V2lkdGg7CiAgbWFza0NhbnZhc1NjYWxlZC5oZWlnaHQgPSBlbC5jbGllbnRIZWlnaHQ7CiAgY3R4ID0gbWFza0NhbnZhc1NjYWxlZC5nZXRDb250ZXh0KCcyZCcpOwogIGN0eC5kcmF3SW1hZ2UobWFza0NhbnZhcywKICAgIDAsIDAsIG1hc2tDYW52YXMud2lkdGgsIG1hc2tDYW52YXMuaGVpZ2h0KTsKCiAgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpOwoKICBuZXdJbWFnZURhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKGltYWdlRGF0YSk7CiAgZm9yICh2YXIgaiA9IDA7IGogPCBpbWFnZURhdGEuZGF0YS5sZW5ndGg7IGogKz0gNCkgewogICAgaWYgKGltYWdlRGF0YS5kYXRhW2ogKyAzXSA+IHZ2YWx1ZSkgewogICAgICBuZXdJbWFnZURhdGEuZGF0YVtqXSA9IGJnUGl4ZWxbMF07CiAgICAgIG5ld0ltYWdlRGF0YS5kYXRhW2ogKyAxXSA9IGJnUGl4ZWxbMV07CiAgICAgIG5ld0ltYWdlRGF0YS5kYXRhW2ogKyAyXSA9IGJnUGl4ZWxbMl07CiAgICAgIG5ld0ltYWdlRGF0YS5kYXRhW2ogKyAzXSA9IGJnUGl4ZWxbM107CiAgICB9IGVsc2UgewogICAgICAvLyBUaGlzIGNvbG9yIG11c3Qgbm90IGJlIHRoZSBzYW1lIHcvIHRoZSBiZ1BpeGVsLgogICAgICBuZXdJbWFnZURhdGEuZGF0YVtqXSA9IGJnUGl4ZWxbMF07CiAgICAgIG5ld0ltYWdlRGF0YS5kYXRhW2ogKyAxXSA9IGJnUGl4ZWxbMV07CiAgICAgIG5ld0ltYWdlRGF0YS5kYXRhW2ogKyAyXSA9IGJnUGl4ZWxbMl07CiAgICAgIG5ld0ltYWdlRGF0YS5kYXRhW2ogKyAzXSA9IGJnUGl4ZWxbM10gPyAoYmdQaXhlbFszXSAtIDEpIDogMDsKICAgIH0KICB9CgogIGN0eC5wdXRJbWFnZURhdGEobmV3SW1hZ2VEYXRhLCAwLCAwKTsKCiAgY3R4ID0gZWwuZmlyc3RDaGlsZC5nZXRDb250ZXh0KCcyZCcpOwogIGN0eC5kcmF3SW1hZ2UobWFza0NhbnZhc1NjYWxlZCwgMCwgMCk7CgogIG1hc2tDYW52YXNTY2FsZWQgPSBjdHggPSBpbWFnZURhdGEgPSBuZXdJbWFnZURhdGEgPSBiY3R4ID0gYmdQaXhlbCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgV29yZENsb3VkKGVsLmZpcnN0Q2hpbGQsIHsgbGlzdDogbGlzdERhdGEsCiAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IHguZm9udEZhbWlseSwKICAgICAgICAgICAgICAgICAgZm9udFdlaWdodDogeC5mb250V2VpZ2h0LAogICAgICAgICAgICAgICAgICBjb2xvcjogeC5jb2xvciwKICAgICAgICAgICAgICAgICAgbWluU2l6ZTogeC5taW5TaXplLAogICAgICAgICAgICAgICAgICB3ZWlnaHRGYWN0b3I6IHgud2VpZ2h0RmFjdG9yLAogICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHguYmFja2dyb3VuZENvbG9yLAogICAgICAgICAgICAgICAgICBncmlkU2l6ZTogeC5ncmlkU2l6ZSwKICAgICAgICAgICAgICAgICAgbWluUm90YXRpb246IHgubWluUm90YXRpb24sCiAgICAgICAgICAgICAgICAgIG1heFJvdGF0aW9uOiB4Lm1heFJvdGF0aW9uLAogICAgICAgICAgICAgICAgICBzaHVmZmxlOiB4LnNodWZmbGUsCiAgICAgICAgICAgICAgICAgIHNoYXBlOiB4LnNoYXBlLAogICAgICAgICAgICAgICAgICByb3RhdGVSYXRpbzogeC5yb3RhdGVSYXRpbywKICAgICAgICAgICAgICAgICAgZWxsaXB0aWNpdHk6IHguZWxsaXB0aWNpdHksCiAgICAgICAgICAgICAgICAgIGNsZWFyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgaG92ZXI6IHguaG92ZXIgfHwgY3ZfaGFuZGxlSG92ZXIsCiAgICAgICAgICAgICAgICAgIGFib3J0VGhyZXNob2xkOiAzMDAwCiAgICAgICAgICAgICAgICAgIH0pOwp9"></script>
<script src="data:application/javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsKCiAgbmFtZTogJ3dvcmRjbG91ZDInLAoKICB0eXBlOiAnb3V0cHV0JywKCiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgIHZhciBuZXdDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgIG5ld0NhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7CiAgICBuZXdDYW52YXMud2lkdGggPSB3aWR0aDsKICAgIG5ld0NhbnZhcy5pZCA9ICJjYW52YXMiOwoKICAgIGVsLmFwcGVuZENoaWxkKG5ld0NhbnZhcyk7CiAgICBuZXdsYWJlbChlbCk7CiAgICByZXR1cm4oZWwuZmlyc3RDaGlsZCk7CiAgfSwKICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oZWwsIHgsIGluc3RhbmNlKSB7CiAgLy8gcGFyc2UgZ2V4ZiBkYXRhCiAgICAgICAgbGlzdERhdGE9W107CiAgICAgICAgZm9yKHZhciBpPTA7IGk8eC53b3JkLmxlbmd0aDsgaSsrKXsKICAgICAgICAgIGxpc3REYXRhLnB1c2goW3gud29yZFtpXSwgeC5mcmVxW2ldXSk7CiAgICAgICAgfQogICAgIGlmKHguZmlnQmFzZTY0KXsKCiAgICAgICAgbWFza0luaXQoZWwseCk7CiAgICAgICAgY29uc29sZS5sb2coMykKCiAgICAgIH1lbHNlewogICAgICAgIFdvcmRDbG91ZChlbC5maXJzdENoaWxkLCB7IGxpc3Q6IGxpc3REYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBmb250RmFtaWx5OiB4LmZvbnRGYW1pbHksCiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IHguZm9udFdlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHguY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgIG1pblNpemU6IHgubWluU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0RmFjdG9yOiB4LndlaWdodEZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB4LmJhY2tncm91bmRDb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFNpemU6IHguZ3JpZFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgIG1pblJvdGF0aW9uOiB4Lm1pblJvdGF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICBtYXhSb3RhdGlvbjogeC5tYXhSb3RhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgc2h1ZmZsZTogeC5zaHVmZmxlLAogICAgICAgICAgICAgICAgICAgICAgICBzaGFwZTogeC5zaGFwZSwKICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlUmF0aW86IHgucm90YXRlUmF0aW8sCiAgICAgICAgICAgICAgICAgICAgICAgIGVsbGlwdGljaXR5OiB4LmVsbGlwdGljaXR5LAogICAgICAgICAgICAgICAgICAgICAgICBkcmF3TWFzazogeC5kcmF3TWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgbWFza0NvbG9yOiB4Lm1hc2tDb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgbWFza0dhcFdpZHRoOiB4Lm1hc2tHYXBXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXI6IHguaG92ZXIgfHwgY3ZfaGFuZGxlSG92ZXIKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgfQoKfSk7Cg=="></script>
</head>
<body>
<div id="htmlwidget_container">
<div id="htmlwidget-0a1fef0b4a70a499cc80" style="width:960px;height:500px;" class="wordcloud2 html-widget"></div>
</div>
<script type="application/json" data-for="htmlwidget-0a1fef0b4a70a499cc80">{"x":{"word":["nerve","left","right","branch","segment","posterior","anterior","trunk","lateral","area","spinal","artery","cervical","brodmann","thoracic","part","root","medial","layer","nucleus","dorsal","muscle","cord","gyrus","superior","ramus","inferior","lumbar","gray","surface","matter","tendon","component","third","first","cutaneous","internal","fourth","second","proper","column","body","ligament","fifth","vein","distal","zone","intercostal","set","proximal","external","lobe","middle","head","region","white","tract","ventral","sacral","sign","bone","median","sixth","wall","toe","meningeal","rootlet","communicating","temporal","joint","frontal","network","seventh","division","eighth","mater","ganglion","transverse","articular","node","lymph","dura","plexus","finger","neural","central","granular","pyramidal","subdivision","lymphatic","radial","digital","occipital","minor","tube","deep","epiphysis","peripheral","ulnar","interosseous"],"freq":[11318,9038,9032,6735,3694,3212,3096,2292,2242,2132,2105,2080,2069,1871,1861,1763,1762,1675,1528,1497,1453,1437,1367,1343,1330,1316,1242,1188,1151,1136,1126,1066,952,908,903,895,872,865,857,840,823,813,802,798,797,795,786,739,726,721,710,698,675,661,635,626,614,612,599,590,570,542,540,539,535,504,494,487,484,469,455,453,447,446,432,426,419,417,417,415,415,414,410,409,406,394,375,373,368,366,362,350,348,341,332,323,320,319,310,310],"fontFamily":"Segoe UI","fontWeight":"bold","color":["#92D741FF","#218F8DFF","#3F4788FF","#C9E020FF","#35B779FF","#51C56AFF","#61CA60FF","#481769FF","#481B6DFF","#20A486FF","#4CC26CFF","#1F9E89FF","#481467FF","#33638DFF","#1FA287FF","#67CC5CFF","#5BC863FF","#26818EFF","#78D152FF","#482878FF","#24AA83FF","#482173FF","#BBDE28FF","#34608DFF","#6DCD59FF","#2EB37CFF","#DDE318FF","#25858EFF","#470D60FF","#453882FF","#453581FF","#471063FF","#E4E419FF","#424186FF","#277E8EFF","#F1E51DFF","#32658EFF","#C2DF23FF","#404587FF","#26828EFF","#2BB07FFF","#472C7AFF","#41BE71FF","#3E4A89FF","#46327EFF","#238A8DFF","#1F998AFF","#24878EFF","#8CD646FF","#39558CFF","#481E70FF","#B4DE2CFF","#2E6D8EFF","#25AC82FF","#28AE80FF","#440154FF","#355E8DFF","#99D83DFF","#D7E219FF","#482576FF","#287C8EFF","#A0DA39FF","#1FA088FF","#ADDC30FF","#20938CFF","#FDE725FF","#3DBC74FF","#22A785FF","#7FD34EFF","#2D708EFF","#2C718EFF","#F7E620FF","#56C667FF","#450558FF","#A7DB35FF","#38598CFF","#47C06FFF","#433E85FF","#EBE51AFF","#375B8DFF","#31B67BFF","#228D8DFF","#2B748EFF","#73D056FF","#31688EFF","#3B528BFF","#2F6B8EFF","#39BA76FF","#1E9B8AFF","#85D54AFF","#3C508BFF","#472F7CFF","#3D4D8AFF","#20928CFF","#1F968BFF","#443B84FF","#D0E11CFF","#2A768EFF","#29798EFF","#46085CFF"],"minSize":0,"weightFactor":0.0159038699416858,"backgroundColor":"white","gridSize":0,"minRotation":0,"maxRotation":0,"shuffle":true,"rotateRatio":0.4,"shape":"circle","ellipticity":0.65,"figBase64":null,"hover":null},"evals":[],"jsHooks":[]}</script>
<script type="application/htmlwidget-sizing" data-for="htmlwidget-0a1fef0b4a70a499cc80">{"viewer":{"width":450,"height":350,"padding":0,"fill":true},"browser":{"width":960,"height":500,"padding":0,"fill":true}}</script>
</body>
</html>