Skip to content

Instantly share code, notes, and snippets.

@himloul
Created February 10, 2021 19:35
Show Gist options
  • Save himloul/cda090f3801d6671ac41ce8c44bbcbaf to your computer and use it in GitHub Desktop.
Save himloul/cda090f3801d6671ac41ce8c44bbcbaf to your computer and use it in GitHub Desktop.
Spatial map to visualize fleet location
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>leaflet</title>
<script src="data:application/javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gdHJ5RXZhbCh0YXNrKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8gQXR0ZW1wdCBldmFsKCkgYm90aCB3aXRoIGFuZCB3aXRob3V0IGVuY2xvc2luZyBpbiBwYXJlbnRoZXNlcy4KICAvLyBOb3RlIHRoYXQgZW5jbG9zaW5nIGNvZXJjZXMgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpbnRvCiAgLy8gYW4gZXhwcmVzc2lvbiB0aGF0IGV2YWwoKSBjYW4gcGFyc2UKICAvLyAob3RoZXJ3aXNlLCBhIFN5bnRheEVycm9yIGlzIHRocm93bikKICBmdW5jdGlvbiB0cnlFdmFsKGNvZGUpIHsKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgdHJ5IHsKICAgICAgcmVzdWx0ID0gZXZhbCgiKCIgKyBjb2RlICsgIikiKTsKICAgIH0gY2F0Y2goZXJyb3IpIHsKICAgICAgaWYgKCFlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICByZXN1bHQgPSBldmFsKGNvZGUpOwogICAgICB9IGNhdGNoKGUpIHsKICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7CiAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBmdW5jdGlvbiBpbml0U2l6aW5nKGVsKSB7CiAgICB2YXIgc2l6aW5nID0gc2l6aW5nUG9saWN5KGVsKTsKICAgIGlmICghc2l6aW5nKQogICAgICByZXR1cm47CgogICAgdmFyIGNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJodG1sd2lkZ2V0X2NvbnRhaW5lciIpOwogICAgaWYgKCFjZWwpCiAgICAgIHJldHVybjsKCiAgICBpZiAodHlwZW9mKHNpemluZy5wYWRkaW5nKSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW4gPSAiMCI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZyA9IHBhZGRpbmdUb0Nzcyh1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKSk7CiAgICB9CgogICAgaWYgKHNpemluZy5maWxsKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS53aWR0aCA9ICIxMDAlIjsKICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS53aWR0aCA9ICIxMDAlIjsKICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmhlaWdodCA9ICIxMDAlIjsKICAgICAgaWYgKGNlbCkgewogICAgICAgIGNlbC5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICAgICAgdmFyIHBhZCA9IHVucGFja1BhZGRpbmcoc2l6aW5nLnBhZGRpbmcpOwogICAgICAgIGNlbC5zdHlsZS50b3AgPSBwYWQudG9wICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUucmlnaHQgPSBwYWQucmlnaHQgKyAicHgiOwogICAgICAgIGNlbC5zdHlsZS5ib3R0b20gPSBwYWQuYm90dG9tICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUubGVmdCA9IHBhZC5sZWZ0ICsgInB4IjsKICAgICAgICBlbC5zdHlsZS53aWR0aCA9ICIxMDAlIjsKICAgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIH0KCiAgICAgIHJldHVybiB7CiAgICAgICAgZ2V0V2lkdGg6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBjZWwub2Zmc2V0SGVpZ2h0OyB9CiAgICAgIH07CgogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGUud2lkdGggPSBweChzaXppbmcud2lkdGgpOwogICAgICBlbC5zdHlsZS5oZWlnaHQgPSBweChzaXppbmcuaGVpZ2h0KTsKCiAgICAgIHJldHVybiB7CiAgICAgICAgZ2V0V2lkdGg6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZWwub2Zmc2V0V2lkdGg7IH0sCiAgICAgICAgZ2V0SGVpZ2h0OiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwogICAgfQogIH0KCiAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgZm9yIG1ldGhvZHMKICB2YXIgZGVmYXVsdHMgPSB7CiAgICBmaW5kOiBmdW5jdGlvbihzY29wZSkgewogICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbChzY29wZSwgIi4iICsgdGhpcy5uYW1lKTsKICAgIH0sCiAgICByZW5kZXJFcnJvcjogZnVuY3Rpb24oZWwsIGVycikgewogICAgICB2YXIgJGVsID0gJChlbCk7CgogICAgICB0aGlzLmNsZWFyRXJyb3IoZWwpOwoKICAgICAgLy8gQWRkIGFsbCB0aGVzZSBlcnJvciBjbGFzc2VzLCBhcyBTaGlueSBkb2VzCiAgICAgIHZhciBlcnJDbGFzcyA9ICJzaGlueS1vdXRwdXQtZXJyb3IiOwogICAgICBpZiAoZXJyLnR5cGUgIT09IG51bGwpIHsKICAgICAgICAvLyB1c2UgdGhlIGNsYXNzZXMgb2YgdGhlIGVycm9yIGNvbmRpdGlvbiBhcyBDU1MgY2xhc3MgbmFtZXMKICAgICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiAiICsgJC5tYXAoYXNBcnJheShlcnIudHlwZSksIGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgIHJldHVybiBlcnJDbGFzcyArICItIiArIHR5cGU7CiAgICAgICAgfSkuam9pbigiICIpOwogICAgICB9CiAgICAgIGVyckNsYXNzID0gZXJyQ2xhc3MgKyAiIGh0bWx3aWRnZXRzLWVycm9yIjsKCiAgICAgIC8vIElzIGVsIGlubGluZSBvciBibG9jaz8gSWYgaW5saW5lIG9yIGlubGluZS1ibG9jaywganVzdCBkaXNwbGF5Om5vbmUgaXQKICAgICAgLy8gYW5kIGFkZCBhbiBpbmxpbmUgZXJyb3IuCiAgICAgIHZhciBkaXNwbGF5ID0gJGVsLmNzcygiZGlzcGxheSIpOwogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBkaXNwbGF5KTsKCiAgICAgIGlmIChkaXNwbGF5ID09PSAiaW5saW5lIiB8fCBkaXNwbGF5ID09PSAiaW5saW5lLWJsb2NrIikgewogICAgICAgICRlbC5oaWRlKCk7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yU3BhbiA9ICQoIjxzcGFuPiIpLmFkZENsYXNzKGVyckNsYXNzKTsKICAgICAgICAgIGVycm9yU3Bhbi50ZXh0KGVyci5tZXNzYWdlKTsKICAgICAgICAgICRlbC5hZnRlcihlcnJvclNwYW4pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChkaXNwbGF5ID09PSAiYmxvY2siKSB7CiAgICAgICAgLy8gSWYgYmxvY2ssIGFkZCBhbiBlcnJvciBqdXN0IGFmdGVyIHRoZSBlbCwgc2V0IHZpc2liaWxpdHk6bm9uZSBvbiB0aGUKICAgICAgICAvLyBlbCwgYW5kIHBvc2l0aW9uIHRoZSBlcnJvciB0byBiZSBvbiB0b3Agb2YgdGhlIGVsLgogICAgICAgIC8vIE1hcmsgaXQgd2l0aCBhIHVuaXF1ZSBJRCBhbmQgQ1NTIGNsYXNzIHNvIHdlIGNhbiByZW1vdmUgaXQgbGF0ZXIuCiAgICAgICAgJGVsLmNzcygidmlzaWJpbGl0eSIsICJoaWRkZW4iKTsKICAgICAgICBpZiAoZXJyLm1lc3NhZ2UgIT09ICIiKSB7CiAgICAgICAgICB2YXIgZXJyb3JEaXYgPSAkKCI8ZGl2PiIpLmFkZENsYXNzKGVyckNsYXNzKS5jc3MoInBvc2l0aW9uIiwgImFic29sdXRlIikKICAgICAgICAgICAgLmNzcygidG9wIiwgZWwub2Zmc2V0VG9wKQogICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgLy8gc2V0dGluZyB3aWR0aCBjYW4gcHVzaCBvdXQgdGhlIHBhZ2Ugc2l6ZSwgZm9yY2luZyBvdGhlcndpc2UKICAgICAgICAgICAgLy8gdW5uZWNlc3Nhcnkgc2Nyb2xsYmFycyB0byBhcHBlYXIgYW5kIG1ha2luZyBpdCBpbXBvc3NpYmxlIGZvcgogICAgICAgICAgICAvLyB0aGUgZWxlbWVudCB0byBzaHJpbms7IHNvIHVzZSBtYXgtd2lkdGggaW5zdGVhZAogICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAuY3NzKCJoZWlnaHQiLCBlbC5vZmZzZXRIZWlnaHQpOwogICAgICAgICAgZXJyb3JEaXYudGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JEaXYpOwoKICAgICAgICAgIC8vIFJlYWxseSBkdW1iIHdheSB0byBrZWVwIHRoZSBzaXplL3Bvc2l0aW9uIG9mIHRoZSBlcnJvciBpbiBzeW5jIHdpdGgKICAgICAgICAgIC8vIHRoZSBwYXJlbnQgZWxlbWVudCBhcyB0aGUgd2luZG93IGlzIHJlc2l6ZWQgb3Igd2hhdGV2ZXIuCiAgICAgICAgICB2YXIgaW50SWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKCFlcnJvckRpdlswXS5wYXJlbnRFbGVtZW50KSB7CiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRJZCk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yRGl2CiAgICAgICAgICAgICAgLmNzcygidG9wIiwgZWwub2Zmc2V0VG9wKQogICAgICAgICAgICAgIC5jc3MoImxlZnQiLCBlbC5vZmZzZXRMZWZ0KQogICAgICAgICAgICAgIC5jc3MoIm1heFdpZHRoIiwgZWwub2Zmc2V0V2lkdGgpCiAgICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIH0sIDUwMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY2xlYXJFcnJvcjogZnVuY3Rpb24oZWwpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwogICAgICB2YXIgZGlzcGxheSA9ICRlbC5kYXRhKCJyZXN0b3JlLWRpc3BsYXktbW9kZSIpOwogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBudWxsKTsKCiAgICAgIGlmIChkaXNwbGF5ID09PSAiaW5saW5lIiB8fCBkaXNwbGF5ID09PSAiaW5saW5lLWJsb2NrIikgewogICAgICAgIGlmIChkaXNwbGF5KQogICAgICAgICAgJGVsLmNzcygiZGlzcGxheSIsIGRpc3BsYXkpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIil7CiAgICAgICAgJGVsLmNzcygidmlzaWJpbGl0eSIsICJpbmhlcml0Iik7CiAgICAgICAgJChlbC5uZXh0U2libGluZykuZmlsdGVyKCIuaHRtbHdpZGdldHMtZXJyb3IiKS5yZW1vdmUoKTsKICAgICAgfQogICAgfSwKICAgIHNpemluZzoge30KICB9OwoKICAvLyBDYWxsZWQgYnkgd2lkZ2V0IGJpbmRpbmdzIHRvIHJlZ2lzdGVyIGEgbmV3IHR5cGUgb2Ygd2lkZ2V0LiBUaGUgZGVmaW5pdGlvbgogIC8vIG9iamVjdCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CiAgLy8gLSBuYW1lIChyZXF1aXJlZCkgLSBBIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBiaW5kaW5nIG5hbWUsIHdoaWNoIHdpbGwgYmUKICAvLyAgIHVzZWQgYnkgZGVmYXVsdCBhcyB0aGUgQ1NTIGNsYXNzbmFtZSB0byBsb29rIGZvci4KICAvLyAtIGluaXRpYWxpemUgKG9wdGlvbmFsKSAtIEEgZnVuY3Rpb24oZWwpIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIHdpZGdldCBlbGVtZW50OyBpZiBhIHZhbHVlIGlzIHJldHVybmVkLCBpdCB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgdGhpcmQKICAvLyAgIHZhbHVlIHRvIHJlbmRlclZhbHVlLgogIC8vIC0gcmVuZGVyVmFsdWUgKHJlcXVpcmVkKSAtIEEgZnVuY3Rpb24oZWwsIGRhdGEsIGluaXRWYWx1ZSkgdGhhdCB3aWxsIGJlCiAgLy8gICBjYWxsZWQgd2l0aCBkYXRhLiBTdGF0aWMgY29udGV4dHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBvbmNlIHBlcgogIC8vICAgZWxlbWVudDsgU2hpbnkgYXBwcyB3aWxsIGNhdXNlIHRoaXMgdG8gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHBlcgogIC8vICAgZWxlbWVudCwgYXMgdGhlIGRhdGEgY2hhbmdlcy4KICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0ID0gZnVuY3Rpb24oZGVmaW5pdGlvbikgewogICAgaWYgKCFkZWZpbml0aW9uLm5hbWUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgbmFtZSIpOwogICAgfQogICAgaWYgKCFkZWZpbml0aW9uLnR5cGUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgdHlwZSIpOwogICAgfQogICAgLy8gQ3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydCBvdXRwdXQgd2lkZ2V0cwogICAgaWYgKGRlZmluaXRpb24udHlwZSAhPT0gIm91dHB1dCIpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbnJlY29nbml6ZWQgd2lkZ2V0IHR5cGUgJyIgKyBkZWZpbml0aW9uLnR5cGUgKyAiJyIpOwogICAgfQogICAgLy8gVE9ETzogVmVyaWZ5IHRoYXQgLm5hbWUgaXMgYSB2YWxpZCBDU1MgY2xhc3NuYW1lCgogICAgLy8gU3VwcG9ydCBuZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMuIE9sZC1zdHlsZSBjbGFzcy1ib3VuZAogICAgLy8gZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0ICJvYmplY3QiIHBlciB3aWRnZXQgcGVyIHR5cGUvY2xhc3Mgb2YKICAgIC8vIHdpZGdldDsgdGhlIHJlbmRlclZhbHVlIGFuZCByZXNpemUgbWV0aG9kcyBvbiBzdWNoIHdpZGdldCBvYmplY3RzCiAgICAvLyB0YWtlIGVsIGFuZCBpbnN0YW5jZSBhcmd1bWVudHMsIGJlY2F1c2UgdGhlIHdpZGdldCBvYmplY3QgY2FuJ3QKICAgIC8vIHN0b3JlIHRoZW0uIE5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucyBoYXZlIG9uZSB3aWRnZXQKICAgIC8vIG9iamVjdCBwZXIgd2lkZ2V0IGluc3RhbmNlOyB0aGUgZGVmaW5pdGlvbiB0aGF0J3MgcGFzc2VkIGluIGRvZXNuJ3QKICAgIC8vIHByb3ZpZGUgcmVuZGVyVmFsdWUgb3IgcmVzaXplIG1ldGhvZHMgYXQgYWxsLCBqdXN0IHRoZSBzaW5nbGUgbWV0aG9kCiAgICAvLyAgIGZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpCiAgICAvLyB3aGljaCByZXR1cm5zIGFuIG9iamVjdCB0aGF0IGhhcyByZW5kZXJWYWx1ZSh4KSBhbmQgcmVzaXplKHcsIGgpLgogICAgLy8gVGhpcyBlbmFibGVzIGEgZmFyIG1vcmUgbmF0dXJhbCBwcm9ncmFtbWluZyBzdHlsZSBmb3IgdGhlIHdpZGdldAogICAgLy8gYXV0aG9yLCB3aG8gY2FuIHN0b3JlIHBlci1pbnN0YW5jZSBzdGF0ZSB1c2luZyBlaXRoZXIgT08tc3R5bGUKICAgIC8vIGluc3RhbmNlIGZpZWxkcyBvciBmdW5jdGlvbmFsLXN0eWxlIGNsb3N1cmUgdmFyaWFibGVzIChJIGd1ZXNzIHRoaXMKICAgIC8vIGlzIGluIGNvbnRyYXN0IHRvIHdoYXQgY2FuIG9ubHkgYmUgY2FsbGVkIEMtc3R5bGUgcHNldWRvLU9PIHdoaWNoIGlzCiAgICAvLyB3aGF0IHdlIHJlcXVpcmVkIGJlZm9yZSkuCiAgICBpZiAoZGVmaW5pdGlvbi5mYWN0b3J5KSB7CiAgICAgIGRlZmluaXRpb24gPSBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZpbml0aW9uKTsKICAgIH0KCiAgICBpZiAoIWRlZmluaXRpb24ucmVuZGVyVmFsdWUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgcmVuZGVyVmFsdWUgZnVuY3Rpb24iKTsKICAgIH0KCiAgICAvLyBGb3Igc3RhdGljIHJlbmRlcmluZyAobm9uLVNoaW55KSwgdXNlIGEgc2ltcGxlIHdpZGdldCByZWdpc3RyYXRpb24KICAgIC8vIHNjaGVtZS4gV2UgYWxzbyB1c2UgdGhpcyBzY2hlbWUgZm9yIFNoaW55IGFwcHMvZG9jdW1lbnRzIHRoYXQgYWxzbwogICAgLy8gY29udGFpbiBzdGF0aWMgd2lkZ2V0cy4KICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107CiAgICAvLyBNZXJnZSBkZWZhdWx0cyBpbnRvIHRoZSBkZWZpbml0aW9uOyBkb24ndCBtdXRhdGUgdGhlIG9yaWdpbmFsIGRlZmluaXRpb24uCiAgICB2YXIgc3RhdGljQmluZGluZyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIGRlZmluaXRpb24pOwogICAgb3ZlcnJpZGVNZXRob2Qoc3RhdGljQmluZGluZywgImZpbmQiLCBmdW5jdGlvbihzdXBlcmZ1bmMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlKSB7CiAgICAgICAgdmFyIHJlc3VsdHMgPSBzdXBlcmZ1bmMoc2NvcGUpOwogICAgICAgIC8vIEZpbHRlciBvdXQgU2hpbnkgb3V0cHV0cywgd2Ugb25seSB3YW50IHRoZSBzdGF0aWMga2luZAogICAgICAgIHJldHVybiBmaWx0ZXJCeUNsYXNzKHJlc3VsdHMsICJodG1sLXdpZGdldC1vdXRwdXQiLCBmYWxzZSk7CiAgICAgIH07CiAgICB9KTsKICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzLnB1c2goc3RhdGljQmluZGluZyk7CgogICAgaWYgKHNoaW55TW9kZSkgewogICAgICAvLyBTaGlueSBpcyBydW5uaW5nLiBSZWdpc3RlciB0aGUgZGVmaW5pdGlvbiB3aXRoIGFuIG91dHB1dCBiaW5kaW5nLgogICAgICAvLyBUaGUgZGVmaW5pdGlvbiBpdHNlbGYgd2lsbCBub3QgYmUgdGhlIG91dHB1dCBiaW5kaW5nLCBpbnN0ZWFkCiAgICAgIC8vIHdlIHdpbGwgbWFrZSBhbiBvdXRwdXQgYmluZGluZyBvYmplY3QgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlCiAgICAgIC8vIGRlZmluaXRpb24uIFRoaXMgaXMgYmVjYXVzZSB3ZSBmb29saXNobHkgdXNlZCB0aGUgc2FtZSBtZXRob2QKICAgICAgLy8gbmFtZSAocmVuZGVyVmFsdWUpIGZvciBodG1sd2lkZ2V0cyBkZWZpbml0aW9uIGFuZCBTaGlueSBiaW5kaW5ncwogICAgICAvLyBidXQgdGhleSBhY3R1YWxseSBoYXZlIHF1aXRlIGRpZmZlcmVudCBzZW1hbnRpY3MgKHRoZSBTaGlueQogICAgICAvLyBiaW5kaW5ncyByZWNlaXZlIGRhdGEgdGhhdCBpbmNsdWRlcyBsb3RzIG9mIG1ldGFkYXRhIHRoYXQgaXQKICAgICAgLy8gc3RyaXBzIG9mZiBiZWZvcmUgY2FsbGluZyBodG1sd2lkZ2V0cyByZW5kZXJWYWx1ZSkuIFdlIGNhbid0CiAgICAgIC8vIGp1c3QgaWdub3JlIHRoZSBkaWZmZXJlbmNlIGJlY2F1c2UgaW4gc29tZSB3aWRnZXRzIGl0J3MgaGVscGZ1bAogICAgICAvLyB0byBjYWxsIHRoaXMucmVuZGVyVmFsdWUoKSBmcm9tIGluc2lkZSBvZiByZXNpemUoKSwgYW5kIGlmCiAgICAgIC8vIHdlJ3JlIG5vdCBkZWxlZ2F0aW5nLCB0aGVuIHRoYXQgY2FsbCB3aWxsIGdvIHRvIHRoZSBTaGlueQogICAgICAvLyB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIGh0bWx3aWRnZXRzIHZlcnNpb24uCgogICAgICAvLyBNZXJnZSBkZWZhdWx0cyB3aXRoIGRlZmluaXRpb24sIHdpdGhvdXQgbXV0YXRpbmcgZWl0aGVyLgogICAgICB2YXIgYmluZGluZ0RlZiA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIGRlZmluaXRpb24pOwoKICAgICAgLy8gVGhpcyBvYmplY3Qgd2lsbCBiZSBvdXIgYWN0dWFsIFNoaW55IGJpbmRpbmcuCiAgICAgIHZhciBzaGlueUJpbmRpbmcgPSBuZXcgU2hpbnkuT3V0cHV0QmluZGluZygpOwoKICAgICAgLy8gV2l0aCBhIGZldyBleGNlcHRpb25zLCB3ZSdsbCB3YW50IHRvIHNpbXBseSB1c2UgdGhlIGJpbmRpbmdEZWYncwogICAgICAvLyB2ZXJzaW9uIG9mIG1ldGhvZHMgaWYgdGhleSBhcmUgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvCiAgICAgIC8vIFNoaW55J3MgZGVmYXVsdHMuIE5PVEU6IElmIFNoaW55J3Mgb3V0cHV0IGJpbmRpbmdzIGdhaW4gYWRkaXRpb25hbAogICAgICAvLyBtZXRob2RzIGluIHRoZSBmdXR1cmUsIGFuZCB3ZSB3YW50IHRoZW0gdG8gYmUgb3ZlcnJpZGVhYmxlIGJ5CiAgICAgIC8vIEhUTUxXaWRnZXQgYmluZGluZyBkZWZpbml0aW9ucywgdGhlbiB3ZSdsbCBuZWVkIHRvIGFkZCB0aGVtIHRvIHRoaXMKICAgICAgLy8gbGlzdC4KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAiZ2V0SWQiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUNoYW5nZSIpOwogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJvblZhbHVlRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAicmVuZGVyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAiY2xlYXJFcnJvciIpOwogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJzaG93UHJvZ3Jlc3MiKTsKCiAgICAgIC8vIFRoZSBmaW5kLCByZW5kZXJWYWx1ZSwgYW5kIHJlc2l6ZSBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgYmVjYXVzZSB3ZQogICAgICAvLyB3YW50IHRvIGFjdHVhbGx5IGRlY29yYXRlIHRoZSBiZWhhdmlvciBvZiB0aGUgYmluZGluZ0RlZiBtZXRob2RzLgoKICAgICAgc2hpbnlCaW5kaW5nLmZpbmQgPSBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gYmluZGluZ0RlZi5maW5kKHNjb3BlKTsKCiAgICAgICAgLy8gT25seSByZXR1cm4gZWxlbWVudHMgdGhhdCBhcmUgU2hpbnkgb3V0cHV0cywgbm90IHN0YXRpYyBvbmVzCiAgICAgICAgdmFyIGR5bmFtaWNSZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIoIi5odG1sLXdpZGdldC1vdXRwdXQiKTsKCiAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdoYXRldmVyIGNhdXNlZCBTaGlueSB0byB0aGluayB0aGVyZSBtaWdodCBiZQogICAgICAgIC8vIG5ldyBkeW5hbWljIG91dHB1dHMsIGFsc28gY2F1c2VkIHRoZXJlIHRvIGJlIG5ldyBzdGF0aWMgb3V0cHV0cy4KICAgICAgICAvLyBTaW5jZSB0aGVyZSBtaWdodCBiZSBsb3RzIG9mIGRpZmZlcmVudCBodG1sd2lkZ2V0cyBiaW5kaW5ncywgd2UKICAgICAgICAvLyBzY2hlZHVsZSBleGVjdXRpb24gZm9yIGxhdGVyLS1ubyBuZWVkIHRvIHN0YXRpY1JlbmRlciBtdWx0aXBsZQogICAgICAgIC8vIHRpbWVzLgogICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCAhPT0gZHluYW1pY1Jlc3VsdHMubGVuZ3RoKQogICAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXIoKTsKCiAgICAgICAgcmV0dXJuIGR5bmFtaWNSZXN1bHRzOwogICAgICB9OwoKICAgICAgLy8gV3JhcCByZW5kZXJWYWx1ZSB0byBoYW5kbGUgaW5pdGlhbGl6YXRpb24sIHdoaWNoIHVuZm9ydHVuYXRlbHkgaXNuJ3QKICAgICAgLy8gc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IFNoaW55IGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZy4KCiAgICAgIHNoaW55QmluZGluZy5yZW5kZXJWYWx1ZSA9IGZ1bmN0aW9uKGVsLCBkYXRhKSB7CiAgICAgICAgU2hpbnkucmVuZGVyRGVwZW5kZW5jaWVzKGRhdGEuZGVwcyk7CiAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMKICAgICAgICBpZiAoIShkYXRhLmV2YWxzIGluc3RhbmNlb2YgQXJyYXkpKSBkYXRhLmV2YWxzID0gW2RhdGEuZXZhbHNdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBkYXRhLmV2YWxzICYmIGkgPCBkYXRhLmV2YWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2ldKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFiaW5kaW5nRGVmLnJlbmRlck9uTnVsbFZhbHVlKSB7CiAgICAgICAgICBpZiAoZGF0YS54ID09PSBudWxsKSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWwuc3R5bGUudmlzaWJpbGl0eSA9ICJpbmhlcml0IjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIikpIHsKICAgICAgICAgIGluaXRTaXppbmcoZWwpOwoKICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiLCB0cnVlKTsKICAgICAgICAgIGlmIChiaW5kaW5nRGVmLmluaXRpYWxpemUpIHsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGJpbmRpbmdEZWYuaW5pdGlhbGl6ZShlbCwgZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgICAgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgICBldmFsQW5kUnVuKGRhdGEuanNIb29rcy5yZW5kZXIsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSwgW2VsLCBkYXRhLnhdKTsKICAgICAgfTsKCiAgICAgIC8vIE9ubHkgb3ZlcnJpZGUgcmVzaXplIGlmIGJpbmRpbmdEZWYgaW1wbGVtZW50cyBpdAogICAgICBpZiAoYmluZGluZ0RlZi5yZXNpemUpIHsKICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICAgIC8vIFNoaW55IGNhbiBjYWxsIHJlc2l6ZSBiZWZvcmUgaW5pdGlhbGl6ZS9yZW5kZXJWYWx1ZSBoYXZlIGJlZW4KICAgICAgICAgIC8vIGNhbGxlZCwgd2hpY2ggZG9lc24ndCBtYWtlIHNlbnNlIGZvciB3aWRnZXRzLgogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgewogICAgICAgICAgICBiaW5kaW5nRGVmLnJlc2l6ZShlbCwgd2lkdGgsIGhlaWdodCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CgogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7CiAgICB9CiAgfTsKCiAgdmFyIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgZnVuY3Rpb24gc2NoZWR1bGVTdGF0aWNSZW5kZXIoKSB7CiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgewogICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9LCAxKTsKICAgIH0KICB9CgogIC8vIFJlbmRlciBzdGF0aWMgd2lkZ2V0cyBhZnRlciB0aGUgZG9jdW1lbnQgZmluaXNoZXMgbG9hZGluZwogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzCiAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGJpbmRpbmdzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107CiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7CiAgICAgIHZhciBtYXRjaGVzID0gYmluZGluZy5maW5kKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7CiAgICAgIGZvckVhY2gobWF0Y2hlcywgZnVuY3Rpb24oZWwpIHsKICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOwoKICAgICAgICBpZiAoaGFzQ2xhc3MoZWwsICJodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiKSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBlbC5jbGFzc05hbWUgPSBlbC5jbGFzc05hbWUgKyAiIGh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCI7CgogICAgICAgIHZhciBpbml0UmVzdWx0OwogICAgICAgIGlmIChiaW5kaW5nLmluaXRpYWxpemUpIHsKICAgICAgICAgIGluaXRSZXN1bHQgPSBiaW5kaW5nLmluaXRpYWxpemUoZWwsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICk7CiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsKICAgICAgICAgIHZhciBsYXN0U2l6ZSA9IHsKICAgICAgICAgICAgdzogc2l6ZU9iaiA/IHNpemVPYmouZ2V0V2lkdGgoKSA6IGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICBoOiBzaXplT2JqID8gc2l6ZU9iai5nZXRIZWlnaHQoKSA6IGVsLm9mZnNldEhlaWdodAogICAgICAgICAgfTsKICAgICAgICAgIHZhciByZXNpemVIYW5kbGVyID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgc2l6ZSA9IHsKICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgaDogc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSBsYXN0U2l6ZS53ICYmIHNpemUuaCA9PT0gbGFzdFNpemUuaCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGxhc3RTaXplID0gc2l6ZTsKICAgICAgICAgICAgYmluZGluZy5yZXNpemUoZWwsIHNpemUudywgc2l6ZS5oLCBpbml0UmVzdWx0KTsKICAgICAgICAgIH07CgogICAgICAgICAgb24od2luZG93LCAicmVzaXplIiwgcmVzaXplSGFuZGxlcik7CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIGNhc2VzIHdoZXJlIHdlJ3JlIHJ1bm5pbmcgaW4gYSBTaGlueQogICAgICAgICAgLy8gYXBwLCBidXQgdGhlIHdpZGdldCBpdHNlbGYgaXMgbm90IGEgU2hpbnkgb3V0cHV0LCBidXQKICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzCiAgICAgICAgICAvLyBhbiBybWFya2Rvd24gZG9jdW1lbnQgdGhhdCBoYXMgcnVudGltZTpzaGlueSBhbmQgd2lkZ2V0CiAgICAgICAgICAvLyB0aGF0IGlzbid0IGluIGEgcmVuZGVyIGZ1bmN0aW9uLiBTaGlueSBvbmx5IGtub3dzIHRvCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMKICAgICAgICAgIC8vIHdpZGdldHMsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KICAgICAgICAgIGlmICh3aW5kb3cualF1ZXJ5KSB7CiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKAogICAgICAgICAgICAgICJzaG93bi5odG1sd2lkZ2V0cyBzaG93bi5icy50YWIuaHRtbHdpZGdldHMgc2hvd24uYnMuY29sbGFwc2UuaHRtbHdpZGdldHMiLAogICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgImhpZGRlbi5odG1sd2lkZ2V0cyBoaWRkZW4uYnMudGFiLmh0bWx3aWRnZXRzIGhpZGRlbi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgc3BlY2lmaWMgY2FzZSBvZiBpb3NsaWRlcywgd2hpY2gKICAgICAgICAgIC8vIGZsaXBzIHNsaWRlcyBiZXR3ZWVuIGRpc3BsYXk6bm9uZSBhbmQgZGlzcGxheTpibG9jay4KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUKICAgICAgICAgIC8vIGhlcmUsIGJ1dCByYXRoZXIgaGF2ZSBpb3NsaWRlcyByYWlzZSBhIGdlbmVyaWMgZXZlbnQsCiAgICAgICAgICAvLyBidXQgdGhlIHJtYXJrZG93biBwYWNrYWdlIGp1c3Qgd2VudCB0byBDUkFOIHNvIHRoZQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4KICAgICAgICAgIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGxpbWl0IHRoaXMgdG8gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIKICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cwogICAgICAgICAgICAvLyBzdWNoIGJyb3dzZXJzLgogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlZW50ZXIiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgc2NyaXB0RGF0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2pzb24nXSIpOwogICAgICAgIGlmIChzY3JpcHREYXRhKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOwogICAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMKICAgICAgICAgIGlmICghKGRhdGEuZXZhbHMgaW5zdGFuY2VvZiBBcnJheSkpIGRhdGEuZXZhbHMgPSBbZGF0YS5ldmFsc107CiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2tdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7CiAgICAgICAgICBldmFsQW5kUnVuKGRhdGEuanNIb29rcy5yZW5kZXIsIGluaXRSZXN1bHQsIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwoKICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOwogIH0KCgogIGZ1bmN0aW9uIGhhc19qUXVlcnkzKCkgewogICAgaWYgKCF3aW5kb3cualF1ZXJ5KSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHZhciAkdmVyc2lvbiA9IHdpbmRvdy5qUXVlcnkuZm4uanF1ZXJ5OwogICAgdmFyICRtYWpvcl92ZXJzaW9uID0gcGFyc2VJbnQoJHZlcnNpb24uc3BsaXQoIi4iKVswXSk7CiAgICByZXR1cm4gJG1ham9yX3ZlcnNpb24gPj0gMzsKICB9CgogIC8qCiAgLyBTaGlueSAxLjQgYnVtcGVkIGpRdWVyeSBmcm9tIDEueCB0byAzLnggd2hpY2ggbWVhbnMgalF1ZXJ5J3MKICAvIG9uLXJlYWR5IGhhbmRsZXIgKGkuZS4sICQoZm4pKSBpcyBub3cgYXN5bmNyb25vdXMgKGkuZS4sIGl0IG5vdwogIC8gcmVhbGx5IG1lYW5zICQoc2V0VGltZW91dChmbikpLgogIC8gaHR0cHM6Ly9qcXVlcnkuY29tL3VwZ3JhZGUtZ3VpZGUvMy4wLyNicmVha2luZy1jaGFuZ2UtZG9jdW1lbnQtcmVhZHktaGFuZGxlcnMtYXJlLW5vdy1hc3luY2hyb25vdXMKICAvCiAgLyBTaW5jZSBTaGlueSB1c2VzICQoKSB0byBzY2hlZHVsZSBpbml0U2hpbnksIHNoaW55Pj0xLjQgY2FsbHMgaW5pdFNoaW55CiAgLyBvbmUgdGljayBsYXRlciB0aGFuIGl0IGRpZCBiZWZvcmUsIHdoaWNoIG1lYW5zIHN0YXRpY1JlbmRlcigpIGlzCiAgLyBjYWxsZWQgcmVuZGVyVmFsdWUoKSBlYXJsaWVyIHRoYW4gKGFkdmFuY2VkKSB3aWRnZXQgYXV0aG9ycyBtaWdodCBiZSBleHBlY3RpbmcuCiAgLyBodHRwczovL2dpdGh1Yi5jb20vcnN0dWRpby9zaGlueS9pc3N1ZXMvMjYzMAogIC8KICAvIEZvciBhIGNvbmNyZXRlIGV4YW1wbGUsIGxlYWZsZXQgaGFzIHNvbWUgbWV0aG9kcyAoZS5nLiwgdXBkYXRlQm91bmRzKQogIC8gd2hpY2ggcmVmZXJlbmNlIFNoaW55IG1ldGhvZHMgcmVnaXN0ZXJlZCBpbiBpbml0U2hpbnkgKGUuZy4sIHNldElucHV0VmFsdWUpLgogIC8gU2luY2UgbGVhZmxldCBpcyBwcml2eSB0byB0aGlzIGxpZmUtY3ljbGUsIGl0IGtub3dzIHRvIHVzZSBzZXRUaW1lb3V0KCkgdG8KICAvIGRlbGF5IGV4ZWN1dGlvbiBvZiB0aG9zZSBtZXRob2RzICh1bnRpbCBTaGlueSBtZXRob2RzIGFyZSByZWFkeSkKICAvIGh0dHBzOi8vZ2l0aHViLmNvbS9yc3R1ZGlvL2xlYWZsZXQvYmxvYi8xOGVjOTgxL2phdmFzY3JpcHQvc3JjL2luZGV4LmpzI0wyNjYtTDI2OAogIC8KICAvIElkZWFsbHkgd2lkZ2V0IGF1dGhvcnMgd291bGRuJ3QgbmVlZCB0byB1c2UgdGhpcyBzZXRUaW1lb3V0KCkgaGFjayB0aGF0CiAgLyBsZWFmbGV0IHVzZXMgdG8gY2FsbCBTaGlueSBtZXRob2RzIG9uIGEgc3RhdGljUmVuZGVyKCkuIEluIHRoZSBsb25nIHJ1biwKICAvIHRoZSBsb2dpYyBpbml0U2hpbnkgc2hvdWxkIGJlIGJyb2tlbiB1cCBzbyB0aGF0IG1ldGhvZCByZWdpc3RyYXRpb24gaGFwcGVucwogIC8gcmlnaHQgYXdheSwgYnV0IGJpbmRpbmcgaGFwcGVucyBsYXRlci4KICAqLwogIGZ1bmN0aW9uIG1heWJlU3RhdGljUmVuZGVyTGF0ZXIoKSB7CiAgICBpZiAoc2hpbnlNb2RlICYmIGhhc19qUXVlcnkzKCkpIHsKICAgICAgd2luZG93LmpRdWVyeSh3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKTsKICAgIH0gZWxzZSB7CiAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgIH0KICB9CgogIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBhcmd1bWVudHMuY2FsbGVlLCBmYWxzZSk7CiAgICAgIG1heWJlU3RhdGljUmVuZGVyTGF0ZXIoKTsKICAgIH0sIGZhbHNlKTsKICB9IGVsc2UgaWYgKGRvY3VtZW50LmF0dGFjaEV2ZW50KSB7CiAgICBkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKSB7CiAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiKSB7CiAgICAgICAgZG9jdW1lbnQuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGFyZ3VtZW50cy5jYWxsZWUpOwogICAgICAgIG1heWJlU3RhdGljUmVuZGVyTGF0ZXIoKTsKICAgICAgfQogICAgfSk7CiAgfQoKCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEF0dGFjaG1lbnRVcmwgPSBmdW5jdGlvbihkZXBuYW1lLCBrZXkpIHsKICAgIC8vIElmIG5vIGtleSwgZGVmYXVsdCB0byB0aGUgZmlyc3QgaXRlbQogICAgaWYgKHR5cGVvZihrZXkpID09PSAidW5kZWZpbmVkIikKICAgICAga2V5ID0gMTsKCiAgICB2YXIgbGluayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRlcG5hbWUgKyAiLSIgKyBrZXkgKyAiLWF0dGFjaG1lbnQiKTsKICAgIGlmICghbGluaykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkF0dGFjaG1lbnQgIiArIGRlcG5hbWUgKyAiLyIgKyBrZXkgKyAiIG5vdCBmb3VuZCBpbiBkb2N1bWVudCIpOwogICAgfQogICAgcmV0dXJuIGxpbmsuZ2V0QXR0cmlidXRlKCJocmVmIik7CiAgfTsKCiAgd2luZG93LkhUTUxXaWRnZXRzLmRhdGFmcmFtZVRvRDMgPSBmdW5jdGlvbihkZikgewogICAgdmFyIG5hbWVzID0gW107CiAgICB2YXIgbGVuZ3RoOwogICAgZm9yICh2YXIgbmFtZSBpbiBkZikgewogICAgICAgIGlmIChkZi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkKICAgICAgICAgICAgbmFtZXMucHVzaChuYW1lKTsKICAgICAgICBpZiAodHlwZW9mKGRmW25hbWVdKSAhPT0gIm9iamVjdCIgfHwgdHlwZW9mKGRmW25hbWVdLmxlbmd0aCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyIpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mKGxlbmd0aCkgIT09ICJ1bmRlZmluZWQiICYmIGxlbmd0aCAhPT0gZGZbbmFtZV0ubGVuZ3RoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGgiKTsKICAgICAgICB9CiAgICAgICAgbGVuZ3RoID0gZGZbbmFtZV0ubGVuZ3RoOwogICAgfQogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHZhciBpdGVtOwogICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbGVuZ3RoOyByb3crKykgewogICAgICAgIGl0ZW0gPSB7fTsKICAgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCBuYW1lcy5sZW5ndGg7IGNvbCsrKSB7CiAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXV0gPSBkZltuYW1lc1tjb2xdXVtyb3ddOwogICAgICAgIH0KICAgICAgICByZXN1bHRzLnB1c2goaXRlbSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMudHJhbnNwb3NlQXJyYXkyRCA9IGZ1bmN0aW9uKGFycmF5KSB7CiAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHJldHVybiBhcnJheTsKICAgICAgdmFyIG5ld0FycmF5ID0gYXJyYXlbMF0ubWFwKGZ1bmN0aW9uKGNvbCwgaSkgewogICAgICAgICAgcmV0dXJuIGFycmF5Lm1hcChmdW5jdGlvbihyb3cpIHsKICAgICAgICAgICAgICByZXR1cm4gcm93W2ldCiAgICAgICAgICB9KQogICAgICB9KTsKICAgICAgcmV0dXJuIG5ld0FycmF5OwogIH07CiAgLy8gU3BsaXQgdmFsdWUgYXQgc3BsaXRDaGFyLCBidXQgYWxsb3cgc3BsaXRDaGFyIHRvIGJlIGVzY2FwZWQKICAvLyB1c2luZyBlc2NhcGVDaGFyLiBBbnkgb3RoZXIgY2hhcmFjdGVycyBlc2NhcGVkIGJ5IGVzY2FwZUNoYXIKICAvLyB3aWxsIGJlIGluY2x1ZGVkIGFzIHVzdWFsIChpbmNsdWRpbmcgZXNjYXBlQ2hhciBpdHNlbGYpLgogIGZ1bmN0aW9uIHNwbGl0V2l0aEVzY2FwZSh2YWx1ZSwgc3BsaXRDaGFyLCBlc2NhcGVDaGFyKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgIHZhciBjdXJyZW50UmVzdWx0ID0gIiI7CiAgICBmb3IgKHZhciBwb3MgPSAwOyBwb3MgPCB2YWx1ZS5sZW5ndGg7IHBvcysrKSB7CiAgICAgIGlmICghZXNjYXBlTW9kZSkgewogICAgICAgIGlmICh2YWx1ZVtwb3NdID09PSBzcGxpdENoYXIpIHsKICAgICAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlW3Bvc10gPT09IGVzY2FwZUNoYXIpIHsKICAgICAgICAgIGVzY2FwZU1vZGUgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICBlc2NhcGVNb2RlID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChjdXJyZW50UmVzdWx0ICE9PSAiIikgewogICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9CiAgLy8gRnVuY3Rpb24gYXV0aG9yZWQgYnkgWWlodWkvSkogQWxsYWlyZQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5ldmFsdWF0ZVN0cmluZ01lbWJlciA9IGZ1bmN0aW9uKG8sIG1lbWJlcikgewogICAgdmFyIHBhcnRzID0gc3BsaXRXaXRoRXNjYXBlKG1lbWJlciwgJy4nLCAnXFwnKTsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBwYXJ0ID0gcGFydHNbaV07CiAgICAgIC8vIHBhcnQgbWF5IGJlIGEgY2hhcmFjdGVyIG9yICdudW1lcmljJyBtZW1iZXIgbmFtZQogICAgICBpZiAobyAhPT0gbnVsbCAmJiB0eXBlb2YgbyA9PT0gIm9iamVjdCIgJiYgcGFydCBpbiBvKSB7CiAgICAgICAgaWYgKGkgPT0gKGwgLSAxKSkgeyAvLyBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSB0aGVuIGV2YWx1bGF0ZQogICAgICAgICAgaWYgKHR5cGVvZiBvW3BhcnRdID09PSAic3RyaW5nIikKICAgICAgICAgICAgb1twYXJ0XSA9IHRyeUV2YWwob1twYXJ0XSk7CiAgICAgICAgfSBlbHNlIHsgLy8gb3RoZXJ3aXNlIGNvbnRpbnVlIHRvIG5leHQgZW1iZWRkZWQgb2JqZWN0CiAgICAgICAgICBvID0gb1twYXJ0XTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9OwoKICAvLyBSZXRyaWV2ZSB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuCiAgLy8gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCwgb3IgbnVsbCBpZiBub25lLgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKGVsKSB7CiAgICByZXR1cm4gZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpOwogIH07CgogIC8vIEZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzY29wZSB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLAogIC8vIGFuZCByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YKICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGVsZW1lbnQsIGlmIGFueS4gSWYgbm8gZWxlbWVudCBtYXRjaGVzIHRoZQogIC8vIHNlbGVjdG9yLCBvciB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCBoYXMgbm8gSFRNTFdpZGdldAogIC8vIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBpdCwgdGhlbiBudWxsIGlzIHJldHVybmVkLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIGVsID0gc2NvcGUucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICBpZiAoZWwgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKGVsKTsKICAgIH0KICB9OwoKICAvLyBGaW5kcyBhbGwgZWxlbWVudHMgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yLCBhbmQKICAvLyByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlcyAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlcyBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50cywgaW4gYW4gYXJyYXkuIElmIGVsZW1lbnRzIHRoYXQKICAvLyBtYXRjaCB0aGUgc2VsZWN0b3IgZG9uJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIEhUTUxXaWRnZXQKICAvLyBpbnN0YW5jZSwgdGhlIHJldHVybmVkIGFycmF5IHdpbGwgY29udGFpbiBudWxscy4KICAvLwogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4KICB3aW5kb3cuSFRNTFdpZGdldHMuZmluZEFsbCA9IGZ1bmN0aW9uKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICBzZWxlY3RvciA9IHNjb3BlOwogICAgICBzY29wZSA9IGRvY3VtZW50OwogICAgfQoKICAgIHZhciBub2RlcyA9IHNjb3BlLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOwogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0cy5wdXNoKHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShub2Rlc1tpXSkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgdmFyIHBvc3RSZW5kZXJIYW5kbGVycyA9IFtdOwogIGZ1bmN0aW9uIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpIHsKICAgIHdoaWxlIChwb3N0UmVuZGVySGFuZGxlcnMubGVuZ3RoKSB7CiAgICAgIHZhciBoYW5kbGVyID0gcG9zdFJlbmRlckhhbmRsZXJzLnNoaWZ0KCk7CiAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgaGFuZGxlcigpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZWdpc3RlciB0aGUgZ2l2ZW4gY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCBhZnRlciB0aGUKICAvLyBuZXh0IHRpbWUgc3RhdGljIHdpZGdldHMgYXJlIHJlbmRlcmVkLgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5hZGRQb3N0UmVuZGVySGFuZGxlciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICBwb3N0UmVuZGVySGFuZGxlcnMucHVzaChjYWxsYmFjayk7CiAgfTsKCiAgLy8gVGFrZXMgYSBuZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbiwgYW5kIHJldHVybnMgYW4KICAvLyBvbGQtc3R5bGUgY2xhc3MtYm91bmQgZGVmaW5pdGlvbi4gVGhpcyBzYXZlcyB1cyBmcm9tIGhhdmluZwogIC8vIHRvIHJld3JpdGUgYWxsIHRoZSBsb2dpYyBpbiB0aGlzIGZpbGUgdG8gYWNjb21vZGF0ZSBib3RoCiAgLy8gdHlwZXMgb2YgZGVmaW5pdGlvbnMuCiAgZnVuY3Rpb24gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmbikgewogICAgdmFyIHJlc3VsdCA9IHsKICAgICAgbmFtZTogZGVmbi5uYW1lLAogICAgICB0eXBlOiBkZWZuLnR5cGUsCiAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgcmV0dXJuIGRlZm4uZmFjdG9yeShlbCwgd2lkdGgsIGhlaWdodCk7CiAgICAgIH0sCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVuZGVyVmFsdWUoeCk7CiAgICAgIH0sCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGluc3RhbmNlKSB7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgfQogICAgfTsKCiAgICBpZiAoZGVmbi5maW5kKQogICAgICByZXN1bHQuZmluZCA9IGRlZm4uZmluZDsKICAgIGlmIChkZWZuLnJlbmRlckVycm9yKQogICAgICByZXN1bHQucmVuZGVyRXJyb3IgPSBkZWZuLnJlbmRlckVycm9yOwogICAgaWYgKGRlZm4uY2xlYXJFcnJvcikKICAgICAgcmVzdWx0LmNsZWFyRXJyb3IgPSBkZWZuLmNsZWFyRXJyb3I7CgogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0pKCk7Cgo="></script>
<script src="data:application/javascript;base64,LyohIGpRdWVyeSB2MS4xMi40IHwgKGMpIGpRdWVyeSBGb3VuZGF0aW9uIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWEuZG9jdW1lbnQ/YihhLCEwKTpmdW5jdGlvbihhKXtpZighYS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gYihhKX06YihhKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkPWEuZG9jdW1lbnQsZT1jLnNsaWNlLGY9Yy5jb25jYXQsZz1jLnB1c2gsaD1jLmluZGV4T2YsaT17fSxqPWkudG9TdHJpbmcsaz1pLmhhc093blByb3BlcnR5LGw9e30sbT0iMS4xMi40IixuPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBuLmZuLmluaXQoYSxiKX0sbz0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2cscD0vXi1tcy0vLHE9Ly0oW1xkYS16XSkvZ2kscj1mdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O24uZm49bi5wcm90b3R5cGU9e2pxdWVyeTptLGNvbnN0cnVjdG9yOm4sc2VsZWN0b3I6IiIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT8wPmE/dGhpc1thK3RoaXMubGVuZ3RoXTp0aGlzW2FdOmUuY2FsbCh0aGlzKX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBiPW4ubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBiLnByZXZPYmplY3Q9dGhpcyxiLmNvbnRleHQ9dGhpcy5jb250ZXh0LGJ9LGVhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZWFjaCh0aGlzLGEpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4ubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmxlbmd0aCxjPSthKygwPmE/YjowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYz49MCYmYj5jP1t0aGlzW2NdXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpnLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbi5leHRlbmQ9bi5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG4uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oZT1hcmd1bWVudHNbaF0pKWZvcihkIGluIGUpYT1nW2RdLGM9ZVtkXSxnIT09YyYmKGomJmMmJihuLmlzUGxhaW5PYmplY3QoYyl8fChiPW4uaXNBcnJheShjKSkpPyhiPyhiPSExLGY9YSYmbi5pc0FycmF5KGEpP2E6W10pOmY9YSYmbi5pc1BsYWluT2JqZWN0KGEpP2E6e30sZ1tkXT1uLmV4dGVuZChqLGYsYykpOnZvaWQgMCE9PWMmJihnW2RdPWMpKTtyZXR1cm4gZ30sbi5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKG0rTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW4udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09bi50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXt2YXIgYj1hJiZhLnRvU3RyaW5nKCk7cmV0dXJuIW4uaXNBcnJheShhKSYmYi1wYXJzZUZsb2F0KGIpKzE+PTB9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtpZighYXx8Im9iamVjdCIhPT1uLnR5cGUoYSl8fGEubm9kZVR5cGV8fG4uaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFrLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIWsuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfWlmKCFsLm93bkZpcnN0KWZvcihiIGluIGEpcmV0dXJuIGsuY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxrLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aVtqLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZuLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UocCwibXMtIikucmVwbGFjZShxLHIpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTA7aWYocyhhKSl7Zm9yKGM9YS5sZW5ndGg7Yz5kO2QrKylpZihiLmNhbGwoYVtkXSxkLGFbZF0pPT09ITEpYnJlYWt9ZWxzZSBmb3IoZCBpbiBhKWlmKGIuY2FsbChhW2RdLGQsYVtkXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShvLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihzKE9iamVjdChhKSk/bi5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zy5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGgpcmV0dXJuIGguY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7d2hpbGUoYz5kKWFbZSsrXT1iW2QrK107aWYoYyE9PWMpd2hpbGUodm9pZCAwIT09YltkXSlhW2UrK109YltkKytdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGc9MCxoPVtdO2lmKHMoYSkpZm9yKGQ9YS5sZW5ndGg7ZD5nO2crKyllPWIoYVtnXSxnLGMpLG51bGwhPWUmJmgucHVzaChlKTtlbHNlIGZvcihnIGluIGEpZT1iKGFbZ10sZyxjKSxudWxsIT1lJiZoLnB1c2goZSk7cmV0dXJuIGYuYXBwbHkoW10saCl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihmPWFbYl0sYj1hLGE9Ziksbi5pc0Z1bmN0aW9uKGEpPyhjPWUuY2FsbChhcmd1bWVudHMsMiksZD1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsYy5jb25jYXQoZS5jYWxsKGFyZ3VtZW50cykpKX0sZC5ndWlkPWEuZ3VpZD1hLmd1aWR8fG4uZ3VpZCsrLGQpOnZvaWQgMH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSxzdXBwb3J0Omx9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYobi5mbltTeW1ib2wuaXRlcmF0b3JdPWNbU3ltYm9sLml0ZXJhdG9yXSksbi5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2lbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gcyhhKXt2YXIgYj0hIWEmJiJsZW5ndGgiaW4gYSYmYS5sZW5ndGgsYz1uLnR5cGUoYSk7cmV0dXJuImZ1bmN0aW9uIj09PWN8fG4uaXNXaW5kb3coYSk/ITE6ImFycmF5Ij09PWN8fDA9PT1ifHwibnVtYmVyIj09dHlwZW9mIGImJmI+MCYmYi0xIGluIGF9dmFyIHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdT0ic2l6emxlIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9Z2EoKSx6PWdhKCksQT1nYSgpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPTE8PDMxLEQ9e30uaGFzT3duUHJvcGVydHksRT1bXSxGPUUucG9wLEc9RS5wdXNoLEg9RS5wdXNoLEk9RS5zbGljZSxKPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKWlmKGFbY109PT1iKXJldHVybiBjO3JldHVybi0xfSxLPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTD0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTT0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLE49IlxcWyIrTCsiKigiK00rIikoPzoiK0wrIiooWypeJHwhfl0/PSkiK0wrIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitNKyIpKXwpIitMKyIqXFxdIixPPSI6KCIrTSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrTisiKSopfC4qKVxcKXwpIixQPW5ldyBSZWdFeHAoTCsiKyIsImciKSxRPW5ldyBSZWdFeHAoIl4iK0wrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTCsiKyQiLCJnIiksUj1uZXcgUmVnRXhwKCJeIitMKyIqLCIrTCsiKiIpLFM9bmV3IFJlZ0V4cCgiXiIrTCsiKihbPit+XXwiK0wrIikiK0wrIioiKSxUPW5ldyBSZWdFeHAoIj0iK0wrIiooW15cXF0nXCJdKj8pIitMKyIqXFxdIiwiZyIpLFU9bmV3IFJlZ0V4cChPKSxWPW5ldyBSZWdFeHAoIl4iK00rIiQiKSxXPXtJRDpuZXcgUmVnRXhwKCJeIygiK00rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK04pLFBTRVVETzpuZXcgUmVnRXhwKCJeIitPKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK0wrIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK0wrIiooPzooWystXXwpIitMKyIqKFxcZCspfCkpIitMKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitLKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTCsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitMKyIqKCg/Oi1cXGQpP1xcZCopIitMKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxYPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksWT0vXmhcZCQvaSxaPS9eW157XStce1xzKlxbbmF0aXZlIFx3LywkPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sXz0vWyt+XS8sYWE9Lyd8XFwvZyxiYT1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK0wrIj98KCIrTCsiKXwuKSIsImlnIiksY2E9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9LGRhPWZ1bmN0aW9uKCl7bSgpfTt0cnl7SC5hcHBseShFPUkuY2FsbCh2LmNoaWxkTm9kZXMpLHYuY2hpbGROb2RlcyksRVt2LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlYSl7SD17YXBwbHk6RS5sZW5ndGg/ZnVuY3Rpb24oYSxiKXtHLmFwcGx5KGEsSS5jYWxsKGIpKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7d2hpbGUoYVtjKytdPWJbZCsrXSk7YS5sZW5ndGg9Yy0xfX19ZnVuY3Rpb24gZmEoYSxiLGQsZSl7dmFyIGYsaCxqLGssbCxvLHIscyx3PWImJmIub3duZXJEb2N1bWVudCx4PWI/Yi5ub2RlVHlwZTo5O2lmKGQ9ZHx8W10sInN0cmluZyIhPXR5cGVvZiBhfHwhYXx8MSE9PXgmJjkhPT14JiYxMSE9PXgpcmV0dXJuIGQ7aWYoIWUmJigoYj9iLm93bmVyRG9jdW1lbnR8fGI6dikhPT1uJiZtKGIpLGI9Ynx8bixwKSl7aWYoMTEhPT14JiYobz0kLmV4ZWMoYSkpKWlmKGY9b1sxXSl7aWYoOT09PXgpe2lmKCEoaj1iLmdldEVsZW1lbnRCeUlkKGYpKSlyZXR1cm4gZDtpZihqLmlkPT09ZilyZXR1cm4gZC5wdXNoKGopLGR9ZWxzZSBpZih3JiYoaj13LmdldEVsZW1lbnRCeUlkKGYpKSYmdChiLGopJiZqLmlkPT09ZilyZXR1cm4gZC5wdXNoKGopLGR9ZWxzZXtpZihvWzJdKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSksZDtpZigoZj1vWzNdKSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZikpLGR9aWYoYy5xc2EmJiFBW2ErIiAiXSYmKCFxfHwhcS50ZXN0KGEpKSl7aWYoMSE9PXgpdz1iLHM9YTtlbHNlIGlmKCJvYmplY3QiIT09Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXsoaz1iLmdldEF0dHJpYnV0ZSgiaWQiKSk/az1rLnJlcGxhY2UoYWEsIlxcJCYiKTpiLnNldEF0dHJpYnV0ZSgiaWQiLGs9dSkscj1nKGEpLGg9ci5sZW5ndGgsbD1WLnRlc3Qoayk/IiMiK2s6IltpZD0nIitrKyInXSI7d2hpbGUoaC0tKXJbaF09bCsiICIrcWEocltoXSk7cz1yLmpvaW4oIiwiKSx3PV8udGVzdChhKSYmb2EoYi5wYXJlbnROb2RlKXx8Yn1pZihzKXRyeXtyZXR1cm4gSC5hcHBseShkLHcucXVlcnlTZWxlY3RvckFsbChzKSksZH1jYXRjaCh5KXt9ZmluYWxseXtrPT09dSYmYi5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gaShhLnJlcGxhY2UoUSwiJDEiKSxiLGQsZSl9ZnVuY3Rpb24gZ2EoKXt2YXIgYT1bXTtmdW5jdGlvbiBiKGMsZSl7cmV0dXJuIGEucHVzaChjKyIgIik+ZC5jYWNoZUxlbmd0aCYmZGVsZXRlIGJbYS5zaGlmdCgpXSxiW2MrIiAiXT1lfXJldHVybiBifWZ1bmN0aW9uIGhhKGEpe3JldHVybiBhW3VdPSEwLGF9ZnVuY3Rpb24gaWEoYSl7dmFyIGI9bi5jcmVhdGVFbGVtZW50KCJkaXYiKTt0cnl7cmV0dXJuISFhKGIpfWNhdGNoKGMpe3JldHVybiExfWZpbmFsbHl7Yi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYiksYj1udWxsfX1mdW5jdGlvbiBqYShhLGIpe3ZhciBjPWEuc3BsaXQoInwiKSxlPWMubGVuZ3RoO3doaWxlKGUtLSlkLmF0dHJIYW5kbGVbY1tlXV09Yn1mdW5jdGlvbiBrYShhLGIpe3ZhciBjPWImJmEsZD1jJiYxPT09YS5ub2RlVHlwZSYmMT09PWIubm9kZVR5cGUmJih+Yi5zb3VyY2VJbmRleHx8QyktKH5hLnNvdXJjZUluZGV4fHxDKTtpZihkKXJldHVybiBkO2lmKGMpd2hpbGUoYz1jLm5leHRTaWJsaW5nKWlmKGM9PT1iKXJldHVybi0xO3JldHVybiBhPzE6LTF9ZnVuY3Rpb24gbGEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YyYmYi50eXBlPT09YX19ZnVuY3Rpb24gbWEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PWN8fCJidXR0b24iPT09YykmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBoYShmdW5jdGlvbihiKXtyZXR1cm4gYj0rYixoYShmdW5jdGlvbihjLGQpe3ZhciBlLGY9YShbXSxjLmxlbmd0aCxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSljW2U9ZltnXV0mJihjW2VdPSEoZFtlXT1jW2VdKSl9KX0pfWZ1bmN0aW9uIG9hKGEpe3JldHVybiBhJiYidW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmF9Yz1mYS5zdXBwb3J0PXt9LGY9ZmEuaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9YSYmKGEub3duZXJEb2N1bWVudHx8YSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiPyJIVE1MIiE9PWIubm9kZU5hbWU6ITF9LG09ZmEuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZSxnPWE/YS5vd25lckRvY3VtZW50fHxhOnY7cmV0dXJuIGchPT1uJiY5PT09Zy5ub2RlVHlwZSYmZy5kb2N1bWVudEVsZW1lbnQ/KG49ZyxvPW4uZG9jdW1lbnRFbGVtZW50LHA9IWYobiksKGU9bi5kZWZhdWx0VmlldykmJmUudG9wIT09ZSYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZGEsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixkYSkpLGMuYXR0cmlidXRlcz1pYShmdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc05hbWU9ImkiLCFhLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxjLmdldEVsZW1lbnRzQnlUYWdOYW1lPWlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGVuZENoaWxkKG4uY3JlYXRlQ29tbWVudCgiIikpLCFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPVoudGVzdChuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGMuZ2V0QnlJZD1pYShmdW5jdGlvbihhKXtyZXR1cm4gby5hcHBlbmRDaGlsZChhKS5pZD11LCFuLmdldEVsZW1lbnRzQnlOYW1lfHwhbi5nZXRFbGVtZW50c0J5TmFtZSh1KS5sZW5ndGh9KSxjLmdldEJ5SWQ/KGQuZmluZC5JRD1mdW5jdGlvbihhLGIpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50QnlJZCYmcCl7dmFyIGM9Yi5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYz9bY106W119fSxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoYmEsY2EpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifX0pOihkZWxldGUgZC5maW5kLklELGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShiYSxjYSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGMmJmMudmFsdWU9PT1ifX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJnA/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scj1bXSxxPVtdLChjLnFzYT1aLnRlc3Qobi5xdWVyeVNlbGVjdG9yQWxsKSkmJihpYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitMKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitMKyIqKD86dmFsdWV8IitLKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrdSsiLV0iKS5sZW5ndGh8fHEucHVzaCgifj0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrdSsiKyoiKS5sZW5ndGh8fHEucHVzaCgiLiMuK1srfl0iKX0pLGlhKGZ1bmN0aW9uKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGEuYXBwZW5kQ2hpbGQoYikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGEucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnEucHVzaCgibmFtZSIrTCsiKlsqXiR8IX5dPz0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RofHxxLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikscS5wdXNoKCIsLio6Iil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPVoudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmaWEoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSwiZGl2Iikscy5jYWxsKGEsIltzIT0nJ106eCIpLHIucHVzaCgiIT0iLE8pfSkscT1xLmxlbmd0aCYmbmV3IFJlZ0V4cChxLmpvaW4oInwiKSkscj1yLmxlbmd0aCYmbmV3IFJlZ0V4cChyLmpvaW4oInwiKSksYj1aLnRlc3Qoby5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksdD1ifHxaLnRlc3Qoby5jb250YWlucyk/ZnVuY3Rpb24oYSxiKXt2YXIgYz05PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLGQ9YiYmYi5wYXJlbnROb2RlO3JldHVybiBhPT09ZHx8ISghZHx8MSE9PWQubm9kZVR5cGV8fCEoYy5jb250YWlucz9jLmNvbnRhaW5zKGQpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZCkpKX06ZnVuY3Rpb24oYSxiKXtpZihiKXdoaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiEwO3JldHVybiExfSxCPWI/ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBkPSFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBkP2Q6KGQ9KGEub3duZXJEb2N1bWVudHx8YSk9PT0oYi5vd25lckRvY3VtZW50fHxiKT9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpOjEsMSZkfHwhYy5zb3J0RGV0YWNoZWQmJmIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSk9PT1kP2E9PT1ufHxhLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYSk/LTE6Yj09PW58fGIub3duZXJEb2N1bWVudD09PXYmJnQodixiKT8xOms/SihrLGEpLUooayxiKTowOjQmZD8tMToxKX06ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBjLGQ9MCxlPWEucGFyZW50Tm9kZSxmPWIucGFyZW50Tm9kZSxnPVthXSxoPVtiXTtpZighZXx8IWYpcmV0dXJuIGE9PT1uPy0xOmI9PT1uPzE6ZT8tMTpmPzE6az9KKGssYSktSihrLGIpOjA7aWYoZT09PWYpcmV0dXJuIGthKGEsYik7Yz1hO3doaWxlKGM9Yy5wYXJlbnROb2RlKWcudW5zaGlmdChjKTtjPWI7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO3doaWxlKGdbZF09PT1oW2RdKWQrKztyZXR1cm4gZD9rYShnW2RdLGhbZF0pOmdbZF09PT12Py0xOmhbZF09PT12PzE6MH0sbik6bn0sZmEubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBmYShhLG51bGwsbnVsbCxiKX0sZmEubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYil7aWYoKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLGI9Yi5yZXBsYWNlKFQsIj0nJDEnXSIpLGMubWF0Y2hlc1NlbGVjdG9yJiZwJiYhQVtiKyIgIl0mJighcnx8IXIudGVzdChiKSkmJighcXx8IXEudGVzdChiKSkpdHJ5e3ZhciBkPXMuY2FsbChhLGIpO2lmKGR8fGMuZGlzY29ubmVjdGVkTWF0Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChlKXt9cmV0dXJuIGZhKGIsbixudWxsLFthXSkubGVuZ3RoPjB9LGZhLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLHQoYSxiKX0sZmEuYXR0cj1mdW5jdGlvbihhLGIpeyhhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKTt2YXIgZT1kLmF0dHJIYW5kbGVbYi50b0xvd2VyQ2FzZSgpXSxmPWUmJkQuY2FsbChkLmF0dHJIYW5kbGUsYi50b0xvd2VyQ2FzZSgpKT9lKGEsYiwhcCk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1mP2Y6Yy5hdHRyaWJ1dGVzfHwhcD9hLmdldEF0dHJpYnV0ZShiKTooZj1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZmLnNwZWNpZmllZD9mLnZhbHVlOm51bGx9LGZhLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX0sZmEudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYobD0hYy5kZXRlY3REdXBsaWNhdGVzLGs9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoQiksbCl7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGs9bnVsbCxhfSxlPWZhLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz0iIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZigic3RyaW5nIj09dHlwZW9mIGEudGV4dENvbnRlbnQpcmV0dXJuIGEudGV4dENvbnRlbnQ7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWMrPWUoYSl9ZWxzZSBpZigzPT09Znx8ND09PWYpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2Ugd2hpbGUoYj1hW2QrK10pYys9ZShiKTtyZXR1cm4gY30sZD1mYS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpoYSxtYXRjaDpXLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoYmEsY2EpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGJhLGNhKSwifj0iPT09YVsyXSYmKGFbM109IiAiK2FbM10rIiAiKSxhLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8ZmEuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9kZCI9PT1hWzNdKSk6YVszXSYmZmEuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNl0mJmFbMl07cmV0dXJuIFcuQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdP2FbMl09YVs0XXx8YVs1XXx8IiI6YyYmVS50ZXN0KGMpJiYoYj1nKGMsITApKSYmKGI9Yy5pbmRleE9mKCIpIixjLmxlbmd0aC1iKS1jLmxlbmd0aCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiKSxhWzJdPWMuc2xpY2UoMCxiKSksYS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShiYSxjYSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9eVthKyIgIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoIihefCIrTCsiKSIrYSsiKCIrTCsifCQpIikpJiZ5KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIudGVzdCgic3RyaW5nIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9ZmEuYXR0cihkLGEpO3JldHVybiBudWxsPT1lPyIhPSI9PT1iOmI/KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShQLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoLHQ9ITE7aWYocSl7aWYoZil7d2hpbGUocCl7bT1iO3doaWxlKG09bVtwXSlpZihoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpcmV0dXJuITE7bz1wPSJvbmx5Ij09PWEmJiFvJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKG89W2c/cS5maXJzdENoaWxkOnEubGFzdENoaWxkXSxnJiZzKXttPXEsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biYmalsyXSxtPW4mJnEuY2hpbGROb2Rlc1tuXTt3aGlsZShtPSsrbiYmbSYmbVtwXXx8KHQ9bj0wKXx8by5wb3AoKSlpZigxPT09bS5ub2RlVHlwZSYmKyt0JiZtPT09Yil7a1thXT1bdyxuLHRdO2JyZWFrfX1lbHNlIGlmKHMmJihtPWIsbD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLHQ9biksdD09PSExKXdoaWxlKG09KytuJiZtJiZtW3BdfHwodD1uPTApfHxvLnBvcCgpKWlmKChoP20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PW0ubm9kZVR5cGUpJiYrK3QmJihzJiYobD1tW3VdfHwobVt1XT17fSksaz1sW20udW5pcXVlSURdfHwobFttLnVuaXF1ZUlEXT17fSksa1thXT1bdyx0XSksbT09PWIpKWJyZWFrO3JldHVybiB0LT1lLHQ9PT1kfHx0JWQ9PT0wJiZ0L2Q+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGEsYil7dmFyIGMsZT1kLnBzZXVkb3NbYV18fGQuc2V0RmlsdGVyc1thLnRvTG93ZXJDYXNlKCldfHxmYS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2EpO3JldHVybiBlW3VdP2UoYik6ZS5sZW5ndGg+MT8oYz1bYSxhLCIiLGJdLGQuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpP2hhKGZ1bmN0aW9uKGEsYyl7dmFyIGQsZj1lKGEsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pZD1KKGEsZltnXSksYVtkXT0hKGNbZF09ZltnXSl9KTpmdW5jdGlvbihhKXtyZXR1cm4gZShhLDAsYyl9KTplfX0scHNldWRvczp7bm90OmhhKGZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZD1oKGEucmVwbGFjZShRLCIkMSIpKTtyZXR1cm4gZFt1XT9oYShmdW5jdGlvbihhLGIsYyxlKXt2YXIgZixnPWQoYSxudWxsLGUsW10pLGg9YS5sZW5ndGg7d2hpbGUoaC0tKShmPWdbaF0pJiYoYVtoXT0hKGJbaF09ZikpfSk6ZnVuY3Rpb24oYSxlLGYpe3JldHVybiBiWzBdPWEsZChiLG51bGwsZixjKSxiWzBdPW51bGwsIWMucG9wKCl9fSksaGFzOmhhKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gZmEoYSxiKS5sZW5ndGg+MH19KSxjb250YWluczpoYShmdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoYmEsY2EpLGZ1bmN0aW9uKGIpe3JldHVybihiLnRleHRDb250ZW50fHxiLmlubmVyVGV4dHx8ZShiKSkuaW5kZXhPZihhKT4tMX19KSxsYW5nOmhhKGZ1bmN0aW9uKGEpe3JldHVybiBWLnRlc3QoYXx8IiIpfHxmYS5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIithKSxhPWEucmVwbGFjZShiYSxjYSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihiKXt2YXIgYztkbyBpZihjPXA/Yi5sYW5nOmIuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxiLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybiBjPWMudG9Mb3dlckNhc2UoKSxjPT09YXx8MD09PWMuaW5kZXhPZihhKyItIik7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmMT09PWIubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihiKXt2YXIgYz1hLmxvY2F0aW9uJiZhLmxvY2F0aW9uLmhhc2g7cmV0dXJuIGMmJmMuc2xpY2UoMSk9PT1iLmlkfSxyb290OmZ1bmN0aW9uKGEpe3JldHVybiBhPT09b30sZm9jdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1uLmFjdGl2ZUVsZW1lbnQmJighbi5oYXNGb2N1c3x8bi5oYXNGb2N1cygpKSYmISEoYS50eXBlfHxhLmhyZWZ8fH5hLnRhYkluZGV4KX0sZW5hYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSExfSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmISFhLmNoZWNrZWR8fCJvcHRpb24iPT09YiYmISFhLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxhLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKGEpe2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZylpZihhLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hZC5wc2V1ZG9zLmVtcHR5KGEpfSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIFkudGVzdChhLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFgudGVzdChhLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09YiYmImJ1dHRvbiI9PT1hLnR5cGV8fCJidXR0b24iPT09Yn0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4iaW5wdXQiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1hLnR5cGUmJihudWxsPT0oYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09Yi50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6bmEoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0Om5hKGZ1bmN0aW9uKGEsYil7cmV0dXJuW2ItMV19KSxlcTpuYShmdW5jdGlvbihhLGIsYyl7cmV0dXJuWzA+Yz9jK2I6Y119KSxldmVuOm5hKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7Yj5jO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksb2RkOm5hKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTE7Yj5jO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksbHQ6bmEoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7LS1kPj0wOylhLnB1c2goZCk7cmV0dXJuIGF9KSxndDpuYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzsrK2Q8YjspYS5wdXNoKGQpO3JldHVybiBhfSl9fSxkLnBzZXVkb3MubnRoPWQucHNldWRvcy5lcTtmb3IoYiBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlkLnBzZXVkb3NbYl09bGEoYik7Zm9yKGIgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlkLnBzZXVkb3NbYl09bWEoYik7ZnVuY3Rpb24gcGEoKXt9cGEucHJvdG90eXBlPWQuZmlsdGVycz1kLnBzZXVkb3MsZC5zZXRGaWx0ZXJzPW5ldyBwYSxnPWZhLnRva2VuaXplPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz16W2ErIiAiXTtpZihrKXJldHVybiBiPzA6ay5zbGljZSgwKTtoPWEsaT1bXSxqPWQucHJlRmlsdGVyO3doaWxlKGgpe2MmJiEoZT1SLmV4ZWMoaCkpfHwoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1TLmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFEsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1XW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/ZmEuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiBxYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHJhKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJiJwYXJlbnROb2RlIj09PWQsZj14Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGYpe3doaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSlyZXR1cm4gYShiLGMsZil9OmZ1bmN0aW9uKGIsYyxnKXt2YXIgaCxpLGosaz1bdyxmXTtpZihnKXt3aGlsZShiPWJbZF0paWYoKDE9PT1iLm5vZGVUeXBlfHxlKSYmYShiLGMsZykpcmV0dXJuITB9ZWxzZSB3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpe2lmKGo9Ylt1XXx8KGJbdV09e30pLGk9altiLnVuaXF1ZUlEXXx8KGpbYi51bmlxdWVJRF09e30pLChoPWlbZF0pJiZoWzBdPT09dyYmaFsxXT09PWYpcmV0dXJuIGtbMl09aFsyXTtpZihpW2RdPWssa1syXT1hKGIsYyxnKSlyZXR1cm4hMH19fWZ1bmN0aW9uIHNhKGEpe3JldHVybiBhLmxlbmd0aD4xP2Z1bmN0aW9uKGIsYyxkKXt2YXIgZT1hLmxlbmd0aDt3aGlsZShlLS0paWYoIWFbZV0oYixjLGQpKXJldHVybiExO3JldHVybiEwfTphWzBdfWZ1bmN0aW9uIHRhKGEsYixjKXtmb3IodmFyIGQ9MCxlPWIubGVuZ3RoO2U+ZDtkKyspZmEoYSxiW2RdLGMpO3JldHVybiBjfWZ1bmN0aW9uIHVhKGEsYixjLGQsZSl7Zm9yKHZhciBmLGc9W10saD0wLGk9YS5sZW5ndGgsaj1udWxsIT1iO2k+aDtoKyspKGY9YVtoXSkmJihjJiYhYyhmLGQsZSl8fChnLnB1c2goZiksaiYmYi5wdXNoKGgpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gdmEoYSxiLGMsZCxlLGYpe3JldHVybiBkJiYhZFt1XSYmKGQ9dmEoZCkpLGUmJiFlW3VdJiYoZT12YShlLGYpKSxoYShmdW5jdGlvbihmLGcsaCxpKXt2YXIgaixrLGwsbT1bXSxuPVtdLG89Zy5sZW5ndGgscD1mfHx0YShifHwiKiIsaC5ub2RlVHlwZT9baF06aCxbXSkscT0hYXx8IWYmJmI/cDp1YShwLG0sYSxoLGkpLHI9Yz9lfHwoZj9hOm98fGQpP1tdOmc6cTtpZihjJiZjKHEscixoLGkpLGQpe2o9dWEocixuKSxkKGosW10saCxpKSxrPWoubGVuZ3RoO3doaWxlKGstLSkobD1qW2tdKSYmKHJbbltrXV09IShxW25ba11dPWwpKX1pZihmKXtpZihlfHxhKXtpZihlKXtqPVtdLGs9ci5sZW5ndGg7d2hpbGUoay0tKShsPXJba10pJiZqLnB1c2gocVtrXT1sKTtlKG51bGwscj1bXSxqLGkpfWs9ci5sZW5ndGg7d2hpbGUoay0tKShsPXJba10pJiYoaj1lP0ooZixsKTptW2tdKT4tMSYmKGZbal09IShnW2pdPWwpKX19ZWxzZSByPXVhKHI9PT1nP3Iuc3BsaWNlKG8sci5sZW5ndGgpOnIpLGU/ZShudWxsLGcscixpKTpILmFwcGx5KGcscil9KX1mdW5jdGlvbiB3YShhKXtmb3IodmFyIGIsYyxlLGY9YS5sZW5ndGgsZz1kLnJlbGF0aXZlW2FbMF0udHlwZV0saD1nfHxkLnJlbGF0aXZlWyIgIl0saT1nPzE6MCxrPXJhKGZ1bmN0aW9uKGEpe3JldHVybiBhPT09Yn0saCwhMCksbD1yYShmdW5jdGlvbihhKXtyZXR1cm4gSihiLGEpPi0xfSxoLCEwKSxtPVtmdW5jdGlvbihhLGMsZCl7dmFyIGU9IWcmJihkfHxjIT09ail8fCgoYj1jKS5ub2RlVHlwZT9rKGEsYyxkKTpsKGEsYyxkKSk7cmV0dXJuIGI9bnVsbCxlfV07Zj5pO2krKylpZihjPWQucmVsYXRpdmVbYVtpXS50eXBlXSltPVtyYShzYShtKSxjKV07ZWxzZXtpZihjPWQuZmlsdGVyW2FbaV0udHlwZV0uYXBwbHkobnVsbCxhW2ldLm1hdGNoZXMpLGNbdV0pe2ZvcihlPSsraTtmPmU7ZSsrKWlmKGQucmVsYXRpdmVbYVtlXS50eXBlXSlicmVhaztyZXR1cm4gdmEoaT4xJiZzYShtKSxpPjEmJnFhKGEuc2xpY2UoMCxpLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09YVtpLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoUSwiJDEiKSxjLGU+aSYmd2EoYS5zbGljZShpLGUpKSxmPmUmJndhKGE9YS5zbGljZShlKSksZj5lJiZxYShhKSl9bS5wdXNoKGMpfXJldHVybiBzYShtKX1mdW5jdGlvbiB4YShhLGIpe3ZhciBjPWIubGVuZ3RoPjAsZT1hLmxlbmd0aD4wLGY9ZnVuY3Rpb24oZixnLGgsaSxrKXt2YXIgbCxvLHEscj0wLHM9IjAiLHQ9ZiYmW10sdT1bXSx2PWoseD1mfHxlJiZkLmZpbmQuVEFHKCIqIixrKSx5PXcrPW51bGw9PXY/MTpNYXRoLnJhbmRvbSgpfHwuMSx6PXgubGVuZ3RoO2ZvcihrJiYoaj1nPT09bnx8Z3x8ayk7cyE9PXomJm51bGwhPShsPXhbc10pO3MrKyl7aWYoZSYmbCl7bz0wLGd8fGwub3duZXJEb2N1bWVudD09PW58fChtKGwpLGg9IXApO3doaWxlKHE9YVtvKytdKWlmKHEobCxnfHxuLGgpKXtpLnB1c2gobCk7YnJlYWt9ayYmKHc9eSl9YyYmKChsPSFxJiZsKSYmci0tLGYmJnQucHVzaChsKSl9aWYocis9cyxjJiZzIT09cil7bz0wO3doaWxlKHE9YltvKytdKXEodCx1LGcsaCk7aWYoZil7aWYocj4wKXdoaWxlKHMtLSl0W3NdfHx1W3NdfHwodVtzXT1GLmNhbGwoaSkpO3U9dWEodSl9SC5hcHBseShpLHUpLGsmJiFmJiZ1Lmxlbmd0aD4wJiZyK2IubGVuZ3RoPjEmJmZhLnVuaXF1ZVNvcnQoaSl9cmV0dXJuIGsmJih3PXksaj12KSx0fTtyZXR1cm4gYz9oYShmKTpmfXJldHVybiBoPWZhLmNvbXBpbGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9W10sZj1BW2ErIiAiXTtpZighZil7Ynx8KGI9ZyhhKSksYz1iLmxlbmd0aDt3aGlsZShjLS0pZj13YShiW2NdKSxmW3VdP2QucHVzaChmKTplLnB1c2goZik7Zj1BKGEseGEoZSxkKSksZi5zZWxlY3Rvcj1hfXJldHVybiBmfSxpPWZhLnNlbGVjdD1mdW5jdGlvbihhLGIsZSxmKXt2YXIgaSxqLGssbCxtLG49ImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEsbz0hZiYmZyhhPW4uc2VsZWN0b3J8fGEpO2lmKGU9ZXx8W10sMT09PW8ubGVuZ3RoKXtpZihqPW9bMF09b1swXS5zbGljZSgwKSxqLmxlbmd0aD4yJiYiSUQiPT09KGs9alswXSkudHlwZSYmYy5nZXRCeUlkJiY5PT09Yi5ub2RlVHlwZSYmcCYmZC5yZWxhdGl2ZVtqWzFdLnR5cGVdKXtpZihiPShkLmZpbmQuSUQoay5tYXRjaGVzWzBdLnJlcGxhY2UoYmEsY2EpLGIpfHxbXSlbMF0sIWIpcmV0dXJuIGU7biYmKGI9Yi5wYXJlbnROb2RlKSxhPWEuc2xpY2Uoai5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9aT1XLm5lZWRzQ29udGV4dC50ZXN0KGEpPzA6ai5sZW5ndGg7d2hpbGUoaS0tKXtpZihrPWpbaV0sZC5yZWxhdGl2ZVtsPWsudHlwZV0pYnJlYWs7aWYoKG09ZC5maW5kW2xdKSYmKGY9bShrLm1hdGNoZXNbMF0ucmVwbGFjZShiYSxjYSksXy50ZXN0KGpbMF0udHlwZSkmJm9hKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoai5zcGxpY2UoaSwxKSxhPWYubGVuZ3RoJiZxYShqKSwhYSlyZXR1cm4gSC5hcHBseShlLGYpLGU7YnJlYWt9fX1yZXR1cm4obnx8aChhLG8pKShmLGIsIXAsZSwhYnx8Xy50ZXN0KGEpJiZvYShiLnBhcmVudE5vZGUpfHxiKSxlfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9aWEoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLGlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGphKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsInR5cGUiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGlucHV0Lz4iLGEuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGphKCJ2YWx1ZSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHwiaW5wdXQiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3ZvaWQgMDphLmRlZmF1bHRWYWx1ZX0pLGlhKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxqYShLLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxmYX0oYSk7bi5maW5kPXQsbi5leHByPXQuc2VsZWN0b3JzLG4uZXhwclsiOiJdPW4uZXhwci5wc2V1ZG9zLG4udW5pcXVlU29ydD1uLnVuaXF1ZT10LnVuaXF1ZVNvcnQsbi50ZXh0PXQuZ2V0VGV4dCxuLmlzWE1MRG9jPXQuaXNYTUwsbi5jb250YWlucz10LmNvbnRhaW5zO3ZhciB1PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPXZvaWQgMCE9PWM7d2hpbGUoKGE9YVtiXSkmJjkhPT1hLm5vZGVUeXBlKWlmKDE9PT1hLm5vZGVUeXBlKXtpZihlJiZuKGEpLmlzKGMpKWJyZWFrO2QucHVzaChhKX1yZXR1cm4gZH0sdj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXTthO2E9YS5uZXh0U2libGluZykxPT09YS5ub2RlVHlwZSYmYSE9PWImJmMucHVzaChhKTtyZXR1cm4gY30sdz1uLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LHg9L148KFtcdy1dKylccypcLz8+KD86PFwvXDE+fCkkLyx5PS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24geihhLGIsYyl7aWYobi5pc0Z1bmN0aW9uKGIpKXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTtpZihiLm5vZGVUeXBlKXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWIhPT1jfSk7aWYoInN0cmluZyI9PXR5cGVvZiBiKXtpZih5LnRlc3QoYikpcmV0dXJuIG4uZmlsdGVyKGIsYSxjKTtiPW4uZmlsdGVyKGIsYSl9cmV0dXJuIG4uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBuLmluQXJyYXkoYSxiKT4tMSE9PWN9KX1uLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9uLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOm4uZmluZC5tYXRjaGVzKGEsbi5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxuLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjPVtdLGQ9dGhpcyxlPWQubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2sobihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2U+YjtiKyspaWYobi5jb250YWlucyhkW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihiPTA7ZT5iO2IrKyluLmZpbmQoYSxkW2JdLGMpO3JldHVybiBjPXRoaXMucHVzaFN0YWNrKGU+MT9uLnVuaXF1ZShjKTpjKSxjLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrYTphLGN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeih0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeih0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEheih0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmdy50ZXN0KGEpP24oYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgQSxCPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKikpJC8sQz1uLmZuLmluaXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBlLGY7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYz1jfHxBLCJzdHJpbmciPT10eXBlb2YgYSl7aWYoZT0iPCI9PT1hLmNoYXJBdCgwKSYmIj4iPT09YS5jaGFyQXQoYS5sZW5ndGgtMSkmJmEubGVuZ3RoPj0zP1tudWxsLGEsbnVsbF06Qi5leGVjKGEpLCFlfHwhZVsxXSYmYilyZXR1cm4hYnx8Yi5qcXVlcnk/KGJ8fGMpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihiKS5maW5kKGEpO2lmKGVbMV0pe2lmKGI9YiBpbnN0YW5jZW9mIG4/YlswXTpiLG4ubWVyZ2UodGhpcyxuLnBhcnNlSFRNTChlWzFdLGImJmIubm9kZVR5cGU/Yi5vd25lckRvY3VtZW50fHxiOmQsITApKSx4LnRlc3QoZVsxXSkmJm4uaXNQbGFpbk9iamVjdChiKSlmb3IoZSBpbiBiKW4uaXNGdW5jdGlvbih0aGlzW2VdKT90aGlzW2VdKGJbZV0pOnRoaXMuYXR0cihlLGJbZV0pO3JldHVybiB0aGlzfWlmKGY9ZC5nZXRFbGVtZW50QnlJZChlWzJdKSxmJiZmLnBhcmVudE5vZGUpe2lmKGYuaWQhPT1lWzJdKXJldHVybiBBLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWZ9cmV0dXJuIHRoaXMuY29udGV4dD1kLHRoaXMuc2VsZWN0b3I9YSx0aGlzfXJldHVybiBhLm5vZGVUeXBlPyh0aGlzLmNvbnRleHQ9dGhpc1swXT1hLHRoaXMubGVuZ3RoPTEsdGhpcyk6bi5pc0Z1bmN0aW9uKGEpPyJ1bmRlZmluZWQiIT10eXBlb2YgYy5yZWFkeT9jLnJlYWR5KGEpOmEobik6KHZvaWQgMCE9PWEuc2VsZWN0b3ImJih0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWEuY29udGV4dCksbi5tYWtlQXJyYXkoYSx0aGlzKSl9O0MucHJvdG90eXBlPW4uZm4sQT1uKGQpO3ZhciBEPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLEU9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07bi5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYixjPW4oYSx0aGlzKSxkPWMubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTA7ZD5iO2IrKylpZihuLmNvbnRhaW5zKHRoaXMsY1tiXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTAsZT10aGlzLmxlbmd0aCxmPVtdLGc9dy50ZXN0KGEpfHwic3RyaW5nIiE9dHlwZW9mIGE/bihhLGJ8fHRoaXMuY29udGV4dCk6MDtlPmQ7ZCsrKWZvcihjPXRoaXNbZF07YyYmYyE9PWI7Yz1jLnBhcmVudE5vZGUpaWYoYy5ub2RlVHlwZTwxMSYmKGc/Zy5pbmRleChjKT4tMToxPT09Yy5ub2RlVHlwZSYmbi5maW5kLm1hdGNoZXNTZWxlY3RvcihjLGEpKSl7Zi5wdXNoKGMpO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhmLmxlbmd0aD4xP24udW5pcXVlU29ydChmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP24uaW5BcnJheSh0aGlzWzBdLG4oYSkpOm4uaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobi51bmlxdWVTb3J0KG4ubWVyZ2UodGhpcy5nZXQoKSxuKGEsYikpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWE/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoYSkpfX0pO2Z1bmN0aW9uIEYoYSxiKXtkbyBhPWFbYl07d2hpbGUoYSYmMSE9PWEubm9kZVR5cGUpO3JldHVybiBhfW4uZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmMTEhPT1iLm5vZGVUeXBlP2I6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gdShhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHUoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEYoYSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gRihhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gdShhLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGEpe3JldHVybiB1KGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB1KGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdShhLCJwcmV2aW91c1NpYmxpbmciLGMpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gdigoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIHYoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG4ubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpuLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1uLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW4uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihFW2FdfHwoZT1uLnVuaXF1ZVNvcnQoZSkpLEQudGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpKSx0aGlzLnB1c2hTdGFjayhlKX19KTt2YXIgRz0vXFMrL2c7ZnVuY3Rpb24gSChhKXt2YXIgYj17fTtyZXR1cm4gbi5lYWNoKGEubWF0Y2goRyl8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT0ic3RyaW5nIj09dHlwZW9mIGE/SChhKTpuLmV4dGVuZCh7fSxhKTt2YXIgYixjLGQsZSxmPVtdLGc9W10saD0tMSxpPWZ1bmN0aW9uKCl7Zm9yKGU9YS5vbmNlLGQ9Yj0hMDtnLmxlbmd0aDtoPS0xKXtjPWcuc2hpZnQoKTt3aGlsZSgrK2g8Zi5sZW5ndGgpZltoXS5hcHBseShjWzBdLGNbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2UmJihoPWYubGVuZ3RoLGM9ITEpfWEubWVtb3J5fHwoYz0hMSksYj0hMSxlJiYoZj1jP1tdOiIiKX0saj17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIGYmJihjJiYhYiYmKGg9Zi5sZW5ndGgtMSxnLnB1c2goYykpLGZ1bmN0aW9uIGQoYil7bi5lYWNoKGIsZnVuY3Rpb24oYixjKXtuLmlzRnVuY3Rpb24oYyk/YS51bmlxdWUmJmouaGFzKGMpfHxmLnB1c2goYyk6YyYmYy5sZW5ndGgmJiJzdHJpbmciIT09bi50eXBlKGMpJiZkKGMpfSl9KGFyZ3VtZW50cyksYyYmIWImJmkoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIG4uZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxiKXt2YXIgYzt3aGlsZSgoYz1uLmluQXJyYXkoYixmLGMpKT4tMSlmLnNwbGljZShjLDEpLGg+PWMmJmgtLX0pLHRoaXN9LGhhczpmdW5jdGlvbihhKXtyZXR1cm4gYT9uLmluQXJyYXkoYSxmKT4tMTpmLmxlbmd0aD4wfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBmJiYoZj1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBlPWc9W10sZj1jPSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWZ9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZT0hMCxjfHxqLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWV9LGZpcmVXaXRoOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGV8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sZy5wdXNoKGMpLGJ8fGkoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBqLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBqfSxuLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLG4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsbi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsbi5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBuLkRlZmVycmVkKGZ1bmN0aW9uKGMpe24uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bi5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZuLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5wcm9ncmVzcyhjLm5vdGlmeSkuZG9uZShjLnJlc29sdmUpLmZhaWwoYy5yZWplY3QpOmNbZlswXSsiV2l0aCJdKHRoaXM9PT1kP2MucHJvbWlzZSgpOnRoaXMsZz9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hP24uZXh0ZW5kKGEsZCk6ZH19LGU9e307cmV0dXJuIGQucGlwZT1kLnRoZW4sbi5lYWNoKGIsZnVuY3Rpb24oYSxmKXt2YXIgZz1mWzJdLGg9ZlszXTtkW2ZbMV1dPWcuYWRkLGgmJmcuYWRkKGZ1bmN0aW9uKCl7Yz1ofSxiWzFeYV1bMl0uZGlzYWJsZSxiWzJdWzJdLmxvY2spLGVbZlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gZVtmWzBdKyJXaXRoIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1lLmNhbGwoYXJndW1lbnRzKSxkPWMubGVuZ3RoLGY9MSE9PWR8fGEmJm4uaXNGdW5jdGlvbihhLnByb21pc2UpP2Q6MCxnPTE9PT1mP2E6bi5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihkKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZS5jYWxsKGFyZ3VtZW50cyk6ZCxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGQ+MSlmb3IoaT1uZXcgQXJyYXkoZCksaj1uZXcgQXJyYXkoZCksaz1uZXcgQXJyYXkoZCk7ZD5iO2IrKyljW2JdJiZuLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5wcm9ncmVzcyhoKGIsaixpKSkuZG9uZShoKGIsayxjKSkuZmFpbChnLnJlamVjdCk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEk7bi5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbi5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxuLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9uLnJlYWR5V2FpdCsrOm4ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXsoYT09PSEwPy0tbi5yZWFkeVdhaXQ6bi5pc1JlYWR5KXx8KG4uaXNSZWFkeT0hMCxhIT09ITAmJi0tbi5yZWFkeVdhaXQ+MHx8KEkucmVzb2x2ZVdpdGgoZCxbbl0pLG4uZm4udHJpZ2dlckhhbmRsZXImJihuKGQpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpLG4oZCkub2ZmKCJyZWFkeSIpKSkpfX0pO2Z1bmN0aW9uIEooKXtkLmFkZEV2ZW50TGlzdGVuZXI/KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSyksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixLKSk6KGQuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSyksYS5kZXRhY2hFdmVudCgib25sb2FkIixLKSl9ZnVuY3Rpb24gSygpeyhkLmFkZEV2ZW50TGlzdGVuZXJ8fCJsb2FkIj09PWEuZXZlbnQudHlwZXx8ImNvbXBsZXRlIj09PWQucmVhZHlTdGF0ZSkmJihKKCksbi5yZWFkeSgpKX1uLnJlYWR5LnByb21pc2U9ZnVuY3Rpb24oYil7aWYoIUkpaWYoST1uLkRlZmVycmVkKCksImNvbXBsZXRlIj09PWQucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09ZC5yZWFkeVN0YXRlJiYhZC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwpYS5zZXRUaW1lb3V0KG4ucmVhZHkpO2Vsc2UgaWYoZC5hZGRFdmVudExpc3RlbmVyKWQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSyksYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixLKTtlbHNle2QuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSyksYS5hdHRhY2hFdmVudCgib25sb2FkIixLKTt2YXIgYz0hMTt0cnl7Yz1udWxsPT1hLmZyYW1lRWxlbWVudCYmZC5kb2N1bWVudEVsZW1lbnR9Y2F0Y2goZSl7fWMmJmMuZG9TY3JvbGwmJiFmdW5jdGlvbiBmKCl7aWYoIW4uaXNSZWFkeSl7dHJ5e2MuZG9TY3JvbGwoImxlZnQiKX1jYXRjaChiKXtyZXR1cm4gYS5zZXRUaW1lb3V0KGYsNTApfUooKSxuLnJlYWR5KCl9fSgpfXJldHVybiBJLnByb21pc2UoYil9LG4ucmVhZHkucHJvbWlzZSgpO3ZhciBMO2ZvcihMIGluIG4obCkpYnJlYWs7bC5vd25GaXJzdD0iMCI9PT1MLGwuaW5saW5lQmxvY2tOZWVkc0xheW91dD0hMSxuKGZ1bmN0aW9uKCl7dmFyIGEsYixjLGU7Yz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sYyYmYy5zdHlsZSYmKGI9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweCIsYy5hcHBlbmRDaGlsZChlKS5hcHBlbmRDaGlsZChiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGIuc3R5bGUuem9vbSYmKGIuc3R5bGUuY3NzVGV4dD0iZGlzcGxheTppbmxpbmU7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzoxcHg7d2lkdGg6MXB4O3pvb206MSIsbC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWE9Mz09PWIub2Zmc2V0V2lkdGgsYSYmKGMuc3R5bGUuem9vbT0xKSksYy5yZW1vdmVDaGlsZChlKSl9KSxmdW5jdGlvbigpe3ZhciBhPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5kZWxldGVFeHBhbmRvPSEwO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKGIpe2wuZGVsZXRlRXhwYW5kbz0hMX1hPW51bGx9KCk7dmFyIE09ZnVuY3Rpb24oYSl7dmFyIGI9bi5ub0RhdGFbKGEubm9kZU5hbWUrIiAiKS50b0xvd2VyQ2FzZSgpXSxjPSthLm5vZGVUeXBlfHwxO3JldHVybiAxIT09YyYmOSE9PWM/ITE6IWJ8fGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9LE49L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxPPS8oW0EtWl0pL2c7ZnVuY3Rpb24gUChhLGIsYyl7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpe3ZhciBkPSJkYXRhLSIrYi5yZXBsYWNlKE8sIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSJ0cnVlIj09PWM/ITA6ImZhbHNlIj09PWM/ITE6Im51bGwiPT09Yz9udWxsOitjKyIiPT09Yz8rYzpOLnRlc3QoYyk/bi5wYXJzZUpTT04oYyk6Y31jYXRjaChlKXt9bi5kYXRhKGEsYixjKX1lbHNlIGM9dm9pZCAwOwp9cmV0dXJuIGN9ZnVuY3Rpb24gUShhKXt2YXIgYjtmb3IoYiBpbiBhKWlmKCgiZGF0YSIhPT1ifHwhbi5pc0VtcHR5T2JqZWN0KGFbYl0pKSYmInRvSlNPTiIhPT1iKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIFIoYSxiLGQsZSl7aWYoTShhKSl7dmFyIGYsZyxoPW4uZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP24uY2FjaGU6YSxrPWk/YVtoXTphW2hdJiZoO2lmKGsmJmpba10mJihlfHxqW2tdLmRhdGEpfHx2b2lkIDAhPT1kfHwic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGt8fChrPWk/YVtoXT1jLnBvcCgpfHxuLmd1aWQrKzpoKSxqW2tdfHwoaltrXT1pP3t9Ont0b0pTT046bi5ub29wfSksIm9iamVjdCIhPXR5cGVvZiBiJiYiZnVuY3Rpb24iIT10eXBlb2YgYnx8KGU/altrXT1uLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1uLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbi5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbi5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFMoYSxiLGMpe2lmKE0oYSkpe3ZhciBkLGUsZj1hLm5vZGVUeXBlLGc9Zj9uLmNhY2hlOmEsaD1mP2Fbbi5leHBhbmRvXTpuLmV4cGFuZG87aWYoZ1toXSl7aWYoYiYmKGQ9Yz9nW2hdOmdbaF0uZGF0YSkpe24uaXNBcnJheShiKT9iPWIuY29uY2F0KG4ubWFwKGIsbi5jYW1lbENhc2UpKTpiIGluIGQ/Yj1bYl06KGI9bi5jYW1lbENhc2UoYiksYj1iIGluIGQ/W2JdOmIuc3BsaXQoIiAiKSksZT1iLmxlbmd0aDt3aGlsZShlLS0pZGVsZXRlIGRbYltlXV07aWYoYz8hUShkKTohbi5pc0VtcHR5T2JqZWN0KGQpKXJldHVybn0oY3x8KGRlbGV0ZSBnW2hdLmRhdGEsUShnW2hdKSkpJiYoZj9uLmNsZWFuRGF0YShbYV0sITApOmwuZGVsZXRlRXhwYW5kb3x8ZyE9Zy53aW5kb3c/ZGVsZXRlIGdbaF06Z1toXT12b2lkIDApfX19bi5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP24uY2FjaGVbYVtuLmV4cGFuZG9dXTphW24uZXhwYW5kb10sISFhJiYhUShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFIoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFMoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBSKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUyhhLGIsITApfX0pLG4uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bi5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbi5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW4uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLFAoZixkLGVbZF0pKSk7bi5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRhdGEodGhpcyxhLGIpfSk6Zj9QKGYsYSxuLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1uLl9kYXRhKGEsYiksYyYmKCFkfHxuLmlzQXJyYXkoYyk/ZD1uLl9kYXRhKGEsYixuLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW4ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bi5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXtuLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbi5fZGF0YShhLGMpfHxuLl9kYXRhKGEsYyx7ZW1wdHk6bi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bi5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbi5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxuLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bi5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1uLnF1ZXVlKHRoaXMsYSxiKTtuLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm4uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe24uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1uLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW4uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSksZnVuY3Rpb24oKXt2YXIgYTtsLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxlO3JldHVybiBjPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQoYiksInVuZGVmaW5lZCIhPXR5cGVvZiBiLnN0eWxlLnpvb20mJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoZC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChlKSxhKTp2b2lkIDB9fSgpO3ZhciBUPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLFU9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK1QrIikoW2EteiVdKikkIiwiaSIpLFY9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxXPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9Ynx8YSwibm9uZSI9PT1uLmNzcyhhLCJkaXNwbGF5Iil8fCFuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKX07ZnVuY3Rpb24gWChhLGIsYyxkKXt2YXIgZSxmPTEsZz0yMCxoPWQ/ZnVuY3Rpb24oKXtyZXR1cm4gZC5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gbi5jc3MoYSxiLCIiKX0saT1oKCksaj1jJiZjWzNdfHwobi5jc3NOdW1iZXJbYl0/IiI6InB4Iiksaz0obi5jc3NOdW1iZXJbYl18fCJweCIhPT1qJiYraSkmJlUuZXhlYyhuLmNzcyhhLGIpKTtpZihrJiZrWzNdIT09ail7aj1qfHxrWzNdLGM9Y3x8W10saz0raXx8MTtkbyBmPWZ8fCIuNSIsay89ZixuLnN0eWxlKGEsYixrK2opO3doaWxlKGYhPT0oZj1oKCkvaSkmJjEhPT1mJiYtLWcpfXJldHVybiBjJiYoaz0ra3x8K2l8fDAsZT1jWzFdP2srKGNbMV0rMSkqY1syXTorY1syXSxkJiYoZC51bml0PWosZC5zdGFydD1rLGQuZW5kPWUpKSxlfXZhciBZPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1uLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYylZKGEsYixoLGNbaF0sITAsZixnKX1lbHNlIGlmKHZvaWQgMCE9PWQmJihlPSEwLG4uaXNGdW5jdGlvbihkKXx8KGc9ITApLGomJihnPyhiLmNhbGwoYSxkKSxiPW51bGwpOihqPWIsYj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGouY2FsbChuKGEpLGMpfSkpLGIpKWZvcig7aT5oO2grKyliKGFbaF0sYyxnP2Q6ZC5jYWxsKGFbaF0saCxiKGFbaF0sYykpKTtyZXR1cm4gZT9hOmo/Yi5jYWxsKGEpOmk/YihhWzBdLGMpOmZ9LFo9L14oPzpjaGVja2JveHxyYWRpbykkL2ksJD0vPChbXHc6LV0rKS8sXz0vXiR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksYWE9L15ccysvLGJhPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZGlhbG9nfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1haW58bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHBpY3R1cmV8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRlbXBsYXRlfHRpbWV8dmlkZW8iO2Z1bmN0aW9uIGNhKGEpe3ZhciBiPWJhLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfSFmdW5jdGlvbigpe3ZhciBhPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksYj1kLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxjPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTthLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixsLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1hLmZpcnN0Q2hpbGQubm9kZVR5cGUsbC50Ym9keT0hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsbC5odG1sU2VyaWFsaXplPSEhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxsLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09ZC5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxjLnR5cGU9ImNoZWNrYm94IixjLmNoZWNrZWQ9ITAsYi5hcHBlbmRDaGlsZChjKSxsLmFwcGVuZENoZWNrZWQ9Yy5jaGVja2VkLGEuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixsLm5vQ2xvbmVDaGVja2VkPSEhYS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYi5hcHBlbmRDaGlsZChhKSxjPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxjLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksYy5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksYy5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksYS5hcHBlbmRDaGlsZChjKSxsLmNoZWNrQ2xvbmU9YS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsbC5ub0Nsb25lRXZlbnQ9ISFhLmFkZEV2ZW50TGlzdGVuZXIsYVtuLmV4cGFuZG9dPTEsbC5hdHRyaWJ1dGVzPSFhLmdldEF0dHJpYnV0ZShuLmV4cGFuZG8pfSgpO3ZhciBkYT17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLHBhcmFtOlsxLCI8b2JqZWN0PiIsIjwvb2JqZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6bC5odG1sU2VyaWFsaXplP1swLCIiLCIiXTpbMSwiWDxkaXY+IiwiPC9kaXY+Il19O2RhLm9wdGdyb3VwPWRhLm9wdGlvbixkYS50Ym9keT1kYS50Zm9vdD1kYS5jb2xncm91cD1kYS5jYXB0aW9uPWRhLnRoZWFkLGRhLnRoPWRhLnRkO2Z1bmN0aW9uIGVhKGEsYil7dmFyIGMsZCxlPTAsZj0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShifHwiKiIpOiJ1bmRlZmluZWQiIT10eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsP2EucXVlcnlTZWxlY3RvckFsbChifHwiKiIpOnZvaWQgMDtpZighZilmb3IoZj1bXSxjPWEuY2hpbGROb2Rlc3x8YTtudWxsIT0oZD1jW2VdKTtlKyspIWJ8fG4ubm9kZU5hbWUoZCxiKT9mLnB1c2goZCk6bi5tZXJnZShmLGVhKGQsYikpO3JldHVybiB2b2lkIDA9PT1ifHxiJiZuLm5vZGVOYW1lKGEsYik/bi5tZXJnZShbYV0sZik6Zn1mdW5jdGlvbiBmYShhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW4uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG4uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX12YXIgZ2E9Lzx8JiM/XHcrOy8saGE9Lzx0Ym9keS9pO2Z1bmN0aW9uIGlhKGEpe1oudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIGphKGEsYixjLGQsZSl7Zm9yKHZhciBmLGcsaCxpLGosayxtLG89YS5sZW5ndGgscD1jYShiKSxxPVtdLHI9MDtvPnI7cisrKWlmKGc9YVtyXSxnfHwwPT09ZylpZigib2JqZWN0Ij09PW4udHlwZShnKSluLm1lcmdlKHEsZy5ub2RlVHlwZT9bZ106Zyk7ZWxzZSBpZihnYS50ZXN0KGcpKXtpPWl8fHAuYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaj0oJC5leGVjKGcpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLG09ZGFbal18fGRhLl9kZWZhdWx0LGkuaW5uZXJIVE1MPW1bMV0rbi5odG1sUHJlZmlsdGVyKGcpK21bMl0sZj1tWzBdO3doaWxlKGYtLSlpPWkubGFzdENoaWxkO2lmKCFsLmxlYWRpbmdXaGl0ZXNwYWNlJiZhYS50ZXN0KGcpJiZxLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShhYS5leGVjKGcpWzBdKSksIWwudGJvZHkpe2c9InRhYmxlIiE9PWp8fGhhLnRlc3QoZyk/Ijx0YWJsZT4iIT09bVsxXXx8aGEudGVzdChnKT8wOmk6aS5maXJzdENoaWxkLGY9ZyYmZy5jaGlsZE5vZGVzLmxlbmd0aDt3aGlsZShmLS0pbi5ub2RlTmFtZShrPWcuY2hpbGROb2Rlc1tmXSwidGJvZHkiKSYmIWsuY2hpbGROb2Rlcy5sZW5ndGgmJmcucmVtb3ZlQ2hpbGQoayl9bi5tZXJnZShxLGkuY2hpbGROb2RlcyksaS50ZXh0Q29udGVudD0iIjt3aGlsZShpLmZpcnN0Q2hpbGQpaS5yZW1vdmVDaGlsZChpLmZpcnN0Q2hpbGQpO2k9cC5sYXN0Q2hpbGR9ZWxzZSBxLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShnKSk7aSYmcC5yZW1vdmVDaGlsZChpKSxsLmFwcGVuZENoZWNrZWR8fG4uZ3JlcChlYShxLCJpbnB1dCIpLGlhKSxyPTA7d2hpbGUoZz1xW3IrK10paWYoZCYmbi5pbkFycmF5KGcsZCk+LTEpZSYmZS5wdXNoKGcpO2Vsc2UgaWYoaD1uLmNvbnRhaW5zKGcub3duZXJEb2N1bWVudCxnKSxpPWVhKHAuYXBwZW5kQ2hpbGQoZyksInNjcmlwdCIpLGgmJmZhKGkpLGMpe2Y9MDt3aGlsZShnPWlbZisrXSlfLnRlc3QoZy50eXBlfHwiIikmJmMucHVzaChnKX1yZXR1cm4gaT1udWxsLHB9IWZ1bmN0aW9uKCl7dmFyIGIsYyxlPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zm9yKGIgaW57c3VibWl0OiEwLGNoYW5nZTohMCxmb2N1c2luOiEwfSljPSJvbiIrYiwobFtiXT1jIGluIGEpfHwoZS5zZXRBdHRyaWJ1dGUoYywidCIpLGxbYl09ZS5hdHRyaWJ1dGVzW2NdLmV4cGFuZG89PT0hMSk7ZT1udWxsfSgpO3ZhciBrYT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksbGE9L15rZXkvLG1hPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxuYT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sb2E9L14oW14uXSopKD86XC4oLispfCkvO2Z1bmN0aW9uIHBhKCl7cmV0dXJuITB9ZnVuY3Rpb24gcWEoKXtyZXR1cm4hMX1mdW5jdGlvbiByYSgpe3RyeXtyZXR1cm4gZC5hY3RpdmVFbGVtZW50fWNhdGNoKGEpe319ZnVuY3Rpb24gc2EoYSxiLGMsZCxlLGYpe3ZhciBnLGg7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXsic3RyaW5nIiE9dHlwZW9mIGMmJihkPWR8fGMsYz12b2lkIDApO2ZvcihoIGluIGIpc2EoYSxoLGMsZCxiW2hdLGYpO3JldHVybiBhfWlmKG51bGw9PWQmJm51bGw9PWU/KGU9YyxkPWM9dm9pZCAwKTpudWxsPT1lJiYoInN0cmluZyI9PXR5cGVvZiBjPyhlPWQsZD12b2lkIDApOihlPWQsZD1jLGM9dm9pZCAwKSksZT09PSExKWU9cWE7ZWxzZSBpZighZSlyZXR1cm4gYTtyZXR1cm4gMT09PWYmJihnPWUsZT1mdW5jdGlvbihhKXtyZXR1cm4gbigpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1uLmd1aWQrKykpLGEuZWFjaChmdW5jdGlvbigpe24uZXZlbnQuYWRkKHRoaXMsYixlLGQsYyl9KX1uLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxvLHAscSxyPW4uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW4uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2Ygbnx8YSYmbi5ldmVudC50cmlnZ2VyZWQ9PT1hLnR5cGU/dm9pZCAwOm4uZXZlbnQuZGlzcGF0Y2guYXBwbHkoay5lbGVtLGFyZ3VtZW50cyl9LGsuZWxlbT1hKSxiPShifHwiIikubWF0Y2goRyl8fFsiIl0saD1iLmxlbmd0aDt3aGlsZShoLS0pZj1vYS5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW4uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm4uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChtPWdbb10pfHwobT1nW29dPVtdLG0uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP20uc3BsaWNlKG0uZGVsZWdhdGVDb3VudCsrLDAsbCk6bS5wdXNoKGwpLG4uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG8scCxxLHI9bi5oYXNEYXRhKGEpJiZuLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEcpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9b2EuZXhlYyhiW2pdKXx8W10sbz1xPWhbMV0scD0oaFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLG8pe2w9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShkP2wuZGVsZWdhdGVUeXBlOmwuYmluZFR5cGUpfHxvLG09a1tvXXx8W10saD1oWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitwLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGk9Zj1tLmxlbmd0aDt3aGlsZShmLS0pZz1tW2ZdLCFlJiZxIT09Zy5vcmlnVHlwZXx8YyYmYy5ndWlkIT09Zy5ndWlkfHxoJiYhaC50ZXN0KGcubmFtZXNwYWNlKXx8ZCYmZCE9PWcuc2VsZWN0b3ImJigiKioiIT09ZHx8IWcuc2VsZWN0b3IpfHwobS5zcGxpY2UoZiwxKSxnLnNlbGVjdG9yJiZtLmRlbGVnYXRlQ291bnQtLSxsLnJlbW92ZSYmbC5yZW1vdmUuY2FsbChhLGcpKTtpJiYhbS5sZW5ndGgmJihsLnRlYXJkb3duJiZsLnRlYXJkb3duLmNhbGwoYSxwLHIuaGFuZGxlKSE9PSExfHxuLnJlbW92ZUV2ZW50KGEsbyxyLmhhbmRsZSksZGVsZXRlIGtbb10pfWVsc2UgZm9yKG8gaW4gayluLmV2ZW50LnJlbW92ZShhLG8rYltqXSxjLGQsITApO24uaXNFbXB0eU9iamVjdChrKSYmKGRlbGV0ZSByLmhhbmRsZSxuLl9yZW1vdmVEYXRhKGEsImV2ZW50cyIpKX19LHRyaWdnZXI6ZnVuY3Rpb24oYixjLGUsZil7dmFyIGcsaCxpLGosbCxtLG8scD1bZXx8ZF0scT1rLmNhbGwoYiwidHlwZSIpP2IudHlwZTpiLHI9ay5jYWxsKGIsIm5hbWVzcGFjZSIpP2IubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYoaT1tPWU9ZXx8ZCwzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJiFuYS50ZXN0KHErbi5ldmVudC50cmlnZ2VyZWQpJiYocS5pbmRleE9mKCIuIik+LTEmJihyPXEuc3BsaXQoIi4iKSxxPXIuc2hpZnQoKSxyLnNvcnQoKSksaD1xLmluZGV4T2YoIjoiKTwwJiYib24iK3EsYj1iW24uZXhwYW5kb10/YjpuZXcgbi5FdmVudChxLCJvYmplY3QiPT10eXBlb2YgYiYmYiksYi5pc1RyaWdnZXI9Zj8yOjMsYi5uYW1lc3BhY2U9ci5qb2luKCIuIiksYi5ybmFtZXNwYWNlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Iuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1lKSxjPW51bGw9PWM/W2JdOm4ubWFrZUFycmF5KGMsW2JdKSxsPW4uZXZlbnQuc3BlY2lhbFtxXXx8e30sZnx8IWwudHJpZ2dlcnx8bC50cmlnZ2VyLmFwcGx5KGUsYykhPT0hMSkpe2lmKCFmJiYhbC5ub0J1YmJsZSYmIW4uaXNXaW5kb3coZSkpe2ZvcihqPWwuZGVsZWdhdGVUeXBlfHxxLG5hLnRlc3QoaitxKXx8KGk9aS5wYXJlbnROb2RlKTtpO2k9aS5wYXJlbnROb2RlKXAucHVzaChpKSxtPWk7bT09PShlLm93bmVyRG9jdW1lbnR8fGQpJiZwLnB1c2gobS5kZWZhdWx0Vmlld3x8bS5wYXJlbnRXaW5kb3d8fGEpfW89MDt3aGlsZSgoaT1wW28rK10pJiYhYi5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWIudHlwZT1vPjE/ajpsLmJpbmRUeXBlfHxxLGc9KG4uX2RhdGEoaSwiZXZlbnRzIil8fHt9KVtiLnR5cGVdJiZuLl9kYXRhKGksImhhbmRsZSIpLGcmJmcuYXBwbHkoaSxjKSxnPWgmJmlbaF0sZyYmZy5hcHBseSYmTShpKSYmKGIucmVzdWx0PWcuYXBwbHkoaSxjKSxiLnJlc3VsdD09PSExJiZiLnByZXZlbnREZWZhdWx0KCkpO2lmKGIudHlwZT1xLCFmJiYhYi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmKCFsLl9kZWZhdWx0fHxsLl9kZWZhdWx0LmFwcGx5KHAucG9wKCksYyk9PT0hMSkmJk0oZSkmJmgmJmVbcV0mJiFuLmlzV2luZG93KGUpKXttPWVbaF0sbSYmKGVbaF09bnVsbCksbi5ldmVudC50cmlnZ2VyZWQ9cTt0cnl7ZVtxXSgpfWNhdGNoKHMpe31uLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbSYmKGVbaF09bSl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1uLmV2ZW50LmZpeChhKTt2YXIgYixjLGQsZixnLGg9W10saT1lLmNhbGwoYXJndW1lbnRzKSxqPShuLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1uLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1uLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGM9MDt3aGlsZSgoZz1mLmhhbmRsZXJzW2MrK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKWEucm5hbWVzcGFjZSYmIWEucm5hbWVzcGFjZS50ZXN0KGcubmFtZXNwYWNlKXx8KGEuaGFuZGxlT2JqPWcsYS5kYXRhPWcuZGF0YSxkPSgobi5ldmVudC5zcGVjaWFsW2cub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxnLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1kJiYoYS5yZXN1bHQ9ZCk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoImNsaWNrIiE9PWEudHlwZXx8aXNOYU4oYS5idXR0b24pfHxhLmJ1dHRvbjwxKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZD1bXSxjPTA7aD5jO2MrKylmPWJbY10sZT1mLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1kW2VdJiYoZFtlXT1mLm5lZWRzQ29udGV4dD9uKGUsdGhpcykuaW5kZXgoaSk+LTE6bi5maW5kKGUsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxkW2VdJiZkLnB1c2goZik7ZC5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmR9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW24uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxlLGY9YS50eXBlLGc9YSxoPXRoaXMuZml4SG9va3NbZl07aHx8KHRoaXMuZml4SG9va3NbZl09aD1tYS50ZXN0KGYpP3RoaXMubW91c2VIb29rczpsYS50ZXN0KGYpP3RoaXMua2V5SG9va3M6e30pLGU9aC5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChoLnByb3BzKTp0aGlzLnByb3BzLGE9bmV3IG4uRXZlbnQoZyksYj1lLmxlbmd0aDt3aGlsZShiLS0pYz1lW2JdLGFbY109Z1tjXTtyZXR1cm4gYS50YXJnZXR8fChhLnRhcmdldD1nLnNyY0VsZW1lbnR8fGQpLDM9PT1hLnRhcmdldC5ub2RlVHlwZSYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT0hIWEubWV0YUtleSxoLmZpbHRlcj9oLmZpbHRlcihhLGcpOmF9LHByb3BzOiJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBkZXRhaWwgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGc9Yi5idXR0b24saD1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihlPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fGQsZj1lLmRvY3VtZW50RWxlbWVudCxjPWUuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZiYmZi5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShmJiZmLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGYmJmYuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGYmJmYuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmgmJihhLnJlbGF0ZWRUYXJnZXQ9aD09PWEudGFyZ2V0P2IudG9FbGVtZW50OmgpLGEud2hpY2h8fHZvaWQgMD09PWd8fChhLndoaWNoPTEmZz8xOjImZz8zOjQmZz8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09cmEoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1yYSgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBuLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbi5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPW4uZXh0ZW5kKG5ldyBuLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMH0pO24uZXZlbnQudHJpZ2dlcihkLG51bGwsYiksZC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbi5yZW1vdmVFdmVudD1kLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYyl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgYVtkXSYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbi5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbi5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/cGE6cWEpOnRoaXMudHlwZT1hLGImJm4uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG4ubm93KCksdm9pZCh0aGlzW24uZXhwYW5kb109ITApKTpuZXcgbi5FdmVudChhLGIpfSxuLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6bi5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6cWEsaXNQcm9wYWdhdGlvblN0b3BwZWQ6cWEsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6cWEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9cGEsYSYmKGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1wYSxhJiYhdGhpcy5pc1NpbXVsYXRlZCYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9cGEsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG4uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXtuLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybiBlJiYoZT09PWR8fG4uY29udGFpbnMoZCxlKSl8fChhLnR5cGU9Zi5vcmlnVHlwZSxjPWYuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWIpLGN9fX0pLGwuc3VibWl0fHwobi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gbi5ub2RlTmFtZSh0aGlzLCJmb3JtIik/ITE6dm9pZCBuLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGM9bi5ub2RlTmFtZShiLCJpbnB1dCIpfHxuLm5vZGVOYW1lKGIsImJ1dHRvbiIpP24ucHJvcChiLCJmb3JtIik6dm9pZCAwO2MmJiFuLl9kYXRhKGMsInN1Ym1pdCIpJiYobi5ldmVudC5hZGQoYywic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdEJ1YmJsZT0hMH0pLG4uX2RhdGEoYywic3VibWl0IiwhMCkpfSl9LHBvc3REaXNwYXRjaDpmdW5jdGlvbihhKXthLl9zdWJtaXRCdWJibGUmJihkZWxldGUgYS5fc3VibWl0QnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZuLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG4ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbi5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxsLmNoYW5nZXx8KG4uZXZlbnQuc3BlY2lhbC5jaGFuZ2U9e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIGthLnRlc3QodGhpcy5ub2RlTmFtZSk/KCJjaGVja2JveCIhPT10aGlzLnR5cGUmJiJyYWRpbyIhPT10aGlzLnR5cGV8fChuLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXsiY2hlY2tlZCI9PT1hLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lJiYodGhpcy5fanVzdENoYW5nZWQ9ITApfSksbi5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdENoYW5nZWQmJiFhLmlzVHJpZ2dlciYmKHRoaXMuX2p1c3RDaGFuZ2VkPSExKSxuLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSl9KSksITEpOnZvaWQgbi5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7a2EudGVzdChiLm5vZGVOYW1lKSYmIW4uX2RhdGEoYiwiY2hhbmdlIikmJihuLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7IXRoaXMucGFyZW50Tm9kZXx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fG4uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEpfSksbi5fZGF0YShiLCJjaGFuZ2UiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBuLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFrYS50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLGwuZm9jdXNpbnx8bi5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe24uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxuLmV2ZW50LmZpeChhKSl9O24uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1uLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbi5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW4uX2RhdGEoZCxiKS0xO2U/bi5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG4uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG4uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gc2EodGhpcyxhLGIsYyxkKX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBzYSh0aGlzLGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixuKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuIGIhPT0hMSYmImZ1bmN0aW9uIiE9dHlwZW9mIGJ8fChjPWIsYj12b2lkIDApLGM9PT0hMSYmKGM9cWEpLHRoaXMuZWFjaChmdW5jdGlvbigpe24uZXZlbnQucmVtb3ZlKHRoaXMsYSxjLGIpfSl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXNbMF07cmV0dXJuIGM/bi5ldmVudC50cmlnZ2VyKGEsYixjLCEwKTp2b2lkIDB9fSk7dmFyIHRhPS8galF1ZXJ5XGQrPSIoPzpudWxsfFxkKykiL2csdWE9bmV3IFJlZ0V4cCgiPCg/OiIrYmErIilbXFxzLz5dIiwiaSIpLHZhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzotXSspW14+XSopXC8+L2dpLHdhPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLHhhPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLHlhPS9edHJ1ZVwvKC4qKS8semE9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLEFhPWNhKGQpLEJhPUFhLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpO2Z1bmN0aW9uIENhKGEsYil7cmV0dXJuIG4ubm9kZU5hbWUoYSwidGFibGUiKSYmbi5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiBEYShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bi5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24gRWEoYSl7dmFyIGI9eWEuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiBGYShhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZuLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW4uX2RhdGEoYSksZz1uLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyluLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW4uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBHYShhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWwubm9DbG9uZUV2ZW50JiZiW24uZXhwYW5kb10pe2U9bi5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyluLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobi5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oRGEoYikudGV4dD1hLnRleHQsRWEoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGwuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFuLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmWi50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOiJpbnB1dCIhPT1jJiYidGV4dGFyZWEiIT09Y3x8KGIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlKX19ZnVuY3Rpb24gSGEoYSxiLGMsZCl7Yj1mLmFwcGx5KFtdLGIpO3ZhciBlLGcsaCxpLGosayxtPTAsbz1hLmxlbmd0aCxwPW8tMSxxPWJbMF0scj1uLmlzRnVuY3Rpb24ocSk7aWYocnx8bz4xJiYic3RyaW5nIj09dHlwZW9mIHEmJiFsLmNoZWNrQ2xvbmUmJnhhLnRlc3QocSkpcmV0dXJuIGEuZWFjaChmdW5jdGlvbihlKXt2YXIgZj1hLmVxKGUpO3ImJihiWzBdPXEuY2FsbCh0aGlzLGUsZi5odG1sKCkpKSxIYShmLGIsYyxkKX0pO2lmKG8mJihrPWphKGIsYVswXS5vd25lckRvY3VtZW50LCExLGEsZCksZT1rLmZpcnN0Q2hpbGQsMT09PWsuY2hpbGROb2Rlcy5sZW5ndGgmJihrPWUpLGV8fGQpKXtmb3IoaT1uLm1hcChlYShrLCJzY3JpcHQiKSxEYSksaD1pLmxlbmd0aDtvPm07bSsrKWc9ayxtIT09cCYmKGc9bi5jbG9uZShnLCEwLCEwKSxoJiZuLm1lcmdlKGksZWEoZywic2NyaXB0IikpKSxjLmNhbGwoYVttXSxnLG0pO2lmKGgpZm9yKGo9aVtpLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG4ubWFwKGksRWEpLG09MDtoPm07bSsrKWc9aVttXSxfLnRlc3QoZy50eXBlfHwiIikmJiFuLl9kYXRhKGcsImdsb2JhbEV2YWwiKSYmbi5jb250YWlucyhqLGcpJiYoZy5zcmM/bi5fZXZhbFVybCYmbi5fZXZhbFVybChnLnNyYyk6bi5nbG9iYWxFdmFsKChnLnRleHR8fGcudGV4dENvbnRlbnR8fGcuaW5uZXJIVE1MfHwiIikucmVwbGFjZSh6YSwiIikpKTtrPWU9bnVsbH1yZXR1cm4gYX1mdW5jdGlvbiBJYShhLGIsYyl7Zm9yKHZhciBkLGU9Yj9uLmZpbHRlcihiLGEpOmEsZj0wO251bGwhPShkPWVbZl0pO2YrKyljfHwxIT09ZC5ub2RlVHlwZXx8bi5jbGVhbkRhdGEoZWEoZCkpLGQucGFyZW50Tm9kZSYmKGMmJm4uY29udGFpbnMoZC5vd25lckRvY3VtZW50LGQpJiZmYShlYShkLCJzY3JpcHQiKSksZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpKTtyZXR1cm4gYX1uLmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKHZhLCI8JDE+PC8kMj4iKX0sY2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1uLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihsLmh0bWw1Q2xvbmV8fG4uaXNYTUxEb2MoYSl8fCF1YS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KEJhLmlubmVySFRNTD1hLm91dGVySFRNTCxCYS5yZW1vdmVDaGlsZChmPUJhLmZpcnN0Q2hpbGQpKSwhKGwubm9DbG9uZUV2ZW50JiZsLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxuLmlzWE1MRG9jKGEpKSlmb3IoZD1lYShmKSxoPWVhKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmR2EoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8ZWEoYSksZD1kfHxlYShmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUZhKGUsZFtnXSk7ZWxzZSBGYShhLGYpO3JldHVybiBkPWVhKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJmZhKGQsIWkmJmVhKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGNsZWFuRGF0YTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZCxlLGYsZyxoPTAsaT1uLmV4cGFuZG8saj1uLmNhY2hlLGs9bC5hdHRyaWJ1dGVzLG09bi5ldmVudC5zcGVjaWFsO251bGwhPShkPWFbaF0pO2grKylpZigoYnx8TShkKSkmJihmPWRbaV0sZz1mJiZqW2ZdKSl7aWYoZy5ldmVudHMpZm9yKGUgaW4gZy5ldmVudHMpbVtlXT9uLmV2ZW50LnJlbW92ZShkLGUpOm4ucmVtb3ZlRXZlbnQoZCxlLGcuaGFuZGxlKTtqW2ZdJiYoZGVsZXRlIGpbZl0sa3x8InVuZGVmaW5lZCI9PXR5cGVvZiBkLnJlbW92ZUF0dHJpYnV0ZT9kW2ldPXZvaWQgMDpkLnJlbW92ZUF0dHJpYnV0ZShpKSxjLnB1c2goZikpfX19KSxuLmZuLmV4dGVuZCh7ZG9tTWFuaXA6SGEsZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiBJYSh0aGlzLGEsITApfSxyZW1vdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIElhKHRoaXMsYSl9LHRleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9uLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHxkKS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIEhhKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj1DYSh0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPUNhKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm4uY2xlYW5EYXRhKGVhKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbi5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbi5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UodGEsIiIpOnZvaWQgMDtpZigic3RyaW5nIj09dHlwZW9mIGEmJiF3YS50ZXN0KGEpJiYobC5odG1sU2VyaWFsaXplfHwhdWEudGVzdChhKSkmJihsLmxlYWRpbmdXaGl0ZXNwYWNlfHwhYWEudGVzdChhKSkmJiFkYVsoJC5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1uLmh0bWxQcmVmaWx0ZXIoYSk7dHJ5e2Zvcig7ZD5jO2MrKyliPXRoaXNbY118fHt9LDE9PT1iLm5vZGVUeXBlJiYobi5jbGVhbkRhdGEoZWEoYiwhMSkpLGIuaW5uZXJIVE1MPWEpO2I9MH1jYXRjaChlKXt9fWImJnRoaXMuZW1wdHkoKS5hcHBlbmQoYSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgYT1bXTtyZXR1cm4gSGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5wYXJlbnROb2RlO24uaW5BcnJheSh0aGlzLGEpPDAmJihuLmNsZWFuRGF0YShlYSh0aGlzKSksYyYmYy5yZXBsYWNlQ2hpbGQoYix0aGlzKSl9LGEpfX0pLG4uZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhKXtmb3IodmFyIGMsZD0wLGU9W10sZj1uKGEpLGg9Zi5sZW5ndGgtMTtoPj1kO2QrKyljPWQ9PT1oP3RoaXM6dGhpcy5jbG9uZSghMCksbihmW2RdKVtiXShjKSxnLmFwcGx5KGUsYy5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBKYSxLYT17SFRNTDoiYmxvY2siLEJPRFk6ImJsb2NrIn07ZnVuY3Rpb24gTGEoYSxiKXt2YXIgYz1uKGIuY3JlYXRlRWxlbWVudChhKSkuYXBwZW5kVG8oYi5ib2R5KSxkPW4uY3NzKGNbMF0sImRpc3BsYXkiKTtyZXR1cm4gYy5kZXRhY2goKSxkfWZ1bmN0aW9uIE1hKGEpe3ZhciBiPWQsYz1LYVthXTtyZXR1cm4gY3x8KGM9TGEoYSxiKSwibm9uZSIhPT1jJiZjfHwoSmE9KEphfHxuKCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+IikpLmFwcGVuZFRvKGIuZG9jdW1lbnRFbGVtZW50KSxiPShKYVswXS5jb250ZW50V2luZG93fHxKYVswXS5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGIud3JpdGUoKSxiLmNsb3NlKCksYz1MYShhLGIpLEphLmRldGFjaCgpKSxLYVthXT1jKSxjfXZhciBOYT0vXm1hcmdpbi8sT2E9bmV3IFJlZ0V4cCgiXigiK1QrIikoPyFweClbYS16JV0rJCIsImkiKSxQYT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmLGc9e307Zm9yKGYgaW4gYilnW2ZdPWEuc3R5bGVbZl0sYS5zdHlsZVtmXT1iW2ZdO2U9Yy5hcHBseShhLGR8fFtdKTtmb3IoZiBpbiBiKWEuc3R5bGVbZl09Z1tmXTtyZXR1cm4gZX0sUWE9ZC5kb2N1bWVudEVsZW1lbnQ7IWZ1bmN0aW9uKCl7dmFyIGIsYyxlLGYsZyxoLGk9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxqPWQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYoai5zdHlsZSl7ai5zdHlsZS5jc3NUZXh0PSJmbG9hdDpsZWZ0O29wYWNpdHk6LjUiLGwub3BhY2l0eT0iMC41Ij09PWouc3R5bGUub3BhY2l0eSxsLmNzc0Zsb2F0PSEhai5zdHlsZS5jc3NGbG9hdCxqLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsai5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLGwuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1qLnN0eWxlLmJhY2tncm91bmRDbGlwLGk9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKSxpLnN0eWxlLmNzc1RleHQ9ImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7cGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlIixqLmlubmVySFRNTD0iIixpLmFwcGVuZENoaWxkKGopLGwuYm94U2l6aW5nPSIiPT09ai5zdHlsZS5ib3hTaXppbmd8fCIiPT09ai5zdHlsZS5Nb3pCb3hTaXppbmd8fCIiPT09ai5zdHlsZS5XZWJraXRCb3hTaXppbmcsbi5leHRlbmQobCx7cmVsaWFibGVIaWRkZW5PZmZzZXRzOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWImJmsoKSxmfSxib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksZX0scGl4ZWxNYXJnaW5SaWdodDpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksY30scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksYn0scmVsaWFibGVNYXJnaW5SaWdodDpmdW5jdGlvbigpe3JldHVybiBudWxsPT1iJiZrKCksZ30scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWImJmsoKSxofX0pO2Z1bmN0aW9uIGsoKXt2YXIgayxsLG09ZC5kb2N1bWVudEVsZW1lbnQ7bS5hcHBlbmRDaGlsZChpKSxqLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7dG9wOjElO3dpZHRoOjUwJSIsYj1lPWg9ITEsYz1nPSEwLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGw9YS5nZXRDb21wdXRlZFN0eWxlKGopLGI9IjElIiE9PShsfHx7fSkudG9wLGg9IjJweCI9PT0obHx8e30pLm1hcmdpbkxlZnQsZT0iNHB4Ij09PShsfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxqLnN0eWxlLm1hcmdpblJpZ2h0PSI1MCUiLGM9IjRweCI9PT0obHx8e21hcmdpblJpZ2h0OiI0cHgifSkubWFyZ2luUmlnaHQsaz1qLmFwcGVuZENoaWxkKGQuY3JlYXRlRWxlbWVudCgiZGl2IikpLGsuc3R5bGUuY3NzVGV4dD1qLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MCIsay5zdHlsZS5tYXJnaW5SaWdodD1rLnN0eWxlLndpZHRoPSIwIixqLnN0eWxlLndpZHRoPSIxcHgiLGc9IXBhcnNlRmxvYXQoKGEuZ2V0Q29tcHV0ZWRTdHlsZShrKXx8e30pLm1hcmdpblJpZ2h0KSxqLnJlbW92ZUNoaWxkKGspKSxqLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGY9MD09PWouZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgsZiYmKGouc3R5bGUuZGlzcGxheT0iIixqLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIsai5jaGlsZE5vZGVzWzBdLnN0eWxlLmJvcmRlckNvbGxhcHNlPSJzZXBhcmF0ZSIsaz1qLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLGtbMF0uc3R5bGUuY3NzVGV4dD0ibWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowO2Rpc3BsYXk6bm9uZSIsZj0wPT09a1swXS5vZmZzZXRIZWlnaHQsZiYmKGtbMF0uc3R5bGUuZGlzcGxheT0iIixrWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGY9MD09PWtbMF0ub2Zmc2V0SGVpZ2h0KSksbS5yZW1vdmVDaGlsZChpKX19fSgpO3ZhciBSYSxTYSxUYT0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhSYT1mdW5jdGlvbihiKXt2YXIgYz1iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuIGMmJmMub3BlbmVyfHwoYz1hKSxjLmdldENvbXB1dGVkU3R5bGUoYil9LFNhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8UmEoYSksZz1jP2MuZ2V0UHJvcGVydHlWYWx1ZShiKXx8Y1tiXTp2b2lkIDAsIiIhPT1nJiZ2b2lkIDAhPT1nfHxuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKXx8KGc9bi5zdHlsZShhLGIpKSxjJiYhbC5waXhlbE1hcmdpblJpZ2h0KCkmJk9hLnRlc3QoZykmJk5hLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9Ziksdm9pZCAwPT09Zz9nOmcrIiJ9KTpRYS5jdXJyZW50U3R5bGUmJihSYT1mdW5jdGlvbihhKXtyZXR1cm4gYS5jdXJyZW50U3R5bGV9LFNhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8UmEoYSksZz1jP2NbYl06dm9pZCAwLG51bGw9PWcmJmgmJmhbYl0mJihnPWhbYl0pLE9hLnRlc3QoZykmJiFUYS50ZXN0KGIpJiYoZD1oLmxlZnQsZT1hLnJ1bnRpbWVTdHlsZSxmPWUmJmUubGVmdCxmJiYoZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQpLGgubGVmdD0iZm9udFNpemUiPT09Yj8iMWVtIjpnLGc9aC5waXhlbExlZnQrInB4IixoLmxlZnQ9ZCxmJiYoZS5sZWZ0PWYpKSx2b2lkIDA9PT1nP2c6ZysiInx8ImF1dG8ifSk7ZnVuY3Rpb24gVWEoYSxiKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEoKT92b2lkIGRlbGV0ZSB0aGlzLmdldDoodGhpcy5nZXQ9YikuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19dmFyIFZhPS9hbHBoYVwoW14pXSpcKS9pLFdhPS9vcGFjaXR5XHMqPVxzKihbXildKikvaSxYYT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sWWE9bmV3IFJlZ0V4cCgiXigiK1QrIikoLiopJCIsImkiKSxaYT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sJGE9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9LF9hPVsiV2Via2l0IiwiTyIsIk1veiIsIm1zIl0sYWI9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZTtmdW5jdGlvbiBiYihhKXtpZihhIGluIGFiKXJldHVybiBhO3ZhciBiPWEuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYS5zbGljZSgxKSxjPV9hLmxlbmd0aDt3aGlsZShjLS0paWYoYT1fYVtjXStiLGEgaW4gYWIpcmV0dXJuIGF9ZnVuY3Rpb24gY2IoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bi5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlcoZCkmJihmW2ddPW4uX2RhdGEoZCwib2xkZGlzcGxheSIsTWEoZC5ub2RlTmFtZSkpKSk6KGU9VyhkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZuLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzpuLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIGRiKGEsYixjKXt2YXIgZD1ZYS5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIGViKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1uLmNzcyhhLGMrVltmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW4uY3NzKGEsInBhZGRpbmciK1ZbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW4uY3NzKGEsImJvcmRlciIrVltmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW4uY3NzKGEsInBhZGRpbmciK1ZbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW4uY3NzKGEsImJvcmRlciIrVltmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gZmIoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPVJhKGEpLGc9bC5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW4uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1TYShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLE9hLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYobC5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK2ViKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1uLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPVNhKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6bC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1uLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1uLmNzc1Byb3BzW2hdfHwobi5jc3NQcm9wc1toXT1iYihoKXx8aCksZz1uLmNzc0hvb2tzW2JdfHxuLmNzc0hvb2tzW2hdLHZvaWQgMD09PWMpcmV0dXJuIGcmJiJnZXQiaW4gZyYmdm9pZCAwIT09KGU9Zy5nZXQoYSwhMSxkKSk/ZTppW2JdO2lmKGY9dHlwZW9mIGMsInN0cmluZyI9PT1mJiYoZT1VLmV4ZWMoYykpJiZlWzFdJiYoYz1YKGEsYixlKSxmPSJudW1iZXIiKSxudWxsIT1jJiZjPT09YyYmKCJudW1iZXIiPT09ZiYmKGMrPWUmJmVbM118fChuLmNzc051bWJlcltoXT8iIjoicHgiKSksbC5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW4uY2FtZWxDYXNlKGIpO3JldHVybiBiPW4uY3NzUHJvcHNbaF18fChuLmNzc1Byb3BzW2hdPWJiKGgpfHxoKSxnPW4uY3NzSG9va3NbYl18fG4uY3NzSG9va3NbaF0sZyYmImdldCJpbiBnJiYoZj1nLmdldChhLCEwLGMpKSx2b2lkIDA9PT1mJiYoZj1TYShhLGIsZCkpLCJub3JtYWwiPT09ZiYmYiBpbiAkYSYmKGY9JGFbYl0pLCIiPT09Y3x8Yz8oZT1wYXJzZUZsb2F0KGYpLGM9PT0hMHx8aXNGaW5pdGUoZSk/ZXx8MDpmKTpmfX0pLG4uZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBjP1hhLnRlc3Qobi5jc3MoYSwiZGlzcGxheSIpKSYmMD09PWEub2Zmc2V0V2lkdGg/UGEoYSxaYSxmdW5jdGlvbigpe3JldHVybiBmYihhLGIsZCl9KTpmYihhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJlJhKGEpO3JldHVybiBkYihhLGMsZD9lYihhLGIsZCxsLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bi5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksbC5vcGFjaXR5fHwobi5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gV2EudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW4uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1uLnRyaW0oZi5yZXBsYWNlKFZhLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPVZhLnRlc3QoZik/Zi5yZXBsYWNlKFZhLGUpOmYrIiAiK2UpfX0pLG4uY3NzSG9va3MubWFyZ2luUmlnaHQ9VWEobC5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/UGEoYSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0sU2EsW2EsIm1hcmdpblJpZ2h0Il0pOnZvaWQgMH0pLG4uY3NzSG9va3MubWFyZ2luTGVmdD1VYShsLnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbihhLGIpe3JldHVybiBiPyhwYXJzZUZsb2F0KFNhKGEsIm1hcmdpbkxlZnQiKSl8fChuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKT9hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtUGEoYSx7Cm1hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSk6MCkpKyJweCI6dm9pZCAwfSksbi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXtmb3IodmFyIGQ9MCxlPXt9LGY9InN0cmluZyI9PXR5cGVvZiBjP2Muc3BsaXQoIiAiKTpbY107ND5kO2QrKyllW2ErVltkXStiXT1mW2RdfHxmW2QtMl18fGZbMF07cmV0dXJuIGV9fSxOYS50ZXN0KGEpfHwobi5jc3NIb29rc1thK2JdLnNldD1kYil9KSxuLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPXt9LGc9MDtpZihuLmlzQXJyYXkoYikpe2ZvcihkPVJhKGEpLGU9Yi5sZW5ndGg7ZT5nO2crKylmW2JbZ11dPW4uY3NzKGEsYltnXSwhMSxkKTtyZXR1cm4gZn1yZXR1cm4gdm9pZCAwIT09Yz9uLnN0eWxlKGEsYixjKTpuLmNzcyhhLGIpfSxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBjYih0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBjYih0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGE/YT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtXKHRoaXMpP24odGhpcykuc2hvdygpOm4odGhpcykuaGlkZSgpfSl9fSk7ZnVuY3Rpb24gZ2IoYSxiLGMsZCxlKXtyZXR1cm4gbmV3IGdiLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9bi5Ud2Vlbj1nYixnYi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmdiLGluaXQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD1jLHRoaXMuZWFzaW5nPWV8fG4uZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobi5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPWdiLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpnYi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1nYi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWI9bi5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9Yj1hLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpiK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLGMmJmMuc2V0P2Muc2V0KHRoaXMpOmdiLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LGdiLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1nYi5wcm90b3R5cGUsZ2IucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiAxIT09YS5lbGVtLm5vZGVUeXBlfHxudWxsIT1hLmVsZW1bYS5wcm9wXSYmbnVsbD09YS5lbGVtLnN0eWxlW2EucHJvcF0/YS5lbGVtW2EucHJvcF06KGI9bi5jc3MoYS5lbGVtLGEucHJvcCwiIiksYiYmImF1dG8iIT09Yj9iOjApfSxzZXQ6ZnVuY3Rpb24oYSl7bi5meC5zdGVwW2EucHJvcF0/bi5meC5zdGVwW2EucHJvcF0oYSk6MSE9PWEuZWxlbS5ub2RlVHlwZXx8bnVsbD09YS5lbGVtLnN0eWxlW24uY3NzUHJvcHNbYS5wcm9wXV0mJiFuLmNzc0hvb2tzW2EucHJvcF0/YS5lbGVtW2EucHJvcF09YS5ub3c6bi5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCl9fX0sZ2IucHJvcEhvb2tzLnNjcm9sbFRvcD1nYi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxuLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4uNS1NYXRoLmNvcyhhKk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LG4uZng9Z2IucHJvdG90eXBlLmluaXQsbi5meC5zdGVwPXt9O3ZhciBoYixpYixqYj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sa2I9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBsYigpe3JldHVybiBhLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtoYj12b2lkIDB9KSxoYj1uLm5vdygpfWZ1bmN0aW9uIG1iKGEsYil7dmFyIGMsZD17aGVpZ2h0OmF9LGU9MDtmb3IoYj1iPzE6MDs0PmU7ZSs9Mi1iKWM9VltlXSxkWyJtYXJnaW4iK2NdPWRbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihkLm9wYWNpdHk9ZC53aWR0aD1hKSxkfWZ1bmN0aW9uIG5iKGEsYixjKXtmb3IodmFyIGQsZT0ocWIudHdlZW5lcnNbYl18fFtdKS5jb25jYXQocWIudHdlZW5lcnNbIioiXSksZj0wLGc9ZS5sZW5ndGg7Zz5mO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gb2IoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbT10aGlzLG89e30scD1hLnN0eWxlLHE9YS5ub2RlVHlwZSYmVyhhKSxyPW4uX2RhdGEoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGg9bi5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWgudW5xdWV1ZWQmJihoLnVucXVldWVkPTAsaT1oLmVtcHR5LmZpcmUsaC5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7aC51bnF1ZXVlZHx8aSgpfSksaC51bnF1ZXVlZCsrLG0uYWx3YXlzKGZ1bmN0aW9uKCl7bS5hbHdheXMoZnVuY3Rpb24oKXtoLnVucXVldWVkLS0sbi5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8aC5lbXB0eS5maXJlKCl9KX0pKSwxPT09YS5ub2RlVHlwZSYmKCJoZWlnaHQiaW4gYnx8IndpZHRoImluIGIpJiYoYy5vdmVyZmxvdz1bcC5vdmVyZmxvdyxwLm92ZXJmbG93WCxwLm92ZXJmbG93WV0saj1uLmNzcyhhLCJkaXNwbGF5Iiksaz0ibm9uZSI9PT1qP24uX2RhdGEoYSwib2xkZGlzcGxheSIpfHxNYShhLm5vZGVOYW1lKTpqLCJpbmxpbmUiPT09ayYmIm5vbmUiPT09bi5jc3MoYSwiZmxvYXQiKSYmKGwuaW5saW5lQmxvY2tOZWVkc0xheW91dCYmImlubGluZSIhPT1NYShhLm5vZGVOYW1lKT9wLnpvb209MTpwLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYocC5vdmVyZmxvdz0iaGlkZGVuIixsLnNocmlua1dyYXBCbG9ja3MoKXx8bS5hbHdheXMoZnVuY3Rpb24oKXtwLm92ZXJmbG93PWMub3ZlcmZsb3dbMF0scC5vdmVyZmxvd1g9Yy5vdmVyZmxvd1sxXSxwLm92ZXJmbG93WT1jLm92ZXJmbG93WzJdfSkpO2ZvcihkIGluIGIpaWYoZT1iW2RdLGpiLmV4ZWMoZSkpe2lmKGRlbGV0ZSBiW2RdLGY9Znx8InRvZ2dsZSI9PT1lLGU9PT0ocT8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09ZXx8IXJ8fHZvaWQgMD09PXJbZF0pY29udGludWU7cT0hMH1vW2RdPXImJnJbZF18fG4uc3R5bGUoYSxkKX1lbHNlIGo9dm9pZCAwO2lmKG4uaXNFbXB0eU9iamVjdChvKSkiaW5saW5lIj09PSgibm9uZSI9PT1qP01hKGEubm9kZU5hbWUpOmopJiYocC5kaXNwbGF5PWopO2Vsc2V7cj8iaGlkZGVuImluIHImJihxPXIuaGlkZGVuKTpyPW4uX2RhdGEoYSwiZnhzaG93Iix7fSksZiYmKHIuaGlkZGVuPSFxKSxxP24oYSkuc2hvdygpOm0uZG9uZShmdW5jdGlvbigpe24oYSkuaGlkZSgpfSksbS5kb25lKGZ1bmN0aW9uKCl7dmFyIGI7bi5fcmVtb3ZlRGF0YShhLCJmeHNob3ciKTtmb3IoYiBpbiBvKW4uc3R5bGUoYSxiLG9bYl0pfSk7Zm9yKGQgaW4gbylnPW5iKHE/cltkXTowLGQsbSksZCBpbiByfHwocltkXT1nLnN0YXJ0LHEmJihnLmVuZD1nLnN0YXJ0LGcuc3RhcnQ9IndpZHRoIj09PWR8fCJoZWlnaHQiPT09ZD8xOjApKX19ZnVuY3Rpb24gcGIoYSxiKXt2YXIgYyxkLGUsZixnO2ZvcihjIGluIGEpaWYoZD1uLmNhbWVsQ2FzZShjKSxlPWJbZF0sZj1hW2NdLG4uaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9bi5jc3NIb29rc1tkXSxnJiYiZXhwYW5kImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX1mdW5jdGlvbiBxYihhLGIsYyl7dmFyIGQsZSxmPTAsZz1xYi5wcmVmaWx0ZXJzLmxlbmd0aCxoPW4uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPWhifHxsYigpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpuLmV4dGVuZCh7fSxiKSxvcHRzOm4uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpuLmVhc2luZy5fZGVmYXVsdH0sYyksb3JpZ2luYWxQcm9wZXJ0aWVzOmIsb3JpZ2luYWxPcHRpb25zOmMsc3RhcnRUaW1lOmhifHxsYigpLGR1cmF0aW9uOmMuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9bi5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGQpLGR9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7aWYoZSlyZXR1cm4gdGhpcztmb3IoZT0hMDtkPmM7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj8oaC5ub3RpZnlXaXRoKGEsW2osMSwwXSksaC5yZXNvbHZlV2l0aChhLFtqLGJdKSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihwYihrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9cWIucHJlZmlsdGVyc1tmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIG4uaXNGdW5jdGlvbihkLnN0b3ApJiYobi5fcXVldWVIb29rcyhqLmVsZW0sai5vcHRzLnF1ZXVlKS5zdG9wPW4ucHJveHkoZC5zdG9wLGQpKSxkO3JldHVybiBuLm1hcChrLG5iLGopLG4uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG4uZngudGltZXIobi5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bi5BbmltYXRpb249bi5leHRlbmQocWIse3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jcmVhdGVUd2VlbihhLGIpO3JldHVybiBYKGMuZWxlbSxhLFUuZXhlYyhiKSxjKSxjfV19LHR3ZWVuZXI6ZnVuY3Rpb24oYSxiKXtuLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVsiKiJdKTphPWEubWF0Y2goRyk7Zm9yKHZhciBjLGQ9MCxlPWEubGVuZ3RoO2U+ZDtkKyspYz1hW2RdLHFiLnR3ZWVuZXJzW2NdPXFiLnR3ZWVuZXJzW2NdfHxbXSxxYi50d2VlbmVyc1tjXS51bnNoaWZ0KGIpfSxwcmVmaWx0ZXJzOltvYl0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9xYi5wcmVmaWx0ZXJzLnVuc2hpZnQoYSk6cWIucHJlZmlsdGVycy5wdXNoKGEpfX0pLG4uc3BlZWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJiJvYmplY3QiPT10eXBlb2YgYT9uLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG4uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbi5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1uLmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbi5meC5zcGVlZHM/bi5meC5zcGVlZHNbZC5kdXJhdGlvbl06bi5meC5zcGVlZHMuX2RlZmF1bHQsbnVsbCE9ZC5xdWV1ZSYmZC5xdWV1ZSE9PSEwfHwoZC5xdWV1ZT0iZngiKSxkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oKXtuLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWUmJm4uZGVxdWV1ZSh0aGlzLGQucXVldWUpfSxkfSxuLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcihXKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1uLmlzRW1wdHlPYmplY3QoYSksZj1uLnNwZWVkKGIsYyxkKSxnPWZ1bmN0aW9uKCl7dmFyIGI9cWIodGhpcyxuLmV4dGVuZCh7fSxhKSxmKTsoZXx8bi5fZGF0YSh0aGlzLCJmaW5pc2giKSkmJmIuc3RvcCghMCl9O3JldHVybiBnLmZpbmlzaD1nLGV8fGYucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShmLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj1hLnN0b3A7ZGVsZXRlIGEuc3RvcCxiKGMpfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihjPWIsYj1hLGE9dm9pZCAwKSxiJiZhIT09ITEmJnRoaXMucXVldWUoYXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ITAsZT1udWxsIT1hJiZhKyJxdWV1ZUhvb2tzIixmPW4udGltZXJzLGc9bi5fZGF0YSh0aGlzKTtpZihlKWdbZV0mJmdbZV0uc3RvcCYmZChnW2VdKTtlbHNlIGZvcihlIGluIGcpZ1tlXSYmZ1tlXS5zdG9wJiZrYi50ZXN0KGUpJiZkKGdbZV0pO2ZvcihlPWYubGVuZ3RoO2UtLTspZltlXS5lbGVtIT09dGhpc3x8bnVsbCE9YSYmZltlXS5xdWV1ZSE9PWF8fChmW2VdLmFuaW0uc3RvcChjKSxiPSExLGYuc3BsaWNlKGUsMSkpOyFiJiZjfHxuLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1uLl9kYXRhKHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1uLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbi5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxuLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bi5mbltiXTtuLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUobWIoYiwhMCksYSxkLGUpfX0pLG4uZWFjaCh7c2xpZGVEb3duOm1iKCJzaG93Iiksc2xpZGVVcDptYigiaGlkZSIpLHNsaWRlVG9nZ2xlOm1iKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxuLnRpbWVycz1bXSxuLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPW4udGltZXJzLGM9MDtmb3IoaGI9bi5ub3coKTtjPGIubGVuZ3RoO2MrKylhPWJbY10sYSgpfHxiW2NdIT09YXx8Yi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxuLmZ4LnN0b3AoKSxoYj12b2lkIDB9LG4uZngudGltZXI9ZnVuY3Rpb24oYSl7bi50aW1lcnMucHVzaChhKSxhKCk/bi5meC5zdGFydCgpOm4udGltZXJzLnBvcCgpfSxuLmZ4LmludGVydmFsPTEzLG4uZnguc3RhcnQ9ZnVuY3Rpb24oKXtpYnx8KGliPWEuc2V0SW50ZXJ2YWwobi5meC50aWNrLG4uZnguaW50ZXJ2YWwpKX0sbi5meC5zdG9wPWZ1bmN0aW9uKCl7YS5jbGVhckludGVydmFsKGliKSxpYj1udWxsfSxuLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxuLmZuLmRlbGF5PWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGI9bi5meD9uLmZ4LnNwZWVkc1tiXXx8YjpiLGM9Y3x8ImZ4Iix0aGlzLnF1ZXVlKGMsZnVuY3Rpb24oYyxkKXt2YXIgZT1hLnNldFRpbWVvdXQoYyxiKTtkLnN0b3A9ZnVuY3Rpb24oKXthLmNsZWFyVGltZW91dChlKX19KX0sZnVuY3Rpb24oKXt2YXIgYSxiPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxjPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1kLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGY9ZS5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTtjPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksYy5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxjLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxiLnNldEF0dHJpYnV0ZSgidHlwZSIsImNoZWNrYm94IiksYy5hcHBlbmRDaGlsZChiKSxhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxhLnN0eWxlLmNzc1RleHQ9InRvcDoxcHgiLGwuZ2V0U2V0QXR0cmlidXRlPSJ0IiE9PWMuY2xhc3NOYW1lLGwuc3R5bGU9L3RvcC8udGVzdChhLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksbC5ocmVmTm9ybWFsaXplZD0iL2EiPT09YS5nZXRBdHRyaWJ1dGUoImhyZWYiKSxsLmNoZWNrT249ISFiLnZhbHVlLGwub3B0U2VsZWN0ZWQ9Zi5zZWxlY3RlZCxsLmVuY3R5cGU9ISFkLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGUuZGlzYWJsZWQ9ITAsbC5vcHREaXNhYmxlZD0hZi5kaXNhYmxlZCxiPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSxsLmlucHV0PSIiPT09Yi5nZXRBdHRyaWJ1dGUoInZhbHVlIiksYi52YWx1ZT0idCIsYi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGwucmFkaW9WYWx1ZT0idCI9PT1iLnZhbHVlfSgpO3ZhciByYj0vXHIvZyxzYj0vW1x4MjBcdFxyXG5cZl0rL2c7bi5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBkPW4uaXNGdW5jdGlvbihhKSx0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGU7MT09PXRoaXMubm9kZVR5cGUmJihlPWQ/YS5jYWxsKHRoaXMsYyxuKHRoaXMpLnZhbCgpKTphLG51bGw9PWU/ZT0iIjoibnVtYmVyIj09dHlwZW9mIGU/ZSs9IiI6bi5pc0FycmF5KGUpJiYoZT1uLm1hcChlLGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOmErIiJ9KSksYj1uLnZhbEhvb2tzW3RoaXMudHlwZV18fG4udmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYic2V0ImluIGImJnZvaWQgMCE9PWIuc2V0KHRoaXMsZSwidmFsdWUiKXx8KHRoaXMudmFsdWU9ZSkpfSk7aWYoZSlyZXR1cm4gYj1uLnZhbEhvb2tzW2UudHlwZV18fG4udmFsSG9va3NbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYiZ2V0ImluIGImJnZvaWQgMCE9PShjPWIuZ2V0KGUsInZhbHVlIikpP2M6KGM9ZS52YWx1ZSwic3RyaW5nIj09dHlwZW9mIGM/Yy5yZXBsYWNlKHJiLCIiKTpudWxsPT1jPyIiOmMpfX19KSxuLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW4uZmluZC5hdHRyKGEsInZhbHVlIik7cmV0dXJuIG51bGwhPWI/YjpuLnRyaW0obi50ZXh0KGEpKS5yZXBsYWNlKHNiLCIgIil9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXtmb3IodmFyIGIsYyxkPWEub3B0aW9ucyxlPWEuc2VsZWN0ZWRJbmRleCxmPSJzZWxlY3Qtb25lIj09PWEudHlwZXx8MD5lLGc9Zj9udWxsOltdLGg9Zj9lKzE6ZC5sZW5ndGgsaT0wPmU/aDpmP2U6MDtoPmk7aSsrKWlmKGM9ZFtpXSwoYy5zZWxlY3RlZHx8aT09PWUpJiYobC5vcHREaXNhYmxlZD8hYy5kaXNhYmxlZDpudWxsPT09Yy5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikpJiYoIWMucGFyZW50Tm9kZS5kaXNhYmxlZHx8IW4ubm9kZU5hbWUoYy5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoYj1uKGMpLnZhbCgpLGYpcmV0dXJuIGI7Zy5wdXNoKGIpfXJldHVybiBnfSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9YS5vcHRpb25zLGY9bi5tYWtlQXJyYXkoYiksZz1lLmxlbmd0aDt3aGlsZShnLS0paWYoZD1lW2ddLG4uaW5BcnJheShuLnZhbEhvb2tzLm9wdGlvbi5nZXQoZCksZik+LTEpdHJ5e2Quc2VsZWN0ZWQ9Yz0hMH1jYXRjaChoKXtkLnNjcm9sbEhlaWdodH1lbHNlIGQuc2VsZWN0ZWQ9ITE7cmV0dXJuIGN8fChhLnNlbGVjdGVkSW5kZXg9LTEpLGV9fX19KSxuLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtuLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbi5pc0FycmF5KGIpP2EuY2hlY2tlZD1uLmluQXJyYXkobihhKS52YWwoKSxiKT4tMTp2b2lkIDB9fSxsLmNoZWNrT258fChuLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09PWEuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6YS52YWx1ZX0pfSk7dmFyIHRiLHViLHZiPW4uZXhwci5hdHRySGFuZGxlLHdiPS9eKD86Y2hlY2tlZHxzZWxlY3RlZCkkL2kseGI9bC5nZXRTZXRBdHRyaWJ1dGUseWI9bC5pbnB1dDtuLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBZKHRoaXMsbi5hdHRyLGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLnJlbW92ZUF0dHIodGhpcyxhKX0pfX0pLG4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9YS5ub2RlVHlwZTtpZigzIT09ZiYmOCE9PWYmJjIhPT1mKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgYS5nZXRBdHRyaWJ1dGU/bi5wcm9wKGEsYixjKTooMT09PWYmJm4uaXNYTUxEb2MoYSl8fChiPWIudG9Mb3dlckNhc2UoKSxlPW4uYXR0ckhvb2tzW2JdfHwobi5leHByLm1hdGNoLmJvb2wudGVzdChiKT91Yjp0YikpLHZvaWQgMCE9PWM/bnVsbD09PWM/dm9pZCBuLnJlbW92ZUF0dHIoYSxiKTplJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDooYS5zZXRBdHRyaWJ1dGUoYixjKyIiKSxjKTplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOihkPW4uZmluZC5hdHRyKGEsYiksbnVsbD09ZD92b2lkIDA6ZCkpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKCFsLnJhZGlvVmFsdWUmJiJyYWRpbyI9PT1iJiZuLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7cmV0dXJuIGEuc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKSxifX19fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPTAsZj1iJiZiLm1hdGNoKEcpO2lmKGYmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZltlKytdKWQ9bi5wcm9wRml4W2NdfHxjLG4uZXhwci5tYXRjaC5ib29sLnRlc3QoYyk/eWImJnhifHwhd2IudGVzdChjKT9hW2RdPSExOmFbbi5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtkXT0hMTpuLmF0dHIoYSxjLCIiKSxhLnJlbW92ZUF0dHJpYnV0ZSh4Yj9jOmQpfX0pLHViPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/bi5yZW1vdmVBdHRyKGEsYyk6eWImJnhifHwhd2IudGVzdChjKT9hLnNldEF0dHJpYnV0ZSgheGImJm4ucHJvcEZpeFtjXXx8YyxjKTphW24uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYyldPWFbY109ITAsY319LG4uZWFjaChuLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihhLGIpe3ZhciBjPXZiW2JdfHxuLmZpbmQuYXR0cjt5YiYmeGJ8fCF3Yi50ZXN0KGIpP3ZiW2JdPWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmO3JldHVybiBkfHwoZj12YltiXSx2YltiXT1lLGU9bnVsbCE9YyhhLGIsZCk/Yi50b0xvd2VyQ2FzZSgpOm51bGwsdmJbYl09ZiksZX06dmJbYl09ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjP3ZvaWQgMDphW24uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYildP2IudG9Mb3dlckNhc2UoKTpudWxsfX0pLHliJiZ4Ynx8KG4uYXR0ckhvb2tzLnZhbHVlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLm5vZGVOYW1lKGEsImlucHV0Iik/dm9pZChhLmRlZmF1bHRWYWx1ZT1iKTp0YiYmdGIuc2V0KGEsYixjKX19KSx4Ynx8KHRiPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0QXR0cmlidXRlTm9kZShjKTtyZXR1cm4gZHx8YS5zZXRBdHRyaWJ1dGVOb2RlKGQ9YS5vd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShjKSksZC52YWx1ZT1iKz0iIiwidmFsdWUiPT09Y3x8Yj09PWEuZ2V0QXR0cmlidXRlKGMpP2I6dm9pZCAwfX0sdmIuaWQ9dmIubmFtZT12Yi5jb29yZHM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiYiIiE9PWQudmFsdWU/ZC52YWx1ZTpudWxsfSxuLnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpO3JldHVybiBjJiZjLnNwZWNpZmllZD9jLnZhbHVlOnZvaWQgMH0sc2V0OnRiLnNldH0sbi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3RiLnNldChhLCIiPT09Yj8hMTpiLGMpfX0sbi5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe24uYXR0ckhvb2tzW2JdPXtzZXQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4iIj09PWM/KGEuc2V0QXR0cmlidXRlKGIsImF1dG8iKSxjKTp2b2lkIDB9fX0pKSxsLnN0eWxlfHwobi5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0fHx2b2lkIDB9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0eWxlLmNzc1RleHQ9YisiIn19KTt2YXIgemI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdCkkL2ksQWI9L14oPzphfGFyZWEpJC9pO24uZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFkodGhpcyxuLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9bi5wcm9wRml4W2FdfHxhLHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPXZvaWQgMCxkZWxldGUgdGhpc1thXX1jYXRjaChiKXt9fSl9fSksbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj1hLm5vZGVUeXBlO2lmKDMhPT1mJiY4IT09ZiYmMiE9PWYpcmV0dXJuIDE9PT1mJiZuLmlzWE1MRG9jKGEpfHwoYj1uLnByb3BGaXhbYl18fGIsZT1uLnByb3BIb29rc1tiXSksdm9pZCAwIT09Yz9lJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDphW2JdPWM6ZSYmImdldCJpbiBlJiZudWxsIT09KGQ9ZS5nZXQoYSxiKSk/ZDphW2JdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bi5maW5kLmF0dHIoYSwidGFiaW5kZXgiKTtyZXR1cm4gYj9wYXJzZUludChiLDEwKTp6Yi50ZXN0KGEubm9kZU5hbWUpfHxBYi50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY/MDotMX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn19KSxsLmhyZWZOb3JtYWxpemVkfHxuLmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oYSxiKXtuLnByb3BIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZShiLDQpfX19KSxsLm9wdFNlbGVjdGVkfHwobi5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH0sc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtiJiYoYi5zZWxlY3RlZEluZGV4LGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLG4uZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7bi5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLGwuZW5jdHlwZXx8KG4ucHJvcEZpeC5lbmN0eXBlPSJlbmNvZGluZyIpO3ZhciBCYj0vW1x0XHJcblxmXS9nO2Z1bmN0aW9uIENiKGEpe3JldHVybiBuLmF0dHIoYSwiY2xhc3MiKXx8IiJ9bi5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoLGk9MDtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLGIsQ2IodGhpcykpKX0pO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Yj1hLm1hdGNoKEcpfHxbXTt3aGlsZShjPXRoaXNbaSsrXSlpZihlPUNiKGMpLGQ9MT09PWMubm9kZVR5cGUmJigiICIrZSsiICIpLnJlcGxhY2UoQmIsIiAiKSl7Zz0wO3doaWxlKGY9YltnKytdKWQuaW5kZXhPZigiICIrZisiICIpPDAmJihkKz1mKyIgIik7aD1uLnRyaW0oZCksZSE9PWgmJm4uYXR0cihjLCJjbGFzcyIsaCl9fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpPTA7aWYobi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLENiKHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Yj1hLm1hdGNoKEcpfHxbXTt3aGlsZShjPXRoaXNbaSsrXSlpZihlPUNiKGMpLGQ9MT09PWMubm9kZVR5cGUmJigiICIrZSsiICIpLnJlcGxhY2UoQmIsIiAiKSl7Zz0wO3doaWxlKGY9YltnKytdKXdoaWxlKGQuaW5kZXhPZigiICIrZisiICIpPi0xKWQ9ZC5yZXBsYWNlKCIgIitmKyIgIiwiICIpO2g9bi50cmltKGQpLGUhPT1oJiZuLmF0dHIoYywiY2xhc3MiLGgpfX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6bi5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihjKXtuKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsQ2IodGhpcyksYiksYil9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYixkLGUsZjtpZigic3RyaW5nIj09PWMpe2Q9MCxlPW4odGhpcyksZj1hLm1hdGNoKEcpfHxbXTt3aGlsZShiPWZbZCsrXSllLmhhc0NsYXNzKGIpP2UucmVtb3ZlQ2xhc3MoYik6ZS5hZGRDbGFzcyhiKX1lbHNlIHZvaWQgMCE9PWEmJiJib29sZWFuIiE9PWN8fChiPUNiKHRoaXMpLGImJm4uX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsYiksbi5hdHRyKHRoaXMsImNsYXNzIixifHxhPT09ITE/IiI6bi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPTA7Yj0iICIrYSsiICI7d2hpbGUoYz10aGlzW2QrK10paWYoMT09PWMubm9kZVR5cGUmJigiICIrQ2IoYykrIiAiKS5yZXBsYWNlKEJiLCIgIikuaW5kZXhPZihiKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KSxuLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtuLmZuW2JdPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX19KSxuLmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9fSk7dmFyIERiPWEubG9jYXRpb24sRWI9bi5ub3coKSxGYj0vXD8vLEdiPS8oLCl8KFxbfHspfCh9fF0pfCIoPzpbXiJcXFxyXG5dfFxcWyJcXFwvYmZucnRdfFxcdVtcZGEtZkEtRl17NH0pKiJccyo6P3x0cnVlfGZhbHNlfG51bGx8LT8oPyEwXGQpXGQrKD86XC5cZCt8KSg/OltlRV1bKy1dP1xkK3wpL2c7bi5wYXJzZUpTT049ZnVuY3Rpb24oYil7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKyIiKTt2YXIgYyxkPW51bGwsZT1uLnRyaW0oYisiIik7cmV0dXJuIGUmJiFuLnRyaW0oZS5yZXBsYWNlKEdiLGZ1bmN0aW9uKGEsYixlLGYpe3JldHVybiBjJiZiJiYoZD0wKSwwPT09ZD9hOihjPWV8fGIsZCs9IWYtIWUsIiIpfSkpP0Z1bmN0aW9uKCJyZXR1cm4gIitlKSgpOm4uZXJyb3IoIkludmFsaWQgSlNPTjogIitiKX0sbi5wYXJzZVhNTD1mdW5jdGlvbihiKXt2YXIgYyxkO2lmKCFifHwic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIG51bGw7dHJ5e2EuRE9NUGFyc2VyPyhkPW5ldyBhLkRPTVBhcnNlcixjPWQucGFyc2VGcm9tU3RyaW5nKGIsInRleHQveG1sIikpOihjPW5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxjLmFzeW5jPSJmYWxzZSIsYy5sb2FkWE1MKGIpKX1jYXRjaChlKXtjPXZvaWQgMH1yZXR1cm4gYyYmYy5kb2N1bWVudEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8bi5lcnJvcigiSW52YWxpZCBYTUw6ICIrYiksY307dmFyIEhiPS8jLiokLyxJYj0vKFs/Jl0pXz1bXiZdKi8sSmI9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxLYj0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxMYj0vXig/OkdFVHxIRUFEKSQvLE1iPS9eXC9cLy8sTmI9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sT2I9e30sUGI9e30sUWI9IiovIi5jb25jYXQoIioiKSxSYj1EYi5ocmVmLFNiPU5iLmV4ZWMoUmIudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIFRiKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEcpfHxbXTtpZihuLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZC5jaGFyQXQoMCk/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gVWIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09UGI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxuLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBWYihhLGIpe3ZhciBjLGQsZT1uLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYil2b2lkIDAhPT1iW2RdJiYoKGVbZF0/YTpjfHwoYz17fSkpW2RdPWJbZF0pO3JldHVybiBjJiZuLmV4dGVuZCghMCxhLGMpLGF9ZnVuY3Rpb24gV2IoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWUmJihlPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihlKWZvcihnIGluIGgpaWYoaFtnXSYmaFtnXS50ZXN0KGUpKXtpLnVuc2hpZnQoZyk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGcgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tnKyIgIitpWzBdXSl7Zj1nO2JyZWFrfWR8fChkPWcpfWY9Znx8ZH1yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gWGIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1uLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6UmIsdHlwZToiR0VUIixpc0xvY2FsOktiLnRlc3QoU2JbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6UWIsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6bi5wYXJzZUpTT04sInRleHQgeG1sIjpuLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9WYihWYihhLG4uYWpheFNldHRpbmdzKSxiKTpWYihuLmFqYXhTZXR0aW5ncyxhKX0sYWpheFByZWZpbHRlcjpUYihPYiksYWpheFRyYW5zcG9ydDpUYihQYiksYWpheDpmdW5jdGlvbihiLGMpeyJvYmplY3QiPT10eXBlb2YgYiYmKGM9YixiPXZvaWQgMCksYz1jfHx7fTt2YXIgZCxlLGYsZyxoLGksaixrLGw9bi5hamF4U2V0dXAoe30sYyksbT1sLmNvbnRleHR8fGwsbz1sLmNvbnRleHQmJihtLm5vZGVUeXBlfHxtLmpxdWVyeSk/bihtKTpuLmV2ZW50LHA9bi5EZWZlcnJlZCgpLHE9bi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iikscj1sLnN0YXR1c0NvZGV8fHt9LHM9e30sdD17fSx1PTAsdj0iY2FuY2VsZWQiLHc9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXt2YXIgYjtpZigyPT09dSl7aWYoIWspe2s9e307d2hpbGUoYj1KYi5leGVjKGcpKWtbYlsxXS50b0xvd2VyQ2FzZSgpXT1iWzJdfWI9a1thLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT1iP251bGw6Yn0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT11P2c6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhLGIpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTtyZXR1cm4gdXx8KGE9dFtjXT10W2NdfHxhLHNbYV09YiksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gdXx8KGwubWltZVR5cGU9YSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihhKXt2YXIgYjtpZihhKWlmKDI+dSlmb3IoYiBpbiBhKXJbYl09W3JbYl0sYVtiXV07ZWxzZSB3LmFsd2F5cyhhW3cuc3RhdHVzXSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe3ZhciBiPWF8fHY7cmV0dXJuIGomJmouYWJvcnQoYikseSgwLGIpLHRoaXN9fTtpZihwLnByb21pc2UodykuY29tcGxldGU9cS5hZGQsdy5zdWNjZXNzPXcuZG9uZSx3LmVycm9yPXcuZmFpbCxsLnVybD0oKGJ8fGwudXJsfHxSYikrIiIpLnJlcGxhY2UoSGIsIiIpLnJlcGxhY2UoTWIsU2JbMV0rIi8vIiksbC50eXBlPWMubWV0aG9kfHxjLnR5cGV8fGwubWV0aG9kfHxsLnR5cGUsbC5kYXRhVHlwZXM9bi50cmltKGwuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChHKXx8WyIiXSxudWxsPT1sLmNyb3NzRG9tYWluJiYoZD1OYi5leGVjKGwudXJsLnRvTG93ZXJDYXNlKCkpLGwuY3Jvc3NEb21haW49ISghZHx8ZFsxXT09PVNiWzFdJiZkWzJdPT09U2JbMl0mJihkWzNdfHwoImh0dHA6Ij09PWRbMV0/IjgwIjoiNDQzIikpPT09KFNiWzNdfHwoImh0dHA6Ij09PVNiWzFdPyI4MCI6IjQ0MyIpKSkpLGwuZGF0YSYmbC5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBsLmRhdGEmJihsLmRhdGE9bi5wYXJhbShsLmRhdGEsbC50cmFkaXRpb25hbCkpLFViKE9iLGwsYyx3KSwyPT09dSlyZXR1cm4gdztpPW4uZXZlbnQmJmwuZ2xvYmFsLGkmJjA9PT1uLmFjdGl2ZSsrJiZuLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGwudHlwZT1sLnR5cGUudG9VcHBlckNhc2UoKSxsLmhhc0NvbnRlbnQ9IUxiLnRlc3QobC50eXBlKSxmPWwudXJsLGwuaGFzQ29udGVudHx8KGwuZGF0YSYmKGY9bC51cmwrPShGYi50ZXN0KGYpPyImIjoiPyIpK2wuZGF0YSxkZWxldGUgbC5kYXRhKSxsLmNhY2hlPT09ITEmJihsLnVybD1JYi50ZXN0KGYpP2YucmVwbGFjZShJYiwiJDFfPSIrRWIrKyk6ZisoRmIudGVzdChmKT8iJiI6Ij8iKSsiXz0iK0ViKyspKSxsLmlmTW9kaWZpZWQmJihuLmxhc3RNb2RpZmllZFtmXSYmdy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsbi5sYXN0TW9kaWZpZWRbZl0pLG4uZXRhZ1tmXSYmdy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixuLmV0YWdbZl0pKSwobC5kYXRhJiZsLmhhc0NvbnRlbnQmJmwuY29udGVudFR5cGUhPT0hMXx8Yy5jb250ZW50VHlwZSkmJncuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixsLmNvbnRlbnRUeXBlKSx3LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsbC5kYXRhVHlwZXNbMF0mJmwuYWNjZXB0c1tsLmRhdGFUeXBlc1swXV0/bC5hY2NlcHRzW2wuZGF0YVR5cGVzWzBdXSsoIioiIT09bC5kYXRhVHlwZXNbMF0/IiwgIitRYisiOyBxPTAuMDEiOiIiKTpsLmFjY2VwdHNbIioiXSk7Zm9yKGUgaW4gbC5oZWFkZXJzKXcuc2V0UmVxdWVzdEhlYWRlcihlLGwuaGVhZGVyc1tlXSk7aWYobC5iZWZvcmVTZW5kJiYobC5iZWZvcmVTZW5kLmNhbGwobSx3LGwpPT09ITF8fDI9PT11KSlyZXR1cm4gdy5hYm9ydCgpO3Y9ImFib3J0Ijtmb3IoZSBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl3W2VdKGxbZV0pO2lmKGo9VWIoUGIsbCxjLHcpKXtpZih3LnJlYWR5U3RhdGU9MSxpJiZvLnRyaWdnZXIoImFqYXhTZW5kIixbdyxsXSksMj09PXUpcmV0dXJuIHc7bC5hc3luYyYmbC50aW1lb3V0PjAmJihoPWEuc2V0VGltZW91dChmdW5jdGlvbigpe3cuYWJvcnQoInRpbWVvdXQiKX0sbC50aW1lb3V0KSk7dHJ5e3U9MSxqLnNlbmQocyx5KX1jYXRjaCh4KXtpZighKDI+dSkpdGhyb3cgeDt5KC0xLHgpfX1lbHNlIHkoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHkoYixjLGQsZSl7dmFyIGsscyx0LHYseCx5PWM7MiE9PXUmJih1PTIsaCYmYS5jbGVhclRpbWVvdXQoaCksaj12b2lkIDAsZz1lfHwiIix3LnJlYWR5U3RhdGU9Yj4wPzQ6MCxrPWI+PTIwMCYmMzAwPmJ8fDMwND09PWIsZCYmKHY9V2IobCx3LGQpKSx2PVhiKGwsdix3LGspLGs/KGwuaWZNb2RpZmllZCYmKHg9dy5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHgmJihuLmxhc3RNb2RpZmllZFtmXT14KSx4PXcuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx4JiYobi5ldGFnW2ZdPXgpKSwyMDQ9PT1ifHwiSEVBRCI9PT1sLnR5cGU/eT0ibm9jb250ZW50IjozMDQ9PT1iP3k9Im5vdG1vZGlmaWVkIjooeT12LnN0YXRlLHM9di5kYXRhLHQ9di5lcnJvcixrPSF0KSk6KHQ9eSwhYiYmeXx8KHk9ImVycm9yIiwwPmImJihiPTApKSksdy5zdGF0dXM9Yix3LnN0YXR1c1RleHQ9KGN8fHkpKyIiLGs/cC5yZXNvbHZlV2l0aChtLFtzLHksd10pOnAucmVqZWN0V2l0aChtLFt3LHksdF0pLHcuc3RhdHVzQ29kZShyKSxyPXZvaWQgMCxpJiZvLnRyaWdnZXIoaz8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt3LGwsaz9zOnRdKSxxLmZpcmVXaXRoKG0sW3cseV0pLGkmJihvLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3csbF0pLC0tbi5hY3RpdmV8fG4uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB3fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbi5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG4uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe25bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG4uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG4uYWpheChuLmV4dGVuZCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0sbi5pc1BsYWluT2JqZWN0KGEpJiZhKSl9fSksbi5fZXZhbFVybD1mdW5jdGlvbihhKXtyZXR1cm4gbi5hamF4KHt1cmw6YSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSxuLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihhKXtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsYikpfSk7aWYodGhpc1swXSl7dmFyIGI9bihhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApO3RoaXNbMF0ucGFyZW50Tm9kZSYmYi5pbnNlcnRCZWZvcmUodGhpc1swXSksYi5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzO3doaWxlKGEuZmlyc3RDaGlsZCYmMT09PWEuZmlyc3RDaGlsZC5ub2RlVHlwZSlhPWEuZmlyc3RDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiBuLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPW4odGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9bi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7bih0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe24ubm9kZU5hbWUodGhpcywiYm9keSIpfHxuKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX19KTtmdW5jdGlvbiBZYihhKXtyZXR1cm4gYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxuLmNzcyhhLCJkaXNwbGF5Iil9ZnVuY3Rpb24gWmIoYSl7aWYoIW4uY29udGFpbnMoYS5vd25lckRvY3VtZW50fHxkLGEpKXJldHVybiEwO3doaWxlKGEmJjE9PT1hLm5vZGVUeXBlKXtpZigibm9uZSI9PT1ZYihhKXx8ImhpZGRlbiI9PT1hLnR5cGUpcmV0dXJuITA7YT1hLnBhcmVudE5vZGV9cmV0dXJuITF9bi5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGEpe3JldHVybiBsLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpP2Eub2Zmc2V0V2lkdGg8PTAmJmEub2Zmc2V0SGVpZ2h0PD0wJiYhYS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aDpaYihhKX0sbi5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hbi5leHByLmZpbHRlcnMuaGlkZGVuKGEpfTt2YXIgJGI9LyUyMC9nLF9iPS9cW1xdJC8sYWM9L1xyP1xuL2csYmM9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLGNjPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBkYyhhLGIsYyxkKXt2YXIgZTtpZihuLmlzQXJyYXkoYikpbi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxfYi50ZXN0KGEpP2QoYSxlKTpkYyhhKyJbIisoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKGN8fCJvYmplY3QiIT09bi50eXBlKGIpKWQoYSxiKTtlbHNlIGZvcihlIGluIGIpZGMoYSsiWyIrZSsiXSIsYltlXSxjLGQpfW4ucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXtiPW4uaXNGdW5jdGlvbihiKT9iKCk6bnVsbD09Yj8iIjpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtpZih2b2lkIDA9PT1iJiYoYj1uLmFqYXhTZXR0aW5ncyYmbi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLG4uaXNBcnJheShhKXx8YS5qcXVlcnkmJiFuLmlzUGxhaW5PYmplY3QoYSkpbi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlkYyhjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZSgkYiwiKyIpfSxuLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG4ucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT1uLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gYT9uLm1ha2VBcnJheShhKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFuKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmY2MudGVzdCh0aGlzLm5vZGVOYW1lKSYmIWJjLnRlc3QoYSkmJih0aGlzLmNoZWNrZWR8fCFaLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9bih0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOm4uaXNBcnJheShjKT9uLm1hcChjLGZ1bmN0aW9uKGEpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoYWMsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGFjLCJcclxuIil9fSkuZ2V0KCl9fSksbi5hamF4U2V0dGluZ3MueGhyPXZvaWQgMCE9PWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTG9jYWw/aWMoKTpkLmRvY3VtZW50TW9kZT44P2hjKCk6L14oZ2V0fHBvc3R8aGVhZHxwdXR8ZGVsZXRlfG9wdGlvbnMpJC9pLnRlc3QodGhpcy50eXBlKSYmaGMoKXx8aWMoKX06aGM7dmFyIGVjPTAsZmM9e30sZ2M9bi5hamF4U2V0dGluZ3MueGhyKCk7YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib251bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGZjKWZjW2FdKHZvaWQgMCwhMCl9KSxsLmNvcnM9ISFnYyYmIndpdGhDcmVkZW50aWFscyJpbiBnYyxnYz1sLmFqYXg9ISFnYyxnYyYmbi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGIpe2lmKCFiLmNyb3NzRG9tYWlufHxsLmNvcnMpe3ZhciBjO3JldHVybntzZW5kOmZ1bmN0aW9uKGQsZSl7dmFyIGYsZz1iLnhocigpLGg9KytlYztpZihnLm9wZW4oYi50eXBlLGIudXJsLGIuYXN5bmMsYi51c2VybmFtZSxiLnBhc3N3b3JkKSxiLnhockZpZWxkcylmb3IoZiBpbiBiLnhockZpZWxkcylnW2ZdPWIueGhyRmllbGRzW2ZdO2IubWltZVR5cGUmJmcub3ZlcnJpZGVNaW1lVHlwZSYmZy5vdmVycmlkZU1pbWVUeXBlKGIubWltZVR5cGUpLGIuY3Jvc3NEb21haW58fGRbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGRbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZiBpbiBkKXZvaWQgMCE9PWRbZl0mJmcuc2V0UmVxdWVzdEhlYWRlcihmLGRbZl0rIiIpO2cuc2VuZChiLmhhc0NvbnRlbnQmJmIuZGF0YXx8bnVsbCksYz1mdW5jdGlvbihhLGQpe3ZhciBmLGksajtpZihjJiYoZHx8ND09PWcucmVhZHlTdGF0ZSkpaWYoZGVsZXRlIGZjW2hdLGM9dm9pZCAwLGcub25yZWFkeXN0YXRlY2hhbmdlPW4ubm9vcCxkKTQhPT1nLnJlYWR5U3RhdGUmJmcuYWJvcnQoKTtlbHNle2o9e30sZj1nLnN0YXR1cywic3RyaW5nIj09dHlwZW9mIGcucmVzcG9uc2VUZXh0JiYoai50ZXh0PWcucmVzcG9uc2VUZXh0KTt0cnl7aT1nLnN0YXR1c1RleHR9Y2F0Y2goayl7aT0iIn1mfHwhYi5pc0xvY2FsfHxiLmNyb3NzRG9tYWluPzEyMjM9PT1mJiYoZj0yMDQpOmY9ai50ZXh0PzIwMDo0MDR9aiYmZShmLGksaixnLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKX0sYi5hc3luYz80PT09Zy5yZWFkeVN0YXRlP2Euc2V0VGltZW91dChjKTpnLm9ucmVhZHlzdGF0ZWNoYW5nZT1mY1toXT1jOmMoKX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKHZvaWQgMCwhMCl9fX19KTtmdW5jdGlvbiBoYygpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBpYygpe3RyeXtyZXR1cm4gbmV3IGEuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaChiKXt9fW4uYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBuLmdsb2JhbEV2YWwoYSksYX19fSksbi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLG4uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjPWQuaGVhZHx8bigiaGVhZCIpWzBdfHxkLmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihlLGYpe2I9ZC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLmFzeW5jPSEwLGEuc2NyaXB0Q2hhcnNldCYmKGIuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGIuc3JjPWEudXJsLGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7KGN8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSkmJihiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbCxjfHxmKDIwMCwic3VjY2VzcyIpKX0sYy5pbnNlcnRCZWZvcmUoYixjLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIub25sb2FkKHZvaWQgMCwhMCl9fX19KTt2YXIgamM9W10sa2M9Lyg9KVw/KD89JnwkKXxcP1w/LztuLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9amMucG9wKCl8fG4uZXhwYW5kbysiXyIrRWIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG4uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKGtjLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYwPT09KGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYma2MudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW4uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKGtjLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPShGYi50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bi5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1mP24oYSkucmVtb3ZlUHJvcChlKTphW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssamMucHVzaChlKSksZyYmbi5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbi5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fGQ7dmFyIGU9eC5leGVjKGEpLGY9IWMmJltdO3JldHVybiBlP1tiLmNyZWF0ZUVsZW1lbnQoZVsxXSldOihlPWphKFthXSxiLGYpLGYmJmYubGVuZ3RoJiZuKGYpLnJlbW92ZSgpLG4ubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9O3ZhciBsYz1uLmZuLmxvYWQ7bi5mbi5sb2FkPWZ1bmN0aW9uKGEsYixjKXtpZigic3RyaW5nIiE9dHlwZW9mIGEmJmxjKXJldHVybiBsYy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGQsZSxmLGc9dGhpcyxoPWEuaW5kZXhPZigiICIpO3JldHVybiBoPi0xJiYoZD1uLnRyaW0oYS5zbGljZShoLGEubGVuZ3RoKSksYT1hLnNsaWNlKDAsaCkpLG4uaXNGdW5jdGlvbihiKT8oYz1iLGI9dm9pZCAwKTpiJiYib2JqZWN0Ij09dHlwZW9mIGImJihlPSJQT1NUIiksZy5sZW5ndGg+MCYmbi5hamF4KHt1cmw6YSx0eXBlOmV8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2Y9YXJndW1lbnRzLGcuaHRtbChkP24oIjxkaXY+IikuYXBwZW5kKG4ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuYWx3YXlzKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGZ1bmN0aW9uKCl7Yy5hcHBseSh0aGlzLGZ8fFthLnJlc3BvbnNlVGV4dCxiLGFdKX0pfSksdGhpc30sbi5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXtuLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksbi5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZ3JlcChuLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH07ZnVuY3Rpb24gbWMoYSl7cmV0dXJuIG4uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1uLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW4uY3NzKGEsInBvc2l0aW9uIiksbD1uKGEpLG09e307InN0YXRpYyI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoPWwub2Zmc2V0KCksZj1uLmNzcyhhLCJ0b3AiKSxpPW4uY3NzKGEsImxlZnQiKSxqPSgiYWJzb2x1dGUiPT09a3x8ImZpeGVkIj09PWspJiZuLmluQXJyYXkoImF1dG8iLFtmLGldKT4tMSxqPyhkPWwucG9zaXRpb24oKSxnPWQudG9wLGU9ZC5sZWZ0KTooZz1wYXJzZUZsb2F0KGYpfHwwLGU9cGFyc2VGbG9hdChpKXx8MCksbi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLG4uZXh0ZW5kKHt9LGgpKSksbnVsbCE9Yi50b3AmJihtLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihtLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxtKTpsLmNzcyhtKX19LG4uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtuLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXt0b3A6MCxsZWZ0OjB9LGU9dGhpc1swXSxmPWUmJmUub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG4uY29udGFpbnMoYixlKT8oInVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1tYyhmKSx7dG9wOmQudG9wKyhjLnBhZ2VZT2Zmc2V0fHxiLnNjcm9sbFRvcCktKGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoYy5wYWdlWE9mZnNldHx8Yi5zY3JvbGxMZWZ0KS0oYi5jbGllbnRMZWZ0fHwwKX0pOmR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsYixjPXt0b3A6MCxsZWZ0OjB9LGQ9dGhpc1swXTtyZXR1cm4iZml4ZWQiPT09bi5jc3MoZCwicG9zaXRpb24iKT9iPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGE9dGhpcy5vZmZzZXRQYXJlbnQoKSxiPXRoaXMub2Zmc2V0KCksbi5ub2RlTmFtZShhWzBdLCJodG1sIil8fChjPWEub2Zmc2V0KCkpLGMudG9wKz1uLmNzcyhhWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLGMubGVmdCs9bi5jc3MoYVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6Yi50b3AtYy50b3Atbi5jc3MoZCwibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtYy5sZWZ0LW4uY3NzKGQsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudDt3aGlsZShhJiYhbi5ub2RlTmFtZShhLCJodG1sIikmJiJzdGF0aWMiPT09bi5jc3MoYSwicG9zaXRpb24iKSlhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxRYX0pfX0pLG4uZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPS9ZLy50ZXN0KGIpO24uZm5bYV09ZnVuY3Rpb24oZCl7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihhLGQsZSl7dmFyIGY9bWMoYSk7cmV0dXJuIHZvaWQgMD09PWU/Zj9iIGluIGY/ZltiXTpmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXTphW2RdOnZvaWQoZj9mLnNjcm9sbFRvKGM/bihmKS5zY3JvbGxMZWZ0KCk6ZSxjP2U6bihmKS5zY3JvbGxUb3AoKSk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksbi5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1tiXT1VYShsLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz1TYShhLGIpLE9hLnRlc3QoYyk/bihhKS5wb3NpdGlvbigpW2JdKyJweCI6Yyk6dm9pZCAwfSl9KSxuLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGIpe24uZWFjaCh7CnBhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7bi5mbltkXT1mdW5jdGlvbihkLGUpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBkKSxnPWN8fChkPT09ITB8fGU9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFkodGhpcyxmdW5jdGlvbihiLGMsZCl7dmFyIGU7cmV0dXJuIG4uaXNXaW5kb3coYik/Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGU9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGVbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGVbIm9mZnNldCIrYV0sZVsiY2xpZW50IithXSkpOnZvaWQgMD09PWQ/bi5jc3MoYixjLGcpOm4uc3R5bGUoYixjLGQsZyl9LGIsZj9kOnZvaWQgMCxmLG51bGwpfX0pfSksbi5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGEsIioqIik6dGhpcy5vZmYoYixhfHwiKioiLGMpfX0pLG4uZm4uc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sbi5mbi5hbmRTZWxmPW4uZm4uYWRkQmFjaywiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gbn0pO3ZhciBuYz1hLmpRdWVyeSxvYz1hLiQ7cmV0dXJuIG4ubm9Db25mbGljdD1mdW5jdGlvbihiKXtyZXR1cm4gYS4kPT09biYmKGEuJD1vYyksYiYmYS5qUXVlcnk9PT1uJiYoYS5qUXVlcnk9bmMpLG59LGJ8fChhLmpRdWVyeT1hLiQ9biksbn0pOwo="></script>
<link href="data:text/css,%2Eleaflet%2Dpane%2C%2Eleaflet%2Dtile%2C%2Eleaflet%2Dmarker%2Dicon%2C%2Eleaflet%2Dmarker%2Dshadow%2C%2Eleaflet%2Dtile%2Dcontainer%2C%2Eleaflet%2Dpane%20%3E%20svg%2C%2Eleaflet%2Dpane%20%3E%20canvas%2C%2Eleaflet%2Dzoom%2Dbox%2C%2Eleaflet%2Dimage%2Dlayer%2C%2Eleaflet%2Dlayer%20%7Bposition%3A%20absolute%3Bleft%3A%200%3Btop%3A%200%3B%7D%2Eleaflet%2Dcontainer%20%7Boverflow%3A%20hidden%3B%7D%2Eleaflet%2Dtile%2C%2Eleaflet%2Dmarker%2Dicon%2C%2Eleaflet%2Dmarker%2Dshadow%20%7B%2Dwebkit%2Duser%2Dselect%3A%20none%3B%2Dmoz%2Duser%2Dselect%3A%20none%3Buser%2Dselect%3A%20none%3B%2Dwebkit%2Duser%2Ddrag%3A%20none%3B%7D%2Eleaflet%2Dsafari%20%2Eleaflet%2Dtile%20%7Bimage%2Drendering%3A%20%2Dwebkit%2Doptimize%2Dcontrast%3B%7D%2Eleaflet%2Dsafari%20%2Eleaflet%2Dtile%2Dcontainer%20%7Bwidth%3A%201600px%3Bheight%3A%201600px%3B%2Dwebkit%2Dtransform%2Dorigin%3A%200%200%3B%7D%2Eleaflet%2Dmarker%2Dicon%2C%2Eleaflet%2Dmarker%2Dshadow%20%7Bdisplay%3A%20block%3B%7D%2Eleaflet%2Dcontainer%20%2Eleaflet%2Doverlay%2Dpane%20svg%2C%2Eleaflet%2Dcontainer%20%2Eleaflet%2Dmarker%2Dpane%20img%2C%2Eleaflet%2Dcontainer%20%2Eleaflet%2Dshadow%2Dpane%20img%2C%2Eleaflet%2Dcontainer%20%2Eleaflet%2Dtile%2Dpane%20img%2C%2Eleaflet%2Dcontainer%20img%2Eleaflet%2Dimage%2Dlayer%20%7Bmax%2Dwidth%3A%20none%20%21important%3Bmax%2Dheight%3A%20none%20%21important%3B%7D%2Eleaflet%2Dcontainer%2Eleaflet%2Dtouch%2Dzoom%20%7B%2Dms%2Dtouch%2Daction%3A%20pan%2Dx%20pan%2Dy%3Btouch%2Daction%3A%20pan%2Dx%20pan%2Dy%3B%7D%2Eleaflet%2Dcontainer%2Eleaflet%2Dtouch%2Ddrag%20%7B%2Dms%2Dtouch%2Daction%3A%20pinch%2Dzoom%3Btouch%2Daction%3A%20none%3Btouch%2Daction%3A%20pinch%2Dzoom%3B%7D%2Eleaflet%2Dcontainer%2Eleaflet%2Dtouch%2Ddrag%2Eleaflet%2Dtouch%2Dzoom%20%7B%2Dms%2Dtouch%2Daction%3A%20none%3Btouch%2Daction%3A%20none%3B%7D%2Eleaflet%2Dcontainer%20%7B%2Dwebkit%2Dtap%2Dhighlight%2Dcolor%3A%20transparent%3B%7D%2Eleaflet%2Dcontainer%20a%20%7B%2Dwebkit%2Dtap%2Dhighlight%2Dcolor%3A%20rgba%2851%2C%20181%2C%20229%2C%200%2E4%29%3B%7D%2Eleaflet%2Dtile%20%7Bfilter%3A%20inherit%3Bvisibility%3A%20hidden%3B%7D%2Eleaflet%2Dtile%2Dloaded%20%7Bvisibility%3A%20inherit%3B%7D%2Eleaflet%2Dzoom%2Dbox%20%7Bwidth%3A%200%3Bheight%3A%200%3B%2Dmoz%2Dbox%2Dsizing%3A%20border%2Dbox%3Bbox%2Dsizing%3A%20border%2Dbox%3Bz%2Dindex%3A%20800%3B%7D%2Eleaflet%2Doverlay%2Dpane%20svg%20%7B%2Dmoz%2Duser%2Dselect%3A%20none%3B%7D%2Eleaflet%2Dpane%20%7B%20z%2Dindex%3A%20400%3B%20%7D%2Eleaflet%2Dtile%2Dpane%20%7B%20z%2Dindex%3A%20200%3B%20%7D%2Eleaflet%2Doverlay%2Dpane%20%7B%20z%2Dindex%3A%20400%3B%20%7D%2Eleaflet%2Dshadow%2Dpane%20%7B%20z%2Dindex%3A%20500%3B%20%7D%2Eleaflet%2Dmarker%2Dpane%20%7B%20z%2Dindex%3A%20600%3B%20%7D%2Eleaflet%2Dtooltip%2Dpane%20%7B%20z%2Dindex%3A%20650%3B%20%7D%2Eleaflet%2Dpopup%2Dpane%20%7B%20z%2Dindex%3A%20700%3B%20%7D%2Eleaflet%2Dmap%2Dpane%20canvas%20%7B%20z%2Dindex%3A%20100%3B%20%7D%2Eleaflet%2Dmap%2Dpane%20svg%20%7B%20z%2Dindex%3A%20200%3B%20%7D%2Eleaflet%2Dvml%2Dshape%20%7Bwidth%3A%201px%3Bheight%3A%201px%3B%7D%2Elvml%20%7Bbehavior%3A%20url%28%23default%23VML%29%3Bdisplay%3A%20inline%2Dblock%3Bposition%3A%20absolute%3B%7D%2Eleaflet%2Dcontrol%20%7Bposition%3A%20relative%3Bz%2Dindex%3A%20800%3Bpointer%2Devents%3A%20visiblePainted%3B%20pointer%2Devents%3A%20auto%3B%7D%2Eleaflet%2Dtop%2C%2Eleaflet%2Dbottom%20%7Bposition%3A%20absolute%3Bz%2Dindex%3A%201000%3Bpointer%2Devents%3A%20none%3B%7D%2Eleaflet%2Dtop%20%7Btop%3A%200%3B%7D%2Eleaflet%2Dright%20%7Bright%3A%200%3B%7D%2Eleaflet%2Dbottom%20%7Bbottom%3A%200%3B%7D%2Eleaflet%2Dleft%20%7Bleft%3A%200%3B%7D%2Eleaflet%2Dcontrol%20%7Bfloat%3A%20left%3Bclear%3A%20both%3B%7D%2Eleaflet%2Dright%20%2Eleaflet%2Dcontrol%20%7Bfloat%3A%20right%3B%7D%2Eleaflet%2Dtop%20%2Eleaflet%2Dcontrol%20%7Bmargin%2Dtop%3A%2010px%3B%7D%2Eleaflet%2Dbottom%20%2Eleaflet%2Dcontrol%20%7Bmargin%2Dbottom%3A%2010px%3B%7D%2Eleaflet%2Dleft%20%2Eleaflet%2Dcontrol%20%7Bmargin%2Dleft%3A%2010px%3B%7D%2Eleaflet%2Dright%20%2Eleaflet%2Dcontrol%20%7Bmargin%2Dright%3A%2010px%3B%7D%2Eleaflet%2Dfade%2Danim%20%2Eleaflet%2Dtile%20%7Bwill%2Dchange%3A%20opacity%3B%7D%2Eleaflet%2Dfade%2Danim%20%2Eleaflet%2Dpopup%20%7Bopacity%3A%200%3B%2Dwebkit%2Dtransition%3A%20opacity%200%2E2s%20linear%3B%2Dmoz%2Dtransition%3A%20opacity%200%2E2s%20linear%3B%2Do%2Dtransition%3A%20opacity%200%2E2s%20linear%3Btransition%3A%20opacity%200%2E2s%20linear%3B%7D%2Eleaflet%2Dfade%2Danim%20%2Eleaflet%2Dmap%2Dpane%20%2Eleaflet%2Dpopup%20%7Bopacity%3A%201%3B%7D%2Eleaflet%2Dzoom%2Danimated%20%7B%2Dwebkit%2Dtransform%2Dorigin%3A%200%200%3B%2Dms%2Dtransform%2Dorigin%3A%200%200%3Btransform%2Dorigin%3A%200%200%3B%7D%2Eleaflet%2Dzoom%2Danim%20%2Eleaflet%2Dzoom%2Danimated%20%7Bwill%2Dchange%3A%20transform%3B%7D%2Eleaflet%2Dzoom%2Danim%20%2Eleaflet%2Dzoom%2Danimated%20%7B%2Dwebkit%2Dtransition%3A%20%2Dwebkit%2Dtransform%200%2E25s%20cubic%2Dbezier%280%2C0%2C0%2E25%2C1%29%3B%2Dmoz%2Dtransition%3A%20%2Dmoz%2Dtransform%200%2E25s%20cubic%2Dbezier%280%2C0%2C0%2E25%2C1%29%3B%2Do%2Dtransition%3A%20%2Do%2Dtransform%200%2E25s%20cubic%2Dbezier%280%2C0%2C0%2E25%2C1%29%3Btransition%3A%20transform%200%2E25s%20cubic%2Dbezier%280%2C0%2C0%2E25%2C1%29%3B%7D%2Eleaflet%2Dzoom%2Danim%20%2Eleaflet%2Dtile%2C%2Eleaflet%2Dpan%2Danim%20%2Eleaflet%2Dtile%20%7B%2Dwebkit%2Dtransition%3A%20none%3B%2Dmoz%2Dtransition%3A%20none%3B%2Do%2Dtransition%3A%20none%3Btransition%3A%20none%3B%7D%2Eleaflet%2Dzoom%2Danim%20%2Eleaflet%2Dzoom%2Dhide%20%7Bvisibility%3A%20hidden%3B%7D%2Eleaflet%2Dinteractive%20%7Bcursor%3A%20pointer%3B%7D%2Eleaflet%2Dgrab%20%7Bcursor%3A%20%2Dwebkit%2Dgrab%3Bcursor%3A%20%2Dmoz%2Dgrab%3B%7D%2Eleaflet%2Dcrosshair%2C%2Eleaflet%2Dcrosshair%20%2Eleaflet%2Dinteractive%20%7Bcursor%3A%20crosshair%3B%7D%2Eleaflet%2Dpopup%2Dpane%2C%2Eleaflet%2Dcontrol%20%7Bcursor%3A%20auto%3B%7D%2Eleaflet%2Ddragging%20%2Eleaflet%2Dgrab%2C%2Eleaflet%2Ddragging%20%2Eleaflet%2Dgrab%20%2Eleaflet%2Dinteractive%2C%2Eleaflet%2Ddragging%20%2Eleaflet%2Dmarker%2Ddraggable%20%7Bcursor%3A%20move%3Bcursor%3A%20%2Dwebkit%2Dgrabbing%3Bcursor%3A%20%2Dmoz%2Dgrabbing%3B%7D%2Eleaflet%2Dmarker%2Dicon%2C%2Eleaflet%2Dmarker%2Dshadow%2C%2Eleaflet%2Dimage%2Dlayer%2C%2Eleaflet%2Dpane%20%3E%20svg%20path%2C%2Eleaflet%2Dtile%2Dcontainer%20%7Bpointer%2Devents%3A%20none%3B%7D%2Eleaflet%2Dmarker%2Dicon%2Eleaflet%2Dinteractive%2C%2Eleaflet%2Dimage%2Dlayer%2Eleaflet%2Dinteractive%2C%2Eleaflet%2Dpane%20%3E%20svg%20path%2Eleaflet%2Dinteractive%20%7Bpointer%2Devents%3A%20visiblePainted%3B%20pointer%2Devents%3A%20auto%3B%7D%2Eleaflet%2Dcontainer%20%7Bbackground%3A%20%23ddd%3Boutline%3A%200%3B%7D%2Eleaflet%2Dcontainer%20a%20%7Bcolor%3A%20%230078A8%3B%7D%2Eleaflet%2Dcontainer%20a%2Eleaflet%2Dactive%20%7Boutline%3A%202px%20solid%20orange%3B%7D%2Eleaflet%2Dzoom%2Dbox%20%7Bborder%3A%202px%20dotted%20%2338f%3Bbackground%3A%20rgba%28255%2C255%2C255%2C0%2E5%29%3B%7D%2Eleaflet%2Dcontainer%20%7Bfont%3A%2012px%2F1%2E5%20%22Helvetica%20Neue%22%2C%20Arial%2C%20Helvetica%2C%20sans%2Dserif%3B%7D%2Eleaflet%2Dbar%20%7Bbox%2Dshadow%3A%200%201px%205px%20rgba%280%2C0%2C0%2C0%2E65%29%3Bborder%2Dradius%3A%204px%3B%7D%2Eleaflet%2Dbar%20a%2C%2Eleaflet%2Dbar%20a%3Ahover%20%7Bbackground%2Dcolor%3A%20%23fff%3Bborder%2Dbottom%3A%201px%20solid%20%23ccc%3Bwidth%3A%2026px%3Bheight%3A%2026px%3Bline%2Dheight%3A%2026px%3Bdisplay%3A%20block%3Btext%2Dalign%3A%20center%3Btext%2Ddecoration%3A%20none%3Bcolor%3A%20black%3B%7D%2Eleaflet%2Dbar%20a%2C%2Eleaflet%2Dcontrol%2Dlayers%2Dtoggle%20%7Bbackground%2Dposition%3A%2050%25%2050%25%3Bbackground%2Drepeat%3A%20no%2Drepeat%3Bdisplay%3A%20block%3B%7D%2Eleaflet%2Dbar%20a%3Ahover%20%7Bbackground%2Dcolor%3A%20%23f4f4f4%3B%7D%2Eleaflet%2Dbar%20a%3Afirst%2Dchild%20%7Bborder%2Dtop%2Dleft%2Dradius%3A%204px%3Bborder%2Dtop%2Dright%2Dradius%3A%204px%3B%7D%2Eleaflet%2Dbar%20a%3Alast%2Dchild%20%7Bborder%2Dbottom%2Dleft%2Dradius%3A%204px%3Bborder%2Dbottom%2Dright%2Dradius%3A%204px%3Bborder%2Dbottom%3A%20none%3B%7D%2Eleaflet%2Dbar%20a%2Eleaflet%2Ddisabled%20%7Bcursor%3A%20default%3Bbackground%2Dcolor%3A%20%23f4f4f4%3Bcolor%3A%20%23bbb%3B%7D%2Eleaflet%2Dtouch%20%2Eleaflet%2Dbar%20a%20%7Bwidth%3A%2030px%3Bheight%3A%2030px%3Bline%2Dheight%3A%2030px%3B%7D%2Eleaflet%2Dtouch%20%2Eleaflet%2Dbar%20a%3Afirst%2Dchild%20%7Bborder%2Dtop%2Dleft%2Dradius%3A%202px%3Bborder%2Dtop%2Dright%2Dradius%3A%202px%3B%7D%2Eleaflet%2Dtouch%20%2Eleaflet%2Dbar%20a%3Alast%2Dchild%20%7Bborder%2Dbottom%2Dleft%2Dradius%3A%202px%3Bborder%2Dbottom%2Dright%2Dradius%3A%202px%3B%7D%2Eleaflet%2Dcontrol%2Dzoom%2Din%2C%2Eleaflet%2Dcontrol%2Dzoom%2Dout%20%7Bfont%3A%20bold%2018px%20%27Lucida%20Console%27%2C%20Monaco%2C%20monospace%3Btext%2Dindent%3A%201px%3B%7D%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dzoom%2Din%2C%20%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dzoom%2Dout%20%7Bfont%2Dsize%3A%2022px%3B%7D%2Eleaflet%2Dcontrol%2Dlayers%20%7Bbox%2Dshadow%3A%200%201px%205px%20rgba%280%2C0%2C0%2C0%2E4%29%3Bbackground%3A%20%23fff%3Bborder%2Dradius%3A%205px%3B%7D%2Eleaflet%2Dcontrol%2Dlayers%2Dtoggle%20%7Bbackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAQAAAADQ4RFAAACf0lEQVR4AY1UM3gkARTePdvdoTxXKc%2BqTl3aU5U6b2Kbkz3Gtq3Zw6ziLGNPzrYx7946Tr6%2Fee%2FXeCQ4D3ykPtL5tHno4n0d%2Fh3%2BxfuWHGLX81cn7r0iTNzjr7LrlxCqPtkbTQEHeqOrTy4Yyt3VCi%2FIOB0v7rVC7q45Q3Gr5K6jt%2B3Gl5nCoDD4MtO%2Bj96Wu8atmhGqcNGHObuf8OM%2Fx3AMx38%2B4Z2sPqzCxRFK2aF2e5Jol56XTLyggAMTL56XOMoS1W4pOyjUcGGQdZxU6qRh7B9Zp%2BPfpOFlqt0zyDZckPi1ttmIp03jX8gyJ8a%2FPG2yutpS%2FVol7peZIbZcKBAEEheEIAgFbDkz5H6Zrkm2hVWGiXKiF4Ycw0RWKdtC16Q7qe3X4iOMxruonzegJzWaXFrU9utOSsLUmrc0YjeWYjCW4PDMADElpJSSQ0vQvA1Tm6%2FJlKnqFs1EGyZiFCqnRZTEJJJiKRYzVYzJck2Rm6P4iH%2BcmSY0YzimYa8l0EtTODFWhcMIMVqdsI2uiTvKmTisIDHJ3od5GILVhBCarCfVRmo4uTjkhrhzkiBV7SsaqS%2BTzrzM1qpGGUFt28pIySQHR6h7F6KSwGWm97ay%2BZ%2BZqMcEjEWebE7wxCSQwpkhJqoZA5ivCdZDjJepuJ9IQjGGUmuXJdBFUygxVqVsxFsLMbDe8ZbDYVCGKxs%2BW080max1hFCarCfV%2BC1KATwcnvE9gRRuMP2prdbWGowm1KB1y%2BzwMMENkM755cJ2yPDtqhTI6ED1M%2F82yIDtC%2F4j4BijjeObflpO9I9MwXTCsSX8jWAFeHr05WoLTJ5G8IQVS%2F7vwR6ohirYM7f6HzYpogfS3R2OAAAAAElFTkSuQmCC%29%3Bwidth%3A%2036px%3Bheight%3A%2036px%3B%7D%2Eleaflet%2Dretina%20%2Eleaflet%2Dcontrol%2Dlayers%2Dtoggle%20%7Bbackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAQAAABvcdNgAAAEsklEQVR4AWL4TydIhpZK1kpWOlg0w3ZXP6D2soBtG42jeI6ZmQTHzAxiTbSJsYLjO9HhP%2BWOmcuhciVnmHVQcJnp7DFvScowZorad%2F%2BV%2FfVzMdMT2g9Cv9guXGv%2F7pYOrXh2U%2BRRR3dSd9JRx6bIFc%2FekqHI29JC6pJ5ZEh1yWkhkbcFeSjxgx3L2m1cb1C7bceyxA%2BCNjT%2FIfff%2B%2FkDk2u%2Fw%2F33%2FIeCMOSaWZ4glosqT3DNnNZQ7Cs58%2F3Ce5HL78iZH%2FvKVIaYlqzfdLu8Vi7dnvUbEza5Idt36tquZFldl6N5Z%2FPOLof0XLK61mZCmJSWjVF9tEjUluu74IUXvgttuVIHE7YxSkaYhJZam7yiM9Pv82JYfl9nptxZaxMJE4YSPty%2BvF0%2BY2up9d3wwijfjZbabqm%2F3bZ9ecKHsiGmRflnn1MW4pjHf9oLufyn2z3y1D6n8g8TZhxyzipLNPnAUpsOiuWimg52psrTZYnOWYNDTMuWBWa0tJb4rgq1UvmutpaYEbZlwU3CLJm%2FayYjHW5%2Fh7xWLn9Hh1vepDkyf7dE7MtT5LR4e7yYpHrkhOUpEfssBLq2pPhAqoSWKUkk7EDqkmK6RrCEzqDjhNDWNE%2BXSMvkJRDWlZTmCW0l0PHQGRZY5t1L83kT0Y3l2SItk5JAWHl2dCOBm%2BfPu3fo5%2F3v61RMCO9Jx2EEYYhb0rmNQMX%2Fvm7gqOEJLcXTGw3CAuRNeyaPWwjR8PRqKQ1PDA%2Fdpv%2Bon9Shox52WFnx0KY8onHayrJzm87i5h9xGw%2Ftfkev0jGsQizqezUKjk12hBMKJ4kbCqGPVNXudyyrShovGw5CgxsRICxF6aRmSjlBnHRzg7Gx8fKqEubI2rahQYdR1YgDIRQO7JvQyD52hoIQx0mxa0ODtW2Iozn1le2iIRdzwWewedyZzewidueOGqlsn1MvcnQpuVwLGG3%2FIR1hIKxCjelIDZ8ldqWz25jWAsnldEnK0Zxro19TGVb2ffIZEsIO89EIEDvKMPrzmBOQcKQ%2Brroye6NgRRxqR4U8EAkz0CL6uSGOm6KQCdWjvjRiSP1BPalCRS5iQYiEIvxuBMJEWgzSoHADcVMuN7IuqqTeyUPq22qFimFtxDyBBJEwNyt6TM88blFHao%2F6tWWhuuOM4SAK4EI4QmFHA%2BSEyWlp4EQoJ13cYGzMu7yszEIBOm2rVmHUNqwAIQabISNMRstmdhNWcFLsSm%2B0tjJH1MdRxO5Nx0WDMhCtgD6OKgZeljJqJKc9po8juskR9XN0Y1lZ3mWjLR9JCO1jRDMd0fpYC2VnvjBSEFg7wBENc0R9HFlb0xvF1%2BTBEpF68d%2BDHR6IOWVv2BECtxo46hOFUBd%2FAPU57WIoEwJhIi2CdpyZX0m93BZicktMj1AS9dClteUFAUNUIEygRZCtik5zSxI9MubTBH1GOiHsiLJ3OCoSZkILa9PxiN0EbvhsAo8tdAf9Seepd36lGWHmtNANTv5Jd0z4QYyeo%2FUEJqxKRpg5LZx6btLPsOaEmdMyxYdlc8LMaJnikDlhclqmPiQnTEpLUIZEwkRagjYkEibQErwhkTAKCLQEbUgkzJQWc%2F0PstHHcfEdQ%2BUAAAAASUVORK5CYII%3D%29%3Bbackground%2Dsize%3A%2026px%2026px%3B%7D%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dlayers%2Dtoggle%20%7Bwidth%3A%2044px%3Bheight%3A%2044px%3B%7D%2Eleaflet%2Dcontrol%2Dlayers%20%2Eleaflet%2Dcontrol%2Dlayers%2Dlist%2C%2Eleaflet%2Dcontrol%2Dlayers%2Dexpanded%20%2Eleaflet%2Dcontrol%2Dlayers%2Dtoggle%20%7Bdisplay%3A%20none%3B%7D%2Eleaflet%2Dcontrol%2Dlayers%2Dexpanded%20%2Eleaflet%2Dcontrol%2Dlayers%2Dlist%20%7Bdisplay%3A%20block%3Bposition%3A%20relative%3B%7D%2Eleaflet%2Dcontrol%2Dlayers%2Dexpanded%20%7Bpadding%3A%206px%2010px%206px%206px%3Bcolor%3A%20%23333%3Bbackground%3A%20%23fff%3B%7D%2Eleaflet%2Dcontrol%2Dlayers%2Dscrollbar%20%7Boverflow%2Dy%3A%20scroll%3Boverflow%2Dx%3A%20hidden%3Bpadding%2Dright%3A%205px%3B%7D%2Eleaflet%2Dcontrol%2Dlayers%2Dselector%20%7Bmargin%2Dtop%3A%202px%3Bposition%3A%20relative%3Btop%3A%201px%3B%7D%2Eleaflet%2Dcontrol%2Dlayers%20label%20%7Bdisplay%3A%20block%3B%7D%2Eleaflet%2Dcontrol%2Dlayers%2Dseparator%20%7Bheight%3A%200%3Bborder%2Dtop%3A%201px%20solid%20%23ddd%3Bmargin%3A%205px%20%2D10px%205px%20%2D6px%3B%7D%2Eleaflet%2Ddefault%2Dicon%2Dpath%20%7Bbackground%2Dimage%3A%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq%2FbXZtrp%2FlWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq%2FRBpykd8oZUb%2FkaJutow8r1aP9II0WmLKLIsJyv1w%2Fkqw9Ch2MYdB%2B%2B12Onxee%2FQMwvf4%2FDk%2FLfp%2Fi4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg%2FFm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B%2BOadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7%2FXZKNH%2B9%2BhBLOHYozuKQPxyMPUKkrX%2FK0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz%2BbXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U%2Bw7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue%2FuDivd3fkWRbS6%2FIA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7%2F6U%2BqH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts%2BHEa73u6dT3FNWwflY86eMHPk%2BYu%2Bi6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU%2BuWDD7zg54mz5%2F2BSnizi9T1Dg4QQXLToGNCkb6tb1NU%2BQAlGr1%2B%2BeADrzhn%2Fu8Q2YZhQVlZ5%2BCAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz%2Bgwh%2BoHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi%2B%2BWDL1g%2FeEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2%2F0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX%2BJ0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60%2B0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2%2B%2BDYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL%2BF1%2BwkdZ2TBOW2gIF88PBTzD%2FgpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF%2F2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC%2BadRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk%2F4kggu40ZTvIEm5g24qtU4KjBrx%2FBTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF%2B0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH%2BUUA7%2BnG6mdG%2FPu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP%2B64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR%2FibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ%2BKiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf%2B%2FFrIjweHQS4%2FpduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON%2BdfNbM%2BGgIwYdwAAAAASUVORK5CYII%3D%29%3B%7D%2Eleaflet%2Dcontainer%20%2Eleaflet%2Dcontrol%2Dattribution%20%7Bbackground%3A%20%23fff%3Bbackground%3A%20rgba%28255%2C%20255%2C%20255%2C%200%2E7%29%3Bmargin%3A%200%3B%7D%2Eleaflet%2Dcontrol%2Dattribution%2C%2Eleaflet%2Dcontrol%2Dscale%2Dline%20%7Bpadding%3A%200%205px%3Bcolor%3A%20%23333%3B%7D%2Eleaflet%2Dcontrol%2Dattribution%20a%20%7Btext%2Ddecoration%3A%20none%3B%7D%2Eleaflet%2Dcontrol%2Dattribution%20a%3Ahover%20%7Btext%2Ddecoration%3A%20underline%3B%7D%2Eleaflet%2Dcontainer%20%2Eleaflet%2Dcontrol%2Dattribution%2C%2Eleaflet%2Dcontainer%20%2Eleaflet%2Dcontrol%2Dscale%20%7Bfont%2Dsize%3A%2011px%3B%7D%2Eleaflet%2Dleft%20%2Eleaflet%2Dcontrol%2Dscale%20%7Bmargin%2Dleft%3A%205px%3B%7D%2Eleaflet%2Dbottom%20%2Eleaflet%2Dcontrol%2Dscale%20%7Bmargin%2Dbottom%3A%205px%3B%7D%2Eleaflet%2Dcontrol%2Dscale%2Dline%20%7Bborder%3A%202px%20solid%20%23777%3Bborder%2Dtop%3A%20none%3Bline%2Dheight%3A%201%2E1%3Bpadding%3A%202px%205px%201px%3Bfont%2Dsize%3A%2011px%3Bwhite%2Dspace%3A%20nowrap%3Boverflow%3A%20hidden%3B%2Dmoz%2Dbox%2Dsizing%3A%20border%2Dbox%3Bbox%2Dsizing%3A%20border%2Dbox%3Bbackground%3A%20%23fff%3Bbackground%3A%20rgba%28255%2C%20255%2C%20255%2C%200%2E5%29%3B%7D%2Eleaflet%2Dcontrol%2Dscale%2Dline%3Anot%28%3Afirst%2Dchild%29%20%7Bborder%2Dtop%3A%202px%20solid%20%23777%3Bborder%2Dbottom%3A%20none%3Bmargin%2Dtop%3A%20%2D2px%3B%7D%2Eleaflet%2Dcontrol%2Dscale%2Dline%3Anot%28%3Afirst%2Dchild%29%3Anot%28%3Alast%2Dchild%29%20%7Bborder%2Dbottom%3A%202px%20solid%20%23777%3B%7D%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dattribution%2C%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dlayers%2C%2Eleaflet%2Dtouch%20%2Eleaflet%2Dbar%20%7Bbox%2Dshadow%3A%20none%3B%7D%2Eleaflet%2Dtouch%20%2Eleaflet%2Dcontrol%2Dlayers%2C%2Eleaflet%2Dtouch%20%2Eleaflet%2Dbar%20%7Bborder%3A%202px%20solid%20rgba%280%2C0%2C0%2C0%2E2%29%3Bbackground%2Dclip%3A%20padding%2Dbox%3B%7D%2Eleaflet%2Dpopup%20%7Bposition%3A%20absolute%3Btext%2Dalign%3A%20center%3Bmargin%2Dbottom%3A%2020px%3B%7D%2Eleaflet%2Dpopup%2Dcontent%2Dwrapper%20%7Bpadding%3A%201px%3Btext%2Dalign%3A%20left%3Bborder%2Dradius%3A%2012px%3B%7D%2Eleaflet%2Dpopup%2Dcontent%20%7Bmargin%3A%2013px%2019px%3Bline%2Dheight%3A%201%2E4%3B%7D%2Eleaflet%2Dpopup%2Dcontent%20p%20%7Bmargin%3A%2018px%200%3B%7D%2Eleaflet%2Dpopup%2Dtip%2Dcontainer%20%7Bwidth%3A%2040px%3Bheight%3A%2020px%3Bposition%3A%20absolute%3Bleft%3A%2050%25%3Bmargin%2Dleft%3A%20%2D20px%3Boverflow%3A%20hidden%3Bpointer%2Devents%3A%20none%3B%7D%2Eleaflet%2Dpopup%2Dtip%20%7Bwidth%3A%2017px%3Bheight%3A%2017px%3Bpadding%3A%201px%3Bmargin%3A%20%2D10px%20auto%200%3B%2Dwebkit%2Dtransform%3A%20rotate%2845deg%29%3B%2Dmoz%2Dtransform%3A%20rotate%2845deg%29%3B%2Dms%2Dtransform%3A%20rotate%2845deg%29%3B%2Do%2Dtransform%3A%20rotate%2845deg%29%3Btransform%3A%20rotate%2845deg%29%3B%7D%2Eleaflet%2Dpopup%2Dcontent%2Dwrapper%2C%2Eleaflet%2Dpopup%2Dtip%20%7Bbackground%3A%20white%3Bcolor%3A%20%23333%3Bbox%2Dshadow%3A%200%203px%2014px%20rgba%280%2C0%2C0%2C0%2E4%29%3B%7D%2Eleaflet%2Dcontainer%20a%2Eleaflet%2Dpopup%2Dclose%2Dbutton%20%7Bposition%3A%20absolute%3Btop%3A%200%3Bright%3A%200%3Bpadding%3A%204px%204px%200%200%3Bborder%3A%20none%3Btext%2Dalign%3A%20center%3Bwidth%3A%2018px%3Bheight%3A%2014px%3Bfont%3A%2016px%2F14px%20Tahoma%2C%20Verdana%2C%20sans%2Dserif%3Bcolor%3A%20%23c3c3c3%3Btext%2Ddecoration%3A%20none%3Bfont%2Dweight%3A%20bold%3Bbackground%3A%20transparent%3B%7D%2Eleaflet%2Dcontainer%20a%2Eleaflet%2Dpopup%2Dclose%2Dbutton%3Ahover%20%7Bcolor%3A%20%23999%3B%7D%2Eleaflet%2Dpopup%2Dscrolled%20%7Boverflow%3A%20auto%3Bborder%2Dbottom%3A%201px%20solid%20%23ddd%3Bborder%2Dtop%3A%201px%20solid%20%23ddd%3B%7D%2Eleaflet%2Doldie%20%2Eleaflet%2Dpopup%2Dcontent%2Dwrapper%20%7Bzoom%3A%201%3B%7D%2Eleaflet%2Doldie%20%2Eleaflet%2Dpopup%2Dtip%20%7Bwidth%3A%2024px%3Bmargin%3A%200%20auto%3B%2Dms%2Dfilter%3A%20%22progid%3ADXImageTransform%2EMicrosoft%2EMatrix%28M11%3D0%2E70710678%2C%20M12%3D0%2E70710678%2C%20M21%3D%2D0%2E70710678%2C%20M22%3D0%2E70710678%29%22%3Bfilter%3A%20progid%3ADXImageTransform%2EMicrosoft%2EMatrix%28M11%3D0%2E70710678%2C%20M12%3D0%2E70710678%2C%20M21%3D%2D0%2E70710678%2C%20M22%3D0%2E70710678%29%3B%7D%2Eleaflet%2Doldie%20%2Eleaflet%2Dpopup%2Dtip%2Dcontainer%20%7Bmargin%2Dtop%3A%20%2D1px%3B%7D%2Eleaflet%2Doldie%20%2Eleaflet%2Dcontrol%2Dzoom%2C%2Eleaflet%2Doldie%20%2Eleaflet%2Dcontrol%2Dlayers%2C%2Eleaflet%2Doldie%20%2Eleaflet%2Dpopup%2Dcontent%2Dwrapper%2C%2Eleaflet%2Doldie%20%2Eleaflet%2Dpopup%2Dtip%20%7Bborder%3A%201px%20solid%20%23999%3B%7D%2Eleaflet%2Ddiv%2Dicon%20%7Bbackground%3A%20%23fff%3Bborder%3A%201px%20solid%20%23666%3B%7D%2Eleaflet%2Dtooltip%20%7Bposition%3A%20absolute%3Bpadding%3A%206px%3Bbackground%2Dcolor%3A%20%23fff%3Bborder%3A%201px%20solid%20%23fff%3Bborder%2Dradius%3A%203px%3Bcolor%3A%20%23222%3Bwhite%2Dspace%3A%20nowrap%3B%2Dwebkit%2Duser%2Dselect%3A%20none%3B%2Dmoz%2Duser%2Dselect%3A%20none%3B%2Dms%2Duser%2Dselect%3A%20none%3Buser%2Dselect%3A%20none%3Bpointer%2Devents%3A%20none%3Bbox%2Dshadow%3A%200%201px%203px%20rgba%280%2C0%2C0%2C0%2E4%29%3B%7D%2Eleaflet%2Dtooltip%2Eleaflet%2Dclickable%20%7Bcursor%3A%20pointer%3Bpointer%2Devents%3A%20auto%3B%7D%2Eleaflet%2Dtooltip%2Dtop%3Abefore%2C%2Eleaflet%2Dtooltip%2Dbottom%3Abefore%2C%2Eleaflet%2Dtooltip%2Dleft%3Abefore%2C%2Eleaflet%2Dtooltip%2Dright%3Abefore%20%7Bposition%3A%20absolute%3Bpointer%2Devents%3A%20none%3Bborder%3A%206px%20solid%20transparent%3Bbackground%3A%20transparent%3Bcontent%3A%20%22%22%3B%7D%2Eleaflet%2Dtooltip%2Dbottom%20%7Bmargin%2Dtop%3A%206px%3B%7D%2Eleaflet%2Dtooltip%2Dtop%20%7Bmargin%2Dtop%3A%20%2D6px%3B%7D%2Eleaflet%2Dtooltip%2Dbottom%3Abefore%2C%2Eleaflet%2Dtooltip%2Dtop%3Abefore%20%7Bleft%3A%2050%25%3Bmargin%2Dleft%3A%20%2D6px%3B%7D%2Eleaflet%2Dtooltip%2Dtop%3Abefore%20%7Bbottom%3A%200%3Bmargin%2Dbottom%3A%20%2D12px%3Bborder%2Dtop%2Dcolor%3A%20%23fff%3B%7D%2Eleaflet%2Dtooltip%2Dbottom%3Abefore%20%7Btop%3A%200%3Bmargin%2Dtop%3A%20%2D12px%3Bmargin%2Dleft%3A%20%2D6px%3Bborder%2Dbottom%2Dcolor%3A%20%23fff%3B%7D%2Eleaflet%2Dtooltip%2Dleft%20%7Bmargin%2Dleft%3A%20%2D6px%3B%7D%2Eleaflet%2Dtooltip%2Dright%20%7Bmargin%2Dleft%3A%206px%3B%7D%2Eleaflet%2Dtooltip%2Dleft%3Abefore%2C%2Eleaflet%2Dtooltip%2Dright%3Abefore%20%7Btop%3A%2050%25%3Bmargin%2Dtop%3A%20%2D6px%3B%7D%2Eleaflet%2Dtooltip%2Dleft%3Abefore%20%7Bright%3A%200%3Bmargin%2Dright%3A%20%2D12px%3Bborder%2Dleft%2Dcolor%3A%20%23fff%3B%7D%2Eleaflet%2Dtooltip%2Dright%3Abefore%20%7Bleft%3A%200%3Bmargin%2Dleft%3A%20%2D12px%3Bborder%2Dright%2Dcolor%3A%20%23fff%3B%7D" rel="stylesheet" />
<script src="data:application/javascript;base64,LyogQHByZXNlcnZlCiAqIExlYWZsZXQgMS4zLjErRGV0YWNoZWQ6IGJhNmY5N2ZmZjg2NDdlNzI0ZTRkZmU2NmQyZWQ3ZGExMWY5MDg5ODkuYmE2Zjk3ZiwgYSBKUyBsaWJyYXJ5IGZvciBpbnRlcmFjdGl2ZSBtYXBzLiBodHRwczovL2xlYWZsZXRqcy5jb20KICogKGMpIDIwMTAtMjAxNyBWbGFkaW1pciBBZ2Fmb25raW4sIChjKSAyMDEwLTIwMTEgQ2xvdWRNYWRlCiAqLwohZnVuY3Rpb24odCxpKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP2koZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0saSk6aSh0Lkw9e30pfSh0aGlzLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKHQpe3ZhciBpLGUsbixvO2ZvcihlPTEsbj1hcmd1bWVudHMubGVuZ3RoO2U8bjtlKyspe289YXJndW1lbnRzW2VdO2ZvcihpIGluIG8pdFtpXT1vW2ldfXJldHVybiB0fWZ1bmN0aW9uIGUodCxpKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2U7aWYodC5iaW5kKXJldHVybiB0LmJpbmQuYXBwbHkodCxlLmNhbGwoYXJndW1lbnRzLDEpKTt2YXIgbj1lLmNhbGwoYXJndW1lbnRzLDIpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KGksbi5sZW5ndGg/bi5jb25jYXQoZS5jYWxsKGFyZ3VtZW50cykpOmFyZ3VtZW50cyl9fWZ1bmN0aW9uIG4odCl7cmV0dXJuIHQuX2xlYWZsZXRfaWQ9dC5fbGVhZmxldF9pZHx8Kyt0aSx0Ll9sZWFmbGV0X2lkfWZ1bmN0aW9uIG8odCxpLGUpe3ZhciBuLG8scyxyO3JldHVybiByPWZ1bmN0aW9uKCl7bj0hMSxvJiYocy5hcHBseShlLG8pLG89ITEpfSxzPWZ1bmN0aW9uKCl7bj9vPWFyZ3VtZW50czoodC5hcHBseShlLGFyZ3VtZW50cyksc2V0VGltZW91dChyLGkpLG49ITApfX1mdW5jdGlvbiBzKHQsaSxlKXt2YXIgbj1pWzFdLG89aVswXSxzPW4tbztyZXR1cm4gdD09PW4mJmU/dDooKHQtbyklcytzKSVzK299ZnVuY3Rpb24gcigpe3JldHVybiExfWZ1bmN0aW9uIGEodCxpKXt2YXIgZT1NYXRoLnBvdygxMCx2b2lkIDA9PT1pPzY6aSk7cmV0dXJuIE1hdGgucm91bmQodCplKS9lfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX1mdW5jdGlvbiB1KHQpe3JldHVybiBoKHQpLnNwbGl0KC9ccysvKX1mdW5jdGlvbiBsKHQsaSl7dC5oYXNPd25Qcm9wZXJ0eSgib3B0aW9ucyIpfHwodC5vcHRpb25zPXQub3B0aW9ucz9RdCh0Lm9wdGlvbnMpOnt9KTtmb3IodmFyIGUgaW4gaSl0Lm9wdGlvbnNbZV09aVtlXTtyZXR1cm4gdC5vcHRpb25zfWZ1bmN0aW9uIGModCxpLGUpe3ZhciBuPVtdO2Zvcih2YXIgbyBpbiB0KW4ucHVzaChlbmNvZGVVUklDb21wb25lbnQoZT9vLnRvVXBwZXJDYXNlKCk6bykrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0W29dKSk7cmV0dXJuKGkmJi0xIT09aS5pbmRleE9mKCI/Iik/IiYiOiI/Iikrbi5qb2luKCImIil9ZnVuY3Rpb24gXyh0LGkpe3JldHVybiB0LnJlcGxhY2UoaWksZnVuY3Rpb24odCxlKXt2YXIgbj1pW2VdO2lmKHZvaWQgMD09PW4pdGhyb3cgbmV3IEVycm9yKCJObyB2YWx1ZSBwcm92aWRlZCBmb3IgdmFyaWFibGUgIit0KTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgbiYmKG49bihpKSksbn0pfWZ1bmN0aW9uIGQodCxpKXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpZih0W2VdPT09aSlyZXR1cm4gZTtyZXR1cm4tMX1mdW5jdGlvbiBwKHQpe3JldHVybiB3aW5kb3dbIndlYmtpdCIrdF18fHdpbmRvd1sibW96Iit0XXx8d2luZG93WyJtcyIrdF19ZnVuY3Rpb24gbSh0KXt2YXIgaT0rbmV3IERhdGUsZT1NYXRoLm1heCgwLDE2LShpLW9pKSk7cmV0dXJuIG9pPWkrZSx3aW5kb3cuc2V0VGltZW91dCh0LGUpfWZ1bmN0aW9uIGYodCxpLG4pe2lmKCFufHxzaSE9PW0pcmV0dXJuIHNpLmNhbGwod2luZG93LGUodCxpKSk7dC5jYWxsKGkpfWZ1bmN0aW9uIGcodCl7dCYmcmkuY2FsbCh3aW5kb3csdCl9ZnVuY3Rpb24gdigpe31mdW5jdGlvbiB5KHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgTCYmTCYmTC5NaXhpbil7dD1laSh0KT90Olt0XTtmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKyl0W2ldPT09TC5NaXhpbi5FdmVudHMmJmNvbnNvbGUud2FybigiRGVwcmVjYXRlZCBpbmNsdWRlIG9mIEwuTWl4aW4uRXZlbnRzOiB0aGlzIHByb3BlcnR5IHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgcmVsZWFzZXMsIHBsZWFzZSBpbmhlcml0IGZyb20gTC5FdmVudGVkIGluc3RlYWQuIiwobmV3IEVycm9yKS5zdGFjayl9fWZ1bmN0aW9uIHgodCxpLGUpe3RoaXMueD1lP01hdGgucm91bmQodCk6dCx0aGlzLnk9ZT9NYXRoLnJvdW5kKGkpOml9ZnVuY3Rpb24gdyh0LGksZSl7cmV0dXJuIHQgaW5zdGFuY2VvZiB4P3Q6ZWkodCk/bmV3IHgodFswXSx0WzFdKTp2b2lkIDA9PT10fHxudWxsPT09dD90OiJvYmplY3QiPT10eXBlb2YgdCYmIngiaW4gdCYmInkiaW4gdD9uZXcgeCh0LngsdC55KTpuZXcgeCh0LGksZSl9ZnVuY3Rpb24gUCh0LGkpe2lmKHQpZm9yKHZhciBlPWk/W3QsaV06dCxuPTAsbz1lLmxlbmd0aDtuPG87bisrKXRoaXMuZXh0ZW5kKGVbbl0pfWZ1bmN0aW9uIGIodCxpKXtyZXR1cm4hdHx8dCBpbnN0YW5jZW9mIFA/dDpuZXcgUCh0LGkpfWZ1bmN0aW9uIFQodCxpKXtpZih0KWZvcih2YXIgZT1pP1t0LGldOnQsbj0wLG89ZS5sZW5ndGg7bjxvO24rKyl0aGlzLmV4dGVuZChlW25dKX1mdW5jdGlvbiB6KHQsaSl7cmV0dXJuIHQgaW5zdGFuY2VvZiBUP3Q6bmV3IFQodCxpKX1mdW5jdGlvbiBNKHQsaSxlKXtpZihpc05hTih0KXx8aXNOYU4oaSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIExhdExuZyBvYmplY3Q6ICgiK3QrIiwgIitpKyIpIik7dGhpcy5sYXQ9K3QsdGhpcy5sbmc9K2ksdm9pZCAwIT09ZSYmKHRoaXMuYWx0PStlKX1mdW5jdGlvbiBDKHQsaSxlKXtyZXR1cm4gdCBpbnN0YW5jZW9mIE0/dDplaSh0KSYmIm9iamVjdCIhPXR5cGVvZiB0WzBdPzM9PT10Lmxlbmd0aD9uZXcgTSh0WzBdLHRbMV0sdFsyXSk6Mj09PXQubGVuZ3RoP25ldyBNKHRbMF0sdFsxXSk6bnVsbDp2b2lkIDA9PT10fHxudWxsPT09dD90OiJvYmplY3QiPT10eXBlb2YgdCYmImxhdCJpbiB0P25ldyBNKHQubGF0LCJsbmciaW4gdD90LmxuZzp0Lmxvbix0LmFsdCk6dm9pZCAwPT09aT9udWxsOm5ldyBNKHQsaSxlKX1mdW5jdGlvbiBaKHQsaSxlLG4pe2lmKGVpKHQpKXJldHVybiB0aGlzLl9hPXRbMF0sdGhpcy5fYj10WzFdLHRoaXMuX2M9dFsyXSx2b2lkKHRoaXMuX2Q9dFszXSk7dGhpcy5fYT10LHRoaXMuX2I9aSx0aGlzLl9jPWUsdGhpcy5fZD1ufWZ1bmN0aW9uIFModCxpLGUsbil7cmV0dXJuIG5ldyBaKHQsaSxlLG4pfWZ1bmN0aW9uIEUodCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHQpfWZ1bmN0aW9uIGsodCxpKXt2YXIgZSxuLG8scyxyLGEsaD0iIjtmb3IoZT0wLG89dC5sZW5ndGg7ZTxvO2UrKyl7Zm9yKG49MCxzPShyPXRbZV0pLmxlbmd0aDtuPHM7bisrKWE9cltuXSxoKz0obj8iTCI6Ik0iKSthLngrIiAiK2EueTtoKz1pP1hpPyJ6IjoieCI6IiJ9cmV0dXJuIGh8fCJNMCAwIn1mdW5jdGlvbiBBKHQpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0KT49MH1mdW5jdGlvbiBJKHQsaSxlLG4pe3JldHVybiJ0b3VjaHN0YXJ0Ij09PWk/Tyh0LGUsbik6InRvdWNobW92ZSI9PT1pP1codCxlLG4pOiJ0b3VjaGVuZCI9PT1pJiZIKHQsZSxuKSx0aGlzfWZ1bmN0aW9uIEIodCxpLGUpe3ZhciBuPXRbIl9sZWFmbGV0XyIraStlXTtyZXR1cm4idG91Y2hzdGFydCI9PT1pP3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihRaSxuLCExKToidG91Y2htb3ZlIj09PWk/dC5yZW1vdmVFdmVudExpc3RlbmVyKHRlLG4sITEpOiJ0b3VjaGVuZCI9PT1pJiYodC5yZW1vdmVFdmVudExpc3RlbmVyKGllLG4sITEpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlZSxuLCExKSksdGhpc31mdW5jdGlvbiBPKHQsaSxuKXt2YXIgbz1lKGZ1bmN0aW9uKHQpe2lmKCJtb3VzZSIhPT10LnBvaW50ZXJUeXBlJiZ0Lk1TUE9JTlRFUl9UWVBFX01PVVNFJiZ0LnBvaW50ZXJUeXBlIT09dC5NU1BPSU5URVJfVFlQRV9NT1VTRSl7aWYoIShuZS5pbmRleE9mKHQudGFyZ2V0LnRhZ05hbWUpPDApKXJldHVybjskKHQpfWoodCxpKX0pO3RbIl9sZWFmbGV0X3RvdWNoc3RhcnQiK25dPW8sdC5hZGRFdmVudExpc3RlbmVyKFFpLG8sITEpLHNlfHwoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoUWksUiwhMCksZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodGUsRCwhMCksZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoaWUsTiwhMCksZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZWUsTiwhMCksc2U9ITApfWZ1bmN0aW9uIFIodCl7b2VbdC5wb2ludGVySWRdPXQscmUrK31mdW5jdGlvbiBEKHQpe29lW3QucG9pbnRlcklkXSYmKG9lW3QucG9pbnRlcklkXT10KX1mdW5jdGlvbiBOKHQpe2RlbGV0ZSBvZVt0LnBvaW50ZXJJZF0scmUtLX1mdW5jdGlvbiBqKHQsaSl7dC50b3VjaGVzPVtdO2Zvcih2YXIgZSBpbiBvZSl0LnRvdWNoZXMucHVzaChvZVtlXSk7dC5jaGFuZ2VkVG91Y2hlcz1bdF0saSh0KX1mdW5jdGlvbiBXKHQsaSxlKXt2YXIgbj1mdW5jdGlvbih0KXsodC5wb2ludGVyVHlwZSE9PXQuTVNQT0lOVEVSX1RZUEVfTU9VU0UmJiJtb3VzZSIhPT10LnBvaW50ZXJUeXBlfHwwIT09dC5idXR0b25zKSYmaih0LGkpfTt0WyJfbGVhZmxldF90b3VjaG1vdmUiK2VdPW4sdC5hZGRFdmVudExpc3RlbmVyKHRlLG4sITEpfWZ1bmN0aW9uIEgodCxpLGUpe3ZhciBuPWZ1bmN0aW9uKHQpe2oodCxpKX07dFsiX2xlYWZsZXRfdG91Y2hlbmQiK2VdPW4sdC5hZGRFdmVudExpc3RlbmVyKGllLG4sITEpLHQuYWRkRXZlbnRMaXN0ZW5lcihlZSxuLCExKX1mdW5jdGlvbiBGKHQsaSxlKXtmdW5jdGlvbiBuKHQpe3ZhciBpO2lmKFVpKXtpZighUGl8fCJtb3VzZSI9PT10LnBvaW50ZXJUeXBlKXJldHVybjtpPXJlfWVsc2UgaT10LnRvdWNoZXMubGVuZ3RoO2lmKCEoaT4xKSl7dmFyIGU9RGF0ZS5ub3coKSxuPWUtKHN8fGUpO3I9dC50b3VjaGVzP3QudG91Y2hlc1swXTp0LGE9bj4wJiZuPD1oLHM9ZX19ZnVuY3Rpb24gbyh0KXtpZihhJiYhci5jYW5jZWxCdWJibGUpe2lmKFVpKXtpZighUGl8fCJtb3VzZSI9PT10LnBvaW50ZXJUeXBlKXJldHVybjt2YXIgZSxuLG89e307Zm9yKG4gaW4gcillPXJbbl0sb1tuXT1lJiZlLmJpbmQ/ZS5iaW5kKHIpOmU7cj1vfXIudHlwZT0iZGJsY2xpY2siLGkocikscz1udWxsfX12YXIgcyxyLGE9ITEsaD0yNTA7cmV0dXJuIHRbdWUrYWUrZV09bix0W3VlK2hlK2VdPW8sdFt1ZSsiZGJsY2xpY2siK2VdPWksdC5hZGRFdmVudExpc3RlbmVyKGFlLG4sITEpLHQuYWRkRXZlbnRMaXN0ZW5lcihoZSxvLCExKSx0LmFkZEV2ZW50TGlzdGVuZXIoImRibGNsaWNrIixpLCExKSx0aGlzfWZ1bmN0aW9uIFUodCxpKXt2YXIgZT10W3VlK2FlK2ldLG49dFt1ZStoZStpXSxvPXRbdWUrImRibGNsaWNrIitpXTtyZXR1cm4gdC5yZW1vdmVFdmVudExpc3RlbmVyKGFlLGUsITEpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihoZSxuLCExKSxQaXx8dC5yZW1vdmVFdmVudExpc3RlbmVyKCJkYmxjbGljayIsbywhMSksdGhpc31mdW5jdGlvbiBWKHQsaSxlLG4pe2lmKCJvYmplY3QiPT10eXBlb2YgaSlmb3IodmFyIG8gaW4gaSlHKHQsbyxpW29dLGUpO2Vsc2UgZm9yKHZhciBzPTAscj0oaT11KGkpKS5sZW5ndGg7czxyO3MrKylHKHQsaVtzXSxlLG4pO3JldHVybiB0aGlzfWZ1bmN0aW9uIHEodCxpLGUsbil7aWYoIm9iamVjdCI9PXR5cGVvZiBpKWZvcih2YXIgbyBpbiBpKUsodCxvLGlbb10sZSk7ZWxzZSBpZihpKWZvcih2YXIgcz0wLHI9KGk9dShpKSkubGVuZ3RoO3M8cjtzKyspSyh0LGlbc10sZSxuKTtlbHNle2Zvcih2YXIgYSBpbiB0W2xlXSlLKHQsYSx0W2xlXVthXSk7ZGVsZXRlIHRbbGVdfXJldHVybiB0aGlzfWZ1bmN0aW9uIEcodCxpLGUsbyl7dmFyIHM9aStuKGUpKyhvPyJfIituKG8pOiIiKTtpZih0W2xlXSYmdFtsZV1bc10pcmV0dXJuIHRoaXM7dmFyIHI9ZnVuY3Rpb24oaSl7cmV0dXJuIGUuY2FsbChvfHx0LGl8fHdpbmRvdy5ldmVudCl9LGE9cjtVaSYmMD09PWkuaW5kZXhPZigidG91Y2giKT9JKHQsaSxyLHMpOiFWaXx8ImRibGNsaWNrIiE9PWl8fCFGfHxVaSYmU2k/ImFkZEV2ZW50TGlzdGVuZXIiaW4gdD8ibW91c2V3aGVlbCI9PT1pP3QuYWRkRXZlbnRMaXN0ZW5lcigib253aGVlbCJpbiB0PyJ3aGVlbCI6Im1vdXNld2hlZWwiLHIsITEpOiJtb3VzZWVudGVyIj09PWl8fCJtb3VzZWxlYXZlIj09PWk/KHI9ZnVuY3Rpb24oaSl7aT1pfHx3aW5kb3cuZXZlbnQsb3QodCxpKSYmYShpKX0sdC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIj09PWk/Im1vdXNlb3ZlciI6Im1vdXNlb3V0IixyLCExKSk6KCJjbGljayI9PT1pJiZUaSYmKHI9ZnVuY3Rpb24odCl7c3QodCxhKX0pLHQuYWRkRXZlbnRMaXN0ZW5lcihpLHIsITEpKToiYXR0YWNoRXZlbnQiaW4gdCYmdC5hdHRhY2hFdmVudCgib24iK2kscik6Rih0LHIscyksdFtsZV09dFtsZV18fHt9LHRbbGVdW3NdPXJ9ZnVuY3Rpb24gSyh0LGksZSxvKXt2YXIgcz1pK24oZSkrKG8/Il8iK24obyk6IiIpLHI9dFtsZV0mJnRbbGVdW3NdO2lmKCFyKXJldHVybiB0aGlzO1VpJiYwPT09aS5pbmRleE9mKCJ0b3VjaCIpP0IodCxpLHMpOiFWaXx8ImRibGNsaWNrIiE9PWl8fCFVfHxVaSYmU2k/InJlbW92ZUV2ZW50TGlzdGVuZXIiaW4gdD8ibW91c2V3aGVlbCI9PT1pP3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigib253aGVlbCJpbiB0PyJ3aGVlbCI6Im1vdXNld2hlZWwiLHIsITEpOnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciI9PT1pPyJtb3VzZW92ZXIiOiJtb3VzZWxlYXZlIj09PWk/Im1vdXNlb3V0IjppLHIsITEpOiJkZXRhY2hFdmVudCJpbiB0JiZ0LmRldGFjaEV2ZW50KCJvbiIraSxyKTpVKHQscyksdFtsZV1bc109bnVsbH1mdW5jdGlvbiBZKHQpe3JldHVybiB0LnN0b3BQcm9wYWdhdGlvbj90LnN0b3BQcm9wYWdhdGlvbigpOnQub3JpZ2luYWxFdmVudD90Lm9yaWdpbmFsRXZlbnQuX3N0b3BwZWQ9ITA6dC5jYW5jZWxCdWJibGU9ITAsbnQodCksdGhpc31mdW5jdGlvbiBYKHQpe3JldHVybiBHKHQsIm1vdXNld2hlZWwiLFkpLHRoaXN9ZnVuY3Rpb24gSih0KXtyZXR1cm4gVih0LCJtb3VzZWRvd24gdG91Y2hzdGFydCBkYmxjbGljayIsWSksRyh0LCJjbGljayIsZXQpLHRoaXN9ZnVuY3Rpb24gJCh0KXtyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdD90LnByZXZlbnREZWZhdWx0KCk6dC5yZXR1cm5WYWx1ZT0hMSx0aGlzfWZ1bmN0aW9uIFEodCl7cmV0dXJuICQodCksWSh0KSx0aGlzfWZ1bmN0aW9uIHR0KHQsaSl7aWYoIWkpcmV0dXJuIG5ldyB4KHQuY2xpZW50WCx0LmNsaWVudFkpO3ZhciBlPWkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1lLndpZHRoL2kub2Zmc2V0V2lkdGh8fDEsbz1lLmhlaWdodC9pLm9mZnNldEhlaWdodHx8MTtyZXR1cm4gbmV3IHgodC5jbGllbnRYL24tZS5sZWZ0LWkuY2xpZW50TGVmdCx0LmNsaWVudFkvby1lLnRvcC1pLmNsaWVudFRvcCl9ZnVuY3Rpb24gaXQodCl7cmV0dXJuIFBpP3Qud2hlZWxEZWx0YVkvMjp0LmRlbHRhWSYmMD09PXQuZGVsdGFNb2RlPy10LmRlbHRhWS9jZTp0LmRlbHRhWSYmMT09PXQuZGVsdGFNb2RlPzIwKi10LmRlbHRhWTp0LmRlbHRhWSYmMj09PXQuZGVsdGFNb2RlPzYwKi10LmRlbHRhWTp0LmRlbHRhWHx8dC5kZWx0YVo/MDp0LndoZWVsRGVsdGE/KHQud2hlZWxEZWx0YVl8fHQud2hlZWxEZWx0YSkvMjp0LmRldGFpbCYmTWF0aC5hYnModC5kZXRhaWwpPDMyNzY1PzIwKi10LmRldGFpbDp0LmRldGFpbD90LmRldGFpbC8tMzI3NjUqNjA6MH1mdW5jdGlvbiBldCh0KXtfZVt0LnR5cGVdPSEwfWZ1bmN0aW9uIG50KHQpe3ZhciBpPV9lW3QudHlwZV07cmV0dXJuIF9lW3QudHlwZV09ITEsaX1mdW5jdGlvbiBvdCh0LGkpe3ZhciBlPWkucmVsYXRlZFRhcmdldDtpZighZSlyZXR1cm4hMDt0cnl7Zm9yKDtlJiZlIT09dDspZT1lLnBhcmVudE5vZGV9Y2F0Y2godCl7cmV0dXJuITF9cmV0dXJuIGUhPT10fWZ1bmN0aW9uIHN0KHQsaSl7dmFyIGU9dC50aW1lU3RhbXB8fHQub3JpZ2luYWxFdmVudCYmdC5vcmlnaW5hbEV2ZW50LnRpbWVTdGFtcCxuPXBpJiZlLXBpO24mJm4+MTAwJiZuPDUwMHx8dC50YXJnZXQuX3NpbXVsYXRlZENsaWNrJiYhdC5fc2ltdWxhdGVkP1EodCk6KHBpPWUsaSh0KSl9ZnVuY3Rpb24gcnQodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHQpOnR9ZnVuY3Rpb24gYXQodCxpKXt2YXIgZT10LnN0eWxlW2ldfHx0LmN1cnJlbnRTdHlsZSYmdC5jdXJyZW50U3R5bGVbaV07aWYoKCFlfHwiYXV0byI9PT1lKSYmZG9jdW1lbnQuZGVmYXVsdFZpZXcpe3ZhciBuPWRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodCxudWxsKTtlPW4/bltpXTpudWxsfXJldHVybiJhdXRvIj09PWU/bnVsbDplfWZ1bmN0aW9uIGh0KHQsaSxlKXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHQpO3JldHVybiBuLmNsYXNzTmFtZT1pfHwiIixlJiZlLmFwcGVuZENoaWxkKG4pLG59ZnVuY3Rpb24gdXQodCl7dmFyIGk9dC5wYXJlbnROb2RlO2kmJmkucmVtb3ZlQ2hpbGQodCl9ZnVuY3Rpb24gbHQodCl7Zm9yKDt0LmZpcnN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKX1mdW5jdGlvbiBjdCh0KXt2YXIgaT10LnBhcmVudE5vZGU7aS5sYXN0Q2hpbGQhPT10JiZpLmFwcGVuZENoaWxkKHQpfWZ1bmN0aW9uIF90KHQpe3ZhciBpPXQucGFyZW50Tm9kZTtpLmZpcnN0Q2hpbGQhPT10JiZpLmluc2VydEJlZm9yZSh0LGkuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gZHQodCxpKXtpZih2b2lkIDAhPT10LmNsYXNzTGlzdClyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoaSk7dmFyIGU9Z3QodCk7cmV0dXJuIGUubGVuZ3RoPjAmJm5ldyBSZWdFeHAoIihefFxccykiK2krIihcXHN8JCkiKS50ZXN0KGUpfWZ1bmN0aW9uIHB0KHQsaSl7aWYodm9pZCAwIT09dC5jbGFzc0xpc3QpZm9yKHZhciBlPXUoaSksbj0wLG89ZS5sZW5ndGg7bjxvO24rKyl0LmNsYXNzTGlzdC5hZGQoZVtuXSk7ZWxzZSBpZighZHQodCxpKSl7dmFyIHM9Z3QodCk7ZnQodCwocz9zKyIgIjoiIikraSl9fWZ1bmN0aW9uIG10KHQsaSl7dm9pZCAwIT09dC5jbGFzc0xpc3Q/dC5jbGFzc0xpc3QucmVtb3ZlKGkpOmZ0KHQsaCgoIiAiK2d0KHQpKyIgIikucmVwbGFjZSgiICIraSsiICIsIiAiKSkpfWZ1bmN0aW9uIGZ0KHQsaSl7dm9pZCAwPT09dC5jbGFzc05hbWUuYmFzZVZhbD90LmNsYXNzTmFtZT1pOnQuY2xhc3NOYW1lLmJhc2VWYWw9aX1mdW5jdGlvbiBndCh0KXtyZXR1cm4gdm9pZCAwPT09dC5jbGFzc05hbWUuYmFzZVZhbD90LmNsYXNzTmFtZTp0LmNsYXNzTmFtZS5iYXNlVmFsfWZ1bmN0aW9uIHZ0KHQsaSl7Im9wYWNpdHkiaW4gdC5zdHlsZT90LnN0eWxlLm9wYWNpdHk9aToiZmlsdGVyImluIHQuc3R5bGUmJnl0KHQsaSl9ZnVuY3Rpb24geXQodCxpKXt2YXIgZT0hMSxuPSJEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYSI7dHJ5e2U9dC5maWx0ZXJzLml0ZW0obil9Y2F0Y2godCl7aWYoMT09PWkpcmV0dXJufWk9TWF0aC5yb3VuZCgxMDAqaSksZT8oZS5FbmFibGVkPTEwMCE9PWksZS5PcGFjaXR5PWkpOnQuc3R5bGUuZmlsdGVyKz0iIHByb2dpZDoiK24rIihvcGFjaXR5PSIraSsiKSJ9ZnVuY3Rpb24geHQodCl7Zm9yKHZhciBpPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxlPTA7ZTx0Lmxlbmd0aDtlKyspaWYodFtlXWluIGkpcmV0dXJuIHRbZV07cmV0dXJuITF9ZnVuY3Rpb24gd3QodCxpLGUpe3ZhciBuPWl8fG5ldyB4KDAsMCk7dC5zdHlsZVtwZV09KE9pPyJ0cmFuc2xhdGUoIituLngrInB4LCIrbi55KyJweCkiOiJ0cmFuc2xhdGUzZCgiK24ueCsicHgsIituLnkrInB4LDApIikrKGU/IiBzY2FsZSgiK2UrIikiOiIiKX1mdW5jdGlvbiBMdCh0LGkpe3QuX2xlYWZsZXRfcG9zPWksTmk/d3QodCxpKToodC5zdHlsZS5sZWZ0PWkueCsicHgiLHQuc3R5bGUudG9wPWkueSsicHgiKX1mdW5jdGlvbiBQdCh0KXtyZXR1cm4gdC5fbGVhZmxldF9wb3N8fG5ldyB4KDAsMCl9ZnVuY3Rpb24gYnQoKXtWKHdpbmRvdywiZHJhZ3N0YXJ0IiwkKX1mdW5jdGlvbiBUdCgpe3Eod2luZG93LCJkcmFnc3RhcnQiLCQpfWZ1bmN0aW9uIHp0KHQpe2Zvcig7LTE9PT10LnRhYkluZGV4Oyl0PXQucGFyZW50Tm9kZTt0LnN0eWxlJiYoTXQoKSx2ZT10LHllPXQuc3R5bGUub3V0bGluZSx0LnN0eWxlLm91dGxpbmU9Im5vbmUiLFYod2luZG93LCJrZXlkb3duIixNdCkpfWZ1bmN0aW9uIE10KCl7dmUmJih2ZS5zdHlsZS5vdXRsaW5lPXllLHZlPXZvaWQgMCx5ZT12b2lkIDAscSh3aW5kb3csImtleWRvd24iLE10KSl9ZnVuY3Rpb24gQ3QodCxpKXtpZighaXx8IXQubGVuZ3RoKXJldHVybiB0LnNsaWNlKCk7dmFyIGU9aSppO3JldHVybiB0PWt0KHQsZSksdD1TdCh0LGUpfWZ1bmN0aW9uIFp0KHQsaSxlKXtyZXR1cm4gTWF0aC5zcXJ0KFJ0KHQsaSxlLCEwKSl9ZnVuY3Rpb24gU3QodCxpKXt2YXIgZT10Lmxlbmd0aCxuPW5ldyh0eXBlb2YgVWludDhBcnJheSE9dm9pZCAwKyIiP1VpbnQ4QXJyYXk6QXJyYXkpKGUpO25bMF09bltlLTFdPTEsRXQodCxuLGksMCxlLTEpO3ZhciBvLHM9W107Zm9yKG89MDtvPGU7bysrKW5bb10mJnMucHVzaCh0W29dKTtyZXR1cm4gc31mdW5jdGlvbiBFdCh0LGksZSxuLG8pe3ZhciBzLHIsYSxoPTA7Zm9yKHI9bisxO3I8PW8tMTtyKyspKGE9UnQodFtyXSx0W25dLHRbb10sITApKT5oJiYocz1yLGg9YSk7aD5lJiYoaVtzXT0xLEV0KHQsaSxlLG4scyksRXQodCxpLGUscyxvKSl9ZnVuY3Rpb24ga3QodCxpKXtmb3IodmFyIGU9W3RbMF1dLG49MSxvPTAscz10Lmxlbmd0aDtuPHM7bisrKU90KHRbbl0sdFtvXSk+aSYmKGUucHVzaCh0W25dKSxvPW4pO3JldHVybiBvPHMtMSYmZS5wdXNoKHRbcy0xXSksZX1mdW5jdGlvbiBBdCh0LGksZSxuLG8pe3ZhciBzLHIsYSxoPW4/U2U6QnQodCxlKSx1PUJ0KGksZSk7Zm9yKFNlPXU7Oyl7aWYoIShofHUpKXJldHVyblt0LGldO2lmKGgmdSlyZXR1cm4hMTthPUJ0KHI9SXQodCxpLHM9aHx8dSxlLG8pLGUpLHM9PT1oPyh0PXIsaD1hKTooaT1yLHU9YSl9fWZ1bmN0aW9uIEl0KHQsaSxlLG4sbyl7dmFyIHMscixhPWkueC10LngsaD1pLnktdC55LHU9bi5taW4sbD1uLm1heDtyZXR1cm4gOCZlPyhzPXQueCthKihsLnktdC55KS9oLHI9bC55KTo0JmU/KHM9dC54K2EqKHUueS10LnkpL2gscj11LnkpOjImZT8ocz1sLngscj10LnkraCoobC54LXQueCkvYSk6MSZlJiYocz11Lngscj10LnkraCoodS54LXQueCkvYSksbmV3IHgocyxyLG8pfWZ1bmN0aW9uIEJ0KHQsaSl7dmFyIGU9MDtyZXR1cm4gdC54PGkubWluLng/ZXw9MTp0Lng+aS5tYXgueCYmKGV8PTIpLHQueTxpLm1pbi55P2V8PTQ6dC55PmkubWF4LnkmJihlfD04KSxlfWZ1bmN0aW9uIE90KHQsaSl7dmFyIGU9aS54LXQueCxuPWkueS10Lnk7cmV0dXJuIGUqZStuKm59ZnVuY3Rpb24gUnQodCxpLGUsbil7dmFyIG8scz1pLngscj1pLnksYT1lLngtcyxoPWUueS1yLHU9YSphK2gqaDtyZXR1cm4gdT4wJiYoKG89KCh0LngtcykqYSsodC55LXIpKmgpL3UpPjE/KHM9ZS54LHI9ZS55KTpvPjAmJihzKz1hKm8scis9aCpvKSksYT10LngtcyxoPXQueS1yLG4/YSphK2gqaDpuZXcgeChzLHIpfWZ1bmN0aW9uIER0KHQpe3JldHVybiFlaSh0WzBdKXx8Im9iamVjdCIhPXR5cGVvZiB0WzBdWzBdJiZ2b2lkIDAhPT10WzBdWzBdfWZ1bmN0aW9uIE50KHQpe3JldHVybiBjb25zb2xlLndhcm4oIkRlcHJlY2F0ZWQgdXNlIG9mIF9mbGF0LCBwbGVhc2UgdXNlIEwuTGluZVV0aWwuaXNGbGF0IGluc3RlYWQuIiksRHQodCl9ZnVuY3Rpb24ganQodCxpLGUpe3ZhciBuLG8scyxyLGEsaCx1LGwsYyxfPVsxLDQsMiw4XTtmb3Iobz0wLHU9dC5sZW5ndGg7bzx1O28rKyl0W29dLl9jb2RlPUJ0KHRbb10saSk7Zm9yKHI9MDtyPDQ7cisrKXtmb3IobD1fW3JdLG49W10sbz0wLHM9KHU9dC5sZW5ndGgpLTE7bzx1O3M9bysrKWE9dFtvXSxoPXRbc10sYS5fY29kZSZsP2guX2NvZGUmbHx8KChjPUl0KGgsYSxsLGksZSkpLl9jb2RlPUJ0KGMsaSksbi5wdXNoKGMpKTooaC5fY29kZSZsJiYoKGM9SXQoaCxhLGwsaSxlKSkuX2NvZGU9QnQoYyxpKSxuLnB1c2goYykpLG4ucHVzaChhKSk7dD1ufXJldHVybiB0fWZ1bmN0aW9uIFd0KHQsaSl7dmFyIGUsbixvLHMscj0iRmVhdHVyZSI9PT10LnR5cGU/dC5nZW9tZXRyeTp0LGE9cj9yLmNvb3JkaW5hdGVzOm51bGwsaD1bXSx1PWkmJmkucG9pbnRUb0xheWVyLGw9aSYmaS5jb29yZHNUb0xhdExuZ3x8SHQ7aWYoIWEmJiFyKXJldHVybiBudWxsO3N3aXRjaChyLnR5cGUpe2Nhc2UiUG9pbnQiOnJldHVybiBlPWwoYSksdT91KHQsZSk6bmV3IFhlKGUpO2Nhc2UiTXVsdGlQb2ludCI6Zm9yKG89MCxzPWEubGVuZ3RoO288cztvKyspZT1sKGFbb10pLGgucHVzaCh1P3UodCxlKTpuZXcgWGUoZSkpO3JldHVybiBuZXcgcWUoaCk7Y2FzZSJMaW5lU3RyaW5nIjpjYXNlIk11bHRpTGluZVN0cmluZyI6cmV0dXJuIG49RnQoYSwiTGluZVN0cmluZyI9PT1yLnR5cGU/MDoxLGwpLG5ldyB0bihuLGkpO2Nhc2UiUG9seWdvbiI6Y2FzZSJNdWx0aVBvbHlnb24iOnJldHVybiBuPUZ0KGEsIlBvbHlnb24iPT09ci50eXBlPzE6MixsKSxuZXcgZW4obixpKTtjYXNlIkdlb21ldHJ5Q29sbGVjdGlvbiI6Zm9yKG89MCxzPXIuZ2VvbWV0cmllcy5sZW5ndGg7bzxzO28rKyl7dmFyIGM9V3Qoe2dlb21ldHJ5OnIuZ2VvbWV0cmllc1tvXSx0eXBlOiJGZWF0dXJlIixwcm9wZXJ0aWVzOnQucHJvcGVydGllc30saSk7YyYmaC5wdXNoKGMpfXJldHVybiBuZXcgcWUoaCk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgR2VvSlNPTiBvYmplY3QuIil9fWZ1bmN0aW9uIEh0KHQpe3JldHVybiBuZXcgTSh0WzFdLHRbMF0sdFsyXSl9ZnVuY3Rpb24gRnQodCxpLGUpe2Zvcih2YXIgbixvPVtdLHM9MCxyPXQubGVuZ3RoO3M8cjtzKyspbj1pP0Z0KHRbc10saS0xLGUpOihlfHxIdCkodFtzXSksby5wdXNoKG4pO3JldHVybiBvfWZ1bmN0aW9uIFV0KHQsaSl7cmV0dXJuIGk9Im51bWJlciI9PXR5cGVvZiBpP2k6Nix2b2lkIDAhPT10LmFsdD9bYSh0LmxuZyxpKSxhKHQubGF0LGkpLGEodC5hbHQsaSldOlthKHQubG5nLGkpLGEodC5sYXQsaSldfWZ1bmN0aW9uIFZ0KHQsaSxlLG4pe2Zvcih2YXIgbz1bXSxzPTAscj10Lmxlbmd0aDtzPHI7cysrKW8ucHVzaChpP1Z0KHRbc10saS0xLGUsbik6VXQodFtzXSxuKSk7cmV0dXJuIWkmJmUmJm8ucHVzaChvWzBdKSxvfWZ1bmN0aW9uIHF0KHQsZSl7cmV0dXJuIHQuZmVhdHVyZT9pKHt9LHQuZmVhdHVyZSx7Z2VvbWV0cnk6ZX0pOkd0KGUpfWZ1bmN0aW9uIEd0KHQpe3JldHVybiJGZWF0dXJlIj09PXQudHlwZXx8IkZlYXR1cmVDb2xsZWN0aW9uIj09PXQudHlwZT90Ont0eXBlOiJGZWF0dXJlIixwcm9wZXJ0aWVzOnt9LGdlb21ldHJ5OnR9fWZ1bmN0aW9uIEt0KHQsaSl7cmV0dXJuIG5ldyBubih0LGkpfWZ1bmN0aW9uIFl0KHQsaSl7cmV0dXJuIG5ldyBkbih0LGkpfWZ1bmN0aW9uIFh0KHQpe3JldHVybiBZaT9uZXcgZm4odCk6bnVsbH1mdW5jdGlvbiBKdCh0KXtyZXR1cm4gWGl8fEppP25ldyB4bih0KTpudWxsfXZhciAkdD1PYmplY3QuZnJlZXplO09iamVjdC5mcmVlemU9ZnVuY3Rpb24odCl7cmV0dXJuIHR9O3ZhciBRdD1PYmplY3QuY3JlYXRlfHxmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIGZ1bmN0aW9uKGkpe3JldHVybiB0LnByb3RvdHlwZT1pLG5ldyB0fX0oKSx0aT0wLGlpPS9ceyAqKFtcd18tXSspICpcfS9nLGVpPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9LG5pPSJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFEL0FDd0FBQUFBQVFBQkFBQUNBRHM9IixvaT0wLHNpPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHAoIlJlcXVlc3RBbmltYXRpb25GcmFtZSIpfHxtLHJpPXdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZXx8cCgiQ2FuY2VsQW5pbWF0aW9uRnJhbWUiKXx8cCgiQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lIil8fGZ1bmN0aW9uKHQpe3dpbmRvdy5jbGVhclRpbWVvdXQodCl9LGFpPShPYmplY3QuZnJlZXplfHxPYmplY3QpKHtmcmVlemU6JHQsZXh0ZW5kOmksY3JlYXRlOlF0LGJpbmQ6ZSxsYXN0SWQ6dGksc3RhbXA6bix0aHJvdHRsZTpvLHdyYXBOdW06cyxmYWxzZUZuOnIsZm9ybWF0TnVtOmEsdHJpbTpoLHNwbGl0V29yZHM6dSxzZXRPcHRpb25zOmwsZ2V0UGFyYW1TdHJpbmc6Yyx0ZW1wbGF0ZTpfLGlzQXJyYXk6ZWksaW5kZXhPZjpkLGVtcHR5SW1hZ2VVcmw6bmkscmVxdWVzdEZuOnNpLGNhbmNlbEZuOnJpLHJlcXVlc3RBbmltRnJhbWU6ZixjYW5jZWxBbmltRnJhbWU6Z30pO3YuZXh0ZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKCl7dGhpcy5pbml0aWFsaXplJiZ0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuY2FsbEluaXRIb29rcygpfSxuPWUuX19zdXBlcl9fPXRoaXMucHJvdG90eXBlLG89UXQobik7by5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlPW87Zm9yKHZhciBzIGluIHRoaXMpdGhpcy5oYXNPd25Qcm9wZXJ0eShzKSYmInByb3RvdHlwZSIhPT1zJiYiX19zdXBlcl9fIiE9PXMmJihlW3NdPXRoaXNbc10pO3JldHVybiB0LnN0YXRpY3MmJihpKGUsdC5zdGF0aWNzKSxkZWxldGUgdC5zdGF0aWNzKSx0LmluY2x1ZGVzJiYoeSh0LmluY2x1ZGVzKSxpLmFwcGx5KG51bGwsW29dLmNvbmNhdCh0LmluY2x1ZGVzKSksZGVsZXRlIHQuaW5jbHVkZXMpLG8ub3B0aW9ucyYmKHQub3B0aW9ucz1pKFF0KG8ub3B0aW9ucyksdC5vcHRpb25zKSksaShvLHQpLG8uX2luaXRIb29rcz1bXSxvLmNhbGxJbml0SG9va3M9ZnVuY3Rpb24oKXtpZighdGhpcy5faW5pdEhvb2tzQ2FsbGVkKXtuLmNhbGxJbml0SG9va3MmJm4uY2FsbEluaXRIb29rcy5jYWxsKHRoaXMpLHRoaXMuX2luaXRIb29rc0NhbGxlZD0hMDtmb3IodmFyIHQ9MCxpPW8uX2luaXRIb29rcy5sZW5ndGg7dDxpO3QrKylvLl9pbml0SG9va3NbdF0uY2FsbCh0aGlzKX19LGV9LHYuaW5jbHVkZT1mdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLnByb3RvdHlwZSx0KSx0aGlzfSx2Lm1lcmdlT3B0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLnByb3RvdHlwZS5vcHRpb25zLHQpLHRoaXN9LHYuYWRkSW5pdEhvb2s9ZnVuY3Rpb24odCl7dmFyIGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbigpe3RoaXNbdF0uYXBwbHkodGhpcyxpKX07cmV0dXJuIHRoaXMucHJvdG90eXBlLl9pbml0SG9va3M9dGhpcy5wcm90b3R5cGUuX2luaXRIb29rc3x8W10sdGhpcy5wcm90b3R5cGUuX2luaXRIb29rcy5wdXNoKGUpLHRoaXN9O3ZhciBoaT17b246ZnVuY3Rpb24odCxpLGUpe2lmKCJvYmplY3QiPT10eXBlb2YgdClmb3IodmFyIG4gaW4gdCl0aGlzLl9vbihuLHRbbl0saSk7ZWxzZSBmb3IodmFyIG89MCxzPSh0PXUodCkpLmxlbmd0aDtvPHM7bysrKXRoaXMuX29uKHRbb10saSxlKTtyZXR1cm4gdGhpc30sb2ZmOmZ1bmN0aW9uKHQsaSxlKXtpZih0KWlmKCJvYmplY3QiPT10eXBlb2YgdClmb3IodmFyIG4gaW4gdCl0aGlzLl9vZmYobix0W25dLGkpO2Vsc2UgZm9yKHZhciBvPTAscz0odD11KHQpKS5sZW5ndGg7bzxzO28rKyl0aGlzLl9vZmYodFtvXSxpLGUpO2Vsc2UgZGVsZXRlIHRoaXMuX2V2ZW50cztyZXR1cm4gdGhpc30sX29uOmZ1bmN0aW9uKHQsaSxlKXt0aGlzLl9ldmVudHM9dGhpcy5fZXZlbnRzfHx7fTt2YXIgbj10aGlzLl9ldmVudHNbdF07bnx8KG49W10sdGhpcy5fZXZlbnRzW3RdPW4pLGU9PT10aGlzJiYoZT12b2lkIDApO2Zvcih2YXIgbz17Zm46aSxjdHg6ZX0scz1uLHI9MCxhPXMubGVuZ3RoO3I8YTtyKyspaWYoc1tyXS5mbj09PWkmJnNbcl0uY3R4PT09ZSlyZXR1cm47cy5wdXNoKG8pfSxfb2ZmOmZ1bmN0aW9uKHQsaSxlKXt2YXIgbixvLHM7aWYodGhpcy5fZXZlbnRzJiYobj10aGlzLl9ldmVudHNbdF0pKWlmKGkpe2lmKGU9PT10aGlzJiYoZT12b2lkIDApLG4pZm9yKG89MCxzPW4ubGVuZ3RoO288cztvKyspe3ZhciBhPW5bb107aWYoYS5jdHg9PT1lJiZhLmZuPT09aSlyZXR1cm4gYS5mbj1yLHRoaXMuX2ZpcmluZ0NvdW50JiYodGhpcy5fZXZlbnRzW3RdPW49bi5zbGljZSgpKSx2b2lkIG4uc3BsaWNlKG8sMSl9fWVsc2V7Zm9yKG89MCxzPW4ubGVuZ3RoO288cztvKyspbltvXS5mbj1yO2RlbGV0ZSB0aGlzLl9ldmVudHNbdF19fSxmaXJlOmZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5saXN0ZW5zKHQsbikpcmV0dXJuIHRoaXM7dmFyIG89aSh7fSxlLHt0eXBlOnQsdGFyZ2V0OnRoaXMsc291cmNlVGFyZ2V0OmUmJmUuc291cmNlVGFyZ2V0fHx0aGlzfSk7aWYodGhpcy5fZXZlbnRzKXt2YXIgcz10aGlzLl9ldmVudHNbdF07aWYocyl7dGhpcy5fZmlyaW5nQ291bnQ9dGhpcy5fZmlyaW5nQ291bnQrMXx8MTtmb3IodmFyIHI9MCxhPXMubGVuZ3RoO3I8YTtyKyspe3ZhciBoPXNbcl07aC5mbi5jYWxsKGguY3R4fHx0aGlzLG8pfXRoaXMuX2ZpcmluZ0NvdW50LS19fXJldHVybiBuJiZ0aGlzLl9wcm9wYWdhdGVFdmVudChvKSx0aGlzfSxsaXN0ZW5zOmZ1bmN0aW9uKHQsaSl7dmFyIGU9dGhpcy5fZXZlbnRzJiZ0aGlzLl9ldmVudHNbdF07aWYoZSYmZS5sZW5ndGgpcmV0dXJuITA7aWYoaSlmb3IodmFyIG4gaW4gdGhpcy5fZXZlbnRQYXJlbnRzKWlmKHRoaXMuX2V2ZW50UGFyZW50c1tuXS5saXN0ZW5zKHQsaSkpcmV0dXJuITA7cmV0dXJuITF9LG9uY2U6ZnVuY3Rpb24odCxpLG4pe2lmKCJvYmplY3QiPT10eXBlb2YgdCl7Zm9yKHZhciBvIGluIHQpdGhpcy5vbmNlKG8sdFtvXSxpKTtyZXR1cm4gdGhpc312YXIgcz1lKGZ1bmN0aW9uKCl7dGhpcy5vZmYodCxpLG4pLm9mZih0LHMsbil9LHRoaXMpO3JldHVybiB0aGlzLm9uKHQsaSxuKS5vbih0LHMsbil9LGFkZEV2ZW50UGFyZW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ldmVudFBhcmVudHM9dGhpcy5fZXZlbnRQYXJlbnRzfHx7fSx0aGlzLl9ldmVudFBhcmVudHNbbih0KV09dCx0aGlzfSxyZW1vdmVFdmVudFBhcmVudDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZXZlbnRQYXJlbnRzJiZkZWxldGUgdGhpcy5fZXZlbnRQYXJlbnRzW24odCldLHRoaXN9LF9wcm9wYWdhdGVFdmVudDpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcy5fZXZlbnRQYXJlbnRzKXRoaXMuX2V2ZW50UGFyZW50c1tlXS5maXJlKHQudHlwZSxpKHtsYXllcjp0LnRhcmdldCxwcm9wYWdhdGVkRnJvbTp0LnRhcmdldH0sdCksITApfX07aGkuYWRkRXZlbnRMaXN0ZW5lcj1oaS5vbixoaS5yZW1vdmVFdmVudExpc3RlbmVyPWhpLmNsZWFyQWxsRXZlbnRMaXN0ZW5lcnM9aGkub2ZmLGhpLmFkZE9uZVRpbWVFdmVudExpc3RlbmVyPWhpLm9uY2UsaGkuZmlyZUV2ZW50PWhpLmZpcmUsaGkuaGFzRXZlbnRMaXN0ZW5lcnM9aGkubGlzdGVuczt2YXIgdWk9di5leHRlbmQoaGkpLGxpPU1hdGgudHJ1bmN8fGZ1bmN0aW9uKHQpe3JldHVybiB0PjA/TWF0aC5mbG9vcih0KTpNYXRoLmNlaWwodCl9O3gucHJvdG90eXBlPXtjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgeCh0aGlzLngsdGhpcy55KX0sYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX2FkZCh3KHQpKX0sX2FkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpc30sc3VidHJhY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fc3VidHJhY3Qodyh0KSl9LF9zdWJ0cmFjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpc30sZGl2aWRlQnk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2aWRlQnkodCl9LF9kaXZpZGVCeTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Lz10LHRoaXMueS89dCx0aGlzfSxtdWx0aXBseUJ5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX211bHRpcGx5QnkodCl9LF9tdWx0aXBseUJ5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXN9LHNjYWxlQnk6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB4KHRoaXMueCp0LngsdGhpcy55KnQueSl9LHVuc2NhbGVCeTpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHgodGhpcy54L3QueCx0aGlzLnkvdC55KX0scm91bmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3VuZCgpfSxfcm91bmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXN9LGZsb29yOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fZmxvb3IoKX0sX2Zsb29yOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzfSxjZWlsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fY2VpbCgpfSxfY2VpbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXN9LHRydW5jOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fdHJ1bmMoKX0sX3RydW5jOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueD1saSh0aGlzLngpLHRoaXMueT1saSh0aGlzLnkpLHRoaXN9LGRpc3RhbmNlVG86ZnVuY3Rpb24odCl7dmFyIGk9KHQ9dyh0KSkueC10aGlzLngsZT10LnktdGhpcy55O3JldHVybiBNYXRoLnNxcnQoaSppK2UqZSl9LGVxdWFsczpmdW5jdGlvbih0KXtyZXR1cm4odD13KHQpKS54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnl9LGNvbnRhaW5zOmZ1bmN0aW9uKHQpe3JldHVybiB0PXcodCksTWF0aC5hYnModC54KTw9TWF0aC5hYnModGhpcy54KSYmTWF0aC5hYnModC55KTw9TWF0aC5hYnModGhpcy55KX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iUG9pbnQoIithKHRoaXMueCkrIiwgIithKHRoaXMueSkrIikifX0sUC5wcm90b3R5cGU9e2V4dGVuZDpmdW5jdGlvbih0KXtyZXR1cm4gdD13KHQpLHRoaXMubWlufHx0aGlzLm1heD8odGhpcy5taW4ueD1NYXRoLm1pbih0LngsdGhpcy5taW4ueCksdGhpcy5tYXgueD1NYXRoLm1heCh0LngsdGhpcy5tYXgueCksdGhpcy5taW4ueT1NYXRoLm1pbih0LnksdGhpcy5taW4ueSksdGhpcy5tYXgueT1NYXRoLm1heCh0LnksdGhpcy5tYXgueSkpOih0aGlzLm1pbj10LmNsb25lKCksdGhpcy5tYXg9dC5jbG9uZSgpKSx0aGlzfSxnZXRDZW50ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB4KCh0aGlzLm1pbi54K3RoaXMubWF4LngpLzIsKHRoaXMubWluLnkrdGhpcy5tYXgueSkvMix0KX0sZ2V0Qm90dG9tTGVmdDpmdW5jdGlvbigpe3JldHVybiBuZXcgeCh0aGlzLm1pbi54LHRoaXMubWF4LnkpfSxnZXRUb3BSaWdodDpmdW5jdGlvbigpe3JldHVybiBuZXcgeCh0aGlzLm1heC54LHRoaXMubWluLnkpfSxnZXRUb3BMZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWlufSxnZXRCb3R0b21SaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heH0sZ2V0U2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heC5zdWJ0cmFjdCh0aGlzLm1pbil9LGNvbnRhaW5zOmZ1bmN0aW9uKHQpe3ZhciBpLGU7cmV0dXJuKHQ9Im51bWJlciI9PXR5cGVvZiB0WzBdfHx0IGluc3RhbmNlb2YgeD93KHQpOmIodCkpaW5zdGFuY2VvZiBQPyhpPXQubWluLGU9dC5tYXgpOmk9ZT10LGkueD49dGhpcy5taW4ueCYmZS54PD10aGlzLm1heC54JiZpLnk+PXRoaXMubWluLnkmJmUueTw9dGhpcy5tYXgueX0saW50ZXJzZWN0czpmdW5jdGlvbih0KXt0PWIodCk7dmFyIGk9dGhpcy5taW4sZT10aGlzLm1heCxuPXQubWluLG89dC5tYXgscz1vLng+PWkueCYmbi54PD1lLngscj1vLnk+PWkueSYmbi55PD1lLnk7cmV0dXJuIHMmJnJ9LG92ZXJsYXBzOmZ1bmN0aW9uKHQpe3Q9Yih0KTt2YXIgaT10aGlzLm1pbixlPXRoaXMubWF4LG49dC5taW4sbz10Lm1heCxzPW8ueD5pLngmJm4ueDxlLngscj1vLnk+aS55JiZuLnk8ZS55O3JldHVybiBzJiZyfSxpc1ZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuISghdGhpcy5taW58fCF0aGlzLm1heCl9fSxULnByb3RvdHlwZT17ZXh0ZW5kOmZ1bmN0aW9uKHQpe3ZhciBpLGUsbj10aGlzLl9zb3V0aFdlc3Qsbz10aGlzLl9ub3J0aEVhc3Q7aWYodCBpbnN0YW5jZW9mIE0paT10LGU9dDtlbHNle2lmKCEodCBpbnN0YW5jZW9mIFQpKXJldHVybiB0P3RoaXMuZXh0ZW5kKEModCl8fHoodCkpOnRoaXM7aWYoaT10Ll9zb3V0aFdlc3QsZT10Ll9ub3J0aEVhc3QsIWl8fCFlKXJldHVybiB0aGlzfXJldHVybiBufHxvPyhuLmxhdD1NYXRoLm1pbihpLmxhdCxuLmxhdCksbi5sbmc9TWF0aC5taW4oaS5sbmcsbi5sbmcpLG8ubGF0PU1hdGgubWF4KGUubGF0LG8ubGF0KSxvLmxuZz1NYXRoLm1heChlLmxuZyxvLmxuZykpOih0aGlzLl9zb3V0aFdlc3Q9bmV3IE0oaS5sYXQsaS5sbmcpLHRoaXMuX25vcnRoRWFzdD1uZXcgTShlLmxhdCxlLmxuZykpLHRoaXN9LHBhZDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9zb3V0aFdlc3QsZT10aGlzLl9ub3J0aEVhc3Qsbj1NYXRoLmFicyhpLmxhdC1lLmxhdCkqdCxvPU1hdGguYWJzKGkubG5nLWUubG5nKSp0O3JldHVybiBuZXcgVChuZXcgTShpLmxhdC1uLGkubG5nLW8pLG5ldyBNKGUubGF0K24sZS5sbmcrbykpfSxnZXRDZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE0oKHRoaXMuX3NvdXRoV2VzdC5sYXQrdGhpcy5fbm9ydGhFYXN0LmxhdCkvMiwodGhpcy5fc291dGhXZXN0LmxuZyt0aGlzLl9ub3J0aEVhc3QubG5nKS8yKX0sZ2V0U291dGhXZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXRoV2VzdH0sZ2V0Tm9ydGhFYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vcnRoRWFzdH0sZ2V0Tm9ydGhXZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNKHRoaXMuZ2V0Tm9ydGgoKSx0aGlzLmdldFdlc3QoKSl9LGdldFNvdXRoRWFzdDpmdW5jdGlvbigpe3JldHVybiBuZXcgTSh0aGlzLmdldFNvdXRoKCksdGhpcy5nZXRFYXN0KCkpfSxnZXRXZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXRoV2VzdC5sbmd9LGdldFNvdXRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvdXRoV2VzdC5sYXR9LGdldEVhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9ydGhFYXN0LmxuZ30sZ2V0Tm9ydGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9ydGhFYXN0LmxhdH0sY29udGFpbnM6ZnVuY3Rpb24odCl7dD0ibnVtYmVyIj09dHlwZW9mIHRbMF18fHQgaW5zdGFuY2VvZiBNfHwibGF0ImluIHQ/Qyh0KTp6KHQpO3ZhciBpLGUsbj10aGlzLl9zb3V0aFdlc3Qsbz10aGlzLl9ub3J0aEVhc3Q7cmV0dXJuIHQgaW5zdGFuY2VvZiBUPyhpPXQuZ2V0U291dGhXZXN0KCksZT10LmdldE5vcnRoRWFzdCgpKTppPWU9dCxpLmxhdD49bi5sYXQmJmUubGF0PD1vLmxhdCYmaS5sbmc+PW4ubG5nJiZlLmxuZzw9by5sbmd9LGludGVyc2VjdHM6ZnVuY3Rpb24odCl7dD16KHQpO3ZhciBpPXRoaXMuX3NvdXRoV2VzdCxlPXRoaXMuX25vcnRoRWFzdCxuPXQuZ2V0U291dGhXZXN0KCksbz10LmdldE5vcnRoRWFzdCgpLHM9by5sYXQ+PWkubGF0JiZuLmxhdDw9ZS5sYXQscj1vLmxuZz49aS5sbmcmJm4ubG5nPD1lLmxuZztyZXR1cm4gcyYmcn0sb3ZlcmxhcHM6ZnVuY3Rpb24odCl7dD16KHQpO3ZhciBpPXRoaXMuX3NvdXRoV2VzdCxlPXRoaXMuX25vcnRoRWFzdCxuPXQuZ2V0U291dGhXZXN0KCksbz10LmdldE5vcnRoRWFzdCgpLHM9by5sYXQ+aS5sYXQmJm4ubGF0PGUubGF0LHI9by5sbmc+aS5sbmcmJm4ubG5nPGUubG5nO3JldHVybiBzJiZyfSx0b0JCb3hTdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5nZXRXZXN0KCksdGhpcy5nZXRTb3V0aCgpLHRoaXMuZ2V0RWFzdCgpLHRoaXMuZ2V0Tm9ydGgoKV0uam9pbigiLCIpfSxlcXVhbHM6ZnVuY3Rpb24odCxpKXtyZXR1cm4hIXQmJih0PXoodCksdGhpcy5fc291dGhXZXN0LmVxdWFscyh0LmdldFNvdXRoV2VzdCgpLGkpJiZ0aGlzLl9ub3J0aEVhc3QuZXF1YWxzKHQuZ2V0Tm9ydGhFYXN0KCksaSkpfSxpc1ZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuISghdGhpcy5fc291dGhXZXN0fHwhdGhpcy5fbm9ydGhFYXN0KX19LE0ucHJvdG90eXBlPXtlcXVhbHM6ZnVuY3Rpb24odCxpKXtyZXR1cm4hIXQmJih0PUModCksTWF0aC5tYXgoTWF0aC5hYnModGhpcy5sYXQtdC5sYXQpLE1hdGguYWJzKHRoaXMubG5nLXQubG5nKSk8PSh2b2lkIDA9PT1pPzFlLTk6aSkpfSx0b1N0cmluZzpmdW5jdGlvbih0KXtyZXR1cm4iTGF0TG5nKCIrYSh0aGlzLmxhdCx0KSsiLCAiK2EodGhpcy5sbmcsdCkrIikifSxkaXN0YW5jZVRvOmZ1bmN0aW9uKHQpe3JldHVybiBfaS5kaXN0YW5jZSh0aGlzLEModCkpfSx3cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIF9pLndyYXBMYXRMbmcodGhpcyl9LHRvQm91bmRzOmZ1bmN0aW9uKHQpe3ZhciBpPTE4MCp0LzQwMDc1MDE3LGU9aS9NYXRoLmNvcyhNYXRoLlBJLzE4MCp0aGlzLmxhdCk7cmV0dXJuIHooW3RoaXMubGF0LWksdGhpcy5sbmctZV0sW3RoaXMubGF0K2ksdGhpcy5sbmcrZV0pfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgTSh0aGlzLmxhdCx0aGlzLmxuZyx0aGlzLmFsdCl9fTt2YXIgY2k9e2xhdExuZ1RvUG9pbnQ6ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLnByb2plY3Rpb24ucHJvamVjdCh0KSxuPXRoaXMuc2NhbGUoaSk7cmV0dXJuIHRoaXMudHJhbnNmb3JtYXRpb24uX3RyYW5zZm9ybShlLG4pfSxwb2ludFRvTGF0TG5nOmZ1bmN0aW9uKHQsaSl7dmFyIGU9dGhpcy5zY2FsZShpKSxuPXRoaXMudHJhbnNmb3JtYXRpb24udW50cmFuc2Zvcm0odCxlKTtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uLnVucHJvamVjdChuKX0scHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uLnByb2plY3QodCl9LHVucHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wcm9qZWN0aW9uLnVucHJvamVjdCh0KX0sc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIDI1NipNYXRoLnBvdygyLHQpfSx6b29tOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmxvZyh0LzI1NikvTWF0aC5MTjJ9LGdldFByb2plY3RlZEJvdW5kczpmdW5jdGlvbih0KXtpZih0aGlzLmluZmluaXRlKXJldHVybiBudWxsO3ZhciBpPXRoaXMucHJvamVjdGlvbi5ib3VuZHMsZT10aGlzLnNjYWxlKHQpO3JldHVybiBuZXcgUCh0aGlzLnRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShpLm1pbixlKSx0aGlzLnRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShpLm1heCxlKSl9LGluZmluaXRlOiExLHdyYXBMYXRMbmc6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy53cmFwTG5nP3ModC5sbmcsdGhpcy53cmFwTG5nLCEwKTp0LmxuZztyZXR1cm4gbmV3IE0odGhpcy53cmFwTGF0P3ModC5sYXQsdGhpcy53cmFwTGF0LCEwKTp0LmxhdCxpLHQuYWx0KX0sd3JhcExhdExuZ0JvdW5kczpmdW5jdGlvbih0KXt2YXIgaT10LmdldENlbnRlcigpLGU9dGhpcy53cmFwTGF0TG5nKGkpLG49aS5sYXQtZS5sYXQsbz1pLmxuZy1lLmxuZztpZigwPT09biYmMD09PW8pcmV0dXJuIHQ7dmFyIHM9dC5nZXRTb3V0aFdlc3QoKSxyPXQuZ2V0Tm9ydGhFYXN0KCk7cmV0dXJuIG5ldyBUKG5ldyBNKHMubGF0LW4scy5sbmctbyksbmV3IE0oci5sYXQtbixyLmxuZy1vKSl9fSxfaT1pKHt9LGNpLHt3cmFwTG5nOlstMTgwLDE4MF0sUjo2MzcxZTMsZGlzdGFuY2U6ZnVuY3Rpb24odCxpKXt2YXIgZT1NYXRoLlBJLzE4MCxuPXQubGF0KmUsbz1pLmxhdCplLHM9TWF0aC5zaW4oKGkubGF0LXQubGF0KSplLzIpLHI9TWF0aC5zaW4oKGkubG5nLXQubG5nKSplLzIpLGE9cypzK01hdGguY29zKG4pKk1hdGguY29zKG8pKnIqcixoPTIqTWF0aC5hdGFuMihNYXRoLnNxcnQoYSksTWF0aC5zcXJ0KDEtYSkpO3JldHVybiB0aGlzLlIqaH19KSxkaT17Ujo2Mzc4MTM3LE1BWF9MQVRJVFVERTo4NS4wNTExMjg3Nzk4LHByb2plY3Q6ZnVuY3Rpb24odCl7dmFyIGk9TWF0aC5QSS8xODAsZT10aGlzLk1BWF9MQVRJVFVERSxuPU1hdGgubWF4KE1hdGgubWluKGUsdC5sYXQpLC1lKSxvPU1hdGguc2luKG4qaSk7cmV0dXJuIG5ldyB4KHRoaXMuUip0LmxuZyppLHRoaXMuUipNYXRoLmxvZygoMStvKS8oMS1vKSkvMil9LHVucHJvamVjdDpmdW5jdGlvbih0KXt2YXIgaT0xODAvTWF0aC5QSTtyZXR1cm4gbmV3IE0oKDIqTWF0aC5hdGFuKE1hdGguZXhwKHQueS90aGlzLlIpKS1NYXRoLlBJLzIpKmksdC54KmkvdGhpcy5SKX0sYm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQ9NjM3ODEzNypNYXRoLlBJO3JldHVybiBuZXcgUChbLXQsLXRdLFt0LHRdKX0oKX07Wi5wcm90b3R5cGU9e3RyYW5zZm9ybTpmdW5jdGlvbih0LGkpe3JldHVybiB0aGlzLl90cmFuc2Zvcm0odC5jbG9uZSgpLGkpfSxfdHJhbnNmb3JtOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIGk9aXx8MSx0Lng9aSoodGhpcy5fYSp0LngrdGhpcy5fYiksdC55PWkqKHRoaXMuX2MqdC55K3RoaXMuX2QpLHR9LHVudHJhbnNmb3JtOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIGk9aXx8MSxuZXcgeCgodC54L2ktdGhpcy5fYikvdGhpcy5fYSwodC55L2ktdGhpcy5fZCkvdGhpcy5fYyl9fTt2YXIgcGksbWksZmksZ2ksdmk9aSh7fSxfaSx7Y29kZToiRVBTRzozODU3Iixwcm9qZWN0aW9uOmRpLHRyYW5zZm9ybWF0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9LjUvKE1hdGguUEkqZGkuUik7cmV0dXJuIFModCwuNSwtdCwuNSl9KCl9KSx5aT1pKHt9LHZpLHtjb2RlOiJFUFNHOjkwMDkxMyJ9KSx4aT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUsd2k9IkFjdGl2ZVhPYmplY3QiaW4gd2luZG93LExpPXdpJiYhZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcixQaT0ibXNMYXVuY2hVcmkiaW4gbmF2aWdhdG9yJiYhKCJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQpLGJpPUEoIndlYmtpdCIpLFRpPUEoImFuZHJvaWQiKSx6aT1BKCJhbmRyb2lkIDIiKXx8QSgiYW5kcm9pZCAzIiksTWk9cGFyc2VJbnQoL1dlYktpdFwvKFswLTldKyl8JC8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KVsxXSwxMCksQ2k9VGkmJkEoIkdvb2dsZSIpJiZNaTw1MzcmJiEoIkF1ZGlvTm9kZSJpbiB3aW5kb3cpLFppPSEhd2luZG93Lm9wZXJhLFNpPUEoImNocm9tZSIpLEVpPUEoImdlY2tvIikmJiFiaSYmIVppJiYhd2ksa2k9IVNpJiZBKCJzYWZhcmkiKSxBaT1BKCJwaGFudG9tIiksSWk9Ik9UcmFuc2l0aW9uImluIHhpLEJpPTA9PT1uYXZpZ2F0b3IucGxhdGZvcm0uaW5kZXhPZigiV2luIiksT2k9d2kmJiJ0cmFuc2l0aW9uImluIHhpLFJpPSJXZWJLaXRDU1NNYXRyaXgiaW4gd2luZG93JiYibTExImluIG5ldyB3aW5kb3cuV2ViS2l0Q1NTTWF0cml4JiYhemksRGk9Ik1velBlcnNwZWN0aXZlImluIHhpLE5pPSF3aW5kb3cuTF9ESVNBQkxFXzNEJiYoT2l8fFJpfHxEaSkmJiFJaSYmIUFpLGppPSJ1bmRlZmluZWQiIT10eXBlb2Ygb3JpZW50YXRpb258fEEoIm1vYmlsZSIpLFdpPWppJiZiaSxIaT1qaSYmUmksRmk9IXdpbmRvdy5Qb2ludGVyRXZlbnQmJndpbmRvdy5NU1BvaW50ZXJFdmVudCxVaT0hKCF3aW5kb3cuUG9pbnRlckV2ZW50JiYhRmkpLFZpPSF3aW5kb3cuTF9OT19UT1VDSCYmKFVpfHwib250b3VjaHN0YXJ0ImluIHdpbmRvd3x8d2luZG93LkRvY3VtZW50VG91Y2gmJmRvY3VtZW50IGluc3RhbmNlb2Ygd2luZG93LkRvY3VtZW50VG91Y2gpLHFpPWppJiZaaSxHaT1qaSYmRWksS2k9KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHx3aW5kb3cuc2NyZWVuLmRldmljZVhEUEkvd2luZG93LnNjcmVlbi5sb2dpY2FsWERQSSk+MSxZaT0hIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQsWGk9ISghZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TfHwhRSgic3ZnIikuY3JlYXRlU1ZHUmVjdCksSmk9IVhpJiZmdW5jdGlvbigpe3RyeXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmlubmVySFRNTD0nPHY6c2hhcGUgYWRqPSIxIi8+Jzt2YXIgaT10LmZpcnN0Q2hpbGQ7cmV0dXJuIGkuc3R5bGUuYmVoYXZpb3I9InVybCgjZGVmYXVsdCNWTUwpIixpJiYib2JqZWN0Ij09dHlwZW9mIGkuYWRqfWNhdGNoKHQpe3JldHVybiExfX0oKSwkaT0oT2JqZWN0LmZyZWV6ZXx8T2JqZWN0KSh7aWU6d2ksaWVsdDk6TGksZWRnZTpQaSx3ZWJraXQ6YmksYW5kcm9pZDpUaSxhbmRyb2lkMjM6emksYW5kcm9pZFN0b2NrOkNpLG9wZXJhOlppLGNocm9tZTpTaSxnZWNrbzpFaSxzYWZhcmk6a2kscGhhbnRvbTpBaSxvcGVyYTEyOklpLHdpbjpCaSxpZTNkOk9pLHdlYmtpdDNkOlJpLGdlY2tvM2Q6RGksYW55M2Q6TmksbW9iaWxlOmppLG1vYmlsZVdlYmtpdDpXaSxtb2JpbGVXZWJraXQzZDpIaSxtc1BvaW50ZXI6RmkscG9pbnRlcjpVaSx0b3VjaDpWaSxtb2JpbGVPcGVyYTpxaSxtb2JpbGVHZWNrbzpHaSxyZXRpbmE6S2ksY2FudmFzOllpLHN2ZzpYaSx2bWw6Sml9KSxRaT1GaT8iTVNQb2ludGVyRG93biI6InBvaW50ZXJkb3duIix0ZT1GaT8iTVNQb2ludGVyTW92ZSI6InBvaW50ZXJtb3ZlIixpZT1GaT8iTVNQb2ludGVyVXAiOiJwb2ludGVydXAiLGVlPUZpPyJNU1BvaW50ZXJDYW5jZWwiOiJwb2ludGVyY2FuY2VsIixuZT1bIklOUFVUIiwiU0VMRUNUIiwiT1BUSU9OIl0sb2U9e30sc2U9ITEscmU9MCxhZT1GaT8iTVNQb2ludGVyRG93biI6VWk/InBvaW50ZXJkb3duIjoidG91Y2hzdGFydCIsaGU9Rmk/Ik1TUG9pbnRlclVwIjpVaT8icG9pbnRlcnVwIjoidG91Y2hlbmQiLHVlPSJfbGVhZmxldF8iLGxlPSJfbGVhZmxldF9ldmVudHMiLGNlPUJpJiZTaT8yKndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOkVpP3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOjEsX2U9e30sZGU9KE9iamVjdC5mcmVlemV8fE9iamVjdCkoe29uOlYsb2ZmOnEsc3RvcFByb3BhZ2F0aW9uOlksZGlzYWJsZVNjcm9sbFByb3BhZ2F0aW9uOlgsZGlzYWJsZUNsaWNrUHJvcGFnYXRpb246SixwcmV2ZW50RGVmYXVsdDokLHN0b3A6USxnZXRNb3VzZVBvc2l0aW9uOnR0LGdldFdoZWVsRGVsdGE6aXQsZmFrZVN0b3A6ZXQsc2tpcHBlZDpudCxpc0V4dGVybmFsVGFyZ2V0Om90LGFkZExpc3RlbmVyOlYscmVtb3ZlTGlzdGVuZXI6cX0pLHBlPXh0KFsidHJhbnNmb3JtIiwiV2Via2l0VHJhbnNmb3JtIiwiT1RyYW5zZm9ybSIsIk1velRyYW5zZm9ybSIsIm1zVHJhbnNmb3JtIl0pLG1lPXh0KFsid2Via2l0VHJhbnNpdGlvbiIsInRyYW5zaXRpb24iLCJPVHJhbnNpdGlvbiIsIk1velRyYW5zaXRpb24iLCJtc1RyYW5zaXRpb24iXSksZmU9IndlYmtpdFRyYW5zaXRpb24iPT09bWV8fCJPVHJhbnNpdGlvbiI9PT1tZT9tZSsiRW5kIjoidHJhbnNpdGlvbmVuZCI7aWYoIm9uc2VsZWN0c3RhcnQiaW4gZG9jdW1lbnQpbWk9ZnVuY3Rpb24oKXtWKHdpbmRvdywic2VsZWN0c3RhcnQiLCQpfSxmaT1mdW5jdGlvbigpe3Eod2luZG93LCJzZWxlY3RzdGFydCIsJCl9O2Vsc2V7dmFyIGdlPXh0KFsidXNlclNlbGVjdCIsIldlYmtpdFVzZXJTZWxlY3QiLCJPVXNlclNlbGVjdCIsIk1velVzZXJTZWxlY3QiLCJtc1VzZXJTZWxlY3QiXSk7bWk9ZnVuY3Rpb24oKXtpZihnZSl7dmFyIHQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO2dpPXRbZ2VdLHRbZ2VdPSJub25lIn19LGZpPWZ1bmN0aW9uKCl7Z2UmJihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGVbZ2VdPWdpLGdpPXZvaWQgMCl9fXZhciB2ZSx5ZSx4ZT0oT2JqZWN0LmZyZWV6ZXx8T2JqZWN0KSh7VFJBTlNGT1JNOnBlLFRSQU5TSVRJT046bWUsVFJBTlNJVElPTl9FTkQ6ZmUsZ2V0OnJ0LGdldFN0eWxlOmF0LGNyZWF0ZTpodCxyZW1vdmU6dXQsZW1wdHk6bHQsdG9Gcm9udDpjdCx0b0JhY2s6X3QsaGFzQ2xhc3M6ZHQsYWRkQ2xhc3M6cHQscmVtb3ZlQ2xhc3M6bXQsc2V0Q2xhc3M6ZnQsZ2V0Q2xhc3M6Z3Qsc2V0T3BhY2l0eTp2dCx0ZXN0UHJvcDp4dCxzZXRUcmFuc2Zvcm06d3Qsc2V0UG9zaXRpb246THQsZ2V0UG9zaXRpb246UHQsZGlzYWJsZVRleHRTZWxlY3Rpb246bWksZW5hYmxlVGV4dFNlbGVjdGlvbjpmaSxkaXNhYmxlSW1hZ2VEcmFnOmJ0LGVuYWJsZUltYWdlRHJhZzpUdCxwcmV2ZW50T3V0bGluZTp6dCxyZXN0b3JlT3V0bGluZTpNdH0pLHdlPXVpLmV4dGVuZCh7cnVuOmZ1bmN0aW9uKHQsaSxlLG4pe3RoaXMuc3RvcCgpLHRoaXMuX2VsPXQsdGhpcy5faW5Qcm9ncmVzcz0hMCx0aGlzLl9kdXJhdGlvbj1lfHwuMjUsdGhpcy5fZWFzZU91dFBvd2VyPTEvTWF0aC5tYXgobnx8LjUsLjIpLHRoaXMuX3N0YXJ0UG9zPVB0KHQpLHRoaXMuX29mZnNldD1pLnN1YnRyYWN0KHRoaXMuX3N0YXJ0UG9zKSx0aGlzLl9zdGFydFRpbWU9K25ldyBEYXRlLHRoaXMuZmlyZSgic3RhcnQiKSx0aGlzLl9hbmltYXRlKCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9pblByb2dyZXNzJiYodGhpcy5fc3RlcCghMCksdGhpcy5fY29tcGxldGUoKSl9LF9hbmltYXRlOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbUlkPWYodGhpcy5fYW5pbWF0ZSx0aGlzKSx0aGlzLl9zdGVwKCl9LF9zdGVwOmZ1bmN0aW9uKHQpe3ZhciBpPStuZXcgRGF0ZS10aGlzLl9zdGFydFRpbWUsZT0xZTMqdGhpcy5fZHVyYXRpb247aTxlP3RoaXMuX3J1bkZyYW1lKHRoaXMuX2Vhc2VPdXQoaS9lKSx0KToodGhpcy5fcnVuRnJhbWUoMSksdGhpcy5fY29tcGxldGUoKSl9LF9ydW5GcmFtZTpmdW5jdGlvbih0LGkpe3ZhciBlPXRoaXMuX3N0YXJ0UG9zLmFkZCh0aGlzLl9vZmZzZXQubXVsdGlwbHlCeSh0KSk7aSYmZS5fcm91bmQoKSxMdCh0aGlzLl9lbCxlKSx0aGlzLmZpcmUoInN0ZXAiKX0sX2NvbXBsZXRlOmZ1bmN0aW9uKCl7Zyh0aGlzLl9hbmltSWQpLHRoaXMuX2luUHJvZ3Jlc3M9ITEsdGhpcy5maXJlKCJlbmQiKX0sX2Vhc2VPdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5wb3coMS10LHRoaXMuX2Vhc2VPdXRQb3dlcil9fSksTGU9dWkuZXh0ZW5kKHtvcHRpb25zOntjcnM6dmksY2VudGVyOnZvaWQgMCx6b29tOnZvaWQgMCxtaW5ab29tOnZvaWQgMCxtYXhab29tOnZvaWQgMCxsYXllcnM6W10sbWF4Qm91bmRzOnZvaWQgMCxyZW5kZXJlcjp2b2lkIDAsem9vbUFuaW1hdGlvbjohMCx6b29tQW5pbWF0aW9uVGhyZXNob2xkOjQsZmFkZUFuaW1hdGlvbjohMCxtYXJrZXJab29tQW5pbWF0aW9uOiEwLHRyYW5zZm9ybTNETGltaXQ6ODM4ODYwOCx6b29tU25hcDoxLHpvb21EZWx0YToxLHRyYWNrUmVzaXplOiEwfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsaSl7aT1sKHRoaXMsaSksdGhpcy5faW5pdENvbnRhaW5lcih0KSx0aGlzLl9pbml0TGF5b3V0KCksdGhpcy5fb25SZXNpemU9ZSh0aGlzLl9vblJlc2l6ZSx0aGlzKSx0aGlzLl9pbml0RXZlbnRzKCksaS5tYXhCb3VuZHMmJnRoaXMuc2V0TWF4Qm91bmRzKGkubWF4Qm91bmRzKSx2b2lkIDAhPT1pLnpvb20mJih0aGlzLl96b29tPXRoaXMuX2xpbWl0Wm9vbShpLnpvb20pKSxpLmNlbnRlciYmdm9pZCAwIT09aS56b29tJiZ0aGlzLnNldFZpZXcoQyhpLmNlbnRlciksaS56b29tLHtyZXNldDohMH0pLHRoaXMuX2hhbmRsZXJzPVtdLHRoaXMuX2xheWVycz17fSx0aGlzLl96b29tQm91bmRMYXllcnM9e30sdGhpcy5fc2l6ZUNoYW5nZWQ9ITAsdGhpcy5jYWxsSW5pdEhvb2tzKCksdGhpcy5fem9vbUFuaW1hdGVkPW1lJiZOaSYmIXFpJiZ0aGlzLm9wdGlvbnMuem9vbUFuaW1hdGlvbix0aGlzLl96b29tQW5pbWF0ZWQmJih0aGlzLl9jcmVhdGVBbmltUHJveHkoKSxWKHRoaXMuX3Byb3h5LGZlLHRoaXMuX2NhdGNoVHJhbnNpdGlvbkVuZCx0aGlzKSksdGhpcy5fYWRkTGF5ZXJzKHRoaXMub3B0aW9ucy5sYXllcnMpfSxzZXRWaWV3OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZT12b2lkIDA9PT1lP3RoaXMuX3pvb206dGhpcy5fbGltaXRab29tKGUpLHQ9dGhpcy5fbGltaXRDZW50ZXIoQyh0KSxlLHRoaXMub3B0aW9ucy5tYXhCb3VuZHMpLG49bnx8e30sdGhpcy5fc3RvcCgpLHRoaXMuX2xvYWRlZCYmIW4ucmVzZXQmJiEwIT09biYmKHZvaWQgMCE9PW4uYW5pbWF0ZSYmKG4uem9vbT1pKHthbmltYXRlOm4uYW5pbWF0ZX0sbi56b29tKSxuLnBhbj1pKHthbmltYXRlOm4uYW5pbWF0ZSxkdXJhdGlvbjpuLmR1cmF0aW9ufSxuLnBhbikpLHRoaXMuX3pvb20hPT1lP3RoaXMuX3RyeUFuaW1hdGVkWm9vbSYmdGhpcy5fdHJ5QW5pbWF0ZWRab29tKHQsZSxuLnpvb20pOnRoaXMuX3RyeUFuaW1hdGVkUGFuKHQsbi5wYW4pKT8oY2xlYXJUaW1lb3V0KHRoaXMuX3NpemVUaW1lciksdGhpcyk6KHRoaXMuX3Jlc2V0Vmlldyh0LGUpLHRoaXMpfSxzZXRab29tOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRoaXMuX2xvYWRlZD90aGlzLnNldFZpZXcodGhpcy5nZXRDZW50ZXIoKSx0LHt6b29tOml9KToodGhpcy5fem9vbT10LHRoaXMpfSx6b29tSW46ZnVuY3Rpb24odCxpKXtyZXR1cm4gdD10fHwoTmk/dGhpcy5vcHRpb25zLnpvb21EZWx0YToxKSx0aGlzLnNldFpvb20odGhpcy5fem9vbSt0LGkpfSx6b29tT3V0OmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHQ9dHx8KE5pP3RoaXMub3B0aW9ucy56b29tRGVsdGE6MSksdGhpcy5zZXRab29tKHRoaXMuX3pvb20tdCxpKX0sc2V0Wm9vbUFyb3VuZDpmdW5jdGlvbih0LGksZSl7dmFyIG49dGhpcy5nZXRab29tU2NhbGUoaSksbz10aGlzLmdldFNpemUoKS5kaXZpZGVCeSgyKSxzPSh0IGluc3RhbmNlb2YgeD90OnRoaXMubGF0TG5nVG9Db250YWluZXJQb2ludCh0KSkuc3VidHJhY3QobykubXVsdGlwbHlCeSgxLTEvbikscj10aGlzLmNvbnRhaW5lclBvaW50VG9MYXRMbmcoby5hZGQocykpO3JldHVybiB0aGlzLnNldFZpZXcocixpLHt6b29tOmV9KX0sX2dldEJvdW5kc0NlbnRlclpvb206ZnVuY3Rpb24odCxpKXtpPWl8fHt9LHQ9dC5nZXRCb3VuZHM/dC5nZXRCb3VuZHMoKTp6KHQpO3ZhciBlPXcoaS5wYWRkaW5nVG9wTGVmdHx8aS5wYWRkaW5nfHxbMCwwXSksbj13KGkucGFkZGluZ0JvdHRvbVJpZ2h0fHxpLnBhZGRpbmd8fFswLDBdKSxvPXRoaXMuZ2V0Qm91bmRzWm9vbSh0LCExLGUuYWRkKG4pKTtpZigobz0ibnVtYmVyIj09dHlwZW9mIGkubWF4Wm9vbT9NYXRoLm1pbihpLm1heFpvb20sbyk6byk9PT0xLzApcmV0dXJue2NlbnRlcjp0LmdldENlbnRlcigpLHpvb206b307dmFyIHM9bi5zdWJ0cmFjdChlKS5kaXZpZGVCeSgyKSxyPXRoaXMucHJvamVjdCh0LmdldFNvdXRoV2VzdCgpLG8pLGE9dGhpcy5wcm9qZWN0KHQuZ2V0Tm9ydGhFYXN0KCksbyk7cmV0dXJue2NlbnRlcjp0aGlzLnVucHJvamVjdChyLmFkZChhKS5kaXZpZGVCeSgyKS5hZGQocyksbyksem9vbTpvfX0sZml0Qm91bmRzOmZ1bmN0aW9uKHQsaSl7aWYoISh0PXoodCkpLmlzVmFsaWQoKSl0aHJvdyBuZXcgRXJyb3IoIkJvdW5kcyBhcmUgbm90IHZhbGlkLiIpO3ZhciBlPXRoaXMuX2dldEJvdW5kc0NlbnRlclpvb20odCxpKTtyZXR1cm4gdGhpcy5zZXRWaWV3KGUuY2VudGVyLGUuem9vbSxpKX0sZml0V29ybGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZml0Qm91bmRzKFtbLTkwLC0xODBdLFs5MCwxODBdXSx0KX0scGFuVG86ZnVuY3Rpb24odCxpKXtyZXR1cm4gdGhpcy5zZXRWaWV3KHQsdGhpcy5fem9vbSx7cGFuOml9KX0scGFuQnk6ZnVuY3Rpb24odCxpKXtpZih0PXcodCkucm91bmQoKSxpPWl8fHt9LCF0LngmJiF0LnkpcmV0dXJuIHRoaXMuZmlyZSgibW92ZWVuZCIpO2lmKCEwIT09aS5hbmltYXRlJiYhdGhpcy5nZXRTaXplKCkuY29udGFpbnModCkpcmV0dXJuIHRoaXMuX3Jlc2V0Vmlldyh0aGlzLnVucHJvamVjdCh0aGlzLnByb2plY3QodGhpcy5nZXRDZW50ZXIoKSkuYWRkKHQpKSx0aGlzLmdldFpvb20oKSksdGhpcztpZih0aGlzLl9wYW5BbmltfHwodGhpcy5fcGFuQW5pbT1uZXcgd2UsdGhpcy5fcGFuQW5pbS5vbih7c3RlcDp0aGlzLl9vblBhblRyYW5zaXRpb25TdGVwLGVuZDp0aGlzLl9vblBhblRyYW5zaXRpb25FbmR9LHRoaXMpKSxpLm5vTW92ZVN0YXJ0fHx0aGlzLmZpcmUoIm1vdmVzdGFydCIpLCExIT09aS5hbmltYXRlKXtwdCh0aGlzLl9tYXBQYW5lLCJsZWFmbGV0LXBhbi1hbmltIik7dmFyIGU9dGhpcy5fZ2V0TWFwUGFuZVBvcygpLnN1YnRyYWN0KHQpLnJvdW5kKCk7dGhpcy5fcGFuQW5pbS5ydW4odGhpcy5fbWFwUGFuZSxlLGkuZHVyYXRpb258fC4yNSxpLmVhc2VMaW5lYXJpdHkpfWVsc2UgdGhpcy5fcmF3UGFuQnkodCksdGhpcy5maXJlKCJtb3ZlIikuZmlyZSgibW92ZWVuZCIpO3JldHVybiB0aGlzfSxmbHlUbzpmdW5jdGlvbih0LGksZSl7ZnVuY3Rpb24gbih0KXt2YXIgaT0oZypnLW0qbSsodD8tMToxKSp4Kngqdip2KS8oMioodD9nOm0pKngqdiksZT1NYXRoLnNxcnQoaSppKzEpLWk7cmV0dXJuIGU8MWUtOT8tMTg6TWF0aC5sb2coZSl9ZnVuY3Rpb24gbyh0KXtyZXR1cm4oTWF0aC5leHAodCktTWF0aC5leHAoLXQpKS8yfWZ1bmN0aW9uIHModCl7cmV0dXJuKE1hdGguZXhwKHQpK01hdGguZXhwKC10KSkvMn1mdW5jdGlvbiByKHQpe3JldHVybiBvKHQpL3ModCl9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gbSoocyh3KS9zKHcreSp0KSl9ZnVuY3Rpb24gaCh0KXtyZXR1cm4gbSoocyh3KSpyKHcreSp0KS1vKHcpKS94fWZ1bmN0aW9uIHUodCl7cmV0dXJuIDEtTWF0aC5wb3coMS10LDEuNSl9ZnVuY3Rpb24gbCgpe3ZhciBlPShEYXRlLm5vdygpLUwpL2Isbj11KGUpKlA7ZTw9MT8odGhpcy5fZmx5VG9GcmFtZT1mKGwsdGhpcyksdGhpcy5fbW92ZSh0aGlzLnVucHJvamVjdChjLmFkZChfLnN1YnRyYWN0KGMpLm11bHRpcGx5QnkoaChuKS92KSkscCksdGhpcy5nZXRTY2FsZVpvb20obS9hKG4pLHApLHtmbHlUbzohMH0pKTp0aGlzLl9tb3ZlKHQsaSkuX21vdmVFbmQoITApfWlmKCExPT09KGU9ZXx8e30pLmFuaW1hdGV8fCFOaSlyZXR1cm4gdGhpcy5zZXRWaWV3KHQsaSxlKTt0aGlzLl9zdG9wKCk7dmFyIGM9dGhpcy5wcm9qZWN0KHRoaXMuZ2V0Q2VudGVyKCkpLF89dGhpcy5wcm9qZWN0KHQpLGQ9dGhpcy5nZXRTaXplKCkscD10aGlzLl96b29tO3Q9Qyh0KSxpPXZvaWQgMD09PWk/cDppO3ZhciBtPU1hdGgubWF4KGQueCxkLnkpLGc9bSp0aGlzLmdldFpvb21TY2FsZShwLGkpLHY9Xy5kaXN0YW5jZVRvKGMpfHwxLHk9MS40Mix4PXkqeSx3PW4oMCksTD1EYXRlLm5vdygpLFA9KG4oMSktdykveSxiPWUuZHVyYXRpb24/MWUzKmUuZHVyYXRpb246MWUzKlAqLjg7cmV0dXJuIHRoaXMuX21vdmVTdGFydCghMCxlLm5vTW92ZVN0YXJ0KSxsLmNhbGwodGhpcyksdGhpc30sZmx5VG9Cb3VuZHM6ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLl9nZXRCb3VuZHNDZW50ZXJab29tKHQsaSk7cmV0dXJuIHRoaXMuZmx5VG8oZS5jZW50ZXIsZS56b29tLGkpfSxzZXRNYXhCb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9eih0KSkuaXNWYWxpZCgpPyh0aGlzLm9wdGlvbnMubWF4Qm91bmRzJiZ0aGlzLm9mZigibW92ZWVuZCIsdGhpcy5fcGFuSW5zaWRlTWF4Qm91bmRzKSx0aGlzLm9wdGlvbnMubWF4Qm91bmRzPXQsdGhpcy5fbG9hZGVkJiZ0aGlzLl9wYW5JbnNpZGVNYXhCb3VuZHMoKSx0aGlzLm9uKCJtb3ZlZW5kIix0aGlzLl9wYW5JbnNpZGVNYXhCb3VuZHMpKToodGhpcy5vcHRpb25zLm1heEJvdW5kcz1udWxsLHRoaXMub2ZmKCJtb3ZlZW5kIix0aGlzLl9wYW5JbnNpZGVNYXhCb3VuZHMpKX0sc2V0TWluWm9vbTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLm9wdGlvbnMubWluWm9vbTtyZXR1cm4gdGhpcy5vcHRpb25zLm1pblpvb209dCx0aGlzLl9sb2FkZWQmJmkhPT10JiYodGhpcy5maXJlKCJ6b29tbGV2ZWxzY2hhbmdlIiksdGhpcy5nZXRab29tKCk8dGhpcy5vcHRpb25zLm1pblpvb20pP3RoaXMuc2V0Wm9vbSh0KTp0aGlzfSxzZXRNYXhab29tOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucy5tYXhab29tO3JldHVybiB0aGlzLm9wdGlvbnMubWF4Wm9vbT10LHRoaXMuX2xvYWRlZCYmaSE9PXQmJih0aGlzLmZpcmUoInpvb21sZXZlbHNjaGFuZ2UiKSx0aGlzLmdldFpvb20oKT50aGlzLm9wdGlvbnMubWF4Wm9vbSk/dGhpcy5zZXRab29tKHQpOnRoaXN9LHBhbkluc2lkZUJvdW5kczpmdW5jdGlvbih0LGkpe3RoaXMuX2VuZm9yY2luZ0JvdW5kcz0hMDt2YXIgZT10aGlzLmdldENlbnRlcigpLG49dGhpcy5fbGltaXRDZW50ZXIoZSx0aGlzLl96b29tLHoodCkpO3JldHVybiBlLmVxdWFscyhuKXx8dGhpcy5wYW5UbyhuLGkpLHRoaXMuX2VuZm9yY2luZ0JvdW5kcz0hMSx0aGlzfSxpbnZhbGlkYXRlU2l6ZTpmdW5jdGlvbih0KXtpZighdGhpcy5fbG9hZGVkKXJldHVybiB0aGlzO3Q9aSh7YW5pbWF0ZTohMSxwYW46ITB9LCEwPT09dD97YW5pbWF0ZTohMH06dCk7dmFyIG49dGhpcy5nZXRTaXplKCk7dGhpcy5fc2l6ZUNoYW5nZWQ9ITAsdGhpcy5fbGFzdENlbnRlcj1udWxsO3ZhciBvPXRoaXMuZ2V0U2l6ZSgpLHM9bi5kaXZpZGVCeSgyKS5yb3VuZCgpLHI9by5kaXZpZGVCeSgyKS5yb3VuZCgpLGE9cy5zdWJ0cmFjdChyKTtyZXR1cm4gYS54fHxhLnk/KHQuYW5pbWF0ZSYmdC5wYW4/dGhpcy5wYW5CeShhKToodC5wYW4mJnRoaXMuX3Jhd1BhbkJ5KGEpLHRoaXMuZmlyZSgibW92ZSIpLHQuZGVib3VuY2VNb3ZlZW5kPyhjbGVhclRpbWVvdXQodGhpcy5fc2l6ZVRpbWVyKSx0aGlzLl9zaXplVGltZXI9c2V0VGltZW91dChlKHRoaXMuZmlyZSx0aGlzLCJtb3ZlZW5kIiksMjAwKSk6dGhpcy5maXJlKCJtb3ZlZW5kIikpLHRoaXMuZmlyZSgicmVzaXplIix7b2xkU2l6ZTpuLG5ld1NpemU6b30pKTp0aGlzfSxzdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0Wm9vbSh0aGlzLl9saW1pdFpvb20odGhpcy5fem9vbSkpLHRoaXMub3B0aW9ucy56b29tU25hcHx8dGhpcy5maXJlKCJ2aWV3cmVzZXQiKSx0aGlzLl9zdG9wKCl9LGxvY2F0ZTpmdW5jdGlvbih0KXtpZih0PXRoaXMuX2xvY2F0ZU9wdGlvbnM9aSh7dGltZW91dDoxZTQsd2F0Y2g6ITF9LHQpLCEoImdlb2xvY2F0aW9uImluIG5hdmlnYXRvcikpcmV0dXJuIHRoaXMuX2hhbmRsZUdlb2xvY2F0aW9uRXJyb3Ioe2NvZGU6MCxtZXNzYWdlOiJHZW9sb2NhdGlvbiBub3Qgc3VwcG9ydGVkLiJ9KSx0aGlzO3ZhciBuPWUodGhpcy5faGFuZGxlR2VvbG9jYXRpb25SZXNwb25zZSx0aGlzKSxvPWUodGhpcy5faGFuZGxlR2VvbG9jYXRpb25FcnJvcix0aGlzKTtyZXR1cm4gdC53YXRjaD90aGlzLl9sb2NhdGlvbldhdGNoSWQ9bmF2aWdhdG9yLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24obixvLHQpOm5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24obixvLHQpLHRoaXN9LHN0b3BMb2NhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLmdlb2xvY2F0aW9uJiZuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCYmbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2godGhpcy5fbG9jYXRpb25XYXRjaElkKSx0aGlzLl9sb2NhdGVPcHRpb25zJiYodGhpcy5fbG9jYXRlT3B0aW9ucy5zZXRWaWV3PSExKSx0aGlzfSxfaGFuZGxlR2VvbG9jYXRpb25FcnJvcjpmdW5jdGlvbih0KXt2YXIgaT10LmNvZGUsZT10Lm1lc3NhZ2V8fCgxPT09aT8icGVybWlzc2lvbiBkZW5pZWQiOjI9PT1pPyJwb3NpdGlvbiB1bmF2YWlsYWJsZSI6InRpbWVvdXQiKTt0aGlzLl9sb2NhdGVPcHRpb25zLnNldFZpZXcmJiF0aGlzLl9sb2FkZWQmJnRoaXMuZml0V29ybGQoKSx0aGlzLmZpcmUoImxvY2F0aW9uZXJyb3IiLHtjb2RlOmksbWVzc2FnZToiR2VvbG9jYXRpb24gZXJyb3I6ICIrZSsiLiJ9KX0sX2hhbmRsZUdlb2xvY2F0aW9uUmVzcG9uc2U6ZnVuY3Rpb24odCl7dmFyIGk9bmV3IE0odC5jb29yZHMubGF0aXR1ZGUsdC5jb29yZHMubG9uZ2l0dWRlKSxlPWkudG9Cb3VuZHModC5jb29yZHMuYWNjdXJhY3kpLG49dGhpcy5fbG9jYXRlT3B0aW9ucztpZihuLnNldFZpZXcpe3ZhciBvPXRoaXMuZ2V0Qm91bmRzWm9vbShlKTt0aGlzLnNldFZpZXcoaSxuLm1heFpvb20/TWF0aC5taW4obyxuLm1heFpvb20pOm8pfXZhciBzPXtsYXRsbmc6aSxib3VuZHM6ZSx0aW1lc3RhbXA6dC50aW1lc3RhbXB9O2Zvcih2YXIgciBpbiB0LmNvb3JkcykibnVtYmVyIj09dHlwZW9mIHQuY29vcmRzW3JdJiYoc1tyXT10LmNvb3Jkc1tyXSk7dGhpcy5maXJlKCJsb2NhdGlvbmZvdW5kIixzKX0sYWRkSGFuZGxlcjpmdW5jdGlvbih0LGkpe2lmKCFpKXJldHVybiB0aGlzO3ZhciBlPXRoaXNbdF09bmV3IGkodGhpcyk7cmV0dXJuIHRoaXMuX2hhbmRsZXJzLnB1c2goZSksdGhpcy5vcHRpb25zW3RdJiZlLmVuYWJsZSgpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe2lmKHRoaXMuX2luaXRFdmVudHMoITApLHRoaXMuX2NvbnRhaW5lcklkIT09dGhpcy5fY29udGFpbmVyLl9sZWFmbGV0X2lkKXRocm93IG5ldyBFcnJvcigiTWFwIGNvbnRhaW5lciBpcyBiZWluZyByZXVzZWQgYnkgYW5vdGhlciBpbnN0YW5jZSIpO3RyeXtkZWxldGUgdGhpcy5fY29udGFpbmVyLl9sZWFmbGV0X2lkLGRlbGV0ZSB0aGlzLl9jb250YWluZXJJZH1jYXRjaCh0KXt0aGlzLl9jb250YWluZXIuX2xlYWZsZXRfaWQ9dm9pZCAwLHRoaXMuX2NvbnRhaW5lcklkPXZvaWQgMH12b2lkIDAhPT10aGlzLl9sb2NhdGlvbldhdGNoSWQmJnRoaXMuc3RvcExvY2F0ZSgpLHRoaXMuX3N0b3AoKSx1dCh0aGlzLl9tYXBQYW5lKSx0aGlzLl9jbGVhckNvbnRyb2xQb3MmJnRoaXMuX2NsZWFyQ29udHJvbFBvcygpLHRoaXMuX2NsZWFySGFuZGxlcnMoKSx0aGlzLl9sb2FkZWQmJnRoaXMuZmlyZSgidW5sb2FkIik7dmFyIHQ7Zm9yKHQgaW4gdGhpcy5fbGF5ZXJzKXRoaXMuX2xheWVyc1t0XS5yZW1vdmUoKTtmb3IodCBpbiB0aGlzLl9wYW5lcyl1dCh0aGlzLl9wYW5lc1t0XSk7cmV0dXJuIHRoaXMuX2xheWVycz1bXSx0aGlzLl9wYW5lcz1bXSxkZWxldGUgdGhpcy5fbWFwUGFuZSxkZWxldGUgdGhpcy5fcmVuZGVyZXIsdGhpc30sY3JlYXRlUGFuZTpmdW5jdGlvbih0LGkpe3ZhciBlPWh0KCJkaXYiLCJsZWFmbGV0LXBhbmUiKyh0PyIgbGVhZmxldC0iK3QucmVwbGFjZSgiUGFuZSIsIiIpKyItcGFuZSI6IiIpLGl8fHRoaXMuX21hcFBhbmUpO3JldHVybiB0JiYodGhpcy5fcGFuZXNbdF09ZSksZX0sZ2V0Q2VudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoZWNrSWZMb2FkZWQoKSx0aGlzLl9sYXN0Q2VudGVyJiYhdGhpcy5fbW92ZWQoKT90aGlzLl9sYXN0Q2VudGVyOnRoaXMubGF5ZXJQb2ludFRvTGF0TG5nKHRoaXMuX2dldENlbnRlckxheWVyUG9pbnQoKSl9LGdldFpvb206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fem9vbX0sZ2V0Qm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRQaXhlbEJvdW5kcygpO3JldHVybiBuZXcgVCh0aGlzLnVucHJvamVjdCh0LmdldEJvdHRvbUxlZnQoKSksdGhpcy51bnByb2plY3QodC5nZXRUb3BSaWdodCgpKSl9LGdldE1pblpvb206ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5vcHRpb25zLm1pblpvb20/dGhpcy5fbGF5ZXJzTWluWm9vbXx8MDp0aGlzLm9wdGlvbnMubWluWm9vbX0sZ2V0TWF4Wm9vbTpmdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT10aGlzLm9wdGlvbnMubWF4Wm9vbT92b2lkIDA9PT10aGlzLl9sYXllcnNNYXhab29tPzEvMDp0aGlzLl9sYXllcnNNYXhab29tOnRoaXMub3B0aW9ucy5tYXhab29tfSxnZXRCb3VuZHNab29tOmZ1bmN0aW9uKHQsaSxlKXt0PXoodCksZT13KGV8fFswLDBdKTt2YXIgbj10aGlzLmdldFpvb20oKXx8MCxvPXRoaXMuZ2V0TWluWm9vbSgpLHM9dGhpcy5nZXRNYXhab29tKCkscj10LmdldE5vcnRoV2VzdCgpLGE9dC5nZXRTb3V0aEVhc3QoKSxoPXRoaXMuZ2V0U2l6ZSgpLnN1YnRyYWN0KGUpLHU9Yih0aGlzLnByb2plY3QoYSxuKSx0aGlzLnByb2plY3QocixuKSkuZ2V0U2l6ZSgpLGw9Tmk/dGhpcy5vcHRpb25zLnpvb21TbmFwOjEsYz1oLngvdS54LF89aC55L3UueSxkPWk/TWF0aC5tYXgoYyxfKTpNYXRoLm1pbihjLF8pO3JldHVybiBuPXRoaXMuZ2V0U2NhbGVab29tKGQsbiksbCYmKG49TWF0aC5yb3VuZChuLyhsLzEwMCkpKihsLzEwMCksbj1pP01hdGguY2VpbChuL2wpKmw6TWF0aC5mbG9vcihuL2wpKmwpLE1hdGgubWF4KG8sTWF0aC5taW4ocyxuKSl9LGdldFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2l6ZSYmIXRoaXMuX3NpemVDaGFuZ2VkfHwodGhpcy5fc2l6ZT1uZXcgeCh0aGlzLl9jb250YWluZXIuY2xpZW50V2lkdGh8fDAsdGhpcy5fY29udGFpbmVyLmNsaWVudEhlaWdodHx8MCksdGhpcy5fc2l6ZUNoYW5nZWQ9ITEpLHRoaXMuX3NpemUuY2xvbmUoKX0sZ2V0UGl4ZWxCb3VuZHM6ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLl9nZXRUb3BMZWZ0UG9pbnQodCxpKTtyZXR1cm4gbmV3IFAoZSxlLmFkZCh0aGlzLmdldFNpemUoKSkpfSxnZXRQaXhlbE9yaWdpbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGVja0lmTG9hZGVkKCksdGhpcy5fcGl4ZWxPcmlnaW59LGdldFBpeGVsV29ybGRCb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5jcnMuZ2V0UHJvamVjdGVkQm91bmRzKHZvaWQgMD09PXQ/dGhpcy5nZXRab29tKCk6dCl9LGdldFBhbmU6ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P3RoaXMuX3BhbmVzW3RdOnR9LGdldFBhbmVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhbmVzfSxnZXRDb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGFpbmVyfSxnZXRab29tU2NhbGU6ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLm9wdGlvbnMuY3JzO3JldHVybiBpPXZvaWQgMD09PWk/dGhpcy5fem9vbTppLGUuc2NhbGUodCkvZS5zY2FsZShpKX0sZ2V0U2NhbGVab29tOmZ1bmN0aW9uKHQsaSl7dmFyIGU9dGhpcy5vcHRpb25zLmNycztpPXZvaWQgMD09PWk/dGhpcy5fem9vbTppO3ZhciBuPWUuem9vbSh0KmUuc2NhbGUoaSkpO3JldHVybiBpc05hTihuKT8xLzA6bn0scHJvamVjdDpmdW5jdGlvbih0LGkpe3JldHVybiBpPXZvaWQgMD09PWk/dGhpcy5fem9vbTppLHRoaXMub3B0aW9ucy5jcnMubGF0TG5nVG9Qb2ludChDKHQpLGkpfSx1bnByb2plY3Q6ZnVuY3Rpb24odCxpKXtyZXR1cm4gaT12b2lkIDA9PT1pP3RoaXMuX3pvb206aSx0aGlzLm9wdGlvbnMuY3JzLnBvaW50VG9MYXRMbmcodyh0KSxpKX0sbGF5ZXJQb2ludFRvTGF0TG5nOmZ1bmN0aW9uKHQpe3ZhciBpPXcodCkuYWRkKHRoaXMuZ2V0UGl4ZWxPcmlnaW4oKSk7cmV0dXJuIHRoaXMudW5wcm9qZWN0KGkpfSxsYXRMbmdUb0xheWVyUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHJvamVjdChDKHQpKS5fcm91bmQoKS5fc3VidHJhY3QodGhpcy5nZXRQaXhlbE9yaWdpbigpKX0sd3JhcExhdExuZzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLmNycy53cmFwTGF0TG5nKEModCkpfSx3cmFwTGF0TG5nQm91bmRzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuY3JzLndyYXBMYXRMbmdCb3VuZHMoeih0KSl9LGRpc3RhbmNlOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRoaXMub3B0aW9ucy5jcnMuZGlzdGFuY2UoQyh0KSxDKGkpKX0sY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHcodCkuc3VidHJhY3QodGhpcy5fZ2V0TWFwUGFuZVBvcygpKX0sbGF5ZXJQb2ludFRvQ29udGFpbmVyUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHcodCkuYWRkKHRoaXMuX2dldE1hcFBhbmVQb3MoKSl9LGNvbnRhaW5lclBvaW50VG9MYXRMbmc6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludCh3KHQpKTtyZXR1cm4gdGhpcy5sYXllclBvaW50VG9MYXRMbmcoaSl9LGxhdExuZ1RvQ29udGFpbmVyUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGF5ZXJQb2ludFRvQ29udGFpbmVyUG9pbnQodGhpcy5sYXRMbmdUb0xheWVyUG9pbnQoQyh0KSkpfSxtb3VzZUV2ZW50VG9Db250YWluZXJQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdHQodCx0aGlzLl9jb250YWluZXIpfSxtb3VzZUV2ZW50VG9MYXllclBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KHRoaXMubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodCkpfSxtb3VzZUV2ZW50VG9MYXRMbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGF5ZXJQb2ludFRvTGF0TG5nKHRoaXMubW91c2VFdmVudFRvTGF5ZXJQb2ludCh0KSl9LF9pbml0Q29udGFpbmVyOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX2NvbnRhaW5lcj1ydCh0KTtpZighaSl0aHJvdyBuZXcgRXJyb3IoIk1hcCBjb250YWluZXIgbm90IGZvdW5kLiIpO2lmKGkuX2xlYWZsZXRfaWQpdGhyb3cgbmV3IEVycm9yKCJNYXAgY29udGFpbmVyIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQuIik7VihpLCJzY3JvbGwiLHRoaXMuX29uU2Nyb2xsLHRoaXMpLHRoaXMuX2NvbnRhaW5lcklkPW4oaSl9LF9pbml0TGF5b3V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29udGFpbmVyO3RoaXMuX2ZhZGVBbmltYXRlZD10aGlzLm9wdGlvbnMuZmFkZUFuaW1hdGlvbiYmTmkscHQodCwibGVhZmxldC1jb250YWluZXIiKyhWaT8iIGxlYWZsZXQtdG91Y2giOiIiKSsoS2k/IiBsZWFmbGV0LXJldGluYSI6IiIpKyhMaT8iIGxlYWZsZXQtb2xkaWUiOiIiKSsoa2k/IiBsZWFmbGV0LXNhZmFyaSI6IiIpKyh0aGlzLl9mYWRlQW5pbWF0ZWQ/IiBsZWFmbGV0LWZhZGUtYW5pbSI6IiIpKTt2YXIgaT1hdCh0LCJwb3NpdGlvbiIpOyJhYnNvbHV0ZSIhPT1pJiYicmVsYXRpdmUiIT09aSYmImZpeGVkIiE9PWkmJih0LnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHRoaXMuX2luaXRQYW5lcygpLHRoaXMuX2luaXRDb250cm9sUG9zJiZ0aGlzLl9pbml0Q29udHJvbFBvcygpfSxfaW5pdFBhbmVzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcGFuZXM9e307dGhpcy5fcGFuZVJlbmRlcmVycz17fSx0aGlzLl9tYXBQYW5lPXRoaXMuY3JlYXRlUGFuZSgibWFwUGFuZSIsdGhpcy5fY29udGFpbmVyKSxMdCh0aGlzLl9tYXBQYW5lLG5ldyB4KDAsMCkpLHRoaXMuY3JlYXRlUGFuZSgidGlsZVBhbmUiKSx0aGlzLmNyZWF0ZVBhbmUoInNoYWRvd1BhbmUiKSx0aGlzLmNyZWF0ZVBhbmUoIm92ZXJsYXlQYW5lIiksdGhpcy5jcmVhdGVQYW5lKCJtYXJrZXJQYW5lIiksdGhpcy5jcmVhdGVQYW5lKCJ0b29sdGlwUGFuZSIpLHRoaXMuY3JlYXRlUGFuZSgicG9wdXBQYW5lIiksdGhpcy5vcHRpb25zLm1hcmtlclpvb21BbmltYXRpb258fChwdCh0Lm1hcmtlclBhbmUsImxlYWZsZXQtem9vbS1oaWRlIikscHQodC5zaGFkb3dQYW5lLCJsZWFmbGV0LXpvb20taGlkZSIpKX0sX3Jlc2V0VmlldzpmdW5jdGlvbih0LGkpe0x0KHRoaXMuX21hcFBhbmUsbmV3IHgoMCwwKSk7dmFyIGU9IXRoaXMuX2xvYWRlZDt0aGlzLl9sb2FkZWQ9ITAsaT10aGlzLl9saW1pdFpvb20oaSksdGhpcy5maXJlKCJ2aWV3cHJlcmVzZXQiKTt2YXIgbj10aGlzLl96b29tIT09aTt0aGlzLl9tb3ZlU3RhcnQobiwhMSkuX21vdmUodCxpKS5fbW92ZUVuZChuKSx0aGlzLmZpcmUoInZpZXdyZXNldCIpLGUmJnRoaXMuZmlyZSgibG9hZCIpfSxfbW92ZVN0YXJ0OmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHQmJnRoaXMuZmlyZSgiem9vbXN0YXJ0IiksaXx8dGhpcy5maXJlKCJtb3Zlc3RhcnQiKSx0aGlzfSxfbW92ZTpmdW5jdGlvbih0LGksZSl7dm9pZCAwPT09aSYmKGk9dGhpcy5fem9vbSk7dmFyIG49dGhpcy5fem9vbSE9PWk7cmV0dXJuIHRoaXMuX3pvb209aSx0aGlzLl9sYXN0Q2VudGVyPXQsdGhpcy5fcGl4ZWxPcmlnaW49dGhpcy5fZ2V0TmV3UGl4ZWxPcmlnaW4odCksKG58fGUmJmUucGluY2gpJiZ0aGlzLmZpcmUoInpvb20iLGUpLHRoaXMuZmlyZSgibW92ZSIsZSl9LF9tb3ZlRW5kOmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0aGlzLmZpcmUoInpvb21lbmQiKSx0aGlzLmZpcmUoIm1vdmVlbmQiKX0sX3N0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gZyh0aGlzLl9mbHlUb0ZyYW1lKSx0aGlzLl9wYW5BbmltJiZ0aGlzLl9wYW5BbmltLnN0b3AoKSx0aGlzfSxfcmF3UGFuQnk6ZnVuY3Rpb24odCl7THQodGhpcy5fbWFwUGFuZSx0aGlzLl9nZXRNYXBQYW5lUG9zKCkuc3VidHJhY3QodCkpfSxfZ2V0Wm9vbVNwYW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRNYXhab29tKCktdGhpcy5nZXRNaW5ab29tKCl9LF9wYW5JbnNpZGVNYXhCb3VuZHM6ZnVuY3Rpb24oKXt0aGlzLl9lbmZvcmNpbmdCb3VuZHN8fHRoaXMucGFuSW5zaWRlQm91bmRzKHRoaXMub3B0aW9ucy5tYXhCb3VuZHMpfSxfY2hlY2tJZkxvYWRlZDpmdW5jdGlvbigpe2lmKCF0aGlzLl9sb2FkZWQpdGhyb3cgbmV3IEVycm9yKCJTZXQgbWFwIGNlbnRlciBhbmQgem9vbSBmaXJzdC4iKX0sX2luaXRFdmVudHM6ZnVuY3Rpb24odCl7dGhpcy5fdGFyZ2V0cz17fSx0aGlzLl90YXJnZXRzW24odGhpcy5fY29udGFpbmVyKV09dGhpczt2YXIgaT10P3E6VjtpKHRoaXMuX2NvbnRhaW5lciwiY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlbW92ZSBjb250ZXh0bWVudSBrZXlwcmVzcyIsdGhpcy5faGFuZGxlRE9NRXZlbnQsdGhpcyksdGhpcy5vcHRpb25zLnRyYWNrUmVzaXplJiZpKHdpbmRvdywicmVzaXplIix0aGlzLl9vblJlc2l6ZSx0aGlzKSxOaSYmdGhpcy5vcHRpb25zLnRyYW5zZm9ybTNETGltaXQmJih0P3RoaXMub2ZmOnRoaXMub24pLmNhbGwodGhpcywibW92ZWVuZCIsdGhpcy5fb25Nb3ZlRW5kKX0sX29uUmVzaXplOmZ1bmN0aW9uKCl7Zyh0aGlzLl9yZXNpemVSZXF1ZXN0KSx0aGlzLl9yZXNpemVSZXF1ZXN0PWYoZnVuY3Rpb24oKXt0aGlzLmludmFsaWRhdGVTaXplKHtkZWJvdW5jZU1vdmVlbmQ6ITB9KX0sdGhpcyl9LF9vblNjcm9sbDpmdW5jdGlvbigpe3RoaXMuX2NvbnRhaW5lci5zY3JvbGxUb3A9MCx0aGlzLl9jb250YWluZXIuc2Nyb2xsTGVmdD0wfSxfb25Nb3ZlRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0TWFwUGFuZVBvcygpO01hdGgubWF4KE1hdGguYWJzKHQueCksTWF0aC5hYnModC55KSk+PXRoaXMub3B0aW9ucy50cmFuc2Zvcm0zRExpbWl0JiZ0aGlzLl9yZXNldFZpZXcodGhpcy5nZXRDZW50ZXIoKSx0aGlzLmdldFpvb20oKSl9LF9maW5kRXZlbnRUYXJnZXRzOmZ1bmN0aW9uKHQsaSl7Zm9yKHZhciBlLG89W10scz0ibW91c2VvdXQiPT09aXx8Im1vdXNlb3ZlciI9PT1pLHI9dC50YXJnZXR8fHQuc3JjRWxlbWVudCxhPSExO3I7KXtpZigoZT10aGlzLl90YXJnZXRzW24ocildKSYmKCJjbGljayI9PT1pfHwicHJlY2xpY2siPT09aSkmJiF0Ll9zaW11bGF0ZWQmJnRoaXMuX2RyYWdnYWJsZU1vdmVkKGUpKXthPSEwO2JyZWFrfWlmKGUmJmUubGlzdGVucyhpLCEwKSl7aWYocyYmIW90KHIsdCkpYnJlYWs7aWYoby5wdXNoKGUpLHMpYnJlYWt9aWYocj09PXRoaXMuX2NvbnRhaW5lcilicmVhaztyPXIucGFyZW50Tm9kZX1yZXR1cm4gby5sZW5ndGh8fGF8fHN8fCFvdChyLHQpfHwobz1bdGhpc10pLG99LF9oYW5kbGVET01FdmVudDpmdW5jdGlvbih0KXtpZih0aGlzLl9sb2FkZWQmJiFudCh0KSl7dmFyIGk9dC50eXBlOyJtb3VzZWRvd24iIT09aSYmImtleXByZXNzIiE9PWl8fHp0KHQudGFyZ2V0fHx0LnNyY0VsZW1lbnQpLHRoaXMuX2ZpcmVET01FdmVudCh0LGkpfX0sX21vdXNlRXZlbnRzOlsiY2xpY2siLCJkYmxjbGljayIsIm1vdXNlb3ZlciIsIm1vdXNlb3V0IiwiY29udGV4dG1lbnUiXSxfZmlyZURPTUV2ZW50OmZ1bmN0aW9uKHQsZSxuKXtpZigiY2xpY2siPT09dC50eXBlKXt2YXIgbz1pKHt9LHQpO28udHlwZT0icHJlY2xpY2siLHRoaXMuX2ZpcmVET01FdmVudChvLG8udHlwZSxuKX1pZighdC5fc3RvcHBlZCYmKG49KG58fFtdKS5jb25jYXQodGhpcy5fZmluZEV2ZW50VGFyZ2V0cyh0LGUpKSkubGVuZ3RoKXt2YXIgcz1uWzBdOyJjb250ZXh0bWVudSI9PT1lJiZzLmxpc3RlbnMoZSwhMCkmJiQodCk7dmFyIHI9e29yaWdpbmFsRXZlbnQ6dH07aWYoImtleXByZXNzIiE9PXQudHlwZSl7dmFyIGE9cy5nZXRMYXRMbmcmJighcy5fcmFkaXVzfHxzLl9yYWRpdXM8PTEwKTtyLmNvbnRhaW5lclBvaW50PWE/dGhpcy5sYXRMbmdUb0NvbnRhaW5lclBvaW50KHMuZ2V0TGF0TG5nKCkpOnRoaXMubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodCksci5sYXllclBvaW50PXRoaXMuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQoci5jb250YWluZXJQb2ludCksci5sYXRsbmc9YT9zLmdldExhdExuZygpOnRoaXMubGF5ZXJQb2ludFRvTGF0TG5nKHIubGF5ZXJQb2ludCl9Zm9yKHZhciBoPTA7aDxuLmxlbmd0aDtoKyspaWYobltoXS5maXJlKGUsciwhMCksci5vcmlnaW5hbEV2ZW50Ll9zdG9wcGVkfHwhMT09PW5baF0ub3B0aW9ucy5idWJibGluZ01vdXNlRXZlbnRzJiYtMSE9PWQodGhpcy5fbW91c2VFdmVudHMsZSkpcmV0dXJufX0sX2RyYWdnYWJsZU1vdmVkOmZ1bmN0aW9uKHQpe3JldHVybih0PXQuZHJhZ2dpbmcmJnQuZHJhZ2dpbmcuZW5hYmxlZCgpP3Q6dGhpcykuZHJhZ2dpbmcmJnQuZHJhZ2dpbmcubW92ZWQoKXx8dGhpcy5ib3hab29tJiZ0aGlzLmJveFpvb20ubW92ZWQoKX0sX2NsZWFySGFuZGxlcnM6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxpPXRoaXMuX2hhbmRsZXJzLmxlbmd0aDt0PGk7dCsrKXRoaXMuX2hhbmRsZXJzW3RdLmRpc2FibGUoKX0sd2hlblJlYWR5OmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRoaXMuX2xvYWRlZD90LmNhbGwoaXx8dGhpcyx7dGFyZ2V0OnRoaXN9KTp0aGlzLm9uKCJsb2FkIix0LGkpLHRoaXN9LF9nZXRNYXBQYW5lUG9zOmZ1bmN0aW9uKCl7cmV0dXJuIFB0KHRoaXMuX21hcFBhbmUpfHxuZXcgeCgwLDApfSxfbW92ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9nZXRNYXBQYW5lUG9zKCk7cmV0dXJuIHQmJiF0LmVxdWFscyhbMCwwXSl9LF9nZXRUb3BMZWZ0UG9pbnQ6ZnVuY3Rpb24odCxpKXtyZXR1cm4odCYmdm9pZCAwIT09aT90aGlzLl9nZXROZXdQaXhlbE9yaWdpbih0LGkpOnRoaXMuZ2V0UGl4ZWxPcmlnaW4oKSkuc3VidHJhY3QodGhpcy5fZ2V0TWFwUGFuZVBvcygpKX0sX2dldE5ld1BpeGVsT3JpZ2luOmZ1bmN0aW9uKHQsaSl7dmFyIGU9dGhpcy5nZXRTaXplKCkuX2RpdmlkZUJ5KDIpO3JldHVybiB0aGlzLnByb2plY3QodCxpKS5fc3VidHJhY3QoZSkuX2FkZCh0aGlzLl9nZXRNYXBQYW5lUG9zKCkpLl9yb3VuZCgpfSxfbGF0TG5nVG9OZXdMYXllclBvaW50OmZ1bmN0aW9uKHQsaSxlKXt2YXIgbj10aGlzLl9nZXROZXdQaXhlbE9yaWdpbihlLGkpO3JldHVybiB0aGlzLnByb2plY3QodCxpKS5fc3VidHJhY3Qobil9LF9sYXRMbmdCb3VuZHNUb05ld0xheWVyQm91bmRzOmZ1bmN0aW9uKHQsaSxlKXt2YXIgbj10aGlzLl9nZXROZXdQaXhlbE9yaWdpbihlLGkpO3JldHVybiBiKFt0aGlzLnByb2plY3QodC5nZXRTb3V0aFdlc3QoKSxpKS5fc3VidHJhY3QobiksdGhpcy5wcm9qZWN0KHQuZ2V0Tm9ydGhXZXN0KCksaSkuX3N1YnRyYWN0KG4pLHRoaXMucHJvamVjdCh0LmdldFNvdXRoRWFzdCgpLGkpLl9zdWJ0cmFjdChuKSx0aGlzLnByb2plY3QodC5nZXROb3J0aEVhc3QoKSxpKS5fc3VidHJhY3QobildKX0sX2dldENlbnRlckxheWVyUG9pbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludCh0aGlzLmdldFNpemUoKS5fZGl2aWRlQnkoMikpfSxfZ2V0Q2VudGVyT2Zmc2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxhdExuZ1RvTGF5ZXJQb2ludCh0KS5zdWJ0cmFjdCh0aGlzLl9nZXRDZW50ZXJMYXllclBvaW50KCkpfSxfbGltaXRDZW50ZXI6ZnVuY3Rpb24odCxpLGUpe2lmKCFlKXJldHVybiB0O3ZhciBuPXRoaXMucHJvamVjdCh0LGkpLG89dGhpcy5nZXRTaXplKCkuZGl2aWRlQnkoMikscz1uZXcgUChuLnN1YnRyYWN0KG8pLG4uYWRkKG8pKSxyPXRoaXMuX2dldEJvdW5kc09mZnNldChzLGUsaSk7cmV0dXJuIHIucm91bmQoKS5lcXVhbHMoWzAsMF0pP3Q6dGhpcy51bnByb2plY3Qobi5hZGQociksaSl9LF9saW1pdE9mZnNldDpmdW5jdGlvbih0LGkpe2lmKCFpKXJldHVybiB0O3ZhciBlPXRoaXMuZ2V0UGl4ZWxCb3VuZHMoKSxuPW5ldyBQKGUubWluLmFkZCh0KSxlLm1heC5hZGQodCkpO3JldHVybiB0LmFkZCh0aGlzLl9nZXRCb3VuZHNPZmZzZXQobixpKSl9LF9nZXRCb3VuZHNPZmZzZXQ6ZnVuY3Rpb24odCxpLGUpe3ZhciBuPWIodGhpcy5wcm9qZWN0KGkuZ2V0Tm9ydGhFYXN0KCksZSksdGhpcy5wcm9qZWN0KGkuZ2V0U291dGhXZXN0KCksZSkpLG89bi5taW4uc3VidHJhY3QodC5taW4pLHM9bi5tYXguc3VidHJhY3QodC5tYXgpO3JldHVybiBuZXcgeCh0aGlzLl9yZWJvdW5kKG8ueCwtcy54KSx0aGlzLl9yZWJvdW5kKG8ueSwtcy55KSl9LF9yZWJvdW5kOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHQraT4wP01hdGgucm91bmQodC1pKS8yOk1hdGgubWF4KDAsTWF0aC5jZWlsKHQpKS1NYXRoLm1heCgwLE1hdGguZmxvb3IoaSkpfSxfbGltaXRab29tOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuZ2V0TWluWm9vbSgpLGU9dGhpcy5nZXRNYXhab29tKCksbj1OaT90aGlzLm9wdGlvbnMuem9vbVNuYXA6MTtyZXR1cm4gbiYmKHQ9TWF0aC5yb3VuZCh0L24pKm4pLE1hdGgubWF4KGksTWF0aC5taW4oZSx0KSl9LF9vblBhblRyYW5zaXRpb25TdGVwOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJtb3ZlIil9LF9vblBhblRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXttdCh0aGlzLl9tYXBQYW5lLCJsZWFmbGV0LXBhbi1hbmltIiksdGhpcy5maXJlKCJtb3ZlZW5kIil9LF90cnlBbmltYXRlZFBhbjpmdW5jdGlvbih0LGkpe3ZhciBlPXRoaXMuX2dldENlbnRlck9mZnNldCh0KS5fdHJ1bmMoKTtyZXR1cm4hKCEwIT09KGkmJmkuYW5pbWF0ZSkmJiF0aGlzLmdldFNpemUoKS5jb250YWlucyhlKSkmJih0aGlzLnBhbkJ5KGUsaSksITApfSxfY3JlYXRlQW5pbVByb3h5OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcHJveHk9aHQoImRpdiIsImxlYWZsZXQtcHJveHkgbGVhZmxldC16b29tLWFuaW1hdGVkIik7dGhpcy5fcGFuZXMubWFwUGFuZS5hcHBlbmRDaGlsZCh0KSx0aGlzLm9uKCJ6b29tYW5pbSIsZnVuY3Rpb24odCl7dmFyIGk9cGUsZT10aGlzLl9wcm94eS5zdHlsZVtpXTt3dCh0aGlzLl9wcm94eSx0aGlzLnByb2plY3QodC5jZW50ZXIsdC56b29tKSx0aGlzLmdldFpvb21TY2FsZSh0Lnpvb20sMSkpLGU9PT10aGlzLl9wcm94eS5zdHlsZVtpXSYmdGhpcy5fYW5pbWF0aW5nWm9vbSYmdGhpcy5fb25ab29tVHJhbnNpdGlvbkVuZCgpfSx0aGlzKSx0aGlzLm9uKCJsb2FkIG1vdmVlbmQiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRDZW50ZXIoKSxpPXRoaXMuZ2V0Wm9vbSgpO3d0KHRoaXMuX3Byb3h5LHRoaXMucHJvamVjdCh0LGkpLHRoaXMuZ2V0Wm9vbVNjYWxlKGksMSkpfSx0aGlzKSx0aGlzLl9vbigidW5sb2FkIix0aGlzLl9kZXN0cm95QW5pbVByb3h5LHRoaXMpfSxfZGVzdHJveUFuaW1Qcm94eTpmdW5jdGlvbigpe3V0KHRoaXMuX3Byb3h5KSxkZWxldGUgdGhpcy5fcHJveHl9LF9jYXRjaFRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24odCl7dGhpcy5fYW5pbWF0aW5nWm9vbSYmdC5wcm9wZXJ0eU5hbWUuaW5kZXhPZigidHJhbnNmb3JtIik+PTAmJnRoaXMuX29uWm9vbVRyYW5zaXRpb25FbmQoKX0sX25vdGhpbmdUb0FuaW1hdGU6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5fY29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImxlYWZsZXQtem9vbS1hbmltYXRlZCIpLmxlbmd0aH0sX3RyeUFuaW1hdGVkWm9vbTpmdW5jdGlvbih0LGksZSl7aWYodGhpcy5fYW5pbWF0aW5nWm9vbSlyZXR1cm4hMDtpZihlPWV8fHt9LCF0aGlzLl96b29tQW5pbWF0ZWR8fCExPT09ZS5hbmltYXRlfHx0aGlzLl9ub3RoaW5nVG9BbmltYXRlKCl8fE1hdGguYWJzKGktdGhpcy5fem9vbSk+dGhpcy5vcHRpb25zLnpvb21BbmltYXRpb25UaHJlc2hvbGQpcmV0dXJuITE7dmFyIG49dGhpcy5nZXRab29tU2NhbGUoaSksbz10aGlzLl9nZXRDZW50ZXJPZmZzZXQodCkuX2RpdmlkZUJ5KDEtMS9uKTtyZXR1cm4hKCEwIT09ZS5hbmltYXRlJiYhdGhpcy5nZXRTaXplKCkuY29udGFpbnMobykpJiYoZihmdW5jdGlvbigpe3RoaXMuX21vdmVTdGFydCghMCwhMSkuX2FuaW1hdGVab29tKHQsaSwhMCl9LHRoaXMpLCEwKX0sX2FuaW1hdGVab29tOmZ1bmN0aW9uKHQsaSxuLG8pe3RoaXMuX21hcFBhbmUmJihuJiYodGhpcy5fYW5pbWF0aW5nWm9vbT0hMCx0aGlzLl9hbmltYXRlVG9DZW50ZXI9dCx0aGlzLl9hbmltYXRlVG9ab29tPWkscHQodGhpcy5fbWFwUGFuZSwibGVhZmxldC16b29tLWFuaW0iKSksdGhpcy5maXJlKCJ6b29tYW5pbSIse2NlbnRlcjp0LHpvb206aSxub1VwZGF0ZTpvfSksc2V0VGltZW91dChlKHRoaXMuX29uWm9vbVRyYW5zaXRpb25FbmQsdGhpcyksMjUwKSl9LF9vblpvb21UcmFuc2l0aW9uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW5nWm9vbSYmKHRoaXMuX21hcFBhbmUmJm10KHRoaXMuX21hcFBhbmUsImxlYWZsZXQtem9vbS1hbmltIiksdGhpcy5fYW5pbWF0aW5nWm9vbT0hMSx0aGlzLl9tb3ZlKHRoaXMuX2FuaW1hdGVUb0NlbnRlcix0aGlzLl9hbmltYXRlVG9ab29tKSxmKGZ1bmN0aW9uKCl7dGhpcy5fbW92ZUVuZCghMCl9LHRoaXMpKX19KSxQZT12LmV4dGVuZCh7b3B0aW9uczp7cG9zaXRpb246InRvcHJpZ2h0In0saW5pdGlhbGl6ZTpmdW5jdGlvbih0KXtsKHRoaXMsdCl9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5wb3NpdGlvbn0sc2V0UG9zaXRpb246ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFwO3JldHVybiBpJiZpLnJlbW92ZUNvbnRyb2wodGhpcyksdGhpcy5vcHRpb25zLnBvc2l0aW9uPXQsaSYmaS5hZGRDb250cm9sKHRoaXMpLHRoaXN9LGdldENvbnRhaW5lcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250YWluZXJ9LGFkZFRvOmZ1bmN0aW9uKHQpe3RoaXMucmVtb3ZlKCksdGhpcy5fbWFwPXQ7dmFyIGk9dGhpcy5fY29udGFpbmVyPXRoaXMub25BZGQodCksZT10aGlzLmdldFBvc2l0aW9uKCksbj10Ll9jb250cm9sQ29ybmVyc1tlXTtyZXR1cm4gcHQoaSwibGVhZmxldC1jb250cm9sIiksLTEhPT1lLmluZGV4T2YoImJvdHRvbSIpP24uaW5zZXJ0QmVmb3JlKGksbi5maXJzdENoaWxkKTpuLmFwcGVuZENoaWxkKGkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXA/KHV0KHRoaXMuX2NvbnRhaW5lciksdGhpcy5vblJlbW92ZSYmdGhpcy5vblJlbW92ZSh0aGlzLl9tYXApLHRoaXMuX21hcD1udWxsLHRoaXMpOnRoaXN9LF9yZWZvY3VzT25NYXA6ZnVuY3Rpb24odCl7dGhpcy5fbWFwJiZ0JiZ0LnNjcmVlblg+MCYmdC5zY3JlZW5ZPjAmJnRoaXMuX21hcC5nZXRDb250YWluZXIoKS5mb2N1cygpfX0pLGJlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUGUodCl9O0xlLmluY2x1ZGUoe2FkZENvbnRyb2w6ZnVuY3Rpb24odCl7cmV0dXJuIHQuYWRkVG8odGhpcyksdGhpc30scmVtb3ZlQ29udHJvbDpmdW5jdGlvbih0KXtyZXR1cm4gdC5yZW1vdmUoKSx0aGlzfSxfaW5pdENvbnRyb2xQb3M6ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsbyl7dmFyIHM9ZSt0KyIgIitlK287aVt0K29dPWh0KCJkaXYiLHMsbil9dmFyIGk9dGhpcy5fY29udHJvbENvcm5lcnM9e30sZT0ibGVhZmxldC0iLG49dGhpcy5fY29udHJvbENvbnRhaW5lcj1odCgiZGl2IixlKyJjb250cm9sLWNvbnRhaW5lciIsdGhpcy5fY29udGFpbmVyKTt0KCJ0b3AiLCJsZWZ0IiksdCgidG9wIiwicmlnaHQiKSx0KCJib3R0b20iLCJsZWZ0IiksdCgiYm90dG9tIiwicmlnaHQiKX0sX2NsZWFyQ29udHJvbFBvczpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl9jb250cm9sQ29ybmVycyl1dCh0aGlzLl9jb250cm9sQ29ybmVyc1t0XSk7dXQodGhpcy5fY29udHJvbENvbnRhaW5lciksZGVsZXRlIHRoaXMuX2NvbnRyb2xDb3JuZXJzLGRlbGV0ZSB0aGlzLl9jb250cm9sQ29udGFpbmVyfX0pO3ZhciBUZT1QZS5leHRlbmQoe29wdGlvbnM6e2NvbGxhcHNlZDohMCxwb3NpdGlvbjoidG9wcmlnaHQiLGF1dG9aSW5kZXg6ITAsaGlkZVNpbmdsZUJhc2U6ITEsc29ydExheWVyczohMSxzb3J0RnVuY3Rpb246ZnVuY3Rpb24odCxpLGUsbil7cmV0dXJuIGU8bj8tMTpuPGU/MTowfX0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGksZSl7bCh0aGlzLGUpLHRoaXMuX2xheWVyQ29udHJvbElucHV0cz1bXSx0aGlzLl9sYXllcnM9W10sdGhpcy5fbGFzdFpJbmRleD0wLHRoaXMuX2hhbmRsaW5nQ2xpY2s9ITE7Zm9yKHZhciBuIGluIHQpdGhpcy5fYWRkTGF5ZXIodFtuXSxuKTtmb3IobiBpbiBpKXRoaXMuX2FkZExheWVyKGlbbl0sbiwhMCl9LG9uQWRkOmZ1bmN0aW9uKHQpe3RoaXMuX2luaXRMYXlvdXQoKSx0aGlzLl91cGRhdGUoKSx0aGlzLl9tYXA9dCx0Lm9uKCJ6b29tZW5kIix0aGlzLl9jaGVja0Rpc2FibGVkTGF5ZXJzLHRoaXMpO2Zvcih2YXIgaT0wO2k8dGhpcy5fbGF5ZXJzLmxlbmd0aDtpKyspdGhpcy5fbGF5ZXJzW2ldLmxheWVyLm9uKCJhZGQgcmVtb3ZlIix0aGlzLl9vbkxheWVyQ2hhbmdlLHRoaXMpO3JldHVybiB0aGlzLl9jb250YWluZXJ9LGFkZFRvOmZ1bmN0aW9uKHQpe3JldHVybiBQZS5wcm90b3R5cGUuYWRkVG8uY2FsbCh0aGlzLHQpLHRoaXMuX2V4cGFuZElmTm90Q29sbGFwc2VkKCl9LG9uUmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLm9mZigiem9vbWVuZCIsdGhpcy5fY2hlY2tEaXNhYmxlZExheWVycyx0aGlzKTtmb3IodmFyIHQ9MDt0PHRoaXMuX2xheWVycy5sZW5ndGg7dCsrKXRoaXMuX2xheWVyc1t0XS5sYXllci5vZmYoImFkZCByZW1vdmUiLHRoaXMuX29uTGF5ZXJDaGFuZ2UsdGhpcyl9LGFkZEJhc2VMYXllcjpmdW5jdGlvbih0LGkpe3JldHVybiB0aGlzLl9hZGRMYXllcih0LGkpLHRoaXMuX21hcD90aGlzLl91cGRhdGUoKTp0aGlzfSxhZGRPdmVybGF5OmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRoaXMuX2FkZExheWVyKHQsaSwhMCksdGhpcy5fbWFwP3RoaXMuX3VwZGF0ZSgpOnRoaXN9LHJlbW92ZUxheWVyOmZ1bmN0aW9uKHQpe3Qub2ZmKCJhZGQgcmVtb3ZlIix0aGlzLl9vbkxheWVyQ2hhbmdlLHRoaXMpO3ZhciBpPXRoaXMuX2dldExheWVyKG4odCkpO3JldHVybiBpJiZ0aGlzLl9sYXllcnMuc3BsaWNlKHRoaXMuX2xheWVycy5pbmRleE9mKGkpLDEpLHRoaXMuX21hcD90aGlzLl91cGRhdGUoKTp0aGlzfSxleHBhbmQ6ZnVuY3Rpb24oKXtwdCh0aGlzLl9jb250YWluZXIsImxlYWZsZXQtY29udHJvbC1sYXllcnMtZXhwYW5kZWQiKSx0aGlzLl9mb3JtLnN0eWxlLmhlaWdodD1udWxsO3ZhciB0PXRoaXMuX21hcC5nZXRTaXplKCkueS0odGhpcy5fY29udGFpbmVyLm9mZnNldFRvcCs1MCk7cmV0dXJuIHQ8dGhpcy5fZm9ybS5jbGllbnRIZWlnaHQ/KHB0KHRoaXMuX2Zvcm0sImxlYWZsZXQtY29udHJvbC1sYXllcnMtc2Nyb2xsYmFyIiksdGhpcy5fZm9ybS5zdHlsZS5oZWlnaHQ9dCsicHgiKTptdCh0aGlzLl9mb3JtLCJsZWFmbGV0LWNvbnRyb2wtbGF5ZXJzLXNjcm9sbGJhciIpLHRoaXMuX2NoZWNrRGlzYWJsZWRMYXllcnMoKSx0aGlzfSxjb2xsYXBzZTpmdW5jdGlvbigpe3JldHVybiBtdCh0aGlzLl9jb250YWluZXIsImxlYWZsZXQtY29udHJvbC1sYXllcnMtZXhwYW5kZWQiKSx0aGlzfSxfaW5pdExheW91dDpmdW5jdGlvbigpe3ZhciB0PSJsZWFmbGV0LWNvbnRyb2wtbGF5ZXJzIixpPXRoaXMuX2NvbnRhaW5lcj1odCgiZGl2Iix0KSxlPXRoaXMub3B0aW9ucy5jb2xsYXBzZWQ7aS5zZXRBdHRyaWJ1dGUoImFyaWEtaGFzcG9wdXAiLCEwKSxKKGkpLFgoaSk7dmFyIG49dGhpcy5fZm9ybT1odCgiZm9ybSIsdCsiLWxpc3QiKTtlJiYodGhpcy5fbWFwLm9uKCJjbGljayIsdGhpcy5jb2xsYXBzZSx0aGlzKSxUaXx8VihpLHttb3VzZWVudGVyOnRoaXMuZXhwYW5kLG1vdXNlbGVhdmU6dGhpcy5jb2xsYXBzZX0sdGhpcykpO3ZhciBvPXRoaXMuX2xheWVyc0xpbms9aHQoImEiLHQrIi10b2dnbGUiLGkpO28uaHJlZj0iIyIsby50aXRsZT0iTGF5ZXJzIixWaT8oVihvLCJjbGljayIsUSksVihvLCJjbGljayIsdGhpcy5leHBhbmQsdGhpcykpOlYobywiZm9jdXMiLHRoaXMuZXhwYW5kLHRoaXMpLGV8fHRoaXMuZXhwYW5kKCksdGhpcy5fYmFzZUxheWVyc0xpc3Q9aHQoImRpdiIsdCsiLWJhc2UiLG4pLHRoaXMuX3NlcGFyYXRvcj1odCgiZGl2Iix0KyItc2VwYXJhdG9yIixuKSx0aGlzLl9vdmVybGF5c0xpc3Q9aHQoImRpdiIsdCsiLW92ZXJsYXlzIixuKSxpLmFwcGVuZENoaWxkKG4pfSxfZ2V0TGF5ZXI6ZnVuY3Rpb24odCl7Zm9yKHZhciBpPTA7aTx0aGlzLl9sYXllcnMubGVuZ3RoO2krKylpZih0aGlzLl9sYXllcnNbaV0mJm4odGhpcy5fbGF5ZXJzW2ldLmxheWVyKT09PXQpcmV0dXJuIHRoaXMuX2xheWVyc1tpXX0sX2FkZExheWVyOmZ1bmN0aW9uKHQsaSxuKXt0aGlzLl9tYXAmJnQub24oImFkZCByZW1vdmUiLHRoaXMuX29uTGF5ZXJDaGFuZ2UsdGhpcyksdGhpcy5fbGF5ZXJzLnB1c2goe2xheWVyOnQsbmFtZTppLG92ZXJsYXk6bn0pLHRoaXMub3B0aW9ucy5zb3J0TGF5ZXJzJiZ0aGlzLl9sYXllcnMuc29ydChlKGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRoaXMub3B0aW9ucy5zb3J0RnVuY3Rpb24odC5sYXllcixpLmxheWVyLHQubmFtZSxpLm5hbWUpfSx0aGlzKSksdGhpcy5vcHRpb25zLmF1dG9aSW5kZXgmJnQuc2V0WkluZGV4JiYodGhpcy5fbGFzdFpJbmRleCsrLHQuc2V0WkluZGV4KHRoaXMuX2xhc3RaSW5kZXgpKSx0aGlzLl9leHBhbmRJZk5vdENvbGxhcHNlZCgpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2NvbnRhaW5lcilyZXR1cm4gdGhpcztsdCh0aGlzLl9iYXNlTGF5ZXJzTGlzdCksbHQodGhpcy5fb3ZlcmxheXNMaXN0KSx0aGlzLl9sYXllckNvbnRyb2xJbnB1dHM9W107dmFyIHQsaSxlLG4sbz0wO2ZvcihlPTA7ZTx0aGlzLl9sYXllcnMubGVuZ3RoO2UrKyluPXRoaXMuX2xheWVyc1tlXSx0aGlzLl9hZGRJdGVtKG4pLGk9aXx8bi5vdmVybGF5LHQ9dHx8IW4ub3ZlcmxheSxvKz1uLm92ZXJsYXk/MDoxO3JldHVybiB0aGlzLm9wdGlvbnMuaGlkZVNpbmdsZUJhc2UmJih0PXQmJm8+MSx0aGlzLl9iYXNlTGF5ZXJzTGlzdC5zdHlsZS5kaXNwbGF5PXQ/IiI6Im5vbmUiKSx0aGlzLl9zZXBhcmF0b3Iuc3R5bGUuZGlzcGxheT1pJiZ0PyIiOiJub25lIix0aGlzfSxfb25MYXllckNoYW5nZTpmdW5jdGlvbih0KXt0aGlzLl9oYW5kbGluZ0NsaWNrfHx0aGlzLl91cGRhdGUoKTt2YXIgaT10aGlzLl9nZXRMYXllcihuKHQudGFyZ2V0KSksZT1pLm92ZXJsYXk/ImFkZCI9PT10LnR5cGU/Im92ZXJsYXlhZGQiOiJvdmVybGF5cmVtb3ZlIjoiYWRkIj09PXQudHlwZT8iYmFzZWxheWVyY2hhbmdlIjpudWxsO2UmJnRoaXMuX21hcC5maXJlKGUsaSl9LF9jcmVhdGVSYWRpb0VsZW1lbnQ6ZnVuY3Rpb24odCxpKXt2YXIgZT0nPGlucHV0IHR5cGU9InJhZGlvIiBjbGFzcz0ibGVhZmxldC1jb250cm9sLWxheWVycy1zZWxlY3RvciIgbmFtZT0iJyt0KyciJysoaT8nIGNoZWNrZWQ9ImNoZWNrZWQiJzoiIikrIi8+IixuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBuLmlubmVySFRNTD1lLG4uZmlyc3RDaGlsZH0sX2FkZEl0ZW06ZnVuY3Rpb24odCl7dmFyIGksZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpLG89dGhpcy5fbWFwLmhhc0xheWVyKHQubGF5ZXIpO3Qub3ZlcmxheT8oKGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkudHlwZT0iY2hlY2tib3giLGkuY2xhc3NOYW1lPSJsZWFmbGV0LWNvbnRyb2wtbGF5ZXJzLXNlbGVjdG9yIixpLmRlZmF1bHRDaGVja2VkPW8pOmk9dGhpcy5fY3JlYXRlUmFkaW9FbGVtZW50KCJsZWFmbGV0LWJhc2UtbGF5ZXJzIixvKSx0aGlzLl9sYXllckNvbnRyb2xJbnB1dHMucHVzaChpKSxpLmxheWVySWQ9bih0LmxheWVyKSxWKGksImNsaWNrIix0aGlzLl9vbklucHV0Q2xpY2ssdGhpcyk7dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3MuaW5uZXJIVE1MPSIgIit0Lm5hbWU7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIGUuYXBwZW5kQ2hpbGQociksci5hcHBlbmRDaGlsZChpKSxyLmFwcGVuZENoaWxkKHMpLCh0Lm92ZXJsYXk/dGhpcy5fb3ZlcmxheXNMaXN0OnRoaXMuX2Jhc2VMYXllcnNMaXN0KS5hcHBlbmRDaGlsZChlKSx0aGlzLl9jaGVja0Rpc2FibGVkTGF5ZXJzKCksZX0sX29uSW5wdXRDbGljazpmdW5jdGlvbigpe3ZhciB0LGksZT10aGlzLl9sYXllckNvbnRyb2xJbnB1dHMsbj1bXSxvPVtdO3RoaXMuX2hhbmRsaW5nQ2xpY2s9ITA7Zm9yKHZhciBzPWUubGVuZ3RoLTE7cz49MDtzLS0pdD1lW3NdLGk9dGhpcy5fZ2V0TGF5ZXIodC5sYXllcklkKS5sYXllcix0LmNoZWNrZWQ/bi5wdXNoKGkpOnQuY2hlY2tlZHx8by5wdXNoKGkpO2ZvcihzPTA7czxvLmxlbmd0aDtzKyspdGhpcy5fbWFwLmhhc0xheWVyKG9bc10pJiZ0aGlzLl9tYXAucmVtb3ZlTGF5ZXIob1tzXSk7Zm9yKHM9MDtzPG4ubGVuZ3RoO3MrKyl0aGlzLl9tYXAuaGFzTGF5ZXIobltzXSl8fHRoaXMuX21hcC5hZGRMYXllcihuW3NdKTt0aGlzLl9oYW5kbGluZ0NsaWNrPSExLHRoaXMuX3JlZm9jdXNPbk1hcCgpfSxfY2hlY2tEaXNhYmxlZExheWVyczpmdW5jdGlvbigpe2Zvcih2YXIgdCxpLGU9dGhpcy5fbGF5ZXJDb250cm9sSW5wdXRzLG49dGhpcy5fbWFwLmdldFpvb20oKSxvPWUubGVuZ3RoLTE7bz49MDtvLS0pdD1lW29dLGk9dGhpcy5fZ2V0TGF5ZXIodC5sYXllcklkKS5sYXllcix0LmRpc2FibGVkPXZvaWQgMCE9PWkub3B0aW9ucy5taW5ab29tJiZuPGkub3B0aW9ucy5taW5ab29tfHx2b2lkIDAhPT1pLm9wdGlvbnMubWF4Wm9vbSYmbj5pLm9wdGlvbnMubWF4Wm9vbX0sX2V4cGFuZElmTm90Q29sbGFwc2VkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcCYmIXRoaXMub3B0aW9ucy5jb2xsYXBzZWQmJnRoaXMuZXhwYW5kKCksdGhpc30sX2V4cGFuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmV4cGFuZCgpfSxfY29sbGFwc2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb2xsYXBzZSgpfX0pLHplPVBlLmV4dGVuZCh7b3B0aW9uczp7cG9zaXRpb246InRvcGxlZnQiLHpvb21JblRleHQ6IisiLHpvb21JblRpdGxlOiJab29tIGluIix6b29tT3V0VGV4dDoiJiN4MjIxMjsiLHpvb21PdXRUaXRsZToiWm9vbSBvdXQifSxvbkFkZDpmdW5jdGlvbih0KXt2YXIgaT0ibGVhZmxldC1jb250cm9sLXpvb20iLGU9aHQoImRpdiIsaSsiIGxlYWZsZXQtYmFyIiksbj10aGlzLm9wdGlvbnM7cmV0dXJuIHRoaXMuX3pvb21JbkJ1dHRvbj10aGlzLl9jcmVhdGVCdXR0b24obi56b29tSW5UZXh0LG4uem9vbUluVGl0bGUsaSsiLWluIixlLHRoaXMuX3pvb21JbiksdGhpcy5fem9vbU91dEJ1dHRvbj10aGlzLl9jcmVhdGVCdXR0b24obi56b29tT3V0VGV4dCxuLnpvb21PdXRUaXRsZSxpKyItb3V0IixlLHRoaXMuX3pvb21PdXQpLHRoaXMuX3VwZGF0ZURpc2FibGVkKCksdC5vbigiem9vbWVuZCB6b29tbGV2ZWxzY2hhbmdlIix0aGlzLl91cGRhdGVEaXNhYmxlZCx0aGlzKSxlfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0Lm9mZigiem9vbWVuZCB6b29tbGV2ZWxzY2hhbmdlIix0aGlzLl91cGRhdGVEaXNhYmxlZCx0aGlzKX0sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXNhYmxlZD0hMCx0aGlzLl91cGRhdGVEaXNhYmxlZCgpLHRoaXN9LGVuYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXNhYmxlZD0hMSx0aGlzLl91cGRhdGVEaXNhYmxlZCgpLHRoaXN9LF96b29tSW46ZnVuY3Rpb24odCl7IXRoaXMuX2Rpc2FibGVkJiZ0aGlzLl9tYXAuX3pvb208dGhpcy5fbWFwLmdldE1heFpvb20oKSYmdGhpcy5fbWFwLnpvb21Jbih0aGlzLl9tYXAub3B0aW9ucy56b29tRGVsdGEqKHQuc2hpZnRLZXk/MzoxKSl9LF96b29tT3V0OmZ1bmN0aW9uKHQpeyF0aGlzLl9kaXNhYmxlZCYmdGhpcy5fbWFwLl96b29tPnRoaXMuX21hcC5nZXRNaW5ab29tKCkmJnRoaXMuX21hcC56b29tT3V0KHRoaXMuX21hcC5vcHRpb25zLnpvb21EZWx0YSoodC5zaGlmdEtleT8zOjEpKX0sX2NyZWF0ZUJ1dHRvbjpmdW5jdGlvbih0LGksZSxuLG8pe3ZhciBzPWh0KCJhIixlLG4pO3JldHVybiBzLmlubmVySFRNTD10LHMuaHJlZj0iIyIscy50aXRsZT1pLHMuc2V0QXR0cmlidXRlKCJyb2xlIiwiYnV0dG9uIikscy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGkpLEoocyksVihzLCJjbGljayIsUSksVihzLCJjbGljayIsbyx0aGlzKSxWKHMsImNsaWNrIix0aGlzLl9yZWZvY3VzT25NYXAsdGhpcyksc30sX3VwZGF0ZURpc2FibGVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLGk9ImxlYWZsZXQtZGlzYWJsZWQiO210KHRoaXMuX3pvb21JbkJ1dHRvbixpKSxtdCh0aGlzLl96b29tT3V0QnV0dG9uLGkpLCh0aGlzLl9kaXNhYmxlZHx8dC5fem9vbT09PXQuZ2V0TWluWm9vbSgpKSYmcHQodGhpcy5fem9vbU91dEJ1dHRvbixpKSwodGhpcy5fZGlzYWJsZWR8fHQuX3pvb209PT10LmdldE1heFpvb20oKSkmJnB0KHRoaXMuX3pvb21JbkJ1dHRvbixpKX19KTtMZS5tZXJnZU9wdGlvbnMoe3pvb21Db250cm9sOiEwfSksTGUuYWRkSW5pdEhvb2soZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuem9vbUNvbnRyb2wmJih0aGlzLnpvb21Db250cm9sPW5ldyB6ZSx0aGlzLmFkZENvbnRyb2wodGhpcy56b29tQ29udHJvbCkpfSk7dmFyIE1lPVBlLmV4dGVuZCh7b3B0aW9uczp7cG9zaXRpb246ImJvdHRvbWxlZnQiLG1heFdpZHRoOjEwMCxtZXRyaWM6ITAsaW1wZXJpYWw6ITB9LG9uQWRkOmZ1bmN0aW9uKHQpe3ZhciBpPWh0KCJkaXYiLCJsZWFmbGV0LWNvbnRyb2wtc2NhbGUiKSxlPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5fYWRkU2NhbGVzKGUsImxlYWZsZXQtY29udHJvbC1zY2FsZS1saW5lIixpKSx0Lm9uKGUudXBkYXRlV2hlbklkbGU/Im1vdmVlbmQiOiJtb3ZlIix0aGlzLl91cGRhdGUsdGhpcyksdC53aGVuUmVhZHkodGhpcy5fdXBkYXRlLHRoaXMpLGl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3Qub2ZmKHRoaXMub3B0aW9ucy51cGRhdGVXaGVuSWRsZT8ibW92ZWVuZCI6Im1vdmUiLHRoaXMuX3VwZGF0ZSx0aGlzKX0sX2FkZFNjYWxlczpmdW5jdGlvbih0LGksZSl7dC5tZXRyaWMmJih0aGlzLl9tU2NhbGU9aHQoImRpdiIsaSxlKSksdC5pbXBlcmlhbCYmKHRoaXMuX2lTY2FsZT1odCgiZGl2IixpLGUpKX0sX3VwZGF0ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcCxpPXQuZ2V0U2l6ZSgpLnkvMixlPXQuZGlzdGFuY2UodC5jb250YWluZXJQb2ludFRvTGF0TG5nKFswLGldKSx0LmNvbnRhaW5lclBvaW50VG9MYXRMbmcoW3RoaXMub3B0aW9ucy5tYXhXaWR0aCxpXSkpO3RoaXMuX3VwZGF0ZVNjYWxlcyhlKX0sX3VwZGF0ZVNjYWxlczpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMubWV0cmljJiZ0JiZ0aGlzLl91cGRhdGVNZXRyaWModCksdGhpcy5vcHRpb25zLmltcGVyaWFsJiZ0JiZ0aGlzLl91cGRhdGVJbXBlcmlhbCh0KX0sX3VwZGF0ZU1ldHJpYzpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9nZXRSb3VuZE51bSh0KSxlPWk8MWUzP2krIiBtIjppLzFlMysiIGttIjt0aGlzLl91cGRhdGVTY2FsZSh0aGlzLl9tU2NhbGUsZSxpL3QpfSxfdXBkYXRlSW1wZXJpYWw6ZnVuY3Rpb24odCl7dmFyIGksZSxuLG89My4yODA4Mzk5KnQ7bz41MjgwPyhpPW8vNTI4MCxlPXRoaXMuX2dldFJvdW5kTnVtKGkpLHRoaXMuX3VwZGF0ZVNjYWxlKHRoaXMuX2lTY2FsZSxlKyIgbWkiLGUvaSkpOihuPXRoaXMuX2dldFJvdW5kTnVtKG8pLHRoaXMuX3VwZGF0ZVNjYWxlKHRoaXMuX2lTY2FsZSxuKyIgZnQiLG4vbykpfSxfdXBkYXRlU2NhbGU6ZnVuY3Rpb24odCxpLGUpe3Quc3R5bGUud2lkdGg9TWF0aC5yb3VuZCh0aGlzLm9wdGlvbnMubWF4V2lkdGgqZSkrInB4Iix0LmlubmVySFRNTD1pfSxfZ2V0Um91bmROdW06ZnVuY3Rpb24odCl7dmFyIGk9TWF0aC5wb3coMTAsKE1hdGguZmxvb3IodCkrIiIpLmxlbmd0aC0xKSxlPXQvaTtyZXR1cm4gZT1lPj0xMD8xMDplPj01PzU6ZT49Mz8zOmU+PTI/MjoxLGkqZX19KSxDZT1QZS5leHRlbmQoe29wdGlvbnM6e3Bvc2l0aW9uOiJib3R0b21yaWdodCIscHJlZml4Oic8YSBocmVmPSJodHRwczovL2xlYWZsZXRqcy5jb20iIHRpdGxlPSJBIEpTIGxpYnJhcnkgZm9yIGludGVyYWN0aXZlIG1hcHMiPkxlYWZsZXQ8L2E+J30saW5pdGlhbGl6ZTpmdW5jdGlvbih0KXtsKHRoaXMsdCksdGhpcy5fYXR0cmlidXRpb25zPXt9fSxvbkFkZDpmdW5jdGlvbih0KXt0LmF0dHJpYnV0aW9uQ29udHJvbD10aGlzLHRoaXMuX2NvbnRhaW5lcj1odCgiZGl2IiwibGVhZmxldC1jb250cm9sLWF0dHJpYnV0aW9uIiksSih0aGlzLl9jb250YWluZXIpO2Zvcih2YXIgaSBpbiB0Ll9sYXllcnMpdC5fbGF5ZXJzW2ldLmdldEF0dHJpYnV0aW9uJiZ0aGlzLmFkZEF0dHJpYnV0aW9uKHQuX2xheWVyc1tpXS5nZXRBdHRyaWJ1dGlvbigpKTtyZXR1cm4gdGhpcy5fdXBkYXRlKCksdGhpcy5fY29udGFpbmVyfSxzZXRQcmVmaXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5wcmVmaXg9dCx0aGlzLl91cGRhdGUoKSx0aGlzfSxhZGRBdHRyaWJ1dGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdD8odGhpcy5fYXR0cmlidXRpb25zW3RdfHwodGhpcy5fYXR0cmlidXRpb25zW3RdPTApLHRoaXMuX2F0dHJpYnV0aW9uc1t0XSsrLHRoaXMuX3VwZGF0ZSgpLHRoaXMpOnRoaXN9LHJlbW92ZUF0dHJpYnV0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiB0Pyh0aGlzLl9hdHRyaWJ1dGlvbnNbdF0mJih0aGlzLl9hdHRyaWJ1dGlvbnNbdF0tLSx0aGlzLl91cGRhdGUoKSksdGhpcyk6dGhpc30sX3VwZGF0ZTpmdW5jdGlvbigpe2lmKHRoaXMuX21hcCl7dmFyIHQ9W107Zm9yKHZhciBpIGluIHRoaXMuX2F0dHJpYnV0aW9ucyl0aGlzLl9hdHRyaWJ1dGlvbnNbaV0mJnQucHVzaChpKTt2YXIgZT1bXTt0aGlzLm9wdGlvbnMucHJlZml4JiZlLnB1c2godGhpcy5vcHRpb25zLnByZWZpeCksdC5sZW5ndGgmJmUucHVzaCh0LmpvaW4oIiwgIikpLHRoaXMuX2NvbnRhaW5lci5pbm5lckhUTUw9ZS5qb2luKCIgfCAiKX19fSk7TGUubWVyZ2VPcHRpb25zKHthdHRyaWJ1dGlvbkNvbnRyb2w6ITB9KSxMZS5hZGRJbml0SG9vayhmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5hdHRyaWJ1dGlvbkNvbnRyb2wmJihuZXcgQ2UpLmFkZFRvKHRoaXMpfSk7UGUuTGF5ZXJzPVRlLFBlLlpvb209emUsUGUuU2NhbGU9TWUsUGUuQXR0cmlidXRpb249Q2UsYmUubGF5ZXJzPWZ1bmN0aW9uKHQsaSxlKXtyZXR1cm4gbmV3IFRlKHQsaSxlKX0sYmUuem9vbT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHplKHQpfSxiZS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IE1lKHQpfSxiZS5hdHRyaWJ1dGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IENlKHQpfTt2YXIgWmU9di5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5fbWFwPXR9LGVuYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmFibGVkP3RoaXM6KHRoaXMuX2VuYWJsZWQ9ITAsdGhpcy5hZGRIb29rcygpLHRoaXMpfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuYWJsZWQ/KHRoaXMuX2VuYWJsZWQ9ITEsdGhpcy5yZW1vdmVIb29rcygpLHRoaXMpOnRoaXN9LGVuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX2VuYWJsZWR9fSk7WmUuYWRkVG89ZnVuY3Rpb24odCxpKXtyZXR1cm4gdC5hZGRIYW5kbGVyKGksdGhpcyksdGhpc307dmFyIFNlLEVlPXtFdmVudHM6aGl9LGtlPVZpPyJ0b3VjaHN0YXJ0IG1vdXNlZG93biI6Im1vdXNlZG93biIsQWU9e21vdXNlZG93bjoibW91c2V1cCIsdG91Y2hzdGFydDoidG91Y2hlbmQiLHBvaW50ZXJkb3duOiJ0b3VjaGVuZCIsTVNQb2ludGVyRG93bjoidG91Y2hlbmQifSxJZT17bW91c2Vkb3duOiJtb3VzZW1vdmUiLHRvdWNoc3RhcnQ6InRvdWNobW92ZSIscG9pbnRlcmRvd246InRvdWNobW92ZSIsTVNQb2ludGVyRG93bjoidG91Y2htb3ZlIn0sQmU9dWkuZXh0ZW5kKHtvcHRpb25zOntjbGlja1RvbGVyYW5jZTozfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsaSxlLG4pe2wodGhpcyxuKSx0aGlzLl9lbGVtZW50PXQsdGhpcy5fZHJhZ1N0YXJ0VGFyZ2V0PWl8fHQsdGhpcy5fcHJldmVudE91dGxpbmU9ZX0sZW5hYmxlOmZ1bmN0aW9uKCl7dGhpcy5fZW5hYmxlZHx8KFYodGhpcy5fZHJhZ1N0YXJ0VGFyZ2V0LGtlLHRoaXMuX29uRG93bix0aGlzKSx0aGlzLl9lbmFibGVkPSEwKX0sZGlzYWJsZTpmdW5jdGlvbigpe3RoaXMuX2VuYWJsZWQmJihCZS5fZHJhZ2dpbmc9PT10aGlzJiZ0aGlzLmZpbmlzaERyYWcoKSxxKHRoaXMuX2RyYWdTdGFydFRhcmdldCxrZSx0aGlzLl9vbkRvd24sdGhpcyksdGhpcy5fZW5hYmxlZD0hMSx0aGlzLl9tb3ZlZD0hMSl9LF9vbkRvd246ZnVuY3Rpb24odCl7aWYoIXQuX3NpbXVsYXRlZCYmdGhpcy5fZW5hYmxlZCYmKHRoaXMuX21vdmVkPSExLCFkdCh0aGlzLl9lbGVtZW50LCJsZWFmbGV0LXpvb20tYW5pbSIpJiYhKEJlLl9kcmFnZ2luZ3x8dC5zaGlmdEtleXx8MSE9PXQud2hpY2gmJjEhPT10LmJ1dHRvbiYmIXQudG91Y2hlc3x8KEJlLl9kcmFnZ2luZz10aGlzLHRoaXMuX3ByZXZlbnRPdXRsaW5lJiZ6dCh0aGlzLl9lbGVtZW50KSxidCgpLG1pKCksdGhpcy5fbW92aW5nKSkpKXt0aGlzLmZpcmUoImRvd24iKTt2YXIgaT10LnRvdWNoZXM/dC50b3VjaGVzWzBdOnQ7dGhpcy5fc3RhcnRQb2ludD1uZXcgeChpLmNsaWVudFgsaS5jbGllbnRZKSxWKGRvY3VtZW50LEllW3QudHlwZV0sdGhpcy5fb25Nb3ZlLHRoaXMpLFYoZG9jdW1lbnQsQWVbdC50eXBlXSx0aGlzLl9vblVwLHRoaXMpfX0sX29uTW92ZTpmdW5jdGlvbih0KXtpZighdC5fc2ltdWxhdGVkJiZ0aGlzLl9lbmFibGVkKWlmKHQudG91Y2hlcyYmdC50b3VjaGVzLmxlbmd0aD4xKXRoaXMuX21vdmVkPSEwO2Vsc2V7dmFyIGk9dC50b3VjaGVzJiYxPT09dC50b3VjaGVzLmxlbmd0aD90LnRvdWNoZXNbMF06dCxlPW5ldyB4KGkuY2xpZW50WCxpLmNsaWVudFkpLnN1YnRyYWN0KHRoaXMuX3N0YXJ0UG9pbnQpOyhlLnh8fGUueSkmJihNYXRoLmFicyhlLngpK01hdGguYWJzKGUueSk8dGhpcy5vcHRpb25zLmNsaWNrVG9sZXJhbmNlfHwoJCh0KSx0aGlzLl9tb3ZlZHx8KHRoaXMuZmlyZSgiZHJhZ3N0YXJ0IiksdGhpcy5fbW92ZWQ9ITAsdGhpcy5fc3RhcnRQb3M9UHQodGhpcy5fZWxlbWVudCkuc3VidHJhY3QoZSkscHQoZG9jdW1lbnQuYm9keSwibGVhZmxldC1kcmFnZ2luZyIpLHRoaXMuX2xhc3RUYXJnZXQ9dC50YXJnZXR8fHQuc3JjRWxlbWVudCx3aW5kb3cuU1ZHRWxlbWVudEluc3RhbmNlJiZ0aGlzLl9sYXN0VGFyZ2V0IGluc3RhbmNlb2YgU1ZHRWxlbWVudEluc3RhbmNlJiYodGhpcy5fbGFzdFRhcmdldD10aGlzLl9sYXN0VGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KSxwdCh0aGlzLl9sYXN0VGFyZ2V0LCJsZWFmbGV0LWRyYWctdGFyZ2V0IikpLHRoaXMuX25ld1Bvcz10aGlzLl9zdGFydFBvcy5hZGQoZSksdGhpcy5fbW92aW5nPSEwLGcodGhpcy5fYW5pbVJlcXVlc3QpLHRoaXMuX2xhc3RFdmVudD10LHRoaXMuX2FuaW1SZXF1ZXN0PWYodGhpcy5fdXBkYXRlUG9zaXRpb24sdGhpcywhMCkpKX19LF91cGRhdGVQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciB0PXtvcmlnaW5hbEV2ZW50OnRoaXMuX2xhc3RFdmVudH07dGhpcy5maXJlKCJwcmVkcmFnIix0KSxMdCh0aGlzLl9lbGVtZW50LHRoaXMuX25ld1BvcyksdGhpcy5maXJlKCJkcmFnIix0KX0sX29uVXA6ZnVuY3Rpb24odCl7IXQuX3NpbXVsYXRlZCYmdGhpcy5fZW5hYmxlZCYmdGhpcy5maW5pc2hEcmFnKCl9LGZpbmlzaERyYWc6ZnVuY3Rpb24oKXttdChkb2N1bWVudC5ib2R5LCJsZWFmbGV0LWRyYWdnaW5nIiksdGhpcy5fbGFzdFRhcmdldCYmKG10KHRoaXMuX2xhc3RUYXJnZXQsImxlYWZsZXQtZHJhZy10YXJnZXQiKSx0aGlzLl9sYXN0VGFyZ2V0PW51bGwpO2Zvcih2YXIgdCBpbiBJZSlxKGRvY3VtZW50LEllW3RdLHRoaXMuX29uTW92ZSx0aGlzKSxxKGRvY3VtZW50LEFlW3RdLHRoaXMuX29uVXAsdGhpcyk7VHQoKSxmaSgpLHRoaXMuX21vdmVkJiZ0aGlzLl9tb3ZpbmcmJihnKHRoaXMuX2FuaW1SZXF1ZXN0KSx0aGlzLmZpcmUoImRyYWdlbmQiLHtkaXN0YW5jZTp0aGlzLl9uZXdQb3MuZGlzdGFuY2VUbyh0aGlzLl9zdGFydFBvcyl9KSksdGhpcy5fbW92aW5nPSExLEJlLl9kcmFnZ2luZz0hMX19KSxPZT0oT2JqZWN0LmZyZWV6ZXx8T2JqZWN0KSh7c2ltcGxpZnk6Q3QscG9pbnRUb1NlZ21lbnREaXN0YW5jZTpadCxjbG9zZXN0UG9pbnRPblNlZ21lbnQ6ZnVuY3Rpb24odCxpLGUpe3JldHVybiBSdCh0LGksZSl9LGNsaXBTZWdtZW50OkF0LF9nZXRFZGdlSW50ZXJzZWN0aW9uOkl0LF9nZXRCaXRDb2RlOkJ0LF9zcUNsb3Nlc3RQb2ludE9uU2VnbWVudDpSdCxpc0ZsYXQ6RHQsX2ZsYXQ6TnR9KSxSZT0oT2JqZWN0LmZyZWV6ZXx8T2JqZWN0KSh7Y2xpcFBvbHlnb246anR9KSxEZT17cHJvamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHgodC5sbmcsdC5sYXQpfSx1bnByb2plY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBNKHQueSx0LngpfSxib3VuZHM6bmV3IFAoWy0xODAsLTkwXSxbMTgwLDkwXSl9LE5lPXtSOjYzNzgxMzcsUl9NSU5PUjo2MzU2NzUyLjMxNDI0NTE3OSxib3VuZHM6bmV3IFAoWy0yMDAzNzUwOC4zNDI3OSwtMTU0OTY1NzAuNzM5NzJdLFsyMDAzNzUwOC4zNDI3OSwxODc2NDY1Ni4yMzEzOF0pLHByb2plY3Q6ZnVuY3Rpb24odCl7dmFyIGk9TWF0aC5QSS8xODAsZT10aGlzLlIsbj10LmxhdCppLG89dGhpcy5SX01JTk9SL2Uscz1NYXRoLnNxcnQoMS1vKm8pLHI9cypNYXRoLnNpbihuKSxhPU1hdGgudGFuKE1hdGguUEkvNC1uLzIpL01hdGgucG93KCgxLXIpLygxK3IpLHMvMik7cmV0dXJuIG49LWUqTWF0aC5sb2coTWF0aC5tYXgoYSwxZS0xMCkpLG5ldyB4KHQubG5nKmkqZSxuKX0sdW5wcm9qZWN0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgaSxlPTE4MC9NYXRoLlBJLG49dGhpcy5SLG89dGhpcy5SX01JTk9SL24scz1NYXRoLnNxcnQoMS1vKm8pLHI9TWF0aC5leHAoLXQueS9uKSxhPU1hdGguUEkvMi0yKk1hdGguYXRhbihyKSxoPTAsdT0uMTtoPDE1JiZNYXRoLmFicyh1KT4xZS03O2grKylpPXMqTWF0aC5zaW4oYSksaT1NYXRoLnBvdygoMS1pKS8oMStpKSxzLzIpLGErPXU9TWF0aC5QSS8yLTIqTWF0aC5hdGFuKHIqaSktYTtyZXR1cm4gbmV3IE0oYSplLHQueCplL24pfX0samU9KE9iamVjdC5mcmVlemV8fE9iamVjdCkoe0xvbkxhdDpEZSxNZXJjYXRvcjpOZSxTcGhlcmljYWxNZXJjYXRvcjpkaX0pLFdlPWkoe30sX2kse2NvZGU6IkVQU0c6MzM5NSIscHJvamVjdGlvbjpOZSx0cmFuc2Zvcm1hdGlvbjpmdW5jdGlvbigpe3ZhciB0PS41LyhNYXRoLlBJKk5lLlIpO3JldHVybiBTKHQsLjUsLXQsLjUpfSgpfSksSGU9aSh7fSxfaSx7Y29kZToiRVBTRzo0MzI2Iixwcm9qZWN0aW9uOkRlLHRyYW5zZm9ybWF0aW9uOlMoMS8xODAsMSwtMS8xODAsLjUpfSksRmU9aSh7fSxjaSx7cHJvamVjdGlvbjpEZSx0cmFuc2Zvcm1hdGlvbjpTKDEsMCwtMSwwKSxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5wb3coMix0KX0sem9vbTpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5sb2codCkvTWF0aC5MTjJ9LGRpc3RhbmNlOmZ1bmN0aW9uKHQsaSl7dmFyIGU9aS5sbmctdC5sbmcsbj1pLmxhdC10LmxhdDtyZXR1cm4gTWF0aC5zcXJ0KGUqZStuKm4pfSxpbmZpbml0ZTohMH0pO2NpLkVhcnRoPV9pLGNpLkVQU0czMzk1PVdlLGNpLkVQU0czODU3PXZpLGNpLkVQU0c5MDA5MTM9eWksY2kuRVBTRzQzMjY9SGUsY2kuU2ltcGxlPUZlO3ZhciBVZT11aS5leHRlbmQoe29wdGlvbnM6e3BhbmU6Im92ZXJsYXlQYW5lIixhdHRyaWJ1dGlvbjpudWxsLGJ1YmJsaW5nTW91c2VFdmVudHM6ITB9LGFkZFRvOmZ1bmN0aW9uKHQpe3JldHVybiB0LmFkZExheWVyKHRoaXMpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbW92ZUZyb20odGhpcy5fbWFwfHx0aGlzLl9tYXBUb0FkZCl9LHJlbW92ZUZyb206ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQucmVtb3ZlTGF5ZXIodGhpcyksdGhpc30sZ2V0UGFuZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwLmdldFBhbmUodD90aGlzLm9wdGlvbnNbdF18fHQ6dGhpcy5vcHRpb25zLnBhbmUpfSxhZGRJbnRlcmFjdGl2ZVRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwLl90YXJnZXRzW24odCldPXRoaXMsdGhpc30scmVtb3ZlSW50ZXJhY3RpdmVUYXJnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGRlbGV0ZSB0aGlzLl9tYXAuX3RhcmdldHNbbih0KV0sdGhpc30sZ2V0QXR0cmlidXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0aW9ufSxfbGF5ZXJBZGQ6ZnVuY3Rpb24odCl7dmFyIGk9dC50YXJnZXQ7aWYoaS5oYXNMYXllcih0aGlzKSl7aWYodGhpcy5fbWFwPWksdGhpcy5fem9vbUFuaW1hdGVkPWkuX3pvb21BbmltYXRlZCx0aGlzLmdldEV2ZW50cyl7dmFyIGU9dGhpcy5nZXRFdmVudHMoKTtpLm9uKGUsdGhpcyksdGhpcy5vbmNlKCJyZW1vdmUiLGZ1bmN0aW9uKCl7aS5vZmYoZSx0aGlzKX0sdGhpcyl9dGhpcy5vbkFkZChpKSx0aGlzLmdldEF0dHJpYnV0aW9uJiZpLmF0dHJpYnV0aW9uQ29udHJvbCYmaS5hdHRyaWJ1dGlvbkNvbnRyb2wuYWRkQXR0cmlidXRpb24odGhpcy5nZXRBdHRyaWJ1dGlvbigpKSx0aGlzLmZpcmUoImFkZCIpLGkuZmlyZSgibGF5ZXJhZGQiLHtsYXllcjp0aGlzfSl9fX0pO0xlLmluY2x1ZGUoe2FkZExheWVyOmZ1bmN0aW9uKHQpe2lmKCF0Ll9sYXllckFkZCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBwcm92aWRlZCBvYmplY3QgaXMgbm90IGEgTGF5ZXIuIik7dmFyIGk9bih0KTtyZXR1cm4gdGhpcy5fbGF5ZXJzW2ldP3RoaXM6KHRoaXMuX2xheWVyc1tpXT10LHQuX21hcFRvQWRkPXRoaXMsdC5iZWZvcmVBZGQmJnQuYmVmb3JlQWRkKHRoaXMpLHRoaXMud2hlblJlYWR5KHQuX2xheWVyQWRkLHQpLHRoaXMpfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXt2YXIgaT1uKHQpO3JldHVybiB0aGlzLl9sYXllcnNbaV0/KHRoaXMuX2xvYWRlZCYmdC5vblJlbW92ZSh0aGlzKSx0LmdldEF0dHJpYnV0aW9uJiZ0aGlzLmF0dHJpYnV0aW9uQ29udHJvbCYmdGhpcy5hdHRyaWJ1dGlvbkNvbnRyb2wucmVtb3ZlQXR0cmlidXRpb24odC5nZXRBdHRyaWJ1dGlvbigpKSxkZWxldGUgdGhpcy5fbGF5ZXJzW2ldLHRoaXMuX2xvYWRlZCYmKHRoaXMuZmlyZSgibGF5ZXJyZW1vdmUiLHtsYXllcjp0fSksdC5maXJlKCJyZW1vdmUiKSksdC5fbWFwPXQuX21hcFRvQWRkPW51bGwsdGhpcyk6dGhpc30saGFzTGF5ZXI6ZnVuY3Rpb24odCl7cmV0dXJuISF0JiZuKHQpaW4gdGhpcy5fbGF5ZXJzfSxlYWNoTGF5ZXI6ZnVuY3Rpb24odCxpKXtmb3IodmFyIGUgaW4gdGhpcy5fbGF5ZXJzKXQuY2FsbChpLHRoaXMuX2xheWVyc1tlXSk7cmV0dXJuIHRoaXN9LF9hZGRMYXllcnM6ZnVuY3Rpb24odCl7Zm9yKHZhciBpPTAsZT0odD10P2VpKHQpP3Q6W3RdOltdKS5sZW5ndGg7aTxlO2krKyl0aGlzLmFkZExheWVyKHRbaV0pfSxfYWRkWm9vbUxpbWl0OmZ1bmN0aW9uKHQpeyFpc05hTih0Lm9wdGlvbnMubWF4Wm9vbSkmJmlzTmFOKHQub3B0aW9ucy5taW5ab29tKXx8KHRoaXMuX3pvb21Cb3VuZExheWVyc1tuKHQpXT10LHRoaXMuX3VwZGF0ZVpvb21MZXZlbHMoKSl9LF9yZW1vdmVab29tTGltaXQ6ZnVuY3Rpb24odCl7dmFyIGk9bih0KTt0aGlzLl96b29tQm91bmRMYXllcnNbaV0mJihkZWxldGUgdGhpcy5fem9vbUJvdW5kTGF5ZXJzW2ldLHRoaXMuX3VwZGF0ZVpvb21MZXZlbHMoKSl9LF91cGRhdGVab29tTGV2ZWxzOmZ1bmN0aW9uKCl7dmFyIHQ9MS8wLGk9LTEvMCxlPXRoaXMuX2dldFpvb21TcGFuKCk7Zm9yKHZhciBuIGluIHRoaXMuX3pvb21Cb3VuZExheWVycyl7dmFyIG89dGhpcy5fem9vbUJvdW5kTGF5ZXJzW25dLm9wdGlvbnM7dD12b2lkIDA9PT1vLm1pblpvb20/dDpNYXRoLm1pbih0LG8ubWluWm9vbSksaT12b2lkIDA9PT1vLm1heFpvb20/aTpNYXRoLm1heChpLG8ubWF4Wm9vbSl9dGhpcy5fbGF5ZXJzTWF4Wm9vbT1pPT09LTEvMD92b2lkIDA6aSx0aGlzLl9sYXllcnNNaW5ab29tPXQ9PT0xLzA/dm9pZCAwOnQsZSE9PXRoaXMuX2dldFpvb21TcGFuKCkmJnRoaXMuZmlyZSgiem9vbWxldmVsc2NoYW5nZSIpLHZvaWQgMD09PXRoaXMub3B0aW9ucy5tYXhab29tJiZ0aGlzLl9sYXllcnNNYXhab29tJiZ0aGlzLmdldFpvb20oKT50aGlzLl9sYXllcnNNYXhab29tJiZ0aGlzLnNldFpvb20odGhpcy5fbGF5ZXJzTWF4Wm9vbSksdm9pZCAwPT09dGhpcy5vcHRpb25zLm1pblpvb20mJnRoaXMuX2xheWVyc01pblpvb20mJnRoaXMuZ2V0Wm9vbSgpPHRoaXMuX2xheWVyc01pblpvb20mJnRoaXMuc2V0Wm9vbSh0aGlzLl9sYXllcnNNaW5ab29tKX19KTt2YXIgVmU9VWUuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQsaSl7bCh0aGlzLGkpLHRoaXMuX2xheWVycz17fTt2YXIgZSxuO2lmKHQpZm9yKGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5hZGRMYXllcih0W2VdKX0sYWRkTGF5ZXI6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5nZXRMYXllcklkKHQpO3JldHVybiB0aGlzLl9sYXllcnNbaV09dCx0aGlzLl9tYXAmJnRoaXMuX21hcC5hZGRMYXllcih0KSx0aGlzfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXt2YXIgaT10IGluIHRoaXMuX2xheWVycz90OnRoaXMuZ2V0TGF5ZXJJZCh0KTtyZXR1cm4gdGhpcy5fbWFwJiZ0aGlzLl9sYXllcnNbaV0mJnRoaXMuX21hcC5yZW1vdmVMYXllcih0aGlzLl9sYXllcnNbaV0pLGRlbGV0ZSB0aGlzLl9sYXllcnNbaV0sdGhpc30saGFzTGF5ZXI6ZnVuY3Rpb24odCl7cmV0dXJuISF0JiYodCBpbiB0aGlzLl9sYXllcnN8fHRoaXMuZ2V0TGF5ZXJJZCh0KWluIHRoaXMuX2xheWVycyl9LGNsZWFyTGF5ZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaExheWVyKHRoaXMucmVtb3ZlTGF5ZXIsdGhpcyl9LGludm9rZTpmdW5jdGlvbih0KXt2YXIgaSxlLG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2ZvcihpIGluIHRoaXMuX2xheWVycykoZT10aGlzLl9sYXllcnNbaV0pW3RdJiZlW3RdLmFwcGx5KGUsbik7cmV0dXJuIHRoaXN9LG9uQWRkOmZ1bmN0aW9uKHQpe3RoaXMuZWFjaExheWVyKHQuYWRkTGF5ZXIsdCl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3RoaXMuZWFjaExheWVyKHQucmVtb3ZlTGF5ZXIsdCl9LGVhY2hMYXllcjpmdW5jdGlvbih0LGkpe2Zvcih2YXIgZSBpbiB0aGlzLl9sYXllcnMpdC5jYWxsKGksdGhpcy5fbGF5ZXJzW2VdKTtyZXR1cm4gdGhpc30sZ2V0TGF5ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xheWVyc1t0XX0sZ2V0TGF5ZXJzOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaExheWVyKHQucHVzaCx0KSx0fSxzZXRaSW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW52b2tlKCJzZXRaSW5kZXgiLHQpfSxnZXRMYXllcklkOmZ1bmN0aW9uKHQpe3JldHVybiBuKHQpfX0pLHFlPVZlLmV4dGVuZCh7YWRkTGF5ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaGFzTGF5ZXIodCk/dGhpczoodC5hZGRFdmVudFBhcmVudCh0aGlzKSxWZS5wcm90b3R5cGUuYWRkTGF5ZXIuY2FsbCh0aGlzLHQpLHRoaXMuZmlyZSgibGF5ZXJhZGQiLHtsYXllcjp0fSkpfSxyZW1vdmVMYXllcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5oYXNMYXllcih0KT8odCBpbiB0aGlzLl9sYXllcnMmJih0PXRoaXMuX2xheWVyc1t0XSksdC5yZW1vdmVFdmVudFBhcmVudCh0aGlzKSxWZS5wcm90b3R5cGUucmVtb3ZlTGF5ZXIuY2FsbCh0aGlzLHQpLHRoaXMuZmlyZSgibGF5ZXJyZW1vdmUiLHtsYXllcjp0fSkpOnRoaXN9LHNldFN0eWxlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmludm9rZSgic2V0U3R5bGUiLHQpfSxicmluZ1RvRnJvbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnZva2UoImJyaW5nVG9Gcm9udCIpfSxicmluZ1RvQmFjazpmdW5jdGlvbigpe3JldHVybiB0aGlzLmludm9rZSgiYnJpbmdUb0JhY2siKX0sZ2V0Qm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IFQ7Zm9yKHZhciBpIGluIHRoaXMuX2xheWVycyl7dmFyIGU9dGhpcy5fbGF5ZXJzW2ldO3QuZXh0ZW5kKGUuZ2V0Qm91bmRzP2UuZ2V0Qm91bmRzKCk6ZS5nZXRMYXRMbmcoKSl9cmV0dXJuIHR9fSksR2U9di5leHRlbmQoe29wdGlvbnM6e3BvcHVwQW5jaG9yOlswLDBdLHRvb2x0aXBBbmNob3I6WzAsMF19LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7bCh0aGlzLHQpfSxjcmVhdGVJY29uOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jcmVhdGVJY29uKCJpY29uIix0KX0sY3JlYXRlU2hhZG93OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jcmVhdGVJY29uKCJzaGFkb3ciLHQpfSxfY3JlYXRlSWNvbjpmdW5jdGlvbih0LGkpe3ZhciBlPXRoaXMuX2dldEljb25VcmwodCk7aWYoIWUpe2lmKCJpY29uIj09PXQpdGhyb3cgbmV3IEVycm9yKCJpY29uVXJsIG5vdCBzZXQgaW4gSWNvbiBvcHRpb25zIChzZWUgdGhlIGRvY3MpLiIpO3JldHVybiBudWxsfXZhciBuPXRoaXMuX2NyZWF0ZUltZyhlLGkmJiJJTUciPT09aS50YWdOYW1lP2k6bnVsbCk7cmV0dXJuIHRoaXMuX3NldEljb25TdHlsZXMobix0KSxufSxfc2V0SWNvblN0eWxlczpmdW5jdGlvbih0LGkpe3ZhciBlPXRoaXMub3B0aW9ucyxuPWVbaSsiU2l6ZSJdOyJudW1iZXIiPT10eXBlb2YgbiYmKG49W24sbl0pO3ZhciBvPXcobikscz13KCJzaGFkb3ciPT09aSYmZS5zaGFkb3dBbmNob3J8fGUuaWNvbkFuY2hvcnx8byYmby5kaXZpZGVCeSgyLCEwKSk7dC5jbGFzc05hbWU9ImxlYWZsZXQtbWFya2VyLSIraSsiICIrKGUuY2xhc3NOYW1lfHwiIikscyYmKHQuc3R5bGUubWFyZ2luTGVmdD0tcy54KyJweCIsdC5zdHlsZS5tYXJnaW5Ub3A9LXMueSsicHgiKSxvJiYodC5zdHlsZS53aWR0aD1vLngrInB4Iix0LnN0eWxlLmhlaWdodD1vLnkrInB4Iil9LF9jcmVhdGVJbWc6ZnVuY3Rpb24odCxpKXtyZXR1cm4gaT1pfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxpLnNyYz10LGl9LF9nZXRJY29uVXJsOmZ1bmN0aW9uKHQpe3JldHVybiBLaSYmdGhpcy5vcHRpb25zW3QrIlJldGluYVVybCJdfHx0aGlzLm9wdGlvbnNbdCsiVXJsIl19fSksS2U9R2UuZXh0ZW5kKHtvcHRpb25zOntpY29uVXJsOiJtYXJrZXItaWNvbi5wbmciLGljb25SZXRpbmFVcmw6Im1hcmtlci1pY29uLTJ4LnBuZyIsc2hhZG93VXJsOiJtYXJrZXItc2hhZG93LnBuZyIsaWNvblNpemU6WzI1LDQxXSxpY29uQW5jaG9yOlsxMiw0MV0scG9wdXBBbmNob3I6WzEsLTM0XSx0b29sdGlwQW5jaG9yOlsxNiwtMjhdLHNoYWRvd1NpemU6WzQxLDQxXX0sX2dldEljb25Vcmw6ZnVuY3Rpb24odCl7cmV0dXJuIEtlLmltYWdlUGF0aHx8KEtlLmltYWdlUGF0aD10aGlzLl9kZXRlY3RJY29uUGF0aCgpKSwodGhpcy5vcHRpb25zLmltYWdlUGF0aHx8S2UuaW1hZ2VQYXRoKStHZS5wcm90b3R5cGUuX2dldEljb25VcmwuY2FsbCh0aGlzLHQpfSxfZGV0ZWN0SWNvblBhdGg6ZnVuY3Rpb24oKXt2YXIgdD1odCgiZGl2IiwibGVhZmxldC1kZWZhdWx0LWljb24tcGF0aCIsZG9jdW1lbnQuYm9keSksaT1hdCh0LCJiYWNrZ3JvdW5kLWltYWdlIil8fGF0KHQsImJhY2tncm91bmRJbWFnZSIpO3JldHVybiBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHQpLGk9bnVsbD09PWl8fDAhPT1pLmluZGV4T2YoInVybCIpPyIiOmkucmVwbGFjZSgvXnVybFwoWyInXT8vLCIiKS5yZXBsYWNlKC9tYXJrZXItaWNvblwucG5nWyInXT9cKSQvLCIiKX19KSxZZT1aZS5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5fbWFya2VyPXR9LGFkZEhvb2tzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFya2VyLl9pY29uO3RoaXMuX2RyYWdnYWJsZXx8KHRoaXMuX2RyYWdnYWJsZT1uZXcgQmUodCx0LCEwKSksdGhpcy5fZHJhZ2dhYmxlLm9uKHtkcmFnc3RhcnQ6dGhpcy5fb25EcmFnU3RhcnQscHJlZHJhZzp0aGlzLl9vblByZURyYWcsZHJhZzp0aGlzLl9vbkRyYWcsZHJhZ2VuZDp0aGlzLl9vbkRyYWdFbmR9LHRoaXMpLmVuYWJsZSgpLHB0KHQsImxlYWZsZXQtbWFya2VyLWRyYWdnYWJsZSIpfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe3RoaXMuX2RyYWdnYWJsZS5vZmYoe2RyYWdzdGFydDp0aGlzLl9vbkRyYWdTdGFydCxwcmVkcmFnOnRoaXMuX29uUHJlRHJhZyxkcmFnOnRoaXMuX29uRHJhZyxkcmFnZW5kOnRoaXMuX29uRHJhZ0VuZH0sdGhpcykuZGlzYWJsZSgpLHRoaXMuX21hcmtlci5faWNvbiYmbXQodGhpcy5fbWFya2VyLl9pY29uLCJsZWFmbGV0LW1hcmtlci1kcmFnZ2FibGUiKX0sbW92ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHJhZ2dhYmxlJiZ0aGlzLl9kcmFnZ2FibGUuX21vdmVkfSxfYWRqdXN0UGFuOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX21hcmtlcixlPWkuX21hcCxuPXRoaXMuX21hcmtlci5vcHRpb25zLmF1dG9QYW5TcGVlZCxvPXRoaXMuX21hcmtlci5vcHRpb25zLmF1dG9QYW5QYWRkaW5nLHM9TC5Eb21VdGlsLmdldFBvc2l0aW9uKGkuX2ljb24pLHI9ZS5nZXRQaXhlbEJvdW5kcygpLGE9ZS5nZXRQaXhlbE9yaWdpbigpLGg9YihyLm1pbi5fc3VidHJhY3QoYSkuYWRkKG8pLHIubWF4Ll9zdWJ0cmFjdChhKS5zdWJ0cmFjdChvKSk7aWYoIWguY29udGFpbnMocykpe3ZhciB1PXcoKE1hdGgubWF4KGgubWF4Lngscy54KS1oLm1heC54KS8oci5tYXgueC1oLm1heC54KS0oTWF0aC5taW4oaC5taW4ueCxzLngpLWgubWluLngpLyhyLm1pbi54LWgubWluLngpLChNYXRoLm1heChoLm1heC55LHMueSktaC5tYXgueSkvKHIubWF4LnktaC5tYXgueSktKE1hdGgubWluKGgubWluLnkscy55KS1oLm1pbi55KS8oci5taW4ueS1oLm1pbi55KSkubXVsdGlwbHlCeShuKTtlLnBhbkJ5KHUse2FuaW1hdGU6ITF9KSx0aGlzLl9kcmFnZ2FibGUuX25ld1Bvcy5fYWRkKHUpLHRoaXMuX2RyYWdnYWJsZS5fc3RhcnRQb3MuX2FkZCh1KSxMLkRvbVV0aWwuc2V0UG9zaXRpb24oaS5faWNvbix0aGlzLl9kcmFnZ2FibGUuX25ld1BvcyksdGhpcy5fb25EcmFnKHQpLHRoaXMuX3BhblJlcXVlc3Q9Zih0aGlzLl9hZGp1c3RQYW4uYmluZCh0aGlzLHQpKX19LF9vbkRyYWdTdGFydDpmdW5jdGlvbigpe3RoaXMuX29sZExhdExuZz10aGlzLl9tYXJrZXIuZ2V0TGF0TG5nKCksdGhpcy5fbWFya2VyLmNsb3NlUG9wdXAoKS5maXJlKCJtb3Zlc3RhcnQiKS5maXJlKCJkcmFnc3RhcnQiKX0sX29uUHJlRHJhZzpmdW5jdGlvbih0KXt0aGlzLl9tYXJrZXIub3B0aW9ucy5hdXRvUGFuJiYoZyh0aGlzLl9wYW5SZXF1ZXN0KSx0aGlzLl9wYW5SZXF1ZXN0PWYodGhpcy5fYWRqdXN0UGFuLmJpbmQodGhpcyx0KSkpfSxfb25EcmFnOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX21hcmtlcixlPWkuX3NoYWRvdyxuPVB0KGkuX2ljb24pLG89aS5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyhuKTtlJiZMdChlLG4pLGkuX2xhdGxuZz1vLHQubGF0bG5nPW8sdC5vbGRMYXRMbmc9dGhpcy5fb2xkTGF0TG5nLGkuZmlyZSgibW92ZSIsdCkuZmlyZSgiZHJhZyIsdCl9LF9vbkRyYWdFbmQ6ZnVuY3Rpb24odCl7Zyh0aGlzLl9wYW5SZXF1ZXN0KSxkZWxldGUgdGhpcy5fb2xkTGF0TG5nLHRoaXMuX21hcmtlci5maXJlKCJtb3ZlZW5kIikuZmlyZSgiZHJhZ2VuZCIsdCl9fSksWGU9VWUuZXh0ZW5kKHtvcHRpb25zOntpY29uOm5ldyBLZSxpbnRlcmFjdGl2ZTohMCxkcmFnZ2FibGU6ITEsYXV0b1BhbjohMSxhdXRvUGFuUGFkZGluZzpbNTAsNTBdLGF1dG9QYW5TcGVlZDoxMCxrZXlib2FyZDohMCx0aXRsZToiIixhbHQ6IiIsekluZGV4T2Zmc2V0OjAsb3BhY2l0eToxLHJpc2VPbkhvdmVyOiExLHJpc2VPZmZzZXQ6MjUwLHBhbmU6Im1hcmtlclBhbmUiLGJ1YmJsaW5nTW91c2VFdmVudHM6ITF9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxpKXtsKHRoaXMsaSksdGhpcy5fbGF0bG5nPUModCl9LG9uQWRkOmZ1bmN0aW9uKHQpe3RoaXMuX3pvb21BbmltYXRlZD10aGlzLl96b29tQW5pbWF0ZWQmJnQub3B0aW9ucy5tYXJrZXJab29tQW5pbWF0aW9uLHRoaXMuX3pvb21BbmltYXRlZCYmdC5vbigiem9vbWFuaW0iLHRoaXMuX2FuaW1hdGVab29tLHRoaXMpLHRoaXMuX2luaXRJY29uKCksdGhpcy51cGRhdGUoKX0sb25SZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy5kcmFnZ2luZyYmdGhpcy5kcmFnZ2luZy5lbmFibGVkKCkmJih0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlPSEwLHRoaXMuZHJhZ2dpbmcucmVtb3ZlSG9va3MoKSksZGVsZXRlIHRoaXMuZHJhZ2dpbmcsdGhpcy5fem9vbUFuaW1hdGVkJiZ0Lm9mZigiem9vbWFuaW0iLHRoaXMuX2FuaW1hdGVab29tLHRoaXMpLHRoaXMuX3JlbW92ZUljb24oKSx0aGlzLl9yZW1vdmVTaGFkb3coKX0sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7cmV0dXJue3pvb206dGhpcy51cGRhdGUsdmlld3Jlc2V0OnRoaXMudXBkYXRlfX0sZ2V0TGF0TG5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhdGxuZ30sc2V0TGF0TG5nOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX2xhdGxuZztyZXR1cm4gdGhpcy5fbGF0bG5nPUModCksdGhpcy51cGRhdGUoKSx0aGlzLmZpcmUoIm1vdmUiLHtvbGRMYXRMbmc6aSxsYXRsbmc6dGhpcy5fbGF0bG5nfSl9LHNldFpJbmRleE9mZnNldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLnpJbmRleE9mZnNldD10LHRoaXMudXBkYXRlKCl9LHNldEljb246ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5pY29uPXQsdGhpcy5fbWFwJiYodGhpcy5faW5pdEljb24oKSx0aGlzLnVwZGF0ZSgpKSx0aGlzLl9wb3B1cCYmdGhpcy5iaW5kUG9wdXAodGhpcy5fcG9wdXAsdGhpcy5fcG9wdXAub3B0aW9ucyksdGhpc30sZ2V0RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pY29ufSx1cGRhdGU6ZnVuY3Rpb24oKXtpZih0aGlzLl9pY29uJiZ0aGlzLl9tYXApe3ZhciB0PXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKS5yb3VuZCgpO3RoaXMuX3NldFBvcyh0KX1yZXR1cm4gdGhpc30sX2luaXRJY29uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLGk9ImxlYWZsZXQtem9vbS0iKyh0aGlzLl96b29tQW5pbWF0ZWQ/ImFuaW1hdGVkIjoiaGlkZSIpLGU9dC5pY29uLmNyZWF0ZUljb24odGhpcy5faWNvbiksbj0hMTtlIT09dGhpcy5faWNvbiYmKHRoaXMuX2ljb24mJnRoaXMuX3JlbW92ZUljb24oKSxuPSEwLHQudGl0bGUmJihlLnRpdGxlPXQudGl0bGUpLCJJTUciPT09ZS50YWdOYW1lJiYoZS5hbHQ9dC5hbHR8fCIiKSkscHQoZSxpKSx0LmtleWJvYXJkJiYoZS50YWJJbmRleD0iMCIpLHRoaXMuX2ljb249ZSx0LnJpc2VPbkhvdmVyJiZ0aGlzLm9uKHttb3VzZW92ZXI6dGhpcy5fYnJpbmdUb0Zyb250LG1vdXNlb3V0OnRoaXMuX3Jlc2V0WkluZGV4fSk7dmFyIG89dC5pY29uLmNyZWF0ZVNoYWRvdyh0aGlzLl9zaGFkb3cpLHM9ITE7byE9PXRoaXMuX3NoYWRvdyYmKHRoaXMuX3JlbW92ZVNoYWRvdygpLHM9ITApLG8mJihwdChvLGkpLG8uYWx0PSIiKSx0aGlzLl9zaGFkb3c9byx0Lm9wYWNpdHk8MSYmdGhpcy5fdXBkYXRlT3BhY2l0eSgpLG4mJnRoaXMuZ2V0UGFuZSgpLmFwcGVuZENoaWxkKHRoaXMuX2ljb24pLHRoaXMuX2luaXRJbnRlcmFjdGlvbigpLG8mJnMmJnRoaXMuZ2V0UGFuZSgic2hhZG93UGFuZSIpLmFwcGVuZENoaWxkKHRoaXMuX3NoYWRvdyl9LF9yZW1vdmVJY29uOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnJpc2VPbkhvdmVyJiZ0aGlzLm9mZih7bW91c2VvdmVyOnRoaXMuX2JyaW5nVG9Gcm9udCxtb3VzZW91dDp0aGlzLl9yZXNldFpJbmRleH0pLHV0KHRoaXMuX2ljb24pLHRoaXMucmVtb3ZlSW50ZXJhY3RpdmVUYXJnZXQodGhpcy5faWNvbiksdGhpcy5faWNvbj1udWxsfSxfcmVtb3ZlU2hhZG93OmZ1bmN0aW9uKCl7dGhpcy5fc2hhZG93JiZ1dCh0aGlzLl9zaGFkb3cpLHRoaXMuX3NoYWRvdz1udWxsfSxfc2V0UG9zOmZ1bmN0aW9uKHQpe0x0KHRoaXMuX2ljb24sdCksdGhpcy5fc2hhZG93JiZMdCh0aGlzLl9zaGFkb3csdCksdGhpcy5fekluZGV4PXQueSt0aGlzLm9wdGlvbnMuekluZGV4T2Zmc2V0LHRoaXMuX3Jlc2V0WkluZGV4KCl9LF91cGRhdGVaSW5kZXg6ZnVuY3Rpb24odCl7dGhpcy5faWNvbi5zdHlsZS56SW5kZXg9dGhpcy5fekluZGV4K3R9LF9hbmltYXRlWm9vbTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9tYXAuX2xhdExuZ1RvTmV3TGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcsdC56b29tLHQuY2VudGVyKS5yb3VuZCgpO3RoaXMuX3NldFBvcyhpKX0sX2luaXRJbnRlcmFjdGlvbjpmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5pbnRlcmFjdGl2ZSYmKHB0KHRoaXMuX2ljb24sImxlYWZsZXQtaW50ZXJhY3RpdmUiKSx0aGlzLmFkZEludGVyYWN0aXZlVGFyZ2V0KHRoaXMuX2ljb24pLFllKSl7dmFyIHQ9dGhpcy5vcHRpb25zLmRyYWdnYWJsZTt0aGlzLmRyYWdnaW5nJiYodD10aGlzLmRyYWdnaW5nLmVuYWJsZWQoKSx0aGlzLmRyYWdnaW5nLmRpc2FibGUoKSksdGhpcy5kcmFnZ2luZz1uZXcgWWUodGhpcyksdCYmdGhpcy5kcmFnZ2luZy5lbmFibGUoKX19LHNldE9wYWNpdHk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5vcGFjaXR5PXQsdGhpcy5fbWFwJiZ0aGlzLl91cGRhdGVPcGFjaXR5KCksdGhpc30sX3VwZGF0ZU9wYWNpdHk6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMub3BhY2l0eTt2dCh0aGlzLl9pY29uLHQpLHRoaXMuX3NoYWRvdyYmdnQodGhpcy5fc2hhZG93LHQpfSxfYnJpbmdUb0Zyb250OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlWkluZGV4KHRoaXMub3B0aW9ucy5yaXNlT2Zmc2V0KX0sX3Jlc2V0WkluZGV4OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlWkluZGV4KDApfSxfZ2V0UG9wdXBBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLmljb24ub3B0aW9ucy5wb3B1cEFuY2hvcn0sX2dldFRvb2x0aXBBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLmljb24ub3B0aW9ucy50b29sdGlwQW5jaG9yfX0pLEplPVVlLmV4dGVuZCh7b3B0aW9uczp7c3Ryb2tlOiEwLGNvbG9yOiIjMzM4OGZmIix3ZWlnaHQ6MyxvcGFjaXR5OjEsbGluZUNhcDoicm91bmQiLGxpbmVKb2luOiJyb3VuZCIsZGFzaEFycmF5Om51bGwsZGFzaE9mZnNldDpudWxsLGZpbGw6ITEsZmlsbENvbG9yOm51bGwsZmlsbE9wYWNpdHk6LjIsZmlsbFJ1bGU6ImV2ZW5vZGQiLGludGVyYWN0aXZlOiEwLGJ1YmJsaW5nTW91c2VFdmVudHM6ITB9LGJlZm9yZUFkZDpmdW5jdGlvbih0KXt0aGlzLl9yZW5kZXJlcj10LmdldFJlbmRlcmVyKHRoaXMpfSxvbkFkZDpmdW5jdGlvbigpe3RoaXMuX3JlbmRlcmVyLl9pbml0UGF0aCh0aGlzKSx0aGlzLl9yZXNldCgpLHRoaXMuX3JlbmRlcmVyLl9hZGRQYXRoKHRoaXMpfSxvblJlbW92ZTpmdW5jdGlvbigpe3RoaXMuX3JlbmRlcmVyLl9yZW1vdmVQYXRoKHRoaXMpfSxyZWRyYXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZ0aGlzLl9yZW5kZXJlci5fdXBkYXRlUGF0aCh0aGlzKSx0aGlzfSxzZXRTdHlsZTpmdW5jdGlvbih0KXtyZXR1cm4gbCh0aGlzLHQpLHRoaXMuX3JlbmRlcmVyJiZ0aGlzLl9yZW5kZXJlci5fdXBkYXRlU3R5bGUodGhpcyksdGhpc30sYnJpbmdUb0Zyb250OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlbmRlcmVyJiZ0aGlzLl9yZW5kZXJlci5fYnJpbmdUb0Zyb250KHRoaXMpLHRoaXN9LGJyaW5nVG9CYWNrOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlbmRlcmVyJiZ0aGlzLl9yZW5kZXJlci5fYnJpbmdUb0JhY2sodGhpcyksdGhpc30sZ2V0RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYXRofSxfcmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9wcm9qZWN0KCksdGhpcy5fdXBkYXRlKCl9LF9jbGlja1RvbGVyYW5jZTpmdW5jdGlvbigpe3JldHVybih0aGlzLm9wdGlvbnMuc3Ryb2tlP3RoaXMub3B0aW9ucy53ZWlnaHQvMjowKSt0aGlzLl9yZW5kZXJlci5vcHRpb25zLnRvbGVyYW5jZX19KSwkZT1KZS5leHRlbmQoe29wdGlvbnM6e2ZpbGw6ITAscmFkaXVzOjEwfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsaSl7bCh0aGlzLGkpLHRoaXMuX2xhdGxuZz1DKHQpLHRoaXMuX3JhZGl1cz10aGlzLm9wdGlvbnMucmFkaXVzfSxzZXRMYXRMbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xhdGxuZz1DKHQpLHRoaXMucmVkcmF3KCksdGhpcy5maXJlKCJtb3ZlIix7bGF0bG5nOnRoaXMuX2xhdGxuZ30pfSxnZXRMYXRMbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGF0bG5nfSxzZXRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5yYWRpdXM9dGhpcy5fcmFkaXVzPXQsdGhpcy5yZWRyYXcoKX0sZ2V0UmFkaXVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGl1c30sc2V0U3R5bGU6ZnVuY3Rpb24odCl7dmFyIGk9dCYmdC5yYWRpdXN8fHRoaXMuX3JhZGl1cztyZXR1cm4gSmUucHJvdG90eXBlLnNldFN0eWxlLmNhbGwodGhpcyx0KSx0aGlzLnNldFJhZGl1cyhpKSx0aGlzfSxfcHJvamVjdDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKSx0aGlzLl91cGRhdGVCb3VuZHMoKX0sX3VwZGF0ZUJvdW5kczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JhZGl1cyxpPXRoaXMuX3JhZGl1c1l8fHQsZT10aGlzLl9jbGlja1RvbGVyYW5jZSgpLG49W3QrZSxpK2VdO3RoaXMuX3B4Qm91bmRzPW5ldyBQKHRoaXMuX3BvaW50LnN1YnRyYWN0KG4pLHRoaXMuX3BvaW50LmFkZChuKSl9LF91cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJnRoaXMuX3VwZGF0ZVBhdGgoKX0sX3VwZGF0ZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9yZW5kZXJlci5fdXBkYXRlQ2lyY2xlKHRoaXMpfSxfZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaXVzJiYhdGhpcy5fcmVuZGVyZXIuX2JvdW5kcy5pbnRlcnNlY3RzKHRoaXMuX3B4Qm91bmRzKX0sX2NvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuZGlzdGFuY2VUbyh0aGlzLl9wb2ludCk8PXRoaXMuX3JhZGl1cyt0aGlzLl9jbGlja1RvbGVyYW5jZSgpfX0pLFFlPSRlLmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUsbil7aWYoIm51bWJlciI9PXR5cGVvZiBlJiYoZT1pKHt9LG4se3JhZGl1czplfSkpLGwodGhpcyxlKSx0aGlzLl9sYXRsbmc9Qyh0KSxpc05hTih0aGlzLm9wdGlvbnMucmFkaXVzKSl0aHJvdyBuZXcgRXJyb3IoIkNpcmNsZSByYWRpdXMgY2Fubm90IGJlIE5hTiIpO3RoaXMuX21SYWRpdXM9dGhpcy5vcHRpb25zLnJhZGl1c30sc2V0UmFkaXVzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9tUmFkaXVzPXQsdGhpcy5yZWRyYXcoKX0sZ2V0UmFkaXVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21SYWRpdXN9LGdldEJvdW5kczpmdW5jdGlvbigpe3ZhciB0PVt0aGlzLl9yYWRpdXMsdGhpcy5fcmFkaXVzWXx8dGhpcy5fcmFkaXVzXTtyZXR1cm4gbmV3IFQodGhpcy5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyh0aGlzLl9wb2ludC5zdWJ0cmFjdCh0KSksdGhpcy5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyh0aGlzLl9wb2ludC5hZGQodCkpKX0sc2V0U3R5bGU6SmUucHJvdG90eXBlLnNldFN0eWxlLF9wcm9qZWN0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbGF0bG5nLmxuZyxpPXRoaXMuX2xhdGxuZy5sYXQsZT10aGlzLl9tYXAsbj1lLm9wdGlvbnMuY3JzO2lmKG4uZGlzdGFuY2U9PT1faS5kaXN0YW5jZSl7dmFyIG89TWF0aC5QSS8xODAscz10aGlzLl9tUmFkaXVzL19pLlIvbyxyPWUucHJvamVjdChbaStzLHRdKSxhPWUucHJvamVjdChbaS1zLHRdKSxoPXIuYWRkKGEpLmRpdmlkZUJ5KDIpLHU9ZS51bnByb2plY3QoaCkubGF0LGw9TWF0aC5hY29zKChNYXRoLmNvcyhzKm8pLU1hdGguc2luKGkqbykqTWF0aC5zaW4odSpvKSkvKE1hdGguY29zKGkqbykqTWF0aC5jb3ModSpvKSkpL287KGlzTmFOKGwpfHwwPT09bCkmJihsPXMvTWF0aC5jb3MoTWF0aC5QSS8xODAqaSkpLHRoaXMuX3BvaW50PWguc3VidHJhY3QoZS5nZXRQaXhlbE9yaWdpbigpKSx0aGlzLl9yYWRpdXM9aXNOYU4obCk/MDpoLngtZS5wcm9qZWN0KFt1LHQtbF0pLngsdGhpcy5fcmFkaXVzWT1oLnktci55fWVsc2V7dmFyIGM9bi51bnByb2plY3Qobi5wcm9qZWN0KHRoaXMuX2xhdGxuZykuc3VidHJhY3QoW3RoaXMuX21SYWRpdXMsMF0pKTt0aGlzLl9wb2ludD1lLmxhdExuZ1RvTGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcpLHRoaXMuX3JhZGl1cz10aGlzLl9wb2ludC54LWUubGF0TG5nVG9MYXllclBvaW50KGMpLnh9dGhpcy5fdXBkYXRlQm91bmRzKCl9fSksdG49SmUuZXh0ZW5kKHtvcHRpb25zOntzbW9vdGhGYWN0b3I6MSxub0NsaXA6ITF9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxpKXtsKHRoaXMsaSksdGhpcy5fc2V0TGF0TG5ncyh0KX0sZ2V0TGF0TG5nczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXRsbmdzfSxzZXRMYXRMbmdzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zZXRMYXRMbmdzKHQpLHRoaXMucmVkcmF3KCl9LGlzRW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5fbGF0bG5ncy5sZW5ndGh9LGNsb3Nlc3RMYXllclBvaW50OmZ1bmN0aW9uKHQpe2Zvcih2YXIgaSxlLG49MS8wLG89bnVsbCxzPVJ0LHI9MCxhPXRoaXMuX3BhcnRzLmxlbmd0aDtyPGE7cisrKWZvcih2YXIgaD10aGlzLl9wYXJ0c1tyXSx1PTEsbD1oLmxlbmd0aDt1PGw7dSsrKXt2YXIgYz1zKHQsaT1oW3UtMV0sZT1oW3VdLCEwKTtjPG4mJihuPWMsbz1zKHQsaSxlKSl9cmV0dXJuIG8mJihvLmRpc3RhbmNlPU1hdGguc3FydChuKSksb30sZ2V0Q2VudGVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX21hcCl0aHJvdyBuZXcgRXJyb3IoIk11c3QgYWRkIGxheWVyIHRvIG1hcCBiZWZvcmUgdXNpbmcgZ2V0Q2VudGVyKCkiKTt2YXIgdCxpLGUsbixvLHMscixhPXRoaXMuX3JpbmdzWzBdLGg9YS5sZW5ndGg7aWYoIWgpcmV0dXJuIG51bGw7Zm9yKHQ9MCxpPTA7dDxoLTE7dCsrKWkrPWFbdF0uZGlzdGFuY2VUbyhhW3QrMV0pLzI7aWYoMD09PWkpcmV0dXJuIHRoaXMuX21hcC5sYXllclBvaW50VG9MYXRMbmcoYVswXSk7Zm9yKHQ9MCxuPTA7dDxoLTE7dCsrKWlmKG89YVt0XSxzPWFbdCsxXSxlPW8uZGlzdGFuY2VUbyhzKSwobis9ZSk+aSlyZXR1cm4gcj0obi1pKS9lLHRoaXMuX21hcC5sYXllclBvaW50VG9MYXRMbmcoW3MueC1yKihzLngtby54KSxzLnktcioocy55LW8ueSldKX0sZ2V0Qm91bmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JvdW5kc30sYWRkTGF0TG5nOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIGk9aXx8dGhpcy5fZGVmYXVsdFNoYXBlKCksdD1DKHQpLGkucHVzaCh0KSx0aGlzLl9ib3VuZHMuZXh0ZW5kKHQpLHRoaXMucmVkcmF3KCl9LF9zZXRMYXRMbmdzOmZ1bmN0aW9uKHQpe3RoaXMuX2JvdW5kcz1uZXcgVCx0aGlzLl9sYXRsbmdzPXRoaXMuX2NvbnZlcnRMYXRMbmdzKHQpfSxfZGVmYXVsdFNoYXBlOmZ1bmN0aW9uKCl7cmV0dXJuIER0KHRoaXMuX2xhdGxuZ3MpP3RoaXMuX2xhdGxuZ3M6dGhpcy5fbGF0bG5nc1swXX0sX2NvbnZlcnRMYXRMbmdzOmZ1bmN0aW9uKHQpe2Zvcih2YXIgaT1bXSxlPUR0KHQpLG49MCxvPXQubGVuZ3RoO248bztuKyspZT8oaVtuXT1DKHRbbl0pLHRoaXMuX2JvdW5kcy5leHRlbmQoaVtuXSkpOmlbbl09dGhpcy5fY29udmVydExhdExuZ3ModFtuXSk7cmV0dXJuIGl9LF9wcm9qZWN0OmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IFA7dGhpcy5fcmluZ3M9W10sdGhpcy5fcHJvamVjdExhdGxuZ3ModGhpcy5fbGF0bG5ncyx0aGlzLl9yaW5ncyx0KTt2YXIgaT10aGlzLl9jbGlja1RvbGVyYW5jZSgpLGU9bmV3IHgoaSxpKTt0aGlzLl9ib3VuZHMuaXNWYWxpZCgpJiZ0LmlzVmFsaWQoKSYmKHQubWluLl9zdWJ0cmFjdChlKSx0Lm1heC5fYWRkKGUpLHRoaXMuX3B4Qm91bmRzPXQpfSxfcHJvamVjdExhdGxuZ3M6ZnVuY3Rpb24odCxpLGUpe3ZhciBuLG8scz10WzBdaW5zdGFuY2VvZiBNLHI9dC5sZW5ndGg7aWYocyl7Zm9yKG89W10sbj0wO248cjtuKyspb1tuXT10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRbbl0pLGUuZXh0ZW5kKG9bbl0pO2kucHVzaChvKX1lbHNlIGZvcihuPTA7bjxyO24rKyl0aGlzLl9wcm9qZWN0TGF0bG5ncyh0W25dLGksZSl9LF9jbGlwUG9pbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVuZGVyZXIuX2JvdW5kcztpZih0aGlzLl9wYXJ0cz1bXSx0aGlzLl9weEJvdW5kcyYmdGhpcy5fcHhCb3VuZHMuaW50ZXJzZWN0cyh0KSlpZih0aGlzLm9wdGlvbnMubm9DbGlwKXRoaXMuX3BhcnRzPXRoaXMuX3JpbmdzO2Vsc2V7dmFyIGksZSxuLG8scyxyLGEsaD10aGlzLl9wYXJ0cztmb3IoaT0wLG49MCxvPXRoaXMuX3JpbmdzLmxlbmd0aDtpPG87aSsrKWZvcihlPTAscz0oYT10aGlzLl9yaW5nc1tpXSkubGVuZ3RoO2U8cy0xO2UrKykocj1BdChhW2VdLGFbZSsxXSx0LGUsITApKSYmKGhbbl09aFtuXXx8W10saFtuXS5wdXNoKHJbMF0pLHJbMV09PT1hW2UrMV0mJmUhPT1zLTJ8fChoW25dLnB1c2goclsxXSksbisrKSl9fSxfc2ltcGxpZnlQb2ludHM6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fcGFydHMsaT10aGlzLm9wdGlvbnMuc21vb3RoRmFjdG9yLGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspdFtlXT1DdCh0W2VdLGkpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiYodGhpcy5fY2xpcFBvaW50cygpLHRoaXMuX3NpbXBsaWZ5UG9pbnRzKCksdGhpcy5fdXBkYXRlUGF0aCgpKX0sX3VwZGF0ZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9yZW5kZXJlci5fdXBkYXRlUG9seSh0aGlzKX0sX2NvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24odCxpKXt2YXIgZSxuLG8scyxyLGEsaD10aGlzLl9jbGlja1RvbGVyYW5jZSgpO2lmKCF0aGlzLl9weEJvdW5kc3x8IXRoaXMuX3B4Qm91bmRzLmNvbnRhaW5zKHQpKXJldHVybiExO2ZvcihlPTAscz10aGlzLl9wYXJ0cy5sZW5ndGg7ZTxzO2UrKylmb3Iobj0wLG89KHI9KGE9dGhpcy5fcGFydHNbZV0pLmxlbmd0aCktMTtuPHI7bz1uKyspaWYoKGl8fDAhPT1uKSYmWnQodCxhW29dLGFbbl0pPD1oKXJldHVybiEwO3JldHVybiExfX0pO3RuLl9mbGF0PU50O3ZhciBlbj10bi5leHRlbmQoe29wdGlvbnM6e2ZpbGw6ITB9LGlzRW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5fbGF0bG5ncy5sZW5ndGh8fCF0aGlzLl9sYXRsbmdzWzBdLmxlbmd0aH0sZ2V0Q2VudGVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX21hcCl0aHJvdyBuZXcgRXJyb3IoIk11c3QgYWRkIGxheWVyIHRvIG1hcCBiZWZvcmUgdXNpbmcgZ2V0Q2VudGVyKCkiKTt2YXIgdCxpLGUsbixvLHMscixhLGgsdT10aGlzLl9yaW5nc1swXSxsPXUubGVuZ3RoO2lmKCFsKXJldHVybiBudWxsO2ZvcihzPXI9YT0wLHQ9MCxpPWwtMTt0PGw7aT10KyspZT11W3RdLG49dVtpXSxvPWUueSpuLngtbi55KmUueCxyKz0oZS54K24ueCkqbyxhKz0oZS55K24ueSkqbyxzKz0zKm87cmV0dXJuIGg9MD09PXM/dVswXTpbci9zLGEvc10sdGhpcy5fbWFwLmxheWVyUG9pbnRUb0xhdExuZyhoKX0sX2NvbnZlcnRMYXRMbmdzOmZ1bmN0aW9uKHQpe3ZhciBpPXRuLnByb3RvdHlwZS5fY29udmVydExhdExuZ3MuY2FsbCh0aGlzLHQpLGU9aS5sZW5ndGg7cmV0dXJuIGU+PTImJmlbMF1pbnN0YW5jZW9mIE0mJmlbMF0uZXF1YWxzKGlbZS0xXSkmJmkucG9wKCksaX0sX3NldExhdExuZ3M6ZnVuY3Rpb24odCl7dG4ucHJvdG90eXBlLl9zZXRMYXRMbmdzLmNhbGwodGhpcyx0KSxEdCh0aGlzLl9sYXRsbmdzKSYmKHRoaXMuX2xhdGxuZ3M9W3RoaXMuX2xhdGxuZ3NdKX0sX2RlZmF1bHRTaGFwZTpmdW5jdGlvbigpe3JldHVybiBEdCh0aGlzLl9sYXRsbmdzWzBdKT90aGlzLl9sYXRsbmdzWzBdOnRoaXMuX2xhdGxuZ3NbMF1bMF19LF9jbGlwUG9pbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVuZGVyZXIuX2JvdW5kcyxpPXRoaXMub3B0aW9ucy53ZWlnaHQsZT1uZXcgeChpLGkpO2lmKHQ9bmV3IFAodC5taW4uc3VidHJhY3QoZSksdC5tYXguYWRkKGUpKSx0aGlzLl9wYXJ0cz1bXSx0aGlzLl9weEJvdW5kcyYmdGhpcy5fcHhCb3VuZHMuaW50ZXJzZWN0cyh0KSlpZih0aGlzLm9wdGlvbnMubm9DbGlwKXRoaXMuX3BhcnRzPXRoaXMuX3JpbmdzO2Vsc2UgZm9yKHZhciBuLG89MCxzPXRoaXMuX3JpbmdzLmxlbmd0aDtvPHM7bysrKShuPWp0KHRoaXMuX3JpbmdzW29dLHQsITApKS5sZW5ndGgmJnRoaXMuX3BhcnRzLnB1c2gobil9LF91cGRhdGVQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyZXIuX3VwZGF0ZVBvbHkodGhpcywhMCl9LF9jb250YWluc1BvaW50OmZ1bmN0aW9uKHQpe3ZhciBpLGUsbixvLHMscixhLGgsdT0hMTtpZighdGhpcy5fcHhCb3VuZHMuY29udGFpbnModCkpcmV0dXJuITE7Zm9yKG89MCxhPXRoaXMuX3BhcnRzLmxlbmd0aDtvPGE7bysrKWZvcihzPTAscj0oaD0oaT10aGlzLl9wYXJ0c1tvXSkubGVuZ3RoKS0xO3M8aDtyPXMrKyllPWlbc10sbj1pW3JdLGUueT50LnkhPW4ueT50LnkmJnQueDwobi54LWUueCkqKHQueS1lLnkpLyhuLnktZS55KStlLngmJih1PSF1KTtyZXR1cm4gdXx8dG4ucHJvdG90eXBlLl9jb250YWluc1BvaW50LmNhbGwodGhpcyx0LCEwKX19KSxubj1xZS5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCxpKXtsKHRoaXMsaSksdGhpcy5fbGF5ZXJzPXt9LHQmJnRoaXMuYWRkRGF0YSh0KX0sYWRkRGF0YTpmdW5jdGlvbih0KXt2YXIgaSxlLG4sbz1laSh0KT90OnQuZmVhdHVyZXM7aWYobyl7Zm9yKGk9MCxlPW8ubGVuZ3RoO2k8ZTtpKyspKChuPW9baV0pLmdlb21ldHJpZXN8fG4uZ2VvbWV0cnl8fG4uZmVhdHVyZXN8fG4uY29vcmRpbmF0ZXMpJiZ0aGlzLmFkZERhdGEobik7cmV0dXJuIHRoaXN9dmFyIHM9dGhpcy5vcHRpb25zO2lmKHMuZmlsdGVyJiYhcy5maWx0ZXIodCkpcmV0dXJuIHRoaXM7dmFyIHI9V3QodCxzKTtyZXR1cm4gcj8oci5mZWF0dXJlPUd0KHQpLHIuZGVmYXVsdE9wdGlvbnM9ci5vcHRpb25zLHRoaXMucmVzZXRTdHlsZShyKSxzLm9uRWFjaEZlYXR1cmUmJnMub25FYWNoRmVhdHVyZSh0LHIpLHRoaXMuYWRkTGF5ZXIocikpOnRoaXN9LHJlc2V0U3R5bGU6ZnVuY3Rpb24odCl7cmV0dXJuIHQub3B0aW9ucz1pKHt9LHQuZGVmYXVsdE9wdGlvbnMpLHRoaXMuX3NldExheWVyU3R5bGUodCx0aGlzLm9wdGlvbnMuc3R5bGUpLHRoaXN9LHNldFN0eWxlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hMYXllcihmdW5jdGlvbihpKXt0aGlzLl9zZXRMYXllclN0eWxlKGksdCl9LHRoaXMpfSxfc2V0TGF5ZXJTdHlsZTpmdW5jdGlvbih0LGkpeyJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoaT1pKHQuZmVhdHVyZSkpLHQuc2V0U3R5bGUmJnQuc2V0U3R5bGUoaSl9fSksb249e3RvR2VvSlNPTjpmdW5jdGlvbih0KXtyZXR1cm4gcXQodGhpcyx7dHlwZToiUG9pbnQiLGNvb3JkaW5hdGVzOlV0KHRoaXMuZ2V0TGF0TG5nKCksdCl9KX19O1hlLmluY2x1ZGUob24pLFFlLmluY2x1ZGUob24pLCRlLmluY2x1ZGUob24pLHRuLmluY2x1ZGUoe3RvR2VvSlNPTjpmdW5jdGlvbih0KXt2YXIgaT0hRHQodGhpcy5fbGF0bG5ncyksZT1WdCh0aGlzLl9sYXRsbmdzLGk/MTowLCExLHQpO3JldHVybiBxdCh0aGlzLHt0eXBlOihpPyJNdWx0aSI6IiIpKyJMaW5lU3RyaW5nIixjb29yZGluYXRlczplfSl9fSksZW4uaW5jbHVkZSh7dG9HZW9KU09OOmZ1bmN0aW9uKHQpe3ZhciBpPSFEdCh0aGlzLl9sYXRsbmdzKSxlPWkmJiFEdCh0aGlzLl9sYXRsbmdzWzBdKSxuPVZ0KHRoaXMuX2xhdGxuZ3MsZT8yOmk/MTowLCEwLHQpO3JldHVybiBpfHwobj1bbl0pLHF0KHRoaXMse3R5cGU6KGU/Ik11bHRpIjoiIikrIlBvbHlnb24iLGNvb3JkaW5hdGVzOm59KX19KSxWZS5pbmNsdWRlKHt0b011bHRpUG9pbnQ6ZnVuY3Rpb24odCl7dmFyIGk9W107cmV0dXJuIHRoaXMuZWFjaExheWVyKGZ1bmN0aW9uKGUpe2kucHVzaChlLnRvR2VvSlNPTih0KS5nZW9tZXRyeS5jb29yZGluYXRlcyl9KSxxdCh0aGlzLHt0eXBlOiJNdWx0aVBvaW50Iixjb29yZGluYXRlczppfSl9LHRvR2VvSlNPTjpmdW5jdGlvbih0KXt2YXIgaT10aGlzLmZlYXR1cmUmJnRoaXMuZmVhdHVyZS5nZW9tZXRyeSYmdGhpcy5mZWF0dXJlLmdlb21ldHJ5LnR5cGU7aWYoIk11bHRpUG9pbnQiPT09aSlyZXR1cm4gdGhpcy50b011bHRpUG9pbnQodCk7dmFyIGU9Ikdlb21ldHJ5Q29sbGVjdGlvbiI9PT1pLG49W107cmV0dXJuIHRoaXMuZWFjaExheWVyKGZ1bmN0aW9uKGkpe2lmKGkudG9HZW9KU09OKXt2YXIgbz1pLnRvR2VvSlNPTih0KTtpZihlKW4ucHVzaChvLmdlb21ldHJ5KTtlbHNle3ZhciBzPUd0KG8pOyJGZWF0dXJlQ29sbGVjdGlvbiI9PT1zLnR5cGU/bi5wdXNoLmFwcGx5KG4scy5mZWF0dXJlcyk6bi5wdXNoKHMpfX19KSxlP3F0KHRoaXMse2dlb21ldHJpZXM6bix0eXBlOiJHZW9tZXRyeUNvbGxlY3Rpb24ifSk6e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczpufX19KTt2YXIgc249S3Qscm49VWUuZXh0ZW5kKHtvcHRpb25zOntvcGFjaXR5OjEsYWx0OiIiLGludGVyYWN0aXZlOiExLGNyb3NzT3JpZ2luOiExLGVycm9yT3ZlcmxheVVybDoiIix6SW5kZXg6MSxjbGFzc05hbWU6IiJ9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxpLGUpe3RoaXMuX3VybD10LHRoaXMuX2JvdW5kcz16KGkpLGwodGhpcyxlKX0sb25BZGQ6ZnVuY3Rpb24oKXt0aGlzLl9pbWFnZXx8KHRoaXMuX2luaXRJbWFnZSgpLHRoaXMub3B0aW9ucy5vcGFjaXR5PDEmJnRoaXMuX3VwZGF0ZU9wYWNpdHkoKSksdGhpcy5vcHRpb25zLmludGVyYWN0aXZlJiYocHQodGhpcy5faW1hZ2UsImxlYWZsZXQtaW50ZXJhY3RpdmUiKSx0aGlzLmFkZEludGVyYWN0aXZlVGFyZ2V0KHRoaXMuX2ltYWdlKSksdGhpcy5nZXRQYW5lKCkuYXBwZW5kQ2hpbGQodGhpcy5faW1hZ2UpLHRoaXMuX3Jlc2V0KCl9LG9uUmVtb3ZlOmZ1bmN0aW9uKCl7dXQodGhpcy5faW1hZ2UpLHRoaXMub3B0aW9ucy5pbnRlcmFjdGl2ZSYmdGhpcy5yZW1vdmVJbnRlcmFjdGl2ZVRhcmdldCh0aGlzLl9pbWFnZSl9LHNldE9wYWNpdHk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5vcGFjaXR5PXQsdGhpcy5faW1hZ2UmJnRoaXMuX3VwZGF0ZU9wYWNpdHkoKSx0aGlzfSxzZXRTdHlsZTpmdW5jdGlvbih0KXtyZXR1cm4gdC5vcGFjaXR5JiZ0aGlzLnNldE9wYWNpdHkodC5vcGFjaXR5KSx0aGlzfSxicmluZ1RvRnJvbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZjdCh0aGlzLl9pbWFnZSksdGhpc30sYnJpbmdUb0JhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZfdCh0aGlzLl9pbWFnZSksdGhpc30sc2V0VXJsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl91cmw9dCx0aGlzLl9pbWFnZSYmKHRoaXMuX2ltYWdlLnNyYz10KSx0aGlzfSxzZXRCb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JvdW5kcz16KHQpLHRoaXMuX21hcCYmdGhpcy5fcmVzZXQoKSx0aGlzfSxnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdD17em9vbTp0aGlzLl9yZXNldCx2aWV3cmVzZXQ6dGhpcy5fcmVzZXR9O3JldHVybiB0aGlzLl96b29tQW5pbWF0ZWQmJih0Lnpvb21hbmltPXRoaXMuX2FuaW1hdGVab29tKSx0fSxzZXRaSW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy56SW5kZXg9dCx0aGlzLl91cGRhdGVaSW5kZXgoKSx0aGlzfSxnZXRCb3VuZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYm91bmRzfSxnZXRFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ltYWdlfSxfaW5pdEltYWdlOmZ1bmN0aW9uKCl7dmFyIHQ9IklNRyI9PT10aGlzLl91cmwudGFnTmFtZSxpPXRoaXMuX2ltYWdlPXQ/dGhpcy5fdXJsOmh0KCJpbWciKTtwdChpLCJsZWFmbGV0LWltYWdlLWxheWVyIiksdGhpcy5fem9vbUFuaW1hdGVkJiZwdChpLCJsZWFmbGV0LXpvb20tYW5pbWF0ZWQiKSx0aGlzLm9wdGlvbnMuY2xhc3NOYW1lJiZwdChpLHRoaXMub3B0aW9ucy5jbGFzc05hbWUpLGkub25zZWxlY3RzdGFydD1yLGkub25tb3VzZW1vdmU9cixpLm9ubG9hZD1lKHRoaXMuZmlyZSx0aGlzLCJsb2FkIiksaS5vbmVycm9yPWUodGhpcy5fb3ZlcmxheU9uRXJyb3IsdGhpcywiZXJyb3IiKSx0aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW4mJihpLmNyb3NzT3JpZ2luPSIiKSx0aGlzLm9wdGlvbnMuekluZGV4JiZ0aGlzLl91cGRhdGVaSW5kZXgoKSx0P3RoaXMuX3VybD1pLnNyYzooaS5zcmM9dGhpcy5fdXJsLGkuYWx0PXRoaXMub3B0aW9ucy5hbHQpfSxfYW5pbWF0ZVpvb206ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFwLmdldFpvb21TY2FsZSh0Lnpvb20pLGU9dGhpcy5fbWFwLl9sYXRMbmdCb3VuZHNUb05ld0xheWVyQm91bmRzKHRoaXMuX2JvdW5kcyx0Lnpvb20sdC5jZW50ZXIpLm1pbjt3dCh0aGlzLl9pbWFnZSxlLGkpfSxfcmVzZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9pbWFnZSxpPW5ldyBQKHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fYm91bmRzLmdldE5vcnRoV2VzdCgpKSx0aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2JvdW5kcy5nZXRTb3V0aEVhc3QoKSkpLGU9aS5nZXRTaXplKCk7THQodCxpLm1pbiksdC5zdHlsZS53aWR0aD1lLngrInB4Iix0LnN0eWxlLmhlaWdodD1lLnkrInB4In0sX3VwZGF0ZU9wYWNpdHk6ZnVuY3Rpb24oKXt2dCh0aGlzLl9pbWFnZSx0aGlzLm9wdGlvbnMub3BhY2l0eSl9LF91cGRhdGVaSW5kZXg6ZnVuY3Rpb24oKXt0aGlzLl9pbWFnZSYmdm9pZCAwIT09dGhpcy5vcHRpb25zLnpJbmRleCYmbnVsbCE9PXRoaXMub3B0aW9ucy56SW5kZXgmJih0aGlzLl9pbWFnZS5zdHlsZS56SW5kZXg9dGhpcy5vcHRpb25zLnpJbmRleCl9LF9vdmVybGF5T25FcnJvcjpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZXJyb3IiKTt2YXIgdD10aGlzLm9wdGlvbnMuZXJyb3JPdmVybGF5VXJsO3QmJnRoaXMuX3VybCE9PXQmJih0aGlzLl91cmw9dCx0aGlzLl9pbWFnZS5zcmM9dCl9fSksYW49cm4uZXh0ZW5kKHtvcHRpb25zOnthdXRvcGxheTohMCxsb29wOiEwfSxfaW5pdEltYWdlOmZ1bmN0aW9uKCl7dmFyIHQ9IlZJREVPIj09PXRoaXMuX3VybC50YWdOYW1lLGk9dGhpcy5faW1hZ2U9dD90aGlzLl91cmw6aHQoInZpZGVvIik7aWYocHQoaSwibGVhZmxldC1pbWFnZS1sYXllciIpLHRoaXMuX3pvb21BbmltYXRlZCYmcHQoaSwibGVhZmxldC16b29tLWFuaW1hdGVkIiksaS5vbnNlbGVjdHN0YXJ0PXIsaS5vbm1vdXNlbW92ZT1yLGkub25sb2FkZWRkYXRhPWUodGhpcy5maXJlLHRoaXMsImxvYWQiKSx0KXtmb3IodmFyIG49aS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIiksbz1bXSxzPTA7czxuLmxlbmd0aDtzKyspby5wdXNoKG5bc10uc3JjKTt0aGlzLl91cmw9bi5sZW5ndGg+MD9vOltpLnNyY119ZWxzZXtlaSh0aGlzLl91cmwpfHwodGhpcy5fdXJsPVt0aGlzLl91cmxdKSxpLmF1dG9wbGF5PSEhdGhpcy5vcHRpb25zLmF1dG9wbGF5LGkubG9vcD0hIXRoaXMub3B0aW9ucy5sb29wO2Zvcih2YXIgYT0wO2E8dGhpcy5fdXJsLmxlbmd0aDthKyspe3ZhciBoPWh0KCJzb3VyY2UiKTtoLnNyYz10aGlzLl91cmxbYV0saS5hcHBlbmRDaGlsZChoKX19fX0pLGhuPVVlLmV4dGVuZCh7b3B0aW9uczp7b2Zmc2V0OlswLDddLGNsYXNzTmFtZToiIixwYW5lOiJwb3B1cFBhbmUifSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsaSl7bCh0aGlzLHQpLHRoaXMuX3NvdXJjZT1pfSxvbkFkZDpmdW5jdGlvbih0KXt0aGlzLl96b29tQW5pbWF0ZWQ9dC5fem9vbUFuaW1hdGVkLHRoaXMuX2NvbnRhaW5lcnx8dGhpcy5faW5pdExheW91dCgpLHQuX2ZhZGVBbmltYXRlZCYmdnQodGhpcy5fY29udGFpbmVyLDApLGNsZWFyVGltZW91dCh0aGlzLl9yZW1vdmVUaW1lb3V0KSx0aGlzLmdldFBhbmUoKS5hcHBlbmRDaGlsZCh0aGlzLl9jb250YWluZXIpLHRoaXMudXBkYXRlKCksdC5fZmFkZUFuaW1hdGVkJiZ2dCh0aGlzLl9jb250YWluZXIsMSksdGhpcy5icmluZ1RvRnJvbnQoKX0sb25SZW1vdmU6ZnVuY3Rpb24odCl7dC5fZmFkZUFuaW1hdGVkPyh2dCh0aGlzLl9jb250YWluZXIsMCksdGhpcy5fcmVtb3ZlVGltZW91dD1zZXRUaW1lb3V0KGUodXQsdm9pZCAwLHRoaXMuX2NvbnRhaW5lciksMjAwKSk6dXQodGhpcy5fY29udGFpbmVyKX0sZ2V0TGF0TG5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhdGxuZ30sc2V0TGF0TG5nOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sYXRsbmc9Qyh0KSx0aGlzLl9tYXAmJih0aGlzLl91cGRhdGVQb3NpdGlvbigpLHRoaXMuX2FkanVzdFBhbigpKSx0aGlzfSxnZXRDb250ZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnR9LHNldENvbnRlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NvbnRlbnQ9dCx0aGlzLnVwZGF0ZSgpLHRoaXN9LGdldEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGFpbmVyfSx1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJih0aGlzLl9jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIix0aGlzLl91cGRhdGVDb250ZW50KCksdGhpcy5fdXBkYXRlTGF5b3V0KCksdGhpcy5fdXBkYXRlUG9zaXRpb24oKSx0aGlzLl9jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eT0iIix0aGlzLl9hZGp1c3RQYW4oKSl9LGdldEV2ZW50czpmdW5jdGlvbigpe3ZhciB0PXt6b29tOnRoaXMuX3VwZGF0ZVBvc2l0aW9uLHZpZXdyZXNldDp0aGlzLl91cGRhdGVQb3NpdGlvbn07cmV0dXJuIHRoaXMuX3pvb21BbmltYXRlZCYmKHQuem9vbWFuaW09dGhpcy5fYW5pbWF0ZVpvb20pLHR9LGlzT3BlbjpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5fbWFwJiZ0aGlzLl9tYXAuaGFzTGF5ZXIodGhpcyl9LGJyaW5nVG9Gcm9udDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAmJmN0KHRoaXMuX2NvbnRhaW5lciksdGhpc30sYnJpbmdUb0JhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiZfdCh0aGlzLl9jb250YWluZXIpLHRoaXN9LF91cGRhdGVDb250ZW50OmZ1bmN0aW9uKCl7aWYodGhpcy5fY29udGVudCl7dmFyIHQ9dGhpcy5fY29udGVudE5vZGUsaT0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fY29udGVudD90aGlzLl9jb250ZW50KHRoaXMuX3NvdXJjZXx8dGhpcyk6dGhpcy5fY29udGVudDtpZigic3RyaW5nIj09dHlwZW9mIGkpdC5pbm5lckhUTUw9aTtlbHNle2Zvcig7dC5oYXNDaGlsZE5vZGVzKCk7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKTt0LmFwcGVuZENoaWxkKGkpfXRoaXMuZmlyZSgiY29udGVudHVwZGF0ZSIpfX0sX3VwZGF0ZVBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fbWFwKXt2YXIgdD10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyksaT13KHRoaXMub3B0aW9ucy5vZmZzZXQpLGU9dGhpcy5fZ2V0QW5jaG9yKCk7dGhpcy5fem9vbUFuaW1hdGVkP0x0KHRoaXMuX2NvbnRhaW5lcix0LmFkZChlKSk6aT1pLmFkZCh0KS5hZGQoZSk7dmFyIG49dGhpcy5fY29udGFpbmVyQm90dG9tPS1pLnksbz10aGlzLl9jb250YWluZXJMZWZ0PS1NYXRoLnJvdW5kKHRoaXMuX2NvbnRhaW5lcldpZHRoLzIpK2kueDt0aGlzLl9jb250YWluZXIuc3R5bGUuYm90dG9tPW4rInB4Iix0aGlzLl9jb250YWluZXIuc3R5bGUubGVmdD1vKyJweCJ9fSxfZ2V0QW5jaG9yOmZ1bmN0aW9uKCl7cmV0dXJuWzAsMF19fSksdW49aG4uZXh0ZW5kKHtvcHRpb25zOnttYXhXaWR0aDozMDAsbWluV2lkdGg6NTAsbWF4SGVpZ2h0Om51bGwsYXV0b1BhbjohMCxhdXRvUGFuUGFkZGluZ1RvcExlZnQ6bnVsbCxhdXRvUGFuUGFkZGluZ0JvdHRvbVJpZ2h0Om51bGwsYXV0b1BhblBhZGRpbmc6WzUsNV0sa2VlcEluVmlldzohMSxjbG9zZUJ1dHRvbjohMCxhdXRvQ2xvc2U6ITAsY2xvc2VPbkVzY2FwZUtleTohMCxjbGFzc05hbWU6IiJ9LG9wZW5PbjpmdW5jdGlvbih0KXtyZXR1cm4gdC5vcGVuUG9wdXAodGhpcyksdGhpc30sb25BZGQ6ZnVuY3Rpb24odCl7aG4ucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcyx0KSx0LmZpcmUoInBvcHVwb3BlbiIse3BvcHVwOnRoaXN9KSx0aGlzLl9zb3VyY2UmJih0aGlzLl9zb3VyY2UuZmlyZSgicG9wdXBvcGVuIix7cG9wdXA6dGhpc30sITApLHRoaXMuX3NvdXJjZSBpbnN0YW5jZW9mIEplfHx0aGlzLl9zb3VyY2Uub24oInByZWNsaWNrIixZKSl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe2huLnByb3RvdHlwZS5vblJlbW92ZS5jYWxsKHRoaXMsdCksdC5maXJlKCJwb3B1cGNsb3NlIix7cG9wdXA6dGhpc30pLHRoaXMuX3NvdXJjZSYmKHRoaXMuX3NvdXJjZS5maXJlKCJwb3B1cGNsb3NlIix7cG9wdXA6dGhpc30sITApLHRoaXMuX3NvdXJjZSBpbnN0YW5jZW9mIEplfHx0aGlzLl9zb3VyY2Uub2ZmKCJwcmVjbGljayIsWSkpfSxnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdD1obi5wcm90b3R5cGUuZ2V0RXZlbnRzLmNhbGwodGhpcyk7cmV0dXJuKHZvaWQgMCE9PXRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2s/dGhpcy5vcHRpb25zLmNsb3NlT25DbGljazp0aGlzLl9tYXAub3B0aW9ucy5jbG9zZVBvcHVwT25DbGljaykmJih0LnByZWNsaWNrPXRoaXMuX2Nsb3NlKSx0aGlzLm9wdGlvbnMua2VlcEluVmlldyYmKHQubW92ZWVuZD10aGlzLl9hZGp1c3RQYW4pLHR9LF9jbG9zZTpmdW5jdGlvbigpe3RoaXMuX21hcCYmdGhpcy5fbWFwLmNsb3NlUG9wdXAodGhpcyl9LF9pbml0TGF5b3V0OmZ1bmN0aW9uKCl7dmFyIHQ9ImxlYWZsZXQtcG9wdXAiLGk9dGhpcy5fY29udGFpbmVyPWh0KCJkaXYiLHQrIiAiKyh0aGlzLm9wdGlvbnMuY2xhc3NOYW1lfHwiIikrIiBsZWFmbGV0LXpvb20tYW5pbWF0ZWQiKSxlPXRoaXMuX3dyYXBwZXI9aHQoImRpdiIsdCsiLWNvbnRlbnQtd3JhcHBlciIsaSk7aWYodGhpcy5fY29udGVudE5vZGU9aHQoImRpdiIsdCsiLWNvbnRlbnQiLGUpLEooZSksWCh0aGlzLl9jb250ZW50Tm9kZSksVihlLCJjb250ZXh0bWVudSIsWSksdGhpcy5fdGlwQ29udGFpbmVyPWh0KCJkaXYiLHQrIi10aXAtY29udGFpbmVyIixpKSx0aGlzLl90aXA9aHQoImRpdiIsdCsiLXRpcCIsdGhpcy5fdGlwQ29udGFpbmVyKSx0aGlzLm9wdGlvbnMuY2xvc2VCdXR0b24pe3ZhciBuPXRoaXMuX2Nsb3NlQnV0dG9uPWh0KCJhIix0KyItY2xvc2UtYnV0dG9uIixpKTtuLmhyZWY9IiNjbG9zZSIsbi5pbm5lckhUTUw9IiYjMjE1OyIsVihuLCJjbGljayIsdGhpcy5fb25DbG9zZUJ1dHRvbkNsaWNrLHRoaXMpfX0sX3VwZGF0ZUxheW91dDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NvbnRlbnROb2RlLGk9dC5zdHlsZTtpLndpZHRoPSIiLGkud2hpdGVTcGFjZT0ibm93cmFwIjt2YXIgZT10Lm9mZnNldFdpZHRoO2U9TWF0aC5taW4oZSx0aGlzLm9wdGlvbnMubWF4V2lkdGgpLGU9TWF0aC5tYXgoZSx0aGlzLm9wdGlvbnMubWluV2lkdGgpLGkud2lkdGg9ZSsxKyJweCIsaS53aGl0ZVNwYWNlPSIiLGkuaGVpZ2h0PSIiO3ZhciBuPXQub2Zmc2V0SGVpZ2h0LG89dGhpcy5vcHRpb25zLm1heEhlaWdodDtvJiZuPm8/KGkuaGVpZ2h0PW8rInB4IixwdCh0LCJsZWFmbGV0LXBvcHVwLXNjcm9sbGVkIikpOm10KHQsImxlYWZsZXQtcG9wdXAtc2Nyb2xsZWQiKSx0aGlzLl9jb250YWluZXJXaWR0aD10aGlzLl9jb250YWluZXIub2Zmc2V0V2lkdGh9LF9hbmltYXRlWm9vbTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9tYXAuX2xhdExuZ1RvTmV3TGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcsdC56b29tLHQuY2VudGVyKSxlPXRoaXMuX2dldEFuY2hvcigpO0x0KHRoaXMuX2NvbnRhaW5lcixpLmFkZChlKSl9LF9hZGp1c3RQYW46ZnVuY3Rpb24oKXtpZighKCF0aGlzLm9wdGlvbnMuYXV0b1Bhbnx8dGhpcy5fbWFwLl9wYW5BbmltJiZ0aGlzLl9tYXAuX3BhbkFuaW0uX2luUHJvZ3Jlc3MpKXt2YXIgdD10aGlzLl9tYXAsaT1wYXJzZUludChhdCh0aGlzLl9jb250YWluZXIsIm1hcmdpbkJvdHRvbSIpLDEwKXx8MCxlPXRoaXMuX2NvbnRhaW5lci5vZmZzZXRIZWlnaHQraSxuPXRoaXMuX2NvbnRhaW5lcldpZHRoLG89bmV3IHgodGhpcy5fY29udGFpbmVyTGVmdCwtZS10aGlzLl9jb250YWluZXJCb3R0b20pO28uX2FkZChQdCh0aGlzLl9jb250YWluZXIpKTt2YXIgcz10LmxheWVyUG9pbnRUb0NvbnRhaW5lclBvaW50KG8pLHI9dyh0aGlzLm9wdGlvbnMuYXV0b1BhblBhZGRpbmcpLGE9dyh0aGlzLm9wdGlvbnMuYXV0b1BhblBhZGRpbmdUb3BMZWZ0fHxyKSxoPXcodGhpcy5vcHRpb25zLmF1dG9QYW5QYWRkaW5nQm90dG9tUmlnaHR8fHIpLHU9dC5nZXRTaXplKCksbD0wLGM9MDtzLngrbitoLng+dS54JiYobD1zLngrbi11LngraC54KSxzLngtbC1hLng8MCYmKGw9cy54LWEueCkscy55K2UraC55PnUueSYmKGM9cy55K2UtdS55K2gueSkscy55LWMtYS55PDAmJihjPXMueS1hLnkpLChsfHxjKSYmdC5maXJlKCJhdXRvcGFuc3RhcnQiKS5wYW5CeShbbCxjXSl9fSxfb25DbG9zZUJ1dHRvbkNsaWNrOmZ1bmN0aW9uKHQpe3RoaXMuX2Nsb3NlKCksUSh0KX0sX2dldEFuY2hvcjpmdW5jdGlvbigpe3JldHVybiB3KHRoaXMuX3NvdXJjZSYmdGhpcy5fc291cmNlLl9nZXRQb3B1cEFuY2hvcj90aGlzLl9zb3VyY2UuX2dldFBvcHVwQW5jaG9yKCk6WzAsMF0pfX0pO0xlLm1lcmdlT3B0aW9ucyh7Y2xvc2VQb3B1cE9uQ2xpY2s6ITB9KSxMZS5pbmNsdWRlKHtvcGVuUG9wdXA6ZnVuY3Rpb24odCxpLGUpe3JldHVybiB0IGluc3RhbmNlb2YgdW58fCh0PW5ldyB1bihlKS5zZXRDb250ZW50KHQpKSxpJiZ0LnNldExhdExuZyhpKSx0aGlzLmhhc0xheWVyKHQpP3RoaXM6KHRoaXMuX3BvcHVwJiZ0aGlzLl9wb3B1cC5vcHRpb25zLmF1dG9DbG9zZSYmdGhpcy5jbG9zZVBvcHVwKCksdGhpcy5fcG9wdXA9dCx0aGlzLmFkZExheWVyKHQpKX0sY2xvc2VQb3B1cDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdCE9PXRoaXMuX3BvcHVwfHwodD10aGlzLl9wb3B1cCx0aGlzLl9wb3B1cD1udWxsKSx0JiZ0aGlzLnJlbW92ZUxheWVyKHQpLHRoaXN9fSksVWUuaW5jbHVkZSh7YmluZFBvcHVwOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHQgaW5zdGFuY2VvZiB1bj8obCh0LGkpLHRoaXMuX3BvcHVwPXQsdC5fc291cmNlPXRoaXMpOih0aGlzLl9wb3B1cCYmIWl8fCh0aGlzLl9wb3B1cD1uZXcgdW4oaSx0aGlzKSksdGhpcy5fcG9wdXAuc2V0Q29udGVudCh0KSksdGhpcy5fcG9wdXBIYW5kbGVyc0FkZGVkfHwodGhpcy5vbih7Y2xpY2s6dGhpcy5fb3BlblBvcHVwLGtleXByZXNzOnRoaXMuX29uS2V5UHJlc3MscmVtb3ZlOnRoaXMuY2xvc2VQb3B1cCxtb3ZlOnRoaXMuX21vdmVQb3B1cH0pLHRoaXMuX3BvcHVwSGFuZGxlcnNBZGRlZD0hMCksdGhpc30sdW5iaW5kUG9wdXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9wdXAmJih0aGlzLm9mZih7Y2xpY2s6dGhpcy5fb3BlblBvcHVwLGtleXByZXNzOnRoaXMuX29uS2V5UHJlc3MscmVtb3ZlOnRoaXMuY2xvc2VQb3B1cCxtb3ZlOnRoaXMuX21vdmVQb3B1cH0pLHRoaXMuX3BvcHVwSGFuZGxlcnNBZGRlZD0hMSx0aGlzLl9wb3B1cD1udWxsKSx0aGlzfSxvcGVuUG9wdXA6ZnVuY3Rpb24odCxpKXtpZih0IGluc3RhbmNlb2YgVWV8fChpPXQsdD10aGlzKSx0IGluc3RhbmNlb2YgcWUpZm9yKHZhciBlIGluIHRoaXMuX2xheWVycyl7dD10aGlzLl9sYXllcnNbZV07YnJlYWt9cmV0dXJuIGl8fChpPXQuZ2V0Q2VudGVyP3QuZ2V0Q2VudGVyKCk6dC5nZXRMYXRMbmcoKSksdGhpcy5fcG9wdXAmJnRoaXMuX21hcCYmKHRoaXMuX3BvcHVwLl9zb3VyY2U9dCx0aGlzLl9wb3B1cC51cGRhdGUoKSx0aGlzLl9tYXAub3BlblBvcHVwKHRoaXMuX3BvcHVwLGkpKSx0aGlzfSxjbG9zZVBvcHVwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvcHVwJiZ0aGlzLl9wb3B1cC5fY2xvc2UoKSx0aGlzfSx0b2dnbGVQb3B1cDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcG9wdXAmJih0aGlzLl9wb3B1cC5fbWFwP3RoaXMuY2xvc2VQb3B1cCgpOnRoaXMub3BlblBvcHVwKHQpKSx0aGlzfSxpc1BvcHVwT3BlbjpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5fcG9wdXAmJnRoaXMuX3BvcHVwLmlzT3BlbigpfSxzZXRQb3B1cENvbnRlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BvcHVwJiZ0aGlzLl9wb3B1cC5zZXRDb250ZW50KHQpLHRoaXN9LGdldFBvcHVwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvcHVwfSxfb3BlblBvcHVwOmZ1bmN0aW9uKHQpe3ZhciBpPXQubGF5ZXJ8fHQudGFyZ2V0O3RoaXMuX3BvcHVwJiZ0aGlzLl9tYXAmJihRKHQpLGkgaW5zdGFuY2VvZiBKZT90aGlzLm9wZW5Qb3B1cCh0LmxheWVyfHx0LnRhcmdldCx0LmxhdGxuZyk6dGhpcy5fbWFwLmhhc0xheWVyKHRoaXMuX3BvcHVwKSYmdGhpcy5fcG9wdXAuX3NvdXJjZT09PWk/dGhpcy5jbG9zZVBvcHVwKCk6dGhpcy5vcGVuUG9wdXAoaSx0LmxhdGxuZykpfSxfbW92ZVBvcHVwOmZ1bmN0aW9uKHQpe3RoaXMuX3BvcHVwLnNldExhdExuZyh0LmxhdGxuZyl9LF9vbktleVByZXNzOmZ1bmN0aW9uKHQpezEzPT09dC5vcmlnaW5hbEV2ZW50LmtleUNvZGUmJnRoaXMuX29wZW5Qb3B1cCh0KX19KTt2YXIgbG49aG4uZXh0ZW5kKHtvcHRpb25zOntwYW5lOiJ0b29sdGlwUGFuZSIsb2Zmc2V0OlswLDBdLGRpcmVjdGlvbjoiYXV0byIscGVybWFuZW50OiExLHN0aWNreTohMSxpbnRlcmFjdGl2ZTohMSxvcGFjaXR5Oi45fSxvbkFkZDpmdW5jdGlvbih0KXtobi5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLHQpLHRoaXMuc2V0T3BhY2l0eSh0aGlzLm9wdGlvbnMub3BhY2l0eSksdC5maXJlKCJ0b29sdGlwb3BlbiIse3Rvb2x0aXA6dGhpc30pLHRoaXMuX3NvdXJjZSYmdGhpcy5fc291cmNlLmZpcmUoInRvb2x0aXBvcGVuIix7dG9vbHRpcDp0aGlzfSwhMCl9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe2huLnByb3RvdHlwZS5vblJlbW92ZS5jYWxsKHRoaXMsdCksdC5maXJlKCJ0b29sdGlwY2xvc2UiLHt0b29sdGlwOnRoaXN9KSx0aGlzLl9zb3VyY2UmJnRoaXMuX3NvdXJjZS5maXJlKCJ0b29sdGlwY2xvc2UiLHt0b29sdGlwOnRoaXN9LCEwKX0sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9aG4ucHJvdG90eXBlLmdldEV2ZW50cy5jYWxsKHRoaXMpO3JldHVybiBWaSYmIXRoaXMub3B0aW9ucy5wZXJtYW5lbnQmJih0LnByZWNsaWNrPXRoaXMuX2Nsb3NlKSx0fSxfY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJnRoaXMuX21hcC5jbG9zZVRvb2x0aXAodGhpcyl9LF9pbml0TGF5b3V0OmZ1bmN0aW9uKCl7dmFyIHQ9ImxlYWZsZXQtdG9vbHRpcCAiKyh0aGlzLm9wdGlvbnMuY2xhc3NOYW1lfHwiIikrIiBsZWFmbGV0LXpvb20tIisodGhpcy5fem9vbUFuaW1hdGVkPyJhbmltYXRlZCI6ImhpZGUiKTt0aGlzLl9jb250ZW50Tm9kZT10aGlzLl9jb250YWluZXI9aHQoImRpdiIsdCl9LF91cGRhdGVMYXlvdXQ6ZnVuY3Rpb24oKXt9LF9hZGp1c3RQYW46ZnVuY3Rpb24oKXt9LF9zZXRQb3NpdGlvbjpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9tYXAsZT10aGlzLl9jb250YWluZXIsbj1pLmxhdExuZ1RvQ29udGFpbmVyUG9pbnQoaS5nZXRDZW50ZXIoKSksbz1pLmxheWVyUG9pbnRUb0NvbnRhaW5lclBvaW50KHQpLHM9dGhpcy5vcHRpb25zLmRpcmVjdGlvbixyPWUub2Zmc2V0V2lkdGgsYT1lLm9mZnNldEhlaWdodCxoPXcodGhpcy5vcHRpb25zLm9mZnNldCksdT10aGlzLl9nZXRBbmNob3IoKTsidG9wIj09PXM/dD10LmFkZCh3KC1yLzIraC54LC1hK2gueSt1LnksITApKToiYm90dG9tIj09PXM/dD10LnN1YnRyYWN0KHcoci8yLWgueCwtaC55LCEwKSk6ImNlbnRlciI9PT1zP3Q9dC5zdWJ0cmFjdCh3KHIvMitoLngsYS8yLXUueStoLnksITApKToicmlnaHQiPT09c3x8ImF1dG8iPT09cyYmby54PG4ueD8ocz0icmlnaHQiLHQ9dC5hZGQodyhoLngrdS54LHUueS1hLzIraC55LCEwKSkpOihzPSJsZWZ0Iix0PXQuc3VidHJhY3QodyhyK3UueC1oLngsYS8yLXUueS1oLnksITApKSksbXQoZSwibGVhZmxldC10b29sdGlwLXJpZ2h0IiksbXQoZSwibGVhZmxldC10b29sdGlwLWxlZnQiKSxtdChlLCJsZWFmbGV0LXRvb2x0aXAtdG9wIiksbXQoZSwibGVhZmxldC10b29sdGlwLWJvdHRvbSIpLHB0KGUsImxlYWZsZXQtdG9vbHRpcC0iK3MpLEx0KGUsdCl9LF91cGRhdGVQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKTt0aGlzLl9zZXRQb3NpdGlvbih0KX0sc2V0T3BhY2l0eTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMub3BhY2l0eT10LHRoaXMuX2NvbnRhaW5lciYmdnQodGhpcy5fY29udGFpbmVyLHQpfSxfYW5pbWF0ZVpvb206ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFwLl9sYXRMbmdUb05ld0xheWVyUG9pbnQodGhpcy5fbGF0bG5nLHQuem9vbSx0LmNlbnRlcik7dGhpcy5fc2V0UG9zaXRpb24oaSl9LF9nZXRBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4gdyh0aGlzLl9zb3VyY2UmJnRoaXMuX3NvdXJjZS5fZ2V0VG9vbHRpcEFuY2hvciYmIXRoaXMub3B0aW9ucy5zdGlja3k/dGhpcy5fc291cmNlLl9nZXRUb29sdGlwQW5jaG9yKCk6WzAsMF0pfX0pO0xlLmluY2x1ZGUoe29wZW5Ub29sdGlwOmZ1bmN0aW9uKHQsaSxlKXtyZXR1cm4gdCBpbnN0YW5jZW9mIGxufHwodD1uZXcgbG4oZSkuc2V0Q29udGVudCh0KSksaSYmdC5zZXRMYXRMbmcoaSksdGhpcy5oYXNMYXllcih0KT90aGlzOnRoaXMuYWRkTGF5ZXIodCl9LGNsb3NlVG9vbHRpcDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdGhpcy5yZW1vdmVMYXllcih0KSx0aGlzfX0pLFVlLmluY2x1ZGUoe2JpbmRUb29sdGlwOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHQgaW5zdGFuY2VvZiBsbj8obCh0LGkpLHRoaXMuX3Rvb2x0aXA9dCx0Ll9zb3VyY2U9dGhpcyk6KHRoaXMuX3Rvb2x0aXAmJiFpfHwodGhpcy5fdG9vbHRpcD1uZXcgbG4oaSx0aGlzKSksdGhpcy5fdG9vbHRpcC5zZXRDb250ZW50KHQpKSx0aGlzLl9pbml0VG9vbHRpcEludGVyYWN0aW9ucygpLHRoaXMuX3Rvb2x0aXAub3B0aW9ucy5wZXJtYW5lbnQmJnRoaXMuX21hcCYmdGhpcy5fbWFwLmhhc0xheWVyKHRoaXMpJiZ0aGlzLm9wZW5Ub29sdGlwKCksdGhpc30sdW5iaW5kVG9vbHRpcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90b29sdGlwJiYodGhpcy5faW5pdFRvb2x0aXBJbnRlcmFjdGlvbnMoITApLHRoaXMuY2xvc2VUb29sdGlwKCksdGhpcy5fdG9vbHRpcD1udWxsKSx0aGlzfSxfaW5pdFRvb2x0aXBJbnRlcmFjdGlvbnM6ZnVuY3Rpb24odCl7aWYodHx8IXRoaXMuX3Rvb2x0aXBIYW5kbGVyc0FkZGVkKXt2YXIgaT10PyJvZmYiOiJvbiIsZT17cmVtb3ZlOnRoaXMuY2xvc2VUb29sdGlwLG1vdmU6dGhpcy5fbW92ZVRvb2x0aXB9O3RoaXMuX3Rvb2x0aXAub3B0aW9ucy5wZXJtYW5lbnQ/ZS5hZGQ9dGhpcy5fb3BlblRvb2x0aXA6KGUubW91c2VvdmVyPXRoaXMuX29wZW5Ub29sdGlwLGUubW91c2VvdXQ9dGhpcy5jbG9zZVRvb2x0aXAsdGhpcy5fdG9vbHRpcC5vcHRpb25zLnN0aWNreSYmKGUubW91c2Vtb3ZlPXRoaXMuX21vdmVUb29sdGlwKSxWaSYmKGUuY2xpY2s9dGhpcy5fb3BlblRvb2x0aXApKSx0aGlzW2ldKGUpLHRoaXMuX3Rvb2x0aXBIYW5kbGVyc0FkZGVkPSF0fX0sb3BlblRvb2x0aXA6ZnVuY3Rpb24odCxpKXtpZih0IGluc3RhbmNlb2YgVWV8fChpPXQsdD10aGlzKSx0IGluc3RhbmNlb2YgcWUpZm9yKHZhciBlIGluIHRoaXMuX2xheWVycyl7dD10aGlzLl9sYXllcnNbZV07YnJlYWt9cmV0dXJuIGl8fChpPXQuZ2V0Q2VudGVyP3QuZ2V0Q2VudGVyKCk6dC5nZXRMYXRMbmcoKSksdGhpcy5fdG9vbHRpcCYmdGhpcy5fbWFwJiYodGhpcy5fdG9vbHRpcC5fc291cmNlPXQsdGhpcy5fdG9vbHRpcC51cGRhdGUoKSx0aGlzLl9tYXAub3BlblRvb2x0aXAodGhpcy5fdG9vbHRpcCxpKSx0aGlzLl90b29sdGlwLm9wdGlvbnMuaW50ZXJhY3RpdmUmJnRoaXMuX3Rvb2x0aXAuX2NvbnRhaW5lciYmKHB0KHRoaXMuX3Rvb2x0aXAuX2NvbnRhaW5lciwibGVhZmxldC1jbGlja2FibGUiKSx0aGlzLmFkZEludGVyYWN0aXZlVGFyZ2V0KHRoaXMuX3Rvb2x0aXAuX2NvbnRhaW5lcikpKSx0aGlzfSxjbG9zZVRvb2x0aXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdG9vbHRpcCYmKHRoaXMuX3Rvb2x0aXAuX2Nsb3NlKCksdGhpcy5fdG9vbHRpcC5vcHRpb25zLmludGVyYWN0aXZlJiZ0aGlzLl90b29sdGlwLl9jb250YWluZXImJihtdCh0aGlzLl90b29sdGlwLl9jb250YWluZXIsImxlYWZsZXQtY2xpY2thYmxlIiksdGhpcy5yZW1vdmVJbnRlcmFjdGl2ZVRhcmdldCh0aGlzLl90b29sdGlwLl9jb250YWluZXIpKSksdGhpc30sdG9nZ2xlVG9vbHRpcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdG9vbHRpcCYmKHRoaXMuX3Rvb2x0aXAuX21hcD90aGlzLmNsb3NlVG9vbHRpcCgpOnRoaXMub3BlblRvb2x0aXAodCkpLHRoaXN9LGlzVG9vbHRpcE9wZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdG9vbHRpcC5pc09wZW4oKX0sc2V0VG9vbHRpcENvbnRlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3Rvb2x0aXAmJnRoaXMuX3Rvb2x0aXAuc2V0Q29udGVudCh0KSx0aGlzfSxnZXRUb29sdGlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Rvb2x0aXB9LF9vcGVuVG9vbHRpcDpmdW5jdGlvbih0KXt2YXIgaT10LmxheWVyfHx0LnRhcmdldDt0aGlzLl90b29sdGlwJiZ0aGlzLl9tYXAmJnRoaXMub3BlblRvb2x0aXAoaSx0aGlzLl90b29sdGlwLm9wdGlvbnMuc3RpY2t5P3QubGF0bG5nOnZvaWQgMCl9LF9tb3ZlVG9vbHRpcDpmdW5jdGlvbih0KXt2YXIgaSxlLG49dC5sYXRsbmc7dGhpcy5fdG9vbHRpcC5vcHRpb25zLnN0aWNreSYmdC5vcmlnaW5hbEV2ZW50JiYoaT10aGlzLl9tYXAubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodC5vcmlnaW5hbEV2ZW50KSxlPXRoaXMuX21hcC5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludChpKSxuPXRoaXMuX21hcC5sYXllclBvaW50VG9MYXRMbmcoZSkpLHRoaXMuX3Rvb2x0aXAuc2V0TGF0TG5nKG4pfX0pO3ZhciBjbj1HZS5leHRlbmQoe29wdGlvbnM6e2ljb25TaXplOlsxMiwxMl0saHRtbDohMSxiZ1BvczpudWxsLGNsYXNzTmFtZToibGVhZmxldC1kaXYtaWNvbiJ9LGNyZWF0ZUljb246ZnVuY3Rpb24odCl7dmFyIGk9dCYmIkRJViI9PT10LnRhZ05hbWU/dDpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPXRoaXMub3B0aW9ucztpZihpLmlubmVySFRNTD0hMSE9PWUuaHRtbD9lLmh0bWw6IiIsZS5iZ1Bvcyl7dmFyIG49dyhlLmJnUG9zKTtpLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbj0tbi54KyJweCAiKy1uLnkrInB4In1yZXR1cm4gdGhpcy5fc2V0SWNvblN0eWxlcyhpLCJpY29uIiksaX0sY3JlYXRlU2hhZG93OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9fSk7R2UuRGVmYXVsdD1LZTt2YXIgX249VWUuZXh0ZW5kKHtvcHRpb25zOnt0aWxlU2l6ZToyNTYsb3BhY2l0eToxLHVwZGF0ZVdoZW5JZGxlOmppLHVwZGF0ZVdoZW5ab29taW5nOiEwLHVwZGF0ZUludGVydmFsOjIwMCx6SW5kZXg6MSxib3VuZHM6bnVsbCxtaW5ab29tOjAsbWF4Wm9vbTp2b2lkIDAsbWF4TmF0aXZlWm9vbTp2b2lkIDAsbWluTmF0aXZlWm9vbTp2b2lkIDAsbm9XcmFwOiExLHBhbmU6InRpbGVQYW5lIixjbGFzc05hbWU6IiIsa2VlcEJ1ZmZlcjoyfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe2wodGhpcyx0KX0sb25BZGQ6ZnVuY3Rpb24oKXt0aGlzLl9pbml0Q29udGFpbmVyKCksdGhpcy5fbGV2ZWxzPXt9LHRoaXMuX3RpbGVzPXt9LHRoaXMuX3Jlc2V0VmlldygpLHRoaXMuX3VwZGF0ZSgpfSxiZWZvcmVBZGQ6ZnVuY3Rpb24odCl7dC5fYWRkWm9vbUxpbWl0KHRoaXMpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLl9yZW1vdmVBbGxUaWxlcygpLHV0KHRoaXMuX2NvbnRhaW5lciksdC5fcmVtb3ZlWm9vbUxpbWl0KHRoaXMpLHRoaXMuX2NvbnRhaW5lcj1udWxsLHRoaXMuX3RpbGVab29tPXZvaWQgMH0sYnJpbmdUb0Zyb250OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcCYmKGN0KHRoaXMuX2NvbnRhaW5lciksdGhpcy5fc2V0QXV0b1pJbmRleChNYXRoLm1heCkpLHRoaXN9LGJyaW5nVG9CYWNrOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcCYmKF90KHRoaXMuX2NvbnRhaW5lciksdGhpcy5fc2V0QXV0b1pJbmRleChNYXRoLm1pbikpLHRoaXN9LGdldENvbnRhaW5lcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250YWluZXJ9LHNldE9wYWNpdHk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0aW9ucy5vcGFjaXR5PXQsdGhpcy5fdXBkYXRlT3BhY2l0eSgpLHRoaXN9LHNldFpJbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLnpJbmRleD10LHRoaXMuX3VwZGF0ZVpJbmRleCgpLHRoaXN9LGlzTG9hZGluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb2FkaW5nfSxyZWRyYXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiYodGhpcy5fcmVtb3ZlQWxsVGlsZXMoKSx0aGlzLl91cGRhdGUoKSksdGhpc30sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9e3ZpZXdwcmVyZXNldDp0aGlzLl9pbnZhbGlkYXRlQWxsLHZpZXdyZXNldDp0aGlzLl9yZXNldFZpZXcsem9vbTp0aGlzLl9yZXNldFZpZXcsbW92ZWVuZDp0aGlzLl9vbk1vdmVFbmR9O3JldHVybiB0aGlzLm9wdGlvbnMudXBkYXRlV2hlbklkbGV8fCh0aGlzLl9vbk1vdmV8fCh0aGlzLl9vbk1vdmU9byh0aGlzLl9vbk1vdmVFbmQsdGhpcy5vcHRpb25zLnVwZGF0ZUludGVydmFsLHRoaXMpKSx0Lm1vdmU9dGhpcy5fb25Nb3ZlKSx0aGlzLl96b29tQW5pbWF0ZWQmJih0Lnpvb21hbmltPXRoaXMuX2FuaW1hdGVab29tKSx0fSxjcmVhdGVUaWxlOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpfSxnZXRUaWxlU2l6ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy50aWxlU2l6ZTtyZXR1cm4gdCBpbnN0YW5jZW9mIHg/dDpuZXcgeCh0LHQpfSxfdXBkYXRlWkluZGV4OmZ1bmN0aW9uKCl7dGhpcy5fY29udGFpbmVyJiZ2b2lkIDAhPT10aGlzLm9wdGlvbnMuekluZGV4JiZudWxsIT09dGhpcy5vcHRpb25zLnpJbmRleCYmKHRoaXMuX2NvbnRhaW5lci5zdHlsZS56SW5kZXg9dGhpcy5vcHRpb25zLnpJbmRleCl9LF9zZXRBdXRvWkluZGV4OmZ1bmN0aW9uKHQpe2Zvcih2YXIgaSxlPXRoaXMuZ2V0UGFuZSgpLmNoaWxkcmVuLG49LXQoLTEvMCwxLzApLG89MCxzPWUubGVuZ3RoO288cztvKyspaT1lW29dLnN0eWxlLnpJbmRleCxlW29dIT09dGhpcy5fY29udGFpbmVyJiZpJiYobj10KG4sK2kpKTtpc0Zpbml0ZShuKSYmKHRoaXMub3B0aW9ucy56SW5kZXg9bit0KC0xLDEpLHRoaXMuX3VwZGF0ZVpJbmRleCgpKX0sX3VwZGF0ZU9wYWNpdHk6ZnVuY3Rpb24oKXtpZih0aGlzLl9tYXAmJiFMaSl7dnQodGhpcy5fY29udGFpbmVyLHRoaXMub3B0aW9ucy5vcGFjaXR5KTt2YXIgdD0rbmV3IERhdGUsaT0hMSxlPSExO2Zvcih2YXIgbiBpbiB0aGlzLl90aWxlcyl7dmFyIG89dGhpcy5fdGlsZXNbbl07aWYoby5jdXJyZW50JiZvLmxvYWRlZCl7dmFyIHM9TWF0aC5taW4oMSwodC1vLmxvYWRlZCkvMjAwKTt2dChvLmVsLHMpLHM8MT9pPSEwOihvLmFjdGl2ZT9lPSEwOnRoaXMuX29uT3BhcXVlVGlsZShvKSxvLmFjdGl2ZT0hMCl9fWUmJiF0aGlzLl9ub1BydW5lJiZ0aGlzLl9wcnVuZVRpbGVzKCksaSYmKGcodGhpcy5fZmFkZUZyYW1lKSx0aGlzLl9mYWRlRnJhbWU9Zih0aGlzLl91cGRhdGVPcGFjaXR5LHRoaXMpKX19LF9vbk9wYXF1ZVRpbGU6cixfaW5pdENvbnRhaW5lcjpmdW5jdGlvbigpe3RoaXMuX2NvbnRhaW5lcnx8KHRoaXMuX2NvbnRhaW5lcj1odCgiZGl2IiwibGVhZmxldC1sYXllciAiKyh0aGlzLm9wdGlvbnMuY2xhc3NOYW1lfHwiIikpLHRoaXMuX3VwZGF0ZVpJbmRleCgpLHRoaXMub3B0aW9ucy5vcGFjaXR5PDEmJnRoaXMuX3VwZGF0ZU9wYWNpdHkoKSx0aGlzLmdldFBhbmUoKS5hcHBlbmRDaGlsZCh0aGlzLl9jb250YWluZXIpKX0sX3VwZGF0ZUxldmVsczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3RpbGVab29tLGk9dGhpcy5vcHRpb25zLm1heFpvb207aWYodm9pZCAwIT09dCl7Zm9yKHZhciBlIGluIHRoaXMuX2xldmVscyl0aGlzLl9sZXZlbHNbZV0uZWwuY2hpbGRyZW4ubGVuZ3RofHxlPT09dD8odGhpcy5fbGV2ZWxzW2VdLmVsLnN0eWxlLnpJbmRleD1pLU1hdGguYWJzKHQtZSksdGhpcy5fb25VcGRhdGVMZXZlbChlKSk6KHV0KHRoaXMuX2xldmVsc1tlXS5lbCksdGhpcy5fcmVtb3ZlVGlsZXNBdFpvb20oZSksdGhpcy5fb25SZW1vdmVMZXZlbChlKSxkZWxldGUgdGhpcy5fbGV2ZWxzW2VdKTt2YXIgbj10aGlzLl9sZXZlbHNbdF0sbz10aGlzLl9tYXA7cmV0dXJuIG58fCgobj10aGlzLl9sZXZlbHNbdF09e30pLmVsPWh0KCJkaXYiLCJsZWFmbGV0LXRpbGUtY29udGFpbmVyIGxlYWZsZXQtem9vbS1hbmltYXRlZCIsdGhpcy5fY29udGFpbmVyKSxuLmVsLnN0eWxlLnpJbmRleD1pLG4ub3JpZ2luPW8ucHJvamVjdChvLnVucHJvamVjdChvLmdldFBpeGVsT3JpZ2luKCkpLHQpLnJvdW5kKCksbi56b29tPXQsdGhpcy5fc2V0Wm9vbVRyYW5zZm9ybShuLG8uZ2V0Q2VudGVyKCksby5nZXRab29tKCkpLG4uZWwub2Zmc2V0V2lkdGgsdGhpcy5fb25DcmVhdGVMZXZlbChuKSksdGhpcy5fbGV2ZWw9bixufX0sX29uVXBkYXRlTGV2ZWw6cixfb25SZW1vdmVMZXZlbDpyLF9vbkNyZWF0ZUxldmVsOnIsX3BydW5lVGlsZXM6ZnVuY3Rpb24oKXtpZih0aGlzLl9tYXApe3ZhciB0LGksZT10aGlzLl9tYXAuZ2V0Wm9vbSgpO2lmKGU+dGhpcy5vcHRpb25zLm1heFpvb218fGU8dGhpcy5vcHRpb25zLm1pblpvb20pdGhpcy5fcmVtb3ZlQWxsVGlsZXMoKTtlbHNle2Zvcih0IGluIHRoaXMuX3RpbGVzKShpPXRoaXMuX3RpbGVzW3RdKS5yZXRhaW49aS5jdXJyZW50O2Zvcih0IGluIHRoaXMuX3RpbGVzKWlmKChpPXRoaXMuX3RpbGVzW3RdKS5jdXJyZW50JiYhaS5hY3RpdmUpe3ZhciBuPWkuY29vcmRzO3RoaXMuX3JldGFpblBhcmVudChuLngsbi55LG4ueixuLnotNSl8fHRoaXMuX3JldGFpbkNoaWxkcmVuKG4ueCxuLnksbi56LG4ueisyKX1mb3IodCBpbiB0aGlzLl90aWxlcyl0aGlzLl90aWxlc1t0XS5yZXRhaW58fHRoaXMuX3JlbW92ZVRpbGUodCl9fX0sX3JlbW92ZVRpbGVzQXRab29tOmZ1bmN0aW9uKHQpe2Zvcih2YXIgaSBpbiB0aGlzLl90aWxlcyl0aGlzLl90aWxlc1tpXS5jb29yZHMuej09PXQmJnRoaXMuX3JlbW92ZVRpbGUoaSl9LF9yZW1vdmVBbGxUaWxlczpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl90aWxlcyl0aGlzLl9yZW1vdmVUaWxlKHQpfSxfaW52YWxpZGF0ZUFsbDpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl9sZXZlbHMpdXQodGhpcy5fbGV2ZWxzW3RdLmVsKSx0aGlzLl9vblJlbW92ZUxldmVsKHQpLGRlbGV0ZSB0aGlzLl9sZXZlbHNbdF07dGhpcy5fcmVtb3ZlQWxsVGlsZXMoKSx0aGlzLl90aWxlWm9vbT12b2lkIDB9LF9yZXRhaW5QYXJlbnQ6ZnVuY3Rpb24odCxpLGUsbil7dmFyIG89TWF0aC5mbG9vcih0LzIpLHM9TWF0aC5mbG9vcihpLzIpLHI9ZS0xLGE9bmV3IHgoK28sK3MpO2Euej0rcjt2YXIgaD10aGlzLl90aWxlQ29vcmRzVG9LZXkoYSksdT10aGlzLl90aWxlc1toXTtyZXR1cm4gdSYmdS5hY3RpdmU/KHUucmV0YWluPSEwLCEwKToodSYmdS5sb2FkZWQmJih1LnJldGFpbj0hMCkscj5uJiZ0aGlzLl9yZXRhaW5QYXJlbnQobyxzLHIsbikpfSxfcmV0YWluQ2hpbGRyZW46ZnVuY3Rpb24odCxpLGUsbil7Zm9yKHZhciBvPTIqdDtvPDIqdCsyO28rKylmb3IodmFyIHM9MippO3M8MippKzI7cysrKXt2YXIgcj1uZXcgeChvLHMpO3Iuej1lKzE7dmFyIGE9dGhpcy5fdGlsZUNvb3Jkc1RvS2V5KHIpLGg9dGhpcy5fdGlsZXNbYV07aCYmaC5hY3RpdmU/aC5yZXRhaW49ITA6KGgmJmgubG9hZGVkJiYoaC5yZXRhaW49ITApLGUrMTxuJiZ0aGlzLl9yZXRhaW5DaGlsZHJlbihvLHMsZSsxLG4pKX19LF9yZXNldFZpZXc6ZnVuY3Rpb24odCl7dmFyIGk9dCYmKHQucGluY2h8fHQuZmx5VG8pO3RoaXMuX3NldFZpZXcodGhpcy5fbWFwLmdldENlbnRlcigpLHRoaXMuX21hcC5nZXRab29tKCksaSxpKX0sX2FuaW1hdGVab29tOmZ1bmN0aW9uKHQpe3RoaXMuX3NldFZpZXcodC5jZW50ZXIsdC56b29tLCEwLHQubm9VcGRhdGUpfSxfY2xhbXBab29tOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucztyZXR1cm4gdm9pZCAwIT09aS5taW5OYXRpdmVab29tJiZ0PGkubWluTmF0aXZlWm9vbT9pLm1pbk5hdGl2ZVpvb206dm9pZCAwIT09aS5tYXhOYXRpdmVab29tJiZpLm1heE5hdGl2ZVpvb208dD9pLm1heE5hdGl2ZVpvb206dH0sX3NldFZpZXc6ZnVuY3Rpb24odCxpLGUsbil7dmFyIG89dGhpcy5fY2xhbXBab29tKE1hdGgucm91bmQoaSkpOyh2b2lkIDAhPT10aGlzLm9wdGlvbnMubWF4Wm9vbSYmbz50aGlzLm9wdGlvbnMubWF4Wm9vbXx8dm9pZCAwIT09dGhpcy5vcHRpb25zLm1pblpvb20mJm88dGhpcy5vcHRpb25zLm1pblpvb20pJiYobz12b2lkIDApO3ZhciBzPXRoaXMub3B0aW9ucy51cGRhdGVXaGVuWm9vbWluZyYmbyE9PXRoaXMuX3RpbGVab29tO24mJiFzfHwodGhpcy5fdGlsZVpvb209byx0aGlzLl9hYm9ydExvYWRpbmcmJnRoaXMuX2Fib3J0TG9hZGluZygpLHRoaXMuX3VwZGF0ZUxldmVscygpLHRoaXMuX3Jlc2V0R3JpZCgpLHZvaWQgMCE9PW8mJnRoaXMuX3VwZGF0ZSh0KSxlfHx0aGlzLl9wcnVuZVRpbGVzKCksdGhpcy5fbm9QcnVuZT0hIWUpLHRoaXMuX3NldFpvb21UcmFuc2Zvcm1zKHQsaSl9LF9zZXRab29tVHJhbnNmb3JtczpmdW5jdGlvbih0LGkpe2Zvcih2YXIgZSBpbiB0aGlzLl9sZXZlbHMpdGhpcy5fc2V0Wm9vbVRyYW5zZm9ybSh0aGlzLl9sZXZlbHNbZV0sdCxpKX0sX3NldFpvb21UcmFuc2Zvcm06ZnVuY3Rpb24odCxpLGUpe3ZhciBuPXRoaXMuX21hcC5nZXRab29tU2NhbGUoZSx0Lnpvb20pLG89dC5vcmlnaW4ubXVsdGlwbHlCeShuKS5zdWJ0cmFjdCh0aGlzLl9tYXAuX2dldE5ld1BpeGVsT3JpZ2luKGksZSkpLnJvdW5kKCk7Tmk/d3QodC5lbCxvLG4pOkx0KHQuZWwsbyl9LF9yZXNldEdyaWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAsaT10Lm9wdGlvbnMuY3JzLGU9dGhpcy5fdGlsZVNpemU9dGhpcy5nZXRUaWxlU2l6ZSgpLG49dGhpcy5fdGlsZVpvb20sbz10aGlzLl9tYXAuZ2V0UGl4ZWxXb3JsZEJvdW5kcyh0aGlzLl90aWxlWm9vbSk7byYmKHRoaXMuX2dsb2JhbFRpbGVSYW5nZT10aGlzLl9weEJvdW5kc1RvVGlsZVJhbmdlKG8pKSx0aGlzLl93cmFwWD1pLndyYXBMbmcmJiF0aGlzLm9wdGlvbnMubm9XcmFwJiZbTWF0aC5mbG9vcih0LnByb2plY3QoWzAsaS53cmFwTG5nWzBdXSxuKS54L2UueCksTWF0aC5jZWlsKHQucHJvamVjdChbMCxpLndyYXBMbmdbMV1dLG4pLngvZS55KV0sdGhpcy5fd3JhcFk9aS53cmFwTGF0JiYhdGhpcy5vcHRpb25zLm5vV3JhcCYmW01hdGguZmxvb3IodC5wcm9qZWN0KFtpLndyYXBMYXRbMF0sMF0sbikueS9lLngpLE1hdGguY2VpbCh0LnByb2plY3QoW2kud3JhcExhdFsxXSwwXSxuKS55L2UueSldfSxfb25Nb3ZlRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiYhdGhpcy5fbWFwLl9hbmltYXRpbmdab29tJiZ0aGlzLl91cGRhdGUoKX0sX2dldFRpbGVkUGl4ZWxCb3VuZHM6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFwLGU9aS5fYW5pbWF0aW5nWm9vbT9NYXRoLm1heChpLl9hbmltYXRlVG9ab29tLGkuZ2V0Wm9vbSgpKTppLmdldFpvb20oKSxuPWkuZ2V0Wm9vbVNjYWxlKGUsdGhpcy5fdGlsZVpvb20pLG89aS5wcm9qZWN0KHQsdGhpcy5fdGlsZVpvb20pLmZsb29yKCkscz1pLmdldFNpemUoKS5kaXZpZGVCeSgyKm4pO3JldHVybiBuZXcgUChvLnN1YnRyYWN0KHMpLG8uYWRkKHMpKX0sX3VwZGF0ZTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9tYXA7aWYoaSl7dmFyIGU9dGhpcy5fY2xhbXBab29tKGkuZ2V0Wm9vbSgpKTtpZih2b2lkIDA9PT10JiYodD1pLmdldENlbnRlcigpKSx2b2lkIDAhPT10aGlzLl90aWxlWm9vbSl7dmFyIG49dGhpcy5fZ2V0VGlsZWRQaXhlbEJvdW5kcyh0KSxvPXRoaXMuX3B4Qm91bmRzVG9UaWxlUmFuZ2Uobikscz1vLmdldENlbnRlcigpLHI9W10sYT10aGlzLm9wdGlvbnMua2VlcEJ1ZmZlcixoPW5ldyBQKG8uZ2V0Qm90dG9tTGVmdCgpLnN1YnRyYWN0KFthLC1hXSksby5nZXRUb3BSaWdodCgpLmFkZChbYSwtYV0pKTtpZighKGlzRmluaXRlKG8ubWluLngpJiZpc0Zpbml0ZShvLm1pbi55KSYmaXNGaW5pdGUoby5tYXgueCkmJmlzRmluaXRlKG8ubWF4LnkpKSl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRlZCB0byBsb2FkIGFuIGluZmluaXRlIG51bWJlciBvZiB0aWxlcyIpO2Zvcih2YXIgdSBpbiB0aGlzLl90aWxlcyl7dmFyIGw9dGhpcy5fdGlsZXNbdV0uY29vcmRzO2wuej09PXRoaXMuX3RpbGVab29tJiZoLmNvbnRhaW5zKG5ldyB4KGwueCxsLnkpKXx8KHRoaXMuX3RpbGVzW3VdLmN1cnJlbnQ9ITEpfWlmKE1hdGguYWJzKGUtdGhpcy5fdGlsZVpvb20pPjEpdGhpcy5fc2V0Vmlldyh0LGUpO2Vsc2V7Zm9yKHZhciBjPW8ubWluLnk7Yzw9by5tYXgueTtjKyspZm9yKHZhciBfPW8ubWluLng7Xzw9by5tYXgueDtfKyspe3ZhciBkPW5ldyB4KF8sYyk7aWYoZC56PXRoaXMuX3RpbGVab29tLHRoaXMuX2lzVmFsaWRUaWxlKGQpKXt2YXIgcD10aGlzLl90aWxlc1t0aGlzLl90aWxlQ29vcmRzVG9LZXkoZCldO3A/cC5jdXJyZW50PSEwOnIucHVzaChkKX19aWYoci5zb3J0KGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHQuZGlzdGFuY2VUbyhzKS1pLmRpc3RhbmNlVG8ocyl9KSwwIT09ci5sZW5ndGgpe3RoaXMuX2xvYWRpbmd8fCh0aGlzLl9sb2FkaW5nPSEwLHRoaXMuZmlyZSgibG9hZGluZyIpKTt2YXIgbT1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Zm9yKF89MDtfPHIubGVuZ3RoO18rKyl0aGlzLl9hZGRUaWxlKHJbX10sbSk7dGhpcy5fbGV2ZWwuZWwuYXBwZW5kQ2hpbGQobSl9fX19fSxfaXNWYWxpZFRpbGU6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFwLm9wdGlvbnMuY3JzO2lmKCFpLmluZmluaXRlKXt2YXIgZT10aGlzLl9nbG9iYWxUaWxlUmFuZ2U7aWYoIWkud3JhcExuZyYmKHQueDxlLm1pbi54fHx0Lng+ZS5tYXgueCl8fCFpLndyYXBMYXQmJih0Lnk8ZS5taW4ueXx8dC55PmUubWF4LnkpKXJldHVybiExfWlmKCF0aGlzLm9wdGlvbnMuYm91bmRzKXJldHVybiEwO3ZhciBuPXRoaXMuX3RpbGVDb29yZHNUb0JvdW5kcyh0KTtyZXR1cm4geih0aGlzLm9wdGlvbnMuYm91bmRzKS5vdmVybGFwcyhuKX0sX2tleVRvQm91bmRzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl90aWxlQ29vcmRzVG9Cb3VuZHModGhpcy5fa2V5VG9UaWxlQ29vcmRzKHQpKX0sX3RpbGVDb29yZHNUb053U2U6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFwLGU9dGhpcy5nZXRUaWxlU2l6ZSgpLG49dC5zY2FsZUJ5KGUpLG89bi5hZGQoZSk7cmV0dXJuW2kudW5wcm9qZWN0KG4sdC56KSxpLnVucHJvamVjdChvLHQueildfSxfdGlsZUNvb3Jkc1RvQm91bmRzOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX3RpbGVDb29yZHNUb053U2UodCksZT1uZXcgVChpWzBdLGlbMV0pO3JldHVybiB0aGlzLm9wdGlvbnMubm9XcmFwfHwoZT10aGlzLl9tYXAud3JhcExhdExuZ0JvdW5kcyhlKSksZX0sX3RpbGVDb29yZHNUb0tleTpmdW5jdGlvbih0KXtyZXR1cm4gdC54KyI6Iit0LnkrIjoiK3Quen0sX2tleVRvVGlsZUNvb3JkczpmdW5jdGlvbih0KXt2YXIgaT10LnNwbGl0KCI6IiksZT1uZXcgeCgraVswXSwraVsxXSk7cmV0dXJuIGUuej0raVsyXSxlfSxfcmVtb3ZlVGlsZTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl90aWxlc1t0XTtpJiYoQ2l8fGkuZWwuc2V0QXR0cmlidXRlKCJzcmMiLG5pKSx1dChpLmVsKSxkZWxldGUgdGhpcy5fdGlsZXNbdF0sdGhpcy5maXJlKCJ0aWxldW5sb2FkIix7dGlsZTppLmVsLGNvb3Jkczp0aGlzLl9rZXlUb1RpbGVDb29yZHModCl9KSl9LF9pbml0VGlsZTpmdW5jdGlvbih0KXtwdCh0LCJsZWFmbGV0LXRpbGUiKTt2YXIgaT10aGlzLmdldFRpbGVTaXplKCk7dC5zdHlsZS53aWR0aD1pLngrInB4Iix0LnN0eWxlLmhlaWdodD1pLnkrInB4Iix0Lm9uc2VsZWN0c3RhcnQ9cix0Lm9ubW91c2Vtb3ZlPXIsTGkmJnRoaXMub3B0aW9ucy5vcGFjaXR5PDEmJnZ0KHQsdGhpcy5vcHRpb25zLm9wYWNpdHkpLFRpJiYhemkmJih0LnN0eWxlLldlYmtpdEJhY2tmYWNlVmlzaWJpbGl0eT0iaGlkZGVuIil9LF9hZGRUaWxlOmZ1bmN0aW9uKHQsaSl7dmFyIG49dGhpcy5fZ2V0VGlsZVBvcyh0KSxvPXRoaXMuX3RpbGVDb29yZHNUb0tleSh0KSxzPXRoaXMuY3JlYXRlVGlsZSh0aGlzLl93cmFwQ29vcmRzKHQpLGUodGhpcy5fdGlsZVJlYWR5LHRoaXMsdCkpO3RoaXMuX2luaXRUaWxlKHMpLHRoaXMuY3JlYXRlVGlsZS5sZW5ndGg8MiYmZihlKHRoaXMuX3RpbGVSZWFkeSx0aGlzLHQsbnVsbCxzKSksTHQocyxuKSx0aGlzLl90aWxlc1tvXT17ZWw6cyxjb29yZHM6dCxjdXJyZW50OiEwfSxpLmFwcGVuZENoaWxkKHMpLHRoaXMuZmlyZSgidGlsZWxvYWRzdGFydCIse3RpbGU6cyxjb29yZHM6dH0pfSxfdGlsZVJlYWR5OmZ1bmN0aW9uKHQsaSxuKXtpZih0aGlzLl9tYXApe2kmJnRoaXMuZmlyZSgidGlsZWVycm9yIix7ZXJyb3I6aSx0aWxlOm4sY29vcmRzOnR9KTt2YXIgbz10aGlzLl90aWxlQ29vcmRzVG9LZXkodCk7KG49dGhpcy5fdGlsZXNbb10pJiYobi5sb2FkZWQ9K25ldyBEYXRlLHRoaXMuX21hcC5fZmFkZUFuaW1hdGVkPyh2dChuLmVsLDApLGcodGhpcy5fZmFkZUZyYW1lKSx0aGlzLl9mYWRlRnJhbWU9Zih0aGlzLl91cGRhdGVPcGFjaXR5LHRoaXMpKToobi5hY3RpdmU9ITAsdGhpcy5fcHJ1bmVUaWxlcygpKSxpfHwocHQobi5lbCwibGVhZmxldC10aWxlLWxvYWRlZCIpLHRoaXMuZmlyZSgidGlsZWxvYWQiLHt0aWxlOm4uZWwsY29vcmRzOnR9KSksdGhpcy5fbm9UaWxlc1RvTG9hZCgpJiYodGhpcy5fbG9hZGluZz0hMSx0aGlzLmZpcmUoImxvYWQiKSxMaXx8IXRoaXMuX21hcC5fZmFkZUFuaW1hdGVkP2YodGhpcy5fcHJ1bmVUaWxlcyx0aGlzKTpzZXRUaW1lb3V0KGUodGhpcy5fcHJ1bmVUaWxlcyx0aGlzKSwyNTApKSl9fSxfZ2V0VGlsZVBvczpmdW5jdGlvbih0KXtyZXR1cm4gdC5zY2FsZUJ5KHRoaXMuZ2V0VGlsZVNpemUoKSkuc3VidHJhY3QodGhpcy5fbGV2ZWwub3JpZ2luKX0sX3dyYXBDb29yZHM6ZnVuY3Rpb24odCl7dmFyIGk9bmV3IHgodGhpcy5fd3JhcFg/cyh0LngsdGhpcy5fd3JhcFgpOnQueCx0aGlzLl93cmFwWT9zKHQueSx0aGlzLl93cmFwWSk6dC55KTtyZXR1cm4gaS56PXQueixpfSxfcHhCb3VuZHNUb1RpbGVSYW5nZTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLmdldFRpbGVTaXplKCk7cmV0dXJuIG5ldyBQKHQubWluLnVuc2NhbGVCeShpKS5mbG9vcigpLHQubWF4LnVuc2NhbGVCeShpKS5jZWlsKCkuc3VidHJhY3QoWzEsMV0pKX0sX25vVGlsZXNUb0xvYWQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fdGlsZXMpaWYoIXRoaXMuX3RpbGVzW3RdLmxvYWRlZClyZXR1cm4hMTtyZXR1cm4hMH19KSxkbj1fbi5leHRlbmQoe29wdGlvbnM6e21pblpvb206MCxtYXhab29tOjE4LHN1YmRvbWFpbnM6ImFiYyIsZXJyb3JUaWxlVXJsOiIiLHpvb21PZmZzZXQ6MCx0bXM6ITEsem9vbVJldmVyc2U6ITEsZGV0ZWN0UmV0aW5hOiExLGNyb3NzT3JpZ2luOiExfSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsaSl7dGhpcy5fdXJsPXQsKGk9bCh0aGlzLGkpKS5kZXRlY3RSZXRpbmEmJktpJiZpLm1heFpvb20+MCYmKGkudGlsZVNpemU9TWF0aC5mbG9vcihpLnRpbGVTaXplLzIpLGkuem9vbVJldmVyc2U/KGkuem9vbU9mZnNldC0tLGkubWluWm9vbSsrKTooaS56b29tT2Zmc2V0KyssaS5tYXhab29tLS0pLGkubWluWm9vbT1NYXRoLm1heCgwLGkubWluWm9vbSkpLCJzdHJpbmciPT10eXBlb2YgaS5zdWJkb21haW5zJiYoaS5zdWJkb21haW5zPWkuc3ViZG9tYWlucy5zcGxpdCgiIikpLFRpfHx0aGlzLm9uKCJ0aWxldW5sb2FkIix0aGlzLl9vblRpbGVSZW1vdmUpfSxzZXRVcmw6ZnVuY3Rpb24odCxpKXtyZXR1cm4gdGhpcy5fdXJsPXQsaXx8dGhpcy5yZWRyYXcoKSx0aGlzfSxjcmVhdGVUaWxlOmZ1bmN0aW9uKHQsaSl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7cmV0dXJuIFYobiwibG9hZCIsZSh0aGlzLl90aWxlT25Mb2FkLHRoaXMsaSxuKSksVihuLCJlcnJvciIsZSh0aGlzLl90aWxlT25FcnJvcix0aGlzLGksbikpLHRoaXMub3B0aW9ucy5jcm9zc09yaWdpbiYmKG4uY3Jvc3NPcmlnaW49IiIpLG4uYWx0PSIiLG4uc2V0QXR0cmlidXRlKCJyb2xlIiwicHJlc2VudGF0aW9uIiksbi5zcmM9dGhpcy5nZXRUaWxlVXJsKHQpLG59LGdldFRpbGVVcmw6ZnVuY3Rpb24odCl7dmFyIGU9e3I6S2k/IkAyeCI6IiIsczp0aGlzLl9nZXRTdWJkb21haW4odCkseDp0LngseTp0Lnksejp0aGlzLl9nZXRab29tRm9yVXJsKCl9O2lmKHRoaXMuX21hcCYmIXRoaXMuX21hcC5vcHRpb25zLmNycy5pbmZpbml0ZSl7dmFyIG49dGhpcy5fZ2xvYmFsVGlsZVJhbmdlLm1heC55LXQueTt0aGlzLm9wdGlvbnMudG1zJiYoZS55PW4pLGVbIi15Il09bn1yZXR1cm4gXyh0aGlzLl91cmwsaShlLHRoaXMub3B0aW9ucykpfSxfdGlsZU9uTG9hZDpmdW5jdGlvbih0LGkpe0xpP3NldFRpbWVvdXQoZSh0LHRoaXMsbnVsbCxpKSwwKTp0KG51bGwsaSl9LF90aWxlT25FcnJvcjpmdW5jdGlvbih0LGksZSl7dmFyIG49dGhpcy5vcHRpb25zLmVycm9yVGlsZVVybDtuJiZpLmdldEF0dHJpYnV0ZSgic3JjIikhPT1uJiYoaS5zcmM9biksdChlLGkpfSxfb25UaWxlUmVtb3ZlOmZ1bmN0aW9uKHQpe3QudGlsZS5vbmxvYWQ9bnVsbH0sX2dldFpvb21Gb3JVcmw6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl90aWxlWm9vbSxpPXRoaXMub3B0aW9ucy5tYXhab29tLGU9dGhpcy5vcHRpb25zLnpvb21SZXZlcnNlLG49dGhpcy5vcHRpb25zLnpvb21PZmZzZXQ7cmV0dXJuIGUmJih0PWktdCksdCtufSxfZ2V0U3ViZG9tYWluOmZ1bmN0aW9uKHQpe3ZhciBpPU1hdGguYWJzKHQueCt0LnkpJXRoaXMub3B0aW9ucy5zdWJkb21haW5zLmxlbmd0aDtyZXR1cm4gdGhpcy5vcHRpb25zLnN1YmRvbWFpbnNbaV19LF9hYm9ydExvYWRpbmc6ZnVuY3Rpb24oKXt2YXIgdCxpO2Zvcih0IGluIHRoaXMuX3RpbGVzKXRoaXMuX3RpbGVzW3RdLmNvb3Jkcy56IT09dGhpcy5fdGlsZVpvb20mJigoaT10aGlzLl90aWxlc1t0XS5lbCkub25sb2FkPXIsaS5vbmVycm9yPXIsaS5jb21wbGV0ZXx8KGkuc3JjPW5pLHV0KGkpLGRlbGV0ZSB0aGlzLl90aWxlc1t0XSkpfX0pLHBuPWRuLmV4dGVuZCh7ZGVmYXVsdFdtc1BhcmFtczp7c2VydmljZToiV01TIixyZXF1ZXN0OiJHZXRNYXAiLGxheWVyczoiIixzdHlsZXM6IiIsZm9ybWF0OiJpbWFnZS9qcGVnIix0cmFuc3BhcmVudDohMSx2ZXJzaW9uOiIxLjEuMSJ9LG9wdGlvbnM6e2NyczpudWxsLHVwcGVyY2FzZTohMX0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe3RoaXMuX3VybD10O3ZhciBuPWkoe30sdGhpcy5kZWZhdWx0V21zUGFyYW1zKTtmb3IodmFyIG8gaW4gZSlvIGluIHRoaXMub3B0aW9uc3x8KG5bb109ZVtvXSk7dmFyIHM9KGU9bCh0aGlzLGUpKS5kZXRlY3RSZXRpbmEmJktpPzI6MSxyPXRoaXMuZ2V0VGlsZVNpemUoKTtuLndpZHRoPXIueCpzLG4uaGVpZ2h0PXIueSpzLHRoaXMud21zUGFyYW1zPW59LG9uQWRkOmZ1bmN0aW9uKHQpe3RoaXMuX2Nycz10aGlzLm9wdGlvbnMuY3JzfHx0Lm9wdGlvbnMuY3JzLHRoaXMuX3dtc1ZlcnNpb249cGFyc2VGbG9hdCh0aGlzLndtc1BhcmFtcy52ZXJzaW9uKTt2YXIgaT10aGlzLl93bXNWZXJzaW9uPj0xLjM/ImNycyI6InNycyI7dGhpcy53bXNQYXJhbXNbaV09dGhpcy5fY3JzLmNvZGUsZG4ucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcyx0KX0sZ2V0VGlsZVVybDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl90aWxlQ29vcmRzVG9Od1NlKHQpLGU9dGhpcy5fY3JzLG49YihlLnByb2plY3QoaVswXSksZS5wcm9qZWN0KGlbMV0pKSxvPW4ubWluLHM9bi5tYXgscj0odGhpcy5fd21zVmVyc2lvbj49MS4zJiZ0aGlzLl9jcnM9PT1IZT9bby55LG8ueCxzLnkscy54XTpbby54LG8ueSxzLngscy55XSkuam9pbigiLCIpLGE9TC5UaWxlTGF5ZXIucHJvdG90eXBlLmdldFRpbGVVcmwuY2FsbCh0aGlzLHQpO3JldHVybiBhK2ModGhpcy53bXNQYXJhbXMsYSx0aGlzLm9wdGlvbnMudXBwZXJjYXNlKSsodGhpcy5vcHRpb25zLnVwcGVyY2FzZT8iJkJCT1g9IjoiJmJib3g9Iikrcn0sc2V0UGFyYW1zOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkodGhpcy53bXNQYXJhbXMsdCksZXx8dGhpcy5yZWRyYXcoKSx0aGlzfX0pO2RuLldNUz1wbixZdC53bXM9ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IHBuKHQsaSl9O3ZhciBtbj1VZS5leHRlbmQoe29wdGlvbnM6e3BhZGRpbmc6LjEsdG9sZXJhbmNlOjB9LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7bCh0aGlzLHQpLG4odGhpcyksdGhpcy5fbGF5ZXJzPXRoaXMuX2xheWVyc3x8e319LG9uQWRkOmZ1bmN0aW9uKCl7dGhpcy5fY29udGFpbmVyfHwodGhpcy5faW5pdENvbnRhaW5lcigpLHRoaXMuX3pvb21BbmltYXRlZCYmcHQodGhpcy5fY29udGFpbmVyLCJsZWFmbGV0LXpvb20tYW5pbWF0ZWQiKSksdGhpcy5nZXRQYW5lKCkuYXBwZW5kQ2hpbGQodGhpcy5fY29udGFpbmVyKSx0aGlzLl91cGRhdGUoKSx0aGlzLm9uKCJ1cGRhdGUiLHRoaXMuX3VwZGF0ZVBhdGhzLHRoaXMpfSxvblJlbW92ZTpmdW5jdGlvbigpe3RoaXMub2ZmKCJ1cGRhdGUiLHRoaXMuX3VwZGF0ZVBhdGhzLHRoaXMpLHRoaXMuX2Rlc3Ryb3lDb250YWluZXIoKX0sZ2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9e3ZpZXdyZXNldDp0aGlzLl9yZXNldCx6b29tOnRoaXMuX29uWm9vbSxtb3ZlZW5kOnRoaXMuX3VwZGF0ZSx6b29tZW5kOnRoaXMuX29uWm9vbUVuZH07cmV0dXJuIHRoaXMuX3pvb21BbmltYXRlZCYmKHQuem9vbWFuaW09dGhpcy5fb25BbmltWm9vbSksdH0sX29uQW5pbVpvb206ZnVuY3Rpb24odCl7dGhpcy5fdXBkYXRlVHJhbnNmb3JtKHQuY2VudGVyLHQuem9vbSl9LF9vblpvb206ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVUcmFuc2Zvcm0odGhpcy5fbWFwLmdldENlbnRlcigpLHRoaXMuX21hcC5nZXRab29tKCkpfSxfdXBkYXRlVHJhbnNmb3JtOmZ1bmN0aW9uKHQsaSl7dmFyIGU9dGhpcy5fbWFwLmdldFpvb21TY2FsZShpLHRoaXMuX3pvb20pLG49UHQodGhpcy5fY29udGFpbmVyKSxvPXRoaXMuX21hcC5nZXRTaXplKCkubXVsdGlwbHlCeSguNSt0aGlzLm9wdGlvbnMucGFkZGluZykscz10aGlzLl9tYXAucHJvamVjdCh0aGlzLl9jZW50ZXIsaSkscj10aGlzLl9tYXAucHJvamVjdCh0LGkpLnN1YnRyYWN0KHMpLGE9by5tdWx0aXBseUJ5KC1lKS5hZGQobikuYWRkKG8pLnN1YnRyYWN0KHIpO05pP3d0KHRoaXMuX2NvbnRhaW5lcixhLGUpOkx0KHRoaXMuX2NvbnRhaW5lcixhKX0sX3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlKCksdGhpcy5fdXBkYXRlVHJhbnNmb3JtKHRoaXMuX2NlbnRlcix0aGlzLl96b29tKTtmb3IodmFyIHQgaW4gdGhpcy5fbGF5ZXJzKXRoaXMuX2xheWVyc1t0XS5fcmVzZXQoKX0sX29uWm9vbUVuZDpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl9sYXllcnMpdGhpcy5fbGF5ZXJzW3RdLl9wcm9qZWN0KCl9LF91cGRhdGVQYXRoczpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl9sYXllcnMpdGhpcy5fbGF5ZXJzW3RdLl91cGRhdGUoKX0sX3VwZGF0ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5wYWRkaW5nLGk9dGhpcy5fbWFwLmdldFNpemUoKSxlPXRoaXMuX21hcC5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludChpLm11bHRpcGx5QnkoLXQpKS5yb3VuZCgpO3RoaXMuX2JvdW5kcz1uZXcgUChlLGUuYWRkKGkubXVsdGlwbHlCeSgxKzIqdCkpLnJvdW5kKCkpLHRoaXMuX2NlbnRlcj10aGlzLl9tYXAuZ2V0Q2VudGVyKCksdGhpcy5fem9vbT10aGlzLl9tYXAuZ2V0Wm9vbSgpfX0pLGZuPW1uLmV4dGVuZCh7Z2V0RXZlbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9bW4ucHJvdG90eXBlLmdldEV2ZW50cy5jYWxsKHRoaXMpO3JldHVybiB0LnZpZXdwcmVyZXNldD10aGlzLl9vblZpZXdQcmVSZXNldCx0fSxfb25WaWV3UHJlUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9wb3N0cG9uZVVwZGF0ZVBhdGhzPSEwfSxvbkFkZDpmdW5jdGlvbigpe21uLnByb3RvdHlwZS5vbkFkZC5jYWxsKHRoaXMpLHRoaXMuX2RyYXcoKX0sX2luaXRDb250YWluZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7Vih0LCJtb3VzZW1vdmUiLG8odGhpcy5fb25Nb3VzZU1vdmUsMzIsdGhpcyksdGhpcyksVih0LCJjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBjb250ZXh0bWVudSIsdGhpcy5fb25DbGljayx0aGlzKSxWKHQsIm1vdXNlb3V0Iix0aGlzLl9oYW5kbGVNb3VzZU91dCx0aGlzKSx0aGlzLl9jdHg9dC5nZXRDb250ZXh0KCIyZCIpfSxfZGVzdHJveUNvbnRhaW5lcjpmdW5jdGlvbigpe2RlbGV0ZSB0aGlzLl9jdHgsdXQodGhpcy5fY29udGFpbmVyKSxxKHRoaXMuX2NvbnRhaW5lciksZGVsZXRlIHRoaXMuX2NvbnRhaW5lcn0sX3VwZGF0ZVBhdGhzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX3Bvc3Rwb25lVXBkYXRlUGF0aHMpe3RoaXMuX3JlZHJhd0JvdW5kcz1udWxsO2Zvcih2YXIgdCBpbiB0aGlzLl9sYXllcnMpdGhpcy5fbGF5ZXJzW3RdLl91cGRhdGUoKTt0aGlzLl9yZWRyYXcoKX19LF91cGRhdGU6ZnVuY3Rpb24oKXtpZighdGhpcy5fbWFwLl9hbmltYXRpbmdab29tfHwhdGhpcy5fYm91bmRzKXt0aGlzLl9kcmF3bkxheWVycz17fSxtbi5wcm90b3R5cGUuX3VwZGF0ZS5jYWxsKHRoaXMpO3ZhciB0PXRoaXMuX2JvdW5kcyxpPXRoaXMuX2NvbnRhaW5lcixlPXQuZ2V0U2l6ZSgpLG49S2k/MjoxO0x0KGksdC5taW4pLGkud2lkdGg9biplLngsaS5oZWlnaHQ9biplLnksaS5zdHlsZS53aWR0aD1lLngrInB4IixpLnN0eWxlLmhlaWdodD1lLnkrInB4IixLaSYmdGhpcy5fY3R4LnNjYWxlKDIsMiksdGhpcy5fY3R4LnRyYW5zbGF0ZSgtdC5taW4ueCwtdC5taW4ueSksdGhpcy5maXJlKCJ1cGRhdGUiKX19LF9yZXNldDpmdW5jdGlvbigpe21uLnByb3RvdHlwZS5fcmVzZXQuY2FsbCh0aGlzKSx0aGlzLl9wb3N0cG9uZVVwZGF0ZVBhdGhzJiYodGhpcy5fcG9zdHBvbmVVcGRhdGVQYXRocz0hMSx0aGlzLl91cGRhdGVQYXRocygpKX0sX2luaXRQYXRoOmZ1bmN0aW9uKHQpe3RoaXMuX3VwZGF0ZURhc2hBcnJheSh0KSx0aGlzLl9sYXllcnNbbih0KV09dDt2YXIgaT10Ll9vcmRlcj17bGF5ZXI6dCxwcmV2OnRoaXMuX2RyYXdMYXN0LG5leHQ6bnVsbH07dGhpcy5fZHJhd0xhc3QmJih0aGlzLl9kcmF3TGFzdC5uZXh0PWkpLHRoaXMuX2RyYXdMYXN0PWksdGhpcy5fZHJhd0ZpcnN0PXRoaXMuX2RyYXdGaXJzdHx8dGhpcy5fZHJhd0xhc3R9LF9hZGRQYXRoOmZ1bmN0aW9uKHQpe3RoaXMuX3JlcXVlc3RSZWRyYXcodCl9LF9yZW1vdmVQYXRoOmZ1bmN0aW9uKHQpe3ZhciBpPXQuX29yZGVyLGU9aS5uZXh0LG49aS5wcmV2O2U/ZS5wcmV2PW46dGhpcy5fZHJhd0xhc3Q9bixuP24ubmV4dD1lOnRoaXMuX2RyYXdGaXJzdD1lLGRlbGV0ZSB0Ll9vcmRlcixkZWxldGUgdGhpcy5fbGF5ZXJzW0wuc3RhbXAodCldLHRoaXMuX3JlcXVlc3RSZWRyYXcodCl9LF91cGRhdGVQYXRoOmZ1bmN0aW9uKHQpe3RoaXMuX2V4dGVuZFJlZHJhd0JvdW5kcyh0KSx0Ll9wcm9qZWN0KCksdC5fdXBkYXRlKCksdGhpcy5fcmVxdWVzdFJlZHJhdyh0KX0sX3VwZGF0ZVN0eWxlOmZ1bmN0aW9uKHQpe3RoaXMuX3VwZGF0ZURhc2hBcnJheSh0KSx0aGlzLl9yZXF1ZXN0UmVkcmF3KHQpfSxfdXBkYXRlRGFzaEFycmF5OmZ1bmN0aW9uKHQpe2lmKHQub3B0aW9ucy5kYXNoQXJyYXkpe3ZhciBpLGU9dC5vcHRpb25zLmRhc2hBcnJheS5zcGxpdCgiLCIpLG49W107Zm9yKGk9MDtpPGUubGVuZ3RoO2krKyluLnB1c2goTnVtYmVyKGVbaV0pKTt0Lm9wdGlvbnMuX2Rhc2hBcnJheT1ufX0sX3JlcXVlc3RSZWRyYXc6ZnVuY3Rpb24odCl7dGhpcy5fbWFwJiYodGhpcy5fZXh0ZW5kUmVkcmF3Qm91bmRzKHQpLHRoaXMuX3JlZHJhd1JlcXVlc3Q9dGhpcy5fcmVkcmF3UmVxdWVzdHx8Zih0aGlzLl9yZWRyYXcsdGhpcykpfSxfZXh0ZW5kUmVkcmF3Qm91bmRzOmZ1bmN0aW9uKHQpe2lmKHQuX3B4Qm91bmRzKXt2YXIgaT0odC5vcHRpb25zLndlaWdodHx8MCkrMTt0aGlzLl9yZWRyYXdCb3VuZHM9dGhpcy5fcmVkcmF3Qm91bmRzfHxuZXcgUCx0aGlzLl9yZWRyYXdCb3VuZHMuZXh0ZW5kKHQuX3B4Qm91bmRzLm1pbi5zdWJ0cmFjdChbaSxpXSkpLHRoaXMuX3JlZHJhd0JvdW5kcy5leHRlbmQodC5fcHhCb3VuZHMubWF4LmFkZChbaSxpXSkpfX0sX3JlZHJhdzpmdW5jdGlvbigpe3RoaXMuX3JlZHJhd1JlcXVlc3Q9bnVsbCx0aGlzLl9yZWRyYXdCb3VuZHMmJih0aGlzLl9yZWRyYXdCb3VuZHMubWluLl9mbG9vcigpLHRoaXMuX3JlZHJhd0JvdW5kcy5tYXguX2NlaWwoKSksdGhpcy5fY2xlYXIoKSx0aGlzLl9kcmF3KCksdGhpcy5fcmVkcmF3Qm91bmRzPW51bGx9LF9jbGVhcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlZHJhd0JvdW5kcztpZih0KXt2YXIgaT10LmdldFNpemUoKTt0aGlzLl9jdHguY2xlYXJSZWN0KHQubWluLngsdC5taW4ueSxpLngsaS55KX1lbHNlIHRoaXMuX2N0eC5jbGVhclJlY3QoMCwwLHRoaXMuX2NvbnRhaW5lci53aWR0aCx0aGlzLl9jb250YWluZXIuaGVpZ2h0KX0sX2RyYXc6ZnVuY3Rpb24oKXt2YXIgdCxpPXRoaXMuX3JlZHJhd0JvdW5kcztpZih0aGlzLl9jdHguc2F2ZSgpLGkpe3ZhciBlPWkuZ2V0U2l6ZSgpO3RoaXMuX2N0eC5iZWdpblBhdGgoKSx0aGlzLl9jdHgucmVjdChpLm1pbi54LGkubWluLnksZS54LGUueSksdGhpcy5fY3R4LmNsaXAoKX10aGlzLl9kcmF3aW5nPSEwO2Zvcih2YXIgbj10aGlzLl9kcmF3Rmlyc3Q7bjtuPW4ubmV4dCl0PW4ubGF5ZXIsKCFpfHx0Ll9weEJvdW5kcyYmdC5fcHhCb3VuZHMuaW50ZXJzZWN0cyhpKSkmJnQuX3VwZGF0ZVBhdGgoKTt0aGlzLl9kcmF3aW5nPSExLHRoaXMuX2N0eC5yZXN0b3JlKCl9LF91cGRhdGVQb2x5OmZ1bmN0aW9uKHQsaSl7aWYodGhpcy5fZHJhd2luZyl7dmFyIGUsbixvLHMscj10Ll9wYXJ0cyxhPXIubGVuZ3RoLGg9dGhpcy5fY3R4O2lmKGEpe2Zvcih0aGlzLl9kcmF3bkxheWVyc1t0Ll9sZWFmbGV0X2lkXT10LGguYmVnaW5QYXRoKCksZT0wO2U8YTtlKyspe2ZvcihuPTAsbz1yW2VdLmxlbmd0aDtuPG87bisrKXM9cltlXVtuXSxoW24/ImxpbmVUbyI6Im1vdmVUbyJdKHMueCxzLnkpO2kmJmguY2xvc2VQYXRoKCl9dGhpcy5fZmlsbFN0cm9rZShoLHQpfX19LF91cGRhdGVDaXJjbGU6ZnVuY3Rpb24odCl7aWYodGhpcy5fZHJhd2luZyYmIXQuX2VtcHR5KCkpe3ZhciBpPXQuX3BvaW50LGU9dGhpcy5fY3R4LG49TWF0aC5tYXgoTWF0aC5yb3VuZCh0Ll9yYWRpdXMpLDEpLG89KE1hdGgubWF4KE1hdGgucm91bmQodC5fcmFkaXVzWSksMSl8fG4pL247dGhpcy5fZHJhd25MYXllcnNbdC5fbGVhZmxldF9pZF09dCwxIT09byYmKGUuc2F2ZSgpLGUuc2NhbGUoMSxvKSksZS5iZWdpblBhdGgoKSxlLmFyYyhpLngsaS55L28sbiwwLDIqTWF0aC5QSSwhMSksMSE9PW8mJmUucmVzdG9yZSgpLHRoaXMuX2ZpbGxTdHJva2UoZSx0KX19LF9maWxsU3Ryb2tlOmZ1bmN0aW9uKHQsaSl7dmFyIGU9aS5vcHRpb25zO2UuZmlsbCYmKHQuZ2xvYmFsQWxwaGE9ZS5maWxsT3BhY2l0eSx0LmZpbGxTdHlsZT1lLmZpbGxDb2xvcnx8ZS5jb2xvcix0LmZpbGwoZS5maWxsUnVsZXx8ImV2ZW5vZGQiKSksZS5zdHJva2UmJjAhPT1lLndlaWdodCYmKHQuc2V0TGluZURhc2gmJnQuc2V0TGluZURhc2goaS5vcHRpb25zJiZpLm9wdGlvbnMuX2Rhc2hBcnJheXx8W10pLHQuZ2xvYmFsQWxwaGE9ZS5vcGFjaXR5LHQubGluZVdpZHRoPWUud2VpZ2h0LHQuc3Ryb2tlU3R5bGU9ZS5jb2xvcix0LmxpbmVDYXA9ZS5saW5lQ2FwLHQubGluZUpvaW49ZS5saW5lSm9pbix0LnN0cm9rZSgpKX0sX29uQ2xpY2s6ZnVuY3Rpb24odCl7Zm9yKHZhciBpLGUsbj10aGlzLl9tYXAubW91c2VFdmVudFRvTGF5ZXJQb2ludCh0KSxvPXRoaXMuX2RyYXdGaXJzdDtvO289by5uZXh0KShpPW8ubGF5ZXIpLm9wdGlvbnMuaW50ZXJhY3RpdmUmJmkuX2NvbnRhaW5zUG9pbnQobikmJiF0aGlzLl9tYXAuX2RyYWdnYWJsZU1vdmVkKGkpJiYoZT1pKTtlJiYoZXQodCksdGhpcy5fZmlyZUV2ZW50KFtlXSx0KSl9LF9vbk1vdXNlTW92ZTpmdW5jdGlvbih0KXtpZih0aGlzLl9tYXAmJiF0aGlzLl9tYXAuZHJhZ2dpbmcubW92aW5nKCkmJiF0aGlzLl9tYXAuX2FuaW1hdGluZ1pvb20pe3ZhciBpPXRoaXMuX21hcC5tb3VzZUV2ZW50VG9MYXllclBvaW50KHQpO3RoaXMuX2hhbmRsZU1vdXNlSG92ZXIodCxpKX19LF9oYW5kbGVNb3VzZU91dDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9ob3ZlcmVkTGF5ZXI7aSYmKG10KHRoaXMuX2NvbnRhaW5lciwibGVhZmxldC1pbnRlcmFjdGl2ZSIpLHRoaXMuX2ZpcmVFdmVudChbaV0sdCwibW91c2VvdXQiKSx0aGlzLl9ob3ZlcmVkTGF5ZXI9bnVsbCl9LF9oYW5kbGVNb3VzZUhvdmVyOmZ1bmN0aW9uKHQsaSl7Zm9yKHZhciBlLG4sbz10aGlzLl9kcmF3Rmlyc3Q7bztvPW8ubmV4dCkoZT1vLmxheWVyKS5vcHRpb25zLmludGVyYWN0aXZlJiZlLl9jb250YWluc1BvaW50KGkpJiYobj1lKTtuIT09dGhpcy5faG92ZXJlZExheWVyJiYodGhpcy5faGFuZGxlTW91c2VPdXQodCksbiYmKHB0KHRoaXMuX2NvbnRhaW5lciwibGVhZmxldC1pbnRlcmFjdGl2ZSIpLHRoaXMuX2ZpcmVFdmVudChbbl0sdCwibW91c2VvdmVyIiksdGhpcy5faG92ZXJlZExheWVyPW4pKSx0aGlzLl9ob3ZlcmVkTGF5ZXImJnRoaXMuX2ZpcmVFdmVudChbdGhpcy5faG92ZXJlZExheWVyXSx0KX0sX2ZpcmVFdmVudDpmdW5jdGlvbih0LGksZSl7dGhpcy5fbWFwLl9maXJlRE9NRXZlbnQoaSxlfHxpLnR5cGUsdCl9LF9icmluZ1RvRnJvbnQ6ZnVuY3Rpb24odCl7dmFyIGk9dC5fb3JkZXIsZT1pLm5leHQsbj1pLnByZXY7ZSYmKGUucHJldj1uLG4/bi5uZXh0PWU6ZSYmKHRoaXMuX2RyYXdGaXJzdD1lKSxpLnByZXY9dGhpcy5fZHJhd0xhc3QsdGhpcy5fZHJhd0xhc3QubmV4dD1pLGkubmV4dD1udWxsLHRoaXMuX2RyYXdMYXN0PWksdGhpcy5fcmVxdWVzdFJlZHJhdyh0KSl9LF9icmluZ1RvQmFjazpmdW5jdGlvbih0KXt2YXIgaT10Ll9vcmRlcixlPWkubmV4dCxuPWkucHJldjtuJiYobi5uZXh0PWUsZT9lLnByZXY9bjpuJiYodGhpcy5fZHJhd0xhc3Q9biksaS5wcmV2PW51bGwsaS5uZXh0PXRoaXMuX2RyYXdGaXJzdCx0aGlzLl9kcmF3Rmlyc3QucHJldj1pLHRoaXMuX2RyYXdGaXJzdD1pLHRoaXMuX3JlcXVlc3RSZWRyYXcodCkpfX0pLGduPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBkb2N1bWVudC5uYW1lc3BhY2VzLmFkZCgibHZtbCIsInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sIiksZnVuY3Rpb24odCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIjxsdm1sOiIrdCsnIGNsYXNzPSJsdm1sIj4nKX19Y2F0Y2godCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCI8Iit0KycgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC5jb206dm1sIiBjbGFzcz0ibHZtbCI+Jyl9fX0oKSx2bj17X2luaXRDb250YWluZXI6ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXI9aHQoImRpdiIsImxlYWZsZXQtdm1sLWNvbnRhaW5lciIpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLl9hbmltYXRpbmdab29tfHwobW4ucHJvdG90eXBlLl91cGRhdGUuY2FsbCh0aGlzKSx0aGlzLmZpcmUoInVwZGF0ZSIpKX0sX2luaXRQYXRoOmZ1bmN0aW9uKHQpe3ZhciBpPXQuX2NvbnRhaW5lcj1nbigic2hhcGUiKTtwdChpLCJsZWFmbGV0LXZtbC1zaGFwZSAiKyh0aGlzLm9wdGlvbnMuY2xhc3NOYW1lfHwiIikpLGkuY29vcmRzaXplPSIxIDEiLHQuX3BhdGg9Z24oInBhdGgiKSxpLmFwcGVuZENoaWxkKHQuX3BhdGgpLHRoaXMuX3VwZGF0ZVN0eWxlKHQpLHRoaXMuX2xheWVyc1tuKHQpXT10fSxfYWRkUGF0aDpmdW5jdGlvbih0KXt2YXIgaT10Ll9jb250YWluZXI7dGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKGkpLHQub3B0aW9ucy5pbnRlcmFjdGl2ZSYmdC5hZGRJbnRlcmFjdGl2ZVRhcmdldChpKX0sX3JlbW92ZVBhdGg6ZnVuY3Rpb24odCl7dmFyIGk9dC5fY29udGFpbmVyO3V0KGkpLHQucmVtb3ZlSW50ZXJhY3RpdmVUYXJnZXQoaSksZGVsZXRlIHRoaXMuX2xheWVyc1tuKHQpXX0sX3VwZGF0ZVN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBpPXQuX3N0cm9rZSxlPXQuX2ZpbGwsbj10Lm9wdGlvbnMsbz10Ll9jb250YWluZXI7by5zdHJva2VkPSEhbi5zdHJva2Usby5maWxsZWQ9ISFuLmZpbGwsbi5zdHJva2U/KGl8fChpPXQuX3N0cm9rZT1nbigic3Ryb2tlIikpLG8uYXBwZW5kQ2hpbGQoaSksaS53ZWlnaHQ9bi53ZWlnaHQrInB4IixpLmNvbG9yPW4uY29sb3IsaS5vcGFjaXR5PW4ub3BhY2l0eSxuLmRhc2hBcnJheT9pLmRhc2hTdHlsZT1laShuLmRhc2hBcnJheSk/bi5kYXNoQXJyYXkuam9pbigiICIpOm4uZGFzaEFycmF5LnJlcGxhY2UoLyggKiwgKikvZywiICIpOmkuZGFzaFN0eWxlPSIiLGkuZW5kY2FwPW4ubGluZUNhcC5yZXBsYWNlKCJidXR0IiwiZmxhdCIpLGkuam9pbnN0eWxlPW4ubGluZUpvaW4pOmkmJihvLnJlbW92ZUNoaWxkKGkpLHQuX3N0cm9rZT1udWxsKSxuLmZpbGw/KGV8fChlPXQuX2ZpbGw9Z24oImZpbGwiKSksby5hcHBlbmRDaGlsZChlKSxlLmNvbG9yPW4uZmlsbENvbG9yfHxuLmNvbG9yLGUub3BhY2l0eT1uLmZpbGxPcGFjaXR5KTplJiYoby5yZW1vdmVDaGlsZChlKSx0Ll9maWxsPW51bGwpfSxfdXBkYXRlQ2lyY2xlOmZ1bmN0aW9uKHQpe3ZhciBpPXQuX3BvaW50LnJvdW5kKCksZT1NYXRoLnJvdW5kKHQuX3JhZGl1cyksbj1NYXRoLnJvdW5kKHQuX3JhZGl1c1l8fGUpO3RoaXMuX3NldFBhdGgodCx0Ll9lbXB0eSgpPyJNMCAwIjoiQUwgIitpLngrIiwiK2kueSsiICIrZSsiLCIrbisiIDAsMjM1OTI2MDAiKX0sX3NldFBhdGg6ZnVuY3Rpb24odCxpKXt0Ll9wYXRoLnY9aX0sX2JyaW5nVG9Gcm9udDpmdW5jdGlvbih0KXtjdCh0Ll9jb250YWluZXIpfSxfYnJpbmdUb0JhY2s6ZnVuY3Rpb24odCl7X3QodC5fY29udGFpbmVyKX19LHluPUppP2duOkUseG49bW4uZXh0ZW5kKHtnZXRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgdD1tbi5wcm90b3R5cGUuZ2V0RXZlbnRzLmNhbGwodGhpcyk7cmV0dXJuIHQuem9vbXN0YXJ0PXRoaXMuX29uWm9vbVN0YXJ0LHR9LF9pbml0Q29udGFpbmVyOmZ1bmN0aW9uKCl7dGhpcy5fY29udGFpbmVyPXluKCJzdmciKSx0aGlzLl9jb250YWluZXIuc2V0QXR0cmlidXRlKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKSx0aGlzLl9yb290R3JvdXA9eW4oImciKSx0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fcm9vdEdyb3VwKX0sX2Rlc3Ryb3lDb250YWluZXI6ZnVuY3Rpb24oKXt1dCh0aGlzLl9jb250YWluZXIpLHEodGhpcy5fY29udGFpbmVyKSxkZWxldGUgdGhpcy5fY29udGFpbmVyLGRlbGV0ZSB0aGlzLl9yb290R3JvdXAsZGVsZXRlIHRoaXMuX3N2Z1NpemV9LF9vblpvb21TdGFydDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZSgpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX21hcC5fYW5pbWF0aW5nWm9vbXx8IXRoaXMuX2JvdW5kcyl7bW4ucHJvdG90eXBlLl91cGRhdGUuY2FsbCh0aGlzKTt2YXIgdD10aGlzLl9ib3VuZHMsaT10LmdldFNpemUoKSxlPXRoaXMuX2NvbnRhaW5lcjt0aGlzLl9zdmdTaXplJiZ0aGlzLl9zdmdTaXplLmVxdWFscyhpKXx8KHRoaXMuX3N2Z1NpemU9aSxlLnNldEF0dHJpYnV0ZSgid2lkdGgiLGkueCksZS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsaS55KSksTHQoZSx0Lm1pbiksZS5zZXRBdHRyaWJ1dGUoInZpZXdCb3giLFt0Lm1pbi54LHQubWluLnksaS54LGkueV0uam9pbigiICIpKSx0aGlzLmZpcmUoInVwZGF0ZSIpfX0sX2luaXRQYXRoOmZ1bmN0aW9uKHQpe3ZhciBpPXQuX3BhdGg9eW4oInBhdGgiKTt0Lm9wdGlvbnMuY2xhc3NOYW1lJiZwdChpLHQub3B0aW9ucy5jbGFzc05hbWUpLHQub3B0aW9ucy5pbnRlcmFjdGl2ZSYmcHQoaSwibGVhZmxldC1pbnRlcmFjdGl2ZSIpLHRoaXMuX3VwZGF0ZVN0eWxlKHQpLHRoaXMuX2xheWVyc1tuKHQpXT10fSxfYWRkUGF0aDpmdW5jdGlvbih0KXt0aGlzLl9yb290R3JvdXB8fHRoaXMuX2luaXRDb250YWluZXIoKSx0aGlzLl9yb290R3JvdXAuYXBwZW5kQ2hpbGQodC5fcGF0aCksdC5hZGRJbnRlcmFjdGl2ZVRhcmdldCh0Ll9wYXRoKX0sX3JlbW92ZVBhdGg6ZnVuY3Rpb24odCl7dXQodC5fcGF0aCksdC5yZW1vdmVJbnRlcmFjdGl2ZVRhcmdldCh0Ll9wYXRoKSxkZWxldGUgdGhpcy5fbGF5ZXJzW24odCldfSxfdXBkYXRlUGF0aDpmdW5jdGlvbih0KXt0Ll9wcm9qZWN0KCksdC5fdXBkYXRlKCl9LF91cGRhdGVTdHlsZTpmdW5jdGlvbih0KXt2YXIgaT10Ll9wYXRoLGU9dC5vcHRpb25zO2kmJihlLnN0cm9rZT8oaS5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsZS5jb2xvciksaS5zZXRBdHRyaWJ1dGUoInN0cm9rZS1vcGFjaXR5IixlLm9wYWNpdHkpLGkuc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLGUud2VpZ2h0KSxpLnNldEF0dHJpYnV0ZSgic3Ryb2tlLWxpbmVjYXAiLGUubGluZUNhcCksaS5zZXRBdHRyaWJ1dGUoInN0cm9rZS1saW5lam9pbiIsZS5saW5lSm9pbiksZS5kYXNoQXJyYXk/aS5zZXRBdHRyaWJ1dGUoInN0cm9rZS1kYXNoYXJyYXkiLGUuZGFzaEFycmF5KTppLnJlbW92ZUF0dHJpYnV0ZSgic3Ryb2tlLWRhc2hhcnJheSIpLGUuZGFzaE9mZnNldD9pLnNldEF0dHJpYnV0ZSgic3Ryb2tlLWRhc2hvZmZzZXQiLGUuZGFzaE9mZnNldCk6aS5yZW1vdmVBdHRyaWJ1dGUoInN0cm9rZS1kYXNob2Zmc2V0IikpOmkuc2V0QXR0cmlidXRlKCJzdHJva2UiLCJub25lIiksZS5maWxsPyhpLnNldEF0dHJpYnV0ZSgiZmlsbCIsZS5maWxsQ29sb3J8fGUuY29sb3IpLGkuc2V0QXR0cmlidXRlKCJmaWxsLW9wYWNpdHkiLGUuZmlsbE9wYWNpdHkpLGkuc2V0QXR0cmlidXRlKCJmaWxsLXJ1bGUiLGUuZmlsbFJ1bGV8fCJldmVub2RkIikpOmkuc2V0QXR0cmlidXRlKCJmaWxsIiwibm9uZSIpKX0sX3VwZGF0ZVBvbHk6ZnVuY3Rpb24odCxpKXt0aGlzLl9zZXRQYXRoKHQsayh0Ll9wYXJ0cyxpKSl9LF91cGRhdGVDaXJjbGU6ZnVuY3Rpb24odCl7dmFyIGk9dC5fcG9pbnQsZT1NYXRoLm1heChNYXRoLnJvdW5kKHQuX3JhZGl1cyksMSksbj0iYSIrZSsiLCIrKE1hdGgubWF4KE1hdGgucm91bmQodC5fcmFkaXVzWSksMSl8fGUpKyIgMCAxLDAgIixvPXQuX2VtcHR5KCk/Ik0wIDAiOiJNIisoaS54LWUpKyIsIitpLnkrbisyKmUrIiwwICIrbisyKi1lKyIsMCAiO3RoaXMuX3NldFBhdGgodCxvKX0sX3NldFBhdGg6ZnVuY3Rpb24odCxpKXt0Ll9wYXRoLnNldEF0dHJpYnV0ZSgiZCIsaSl9LF9icmluZ1RvRnJvbnQ6ZnVuY3Rpb24odCl7Y3QodC5fcGF0aCl9LF9icmluZ1RvQmFjazpmdW5jdGlvbih0KXtfdCh0Ll9wYXRoKX19KTtKaSYmeG4uaW5jbHVkZSh2biksTGUuaW5jbHVkZSh7Z2V0UmVuZGVyZXI6ZnVuY3Rpb24odCl7dmFyIGk9dC5vcHRpb25zLnJlbmRlcmVyfHx0aGlzLl9nZXRQYW5lUmVuZGVyZXIodC5vcHRpb25zLnBhbmUpfHx0aGlzLm9wdGlvbnMucmVuZGVyZXJ8fHRoaXMuX3JlbmRlcmVyO3JldHVybiBpfHwoaT10aGlzLl9yZW5kZXJlcj10aGlzLm9wdGlvbnMucHJlZmVyQ2FudmFzJiZYdCgpfHxKdCgpKSx0aGlzLmhhc0xheWVyKGkpfHx0aGlzLmFkZExheWVyKGkpLGl9LF9nZXRQYW5lUmVuZGVyZXI6ZnVuY3Rpb24odCl7aWYoIm92ZXJsYXlQYW5lIj09PXR8fHZvaWQgMD09PXQpcmV0dXJuITE7dmFyIGk9dGhpcy5fcGFuZVJlbmRlcmVyc1t0XTtyZXR1cm4gdm9pZCAwPT09aSYmKGk9eG4mJkp0KHtwYW5lOnR9KXx8Zm4mJlh0KHtwYW5lOnR9KSx0aGlzLl9wYW5lUmVuZGVyZXJzW3RdPWkpLGl9fSk7dmFyIHduPWVuLmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbih0LGkpe2VuLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyx0aGlzLl9ib3VuZHNUb0xhdExuZ3ModCksaSl9LHNldEJvdW5kczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zZXRMYXRMbmdzKHRoaXMuX2JvdW5kc1RvTGF0TG5ncyh0KSl9LF9ib3VuZHNUb0xhdExuZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9eih0KSxbdC5nZXRTb3V0aFdlc3QoKSx0LmdldE5vcnRoV2VzdCgpLHQuZ2V0Tm9ydGhFYXN0KCksdC5nZXRTb3V0aEVhc3QoKV19fSk7eG4uY3JlYXRlPXluLHhuLnBvaW50c1RvUGF0aD1rLG5uLmdlb21ldHJ5VG9MYXllcj1XdCxubi5jb29yZHNUb0xhdExuZz1IdCxubi5jb29yZHNUb0xhdExuZ3M9RnQsbm4ubGF0TG5nVG9Db29yZHM9VXQsbm4ubGF0TG5nc1RvQ29vcmRzPVZ0LG5uLmdldEZlYXR1cmU9cXQsbm4uYXNGZWF0dXJlPUd0LExlLm1lcmdlT3B0aW9ucyh7Ym94Wm9vbTohMH0pO3ZhciBMbj1aZS5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5fbWFwPXQsdGhpcy5fY29udGFpbmVyPXQuX2NvbnRhaW5lcix0aGlzLl9wYW5lPXQuX3BhbmVzLm92ZXJsYXlQYW5lLHRoaXMuX3Jlc2V0U3RhdGVUaW1lb3V0PTAsdC5vbigidW5sb2FkIix0aGlzLl9kZXN0cm95LHRoaXMpfSxhZGRIb29rczpmdW5jdGlvbigpe1YodGhpcy5fY29udGFpbmVyLCJtb3VzZWRvd24iLHRoaXMuX29uTW91c2VEb3duLHRoaXMpfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe3EodGhpcy5fY29udGFpbmVyLCJtb3VzZWRvd24iLHRoaXMuX29uTW91c2VEb3duLHRoaXMpfSxtb3ZlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb3ZlZH0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt1dCh0aGlzLl9wYW5lKSxkZWxldGUgdGhpcy5fcGFuZX0sX3Jlc2V0U3RhdGU6ZnVuY3Rpb24oKXt0aGlzLl9yZXNldFN0YXRlVGltZW91dD0wLHRoaXMuX21vdmVkPSExfSxfY2xlYXJEZWZlcnJlZFJlc2V0U3RhdGU6ZnVuY3Rpb24oKXswIT09dGhpcy5fcmVzZXRTdGF0ZVRpbWVvdXQmJihjbGVhclRpbWVvdXQodGhpcy5fcmVzZXRTdGF0ZVRpbWVvdXQpLHRoaXMuX3Jlc2V0U3RhdGVUaW1lb3V0PTApfSxfb25Nb3VzZURvd246ZnVuY3Rpb24odCl7aWYoIXQuc2hpZnRLZXl8fDEhPT10LndoaWNoJiYxIT09dC5idXR0b24pcmV0dXJuITE7dGhpcy5fY2xlYXJEZWZlcnJlZFJlc2V0U3RhdGUoKSx0aGlzLl9yZXNldFN0YXRlKCksbWkoKSxidCgpLHRoaXMuX3N0YXJ0UG9pbnQ9dGhpcy5fbWFwLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQpLFYoZG9jdW1lbnQse2NvbnRleHRtZW51OlEsbW91c2Vtb3ZlOnRoaXMuX29uTW91c2VNb3ZlLG1vdXNldXA6dGhpcy5fb25Nb3VzZVVwLGtleWRvd246dGhpcy5fb25LZXlEb3dufSx0aGlzKX0sX29uTW91c2VNb3ZlOmZ1bmN0aW9uKHQpe3RoaXMuX21vdmVkfHwodGhpcy5fbW92ZWQ9ITAsdGhpcy5fYm94PWh0KCJkaXYiLCJsZWFmbGV0LXpvb20tYm94Iix0aGlzLl9jb250YWluZXIpLHB0KHRoaXMuX2NvbnRhaW5lciwibGVhZmxldC1jcm9zc2hhaXIiKSx0aGlzLl9tYXAuZmlyZSgiYm94em9vbXN0YXJ0IikpLHRoaXMuX3BvaW50PXRoaXMuX21hcC5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0KTt2YXIgaT1uZXcgUCh0aGlzLl9wb2ludCx0aGlzLl9zdGFydFBvaW50KSxlPWkuZ2V0U2l6ZSgpO0x0KHRoaXMuX2JveCxpLm1pbiksdGhpcy5fYm94LnN0eWxlLndpZHRoPWUueCsicHgiLHRoaXMuX2JveC5zdHlsZS5oZWlnaHQ9ZS55KyJweCJ9LF9maW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl9tb3ZlZCYmKHV0KHRoaXMuX2JveCksbXQodGhpcy5fY29udGFpbmVyLCJsZWFmbGV0LWNyb3NzaGFpciIpKSxmaSgpLFR0KCkscShkb2N1bWVudCx7Y29udGV4dG1lbnU6USxtb3VzZW1vdmU6dGhpcy5fb25Nb3VzZU1vdmUsbW91c2V1cDp0aGlzLl9vbk1vdXNlVXAsa2V5ZG93bjp0aGlzLl9vbktleURvd259LHRoaXMpfSxfb25Nb3VzZVVwOmZ1bmN0aW9uKHQpe2lmKCgxPT09dC53aGljaHx8MT09PXQuYnV0dG9uKSYmKHRoaXMuX2ZpbmlzaCgpLHRoaXMuX21vdmVkKSl7dGhpcy5fY2xlYXJEZWZlcnJlZFJlc2V0U3RhdGUoKSx0aGlzLl9yZXNldFN0YXRlVGltZW91dD1zZXRUaW1lb3V0KGUodGhpcy5fcmVzZXRTdGF0ZSx0aGlzKSwwKTt2YXIgaT1uZXcgVCh0aGlzLl9tYXAuY29udGFpbmVyUG9pbnRUb0xhdExuZyh0aGlzLl9zdGFydFBvaW50KSx0aGlzLl9tYXAuY29udGFpbmVyUG9pbnRUb0xhdExuZyh0aGlzLl9wb2ludCkpO3RoaXMuX21hcC5maXRCb3VuZHMoaSkuZmlyZSgiYm94em9vbWVuZCIse2JveFpvb21Cb3VuZHM6aX0pfX0sX29uS2V5RG93bjpmdW5jdGlvbih0KXsyNz09PXQua2V5Q29kZSYmdGhpcy5fZmluaXNoKCl9fSk7TGUuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJib3hab29tIixMbiksTGUubWVyZ2VPcHRpb25zKHtkb3VibGVDbGlja1pvb206ITB9KTt2YXIgUG49WmUuZXh0ZW5kKHthZGRIb29rczpmdW5jdGlvbigpe3RoaXMuX21hcC5vbigiZGJsY2xpY2siLHRoaXMuX29uRG91YmxlQ2xpY2ssdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLm9mZigiZGJsY2xpY2siLHRoaXMuX29uRG91YmxlQ2xpY2ssdGhpcyl9LF9vbkRvdWJsZUNsaWNrOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX21hcCxlPWkuZ2V0Wm9vbSgpLG49aS5vcHRpb25zLnpvb21EZWx0YSxvPXQub3JpZ2luYWxFdmVudC5zaGlmdEtleT9lLW46ZStuOyJjZW50ZXIiPT09aS5vcHRpb25zLmRvdWJsZUNsaWNrWm9vbT9pLnNldFpvb20obyk6aS5zZXRab29tQXJvdW5kKHQuY29udGFpbmVyUG9pbnQsbyl9fSk7TGUuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJkb3VibGVDbGlja1pvb20iLFBuKSxMZS5tZXJnZU9wdGlvbnMoe2RyYWdnaW5nOiEwLGluZXJ0aWE6IXppLGluZXJ0aWFEZWNlbGVyYXRpb246MzQwMCxpbmVydGlhTWF4U3BlZWQ6MS8wLGVhc2VMaW5lYXJpdHk6LjIsd29ybGRDb3B5SnVtcDohMSxtYXhCb3VuZHNWaXNjb3NpdHk6MH0pO3ZhciBibj1aZS5leHRlbmQoe2FkZEhvb2tzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2RyYWdnYWJsZSl7dmFyIHQ9dGhpcy5fbWFwO3RoaXMuX2RyYWdnYWJsZT1uZXcgQmUodC5fbWFwUGFuZSx0Ll9jb250YWluZXIpLHRoaXMuX2RyYWdnYWJsZS5vbih7ZHJhZ3N0YXJ0OnRoaXMuX29uRHJhZ1N0YXJ0LGRyYWc6dGhpcy5fb25EcmFnLGRyYWdlbmQ6dGhpcy5fb25EcmFnRW5kfSx0aGlzKSx0aGlzLl9kcmFnZ2FibGUub24oInByZWRyYWciLHRoaXMuX29uUHJlRHJhZ0xpbWl0LHRoaXMpLHQub3B0aW9ucy53b3JsZENvcHlKdW1wJiYodGhpcy5fZHJhZ2dhYmxlLm9uKCJwcmVkcmFnIix0aGlzLl9vblByZURyYWdXcmFwLHRoaXMpLHQub24oInpvb21lbmQiLHRoaXMuX29uWm9vbUVuZCx0aGlzKSx0LndoZW5SZWFkeSh0aGlzLl9vblpvb21FbmQsdGhpcykpfXB0KHRoaXMuX21hcC5fY29udGFpbmVyLCJsZWFmbGV0LWdyYWIgbGVhZmxldC10b3VjaC1kcmFnIiksdGhpcy5fZHJhZ2dhYmxlLmVuYWJsZSgpLHRoaXMuX3Bvc2l0aW9ucz1bXSx0aGlzLl90aW1lcz1bXX0scmVtb3ZlSG9va3M6ZnVuY3Rpb24oKXttdCh0aGlzLl9tYXAuX2NvbnRhaW5lciwibGVhZmxldC1ncmFiIiksbXQodGhpcy5fbWFwLl9jb250YWluZXIsImxlYWZsZXQtdG91Y2gtZHJhZyIpLHRoaXMuX2RyYWdnYWJsZS5kaXNhYmxlKCl9LG1vdmVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdnYWJsZSYmdGhpcy5fZHJhZ2dhYmxlLl9tb3ZlZH0sbW92aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdnYWJsZSYmdGhpcy5fZHJhZ2dhYmxlLl9tb3Zpbmd9LF9vbkRyYWdTdGFydDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcDtpZih0Ll9zdG9wKCksdGhpcy5fbWFwLm9wdGlvbnMubWF4Qm91bmRzJiZ0aGlzLl9tYXAub3B0aW9ucy5tYXhCb3VuZHNWaXNjb3NpdHkpe3ZhciBpPXoodGhpcy5fbWFwLm9wdGlvbnMubWF4Qm91bmRzKTt0aGlzLl9vZmZzZXRMaW1pdD1iKHRoaXMuX21hcC5sYXRMbmdUb0NvbnRhaW5lclBvaW50KGkuZ2V0Tm9ydGhXZXN0KCkpLm11bHRpcGx5QnkoLTEpLHRoaXMuX21hcC5sYXRMbmdUb0NvbnRhaW5lclBvaW50KGkuZ2V0U291dGhFYXN0KCkpLm11bHRpcGx5QnkoLTEpLmFkZCh0aGlzLl9tYXAuZ2V0U2l6ZSgpKSksdGhpcy5fdmlzY29zaXR5PU1hdGgubWluKDEsTWF0aC5tYXgoMCx0aGlzLl9tYXAub3B0aW9ucy5tYXhCb3VuZHNWaXNjb3NpdHkpKX1lbHNlIHRoaXMuX29mZnNldExpbWl0PW51bGw7dC5maXJlKCJtb3Zlc3RhcnQiKS5maXJlKCJkcmFnc3RhcnQiKSx0Lm9wdGlvbnMuaW5lcnRpYSYmKHRoaXMuX3Bvc2l0aW9ucz1bXSx0aGlzLl90aW1lcz1bXSl9LF9vbkRyYWc6ZnVuY3Rpb24odCl7aWYodGhpcy5fbWFwLm9wdGlvbnMuaW5lcnRpYSl7dmFyIGk9dGhpcy5fbGFzdFRpbWU9K25ldyBEYXRlLGU9dGhpcy5fbGFzdFBvcz10aGlzLl9kcmFnZ2FibGUuX2Fic1Bvc3x8dGhpcy5fZHJhZ2dhYmxlLl9uZXdQb3M7dGhpcy5fcG9zaXRpb25zLnB1c2goZSksdGhpcy5fdGltZXMucHVzaChpKSx0aGlzLl9wcnVuZVBvc2l0aW9ucyhpKX10aGlzLl9tYXAuZmlyZSgibW92ZSIsdCkuZmlyZSgiZHJhZyIsdCl9LF9wcnVuZVBvc2l0aW9uczpmdW5jdGlvbih0KXtmb3IoO3RoaXMuX3Bvc2l0aW9ucy5sZW5ndGg+MSYmdC10aGlzLl90aW1lc1swXT41MDspdGhpcy5fcG9zaXRpb25zLnNoaWZ0KCksdGhpcy5fdGltZXMuc2hpZnQoKX0sX29uWm9vbUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5nZXRTaXplKCkuZGl2aWRlQnkoMiksaT10aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KFswLDBdKTt0aGlzLl9pbml0aWFsV29ybGRPZmZzZXQ9aS5zdWJ0cmFjdCh0KS54LHRoaXMuX3dvcmxkV2lkdGg9dGhpcy5fbWFwLmdldFBpeGVsV29ybGRCb3VuZHMoKS5nZXRTaXplKCkueH0sX3Zpc2NvdXNMaW1pdDpmdW5jdGlvbih0LGkpe3JldHVybiB0LSh0LWkpKnRoaXMuX3Zpc2Nvc2l0eX0sX29uUHJlRHJhZ0xpbWl0OmZ1bmN0aW9uKCl7aWYodGhpcy5fdmlzY29zaXR5JiZ0aGlzLl9vZmZzZXRMaW1pdCl7dmFyIHQ9dGhpcy5fZHJhZ2dhYmxlLl9uZXdQb3Muc3VidHJhY3QodGhpcy5fZHJhZ2dhYmxlLl9zdGFydFBvcyksaT10aGlzLl9vZmZzZXRMaW1pdDt0Lng8aS5taW4ueCYmKHQueD10aGlzLl92aXNjb3VzTGltaXQodC54LGkubWluLngpKSx0Lnk8aS5taW4ueSYmKHQueT10aGlzLl92aXNjb3VzTGltaXQodC55LGkubWluLnkpKSx0Lng+aS5tYXgueCYmKHQueD10aGlzLl92aXNjb3VzTGltaXQodC54LGkubWF4LngpKSx0Lnk+aS5tYXgueSYmKHQueT10aGlzLl92aXNjb3VzTGltaXQodC55LGkubWF4LnkpKSx0aGlzLl9kcmFnZ2FibGUuX25ld1Bvcz10aGlzLl9kcmFnZ2FibGUuX3N0YXJ0UG9zLmFkZCh0KX19LF9vblByZURyYWdXcmFwOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fd29ybGRXaWR0aCxpPU1hdGgucm91bmQodC8yKSxlPXRoaXMuX2luaXRpYWxXb3JsZE9mZnNldCxuPXRoaXMuX2RyYWdnYWJsZS5fbmV3UG9zLngsbz0obi1pK2UpJXQraS1lLHM9KG4raStlKSV0LWktZSxyPU1hdGguYWJzKG8rZSk8TWF0aC5hYnMocytlKT9vOnM7dGhpcy5fZHJhZ2dhYmxlLl9hYnNQb3M9dGhpcy5fZHJhZ2dhYmxlLl9uZXdQb3MuY2xvbmUoKSx0aGlzLl9kcmFnZ2FibGUuX25ld1Bvcy54PXJ9LF9vbkRyYWdFbmQ6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbWFwLGU9aS5vcHRpb25zLG49IWUuaW5lcnRpYXx8dGhpcy5fdGltZXMubGVuZ3RoPDI7aWYoaS5maXJlKCJkcmFnZW5kIix0KSxuKWkuZmlyZSgibW92ZWVuZCIpO2Vsc2V7dGhpcy5fcHJ1bmVQb3NpdGlvbnMoK25ldyBEYXRlKTt2YXIgbz10aGlzLl9sYXN0UG9zLnN1YnRyYWN0KHRoaXMuX3Bvc2l0aW9uc1swXSkscz0odGhpcy5fbGFzdFRpbWUtdGhpcy5fdGltZXNbMF0pLzFlMyxyPWUuZWFzZUxpbmVhcml0eSxhPW8ubXVsdGlwbHlCeShyL3MpLGg9YS5kaXN0YW5jZVRvKFswLDBdKSx1PU1hdGgubWluKGUuaW5lcnRpYU1heFNwZWVkLGgpLGw9YS5tdWx0aXBseUJ5KHUvaCksYz11LyhlLmluZXJ0aWFEZWNlbGVyYXRpb24qciksXz1sLm11bHRpcGx5QnkoLWMvMikucm91bmQoKTtfLnh8fF8ueT8oXz1pLl9saW1pdE9mZnNldChfLGkub3B0aW9ucy5tYXhCb3VuZHMpLGYoZnVuY3Rpb24oKXtpLnBhbkJ5KF8se2R1cmF0aW9uOmMsZWFzZUxpbmVhcml0eTpyLG5vTW92ZVN0YXJ0OiEwLGFuaW1hdGU6ITB9KX0pKTppLmZpcmUoIm1vdmVlbmQiKX19fSk7TGUuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJkcmFnZ2luZyIsYm4pLExlLm1lcmdlT3B0aW9ucyh7a2V5Ym9hcmQ6ITAsa2V5Ym9hcmRQYW5EZWx0YTo4MH0pO3ZhciBUbj1aZS5leHRlbmQoe2tleUNvZGVzOntsZWZ0OlszN10scmlnaHQ6WzM5XSxkb3duOls0MF0sdXA6WzM4XSx6b29tSW46WzE4NywxMDcsNjEsMTcxXSx6b29tT3V0OlsxODksMTA5LDU0LDE3M119LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5fbWFwPXQsdGhpcy5fc2V0UGFuRGVsdGEodC5vcHRpb25zLmtleWJvYXJkUGFuRGVsdGEpLHRoaXMuX3NldFpvb21EZWx0YSh0Lm9wdGlvbnMuem9vbURlbHRhKX0sYWRkSG9va3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAuX2NvbnRhaW5lcjt0LnRhYkluZGV4PD0wJiYodC50YWJJbmRleD0iMCIpLFYodCx7Zm9jdXM6dGhpcy5fb25Gb2N1cyxibHVyOnRoaXMuX29uQmx1cixtb3VzZWRvd246dGhpcy5fb25Nb3VzZURvd259LHRoaXMpLHRoaXMuX21hcC5vbih7Zm9jdXM6dGhpcy5fYWRkSG9va3MsYmx1cjp0aGlzLl9yZW1vdmVIb29rc30sdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlSG9va3MoKSxxKHRoaXMuX21hcC5fY29udGFpbmVyLHtmb2N1czp0aGlzLl9vbkZvY3VzLGJsdXI6dGhpcy5fb25CbHVyLG1vdXNlZG93bjp0aGlzLl9vbk1vdXNlRG93bn0sdGhpcyksdGhpcy5fbWFwLm9mZih7Zm9jdXM6dGhpcy5fYWRkSG9va3MsYmx1cjp0aGlzLl9yZW1vdmVIb29rc30sdGhpcyl9LF9vbk1vdXNlRG93bjpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkKXt2YXIgdD1kb2N1bWVudC5ib2R5LGk9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGU9dC5zY3JvbGxUb3B8fGkuc2Nyb2xsVG9wLG49dC5zY3JvbGxMZWZ0fHxpLnNjcm9sbExlZnQ7dGhpcy5fbWFwLl9jb250YWluZXIuZm9jdXMoKSx3aW5kb3cuc2Nyb2xsVG8obixlKX19LF9vbkZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZD0hMCx0aGlzLl9tYXAuZmlyZSgiZm9jdXMiKX0sX29uQmx1cjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWQ9ITEsdGhpcy5fbWFwLmZpcmUoImJsdXIiKX0sX3NldFBhbkRlbHRhOmZ1bmN0aW9uKHQpe3ZhciBpLGUsbj10aGlzLl9wYW5LZXlzPXt9LG89dGhpcy5rZXlDb2Rlcztmb3IoaT0wLGU9by5sZWZ0Lmxlbmd0aDtpPGU7aSsrKW5bby5sZWZ0W2ldXT1bLTEqdCwwXTtmb3IoaT0wLGU9by5yaWdodC5sZW5ndGg7aTxlO2krKyluW28ucmlnaHRbaV1dPVt0LDBdO2ZvcihpPTAsZT1vLmRvd24ubGVuZ3RoO2k8ZTtpKyspbltvLmRvd25baV1dPVswLHRdO2ZvcihpPTAsZT1vLnVwLmxlbmd0aDtpPGU7aSsrKW5bby51cFtpXV09WzAsLTEqdF19LF9zZXRab29tRGVsdGE6ZnVuY3Rpb24odCl7dmFyIGksZSxuPXRoaXMuX3pvb21LZXlzPXt9LG89dGhpcy5rZXlDb2Rlcztmb3IoaT0wLGU9by56b29tSW4ubGVuZ3RoO2k8ZTtpKyspbltvLnpvb21JbltpXV09dDtmb3IoaT0wLGU9by56b29tT3V0Lmxlbmd0aDtpPGU7aSsrKW5bby56b29tT3V0W2ldXT0tdH0sX2FkZEhvb2tzOmZ1bmN0aW9uKCl7Vihkb2N1bWVudCwia2V5ZG93biIsdGhpcy5fb25LZXlEb3duLHRoaXMpfSxfcmVtb3ZlSG9va3M6ZnVuY3Rpb24oKXtxKGRvY3VtZW50LCJrZXlkb3duIix0aGlzLl9vbktleURvd24sdGhpcyl9LF9vbktleURvd246ZnVuY3Rpb24odCl7aWYoISh0LmFsdEtleXx8dC5jdHJsS2V5fHx0Lm1ldGFLZXkpKXt2YXIgaSxlPXQua2V5Q29kZSxuPXRoaXMuX21hcDtpZihlIGluIHRoaXMuX3BhbktleXMpe2lmKG4uX3BhbkFuaW0mJm4uX3BhbkFuaW0uX2luUHJvZ3Jlc3MpcmV0dXJuO2k9dGhpcy5fcGFuS2V5c1tlXSx0LnNoaWZ0S2V5JiYoaT13KGkpLm11bHRpcGx5QnkoMykpLG4ucGFuQnkoaSksbi5vcHRpb25zLm1heEJvdW5kcyYmbi5wYW5JbnNpZGVCb3VuZHMobi5vcHRpb25zLm1heEJvdW5kcyl9ZWxzZSBpZihlIGluIHRoaXMuX3pvb21LZXlzKW4uc2V0Wm9vbShuLmdldFpvb20oKSsodC5zaGlmdEtleT8zOjEpKnRoaXMuX3pvb21LZXlzW2VdKTtlbHNle2lmKDI3IT09ZXx8IW4uX3BvcHVwfHwhbi5fcG9wdXAub3B0aW9ucy5jbG9zZU9uRXNjYXBlS2V5KXJldHVybjtuLmNsb3NlUG9wdXAoKX1RKHQpfX19KTtMZS5hZGRJbml0SG9vaygiYWRkSGFuZGxlciIsImtleWJvYXJkIixUbiksTGUubWVyZ2VPcHRpb25zKHtzY3JvbGxXaGVlbFpvb206ITAsd2hlZWxEZWJvdW5jZVRpbWU6NDAsd2hlZWxQeFBlclpvb21MZXZlbDo2MH0pO3ZhciB6bj1aZS5leHRlbmQoe2FkZEhvb2tzOmZ1bmN0aW9uKCl7Vih0aGlzLl9tYXAuX2NvbnRhaW5lciwibW91c2V3aGVlbCIsdGhpcy5fb25XaGVlbFNjcm9sbCx0aGlzKSx0aGlzLl9kZWx0YT0wfSxyZW1vdmVIb29rczpmdW5jdGlvbigpe3EodGhpcy5fbWFwLl9jb250YWluZXIsIm1vdXNld2hlZWwiLHRoaXMuX29uV2hlZWxTY3JvbGwsdGhpcyl9LF9vbldoZWVsU2Nyb2xsOmZ1bmN0aW9uKHQpe3ZhciBpPWl0KHQpLG49dGhpcy5fbWFwLm9wdGlvbnMud2hlZWxEZWJvdW5jZVRpbWU7dGhpcy5fZGVsdGErPWksdGhpcy5fbGFzdE1vdXNlUG9zPXRoaXMuX21hcC5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludCh0KSx0aGlzLl9zdGFydFRpbWV8fCh0aGlzLl9zdGFydFRpbWU9K25ldyBEYXRlKTt2YXIgbz1NYXRoLm1heChuLSgrbmV3IERhdGUtdGhpcy5fc3RhcnRUaW1lKSwwKTtjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPXNldFRpbWVvdXQoZSh0aGlzLl9wZXJmb3JtWm9vbSx0aGlzKSxvKSxRKHQpfSxfcGVyZm9ybVpvb206ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tYXAsaT10LmdldFpvb20oKSxlPXRoaXMuX21hcC5vcHRpb25zLnpvb21TbmFwfHwwO3QuX3N0b3AoKTt2YXIgbj10aGlzLl9kZWx0YS8oNCp0aGlzLl9tYXAub3B0aW9ucy53aGVlbFB4UGVyWm9vbUxldmVsKSxvPTQqTWF0aC5sb2coMi8oMStNYXRoLmV4cCgtTWF0aC5hYnMobikpKSkvTWF0aC5MTjIscz1lP01hdGguY2VpbChvL2UpKmU6byxyPXQuX2xpbWl0Wm9vbShpKyh0aGlzLl9kZWx0YT4wP3M6LXMpKS1pO3RoaXMuX2RlbHRhPTAsdGhpcy5fc3RhcnRUaW1lPW51bGwsciYmKCJjZW50ZXIiPT09dC5vcHRpb25zLnNjcm9sbFdoZWVsWm9vbT90LnNldFpvb20oaStyKTp0LnNldFpvb21Bcm91bmQodGhpcy5fbGFzdE1vdXNlUG9zLGkrcikpfX0pO0xlLmFkZEluaXRIb29rKCJhZGRIYW5kbGVyIiwic2Nyb2xsV2hlZWxab29tIix6biksTGUubWVyZ2VPcHRpb25zKHt0YXA6ITAsdGFwVG9sZXJhbmNlOjE1fSk7dmFyIE1uPVplLmV4dGVuZCh7YWRkSG9va3M6ZnVuY3Rpb24oKXtWKHRoaXMuX21hcC5fY29udGFpbmVyLCJ0b3VjaHN0YXJ0Iix0aGlzLl9vbkRvd24sdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7cSh0aGlzLl9tYXAuX2NvbnRhaW5lciwidG91Y2hzdGFydCIsdGhpcy5fb25Eb3duLHRoaXMpfSxfb25Eb3duOmZ1bmN0aW9uKHQpe2lmKHQudG91Y2hlcyl7aWYoJCh0KSx0aGlzLl9maXJlQ2xpY2s9ITAsdC50b3VjaGVzLmxlbmd0aD4xKXJldHVybiB0aGlzLl9maXJlQ2xpY2s9ITEsdm9pZCBjbGVhclRpbWVvdXQodGhpcy5faG9sZFRpbWVvdXQpO3ZhciBpPXQudG91Y2hlc1swXSxuPWkudGFyZ2V0O3RoaXMuX3N0YXJ0UG9zPXRoaXMuX25ld1Bvcz1uZXcgeChpLmNsaWVudFgsaS5jbGllbnRZKSxuLnRhZ05hbWUmJiJhIj09PW4udGFnTmFtZS50b0xvd2VyQ2FzZSgpJiZwdChuLCJsZWFmbGV0LWFjdGl2ZSIpLHRoaXMuX2hvbGRUaW1lb3V0PXNldFRpbWVvdXQoZShmdW5jdGlvbigpe3RoaXMuX2lzVGFwVmFsaWQoKSYmKHRoaXMuX2ZpcmVDbGljaz0hMSx0aGlzLl9vblVwKCksdGhpcy5fc2ltdWxhdGVFdmVudCgiY29udGV4dG1lbnUiLGkpKX0sdGhpcyksMWUzKSx0aGlzLl9zaW11bGF0ZUV2ZW50KCJtb3VzZWRvd24iLGkpLFYoZG9jdW1lbnQse3RvdWNobW92ZTp0aGlzLl9vbk1vdmUsdG91Y2hlbmQ6dGhpcy5fb25VcH0sdGhpcyl9fSxfb25VcDpmdW5jdGlvbih0KXtpZihjbGVhclRpbWVvdXQodGhpcy5faG9sZFRpbWVvdXQpLHEoZG9jdW1lbnQse3RvdWNobW92ZTp0aGlzLl9vbk1vdmUsdG91Y2hlbmQ6dGhpcy5fb25VcH0sdGhpcyksdGhpcy5fZmlyZUNsaWNrJiZ0JiZ0LmNoYW5nZWRUb3VjaGVzKXt2YXIgaT10LmNoYW5nZWRUb3VjaGVzWzBdLGU9aS50YXJnZXQ7ZSYmZS50YWdOYW1lJiYiYSI9PT1lLnRhZ05hbWUudG9Mb3dlckNhc2UoKSYmbXQoZSwibGVhZmxldC1hY3RpdmUiKSx0aGlzLl9zaW11bGF0ZUV2ZW50KCJtb3VzZXVwIixpKSx0aGlzLl9pc1RhcFZhbGlkKCkmJnRoaXMuX3NpbXVsYXRlRXZlbnQoImNsaWNrIixpKX19LF9pc1RhcFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25ld1Bvcy5kaXN0YW5jZVRvKHRoaXMuX3N0YXJ0UG9zKTw9dGhpcy5fbWFwLm9wdGlvbnMudGFwVG9sZXJhbmNlfSxfb25Nb3ZlOmZ1bmN0aW9uKHQpe3ZhciBpPXQudG91Y2hlc1swXTt0aGlzLl9uZXdQb3M9bmV3IHgoaS5jbGllbnRYLGkuY2xpZW50WSksdGhpcy5fc2ltdWxhdGVFdmVudCgibW91c2Vtb3ZlIixpKX0sX3NpbXVsYXRlRXZlbnQ6ZnVuY3Rpb24odCxpKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudHMiKTtlLl9zaW11bGF0ZWQ9ITAsaS50YXJnZXQuX3NpbXVsYXRlZENsaWNrPSEwLGUuaW5pdE1vdXNlRXZlbnQodCwhMCwhMCx3aW5kb3csMSxpLnNjcmVlblgsaS5zY3JlZW5ZLGkuY2xpZW50WCxpLmNsaWVudFksITEsITEsITEsITEsMCxudWxsKSxpLnRhcmdldC5kaXNwYXRjaEV2ZW50KGUpfX0pO1ZpJiYhVWkmJkxlLmFkZEluaXRIb29rKCJhZGRIYW5kbGVyIiwidGFwIixNbiksTGUubWVyZ2VPcHRpb25zKHt0b3VjaFpvb206VmkmJiF6aSxib3VuY2VBdFpvb21MaW1pdHM6ITB9KTt2YXIgQ249WmUuZXh0ZW5kKHthZGRIb29rczpmdW5jdGlvbigpe3B0KHRoaXMuX21hcC5fY29udGFpbmVyLCJsZWFmbGV0LXRvdWNoLXpvb20iKSxWKHRoaXMuX21hcC5fY29udGFpbmVyLCJ0b3VjaHN0YXJ0Iix0aGlzLl9vblRvdWNoU3RhcnQsdGhpcyl9LHJlbW92ZUhvb2tzOmZ1bmN0aW9uKCl7bXQodGhpcy5fbWFwLl9jb250YWluZXIsImxlYWZsZXQtdG91Y2gtem9vbSIpLHEodGhpcy5fbWFwLl9jb250YWluZXIsInRvdWNoc3RhcnQiLHRoaXMuX29uVG91Y2hTdGFydCx0aGlzKX0sX29uVG91Y2hTdGFydDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9tYXA7aWYodC50b3VjaGVzJiYyPT09dC50b3VjaGVzLmxlbmd0aCYmIWkuX2FuaW1hdGluZ1pvb20mJiF0aGlzLl96b29taW5nKXt2YXIgZT1pLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQudG91Y2hlc1swXSksbj1pLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KHQudG91Y2hlc1sxXSk7dGhpcy5fY2VudGVyUG9pbnQ9aS5nZXRTaXplKCkuX2RpdmlkZUJ5KDIpLHRoaXMuX3N0YXJ0TGF0TG5nPWkuY29udGFpbmVyUG9pbnRUb0xhdExuZyh0aGlzLl9jZW50ZXJQb2ludCksImNlbnRlciIhPT1pLm9wdGlvbnMudG91Y2hab29tJiYodGhpcy5fcGluY2hTdGFydExhdExuZz1pLmNvbnRhaW5lclBvaW50VG9MYXRMbmcoZS5hZGQobikuX2RpdmlkZUJ5KDIpKSksdGhpcy5fc3RhcnREaXN0PWUuZGlzdGFuY2VUbyhuKSx0aGlzLl9zdGFydFpvb209aS5nZXRab29tKCksdGhpcy5fbW92ZWQ9ITEsdGhpcy5fem9vbWluZz0hMCxpLl9zdG9wKCksVihkb2N1bWVudCwidG91Y2htb3ZlIix0aGlzLl9vblRvdWNoTW92ZSx0aGlzKSxWKGRvY3VtZW50LCJ0b3VjaGVuZCIsdGhpcy5fb25Ub3VjaEVuZCx0aGlzKSwkKHQpfX0sX29uVG91Y2hNb3ZlOmZ1bmN0aW9uKHQpe2lmKHQudG91Y2hlcyYmMj09PXQudG91Y2hlcy5sZW5ndGgmJnRoaXMuX3pvb21pbmcpe3ZhciBpPXRoaXMuX21hcCxuPWkubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodC50b3VjaGVzWzBdKSxvPWkubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQodC50b3VjaGVzWzFdKSxzPW4uZGlzdGFuY2VUbyhvKS90aGlzLl9zdGFydERpc3Q7aWYodGhpcy5fem9vbT1pLmdldFNjYWxlWm9vbShzLHRoaXMuX3N0YXJ0Wm9vbSksIWkub3B0aW9ucy5ib3VuY2VBdFpvb21MaW1pdHMmJih0aGlzLl96b29tPGkuZ2V0TWluWm9vbSgpJiZzPDF8fHRoaXMuX3pvb20+aS5nZXRNYXhab29tKCkmJnM+MSkmJih0aGlzLl96b29tPWkuX2xpbWl0Wm9vbSh0aGlzLl96b29tKSksImNlbnRlciI9PT1pLm9wdGlvbnMudG91Y2hab29tKXtpZih0aGlzLl9jZW50ZXI9dGhpcy5fc3RhcnRMYXRMbmcsMT09PXMpcmV0dXJufWVsc2V7dmFyIHI9bi5fYWRkKG8pLl9kaXZpZGVCeSgyKS5fc3VidHJhY3QodGhpcy5fY2VudGVyUG9pbnQpO2lmKDE9PT1zJiYwPT09ci54JiYwPT09ci55KXJldHVybjt0aGlzLl9jZW50ZXI9aS51bnByb2plY3QoaS5wcm9qZWN0KHRoaXMuX3BpbmNoU3RhcnRMYXRMbmcsdGhpcy5fem9vbSkuc3VidHJhY3QociksdGhpcy5fem9vbSl9dGhpcy5fbW92ZWR8fChpLl9tb3ZlU3RhcnQoITAsITEpLHRoaXMuX21vdmVkPSEwKSxnKHRoaXMuX2FuaW1SZXF1ZXN0KTt2YXIgYT1lKGkuX21vdmUsaSx0aGlzLl9jZW50ZXIsdGhpcy5fem9vbSx7cGluY2g6ITAscm91bmQ6ITF9KTt0aGlzLl9hbmltUmVxdWVzdD1mKGEsdGhpcywhMCksJCh0KX19LF9vblRvdWNoRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbW92ZWQmJnRoaXMuX3pvb21pbmc/KHRoaXMuX3pvb21pbmc9ITEsZyh0aGlzLl9hbmltUmVxdWVzdCkscShkb2N1bWVudCwidG91Y2htb3ZlIix0aGlzLl9vblRvdWNoTW92ZSkscShkb2N1bWVudCwidG91Y2hlbmQiLHRoaXMuX29uVG91Y2hFbmQpLHRoaXMuX21hcC5vcHRpb25zLnpvb21BbmltYXRpb24/dGhpcy5fbWFwLl9hbmltYXRlWm9vbSh0aGlzLl9jZW50ZXIsdGhpcy5fbWFwLl9saW1pdFpvb20odGhpcy5fem9vbSksITAsdGhpcy5fbWFwLm9wdGlvbnMuem9vbVNuYXApOnRoaXMuX21hcC5fcmVzZXRWaWV3KHRoaXMuX2NlbnRlcix0aGlzLl9tYXAuX2xpbWl0Wm9vbSh0aGlzLl96b29tKSkpOnRoaXMuX3pvb21pbmc9ITF9fSk7TGUuYWRkSW5pdEhvb2soImFkZEhhbmRsZXIiLCJ0b3VjaFpvb20iLENuKSxMZS5Cb3hab29tPUxuLExlLkRvdWJsZUNsaWNrWm9vbT1QbixMZS5EcmFnPWJuLExlLktleWJvYXJkPVRuLExlLlNjcm9sbFdoZWVsWm9vbT16bixMZS5UYXA9TW4sTGUuVG91Y2hab29tPUNuO3ZhciBabj13aW5kb3cuTDt3aW5kb3cuTD10LE9iamVjdC5mcmVlemU9JHQsdC52ZXJzaW9uPSIxLjMuMStIRUFELmJhNmY5N2YiLHQubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cuTD1abix0aGlzfSx0LkNvbnRyb2w9UGUsdC5jb250cm9sPWJlLHQuQnJvd3Nlcj0kaSx0LkV2ZW50ZWQ9dWksdC5NaXhpbj1FZSx0LlV0aWw9YWksdC5DbGFzcz12LHQuSGFuZGxlcj1aZSx0LmV4dGVuZD1pLHQuYmluZD1lLHQuc3RhbXA9bix0LnNldE9wdGlvbnM9bCx0LkRvbUV2ZW50PWRlLHQuRG9tVXRpbD14ZSx0LlBvc0FuaW1hdGlvbj13ZSx0LkRyYWdnYWJsZT1CZSx0LkxpbmVVdGlsPU9lLHQuUG9seVV0aWw9UmUsdC5Qb2ludD14LHQucG9pbnQ9dyx0LkJvdW5kcz1QLHQuYm91bmRzPWIsdC5UcmFuc2Zvcm1hdGlvbj1aLHQudHJhbnNmb3JtYXRpb249Uyx0LlByb2plY3Rpb249amUsdC5MYXRMbmc9TSx0LmxhdExuZz1DLHQuTGF0TG5nQm91bmRzPVQsdC5sYXRMbmdCb3VuZHM9eix0LkNSUz1jaSx0Lkdlb0pTT049bm4sdC5nZW9KU09OPUt0LHQuZ2VvSnNvbj1zbix0LkxheWVyPVVlLHQuTGF5ZXJHcm91cD1WZSx0LmxheWVyR3JvdXA9ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IFZlKHQsaSl9LHQuRmVhdHVyZUdyb3VwPXFlLHQuZmVhdHVyZUdyb3VwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcWUodCl9LHQuSW1hZ2VPdmVybGF5PXJuLHQuaW1hZ2VPdmVybGF5PWZ1bmN0aW9uKHQsaSxlKXtyZXR1cm4gbmV3IHJuKHQsaSxlKX0sdC5WaWRlb092ZXJsYXk9YW4sdC52aWRlb092ZXJsYXk9ZnVuY3Rpb24odCxpLGUpe3JldHVybiBuZXcgYW4odCxpLGUpfSx0LkRpdk92ZXJsYXk9aG4sdC5Qb3B1cD11bix0LnBvcHVwPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIG5ldyB1bih0LGkpfSx0LlRvb2x0aXA9bG4sdC50b29sdGlwPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIG5ldyBsbih0LGkpfSx0Lkljb249R2UsdC5pY29uPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgR2UodCl9LHQuRGl2SWNvbj1jbix0LmRpdkljb249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBjbih0KX0sdC5NYXJrZXI9WGUsdC5tYXJrZXI9ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IFhlKHQsaSl9LHQuVGlsZUxheWVyPWRuLHQudGlsZUxheWVyPVl0LHQuR3JpZExheWVyPV9uLHQuZ3JpZExheWVyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgX24odCl9LHQuU1ZHPXhuLHQuc3ZnPUp0LHQuUmVuZGVyZXI9bW4sdC5DYW52YXM9Zm4sdC5jYW52YXM9WHQsdC5QYXRoPUplLHQuQ2lyY2xlTWFya2VyPSRlLHQuY2lyY2xlTWFya2VyPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIG5ldyAkZSh0LGkpfSx0LkNpcmNsZT1RZSx0LmNpcmNsZT1mdW5jdGlvbih0LGksZSl7cmV0dXJuIG5ldyBRZSh0LGksZSl9LHQuUG9seWxpbmU9dG4sdC5wb2x5bGluZT1mdW5jdGlvbih0LGkpe3JldHVybiBuZXcgdG4odCxpKX0sdC5Qb2x5Z29uPWVuLHQucG9seWdvbj1mdW5jdGlvbih0LGkpe3JldHVybiBuZXcgZW4odCxpKX0sdC5SZWN0YW5nbGU9d24sdC5yZWN0YW5nbGU9ZnVuY3Rpb24odCxpKXtyZXR1cm4gbmV3IHduKHQsaSl9LHQuTWFwPUxlLHQubWFwPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIG5ldyBMZSh0LGkpfX0pOw=="></script>
<link href="data:text/css,%0Aimg%2Eleaflet%2Dtile%20%7B%0Apadding%3A%200%3B%0Amargin%3A%200%3B%0Aborder%2Dradius%3A%200%3B%0Aborder%3A%20none%3B%0A%7D%0A%2Einfo%20%7B%0Apadding%3A%206px%208px%3B%0Afont%3A%2014px%2F16px%20Arial%2C%20Helvetica%2C%20sans%2Dserif%3B%0Abackground%3A%20white%3B%0Abackground%3A%20rgba%28255%2C255%2C255%2C0%2E8%29%3B%0Abox%2Dshadow%3A%200%200%2015px%20rgba%280%2C0%2C0%2C0%2E2%29%3B%0Aborder%2Dradius%3A%205px%3B%0A%7D%0A%2Elegend%20%7B%0Aline%2Dheight%3A%2018px%3B%0Acolor%3A%20%23555%3B%0A%7D%0A%2Elegend%20svg%20text%20%7B%0Afill%3A%20%23555%3B%0A%7D%0A%2Elegend%20svg%20line%20%7B%0Astroke%3A%20%23555%3B%0A%7D%0A%2Elegend%20i%20%7B%0Awidth%3A%2018px%3B%0Aheight%3A%2018px%3B%0Amargin%2Dright%3A%204px%3B%0Aopacity%3A%200%2E7%3B%0Adisplay%3A%20inline%2Dblock%3B%0Avertical%2Dalign%3A%20top%3B%0A%0Azoom%3A%201%3B%0A%2Adisplay%3A%20inline%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/javascript;base64,IWZ1bmN0aW9uKHQscyl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1zKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUocyk6dC5wcm9qND1zKCl9KHRoaXMsZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gayh0LHMpe2lmKHRbc10pcmV0dXJuIHRbc107Zm9yKHZhciBpLGE9T2JqZWN0LmtleXModCksaD1zLnRvTG93ZXJDYXNlKCkucmVwbGFjZShILCIiKSxlPS0xOysrZTxhLmxlbmd0aDspaWYoKGk9YVtlXSkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKEgsIiIpPT09aClyZXR1cm4gdFtpXX1mdW5jdGlvbiBlKHQpe2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIm5vdCBhIHN0cmluZyIpO3RoaXMudGV4dD10LnRyaW0oKSx0aGlzLmxldmVsPTAsdGhpcy5wbGFjZT0wLHRoaXMucm9vdD1udWxsLHRoaXMuc3RhY2s9W10sdGhpcy5jdXJyZW50T2JqZWN0PW51bGwsdGhpcy5zdGF0ZT1LfWZ1bmN0aW9uIGgodCxzLGkpe0FycmF5LmlzQXJyYXkocykmJihpLnVuc2hpZnQocykscz1udWxsKTt2YXIgYT1zP3t9OnQsaD1pLnJlZHVjZShmdW5jdGlvbih0LHMpe3JldHVybiBuKHMsdCksdH0sYSk7cyYmKHRbc109aCl9ZnVuY3Rpb24gbih0LHMpe2lmKEFycmF5LmlzQXJyYXkodCkpe3ZhciBpLGE9dC5zaGlmdCgpO2lmKCJQQVJBTUVURVIiPT09YSYmKGE9dC5zaGlmdCgpKSwxPT09dC5sZW5ndGgpcmV0dXJuIEFycmF5LmlzQXJyYXkodFswXSk/KHNbYV09e30sdm9pZCBuKHRbMF0sc1thXSkpOnZvaWQoc1thXT10WzBdKTtpZih0Lmxlbmd0aClpZigiVE9XR1M4NCIhPT1hKXtpZigiQVhJUyI9PT1hKXJldHVybiBhIGluIHN8fChzW2FdPVtdKSx2b2lkIHNbYV0ucHVzaCh0KTtzd2l0Y2goQXJyYXkuaXNBcnJheShhKXx8KHNbYV09e30pLGEpe2Nhc2UiVU5JVCI6Y2FzZSJQUklNRU0iOmNhc2UiVkVSVF9EQVRVTSI6cmV0dXJuIHNbYV09e25hbWU6dFswXS50b0xvd2VyQ2FzZSgpLGNvbnZlcnQ6dFsxXX0sdm9pZCgzPT09dC5sZW5ndGgmJm4odFsyXSxzW2FdKSk7Y2FzZSJTUEhFUk9JRCI6Y2FzZSJFTExJUFNPSUQiOnJldHVybiBzW2FdPXtuYW1lOnRbMF0sYTp0WzFdLHJmOnRbMl19LHZvaWQoND09PXQubGVuZ3RoJiZuKHRbM10sc1thXSkpO2Nhc2UiUFJPSkVDVEVEQ1JTIjpjYXNlIlBST0pDUlMiOmNhc2UiR0VPR0NTIjpjYXNlIkdFT0NDUyI6Y2FzZSJQUk9KQ1MiOmNhc2UiTE9DQUxfQ1MiOmNhc2UiR0VPRENSUyI6Y2FzZSJHRU9ERVRJQ0NSUyI6Y2FzZSJHRU9ERVRJQ0RBVFVNIjpjYXNlIkVEQVRVTSI6Y2FzZSJFTkdJTkVFUklOR0RBVFVNIjpjYXNlIlZFUlRfQ1MiOmNhc2UiVkVSVENSUyI6Y2FzZSJWRVJUSUNBTENSUyI6Y2FzZSJDT01QRF9DUyI6Y2FzZSJDT01QT1VORENSUyI6Y2FzZSJFTkdJTkVFUklOR0NSUyI6Y2FzZSJFTkdDUlMiOmNhc2UiRklUVEVEX0NTIjpjYXNlIkxPQ0FMX0RBVFVNIjpjYXNlIkRBVFVNIjpyZXR1cm4gdFswXT1bIm5hbWUiLHRbMF1dLHZvaWQgaChzLGEsdCk7ZGVmYXVsdDpmb3IoaT0tMTsrK2k8dC5sZW5ndGg7KWlmKCFBcnJheS5pc0FycmF5KHRbaV0pKXJldHVybiBuKHQsc1thXSk7cmV0dXJuIGgocyxhLHQpfX1lbHNlIHNbYV09dDtlbHNlIHNbYV09ITB9ZWxzZSBzW3RdPSEwfWZ1bmN0aW9uIHIodCl7cmV0dXJuIHQqaXR9ZnVuY3Rpb24gbyhlKXtmdW5jdGlvbiB0KHQpe3JldHVybiB0KihlLnRvX21ldGVyfHwxKX1pZigiR0VPR0NTIj09PWUudHlwZT9lLnByb2pOYW1lPSJsb25nbGF0IjoiTE9DQUxfQ1MiPT09ZS50eXBlPyhlLnByb2pOYW1lPSJpZGVudGl0eSIsZS5sb2NhbD0hMCk6Im9iamVjdCI9PXR5cGVvZiBlLlBST0pFQ1RJT04/ZS5wcm9qTmFtZT1PYmplY3Qua2V5cyhlLlBST0pFQ1RJT04pWzBdOmUucHJvak5hbWU9ZS5QUk9KRUNUSU9OLGUuQVhJUyl7Zm9yKHZhciBzPSIiLGk9MCxhPWUuQVhJUy5sZW5ndGg7aTxhOysraSl7dmFyIGg9ZS5BWElTW2ldWzBdLnRvTG93ZXJDYXNlKCk7LTEhPT1oLmluZGV4T2YoIm5vcnRoIik/cys9Im4iOi0xIT09aC5pbmRleE9mKCJzb3V0aCIpP3MrPSJzIjotMSE9PWguaW5kZXhPZigiZWFzdCIpP3MrPSJlIjotMSE9PWguaW5kZXhPZigid2VzdCIpJiYocys9InciKX0yPT09cy5sZW5ndGgmJihzKz0idSIpLDM9PT1zLmxlbmd0aCYmKGUuYXhpcz1zKX1lLlVOSVQmJihlLnVuaXRzPWUuVU5JVC5uYW1lLnRvTG93ZXJDYXNlKCksIm1ldHJlIj09PWUudW5pdHMmJihlLnVuaXRzPSJtZXRlciIpLGUuVU5JVC5jb252ZXJ0JiYoIkdFT0dDUyI9PT1lLnR5cGU/ZS5EQVRVTSYmZS5EQVRVTS5TUEhFUk9JRCYmKGUudG9fbWV0ZXI9ZS5VTklULmNvbnZlcnQqZS5EQVRVTS5TUEhFUk9JRC5hKTplLnRvX21ldGVyPWUuVU5JVC5jb252ZXJ0KSk7dmFyIG49ZS5HRU9HQ1M7IkdFT0dDUyI9PT1lLnR5cGUmJihuPWUpLG4mJihuLkRBVFVNP2UuZGF0dW1Db2RlPW4uREFUVU0ubmFtZS50b0xvd2VyQ2FzZSgpOmUuZGF0dW1Db2RlPW4ubmFtZS50b0xvd2VyQ2FzZSgpLCJkXyI9PT1lLmRhdHVtQ29kZS5zbGljZSgwLDIpJiYoZS5kYXR1bUNvZGU9ZS5kYXR1bUNvZGUuc2xpY2UoMikpLCJuZXdfemVhbGFuZF9nZW9kZXRpY19kYXR1bV8xOTQ5IiE9PWUuZGF0dW1Db2RlJiYibmV3X3plYWxhbmRfMTk0OSIhPT1lLmRhdHVtQ29kZXx8KGUuZGF0dW1Db2RlPSJuemdkNDkiKSwid2dzXzE5ODQiIT09ZS5kYXR1bUNvZGUmJiJ3b3JsZF9nZW9kZXRpY19zeXN0ZW1fMTk4NCIhPT1lLmRhdHVtQ29kZXx8KCJNZXJjYXRvcl9BdXhpbGlhcnlfU3BoZXJlIj09PWUuUFJPSkVDVElPTiYmKGUuc3BoZXJlPSEwKSxlLmRhdHVtQ29kZT0id2dzODQiKSwiX2ZlcnJvIj09PWUuZGF0dW1Db2RlLnNsaWNlKC02KSYmKGUuZGF0dW1Db2RlPWUuZGF0dW1Db2RlLnNsaWNlKDAsLTYpKSwiX2pha2FydGEiPT09ZS5kYXR1bUNvZGUuc2xpY2UoLTgpJiYoZS5kYXR1bUNvZGU9ZS5kYXR1bUNvZGUuc2xpY2UoMCwtOCkpLH5lLmRhdHVtQ29kZS5pbmRleE9mKCJiZWxnZSIpJiYoZS5kYXR1bUNvZGU9InJuYjcyIiksbi5EQVRVTSYmbi5EQVRVTS5TUEhFUk9JRCYmKGUuZWxscHM9bi5EQVRVTS5TUEhFUk9JRC5uYW1lLnJlcGxhY2UoIl8xOSIsIiIpLnJlcGxhY2UoL1tDY11sYXJrZVxfMTgvLCJjbHJrIiksImludGVybmF0aW9uYWwiPT09ZS5lbGxwcy50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsMTMpJiYoZS5lbGxwcz0iaW50bCIpLGUuYT1uLkRBVFVNLlNQSEVST0lELmEsZS5yZj1wYXJzZUZsb2F0KG4uREFUVU0uU1BIRVJPSUQucmYsMTApKSxuLkRBVFVNJiZuLkRBVFVNLlRPV0dTODQmJihlLmRhdHVtX3BhcmFtcz1uLkRBVFVNLlRPV0dTODQpLH5lLmRhdHVtQ29kZS5pbmRleE9mKCJvc2diXzE5MzYiKSYmKGUuZGF0dW1Db2RlPSJvc2diMzYiKSx+ZS5kYXR1bUNvZGUuaW5kZXhPZigib3NuaV8xOTUyIikmJihlLmRhdHVtQ29kZT0ib3NuaTUyIiksKH5lLmRhdHVtQ29kZS5pbmRleE9mKCJ0bTY1Iil8fH5lLmRhdHVtQ29kZS5pbmRleE9mKCJnZW9kZXRpY19kYXR1bV9vZl8xOTY1IikpJiYoZS5kYXR1bUNvZGU9ImlyZTY1IiksImNoMTkwMysiPT09ZS5kYXR1bUNvZGUmJihlLmRhdHVtQ29kZT0iY2gxOTAzIiksfmUuZGF0dW1Db2RlLmluZGV4T2YoImlzcmFlbCIpJiYoZS5kYXR1bUNvZGU9ImlzcjkzIikpLGUuYiYmIWlzRmluaXRlKGUuYikmJihlLmI9ZS5hKSxbWyJzdGFuZGFyZF9wYXJhbGxlbF8xIiwiU3RhbmRhcmRfUGFyYWxsZWxfMSJdLFsic3RhbmRhcmRfcGFyYWxsZWxfMiIsIlN0YW5kYXJkX1BhcmFsbGVsXzIiXSxbImZhbHNlX2Vhc3RpbmciLCJGYWxzZV9FYXN0aW5nIl0sWyJmYWxzZV9ub3J0aGluZyIsIkZhbHNlX05vcnRoaW5nIl0sWyJjZW50cmFsX21lcmlkaWFuIiwiQ2VudHJhbF9NZXJpZGlhbiJdLFsibGF0aXR1ZGVfb2Zfb3JpZ2luIiwiTGF0aXR1ZGVfT2ZfT3JpZ2luIl0sWyJsYXRpdHVkZV9vZl9vcmlnaW4iLCJDZW50cmFsX1BhcmFsbGVsIl0sWyJzY2FsZV9mYWN0b3IiLCJTY2FsZV9GYWN0b3IiXSxbImswIiwic2NhbGVfZmFjdG9yIl0sWyJsYXRpdHVkZV9vZl9jZW50ZXIiLCJMYXRpdHVkZV9PZl9DZW50ZXIiXSxbImxhdGl0dWRlX29mX2NlbnRlciIsIkxhdGl0dWRlX29mX2NlbnRlciJdLFsibGF0MCIsImxhdGl0dWRlX29mX2NlbnRlciIscl0sWyJsb25naXR1ZGVfb2ZfY2VudGVyIiwiTG9uZ2l0dWRlX09mX0NlbnRlciJdLFsibG9uZ2l0dWRlX29mX2NlbnRlciIsIkxvbmdpdHVkZV9vZl9jZW50ZXIiXSxbImxvbmdjIiwibG9uZ2l0dWRlX29mX2NlbnRlciIscl0sWyJ4MCIsImZhbHNlX2Vhc3RpbmciLHRdLFsieTAiLCJmYWxzZV9ub3J0aGluZyIsdF0sWyJsb25nMCIsImNlbnRyYWxfbWVyaWRpYW4iLHJdLFsibGF0MCIsImxhdGl0dWRlX29mX29yaWdpbiIscl0sWyJsYXQwIiwic3RhbmRhcmRfcGFyYWxsZWxfMSIscl0sWyJsYXQxIiwic3RhbmRhcmRfcGFyYWxsZWxfMSIscl0sWyJsYXQyIiwic3RhbmRhcmRfcGFyYWxsZWxfMiIscl0sWyJhemltdXRoIiwiQXppbXV0aCJdLFsiYWxwaGEiLCJhemltdXRoIixyXSxbInNyc0NvZGUiLCJuYW1lIl1dLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHM9ZSxhPShpPXQpWzBdLGg9aVsxXSx2b2lkKCEoYSBpbiBzKSYmaCBpbiBzJiYoc1thXT1zW2hdLDM9PT1pLmxlbmd0aCYmKHNbYV09aVsyXShzW2FdKSkpKTt2YXIgcyxpLGEsaH0pLGUubG9uZzB8fCFlLmxvbmdjfHwiQWxiZXJzX0NvbmljX0VxdWFsX0FyZWEiIT09ZS5wcm9qTmFtZSYmIkxhbWJlcnRfQXppbXV0aGFsX0VxdWFsX0FyZWEiIT09ZS5wcm9qTmFtZXx8KGUubG9uZzA9ZS5sb25nYyksZS5sYXRfdHN8fCFlLmxhdDF8fCJTdGVyZW9ncmFwaGljX1NvdXRoX1BvbGUiIT09ZS5wcm9qTmFtZSYmIlBvbGFyIFN0ZXJlb2dyYXBoaWMgKHZhcmlhbnQgQikiIT09ZS5wcm9qTmFtZXx8KGUubGF0MD1yKDA8ZS5sYXQxPzkwOi05MCksZS5sYXRfdHM9ZS5sYXQxKX1mdW5jdGlvbiBsKHQpe3ZhciBzPXRoaXM7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1sxXTsic3RyaW5nIj09dHlwZW9mIGk/IisiPT09aS5jaGFyQXQoMCk/bFt0XT1KKGFyZ3VtZW50c1sxXSk6bFt0XT1hdChhcmd1bWVudHNbMV0pOmxbdF09aX1lbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0Lm1hcChmdW5jdGlvbih0KXtBcnJheS5pc0FycmF5KHQpP2wuYXBwbHkocyx0KTpsKHQpfSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZih0IGluIGwpcmV0dXJuIGxbdF19ZWxzZSJFUFNHImluIHQ/bFsiRVBTRzoiK3QuRVBTR109dDoiRVNSSSJpbiB0P2xbIkVTUkk6Iit0LkVTUkldPXQ6IklBVTIwMDAiaW4gdD9sWyJJQVUyMDAwOiIrdC5JQVUyMDAwXT10OmNvbnNvbGUubG9nKHQpO3JldHVybn19ZnVuY3Rpb24gRSh0KXtpZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIHQ7aWYodCBpbiBsKXJldHVybiBsW3RdO2lmKGE9dCxsdC5zb21lKGZ1bmN0aW9uKHQpe3JldHVybi0xPGEuaW5kZXhPZih0KX0pKXt2YXIgcz1hdCh0KTtpZihmdW5jdGlvbih0KXt2YXIgcz1rKHQsImF1dGhvcml0eSIpO2lmKHMpe3ZhciBpPWsocywiZXBzZyIpO3JldHVybiBpJiYtMTxNdC5pbmRleE9mKGkpfX0ocykpcmV0dXJuIGxbIkVQU0c6Mzg1NyJdO3ZhciBpPWZ1bmN0aW9uKHQpe3ZhciBzPWsodCwiZXh0ZW5zaW9uIik7aWYocylyZXR1cm4gayhzLCJwcm9qNCIpfShzKTtyZXR1cm4gaT9KKGkpOnN9dmFyIGE7cmV0dXJuIisiPT09dFswXT9KKHQpOnZvaWQgMH1mdW5jdGlvbiB0KHQpe3JldHVybiB0fWZ1bmN0aW9uIHModCxzKXt2YXIgaT1tdC5sZW5ndGg7cmV0dXJuIHQubmFtZXM/KChtdFtpXT10KS5uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Z0W3QudG9Mb3dlckNhc2UoKV09aX0pLHRoaXMpOihjb25zb2xlLmxvZyhzKSwhMCl9ZnVuY3Rpb24gcSh0LHMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHEpKXJldHVybiBuZXcgcSh0KTtzPXN8fGZ1bmN0aW9uKHQpe2lmKHQpdGhyb3cgdH07dmFyIGksYSxoLGUsbixyLG8sbCxNLGMsdSxmLG0scCxkLHksXyx4LGcsYix2LHcsQyxQLFMsTj1FKHQpOyJvYmplY3QiPT10eXBlb2YgTiYmKGk9cS5wcm9qZWN0aW9ucy5nZXQoTi5wcm9qTmFtZSkpPyghTi5kYXR1bUNvZGV8fCJub25lIj09PU4uZGF0dW1Db2RlfHwoYT1rKF90LE4uZGF0dW1Db2RlKSkmJihOLmRhdHVtX3BhcmFtcz1hLnRvd2dzODQ/YS50b3dnczg0LnNwbGl0KCIsIik6bnVsbCxOLmVsbHBzPWEuZWxsaXBzZSxOLmRhdHVtTmFtZT1hLmRhdHVtTmFtZT9hLmRhdHVtTmFtZTpOLmRhdHVtQ29kZSksTi5rMD1OLmswfHwxLE4uYXhpcz1OLmF4aXN8fCJlbnUiLE4uZWxscHM9Ti5lbGxwc3x8Indnczg0IixiPU4uYSx2PU4uYix3PU4ucmYsQz1OLmVsbHBzLFA9Ti5zcGhlcmUsYnx8KGI9KFM9KFM9ayhkdCxDKSl8fHl0KS5hLHY9Uy5iLHc9Uy5yZiksdyYmIXYmJih2PSgxLTEvdykqYiksKDA9PT13fHxNYXRoLmFicyhiLXYpPEQpJiYoUD0hMCx2PWIpLG09KGg9e2E6YixiOnYscmY6dyxzcGhlcmU6UH0pLmEscD1oLmIsZD1OLlJfQSx4PSgoeT1tKm0pLShfPXAqcCkpL3ksZz0wLGQ/KHk9KG0qPTEteCooUit4KihMK3gqVCkpKSptLHg9MCk6Zz1NYXRoLnNxcnQoeCksZT17ZXM6eCxlOmcsZXAyOih5LV8pL199LG49Ti5kYXR1bXx8KHI9Ti5kYXR1bUNvZGUsbz1OLmRhdHVtX3BhcmFtcyxsPWguYSxNPWguYixjPWUuZXMsdT1lLmVwMiwoZj17fSkuZGF0dW1fdHlwZT12b2lkIDA9PT1yfHwibm9uZSI9PT1yP0c6QSxvJiYoZi5kYXR1bV9wYXJhbXM9by5tYXAocGFyc2VGbG9hdCksMD09PWYuZGF0dW1fcGFyYW1zWzBdJiYwPT09Zi5kYXR1bV9wYXJhbXNbMV0mJjA9PT1mLmRhdHVtX3BhcmFtc1syXXx8KGYuZGF0dW1fdHlwZT1JKSwzPGYuZGF0dW1fcGFyYW1zLmxlbmd0aCYmKDA9PT1mLmRhdHVtX3BhcmFtc1szXSYmMD09PWYuZGF0dW1fcGFyYW1zWzRdJiYwPT09Zi5kYXR1bV9wYXJhbXNbNV0mJjA9PT1mLmRhdHVtX3BhcmFtc1s2XXx8KGYuZGF0dW1fdHlwZT1PLGYuZGF0dW1fcGFyYW1zWzNdKj1qLGYuZGF0dW1fcGFyYW1zWzRdKj1qLGYuZGF0dW1fcGFyYW1zWzVdKj1qLGYuZGF0dW1fcGFyYW1zWzZdPWYuZGF0dW1fcGFyYW1zWzZdLzFlNisxKSkpLGYuYT1sLGYuYj1NLGYuZXM9YyxmLmVwMj11LGYpLGN0KHRoaXMsTiksY3QodGhpcyxpKSx0aGlzLmE9aC5hLHRoaXMuYj1oLmIsdGhpcy5yZj1oLnJmLHRoaXMuc3BoZXJlPWguc3BoZXJlLHRoaXMuZXM9ZS5lcyx0aGlzLmU9ZS5lLHRoaXMuZXAyPWUuZXAyLHRoaXMuZGF0dW09bix0aGlzLmluaXQoKSxzKG51bGwsdGhpcykpOnModCl9ZnVuY3Rpb24gTSh0LHMsaSl7dmFyIGEsaCxlLG4scj10Lngsbz10LnksbD10Lno/dC56OjA7aWYobzwteiYmLTEuMDAxKno8bylvPS16O2Vsc2UgaWYoejxvJiZvPDEuMDAxKnopbz16O2Vsc2V7aWYobzwteilyZXR1cm57eDotMS8wLHk6LTEvMCx6OnQuen07aWYoejxvKXJldHVybnt4OjEvMCx5OjEvMCx6OnQuen19cmV0dXJuIHI+TWF0aC5QSSYmKHItPTIqTWF0aC5QSSksaD1NYXRoLnNpbihvKSxuPU1hdGguY29zKG8pLGU9aCpoLHt4OigoYT1pL01hdGguc3FydCgxLXMqZSkpK2wpKm4qTWF0aC5jb3MocikseTooYStsKSpuKk1hdGguc2luKHIpLHo6KGEqKDEtcykrbCkqaH19ZnVuY3Rpb24gYyh0LHMsaSxhKXt2YXIgaCxlLG4scixvLGwsTSxjLHUsZixtLHAsZCx5PXQueCxfPXQueSx4PXQuej90Lno6MCxnPU1hdGguc3FydCh5KnkrXypfKSxiPU1hdGguc3FydCh5KnkrXypfK3gqeCk7aWYoZy9pPDFlLTEyKXtpZihwPTAsYi9pPDFlLTEyKXJldHVybiBkPS1hLHt4OnQueCx5OnQueSx6OnQuen19ZWxzZSBwPU1hdGguYXRhbjIoXyx5KTtmb3IoaD14L2IsbD0oZT1nL2IpKigxLXMpKihuPTEvTWF0aC5zcXJ0KDEtcyooMi1zKSplKmUpKSxNPWgqbixtPTA7bSsrLHI9cyoobz1pL01hdGguc3FydCgxLXMqTSpNKSkvKG8rKGQ9ZypsK3gqTS1vKigxLXMqTSpNKSkpLGY9KHU9aCoobj0xL01hdGguc3FydCgxLXIqKDItcikqZSplKSkpKmwtKGM9ZSooMS1yKSpuKSpNLGw9YyxNPXUsMWUtMjQ8ZipmJiZtPDMwOyk7cmV0dXJue3g6cCx5Ok1hdGguYXRhbih1L01hdGguYWJzKGMpKSx6OmR9fWZ1bmN0aW9uIHUodCl7cmV0dXJuIHQ9PT1JfHx0PT09T31mdW5jdGlvbiBpKHQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBOdW1iZXIuaXNGaW5pdGUpe2lmKE51bWJlci5pc0Zpbml0ZSh0KSlyZXR1cm47dGhyb3cgbmV3IFR5cGVFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBiZSBmaW5pdGUgbnVtYmVycyIpfWlmKCJudW1iZXIiIT10eXBlb2YgdHx8dCE9dHx8IWlzRmluaXRlKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgZmluaXRlIG51bWJlcnMiKX1mdW5jdGlvbiBmKHQscyxpKXt2YXIgYSxoLGU7aWYoQXJyYXkuaXNBcnJheShpKSYmKGk9YnQoaSkpLHZ0KGkpLHQuZGF0dW0mJnMuZGF0dW0mJihlPXMsKChoPXQpLmRhdHVtLmRhdHVtX3R5cGU9PT1JfHxoLmRhdHVtLmRhdHVtX3R5cGU9PT1PKSYmIldHUzg0IiE9PWUuZGF0dW1Db2RlfHwoZS5kYXR1bS5kYXR1bV90eXBlPT09SXx8ZS5kYXR1bS5kYXR1bV90eXBlPT09TykmJiJXR1M4NCIhPT1oLmRhdHVtQ29kZSkmJihpPWYodCxhPW5ldyBxKCJXR1M4NCIpLGkpLHQ9YSksImVudSIhPT10LmF4aXMmJihpPWd0KHQsITEsaSkpLCJsb25nbGF0Ij09PXQucHJvak5hbWUpaT17eDppLngqTix5OmkueSpOLHo6aS56fHwwfTtlbHNlIGlmKHQudG9fbWV0ZXImJihpPXt4OmkueCp0LnRvX21ldGVyLHk6aS55KnQudG9fbWV0ZXIsejppLnp8fDB9KSwhKGk9dC5pbnZlcnNlKGkpKSlyZXR1cm47cmV0dXJuIHQuZnJvbV9ncmVlbndpY2gmJihpLngrPXQuZnJvbV9ncmVlbndpY2gpLGk9eHQodC5kYXR1bSxzLmRhdHVtLGkpLHMuZnJvbV9ncmVlbndpY2gmJihpPXt4OmkueC1zLmZyb21fZ3JlZW53aWNoLHk6aS55LHo6aS56fHwwfSksImxvbmdsYXQiPT09cy5wcm9qTmFtZT9pPXt4OmkueCpCLHk6aS55KkIsejppLnp8fDB9OihpPXMuZm9yd2FyZChpKSxzLnRvX21ldGVyJiYoaT17eDppLngvcy50b19tZXRlcix5OmkueS9zLnRvX21ldGVyLHo6aS56fHwwfSkpLCJlbnUiIT09cy5heGlzP2d0KHMsITAsaSk6aX1mdW5jdGlvbiBtKHMsaSxhKXt2YXIgdCxoLGU7cmV0dXJuIEFycmF5LmlzQXJyYXkoYSk/KHQ9ZihzLGksYSl8fHt4Ok5hTix5Ok5hTn0sMjxhLmxlbmd0aD92b2lkIDAhPT1zLm5hbWUmJiJnZW9jZW50Ij09PXMubmFtZXx8dm9pZCAwIT09aS5uYW1lJiYiZ2VvY2VudCI9PT1pLm5hbWU/Im51bWJlciI9PXR5cGVvZiB0Lno/W3QueCx0LnksdC56XS5jb25jYXQoYS5zcGxpY2UoMykpOlt0LngsdC55LGFbMl1dLmNvbmNhdChhLnNwbGljZSgzKSk6W3QueCx0LnldLmNvbmNhdChhLnNwbGljZSgyKSk6W3QueCx0LnldKTooaD1mKHMsaSxhKSwyPT09KGU9T2JqZWN0LmtleXMoYSkpLmxlbmd0aHx8ZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXMubmFtZSYmImdlb2NlbnQiPT09cy5uYW1lfHx2b2lkIDAhPT1pLm5hbWUmJiJnZW9jZW50Ij09PWkubmFtZSl7aWYoIngiPT09dHx8InkiPT09dHx8InoiPT09dClyZXR1cm59ZWxzZSBpZigieCI9PT10fHwieSI9PT10KXJldHVybjtoW3RdPWFbdF19KSxoKX1mdW5jdGlvbiBwKHQpe3JldHVybiB0IGluc3RhbmNlb2YgcT90OnQub1Byb2o/dC5vUHJvajpxKHQpfWZ1bmN0aW9uIGEocyxpLHQpe3M9cChzKTt2YXIgYSxoPSExO3JldHVybiB2b2lkIDA9PT1pPyhpPXMscz13dCxoPSEwKTp2b2lkIDA9PT1pLngmJiFBcnJheS5pc0FycmF5KGkpfHwodD1pLGk9cyxzPXd0LGg9ITApLGk9cChpKSx0P20ocyxpLHQpOihhPXtmb3J3YXJkOmZ1bmN0aW9uKHQpe3JldHVybiBtKHMsaSx0KX0saW52ZXJzZTpmdW5jdGlvbih0KXtyZXR1cm4gbShpLHMsdCl9fSxoJiYoYS5vUHJvaj1pKSxhKX1mdW5jdGlvbiBkKHQscyl7cmV0dXJuIHM9c3x8NSxpPWZ1bmN0aW9uKHQpe3ZhciBzLGksYSxoLGUsbixyPXQubGF0LG89dC5sb24sbD1fKHIpLE09XyhvKTtuPU1hdGguZmxvb3IoKG8rMTgwKS82KSsxLDE4MD09PW8mJihuPTYwKSw1Njw9ciYmcjw2NCYmMzw9byYmbzwxMiYmKG49MzIpLDcyPD1yJiZyPDg0JiYoMDw9byYmbzw5P249MzE6OTw9byYmbzwyMT9uPTMzOjIxPD1vJiZvPDMzP249MzU6MzM8PW8mJm88NDImJihuPTM3KSksZT1fKDYqKG4tMSktMTgwKzMpLHM9NjM3ODEzNy9NYXRoLnNxcnQoMS0uMDA2Njk0MzgqTWF0aC5zaW4obCkqTWF0aC5zaW4obCkpLGk9TWF0aC50YW4obCkqTWF0aC50YW4obCksYT0uMDA2NzM5NDk2NzUyMjY4NDUxKk1hdGguY29zKGwpKk1hdGguY29zKGwpO3ZhciBjPS45OTk2KnMqKChoPU1hdGguY29zKGwpKihNLWUpKSsoMS1pK2EpKmgqaCpoLzYrKDUtMTgqaStpKmkrNzIqYS0uMzkwODkwODExNjMxNTcwMTMpKmgqaCpoKmgqaC8xMjApKzVlNSx1PS45OTk2Kig2Mzc4MTM3KiguOTk4MzI0Mjk4NDUwMzI0MypsLS4wMDI1MTQ2MDcwNjQyMjgxNDQqTWF0aC5zaW4oMipsKSsyNjM5MDQ2NjAyMTI5OTgyZS0yMSpNYXRoLnNpbig0KmwpLTMuNDE4MDQ2MTAxNjk2ODU4ZS05Kk1hdGguc2luKDYqbCkpK3MqTWF0aC50YW4obCkqKGgqaC8yKyg1LWkrOSphKzQqYSphKSpoKmgqaCpoLzI0Kyg2MS01OCppK2kqaSs2MDAqYS0yLjIyNDAzMzkyODI0ODU4ODYpKmgqaCpoKmgqaCpoLzcyMCkpO3JldHVybiByPDAmJih1Kz0xZTcpLHtub3J0aGluZzpNYXRoLnJvdW5kKHUpLGVhc3Rpbmc6TWF0aC5yb3VuZChjKSx6b25lTnVtYmVyOm4sem9uZUxldHRlcjpmdW5jdGlvbih0KXt2YXIgcz0iWiI7cmV0dXJuIHQ8PTg0JiY3Mjw9dD9zPSJYIjp0PDcyJiY2NDw9dD9zPSJXIjp0PDY0JiY1Njw9dD9zPSJWIjp0PDU2JiY0ODw9dD9zPSJVIjp0PDQ4JiY0MDw9dD9zPSJUIjp0PDQwJiYzMjw9dD9zPSJTIjp0PDMyJiYyNDw9dD9zPSJSIjp0PDI0JiYxNjw9dD9zPSJRIjp0PDE2JiY4PD10P3M9IlAiOnQ8OCYmMDw9dD9zPSJOIjp0PDAmJi04PD10P3M9Ik0iOnQ8LTgmJi0xNjw9dD9zPSJMIjp0PC0xNiYmLTI0PD10P3M9IksiOnQ8LTI0JiYtMzI8PXQ/cz0iSiI6dDwtMzImJi00MDw9dD9zPSJIIjp0PC00MCYmLTQ4PD10P3M9IkciOnQ8LTQ4JiYtNTY8PXQ/cz0iRiI6dDwtNTYmJi02NDw9dD9zPSJFIjp0PC02NCYmLTcyPD10P3M9IkQiOnQ8LTcyJiYtODA8PXQmJihzPSJDIiksc30ocil9fSh7bGF0OnRbMV0sbG9uOnRbMF19KSxhPXMsaD0iMDAwMDAiK2kuZWFzdGluZyxlPSIwMDAwMCIraS5ub3J0aGluZyxpLnpvbmVOdW1iZXIraS56b25lTGV0dGVyK2Z1bmN0aW9uKHQscyxpKXt2YXIgYT1iKGkpO3JldHVybiBmdW5jdGlvbih0LHMsaSl7dmFyIGE9aS0xLGg9UHQuY2hhckNvZGVBdChhKSxlPVN0LmNoYXJDb2RlQXQoYSksbj1oK3QtMSxyPWUrcyxvPSExO3JldHVybiBJdDxuJiYobj1uLUl0K050LTEsbz0hMCksKG49PT1rdHx8aDxrdCYma3Q8bnx8KGt0PG58fGg8a3QpJiZvKSYmbisrLChuPT09RXR8fGg8RXQmJkV0PG58fChFdDxufHxoPEV0KSYmbykmJisrbj09PWt0JiZuKyssSXQ8biYmKG49bi1JdCtOdC0xKSxvPXF0PHImJihyPXItcXQrTnQtMSwhMCksKHI9PT1rdHx8ZTxrdCYma3Q8cnx8KGt0PHJ8fGU8a3QpJiZvKSYmcisrLChyPT09RXR8fGU8RXQmJkV0PHJ8fChFdDxyfHxlPEV0KSYmbykmJisrcj09PWt0JiZyKysscXQ8ciYmKHI9ci1xdCtOdC0xKSxTdHJpbmcuZnJvbUNoYXJDb2RlKG4pK1N0cmluZy5mcm9tQ2hhckNvZGUocil9KE1hdGguZmxvb3IodC8xZTUpLE1hdGguZmxvb3Iocy8xZTUpJTIwLGEpfShpLmVhc3RpbmcsaS5ub3J0aGluZyxpLnpvbmVOdW1iZXIpK2guc3Vic3RyKGgubGVuZ3RoLTUsYSkrZS5zdWJzdHIoZS5sZW5ndGgtNSxhKTt2YXIgaSxhLGgsZX1mdW5jdGlvbiB5KHQpe3ZhciBzPWcodih0LnRvVXBwZXJDYXNlKCkpKTtyZXR1cm4gcy5sYXQmJnMubG9uP1tzLmxvbixzLmxhdF06WyhzLmxlZnQrcy5yaWdodCkvMiwocy50b3Arcy5ib3R0b20pLzJdfWZ1bmN0aW9uIF8odCl7cmV0dXJuIHQqKE1hdGguUEkvMTgwKX1mdW5jdGlvbiB4KHQpe3JldHVybiB0L01hdGguUEkqMTgwfWZ1bmN0aW9uIGcodCl7dmFyIHM9dC5ub3J0aGluZyxpPXQuZWFzdGluZyxhPXQuem9uZUxldHRlcixoPXQuem9uZU51bWJlcjtpZihoPDB8fDYwPGgpcmV0dXJuIG51bGw7dmFyIGUsbixyLG8sbCxNLGMsdSxmPSgxLU1hdGguc3FydCguOTkzMzA1NjIpKS8oMStNYXRoLnNxcnQoLjk5MzMwNTYyKSksbT1pLTVlNSxwPXM7YTwiTiImJihwLT0xZTcpLE09NiooaC0xKS0xODArMyx1PShjPXAvLjk5OTYvNjM2NzQ0OS4xNDU5NDUwNTYpKygzKmYvMi0yNypmKmYqZi8zMikqTWF0aC5zaW4oMipjKSsoMjEqZipmLzE2LTU1KmYqZipmKmYvMzIpKk1hdGguc2luKDQqYykrMTUxKmYqZipmLzk2Kk1hdGguc2luKDYqYyksZT02Mzc4MTM3L01hdGguc3FydCgxLS4wMDY2OTQzOCpNYXRoLnNpbih1KSpNYXRoLnNpbih1KSksbj1NYXRoLnRhbih1KSpNYXRoLnRhbih1KSxyPS4wMDY3Mzk0OTY3NTIyNjg0NTEqTWF0aC5jb3ModSkqTWF0aC5jb3ModSksbz02MzM1NDM5LjMyNzIyOTk0L01hdGgucG93KDEtLjAwNjY5NDM4Kk1hdGguc2luKHUpKk1hdGguc2luKHUpLDEuNSksbD1tLyguOTk5NiplKTt2YXIgZCx5PXgoeT11LWUqTWF0aC50YW4odSkvbyoobCpsLzItKDUrMypuKzEwKnItNCpyKnItLjA2MDY1NTQ3MDc3MDQxNjA2KSpsKmwqbCpsLzI0Kyg2MSs5MCpuKzI5OCpyKzQ1Km4qbi0xLjY5ODM1MzE4MTU3MTY0OTctMypyKnIpKmwqbCpsKmwqbCpsLzcyMCkpLF89TSt4KF89KGwtKDErMipuK3IpKmwqbCpsLzYrKDUtMipyKzI4Km4tMypyKnIrLjA1MzkxNTk3NDAxODE0NzYxKzI0Km4qbikqbCpsKmwqbCpsLzEyMCkvTWF0aC5jb3ModSkpO3JldHVybiB0LmFjY3VyYWN5P3t0b3A6KGQ9Zyh7bm9ydGhpbmc6dC5ub3J0aGluZyt0LmFjY3VyYWN5LGVhc3Rpbmc6dC5lYXN0aW5nK3QuYWNjdXJhY3ksem9uZUxldHRlcjp0LnpvbmVMZXR0ZXIsem9uZU51bWJlcjp0LnpvbmVOdW1iZXJ9KSkubGF0LHJpZ2h0OmQubG9uLGJvdHRvbTp5LGxlZnQ6X306e2xhdDp5LGxvbjpffX1mdW5jdGlvbiBiKHQpe3ZhciBzPXQlQ3Q7cmV0dXJuIDA9PT1zJiYocz1DdCksc31mdW5jdGlvbiB2KHQpe2lmKHQmJjA9PT10Lmxlbmd0aCl0aHJvdyJNR1JTUG9pbnQgY292ZXJ0aW5nIGZyb20gbm90aGluZyI7Zm9yKHZhciBzLGk9dC5sZW5ndGgsYT1udWxsLGg9IiIsZT0wOyEvW0EtWl0vLnRlc3Qocz10LmNoYXJBdChlKSk7KXtpZigyPD1lKXRocm93Ik1HUlNQb2ludCBiYWQgY29udmVyc2lvbiBmcm9tOiAiK3Q7aCs9cyxlKyt9dmFyIG49cGFyc2VJbnQoaCwxMCk7aWYoMD09PWV8fGk8ZSszKXRocm93Ik1HUlNQb2ludCBiYWQgY29udmVyc2lvbiBmcm9tOiAiK3Q7dmFyIHI9dC5jaGFyQXQoZSsrKTtpZihyPD0iQSJ8fCJCIj09PXJ8fCJZIj09PXJ8fCJaIjw9cnx8IkkiPT09cnx8Ik8iPT09cil0aHJvdyJNR1JTUG9pbnQgem9uZSBsZXR0ZXIgIityKyIgbm90IGhhbmRsZWQ6ICIrdDthPXQuc3Vic3RyaW5nKGUsZSs9Mik7Zm9yKHZhciBvPWIobiksbD1mdW5jdGlvbih0LHMpe2Zvcih2YXIgaT1QdC5jaGFyQ29kZUF0KHMtMSksYT0xZTUsaD0hMTtpIT09dC5jaGFyQ29kZUF0KDApOyl7aWYoKytpPT09a3QmJmkrKyxpPT09RXQmJmkrKyxJdDxpKXtpZihoKXRocm93IkJhZCBjaGFyYWN0ZXI6ICIrdDtpPU50LGg9ITB9YSs9MWU1fXJldHVybiBhfShhLmNoYXJBdCgwKSxvKSxNPWZ1bmN0aW9uKHQscyl7aWYoIlYiPHQpdGhyb3ciTUdSU1BvaW50IGdpdmVuIGludmFsaWQgTm9ydGhpbmcgIit0O2Zvcih2YXIgaT1TdC5jaGFyQ29kZUF0KHMtMSksYT0wLGg9ITE7aSE9PXQuY2hhckNvZGVBdCgwKTspe2lmKCsraT09PWt0JiZpKyssaT09PUV0JiZpKysscXQ8aSl7aWYoaCl0aHJvdyJCYWQgY2hhcmFjdGVyOiAiK3Q7aT1OdCxoPSEwfWErPTFlNX1yZXR1cm4gYX0oYS5jaGFyQXQoMSksbyk7TTx3KHIpOylNKz0yZTY7dmFyIGM9aS1lO2lmKGMlMiE9MCl0aHJvdyJNR1JTUG9pbnQgaGFzIHRvIGhhdmUgYW4gZXZlbiBudW1iZXIgXG5vZiBkaWdpdHMgYWZ0ZXIgdGhlIHpvbmUgbGV0dGVyIGFuZCB0d28gMTAwa20gbGV0dGVycyAtIGZyb250IFxuaGFsZiBmb3IgZWFzdGluZyBtZXRlcnMsIHNlY29uZCBoYWxmIGZvciBcbm5vcnRoaW5nIG1ldGVycyIrdDt2YXIgdSxmLG0scD1jLzIsZD0wLHk9MDtyZXR1cm4gMDxwJiYodT0xZTUvTWF0aC5wb3coMTAscCksZj10LnN1YnN0cmluZyhlLGUrcCksZD1wYXJzZUZsb2F0KGYpKnUsbT10LnN1YnN0cmluZyhlK3ApLHk9cGFyc2VGbG9hdChtKSp1KSx7ZWFzdGluZzpkK2wsbm9ydGhpbmc6eStNLHpvbmVMZXR0ZXI6cix6b25lTnVtYmVyOm4sYWNjdXJhY3k6dX19ZnVuY3Rpb24gdyh0KXt2YXIgcztzd2l0Y2godCl7Y2FzZSJDIjpzPTExZTU7YnJlYWs7Y2FzZSJEIjpzPTJlNjticmVhaztjYXNlIkUiOnM9MjhlNTticmVhaztjYXNlIkYiOnM9MzdlNTticmVhaztjYXNlIkciOnM9NDZlNTticmVhaztjYXNlIkgiOnM9NTVlNTticmVhaztjYXNlIkoiOnM9NjRlNTticmVhaztjYXNlIksiOnM9NzNlNTticmVhaztjYXNlIkwiOnM9ODJlNTticmVhaztjYXNlIk0iOnM9OTFlNTticmVhaztjYXNlIk4iOnM9MDticmVhaztjYXNlIlAiOnM9OGU1O2JyZWFrO2Nhc2UiUSI6cz0xN2U1O2JyZWFrO2Nhc2UiUiI6cz0yNmU1O2JyZWFrO2Nhc2UiUyI6cz0zNWU1O2JyZWFrO2Nhc2UiVCI6cz00NGU1O2JyZWFrO2Nhc2UiVSI6cz01M2U1O2JyZWFrO2Nhc2UiViI6cz02MmU1O2JyZWFrO2Nhc2UiVyI6cz03ZTY7YnJlYWs7Y2FzZSJYIjpzPTc5ZTU7YnJlYWs7ZGVmYXVsdDpzPS0xfWlmKDA8PXMpcmV0dXJuIHM7dGhyb3ciSW52YWxpZCB6b25lIGxldHRlcjogIit0fWZ1bmN0aW9uIEModCxzLGkpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEMpKXJldHVybiBuZXcgQyh0LHMsaSk7dmFyIGE7QXJyYXkuaXNBcnJheSh0KT8odGhpcy54PXRbMF0sdGhpcy55PXRbMV0sdGhpcy56PXRbMl18fDApOiJvYmplY3QiPT10eXBlb2YgdD8odGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10Lnp8fDApOiJzdHJpbmciPT10eXBlb2YgdCYmdm9pZCAwPT09cz8oYT10LnNwbGl0KCIsIiksdGhpcy54PXBhcnNlRmxvYXQoYVswXSwxMCksdGhpcy55PXBhcnNlRmxvYXQoYVsxXSwxMCksdGhpcy56PXBhcnNlRmxvYXQoYVsyXSwxMCl8fDApOih0aGlzLng9dCx0aGlzLnk9cyx0aGlzLno9aXx8MCksY29uc29sZS53YXJuKCJwcm9qNC5Qb2ludCB3aWxsIGJlIHJlbW92ZWQgaW4gdmVyc2lvbiAzLCB1c2UgcHJvajQudG9Qb2ludCIpfWZ1bmN0aW9uIFAodCxzLGksYSl7dmFyIGg7cmV0dXJuIHQ8RD8oYS52YWx1ZT1PcyxoPTApOihoPU1hdGguYXRhbjIocyxpKSxNYXRoLmFicyhoKTw9VT9hLnZhbHVlPU9zOlU8aCYmaDw9eitVPyhhLnZhbHVlPUFzLGgtPXopOnorVTxofHxoPD0tKHorVSk/KGEudmFsdWU9R3MsaD0wPD1oP2gtUTpoK1EpOihhLnZhbHVlPWpzLGgrPXopKSxofWZ1bmN0aW9uIFModCxzKXt2YXIgaT10K3M7cmV0dXJuIGk8LVE/aSs9RjorUTxpJiYoaS09RiksaX12YXIgST0xLE89MixBPTQsRz01LGo9NDg0ODEzNjgxMTA5NTM2ZS0yMCx6PU1hdGguUEkvMixSPS4xNjY2NjY2NjY2NjY2NjY2NixMPS4wNDcyMjIyMjIyMjIyMjIyMixUPS4wMjIxNTYwODQ2NTYwODQ2NTUsRD0xZS0xMCxOPS4wMTc0NTMyOTI1MTk5NDMyOTUsQj01Ny4yOTU3Nzk1MTMwODIzMixVPU1hdGguUEkvNCxGPTIqTWF0aC5QSSxRPTMuMTQxNTkyNjUzNTksVz17Z3JlZW53aWNoOjAsbGlzYm9uOi05LjEzMTkwNjExMTExMSxwYXJpczoyLjMzNzIyOTE2NjY2Nyxib2dvdGE6LTc0LjA4MDkxNjY2NjY2NyxtYWRyaWQ6LTMuNjg3OTM4ODg4ODg5LHJvbWU6MTIuNDUyMzMzMzMzMzMzLGJlcm46Ny40Mzk1ODMzMzMzMzMsamFrYXJ0YToxMDYuODA3NzE5NDQ0NDQ0LGZlcnJvOi0xNy42NjY2NjY2NjY2NjcsYnJ1c3NlbHM6NC4zNjc5NzUsc3RvY2tob2xtOjE4LjA1ODI3Nzc3Nzc3OCxhdGhlbnM6MjMuNzE2MzM3NSxvc2xvOjEwLjcyMjkxNjY2NjY2N30sWD17ZnQ6e3RvX21ldGVyOi4zMDQ4fSwidXMtZnQiOnt0b19tZXRlcjoxMjAwLzM5Mzd9fSxIPS9bXHNfXC1cL1woXCldL2csSj1mdW5jdGlvbih0KXt2YXIgcyxpLGEsaD17fSxlPXQuc3BsaXQoIisiKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbSgpfSkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkucmVkdWNlKGZ1bmN0aW9uKHQscyl7dmFyIGk9cy5zcGxpdCgiPSIpO3JldHVybiBpLnB1c2goITApLHRbaVswXS50b0xvd2VyQ2FzZSgpXT1pWzFdLHR9LHt9KSxuPXtwcm9qOiJwcm9qTmFtZSIsZGF0dW06ImRhdHVtQ29kZSIscmY6ZnVuY3Rpb24odCl7aC5yZj1wYXJzZUZsb2F0KHQpfSxsYXRfMDpmdW5jdGlvbih0KXtoLmxhdDA9dCpOfSxsYXRfMTpmdW5jdGlvbih0KXtoLmxhdDE9dCpOfSxsYXRfMjpmdW5jdGlvbih0KXtoLmxhdDI9dCpOfSxsYXRfdHM6ZnVuY3Rpb24odCl7aC5sYXRfdHM9dCpOfSxsb25fMDpmdW5jdGlvbih0KXtoLmxvbmcwPXQqTn0sbG9uXzE6ZnVuY3Rpb24odCl7aC5sb25nMT10Kk59LGxvbl8yOmZ1bmN0aW9uKHQpe2gubG9uZzI9dCpOfSxhbHBoYTpmdW5jdGlvbih0KXtoLmFscGhhPXBhcnNlRmxvYXQodCkqTn0sbG9uYzpmdW5jdGlvbih0KXtoLmxvbmdjPXQqTn0seF8wOmZ1bmN0aW9uKHQpe2gueDA9cGFyc2VGbG9hdCh0KX0seV8wOmZ1bmN0aW9uKHQpe2gueTA9cGFyc2VGbG9hdCh0KX0sa18wOmZ1bmN0aW9uKHQpe2guazA9cGFyc2VGbG9hdCh0KX0sazpmdW5jdGlvbih0KXtoLmswPXBhcnNlRmxvYXQodCl9LGE6ZnVuY3Rpb24odCl7aC5hPXBhcnNlRmxvYXQodCl9LGI6ZnVuY3Rpb24odCl7aC5iPXBhcnNlRmxvYXQodCl9LHJfYTpmdW5jdGlvbigpe2guUl9BPSEwfSx6b25lOmZ1bmN0aW9uKHQpe2guem9uZT1wYXJzZUludCh0LDEwKX0sc291dGg6ZnVuY3Rpb24oKXtoLnV0bVNvdXRoPSEwfSx0b3dnczg0OmZ1bmN0aW9uKHQpe2guZGF0dW1fcGFyYW1zPXQuc3BsaXQoIiwiKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlRmxvYXQodCl9KX0sdG9fbWV0ZXI6ZnVuY3Rpb24odCl7aC50b19tZXRlcj1wYXJzZUZsb2F0KHQpfSx1bml0czpmdW5jdGlvbih0KXtoLnVuaXRzPXQ7dmFyIHM9ayhYLHQpO3MmJihoLnRvX21ldGVyPXMudG9fbWV0ZXIpfSxmcm9tX2dyZWVud2ljaDpmdW5jdGlvbih0KXtoLmZyb21fZ3JlZW53aWNoPXQqTn0scG06ZnVuY3Rpb24odCl7dmFyIHM9ayhXLHQpO2guZnJvbV9ncmVlbndpY2g9KHN8fHBhcnNlRmxvYXQodCkpKk59LG5hZGdyaWRzOmZ1bmN0aW9uKHQpeyJAbnVsbCI9PT10P2guZGF0dW1Db2RlPSJub25lIjpoLm5hZGdyaWRzPXR9LGF4aXM6ZnVuY3Rpb24odCl7Mz09PXQubGVuZ3RoJiYtMSE9PSJld25zdWQiLmluZGV4T2YodC5zdWJzdHIoMCwxKSkmJi0xIT09ImV3bnN1ZCIuaW5kZXhPZih0LnN1YnN0cigxLDEpKSYmLTEhPT0iZXduc3VkIi5pbmRleE9mKHQuc3Vic3RyKDIsMSkpJiYoaC5heGlzPXQpfX07Zm9yKHMgaW4gZSlpPWVbc10scyBpbiBuPyJmdW5jdGlvbiI9PXR5cGVvZihhPW5bc10pP2EoaSk6aFthXT1pOmhbc109aTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGguZGF0dW1Db2RlJiYiV0dTODQiIT09aC5kYXR1bUNvZGUmJihoLmRhdHVtQ29kZT1oLmRhdHVtQ29kZS50b0xvd2VyQ2FzZSgpKSxofSxLPTEsVj0vXHMvLFo9L1tBLVphLXpdLyxZPS9bQS1aYS16ODRdLywkPS9bLFxdXS8sdHQ9L1tcZFwuRVwtXCtdLztlLnByb3RvdHlwZS5yZWFkQ2hhcmljdGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50ZXh0W3RoaXMucGxhY2UrK107aWYoNCE9PXRoaXMuc3RhdGUpZm9yKDtWLnRlc3QodCk7KXtpZih0aGlzLnBsYWNlPj10aGlzLnRleHQubGVuZ3RoKXJldHVybjt0PXRoaXMudGV4dFt0aGlzLnBsYWNlKytdfXN3aXRjaCh0aGlzLnN0YXRlKXtjYXNlIEs6cmV0dXJuIHRoaXMubmV1dHJhbCh0KTtjYXNlIDI6cmV0dXJuIHRoaXMua2V5d29yZCh0KTtjYXNlIDQ6cmV0dXJuIHRoaXMucXVvdGVkKHQpO2Nhc2UgNTpyZXR1cm4gdGhpcy5hZnRlcnF1b3RlKHQpO2Nhc2UgMzpyZXR1cm4gdGhpcy5udW1iZXIodCk7Y2FzZS0xOnJldHVybn19LGUucHJvdG90eXBlLmFmdGVycXVvdGU9ZnVuY3Rpb24odCl7aWYoJyInPT09dClyZXR1cm4gdGhpcy53b3JkKz0nIicsdm9pZCh0aGlzLnN0YXRlPTQpO2lmKCQudGVzdCh0KSlyZXR1cm4gdGhpcy53b3JkPXRoaXMud29yZC50cmltKCksdm9pZCB0aGlzLmFmdGVySXRlbSh0KTt0aHJvdyBuZXcgRXJyb3IoImhhdm4ndCBoYW5kbGVkIFwiIit0KyciIGluIGFmdGVycXVvdGUgeWV0LCBpbmRleCAnK3RoaXMucGxhY2UpfSxlLnByb3RvdHlwZS5hZnRlckl0ZW09ZnVuY3Rpb24odCl7cmV0dXJuIiwiPT09dD8obnVsbCE9PXRoaXMud29yZCYmdGhpcy5jdXJyZW50T2JqZWN0LnB1c2godGhpcy53b3JkKSx0aGlzLndvcmQ9bnVsbCx2b2lkKHRoaXMuc3RhdGU9SykpOiJdIj09PXQ/KHRoaXMubGV2ZWwtLSxudWxsIT09dGhpcy53b3JkJiYodGhpcy5jdXJyZW50T2JqZWN0LnB1c2godGhpcy53b3JkKSx0aGlzLndvcmQ9bnVsbCksdGhpcy5zdGF0ZT1LLHRoaXMuY3VycmVudE9iamVjdD10aGlzLnN0YWNrLnBvcCgpLHZvaWQodGhpcy5jdXJyZW50T2JqZWN0fHwodGhpcy5zdGF0ZT0tMSkpKTp2b2lkIDB9LGUucHJvdG90eXBlLm51bWJlcj1mdW5jdGlvbih0KXtpZighdHQudGVzdCh0KSl7aWYoJC50ZXN0KHQpKXJldHVybiB0aGlzLndvcmQ9cGFyc2VGbG9hdCh0aGlzLndvcmQpLHZvaWQgdGhpcy5hZnRlckl0ZW0odCk7dGhyb3cgbmV3IEVycm9yKCJoYXZuJ3QgaGFuZGxlZCBcIiIrdCsnIiBpbiBudW1iZXIgeWV0LCBpbmRleCAnK3RoaXMucGxhY2UpfXRoaXMud29yZCs9dH0sZS5wcm90b3R5cGUucXVvdGVkPWZ1bmN0aW9uKHQpeyciJyE9PXQ/dGhpcy53b3JkKz10OnRoaXMuc3RhdGU9NX0sZS5wcm90b3R5cGUua2V5d29yZD1mdW5jdGlvbih0KXtpZihZLnRlc3QodCkpdGhpcy53b3JkKz10O2Vsc2V7aWYoIlsiPT09dCl7dmFyIHM9W107cmV0dXJuIHMucHVzaCh0aGlzLndvcmQpLHRoaXMubGV2ZWwrKyxudWxsPT09dGhpcy5yb290P3RoaXMucm9vdD1zOnRoaXMuY3VycmVudE9iamVjdC5wdXNoKHMpLHRoaXMuc3RhY2sucHVzaCh0aGlzLmN1cnJlbnRPYmplY3QpLHRoaXMuY3VycmVudE9iamVjdD1zLHZvaWQodGhpcy5zdGF0ZT1LKX1pZighJC50ZXN0KHQpKXRocm93IG5ldyBFcnJvcigiaGF2bid0IGhhbmRsZWQgXCIiK3QrJyIgaW4ga2V5d29yZCB5ZXQsIGluZGV4ICcrdGhpcy5wbGFjZSk7dGhpcy5hZnRlckl0ZW0odCl9fSxlLnByb3RvdHlwZS5uZXV0cmFsPWZ1bmN0aW9uKHQpe2lmKFoudGVzdCh0KSlyZXR1cm4gdGhpcy53b3JkPXQsdm9pZCh0aGlzLnN0YXRlPTIpO2lmKCciJz09PXQpcmV0dXJuIHRoaXMud29yZD0iIix2b2lkKHRoaXMuc3RhdGU9NCk7aWYodHQudGVzdCh0KSlyZXR1cm4gdGhpcy53b3JkPXQsdm9pZCh0aGlzLnN0YXRlPTMpO2lmKCEkLnRlc3QodCkpdGhyb3cgbmV3IEVycm9yKCJoYXZuJ3QgaGFuZGxlZCBcIiIrdCsnIiBpbiBuZXV0cmFsIHlldCwgaW5kZXggJyt0aGlzLnBsYWNlKTt0aGlzLmFmdGVySXRlbSh0KX0sZS5wcm90b3R5cGUub3V0cHV0PWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLnBsYWNlPHRoaXMudGV4dC5sZW5ndGg7KXRoaXMucmVhZENoYXJpY3RlcigpO2lmKC0xPT09dGhpcy5zdGF0ZSlyZXR1cm4gdGhpcy5yb290O3Rocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIHBhcnNlIHN0cmluZyAiJyt0aGlzLnRleHQrJyIuIFN0YXRlIGlzICcrdGhpcy5zdGF0ZSl9O3ZhciBzdCxpdD0uMDE3NDUzMjkyNTE5OTQzMjk1LGF0PWZ1bmN0aW9uKHQpe3ZhciBzPW5ldyBlKHQpLm91dHB1dCgpLGk9cy5zaGlmdCgpLGE9cy5zaGlmdCgpO3MudW5zaGlmdChbIm5hbWUiLGFdKSxzLnVuc2hpZnQoWyJ0eXBlIixpXSk7dmFyIGg9e307cmV0dXJuIG4ocyxoKSxvKGgpLGh9OyhzdD1sKSgiRVBTRzo0MzI2IiwiK3RpdGxlPVdHUyA4NCAobG9uZy9sYXQpICtwcm9qPWxvbmdsYXQgK2VsbHBzPVdHUzg0ICtkYXR1bT1XR1M4NCArdW5pdHM9ZGVncmVlcyIpLHN0KCJFUFNHOjQyNjkiLCIrdGl0bGU9TkFEODMgKGxvbmcvbGF0KSArcHJvaj1sb25nbGF0ICthPTYzNzgxMzcuMCArYj02MzU2NzUyLjMxNDE0MDM2ICtlbGxwcz1HUlM4MCArZGF0dW09TkFEODMgK3VuaXRzPWRlZ3JlZXMiKSxzdCgiRVBTRzozODU3IiwiK3RpdGxlPVdHUyA4NCAvIFBzZXVkby1NZXJjYXRvciArcHJvaj1tZXJjICthPTYzNzgxMzcgK2I9NjM3ODEzNyArbGF0X3RzPTAuMCArbG9uXzA9MC4wICt4XzA9MC4wICt5XzA9MCAraz0xLjAgK3VuaXRzPW0gK25hZGdyaWRzPUBudWxsICtub19kZWZzIiksc3QuV0dTODQ9c3RbIkVQU0c6NDMyNiJdLHN0WyJFUFNHOjM3ODUiXT1zdFsiRVBTRzozODU3Il0sc3QuR09PR0xFPXN0WyJFUFNHOjM4NTciXSxzdFsiRVBTRzo5MDA5MTMiXT1zdFsiRVBTRzozODU3Il0sc3RbIkVQU0c6MTAyMTEzIl09c3RbIkVQU0c6Mzg1NyJdO2Z1bmN0aW9uIGh0KHQscyxpKXt2YXIgYT10KnM7cmV0dXJuIGkvTWF0aC5zcXJ0KDEtYSphKX1mdW5jdGlvbiBldCh0KXtyZXR1cm4gdDwwPy0xOjF9ZnVuY3Rpb24gbnQodCl7cmV0dXJuIE1hdGguYWJzKHQpPD1RP3Q6dC1ldCh0KSpGfWZ1bmN0aW9uIHJ0KHQscyxpKXt2YXIgYT10KmksaD0uNSp0LGE9TWF0aC5wb3coKDEtYSkvKDErYSksaCk7cmV0dXJuIE1hdGgudGFuKC41Kih6LXMpKS9hfWZ1bmN0aW9uIG90KHQscyl7Zm9yKHZhciBpLGEsaD0uNSp0LGU9ei0yKk1hdGguYXRhbihzKSxuPTA7bjw9MTU7bisrKWlmKGk9dCpNYXRoLnNpbihlKSxlKz1hPXotMipNYXRoLmF0YW4ocypNYXRoLnBvdygoMS1pKS8oMStpKSxoKSktZSxNYXRoLmFicyhhKTw9MWUtMTApcmV0dXJuIGU7cmV0dXJuLTk5OTl9dmFyIGx0PVsiUFJPSkVDVEVEQ1JTIiwiUFJPSkNSUyIsIkdFT0dDUyIsIkdFT0NDUyIsIlBST0pDUyIsIkxPQ0FMX0NTIiwiR0VPRENSUyIsIkdFT0RFVElDQ1JTIiwiR0VPREVUSUNEQVRVTSIsIkVOR0NSUyIsIkVOR0lORUVSSU5HQ1JTIl0sTXQ9WyIzODU3IiwiOTAwOTEzIiwiMzc4NSIsIjEwMjExMyJdLGN0PWZ1bmN0aW9uKHQscyl7dmFyIGksYTtpZih0PXR8fHt9LCFzKXJldHVybiB0O2ZvcihhIGluIHMpdm9pZCAwIT09KGk9c1thXSkmJih0W2FdPWkpO3JldHVybiB0fSx1dD1be2luaXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmIvdGhpcy5hO3RoaXMuZXM9MS10KnQsIngwImluIHRoaXN8fCh0aGlzLngwPTApLCJ5MCJpbiB0aGlzfHwodGhpcy55MD0wKSx0aGlzLmU9TWF0aC5zcXJ0KHRoaXMuZXMpLHRoaXMubGF0X3RzP3RoaXMuc3BoZXJlP3RoaXMuazA9TWF0aC5jb3ModGhpcy5sYXRfdHMpOnRoaXMuazA9aHQodGhpcy5lLE1hdGguc2luKHRoaXMubGF0X3RzKSxNYXRoLmNvcyh0aGlzLmxhdF90cykpOnRoaXMuazB8fCh0aGlzLms/dGhpcy5rMD10aGlzLms6dGhpcy5rMD0xKX0sZm9yd2FyZDpmdW5jdGlvbih0KXt2YXIgcyxpLGEsaCxlPXQueCxuPXQueTtyZXR1cm4gOTA8bipCJiZuKkI8LTkwJiYxODA8ZSpCJiZlKkI8LTE4MHx8TWF0aC5hYnMoTWF0aC5hYnMobikteik8PUQ/bnVsbDooaD10aGlzLnNwaGVyZT8oYT10aGlzLngwK3RoaXMuYSp0aGlzLmswKm50KGUtdGhpcy5sb25nMCksdGhpcy55MCt0aGlzLmEqdGhpcy5rMCpNYXRoLmxvZyhNYXRoLnRhbihVKy41Km4pKSk6KHM9TWF0aC5zaW4obiksaT1ydCh0aGlzLmUsbixzKSxhPXRoaXMueDArdGhpcy5hKnRoaXMuazAqbnQoZS10aGlzLmxvbmcwKSx0aGlzLnkwLXRoaXMuYSp0aGlzLmswKk1hdGgubG9nKGkpKSx0Lng9YSx0Lnk9aCx0KX0saW52ZXJzZTpmdW5jdGlvbih0KXt2YXIgcyxpLGE9dC54LXRoaXMueDAsaD10LnktdGhpcy55MDtpZih0aGlzLnNwaGVyZSlpPXotMipNYXRoLmF0YW4oTWF0aC5leHAoLWgvKHRoaXMuYSp0aGlzLmswKSkpO2Vsc2V7dmFyIGU9TWF0aC5leHAoLWgvKHRoaXMuYSp0aGlzLmswKSk7aWYoLTk5OTk9PT0oaT1vdCh0aGlzLmUsZSkpKXJldHVybiBudWxsfXJldHVybiBzPW50KHRoaXMubG9uZzArYS8odGhpcy5hKnRoaXMuazApKSx0Lng9cyx0Lnk9aSx0fSxuYW1lczpbIk1lcmNhdG9yIiwiUG9wdWxhciBWaXN1YWxpc2F0aW9uIFBzZXVkbyBNZXJjYXRvciIsIk1lcmNhdG9yXzFTUCIsIk1lcmNhdG9yX0F1eGlsaWFyeV9TcGhlcmUiLCJtZXJjIl19LHtpbml0OmZ1bmN0aW9uKCl7fSxmb3J3YXJkOnQsaW52ZXJzZTp0LG5hbWVzOlsibG9uZ2xhdCIsImlkZW50aXR5Il19XSxmdD17fSxtdD1bXSxwdD17c3RhcnQ6ZnVuY3Rpb24oKXt1dC5mb3JFYWNoKHMpfSxhZGQ6cyxnZXQ6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuITE7dmFyIHM9dC50b0xvd2VyQ2FzZSgpO3JldHVybiB2b2lkIDAhPT1mdFtzXSYmbXRbZnRbc11dP210W2Z0W3NdXTp2b2lkIDB9fSxkdD17TUVSSVQ6e2E6NjM3ODEzNyxyZjoyOTguMjU3LGVsbGlwc2VOYW1lOiJNRVJJVCAxOTgzIn0sU0dTODU6e2E6NjM3ODEzNixyZjoyOTguMjU3LGVsbGlwc2VOYW1lOiJTb3ZpZXQgR2VvZGV0aWMgU3lzdGVtIDg1In0sR1JTODA6e2E6NjM3ODEzNyxyZjoyOTguMjU3MjIyMTAxLGVsbGlwc2VOYW1lOiJHUlMgMTk4MChJVUdHLCAxOTgwKSJ9LElBVTc2OnthOjYzNzgxNDAscmY6Mjk4LjI1NyxlbGxpcHNlTmFtZToiSUFVIDE5NzYifSxhaXJ5OnthOjYzNzc1NjMuMzk2LGI6NjM1NjI1Ni45MSxlbGxpcHNlTmFtZToiQWlyeSAxODMwIn0sQVBMNDp7YTo2Mzc4MTM3LHJmOjI5OC4yNSxlbGxpcHNlTmFtZToiQXBwbC4gUGh5c2ljcy4gMTk2NSJ9LE5XTDlEOnthOjYzNzgxNDUscmY6Mjk4LjI1LGVsbGlwc2VOYW1lOiJOYXZhbCBXZWFwb25zIExhYi4sIDE5NjUifSxtb2RfYWlyeTp7YTo2Mzc3MzQwLjE4OSxiOjYzNTYwMzQuNDQ2LGVsbGlwc2VOYW1lOiJNb2RpZmllZCBBaXJ5In0sYW5kcmFlOnthOjYzNzcxMDQuNDMscmY6MzAwLGVsbGlwc2VOYW1lOiJBbmRyYWUgMTg3NiAoRGVuLiwgSWNsbmQuKSJ9LGF1c3RfU0E6e2E6NjM3ODE2MCxyZjoyOTguMjUsZWxsaXBzZU5hbWU6IkF1c3RyYWxpYW4gTmF0bCAmIFMuIEFtZXIuIDE5NjkifSxHUlM2Nzp7YTo2Mzc4MTYwLHJmOjI5OC4yNDcxNjc0MjcsZWxsaXBzZU5hbWU6IkdSUyA2NyhJVUdHIDE5NjcpIn0sYmVzc2VsOnthOjYzNzczOTcuMTU1LHJmOjI5OS4xNTI4MTI4LGVsbGlwc2VOYW1lOiJCZXNzZWwgMTg0MSJ9LGJlc3NfbmFtOnthOjYzNzc0ODMuODY1LHJmOjI5OS4xNTI4MTI4LGVsbGlwc2VOYW1lOiJCZXNzZWwgMTg0MSAoTmFtaWJpYSkifSxjbHJrNjY6e2E6NjM3ODIwNi40LGI6NjM1NjU4My44LGVsbGlwc2VOYW1lOiJDbGFya2UgMTg2NiJ9LGNscms4MDp7YTo2Mzc4MjQ5LjE0NSxyZjoyOTMuNDY2MyxlbGxpcHNlTmFtZToiQ2xhcmtlIDE4ODAgbW9kLiJ9LGNscms1ODp7YTo2Mzc4MjkzLjY0NTIwODc1OSxyZjoyOTQuMjYwNjc2MzY5MjY1NCxlbGxpcHNlTmFtZToiQ2xhcmtlIDE4NTgifSxDUE06e2E6NjM3NTczOC43LHJmOjMzNC4yOSxlbGxpcHNlTmFtZToiQ29tbS4gZGVzIFBvaWRzIGV0IE1lc3VyZXMgMTc5OSJ9LGRlbG1icjp7YTo2Mzc2NDI4LHJmOjMxMS41LGVsbGlwc2VOYW1lOiJEZWxhbWJyZSAxODEwIChCZWxnaXVtKSJ9LGVuZ2VsaXM6e2E6NjM3ODEzNi4wNSxyZjoyOTguMjU2NixlbGxpcHNlTmFtZToiRW5nZWxpcyAxOTg1In0sZXZyc3QzMDp7YTo2Mzc3Mjc2LjM0NSxyZjozMDAuODAxNyxlbGxpcHNlTmFtZToiRXZlcmVzdCAxODMwIn0sZXZyc3Q0ODp7YTo2Mzc3MzA0LjA2MyxyZjozMDAuODAxNyxlbGxpcHNlTmFtZToiRXZlcmVzdCAxOTQ4In0sZXZyc3Q1Njp7YTo2Mzc3MzAxLjI0MyxyZjozMDAuODAxNyxlbGxpcHNlTmFtZToiRXZlcmVzdCAxOTU2In0sZXZyc3Q2OTp7YTo2Mzc3Mjk1LjY2NCxyZjozMDAuODAxNyxlbGxpcHNlTmFtZToiRXZlcmVzdCAxOTY5In0sZXZyc3RTUzp7YTo2Mzc3Mjk4LjU1NixyZjozMDAuODAxNyxlbGxpcHNlTmFtZToiRXZlcmVzdCAoU2FiYWggJiBTYXJhd2FrKSJ9LGZzY2hyNjA6e2E6NjM3ODE2NixyZjoyOTguMyxlbGxpcHNlTmFtZToiRmlzY2hlciAoTWVyY3VyeSBEYXR1bSkgMTk2MCJ9LGZzY2hyNjBtOnthOjYzNzgxNTUscmY6Mjk4LjMsZWxsaXBzZU5hbWU6IkZpc2NoZXIgMTk2MCJ9LGZzY2hyNjg6e2E6NjM3ODE1MCxyZjoyOTguMyxlbGxpcHNlTmFtZToiRmlzY2hlciAxOTY4In0saGVsbWVydDp7YTo2Mzc4MjAwLHJmOjI5OC4zLGVsbGlwc2VOYW1lOiJIZWxtZXJ0IDE5MDYifSxob3VnaDp7YTo2Mzc4MjcwLHJmOjI5NyxlbGxpcHNlTmFtZToiSG91Z2gifSxpbnRsOnthOjYzNzgzODgscmY6Mjk3LGVsbGlwc2VOYW1lOiJJbnRlcm5hdGlvbmFsIDE5MDkgKEhheWZvcmQpIn0sa2F1bGE6e2E6NjM3ODE2MyxyZjoyOTguMjQsZWxsaXBzZU5hbWU6IkthdWxhIDE5NjEifSxsZXJjaDp7YTo2Mzc4MTM5LHJmOjI5OC4yNTcsZWxsaXBzZU5hbWU6IkxlcmNoIDE5NzkifSxtcHJ0czp7YTo2Mzk3MzAwLHJmOjE5MSxlbGxpcHNlTmFtZToiTWF1cGVydGl1cyAxNzM4In0sbmV3X2ludGw6e2E6NjM3ODE1Ny41LGI6NjM1Njc3Mi4yLGVsbGlwc2VOYW1lOiJOZXcgSW50ZXJuYXRpb25hbCAxOTY3In0scGxlc3Npczp7YTo2Mzc2NTIzLHJmOjYzNTU4NjMsZWxsaXBzZU5hbWU6IlBsZXNzaXMgMTgxNyAoRnJhbmNlKSJ9LGtyYXNzOnthOjYzNzgyNDUscmY6Mjk4LjMsZWxsaXBzZU5hbWU6IktyYXNzb3Zza3ksIDE5NDIifSxTRWFzaWE6e2E6NjM3ODE1NSxiOjYzNTY3NzMuMzIwNSxlbGxpcHNlTmFtZToiU291dGhlYXN0IEFzaWEifSx3YWxiZWNrOnthOjYzNzY4OTYsYjo2MzU1ODM0Ljg0NjcsZWxsaXBzZU5hbWU6IldhbGJlY2sifSxXR1M2MDp7YTo2Mzc4MTY1LHJmOjI5OC4zLGVsbGlwc2VOYW1lOiJXR1MgNjAifSxXR1M2Njp7YTo2Mzc4MTQ1LHJmOjI5OC4yNSxlbGxpcHNlTmFtZToiV0dTIDY2In0sV0dTNzp7YTo2Mzc4MTM1LHJmOjI5OC4yNixlbGxpcHNlTmFtZToiV0dTIDcyIn19LHl0PWR0LldHUzg0PXthOjYzNzgxMzcscmY6Mjk4LjI1NzIyMzU2MyxlbGxpcHNlTmFtZToiV0dTIDg0In07ZHQuc3BoZXJlPXthOjYzNzA5OTcsYjo2MzcwOTk3LGVsbGlwc2VOYW1lOiJOb3JtYWwgU3BoZXJlIChyPTYzNzA5OTcpIn07dmFyIF90PXt3Z3M4NDp7dG93Z3M4NDoiMCwwLDAiLGVsbGlwc2U6IldHUzg0IixkYXR1bU5hbWU6IldHUzg0In0sY2gxOTAzOnt0b3dnczg0OiI2NzQuMzc0LDE1LjA1Niw0MDUuMzQ2IixlbGxpcHNlOiJiZXNzZWwiLGRhdHVtTmFtZToic3dpc3MifSxnZ3JzODc6e3Rvd2dzODQ6Ii0xOTkuODcsNzQuNzksMjQ2LjYyIixlbGxpcHNlOiJHUlM4MCIsZGF0dW1OYW1lOiJHcmVla19HZW9kZXRpY19SZWZlcmVuY2VfU3lzdGVtXzE5ODcifSxuYWQ4Mzp7dG93Z3M4NDoiMCwwLDAiLGVsbGlwc2U6IkdSUzgwIixkYXR1bU5hbWU6Ik5vcnRoX0FtZXJpY2FuX0RhdHVtXzE5ODMifSxuYWQyNzp7bmFkZ3JpZHM6IkBjb251cyxAYWxhc2thLEBudHYyXzAuZ3NiLEBudHYxX2Nhbi5kYXQiLGVsbGlwc2U6ImNscms2NiIsZGF0dW1OYW1lOiJOb3J0aF9BbWVyaWNhbl9EYXR1bV8xOTI3In0scG90c2RhbTp7dG93Z3M4NDoiNjA2LjAsMjMuMCw0MTMuMCIsZWxsaXBzZToiYmVzc2VsIixkYXR1bU5hbWU6IlBvdHNkYW0gUmF1ZW5iZXJnIDE5NTAgREhETiJ9LGNhcnRoYWdlOnt0b3dnczg0OiItMjYzLjAsNi4wLDQzMS4wIixlbGxpcHNlOiJjbGFyazgwIixkYXR1bU5hbWU6IkNhcnRoYWdlIDE5MzQgVHVuaXNpYSJ9LGhlcm1hbm5za29nZWw6e3Rvd2dzODQ6IjY1My4wLC0yMTIuMCw0NDkuMCIsZWxsaXBzZToiYmVzc2VsIixkYXR1bU5hbWU6Ikhlcm1hbm5za29nZWwifSxvc25pNTI6e3Rvd2dzODQ6IjQ4Mi41MzAsLTEzMC41OTYsNTY0LjU1NywtMS4wNDIsLTAuMjE0LC0wLjYzMSw4LjE1IixlbGxpcHNlOiJhaXJ5IixkYXR1bU5hbWU6IklyaXNoIE5hdGlvbmFsIn0saXJlNjU6e3Rvd2dzODQ6IjQ4Mi41MzAsLTEzMC41OTYsNTY0LjU1NywtMS4wNDIsLTAuMjE0LC0wLjYzMSw4LjE1IixlbGxpcHNlOiJtb2RfYWlyeSIsZGF0dW1OYW1lOiJJcmVsYW5kIDE5NjUifSxyYXNzYWRpcmFuOnt0b3dnczg0OiItMTMzLjYzLC0xNTcuNSwtMTU4LjYyIixlbGxpcHNlOiJpbnRsIixkYXR1bU5hbWU6IlJhc3NhZGlyYW4ifSxuemdkNDk6e3Rvd2dzODQ6IjU5LjQ3LC01LjA0LDE4Ny40NCwwLjQ3LC0wLjEsMS4wMjQsLTQuNTk5MyIsZWxsaXBzZToiaW50bCIsZGF0dW1OYW1lOiJOZXcgWmVhbGFuZCBHZW9kZXRpYyBEYXR1bSAxOTQ5In0sb3NnYjM2Ont0b3dnczg0OiI0NDYuNDQ4LC0xMjUuMTU3LDU0Mi4wNjAsMC4xNTAyLDAuMjQ3MCwwLjg0MjEsLTIwLjQ4OTQiLGVsbGlwc2U6ImFpcnkiLGRhdHVtTmFtZToiQWlyeSAxODMwIn0sc19qdHNrOnt0b3dnczg0OiI1ODksNzYsNDgwIixlbGxpcHNlOiJiZXNzZWwiLGRhdHVtTmFtZToiUy1KVFNLIChGZXJybykifSxiZWR1YXJhbTp7dG93Z3M4NDoiLTEwNiwtODcsMTg4IixlbGxpcHNlOiJjbHJrODAiLGRhdHVtTmFtZToiQmVkdWFyYW0ifSxndW51bmdfc2VnYXJhOnt0b3dnczg0OiItNDAzLDY4NCw0MSIsZWxsaXBzZToiYmVzc2VsIixkYXR1bU5hbWU6Ikd1bnVuZyBTZWdhcmEgSmFrYXJ0YSJ9LHJuYjcyOnt0b3dnczg0OiIxMDYuODY5LC01Mi4yOTc4LDEwMy43MjQsLTAuMzM2NTcsMC40NTY5NTUsLTEuODQyMTgsMSIsZWxsaXBzZToiaW50bCIsZGF0dW1OYW1lOiJSZXNlYXUgTmF0aW9uYWwgQmVsZ2UgMTk3MiJ9fTtxLnByb2plY3Rpb25zPXB0LHEucHJvamVjdGlvbnMuc3RhcnQoKTt2YXIgeHQ9ZnVuY3Rpb24odCxzLGkpe3JldHVybiBoPXMsKChhPXQpLmRhdHVtX3R5cGUhPT1oLmRhdHVtX3R5cGV8fGEuYSE9PWguYXx8NWUtMTE8TWF0aC5hYnMoYS5lcy1oLmVzKXx8KGEuZGF0dW1fdHlwZT09PUk/YS5kYXR1bV9wYXJhbXNbMF0hPT1oLmRhdHVtX3BhcmFtc1swXXx8YS5kYXR1bV9wYXJhbXNbMV0hPT1oLmRhdHVtX3BhcmFtc1sxXXx8YS5kYXR1bV9wYXJhbXNbMl0hPT1oLmRhdHVtX3BhcmFtc1syXTphLmRhdHVtX3R5cGU9PT1PJiYoYS5kYXR1bV9wYXJhbXNbMF0hPT1oLmRhdHVtX3BhcmFtc1swXXx8YS5kYXR1bV9wYXJhbXNbMV0hPT1oLmRhdHVtX3BhcmFtc1sxXXx8YS5kYXR1bV9wYXJhbXNbMl0hPT1oLmRhdHVtX3BhcmFtc1syXXx8YS5kYXR1bV9wYXJhbXNbM10hPT1oLmRhdHVtX3BhcmFtc1szXXx8YS5kYXR1bV9wYXJhbXNbNF0hPT1oLmRhdHVtX3BhcmFtc1s0XXx8YS5kYXR1bV9wYXJhbXNbNV0hPT1oLmRhdHVtX3BhcmFtc1s1XXx8YS5kYXR1bV9wYXJhbXNbNl0hPT1oLmRhdHVtX3BhcmFtc1s2XSkpKSYmdC5kYXR1bV90eXBlIT09RyYmcy5kYXR1bV90eXBlIT09RyYmKHQuZXMhPT1zLmVzfHx0LmEhPT1zLmF8fHUodC5kYXR1bV90eXBlKXx8dShzLmRhdHVtX3R5cGUpKT8oaT1NKGksdC5lcyx0LmEpLHUodC5kYXR1bV90eXBlKSYmKGk9ZnVuY3Rpb24odCxzLGkpe2lmKHM9PT1JKXJldHVybnt4OnQueCtpWzBdLHk6dC55K2lbMV0sejp0LnoraVsyXX07aWYocz09PU8pe3ZhciBhPWlbMF0saD1pWzFdLGU9aVsyXSxuPWlbM10scj1pWzRdLG89aVs1XSxsPWlbNl07cmV0dXJue3g6bCoodC54LW8qdC55K3IqdC56KSthLHk6bCoobyp0LngrdC55LW4qdC56KStoLHo6bCooLXIqdC54K24qdC55K3QueikrZX19fShpLHQuZGF0dW1fdHlwZSx0LmRhdHVtX3BhcmFtcykpLHUocy5kYXR1bV90eXBlKSYmKGk9ZnVuY3Rpb24odCxzLGkpe2lmKHM9PT1JKXJldHVybnt4OnQueC1pWzBdLHk6dC55LWlbMV0sejp0LnotaVsyXX07aWYocz09PU8pe3ZhciBhPWlbMF0saD1pWzFdLGU9aVsyXSxuPWlbM10scj1pWzRdLG89aVs1XSxsPWlbNl0sTT0odC54LWEpL2wsYz0odC55LWgpL2wsdT0odC56LWUpL2w7cmV0dXJue3g6TStvKmMtcip1LHk6LW8qTStjK24qdSx6OnIqTS1uKmMrdX19fShpLHMuZGF0dW1fdHlwZSxzLmRhdHVtX3BhcmFtcykpLGMoaSxzLmVzLHMuYSxzLmIpKTppO3ZhciBhLGh9LGd0PWZ1bmN0aW9uKHQscyxpKXtmb3IodmFyIGEsaCxlPWkueCxuPWkueSxyPWkuenx8MCxvPXt9LGw9MDtsPDM7bCsrKWlmKCFzfHwyIT09bHx8dm9pZCAwIT09aS56KXN3aXRjaChoPTA9PT1sPyhhPWUsLTEhPT0iZXciLmluZGV4T2YodC5heGlzW2xdKT8ieCI6InkiKToxPT09bD8oYT1uLC0xIT09Im5zIi5pbmRleE9mKHQuYXhpc1tsXSk/InkiOiJ4Iik6KGE9ciwieiIpLHQuYXhpc1tsXSl7Y2FzZSJlIjpjYXNlInciOmNhc2UibiI6Y2FzZSJzIjpvW2hdPWE7YnJlYWs7Y2FzZSJ1Ijp2b2lkIDAhPT1pW2hdJiYoby56PWEpO2JyZWFrO2Nhc2UiZCI6dm9pZCAwIT09aVtoXSYmKG8uej0tYSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gbnVsbH1yZXR1cm4gb30sYnQ9ZnVuY3Rpb24odCl7dmFyIHM9e3g6dFswXSx5OnRbMV19O3JldHVybiAyPHQubGVuZ3RoJiYocy56PXRbMl0pLDM8dC5sZW5ndGgmJihzLm09dFszXSksc30sdnQ9ZnVuY3Rpb24odCl7aSh0LngpLGkodC55KX0sd3Q9cSgiV0dTODQiKSxDdD02LFB0PSJBSlNBSlMiLFN0PSJBRkFGQUYiLE50PTY1LGt0PTczLEV0PTc5LHF0PTg2LEl0PTkwLE90PXtmb3J3YXJkOmQsaW52ZXJzZTpmdW5jdGlvbih0KXt2YXIgcz1nKHYodC50b1VwcGVyQ2FzZSgpKSk7cmV0dXJuIHMubGF0JiZzLmxvbj9bcy5sb24scy5sYXQscy5sb24scy5sYXRdOltzLmxlZnQscy5ib3R0b20scy5yaWdodCxzLnRvcF19LHRvUG9pbnQ6eX07Qy5mcm9tTUdSUz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEMoeSh0KSl9LEMucHJvdG90eXBlLnRvTUdSUz1mdW5jdGlvbih0KXtyZXR1cm4gZChbdGhpcy54LHRoaXMueV0sdCl9O2Z1bmN0aW9uIEF0KHQpe3ZhciBzPVtdO3NbMF09MS10KiguMjUrdCooLjA0Njg3NSt0KiguMDE5NTMxMjUrdCp0cykpKSxzWzFdPXQqKC43NS10KiguMDQ2ODc1K3QqKC4wMTk1MzEyNSt0KnRzKSkpO3ZhciBpPXQqdDtyZXR1cm4gc1syXT1pKiguNDY4NzUtdCooLjAxMzAyMDgzMzMzMzMzMzMzNCsuMDA3MTIwNzY4MjI5MTY2NjY3KnQpKSxpKj10LHNbM109aSooLjM2NDU4MzMzMzMzMzMzMzMtLjAwNTY5NjYxNDU4MzMzMzMzMyp0KSxzWzRdPWkqdCouMzA3NjE3MTg3NSxzfWZ1bmN0aW9uIEd0KHQscyxpLGEpe3JldHVybiBpKj1zLHMqPXMsYVswXSp0LWkqKGFbMV0rcyooYVsyXStzKihhWzNdK3MqYVs0XSkpKX1mdW5jdGlvbiBqdCh0LHMsaSl7Zm9yKHZhciBhPTEvKDEtcyksaD10LGU9MjA7ZTstLWUpe3ZhciBuPU1hdGguc2luKGgpLHI9MS1zKm4qbjtpZihoLT1yPShHdChoLG4sTWF0aC5jb3MoaCksaSktdCkqKHIqTWF0aC5zcXJ0KHIpKSphLE1hdGguYWJzKHIpPEQpcmV0dXJuIGh9cmV0dXJuIGh9ZnVuY3Rpb24genQodCl7dmFyIHM9TWF0aC5leHAodCk7cmV0dXJuKHMtMS9zKS8yfWZ1bmN0aW9uIFJ0KHQscyl7dD1NYXRoLmFicyh0KSxzPU1hdGguYWJzKHMpO3ZhciBpPU1hdGgubWF4KHQscyksYT1NYXRoLm1pbih0LHMpLyhpfHwxKTtyZXR1cm4gaSpNYXRoLnNxcnQoMStNYXRoLnBvdyhhLDIpKX1mdW5jdGlvbiBMdCh0KXt2YXIgcyxpLGEsaD1NYXRoLmFicyh0KTtyZXR1cm4gcz1oKigxK2gvKFJ0KDEsaCkrMSkpLGg9MD09KGE9KGk9MStzKS0xKT9zOnMqTWF0aC5sb2coaSkvYSx0PDA/LWg6aH1mdW5jdGlvbiBUdCh0LHMpe2Zvcih2YXIgaSxhPTIqTWF0aC5jb3MoMipzKSxoPXQubGVuZ3RoLTEsZT10W2hdLG49MDswPD0tLWg7KWk9YSplLW4rdFtoXSxuPWUsZT1pO3JldHVybiBzK2kqTWF0aC5zaW4oMipzKX1mdW5jdGlvbiBEdCh0LHMsaSl7Zm9yKHZhciBhLGgsZSxuLHI9TWF0aC5zaW4ocyksbz1NYXRoLmNvcyhzKSxsPXp0KGkpLE09KGU9aSwoKG49TWF0aC5leHAoZSkpKzEvbikvMiksYz0yKm8qTSx1PS0yKnIqbCxmPXQubGVuZ3RoLTEsbT10W2ZdLHA9MCxkPTAseT0wOzA8PS0tZjspYT1kLGg9cCxtPWMqKGQ9bSktYS11KihwPXkpK3RbZl0seT11KmQtaCtjKnA7cmV0dXJuWyhjPXIqTSkqbS0odT1vKmwpKnksYyp5K3UqbV19ZnVuY3Rpb24gQnQodCxzKXtyZXR1cm4gTWF0aC5wb3coKDEtdCkvKDErdCkscyl9ZnVuY3Rpb24gVXQodCxzLGksYSxoKXtyZXR1cm4gdCpoLXMqTWF0aC5zaW4oMipoKStpKk1hdGguc2luKDQqaCktYSpNYXRoLnNpbig2KmgpfWZ1bmN0aW9uIEZ0KHQpe3JldHVybiAxLS4yNSp0KigxK3QvMTYqKDMrMS4yNSp0KSl9ZnVuY3Rpb24gUXQodCl7cmV0dXJuLjM3NSp0KigxKy4yNSp0KigxKy40Njg3NSp0KSl9ZnVuY3Rpb24gV3QodCl7cmV0dXJuLjA1ODU5Mzc1KnQqdCooMSsuNzUqdCl9ZnVuY3Rpb24gWHQodCl7cmV0dXJuIHQqdCp0KigzNS8zMDcyKX1mdW5jdGlvbiBIdCh0LHMsaSl7dmFyIGE9cyppO3JldHVybiB0L01hdGguc3FydCgxLWEqYSl9ZnVuY3Rpb24gSnQodCl7cmV0dXJuIE1hdGguYWJzKHQpPHo/dDp0LWV0KHQpKk1hdGguUEl9ZnVuY3Rpb24gS3QodCxzLGksYSxoKXtmb3IodmFyIGUsbj10L3Mscj0wO3I8MTU7cisrKWlmKG4rPWU9KHQtKHMqbi1pKk1hdGguc2luKDIqbikrYSpNYXRoLnNpbig0Km4pLWgqTWF0aC5zaW4oNipuKSkpLyhzLTIqaSpNYXRoLmNvcygyKm4pKzQqYSpNYXRoLmNvcyg0Km4pLTYqaCpNYXRoLmNvcyg2Km4pKSxNYXRoLmFicyhlKTw9MWUtMTApcmV0dXJuIG47cmV0dXJuIE5hTn1mdW5jdGlvbiBWdCh0LHMpe3ZhciBpO3JldHVybiAxZS03PHQ/KDEtdCp0KSoocy8oMS0oaT10KnMpKmkpLS41L3QqTWF0aC5sb2coKDEtaSkvKDEraSkpKToyKnN9ZnVuY3Rpb24gWnQodCl7cmV0dXJuIDE8TWF0aC5hYnModCkmJih0PTE8dD8xOi0xKSxNYXRoLmFzaW4odCl9ZnVuY3Rpb24gWXQodCxzKXtyZXR1cm4gdFswXStzKih0WzFdK3MqKHRbMl0rcyp0WzNdKSl9dmFyICR0LHRzPS4wMTA2ODExNTIzNDM3NSxzcz17aW5pdDpmdW5jdGlvbigpe3RoaXMueDA9dm9pZCAwIT09dGhpcy54MD90aGlzLngwOjAsdGhpcy55MD12b2lkIDAhPT10aGlzLnkwP3RoaXMueTA6MCx0aGlzLmxvbmcwPXZvaWQgMCE9PXRoaXMubG9uZzA/dGhpcy5sb25nMDowLHRoaXMubGF0MD12b2lkIDAhPT10aGlzLmxhdDA/dGhpcy5sYXQwOjAsdGhpcy5lcyYmKHRoaXMuZW49QXQodGhpcy5lcyksdGhpcy5tbDA9R3QodGhpcy5sYXQwLE1hdGguc2luKHRoaXMubGF0MCksTWF0aC5jb3ModGhpcy5sYXQwKSx0aGlzLmVuKSl9LGZvcndhcmQ6ZnVuY3Rpb24odCl7dmFyIHM9dC54LGk9dC55LGE9bnQocy10aGlzLmxvbmcwKSxoPU1hdGguc2luKGkpLGU9TWF0aC5jb3MoaSk7aWYodGhpcy5lcyl7dmFyIG49ZSphLHI9TWF0aC5wb3cobiwyKSxvPXRoaXMuZXAyKk1hdGgucG93KGUsMiksbD1NYXRoLnBvdyhvLDIpLE09TWF0aC5hYnMoZSk+RD9NYXRoLnRhbihpKTowLGM9TWF0aC5wb3coTSwyKSx1PU1hdGgucG93KGMsMiksZj0xLXRoaXMuZXMqTWF0aC5wb3coaCwyKTtuLz1NYXRoLnNxcnQoZik7dmFyIG09R3QoaSxoLGUsdGhpcy5lbikscD10aGlzLmEqKHRoaXMuazAqbiooMStyLzYqKDEtYytvK3IvMjAqKDUtMTgqYyt1KzE0Km8tNTgqYypvK3IvNDIqKDYxKzE3OSp1LXUqYy00NzkqYykpKSkpK3RoaXMueDAsZD10aGlzLmEqKHRoaXMuazAqKG0tdGhpcy5tbDAraCphKm4vMiooMStyLzEyKig1LWMrOSpvKzQqbCtyLzMwKig2MSt1LTU4KmMrMjcwKm8tMzMwKmMqbytyLzU2KigxMzg1KzU0Myp1LXUqYy0zMTExKmMpKSkpKSkrdGhpcy55MH1lbHNle3ZhciB5PWUqTWF0aC5zaW4oYSk7aWYoTWF0aC5hYnMoTWF0aC5hYnMoeSktMSk8RClyZXR1cm4gOTM7aWYocD0uNSp0aGlzLmEqdGhpcy5rMCpNYXRoLmxvZygoMSt5KS8oMS15KSkrdGhpcy54MCxkPWUqTWF0aC5jb3MoYSkvTWF0aC5zcXJ0KDEtTWF0aC5wb3coeSwyKSksMTw9KHk9TWF0aC5hYnMoZCkpKXtpZihEPHktMSlyZXR1cm4gOTM7ZD0wfWVsc2UgZD1NYXRoLmFjb3MoZCk7aTwwJiYoZD0tZCksZD10aGlzLmEqdGhpcy5rMCooZC10aGlzLmxhdDApK3RoaXMueTB9cmV0dXJuIHQueD1wLHQueT1kLHR9LGludmVyc2U6ZnVuY3Rpb24odCl7dmFyIHMsaSxhLGgsZSxuLHIsbyxsLE0sYyx1LGYsbSxwLGQseSxfPSh0LngtdGhpcy54MCkqKDEvdGhpcy5hKSx4PSh0LnktdGhpcy55MCkqKDEvdGhpcy5hKTtyZXR1cm4gZj10aGlzLmVzPyhsPXRoaXMubWwwK3gvdGhpcy5rMCxzPWp0KGwsdGhpcy5lcyx0aGlzLmVuKSxNYXRoLmFicyhzKTx6PyhpPU1hdGguc2luKHMpLGE9TWF0aC5jb3MocyksaD1NYXRoLmFicyhhKT5EP01hdGgudGFuKHMpOjAsZT10aGlzLmVwMipNYXRoLnBvdyhhLDIpLG49TWF0aC5wb3coZSwyKSxyPU1hdGgucG93KGgsMiksbz1NYXRoLnBvdyhyLDIpLGw9MS10aGlzLmVzKk1hdGgucG93KGksMiksTT1fKk1hdGguc3FydChsKS90aGlzLmswLHU9cy0obCo9aCkqKGM9TWF0aC5wb3coTSwyKSkvKDEtdGhpcy5lcykqLjUqKDEtYy8xMiooNSszKnItOSplKnIrZS00Km4tYy8zMCooNjErOTAqci0yNTIqZSpyKzQ1Km8rNDYqZS1jLzU2KigxMzg1KzM2MzMqcis0MDk1Km8rMTU3NCpvKnIpKSkpLG50KHRoaXMubG9uZzArTSooMS1jLzYqKDErMipyK2UtYy8yMCooNSsyOCpyKzI0Km8rOCplKnIrNiplLWMvNDIqKDYxKzY2MipyKzEzMjAqbys3MjAqbypyKSkpKS9hKSk6KHU9eipldCh4KSwwKSk6KHA9LjUqKChtPU1hdGguZXhwKF8vdGhpcy5rMCkpLTEvbSksZD10aGlzLmxhdDAreC90aGlzLmswLHk9TWF0aC5jb3MoZCksbD1NYXRoLnNxcnQoKDEtTWF0aC5wb3coeSwyKSkvKDErTWF0aC5wb3cocCwyKSkpLHU9TWF0aC5hc2luKGwpLHg8MCYmKHU9LXUpLDA9PXAmJjA9PT15PzA6bnQoTWF0aC5hdGFuMihwLHkpK3RoaXMubG9uZzApKSx0Lng9Zix0Lnk9dSx0fSxuYW1lczpbIlRyYW5zdmVyc2VfTWVyY2F0b3IiLCJUcmFuc3ZlcnNlIE1lcmNhdG9yIiwidG1lcmMiXX0saXM9e2luaXQ6ZnVuY3Rpb24oKXtpZih2b2lkIDA9PT10aGlzLmVzfHx0aGlzLmVzPD0wKXRocm93IG5ldyBFcnJvcigiaW5jb3JyZWN0IGVsbGlwdGljYWwgdXNhZ2UiKTt0aGlzLngwPXZvaWQgMCE9PXRoaXMueDA/dGhpcy54MDowLHRoaXMueTA9dm9pZCAwIT09dGhpcy55MD90aGlzLnkwOjAsdGhpcy5sb25nMD12b2lkIDAhPT10aGlzLmxvbmcwP3RoaXMubG9uZzA6MCx0aGlzLmxhdDA9dm9pZCAwIT09dGhpcy5sYXQwP3RoaXMubGF0MDowLHRoaXMuY2diPVtdLHRoaXMuY2JnPVtdLHRoaXMudXRnPVtdLHRoaXMuZ3R1PVtdO3ZhciB0PXRoaXMuZXMvKDErTWF0aC5zcXJ0KDEtdGhpcy5lcykpLHM9dC8oMi10KSxpPXM7dGhpcy5jZ2JbMF09cyooMitzKigtMi8zK3MqKHMqKDExNi80NStzKigyNi80NSstMjg1NC82NzUqcykpLTIpKSksdGhpcy5jYmdbMF09cyoocyooMi8zK3MqKDQvMytzKigtODIvNDUrcyooMzIvNDUrNDY0Mi80NzI1KnMpKSkpLTIpLGkqPXMsdGhpcy5jZ2JbMV09aSooNy8zK3MqKHMqKC0yMjcvNDUrcyooMjcwNC8zMTUrMjMyMy85NDUqcykpLTEuNikpLHRoaXMuY2JnWzFdPWkqKDUvMytzKigtMTYvMTUrcyooLTEzLzkrcyooOTA0LzMxNSstMTUyMi85NDUqcykpKSksaSo9cyx0aGlzLmNnYlsyXT1pKig1Ni8xNStzKigtMTM2LzM1K3MqKC0xMjYyLzEwNSs3MzgxNC8yODM1KnMpKSksdGhpcy5jYmdbMl09aSooLTI2LzE1K3MqKDM0LzIxK3MqKDEuNistMTI2ODYvMjgzNSpzKSkpLGkqPXMsdGhpcy5jZ2JbM109aSooNDI3OS82MzArcyooLTMzMi8zNSstMzk5NTcyLzE0MTc1KnMpKSx0aGlzLmNiZ1szXT1pKigxMjM3LzYzMCtzKigtMjQ4MzIvMTQxNzUqcy0yLjQpKSxpKj1zLHRoaXMuY2diWzRdPWkqKDQxNzQvMzE1Ky0xNDQ4MzgvNjIzNypzKSx0aGlzLmNiZ1s0XT1pKigtNzM0LzMxNSsxMDk1OTgvMzExODUqcyksaSo9cyx0aGlzLmNnYls1XT1pKig2MDE2NzYvMjIyNzUpLHRoaXMuY2JnWzVdPWkqKDQ0NDMzNy8xNTU5MjUpLGk9TWF0aC5wb3cocywyKSx0aGlzLlFuPXRoaXMuazAvKDErcykqKDEraSooLjI1K2kqKDEvNjQraS8yNTYpKSksdGhpcy51dGdbMF09cyoocyooMi8zK3MqKC0zNy85NitzKigxLzM2MCtzKig4MS81MTIrLTk2MTk5LzYwNDgwMCpzKSkpKS0uNSksdGhpcy5ndHVbMF09cyooLjUrcyooLTIvMytzKig1LzE2K3MqKDQxLzE4MCtzKigtMTI3LzI4OCs3ODkxLzM3ODAwKnMpKSkpKSx0aGlzLnV0Z1sxXT1pKigtMS80OCtzKigtMS8xNStzKig0MzcvMTQ0MCtzKigtNDYvMTA1KzExMTg3MTEvMzg3MDcyMCpzKSkpKSx0aGlzLmd0dVsxXT1pKigxMy80OCtzKihzKig1NTcvMTQ0MCtzKigyODEvNjMwKy0xOTgzNDMzLzE5MzUzNjAqcykpLS42KSksaSo9cyx0aGlzLnV0Z1syXT1pKigtMTcvNDgwK3MqKDM3Lzg0MCtzKigyMDkvNDQ4MCstNTU2OS85MDcyMCpzKSkpLHRoaXMuZ3R1WzJdPWkqKDYxLzI0MCtzKigtMTAzLzE0MCtzKigxNTA2MS8yNjg4MCsxNjc2MDMvMTgxNDQwKnMpKSksaSo9cyx0aGlzLnV0Z1szXT1pKigtNDM5Ny8xNjEyODArcyooMTEvNTA0KzgzMDI1MS83MjU3NjAwKnMpKSx0aGlzLmd0dVszXT1pKig0OTU2MS8xNjEyODArcyooLTE3OS8xNjgrNjYwMTY2MS83MjU3NjAwKnMpKSxpKj1zLHRoaXMudXRnWzRdPWkqKC00NTgzLzE2MTI4MCsxMDg4NDcvMzk5MTY4MCpzKSx0aGlzLmd0dVs0XT1pKigzNDcyOS84MDY0MCstMzQxODg4OS8xOTk1ODQwKnMpLGkqPXMsdGhpcy51dGdbNV09LS4wMzIzMzA4MzA5NDA4NTY5OCppLHRoaXMuZ3R1WzVdPS42NjUwNjc1MzEwODk2NjY1Kmk7dmFyIGE9VHQodGhpcy5jYmcsdGhpcy5sYXQwKTt0aGlzLlpiPS10aGlzLlFuKihhK2Z1bmN0aW9uKHQscyl7Zm9yKHZhciBpLGE9MipNYXRoLmNvcyhzKSxoPXQubGVuZ3RoLTEsZT10W2hdLG49MDswPD0tLWg7KWk9YSplLW4rdFtoXSxuPWUsZT1pO3JldHVybiBNYXRoLnNpbihzKSppfSh0aGlzLmd0dSwyKmEpKX0sZm9yd2FyZDpmdW5jdGlvbih0KXt2YXIgcz1udCh0LngtdGhpcy5sb25nMCksaT10LnksaT1UdCh0aGlzLmNiZyxpKSxhPU1hdGguc2luKGkpLGg9TWF0aC5jb3MoaSksZT1NYXRoLnNpbihzKSxuPU1hdGguY29zKHMpO2k9TWF0aC5hdGFuMihhLG4qaCkscz1NYXRoLmF0YW4yKGUqaCxSdChhLGgqbikpLHM9THQoTWF0aC50YW4ocykpO3ZhciByLG8sbD1EdCh0aGlzLmd0dSwyKmksMipzKTtyZXR1cm4gaSs9bFswXSxzKz1sWzFdLG89TWF0aC5hYnMocyk8PTIuNjIzMzk1MTYyNzc4PyhyPXRoaXMuYSoodGhpcy5RbipzKSt0aGlzLngwLHRoaXMuYSoodGhpcy5RbippK3RoaXMuWmIpK3RoaXMueTApOnI9MS8wLHQueD1yLHQueT1vLHR9LGludmVyc2U6ZnVuY3Rpb24odCl7dmFyIHMsaSxhLGgsZSxuLHIsbz0odC54LXRoaXMueDApKigxL3RoaXMuYSksbD0odC55LXRoaXMueTApKigxL3RoaXMuYSk7cmV0dXJuIGw9KGwtdGhpcy5aYikvdGhpcy5RbixvLz10aGlzLlFuLHI9TWF0aC5hYnMobyk8PTIuNjIzMzk1MTYyNzc4PyhsKz0ocz1EdCh0aGlzLnV0ZywyKmwsMipvKSlbMF0sbys9c1sxXSxvPU1hdGguYXRhbih6dChvKSksaT1NYXRoLnNpbihsKSxhPU1hdGguY29zKGwpLGg9TWF0aC5zaW4obyksZT1NYXRoLmNvcyhvKSxsPU1hdGguYXRhbjIoaSplLFJ0KGgsZSphKSksbz1NYXRoLmF0YW4yKGgsZSphKSxuPW50KG8rdGhpcy5sb25nMCksVHQodGhpcy5jZ2IsbCkpOm49MS8wLHQueD1uLHQueT1yLHR9LG5hbWVzOlsiRXh0ZW5kZWRfVHJhbnN2ZXJzZV9NZXJjYXRvciIsIkV4dGVuZGVkIFRyYW5zdmVyc2UgTWVyY2F0b3IiLCJldG1lcmMiXX0sYXM9e2luaXQ6ZnVuY3Rpb24oKXt2YXIgdD1mdW5jdGlvbih0LHMpe2lmKHZvaWQgMD09PXQpe2lmKCh0PU1hdGguZmxvb3IoMzAqKG50KHMpK01hdGguUEkpL01hdGguUEkpKzEpPDApcmV0dXJuIDA7aWYoNjA8dClyZXR1cm4gNjB9cmV0dXJuIHR9KHRoaXMuem9uZSx0aGlzLmxvbmcwKTtpZih2b2lkIDA9PT10KXRocm93IG5ldyBFcnJvcigidW5rbm93biB1dG0gem9uZSIpO3RoaXMubGF0MD0wLHRoaXMubG9uZzA9KDYqTWF0aC5hYnModCktMTgzKSpOLHRoaXMueDA9NWU1LHRoaXMueTA9dGhpcy51dG1Tb3V0aD8xZTc6MCx0aGlzLmswPS45OTk2LGlzLmluaXQuYXBwbHkodGhpcyksdGhpcy5mb3J3YXJkPWlzLmZvcndhcmQsdGhpcy5pbnZlcnNlPWlzLmludmVyc2V9LG5hbWVzOlsiVW5pdmVyc2FsIFRyYW5zdmVyc2UgTWVyY2F0b3IgU3lzdGVtIiwidXRtIl0sZGVwZW5kc09uOiJldG1lcmMifSxocz17aW5pdDpmdW5jdGlvbigpe3ZhciB0PU1hdGguc2luKHRoaXMubGF0MCkscz1NYXRoLmNvcyh0aGlzLmxhdDApO3MqPXMsdGhpcy5yYz1NYXRoLnNxcnQoMS10aGlzLmVzKS8oMS10aGlzLmVzKnQqdCksdGhpcy5DPU1hdGguc3FydCgxK3RoaXMuZXMqcypzLygxLXRoaXMuZXMpKSx0aGlzLnBoaWMwPU1hdGguYXNpbih0L3RoaXMuQyksdGhpcy5yYXRleHA9LjUqdGhpcy5DKnRoaXMuZSx0aGlzLks9TWF0aC50YW4oLjUqdGhpcy5waGljMCtVKS8oTWF0aC5wb3coTWF0aC50YW4oLjUqdGhpcy5sYXQwK1UpLHRoaXMuQykqQnQodGhpcy5lKnQsdGhpcy5yYXRleHApKX0sZm9yd2FyZDpmdW5jdGlvbih0KXt2YXIgcz10LngsaT10Lnk7cmV0dXJuIHQueT0yKk1hdGguYXRhbih0aGlzLksqTWF0aC5wb3coTWF0aC50YW4oLjUqaStVKSx0aGlzLkMpKkJ0KHRoaXMuZSpNYXRoLnNpbihpKSx0aGlzLnJhdGV4cCkpLXosdC54PXRoaXMuQypzLHR9LGludmVyc2U6ZnVuY3Rpb24odCl7Zm9yKHZhciBzPXQueC90aGlzLkMsaT10LnksYT1NYXRoLnBvdyhNYXRoLnRhbiguNSppK1UpL3RoaXMuSywxL3RoaXMuQyksaD0yMDswPGgmJihpPTIqTWF0aC5hdGFuKGEqQnQodGhpcy5lKk1hdGguc2luKHQueSksLS41KnRoaXMuZSkpLXosIShNYXRoLmFicyhpLXQueSk8MWUtMTQpKTstLWgpdC55PWk7cmV0dXJuIGg/KHQueD1zLHQueT1pLHQpOm51bGx9LG5hbWVzOlsiZ2F1c3MiXX0sZXM9e2luaXQ6ZnVuY3Rpb24oKXtocy5pbml0LmFwcGx5KHRoaXMpLHRoaXMucmMmJih0aGlzLnNpbmMwPU1hdGguc2luKHRoaXMucGhpYzApLHRoaXMuY29zYzA9TWF0aC5jb3ModGhpcy5waGljMCksdGhpcy5SMj0yKnRoaXMucmMsdGhpcy50aXRsZXx8KHRoaXMudGl0bGU9Ik9ibGlxdWUgU3RlcmVvZ3JhcGhpYyBBbHRlcm5hdGl2ZSIpKX0sZm9yd2FyZDpmdW5jdGlvbih0KXt2YXIgcyxpLGEsaDtyZXR1cm4gdC54PW50KHQueC10aGlzLmxvbmcwKSxocy5mb3J3YXJkLmFwcGx5KHRoaXMsW3RdKSxzPU1hdGguc2luKHQueSksaT1NYXRoLmNvcyh0LnkpLGE9TWF0aC5jb3ModC54KSxoPXRoaXMuazAqdGhpcy5SMi8oMSt0aGlzLnNpbmMwKnMrdGhpcy5jb3NjMCppKmEpLHQueD1oKmkqTWF0aC5zaW4odC54KSx0Lnk9aCoodGhpcy5jb3NjMCpzLXRoaXMuc2luYzAqaSphKSx0Lng9dGhpcy5hKnQueCt0aGlzLngwLHQueT10aGlzLmEqdC55K3RoaXMueTAsdH0saW52ZXJzZTpmdW5jdGlvbih0KXt2YXIgcyxpLGEsaCxlLG47cmV0dXJuIHQueD0odC54LXRoaXMueDApL3RoaXMuYSx0Lnk9KHQueS10aGlzLnkwKS90aGlzLmEsdC54Lz10aGlzLmswLHQueS89dGhpcy5rMCxuPShzPU1hdGguc3FydCh0LngqdC54K3QueSp0LnkpKT8oaT0yKk1hdGguYXRhbjIocyx0aGlzLlIyKSxhPU1hdGguc2luKGkpLGg9TWF0aC5jb3MoaSksZT1NYXRoLmFzaW4oaCp0aGlzLnNpbmMwK3QueSphKnRoaXMuY29zYzAvcyksTWF0aC5hdGFuMih0LngqYSxzKnRoaXMuY29zYzAqaC10LnkqdGhpcy5zaW5jMCphKSk6KGU9dGhpcy5waGljMCwwKSx0Lng9bix0Lnk9ZSxocy5pbnZlcnNlLmFwcGx5KHRoaXMsW3RdKSx0Lng9bnQodC54K3RoaXMubG9uZzApLHR9LG5hbWVzOlsiU3RlcmVvZ3JhcGhpY19Ob3J0aF9Qb2xlIiwiT2JsaXF1ZV9TdGVyZW9ncmFwaGljIiwiUG9sYXJfU3RlcmVvZ3JhcGhpYyIsInN0ZXJlYSIsIk9ibGlxdWUgU3RlcmVvZ3JhcGhpYyBBbHRlcm5hdGl2ZSIsIkRvdWJsZV9TdGVyZW9ncmFwaGljIl19LG5zPXtpbml0OmZ1bmN0aW9uKCl7dGhpcy5jb3NsYXQwPU1hdGguY29zKHRoaXMubGF0MCksdGhpcy5zaW5sYXQwPU1hdGguc2luKHRoaXMubGF0MCksdGhpcy5zcGhlcmU/MT09PXRoaXMuazAmJiFpc05hTih0aGlzLmxhdF90cykmJk1hdGguYWJzKHRoaXMuY29zbGF0MCk8PUQmJih0aGlzLmswPS41KigxK2V0KHRoaXMubGF0MCkqTWF0aC5zaW4odGhpcy5sYXRfdHMpKSk6KE1hdGguYWJzKHRoaXMuY29zbGF0MCk8PUQmJigwPHRoaXMubGF0MD90aGlzLmNvbj0xOnRoaXMuY29uPS0xKSx0aGlzLmNvbnM9TWF0aC5zcXJ0KE1hdGgucG93KDErdGhpcy5lLDErdGhpcy5lKSpNYXRoLnBvdygxLXRoaXMuZSwxLXRoaXMuZSkpLDE9PT10aGlzLmswJiYhaXNOYU4odGhpcy5sYXRfdHMpJiZNYXRoLmFicyh0aGlzLmNvc2xhdDApPD1EJiYodGhpcy5rMD0uNSp0aGlzLmNvbnMqaHQodGhpcy5lLE1hdGguc2luKHRoaXMubGF0X3RzKSxNYXRoLmNvcyh0aGlzLmxhdF90cykpL3J0KHRoaXMuZSx0aGlzLmNvbip0aGlzLmxhdF90cyx0aGlzLmNvbipNYXRoLnNpbih0aGlzLmxhdF90cykpKSx0aGlzLm1zMT1odCh0aGlzLmUsdGhpcy5zaW5sYXQwLHRoaXMuY29zbGF0MCksdGhpcy5YMD0yKk1hdGguYXRhbih0aGlzLnNzZm5fKHRoaXMubGF0MCx0aGlzLnNpbmxhdDAsdGhpcy5lKSkteix0aGlzLmNvc1gwPU1hdGguY29zKHRoaXMuWDApLHRoaXMuc2luWDA9TWF0aC5zaW4odGhpcy5YMCkpfSxmb3J3YXJkOmZ1bmN0aW9uKHQpe3ZhciBzLGksYSxoLGUsbixyPXQueCxvPXQueSxsPU1hdGguc2luKG8pLE09TWF0aC5jb3MobyksYz1udChyLXRoaXMubG9uZzApO3JldHVybiBNYXRoLmFicyhNYXRoLmFicyhyLXRoaXMubG9uZzApLU1hdGguUEkpPD1EJiZNYXRoLmFicyhvK3RoaXMubGF0MCk8PUQ/KHQueD1OYU4sdC55PU5hTik6dGhpcy5zcGhlcmU/KHM9Mip0aGlzLmswLygxK3RoaXMuc2lubGF0MCpsK3RoaXMuY29zbGF0MCpNKk1hdGguY29zKGMpKSx0Lng9dGhpcy5hKnMqTSpNYXRoLnNpbihjKSt0aGlzLngwLHQueT10aGlzLmEqcyoodGhpcy5jb3NsYXQwKmwtdGhpcy5zaW5sYXQwKk0qTWF0aC5jb3MoYykpK3RoaXMueTApOihpPTIqTWF0aC5hdGFuKHRoaXMuc3Nmbl8obyxsLHRoaXMuZSkpLXosaD1NYXRoLmNvcyhpKSxhPU1hdGguc2luKGkpLE1hdGguYWJzKHRoaXMuY29zbGF0MCk8PUQ/KGU9cnQodGhpcy5lLG8qdGhpcy5jb24sdGhpcy5jb24qbCksbj0yKnRoaXMuYSp0aGlzLmswKmUvdGhpcy5jb25zLHQueD10aGlzLngwK24qTWF0aC5zaW4oci10aGlzLmxvbmcwKSx0Lnk9dGhpcy55MC10aGlzLmNvbipuKk1hdGguY29zKHItdGhpcy5sb25nMCkpOihNYXRoLmFicyh0aGlzLnNpbmxhdDApPEQ/KHM9Mip0aGlzLmEqdGhpcy5rMC8oMStoKk1hdGguY29zKGMpKSx0Lnk9cyphKToocz0yKnRoaXMuYSp0aGlzLmswKnRoaXMubXMxLyh0aGlzLmNvc1gwKigxK3RoaXMuc2luWDAqYSt0aGlzLmNvc1gwKmgqTWF0aC5jb3MoYykpKSx0Lnk9cyoodGhpcy5jb3NYMCphLXRoaXMuc2luWDAqaCpNYXRoLmNvcyhjKSkrdGhpcy55MCksdC54PXMqaCpNYXRoLnNpbihjKSt0aGlzLngwKSksdH0saW52ZXJzZTpmdW5jdGlvbih0KXt0LngtPXRoaXMueDAsdC55LT10aGlzLnkwO3ZhciBzLGksYSxoPU1hdGguc3FydCh0LngqdC54K3QueSp0LnkpO2lmKHRoaXMuc3BoZXJlKXt2YXIgZT0yKk1hdGguYXRhbihoLygyKnRoaXMuYSp0aGlzLmswKSksbj10aGlzLmxvbmcwLHI9dGhpcy5sYXQwO3JldHVybiBoPD1EfHwocj1NYXRoLmFzaW4oTWF0aC5jb3MoZSkqdGhpcy5zaW5sYXQwK3QueSpNYXRoLnNpbihlKSp0aGlzLmNvc2xhdDAvaCksbj1udChNYXRoLmFicyh0aGlzLmNvc2xhdDApPEQ/MDx0aGlzLmxhdDA/dGhpcy5sb25nMCtNYXRoLmF0YW4yKHQueCwtMSp0LnkpOnRoaXMubG9uZzArTWF0aC5hdGFuMih0LngsdC55KTp0aGlzLmxvbmcwK01hdGguYXRhbjIodC54Kk1hdGguc2luKGUpLGgqdGhpcy5jb3NsYXQwKk1hdGguY29zKGUpLXQueSp0aGlzLnNpbmxhdDAqTWF0aC5zaW4oZSkpKSksdC54PW4sdC55PXIsdH1pZihNYXRoLmFicyh0aGlzLmNvc2xhdDApPD1EKXtpZihoPD1EKXJldHVybiByPXRoaXMubGF0MCxuPXRoaXMubG9uZzAsdC54PW4sdC55PXIsdDt0LngqPXRoaXMuY29uLHQueSo9dGhpcy5jb24scz1oKnRoaXMuY29ucy8oMip0aGlzLmEqdGhpcy5rMCkscj10aGlzLmNvbipvdCh0aGlzLmUscyksbj10aGlzLmNvbipudCh0aGlzLmNvbip0aGlzLmxvbmcwK01hdGguYXRhbjIodC54LC0xKnQueSkpfWVsc2UgaT0yKk1hdGguYXRhbihoKnRoaXMuY29zWDAvKDIqdGhpcy5hKnRoaXMuazAqdGhpcy5tczEpKSxuPXRoaXMubG9uZzAsaDw9RD9hPXRoaXMuWDA6KGE9TWF0aC5hc2luKE1hdGguY29zKGkpKnRoaXMuc2luWDArdC55Kk1hdGguc2luKGkpKnRoaXMuY29zWDAvaCksbj1udCh0aGlzLmxvbmcwK01hdGguYXRhbjIodC54Kk1hdGguc2luKGkpLGgqdGhpcy5jb3NYMCpNYXRoLmNvcyhpKS10LnkqdGhpcy5zaW5YMCpNYXRoLnNpbihpKSkpKSxyPS0xKm90KHRoaXMuZSxNYXRoLnRhbiguNSooeithKSkpO3JldHVybiB0Lng9bix0Lnk9cix0fSxuYW1lczpbInN0ZXJlIiwiU3RlcmVvZ3JhcGhpY19Tb3V0aF9Qb2xlIiwiUG9sYXIgU3RlcmVvZ3JhcGhpYyAodmFyaWFudCBCKSJdLHNzZm5fOmZ1bmN0aW9uKHQscyxpKXtyZXR1cm4gcyo9aSxNYXRoLnRhbiguNSooeit0KSkqTWF0aC5wb3coKDEtcykvKDErcyksLjUqaSl9fSxycz17aW5pdDpmdW5jdGlvbigpe3ZhciB0PXRoaXMubGF0MDt0aGlzLmxhbWJkYTA9dGhpcy5sb25nMDt2YXIgcz1NYXRoLnNpbih0KSxpPXRoaXMuYSxhPTEvdGhpcy5yZixoPTIqYS1NYXRoLnBvdyhhLDIpLGU9dGhpcy5lPU1hdGguc3FydChoKTt0aGlzLlI9dGhpcy5rMCppKk1hdGguc3FydCgxLWgpLygxLWgqTWF0aC5wb3cocywyKSksdGhpcy5hbHBoYT1NYXRoLnNxcnQoMStoLygxLWgpKk1hdGgucG93KE1hdGguY29zKHQpLDQpKSx0aGlzLmIwPU1hdGguYXNpbihzL3RoaXMuYWxwaGEpO3ZhciBuPU1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkvNCt0aGlzLmIwLzIpKSxyPU1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkvNCt0LzIpKSxvPU1hdGgubG9nKCgxK2UqcykvKDEtZSpzKSk7dGhpcy5LPW4tdGhpcy5hbHBoYSpyK3RoaXMuYWxwaGEqZS8yKm99LGZvcndhcmQ6ZnVuY3Rpb24odCl7dmFyIHM9TWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSS80LXQueS8yKSksaT10aGlzLmUvMipNYXRoLmxvZygoMSt0aGlzLmUqTWF0aC5zaW4odC55KSkvKDEtdGhpcy5lKk1hdGguc2luKHQueSkpKSxhPS10aGlzLmFscGhhKihzK2kpK3RoaXMuSyxoPTIqKE1hdGguYXRhbihNYXRoLmV4cChhKSktTWF0aC5QSS80KSxlPXRoaXMuYWxwaGEqKHQueC10aGlzLmxhbWJkYTApLG49TWF0aC5hdGFuKE1hdGguc2luKGUpLyhNYXRoLnNpbih0aGlzLmIwKSpNYXRoLnRhbihoKStNYXRoLmNvcyh0aGlzLmIwKSpNYXRoLmNvcyhlKSkpLHI9TWF0aC5hc2luKE1hdGguY29zKHRoaXMuYjApKk1hdGguc2luKGgpLU1hdGguc2luKHRoaXMuYjApKk1hdGguY29zKGgpKk1hdGguY29zKGUpKTtyZXR1cm4gdC55PXRoaXMuUi8yKk1hdGgubG9nKCgxK01hdGguc2luKHIpKS8oMS1NYXRoLnNpbihyKSkpK3RoaXMueTAsdC54PXRoaXMuUipuK3RoaXMueDAsdH0saW52ZXJzZTpmdW5jdGlvbih0KXtmb3IodmFyIHM9dC54LXRoaXMueDAsaT10LnktdGhpcy55MCxhPXMvdGhpcy5SLGg9MiooTWF0aC5hdGFuKE1hdGguZXhwKGkvdGhpcy5SKSktTWF0aC5QSS80KSxlPU1hdGguYXNpbihNYXRoLmNvcyh0aGlzLmIwKSpNYXRoLnNpbihoKStNYXRoLnNpbih0aGlzLmIwKSpNYXRoLmNvcyhoKSpNYXRoLmNvcyhhKSksbj1NYXRoLmF0YW4oTWF0aC5zaW4oYSkvKE1hdGguY29zKHRoaXMuYjApKk1hdGguY29zKGEpLU1hdGguc2luKHRoaXMuYjApKk1hdGgudGFuKGgpKSkscj10aGlzLmxhbWJkYTArbi90aGlzLmFscGhhLG89MCxsPWUsTT0tMWUzLGM9MDsxZS03PE1hdGguYWJzKGwtTSk7KXtpZigyMDwrK2MpcmV0dXJuO289MS90aGlzLmFscGhhKihNYXRoLmxvZyhNYXRoLnRhbihNYXRoLlBJLzQrZS8yKSktdGhpcy5LKSt0aGlzLmUqTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSS80K01hdGguYXNpbih0aGlzLmUqTWF0aC5zaW4obCkpLzIpKSxNPWwsbD0yKk1hdGguYXRhbihNYXRoLmV4cChvKSktTWF0aC5QSS8yfXJldHVybiB0Lng9cix0Lnk9bCx0fSxuYW1lczpbInNvbWVyYyJdfSxvcz17aW5pdDpmdW5jdGlvbigpe3RoaXMubm9fb2ZmPXRoaXMubm9fb2ZmfHwhMSx0aGlzLm5vX3JvdD10aGlzLm5vX3JvdHx8ITEsaXNOYU4odGhpcy5rMCkmJih0aGlzLmswPTEpO3ZhciB0PU1hdGguc2luKHRoaXMubGF0MCkscz1NYXRoLmNvcyh0aGlzLmxhdDApLGk9dGhpcy5lKnQ7dGhpcy5ibD1NYXRoLnNxcnQoMSt0aGlzLmVzLygxLXRoaXMuZXMpKk1hdGgucG93KHMsNCkpLHRoaXMuYWw9dGhpcy5hKnRoaXMuYmwqdGhpcy5rMCpNYXRoLnNxcnQoMS10aGlzLmVzKS8oMS1pKmkpO3ZhciBhLGgsZSxuLHIsbyxsLE0sYyx1LGY9cnQodGhpcy5lLHRoaXMubGF0MCx0KSxtPXRoaXMuYmwvcypNYXRoLnNxcnQoKDEtdGhpcy5lcykvKDEtaSppKSk7bSptPDEmJihtPTEpLGlzTmFOKHRoaXMubG9uZ2MpPyhoPXJ0KHRoaXMuZSx0aGlzLmxhdDEsTWF0aC5zaW4odGhpcy5sYXQxKSksZT1ydCh0aGlzLmUsdGhpcy5sYXQyLE1hdGguc2luKHRoaXMubGF0MikpLDA8PXRoaXMubGF0MD90aGlzLmVsPShtK01hdGguc3FydChtKm0tMSkpKk1hdGgucG93KGYsdGhpcy5ibCk6dGhpcy5lbD0obS1NYXRoLnNxcnQobSptLTEpKSpNYXRoLnBvdyhmLHRoaXMuYmwpLG49TWF0aC5wb3coaCx0aGlzLmJsKSxyPU1hdGgucG93KGUsdGhpcy5ibCksbz0uNSooKGE9dGhpcy5lbC9uKS0xL2EpLGw9KHRoaXMuZWwqdGhpcy5lbC1yKm4pLyh0aGlzLmVsKnRoaXMuZWwrcipuKSxNPShyLW4pLyhyK24pLGM9bnQodGhpcy5sb25nMS10aGlzLmxvbmcyKSx0aGlzLmxvbmcwPS41Kih0aGlzLmxvbmcxK3RoaXMubG9uZzIpLU1hdGguYXRhbihsKk1hdGgudGFuKC41KnRoaXMuYmwqYykvTSkvdGhpcy5ibCx0aGlzLmxvbmcwPW50KHRoaXMubG9uZzApLHU9bnQodGhpcy5sb25nMS10aGlzLmxvbmcwKSx0aGlzLmdhbW1hMD1NYXRoLmF0YW4oTWF0aC5zaW4odGhpcy5ibCp1KS9vKSx0aGlzLmFscGhhPU1hdGguYXNpbihtKk1hdGguc2luKHRoaXMuZ2FtbWEwKSkpOihhPTA8PXRoaXMubGF0MD9tK01hdGguc3FydChtKm0tMSk6bS1NYXRoLnNxcnQobSptLTEpLHRoaXMuZWw9YSpNYXRoLnBvdyhmLHRoaXMuYmwpLG89LjUqKGEtMS9hKSx0aGlzLmdhbW1hMD1NYXRoLmFzaW4oTWF0aC5zaW4odGhpcy5hbHBoYSkvbSksdGhpcy5sb25nMD10aGlzLmxvbmdjLU1hdGguYXNpbihvKk1hdGgudGFuKHRoaXMuZ2FtbWEwKSkvdGhpcy5ibCksdGhpcy5ub19vZmY/dGhpcy51Yz0wOjA8PXRoaXMubGF0MD90aGlzLnVjPXRoaXMuYWwvdGhpcy5ibCpNYXRoLmF0YW4yKE1hdGguc3FydChtKm0tMSksTWF0aC5jb3ModGhpcy5hbHBoYSkpOnRoaXMudWM9LTEqdGhpcy5hbC90aGlzLmJsKk1hdGguYXRhbjIoTWF0aC5zcXJ0KG0qbS0xKSxNYXRoLmNvcyh0aGlzLmFscGhhKSl9LGZvcndhcmQ6ZnVuY3Rpb24odCl7dmFyIHMsaSxhLGgsZSxuLHIsbyxsLE09dC54LGM9dC55LHU9bnQoTS10aGlzLmxvbmcwKTtyZXR1cm4gbD1NYXRoLmFicyhNYXRoLmFicyhjKS16KTw9RD8ocz0wPGM/LTE6MSxvPXRoaXMuYWwvdGhpcy5ibCpNYXRoLmxvZyhNYXRoLnRhbihVK3MqdGhpcy5nYW1tYTAqLjUpKSwtMSpzKnoqdGhpcy5hbC90aGlzLmJsKTooaT1ydCh0aGlzLmUsYyxNYXRoLnNpbihjKSksaD0uNSooKGE9dGhpcy5lbC9NYXRoLnBvdyhpLHRoaXMuYmwpKS0xL2EpLGU9LjUqKGErMS9hKSxuPU1hdGguc2luKHRoaXMuYmwqdSkscj0oaCpNYXRoLnNpbih0aGlzLmdhbW1hMCktbipNYXRoLmNvcyh0aGlzLmdhbW1hMCkpL2Usbz1NYXRoLmFicyhNYXRoLmFicyhyKS0xKTw9RD9OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk6LjUqdGhpcy5hbCpNYXRoLmxvZygoMS1yKS8oMStyKSkvdGhpcy5ibCxNYXRoLmFicyhNYXRoLmNvcyh0aGlzLmJsKnUpKTw9RD90aGlzLmFsKnRoaXMuYmwqdTp0aGlzLmFsKk1hdGguYXRhbjIoaCpNYXRoLmNvcyh0aGlzLmdhbW1hMCkrbipNYXRoLnNpbih0aGlzLmdhbW1hMCksTWF0aC5jb3ModGhpcy5ibCp1KSkvdGhpcy5ibCksdGhpcy5ub19yb3Q/KHQueD10aGlzLngwK2wsdC55PXRoaXMueTArbyk6KGwtPXRoaXMudWMsdC54PXRoaXMueDArbypNYXRoLmNvcyh0aGlzLmFscGhhKStsKk1hdGguc2luKHRoaXMuYWxwaGEpLHQueT10aGlzLnkwK2wqTWF0aC5jb3ModGhpcy5hbHBoYSktbypNYXRoLnNpbih0aGlzLmFscGhhKSksdH0saW52ZXJzZTpmdW5jdGlvbih0KXt2YXIgcyxpO3RoaXMubm9fcm90PyhpPXQueS10aGlzLnkwLHM9dC54LXRoaXMueDApOihpPSh0LngtdGhpcy54MCkqTWF0aC5jb3ModGhpcy5hbHBoYSktKHQueS10aGlzLnkwKSpNYXRoLnNpbih0aGlzLmFscGhhKSxzPSh0LnktdGhpcy55MCkqTWF0aC5jb3ModGhpcy5hbHBoYSkrKHQueC10aGlzLngwKSpNYXRoLnNpbih0aGlzLmFscGhhKSxzKz10aGlzLnVjKTt2YXIgYT1NYXRoLmV4cCgtMSp0aGlzLmJsKmkvdGhpcy5hbCksaD0uNSooYS0xL2EpLGU9LjUqKGErMS9hKSxuPU1hdGguc2luKHRoaXMuYmwqcy90aGlzLmFsKSxyPShuKk1hdGguY29zKHRoaXMuZ2FtbWEwKStoKk1hdGguc2luKHRoaXMuZ2FtbWEwKSkvZSxvPU1hdGgucG93KHRoaXMuZWwvTWF0aC5zcXJ0KCgxK3IpLygxLXIpKSwxL3RoaXMuYmwpO3JldHVybiBNYXRoLmFicyhyLTEpPEQ/KHQueD10aGlzLmxvbmcwLHQueT16KTpNYXRoLmFicygxK3IpPEQ/KHQueD10aGlzLmxvbmcwLHQueT0tMSp6KToodC55PW90KHRoaXMuZSxvKSx0Lng9bnQodGhpcy5sb25nMC1NYXRoLmF0YW4yKGgqTWF0aC5jb3ModGhpcy5nYW1tYTApLW4qTWF0aC5zaW4odGhpcy5nYW1tYTApLE1hdGguY29zKHRoaXMuYmwqcy90aGlzLmFsKSkvdGhpcy5ibCkpLHR9LG5hbWVzOlsiSG90aW5lX09ibGlxdWVfTWVyY2F0b3IiLCJIb3RpbmUgT2JsaXF1ZSBNZXJjYXRvciIsIkhvdGluZV9PYmxpcXVlX01lcmNhdG9yX0F6aW11dGhfTmF0dXJhbF9PcmlnaW4iLCJIb3RpbmVfT2JsaXF1ZV9NZXJjYXRvcl9BemltdXRoX0NlbnRlciIsIm9tZXJjIl19LGxzPXtpbml0OmZ1bmN0aW9uKCl7dmFyIHQscyxpLGEsaCxlLG4scixvLGw7dGhpcy5sYXQyfHwodGhpcy5sYXQyPXRoaXMubGF0MSksdGhpcy5rMHx8KHRoaXMuazA9MSksdGhpcy54MD10aGlzLngwfHwwLHRoaXMueTA9dGhpcy55MHx8MCxNYXRoLmFicyh0aGlzLmxhdDErdGhpcy5sYXQyKTxEfHwodD10aGlzLmIvdGhpcy5hLHRoaXMuZT1NYXRoLnNxcnQoMS10KnQpLHM9TWF0aC5zaW4odGhpcy5sYXQxKSxpPU1hdGguY29zKHRoaXMubGF0MSksYT1odCh0aGlzLmUscyxpKSxoPXJ0KHRoaXMuZSx0aGlzLmxhdDEscyksZT1NYXRoLnNpbih0aGlzLmxhdDIpLG49TWF0aC5jb3ModGhpcy5sYXQyKSxyPWh0KHRoaXMuZSxlLG4pLG89cnQodGhpcy5lLHRoaXMubGF0MixlKSxsPXJ0KHRoaXMuZSx0aGlzLmxhdDAsTWF0aC5zaW4odGhpcy5sYXQwKSksTWF0aC5hYnModGhpcy5sYXQxLXRoaXMubGF0Mik+RD90aGlzLm5zPU1hdGgubG9nKGEvcikvTWF0aC5sb2coaC9vKTp0aGlzLm5zPXMsaXNOYU4odGhpcy5ucykmJih0aGlzLm5zPXMpLHRoaXMuZjA9YS8odGhpcy5ucypNYXRoLnBvdyhoLHRoaXMubnMpKSx0aGlzLnJoPXRoaXMuYSp0aGlzLmYwKk1hdGgucG93KGwsdGhpcy5ucyksdGhpcy50aXRsZXx8KHRoaXMudGl0bGU9IkxhbWJlcnQgQ29uZm9ybWFsIENvbmljIikpfSxmb3J3YXJkOmZ1bmN0aW9uKHQpe3ZhciBzPXQueCxpPXQueTtNYXRoLmFicygyKk1hdGguYWJzKGkpLU1hdGguUEkpPD1EJiYoaT1ldChpKSooei0yKkQpKTt2YXIgYSxoLGU9TWF0aC5hYnMoTWF0aC5hYnMoaSkteik7aWYoRDxlKWE9cnQodGhpcy5lLGksTWF0aC5zaW4oaSkpLGg9dGhpcy5hKnRoaXMuZjAqTWF0aC5wb3coYSx0aGlzLm5zKTtlbHNle2lmKChlPWkqdGhpcy5ucyk8PTApcmV0dXJuIG51bGw7aD0wfXZhciBuPXRoaXMubnMqbnQocy10aGlzLmxvbmcwKTtyZXR1cm4gdC54PXRoaXMuazAqKGgqTWF0aC5zaW4obikpK3RoaXMueDAsdC55PXRoaXMuazAqKHRoaXMucmgtaCpNYXRoLmNvcyhuKSkrdGhpcy55MCx0fSxpbnZlcnNlOmZ1bmN0aW9uKHQpe3ZhciBzLGksYSxoLGU9KHQueC10aGlzLngwKS90aGlzLmswLG49dGhpcy5yaC0odC55LXRoaXMueTApL3RoaXMuazAscj0wPHRoaXMubnM/KHM9TWF0aC5zcXJ0KGUqZStuKm4pLDEpOihzPS1NYXRoLnNxcnQoZSplK24qbiksLTEpLG89MDtpZigwIT09cyYmKG89TWF0aC5hdGFuMihyKmUscipuKSksMCE9PXN8fDA8dGhpcy5ucyl7aWYocj0xL3RoaXMubnMsaT1NYXRoLnBvdyhzLyh0aGlzLmEqdGhpcy5mMCksciksLTk5OTk9PT0oYT1vdCh0aGlzLmUsaSkpKXJldHVybiBudWxsfWVsc2UgYT0tejtyZXR1cm4gaD1udChvL3RoaXMubnMrdGhpcy5sb25nMCksdC54PWgsdC55PWEsdH0sbmFtZXM6WyJMYW1iZXJ0IFRhbmdlbnRpYWwgQ29uZm9ybWFsIENvbmljIFByb2plY3Rpb24iLCJMYW1iZXJ0X0NvbmZvcm1hbF9Db25pYyIsIkxhbWJlcnRfQ29uZm9ybWFsX0NvbmljXzJTUCIsImxjYyJdfSxNcz17aW5pdDpmdW5jdGlvbigpe3RoaXMuYT02Mzc3Mzk3LjE1NSx0aGlzLmVzPS4wMDY2NzQzNzIyMzA2MTQsdGhpcy5lPU1hdGguc3FydCh0aGlzLmVzKSx0aGlzLmxhdDB8fCh0aGlzLmxhdDA9Ljg2MzkzNzk3OTczNzE5MyksdGhpcy5sb25nMHx8KHRoaXMubG9uZzA9LjQzMzQyMzQzMDkxMTkyNTEpLHRoaXMuazB8fCh0aGlzLmswPS45OTk5KSx0aGlzLnM0NT0uNzg1Mzk4MTYzMzk3NDQ4LHRoaXMuczkwPTIqdGhpcy5zNDUsdGhpcy5maTA9dGhpcy5sYXQwLHRoaXMuZTI9dGhpcy5lcyx0aGlzLmU9TWF0aC5zcXJ0KHRoaXMuZTIpLHRoaXMuYWxmYT1NYXRoLnNxcnQoMSt0aGlzLmUyKk1hdGgucG93KE1hdGguY29zKHRoaXMuZmkwKSw0KS8oMS10aGlzLmUyKSksdGhpcy51cT0xLjA0MjE2ODU2MzgwNDc0LHRoaXMudTA9TWF0aC5hc2luKE1hdGguc2luKHRoaXMuZmkwKS90aGlzLmFsZmEpLHRoaXMuZz1NYXRoLnBvdygoMSt0aGlzLmUqTWF0aC5zaW4odGhpcy5maTApKS8oMS10aGlzLmUqTWF0aC5zaW4odGhpcy5maTApKSx0aGlzLmFsZmEqdGhpcy5lLzIpLHRoaXMuaz1NYXRoLnRhbih0aGlzLnUwLzIrdGhpcy5zNDUpL01hdGgucG93KE1hdGgudGFuKHRoaXMuZmkwLzIrdGhpcy5zNDUpLHRoaXMuYWxmYSkqdGhpcy5nLHRoaXMuazE9dGhpcy5rMCx0aGlzLm4wPXRoaXMuYSpNYXRoLnNxcnQoMS10aGlzLmUyKS8oMS10aGlzLmUyKk1hdGgucG93KE1hdGguc2luKHRoaXMuZmkwKSwyKSksdGhpcy5zMD0xLjM3MDA4MzQ2MjgxNTU1LHRoaXMubj1NYXRoLnNpbih0aGlzLnMwKSx0aGlzLnJvMD10aGlzLmsxKnRoaXMubjAvTWF0aC50YW4odGhpcy5zMCksdGhpcy5hZD10aGlzLnM5MC10aGlzLnVxfSxmb3J3YXJkOmZ1bmN0aW9uKHQpe3ZhciBzPXQueCxpPXQueSxhPW50KHMtdGhpcy5sb25nMCksaD1NYXRoLnBvdygoMSt0aGlzLmUqTWF0aC5zaW4oaSkpLygxLXRoaXMuZSpNYXRoLnNpbihpKSksdGhpcy5hbGZhKnRoaXMuZS8yKSxlPTIqKE1hdGguYXRhbih0aGlzLmsqTWF0aC5wb3coTWF0aC50YW4oaS8yK3RoaXMuczQ1KSx0aGlzLmFsZmEpL2gpLXRoaXMuczQ1KSxuPS1hKnRoaXMuYWxmYSxyPU1hdGguYXNpbihNYXRoLmNvcyh0aGlzLmFkKSpNYXRoLnNpbihlKStNYXRoLnNpbih0aGlzLmFkKSpNYXRoLmNvcyhlKSpNYXRoLmNvcyhuKSksbz1NYXRoLmFzaW4oTWF0aC5jb3MoZSkqTWF0aC5zaW4obikvTWF0aC5jb3MocikpLGw9dGhpcy5uKm8sTT10aGlzLnJvMCpNYXRoLnBvdyhNYXRoLnRhbih0aGlzLnMwLzIrdGhpcy5zNDUpLHRoaXMubikvTWF0aC5wb3coTWF0aC50YW4oci8yK3RoaXMuczQ1KSx0aGlzLm4pO3JldHVybiB0Lnk9TSpNYXRoLmNvcyhsKSx0Lng9TSpNYXRoLnNpbihsKSx0aGlzLmN6ZWNofHwodC55Kj0tMSx0LngqPS0xKSx0fSxpbnZlcnNlOmZ1bmN0aW9uKHQpe3ZhciBzLGksYSxoLGUsbixyLG89dC54O3QueD10LnksdC55PW8sdGhpcy5jemVjaHx8KHQueSo9LTEsdC54Kj0tMSksZT1NYXRoLnNxcnQodC54KnQueCt0LnkqdC55KSxoPU1hdGguYXRhbjIodC55LHQueCkvTWF0aC5zaW4odGhpcy5zMCksYT0yKihNYXRoLmF0YW4oTWF0aC5wb3codGhpcy5ybzAvZSwxL3RoaXMubikqTWF0aC50YW4odGhpcy5zMC8yK3RoaXMuczQ1KSktdGhpcy5zNDUpLHM9TWF0aC5hc2luKE1hdGguY29zKHRoaXMuYWQpKk1hdGguc2luKGEpLU1hdGguc2luKHRoaXMuYWQpKk1hdGguY29zKGEpKk1hdGguY29zKGgpKSxpPU1hdGguYXNpbihNYXRoLmNvcyhhKSpNYXRoLnNpbihoKS9NYXRoLmNvcyhzKSksdC54PXRoaXMubG9uZzAtaS90aGlzLmFsZmEsbj1zO2Zvcih2YXIgbD1yPTA7dC55PTIqKE1hdGguYXRhbihNYXRoLnBvdyh0aGlzLmssLTEvdGhpcy5hbGZhKSpNYXRoLnBvdyhNYXRoLnRhbihzLzIrdGhpcy5zNDUpLDEvdGhpcy5hbGZhKSpNYXRoLnBvdygoMSt0aGlzLmUqTWF0aC5zaW4obikpLygxLXRoaXMuZSpNYXRoLnNpbihuKSksdGhpcy5lLzIpKS10aGlzLnM0NSksTWF0aC5hYnMobi10LnkpPDFlLTEwJiYocj0xKSxuPXQueSxsKz0xLDA9PT1yJiZsPDE1Oyk7cmV0dXJuIDE1PD1sP251bGw6dH0sbmFtZXM6WyJLcm92YWsiLCJrcm92YWsiXX0sY3M9e2luaXQ6ZnVuY3Rpb24oKXt0aGlzLnNwaGVyZXx8KHRoaXMuZTA9RnQodGhpcy5lcyksdGhpcy5lMT1RdCh0aGlzLmVzKSx0aGlzLmUyPVd0KHRoaXMuZXMpLHRoaXMuZTM9WHQodGhpcy5lcyksdGhpcy5tbDA9dGhpcy5hKlV0KHRoaXMuZTAsdGhpcy5lMSx0aGlzLmUyLHRoaXMuZTMsdGhpcy5sYXQwKSl9LGZvcndhcmQ6ZnVuY3Rpb24odCl7dmFyIHMsaSxhLGgsZSxuLHIsbyxsLE09dC54LGM9dC55LE09bnQoTS10aGlzLmxvbmcwKTtyZXR1cm4gbD10aGlzLnNwaGVyZT8obz10aGlzLmEqTWF0aC5hc2luKE1hdGguY29zKGMpKk1hdGguc2luKE0pKSx0aGlzLmEqKE1hdGguYXRhbjIoTWF0aC50YW4oYyksTWF0aC5jb3MoTSkpLXRoaXMubGF0MCkpOihzPU1hdGguc2luKGMpLGk9TWF0aC5jb3MoYyksYT1IdCh0aGlzLmEsdGhpcy5lLHMpLGg9TWF0aC50YW4oYykqTWF0aC50YW4oYyksbz1hKihlPU0qTWF0aC5jb3MoYykpKigxLShuPWUqZSkqaCooMS82LSg4LWgrOCoocj10aGlzLmVzKmkqaS8oMS10aGlzLmVzKSkpKm4vMTIwKSksdGhpcy5hKlV0KHRoaXMuZTAsdGhpcy5lMSx0aGlzLmUyLHRoaXMuZTMsYyktdGhpcy5tbDArYSpzL2kqbiooLjUrKDUtaCs2KnIpKm4vMjQpKSx0Lng9byt0aGlzLngwLHQueT1sK3RoaXMueTAsdH0saW52ZXJzZTpmdW5jdGlvbih0KXt0LngtPXRoaXMueDAsdC55LT10aGlzLnkwO3ZhciBzPXQueC90aGlzLmEsaT10LnkvdGhpcy5hO2lmKHRoaXMuc3BoZXJlKXZhciBhPWkrdGhpcy5sYXQwLGg9TWF0aC5hc2luKE1hdGguc2luKGEpKk1hdGguY29zKHMpKSxlPU1hdGguYXRhbjIoTWF0aC50YW4ocyksTWF0aC5jb3MoYSkpO2Vsc2V7dmFyIG49dGhpcy5tbDAvdGhpcy5hK2kscj1LdChuLHRoaXMuZTAsdGhpcy5lMSx0aGlzLmUyLHRoaXMuZTMpO2lmKE1hdGguYWJzKE1hdGguYWJzKHIpLXopPD1EKXJldHVybiB0Lng9dGhpcy5sb25nMCx0Lnk9eixpPDAmJih0LnkqPS0xKSx0O3ZhciBvPUh0KHRoaXMuYSx0aGlzLmUsTWF0aC5zaW4ocikpLGw9bypvKm8vdGhpcy5hL3RoaXMuYSooMS10aGlzLmVzKSxNPU1hdGgucG93KE1hdGgudGFuKHIpLDIpLGM9cyp0aGlzLmEvbyx1PWMqYztoPXItbypNYXRoLnRhbihyKS9sKmMqYyooLjUtKDErMypNKSpjKmMvMjQpLGU9YyooMS11KihNLzMrKDErMypNKSpNKnUvMTUpKS9NYXRoLmNvcyhyKX1yZXR1cm4gdC54PW50KGUrdGhpcy5sb25nMCksdC55PUp0KGgpLHR9LG5hbWVzOlsiQ2Fzc2luaSIsIkNhc3NpbmlfU29sZG5lciIsImNhc3MiXX0sdXM9e2luaXQ6ZnVuY3Rpb24oKXt2YXIgdCxzLGksYSxoPU1hdGguYWJzKHRoaXMubGF0MCk7aWYoTWF0aC5hYnMoaC16KTxEP3RoaXMubW9kZT10aGlzLmxhdDA8MD90aGlzLlNfUE9MRTp0aGlzLk5fUE9MRTpNYXRoLmFicyhoKTxEP3RoaXMubW9kZT10aGlzLkVRVUlUOnRoaXMubW9kZT10aGlzLk9CTElRLDA8dGhpcy5lcylzd2l0Y2godGhpcy5xcD1WdCh0aGlzLmUsMSksdGhpcy5tbWY9LjUvKDEtdGhpcy5lcyksdGhpcy5hcGE9KHM9dGhpcy5lcywoYT1bXSlbMF09LjMzMzMzMzMzMzMzMzMzMzMqcyxpPXMqcyxhWzBdKz0uMTcyMjIyMjIyMjIyMjIyMjIqaSxhWzFdPS4wNjM4ODg4ODg4ODg4ODg4OCppLGkqPXMsYVswXSs9LjEwMjU3OTM2NTA3OTM2NTA4KmksYVsxXSs9LjA2NjQwMjExNjQwMjExNjQqaSxhWzJdPS4wMTY0MTUwMTI5NDIxOTE1NDMqaSxhKSx0aGlzLm1vZGUpe2Nhc2UgdGhpcy5OX1BPTEU6Y2FzZSB0aGlzLlNfUE9MRTp0aGlzLmRkPTE7YnJlYWs7Y2FzZSB0aGlzLkVRVUlUOnRoaXMucnE9TWF0aC5zcXJ0KC41KnRoaXMucXApLHRoaXMuZGQ9MS90aGlzLnJxLHRoaXMueG1mPTEsdGhpcy55bWY9LjUqdGhpcy5xcDticmVhaztjYXNlIHRoaXMuT0JMSVE6dGhpcy5ycT1NYXRoLnNxcnQoLjUqdGhpcy5xcCksdD1NYXRoLnNpbih0aGlzLmxhdDApLHRoaXMuc2luYjE9VnQodGhpcy5lLHQpL3RoaXMucXAsdGhpcy5jb3NiMT1NYXRoLnNxcnQoMS10aGlzLnNpbmIxKnRoaXMuc2luYjEpLHRoaXMuZGQ9TWF0aC5jb3ModGhpcy5sYXQwKS8oTWF0aC5zcXJ0KDEtdGhpcy5lcyp0KnQpKnRoaXMucnEqdGhpcy5jb3NiMSksdGhpcy55bWY9KHRoaXMueG1mPXRoaXMucnEpL3RoaXMuZGQsdGhpcy54bWYqPXRoaXMuZGR9ZWxzZSB0aGlzLm1vZGU9PT10aGlzLk9CTElRJiYodGhpcy5zaW5waDA9TWF0aC5zaW4odGhpcy5sYXQwKSx0aGlzLmNvc3BoMD1NYXRoLmNvcyh0aGlzLmxhdDApKX0sZm9yd2FyZDpmdW5jdGlvbih0KXt2YXIgcyxpLGEsaCxlLG4scixvLGwsTSxjPXQueCx1PXQueSxjPW50KGMtdGhpcy5sb25nMCk7aWYodGhpcy5zcGhlcmUpe2lmKGU9TWF0aC5zaW4odSksTT1NYXRoLmNvcyh1KSxhPU1hdGguY29zKGMpLHRoaXMubW9kZT09PXRoaXMuT0JMSVF8fHRoaXMubW9kZT09PXRoaXMuRVFVSVQpe2lmKChpPXRoaXMubW9kZT09PXRoaXMuRVFVSVQ/MStNKmE6MSt0aGlzLnNpbnBoMCplK3RoaXMuY29zcGgwKk0qYSk8PUQpcmV0dXJuIG51bGw7cz0oaT1NYXRoLnNxcnQoMi9pKSkqTSpNYXRoLnNpbihjKSxpKj10aGlzLm1vZGU9PT10aGlzLkVRVUlUP2U6dGhpcy5jb3NwaDAqZS10aGlzLnNpbnBoMCpNKmF9ZWxzZSBpZih0aGlzLm1vZGU9PT10aGlzLk5fUE9MRXx8dGhpcy5tb2RlPT09dGhpcy5TX1BPTEUpe2lmKHRoaXMubW9kZT09PXRoaXMuTl9QT0xFJiYoYT0tYSksTWF0aC5hYnModSt0aGlzLmxhdDApPEQpcmV0dXJuIG51bGw7aT1VLS41KnUscz0oaT0yKih0aGlzLm1vZGU9PT10aGlzLlNfUE9MRT9NYXRoLmNvcyhpKTpNYXRoLnNpbihpKSkpKk1hdGguc2luKGMpLGkqPWF9fWVsc2V7c3dpdGNoKGw9bz1yPTAsYT1NYXRoLmNvcyhjKSxoPU1hdGguc2luKGMpLGU9TWF0aC5zaW4odSksbj1WdCh0aGlzLmUsZSksdGhpcy5tb2RlIT09dGhpcy5PQkxJUSYmdGhpcy5tb2RlIT09dGhpcy5FUVVJVHx8KHI9bi90aGlzLnFwLG89TWF0aC5zcXJ0KDEtcipyKSksdGhpcy5tb2RlKXtjYXNlIHRoaXMuT0JMSVE6bD0xK3RoaXMuc2luYjEqcit0aGlzLmNvc2IxKm8qYTticmVhaztjYXNlIHRoaXMuRVFVSVQ6bD0xK28qYTticmVhaztjYXNlIHRoaXMuTl9QT0xFOmw9eit1LG49dGhpcy5xcC1uO2JyZWFrO2Nhc2UgdGhpcy5TX1BPTEU6bD11LXosbj10aGlzLnFwK259aWYoTWF0aC5hYnMobCk8RClyZXR1cm4gbnVsbDtzd2l0Y2godGhpcy5tb2RlKXtjYXNlIHRoaXMuT0JMSVE6Y2FzZSB0aGlzLkVRVUlUOmw9TWF0aC5zcXJ0KDIvbCksaT10aGlzLm1vZGU9PT10aGlzLk9CTElRP3RoaXMueW1mKmwqKHRoaXMuY29zYjEqci10aGlzLnNpbmIxKm8qYSk6KGw9TWF0aC5zcXJ0KDIvKDErbyphKSkpKnIqdGhpcy55bWYscz10aGlzLnhtZipsKm8qaDticmVhaztjYXNlIHRoaXMuTl9QT0xFOmNhc2UgdGhpcy5TX1BPTEU6MDw9bj8ocz0obD1NYXRoLnNxcnQobikpKmgsaT1hKih0aGlzLm1vZGU9PT10aGlzLlNfUE9MRT9sOi1sKSk6cz1pPTB9fXJldHVybiB0Lng9dGhpcy5hKnMrdGhpcy54MCx0Lnk9dGhpcy5hKmkrdGhpcy55MCx0fSxpbnZlcnNlOmZ1bmN0aW9uKHQpe3QueC09dGhpcy54MCx0LnktPXRoaXMueTA7dmFyIHMsaSxhLGgsZSxuLHIsbyxsLE0sYz10LngvdGhpcy5hLHU9dC55L3RoaXMuYTtpZih0aGlzLnNwaGVyZSl7dmFyIGY9MCxtPTAscD1NYXRoLnNxcnQoYypjK3UqdSk7aWYoMTwoaT0uNSpwKSlyZXR1cm4gbnVsbDtzd2l0Y2goaT0yKk1hdGguYXNpbihpKSx0aGlzLm1vZGUhPT10aGlzLk9CTElRJiZ0aGlzLm1vZGUhPT10aGlzLkVRVUlUfHwobT1NYXRoLnNpbihpKSxmPU1hdGguY29zKGkpKSx0aGlzLm1vZGUpe2Nhc2UgdGhpcy5FUVVJVDppPU1hdGguYWJzKHApPD1EPzA6TWF0aC5hc2luKHUqbS9wKSxjKj1tLHU9ZipwO2JyZWFrO2Nhc2UgdGhpcy5PQkxJUTppPU1hdGguYWJzKHApPD1EP3RoaXMubGF0MDpNYXRoLmFzaW4oZip0aGlzLnNpbnBoMCt1Km0qdGhpcy5jb3NwaDAvcCksYyo9bSp0aGlzLmNvc3BoMCx1PShmLU1hdGguc2luKGkpKnRoaXMuc2lucGgwKSpwO2JyZWFrO2Nhc2UgdGhpcy5OX1BPTEU6dT0tdSxpPXotaTticmVhaztjYXNlIHRoaXMuU19QT0xFOmktPXp9cz0wIT09dXx8dGhpcy5tb2RlIT09dGhpcy5FUVVJVCYmdGhpcy5tb2RlIT09dGhpcy5PQkxJUT9NYXRoLmF0YW4yKGMsdSk6MH1lbHNle2lmKHI9MCx0aGlzLm1vZGU9PT10aGlzLk9CTElRfHx0aGlzLm1vZGU9PT10aGlzLkVRVUlUKXtpZihjLz10aGlzLmRkLHUqPXRoaXMuZGQsKG49TWF0aC5zcXJ0KGMqYyt1KnUpKTxEKXJldHVybiB0Lng9dGhpcy5sb25nMCx0Lnk9dGhpcy5sYXQwLHQ7aD0yKk1hdGguYXNpbiguNSpuL3RoaXMucnEpLGE9TWF0aC5jb3MoaCksYyo9aD1NYXRoLnNpbihoKSx1PXRoaXMubW9kZT09PXRoaXMuT0JMSVE/KHI9YSp0aGlzLnNpbmIxK3UqaCp0aGlzLmNvc2IxL24sZT10aGlzLnFwKnIsbip0aGlzLmNvc2IxKmEtdSp0aGlzLnNpbmIxKmgpOihyPXUqaC9uLGU9dGhpcy5xcCpyLG4qYSl9ZWxzZSBpZih0aGlzLm1vZGU9PT10aGlzLk5fUE9MRXx8dGhpcy5tb2RlPT09dGhpcy5TX1BPTEUpe2lmKHRoaXMubW9kZT09PXRoaXMuTl9QT0xFJiYodT0tdSksIShlPWMqYyt1KnUpKXJldHVybiB0Lng9dGhpcy5sb25nMCx0Lnk9dGhpcy5sYXQwLHQ7cj0xLWUvdGhpcy5xcCx0aGlzLm1vZGU9PT10aGlzLlNfUE9MRSYmKHI9LXIpfXM9TWF0aC5hdGFuMihjLHUpLG89TWF0aC5hc2luKHIpLGw9dGhpcy5hcGEsTT1vK28saT1vK2xbMF0qTWF0aC5zaW4oTSkrbFsxXSpNYXRoLnNpbihNK00pK2xbMl0qTWF0aC5zaW4oTStNK00pfXJldHVybiB0Lng9bnQodGhpcy5sb25nMCtzKSx0Lnk9aSx0fSxuYW1lczpbIkxhbWJlcnQgQXppbXV0aGFsIEVxdWFsIEFyZWEiLCJMYW1iZXJ0X0F6aW11dGhhbF9FcXVhbF9BcmVhIiwibGFlYSJdLFNfUE9MRToxLE5fUE9MRToyLEVRVUlUOjMsT0JMSVE6NH0sZnM9e2luaXQ6ZnVuY3Rpb24oKXtNYXRoLmFicyh0aGlzLmxhdDErdGhpcy5sYXQyKTxEfHwodGhpcy50ZW1wPXRoaXMuYi90aGlzLmEsdGhpcy5lcz0xLU1hdGgucG93KHRoaXMudGVtcCwyKSx0aGlzLmUzPU1hdGguc3FydCh0aGlzLmVzKSx0aGlzLnNpbl9wbz1NYXRoLnNpbih0aGlzLmxhdDEpLHRoaXMuY29zX3BvPU1hdGguY29zKHRoaXMubGF0MSksdGhpcy50MT10aGlzLnNpbl9wbyx0aGlzLmNvbj10aGlzLnNpbl9wbyx0aGlzLm1zMT1odCh0aGlzLmUzLHRoaXMuc2luX3BvLHRoaXMuY29zX3BvKSx0aGlzLnFzMT1WdCh0aGlzLmUzLHRoaXMuc2luX3BvLHRoaXMuY29zX3BvKSx0aGlzLnNpbl9wbz1NYXRoLnNpbih0aGlzLmxhdDIpLHRoaXMuY29zX3BvPU1hdGguY29zKHRoaXMubGF0MiksdGhpcy50Mj10aGlzLnNpbl9wbyx0aGlzLm1zMj1odCh0aGlzLmUzLHRoaXMuc2luX3BvLHRoaXMuY29zX3BvKSx0aGlzLnFzMj1WdCh0aGlzLmUzLHRoaXMuc2luX3BvLHRoaXMuY29zX3BvKSx0aGlzLnNpbl9wbz1NYXRoLnNpbih0aGlzLmxhdDApLHRoaXMuY29zX3BvPU1hdGguY29zKHRoaXMubGF0MCksdGhpcy50Mz10aGlzLnNpbl9wbyx0aGlzLnFzMD1WdCh0aGlzLmUzLHRoaXMuc2luX3BvLHRoaXMuY29zX3BvKSxNYXRoLmFicyh0aGlzLmxhdDEtdGhpcy5sYXQyKT5EP3RoaXMubnMwPSh0aGlzLm1zMSp0aGlzLm1zMS10aGlzLm1zMip0aGlzLm1zMikvKHRoaXMucXMyLXRoaXMucXMxKTp0aGlzLm5zMD10aGlzLmNvbix0aGlzLmM9dGhpcy5tczEqdGhpcy5tczErdGhpcy5uczAqdGhpcy5xczEsdGhpcy5yaD10aGlzLmEqTWF0aC5zcXJ0KHRoaXMuYy10aGlzLm5zMCp0aGlzLnFzMCkvdGhpcy5uczApfSxmb3J3YXJkOmZ1bmN0aW9uKHQpe3ZhciBzPXQueCxpPXQueTt0aGlzLnNpbl9waGk9TWF0aC5zaW4oaSksdGhpcy5jb3NfcGhpPU1hdGguY29zKGkpO3ZhciBhPVZ0KHRoaXMuZTMsdGhpcy5zaW5fcGhpLHRoaXMuY29zX3BoaSksaD10aGlzLmEqTWF0aC5zcXJ0KHRoaXMuYy10aGlzLm5zMCphKS90aGlzLm5zMCxlPXRoaXMubnMwKm50KHMtdGhpcy5sb25nMCksbj1oKk1hdGguc2luKGUpK3RoaXMueDAscj10aGlzLnJoLWgqTWF0aC5jb3MoZSkrdGhpcy55MDtyZXR1cm4gdC54PW4sdC55PXIsdH0saW52ZXJzZTpmdW5jdGlvbih0KXt2YXIgcyxpLGEsaCxlLG47cmV0dXJuIHQueC09dGhpcy54MCx0Lnk9dGhpcy5yaC10LnkrdGhpcy55MCxhPTA8PXRoaXMubnMwPyhzPU1hdGguc3FydCh0LngqdC54K3QueSp0LnkpLDEpOihzPS1NYXRoLnNxcnQodC54KnQueCt0LnkqdC55KSwtMSksKGg9MCkhPT1zJiYoaD1NYXRoLmF0YW4yKGEqdC54LGEqdC55KSksYT1zKnRoaXMubnMwL3RoaXMuYSxuPXRoaXMuc3BoZXJlP01hdGguYXNpbigodGhpcy5jLWEqYSkvKDIqdGhpcy5uczApKTooaT0odGhpcy5jLWEqYSkvdGhpcy5uczAsdGhpcy5waGkxeih0aGlzLmUzLGkpKSxlPW50KGgvdGhpcy5uczArdGhpcy5sb25nMCksdC54PWUsdC55PW4sdH0sbmFtZXM6WyJBbGJlcnNfQ29uaWNfRXF1YWxfQXJlYSIsIkFsYmVycyIsImFlYSJdLHBoaTF6OmZ1bmN0aW9uKHQscyl7dmFyIGksYSxoLGUsbj1adCguNSpzKTtpZih0PEQpcmV0dXJuIG47Zm9yKHZhciByPXQqdCxvPTE7bzw9MjU7bysrKWlmKG4rPWU9LjUqKGg9MS0oYT10KihpPU1hdGguc2luKG4pKSkqYSkqaC9NYXRoLmNvcyhuKSoocy8oMS1yKS1pL2grLjUvdCpNYXRoLmxvZygoMS1hKS8oMSthKSkpLE1hdGguYWJzKGUpPD0xZS03KXJldHVybiBuO3JldHVybiBudWxsfX0sbXM9e2luaXQ6ZnVuY3Rpb24oKXt0aGlzLnNpbl9wMTQ9TWF0aC5zaW4odGhpcy5sYXQwKSx0aGlzLmNvc19wMTQ9TWF0aC5jb3ModGhpcy5sYXQwKSx0aGlzLmluZmluaXR5X2Rpc3Q9MWUzKnRoaXMuYSx0aGlzLnJjPTF9LGZvcndhcmQ6ZnVuY3Rpb24odCl7dmFyIHMsaSxhPXQueCxoPXQueSxlPW50KGEtdGhpcy5sb25nMCksbj1NYXRoLnNpbihoKSxyPU1hdGguY29zKGgpLG89TWF0aC5jb3MoZSksbD0wPChzPXRoaXMuc2luX3AxNCpuK3RoaXMuY29zX3AxNCpyKm8pfHxNYXRoLmFicyhzKTw9RD8oaT10aGlzLngwK3RoaXMuYSpyKk1hdGguc2luKGUpL3MsdGhpcy55MCt0aGlzLmEqKHRoaXMuY29zX3AxNCpuLXRoaXMuc2luX3AxNCpyKm8pL3MpOihpPXRoaXMueDArdGhpcy5pbmZpbml0eV9kaXN0KnIqTWF0aC5zaW4oZSksdGhpcy55MCt0aGlzLmluZmluaXR5X2Rpc3QqKHRoaXMuY29zX3AxNCpuLXRoaXMuc2luX3AxNCpyKm8pKTtyZXR1cm4gdC54PWksdC55PWwsdH0saW52ZXJzZTpmdW5jdGlvbih0KXt2YXIgcyxpLGEsaCxlLG47cmV0dXJuIHQueD0odC54LXRoaXMueDApL3RoaXMuYSx0Lnk9KHQueS10aGlzLnkwKS90aGlzLmEsdC54Lz10aGlzLmswLHQueS89dGhpcy5rMCxlPShzPU1hdGguc3FydCh0LngqdC54K3QueSp0LnkpKT8oaD1NYXRoLmF0YW4yKHMsdGhpcy5yYyksaT1NYXRoLnNpbihoKSxhPU1hdGguY29zKGgpLG49WnQoYSp0aGlzLnNpbl9wMTQrdC55KmkqdGhpcy5jb3NfcDE0L3MpLGU9TWF0aC5hdGFuMih0LngqaSxzKnRoaXMuY29zX3AxNCphLXQueSp0aGlzLnNpbl9wMTQqaSksbnQodGhpcy5sb25nMCtlKSk6KG49dGhpcy5waGljMCwwKSx0Lng9ZSx0Lnk9bix0fSxuYW1lczpbImdub20iXX0scHM9e2luaXQ6ZnVuY3Rpb24oKXt0aGlzLnNwaGVyZXx8KHRoaXMuazA9aHQodGhpcy5lLE1hdGguc2luKHRoaXMubGF0X3RzKSxNYXRoLmNvcyh0aGlzLmxhdF90cykpKX0sZm9yd2FyZDpmdW5jdGlvbih0KXt2YXIgcyxpLGEsaD10LngsZT10Lnksbj1udChoLXRoaXMubG9uZzApO3JldHVybiBhPXRoaXMuc3BoZXJlPyhpPXRoaXMueDArdGhpcy5hKm4qTWF0aC5jb3ModGhpcy5sYXRfdHMpLHRoaXMueTArdGhpcy5hKk1hdGguc2luKGUpL01hdGguY29zKHRoaXMubGF0X3RzKSk6KHM9VnQodGhpcy5lLE1hdGguc2luKGUpKSxpPXRoaXMueDArdGhpcy5hKnRoaXMuazAqbix0aGlzLnkwK3RoaXMuYSpzKi41L3RoaXMuazApLHQueD1pLHQueT1hLHR9LGludmVyc2U6ZnVuY3Rpb24odCl7dmFyIHMsaTtyZXR1cm4gdC54LT10aGlzLngwLHQueS09dGhpcy55MCx0aGlzLnNwaGVyZT8ocz1udCh0aGlzLmxvbmcwK3QueC90aGlzLmEvTWF0aC5jb3ModGhpcy5sYXRfdHMpKSxpPU1hdGguYXNpbih0LnkvdGhpcy5hKk1hdGguY29zKHRoaXMubGF0X3RzKSkpOihpPWZ1bmN0aW9uKHQscyl7dmFyIGk9MS0oMS10KnQpLygyKnQpKk1hdGgubG9nKCgxLXQpLygxK3QpKTtpZihNYXRoLmFicyhNYXRoLmFicyhzKS1pKTwxZS02KXJldHVybiBzPDA/LTEqejp6O2Zvcih2YXIgYSxoLGUsbixyPU1hdGguYXNpbiguNSpzKSxvPTA7bzwzMDtvKyspaWYoaD1NYXRoLnNpbihyKSxlPU1hdGguY29zKHIpLG49dCpoLHIrPWE9TWF0aC5wb3coMS1uKm4sMikvKDIqZSkqKHMvKDEtdCp0KS1oLygxLW4qbikrLjUvdCpNYXRoLmxvZygoMS1uKS8oMStuKSkpLE1hdGguYWJzKGEpPD0xZS0xMClyZXR1cm4gcjtyZXR1cm4gTmFOfSh0aGlzLmUsMip0LnkqdGhpcy5rMC90aGlzLmEpLHM9bnQodGhpcy5sb25nMCt0LngvKHRoaXMuYSp0aGlzLmswKSkpLHQueD1zLHQueT1pLHR9LG5hbWVzOlsiY2VhIl19LGRzPXtpbml0OmZ1bmN0aW9uKCl7dGhpcy54MD10aGlzLngwfHwwLHRoaXMueTA9dGhpcy55MHx8MCx0aGlzLmxhdDA9dGhpcy5sYXQwfHwwLHRoaXMubG9uZzA9dGhpcy5sb25nMHx8MCx0aGlzLmxhdF90cz10aGlzLmxhdF90c3x8MCx0aGlzLnRpdGxlPXRoaXMudGl0bGV8fCJFcXVpZGlzdGFudCBDeWxpbmRyaWNhbCAoUGxhdGUgQ2FycmUpIix0aGlzLnJjPU1hdGguY29zKHRoaXMubGF0X3RzKX0sZm9yd2FyZDpmdW5jdGlvbih0KXt2YXIgcz10LngsaT10LnksYT1udChzLXRoaXMubG9uZzApLGg9SnQoaS10aGlzLmxhdDApO3JldHVybiB0Lng9dGhpcy54MCt0aGlzLmEqYSp0aGlzLnJjLHQueT10aGlzLnkwK3RoaXMuYSpoLHR9LGludmVyc2U6ZnVuY3Rpb24odCl7dmFyIHM9dC54LGk9dC55O3JldHVybiB0Lng9bnQodGhpcy5sb25nMCsocy10aGlzLngwKS8odGhpcy5hKnRoaXMucmMpKSx0Lnk9SnQodGhpcy5sYXQwKyhpLXRoaXMueTApL3RoaXMuYSksdH0sbmFtZXM6WyJFcXVpcmVjdGFuZ3VsYXIiLCJFcXVpZGlzdGFudF9DeWxpbmRyaWNhbCIsImVxYyJdfSx5cz17aW5pdDpmdW5jdGlvbigpe3RoaXMudGVtcD10aGlzLmIvdGhpcy5hLHRoaXMuZXM9MS1NYXRoLnBvdyh0aGlzLnRlbXAsMiksdGhpcy5lPU1hdGguc3FydCh0aGlzLmVzKSx0aGlzLmUwPUZ0KHRoaXMuZXMpLHRoaXMuZTE9UXQodGhpcy5lcyksdGhpcy5lMj1XdCh0aGlzLmVzKSx0aGlzLmUzPVh0KHRoaXMuZXMpLHRoaXMubWwwPXRoaXMuYSpVdCh0aGlzLmUwLHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzLHRoaXMubGF0MCl9LGZvcndhcmQ6ZnVuY3Rpb24odCl7dmFyIHMsaSxhLGg9dC54LGU9dC55LG49bnQoaC10aGlzLmxvbmcwKSxyPW4qTWF0aC5zaW4oZSk7cmV0dXJuIGE9dGhpcy5zcGhlcmU/TWF0aC5hYnMoZSk8PUQ/KGk9dGhpcy5hKm4sLTEqdGhpcy5hKnRoaXMubGF0MCk6KGk9dGhpcy5hKk1hdGguc2luKHIpL01hdGgudGFuKGUpLHRoaXMuYSooSnQoZS10aGlzLmxhdDApKygxLU1hdGguY29zKHIpKS9NYXRoLnRhbihlKSkpOk1hdGguYWJzKGUpPD1EPyhpPXRoaXMuYSpuLC0xKnRoaXMubWwwKTooaT0ocz1IdCh0aGlzLmEsdGhpcy5lLE1hdGguc2luKGUpKS9NYXRoLnRhbihlKSkqTWF0aC5zaW4ociksdGhpcy5hKlV0KHRoaXMuZTAsdGhpcy5lMSx0aGlzLmUyLHRoaXMuZTMsZSktdGhpcy5tbDArcyooMS1NYXRoLmNvcyhyKSkpLHQueD1pK3RoaXMueDAsdC55PWErdGhpcy55MCx0fSxpbnZlcnNlOmZ1bmN0aW9uKHQpe3ZhciBzLGksYSxoLGUsbixyLG8sbD10LngtdGhpcy54MCxNPXQueS10aGlzLnkwO2lmKHRoaXMuc3BoZXJlKWlmKE1hdGguYWJzKE0rdGhpcy5hKnRoaXMubGF0MCk8PUQpcz1udChsL3RoaXMuYSt0aGlzLmxvbmcwKSxpPTA7ZWxzZXtmb3IodmFyIGMsdT10aGlzLmxhdDArTS90aGlzLmEsZj1sKmwvdGhpcy5hL3RoaXMuYSt1KnUsbT11LHA9MjA7cDstLXApaWYobSs9YT0tMSoodSoobSooYz1NYXRoLnRhbihtKSkrMSktbS0uNSoobSptK2YpKmMpLygobS11KS9jLTEpLE1hdGguYWJzKGEpPD1EKXtpPW07YnJlYWt9cz1udCh0aGlzLmxvbmcwK01hdGguYXNpbihsKk1hdGgudGFuKG0pL3RoaXMuYSkvTWF0aC5zaW4oaSkpfWVsc2UgaWYoTWF0aC5hYnMoTSt0aGlzLm1sMCk8PUQpaT0wLHM9bnQodGhpcy5sb25nMCtsL3RoaXMuYSk7ZWxzZXtmb3IodT0odGhpcy5tbDArTSkvdGhpcy5hLGY9bCpsL3RoaXMuYS90aGlzLmErdSp1LG09dSxwPTIwO3A7LS1wKWlmKG89dGhpcy5lKk1hdGguc2luKG0pLGg9TWF0aC5zcXJ0KDEtbypvKSpNYXRoLnRhbihtKSxlPXRoaXMuYSpVdCh0aGlzLmUwLHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzLG0pLG49dGhpcy5lMC0yKnRoaXMuZTEqTWF0aC5jb3MoMiptKSs0KnRoaXMuZTIqTWF0aC5jb3MoNCptKS02KnRoaXMuZTMqTWF0aC5jb3MoNiptKSxtLT1hPSh1KihoKihyPWUvdGhpcy5hKSsxKS1yLS41KmgqKHIqcitmKSkvKHRoaXMuZXMqTWF0aC5zaW4oMiptKSoocipyK2YtMip1KnIpLyg0KmgpKyh1LXIpKihoKm4tMi9NYXRoLnNpbigyKm0pKS1uKSxNYXRoLmFicyhhKTw9RCl7aT1tO2JyZWFrfWg9TWF0aC5zcXJ0KDEtdGhpcy5lcypNYXRoLnBvdyhNYXRoLnNpbihpKSwyKSkqTWF0aC50YW4oaSkscz1udCh0aGlzLmxvbmcwK01hdGguYXNpbihsKmgvdGhpcy5hKS9NYXRoLnNpbihpKSl9cmV0dXJuIHQueD1zLHQueT1pLHR9LG5hbWVzOlsiUG9seWNvbmljIiwicG9seSJdfSxfcz17aW5pdDpmdW5jdGlvbigpe3RoaXMuQT1bXSx0aGlzLkFbMV09LjYzOTkxNzUwNzMsdGhpcy5BWzJdPS0uMTM1ODc5NzYxMyx0aGlzLkFbM109LjA2MzI5NDQwOSx0aGlzLkFbNF09LS4wMjUyNjg1Myx0aGlzLkFbNV09LjAxMTc4NzksdGhpcy5BWzZdPS0uMDA1NTE2MSx0aGlzLkFbN109LjAwMjY5MDYsdGhpcy5BWzhdPS0uMDAxMzMzLHRoaXMuQVs5XT02N2UtNSx0aGlzLkFbMTBdPS0zNGUtNSx0aGlzLkJfcmU9W10sdGhpcy5CX2ltPVtdLHRoaXMuQl9yZVsxXT0uNzU1Nzg1MzIyOCx0aGlzLkJfaW1bMV09MCx0aGlzLkJfcmVbMl09LjI0OTIwNDY0Nix0aGlzLkJfaW1bMl09LjAwMzM3MTUwNyx0aGlzLkJfcmVbM109LS4wMDE1NDE3MzksdGhpcy5CX2ltWzNdPS4wNDEwNTg1Nix0aGlzLkJfcmVbNF09LS4xMDE2MjkwNyx0aGlzLkJfaW1bNF09LjAxNzI3NjA5LHRoaXMuQl9yZVs1XT0tLjI2NjIzNDg5LHRoaXMuQl9pbVs1XT0tLjM2MjQ5MjE4LHRoaXMuQl9yZVs2XT0tLjY4NzA5ODMsdGhpcy5CX2ltWzZdPS0xLjE2NTE5NjcsdGhpcy5DX3JlPVtdLHRoaXMuQ19pbT1bXSx0aGlzLkNfcmVbMV09MS4zMjMxMjcwNDM5LHRoaXMuQ19pbVsxXT0wLHRoaXMuQ19yZVsyXT0tLjU3NzI0NTc4OSx0aGlzLkNfaW1bMl09LS4wMDc4MDk1OTgsdGhpcy5DX3JlWzNdPS41MDgzMDc1MTMsdGhpcy5DX2ltWzNdPS0uMTEyMjA4OTUyLHRoaXMuQ19yZVs0XT0tLjE1MDk0NzYyLHRoaXMuQ19pbVs0XT0uMTgyMDA2MDIsdGhpcy5DX3JlWzVdPTEuMDE0MTgxNzksdGhpcy5DX2ltWzVdPTEuNjQ0OTc2OTYsdGhpcy5DX3JlWzZdPTEuOTY2MDU0OSx0aGlzLkNfaW1bNl09Mi41MTI3NjQ1LHRoaXMuRD1bXSx0aGlzLkRbMV09MS41NjI3MDE0MjQzLHRoaXMuRFsyXT0uNTE4NTQwNjM5OCx0aGlzLkRbM109LS4wMzMzMzA5OCx0aGlzLkRbNF09LS4xMDUyOTA2LHRoaXMuRFs1XT0tLjAzNjg1OTQsdGhpcy5EWzZdPS4wMDczMTcsdGhpcy5EWzddPS4wMTIyLHRoaXMuRFs4XT0uMDAzOTQsdGhpcy5EWzldPS0uMDAxM30sZm9yd2FyZDpmdW5jdGlvbih0KXtmb3IodmFyIHM9dC54LGk9dC55LXRoaXMubGF0MCxhPXMtdGhpcy5sb25nMCxoPWkvaioxZS01LGU9YSxuPTEscj0wLG89MTtvPD0xMDtvKyspbio9aCxyKz10aGlzLkFbb10qbjt2YXIgbCxNPXIsYz1lLHU9MSxmPTAsbT0wLHA9MDtmb3Iobz0xO288PTY7bysrKWw9ZipNK3UqYyx1PXUqTS1mKmMsZj1sLG09bSt0aGlzLkJfcmVbb10qdS10aGlzLkJfaW1bb10qZixwPXArdGhpcy5CX2ltW29dKnUrdGhpcy5CX3JlW29dKmY7cmV0dXJuIHQueD1wKnRoaXMuYSt0aGlzLngwLHQueT1tKnRoaXMuYSt0aGlzLnkwLHR9LGludmVyc2U6ZnVuY3Rpb24odCl7dmFyIHMsaT10LngsYT10LnksaD1pLXRoaXMueDAsZT0oYS10aGlzLnkwKS90aGlzLmEsbj1oL3RoaXMuYSxyPTEsbz0wLGw9MCxNPTA7Zm9yKHk9MTt5PD02O3krKylzPW8qZStyKm4scj1yKmUtbypuLG89cyxsPWwrdGhpcy5DX3JlW3ldKnItdGhpcy5DX2ltW3ldKm8sTT1NK3RoaXMuQ19pbVt5XSpyK3RoaXMuQ19yZVt5XSpvO2Zvcih2YXIgYz0wO2M8dGhpcy5pdGVyYXRpb25zO2MrKyl7Zm9yKHZhciB1LGY9bCxtPU0scD1lLGQ9bix5PTI7eTw9Njt5KyspdT1tKmwrZipNLGY9ZipsLW0qTSxtPXUscCs9KHktMSkqKHRoaXMuQl9yZVt5XSpmLXRoaXMuQl9pbVt5XSptKSxkKz0oeS0xKSoodGhpcy5CX2ltW3ldKmYrdGhpcy5CX3JlW3ldKm0pO2Y9MSxtPTA7dmFyIF89dGhpcy5CX3JlWzFdLHg9dGhpcy5CX2ltWzFdO2Zvcih5PTI7eTw9Njt5KyspdT1tKmwrZipNLGY9ZipsLW0qTSxtPXUsXys9eSoodGhpcy5CX3JlW3ldKmYtdGhpcy5CX2ltW3ldKm0pLHgrPXkqKHRoaXMuQl9pbVt5XSpmK3RoaXMuQl9yZVt5XSptKTt2YXIgZz1fKl8reCp4LGw9KHAqXytkKngpL2csTT0oZCpfLXAqeCkvZ312YXIgYj1sLHY9TSx3PTEsQz0wO2Zvcih5PTE7eTw9OTt5Kyspdyo9YixDKz10aGlzLkRbeV0qdzt2YXIgUD10aGlzLmxhdDArQypqKjFlNSxTPXRoaXMubG9uZzArdjtyZXR1cm4gdC54PVMsdC55PVAsdH0sbmFtZXM6WyJOZXdfWmVhbGFuZF9NYXBfR3JpZCIsIm56bWciXX0seHM9e2luaXQ6ZnVuY3Rpb24oKXt9LGZvcndhcmQ6ZnVuY3Rpb24odCl7dmFyIHM9dC54LGk9dC55LGE9bnQocy10aGlzLmxvbmcwKSxoPXRoaXMueDArdGhpcy5hKmEsZT10aGlzLnkwK3RoaXMuYSpNYXRoLmxvZyhNYXRoLnRhbihNYXRoLlBJLzQraS8yLjUpKSoxLjI1O3JldHVybiB0Lng9aCx0Lnk9ZSx0fSxpbnZlcnNlOmZ1bmN0aW9uKHQpe3QueC09dGhpcy54MCx0LnktPXRoaXMueTA7dmFyIHM9bnQodGhpcy5sb25nMCt0LngvdGhpcy5hKSxpPTIuNSooTWF0aC5hdGFuKE1hdGguZXhwKC44KnQueS90aGlzLmEpKS1NYXRoLlBJLzQpO3JldHVybiB0Lng9cyx0Lnk9aSx0fSxuYW1lczpbIk1pbGxlcl9DeWxpbmRyaWNhbCIsIm1pbGwiXX0sZ3M9e2luaXQ6ZnVuY3Rpb24oKXt0aGlzLnNwaGVyZT8odGhpcy5uPTEsdGhpcy5tPTAsdGhpcy5lcz0wLHRoaXMuQ195PU1hdGguc3FydCgodGhpcy5tKzEpL3RoaXMubiksdGhpcy5DX3g9dGhpcy5DX3kvKHRoaXMubSsxKSk6dGhpcy5lbj1BdCh0aGlzLmVzKX0sZm9yd2FyZDpmdW5jdGlvbih0KXt2YXIgcz10LngsaT10Lnkscz1udChzLXRoaXMubG9uZzApO2lmKHRoaXMuc3BoZXJlKXtpZih0aGlzLm0pZm9yKHZhciBhPXRoaXMubipNYXRoLnNpbihpKSxoPTIwO2g7LS1oKXt2YXIgZT0odGhpcy5tKmkrTWF0aC5zaW4oaSktYSkvKHRoaXMubStNYXRoLmNvcyhpKSk7aWYoaS09ZSxNYXRoLmFicyhlKTxEKWJyZWFrfWVsc2UgaT0xIT09dGhpcy5uP01hdGguYXNpbih0aGlzLm4qTWF0aC5zaW4oaSkpOmk7bD10aGlzLmEqdGhpcy5DX3gqcyoodGhpcy5tK01hdGguY29zKGkpKSxvPXRoaXMuYSp0aGlzLkNfeSppfWVsc2UgdmFyIG49TWF0aC5zaW4oaSkscj1NYXRoLmNvcyhpKSxvPXRoaXMuYSpHdChpLG4scix0aGlzLmVuKSxsPXRoaXMuYSpzKnIvTWF0aC5zcXJ0KDEtdGhpcy5lcypuKm4pO3JldHVybiB0Lng9bCx0Lnk9byx0fSxpbnZlcnNlOmZ1bmN0aW9uKHQpe3ZhciBzLGksYSxoO3JldHVybiB0LngtPXRoaXMueDAsYT10LngvdGhpcy5hLHQueS09dGhpcy55MCxzPXQueS90aGlzLmEsdGhpcy5zcGhlcmU/KHMvPXRoaXMuQ195LGEvPXRoaXMuQ194Kih0aGlzLm0rTWF0aC5jb3MocykpLHRoaXMubT9zPVp0KCh0aGlzLm0qcytNYXRoLnNpbihzKSkvdGhpcy5uKToxIT09dGhpcy5uJiYocz1adChNYXRoLnNpbihzKS90aGlzLm4pKSxhPW50KGErdGhpcy5sb25nMCkscz1KdChzKSk6KHM9anQodC55L3RoaXMuYSx0aGlzLmVzLHRoaXMuZW4pLChoPU1hdGguYWJzKHMpKTx6PyhoPU1hdGguc2luKHMpLGk9dGhpcy5sb25nMCt0LngqTWF0aC5zcXJ0KDEtdGhpcy5lcypoKmgpLyh0aGlzLmEqTWF0aC5jb3MocykpLGE9bnQoaSkpOmgtRDx6JiYoYT10aGlzLmxvbmcwKSksdC54PWEsdC55PXMsdH0sbmFtZXM6WyJTaW51c29pZGFsIiwic2ludSJdfSxicz17aW5pdDpmdW5jdGlvbigpe30sZm9yd2FyZDpmdW5jdGlvbih0KXtmb3IodmFyIHM9dC54LGk9dC55LGE9bnQocy10aGlzLmxvbmcwKSxoPWksZT1NYXRoLlBJKk1hdGguc2luKGkpOzspe3ZhciBuPS0oaCtNYXRoLnNpbihoKS1lKS8oMStNYXRoLmNvcyhoKSk7aWYoaCs9bixNYXRoLmFicyhuKTxEKWJyZWFrfWgvPTIsTWF0aC5QSS8yLU1hdGguYWJzKGkpPEQmJihhPTApO3ZhciByPS45MDAzMTYzMTYxNTgqdGhpcy5hKmEqTWF0aC5jb3MoaCkrdGhpcy54MCxvPTEuNDE0MjEzNTYyMzczMSp0aGlzLmEqTWF0aC5zaW4oaCkrdGhpcy55MDtyZXR1cm4gdC54PXIsdC55PW8sdH0saW52ZXJzZTpmdW5jdGlvbih0KXt2YXIgcyxpO3QueC09dGhpcy54MCx0LnktPXRoaXMueTAsaT10LnkvKDEuNDE0MjEzNTYyMzczMSp0aGlzLmEpLC45OTk5OTk5OTk5OTk8TWF0aC5hYnMoaSkmJihpPS45OTk5OTk5OTk5OTkpLHM9TWF0aC5hc2luKGkpO3ZhciBhPW50KHRoaXMubG9uZzArdC54LyguOTAwMzE2MzE2MTU4KnRoaXMuYSpNYXRoLmNvcyhzKSkpO2E8LU1hdGguUEkmJihhPS1NYXRoLlBJKSxhPk1hdGguUEkmJihhPU1hdGguUEkpLGk9KDIqcytNYXRoLnNpbigyKnMpKS9NYXRoLlBJLDE8TWF0aC5hYnMoaSkmJihpPTEpO3ZhciBoPU1hdGguYXNpbihpKTtyZXR1cm4gdC54PWEsdC55PWgsdH0sbmFtZXM6WyJNb2xsd2VpZGUiLCJtb2xsIl19LHZzPXtpbml0OmZ1bmN0aW9uKCl7TWF0aC5hYnModGhpcy5sYXQxK3RoaXMubGF0Mik8RHx8KHRoaXMubGF0Mj10aGlzLmxhdDJ8fHRoaXMubGF0MSx0aGlzLnRlbXA9dGhpcy5iL3RoaXMuYSx0aGlzLmVzPTEtTWF0aC5wb3codGhpcy50ZW1wLDIpLHRoaXMuZT1NYXRoLnNxcnQodGhpcy5lcyksdGhpcy5lMD1GdCh0aGlzLmVzKSx0aGlzLmUxPVF0KHRoaXMuZXMpLHRoaXMuZTI9V3QodGhpcy5lcyksdGhpcy5lMz1YdCh0aGlzLmVzKSx0aGlzLnNpbnBoaT1NYXRoLnNpbih0aGlzLmxhdDEpLHRoaXMuY29zcGhpPU1hdGguY29zKHRoaXMubGF0MSksdGhpcy5tczE9aHQodGhpcy5lLHRoaXMuc2lucGhpLHRoaXMuY29zcGhpKSx0aGlzLm1sMT1VdCh0aGlzLmUwLHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzLHRoaXMubGF0MSksTWF0aC5hYnModGhpcy5sYXQxLXRoaXMubGF0Mik8RD90aGlzLm5zPXRoaXMuc2lucGhpOih0aGlzLnNpbnBoaT1NYXRoLnNpbih0aGlzLmxhdDIpLHRoaXMuY29zcGhpPU1hdGguY29zKHRoaXMubGF0MiksdGhpcy5tczI9aHQodGhpcy5lLHRoaXMuc2lucGhpLHRoaXMuY29zcGhpKSx0aGlzLm1sMj1VdCh0aGlzLmUwLHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzLHRoaXMubGF0MiksdGhpcy5ucz0odGhpcy5tczEtdGhpcy5tczIpLyh0aGlzLm1sMi10aGlzLm1sMSkpLHRoaXMuZz10aGlzLm1sMSt0aGlzLm1zMS90aGlzLm5zLHRoaXMubWwwPVV0KHRoaXMuZTAsdGhpcy5lMSx0aGlzLmUyLHRoaXMuZTMsdGhpcy5sYXQwKSx0aGlzLnJoPXRoaXMuYSoodGhpcy5nLXRoaXMubWwwKSl9LGZvcndhcmQ6ZnVuY3Rpb24odCl7dmFyIHMsaSxhPXQueCxoPXQueTtpPXRoaXMuc3BoZXJlP3RoaXMuYSoodGhpcy5nLWgpOihzPVV0KHRoaXMuZTAsdGhpcy5lMSx0aGlzLmUyLHRoaXMuZTMsaCksdGhpcy5hKih0aGlzLmctcykpO3ZhciBlPXRoaXMubnMqbnQoYS10aGlzLmxvbmcwKSxuPXRoaXMueDAraSpNYXRoLnNpbihlKSxyPXRoaXMueTArdGhpcy5yaC1pKk1hdGguY29zKGUpO3JldHVybiB0Lng9bix0Lnk9cix0fSxpbnZlcnNlOmZ1bmN0aW9uKHQpe3ZhciBzLGk7dC54LT10aGlzLngwLHQueT10aGlzLnJoLXQueSt0aGlzLnkwLHM9MDw9dGhpcy5ucz8oaT1NYXRoLnNxcnQodC54KnQueCt0LnkqdC55KSwxKTooaT0tTWF0aC5zcXJ0KHQueCp0LngrdC55KnQueSksLTEpO3ZhciBhPTA7aWYoMCE9PWkmJihhPU1hdGguYXRhbjIocyp0Lngscyp0LnkpKSx0aGlzLnNwaGVyZSlyZXR1cm4gbj1udCh0aGlzLmxvbmcwK2EvdGhpcy5ucyksZT1KdCh0aGlzLmctaS90aGlzLmEpLHQueD1uLHQueT1lLHQ7dmFyIGg9dGhpcy5nLWkvdGhpcy5hLGU9S3QoaCx0aGlzLmUwLHRoaXMuZTEsdGhpcy5lMix0aGlzLmUzKSxuPW50KHRoaXMubG9uZzArYS90aGlzLm5zKTtyZXR1cm4gdC54PW4sdC55PWUsdH0sbmFtZXM6WyJFcXVpZGlzdGFudF9Db25pYyIsImVxZGMiXX0sd3M9e2luaXQ6ZnVuY3Rpb24oKXt0aGlzLlI9dGhpcy5hfSxmb3J3YXJkOmZ1bmN0aW9uKHQpe3ZhciBzLGk9dC54LGE9dC55LGg9bnQoaS10aGlzLmxvbmcwKTtNYXRoLmFicyhhKTw9RCYmKHM9dGhpcy54MCt0aGlzLlIqaCxkPXRoaXMueTApO3ZhciBlPVp0KDIqTWF0aC5hYnMoYS9NYXRoLlBJKSk7KE1hdGguYWJzKGgpPD1EfHxNYXRoLmFicyhNYXRoLmFicyhhKS16KTw9RCkmJihzPXRoaXMueDAsZD0wPD1hP3RoaXMueTArTWF0aC5QSSp0aGlzLlIqTWF0aC50YW4oLjUqZSk6dGhpcy55MCtNYXRoLlBJKnRoaXMuUiotTWF0aC50YW4oLjUqZSkpO3ZhciBuPS41Kk1hdGguYWJzKE1hdGguUEkvaC1oL01hdGguUEkpLHI9bipuLG89TWF0aC5zaW4oZSksbD1NYXRoLmNvcyhlKSxNPWwvKG8rbC0xKSxjPU0qTSx1PU0qKDIvby0xKSxmPXUqdSxtPU1hdGguUEkqdGhpcy5SKihuKihNLWYpK01hdGguc3FydChyKihNLWYpKihNLWYpLShmK3IpKihjLWYpKSkvKGYrcik7aDwwJiYobT0tbSkscz10aGlzLngwK207dmFyIHA9citNLG09TWF0aC5QSSp0aGlzLlIqKHUqcC1uKk1hdGguc3FydCgoZityKSooMStyKS1wKnApKS8oZityKSxkPTA8PWE/dGhpcy55MCttOnRoaXMueTAtbTtyZXR1cm4gdC54PXMsdC55PWQsdH0saW52ZXJzZTpmdW5jdGlvbih0KXt2YXIgcyxpLGEsaCxlLG4scixvLGwsTSxjLHU7cmV0dXJuIHQueC09dGhpcy54MCx0LnktPXRoaXMueTAsYz1NYXRoLlBJKnRoaXMuUixlPShhPXQueC9jKSphKyhoPXQueS9jKSpoLGM9MyooaCpoLyhvPS0yKihuPS1NYXRoLmFicyhoKSooMStlKSkrMSsyKmgqaCtlKmUpKygyKihyPW4tMipoKmgrYSphKSpyKnIvby9vL28tOSpuKnIvby9vKS8yNykvKGw9KG4tcipyLzMvbykvbykvKE09MipNYXRoLnNxcnQoLWwvMykpLDE8TWF0aC5hYnMoYykmJihjPTA8PWM/MTotMSksdT1NYXRoLmFjb3MoYykvMyxpPTA8PXQueT8oLU0qTWF0aC5jb3ModStNYXRoLlBJLzMpLXIvMy9vKSpNYXRoLlBJOi0oLU0qTWF0aC5jb3ModStNYXRoLlBJLzMpLXIvMy9vKSpNYXRoLlBJLHM9TWF0aC5hYnMoYSk8RD90aGlzLmxvbmcwOm50KHRoaXMubG9uZzArTWF0aC5QSSooZS0xK01hdGguc3FydCgxKzIqKGEqYS1oKmgpK2UqZSkpLzIvYSksdC54PXMsdC55PWksdH0sbmFtZXM6WyJWYW5fZGVyX0dyaW50ZW5fSSIsIlZhbkRlckdyaW50ZW4iLCJ2YW5kZyJdfSxDcz17aW5pdDpmdW5jdGlvbigpe3RoaXMuc2luX3AxMj1NYXRoLnNpbih0aGlzLmxhdDApLHRoaXMuY29zX3AxMj1NYXRoLmNvcyh0aGlzLmxhdDApfSxmb3J3YXJkOmZ1bmN0aW9uKHQpe3ZhciBzLGksYSxoLGUsbixyLG8sbCxNLGMsdSxmLG0scCxkLHksXyx4LGcsYix2LHc9dC54LEM9dC55LFA9TWF0aC5zaW4odC55KSxTPU1hdGguY29zKHQueSksTj1udCh3LXRoaXMubG9uZzApO3JldHVybiB0aGlzLnNwaGVyZT9NYXRoLmFicyh0aGlzLnNpbl9wMTItMSk8PUQ/KHQueD10aGlzLngwK3RoaXMuYSooei1DKSpNYXRoLnNpbihOKSx0Lnk9dGhpcy55MC10aGlzLmEqKHotQykqTWF0aC5jb3MoTikpOk1hdGguYWJzKHRoaXMuc2luX3AxMisxKTw9RD8odC54PXRoaXMueDArdGhpcy5hKih6K0MpKk1hdGguc2luKE4pLHQueT10aGlzLnkwK3RoaXMuYSooeitDKSpNYXRoLmNvcyhOKSk6KF89dGhpcy5zaW5fcDEyKlArdGhpcy5jb3NfcDEyKlMqTWF0aC5jb3MoTikseT0oZD1NYXRoLmFjb3MoXykpP2QvTWF0aC5zaW4oZCk6MSx0Lng9dGhpcy54MCt0aGlzLmEqeSpTKk1hdGguc2luKE4pLHQueT10aGlzLnkwK3RoaXMuYSp5Kih0aGlzLmNvc19wMTIqUC10aGlzLnNpbl9wMTIqUypNYXRoLmNvcyhOKSkpOihzPUZ0KHRoaXMuZXMpLGk9UXQodGhpcy5lcyksYT1XdCh0aGlzLmVzKSxoPVh0KHRoaXMuZXMpLE1hdGguYWJzKHRoaXMuc2luX3AxMi0xKTw9RD8oZT10aGlzLmEqVXQocyxpLGEsaCx6KSxuPXRoaXMuYSpVdChzLGksYSxoLEMpLHQueD10aGlzLngwKyhlLW4pKk1hdGguc2luKE4pLHQueT10aGlzLnkwLShlLW4pKk1hdGguY29zKE4pKTpNYXRoLmFicyh0aGlzLnNpbl9wMTIrMSk8PUQ/KGU9dGhpcy5hKlV0KHMsaSxhLGgseiksbj10aGlzLmEqVXQocyxpLGEsaCxDKSx0Lng9dGhpcy54MCsoZStuKSpNYXRoLnNpbihOKSx0Lnk9dGhpcy55MCsoZStuKSpNYXRoLmNvcyhOKSk6KHI9UC9TLG89SHQodGhpcy5hLHRoaXMuZSx0aGlzLnNpbl9wMTIpLGw9SHQodGhpcy5hLHRoaXMuZSxQKSxNPU1hdGguYXRhbigoMS10aGlzLmVzKSpyK3RoaXMuZXMqbyp0aGlzLnNpbl9wMTIvKGwqUykpLHg9MD09PShjPU1hdGguYXRhbjIoTWF0aC5zaW4oTiksdGhpcy5jb3NfcDEyKk1hdGgudGFuKE0pLXRoaXMuc2luX3AxMipNYXRoLmNvcyhOKSkpP01hdGguYXNpbih0aGlzLmNvc19wMTIqTWF0aC5zaW4oTSktdGhpcy5zaW5fcDEyKk1hdGguY29zKE0pKTpNYXRoLmFicyhNYXRoLmFicyhjKS1NYXRoLlBJKTw9RD8tTWF0aC5hc2luKHRoaXMuY29zX3AxMipNYXRoLnNpbihNKS10aGlzLnNpbl9wMTIqTWF0aC5jb3MoTSkpOk1hdGguYXNpbihNYXRoLnNpbihOKSpNYXRoLmNvcyhNKS9NYXRoLnNpbihjKSksdT10aGlzLmUqdGhpcy5zaW5fcDEyL01hdGguc3FydCgxLXRoaXMuZXMpLGQ9byp4KigxLShnPXgqeCkqKHA9KGY9dGhpcy5lKnRoaXMuY29zX3AxMipNYXRoLmNvcyhjKS9NYXRoLnNxcnQoMS10aGlzLmVzKSkqZikqKDEtcCkvNisoYj1nKngpLzgqKG09dSpmKSooMS0yKnApKyh2PWIqeCkvMTIwKihwKig0LTcqcCktMyp1KnUqKDEtNypwKSktdip4LzQ4Km0pLHQueD10aGlzLngwK2QqTWF0aC5zaW4oYyksdC55PXRoaXMueTArZCpNYXRoLmNvcyhjKSkpLHR9LGludmVyc2U6ZnVuY3Rpb24odCl7dmFyIHMsaSxhLGgsZSxuLHIsbyxsLE0sYyx1LGYsbSxwLGQseSxfLHgsZyxiLHYsdztpZih0LngtPXRoaXMueDAsdC55LT10aGlzLnkwLHRoaXMuc3BoZXJlKXtpZigocz1NYXRoLnNxcnQodC54KnQueCt0LnkqdC55KSk+Mip6KnRoaXMuYSlyZXR1cm47cmV0dXJuIGk9cy90aGlzLmEsYT1NYXRoLnNpbihpKSxoPU1hdGguY29zKGkpLGU9dGhpcy5sb25nMCxNYXRoLmFicyhzKTw9RD9uPXRoaXMubGF0MDoobj1adChoKnRoaXMuc2luX3AxMit0LnkqYSp0aGlzLmNvc19wMTIvcykscj1NYXRoLmFicyh0aGlzLmxhdDApLXosZT1udChNYXRoLmFicyhyKTw9RD8wPD10aGlzLmxhdDA/dGhpcy5sb25nMCtNYXRoLmF0YW4yKHQueCwtdC55KTp0aGlzLmxvbmcwLU1hdGguYXRhbjIoLXQueCx0LnkpOnRoaXMubG9uZzArTWF0aC5hdGFuMih0LngqYSxzKnRoaXMuY29zX3AxMipoLXQueSp0aGlzLnNpbl9wMTIqYSkpKSx0Lng9ZSx0Lnk9bix0fXJldHVybiBvPUZ0KHRoaXMuZXMpLGw9UXQodGhpcy5lcyksTT1XdCh0aGlzLmVzKSxjPVh0KHRoaXMuZXMpLE1hdGguYWJzKHRoaXMuc2luX3AxMi0xKTw9RD8odT10aGlzLmEqVXQobyxsLE0sYyx6KSxzPU1hdGguc3FydCh0LngqdC54K3QueSp0LnkpLG49S3QoKHUtcykvdGhpcy5hLG8sbCxNLGMpLGU9bnQodGhpcy5sb25nMCtNYXRoLmF0YW4yKHQueCwtMSp0LnkpKSk6TWF0aC5hYnModGhpcy5zaW5fcDEyKzEpPD1EPyh1PXRoaXMuYSpVdChvLGwsTSxjLHopLHM9TWF0aC5zcXJ0KHQueCp0LngrdC55KnQueSksbj1LdCgocy11KS90aGlzLmEsbyxsLE0sYyksZT1udCh0aGlzLmxvbmcwK01hdGguYXRhbjIodC54LHQueSkpKToocz1NYXRoLnNxcnQodC54KnQueCt0LnkqdC55KSxwPU1hdGguYXRhbjIodC54LHQueSksZj1IdCh0aGlzLmEsdGhpcy5lLHRoaXMuc2luX3AxMiksZD1NYXRoLmNvcyhwKSxfPS0oeT10aGlzLmUqdGhpcy5jb3NfcDEyKmQpKnkvKDEtdGhpcy5lcykseD0zKnRoaXMuZXMqKDEtXykqdGhpcy5zaW5fcDEyKnRoaXMuY29zX3AxMipkLygxLXRoaXMuZXMpLHY9MS1fKihiPShnPXMvZiktXyooMStfKSpNYXRoLnBvdyhnLDMpLzYteCooMSszKl8pKk1hdGgucG93KGcsNCkvMjQpKmIvMi1nKmIqYipiLzYsbT1NYXRoLmFzaW4odGhpcy5zaW5fcDEyKk1hdGguY29zKGIpK3RoaXMuY29zX3AxMipNYXRoLnNpbihiKSpkKSxlPW50KHRoaXMubG9uZzArTWF0aC5hc2luKE1hdGguc2luKHApKk1hdGguc2luKGIpL01hdGguY29zKG0pKSksdz1NYXRoLnNpbihtKSxuPU1hdGguYXRhbjIoKHctdGhpcy5lcyp2KnRoaXMuc2luX3AxMikqTWF0aC50YW4obSksdyooMS10aGlzLmVzKSkpLHQueD1lLHQueT1uLHR9LG5hbWVzOlsiQXppbXV0aGFsX0VxdWlkaXN0YW50IiwiYWVxZCJdfSxQcz17aW5pdDpmdW5jdGlvbigpe3RoaXMuc2luX3AxND1NYXRoLnNpbih0aGlzLmxhdDApLHRoaXMuY29zX3AxND1NYXRoLmNvcyh0aGlzLmxhdDApfSxmb3J3YXJkOmZ1bmN0aW9uKHQpe3ZhciBzLGksYSxoPXQueCxlPXQueSxuPW50KGgtdGhpcy5sb25nMCkscj1NYXRoLnNpbihlKSxvPU1hdGguY29zKGUpLGw9TWF0aC5jb3Mobik7cmV0dXJuKDA8KHM9dGhpcy5zaW5fcDE0KnIrdGhpcy5jb3NfcDE0Km8qbCl8fE1hdGguYWJzKHMpPD1EKSYmKGk9dGhpcy5hKm8qTWF0aC5zaW4obiksYT10aGlzLnkwK3RoaXMuYSoodGhpcy5jb3NfcDE0KnItdGhpcy5zaW5fcDE0Km8qbCkpLHQueD1pLHQueT1hLHR9LGludmVyc2U6ZnVuY3Rpb24odCl7dmFyIHMsaSxhLGgsZSxuLHI7cmV0dXJuIHQueC09dGhpcy54MCx0LnktPXRoaXMueTAscz1NYXRoLnNxcnQodC54KnQueCt0LnkqdC55KSxpPVp0KHMvdGhpcy5hKSxhPU1hdGguc2luKGkpLGg9TWF0aC5jb3MoaSksbj10aGlzLmxvbmcwLE1hdGguYWJzKHMpPD1EP3I9dGhpcy5sYXQwOihyPVp0KGgqdGhpcy5zaW5fcDE0K3QueSphKnRoaXMuY29zX3AxNC9zKSxlPU1hdGguYWJzKHRoaXMubGF0MCkteixuPU1hdGguYWJzKGUpPD1EP250KDA8PXRoaXMubGF0MD90aGlzLmxvbmcwK01hdGguYXRhbjIodC54LC10LnkpOnRoaXMubG9uZzAtTWF0aC5hdGFuMigtdC54LHQueSkpOm50KHRoaXMubG9uZzArTWF0aC5hdGFuMih0LngqYSxzKnRoaXMuY29zX3AxNCpoLXQueSp0aGlzLnNpbl9wMTQqYSkpKSx0Lng9bix0Lnk9cix0fSxuYW1lczpbIm9ydGhvIl19LFNzPTEsTnM9Mixrcz0zLEVzPTQscXM9NSxJcz02LE9zPTEsQXM9MixHcz0zLGpzPTQsenM9e2luaXQ6ZnVuY3Rpb24oKXt0aGlzLngwPXRoaXMueDB8fDAsdGhpcy55MD10aGlzLnkwfHwwLHRoaXMubGF0MD10aGlzLmxhdDB8fDAsdGhpcy5sb25nMD10aGlzLmxvbmcwfHwwLHRoaXMubGF0X3RzPXRoaXMubGF0X3RzfHwwLHRoaXMudGl0bGU9dGhpcy50aXRsZXx8IlF1YWRyaWxhdGVyYWxpemVkIFNwaGVyaWNhbCBDdWJlIix0aGlzLmxhdDA+PXotVS8yP3RoaXMuZmFjZT1xczp0aGlzLmxhdDA8PS0oei1VLzIpP3RoaXMuZmFjZT1JczpNYXRoLmFicyh0aGlzLmxvbmcwKTw9VT90aGlzLmZhY2U9U3M6TWF0aC5hYnModGhpcy5sb25nMCk8PXorVT90aGlzLmZhY2U9MDx0aGlzLmxvbmcwP05zOkVzOnRoaXMuZmFjZT1rcywwIT09dGhpcy5lcyYmKHRoaXMub25lX21pbnVzX2Y9MS0odGhpcy5hLXRoaXMuYikvdGhpcy5hLHRoaXMub25lX21pbnVzX2Zfc3F1YXJlZD10aGlzLm9uZV9taW51c19mKnRoaXMub25lX21pbnVzX2YpfSxmb3J3YXJkOmZ1bmN0aW9uKHQpe3ZhciBzLGksYSxoLGUsbixyLG8sbCxNLGMsdSxmPXt4OjAseTowfSxtPXt2YWx1ZTowfTtyZXR1cm4gdC54LT10aGlzLmxvbmcwLHM9MCE9PXRoaXMuZXM/TWF0aC5hdGFuKHRoaXMub25lX21pbnVzX2Zfc3F1YXJlZCpNYXRoLnRhbih0LnkpKTp0LnksaT10LngsdGhpcy5mYWNlPT09cXM/KGg9ei1zLGE9VTw9aSYmaTw9eitVPyhtLnZhbHVlPU9zLGkteik6eitVPGl8fGk8PS0oeitVKT8obS52YWx1ZT1BcywwPGk/aS1ROmkrUSk6LSh6K1UpPGkmJmk8PS1VPyhtLnZhbHVlPUdzLGkreik6KG0udmFsdWU9anMsaSkpOnRoaXMuZmFjZT09PUlzPyhoPXorcyxhPVU8PWkmJmk8PXorVT8obS52YWx1ZT1Pcyx6LWkpOmk8VSYmLVU8PWk/KG0udmFsdWU9QXMsLWkpOmk8LVUmJi0oeitVKTw9aT8obS52YWx1ZT1HcywtaS16KToobS52YWx1ZT1qcywwPGk/US1pOi1pLVEpKToodGhpcy5mYWNlPT09TnM/aT1TKGksK3opOnRoaXMuZmFjZT09PWtzP2k9UyhpLCtRKTp0aGlzLmZhY2U9PT1FcyYmKGk9UyhpLC16KSksTT1NYXRoLnNpbihzKSxjPU1hdGguY29zKHMpLHU9TWF0aC5zaW4oaSkscj1jKk1hdGguY29zKGkpLG89Yyp1LGw9TSx0aGlzLmZhY2U9PT1Tcz9hPVAoaD1NYXRoLmFjb3MociksbCxvLG0pOnRoaXMuZmFjZT09PU5zP2E9UChoPU1hdGguYWNvcyhvKSxsLC1yLG0pOnRoaXMuZmFjZT09PWtzP2E9UChoPU1hdGguYWNvcygtciksbCwtbyxtKTp0aGlzLmZhY2U9PT1Fcz9hPVAoaD1NYXRoLmFjb3MoLW8pLGwscixtKTooaD1hPTAsbS52YWx1ZT1PcykpLG49TWF0aC5hdGFuKDEyL1EqKGErTWF0aC5hY29zKE1hdGguc2luKGEpKk1hdGguY29zKFUpKS16KSksZT1NYXRoLnNxcnQoKDEtTWF0aC5jb3MoaCkpLyhNYXRoLmNvcyhuKSpNYXRoLmNvcyhuKSkvKDEtTWF0aC5jb3MoTWF0aC5hdGFuKDEvTWF0aC5jb3MoYSkpKSkpLG0udmFsdWU9PT1Bcz9uKz16Om0udmFsdWU9PT1Hcz9uKz1ROm0udmFsdWU9PT1qcyYmKG4rPTEuNSpRKSxmLng9ZSpNYXRoLmNvcyhuKSxmLnk9ZSpNYXRoLnNpbihuKSxmLng9Zi54KnRoaXMuYSt0aGlzLngwLGYueT1mLnkqdGhpcy5hK3RoaXMueTAsdC54PWYueCx0Lnk9Zi55LHR9LGludmVyc2U6ZnVuY3Rpb24odCl7dmFyIHMsaSxhLGgsZSxuLHIsbyxsLE0sYyx1LGYsbSxwLGQ9e2xhbTowLHBoaTowfSx5PXt2YWx1ZTowfTtyZXR1cm4gdC54PSh0LngtdGhpcy54MCkvdGhpcy5hLHQueT0odC55LXRoaXMueTApL3RoaXMuYSxpPU1hdGguYXRhbihNYXRoLnNxcnQodC54KnQueCt0LnkqdC55KSkscz1NYXRoLmF0YW4yKHQueSx0LngpLDA8PXQueCYmdC54Pj1NYXRoLmFicyh0LnkpP3kudmFsdWU9T3M6MDw9dC55JiZ0Lnk+PU1hdGguYWJzKHQueCk/KHkudmFsdWU9QXMscy09eik6dC54PDAmJi10Lng+PU1hdGguYWJzKHQueSk/KHkudmFsdWU9R3Mscz1zPDA/cytROnMtUSk6KHkudmFsdWU9anMscys9eiksYz1RLzEyKk1hdGgudGFuKHMpLGU9TWF0aC5zaW4oYykvKE1hdGguY29zKGMpLTEvTWF0aC5zcXJ0KDIpKSxuPU1hdGguYXRhbihlKSwocj0xLShhPU1hdGguY29zKHMpKSphKihoPU1hdGgudGFuKGkpKSpoKigxLU1hdGguY29zKE1hdGguYXRhbigxL01hdGguY29zKG4pKSkpKTwtMT9yPS0xOjE8ciYmKHI9MSksdGhpcy5mYWNlPT09cXM/KG89TWF0aC5hY29zKHIpLGQucGhpPXotbyx5LnZhbHVlPT09T3M/ZC5sYW09bit6OnkudmFsdWU9PT1Bcz9kLmxhbT1uPDA/bitROm4tUTp5LnZhbHVlPT09R3M/ZC5sYW09bi16OmQubGFtPW4pOnRoaXMuZmFjZT09PUlzPyhvPU1hdGguYWNvcyhyKSxkLnBoaT1vLXoseS52YWx1ZT09PU9zP2QubGFtPXotbjp5LnZhbHVlPT09QXM/ZC5sYW09LW46eS52YWx1ZT09PUdzP2QubGFtPS1uLXo6ZC5sYW09bjwwPy1uLVE6US1uKTooYz0obD1yKSpsLHU9MTw9KGMrPShNPTE8PWM/MDpNYXRoLnNxcnQoMS1jKSpNYXRoLnNpbihuKSkqTSk/MDpNYXRoLnNxcnQoMS1jKSx5LnZhbHVlPT09QXM/KGM9dSx1PS1NLE09Yyk6eS52YWx1ZT09PUdzPyh1PS11LE09LU0pOnkudmFsdWU9PT1qcyYmKGM9dSx1PU0sTT0tYyksdGhpcy5mYWNlPT09TnM/KGM9bCxsPS11LHU9Yyk6dGhpcy5mYWNlPT09a3M/KGw9LWwsdT0tdSk6dGhpcy5mYWNlPT09RXMmJihjPWwsbD11LHU9LWMpLGQucGhpPU1hdGguYWNvcygtTSkteixkLmxhbT1NYXRoLmF0YW4yKHUsbCksdGhpcy5mYWNlPT09TnM/ZC5sYW09UyhkLmxhbSwteik6dGhpcy5mYWNlPT09a3M/ZC5sYW09UyhkLmxhbSwtUSk6dGhpcy5mYWNlPT09RXMmJihkLmxhbT1TKGQubGFtLCt6KSkpLDAhPT10aGlzLmVzJiYoZj1kLnBoaTwwPzE6MCxtPU1hdGgudGFuKGQucGhpKSxwPXRoaXMuYi9NYXRoLnNxcnQobSptK3RoaXMub25lX21pbnVzX2Zfc3F1YXJlZCksZC5waGk9TWF0aC5hdGFuKE1hdGguc3FydCh0aGlzLmEqdGhpcy5hLXAqcCkvKHRoaXMub25lX21pbnVzX2YqcCkpLGYmJihkLnBoaT0tZC5waGkpKSxkLmxhbSs9dGhpcy5sb25nMCx0Lng9ZC5sYW0sdC55PWQucGhpLHR9LG5hbWVzOlsiUXVhZHJpbGF0ZXJhbGl6ZWQgU3BoZXJpY2FsIEN1YmUiLCJRdWFkcmlsYXRlcmFsaXplZF9TcGhlcmljYWxfQ3ViZSIsInFzYyJdfSxScz1bWzEsMjIxOTllLTIxLC03MTU1MTVlLTEwLDMxMTAzZS0xMF0sWy45OTg2LC00ODIyNDNlLTksLTI0ODk3ZS05LC0xMzMwOWUtMTBdLFsuOTk1NCwtODMxMDNlLTgsLTQ0ODYwNWUtMTAsLTkuODY3MDFlLTddLFsuOTksLS4wMDEzNTM2NCwtNTk2NjFlLTksMzY3NzdlLTEwXSxbLjk4MjIsLS4wMDE2NzQ0MiwtNDQ5NTQ3ZS0xMSwtNTcyNDExZS0xMV0sWy45NzMsLS4wMDIxNDg2OCwtOTAzNTcxZS0xMCwxLjg3MzZlLThdLFsuOTYsLS4wMDMwNTA4NSwtOTAwNzYxZS0xMCwxNjQ5MTdlLTExXSxbLjk0MjcsLS4wMDM4Mjc5MiwtNjUzMzg2ZS0xMCwtMjYxNTRlLTEwXSxbLjkyMTYsLS4wMDQ2Nzc0NiwtMTA0NTdlLTgsNDgxMjQzZS0xMV0sWy44OTYyLC0uMDA1MzYyMjMsLTMyMzgzMWUtMTAsLTU0MzQzMmUtMTFdLFsuODY3OSwtLjAwNjA5MzYzLC0xMTM4OThlLTksMzMyNDg0ZS0xMV0sWy44MzUsLS4wMDY5ODMyNSwtNjQwMjUzZS0xMCw5LjM0OTU5ZS03XSxbLjc5ODYsLS4wMDc1NTMzOCwtNTAwMDA5ZS0xMCw5LjM1MzI0ZS03XSxbLjc1OTcsLS4wMDc5ODMyNCwtMzU5NzFlLTksLTIyNzYyNmUtMTFdLFsuNzE4NiwtLjAwODUxMzY3LC03MDExNDllLTEwLC04NjMwM2UtMTBdLFsuNjczMiwtLjAwOTg2MjA5LC0xOTk1NjllLTksMTkxOTc0ZS0xMF0sWy42MjEzLC0uMDEwNDE4LDg4MzkyM2UtMTAsNjI0MDUxZS0xMV0sWy41NzIyLC0uMDA5MDY2MDEsMTgyZS02LDYyNDA1MWUtMTFdLFsuNTMyMiwtLjAwNjc3Nzk3LDI3NTYwOGUtOSw2MjQwNTFlLTExXV0sTHM9W1stNTIwNDE3ZS0yMywuMDEyNCwxMjE0MzFlLTIzLC04NDUyODRlLTE2XSxbLjA2MiwuMDEyNCwtMS4yNjc5M2UtOSw0LjIyNjQyZS0xMF0sWy4xMjQsLjAxMjQsNS4wNzE3MWUtOSwtMS42MDYwNGUtOV0sWy4xODYsLjAxMjM5OTksLTEuOTAxODllLTgsNi4wMDE1MmUtOV0sWy4yNDgsLjAxMjQwMDIsNy4xMDAzOWUtOCwtMi4yNGUtOF0sWy4zMSwuMDEyMzk5MiwtMi42NDk5N2UtNyw4LjM1OTg2ZS04XSxbLjM3MiwuMDEyNDAyOSw5Ljg4OTgzZS03LC0zLjExOTk0ZS03XSxbLjQzNCwuMDEyMzg5MywtMzY5MDkzZS0xMSwtNC4zNTYyMWUtN10sWy40OTU4LC4wMTIzMTk4LC0xMDIyNTJlLTEwLC0zLjQ1NTIzZS03XSxbLjU1NzEsLjAxMjE5MTYsLTE1NDA4MWUtMTAsLTUuODIyODhlLTddLFsuNjE3NiwuMDExOTkzOCwtMjQxNDI0ZS0xMCwtNS4yNTMyN2UtN10sWy42NzY5LC4wMTE3MTMsLTMyMDIyM2UtMTAsLTUuMTY0MDVlLTddLFsuNzM0NiwuMDExMzU0MSwtMzk3Njg0ZS0xMCwtNi4wOTA1MmUtN10sWy43OTAzLC4wMTA5MTA3LC00ODkwNDJlLTEwLC0xMDQ3MzllLTExXSxbLjg0MzUsLjAxMDM0MzEsLTY0NjE1ZS05LC0xLjQwMzc0ZS05XSxbLjg5MzYsLjAwOTY5Njg2LC02NDYzNmUtOSwtODU0N2UtOV0sWy45Mzk0LC4wMDg0MDk0NywtMTkyODQxZS05LC00MjEwNmUtMTBdLFsuOTc2MSwuMDA2MTY1MjcsLTI1NmUtNiwtNDIxMDZlLTEwXSxbMSwuMDAzMjg5NDcsLTMxOTE1OWUtOSwtNDIxMDZlLTEwXV0sVHM9Qi81LERzPTEvVHMsQnM9e2luaXQ6ZnVuY3Rpb24oKXt0aGlzLngwPXRoaXMueDB8fDAsdGhpcy55MD10aGlzLnkwfHwwLHRoaXMubG9uZzA9dGhpcy5sb25nMHx8MCx0aGlzLmVzPTAsdGhpcy50aXRsZT10aGlzLnRpdGxlfHwiUm9iaW5zb24ifSxmb3J3YXJkOmZ1bmN0aW9uKHQpe3ZhciBzPW50KHQueC10aGlzLmxvbmcwKSxpPU1hdGguYWJzKHQueSksYT1NYXRoLmZsb29yKGkqVHMpO2E8MD9hPTA6MTg8PWEmJihhPTE3KTt2YXIgaD17eDpZdChSc1thXSxpPUIqKGktRHMqYSkpKnMseTpZdChMc1thXSxpKX07cmV0dXJuIHQueTwwJiYoaC55PS1oLnkpLGgueD1oLngqdGhpcy5hKi44NDg3K3RoaXMueDAsaC55PWgueSp0aGlzLmEqMS4zNTIzK3RoaXMueTAsaH0saW52ZXJzZTpmdW5jdGlvbih0KXt2YXIgYT17eDoodC54LXRoaXMueDApLyguODQ4Nyp0aGlzLmEpLHk6TWF0aC5hYnModC55LXRoaXMueTApLygxLjM1MjMqdGhpcy5hKX07aWYoMTw9YS55KWEueC89UnNbMThdWzBdLGEueT10Lnk8MD8tejp6O2Vsc2V7dmFyIHM9TWF0aC5mbG9vcigxOCphLnkpO2ZvcihzPDA/cz0wOjE4PD1zJiYocz0xNyk7OylpZihMc1tzXVswXT5hLnkpLS1zO2Vsc2V7aWYoIShMc1tzKzFdWzBdPD1hLnkpKWJyZWFrOysrc312YXIgaD1Mc1tzXSxpPWZ1bmN0aW9uKHQscyxpLGEpe2Zvcih2YXIgaD1zO2E7LS1hKXt2YXIgZT10KGgpO2lmKGgtPWUsTWF0aC5hYnMoZSk8aSlicmVha31yZXR1cm4gaH0oZnVuY3Rpb24odCl7cmV0dXJuKFl0KGgsdCktYS55KS8oaT10LChzPWgpWzFdK2kqKDIqc1syXSszKmkqc1szXSkpO3ZhciBzLGl9LGk9NSooYS55LWhbMF0pLyhMc1tzKzFdWzBdLWhbMF0pLEQsMTAwKTthLngvPVl0KFJzW3NdLGkpLGEueT0oNSpzK2kpKk4sdC55PDAmJihhLnk9LWEueSl9cmV0dXJuIGEueD1udChhLngrdGhpcy5sb25nMCksYX0sbmFtZXM6WyJSb2JpbnNvbiIsInJvYmluIl19LFVzPXtpbml0OmZ1bmN0aW9uKCl7dGhpcy5uYW1lPSJnZW9jZW50In0sZm9yd2FyZDpmdW5jdGlvbih0KXtyZXR1cm4gTSh0LHRoaXMuZXMsdGhpcy5hKX0saW52ZXJzZTpmdW5jdGlvbih0KXtyZXR1cm4gYyh0LHRoaXMuZXMsdGhpcy5hLHRoaXMuYil9LG5hbWVzOlsiR2VvY2VudHJpYyIsImdlb2NlbnRyaWMiLCJnZW9jZW50IiwiR2VvY2VudCJdfTtyZXR1cm4gYS5kZWZhdWx0RGF0dW09IldHUzg0IixhLlByb2o9cSxhLldHUzg0PW5ldyBhLlByb2ooIldHUzg0IiksYS5Qb2ludD1DLGEudG9Qb2ludD1idCxhLmRlZnM9bCxhLnRyYW5zZm9ybT1mLGEubWdycz1PdCxhLnZlcnNpb249IjIuNi4yIiwoJHQ9YSkuUHJvai5wcm9qZWN0aW9ucy5hZGQoc3MpLCR0LlByb2oucHJvamVjdGlvbnMuYWRkKGlzKSwkdC5Qcm9qLnByb2plY3Rpb25zLmFkZChhcyksJHQuUHJvai5wcm9qZWN0aW9ucy5hZGQoZXMpLCR0LlByb2oucHJvamVjdGlvbnMuYWRkKG5zKSwkdC5Qcm9qLnByb2plY3Rpb25zLmFkZChycyksJHQuUHJvai5wcm9qZWN0aW9ucy5hZGQob3MpLCR0LlByb2oucHJvamVjdGlvbnMuYWRkKGxzKSwkdC5Qcm9qLnByb2plY3Rpb25zLmFkZChNcyksJHQuUHJvai5wcm9qZWN0aW9ucy5hZGQoY3MpLCR0LlByb2oucHJvamVjdGlvbnMuYWRkKHVzKSwkdC5Qcm9qLnByb2plY3Rpb25zLmFkZChmcyksJHQuUHJvai5wcm9qZWN0aW9ucy5hZGQobXMpLCR0LlByb2oucHJvamVjdGlvbnMuYWRkKHBzKSwkdC5Qcm9qLnByb2plY3Rpb25zLmFkZChkcyksJHQuUHJvai5wcm9qZWN0aW9ucy5hZGQoeXMpLCR0LlByb2oucHJvamVjdGlvbnMuYWRkKF9zKSwkdC5Qcm9qLnByb2plY3Rpb25zLmFkZCh4cyksJHQuUHJvai5wcm9qZWN0aW9ucy5hZGQoZ3MpLCR0LlByb2oucHJvamVjdGlvbnMuYWRkKGJzKSwkdC5Qcm9qLnByb2plY3Rpb25zLmFkZCh2cyksJHQuUHJvai5wcm9qZWN0aW9ucy5hZGQod3MpLCR0LlByb2oucHJvamVjdGlvbnMuYWRkKENzKSwkdC5Qcm9qLnByb2plY3Rpb25zLmFkZChQcyksJHQuUHJvai5wcm9qZWN0aW9ucy5hZGQoenMpLCR0LlByb2oucHJvamVjdGlvbnMuYWRkKEJzKSwkdC5Qcm9qLnByb2plY3Rpb25zLmFkZChVcyksYX0pOw=="></script>
<script src="data:application/javascript;base64,KGZ1bmN0aW9uIChmYWN0b3J5KSB7DQoJdmFyIEwsIHByb2o0Ow0KCWlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsNCgkJLy8gQU1EDQoJCWRlZmluZShbJ2xlYWZsZXQnLCAncHJvajQnXSwgZmFjdG9yeSk7DQoJfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09ICJvYmplY3QiKSB7DQoJCS8vIE5vZGUvQ29tbW9uSlMNCgkJTCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTsNCgkJcHJvajQgPSByZXF1aXJlKCdwcm9qNCcpOw0KCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoTCwgcHJvajQpOw0KCX0gZWxzZSB7DQoJCS8vIEJyb3dzZXIgZ2xvYmFscw0KCQlpZiAodHlwZW9mIHdpbmRvdy5MID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygd2luZG93LnByb2o0ID09PSAndW5kZWZpbmVkJykNCgkJCXRocm93ICdMZWFmbGV0IGFuZCBwcm9qNCBtdXN0IGJlIGxvYWRlZCBmaXJzdCc7DQoJCWZhY3Rvcnkod2luZG93LkwsIHdpbmRvdy5wcm9qNCk7DQoJfQ0KfShmdW5jdGlvbiAoTCwgcHJvajQpIHsNCglpZiAocHJvajQuX19lc01vZHVsZSAmJiBwcm9qNC5kZWZhdWx0KSB7DQoJCS8vIElmIHByb2o0IHdhcyBidW5kbGVkIGFzIGFuIEVTNiBtb2R1bGUsIHVud3JhcCBpdCB0byBnZXQNCgkJLy8gdG8gdGhlIGFjdHVhbCBtYWluIHByb2o0IG9iamVjdC4NCgkJLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2thcnRlbmEvUHJvajRMZWFmbGV0L3B1bGwvMTQ3DQoJCXByb2o0ID0gcHJvajQuZGVmYXVsdDsNCgl9DQogDQoJTC5Qcm9qID0ge307DQoNCglMLlByb2ouX2lzUHJvajRPYmogPSBmdW5jdGlvbihhKSB7DQoJCXJldHVybiAodHlwZW9mIGEuaW52ZXJzZSAhPT0gJ3VuZGVmaW5lZCcgJiYNCgkJCXR5cGVvZiBhLmZvcndhcmQgIT09ICd1bmRlZmluZWQnKTsNCgl9Ow0KDQoJTC5Qcm9qLlByb2plY3Rpb24gPSBMLkNsYXNzLmV4dGVuZCh7DQoJCWluaXRpYWxpemU6IGZ1bmN0aW9uKGNvZGUsIGRlZiwgYm91bmRzKSB7DQoJCQl2YXIgaXNQNCA9IEwuUHJvai5faXNQcm9qNE9iaihjb2RlKTsNCgkJCXRoaXMuX3Byb2ogPSBpc1A0ID8gY29kZSA6IHRoaXMuX3Byb2pGcm9tQ29kZURlZihjb2RlLCBkZWYpOw0KCQkJdGhpcy5ib3VuZHMgPSBpc1A0ID8gZGVmIDogYm91bmRzOw0KCQl9LA0KDQoJCXByb2plY3Q6IGZ1bmN0aW9uIChsYXRsbmcpIHsNCgkJCXZhciBwb2ludCA9IHRoaXMuX3Byb2ouZm9yd2FyZChbbGF0bG5nLmxuZywgbGF0bG5nLmxhdF0pOw0KCQkJcmV0dXJuIG5ldyBMLlBvaW50KHBvaW50WzBdLCBwb2ludFsxXSk7DQoJCX0sDQoNCgkJdW5wcm9qZWN0OiBmdW5jdGlvbiAocG9pbnQsIHVuYm91bmRlZCkgew0KCQkJdmFyIHBvaW50MiA9IHRoaXMuX3Byb2ouaW52ZXJzZShbcG9pbnQueCwgcG9pbnQueV0pOw0KCQkJcmV0dXJuIG5ldyBMLkxhdExuZyhwb2ludDJbMV0sIHBvaW50MlswXSwgdW5ib3VuZGVkKTsNCgkJfSwNCg0KCQlfcHJvakZyb21Db2RlRGVmOiBmdW5jdGlvbihjb2RlLCBkZWYpIHsNCgkJCWlmIChkZWYpIHsNCgkJCQlwcm9qNC5kZWZzKGNvZGUsIGRlZik7DQoJCQl9IGVsc2UgaWYgKHByb2o0LmRlZnNbY29kZV0gPT09IHVuZGVmaW5lZCkgew0KCQkJCXZhciB1cm4gPSBjb2RlLnNwbGl0KCc6Jyk7DQoJCQkJaWYgKHVybi5sZW5ndGggPiAzKSB7DQoJCQkJCWNvZGUgPSB1cm5bdXJuLmxlbmd0aCAtIDNdICsgJzonICsgdXJuW3Vybi5sZW5ndGggLSAxXTsNCgkJCQl9DQoJCQkJaWYgKHByb2o0LmRlZnNbY29kZV0gPT09IHVuZGVmaW5lZCkgew0KCQkJCQl0aHJvdyAnTm8gcHJvamVjdGlvbiBkZWZpbml0aW9uIGZvciBjb2RlICcgKyBjb2RlOw0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIHByb2o0KGNvZGUpOw0KCQl9DQoJfSk7DQoNCglMLlByb2ouQ1JTID0gTC5DbGFzcy5leHRlbmQoew0KCQlpbmNsdWRlczogTC5DUlMsDQoNCgkJb3B0aW9uczogew0KCQkJdHJhbnNmb3JtYXRpb246IG5ldyBMLlRyYW5zZm9ybWF0aW9uKDEsIDAsIC0xLCAwKQ0KCQl9LA0KDQoJCWluaXRpYWxpemU6IGZ1bmN0aW9uKGEsIGIsIGMpIHsNCgkJCXZhciBjb2RlLA0KCQkJICAgIHByb2osDQoJCQkgICAgZGVmLA0KCQkJICAgIG9wdGlvbnM7DQoNCgkJCWlmIChMLlByb2ouX2lzUHJvajRPYmooYSkpIHsNCgkJCQlwcm9qID0gYTsNCgkJCQljb2RlID0gcHJvai5zcnNDb2RlOw0KCQkJCW9wdGlvbnMgPSBiIHx8IHt9Ow0KDQoJCQkJdGhpcy5wcm9qZWN0aW9uID0gbmV3IEwuUHJvai5Qcm9qZWN0aW9uKHByb2osIG9wdGlvbnMuYm91bmRzKTsNCgkJCX0gZWxzZSB7DQoJCQkJY29kZSA9IGE7DQoJCQkJZGVmID0gYjsNCgkJCQlvcHRpb25zID0gYyB8fCB7fTsNCgkJCQl0aGlzLnByb2plY3Rpb24gPSBuZXcgTC5Qcm9qLlByb2plY3Rpb24oY29kZSwgZGVmLCBvcHRpb25zLmJvdW5kcyk7DQoJCQl9DQoNCgkJCUwuVXRpbC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpOw0KCQkJdGhpcy5jb2RlID0gY29kZTsNCgkJCXRoaXMudHJhbnNmb3JtYXRpb24gPSB0aGlzLm9wdGlvbnMudHJhbnNmb3JtYXRpb247DQoNCgkJCWlmICh0aGlzLm9wdGlvbnMub3JpZ2luKSB7DQoJCQkJdGhpcy50cmFuc2Zvcm1hdGlvbiA9DQoJCQkJCW5ldyBMLlRyYW5zZm9ybWF0aW9uKDEsIC10aGlzLm9wdGlvbnMub3JpZ2luWzBdLA0KCQkJCQkJLTEsIHRoaXMub3B0aW9ucy5vcmlnaW5bMV0pOw0KCQkJfQ0KDQoJCQlpZiAodGhpcy5vcHRpb25zLnNjYWxlcykgew0KCQkJCXRoaXMuX3NjYWxlcyA9IHRoaXMub3B0aW9ucy5zY2FsZXM7DQoJCQl9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5yZXNvbHV0aW9ucykgew0KCQkJCXRoaXMuX3NjYWxlcyA9IFtdOw0KCQkJCWZvciAodmFyIGkgPSB0aGlzLm9wdGlvbnMucmVzb2x1dGlvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCgkJCQkJaWYgKHRoaXMub3B0aW9ucy5yZXNvbHV0aW9uc1tpXSkgew0KCQkJCQkJdGhpcy5fc2NhbGVzW2ldID0gMSAvIHRoaXMub3B0aW9ucy5yZXNvbHV0aW9uc1tpXTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJdGhpcy5pbmZpbml0ZSA9ICF0aGlzLm9wdGlvbnMuYm91bmRzOw0KDQoJCX0sDQoNCgkJc2NhbGU6IGZ1bmN0aW9uKHpvb20pIHsNCgkJCXZhciBpWm9vbSA9IE1hdGguZmxvb3Ioem9vbSksDQoJCQkJYmFzZVNjYWxlLA0KCQkJCW5leHRTY2FsZSwNCgkJCQlzY2FsZURpZmYsDQoJCQkJekRpZmY7DQoJCQlpZiAoem9vbSA9PT0gaVpvb20pIHsNCgkJCQlyZXR1cm4gdGhpcy5fc2NhbGVzW3pvb21dOw0KCQkJfSBlbHNlIHsNCgkJCQkvLyBOb24taW50ZWdlciB6b29tLCBpbnRlcnBvbGF0ZQ0KCQkJCWJhc2VTY2FsZSA9IHRoaXMuX3NjYWxlc1tpWm9vbV07DQoJCQkJbmV4dFNjYWxlID0gdGhpcy5fc2NhbGVzW2lab29tICsgMV07DQoJCQkJc2NhbGVEaWZmID0gbmV4dFNjYWxlIC0gYmFzZVNjYWxlOw0KCQkJCXpEaWZmID0gKHpvb20gLSBpWm9vbSk7DQoJCQkJcmV0dXJuIGJhc2VTY2FsZSArIHNjYWxlRGlmZiAqIHpEaWZmOw0KCQkJfQ0KCQl9LA0KDQoJCXpvb206IGZ1bmN0aW9uKHNjYWxlKSB7DQoJCQkvLyBGaW5kIGNsb3Nlc3QgbnVtYmVyIGluIHRoaXMuX3NjYWxlcywgZG93bg0KCQkJdmFyIGRvd25TY2FsZSA9IHRoaXMuX2Nsb3Nlc3RFbGVtZW50KHRoaXMuX3NjYWxlcywgc2NhbGUpLA0KCQkJCWRvd25ab29tID0gdGhpcy5fc2NhbGVzLmluZGV4T2YoZG93blNjYWxlKSwNCgkJCQluZXh0U2NhbGUsDQoJCQkJbmV4dFpvb20sDQoJCQkJc2NhbGVEaWZmOw0KCQkJLy8gQ2hlY2sgaWYgc2NhbGUgaXMgZG93blNjYWxlID0+IHJldHVybiBhcnJheSBpbmRleA0KCQkJaWYgKHNjYWxlID09PSBkb3duU2NhbGUpIHsNCgkJCQlyZXR1cm4gZG93blpvb207DQoJCQl9DQoJCQlpZiAoZG93blNjYWxlID09PSB1bmRlZmluZWQpIHsNCgkJCQlyZXR1cm4gLUluZmluaXR5Ow0KCQkJfQ0KCQkJLy8gSW50ZXJwb2xhdGUNCgkJCW5leHRab29tID0gZG93blpvb20gKyAxOw0KCQkJbmV4dFNjYWxlID0gdGhpcy5fc2NhbGVzW25leHRab29tXTsNCgkJCWlmIChuZXh0U2NhbGUgPT09IHVuZGVmaW5lZCkgew0KCQkJCXJldHVybiBJbmZpbml0eTsNCgkJCX0NCgkJCXNjYWxlRGlmZiA9IG5leHRTY2FsZSAtIGRvd25TY2FsZTsNCgkJCXJldHVybiAoc2NhbGUgLSBkb3duU2NhbGUpIC8gc2NhbGVEaWZmICsgZG93blpvb207DQoJCX0sDQoNCgkJZGlzdGFuY2U6IEwuQ1JTLkVhcnRoLmRpc3RhbmNlLA0KDQoJCVI6IEwuQ1JTLkVhcnRoLlIsDQoNCgkJLyogR2V0IHRoZSBjbG9zZXN0IGxvd2VzdCBlbGVtZW50IGluIGFuIGFycmF5ICovDQoJCV9jbG9zZXN0RWxlbWVudDogZnVuY3Rpb24oYXJyYXksIGVsZW1lbnQpIHsNCgkJCXZhciBsb3c7DQoJCQlmb3IgKHZhciBpID0gYXJyYXkubGVuZ3RoOyBpLS07KSB7DQoJCQkJaWYgKGFycmF5W2ldIDw9IGVsZW1lbnQgJiYgKGxvdyA9PT0gdW5kZWZpbmVkIHx8IGxvdyA8IGFycmF5W2ldKSkgew0KCQkJCQlsb3cgPSBhcnJheVtpXTsNCgkJCQl9DQoJCQl9DQoJCQlyZXR1cm4gbG93Ow0KCQl9DQoJfSk7DQoNCglMLlByb2ouR2VvSlNPTiA9IEwuR2VvSlNPTi5leHRlbmQoew0KCQlpbml0aWFsaXplOiBmdW5jdGlvbihnZW9qc29uLCBvcHRpb25zKSB7DQoJCQl0aGlzLl9jYWxsTGV2ZWwgPSAwOw0KCQkJTC5HZW9KU09OLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgZ2VvanNvbiwgb3B0aW9ucyk7DQoJCX0sDQoNCgkJYWRkRGF0YTogZnVuY3Rpb24oZ2VvanNvbikgew0KCQkJdmFyIGNyczsNCg0KCQkJaWYgKGdlb2pzb24pIHsNCgkJCQlpZiAoZ2VvanNvbi5jcnMgJiYgZ2VvanNvbi5jcnMudHlwZSA9PT0gJ25hbWUnKSB7DQoJCQkJCWNycyA9IG5ldyBMLlByb2ouQ1JTKGdlb2pzb24uY3JzLnByb3BlcnRpZXMubmFtZSk7DQoJCQkJfSBlbHNlIGlmIChnZW9qc29uLmNycyAmJiBnZW9qc29uLmNycy50eXBlKSB7DQoJCQkJCWNycyA9IG5ldyBMLlByb2ouQ1JTKGdlb2pzb24uY3JzLnR5cGUgKyAnOicgKyBnZW9qc29uLmNycy5wcm9wZXJ0aWVzLmNvZGUpOw0KCQkJCX0NCg0KCQkJCWlmIChjcnMgIT09IHVuZGVmaW5lZCkgew0KCQkJCQl0aGlzLm9wdGlvbnMuY29vcmRzVG9MYXRMbmcgPSBmdW5jdGlvbihjb29yZHMpIHsNCgkJCQkJCXZhciBwb2ludCA9IEwucG9pbnQoY29vcmRzWzBdLCBjb29yZHNbMV0pOw0KCQkJCQkJcmV0dXJuIGNycy5wcm9qZWN0aW9uLnVucHJvamVjdChwb2ludCk7DQoJCQkJCX07DQoJCQkJfQ0KCQkJfQ0KDQoJCQkvLyBCYXNlIGNsYXNzJyBhZGREYXRhIG1pZ2h0IGNhbGwgdXMgcmVjdXJzaXZlbHksIGJ1dA0KCQkJLy8gQ1JTIHNob3VsZG4ndCBiZSBjbGVhcmVkIGluIHRoYXQgY2FzZSwgc2luY2UgQ1JTIGFwcGxpZXMNCgkJCS8vIHRvIHRoZSB3aG9sZSBHZW9KU09OLCBpbmx1ZGluZyBzdWItZmVhdHVyZXMuDQoJCQl0aGlzLl9jYWxsTGV2ZWwrKzsNCgkJCXRyeSB7DQoJCQkJTC5HZW9KU09OLnByb3RvdHlwZS5hZGREYXRhLmNhbGwodGhpcywgZ2VvanNvbik7DQoJCQl9IGZpbmFsbHkgew0KCQkJCXRoaXMuX2NhbGxMZXZlbC0tOw0KCQkJCWlmICh0aGlzLl9jYWxsTGV2ZWwgPT09IDApIHsNCgkJCQkJZGVsZXRlIHRoaXMub3B0aW9ucy5jb29yZHNUb0xhdExuZzsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9KTsNCg0KCUwuUHJvai5nZW9Kc29uID0gZnVuY3Rpb24oZ2VvanNvbiwgb3B0aW9ucykgew0KCQlyZXR1cm4gbmV3IEwuUHJvai5HZW9KU09OKGdlb2pzb24sIG9wdGlvbnMpOw0KCX07DQoNCglMLlByb2ouSW1hZ2VPdmVybGF5ID0gTC5JbWFnZU92ZXJsYXkuZXh0ZW5kKHsNCgkJaW5pdGlhbGl6ZTogZnVuY3Rpb24gKHVybCwgYm91bmRzLCBvcHRpb25zKSB7DQoJCQlMLkltYWdlT3ZlcmxheS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHVybCwgbnVsbCwgb3B0aW9ucyk7DQoJCQl0aGlzLl9wcm9qZWN0ZWRCb3VuZHMgPSBib3VuZHM7DQoJCX0sDQoNCgkJLy8gRGFuZ2VyIGFoZWFkOiBPdmVycmlkaW5nIGludGVybmFsIG1ldGhvZHMgaW4gTGVhZmxldC4NCgkJLy8gRGVjaWRlZCB0byBkbyB0aGlzIHJhdGhlciB0aGFuIG1ha2luZyBhIGNvcHkgb2YgTC5JbWFnZU92ZXJsYXkNCgkJLy8gYW5kIGRvaW5nIHZlcnkgdGlueSBtb2RpZmljYXRpb25zIHRvIGl0Lg0KCQkvLyBGdXR1cmUgd2lsbCB0ZWxsIGlmIHRoaXMgd2FzIHdpc2Ugb3Igbm90Lg0KCQlfYW5pbWF0ZVpvb206IGZ1bmN0aW9uIChldmVudCkgew0KCQkJdmFyIHNjYWxlID0gdGhpcy5fbWFwLmdldFpvb21TY2FsZShldmVudC56b29tKTsNCgkJCXZhciBub3J0aFdlc3QgPSBMLnBvaW50KHRoaXMuX3Byb2plY3RlZEJvdW5kcy5taW4ueCwgdGhpcy5fcHJvamVjdGVkQm91bmRzLm1heC55KTsNCgkJCXZhciBvZmZzZXQgPSB0aGlzLl9wcm9qZWN0ZWRUb05ld0xheWVyUG9pbnQobm9ydGhXZXN0LCBldmVudC56b29tLCBldmVudC5jZW50ZXIpOw0KDQoJCQlMLkRvbVV0aWwuc2V0VHJhbnNmb3JtKHRoaXMuX2ltYWdlLCBvZmZzZXQsIHNjYWxlKTsNCgkJfSwNCg0KCQlfcmVzZXQ6IGZ1bmN0aW9uICgpIHsNCgkJCXZhciB6b29tID0gdGhpcy5fbWFwLmdldFpvb20oKTsNCgkJCXZhciBwaXhlbE9yaWdpbiA9IHRoaXMuX21hcC5nZXRQaXhlbE9yaWdpbigpOw0KCQkJdmFyIGJvdW5kcyA9IEwuYm91bmRzKA0KCQkJCXRoaXMuX3RyYW5zZm9ybSh0aGlzLl9wcm9qZWN0ZWRCb3VuZHMubWluLCB6b29tKS5fc3VidHJhY3QocGl4ZWxPcmlnaW4pLA0KCQkJCXRoaXMuX3RyYW5zZm9ybSh0aGlzLl9wcm9qZWN0ZWRCb3VuZHMubWF4LCB6b29tKS5fc3VidHJhY3QocGl4ZWxPcmlnaW4pDQoJCQkpOw0KCQkJdmFyIHNpemUgPSBib3VuZHMuZ2V0U2l6ZSgpOw0KDQoJCQlMLkRvbVV0aWwuc2V0UG9zaXRpb24odGhpcy5faW1hZ2UsIGJvdW5kcy5taW4pOw0KCQkJdGhpcy5faW1hZ2Uuc3R5bGUud2lkdGggPSBzaXplLnggKyAncHgnOw0KCQkJdGhpcy5faW1hZ2Uuc3R5bGUuaGVpZ2h0ID0gc2l6ZS55ICsgJ3B4JzsNCgkJfSwNCg0KCQlfcHJvamVjdGVkVG9OZXdMYXllclBvaW50OiBmdW5jdGlvbiAocG9pbnQsIHpvb20sIGNlbnRlcikgew0KCQkJdmFyIHZpZXdIYWxmID0gdGhpcy5fbWFwLmdldFNpemUoKS5fZGl2aWRlQnkoMik7DQoJCQl2YXIgbmV3VG9wTGVmdCA9IHRoaXMuX21hcC5wcm9qZWN0KGNlbnRlciwgem9vbSkuX3N1YnRyYWN0KHZpZXdIYWxmKS5fcm91bmQoKTsNCgkJCXZhciB0b3BMZWZ0ID0gbmV3VG9wTGVmdC5hZGQodGhpcy5fbWFwLl9nZXRNYXBQYW5lUG9zKCkpOw0KDQoJCQlyZXR1cm4gdGhpcy5fdHJhbnNmb3JtKHBvaW50LCB6b29tKS5fc3VidHJhY3QodG9wTGVmdCk7DQoJCX0sDQoNCgkJX3RyYW5zZm9ybTogZnVuY3Rpb24gKHBvaW50LCB6b29tKSB7DQoJCQl2YXIgY3JzID0gdGhpcy5fbWFwLm9wdGlvbnMuY3JzOw0KCQkJdmFyIHRyYW5zZm9ybWF0aW9uID0gY3JzLnRyYW5zZm9ybWF0aW9uOw0KCQkJdmFyIHNjYWxlID0gY3JzLnNjYWxlKHpvb20pOw0KDQoJCQlyZXR1cm4gdHJhbnNmb3JtYXRpb24udHJhbnNmb3JtKHBvaW50LCBzY2FsZSk7DQoJCX0NCgl9KTsNCg0KCUwuUHJvai5pbWFnZU92ZXJsYXkgPSBmdW5jdGlvbiAodXJsLCBib3VuZHMsIG9wdGlvbnMpIHsNCgkJcmV0dXJuIG5ldyBMLlByb2ouSW1hZ2VPdmVybGF5KHVybCwgYm91bmRzLCBvcHRpb25zKTsNCgl9Ow0KDQoJcmV0dXJuIEwuUHJvajsNCn0pKTsNCg=="></script>
<link href="data:text/css,%2Eleaflet%2Dtooltip%2Eleaflet%2Dtooltip%2Dtext%2Donly%2C%0A%2Eleaflet%2Dtooltip%2Eleaflet%2Dtooltip%2Dtext%2Donly%3Abefore%2C%0A%2Eleaflet%2Dtooltip%2Eleaflet%2Dtooltip%2Dtext%2Donly%3Aafter%20%7B%0Abackground%3A%20none%3B%0Aborder%3A%20none%3B%0Abox%2Dshadow%3A%20none%3B%0A%7D%0A%2Eleaflet%2Dtooltip%2Eleaflet%2Dtooltip%2Dtext%2Donly%2Eleaflet%2Dtooltip%2Dleft%20%7B%0Amargin%2Dleft%3A%205px%3B%0A%7D%0A%2Eleaflet%2Dtooltip%2Eleaflet%2Dtooltip%2Dtext%2Donly%2Eleaflet%2Dtooltip%2Dright%20%7B%0Amargin%2Dleft%3A%20%2D5px%3B%0A%7D%0A%2Eleaflet%2Dtooltip%3Aafter%20%7B%0Aborder%2Dright%3A%206px%20solid%20transparent%3B%0A%0A%7D%0A%2Eleaflet%2Dpopup%2Dpane%20%2Eleaflet%2Dpopup%2Dtip%2Dcontainer%20%7B%0A%0Apointer%2Devents%3A%20all%3B%0A%0Acursor%3A%20pointer%3B%0A%7D%0A%0A%2Eleaflet%2Dmap%2Dpane%20%7B%0Az%2Dindex%3A%20auto%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/javascript;base64,KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitpKyInIik7dGhyb3cgYS5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpKHsxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwpleHBvcnRzWyJkZWZhdWx0Il0gPSB1bmRlZmluZWQ7Cgp2YXIgX3V0aWwgPSByZXF1aXJlKCIuL3V0aWwiKTsKCmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQoKZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KCmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9Cgp2YXIgQ2x1c3RlckxheWVyU3RvcmUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogIGZ1bmN0aW9uIENsdXN0ZXJMYXllclN0b3JlKGdyb3VwKSB7CiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2x1c3RlckxheWVyU3RvcmUpOwoKICAgIHRoaXMuX2xheWVycyA9IHt9OwogICAgdGhpcy5fZ3JvdXAgPSBncm91cDsKICB9CgogIF9jcmVhdGVDbGFzcyhDbHVzdGVyTGF5ZXJTdG9yZSwgW3sKICAgIGtleTogImFkZCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKGxheWVyLCBpZCkgewogICAgICBpZiAodHlwZW9mIGlkICE9PSAidW5kZWZpbmVkIiAmJiBpZCAhPT0gbnVsbCkgewogICAgICAgIGlmICh0aGlzLl9sYXllcnNbaWRdKSB7CiAgICAgICAgICB0aGlzLl9ncm91cC5yZW1vdmVMYXllcih0aGlzLl9sYXllcnNbaWRdKTsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2xheWVyc1tpZF0gPSBsYXllcjsKICAgICAgfQoKICAgICAgdGhpcy5fZ3JvdXAuYWRkTGF5ZXIobGF5ZXIpOwogICAgfQogIH0sIHsKICAgIGtleTogInJlbW92ZSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKGlkKSB7CiAgICAgIGlmICh0eXBlb2YgaWQgPT09ICJ1bmRlZmluZWQiIHx8IGlkID09PSBudWxsKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZCA9ICgwLCBfdXRpbC5hc0FycmF5KShpZCk7CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKHRoaXMuX2xheWVyc1tpZFtpXV0pIHsKICAgICAgICAgIHRoaXMuX2dyb3VwLnJlbW92ZUxheWVyKHRoaXMuX2xheWVyc1tpZFtpXV0pOwoKICAgICAgICAgIGRlbGV0ZSB0aGlzLl9sYXllcnNbaWRbaV1dOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sIHsKICAgIGtleTogImNsZWFyIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHsKICAgICAgdGhpcy5fbGF5ZXJzID0ge307CgogICAgICB0aGlzLl9ncm91cC5jbGVhckxheWVycygpOwogICAgfQogIH1dKTsKCiAgcmV0dXJuIENsdXN0ZXJMYXllclN0b3JlOwp9KCk7CgpleHBvcnRzWyJkZWZhdWx0Il0gPSBDbHVzdGVyTGF5ZXJTdG9yZTsKCgp9LHsiLi91dGlsIjoxN31dLDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgdmFsdWU6IHRydWUKfSk7CgpmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KCmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9CgpmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQoKdmFyIENvbnRyb2xTdG9yZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgZnVuY3Rpb24gQ29udHJvbFN0b3JlKG1hcCkgewogICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbnRyb2xTdG9yZSk7CgogICAgdGhpcy5fY29udHJvbHNOb0lkID0gW107CiAgICB0aGlzLl9jb250cm9sc0J5SWQgPSB7fTsKICAgIHRoaXMuX21hcCA9IG1hcDsKICB9CgogIF9jcmVhdGVDbGFzcyhDb250cm9sU3RvcmUsIFt7CiAgICBrZXk6ICJhZGQiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGFkZChjb250cm9sLCBpZCwgaHRtbCkgewogICAgICBpZiAodHlwZW9mIGlkICE9PSAidW5kZWZpbmVkIiAmJiBpZCAhPT0gbnVsbCkgewogICAgICAgIGlmICh0aGlzLl9jb250cm9sc0J5SWRbaWRdKSB7CiAgICAgICAgICB0aGlzLl9tYXAucmVtb3ZlQ29udHJvbCh0aGlzLl9jb250cm9sc0J5SWRbaWRdKTsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2NvbnRyb2xzQnlJZFtpZF0gPSBjb250cm9sOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuX2NvbnRyb2xzTm9JZC5wdXNoKGNvbnRyb2wpOwogICAgICB9CgogICAgICB0aGlzLl9tYXAuYWRkQ29udHJvbChjb250cm9sKTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJnZXQiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGdldChpZCkgewogICAgICB2YXIgY29udHJvbCA9IG51bGw7CgogICAgICBpZiAodGhpcy5fY29udHJvbHNCeUlkW2lkXSkgewogICAgICAgIGNvbnRyb2wgPSB0aGlzLl9jb250cm9sc0J5SWRbaWRdOwogICAgICB9CgogICAgICByZXR1cm4gY29udHJvbDsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJyZW1vdmUiLAogICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZShpZCkgewogICAgICBpZiAodGhpcy5fY29udHJvbHNCeUlkW2lkXSkgewogICAgICAgIHZhciBjb250cm9sID0gdGhpcy5fY29udHJvbHNCeUlkW2lkXTsKCiAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUNvbnRyb2woY29udHJvbCk7CgogICAgICAgIGRlbGV0ZSB0aGlzLl9jb250cm9sc0J5SWRbaWRdOwogICAgICB9CiAgICB9CiAgfSwgewogICAga2V5OiAiY2xlYXIiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2NvbnRyb2xzTm9JZC5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjb250cm9sID0gdGhpcy5fY29udHJvbHNOb0lkW2ldOwoKICAgICAgICB0aGlzLl9tYXAucmVtb3ZlQ29udHJvbChjb250cm9sKTsKICAgICAgfQoKICAgICAgdGhpcy5fY29udHJvbHNOb0lkID0gW107CgogICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fY29udHJvbHNCeUlkKSB7CiAgICAgICAgdmFyIF9jb250cm9sID0gdGhpcy5fY29udHJvbHNCeUlkW2tleV07CgogICAgICAgIHRoaXMuX21hcC5yZW1vdmVDb250cm9sKF9jb250cm9sKTsKICAgICAgfQoKICAgICAgdGhpcy5fY29udHJvbHNCeUlkID0ge307CiAgICB9CiAgfV0pOwoKICByZXR1cm4gQ29udHJvbFN0b3JlOwp9KCk7CgpleHBvcnRzWyJkZWZhdWx0Il0gPSBDb250cm9sU3RvcmU7CgoKfSx7fV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICB2YWx1ZTogdHJ1ZQp9KTsKZXhwb3J0cy5nZXRDUlMgPSBnZXRDUlM7Cgp2YXIgX2xlYWZsZXQgPSByZXF1aXJlKCIuL2dsb2JhbC9sZWFmbGV0Iik7Cgp2YXIgX2xlYWZsZXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbGVhZmxldCk7Cgp2YXIgX3Byb2o0bGVhZmxldCA9IHJlcXVpcmUoIi4vZ2xvYmFsL3Byb2o0bGVhZmxldCIpOwoKdmFyIF9wcm9qNGxlYWZsZXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvajRsZWFmbGV0KTsKCmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICJkZWZhdWx0Ijogb2JqIH07IH0KCi8vIEhlbHBlciBmdW5jdGlvbiB0byBpbnN0YW5jaWF0ZSBhIElDUlMgaW5zdGFuY2UuCmZ1bmN0aW9uIGdldENSUyhjcnNPcHRpb25zKSB7CiAgdmFyIGNycyA9IF9sZWFmbGV0MlsiZGVmYXVsdCJdLkNSUy5FUFNHMzg1NzsgLy8gRGVmYXVsdCBTcGhlcmljYWwgTWVyY2F0b3IKCiAgc3dpdGNoIChjcnNPcHRpb25zLmNyc0NsYXNzKSB7CiAgICBjYXNlICJMLkNSUy5FUFNHMzg1NyI6CiAgICAgIGNycyA9IF9sZWFmbGV0MlsiZGVmYXVsdCJdLkNSUy5FUFNHMzg1NzsKICAgICAgYnJlYWs7CgogICAgY2FzZSAiTC5DUlMuRVBTRzQzMjYiOgogICAgICBjcnMgPSBfbGVhZmxldDJbImRlZmF1bHQiXS5DUlMuRVBTRzQzMjY7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgIkwuQ1JTLkVQU0czMzk1IjoKICAgICAgY3JzID0gX2xlYWZsZXQyWyJkZWZhdWx0Il0uQ1JTLkVQU0czMzk1OwogICAgICBicmVhazsKCiAgICBjYXNlICJMLkNSUy5TaW1wbGUiOgogICAgICBjcnMgPSBfbGVhZmxldDJbImRlZmF1bHQiXS5DUlMuU2ltcGxlOwogICAgICBicmVhazsKCiAgICBjYXNlICJMLlByb2ouQ1JTIjoKICAgICAgaWYgKGNyc09wdGlvbnMub3B0aW9ucyAmJiBjcnNPcHRpb25zLm9wdGlvbnMuYm91bmRzKSB7CiAgICAgICAgY3JzT3B0aW9ucy5vcHRpb25zLmJvdW5kcyA9IF9sZWFmbGV0MlsiZGVmYXVsdCJdLmJvdW5kcyhjcnNPcHRpb25zLm9wdGlvbnMuYm91bmRzKTsKICAgICAgfQoKICAgICAgaWYgKGNyc09wdGlvbnMub3B0aW9ucyAmJiBjcnNPcHRpb25zLm9wdGlvbnMudHJhbnNmb3JtYXRpb24pIHsKICAgICAgICBjcnNPcHRpb25zLm9wdGlvbnMudHJhbnNmb3JtYXRpb24gPSBuZXcgX2xlYWZsZXQyWyJkZWZhdWx0Il0uVHJhbnNmb3JtYXRpb24oY3JzT3B0aW9ucy5vcHRpb25zLnRyYW5zZm9ybWF0aW9uWzBdLCBjcnNPcHRpb25zLm9wdGlvbnMudHJhbnNmb3JtYXRpb25bMV0sIGNyc09wdGlvbnMub3B0aW9ucy50cmFuc2Zvcm1hdGlvblsyXSwgY3JzT3B0aW9ucy5vcHRpb25zLnRyYW5zZm9ybWF0aW9uWzNdKTsKICAgICAgfQoKICAgICAgY3JzID0gbmV3IF9wcm9qNGxlYWZsZXQyWyJkZWZhdWx0Il0uQ1JTKGNyc09wdGlvbnMuY29kZSwgY3JzT3B0aW9ucy5wcm9qNGRlZiwgY3JzT3B0aW9ucy5vcHRpb25zKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSAiTC5Qcm9qLkNSUy5UTVMiOgogICAgICBpZiAoY3JzT3B0aW9ucy5vcHRpb25zICYmIGNyc09wdGlvbnMub3B0aW9ucy5ib3VuZHMpIHsKICAgICAgICBjcnNPcHRpb25zLm9wdGlvbnMuYm91bmRzID0gX2xlYWZsZXQyWyJkZWZhdWx0Il0uYm91bmRzKGNyc09wdGlvbnMub3B0aW9ucy5ib3VuZHMpOwogICAgICB9CgogICAgICBpZiAoY3JzT3B0aW9ucy5vcHRpb25zICYmIGNyc09wdGlvbnMub3B0aW9ucy50cmFuc2Zvcm1hdGlvbikgewogICAgICAgIGNyc09wdGlvbnMub3B0aW9ucy50cmFuc2Zvcm1hdGlvbiA9IF9sZWFmbGV0MlsiZGVmYXVsdCJdLlRyYW5zZm9ybWF0aW9uKGNyc09wdGlvbnMub3B0aW9ucy50cmFuc2Zvcm1hdGlvblswXSwgY3JzT3B0aW9ucy5vcHRpb25zLnRyYW5zZm9ybWF0aW9uWzFdLCBjcnNPcHRpb25zLm9wdGlvbnMudHJhbnNmb3JtYXRpb25bMl0sIGNyc09wdGlvbnMub3B0aW9ucy50cmFuc2Zvcm1hdGlvblszXSk7CiAgICAgIH0gLy8gTC5Qcm9qLkNSUy5UTVMgaXMgZGVwcmVjYXRlZCBhcyBvZiBMZWFmbGV0IDEueCwgZmFsbCBiYWNrIHRvIEwuUHJvai5DUlMKICAgICAgLy9jcnMgPSBuZXcgUHJvajRMZWFmbGV0LkNSUy5UTVMoY3JzT3B0aW9ucy5jb2RlLCBjcnNPcHRpb25zLnByb2o0ZGVmLCBjcnNPcHRpb25zLnByb2plY3RlZEJvdW5kcywgY3JzT3B0aW9ucy5vcHRpb25zKTsKCgogICAgICBjcnMgPSBuZXcgX3Byb2o0bGVhZmxldDJbImRlZmF1bHQiXS5DUlMoY3JzT3B0aW9ucy5jb2RlLCBjcnNPcHRpb25zLnByb2o0ZGVmLCBjcnNPcHRpb25zLm9wdGlvbnMpOwogICAgICBicmVhazsKICB9CgogIHJldHVybiBjcnM7Cn0KCgp9LHsiLi9nbG9iYWwvbGVhZmxldCI6MTAsIi4vZ2xvYmFsL3Byb2o0bGVhZmxldCI6MTF9XSw0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwpleHBvcnRzWyJkZWZhdWx0Il0gPSB1bmRlZmluZWQ7Cgp2YXIgX3V0aWwgPSByZXF1aXJlKCIuL3V0aWwiKTsKCmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQoKZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KCmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9Cgp2YXIgRGF0YUZyYW1lID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICBmdW5jdGlvbiBEYXRhRnJhbWUoKSB7CiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRGF0YUZyYW1lKTsKCiAgICB0aGlzLmNvbHVtbnMgPSBbXTsKICAgIHRoaXMuY29sbmFtZXMgPSBbXTsKICAgIHRoaXMuY29sc3RyaWN0ID0gW107CiAgICB0aGlzLmVmZmVjdGl2ZUxlbmd0aCA9IDA7CiAgICB0aGlzLmNvbGluZGljZXMgPSB7fTsKICB9CgogIF9jcmVhdGVDbGFzcyhEYXRhRnJhbWUsIFt7CiAgICBrZXk6ICJfdXBkYXRlQ2FjaGVkUHJvcGVydGllcyIsCiAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZUNhY2hlZFByb3BlcnRpZXMoKSB7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICB0aGlzLmVmZmVjdGl2ZUxlbmd0aCA9IDA7CiAgICAgIHRoaXMuY29saW5kaWNlcyA9IHt9OwogICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uLCBpKSB7CiAgICAgICAgX3RoaXMuZWZmZWN0aXZlTGVuZ3RoID0gTWF0aC5tYXgoX3RoaXMuZWZmZWN0aXZlTGVuZ3RoLCBjb2x1bW4ubGVuZ3RoKTsKICAgICAgICBfdGhpcy5jb2xpbmRpY2VzW190aGlzLmNvbG5hbWVzW2ldXSA9IGk7CiAgICAgIH0pOwogICAgfQogIH0sIHsKICAgIGtleTogIl9jb2xJbmRleCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gX2NvbEluZGV4KGNvbG5hbWUpIHsKICAgICAgdmFyIGluZGV4ID0gdGhpcy5jb2xpbmRpY2VzW2NvbG5hbWVdOwogICAgICBpZiAodHlwZW9mIGluZGV4ID09PSAidW5kZWZpbmVkIikgcmV0dXJuIC0xOwogICAgICByZXR1cm4gaW5kZXg7CiAgICB9CiAgfSwgewogICAga2V5OiAiY29sIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBjb2wobmFtZSwgdmFsdWVzLCBzdHJpY3QpIHsKICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAic3RyaW5nIikgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbHVtbiBuYW1lIFwiIiArIG5hbWUgKyAiXCIiKTsKCiAgICAgIHZhciBpbmRleCA9IHRoaXMuX2NvbEluZGV4KG5hbWUpOwoKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gbnVsbDtlbHNlIHJldHVybiAoMCwgX3V0aWwucmVjeWNsZSkodGhpcy5jb2x1bW5zW2luZGV4XSwgdGhpcy5lZmZlY3RpdmVMZW5ndGgpOwogICAgICB9CgogICAgICBpZiAoaW5kZXggPCAwKSB7CiAgICAgICAgaW5kZXggPSB0aGlzLmNvbG5hbWVzLmxlbmd0aDsKICAgICAgICB0aGlzLmNvbG5hbWVzLnB1c2gobmFtZSk7CiAgICAgIH0KCiAgICAgIHRoaXMuY29sdW1uc1tpbmRleF0gPSAoMCwgX3V0aWwuYXNBcnJheSkodmFsdWVzKTsKICAgICAgdGhpcy5jb2xzdHJpY3RbaW5kZXhdID0gISFzdHJpY3Q7IC8vIFRPRE86IFZhbGlkYXRlIHN0cmljdG5lc3MgKGVuc3VyZSBsZW5ndGhzIG1hdGNoIHVwIHdpdGggb3RoZXIgc3RyaWN0cykKCiAgICAgIHRoaXMuX3VwZGF0ZUNhY2hlZFByb3BlcnRpZXMoKTsKCiAgICAgIHJldHVybiB0aGlzOwogICAgfQogIH0sIHsKICAgIGtleTogImNiaW5kIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBjYmluZChvYmosIHN0cmljdCkgewogICAgICB2YXIgX3RoaXMyID0gdGhpczsKCiAgICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkgewogICAgICAgIHZhciBjb2xkYXRhID0gb2JqW25hbWVdOwoKICAgICAgICBfdGhpczIuY29sKG5hbWUsIGNvbGRhdGEpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfSwgewogICAga2V5OiAiZ2V0IiwKICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQocm93LCBjb2wsIG1pc3NpbmdPSykgewogICAgICB2YXIgX3RoaXMzID0gdGhpczsKCiAgICAgIGlmIChyb3cgPiB0aGlzLmVmZmVjdGl2ZUxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCJSb3cgYXJndW1lbnQgd2FzIG91dCBvZiBib3VuZHM6ICIgKyByb3cgKyAiID4gIiArIHRoaXMuZWZmZWN0aXZlTGVuZ3RoKTsKICAgICAgdmFyIGNvbEluZGV4ID0gLTE7CgogICAgICBpZiAodHlwZW9mIGNvbCA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICB2YXIgcm93RGF0YSA9IHt9OwogICAgICAgIHRoaXMuY29sbmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSwgaSkgewogICAgICAgICAgcm93RGF0YVtuYW1lXSA9IF90aGlzMy5jb2x1bW5zW2ldW3JvdyAlIF90aGlzMy5jb2x1bW5zW2ldLmxlbmd0aF07CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJvd0RhdGE7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbCA9PT0gInN0cmluZyIpIHsKICAgICAgICBjb2xJbmRleCA9IHRoaXMuX2NvbEluZGV4KGNvbCk7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbCA9PT0gIm51bWJlciIpIHsKICAgICAgICBjb2xJbmRleCA9IGNvbDsKICAgICAgfQoKICAgICAgaWYgKGNvbEluZGV4IDwgMCB8fCBjb2xJbmRleCA+IHRoaXMuY29sdW1ucy5sZW5ndGgpIHsKICAgICAgICBpZiAobWlzc2luZ09LKSByZXR1cm4gdm9pZCAwO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGNvbHVtbiBpbmRleDogIiArIGNvbCk7CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzLmNvbHVtbnNbY29sSW5kZXhdW3JvdyAlIHRoaXMuY29sdW1uc1tjb2xJbmRleF0ubGVuZ3RoXTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJucm93IiwKICAgIHZhbHVlOiBmdW5jdGlvbiBucm93KCkgewogICAgICByZXR1cm4gdGhpcy5lZmZlY3RpdmVMZW5ndGg7CiAgICB9CiAgfV0pOwoKICByZXR1cm4gRGF0YUZyYW1lOwp9KCk7CgpleHBvcnRzWyJkZWZhdWx0Il0gPSBEYXRhRnJhbWU7CgoKfSx7Ii4vdXRpbCI6MTd9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKInVzZSBzdHJpY3QiOwoKdmFyIF9sZWFmbGV0ID0gcmVxdWlyZSgiLi9nbG9iYWwvbGVhZmxldCIpOwoKdmFyIF9sZWFmbGV0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2xlYWZsZXQpOwoKZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgImRlZmF1bHQiOiBvYmogfTsgfQoKLy8gSW4gUk1hcmtkb3duJ3Mgc2VsZi1jb250YWluZWQgbW9kZSwgd2UgZG9uJ3QgaGF2ZSBhIHdheSB0byBjYXJyeSBhcm91bmQgdGhlCi8vIGltYWdlcyB0aGF0IExlYWZsZXQgbmVlZHMgYnV0IGRvZXNuJ3QgbG9hZCBpbnRvIHRoZSBwYWdlLiBJbnN0ZWFkLCB3ZSdsbCBzZXQKLy8gZGF0YSBVUklzIGZvciB0aGUgZGVmYXVsdCBtYXJrZXIsIGFuZCBsZXQgYW55IG90aGVycyBiZSBsb2FkZWQgdmlhIENETi4KaWYgKHR5cGVvZiBfbGVhZmxldDJbImRlZmF1bHQiXS5JY29uLkRlZmF1bHQuaW1hZ2VQYXRoID09PSAidW5kZWZpbmVkIikgewogIC8vIGlmIGluIGEgbG9jYWwgZmlsZSwgc3VwcG9ydCBodHRwCiAgc3dpdGNoICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wpIHsKICAgIGNhc2UgImh0dHA6IjoKICAgICAgLy8gZG9uJ3QgZm9yY2UgaHR0cCBzaXRlIHRvIGJlIGRvbmUgd2l0aCBodHRwcwogICAgICBfbGVhZmxldDJbImRlZmF1bHQiXS5JY29uLkRlZmF1bHQuaW1hZ2VQYXRoID0gImh0dHA6Ly9jZG4ubGVhZmxldGpzLmNvbS9sZWFmbGV0L3YxLjMuMS9pbWFnZXMvIjsKICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgLy8gZmlsZQogICAgICAvLyBodHRwcwogICAgICAvLyBvdGhlcndpc2UgdXNlIGh0dHBzIGFzIGl0IHdvcmtzIG9uIGZpbGVzIGFuZCBodHRwcwogICAgICBfbGVhZmxldDJbImRlZmF1bHQiXS5JY29uLkRlZmF1bHQuaW1hZ2VQYXRoID0gImh0dHBzOi8vdW5wa2cuY29tL2xlYWZsZXRAMS4zLjEvZGlzdC9pbWFnZXMvIjsKICAgICAgYnJlYWs7CiAgfSAvLyBkb24ndCBrbm93IGhvdyB0byBtYWtlIHRoaXMgZGF0YVVSSSB3b3JrIHNpbmNlCiAgLy8gIHdpbGwgYmUgYXBwZW5kZWQgdG8gRGVmYXVsLmltYWdlUGF0aCBhYm92ZQoKICAvKgogIGlmIChMLkJyb3dzZXIucmV0aW5hKSB7CiAgICBMLkljb24uRGVmYXVsdC5wcm90b3R5cGUub3B0aW9ucy5pY29uVXJsID0gImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRElBQUFCU0NBWUFBQUFXeTRmckFBQVBpRWxFUVZSNDJ0MWJDVkNVNXhrbWJhYnRaSkpPTytsMG1oZ1QweVFlMFdYWmd6MjU3ME5COEk2SjZVemFUQm9PUlJGRXJ1VkdEaFdVUFJBUVJGRlJFRG5WeEN0RUJSYjI0REJORTNXYWFhdHBrbWx1bzRtK2ZkOXY5OTlvbEdWQkR1M09QTGorLy9zKzcvVzkzL2Y5Ly82L0V3QTQvVDlnM0FsRk9VZWVVR1IydU1xek95SmsyUjJ4MHF5T0Ftbm1rUzNTckNQclpKbEhsc3F6anlwY3M0OU9YMUpmLy9QN0toRDg4NUEwdTEwbXkyb3ZRc2N2eWJJNndFRjhpdkk3cEZudEFWNnFrdzlQV1NCSzFiRW5aUmx0bTJXWjdSOGg0RmJJMFZHMzNHUGdYWGdDQXJhK0E0RUluOEtUNEpIL0ZpZ29pSi9JSXo2VFpiVlZLTExhbjV1MFFFU3Fsa2NrV1czcDBzeTJieERBZ1p3TzEzVER5dG9CK05QZTkremlsZDJERUZHdUI3L05wekRvZHJpRjU1bzBvN1hJUlhYb054TWFpQ1NqOVZVMDlDOEVFTnh5ajBDNHRodGVyaDJFVit2ZXV3T3I2czdEeTNzc29POTNrM2xsenhCRTZQVGdrWGNNT0Y3RUo5S010cWpSOUpGRFFuTlY5YitRcWxxcUVFQ1FaN1RCZ3UxbllkWHVJWGdWbmVTd1l0Y2dSRmIxUTFpRkdVTEx6UkNzTTkwR09yWmdoeGtpS3Z0aGVjMGdyTHBGbHhDdTZjS2gxdzZjSFVTYmN0UGh4OFlsRUVsdTQrTlNWZk5wQkJBQ3RweUdsYnNHbUJPRWxSaE1CRG9mZ2s0R29iT2pRWEM1Q1JaaVVDL1ZEdG40cUxyQkpaM0EyY05nK25FNFAzMVBnU0RCYkltcTVVTkplak1RRnFpN2NDaWNaM2laQlRBQVFWb1RCSTRES0tDVkdCREhINm5yQlJsV3hXcjdzbGpWSWhsVElETFZvUmtTMWVIL1NOSVBnenl6RlJaVjlObkcrK0xxUWN5b0dRTFFnZkZFSUZZcGN1ZUF6YzZTU2lNT3RUWWdIOUNYcitXcFRieFJCZUtscW45VWt0WmtSb0FDWjVQbE84MVlnZk1NNFJYOUVLQXhUU2pDZHZUakVMUFlXMTdkRDhyc2RpQmZFQmNsU1kyUE94UUlIbmxJa25yb0VBSms2VTJ3cE1MSVNGL2FOUVNoV0FWL3RXbFNFSUsyVnFCTnNyMjAwZ1J5R21Mb2t5UzE4Y1RkRnRBN0FuRk5iY3hBQUNHTXJRdERMQWpxQlQrMWNWSkJOc2syK2JCUTF3T2NYNUsweHMxMkE4R3l6WFJOYWZnZUFZRmIzbUVrckJJNEkvbVdHVWVOUUkxbHlwMlBvTzlqNGFES2NINEViZTBFOGczeGd5eWxjYzZ3Z2JpbU5qU1NvRnRXSzFzVHFMUmgyQk0rU09nSWZER0xKTDhJRzNaWmpVWC9WaXl2R1lMRk93ZFpuL2xqWUk3eXpzZWU0VGpjc1YvSVIzRnFRK3RkQXhFbk5TakZ5UWVCRUs3cGdSVm9kRW5WSVBoc056cUVZSzBabHVGc1JucTNZakgyMktKeUE2ejR5VG1TcFo1emxIOFJUdldrdDFDckI4NVBZVXFqengyQnVHNnNQeWZlZUFBOHNqdHdwaGhpQ0ZTYndYdWIwUzdJU1BpT0Fadk80aDA0OHhTZkJNK2NEcERpZUNaT2dnU3o2SkhkQnY1RkozQ042TFBKUjFRTWdPOTIwNGgyYUFMZ2REeHpqbHA0a3c4WWFIS3lCU0pKUGlnV2I2d0hRaVJtYnhrS0wwUURYa2hnRDk0WXhHS3NHc2tUUWt2ZnhWbmxJSEJjQk5ma2Vneml3QjNIQW5IRHVHeW5SWGNwL3V0WFpoclJIaVdNNUNQTGpiZHdIVkRZQWhGdDNKOHJUdG9QYnBrdFNEckU0SU5aOGl3MTJrVVlFcFBzNGtvemVPVzBBM0VRSW92YlljZnhJVGo3OTh2d3hiZlg0T3IxSDhCNDZST283ZndidktZOWJwTnp5MmhtaVNPT3lNckJFZTJSVDV4Lzd0akh4Q0ZLMmwvNFl5QkorOTVIUUFCbWliS3pFSnZSczlSZ0Y0RnFFNU1sZUdTM0F1bUxOKzZENGxZamZJZU9EL2U1ZVJPZzdzejdvRWc3d0hSazZZM1lpLzJNSndUN2JDUzc1QnZKQnVHc1N2cUlEMWdnYUh5ZWFBTWVRRVJneWFqQmczQkc4U2d4REFzdkpGeFVPY0JrZzdkME1sM1hqZnVoQ3l2ZzZPZml4MStBbDZxQjZmcHVlb3R4c2NrRmg1QTkyK1FieWRIdzR2eW1HSnhFRytyV2lSTDNnb0pXY1N3dndiUEVDTzViRGNNaVJHTm1jaFM0YTFJOWtQNjJEaE9NOXRQYWQ0bnBFaGFVZFRQT3NQSit1N2JKTjg1UHBhcUo2WW9UNnhLY1JJbDFwUWp3eEl1a3hYaHlJWTU3TjFTd2g3RHlBU2JybTM4TVNIZFJVU3RjKy80R2pPVVRWMzJhY2JobE5qTk82cFdSN0ZQVGs2eFgzbEdtSzB5czB6cmhuMFpod2g3d0szaWJuVnlnNndlM0xRYTdXRlF4eUdTcGlxUmJlL284alBYVGUrRUs0eERqRUNIT3hkWVJZYzgrK1VoeWZnWEhtYTV3L1o1bUorSDYzVDNDaE4zWTZPL2d1TWN4ajhOR2ljTERnWXlRM0NLY25zVWJNQnVvYTdqNDhaZ0QrZXJxZGN6cWJzWVRwdWxqM0xTdTJQT0JmQ1E1OHBuMEVIMU93b1RhZnd2WDErSlYyVm1JeEV3SGxKbEJzZGt3TEh5Mm1aamNnakk5a0o0WW5iaDYvWHU0bDA5WWZoUGpDc1NKZzdocEliYm5nLzkyTTVNam4wa1BjZGxKR0YvN0pRSkNTcnNnQXNlZUh6b3FMKzRiRm5TZTVFSkt6Z0hwZWFUc2czdjlyQ3J0WUZ6K2hTY1pkekFHWXM4SFg4NEg5Sm4wS0FZblFmeXVJUVQ0WTVtbzBha2lNaFFlRGg0NHRFZ3VYR2NFMGlQODQ1TXZ4eHpFalJzM1FaNVV4M2hDdG5VeGJxcTZQUi84Y1JkQWN1U3oxWWZ6R0VoTm0yQmREZmprdncwTGNUWUtva0NLK29hRkFvbElqaURGQllsMDIvb3VqRG1RQzFjK1p4ekMrQm9JcDJ0MzVIWEhQckRuQS9sSWN1UXo2U0tPT0FuV1Zxc1JiSHNjamlkRE5mMGdSV0Y3Q05YMk0xbDNWVE9RYm1wZDU1Z0RxVDAxeERoa21CVGlKTWhHc0IraXNkclBiR2U2d3JVMTVSakl6a1FFeUhCM0dxWWJZQ0FpU2VId0NNQm1JN21BWWl3dDZnclg3UVQ5aDVkSEhjUS9QL3NLbEVtN0dZZDM3bEhHR2FMdXQydGJpckQ1aVQ2VHJpQ3VLc1ZKc0xyQ3d5V3VpaDJZai91bk1DMlZGbGZzZ3I1aG9keHNaSElFWlZvVGtQNzg3QVB3N1RYSFp5L2FjLzI1ckozcFNwUDI0dFJyWm55ZVcwMTJiYnRaYlM5QWVmS1orYjZtTXRqSlM2VjZHUC96T1Izd0srcGtRbjdiekhiSkNDUkRzcUZsQnB6K2RqSENWN2Eyd01Vci94MHhpTSsrdWdwcnE0NWJuRmhiaGROb0YrTUtMT3QzMkM3NVN2cUliN3hVTzMvRmRyLzh1TXFETG1zcXdVM1ZpcEgyUXpBMmszaFRyMTFJQ25xWkhNbjdGK0hDRklmWlFRNUpmRFZVdlcxbXp2NzA4L1YzMTZGVi93RjRKZTloc2dTdjNHT01ZejcxSmc2YmtlelMwQ041TjFXTGhTT3Vzc1cyalJlc3Juek5aWFVGbTVQblcwbmwyQ2NpVkxRSGViSEJKaDlVMGcxUzNHWVFENGVRakgyUVdIMEMwdXR3MTVEWEFFSXliRDBueG9Vc1lQTVptejRONTlIWUUrSzBTenlDMk1vM2JJSHc0elRUK0t0MzNFU0FYL0ZaQ01Xb3ZVdE1JTXp2SFJGS0pBOUcrVkFHdko3SVBzS0dDM0hkRFlJNHFud3poSlFabVE1bDJBT0RjTVNXYjZtSjZmZ1duK0g0YnN4Yld6WDl0bXQybDlYbDdmelljcHdKR2hsNU1JNVhFU29MOGthR0tCOVhXd3c4eE9vWUlYQnJEM2h2T2duSzlCYkVZZHlwSHNjdFNCY0dZTGJKK0ZNdmJ1cHoyQWFuSjAxdUFQTFZKYWI4OEIwM0gxeGlkS0g4V0IwVENDcTFLTkVNNFlnUkRtN0ZSbHlzK204TDZHNmdKTG1Qa3B1cXhoSlUwc3Q4SkY4Rk1lVitkd1RpcEZMOXpEbEdld21CMXdZZHpKaC9xUmxjY250SERjcWV2QkN2Nk5CWjN4SXorQ0dQNXhZVEtJb01JTVp6bytVVElBSzNXUktnVUxVQitlZ2NyVHMvN0EwNlhwUTIwVGxhaStPNG1tMERLTHVTQWdQd2tXZ3FJY09ra0MrQk9CUmRWbGNDK2NpTDBrVU5HNGpvZGQzdm5LTTEzeUhBSy84VUJHNm5UQnJCT1VjL3BmREJSWko4OGNnOUR1UWJMMXJ6eGR3M3l4NjFleFBiT1Vhemk0UmQ4VnFZTWhCSXd5dW5GNXl6OVZNQ1VWNnZ4UStFQ0pjSDhzMDVTbE15NHQxNDV4aTFqQWtqZkl1N0dJRVN4ellQU2FjQzFHZmtnM2ZoR2JENmRkTWxWdnVDUXovMG9IQWZLY2xTbWlBQUswSk43NXpkQy9PeTlKTUthbkt5VHhCdk9HQUpKRWJkNGZBdlZyeG85VXVreE1mWndidTRod1dpS0RMQ1hDU2ZUTkFVVGJhOUNzNXgxU0Q0T0J3SW00cWpOUU9rS0UxdUJIK2FRa3NzVlptYnFaOFVDTEF2eVM1Qm5MRGYyaHZhRTZQK01aUWZwWW5nc3VCZDJBMStXN0VxQlVaNE1VTS9LWEF2TWpHYkh2bTIzZ0NYYUkxeVREOVBvN0tleldCSkI4RVhwMEFDRDBzK0o2Tm5Ra0d6SkdkUGxGREhCZEkrNXQvWitkR2FRQzRiSHB2T2dnK3V6bkpjSUdlcmVpWVV5a0lqcytXVzIybXJCaTlXTGJxbkp4OXdsdWdrSWxIaWZ2QkdjZ0xOS0xQUTRFU0ErcEN6STRqZnd5MkFqZmY4Q0FkdVd6eTRyTGpubldFR3FGZG1wZmRNQ0tnYVpFT1pjNXFyeGczbldNMjhjWG1vaGhldFBjcXFzbjR2ZUcwMk1jekRtV1ZtV3MrNHdqbXIxOFl2V0ZmTEJWSTNiazhIdWJ4WjVzcFZSWkhUeVF6SnNTb3ZvUEh4aEFLclFkeUtyRk5jRUQvd284cG5qdXZ6V3JnSGF5SnlJWTViejJJVHcxeWNKcDlQN1I0WDhMRENISy9MMmwwc0VINjB0bXJjSHp6alJldDR0TTloVmNrK3hRektOeG5HTFJEcU8rS1VaWjdncW5IZFpZMW14b1E4UVVmamxZd0kxdGFDQnk1WUJLcktjeW5kOXdUcU53dWZFZmhycXExN0tvMTZ3aDRGcFBGSzQ1WnRLRE5PZ25zaFpqRGZBSDlNN3I0bnlQT05qRXVhL2haWGphdjhOelRUSnZUaFRGNlVwcEp0RitKcXdBMk5FMTVVNmVGWmRHZ3NtSnZSeXppVWVCWElYN1BUMmh1YXpSUCtsS2tnYXZzemVNMThqVzBvVmNmQnJZQ3FZb1JuTjNhUEdsdzFpTU0xN2FpMUd0cXZuZC9RL0g1U252dkY3ZjEybGprY3owcHNVbVdCcFNvejBMblJnS3BCdWdxNkw4Q3V4U2tRZGU2a1BjQXNXcU43QW8xK3l6YVVhY2RBc2NrSTBqd0RQSlBVNVRCbWJPeGkvVVc2NHBRT3JqYys1LzFWL2R0SmZSSWJydzBLV0ZWV1YrSHc2R05EWkU2YUhwN2UwT1VRNXFUcm1ZNDhydy80c1JXVzNvalNwazM2SStXem83WS83aHlsK1pKdFhWSTdXSis0NWhyZ2FjejI5QTMyUVRJU3JDRHBpSkxidVdwOE9pdWg4akdZaW9mOGVUSHFERXRWS2tDR21aVlpxekk5c2NzdVNJWmtaWFRmS25ZSHQ4Tk5tTEszRmFReHBiOUdKejVqVmNITWNsV2hyRCtWZUhmUXNKTGtXcW9oVEdybHFuRlo5THJ1a1NsOTdZSVhwVTVrVmNITVN2REtUcHBuaE5tWThXa0pYWGNGblNNWlNZNmUzY08xcnVLeFUvNytDR1VTbmJuQ3RpNGJXakhiT0F2bEdPQXBkUHJKOWJlRGp0RTVraEZzYU9hcThkSHpNYVcvdkMvZTZLR01XbTRmbFlNa3U0Y05uVm1wUGVqOHVkdEExYUJ6cmxsNDdSR2pzL2FHK3ZYNzV0VWt5aWhsMWxLVlpuREZySXV5KzJBYU92OUV2QVgwblk3Uk9aZUVKcTRhRitnM3pQdnFIU3Rlak9Zdmx2R3VBMUZtTnh0Q00xUDE4QWNNZ2pBTHY5TXhZV2FYOVdjQmt0V3V1dTllRnFQTTRtYnZBemJFRWc1aDl0SHBMSU90UCtnN0hlTW5OSExWZUcvSmt2RjdZV3hjMzNqRHFxeTBaaG9FS292ek0xUDBEUFNkanRGdkc1WlZYTFAwdm4xOXozS3JWVHZJSEYzZllISGVDdnJ1SE4vQWJkTk4zUE82OSsxN2lMZ3pqclJ1eDhFbC9Td0lNZzBNOVAzSEc5SHFzUHYraFVyckpYRXZjemorQUFiUngrQWNYODhGMHYxQXZCbktBbmxURzhSbG41LzZMdUxIVzUvem9yVCtEMHdnMXFxOHk1eGZ1ODhDU3lDbkg1aDNkVy9aR1h2ZTh1T01aUldQMG5vOGNJRlk3K1lmc3dVUnJUMzZRTDA5ZmZzTXBwSFllZ1cvUDdDQldIdmxNT0dCZTUvOWp0ZGpZN1I4d2tUYitSOW1lWkE2bjJvSldBQUFBQUJKUlU1RXJrSmdnZz09IjsKICB9IGVsc2UgewogICAgTC5JY29uLkRlZmF1bHQucHJvdG90eXBlLm9wdGlvbnMuaWNvblVybCA9ICJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJrQUFBQXBDQVlBQUFEQWs0TE9BQUFHbWtsRVFWUll3N1ZYZVV5VFp4anZObmZFTEZ1eUl6T2FiZXJtTVpFZVFDL09jbGtPNDlDcE9IWE9MSmwvQ0FVUnVZYlFpM0tMZ0VoYnJoWjFhRHdtYW9HcUtJSTZvZEFUbUgvc2NERmJkQzdMdkZxT0NjK2U5NXMyVkc1MFgvTExtL2Y0L1o3bmVZL25lMThhQU5DbUFyNUUveFpmMXVET2tUY0djV1I2aGw5MjQ3dFQ1VTdZNlNOdldzS1Q2M1A1OHFiZmVMSkc4TTVxY2dUa25ydnZyZERic1Q3TWwrdHY4Mlg2dlZ4SkUzM2FSbWdTeVl0Y1dWTXFYOTdZdjJKdlczOVVoUkUySHV5QkwrdCtnSzExMTZseTA2RWVXRk5sQW1IeGxRRTBPTWlWNm1RQ1NjdXNLUmxoUzNRTGVWSmRsMSsyM2g1ZFk0Rk5CM3RocmJZYm9xcHRFRmxwaFRDMWhTcEpuYlJ2eFA0Tldnc0U1Snl6ODZRTk5pLzVxU1VUR3VGazFndTU0dE45d3VLMndjM28rV2MxM1JDbXNvQndFcXpHY1pzeHN2Q1N5Lzl3SktmN1VXZjFtRVk4SldmZXdjNjdVVW9EYkRqUUMrRnFLNFFxTFZNR0dSOWQyd3VyS3pxQmszbnFJVC85ekx4UlJqZ1o5YnFRZ3ViK0Rkb2VDQzAzUThqKzBRaEZoQkhSL2VQM1UvekNsbjdVdStoaWhKMStiQk5mZkxJdm1reVAwZ3BCWldZWGhLdXNzSzZtQno1SFQ2TTFOcXBjcCttQkNQWG9zWVFmcmVrR3ZyamV3ZDU5L0d2S0NFN1RiSy8wNC9aVjVRWllWV21Ed0gxbUYzeGEyUTNyYTNEQkM1dkJUMW9QN1BUajRDMCtDY0w4YzdDMkN0ZWpxaHVDbnVJUUhhS0h6dmNSZlpwbnlsRmZYc1lKeDNwTkx3aEt6UkF3QWhFcUcwU3B1c0JIZkFLa3h3M3c0NjI3TVBob0NINzk4ejdzMFpuQkovTUVKYlpTYlhQaEVSMmloN3Ayb2svelNqMmNFSkRkNENBZSs1V1luQkNnUjJ1cnV5RXc2elJvVzYvRFdKL09lQVA4cGQvQkd0ek9aS3BHOG9rZTBTWDZHTW1SazZHRmx5QWM1OUszMk9URWluSUxSSlJjaGFoOEhRd05EOE40MzVaOVowRlkxRXF0eFVnKzBTTzZSSi9tbVh6NFZ1UytEcHhYQzNnWG1ad0lMN2RCU0g0ektFNTB3RVNmOHF3VmdyUDFFSWxUTzVKUDlJZ3UwYWV4ZGgyOEYxbG1BRUdKR2ZoN2pFNkVseU01UncvRkRjWUpqV2hiZWlCWW9ZTklwYzJGVC9TSUxpdnAwRjFpcERXazRCSUVvMlZ1b2RFSlVpZmhiaWx0bk5CSVhQVUZDTXB0aHRBeXF3cy9CUGxFRi9WYmFJeEVyZHhQcGhzVTdyY0NwOERvaEMrR3ZCSVBKUy90VzJqdHZUbW1BZXVOTzhCTk9ZUWVHOEcvMk96Q0ozcStzb1lCNWk2TmhNYUtyMTdGU2FsN0dJSGhldVYzdVNDWThxWVZ1RW0xY096cWRXcjdrdS9SMEJEb1RUK0RUK29oQ002L0NDdktMS080UkkrZFhQZUF1YU1xa3NhS3JaN0wzRkU1RklGYmtJY2VlT1oyT2NITzZ3SWhUa05vMGZmZ2pSR3hFcW9nWEhZVVBIZldBQy9sQURwd0djTFJZM2FlSzQvb1JHQ0tZY1pYUFZvZVgva2VsVllZOGRVR2Y4VjVFQlJiZ0pYVDVRSVBoUDllUEppNDI4SktPaUVZaFlYRkJxb3UyR3VoK3AvbUVCMS9SZk13NnJZN2N4Y2pUcm5lSTFGckR5dXpVU1JtOW1pd0VKeDhFL2dVbXFseXZIR2tuZWl3RXJSMjFGM3ROT0s1VGYweVhhVCtPN0RnQ3ZBTFRVQlhkTTRZaEMvSWF3UFUrMlBkdXFNdnVhUjZlb3hTd1VrNzVnZ3FzWUo3Vmljc253R0lrWkJTWEtPVXd3NzNXR1h5cVArSjIvYjljK2dpMVlBZy94cHdjazNnSnV1Y05yaDVKdkRQdlFyMFdGWGYwcGl5dDhmOC9XSTBoVjRwUnh4a1FaZEpEZkRKTk9BbU0wQWc4anlUNmh6MFdHWFd1UDk0WWgyamNmam1YQUd2SENNc2xSaW1ESFl1SHVEc3kyUXRIdUlhdnpuaGJZVVJxNVI1N0twekJCUlpLUEppOGVRZzQ4aDRqOFNEZG93aWZkSXJFVmRVK2diTzZRTnZSUnQ0WkJ0aFVhWmhVbmpsWU9iTmFnVjNrZW9lcnUzclU3cmN1Y2VxVTFtSkJ4eStCV1pZbE5FQkgrMGVINHZSaUIrT1l5YlUyaG5ibFlsVHZrSGluTTRtNTRZbnhTeWFaWVNGNlIzandnUDd1ZEtMR0lYNnIvbGJOYTlONnk1TUZ5bmpXRHRySGQ3NVp2VFlBUE8vNlJnRjBrNzZtUWxhM0ZHcTdkTytjSDhzS24wVm83bkRsbHdBaHF3TFBreHJId1dtSEpPbytBS0o0cmFiNU9nck03clZ1OGVXYjJQdTBEaDRlRGdYb09mdnA3WTdRZXFrblJtdmNUQkV5cTltL0hRUVNDU3o2TEhxM3oweXpzTnlTUmZNUzI1M3dsMkt5UkRiY1pQY2ZKS2pabVNFT2pjeHlpK1k4ZFVPdHNJRUg2UjJ3TnlrZHFya1lKMFJWOTJIMFc1OHBrZlFrN2NLZXZzTEsxMFB5OFNkTUdmWE5YQVRZK3BQYnlKUi9FVDZuOW5JZnp0TnRaWVJWOVhuaVF1OUlBMnZPVmd5NGlyN0dDTFZtbWQremprSDBlQUY5UG82SzYxcG1DWEh4VTVySE1ZZDFmdGMzb3dqd1JTVlJ6TGpLdnFaRXR5NmNSVUQ3akdxaU9kdTVIRzZNZEhqTmNOWUdxZkRtNVlSekxCQkNDRGwvMmJrOGE4Z2RicWNmd0VDdTYyRmcvSHJnZ0FBQUFCSlJVNUVya0pnZ2c9PSI7CiAgfQogICovCgp9CgoKfSx7Ii4vZ2xvYmFsL2xlYWZsZXQiOjEwfV0sNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CiJ1c2Ugc3RyaWN0IjsKCnZhciBfbGVhZmxldCA9IHJlcXVpcmUoIi4vZ2xvYmFsL2xlYWZsZXQiKTsKCnZhciBfbGVhZmxldDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9sZWFmbGV0KTsKCmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICJkZWZhdWx0Ijogb2JqIH07IH0KCi8vIGFkZCB0ZXh4dHNpemUsIHRleHRPbmx5LCBhbmQgc3R5bGUKX2xlYWZsZXQyWyJkZWZhdWx0Il0uVG9vbHRpcC5wcm90b3R5cGUub3B0aW9ucy50ZXh0c2l6ZSA9ICIxMHB4IjsKX2xlYWZsZXQyWyJkZWZhdWx0Il0uVG9vbHRpcC5wcm90b3R5cGUub3B0aW9ucy50ZXh0T25seSA9IGZhbHNlOwpfbGVhZmxldDJbImRlZmF1bHQiXS5Ub29sdGlwLnByb3RvdHlwZS5vcHRpb25zLnN0eWxlID0gbnVsbDsgLy8gY29weSBvcmlnaW5hbCBsYXlvdXQgdG8gbm90IGNvbXBsZXRlbHkgc3RvbXAgaXQuCgp2YXIgaW5pdExheW91dE9yaWdpbmFsID0gX2xlYWZsZXQyWyJkZWZhdWx0Il0uVG9vbHRpcC5wcm90b3R5cGUuX2luaXRMYXlvdXQ7CgpfbGVhZmxldDJbImRlZmF1bHQiXS5Ub29sdGlwLnByb3RvdHlwZS5faW5pdExheW91dCA9IGZ1bmN0aW9uICgpIHsKICBpbml0TGF5b3V0T3JpZ2luYWwuY2FsbCh0aGlzKTsKICB0aGlzLl9jb250YWluZXIuc3R5bGUuZm9udFNpemUgPSB0aGlzLm9wdGlvbnMudGV4dHNpemU7CgogIGlmICh0aGlzLm9wdGlvbnMudGV4dE9ubHkpIHsKICAgIF9sZWFmbGV0MlsiZGVmYXVsdCJdLkRvbVV0aWwuYWRkQ2xhc3ModGhpcy5fY29udGFpbmVyLCAibGVhZmxldC10b29sdGlwLXRleHQtb25seSIpOwogIH0KCiAgaWYgKHRoaXMub3B0aW9ucy5zdHlsZSkgewogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcy5vcHRpb25zLnN0eWxlKSB7CiAgICAgIHRoaXMuX2NvbnRhaW5lci5zdHlsZVtwcm9wZXJ0eV0gPSB0aGlzLm9wdGlvbnMuc3R5bGVbcHJvcGVydHldOwogICAgfQogIH0KfTsKCgp9LHsiLi9nbG9iYWwvbGVhZmxldCI6MTB9XSw3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKInVzZSBzdHJpY3QiOwoKdmFyIF9sZWFmbGV0ID0gcmVxdWlyZSgiLi9nbG9iYWwvbGVhZmxldCIpOwoKdmFyIF9sZWFmbGV0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2xlYWZsZXQpOwoKZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgImRlZmF1bHQiOiBvYmogfTsgfQoKdmFyIHByb3RvY29sUmVnZXggPSAvXlwvXC8vOwoKdmFyIHVwZ3JhZGVfcHJvdG9jb2wgPSBmdW5jdGlvbiB1cGdyYWRlX3Byb3RvY29sKHVybFRlbXBsYXRlKSB7CiAgaWYgKHByb3RvY29sUmVnZXgudGVzdCh1cmxUZW1wbGF0ZSkpIHsKICAgIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09ICJmaWxlOiIpIHsKICAgICAgLy8gaWYgaW4gYSBsb2NhbCBmaWxlLCBzdXBwb3J0IGh0dHAKICAgICAgLy8gaHR0cCBzaG91bGQgYXV0byB1cGdyYWRlIGlmIG5lY2Vzc2FyeQogICAgICB1cmxUZW1wbGF0ZSA9ICJodHRwOiIgKyB1cmxUZW1wbGF0ZTsKICAgIH0KICB9CgogIHJldHVybiB1cmxUZW1wbGF0ZTsKfTsKCnZhciBvcmlnaW5hbExUaWxlTGF5ZXJJbml0aWFsaXplID0gX2xlYWZsZXQyWyJkZWZhdWx0Il0uVGlsZUxheWVyLnByb3RvdHlwZS5pbml0aWFsaXplOwoKX2xlYWZsZXQyWyJkZWZhdWx0Il0uVGlsZUxheWVyLnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24gKHVybFRlbXBsYXRlLCBvcHRpb25zKSB7CiAgdXJsVGVtcGxhdGUgPSB1cGdyYWRlX3Byb3RvY29sKHVybFRlbXBsYXRlKTsKICBvcmlnaW5hbExUaWxlTGF5ZXJJbml0aWFsaXplLmNhbGwodGhpcywgdXJsVGVtcGxhdGUsIG9wdGlvbnMpOwp9OwoKdmFyIG9yaWdpbmFsTFRpbGVMYXllcldNU0luaXRpYWxpemUgPSBfbGVhZmxldDJbImRlZmF1bHQiXS5UaWxlTGF5ZXIuV01TLnByb3RvdHlwZS5pbml0aWFsaXplOwoKX2xlYWZsZXQyWyJkZWZhdWx0Il0uVGlsZUxheWVyLldNUy5wcm90b3R5cGUuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uICh1cmxUZW1wbGF0ZSwgb3B0aW9ucykgewogIHVybFRlbXBsYXRlID0gdXBncmFkZV9wcm90b2NvbCh1cmxUZW1wbGF0ZSk7CiAgb3JpZ2luYWxMVGlsZUxheWVyV01TSW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHVybFRlbXBsYXRlLCBvcHRpb25zKTsKfTsKCgp9LHsiLi9nbG9iYWwvbGVhZmxldCI6MTB9XSw4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKGZ1bmN0aW9uIChnbG9iYWwpewoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgdmFsdWU6IHRydWUKfSk7CmV4cG9ydHNbImRlZmF1bHQiXSA9IGdsb2JhbC5IVE1MV2lkZ2V0czsKCgp9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB7fSkKfSx7fV0sOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CihmdW5jdGlvbiAoZ2xvYmFsKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwpleHBvcnRzWyJkZWZhdWx0Il0gPSBnbG9iYWwualF1ZXJ5OwoKCn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSAidW5kZWZpbmVkIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHt9KQp9LHt9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CihmdW5jdGlvbiAoZ2xvYmFsKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwpleHBvcnRzWyJkZWZhdWx0Il0gPSBnbG9iYWwuTDsKCgp9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB7fSkKfSx7fV0sMTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewooZnVuY3Rpb24gKGdsb2JhbCl7CiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICB2YWx1ZTogdHJ1ZQp9KTsKZXhwb3J0c1siZGVmYXVsdCJdID0gZ2xvYmFsLkwuUHJvajsKCgp9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB7fSkKfSx7fV0sMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewooZnVuY3Rpb24gKGdsb2JhbCl7CiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICB2YWx1ZTogdHJ1ZQp9KTsKZXhwb3J0c1siZGVmYXVsdCJdID0gZ2xvYmFsLlNoaW55OwoKCn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSAidW5kZWZpbmVkIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IHt9KQp9LHt9XSwxMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CiJ1c2Ugc3RyaWN0IjsKCnZhciBfanF1ZXJ5ID0gcmVxdWlyZSgiLi9nbG9iYWwvanF1ZXJ5Iik7Cgp2YXIgX2pxdWVyeTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9qcXVlcnkpOwoKdmFyIF9sZWFmbGV0ID0gcmVxdWlyZSgiLi9nbG9iYWwvbGVhZmxldCIpOwoKdmFyIF9sZWFmbGV0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2xlYWZsZXQpOwoKdmFyIF9zaGlueSA9IHJlcXVpcmUoIi4vZ2xvYmFsL3NoaW55Iik7Cgp2YXIgX3NoaW55MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NoaW55KTsKCnZhciBfaHRtbHdpZGdldHMgPSByZXF1aXJlKCIuL2dsb2JhbC9odG1sd2lkZ2V0cyIpOwoKdmFyIF9odG1sd2lkZ2V0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9odG1sd2lkZ2V0cyk7Cgp2YXIgX3V0aWwgPSByZXF1aXJlKCIuL3V0aWwiKTsKCnZhciBfY3JzX3V0aWxzID0gcmVxdWlyZSgiLi9jcnNfdXRpbHMiKTsKCnZhciBfY29udHJvbFN0b3JlID0gcmVxdWlyZSgiLi9jb250cm9sLXN0b3JlIik7Cgp2YXIgX2NvbnRyb2xTdG9yZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb250cm9sU3RvcmUpOwoKdmFyIF9sYXllck1hbmFnZXIgPSByZXF1aXJlKCIuL2xheWVyLW1hbmFnZXIiKTsKCnZhciBfbGF5ZXJNYW5hZ2VyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2xheWVyTWFuYWdlcik7Cgp2YXIgX21ldGhvZHMgPSByZXF1aXJlKCIuL21ldGhvZHMiKTsKCnZhciBfbWV0aG9kczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9tZXRob2RzKTsKCnJlcXVpcmUoIi4vZml4dXAtZGVmYXVsdC1pY29uIik7CgpyZXF1aXJlKCIuL2ZpeHVwLWRlZmF1bHQtdG9vbHRpcCIpOwoKcmVxdWlyZSgiLi9maXh1cC11cmwtcHJvdG9jb2wiKTsKCnZhciBfZGF0YWZyYW1lID0gcmVxdWlyZSgiLi9kYXRhZnJhbWUiKTsKCnZhciBfZGF0YWZyYW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RhdGFmcmFtZSk7Cgp2YXIgX2NsdXN0ZXJMYXllclN0b3JlID0gcmVxdWlyZSgiLi9jbHVzdGVyLWxheWVyLXN0b3JlIik7Cgp2YXIgX2NsdXN0ZXJMYXllclN0b3JlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsdXN0ZXJMYXllclN0b3JlKTsKCmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICJkZWZhdWx0Ijogb2JqIH07IH0KCndpbmRvdy5MZWFmbGV0V2lkZ2V0ID0ge307CndpbmRvdy5MZWFmbGV0V2lkZ2V0LnV0aWxzID0ge307Cgp2YXIgbWV0aG9kcyA9IHdpbmRvdy5MZWFmbGV0V2lkZ2V0Lm1ldGhvZHMgPSBfanF1ZXJ5MlsiZGVmYXVsdCJdLmV4dGVuZCh7fSwgX21ldGhvZHMyWyJkZWZhdWx0Il0pOwoKd2luZG93LkxlYWZsZXRXaWRnZXQuRGF0YUZyYW1lID0gX2RhdGFmcmFtZTJbImRlZmF1bHQiXTsKd2luZG93LkxlYWZsZXRXaWRnZXQuQ2x1c3RlckxheWVyU3RvcmUgPSBfY2x1c3RlckxheWVyU3RvcmUyWyJkZWZhdWx0Il07CndpbmRvdy5MZWFmbGV0V2lkZ2V0LnV0aWxzLmdldENSUyA9IF9jcnNfdXRpbHMuZ2V0Q1JTOyAvLyBTZW5kIHVwZGF0ZWQgYm91bmRzIGJhY2sgdG8gYXBwLiBUYWtlcyBhIGxlYWZsZXQgZXZlbnQgb2JqZWN0IGFzIGlucHV0LgoKZnVuY3Rpb24gdXBkYXRlQm91bmRzKG1hcCkgewogIHZhciBpZCA9IG1hcC5nZXRDb250YWluZXIoKS5pZDsKICB2YXIgYm91bmRzID0gbWFwLmdldEJvdW5kcygpOwoKICBfc2hpbnkyWyJkZWZhdWx0Il0ub25JbnB1dENoYW5nZShpZCArICJfYm91bmRzIiwgewogICAgbm9ydGg6IGJvdW5kcy5nZXROb3J0aEVhc3QoKS5sYXQsCiAgICBlYXN0OiBib3VuZHMuZ2V0Tm9ydGhFYXN0KCkubG5nLAogICAgc291dGg6IGJvdW5kcy5nZXRTb3V0aFdlc3QoKS5sYXQsCiAgICB3ZXN0OiBib3VuZHMuZ2V0U291dGhXZXN0KCkubG5nCiAgfSk7CgogIF9zaGlueTJbImRlZmF1bHQiXS5vbklucHV0Q2hhbmdlKGlkICsgIl9jZW50ZXIiLCB7CiAgICBsbmc6IG1hcC5nZXRDZW50ZXIoKS5sbmcsCiAgICBsYXQ6IG1hcC5nZXRDZW50ZXIoKS5sYXQKICB9KTsKCiAgX3NoaW55MlsiZGVmYXVsdCJdLm9uSW5wdXRDaGFuZ2UoaWQgKyAiX3pvb20iLCBtYXAuZ2V0Wm9vbSgpKTsKfQoKZnVuY3Rpb24gcHJldmVudFVuaW50ZW5kZWRab29tT25TY3JvbGwobWFwKSB7CiAgLy8gUHJldmVudCB1bndhbnRlZCBzY3JvbGwgY2FwdHVyaW5nLiBTaW1pbGFyIGluIHB1cnBvc2UgdG8KICAvLyBodHRwczovL2dpdGh1Yi5jb20vQ2xpZmZDbG91ZC9MZWFmbGV0LlNsZWVwIGJ1dCB3aXRoIGEKICAvLyBkaWZmZXJlbnQgc2V0IG9mIGhldXJpc3RpY3MuCiAgLy8gVGhlIGJhc2ljIGlkZWEgaXMgdGhhdCB3aGVuIGEgbW91c2V3aGVlbC9ET01Nb3VzZVNjcm9sbAogIC8vIGV2ZW50IGlzIHNlZW4sIHdlIGRpc2FibGUgc2Nyb2xsIHdoZWVsIHpvb21pbmcgdW50aWwgdGhlCiAgLy8gdXNlciBtb3ZlcyB0aGVpciBtb3VzZSBjdXJzb3Igb3IgY2xpY2tzIG9uIHRoZSBtYXAuIFRoaXMKICAvLyBpcyBzbGlnaHRseSB0cmlja2llciB0aGFuIGp1c3QgbGlzdGVuaW5nIGZvciBtb3VzZW1vdmUsCiAgLy8gYmVjYXVzZSBtb3VzZW1vdmUgaXMgZmlyZWQgd2hlbiB0aGUgcGFnZSBpcyBzY3JvbGxlZCwKICAvLyBldmVuIGlmIHRoZSB1c2VyIGRpZCBub3QgcGh5c2ljYWxseSBtb3ZlIHRoZSBtb3VzZS4gV2UKICAvLyBoYW5kbGUgdGhpcyBieSBleGFtaW5pbmcgdGhlIG1vdXNlbW92ZSBldmVudCdzIHNjcmVlblgKICAvLyBhbmQgc2NyZWVuWSBwcm9wZXJ0aWVzOyBpZiB0aGV5IGNoYW5nZSwgd2Uga25vdyBpdCdzIGEKICAvLyAidHJ1ZSIgbW92ZS4KICAvLyBsYXN0U2NyZWVuIGNhbiBuZXZlciBiZSBudWxsLCBidXQgaXRzIHggYW5kIHkgY2FuLgogIHZhciBsYXN0U2NyZWVuID0gewogICAgeDogbnVsbCwKICAgIHk6IG51bGwKICB9OwogICgwLCBfanF1ZXJ5MlsiZGVmYXVsdCJdKShkb2N1bWVudCkub24oIm1vdXNld2hlZWwgRE9NTW91c2VTY3JvbGwiLCAiKiIsIGZ1bmN0aW9uIChlKSB7CiAgICAvLyBEaXNhYmxlIHpvb21pbmcgKHVudGlsIHRoZSBtb3VzZSBtb3ZlcyBvciBjbGljaykKICAgIG1hcC5zY3JvbGxXaGVlbFpvb20uZGlzYWJsZSgpOyAvLyBBbnkgbW91c2Vtb3ZlIGV2ZW50cyBhdCB0aGlzIHNjcmVlbiBwb3NpdGlvbiB3aWxsIGJlIGlnbm9yZWQuCgogICAgbGFzdFNjcmVlbiA9IHsKICAgICAgeDogZS5vcmlnaW5hbEV2ZW50LnNjcmVlblgsCiAgICAgIHk6IGUub3JpZ2luYWxFdmVudC5zY3JlZW5ZCiAgICB9OwogIH0pOwogICgwLCBfanF1ZXJ5MlsiZGVmYXVsdCJdKShkb2N1bWVudCkub24oIm1vdXNlbW92ZSIsICIqIiwgZnVuY3Rpb24gKGUpIHsKICAgIC8vIERpZCB0aGUgbW91c2UgcmVhbGx5IG1vdmU/CiAgICBpZiAobGFzdFNjcmVlbi54ICE9PSBudWxsICYmIGUuc2NyZWVuWCAhPT0gbGFzdFNjcmVlbi54IHx8IGUuc2NyZWVuWSAhPT0gbGFzdFNjcmVlbi55KSB7CiAgICAgIC8vIEl0IHJlYWxseSBtb3ZlZC4gRW5hYmxlIHpvb21pbmcuCiAgICAgIG1hcC5zY3JvbGxXaGVlbFpvb20uZW5hYmxlKCk7CiAgICAgIGxhc3RTY3JlZW4gPSB7CiAgICAgICAgeDogbnVsbCwKICAgICAgICB5OiBudWxsCiAgICAgIH07CiAgICB9CiAgfSk7CiAgKDAsIF9qcXVlcnkyWyJkZWZhdWx0Il0pKGRvY3VtZW50KS5vbigibW91c2Vkb3duIiwgIi5sZWFmbGV0IiwgZnVuY3Rpb24gKGUpIHsKICAgIC8vIENsaWNraW5nIGFsd2F5cyBlbmFibGVzIHpvb21pbmcuCiAgICBtYXAuc2Nyb2xsV2hlZWxab29tLmVuYWJsZSgpOwogICAgbGFzdFNjcmVlbiA9IHsKICAgICAgeDogbnVsbCwKICAgICAgeTogbnVsbAogICAgfTsKICB9KTsKfQoKX2h0bWx3aWRnZXRzMlsiZGVmYXVsdCJdLndpZGdldCh7CiAgbmFtZTogImxlYWZsZXQiLAogIHR5cGU6ICJvdXRwdXQiLAogIGZhY3Rvcnk6IGZ1bmN0aW9uIGZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgIHZhciBtYXAgPSBudWxsOwogICAgcmV0dXJuIHsKICAgICAgLy8gd2UgbmVlZCB0byBzdG9yZSBvdXIgbWFwIGluIG91ciByZXR1cm5lZCBvYmplY3QuCiAgICAgIGdldE1hcDogZnVuY3Rpb24gZ2V0TWFwKCkgewogICAgICAgIHJldHVybiBtYXA7CiAgICAgIH0sCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbiByZW5kZXJWYWx1ZShkYXRhKSB7CiAgICAgICAgLy8gQ3JlYXRlIGFuIGFwcHJvcHJpYXRlIENSUyBPYmplY3QgaWYgc3BlY2lmaWVkCiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5vcHRpb25zICYmIGRhdGEub3B0aW9ucy5jcnMpIHsKICAgICAgICAgIGRhdGEub3B0aW9ucy5jcnMgPSAoMCwgX2Nyc191dGlscy5nZXRDUlMpKGRhdGEub3B0aW9ucy5jcnMpOwogICAgICAgIH0gLy8gQXMgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9yc3R1ZGlvL2xlYWZsZXQvcHVsbC8yOTQjZGlzY3Vzc2lvbl9yNzk1ODQ4MTAKCgogICAgICAgIGlmIChtYXApIHsKICAgICAgICAgIG1hcC5yZW1vdmUoKTsKCiAgICAgICAgICBtYXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0oKTsgLy8gdW5kZWZpbmUgbWFwCgogICAgICAgIH0KCiAgICAgICAgaWYgKGRhdGEub3B0aW9ucy5tYXBGYWN0b3J5ICYmIHR5cGVvZiBkYXRhLm9wdGlvbnMubWFwRmFjdG9yeSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgbWFwID0gZGF0YS5vcHRpb25zLm1hcEZhY3RvcnkoZWwsIGRhdGEub3B0aW9ucyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1hcCA9IF9sZWFmbGV0MlsiZGVmYXVsdCJdLm1hcChlbCwgZGF0YS5vcHRpb25zKTsKICAgICAgICB9CgogICAgICAgIHByZXZlbnRVbmludGVuZGVkWm9vbU9uU2Nyb2xsKG1hcCk7IC8vIFN0b3JlIHNvbWUgc3RhdGUgaW4gdGhlIG1hcCBvYmplY3QKCiAgICAgICAgbWFwLmxlYWZsZXRyID0gewogICAgICAgICAgLy8gSGFzIHRoZSBtYXAgZXZlciByZW5kZXJlZCBzdWNjZXNzZnVsbHk/CiAgICAgICAgICBoYXNSZW5kZXJlZDogZmFsc2UsCiAgICAgICAgICAvLyBEYXRhIHRvIGJlIHJlbmRlcmVkIHdoZW4gcmVzaXplIGlzIGNhbGxlZCB3aXRoIGFyZWEgIT0gMAogICAgICAgICAgcGVuZGluZ1JlbmRlckRhdGE6IG51bGwKICAgICAgICB9OyAvLyBDaGVjayBpZiB0aGUgbWFwIGlzIHJlbmRlcmVkIHN0YXRpY2FsbHkgKG5vIG91dHB1dCBiaW5kaW5nKQoKICAgICAgICBpZiAoX2h0bWx3aWRnZXRzMlsiZGVmYXVsdCJdLnNoaW55TW9kZSAmJiAvXGJzaGlueS1ib3VuZC1vdXRwdXRcYi8udGVzdChlbC5jbGFzc05hbWUpKSB7CiAgICAgICAgICBtYXAuaWQgPSBlbC5pZDsgLy8gU3RvcmUgdGhlIG1hcCBvbiB0aGUgZWxlbWVudCBzbyB3ZSBjYW4gZmluZCBpdCBsYXRlciBieSBJRAoKICAgICAgICAgICgwLCBfanF1ZXJ5MlsiZGVmYXVsdCJdKShlbCkuZGF0YSgibGVhZmxldC1tYXAiLCBtYXApOyAvLyBXaGVuIHRoZSBtYXAgaXMgY2xpY2tlZCwgc2VuZCB0aGUgY29vcmRpbmF0ZXMgYmFjayB0byB0aGUgYXBwCgogICAgICAgICAgbWFwLm9uKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIF9zaGlueTJbImRlZmF1bHQiXS5vbklucHV0Q2hhbmdlKG1hcC5pZCArICJfY2xpY2siLCB7CiAgICAgICAgICAgICAgbGF0OiBlLmxhdGxuZy5sYXQsCiAgICAgICAgICAgICAgbG5nOiBlLmxhdGxuZy5sbmcsCiAgICAgICAgICAgICAgIi5ub25jZSI6IE1hdGgucmFuZG9tKCkgLy8gRm9yY2UgcmVhY3Rpdml0eSBpZiBsYXQvbG5nIGhhc24ndCBjaGFuZ2VkCgogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgICAgdmFyIGdyb3VwVGltZXJJZCA9IG51bGw7CiAgICAgICAgICBtYXAub24oIm1vdmVlbmQiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICB1cGRhdGVCb3VuZHMoZS50YXJnZXQpOwogICAgICAgICAgfSkub24oImxheWVyYWRkIGxheWVycmVtb3ZlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgLy8gSWYgdGhlIGxheWVyIHRoYXQncyBjb21pbmcgb3IgZ29pbmcgaXMgYSBncm91cCB3ZSBjcmVhdGVkLCB0ZWxsCiAgICAgICAgICAgIC8vIHRoZSBzZXJ2ZXIuCiAgICAgICAgICAgIGlmIChtYXAubGF5ZXJNYW5hZ2VyLmdldEdyb3VwTmFtZUZyb21MYXllckdyb3VwKGUubGF5ZXIpKSB7CiAgICAgICAgICAgICAgLy8gQnV0IHRvIGF2b2lkIGNoYXR0aW5lc3MsIGNvYWxlc2NlIGV2ZW50cwogICAgICAgICAgICAgIGlmIChncm91cFRpbWVySWQpIHsKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChncm91cFRpbWVySWQpOwogICAgICAgICAgICAgICAgZ3JvdXBUaW1lcklkID0gbnVsbDsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGdyb3VwVGltZXJJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgZ3JvdXBUaW1lcklkID0gbnVsbDsKCiAgICAgICAgICAgICAgICBfc2hpbnkyWyJkZWZhdWx0Il0ub25JbnB1dENoYW5nZShtYXAuaWQgKyAiX2dyb3VwcyIsIG1hcC5sYXllck1hbmFnZXIuZ2V0VmlzaWJsZUdyb3VwcygpKTsKICAgICAgICAgICAgICB9LCAxMDApOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHRoaXMuZG9SZW5kZXJWYWx1ZShkYXRhLCBtYXApOwogICAgICB9LAogICAgICBkb1JlbmRlclZhbHVlOiBmdW5jdGlvbiBkb1JlbmRlclZhbHVlKGRhdGEsIG1hcCkgewogICAgICAgIC8vIExlYWZsZXQgZG9lcyBub3QgYmVoYXZlIHdlbGwgd2hlbiB5b3Ugc2V0IHVwIGEgYnVuY2ggb2YgbGF5ZXJzIHdoZW4KICAgICAgICAvLyB0aGUgbWFwIGlzIG5vdCB2aXNpYmxlICh3aWR0aC9oZWlnaHQgPT0gMCkuIFBvcHVwcyBnZXQgbWlzYWxpZ25lZAogICAgICAgIC8vIHJlbGF0aXZlIHRvIHRoZWlyIG93bmluZyBtYXJrZXJzLCBhbmQgdGhlIGZpdEJvdW5kcyBjYWxjdWxhdGlvbnMKICAgICAgICAvLyBhcmUgb2ZmLiBUaGVyZWZvcmUgd2Ugd2FpdCB1bnRpbCB0aGUgbWFwIGlzIGFjdHVhbGx5IHNob3dpbmcgdG8KICAgICAgICAvLyByZW5kZXIgdGhlIHZhbHVlICh3ZSByZWx5IG9uIHRoZSByZXNpemUoKSBjYWxsYmFjayBiZWluZyBpbnZva2VkCiAgICAgICAgLy8gYXQgdGhlIGFwcHJvcHJpYXRlIHRpbWUpLgogICAgICAgIC8vCiAgICAgICAgLy8gVGhlcmUgbWF5IGJlIGFuIGlzc3VlIHdpdGggbGVhZmxldFByb3h5KCkgY2FsbHMgYmVpbmcgbWFkZSB3aGlsZQogICAgICAgIC8vIHRoZSBtYXAgaXMgbm90IGJlaW5nIHZpZXdlZC0tbm90IHN1cmUgd2hhdCB0aGUgcmlnaHQgc29sdXRpb24gaXMKICAgICAgICAvLyB0aGVyZS4KICAgICAgICBpZiAoZWwub2Zmc2V0V2lkdGggPT09IDAgfHwgZWwub2Zmc2V0SGVpZ2h0ID09PSAwKSB7CiAgICAgICAgICBtYXAubGVhZmxldHIucGVuZGluZ1JlbmRlckRhdGEgPSBkYXRhOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbWFwLmxlYWZsZXRyLnBlbmRpbmdSZW5kZXJEYXRhID0gbnVsbDsgLy8gTWVyZ2UgZGF0YSBvcHRpb25zIGludG8gZGVmYXVsdHMKCiAgICAgICAgdmFyIG9wdGlvbnMgPSBfanF1ZXJ5MlsiZGVmYXVsdCJdLmV4dGVuZCh7CiAgICAgICAgICB6b29tVG9MaW1pdHM6ICJhbHdheXMiCiAgICAgICAgfSwgZGF0YS5vcHRpb25zKTsKCiAgICAgICAgaWYgKCFtYXAubGF5ZXJNYW5hZ2VyKSB7CiAgICAgICAgICBtYXAuY29udHJvbHMgPSBuZXcgX2NvbnRyb2xTdG9yZTJbImRlZmF1bHQiXShtYXApOwogICAgICAgICAgbWFwLmxheWVyTWFuYWdlciA9IG5ldyBfbGF5ZXJNYW5hZ2VyMlsiZGVmYXVsdCJdKG1hcCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1hcC5jb250cm9scy5jbGVhcigpOwogICAgICAgICAgbWFwLmxheWVyTWFuYWdlci5jbGVhcigpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGV4cGxpY2l0VmlldyA9IGZhbHNlOwoKICAgICAgICBpZiAoZGF0YS5zZXRWaWV3KSB7CiAgICAgICAgICBleHBsaWNpdFZpZXcgPSB0cnVlOwogICAgICAgICAgbWFwLnNldFZpZXcuYXBwbHkobWFwLCBkYXRhLnNldFZpZXcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGRhdGEuZml0Qm91bmRzKSB7CiAgICAgICAgICBleHBsaWNpdFZpZXcgPSB0cnVlOwogICAgICAgICAgbWV0aG9kcy5maXRCb3VuZHMuYXBwbHkobWFwLCBkYXRhLmZpdEJvdW5kcyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoZGF0YS5mbHlUbykgewogICAgICAgICAgaWYgKCFleHBsaWNpdFZpZXcgJiYgIW1hcC5sZWFmbGV0ci5oYXNSZW5kZXJlZCkgewogICAgICAgICAgICAvLyBtdXN0IGJlIGRvbmUgdG8gZ2l2ZSBhIGluaXRpYWwgc3RhcnRpbmcgcG9pbnQKICAgICAgICAgICAgbWFwLmZpdFdvcmxkKCk7CiAgICAgICAgICB9CgogICAgICAgICAgZXhwbGljaXRWaWV3ID0gdHJ1ZTsKICAgICAgICAgIG1hcC5mbHlUby5hcHBseShtYXAsIGRhdGEuZmx5VG8pOwogICAgICAgIH0KCiAgICAgICAgaWYgKGRhdGEuZmx5VG9Cb3VuZHMpIHsKICAgICAgICAgIGlmICghZXhwbGljaXRWaWV3ICYmICFtYXAubGVhZmxldHIuaGFzUmVuZGVyZWQpIHsKICAgICAgICAgICAgLy8gbXVzdCBiZSBkb25lIHRvIGdpdmUgYSBpbml0aWFsIHN0YXJ0aW5nIHBvaW50CiAgICAgICAgICAgIG1hcC5maXRXb3JsZCgpOwogICAgICAgICAgfQoKICAgICAgICAgIGV4cGxpY2l0VmlldyA9IHRydWU7CiAgICAgICAgICBtZXRob2RzLmZseVRvQm91bmRzLmFwcGx5KG1hcCwgZGF0YS5mbHlUb0JvdW5kcyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoZGF0YS5vcHRpb25zLmNlbnRlcikgewogICAgICAgICAgZXhwbGljaXRWaWV3ID0gdHJ1ZTsKICAgICAgICB9IC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgem9vbVRvTGltaXRzIG9wdGlvbiBzYXlzIHRoYXQgdGhlIG1hcCBzaG91bGQgYmUKICAgICAgICAvLyB6b29tZWQgdG8gbWFwIGVsZW1lbnRzLgoKCiAgICAgICAgZnVuY3Rpb24gbmVlZHNab29tKCkgewogICAgICAgICAgcmV0dXJuIG9wdGlvbnMuem9vbVRvTGltaXRzID09PSAiYWx3YXlzIiB8fCBvcHRpb25zLnpvb21Ub0xpbWl0cyA9PT0gImZpcnN0IiAmJiAhbWFwLmxlYWZsZXRyLmhhc1JlbmRlcmVkOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFleHBsaWNpdFZpZXcgJiYgbmVlZHNab29tKCkgJiYgIW1hcC5nZXRab29tKCkpIHsKICAgICAgICAgIGlmIChkYXRhLmxpbWl0cyAmJiAhX2pxdWVyeTJbImRlZmF1bHQiXS5pc0VtcHR5T2JqZWN0KGRhdGEubGltaXRzKSkgewogICAgICAgICAgICAvLyBVc2UgdGhlIG5hdHVyYWwgbGltaXRzIG9mIHdoYXQncyBiZWluZyBkcmF3biBvbiB0aGUgbWFwCiAgICAgICAgICAgIC8vIElmIHRoZSBzaXplIG9mIHRoZSBib3VuZGluZyBib3ggaXMgMCwgbGVhZmxldCBnZXRzIGFsbCB3ZWlyZAogICAgICAgICAgICB2YXIgcGFkID0gMC4wMDY7CgogICAgICAgICAgICBpZiAoZGF0YS5saW1pdHMubGF0WzBdID09PSBkYXRhLmxpbWl0cy5sYXRbMV0pIHsKICAgICAgICAgICAgICBkYXRhLmxpbWl0cy5sYXRbMF0gPSBkYXRhLmxpbWl0cy5sYXRbMF0gLSBwYWQ7CiAgICAgICAgICAgICAgZGF0YS5saW1pdHMubGF0WzFdID0gZGF0YS5saW1pdHMubGF0WzFdICsgcGFkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZGF0YS5saW1pdHMubG5nWzBdID09PSBkYXRhLmxpbWl0cy5sbmdbMV0pIHsKICAgICAgICAgICAgICBkYXRhLmxpbWl0cy5sbmdbMF0gPSBkYXRhLmxpbWl0cy5sbmdbMF0gLSBwYWQ7CiAgICAgICAgICAgICAgZGF0YS5saW1pdHMubG5nWzFdID0gZGF0YS5saW1pdHMubG5nWzFdICsgcGFkOwogICAgICAgICAgICB9CgogICAgICAgICAgICBtYXAuZml0Qm91bmRzKFtbZGF0YS5saW1pdHMubGF0WzBdLCBkYXRhLmxpbWl0cy5sbmdbMF1dLCBbZGF0YS5saW1pdHMubGF0WzFdLCBkYXRhLmxpbWl0cy5sbmdbMV1dXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtYXAuZml0V29ybGQoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBkYXRhLmNhbGxzICYmIGkgPCBkYXRhLmNhbGxzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgY2FsbCA9IGRhdGEuY2FsbHNbaV07CiAgICAgICAgICBpZiAobWV0aG9kc1tjYWxsLm1ldGhvZF0pIG1ldGhvZHNbY2FsbC5tZXRob2RdLmFwcGx5KG1hcCwgY2FsbC5hcmdzKTtlbHNlICgwLCBfdXRpbC5sb2cpKCJVbmtub3duIG1ldGhvZCAiICsgY2FsbC5tZXRob2QpOwogICAgICAgIH0KCiAgICAgICAgbWFwLmxlYWZsZXRyLmhhc1JlbmRlcmVkID0gdHJ1ZTsKCiAgICAgICAgaWYgKF9odG1sd2lkZ2V0czJbImRlZmF1bHQiXS5zaGlueU1vZGUpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB1cGRhdGVCb3VuZHMobWFwKTsKICAgICAgICAgIH0sIDEpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcmVzaXplOiBmdW5jdGlvbiByZXNpemUod2lkdGgsIGhlaWdodCkgewogICAgICAgIGlmIChtYXApIHsKICAgICAgICAgIG1hcC5pbnZhbGlkYXRlU2l6ZSgpOwoKICAgICAgICAgIGlmIChtYXAubGVhZmxldHIucGVuZGluZ1JlbmRlckRhdGEpIHsKICAgICAgICAgICAgdGhpcy5kb1JlbmRlclZhbHVlKG1hcC5sZWFmbGV0ci5wZW5kaW5nUmVuZGVyRGF0YSwgbWFwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQp9KTsKCmlmIChfaHRtbHdpZGdldHMyWyJkZWZhdWx0Il0uc2hpbnlNb2RlKSB7CiAgX3NoaW55MlsiZGVmYXVsdCJdLmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCJsZWFmbGV0LWNhbGxzIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgIHZhciBpZCA9IGRhdGEuaWQ7CiAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7CiAgICB2YXIgbWFwID0gZWwgPyAoMCwgX2pxdWVyeTJbImRlZmF1bHQiXSkoZWwpLmRhdGEoImxlYWZsZXQtbWFwIikgOiBudWxsOwoKICAgIGlmICghbWFwKSB7CiAgICAgICgwLCBfdXRpbC5sb2cpKCJDb3VsZG4ndCBmaW5kIG1hcCB3aXRoIGlkICIgKyBpZCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuY2FsbHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGNhbGwgPSBkYXRhLmNhbGxzW2ldOwoKICAgICAgaWYgKGNhbGwuZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgX3NoaW55MlsiZGVmYXVsdCJdLnJlbmRlckRlcGVuZGVuY2llcyhjYWxsLmRlcGVuZGVuY2llcyk7CiAgICAgIH0KCiAgICAgIGlmIChtZXRob2RzW2NhbGwubWV0aG9kXSkgbWV0aG9kc1tjYWxsLm1ldGhvZF0uYXBwbHkobWFwLCBjYWxsLmFyZ3MpO2Vsc2UgKDAsIF91dGlsLmxvZykoIlVua25vd24gbWV0aG9kICIgKyBjYWxsLm1ldGhvZCk7CiAgICB9CiAgfSk7Cn0KCgp9LHsiLi9jbHVzdGVyLWxheWVyLXN0b3JlIjoxLCIuL2NvbnRyb2wtc3RvcmUiOjIsIi4vY3JzX3V0aWxzIjozLCIuL2RhdGFmcmFtZSI6NCwiLi9maXh1cC1kZWZhdWx0LWljb24iOjUsIi4vZml4dXAtZGVmYXVsdC10b29sdGlwIjo2LCIuL2ZpeHVwLXVybC1wcm90b2NvbCI6NywiLi9nbG9iYWwvaHRtbHdpZGdldHMiOjgsIi4vZ2xvYmFsL2pxdWVyeSI6OSwiLi9nbG9iYWwvbGVhZmxldCI6MTAsIi4vZ2xvYmFsL3NoaW55IjoxMiwiLi9sYXllci1tYW5hZ2VyIjoxNCwiLi9tZXRob2RzIjoxNSwiLi91dGlsIjoxN31dLDE0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKKGZ1bmN0aW9uIChnbG9iYWwpewoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7CiAgdmFsdWU6IHRydWUKfSk7CmV4cG9ydHNbImRlZmF1bHQiXSA9IHVuZGVmaW5lZDsKCnZhciBfanF1ZXJ5ID0gcmVxdWlyZSgiLi9nbG9iYWwvanF1ZXJ5Iik7Cgp2YXIgX2pxdWVyeTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9qcXVlcnkpOwoKdmFyIF9sZWFmbGV0ID0gcmVxdWlyZSgiLi9nbG9iYWwvbGVhZmxldCIpOwoKdmFyIF9sZWFmbGV0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2xlYWZsZXQpOwoKdmFyIF91dGlsID0gcmVxdWlyZSgiLi91dGlsIik7CgpmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAiZGVmYXVsdCI6IG9iaiB9OyB9CgpmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOyB9IH0KCmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9CgpmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfQoKdmFyIExheWVyTWFuYWdlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgZnVuY3Rpb24gTGF5ZXJNYW5hZ2VyKG1hcCkgewogICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExheWVyTWFuYWdlcik7CgogICAgdGhpcy5fbWFwID0gbWFwOyAvLyBCRUdJTiBsYXllciBpbmRpY2VzCiAgICAvLyB7PGdyb3VwbmFtZT46IHs8c3RhbXA+OiBsYXllcn19CgogICAgdGhpcy5fYnlHcm91cCA9IHt9OyAvLyB7PGNhdGVnb3J5TmFtZT46IHs8c3RhbXA+OiBsYXllcn19CgogICAgdGhpcy5fYnlDYXRlZ29yeSA9IHt9OyAvLyB7PGNhdGVnb3J5TmFtZV9sYXllcklkPjogbGF5ZXJ9CgogICAgdGhpcy5fYnlMYXllcklkID0ge307IC8vIHs8c3RhbXA+OiB7CiAgICAvLyAgICAgICAgICAgICAiZ3JvdXAiOiA8Z3JvdXBuYW1lPiwKICAgIC8vICAgICAgICAgICAgICJsYXllcklkIjogPGxheWVySWQ+LAogICAgLy8gICAgICAgICAgICAgImNhdGVnb3J5IjogPGNhdGVnb3J5PiwKICAgIC8vICAgICAgICAgICAgICJjb250YWluZXIiOiA8Y29udGFpbmVyPgogICAgLy8gICAgICAgICAgIH0KICAgIC8vIH0KCiAgICB0aGlzLl9ieVN0YW1wID0ge307IC8vIHs8Y3Jvc3N0YWxrR3JvdXBOYW1lPjogezxrZXk+OiBbPHN0YW1wPiwgPHN0YW1wPiwgLi4uXSwgLi4ufX0KCiAgICB0aGlzLl9ieUNyb3NzdGFsa0dyb3VwID0ge307IC8vIEVORCBsYXllciBpbmRpY2VzCiAgICAvLyB7PGNhdGVnb3J5TmFtZT46IEwubGF5ZXJHcm91cH0KCiAgICB0aGlzLl9jYXRlZ29yeUNvbnRhaW5lcnMgPSB7fTsgLy8gezxncm91cE5hbWU+OiBMLmxheWVyR3JvdXB9CgogICAgdGhpcy5fZ3JvdXBDb250YWluZXJzID0ge307CiAgfQoKICBfY3JlYXRlQ2xhc3MoTGF5ZXJNYW5hZ2VyLCBbewogICAga2V5OiAiYWRkTGF5ZXIiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGFkZExheWVyKGxheWVyLCBjYXRlZ29yeSwgbGF5ZXJJZCwgZ3JvdXAsIGN0R3JvdXAsIGN0S2V5KSB7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAvLyBXYXMgYSBncm91cCBwcm92aWRlZD8KICAgICAgdmFyIGhhc0lkID0gdHlwZW9mIGxheWVySWQgPT09ICJzdHJpbmciOwogICAgICB2YXIgZ3JvdXBlZCA9IHR5cGVvZiBncm91cCA9PT0gInN0cmluZyI7CiAgICAgIHZhciBzdGFtcCA9IF9sZWFmbGV0MlsiZGVmYXVsdCJdLlV0aWwuc3RhbXAobGF5ZXIpICsgIiI7IC8vIFRoaXMgd2lsbCBiZSB0aGUgZGVmYXVsdCBsYXllciBncm91cCB0byBhZGQgdGhlIGxheWVyIHRvLgogICAgICAvLyBXZSBtYXkgb3ZlcndyaXRlIHRoaXMgbGV0IGJlZm9yZSB1c2luZyBpdCAoaS5lLiBpZiBhIGdyb3VwIGlzIGFzc2lnbmVkKS4KICAgICAgLy8gVGhpcyBvbmUgbGluZXIgY3JlYXRlcyB0aGUgX2NhdGVnb3J5Q29udGFpbmVyc1tjYXRlZ29yeV0gZW50cnkgaWYgaXQKICAgICAgLy8gZG9lc24ndCBhbHJlYWR5IGV4aXN0LgoKICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX2NhdGVnb3J5Q29udGFpbmVyc1tjYXRlZ29yeV0gPSB0aGlzLl9jYXRlZ29yeUNvbnRhaW5lcnNbY2F0ZWdvcnldIHx8IF9sZWFmbGV0MlsiZGVmYXVsdCJdLmxheWVyR3JvdXAoKS5hZGRUbyh0aGlzLl9tYXApOwoKICAgICAgdmFyIG9sZExheWVyID0gbnVsbDsKCiAgICAgIGlmIChoYXNJZCkgewogICAgICAgIC8vIEZpcnN0LCByZW1vdmUgYW55IGxheWVyIHdpdGggdGhlIHNhbWUgY2F0ZWdvcnkgYW5kIGxheWVySWQKICAgICAgICB2YXIgcHJlZml4ZWRMYXllcklkID0gdGhpcy5fbGF5ZXJJZEtleShjYXRlZ29yeSwgbGF5ZXJJZCk7CgogICAgICAgIG9sZExheWVyID0gdGhpcy5fYnlMYXllcklkW3ByZWZpeGVkTGF5ZXJJZF07CgogICAgICAgIGlmIChvbGRMYXllcikgewogICAgICAgICAgdGhpcy5fcmVtb3ZlTGF5ZXIob2xkTGF5ZXIpOwogICAgICAgIH0gLy8gVXBkYXRlIGxheWVySWQgaW5kZXgKCgogICAgICAgIHRoaXMuX2J5TGF5ZXJJZFtwcmVmaXhlZExheWVySWRdID0gbGF5ZXI7CiAgICAgIH0gLy8gVXBkYXRlIGdyb3VwIGluZGV4CgoKICAgICAgaWYgKGdyb3VwZWQpIHsKICAgICAgICB0aGlzLl9ieUdyb3VwW2dyb3VwXSA9IHRoaXMuX2J5R3JvdXBbZ3JvdXBdIHx8IHt9OwogICAgICAgIHRoaXMuX2J5R3JvdXBbZ3JvdXBdW3N0YW1wXSA9IGxheWVyOyAvLyBTaW5jZSBhIGdyb3VwIGlzIGFzc2lnbmVkLCBkb24ndCBhZGQgdGhlIGxheWVyIHRvIHRoZSBjYXRlZ29yeSdzIGxheWVyCiAgICAgICAgLy8gZ3JvdXA7IGluc3RlYWQsIHVzZSB0aGUgZ3JvdXAncyBsYXllciBncm91cC4KICAgICAgICAvLyBUaGlzIG9uZSBsaW5lciBjcmVhdGVzIHRoZSBfZ3JvdXBDb250YWluZXJzW2dyb3VwXSBlbnRyeSBpZiBpdCBkb2Vzbid0CiAgICAgICAgLy8gYWxyZWFkeSBleGlzdC4KCiAgICAgICAgY29udGFpbmVyID0gdGhpcy5nZXRMYXllckdyb3VwKGdyb3VwLCB0cnVlKTsKICAgICAgfSAvLyBVcGRhdGUgY2F0ZWdvcnkgaW5kZXgKCgogICAgICB0aGlzLl9ieUNhdGVnb3J5W2NhdGVnb3J5XSA9IHRoaXMuX2J5Q2F0ZWdvcnlbY2F0ZWdvcnldIHx8IHt9OwogICAgICB0aGlzLl9ieUNhdGVnb3J5W2NhdGVnb3J5XVtzdGFtcF0gPSBsYXllcjsgLy8gVXBkYXRlIHN0YW1wIGluZGV4CgogICAgICB2YXIgbGF5ZXJJbmZvID0gdGhpcy5fYnlTdGFtcFtzdGFtcF0gPSB7CiAgICAgICAgbGF5ZXI6IGxheWVyLAogICAgICAgIGdyb3VwOiBncm91cCwKICAgICAgICBjdEdyb3VwOiBjdEdyb3VwLAogICAgICAgIGN0S2V5OiBjdEtleSwKICAgICAgICBsYXllcklkOiBsYXllcklkLAogICAgICAgIGNhdGVnb3J5OiBjYXRlZ29yeSwKICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lciwKICAgICAgICBoaWRkZW46IGZhbHNlCiAgICAgIH07IC8vIFVwZGF0ZSBjcm9zc3RhbGsgZ3JvdXAgaW5kZXgKCiAgICAgIGlmIChjdEdyb3VwKSB7CiAgICAgICAgaWYgKGxheWVyLnNldFN0eWxlKSB7CiAgICAgICAgICAvLyBOZWVkIHRvIHNhdmUgdGhpcyBpbmZvIHNvIHdlIGtub3cgd2hhdCB0byBzZXQgb3BhY2l0eSB0byBsYXRlcgogICAgICAgICAgbGF5ZXIub3B0aW9ucy5vcmlnT3BhY2l0eSA9IHR5cGVvZiBsYXllci5vcHRpb25zLm9wYWNpdHkgIT09ICJ1bmRlZmluZWQiID8gbGF5ZXIub3B0aW9ucy5vcGFjaXR5IDogMC41OwogICAgICAgICAgbGF5ZXIub3B0aW9ucy5vcmlnRmlsbE9wYWNpdHkgPSB0eXBlb2YgbGF5ZXIub3B0aW9ucy5maWxsT3BhY2l0eSAhPT0gInVuZGVmaW5lZCIgPyBsYXllci5vcHRpb25zLmZpbGxPcGFjaXR5IDogMC4yOwogICAgICAgIH0KCiAgICAgICAgdmFyIGN0ZyA9IHRoaXMuX2J5Q3Jvc3N0YWxrR3JvdXBbY3RHcm91cF07CgogICAgICAgIGlmICghY3RnKSB7CiAgICAgICAgICBjdGcgPSB0aGlzLl9ieUNyb3NzdGFsa0dyb3VwW2N0R3JvdXBdID0ge307CiAgICAgICAgICB2YXIgY3Jvc3N0YWxrID0gZ2xvYmFsLmNyb3NzdGFsazsKCiAgICAgICAgICB2YXIgaGFuZGxlRmlsdGVyID0gZnVuY3Rpb24gaGFuZGxlRmlsdGVyKGUpIHsKICAgICAgICAgICAgaWYgKCFlLnZhbHVlKSB7CiAgICAgICAgICAgICAgdmFyIGdyb3VwS2V5cyA9IE9iamVjdC5rZXlzKGN0Zyk7CgogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXBLZXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gZ3JvdXBLZXlzW2ldOwogICAgICAgICAgICAgICAgdmFyIF9sYXllckluZm8gPSBfdGhpcy5fYnlTdGFtcFtjdGdba2V5XV07CgogICAgICAgICAgICAgICAgX3RoaXMuX3NldFZpc2liaWxpdHkoX2xheWVySW5mbywgdHJ1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhciBzZWxlY3RlZEtleXMgPSB7fTsKCiAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGUudmFsdWUubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgICBzZWxlY3RlZEtleXNbZS52YWx1ZVtfaV1dID0gdHJ1ZTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHZhciBfZ3JvdXBLZXlzID0gT2JqZWN0LmtleXMoY3RnKTsKCiAgICAgICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgX2dyb3VwS2V5cy5sZW5ndGg7IF9pMisrKSB7CiAgICAgICAgICAgICAgICB2YXIgX2tleSA9IF9ncm91cEtleXNbX2kyXTsKICAgICAgICAgICAgICAgIHZhciBfbGF5ZXJJbmZvMiA9IF90aGlzLl9ieVN0YW1wW2N0Z1tfa2V5XV07CgogICAgICAgICAgICAgICAgX3RoaXMuX3NldFZpc2liaWxpdHkoX2xheWVySW5mbzIsIHNlbGVjdGVkS2V5c1tfZ3JvdXBLZXlzW19pMl1dKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CgogICAgICAgICAgdmFyIGZpbHRlckhhbmRsZSA9IG5ldyBjcm9zc3RhbGsuRmlsdGVySGFuZGxlKGN0R3JvdXApOwogICAgICAgICAgZmlsdGVySGFuZGxlLm9uKCJjaGFuZ2UiLCBoYW5kbGVGaWx0ZXIpOwoKICAgICAgICAgIHZhciBoYW5kbGVTZWxlY3Rpb24gPSBmdW5jdGlvbiBoYW5kbGVTZWxlY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoIWUudmFsdWUgfHwgIWUudmFsdWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgdmFyIGdyb3VwS2V5cyA9IE9iamVjdC5rZXlzKGN0Zyk7CgogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXBLZXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gZ3JvdXBLZXlzW2ldOwogICAgICAgICAgICAgICAgdmFyIF9sYXllckluZm8zID0gX3RoaXMuX2J5U3RhbXBbY3RnW2tleV1dOwoKICAgICAgICAgICAgICAgIF90aGlzLl9zZXRPcGFjaXR5KF9sYXllckluZm8zLCAxLjApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YXIgc2VsZWN0ZWRLZXlzID0ge307CgogICAgICAgICAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGUudmFsdWUubGVuZ3RoOyBfaTMrKykgewogICAgICAgICAgICAgICAgc2VsZWN0ZWRLZXlzW2UudmFsdWVbX2kzXV0gPSB0cnVlOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdmFyIF9ncm91cEtleXMyID0gT2JqZWN0LmtleXMoY3RnKTsKCiAgICAgICAgICAgICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgX2dyb3VwS2V5czIubGVuZ3RoOyBfaTQrKykgewogICAgICAgICAgICAgICAgdmFyIF9rZXkyID0gX2dyb3VwS2V5czJbX2k0XTsKICAgICAgICAgICAgICAgIHZhciBfbGF5ZXJJbmZvNCA9IF90aGlzLl9ieVN0YW1wW2N0Z1tfa2V5Ml1dOwoKICAgICAgICAgICAgICAgIF90aGlzLl9zZXRPcGFjaXR5KF9sYXllckluZm80LCBzZWxlY3RlZEtleXNbX2dyb3VwS2V5czJbX2k0XV0gPyAxLjAgOiAwLjIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfTsKCiAgICAgICAgICB2YXIgc2VsSGFuZGxlID0gbmV3IGNyb3NzdGFsay5TZWxlY3Rpb25IYW5kbGUoY3RHcm91cCk7CiAgICAgICAgICBzZWxIYW5kbGUub24oImNoYW5nZSIsIGhhbmRsZVNlbGVjdGlvbik7CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaGFuZGxlRmlsdGVyKHsKICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVySGFuZGxlLmZpbHRlcmVkS2V5cwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaGFuZGxlU2VsZWN0aW9uKHsKICAgICAgICAgICAgICB2YWx1ZTogc2VsSGFuZGxlLnZhbHVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwgMTAwKTsKICAgICAgICB9CgogICAgICAgIGlmICghY3RnW2N0S2V5XSkgY3RnW2N0S2V5XSA9IFtdOwogICAgICAgIGN0Z1tjdEtleV0ucHVzaChzdGFtcCk7CiAgICAgIH0gLy8gQWRkIHRvIGNvbnRhaW5lcgoKCiAgICAgIGlmICghbGF5ZXJJbmZvLmhpZGRlbikgY29udGFpbmVyLmFkZExheWVyKGxheWVyKTsKICAgICAgcmV0dXJuIG9sZExheWVyOwogICAgfQogIH0sIHsKICAgIGtleTogImJydXNoIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBicnVzaChib3VuZHMsIGV4dHJhSW5mbykgewogICAgICB2YXIgX3RoaXMyID0gdGhpczsKCiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi8KICAgICAgLy8gRm9yIGVhY2ggQ3Jvc3N0YWxrIGdyb3VwLi4uCiAgICAgIE9iamVjdC5rZXlzKHRoaXMuX2J5Q3Jvc3N0YWxrR3JvdXApLmZvckVhY2goZnVuY3Rpb24gKGN0R3JvdXBOYW1lKSB7CiAgICAgICAgdmFyIGN0ZyA9IF90aGlzMi5fYnlDcm9zc3RhbGtHcm91cFtjdEdyb3VwTmFtZV07CiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IFtdOyAvLyAuLi5pdGVyYXRlIG92ZXIgZWFjaCBDcm9zc3RhbGsga2V5IChlYWNoIG9mIHdoaWNoIG1heSBoYXZlIG11bHRpcGxlCiAgICAgICAgLy8gbGF5ZXJzKS4uLgoKICAgICAgICBPYmplY3Qua2V5cyhjdGcpLmZvckVhY2goZnVuY3Rpb24gKGN0S2V5KSB7CiAgICAgICAgICAvLyAuLi5hbmQgZm9yIGVhY2ggbGF5ZXIuLi4KICAgICAgICAgIGN0Z1tjdEtleV0uZm9yRWFjaChmdW5jdGlvbiAoc3RhbXApIHsKICAgICAgICAgICAgdmFyIGxheWVySW5mbyA9IF90aGlzMi5fYnlTdGFtcFtzdGFtcF07IC8vIC4uLmlmIGl0J3Mgc29tZXRoaW5nIHdpdGggYSBwb2ludC4uLgoKICAgICAgICAgICAgaWYgKGxheWVySW5mby5sYXllci5nZXRMYXRMbmcpIHsKICAgICAgICAgICAgICAvLyAuLi4gYW5kIGl0J3MgaW5zaWRlIHRoZSBzZWxlY3Rpb24gYm91bmRzLi4uCiAgICAgICAgICAgICAgLy8gVE9ETzogVXNlIHBpeGVsIGNvbnRhaW5tZW50LCBub3QgbGF0L2xuZyBjb250YWlubWVudAogICAgICAgICAgICAgIGlmIChib3VuZHMuY29udGFpbnMobGF5ZXJJbmZvLmxheWVyLmdldExhdExuZygpKSkgewogICAgICAgICAgICAgICAgLy8gLi4uYWRkIHRoZSBrZXkgdG8gdGhlIHNlbGVjdGlvbi4KICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5wdXNoKGN0S2V5KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICAgIG5ldyBnbG9iYWwuY3Jvc3N0YWxrLlNlbGVjdGlvbkhhbmRsZShjdEdyb3VwTmFtZSkuc2V0KHNlbGVjdGlvbiwgZXh0cmFJbmZvKTsKICAgICAgfSk7CiAgICB9CiAgfSwgewogICAga2V5OiAidW5icnVzaCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gdW5icnVzaChleHRyYUluZm8pIHsKICAgICAgT2JqZWN0LmtleXModGhpcy5fYnlDcm9zc3RhbGtHcm91cCkuZm9yRWFjaChmdW5jdGlvbiAoY3RHcm91cE5hbWUpIHsKICAgICAgICBuZXcgZ2xvYmFsLmNyb3NzdGFsay5TZWxlY3Rpb25IYW5kbGUoY3RHcm91cE5hbWUpLmNsZWFyKGV4dHJhSW5mbyk7CiAgICAgIH0pOwogICAgfQogIH0sIHsKICAgIGtleTogIl9zZXRWaXNpYmlsaXR5IiwKICAgIHZhbHVlOiBmdW5jdGlvbiBfc2V0VmlzaWJpbGl0eShsYXllckluZm8sIHZpc2libGUpIHsKICAgICAgaWYgKGxheWVySW5mby5oaWRkZW4gXiB2aXNpYmxlKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9IGVsc2UgaWYgKHZpc2libGUpIHsKICAgICAgICBsYXllckluZm8uY29udGFpbmVyLmFkZExheWVyKGxheWVySW5mby5sYXllcik7CiAgICAgICAgbGF5ZXJJbmZvLmhpZGRlbiA9IGZhbHNlOwogICAgICB9IGVsc2UgewogICAgICAgIGxheWVySW5mby5jb250YWluZXIucmVtb3ZlTGF5ZXIobGF5ZXJJbmZvLmxheWVyKTsKICAgICAgICBsYXllckluZm8uaGlkZGVuID0gdHJ1ZTsKICAgICAgfQogICAgfQogIH0sIHsKICAgIGtleTogIl9zZXRPcGFjaXR5IiwKICAgIHZhbHVlOiBmdW5jdGlvbiBfc2V0T3BhY2l0eShsYXllckluZm8sIG9wYWNpdHkpIHsKICAgICAgaWYgKGxheWVySW5mby5sYXllci5zZXRPcGFjaXR5KSB7CiAgICAgICAgbGF5ZXJJbmZvLmxheWVyLnNldE9wYWNpdHkob3BhY2l0eSk7CiAgICAgIH0gZWxzZSBpZiAobGF5ZXJJbmZvLmxheWVyLnNldFN0eWxlKSB7CiAgICAgICAgbGF5ZXJJbmZvLmxheWVyLnNldFN0eWxlKHsKICAgICAgICAgIG9wYWNpdHk6IG9wYWNpdHkgKiBsYXllckluZm8ubGF5ZXIub3B0aW9ucy5vcmlnT3BhY2l0eSwKICAgICAgICAgIGZpbGxPcGFjaXR5OiBvcGFjaXR5ICogbGF5ZXJJbmZvLmxheWVyLm9wdGlvbnMub3JpZ0ZpbGxPcGFjaXR5CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICB9LCB7CiAgICBrZXk6ICJnZXRMYXllciIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TGF5ZXIoY2F0ZWdvcnksIGxheWVySWQpIHsKICAgICAgcmV0dXJuIHRoaXMuX2J5TGF5ZXJJZFt0aGlzLl9sYXllcklkS2V5KGNhdGVnb3J5LCBsYXllcklkKV07CiAgICB9CiAgfSwgewogICAga2V5OiAicmVtb3ZlTGF5ZXIiLAogICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUxheWVyKGNhdGVnb3J5LCBsYXllcklkcykgewogICAgICB2YXIgX3RoaXMzID0gdGhpczsKCiAgICAgIC8vIEZpbmQgbGF5ZXIgaW5mbwogICAgICBfanF1ZXJ5MlsiZGVmYXVsdCJdLmVhY2goKDAsIF91dGlsLmFzQXJyYXkpKGxheWVySWRzKSwgZnVuY3Rpb24gKGksIGxheWVySWQpIHsKICAgICAgICB2YXIgbGF5ZXIgPSBfdGhpczMuX2J5TGF5ZXJJZFtfdGhpczMuX2xheWVySWRLZXkoY2F0ZWdvcnksIGxheWVySWQpXTsKCiAgICAgICAgaWYgKGxheWVyKSB7CiAgICAgICAgICBfdGhpczMuX3JlbW92ZUxheWVyKGxheWVyKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0sIHsKICAgIGtleTogImNsZWFyTGF5ZXJzIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhckxheWVycyhjYXRlZ29yeSkgewogICAgICB2YXIgX3RoaXM0ID0gdGhpczsKCiAgICAgIC8vIEZpbmQgYWxsIGxheWVycyBpbiBfYnlDYXRlZ29yeVtjYXRlZ29yeV0KICAgICAgdmFyIGNhdFRhYmxlID0gdGhpcy5fYnlDYXRlZ29yeVtjYXRlZ29yeV07CgogICAgICBpZiAoIWNhdFRhYmxlKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9IC8vIFJlbW92ZSBhbGwgbGF5ZXJzLiBNYWtlIGNvcHkgb2Yga2V5cyB0byBhdm9pZCBtdXRhdGluZyB0aGUgY29sbGVjdGlvbgogICAgICAvLyBiZWhpbmQgdGhlIGl0ZXJhdG9yIHlvdSdyZSBhY2Nlc3NpbmcuCgoKICAgICAgdmFyIHN0YW1wcyA9IFtdOwoKICAgICAgX2pxdWVyeTJbImRlZmF1bHQiXS5lYWNoKGNhdFRhYmxlLCBmdW5jdGlvbiAoaywgdikgewogICAgICAgIHN0YW1wcy5wdXNoKGspOwogICAgICB9KTsKCiAgICAgIF9qcXVlcnkyWyJkZWZhdWx0Il0uZWFjaChzdGFtcHMsIGZ1bmN0aW9uIChpLCBzdGFtcCkgewogICAgICAgIF90aGlzNC5fcmVtb3ZlTGF5ZXIoc3RhbXApOwogICAgICB9KTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJnZXRMYXllckdyb3VwIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRMYXllckdyb3VwKGdyb3VwLCBlbnN1cmVFeGlzdHMpIHsKICAgICAgdmFyIGcgPSB0aGlzLl9ncm91cENvbnRhaW5lcnNbZ3JvdXBdOwoKICAgICAgaWYgKGVuc3VyZUV4aXN0cyAmJiAhZykgewogICAgICAgIHRoaXMuX2J5R3JvdXBbZ3JvdXBdID0gdGhpcy5fYnlHcm91cFtncm91cF0gfHwge307CiAgICAgICAgZyA9IHRoaXMuX2dyb3VwQ29udGFpbmVyc1tncm91cF0gPSBfbGVhZmxldDJbImRlZmF1bHQiXS5mZWF0dXJlR3JvdXAoKTsKICAgICAgICBnLmdyb3VwbmFtZSA9IGdyb3VwOwogICAgICAgIGcuYWRkVG8odGhpcy5fbWFwKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGc7CiAgICB9CiAgfSwgewogICAga2V5OiAiZ2V0R3JvdXBOYW1lRnJvbUxheWVyR3JvdXAiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGdldEdyb3VwTmFtZUZyb21MYXllckdyb3VwKGxheWVyR3JvdXApIHsKICAgICAgcmV0dXJuIGxheWVyR3JvdXAuZ3JvdXBuYW1lOwogICAgfQogIH0sIHsKICAgIGtleTogImdldFZpc2libGVHcm91cHMiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGdldFZpc2libGVHcm91cHMoKSB7CiAgICAgIHZhciBfdGhpczUgPSB0aGlzOwoKICAgICAgdmFyIHJlc3VsdCA9IFtdOwoKICAgICAgX2pxdWVyeTJbImRlZmF1bHQiXS5lYWNoKHRoaXMuX2dyb3VwQ29udGFpbmVycywgZnVuY3Rpb24gKGssIHYpIHsKICAgICAgICBpZiAoX3RoaXM1Ll9tYXAuaGFzTGF5ZXIodikpIHsKICAgICAgICAgIHJlc3VsdC5wdXNoKGspOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogIH0sIHsKICAgIGtleTogImdldEFsbEdyb3VwTmFtZXMiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFsbEdyb3VwTmFtZXMoKSB7CiAgICAgIHZhciByZXN1bHQgPSBbXTsKCiAgICAgIF9qcXVlcnkyWyJkZWZhdWx0Il0uZWFjaCh0aGlzLl9ncm91cENvbnRhaW5lcnMsIGZ1bmN0aW9uIChrLCB2KSB7CiAgICAgICAgcmVzdWx0LnB1c2goayk7CiAgICAgIH0pOwoKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJjbGVhckdyb3VwIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhckdyb3VwKGdyb3VwKSB7CiAgICAgIHZhciBfdGhpczYgPSB0aGlzOwoKICAgICAgLy8gRmluZCBhbGwgbGF5ZXJzIGluIF9ieUdyb3VwW2dyb3VwXQogICAgICB2YXIgZ3JvdXBUYWJsZSA9IHRoaXMuX2J5R3JvdXBbZ3JvdXBdOwoKICAgICAgaWYgKCFncm91cFRhYmxlKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9IC8vIFJlbW92ZSBhbGwgbGF5ZXJzLiBNYWtlIGNvcHkgb2Yga2V5cyB0byBhdm9pZCBtdXRhdGluZyB0aGUgY29sbGVjdGlvbgogICAgICAvLyBiZWhpbmQgdGhlIGl0ZXJhdG9yIHlvdSdyZSBhY2Nlc3NpbmcuCgoKICAgICAgdmFyIHN0YW1wcyA9IFtdOwoKICAgICAgX2pxdWVyeTJbImRlZmF1bHQiXS5lYWNoKGdyb3VwVGFibGUsIGZ1bmN0aW9uIChrLCB2KSB7CiAgICAgICAgc3RhbXBzLnB1c2goayk7CiAgICAgIH0pOwoKICAgICAgX2pxdWVyeTJbImRlZmF1bHQiXS5lYWNoKHN0YW1wcywgZnVuY3Rpb24gKGksIHN0YW1wKSB7CiAgICAgICAgX3RoaXM2Ll9yZW1vdmVMYXllcihzdGFtcCk7CiAgICAgIH0pOwogICAgfQogIH0sIHsKICAgIGtleTogImNsZWFyIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHsKICAgICAgZnVuY3Rpb24gY2xlYXJMYXllckdyb3VwKGtleSwgbGF5ZXJHcm91cCkgewogICAgICAgIGxheWVyR3JvdXAuY2xlYXJMYXllcnMoKTsKICAgICAgfSAvLyBDbGVhciBhbGwgaW5kaWNlcyBhbmQgbGF5ZXJHcm91cHMKCgogICAgICB0aGlzLl9ieUdyb3VwID0ge307CiAgICAgIHRoaXMuX2J5Q2F0ZWdvcnkgPSB7fTsKICAgICAgdGhpcy5fYnlMYXllcklkID0ge307CiAgICAgIHRoaXMuX2J5U3RhbXAgPSB7fTsKICAgICAgdGhpcy5fYnlDcm9zc3RhbGtHcm91cCA9IHt9OwoKICAgICAgX2pxdWVyeTJbImRlZmF1bHQiXS5lYWNoKHRoaXMuX2NhdGVnb3J5Q29udGFpbmVycywgY2xlYXJMYXllckdyb3VwKTsKCiAgICAgIHRoaXMuX2NhdGVnb3J5Q29udGFpbmVycyA9IHt9OwoKICAgICAgX2pxdWVyeTJbImRlZmF1bHQiXS5lYWNoKHRoaXMuX2dyb3VwQ29udGFpbmVycywgY2xlYXJMYXllckdyb3VwKTsKCiAgICAgIHRoaXMuX2dyb3VwQ29udGFpbmVycyA9IHt9OwogICAgfQogIH0sIHsKICAgIGtleTogIl9yZW1vdmVMYXllciIsCiAgICB2YWx1ZTogZnVuY3Rpb24gX3JlbW92ZUxheWVyKGxheWVyKSB7CiAgICAgIHZhciBzdGFtcDsKCiAgICAgIGlmICh0eXBlb2YgbGF5ZXIgPT09ICJzdHJpbmciKSB7CiAgICAgICAgc3RhbXAgPSBsYXllcjsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdGFtcCA9IF9sZWFmbGV0MlsiZGVmYXVsdCJdLlV0aWwuc3RhbXAobGF5ZXIpOwogICAgICB9CgogICAgICB2YXIgbGF5ZXJJbmZvID0gdGhpcy5fYnlTdGFtcFtzdGFtcF07CgogICAgICBpZiAoIWxheWVySW5mbykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgbGF5ZXJJbmZvLmNvbnRhaW5lci5yZW1vdmVMYXllcihzdGFtcCk7CgogICAgICBpZiAodHlwZW9mIGxheWVySW5mby5ncm91cCA9PT0gInN0cmluZyIpIHsKICAgICAgICBkZWxldGUgdGhpcy5fYnlHcm91cFtsYXllckluZm8uZ3JvdXBdW3N0YW1wXTsKICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiBsYXllckluZm8ubGF5ZXJJZCA9PT0gInN0cmluZyIpIHsKICAgICAgICBkZWxldGUgdGhpcy5fYnlMYXllcklkW3RoaXMuX2xheWVySWRLZXkobGF5ZXJJbmZvLmNhdGVnb3J5LCBsYXllckluZm8ubGF5ZXJJZCldOwogICAgICB9CgogICAgICBkZWxldGUgdGhpcy5fYnlDYXRlZ29yeVtsYXllckluZm8uY2F0ZWdvcnldW3N0YW1wXTsKICAgICAgZGVsZXRlIHRoaXMuX2J5U3RhbXBbc3RhbXBdOwoKICAgICAgaWYgKGxheWVySW5mby5jdEdyb3VwKSB7CiAgICAgICAgdmFyIGN0R3JvdXAgPSB0aGlzLl9ieUNyb3NzdGFsa0dyb3VwW2xheWVySW5mby5jdEdyb3VwXTsKICAgICAgICB2YXIgbGF5ZXJzRm9yS2V5ID0gY3RHcm91cFtsYXllckluZm8uY3RLZXldOwogICAgICAgIHZhciBpZHggPSBsYXllcnNGb3JLZXkgPyBsYXllcnNGb3JLZXkuaW5kZXhPZihzdGFtcCkgOiAtMTsKCiAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICBpZiAobGF5ZXJzRm9yS2V5Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICBkZWxldGUgY3RHcm91cFtsYXllckluZm8uY3RLZXldOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGF5ZXJzRm9yS2V5LnNwbGljZShpZHgsIDEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sIHsKICAgIGtleTogIl9sYXllcklkS2V5IiwKICAgIHZhbHVlOiBmdW5jdGlvbiBfbGF5ZXJJZEtleShjYXRlZ29yeSwgbGF5ZXJJZCkgewogICAgICByZXR1cm4gY2F0ZWdvcnkgKyAiXG4iICsgbGF5ZXJJZDsKICAgIH0KICB9XSk7CgogIHJldHVybiBMYXllck1hbmFnZXI7Cn0oKTsKCmV4cG9ydHNbImRlZmF1bHQiXSA9IExheWVyTWFuYWdlcjsKCgp9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB7fSkKfSx7Ii4vZ2xvYmFsL2pxdWVyeSI6OSwiLi9nbG9iYWwvbGVhZmxldCI6MTAsIi4vdXRpbCI6MTd9XSwxNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CihmdW5jdGlvbiAoZ2xvYmFsKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwoKdmFyIF9qcXVlcnkgPSByZXF1aXJlKCIuL2dsb2JhbC9qcXVlcnkiKTsKCnZhciBfanF1ZXJ5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2pxdWVyeSk7Cgp2YXIgX2xlYWZsZXQgPSByZXF1aXJlKCIuL2dsb2JhbC9sZWFmbGV0Iik7Cgp2YXIgX2xlYWZsZXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbGVhZmxldCk7Cgp2YXIgX3NoaW55ID0gcmVxdWlyZSgiLi9nbG9iYWwvc2hpbnkiKTsKCnZhciBfc2hpbnkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2hpbnkpOwoKdmFyIF9odG1sd2lkZ2V0cyA9IHJlcXVpcmUoIi4vZ2xvYmFsL2h0bWx3aWRnZXRzIik7Cgp2YXIgX2h0bWx3aWRnZXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2h0bWx3aWRnZXRzKTsKCnZhciBfdXRpbCA9IHJlcXVpcmUoIi4vdXRpbCIpOwoKdmFyIF9jcnNfdXRpbHMgPSByZXF1aXJlKCIuL2Nyc191dGlscyIpOwoKdmFyIF9kYXRhZnJhbWUgPSByZXF1aXJlKCIuL2RhdGFmcmFtZSIpOwoKdmFyIF9kYXRhZnJhbWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGF0YWZyYW1lKTsKCnZhciBfY2x1c3RlckxheWVyU3RvcmUgPSByZXF1aXJlKCIuL2NsdXN0ZXItbGF5ZXItc3RvcmUiKTsKCnZhciBfY2x1c3RlckxheWVyU3RvcmUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2x1c3RlckxheWVyU3RvcmUpOwoKdmFyIF9taXBtYXBwZXIgPSByZXF1aXJlKCIuL21pcG1hcHBlciIpOwoKdmFyIF9taXBtYXBwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbWlwbWFwcGVyKTsKCmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICJkZWZhdWx0Ijogb2JqIH07IH0KCnZhciBtZXRob2RzID0ge307CmV4cG9ydHNbImRlZmF1bHQiXSA9IG1ldGhvZHM7CgpmdW5jdGlvbiBtb3VzZUhhbmRsZXIobWFwSWQsIGxheWVySWQsIGdyb3VwLCBldmVudE5hbWUsIGV4dHJhSW5mbykgewogIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgaWYgKCFfaHRtbHdpZGdldHMyWyJkZWZhdWx0Il0uc2hpbnlNb2RlKSByZXR1cm47CiAgICB2YXIgbGF0TG5nID0gZS50YXJnZXQuZ2V0TGF0TG5nID8gZS50YXJnZXQuZ2V0TGF0TG5nKCkgOiBlLmxhdGxuZzsKCiAgICBpZiAobGF0TG5nKSB7CiAgICAgIC8vIHJldHJpZXZlIG9ubHkgbGF0LCBsb24gdmFsdWVzIHRvIHJlbW92ZSBwcm90b3R5cGUKICAgICAgLy8gICBhbmQgZXh0cmEgcGFyYW1ldGVycyBhZGRlZCBieSAzcmQgcGFydHkgbW9kdWxlcwogICAgICAvLyB0aGVzZSBvYmplY3RzIGFyZSBmb3IganNvbiBzZXJpYWxpemF0aW9uLCBub3QgamF2YXNjcmlwdAogICAgICB2YXIgbGF0TG5nVmFsID0gX2xlYWZsZXQyWyJkZWZhdWx0Il0ubGF0TG5nKGxhdExuZyk7IC8vIG1ha2Ugc3VyZSBpdCBoYXMgY29uc2lzdGVudCBzaGFwZQoKCiAgICAgIGxhdExuZyA9IHsKICAgICAgICBsYXQ6IGxhdExuZ1ZhbC5sYXQsCiAgICAgICAgbG5nOiBsYXRMbmdWYWwubG5nCiAgICAgIH07CiAgICB9CgogICAgdmFyIGV2ZW50SW5mbyA9IF9qcXVlcnkyWyJkZWZhdWx0Il0uZXh0ZW5kKHsKICAgICAgaWQ6IGxheWVySWQsCiAgICAgICIubm9uY2UiOiBNYXRoLnJhbmRvbSgpIC8vIGZvcmNlIHJlYWN0aXZpdHkKCiAgICB9LCBncm91cCAhPT0gbnVsbCA/IHsKICAgICAgZ3JvdXA6IGdyb3VwCiAgICB9IDogbnVsbCwgbGF0TG5nLCBleHRyYUluZm8pOwoKICAgIF9zaGlueTJbImRlZmF1bHQiXS5vbklucHV0Q2hhbmdlKG1hcElkICsgIl8iICsgZXZlbnROYW1lLCBldmVudEluZm8pOwogIH07Cn0KCm1ldGhvZHMubW91c2VIYW5kbGVyID0gbW91c2VIYW5kbGVyOwoKbWV0aG9kcy5jbGVhckdyb3VwID0gZnVuY3Rpb24gKGdyb3VwKSB7CiAgdmFyIF90aGlzID0gdGhpczsKCiAgX2pxdWVyeTJbImRlZmF1bHQiXS5lYWNoKCgwLCBfdXRpbC5hc0FycmF5KShncm91cCksIGZ1bmN0aW9uIChpLCB2KSB7CiAgICBfdGhpcy5sYXllck1hbmFnZXIuY2xlYXJHcm91cCh2KTsKICB9KTsKfTsKCm1ldGhvZHMuc2V0VmlldyA9IGZ1bmN0aW9uIChjZW50ZXIsIHpvb20sIG9wdGlvbnMpIHsKICB0aGlzLnNldFZpZXcoY2VudGVyLCB6b29tLCBvcHRpb25zKTsKfTsKCm1ldGhvZHMuZml0Qm91bmRzID0gZnVuY3Rpb24gKGxhdDEsIGxuZzEsIGxhdDIsIGxuZzIsIG9wdGlvbnMpIHsKICB0aGlzLmZpdEJvdW5kcyhbW2xhdDEsIGxuZzFdLCBbbGF0MiwgbG5nMl1dLCBvcHRpb25zKTsKfTsKCm1ldGhvZHMuZmx5VG8gPSBmdW5jdGlvbiAoY2VudGVyLCB6b29tLCBvcHRpb25zKSB7CiAgdGhpcy5mbHlUbyhjZW50ZXIsIHpvb20sIG9wdGlvbnMpOwp9OwoKbWV0aG9kcy5mbHlUb0JvdW5kcyA9IGZ1bmN0aW9uIChsYXQxLCBsbmcxLCBsYXQyLCBsbmcyLCBvcHRpb25zKSB7CiAgdGhpcy5mbHlUb0JvdW5kcyhbW2xhdDEsIGxuZzFdLCBbbGF0MiwgbG5nMl1dLCBvcHRpb25zKTsKfTsKCm1ldGhvZHMuc2V0TWF4Qm91bmRzID0gZnVuY3Rpb24gKGxhdDEsIGxuZzEsIGxhdDIsIGxuZzIpIHsKICB0aGlzLnNldE1heEJvdW5kcyhbW2xhdDEsIGxuZzFdLCBbbGF0MiwgbG5nMl1dKTsKfTsKCm1ldGhvZHMuYWRkUG9wdXBzID0gZnVuY3Rpb24gKGxhdCwgbG5nLCBwb3B1cCwgbGF5ZXJJZCwgZ3JvdXAsIG9wdGlvbnMpIHsKICB2YXIgX3RoaXMyID0gdGhpczsKCiAgdmFyIGRmID0gbmV3IF9kYXRhZnJhbWUyWyJkZWZhdWx0Il0oKS5jb2woImxhdCIsIGxhdCkuY29sKCJsbmciLCBsbmcpLmNvbCgicG9wdXAiLCBwb3B1cCkuY29sKCJsYXllcklkIiwgbGF5ZXJJZCkuY29sKCJncm91cCIsIGdyb3VwKS5jYmluZChvcHRpb25zKTsKCiAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoaSkgewogICAgaWYgKF9qcXVlcnkyWyJkZWZhdWx0Il0uaXNOdW1lcmljKGRmLmdldChpLCAibGF0IikpICYmIF9qcXVlcnkyWyJkZWZhdWx0Il0uaXNOdW1lcmljKGRmLmdldChpLCAibG5nIikpKSB7CiAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHBvcHVwID0gX2xlYWZsZXQyWyJkZWZhdWx0Il0ucG9wdXAoZGYuZ2V0KGkpKS5zZXRMYXRMbmcoW2RmLmdldChpLCAibGF0IiksIGRmLmdldChpLCAibG5nIildKS5zZXRDb250ZW50KGRmLmdldChpLCAicG9wdXAiKSk7CgogICAgICAgIHZhciB0aGlzSWQgPSBkZi5nZXQoaSwgImxheWVySWQiKTsKICAgICAgICB2YXIgdGhpc0dyb3VwID0gZGYuZ2V0KGksICJncm91cCIpOwogICAgICAgIHRoaXMubGF5ZXJNYW5hZ2VyLmFkZExheWVyKHBvcHVwLCAicG9wdXAiLCB0aGlzSWQsIHRoaXNHcm91cCk7CiAgICAgIH0pLmNhbGwoX3RoaXMyKTsKICAgIH0KICB9OwoKICBmb3IgKHZhciBpID0gMDsgaSA8IGRmLm5yb3coKTsgaSsrKSB7CiAgICBfbG9vcChpKTsKICB9Cn07CgptZXRob2RzLnJlbW92ZVBvcHVwID0gZnVuY3Rpb24gKGxheWVySWQpIHsKICB0aGlzLmxheWVyTWFuYWdlci5yZW1vdmVMYXllcigicG9wdXAiLCBsYXllcklkKTsKfTsKCm1ldGhvZHMuY2xlYXJQb3B1cHMgPSBmdW5jdGlvbiAoKSB7CiAgdGhpcy5sYXllck1hbmFnZXIuY2xlYXJMYXllcnMoInBvcHVwIik7Cn07CgptZXRob2RzLmFkZFRpbGVzID0gZnVuY3Rpb24gKHVybFRlbXBsYXRlLCBsYXllcklkLCBncm91cCwgb3B0aW9ucykgewogIHRoaXMubGF5ZXJNYW5hZ2VyLmFkZExheWVyKF9sZWFmbGV0MlsiZGVmYXVsdCJdLnRpbGVMYXllcih1cmxUZW1wbGF0ZSwgb3B0aW9ucyksICJ0aWxlIiwgbGF5ZXJJZCwgZ3JvdXApOwp9OwoKbWV0aG9kcy5yZW1vdmVUaWxlcyA9IGZ1bmN0aW9uIChsYXllcklkKSB7CiAgdGhpcy5sYXllck1hbmFnZXIucmVtb3ZlTGF5ZXIoInRpbGUiLCBsYXllcklkKTsKfTsKCm1ldGhvZHMuY2xlYXJUaWxlcyA9IGZ1bmN0aW9uICgpIHsKICB0aGlzLmxheWVyTWFuYWdlci5jbGVhckxheWVycygidGlsZSIpOwp9OwoKbWV0aG9kcy5hZGRXTVNUaWxlcyA9IGZ1bmN0aW9uIChiYXNlVXJsLCBsYXllcklkLCBncm91cCwgb3B0aW9ucykgewogIGlmIChvcHRpb25zICYmIG9wdGlvbnMuY3JzKSB7CiAgICBvcHRpb25zLmNycyA9ICgwLCBfY3JzX3V0aWxzLmdldENSUykob3B0aW9ucy5jcnMpOwogIH0KCiAgdGhpcy5sYXllck1hbmFnZXIuYWRkTGF5ZXIoX2xlYWZsZXQyWyJkZWZhdWx0Il0udGlsZUxheWVyLndtcyhiYXNlVXJsLCBvcHRpb25zKSwgInRpbGUiLCBsYXllcklkLCBncm91cCk7Cn07IC8vIEdpdmVuOgovLyAgIHtkYXRhOiBbImEiLCAiYiIsICJjIl0sIGluZGV4OiBbMCwgMSwgMCwgMl19Ci8vIHJldHVybnM6Ci8vICAgWyJhIiwgImIiLCAiYSIsICJjIl0KCgpmdW5jdGlvbiB1bnBhY2tTdHJpbmdzKGljb25zZXQpIHsKICBpZiAoIWljb25zZXQpIHsKICAgIHJldHVybiBpY29uc2V0OwogIH0KCiAgaWYgKHR5cGVvZiBpY29uc2V0LmluZGV4ID09PSAidW5kZWZpbmVkIikgewogICAgcmV0dXJuIGljb25zZXQ7CiAgfQoKICBpY29uc2V0LmRhdGEgPSAoMCwgX3V0aWwuYXNBcnJheSkoaWNvbnNldC5kYXRhKTsKICBpY29uc2V0LmluZGV4ID0gKDAsIF91dGlsLmFzQXJyYXkpKGljb25zZXQuaW5kZXgpOwogIHJldHVybiBfanF1ZXJ5MlsiZGVmYXVsdCJdLm1hcChpY29uc2V0LmluZGV4LCBmdW5jdGlvbiAoZSwgaSkgewogICAgcmV0dXJuIGljb25zZXQuZGF0YVtlXTsKICB9KTsKfQoKZnVuY3Rpb24gYWRkTWFya2VycyhtYXAsIGRmLCBncm91cCwgY2x1c3Rlck9wdGlvbnMsIGNsdXN0ZXJJZCwgbWFya2VyRnVuYykgewogIChmdW5jdGlvbiAoKSB7CiAgICB2YXIgX3RoaXMzID0gdGhpczsKCiAgICB2YXIgY2x1c3Rlckdyb3VwID0gdGhpcy5sYXllck1hbmFnZXIuZ2V0TGF5ZXIoImNsdXN0ZXIiLCBjbHVzdGVySWQpLAogICAgICAgIGNsdXN0ZXIgPSBjbHVzdGVyT3B0aW9ucyAhPT0gbnVsbDsKCiAgICBpZiAoY2x1c3RlciAmJiAhY2x1c3Rlckdyb3VwKSB7CiAgICAgIGNsdXN0ZXJHcm91cCA9IF9sZWFmbGV0MlsiZGVmYXVsdCJdLm1hcmtlckNsdXN0ZXJHcm91cC5sYXllclN1cHBvcnQoY2x1c3Rlck9wdGlvbnMpOwoKICAgICAgaWYgKGNsdXN0ZXJPcHRpb25zLmZyZWV6ZUF0Wm9vbSkgewogICAgICAgIHZhciBmcmVlemVBdFpvb20gPSBjbHVzdGVyT3B0aW9ucy5mcmVlemVBdFpvb207CiAgICAgICAgZGVsZXRlIGNsdXN0ZXJPcHRpb25zLmZyZWV6ZUF0Wm9vbTsKICAgICAgICBjbHVzdGVyR3JvdXAuZnJlZXplQXRab29tKGZyZWV6ZUF0Wm9vbSk7CiAgICAgIH0KCiAgICAgIGNsdXN0ZXJHcm91cC5jbHVzdGVyTGF5ZXJTdG9yZSA9IG5ldyBfY2x1c3RlckxheWVyU3RvcmUyWyJkZWZhdWx0Il0oY2x1c3Rlckdyb3VwKTsKICAgIH0KCiAgICB2YXIgZXh0cmFJbmZvID0gY2x1c3RlciA/IHsKICAgICAgY2x1c3RlcklkOiBjbHVzdGVySWQKICAgIH0gOiB7fTsKCiAgICB2YXIgX2xvb3AyID0gZnVuY3Rpb24gX2xvb3AyKGkpIHsKICAgICAgaWYgKF9qcXVlcnkyWyJkZWZhdWx0Il0uaXNOdW1lcmljKGRmLmdldChpLCAibGF0IikpICYmIF9qcXVlcnkyWyJkZWZhdWx0Il0uaXNOdW1lcmljKGRmLmdldChpLCAibG5nIikpKSB7CiAgICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBtYXJrZXIgPSBtYXJrZXJGdW5jKGRmLCBpKTsKICAgICAgICAgIHZhciB0aGlzSWQgPSBkZi5nZXQoaSwgImxheWVySWQiKTsKICAgICAgICAgIHZhciB0aGlzR3JvdXAgPSBjbHVzdGVyID8gbnVsbCA6IGRmLmdldChpLCAiZ3JvdXAiKTsKCiAgICAgICAgICBpZiAoY2x1c3RlcikgewogICAgICAgICAgICBjbHVzdGVyR3JvdXAuY2x1c3RlckxheWVyU3RvcmUuYWRkKG1hcmtlciwgdGhpc0lkKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMubGF5ZXJNYW5hZ2VyLmFkZExheWVyKG1hcmtlciwgIm1hcmtlciIsIHRoaXNJZCwgdGhpc0dyb3VwLCBkZi5nZXQoaSwgImN0R3JvdXAiLCB0cnVlKSwgZGYuZ2V0KGksICJjdEtleSIsIHRydWUpKTsKICAgICAgICAgIH0KCiAgICAgICAgICB2YXIgcG9wdXAgPSBkZi5nZXQoaSwgInBvcHVwIik7CiAgICAgICAgICB2YXIgcG9wdXBPcHRpb25zID0gZGYuZ2V0KGksICJwb3B1cE9wdGlvbnMiKTsKCiAgICAgICAgICBpZiAocG9wdXAgIT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKHBvcHVwT3B0aW9ucyAhPT0gbnVsbCkgewogICAgICAgICAgICAgIG1hcmtlci5iaW5kUG9wdXAocG9wdXAsIHBvcHVwT3B0aW9ucyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbWFya2VyLmJpbmRQb3B1cChwb3B1cCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICB2YXIgbGFiZWwgPSBkZi5nZXQoaSwgImxhYmVsIik7CiAgICAgICAgICB2YXIgbGFiZWxPcHRpb25zID0gZGYuZ2V0KGksICJsYWJlbE9wdGlvbnMiKTsKCiAgICAgICAgICBpZiAobGFiZWwgIT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKGxhYmVsT3B0aW9ucyAhPT0gbnVsbCkgewogICAgICAgICAgICAgIGlmIChsYWJlbE9wdGlvbnMucGVybWFuZW50KSB7CiAgICAgICAgICAgICAgICBtYXJrZXIuYmluZFRvb2x0aXAobGFiZWwsIGxhYmVsT3B0aW9ucykub3BlblRvb2x0aXAoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbWFya2VyLmJpbmRUb29sdGlwKGxhYmVsLCBsYWJlbE9wdGlvbnMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBtYXJrZXIuYmluZFRvb2x0aXAobGFiZWwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgbWFya2VyLm9uKCJjbGljayIsIG1vdXNlSGFuZGxlcih0aGlzLmlkLCB0aGlzSWQsIHRoaXNHcm91cCwgIm1hcmtlcl9jbGljayIsIGV4dHJhSW5mbyksIHRoaXMpOwogICAgICAgICAgbWFya2VyLm9uKCJtb3VzZW92ZXIiLCBtb3VzZUhhbmRsZXIodGhpcy5pZCwgdGhpc0lkLCB0aGlzR3JvdXAsICJtYXJrZXJfbW91c2VvdmVyIiwgZXh0cmFJbmZvKSwgdGhpcyk7CiAgICAgICAgICBtYXJrZXIub24oIm1vdXNlb3V0IiwgbW91c2VIYW5kbGVyKHRoaXMuaWQsIHRoaXNJZCwgdGhpc0dyb3VwLCAibWFya2VyX21vdXNlb3V0IiwgZXh0cmFJbmZvKSwgdGhpcyk7CiAgICAgICAgICBtYXJrZXIub24oImRyYWdlbmQiLCBtb3VzZUhhbmRsZXIodGhpcy5pZCwgdGhpc0lkLCB0aGlzR3JvdXAsICJtYXJrZXJfZHJhZ2VuZCIsIGV4dHJhSW5mbyksIHRoaXMpOwogICAgICAgIH0pLmNhbGwoX3RoaXMzKTsKICAgICAgfQogICAgfTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRmLm5yb3coKTsgaSsrKSB7CiAgICAgIF9sb29wMihpKTsKICAgIH0KCiAgICBpZiAoY2x1c3RlcikgewogICAgICB0aGlzLmxheWVyTWFuYWdlci5hZGRMYXllcihjbHVzdGVyR3JvdXAsICJjbHVzdGVyIiwgY2x1c3RlcklkLCBncm91cCk7CiAgICB9CiAgfSkuY2FsbChtYXApOwp9CgptZXRob2RzLmFkZEdlbmVyaWNNYXJrZXJzID0gYWRkTWFya2VyczsKCm1ldGhvZHMuYWRkTWFya2VycyA9IGZ1bmN0aW9uIChsYXQsIGxuZywgaWNvbiwgbGF5ZXJJZCwgZ3JvdXAsIG9wdGlvbnMsIHBvcHVwLCBwb3B1cE9wdGlvbnMsIGNsdXN0ZXJPcHRpb25zLCBjbHVzdGVySWQsIGxhYmVsLCBsYWJlbE9wdGlvbnMsIGNyb3NzdGFsa09wdGlvbnMpIHsKICB2YXIgaWNvbmRmOwogIHZhciBnZXRJY29uOwoKICBpZiAoaWNvbikgewogICAgLy8gVW5wYWNrIGljb25zCiAgICBpY29uLmljb25VcmwgPSB1bnBhY2tTdHJpbmdzKGljb24uaWNvblVybCk7CiAgICBpY29uLmljb25SZXRpbmFVcmwgPSB1bnBhY2tTdHJpbmdzKGljb24uaWNvblJldGluYVVybCk7CiAgICBpY29uLnNoYWRvd1VybCA9IHVucGFja1N0cmluZ3MoaWNvbi5zaGFkb3dVcmwpOwogICAgaWNvbi5zaGFkb3dSZXRpbmFVcmwgPSB1bnBhY2tTdHJpbmdzKGljb24uc2hhZG93UmV0aW5hVXJsKTsgLy8gVGhpcyBjYmluZHMgdGhlIGljb24gVVJMcyBhbmQgYW55IG90aGVyIGljb24gb3B0aW9uczsgdGhleSdyZSBhbGwKICAgIC8vIHByZXNlbnQgb24gdGhlIGljb24gb2JqZWN0LgoKICAgIGljb25kZiA9IG5ldyBfZGF0YWZyYW1lMlsiZGVmYXVsdCJdKCkuY2JpbmQoaWNvbik7IC8vIENvbnN0cnVjdHMgYW4gaWNvbiBmcm9tIGEgc3BlY2lmaWVkIHJvdyBvZiB0aGUgaWNvbiBkYXRhZnJhbWUuCgogICAgZ2V0SWNvbiA9IGZ1bmN0aW9uIGdldEljb24oaSkgewogICAgICB2YXIgb3B0cyA9IGljb25kZi5nZXQoaSk7CgogICAgICBpZiAoIW9wdHMuaWNvblVybCkgewogICAgICAgIHJldHVybiBuZXcgX2xlYWZsZXQyWyJkZWZhdWx0Il0uSWNvbi5EZWZhdWx0KCk7CiAgICAgIH0gLy8gQ29tcG9zaXRlIG9wdGlvbnMgKGxpa2UgcG9pbnRzIG9yIHNpemVzKSBhcmUgcGFzc2VkIGZyb20gUiB3aXRoIGVhY2gKICAgICAgLy8gaW5kaXZpZHVhbCBjb21wb25lbnQgYXMgaXRzIG93biBvcHRpb24uIFdlIG5lZWQgdG8gY29tYmluZSB0aGVtIG5vdwogICAgICAvLyBpbnRvIHRoZWlyIGNvbXBvc2l0ZSBmb3JtLgoKCiAgICAgIGlmIChvcHRzLmljb25XaWR0aCkgewogICAgICAgIG9wdHMuaWNvblNpemUgPSBbb3B0cy5pY29uV2lkdGgsIG9wdHMuaWNvbkhlaWdodF07CiAgICAgIH0KCiAgICAgIGlmIChvcHRzLnNoYWRvd1dpZHRoKSB7CiAgICAgICAgb3B0cy5zaGFkb3dTaXplID0gW29wdHMuc2hhZG93V2lkdGgsIG9wdHMuc2hhZG93SGVpZ2h0XTsKICAgICAgfQoKICAgICAgaWYgKG9wdHMuaWNvbkFuY2hvclgpIHsKICAgICAgICBvcHRzLmljb25BbmNob3IgPSBbb3B0cy5pY29uQW5jaG9yWCwgb3B0cy5pY29uQW5jaG9yWV07CiAgICAgIH0KCiAgICAgIGlmIChvcHRzLnNoYWRvd0FuY2hvclgpIHsKICAgICAgICBvcHRzLnNoYWRvd0FuY2hvciA9IFtvcHRzLnNoYWRvd0FuY2hvclgsIG9wdHMuc2hhZG93QW5jaG9yWV07CiAgICAgIH0KCiAgICAgIGlmIChvcHRzLnBvcHVwQW5jaG9yWCkgewogICAgICAgIG9wdHMucG9wdXBBbmNob3IgPSBbb3B0cy5wb3B1cEFuY2hvclgsIG9wdHMucG9wdXBBbmNob3JZXTsKICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBfbGVhZmxldDJbImRlZmF1bHQiXS5JY29uKG9wdHMpOwogICAgfTsKICB9CgogIGlmICghKF9qcXVlcnkyWyJkZWZhdWx0Il0uaXNFbXB0eU9iamVjdChsYXQpIHx8IF9qcXVlcnkyWyJkZWZhdWx0Il0uaXNFbXB0eU9iamVjdChsbmcpKSB8fCBfanF1ZXJ5MlsiZGVmYXVsdCJdLmlzTnVtZXJpYyhsYXQpICYmIF9qcXVlcnkyWyJkZWZhdWx0Il0uaXNOdW1lcmljKGxuZykpIHsKICAgIHZhciBkZiA9IG5ldyBfZGF0YWZyYW1lMlsiZGVmYXVsdCJdKCkuY29sKCJsYXQiLCBsYXQpLmNvbCgibG5nIiwgbG5nKS5jb2woImxheWVySWQiLCBsYXllcklkKS5jb2woImdyb3VwIiwgZ3JvdXApLmNvbCgicG9wdXAiLCBwb3B1cCkuY29sKCJwb3B1cE9wdGlvbnMiLCBwb3B1cE9wdGlvbnMpLmNvbCgibGFiZWwiLCBsYWJlbCkuY29sKCJsYWJlbE9wdGlvbnMiLCBsYWJlbE9wdGlvbnMpLmNiaW5kKG9wdGlvbnMpLmNiaW5kKGNyb3NzdGFsa09wdGlvbnMgfHwge30pOwogICAgaWYgKGljb24pIGljb25kZi5lZmZlY3RpdmVMZW5ndGggPSBkZi5ucm93KCk7CiAgICBhZGRNYXJrZXJzKHRoaXMsIGRmLCBncm91cCwgY2x1c3Rlck9wdGlvbnMsIGNsdXN0ZXJJZCwgZnVuY3Rpb24gKGRmLCBpKSB7CiAgICAgIHZhciBvcHRpb25zID0gZGYuZ2V0KGkpOwogICAgICBpZiAoaWNvbikgb3B0aW9ucy5pY29uID0gZ2V0SWNvbihpKTsKICAgICAgcmV0dXJuIF9sZWFmbGV0MlsiZGVmYXVsdCJdLm1hcmtlcihbZGYuZ2V0KGksICJsYXQiKSwgZGYuZ2V0KGksICJsbmciKV0sIG9wdGlvbnMpOwogICAgfSk7CiAgfQp9OwoKbWV0aG9kcy5hZGRBd2Vzb21lTWFya2VycyA9IGZ1bmN0aW9uIChsYXQsIGxuZywgaWNvbiwgbGF5ZXJJZCwgZ3JvdXAsIG9wdGlvbnMsIHBvcHVwLCBwb3B1cE9wdGlvbnMsIGNsdXN0ZXJPcHRpb25zLCBjbHVzdGVySWQsIGxhYmVsLCBsYWJlbE9wdGlvbnMsIGNyb3NzdGFsa09wdGlvbnMpIHsKICB2YXIgaWNvbmRmOwogIHZhciBnZXRJY29uOwoKICBpZiAoaWNvbikgewogICAgLy8gVGhpcyBjYmluZHMgdGhlIGljb24gVVJMcyBhbmQgYW55IG90aGVyIGljb24gb3B0aW9uczsgdGhleSdyZSBhbGwKICAgIC8vIHByZXNlbnQgb24gdGhlIGljb24gb2JqZWN0LgogICAgaWNvbmRmID0gbmV3IF9kYXRhZnJhbWUyWyJkZWZhdWx0Il0oKS5jYmluZChpY29uKTsgLy8gQ29uc3RydWN0cyBhbiBpY29uIGZyb20gYSBzcGVjaWZpZWQgcm93IG9mIHRoZSBpY29uIGRhdGFmcmFtZS4KCiAgICBnZXRJY29uID0gZnVuY3Rpb24gZ2V0SWNvbihpKSB7CiAgICAgIHZhciBvcHRzID0gaWNvbmRmLmdldChpKTsKCiAgICAgIGlmICghb3B0cykgewogICAgICAgIHJldHVybiBuZXcgX2xlYWZsZXQyWyJkZWZhdWx0Il0uQXdlc29tZU1hcmtlcnMuaWNvbigpOwogICAgICB9CgogICAgICBpZiAob3B0cy5zcXVhcmVNYXJrZXIpIHsKICAgICAgICBvcHRzLmNsYXNzTmFtZSA9ICJhd2Vzb21lLW1hcmtlciBhd2Vzb21lLW1hcmtlci1zcXVhcmUiOwogICAgICB9CgogICAgICByZXR1cm4gbmV3IF9sZWFmbGV0MlsiZGVmYXVsdCJdLkF3ZXNvbWVNYXJrZXJzLmljb24ob3B0cyk7CiAgICB9OwogIH0KCiAgaWYgKCEoX2pxdWVyeTJbImRlZmF1bHQiXS5pc0VtcHR5T2JqZWN0KGxhdCkgfHwgX2pxdWVyeTJbImRlZmF1bHQiXS5pc0VtcHR5T2JqZWN0KGxuZykpIHx8IF9qcXVlcnkyWyJkZWZhdWx0Il0uaXNOdW1lcmljKGxhdCkgJiYgX2pxdWVyeTJbImRlZmF1bHQiXS5pc051bWVyaWMobG5nKSkgewogICAgdmFyIGRmID0gbmV3IF9kYXRhZnJhbWUyWyJkZWZhdWx0Il0oKS5jb2woImxhdCIsIGxhdCkuY29sKCJsbmciLCBsbmcpLmNvbCgibGF5ZXJJZCIsIGxheWVySWQpLmNvbCgiZ3JvdXAiLCBncm91cCkuY29sKCJwb3B1cCIsIHBvcHVwKS5jb2woInBvcHVwT3B0aW9ucyIsIHBvcHVwT3B0aW9ucykuY29sKCJsYWJlbCIsIGxhYmVsKS5jb2woImxhYmVsT3B0aW9ucyIsIGxhYmVsT3B0aW9ucykuY2JpbmQob3B0aW9ucykuY2JpbmQoY3Jvc3N0YWxrT3B0aW9ucyB8fCB7fSk7CiAgICBpZiAoaWNvbikgaWNvbmRmLmVmZmVjdGl2ZUxlbmd0aCA9IGRmLm5yb3coKTsKICAgIGFkZE1hcmtlcnModGhpcywgZGYsIGdyb3VwLCBjbHVzdGVyT3B0aW9ucywgY2x1c3RlcklkLCBmdW5jdGlvbiAoZGYsIGkpIHsKICAgICAgdmFyIG9wdGlvbnMgPSBkZi5nZXQoaSk7CiAgICAgIGlmIChpY29uKSBvcHRpb25zLmljb24gPSBnZXRJY29uKGkpOwogICAgICByZXR1cm4gX2xlYWZsZXQyWyJkZWZhdWx0Il0ubWFya2VyKFtkZi5nZXQoaSwgImxhdCIpLCBkZi5nZXQoaSwgImxuZyIpXSwgb3B0aW9ucyk7CiAgICB9KTsKICB9Cn07CgpmdW5jdGlvbiBhZGRMYXllcnMobWFwLCBjYXRlZ29yeSwgZGYsIGxheWVyRnVuYykgewogIHZhciBfbG9vcDMgPSBmdW5jdGlvbiBfbG9vcDMoaSkgewogICAgKGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIGxheWVyID0gbGF5ZXJGdW5jKGRmLCBpKTsKCiAgICAgIGlmICghX2pxdWVyeTJbImRlZmF1bHQiXS5pc0VtcHR5T2JqZWN0KGxheWVyKSkgewogICAgICAgIHZhciB0aGlzSWQgPSBkZi5nZXQoaSwgImxheWVySWQiKTsKICAgICAgICB2YXIgdGhpc0dyb3VwID0gZGYuZ2V0KGksICJncm91cCIpOwogICAgICAgIHRoaXMubGF5ZXJNYW5hZ2VyLmFkZExheWVyKGxheWVyLCBjYXRlZ29yeSwgdGhpc0lkLCB0aGlzR3JvdXAsIGRmLmdldChpLCAiY3RHcm91cCIsIHRydWUpLCBkZi5nZXQoaSwgImN0S2V5IiwgdHJ1ZSkpOwoKICAgICAgICBpZiAobGF5ZXIuYmluZFBvcHVwKSB7CiAgICAgICAgICB2YXIgcG9wdXAgPSBkZi5nZXQoaSwgInBvcHVwIik7CiAgICAgICAgICB2YXIgcG9wdXBPcHRpb25zID0gZGYuZ2V0KGksICJwb3B1cE9wdGlvbnMiKTsKCiAgICAgICAgICBpZiAocG9wdXAgIT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKHBvcHVwT3B0aW9ucyAhPT0gbnVsbCkgewogICAgICAgICAgICAgIGxheWVyLmJpbmRQb3B1cChwb3B1cCwgcG9wdXBPcHRpb25zKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBsYXllci5iaW5kUG9wdXAocG9wdXApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAobGF5ZXIuYmluZFRvb2x0aXApIHsKICAgICAgICAgIHZhciBsYWJlbCA9IGRmLmdldChpLCAibGFiZWwiKTsKICAgICAgICAgIHZhciBsYWJlbE9wdGlvbnMgPSBkZi5nZXQoaSwgImxhYmVsT3B0aW9ucyIpOwoKICAgICAgICAgIGlmIChsYWJlbCAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAobGFiZWxPcHRpb25zICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgbGF5ZXIuYmluZFRvb2x0aXAobGFiZWwsIGxhYmVsT3B0aW9ucyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbGF5ZXIuYmluZFRvb2x0aXAobGFiZWwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBsYXllci5vbigiY2xpY2siLCBtb3VzZUhhbmRsZXIodGhpcy5pZCwgdGhpc0lkLCB0aGlzR3JvdXAsIGNhdGVnb3J5ICsgIl9jbGljayIpLCB0aGlzKTsKICAgICAgICBsYXllci5vbigibW91c2VvdmVyIiwgbW91c2VIYW5kbGVyKHRoaXMuaWQsIHRoaXNJZCwgdGhpc0dyb3VwLCBjYXRlZ29yeSArICJfbW91c2VvdmVyIiksIHRoaXMpOwogICAgICAgIGxheWVyLm9uKCJtb3VzZW91dCIsIG1vdXNlSGFuZGxlcih0aGlzLmlkLCB0aGlzSWQsIHRoaXNHcm91cCwgY2F0ZWdvcnkgKyAiX21vdXNlb3V0IiksIHRoaXMpOwogICAgICAgIHZhciBoaWdobGlnaHRTdHlsZSA9IGRmLmdldChpLCAiaGlnaGxpZ2h0T3B0aW9ucyIpOwoKICAgICAgICBpZiAoIV9qcXVlcnkyWyJkZWZhdWx0Il0uaXNFbXB0eU9iamVjdChoaWdobGlnaHRTdHlsZSkpIHsKICAgICAgICAgIHZhciBkZWZhdWx0U3R5bGUgPSB7fTsKCiAgICAgICAgICBfanF1ZXJ5MlsiZGVmYXVsdCJdLmVhY2goaGlnaGxpZ2h0U3R5bGUsIGZ1bmN0aW9uIChrLCB2KSB7CiAgICAgICAgICAgIGlmIChrICE9ICJicmluZ1RvRnJvbnQiICYmIGsgIT0gInNlbmRUb0JhY2siKSB7CiAgICAgICAgICAgICAgaWYgKGRmLmdldChpLCBrKSkgewogICAgICAgICAgICAgICAgZGVmYXVsdFN0eWxlW2tdID0gZGYuZ2V0KGksIGspOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSk7CgogICAgICAgICAgbGF5ZXIub24oIm1vdXNlb3ZlciIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHRoaXMuc2V0U3R5bGUoaGlnaGxpZ2h0U3R5bGUpOwoKICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFN0eWxlLmJyaW5nVG9Gcm9udCkgewogICAgICAgICAgICAgIHRoaXMuYnJpbmdUb0Zyb250KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgbGF5ZXIub24oIm1vdXNlb3V0IiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdGhpcy5zZXRTdHlsZShkZWZhdWx0U3R5bGUpOwoKICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFN0eWxlLnNlbmRUb0JhY2spIHsKICAgICAgICAgICAgICB0aGlzLmJyaW5nVG9CYWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfSkuY2FsbChtYXApOwogIH07CgogIGZvciAodmFyIGkgPSAwOyBpIDwgZGYubnJvdygpOyBpKyspIHsKICAgIF9sb29wMyhpKTsKICB9Cn0KCm1ldGhvZHMuYWRkR2VuZXJpY0xheWVycyA9IGFkZExheWVyczsKCm1ldGhvZHMuYWRkQ2lyY2xlcyA9IGZ1bmN0aW9uIChsYXQsIGxuZywgcmFkaXVzLCBsYXllcklkLCBncm91cCwgb3B0aW9ucywgcG9wdXAsIHBvcHVwT3B0aW9ucywgbGFiZWwsIGxhYmVsT3B0aW9ucywgaGlnaGxpZ2h0T3B0aW9ucywgY3Jvc3N0YWxrT3B0aW9ucykgewogIGlmICghKF9qcXVlcnkyWyJkZWZhdWx0Il0uaXNFbXB0eU9iamVjdChsYXQpIHx8IF9qcXVlcnkyWyJkZWZhdWx0Il0uaXNFbXB0eU9iamVjdChsbmcpKSB8fCBfanF1ZXJ5MlsiZGVmYXVsdCJdLmlzTnVtZXJpYyhsYXQpICYmIF9qcXVlcnkyWyJkZWZhdWx0Il0uaXNOdW1lcmljKGxuZykpIHsKICAgIHZhciBkZiA9IG5ldyBfZGF0YWZyYW1lMlsiZGVmYXVsdCJdKCkuY29sKCJsYXQiLCBsYXQpLmNvbCgibG5nIiwgbG5nKS5jb2woInJhZGl1cyIsIHJhZGl1cykuY29sKCJsYXllcklkIiwgbGF5ZXJJZCkuY29sKCJncm91cCIsIGdyb3VwKS5jb2woInBvcHVwIiwgcG9wdXApLmNvbCgicG9wdXBPcHRpb25zIiwgcG9wdXBPcHRpb25zKS5jb2woImxhYmVsIiwgbGFiZWwpLmNvbCgibGFiZWxPcHRpb25zIiwgbGFiZWxPcHRpb25zKS5jb2woImhpZ2hsaWdodE9wdGlvbnMiLCBoaWdobGlnaHRPcHRpb25zKS5jYmluZChvcHRpb25zKS5jYmluZChjcm9zc3RhbGtPcHRpb25zIHx8IHt9KTsKICAgIGFkZExheWVycyh0aGlzLCAic2hhcGUiLCBkZiwgZnVuY3Rpb24gKGRmLCBpKSB7CiAgICAgIGlmIChfanF1ZXJ5MlsiZGVmYXVsdCJdLmlzTnVtZXJpYyhkZi5nZXQoaSwgImxhdCIpKSAmJiBfanF1ZXJ5MlsiZGVmYXVsdCJdLmlzTnVtZXJpYyhkZi5nZXQoaSwgImxuZyIpKSAmJiBfanF1ZXJ5MlsiZGVmYXVsdCJdLmlzTnVtZXJpYyhkZi5nZXQoaSwgInJhZGl1cyIpKSkgewogICAgICAgIHJldHVybiBfbGVhZmxldDJbImRlZmF1bHQiXS5jaXJjbGUoW2RmLmdldChpLCAibGF0IiksIGRmLmdldChpLCAibG5nIildLCBkZi5nZXQoaSwgInJhZGl1cyIpLCBkZi5nZXQoaSkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9KTsKICB9Cn07CgptZXRob2RzLmFkZENpcmNsZU1hcmtlcnMgPSBmdW5jdGlvbiAobGF0LCBsbmcsIHJhZGl1cywgbGF5ZXJJZCwgZ3JvdXAsIG9wdGlvbnMsIGNsdXN0ZXJPcHRpb25zLCBjbHVzdGVySWQsIHBvcHVwLCBwb3B1cE9wdGlvbnMsIGxhYmVsLCBsYWJlbE9wdGlvbnMsIGNyb3NzdGFsa09wdGlvbnMpIHsKICBpZiAoIShfanF1ZXJ5MlsiZGVmYXVsdCJdLmlzRW1wdHlPYmplY3QobGF0KSB8fCBfanF1ZXJ5MlsiZGVmYXVsdCJdLmlzRW1wdHlPYmplY3QobG5nKSkgfHwgX2pxdWVyeTJbImRlZmF1bHQiXS5pc051bWVyaWMobGF0KSAmJiBfanF1ZXJ5MlsiZGVmYXVsdCJdLmlzTnVtZXJpYyhsbmcpKSB7CiAgICB2YXIgZGYgPSBuZXcgX2RhdGFmcmFtZTJbImRlZmF1bHQiXSgpLmNvbCgibGF0IiwgbGF0KS5jb2woImxuZyIsIGxuZykuY29sKCJyYWRpdXMiLCByYWRpdXMpLmNvbCgibGF5ZXJJZCIsIGxheWVySWQpLmNvbCgiZ3JvdXAiLCBncm91cCkuY29sKCJwb3B1cCIsIHBvcHVwKS5jb2woInBvcHVwT3B0aW9ucyIsIHBvcHVwT3B0aW9ucykuY29sKCJsYWJlbCIsIGxhYmVsKS5jb2woImxhYmVsT3B0aW9ucyIsIGxhYmVsT3B0aW9ucykuY2JpbmQoY3Jvc3N0YWxrT3B0aW9ucyB8fCB7fSkuY2JpbmQob3B0aW9ucyk7CiAgICBhZGRNYXJrZXJzKHRoaXMsIGRmLCBncm91cCwgY2x1c3Rlck9wdGlvbnMsIGNsdXN0ZXJJZCwgZnVuY3Rpb24gKGRmLCBpKSB7CiAgICAgIHJldHVybiBfbGVhZmxldDJbImRlZmF1bHQiXS5jaXJjbGVNYXJrZXIoW2RmLmdldChpLCAibGF0IiksIGRmLmdldChpLCAibG5nIildLCBkZi5nZXQoaSkpOwogICAgfSk7CiAgfQp9OwovKgogKiBAcGFyYW0gbGF0IEFycmF5IG9mIGFycmF5cyBvZiBsYXRpdHVkZSBjb29yZGluYXRlcyBmb3IgcG9seWxpbmVzCiAqIEBwYXJhbSBsbmcgQXJyYXkgb2YgYXJyYXlzIG9mIGxvbmdpdHVkZSBjb29yZGluYXRlcyBmb3IgcG9seWxpbmVzCiAqLwoKCm1ldGhvZHMuYWRkUG9seWxpbmVzID0gZnVuY3Rpb24gKHBvbHlnb25zLCBsYXllcklkLCBncm91cCwgb3B0aW9ucywgcG9wdXAsIHBvcHVwT3B0aW9ucywgbGFiZWwsIGxhYmVsT3B0aW9ucywgaGlnaGxpZ2h0T3B0aW9ucykgewogIGlmIChwb2x5Z29ucy5sZW5ndGggPiAwKSB7CiAgICB2YXIgZGYgPSBuZXcgX2RhdGFmcmFtZTJbImRlZmF1bHQiXSgpLmNvbCgic2hhcGVzIiwgcG9seWdvbnMpLmNvbCgibGF5ZXJJZCIsIGxheWVySWQpLmNvbCgiZ3JvdXAiLCBncm91cCkuY29sKCJwb3B1cCIsIHBvcHVwKS5jb2woInBvcHVwT3B0aW9ucyIsIHBvcHVwT3B0aW9ucykuY29sKCJsYWJlbCIsIGxhYmVsKS5jb2woImxhYmVsT3B0aW9ucyIsIGxhYmVsT3B0aW9ucykuY29sKCJoaWdobGlnaHRPcHRpb25zIiwgaGlnaGxpZ2h0T3B0aW9ucykuY2JpbmQob3B0aW9ucyk7CiAgICBhZGRMYXllcnModGhpcywgInNoYXBlIiwgZGYsIGZ1bmN0aW9uIChkZiwgaSkgewogICAgICB2YXIgc2hhcGVzID0gZGYuZ2V0KGksICJzaGFwZXMiKTsKICAgICAgc2hhcGVzID0gc2hhcGVzLm1hcChmdW5jdGlvbiAoc2hhcGUpIHsKICAgICAgICByZXR1cm4gX2h0bWx3aWRnZXRzMlsiZGVmYXVsdCJdLmRhdGFmcmFtZVRvRDMoc2hhcGVbMF0pOwogICAgICB9KTsKCiAgICAgIGlmIChzaGFwZXMubGVuZ3RoID4gMSkgewogICAgICAgIHJldHVybiBfbGVhZmxldDJbImRlZmF1bHQiXS5wb2x5bGluZShzaGFwZXMsIGRmLmdldChpKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIF9sZWFmbGV0MlsiZGVmYXVsdCJdLnBvbHlsaW5lKHNoYXBlc1swXSwgZGYuZ2V0KGkpKTsKICAgICAgfQogICAgfSk7CiAgfQp9OwoKbWV0aG9kcy5yZW1vdmVNYXJrZXIgPSBmdW5jdGlvbiAobGF5ZXJJZCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLnJlbW92ZUxheWVyKCJtYXJrZXIiLCBsYXllcklkKTsKfTsKCm1ldGhvZHMuY2xlYXJNYXJrZXJzID0gZnVuY3Rpb24gKCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLmNsZWFyTGF5ZXJzKCJtYXJrZXIiKTsKfTsKCm1ldGhvZHMucmVtb3ZlTWFya2VyQ2x1c3RlciA9IGZ1bmN0aW9uIChsYXllcklkKSB7CiAgdGhpcy5sYXllck1hbmFnZXIucmVtb3ZlTGF5ZXIoImNsdXN0ZXIiLCBsYXllcklkKTsKfTsKCm1ldGhvZHMucmVtb3ZlTWFya2VyRnJvbUNsdXN0ZXIgPSBmdW5jdGlvbiAobGF5ZXJJZCwgY2x1c3RlcklkKSB7CiAgdmFyIGNsdXN0ZXIgPSB0aGlzLmxheWVyTWFuYWdlci5nZXRMYXllcigiY2x1c3RlciIsIGNsdXN0ZXJJZCk7CiAgaWYgKCFjbHVzdGVyKSByZXR1cm47CiAgY2x1c3Rlci5jbHVzdGVyTGF5ZXJTdG9yZS5yZW1vdmUobGF5ZXJJZCk7Cn07CgptZXRob2RzLmNsZWFyTWFya2VyQ2x1c3RlcnMgPSBmdW5jdGlvbiAoKSB7CiAgdGhpcy5sYXllck1hbmFnZXIuY2xlYXJMYXllcnMoImNsdXN0ZXIiKTsKfTsKCm1ldGhvZHMucmVtb3ZlU2hhcGUgPSBmdW5jdGlvbiAobGF5ZXJJZCkgewogIHRoaXMubGF5ZXJNYW5hZ2VyLnJlbW92ZUxheWVyKCJzaGFwZSIsIGxheWVySWQpOwp9OwoKbWV0aG9kcy5jbGVhclNoYXBlcyA9IGZ1bmN0aW9uICgpIHsKICB0aGlzLmxheWVyTWFuYWdlci5jbGVhckxheWVycygic2hhcGUiKTsKfTsKCm1ldGhvZHMuYWRkUmVjdGFuZ2xlcyA9IGZ1bmN0aW9uIChsYXQxLCBsbmcxLCBsYXQyLCBsbmcyLCBsYXllcklkLCBncm91cCwgb3B0aW9ucywgcG9wdXAsIHBvcHVwT3B0aW9ucywgbGFiZWwsIGxhYmVsT3B0aW9ucywgaGlnaGxpZ2h0T3B0aW9ucykgewogIHZhciBkZiA9IG5ldyBfZGF0YWZyYW1lMlsiZGVmYXVsdCJdKCkuY29sKCJsYXQxIiwgbGF0MSkuY29sKCJsbmcxIiwgbG5nMSkuY29sKCJsYXQyIiwgbGF0MikuY29sKCJsbmcyIiwgbG5nMikuY29sKCJsYXllcklkIiwgbGF5ZXJJZCkuY29sKCJncm91cCIsIGdyb3VwKS5jb2woInBvcHVwIiwgcG9wdXApLmNvbCgicG9wdXBPcHRpb25zIiwgcG9wdXBPcHRpb25zKS5jb2woImxhYmVsIiwgbGFiZWwpLmNvbCgibGFiZWxPcHRpb25zIiwgbGFiZWxPcHRpb25zKS5jb2woImhpZ2hsaWdodE9wdGlvbnMiLCBoaWdobGlnaHRPcHRpb25zKS5jYmluZChvcHRpb25zKTsKICBhZGRMYXllcnModGhpcywgInNoYXBlIiwgZGYsIGZ1bmN0aW9uIChkZiwgaSkgewogICAgaWYgKF9qcXVlcnkyWyJkZWZhdWx0Il0uaXNOdW1lcmljKGRmLmdldChpLCAibGF0MSIpKSAmJiBfanF1ZXJ5MlsiZGVmYXVsdCJdLmlzTnVtZXJpYyhkZi5nZXQoaSwgImxuZzEiKSkgJiYgX2pxdWVyeTJbImRlZmF1bHQiXS5pc051bWVyaWMoZGYuZ2V0KGksICJsYXQyIikpICYmIF9qcXVlcnkyWyJkZWZhdWx0Il0uaXNOdW1lcmljKGRmLmdldChpLCAibG5nMiIpKSkgewogICAgICByZXR1cm4gX2xlYWZsZXQyWyJkZWZhdWx0Il0ucmVjdGFuZ2xlKFtbZGYuZ2V0KGksICJsYXQxIiksIGRmLmdldChpLCAibG5nMSIpXSwgW2RmLmdldChpLCAibGF0MiIpLCBkZi5nZXQoaSwgImxuZzIiKV1dLCBkZi5nZXQoaSkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfSk7Cn07Ci8qCiAqIEBwYXJhbSBsYXQgQXJyYXkgb2YgYXJyYXlzIG9mIGxhdGl0dWRlIGNvb3JkaW5hdGVzIGZvciBwb2x5Z29ucwogKiBAcGFyYW0gbG5nIEFycmF5IG9mIGFycmF5cyBvZiBsb25naXR1ZGUgY29vcmRpbmF0ZXMgZm9yIHBvbHlnb25zCiAqLwoKCm1ldGhvZHMuYWRkUG9seWdvbnMgPSBmdW5jdGlvbiAocG9seWdvbnMsIGxheWVySWQsIGdyb3VwLCBvcHRpb25zLCBwb3B1cCwgcG9wdXBPcHRpb25zLCBsYWJlbCwgbGFiZWxPcHRpb25zLCBoaWdobGlnaHRPcHRpb25zKSB7CiAgaWYgKHBvbHlnb25zLmxlbmd0aCA+IDApIHsKICAgIHZhciBkZiA9IG5ldyBfZGF0YWZyYW1lMlsiZGVmYXVsdCJdKCkuY29sKCJzaGFwZXMiLCBwb2x5Z29ucykuY29sKCJsYXllcklkIiwgbGF5ZXJJZCkuY29sKCJncm91cCIsIGdyb3VwKS5jb2woInBvcHVwIiwgcG9wdXApLmNvbCgicG9wdXBPcHRpb25zIiwgcG9wdXBPcHRpb25zKS5jb2woImxhYmVsIiwgbGFiZWwpLmNvbCgibGFiZWxPcHRpb25zIiwgbGFiZWxPcHRpb25zKS5jb2woImhpZ2hsaWdodE9wdGlvbnMiLCBoaWdobGlnaHRPcHRpb25zKS5jYmluZChvcHRpb25zKTsKICAgIGFkZExheWVycyh0aGlzLCAic2hhcGUiLCBkZiwgZnVuY3Rpb24gKGRmLCBpKSB7CiAgICAgIC8vIFRoaXMgY29kZSB1c2VkIHRvIHVzZSBMLm11bHRpUG9seWdvbiwgYnV0IHRoYXQgY2F1c2VkCiAgICAgIC8vIGRvdWJsZS1jbGljayBvbiBhIG11bHRpcG9seWdvbiB0byBmYWlsIHRvIHpvb20gaW4gb24gdGhlCiAgICAgIC8vIG1hcC4gU3VycHJpc2luZ2x5LCBwdXR0aW5nIGFsbCB0aGUgcmluZ3MgaW4gYSBzaW5nbGUKICAgICAgLy8gcG9seWdvbiBzZWVtcyB0byBzdGlsbCB3b3JrOyBjb21wbGljYXRlZCBtdWx0aXBvbHlnb25zCiAgICAgIC8vIGFyZSBzdGlsbCByZW5kZXJlZCBjb3JyZWN0bHkuCiAgICAgIHZhciBzaGFwZXMgPSBkZi5nZXQoaSwgInNoYXBlcyIpLm1hcChmdW5jdGlvbiAocG9seWdvbikgewogICAgICAgIHJldHVybiBwb2x5Z29uLm1hcChfaHRtbHdpZGdldHMyWyJkZWZhdWx0Il0uZGF0YWZyYW1lVG9EMyk7CiAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCB2YWwpIHsKICAgICAgICByZXR1cm4gYWNjLmNvbmNhdCh2YWwpOwogICAgICB9LCBbXSk7CiAgICAgIHJldHVybiBfbGVhZmxldDJbImRlZmF1bHQiXS5wb2x5Z29uKHNoYXBlcywgZGYuZ2V0KGkpKTsKICAgIH0pOwogIH0KfTsKCm1ldGhvZHMuYWRkR2VvSlNPTiA9IGZ1bmN0aW9uIChkYXRhLCBsYXllcklkLCBncm91cCwgc3R5bGUpIHsKICAvLyBUaGlzIHRpbWUsIHNlbGYgaXMgYWN0dWFsbHkgbmVlZGVkIGJlY2F1c2UgdGhlIGNhbGxiYWNrcyBiZWxvdyBuZWVkCiAgLy8gdG8gYWNjZXNzIGJvdGggdGhlIGlubmVyIGFuZCBvdXRlciBzZW5zZXMgb2YgInRoaXMiCiAgdmFyIHNlbGYgPSB0aGlzOwoKICBpZiAodHlwZW9mIGRhdGEgPT09ICJzdHJpbmciKSB7CiAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTsKICB9CgogIHZhciBnbG9iYWxTdHlsZSA9IF9qcXVlcnkyWyJkZWZhdWx0Il0uZXh0ZW5kKHt9LCBzdHlsZSwgZGF0YS5zdHlsZSB8fCB7fSk7CgogIHZhciBnamxheWVyID0gX2xlYWZsZXQyWyJkZWZhdWx0Il0uZ2VvSnNvbihkYXRhLCB7CiAgICBzdHlsZTogZnVuY3Rpb24gc3R5bGUoZmVhdHVyZSkgewogICAgICBpZiAoZmVhdHVyZS5zdHlsZSB8fCBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpIHsKICAgICAgICByZXR1cm4gX2pxdWVyeTJbImRlZmF1bHQiXS5leHRlbmQoe30sIGdsb2JhbFN0eWxlLCBmZWF0dXJlLnN0eWxlLCBmZWF0dXJlLnByb3BlcnRpZXMuc3R5bGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBnbG9iYWxTdHlsZTsKICAgICAgfQogICAgfSwKICAgIG9uRWFjaEZlYXR1cmU6IGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHsKICAgICAgdmFyIGV4dHJhSW5mbyA9IHsKICAgICAgICBmZWF0dXJlSWQ6IGZlYXR1cmUuaWQsCiAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzCiAgICAgIH07CiAgICAgIHZhciBwb3B1cCA9IGZlYXR1cmUucHJvcGVydGllcyA/IGZlYXR1cmUucHJvcGVydGllcy5wb3B1cCA6IG51bGw7CiAgICAgIGlmICh0eXBlb2YgcG9wdXAgIT09ICJ1bmRlZmluZWQiICYmIHBvcHVwICE9PSBudWxsKSBsYXllci5iaW5kUG9wdXAocG9wdXApOwogICAgICBsYXllci5vbigiY2xpY2siLCBtb3VzZUhhbmRsZXIoc2VsZi5pZCwgbGF5ZXJJZCwgZ3JvdXAsICJnZW9qc29uX2NsaWNrIiwgZXh0cmFJbmZvKSwgdGhpcyk7CiAgICAgIGxheWVyLm9uKCJtb3VzZW92ZXIiLCBtb3VzZUhhbmRsZXIoc2VsZi5pZCwgbGF5ZXJJZCwgZ3JvdXAsICJnZW9qc29uX21vdXNlb3ZlciIsIGV4dHJhSW5mbyksIHRoaXMpOwogICAgICBsYXllci5vbigibW91c2VvdXQiLCBtb3VzZUhhbmRsZXIoc2VsZi5pZCwgbGF5ZXJJZCwgZ3JvdXAsICJnZW9qc29uX21vdXNlb3V0IiwgZXh0cmFJbmZvKSwgdGhpcyk7CiAgICB9CiAgfSk7CgogIHRoaXMubGF5ZXJNYW5hZ2VyLmFkZExheWVyKGdqbGF5ZXIsICJnZW9qc29uIiwgbGF5ZXJJZCwgZ3JvdXApOwp9OwoKbWV0aG9kcy5yZW1vdmVHZW9KU09OID0gZnVuY3Rpb24gKGxheWVySWQpIHsKICB0aGlzLmxheWVyTWFuYWdlci5yZW1vdmVMYXllcigiZ2VvanNvbiIsIGxheWVySWQpOwp9OwoKbWV0aG9kcy5jbGVhckdlb0pTT04gPSBmdW5jdGlvbiAoKSB7CiAgdGhpcy5sYXllck1hbmFnZXIuY2xlYXJMYXllcnMoImdlb2pzb24iKTsKfTsKCm1ldGhvZHMuYWRkVG9wb0pTT04gPSBmdW5jdGlvbiAoZGF0YSwgbGF5ZXJJZCwgZ3JvdXAsIHN0eWxlKSB7CiAgLy8gVGhpcyB0aW1lLCBzZWxmIGlzIGFjdHVhbGx5IG5lZWRlZCBiZWNhdXNlIHRoZSBjYWxsYmFja3MgYmVsb3cgbmVlZAogIC8vIHRvIGFjY2VzcyBib3RoIHRoZSBpbm5lciBhbmQgb3V0ZXIgc2Vuc2VzIG9mICJ0aGlzIgogIHZhciBzZWxmID0gdGhpczsKCiAgaWYgKHR5cGVvZiBkYXRhID09PSAic3RyaW5nIikgewogICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7CiAgfQoKICB2YXIgZ2xvYmFsU3R5bGUgPSBfanF1ZXJ5MlsiZGVmYXVsdCJdLmV4dGVuZCh7fSwgc3R5bGUsIGRhdGEuc3R5bGUgfHwge30pOwoKICB2YXIgZ2psYXllciA9IF9sZWFmbGV0MlsiZGVmYXVsdCJdLmdlb0pzb24obnVsbCwgewogICAgc3R5bGU6IGZ1bmN0aW9uIHN0eWxlKGZlYXR1cmUpIHsKICAgICAgaWYgKGZlYXR1cmUuc3R5bGUgfHwgZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKSB7CiAgICAgICAgcmV0dXJuIF9qcXVlcnkyWyJkZWZhdWx0Il0uZXh0ZW5kKHt9LCBnbG9iYWxTdHlsZSwgZmVhdHVyZS5zdHlsZSwgZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZ2xvYmFsU3R5bGU7CiAgICAgIH0KICAgIH0sCiAgICBvbkVhY2hGZWF0dXJlOiBmdW5jdGlvbiBvbkVhY2hGZWF0dXJlKGZlYXR1cmUsIGxheWVyKSB7CiAgICAgIHZhciBleHRyYUluZm8gPSB7CiAgICAgICAgZmVhdHVyZUlkOiBmZWF0dXJlLmlkLAogICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcwogICAgICB9OwogICAgICB2YXIgcG9wdXAgPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXA7CiAgICAgIGlmICh0eXBlb2YgcG9wdXAgIT09ICJ1bmRlZmluZWQiICYmIHBvcHVwICE9PSBudWxsKSBsYXllci5iaW5kUG9wdXAocG9wdXApOwogICAgICBsYXllci5vbigiY2xpY2siLCBtb3VzZUhhbmRsZXIoc2VsZi5pZCwgbGF5ZXJJZCwgZ3JvdXAsICJ0b3BvanNvbl9jbGljayIsIGV4dHJhSW5mbyksIHRoaXMpOwogICAgICBsYXllci5vbigibW91c2VvdmVyIiwgbW91c2VIYW5kbGVyKHNlbGYuaWQsIGxheWVySWQsIGdyb3VwLCAidG9wb2pzb25fbW91c2VvdmVyIiwgZXh0cmFJbmZvKSwgdGhpcyk7CiAgICAgIGxheWVyLm9uKCJtb3VzZW91dCIsIG1vdXNlSGFuZGxlcihzZWxmLmlkLCBsYXllcklkLCBncm91cCwgInRvcG9qc29uX21vdXNlb3V0IiwgZXh0cmFJbmZvKSwgdGhpcyk7CiAgICB9CiAgfSk7CgogIGdsb2JhbC5vbW5pdm9yZS50b3BvanNvbi5wYXJzZShkYXRhLCBudWxsLCBnamxheWVyKTsKICB0aGlzLmxheWVyTWFuYWdlci5hZGRMYXllcihnamxheWVyLCAidG9wb2pzb24iLCBsYXllcklkLCBncm91cCk7Cn07CgptZXRob2RzLnJlbW92ZVRvcG9KU09OID0gZnVuY3Rpb24gKGxheWVySWQpIHsKICB0aGlzLmxheWVyTWFuYWdlci5yZW1vdmVMYXllcigidG9wb2pzb24iLCBsYXllcklkKTsKfTsKCm1ldGhvZHMuY2xlYXJUb3BvSlNPTiA9IGZ1bmN0aW9uICgpIHsKICB0aGlzLmxheWVyTWFuYWdlci5jbGVhckxheWVycygidG9wb2pzb24iKTsKfTsKCm1ldGhvZHMuYWRkQ29udHJvbCA9IGZ1bmN0aW9uIChodG1sLCBwb3NpdGlvbiwgbGF5ZXJJZCwgY2xhc3NlcykgewogIGZ1bmN0aW9uIG9uQWRkKG1hcCkgewogICAgdmFyIGRpdiA9IF9sZWFmbGV0MlsiZGVmYXVsdCJdLkRvbVV0aWwuY3JlYXRlKCJkaXYiLCBjbGFzc2VzKTsKCiAgICBpZiAodHlwZW9mIGxheWVySWQgIT09ICJ1bmRlZmluZWQiICYmIGxheWVySWQgIT09IG51bGwpIHsKICAgICAgZGl2LnNldEF0dHJpYnV0ZSgiaWQiLCBsYXllcklkKTsKICAgIH0KCiAgICB0aGlzLl9kaXYgPSBkaXY7IC8vIEl0J3MgcG9zc2libGUgZm9yIHdpbmRvdy5TaGlueSB0byBiZSB0cnVlIGJ1dCBTaGlueS5pbml0aWFsaXplSW5wdXRzIHRvCiAgICAvLyBub3QgYmUsIHdoZW4gYSBzdGF0aWMgbGVhZmxldCB3aWRnZXQgaXMgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGUgc2hpbnkKICAgIC8vIFVJIGRpcmVjdGx5IChub3QgdGhyb3VnaCBsZWFmbGV0T3V0cHV0IG9yIHVpT3V0cHV0KS4gSW4gdGhpcyBjYXNlIHdlCiAgICAvLyBkb24ndCBkbyB0aGUgbm9ybWFsIFNoaW55IHN0dWZmIGFzIHRoYXQgd2lsbCBhbGwgaGFwcGVuIHdoZW4gU2hpbnkKICAgIC8vIGl0c2VsZiBsb2FkcyBhbmQgYmluZHMgdGhlIGVudGlyZSBkb2MuCgogICAgaWYgKHdpbmRvdy5TaGlueSAmJiBfc2hpbnkyWyJkZWZhdWx0Il0uaW5pdGlhbGl6ZUlucHV0cykgewogICAgICBfc2hpbnkyWyJkZWZhdWx0Il0ucmVuZGVySHRtbChodG1sLCB0aGlzLl9kaXYpOwoKICAgICAgX3NoaW55MlsiZGVmYXVsdCJdLmluaXRpYWxpemVJbnB1dHModGhpcy5fZGl2KTsKCiAgICAgIF9zaGlueTJbImRlZmF1bHQiXS5iaW5kQWxsKHRoaXMuX2Rpdik7CiAgICB9IGVsc2UgewogICAgICB0aGlzLl9kaXYuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KCiAgICByZXR1cm4gdGhpcy5fZGl2OwogIH0KCiAgZnVuY3Rpb24gb25SZW1vdmUobWFwKSB7CiAgICBpZiAod2luZG93LlNoaW55ICYmIF9zaGlueTJbImRlZmF1bHQiXS51bmJpbmRBbGwpIHsKICAgICAgX3NoaW55MlsiZGVmYXVsdCJdLnVuYmluZEFsbCh0aGlzLl9kaXYpOwogICAgfQogIH0KCiAgdmFyIENvbnRyb2wgPSBfbGVhZmxldDJbImRlZmF1bHQiXS5Db250cm9sLmV4dGVuZCh7CiAgICBvcHRpb25zOiB7CiAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbgogICAgfSwKICAgIG9uQWRkOiBvbkFkZCwKICAgIG9uUmVtb3ZlOiBvblJlbW92ZQogIH0pOwoKICB0aGlzLmNvbnRyb2xzLmFkZChuZXcgQ29udHJvbCgpLCBsYXllcklkLCBodG1sKTsKfTsKCm1ldGhvZHMuYWRkQ3VzdG9tQ29udHJvbCA9IGZ1bmN0aW9uIChjb250cm9sLCBsYXllcklkKSB7CiAgdGhpcy5jb250cm9scy5hZGQoY29udHJvbCwgbGF5ZXJJZCk7Cn07CgptZXRob2RzLnJlbW92ZUNvbnRyb2wgPSBmdW5jdGlvbiAobGF5ZXJJZCkgewogIHRoaXMuY29udHJvbHMucmVtb3ZlKGxheWVySWQpOwp9OwoKbWV0aG9kcy5nZXRDb250cm9sID0gZnVuY3Rpb24gKGxheWVySWQpIHsKICB0aGlzLmNvbnRyb2xzLmdldChsYXllcklkKTsKfTsKCm1ldGhvZHMuY2xlYXJDb250cm9scyA9IGZ1bmN0aW9uICgpIHsKICB0aGlzLmNvbnRyb2xzLmNsZWFyKCk7Cn07CgptZXRob2RzLmFkZExlZ2VuZCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgdmFyIGxlZ2VuZCA9IF9sZWFmbGV0MlsiZGVmYXVsdCJdLmNvbnRyb2woewogICAgcG9zaXRpb246IG9wdGlvbnMucG9zaXRpb24KICB9KTsKCiAgdmFyIGdyYWRTcGFuOwoKICBsZWdlbmQub25BZGQgPSBmdW5jdGlvbiAobWFwKSB7CiAgICB2YXIgZGl2ID0gX2xlYWZsZXQyWyJkZWZhdWx0Il0uRG9tVXRpbC5jcmVhdGUoImRpdiIsIG9wdGlvbnMuY2xhc3NOYW1lKSwKICAgICAgICBjb2xvcnMgPSBvcHRpb25zLmNvbG9ycywKICAgICAgICBsYWJlbHMgPSBvcHRpb25zLmxhYmVscywKICAgICAgICBsZWdlbmRIVE1MID0gIiI7CgogICAgaWYgKG9wdGlvbnMudHlwZSA9PT0gIm51bWVyaWMiKSB7CiAgICAgIC8vICMgRm9ybWF0dGluZyBjb25zdGFudHMuCiAgICAgIHZhciBzaW5nbGVCaW5IZWlnaHQgPSAyMDsgLy8gVGhlIGRpc3RhbmNlIGJldHdlZW4gdGljayBtYXJrcywgaW4gcHgKCiAgICAgIHZhciB2TWFyZ2luID0gODsgLy8gSWYgMXN0IHRpY2sgbWFyayBzdGFydHMgYXQgdG9wIG9mIGdyYWRpZW50LCBob3cKICAgICAgLy8gbWFueSBleHRyYSBweCBhcmUgbmVlZGVkIGZvciB0aGUgdG9wIGhhbGYgb2YgdGhlCiAgICAgIC8vIDFzdCBsYWJlbD8gKGRpdHRvIGZvciBsYXN0IHRpY2sgbWFyay9sYWJlbCkKCiAgICAgIHZhciB0aWNrV2lkdGggPSA0OyAvLyBIb3cgd2lkZSBzaG91bGQgdGljayBtYXJrcyBiZSwgaW4gcHg/CgogICAgICB2YXIgbGFiZWxQYWRkaW5nID0gNjsgLy8gSG93IG11Y2ggZGlzdGFuY2UgdG8gcmVzZXJ2ZSBmb3IgdGljayBtYXJrPwogICAgICAvLyAoTXVzdCBiZSA+PSB0aWNrV2lkdGgpCiAgICAgIC8vICMgRGVyaXZlZCBmb3JtYXR0aW5nIHBhcmFtZXRlcnMuCiAgICAgIC8vIFdoYXQncyB0aGUgaGVpZ2h0IG9mIGEgc2luZ2xlIGJpbiwgaW4gcGVyY2VudGFnZSAob2YgZ3JhZGllbnQgaGVpZ2h0KT8KICAgICAgLy8gSXQgbWlnaHQgbm90IGp1c3QgYmUgMS8obi0xKSwgaWYgdGhlIGdyYWRpZW50IGV4dGVuZHMgcGFzdCB0aGUgdGljawogICAgICAvLyBtYXJrcyAod2hpY2ggY2FuIGJlIHRoZSBjYXNlIGZvciBwcmV0dHkgY3V0IHBvaW50cykuCgogICAgICB2YXIgc2luZ2xlQmluUGN0ID0gKG9wdGlvbnMuZXh0cmEucF9uIC0gb3B0aW9ucy5leHRyYS5wXzEpIC8gKGxhYmVscy5sZW5ndGggLSAxKTsgLy8gRWFjaCBiaW4gaXMgYHNpbmdsZUJpbkhlaWdodGAgaGlnaC4gSG93IHRhbGwgaXMgdGhlIGdyYWRpZW50PwoKICAgICAgdmFyIHRvdGFsSGVpZ2h0ID0gMSAvIHNpbmdsZUJpblBjdCAqIHNpbmdsZUJpbkhlaWdodCArIDE7IC8vIEhvdyBmYXIgc2hvdWxkIHRoZSBmaXJzdCB0aWNrIGJlIHNoaWZ0ZWQgZG93biwgcmVsYXRpdmUgdG8gdGhlIHRvcAogICAgICAvLyBvZiB0aGUgZ3JhZGllbnQ/CgogICAgICB2YXIgdGlja09mZnNldCA9IHNpbmdsZUJpbkhlaWdodCAvIHNpbmdsZUJpblBjdCAqIG9wdGlvbnMuZXh0cmEucF8xOwogICAgICBncmFkU3BhbiA9ICgwLCBfanF1ZXJ5MlsiZGVmYXVsdCJdKSgiPHNwYW4vPiIpLmNzcyh7CiAgICAgICAgImJhY2tncm91bmQiOiAibGluZWFyLWdyYWRpZW50KCIgKyBjb2xvcnMgKyAiKSIsCiAgICAgICAgIm9wYWNpdHkiOiBvcHRpb25zLm9wYWNpdHksCiAgICAgICAgImhlaWdodCI6IHRvdGFsSGVpZ2h0ICsgInB4IiwKICAgICAgICAid2lkdGgiOiAiMThweCIsCiAgICAgICAgImRpc3BsYXkiOiAiYmxvY2siLAogICAgICAgICJtYXJnaW4tdG9wIjogdk1hcmdpbiArICJweCIKICAgICAgfSk7CiAgICAgIHZhciBsZWZ0RGl2ID0gKDAsIF9qcXVlcnkyWyJkZWZhdWx0Il0pKCI8ZGl2Lz4iKS5jc3MoImZsb2F0IiwgImxlZnQiKSwKICAgICAgICAgIHJpZ2h0RGl2ID0gKDAsIF9qcXVlcnkyWyJkZWZhdWx0Il0pKCI8ZGl2Lz4iKS5jc3MoImZsb2F0IiwgImxlZnQiKTsKICAgICAgbGVmdERpdi5hcHBlbmQoZ3JhZFNwYW4pOwogICAgICAoMCwgX2pxdWVyeTJbImRlZmF1bHQiXSkoZGl2KS5hcHBlbmQobGVmdERpdikuYXBwZW5kKHJpZ2h0RGl2KS5hcHBlbmQoKDAsIF9qcXVlcnkyWyJkZWZhdWx0Il0pKCI8YnI+IikpOyAvLyBIYXZlIHRvIGF0dGFjaCB0aGUgZGl2IHRvIHRoZSBib2R5IGF0IHRoaXMgZWFybHkgcG9pbnQsIHNvIHRoYXQgdGhlCiAgICAgIC8vIHN2ZyB0ZXh0IGdldENvbXB1dGVkVGV4dExlbmd0aCgpIGFjdHVhbGx5IHdvcmtzLCBiZWxvdy4KCiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTsKICAgICAgdmFyIG5zID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjsKICAgICAgdmFyIHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhucywgInN2ZyIpOwogICAgICByaWdodERpdi5hcHBlbmQoc3ZnKTsKICAgICAgdmFyIGcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobnMsICJnIik7CiAgICAgICgwLCBfanF1ZXJ5MlsiZGVmYXVsdCJdKShnKS5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKDAsICIgKyB2TWFyZ2luICsgIikiKTsKICAgICAgc3ZnLmFwcGVuZENoaWxkKGcpOyAvLyBtYXggbGFiZWwgd2lkdGggbmVlZGVkIHRvIHNldCB3aWR0aCBvZiBzdmcsIGFuZCByaWdodC1qdXN0aWZ5IHRleHQKCiAgICAgIHZhciBtYXhMYmxXaWR0aCA9IDA7IC8vIENyZWF0ZSB0aWNrIG1hcmtzIGFuZCBsYWJlbHMKCiAgICAgIF9qcXVlcnkyWyJkZWZhdWx0Il0uZWFjaChsYWJlbHMsIGZ1bmN0aW9uIChpLCBsYWJlbCkgewogICAgICAgIHZhciB5ID0gdGlja09mZnNldCArIGkgKiBzaW5nbGVCaW5IZWlnaHQgKyAwLjU7CiAgICAgICAgdmFyIHRoaXNMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhucywgInRleHQiKTsKICAgICAgICAoMCwgX2pxdWVyeTJbImRlZmF1bHQiXSkodGhpc0xhYmVsKS50ZXh0KGxhYmVsc1tpXSkuYXR0cigieSIsIHkpLmF0dHIoImR4IiwgbGFiZWxQYWRkaW5nKS5hdHRyKCJkeSIsICIwLjVleCIpOwogICAgICAgIGcuYXBwZW5kQ2hpbGQodGhpc0xhYmVsKTsKICAgICAgICBtYXhMYmxXaWR0aCA9IE1hdGgubWF4KG1heExibFdpZHRoLCB0aGlzTGFiZWwuZ2V0Q29tcHV0ZWRUZXh0TGVuZ3RoKCkpOwogICAgICAgIHZhciB0aGlzVGljayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhucywgImxpbmUiKTsKICAgICAgICAoMCwgX2pxdWVyeTJbImRlZmF1bHQiXSkodGhpc1RpY2spLmF0dHIoIngxIiwgMCkuYXR0cigieDIiLCB0aWNrV2lkdGgpLmF0dHIoInkxIiwgeSkuYXR0cigieTIiLCB5KS5hdHRyKCJzdHJva2Utd2lkdGgiLCAxKTsKICAgICAgICBnLmFwcGVuZENoaWxkKHRoaXNUaWNrKTsKICAgICAgfSk7IC8vIE5vdyB0aGF0IHdlIGtub3cgdGhlIG1heCBsYWJlbCB3aWR0aCwgd2UgY2FuIHJpZ2h0LWp1c3RpZnkKCgogICAgICAoMCwgX2pxdWVyeTJbImRlZmF1bHQiXSkoc3ZnKS5maW5kKCJ0ZXh0IikuYXR0cigiZHgiLCBsYWJlbFBhZGRpbmcgKyBtYXhMYmxXaWR0aCkuYXR0cigidGV4dC1hbmNob3IiLCAiZW5kIik7IC8vIEZpbmFsIHNpemUgZm9yIDxzdmc+CgogICAgICAoMCwgX2pxdWVyeTJbImRlZmF1bHQiXSkoc3ZnKS5jc3MoewogICAgICAgIHdpZHRoOiBtYXhMYmxXaWR0aCArIGxhYmVsUGFkZGluZyArICJweCIsCiAgICAgICAgaGVpZ2h0OiB0b3RhbEhlaWdodCArIHZNYXJnaW4gKiAyICsgInB4IgogICAgICB9KTsKCiAgICAgIGlmIChvcHRpb25zLm5hX2NvbG9yICYmIF9qcXVlcnkyWyJkZWZhdWx0Il0uaW5BcnJheShvcHRpb25zLm5hX2xhYmVsLCBsYWJlbHMpIDwgMCkgewogICAgICAgICgwLCBfanF1ZXJ5MlsiZGVmYXVsdCJdKShkaXYpLmFwcGVuZCgiPGRpdj48aSBzdHlsZT1cIiIgKyAiYmFja2dyb3VuZDoiICsgb3B0aW9ucy5uYV9jb2xvciArICI7b3BhY2l0eToiICsgb3B0aW9ucy5vcGFjaXR5ICsgIjttYXJnaW4tcmlnaHQ6IiArIGxhYmVsUGFkZGluZyArICJweCIgKyAiO1wiPjwvaT4iICsgb3B0aW9ucy5uYV9sYWJlbCArICI8L2Rpdj4iKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKG9wdGlvbnMubmFfY29sb3IgJiYgX2pxdWVyeTJbImRlZmF1bHQiXS5pbkFycmF5KG9wdGlvbnMubmFfbGFiZWwsIGxhYmVscykgPCAwKSB7CiAgICAgICAgY29sb3JzLnB1c2gob3B0aW9ucy5uYV9jb2xvcik7CiAgICAgICAgbGFiZWxzLnB1c2gob3B0aW9ucy5uYV9sYWJlbCk7CiAgICAgIH0KCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGVnZW5kSFRNTCArPSAiPGkgc3R5bGU9XCJiYWNrZ3JvdW5kOiIgKyBjb2xvcnNbaV0gKyAiO29wYWNpdHk6IiArIG9wdGlvbnMub3BhY2l0eSArICJcIj48L2k+ICIgKyBsYWJlbHNbaV0gKyAiPGJyPiI7CiAgICAgIH0KCiAgICAgIGRpdi5pbm5lckhUTUwgPSBsZWdlbmRIVE1MOwogICAgfQoKICAgIGlmIChvcHRpb25zLnRpdGxlKSAoMCwgX2pxdWVyeTJbImRlZmF1bHQiXSkoZGl2KS5wcmVwZW5kKCI8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTozcHhcIj48c3Ryb25nPiIgKyBvcHRpb25zLnRpdGxlICsgIjwvc3Ryb25nPjwvZGl2PiIpOwogICAgcmV0dXJuIGRpdjsKICB9OwoKICBpZiAob3B0aW9ucy5ncm91cCkgewogICAgLy8gQXV0byBnZW5lcmF0ZSBhIGxheWVySUQgaWYgbm90IHByb3ZpZGVkCiAgICBpZiAoIW9wdGlvbnMubGF5ZXJJZCkgewogICAgICBvcHRpb25zLmxheWVySWQgPSBfbGVhZmxldDJbImRlZmF1bHQiXS5VdGlsLnN0YW1wKGxlZ2VuZCk7CiAgICB9CgogICAgdmFyIG1hcCA9IHRoaXM7CiAgICBtYXAub24oIm92ZXJsYXlhZGQiLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoZS5uYW1lID09PSBvcHRpb25zLmdyb3VwKSB7CiAgICAgICAgbWFwLmNvbnRyb2xzLmFkZChsZWdlbmQsIG9wdGlvbnMubGF5ZXJJZCk7CiAgICAgIH0KICAgIH0pOwogICAgbWFwLm9uKCJvdmVybGF5cmVtb3ZlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgaWYgKGUubmFtZSA9PT0gb3B0aW9ucy5ncm91cCkgewogICAgICAgIG1hcC5jb250cm9scy5yZW1vdmUob3B0aW9ucy5sYXllcklkKTsKICAgICAgfQogICAgfSk7CiAgICBtYXAub24oImdyb3VwYWRkIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgaWYgKGUubmFtZSA9PT0gb3B0aW9ucy5ncm91cCkgewogICAgICAgIG1hcC5jb250cm9scy5hZGQobGVnZW5kLCBvcHRpb25zLmxheWVySWQpOwogICAgICB9CiAgICB9KTsKICAgIG1hcC5vbigiZ3JvdXByZW1vdmUiLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoZS5uYW1lID09PSBvcHRpb25zLmdyb3VwKSB7CiAgICAgICAgbWFwLmNvbnRyb2xzLnJlbW92ZShvcHRpb25zLmxheWVySWQpOwogICAgICB9CiAgICB9KTsKICB9CgogIHRoaXMuY29udHJvbHMuYWRkKGxlZ2VuZCwgb3B0aW9ucy5sYXllcklkKTsKfTsKCm1ldGhvZHMuYWRkTGF5ZXJzQ29udHJvbCA9IGZ1bmN0aW9uIChiYXNlR3JvdXBzLCBvdmVybGF5R3JvdXBzLCBvcHRpb25zKSB7CiAgdmFyIF90aGlzNCA9IHRoaXM7CgogIC8vIE9ubHkgYWxsb3cgb25lIGxheWVycyBjb250cm9sIGF0IGEgdGltZQogIG1ldGhvZHMucmVtb3ZlTGF5ZXJzQ29udHJvbC5jYWxsKHRoaXMpOwogIHZhciBmaXJzdExheWVyID0gdHJ1ZTsKICB2YXIgYmFzZSA9IHt9OwoKICBfanF1ZXJ5MlsiZGVmYXVsdCJdLmVhY2goKDAsIF91dGlsLmFzQXJyYXkpKGJhc2VHcm91cHMpLCBmdW5jdGlvbiAoaSwgZykgewogICAgdmFyIGxheWVyID0gX3RoaXM0LmxheWVyTWFuYWdlci5nZXRMYXllckdyb3VwKGcsIHRydWUpOwoKICAgIGlmIChsYXllcikgewogICAgICBiYXNlW2ddID0gbGF5ZXI7IC8vIENoZWNrIGlmID4xIGJhc2UgbGF5ZXJzIGFyZSB2aXNpYmxlOyBpZiBzbywgaGlkZSBhbGwgYnV0IHRoZSBmaXJzdCBvbmUKCiAgICAgIGlmIChfdGhpczQuaGFzTGF5ZXIobGF5ZXIpKSB7CiAgICAgICAgaWYgKGZpcnN0TGF5ZXIpIHsKICAgICAgICAgIGZpcnN0TGF5ZXIgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX3RoaXM0LnJlbW92ZUxheWVyKGxheWVyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9KTsKCiAgdmFyIG92ZXJsYXkgPSB7fTsKCiAgX2pxdWVyeTJbImRlZmF1bHQiXS5lYWNoKCgwLCBfdXRpbC5hc0FycmF5KShvdmVybGF5R3JvdXBzKSwgZnVuY3Rpb24gKGksIGcpIHsKICAgIHZhciBsYXllciA9IF90aGlzNC5sYXllck1hbmFnZXIuZ2V0TGF5ZXJHcm91cChnLCB0cnVlKTsKCiAgICBpZiAobGF5ZXIpIHsKICAgICAgb3ZlcmxheVtnXSA9IGxheWVyOwogICAgfQogIH0pOwoKICB0aGlzLmN1cnJlbnRMYXllcnNDb250cm9sID0gX2xlYWZsZXQyWyJkZWZhdWx0Il0uY29udHJvbC5sYXllcnMoYmFzZSwgb3ZlcmxheSwgb3B0aW9ucyk7CiAgdGhpcy5hZGRDb250cm9sKHRoaXMuY3VycmVudExheWVyc0NvbnRyb2wpOwp9OwoKbWV0aG9kcy5yZW1vdmVMYXllcnNDb250cm9sID0gZnVuY3Rpb24gKCkgewogIGlmICh0aGlzLmN1cnJlbnRMYXllcnNDb250cm9sKSB7CiAgICB0aGlzLnJlbW92ZUNvbnRyb2wodGhpcy5jdXJyZW50TGF5ZXJzQ29udHJvbCk7CiAgICB0aGlzLmN1cnJlbnRMYXllcnNDb250cm9sID0gbnVsbDsKICB9Cn07CgptZXRob2RzLmFkZFNjYWxlQmFyID0gZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAvLyBPbmx5IGFsbG93IG9uZSBzY2FsZSBiYXIgYXQgYSB0aW1lCiAgbWV0aG9kcy5yZW1vdmVTY2FsZUJhci5jYWxsKHRoaXMpOwoKICB2YXIgc2NhbGVCYXIgPSBfbGVhZmxldDJbImRlZmF1bHQiXS5jb250cm9sLnNjYWxlKG9wdGlvbnMpLmFkZFRvKHRoaXMpOwoKICB0aGlzLmN1cnJlbnRTY2FsZUJhciA9IHNjYWxlQmFyOwp9OwoKbWV0aG9kcy5yZW1vdmVTY2FsZUJhciA9IGZ1bmN0aW9uICgpIHsKICBpZiAodGhpcy5jdXJyZW50U2NhbGVCYXIpIHsKICAgIHRoaXMuY3VycmVudFNjYWxlQmFyLnJlbW92ZSgpOwogICAgdGhpcy5jdXJyZW50U2NhbGVCYXIgPSBudWxsOwogIH0KfTsKCm1ldGhvZHMuaGlkZUdyb3VwID0gZnVuY3Rpb24gKGdyb3VwKSB7CiAgdmFyIF90aGlzNSA9IHRoaXM7CgogIF9qcXVlcnkyWyJkZWZhdWx0Il0uZWFjaCgoMCwgX3V0aWwuYXNBcnJheSkoZ3JvdXApLCBmdW5jdGlvbiAoaSwgZykgewogICAgdmFyIGxheWVyID0gX3RoaXM1LmxheWVyTWFuYWdlci5nZXRMYXllckdyb3VwKGcsIHRydWUpOwoKICAgIGlmIChsYXllcikgewogICAgICBfdGhpczUucmVtb3ZlTGF5ZXIobGF5ZXIpOwogICAgfQogIH0pOwp9OwoKbWV0aG9kcy5zaG93R3JvdXAgPSBmdW5jdGlvbiAoZ3JvdXApIHsKICB2YXIgX3RoaXM2ID0gdGhpczsKCiAgX2pxdWVyeTJbImRlZmF1bHQiXS5lYWNoKCgwLCBfdXRpbC5hc0FycmF5KShncm91cCksIGZ1bmN0aW9uIChpLCBnKSB7CiAgICB2YXIgbGF5ZXIgPSBfdGhpczYubGF5ZXJNYW5hZ2VyLmdldExheWVyR3JvdXAoZywgdHJ1ZSk7CgogICAgaWYgKGxheWVyKSB7CiAgICAgIF90aGlzNi5hZGRMYXllcihsYXllcik7CiAgICB9CiAgfSk7Cn07CgpmdW5jdGlvbiBzZXR1cFNob3dIaWRlR3JvdXBzT25ab29tKG1hcCkgewogIGlmIChtYXAubGVhZmxldHIuX2hhc0luaXRpYWxpemVkU2hvd0hpZGVHcm91cHMpIHsKICAgIHJldHVybjsKICB9CgogIG1hcC5sZWFmbGV0ci5faGFzSW5pdGlhbGl6ZWRTaG93SGlkZUdyb3VwcyA9IHRydWU7CgogIGZ1bmN0aW9uIHNldFZpc2liaWxpdHkobGF5ZXIsIHZpc2libGUsIGdyb3VwKSB7CiAgICBpZiAodmlzaWJsZSAhPT0gbWFwLmhhc0xheWVyKGxheWVyKSkgewogICAgICBpZiAodmlzaWJsZSkgewogICAgICAgIG1hcC5hZGRMYXllcihsYXllcik7CiAgICAgICAgbWFwLmZpcmUoImdyb3VwYWRkIiwgewogICAgICAgICAgIm5hbWUiOiBncm91cCwKICAgICAgICAgICJsYXllciI6IGxheWVyCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbWFwLnJlbW92ZUxheWVyKGxheWVyKTsKICAgICAgICBtYXAuZmlyZSgiZ3JvdXByZW1vdmUiLCB7CiAgICAgICAgICAibmFtZSI6IGdyb3VwLAogICAgICAgICAgImxheWVyIjogbGF5ZXIKICAgICAgICB9KTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gc2hvd0hpZGVHcm91cHNPblpvb20oKSB7CiAgICBpZiAoIW1hcC5sYXllck1hbmFnZXIpIHJldHVybjsKICAgIHZhciB6b29tID0gbWFwLmdldFpvb20oKTsKICAgIG1hcC5sYXllck1hbmFnZXIuZ2V0QWxsR3JvdXBOYW1lcygpLmZvckVhY2goZnVuY3Rpb24gKGdyb3VwKSB7CiAgICAgIHZhciBsYXllciA9IG1hcC5sYXllck1hbmFnZXIuZ2V0TGF5ZXJHcm91cChncm91cCwgZmFsc2UpOwoKICAgICAgaWYgKGxheWVyICYmIHR5cGVvZiBsYXllci56b29tTGV2ZWxzICE9PSAidW5kZWZpbmVkIikgewogICAgICAgIHNldFZpc2liaWxpdHkobGF5ZXIsIGxheWVyLnpvb21MZXZlbHMgPT09IHRydWUgfHwgbGF5ZXIuem9vbUxldmVscy5pbmRleE9mKHpvb20pID49IDAsIGdyb3VwKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBtYXAuc2hvd0hpZGVHcm91cHNPblpvb20gPSBzaG93SGlkZUdyb3Vwc09uWm9vbTsKICBtYXAub24oInpvb21lbmQiLCBzaG93SGlkZUdyb3Vwc09uWm9vbSk7Cn0KCm1ldGhvZHMuc2V0R3JvdXBPcHRpb25zID0gZnVuY3Rpb24gKGdyb3VwLCBvcHRpb25zKSB7CiAgdmFyIF90aGlzNyA9IHRoaXM7CgogIF9qcXVlcnkyWyJkZWZhdWx0Il0uZWFjaCgoMCwgX3V0aWwuYXNBcnJheSkoZ3JvdXApLCBmdW5jdGlvbiAoaSwgZykgewogICAgdmFyIGxheWVyID0gX3RoaXM3LmxheWVyTWFuYWdlci5nZXRMYXllckdyb3VwKGcsIHRydWUpOyAvLyBUaGlzIHNsaWdodGx5IHRvcnR1cmVkIGNoZWNrIGlzIGJlY2F1c2UgMCBpcyBhIHZhbGlkIHZhbHVlIGZvciB6b29tTGV2ZWxzCgoKICAgIGlmICh0eXBlb2Ygb3B0aW9ucy56b29tTGV2ZWxzICE9PSAidW5kZWZpbmVkIiAmJiBvcHRpb25zLnpvb21MZXZlbHMgIT09IG51bGwpIHsKICAgICAgbGF5ZXIuem9vbUxldmVscyA9ICgwLCBfdXRpbC5hc0FycmF5KShvcHRpb25zLnpvb21MZXZlbHMpOwogICAgfQogIH0pOwoKICBzZXR1cFNob3dIaWRlR3JvdXBzT25ab29tKHRoaXMpOwogIHRoaXMuc2hvd0hpZGVHcm91cHNPblpvb20oKTsKfTsKCm1ldGhvZHMuYWRkUmFzdGVySW1hZ2UgPSBmdW5jdGlvbiAodXJpLCBib3VuZHMsIG9wYWNpdHksIGF0dHJpYnV0aW9uLCBsYXllcklkLCBncm91cCkgewogIC8vIHVyaSBpcyBhIGRhdGEgVVJJIGNvbnRhaW5pbmcgYW4gaW1hZ2UuIFdlIHdhbnQgdG8gcGFpbnQgdGhpcyBpbWFnZSBhcyBhCiAgLy8gbGF5ZXIgYXQgKHRvcC1sZWZ0KSBib3VuZHNbMF0gdG8gKGJvdHRvbS1yaWdodCkgYm91bmRzWzFdLgogIC8vIFdlIGNhbid0IHNpbXBseSB1c2UgSW1hZ2VPdmVybGF5LCBhcyBpdCB1c2VzIGJpbGluZWFyIHNjYWxpbmcgd2hpY2ggbG9va3MKICAvLyBhd2Z1bCBhcyB5b3Ugem9vbSBpbiAoYW5kIHNvbWV0aW1lcyBzaGlmdHMgcG9zaXRpb25zIG9yIGRpc2FwcGVhcnMpLgogIC8vIEluc3RlYWQsIHdlJ2xsIHVzZSBhIFRpbGVMYXllci5DYW52YXMgdG8gZHJhdyBwaWVjZXMgb2YgdGhlIGltYWdlLgogIC8vIEZpcnN0LCBzb21lIGhlbHBlciBmdW5jdGlvbnMuCiAgLy8gZGVncmVlMnRpbGUgY29udmVydHMgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgYW5kIHpvb20gdG8geCBhbmQgeSB0aWxlCiAgLy8gbnVtYmVycy4gVGhlIHRpbGUgbnVtYmVycyByZXR1cm5lZCBjYW4gYmUgbm9uLWludGVncmFsLCBhcyB0aGVyZSdzIG5vCiAgLy8gcmVhc29uIHRvIGV4cGVjdCB0aGF0IHRoZSBsYXQvbG5nIGlucHV0cyBhcmUgZXhhY3RseSBvbiB0aGUgYm9yZGVyIG9mIHR3bwogIC8vIHRpbGVzLgogIC8vCiAgLy8gV2UnbGwgdXNlIHRoaXMgdG8gY29udmVydCB0aGUgYm91bmRzIHdlIGdvdCBmcm9tIHRoZSBzZXJ2ZXIsIGludG8gY29vcmRzCiAgLy8gaW4gdGlsZS1zcGFjZSBhdCBhIGdpdmVuIHpvb20gbGV2ZWwuIE5vdGUgdGhhdCBvbmNlIHdlIGRvIHRoZSBjb252ZXJzaW9uLAogIC8vIHdlIGRvbid0IHRvIGRvIGFueSBtb3JlIHRyaWdvbm9tZXRyeSB0byBjb252ZXJ0IGJldHdlZW4gcGl4ZWwgY29vcmRpbmF0ZXMKICAvLyBhbmQgdGlsZSBjb29yZGluYXRlczsgdGhlIHNvdXJjZSBpbWFnZSBwaXhlbCBjb29yZHMsIGRlc3RpbmF0aW9uIGNhbnZhcwogIC8vIHBpeGVsIGNvb3JkcywgYW5kIHRpbGUgY29vcmRzIGFsbCBjYW4gYmUgc2NhbGVkIGxpbmVhcmx5LgogIGZ1bmN0aW9uIGRlZ3JlZTJ0aWxlKGxhdCwgbG5nLCB6b29tKSB7CiAgICAvLyBTZWUgaHR0cDovL3dpa2kub3BlbnN0cmVldG1hcC5vcmcvd2lraS9TbGlwcHlfbWFwX3RpbGVuYW1lcwogICAgdmFyIGxhdFJhZCA9IGxhdCAqIE1hdGguUEkgLyAxODA7CiAgICB2YXIgbiA9IE1hdGgucG93KDIsIHpvb20pOwogICAgdmFyIHggPSAobG5nICsgMTgwKSAvIDM2MCAqIG47CiAgICB2YXIgeSA9ICgxIC0gTWF0aC5sb2coTWF0aC50YW4obGF0UmFkKSArIDEgLyBNYXRoLmNvcyhsYXRSYWQpKSAvIE1hdGguUEkpIC8gMiAqIG47CiAgICByZXR1cm4gewogICAgICB4OiB4LAogICAgICB5OiB5CiAgICB9OwogIH0gLy8gR2l2ZW4gYSByYW5nZSBbZnJvbSx0bykgYW5kIGVpdGhlciBvbmUgb3IgdHdvIG51bWJlcnMsIHJldHVybnMgdHJ1ZSBpZgogIC8vIHRoZXJlIGlzIGFueSBvdmVybGFwIGJldHdlZW4gW3gseDEpIGFuZCB0aGUgcmFuZ2UtLW9yIGlmIHgxIGlzIG9taXR0ZWQsCiAgLy8gdGhlbiByZXR1cm5zIHRydWUgaWYgeCBpcyB3aXRoaW4gW2Zyb20sdG8pLgoKCiAgZnVuY3Rpb24gb3ZlcmxhcChmcm9tLCB0bywgeCwKICAvKiBvcHRpb25hbCAqLwogIHgxKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAzKSB4MSA9IHg7CiAgICByZXR1cm4geCA8IHRvICYmIHgxID49IGZyb207CiAgfQoKICBmdW5jdGlvbiBnZXRDYW52YXNTbW9vdGhpbmdQcm9wZXJ0eShjdHgpIHsKICAgIHZhciBjYW5kaWRhdGVzID0gWyJpbWFnZVNtb290aGluZ0VuYWJsZWQiLCAibW96SW1hZ2VTbW9vdGhpbmdFbmFibGVkIiwgIndlYmtpdEltYWdlU21vb3RoaW5nRW5hYmxlZCIsICJtc0ltYWdlU21vb3RoaW5nRW5hYmxlZCJdOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FuZGlkYXRlcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodHlwZW9mIGN0eFtjYW5kaWRhdGVzW2ldXSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICByZXR1cm4gY2FuZGlkYXRlc1tpXTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0gLy8gT3VyIGdlbmVyYWwgc3RyYXRlZ3kgaXMgdG86CiAgLy8gMS4gTG9hZCB0aGUgZGF0YSBVUkkgaW4gYW4gSW1hZ2UoKSBvYmplY3QsIHNvIHdlIGNhbiBnZXQgaXRzIHBpeGVsCiAgLy8gICAgZGltZW5zaW9ucyBhbmQgdGhlIHVuZGVybHlpbmcgaW1hZ2UgZGF0YS4gKFdlIGNvdWxkIGhhdmUgZG9uZSB0aGlzCiAgLy8gICAgYnkgbm90IGVuY29kaW5nIGFzIFBORyBhdCBhbGwgYnV0IGp1c3Qgc2VuZCBhbiBhcnJheSBvZiBSR0JBIHZhbHVlcwogIC8vICAgIGZyb20gdGhlIHNlcnZlciwgYnV0IHRoYXQgd291bGQgaW5mbGF0ZSB0aGUgSlNPTiB0b28gbXVjaC4pCiAgLy8gMi4gQ3JlYXRlIGEgaGlkZGVuIGNhbnZhcyB0aGF0IHdlIHVzZSBqdXN0IHRvIGV4dHJhY3QgdGhlIGltYWdlIGRhdGEKICAvLyAgICBmcm9tIHRoZSBJbWFnZSAodXNpbmcgQ29udGV4dDJELmdldEltYWdlRGF0YSgpKS4KICAvLyAzLiBDcmVhdGUgYSBUaWxlTGF5ZXIuQ2FudmFzIGFuZCBhZGQgaXQgdG8gdGhlIG1hcC4KICAvLyBXZSB3YW50IHRvIHN5bmNocm9ub3VzbHkgY3JlYXRlIGFuZCBhdHRhY2ggdGhlIFRpbGVMYXllci5DYW52YXMgKHNvIGFuCiAgLy8gaW1tZWRpYXRlIGNhbGwgdG8gY2xlYXJSYXN0ZXJzKCkgd2lsbCBiZSByZXNwZWN0ZWQsIGZvciBleGFtcGxlKSwgYnV0CiAgLy8gSW1hZ2UgbG9hZHMgaXRzIGRhdGEgYXN5bmNocm9ub3VzbHkuIEZvcnR1bmF0ZWx5IHdlIGNhbiByZXNvbHZlIHRoaXMKICAvLyBieSBwdXR0aW5nIFRpbGVMYXllci5DYW52YXMgaW50byBhc3luYyBtb2RlLCB3aGljaCB3aWxsIGxldCB1cyBjcmVhdGUKICAvLyBhbmQgYXR0YWNoIHRoZSBsYXllciBidXQgaGF2ZSBpdCB3YWl0IHVudGlsIHRoZSBpbWFnZSBpcyBsb2FkZWQgYmVmb3JlCiAgLy8gaXQgYWN0dWFsbHkgZHJhd3MgYW55dGhpbmcuCiAgLy8gVGhlc2UgYXJlIHRoZSB2YXJpYWJsZXMgdGhhdCB3ZSB3aWxsIHBvcHVsYXRlIG9uY2UgdGhlIGltYWdlIGlzIGxvYWRlZC4KCgogIHZhciBpbWdEYXRhID0gbnVsbDsgLy8gMWQgcm93LW1ham9yIGFycmF5LCBmb3VyIFswLTI1NV0gaW50ZWdlcnMgcGVyIHBpeGVsCgogIHZhciBpbWdEYXRhTWlwTWFwcGVyID0gbnVsbDsKICB2YXIgdyA9IG51bGw7IC8vIGltYWdlIHdpZHRoIGluIHBpeGVscwoKICB2YXIgaCA9IG51bGw7IC8vIGltYWdlIGhlaWdodCBpbiBwaXhlbHMKICAvLyBXZSdsbCB1c2UgdGhpcyBhcnJheSB0byBzdG9yZSBjYWxsYmFja3MgdGhhdCBuZWVkIHRvIGJlIGludm9rZWQgb25jZQogIC8vIGltZ0RhdGEsIHcsIGFuZCBoIGhhdmUgYmVlbiByZXNvbHZlZC4KCiAgdmFyIGltZ0RhdGFDYWxsYmFja3MgPSBbXTsgLy8gQ29uc3VtZXJzIG9mIGltZ0RhdGEsIHcsIGFuZCBoIGNhbiBjYWxsIHRoaXMgdG8gYmUgbm90aWZpZWQgd2hlbiBkYXRhCiAgLy8gaXMgYXZhaWxhYmxlLgoKICBmdW5jdGlvbiBnZXRJbWFnZURhdGEoY2FsbGJhY2spIHsKICAgIGlmIChpbWdEYXRhICE9IG51bGwpIHsKICAgICAgLy8gTXVzdCBub3QgaW52b2tlIHRoZSBjYWxsYmFjayBpbW1lZGlhdGVseTsgaXQncyB0b28gY29uZnVzaW5nIGFuZAogICAgICAvLyBmcmFnaWxlIHRvIGhhdmUgYSBmdW5jdGlvbiBpbnZva2UgdGhlIGNhbGxiYWNrICplaXRoZXIqIGltbWVkaWF0ZWx5CiAgICAgIC8vIG9yIGluIHRoZSBmdXR1cmUuIEJldHRlciB0byBiZSBjb25zaXN0ZW50IGhlcmUuCiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIGNhbGxiYWNrKGltZ0RhdGEsIHcsIGgsIGltZ0RhdGFNaXBNYXBwZXIpOwogICAgICB9LCAwKTsKICAgIH0gZWxzZSB7CiAgICAgIGltZ0RhdGFDYWxsYmFja3MucHVzaChjYWxsYmFjayk7CiAgICB9CiAgfQoKICB2YXIgaW1nID0gbmV3IEltYWdlKCk7CgogIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAvLyBTYXZlIHNpemUKICAgIHcgPSBpbWcud2lkdGg7CiAgICBoID0gaW1nLmhlaWdodDsgLy8gQ3JlYXRlIGEgZHVtbXkgY2FudmFzIHRvIGV4dHJhY3QgdGhlIGltYWdlIGRhdGEKCiAgICB2YXIgaW1nRGF0YUNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgaW1nRGF0YUNhbnZhcy53aWR0aCA9IHc7CiAgICBpbWdEYXRhQ2FudmFzLmhlaWdodCA9IGg7CiAgICBpbWdEYXRhQ2FudmFzLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGltZ0RhdGFDYW52YXMpOwogICAgdmFyIGltZ0RhdGFDdHggPSBpbWdEYXRhQ2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICBpbWdEYXRhQ3R4LmRyYXdJbWFnZShpbWcsIDAsIDApOyAvLyBTYXZlIHRoZSBpbWFnZSBkYXRhLgoKICAgIGltZ0RhdGEgPSBpbWdEYXRhQ3R4LmdldEltYWdlRGF0YSgwLCAwLCB3LCBoKS5kYXRhOwogICAgaW1nRGF0YU1pcE1hcHBlciA9IG5ldyBfbWlwbWFwcGVyMlsiZGVmYXVsdCJdKGltZyk7IC8vIERvbmUgd2l0aCB0aGUgY2FudmFzLCByZW1vdmUgaXQgZnJvbSB0aGUgcGFnZSBzbyBpdCBjYW4gYmUgZ2MnZC4KCiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGltZ0RhdGFDYW52YXMpOyAvLyBBbGVydCBhbnkgZ2V0SW1hZ2VEYXRhIGNhbGxlcnMgd2hvIGFyZSB3YWl0aW5nLgoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW1nRGF0YUNhbGxiYWNrcy5sZW5ndGg7IGkrKykgewogICAgICBpbWdEYXRhQ2FsbGJhY2tzW2ldKGltZ0RhdGEsIHcsIGgsIGltZ0RhdGFNaXBNYXBwZXIpOwogICAgfQoKICAgIGltZ0RhdGFDYWxsYmFja3MgPSBbXTsKICB9OwoKICBpbWcuc3JjID0gdXJpOwoKICB2YXIgY2FudmFzVGlsZXMgPSBfbGVhZmxldDJbImRlZmF1bHQiXS5ncmlkTGF5ZXIoewogICAgb3BhY2l0eTogb3BhY2l0eSwKICAgIGF0dHJpYnV0aW9uOiBhdHRyaWJ1dGlvbiwKICAgIGRldGVjdFJldGluYTogdHJ1ZSwKICAgIGFzeW5jOiB0cnVlCiAgfSk7IC8vIE5PVEU6IFRoZSBkb25lKCkgZnVuY3Rpb24gTVVTVCBOT1QgYmUgaW52b2tlZCB1bnRpbCBhZnRlciB0aGUgY3VycmVudAogIC8vIHRpY2s7IGRvbmUoKSBsb29rcyBpbiBMZWFmbGV0J3MgdGlsZSBjYWNoZSBmb3IgdGhlIGN1cnJlbnQgdGlsZSwgYW5kCiAgLy8gc2luY2UgaXQncyBzdGlsbCBiZWluZyBjb25zdHJ1Y3RlZCwgaXQgd29uJ3QgYmUgZm91bmQuCgoKICBjYW52YXNUaWxlcy5jcmVhdGVUaWxlID0gZnVuY3Rpb24gKHRpbGVQb2ludCwgZG9uZSkgewogICAgdmFyIHpvb20gPSB0aWxlUG9pbnQuejsKCiAgICB2YXIgY2FudmFzID0gX2xlYWZsZXQyWyJkZWZhdWx0Il0uRG9tVXRpbC5jcmVhdGUoImNhbnZhcyIpOwoKICAgIHZhciBlcnJvcjsgLy8gc2V0dXAgdGlsZSB3aWR0aCBhbmQgaGVpZ2h0IGFjY29yZGluZyB0byB0aGUgb3B0aW9ucwoKICAgIHZhciBzaXplID0gdGhpcy5nZXRUaWxlU2l6ZSgpOwogICAgY2FudmFzLndpZHRoID0gc2l6ZS54OwogICAgY2FudmFzLmhlaWdodCA9IHNpemUueTsKICAgIGdldEltYWdlRGF0YShmdW5jdGlvbiAoaW1nRGF0YSwgdywgaCwgbWlwbWFwcGVyKSB7CiAgICAgIHRyeSB7CiAgICAgICAgLy8gVGhlIENvbnRleHQyRCB3ZSdsbCBiZWluZyBkcmF3aW5nIG9udG8uIEl0J3MgYWx3YXlzIDI1NngyNTYuCiAgICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOyAvLyBDb252ZXJ0IG91ciBpbWFnZSBkYXRhJ3MgdG9wLWxlZnQgYW5kIGJvdHRvbS1yaWdodCBsb2NhdGlvbnMgaW50bwogICAgICAgIC8vIHgveSB0aWxlIGNvb3JkaW5hdGVzLiBUaGlzIGlzIGVzc2VudGlhbGx5IGRvaW5nIGEgc3BoZXJpY2FsIG1lcmNhdG9yCiAgICAgICAgLy8gcHJvamVjdGlvbiwgdGhlbiBtdWx0aXBseWluZyBieSAyXnpvb20uCgogICAgICAgIHZhciB0b3BMZWZ0ID0gZGVncmVlMnRpbGUoYm91bmRzWzBdWzBdLCBib3VuZHNbMF1bMV0sIHpvb20pOwogICAgICAgIHZhciBib3R0b21SaWdodCA9IGRlZ3JlZTJ0aWxlKGJvdW5kc1sxXVswXSwgYm91bmRzWzFdWzFdLCB6b29tKTsgLy8gVGhlIHNpemUgb2YgdGhlIGltYWdlIGluIHgveSB0aWxlIGNvb3JkaW5hdGVzLgoKICAgICAgICB2YXIgZXh0ZW50ID0gewogICAgICAgICAgeDogYm90dG9tUmlnaHQueCAtIHRvcExlZnQueCwKICAgICAgICAgIHk6IGJvdHRvbVJpZ2h0LnkgLSB0b3BMZWZ0LnkKICAgICAgICB9OyAvLyBTaG9ydCBjaXJjdWl0IGlmIHRpbGUgaXMgdG90YWxseSBkaXNqb2ludCBmcm9tIGltYWdlLgoKICAgICAgICBpZiAoIW92ZXJsYXAodGlsZVBvaW50LngsIHRpbGVQb2ludC54ICsgMSwgdG9wTGVmdC54LCBib3R0b21SaWdodC54KSkgcmV0dXJuOwogICAgICAgIGlmICghb3ZlcmxhcCh0aWxlUG9pbnQueSwgdGlsZVBvaW50LnkgKyAxLCB0b3BMZWZ0LnksIGJvdHRvbVJpZ2h0LnkpKSByZXR1cm47IC8vIFRoZSBsaW5lYXIgcmVzb2x1dGlvbiBvZiB0aGUgdGlsZSB3ZSdyZSBkcmF3aW5nIGlzIGFsd2F5cyAyNTZweCBwZXIgdGlsZSB1bml0LgogICAgICAgIC8vIElmIHRoZSBsaW5lYXIgcmVzb2x1dGlvbiAoaW4gZWl0aGVyIGRpcmVjdGlvbikgb2YgdGhlIGltYWdlIGlzIGxlc3MgdGhhbiAyNTZweAogICAgICAgIC8vIHBlciB0aWxlIHVuaXQsIHRoZW4gdXNlIG5lYXJlc3QgbmVpZ2hib3I7IG90aGVyd2lzZSwgdXNlIHRoZSBjYW52YXMncyBidWlsdC1pbgogICAgICAgIC8vIHNjYWxpbmcuCgogICAgICAgIHZhciBpbWdSZXMgPSB7CiAgICAgICAgICB4OiB3IC8gZXh0ZW50LngsCiAgICAgICAgICB5OiBoIC8gZXh0ZW50LnkKICAgICAgICB9OyAvLyBXZSBjYW4gZG8gdGhlIGFjdHVhbCBkcmF3aW5nIGluIG9uZSBvZiB0aHJlZSB3YXlzOgogICAgICAgIC8vIC0gQ2FsbCBkcmF3SW1hZ2UoKS4gVGhpcyBpcyBlYXN5IGFuZCBmYXN0LCBhbmQgcmVzdWx0cyBpbiBzbW9vdGgKICAgICAgICAvLyAgIGludGVycG9sYXRpb24gKGJpbGluZWFyPykuIFRoaXMgaXMgd2hhdCB3ZSB3YW50IHdoZW4gd2UgYXJlCiAgICAgICAgLy8gICByZWR1Y2luZyB0aGUgaW1hZ2UgZnJvbSBpdHMgbmF0aXZlIHNpemUuCiAgICAgICAgLy8gLSBDYWxsIGRyYXdJbWFnZSgpIHdpdGggaW1hZ2VTbW9vdGhpbmdFbmFibGVkPWZhbHNlLiBUaGlzIGlzIGVhc3kKICAgICAgICAvLyAgIGFuZCBmYXN0IGFuZCBnaXZlcyB1cyBuZWFyZXN0LW5laWdoYm9yIGludGVycG9sYXRpb24sIHdoaWNoIGlzIHdoYXQKICAgICAgICAvLyAgIHdlIHdhbnQgd2hlbiBlbmxhcmdpbmcgdGhlIGltYWdlLiBIb3dldmVyLCBpdCdzIHVuc3VwcG9ydGVkIG9uIG1hbnkKICAgICAgICAvLyAgIGJyb3dzZXJzIChpbmNsdWRpbmcgUXRXZWJraXQpLgogICAgICAgIC8vIC0gRG8gYSBtYW51YWwgbmVhcmVzdC1uZWlnaGJvciBpbnRlcnBvbGF0aW9uLiBUaGlzIGlzIHdoYXQgd2UnbGwgZmFsbAogICAgICAgIC8vICAgYmFjayB0byB3aGVuIGVubGFyZ2luZywgYW5kIGltYWdlU21vb3RoaW5nRW5hYmxlZCBpc24ndCBzdXBwb3J0ZWQuCiAgICAgICAgLy8gICBJbiB0aGVvcnkgaXQncyBzbG93ZXIsIGJ1dCBzdGlsbCBwcmV0dHkgZmFzdCBvbiBteSBtYWNoaW5lLCBhbmQgdGhlCiAgICAgICAgLy8gICByZXN1bHRzIGxvb2sgdGhlIHNhbWUgQUZBSUNULgogICAgICAgIC8vIElzIGltYWdlU21vb3RoaW5nRW5hYmxlZCBzdXBwb3J0ZWQ/IElmIHNvLCB3ZSBjYW4gbGV0IGNhbnZhcyBkbwogICAgICAgIC8vIG5lYXJlc3QtbmVpZ2hib3IgaW50ZXJwb2xhdGlvbiBmb3IgdXMuCgogICAgICAgIHZhciBzbW9vdGhpbmdQcm9wZXJ0eSA9IGdldENhbnZhc1Ntb290aGluZ1Byb3BlcnR5KGN0eCk7CgogICAgICAgIGlmIChzbW9vdGhpbmdQcm9wZXJ0eSB8fCBpbWdSZXMueCA+PSAyNTYgJiYgaW1nUmVzLnkgPj0gMjU2KSB7CiAgICAgICAgICAvLyBVc2UgYnVpbHQtaW4gc2NhbGluZwogICAgICAgICAgLy8gVHVybiBvZmYgYW50aS1hbGlhc2luZyBpZiBuZWNlc3NhcnkKICAgICAgICAgIGlmIChzbW9vdGhpbmdQcm9wZXJ0eSkgewogICAgICAgICAgICBjdHhbc21vb3RoaW5nUHJvcGVydHldID0gaW1nUmVzLnggPj0gMjU2ICYmIGltZ1Jlcy55ID49IDI1NjsKICAgICAgICAgIH0gLy8gRG9uJ3QgbmVjZXNzYXJpbHkgZHJhdyB3aXRoIHRoZSBmdWxsLXNpemUgaW1hZ2U7IGlmIHdlJ3JlCiAgICAgICAgICAvLyBkb3duc2NhbGluZywgdXNlIHRoZSBtaXBtYXBwZXIgdG8gZ2V0IGEgcHJlLWRvd25zY2FsZWQgaW1hZ2UKICAgICAgICAgIC8vIChzZWUgY29tbWVudHMgb24gTWlwbWFwcGVyIGNsYXNzIGZvciB3aHkgdGhpcyBtYXR0ZXJzKS4KCgogICAgICAgICAgbWlwbWFwcGVyLmdldEJ5U2l6ZShleHRlbnQueCAqIDI1NiwgZXh0ZW50LnkgKiAyNTYsIGZ1bmN0aW9uIChtaXApIHsKICAgICAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBpbWFnZSB3aWxsIGdvIG9mZiB0aGUgZWRnZSBvZiB0aGUgY2FudmFzLS0KICAgICAgICAgICAgLy8gdGhhdCdzIE9LLCB0aGUgY2FudmFzIHNob3VsZCBjbGlwIGFwcHJvcHJpYXRlbHkuCiAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UobWlwLCAvLyBDb252ZXJ0IGFicyB0aWxlIGNvb3JkcyB0byByZWwgdGlsZSBjb29yZHMsIHRoZW4gKjI1NiB0byBjb252ZXJ0CiAgICAgICAgICAgIC8vIHRvIHJlbCBwaXhlbCBjb29yZHMKICAgICAgICAgICAgKHRvcExlZnQueCAtIHRpbGVQb2ludC54KSAqIDI1NiwgKHRvcExlZnQueSAtIHRpbGVQb2ludC55KSAqIDI1NiwgLy8gQWx3YXlzIGRyYXcgdGhlIHdob2xlIHRoaW5nIGFuZCBsZXQgY2FudmFzIGNsaXA7IHNvIHdlIGNhbiBqdXN0CiAgICAgICAgICAgIC8vIGNvbnZlcnQgZnJvbSBzaXplIGluIHRpbGUgY29vcmRzIHN0cmFpZ2h0IHRvIHBpeGVscwogICAgICAgICAgICBleHRlbnQueCAqIDI1NiwgZXh0ZW50LnkgKiAyNTYpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFVzZSBtYW51YWwgbmVhcmVzdC1uZWlnaGJvciBpbnRlcnBvbGF0aW9uCiAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHNvdXJjZSBpbWFnZSBwaXhlbCBjb29yZGluYXRlcyB0aGF0IGNvcnJlc3BvbmQgd2l0aAogICAgICAgICAgLy8gdGhlIHRvcC1sZWZ0IGFuZCBib3R0b20tcmlnaHQgb2YgdGhpcyB0aWxlLiAoSWYgdGhlIHNvdXJjZSBpbWFnZQogICAgICAgICAgLy8gb25seSBwYXJ0aWFsbHkgb3ZlcmxhcHMgdGhlIHRpbGUsIHdlIHVzZSBtYXgvbWluIHRvIGxpbWl0IHRoZQogICAgICAgICAgLy8gc291cmNlU3RhcnQvRW5kIHRvIG9ubHkgcmVmbGVjdCB0aGUgb3ZlcmxhcHBpbmcgcG9ydGlvbi4pCiAgICAgICAgICB2YXIgc291cmNlU3RhcnQgPSB7CiAgICAgICAgICAgIHg6IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoKHRpbGVQb2ludC54IC0gdG9wTGVmdC54KSAqIGltZ1Jlcy54KSksCiAgICAgICAgICAgIHk6IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoKHRpbGVQb2ludC55IC0gdG9wTGVmdC55KSAqIGltZ1Jlcy55KSkKICAgICAgICAgIH07CiAgICAgICAgICB2YXIgc291cmNlRW5kID0gewogICAgICAgICAgICB4OiBNYXRoLm1pbih3LCBNYXRoLmNlaWwoKHRpbGVQb2ludC54ICsgMSAtIHRvcExlZnQueCkgKiBpbWdSZXMueCkpLAogICAgICAgICAgICB5OiBNYXRoLm1pbihoLCBNYXRoLmNlaWwoKHRpbGVQb2ludC55ICsgMSAtIHRvcExlZnQueSkgKiBpbWdSZXMueSkpCiAgICAgICAgICB9OyAvLyBUaGUgc2l6ZSwgaW4gZGVzdCBwaXhlbHMsIHRoYXQgZWFjaCBzb3VyY2UgcGl4ZWwgc2hvdWxkIG9jY3VweS4KICAgICAgICAgIC8vIFRoaXMgbWlnaHQgYmUgZ3JlYXRlciBvciBsZXNzIHRoYW4gMSAoZS5nLiBpZiB4IGFuZCB5IHJlc29sdXRpb24KICAgICAgICAgIC8vIGFyZSB2ZXJ5IGRpZmZlcmVudCkuCgogICAgICAgICAgdmFyIHBpeGVsU2l6ZSA9IHsKICAgICAgICAgICAgeDogMjU2IC8gaW1nUmVzLngsCiAgICAgICAgICAgIHk6IDI1NiAvIGltZ1Jlcy55CiAgICAgICAgICB9OyAvLyBGb3IgZWFjaCBwaXhlbCBpbiB0aGUgc291cmNlIGltYWdlIHRoYXQgb3ZlcmxhcHMgdGhlIHRpbGUuLi4KCiAgICAgICAgICBmb3IgKHZhciByb3cgPSBzb3VyY2VTdGFydC55OyByb3cgPCBzb3VyY2VFbmQueTsgcm93KyspIHsKICAgICAgICAgICAgZm9yICh2YXIgY29sID0gc291cmNlU3RhcnQueDsgY29sIDwgc291cmNlRW5kLng7IGNvbCsrKSB7CiAgICAgICAgICAgICAgLy8gLi4uZXh0cmFjdCB0aGUgcGl4ZWwgZGF0YS4uLgogICAgICAgICAgICAgIHZhciBpID0gKHJvdyAqIHcgKyBjb2wpICogNDsKICAgICAgICAgICAgICB2YXIgciA9IGltZ0RhdGFbaV07CiAgICAgICAgICAgICAgdmFyIGcgPSBpbWdEYXRhW2kgKyAxXTsKICAgICAgICAgICAgICB2YXIgYiA9IGltZ0RhdGFbaSArIDJdOwogICAgICAgICAgICAgIHZhciBhID0gaW1nRGF0YVtpICsgM107CiAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICJyZ2JhKCIgKyBbciwgZywgYiwgYSAvIDI1NV0uam9pbigiLCIpICsgIikiOyAvLyAuLi5jYWxjdWxhdGUgdGhlIGNvcnJlc3BvbmRpbmcgcGl4ZWwgY29vcmQgaW4gdGhlIGRlc3QgaW1hZ2UKICAgICAgICAgICAgICAvLyB3aGVyZSBpdCBzaG91bGQgYmUgZHJhd24uLi4KCiAgICAgICAgICAgICAgdmFyIHBpeGVsUG9zID0gewogICAgICAgICAgICAgICAgeDogKGNvbCAvIGltZ1Jlcy54ICsgdG9wTGVmdC54IC0gdGlsZVBvaW50LngpICogMjU2LAogICAgICAgICAgICAgICAgeTogKHJvdyAvIGltZ1Jlcy55ICsgdG9wTGVmdC55IC0gdGlsZVBvaW50LnkpICogMjU2CiAgICAgICAgICAgICAgfTsgLy8gLi4uYW5kIGRyYXcgYSByZWN0YW5nbGUgdGhlcmUuCgogICAgICAgICAgICAgIGN0eC5maWxsUmVjdChNYXRoLnJvdW5kKHBpeGVsUG9zLngpLCBNYXRoLnJvdW5kKHBpeGVsUG9zLnkpLCAvLyBMb29rcyBjcmF6eSwgYnV0IHRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgcm91bmRpbmcgZnJvbQogICAgICAgICAgICAgIC8vIGNhdXNpbmcgb3ZlcmxhcCBiZXR3ZWVuIHRoaXMgcmVjdCBhbmQgaXRzIG5laWdoYm9ycy4gVGhlCiAgICAgICAgICAgICAgLy8gbWludWVuZCBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIG5leHQgcGl4ZWwsIHdoaWxlIHRoZQogICAgICAgICAgICAgIC8vIHN1YnRyYWhlbmQgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IHBpeGVsICh0byB0dXJuIGFuCiAgICAgICAgICAgICAgLy8gYWJzb2x1dGUgY29vcmRpbmF0ZSB0byBhIHdpZHRoL2hlaWdodCkuIFllcywgSSBoYWQgdG8gbG9vawogICAgICAgICAgICAgIC8vIHVwIG1pbnVlbmQgYW5kIHN1YnRyYWhlbmQuCiAgICAgICAgICAgICAgTWF0aC5yb3VuZChwaXhlbFBvcy54ICsgcGl4ZWxTaXplLngpIC0gTWF0aC5yb3VuZChwaXhlbFBvcy54KSwgTWF0aC5yb3VuZChwaXhlbFBvcy55ICsgcGl4ZWxTaXplLnkpIC0gTWF0aC5yb3VuZChwaXhlbFBvcy55KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBlcnJvciA9IGU7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgZG9uZShlcnJvciwgY2FudmFzKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gY2FudmFzOwogIH07CgogIHRoaXMubGF5ZXJNYW5hZ2VyLmFkZExheWVyKGNhbnZhc1RpbGVzLCAiaW1hZ2UiLCBsYXllcklkLCBncm91cCk7Cn07CgptZXRob2RzLnJlbW92ZUltYWdlID0gZnVuY3Rpb24gKGxheWVySWQpIHsKICB0aGlzLmxheWVyTWFuYWdlci5yZW1vdmVMYXllcigiaW1hZ2UiLCBsYXllcklkKTsKfTsKCm1ldGhvZHMuY2xlYXJJbWFnZXMgPSBmdW5jdGlvbiAoKSB7CiAgdGhpcy5sYXllck1hbmFnZXIuY2xlYXJMYXllcnMoImltYWdlIik7Cn07CgptZXRob2RzLmFkZE1lYXN1cmUgPSBmdW5jdGlvbiAob3B0aW9ucykgewogIC8vIGlmIGEgbWVhc3VyZUNvbnRyb2wgYWxyZWFkeSBleGlzdHMsIHRoZW4gcmVtb3ZlIGl0IGFuZAogIC8vICAgcmVwbGFjZSB3aXRoIGEgbmV3IG9uZQogIG1ldGhvZHMucmVtb3ZlTWVhc3VyZS5jYWxsKHRoaXMpOwogIHRoaXMubWVhc3VyZUNvbnRyb2wgPSBfbGVhZmxldDJbImRlZmF1bHQiXS5jb250cm9sLm1lYXN1cmUob3B0aW9ucyk7CiAgdGhpcy5hZGRDb250cm9sKHRoaXMubWVhc3VyZUNvbnRyb2wpOwp9OwoKbWV0aG9kcy5yZW1vdmVNZWFzdXJlID0gZnVuY3Rpb24gKCkgewogIGlmICh0aGlzLm1lYXN1cmVDb250cm9sKSB7CiAgICB0aGlzLnJlbW92ZUNvbnRyb2wodGhpcy5tZWFzdXJlQ29udHJvbCk7CiAgICB0aGlzLm1lYXN1cmVDb250cm9sID0gbnVsbDsKICB9Cn07CgptZXRob2RzLmFkZFNlbGVjdCA9IGZ1bmN0aW9uIChjdEdyb3VwKSB7CiAgdmFyIF90aGlzOCA9IHRoaXM7CgogIG1ldGhvZHMucmVtb3ZlU2VsZWN0LmNhbGwodGhpcyk7CiAgdGhpcy5fc2VsZWN0QnV0dG9uID0gX2xlYWZsZXQyWyJkZWZhdWx0Il0uZWFzeUJ1dHRvbih7CiAgICBzdGF0ZXM6IFt7CiAgICAgIHN0YXRlTmFtZTogInNlbGVjdC1pbmFjdGl2ZSIsCiAgICAgIGljb246ICJpb24tcXItc2Nhbm5lciIsCiAgICAgIHRpdGxlOiAiTWFrZSBhIHNlbGVjdGlvbiIsCiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soYnRuLCBtYXApIHsKICAgICAgICBidG4uc3RhdGUoInNlbGVjdC1hY3RpdmUiKTsKICAgICAgICBfdGhpczguX2xvY2F0aW9uRmlsdGVyID0gbmV3IF9sZWFmbGV0MlsiZGVmYXVsdCJdLkxvY2F0aW9uRmlsdGVyMigpOwoKICAgICAgICBpZiAoY3RHcm91cCkgewogICAgICAgICAgdmFyIHNlbGVjdGlvbkhhbmRsZSA9IG5ldyBnbG9iYWwuY3Jvc3N0YWxrLlNlbGVjdGlvbkhhbmRsZShjdEdyb3VwKTsKICAgICAgICAgIHNlbGVjdGlvbkhhbmRsZS5vbigiY2hhbmdlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgaWYgKGUuc2VuZGVyICE9PSBzZWxlY3Rpb25IYW5kbGUpIHsKICAgICAgICAgICAgICBpZiAoX3RoaXM4Ll9sb2NhdGlvbkZpbHRlcikgewogICAgICAgICAgICAgICAgX3RoaXM4Ll9sb2NhdGlvbkZpbHRlci5kaXNhYmxlKCk7CgogICAgICAgICAgICAgICAgYnRuLnN0YXRlKCJzZWxlY3QtaW5hY3RpdmUiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwoKICAgICAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gaGFuZGxlcihlKSB7CiAgICAgICAgICAgIF90aGlzOC5sYXllck1hbmFnZXIuYnJ1c2goX3RoaXM4Ll9sb2NhdGlvbkZpbHRlci5nZXRCb3VuZHMoKSwgewogICAgICAgICAgICAgIHNlbmRlcjogc2VsZWN0aW9uSGFuZGxlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfTsKCiAgICAgICAgICBfdGhpczguX2xvY2F0aW9uRmlsdGVyLm9uKCJlbmFibGVkIiwgaGFuZGxlcik7CgogICAgICAgICAgX3RoaXM4Ll9sb2NhdGlvbkZpbHRlci5vbigiY2hhbmdlIiwgaGFuZGxlcik7CgogICAgICAgICAgX3RoaXM4Ll9sb2NhdGlvbkZpbHRlci5vbigiZGlzYWJsZWQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHNlbGVjdGlvbkhhbmRsZS5jbG9zZSgpOwogICAgICAgICAgICBfdGhpczguX2xvY2F0aW9uRmlsdGVyID0gbnVsbDsKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgX3RoaXM4Ll9sb2NhdGlvbkZpbHRlci5hZGRUbyhtYXApOwogICAgICB9CiAgICB9LCB7CiAgICAgIHN0YXRlTmFtZTogInNlbGVjdC1hY3RpdmUiLAogICAgICBpY29uOiAiaW9uLWNsb3NlLXJvdW5kIiwKICAgICAgdGl0bGU6ICJEaXNtaXNzIHNlbGVjdGlvbiIsCiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soYnRuLCBtYXApIHsKICAgICAgICBidG4uc3RhdGUoInNlbGVjdC1pbmFjdGl2ZSIpOwoKICAgICAgICBfdGhpczguX2xvY2F0aW9uRmlsdGVyLmRpc2FibGUoKTsgLy8gSWYgZXhwbGljaXRseSBkaXNtaXNzZWQsIGNsZWFyIHRoZSBjcm9zc3RhbGsgc2VsZWN0aW9ucwoKCiAgICAgICAgX3RoaXM4LmxheWVyTWFuYWdlci51bmJydXNoKCk7CiAgICAgIH0KICAgIH1dCiAgfSk7CgogIHRoaXMuX3NlbGVjdEJ1dHRvbi5hZGRUbyh0aGlzKTsKfTsKCm1ldGhvZHMucmVtb3ZlU2VsZWN0ID0gZnVuY3Rpb24gKCkgewogIGlmICh0aGlzLl9sb2NhdGlvbkZpbHRlcikgewogICAgdGhpcy5fbG9jYXRpb25GaWx0ZXIuZGlzYWJsZSgpOwogIH0KCiAgaWYgKHRoaXMuX3NlbGVjdEJ1dHRvbikgewogICAgdGhpcy5yZW1vdmVDb250cm9sKHRoaXMuX3NlbGVjdEJ1dHRvbik7CiAgICB0aGlzLl9zZWxlY3RCdXR0b24gPSBudWxsOwogIH0KfTsKCm1ldGhvZHMuY3JlYXRlTWFwUGFuZSA9IGZ1bmN0aW9uIChuYW1lLCB6SW5kZXgpIHsKICB0aGlzLmNyZWF0ZVBhbmUobmFtZSk7CiAgdGhpcy5nZXRQYW5lKG5hbWUpLnN0eWxlLnpJbmRleCA9IHpJbmRleDsKfTsKCgp9KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gInVuZGVmaW5lZCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB7fSkKfSx7Ii4vY2x1c3Rlci1sYXllci1zdG9yZSI6MSwiLi9jcnNfdXRpbHMiOjMsIi4vZGF0YWZyYW1lIjo0LCIuL2dsb2JhbC9odG1sd2lkZ2V0cyI6OCwiLi9nbG9iYWwvanF1ZXJ5Ijo5LCIuL2dsb2JhbC9sZWFmbGV0IjoxMCwiLi9nbG9iYWwvc2hpbnkiOjEyLCIuL21pcG1hcHBlciI6MTYsIi4vdXRpbCI6MTd9XSwxNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsKICB2YWx1ZTogdHJ1ZQp9KTsKCmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7IH0gfQoKZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0KCmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9CgovLyBUaGlzIGNsYXNzIHNpbXVsYXRlcyBhIG1pcG1hcCwgd2hpY2ggc2hyaW5rcyBpbWFnZXMgYnkgcG93ZXJzIG9mIHR3by4gVGhpcwovLyBzdGVwd2lzZSByZWR1Y3Rpb24gcmVzdWx0cyBpbiAicGl4ZWwtcGVyZmVjdCBkb3duc2NhbGluZyIgKHdoZXJlIGV2ZXJ5Ci8vIHBpeGVsIG9mIHRoZSBvcmlnaW5hbCBpbWFnZSBoYXMgc29tZSBjb250cmlidXRpb24gdG8gdGhlIGRvd25zY2FsZWQgaW1hZ2UpCi8vIGFzIG9wcG9zZWQgdG8gYSBzaW5nbGUtc3RlcCBkb3duc2NhbGluZyB3aGljaCB3aWxsIGRpc2NhcmQgYSBsb3Qgb2YgZGF0YQovLyAoYW5kIHdpdGggc3BhcnNlIGltYWdlcyBhdCBzbWFsbCBzY2FsZXMgY2FuIGdpdmUgdmVyeSBzdXJwcmlzaW5nIHJlc3VsdHMpLgp2YXIgTWlwbWFwcGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICBmdW5jdGlvbiBNaXBtYXBwZXIoaW1nKSB7CiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWlwbWFwcGVyKTsKCiAgICB0aGlzLl9sYXllcnMgPSBbaW1nXTsKICB9IC8vIFRoZSB2YXJpb3VzIGZ1bmN0aW9ucyBvbiB0aGlzIGNsYXNzIHRha2UgYSBjYWxsYmFjayBmdW5jdGlvbiBCVVQgTUFZIE9SIE1BWQogIC8vIE5PVCBhY3R1YWxseSBiZWhhdmUgYXN5bmNocm9ub3VzbHkuCgoKICBfY3JlYXRlQ2xhc3MoTWlwbWFwcGVyLCBbewogICAga2V5OiAiZ2V0QnlTaXplIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRCeVNpemUoZGVzaXJlZFdpZHRoLCBkZXNpcmVkSGVpZ2h0LCBjYWxsYmFjaykgewogICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgdmFyIGkgPSAwOwogICAgICB2YXIgbGFzdEltZyA9IHRoaXMuX2xheWVyc1swXTsKCiAgICAgIHZhciB0ZXN0TmV4dCA9IGZ1bmN0aW9uIHRlc3ROZXh0KCkgewogICAgICAgIF90aGlzLmdldEJ5SW5kZXgoaSwgZnVuY3Rpb24gKGltZykgewogICAgICAgICAgLy8gSWYgY3VycmVudCBpbWFnZSBpcyBpbnZhbGlkIChpLmUuIHRvbyBzbWFsbCB0byBiZSByZW5kZXJlZCkgb3IKICAgICAgICAgIC8vIGl0J3Mgc21hbGxlciB0aGFuIHdoYXQgd2Ugd2FudGVkLCByZXR1cm4gdGhlIGxhc3Qga25vd24gZ29vZCBpbWFnZS4KICAgICAgICAgIGlmICghaW1nIHx8IGltZy53aWR0aCA8IGRlc2lyZWRXaWR0aCB8fCBpbWcuaGVpZ2h0IDwgZGVzaXJlZEhlaWdodCkgewogICAgICAgICAgICBjYWxsYmFjayhsYXN0SW1nKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGFzdEltZyA9IGltZzsKICAgICAgICAgICAgaSsrOwogICAgICAgICAgICB0ZXN0TmV4dCgpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH07CgogICAgICB0ZXN0TmV4dCgpOwogICAgfQogIH0sIHsKICAgIGtleTogImdldEJ5SW5kZXgiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGdldEJ5SW5kZXgoaSwgY2FsbGJhY2spIHsKICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CgogICAgICBpZiAodGhpcy5fbGF5ZXJzW2ldKSB7CiAgICAgICAgY2FsbGJhY2sodGhpcy5fbGF5ZXJzW2ldKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHRoaXMuZ2V0QnlJbmRleChpIC0gMSwgZnVuY3Rpb24gKHByZXZJbWcpIHsKICAgICAgICBpZiAoIXByZXZJbWcpIHsKICAgICAgICAgIC8vIHByZXZJbWcgY291bGQgbm90IGJlIGNhbGN1bGF0ZWQgKHRvbyBzbWFsbCwgcG9zc2libHkpCiAgICAgICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChwcmV2SW1nLndpZHRoIDwgMiB8fCBwcmV2SW1nLmhlaWdodCA8IDIpIHsKICAgICAgICAgIC8vIENhbid0IHJlZHVjZSB0aGlzIGltYWdlIGFueSBmdXJ0aGVyCiAgICAgICAgICBjYWxsYmFjayhudWxsKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IC8vIElmIHJlZHVjZSBldmVyIGJlY29tZXMgdHJ1bHkgYXN5bmNocm9ub3VzLCB3ZSBzaG91bGQgc3R1ZmYgYSBwcm9taXNlIG9yCiAgICAgICAgLy8gc29tZXRoaW5nIGludG8gdGhpcy5fbGF5ZXJzW2ldIGJlZm9yZSBjYWxsaW5nIHRoaXMucmVkdWNlKCksIHRvIHByZXZlbnQKICAgICAgICAvLyByZWR1bmRhbnQgcmVkdWNlIG9wZXJhdGlvbnMgZnJvbSBoYXBwZW5pbmcuCgoKICAgICAgICBfdGhpczIucmVkdWNlKHByZXZJbWcsIGZ1bmN0aW9uIChyZWR1Y2VkSW1nKSB7CiAgICAgICAgICBfdGhpczIuX2xheWVyc1tpXSA9IHJlZHVjZWRJbWc7CiAgICAgICAgICBjYWxsYmFjayhyZWR1Y2VkSW1nKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgfSwgewogICAga2V5OiAicmVkdWNlIiwKICAgIHZhbHVlOiBmdW5jdGlvbiByZWR1Y2UoaW1nLCBjYWxsYmFjaykgewogICAgICB2YXIgaW1nRGF0YUNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgICBpbWdEYXRhQ2FudmFzLndpZHRoID0gTWF0aC5jZWlsKGltZy53aWR0aCAvIDIpOwogICAgICBpbWdEYXRhQ2FudmFzLmhlaWdodCA9IE1hdGguY2VpbChpbWcuaGVpZ2h0IC8gMik7CiAgICAgIGltZ0RhdGFDYW52YXMuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpbWdEYXRhQ2FudmFzKTsKCiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGltZ0RhdGFDdHggPSBpbWdEYXRhQ2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgaW1nRGF0YUN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBpbWcud2lkdGggLyAyLCBpbWcuaGVpZ2h0IC8gMik7CiAgICAgICAgY2FsbGJhY2soaW1nRGF0YUNhbnZhcyk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChpbWdEYXRhQ2FudmFzKTsKICAgICAgfQogICAgfQogIH1dKTsKCiAgcmV0dXJuIE1pcG1hcHBlcjsKfSgpOwoKZXhwb3J0c1siZGVmYXVsdCJdID0gTWlwbWFwcGVyOwoKCn0se31dLDE3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwpleHBvcnRzLmxvZyA9IGxvZzsKZXhwb3J0cy5yZWN5Y2xlID0gcmVjeWNsZTsKZXhwb3J0cy5hc0FycmF5ID0gYXNBcnJheTsKCmZ1bmN0aW9uIGxvZyhtZXNzYWdlKSB7CiAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqLwogIGlmIChjb25zb2xlICYmIGNvbnNvbGUubG9nKSBjb25zb2xlLmxvZyhtZXNzYWdlKTsKICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi8KfQoKZnVuY3Rpb24gcmVjeWNsZSh2YWx1ZXMsIGxlbmd0aCwgaW5QbGFjZSkgewogIGlmIChsZW5ndGggPT09IDAgJiYgIWluUGxhY2UpIHJldHVybiBbXTsKCiAgaWYgKCEodmFsdWVzIGluc3RhbmNlb2YgQXJyYXkpKSB7CiAgICBpZiAoaW5QbGFjZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbid0IGRvIGluLXBsYWNlIHJlY3ljbGluZyBvZiBhIG5vbi1BcnJheSB2YWx1ZSIpOwogICAgfQoKICAgIHZhbHVlcyA9IFt2YWx1ZXNdOwogIH0KCiAgaWYgKHR5cGVvZiBsZW5ndGggPT09ICJ1bmRlZmluZWQiKSBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoOwogIHZhciBkZXN0ID0gaW5QbGFjZSA/IHZhbHVlcyA6IFtdOwogIHZhciBvcmlnTGVuZ3RoID0gdmFsdWVzLmxlbmd0aDsKCiAgd2hpbGUgKGRlc3QubGVuZ3RoIDwgbGVuZ3RoKSB7CiAgICBkZXN0LnB1c2godmFsdWVzW2Rlc3QubGVuZ3RoICUgb3JpZ0xlbmd0aF0pOwogIH0KCiAgaWYgKGRlc3QubGVuZ3RoID4gbGVuZ3RoKSB7CiAgICBkZXN0LnNwbGljZShsZW5ndGgsIGRlc3QubGVuZ3RoIC0gbGVuZ3RoKTsKICB9CgogIHJldHVybiBkZXN0Owp9CgpmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiB2YWx1ZTtlbHNlIHJldHVybiBbdmFsdWVdOwp9CgoKfSx7fV19LHt9LFsxM10pOwo="></script>
<script src="data:application/javascript;base64,KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7DQoJaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgew0KCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuDQoJCWRlZmluZShbJ2xlYWZsZXQnXSwgZmFjdG9yeSk7DQoJfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsNCgkJLy8gZGVmaW5lIGEgQ29tbW9uIEpTIG1vZHVsZSB0aGF0IHJlbGllcyBvbiAnbGVhZmxldCcNCgkJbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoJ2xlYWZsZXQnKSk7DQoJfSBlbHNlIHsNCgkJLy8gQXNzdW1lIExlYWZsZXQgaXMgbG9hZGVkIGludG8gZ2xvYmFsIG9iamVjdCBMIGFscmVhZHkNCgkJZmFjdG9yeShMKTsNCgl9DQp9KHRoaXMsIGZ1bmN0aW9uIChMKSB7DQoJJ3VzZSBzdHJpY3QnOw0KDQoJTC5UaWxlTGF5ZXIuUHJvdmlkZXIgPSBMLlRpbGVMYXllci5leHRlbmQoew0KCQlpbml0aWFsaXplOiBmdW5jdGlvbiAoYXJnLCBvcHRpb25zKSB7DQoJCQl2YXIgcHJvdmlkZXJzID0gTC5UaWxlTGF5ZXIuUHJvdmlkZXIucHJvdmlkZXJzOw0KDQoJCQl2YXIgcGFydHMgPSBhcmcuc3BsaXQoJy4nKTsNCg0KCQkJdmFyIHByb3ZpZGVyTmFtZSA9IHBhcnRzWzBdOw0KCQkJdmFyIHZhcmlhbnROYW1lID0gcGFydHNbMV07DQoNCgkJCWlmICghcHJvdmlkZXJzW3Byb3ZpZGVyTmFtZV0pIHsNCgkJCQl0aHJvdyAnTm8gc3VjaCBwcm92aWRlciAoJyArIHByb3ZpZGVyTmFtZSArICcpJzsNCgkJCX0NCg0KCQkJdmFyIHByb3ZpZGVyID0gew0KCQkJCXVybDogcHJvdmlkZXJzW3Byb3ZpZGVyTmFtZV0udXJsLA0KCQkJCW9wdGlvbnM6IHByb3ZpZGVyc1twcm92aWRlck5hbWVdLm9wdGlvbnMNCgkJCX07DQoNCgkJCS8vIG92ZXJ3cml0ZSB2YWx1ZXMgaW4gcHJvdmlkZXIgZnJvbSB2YXJpYW50Lg0KCQkJaWYgKHZhcmlhbnROYW1lICYmICd2YXJpYW50cycgaW4gcHJvdmlkZXJzW3Byb3ZpZGVyTmFtZV0pIHsNCgkJCQlpZiAoISh2YXJpYW50TmFtZSBpbiBwcm92aWRlcnNbcHJvdmlkZXJOYW1lXS52YXJpYW50cykpIHsNCgkJCQkJdGhyb3cgJ05vIHN1Y2ggdmFyaWFudCBvZiAnICsgcHJvdmlkZXJOYW1lICsgJyAoJyArIHZhcmlhbnROYW1lICsgJyknOw0KCQkJCX0NCgkJCQl2YXIgdmFyaWFudCA9IHByb3ZpZGVyc1twcm92aWRlck5hbWVdLnZhcmlhbnRzW3ZhcmlhbnROYW1lXTsNCgkJCQl2YXIgdmFyaWFudE9wdGlvbnM7DQoJCQkJaWYgKHR5cGVvZiB2YXJpYW50ID09PSAnc3RyaW5nJykgew0KCQkJCQl2YXJpYW50T3B0aW9ucyA9IHsNCgkJCQkJCXZhcmlhbnQ6IHZhcmlhbnQNCgkJCQkJfTsNCgkJCQl9IGVsc2Ugew0KCQkJCQl2YXJpYW50T3B0aW9ucyA9IHZhcmlhbnQub3B0aW9uczsNCgkJCQl9DQoJCQkJcHJvdmlkZXIgPSB7DQoJCQkJCXVybDogdmFyaWFudC51cmwgfHwgcHJvdmlkZXIudXJsLA0KCQkJCQlvcHRpb25zOiBMLlV0aWwuZXh0ZW5kKHt9LCBwcm92aWRlci5vcHRpb25zLCB2YXJpYW50T3B0aW9ucykNCgkJCQl9Ow0KCQkJfQ0KDQoJCQkvLyByZXBsYWNlIGF0dHJpYnV0aW9uIHBsYWNlaG9sZGVycyB3aXRoIHRoZWlyIHZhbHVlcyBmcm9tIHRvcGxldmVsIHByb3ZpZGVyIGF0dHJpYnV0aW9uLA0KCQkJLy8gcmVjdXJzaXZlbHkNCgkJCXZhciBhdHRyaWJ1dGlvblJlcGxhY2VyID0gZnVuY3Rpb24gKGF0dHIpIHsNCgkJCQlpZiAoYXR0ci5pbmRleE9mKCd7YXR0cmlidXRpb24uJykgPT09IC0xKSB7DQoJCQkJCXJldHVybiBhdHRyOw0KCQkJCX0NCgkJCQlyZXR1cm4gYXR0ci5yZXBsYWNlKC9ce2F0dHJpYnV0aW9uLihcdyopXH0vZywNCgkJCQkJZnVuY3Rpb24gKG1hdGNoLCBhdHRyaWJ1dGlvbk5hbWUpIHsNCgkJCQkJCXJldHVybiBhdHRyaWJ1dGlvblJlcGxhY2VyKHByb3ZpZGVyc1thdHRyaWJ1dGlvbk5hbWVdLm9wdGlvbnMuYXR0cmlidXRpb24pOw0KCQkJCQl9DQoJCQkJKTsNCgkJCX07DQoJCQlwcm92aWRlci5vcHRpb25zLmF0dHJpYnV0aW9uID0gYXR0cmlidXRpb25SZXBsYWNlcihwcm92aWRlci5vcHRpb25zLmF0dHJpYnV0aW9uKTsNCg0KCQkJLy8gQ29tcHV0ZSBmaW5hbCBvcHRpb25zIGNvbWJpbmluZyBwcm92aWRlciBvcHRpb25zIHdpdGggYW55IHVzZXIgb3ZlcnJpZGVzDQoJCQl2YXIgbGF5ZXJPcHRzID0gTC5VdGlsLmV4dGVuZCh7fSwgcHJvdmlkZXIub3B0aW9ucywgb3B0aW9ucyk7DQoJCQlMLlRpbGVMYXllci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHByb3ZpZGVyLnVybCwgbGF5ZXJPcHRzKTsNCgkJfQ0KCX0pOw0KDQoJLyoqDQoJICogRGVmaW5pdGlvbiBvZiBwcm92aWRlcnMuDQoJICogc2VlIGh0dHA6Ly9sZWFmbGV0anMuY29tL3JlZmVyZW5jZS5odG1sI3RpbGVsYXllciBmb3Igb3B0aW9ucyBpbiB0aGUgb3B0aW9ucyBtYXAuDQoJICovDQoNCglMLlRpbGVMYXllci5Qcm92aWRlci5wcm92aWRlcnMgPSB7DQoJCU9wZW5TdHJlZXRNYXA6IHsNCgkJCXVybDogJy8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywNCgkJCW9wdGlvbnM6IHsNCgkJCQltYXhab29tOiAxOSwNCgkJCQlhdHRyaWJ1dGlvbjoNCgkJCQkJJyZjb3B5OyA8YSBocmVmPSJodHRwczovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHQiPk9wZW5TdHJlZXRNYXA8L2E+IGNvbnRyaWJ1dG9ycycNCgkJCX0sDQoJCQl2YXJpYW50czogew0KCQkJCU1hcG5pazoge30sDQoJCQkJREU6IHsNCgkJCQkJdXJsOiAnLy97c30udGlsZS5vcGVuc3RyZWV0bWFwLmRlL3RpbGVzL29zbWRlL3t6fS97eH0ve3l9LnBuZycsDQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCW1heFpvb206IDE4DQoJCQkJCX0NCgkJCQl9LA0KCQkJCUNIOiB7DQoJCQkJCXVybDogJy8vdGlsZS5vc20uY2gvc3dpdHplcmxhbmQve3p9L3t4fS97eX0ucG5nJywNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJbWF4Wm9vbTogMTgsDQoJCQkJCQlib3VuZHM6IFtbNDUsIDVdLCBbNDgsIDExXV0NCgkJCQkJfQ0KCQkJCX0sDQoJCQkJRnJhbmNlOiB7DQoJCQkJCXVybDogJy8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5mci9vc21mci97en0ve3h9L3t5fS5wbmcnLA0KCQkJCQlvcHRpb25zOiB7DQoJCQkJCQltYXhab29tOiAyMCwNCgkJCQkJCWF0dHJpYnV0aW9uOiAnJmNvcHk7IE9wZW5zdHJlZXRtYXAgRnJhbmNlIHwge2F0dHJpYnV0aW9uLk9wZW5TdHJlZXRNYXB9Jw0KCQkJCQl9DQoJCQkJfSwNCgkJCQlIT1Q6IHsNCgkJCQkJdXJsOiAnLy97c30udGlsZS5vcGVuc3RyZWV0bWFwLmZyL2hvdC97en0ve3h9L3t5fS5wbmcnLA0KCQkJCQlvcHRpb25zOiB7DQoJCQkJCQlhdHRyaWJ1dGlvbjoNCgkJCQkJCQkne2F0dHJpYnV0aW9uLk9wZW5TdHJlZXRNYXB9LCAnICsNCgkJCQkJCQknVGlsZXMgc3R5bGUgYnkgPGEgaHJlZj0iaHR0cHM6Ly93d3cuaG90b3NtLm9yZy8iIHRhcmdldD0iX2JsYW5rIj5IdW1hbml0YXJpYW4gT3BlblN0cmVldE1hcCBUZWFtPC9hPiAnICsNCgkJCQkJCQknaG9zdGVkIGJ5IDxhIGhyZWY9Imh0dHBzOi8vb3BlbnN0cmVldG1hcC5mci8iIHRhcmdldD0iX2JsYW5rIj5PcGVuU3RyZWV0TWFwIEZyYW5jZTwvYT4nDQoJCQkJCX0NCgkJCQl9LA0KCQkJCUJaSDogew0KCQkJCQl1cmw6ICcvL3RpbGUub3BlbnN0cmVldG1hcC5iemgvYnIve3p9L3t4fS97eX0ucG5nJywNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJYXR0cmlidXRpb246ICd7YXR0cmlidXRpb24uT3BlblN0cmVldE1hcH0sIFRpbGVzIGNvdXJ0ZXN5IG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cub3BlbnN0cmVldG1hcC5iemgvIiB0YXJnZXQ9Il9ibGFuayI+QnJldG9uIE9wZW5TdHJlZXRNYXAgVGVhbTwvYT4nLA0KCQkJCQkJYm91bmRzOiBbWzQ2LjIsIC01LjVdLCBbNTAsIDAuN11dDQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0sDQoJCU9wZW5TZWFNYXA6IHsNCgkJCXVybDogJy8vdGlsZXMub3BlbnNlYW1hcC5vcmcvc2VhbWFyay97en0ve3h9L3t5fS5wbmcnLA0KCQkJb3B0aW9uczogew0KCQkJCWF0dHJpYnV0aW9uOiAnTWFwIGRhdGE6ICZjb3B5OyA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5zZWFtYXAub3JnIj5PcGVuU2VhTWFwPC9hPiBjb250cmlidXRvcnMnDQoJCQl9DQoJCX0sDQoJCU9wZW5QdE1hcDogew0KCQkJdXJsOiAnaHR0cDovL29wZW5wdG1hcC5vcmcvdGlsZXMve3p9L3t4fS97eX0ucG5nJywNCgkJCW9wdGlvbnM6IHsNCgkJCQltYXhab29tOiAxNywNCgkJCQlhdHRyaWJ1dGlvbjogJ01hcCBkYXRhOiAmY29weTsgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVucHRtYXAub3JnIj5PcGVuUHRNYXA8L2E+IGNvbnRyaWJ1dG9ycycNCgkJCX0NCgkJfSwNCgkJT3BlblRvcG9NYXA6IHsNCgkJCXVybDogJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnRvcG9tYXAub3JnL3t6fS97eH0ve3l9LnBuZycsDQoJCQlvcHRpb25zOiB7DQoJCQkJbWF4Wm9vbTogMTcsDQoJCQkJYXR0cmlidXRpb246ICdNYXAgZGF0YToge2F0dHJpYnV0aW9uLk9wZW5TdHJlZXRNYXB9LCA8YSBocmVmPSJodHRwOi8vdmlld2ZpbmRlcnBhbm9yYW1hcy5vcmciPlNSVE08L2E+IHwgTWFwIHN0eWxlOiAmY29weTsgPGEgaHJlZj0iaHR0cHM6Ly9vcGVudG9wb21hcC5vcmciPk9wZW5Ub3BvTWFwPC9hPiAoPGEgaHJlZj0iaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzMuMC8iPkNDLUJZLVNBPC9hPiknDQoJCQl9DQoJCX0sDQoJCU9wZW5SYWlsd2F5TWFwOiB7DQoJCQl1cmw6ICdodHRwczovL3tzfS50aWxlcy5vcGVucmFpbHdheW1hcC5vcmcvc3RhbmRhcmQve3p9L3t4fS97eX0ucG5nJywNCgkJCW9wdGlvbnM6IHsNCgkJCQltYXhab29tOiAxOSwNCgkJCQlhdHRyaWJ1dGlvbjogJ01hcCBkYXRhOiB7YXR0cmlidXRpb24uT3BlblN0cmVldE1hcH0gfCBNYXAgc3R5bGU6ICZjb3B5OyA8YSBocmVmPSJodHRwczovL3d3dy5PcGVuUmFpbHdheU1hcC5vcmciPk9wZW5SYWlsd2F5TWFwPC9hPiAoPGEgaHJlZj0iaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzMuMC8iPkNDLUJZLVNBPC9hPiknDQoJCQl9DQoJCX0sDQoJCU9wZW5GaXJlTWFwOiB7DQoJCQl1cmw6ICdodHRwOi8vb3BlbmZpcmVtYXAub3JnL2h5dGlsZXMve3p9L3t4fS97eX0ucG5nJywNCgkJCW9wdGlvbnM6IHsNCgkJCQltYXhab29tOiAxOSwNCgkJCQlhdHRyaWJ1dGlvbjogJ01hcCBkYXRhOiB7YXR0cmlidXRpb24uT3BlblN0cmVldE1hcH0gfCBNYXAgc3R5bGU6ICZjb3B5OyA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5maXJlbWFwLm9yZyI+T3BlbkZpcmVNYXA8L2E+ICg8YSBocmVmPSJodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvMy4wLyI+Q0MtQlktU0E8L2E+KScNCgkJCX0NCgkJfSwNCgkJU2FmZUNhc3Q6IHsNCgkJCXVybDogJy8vczMuYW1hem9uYXdzLmNvbS90ZTUxMi5zYWZlY2FzdC5vcmcve3p9L3t4fS97eX0ucG5nJywNCgkJCW9wdGlvbnM6IHsNCgkJCQltYXhab29tOiAxNiwNCgkJCQlhdHRyaWJ1dGlvbjogJ01hcCBkYXRhOiB7YXR0cmlidXRpb24uT3BlblN0cmVldE1hcH0gfCBNYXAgc3R5bGU6ICZjb3B5OyA8YSBocmVmPSJodHRwczovL2Jsb2cuc2FmZWNhc3Qub3JnL2Fib3V0LyI+U2FmZUNhc3Q8L2E+ICg8YSBocmVmPSJodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvMy4wLyI+Q0MtQlktU0E8L2E+KScNCgkJCX0NCgkJfSwNCgkJVGh1bmRlcmZvcmVzdDogew0KCQkJdXJsOiAnaHR0cHM6Ly97c30udGlsZS50aHVuZGVyZm9yZXN0LmNvbS97dmFyaWFudH0ve3p9L3t4fS97eX0ucG5nP2FwaWtleT17YXBpa2V5fScsDQoJCQlvcHRpb25zOiB7DQoJCQkJYXR0cmlidXRpb246DQoJCQkJCScmY29weTsgPGEgaHJlZj0iaHR0cDovL3d3dy50aHVuZGVyZm9yZXN0LmNvbS8iPlRodW5kZXJmb3Jlc3Q8L2E+LCB7YXR0cmlidXRpb24uT3BlblN0cmVldE1hcH0nLA0KCQkJCXZhcmlhbnQ6ICdjeWNsZScsDQoJCQkJYXBpa2V5OiAnPGluc2VydCB5b3VyIGFwaSBrZXkgaGVyZT4nLA0KCQkJCW1heFpvb206IDIyDQoJCQl9LA0KCQkJdmFyaWFudHM6IHsNCgkJCQlPcGVuQ3ljbGVNYXA6ICdjeWNsZScsDQoJCQkJVHJhbnNwb3J0OiB7DQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCXZhcmlhbnQ6ICd0cmFuc3BvcnQnDQoJCQkJCX0NCgkJCQl9LA0KCQkJCVRyYW5zcG9ydERhcms6IHsNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJdmFyaWFudDogJ3RyYW5zcG9ydC1kYXJrJw0KCQkJCQl9DQoJCQkJfSwNCgkJCQlTcGluYWxNYXA6IHsNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJdmFyaWFudDogJ3NwaW5hbC1tYXAnDQoJCQkJCX0NCgkJCQl9LA0KCQkJCUxhbmRzY2FwZTogJ2xhbmRzY2FwZScsDQoJCQkJT3V0ZG9vcnM6ICdvdXRkb29ycycsDQoJCQkJUGlvbmVlcjogJ3Bpb25lZXInLA0KCQkJCU1vYmlsZUF0bGFzOiAnbW9iaWxlLWF0bGFzJywNCgkJCQlOZWlnaGJvdXJob29kOiAnbmVpZ2hib3VyaG9vZCcNCgkJCX0NCgkJfSwNCgkJT3Blbk1hcFN1cmZlcjogew0KCQkJdXJsOiAnaHR0cHM6Ly9tYXBzLmhlaWdpdC5vcmcvb3Blbm1hcHN1cmZlci90aWxlcy97dmFyaWFudH0vd2VibWVyY2F0b3Ive3p9L3t4fS97eX0ucG5nJywNCgkJCW9wdGlvbnM6IHsNCgkJCQltYXhab29tOiAxOSwNCgkJCQl2YXJpYW50OiAncm9hZHMnLA0KCQkJCWF0dHJpYnV0aW9uOiAnSW1hZ2VyeSBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9naXNjaWVuY2UudW5pLWhkLmRlLyI+R0lTY2llbmNlIFJlc2VhcmNoIEdyb3VwIEAgVW5pdmVyc2l0eSBvZiBIZWlkZWxiZXJnPC9hPiB8IE1hcCBkYXRhICcNCgkJCX0sDQoJCQl2YXJpYW50czogew0KCQkJCVJvYWRzOiB7DQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCXZhcmlhbnQ6ICdyb2FkcycsDQoJCQkJCQlhdHRyaWJ1dGlvbjogJ3thdHRyaWJ1dGlvbi5PcGVuTWFwU3VyZmVyfXthdHRyaWJ1dGlvbi5PcGVuU3RyZWV0TWFwfScNCgkJCQkJfQ0KCQkJCX0sDQoJCQkJSHlicmlkOiB7DQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCXZhcmlhbnQ6ICdoeWJyaWQnLA0KCQkJCQkJYXR0cmlidXRpb246ICd7YXR0cmlidXRpb24uT3Blbk1hcFN1cmZlcn17YXR0cmlidXRpb24uT3BlblN0cmVldE1hcH0nDQoJCQkJCX0NCgkJCQl9LA0KCQkJCUFkbWluQm91bmRzOiB7DQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCXZhcmlhbnQ6ICdhZG1pbmInLA0KCQkJCQkJbWF4Wm9vbTogMTgsDQoJCQkJCQlhdHRyaWJ1dGlvbjogJ3thdHRyaWJ1dGlvbi5PcGVuTWFwU3VyZmVyfXthdHRyaWJ1dGlvbi5PcGVuU3RyZWV0TWFwfScNCgkJCQkJfQ0KCQkJCX0sDQoJCQkJQ29udG91ckxpbmVzOiB7DQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCXZhcmlhbnQ6ICdhc3RlcmMnLA0KCQkJCQkJbWF4Wm9vbTogMTgsDQoJCQkJCQltaW5ab29tOiAxMywNCgkJCQkJCWF0dHJpYnV0aW9uOiAne2F0dHJpYnV0aW9uLk9wZW5NYXBTdXJmZXJ9IDxhIGhyZWY9Imh0dHBzOi8vbHBkYWFjLnVzZ3MuZ292L3Byb2R1Y3RzL2FzdGVyX3BvbGljaWVzIj5BU1RFUiBHREVNPC9hPicNCgkJCQkJfQ0KCQkJCX0sDQoJCQkJSGlsbHNoYWRlOiB7DQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCXZhcmlhbnQ6ICdhc3RlcmgnLA0KCQkJCQkJbWF4Wm9vbTogMTgsDQoJCQkJCQlhdHRyaWJ1dGlvbjogJ3thdHRyaWJ1dGlvbi5PcGVuTWFwU3VyZmVyfSA8YSBocmVmPSJodHRwczovL2xwZGFhYy51c2dzLmdvdi9wcm9kdWN0cy9hc3Rlcl9wb2xpY2llcyI+QVNURVIgR0RFTTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly9zcnRtLmNzaS5jZ2lhci5vcmcvIj5TUlRNPC9hPicNCgkJCQkJfQ0KCQkJCX0sDQoJCQkJRWxlbWVudHNBdFJpc2s6IHsNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJdmFyaWFudDogJ2VsZW1lbnRzX2F0X3Jpc2snLA0KCQkJCQkJYXR0cmlidXRpb246ICd7YXR0cmlidXRpb24uT3Blbk1hcFN1cmZlcn17YXR0cmlidXRpb24uT3BlblN0cmVldE1hcH0nDQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0sDQoJCUh5ZGRhOiB7DQoJCQl1cmw6ICcvL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAuc2UvaHlkZGEve3ZhcmlhbnR9L3t6fS97eH0ve3l9LnBuZycsDQoJCQlvcHRpb25zOiB7DQoJCQkJbWF4Wm9vbTogMTgsDQoJCQkJdmFyaWFudDogJ2Z1bGwnLA0KCQkJCWF0dHJpYnV0aW9uOiAnVGlsZXMgY291cnRlc3kgb2YgPGEgaHJlZj0iaHR0cDovL29wZW5zdHJlZXRtYXAuc2UvIiB0YXJnZXQ9Il9ibGFuayI+T3BlblN0cmVldE1hcCBTd2VkZW48L2E+ICZtZGFzaDsgTWFwIGRhdGEge2F0dHJpYnV0aW9uLk9wZW5TdHJlZXRNYXB9Jw0KCQkJfSwNCgkJCXZhcmlhbnRzOiB7DQoJCQkJRnVsbDogJ2Z1bGwnLA0KCQkJCUJhc2U6ICdiYXNlJywNCgkJCQlSb2Fkc0FuZExhYmVsczogJ3JvYWRzX2FuZF9sYWJlbHMnDQoJCQl9DQoJCX0sDQoJCU1hcEJveDogew0KCQkJdXJsOiAnaHR0cHM6Ly9hcGkudGlsZXMubWFwYm94LmNvbS92NC97aWR9L3t6fS97eH0ve3l9e3J9LnBuZz9hY2Nlc3NfdG9rZW49e2FjY2Vzc1Rva2VufScsDQoJCQlvcHRpb25zOiB7DQoJCQkJYXR0cmlidXRpb246DQoJCQkJCSc8YSBocmVmPSJodHRwczovL3d3dy5tYXBib3guY29tL2Fib3V0L21hcHMvIiB0YXJnZXQ9Il9ibGFuayI+JmNvcHk7IE1hcGJveDwvYT4gJyArDQoJCQkJCSd7YXR0cmlidXRpb24uT3BlblN0cmVldE1hcH0gJyArDQoJCQkJCSc8YSBocmVmPSJodHRwczovL3d3dy5tYXBib3guY29tL21hcC1mZWVkYmFjay8iIHRhcmdldD0iX2JsYW5rIj5JbXByb3ZlIHRoaXMgbWFwPC9hPicsDQoJCQkJc3ViZG9tYWluczogJ2FiY2QnLA0KCQkJCWlkOiAnbWFwYm94LnN0cmVldHMnLA0KCQkJCWFjY2Vzc1Rva2VuOiAnPGluc2VydCB5b3VyIGFjY2VzcyB0b2tlbiBoZXJlPicsDQoJCQl9DQoJCX0sDQoJCVN0YW1lbjogew0KCQkJdXJsOiAnLy9zdGFtZW4tdGlsZXMte3N9LmEuc3NsLmZhc3RseS5uZXQve3ZhcmlhbnR9L3t6fS97eH0ve3l9e3J9LntleHR9JywNCgkJCW9wdGlvbnM6IHsNCgkJCQlhdHRyaWJ1dGlvbjoNCgkJCQkJJ01hcCB0aWxlcyBieSA8YSBocmVmPSJodHRwOi8vc3RhbWVuLmNvbSI+U3RhbWVuIERlc2lnbjwvYT4sICcgKw0KCQkJCQknPGEgaHJlZj0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wIj5DQyBCWSAzLjA8L2E+ICZtZGFzaDsgJyArDQoJCQkJCSdNYXAgZGF0YSB7YXR0cmlidXRpb24uT3BlblN0cmVldE1hcH0nLA0KCQkJCXN1YmRvbWFpbnM6ICdhYmNkJywNCgkJCQltaW5ab29tOiAwLA0KCQkJCW1heFpvb206IDIwLA0KCQkJCXZhcmlhbnQ6ICd0b25lcicsDQoJCQkJZXh0OiAncG5nJw0KCQkJfSwNCgkJCXZhcmlhbnRzOiB7DQoJCQkJVG9uZXI6ICd0b25lcicsDQoJCQkJVG9uZXJCYWNrZ3JvdW5kOiAndG9uZXItYmFja2dyb3VuZCcsDQoJCQkJVG9uZXJIeWJyaWQ6ICd0b25lci1oeWJyaWQnLA0KCQkJCVRvbmVyTGluZXM6ICd0b25lci1saW5lcycsDQoJCQkJVG9uZXJMYWJlbHM6ICd0b25lci1sYWJlbHMnLA0KCQkJCVRvbmVyTGl0ZTogJ3RvbmVyLWxpdGUnLA0KCQkJCVdhdGVyY29sb3I6IHsNCgkJCQkJdXJsOiAnLy9zdGFtZW4tdGlsZXMte3N9LmEuc3NsLmZhc3RseS5uZXQve3ZhcmlhbnR9L3t6fS97eH0ve3l9LntleHR9JywNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJdmFyaWFudDogJ3dhdGVyY29sb3InLA0KCQkJCQkJZXh0OiAnanBnJywNCgkJCQkJCW1pblpvb206IDEsDQoJCQkJCQltYXhab29tOiAxNg0KCQkJCQl9DQoJCQkJfSwNCgkJCQlUZXJyYWluOiB7DQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCXZhcmlhbnQ6ICd0ZXJyYWluJywNCgkJCQkJCW1pblpvb206IDAsDQoJCQkJCQltYXhab29tOiAxOA0KCQkJCQl9DQoJCQkJfSwNCgkJCQlUZXJyYWluQmFja2dyb3VuZDogew0KCQkJCQlvcHRpb25zOiB7DQoJCQkJCQl2YXJpYW50OiAndGVycmFpbi1iYWNrZ3JvdW5kJywNCgkJCQkJCW1pblpvb206IDAsDQoJCQkJCQltYXhab29tOiAxOA0KCQkJCQl9DQoJCQkJfSwNCgkJCQlUZXJyYWluTGFiZWxzOiB7DQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCXZhcmlhbnQ6ICd0ZXJyYWluLWxhYmVscycsDQoJCQkJCQltaW5ab29tOiAwLA0KCQkJCQkJbWF4Wm9vbTogMTgNCgkJCQkJfQ0KCQkJCX0sDQoJCQkJVG9wT1NNUmVsaWVmOiB7DQoJCQkJCXVybDogJy8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3t2YXJpYW50fS97en0ve3h9L3t5fS57ZXh0fScsDQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCXZhcmlhbnQ6ICd0b3Bvc20tY29sb3ItcmVsaWVmJywNCgkJCQkJCWV4dDogJ2pwZycsDQoJCQkJCQlib3VuZHM6IFtbMjIsIC0xMzJdLCBbNTEsIC01Nl1dDQoJCQkJCX0NCgkJCQl9LA0KCQkJCVRvcE9TTUZlYXR1cmVzOiB7DQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCXZhcmlhbnQ6ICd0b3Bvc20tZmVhdHVyZXMnLA0KCQkJCQkJYm91bmRzOiBbWzIyLCAtMTMyXSwgWzUxLCAtNTZdXSwNCgkJCQkJCW9wYWNpdHk6IDAuOQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9LA0KCQlUb21Ub206IHsNCgkJCXVybDogJ2h0dHBzOi8ve3N9LmFwaS50b210b20uY29tL21hcC8xL3RpbGUve3ZhcmlhbnR9L3tzdHlsZX0ve3p9L3t4fS97eX0ue2V4dH0/a2V5PXthcGlrZXl9JywNCgkJCW9wdGlvbnM6IHsNCgkJCQl2YXJpYW50OiAnYmFzaWMnLA0KCQkJCW1heFpvb206IDIyLA0KCQkJCWF0dHJpYnV0aW9uOg0KCQkJCQknPGEgaHJlZj0iaHR0cHM6Ly90b210b20uY29tIiB0YXJnZXQ9Il9ibGFuayI+JmNvcHk7ICAxOTkyIC0gJyArIG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSArICcgVG9tVG9tLjwvYT4gJywNCgkJCQlzdWJkb21haW5zOiAnYWJjZCcsDQoJCQkJc3R5bGU6ICdtYWluJywNCgkJCQlleHQ6ICdwbmcnLA0KCQkJCWFwaWtleTogJzxpbnNlcnQgeW91ciBBUEkga2V5IGhlcmU+JywNCgkJCX0sDQoJCQl2YXJpYW50czogew0KCQkJCUJhc2ljOiAnYmFzaWMnLA0KCQkJCUh5YnJpZDogJ2h5YnJpZCcsDQoJCQkJTGFiZWxzOiAnbGFiZWxzJw0KCQkJfQ0KCQl9LA0KCQlFc3JpOiB7DQoJCQl1cmw6ICcvL3NlcnZlci5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL3t2YXJpYW50fS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fScsDQoJCQlvcHRpb25zOiB7DQoJCQkJdmFyaWFudDogJ1dvcmxkX1N0cmVldF9NYXAnLA0KCQkJCWF0dHJpYnV0aW9uOiAnVGlsZXMgJmNvcHk7IEVzcmknDQoJCQl9LA0KCQkJdmFyaWFudHM6IHsNCgkJCQlXb3JsZFN0cmVldE1hcDogew0KCQkJCQlvcHRpb25zOiB7DQoJCQkJCQlhdHRyaWJ1dGlvbjoNCgkJCQkJCQkne2F0dHJpYnV0aW9uLkVzcml9ICZtZGFzaDsgJyArDQoJCQkJCQkJJ1NvdXJjZTogRXNyaSwgRGVMb3JtZSwgTkFWVEVRLCBVU0dTLCBJbnRlcm1hcCwgaVBDLCBOUkNBTiwgRXNyaSBKYXBhbiwgTUVUSSwgRXNyaSBDaGluYSAoSG9uZyBLb25nKSwgRXNyaSAoVGhhaWxhbmQpLCBUb21Ub20sIDIwMTInDQoJCQkJCX0NCgkJCQl9LA0KCQkJCURlTG9ybWU6IHsNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJdmFyaWFudDogJ1NwZWNpYWx0eS9EZUxvcm1lX1dvcmxkX0Jhc2VfTWFwJywNCgkJCQkJCW1pblpvb206IDEsDQoJCQkJCQltYXhab29tOiAxMSwNCgkJCQkJCWF0dHJpYnV0aW9uOiAne2F0dHJpYnV0aW9uLkVzcml9ICZtZGFzaDsgQ29weXJpZ2h0OiAmY29weTsyMDEyIERlTG9ybWUnDQoJCQkJCX0NCgkJCQl9LA0KCQkJCVdvcmxkVG9wb01hcDogew0KCQkJCQlvcHRpb25zOiB7DQoJCQkJCQl2YXJpYW50OiAnV29ybGRfVG9wb19NYXAnLA0KCQkJCQkJYXR0cmlidXRpb246DQoJCQkJCQkJJ3thdHRyaWJ1dGlvbi5Fc3JpfSAmbWRhc2g7ICcgKw0KCQkJCQkJCSdFc3JpLCBEZUxvcm1lLCBOQVZURVEsIFRvbVRvbSwgSW50ZXJtYXAsIGlQQywgVVNHUywgRkFPLCBOUFMsIE5SQ0FOLCBHZW9CYXNlLCBLYWRhc3RlciBOTCwgT3JkbmFuY2UgU3VydmV5LCBFc3JpIEphcGFuLCBNRVRJLCBFc3JpIENoaW5hIChIb25nIEtvbmcpLCBhbmQgdGhlIEdJUyBVc2VyIENvbW11bml0eScNCgkJCQkJfQ0KCQkJCX0sDQoJCQkJV29ybGRJbWFnZXJ5OiB7DQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCXZhcmlhbnQ6ICdXb3JsZF9JbWFnZXJ5JywNCgkJCQkJCWF0dHJpYnV0aW9uOg0KCQkJCQkJCSd7YXR0cmlidXRpb24uRXNyaX0gJm1kYXNoOyAnICsNCgkJCQkJCQknU291cmNlOiBFc3JpLCBpLWN1YmVkLCBVU0RBLCBVU0dTLCBBRVgsIEdlb0V5ZSwgR2V0bWFwcGluZywgQWVyb2dyaWQsIElHTiwgSUdQLCBVUFItRUdQLCBhbmQgdGhlIEdJUyBVc2VyIENvbW11bml0eScNCgkJCQkJfQ0KCQkJCX0sDQoJCQkJV29ybGRUZXJyYWluOiB7DQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCXZhcmlhbnQ6ICdXb3JsZF9UZXJyYWluX0Jhc2UnLA0KCQkJCQkJbWF4Wm9vbTogMTMsDQoJCQkJCQlhdHRyaWJ1dGlvbjoNCgkJCQkJCQkne2F0dHJpYnV0aW9uLkVzcml9ICZtZGFzaDsgJyArDQoJCQkJCQkJJ1NvdXJjZTogVVNHUywgRXNyaSwgVEFOQSwgRGVMb3JtZSwgYW5kIE5QUycNCgkJCQkJfQ0KCQkJCX0sDQoJCQkJV29ybGRTaGFkZWRSZWxpZWY6IHsNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJdmFyaWFudDogJ1dvcmxkX1NoYWRlZF9SZWxpZWYnLA0KCQkJCQkJbWF4Wm9vbTogMTMsDQoJCQkJCQlhdHRyaWJ1dGlvbjogJ3thdHRyaWJ1dGlvbi5Fc3JpfSAmbWRhc2g7IFNvdXJjZTogRXNyaScNCgkJCQkJfQ0KCQkJCX0sDQoJCQkJV29ybGRQaHlzaWNhbDogew0KCQkJCQlvcHRpb25zOiB7DQoJCQkJCQl2YXJpYW50OiAnV29ybGRfUGh5c2ljYWxfTWFwJywNCgkJCQkJCW1heFpvb206IDgsDQoJCQkJCQlhdHRyaWJ1dGlvbjogJ3thdHRyaWJ1dGlvbi5Fc3JpfSAmbWRhc2g7IFNvdXJjZTogVVMgTmF0aW9uYWwgUGFyayBTZXJ2aWNlJw0KCQkJCQl9DQoJCQkJfSwNCgkJCQlPY2VhbkJhc2VtYXA6IHsNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJdmFyaWFudDogJ09jZWFuX0Jhc2VtYXAnLA0KCQkJCQkJbWF4Wm9vbTogMTMsDQoJCQkJCQlhdHRyaWJ1dGlvbjogJ3thdHRyaWJ1dGlvbi5Fc3JpfSAmbWRhc2g7IFNvdXJjZXM6IEdFQkNPLCBOT0FBLCBDSFMsIE9TVSwgVU5ILCBDU1VNQiwgTmF0aW9uYWwgR2VvZ3JhcGhpYywgRGVMb3JtZSwgTkFWVEVRLCBhbmQgRXNyaScNCgkJCQkJfQ0KCQkJCX0sDQoJCQkJTmF0R2VvV29ybGRNYXA6IHsNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJdmFyaWFudDogJ05hdEdlb19Xb3JsZF9NYXAnLA0KCQkJCQkJbWF4Wm9vbTogMTYsDQoJCQkJCQlhdHRyaWJ1dGlvbjogJ3thdHRyaWJ1dGlvbi5Fc3JpfSAmbWRhc2g7IE5hdGlvbmFsIEdlb2dyYXBoaWMsIEVzcmksIERlTG9ybWUsIE5BVlRFUSwgVU5FUC1XQ01DLCBVU0dTLCBOQVNBLCBFU0EsIE1FVEksIE5SQ0FOLCBHRUJDTywgTk9BQSwgaVBDJw0KCQkJCQl9DQoJCQkJfSwNCgkJCQlXb3JsZEdyYXlDYW52YXM6IHsNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJdmFyaWFudDogJ0NhbnZhcy9Xb3JsZF9MaWdodF9HcmF5X0Jhc2UnLA0KCQkJCQkJbWF4Wm9vbTogMTYsDQoJCQkJCQlhdHRyaWJ1dGlvbjogJ3thdHRyaWJ1dGlvbi5Fc3JpfSAmbWRhc2g7IEVzcmksIERlTG9ybWUsIE5BVlRFUScNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfSwNCgkJT3BlbldlYXRoZXJNYXA6IHsNCgkJCXVybDogJ2h0dHA6Ly97c30udGlsZS5vcGVud2VhdGhlcm1hcC5vcmcvbWFwL3t2YXJpYW50fS97en0ve3h9L3t5fS5wbmc/YXBwaWQ9e2FwaUtleX0nLA0KCQkJb3B0aW9uczogew0KCQkJCW1heFpvb206IDE5LA0KCQkJCWF0dHJpYnV0aW9uOiAnTWFwIGRhdGEgJmNvcHk7IDxhIGhyZWY9Imh0dHA6Ly9vcGVud2VhdGhlcm1hcC5vcmciPk9wZW5XZWF0aGVyTWFwPC9hPicsDQoJCQkJYXBpS2V5Oic8aW5zZXJ0IHlvdXIgYXBpIGtleSBoZXJlPicsDQoJCQkJb3BhY2l0eTogMC41DQoJCQl9LA0KCQkJdmFyaWFudHM6IHsNCgkJCQlDbG91ZHM6ICdjbG91ZHMnLA0KCQkJCUNsb3Vkc0NsYXNzaWM6ICdjbG91ZHNfY2xzJywNCgkJCQlQcmVjaXBpdGF0aW9uOiAncHJlY2lwaXRhdGlvbicsDQoJCQkJUHJlY2lwaXRhdGlvbkNsYXNzaWM6ICdwcmVjaXBpdGF0aW9uX2NscycsDQoJCQkJUmFpbjogJ3JhaW4nLA0KCQkJCVJhaW5DbGFzc2ljOiAncmFpbl9jbHMnLA0KCQkJCVByZXNzdXJlOiAncHJlc3N1cmUnLA0KCQkJCVByZXNzdXJlQ29udG91cjogJ3ByZXNzdXJlX2NudHInLA0KCQkJCVdpbmQ6ICd3aW5kJywNCgkJCQlUZW1wZXJhdHVyZTogJ3RlbXAnLA0KCQkJCVNub3c6ICdzbm93Jw0KCQkJfQ0KCQl9LA0KCQlIRVJFOiB7DQoJCQkvKg0KCQkJICogSEVSRSBtYXBzLCBmb3JtZXJseSBOb2tpYSBtYXBzLg0KCQkJICogVGhlc2UgYmFzZW1hcHMgYXJlIGZyZWUsIGJ1dCB5b3UgbmVlZCBhbiBBUEkga2V5LiBQbGVhc2Ugc2lnbiB1cCBhdA0KCQkJICogaHR0cHM6Ly9kZXZlbG9wZXIuaGVyZS5jb20vcGxhbnMNCgkJCSAqLw0KCQkJdXJsOg0KCQkJCSdodHRwczovL3tzfS57YmFzZX0ubWFwcy5hcGkuaGVyZS5jb20vbWFwdGlsZS8yLjEvJyArDQoJCQkJJ3t0eXBlfS97bWFwSUR9L3t2YXJpYW50fS97en0ve3h9L3t5fS97c2l6ZX0ve2Zvcm1hdH0/JyArDQoJCQkJJ2FwcF9pZD17YXBwX2lkfSZhcHBfY29kZT17YXBwX2NvZGV9JmxnPXtsYW5ndWFnZX0nLA0KCQkJb3B0aW9uczogew0KCQkJCWF0dHJpYnV0aW9uOg0KCQkJCQknTWFwICZjb3B5OyAxOTg3LScgKyBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgKyAnIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuaGVyZS5jb20iPkhFUkU8L2E+JywNCgkJCQlzdWJkb21haW5zOiAnMTIzNCcsDQoJCQkJbWFwSUQ6ICduZXdlc3QnLA0KCQkJCSdhcHBfaWQnOiAnPGluc2VydCB5b3VyIGFwcF9pZCBoZXJlPicsDQoJCQkJJ2FwcF9jb2RlJzogJzxpbnNlcnQgeW91ciBhcHBfY29kZSBoZXJlPicsDQoJCQkJYmFzZTogJ2Jhc2UnLA0KCQkJCXZhcmlhbnQ6ICdub3JtYWwuZGF5JywNCgkJCQltYXhab29tOiAyMCwNCgkJCQl0eXBlOiAnbWFwdGlsZScsDQoJCQkJbGFuZ3VhZ2U6ICdlbmcnLA0KCQkJCWZvcm1hdDogJ3BuZzgnLA0KCQkJCXNpemU6ICcyNTYnDQoJCQl9LA0KCQkJdmFyaWFudHM6IHsNCgkJCQlub3JtYWxEYXk6ICdub3JtYWwuZGF5JywNCgkJCQlub3JtYWxEYXlDdXN0b206ICdub3JtYWwuZGF5LmN1c3RvbScsDQoJCQkJbm9ybWFsRGF5R3JleTogJ25vcm1hbC5kYXkuZ3JleScsDQoJCQkJbm9ybWFsRGF5TW9iaWxlOiAnbm9ybWFsLmRheS5tb2JpbGUnLA0KCQkJCW5vcm1hbERheUdyZXlNb2JpbGU6ICdub3JtYWwuZGF5LmdyZXkubW9iaWxlJywNCgkJCQlub3JtYWxEYXlUcmFuc2l0OiAnbm9ybWFsLmRheS50cmFuc2l0JywNCgkJCQlub3JtYWxEYXlUcmFuc2l0TW9iaWxlOiAnbm9ybWFsLmRheS50cmFuc2l0Lm1vYmlsZScsDQoJCQkJbm9ybWFsRGF5VHJhZmZpYzogew0KCQkJCQlvcHRpb25zOiB7DQoJCQkJCQl2YXJpYW50OiAnbm9ybWFsLnRyYWZmaWMuZGF5JywNCgkJCQkJCWJhc2U6ICd0cmFmZmljJywNCgkJCQkJCXR5cGU6ICd0cmFmZmljdGlsZScNCgkJCQkJfQ0KCQkJCX0sDQoJCQkJbm9ybWFsTmlnaHQ6ICdub3JtYWwubmlnaHQnLA0KCQkJCW5vcm1hbE5pZ2h0TW9iaWxlOiAnbm9ybWFsLm5pZ2h0Lm1vYmlsZScsDQoJCQkJbm9ybWFsTmlnaHRHcmV5OiAnbm9ybWFsLm5pZ2h0LmdyZXknLA0KCQkJCW5vcm1hbE5pZ2h0R3JleU1vYmlsZTogJ25vcm1hbC5uaWdodC5ncmV5Lm1vYmlsZScsDQoJCQkJbm9ybWFsTmlnaHRUcmFuc2l0OiAnbm9ybWFsLm5pZ2h0LnRyYW5zaXQnLA0KCQkJCW5vcm1hbE5pZ2h0VHJhbnNpdE1vYmlsZTogJ25vcm1hbC5uaWdodC50cmFuc2l0Lm1vYmlsZScsDQoJCQkJcmVkdWNlZERheTogJ3JlZHVjZWQuZGF5JywNCgkJCQlyZWR1Y2VkTmlnaHQ6ICdyZWR1Y2VkLm5pZ2h0JywNCgkJCQliYXNpY01hcDogew0KCQkJCQlvcHRpb25zOiB7DQoJCQkJCQl0eXBlOiAnYmFzZXRpbGUnDQoJCQkJCX0NCgkJCQl9LA0KCQkJCW1hcExhYmVsczogew0KCQkJCQlvcHRpb25zOiB7DQoJCQkJCQl0eXBlOiAnbGFiZWx0aWxlJywNCgkJCQkJCWZvcm1hdDogJ3BuZycNCgkJCQkJfQ0KCQkJCX0sDQoJCQkJdHJhZmZpY0Zsb3c6IHsNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJYmFzZTogJ3RyYWZmaWMnLA0KCQkJCQkJdHlwZTogJ2Zsb3d0aWxlJw0KCQkJCQl9DQoJCQkJfSwNCgkJCQljYXJuYXZEYXlHcmV5OiAnY2FybmF2LmRheS5ncmV5JywNCgkJCQloeWJyaWREYXk6IHsNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJYmFzZTogJ2FlcmlhbCcsDQoJCQkJCQl2YXJpYW50OiAnaHlicmlkLmRheScNCgkJCQkJfQ0KCQkJCX0sDQoJCQkJaHlicmlkRGF5TW9iaWxlOiB7DQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCWJhc2U6ICdhZXJpYWwnLA0KCQkJCQkJdmFyaWFudDogJ2h5YnJpZC5kYXkubW9iaWxlJw0KCQkJCQl9DQoJCQkJfSwNCgkJCQloeWJyaWREYXlUcmFuc2l0OiB7DQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCWJhc2U6ICdhZXJpYWwnLA0KCQkJCQkJdmFyaWFudDogJ2h5YnJpZC5kYXkudHJhbnNpdCcNCgkJCQkJfQ0KCQkJCX0sDQoJCQkJaHlicmlkRGF5R3JleTogew0KCQkJCQlvcHRpb25zOiB7DQoJCQkJCQliYXNlOiAnYWVyaWFsJywNCgkJCQkJCXZhcmlhbnQ6ICdoeWJyaWQuZ3JleS5kYXknDQoJCQkJCX0NCgkJCQl9LA0KCQkJCWh5YnJpZERheVRyYWZmaWM6IHsNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJdmFyaWFudDogJ2h5YnJpZC50cmFmZmljLmRheScsDQoJCQkJCQliYXNlOiAndHJhZmZpYycsDQoJCQkJCQl0eXBlOiAndHJhZmZpY3RpbGUnDQoJCQkJCX0NCgkJCQl9LA0KCQkJCXBlZGVzdHJpYW5EYXk6ICdwZWRlc3RyaWFuLmRheScsDQoJCQkJcGVkZXN0cmlhbk5pZ2h0OiAncGVkZXN0cmlhbi5uaWdodCcsDQoJCQkJc2F0ZWxsaXRlRGF5OiB7DQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCWJhc2U6ICdhZXJpYWwnLA0KCQkJCQkJdmFyaWFudDogJ3NhdGVsbGl0ZS5kYXknDQoJCQkJCX0NCgkJCQl9LA0KCQkJCXRlcnJhaW5EYXk6IHsNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJYmFzZTogJ2FlcmlhbCcsDQoJCQkJCQl2YXJpYW50OiAndGVycmFpbi5kYXknDQoJCQkJCX0NCgkJCQl9LA0KCQkJCXRlcnJhaW5EYXlNb2JpbGU6IHsNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJYmFzZTogJ2FlcmlhbCcsDQoJCQkJCQl2YXJpYW50OiAndGVycmFpbi5kYXkubW9iaWxlJw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9LA0KCQlGcmVlTWFwU0s6IHsNCgkJCXVybDogJ2h0dHA6Ly90e3N9LmZyZWVtYXAuc2svVC97en0ve3h9L3t5fS5qcGVnJywNCgkJCW9wdGlvbnM6IHsNCgkJCQltaW5ab29tOiA4LA0KCQkJCW1heFpvb206IDE2LA0KCQkJCXN1YmRvbWFpbnM6ICcxMjM0JywNCgkJCQlib3VuZHM6IFtbNDcuMjA0NjQyLCAxNS45OTYwOTNdLCBbNDkuODMwODk2LCAyMi41NzY5MDRdXSwNCgkJCQlhdHRyaWJ1dGlvbjoNCgkJCQkJJ3thdHRyaWJ1dGlvbi5PcGVuU3RyZWV0TWFwfSwgdml6dWFsaXphdGlvbiBDQy1CeS1TQSAyLjAgPGEgaHJlZj0iaHR0cDovL2ZyZWVtYXAuc2siPkZyZWVtYXAuc2s8L2E+Jw0KCQkJfQ0KCQl9LA0KCQlNdGJNYXA6IHsNCgkJCXVybDogJ2h0dHA6Ly90aWxlLm10Ym1hcC5jei9tdGJtYXBfdGlsZXMve3p9L3t4fS97eX0ucG5nJywNCgkJCW9wdGlvbnM6IHsNCgkJCQlhdHRyaWJ1dGlvbjoNCgkJCQkJJ3thdHRyaWJ1dGlvbi5PcGVuU3RyZWV0TWFwfSAmYW1wOyBVU0dTJw0KCQkJfQ0KCQl9LA0KCQlDYXJ0b0RCOiB7DQoJCQl1cmw6ICdodHRwczovL3tzfS5iYXNlbWFwcy5jYXJ0b2Nkbi5jb20ve3ZhcmlhbnR9L3t6fS97eH0ve3l9e3J9LnBuZycsDQoJCQlvcHRpb25zOiB7DQoJCQkJYXR0cmlidXRpb246ICd7YXR0cmlidXRpb24uT3BlblN0cmVldE1hcH0gJmNvcHk7IDxhIGhyZWY9Imh0dHBzOi8vY2FydG8uY29tL2F0dHJpYnV0aW9ucyI+Q0FSVE88L2E+JywNCgkJCQlzdWJkb21haW5zOiAnYWJjZCcsDQoJCQkJbWF4Wm9vbTogMTksDQoJCQkJdmFyaWFudDogJ2xpZ2h0X2FsbCcNCgkJCX0sDQoJCQl2YXJpYW50czogew0KCQkJCVBvc2l0cm9uOiAnbGlnaHRfYWxsJywNCgkJCQlQb3NpdHJvbk5vTGFiZWxzOiAnbGlnaHRfbm9sYWJlbHMnLA0KCQkJCVBvc2l0cm9uT25seUxhYmVsczogJ2xpZ2h0X29ubHlfbGFiZWxzJywNCgkJCQlEYXJrTWF0dGVyOiAnZGFya19hbGwnLA0KCQkJCURhcmtNYXR0ZXJOb0xhYmVsczogJ2Rhcmtfbm9sYWJlbHMnLA0KCQkJCURhcmtNYXR0ZXJPbmx5TGFiZWxzOiAnZGFya19vbmx5X2xhYmVscycsDQoJCQkJVm95YWdlcjogJ3Jhc3RlcnRpbGVzL3ZveWFnZXInLA0KCQkJCVZveWFnZXJOb0xhYmVsczogJ3Jhc3RlcnRpbGVzL3ZveWFnZXJfbm9sYWJlbHMnLA0KCQkJCVZveWFnZXJPbmx5TGFiZWxzOiAncmFzdGVydGlsZXMvdm95YWdlcl9vbmx5X2xhYmVscycsDQoJCQkJVm95YWdlckxhYmVsc1VuZGVyOiAncmFzdGVydGlsZXMvdm95YWdlcl9sYWJlbHNfdW5kZXInDQoJCQl9DQoJCX0sDQoJCUhpa2VCaWtlOiB7DQoJCQl1cmw6ICdodHRwczovL3RpbGVzLndtZmxhYnMub3JnL3t2YXJpYW50fS97en0ve3h9L3t5fS5wbmcnLA0KCQkJb3B0aW9uczogew0KCQkJCW1heFpvb206IDE5LA0KCQkJCWF0dHJpYnV0aW9uOiAne2F0dHJpYnV0aW9uLk9wZW5TdHJlZXRNYXB9JywNCgkJCQl2YXJpYW50OiAnaGlrZWJpa2UnDQoJCQl9LA0KCQkJdmFyaWFudHM6IHsNCgkJCQlIaWtlQmlrZToge30sDQoJCQkJSGlsbFNoYWRpbmc6IHsNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJbWF4Wm9vbTogMTUsDQoJCQkJCQl2YXJpYW50OiAnaGlsbHNoYWRpbmcnDQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0sDQoJCUJhc2VtYXBBVDogew0KCQkJdXJsOiAnLy9tYXBze3N9LndpZW4uZ3YuYXQvYmFzZW1hcC97dmFyaWFudH0vbm9ybWFsL2dvb2dsZTM4NTcve3p9L3t5fS97eH0ue2Zvcm1hdH0nLA0KCQkJb3B0aW9uczogew0KCQkJCW1heFpvb206IDE5LA0KCQkJCWF0dHJpYnV0aW9uOiAnRGF0ZW5xdWVsbGU6IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmJhc2VtYXAuYXQiPmJhc2VtYXAuYXQ8L2E+JywNCgkJCQlzdWJkb21haW5zOiBbJycsICcxJywgJzInLCAnMycsICc0J10sDQoJCQkJZm9ybWF0OiAncG5nJywNCgkJCQlib3VuZHM6IFtbNDYuMzU4NzcwLCA4Ljc4MjM3OV0sIFs0OS4wMzc4NzIsIDE3LjE4OTUzMl1dLA0KCQkJCXZhcmlhbnQ6ICdnZW9sYW5kYmFzZW1hcCcNCgkJCX0sDQoJCQl2YXJpYW50czogew0KCQkJCWJhc2VtYXA6IHsNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJbWF4Wm9vbTogMjAsIC8vIGN1cnJlbnRseSBvbmx5IGluIFZpZW5uYQ0KCQkJCQkJdmFyaWFudDogJ2dlb2xhbmRiYXNlbWFwJw0KCQkJCQl9DQoJCQkJfSwNCgkJCQlncmF1OiAnYm1hcGdyYXUnLA0KCQkJCW92ZXJsYXk6ICdibWFwb3ZlcmxheScsDQoJCQkJaGlnaGRwaTogew0KCQkJCQlvcHRpb25zOiB7DQoJCQkJCQl2YXJpYW50OiAnYm1hcGhpZHBpJywNCgkJCQkJCWZvcm1hdDogJ2pwZWcnDQoJCQkJCX0NCgkJCQl9LA0KCQkJCW9ydGhvZm90bzogew0KCQkJCQlvcHRpb25zOiB7DQoJCQkJCQltYXhab29tOiAyMCwgLy8gY3VycmVudGx5IG9ubHkgaW4gVmllbm5hDQoJCQkJCQl2YXJpYW50OiAnYm1hcG9ydGhvZm90bzMwY20nLA0KCQkJCQkJZm9ybWF0OiAnanBlZycNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfSwNCgkJbmxtYXBzOiB7DQoJCQl1cmw6ICcvL2dlb2RhdGEubmF0aW9uYWFsZ2VvcmVnaXN0ZXIubmwvdGlsZXMvc2VydmljZS93bXRzL3t2YXJpYW50fS9FUFNHOjM4NTcve3p9L3t4fS97eX0ucG5nJywNCgkJCW9wdGlvbnM6IHsNCgkJCQltaW5ab29tOiA2LA0KCQkJCW1heFpvb206IDE5LA0KCQkJCWJvdW5kczogW1s1MC41LCAzLjI1XSwgWzU0LCA3LjZdXSwNCgkJCQlhdHRyaWJ1dGlvbjogJ0thYXJ0Z2VnZXZlbnMgJmNvcHk7IDxhIGhyZWY9ImthZGFzdGVyLm5sIj5LYWRhc3RlcjwvYT4nDQoJCQl9LA0KCQkJdmFyaWFudHM6IHsNCgkJCQknc3RhbmRhYXJkJzogJ2JydGFjaHRlcmdyb25ka2FhcnQnLA0KCQkJCSdwYXN0ZWwnOiAnYnJ0YWNodGVyZ3JvbmRrYWFydHBhc3RlbCcsDQoJCQkJJ2dyaWpzJzogJ2JydGFjaHRlcmdyb25ka2FhcnRncmlqcycsDQoJCQkJJ2x1Y2h0Zm90byc6IHsNCgkJCQkJJ3VybCc6ICcvL2dlb2RhdGEubmF0aW9uYWFsZ2VvcmVnaXN0ZXIubmwvbHVjaHRmb3RvL3JnYi93bXRzLzEuMC4wLzIwMTZfb3J0aG8yNS9FUFNHOjM4NTcve3p9L3t4fS97eX0ucG5nJywNCgkJCQl9DQoJCQl9DQoJCX0sDQoJCU5BU0FHSUJTOiB7DQoJCQl1cmw6ICdodHRwczovL21hcDEudmlzLmVhcnRoZGF0YS5uYXNhLmdvdi93bXRzLXdlYm1lcmMve3ZhcmlhbnR9L2RlZmF1bHQve3RpbWV9L3t0aWxlbWF0cml4c2V0fXttYXhab29tfS97en0ve3l9L3t4fS57Zm9ybWF0fScsDQoJCQlvcHRpb25zOiB7DQoJCQkJYXR0cmlidXRpb246DQoJCQkJCSdJbWFnZXJ5IHByb3ZpZGVkIGJ5IHNlcnZpY2VzIGZyb20gdGhlIEdsb2JhbCBJbWFnZXJ5IEJyb3dzZSBTZXJ2aWNlcyAoR0lCUyksIG9wZXJhdGVkIGJ5IHRoZSBOQVNBL0dTRkMvRWFydGggU2NpZW5jZSBEYXRhIGFuZCBJbmZvcm1hdGlvbiBTeXN0ZW0gJyArDQoJCQkJCScoPGEgaHJlZj0iaHR0cHM6Ly9lYXJ0aGRhdGEubmFzYS5nb3YiPkVTRElTPC9hPikgd2l0aCBmdW5kaW5nIHByb3ZpZGVkIGJ5IE5BU0EvSFEuJywNCgkJCQlib3VuZHM6IFtbLTg1LjA1MTEyODc3NzYsIC0xNzkuOTk5OTk5OTc1XSwgWzg1LjA1MTEyODc3NzYsIDE3OS45OTk5OTk5NzVdXSwNCgkJCQltaW5ab29tOiAxLA0KCQkJCW1heFpvb206IDksDQoJCQkJZm9ybWF0OiAnanBnJywNCgkJCQl0aW1lOiAnJywNCgkJCQl0aWxlbWF0cml4c2V0OiAnR29vZ2xlTWFwc0NvbXBhdGlibGVfTGV2ZWwnDQoJCQl9LA0KCQkJdmFyaWFudHM6IHsNCgkJCQlNb2Rpc1RlcnJhVHJ1ZUNvbG9yQ1I6ICdNT0RJU19UZXJyYV9Db3JyZWN0ZWRSZWZsZWN0YW5jZV9UcnVlQ29sb3InLA0KCQkJCU1vZGlzVGVycmFCYW5kczM2N0NSOiAnTU9ESVNfVGVycmFfQ29ycmVjdGVkUmVmbGVjdGFuY2VfQmFuZHMzNjcnLA0KCQkJCVZpaXJzRWFydGhBdE5pZ2h0MjAxMjogew0KCQkJCQlvcHRpb25zOiB7DQoJCQkJCQl2YXJpYW50OiAnVklJUlNfQ2l0eUxpZ2h0c18yMDEyJywNCgkJCQkJCW1heFpvb206IDgNCgkJCQkJfQ0KCQkJCX0sDQoJCQkJTW9kaXNUZXJyYUxTVERheTogew0KCQkJCQlvcHRpb25zOiB7DQoJCQkJCQl2YXJpYW50OiAnTU9ESVNfVGVycmFfTGFuZF9TdXJmYWNlX1RlbXBfRGF5JywNCgkJCQkJCWZvcm1hdDogJ3BuZycsDQoJCQkJCQltYXhab29tOiA3LA0KCQkJCQkJb3BhY2l0eTogMC43NQ0KCQkJCQl9DQoJCQkJfSwNCgkJCQlNb2Rpc1RlcnJhU25vd0NvdmVyOiB7DQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCXZhcmlhbnQ6ICdNT0RJU19UZXJyYV9Tbm93X0NvdmVyJywNCgkJCQkJCWZvcm1hdDogJ3BuZycsDQoJCQkJCQltYXhab29tOiA4LA0KCQkJCQkJb3BhY2l0eTogMC43NQ0KCQkJCQl9DQoJCQkJfSwNCgkJCQlNb2Rpc1RlcnJhQU9EOiB7DQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCXZhcmlhbnQ6ICdNT0RJU19UZXJyYV9BZXJvc29sJywNCgkJCQkJCWZvcm1hdDogJ3BuZycsDQoJCQkJCQltYXhab29tOiA2LA0KCQkJCQkJb3BhY2l0eTogMC43NQ0KCQkJCQl9DQoJCQkJfSwNCgkJCQlNb2Rpc1RlcnJhQ2hsb3JvcGh5bGw6IHsNCgkJCQkJb3B0aW9uczogew0KCQkJCQkJdmFyaWFudDogJ01PRElTX1RlcnJhX0NobG9yb3BoeWxsX0EnLA0KCQkJCQkJZm9ybWF0OiAncG5nJywNCgkJCQkJCW1heFpvb206IDcsDQoJCQkJCQlvcGFjaXR5OiAwLjc1DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0sDQoJCU5MUzogew0KCQkJLy8gTkxTIG1hcHMgYXJlIGNvcHlyaWdodCBOYXRpb25hbCBsaWJyYXJ5IG9mIFNjb3RsYW5kLg0KCQkJLy8gaHR0cDovL21hcHMubmxzLnVrL3Byb2plY3RzL2FwaS9pbmRleC5odG1sDQoJCQkvLyBQbGVhc2UgY29udGFjdCBOTFMgZm9yIGFueXRoaW5nIG90aGVyIHRoYW4gbm9uLWNvbW1lcmNpYWwgbG93IHZvbHVtZSB1c2FnZQ0KCQkJLy8NCgkJCS8vIE1hcCBzb3VyY2VzOiBPcmRuYW5jZSBTdXJ2ZXkgMToxbSB0byAxOjYzSywgMTkyMHMtMTk0MHMNCgkJCS8vICAgejAtOSAgLSAxOjFtDQoJCQkvLyAgejEwLTExIC0gcXVhcnRlciBpbmNoICgxOjI1MzQ0MCkNCgkJCS8vICB6MTItMTggLSBvbmUgaW5jaCAoMTo2MzM2MCkNCgkJCXVybDogJy8vbmxzLXtzfS50aWxlc2VydmVyLmNvbS9ubHMve3p9L3t4fS97eX0uanBnJywNCgkJCW9wdGlvbnM6IHsNCgkJCQlhdHRyaWJ1dGlvbjogJzxhIGhyZWY9Imh0dHA6Ly9nZW8ubmxzLnVrL21hcHMvIj5OYXRpb25hbCBMaWJyYXJ5IG9mIFNjb3RsYW5kIEhpc3RvcmljIE1hcHM8L2E+JywNCgkJCQlib3VuZHM6IFtbNDkuNiwgLTEyXSwgWzYxLjcsIDNdXSwNCgkJCQltaW5ab29tOiAxLA0KCQkJCW1heFpvb206IDE4LA0KCQkJCXN1YmRvbWFpbnM6ICcwMTIzJywNCgkJCX0NCgkJfSwNCgkJSnVzdGljZU1hcDogew0KCQkJLy8gSnVzdGljZSBNYXAgKGh0dHA6Ly93d3cuanVzdGljZW1hcC5vcmcvKQ0KCQkJLy8gVmlzdWFsaXplIHJhY2UgYW5kIGluY29tZSBkYXRhIGZvciB5b3VyIGNvbW11bml0eSwgY291bnR5IGFuZCBjb3VudHJ5Lg0KCQkJLy8gSW5jbHVkZXMgdG9vbHMgZm9yIGRhdGEgam91cm5hbGlzdHMsIGJsb2dnZXJzIGFuZCBjb21tdW5pdHkgYWN0aXZpc3RzLg0KCQkJdXJsOiAnaHR0cDovL3d3dy5qdXN0aWNlbWFwLm9yZy90aWxlL3tzaXplfS97dmFyaWFudH0ve3p9L3t4fS97eX0ucG5nJywNCgkJCW9wdGlvbnM6IHsNCgkJCQlhdHRyaWJ1dGlvbjogJzxhIGhyZWY9Imh0dHA6Ly93d3cuanVzdGljZW1hcC5vcmcvdGVybXMucGhwIj5KdXN0aWNlIE1hcDwvYT4nLA0KCQkJCS8vIG9uZSBvZiAnY291bnR5JywgJ3RyYWN0JywgJ2Jsb2NrJw0KCQkJCXNpemU6ICdjb3VudHknLA0KCQkJCS8vIEJvdW5kcyBmb3IgVVNBLCBpbmNsdWRpbmcgQWxhc2thIGFuZCBIYXdhaWkNCgkJCQlib3VuZHM6IFtbMTQsIC0xODBdLCBbNzIsIC01Nl1dDQoJCQl9LA0KCQkJdmFyaWFudHM6IHsNCgkJCQlpbmNvbWU6ICdpbmNvbWUnLA0KCQkJCWFtZXJpY2FuSW5kaWFuOiAnaW5kaWFuJywNCgkJCQlhc2lhbjogJ2FzaWFuJywNCgkJCQlibGFjazogJ2JsYWNrJywNCgkJCQloaXNwYW5pYzogJ2hpc3BhbmljJywNCgkJCQltdWx0aTogJ211bHRpJywNCgkJCQlub25XaGl0ZTogJ25vbndoaXRlJywNCgkJCQl3aGl0ZTogJ3doaXRlJywNCgkJCQlwbHVyYWxpdHk6ICdwbHVyYWwnDQoJCQl9DQoJCX0sDQoJCVdpa2ltZWRpYTogew0KCQkJdXJsOiAnaHR0cHM6Ly9tYXBzLndpa2ltZWRpYS5vcmcvb3NtLWludGwve3p9L3t4fS97eX17cn0ucG5nJywNCgkJCW9wdGlvbnM6IHsNCgkJCQlhdHRyaWJ1dGlvbjogJzxhIGhyZWY9Imh0dHBzOi8vd2lraW1lZGlhZm91bmRhdGlvbi5vcmcvd2lraS9NYXBzX1Rlcm1zX29mX1VzZSI+V2lraW1lZGlhPC9hPicsDQoJCQkJbWluWm9vbTogMSwNCgkJCQltYXhab29tOiAxOQ0KCQkJfQ0KCQl9LA0KCQlHZW9wb3J0YWlsRnJhbmNlOiB7DQoJCQl1cmw6ICdodHRwczovL3d4cy5pZ24uZnIve2FwaWtleX0vZ2VvcG9ydGFpbC93bXRzP1JFUVVFU1Q9R2V0VGlsZSZTRVJWSUNFPVdNVFMmVkVSU0lPTj0xLjAuMCZTVFlMRT17c3R5bGV9JlRJTEVNQVRSSVhTRVQ9UE0mRk9STUFUPXtmb3JtYXR9JkxBWUVSPXt2YXJpYW50fSZUSUxFTUFUUklYPXt6fSZUSUxFUk9XPXt5fSZUSUxFQ09MPXt4fScsDQoJCQlvcHRpb25zOiB7DQoJCQkJYXR0cmlidXRpb246ICc8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93d3cuZ2VvcG9ydGFpbC5nb3V2LmZyLyI+R2VvcG9ydGFpbCBGcmFuY2U8L2E+JywNCgkJCQlib3VuZHM6IFtbLTc1LCAtMTgwXSwgWzgxLCAxODBdXSwNCgkJCQltaW5ab29tOiAyLA0KCQkJCW1heFpvb206IDE4LA0KCQkJCS8vIEdldCB5b3VyIG93biBnZW9wb3J0YWlsIGFwaWtleSBoZXJlIDogaHR0cDovL3Byb2Zlc3Npb25uZWxzLmlnbi5mci9pZ24vY29udHJhdHMvDQoJCQkJLy8gTkIgOiAnY2hvaXNpcmdlb3BvcnRhaWwnIGlzIGEgZGVtb25zdHJhdGlvbiBrZXkgdGhhdCBjb21lcyB3aXRoIG5vIGd1YXJhbnRlZQ0KCQkJCWFwaWtleTogJ2Nob2lzaXJnZW9wb3J0YWlsJywNCgkJCQlmb3JtYXQ6ICdpbWFnZS9qcGVnJywNCgkJCQlzdHlsZSA6ICdub3JtYWwnLA0KCQkJCXZhcmlhbnQ6ICdHRU9HUkFQSElDQUxHUklEU1lTVEVNUy5NQVBTLlNDQU4tRVhQUkVTUy5TVEFOREFSRCcNCgkJCX0sDQoJCQl2YXJpYW50czogew0KCQkJCXBhcmNlbHM6IHsNCgkJCQkJb3B0aW9ucyA6IHsNCgkJCQkJCXZhcmlhbnQ6ICdDQURBU1RSQUxQQVJDRUxTLlBBUkNFTFMnLA0KCQkJCQkJbWF4Wm9vbTogMjAsDQoJCQkJCQlzdHlsZSA6ICdiZHBhcmNlbGxhaXJlJywNCgkJCQkJCWZvcm1hdDogJ2ltYWdlL3BuZycNCgkJCQkJfQ0KCQkJCX0sDQoJCQkJaWduTWFwczogJ0dFT0dSQVBISUNBTEdSSURTWVNURU1TLk1BUFMnLA0KCQkJCW1hcHM6ICdHRU9HUkFQSElDQUxHUklEU1lTVEVNUy5NQVBTLlNDQU4tRVhQUkVTUy5TVEFOREFSRCcsDQoJCQkJb3J0aG9zOiB7DQoJCQkJCW9wdGlvbnM6IHsNCgkJCQkJCW1heFpvb206IDE5LA0KCQkJCQkJdmFyaWFudDogJ09SVEhPSU1BR0VSWS5PUlRIT1BIT1RPUycNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfSwNCgkJT25lTWFwU0c6IHsNCgkJCXVybDogJy8vbWFwcy17c30ub25lbWFwLnNnL3YzL3t2YXJpYW50fS97en0ve3h9L3t5fS5wbmcnLA0KCQkJb3B0aW9uczogew0KCQkJCXZhcmlhbnQ6ICdEZWZhdWx0JywNCgkJCQltaW5ab29tOiAxMSwNCgkJCQltYXhab29tOiAxOCwNCgkJCQlib3VuZHM6IFtbMS41NjA3MywgMTA0LjExNDc1XSwgWzEuMTYsIDEwMy41MDJdXSwNCgkJCQlhdHRyaWJ1dGlvbjogJzxpbWcgc3JjPSJodHRwczovL2RvY3Mub25lbWFwLnNnL21hcHMvaW1hZ2VzL29uZU1hcDY0LTAxLnBuZyIgc3R5bGU9ImhlaWdodDoyMHB4O3dpZHRoOjIwcHg7Ii8+IE5ldyBPbmVNYXAgfCBNYXAgZGF0YSAmY29weTsgY29udHJpYnV0b3JzLCA8YSBocmVmPSJodHRwOi8vU0xBLmdvdi5zZyI+U2luZ2Fwb3JlIExhbmQgQXV0aG9yaXR5PC9hPicNCgkJCX0sDQoJCQl2YXJpYW50czogew0KCQkJCURlZmF1bHQ6ICdEZWZhdWx0JywNCgkJCQlOaWdodDogJ05pZ2h0JywNCgkJCQlPcmlnaW5hbDogJ09yaWdpbmFsJywNCgkJCQlHcmV5OiAnR3JleScsDQoJCQkJTGFuZExvdDogJ0xhbmRMb3QnDQoJCQl9DQoJCX0NCgl9Ow0KDQoJTC50aWxlTGF5ZXIucHJvdmlkZXIgPSBmdW5jdGlvbiAocHJvdmlkZXIsIG9wdGlvbnMpIHsNCgkJcmV0dXJuIG5ldyBMLlRpbGVMYXllci5Qcm92aWRlcihwcm92aWRlciwgb3B0aW9ucyk7DQoJfTsNCg0KCXJldHVybiBMOw0KfSkpOw0K"></script>
<script src="data:application/javascript;base64,TGVhZmxldFdpZGdldC5tZXRob2RzLmFkZFByb3ZpZGVyVGlsZXMgPSBmdW5jdGlvbihwcm92aWRlciwgbGF5ZXJJZCwgZ3JvdXAsIG9wdGlvbnMpIHsKICB0aGlzLmxheWVyTWFuYWdlci5hZGRMYXllcihMLnRpbGVMYXllci5wcm92aWRlcihwcm92aWRlciwgb3B0aW9ucyksICJ0aWxlIiwgbGF5ZXJJZCwgZ3JvdXApOwp9Owo="></script>
<link href="data:text/css,%2Eleaflet%2Dcluster%2Danim%20%2Eleaflet%2Dmarker%2Dicon%2C%20%2Eleaflet%2Dcluster%2Danim%20%2Eleaflet%2Dmarker%2Dshadow%20%7B%0A%2Dwebkit%2Dtransition%3A%20%2Dwebkit%2Dtransform%200%2E3s%20ease%2Dout%2C%20opacity%200%2E3s%20ease%2Din%3B%0A%2Dmoz%2Dtransition%3A%20%2Dmoz%2Dtransform%200%2E3s%20ease%2Dout%2C%20opacity%200%2E3s%20ease%2Din%3B%0A%2Do%2Dtransition%3A%20%2Do%2Dtransform%200%2E3s%20ease%2Dout%2C%20opacity%200%2E3s%20ease%2Din%3B%0Atransition%3A%20transform%200%2E3s%20ease%2Dout%2C%20opacity%200%2E3s%20ease%2Din%3B%0A%7D%0A%2Eleaflet%2Dcluster%2Dspider%2Dleg%20%7B%0A%0A%2Dwebkit%2Dtransition%3A%20%2Dwebkit%2Dstroke%2Ddashoffset%200%2E3s%20ease%2Dout%2C%20%2Dwebkit%2Dstroke%2Dopacity%200%2E3s%20ease%2Din%3B%0A%2Dmoz%2Dtransition%3A%20%2Dmoz%2Dstroke%2Ddashoffset%200%2E3s%20ease%2Dout%2C%20%2Dmoz%2Dstroke%2Dopacity%200%2E3s%20ease%2Din%3B%0A%2Do%2Dtransition%3A%20%2Do%2Dstroke%2Ddashoffset%200%2E3s%20ease%2Dout%2C%20%2Do%2Dstroke%2Dopacity%200%2E3s%20ease%2Din%3B%0Atransition%3A%20stroke%2Ddashoffset%200%2E3s%20ease%2Dout%2C%20stroke%2Dopacity%200%2E3s%20ease%2Din%3B%0A%7D%0A" rel="stylesheet" /> <link href="data:text/css,%2Emarker%2Dcluster%2Dsmall%20%7B%0Abackground%2Dcolor%3A%20rgba%28181%2C%20226%2C%20140%2C%200%2E6%29%3B%0A%7D%0A%2Emarker%2Dcluster%2Dsmall%20div%20%7B%0Abackground%2Dcolor%3A%20rgba%28110%2C%20204%2C%2057%2C%200%2E6%29%3B%0A%7D%0A%2Emarker%2Dcluster%2Dmedium%20%7B%0Abackground%2Dcolor%3A%20rgba%28241%2C%20211%2C%2087%2C%200%2E6%29%3B%0A%7D%0A%2Emarker%2Dcluster%2Dmedium%20div%20%7B%0Abackground%2Dcolor%3A%20rgba%28240%2C%20194%2C%2012%2C%200%2E6%29%3B%0A%7D%0A%2Emarker%2Dcluster%2Dlarge%20%7B%0Abackground%2Dcolor%3A%20rgba%28253%2C%20156%2C%20115%2C%200%2E6%29%3B%0A%7D%0A%2Emarker%2Dcluster%2Dlarge%20div%20%7B%0Abackground%2Dcolor%3A%20rgba%28241%2C%20128%2C%2023%2C%200%2E6%29%3B%0A%7D%0A%0A%2Eleaflet%2Doldie%20%2Emarker%2Dcluster%2Dsmall%20%7B%0Abackground%2Dcolor%3A%20rgb%28181%2C%20226%2C%20140%29%3B%0A%7D%0A%2Eleaflet%2Doldie%20%2Emarker%2Dcluster%2Dsmall%20div%20%7B%0Abackground%2Dcolor%3A%20rgb%28110%2C%20204%2C%2057%29%3B%0A%7D%0A%2Eleaflet%2Doldie%20%2Emarker%2Dcluster%2Dmedium%20%7B%0Abackground%2Dcolor%3A%20rgb%28241%2C%20211%2C%2087%29%3B%0A%7D%0A%2Eleaflet%2Doldie%20%2Emarker%2Dcluster%2Dmedium%20div%20%7B%0Abackground%2Dcolor%3A%20rgb%28240%2C%20194%2C%2012%29%3B%0A%7D%0A%2Eleaflet%2Doldie%20%2Emarker%2Dcluster%2Dlarge%20%7B%0Abackground%2Dcolor%3A%20rgb%28253%2C%20156%2C%20115%29%3B%0A%7D%0A%2Eleaflet%2Doldie%20%2Emarker%2Dcluster%2Dlarge%20div%20%7B%0Abackground%2Dcolor%3A%20rgb%28241%2C%20128%2C%2023%29%3B%0A%7D%0A%2Emarker%2Dcluster%20%7B%0Abackground%2Dclip%3A%20padding%2Dbox%3B%0Aborder%2Dradius%3A%2020px%3B%0A%7D%0A%2Emarker%2Dcluster%20div%20%7B%0Awidth%3A%2030px%3B%0Aheight%3A%2030px%3B%0Amargin%2Dleft%3A%205px%3B%0Amargin%2Dtop%3A%205px%3B%0Atext%2Dalign%3A%20center%3B%0Aborder%2Dradius%3A%2015px%3B%0Afont%3A%2012px%20%22Helvetica%20Neue%22%2C%20Arial%2C%20Helvetica%2C%20sans%2Dserif%3B%0A%7D%0A%2Emarker%2Dcluster%20span%20%7B%0Aline%2Dheight%3A%2030px%3B%0A%7D" rel="stylesheet" />
<script src="data:application/javascript;base64,LyoKIExlYWZsZXQubWFya2VyY2x1c3RlciwgUHJvdmlkZXMgQmVhdXRpZnVsIEFuaW1hdGVkIE1hcmtlciBDbHVzdGVyaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIExlYWZsZXQsIGEgSlMgbGlicmFyeSBmb3IgaW50ZXJhY3RpdmUgbWFwcy4KIGh0dHBzOi8vZ2l0aHViLmNvbS9MZWFmbGV0L0xlYWZsZXQubWFya2VyY2x1c3RlcgogKGMpIDIwMTItMjAxNywgRGF2ZSBMZWF2ZXIKKi8KIWZ1bmN0aW9uKGUsdCxpKXtMLk1hcmtlckNsdXN0ZXJHcm91cD1MLkZlYXR1cmVHcm91cC5leHRlbmQoe29wdGlvbnM6e21heENsdXN0ZXJSYWRpdXM6ODAsaWNvbkNyZWF0ZUZ1bmN0aW9uOm51bGwsY2x1c3RlclBhbmU6TC5NYXJrZXIucHJvdG90eXBlLm9wdGlvbnMucGFuZSxzcGlkZXJmeU9uTWF4Wm9vbTohMCxzaG93Q292ZXJhZ2VPbkhvdmVyOiEwLHpvb21Ub0JvdW5kc09uQ2xpY2s6ITAsc2luZ2xlTWFya2VyTW9kZTohMSxkaXNhYmxlQ2x1c3RlcmluZ0F0Wm9vbTpudWxsLHJlbW92ZU91dHNpZGVWaXNpYmxlQm91bmRzOiEwLGFuaW1hdGU6ITAsYW5pbWF0ZUFkZGluZ01hcmtlcnM6ITEsc3BpZGVyZnlEaXN0YW5jZU11bHRpcGxpZXI6MSxzcGlkZXJMZWdQb2x5bGluZU9wdGlvbnM6e3dlaWdodDoxLjUsY29sb3I6IiMyMjIiLG9wYWNpdHk6LjV9LGNodW5rZWRMb2FkaW5nOiExLGNodW5rSW50ZXJ2YWw6MjAwLGNodW5rRGVsYXk6NTAsY2h1bmtQcm9ncmVzczpudWxsLHBvbHlnb25PcHRpb25zOnt9fSxpbml0aWFsaXplOmZ1bmN0aW9uKGUpe0wuVXRpbC5zZXRPcHRpb25zKHRoaXMsZSksdGhpcy5vcHRpb25zLmljb25DcmVhdGVGdW5jdGlvbnx8KHRoaXMub3B0aW9ucy5pY29uQ3JlYXRlRnVuY3Rpb249dGhpcy5fZGVmYXVsdEljb25DcmVhdGVGdW5jdGlvbiksdGhpcy5fZmVhdHVyZUdyb3VwPUwuZmVhdHVyZUdyb3VwKCksdGhpcy5fZmVhdHVyZUdyb3VwLmFkZEV2ZW50UGFyZW50KHRoaXMpLHRoaXMuX25vblBvaW50R3JvdXA9TC5mZWF0dXJlR3JvdXAoKSx0aGlzLl9ub25Qb2ludEdyb3VwLmFkZEV2ZW50UGFyZW50KHRoaXMpLHRoaXMuX2luWm9vbUFuaW1hdGlvbj0wLHRoaXMuX25lZWRzQ2x1c3RlcmluZz1bXSx0aGlzLl9uZWVkc1JlbW92aW5nPVtdLHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcz1udWxsLHRoaXMuX3F1ZXVlPVtdLHRoaXMuX2NoaWxkTWFya2VyRXZlbnRIYW5kbGVycz17ZHJhZ3N0YXJ0OnRoaXMuX2NoaWxkTWFya2VyRHJhZ1N0YXJ0LG1vdmU6dGhpcy5fY2hpbGRNYXJrZXJNb3ZlZCxkcmFnZW5kOnRoaXMuX2NoaWxkTWFya2VyRHJhZ0VuZH07dmFyIHQ9TC5Eb21VdGlsLlRSQU5TSVRJT04mJnRoaXMub3B0aW9ucy5hbmltYXRlO0wuZXh0ZW5kKHRoaXMsdD90aGlzLl93aXRoQW5pbWF0aW9uOnRoaXMuX25vQW5pbWF0aW9uKSx0aGlzLl9tYXJrZXJDbHVzdGVyPXQ/TC5NYXJrZXJDbHVzdGVyOkwuTWFya2VyQ2x1c3Rlck5vbkFuaW1hdGVkfSxhZGRMYXllcjpmdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgTC5MYXllckdyb3VwKXJldHVybiB0aGlzLmFkZExheWVycyhbZV0pO2lmKCFlLmdldExhdExuZylyZXR1cm4gdGhpcy5fbm9uUG9pbnRHcm91cC5hZGRMYXllcihlKSx0aGlzLmZpcmUoImxheWVyYWRkIix7bGF5ZXI6ZX0pLHRoaXM7aWYoIXRoaXMuX21hcClyZXR1cm4gdGhpcy5fbmVlZHNDbHVzdGVyaW5nLnB1c2goZSksdGhpcy5maXJlKCJsYXllcmFkZCIse2xheWVyOmV9KSx0aGlzO2lmKHRoaXMuaGFzTGF5ZXIoZSkpcmV0dXJuIHRoaXM7dGhpcy5fdW5zcGlkZXJmeSYmdGhpcy5fdW5zcGlkZXJmeSgpLHRoaXMuX2FkZExheWVyKGUsdGhpcy5fbWF4Wm9vbSksdGhpcy5maXJlKCJsYXllcmFkZCIse2xheWVyOmV9KSx0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY2FsY3VsYXRlQm91bmRzKCksdGhpcy5fcmVmcmVzaENsdXN0ZXJzSWNvbnMoKTt2YXIgdD1lLGk9dGhpcy5fem9vbTtpZihlLl9fcGFyZW50KWZvcig7dC5fX3BhcmVudC5fem9vbT49aTspdD10Ll9fcGFyZW50O3JldHVybiB0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMuY29udGFpbnModC5nZXRMYXRMbmcoKSkmJih0aGlzLm9wdGlvbnMuYW5pbWF0ZUFkZGluZ01hcmtlcnM/dGhpcy5fYW5pbWF0aW9uQWRkTGF5ZXIoZSx0KTp0aGlzLl9hbmltYXRpb25BZGRMYXllck5vbkFuaW1hdGVkKGUsdCkpLHRoaXN9LHJlbW92ZUxheWVyOmZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgTC5MYXllckdyb3VwP3RoaXMucmVtb3ZlTGF5ZXJzKFtlXSk6ZS5nZXRMYXRMbmc/dGhpcy5fbWFwP2UuX19wYXJlbnQ/KHRoaXMuX3Vuc3BpZGVyZnkmJih0aGlzLl91bnNwaWRlcmZ5KCksdGhpcy5fdW5zcGlkZXJmeUxheWVyKGUpKSx0aGlzLl9yZW1vdmVMYXllcihlLCEwKSx0aGlzLmZpcmUoImxheWVycmVtb3ZlIix7bGF5ZXI6ZX0pLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjYWxjdWxhdGVCb3VuZHMoKSx0aGlzLl9yZWZyZXNoQ2x1c3RlcnNJY29ucygpLGUub2ZmKHRoaXMuX2NoaWxkTWFya2VyRXZlbnRIYW5kbGVycyx0aGlzKSx0aGlzLl9mZWF0dXJlR3JvdXAuaGFzTGF5ZXIoZSkmJih0aGlzLl9mZWF0dXJlR3JvdXAucmVtb3ZlTGF5ZXIoZSksZS5jbHVzdGVyU2hvdyYmZS5jbHVzdGVyU2hvdygpKSx0aGlzKTp0aGlzOighdGhpcy5fYXJyYXlTcGxpY2UodGhpcy5fbmVlZHNDbHVzdGVyaW5nLGUpJiZ0aGlzLmhhc0xheWVyKGUpJiZ0aGlzLl9uZWVkc1JlbW92aW5nLnB1c2goe2xheWVyOmUsbGF0bG5nOmUuX2xhdGxuZ30pLHRoaXMuZmlyZSgibGF5ZXJyZW1vdmUiLHtsYXllcjplfSksdGhpcyk6KHRoaXMuX25vblBvaW50R3JvdXAucmVtb3ZlTGF5ZXIoZSksdGhpcy5maXJlKCJsYXllcnJlbW92ZSIse2xheWVyOmV9KSx0aGlzKX0sYWRkTGF5ZXJzOmZ1bmN0aW9uKGUsdCl7aWYoIUwuVXRpbC5pc0FycmF5KGUpKXJldHVybiB0aGlzLmFkZExheWVyKGUpO3ZhciBpLG49dGhpcy5fZmVhdHVyZUdyb3VwLHI9dGhpcy5fbm9uUG9pbnRHcm91cCxzPXRoaXMub3B0aW9ucy5jaHVua2VkTG9hZGluZyxvPXRoaXMub3B0aW9ucy5jaHVua0ludGVydmFsLGE9dGhpcy5vcHRpb25zLmNodW5rUHJvZ3Jlc3MsaD1lLmxlbmd0aCxsPTAsdT0hMDtpZih0aGlzLl9tYXApe3ZhciBfPShuZXcgRGF0ZSkuZ2V0VGltZSgpLGQ9TC5iaW5kKGZ1bmN0aW9uKCl7Zm9yKHZhciBjPShuZXcgRGF0ZSkuZ2V0VGltZSgpO2g+bDtsKyspe2lmKHMmJjA9PT1sJTIwMCl7dmFyIHA9KG5ldyBEYXRlKS5nZXRUaW1lKCktYztpZihwPm8pYnJlYWt9aWYoaT1lW2xdLGkgaW5zdGFuY2VvZiBMLkxheWVyR3JvdXApdSYmKGU9ZS5zbGljZSgpLHU9ITEpLHRoaXMuX2V4dHJhY3ROb25Hcm91cExheWVycyhpLGUpLGg9ZS5sZW5ndGg7ZWxzZSBpZihpLmdldExhdExuZyl7aWYoIXRoaXMuaGFzTGF5ZXIoaSkmJih0aGlzLl9hZGRMYXllcihpLHRoaXMuX21heFpvb20pLHR8fHRoaXMuZmlyZSgibGF5ZXJhZGQiLHtsYXllcjppfSksaS5fX3BhcmVudCYmMj09PWkuX19wYXJlbnQuZ2V0Q2hpbGRDb3VudCgpKSl7dmFyIGY9aS5fX3BhcmVudC5nZXRBbGxDaGlsZE1hcmtlcnMoKSxtPWZbMF09PT1pP2ZbMV06ZlswXTtuLnJlbW92ZUxheWVyKG0pfX1lbHNlIHIuYWRkTGF5ZXIoaSksdHx8dGhpcy5maXJlKCJsYXllcmFkZCIse2xheWVyOml9KX1hJiZhKGwsaCwobmV3IERhdGUpLmdldFRpbWUoKS1fKSxsPT09aD8odGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWNhbGN1bGF0ZUJvdW5kcygpLHRoaXMuX3JlZnJlc2hDbHVzdGVyc0ljb25zKCksdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseUFkZENoaWxkcmVuVG9NYXAobnVsbCx0aGlzLl96b29tLHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcykpOnNldFRpbWVvdXQoZCx0aGlzLm9wdGlvbnMuY2h1bmtEZWxheSl9LHRoaXMpO2QoKX1lbHNlIGZvcih2YXIgYz10aGlzLl9uZWVkc0NsdXN0ZXJpbmc7aD5sO2wrKylpPWVbbF0saSBpbnN0YW5jZW9mIEwuTGF5ZXJHcm91cD8odSYmKGU9ZS5zbGljZSgpLHU9ITEpLHRoaXMuX2V4dHJhY3ROb25Hcm91cExheWVycyhpLGUpLGg9ZS5sZW5ndGgpOmkuZ2V0TGF0TG5nP3RoaXMuaGFzTGF5ZXIoaSl8fGMucHVzaChpKTpyLmFkZExheWVyKGkpO3JldHVybiB0aGlzfSxyZW1vdmVMYXllcnM6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuPWUubGVuZ3RoLHI9dGhpcy5fZmVhdHVyZUdyb3VwLHM9dGhpcy5fbm9uUG9pbnRHcm91cCxvPSEwO2lmKCF0aGlzLl9tYXApe2Zvcih0PTA7bj50O3QrKylpPWVbdF0saSBpbnN0YW5jZW9mIEwuTGF5ZXJHcm91cD8obyYmKGU9ZS5zbGljZSgpLG89ITEpLHRoaXMuX2V4dHJhY3ROb25Hcm91cExheWVycyhpLGUpLG49ZS5sZW5ndGgpOih0aGlzLl9hcnJheVNwbGljZSh0aGlzLl9uZWVkc0NsdXN0ZXJpbmcsaSkscy5yZW1vdmVMYXllcihpKSx0aGlzLmhhc0xheWVyKGkpJiZ0aGlzLl9uZWVkc1JlbW92aW5nLnB1c2goe2xheWVyOmksbGF0bG5nOmkuX2xhdGxuZ30pLHRoaXMuZmlyZSgibGF5ZXJyZW1vdmUiLHtsYXllcjppfSkpO3JldHVybiB0aGlzfWlmKHRoaXMuX3Vuc3BpZGVyZnkpe3RoaXMuX3Vuc3BpZGVyZnkoKTt2YXIgYT1lLnNsaWNlKCksaD1uO2Zvcih0PTA7aD50O3QrKylpPWFbdF0saSBpbnN0YW5jZW9mIEwuTGF5ZXJHcm91cD8odGhpcy5fZXh0cmFjdE5vbkdyb3VwTGF5ZXJzKGksYSksaD1hLmxlbmd0aCk6dGhpcy5fdW5zcGlkZXJmeUxheWVyKGkpfWZvcih0PTA7bj50O3QrKylpPWVbdF0saSBpbnN0YW5jZW9mIEwuTGF5ZXJHcm91cD8obyYmKGU9ZS5zbGljZSgpLG89ITEpLHRoaXMuX2V4dHJhY3ROb25Hcm91cExheWVycyhpLGUpLG49ZS5sZW5ndGgpOmkuX19wYXJlbnQ/KHRoaXMuX3JlbW92ZUxheWVyKGksITAsITApLHRoaXMuZmlyZSgibGF5ZXJyZW1vdmUiLHtsYXllcjppfSksci5oYXNMYXllcihpKSYmKHIucmVtb3ZlTGF5ZXIoaSksaS5jbHVzdGVyU2hvdyYmaS5jbHVzdGVyU2hvdygpKSk6KHMucmVtb3ZlTGF5ZXIoaSksdGhpcy5maXJlKCJsYXllcnJlbW92ZSIse2xheWVyOml9KSk7cmV0dXJuIHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjYWxjdWxhdGVCb3VuZHMoKSx0aGlzLl9yZWZyZXNoQ2x1c3RlcnNJY29ucygpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsdGhpcy5fem9vbSx0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMpLHRoaXN9LGNsZWFyTGF5ZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcHx8KHRoaXMuX25lZWRzQ2x1c3RlcmluZz1bXSxkZWxldGUgdGhpcy5fZ3JpZENsdXN0ZXJzLGRlbGV0ZSB0aGlzLl9ncmlkVW5jbHVzdGVyZWQpLHRoaXMuX25vYW5pbWF0aW9uVW5zcGlkZXJmeSYmdGhpcy5fbm9hbmltYXRpb25VbnNwaWRlcmZ5KCksdGhpcy5fZmVhdHVyZUdyb3VwLmNsZWFyTGF5ZXJzKCksdGhpcy5fbm9uUG9pbnRHcm91cC5jbGVhckxheWVycygpLHRoaXMuZWFjaExheWVyKGZ1bmN0aW9uKGUpe2Uub2ZmKHRoaXMuX2NoaWxkTWFya2VyRXZlbnRIYW5kbGVycyx0aGlzKSxkZWxldGUgZS5fX3BhcmVudH0sdGhpcyksdGhpcy5fbWFwJiZ0aGlzLl9nZW5lcmF0ZUluaXRpYWxDbHVzdGVycygpLHRoaXN9LGdldEJvdW5kczpmdW5jdGlvbigpe3ZhciBlPW5ldyBMLkxhdExuZ0JvdW5kczt0aGlzLl90b3BDbHVzdGVyTGV2ZWwmJmUuZXh0ZW5kKHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fYm91bmRzKTtmb3IodmFyIHQ9dGhpcy5fbmVlZHNDbHVzdGVyaW5nLmxlbmd0aC0xO3Q+PTA7dC0tKWUuZXh0ZW5kKHRoaXMuX25lZWRzQ2x1c3RlcmluZ1t0XS5nZXRMYXRMbmcoKSk7cmV0dXJuIGUuZXh0ZW5kKHRoaXMuX25vblBvaW50R3JvdXAuZ2V0Qm91bmRzKCkpLGV9LGVhY2hMYXllcjpmdW5jdGlvbihlLHQpe3ZhciBpLG4scixzPXRoaXMuX25lZWRzQ2x1c3RlcmluZy5zbGljZSgpLG89dGhpcy5fbmVlZHNSZW1vdmluZztmb3IodGhpcy5fdG9wQ2x1c3RlckxldmVsJiZ0aGlzLl90b3BDbHVzdGVyTGV2ZWwuZ2V0QWxsQ2hpbGRNYXJrZXJzKHMpLG49cy5sZW5ndGgtMTtuPj0wO24tLSl7Zm9yKGk9ITAscj1vLmxlbmd0aC0xO3I+PTA7ci0tKWlmKG9bcl0ubGF5ZXI9PT1zW25dKXtpPSExO2JyZWFrfWkmJmUuY2FsbCh0LHNbbl0pfXRoaXMuX25vblBvaW50R3JvdXAuZWFjaExheWVyKGUsdCl9LGdldExheWVyczpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiB0aGlzLmVhY2hMYXllcihmdW5jdGlvbih0KXtlLnB1c2godCl9KSxlfSxnZXRMYXllcjpmdW5jdGlvbihlKXt2YXIgdD1udWxsO3JldHVybiBlPXBhcnNlSW50KGUsMTApLHRoaXMuZWFjaExheWVyKGZ1bmN0aW9uKGkpe0wuc3RhbXAoaSk9PT1lJiYodD1pKX0pLHR9LGhhc0xheWVyOmZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiExO3ZhciB0LGk9dGhpcy5fbmVlZHNDbHVzdGVyaW5nO2Zvcih0PWkubGVuZ3RoLTE7dD49MDt0LS0paWYoaVt0XT09PWUpcmV0dXJuITA7Zm9yKGk9dGhpcy5fbmVlZHNSZW1vdmluZyx0PWkubGVuZ3RoLTE7dD49MDt0LS0paWYoaVt0XS5sYXllcj09PWUpcmV0dXJuITE7cmV0dXJuISghZS5fX3BhcmVudHx8ZS5fX3BhcmVudC5fZ3JvdXAhPT10aGlzKXx8dGhpcy5fbm9uUG9pbnRHcm91cC5oYXNMYXllcihlKX0sem9vbVRvU2hvd0xheWVyOmZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWZ1bmN0aW9uKCl7fSk7dmFyIGk9ZnVuY3Rpb24oKXshZS5faWNvbiYmIWUuX19wYXJlbnQuX2ljb258fHRoaXMuX2luWm9vbUFuaW1hdGlvbnx8KHRoaXMuX21hcC5vZmYoIm1vdmVlbmQiLGksdGhpcyksdGhpcy5vZmYoImFuaW1hdGlvbmVuZCIsaSx0aGlzKSxlLl9pY29uP3QoKTplLl9fcGFyZW50Ll9pY29uJiYodGhpcy5vbmNlKCJzcGlkZXJmaWVkIix0LHRoaXMpLGUuX19wYXJlbnQuc3BpZGVyZnkoKSkpfTtlLl9pY29uJiZ0aGlzLl9tYXAuZ2V0Qm91bmRzKCkuY29udGFpbnMoZS5nZXRMYXRMbmcoKSk/dCgpOmUuX19wYXJlbnQuX3pvb208TWF0aC5yb3VuZCh0aGlzLl9tYXAuX3pvb20pPyh0aGlzLl9tYXAub24oIm1vdmVlbmQiLGksdGhpcyksdGhpcy5fbWFwLnBhblRvKGUuZ2V0TGF0TG5nKCkpKToodGhpcy5fbWFwLm9uKCJtb3ZlZW5kIixpLHRoaXMpLHRoaXMub24oImFuaW1hdGlvbmVuZCIsaSx0aGlzKSxlLl9fcGFyZW50Lnpvb21Ub0JvdW5kcygpKX0sb25BZGQ6ZnVuY3Rpb24oZSl7dGhpcy5fbWFwPWU7dmFyIHQsaSxuO2lmKCFpc0Zpbml0ZSh0aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpKSl0aHJvdyJNYXAgaGFzIG5vIG1heFpvb20gc3BlY2lmaWVkIjtmb3IodGhpcy5fZmVhdHVyZUdyb3VwLmFkZFRvKGUpLHRoaXMuX25vblBvaW50R3JvdXAuYWRkVG8oZSksdGhpcy5fZ3JpZENsdXN0ZXJzfHx0aGlzLl9nZW5lcmF0ZUluaXRpYWxDbHVzdGVycygpLHRoaXMuX21heExhdD1lLm9wdGlvbnMuY3JzLnByb2plY3Rpb24uTUFYX0xBVElUVURFLHQ9MCxpPXRoaXMuX25lZWRzUmVtb3ZpbmcubGVuZ3RoO2k+dDt0Kyspbj10aGlzLl9uZWVkc1JlbW92aW5nW3RdLG4ubmV3bGF0bG5nPW4ubGF5ZXIuX2xhdGxuZyxuLmxheWVyLl9sYXRsbmc9bi5sYXRsbmc7Zm9yKHQ9MCxpPXRoaXMuX25lZWRzUmVtb3ZpbmcubGVuZ3RoO2k+dDt0Kyspbj10aGlzLl9uZWVkc1JlbW92aW5nW3RdLHRoaXMuX3JlbW92ZUxheWVyKG4ubGF5ZXIsITApLG4ubGF5ZXIuX2xhdGxuZz1uLm5ld2xhdGxuZzt0aGlzLl9uZWVkc1JlbW92aW5nPVtdLHRoaXMuX3pvb209TWF0aC5yb3VuZCh0aGlzLl9tYXAuX3pvb20pLHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcz10aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSx0aGlzLl9tYXAub24oInpvb21lbmQiLHRoaXMuX3pvb21FbmQsdGhpcyksdGhpcy5fbWFwLm9uKCJtb3ZlZW5kIix0aGlzLl9tb3ZlRW5kLHRoaXMpLHRoaXMuX3NwaWRlcmZpZXJPbkFkZCYmdGhpcy5fc3BpZGVyZmllck9uQWRkKCksdGhpcy5fYmluZEV2ZW50cygpLGk9dGhpcy5fbmVlZHNDbHVzdGVyaW5nLHRoaXMuX25lZWRzQ2x1c3RlcmluZz1bXSx0aGlzLmFkZExheWVycyhpLCEwKX0sb25SZW1vdmU6ZnVuY3Rpb24oZSl7ZS5vZmYoInpvb21lbmQiLHRoaXMuX3pvb21FbmQsdGhpcyksZS5vZmYoIm1vdmVlbmQiLHRoaXMuX21vdmVFbmQsdGhpcyksdGhpcy5fdW5iaW5kRXZlbnRzKCksdGhpcy5fbWFwLl9tYXBQYW5lLmNsYXNzTmFtZT10aGlzLl9tYXAuX21hcFBhbmUuY2xhc3NOYW1lLnJlcGxhY2UoIiBsZWFmbGV0LWNsdXN0ZXItYW5pbSIsIiIpLHRoaXMuX3NwaWRlcmZpZXJPblJlbW92ZSYmdGhpcy5fc3BpZGVyZmllck9uUmVtb3ZlKCksZGVsZXRlIHRoaXMuX21heExhdCx0aGlzLl9oaWRlQ292ZXJhZ2UoKSx0aGlzLl9mZWF0dXJlR3JvdXAucmVtb3ZlKCksdGhpcy5fbm9uUG9pbnRHcm91cC5yZW1vdmUoKSx0aGlzLl9mZWF0dXJlR3JvdXAuY2xlYXJMYXllcnMoKSx0aGlzLl9tYXA9bnVsbH0sZ2V0VmlzaWJsZVBhcmVudDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZTt0JiYhdC5faWNvbjspdD10Ll9fcGFyZW50O3JldHVybiB0fHxudWxsfSxfYXJyYXlTcGxpY2U6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIGk9ZS5sZW5ndGgtMTtpPj0wO2ktLSlpZihlW2ldPT09dClyZXR1cm4gZS5zcGxpY2UoaSwxKSwhMH0sX3JlbW92ZUZyb21HcmlkVW5jbHVzdGVyZWQ6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIGk9dGhpcy5fbWFwLG49dGhpcy5fZ3JpZFVuY2x1c3RlcmVkLHI9TWF0aC5mbG9vcih0aGlzLl9tYXAuZ2V0TWluWm9vbSgpKTt0Pj1yJiZuW3RdLnJlbW92ZU9iamVjdChlLGkucHJvamVjdChlLmdldExhdExuZygpLHQpKTt0LS0pO30sX2NoaWxkTWFya2VyRHJhZ1N0YXJ0OmZ1bmN0aW9uKGUpe2UudGFyZ2V0Ll9fZHJhZ1N0YXJ0PWUudGFyZ2V0Ll9sYXRsbmd9LF9jaGlsZE1hcmtlck1vdmVkOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLl9pZ25vcmVNb3ZlJiYhZS50YXJnZXQuX19kcmFnU3RhcnQpe3ZhciB0PWUudGFyZ2V0Ll9wb3B1cCYmZS50YXJnZXQuX3BvcHVwLmlzT3BlbigpO3RoaXMuX21vdmVDaGlsZChlLnRhcmdldCxlLm9sZExhdExuZyxlLmxhdGxuZyksdCYmZS50YXJnZXQub3BlblBvcHVwKCl9fSxfbW92ZUNoaWxkOmZ1bmN0aW9uKGUsdCxpKXtlLl9sYXRsbmc9dCx0aGlzLnJlbW92ZUxheWVyKGUpLGUuX2xhdGxuZz1pLHRoaXMuYWRkTGF5ZXIoZSl9LF9jaGlsZE1hcmtlckRyYWdFbmQ6ZnVuY3Rpb24oZSl7ZS50YXJnZXQuX19kcmFnU3RhcnQmJnRoaXMuX21vdmVDaGlsZChlLnRhcmdldCxlLnRhcmdldC5fX2RyYWdTdGFydCxlLnRhcmdldC5fbGF0bG5nKSxkZWxldGUgZS50YXJnZXQuX19kcmFnU3RhcnR9LF9yZW1vdmVMYXllcjpmdW5jdGlvbihlLHQsaSl7dmFyIG49dGhpcy5fZ3JpZENsdXN0ZXJzLHI9dGhpcy5fZ3JpZFVuY2x1c3RlcmVkLHM9dGhpcy5fZmVhdHVyZUdyb3VwLG89dGhpcy5fbWFwLGE9TWF0aC5mbG9vcih0aGlzLl9tYXAuZ2V0TWluWm9vbSgpKTt0JiZ0aGlzLl9yZW1vdmVGcm9tR3JpZFVuY2x1c3RlcmVkKGUsdGhpcy5fbWF4Wm9vbSk7dmFyIGgsbD1lLl9fcGFyZW50LHU9bC5fbWFya2Vycztmb3IodGhpcy5fYXJyYXlTcGxpY2UodSxlKTtsJiYobC5fY2hpbGRDb3VudC0tLGwuX2JvdW5kc05lZWRVcGRhdGU9ITAsIShsLl96b29tPGEpKTspdCYmbC5fY2hpbGRDb3VudDw9MT8oaD1sLl9tYXJrZXJzWzBdPT09ZT9sLl9tYXJrZXJzWzFdOmwuX21hcmtlcnNbMF0sbltsLl96b29tXS5yZW1vdmVPYmplY3QobCxvLnByb2plY3QobC5fY0xhdExuZyxsLl96b29tKSkscltsLl96b29tXS5hZGRPYmplY3QoaCxvLnByb2plY3QoaC5nZXRMYXRMbmcoKSxsLl96b29tKSksdGhpcy5fYXJyYXlTcGxpY2UobC5fX3BhcmVudC5fY2hpbGRDbHVzdGVycyxsKSxsLl9fcGFyZW50Ll9tYXJrZXJzLnB1c2goaCksaC5fX3BhcmVudD1sLl9fcGFyZW50LGwuX2ljb24mJihzLnJlbW92ZUxheWVyKGwpLGl8fHMuYWRkTGF5ZXIoaCkpKTpsLl9pY29uTmVlZHNVcGRhdGU9ITAsbD1sLl9fcGFyZW50O2RlbGV0ZSBlLl9fcGFyZW50fSxfaXNPcklzUGFyZW50OmZ1bmN0aW9uKGUsdCl7Zm9yKDt0Oyl7aWYoZT09PXQpcmV0dXJuITA7dD10LnBhcmVudE5vZGV9cmV0dXJuITF9LGZpcmU6ZnVuY3Rpb24oZSx0LGkpe2lmKHQmJnQubGF5ZXIgaW5zdGFuY2VvZiBMLk1hcmtlckNsdXN0ZXIpe2lmKHQub3JpZ2luYWxFdmVudCYmdGhpcy5faXNPcklzUGFyZW50KHQubGF5ZXIuX2ljb24sdC5vcmlnaW5hbEV2ZW50LnJlbGF0ZWRUYXJnZXQpKXJldHVybjtlPSJjbHVzdGVyIitlfUwuRmVhdHVyZUdyb3VwLnByb3RvdHlwZS5maXJlLmNhbGwodGhpcyxlLHQsaSl9LGxpc3RlbnM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gTC5GZWF0dXJlR3JvdXAucHJvdG90eXBlLmxpc3RlbnMuY2FsbCh0aGlzLGUsdCl8fEwuRmVhdHVyZUdyb3VwLnByb3RvdHlwZS5saXN0ZW5zLmNhbGwodGhpcywiY2x1c3RlciIrZSx0KX0sX2RlZmF1bHRJY29uQ3JlYXRlRnVuY3Rpb246ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRDaGlsZENvdW50KCksaT0iIG1hcmtlci1jbHVzdGVyLSI7cmV0dXJuIGkrPTEwPnQ/InNtYWxsIjoxMDA+dD8ibWVkaXVtIjoibGFyZ2UiLG5ldyBMLkRpdkljb24oe2h0bWw6IjxkaXY+PHNwYW4+Iit0KyI8L3NwYW4+PC9kaXY+IixjbGFzc05hbWU6Im1hcmtlci1jbHVzdGVyIitpLGljb25TaXplOm5ldyBMLlBvaW50KDQwLDQwKX0pfSxfYmluZEV2ZW50czpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX21hcCx0PXRoaXMub3B0aW9ucy5zcGlkZXJmeU9uTWF4Wm9vbSxpPXRoaXMub3B0aW9ucy5zaG93Q292ZXJhZ2VPbkhvdmVyLG49dGhpcy5vcHRpb25zLnpvb21Ub0JvdW5kc09uQ2xpY2s7KHR8fG4pJiZ0aGlzLm9uKCJjbHVzdGVyY2xpY2siLHRoaXMuX3pvb21PclNwaWRlcmZ5LHRoaXMpLGkmJih0aGlzLm9uKCJjbHVzdGVybW91c2VvdmVyIix0aGlzLl9zaG93Q292ZXJhZ2UsdGhpcyksdGhpcy5vbigiY2x1c3Rlcm1vdXNlb3V0Iix0aGlzLl9oaWRlQ292ZXJhZ2UsdGhpcyksZS5vbigiem9vbWVuZCIsdGhpcy5faGlkZUNvdmVyYWdlLHRoaXMpKX0sX3pvb21PclNwaWRlcmZ5OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmxheWVyLGk9dDsxPT09aS5fY2hpbGRDbHVzdGVycy5sZW5ndGg7KWk9aS5fY2hpbGRDbHVzdGVyc1swXTtpLl96b29tPT09dGhpcy5fbWF4Wm9vbSYmaS5fY2hpbGRDb3VudD09PXQuX2NoaWxkQ291bnQmJnRoaXMub3B0aW9ucy5zcGlkZXJmeU9uTWF4Wm9vbT90LnNwaWRlcmZ5KCk6dGhpcy5vcHRpb25zLnpvb21Ub0JvdW5kc09uQ2xpY2smJnQuem9vbVRvQm91bmRzKCksZS5vcmlnaW5hbEV2ZW50JiYxMz09PWUub3JpZ2luYWxFdmVudC5rZXlDb2RlJiZ0aGlzLl9tYXAuX2NvbnRhaW5lci5mb2N1cygpfSxfc2hvd0NvdmVyYWdlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX21hcDt0aGlzLl9pblpvb21BbmltYXRpb258fCh0aGlzLl9zaG93blBvbHlnb24mJnQucmVtb3ZlTGF5ZXIodGhpcy5fc2hvd25Qb2x5Z29uKSxlLmxheWVyLmdldENoaWxkQ291bnQoKT4yJiZlLmxheWVyIT09dGhpcy5fc3BpZGVyZmllZCYmKHRoaXMuX3Nob3duUG9seWdvbj1uZXcgTC5Qb2x5Z29uKGUubGF5ZXIuZ2V0Q29udmV4SHVsbCgpLHRoaXMub3B0aW9ucy5wb2x5Z29uT3B0aW9ucyksdC5hZGRMYXllcih0aGlzLl9zaG93blBvbHlnb24pKSl9LF9oaWRlQ292ZXJhZ2U6ZnVuY3Rpb24oKXt0aGlzLl9zaG93blBvbHlnb24mJih0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fc2hvd25Qb2x5Z29uKSx0aGlzLl9zaG93blBvbHlnb249bnVsbCl9LF91bmJpbmRFdmVudHM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnMuc3BpZGVyZnlPbk1heFpvb20sdD10aGlzLm9wdGlvbnMuc2hvd0NvdmVyYWdlT25Ib3ZlcixpPXRoaXMub3B0aW9ucy56b29tVG9Cb3VuZHNPbkNsaWNrLG49dGhpcy5fbWFwOyhlfHxpKSYmdGhpcy5vZmYoImNsdXN0ZXJjbGljayIsdGhpcy5fem9vbU9yU3BpZGVyZnksdGhpcyksdCYmKHRoaXMub2ZmKCJjbHVzdGVybW91c2VvdmVyIix0aGlzLl9zaG93Q292ZXJhZ2UsdGhpcyksdGhpcy5vZmYoImNsdXN0ZXJtb3VzZW91dCIsdGhpcy5faGlkZUNvdmVyYWdlLHRoaXMpLG4ub2ZmKCJ6b29tZW5kIix0aGlzLl9oaWRlQ292ZXJhZ2UsdGhpcykpfSxfem9vbUVuZDpmdW5jdGlvbigpe3RoaXMuX21hcCYmKHRoaXMuX21lcmdlU3BsaXRDbHVzdGVycygpLHRoaXMuX3pvb209TWF0aC5yb3VuZCh0aGlzLl9tYXAuX3pvb20pLHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcz10aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSl9LF9tb3ZlRW5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2luWm9vbUFuaW1hdGlvbil7dmFyIGU9dGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCk7dGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcCh0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMsTWF0aC5mbG9vcih0aGlzLl9tYXAuZ2V0TWluWm9vbSgpKSx0aGlzLl96b29tLGUpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsTWF0aC5yb3VuZCh0aGlzLl9tYXAuX3pvb20pLGUpLHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcz1lfX0sX2dlbmVyYXRlSW5pdGlhbENsdXN0ZXJzOmZ1bmN0aW9uKCl7dmFyIGU9TWF0aC5jZWlsKHRoaXMuX21hcC5nZXRNYXhab29tKCkpLHQ9TWF0aC5mbG9vcih0aGlzLl9tYXAuZ2V0TWluWm9vbSgpKSxpPXRoaXMub3B0aW9ucy5tYXhDbHVzdGVyUmFkaXVzLG49aTsiZnVuY3Rpb24iIT10eXBlb2YgaSYmKG49ZnVuY3Rpb24oKXtyZXR1cm4gaX0pLG51bGwhPT10aGlzLm9wdGlvbnMuZGlzYWJsZUNsdXN0ZXJpbmdBdFpvb20mJihlPXRoaXMub3B0aW9ucy5kaXNhYmxlQ2x1c3RlcmluZ0F0Wm9vbS0xKSx0aGlzLl9tYXhab29tPWUsdGhpcy5fZ3JpZENsdXN0ZXJzPXt9LHRoaXMuX2dyaWRVbmNsdXN0ZXJlZD17fTtmb3IodmFyIHI9ZTtyPj10O3ItLSl0aGlzLl9ncmlkQ2x1c3RlcnNbcl09bmV3IEwuRGlzdGFuY2VHcmlkKG4ocikpLHRoaXMuX2dyaWRVbmNsdXN0ZXJlZFtyXT1uZXcgTC5EaXN0YW5jZUdyaWQobihyKSk7dGhpcy5fdG9wQ2x1c3RlckxldmVsPW5ldyB0aGlzLl9tYXJrZXJDbHVzdGVyKHRoaXMsdC0xKX0sX2FkZExheWVyOmZ1bmN0aW9uKGUsdCl7dmFyIGksbixyPXRoaXMuX2dyaWRDbHVzdGVycyxzPXRoaXMuX2dyaWRVbmNsdXN0ZXJlZCxvPU1hdGguZmxvb3IodGhpcy5fbWFwLmdldE1pblpvb20oKSk7Zm9yKHRoaXMub3B0aW9ucy5zaW5nbGVNYXJrZXJNb2RlJiZ0aGlzLl9vdmVycmlkZU1hcmtlckljb24oZSksZS5vbih0aGlzLl9jaGlsZE1hcmtlckV2ZW50SGFuZGxlcnMsdGhpcyk7dD49bzt0LS0pe2k9dGhpcy5fbWFwLnByb2plY3QoZS5nZXRMYXRMbmcoKSx0KTt2YXIgYT1yW3RdLmdldE5lYXJPYmplY3QoaSk7aWYoYSlyZXR1cm4gYS5fYWRkQ2hpbGQoZSksZS5fX3BhcmVudD1hLHZvaWQgMDtpZihhPXNbdF0uZ2V0TmVhck9iamVjdChpKSl7dmFyIGg9YS5fX3BhcmVudDtoJiZ0aGlzLl9yZW1vdmVMYXllcihhLCExKTt2YXIgbD1uZXcgdGhpcy5fbWFya2VyQ2x1c3Rlcih0aGlzLHQsYSxlKTtyW3RdLmFkZE9iamVjdChsLHRoaXMuX21hcC5wcm9qZWN0KGwuX2NMYXRMbmcsdCkpLGEuX19wYXJlbnQ9bCxlLl9fcGFyZW50PWw7dmFyIHU9bDtmb3Iobj10LTE7bj5oLl96b29tO24tLSl1PW5ldyB0aGlzLl9tYXJrZXJDbHVzdGVyKHRoaXMsbix1KSxyW25dLmFkZE9iamVjdCh1LHRoaXMuX21hcC5wcm9qZWN0KGEuZ2V0TGF0TG5nKCksbikpO3JldHVybiBoLl9hZGRDaGlsZCh1KSx0aGlzLl9yZW1vdmVGcm9tR3JpZFVuY2x1c3RlcmVkKGEsdCksdm9pZCAwfXNbdF0uYWRkT2JqZWN0KGUsaSl9dGhpcy5fdG9wQ2x1c3RlckxldmVsLl9hZGRDaGlsZChlKSxlLl9fcGFyZW50PXRoaXMuX3RvcENsdXN0ZXJMZXZlbH0sX3JlZnJlc2hDbHVzdGVyc0ljb25zOmZ1bmN0aW9uKCl7dGhpcy5fZmVhdHVyZUdyb3VwLmVhY2hMYXllcihmdW5jdGlvbihlKXtlIGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyJiZlLl9pY29uTmVlZHNVcGRhdGUmJmUuX3VwZGF0ZUljb24oKX0pfSxfZW5xdWV1ZTpmdW5jdGlvbihlKXt0aGlzLl9xdWV1ZS5wdXNoKGUpLHRoaXMuX3F1ZXVlVGltZW91dHx8KHRoaXMuX3F1ZXVlVGltZW91dD1zZXRUaW1lb3V0KEwuYmluZCh0aGlzLl9wcm9jZXNzUXVldWUsdGhpcyksMzAwKSl9LF9wcm9jZXNzUXVldWU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuX3F1ZXVlLmxlbmd0aDtlKyspdGhpcy5fcXVldWVbZV0uY2FsbCh0aGlzKTt0aGlzLl9xdWV1ZS5sZW5ndGg9MCxjbGVhclRpbWVvdXQodGhpcy5fcXVldWVUaW1lb3V0KSx0aGlzLl9xdWV1ZVRpbWVvdXQ9bnVsbH0sX21lcmdlU3BsaXRDbHVzdGVyczpmdW5jdGlvbigpe3ZhciBlPU1hdGgucm91bmQodGhpcy5fbWFwLl96b29tKTt0aGlzLl9wcm9jZXNzUXVldWUoKSx0aGlzLl96b29tPGUmJnRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcy5pbnRlcnNlY3RzKHRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpKT8odGhpcy5fYW5pbWF0aW9uU3RhcnQoKSx0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5UmVtb3ZlQ2hpbGRyZW5Gcm9tTWFwKHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcyxNYXRoLmZsb29yKHRoaXMuX21hcC5nZXRNaW5ab29tKCkpLHRoaXMuX3pvb20sdGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCkpLHRoaXMuX2FuaW1hdGlvblpvb21Jbih0aGlzLl96b29tLGUpKTp0aGlzLl96b29tPmU/KHRoaXMuX2FuaW1hdGlvblN0YXJ0KCksdGhpcy5fYW5pbWF0aW9uWm9vbU91dCh0aGlzLl96b29tLGUpKTp0aGlzLl9tb3ZlRW5kKCl9LF9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnJlbW92ZU91dHNpZGVWaXNpYmxlQm91bmRzP0wuQnJvd3Nlci5tb2JpbGU/dGhpcy5fY2hlY2tCb3VuZHNNYXhMYXQodGhpcy5fbWFwLmdldEJvdW5kcygpKTp0aGlzLl9jaGVja0JvdW5kc01heExhdCh0aGlzLl9tYXAuZ2V0Qm91bmRzKCkucGFkKDEpKTp0aGlzLl9tYXBCb3VuZHNJbmZpbml0ZX0sX2NoZWNrQm91bmRzTWF4TGF0OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX21heExhdDtyZXR1cm4gdCE9PWkmJihlLmdldE5vcnRoKCk+PXQmJihlLl9ub3J0aEVhc3QubGF0PTEvMCksZS5nZXRTb3V0aCgpPD0tdCYmKGUuX3NvdXRoV2VzdC5sYXQ9LTEvMCkpLGV9LF9hbmltYXRpb25BZGRMYXllck5vbkFuaW1hdGVkOmZ1bmN0aW9uKGUsdCl7aWYodD09PWUpdGhpcy5fZmVhdHVyZUdyb3VwLmFkZExheWVyKGUpO2Vsc2UgaWYoMj09PXQuX2NoaWxkQ291bnQpe3QuX2FkZFRvTWFwKCk7dmFyIGk9dC5nZXRBbGxDaGlsZE1hcmtlcnMoKTt0aGlzLl9mZWF0dXJlR3JvdXAucmVtb3ZlTGF5ZXIoaVswXSksdGhpcy5fZmVhdHVyZUdyb3VwLnJlbW92ZUxheWVyKGlbMV0pfWVsc2UgdC5fdXBkYXRlSWNvbigpfSxfZXh0cmFjdE5vbkdyb3VwTGF5ZXJzOmZ1bmN0aW9uKGUsdCl7dmFyIGksbj1lLmdldExheWVycygpLHI9MDtmb3IodD10fHxbXTtyPG4ubGVuZ3RoO3IrKylpPW5bcl0saSBpbnN0YW5jZW9mIEwuTGF5ZXJHcm91cD90aGlzLl9leHRyYWN0Tm9uR3JvdXBMYXllcnMoaSx0KTp0LnB1c2goaSk7cmV0dXJuIHR9LF9vdmVycmlkZU1hcmtlckljb246ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLmljb249dGhpcy5vcHRpb25zLmljb25DcmVhdGVGdW5jdGlvbih7Z2V0Q2hpbGRDb3VudDpmdW5jdGlvbigpe3JldHVybiAxfSxnZXRBbGxDaGlsZE1hcmtlcnM6ZnVuY3Rpb24oKXtyZXR1cm5bZV19fSk7cmV0dXJuIHR9fSksTC5NYXJrZXJDbHVzdGVyR3JvdXAuaW5jbHVkZSh7X21hcEJvdW5kc0luZmluaXRlOm5ldyBMLkxhdExuZ0JvdW5kcyhuZXcgTC5MYXRMbmcoLTEvMCwtMS8wKSxuZXcgTC5MYXRMbmcoMS8wLDEvMCkpfSksTC5NYXJrZXJDbHVzdGVyR3JvdXAuaW5jbHVkZSh7X25vQW5pbWF0aW9uOntfYW5pbWF0aW9uU3RhcnQ6ZnVuY3Rpb24oKXt9LF9hbmltYXRpb25ab29tSW46ZnVuY3Rpb24oZSx0KXt0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5UmVtb3ZlQ2hpbGRyZW5Gcm9tTWFwKHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcyxNYXRoLmZsb29yKHRoaXMuX21hcC5nZXRNaW5ab29tKCkpLGUpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsdCx0aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSksdGhpcy5maXJlKCJhbmltYXRpb25lbmQiKX0sX2FuaW1hdGlvblpvb21PdXQ6ZnVuY3Rpb24oZSx0KXt0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5UmVtb3ZlQ2hpbGRyZW5Gcm9tTWFwKHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcyxNYXRoLmZsb29yKHRoaXMuX21hcC5nZXRNaW5ab29tKCkpLGUpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsdCx0aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSksdGhpcy5maXJlKCJhbmltYXRpb25lbmQiKX0sX2FuaW1hdGlvbkFkZExheWVyOmZ1bmN0aW9uKGUsdCl7dGhpcy5fYW5pbWF0aW9uQWRkTGF5ZXJOb25BbmltYXRlZChlLHQpfX0sX3dpdGhBbmltYXRpb246e19hbmltYXRpb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX21hcC5fbWFwUGFuZS5jbGFzc05hbWUrPSIgbGVhZmxldC1jbHVzdGVyLWFuaW0iLHRoaXMuX2luWm9vbUFuaW1hdGlvbisrfSxfYW5pbWF0aW9uWm9vbUluOmZ1bmN0aW9uKGUsdCl7dmFyIGksbj10aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSxyPXRoaXMuX2ZlYXR1cmVHcm91cCxzPU1hdGguZmxvb3IodGhpcy5fbWFwLmdldE1pblpvb20oKSk7dGhpcy5faWdub3JlTW92ZT0hMCx0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5KG4sZSxzLGZ1bmN0aW9uKHMpe3ZhciBvLGE9cy5fbGF0bG5nLGg9cy5fbWFya2Vycztmb3Iobi5jb250YWlucyhhKXx8KGE9bnVsbCkscy5faXNTaW5nbGVQYXJlbnQoKSYmZSsxPT09dD8oci5yZW1vdmVMYXllcihzKSxzLl9yZWN1cnNpdmVseUFkZENoaWxkcmVuVG9NYXAobnVsbCx0LG4pKToocy5jbHVzdGVySGlkZSgpLHMuX3JlY3Vyc2l2ZWx5QWRkQ2hpbGRyZW5Ub01hcChhLHQsbikpLGk9aC5sZW5ndGgtMTtpPj0wO2ktLSlvPWhbaV0sbi5jb250YWlucyhvLl9sYXRsbmcpfHxyLnJlbW92ZUxheWVyKG8pfSksdGhpcy5fZm9yY2VMYXlvdXQoKSx0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5QmVjb21lVmlzaWJsZShuLHQpLHIuZWFjaExheWVyKGZ1bmN0aW9uKGUpe2UgaW5zdGFuY2VvZiBMLk1hcmtlckNsdXN0ZXJ8fCFlLl9pY29ufHxlLmNsdXN0ZXJTaG93KCl9KSx0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5KG4sZSx0LGZ1bmN0aW9uKGUpe2UuX3JlY3Vyc2l2ZWx5UmVzdG9yZUNoaWxkUG9zaXRpb25zKHQpfSksdGhpcy5faWdub3JlTW92ZT0hMSx0aGlzLl9lbnF1ZXVlKGZ1bmN0aW9uKCl7dGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseShuLGUscyxmdW5jdGlvbihlKXtyLnJlbW92ZUxheWVyKGUpLGUuY2x1c3RlclNob3coKX0pLHRoaXMuX2FuaW1hdGlvbkVuZCgpfSl9LF9hbmltYXRpb25ab29tT3V0OmZ1bmN0aW9uKGUsdCl7dGhpcy5fYW5pbWF0aW9uWm9vbU91dFNpbmdsZSh0aGlzLl90b3BDbHVzdGVyTGV2ZWwsZS0xLHQpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsdCx0aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSksdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcCh0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMsTWF0aC5mbG9vcih0aGlzLl9tYXAuZ2V0TWluWm9vbSgpKSxlLHRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpKX0sX2FuaW1hdGlvbkFkZExheWVyOmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcyxuPXRoaXMuX2ZlYXR1cmVHcm91cDtuLmFkZExheWVyKGUpLHQhPT1lJiYodC5fY2hpbGRDb3VudD4yPyh0Ll91cGRhdGVJY29uKCksdGhpcy5fZm9yY2VMYXlvdXQoKSx0aGlzLl9hbmltYXRpb25TdGFydCgpLGUuX3NldFBvcyh0aGlzLl9tYXAubGF0TG5nVG9MYXllclBvaW50KHQuZ2V0TGF0TG5nKCkpKSxlLmNsdXN0ZXJIaWRlKCksdGhpcy5fZW5xdWV1ZShmdW5jdGlvbigpe24ucmVtb3ZlTGF5ZXIoZSksZS5jbHVzdGVyU2hvdygpLGkuX2FuaW1hdGlvbkVuZCgpfSkpOih0aGlzLl9mb3JjZUxheW91dCgpLGkuX2FuaW1hdGlvblN0YXJ0KCksaS5fYW5pbWF0aW9uWm9vbU91dFNpbmdsZSh0LHRoaXMuX21hcC5nZXRNYXhab29tKCksdGhpcy5fem9vbSkpKX19LF9hbmltYXRpb25ab29tT3V0U2luZ2xlOmZ1bmN0aW9uKGUsdCxpKXt2YXIgbj10aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSxyPU1hdGguZmxvb3IodGhpcy5fbWFwLmdldE1pblpvb20oKSk7ZS5fcmVjdXJzaXZlbHlBbmltYXRlQ2hpbGRyZW5JbkFuZEFkZFNlbGZUb01hcChuLHIsdCsxLGkpO3ZhciBzPXRoaXM7dGhpcy5fZm9yY2VMYXlvdXQoKSxlLl9yZWN1cnNpdmVseUJlY29tZVZpc2libGUobixpKSx0aGlzLl9lbnF1ZXVlKGZ1bmN0aW9uKCl7aWYoMT09PWUuX2NoaWxkQ291bnQpe3ZhciBvPWUuX21hcmtlcnNbMF07dGhpcy5faWdub3JlTW92ZT0hMCxvLnNldExhdExuZyhvLmdldExhdExuZygpKSx0aGlzLl9pZ25vcmVNb3ZlPSExLG8uY2x1c3RlclNob3cmJm8uY2x1c3RlclNob3coKX1lbHNlIGUuX3JlY3Vyc2l2ZWx5KG4saSxyLGZ1bmN0aW9uKGUpe2UuX3JlY3Vyc2l2ZWx5UmVtb3ZlQ2hpbGRyZW5Gcm9tTWFwKG4scix0KzEpfSk7cy5fYW5pbWF0aW9uRW5kKCl9KX0sX2FuaW1hdGlvbkVuZDpmdW5jdGlvbigpe3RoaXMuX21hcCYmKHRoaXMuX21hcC5fbWFwUGFuZS5jbGFzc05hbWU9dGhpcy5fbWFwLl9tYXBQYW5lLmNsYXNzTmFtZS5yZXBsYWNlKCIgbGVhZmxldC1jbHVzdGVyLWFuaW0iLCIiKSksdGhpcy5faW5ab29tQW5pbWF0aW9uLS0sdGhpcy5maXJlKCJhbmltYXRpb25lbmQiKX0sX2ZvcmNlTGF5b3V0OmZ1bmN0aW9uKCl7TC5VdGlsLmZhbHNlRm4odC5ib2R5Lm9mZnNldFdpZHRoKX19KSxMLm1hcmtlckNsdXN0ZXJHcm91cD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IEwuTWFya2VyQ2x1c3Rlckdyb3VwKGUpfSxMLk1hcmtlckNsdXN0ZXI9TC5NYXJrZXIuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKGUsdCxpLG4pe0wuTWFya2VyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxpP2kuX2NMYXRMbmd8fGkuZ2V0TGF0TG5nKCk6bmV3IEwuTGF0TG5nKDAsMCkse2ljb246dGhpcyxwYW5lOmUub3B0aW9ucy5jbHVzdGVyUGFuZX0pLHRoaXMuX2dyb3VwPWUsdGhpcy5fem9vbT10LHRoaXMuX21hcmtlcnM9W10sdGhpcy5fY2hpbGRDbHVzdGVycz1bXSx0aGlzLl9jaGlsZENvdW50PTAsdGhpcy5faWNvbk5lZWRzVXBkYXRlPSEwLHRoaXMuX2JvdW5kc05lZWRVcGRhdGU9ITAsdGhpcy5fYm91bmRzPW5ldyBMLkxhdExuZ0JvdW5kcyxpJiZ0aGlzLl9hZGRDaGlsZChpKSxuJiZ0aGlzLl9hZGRDaGlsZChuKX0sZ2V0QWxsQ2hpbGRNYXJrZXJzOmZ1bmN0aW9uKGUpe2U9ZXx8W107Zm9yKHZhciB0PXRoaXMuX2NoaWxkQ2x1c3RlcnMubGVuZ3RoLTE7dD49MDt0LS0pdGhpcy5fY2hpbGRDbHVzdGVyc1t0XS5nZXRBbGxDaGlsZE1hcmtlcnMoZSk7Zm9yKHZhciBpPXRoaXMuX21hcmtlcnMubGVuZ3RoLTE7aT49MDtpLS0pZS5wdXNoKHRoaXMuX21hcmtlcnNbaV0pO3JldHVybiBlfSxnZXRDaGlsZENvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkQ291bnR9LHpvb21Ub0JvdW5kczpmdW5jdGlvbihlKXtmb3IodmFyIHQsaT10aGlzLl9jaGlsZENsdXN0ZXJzLnNsaWNlKCksbj10aGlzLl9ncm91cC5fbWFwLHI9bi5nZXRCb3VuZHNab29tKHRoaXMuX2JvdW5kcykscz10aGlzLl96b29tKzEsbz1uLmdldFpvb20oKTtpLmxlbmd0aD4wJiZyPnM7KXtzKys7dmFyIGE9W107Zm9yKHQ9MDt0PGkubGVuZ3RoO3QrKylhPWEuY29uY2F0KGlbdF0uX2NoaWxkQ2x1c3RlcnMpO2k9YX1yPnM/dGhpcy5fZ3JvdXAuX21hcC5zZXRWaWV3KHRoaXMuX2xhdGxuZyxzKTpvPj1yP3RoaXMuX2dyb3VwLl9tYXAuc2V0Vmlldyh0aGlzLl9sYXRsbmcsbysxKTp0aGlzLl9ncm91cC5fbWFwLmZpdEJvdW5kcyh0aGlzLl9ib3VuZHMsZSl9LGdldEJvdW5kczpmdW5jdGlvbigpe3ZhciBlPW5ldyBMLkxhdExuZ0JvdW5kcztyZXR1cm4gZS5leHRlbmQodGhpcy5fYm91bmRzKSxlfSxfdXBkYXRlSWNvbjpmdW5jdGlvbigpe3RoaXMuX2ljb25OZWVkc1VwZGF0ZT0hMCx0aGlzLl9pY29uJiZ0aGlzLnNldEljb24odGhpcyl9LGNyZWF0ZUljb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWNvbk5lZWRzVXBkYXRlJiYodGhpcy5faWNvbk9iaj10aGlzLl9ncm91cC5vcHRpb25zLmljb25DcmVhdGVGdW5jdGlvbih0aGlzKSx0aGlzLl9pY29uTmVlZHNVcGRhdGU9ITEpLHRoaXMuX2ljb25PYmouY3JlYXRlSWNvbigpfSxjcmVhdGVTaGFkb3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWNvbk9iai5jcmVhdGVTaGFkb3coKX0sX2FkZENoaWxkOmZ1bmN0aW9uKGUsdCl7dGhpcy5faWNvbk5lZWRzVXBkYXRlPSEwLHRoaXMuX2JvdW5kc05lZWRVcGRhdGU9ITAsdGhpcy5fc2V0Q2x1c3RlckNlbnRlcihlKSxlIGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyPyh0fHwodGhpcy5fY2hpbGRDbHVzdGVycy5wdXNoKGUpLGUuX19wYXJlbnQ9dGhpcyksdGhpcy5fY2hpbGRDb3VudCs9ZS5fY2hpbGRDb3VudCk6KHR8fHRoaXMuX21hcmtlcnMucHVzaChlKSx0aGlzLl9jaGlsZENvdW50KyspLHRoaXMuX19wYXJlbnQmJnRoaXMuX19wYXJlbnQuX2FkZENoaWxkKGUsITApfSxfc2V0Q2x1c3RlckNlbnRlcjpmdW5jdGlvbihlKXt0aGlzLl9jTGF0TG5nfHwodGhpcy5fY0xhdExuZz1lLl9jTGF0TG5nfHxlLl9sYXRsbmcpfSxfcmVzZXRCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9ib3VuZHM7ZS5fc291dGhXZXN0JiYoZS5fc291dGhXZXN0LmxhdD0xLzAsZS5fc291dGhXZXN0LmxuZz0xLzApLGUuX25vcnRoRWFzdCYmKGUuX25vcnRoRWFzdC5sYXQ9LTEvMCxlLl9ub3J0aEVhc3QubG5nPS0xLzApfSxfcmVjYWxjdWxhdGVCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgZSx0LGksbixyPXRoaXMuX21hcmtlcnMscz10aGlzLl9jaGlsZENsdXN0ZXJzLG89MCxhPTAsaD10aGlzLl9jaGlsZENvdW50O2lmKDAhPT1oKXtmb3IodGhpcy5fcmVzZXRCb3VuZHMoKSxlPTA7ZTxyLmxlbmd0aDtlKyspaT1yW2VdLl9sYXRsbmcsdGhpcy5fYm91bmRzLmV4dGVuZChpKSxvKz1pLmxhdCxhKz1pLmxuZztmb3IoZT0wO2U8cy5sZW5ndGg7ZSsrKXQ9c1tlXSx0Ll9ib3VuZHNOZWVkVXBkYXRlJiZ0Ll9yZWNhbGN1bGF0ZUJvdW5kcygpLHRoaXMuX2JvdW5kcy5leHRlbmQodC5fYm91bmRzKSxpPXQuX3dMYXRMbmcsbj10Ll9jaGlsZENvdW50LG8rPWkubGF0Km4sYSs9aS5sbmcqbjt0aGlzLl9sYXRsbmc9dGhpcy5fd0xhdExuZz1uZXcgTC5MYXRMbmcoby9oLGEvaCksdGhpcy5fYm91bmRzTmVlZFVwZGF0ZT0hMX19LF9hZGRUb01hcDpmdW5jdGlvbihlKXtlJiYodGhpcy5fYmFja3VwTGF0bG5nPXRoaXMuX2xhdGxuZyx0aGlzLnNldExhdExuZyhlKSksdGhpcy5fZ3JvdXAuX2ZlYXR1cmVHcm91cC5hZGRMYXllcih0aGlzKX0sX3JlY3Vyc2l2ZWx5QW5pbWF0ZUNoaWxkcmVuSW46ZnVuY3Rpb24oZSx0LGkpe3RoaXMuX3JlY3Vyc2l2ZWx5KGUsdGhpcy5fZ3JvdXAuX21hcC5nZXRNaW5ab29tKCksaS0xLGZ1bmN0aW9uKGUpe3ZhciBpLG4scj1lLl9tYXJrZXJzO2ZvcihpPXIubGVuZ3RoLTE7aT49MDtpLS0pbj1yW2ldLG4uX2ljb24mJihuLl9zZXRQb3ModCksbi5jbHVzdGVySGlkZSgpKX0sZnVuY3Rpb24oZSl7dmFyIGksbixyPWUuX2NoaWxkQ2x1c3RlcnM7Zm9yKGk9ci5sZW5ndGgtMTtpPj0wO2ktLSluPXJbaV0sbi5faWNvbiYmKG4uX3NldFBvcyh0KSxuLmNsdXN0ZXJIaWRlKCkpfSl9LF9yZWN1cnNpdmVseUFuaW1hdGVDaGlsZHJlbkluQW5kQWRkU2VsZlRvTWFwOmZ1bmN0aW9uKGUsdCxpLG4pe3RoaXMuX3JlY3Vyc2l2ZWx5KGUsbix0LGZ1bmN0aW9uKHIpe3IuX3JlY3Vyc2l2ZWx5QW5pbWF0ZUNoaWxkcmVuSW4oZSxyLl9ncm91cC5fbWFwLmxhdExuZ1RvTGF5ZXJQb2ludChyLmdldExhdExuZygpKS5yb3VuZCgpLGkpLHIuX2lzU2luZ2xlUGFyZW50KCkmJmktMT09PW4/KHIuY2x1c3RlclNob3coKSxyLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcChlLHQsaSkpOnIuY2x1c3RlckhpZGUoKSxyLl9hZGRUb01hcCgpfSl9LF9yZWN1cnNpdmVseUJlY29tZVZpc2libGU6ZnVuY3Rpb24oZSx0KXt0aGlzLl9yZWN1cnNpdmVseShlLHRoaXMuX2dyb3VwLl9tYXAuZ2V0TWluWm9vbSgpLHQsbnVsbCxmdW5jdGlvbihlKXtlLmNsdXN0ZXJTaG93KCl9KX0sX3JlY3Vyc2l2ZWx5QWRkQ2hpbGRyZW5Ub01hcDpmdW5jdGlvbihlLHQsaSl7dGhpcy5fcmVjdXJzaXZlbHkoaSx0aGlzLl9ncm91cC5fbWFwLmdldE1pblpvb20oKS0xLHQsZnVuY3Rpb24obil7aWYodCE9PW4uX3pvb20pZm9yKHZhciByPW4uX21hcmtlcnMubGVuZ3RoLTE7cj49MDtyLS0pe3ZhciBzPW4uX21hcmtlcnNbcl07aS5jb250YWlucyhzLl9sYXRsbmcpJiYoZSYmKHMuX2JhY2t1cExhdGxuZz1zLmdldExhdExuZygpLHMuc2V0TGF0TG5nKGUpLHMuY2x1c3RlckhpZGUmJnMuY2x1c3RlckhpZGUoKSksbi5fZ3JvdXAuX2ZlYXR1cmVHcm91cC5hZGRMYXllcihzKSl9fSxmdW5jdGlvbih0KXt0Ll9hZGRUb01hcChlKX0pfSxfcmVjdXJzaXZlbHlSZXN0b3JlQ2hpbGRQb3NpdGlvbnM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMuX21hcmtlcnMubGVuZ3RoLTE7dD49MDt0LS0pe3ZhciBpPXRoaXMuX21hcmtlcnNbdF07aS5fYmFja3VwTGF0bG5nJiYoaS5zZXRMYXRMbmcoaS5fYmFja3VwTGF0bG5nKSxkZWxldGUgaS5fYmFja3VwTGF0bG5nKX1pZihlLTE9PT10aGlzLl96b29tKWZvcih2YXIgbj10aGlzLl9jaGlsZENsdXN0ZXJzLmxlbmd0aC0xO24+PTA7bi0tKXRoaXMuX2NoaWxkQ2x1c3RlcnNbbl0uX3Jlc3RvcmVQb3NpdGlvbigpO2Vsc2UgZm9yKHZhciByPXRoaXMuX2NoaWxkQ2x1c3RlcnMubGVuZ3RoLTE7cj49MDtyLS0pdGhpcy5fY2hpbGRDbHVzdGVyc1tyXS5fcmVjdXJzaXZlbHlSZXN0b3JlQ2hpbGRQb3NpdGlvbnMoZSl9LF9yZXN0b3JlUG9zaXRpb246ZnVuY3Rpb24oKXt0aGlzLl9iYWNrdXBMYXRsbmcmJih0aGlzLnNldExhdExuZyh0aGlzLl9iYWNrdXBMYXRsbmcpLGRlbGV0ZSB0aGlzLl9iYWNrdXBMYXRsbmcpfSxfcmVjdXJzaXZlbHlSZW1vdmVDaGlsZHJlbkZyb21NYXA6ZnVuY3Rpb24oZSx0LGksbil7dmFyIHIsczt0aGlzLl9yZWN1cnNpdmVseShlLHQtMSxpLTEsZnVuY3Rpb24oZSl7Zm9yKHM9ZS5fbWFya2Vycy5sZW5ndGgtMTtzPj0wO3MtLSlyPWUuX21hcmtlcnNbc10sbiYmbi5jb250YWlucyhyLl9sYXRsbmcpfHwoZS5fZ3JvdXAuX2ZlYXR1cmVHcm91cC5yZW1vdmVMYXllcihyKSxyLmNsdXN0ZXJTaG93JiZyLmNsdXN0ZXJTaG93KCkpfSxmdW5jdGlvbihlKXtmb3Iocz1lLl9jaGlsZENsdXN0ZXJzLmxlbmd0aC0xO3M+PTA7cy0tKXI9ZS5fY2hpbGRDbHVzdGVyc1tzXSxuJiZuLmNvbnRhaW5zKHIuX2xhdGxuZyl8fChlLl9ncm91cC5fZmVhdHVyZUdyb3VwLnJlbW92ZUxheWVyKHIpLHIuY2x1c3RlclNob3cmJnIuY2x1c3RlclNob3coKSl9KX0sX3JlY3Vyc2l2ZWx5OmZ1bmN0aW9uKGUsdCxpLG4scil7dmFyIHMsbyxhPXRoaXMuX2NoaWxkQ2x1c3RlcnMsaD10aGlzLl96b29tO2lmKGg+PXQmJihuJiZuKHRoaXMpLHImJmg9PT1pJiZyKHRoaXMpKSx0Pmh8fGk+aClmb3Iocz1hLmxlbmd0aC0xO3M+PTA7cy0tKW89YVtzXSxlLmludGVyc2VjdHMoby5fYm91bmRzKSYmby5fcmVjdXJzaXZlbHkoZSx0LGksbixyKX0sX2lzU2luZ2xlUGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkQ2x1c3RlcnMubGVuZ3RoPjAmJnRoaXMuX2NoaWxkQ2x1c3RlcnNbMF0uX2NoaWxkQ291bnQ9PT10aGlzLl9jaGlsZENvdW50fX0pLEwuTWFya2VyLmluY2x1ZGUoe2NsdXN0ZXJIaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5vcGFjaXR5V2hlblVuY2x1c3RlcmVkPXRoaXMub3B0aW9ucy5vcGFjaXR5fHwxLHRoaXMuc2V0T3BhY2l0eSgwKX0sY2x1c3RlclNob3c6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNldE9wYWNpdHkodGhpcy5vcHRpb25zLm9wYWNpdHl8fHRoaXMub3B0aW9ucy5vcGFjaXR5V2hlblVuY2x1c3RlcmVkKTtyZXR1cm4gZGVsZXRlIHRoaXMub3B0aW9ucy5vcGFjaXR5V2hlblVuY2x1c3RlcmVkLGV9fSksTC5EaXN0YW5jZUdyaWQ9ZnVuY3Rpb24oZSl7dGhpcy5fY2VsbFNpemU9ZSx0aGlzLl9zcUNlbGxTaXplPWUqZSx0aGlzLl9ncmlkPXt9LHRoaXMuX29iamVjdFBvaW50PXt9fSxMLkRpc3RhbmNlR3JpZC5wcm90b3R5cGU9e2FkZE9iamVjdDpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuX2dldENvb3JkKHQueCksbj10aGlzLl9nZXRDb29yZCh0LnkpLHI9dGhpcy5fZ3JpZCxzPXJbbl09cltuXXx8e30sbz1zW2ldPXNbaV18fFtdLGE9TC5VdGlsLnN0YW1wKGUpO3RoaXMuX29iamVjdFBvaW50W2FdPXQsby5wdXNoKGUpfSx1cGRhdGVPYmplY3Q6ZnVuY3Rpb24oZSx0KXt0aGlzLnJlbW92ZU9iamVjdChlKSx0aGlzLmFkZE9iamVjdChlLHQpfSxyZW1vdmVPYmplY3Q6ZnVuY3Rpb24oZSx0KXt2YXIgaSxuLHI9dGhpcy5fZ2V0Q29vcmQodC54KSxzPXRoaXMuX2dldENvb3JkKHQueSksbz10aGlzLl9ncmlkLGE9b1tzXT1vW3NdfHx7fSxoPWFbcl09YVtyXXx8W107Zm9yKGRlbGV0ZSB0aGlzLl9vYmplY3RQb2ludFtMLlV0aWwuc3RhbXAoZSldLGk9MCxuPWgubGVuZ3RoO24+aTtpKyspaWYoaFtpXT09PWUpcmV0dXJuIGguc3BsaWNlKGksMSksMT09PW4mJmRlbGV0ZSBhW3JdLCEwfSxlYWNoT2JqZWN0OmZ1bmN0aW9uKGUsdCl7dmFyIGksbixyLHMsbyxhLGgsbD10aGlzLl9ncmlkO2ZvcihpIGluIGwpe289bFtpXTtmb3IobiBpbiBvKWZvcihhPW9bbl0scj0wLHM9YS5sZW5ndGg7cz5yO3IrKyloPWUuY2FsbCh0LGFbcl0pLGgmJihyLS0scy0tKX19LGdldE5lYXJPYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuLHIscyxvLGEsaCxsPXRoaXMuX2dldENvb3JkKGUueCksdT10aGlzLl9nZXRDb29yZChlLnkpLF89dGhpcy5fb2JqZWN0UG9pbnQsZD10aGlzLl9zcUNlbGxTaXplLGM9bnVsbDtmb3IodD11LTE7dSsxPj10O3QrKylpZihyPXRoaXMuX2dyaWRbdF0pZm9yKGk9bC0xO2wrMT49aTtpKyspaWYocz1yW2ldKWZvcihuPTAsbz1zLmxlbmd0aDtvPm47bisrKWE9c1tuXSxoPXRoaXMuX3NxRGlzdChfW0wuVXRpbC5zdGFtcChhKV0sZSksKGQ+aHx8ZD49aCYmbnVsbD09PWMpJiYoZD1oLGM9YSk7cmV0dXJuIGN9LF9nZXRDb29yZDpmdW5jdGlvbihlKXt2YXIgdD1NYXRoLmZsb29yKGUvdGhpcy5fY2VsbFNpemUpO3JldHVybiBpc0Zpbml0ZSh0KT90OmV9LF9zcURpc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgaT10LngtZS54LG49dC55LWUueTtyZXR1cm4gaSppK24qbn19LGZ1bmN0aW9uKCl7TC5RdWlja0h1bGw9e2dldERpc3RhbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgaT10WzFdLmxhdC10WzBdLmxhdCxuPXRbMF0ubG5nLXRbMV0ubG5nO3JldHVybiBuKihlLmxhdC10WzBdLmxhdCkraSooZS5sbmctdFswXS5sbmcpfSxmaW5kTW9zdERpc3RhbnRQb2ludEZyb21CYXNlTGluZTpmdW5jdGlvbihlLHQpe3ZhciBpLG4scixzPTAsbz1udWxsLGE9W107Zm9yKGk9dC5sZW5ndGgtMTtpPj0wO2ktLSluPXRbaV0scj10aGlzLmdldERpc3RhbnQobixlKSxyPjAmJihhLnB1c2gobikscj5zJiYocz1yLG89bikpO3JldHVybnttYXhQb2ludDpvLG5ld1BvaW50czphfX0sYnVpbGRDb252ZXhIdWxsOmZ1bmN0aW9uKGUsdCl7dmFyIGk9W10sbj10aGlzLmZpbmRNb3N0RGlzdGFudFBvaW50RnJvbUJhc2VMaW5lKGUsdCk7cmV0dXJuIG4ubWF4UG9pbnQ/KGk9aS5jb25jYXQodGhpcy5idWlsZENvbnZleEh1bGwoW2VbMF0sbi5tYXhQb2ludF0sbi5uZXdQb2ludHMpKSxpPWkuY29uY2F0KHRoaXMuYnVpbGRDb252ZXhIdWxsKFtuLm1heFBvaW50LGVbMV1dLG4ubmV3UG9pbnRzKSkpOltlWzBdXX0sZ2V0Q29udmV4SHVsbDpmdW5jdGlvbihlKXt2YXIgdCxpPSExLG49ITEscj0hMSxzPSExLG89bnVsbCxhPW51bGwsaD1udWxsLGw9bnVsbCx1PW51bGwsXz1udWxsO2Zvcih0PWUubGVuZ3RoLTE7dD49MDt0LS0pe3ZhciBkPWVbdF07KGk9PT0hMXx8ZC5sYXQ+aSkmJihvPWQsaT1kLmxhdCksKG49PT0hMXx8ZC5sYXQ8bikmJihhPWQsbj1kLmxhdCksKHI9PT0hMXx8ZC5sbmc+cikmJihoPWQscj1kLmxuZyksKHM9PT0hMXx8ZC5sbmc8cykmJihsPWQscz1kLmxuZyl9biE9PWk/KF89YSx1PW8pOihfPWwsdT1oKTt2YXIgYz1bXS5jb25jYXQodGhpcy5idWlsZENvbnZleEh1bGwoW18sdV0sZSksdGhpcy5idWlsZENvbnZleEh1bGwoW3UsX10sZSkpO3JldHVybiBjfX19KCksTC5NYXJrZXJDbHVzdGVyLmluY2x1ZGUoe2dldENvbnZleEh1bGw6ZnVuY3Rpb24oKXt2YXIgZSx0LGk9dGhpcy5nZXRBbGxDaGlsZE1hcmtlcnMoKSxuPVtdO2Zvcih0PWkubGVuZ3RoLTE7dD49MDt0LS0pZT1pW3RdLmdldExhdExuZygpLG4ucHVzaChlKTtyZXR1cm4gTC5RdWlja0h1bGwuZ2V0Q29udmV4SHVsbChuKX19KSxMLk1hcmtlckNsdXN0ZXIuaW5jbHVkZSh7XzJQSToyKk1hdGguUEksX2NpcmNsZUZvb3RTZXBhcmF0aW9uOjI1LF9jaXJjbGVTdGFydEFuZ2xlOk1hdGguUEkvNixfc3BpcmFsRm9vdFNlcGFyYXRpb246MjgsX3NwaXJhbExlbmd0aFN0YXJ0OjExLF9zcGlyYWxMZW5ndGhGYWN0b3I6NSxfY2lyY2xlU3BpcmFsU3dpdGNob3Zlcjo5LHNwaWRlcmZ5OmZ1bmN0aW9uKCl7aWYodGhpcy5fZ3JvdXAuX3NwaWRlcmZpZWQhPT10aGlzJiYhdGhpcy5fZ3JvdXAuX2luWm9vbUFuaW1hdGlvbil7dmFyIGUsdD10aGlzLmdldEFsbENoaWxkTWFya2VycygpLGk9dGhpcy5fZ3JvdXAsbj1pLl9tYXAscj1uLmxhdExuZ1RvTGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcpO3RoaXMuX2dyb3VwLl91bnNwaWRlcmZ5KCksdGhpcy5fZ3JvdXAuX3NwaWRlcmZpZWQ9dGhpcyx0Lmxlbmd0aD49dGhpcy5fY2lyY2xlU3BpcmFsU3dpdGNob3Zlcj9lPXRoaXMuX2dlbmVyYXRlUG9pbnRzU3BpcmFsKHQubGVuZ3RoLHIpOihyLnkrPTEwLGU9dGhpcy5fZ2VuZXJhdGVQb2ludHNDaXJjbGUodC5sZW5ndGgscikpLHRoaXMuX2FuaW1hdGlvblNwaWRlcmZ5KHQsZSl9fSx1bnNwaWRlcmZ5OmZ1bmN0aW9uKGUpe3RoaXMuX2dyb3VwLl9pblpvb21BbmltYXRpb258fCh0aGlzLl9hbmltYXRpb25VbnNwaWRlcmZ5KGUpLHRoaXMuX2dyb3VwLl9zcGlkZXJmaWVkPW51bGwpfSxfZ2VuZXJhdGVQb2ludHNDaXJjbGU6ZnVuY3Rpb24oZSx0KXt2YXIgaSxuLHI9dGhpcy5fZ3JvdXAub3B0aW9ucy5zcGlkZXJmeURpc3RhbmNlTXVsdGlwbGllcip0aGlzLl9jaXJjbGVGb290U2VwYXJhdGlvbiooMitlKSxzPXIvdGhpcy5fMlBJLG89dGhpcy5fMlBJL2UsYT1bXTtmb3IoYS5sZW5ndGg9ZSxpPWUtMTtpPj0wO2ktLSluPXRoaXMuX2NpcmNsZVN0YXJ0QW5nbGUraSpvLGFbaV09bmV3IEwuUG9pbnQodC54K3MqTWF0aC5jb3MobiksdC55K3MqTWF0aC5zaW4obikpLl9yb3VuZCgpO3JldHVybiBhfSxfZ2VuZXJhdGVQb2ludHNTcGlyYWw6ZnVuY3Rpb24oZSx0KXt2YXIgaSxuPXRoaXMuX2dyb3VwLm9wdGlvbnMuc3BpZGVyZnlEaXN0YW5jZU11bHRpcGxpZXIscj1uKnRoaXMuX3NwaXJhbExlbmd0aFN0YXJ0LHM9bip0aGlzLl9zcGlyYWxGb290U2VwYXJhdGlvbixvPW4qdGhpcy5fc3BpcmFsTGVuZ3RoRmFjdG9yKnRoaXMuXzJQSSxhPTAsaD1bXTtmb3IoaC5sZW5ndGg9ZSxpPWUtMTtpPj0wO2ktLSlhKz1zL3IrNWUtNCppLGhbaV09bmV3IEwuUG9pbnQodC54K3IqTWF0aC5jb3MoYSksdC55K3IqTWF0aC5zaW4oYSkpLl9yb3VuZCgpLHIrPW8vYTtyZXR1cm4gaH0sX25vYW5pbWF0aW9uVW5zcGlkZXJmeTpmdW5jdGlvbigpe3ZhciBlLHQsaT10aGlzLl9ncm91cCxuPWkuX21hcCxyPWkuX2ZlYXR1cmVHcm91cCxzPXRoaXMuZ2V0QWxsQ2hpbGRNYXJrZXJzKCk7Zm9yKGkuX2lnbm9yZU1vdmU9ITAsdGhpcy5zZXRPcGFjaXR5KDEpLHQ9cy5sZW5ndGgtMTt0Pj0wO3QtLSllPXNbdF0sci5yZW1vdmVMYXllcihlKSxlLl9wcmVTcGlkZXJmeUxhdGxuZyYmKGUuc2V0TGF0TG5nKGUuX3ByZVNwaWRlcmZ5TGF0bG5nKSxkZWxldGUgZS5fcHJlU3BpZGVyZnlMYXRsbmcpLGUuc2V0WkluZGV4T2Zmc2V0JiZlLnNldFpJbmRleE9mZnNldCgwKSxlLl9zcGlkZXJMZWcmJihuLnJlbW92ZUxheWVyKGUuX3NwaWRlckxlZyksZGVsZXRlIGUuX3NwaWRlckxlZyk7aS5maXJlKCJ1bnNwaWRlcmZpZWQiLHtjbHVzdGVyOnRoaXMsbWFya2VyczpzfSksaS5faWdub3JlTW92ZT0hMSxpLl9zcGlkZXJmaWVkPW51bGx9fSksTC5NYXJrZXJDbHVzdGVyTm9uQW5pbWF0ZWQ9TC5NYXJrZXJDbHVzdGVyLmV4dGVuZCh7X2FuaW1hdGlvblNwaWRlcmZ5OmZ1bmN0aW9uKGUsdCl7dmFyIGksbixyLHMsbz10aGlzLl9ncm91cCxhPW8uX21hcCxoPW8uX2ZlYXR1cmVHcm91cCxsPXRoaXMuX2dyb3VwLm9wdGlvbnMuc3BpZGVyTGVnUG9seWxpbmVPcHRpb25zO2ZvcihvLl9pZ25vcmVNb3ZlPSEwLGk9MDtpPGUubGVuZ3RoO2krKylzPWEubGF5ZXJQb2ludFRvTGF0TG5nKHRbaV0pLG49ZVtpXSxyPW5ldyBMLlBvbHlsaW5lKFt0aGlzLl9sYXRsbmcsc10sbCksYS5hZGRMYXllcihyKSxuLl9zcGlkZXJMZWc9cixuLl9wcmVTcGlkZXJmeUxhdGxuZz1uLl9sYXRsbmcsbi5zZXRMYXRMbmcocyksbi5zZXRaSW5kZXhPZmZzZXQmJm4uc2V0WkluZGV4T2Zmc2V0KDFlNiksaC5hZGRMYXllcihuKTt0aGlzLnNldE9wYWNpdHkoLjMpLG8uX2lnbm9yZU1vdmU9ITEsby5maXJlKCJzcGlkZXJmaWVkIix7Y2x1c3Rlcjp0aGlzLG1hcmtlcnM6ZX0pfSxfYW5pbWF0aW9uVW5zcGlkZXJmeTpmdW5jdGlvbigpe3RoaXMuX25vYW5pbWF0aW9uVW5zcGlkZXJmeSgpfX0pLEwuTWFya2VyQ2x1c3Rlci5pbmNsdWRlKHtfYW5pbWF0aW9uU3BpZGVyZnk6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLHMsbyxhLGgsbD10aGlzLHU9dGhpcy5fZ3JvdXAsXz11Ll9tYXAsZD11Ll9mZWF0dXJlR3JvdXAsYz10aGlzLl9sYXRsbmcscD1fLmxhdExuZ1RvTGF5ZXJQb2ludChjKSxmPUwuUGF0aC5TVkcsbT1MLmV4dGVuZCh7fSx0aGlzLl9ncm91cC5vcHRpb25zLnNwaWRlckxlZ1BvbHlsaW5lT3B0aW9ucyksZz1tLm9wYWNpdHk7Zm9yKGc9PT1pJiYoZz1MLk1hcmtlckNsdXN0ZXJHcm91cC5wcm90b3R5cGUub3B0aW9ucy5zcGlkZXJMZWdQb2x5bGluZU9wdGlvbnMub3BhY2l0eSksZj8obS5vcGFjaXR5PTAsbS5jbGFzc05hbWU9KG0uY2xhc3NOYW1lfHwiIikrIiBsZWFmbGV0LWNsdXN0ZXItc3BpZGVyLWxlZyIpOm0ub3BhY2l0eT1nLHUuX2lnbm9yZU1vdmU9ITAsbj0wO248ZS5sZW5ndGg7bisrKXI9ZVtuXSxoPV8ubGF5ZXJQb2ludFRvTGF0TG5nKHRbbl0pLHM9bmV3IEwuUG9seWxpbmUoW2MsaF0sbSksXy5hZGRMYXllcihzKSxyLl9zcGlkZXJMZWc9cyxmJiYobz1zLl9wYXRoLGE9by5nZXRUb3RhbExlbmd0aCgpKy4xLG8uc3R5bGUuc3Ryb2tlRGFzaGFycmF5PWEsby5zdHlsZS5zdHJva2VEYXNob2Zmc2V0PWEpLHIuc2V0WkluZGV4T2Zmc2V0JiZyLnNldFpJbmRleE9mZnNldCgxZTYpLHIuY2x1c3RlckhpZGUmJnIuY2x1c3RlckhpZGUoKSxkLmFkZExheWVyKHIpLHIuX3NldFBvcyYmci5fc2V0UG9zKHApO2Zvcih1Ll9mb3JjZUxheW91dCgpLHUuX2FuaW1hdGlvblN0YXJ0KCksbj1lLmxlbmd0aC0xO24+PTA7bi0tKWg9Xy5sYXllclBvaW50VG9MYXRMbmcodFtuXSkscj1lW25dLHIuX3ByZVNwaWRlcmZ5TGF0bG5nPXIuX2xhdGxuZyxyLnNldExhdExuZyhoKSxyLmNsdXN0ZXJTaG93JiZyLmNsdXN0ZXJTaG93KCksZiYmKHM9ci5fc3BpZGVyTGVnLG89cy5fcGF0aCxvLnN0eWxlLnN0cm9rZURhc2hvZmZzZXQ9MCxzLnNldFN0eWxlKHtvcGFjaXR5Omd9KSk7dGhpcy5zZXRPcGFjaXR5KC4zKSx1Ll9pZ25vcmVNb3ZlPSExLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt1Ll9hbmltYXRpb25FbmQoKSx1LmZpcmUoInNwaWRlcmZpZWQiLHtjbHVzdGVyOmwsbWFya2VyczplfSl9LDIwMCl9LF9hbmltYXRpb25VbnNwaWRlcmZ5OmZ1bmN0aW9uKGUpe3ZhciB0LGksbixyLHMsbyxhPXRoaXMsaD10aGlzLl9ncm91cCxsPWguX21hcCx1PWguX2ZlYXR1cmVHcm91cCxfPWU/bC5fbGF0TG5nVG9OZXdMYXllclBvaW50KHRoaXMuX2xhdGxuZyxlLnpvb20sZS5jZW50ZXIpOmwubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyksZD10aGlzLmdldEFsbENoaWxkTWFya2VycygpLGM9TC5QYXRoLlNWRztmb3IoaC5faWdub3JlTW92ZT0hMCxoLl9hbmltYXRpb25TdGFydCgpLHRoaXMuc2V0T3BhY2l0eSgxKSxpPWQubGVuZ3RoLTE7aT49MDtpLS0pdD1kW2ldLHQuX3ByZVNwaWRlcmZ5TGF0bG5nJiYodC5jbG9zZVBvcHVwKCksdC5zZXRMYXRMbmcodC5fcHJlU3BpZGVyZnlMYXRsbmcpLGRlbGV0ZSB0Ll9wcmVTcGlkZXJmeUxhdGxuZyxvPSEwLHQuX3NldFBvcyYmKHQuX3NldFBvcyhfKSxvPSExKSx0LmNsdXN0ZXJIaWRlJiYodC5jbHVzdGVySGlkZSgpLG89ITEpLG8mJnUucmVtb3ZlTGF5ZXIodCksYyYmKG49dC5fc3BpZGVyTGVnLHI9bi5fcGF0aCxzPXIuZ2V0VG90YWxMZW5ndGgoKSsuMSxyLnN0eWxlLnN0cm9rZURhc2hvZmZzZXQ9cyxuLnNldFN0eWxlKHtvcGFjaXR5OjB9KSkpO2guX2lnbm9yZU1vdmU9ITEsc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBlPTA7Zm9yKGk9ZC5sZW5ndGgtMTtpPj0wO2ktLSl0PWRbaV0sdC5fc3BpZGVyTGVnJiZlKys7Zm9yKGk9ZC5sZW5ndGgtMTtpPj0wO2ktLSl0PWRbaV0sdC5fc3BpZGVyTGVnJiYodC5jbHVzdGVyU2hvdyYmdC5jbHVzdGVyU2hvdygpLHQuc2V0WkluZGV4T2Zmc2V0JiZ0LnNldFpJbmRleE9mZnNldCgwKSxlPjEmJnUucmVtb3ZlTGF5ZXIodCksbC5yZW1vdmVMYXllcih0Ll9zcGlkZXJMZWcpLGRlbGV0ZSB0Ll9zcGlkZXJMZWcpO2guX2FuaW1hdGlvbkVuZCgpLGguZmlyZSgidW5zcGlkZXJmaWVkIix7Y2x1c3RlcjphLG1hcmtlcnM6ZH0pfSwyMDApfX0pLEwuTWFya2VyQ2x1c3Rlckdyb3VwLmluY2x1ZGUoe19zcGlkZXJmaWVkOm51bGwsdW5zcGlkZXJmeTpmdW5jdGlvbigpe3RoaXMuX3Vuc3BpZGVyZnkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfc3BpZGVyZmllck9uQWRkOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLm9uKCJjbGljayIsdGhpcy5fdW5zcGlkZXJmeVdyYXBwZXIsdGhpcyksdGhpcy5fbWFwLm9wdGlvbnMuem9vbUFuaW1hdGlvbiYmdGhpcy5fbWFwLm9uKCJ6b29tc3RhcnQiLHRoaXMuX3Vuc3BpZGVyZnlab29tU3RhcnQsdGhpcyksdGhpcy5fbWFwLm9uKCJ6b29tZW5kIix0aGlzLl9ub2FuaW1hdGlvblVuc3BpZGVyZnksdGhpcyksTC5Ccm93c2VyLnRvdWNofHx0aGlzLl9tYXAuZ2V0UmVuZGVyZXIodGhpcyl9LF9zcGlkZXJmaWVyT25SZW1vdmU6ZnVuY3Rpb24oKXt0aGlzLl9tYXAub2ZmKCJjbGljayIsdGhpcy5fdW5zcGlkZXJmeVdyYXBwZXIsdGhpcyksdGhpcy5fbWFwLm9mZigiem9vbXN0YXJ0Iix0aGlzLl91bnNwaWRlcmZ5Wm9vbVN0YXJ0LHRoaXMpLHRoaXMuX21hcC5vZmYoInpvb21hbmltIix0aGlzLl91bnNwaWRlcmZ5Wm9vbUFuaW0sdGhpcyksdGhpcy5fbWFwLm9mZigiem9vbWVuZCIsdGhpcy5fbm9hbmltYXRpb25VbnNwaWRlcmZ5LHRoaXMpLHRoaXMuX25vYW5pbWF0aW9uVW5zcGlkZXJmeSgpfSxfdW5zcGlkZXJmeVpvb21TdGFydDpmdW5jdGlvbigpe3RoaXMuX21hcCYmdGhpcy5fbWFwLm9uKCJ6b29tYW5pbSIsdGhpcy5fdW5zcGlkZXJmeVpvb21BbmltLHRoaXMpfSxfdW5zcGlkZXJmeVpvb21BbmltOmZ1bmN0aW9uKGUpe0wuRG9tVXRpbC5oYXNDbGFzcyh0aGlzLl9tYXAuX21hcFBhbmUsImxlYWZsZXQtdG91Y2hpbmciKXx8KHRoaXMuX21hcC5vZmYoInpvb21hbmltIix0aGlzLl91bnNwaWRlcmZ5Wm9vbUFuaW0sdGhpcyksdGhpcy5fdW5zcGlkZXJmeShlKSl9LF91bnNwaWRlcmZ5V3JhcHBlcjpmdW5jdGlvbigpe3RoaXMuX3Vuc3BpZGVyZnkoKQp9LF91bnNwaWRlcmZ5OmZ1bmN0aW9uKGUpe3RoaXMuX3NwaWRlcmZpZWQmJnRoaXMuX3NwaWRlcmZpZWQudW5zcGlkZXJmeShlKX0sX25vYW5pbWF0aW9uVW5zcGlkZXJmeTpmdW5jdGlvbigpe3RoaXMuX3NwaWRlcmZpZWQmJnRoaXMuX3NwaWRlcmZpZWQuX25vYW5pbWF0aW9uVW5zcGlkZXJmeSgpfSxfdW5zcGlkZXJmeUxheWVyOmZ1bmN0aW9uKGUpe2UuX3NwaWRlckxlZyYmKHRoaXMuX2ZlYXR1cmVHcm91cC5yZW1vdmVMYXllcihlKSxlLmNsdXN0ZXJTaG93JiZlLmNsdXN0ZXJTaG93KCksZS5zZXRaSW5kZXhPZmZzZXQmJmUuc2V0WkluZGV4T2Zmc2V0KDApLHRoaXMuX21hcC5yZW1vdmVMYXllcihlLl9zcGlkZXJMZWcpLGRlbGV0ZSBlLl9zcGlkZXJMZWcpfX0pLEwuTWFya2VyQ2x1c3Rlckdyb3VwLmluY2x1ZGUoe3JlZnJlc2hDbHVzdGVyczpmdW5jdGlvbihlKXtyZXR1cm4gZT9lIGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyR3JvdXA/ZT1lLl90b3BDbHVzdGVyTGV2ZWwuZ2V0QWxsQ2hpbGRNYXJrZXJzKCk6ZSBpbnN0YW5jZW9mIEwuTGF5ZXJHcm91cD9lPWUuX2xheWVyczplIGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyP2U9ZS5nZXRBbGxDaGlsZE1hcmtlcnMoKTplIGluc3RhbmNlb2YgTC5NYXJrZXImJihlPVtlXSk6ZT10aGlzLl90b3BDbHVzdGVyTGV2ZWwuZ2V0QWxsQ2hpbGRNYXJrZXJzKCksdGhpcy5fZmxhZ1BhcmVudHNJY29uc05lZWRVcGRhdGUoZSksdGhpcy5fcmVmcmVzaENsdXN0ZXJzSWNvbnMoKSx0aGlzLm9wdGlvbnMuc2luZ2xlTWFya2VyTW9kZSYmdGhpcy5fcmVmcmVzaFNpbmdsZU1hcmtlck1vZGVNYXJrZXJzKGUpLHRoaXN9LF9mbGFnUGFyZW50c0ljb25zTmVlZFVwZGF0ZTpmdW5jdGlvbihlKXt2YXIgdCxpO2Zvcih0IGluIGUpZm9yKGk9ZVt0XS5fX3BhcmVudDtpOylpLl9pY29uTmVlZHNVcGRhdGU9ITAsaT1pLl9fcGFyZW50fSxfcmVmcmVzaFNpbmdsZU1hcmtlck1vZGVNYXJrZXJzOmZ1bmN0aW9uKGUpe3ZhciB0LGk7Zm9yKHQgaW4gZSlpPWVbdF0sdGhpcy5oYXNMYXllcihpKSYmaS5zZXRJY29uKHRoaXMuX292ZXJyaWRlTWFya2VySWNvbihpKSl9fSksTC5NYXJrZXIuaW5jbHVkZSh7cmVmcmVzaEljb25PcHRpb25zOmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5vcHRpb25zLmljb247cmV0dXJuIEwuc2V0T3B0aW9ucyhpLGUpLHRoaXMuc2V0SWNvbihpKSx0JiZ0aGlzLl9fcGFyZW50JiZ0aGlzLl9fcGFyZW50Ll9ncm91cC5yZWZyZXNoQ2x1c3RlcnModGhpcyksdGhpc319KX0od2luZG93LGRvY3VtZW50KTs="></script>
<script src="data:application/javascript;base64,LyohCiBMZWFmbGV0Lk1hcmtlckNsdXN0ZXIuRnJlZXphYmxlIDEuMC4wKzlkYjgwYTMKIChjKSAyMDE1LTIwMTYgQm9yaXMgU2VhbmcKIExpY2Vuc2UgTUlUCiAqLwohZnVuY3Rpb24oZSxpKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImxlYWZsZXQiXSxpKTppKCJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9yZXF1aXJlKCJsZWFmbGV0Iik6ZS5MKX0odGhpcyxmdW5jdGlvbihlLGkpe2UuTWFya2VyQ2x1c3Rlckdyb3VwLmluY2x1ZGUoe19vcmlnaW5hbE9uQWRkRnJlZXphYmxlOmUuTWFya2VyQ2x1c3Rlckdyb3VwLnByb3RvdHlwZS5vbkFkZCxvbkFkZDpmdW5jdGlvbihlKXt2YXIgaT10aGlzLl96b29tO3RoaXMuX29yaWdpbmFsT25BZGRGcmVlemFibGUoZSksdGhpcy5fZnJvemVuJiYoaT49MCYmaSE9PXRoaXMuX3pvb20mJih0aGlzLl9mZWF0dXJlR3JvdXAuY2xlYXJMYXllcnMoKSx0aGlzLl96b29tPWksdGhpcy5hZGRMYXllcnMoW10pKSxlLm9mZigiem9vbWVuZCIsdGhpcy5fem9vbUVuZCx0aGlzKSxlLm9mZigibW92ZWVuZCIsdGhpcy5fbW92ZUVuZCx0aGlzKSxlLm9uKCJ6b29tZW5kIG1vdmVlbmQiLHRoaXMuX3ZpZXdDaGFuZ2VFbmROb3RDbHVzdGVyaW5nLHRoaXMpKX0sX29yaWdpbmFsT25SZW1vdmU6ZS5NYXJrZXJDbHVzdGVyR3JvdXAucHJvdG90eXBlLm9uUmVtb3ZlLG9uUmVtb3ZlOmZ1bmN0aW9uKGUpe2Uub2ZmKCJ6b29tZW5kIG1vdmVlbmQiLHRoaXMuX3ZpZXdDaGFuZ2VFbmROb3RDbHVzdGVyaW5nLHRoaXMpLHRoaXMuX29yaWdpbmFsT25SZW1vdmUoZSl9LGRpc2FibGVDbHVzdGVyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZnJlZXplQXRab29tKHRoaXMuX21heFpvb20rMSl9LGRpc2FibGVDbHVzdGVyaW5nS2VlcFNwaWRlcmZ5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZnJlZXplQXRab29tKHRoaXMuX21heFpvb20pfSxlbmFibGVDbHVzdGVyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5mcmVlemUoKX0sdW5mcmVlemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mcmVlemVBdFpvb20oITEpfSxmcmVlemVBdFpvb206ZnVuY3Rpb24oZSl7dGhpcy5fcHJvY2Vzc1F1ZXVlKCk7dmFyIG89dGhpcy5fbWFwO2U9PT1pfHxlPT09ITB8fGUhPT1lP2U9bz9NYXRoLnJvdW5kKG8uZ2V0Wm9vbSgpKTotMToibWF4Ij09PWU/ZT10aGlzLl9tYXhab29tKzE6Im1heEtlZXBTcGlkZXJmeSI9PT1lJiYoZT10aGlzLl9tYXhab29tKTt2YXIgdD0ibnVtYmVyIj09dHlwZW9mIGU7aWYodGhpcy5fZnJvemVuKXtpZighdClyZXR1cm4gdGhpcy5fdW5mcmVlemUoKSx0aGlzfWVsc2V7aWYoIXQpcmV0dXJuIHRoaXM7dGhpcy5faW5pdGlhdGVGcmVlemUoKX1yZXR1cm4gdGhpcy5fYXJ0aWZpY2lhbFpvb21TYWZlKHRoaXMuX3pvb20sZSksdGhpc30sX2luaXRpYXRlRnJlZXplOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fbWFwO3RoaXMuX2Zyb3plbj0hMCxlJiYoZS5vZmYoInpvb21lbmQiLHRoaXMuX3pvb21FbmQsdGhpcyksZS5vZmYoIm1vdmVlbmQiLHRoaXMuX21vdmVFbmQsdGhpcyksZS5vbigiem9vbWVuZCBtb3ZlZW5kIix0aGlzLl92aWV3Q2hhbmdlRW5kTm90Q2x1c3RlcmluZyx0aGlzKSl9LF91bmZyZWV6ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX21hcDt0aGlzLl9mcm96ZW49ITEsZSYmKGUub2ZmKCJ6b29tZW5kIG1vdmVlbmQiLHRoaXMuX3ZpZXdDaGFuZ2VFbmROb3RDbHVzdGVyaW5nLHRoaXMpLGUub24oInpvb21lbmQiLHRoaXMuX3pvb21FbmQsdGhpcyksZS5vbigibW92ZWVuZCIsdGhpcy5fbW92ZUVuZCx0aGlzKSx0aGlzLl9leGVjdXRlQWZ0ZXJVbnNwaWRlcmZ5KGZ1bmN0aW9uKCl7dGhpcy5fem9vbUVuZCgpfSx0aGlzKSl9LF9leGVjdXRlQWZ0ZXJVbnNwaWRlcmZ5OmZ1bmN0aW9uKGUsaSl7cmV0dXJuIHRoaXMuX3Vuc3BpZGVyZnkmJnRoaXMuX3NwaWRlcmZpZWQ/KHRoaXMub25jZSgiYW5pbWF0aW9uZW5kIixmdW5jdGlvbigpe2UuY2FsbChpKX0pLHZvaWQgdGhpcy5fdW5zcGlkZXJmeSgpKTp2b2lkIGUuY2FsbChpKX0sX2FydGlmaWNpYWxab29tU2FmZTpmdW5jdGlvbihlLGkpe3RoaXMuX3pvb209aSx0aGlzLl9tYXAmJmUhPT1pJiZ0aGlzLl9leGVjdXRlQWZ0ZXJVbnNwaWRlcmZ5KGZ1bmN0aW9uKCl7dGhpcy5fYXJ0aWZpY2lhbFpvb20oZSxpKX0sdGhpcyl9LF9hcnRpZmljaWFsWm9vbTpmdW5jdGlvbihlLGkpe2U8aT8odGhpcy5fYW5pbWF0aW9uU3RhcnQoKSx0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5UmVtb3ZlQ2hpbGRyZW5Gcm9tTWFwKHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcyx0aGlzLl9tYXAuZ2V0TWluWm9vbSgpLGUsdGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCkpLHRoaXMuX2FuaW1hdGlvblpvb21JbihlLGkpKTplPmkmJih0aGlzLl9hbmltYXRpb25TdGFydCgpLHRoaXMuX2FuaW1hdGlvblpvb21PdXQoZSxpKSl9LF92aWV3Q2hhbmdlRW5kTm90Q2x1c3RlcmluZzpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2ZlYXR1cmVHcm91cCxpPXRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpLG89dGhpcy5fem9vbTtlLmVhY2hMYXllcihmdW5jdGlvbih0KXshaS5jb250YWlucyh0Ll9sYXRsbmcpJiZ0Ll9fcGFyZW50JiZ0Ll9fcGFyZW50Ll96b29tPG8mJmUucmVtb3ZlTGF5ZXIodCl9KSx0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5KGksLTEsbyxmdW5jdGlvbih0KXtpZih0Ll96b29tIT09bylmb3IodmFyIG4scj10Ll9tYXJrZXJzLHM9MDtzPHIubGVuZ3RoO3MrKyluPXQuX21hcmtlcnNbc10saS5jb250YWlucyhuLl9sYXRsbmcpJiZlLmFkZExheWVyKG4pfSxmdW5jdGlvbihlKXtlLl9hZGRUb01hcCgpfSksdGhpcy5fY3VycmVudFNob3duQm91bmRzPWl9LF9vcmlnaW5hbFpvb21PclNwaWRlcmZ5OmUuTWFya2VyQ2x1c3Rlckdyb3VwLnByb3RvdHlwZS5fem9vbU9yU3BpZGVyZnksX3pvb21PclNwaWRlcmZ5OmZ1bmN0aW9uKGUpe3RoaXMuX2Zyb3plbiYmdGhpcy5vcHRpb25zLnNwaWRlcmZ5T25NYXhab29tPyhlLmxheWVyLnNwaWRlcmZ5KCksZS5vcmlnaW5hbEV2ZW50JiYxMz09PWUub3JpZ2luYWxFdmVudC5rZXlDb2RlJiZtYXAuX2NvbnRhaW5lci5mb2N1cygpKTp0aGlzLl9vcmlnaW5hbFpvb21PclNwaWRlcmZ5KGUpfX0pfSk7"></script>
<script src="data:application/javascript;base64,LyohCiBMZWFmbGV0Lk1hcmtlckNsdXN0ZXIuTGF5ZXJTdXBwb3J0IDEuMC41Kzg3ZjM4NDgKIChjKSAyMDE1LTIwMTcgQm9yaXMgU2VhbmcKIExpY2Vuc2UgTUlUCiAqLwohZnVuY3Rpb24oZSxyKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImxlYWZsZXQiXSxyKTpyKCJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9yZXF1aXJlKCJsZWFmbGV0Iik6ZS5MKX0odGhpcyxmdW5jdGlvbihlLHIpe2UuTWFya2VyQ2x1c3Rlckdyb3VwLkxheWVyU3VwcG9ydD1lLk1hcmtlckNsdXN0ZXJHcm91cC5leHRlbmQoe29wdGlvbnM6e3NpbmdsZUFkZFJlbW92ZUJ1ZmZlckR1cmF0aW9uOjEwMH0saW5pdGlhbGl6ZTpmdW5jdGlvbihyKXtlLk1hcmtlckNsdXN0ZXJHcm91cC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsciksdGhpcy5fZmVhdHVyZUdyb3VwPW5ldyBvLHRoaXMuX2ZlYXR1cmVHcm91cC5hZGRFdmVudFBhcmVudCh0aGlzKSx0aGlzLl9ub25Qb2ludEdyb3VwPW5ldyBvLHRoaXMuX25vblBvaW50R3JvdXAuYWRkRXZlbnRQYXJlbnQodGhpcyksdGhpcy5fbGF5ZXJzPXt9LHRoaXMuX3Byb3h5TGF5ZXJHcm91cHM9e30sdGhpcy5fcHJveHlMYXllckdyb3Vwc05lZWRSZW1vdmluZz17fSx0aGlzLl9zaW5nbGVBZGRSZW1vdmVCdWZmZXI9W119LGNoZWNrSW46ZnVuY3Rpb24oZSl7dmFyIHI9dGhpcy5fdG9BcnJheShlKTtyZXR1cm4gdGhpcy5fY2hlY2tJbkdldFNlcGFyYXRlZChyKSx0aGlzfSxjaGVja091dDpmdW5jdGlvbihyKXt2YXIgbyx0LGk9dGhpcy5fdG9BcnJheShyKSxhPXRoaXMuX3NlcGFyYXRlU2luZ2xlRnJvbUdyb3VwTGF5ZXJzKGkse2dyb3VwczpbXSxzaW5nbGVzOltdfSkscz1hLmdyb3VwcyxuPWEuc2luZ2xlcztmb3Iobz0wO288bi5sZW5ndGg7bysrKXQ9bltvXSxkZWxldGUgdGhpcy5fbGF5ZXJzW2Uuc3RhbXAodCldLGRlbGV0ZSB0Ll9tY2dMYXllclN1cHBvcnRHcm91cDtmb3IodGhpcy5fb3JpZ2luYWxSZW1vdmVMYXllcnMobiksbz0wO288cy5sZW5ndGg7bysrKXQ9c1tvXSx0aGlzLl9kaXNtaXNzUHJveHlMYXllckdyb3VwKHQpO3JldHVybiB0aGlzfSxhZGRMYXllcnM6ZnVuY3Rpb24ocil7dmFyIG8sdCxpLGE9dGhpcy5fdG9BcnJheShyKSxzPXRoaXMuX2NoZWNrSW5HZXRTZXBhcmF0ZWQoYSksbj1zLmdyb3Vwcztmb3IodGhpcy5fb3JpZ2luYWxBZGRMYXllcnMocy5zaW5nbGVzKSxvPTA7bzxuLmxlbmd0aDtvKyspdD1uW29dLGk9ZS5zdGFtcCh0KSx0aGlzLl9wcm94eUxheWVyR3JvdXBzW2ldPXQsZGVsZXRlIHRoaXMuX3Byb3h5TGF5ZXJHcm91cHNOZWVkUmVtb3ZpbmdbaV0sdGhpcy5fbWFwJiZ0aGlzLl9tYXAuX29yaWdpbmFsQWRkTGF5ZXIodCl9LGFkZExheWVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9idWZmZXJTaW5nbGVBZGRSZW1vdmUoZSwiYWRkTGF5ZXJzIiksdGhpc30sX29yaWdpbmFsQWRkTGF5ZXI6ZS5NYXJrZXJDbHVzdGVyR3JvdXAucHJvdG90eXBlLmFkZExheWVyLF9vcmlnaW5hbEFkZExheWVyczplLk1hcmtlckNsdXN0ZXJHcm91cC5wcm90b3R5cGUuYWRkTGF5ZXJzLHJlbW92ZUxheWVyczpmdW5jdGlvbihyKXt2YXIgbyx0LGk9dGhpcy5fdG9BcnJheShyKSxhPXRoaXMuX3NlcGFyYXRlU2luZ2xlRnJvbUdyb3VwTGF5ZXJzKGkse2dyb3VwczpbXSxzaW5nbGVzOltdfSkscz1hLmdyb3VwcyxuPWEuc2luZ2xlcyxwPTA7Zm9yKHRoaXMuX29yaWdpbmFsUmVtb3ZlTGF5ZXJzKG4pO3A8cy5sZW5ndGg7cCsrKW89c1twXSx0PWUuc3RhbXAobyksZGVsZXRlIHRoaXMuX3Byb3h5TGF5ZXJHcm91cHNbdF0sdGhpcy5fbWFwP3RoaXMuX21hcC5fb3JpZ2luYWxSZW1vdmVMYXllcihvKTp0aGlzLl9wcm94eUxheWVyR3JvdXBzTmVlZFJlbW92aW5nW3RdPW87cmV0dXJuIHRoaXN9LHJlbW92ZUxheWVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9idWZmZXJTaW5nbGVBZGRSZW1vdmUoZSwicmVtb3ZlTGF5ZXJzIiksdGhpc30sX29yaWdpbmFsUmVtb3ZlTGF5ZXI6ZS5NYXJrZXJDbHVzdGVyR3JvdXAucHJvdG90eXBlLnJlbW92ZUxheWVyLF9vcmlnaW5hbFJlbW92ZUxheWVyczplLk1hcmtlckNsdXN0ZXJHcm91cC5wcm90b3R5cGUucmVtb3ZlTGF5ZXJzLG9uQWRkOmZ1bmN0aW9uKHIpe3IuX29yaWdpbmFsQWRkTGF5ZXI9ci5fb3JpZ2luYWxBZGRMYXllcnx8ci5hZGRMYXllcixyLl9vcmlnaW5hbFJlbW92ZUxheWVyPXIuX29yaWdpbmFsUmVtb3ZlTGF5ZXJ8fHIucmVtb3ZlTGF5ZXIsZS5leHRlbmQocixpKTt2YXIgbyx0LGEscz10aGlzLl9yZW1vdmVQcmVBZGRlZExheWVycyhyKTt0aGlzLl9vcmlnaW5hbE9uQWRkLmNhbGwodGhpcyxyKTtmb3IobyBpbiB0aGlzLl9wcm94eUxheWVyR3JvdXBzKXQ9dGhpcy5fcHJveHlMYXllckdyb3Vwc1tvXSxyLl9vcmlnaW5hbEFkZExheWVyKHQpO2ZvcihvIGluIHRoaXMuX3Byb3h5TGF5ZXJHcm91cHNOZWVkUmVtb3ZpbmcpdD10aGlzLl9wcm94eUxheWVyR3JvdXBzTmVlZFJlbW92aW5nW29dLHIuX29yaWdpbmFsUmVtb3ZlTGF5ZXIodCksZGVsZXRlIHRoaXMuX3Byb3h5TGF5ZXJHcm91cHNOZWVkUmVtb3Zpbmdbb107Zm9yKGE9MDthPHMubGVuZ3RoO2ErKylyLmFkZExheWVyKHNbYV0pfSxfb3JpZ2luYWxPbkFkZDplLk1hcmtlckNsdXN0ZXJHcm91cC5wcm90b3R5cGUub25BZGQsX2J1ZmZlclNpbmdsZUFkZFJlbW92ZTpmdW5jdGlvbihyLG8pe3ZhciB0LGk9dGhpcy5vcHRpb25zLnNpbmdsZUFkZFJlbW92ZUJ1ZmZlckR1cmF0aW9uO2k+MD8odGhpcy5fc2luZ2xlQWRkUmVtb3ZlQnVmZmVyLnB1c2goe3R5cGU6byxsYXllcjpyfSksdGhpcy5fc2luZ2xlQWRkUmVtb3ZlQnVmZmVyVGltZW91dHx8KHQ9ZS5iaW5kKHRoaXMuX3Byb2Nlc3NTaW5nbGVBZGRSZW1vdmVCdWZmZXIsdGhpcyksdGhpcy5fc2luZ2xlQWRkUmVtb3ZlQnVmZmVyVGltZW91dD1zZXRUaW1lb3V0KHQsaSkpKTp0aGlzW29dKHIpfSxfcHJvY2Vzc1NpbmdsZUFkZFJlbW92ZUJ1ZmZlcjpmdW5jdGlvbigpe2Zvcih2YXIgZSxyLG89dGhpcy5fc2luZ2xlQWRkUmVtb3ZlQnVmZmVyLHQ9MCxpPVtdO3Q8by5sZW5ndGg7dCsrKWU9b1t0XSxyfHwocj1lLnR5cGUpLGUudHlwZT09PXI/aS5wdXNoKGUubGF5ZXIpOih0aGlzW3JdKGkpLHI9ZS50eXBlLGk9W2UubGF5ZXJdKTt0aGlzW3JdKGkpLG8ubGVuZ3RoPTAsY2xlYXJUaW1lb3V0KHRoaXMuX3NpbmdsZUFkZFJlbW92ZUJ1ZmZlclRpbWVvdXQpLHRoaXMuX3NpbmdsZUFkZFJlbW92ZUJ1ZmZlclRpbWVvdXQ9bnVsbH0sX2NoZWNrSW5HZXRTZXBhcmF0ZWQ6ZnVuY3Rpb24ocil7dmFyIG8sdCxpPXRoaXMuX3NlcGFyYXRlU2luZ2xlRnJvbUdyb3VwTGF5ZXJzKHIse2dyb3VwczpbXSxzaW5nbGVzOltdfSksYT1pLmdyb3VwcyxzPWkuc2luZ2xlcztmb3Iobz0wO288YS5sZW5ndGg7bysrKXQ9YVtvXSx0aGlzLl9yZWNydWl0TGF5ZXJHcm91cEFzUHJveHkodCk7Zm9yKG89MDtvPHMubGVuZ3RoO28rKyl0PXNbb10sdGhpcy5fcmVtb3ZlRnJvbU90aGVyR3JvdXBzT3JNYXAodCksdGhpcy5fbGF5ZXJzW2Uuc3RhbXAodCldPXQsdC5fbWNnTGF5ZXJTdXBwb3J0R3JvdXA9dGhpcztyZXR1cm4gaX0sX3NlcGFyYXRlU2luZ2xlRnJvbUdyb3VwTGF5ZXJzOmZ1bmN0aW9uKHIsbyl7Zm9yKHZhciB0LGk9by5ncm91cHMsYT1vLnNpbmdsZXMscz1lLlV0aWwuaXNBcnJheSxuPTA7bjxyLmxlbmd0aDtuKyspdD1yW25dLHQgaW5zdGFuY2VvZiBlLkxheWVyR3JvdXA/KGkucHVzaCh0KSx0aGlzLl9zZXBhcmF0ZVNpbmdsZUZyb21Hcm91cExheWVycyh0LmdldExheWVycygpLG8pKTpzKHQpP3RoaXMuX3NlcGFyYXRlU2luZ2xlRnJvbUdyb3VwTGF5ZXJzKHQsbyk6YS5wdXNoKHQpO3JldHVybiBvfSxfcmVjcnVpdExheWVyR3JvdXBBc1Byb3h5OmZ1bmN0aW9uKHIpe3ZhciBvPXIuX3Byb3h5TWNnTGF5ZXJTdXBwb3J0R3JvdXA7aWYobyl7aWYobz09PXRoaXMpcmV0dXJuO28uY2hlY2tPdXQocil9ZWxzZSB0aGlzLl9yZW1vdmVGcm9tT3duTWFwKHIpO3IuX3Byb3h5TWNnTGF5ZXJTdXBwb3J0R3JvdXA9dGhpcyxyLl9vcmlnaW5hbEFkZExheWVyPXIuX29yaWdpbmFsQWRkTGF5ZXJ8fHIuYWRkTGF5ZXIsci5fb3JpZ2luYWxSZW1vdmVMYXllcj1yLl9vcmlnaW5hbFJlbW92ZUxheWVyfHxyLnJlbW92ZUxheWVyLGUuZXh0ZW5kKHIsdCl9LF9kaXNtaXNzUHJveHlMYXllckdyb3VwOmZ1bmN0aW9uKG8pe2lmKG8uX3Byb3h5TWNnTGF5ZXJTdXBwb3J0R3JvdXAhPT1yJiZvLl9wcm94eU1jZ0xheWVyU3VwcG9ydEdyb3VwPT09dGhpcyl7ZGVsZXRlIG8uX3Byb3h5TWNnTGF5ZXJTdXBwb3J0R3JvdXAsby5hZGRMYXllcj1vLl9vcmlnaW5hbEFkZExheWVyLG8ucmVtb3ZlTGF5ZXI9by5fb3JpZ2luYWxSZW1vdmVMYXllcjt2YXIgdD1lLnN0YW1wKG8pO2RlbGV0ZSB0aGlzLl9wcm94eUxheWVyR3JvdXBzW3RdLGRlbGV0ZSB0aGlzLl9wcm94eUxheWVyR3JvdXBzTmVlZFJlbW92aW5nW3RdLHRoaXMuX3JlbW92ZUZyb21Pd25NYXAobyl9fSxfcmVtb3ZlRnJvbU90aGVyR3JvdXBzT3JNYXA6ZnVuY3Rpb24oZSl7dmFyIHI9ZS5fbWNnTGF5ZXJTdXBwb3J0R3JvdXA7aWYocil7aWYocj09PXRoaXMpcmV0dXJuO3IuY2hlY2tPdXQoZSl9ZWxzZSBlLl9fcGFyZW50P2UuX19wYXJlbnQuX2dyb3VwLnJlbW92ZUxheWVyKGUpOnRoaXMuX3JlbW92ZUZyb21Pd25NYXAoZSl9LF9yZW1vdmVGcm9tT3duTWFwOmZ1bmN0aW9uKGUpe2UuX21hcCYmZS5fbWFwLnJlbW92ZUxheWVyKGUpfSxfcmVtb3ZlUHJlQWRkZWRMYXllcnM6ZnVuY3Rpb24oZSl7dmFyIHIsbz10aGlzLl9sYXllcnMsdD1bXTtmb3IodmFyIGkgaW4gbylyPW9baV0sci5fbWFwJiYodC5wdXNoKHIpLGUuX29yaWdpbmFsUmVtb3ZlTGF5ZXIocikpO3JldHVybiB0fSxfdG9BcnJheTpmdW5jdGlvbihyKXtyZXR1cm4gZS5VdGlsLmlzQXJyYXkocik/cjpbcl19fSk7dmFyIG89ZS5GZWF0dXJlR3JvdXAuZXh0ZW5kKHthZGRMYXllcjpmdW5jdGlvbihyKXtpZih0aGlzLmhhc0xheWVyKHIpKXJldHVybiB0aGlzO3IuYWRkRXZlbnRQYXJlbnQodGhpcyk7dmFyIG89ZS5zdGFtcChyKTtyZXR1cm4gdGhpcy5fbGF5ZXJzW29dPXIsdGhpcy5fbWFwJiZ0aGlzLl9tYXAuX29yaWdpbmFsQWRkTGF5ZXIociksdGhpcy5maXJlKCJsYXllcmFkZCIse2xheWVyOnJ9KX0scmVtb3ZlTGF5ZXI6ZnVuY3Rpb24ocil7aWYoIXRoaXMuaGFzTGF5ZXIocikpcmV0dXJuIHRoaXM7ciBpbiB0aGlzLl9sYXllcnMmJihyPXRoaXMuX2xheWVyc1tyXSksci5yZW1vdmVFdmVudFBhcmVudCh0aGlzKTt2YXIgbz1lLnN0YW1wKHIpO3JldHVybiB0aGlzLl9tYXAmJnRoaXMuX2xheWVyc1tvXSYmdGhpcy5fbWFwLl9vcmlnaW5hbFJlbW92ZUxheWVyKHRoaXMuX2xheWVyc1tvXSksZGVsZXRlIHRoaXMuX2xheWVyc1tvXSx0aGlzLmZpcmUoImxheWVycmVtb3ZlIix7bGF5ZXI6cn0pfSxvbkFkZDpmdW5jdGlvbihlKXt0aGlzLl9tYXA9ZSx0aGlzLmVhY2hMYXllcihlLl9vcmlnaW5hbEFkZExheWVyLGUpfSxvblJlbW92ZTpmdW5jdGlvbihlKXt0aGlzLmVhY2hMYXllcihlLl9vcmlnaW5hbFJlbW92ZUxheWVyLGUpLHRoaXMuX21hcD1udWxsfX0pLHQ9e2FkZExheWVyOmZ1bmN0aW9uKGUpe3ZhciByPXRoaXMuZ2V0TGF5ZXJJZChlKTtyZXR1cm4gdGhpcy5fbGF5ZXJzW3JdPWUsdGhpcy5fbWFwP3RoaXMuX3Byb3h5TWNnTGF5ZXJTdXBwb3J0R3JvdXAuYWRkTGF5ZXIoZSk6dGhpcy5fcHJveHlNY2dMYXllclN1cHBvcnRHcm91cC5jaGVja0luKGUpLHRoaXN9LHJlbW92ZUxheWVyOmZ1bmN0aW9uKGUpe3ZhciByPWUgaW4gdGhpcy5fbGF5ZXJzP2U6dGhpcy5nZXRMYXllcklkKGUpO3JldHVybiB0aGlzLl9wcm94eU1jZ0xheWVyU3VwcG9ydEdyb3VwLnJlbW92ZUxheWVyKGUpLGRlbGV0ZSB0aGlzLl9sYXllcnNbcl0sdGhpc30sb25BZGQ6ZnVuY3Rpb24oKXt0aGlzLl9wcm94eU1jZ0xheWVyU3VwcG9ydEdyb3VwLmFkZExheWVycyh0aGlzLmdldExheWVycygpKX0sb25SZW1vdmU6ZnVuY3Rpb24oKXt0aGlzLl9wcm94eU1jZ0xheWVyU3VwcG9ydEdyb3VwLnJlbW92ZUxheWVycyh0aGlzLmdldExheWVycygpKX19LGk9e2FkZExheWVyOmZ1bmN0aW9uKGUpe3JldHVybiBlLl9tY2dMYXllclN1cHBvcnRHcm91cD9lLl9tY2dMYXllclN1cHBvcnRHcm91cC5fb3JpZ2luYWxBZGRMYXllcihlKTp0aGlzLl9vcmlnaW5hbEFkZExheWVyKGUpfSxyZW1vdmVMYXllcjpmdW5jdGlvbihlKXtyZXR1cm4gZS5fbWNnTGF5ZXJTdXBwb3J0R3JvdXA/ZS5fbWNnTGF5ZXJTdXBwb3J0R3JvdXAuX29yaWdpbmFsUmVtb3ZlTGF5ZXIoZSk6dGhpcy5fb3JpZ2luYWxSZW1vdmVMYXllcihlKX19O2UubWFya2VyQ2x1c3Rlckdyb3VwLmxheWVyU3VwcG9ydD1mdW5jdGlvbihyKXtyZXR1cm4gbmV3IGUuTWFya2VyQ2x1c3Rlckdyb3VwLkxheWVyU3VwcG9ydChyKX19KTs="></script>
<script src="data:application/javascript;base64,RnVzZT1mdW5jdGlvbihlKXt2YXIgdD17fTtmdW5jdGlvbiByKG4pe2lmKHRbbl0pcmV0dXJuIHRbbl0uZXhwb3J0czt2YXIgbz10W25dPXtpOm4sbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gZVtuXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyxyKSxvLmw9ITAsby5leHBvcnRzfXJldHVybiByLm09ZSxyLmM9dCxyLmQ9ZnVuY3Rpb24oZSx0LG4pe3IubyhlLHQpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6bn0pfSxyLnI9ZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSxyLm49ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIHIuZCh0LCJhIix0KSx0fSxyLm89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9LHIucD0iIixyKHIucz0wKX0oW2Z1bmN0aW9uKGUsdCxyKXsKLyohCiAqIEZ1c2UuanMgdjMuMi4wIC0gTGlnaHR3ZWlnaHQgZnV6enktc2VhcmNoIChodHRwOi8vZnVzZWpzLmlvKQogKiAKICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcgS2lyb2xsb3MgUmlzayAoaHR0cDovL2tpcm8ubWUpCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMAogKiAKICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqLwp2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Z1bmN0aW9uIHIobil7aWYodFtuXSlyZXR1cm4gdFtuXS5leHBvcnRzO3ZhciBvPXRbbl09e2k6bixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW25dLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLHIpLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIHIubT1lLHIuYz10LHIuaT1mdW5jdGlvbihlKXtyZXR1cm4gZX0sci5kPWZ1bmN0aW9uKGUsdCxuKXtyLm8oZSx0KXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsZ2V0Om59KX0sci5uPWZ1bmN0aW9uKGUpe3ZhciB0PWUmJmUuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiBlLmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIGV9O3JldHVybiByLmQodCwiYSIsdCksdH0sci5vPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfSxyLnA9IiIscihyLnM9OCl9KFtmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG49dFtyXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24odCxyLG4pe3JldHVybiByJiZlKHQucHJvdG90eXBlLHIpLG4mJmUodCxuKSx0fX0oKTt2YXIgbz1yKDUpLGk9cig3KSxhPXIoNCkscz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxyKXt2YXIgbj1yLmxvY2F0aW9uLG89dm9pZCAwPT09bj8wOm4saT1yLmRpc3RhbmNlLHM9dm9pZCAwPT09aT8xMDA6aSxjPXIudGhyZXNob2xkLGg9dm9pZCAwPT09Yz8uNjpjLHU9ci5tYXhQYXR0ZXJuTGVuZ3RoLGw9dm9pZCAwPT09dT8zMjp1LHY9ci5pc0Nhc2VTZW5zaXRpdmUsZj12b2lkIDAhPT12JiZ2LGQ9ci50b2tlblNlcGFyYXRvcixwPXZvaWQgMD09PWQ/LyArL2c6ZCxnPXIuZmluZEFsbE1hdGNoZXMseT12b2lkIDAhPT1nJiZnLG09ci5taW5NYXRjaENoYXJMZW5ndGgsaz12b2lkIDA9PT1tPzE6bTshZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxlKSx0aGlzLm9wdGlvbnM9e2xvY2F0aW9uOm8sZGlzdGFuY2U6cyx0aHJlc2hvbGQ6aCxtYXhQYXR0ZXJuTGVuZ3RoOmwsaXNDYXNlU2Vuc2l0aXZlOmYsdG9rZW5TZXBhcmF0b3I6cCxmaW5kQWxsTWF0Y2hlczp5LG1pbk1hdGNoQ2hhckxlbmd0aDprfSx0aGlzLnBhdHRlcm49dGhpcy5vcHRpb25zLmlzQ2FzZVNlbnNpdGl2ZT90OnQudG9Mb3dlckNhc2UoKSx0aGlzLnBhdHRlcm4ubGVuZ3RoPD1sJiYodGhpcy5wYXR0ZXJuQWxwaGFiZXQ9YSh0aGlzLnBhdHRlcm4pKX1yZXR1cm4gbihlLFt7a2V5OiJzZWFyY2giLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKHRoaXMub3B0aW9ucy5pc0Nhc2VTZW5zaXRpdmV8fChlPWUudG9Mb3dlckNhc2UoKSksdGhpcy5wYXR0ZXJuPT09ZSlyZXR1cm57aXNNYXRjaDohMCxzY29yZTowLG1hdGNoZWRJbmRpY2VzOltbMCxlLmxlbmd0aC0xXV19O3ZhciB0PXRoaXMub3B0aW9ucyxyPXQubWF4UGF0dGVybkxlbmd0aCxuPXQudG9rZW5TZXBhcmF0b3I7aWYodGhpcy5wYXR0ZXJuLmxlbmd0aD5yKXJldHVybiBvKGUsdGhpcy5wYXR0ZXJuLG4pO3ZhciBhPXRoaXMub3B0aW9ucyxzPWEubG9jYXRpb24sYz1hLmRpc3RhbmNlLGg9YS50aHJlc2hvbGQsdT1hLmZpbmRBbGxNYXRjaGVzLGw9YS5taW5NYXRjaENoYXJMZW5ndGg7cmV0dXJuIGkoZSx0aGlzLnBhdHRlcm4sdGhpcy5wYXR0ZXJuQWxwaGFiZXQse2xvY2F0aW9uOnMsZGlzdGFuY2U6Yyx0aHJlc2hvbGQ6aCxmaW5kQWxsTWF0Y2hlczp1LG1pbk1hdGNoQ2hhckxlbmd0aDpsfSl9fV0pLGV9KCk7ZS5leHBvcnRzPXN9LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7dmFyIG49cigwKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24gZSh0LHIsbyl7aWYocil7dmFyIGk9ci5pbmRleE9mKCIuIiksYT1yLHM9bnVsbDstMSE9PWkmJihhPXIuc2xpY2UoMCxpKSxzPXIuc2xpY2UoaSsxKSk7dmFyIGM9dFthXTtpZihudWxsIT09YyYmdm9pZCAwIT09YylpZihzfHwic3RyaW5nIiE9dHlwZW9mIGMmJiJudW1iZXIiIT10eXBlb2YgYylpZihuKGMpKWZvcih2YXIgaD0wLHU9Yy5sZW5ndGg7aDx1O2grPTEpZShjW2hdLHMsbyk7ZWxzZSBzJiZlKGMscyxvKTtlbHNlIG8ucHVzaChjLnRvU3RyaW5nKCkpfWVsc2Ugby5wdXNoKHQpO3JldHVybiBvfShlLHQsW10pfX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOltdLHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjEscj1bXSxuPS0xLG89LTEsaT0wLGE9ZS5sZW5ndGg7aTxhO2krPTEpe3ZhciBzPWVbaV07cyYmLTE9PT1uP249aTpzfHwtMT09PW58fCgobz1pLTEpLW4rMT49dCYmci5wdXNoKFtuLG9dKSxuPS0xKX1yZXR1cm4gZVtpLTFdJiZpLW4+PXQmJnIucHVzaChbbixpLTFdKSxyfX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXt9LHI9ZS5sZW5ndGgsbj0wO248cjtuKz0xKXRbZS5jaGFyQXQobildPTA7Zm9yKHZhciBvPTA7bzxyO28rPTEpdFtlLmNoYXJBdChvKV18PTE8PHItby0xO3JldHVybiB0fX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj0vW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTovICsvZyxvPW5ldyBSZWdFeHAodC5yZXBsYWNlKG4sIlxcJCYiKS5yZXBsYWNlKHIsInwiKSksaT1lLm1hdGNoKG8pLGE9ISFpLHM9W107aWYoYSlmb3IodmFyIGM9MCxoPWkubGVuZ3RoO2M8aDtjKz0xKXt2YXIgdT1pW2NdO3MucHVzaChbZS5pbmRleE9mKHUpLHUubGVuZ3RoLTFdKX1yZXR1cm57c2NvcmU6YT8uNToxLGlzTWF0Y2g6YSxtYXRjaGVkSW5kaWNlczpzfX19LGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dC5lcnJvcnMsbj12b2lkIDA9PT1yPzA6cixvPXQuY3VycmVudExvY2F0aW9uLGk9dm9pZCAwPT09bz8wOm8sYT10LmV4cGVjdGVkTG9jYXRpb24scz12b2lkIDA9PT1hPzA6YSxjPXQuZGlzdGFuY2UsaD12b2lkIDA9PT1jPzEwMDpjLHU9bi9lLmxlbmd0aCxsPU1hdGguYWJzKHMtaSk7cmV0dXJuIGg/dStsL2g6bD8xOnV9fSxmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNiksbz1yKDMpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscixpKXtmb3IodmFyIGE9aS5sb2NhdGlvbixzPXZvaWQgMD09PWE/MDphLGM9aS5kaXN0YW5jZSxoPXZvaWQgMD09PWM/MTAwOmMsdT1pLnRocmVzaG9sZCxsPXZvaWQgMD09PXU/LjY6dSx2PWkuZmluZEFsbE1hdGNoZXMsZj12b2lkIDAhPT12JiZ2LGQ9aS5taW5NYXRjaENoYXJMZW5ndGgscD12b2lkIDA9PT1kPzE6ZCxnPXMseT1lLmxlbmd0aCxtPWwsaz1lLmluZGV4T2YodCxnKSx4PXQubGVuZ3RoLFM9W10sTT0wO008eTtNKz0xKVNbTV09MDtpZigtMSE9PWspe3ZhciBfPW4odCx7ZXJyb3JzOjAsY3VycmVudExvY2F0aW9uOmssZXhwZWN0ZWRMb2NhdGlvbjpnLGRpc3RhbmNlOmh9KTtpZihtPU1hdGgubWluKF8sbSksLTEhPT0oaz1lLmxhc3RJbmRleE9mKHQsZyt4KSkpe3ZhciBiPW4odCx7ZXJyb3JzOjAsY3VycmVudExvY2F0aW9uOmssZXhwZWN0ZWRMb2NhdGlvbjpnLGRpc3RhbmNlOmh9KTttPU1hdGgubWluKGIsbSl9fWs9LTE7Zm9yKHZhciB3PVtdLEw9MSxDPXgreSxBPTE8PHgtMSxJPTA7STx4O0krPTEpe2Zvcih2YXIgTz0wLFA9QztPPFA7KXtuKHQse2Vycm9yczpJLGN1cnJlbnRMb2NhdGlvbjpnK1AsZXhwZWN0ZWRMb2NhdGlvbjpnLGRpc3RhbmNlOmh9KTw9bT9PPVA6Qz1QLFA9TWF0aC5mbG9vcigoQy1PKS8yK08pfUM9UDt2YXIgaj1NYXRoLm1heCgxLGctUCsxKSx6PWY/eTpNYXRoLm1pbihnK1AseSkreCxGPUFycmF5KHorMik7Rlt6KzFdPSgxPDxJKS0xO2Zvcih2YXIgVD16O1Q+PWo7VC09MSl7dmFyIEU9VC0xLEs9cltlLmNoYXJBdChFKV07aWYoSyYmKFNbRV09MSksRltUXT0oRltUKzFdPDwxfDEpJkssMCE9PUkmJihGW1RdfD0od1tUKzFdfHdbVF0pPDwxfDF8d1tUKzFdKSxGW1RdJkEmJihMPW4odCx7ZXJyb3JzOkksY3VycmVudExvY2F0aW9uOkUsZXhwZWN0ZWRMb2NhdGlvbjpnLGRpc3RhbmNlOmh9KSk8PW0pe2lmKG09TCwoaz1FKTw9ZylicmVhaztqPU1hdGgubWF4KDEsMipnLWspfX1pZihuKHQse2Vycm9yczpJKzEsY3VycmVudExvY2F0aW9uOmcsZXhwZWN0ZWRMb2NhdGlvbjpnLGRpc3RhbmNlOmh9KT5tKWJyZWFrO3c9Rn1yZXR1cm57aXNNYXRjaDprPj0wLHNjb3JlOjA9PT1MPy4wMDE6TCxtYXRjaGVkSW5kaWNlczpvKFMscCl9fX0sZnVuY3Rpb24oZSx0LHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG49dFtyXTtuLmVudW1lcmFibGU9bi5lbnVtZXJhYmxlfHwhMSxuLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4ua2V5LG4pfX1yZXR1cm4gZnVuY3Rpb24odCxyLG4pe3JldHVybiByJiZlKHQucHJvdG90eXBlLHIpLG4mJmUodCxuKSx0fX0oKTt2YXIgbz1yKDEpLGk9cigyKSxhPXIoMCkscz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxyKXt2YXIgbj1yLmxvY2F0aW9uLG89dm9pZCAwPT09bj8wOm4sYT1yLmRpc3RhbmNlLHM9dm9pZCAwPT09YT8xMDA6YSxjPXIudGhyZXNob2xkLGg9dm9pZCAwPT09Yz8uNjpjLHU9ci5tYXhQYXR0ZXJuTGVuZ3RoLGw9dm9pZCAwPT09dT8zMjp1LHY9ci5jYXNlU2Vuc2l0aXZlLGY9dm9pZCAwIT09diYmdixkPXIudG9rZW5TZXBhcmF0b3IscD12b2lkIDA9PT1kPy8gKy9nOmQsZz1yLmZpbmRBbGxNYXRjaGVzLHk9dm9pZCAwIT09ZyYmZyxtPXIubWluTWF0Y2hDaGFyTGVuZ3RoLGs9dm9pZCAwPT09bT8xOm0seD1yLmlkLFM9dm9pZCAwPT09eD9udWxsOngsTT1yLmtleXMsXz12b2lkIDA9PT1NP1tdOk0sYj1yLnNob3VsZFNvcnQsdz12b2lkIDA9PT1ifHxiLEw9ci5nZXRGbixDPXZvaWQgMD09PUw/aTpMLEE9ci5zb3J0Rm4sST12b2lkIDA9PT1BP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIGUuc2NvcmUtdC5zY29yZX06QSxPPXIudG9rZW5pemUsUD12b2lkIDAhPT1PJiZPLGo9ci5tYXRjaEFsbFRva2Vucyx6PXZvaWQgMCE9PWomJmosRj1yLmluY2x1ZGVNYXRjaGVzLFQ9dm9pZCAwIT09RiYmRixFPXIuaW5jbHVkZVNjb3JlLEs9dm9pZCAwIT09RSYmRSwkPXIudmVyYm9zZSxKPXZvaWQgMCE9PSQmJiQ7IWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsZSksdGhpcy5vcHRpb25zPXtsb2NhdGlvbjpvLGRpc3RhbmNlOnMsdGhyZXNob2xkOmgsbWF4UGF0dGVybkxlbmd0aDpsLGlzQ2FzZVNlbnNpdGl2ZTpmLHRva2VuU2VwYXJhdG9yOnAsZmluZEFsbE1hdGNoZXM6eSxtaW5NYXRjaENoYXJMZW5ndGg6ayxpZDpTLGtleXM6XyxpbmNsdWRlTWF0Y2hlczpULGluY2x1ZGVTY29yZTpLLHNob3VsZFNvcnQ6dyxnZXRGbjpDLHNvcnRGbjpJLHZlcmJvc2U6Six0b2tlbml6ZTpQLG1hdGNoQWxsVG9rZW5zOnp9LHRoaXMuc2V0Q29sbGVjdGlvbih0KX1yZXR1cm4gbihlLFt7a2V5OiJzZXRDb2xsZWN0aW9uIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5saXN0PWUsZX19LHtrZXk6InNlYXJjaCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5fbG9nKCctLS0tLS0tLS1cblNlYXJjaCBwYXR0ZXJuOiAiJytlKyciJyk7dmFyIHQ9dGhpcy5fcHJlcGFyZVNlYXJjaGVycyhlKSxyPXQudG9rZW5TZWFyY2hlcnMsbj10LmZ1bGxTZWFyY2hlcixvPXRoaXMuX3NlYXJjaChyLG4pLGk9by53ZWlnaHRzLGE9by5yZXN1bHRzO3JldHVybiB0aGlzLl9jb21wdXRlU2NvcmUoaSxhKSx0aGlzLm9wdGlvbnMuc2hvdWxkU29ydCYmdGhpcy5fc29ydChhKSx0aGlzLl9mb3JtYXQoYSl9fSx7a2V5OiJfcHJlcGFyZVNlYXJjaGVycyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IiIsdD1bXTtpZih0aGlzLm9wdGlvbnMudG9rZW5pemUpZm9yKHZhciByPWUuc3BsaXQodGhpcy5vcHRpb25zLnRva2VuU2VwYXJhdG9yKSxuPTAsaT1yLmxlbmd0aDtuPGk7bis9MSl0LnB1c2gobmV3IG8ocltuXSx0aGlzLm9wdGlvbnMpKTtyZXR1cm57dG9rZW5TZWFyY2hlcnM6dCxmdWxsU2VhcmNoZXI6bmV3IG8oZSx0aGlzLm9wdGlvbnMpfX19LHtrZXk6Il9zZWFyY2giLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOltdLHQ9YXJndW1lbnRzWzFdLHI9dGhpcy5saXN0LG49e30sbz1bXTtpZigic3RyaW5nIj09dHlwZW9mIHJbMF0pe2Zvcih2YXIgaT0wLGE9ci5sZW5ndGg7aTxhO2krPTEpdGhpcy5fYW5hbHl6ZSh7a2V5OiIiLHZhbHVlOnJbaV0scmVjb3JkOmksaW5kZXg6aX0se3Jlc3VsdE1hcDpuLHJlc3VsdHM6byx0b2tlblNlYXJjaGVyczplLGZ1bGxTZWFyY2hlcjp0fSk7cmV0dXJue3dlaWdodHM6bnVsbCxyZXN1bHRzOm99fWZvcih2YXIgcz17fSxjPTAsaD1yLmxlbmd0aDtjPGg7Yys9MSlmb3IodmFyIHU9cltjXSxsPTAsdj10aGlzLm9wdGlvbnMua2V5cy5sZW5ndGg7bDx2O2wrPTEpe3ZhciBmPXRoaXMub3B0aW9ucy5rZXlzW2xdO2lmKCJzdHJpbmciIT10eXBlb2YgZil7aWYoc1tmLm5hbWVdPXt3ZWlnaHQ6MS1mLndlaWdodHx8MX0sZi53ZWlnaHQ8PTB8fGYud2VpZ2h0PjEpdGhyb3cgbmV3IEVycm9yKCJLZXkgd2VpZ2h0IGhhcyB0byBiZSA+IDAgYW5kIDw9IDEiKTtmPWYubmFtZX1lbHNlIHNbZl09e3dlaWdodDoxfTt0aGlzLl9hbmFseXplKHtrZXk6Zix2YWx1ZTp0aGlzLm9wdGlvbnMuZ2V0Rm4odSxmKSxyZWNvcmQ6dSxpbmRleDpjfSx7cmVzdWx0TWFwOm4scmVzdWx0czpvLHRva2VuU2VhcmNoZXJzOmUsZnVsbFNlYXJjaGVyOnR9KX1yZXR1cm57d2VpZ2h0czpzLHJlc3VsdHM6b319fSx7a2V5OiJfYW5hbHl6ZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgcj1lLmtleSxuPWUuYXJyYXlJbmRleCxvPXZvaWQgMD09PW4/LTE6bixpPWUudmFsdWUscz1lLnJlY29yZCxjPWUuaW5kZXgsaD10LnRva2VuU2VhcmNoZXJzLHU9dm9pZCAwPT09aD9bXTpoLGw9dC5mdWxsU2VhcmNoZXIsdj12b2lkIDA9PT1sP1tdOmwsZj10LnJlc3VsdE1hcCxkPXZvaWQgMD09PWY/e306ZixwPXQucmVzdWx0cyxnPXZvaWQgMD09PXA/W106cDtpZih2b2lkIDAhPT1pJiZudWxsIT09aSl7dmFyIHk9ITEsbT0tMSxrPTA7aWYoInN0cmluZyI9PXR5cGVvZiBpKXt0aGlzLl9sb2coIlxuS2V5OiAiKygiIj09PXI/Ii0iOnIpKTt2YXIgeD12LnNlYXJjaChpKTtpZih0aGlzLl9sb2coJ0Z1bGwgdGV4dDogIicraSsnIiwgc2NvcmU6ICcreC5zY29yZSksdGhpcy5vcHRpb25zLnRva2VuaXplKXtmb3IodmFyIFM9aS5zcGxpdCh0aGlzLm9wdGlvbnMudG9rZW5TZXBhcmF0b3IpLE09W10sXz0wO188dS5sZW5ndGg7Xys9MSl7dmFyIGI9dVtfXTt0aGlzLl9sb2coJ1xuUGF0dGVybjogIicrYi5wYXR0ZXJuKyciJyk7Zm9yKHZhciB3PSExLEw9MDtMPFMubGVuZ3RoO0wrPTEpe3ZhciBDPVNbTF0sQT1iLnNlYXJjaChDKSxJPXt9O0EuaXNNYXRjaD8oSVtDXT1BLnNjb3JlLHk9ITAsdz0hMCxNLnB1c2goQS5zY29yZSkpOihJW0NdPTEsdGhpcy5vcHRpb25zLm1hdGNoQWxsVG9rZW5zfHxNLnB1c2goMSkpLHRoaXMuX2xvZygnVG9rZW46ICInK0MrJyIsIHNjb3JlOiAnK0lbQ10pfXcmJihrKz0xKX1tPU1bMF07Zm9yKHZhciBPPU0ubGVuZ3RoLFA9MTtQPE87UCs9MSltKz1NW1BdO20vPU8sdGhpcy5fbG9nKCJUb2tlbiBzY29yZSBhdmVyYWdlOiIsbSl9dmFyIGo9eC5zY29yZTttPi0xJiYoaj0oaittKS8yKSx0aGlzLl9sb2coIlNjb3JlIGF2ZXJhZ2U6IixqKTt2YXIgej0hdGhpcy5vcHRpb25zLnRva2VuaXplfHwhdGhpcy5vcHRpb25zLm1hdGNoQWxsVG9rZW5zfHxrPj11Lmxlbmd0aDtpZih0aGlzLl9sb2coIlxuQ2hlY2sgTWF0Y2hlczogIit6KSwoeXx8eC5pc01hdGNoKSYmeil7dmFyIEY9ZFtjXTtGP0Yub3V0cHV0LnB1c2goe2tleTpyLGFycmF5SW5kZXg6byx2YWx1ZTppLHNjb3JlOmosbWF0Y2hlZEluZGljZXM6eC5tYXRjaGVkSW5kaWNlc30pOihkW2NdPXtpdGVtOnMsb3V0cHV0Olt7a2V5OnIsYXJyYXlJbmRleDpvLHZhbHVlOmksc2NvcmU6aixtYXRjaGVkSW5kaWNlczp4Lm1hdGNoZWRJbmRpY2VzfV19LGcucHVzaChkW2NdKSl9fWVsc2UgaWYoYShpKSlmb3IodmFyIFQ9MCxFPWkubGVuZ3RoO1Q8RTtUKz0xKXRoaXMuX2FuYWx5emUoe2tleTpyLGFycmF5SW5kZXg6VCx2YWx1ZTppW1RdLHJlY29yZDpzLGluZGV4OmN9LHtyZXN1bHRNYXA6ZCxyZXN1bHRzOmcsdG9rZW5TZWFyY2hlcnM6dSxmdWxsU2VhcmNoZXI6dn0pfX19LHtrZXk6Il9jb21wdXRlU2NvcmUiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dGhpcy5fbG9nKCJcblxuQ29tcHV0aW5nIHNjb3JlOlxuIik7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cis9MSl7Zm9yKHZhciBvPXRbcl0ub3V0cHV0LGk9by5sZW5ndGgsYT0wLHM9MSxjPTA7YzxpO2MrPTEpe3ZhciBoPWU/ZVtvW2NdLmtleV0ud2VpZ2h0OjEsdT0oMT09PWg/b1tjXS5zY29yZTpvW2NdLnNjb3JlfHwuMDAxKSpoOzEhPT1oP3M9TWF0aC5taW4ocyx1KToob1tjXS5uU2NvcmU9dSxhKz11KX10W3JdLnNjb3JlPTE9PT1zP2EvaTpzLHRoaXMuX2xvZyh0W3JdKX19fSx7a2V5OiJfc29ydCIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5fbG9nKCJcblxuU29ydGluZy4uLi4iKSxlLnNvcnQodGhpcy5vcHRpb25zLnNvcnRGbil9fSx7a2V5OiJfZm9ybWF0Iix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1bXTt0aGlzLl9sb2coIlxuXG5PdXRwdXQ6XG5cbiIsSlNPTi5zdHJpbmdpZnkoZSkpO3ZhciByPVtdO3RoaXMub3B0aW9ucy5pbmNsdWRlTWF0Y2hlcyYmci5wdXNoKGZ1bmN0aW9uKGUsdCl7dmFyIHI9ZS5vdXRwdXQ7dC5tYXRjaGVzPVtdO2Zvcih2YXIgbj0wLG89ci5sZW5ndGg7bjxvO24rPTEpe3ZhciBpPXJbbl07aWYoMCE9PWkubWF0Y2hlZEluZGljZXMubGVuZ3RoKXt2YXIgYT17aW5kaWNlczppLm1hdGNoZWRJbmRpY2VzLHZhbHVlOmkudmFsdWV9O2kua2V5JiYoYS5rZXk9aS5rZXkpLGkuaGFzT3duUHJvcGVydHkoImFycmF5SW5kZXgiKSYmaS5hcnJheUluZGV4Pi0xJiYoYS5hcnJheUluZGV4PWkuYXJyYXlJbmRleCksdC5tYXRjaGVzLnB1c2goYSl9fX0pLHRoaXMub3B0aW9ucy5pbmNsdWRlU2NvcmUmJnIucHVzaChmdW5jdGlvbihlLHQpe3Quc2NvcmU9ZS5zY29yZX0pO2Zvcih2YXIgbj0wLG89ZS5sZW5ndGg7bjxvO24rPTEpe3ZhciBpPWVbbl07aWYodGhpcy5vcHRpb25zLmlkJiYoaS5pdGVtPXRoaXMub3B0aW9ucy5nZXRGbihpLml0ZW0sdGhpcy5vcHRpb25zLmlkKVswXSksci5sZW5ndGgpe2Zvcih2YXIgYT17aXRlbTppLml0ZW19LHM9MCxjPXIubGVuZ3RoO3M8YztzKz0xKXJbc10oaSxhKTt0LnB1c2goYSl9ZWxzZSB0LnB1c2goaS5pdGVtKX1yZXR1cm4gdH19LHtrZXk6Il9sb2ciLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU7dGhpcy5vcHRpb25zLnZlcmJvc2UmJihlPWNvbnNvbGUpLmxvZy5hcHBseShlLGFyZ3VtZW50cyl9fV0pLGV9KCk7ZS5leHBvcnRzPXN9XSl9LGUuZXhwb3J0cz1uKCl9XSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWZ1c2VfanMtcHJvZC5qcy5tYXA="></script>
<link href="data:text/css,%0A%2Eleaflet%2Dcontainer%20%2Eleaflet%2Dcontrol%2Dsearch%7Bposition%3Arelative%3Bfloat%3Aleft%3Bbackground%3A%23fff%3Bcolor%3A%231978cf%3B%2Dmoz%2Dborder%2Dradius%3A4px%3B%2Dwebkit%2Dborder%2Dradius%3A4px%3Bborder%2Dradius%3A4px%3Bbackground%2Dcolor%3Argba%28255%2C255%2C255%2C%2E8%29%3Bz%2Dindex%3A1000%3Bbox%2Dshadow%3A0%201px%207px%20rgba%280%2C0%2C0%2C%2E65%29%3Bmargin%2Dleft%3A10px%3Bmargin%2Dtop%3A10px%7D%2Eleaflet%2Dcontrol%2Dsearch%2Esearch%2Dexp%7Bbox%2Dshadow%3A0%201px%207px%20%23999%3Bbackground%3A%23fff%7D%2Eleaflet%2Dcontrol%2Dsearch%20%2Esearch%2Dinput%7Bdisplay%3Ablock%3Bfloat%3Aleft%3Bbackground%3A%23fff%3Bborder%3A1px%20solid%20%23666%3Bborder%2Dradius%3A2px%3Bheight%3A18px%3Bpadding%3A0%2018px%200%202px%3Bmargin%3A3px%200%203px%203px%7D%2Eleaflet%2Dcontrol%2Dsearch%2Esearch%2Dload%20%2Esearch%2Dinput%7Bbackground%3Aurl%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODlhEAAQAPQAAP%2F%2F%2F5mZmfj4%2BM%2FPz%2FLy8rS0tMnJyZmZmbu7u6enp93d3eTk5KCgoNfX15qamq6ursLCwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH%2BGkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAAKAAEALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx%2BlwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6%2F3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh%2BQQACgACACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI%2ByioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l%2FAg1AXySJgn5LcoE3QXI3IQAh%2BQQACgADACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK%2Fe8LRIHn%2Bi1cK0IyKdg0VAoljYIg%2BGgnRrwVS%2F8IAkICyosBIQpBAMoKy9dImxPhS%2BGKkFrkX%2BTigtLlIyKXUF%2BNjagNiEAIfkEAAoABAAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkEAAoABQAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK%2BVgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkEAAoABgAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAAKAAcALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq%2BKPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkEAAoACAAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2%2FQ4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAAKAAkALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm%2BkaCxyxa%2BzRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh%2BQQACgAKACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb%2BA41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh%2BQQACgALACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ%2FDkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOwAAAAAAAAAAAA%3D%3D%29%20no%2Drepeat%20center%20right%20%23fff%7D%2Eleaflet%2Dcontrol%2Dsearch%2Esearch%2Dload%20%2Esearch%2Dcancel%7Bvisibility%3Ahidden%7D%2Eleaflet%2Dcontrol%2Dsearch%20%2Esearch%2Dcancel%7Bdisplay%3Ablock%3Bwidth%3A22px%3Bheight%3A18px%3Bposition%3Aabsolute%3Bright%3A22px%3Bmargin%3A3px%200%3Bbackground%3Aurl%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABQAAABGCAYAAADMz7TxAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk%2FcWPt%2F3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371%2Fu855zn%2FM55zw%2BAERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh%2BdLA%2F%2FAGvbwACAHDVLiQSx%2BH%2Fg7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK%2F4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO%2F0xaL%2Ba%2FBvIj4h8d%2F%2BvIwCBAAQTs%2Fv2l%2Fl5dYDcMcBsHW%2Fa6lbANpWAGjf%2BV0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s%2B%2FzPhb%2BCLfvb8QB7%2B23rwAHGaQJmtwKOD%2FXFhbnauUo7nywRCMW735yP%2Bx4V%2F%2FY4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk%2FATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO%2F%2BY9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II%2FItchQ5jVxA%2BpDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS%2Bh1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE%2BwIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE%2B0JXoS%2BcR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE%2BS%2B8nD5LcUOsWI4kwJoiRSpJQSSjVlP%2BUEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL%2Bl0ugndgx5Fl9CX0mvoB%2Bnn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS%2BZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U%2F1XmqC1SrVQ%2BrXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O%2BX%2F2C%2BmMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF%2Bxt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0%2FLbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY%2Bt56Qn1yvUO6d3RR%2FVt9KP1F%2Brv1u%2FRHzcwNAg2kBlsMThj8MyQY%2BhrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ%2BM1eBc%2BZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82%2FyNhaVFnMVKizaLx5balnzLBZZNlvesmFY%2BVnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10%2FWjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo%2BPWX6zukDPsY%2BAp96n4e%2Bpr4i3z2%2BI37Wfpl%2BB%2Fye%2Bzv6y%2F2P%2BL%2FhefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG%2FljM9xnLJrRFcoInRVaG%2FowzCZMHtYRjobPCN8Qfm%2Bm%2BUzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y%2BpjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h%2FhF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I%2F5YMgQlAvGE%2Flp25NHRPyhJuFT0W%2Boo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI%2Flz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b%2B6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV%2BscKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb%2BvSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2%2FKhNqP2ep1%2FXctW%2Fa2rt77ZJtrWv913e%2FMOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur%2Fmft24R3dPxZ6Pe6V7B%2FZF7%2BtqdG9s3K%2B%2Fv7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e%2BNQ6KHOw9zDzd%2BZf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe%2Bt%2F9%2B7zHjY3XHNY9XnqCdKD3x%2BeSCk%2BOnZKeenU4%2FPdSZ3Hn3TPyZa11RXb1nQ8%2BePxd07ky3X%2FfJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2%2FrZffL7Vc8rnT0Tes70e%2FTf%2FpqwNVz1%2FjXLl2feb3vxuwbt24m3Ry4Jbr1%2BHb27Rd3Cu5M3F16j3iv%2FL7a%2FeoH%2Bg%2Fqf7T%2BsWXAbeD4YMBgz8NZD%2B8OCYee%2FpT%2F04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W%2F3nrc6vn3%2F3i%2B0vPWPzY8Av5i8%2B%2Frnmp83Lvq6mvOscjxx%2B8znk98ab8rc7bfe%2B477rfx70fmSj8QP5Q89H6Y8en0E%2F3Pud8%2Fvwv94Tz%2B4A5JREAAAAGYktHRAD%2FAP8A%2F6C9p5MAAAAJcEhZcwAAD2EAAA9hAag%2Fp2kAAAAHdElNRQfdCR0OKzSQTWy0AAAEPElEQVRYw%2B2XXWhbZRjHf8vH7I6b2eqihLItXYgKTfuCClurOMUJboIyGV75gkLdja43IujFELxwV8KYV0KFwXsh%2BAHiTZkoohYUHGM7S4c2ZongPFvjUk%2B1J93apN48iYf0JP0wiBd5IOTkPe%2F7f77%2Bz%2FmfwP%2FdNrW5dxtwF9Ajv6vAdWB%2BvYBRYBA4AowAO2XfPHAe%2BBSYBCprjfo54FvgJnALmAGuAX8BNaAAvAFsCzoc9l2HgAPAW8CDwI%2FAOHAG%2BAy4CGwG7gMGABe4IE4CbSfwvkQ1CTwFRJoc3g98ACzKnky7VB8DikAZGJWmBNlBib4CvNzch5DvejewHbgCfCM1DLLvgB%2Bk%2B7t9LFgBGBVvLrDQJpN5YK7pTCDgonzvaNVBsW2yx38mEPBnYBZIAU%2BI9yDejgD7pIZXAK%2BV5%2B3S5YpQ5Blgqy%2BlHmA%2F8JFMzTlgqB0PF6TDGaHHPiAJ9Ar3jgCvSJdD8imsxsUQcBj4HPhDanTTNzUeUJL1GjANvADcHhQhwLLU5ZwcXJauX5NoPpGULWCvDEMG%2BFMiXW5H9ChwJ9AvjUrI6G0CHgbOSuQ14Cd5Bvwre1RKUxNevkrTrK7XvpZausBvwMd0rWsd1mWtdaAuG2PWp8ta6zXpsjGmspqMAqCUOgq8KbO5R2baAnaJg0eAqFLqom3bt1pGqLUOyeZ3AAVclmiyMmJ7RVr3A78DbwPjxpglP6B%2FlnsBLel%2BD5wEztYPiMOvgNeAo8Dzos3ZVpoyCDwurxxngC%2F83o0xNWPMeZGJPPAAcEBrvTZdNsb8N7ostOmcLmutN6bLwsdmsBW6bIzxWgFOAV%2BKbrwIHNZab60XXWvdI0CjIq%2BXpZ7BxLZte0EpFajLSqmWuqyUumDbdi1wUpRSvwIOcDeQBoaBp4FnhfRxachmqfO9gKuUytm2vbgC0LbtZaXUhnRZIl1u97SJAnfIJyRvDTeksw8BJ0RKo0AOOGGM%2BTDShm%2BLAnAj4Pak1vqkcPCgvATs6upy1zopo8VioW%2B2XD7uuu4hz%2FOGgAXLsqZjsdjEjt7ed5PJ%2FqtrBsxmLx1zHOeU53lbgg5YllVJJBJjmczg%2BKqA2eylY78Ui%2B8tVatt04qEw%2BxJJl8KAg3503Qc51QdLB6PrwCqry1VqziOc7pYLPS1BJwtl8fqacbjcYaHRxgY%2BOff68BAhuHhkQao53lbZsvl4yuir1%2B4rvtk%2FbpUKpHP50mlUo2NqVSKfD5PqVTCd%2BYQ8HogoOd59%2FhvTE1lG0AA%2BXy%2BsdbqTLOmdMQiPjpMu3NzQ%2F6a1dP0R%2BqP0rKs6ZaAsVhsog4Yj8cbYH6AVCrFzMz1Rh1jsdhESx4Wi4W%2BXC6X83fa34DmNcuyKul0Ot08NY0aJpP9VxOJxFgkHG50utnqa5FwmEQiMRY0gkGjN%2Bo4zumOjF4nHg5d69oG7G9LxrhhWXdE7gAAAABJRU5ErkJggg%3D%3D%29%20no%2Drepeat%200%20%2D46px%3Btext%2Ddecoration%3Anone%3Bfilter%3Aalpha%28opacity%3D80%29%3Bopacity%3A%2E8%7D%2Eleaflet%2Dcontrol%2Dsearch%20%2Esearch%2Dcancel%3Ahover%7Bfilter%3Aalpha%28opacity%3D100%29%3Bopacity%3A1%7D%2Eleaflet%2Dcontrol%2Dsearch%20%2Esearch%2Dcancel%20span%7Bdisplay%3Anone%3Bfont%2Dsize%3A18px%3Bline%2Dheight%3A20px%3Bcolor%3A%23ccc%3Bfont%2Dweight%3A700%7D%2Eleaflet%2Dcontrol%2Dsearch%20%2Esearch%2Dcancel%3Ahover%20span%7Bcolor%3A%23aaa%7D%2Eleaflet%2Dcontrol%2Dsearch%20%2Esearch%2Dbutton%7Bdisplay%3Ablock%3Bfloat%3Aleft%3Bwidth%3A26px%3Bheight%3A26px%3Bbackground%3Aurl%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABQAAABGCAYAAADMz7TxAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk%2FcWPt%2F3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371%2Fu855zn%2FM55zw%2BAERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh%2BdLA%2F%2FAGvbwACAHDVLiQSx%2BH%2Fg7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK%2F4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO%2F0xaL%2Ba%2FBvIj4h8d%2F%2BvIwCBAAQTs%2Fv2l%2Fl5dYDcMcBsHW%2Fa6lbANpWAGjf%2BV0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s%2B%2FzPhb%2BCLfvb8QB7%2B23rwAHGaQJmtwKOD%2FXFhbnauUo7nywRCMW735yP%2Bx4V%2F%2FY4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk%2FATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO%2F%2BY9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II%2FItchQ5jVxA%2BpDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS%2Bh1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE%2BwIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE%2B0JXoS%2BcR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE%2BS%2B8nD5LcUOsWI4kwJoiRSpJQSSjVlP%2BUEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL%2Bl0ugndgx5Fl9CX0mvoB%2Bnn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS%2BZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U%2F1XmqC1SrVQ%2BrXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O%2BX%2F2C%2BmMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF%2Bxt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0%2FLbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY%2Bt56Qn1yvUO6d3RR%2FVt9KP1F%2Brv1u%2FRHzcwNAg2kBlsMThj8MyQY%2BhrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ%2BM1eBc%2BZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82%2FyNhaVFnMVKizaLx5balnzLBZZNlvesmFY%2BVnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10%2FWjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo%2BPWX6zukDPsY%2BAp96n4e%2Bpr4i3z2%2BI37Wfpl%2BB%2Fye%2Bzv6y%2F2P%2BL%2FhefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG%2FljM9xnLJrRFcoInRVaG%2FowzCZMHtYRjobPCN8Qfm%2Bm%2BUzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y%2BpjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h%2FhF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I%2F5YMgQlAvGE%2Flp25NHRPyhJuFT0W%2Boo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI%2Flz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b%2B6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV%2BscKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb%2BvSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2%2FKhNqP2ep1%2FXctW%2Fa2rt77ZJtrWv913e%2FMOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur%2Fmft24R3dPxZ6Pe6V7B%2FZF7%2BtqdG9s3K%2B%2Fv7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e%2BNQ6KHOw9zDzd%2BZf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe%2Bt%2F9%2B7zHjY3XHNY9XnqCdKD3x%2BeSCk%2BOnZKeenU4%2FPdSZ3Hn3TPyZa11RXb1nQ8%2BePxd07ky3X%2FfJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2%2FrZffL7Vc8rnT0Tes70e%2FTf%2FpqwNVz1%2FjXLl2feb3vxuwbt24m3Ry4Jbr1%2BHb27Rd3Cu5M3F16j3iv%2FL7a%2FeoH%2Bg%2Fqf7T%2BsWXAbeD4YMBgz8NZD%2B8OCYee%2FpT%2F04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W%2F3nrc6vn3%2F3i%2B0vPWPzY8Av5i8%2B%2Frnmp83Lvq6mvOscjxx%2B8znk98ab8rc7bfe%2B477rfx70fmSj8QP5Q89H6Y8en0E%2F3Pud8%2Fvwv94Tz%2B4A5JREAAAAGYktHRAD%2FAP8A%2F6C9p5MAAAAJcEhZcwAAD2EAAA9hAag%2Fp2kAAAAHdElNRQfdCR0OKzSQTWy0AAAEPElEQVRYw%2B2XXWhbZRjHf8vH7I6b2eqihLItXYgKTfuCClurOMUJboIyGV75gkLdja43IujFELxwV8KYV0KFwXsh%2BAHiTZkoohYUHGM7S4c2ZongPFvjUk%2B1J93apN48iYf0JP0wiBd5IOTkPe%2F7f77%2Bz%2FmfwP%2FdNrW5dxtwF9Ajv6vAdWB%2BvYBRYBA4AowAO2XfPHAe%2BBSYBCprjfo54FvgJnALmAGuAX8BNaAAvAFsCzoc9l2HgAPAW8CDwI%2FAOHAG%2BAy4CGwG7gMGABe4IE4CbSfwvkQ1CTwFRJoc3g98ACzKnky7VB8DikAZGJWmBNlBib4CvNzch5DvejewHbgCfCM1DLLvgB%2Bk%2B7t9LFgBGBVvLrDQJpN5YK7pTCDgonzvaNVBsW2yx38mEPBnYBZIAU%2BI9yDejgD7pIZXAK%2BV5%2B3S5YpQ5Blgqy%2BlHmA%2F8JFMzTlgqB0PF6TDGaHHPiAJ9Ar3jgCvSJdD8imsxsUQcBj4HPhDanTTNzUeUJL1GjANvADcHhQhwLLU5ZwcXJauX5NoPpGULWCvDEMG%2BFMiXW5H9ChwJ9AvjUrI6G0CHgbOSuQ14Cd5Bvwre1RKUxNevkrTrK7XvpZausBvwMd0rWsd1mWtdaAuG2PWp8ta6zXpsjGmspqMAqCUOgq8KbO5R2baAnaJg0eAqFLqom3bt1pGqLUOyeZ3AAVclmiyMmJ7RVr3A78DbwPjxpglP6B%2FlnsBLel%2BD5wEztYPiMOvgNeAo8Dzos3ZVpoyCDwurxxngC%2F83o0xNWPMeZGJPPAAcEBrvTZdNsb8N7ostOmcLmutN6bLwsdmsBW6bIzxWgFOAV%2BKbrwIHNZab60XXWvdI0CjIq%2BXpZ7BxLZte0EpFajLSqmWuqyUumDbdi1wUpRSvwIOcDeQBoaBp4FnhfRxachmqfO9gKuUytm2vbgC0LbtZaXUhnRZIl1u97SJAnfIJyRvDTeksw8BJ0RKo0AOOGGM%2BTDShm%2BLAnAj4Pak1vqkcPCgvATs6upy1zopo8VioW%2B2XD7uuu4hz%2FOGgAXLsqZjsdjEjt7ed5PJ%2FqtrBsxmLx1zHOeU53lbgg5YllVJJBJjmczg%2BKqA2eylY78Ui%2B8tVatt04qEw%2BxJJl8KAg3503Qc51QdLB6PrwCqry1VqziOc7pYLPS1BJwtl8fqacbjcYaHRxgY%2BOff68BAhuHhkQao53lbZsvl4yuir1%2B4rvtk%2FbpUKpHP50mlUo2NqVSKfD5PqVTCd%2BYQ8HogoOd59%2FhvTE1lG0AA%2BXy%2BsdbqTLOmdMQiPjpMu3NzQ%2F6a1dP0R%2BqP0rKs6ZaAsVhsog4Yj8cbYH6AVCrFzMz1Rh1jsdhESx4Wi4W%2BXC6X83fa34DmNcuyKul0Ot08NY0aJpP9VxOJxFgkHG50utnqa5FwmEQiMRY0gkGjN%2Bo4zumOjF4nHg5d69oG7G9LxrhhWXdE7gAAAABJRU5ErkJggg%3D%3D%29%20no%2Drepeat%202px%202px%20%23fff%3Bborder%2Dradius%3A4px%7D%2Eleaflet%2Dcontrol%2Dsearch%20%2Esearch%2Dbutton%3Ahover%7Bbackground%3Aurl%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABQAAABGCAYAAADMz7TxAAAKQ2lDQ1BJQ0MgcHJvZmlsZQAAeNqdU3dYk%2FcWPt%2F3ZQ9WQtjwsZdsgQAiI6wIyBBZohCSAGGEEBJAxYWIClYUFRGcSFXEgtUKSJ2I4qAouGdBiohai1VcOO4f3Ke1fXrv7e371%2Fu855zn%2FM55zw%2BAERImkeaiagA5UoU8Otgfj09IxMm9gAIVSOAEIBDmy8JnBcUAAPADeXh%2BdLA%2F%2FAGvbwACAHDVLiQSx%2BH%2Fg7pQJlcAIJEA4CIS5wsBkFIAyC5UyBQAyBgAsFOzZAoAlAAAbHl8QiIAqg0A7PRJPgUA2KmT3BcA2KIcqQgAjQEAmShHJAJAuwBgVYFSLALAwgCgrEAiLgTArgGAWbYyRwKAvQUAdo5YkA9AYACAmUIszAAgOAIAQx4TzQMgTAOgMNK%2F4KlfcIW4SAEAwMuVzZdL0jMUuJXQGnfy8ODiIeLCbLFCYRcpEGYJ5CKcl5sjE0jnA0zODAAAGvnRwf44P5Dn5uTh5mbnbO%2F0xaL%2Ba%2FBvIj4h8d%2F%2BvIwCBAAQTs%2Fv2l%2Fl5dYDcMcBsHW%2Fa6lbANpWAGjf%2BV0z2wmgWgrQevmLeTj8QB6eoVDIPB0cCgsL7SViob0w44s%2B%2FzPhb%2BCLfvb8QB7%2B23rwAHGaQJmtwKOD%2FXFhbnauUo7nywRCMW735yP%2Bx4V%2F%2FY4p0eI0sVwsFYrxWIm4UCJNx3m5UpFEIcmV4hLpfzLxH5b9CZN3DQCshk%2FATrYHtctswH7uAQKLDljSdgBAfvMtjBoLkQAQZzQyefcAAJO%2F%2BY9AKwEAzZek4wAAvOgYXKiUF0zGCAAARKCBKrBBBwzBFKzADpzBHbzAFwJhBkRADCTAPBBCBuSAHAqhGJZBGVTAOtgEtbADGqARmuEQtMExOA3n4BJcgetwFwZgGJ7CGLyGCQRByAgTYSE6iBFijtgizggXmY4EImFINJKApCDpiBRRIsXIcqQCqUJqkV1II%2FItchQ5jVxA%2BpDbyCAyivyKvEcxlIGyUQPUAnVAuagfGorGoHPRdDQPXYCWomvRGrQePYC2oqfRS%2Bh1dAB9io5jgNExDmaM2WFcjIdFYIlYGibHFmPlWDVWjzVjHVg3dhUbwJ5h7wgkAouAE%2BwIXoQQwmyCkJBHWExYQ6gl7CO0EroIVwmDhDHCJyKTqE%2B0JXoS%2BcR4YjqxkFhGrCbuIR4hniVeJw4TX5NIJA7JkuROCiElkDJJC0lrSNtILaRTpD7SEGmcTCbrkG3J3uQIsoCsIJeRt5APkE%2BS%2B8nD5LcUOsWI4kwJoiRSpJQSSjVlP%2BUEpZ8yQpmgqlHNqZ7UCKqIOp9aSW2gdlAvU4epEzR1miXNmxZDy6Qto9XQmmlnafdoL%2Bl0ugndgx5Fl9CX0mvoB%2Bnn6YP0dwwNhg2Dx0hiKBlrGXsZpxi3GS%2BZTKYF05eZyFQw1zIbmWeYD5hvVVgq9ip8FZHKEpU6lVaVfpXnqlRVc1U%2F1XmqC1SrVQ%2BrXlZ9pkZVs1DjqQnUFqvVqR1Vu6k2rs5Sd1KPUM9RX6O%2BX%2F2C%2BmMNsoaFRqCGSKNUY7fGGY0hFsYyZfFYQtZyVgPrLGuYTWJbsvnsTHYF%2Bxt2L3tMU0NzqmasZpFmneZxzQEOxrHg8DnZnErOIc4NznstAy0%2FLbHWaq1mrX6tN9p62r7aYu1y7Rbt69rvdXCdQJ0snfU6bTr3dQm6NrpRuoW623XP6j7TY%2Bt56Qn1yvUO6d3RR%2FVt9KP1F%2Brv1u%2FRHzcwNAg2kBlsMThj8MyQY%2BhrmGm40fCE4agRy2i6kcRoo9FJoye4Ju6HZ%2BM1eBc%2BZqxvHGKsNN5l3Gs8YWJpMtukxKTF5L4pzZRrmma60bTTdMzMyCzcrNisyeyOOdWca55hvtm82%2FyNhaVFnMVKizaLx5balnzLBZZNlvesmFY%2BVnlW9VbXrEnWXOss623WV2xQG1ebDJs6m8u2qK2brcR2m23fFOIUjynSKfVTbtox7PzsCuya7AbtOfZh9iX2bfbPHcwcEh3WO3Q7fHJ0dcx2bHC866ThNMOpxKnD6VdnG2ehc53zNRemS5DLEpd2lxdTbaeKp26fesuV5RruutK10%2FWjm7ub3K3ZbdTdzD3Ffav7TS6bG8ldwz3vQfTw91jicczjnaebp8LzkOcvXnZeWV77vR5Ps5wmntYwbcjbxFvgvct7YDo%2BPWX6zukDPsY%2BAp96n4e%2Bpr4i3z2%2BI37Wfpl%2BB%2Fye%2Bzv6y%2F2P%2BL%2FhefIW8U4FYAHBAeUBvYEagbMDawMfBJkEpQc1BY0FuwYvDD4VQgwJDVkfcpNvwBfyG%2FljM9xnLJrRFcoInRVaG%2FowzCZMHtYRjobPCN8Qfm%2Bm%2BUzpzLYIiOBHbIi4H2kZmRf5fRQpKjKqLupRtFN0cXT3LNas5Fn7Z72O8Y%2BpjLk722q2cnZnrGpsUmxj7Ju4gLiquIF4h%2FhF8ZcSdBMkCe2J5MTYxD2J43MC52yaM5zkmlSWdGOu5dyiuRfm6c7Lnnc8WTVZkHw4hZgSl7I%2F5YMgQlAvGE%2Flp25NHRPyhJuFT0W%2Boo2iUbG3uEo8kuadVpX2ON07fUP6aIZPRnXGMwlPUit5kRmSuSPzTVZE1t6sz9lx2S05lJyUnKNSDWmWtCvXMLcot09mKyuTDeR55m3KG5OHyvfkI%2Flz89sVbIVM0aO0Uq5QDhZML6greFsYW3i4SL1IWtQz32b%2B6vkjC4IWfL2QsFC4sLPYuHhZ8eAiv0W7FiOLUxd3LjFdUrpkeGnw0n3LaMuylv1Q4lhSVfJqedzyjlKD0qWlQyuCVzSVqZTJy26u9Fq5YxVhlWRV72qX1VtWfyoXlV%2BscKyorviwRrjm4ldOX9V89Xlt2treSrfK7etI66Trbqz3Wb%2BvSr1qQdXQhvANrRvxjeUbX21K3nShemr1js20zcrNAzVhNe1bzLas2%2FKhNqP2ep1%2FXctW%2Fa2rt77ZJtrWv913e%2FMOgx0VO97vlOy8tSt4V2u9RX31btLugt2PGmIbur%2Fmft24R3dPxZ6Pe6V7B%2FZF7%2BtqdG9s3K%2B%2Fv7IJbVI2jR5IOnDlm4Bv2pvtmne1cFoqDsJB5cEn36Z8e%2BNQ6KHOw9zDzd%2BZf7f1COtIeSvSOr91rC2jbaA9ob3v6IyjnR1eHUe%2Bt%2F9%2B7zHjY3XHNY9XnqCdKD3x%2BeSCk%2BOnZKeenU4%2FPdSZ3Hn3TPyZa11RXb1nQ8%2BePxd07ky3X%2FfJ897nj13wvHD0Ivdi2yW3S609rj1HfnD94UivW2%2FrZffL7Vc8rnT0Tes70e%2FTf%2FpqwNVz1%2FjXLl2feb3vxuwbt24m3Ry4Jbr1%2BHb27Rd3Cu5M3F16j3iv%2FL7a%2FeoH%2Bg%2Fqf7T%2BsWXAbeD4YMBgz8NZD%2B8OCYee%2FpT%2F04fh0kfMR9UjRiONj50fHxsNGr3yZM6T4aeypxPPyn5W%2F3nrc6vn3%2F3i%2B0vPWPzY8Av5i8%2B%2Frnmp83Lvq6mvOscjxx%2B8znk98ab8rc7bfe%2B477rfx70fmSj8QP5Q89H6Y8en0E%2F3Pud8%2Fvwv94Tz%2B4A5JREAAAAGYktHRAD%2FAP8A%2F6C9p5MAAAAJcEhZcwAAD2EAAA9hAag%2Fp2kAAAAHdElNRQfdCR0OKzSQTWy0AAAEPElEQVRYw%2B2XXWhbZRjHf8vH7I6b2eqihLItXYgKTfuCClurOMUJboIyGV75gkLdja43IujFELxwV8KYV0KFwXsh%2BAHiTZkoohYUHGM7S4c2ZongPFvjUk%2B1J93apN48iYf0JP0wiBd5IOTkPe%2F7f77%2Bz%2FmfwP%2FdNrW5dxtwF9Ajv6vAdWB%2BvYBRYBA4AowAO2XfPHAe%2BBSYBCprjfo54FvgJnALmAGuAX8BNaAAvAFsCzoc9l2HgAPAW8CDwI%2FAOHAG%2BAy4CGwG7gMGABe4IE4CbSfwvkQ1CTwFRJoc3g98ACzKnky7VB8DikAZGJWmBNlBib4CvNzch5DvejewHbgCfCM1DLLvgB%2Bk%2B7t9LFgBGBVvLrDQJpN5YK7pTCDgonzvaNVBsW2yx38mEPBnYBZIAU%2BI9yDejgD7pIZXAK%2BV5%2B3S5YpQ5Blgqy%2BlHmA%2F8JFMzTlgqB0PF6TDGaHHPiAJ9Ar3jgCvSJdD8imsxsUQcBj4HPhDanTTNzUeUJL1GjANvADcHhQhwLLU5ZwcXJauX5NoPpGULWCvDEMG%2BFMiXW5H9ChwJ9AvjUrI6G0CHgbOSuQ14Cd5Bvwre1RKUxNevkrTrK7XvpZausBvwMd0rWsd1mWtdaAuG2PWp8ta6zXpsjGmspqMAqCUOgq8KbO5R2baAnaJg0eAqFLqom3bt1pGqLUOyeZ3AAVclmiyMmJ7RVr3A78DbwPjxpglP6B%2FlnsBLel%2BD5wEztYPiMOvgNeAo8Dzos3ZVpoyCDwurxxngC%2F83o0xNWPMeZGJPPAAcEBrvTZdNsb8N7ostOmcLmutN6bLwsdmsBW6bIzxWgFOAV%2BKbrwIHNZab60XXWvdI0CjIq%2BXpZ7BxLZte0EpFajLSqmWuqyUumDbdi1wUpRSvwIOcDeQBoaBp4FnhfRxachmqfO9gKuUytm2vbgC0LbtZaXUhnRZIl1u97SJAnfIJyRvDTeksw8BJ0RKo0AOOGGM%2BTDShm%2BLAnAj4Pak1vqkcPCgvATs6upy1zopo8VioW%2B2XD7uuu4hz%2FOGgAXLsqZjsdjEjt7ed5PJ%2FqtrBsxmLx1zHOeU53lbgg5YllVJJBJjmczg%2BKqA2eylY78Ui%2B8tVatt04qEw%2BxJJl8KAg3503Qc51QdLB6PrwCqry1VqziOc7pYLPS1BJwtl8fqacbjcYaHRxgY%2BOff68BAhuHhkQao53lbZsvl4yuir1%2B4rvtk%2FbpUKpHP50mlUo2NqVSKfD5PqVTCd%2BYQ8HogoOd59%2FhvTE1lG0AA%2BXy%2BsdbqTLOmdMQiPjpMu3NzQ%2F6a1dP0R%2BqP0rKs6ZaAsVhsog4Yj8cbYH6AVCrFzMz1Rh1jsdhESx4Wi4W%2BXC6X83fa34DmNcuyKul0Ot08NY0aJpP9VxOJxFgkHG50utnqa5FwmEQiMRY0gkGjN%2Bo4zumOjF4nHg5d69oG7G9LxrhhWXdE7gAAAABJRU5ErkJggg%3D%3D%29%20no%2Drepeat%202px%20%2D22px%20%23fafafa%7D%2Eleaflet%2Dcontrol%2Dsearch%20%2Esearch%2Dtooltip%7Bposition%3Aabsolute%3Btop%3A100%25%3Bleft%3A0%3Bfloat%3Aleft%3Blist%2Dstyle%3Anone%3Bpadding%2Dleft%3A0%3Bmin%2Dwidth%3A120px%3Bmax%2Dheight%3A122px%3Bbox%2Dshadow%3A1px%201px%206px%20rgba%280%2C0%2C0%2C%2E4%29%3Bbackground%2Dcolor%3Argba%280%2C0%2C0%2C%2E25%29%3Bz%2Dindex%3A1010%3Boverflow%2Dy%3Aauto%3Boverflow%2Dx%3Ahidden%3Bcursor%3Apointer%7D%2Eleaflet%2Dcontrol%2Dsearch%20%2Esearch%2Dtip%7Bmargin%3A2px%3Bpadding%3A2px%204px%3Bdisplay%3Ablock%3Bcolor%3A%23000%3Bbackground%3A%23eee%3Bborder%2Dradius%3A%2E25em%3Btext%2Ddecoration%3Anone%3Bwhite%2Dspace%3Anowrap%3Bvertical%2Dalign%3Acenter%7D%2Eleaflet%2Dcontrol%2Dsearch%20%2Esearch%2Dbutton%3Ahover%7Bbackground%2Dcolor%3A%23f4f4f4%7D%2Eleaflet%2Dcontrol%2Dsearch%20%2Esearch%2Dtip%2Dselect%2C%2Eleaflet%2Dcontrol%2Dsearch%20%2Esearch%2Dtip%3Ahover%7Bbackground%2Dcolor%3A%23fff%7D%2Eleaflet%2Dcontrol%2Dsearch%20%2Esearch%2Dalert%7Bcursor%3Apointer%3Bclear%3Aboth%3Bfont%2Dsize%3A%2E75em%3Bmargin%2Dbottom%3A5px%3Bpadding%3A0%20%2E25em%3Bcolor%3A%23e00%3Bfont%2Dweight%3A700%3Bborder%2Dradius%3A%2E25em%7D%0A" rel="stylesheet" />
<script src="data:application/javascript;base64,IWZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIGkobyl7aWYoZVtvXSlyZXR1cm4gZVtvXS5leHBvcnRzO3ZhciBzPWVbb109e2k6byxsOiExLGV4cG9ydHM6e319O3JldHVybiB0W29dLmNhbGwocy5leHBvcnRzLHMscy5leHBvcnRzLGkpLHMubD0hMCxzLmV4cG9ydHN9aS5tPXQsaS5jPWUsaS5kPWZ1bmN0aW9uKHQsZSxvKXtpLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsZ2V0Om99KX0saS5yPWZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0saS5uPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiB0LmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O3JldHVybiBpLmQoZSwiYSIsZSksZX0saS5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxpLnA9IiIsaShpLnM9NCl9KFssZnVuY3Rpb24odCxlLGkpe30sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9TH0sZnVuY3Rpb24odCxlLG8pe3ZhciBzLG4scjtuPVtvKDIpXSx2b2lkIDA9PT0ocj0iZnVuY3Rpb24iPT10eXBlb2Yocz1mdW5jdGlvbih0KXtyZXR1cm4gdC5Db250cm9sLlNlYXJjaD10LkNvbnRyb2wuZXh0ZW5kKHtpbmNsdWRlczoiMSI9PT10LnZlcnNpb25bMF0/dC5FdmVudGVkLnByb3RvdHlwZTp0Lk1peGluLkV2ZW50cyxvcHRpb25zOnt1cmw6IiIsbGF5ZXI6bnVsbCxzb3VyY2VEYXRhOm51bGwsanNvbnBQYXJhbTpudWxsLHByb3BlcnR5TG9jOiJsb2MiLHByb3BlcnR5TmFtZToidGl0bGUiLGZvcm1hdERhdGE6bnVsbCxmaWx0ZXJEYXRhOm51bGwsbW92ZVRvTG9jYXRpb246bnVsbCxidWlsZFRpcDpudWxsLGNvbnRhaW5lcjoiIix6b29tOm51bGwsbWluTGVuZ3RoOjEsaW5pdGlhbDohMCxjYXNlc2Vuc2l0aXZlOiExLGF1dG9UeXBlOiEwLGRlbGF5VHlwZTo0MDAsdG9vbHRpcExpbWl0Oi0xLHRpcEF1dG9TdWJtaXQ6ITAsZmlyc3RUaXBTdWJtaXQ6ITEsYXV0b1Jlc2l6ZTohMCxjb2xsYXBzZWQ6ITAsYXV0b0NvbGxhcHNlOiExLGF1dG9Db2xsYXBzZVRpbWU6MTIwMCx0ZXh0RXJyOiJMb2NhdGlvbiBub3QgZm91bmQiLHRleHRDYW5jZWw6IkNhbmNlbCIsdGV4dFBsYWNlaG9sZGVyOiJTZWFyY2guLi4iLGhpZGVNYXJrZXJPbkNvbGxhcHNlOiExLHBvc2l0aW9uOiJ0b3BsZWZ0IixtYXJrZXI6e2ljb246ITEsYW5pbWF0ZTohMCxjaXJjbGU6e3JhZGl1czoxMCx3ZWlnaHQ6Myxjb2xvcjoiI2UwMyIsc3Ryb2tlOiEwLGZpbGw6ITF9fX0sX2dldFBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLnNwbGl0KCIuIiksbz1pLnBvcCgpLHM9aS5sZW5ndGgsbj1pWzBdLHI9MTtpZihzPjApZm9yKDsodD10W25dKSYmcjxzOyluPWlbcisrXTtpZih0KXJldHVybiB0W29dfSxfaXNPYmplY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9LGluaXRpYWxpemU6ZnVuY3Rpb24oZSl7dC5VdGlsLnNldE9wdGlvbnModGhpcyxlfHx7fSksdGhpcy5faW5wdXRNaW5TaXplPXRoaXMub3B0aW9ucy50ZXh0UGxhY2Vob2xkZXI/dGhpcy5vcHRpb25zLnRleHRQbGFjZWhvbGRlci5sZW5ndGg6MTAsdGhpcy5fbGF5ZXI9dGhpcy5vcHRpb25zLmxheWVyfHxuZXcgdC5MYXllckdyb3VwLHRoaXMuX2ZpbHRlckRhdGE9dGhpcy5vcHRpb25zLmZpbHRlckRhdGF8fHRoaXMuX2RlZmF1bHRGaWx0ZXJEYXRhLHRoaXMuX2Zvcm1hdERhdGE9dGhpcy5vcHRpb25zLmZvcm1hdERhdGF8fHRoaXMuX2RlZmF1bHRGb3JtYXREYXRhLHRoaXMuX21vdmVUb0xvY2F0aW9uPXRoaXMub3B0aW9ucy5tb3ZlVG9Mb2NhdGlvbnx8dGhpcy5fZGVmYXVsdE1vdmVUb0xvY2F0aW9uLHRoaXMuX2F1dG9UeXBlVG1wPXRoaXMub3B0aW9ucy5hdXRvVHlwZSx0aGlzLl9jb3VudGVydGlwcz0wLHRoaXMuX3JlY29yZHNDYWNoZT17fSx0aGlzLl9jdXJSZXE9bnVsbH0sb25BZGQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX21hcD1lLHRoaXMuX2NvbnRhaW5lcj10LkRvbVV0aWwuY3JlYXRlKCJkaXYiLCJsZWFmbGV0LWNvbnRyb2wtc2VhcmNoIiksdGhpcy5faW5wdXQ9dGhpcy5fY3JlYXRlSW5wdXQodGhpcy5vcHRpb25zLnRleHRQbGFjZWhvbGRlciwic2VhcmNoLWlucHV0IiksdGhpcy5fdG9vbHRpcD10aGlzLl9jcmVhdGVUb29sdGlwKCJzZWFyY2gtdG9vbHRpcCIpLHRoaXMuX2NhbmNlbD10aGlzLl9jcmVhdGVDYW5jZWwodGhpcy5vcHRpb25zLnRleHRDYW5jZWwsInNlYXJjaC1jYW5jZWwiKSx0aGlzLl9idXR0b249dGhpcy5fY3JlYXRlQnV0dG9uKHRoaXMub3B0aW9ucy50ZXh0UGxhY2Vob2xkZXIsInNlYXJjaC1idXR0b24iKSx0aGlzLl9hbGVydD10aGlzLl9jcmVhdGVBbGVydCgic2VhcmNoLWFsZXJ0IiksITE9PT10aGlzLm9wdGlvbnMuY29sbGFwc2VkJiZ0aGlzLmV4cGFuZCh0aGlzLm9wdGlvbnMuY29sbGFwc2VkKSx0aGlzLm9wdGlvbnMubWFya2VyJiYodGhpcy5vcHRpb25zLm1hcmtlciBpbnN0YW5jZW9mIHQuTWFya2VyfHx0aGlzLm9wdGlvbnMubWFya2VyIGluc3RhbmNlb2YgdC5DaXJjbGVNYXJrZXI/dGhpcy5fbWFya2VyU2VhcmNoPXRoaXMub3B0aW9ucy5tYXJrZXI6dGhpcy5faXNPYmplY3QodGhpcy5vcHRpb25zLm1hcmtlcikmJih0aGlzLl9tYXJrZXJTZWFyY2g9bmV3IHQuQ29udHJvbC5TZWFyY2guTWFya2VyKFswLDBdLHRoaXMub3B0aW9ucy5tYXJrZXIpKSx0aGlzLl9tYXJrZXJTZWFyY2guX2lzTWFya2VyU2VhcmNoPSEwKSx0aGlzLnNldExheWVyKHRoaXMuX2xheWVyKSxlLm9uKHtyZXNpemU6dGhpcy5faGFuZGxlQXV0b3Jlc2l6ZX0sdGhpcyksdGhpcy5fY29udGFpbmVyfSxhZGRUbzpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vcHRpb25zLmNvbnRhaW5lcj8odGhpcy5fY29udGFpbmVyPXRoaXMub25BZGQoZSksdGhpcy5fd3JhcHBlcj10LkRvbVV0aWwuZ2V0KHRoaXMub3B0aW9ucy5jb250YWluZXIpLHRoaXMuX3dyYXBwZXIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIix0aGlzLl93cmFwcGVyLmFwcGVuZENoaWxkKHRoaXMuX2NvbnRhaW5lcikpOnQuQ29udHJvbC5wcm90b3R5cGUuYWRkVG8uY2FsbCh0aGlzLGUpLHRoaXN9LG9uUmVtb3ZlOmZ1bmN0aW9uKHQpe3RoaXMuX3JlY29yZHNDYWNoZT17fX0sc2V0TGF5ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xheWVyPXQsdGhpcy5fbGF5ZXIuYWRkVG8odGhpcy5fbWFwKSx0aGlzfSxzaG93QWxlcnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdD10fHx0aGlzLm9wdGlvbnMudGV4dEVycix0aGlzLl9hbGVydC5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5fYWxlcnQuaW5uZXJIVE1MPXQsY2xlYXJUaW1lb3V0KHRoaXMudGltZXJBbGVydCksdGhpcy50aW1lckFsZXJ0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmhpZGVBbGVydCgpfSx0aGlzLm9wdGlvbnMuYXV0b0NvbGxhcHNlVGltZSksdGhpc30saGlkZUFsZXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FsZXJ0LnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXN9LGNhbmNlbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnB1dC52YWx1ZT0iIix0aGlzLl9oYW5kbGVLZXlwcmVzcyh7a2V5Q29kZTo4fSksdGhpcy5faW5wdXQuc2l6ZT10aGlzLl9pbnB1dE1pblNpemUsdGhpcy5faW5wdXQuZm9jdXMoKSx0aGlzLl9jYW5jZWwuc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5faGlkZVRvb2x0aXAoKSx0aGlzfSxleHBhbmQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ImJvb2xlYW4iIT10eXBlb2YgZXx8ZSx0aGlzLl9pbnB1dC5zdHlsZS5kaXNwbGF5PSJibG9jayIsdC5Eb21VdGlsLmFkZENsYXNzKHRoaXMuX2NvbnRhaW5lciwic2VhcmNoLWV4cCIpLCExIT09ZSYmKHRoaXMuX2lucHV0LmZvY3VzKCksdGhpcy5fbWFwLm9uKCJkcmFnc3RhcnQgY2xpY2siLHRoaXMuY29sbGFwc2UsdGhpcykpLHRoaXMuZmlyZSgic2VhcmNoOmV4cGFuZGVkIiksdGhpc30sY29sbGFwc2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGlkZVRvb2x0aXAoKSx0aGlzLmNhbmNlbCgpLHRoaXMuX2FsZXJ0LnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuX2lucHV0LmJsdXIoKSx0aGlzLm9wdGlvbnMuY29sbGFwc2VkJiYodGhpcy5faW5wdXQuc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5fY2FuY2VsLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHQuRG9tVXRpbC5yZW1vdmVDbGFzcyh0aGlzLl9jb250YWluZXIsInNlYXJjaC1leHAiKSx0aGlzLm9wdGlvbnMuaGlkZU1hcmtlck9uQ29sbGFwc2UmJnRoaXMuX21hcC5yZW1vdmVMYXllcih0aGlzLl9tYXJrZXJTZWFyY2gpLHRoaXMuX21hcC5vZmYoImRyYWdzdGFydCBjbGljayIsdGhpcy5jb2xsYXBzZSx0aGlzKSksdGhpcy5maXJlKCJzZWFyY2g6Y29sbGFwc2VkIiksdGhpc30sY29sbGFwc2VEZWxheWVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5vcHRpb25zLmF1dG9Db2xsYXBzZT8oY2xlYXJUaW1lb3V0KHRoaXMudGltZXJDb2xsYXBzZSksdGhpcy50aW1lckNvbGxhcHNlPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmNvbGxhcHNlKCl9LHRoaXMub3B0aW9ucy5hdXRvQ29sbGFwc2VUaW1lKSx0aGlzKTp0aGlzfSxjb2xsYXBzZURlbGF5ZWRTdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyQ29sbGFwc2UpLHRoaXN9LF9jcmVhdGVBbGVydDpmdW5jdGlvbihlKXt2YXIgaT10LkRvbVV0aWwuY3JlYXRlKCJkaXYiLGUsdGhpcy5fY29udGFpbmVyKTtyZXR1cm4gaS5zdHlsZS5kaXNwbGF5PSJub25lIix0LkRvbUV2ZW50Lm9uKGksImNsaWNrIix0LkRvbUV2ZW50LnN0b3AsdGhpcykub24oaSwiY2xpY2siLHRoaXMuaGlkZUFsZXJ0LHRoaXMpLGl9LF9jcmVhdGVJbnB1dDpmdW5jdGlvbihlLGkpe3ZhciBvPXQuRG9tVXRpbC5jcmVhdGUoImxhYmVsIixpLHRoaXMuX2NvbnRhaW5lcikscz10LkRvbVV0aWwuY3JlYXRlKCJpbnB1dCIsaSx0aGlzLl9jb250YWluZXIpO3JldHVybiBzLnR5cGU9InRleHQiLHMuc2l6ZT10aGlzLl9pbnB1dE1pblNpemUscy52YWx1ZT0iIixzLmF1dG9jb21wbGV0ZT0ib2ZmIixzLmF1dG9jb3JyZWN0PSJvZmYiLHMuYXV0b2NhcGl0YWxpemU9Im9mZiIscy5wbGFjZWhvbGRlcj1lLHMuc3R5bGUuZGlzcGxheT0ibm9uZSIscy5yb2xlPSJzZWFyY2giLHMuaWQ9cy5yb2xlK3MudHlwZStzLnNpemUsby5odG1sRm9yPXMuaWQsby5zdHlsZS5kaXNwbGF5PSJub25lIixvLnZhbHVlPWUsdC5Eb21FdmVudC5kaXNhYmxlQ2xpY2tQcm9wYWdhdGlvbihzKS5vbihzLCJrZXl1cCIsdGhpcy5faGFuZGxlS2V5cHJlc3MsdGhpcykub24ocywiYmx1ciIsdGhpcy5jb2xsYXBzZURlbGF5ZWQsdGhpcykub24ocywiZm9jdXMiLHRoaXMuY29sbGFwc2VEZWxheWVkU3RvcCx0aGlzKSxzfSxfY3JlYXRlQ2FuY2VsOmZ1bmN0aW9uKGUsaSl7dmFyIG89dC5Eb21VdGlsLmNyZWF0ZSgiYSIsaSx0aGlzLl9jb250YWluZXIpO3JldHVybiBvLmhyZWY9IiMiLG8udGl0bGU9ZSxvLnN0eWxlLmRpc3BsYXk9Im5vbmUiLG8uaW5uZXJIVE1MPSI8c3Bhbj4mb3RpbWVzOzwvc3Bhbj4iLHQuRG9tRXZlbnQub24obywiY2xpY2siLHQuRG9tRXZlbnQuc3RvcCx0aGlzKS5vbihvLCJjbGljayIsdGhpcy5jYW5jZWwsdGhpcyksb30sX2NyZWF0ZUJ1dHRvbjpmdW5jdGlvbihlLGkpe3ZhciBvPXQuRG9tVXRpbC5jcmVhdGUoImEiLGksdGhpcy5fY29udGFpbmVyKTtyZXR1cm4gby5ocmVmPSIjIixvLnRpdGxlPWUsdC5Eb21FdmVudC5vbihvLCJjbGljayIsdC5Eb21FdmVudC5zdG9wLHRoaXMpLm9uKG8sImNsaWNrIix0aGlzLl9oYW5kbGVTdWJtaXQsdGhpcykub24obywiZm9jdXMiLHRoaXMuY29sbGFwc2VEZWxheWVkU3RvcCx0aGlzKS5vbihvLCJibHVyIix0aGlzLmNvbGxhcHNlRGVsYXllZCx0aGlzKSxvfSxfY3JlYXRlVG9vbHRpcDpmdW5jdGlvbihlKXt2YXIgaT10aGlzLG89dC5Eb21VdGlsLmNyZWF0ZSgidWwiLGUsdGhpcy5fY29udGFpbmVyKTtyZXR1cm4gby5zdHlsZS5kaXNwbGF5PSJub25lIix0LkRvbUV2ZW50LmRpc2FibGVDbGlja1Byb3BhZ2F0aW9uKG8pLm9uKG8sImJsdXIiLHRoaXMuY29sbGFwc2VEZWxheWVkLHRoaXMpLm9uKG8sIm1vdXNld2hlZWwiLGZ1bmN0aW9uKGUpe2kuY29sbGFwc2VEZWxheWVkU3RvcCgpLHQuRG9tRXZlbnQuc3RvcFByb3BhZ2F0aW9uKGUpfSx0aGlzKS5vbihvLCJtb3VzZW92ZXIiLGZ1bmN0aW9uKHQpe2kuY29sbGFwc2VEZWxheWVkU3RvcCgpfSx0aGlzKSxvfSxfY3JlYXRlVGlwOmZ1bmN0aW9uKGUsaSl7dmFyIG87aWYodGhpcy5vcHRpb25zLmJ1aWxkVGlwKXtpZigic3RyaW5nIj09dHlwZW9mKG89dGhpcy5vcHRpb25zLmJ1aWxkVGlwLmNhbGwodGhpcyxlLGkpKSl7dmFyIHM9dC5Eb21VdGlsLmNyZWF0ZSgiZGl2Iik7cy5pbm5lckhUTUw9byxvPXMuZmlyc3RDaGlsZH19ZWxzZShvPXQuRG9tVXRpbC5jcmVhdGUoImxpIiwiIikpLmlubmVySFRNTD1lO3JldHVybiB0LkRvbVV0aWwuYWRkQ2xhc3Mobywic2VhcmNoLXRpcCIpLG8uX3RleHQ9ZSx0aGlzLm9wdGlvbnMudGlwQXV0b1N1Ym1pdCYmdC5Eb21FdmVudC5kaXNhYmxlQ2xpY2tQcm9wYWdhdGlvbihvKS5vbihvLCJjbGljayIsdC5Eb21FdmVudC5zdG9wLHRoaXMpLm9uKG8sImNsaWNrIixmdW5jdGlvbih0KXt0aGlzLl9pbnB1dC52YWx1ZT1lLHRoaXMuX2hhbmRsZUF1dG9yZXNpemUoKSx0aGlzLl9pbnB1dC5mb2N1cygpLHRoaXMuX2hpZGVUb29sdGlwKCksdGhpcy5faGFuZGxlU3VibWl0KCl9LHRoaXMpLG99LF9nZXRVcmw6ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMub3B0aW9ucy51cmw/dGhpcy5vcHRpb25zLnVybCh0KTp0aGlzLm9wdGlvbnMudXJsfSxfZGVmYXVsdEZpbHRlckRhdGE6ZnVuY3Rpb24odCxlKXt2YXIgaSxvLHMsbj17fTtpZigiIj09PSh0PXQucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csIiIpKSlyZXR1cm5bXTtmb3IodmFyIHIgaW4gaT10aGlzLm9wdGlvbnMuaW5pdGlhbD8iXiI6IiIsbz10aGlzLm9wdGlvbnMuY2FzZXNlbnNpdGl2ZT92b2lkIDA6ImkiLHM9bmV3IFJlZ0V4cChpK3QsbyksZSlzLnRlc3QocikmJihuW3JdPWVbcl0pO3JldHVybiBufSxzaG93VG9vbHRpcDpmdW5jdGlvbih0KXtpZih0aGlzLl9jb3VudGVydGlwcz0wLHRoaXMuX3Rvb2x0aXAuaW5uZXJIVE1MPSIiLHRoaXMuX3Rvb2x0aXAuY3VycmVudFNlbGVjdGlvbj0tMSx0aGlzLm9wdGlvbnMudG9vbHRpcExpbWl0KWZvcih2YXIgZSBpbiB0KXtpZih0aGlzLl9jb3VudGVydGlwcz09PXRoaXMub3B0aW9ucy50b29sdGlwTGltaXQpYnJlYWs7dGhpcy5fY291bnRlcnRpcHMrKyx0aGlzLl90b29sdGlwLmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZVRpcChlLHRbZV0pKX1yZXR1cm4gdGhpcy5fY291bnRlcnRpcHM+MD8odGhpcy5fdG9vbHRpcC5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5fYXV0b1R5cGVUbXAmJnRoaXMuX2F1dG9UeXBlKCksdGhpcy5fYXV0b1R5cGVUbXA9dGhpcy5vcHRpb25zLmF1dG9UeXBlKTp0aGlzLl9oaWRlVG9vbHRpcCgpLHRoaXMuX3Rvb2x0aXAuc2Nyb2xsVG9wPTAsdGhpcy5fY291bnRlcnRpcHN9LF9oaWRlVG9vbHRpcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90b29sdGlwLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuX3Rvb2x0aXAuaW5uZXJIVE1MPSIiLDB9LF9kZWZhdWx0Rm9ybWF0RGF0YTpmdW5jdGlvbihlKXt2YXIgaSxvPXRoaXMub3B0aW9ucy5wcm9wZXJ0eU5hbWUscz10aGlzLm9wdGlvbnMucHJvcGVydHlMb2Msbj17fTtpZih0LlV0aWwuaXNBcnJheShzKSlmb3IoaSBpbiBlKW5bdGhpcy5fZ2V0UGF0aChlW2ldLG8pXT10LmxhdExuZyhlW2ldW3NbMF1dLGVbaV1bc1sxXV0pO2Vsc2UgZm9yKGkgaW4gZSluW3RoaXMuX2dldFBhdGgoZVtpXSxvKV09dC5sYXRMbmcodGhpcy5fZ2V0UGF0aChlW2ldLHMpKTtyZXR1cm4gbn0sX3JlY29yZHNGcm9tSnNvbnA6ZnVuY3Rpb24oZSxpKXt0LkNvbnRyb2wuU2VhcmNoLmNhbGxKc29ucD1pO3ZhciBvPXQuRG9tVXRpbC5jcmVhdGUoInNjcmlwdCIsImxlYWZsZXQtc2VhcmNoLWpzb25wIixkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdKSxzPXQuVXRpbC50ZW1wbGF0ZSh0aGlzLl9nZXRVcmwoZSkrIiYiK3RoaXMub3B0aW9ucy5qc29ucFBhcmFtKyI9TC5Db250cm9sLlNlYXJjaC5jYWxsSnNvbnAiLHtzOmV9KTtyZXR1cm4gby50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLG8uc3JjPXMse2Fib3J0OmZ1bmN0aW9uKCl7by5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfX19LF9yZWNvcmRzRnJvbUFqYXg6ZnVuY3Rpb24oZSxpKXt2b2lkIDA9PT13aW5kb3cuWE1MSHR0cFJlcXVlc3QmJih3aW5kb3cuWE1MSHR0cFJlcXVlc3Q9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUC42LjAiKX1jYXRjaCh0KXt0cnl7cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUC4zLjAiKX1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoIlhNTEh0dHBSZXF1ZXN0IGlzIG5vdCBzdXBwb3J0ZWQiKX19fSk7dmFyIG89dC5Ccm93c2VyLmllJiYhd2luZG93LmF0b2ImJmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I/bmV3IFhEb21haW5SZXF1ZXN0Om5ldyBYTUxIdHRwUmVxdWVzdCxzPXQuVXRpbC50ZW1wbGF0ZSh0aGlzLl9nZXRVcmwoZSkse3M6ZX0pO3JldHVybiBvLm9wZW4oIkdFVCIscyksby5vbmxvYWQ9ZnVuY3Rpb24oKXtpKEpTT04ucGFyc2Uoby5yZXNwb25zZVRleHQpKX0sby5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT09by5yZWFkeVN0YXRlJiYyMDA9PT1vLnN0YXR1cyYmdGhpcy5vbmxvYWQoKX0sby5zZW5kKCksb30sX3NlYXJjaEluTGF5ZXI6ZnVuY3Rpb24oZSxpLG8pe3ZhciBzLG49dGhpcztlIGluc3RhbmNlb2YgdC5Db250cm9sLlNlYXJjaC5NYXJrZXJ8fCgoZSBpbnN0YW5jZW9mIHQuTWFya2VyfHxlIGluc3RhbmNlb2YgdC5DaXJjbGVNYXJrZXIpJiYobi5fZ2V0UGF0aChlLm9wdGlvbnMsbyk/KChzPWUuZ2V0TGF0TG5nKCkpLmxheWVyPWUsaVtuLl9nZXRQYXRoKGUub3B0aW9ucyxvKV09cyk6bi5fZ2V0UGF0aChlLmZlYXR1cmUucHJvcGVydGllcyxvKSYmKChzPWUuZ2V0TGF0TG5nKCkpLmxheWVyPWUsaVtuLl9nZXRQYXRoKGUuZmVhdHVyZS5wcm9wZXJ0aWVzLG8pXT1zKSksZSBpbnN0YW5jZW9mIHQuUGF0aHx8ZSBpbnN0YW5jZW9mIHQuUG9seWxpbmV8fGUgaW5zdGFuY2VvZiB0LlBvbHlnb24/bi5fZ2V0UGF0aChlLm9wdGlvbnMsbyk/KChzPWUuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCkpLmxheWVyPWUsaVtuLl9nZXRQYXRoKGUub3B0aW9ucyxvKV09cyk6bi5fZ2V0UGF0aChlLmZlYXR1cmUucHJvcGVydGllcyxvKSYmKChzPWUuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCkpLmxheWVyPWUsaVtuLl9nZXRQYXRoKGUuZmVhdHVyZS5wcm9wZXJ0aWVzLG8pXT1zKTplLmhhc093blByb3BlcnR5KCJmZWF0dXJlIik/ZS5mZWF0dXJlLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobykmJihlLmdldExhdExuZyYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0TGF0TG5nPygocz1lLmdldExhdExuZygpKS5sYXllcj1lLGlbZS5mZWF0dXJlLnByb3BlcnRpZXNbb11dPXMpOmUuZ2V0Qm91bmRzJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRCb3VuZHMmJigocz1lLmdldEJvdW5kcygpLmdldENlbnRlcigpKS5sYXllcj1lLGlbZS5mZWF0dXJlLnByb3BlcnRpZXNbb11dPXMpKTplIGluc3RhbmNlb2YgdC5MYXllckdyb3VwJiZlLmVhY2hMYXllcihmdW5jdGlvbih0KXtuLl9zZWFyY2hJbkxheWVyKHQsaSxvKX0pKX0sX3JlY29yZHNGcm9tTGF5ZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9e30saT10aGlzLm9wdGlvbnMucHJvcGVydHlOYW1lO3JldHVybiB0aGlzLl9sYXllci5lYWNoTGF5ZXIoZnVuY3Rpb24obyl7dC5fc2VhcmNoSW5MYXllcihvLGUsaSl9KSxlfSxfYXV0b1R5cGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9pbnB1dC52YWx1ZS5sZW5ndGgsZT10aGlzLl90b29sdGlwLmZpcnN0Q2hpbGQ/dGhpcy5fdG9vbHRpcC5maXJzdENoaWxkLl90ZXh0OiIiLGk9ZS5sZW5ndGg7aWYoMD09PWUuaW5kZXhPZih0aGlzLl9pbnB1dC52YWx1ZSkpaWYodGhpcy5faW5wdXQudmFsdWU9ZSx0aGlzLl9oYW5kbGVBdXRvcmVzaXplKCksdGhpcy5faW5wdXQuY3JlYXRlVGV4dFJhbmdlKXt2YXIgbz10aGlzLl9pbnB1dC5jcmVhdGVUZXh0UmFuZ2UoKTtvLmNvbGxhcHNlKCEwKSxvLm1vdmVTdGFydCgiY2hhcmFjdGVyIix0KSxvLm1vdmVFbmQoImNoYXJhY3RlciIsaSksby5zZWxlY3QoKX1lbHNlIHRoaXMuX2lucHV0LnNldFNlbGVjdGlvblJhbmdlP3RoaXMuX2lucHV0LnNldFNlbGVjdGlvblJhbmdlKHQsaSk6dGhpcy5faW5wdXQuc2VsZWN0aW9uU3RhcnQmJih0aGlzLl9pbnB1dC5zZWxlY3Rpb25TdGFydD10LHRoaXMuX2lucHV0LnNlbGVjdGlvbkVuZD1pKX0sX2hpZGVBdXRvVHlwZTpmdW5jdGlvbigpe3ZhciB0O2lmKCh0PXRoaXMuX2lucHV0LnNlbGVjdGlvbikmJnQuZW1wdHkpdC5lbXB0eSgpO2Vsc2UgaWYodGhpcy5faW5wdXQuY3JlYXRlVGV4dFJhbmdlKXsodD10aGlzLl9pbnB1dC5jcmVhdGVUZXh0UmFuZ2UoKSkuY29sbGFwc2UoITApO3ZhciBlPXRoaXMuX2lucHV0LnZhbHVlLmxlbmd0aDt0Lm1vdmVTdGFydCgiY2hhcmFjdGVyIixlKSx0Lm1vdmVFbmQoImNoYXJhY3RlciIsZSksdC5zZWxlY3QoKX1lbHNlIHRoaXMuX2lucHV0LmdldFNlbGVjdGlvbiYmdGhpcy5faW5wdXQuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCksdGhpcy5faW5wdXQuc2VsZWN0aW9uU3RhcnQ9dGhpcy5faW5wdXQuc2VsZWN0aW9uRW5kfSxfaGFuZGxlS2V5cHJlc3M6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztzd2l0Y2godC5rZXlDb2RlKXtjYXNlIDI3OnRoaXMuY29sbGFwc2UoKTticmVhaztjYXNlIDEzOigxPT10aGlzLl9jb3VudGVydGlwc3x8dGhpcy5vcHRpb25zLmZpcnN0VGlwU3VibWl0JiZ0aGlzLl9jb3VudGVydGlwcz4wKSYmLTE9PXRoaXMuX3Rvb2x0aXAuY3VycmVudFNlbGVjdGlvbiYmdGhpcy5faGFuZGxlQXJyb3dTZWxlY3QoMSksdGhpcy5faGFuZGxlU3VibWl0KCk7YnJlYWs7Y2FzZSAzODp0aGlzLl9oYW5kbGVBcnJvd1NlbGVjdCgtMSk7YnJlYWs7Y2FzZSA0MDp0aGlzLl9oYW5kbGVBcnJvd1NlbGVjdCgxKTticmVhaztjYXNlIDg6Y2FzZSA0NTpjYXNlIDQ2OnRoaXMuX2F1dG9UeXBlVG1wPSExO2JyZWFrO2Nhc2UgMzc6Y2FzZSAzOTpjYXNlIDE2OmNhc2UgMTc6Y2FzZSAzNTpjYXNlIDM2OmJyZWFrO2RlZmF1bHQ6dGhpcy5faW5wdXQudmFsdWUubGVuZ3RoP3RoaXMuX2NhbmNlbC5zdHlsZS5kaXNwbGF5PSJibG9jayI6dGhpcy5fY2FuY2VsLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuX2lucHV0LnZhbHVlLmxlbmd0aD49dGhpcy5vcHRpb25zLm1pbkxlbmd0aD8oY2xlYXJUaW1lb3V0KHRoaXMudGltZXJLZXlwcmVzcyksdGhpcy50aW1lcktleXByZXNzPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl9maWxsUmVjb3Jkc0NhY2hlKCl9LHRoaXMub3B0aW9ucy5kZWxheVR5cGUpKTp0aGlzLl9oaWRlVG9vbHRpcCgpfXRoaXMuX2hhbmRsZUF1dG9yZXNpemUoKX0sc2VhcmNoVGV4dDpmdW5jdGlvbihlKXt2YXIgaT1lLmNoYXJDb2RlQXQoZS5sZW5ndGgpO3RoaXMuX2lucHV0LnZhbHVlPWUsdGhpcy5faW5wdXQuc3R5bGUuZGlzcGxheT0iYmxvY2siLHQuRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl9jb250YWluZXIsInNlYXJjaC1leHAiKSx0aGlzLl9hdXRvVHlwZVRtcD0hMSx0aGlzLl9oYW5kbGVLZXlwcmVzcyh7a2V5Q29kZTppfSl9LF9maWxsUmVjb3Jkc0NhY2hlOmZ1bmN0aW9uKCl7dmFyIGUsaT10aGlzLG89dGhpcy5faW5wdXQudmFsdWU7dGhpcy5fY3VyUmVxJiZ0aGlzLl9jdXJSZXEuYWJvcnQmJnRoaXMuX2N1clJlcS5hYm9ydCgpLHQuRG9tVXRpbC5hZGRDbGFzcyh0aGlzLl9jb250YWluZXIsInNlYXJjaC1sb2FkIiksdGhpcy5vcHRpb25zLmxheWVyPyh0aGlzLl9yZWNvcmRzQ2FjaGU9dGhpcy5fcmVjb3Jkc0Zyb21MYXllcigpLGU9dGhpcy5fZmlsdGVyRGF0YSh0aGlzLl9pbnB1dC52YWx1ZSx0aGlzLl9yZWNvcmRzQ2FjaGUpLHRoaXMuc2hvd1Rvb2x0aXAoZSksdC5Eb21VdGlsLnJlbW92ZUNsYXNzKHRoaXMuX2NvbnRhaW5lciwic2VhcmNoLWxvYWQiKSk6KHRoaXMub3B0aW9ucy5zb3VyY2VEYXRhP3RoaXMuX3JldHJpZXZlRGF0YT10aGlzLm9wdGlvbnMuc291cmNlRGF0YTp0aGlzLm9wdGlvbnMudXJsJiYodGhpcy5fcmV0cmlldmVEYXRhPXRoaXMub3B0aW9ucy5qc29ucFBhcmFtP3RoaXMuX3JlY29yZHNGcm9tSnNvbnA6dGhpcy5fcmVjb3Jkc0Zyb21BamF4KSx0aGlzLl9jdXJSZXE9dGhpcy5fcmV0cmlldmVEYXRhLmNhbGwodGhpcyxvLGZ1bmN0aW9uKG8pe2kuX3JlY29yZHNDYWNoZT1pLl9mb3JtYXREYXRhLmNhbGwoaSxvKSxlPWkub3B0aW9ucy5zb3VyY2VEYXRhP2kuX2ZpbHRlckRhdGEoaS5faW5wdXQudmFsdWUsaS5fcmVjb3Jkc0NhY2hlKTppLl9yZWNvcmRzQ2FjaGUsaS5zaG93VG9vbHRpcChlKSx0LkRvbVV0aWwucmVtb3ZlQ2xhc3MoaS5fY29udGFpbmVyLCJzZWFyY2gtbG9hZCIpfSkpfSxfaGFuZGxlQXV0b3Jlc2l6ZTpmdW5jdGlvbigpe3RoaXMuX2lucHV0LnN0eWxlLm1heFdpZHRoIT10aGlzLl9tYXAuX2NvbnRhaW5lci5vZmZzZXRXaWR0aCYmKHRoaXMuX2lucHV0LnN0eWxlLm1heFdpZHRoPXQuRG9tVXRpbC5nZXRTdHlsZSh0aGlzLl9tYXAuX2NvbnRhaW5lciwid2lkdGgiKSksdGhpcy5vcHRpb25zLmF1dG9SZXNpemUmJnRoaXMuX2NvbnRhaW5lci5vZmZzZXRXaWR0aCs0NTx0aGlzLl9tYXAuX2NvbnRhaW5lci5vZmZzZXRXaWR0aCYmKHRoaXMuX2lucHV0LnNpemU9dGhpcy5faW5wdXQudmFsdWUubGVuZ3RoPHRoaXMuX2lucHV0TWluU2l6ZT90aGlzLl9pbnB1dE1pblNpemU6dGhpcy5faW5wdXQudmFsdWUubGVuZ3RoKX0sX2hhbmRsZUFycm93U2VsZWN0OmZ1bmN0aW9uKGUpe3ZhciBvPXRoaXMuX3Rvb2x0aXAuaGFzQ2hpbGROb2RlcygpP3RoaXMuX3Rvb2x0aXAuY2hpbGROb2RlczpbXTtmb3IoaT0wO2k8by5sZW5ndGg7aSsrKXQuRG9tVXRpbC5yZW1vdmVDbGFzcyhvW2ldLCJzZWFyY2gtdGlwLXNlbGVjdCIpO2lmKDE9PWUmJnRoaXMuX3Rvb2x0aXAuY3VycmVudFNlbGVjdGlvbj49by5sZW5ndGgtMSl0LkRvbVV0aWwuYWRkQ2xhc3Mob1t0aGlzLl90b29sdGlwLmN1cnJlbnRTZWxlY3Rpb25dLCJzZWFyY2gtdGlwLXNlbGVjdCIpO2Vsc2UgaWYoLTE9PWUmJnRoaXMuX3Rvb2x0aXAuY3VycmVudFNlbGVjdGlvbjw9MCl0aGlzLl90b29sdGlwLmN1cnJlbnRTZWxlY3Rpb249LTE7ZWxzZSBpZigibm9uZSIhPXRoaXMuX3Rvb2x0aXAuc3R5bGUuZGlzcGxheSl7dGhpcy5fdG9vbHRpcC5jdXJyZW50U2VsZWN0aW9uKz1lLHQuRG9tVXRpbC5hZGRDbGFzcyhvW3RoaXMuX3Rvb2x0aXAuY3VycmVudFNlbGVjdGlvbl0sInNlYXJjaC10aXAtc2VsZWN0IiksdGhpcy5faW5wdXQudmFsdWU9b1t0aGlzLl90b29sdGlwLmN1cnJlbnRTZWxlY3Rpb25dLl90ZXh0O3ZhciBzPW9bdGhpcy5fdG9vbHRpcC5jdXJyZW50U2VsZWN0aW9uXS5vZmZzZXRUb3A7cytvW3RoaXMuX3Rvb2x0aXAuY3VycmVudFNlbGVjdGlvbl0uY2xpZW50SGVpZ2h0Pj10aGlzLl90b29sdGlwLnNjcm9sbFRvcCt0aGlzLl90b29sdGlwLmNsaWVudEhlaWdodD90aGlzLl90b29sdGlwLnNjcm9sbFRvcD1zLXRoaXMuX3Rvb2x0aXAuY2xpZW50SGVpZ2h0K29bdGhpcy5fdG9vbHRpcC5jdXJyZW50U2VsZWN0aW9uXS5jbGllbnRIZWlnaHQ6czw9dGhpcy5fdG9vbHRpcC5zY3JvbGxUb3AmJih0aGlzLl90b29sdGlwLnNjcm9sbFRvcD1zKX19LF9oYW5kbGVTdWJtaXQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9oaWRlQXV0b1R5cGUoKSx0aGlzLmhpZGVBbGVydCgpLHRoaXMuX2hpZGVUb29sdGlwKCksIm5vbmUiPT10aGlzLl9pbnB1dC5zdHlsZS5kaXNwbGF5KXRoaXMuZXhwYW5kKCk7ZWxzZSBpZigiIj09PXRoaXMuX2lucHV0LnZhbHVlKXRoaXMuY29sbGFwc2UoKTtlbHNle3ZhciB0PXRoaXMuX2dldExvY2F0aW9uKHRoaXMuX2lucHV0LnZhbHVlKTshMT09PXQ/dGhpcy5zaG93QWxlcnQoKToodGhpcy5zaG93TG9jYXRpb24odCx0aGlzLl9pbnB1dC52YWx1ZSksdGhpcy5maXJlKCJzZWFyY2g6bG9jYXRpb25mb3VuZCIse2xhdGxuZzp0LHRleHQ6dGhpcy5faW5wdXQudmFsdWUsbGF5ZXI6dC5sYXllcj90LmxheWVyOm51bGx9KSl9fSxfZ2V0TG9jYXRpb246ZnVuY3Rpb24odCl7cmV0dXJuISF0aGlzLl9yZWNvcmRzQ2FjaGUuaGFzT3duUHJvcGVydHkodCkmJnRoaXMuX3JlY29yZHNDYWNoZVt0XX0sX2RlZmF1bHRNb3ZlVG9Mb2NhdGlvbjpmdW5jdGlvbih0LGUsaSl7dGhpcy5vcHRpb25zLnpvb20/dGhpcy5fbWFwLnNldFZpZXcodCx0aGlzLm9wdGlvbnMuem9vbSk6dGhpcy5fbWFwLnBhblRvKHQpfSxzaG93TG9jYXRpb246ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzO3JldHVybiBpLl9tYXAub25jZSgibW92ZWVuZCB6b29tZW5kIixmdW5jdGlvbihlKXtpLl9tYXJrZXJTZWFyY2gmJmkuX21hcmtlclNlYXJjaC5hZGRUbyhpLl9tYXApLnNldExhdExuZyh0KX0pLGkuX21vdmVUb0xvY2F0aW9uKHQsZSxpLl9tYXApLGkub3B0aW9ucy5hdXRvQ29sbGFwc2UmJmkuY29sbGFwc2UoKSxpfX0pLHQuQ29udHJvbC5TZWFyY2guTWFya2VyPXQuTWFya2VyLmV4dGVuZCh7aW5jbHVkZXM6IjEiPT09dC52ZXJzaW9uWzBdP3QuRXZlbnRlZC5wcm90b3R5cGU6dC5NaXhpbi5FdmVudHMsb3B0aW9uczp7aWNvbjpuZXcgdC5JY29uLkRlZmF1bHQsYW5pbWF0ZTohMCxjaXJjbGU6e3JhZGl1czoxMCx3ZWlnaHQ6Myxjb2xvcjoiI2UwMyIsc3Ryb2tlOiEwLGZpbGw6ITF9fSxpbml0aWFsaXplOmZ1bmN0aW9uKGUsaSl7dC5zZXRPcHRpb25zKHRoaXMsaSksITA9PT1pLmljb24mJihpLmljb249bmV3IHQuSWNvbi5EZWZhdWx0KSx0Lk1hcmtlci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsZSxpKSx0LkNvbnRyb2wuU2VhcmNoLnByb3RvdHlwZS5faXNPYmplY3QodGhpcy5vcHRpb25zLmNpcmNsZSkmJih0aGlzLl9jaXJjbGVMb2M9bmV3IHQuQ2lyY2xlTWFya2VyKGUsdGhpcy5vcHRpb25zLmNpcmNsZSkpfSxvbkFkZDpmdW5jdGlvbihlKXt0Lk1hcmtlci5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLGUpLHRoaXMuX2NpcmNsZUxvYyYmKGUuYWRkTGF5ZXIodGhpcy5fY2lyY2xlTG9jKSx0aGlzLm9wdGlvbnMuYW5pbWF0ZSYmdGhpcy5hbmltYXRlKCkpfSxvblJlbW92ZTpmdW5jdGlvbihlKXt0Lk1hcmtlci5wcm90b3R5cGUub25SZW1vdmUuY2FsbCh0aGlzLGUpLHRoaXMuX2NpcmNsZUxvYyYmZS5yZW1vdmVMYXllcih0aGlzLl9jaXJjbGVMb2MpfSxzZXRMYXRMbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuTWFya2VyLnByb3RvdHlwZS5zZXRMYXRMbmcuY2FsbCh0aGlzLGUpLHRoaXMuX2NpcmNsZUxvYyYmdGhpcy5fY2lyY2xlTG9jLnNldExhdExuZyhlKSx0aGlzfSxfaW5pdEljb246ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuaWNvbiYmdC5NYXJrZXIucHJvdG90eXBlLl9pbml0SWNvbi5jYWxsKHRoaXMpfSxfcmVtb3ZlSWNvbjpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5pY29uJiZ0Lk1hcmtlci5wcm90b3R5cGUuX3JlbW92ZUljb24uY2FsbCh0aGlzKX0sYW5pbWF0ZTpmdW5jdGlvbigpe2lmKHRoaXMuX2NpcmNsZUxvYyl7dmFyIHQ9dGhpcy5fY2lyY2xlTG9jLGU9cGFyc2VJbnQodC5fcmFkaXVzLzUpLGk9dGhpcy5vcHRpb25zLmNpcmNsZS5yYWRpdXMsbz0yKnQuX3JhZGl1cyxzPTA7dC5fdGltZXJBbmltTG9jPXNldEludGVydmFsKGZ1bmN0aW9uKCl7by09ZSs9cys9LjUsdC5zZXRSYWRpdXMobyksbzxpJiYoY2xlYXJJbnRlcnZhbCh0Ll90aW1lckFuaW1Mb2MpLHQuc2V0UmFkaXVzKGkpKX0sMjAwKX1yZXR1cm4gdGhpc319KSx0Lk1hcC5hZGRJbml0SG9vayhmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5zZWFyY2hDb250cm9sJiYodGhpcy5zZWFyY2hDb250cm9sPXQuY29udHJvbC5zZWFyY2godGhpcy5vcHRpb25zLnNlYXJjaENvbnRyb2wpLHRoaXMuYWRkQ29udHJvbCh0aGlzLnNlYXJjaENvbnRyb2wpKX0pLHQuY29udHJvbC5zZWFyY2g9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0LkNvbnRyb2wuU2VhcmNoKGUpfSx0LkNvbnRyb2wuU2VhcmNofSk/cy5hcHBseShlLG4pOnMpfHwodC5leHBvcnRzPXIpfSxmdW5jdGlvbih0LGUsaSl7aSgzKSx0LmV4cG9ydHM9aSgxKX1dKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGZ4LXNlYXJjaC1wcm9kLmpzLm1hcA=="></script>
<script src="data:application/javascript;base64,IWZ1bmN0aW9uKGUpe3ZhciBvPXt9O2Z1bmN0aW9uIHQocil7aWYob1tyXSlyZXR1cm4gb1tyXS5leHBvcnRzO3ZhciBhPW9bcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoYS5leHBvcnRzLGEsYS5leHBvcnRzLHQpLGEubD0hMCxhLmV4cG9ydHN9dC5tPWUsdC5jPW8sdC5kPWZ1bmN0aW9uKGUsbyxyKXt0Lm8oZSxvKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbyx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsZ2V0OnJ9KX0sdC5yPWZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sdC5uPWZ1bmN0aW9uKGUpe3ZhciBvPWUmJmUuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiBlLmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIGV9O3JldHVybiB0LmQobywiYSIsbyksb30sdC5vPWZ1bmN0aW9uKGUsbyl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pfSx0LnA9IiIsdCh0LnM9MCl9KFtmdW5jdGlvbihlLG8pe2Z1bmN0aW9uIHQoZSl7dmFyIG89e2xhdGxuZzp7fX07cmV0dXJuIG8ubGF0bG5nLmxhdD1lLmxhdGxuZy5sYXQsby5sYXRsbmcubG5nPWUubGF0bG5nLmxuZywkLmlzRW1wdHlPYmplY3QoZS50aXRsZSl8fChvLnRpdGxlPWUudGl0bGUpLCQuaXNFbXB0eU9iamVjdChlLmxheWVyKXx8KG8ubGF5ZXI9ZS5sYXllci50b0dlb0pTT04oKSksb31MZWFmbGV0V2lkZ2V0Lm1ldGhvZHMuYWRkU2VhcmNoT1NNPWZ1bmN0aW9uKGUpeyhmdW5jdGlvbigpe3ZhciBvPXRoaXM7by5zZWFyY2hDb250cm9sT1NNJiYoby5zZWFyY2hDb250cm9sT1NNLnJlbW92ZUZyb20obyksZGVsZXRlIG8uc2VhcmNoQ29udHJvbE9TTSksKGU9ZXx8e30pLnRleHRQbGFjZWhvbGRlcj0iU2VhcmNoIHVzaW5nIE9TTSBHZW9jb2RlciIsZS51cmw9Imh0dHBzOi8vbm9taW5hdGltLm9wZW5zdHJlZXRtYXAub3JnL3NlYXJjaD9mb3JtYXQ9anNvbiZxPXtzfSIsZS5qc29ucFBhcmFtPSJqc29uX2NhbGxiYWNrIixlLnByb3BlcnR5TmFtZT0iZGlzcGxheV9uYW1lIixlLnByb3BlcnR5TG9jPVsibGF0IiwibG9uIl0sZS5tYXJrZXI9TC5jaXJjbGVNYXJrZXIoWzAsMF0se3JhZGl1czozMH0pLGUubW92ZVRvTG9jYXRpb24mJihlLm1vdmVUb0xvY2F0aW9uPWZ1bmN0aW9uKG8sdCxyKXt2YXIgYT1lLnpvb218fDE2LG49ci5nZXRNYXhab29tKCk7biYmYT5uJiYoYT1uKSxyLnNldFZpZXcobyxhKX0pLG8uc2VhcmNoQ29udHJvbE9TTT1uZXcgTC5Db250cm9sLlNlYXJjaChlKSxvLnNlYXJjaENvbnRyb2xPU00uYWRkVG8obyksby5zZWFyY2hDb250cm9sT1NNLm9uKCJzZWFyY2g6bG9jYXRpb25mb3VuZCIsZnVuY3Rpb24oZSl7SFRNTFdpZGdldHMuc2hpbnlNb2RlJiZTaGlueS5vbklucHV0Q2hhbmdlKG8uaWQrIl9zZWFyY2hfbG9jYXRpb25fZm91bmQiLHQoZSkpfSl9KS5jYWxsKHRoaXMpfSxMZWFmbGV0V2lkZ2V0Lm1ldGhvZHMucmVtb3ZlU2VhcmNoT1NNPWZ1bmN0aW9uKCl7KGZ1bmN0aW9uKCl7dGhpcy5zZWFyY2hDb250cm9sT1NNJiYodGhpcy5zZWFyY2hDb250cm9sT1NNLnJlbW92ZUZyb20odGhpcyksZGVsZXRlIHRoaXMuc2VhcmNoQ29udHJvbE9TTSl9KS5jYWxsKHRoaXMpfSxMZWFmbGV0V2lkZ2V0Lm1ldGhvZHMuYWRkUmV2ZXJzZVNlYXJjaE9TTT1mdW5jdGlvbihlLG8peyhmdW5jdGlvbigpe3ZhciB0PXRoaXM7bz1vfHwicmV2ZXJzZV9zZWFyY2hfb3NtIix0LmxheWVyTWFuYWdlci5jbGVhckdyb3VwKG8pO3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXZlcnNlU2VhcmNoT1NNIik7dC5vbigiY2xpY2siLGZ1bmN0aW9uKGEpe3ZhciBuPWEubGF0bG5nLHM9TC5mZWF0dXJlR3JvdXAoKSxpPUwuc3RhbXAocyk7aWYoZS5zaG93U2VhcmNoTG9jYXRpb24pe3ZhciBsPUwubWFya2VyKGEubGF0bG5nLHt0eXBlOiJxdWVyeSJ9KS5iaW5kVG9vbHRpcCgibGF0PSIrbi5sYXQrIiBsbmc9IituLmxuZysiPC9QPiIpO0wuc3RhbXAobCk7cy5hZGRMYXllcihsKX12YXIgYz0iaHR0cHM6Ly9ub21pbmF0aW0ub3BlbnN0cmVldG1hcC5vcmcvcmV2ZXJzZT9mb3JtYXQ9anNvbiZwb2x5Z29uX2dlb2pzb249MSZsYXQ9IituLmxhdCsiJmxvbj0iK24ubG5nOyQuYWpheCh7dXJsOmMsZGF0YVR5cGU6Impzb24ifSkuZG9uZShmdW5jdGlvbihhKXtpZighJC5pc0VtcHR5T2JqZWN0KHIpKXt2YXIgYz0iPGRpdj4iO2M9YysiRGlzcGxheSBOYW1lOiAiKyhhLmRpc3BsYXlfbmFtZT9hLmRpc3BsYXlfbmFtZToiIikrIjxici8+IixjKz0iPC9kaXY+IixyLmlubmVySFRNTD1jfXZhciB1PUwubGF0TG5nQm91bmRzKEwubGF0TG5nKGEuYm91bmRpbmdib3hbMF0sYS5ib3VuZGluZ2JveFsyXSksTC5sYXRMbmcoYS5ib3VuZGluZ2JveFsxXSxhLmJvdW5kaW5nYm94WzNdKSk7aWYoZS5zaG93Qm91bmRzKXt2YXIgZD1MLnJlY3RhbmdsZSh1LHt3ZWlnaHQ6Mixjb2xvcjoiIzQ0NDQ0NCIsY2xpY2thYmxlOiExLGRhc2hBcnJheToiNSwxMCIsdHlwZToicmVzdWx0X2JvdW5kaW5nYm94In0pO0wuc3RhbXAoZCk7cy5hZGRMYXllcihkKX1pZihlLnNob3dGZWF0dXJlKXt2YXIgaD1MLmdlb0pzb24oYS5nZW9qc29uLHt3ZWlnaHQ6Mixjb2xvcjoicmVkIixkYXNoQXJyYXk6IjUsMTAiLGNsaWNrYWJsZTohMSx0eXBlOiJyZXN1bHRfZmVhdHVyZSIscG9pbnRUb0xheWVyOmZ1bmN0aW9uKGUsbyl7cmV0dXJuIEwuY2lyY2xlTWFya2VyKG8se3dlaWdodDoyLGNvbG9yOiJyZWQiLGRhc2hBcnJheToiNSwxMCIsY2xpY2thYmxlOiExfSl9fSk7TC5zdGFtcChoKTtzLmFkZExheWVyKGgpfXZhciBnPXMuZ2V0TGF5ZXJzKCk7ISQuaXNFbXB0eU9iamVjdChnKSYmZy5sZW5ndGg+PTAmJigkLmlzRW1wdHlPYmplY3QobCl8fChsLm9uKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKGUpeyQuaXNFbXB0eU9iamVjdChkKXx8KGQuc2V0U3R5bGUoe2ZpbGxPcGFjaXR5Oi41LG9wYWNpdHk6Ljgsd2VpZ2h0OjV9KSxkLmJyaW5nVG9Gcm9udCgpKSwkLmlzRW1wdHlPYmplY3QoaCl8fChoLnNldFN0eWxlKHtmaWxsT3BhY2l0eTouNSxvcGFjaXR5Oi44LHdlaWdodDo1fSksaC5icmluZ1RvRnJvbnQoKSl9KSxsLm9uKCJtb3VzZW91dCIsZnVuY3Rpb24oZSl7JC5pc0VtcHR5T2JqZWN0KGQpfHwoZC5zZXRTdHlsZSh7ZmlsbE9wYWNpdHk6LjIsb3BhY2l0eTouNSx3ZWlnaHQ6Mn0pLGQuYnJpbmdUb0JhY2soKSksJC5pc0VtcHR5T2JqZWN0KGgpfHwoaC5zZXRTdHlsZSh7ZmlsbE9wYWNpdHk6LjIsb3BhY2l0eTouNSx3ZWlnaHQ6Mn0pLGguYnJpbmdUb0JhY2soKSl9KSksdC5sYXllck1hbmFnZXIuYWRkTGF5ZXIocywic2VhcmNoIixpLG8pLGUuZml0Qm91bmRzJiZ0LmZpdEJvdW5kcyhzLmdldEJvdW5kcygpKSksSFRNTFdpZGdldHMuc2hpbnlNb2RlJiZTaGlueS5vbklucHV0Q2hhbmdlKHQuaWQrIl9yZXZlcnNlX3NlYXJjaF9mZWF0dXJlX2ZvdW5kIix7cXVlcnk6e2xhdDpuLmxhdCxsbmc6bi5sbmd9LHJlc3VsdDphfSl9KX0pfSkuY2FsbCh0aGlzKX0sTGVhZmxldFdpZGdldC5tZXRob2RzLmFkZFNlYXJjaEdvb2dsZT1mdW5jdGlvbihlKXsoZnVuY3Rpb24oKXt2YXIgbz10aGlzO28uc2VhcmNoQ29udHJvbEdvb2dsZSYmKG8uc2VhcmNoQ29udHJvbEdvb2dsZS5yZW1vdmVGcm9tKG8pLGRlbGV0ZSBvLnNlYXJjaENvbnRyb2xHb29nbGUpO3ZhciByPW5ldyBnb29nbGUubWFwcy5HZW9jb2RlcjsoZT1lfHx7fSkubWFya2VyTG9jYXRpb249ITAsZS50ZXh0UGxhY2Vob2xkZXI9IlNlYXJjaCB1c2luZyBHb29nbGUgR2VvY29kZXIiLGUubWFya2VyPUwuY2lyY2xlTWFya2VyKFswLDBdLHtyYWRpdXM6MzB9KSxlLm1vdmVUb0xvY2F0aW9uJiYoZS5tb3ZlVG9Mb2NhdGlvbj1mdW5jdGlvbihvLHQscil7dmFyIGE9ZS56b29tfHwxNixuPXIuZ2V0TWF4Wm9vbSgpO24mJmE+biYmKGE9biksci5zZXRWaWV3KG8sYSl9KSxlLnNvdXJjZURhdGE9ZnVuY3Rpb24oZSxvKXtyLmdlb2NvZGUoe2FkZHJlc3M6ZX0sbyl9LGUuZm9ybWF0RGF0YT1mdW5jdGlvbihlKXt2YXIgbyx0LHI9e307Zm9yKHZhciBhIGluIGUpbz1lW2FdLmZvcm1hdHRlZF9hZGRyZXNzLHQ9TC5sYXRMbmcoZVthXS5nZW9tZXRyeS5sb2NhdGlvbi5sYXQoKSxlW2FdLmdlb21ldHJ5LmxvY2F0aW9uLmxuZygpKSxyW29dPXQ7cmV0dXJuIHJ9LG8uc2VhcmNoQ29udHJvbEdvb2dsZT1uZXcgTC5Db250cm9sLlNlYXJjaChlKSxvLnNlYXJjaENvbnRyb2xHb29nbGUuYWRkVG8obyksby5zZWFyY2hDb250cm9sR29vZ2xlLm9uKCJzZWFyY2g6bG9jYXRpb25mb3VuZCIsZnVuY3Rpb24oZSl7SFRNTFdpZGdldHMuc2hpbnlNb2RlJiZTaGlueS5vbklucHV0Q2hhbmdlKG8uaWQrIl9zZWFyY2hfbG9jYXRpb25fZm91bmQiLHQoZSkpfSl9KS5jYWxsKHRoaXMpfSxMZWFmbGV0V2lkZ2V0Lm1ldGhvZHMucmVtb3ZlU2VhcmNoR29vZ2xlPWZ1bmN0aW9uKCl7KGZ1bmN0aW9uKCl7dGhpcy5zZWFyY2hDb250cm9sR29vZ2xlJiYodGhpcy5zZWFyY2hDb250cm9sR29vZ2xlLnJlbW92ZUZyb20odGhpcyksZGVsZXRlIHRoaXMuc2VhcmNoQ29udHJvbEdvb2dsZSl9KS5jYWxsKHRoaXMpfSxMZWFmbGV0V2lkZ2V0Lm1ldGhvZHMuYWRkUmV2ZXJzZVNlYXJjaEdvb2dsZT1mdW5jdGlvbihlLG8peyhmdW5jdGlvbigpe3ZhciB0PXRoaXM7bz1vfHwicmV2ZXJzZV9zZWFyY2hfZ29vZ2xlIix0LmxheWVyTWFuYWdlci5jbGVhckdyb3VwKG8pO3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXZlcnNlU2VhcmNoR29vZ2xlIiksYT1uZXcgZ29vZ2xlLm1hcHMuR2VvY29kZXI7dC5vbigiY2xpY2siLGZ1bmN0aW9uKG4pe3ZhciBzPW4ubGF0bG5nLGk9TC5mZWF0dXJlR3JvdXAoKSxsPUwuc3RhbXAoaSk7aWYoZS5zaG93U2VhcmNoTG9jYXRpb24pe3ZhciBjPUwubWFya2VyKG4ubGF0bG5nLHt0eXBlOiJxdWVyeSJ9KS5iaW5kVG9vbHRpcCgibGF0PSIrcy5sYXQrIiBsbmc9IitzLmxuZysiPC9QPiIpO0wuc3RhbXAoYyk7aS5hZGRMYXllcihjKX1hLmdlb2NvZGUoe2xvY2F0aW9uOntsYXQ6cy5sYXQsbG5nOnMubG5nfX0sZnVuY3Rpb24oYSxuKXtpZigiT0siPT09bilpZihhWzBdKXt2YXIgdT1hWzBdO2lmKCEkLmlzRW1wdHlPYmplY3Qocikpe3ZhciBkPSI8ZGl2PiI7ZD1kKyJBZGRyZXNzOiAiKyh1LmZvcm1hdHRlZF9hZGRyZXNzP3UuZm9ybWF0dGVkX2FkZHJlc3M6IiIpKyI8YnIvPiIsZCs9IjwvZGl2PiIsci5pbm5lckhUTUw9ZH12YXIgaD1MLmxhdExuZ0JvdW5kcyhMLmxhdExuZyh1Lmdlb21ldHJ5LnZpZXdwb3J0LmYuZix1Lmdlb21ldHJ5LnZpZXdwb3J0LmIuYiksTC5sYXRMbmcodS5nZW9tZXRyeS52aWV3cG9ydC5mLmIsdS5nZW9tZXRyeS52aWV3cG9ydC5iLmYpKTtpZihlLnNob3dCb3VuZHMpe3ZhciBnPUwucmVjdGFuZ2xlKGgse3dlaWdodDoyLGNvbG9yOiIjNDQ0NDQ0IixjbGlja2FibGU6ITEsZGFzaEFycmF5OiI1LDEwIix0eXBlOiJyZXN1bHRfYm91bmRpbmdib3gifSk7TC5zdGFtcChnKTtpLmFkZExheWVyKGcpfWlmKGUuc2hvd0ZlYXR1cmUpe3ZhciBtPUwuY2lyY2xlTWFya2VyKEwubGF0TG5nKHUuZ2VvbWV0cnkubG9jYXRpb24ubGF0KCksdS5nZW9tZXRyeS5sb2NhdGlvbi5sbmcoKSkse3dlaWdodDoyLGNvbG9yOiJyZWQiLGRhc2hBcnJheToiNSwxMCIsY2xpY2thYmxlOiExLHR5cGU6InJlc3VsdF9mZWF0dXJlIn0pO0wuc3RhbXAobSk7aS5hZGRMYXllcihtKX12YXIgZj1pLmdldExheWVycygpOyEkLmlzRW1wdHlPYmplY3QoZikmJmYubGVuZ3RoPj0wJiYoJC5pc0VtcHR5T2JqZWN0KGMpfHwoYy5vbigibW91c2VvdmVyIixmdW5jdGlvbihlKXskLmlzRW1wdHlPYmplY3QoZyl8fChnLnNldFN0eWxlKHtmaWxsT3BhY2l0eTouNSxvcGFjaXR5Oi44LHdlaWdodDo1fSksZy5icmluZ1RvRnJvbnQoKSksJC5pc0VtcHR5T2JqZWN0KG0pfHwobS5zZXRTdHlsZSh7ZmlsbE9wYWNpdHk6LjUsb3BhY2l0eTouOCx3ZWlnaHQ6NX0pLG0uYnJpbmdUb0Zyb250KCkpfSksYy5vbigibW91c2VvdXQiLGZ1bmN0aW9uKGUpeyQuaXNFbXB0eU9iamVjdChnKXx8KGcuc2V0U3R5bGUoe2ZpbGxPcGFjaXR5Oi4yLG9wYWNpdHk6LjUsd2VpZ2h0OjJ9KSxnLmJyaW5nVG9CYWNrKCkpLCQuaXNFbXB0eU9iamVjdChtKXx8KG0uc2V0U3R5bGUoe2ZpbGxPcGFjaXR5Oi4yLG9wYWNpdHk6LjUsd2VpZ2h0OjJ9KSxtLmJyaW5nVG9CYWNrKCkpfSkpLHQubGF5ZXJNYW5hZ2VyLmFkZExheWVyKGksInNlYXJjaCIsbCxvKSxlLmZpdEJvdW5kcyYmdC5maXRCb3VuZHMoaS5nZXRCb3VuZHMoKSkpLEhUTUxXaWRnZXRzLnNoaW55TW9kZSYmU2hpbnkub25JbnB1dENoYW5nZSh0LmlkKyJfcmV2ZXJzZV9zZWFyY2hfZmVhdHVyZV9mb3VuZCIse3F1ZXJ5OntsYXQ6cy5sYXQsbG5nOnMubG5nfSxyZXN1bHQ6dX0pfWVsc2UgJC5pc0VtcHR5T2JqZWN0KHIpfHwoci5pbm5lckhUTUw9Ik5vIFJlc3VsdHMgRm91bmQiKSxjb25zb2xlLmVycm9yKCJObyBSZXN1bHRzIEZvdW5kIik7ZWxzZSAkLmlzRW1wdHlPYmplY3Qocil8fChyLmlubmVySFRNTD0iUmV2ZXJzZSBHZW9jb2RpbmcgZmFpbGVkIGR1ZSB0bzogIituKSxjb25zb2xlLmVycm9yKCJSZXZlcnNlIEdlb2NvaW5nIGZhaWxlZCBkdWUgdG86ICIrbil9KX0pfSkuY2FsbCh0aGlzKX0sTGVhZmxldFdpZGdldC5tZXRob2RzLmFkZFNlYXJjaFVTQ2Vuc3VzQnVyZWF1PWZ1bmN0aW9uKGUpeyhmdW5jdGlvbigpe3ZhciBvPXRoaXM7by5zZWFyY2hDb250cm9sVVNDZW5zdXNCdXJlYXUmJihvLnNlYXJjaENvbnRyb2xVU0NlbnN1c0J1cmVhdS5yZW1vdmVGcm9tKG8pLGRlbGV0ZSBvLnNlYXJjaENvbnRyb2xVU0NlbnN1c0J1cmVhdSksKGU9ZXx8e30pLnVybD0iaHR0cHM6Ly9nZW9jb2RpbmcuZ2VvLmNlbnN1cy5nb3YvZ2VvY29kZXIvbG9jYXRpb25zL29uZWxpbmVhZGRyZXNzP2JlbmNobWFyaz1QdWJsaWNfQVJfQ3VycmVudCZmb3JtYXQ9anNvbnAmYWRkcmVzcz17c30iLGUudGV4dFBsYWNlaG9sZGVyPSJTZWFyY2ggdXNpbmcgVVMgQ2Vuc3VzIEJ1cmVhdSIsZS5qc29ucFBhcmFtPSJjYWxsYmFjayIsZS5mb3JtYXREYXRhPWZ1bmN0aW9uKGUpe3ZhciBvLHQscj17fTtmb3IodmFyIGEgaW4gZS5yZXN1bHQuYWRkcmVzc01hdGNoZXMpbz1lLnJlc3VsdC5hZGRyZXNzTWF0Y2hlc1thXS5tYXRjaGVkQWRkcmVzcyx0PUwubGF0TG5nKGUucmVzdWx0LmFkZHJlc3NNYXRjaGVzW2FdLmNvb3JkaW5hdGVzLnksZS5yZXN1bHQuYWRkcmVzc01hdGNoZXNbYV0uY29vcmRpbmF0ZXMueCkscltvXT10O3JldHVybiByfSxlLm1hcmtlcj1MLmNpcmNsZU1hcmtlcihbMCwwXSx7cmFkaXVzOjMwfSksZS5tb3ZlVG9Mb2NhdGlvbiYmKGUubW92ZVRvTG9jYXRpb249ZnVuY3Rpb24obyx0LHIpe3ZhciBhPWUuem9vbXx8MTYsbj1yLmdldE1heFpvb20oKTtuJiZhPm4mJihhPW4pLHIuc2V0VmlldyhvLGEpfSksby5zZWFyY2hDb250cm9sVVNDZW5zdXNCdXJlYXU9bmV3IEwuQ29udHJvbC5TZWFyY2goZSksby5zZWFyY2hDb250cm9sVVNDZW5zdXNCdXJlYXUuYWRkVG8obyksby5zZWFyY2hDb250cm9sVVNDZW5zdXNCdXJlYXUub24oInNlYXJjaDpsb2NhdGlvbmZvdW5kIixmdW5jdGlvbihlKXtIVE1MV2lkZ2V0cy5zaGlueU1vZGUmJlNoaW55Lm9uSW5wdXRDaGFuZ2Uoby5pZCsiX3NlYXJjaF9sb2NhdGlvbl9mb3VuZCIsdChlKSl9KX0pLmNhbGwodGhpcyl9LExlYWZsZXRXaWRnZXQubWV0aG9kcy5yZW1vdmVTZWFyY2hVU0NlbnN1c0J1cmVhdT1mdW5jdGlvbigpeyhmdW5jdGlvbigpe3RoaXMuc2VhcmNoQ29udHJvbFVTQ2Vuc3VzQnVyZWF1JiYodGhpcy5zZWFyY2hDb250cm9sVVNDZW5zdXNCdXJlYXUucmVtb3ZlRnJvbSh0aGlzKSxkZWxldGUgdGhpcy5zZWFyY2hDb250cm9sVVNDZW5zdXNCdXJlYXUpfSkuY2FsbCh0aGlzKX0sTGVhZmxldFdpZGdldC5tZXRob2RzLmFkZFNlYXJjaEZlYXR1cmVzPWZ1bmN0aW9uKGUsbyl7KGZ1bmN0aW9uKCl7dmFyIHIsYT10aGlzO2lmKGEuc2VhcmNoQ29udHJvbCYmKGEuc2VhcmNoQ29udHJvbC5yZW1vdmVGcm9tKGEpLGRlbGV0ZSBhLnNlYXJjaENvbnRyb2wpLChvPW98fHt9KS5tb3ZlVG9Mb2NhdGlvbiYmKG8ubW92ZVRvTG9jYXRpb249ZnVuY3Rpb24oZSx0LHIpe3ZhciBhPW8uem9vbXx8MTYsbj1yLmdldE1heFpvb20oKTtuJiZhPm4mJihhPW4pLHIuc2V0VmlldyhlLGEpfSksTC5VdGlsLmlzQXJyYXkoZSkpcj1hLmxheWVyTWFuYWdlci5nZXRMYXllckdyb3VwKCJzZWFyY2giLCEwKSxhLl9zZWFyY2hGZWF0dXJlR3JvdXBOYW1lPSJzZWFyY2giLCQuZWFjaChlLGZ1bmN0aW9uKGUsbyl7dmFyIHQ9YS5sYXllck1hbmFnZXIuZ2V0TGF5ZXJHcm91cChvLCExKTt0P3IuYWRkTGF5ZXIodCk6Y29uc29sZS53YXJuKCdHcm91cCB3aXRoIElEICInK28rJyIgbm90IEZvdW5kLCBza2lwcGluZycpfSk7ZWxzZXt2YXIgbj1hLmxheWVyTWFuYWdlci5nZXRMYXllckdyb3VwKGUsITEpO2lmKCFuKXRocm93J0dyb3VwIHdpdGggSUQgIicrZSsnIiBub3QgZm91bmQnO3I9bixhLl9zZWFyY2hGZWF0dXJlR3JvdXBOYW1lPWV9TC5zdGFtcChyKSxvLmxheWVyPXIsYS5zZWFyY2hDb250cm9sPW5ldyBMLkNvbnRyb2wuU2VhcmNoKG8pLGEuc2VhcmNoQ29udHJvbC5hZGRUbyhhKSxhLnNlYXJjaENvbnRyb2wub24oInNlYXJjaDpsb2NhdGlvbmZvdW5kIixmdW5jdGlvbihlKXtvLm9wZW5Qb3B1cCYmZS5sYXllci5fcG9wdXAmJmUubGF5ZXIub3BlblBvcHVwKCksSFRNTFdpZGdldHMuc2hpbnlNb2RlJiZTaGlueS5vbklucHV0Q2hhbmdlKGEuaWQrIl9zZWFyY2hfbG9jYXRpb25fZm91bmQiLHQoZSkpfSl9KS5jYWxsKHRoaXMpfSxMZWFmbGV0V2lkZ2V0Lm1ldGhvZHMucmVtb3ZlU2VhcmNoRmVhdHVyZXM9ZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKCl7dGhpcy5zZWFyY2hDb250cm9sJiYodGhpcy5zZWFyY2hDb250cm9sLnJlbW92ZUZyb20odGhpcyksZGVsZXRlIHRoaXMuc2VhcmNoQ29udHJvbCksZSYmdGhpcy5fc2VhcmNoRmVhdHVyZUdyb3VwTmFtZSYmKHRoaXMubGF5ZXJNYW5hZ2VyLmNsZWFyR3JvdXAodGhpcy5fc2VhcmNoRmVhdHVyZUdyb3VwTmFtZSksZGVsZXRlIHRoaXMuX3NlYXJjaEZlYXR1cmVHcm91cE5hbWUpfSkuY2FsbCh0aGlzKX19XSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWxmeC1zZWFyY2gtYmluZGluZ3MuanMubWFw"></script>
</head>
<body style="background-color: white;">
<div id="htmlwidget_container">
<div id="htmlwidget-78e279b49d34f0da7677" class="leaflet html-widget" style="width:100%;height:400px;">
</div>
</div>
<script type="application/json" data-for="htmlwidget-78e279b49d34f0da7677">{"x":{"options":{"crs":{"crsClass":"L.CRS.EPSG3857","code":null,"proj4def":null,"projectedBounds":null,"options":{}}},"calls":[{"method":"addTiles","args":["//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",null,null,{"minZoom":0,"maxZoom":18,"tileSize":256,"subdomains":"abc","errorTileUrl":"","tms":false,"noWrap":false,"zoomOffset":0,"zoomReverse":false,"opacity":1,"zIndex":1,"detectRetina":false,"attribution":"&copy; <a href=\"http://openstreetmap.org\">OpenStreetMap<\/a> contributors, <a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">CC-BY-SA<\/a>"}]},{"method":"addProviderTiles","args":["CartoDB.VoyagerLabelsUnder",null,null,{"errorTileUrl":"","noWrap":false,"detectRetina":false}]},{"method":"addMarkers","args":[[30.381353,30.428522,30.347566,30.269427,30.348264,30.19821,30.581951,30.223413,30.427636,33.139484,33.136917,30.396523,30.358004,31.553539,33.139455,30.423527,30.395125,30.819216,30.367779,30.424692,30.393139,30.403584,30.419046,30.426421,30.3701,33.105255,30.380764,30.419068,30.363079,33.125895,30.363071,30.375069,30.223736,30.344951,30.396096,33.139512,30.362432,32.308047,30.361914,32.308084,30.362374,30.362845,32.308218,33.120216,30.362758,30.362693,30.362438,30.361734,30.361734,30.362476,30.361917,30.362381,33.120263,30.42695,30.361729,30.362061,30.361914,30.361748,30.385242,30.362491],[-8.917637,-9.649229,-9.560375,-9.141638,-9.559372,-9.536789,-9.345532,-9.155731,-9.246644,-8.588459,-8.609157,-9.531235,-9.472432,-7.641953,-8.588444,-9.244021,-9.529864,-9.123473,-9.506042,-9.558157,-9.518172,-9.531602,-8.900832,-9.620026,-9.50591,-8.637914,-9.516465,-8.901027,-9.50547,-8.623691,-9.505502,-8.920698,-9.156516,-8.932292,-9.529613,-8.58908,-9.505492,-8.887499,-9.50209,-8.887515,-9.50518,-9.505036,-8.8873,-8.564985,-9.504944,-9.50491,-9.504969,-9.502002,-9.50209,-9.505317,-9.506015,-9.50522,-8.564877,-9.243382,-9.501985,-9.501403,-9.501681,-9.501605,-9.521365,-9.504801],{"iconUrl":{"data":["truck_inactive.png","www\truck_pause.png"],"index":[0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},"iconWidth":20,"iconHeight":20},null,"Flotte",{"interactive":true,"draggable":false,"keyboard":true,"title":"","alt":"","zIndexOffset":0,"opacity":1,"riseOnHover":false,"riseOffset":250,"rotationAngle":[21,256,83,310,337,182,0,295,289,98,332,314,167,135,80,148,271,39,359,119,131,311,23,0,7,137,63,199,284,337,116,179,114,81,130,353,329,0,174,296,192,175,37,30,0,345,155,216,6,180,180,8,27,221,357,261,178,49,294,68]},["<div style='font-family:Lato ; color: #003366'><strong>T20<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:11:03<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T14<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:10:59<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T1<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:10:39<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T38<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:10:37<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T23<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:10:35<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T46<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:10:21<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T34<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:09:54<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T24<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:09:48<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T8<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:09:44<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T27<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:09:23<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T52<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:09:13<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T44<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:08:43<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T49<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:08:14<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T48<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:07:57<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T29<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:07:07<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T55<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:06:52<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T4<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:06:46<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T28<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:06:44<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T2<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:06:39<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T50<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:06:35<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T59<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:06:34<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T54<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:06:33<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T36<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:06:27<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T37<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:04:16<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T40<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:04:11<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T6<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:04:00<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T41<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:03:59<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T58<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:03:38<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T16<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 17:03:25<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T43<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 16:54:17<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T42<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 16:45:30<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T12<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 16:37:32<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T60<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 16:29:58<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T10<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 16:24:44<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T45<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 15:58:52<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T18<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 15:01:40<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T35<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 14:45:42<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T39<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 14:40:18<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T17<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 13:43:04<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T13<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 11:37:53<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T7<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 10:41:54<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T25<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 10:09:50<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T3<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-26 09:19:49<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T31<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-25 15:01:02<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T15<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-25 12:32:41<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T26<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-25 10:30:29<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T30<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-23 15:58:54<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T22<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-23 13:49:07<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T21<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-23 13:28:26<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T47<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-23 09:55:07<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T32<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-21 10:51:21<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T5<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-13 16:51:58<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T53<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-07 18:30:19<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T11<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-07 08:37:57<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T33<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2021-01-01 11:19:15<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T56<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2020-12-30 13:22:24<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T19<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2020-12-18 18:20:38<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T57<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2020-12-17 18:40:34<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T9<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2020-09-14 13:38:40<\/span><\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T51<\/strong><br/><span style='font-family:Lato ; color: #7d7d7d'>2019-12-25 17:34:49<\/span><\/i><\/div>"],null,{"showCoverageOnHover":true,"zoomToBoundsOnClick":true,"spiderfyOnMaxZoom":true,"removeOutsideVisibleBounds":true,"spiderLegPolylineOptions":{"weight":6,"color":"#222","opacity":0.5},"freezeAtZoom":false,"maxClusterRadius":50,"iconCreateFunction":"function(cluster) { return new L.DivIcon({\n html: '<div style=\"font-family:Product Sans; color: #ffffff; background-color:rgba(0, 119, 179,1)\"><span>' + cluster.getChildCount() + '<\/div><span>',\n className: 'marker-cluster'\n });}"},null,["T20","T14","T1","T38","T23","T46","T34","T24","T8","T27","T52","T44","T49","T48","T29","T55","T4","T28","T2","T50","T59","T54","T36","T37","T40","T6","T41","T58","T16","T43","T42","T12","T60","T10","T45","T18","T35","T39","T17","T13","T7","T25","T3","T31","T15","T26","T30","T22","T21","T47","T32","T5","T53","T11","T33","T56","T19","T57","T9","T51"],{"interactive":false,"permanent":true,"direction":"right","opacity":1,"offset":[0,0],"textsize":"10px","textOnly":false,"style":{"color":"#003366","font-family":"Product Sans"},"className":"","sticky":true},null]},{"method":"addMarkers","args":[[33.120216,30.362758,30.362693,30.362438,30.361734,30.361734,30.362476,30.361917,30.362381,33.120263,30.42695,30.361729,30.362061,30.361914,30.361748,30.385242,30.362491],[-8.564985,-9.504944,-9.50491,-9.504969,-9.502002,-9.50209,-9.505317,-9.506015,-9.50522,-8.564877,-9.243382,-9.501985,-9.501403,-9.501681,-9.501605,-9.521365,-9.504801],{"iconUrl":{"data":"truck_inactive.png","index":0},"iconWidth":20,"iconHeight":20},null,"Inactive",{"interactive":true,"draggable":false,"keyboard":true,"title":"","alt":"","zIndexOffset":0,"opacity":1,"riseOnHover":false,"riseOffset":250},null,null,{"showCoverageOnHover":true,"zoomToBoundsOnClick":true,"spiderfyOnMaxZoom":true,"removeOutsideVisibleBounds":true,"spiderLegPolylineOptions":{"weight":1.5,"color":"#222","opacity":0.5},"freezeAtZoom":false,"maxClusterRadius":50,"iconCreateFunction":"function(cluster) { return new L.DivIcon({\n html: '<div style=\"font-family:Product Sans; color: #ffffff; background-color:rgba(255, 77, 77,1)\"><span>' + cluster.getChildCount() + '<\/div><span>',\n className: 'marker-cluster'\n });}"},null,["T31","T15","T26","T30","T22","T21","T47","T32","T5","T53","T11","T33","T56","T19","T57","T9","T51"],{"interactive":false,"permanent":true,"direction":"right","opacity":1,"offset":[0,0],"textsize":"10px","textOnly":false,"style":{"color":"#003366","font-family":"Product Sans"},"className":"","sticky":true},null]},{"method":"addCircleMarkers","args":[[30.525171,27.9035963409999,30.410555,30.6915924334331,31.375883,28.0926514388273,30.6776765885958,33.639,30.357504,30.42267,null,33.22168,30.11454,30.417119,32.2307977,33.264842,33.4250529385084,30.3885986997238,null,33.9309,30.347174,31.58289,31.5462689460031,30.53291,30.43904,27.92898,33.60814,33.100719,33.132879,32.0802444,31.540502,30.224024,31.58522,32.545612,30.318439585271,33.579291,34.0099,28.99628,30.508771,35.16359,31.72042,33.8489,32.40134,35.1696,35.74441,29.667589,30.33736,32.209192,null,32.66944,32.205891,23.7055618,30.389480021601,33.422169,30.363433,30.3631,33.1986641742551,33.122012,33.694904,30.23334,30.3641135301074,33.6350952029712,33.6581454517176,30.3898394262438,28.4781658937492,30.42865,33.41765,30.323343,33.437199,30.4289695505632,30.244,30.223733,30.2285747482608,30.150812,30.36196,30.39001,30.27908,35.0016,30.32681,29.717784,31.373926,30.24247,30.333176,33.67205,33.17983,28.9855959034,30.38139,31.4810731382852,30.4398135532243,30.1506154,30.389,30.370157,33.107386,32.0223692,31.8644,27.1503091140029,31.6294723,33.18899,null,31.6270074,34.029322,30.394966,33.875282,31.62384,33.279879,30.24389,33.87146,30.43879,31.552937,33.365777,30.34686,33.50534,31.62625,30.339197,32.260366,32.307495,30.333041,33.418392,31.519745,29.538231,31.5783107661653,33.27104,30.48932,30.388726,33.16538,33.2072,33.20952,32.902793,33.213653,33.799713,31.52435,31.66989,30.32553,30.92056,32.248769,33.434866,32.298247,30.3909,30.394882,31.57084,29.69403,null,30.498456,null,32.2281,33.612555,31.481415,31.5784,30.3597562464137,30.4288979506769,null,30.428053,33.598032,33.12729,32.308468,30.240363,29.539084,32.489239,32.147458,30.32515,30.165849,30.3266285676705,26.7396722546545,29.718,33.0028411558475,30.434972712428,29.377078894522,31.524,31.6787766073413,33.9169,30.38351,29.690532,30.435777,31.025281,30.3931280040766,30.387156,30.3399856806418,28.4400981921154,27.939764256847,30.3899930193877,29.738974168011,30.5767316156365,30.3964880711252,30.17639,30.3814309546739,30.323159,30.347157,null,null,30.344336761199,30.3258154687175,null,null,null],[-9.325837,-11.4498573781647,-9.594252,-6.45447649443333,-9.279944,-12.049698548149,-8.16987424085939,-7.472,-9.516664,-9.55772,null,-8.54908,-9.4819,-9.236756,-7.9817398,-7.583206,-7.63822064988998,-9.52057114965387,null,-5.57329,-8.932785,-7.73069,-7.78568357328616,-8.5095,-9.21783,-12.44632,-7.56931,-8.638877,-8.597439,-8.6469173,-8.761758,-9.162908,-8.50251,-9.104951,-9.4948587459641,-7.551729,-5.05425,-10.0529,-8.788357,-6.14897,-7.98199,-5.53343,-6.48483,-2.96818,-5.78957,-9.721337,-9.4793,-6.80647,null,-8.43508,-6.806899,-16.0156171,-9.50981149612631,-5.282902,-9.507594,-9.505686,-8.58293740679456,-8.563666,-7.368588,-9.56154,-9.02509397695167,-7.49287646151648,-7.41244034167464,-9.02510106689427,-11.3467427051609,-8.90354,-7.84449,-9.491959,-7.641544,-8.90311386596449,-9.529,-9.162918,-9.52862909856208,-9.567765,-9.44083,-9.02491,-9.529858,-6.2061,-9.489,-9.788156,-8.067277,-9.40227,-9.48562,-7.41326,-8.59566,-10.052675232486,-9.47111,-8.14926019114593,-9.59004143107709,-9.6361927,-9.52,-9.523422,-8.606405,-7.9058947,-8.182433,-13.2054282475906,-7.98108449999995,-8.58686,null,-8.2728118,-6.810798,-9.579524,-5.5513,-8.02652,-7.98144,-9.52823,-7.00611,-9.64458,-7.642544,-7.791924,-9.50257,-7.49854,-8.04399,-9.480972,-8.983454,-8.888405,-9.494261,-7.844381,-9.759854,-9.693164,-8.2173303756712,-8.21676,-9.25634,-9.519518,-8.48269,-8.48304,-8.49133,-6.826371,-8.488004,-7.156616,-9.75595,-8.04896,-9.4856,-6.92568,-9.263224,-7.831205,-9.199981,-9.52027,-9.528887,-7.753399,-9.71598,null,-9.335997,null,-9.25081,-7.519273,-8.148865,-8.21631,-9.46434815952429,-9.63604668009419,null,-9.648914,-7.594748,-8.62308,-9.242283,-9.400287,-9.695696,-7.913117,-9.274746,-9.49148,-9.340293,-9.48913898471163,-11.6750428855773,-9.788,-7.6183515507115,-9.64149598686621,-10.1700111651625,-9.756,-8.0305142160208,-6.92832,-9.51298,-9.748552,-8.913782,-9.024161,-9.51907020118825,-9.524573,-9.49462027743721,-11.1014993553292,-12.9247210562612,-9.52886562850946,-7.97367968025698,-7.20461111159036,-9.20956138933172,-9.47443,-9.47019288360746,-9.529405,-9.551535,null,null,-5.83914530197848,-9.48995758347858,null,null,null],3,null,"poi",{"interactive":true,"className":"","stroke":false,"color":"#03F","weight":5,"opacity":0.5,"fill":true,"fillColor":"#0088cc","fillOpacity":0.5},null,null,null,null,["C1","C2","C3","C4","C5","C6","C7","C8","C9","C10","C11","C12","C13","C14","C15","C16","C17","C18","C19","C20","C21","C22","C23","C24","C25","C26","C27","C28","C29","C30","C31","C32","C33","C34","C35","C36","C37","C38","C39","C40","C41","C42","C43","C44","C45","C46","C47","C48","C49","C50","C51","C52","C53","C54","C55","C56","C57","C58","C59","C60","C61","C62","C63","C64","C65","C66","C67","C68","C69","C70","C71","C72","C73","C74","C75","C76","C77","C78","C79","C80","C81","C82","C83","C84","C85","C86","C87","C88","C89","C90","C91","C92","C93","C94","C95","C96","C97","C98","C99","C100","C101","C102","C103","C104","C105","C106","C107","C108","C109","C110","C111","C112","C113","C114","C115","C116","C117","C118","C119","C120","C121","C122","C123","C124","C125","C126","C127","C128","C129","C130","C131","C132","C133","C134","C135","C136","C137","C138","C139","C140","C141","C142","C143","C144","C145","C146","C147","C148","C149","C150","C151","C152","C153","C154","C155","C156","C157","C158","C159","C160","C161","C162","C163","C164","C165","C166","C167","C168","C169","C170","C171","C172","C173","C174","C175","C176","C177","C178","C179","C180","C181","C182","C183","C184","C185","C186","C187","C188","C189","C190","C191","C192","C193","C194"],{"interactive":false,"permanent":false,"direction":"top","opacity":1,"offset":[0,0],"textsize":"10px","textOnly":false,"className":"","sticky":true},null]},{"method":"addCircleMarkers","args":[[30.381353,30.428522,30.347566,30.269427,30.348264,30.19821,30.581951,30.223413,30.427636,33.139484,33.136917,30.396523,30.358004,31.553539,33.139455,30.423527,30.395125,30.819216,30.367779,30.424692,30.393139,30.403584,30.419046,30.426421,30.3701,33.105255,30.380764,30.419068,30.363079,33.125895,30.363071,30.375069,30.223736,30.344951,30.396096,33.139512,30.362432,32.308047,30.361914,32.308084,30.362374,30.362845,32.308218,33.120216,30.362758,30.362693,30.362438,30.361734,30.361734,30.362476,30.361917,30.362381,33.120263,30.42695,30.361729,30.362061,30.361914,30.361748,30.385242,30.362491],[-8.917637,-9.649229,-9.560375,-9.141638,-9.559372,-9.536789,-9.345532,-9.155731,-9.246644,-8.588459,-8.609157,-9.531235,-9.472432,-7.641953,-8.588444,-9.244021,-9.529864,-9.123473,-9.506042,-9.558157,-9.518172,-9.531602,-8.900832,-9.620026,-9.50591,-8.637914,-9.516465,-8.901027,-9.50547,-8.623691,-9.505502,-8.920698,-9.156516,-8.932292,-9.529613,-8.58908,-9.505492,-8.887499,-9.50209,-8.887515,-9.50518,-9.505036,-8.8873,-8.564985,-9.504944,-9.50491,-9.504969,-9.502002,-9.50209,-9.505317,-9.506015,-9.50522,-8.564877,-9.243382,-9.501985,-9.501403,-9.501681,-9.501605,-9.521365,-9.504801],7,null,"Etat",{"interactive":true,"className":"","stroke":true,"color":"gray","weight":1,"opacity":0.5,"fill":true,"fillColor":["#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#e6e6e6","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#e6e6e6","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#4d88ff","#fcba03","#fcba03","#fcba03","#fcba03","#fcba03","#ff6e52","#ff6e52","#ff6e52","#ff6e52","#ff6e52","#ff6e52","#ff6e52","#ff6e52","#ff6e52","#ff6e52","#ff6e52","#ff6e52","#ff6e52","#ff6e52","#ff6e52","#ff6e52","#ff6e52","#ff6e52","#ff6e52","#ff6e52","#ff6e52"],"fillOpacity":0.5},null,null,null,null,["<div style='font-family:Lato ; color: #003366'><strong>T20<\/strong><br/>2021-01-26 17:11:03<br/>378 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T14<\/strong><br/>2021-01-26 17:10:59<br/>316 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T1<\/strong><br/>2021-01-26 17:10:39<br/>457 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T38<\/strong><br/>2021-01-26 17:10:37<br/>438 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T23<\/strong><br/>2021-01-26 17:10:35<br/>313 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T46<\/strong><br/>2021-01-26 17:10:21<br/>535 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T34<\/strong><br/>2021-01-26 17:09:54<br/>196 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T24<\/strong><br/>2021-01-26 17:09:48<br/>262 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T8<\/strong><br/>2021-01-26 17:09:44<br/>291 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T27<\/strong><br/>2021-01-26 17:09:23<br/>106 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T52<\/strong><br/>2021-01-26 17:09:13<br/>164 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T44<\/strong><br/>2021-01-26 17:08:43<br/>295 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T49<\/strong><br/>2021-01-26 17:08:14<br/>430 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T48<\/strong><br/>2021-01-26 17:07:57<br/>258 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T29<\/strong><br/>2021-01-26 17:07:07<br/>192 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T55<\/strong><br/>2021-01-26 17:06:52<br/>632 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T4<\/strong><br/>2021-01-26 17:06:46<br/>210 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T28<\/strong><br/>2021-01-26 17:06:44<br/>208 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T2<\/strong><br/>2021-01-26 17:06:39<br/>324 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T50<\/strong><br/>2021-01-26 17:06:35<br/>343 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T59<\/strong><br/>2021-01-26 17:06:34<br/>358 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T54<\/strong><br/>2021-01-26 17:06:33<br/>262 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T36<\/strong><br/>2021-01-26 17:06:27<br/>590 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T37<\/strong><br/>2021-01-26 17:04:16<br/>352 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T40<\/strong><br/>2021-01-26 17:04:11<br/>184 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T6<\/strong><br/>2021-01-26 17:04:00<br/>184 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T41<\/strong><br/>2021-01-26 17:03:59<br/>1 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T58<\/strong><br/>2021-01-26 17:03:38<br/>432 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T16<\/strong><br/>2021-01-26 17:03:25<br/>362 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T43<\/strong><br/>2021-01-26 16:54:17<br/>8 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T42<\/strong><br/>2021-01-26 16:45:30<br/>465 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T12<\/strong><br/>2021-01-26 16:37:32<br/>535 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T60<\/strong><br/>2021-01-26 16:29:58<br/>376 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T10<\/strong><br/>2021-01-26 16:24:44<br/>302 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T45<\/strong><br/>2021-01-26 15:58:52<br/>213 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T18<\/strong><br/>2021-01-26 15:01:40<br/>153 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T35<\/strong><br/>2021-01-26 14:45:42<br/>1 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T39<\/strong><br/>2021-01-26 14:40:18<br/>129 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T17<\/strong><br/>2021-01-26 13:43:04<br/>9 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T13<\/strong><br/>2021-01-26 11:37:53<br/>138 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T7<\/strong><br/>2021-01-26 10:41:54<br/>162 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T25<\/strong><br/>2021-01-26 10:09:50<br/>9 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T3<\/strong><br/>2021-01-26 09:19:49<br/>127 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T31<\/strong><br/>2021-01-25 15:01:02<br/>5 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T15<\/strong><br/>2021-01-25 12:32:41<br/>0 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T26<\/strong><br/>2021-01-25 10:30:29<br/>0 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T30<\/strong><br/>2021-01-23 15:58:54<br/>0 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T22<\/strong><br/>2021-01-23 13:49:07<br/>0 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T21<\/strong><br/>2021-01-23 13:28:26<br/>0 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T47<\/strong><br/>2021-01-23 09:55:07<br/>0 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T32<\/strong><br/>2021-01-21 10:51:21<br/>0 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T5<\/strong><br/>2021-01-13 16:51:58<br/>0 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T53<\/strong><br/>2021-01-07 18:30:19<br/>0 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T11<\/strong><br/>2021-01-07 08:37:57<br/>0 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T33<\/strong><br/>2021-01-01 11:19:15<br/>0 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T56<\/strong><br/>2020-12-30 13:22:24<br/>0 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T19<\/strong><br/>2020-12-18 18:20:38<br/>0 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T57<\/strong><br/>2020-12-17 18:40:34<br/>0 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T9<\/strong><br/>2020-09-14 13:38:40<br/>0 km<\/i><\/div>","<div style='font-family:Lato ; color: #003366'><strong>T51<\/strong><br/>2019-12-25 17:34:49<br/>0 km<\/i><\/div>"],{"interactive":false,"permanent":false,"direction":"auto","opacity":1,"offset":[0,0],"textsize":"10px","textOnly":false,"className":"","sticky":true},null]},{"method":"addControl","args":["<div><a> <img src=\"mixtra_logo.png\" alt=\" Mixtra\" width= 50px height= 50> <\/a><\/div>","bottomleft",null,"info legend"]},{"method":"addSearchFeatures","args":["Flotte",{"openPopup":false,"url":"","propertyLoc":"loc","propertyName":"label","moveToLocation":true,"zoom":17,"container":"","minLength":1,"initial":false,"casesensitive":false,"autoType":true,"delayType":400,"tooltipLimit":-1,"tipAutoSubmit":true,"firstTipSubmit":false,"autoResize":true,"collapsed":true,"autoCollapse":false,"autoCollapseTime":1200,"textErr":"Location Not Found","textCancel":"Cancel","textPlaceholder":"Search...","position":"topleft","hideMarkerOnCollapse":false}]},{"method":"addLayersControl","args":[["Etat","Flotte","Inactive"],"poi",{"collapsed":false,"autoZIndex":true,"position":"topright"}]},{"method":"hideGroup","args":["poi"]}],"limits":{"lat":[23.7055618,35.74441],"lng":[-16.0156171,-2.96818]},"setView":[[30.013,-7.509],6.1,[]]},"evals":["calls.2.args.8.iconCreateFunction","calls.3.args.8.iconCreateFunction"],"jsHooks":[]}</script>
<script type="application/htmlwidget-sizing" data-for="htmlwidget-78e279b49d34f0da7677">{"viewer":{"width":"100%","height":400,"padding":0,"fill":true},"browser":{"width":"100%","height":400,"padding":0,"fill":true}}</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment