Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active October 26, 2016 19:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timelyportfolio/a1a4ff1856d1c904613b9dee9a3b852b to your computer and use it in GitHub Desktop.
Save timelyportfolio/a1a4ff1856d1c904613b9dee9a3b852b to your computer and use it in GitHub Desktop.
sankey export with fabric-based exportwidget
license: mit

assembled with blockbuilder.org and R htmlwidgets

Robust-er Export

Last year one of my htmlwidgets exportwidget for the widget-a-week project tried to fulfill what seems to be a very common need--statically exporting htmlwidgets client side. exportwidget worked ok but did not seem to be very robust. After the seeing the full suite of svg tests for [fabricjs](https://fabricjs.com), I just had to explore how we might use fabricjs` instead.

Example

See this bl.ock for an example of exportwidget + sankeyNetwork from networkD3.

Code

library(htmltools)
#library(sankeyD3)
library(networkD3)
#devtools::install_github("timelyportfolio/exportwidget")
library(exportwidget)

# example from ?networkD3::sankeyNetwork
# make example from sankey
URL <- paste0('https://cdn.rawgit.com/christophergandrud/networkD3/',
              'master/JSONdata/energy.json')
energy <- jsonlite::fromJSON(URL)

# Plot
sn<-sankeyNetwork(Links = energy$links, Nodes = energy$nodes, Source = 'source',
              Target = 'target', Value = 'value', NodeID = 'name',
              units = 'TWh', fontSize = 12, nodeWidth = 30)
browsable(tagList(sn,export_widget()))

Screenshot Thumbnail

The screenshot thumbnail was generated by the exportwidget and the resized by the magical blockbuilder.

screenshot of sankey

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgfTsKCiAgICAgIC8vIE9ubHkgb3ZlcnJpZGUgcmVzaXplIGlmIGJpbmRpbmdEZWYgaW1wbGVtZW50cyBpdAogICAgICBpZiAoYmluZGluZ0RlZi5yZXNpemUpIHsKICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICAgIC8vIFNoaW55IGNhbiBjYWxsIHJlc2l6ZSBiZWZvcmUgaW5pdGlhbGl6ZS9yZW5kZXJWYWx1ZSBoYXZlIGJlZW4KICAgICAgICAgIC8vIGNhbGxlZCwgd2hpY2ggZG9lc24ndCBtYWtlIHNlbnNlIGZvciB3aWRnZXRzLgogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgewogICAgICAgICAgICBiaW5kaW5nRGVmLnJlc2l6ZShlbCwgd2lkdGgsIGhlaWdodCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CgogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7CiAgICB9CiAgfTsKCiAgdmFyIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgZnVuY3Rpb24gc2NoZWR1bGVTdGF0aWNSZW5kZXIoKSB7CiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgewogICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9LCAxKTsKICAgIH0KICB9CgogIC8vIFJlbmRlciBzdGF0aWMgd2lkZ2V0cyBhZnRlciB0aGUgZG9jdW1lbnQgZmluaXNoZXMgbG9hZGluZwogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzCiAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGJpbmRpbmdzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107CiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7CiAgICAgIHZhciBtYXRjaGVzID0gYmluZGluZy5maW5kKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7CiAgICAgIGZvckVhY2gobWF0Y2hlcywgZnVuY3Rpb24oZWwpIHsKICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOwoKICAgICAgICBpZiAoaGFzQ2xhc3MoZWwsICJodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiKSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBlbC5jbGFzc05hbWUgPSBlbC5jbGFzc05hbWUgKyAiIGh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCI7CgogICAgICAgIHZhciBpbml0UmVzdWx0OwogICAgICAgIGlmIChiaW5kaW5nLmluaXRpYWxpemUpIHsKICAgICAgICAgIGluaXRSZXN1bHQgPSBiaW5kaW5nLmluaXRpYWxpemUoZWwsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICk7CiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsKICAgICAgICAgIHZhciBsYXN0U2l6ZSA9IHt9OwogICAgICAgICAgdmFyIHJlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBzaXplID0gewogICAgICAgICAgICAgIHc6IHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgICBoOiBzaXplT2JqID8gc2l6ZU9iai5nZXRIZWlnaHQoKSA6IGVsLm9mZnNldEhlaWdodAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSAwICYmIHNpemUuaCA9PT0gMCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgbGFzdFNpemUgPSBzaXplOwogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOwogICAgICAgICAgfTsKCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsKCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgY2FzZXMgd2hlcmUgd2UncmUgcnVubmluZyBpbiBhIFNoaW55CiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dAogICAgICAgICAgLy8gcmF0aGVyIGEgc2ltcGxlIHN0YXRpYyB3aWRnZXQuIE9uZSBleGFtcGxlIG9mIHRoaXMgaXMKICAgICAgICAgIC8vIGFuIHJtYXJrZG93biBkb2N1bWVudCB0aGF0IGhhcyBydW50aW1lOnNoaW55IGFuZCB3aWRnZXQKICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8KICAgICAgICAgIC8vIGNhbGwgcmVzaXplIGhhbmRsZXJzIGZvciBTaGlueSBvdXRwdXRzLCBub3QgZm9yIHN0YXRpYwogICAgICAgICAgLy8gd2lkZ2V0cywgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLgogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgInNob3duLmh0bWx3aWRnZXRzIHNob3duLmJzLnRhYi5odG1sd2lkZ2V0cyBzaG93bi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgICB3aW5kb3cualF1ZXJ5KGRvY3VtZW50KS5vbigKICAgICAgICAgICAgICAiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMgaGlkZGVuLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwKICAgICAgICAgICAgICByZXNpemVIYW5kbGVyCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBzcGVjaWZpYyBjYXNlIG9mIGlvc2xpZGVzLCB3aGljaAogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLgogICAgICAgICAgLy8gSWRlYWxseSB3ZSB3b3VsZCBub3QgaGF2ZSB0byBoYXZlIGlvc2xpZGUtc3BlY2lmaWMgY29kZQogICAgICAgICAgLy8gaGVyZSwgYnV0IHJhdGhlciBoYXZlIGlvc2xpZGVzIHJhaXNlIGEgZ2VuZXJpYyBldmVudCwKICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlCiAgICAgICAgICAvLyB3aW5kb3cgdG8gZ2V0dGluZyB0aGF0IGZpeGVkIG1heSBiZSBsb25nLgogICAgICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAvLyBicm93c2VycyBiZWNhdXNlIGlvc2xpZGVzIGl0c2VsZiBvbmx5IHN1cHBvcnRzCiAgICAgICAgICAgIC8vIHN1Y2ggYnJvd3NlcnMuCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOwogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlbGVhdmUiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhciBzY3JpcHREYXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vanNvbiddIik7CiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsKICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShzY3JpcHREYXRhLnRleHRDb250ZW50IHx8IHNjcmlwdERhdGEudGV4dCk7CiAgICAgICAgICAvLyBSZXNvbHZlIHN0cmluZ3MgbWFya2VkIGFzIGphdmFzY3JpcHQgbGl0ZXJhbHMgdG8gb2JqZWN0cwogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBkYXRhLmV2YWxzICYmIGsgPCBkYXRhLmV2YWxzLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5ldmFsdWF0ZVN0cmluZ01lbWJlcihkYXRhLngsIGRhdGEuZXZhbHNba10pOwogICAgICAgICAgfQogICAgICAgICAgYmluZGluZy5yZW5kZXJWYWx1ZShlbCwgZGF0YS54LCBpbml0UmVzdWx0KTsKICAgICAgICAgIGV2YWxBbmRSdW4oZGF0YS5qc0hvb2tzLnJlbmRlciwgaW5pdFJlc3VsdCwgW2VsLCBkYXRhLnhdKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CgogICAgaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCk7CiAgfQoKICAvLyBXYWl0IHVudGlsIGFmdGVyIHRoZSBkb2N1bWVudCBoYXMgbG9hZGVkIHRvIHJlbmRlciB0aGUgd2lkZ2V0cy4KICBpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgewogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgYXJndW1lbnRzLmNhbGxlZSwgZmFsc2UpOwogICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICB9LCBmYWxzZSk7CiAgfSBlbHNlIGlmIChkb2N1bWVudC5hdHRhY2hFdmVudCkgewogICAgZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGZ1bmN0aW9uKCkgewogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgewogICAgICAgIGRvY3VtZW50LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlKTsKICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICAgIH0KICAgIH0pOwogIH0KCgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRBdHRhY2htZW50VXJsID0gZnVuY3Rpb24oZGVwbmFtZSwga2V5KSB7CiAgICAvLyBJZiBubyBrZXksIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGl0ZW0KICAgIGlmICh0eXBlb2Yoa2V5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgIGtleSA9IDE7CgogICAgdmFyIGxpbmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkZXBuYW1lICsgIi0iICsga2V5ICsgIi1hdHRhY2htZW50Iik7CiAgICBpZiAoIWxpbmspIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdHRhY2htZW50ICIgKyBkZXBuYW1lICsgIi8iICsga2V5ICsgIiBub3QgZm91bmQgaW4gZG9jdW1lbnQiKTsKICAgIH0KICAgIHJldHVybiBsaW5rLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5kYXRhZnJhbWVUb0QzID0gZnVuY3Rpb24oZGYpIHsKICAgIHZhciBuYW1lcyA9IFtdOwogICAgdmFyIGxlbmd0aDsKICAgIGZvciAodmFyIG5hbWUgaW4gZGYpIHsKICAgICAgICBpZiAoZGYuaGFzT3duUHJvcGVydHkobmFtZSkpCiAgICAgICAgICAgIG5hbWVzLnB1c2gobmFtZSk7CiAgICAgICAgaWYgKHR5cGVvZihkZltuYW1lXSkgIT09ICJvYmplY3QiIHx8IHR5cGVvZihkZltuYW1lXS5sZW5ndGgpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZihsZW5ndGgpICE9PSAidW5kZWZpbmVkIiAmJiBsZW5ndGggIT09IGRmW25hbWVdLmxlbmd0aCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMgb2YgdGhlIHNhbWUgbGVuZ3RoIik7CiAgICAgICAgfQogICAgICAgIGxlbmd0aCA9IGRmW25hbWVdLmxlbmd0aDsKICAgIH0KICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgaXRlbTsKICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IGxlbmd0aDsgcm93KyspIHsKICAgICAgICBpdGVtID0ge307CiAgICAgICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgbmFtZXMubGVuZ3RoOyBjb2wrKykgewogICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1dID0gZGZbbmFtZXNbY29sXV1bcm93XTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0cy5wdXNoKGl0ZW0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgd2luZG93LkhUTUxXaWRnZXRzLnRyYW5zcG9zZUFycmF5MkQgPSBmdW5jdGlvbihhcnJheSkgewogICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gYXJyYXk7CiAgICAgIHZhciBuZXdBcnJheSA9IGFycmF5WzBdLm1hcChmdW5jdGlvbihjb2wsIGkpIHsKICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24ocm93KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJvd1tpXQogICAgICAgICAgfSkKICAgICAgfSk7CiAgICAgIHJldHVybiBuZXdBcnJheTsKICB9OwogIC8vIFNwbGl0IHZhbHVlIGF0IHNwbGl0Q2hhciwgYnV0IGFsbG93IHNwbGl0Q2hhciB0byBiZSBlc2NhcGVkCiAgLy8gdXNpbmcgZXNjYXBlQ2hhci4gQW55IG90aGVyIGNoYXJhY3RlcnMgZXNjYXBlZCBieSBlc2NhcGVDaGFyCiAgLy8gd2lsbCBiZSBpbmNsdWRlZCBhcyB1c3VhbCAoaW5jbHVkaW5nIGVzY2FwZUNoYXIgaXRzZWxmKS4KICBmdW5jdGlvbiBzcGxpdFdpdGhFc2NhcGUodmFsdWUsIHNwbGl0Q2hhciwgZXNjYXBlQ2hhcikgewogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHZhciBlc2NhcGVNb2RlID0gZmFsc2U7CiAgICB2YXIgY3VycmVudFJlc3VsdCA9ICIiOwogICAgZm9yICh2YXIgcG9zID0gMDsgcG9zIDwgdmFsdWUubGVuZ3RoOyBwb3MrKykgewogICAgICBpZiAoIWVzY2FwZU1vZGUpIHsKICAgICAgICBpZiAodmFsdWVbcG9zXSA9PT0gc3BsaXRDaGFyKSB7CiAgICAgICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7CiAgICAgICAgICBjdXJyZW50UmVzdWx0ID0gIiI7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtwb3NdID09PSBlc2NhcGVDaGFyKSB7CiAgICAgICAgICBlc2NhcGVNb2RlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107CiAgICAgICAgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBpZiAoY3VycmVudFJlc3VsdCAhPT0gIiIpIHsKICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQogIC8vIEZ1bmN0aW9uIGF1dGhvcmVkIGJ5IFlpaHVpL0pKIEFsbGFpcmUKICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIgPSBmdW5jdGlvbihvLCBtZW1iZXIpIHsKICAgIHZhciBwYXJ0cyA9IHNwbGl0V2l0aEVzY2FwZShtZW1iZXIsICcuJywgJ1xcJyk7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgcGFydCA9IHBhcnRzW2ldOwogICAgICAvLyBwYXJ0IG1heSBiZSBhIGNoYXJhY3RlciBvciAnbnVtZXJpYycgbWVtYmVyIG5hbWUKICAgICAgaWYgKG8gIT09IG51bGwgJiYgdHlwZW9mIG8gPT09ICJvYmplY3QiICYmIHBhcnQgaW4gbykgewogICAgICAgIGlmIChpID09IChsIC0gMSkpIHsgLy8gaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgdGhlbiBldmFsdWxhdGUKICAgICAgICAgIGlmICh0eXBlb2Ygb1twYXJ0XSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIG9bcGFydF0gPSBldmFsKCIoIiArIG9bcGFydF0gKyAiKSIpOwogICAgICAgIH0gZWxzZSB7IC8vIG90aGVyd2lzZSBjb250aW51ZSB0byBuZXh0IGVtYmVkZGVkIG9iamVjdAogICAgICAgICAgbyA9IG9bcGFydF07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKCiAgLy8gUmV0cmlldmUgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZiBhbgogIC8vIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQsIG9yIG51bGwgaWYgbm9uZS4KICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbihlbCkgewogICAgcmV0dXJuIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKTsKICB9OwoKICAvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwKICAvLyBhbmQgcmV0dXJucyB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhhdCBlbGVtZW50LCBpZiBhbnkuIElmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUKICAvLyBzZWxlY3Rvciwgb3IgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQgaGFzIG5vIEhUTUxXaWRnZXQKICAvLyBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggaXQsIHRoZW4gbnVsbCBpcyByZXR1cm5lZC4KICAvLwogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4KICB3aW5kb3cuSFRNTFdpZGdldHMuZmluZCA9IGZ1bmN0aW9uKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICBzZWxlY3RvciA9IHNjb3BlOwogICAgICBzY29wZSA9IGRvY3VtZW50OwogICAgfQoKICAgIHZhciBlbCA9IHNjb3BlLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgaWYgKGVsID09PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShlbCk7CiAgICB9CiAgfTsKCiAgLy8gRmluZHMgYWxsIGVsZW1lbnRzIGluIHRoZSBzY29wZSB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciwgYW5kCiAgLy8gcmV0dXJucyB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZXMgKGkuZS4gdGhlIHJldHVybiB2YWx1ZXMgb2YKICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudHMsIGluIGFuIGFycmF5LiBJZiBlbGVtZW50cyB0aGF0CiAgLy8gbWF0Y2ggdGhlIHNlbGVjdG9yIGRvbid0IGhhdmUgYW4gYXNzb2NpYXRlZCBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UsIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4gbnVsbHMuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmRBbGwgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgbm9kZXMgPSBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsKICAgIHZhciByZXN1bHRzID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc3VsdHMucHVzaCh3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2Uobm9kZXNbaV0pKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHZhciBwb3N0UmVuZGVySGFuZGxlcnMgPSBbXTsKICBmdW5jdGlvbiBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKSB7CiAgICB3aGlsZSAocG9zdFJlbmRlckhhbmRsZXJzLmxlbmd0aCkgewogICAgICB2YXIgaGFuZGxlciA9IHBvc3RSZW5kZXJIYW5kbGVycy5zaGlmdCgpOwogICAgICBpZiAoaGFuZGxlcikgewogICAgICAgIGhhbmRsZXIoKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8gUmVnaXN0ZXIgdGhlIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlCiAgLy8gbmV4dCB0aW1lIHN0YXRpYyB3aWRnZXRzIGFyZSByZW5kZXJlZC4KICB3aW5kb3cuSFRNTFdpZGdldHMuYWRkUG9zdFJlbmRlckhhbmRsZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgcG9zdFJlbmRlckhhbmRsZXJzLnB1c2goY2FsbGJhY2spOwogIH07CgogIC8vIFRha2VzIGEgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb24sIGFuZCByZXR1cm5zIGFuCiAgLy8gb2xkLXN0eWxlIGNsYXNzLWJvdW5kIGRlZmluaXRpb24uIFRoaXMgc2F2ZXMgdXMgZnJvbSBoYXZpbmcKICAvLyB0byByZXdyaXRlIGFsbCB0aGUgbG9naWMgaW4gdGhpcyBmaWxlIHRvIGFjY29tb2RhdGUgYm90aAogIC8vIHR5cGVzIG9mIGRlZmluaXRpb25zLgogIGZ1bmN0aW9uIGNyZWF0ZUxlZ2FjeURlZmluaXRpb25BZGFwdGVyKGRlZm4pIHsKICAgIHZhciByZXN1bHQgPSB7CiAgICAgIG5hbWU6IGRlZm4ubmFtZSwKICAgICAgdHlwZTogZGVmbi50eXBlLAogICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgewogICAgICAgIHJldHVybiBkZWZuLmZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpOwogICAgICB9LAogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oZWwsIHgsIGluc3RhbmNlKSB7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlbmRlclZhbHVlKHgpOwogICAgICB9LAogICAgICByZXNpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXNpemUod2lkdGgsIGhlaWdodCk7CiAgICAgIH0KICAgIH07CgogICAgaWYgKGRlZm4uZmluZCkKICAgICAgcmVzdWx0LmZpbmQgPSBkZWZuLmZpbmQ7CiAgICBpZiAoZGVmbi5yZW5kZXJFcnJvcikKICAgICAgcmVzdWx0LnJlbmRlckVycm9yID0gZGVmbi5yZW5kZXJFcnJvcjsKICAgIGlmIChkZWZuLmNsZWFyRXJyb3IpCiAgICAgIHJlc3VsdC5jbGVhckVycm9yID0gZGVmbi5jbGVhckVycm9yOwoKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9KSgpOwoK"></script>
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe3JldHVybiB0Pm4/LTE6bj50PzE6bj49dD8wOjAvMH1mdW5jdGlvbiB0KG4pe3JldHVybiBudWxsPT09bj8wLzA6K259ZnVuY3Rpb24gZShuKXtyZXR1cm4haXNOYU4obil9ZnVuY3Rpb24gcihuKXtyZXR1cm57bGVmdDpmdW5jdGlvbih0LGUscix1KXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYocj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJih1PXQubGVuZ3RoKTt1PnI7KXt2YXIgaT1yK3U+Pj4xO24odFtpXSxlKTwwP3I9aSsxOnU9aX1yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24odCxlLHIsdSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYodT10Lmxlbmd0aCk7dT5yOyl7dmFyIGk9cit1Pj4+MTtuKHRbaV0sZSk+MD91PWk6cj1pKzF9cmV0dXJuIHJ9fX1mdW5jdGlvbiB1KG4pe3JldHVybiBuLmxlbmd0aH1mdW5jdGlvbiBpKG4pe2Zvcih2YXIgdD0xO24qdCUxOyl0Kj0xMDtyZXR1cm4gdH1mdW5jdGlvbiBvKG4sdCl7Zm9yKHZhciBlIGluIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGUse3ZhbHVlOnRbZV0sZW51bWVyYWJsZTohMX0pfWZ1bmN0aW9uIGEoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBjKG4pe3JldHVybihuKz0iIik9PT1kYXx8blswXT09PW1hP21hK246bn1mdW5jdGlvbiBsKG4pe3JldHVybihuKz0iIilbMF09PT1tYT9uLnNsaWNlKDEpOm59ZnVuY3Rpb24gcyhuKXtyZXR1cm4gYyhuKWluIHRoaXMuX31mdW5jdGlvbiBmKG4pe3JldHVybihuPWMobikpaW4gdGhpcy5fJiZkZWxldGUgdGhpcy5fW25dfWZ1bmN0aW9uIGgoKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaChsKHQpKTtyZXR1cm4gbn1mdW5jdGlvbiBnKCl7dmFyIG49MDtmb3IodmFyIHQgaW4gdGhpcy5fKSsrbjtyZXR1cm4gbn1mdW5jdGlvbiBwKCl7Zm9yKHZhciBuIGluIHRoaXMuXylyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB2KCl7dGhpcy5fPU9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24gZChuLHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9ZS5hcHBseSh0LGFyZ3VtZW50cyk7cmV0dXJuIHI9PT10P246cn19ZnVuY3Rpb24gbShuLHQpe2lmKHQgaW4gbilyZXR1cm4gdDt0PXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKTtmb3IodmFyIGU9MCxyPXlhLmxlbmd0aDtyPmU7KytlKXt2YXIgdT15YVtlXSt0O2lmKHUgaW4gbilyZXR1cm4gdX19ZnVuY3Rpb24geSgpe31mdW5jdGlvbiBNKCl7fWZ1bmN0aW9uIHgobil7ZnVuY3Rpb24gdCgpe2Zvcih2YXIgdCxyPWUsdT0tMSxpPXIubGVuZ3RoOysrdTxpOykodD1yW3VdLm9uKSYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG59dmFyIGU9W10scj1uZXcgYTtyZXR1cm4gdC5vbj1mdW5jdGlvbih0LHUpe3ZhciBpLG89ci5nZXQodCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9vJiZvLm9uOihvJiYoby5vbj1udWxsLGU9ZS5zbGljZSgwLGk9ZS5pbmRleE9mKG8pKS5jb25jYXQoZS5zbGljZShpKzEpKSxyLnJlbW92ZSh0KSksdSYmZS5wdXNoKHIuc2V0KHQse29uOnV9KSksbil9LHR9ZnVuY3Rpb24gYigpe3RhLmV2ZW50LnByZXZlbnREZWZhdWx0KCl9ZnVuY3Rpb24gXygpe2Zvcih2YXIgbix0PXRhLmV2ZW50O249dC5zb3VyY2VFdmVudDspdD1uO3JldHVybiB0fWZ1bmN0aW9uIHcobil7Zm9yKHZhciB0PW5ldyBNLGU9MCxyPWFyZ3VtZW50cy5sZW5ndGg7KytlPHI7KXRbYXJndW1lbnRzW2VdXT14KHQpO3JldHVybiB0Lm9mPWZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKHUpe3RyeXt2YXIgaT11LnNvdXJjZUV2ZW50PXRhLmV2ZW50O3UudGFyZ2V0PW4sdGEuZXZlbnQ9dSx0W3UudHlwZV0uYXBwbHkoZSxyKX1maW5hbGx5e3RhLmV2ZW50PWl9fX0sdH1mdW5jdGlvbiBTKG4pe3JldHVybiB4YShuLGthKSxufWZ1bmN0aW9uIGsobil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmdW5jdGlvbigpe3JldHVybiBiYShuLHRoaXMpfX1mdW5jdGlvbiBFKG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gX2Eobix0aGlzKX19ZnVuY3Rpb24gQShuLHQpe2Z1bmN0aW9uIGUoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZShuKX1mdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpfWZ1bmN0aW9uIHUoKXt0aGlzLnNldEF0dHJpYnV0ZShuLHQpfWZ1bmN0aW9uIGkoKXt0aGlzLnNldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCx0KX1mdW5jdGlvbiBvKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZShuKTp0aGlzLnNldEF0dHJpYnV0ZShuLGUpfWZ1bmN0aW9uIGEoKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKTp0aGlzLnNldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCxlKX1yZXR1cm4gbj10YS5ucy5xdWFsaWZ5KG4pLG51bGw9PXQ/bi5sb2NhbD9yOmU6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bi5sb2NhbD9hOm86bi5sb2NhbD9pOnV9ZnVuY3Rpb24gTihuKXtyZXR1cm4gbi50cmltKCkucmVwbGFjZSgvXHMrL2csIiAiKX1mdW5jdGlvbiBDKG4pe3JldHVybiBuZXcgUmVnRXhwKCIoPzpefFxccyspIit0YS5yZXF1b3RlKG4pKyIoPzpcXHMrfCQpIiwiZyIpfWZ1bmN0aW9uIHoobil7cmV0dXJuKG4rIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBxKG4sdCl7ZnVuY3Rpb24gZSgpe2Zvcih2YXIgZT0tMTsrK2U8dTspbltlXSh0aGlzLHQpfWZ1bmN0aW9uIHIoKXtmb3IodmFyIGU9LTEscj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTsrK2U8dTspbltlXSh0aGlzLHIpfW49eihuKS5tYXAoTCk7dmFyIHU9bi5sZW5ndGg7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/cjplfWZ1bmN0aW9uIEwobil7dmFyIHQ9QyhuKTtyZXR1cm4gZnVuY3Rpb24oZSxyKXtpZih1PWUuY2xhc3NMaXN0KXJldHVybiByP3UuYWRkKG4pOnUucmVtb3ZlKG4pO3ZhciB1PWUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIjtyPyh0Lmxhc3RJbmRleD0wLHQudGVzdCh1KXx8ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixOKHUrIiAiK24pKSk6ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixOKHUucmVwbGFjZSh0LCIgIikpKX19ZnVuY3Rpb24gVChuLHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobil9ZnVuY3Rpb24gdSgpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkobix0LGUpfWZ1bmN0aW9uIGkoKXt2YXIgcj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1yP3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobik6dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHIsZSl9cmV0dXJuIG51bGw9PXQ/cjoiZnVuY3Rpb24iPT10eXBlb2YgdD9pOnV9ZnVuY3Rpb24gUihuLHQpe2Z1bmN0aW9uIGUoKXtkZWxldGUgdGhpc1tuXX1mdW5jdGlvbiByKCl7dGhpc1tuXT10fWZ1bmN0aW9uIHUoKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP2RlbGV0ZSB0aGlzW25dOnRoaXNbbl09ZX1yZXR1cm4gbnVsbD09dD9lOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3U6cn1mdW5jdGlvbiBEKG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246KG49dGEubnMucXVhbGlmeShuKSkubG9jYWw/ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuLnNwYWNlLG4ubG9jYWwpfTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlVVJJLG4pfX1mdW5jdGlvbiBQKCl7dmFyIG49dGhpcy5wYXJlbnROb2RlO24mJm4ucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gVShuKXtyZXR1cm57X19kYXRhX186bn19ZnVuY3Rpb24gaihuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gU2EodGhpcyxuKX19ZnVuY3Rpb24gRih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aHx8KHQ9biksZnVuY3Rpb24obixlKXtyZXR1cm4gbiYmZT90KG4uX19kYXRhX18sZS5fX2RhdGFfXyk6IW4tIWV9fWZ1bmN0aW9uIEgobix0KXtmb3IodmFyIGU9MCxyPW4ubGVuZ3RoO3I+ZTtlKyspZm9yKHZhciB1LGk9bltlXSxvPTAsYT1pLmxlbmd0aDthPm87bysrKSh1PWlbb10pJiZ0KHUsbyxlKTtyZXR1cm4gbn1mdW5jdGlvbiBPKG4pe3JldHVybiB4YShuLEFhKSxufWZ1bmN0aW9uIFkobil7dmFyIHQsZTtyZXR1cm4gZnVuY3Rpb24ocix1LGkpe3ZhciBvLGE9bltpXS51cGRhdGUsYz1hLmxlbmd0aDtmb3IoaSE9ZSYmKGU9aSx0PTApLHU+PXQmJih0PXUrMSk7IShvPWFbdF0pJiYrK3Q8YzspO3JldHVybiBvfX1mdW5jdGlvbiBJKG4sdCxlKXtmdW5jdGlvbiByKCl7dmFyIHQ9dGhpc1tvXTt0JiYodGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG4sdCx0LiQpLGRlbGV0ZSB0aGlzW29dKX1mdW5jdGlvbiB1KCl7dmFyIHU9Yyh0LHJhKGFyZ3VtZW50cykpO3IuY2FsbCh0aGlzKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIobix0aGlzW29dPXUsdS4kPWUpLHUuXz10fWZ1bmN0aW9uIGkoKXt2YXIgdCxlPW5ldyBSZWdFeHAoIl5fX29uKFteLl0rKSIrdGEucmVxdW90ZShuKSsiJCIpO2Zvcih2YXIgciBpbiB0aGlzKWlmKHQ9ci5tYXRjaChlKSl7dmFyIHU9dGhpc1tyXTt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodFsxXSx1LHUuJCksZGVsZXRlIHRoaXNbcl19fXZhciBvPSJfX29uIituLGE9bi5pbmRleE9mKCIuIiksYz1aO2E+MCYmKG49bi5zbGljZSgwLGEpKTt2YXIgbD1DYS5nZXQobik7cmV0dXJuIGwmJihuPWwsYz1WKSxhP3Q/dTpyOnQ/eTppfWZ1bmN0aW9uIFoobix0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9dGEuZXZlbnQ7dGEuZXZlbnQ9ZSx0WzBdPXRoaXMuX19kYXRhX187dHJ5e24uYXBwbHkodGhpcyx0KX1maW5hbGx5e3RhLmV2ZW50PXJ9fX1mdW5jdGlvbiBWKG4sdCl7dmFyIGU9WihuLHQpO3JldHVybiBmdW5jdGlvbihuKXt2YXIgdD10aGlzLHI9bi5yZWxhdGVkVGFyZ2V0O3ImJihyPT09dHx8OCZyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpKXx8ZS5jYWxsKHQsbil9fWZ1bmN0aW9uIFgoKXt2YXIgbj0iLmRyYWdzdXBwcmVzcy0iKyArK3FhLHQ9ImNsaWNrIituLGU9dGEuc2VsZWN0KG9hKS5vbigidG91Y2htb3ZlIituLGIpLm9uKCJkcmFnc3RhcnQiK24sYikub24oInNlbGVjdHN0YXJ0IituLGIpO2lmKHphKXt2YXIgcj1pYS5zdHlsZSx1PXJbemFdO3JbemFdPSJub25lIn1yZXR1cm4gZnVuY3Rpb24oaSl7aWYoZS5vbihuLG51bGwpLHphJiYoclt6YV09dSksaSl7dmFyIG89ZnVuY3Rpb24oKXtlLm9uKHQsbnVsbCl9O2Uub24odCxmdW5jdGlvbigpe2IoKSxvKCl9LCEwKSxzZXRUaW1lb3V0KG8sMCl9fX1mdW5jdGlvbiAkKG4sdCl7dC5jaGFuZ2VkVG91Y2hlcyYmKHQ9dC5jaGFuZ2VkVG91Y2hlc1swXSk7dmFyIGU9bi5vd25lclNWR0VsZW1lbnR8fG47aWYoZS5jcmVhdGVTVkdQb2ludCl7dmFyIHI9ZS5jcmVhdGVTVkdQb2ludCgpO2lmKDA+TGEmJihvYS5zY3JvbGxYfHxvYS5zY3JvbGxZKSl7ZT10YS5zZWxlY3QoImJvZHkiKS5hcHBlbmQoInN2ZyIpLnN0eWxlKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxtYXJnaW46MCxwYWRkaW5nOjAsYm9yZGVyOiJub25lIn0sImltcG9ydGFudCIpO3ZhciB1PWVbMF1bMF0uZ2V0U2NyZWVuQ1RNKCk7TGE9ISh1LmZ8fHUuZSksZS5yZW1vdmUoKX1yZXR1cm4gTGE/KHIueD10LnBhZ2VYLHIueT10LnBhZ2VZKTooci54PXQuY2xpZW50WCxyLnk9dC5jbGllbnRZKSxyPXIubWF0cml4VHJhbnNmb3JtKG4uZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSxbci54LHIueV19dmFyIGk9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm5bdC5jbGllbnRYLWkubGVmdC1uLmNsaWVudExlZnQsdC5jbGllbnRZLWkudG9wLW4uY2xpZW50VG9wXX1mdW5jdGlvbiBCKCl7cmV0dXJuIHRhLmV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXJ9ZnVuY3Rpb24gVygpe3JldHVybiB0YS5ldmVudC50YXJnZXR9ZnVuY3Rpb24gSigpe3JldHVybiBvYX1mdW5jdGlvbiBHKG4pe3JldHVybiBuPjA/MTowPm4/LTE6MH1mdW5jdGlvbiBLKG4sdCxlKXtyZXR1cm4odFswXS1uWzBdKSooZVsxXS1uWzFdKS0odFsxXS1uWzFdKSooZVswXS1uWzBdKX1mdW5jdGlvbiBRKG4pe3JldHVybiBuPjE/MDotMT5uP0RhOk1hdGguYWNvcyhuKX1mdW5jdGlvbiBudChuKXtyZXR1cm4gbj4xP2phOi0xPm4/LWphOk1hdGguYXNpbihuKX1mdW5jdGlvbiB0dChuKXtyZXR1cm4oKG49TWF0aC5leHAobikpLTEvbikvMn1mdW5jdGlvbiBldChuKXtyZXR1cm4oKG49TWF0aC5leHAobikpKzEvbikvMn1mdW5jdGlvbiBydChuKXtyZXR1cm4oKG49TWF0aC5leHAoMipuKSktMSkvKG4rMSl9ZnVuY3Rpb24gdXQobil7cmV0dXJuKG49TWF0aC5zaW4obi8yKSkqbn1mdW5jdGlvbiBpdCgpe31mdW5jdGlvbiBvdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBvdD8odGhpcy5oPStuLHRoaXMucz0rdCx2b2lkKHRoaXMubD0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2Ygb3Q/bmV3IG90KG4uaCxuLnMsbi5sKTp4dCgiIituLGJ0LG90KTpuZXcgb3Qobix0LGUpfWZ1bmN0aW9uIGF0KG4sdCxlKXtmdW5jdGlvbiByKG4pe3JldHVybiBuPjM2MD9uLT0zNjA6MD5uJiYobis9MzYwKSw2MD5uP2krKG8taSkqbi82MDoxODA+bj9vOjI0MD5uP2krKG8taSkqKDI0MC1uKS82MDppfWZ1bmN0aW9uIHUobil7cmV0dXJuIE1hdGgucm91bmQoMjU1KnIobikpfXZhciBpLG87cmV0dXJuIG49aXNOYU4obik/MDoobiU9MzYwKTwwP24rMzYwOm4sdD1pc05hTih0KT8wOjA+dD8wOnQ+MT8xOnQsZT0wPmU/MDplPjE/MTplLG89LjU+PWU/ZSooMSt0KTplK3QtZSp0LGk9MiplLW8sbmV3IGR0KHUobisxMjApLHUobiksdShuLTEyMCkpfWZ1bmN0aW9uIGN0KG4sdCxlKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGN0Pyh0aGlzLmg9K24sdGhpcy5jPSt0LHZvaWQodGhpcy5sPStlKSk6YXJndW1lbnRzLmxlbmd0aDwyP24gaW5zdGFuY2VvZiBjdD9uZXcgY3Qobi5oLG4uYyxuLmwpOm4gaW5zdGFuY2VvZiBzdD9odChuLmwsbi5hLG4uYik6aHQoKG49X3QoKG49dGEucmdiKG4pKS5yLG4uZyxuLmIpKS5sLG4uYSxuLmIpOm5ldyBjdChuLHQsZSl9ZnVuY3Rpb24gbHQobix0LGUpe3JldHVybiBpc05hTihuKSYmKG49MCksaXNOYU4odCkmJih0PTApLG5ldyBzdChlLE1hdGguY29zKG4qPUZhKSp0LE1hdGguc2luKG4pKnQpfWZ1bmN0aW9uIHN0KG4sdCxlKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIHN0Pyh0aGlzLmw9K24sdGhpcy5hPSt0LHZvaWQodGhpcy5iPStlKSk6YXJndW1lbnRzLmxlbmd0aDwyP24gaW5zdGFuY2VvZiBzdD9uZXcgc3Qobi5sLG4uYSxuLmIpOm4gaW5zdGFuY2VvZiBjdD9sdChuLmgsbi5jLG4ubCk6X3QoKG49ZHQobikpLnIsbi5nLG4uYik6bmV3IHN0KG4sdCxlKX1mdW5jdGlvbiBmdChuLHQsZSl7dmFyIHI9KG4rMTYpLzExNix1PXIrdC81MDAsaT1yLWUvMjAwO3JldHVybiB1PWd0KHUpKkphLHI9Z3QocikqR2EsaT1ndChpKSpLYSxuZXcgZHQodnQoMy4yNDA0NTQyKnUtMS41MzcxMzg1KnItLjQ5ODUzMTQqaSksdnQoLS45NjkyNjYqdSsxLjg3NjAxMDgqcisuMDQxNTU2KmkpLHZ0KC4wNTU2NDM0KnUtLjIwNDAyNTkqcisxLjA1NzIyNTIqaSkpfWZ1bmN0aW9uIGh0KG4sdCxlKXtyZXR1cm4gbj4wP25ldyBjdChNYXRoLmF0YW4yKGUsdCkqSGEsTWF0aC5zcXJ0KHQqdCtlKmUpLG4pOm5ldyBjdCgwLzAsMC8wLG4pfWZ1bmN0aW9uIGd0KG4pe3JldHVybiBuPi4yMDY4OTMwMzQ/bipuKm46KG4tNC8yOSkvNy43ODcwMzd9ZnVuY3Rpb24gcHQobil7cmV0dXJuIG4+LjAwODg1Nj9NYXRoLnBvdyhuLDEvMyk6Ny43ODcwMzcqbis0LzI5fWZ1bmN0aW9uIHZ0KG4pe3JldHVybiBNYXRoLnJvdW5kKDI1NSooLjAwMzA0Pj1uPzEyLjkyKm46MS4wNTUqTWF0aC5wb3cobiwxLzIuNCktLjA1NSkpfWZ1bmN0aW9uIGR0KG4sdCxlKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGR0Pyh0aGlzLnI9fn5uLHRoaXMuZz1+fnQsdm9pZCh0aGlzLmI9fn5lKSk6YXJndW1lbnRzLmxlbmd0aDwyP24gaW5zdGFuY2VvZiBkdD9uZXcgZHQobi5yLG4uZyxuLmIpOnh0KCIiK24sZHQsYXQpOm5ldyBkdChuLHQsZSl9ZnVuY3Rpb24gbXQobil7cmV0dXJuIG5ldyBkdChuPj4xNiwyNTUmbj4+OCwyNTUmbil9ZnVuY3Rpb24geXQobil7cmV0dXJuIG10KG4pKyIifWZ1bmN0aW9uIE10KG4pe3JldHVybiAxNj5uPyIwIitNYXRoLm1heCgwLG4pLnRvU3RyaW5nKDE2KTpNYXRoLm1pbigyNTUsbikudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIHh0KG4sdCxlKXt2YXIgcix1LGksbz0wLGE9MCxjPTA7aWYocj0vKFthLXpdKylcKCguKilcKS9pLmV4ZWMobikpc3dpdGNoKHU9clsyXS5zcGxpdCgiLCIpLHJbMV0pe2Nhc2UiaHNsIjpyZXR1cm4gZShwYXJzZUZsb2F0KHVbMF0pLHBhcnNlRmxvYXQodVsxXSkvMTAwLHBhcnNlRmxvYXQodVsyXSkvMTAwKTtjYXNlInJnYiI6cmV0dXJuIHQoU3QodVswXSksU3QodVsxXSksU3QodVsyXSkpfXJldHVybihpPXRjLmdldChuKSk/dChpLnIsaS5nLGkuYik6KG51bGw9PW58fCIjIiE9PW4uY2hhckF0KDApfHxpc05hTihpPXBhcnNlSW50KG4uc2xpY2UoMSksMTYpKXx8KDQ9PT1uLmxlbmd0aD8obz0oMzg0MCZpKT4+NCxvPW8+PjR8byxhPTI0MCZpLGE9YT4+NHxhLGM9MTUmaSxjPWM8PDR8Yyk6Nz09PW4ubGVuZ3RoJiYobz0oMTY3MTE2ODAmaSk+PjE2LGE9KDY1MjgwJmkpPj44LGM9MjU1JmkpKSx0KG8sYSxjKSl9ZnVuY3Rpb24gYnQobix0LGUpe3ZhciByLHUsaT1NYXRoLm1pbihuLz0yNTUsdC89MjU1LGUvPTI1NSksbz1NYXRoLm1heChuLHQsZSksYT1vLWksYz0obytpKS8yO3JldHVybiBhPyh1PS41PmM/YS8obytpKTphLygyLW8taSkscj1uPT1vPyh0LWUpL2ErKGU+dD82OjApOnQ9PW8/KGUtbikvYSsyOihuLXQpL2ErNCxyKj02MCk6KHI9MC8wLHU9Yz4wJiYxPmM/MDpyKSxuZXcgb3Qocix1LGMpfWZ1bmN0aW9uIF90KG4sdCxlKXtuPXd0KG4pLHQ9d3QodCksZT13dChlKTt2YXIgcj1wdCgoLjQxMjQ1NjQqbisuMzU3NTc2MSp0Ky4xODA0Mzc1KmUpL0phKSx1PXB0KCguMjEyNjcyOSpuKy43MTUxNTIyKnQrLjA3MjE3NSplKS9HYSksaT1wdCgoLjAxOTMzMzkqbisuMTE5MTkyKnQrLjk1MDMwNDEqZSkvS2EpO3JldHVybiBzdCgxMTYqdS0xNiw1MDAqKHItdSksMjAwKih1LWkpKX1mdW5jdGlvbiB3dChuKXtyZXR1cm4obi89MjU1KTw9LjA0MDQ1P24vMTIuOTI6TWF0aC5wb3coKG4rLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBTdChuKXt2YXIgdD1wYXJzZUZsb2F0KG4pO3JldHVybiIlIj09PW4uY2hhckF0KG4ubGVuZ3RoLTEpP01hdGgucm91bmQoMi41NSp0KTp0fWZ1bmN0aW9uIGt0KG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gbn19ZnVuY3Rpb24gRXQobil7cmV0dXJuIG59ZnVuY3Rpb24gQXQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksTnQodCxlLG4scil9fWZ1bmN0aW9uIE50KG4sdCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgbix0PWMuc3RhdHVzO2lmKCF0JiZ6dChjKXx8dD49MjAwJiYzMDA+dHx8MzA0PT09dCl7dHJ5e249ZS5jYWxsKGksYyl9Y2F0Y2gocil7cmV0dXJuIG8uZXJyb3IuY2FsbChpLHIpLHZvaWQgMH1vLmxvYWQuY2FsbChpLG4pfWVsc2Ugby5lcnJvci5jYWxsKGksYyl9dmFyIGk9e30sbz10YS5kaXNwYXRjaCgiYmVmb3Jlc2VuZCIsInByb2dyZXNzIiwibG9hZCIsImVycm9yIiksYT17fSxjPW5ldyBYTUxIdHRwUmVxdWVzdCxsPW51bGw7cmV0dXJuIW9hLlhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIGN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3Qobil8fChjPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBjP2Mub25sb2FkPWMub25lcnJvcj11OmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPjMmJnUoKX0sYy5vbnByb2dyZXNzPWZ1bmN0aW9uKG4pe3ZhciB0PXRhLmV2ZW50O3RhLmV2ZW50PW47dHJ5e28ucHJvZ3Jlc3MuY2FsbChpLGMpfWZpbmFsbHl7dGEuZXZlbnQ9dH19LGkuaGVhZGVyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49KG4rIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP2Fbbl06KG51bGw9PXQ/ZGVsZXRlIGFbbl06YVtuXT10KyIiLGkpfSxpLm1pbWVUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PW4/bnVsbDpuKyIiLGkpOnR9LGkucmVzcG9uc2VUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5yZXNwb25zZT1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLGl9LFsiZ2V0IiwicG9zdCJdLmZvckVhY2goZnVuY3Rpb24obil7aVtuXT1mdW5jdGlvbigpe3JldHVybiBpLnNlbmQuYXBwbHkoaSxbbl0uY29uY2F0KHJhKGFyZ3VtZW50cykpKX19KSxpLnNlbmQ9ZnVuY3Rpb24oZSxyLHUpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKHU9cixyPW51bGwpLGMub3BlbihlLG4sITApLG51bGw9PXR8fCJhY2NlcHQiaW4gYXx8KGEuYWNjZXB0PXQrIiwqLyoiKSxjLnNldFJlcXVlc3RIZWFkZXIpZm9yKHZhciBzIGluIGEpYy5zZXRSZXF1ZXN0SGVhZGVyKHMsYVtzXSk7cmV0dXJuIG51bGwhPXQmJmMub3ZlcnJpZGVNaW1lVHlwZSYmYy5vdmVycmlkZU1pbWVUeXBlKHQpLG51bGwhPWwmJihjLnJlc3BvbnNlVHlwZT1sKSxudWxsIT11JiZpLm9uKCJlcnJvciIsdSkub24oImxvYWQiLGZ1bmN0aW9uKG4pe3UobnVsbCxuKX0pLG8uYmVmb3Jlc2VuZC5jYWxsKGksYyksYy5zZW5kKG51bGw9PXI/bnVsbDpyKSxpfSxpLmFib3J0PWZ1bmN0aW9uKCl7cmV0dXJuIGMuYWJvcnQoKSxpfSx0YS5yZWJpbmQoaSxvLCJvbiIpLG51bGw9PXI/aTppLmdldChDdChyKSl9ZnVuY3Rpb24gQ3Qobil7cmV0dXJuIDE9PT1uLmxlbmd0aD9mdW5jdGlvbih0LGUpe24obnVsbD09dD9lOm51bGwpfTpufWZ1bmN0aW9uIHp0KG4pe3ZhciB0PW4ucmVzcG9uc2VUeXBlO3JldHVybiB0JiYidGV4dCIhPT10P24ucmVzcG9uc2U6bi5yZXNwb25zZVRleHR9ZnVuY3Rpb24gcXQoKXt2YXIgbj1MdCgpLHQ9VHQoKS1uO3Q+MjQ/KGlzRmluaXRlKHQpJiYoY2xlYXJUaW1lb3V0KGljKSxpYz1zZXRUaW1lb3V0KHF0LHQpKSx1Yz0wKToodWM9MSxhYyhxdCkpfWZ1bmN0aW9uIEx0KCl7dmFyIG49RGF0ZS5ub3coKTtmb3Iob2M9ZWM7b2M7KW4+PW9jLnQmJihvYy5mPW9jLmMobi1vYy50KSksb2M9b2MubjtyZXR1cm4gbn1mdW5jdGlvbiBUdCgpe2Zvcih2YXIgbix0PWVjLGU9MS8wO3Q7KXQuZj90PW4/bi5uPXQubjplYz10Lm46KHQudDxlJiYoZT10LnQpLHQ9KG49dCkubik7cmV0dXJuIHJjPW4sZX1mdW5jdGlvbiBSdChuLHQpe3JldHVybiB0LShuP01hdGguY2VpbChNYXRoLmxvZyhuKS9NYXRoLkxOMTApOjEpfWZ1bmN0aW9uIER0KG4sdCl7dmFyIGU9TWF0aC5wb3coMTAsMyp2YSg4LXQpKTtyZXR1cm57c2NhbGU6dD44P2Z1bmN0aW9uKG4pe3JldHVybiBuL2V9OmZ1bmN0aW9uKG4pe3JldHVybiBuKmV9LHN5bWJvbDpufX1mdW5jdGlvbiBQdChuKXt2YXIgdD1uLmRlY2ltYWwsZT1uLnRob3VzYW5kcyxyPW4uZ3JvdXBpbmcsdT1uLmN1cnJlbmN5LGk9ciYmZT9mdW5jdGlvbihuLHQpe2Zvcih2YXIgdT1uLmxlbmd0aCxpPVtdLG89MCxhPXJbMF0sYz0wO3U+MCYmYT4wJiYoYythKzE+dCYmKGE9TWF0aC5tYXgoMSx0LWMpKSxpLnB1c2gobi5zdWJzdHJpbmcodS09YSx1K2EpKSwhKChjKz1hKzEpPnQpKTspYT1yW289KG8rMSklci5sZW5ndGhdO3JldHVybiBpLnJldmVyc2UoKS5qb2luKGUpfTpFdDtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bGMuZXhlYyhuKSxyPWVbMV18fCIgIixvPWVbMl18fCI+IixhPWVbM118fCItIixjPWVbNF18fCIiLGw9ZVs1XSxzPStlWzZdLGY9ZVs3XSxoPWVbOF0sZz1lWzldLHA9MSx2PSIiLGQ9IiIsbT0hMSx5PSEwO3N3aXRjaChoJiYoaD0raC5zdWJzdHJpbmcoMSkpLChsfHwiMCI9PT1yJiYiPSI9PT1vKSYmKGw9cj0iMCIsbz0iPSIpLGcpe2Nhc2UibiI6Zj0hMCxnPSJnIjticmVhaztjYXNlIiUiOnA9MTAwLGQ9IiUiLGc9ImYiO2JyZWFrO2Nhc2UicCI6cD0xMDAsZD0iJSIsZz0iciI7YnJlYWs7Y2FzZSJiIjpjYXNlIm8iOmNhc2UieCI6Y2FzZSJYIjoiIyI9PT1jJiYodj0iMCIrZy50b0xvd2VyQ2FzZSgpKTtjYXNlImMiOnk9ITE7Y2FzZSJkIjptPSEwLGg9MDticmVhaztjYXNlInMiOnA9LTEsZz0iciJ9IiQiPT09YyYmKHY9dVswXSxkPXVbMV0pLCJyIiE9Z3x8aHx8KGc9ImciKSxudWxsIT1oJiYoImciPT1nP2g9TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxoKSk6KCJlIj09Z3x8ImYiPT1nKSYmKGg9TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxoKSkpKSxnPXNjLmdldChnKXx8VXQ7dmFyIE09bCYmZjtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9ZDtpZihtJiZuJTEpcmV0dXJuIiI7dmFyIHU9MD5ufHwwPT09biYmMD4xL24/KG49LW4sIi0iKToiLSI9PT1hPyIiOmE7aWYoMD5wKXt2YXIgYz10YS5mb3JtYXRQcmVmaXgobixoKTtuPWMuc2NhbGUobiksZT1jLnN5bWJvbCtkfWVsc2Ugbio9cDtuPWcobixoKTt2YXIgeCxiLF89bi5sYXN0SW5kZXhPZigiLiIpO2lmKDA+Xyl7dmFyIHc9eT9uLmxhc3RJbmRleE9mKCJlIik6LTE7MD53Pyh4PW4sYj0iIik6KHg9bi5zdWJzdHJpbmcoMCx3KSxiPW4uc3Vic3RyaW5nKHcpKX1lbHNlIHg9bi5zdWJzdHJpbmcoMCxfKSxiPXQrbi5zdWJzdHJpbmcoXysxKTshbCYmZiYmKHg9aSh4LDEvMCkpO3ZhciBTPXYubGVuZ3RoK3gubGVuZ3RoK2IubGVuZ3RoKyhNPzA6dS5sZW5ndGgpLGs9cz5TP25ldyBBcnJheShTPXMtUysxKS5qb2luKHIpOiIiO3JldHVybiBNJiYoeD1pKGsreCxrLmxlbmd0aD9zLWIubGVuZ3RoOjEvMCkpLHUrPXYsbj14K2IsKCI8Ij09PW8/dStuK2s6Ij4iPT09bz9rK3UrbjoiXiI9PT1vP2suc3Vic3RyaW5nKDAsUz4+PTEpK3UrbitrLnN1YnN0cmluZyhTKTp1KyhNP246aytuKSkrZX19fWZ1bmN0aW9uIFV0KG4pe3JldHVybiBuKyIifWZ1bmN0aW9uIGp0KCl7dGhpcy5fPW5ldyBEYXRlKGFyZ3VtZW50cy5sZW5ndGg+MT9EYXRlLlVUQy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YXJndW1lbnRzWzBdKX1mdW5jdGlvbiBGdChuLHQsZSl7ZnVuY3Rpb24gcih0KXt2YXIgZT1uKHQpLHI9aShlLDEpO3JldHVybiByLXQ+dC1lP2U6cn1mdW5jdGlvbiB1KGUpe3JldHVybiB0KGU9bihuZXcgaGMoZS0xKSksMSksZX1mdW5jdGlvbiBpKG4sZSl7cmV0dXJuIHQobj1uZXcgaGMoK24pLGUpLG59ZnVuY3Rpb24gbyhuLHIsaSl7dmFyIG89dShuKSxhPVtdO2lmKGk+MSlmb3IoO3I+bzspZShvKSVpfHxhLnB1c2gobmV3IERhdGUoK28pKSx0KG8sMSk7ZWxzZSBmb3IoO3I+bzspYS5wdXNoKG5ldyBEYXRlKCtvKSksdChvLDEpO3JldHVybiBhfWZ1bmN0aW9uIGEobix0LGUpe3RyeXtoYz1qdDt2YXIgcj1uZXcganQ7cmV0dXJuIHIuXz1uLG8ocix0LGUpfWZpbmFsbHl7aGM9RGF0ZX19bi5mbG9vcj1uLG4ucm91bmQ9cixuLmNlaWw9dSxuLm9mZnNldD1pLG4ucmFuZ2U9bzt2YXIgYz1uLnV0Yz1IdChuKTtyZXR1cm4gYy5mbG9vcj1jLGMucm91bmQ9SHQociksYy5jZWlsPUh0KHUpLGMub2Zmc2V0PUh0KGkpLGMucmFuZ2U9YSxufWZ1bmN0aW9uIEh0KG4pe3JldHVybiBmdW5jdGlvbih0LGUpe3RyeXtoYz1qdDt2YXIgcj1uZXcganQ7cmV0dXJuIHIuXz10LG4ocixlKS5ffWZpbmFsbHl7aGM9RGF0ZX19fWZ1bmN0aW9uIE90KG4pe2Z1bmN0aW9uIHQobil7ZnVuY3Rpb24gdCh0KXtmb3IodmFyIGUsdSxpLG89W10sYT0tMSxjPTA7KythPHI7KTM3PT09bi5jaGFyQ29kZUF0KGEpJiYoby5wdXNoKG4uc2xpY2UoYyxhKSksbnVsbCE9KHU9cGNbZT1uLmNoYXJBdCgrK2EpXSkmJihlPW4uY2hhckF0KCsrYSkpLChpPU5bZV0pJiYoZT1pKHQsbnVsbD09dT8iZSI9PT1lPyIgIjoiMCI6dSkpLG8ucHVzaChlKSxjPWErMSk7cmV0dXJuIG8ucHVzaChuLnNsaWNlKGMsYSkpLG8uam9pbigiIil9dmFyIHI9bi5sZW5ndGg7cmV0dXJuIHQucGFyc2U9ZnVuY3Rpb24odCl7dmFyIHI9e3k6MTkwMCxtOjAsZDoxLEg6MCxNOjAsUzowLEw6MCxaOm51bGx9LHU9ZShyLG4sdCwwKTtpZih1IT10Lmxlbmd0aClyZXR1cm4gbnVsbDsicCJpbiByJiYoci5IPXIuSCUxMisxMipyLnApO3ZhciBpPW51bGwhPXIuWiYmaGMhPT1qdCxvPW5ldyhpP2p0OmhjKTtyZXR1cm4iaiJpbiByP28uc2V0RnVsbFllYXIoci55LDAsci5qKToidyJpbiByJiYoIlciaW4gcnx8IlUiaW4gcik/KG8uc2V0RnVsbFllYXIoci55LDAsMSksby5zZXRGdWxsWWVhcihyLnksMCwiVyJpbiByPyhyLncrNiklNys3KnIuVy0oby5nZXREYXkoKSs1KSU3OnIudys3KnIuVS0oby5nZXREYXkoKSs2KSU3KSk6by5zZXRGdWxsWWVhcihyLnksci5tLHIuZCksby5zZXRIb3VycyhyLkgrKDB8ci5aLzEwMCksci5NK3IuWiUxMDAsci5TLHIuTCksaT9vLl86b30sdC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBufSx0fWZ1bmN0aW9uIGUobix0LGUscil7Zm9yKHZhciB1LGksbyxhPTAsYz10Lmxlbmd0aCxsPWUubGVuZ3RoO2M+YTspe2lmKHI+PWwpcmV0dXJuLTE7aWYodT10LmNoYXJDb2RlQXQoYSsrKSwzNz09PXUpe2lmKG89dC5jaGFyQXQoYSsrKSxpPUNbbyBpbiBwYz90LmNoYXJBdChhKyspOm9dLCFpfHwocj1pKG4sZSxyKSk8MClyZXR1cm4tMX1lbHNlIGlmKHUhPWUuY2hhckNvZGVBdChyKyspKXJldHVybi0xfXJldHVybiByfWZ1bmN0aW9uIHIobix0LGUpe18ubGFzdEluZGV4PTA7dmFyIHI9Xy5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLnc9dy5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1KG4sdCxlKXt4Lmxhc3RJbmRleD0wO3ZhciByPXguZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi53PWIuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gaShuLHQsZSl7RS5sYXN0SW5kZXg9MDt2YXIgcj1FLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4ubT1BLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG8obix0LGUpe1MubGFzdEluZGV4PTA7dmFyIHI9Uy5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLm09ay5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBhKG4sdCxyKXtyZXR1cm4gZShuLE4uYy50b1N0cmluZygpLHQscil9ZnVuY3Rpb24gYyhuLHQscil7cmV0dXJuIGUobixOLngudG9TdHJpbmcoKSx0LHIpfWZ1bmN0aW9uIGwobix0LHIpe3JldHVybiBlKG4sTi5YLnRvU3RyaW5nKCksdCxyKX1mdW5jdGlvbiBzKG4sdCxlKXt2YXIgcj1NLmdldCh0LnNsaWNlKGUsZSs9MikudG9Mb3dlckNhc2UoKSk7cmV0dXJuIG51bGw9PXI/LTE6KG4ucD1yLGUpfXZhciBmPW4uZGF0ZVRpbWUsaD1uLmRhdGUsZz1uLnRpbWUscD1uLnBlcmlvZHMsdj1uLmRheXMsZD1uLnNob3J0RGF5cyxtPW4ubW9udGhzLHk9bi5zaG9ydE1vbnRoczt0LnV0Yz1mdW5jdGlvbihuKXtmdW5jdGlvbiBlKG4pe3RyeXtoYz1qdDt2YXIgdD1uZXcgaGM7cmV0dXJuIHQuXz1uLHIodCl9ZmluYWxseXtoYz1EYXRlfX12YXIgcj10KG4pO3JldHVybiBlLnBhcnNlPWZ1bmN0aW9uKG4pe3RyeXtoYz1qdDt2YXIgdD1yLnBhcnNlKG4pO3JldHVybiB0JiZ0Ll99ZmluYWxseXtoYz1EYXRlfX0sZS50b1N0cmluZz1yLnRvU3RyaW5nLGV9LHQubXVsdGk9dC51dGMubXVsdGk9YWU7dmFyIE09dGEubWFwKCkseD1JdCh2KSxiPVp0KHYpLF89SXQoZCksdz1adChkKSxTPUl0KG0pLGs9WnQobSksRT1JdCh5KSxBPVp0KHkpO3AuZm9yRWFjaChmdW5jdGlvbihuLHQpe00uc2V0KG4udG9Mb3dlckNhc2UoKSx0KX0pO3ZhciBOPXthOmZ1bmN0aW9uKG4pe3JldHVybiBkW24uZ2V0RGF5KCldfSxBOmZ1bmN0aW9uKG4pe3JldHVybiB2W24uZ2V0RGF5KCldfSxiOmZ1bmN0aW9uKG4pe3JldHVybiB5W24uZ2V0TW9udGgoKV19LEI6ZnVuY3Rpb24obil7cmV0dXJuIG1bbi5nZXRNb250aCgpXX0sYzp0KGYpLGQ6ZnVuY3Rpb24obix0KXtyZXR1cm4gWXQobi5nZXREYXRlKCksdCwyKX0sZTpmdW5jdGlvbihuLHQpe3JldHVybiBZdChuLmdldERhdGUoKSx0LDIpfSxIOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0SG91cnMoKSx0LDIpfSxJOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0SG91cnMoKSUxMnx8MTIsdCwyKX0sajpmdW5jdGlvbihuLHQpe3JldHVybiBZdCgxK2ZjLmRheU9mWWVhcihuKSx0LDMpfSxMOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0TWlsbGlzZWNvbmRzKCksdCwzKX0sbTpmdW5jdGlvbihuLHQpe3JldHVybiBZdChuLmdldE1vbnRoKCkrMSx0LDIpfSxNOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0TWludXRlcygpLHQsMil9LHA6ZnVuY3Rpb24obil7cmV0dXJuIHBbKyhuLmdldEhvdXJzKCk+PTEyKV19LFM6ZnVuY3Rpb24obix0KXtyZXR1cm4gWXQobi5nZXRTZWNvbmRzKCksdCwyKX0sVTpmdW5jdGlvbihuLHQpe3JldHVybiBZdChmYy5zdW5kYXlPZlllYXIobiksdCwyKX0sdzpmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXREYXkoKX0sVzpmdW5jdGlvbihuLHQpe3JldHVybiBZdChmYy5tb25kYXlPZlllYXIobiksdCwyKX0seDp0KGgpLFg6dChnKSx5OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFl0KG4uZ2V0RnVsbFllYXIoKSUxMDAsdCwyKX0sWTpmdW5jdGlvbihuLHQpe3JldHVybiBZdChuLmdldEZ1bGxZZWFyKCklMWU0LHQsNCl9LFo6aWUsIiUiOmZ1bmN0aW9uKCl7cmV0dXJuIiUifX0sQz17YTpyLEE6dSxiOmksQjpvLGM6YSxkOlF0LGU6UXQsSDp0ZSxJOnRlLGo6bmUsTDp1ZSxtOkt0LE06ZWUscDpzLFM6cmUsVTpYdCx3OlZ0LFc6JHQseDpjLFg6bCx5Old0LFk6QnQsWjpKdCwiJSI6b2V9O3JldHVybiB0fWZ1bmN0aW9uIFl0KG4sdCxlKXt2YXIgcj0wPm4/Ii0iOiIiLHU9KHI/LW46bikrIiIsaT11Lmxlbmd0aDtyZXR1cm4gcisoZT5pP25ldyBBcnJheShlLWkrMSkuam9pbih0KSt1OnUpfWZ1bmN0aW9uIEl0KG4pe3JldHVybiBuZXcgUmVnRXhwKCJeKD86IituLm1hcCh0YS5yZXF1b3RlKS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gWnQobil7Zm9yKHZhciB0PW5ldyBhLGU9LTEscj1uLmxlbmd0aDsrK2U8cjspdC5zZXQobltlXS50b0xvd2VyQ2FzZSgpLGUpO3JldHVybiB0fWZ1bmN0aW9uIFZ0KG4sdCxlKXt2Yy5sYXN0SW5kZXg9MDt2YXIgcj12Yy5leGVjKHQuc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj8obi53PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFh0KG4sdCxlKXt2Yy5sYXN0SW5kZXg9MDt2YXIgcj12Yy5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLlU9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gJHQobix0LGUpe3ZjLmxhc3RJbmRleD0wO3ZhciByPXZjLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4uVz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBCdChuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSs0KSk7cmV0dXJuIHI/KG4ueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBXdChuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4ueT1HdCgrclswXSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSnQobix0LGUpe3JldHVybi9eWystXVxkezR9JC8udGVzdCh0PXQuc2xpY2UoZSxlKzUpKT8obi5aPS10LGUrNSk6LTF9ZnVuY3Rpb24gR3Qobil7cmV0dXJuIG4rKG4+Njg/MTkwMDoyZTMpfWZ1bmN0aW9uIEt0KG4sdCxlKXt2Yy5sYXN0SW5kZXg9MDt2YXIgcj12Yy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5tPXJbMF0tMSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBRdChuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uZD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBuZShuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KG4uaj0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB0ZShuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uSD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBlZShuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uTT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiByZShuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uUz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1ZShuLHQsZSl7dmMubGFzdEluZGV4PTA7dmFyIHI9dmMuZXhlYyh0LnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KG4uTD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpZShuKXt2YXIgdD1uLmdldFRpbWV6b25lT2Zmc2V0KCksZT10PjA/Ii0iOiIrIixyPTB8dmEodCkvNjAsdT12YSh0KSU2MDtyZXR1cm4gZStZdChyLCIwIiwyKStZdCh1LCIwIiwyKX1mdW5jdGlvbiBvZShuLHQsZSl7ZGMubGFzdEluZGV4PTA7dmFyIHI9ZGMuZXhlYyh0LnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/ZStyWzBdLmxlbmd0aDotMX1mdW5jdGlvbiBhZShuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT0tMTsrK2U8dDspbltlXVswXT10aGlzKG5bZV1bMF0pO3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxyPW5bZV07IXJbMV0odCk7KXI9blsrK2VdO3JldHVybiByWzBdKHQpfX1mdW5jdGlvbiBjZSgpe31mdW5jdGlvbiBsZShuLHQsZSl7dmFyIHI9ZS5zPW4rdCx1PXItbixpPXItdTtlLnQ9bi1pKyh0LXUpfWZ1bmN0aW9uIHNlKG4sdCl7biYmeGMuaGFzT3duUHJvcGVydHkobi50eXBlKSYmeGNbbi50eXBlXShuLHQpfWZ1bmN0aW9uIGZlKG4sdCxlKXt2YXIgcix1PS0xLGk9bi5sZW5ndGgtZTtmb3IodC5saW5lU3RhcnQoKTsrK3U8aTspcj1uW3VdLHQucG9pbnQoclswXSxyWzFdLHJbMl0pO3QubGluZUVuZCgpfWZ1bmN0aW9uIGhlKG4sdCl7dmFyIGU9LTEscj1uLmxlbmd0aDtmb3IodC5wb2x5Z29uU3RhcnQoKTsrK2U8cjspZmUobltlXSx0LDEpO3QucG9seWdvbkVuZCgpfWZ1bmN0aW9uIGdlKCl7ZnVuY3Rpb24gbihuLHQpe24qPUZhLHQ9dCpGYS8yK0RhLzQ7dmFyIGU9bi1yLG89ZT49MD8xOi0xLGE9byplLGM9TWF0aC5jb3ModCksbD1NYXRoLnNpbih0KSxzPWkqbCxmPXUqYytzKk1hdGguY29zKGEpLGg9cypvKk1hdGguc2luKGEpO19jLmFkZChNYXRoLmF0YW4yKGgsZikpLHI9bix1PWMsaT1sfXZhciB0LGUscix1LGk7d2MucG9pbnQ9ZnVuY3Rpb24obyxhKXt3Yy5wb2ludD1uLHI9KHQ9bykqRmEsdT1NYXRoLmNvcyhhPShlPWEpKkZhLzIrRGEvNCksaT1NYXRoLnNpbihhKX0sd2MubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gcGUobil7dmFyIHQ9blswXSxlPW5bMV0scj1NYXRoLmNvcyhlKTtyZXR1cm5bcipNYXRoLmNvcyh0KSxyKk1hdGguc2luKHQpLE1hdGguc2luKGUpXX1mdW5jdGlvbiB2ZShuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdK25bMl0qdFsyXX1mdW5jdGlvbiBkZShuLHQpe3JldHVybltuWzFdKnRbMl0tblsyXSp0WzFdLG5bMl0qdFswXS1uWzBdKnRbMl0sblswXSp0WzFdLW5bMV0qdFswXV19ZnVuY3Rpb24gbWUobix0KXtuWzBdKz10WzBdLG5bMV0rPXRbMV0sblsyXSs9dFsyXX1mdW5jdGlvbiB5ZShuLHQpe3JldHVybltuWzBdKnQsblsxXSp0LG5bMl0qdF19ZnVuY3Rpb24gTWUobil7dmFyIHQ9TWF0aC5zcXJ0KG5bMF0qblswXStuWzFdKm5bMV0rblsyXSpuWzJdKTtuWzBdLz10LG5bMV0vPXQsblsyXS89dH1mdW5jdGlvbiB4ZShuKXtyZXR1cm5bTWF0aC5hdGFuMihuWzFdLG5bMF0pLG50KG5bMl0pXX1mdW5jdGlvbiBiZShuLHQpe3JldHVybiB2YShuWzBdLXRbMF0pPFRhJiZ2YShuWzFdLXRbMV0pPFRhfWZ1bmN0aW9uIF9lKG4sdCl7bio9RmE7dmFyIGU9TWF0aC5jb3ModCo9RmEpO3dlKGUqTWF0aC5jb3MobiksZSpNYXRoLnNpbihuKSxNYXRoLnNpbih0KSl9ZnVuY3Rpb24gd2Uobix0LGUpeysrU2MsRWMrPShuLUVjKS9TYyxBYys9KHQtQWMpL1NjLE5jKz0oZS1OYykvU2N9ZnVuY3Rpb24gU2UoKXtmdW5jdGlvbiBuKG4sdSl7bio9RmE7dmFyIGk9TWF0aC5jb3ModSo9RmEpLG89aSpNYXRoLmNvcyhuKSxhPWkqTWF0aC5zaW4obiksYz1NYXRoLnNpbih1KSxsPU1hdGguYXRhbjIoTWF0aC5zcXJ0KChsPWUqYy1yKmEpKmwrKGw9cipvLXQqYykqbCsobD10KmEtZSpvKSpsKSx0Km8rZSphK3IqYyk7a2MrPWwsQ2MrPWwqKHQrKHQ9bykpLHpjKz1sKihlKyhlPWEpKSxxYys9bCoocisocj1jKSksd2UodCxlLHIpfXZhciB0LGUscjtEYy5wb2ludD1mdW5jdGlvbih1LGkpe3UqPUZhO3ZhciBvPU1hdGguY29zKGkqPUZhKTt0PW8qTWF0aC5jb3ModSksZT1vKk1hdGguc2luKHUpLHI9TWF0aC5zaW4oaSksRGMucG9pbnQ9bix3ZSh0LGUscil9fWZ1bmN0aW9uIGtlKCl7RGMucG9pbnQ9X2V9ZnVuY3Rpb24gRWUoKXtmdW5jdGlvbiBuKG4sdCl7bio9RmE7dmFyIGU9TWF0aC5jb3ModCo9RmEpLG89ZSpNYXRoLmNvcyhuKSxhPWUqTWF0aC5zaW4obiksYz1NYXRoLnNpbih0KSxsPXUqYy1pKmEscz1pKm8tcipjLGY9ciphLXUqbyxoPU1hdGguc3FydChsKmwrcypzK2YqZiksZz1yKm8rdSphK2kqYyxwPWgmJi1RKGcpL2gsdj1NYXRoLmF0YW4yKGgsZyk7TGMrPXAqbCxUYys9cCpzLFJjKz1wKmYsa2MrPXYsQ2MrPXYqKHIrKHI9bykpLHpjKz12Kih1Kyh1PWEpKSxxYys9diooaSsoaT1jKSksd2Uocix1LGkpfXZhciB0LGUscix1LGk7RGMucG9pbnQ9ZnVuY3Rpb24obyxhKXt0PW8sZT1hLERjLnBvaW50PW4sbyo9RmE7dmFyIGM9TWF0aC5jb3MoYSo9RmEpO3I9YypNYXRoLmNvcyhvKSx1PWMqTWF0aC5zaW4obyksaT1NYXRoLnNpbihhKSx3ZShyLHUsaSl9LERjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSksRGMubGluZUVuZD1rZSxEYy5wb2ludD1fZX19ZnVuY3Rpb24gQWUobix0KXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9bihlLHIpLHQoZVswXSxlWzFdKX1yZXR1cm4gbi5pbnZlcnQmJnQuaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZT10LmludmVydChlLHIpLGUmJm4uaW52ZXJ0KGVbMF0sZVsxXSl9KSxlfWZ1bmN0aW9uIE5lKCl7cmV0dXJuITB9ZnVuY3Rpb24gQ2Uobix0LGUscix1KXt2YXIgaT1bXSxvPVtdO2lmKG4uZm9yRWFjaChmdW5jdGlvbihuKXtpZighKCh0PW4ubGVuZ3RoLTEpPD0wKSl7dmFyIHQsZT1uWzBdLHI9blt0XTtpZihiZShlLHIpKXt1LmxpbmVTdGFydCgpO2Zvcih2YXIgYT0wO3Q+YTsrK2EpdS5wb2ludCgoZT1uW2FdKVswXSxlWzFdKTtyZXR1cm4gdS5saW5lRW5kKCksdm9pZCAwfXZhciBjPW5ldyBxZShlLG4sbnVsbCwhMCksbD1uZXcgcWUoZSxudWxsLGMsITEpO2Mubz1sLGkucHVzaChjKSxvLnB1c2gobCksYz1uZXcgcWUocixuLG51bGwsITEpLGw9bmV3IHFlKHIsbnVsbCxjLCEwKSxjLm89bCxpLnB1c2goYyksby5wdXNoKGwpfX0pLG8uc29ydCh0KSx6ZShpKSx6ZShvKSxpLmxlbmd0aCl7Zm9yKHZhciBhPTAsYz1lLGw9by5sZW5ndGg7bD5hOysrYSlvW2FdLmU9Yz0hYztmb3IodmFyIHMsZixoPWlbMF07Oyl7Zm9yKHZhciBnPWgscD0hMDtnLnY7KWlmKChnPWcubik9PT1oKXJldHVybjtzPWcueix1LmxpbmVTdGFydCgpO2Rve2lmKGcudj1nLm8udj0hMCxnLmUpe2lmKHApZm9yKHZhciBhPTAsbD1zLmxlbmd0aDtsPmE7KythKXUucG9pbnQoKGY9c1thXSlbMF0sZlsxXSk7ZWxzZSByKGcueCxnLm4ueCwxLHUpO2c9Zy5ufWVsc2V7aWYocCl7cz1nLnAuejtmb3IodmFyIGE9cy5sZW5ndGgtMTthPj0wOy0tYSl1LnBvaW50KChmPXNbYV0pWzBdLGZbMV0pfWVsc2UgcihnLngsZy5wLngsLTEsdSk7Zz1nLnB9Zz1nLm8scz1nLnoscD0hcH13aGlsZSghZy52KTt1LmxpbmVFbmQoKX19fWZ1bmN0aW9uIHplKG4pe2lmKHQ9bi5sZW5ndGgpe2Zvcih2YXIgdCxlLHI9MCx1PW5bMF07KytyPHQ7KXUubj1lPW5bcl0sZS5wPXUsdT1lO3Uubj1lPW5bMF0sZS5wPXV9fWZ1bmN0aW9uIHFlKG4sdCxlLHIpe3RoaXMueD1uLHRoaXMuej10LHRoaXMubz1lLHRoaXMuZT1yLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gTGUobix0LGUscil7cmV0dXJuIGZ1bmN0aW9uKHUsaSl7ZnVuY3Rpb24gbyh0LGUpe3ZhciByPXUodCxlKTtuKHQ9clswXSxlPXJbMV0pJiZpLnBvaW50KHQsZSl9ZnVuY3Rpb24gYShuLHQpe3ZhciBlPXUobix0KTtkLnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gYygpe3kucG9pbnQ9YSxkLmxpbmVTdGFydCgpfWZ1bmN0aW9uIGwoKXt5LnBvaW50PW8sZC5saW5lRW5kKCl9ZnVuY3Rpb24gcyhuLHQpe3YucHVzaChbbix0XSk7dmFyIGU9dShuLHQpO3gucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiBmKCl7eC5saW5lU3RhcnQoKSx2PVtdfWZ1bmN0aW9uIGgoKXtzKHZbMF1bMF0sdlswXVsxXSkseC5saW5lRW5kKCk7dmFyIG4sdD14LmNsZWFuKCksZT1NLmJ1ZmZlcigpLHI9ZS5sZW5ndGg7aWYodi5wb3AoKSxwLnB1c2godiksdj1udWxsLHIpaWYoMSZ0KXtuPWVbMF07dmFyIHUscj1uLmxlbmd0aC0xLG89LTE7aWYocj4wKXtmb3IoYnx8KGkucG9seWdvblN0YXJ0KCksYj0hMCksaS5saW5lU3RhcnQoKTsrK288cjspaS5wb2ludCgodT1uW29dKVswXSx1WzFdKTtpLmxpbmVFbmQoKX19ZWxzZSByPjEmJjImdCYmZS5wdXNoKGUucG9wKCkuY29uY2F0KGUuc2hpZnQoKSkpLGcucHVzaChlLmZpbHRlcihUZSkpfXZhciBnLHAsdixkPXQoaSksbT11LmludmVydChyWzBdLHJbMV0pLHk9e3BvaW50Om8sbGluZVN0YXJ0OmMsbGluZUVuZDpsLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3kucG9pbnQ9cyx5LmxpbmVTdGFydD1mLHkubGluZUVuZD1oLGc9W10scD1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3kucG9pbnQ9byx5LmxpbmVTdGFydD1jLHkubGluZUVuZD1sLGc9dGEubWVyZ2UoZyk7dmFyIG49RmUobSxwKTtnLmxlbmd0aD8oYnx8KGkucG9seWdvblN0YXJ0KCksYj0hMCksQ2UoZyxEZSxuLGUsaSkpOm4mJihifHwoaS5wb2x5Z29uU3RhcnQoKSxiPSEwKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCkpLGImJihpLnBvbHlnb25FbmQoKSxiPSExKSxnPXA9bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7aS5wb2x5Z29uU3RhcnQoKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCksaS5wb2x5Z29uRW5kKCl9fSxNPVJlKCkseD10KE0pLGI9ITE7cmV0dXJuIHl9fWZ1bmN0aW9uIFRlKG4pe3JldHVybiBuLmxlbmd0aD4xfWZ1bmN0aW9uIFJlKCl7dmFyIG4sdD1bXTtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5wdXNoKG49W10pfSxwb2ludDpmdW5jdGlvbih0LGUpe24ucHVzaChbdCxlXSl9LGxpbmVFbmQ6eSxidWZmZXI6ZnVuY3Rpb24oKXt2YXIgZT10O3JldHVybiB0PVtdLG49bnVsbCxlfSxyZWpvaW46ZnVuY3Rpb24oKXt0Lmxlbmd0aD4xJiZ0LnB1c2godC5wb3AoKS5jb25jYXQodC5zaGlmdCgpKSl9fX1mdW5jdGlvbiBEZShuLHQpe3JldHVybigobj1uLngpWzBdPDA/blsxXS1qYS1UYTpqYS1uWzFdKS0oKHQ9dC54KVswXTwwP3RbMV0tamEtVGE6amEtdFsxXSl9ZnVuY3Rpb24gUGUobil7dmFyIHQsZT0wLzAscj0wLzAsdT0wLzA7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe24ubGluZVN0YXJ0KCksdD0xfSxwb2ludDpmdW5jdGlvbihpLG8pe3ZhciBhPWk+MD9EYTotRGEsYz12YShpLWUpO3ZhKGMtRGEpPFRhPyhuLnBvaW50KGUscj0ocitvKS8yPjA/amE6LWphKSxuLnBvaW50KHUsciksbi5saW5lRW5kKCksbi5saW5lU3RhcnQoKSxuLnBvaW50KGEsciksbi5wb2ludChpLHIpLHQ9MCk6dSE9PWEmJmM+PURhJiYodmEoZS11KTxUYSYmKGUtPXUqVGEpLHZhKGktYSk8VGEmJihpLT1hKlRhKSxyPVVlKGUscixpLG8pLG4ucG9pbnQodSxyKSxuLmxpbmVFbmQoKSxuLmxpbmVTdGFydCgpLG4ucG9pbnQoYSxyKSx0PTApLG4ucG9pbnQoZT1pLHI9byksdT1hfSxsaW5lRW5kOmZ1bmN0aW9uKCl7bi5saW5lRW5kKCksZT1yPTAvMH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gMi10fX19ZnVuY3Rpb24gVWUobix0LGUscil7dmFyIHUsaSxvPU1hdGguc2luKG4tZSk7cmV0dXJuIHZhKG8pPlRhP01hdGguYXRhbigoTWF0aC5zaW4odCkqKGk9TWF0aC5jb3MocikpKk1hdGguc2luKGUpLU1hdGguc2luKHIpKih1PU1hdGguY29zKHQpKSpNYXRoLnNpbihuKSkvKHUqaSpvKSk6KHQrcikvMn1mdW5jdGlvbiBqZShuLHQsZSxyKXt2YXIgdTtpZihudWxsPT1uKXU9ZSpqYSxyLnBvaW50KC1EYSx1KSxyLnBvaW50KDAsdSksci5wb2ludChEYSx1KSxyLnBvaW50KERhLDApLHIucG9pbnQoRGEsLXUpLHIucG9pbnQoMCwtdSksci5wb2ludCgtRGEsLXUpLHIucG9pbnQoLURhLDApLHIucG9pbnQoLURhLHUpO2Vsc2UgaWYodmEoblswXS10WzBdKT5UYSl7dmFyIGk9blswXTx0WzBdP0RhOi1EYTt1PWUqaS8yLHIucG9pbnQoLWksdSksci5wb2ludCgwLHUpLHIucG9pbnQoaSx1KX1lbHNlIHIucG9pbnQodFswXSx0WzFdKX1mdW5jdGlvbiBGZShuLHQpe3ZhciBlPW5bMF0scj1uWzFdLHU9W01hdGguc2luKGUpLC1NYXRoLmNvcyhlKSwwXSxpPTAsbz0wO19jLnJlc2V0KCk7Zm9yKHZhciBhPTAsYz10Lmxlbmd0aDtjPmE7KythKXt2YXIgbD10W2FdLHM9bC5sZW5ndGg7aWYocylmb3IodmFyIGY9bFswXSxoPWZbMF0sZz1mWzFdLzIrRGEvNCxwPU1hdGguc2luKGcpLHY9TWF0aC5jb3MoZyksZD0xOzspe2Q9PT1zJiYoZD0wKSxuPWxbZF07dmFyIG09blswXSx5PW5bMV0vMitEYS80LE09TWF0aC5zaW4oeSkseD1NYXRoLmNvcyh5KSxiPW0taCxfPWI+PTA/MTotMSx3PV8qYixTPXc+RGEsaz1wKk07aWYoX2MuYWRkKE1hdGguYXRhbjIoaypfKk1hdGguc2luKHcpLHYqeCtrKk1hdGguY29zKHcpKSksaSs9Uz9iK18qUGE6YixTXmg+PWVebT49ZSl7dmFyIEU9ZGUocGUoZikscGUobikpO01lKEUpO3ZhciBBPWRlKHUsRSk7TWUoQSk7dmFyIE49KFNeYj49MD8tMToxKSpudChBWzJdKTsocj5OfHxyPT09TiYmKEVbMF18fEVbMV0pKSYmKG8rPVNeYj49MD8xOi0xKX1pZighZCsrKWJyZWFrO2g9bSxwPU0sdj14LGY9bn19cmV0dXJuKC1UYT5pfHxUYT5pJiYwPl9jKV4xJm99ZnVuY3Rpb24gSGUobil7ZnVuY3Rpb24gdChuLHQpe3JldHVybiBNYXRoLmNvcyhuKSpNYXRoLmNvcyh0KT5pfWZ1bmN0aW9uIGUobil7dmFyIGUsaSxjLGwscztyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7bD1jPSExLHM9MX0scG9pbnQ6ZnVuY3Rpb24oZixoKXt2YXIgZyxwPVtmLGhdLHY9dChmLGgpLGQ9bz92PzA6dShmLGgpOnY/dShmKygwPmY/RGE6LURhKSxoKTowO2lmKCFlJiYobD1jPXYpJiZuLmxpbmVTdGFydCgpLHYhPT1jJiYoZz1yKGUscCksKGJlKGUsZyl8fGJlKHAsZykpJiYocFswXSs9VGEscFsxXSs9VGEsdj10KHBbMF0scFsxXSkpKSx2IT09YylzPTAsdj8obi5saW5lU3RhcnQoKSxnPXIocCxlKSxuLnBvaW50KGdbMF0sZ1sxXSkpOihnPXIoZSxwKSxuLnBvaW50KGdbMF0sZ1sxXSksbi5saW5lRW5kKCkpLGU9ZztlbHNlIGlmKGEmJmUmJm9edil7dmFyIG07ZCZpfHwhKG09cihwLGUsITApKXx8KHM9MCxvPyhuLmxpbmVTdGFydCgpLG4ucG9pbnQobVswXVswXSxtWzBdWzFdKSxuLnBvaW50KG1bMV1bMF0sbVsxXVsxXSksbi5saW5lRW5kKCkpOihuLnBvaW50KG1bMV1bMF0sbVsxXVsxXSksbi5saW5lRW5kKCksbi5saW5lU3RhcnQoKSxuLnBvaW50KG1bMF1bMF0sbVswXVsxXSkpKX0hdnx8ZSYmYmUoZSxwKXx8bi5wb2ludChwWzBdLHBbMV0pLGU9cCxjPXYsaT1kfSxsaW5lRW5kOmZ1bmN0aW9uKCl7YyYmbi5saW5lRW5kKCksZT1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBzfChsJiZjKTw8MX19fWZ1bmN0aW9uIHIobix0LGUpe3ZhciByPXBlKG4pLHU9cGUodCksbz1bMSwwLDBdLGE9ZGUocix1KSxjPXZlKGEsYSksbD1hWzBdLHM9Yy1sKmw7aWYoIXMpcmV0dXJuIWUmJm47dmFyIGY9aSpjL3MsaD0taSpsL3MsZz1kZShvLGEpLHA9eWUobyxmKSx2PXllKGEsaCk7bWUocCx2KTt2YXIgZD1nLG09dmUocCxkKSx5PXZlKGQsZCksTT1tKm0teSoodmUocCxwKS0xKTtpZighKDA+TSkpe3ZhciB4PU1hdGguc3FydChNKSxiPXllKGQsKC1tLXgpL3kpO2lmKG1lKGIscCksYj14ZShiKSwhZSlyZXR1cm4gYjt2YXIgXyx3PW5bMF0sUz10WzBdLGs9blsxXSxFPXRbMV07dz5TJiYoXz13LHc9UyxTPV8pO3ZhciBBPVMtdyxOPXZhKEEtRGEpPFRhLEM9Tnx8VGE+QTtpZighTiYmaz5FJiYoXz1rLGs9RSxFPV8pLEM/Tj9rK0U+MF5iWzFdPCh2YShiWzBdLXcpPFRhP2s6RSk6azw9YlsxXSYmYlsxXTw9RTpBPkRhXih3PD1iWzBdJiZiWzBdPD1TKSl7dmFyIHo9eWUoZCwoLW0reCkveSk7cmV0dXJuIG1lKHoscCksW2IseGUoeildfX19ZnVuY3Rpb24gdSh0LGUpe3ZhciByPW8/bjpEYS1uLHU9MDtyZXR1cm4tcj50P3V8PTE6dD5yJiYodXw9MiksLXI+ZT91fD00OmU+ciYmKHV8PTgpLHV9dmFyIGk9TWF0aC5jb3Mobiksbz1pPjAsYT12YShpKT5UYSxjPWdyKG4sNipGYSk7cmV0dXJuIExlKHQsZSxjLG8/WzAsLW5dOlstRGEsbi1EYV0pfWZ1bmN0aW9uIE9lKG4sdCxlLHIpe3JldHVybiBmdW5jdGlvbih1KXt2YXIgaSxvPXUuYSxhPXUuYixjPW8ueCxsPW8ueSxzPWEueCxmPWEueSxoPTAsZz0xLHA9cy1jLHY9Zi1sO2lmKGk9bi1jLHB8fCEoaT4wKSl7aWYoaS89cCwwPnApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1lbHNlIGlmKHA+MCl7aWYoaT5nKXJldHVybjtpPmgmJihoPWkpfWlmKGk9ZS1jLHB8fCEoMD5pKSl7aWYoaS89cCwwPnApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1lbHNlIGlmKHA+MCl7aWYoaD5pKXJldHVybjtnPmkmJihnPWkpfWlmKGk9dC1sLHZ8fCEoaT4wKSl7aWYoaS89diwwPnYpe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1lbHNlIGlmKHY+MCl7aWYoaT5nKXJldHVybjtpPmgmJihoPWkpfWlmKGk9ci1sLHZ8fCEoMD5pKSl7aWYoaS89diwwPnYpe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1lbHNlIGlmKHY+MCl7aWYoaD5pKXJldHVybjtnPmkmJihnPWkpfXJldHVybiBoPjAmJih1LmE9e3g6YytoKnAseTpsK2gqdn0pLDE+ZyYmKHUuYj17eDpjK2cqcCx5OmwrZyp2fSksdX19fX19fWZ1bmN0aW9uIFllKG4sdCxlLHIpe2Z1bmN0aW9uIHUocix1KXtyZXR1cm4gdmEoclswXS1uKTxUYT91PjA/MDozOnZhKHJbMF0tZSk8VGE/dT4wPzI6MTp2YShyWzFdLXQpPFRhP3U+MD8xOjA6dT4wPzM6Mn1mdW5jdGlvbiBpKG4sdCl7cmV0dXJuIG8obi54LHQueCl9ZnVuY3Rpb24gbyhuLHQpe3ZhciBlPXUobiwxKSxyPXUodCwxKTtyZXR1cm4gZSE9PXI/ZS1yOjA9PT1lP3RbMV0tblsxXToxPT09ZT9uWzBdLXRbMF06Mj09PWU/blsxXS10WzFdOnRbMF0tblswXX1yZXR1cm4gZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhuKXtmb3IodmFyIHQ9MCxlPWQubGVuZ3RoLHI9blsxXSx1PTA7ZT51OysrdSlmb3IodmFyIGksbz0xLGE9ZFt1XSxjPWEubGVuZ3RoLGw9YVswXTtjPm87KytvKWk9YVtvXSxsWzFdPD1yP2lbMV0+ciYmSyhsLGksbik+MCYmKyt0OmlbMV08PXImJksobCxpLG4pPDAmJi0tdCxsPWk7cmV0dXJuIDAhPT10fWZ1bmN0aW9uIGwoaSxhLGMsbCl7dmFyIHM9MCxmPTA7aWYobnVsbD09aXx8KHM9dShpLGMpKSE9PShmPXUoYSxjKSl8fG8oaSxhKTwwXmM+MCl7ZG8gbC5wb2ludCgwPT09c3x8Mz09PXM/bjplLHM+MT9yOnQpO3doaWxlKChzPShzK2MrNCklNCkhPT1mKX1lbHNlIGwucG9pbnQoYVswXSxhWzFdKX1mdW5jdGlvbiBzKHUsaSl7cmV0dXJuIHU+PW4mJmU+PXUmJmk+PXQmJnI+PWl9ZnVuY3Rpb24gZihuLHQpe3Mobix0KSYmYS5wb2ludChuLHQpfWZ1bmN0aW9uIGgoKXtDLnBvaW50PXAsZCYmZC5wdXNoKG09W10pLFM9ITAsdz0hMSxiPV89MC8wfWZ1bmN0aW9uIGcoKXt2JiYocCh5LE0pLHgmJncmJkEucmVqb2luKCksdi5wdXNoKEEuYnVmZmVyKCkpKSxDLnBvaW50PWYsdyYmYS5saW5lRW5kKCl9ZnVuY3Rpb24gcChuLHQpe249TWF0aC5tYXgoLVVjLE1hdGgubWluKFVjLG4pKSx0PU1hdGgubWF4KC1VYyxNYXRoLm1pbihVYyx0KSk7dmFyIGU9cyhuLHQpO2lmKGQmJm0ucHVzaChbbix0XSksUyl5PW4sTT10LHg9ZSxTPSExLGUmJihhLmxpbmVTdGFydCgpLGEucG9pbnQobix0KSk7ZWxzZSBpZihlJiZ3KWEucG9pbnQobix0KTtlbHNle3ZhciByPXthOnt4OmIseTpffSxiOnt4Om4seTp0fX07TihyKT8od3x8KGEubGluZVN0YXJ0KCksYS5wb2ludChyLmEueCxyLmEueSkpLGEucG9pbnQoci5iLngsci5iLnkpLGV8fGEubGluZUVuZCgpLGs9ITEpOmUmJihhLmxpbmVTdGFydCgpLGEucG9pbnQobix0KSxrPSExKX1iPW4sXz10LHc9ZX12YXIgdixkLG0seSxNLHgsYixfLHcsUyxrLEU9YSxBPVJlKCksTj1PZShuLHQsZSxyKSxDPXtwb2ludDpmLGxpbmVTdGFydDpoLGxpbmVFbmQ6Zyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthPUEsdj1bXSxkPVtdLGs9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXthPUUsdj10YS5tZXJnZSh2KTt2YXIgdD1jKFtuLHJdKSxlPWsmJnQsdT12Lmxlbmd0aDsoZXx8dSkmJihhLnBvbHlnb25TdGFydCgpLGUmJihhLmxpbmVTdGFydCgpLGwobnVsbCxudWxsLDEsYSksYS5saW5lRW5kKCkpLHUmJkNlKHYsaSx0LGwsYSksYS5wb2x5Z29uRW5kKCkpLHY9ZD1tPW51bGx9fTtyZXR1cm4gQ319ZnVuY3Rpb24gSWUobil7dmFyIHQ9MCxlPURhLzMscj1pcihuKSx1PXIodCxlKTtyZXR1cm4gdS5wYXJhbGxlbHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cih0PW5bMF0qRGEvMTgwLGU9blsxXSpEYS8xODApOlsxODAqKHQvRGEpLDE4MCooZS9EYSldfSx1fWZ1bmN0aW9uIFplKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguc3FydChpLTIqdSpNYXRoLnNpbih0KSkvdTtyZXR1cm5bZSpNYXRoLnNpbihuKj11KSxvLWUqTWF0aC5jb3MobildfXZhciByPU1hdGguc2luKG4pLHU9KHIrTWF0aC5zaW4odCkpLzIsaT0xK3IqKDIqdS1yKSxvPU1hdGguc3FydChpKS91O3JldHVybiBlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPW8tdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsbnQoKGktKG4qbitlKmUpKnUqdSkvKDIqdSkpXX0sZX1mdW5jdGlvbiBWZSgpe2Z1bmN0aW9uIG4obix0KXtGYys9dSpuLXIqdCxyPW4sdT10fXZhciB0LGUscix1O1pjLnBvaW50PWZ1bmN0aW9uKGksbyl7WmMucG9pbnQ9bix0PXI9aSxlPXU9b30sWmMubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gWGUobix0KXtIYz5uJiYoSGM9biksbj5ZYyYmKFljPW4pLE9jPnQmJihPYz10KSx0PkljJiYoSWM9dCl9ZnVuY3Rpb24gJGUoKXtmdW5jdGlvbiBuKG4sdCl7by5wdXNoKCJNIixuLCIsIix0LGkpfWZ1bmN0aW9uIHQobix0KXtvLnB1c2goIk0iLG4sIiwiLHQpLGEucG9pbnQ9ZX1mdW5jdGlvbiBlKG4sdCl7by5wdXNoKCJMIixuLCIsIix0KX1mdW5jdGlvbiByKCl7YS5wb2ludD1ufWZ1bmN0aW9uIHUoKXtvLnB1c2goIloiKX12YXIgaT1CZSg0LjUpLG89W10sYT17cG9pbnQ6bixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXthLnBvaW50PXR9LGxpbmVFbmQ6cixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2EubGluZUVuZD1yLGEucG9pbnQ9bn0scG9pbnRSYWRpdXM6ZnVuY3Rpb24obil7cmV0dXJuIGk9QmUobiksYX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYoby5sZW5ndGgpe3ZhciBuPW8uam9pbigiIik7cmV0dXJuIG89W10sbn19fTtyZXR1cm4gYX1mdW5jdGlvbiBCZShuKXtyZXR1cm4ibTAsIituKyJhIituKyIsIituKyIgMCAxLDEgMCwiKy0yKm4rImEiK24rIiwiK24rIiAwIDEsMSAwLCIrMipuKyJ6In1mdW5jdGlvbiBXZShuLHQpe0VjKz1uLEFjKz10LCsrTmN9ZnVuY3Rpb24gSmUoKXtmdW5jdGlvbiBuKG4scil7dmFyIHU9bi10LGk9ci1lLG89TWF0aC5zcXJ0KHUqdStpKmkpO0NjKz1vKih0K24pLzIsemMrPW8qKGUrcikvMixxYys9byxXZSh0PW4sZT1yKX12YXIgdCxlO1hjLnBvaW50PWZ1bmN0aW9uKHIsdSl7WGMucG9pbnQ9bixXZSh0PXIsZT11KX19ZnVuY3Rpb24gR2UoKXtYYy5wb2ludD1XZX1mdW5jdGlvbiBLZSgpe2Z1bmN0aW9uIG4obix0KXt2YXIgZT1uLXIsaT10LXUsbz1NYXRoLnNxcnQoZSplK2kqaSk7Q2MrPW8qKHIrbikvMix6Yys9byoodSt0KS8yLHFjKz1vLG89dSpuLXIqdCxMYys9byoocituKSxUYys9byoodSt0KSxSYys9MypvLFdlKHI9bix1PXQpfXZhciB0LGUscix1O1hjLnBvaW50PWZ1bmN0aW9uKGksbyl7WGMucG9pbnQ9bixXZSh0PXI9aSxlPXU9byl9LFhjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSl9fWZ1bmN0aW9uIFFlKG4pe2Z1bmN0aW9uIHQodCxlKXtuLm1vdmVUbyh0K28sZSksbi5hcmModCxlLG8sMCxQYSl9ZnVuY3Rpb24gZSh0LGUpe24ubW92ZVRvKHQsZSksYS5wb2ludD1yfWZ1bmN0aW9uIHIodCxlKXtuLmxpbmVUbyh0LGUpfWZ1bmN0aW9uIHUoKXthLnBvaW50PXR9ZnVuY3Rpb24gaSgpe24uY2xvc2VQYXRoKCl9dmFyIG89NC41LGE9e3BvaW50OnQsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7YS5wb2ludD1lfSxsaW5lRW5kOnUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YS5saW5lRW5kPWl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dSxhLnBvaW50PXR9LHBvaW50UmFkaXVzOmZ1bmN0aW9uKG4pe3JldHVybiBvPW4sYX0scmVzdWx0Onl9O3JldHVybiBhfWZ1bmN0aW9uIG5yKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuKGE/cjplKShuKX1mdW5jdGlvbiBlKHQpe3JldHVybiBycih0LGZ1bmN0aW9uKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfSl9ZnVuY3Rpb24gcih0KXtmdW5jdGlvbiBlKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHIoKXtNPTAvMCxTLnBvaW50PWksdC5saW5lU3RhcnQoKX1mdW5jdGlvbiBpKGUscil7dmFyIGk9cGUoW2Uscl0pLG89bihlLHIpO3UoTSx4LHksYixfLHcsTT1vWzBdLHg9b1sxXSx5PWUsYj1pWzBdLF89aVsxXSx3PWlbMl0sYSx0KSx0LnBvaW50KE0seCl9ZnVuY3Rpb24gbygpe1MucG9pbnQ9ZSx0LmxpbmVFbmQoKX1mdW5jdGlvbiBjKCl7cigpLFMucG9pbnQ9bCxTLmxpbmVFbmQ9c31mdW5jdGlvbiBsKG4sdCl7aShmPW4saD10KSxnPU0scD14LHY9YixkPV8sbT13LFMucG9pbnQ9aX1mdW5jdGlvbiBzKCl7dShNLHgseSxiLF8sdyxnLHAsZix2LGQsbSxhLHQpLFMubGluZUVuZD1vLG8oKX12YXIgZixoLGcscCx2LGQsbSx5LE0seCxiLF8sdyxTPXtwb2ludDplLGxpbmVTdGFydDpyLGxpbmVFbmQ6byxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpLFMubGluZVN0YXJ0PWN9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25FbmQoKSxTLmxpbmVTdGFydD1yfX07cmV0dXJuIFN9ZnVuY3Rpb24gdSh0LGUscixhLGMsbCxzLGYsaCxnLHAsdixkLG0pe3ZhciB5PXMtdCxNPWYtZSx4PXkqeStNKk07aWYoeD40KmkmJmQtLSl7dmFyIGI9YStnLF89YytwLHc9bCt2LFM9TWF0aC5zcXJ0KGIqYitfKl8rdyp3KSxrPU1hdGguYXNpbih3Lz1TKSxFPXZhKHZhKHcpLTEpPFRhfHx2YShyLWgpPFRhPyhyK2gpLzI6TWF0aC5hdGFuMihfLGIpLEE9bihFLGspLE49QVswXSxDPUFbMV0sej1OLXQscT1DLWUsTD1NKnoteSpxOwooTCpML3g+aXx8dmEoKHkqeitNKnEpL3gtLjUpPi4zfHxvPmEqZytjKnArbCp2KSYmKHUodCxlLHIsYSxjLGwsTixDLEUsYi89UyxfLz1TLHcsZCxtKSxtLnBvaW50KE4sQyksdShOLEMsRSxiLF8sdyxzLGYsaCxnLHAsdixkLG0pKX19dmFyIGk9LjUsbz1NYXRoLmNvcygzMCpGYSksYT0xNjtyZXR1cm4gdC5wcmVjaXNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9KGk9bipuKT4wJiYxNix0KTpNYXRoLnNxcnQoaSl9LHR9ZnVuY3Rpb24gdHIobil7dmFyIHQ9bnIoZnVuY3Rpb24odCxlKXtyZXR1cm4gbihbdCpIYSxlKkhhXSl9KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG9yKHQobikpfX1mdW5jdGlvbiBlcihuKXt0aGlzLnN0cmVhbT1ufWZ1bmN0aW9uIHJyKG4sdCl7cmV0dXJue3BvaW50OnQsc3BoZXJlOmZ1bmN0aW9uKCl7bi5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bi5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe24ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCl9fX1mdW5jdGlvbiB1cihuKXtyZXR1cm4gaXIoZnVuY3Rpb24oKXtyZXR1cm4gbn0pKCl9ZnVuY3Rpb24gaXIobil7ZnVuY3Rpb24gdChuKXtyZXR1cm4gbj1hKG5bMF0qRmEsblsxXSpGYSksW25bMF0qaCtjLGwtblsxXSpoXX1mdW5jdGlvbiBlKG4pe3JldHVybiBuPWEuaW52ZXJ0KChuWzBdLWMpL2gsKGwtblsxXSkvaCksbiYmW25bMF0qSGEsblsxXSpIYV19ZnVuY3Rpb24gcigpe2E9QWUobz1scihtLHksTSksaSk7dmFyIG49aSh2LGQpO3JldHVybiBjPWctblswXSpoLGw9cCtuWzFdKmgsdSgpfWZ1bmN0aW9uIHUoKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEscz1udWxsKSx0fXZhciBpLG8sYSxjLGwscyxmPW5yKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49aShuLHQpLFtuWzBdKmgrYyxsLW5bMV0qaF19KSxoPTE1MCxnPTQ4MCxwPTI1MCx2PTAsZD0wLG09MCx5PTAsTT0wLHg9UGMsYj1FdCxfPW51bGwsdz1udWxsO3JldHVybiB0LnN0cmVhbT1mdW5jdGlvbihuKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEpLHM9b3IoeChvLGYoYihuKSkpKSxzLnZhbGlkPSEwLHN9LHQuY2xpcEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PW51bGw9PW4/KF89bixQYyk6SGUoKF89K24pKkZhKSx1KCkpOl99LHQuY2xpcEV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odz1uLGI9bj9ZZShuWzBdWzBdLG5bMF1bMV0sblsxXVswXSxuWzFdWzFdKTpFdCx1KCkpOnd9LHQuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K24scigpKTpofSx0LnRyYW5zbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz0rblswXSxwPStuWzFdLHIoKSk6W2cscF19LHQuY2VudGVyPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PW5bMF0lMzYwKkZhLGQ9blsxXSUzNjAqRmEscigpKTpbdipIYSxkKkhhXX0sdC5yb3RhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09blswXSUzNjAqRmEseT1uWzFdJTM2MCpGYSxNPW4ubGVuZ3RoPjI/blsyXSUzNjAqRmE6MCxyKCkpOlttKkhhLHkqSGEsTSpIYV19LHRhLnJlYmluZCh0LGYsInByZWNpc2lvbiIpLGZ1bmN0aW9uKCl7cmV0dXJuIGk9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC5pbnZlcnQ9aS5pbnZlcnQmJmUscigpfX1mdW5jdGlvbiBvcihuKXtyZXR1cm4gcnIobixmdW5jdGlvbih0LGUpe24ucG9pbnQodCpGYSxlKkZhKX0pfWZ1bmN0aW9uIGFyKG4sdCl7cmV0dXJuW24sdF19ZnVuY3Rpb24gY3Iobix0KXtyZXR1cm5bbj5EYT9uLVBhOi1EYT5uP24rUGE6bix0XX1mdW5jdGlvbiBscihuLHQsZSl7cmV0dXJuIG4/dHx8ZT9BZShmcihuKSxocih0LGUpKTpmcihuKTp0fHxlP2hyKHQsZSk6Y3J9ZnVuY3Rpb24gc3Iobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrPW4sW3Q+RGE/dC1QYTotRGE+dD90K1BhOnQsZV19fWZ1bmN0aW9uIGZyKG4pe3ZhciB0PXNyKG4pO3JldHVybiB0LmludmVydD1zcigtbiksdH1mdW5jdGlvbiBocihuLHQpe2Z1bmN0aW9uIGUobix0KXt2YXIgZT1NYXRoLmNvcyh0KSxhPU1hdGguY29zKG4pKmUsYz1NYXRoLnNpbihuKSplLGw9TWF0aC5zaW4odCkscz1sKnIrYSp1O3JldHVybltNYXRoLmF0YW4yKGMqaS1zKm8sYSpyLWwqdSksbnQocyppK2MqbyldfXZhciByPU1hdGguY29zKG4pLHU9TWF0aC5zaW4obiksaT1NYXRoLmNvcyh0KSxvPU1hdGguc2luKHQpO3JldHVybiBlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPU1hdGguY29zKHQpLGE9TWF0aC5jb3MobikqZSxjPU1hdGguc2luKG4pKmUsbD1NYXRoLnNpbih0KSxzPWwqaS1jKm87cmV0dXJuW01hdGguYXRhbjIoYyppK2wqbyxhKnIrcyp1KSxudChzKnItYSp1KV19LGV9ZnVuY3Rpb24gZ3Iobix0KXt2YXIgZT1NYXRoLmNvcyhuKSxyPU1hdGguc2luKG4pO3JldHVybiBmdW5jdGlvbih1LGksbyxhKXt2YXIgYz1vKnQ7bnVsbCE9dT8odT1wcihlLHUpLGk9cHIoZSxpKSwobz4wP2k+dTp1PmkpJiYodSs9bypQYSkpOih1PW4rbypQYSxpPW4tLjUqYyk7Zm9yKHZhciBsLHM9dTtvPjA/cz5pOmk+cztzLT1jKWEucG9pbnQoKGw9eGUoW2UsLXIqTWF0aC5jb3MocyksLXIqTWF0aC5zaW4ocyldKSlbMF0sbFsxXSl9fWZ1bmN0aW9uIHByKG4sdCl7dmFyIGU9cGUodCk7ZVswXS09bixNZShlKTt2YXIgcj1RKC1lWzFdKTtyZXR1cm4oKC1lWzJdPDA/LXI6cikrMipNYXRoLlBJLVRhKSUoMipNYXRoLlBJKX1mdW5jdGlvbiB2cihuLHQsZSl7dmFyIHI9dGEucmFuZ2Uobix0LVRhLGUpLmNvbmNhdCh0KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKHQpe3JldHVybltuLHRdfSl9fWZ1bmN0aW9uIGRyKG4sdCxlKXt2YXIgcj10YS5yYW5nZShuLHQtVGEsZSkuY29uY2F0KHQpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gbXIobil7cmV0dXJuIG4uc291cmNlfWZ1bmN0aW9uIHlyKG4pe3JldHVybiBuLnRhcmdldH1mdW5jdGlvbiBNcihuLHQsZSxyKXt2YXIgdT1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpLG89TWF0aC5jb3MociksYT1NYXRoLnNpbihyKSxjPXUqTWF0aC5jb3MobiksbD11Kk1hdGguc2luKG4pLHM9bypNYXRoLmNvcyhlKSxmPW8qTWF0aC5zaW4oZSksaD0yKk1hdGguYXNpbihNYXRoLnNxcnQodXQoci10KSt1Km8qdXQoZS1uKSkpLGc9MS9NYXRoLnNpbihoKSxwPWg/ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zaW4obio9aCkqZyxlPU1hdGguc2luKGgtbikqZyxyPWUqYyt0KnMsdT1lKmwrdCpmLG89ZSppK3QqYTtyZXR1cm5bTWF0aC5hdGFuMih1LHIpKkhhLE1hdGguYXRhbjIobyxNYXRoLnNxcnQocipyK3UqdSkpKkhhXX06ZnVuY3Rpb24oKXtyZXR1cm5bbipIYSx0KkhhXX07cmV0dXJuIHAuZGlzdGFuY2U9aCxwfWZ1bmN0aW9uIHhyKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBpPU1hdGguc2luKHUqPUZhKSxvPU1hdGguY29zKHUpLGE9dmEoKG4qPUZhKS10KSxjPU1hdGguY29zKGEpOyRjKz1NYXRoLmF0YW4yKE1hdGguc3FydCgoYT1vKk1hdGguc2luKGEpKSphKyhhPXIqaS1lKm8qYykqYSksZSppK3IqbypjKSx0PW4sZT1pLHI9b312YXIgdCxlLHI7QmMucG9pbnQ9ZnVuY3Rpb24odSxpKXt0PXUqRmEsZT1NYXRoLnNpbihpKj1GYSkscj1NYXRoLmNvcyhpKSxCYy5wb2ludD1ufSxCYy5saW5lRW5kPWZ1bmN0aW9uKCl7QmMucG9pbnQ9QmMubGluZUVuZD15fX1mdW5jdGlvbiBicihuLHQpe2Z1bmN0aW9uIGUodCxlKXt2YXIgcj1NYXRoLmNvcyh0KSx1PU1hdGguY29zKGUpLGk9bihyKnUpO3JldHVybltpKnUqTWF0aC5zaW4odCksaSpNYXRoLnNpbihlKV19cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKG4sZSl7dmFyIHI9TWF0aC5zcXJ0KG4qbitlKmUpLHU9dChyKSxpPU1hdGguc2luKHUpLG89TWF0aC5jb3ModSk7cmV0dXJuW01hdGguYXRhbjIobippLHIqbyksTWF0aC5hc2luKHImJmUqaS9yKV19LGV9ZnVuY3Rpb24gX3Iobix0KXtmdW5jdGlvbiBlKG4sdCl7bz4wPy1qYStUYT50JiYodD0tamErVGEpOnQ+amEtVGEmJih0PWphLVRhKTt2YXIgZT1vL01hdGgucG93KHUodCksaSk7cmV0dXJuW2UqTWF0aC5zaW4oaSpuKSxvLWUqTWF0aC5jb3MoaSpuKV19dmFyIHI9TWF0aC5jb3MobiksdT1mdW5jdGlvbihuKXtyZXR1cm4gTWF0aC50YW4oRGEvNCtuLzIpfSxpPW49PT10P01hdGguc2luKG4pOk1hdGgubG9nKHIvTWF0aC5jb3ModCkpL01hdGgubG9nKHUodCkvdShuKSksbz1yKk1hdGgucG93KHUobiksaSkvaTtyZXR1cm4gaT8oZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1vLXQscj1HKGkpKk1hdGguc3FydChuKm4rZSplKTtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL2ksMipNYXRoLmF0YW4oTWF0aC5wb3coby9yLDEvaSkpLWphXX0sZSk6U3J9ZnVuY3Rpb24gd3Iobix0KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9aS10O3JldHVybltlKk1hdGguc2luKHUqbiksaS1lKk1hdGguY29zKHUqbildfXZhciByPU1hdGguY29zKG4pLHU9bj09PXQ/TWF0aC5zaW4obik6KHItTWF0aC5jb3ModCkpLyh0LW4pLGk9ci91K247cmV0dXJuIHZhKHUpPFRhP2FyOihlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPWktdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsaS1HKHUpKk1hdGguc3FydChuKm4rZSplKV19LGUpfWZ1bmN0aW9uIFNyKG4sdCl7cmV0dXJuW24sTWF0aC5sb2coTWF0aC50YW4oRGEvNCt0LzIpKV19ZnVuY3Rpb24ga3Iobil7dmFyIHQsZT11cihuKSxyPWUuc2NhbGUsdT1lLnRyYW5zbGF0ZSxpPWUuY2xpcEV4dGVudDtyZXR1cm4gZS5zY2FsZT1mdW5jdGlvbigpe3ZhciBuPXIuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiBuPT09ZT90P2UuY2xpcEV4dGVudChudWxsKTplOm59LGUudHJhbnNsYXRlPWZ1bmN0aW9uKCl7dmFyIG49dS5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIG49PT1lP3Q/ZS5jbGlwRXh0ZW50KG51bGwpOmU6bn0sZS5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3ZhciBvPWkuYXBwbHkoZSxhcmd1bWVudHMpO2lmKG89PT1lKXtpZih0PW51bGw9PW4pe3ZhciBhPURhKnIoKSxjPXUoKTtpKFtbY1swXS1hLGNbMV0tYV0sW2NbMF0rYSxjWzFdK2FdXSl9fWVsc2UgdCYmKG89bnVsbCk7cmV0dXJuIG99LGUuY2xpcEV4dGVudChudWxsKX1mdW5jdGlvbiBFcihuLHQpe3JldHVybltNYXRoLmxvZyhNYXRoLnRhbihEYS80K3QvMikpLC1uXX1mdW5jdGlvbiBBcihuKXtyZXR1cm4gblswXX1mdW5jdGlvbiBOcihuKXtyZXR1cm4gblsxXX1mdW5jdGlvbiBDcihuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1bMCwxXSxyPTIsdT0yO3Q+dTt1Kyspe2Zvcig7cj4xJiZLKG5bZVtyLTJdXSxuW2Vbci0xXV0sblt1XSk8PTA7KS0tcjtlW3IrK109dX1yZXR1cm4gZS5zbGljZSgwLHIpfWZ1bmN0aW9uIHpyKG4sdCl7cmV0dXJuIG5bMF0tdFswXXx8blsxXS10WzFdfWZ1bmN0aW9uIHFyKG4sdCxlKXtyZXR1cm4oZVswXS10WzBdKSooblsxXS10WzFdKTwoZVsxXS10WzFdKSooblswXS10WzBdKX1mdW5jdGlvbiBMcihuLHQsZSxyKXt2YXIgdT1uWzBdLGk9ZVswXSxvPXRbMF0tdSxhPXJbMF0taSxjPW5bMV0sbD1lWzFdLHM9dFsxXS1jLGY9clsxXS1sLGg9KGEqKGMtbCktZioodS1pKSkvKGYqby1hKnMpO3JldHVyblt1K2gqbyxjK2gqc119ZnVuY3Rpb24gVHIobil7dmFyIHQ9blswXSxlPW5bbi5sZW5ndGgtMV07cmV0dXJuISh0WzBdLWVbMF18fHRbMV0tZVsxXSl9ZnVuY3Rpb24gUnIoKXt0dSh0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gRHIobil7dmFyIHQ9b2wucG9wKCl8fG5ldyBScjtyZXR1cm4gdC5zaXRlPW4sdH1mdW5jdGlvbiBQcihuKXtYcihuKSxybC5yZW1vdmUobiksb2wucHVzaChuKSx0dShuKX1mdW5jdGlvbiBVcihuKXt2YXIgdD1uLmNpcmNsZSxlPXQueCxyPXQuY3ksdT17eDplLHk6cn0saT1uLlAsbz1uLk4sYT1bbl07UHIobik7Zm9yKHZhciBjPWk7Yy5jaXJjbGUmJnZhKGUtYy5jaXJjbGUueCk8VGEmJnZhKHItYy5jaXJjbGUuY3kpPFRhOylpPWMuUCxhLnVuc2hpZnQoYyksUHIoYyksYz1pO2EudW5zaGlmdChjKSxYcihjKTtmb3IodmFyIGw9bztsLmNpcmNsZSYmdmEoZS1sLmNpcmNsZS54KTxUYSYmdmEoci1sLmNpcmNsZS5jeSk8VGE7KW89bC5OLGEucHVzaChsKSxQcihsKSxsPW87YS5wdXNoKGwpLFhyKGwpO3ZhciBzLGY9YS5sZW5ndGg7Zm9yKHM9MTtmPnM7KytzKWw9YVtzXSxjPWFbcy0xXSxLcihsLmVkZ2UsYy5zaXRlLGwuc2l0ZSx1KTtjPWFbMF0sbD1hW2YtMV0sbC5lZGdlPUpyKGMuc2l0ZSxsLnNpdGUsbnVsbCx1KSxWcihjKSxWcihsKX1mdW5jdGlvbiBqcihuKXtmb3IodmFyIHQsZSxyLHUsaT1uLngsbz1uLnksYT1ybC5fO2E7KWlmKHI9RnIoYSxvKS1pLHI+VGEpYT1hLkw7ZWxzZXtpZih1PWktSHIoYSxvKSwhKHU+VGEpKXtyPi1UYT8odD1hLlAsZT1hKTp1Pi1UYT8odD1hLGU9YS5OKTp0PWU9YTticmVha31pZighYS5SKXt0PWE7YnJlYWt9YT1hLlJ9dmFyIGM9RHIobik7aWYocmwuaW5zZXJ0KHQsYyksdHx8ZSl7aWYodD09PWUpcmV0dXJuIFhyKHQpLGU9RHIodC5zaXRlKSxybC5pbnNlcnQoYyxlKSxjLmVkZ2U9ZS5lZGdlPUpyKHQuc2l0ZSxjLnNpdGUpLFZyKHQpLFZyKGUpLHZvaWQgMDtpZighZSlyZXR1cm4gYy5lZGdlPUpyKHQuc2l0ZSxjLnNpdGUpLHZvaWQgMDtYcih0KSxYcihlKTt2YXIgbD10LnNpdGUscz1sLngsZj1sLnksaD1uLngtcyxnPW4ueS1mLHA9ZS5zaXRlLHY9cC54LXMsZD1wLnktZixtPTIqKGgqZC1nKnYpLHk9aCpoK2cqZyxNPXYqditkKmQseD17eDooZCp5LWcqTSkvbStzLHk6KGgqTS12KnkpL20rZn07S3IoZS5lZGdlLGwscCx4KSxjLmVkZ2U9SnIobCxuLG51bGwseCksZS5lZGdlPUpyKG4scCxudWxsLHgpLFZyKHQpLFZyKGUpfX1mdW5jdGlvbiBGcihuLHQpe3ZhciBlPW4uc2l0ZSxyPWUueCx1PWUueSxpPXUtdDtpZighaSlyZXR1cm4gcjt2YXIgbz1uLlA7aWYoIW8pcmV0dXJuLTEvMDtlPW8uc2l0ZTt2YXIgYT1lLngsYz1lLnksbD1jLXQ7aWYoIWwpcmV0dXJuIGE7dmFyIHM9YS1yLGY9MS9pLTEvbCxoPXMvbDtyZXR1cm4gZj8oLWgrTWF0aC5zcXJ0KGgqaC0yKmYqKHMqcy8oLTIqbCktYytsLzIrdS1pLzIpKSkvZityOihyK2EpLzJ9ZnVuY3Rpb24gSHIobix0KXt2YXIgZT1uLk47aWYoZSlyZXR1cm4gRnIoZSx0KTt2YXIgcj1uLnNpdGU7cmV0dXJuIHIueT09PXQ/ci54OjEvMH1mdW5jdGlvbiBPcihuKXt0aGlzLnNpdGU9bix0aGlzLmVkZ2VzPVtdfWZ1bmN0aW9uIFlyKG4pe2Zvcih2YXIgdCxlLHIsdSxpLG8sYSxjLGwscyxmPW5bMF1bMF0saD1uWzFdWzBdLGc9blswXVsxXSxwPW5bMV1bMV0sdj1lbCxkPXYubGVuZ3RoO2QtLTspaWYoaT12W2RdLGkmJmkucHJlcGFyZSgpKWZvcihhPWkuZWRnZXMsYz1hLmxlbmd0aCxvPTA7Yz5vOylzPWFbb10uZW5kKCkscj1zLngsdT1zLnksbD1hWysrbyVjXS5zdGFydCgpLHQ9bC54LGU9bC55LCh2YShyLXQpPlRhfHx2YSh1LWUpPlRhKSYmKGEuc3BsaWNlKG8sMCxuZXcgUXIoR3IoaS5zaXRlLHMsdmEoci1mKTxUYSYmcC11PlRhP3t4OmYseTp2YSh0LWYpPFRhP2U6cH06dmEodS1wKTxUYSYmaC1yPlRhP3t4OnZhKGUtcCk8VGE/dDpoLHk6cH06dmEoci1oKTxUYSYmdS1nPlRhP3t4OmgseTp2YSh0LWgpPFRhP2U6Z306dmEodS1nKTxUYSYmci1mPlRhP3t4OnZhKGUtZyk8VGE/dDpmLHk6Z306bnVsbCksaS5zaXRlLG51bGwpKSwrK2MpfWZ1bmN0aW9uIElyKG4sdCl7cmV0dXJuIHQuYW5nbGUtbi5hbmdsZX1mdW5jdGlvbiBacigpe3R1KHRoaXMpLHRoaXMueD10aGlzLnk9dGhpcy5hcmM9dGhpcy5zaXRlPXRoaXMuY3k9bnVsbH1mdW5jdGlvbiBWcihuKXt2YXIgdD1uLlAsZT1uLk47aWYodCYmZSl7dmFyIHI9dC5zaXRlLHU9bi5zaXRlLGk9ZS5zaXRlO2lmKHIhPT1pKXt2YXIgbz11LngsYT11LnksYz1yLngtbyxsPXIueS1hLHM9aS54LW8sZj1pLnktYSxoPTIqKGMqZi1sKnMpO2lmKCEoaD49LVJhKSl7dmFyIGc9YypjK2wqbCxwPXMqcytmKmYsdj0oZipnLWwqcCkvaCxkPShjKnAtcypnKS9oLGY9ZCthLG09YWwucG9wKCl8fG5ldyBacjttLmFyYz1uLG0uc2l0ZT11LG0ueD12K28sbS55PWYrTWF0aC5zcXJ0KHYqditkKmQpLG0uY3k9ZixuLmNpcmNsZT1tO2Zvcih2YXIgeT1udWxsLE09aWwuXztNOylpZihtLnk8TS55fHxtLnk9PT1NLnkmJm0ueDw9TS54KXtpZighTS5MKXt5PU0uUDticmVha31NPU0uTH1lbHNle2lmKCFNLlIpe3k9TTticmVha31NPU0uUn1pbC5pbnNlcnQoeSxtKSx5fHwodWw9bSl9fX19ZnVuY3Rpb24gWHIobil7dmFyIHQ9bi5jaXJjbGU7dCYmKHQuUHx8KHVsPXQuTiksaWwucmVtb3ZlKHQpLGFsLnB1c2godCksdHUodCksbi5jaXJjbGU9bnVsbCl9ZnVuY3Rpb24gJHIobil7Zm9yKHZhciB0LGU9dGwscj1PZShuWzBdWzBdLG5bMF1bMV0sblsxXVswXSxuWzFdWzFdKSx1PWUubGVuZ3RoO3UtLTspdD1lW3VdLCghQnIodCxuKXx8IXIodCl8fHZhKHQuYS54LXQuYi54KTxUYSYmdmEodC5hLnktdC5iLnkpPFRhKSYmKHQuYT10LmI9bnVsbCxlLnNwbGljZSh1LDEpKX1mdW5jdGlvbiBCcihuLHQpe3ZhciBlPW4uYjtpZihlKXJldHVybiEwO3ZhciByLHUsaT1uLmEsbz10WzBdWzBdLGE9dFsxXVswXSxjPXRbMF1bMV0sbD10WzFdWzFdLHM9bi5sLGY9bi5yLGg9cy54LGc9cy55LHA9Zi54LHY9Zi55LGQ9KGgrcCkvMixtPShnK3YpLzI7aWYodj09PWcpe2lmKG8+ZHx8ZD49YSlyZXR1cm47aWYoaD5wKXtpZihpKXtpZihpLnk+PWwpcmV0dXJufWVsc2UgaT17eDpkLHk6Y307ZT17eDpkLHk6bH19ZWxzZXtpZihpKXtpZihpLnk8YylyZXR1cm59ZWxzZSBpPXt4OmQseTpsfTtlPXt4OmQseTpjfX19ZWxzZSBpZihyPShoLXApLyh2LWcpLHU9bS1yKmQsLTE+cnx8cj4xKWlmKGg+cCl7aWYoaSl7aWYoaS55Pj1sKXJldHVybn1lbHNlIGk9e3g6KGMtdSkvcix5OmN9O2U9e3g6KGwtdSkvcix5Omx9fWVsc2V7aWYoaSl7aWYoaS55PGMpcmV0dXJufWVsc2UgaT17eDoobC11KS9yLHk6bH07ZT17eDooYy11KS9yLHk6Y319ZWxzZSBpZih2Pmcpe2lmKGkpe2lmKGkueD49YSlyZXR1cm59ZWxzZSBpPXt4Om8seTpyKm8rdX07ZT17eDphLHk6ciphK3V9fWVsc2V7aWYoaSl7aWYoaS54PG8pcmV0dXJufWVsc2UgaT17eDphLHk6ciphK3V9O2U9e3g6byx5OnIqbyt1fX1yZXR1cm4gbi5hPWksbi5iPWUsITB9ZnVuY3Rpb24gV3Iobix0KXt0aGlzLmw9bix0aGlzLnI9dCx0aGlzLmE9dGhpcy5iPW51bGx9ZnVuY3Rpb24gSnIobix0LGUscil7dmFyIHU9bmV3IFdyKG4sdCk7cmV0dXJuIHRsLnB1c2godSksZSYmS3IodSxuLHQsZSksciYmS3IodSx0LG4sciksZWxbbi5pXS5lZGdlcy5wdXNoKG5ldyBRcih1LG4sdCkpLGVsW3QuaV0uZWRnZXMucHVzaChuZXcgUXIodSx0LG4pKSx1fWZ1bmN0aW9uIEdyKG4sdCxlKXt2YXIgcj1uZXcgV3IobixudWxsKTtyZXR1cm4gci5hPXQsci5iPWUsdGwucHVzaChyKSxyfWZ1bmN0aW9uIEtyKG4sdCxlLHIpe24uYXx8bi5iP24ubD09PWU/bi5iPXI6bi5hPXI6KG4uYT1yLG4ubD10LG4ucj1lKX1mdW5jdGlvbiBRcihuLHQsZSl7dmFyIHI9bi5hLHU9bi5iO3RoaXMuZWRnZT1uLHRoaXMuc2l0ZT10LHRoaXMuYW5nbGU9ZT9NYXRoLmF0YW4yKGUueS10LnksZS54LXQueCk6bi5sPT09dD9NYXRoLmF0YW4yKHUueC1yLngsci55LXUueSk6TWF0aC5hdGFuMihyLngtdS54LHUueS1yLnkpfWZ1bmN0aW9uIG51KCl7dGhpcy5fPW51bGx9ZnVuY3Rpb24gdHUobil7bi5VPW4uQz1uLkw9bi5SPW4uUD1uLk49bnVsbH1mdW5jdGlvbiBldShuLHQpe3ZhciBlPXQscj10LlIsdT1lLlU7dT91Lkw9PT1lP3UuTD1yOnUuUj1yOm4uXz1yLHIuVT11LGUuVT1yLGUuUj1yLkwsZS5SJiYoZS5SLlU9ZSksci5MPWV9ZnVuY3Rpb24gcnUobix0KXt2YXIgZT10LHI9dC5MLHU9ZS5VO3U/dS5MPT09ZT91Lkw9cjp1LlI9cjpuLl89cixyLlU9dSxlLlU9cixlLkw9ci5SLGUuTCYmKGUuTC5VPWUpLHIuUj1lfWZ1bmN0aW9uIHV1KG4pe2Zvcig7bi5MOyluPW4uTDtyZXR1cm4gbn1mdW5jdGlvbiBpdShuLHQpe3ZhciBlLHIsdSxpPW4uc29ydChvdSkucG9wKCk7Zm9yKHRsPVtdLGVsPW5ldyBBcnJheShuLmxlbmd0aCkscmw9bmV3IG51LGlsPW5ldyBudTs7KWlmKHU9dWwsaSYmKCF1fHxpLnk8dS55fHxpLnk9PT11LnkmJmkueDx1LngpKShpLnghPT1lfHxpLnkhPT1yKSYmKGVsW2kuaV09bmV3IE9yKGkpLGpyKGkpLGU9aS54LHI9aS55KSxpPW4ucG9wKCk7ZWxzZXtpZighdSlicmVhaztVcih1LmFyYyl9dCYmKCRyKHQpLFlyKHQpKTt2YXIgbz17Y2VsbHM6ZWwsZWRnZXM6dGx9O3JldHVybiBybD1pbD10bD1lbD1udWxsLG99ZnVuY3Rpb24gb3Uobix0KXtyZXR1cm4gdC55LW4ueXx8dC54LW4ueH1mdW5jdGlvbiBhdShuLHQsZSl7cmV0dXJuKG4ueC1lLngpKih0Lnktbi55KS0obi54LXQueCkqKGUueS1uLnkpfWZ1bmN0aW9uIGN1KG4pe3JldHVybiBuLnh9ZnVuY3Rpb24gbHUobil7cmV0dXJuIG4ueX1mdW5jdGlvbiBzdSgpe3JldHVybntsZWFmOiEwLG5vZGVzOltdLHBvaW50Om51bGwseDpudWxsLHk6bnVsbH19ZnVuY3Rpb24gZnUobix0LGUscix1LGkpe2lmKCFuKHQsZSxyLHUsaSkpe3ZhciBvPS41KihlK3UpLGE9LjUqKHIraSksYz10Lm5vZGVzO2NbMF0mJmZ1KG4sY1swXSxlLHIsbyxhKSxjWzFdJiZmdShuLGNbMV0sbyxyLHUsYSksY1syXSYmZnUobixjWzJdLGUsYSxvLGkpLGNbM10mJmZ1KG4sY1szXSxvLGEsdSxpKX19ZnVuY3Rpb24gaHUobix0LGUscix1LGksbyl7dmFyIGEsYz0xLzA7cmV0dXJuIGZ1bmN0aW9uIGwobixzLGYsaCxnKXtpZighKHM+aXx8Zj5vfHxyPmh8fHU+Zykpe2lmKHA9bi5wb2ludCl7dmFyIHAsdj10LXBbMF0sZD1lLXBbMV0sbT12KnYrZCpkO2lmKGM+bSl7dmFyIHk9TWF0aC5zcXJ0KGM9bSk7cj10LXksdT1lLXksaT10K3ksbz1lK3ksYT1wfX1mb3IodmFyIE09bi5ub2Rlcyx4PS41KihzK2gpLGI9LjUqKGYrZyksXz10Pj14LHc9ZT49YixTPXc8PDF8XyxrPVMrNDtrPlM7KytTKWlmKG49TVszJlNdKXN3aXRjaCgzJlMpe2Nhc2UgMDpsKG4scyxmLHgsYik7YnJlYWs7Y2FzZSAxOmwobix4LGYsaCxiKTticmVhaztjYXNlIDI6bChuLHMsYix4LGcpO2JyZWFrO2Nhc2UgMzpsKG4seCxiLGgsZyl9fX0obixyLHUsaSxvKSxhfWZ1bmN0aW9uIGd1KG4sdCl7bj10YS5yZ2IobiksdD10YS5yZ2IodCk7dmFyIGU9bi5yLHI9bi5nLHU9bi5iLGk9dC5yLWUsbz10LmctcixhPXQuYi11O3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4iIyIrTXQoTWF0aC5yb3VuZChlK2kqbikpK010KE1hdGgucm91bmQocitvKm4pKStNdChNYXRoLnJvdW5kKHUrYSpuKSl9fWZ1bmN0aW9uIHB1KG4sdCl7dmFyIGUscj17fSx1PXt9O2ZvcihlIGluIG4pZSBpbiB0P3JbZV09bXUobltlXSx0W2VdKTp1W2VdPW5bZV07Zm9yKGUgaW4gdCllIGluIG58fCh1W2VdPXRbZV0pO3JldHVybiBmdW5jdGlvbihuKXtmb3IoZSBpbiByKXVbZV09cltlXShuKTtyZXR1cm4gdX19ZnVuY3Rpb24gdnUobix0KXtyZXR1cm4gbj0rbix0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBuKigxLWUpK3QqZX19ZnVuY3Rpb24gZHUobix0KXt2YXIgZSxyLHUsaT1sbC5sYXN0SW5kZXg9c2wubGFzdEluZGV4PTAsbz0tMSxhPVtdLGM9W107Zm9yKG4rPSIiLHQrPSIiOyhlPWxsLmV4ZWMobikpJiYocj1zbC5leGVjKHQpKTspKHU9ci5pbmRleCk+aSYmKHU9dC5zbGljZShpLHUpLGFbb10/YVtvXSs9dTphWysrb109dSksKGU9ZVswXSk9PT0ocj1yWzBdKT9hW29dP2Fbb10rPXI6YVsrK29dPXI6KGFbKytvXT1udWxsLGMucHVzaCh7aTpvLHg6dnUoZSxyKX0pKSxpPXNsLmxhc3RJbmRleDtyZXR1cm4gaTx0Lmxlbmd0aCYmKHU9dC5zbGljZShpKSxhW29dP2Fbb10rPXU6YVsrK29dPXUpLGEubGVuZ3RoPDI/Y1swXT8odD1jWzBdLngsZnVuY3Rpb24obil7cmV0dXJuIHQobikrIiJ9KTpmdW5jdGlvbigpe3JldHVybiB0fToodD1jLmxlbmd0aCxmdW5jdGlvbihuKXtmb3IodmFyIGUscj0wO3Q+cjsrK3IpYVsoZT1jW3JdKS5pXT1lLngobik7cmV0dXJuIGEuam9pbigiIil9KX1mdW5jdGlvbiBtdShuLHQpe2Zvcih2YXIgZSxyPXRhLmludGVycG9sYXRvcnMubGVuZ3RoOy0tcj49MCYmIShlPXRhLmludGVycG9sYXRvcnNbcl0obix0KSk7KTtyZXR1cm4gZX1mdW5jdGlvbiB5dShuLHQpe3ZhciBlLHI9W10sdT1bXSxpPW4ubGVuZ3RoLG89dC5sZW5ndGgsYT1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCk7Zm9yKGU9MDthPmU7KytlKXIucHVzaChtdShuW2VdLHRbZV0pKTtmb3IoO2k+ZTsrK2UpdVtlXT1uW2VdO2Zvcig7bz5lOysrZSl1W2VdPXRbZV07cmV0dXJuIGZ1bmN0aW9uKG4pe2ZvcihlPTA7YT5lOysrZSl1W2VdPXJbZV0obik7cmV0dXJuIHV9fWZ1bmN0aW9uIE11KG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMD49dD8wOnQ+PTE/MTpuKHQpfX1mdW5jdGlvbiB4dShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDEtbigxLXQpfX1mdW5jdGlvbiBidShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuLjUqKC41PnQ/bigyKnQpOjItbigyLTIqdCkpfX1mdW5jdGlvbiBfdShuKXtyZXR1cm4gbipufWZ1bmN0aW9uIHd1KG4pe3JldHVybiBuKm4qbn1mdW5jdGlvbiBTdShuKXtpZigwPj1uKXJldHVybiAwO2lmKG4+PTEpcmV0dXJuIDE7dmFyIHQ9bipuLGU9dCpuO3JldHVybiA0KiguNT5uP2U6Myoobi10KStlLS43NSl9ZnVuY3Rpb24ga3Uobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBFdShuKXtyZXR1cm4gMS1NYXRoLmNvcyhuKmphKX1mdW5jdGlvbiBBdShuKXtyZXR1cm4gTWF0aC5wb3coMiwxMCoobi0xKSl9ZnVuY3Rpb24gTnUobil7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtbipuKX1mdW5jdGlvbiBDdShuLHQpe3ZhciBlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PS40NSksYXJndW1lbnRzLmxlbmd0aD9lPXQvUGEqTWF0aC5hc2luKDEvbik6KG49MSxlPXQvNCksZnVuY3Rpb24ocil7cmV0dXJuIDErbipNYXRoLnBvdygyLC0xMCpyKSpNYXRoLnNpbigoci1lKSpQYS90KX19ZnVuY3Rpb24genUobil7cmV0dXJuIG58fChuPTEuNzAxNTgpLGZ1bmN0aW9uKHQpe3JldHVybiB0KnQqKChuKzEpKnQtbil9fWZ1bmN0aW9uIHF1KG4pe3JldHVybiAxLzIuNzU+bj83LjU2MjUqbipuOjIvMi43NT5uPzcuNTYyNSoobi09MS41LzIuNzUpKm4rLjc1OjIuNS8yLjc1Pm4/Ny41NjI1KihuLT0yLjI1LzIuNzUpKm4rLjkzNzU6Ny41NjI1KihuLT0yLjYyNS8yLjc1KSpuKy45ODQzNzV9ZnVuY3Rpb24gTHUobix0KXtuPXRhLmhjbChuKSx0PXRhLmhjbCh0KTt2YXIgZT1uLmgscj1uLmMsdT1uLmwsaT10LmgtZSxvPXQuYy1yLGE9dC5sLXU7cmV0dXJuIGlzTmFOKG8pJiYobz0wLHI9aXNOYU4ocik/dC5jOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIGx0KGUraSpuLHIrbypuLHUrYSpuKSsiIn19ZnVuY3Rpb24gVHUobix0KXtuPXRhLmhzbChuKSx0PXRhLmhzbCh0KTt2YXIgZT1uLmgscj1uLnMsdT1uLmwsaT10LmgtZSxvPXQucy1yLGE9dC5sLXU7cmV0dXJuIGlzTmFOKG8pJiYobz0wLHI9aXNOYU4ocik/dC5zOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIGF0KGUraSpuLHIrbypuLHUrYSpuKSsiIn19ZnVuY3Rpb24gUnUobix0KXtuPXRhLmxhYihuKSx0PXRhLmxhYih0KTt2YXIgZT1uLmwscj1uLmEsdT1uLmIsaT10LmwtZSxvPXQuYS1yLGE9dC5iLXU7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBmdChlK2kqbixyK28qbix1K2EqbikrIiJ9fWZ1bmN0aW9uIER1KG4sdCl7cmV0dXJuIHQtPW4sZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQobit0KmUpfX1mdW5jdGlvbiBQdShuKXt2YXIgdD1bbi5hLG4uYl0sZT1bbi5jLG4uZF0scj1qdSh0KSx1PVV1KHQsZSksaT1qdShGdShlLHQsLXUpKXx8MDt0WzBdKmVbMV08ZVswXSp0WzFdJiYodFswXSo9LTEsdFsxXSo9LTEscio9LTEsdSo9LTEpLHRoaXMucm90YXRlPShyP01hdGguYXRhbjIodFsxXSx0WzBdKTpNYXRoLmF0YW4yKC1lWzBdLGVbMV0pKSpIYSx0aGlzLnRyYW5zbGF0ZT1bbi5lLG4uZl0sdGhpcy5zY2FsZT1bcixpXSx0aGlzLnNrZXc9aT9NYXRoLmF0YW4yKHUsaSkqSGE6MH1mdW5jdGlvbiBVdShuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdfWZ1bmN0aW9uIGp1KG4pe3ZhciB0PU1hdGguc3FydChVdShuLG4pKTtyZXR1cm4gdCYmKG5bMF0vPXQsblsxXS89dCksdH1mdW5jdGlvbiBGdShuLHQsZSl7cmV0dXJuIG5bMF0rPWUqdFswXSxuWzFdKz1lKnRbMV0sbn1mdW5jdGlvbiBIdShuLHQpe3ZhciBlLHI9W10sdT1bXSxpPXRhLnRyYW5zZm9ybShuKSxvPXRhLnRyYW5zZm9ybSh0KSxhPWkudHJhbnNsYXRlLGM9by50cmFuc2xhdGUsbD1pLnJvdGF0ZSxzPW8ucm90YXRlLGY9aS5za2V3LGg9by5za2V3LGc9aS5zY2FsZSxwPW8uc2NhbGU7cmV0dXJuIGFbMF0hPWNbMF18fGFbMV0hPWNbMV0/KHIucHVzaCgidHJhbnNsYXRlKCIsbnVsbCwiLCIsbnVsbCwiKSIpLHUucHVzaCh7aToxLHg6dnUoYVswXSxjWzBdKX0se2k6Myx4OnZ1KGFbMV0sY1sxXSl9KSk6Y1swXXx8Y1sxXT9yLnB1c2goInRyYW5zbGF0ZSgiK2MrIikiKTpyLnB1c2goIiIpLGwhPXM/KGwtcz4xODA/cys9MzYwOnMtbD4xODAmJihsKz0zNjApLHUucHVzaCh7aTpyLnB1c2goci5wb3AoKSsicm90YXRlKCIsbnVsbCwiKSIpLTIseDp2dShsLHMpfSkpOnMmJnIucHVzaChyLnBvcCgpKyJyb3RhdGUoIitzKyIpIiksZiE9aD91LnB1c2goe2k6ci5wdXNoKHIucG9wKCkrInNrZXdYKCIsbnVsbCwiKSIpLTIseDp2dShmLGgpfSk6aCYmci5wdXNoKHIucG9wKCkrInNrZXdYKCIraCsiKSIpLGdbMF0hPXBbMF18fGdbMV0hPXBbMV0/KGU9ci5wdXNoKHIucG9wKCkrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpLHUucHVzaCh7aTplLTQseDp2dShnWzBdLHBbMF0pfSx7aTplLTIseDp2dShnWzFdLHBbMV0pfSkpOigxIT1wWzBdfHwxIT1wWzFdKSYmci5wdXNoKHIucG9wKCkrInNjYWxlKCIrcCsiKSIpLGU9dS5sZW5ndGgsZnVuY3Rpb24obil7Zm9yKHZhciB0LGk9LTE7KytpPGU7KXJbKHQ9dVtpXSkuaV09dC54KG4pO3JldHVybiByLmpvaW4oIiIpfX1mdW5jdGlvbiBPdShuLHQpe3JldHVybiB0PSh0LT1uPStuKXx8MS90LGZ1bmN0aW9uKGUpe3JldHVybihlLW4pL3R9fWZ1bmN0aW9uIFl1KG4sdCl7cmV0dXJuIHQ9KHQtPW49K24pfHwxL3QsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMSwoZS1uKS90KSl9fWZ1bmN0aW9uIEl1KG4pe2Zvcih2YXIgdD1uLnNvdXJjZSxlPW4udGFyZ2V0LHI9VnUodCxlKSx1PVt0XTt0IT09cjspdD10LnBhcmVudCx1LnB1c2godCk7Zm9yKHZhciBpPXUubGVuZ3RoO2UhPT1yOyl1LnNwbGljZShpLDAsZSksZT1lLnBhcmVudDtyZXR1cm4gdX1mdW5jdGlvbiBadShuKXtmb3IodmFyIHQ9W10sZT1uLnBhcmVudDtudWxsIT1lOyl0LnB1c2gobiksbj1lLGU9ZS5wYXJlbnQ7cmV0dXJuIHQucHVzaChuKSx0fWZ1bmN0aW9uIFZ1KG4sdCl7aWYobj09PXQpcmV0dXJuIG47Zm9yKHZhciBlPVp1KG4pLHI9WnUodCksdT1lLnBvcCgpLGk9ci5wb3AoKSxvPW51bGw7dT09PWk7KW89dSx1PWUucG9wKCksaT1yLnBvcCgpO3JldHVybiBvfWZ1bmN0aW9uIFh1KG4pe24uZml4ZWR8PTJ9ZnVuY3Rpb24gJHUobil7bi5maXhlZCY9LTd9ZnVuY3Rpb24gQnUobil7bi5maXhlZHw9NCxuLnB4PW4ueCxuLnB5PW4ueX1mdW5jdGlvbiBXdShuKXtuLmZpeGVkJj0tNX1mdW5jdGlvbiBKdShuLHQsZSl7dmFyIHI9MCx1PTA7aWYobi5jaGFyZ2U9MCwhbi5sZWFmKWZvcih2YXIgaSxvPW4ubm9kZXMsYT1vLmxlbmd0aCxjPS0xOysrYzxhOylpPW9bY10sbnVsbCE9aSYmKEp1KGksdCxlKSxuLmNoYXJnZSs9aS5jaGFyZ2Uscis9aS5jaGFyZ2UqaS5jeCx1Kz1pLmNoYXJnZSppLmN5KTtpZihuLnBvaW50KXtuLmxlYWZ8fChuLnBvaW50LngrPU1hdGgucmFuZG9tKCktLjUsbi5wb2ludC55Kz1NYXRoLnJhbmRvbSgpLS41KTt2YXIgbD10KmVbbi5wb2ludC5pbmRleF07bi5jaGFyZ2UrPW4ucG9pbnRDaGFyZ2U9bCxyKz1sKm4ucG9pbnQueCx1Kz1sKm4ucG9pbnQueX1uLmN4PXIvbi5jaGFyZ2Usbi5jeT11L24uY2hhcmdlfWZ1bmN0aW9uIEd1KG4sdCl7cmV0dXJuIHRhLnJlYmluZChuLHQsInNvcnQiLCJjaGlsZHJlbiIsInZhbHVlIiksbi5ub2Rlcz1uLG4ubGlua3M9cmksbn1mdW5jdGlvbiBLdShuLHQpe2Zvcih2YXIgZT1bbl07bnVsbCE9KG49ZS5wb3AoKSk7KWlmKHQobiksKHU9bi5jaGlsZHJlbikmJihyPXUubGVuZ3RoKSlmb3IodmFyIHIsdTstLXI+PTA7KWUucHVzaCh1W3JdKX1mdW5jdGlvbiBRdShuLHQpe2Zvcih2YXIgZT1bbl0scj1bXTtudWxsIT0obj1lLnBvcCgpKTspaWYoci5wdXNoKG4pLChpPW4uY2hpbGRyZW4pJiYodT1pLmxlbmd0aCkpZm9yKHZhciB1LGksbz0tMTsrK288dTspZS5wdXNoKGlbb10pO2Zvcig7bnVsbCE9KG49ci5wb3AoKSk7KXQobil9ZnVuY3Rpb24gbmkobil7cmV0dXJuIG4uY2hpbGRyZW59ZnVuY3Rpb24gdGkobil7cmV0dXJuIG4udmFsdWV9ZnVuY3Rpb24gZWkobix0KXtyZXR1cm4gdC52YWx1ZS1uLnZhbHVlfWZ1bmN0aW9uIHJpKG4pe3JldHVybiB0YS5tZXJnZShuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4obi5jaGlsZHJlbnx8W10pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOm4sdGFyZ2V0OnR9fSl9KSl9ZnVuY3Rpb24gdWkobil7cmV0dXJuIG4ueH1mdW5jdGlvbiBpaShuKXtyZXR1cm4gbi55fWZ1bmN0aW9uIG9pKG4sdCxlKXtuLnkwPXQsbi55PWV9ZnVuY3Rpb24gYWkobil7cmV0dXJuIHRhLnJhbmdlKG4ubGVuZ3RoKX1mdW5jdGlvbiBjaShuKXtmb3IodmFyIHQ9LTEsZT1uWzBdLmxlbmd0aCxyPVtdOysrdDxlOylyW3RdPTA7cmV0dXJuIHJ9ZnVuY3Rpb24gbGkobil7Zm9yKHZhciB0LGU9MSxyPTAsdT1uWzBdWzFdLGk9bi5sZW5ndGg7aT5lOysrZSkodD1uW2VdWzFdKT51JiYocj1lLHU9dCk7cmV0dXJuIHJ9ZnVuY3Rpb24gc2kobil7cmV0dXJuIG4ucmVkdWNlKGZpLDApfWZ1bmN0aW9uIGZpKG4sdCl7cmV0dXJuIG4rdFsxXX1mdW5jdGlvbiBoaShuLHQpe3JldHVybiBnaShuLE1hdGguY2VpbChNYXRoLmxvZyh0Lmxlbmd0aCkvTWF0aC5MTjIrMSkpfWZ1bmN0aW9uIGdpKG4sdCl7Zm9yKHZhciBlPS0xLHI9K25bMF0sdT0oblsxXS1yKS90LGk9W107KytlPD10OylpW2VdPXUqZStyO3JldHVybiBpfWZ1bmN0aW9uIHBpKG4pe3JldHVyblt0YS5taW4obiksdGEubWF4KG4pXX1mdW5jdGlvbiB2aShuLHQpe3JldHVybiBuLnZhbHVlLXQudmFsdWV9ZnVuY3Rpb24gZGkobix0KXt2YXIgZT1uLl9wYWNrX25leHQ7bi5fcGFja19uZXh0PXQsdC5fcGFja19wcmV2PW4sdC5fcGFja19uZXh0PWUsZS5fcGFja19wcmV2PXR9ZnVuY3Rpb24gbWkobix0KXtuLl9wYWNrX25leHQ9dCx0Ll9wYWNrX3ByZXY9bn1mdW5jdGlvbiB5aShuLHQpe3ZhciBlPXQueC1uLngscj10Lnktbi55LHU9bi5yK3QucjtyZXR1cm4uOTk5KnUqdT5lKmUrcipyfWZ1bmN0aW9uIE1pKG4pe2Z1bmN0aW9uIHQobil7cz1NYXRoLm1pbihuLngtbi5yLHMpLGY9TWF0aC5tYXgobi54K24ucixmKSxoPU1hdGgubWluKG4ueS1uLnIsaCksZz1NYXRoLm1heChuLnkrbi5yLGcpfWlmKChlPW4uY2hpbGRyZW4pJiYobD1lLmxlbmd0aCkpe3ZhciBlLHIsdSxpLG8sYSxjLGwscz0xLzAsZj0tMS8wLGg9MS8wLGc9LTEvMDtpZihlLmZvckVhY2goeGkpLHI9ZVswXSxyLng9LXIucixyLnk9MCx0KHIpLGw+MSYmKHU9ZVsxXSx1Lng9dS5yLHUueT0wLHQodSksbD4yKSlmb3IoaT1lWzJdLHdpKHIsdSxpKSx0KGkpLGRpKHIsaSksci5fcGFja19wcmV2PWksZGkoaSx1KSx1PXIuX3BhY2tfbmV4dCxvPTM7bD5vO28rKyl7d2kocix1LGk9ZVtvXSk7dmFyIHA9MCx2PTEsZD0xO2ZvcihhPXUuX3BhY2tfbmV4dDthIT09dTthPWEuX3BhY2tfbmV4dCx2KyspaWYoeWkoYSxpKSl7cD0xO2JyZWFrfWlmKDE9PXApZm9yKGM9ci5fcGFja19wcmV2O2MhPT1hLl9wYWNrX3ByZXYmJiF5aShjLGkpO2M9Yy5fcGFja19wcmV2LGQrKyk7cD8oZD52fHx2PT1kJiZ1LnI8ci5yP21pKHIsdT1hKTptaShyPWMsdSksby0tKTooZGkocixpKSx1PWksdChpKSl9dmFyIG09KHMrZikvMix5PShoK2cpLzIsTT0wO2ZvcihvPTA7bD5vO28rKylpPWVbb10saS54LT1tLGkueS09eSxNPU1hdGgubWF4KE0saS5yK01hdGguc3FydChpLngqaS54K2kueSppLnkpKTtuLnI9TSxlLmZvckVhY2goYmkpfX1mdW5jdGlvbiB4aShuKXtuLl9wYWNrX25leHQ9bi5fcGFja19wcmV2PW59ZnVuY3Rpb24gYmkobil7ZGVsZXRlIG4uX3BhY2tfbmV4dCxkZWxldGUgbi5fcGFja19wcmV2fWZ1bmN0aW9uIF9pKG4sdCxlLHIpe3ZhciB1PW4uY2hpbGRyZW47aWYobi54PXQrPXIqbi54LG4ueT1lKz1yKm4ueSxuLnIqPXIsdSlmb3IodmFyIGk9LTEsbz11Lmxlbmd0aDsrK2k8bzspX2kodVtpXSx0LGUscil9ZnVuY3Rpb24gd2kobix0LGUpe3ZhciByPW4ucitlLnIsdT10Lngtbi54LGk9dC55LW4ueTtpZihyJiYodXx8aSkpe3ZhciBvPXQucitlLnIsYT11KnUraSppO28qPW8scio9cjt2YXIgYz0uNSsoci1vKS8oMiphKSxsPU1hdGguc3FydChNYXRoLm1heCgwLDIqbyoocithKS0oci09YSkqci1vKm8pKS8oMiphKTtlLng9bi54K2MqdStsKmksZS55PW4ueStjKmktbCp1fWVsc2UgZS54PW4ueCtyLGUueT1uLnl9ZnVuY3Rpb24gU2kobix0KXtyZXR1cm4gbi5wYXJlbnQ9PXQucGFyZW50PzE6Mn1mdW5jdGlvbiBraShuKXt2YXIgdD1uLmNoaWxkcmVuO3JldHVybiB0Lmxlbmd0aD90WzBdOm4udH1mdW5jdGlvbiBFaShuKXt2YXIgdCxlPW4uY2hpbGRyZW47cmV0dXJuKHQ9ZS5sZW5ndGgpP2VbdC0xXTpuLnR9ZnVuY3Rpb24gQWkobix0LGUpe3ZhciByPWUvKHQuaS1uLmkpO3QuYy09cix0LnMrPWUsbi5jKz1yLHQueis9ZSx0Lm0rPWV9ZnVuY3Rpb24gTmkobil7Zm9yKHZhciB0LGU9MCxyPTAsdT1uLmNoaWxkcmVuLGk9dS5sZW5ndGg7LS1pPj0wOyl0PXVbaV0sdC56Kz1lLHQubSs9ZSxlKz10LnMrKHIrPXQuYyl9ZnVuY3Rpb24gQ2kobix0LGUpe3JldHVybiBuLmEucGFyZW50PT09dC5wYXJlbnQ/bi5hOmV9ZnVuY3Rpb24gemkobil7cmV0dXJuIDErdGEubWF4KG4sZnVuY3Rpb24obil7cmV0dXJuIG4ueX0pfWZ1bmN0aW9uIHFpKG4pe3JldHVybiBuLnJlZHVjZShmdW5jdGlvbihuLHQpe3JldHVybiBuK3QueH0sMCkvbi5sZW5ndGh9ZnVuY3Rpb24gTGkobil7dmFyIHQ9bi5jaGlsZHJlbjtyZXR1cm4gdCYmdC5sZW5ndGg/TGkodFswXSk6bn1mdW5jdGlvbiBUaShuKXt2YXIgdCxlPW4uY2hpbGRyZW47cmV0dXJuIGUmJih0PWUubGVuZ3RoKT9UaShlW3QtMV0pOm59ZnVuY3Rpb24gUmkobil7cmV0dXJue3g6bi54LHk6bi55LGR4Om4uZHgsZHk6bi5keX19ZnVuY3Rpb24gRGkobix0KXt2YXIgZT1uLngrdFszXSxyPW4ueSt0WzBdLHU9bi5keC10WzFdLXRbM10saT1uLmR5LXRbMF0tdFsyXTtyZXR1cm4gMD51JiYoZSs9dS8yLHU9MCksMD5pJiYocis9aS8yLGk9MCkse3g6ZSx5OnIsZHg6dSxkeTppfX1mdW5jdGlvbiBQaShuKXt2YXIgdD1uWzBdLGU9bltuLmxlbmd0aC0xXTtyZXR1cm4gZT50P1t0LGVdOltlLHRdfWZ1bmN0aW9uIFVpKG4pe3JldHVybiBuLnJhbmdlRXh0ZW50P24ucmFuZ2VFeHRlbnQoKTpQaShuLnJhbmdlKCkpfWZ1bmN0aW9uIGppKG4sdCxlLHIpe3ZhciB1PWUoblswXSxuWzFdKSxpPXIodFswXSx0WzFdKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGkodShuKSl9fWZ1bmN0aW9uIEZpKG4sdCl7dmFyIGUscj0wLHU9bi5sZW5ndGgtMSxpPW5bcl0sbz1uW3VdO3JldHVybiBpPm8mJihlPXIscj11LHU9ZSxlPWksaT1vLG89ZSksbltyXT10LmZsb29yKGkpLG5bdV09dC5jZWlsKG8pLG59ZnVuY3Rpb24gSGkobil7cmV0dXJuIG4/e2Zsb29yOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmZsb29yKHQvbikqbn0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5jZWlsKHQvbikqbn19OmJsfWZ1bmN0aW9uIE9pKG4sdCxlLHIpe3ZhciB1PVtdLGk9W10sbz0wLGE9TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpLTE7Zm9yKG5bYV08blswXSYmKG49bi5zbGljZSgpLnJldmVyc2UoKSx0PXQuc2xpY2UoKS5yZXZlcnNlKCkpOysrbzw9YTspdS5wdXNoKGUobltvLTFdLG5bb10pKSxpLnB1c2gocih0W28tMV0sdFtvXSkpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT10YS5iaXNlY3Qobix0LDEsYSktMTtyZXR1cm4gaVtlXSh1W2VdKHQpKX19ZnVuY3Rpb24gWWkobix0LGUscil7ZnVuY3Rpb24gdSgpe3ZhciB1PU1hdGgubWluKG4ubGVuZ3RoLHQubGVuZ3RoKT4yP09pOmppLGM9cj9ZdTpPdTtyZXR1cm4gbz11KG4sdCxjLGUpLGE9dSh0LG4sYyxtdSksaX1mdW5jdGlvbiBpKG4pe3JldHVybiBvKG4pfXZhciBvLGE7cmV0dXJuIGkuaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiBhKG4pfSxpLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10Lm1hcChOdW1iZXIpLHUoKSk6bn0saS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLHUoKSk6dH0saS5yYW5nZVJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBpLnJhbmdlKG4pLmludGVycG9sYXRlKER1KX0saS5jbGFtcD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHUoKSk6cn0saS5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHUoKSk6ZX0saS50aWNrcz1mdW5jdGlvbih0KXtyZXR1cm4gWGkobix0KX0saS50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuICRpKG4sdCxlKX0saS5uaWNlPWZ1bmN0aW9uKHQpe3JldHVybiBaaShuLHQpLHUoKX0saS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFlpKG4sdCxlLHIpfSx1KCl9ZnVuY3Rpb24gSWkobix0KXtyZXR1cm4gdGEucmViaW5kKG4sdCwicmFuZ2UiLCJyYW5nZVJvdW5kIiwiaW50ZXJwb2xhdGUiLCJjbGFtcCIpfWZ1bmN0aW9uIFppKG4sdCl7cmV0dXJuIEZpKG4sSGkoVmkobix0KVsyXSkpfWZ1bmN0aW9uIFZpKG4sdCl7bnVsbD09dCYmKHQ9MTApO3ZhciBlPVBpKG4pLHI9ZVsxXS1lWzBdLHU9TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyhyL3QpL01hdGguTE4xMCkpLGk9dC9yKnU7cmV0dXJuLjE1Pj1pP3UqPTEwOi4zNT49aT91Kj01Oi43NT49aSYmKHUqPTIpLGVbMF09TWF0aC5jZWlsKGVbMF0vdSkqdSxlWzFdPU1hdGguZmxvb3IoZVsxXS91KSp1Ky41KnUsZVsyXT11LGV9ZnVuY3Rpb24gWGkobix0KXtyZXR1cm4gdGEucmFuZ2UuYXBwbHkodGEsVmkobix0KSl9ZnVuY3Rpb24gJGkobix0LGUpe3ZhciByPVZpKG4sdCk7aWYoZSl7dmFyIHU9bGMuZXhlYyhlKTtpZih1LnNoaWZ0KCksInMiPT09dVs4XSl7dmFyIGk9dGEuZm9ybWF0UHJlZml4KE1hdGgubWF4KHZhKHJbMF0pLHZhKHJbMV0pKSk7cmV0dXJuIHVbN118fCh1WzddPSIuIitCaShpLnNjYWxlKHJbMl0pKSksdVs4XT0iZiIsZT10YS5mb3JtYXQodS5qb2luKCIiKSksZnVuY3Rpb24obil7cmV0dXJuIGUoaS5zY2FsZShuKSkraS5zeW1ib2x9fXVbN118fCh1WzddPSIuIitXaSh1WzhdLHIpKSxlPXUuam9pbigiIil9ZWxzZSBlPSIsLiIrQmkoclsyXSkrImYiO3JldHVybiB0YS5mb3JtYXQoZSl9ZnVuY3Rpb24gQmkobil7cmV0dXJuLU1hdGguZmxvb3IoTWF0aC5sb2cobikvTWF0aC5MTjEwKy4wMSl9ZnVuY3Rpb24gV2kobix0KXt2YXIgZT1CaSh0WzJdKTtyZXR1cm4gbiBpbiBfbD9NYXRoLmFicyhlLUJpKE1hdGgubWF4KHZhKHRbMF0pLHZhKHRbMV0pKSkpKyArKCJlIiE9PW4pOmUtMiooIiUiPT09bil9ZnVuY3Rpb24gSmkobix0LGUscil7ZnVuY3Rpb24gdShuKXtyZXR1cm4oZT9NYXRoLmxvZygwPm4/MDpuKTotTWF0aC5sb2cobj4wPzA6LW4pKS9NYXRoLmxvZyh0KX1mdW5jdGlvbiBpKG4pe3JldHVybiBlP01hdGgucG93KHQsbik6LU1hdGgucG93KHQsLW4pfWZ1bmN0aW9uIG8odCl7cmV0dXJuIG4odSh0KSl9cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBpKG4uaW52ZXJ0KHQpKX0sby5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dFswXT49MCxuLmRvbWFpbigocj10Lm1hcChOdW1iZXIpKS5tYXAodSkpLG8pOnJ9LG8uYmFzZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rZSxuLmRvbWFpbihyLm1hcCh1KSksbyk6dH0sby5uaWNlPWZ1bmN0aW9uKCl7dmFyIHQ9Rmkoci5tYXAodSksZT9NYXRoOlNsKTtyZXR1cm4gbi5kb21haW4odCkscj10Lm1hcChpKSxvfSxvLnRpY2tzPWZ1bmN0aW9uKCl7dmFyIG49UGkociksbz1bXSxhPW5bMF0sYz1uWzFdLGw9TWF0aC5mbG9vcih1KGEpKSxzPU1hdGguY2VpbCh1KGMpKSxmPXQlMT8yOnQ7aWYoaXNGaW5pdGUocy1sKSl7aWYoZSl7Zm9yKDtzPmw7bCsrKWZvcih2YXIgaD0xO2Y+aDtoKyspby5wdXNoKGkobCkqaCk7by5wdXNoKGkobCkpfWVsc2UgZm9yKG8ucHVzaChpKGwpKTtsKys8czspZm9yKHZhciBoPWYtMTtoPjA7aC0tKW8ucHVzaChpKGwpKmgpO2ZvcihsPTA7b1tsXTxhO2wrKyk7Zm9yKHM9by5sZW5ndGg7b1tzLTFdPmM7cy0tKTtvPW8uc2xpY2UobCxzKX1yZXR1cm4gb30sby50aWNrRm9ybWF0PWZ1bmN0aW9uKG4sdCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHdsO2FyZ3VtZW50cy5sZW5ndGg8Mj90PXdsOiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD10YS5mb3JtYXQodCkpO3ZhciByLGE9TWF0aC5tYXgoLjEsbi9vLnRpY2tzKCkubGVuZ3RoKSxjPWU/KHI9MWUtMTIsTWF0aC5jZWlsKToocj0tMWUtMTIsTWF0aC5mbG9vcik7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBuL2koYyh1KG4pK3IpKTw9YT90KG4pOiIifX0sby5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEppKG4uY29weSgpLHQsZSxyKX0sSWkobyxuKX1mdW5jdGlvbiBHaShuLHQsZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gbih1KHQpKX12YXIgdT1LaSh0KSxpPUtpKDEvdCk7cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBpKG4uaW52ZXJ0KHQpKX0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4uZG9tYWluKChlPXQubWFwKE51bWJlcikpLm1hcCh1KSkscik6ZX0sci50aWNrcz1mdW5jdGlvbihuKXtyZXR1cm4gWGkoZSxuKX0sci50aWNrRm9ybWF0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuICRpKGUsbix0KX0sci5uaWNlPWZ1bmN0aW9uKG4pe3JldHVybiByLmRvbWFpbihaaShlLG4pKX0sci5leHBvbmVudD1mdW5jdGlvbihvKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1LaSh0PW8pLGk9S2koMS90KSxuLmRvbWFpbihlLm1hcCh1KSkscik6dH0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEdpKG4uY29weSgpLHQsZSl9LElpKHIsbil9ZnVuY3Rpb24gS2kobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiAwPnQ/LU1hdGgucG93KC10LG4pOk1hdGgucG93KHQsbil9fWZ1bmN0aW9uIFFpKG4sdCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gaVsoKHUuZ2V0KGUpfHwoInJhbmdlIj09PXQudD91LnNldChlLG4ucHVzaChlKSk6MC8wKSktMSklaS5sZW5ndGhdfWZ1bmN0aW9uIHIodCxlKXtyZXR1cm4gdGEucmFuZ2Uobi5sZW5ndGgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gdCtlKm59KX12YXIgdSxpLG87cmV0dXJuIGUuZG9tYWluPWZ1bmN0aW9uKHIpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBuO249W10sdT1uZXcgYTtmb3IodmFyIGksbz0tMSxjPXIubGVuZ3RoOysrbzxjOyl1LmhhcyhpPXJbb10pfHx1LnNldChpLG4ucHVzaChpKSk7cmV0dXJuIGVbdC50XS5hcHBseShlLHQuYSl9LGUucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bixvPTAsdD17dDoicmFuZ2UiLGE6YXJndW1lbnRzfSxlKTppfSxlLnJhbmdlUG9pbnRzPWZ1bmN0aW9uKHUsYSl7YXJndW1lbnRzLmxlbmd0aDwyJiYoYT0wKTt2YXIgYz11WzBdLGw9dVsxXSxzPW4ubGVuZ3RoPDI/KGM9KGMrbCkvMiwwKToobC1jKS8obi5sZW5ndGgtMSthKTtyZXR1cm4gaT1yKGMrcyphLzIscyksbz0wLHQ9e3Q6InJhbmdlUG9pbnRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZVJvdW5kUG9pbnRzPWZ1bmN0aW9uKHUsYSl7YXJndW1lbnRzLmxlbmd0aDwyJiYoYT0wKTt2YXIgYz11WzBdLGw9dVsxXSxzPW4ubGVuZ3RoPDI/KGM9bD1NYXRoLnJvdW5kKChjK2wpLzIpLDApOjB8KGwtYykvKG4ubGVuZ3RoLTErYSk7cmV0dXJuIGk9cihjK01hdGgucm91bmQocyphLzIrKGwtYy0obi5sZW5ndGgtMSthKSpzKS8yKSxzKSxvPTAsdD17dDoicmFuZ2VSb3VuZFBvaW50cyIsYTphcmd1bWVudHN9LGV9LGUucmFuZ2VCYW5kcz1mdW5jdGlvbih1LGEsYyl7YXJndW1lbnRzLmxlbmd0aDwyJiYoYT0wKSxhcmd1bWVudHMubGVuZ3RoPDMmJihjPWEpO3ZhciBsPXVbMV08dVswXSxzPXVbbC0wXSxmPXVbMS1sXSxoPShmLXMpLyhuLmxlbmd0aC1hKzIqYyk7cmV0dXJuIGk9cihzK2gqYyxoKSxsJiZpLnJldmVyc2UoKSxvPWgqKDEtYSksdD17dDoicmFuZ2VCYW5kcyIsYTphcmd1bWVudHN9LGV9LGUucmFuZ2VSb3VuZEJhbmRzPWZ1bmN0aW9uKHUsYSxjKXthcmd1bWVudHMubGVuZ3RoPDImJihhPTApLGFyZ3VtZW50cy5sZW5ndGg8MyYmKGM9YSk7dmFyIGw9dVsxXTx1WzBdLHM9dVtsLTBdLGY9dVsxLWxdLGg9TWF0aC5mbG9vcigoZi1zKS8obi5sZW5ndGgtYSsyKmMpKTtyZXR1cm4gaT1yKHMrTWF0aC5yb3VuZCgoZi1zLShuLmxlbmd0aC1hKSpoKS8yKSxoKSxsJiZpLnJldmVyc2UoKSxvPU1hdGgucm91bmQoaCooMS1hKSksdD17dDoicmFuZ2VSb3VuZEJhbmRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZUJhbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gb30sZS5yYW5nZUV4dGVudD1mdW5jdGlvbigpe3JldHVybiBQaSh0LmFbMF0pfSxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gUWkobix0KX0sZS5kb21haW4obil9ZnVuY3Rpb24gbm8ocix1KXtmdW5jdGlvbiBpKCl7dmFyIG49MCx0PXUubGVuZ3RoO2ZvcihhPVtdOysrbjx0OylhW24tMV09dGEucXVhbnRpbGUocixuL3QpO3JldHVybiBvfWZ1bmN0aW9uIG8obil7cmV0dXJuIGlzTmFOKG49K24pP3ZvaWQgMDp1W3RhLmJpc2VjdChhLG4pXX12YXIgYTtyZXR1cm4gby5kb21haW49ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dS5tYXAodCkuZmlsdGVyKGUpLnNvcnQobiksaSgpKTpyfSxvLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4saSgpKTp1fSxvLnF1YW50aWxlcz1mdW5jdGlvbigpe3JldHVybiBhfSxvLmludmVydEV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gbj11LmluZGV4T2YobiksMD5uP1swLzAsMC8wXTpbbj4wP2Fbbi0xXTpyWzBdLG48YS5sZW5ndGg/YVtuXTpyW3IubGVuZ3RoLTFdXX0sby5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIG5vKHIsdSl9LGkoKX1mdW5jdGlvbiB0byhuLHQsZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gZVtNYXRoLm1heCgwLE1hdGgubWluKG8sTWF0aC5mbG9vcihpKih0LW4pKSkpXX1mdW5jdGlvbiB1KCl7cmV0dXJuIGk9ZS5sZW5ndGgvKHQtbiksbz1lLmxlbmd0aC0xLHJ9dmFyIGksbztyZXR1cm4gci5kb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K2VbMF0sdD0rZVtlLmxlbmd0aC0xXSx1KCkpOltuLHRdfSxyLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdSgpKTplfSxyLmludmVydEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gdD1lLmluZGV4T2YodCksdD0wPnQ/MC8wOnQvaStuLFt0LHQrMS9pXX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHRvKG4sdCxlKX0sdSgpfWZ1bmN0aW9uIGVvKG4sdCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gZT49ZT90W3RhLmJpc2VjdChuLGUpXTp2b2lkIDB9cmV0dXJuIGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZSk6bn0sZS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGUpOnR9LGUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlPXQuaW5kZXhPZihlKSxbbltlLTFdLG5bZV1dfSxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gZW8obix0KX0sZX1mdW5jdGlvbiBybyhuKXtmdW5jdGlvbiB0KG4pe3JldHVybitufXJldHVybiB0LmludmVydD10LHQuZG9tYWluPXQucmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZS5tYXAodCksdCk6bn0sdC50aWNrcz1mdW5jdGlvbih0KXtyZXR1cm4gWGkobix0KX0sdC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuICRpKG4sdCxlKX0sdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHJvKG4pfSx0fWZ1bmN0aW9uIHVvKCl7cmV0dXJuIDB9ZnVuY3Rpb24gaW8obil7cmV0dXJuIG4uaW5uZXJSYWRpdXN9ZnVuY3Rpb24gb28obil7cmV0dXJuIG4ub3V0ZXJSYWRpdXN9ZnVuY3Rpb24gYW8obil7cmV0dXJuIG4uc3RhcnRBbmdsZX1mdW5jdGlvbiBjbyhuKXtyZXR1cm4gbi5lbmRBbmdsZX1mdW5jdGlvbiBsbyhuKXtyZXR1cm4gbiYmbi5wYWRBbmdsZX1mdW5jdGlvbiBzbyhuLHQsZSxyKXtyZXR1cm4obi1lKSp0LSh0LXIpKm4+MD8wOjF9ZnVuY3Rpb24gZm8obix0LGUscix1KXt2YXIgaT1uWzBdLXRbMF0sbz1uWzFdLXRbMV0sYT0odT9yOi1yKS9NYXRoLnNxcnQoaSppK28qbyksYz1hKm8sbD0tYSppLHM9blswXStjLGY9blsxXStsLGg9dFswXStjLGc9dFsxXStsLHA9KHMraCkvMix2PShmK2cpLzIsZD1oLXMsbT1nLWYseT1kKmQrbSptLE09ZS1yLHg9cypnLWgqZixiPSgwPm0/LTE6MSkqTWF0aC5zcXJ0KE0qTSp5LXgqeCksXz0oeCptLWQqYikveSx3PSgteCpkLW0qYikveSxTPSh4Km0rZCpiKS95LGs9KC14KmQrbSpiKS95LEU9Xy1wLEE9dy12LE49Uy1wLEM9ay12O3JldHVybiBFKkUrQSpBPk4qTitDKkMmJihfPVMsdz1rKSxbW18tYyx3LWxdLFtfKmUvTSx3KmUvTV1dfWZ1bmN0aW9uIGhvKG4pe2Z1bmN0aW9uIHQodCl7ZnVuY3Rpb24gbygpe2wucHVzaCgiTSIsaShuKHMpLGEpKX1mb3IodmFyIGMsbD1bXSxzPVtdLGY9LTEsaD10Lmxlbmd0aCxnPWt0KGUpLHA9a3Qocik7KytmPGg7KXUuY2FsbCh0aGlzLGM9dFtmXSxmKT9zLnB1c2goWytnLmNhbGwodGhpcyxjLGYpLCtwLmNhbGwodGhpcyxjLGYpXSk6cy5sZW5ndGgmJihvKCkscz1bXSk7cmV0dXJuIHMubGVuZ3RoJiZvKCksbC5sZW5ndGg/bC5qb2luKCIiKTpudWxsfXZhciBlPUFyLHI9TnIsdT1OZSxpPWdvLG89aS5rZXksYT0uNztyZXR1cm4gdC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sdCk6dX0sdC5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9pPW46KGk9emwuZ2V0KG4pfHxnbykua2V5LHQpOm99LHQudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1uLHQpOmF9LHR9ZnVuY3Rpb24gZ28obil7cmV0dXJuIG4uam9pbigiTCIpfWZ1bmN0aW9uIHBvKG4pe3JldHVybiBnbyhuKSsiWiJ9ZnVuY3Rpb24gdm8obil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0sdT1bclswXSwiLCIsclsxXV07Kyt0PGU7KXUucHVzaCgiSCIsKHJbMF0rKHI9blt0XSlbMF0pLzIsIlYiLHJbMV0pO3JldHVybiBlPjEmJnUucHVzaCgiSCIsclswXSksdS5qb2luKCIiKX1mdW5jdGlvbiBtbyhuKXtmb3IodmFyIHQ9MCxlPW4ubGVuZ3RoLHI9blswXSx1PVtyWzBdLCIsIixyWzFdXTsrK3Q8ZTspdS5wdXNoKCJWIiwocj1uW3RdKVsxXSwiSCIsclswXSk7cmV0dXJuIHUuam9pbigiIil9ZnVuY3Rpb24geW8obil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0sdT1bclswXSwiLCIsclsxXV07Kyt0PGU7KXUucHVzaCgiSCIsKHI9blt0XSlbMF0sIlYiLHJbMV0pO3JldHVybiB1LmpvaW4oIiIpfWZ1bmN0aW9uIE1vKG4sdCl7cmV0dXJuIG4ubGVuZ3RoPDQ/Z28obik6blsxXStfbyhuLnNsaWNlKDEsLTEpLHdvKG4sdCkpfWZ1bmN0aW9uIHhvKG4sdCl7cmV0dXJuIG4ubGVuZ3RoPDM/Z28obik6blswXStfbygobi5wdXNoKG5bMF0pLG4pLHdvKFtuW24ubGVuZ3RoLTJdXS5jb25jYXQobixbblsxXV0pLHQpKX1mdW5jdGlvbiBibyhuLHQpe3JldHVybiBuLmxlbmd0aDwzP2dvKG4pOm5bMF0rX28obix3byhuLHQpKX1mdW5jdGlvbiBfbyhuLHQpe2lmKHQubGVuZ3RoPDF8fG4ubGVuZ3RoIT10Lmxlbmd0aCYmbi5sZW5ndGghPXQubGVuZ3RoKzIpcmV0dXJuIGdvKG4pO3ZhciBlPW4ubGVuZ3RoIT10Lmxlbmd0aCxyPSIiLHU9blswXSxpPW5bMV0sbz10WzBdLGE9byxjPTE7aWYoZSYmKHIrPSJRIisoaVswXS0yKm9bMF0vMykrIiwiKyhpWzFdLTIqb1sxXS8zKSsiLCIraVswXSsiLCIraVsxXSx1PW5bMV0sYz0yKSx0Lmxlbmd0aD4xKXthPXRbMV0saT1uW2NdLGMrKyxyKz0iQyIrKHVbMF0rb1swXSkrIiwiKyh1WzFdK29bMV0pKyIsIisoaVswXS1hWzBdKSsiLCIrKGlbMV0tYVsxXSkrIiwiK2lbMF0rIiwiK2lbMV07Zm9yKHZhciBsPTI7bDx0Lmxlbmd0aDtsKyssYysrKWk9bltjXSxhPXRbbF0scis9IlMiKyhpWzBdLWFbMF0pKyIsIisoaVsxXS1hWzFdKSsiLCIraVswXSsiLCIraVsxXX1pZihlKXt2YXIgcz1uW2NdO3IrPSJRIisoaVswXSsyKmFbMF0vMykrIiwiKyhpWzFdKzIqYVsxXS8zKSsiLCIrc1swXSsiLCIrc1sxXX1yZXR1cm4gcn1mdW5jdGlvbiB3byhuLHQpe2Zvcih2YXIgZSxyPVtdLHU9KDEtdCkvMixpPW5bMF0sbz1uWzFdLGE9MSxjPW4ubGVuZ3RoOysrYTxjOyllPWksaT1vLG89blthXSxyLnB1c2goW3UqKG9bMF0tZVswXSksdSoob1sxXS1lWzFdKV0pO3JldHVybiByfWZ1bmN0aW9uIFNvKG4pe2lmKG4ubGVuZ3RoPDMpcmV0dXJuIGdvKG4pO3ZhciB0PTEsZT1uLmxlbmd0aCxyPW5bMF0sdT1yWzBdLGk9clsxXSxvPVt1LHUsdSwocj1uWzFdKVswXV0sYT1baSxpLGksclsxXV0sYz1bdSwiLCIsaSwiTCIsTm8oVGwsbyksIiwiLE5vKFRsLGEpXTtmb3Iobi5wdXNoKG5bZS0xXSk7Kyt0PD1lOylyPW5bdF0sby5zaGlmdCgpLG8ucHVzaChyWzBdKSxhLnNoaWZ0KCksYS5wdXNoKHJbMV0pLENvKGMsbyxhKTtyZXR1cm4gbi5wb3AoKSxjLnB1c2goIkwiLHIpLGMuam9pbigiIil9ZnVuY3Rpb24ga28obil7aWYobi5sZW5ndGg8NClyZXR1cm4gZ28obik7Zm9yKHZhciB0LGU9W10scj0tMSx1PW4ubGVuZ3RoLGk9WzBdLG89WzBdOysrcjwzOyl0PW5bcl0saS5wdXNoKHRbMF0pLG8ucHVzaCh0WzFdKTtmb3IoZS5wdXNoKE5vKFRsLGkpKyIsIitObyhUbCxvKSksLS1yOysrcjx1Oyl0PW5bcl0saS5zaGlmdCgpLGkucHVzaCh0WzBdKSxvLnNoaWZ0KCksby5wdXNoKHRbMV0pLENvKGUsaSxvKTtyZXR1cm4gZS5qb2luKCIiKX1mdW5jdGlvbiBFbyhuKXtmb3IodmFyIHQsZSxyPS0xLHU9bi5sZW5ndGgsaT11KzQsbz1bXSxhPVtdOysrcjw0OyllPW5bciV1XSxvLnB1c2goZVswXSksYS5wdXNoKGVbMV0pO2Zvcih0PVtObyhUbCxvKSwiLCIsTm8oVGwsYSldLC0tcjsrK3I8aTspZT1uW3IldV0sby5zaGlmdCgpLG8ucHVzaChlWzBdKSxhLnNoaWZ0KCksYS5wdXNoKGVbMV0pLENvKHQsbyxhKTtyZXR1cm4gdC5qb2luKCIiKX1mdW5jdGlvbiBBbyhuLHQpe3ZhciBlPW4ubGVuZ3RoLTE7aWYoZSlmb3IodmFyIHIsdSxpPW5bMF1bMF0sbz1uWzBdWzFdLGE9bltlXVswXS1pLGM9bltlXVsxXS1vLGw9LTE7KytsPD1lOylyPW5bbF0sdT1sL2UsclswXT10KnJbMF0rKDEtdCkqKGkrdSphKSxyWzFdPXQqclsxXSsoMS10KSoobyt1KmMpO3JldHVybiBTbyhuKX1mdW5jdGlvbiBObyhuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdK25bMl0qdFsyXStuWzNdKnRbM119ZnVuY3Rpb24gQ28obix0LGUpe24ucHVzaCgiQyIsTm8ocWwsdCksIiwiLE5vKHFsLGUpLCIsIixObyhMbCx0KSwiLCIsTm8oTGwsZSksIiwiLE5vKFRsLHQpLCIsIixObyhUbCxlKSl9ZnVuY3Rpb24gem8obix0KXtyZXR1cm4odFsxXS1uWzFdKS8odFswXS1uWzBdKX1mdW5jdGlvbiBxbyhuKXtmb3IodmFyIHQ9MCxlPW4ubGVuZ3RoLTEscj1bXSx1PW5bMF0saT1uWzFdLG89clswXT16byh1LGkpOysrdDxlOylyW3RdPShvKyhvPXpvKHU9aSxpPW5bdCsxXSkpKS8yO3JldHVybiByW3RdPW8scn1mdW5jdGlvbiBMbyhuKXtmb3IodmFyIHQsZSxyLHUsaT1bXSxvPXFvKG4pLGE9LTEsYz1uLmxlbmd0aC0xOysrYTxjOyl0PXpvKG5bYV0sblthKzFdKSx2YSh0KTxUYT9vW2FdPW9bYSsxXT0wOihlPW9bYV0vdCxyPW9bYSsxXS90LHU9ZSplK3Iqcix1PjkmJih1PTMqdC9NYXRoLnNxcnQodSksb1thXT11KmUsb1thKzFdPXUqcikpO2ZvcihhPS0xOysrYTw9YzspdT0obltNYXRoLm1pbihjLGErMSldWzBdLW5bTWF0aC5tYXgoMCxhLTEpXVswXSkvKDYqKDErb1thXSpvW2FdKSksaS5wdXNoKFt1fHwwLG9bYV0qdXx8MF0pO3JldHVybiBpfWZ1bmN0aW9uIFRvKG4pe3JldHVybiBuLmxlbmd0aDwzP2dvKG4pOm5bMF0rX28obixMbyhuKSl9ZnVuY3Rpb24gUm8obil7Zm9yKHZhciB0LGUscix1PS0xLGk9bi5sZW5ndGg7Kyt1PGk7KXQ9blt1XSxlPXRbMF0scj10WzFdLWphLHRbMF09ZSpNYXRoLmNvcyhyKSx0WzFdPWUqTWF0aC5zaW4ocik7cmV0dXJuIG59ZnVuY3Rpb24gRG8obil7ZnVuY3Rpb24gdCh0KXtmdW5jdGlvbiBjKCl7di5wdXNoKCJNIixhKG4obSksZikscyxsKG4oZC5yZXZlcnNlKCkpLGYpLCJaIil9Zm9yKHZhciBoLGcscCx2PVtdLGQ9W10sbT1bXSx5PS0xLE09dC5sZW5ndGgseD1rdChlKSxiPWt0KHUpLF89ZT09PXI/ZnVuY3Rpb24oKXtyZXR1cm4gZ306a3Qociksdz11PT09aT9mdW5jdGlvbigpe3JldHVybiBwfTprdChpKTsrK3k8TTspby5jYWxsKHRoaXMsaD10W3ldLHkpPyhkLnB1c2goW2c9K3guY2FsbCh0aGlzLGgseSkscD0rYi5jYWxsKHRoaXMsaCx5KV0pLG0ucHVzaChbK18uY2FsbCh0aGlzLGgseSksK3cuY2FsbCh0aGlzLGgseSldKSk6ZC5sZW5ndGgmJihjKCksZD1bXSxtPVtdKTtyZXR1cm4gZC5sZW5ndGgmJmMoKSx2Lmxlbmd0aD92LmpvaW4oIiIpOm51bGx9dmFyIGU9QXIscj1Bcix1PTAsaT1OcixvPU5lLGE9Z28sYz1hLmtleSxsPWEscz0iTCIsZj0uNztyZXR1cm4gdC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXI9bix0KTpyfSx0LngwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC54MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHQpOnJ9LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1pPW4sdCk6aX0sdC55MD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1uLHQpOnV9LHQueTE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bix0KTppfSx0LmRlZmluZWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bix0KTpvfSx0LmludGVycG9sYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiBuP2E9bjooYT16bC5nZXQobil8fGdvKS5rZXksbD1hLnJldmVyc2V8fGEscz1hLmNsb3NlZD8iTSI6IkwiLHQpOmMKfSx0LnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9bix0KTpmfSx0fWZ1bmN0aW9uIFBvKG4pe3JldHVybiBuLnJhZGl1c31mdW5jdGlvbiBVbyhuKXtyZXR1cm5bbi54LG4ueV19ZnVuY3Rpb24gam8obil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZT10WzBdLHI9dFsxXS1qYTtyZXR1cm5bZSpNYXRoLmNvcyhyKSxlKk1hdGguc2luKHIpXX19ZnVuY3Rpb24gRm8oKXtyZXR1cm4gNjR9ZnVuY3Rpb24gSG8oKXtyZXR1cm4iY2lyY2xlIn1mdW5jdGlvbiBPbyhuKXt2YXIgdD1NYXRoLnNxcnQobi9EYSk7cmV0dXJuIk0wLCIrdCsiQSIrdCsiLCIrdCsiIDAgMSwxIDAsIistdCsiQSIrdCsiLCIrdCsiIDAgMSwxIDAsIit0KyJaIn1mdW5jdGlvbiBZbyhuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdCxlOyh0PXRoaXNbbl0pJiYoZT10W3QuYWN0aXZlXSkmJigtLXQuY291bnQ/KGRlbGV0ZSB0W3QuYWN0aXZlXSx0LmFjdGl2ZSs9LjUpOmRlbGV0ZSB0aGlzW25dLGUuZXZlbnQmJmUuZXZlbnQuaW50ZXJydXB0LmNhbGwodGhpcyx0aGlzLl9fZGF0YV9fLGUuaW5kZXgpKX19ZnVuY3Rpb24gSW8obix0LGUpe3JldHVybiB4YShuLEhsKSxuLm5hbWVzcGFjZT10LG4uaWQ9ZSxufWZ1bmN0aW9uIFpvKG4sdCxlLHIpe3ZhciB1PW4uaWQsaT1uLm5hbWVzcGFjZTtyZXR1cm4gSChuLCJmdW5jdGlvbiI9PXR5cGVvZiBlP2Z1bmN0aW9uKG4sbyxhKXtuW2ldW3VdLnR3ZWVuLnNldCh0LHIoZS5jYWxsKG4sbi5fX2RhdGFfXyxvLGEpKSl9OihlPXIoZSksZnVuY3Rpb24obil7bltpXVt1XS50d2Vlbi5zZXQodCxlKX0pKX1mdW5jdGlvbiBWbyhuKXtyZXR1cm4gbnVsbD09biYmKG49IiIpLGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD1ufX1mdW5jdGlvbiBYbyhuKXtyZXR1cm4gbnVsbD09bj8iX190cmFuc2l0aW9uX18iOiJfX3RyYW5zaXRpb25fIituKyJfXyJ9ZnVuY3Rpb24gJG8obix0LGUscix1KXt2YXIgaT1uW2VdfHwobltlXT17YWN0aXZlOjAsY291bnQ6MH0pLG89aVtyXTtpZighbyl7dmFyIGM9dS50aW1lO289aVtyXT17dHdlZW46bmV3IGEsdGltZTpjLGRlbGF5OnUuZGVsYXksZHVyYXRpb246dS5kdXJhdGlvbixlYXNlOnUuZWFzZSxpbmRleDp0fSx1PW51bGwsKytpLmNvdW50LHRhLnRpbWVyKGZ1bmN0aW9uKHUpe2Z1bmN0aW9uIGEoZSl7aWYoaS5hY3RpdmU+cilyZXR1cm4gcygpO3ZhciB1PWlbaS5hY3RpdmVdO3UmJigtLWkuY291bnQsZGVsZXRlIGlbaS5hY3RpdmVdLHUuZXZlbnQmJnUuZXZlbnQuaW50ZXJydXB0LmNhbGwobixuLl9fZGF0YV9fLHUuaW5kZXgpKSxpLmFjdGl2ZT1yLG8uZXZlbnQmJm8uZXZlbnQuc3RhcnQuY2FsbChuLG4uX19kYXRhX18sdCksby50d2Vlbi5mb3JFYWNoKGZ1bmN0aW9uKGUscil7KHI9ci5jYWxsKG4sbi5fX2RhdGFfXyx0KSkmJnYucHVzaChyKX0pLGg9by5lYXNlLGY9by5kdXJhdGlvbix0YS50aW1lcihmdW5jdGlvbigpe3JldHVybiBwLmM9bChlfHwxKT9OZTpsLDF9LDAsYyl9ZnVuY3Rpb24gbChlKXtpZihpLmFjdGl2ZSE9PXIpcmV0dXJuIDE7Zm9yKHZhciB1PWUvZixhPWgodSksYz12Lmxlbmd0aDtjPjA7KXZbLS1jXS5jYWxsKG4sYSk7cmV0dXJuIHU+PTE/KG8uZXZlbnQmJm8uZXZlbnQuZW5kLmNhbGwobixuLl9fZGF0YV9fLHQpLHMoKSk6dm9pZCAwfWZ1bmN0aW9uIHMoKXtyZXR1cm4tLWkuY291bnQ/ZGVsZXRlIGlbcl06ZGVsZXRlIG5bZV0sMX12YXIgZixoLGc9by5kZWxheSxwPW9jLHY9W107cmV0dXJuIHAudD1nK2MsdT49Zz9hKHUtZyk6KHAuYz1hLHZvaWQgMCl9LDAsYyl9fWZ1bmN0aW9uIEJvKG4sdCxlKXtuLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7dmFyIHI9dChuKTtyZXR1cm4idHJhbnNsYXRlKCIrKGlzRmluaXRlKHIpP3I6ZShuKSkrIiwwKSJ9KX1mdW5jdGlvbiBXbyhuLHQsZSl7bi5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKG4pe3ZhciByPXQobik7cmV0dXJuInRyYW5zbGF0ZSgwLCIrKGlzRmluaXRlKHIpP3I6ZShuKSkrIikifSl9ZnVuY3Rpb24gSm8obil7cmV0dXJuIG4udG9JU09TdHJpbmcoKX1mdW5jdGlvbiBHbyhuLHQsZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gbih0KX1mdW5jdGlvbiB1KG4sZSl7dmFyIHI9blsxXS1uWzBdLHU9ci9lLGk9dGEuYmlzZWN0KFdsLHUpO3JldHVybiBpPT1XbC5sZW5ndGg/W3QueWVhcixWaShuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbi8zMTUzNmU2fSksZSlbMl1dOmk/dFt1L1dsW2ktMV08V2xbaV0vdT9pLTE6aV06W0tsLFZpKG4sZSlbMl1dfXJldHVybiByLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gS28obi5pbnZlcnQodCkpfSxyLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obi5kb21haW4odCkscik6bi5kb21haW4oKS5tYXAoS28pfSxyLm5pY2U9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiFpc05hTihlKSYmIW4ucmFuZ2UoZSxLbygrZSsxKSx0KS5sZW5ndGh9dmFyIGk9ci5kb21haW4oKSxvPVBpKGkpLGE9bnVsbD09bj91KG8sMTApOiJudW1iZXIiPT10eXBlb2YgbiYmdShvLG4pO3JldHVybiBhJiYobj1hWzBdLHQ9YVsxXSksci5kb21haW4oRmkoaSx0PjE/e2Zsb29yOmZ1bmN0aW9uKHQpe2Zvcig7ZSh0PW4uZmxvb3IodCkpOyl0PUtvKHQtMSk7cmV0dXJuIHR9LGNlaWw6ZnVuY3Rpb24odCl7Zm9yKDtlKHQ9bi5jZWlsKHQpKTspdD1LbygrdCsxKTtyZXR1cm4gdH19Om4pKX0sci50aWNrcz1mdW5jdGlvbihuLHQpe3ZhciBlPVBpKHIuZG9tYWluKCkpLGk9bnVsbD09bj91KGUsMTApOiJudW1iZXIiPT10eXBlb2Ygbj91KGUsbik6IW4ucmFuZ2UmJlt7cmFuZ2U6bn0sdF07cmV0dXJuIGkmJihuPWlbMF0sdD1pWzFdKSxuLnJhbmdlKGVbMF0sS28oK2VbMV0rMSksMT50PzE6dCl9LHIudGlja0Zvcm1hdD1mdW5jdGlvbigpe3JldHVybiBlfSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gR28obi5jb3B5KCksdCxlKX0sSWkocixuKX1mdW5jdGlvbiBLbyhuKXtyZXR1cm4gbmV3IERhdGUobil9ZnVuY3Rpb24gUW8obil7cmV0dXJuIEpTT04ucGFyc2Uobi5yZXNwb25zZVRleHQpfWZ1bmN0aW9uIG5hKG4pe3ZhciB0PXVhLmNyZWF0ZVJhbmdlKCk7cmV0dXJuIHQuc2VsZWN0Tm9kZSh1YS5ib2R5KSx0LmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChuLnJlc3BvbnNlVGV4dCl9dmFyIHRhPXt2ZXJzaW9uOiIzLjUuMiJ9O0RhdGUubm93fHwoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KTt2YXIgZWE9W10uc2xpY2UscmE9ZnVuY3Rpb24obil7cmV0dXJuIGVhLmNhbGwobil9LHVhPWRvY3VtZW50LGlhPXVhLmRvY3VtZW50RWxlbWVudCxvYT13aW5kb3c7dHJ5e3JhKGlhLmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlfWNhdGNoKGFhKXtyYT1mdW5jdGlvbihuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1uZXcgQXJyYXkodCk7dC0tOyllW3RdPW5bdF07cmV0dXJuIGV9fXRyeXt1YS5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZS5zZXRQcm9wZXJ0eSgib3BhY2l0eSIsMCwiIil9Y2F0Y2goY2Epe3ZhciBsYT1vYS5FbGVtZW50LnByb3RvdHlwZSxzYT1sYS5zZXRBdHRyaWJ1dGUsZmE9bGEuc2V0QXR0cmlidXRlTlMsaGE9b2EuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUsZ2E9aGEuc2V0UHJvcGVydHk7bGEuc2V0QXR0cmlidXRlPWZ1bmN0aW9uKG4sdCl7c2EuY2FsbCh0aGlzLG4sdCsiIil9LGxhLnNldEF0dHJpYnV0ZU5TPWZ1bmN0aW9uKG4sdCxlKXtmYS5jYWxsKHRoaXMsbix0LGUrIiIpfSxoYS5zZXRQcm9wZXJ0eT1mdW5jdGlvbihuLHQsZSl7Z2EuY2FsbCh0aGlzLG4sdCsiIixlKX19dGEuYXNjZW5kaW5nPW4sdGEuZGVzY2VuZGluZz1mdW5jdGlvbihuLHQpe3JldHVybiBuPnQ/LTE6dD5uPzE6dD49bj8wOjAvMH0sdGEubWluPWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1PS0xLGk9bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPW5bdV0pJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9blt1XSkmJmU+ciYmKGU9cil9ZWxzZXtmb3IoOysrdTxpOylpZihudWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7Kyt1PGk7KW51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZlPnImJihlPXIpfXJldHVybiBlfSx0YS5tYXg9ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9blt1XSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj1uW3VdKSYmcj5lJiYoZT1yKX1lbHNle2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJnI+ZSYmKGU9cil9cmV0dXJuIGV9LHRhLmV4dGVudD1mdW5jdGlvbihuLHQpe3ZhciBlLHIsdSxpPS0xLG89bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7KytpPG87KWlmKG51bGwhPShyPW5baV0pJiZyPj1yKXtlPXU9cjticmVha31mb3IoOysraTxvOyludWxsIT0ocj1uW2ldKSYmKGU+ciYmKGU9cikscj51JiYodT1yKSl9ZWxzZXtmb3IoOysraTxvOylpZihudWxsIT0ocj10LmNhbGwobixuW2ldLGkpKSYmcj49cil7ZT11PXI7YnJlYWt9Zm9yKDsrK2k8bzspbnVsbCE9KHI9dC5jYWxsKG4sbltpXSxpKSkmJihlPnImJihlPXIpLHI+dSYmKHU9cikpfXJldHVybltlLHVdfSx0YS5zdW09ZnVuY3Rpb24obix0KXt2YXIgcix1PTAsaT1uLmxlbmd0aCxvPS0xO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KytvPGk7KWUocj0rbltvXSkmJih1Kz1yKTtlbHNlIGZvcig7KytvPGk7KWUocj0rdC5jYWxsKG4sbltvXSxvKSkmJih1Kz1yKTtyZXR1cm4gdX0sdGEubWVhbj1mdW5jdGlvbihuLHIpe3ZhciB1LGk9MCxvPW4ubGVuZ3RoLGE9LTEsYz1vO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KythPG87KWUodT10KG5bYV0pKT9pKz11Oi0tYztlbHNlIGZvcig7KythPG87KWUodT10KHIuY2FsbChuLG5bYV0sYSkpKT9pKz11Oi0tYztyZXR1cm4gYz9pL2M6dm9pZCAwfSx0YS5xdWFudGlsZT1mdW5jdGlvbihuLHQpe3ZhciBlPShuLmxlbmd0aC0xKSp0KzEscj1NYXRoLmZsb29yKGUpLHU9K25bci0xXSxpPWUtcjtyZXR1cm4gaT91K2kqKG5bcl0tdSk6dX0sdGEubWVkaWFuPWZ1bmN0aW9uKHIsdSl7dmFyIGksbz1bXSxhPXIubGVuZ3RoLGM9LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2M8YTspZShpPXQocltjXSkpJiZvLnB1c2goaSk7ZWxzZSBmb3IoOysrYzxhOyllKGk9dCh1LmNhbGwocixyW2NdLGMpKSkmJm8ucHVzaChpKTtyZXR1cm4gby5sZW5ndGg/dGEucXVhbnRpbGUoby5zb3J0KG4pLC41KTp2b2lkIDB9LHRhLnZhcmlhbmNlPWZ1bmN0aW9uKG4scil7dmFyIHUsaSxvPW4ubGVuZ3RoLGE9MCxjPTAsbD0tMSxzPTA7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2w8bzspZSh1PXQobltsXSkpJiYoaT11LWEsYSs9aS8rK3MsYys9aSoodS1hKSk7ZWxzZSBmb3IoOysrbDxvOyllKHU9dChyLmNhbGwobixuW2xdLGwpKSkmJihpPXUtYSxhKz1pLysrcyxjKz1pKih1LWEpKTtyZXR1cm4gcz4xP2MvKHMtMSk6dm9pZCAwfSx0YS5kZXZpYXRpb249ZnVuY3Rpb24oKXt2YXIgbj10YS52YXJpYW5jZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG4/TWF0aC5zcXJ0KG4pOm59O3ZhciBwYT1yKG4pO3RhLmJpc2VjdExlZnQ9cGEubGVmdCx0YS5iaXNlY3Q9dGEuYmlzZWN0UmlnaHQ9cGEucmlnaHQsdGEuYmlzZWN0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIHIoMT09PXQubGVuZ3RoP2Z1bmN0aW9uKGUscil7cmV0dXJuIG4odChlKSxyKX06dCl9LHRhLnNodWZmbGU9ZnVuY3Rpb24obix0LGUpeyhpPWFyZ3VtZW50cy5sZW5ndGgpPDMmJihlPW4ubGVuZ3RoLDI+aSYmKHQ9MCkpO2Zvcih2YXIgcix1LGk9ZS10O2k7KXU9MHxNYXRoLnJhbmRvbSgpKmktLSxyPW5baSt0XSxuW2krdF09blt1K3RdLG5bdSt0XT1yO3JldHVybiBufSx0YS5wZXJtdXRlPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT1uW3RbZV1dO3JldHVybiByfSx0YS5wYWlycz1mdW5jdGlvbihuKXtmb3IodmFyIHQsZT0wLHI9bi5sZW5ndGgtMSx1PW5bMF0saT1uZXcgQXJyYXkoMD5yPzA6cik7cj5lOylpW2VdPVt0PXUsdT1uWysrZV1dO3JldHVybiBpfSx0YS56aXA9ZnVuY3Rpb24oKXtpZighKHI9YXJndW1lbnRzLmxlbmd0aCkpcmV0dXJuW107Zm9yKHZhciBuPS0xLHQ9dGEubWluKGFyZ3VtZW50cyx1KSxlPW5ldyBBcnJheSh0KTsrK248dDspZm9yKHZhciByLGk9LTEsbz1lW25dPW5ldyBBcnJheShyKTsrK2k8cjspb1tpXT1hcmd1bWVudHNbaV1bbl07cmV0dXJuIGV9LHRhLnRyYW5zcG9zZT1mdW5jdGlvbihuKXtyZXR1cm4gdGEuemlwLmFwcGx5KHRhLG4pfSx0YS5rZXlzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChlKTtyZXR1cm4gdH0sdGEudmFsdWVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChuW2VdKTtyZXR1cm4gdH0sdGEuZW50cmllcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gbil0LnB1c2goe2tleTplLHZhbHVlOm5bZV19KTtyZXR1cm4gdH0sdGEubWVyZ2U9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1PW4ubGVuZ3RoLGk9LTEsbz0wOysraTx1OylvKz1uW2ldLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkobyk7LS11Pj0wOylmb3Iocj1uW3VdLHQ9ci5sZW5ndGg7LS10Pj0wOyllWy0tb109clt0XTtyZXR1cm4gZX07dmFyIHZhPU1hdGguYWJzO3RhLnJhbmdlPWZ1bmN0aW9uKG4sdCxlKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihlPTEsYXJndW1lbnRzLmxlbmd0aDwyJiYodD1uLG49MCkpLDEvMD09PSh0LW4pL2UpdGhyb3cgbmV3IEVycm9yKCJpbmZpbml0ZSByYW5nZSIpO3ZhciByLHU9W10sbz1pKHZhKGUpKSxhPS0xO2lmKG4qPW8sdCo9byxlKj1vLDA+ZSlmb3IoOyhyPW4rZSorK2EpPnQ7KXUucHVzaChyL28pO2Vsc2UgZm9yKDsocj1uK2UqKythKTx0Oyl1LnB1c2goci9vKTtyZXR1cm4gdX0sdGEubWFwPWZ1bmN0aW9uKG4sdCl7dmFyIGU9bmV3IGE7aWYobiBpbnN0YW5jZW9mIGEpbi5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7ZS5zZXQobix0KX0pO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShuKSl7dmFyIHIsdT0tMSxpPW4ubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7Kyt1PGk7KWUuc2V0KHUsblt1XSk7ZWxzZSBmb3IoOysrdTxpOyllLnNldCh0LmNhbGwobixyPW5bdV0sdSkscil9ZWxzZSBmb3IodmFyIG8gaW4gbillLnNldChvLG5bb10pO3JldHVybiBlfTt2YXIgZGE9Il9fcHJvdG9fXyIsbWE9Ilx4MDAiO28oYSx7aGFzOnMsZ2V0OmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9bYyhuKV19LHNldDpmdW5jdGlvbihuLHQpe3JldHVybiB0aGlzLl9bYyhuKV09dH0scmVtb3ZlOmYsa2V5czpoLHZhbHVlczpmdW5jdGlvbigpe3ZhciBuPVtdO2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5wdXNoKHRoaXMuX1t0XSk7cmV0dXJuIG59LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaCh7a2V5OmwodCksdmFsdWU6dGhpcy5fW3RdfSk7cmV0dXJuIG59LHNpemU6ZyxlbXB0eTpwLGZvckVhY2g6ZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIHRoaXMuXyluLmNhbGwodGhpcyxsKHQpLHRoaXMuX1t0XSl9fSksdGEubmVzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCxvLGMpe2lmKGM+PWkubGVuZ3RoKXJldHVybiByP3IuY2FsbCh1LG8pOmU/by5zb3J0KGUpOm87Zm9yKHZhciBsLHMsZixoLGc9LTEscD1vLmxlbmd0aCx2PWlbYysrXSxkPW5ldyBhOysrZzxwOykoaD1kLmdldChsPXYocz1vW2ddKSkpP2gucHVzaChzKTpkLnNldChsLFtzXSk7cmV0dXJuIHQ/KHM9dCgpLGY9ZnVuY3Rpb24oZSxyKXtzLnNldChlLG4odCxyLGMpKX0pOihzPXt9LGY9ZnVuY3Rpb24oZSxyKXtzW2VdPW4odCxyLGMpfSksZC5mb3JFYWNoKGYpLHN9ZnVuY3Rpb24gdChuLGUpe2lmKGU+PWkubGVuZ3RoKXJldHVybiBuO3ZhciByPVtdLHU9b1tlKytdO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24obix1KXtyLnB1c2goe2tleTpuLHZhbHVlczp0KHUsZSl9KX0pLHU/ci5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHUobi5rZXksdC5rZXkpfSk6cn12YXIgZSxyLHU9e30saT1bXSxvPVtdO3JldHVybiB1Lm1hcD1mdW5jdGlvbih0LGUpe3JldHVybiBuKGUsdCwwKX0sdS5lbnRyaWVzPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4odGEubWFwLGUsMCksMCl9LHUua2V5PWZ1bmN0aW9uKG4pe3JldHVybiBpLnB1c2gobiksdX0sdS5zb3J0S2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gb1tpLmxlbmd0aC0xXT1uLHV9LHUuc29ydFZhbHVlcz1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLHV9LHUucm9sbHVwPWZ1bmN0aW9uKG4pe3JldHVybiByPW4sdX0sdX0sdGEuc2V0PWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyB2O2lmKG4pZm9yKHZhciBlPTAscj1uLmxlbmd0aDtyPmU7KytlKXQuYWRkKG5bZV0pO3JldHVybiB0fSxvKHYse2hhczpzLGFkZDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fW2Mobis9IiIpXT0hMCxufSxyZW1vdmU6Zix2YWx1ZXM6aCxzaXplOmcsZW1wdHk6cCxmb3JFYWNoOmZ1bmN0aW9uKG4pe2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5jYWxsKHRoaXMsbCh0KSl9fSksdGEuYmVoYXZpb3I9e30sdGEucmViaW5kPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlLHI9MSx1PWFyZ3VtZW50cy5sZW5ndGg7KytyPHU7KW5bZT1hcmd1bWVudHNbcl1dPWQobix0LHRbZV0pO3JldHVybiBufTt2YXIgeWE9WyJ3ZWJraXQiLCJtcyIsIm1veiIsIk1veiIsIm8iLCJPIl07dGEuZGlzcGF0Y2g9ZnVuY3Rpb24oKXtmb3IodmFyIG49bmV3IE0sdD0tMSxlPWFyZ3VtZW50cy5sZW5ndGg7Kyt0PGU7KW5bYXJndW1lbnRzW3RdXT14KG4pO3JldHVybiBufSxNLnByb3RvdHlwZS5vbj1mdW5jdGlvbihuLHQpe3ZhciBlPW4uaW5kZXhPZigiLiIpLHI9IiI7aWYoZT49MCYmKHI9bi5zbGljZShlKzEpLG49bi5zbGljZSgwLGUpKSxuKXJldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpc1tuXS5vbihyKTp0aGlzW25dLm9uKHIsdCk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKG51bGw9PXQpZm9yKG4gaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KG4pJiZ0aGlzW25dLm9uKHIsbnVsbCk7cmV0dXJuIHRoaXN9fSx0YS5ldmVudD1udWxsLHRhLnJlcXVvdGU9ZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZShNYSwiXFwkJiIpfTt2YXIgTWE9L1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nLHhhPXt9Ll9fcHJvdG9fXz9mdW5jdGlvbihuLHQpe24uX19wcm90b19fPXR9OmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlIGluIHQpbltlXT10W2VdfSxiYT1mdW5jdGlvbihuLHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3Iobil9LF9hPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvckFsbChuKX0sd2E9aWEubWF0Y2hlc3x8aWFbbShpYSwibWF0Y2hlc1NlbGVjdG9yIildLFNhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHdhLmNhbGwobix0KX07ImZ1bmN0aW9uIj09dHlwZW9mIFNpenpsZSYmKGJhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIFNpenpsZShuLHQpWzBdfHxudWxsfSxfYT1TaXp6bGUsU2E9U2l6emxlLm1hdGNoZXNTZWxlY3RvciksdGEuc2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIE5hfTt2YXIga2E9dGEuc2VsZWN0aW9uLnByb3RvdHlwZT1bXTtrYS5zZWxlY3Q9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaT1bXTtuPWsobik7Zm9yKHZhciBvPS0xLGE9dGhpcy5sZW5ndGg7KytvPGE7KXtpLnB1c2godD1bXSksdC5wYXJlbnROb2RlPShyPXRoaXNbb10pLnBhcmVudE5vZGU7Zm9yKHZhciBjPS0xLGw9ci5sZW5ndGg7KytjPGw7KSh1PXJbY10pPyh0LnB1c2goZT1uLmNhbGwodSx1Ll9fZGF0YV9fLGMsbykpLGUmJiJfX2RhdGFfXyJpbiB1JiYoZS5fX2RhdGFfXz11Ll9fZGF0YV9fKSk6dC5wdXNoKG51bGwpfXJldHVybiBTKGkpfSxrYS5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQsZSxyPVtdO249RShuKTtmb3IodmFyIHU9LTEsaT10aGlzLmxlbmd0aDsrK3U8aTspZm9yKHZhciBvPXRoaXNbdV0sYT0tMSxjPW8ubGVuZ3RoOysrYTxjOykoZT1vW2FdKSYmKHIucHVzaCh0PXJhKG4uY2FsbChlLGUuX19kYXRhX18sYSx1KSkpLHQucGFyZW50Tm9kZT1lKTtyZXR1cm4gUyhyKX07dmFyIEVhPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTt0YS5ucz17cHJlZml4OkVhLHF1YWxpZnk6ZnVuY3Rpb24obil7dmFyIHQ9bi5pbmRleE9mKCI6IiksZT1uO3JldHVybiB0Pj0wJiYoZT1uLnNsaWNlKDAsdCksbj1uLnNsaWNlKHQrMSkpLEVhLmhhc093blByb3BlcnR5KGUpP3tzcGFjZTpFYVtlXSxsb2NhbDpufTpufX0sa2EuYXR0cj1mdW5jdGlvbihuLHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXt2YXIgZT10aGlzLm5vZGUoKTtyZXR1cm4gbj10YS5ucy5xdWFsaWZ5KG4pLG4ubG9jYWw/ZS5nZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOmUuZ2V0QXR0cmlidXRlKG4pfWZvcih0IGluIG4pdGhpcy5lYWNoKEEodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaChBKG4sdCkpfSxrYS5jbGFzc2VkPWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBlPXRoaXMubm9kZSgpLHI9KG49eihuKSkubGVuZ3RoLHU9LTE7aWYodD1lLmNsYXNzTGlzdCl7Zm9yKDsrK3U8cjspaWYoIXQuY29udGFpbnMoblt1XSkpcmV0dXJuITF9ZWxzZSBmb3IodD1lLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsrK3U8cjspaWYoIUMoblt1XSkudGVzdCh0KSlyZXR1cm4hMTtyZXR1cm4hMH1mb3IodCBpbiBuKXRoaXMuZWFjaChxKHQsblt0XSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2gocShuLHQpKX0sa2Euc3R5bGU9ZnVuY3Rpb24obix0LGUpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5yKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+ciYmKHQ9IiIpO2ZvcihlIGluIG4pdGhpcy5lYWNoKFQoZSxuW2VdLHQpKTtyZXR1cm4gdGhpc31pZigyPnIpcmV0dXJuIG9hLmdldENvbXB1dGVkU3R5bGUodGhpcy5ub2RlKCksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKTtlPSIifXJldHVybiB0aGlzLmVhY2goVChuLHQsZSkpfSxrYS5wcm9wZXJ0eT1mdW5jdGlvbihuLHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXJldHVybiB0aGlzLm5vZGUoKVtuXTtmb3IodCBpbiBuKXRoaXMuZWFjaChSKHQsblt0XSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goUihuLHQpKX0sa2EudGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24oKXt2YXIgdD1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PXQ/IiI6dH06bnVsbD09bj9mdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9IiJ9OmZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD1ufSk6dGhpcy5ub2RlKCkudGV4dENvbnRlbnR9LGthLmh0bWw9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09dD8iIjp0fTpudWxsPT1uP2Z1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9IiJ9OmZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9bn0pOnRoaXMubm9kZSgpLmlubmVySFRNTH0sa2EuYXBwZW5kPWZ1bmN0aW9uKG4pe3JldHVybiBuPUQobiksdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KX0sa2EuaW5zZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49RChuKSx0PWsodCksdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSl9LGthLnJlbW92ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goUCl9LGthLmRhdGE9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4sZSl7dmFyIHIsdSxpLG89bi5sZW5ndGgsZj1lLmxlbmd0aCxoPU1hdGgubWluKG8sZiksZz1uZXcgQXJyYXkoZikscD1uZXcgQXJyYXkoZiksdj1uZXcgQXJyYXkobyk7aWYodCl7dmFyIGQsbT1uZXcgYSx5PW5ldyBBcnJheShvKTtmb3Iocj0tMTsrK3I8bzspbS5oYXMoZD10LmNhbGwodT1uW3JdLHUuX19kYXRhX18scikpP3Zbcl09dTptLnNldChkLHUpLHlbcl09ZDtmb3Iocj0tMTsrK3I8ZjspKHU9bS5nZXQoZD10LmNhbGwoZSxpPWVbcl0scikpKT91IT09ITAmJihnW3JdPXUsdS5fX2RhdGFfXz1pKTpwW3JdPVUoaSksbS5zZXQoZCwhMCk7Zm9yKHI9LTE7KytyPG87KW0uZ2V0KHlbcl0pIT09ITAmJih2W3JdPW5bcl0pfWVsc2V7Zm9yKHI9LTE7KytyPGg7KXU9bltyXSxpPWVbcl0sdT8odS5fX2RhdGFfXz1pLGdbcl09dSk6cFtyXT1VKGkpO2Zvcig7Zj5yOysrcilwW3JdPVUoZVtyXSk7Zm9yKDtvPnI7KytyKXZbcl09bltyXX1wLnVwZGF0ZT1nLHAucGFyZW50Tm9kZT1nLnBhcmVudE5vZGU9di5wYXJlbnROb2RlPW4ucGFyZW50Tm9kZSxjLnB1c2gocCksbC5wdXNoKGcpLHMucHVzaCh2KX12YXIgcix1LGk9LTEsbz10aGlzLmxlbmd0aDtpZighYXJndW1lbnRzLmxlbmd0aCl7Zm9yKG49bmV3IEFycmF5KG89KHI9dGhpc1swXSkubGVuZ3RoKTsrK2k8bzspKHU9cltpXSkmJihuW2ldPXUuX19kYXRhX18pO3JldHVybiBufXZhciBjPU8oW10pLGw9UyhbXSkscz1TKFtdKTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbilmb3IoOysraTxvOyllKHI9dGhpc1tpXSxuLmNhbGwocixyLnBhcmVudE5vZGUuX19kYXRhX18saSkpO2Vsc2UgZm9yKDsrK2k8bzspZShyPXRoaXNbaV0sbik7cmV0dXJuIGwuZW50ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gY30sbC5leGl0PWZ1bmN0aW9uKCl7cmV0dXJuIHN9LGx9LGthLmRhdHVtPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIixuKTp0aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIpfSxrYS5maWx0ZXI9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9W107ImZ1bmN0aW9uIiE9dHlwZW9mIG4mJihuPWoobikpO2Zvcih2YXIgaT0wLG89dGhpcy5sZW5ndGg7bz5pO2krKyl7dS5wdXNoKHQ9W10pLHQucGFyZW50Tm9kZT0oZT10aGlzW2ldKS5wYXJlbnROb2RlO2Zvcih2YXIgYT0wLGM9ZS5sZW5ndGg7Yz5hO2ErKykocj1lW2FdKSYmbi5jYWxsKHIsci5fX2RhdGFfXyxhLGkpJiZ0LnB1c2gocil9cmV0dXJuIFModSl9LGthLm9yZGVyPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPS0xLHQ9dGhpcy5sZW5ndGg7KytuPHQ7KWZvcih2YXIgZSxyPXRoaXNbbl0sdT1yLmxlbmd0aC0xLGk9clt1XTstLXU+PTA7KShlPXJbdV0pJiYoaSYmaSE9PWUubmV4dFNpYmxpbmcmJmkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxpKSxpPWUpO3JldHVybiB0aGlzfSxrYS5zb3J0PWZ1bmN0aW9uKG4pe249Ri5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Zm9yKHZhciB0PS0xLGU9dGhpcy5sZW5ndGg7Kyt0PGU7KXRoaXNbdF0uc29ydChuKTtyZXR1cm4gdGhpcy5vcmRlcigpfSxrYS5lYWNoPWZ1bmN0aW9uKG4pe3JldHVybiBIKHRoaXMsZnVuY3Rpb24odCxlLHIpe24uY2FsbCh0LHQuX19kYXRhX18sZSxyKX0pfSxrYS5jYWxsPWZ1bmN0aW9uKG4pe3ZhciB0PXJhKGFyZ3VtZW50cyk7cmV0dXJuIG4uYXBwbHkodFswXT10aGlzLHQpLHRoaXN9LGthLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxrYS5ub2RlPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsdD10aGlzLmxlbmd0aDt0Pm47bisrKWZvcih2YXIgZT10aGlzW25dLHI9MCx1PWUubGVuZ3RoO3U+cjtyKyspe3ZhciBpPWVbcl07aWYoaSlyZXR1cm4gaX1yZXR1cm4gbnVsbH0sa2Euc2l6ZT1mdW5jdGlvbigpe3ZhciBuPTA7cmV0dXJuIEgodGhpcyxmdW5jdGlvbigpeysrbn0pLG59O3ZhciBBYT1bXTt0YS5zZWxlY3Rpb24uZW50ZXI9Tyx0YS5zZWxlY3Rpb24uZW50ZXIucHJvdG90eXBlPUFhLEFhLmFwcGVuZD1rYS5hcHBlbmQsQWEuZW1wdHk9a2EuZW1wdHksQWEubm9kZT1rYS5ub2RlLEFhLmNhbGw9a2EuY2FsbCxBYS5zaXplPWthLnNpemUsQWEuc2VsZWN0PWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHIsdSxpLG89W10sYT0tMSxjPXRoaXMubGVuZ3RoOysrYTxjOyl7cj0odT10aGlzW2FdKS51cGRhdGUsby5wdXNoKHQ9W10pLHQucGFyZW50Tm9kZT11LnBhcmVudE5vZGU7Zm9yKHZhciBsPS0xLHM9dS5sZW5ndGg7KytsPHM7KShpPXVbbF0pPyh0LnB1c2gocltsXT1lPW4uY2FsbCh1LnBhcmVudE5vZGUsaS5fX2RhdGFfXyxsLGEpKSxlLl9fZGF0YV9fPWkuX19kYXRhX18pOnQucHVzaChudWxsKX1yZXR1cm4gUyhvKX0sQWEuaW5zZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MiYmKHQ9WSh0aGlzKSksa2EuaW5zZXJ0LmNhbGwodGhpcyxuLHQpfSx0YS5zZWxlY3Q9ZnVuY3Rpb24obil7dmFyIHQ9WyJzdHJpbmciPT10eXBlb2Ygbj9iYShuLHVhKTpuXTtyZXR1cm4gdC5wYXJlbnROb2RlPWlhLFMoW3RdKX0sdGEuc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0PXJhKCJzdHJpbmciPT10eXBlb2Ygbj9fYShuLHVhKTpuKTtyZXR1cm4gdC5wYXJlbnROb2RlPWlhLFMoW3RdKX07dmFyIE5hPXRhLnNlbGVjdChpYSk7a2Eub249ZnVuY3Rpb24obix0LGUpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5yKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+ciYmKHQ9ITEpO2ZvcihlIGluIG4pdGhpcy5lYWNoKEkoZSxuW2VdLHQpKTtyZXR1cm4gdGhpc31pZigyPnIpcmV0dXJuKHI9dGhpcy5ub2RlKClbIl9fb24iK25dKSYmci5fO2U9ITF9cmV0dXJuIHRoaXMuZWFjaChJKG4sdCxlKSl9O3ZhciBDYT10YS5tYXAoe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSk7Q2EuZm9yRWFjaChmdW5jdGlvbihuKXsib24iK24gaW4gdWEmJkNhLnJlbW92ZShuKX0pO3ZhciB6YT0ib25zZWxlY3RzdGFydCJpbiB1YT9udWxsOm0oaWEuc3R5bGUsInVzZXJTZWxlY3QiKSxxYT0wO3RhLm1vdXNlPWZ1bmN0aW9uKG4pe3JldHVybiAkKG4sXygpKX07dmFyIExhPS9XZWJLaXQvLnRlc3Qob2EubmF2aWdhdG9yLnVzZXJBZ2VudCk/LTE6MDt0YS50b3VjaD1mdW5jdGlvbihuLHQsZSl7aWYoYXJndW1lbnRzLmxlbmd0aDwzJiYoZT10LHQ9XygpLmNoYW5nZWRUb3VjaGVzKSx0KWZvcih2YXIgcix1PTAsaT10Lmxlbmd0aDtpPnU7Kyt1KWlmKChyPXRbdV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiAkKG4scil9LHRhLmJlaGF2aW9yLmRyYWc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dGhpcy5vbigibW91c2Vkb3duLmRyYWciLHUpLm9uKCJ0b3VjaHN0YXJ0LmRyYWciLGkpfWZ1bmN0aW9uIHQobix0LHUsaSxvKXtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dmFyIG4sZSxyPXQoaCx2KTtyJiYobj1yWzBdLU1bMF0sZT1yWzFdLU1bMV0scHw9bnxlLE09cixnKHt0eXBlOiJkcmFnIix4OnJbMF0rbFswXSx5OnJbMV0rbFsxXSxkeDpuLGR5OmV9KSl9ZnVuY3Rpb24gYygpe3QoaCx2KSYmKG0ub24oaStkLG51bGwpLm9uKG8rZCxudWxsKSx5KHAmJnRhLmV2ZW50LnRhcmdldD09PWYpLGcoe3R5cGU6ImRyYWdlbmQifSkpfXZhciBsLHM9dGhpcyxmPXRhLmV2ZW50LnRhcmdldCxoPXMucGFyZW50Tm9kZSxnPWUub2Yocyxhcmd1bWVudHMpLHA9MCx2PW4oKSxkPSIuZHJhZyIrKG51bGw9PXY/IiI6Ii0iK3YpLG09dGEuc2VsZWN0KHUoKSkub24oaStkLGEpLm9uKG8rZCxjKSx5PVgoKSxNPXQoaCx2KTtyPyhsPXIuYXBwbHkocyxhcmd1bWVudHMpLGw9W2wueC1NWzBdLGwueS1NWzFdXSk6bD1bMCwwXSxnKHt0eXBlOiJkcmFnc3RhcnQifSl9fXZhciBlPXcobiwiZHJhZyIsImRyYWdzdGFydCIsImRyYWdlbmQiKSxyPW51bGwsdT10KHksdGEubW91c2UsSiwibW91c2Vtb3ZlIiwibW91c2V1cCIpLGk9dChCLHRhLnRvdWNoLFcsInRvdWNobW92ZSIsInRvdWNoZW5kIik7cmV0dXJuIG4ub3JpZ2luPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sdGEucmViaW5kKG4sZSwib24iKX0sdGEudG91Y2hlcz1mdW5jdGlvbihuLHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PV8oKS50b3VjaGVzKSx0P3JhKHQpLm1hcChmdW5jdGlvbih0KXt2YXIgZT0kKG4sdCk7cmV0dXJuIGUuaWRlbnRpZmllcj10LmlkZW50aWZpZXIsZX0pOltdfTt2YXIgVGE9MWUtNixSYT1UYSpUYSxEYT1NYXRoLlBJLFBhPTIqRGEsVWE9UGEtVGEsamE9RGEvMixGYT1EYS8xODAsSGE9MTgwL0RhLE9hPU1hdGguU1FSVDIsWWE9MixJYT00O3RhLmludGVycG9sYXRlWm9vbT1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobil7dmFyIHQ9bip5O2lmKG0pe3ZhciBlPWV0KHYpLG89aS8oWWEqaCkqKGUqcnQoT2EqdCt2KS10dCh2KSk7cmV0dXJuW3IrbypsLHUrbypzLGkqZS9ldChPYSp0K3YpXX1yZXR1cm5bcituKmwsdStuKnMsaSpNYXRoLmV4cChPYSp0KV19dmFyIHI9blswXSx1PW5bMV0saT1uWzJdLG89dFswXSxhPXRbMV0sYz10WzJdLGw9by1yLHM9YS11LGY9bCpsK3MqcyxoPU1hdGguc3FydChmKSxnPShjKmMtaSppK0lhKmYpLygyKmkqWWEqaCkscD0oYypjLWkqaS1JYSpmKS8oMipjKllhKmgpLHY9TWF0aC5sb2coTWF0aC5zcXJ0KGcqZysxKS1nKSxkPU1hdGgubG9nKE1hdGguc3FydChwKnArMSktcCksbT1kLXYseT0obXx8TWF0aC5sb2coYy9pKSkvT2E7cmV0dXJuIGUuZHVyYXRpb249MWUzKnksZX0sdGEuYmVoYXZpb3Iuem9vbT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7bi5vbih6LHMpLm9uKFhhKyIuem9vbSIsaCkub24oImRibGNsaWNrLnpvb20iLGcpLm9uKFQsZil9ZnVuY3Rpb24gdChuKXtyZXR1cm5bKG5bMF0tay54KS9rLmssKG5bMV0tay55KS9rLmtdfWZ1bmN0aW9uIGUobil7cmV0dXJuW25bMF0qay5rK2sueCxuWzFdKmsuaytrLnldfWZ1bmN0aW9uIHIobil7ay5rPU1hdGgubWF4KEFbMF0sTWF0aC5taW4oQVsxXSxuKSl9ZnVuY3Rpb24gdShuLHQpe3Q9ZSh0KSxrLngrPW5bMF0tdFswXSxrLnkrPW5bMV0tdFsxXX1mdW5jdGlvbiBpKHQsZSxpLG8pe3QuX19jaGFydF9fPXt4OmsueCx5OmsueSxrOmsua30scihNYXRoLnBvdygyLG8pKSx1KHY9ZSxpKSx0PXRhLnNlbGVjdCh0KSxOPjAmJih0PXQudHJhbnNpdGlvbigpLmR1cmF0aW9uKE4pKSx0LmNhbGwobi5ldmVudCl9ZnVuY3Rpb24gbygpe3gmJnguZG9tYWluKE0ucmFuZ2UoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4tay54KS9rLmt9KS5tYXAoTS5pbnZlcnQpKSxTJiZTLmRvbWFpbihfLnJhbmdlKCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybihuLWsueSkvay5rfSkubWFwKF8uaW52ZXJ0KSl9ZnVuY3Rpb24gYShuKXtDKyt8fG4oe3R5cGU6Inpvb21zdGFydCJ9KX1mdW5jdGlvbiBjKG4pe28oKSxuKHt0eXBlOiJ6b29tIixzY2FsZTprLmssdHJhbnNsYXRlOltrLngsay55XX0pfWZ1bmN0aW9uIGwobil7LS1DfHxuKHt0eXBlOiJ6b29tZW5kIn0pLHY9bnVsbH1mdW5jdGlvbiBzKCl7ZnVuY3Rpb24gbigpe3M9MSx1KHRhLm1vdXNlKHIpLGgpLGMobyl9ZnVuY3Rpb24gZSgpe2Yub24ocSxudWxsKS5vbihMLG51bGwpLGcocyYmdGEuZXZlbnQudGFyZ2V0PT09aSksbChvKX12YXIgcj10aGlzLGk9dGEuZXZlbnQudGFyZ2V0LG89Ui5vZihyLGFyZ3VtZW50cykscz0wLGY9dGEuc2VsZWN0KG9hKS5vbihxLG4pLm9uKEwsZSksaD10KHRhLm1vdXNlKHIpKSxnPVgoKTtGbC5jYWxsKHIpLGEobyl9ZnVuY3Rpb24gZigpe2Z1bmN0aW9uIG4oKXt2YXIgbj10YS50b3VjaGVzKHApO3JldHVybiBnPWsuayxuLmZvckVhY2goZnVuY3Rpb24obil7bi5pZGVudGlmaWVyIGluIGQmJihkW24uaWRlbnRpZmllcl09dChuKSl9KSxufWZ1bmN0aW9uIGUoKXt2YXIgdD10YS5ldmVudC50YXJnZXQ7dGEuc2VsZWN0KHQpLm9uKHgsbykub24oXyxoKSx3LnB1c2godCk7Zm9yKHZhciBlPXRhLmV2ZW50LmNoYW5nZWRUb3VjaGVzLHI9MCx1PWUubGVuZ3RoO3U+cjsrK3IpZFtlW3JdLmlkZW50aWZpZXJdPW51bGw7dmFyIGE9bigpLGM9RGF0ZS5ub3coKTtpZigxPT09YS5sZW5ndGgpe2lmKDUwMD5jLXkpe3ZhciBsPWFbMF07aShwLGwsZFtsLmlkZW50aWZpZXJdLE1hdGguZmxvb3IoTWF0aC5sb2coay5rKS9NYXRoLkxOMikrMSksYigpfXk9Y31lbHNlIGlmKGEubGVuZ3RoPjEpe3ZhciBsPWFbMF0scz1hWzFdLGY9bFswXS1zWzBdLGc9bFsxXS1zWzFdO209ZipmK2cqZ319ZnVuY3Rpb24gbygpe3ZhciBuLHQsZSxpLG89dGEudG91Y2hlcyhwKTtGbC5jYWxsKHApO2Zvcih2YXIgYT0wLGw9by5sZW5ndGg7bD5hOysrYSxpPW51bGwpaWYoZT1vW2FdLGk9ZFtlLmlkZW50aWZpZXJdKXtpZih0KWJyZWFrO249ZSx0PWl9aWYoaSl7dmFyIHM9KHM9ZVswXS1uWzBdKSpzKyhzPWVbMV0tblsxXSkqcyxmPW0mJk1hdGguc3FydChzL20pO249WyhuWzBdK2VbMF0pLzIsKG5bMV0rZVsxXSkvMl0sdD1bKHRbMF0raVswXSkvMiwodFsxXStpWzFdKS8yXSxyKGYqZyl9eT1udWxsLHUobix0KSxjKHYpfWZ1bmN0aW9uIGgoKXtpZih0YS5ldmVudC50b3VjaGVzLmxlbmd0aCl7Zm9yKHZhciB0PXRhLmV2ZW50LmNoYW5nZWRUb3VjaGVzLGU9MCxyPXQubGVuZ3RoO3I+ZTsrK2UpZGVsZXRlIGRbdFtlXS5pZGVudGlmaWVyXTtmb3IodmFyIHUgaW4gZClyZXR1cm4gdm9pZCBuKCl9dGEuc2VsZWN0QWxsKHcpLm9uKE0sbnVsbCksUy5vbih6LHMpLm9uKFQsZiksRSgpLGwodil9dmFyIGcscD10aGlzLHY9Ui5vZihwLGFyZ3VtZW50cyksZD17fSxtPTAsTT0iLnpvb20tIit0YS5ldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5pZGVudGlmaWVyLHg9InRvdWNobW92ZSIrTSxfPSJ0b3VjaGVuZCIrTSx3PVtdLFM9dGEuc2VsZWN0KHApLEU9WCgpO2UoKSxhKHYpLFMub24oeixudWxsKS5vbihULGUpfWZ1bmN0aW9uIGgoKXt2YXIgbj1SLm9mKHRoaXMsYXJndW1lbnRzKTttP2NsZWFyVGltZW91dChtKToocD10KHY9ZHx8dGEubW91c2UodGhpcykpLEZsLmNhbGwodGhpcyksYShuKSksbT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bT1udWxsLGwobil9LDUwKSxiKCkscihNYXRoLnBvdygyLC4wMDIqWmEoKSkqay5rKSx1KHYscCksYyhuKX1mdW5jdGlvbiBnKCl7dmFyIG49dGEubW91c2UodGhpcyksZT1NYXRoLmxvZyhrLmspL01hdGguTE4yO2kodGhpcyxuLHQobiksdGEuZXZlbnQuc2hpZnRLZXk/TWF0aC5jZWlsKGUpLTE6TWF0aC5mbG9vcihlKSsxKX12YXIgcCx2LGQsbSx5LE0seCxfLFMsaz17eDowLHk6MCxrOjF9LEU9Wzk2MCw1MDBdLEE9VmEsTj0yNTAsQz0wLHo9Im1vdXNlZG93bi56b29tIixxPSJtb3VzZW1vdmUuem9vbSIsTD0ibW91c2V1cC56b29tIixUPSJ0b3VjaHN0YXJ0Lnpvb20iLFI9dyhuLCJ6b29tc3RhcnQiLCJ6b29tIiwiem9vbWVuZCIpO3JldHVybiBuLmV2ZW50PWZ1bmN0aW9uKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuPVIub2YodGhpcyxhcmd1bWVudHMpLHQ9aztVbD90YS5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goInN0YXJ0Lnpvb20iLGZ1bmN0aW9uKCl7az10aGlzLl9fY2hhcnRfX3x8e3g6MCx5OjAsazoxfSxhKG4pfSkudHdlZW4oInpvb206em9vbSIsZnVuY3Rpb24oKXt2YXIgZT1FWzBdLHI9RVsxXSx1PXY/dlswXTplLzIsaT12P3ZbMV06ci8yLG89dGEuaW50ZXJwb2xhdGVab29tKFsodS1rLngpL2suaywoaS1rLnkpL2suayxlL2sua10sWyh1LXQueCkvdC5rLChpLXQueSkvdC5rLGUvdC5rXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByPW8odCksYT1lL3JbMl07dGhpcy5fX2NoYXJ0X189az17eDp1LXJbMF0qYSx5OmktclsxXSphLGs6YX0sYyhuKX19KS5lYWNoKCJpbnRlcnJ1cHQuem9vbSIsZnVuY3Rpb24oKXtsKG4pfSkuZWFjaCgiZW5kLnpvb20iLGZ1bmN0aW9uKCl7bChuKX0pOih0aGlzLl9fY2hhcnRfXz1rLGEobiksYyhuKSxsKG4pKX0pfSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz17eDordFswXSx5Oit0WzFdLGs6ay5rfSxvKCksbik6W2sueCxrLnldfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhrPXt4OmsueCx5OmsueSxrOit0fSxvKCksbik6ay5rfSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhBPW51bGw9PXQ/VmE6Wyt0WzBdLCt0WzFdXSxuKTpBfSxuLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD10JiZbK3RbMF0sK3RbMV1dLG4pOmR9LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oRT10JiZbK3RbMF0sK3RbMV1dLG4pOkV9LG4uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE49K3Qsbik6Tn0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PXQsTT10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6eH0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhTPXQsXz10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6U30sdGEucmViaW5kKG4sUiwib24iKX07dmFyIFphLFZhPVswLDEvMF0sWGE9Im9ud2hlZWwiaW4gdWE/KFphPWZ1bmN0aW9uKCl7cmV0dXJuLXRhLmV2ZW50LmRlbHRhWSoodGEuZXZlbnQuZGVsdGFNb2RlPzEyMDoxKX0sIndoZWVsIik6Im9ubW91c2V3aGVlbCJpbiB1YT8oWmE9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZXZlbnQud2hlZWxEZWx0YX0sIm1vdXNld2hlZWwiKTooWmE9ZnVuY3Rpb24oKXtyZXR1cm4tdGEuZXZlbnQuZGV0YWlsfSwiTW96TW91c2VQaXhlbFNjcm9sbCIpO3RhLmNvbG9yPWl0LGl0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpKyIifSx0YS5oc2w9b3Q7dmFyICRhPW90LnByb3RvdHlwZT1uZXcgaXQ7JGEuYnJpZ2h0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIG49TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpLG5ldyBvdCh0aGlzLmgsdGhpcy5zLHRoaXMubC9uKX0sJGEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxuZXcgb3QodGhpcy5oLHRoaXMucyxuKnRoaXMubCl9LCRhLnJnYj1mdW5jdGlvbigpe3JldHVybiBhdCh0aGlzLmgsdGhpcy5zLHRoaXMubCl9LHRhLmhjbD1jdDt2YXIgQmE9Y3QucHJvdG90eXBlPW5ldyBpdDtCYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGN0KHRoaXMuaCx0aGlzLmMsTWF0aC5taW4oMTAwLHRoaXMubCtXYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSl9LEJhLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGN0KHRoaXMuaCx0aGlzLmMsTWF0aC5tYXgoMCx0aGlzLmwtV2EqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSkpfSxCYS5yZ2I9ZnVuY3Rpb24oKXtyZXR1cm4gbHQodGhpcy5oLHRoaXMuYyx0aGlzLmwpLnJnYigpfSx0YS5sYWI9c3Q7dmFyIFdhPTE4LEphPS45NTA0NyxHYT0xLEthPTEuMDg4ODMsUWE9c3QucHJvdG90eXBlPW5ldyBpdDtRYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IHN0KE1hdGgubWluKDEwMCx0aGlzLmwrV2EqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSksdGhpcy5hLHRoaXMuYil9LFFhLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IHN0KE1hdGgubWF4KDAsdGhpcy5sLVdhKihhcmd1bWVudHMubGVuZ3RoP246MSkpLHRoaXMuYSx0aGlzLmIpfSxRYS5yZ2I9ZnVuY3Rpb24oKXtyZXR1cm4gZnQodGhpcy5sLHRoaXMuYSx0aGlzLmIpfSx0YS5yZ2I9ZHQ7dmFyIG5jPWR0LnByb3RvdHlwZT1uZXcgaXQ7bmMuYnJpZ2h0ZXI9ZnVuY3Rpb24obil7bj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSk7dmFyIHQ9dGhpcy5yLGU9dGhpcy5nLHI9dGhpcy5iLHU9MzA7cmV0dXJuIHR8fGV8fHI/KHQmJnU+dCYmKHQ9dSksZSYmdT5lJiYoZT11KSxyJiZ1PnImJihyPXUpLG5ldyBkdChNYXRoLm1pbigyNTUsdC9uKSxNYXRoLm1pbigyNTUsZS9uKSxNYXRoLm1pbigyNTUsci9uKSkpOm5ldyBkdCh1LHUsdSl9LG5jLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSksbmV3IGR0KG4qdGhpcy5yLG4qdGhpcy5nLG4qdGhpcy5iKX0sbmMuaHNsPWZ1bmN0aW9uKCl7cmV0dXJuIGJ0KHRoaXMucix0aGlzLmcsdGhpcy5iKX0sbmMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iIyIrTXQodGhpcy5yKStNdCh0aGlzLmcpK010KHRoaXMuYil9O3ZhciB0Yz10YS5tYXAoe2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSk7dGMuZm9yRWFjaChmdW5jdGlvbihuLHQpe3RjLnNldChuLG10KHQpKX0pLHRhLmZ1bmN0b3I9a3QsdGEueGhyPUF0KEV0KSx0YS5kc3Y9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4sZSxpKXthcmd1bWVudHMubGVuZ3RoPDMmJihpPWUsZT1udWxsKTt2YXIgbz1OdChuLHQsbnVsbD09ZT9yOnUoZSksaSk7cmV0dXJuIG8ucm93PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP28ucmVzcG9uc2UobnVsbD09KGU9bik/cjp1KG4pKTplfSxvfWZ1bmN0aW9uIHIobil7cmV0dXJuIGUucGFyc2Uobi5yZXNwb25zZVRleHQpfWZ1bmN0aW9uIHUobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLnBhcnNlKHQucmVzcG9uc2VUZXh0LG4pfX1mdW5jdGlvbiBpKHQpe3JldHVybiB0Lm1hcChvKS5qb2luKG4pfWZ1bmN0aW9uIG8obil7cmV0dXJuIGEudGVzdChuKT8nIicrbi5yZXBsYWNlKC9cIi9nLCciIicpKyciJzpufXZhciBhPW5ldyBSZWdFeHAoJ1siJytuKyJcbl0iKSxjPW4uY2hhckNvZGVBdCgwKTtyZXR1cm4gZS5wYXJzZT1mdW5jdGlvbihuLHQpe3ZhciByO3JldHVybiBlLnBhcnNlUm93cyhuLGZ1bmN0aW9uKG4sZSl7aWYocilyZXR1cm4gcihuLGUtMSk7dmFyIHU9bmV3IEZ1bmN0aW9uKCJkIiwicmV0dXJuIHsiK24ubWFwKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG4pKyI6IGRbIit0KyJdIn0pLmpvaW4oIiwiKSsifSIpO3I9dD9mdW5jdGlvbihuLGUpe3JldHVybiB0KHUobiksZSl9OnV9KX0sZS5wYXJzZVJvd3M9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKCl7aWYocz49bClyZXR1cm4gbztpZih1KXJldHVybiB1PSExLGk7dmFyIHQ9cztpZigzND09PW4uY2hhckNvZGVBdCh0KSl7Zm9yKHZhciBlPXQ7ZSsrPGw7KWlmKDM0PT09bi5jaGFyQ29kZUF0KGUpKXtpZigzNCE9PW4uY2hhckNvZGVBdChlKzEpKWJyZWFrOysrZX1zPWUrMjt2YXIgcj1uLmNoYXJDb2RlQXQoZSsxKTtyZXR1cm4gMTM9PT1yPyh1PSEwLDEwPT09bi5jaGFyQ29kZUF0KGUrMikmJisrcyk6MTA9PT1yJiYodT0hMCksbi5zbGljZSh0KzEsZSkucmVwbGFjZSgvIiIvZywnIicpfWZvcig7bD5zOyl7dmFyIHI9bi5jaGFyQ29kZUF0KHMrKyksYT0xO2lmKDEwPT09cil1PSEwO2Vsc2UgaWYoMTM9PT1yKXU9ITAsMTA9PT1uLmNoYXJDb2RlQXQocykmJigrK3MsKythKTtlbHNlIGlmKHIhPT1jKWNvbnRpbnVlO3JldHVybiBuLnNsaWNlKHQscy1hKX1yZXR1cm4gbi5zbGljZSh0KX1mb3IodmFyIHIsdSxpPXt9LG89e30sYT1bXSxsPW4ubGVuZ3RoLHM9MCxmPTA7KHI9ZSgpKSE9PW87KXtmb3IodmFyIGg9W107ciE9PWkmJnIhPT1vOyloLnB1c2gocikscj1lKCk7dCYmbnVsbD09KGg9dChoLGYrKykpfHxhLnB1c2goaCl9cmV0dXJuIGF9LGUuZm9ybWF0PWZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkodFswXSkpcmV0dXJuIGUuZm9ybWF0Um93cyh0KTt2YXIgcj1uZXcgdix1PVtdO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIG4pci5oYXModCl8fHUucHVzaChyLmFkZCh0KSl9KSxbdS5tYXAobykuam9pbihuKV0uY29uY2F0KHQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB1Lm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbyh0W25dKX0pLmpvaW4obil9KSkuam9pbigiXG4iKX0sZS5mb3JtYXRSb3dzPWZ1bmN0aW9uKG4pe3JldHVybiBuLm1hcChpKS5qb2luKCJcbiIpfSxlfSx0YS5jc3Y9dGEuZHN2KCIsIiwidGV4dC9jc3YiKSx0YS50c3Y9dGEuZHN2KCIJIiwidGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyIpO3ZhciBlYyxyYyx1YyxpYyxvYyxhYz1vYVttKG9hLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiKV18fGZ1bmN0aW9uKG4pe3NldFRpbWVvdXQobiwxNyl9O3RhLnRpbWVyPWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoOzI+ciYmKHQ9MCksMz5yJiYoZT1EYXRlLm5vdygpKTt2YXIgdT1lK3QsaT17YzpuLHQ6dSxmOiExLG46bnVsbH07cmM/cmMubj1pOmVjPWkscmM9aSx1Y3x8KGljPWNsZWFyVGltZW91dChpYyksdWM9MSxhYyhxdCkpfSx0YS50aW1lci5mbHVzaD1mdW5jdGlvbigpe0x0KCksVHQoKX0sdGEucm91bmQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gdD9NYXRoLnJvdW5kKG4qKHQ9TWF0aC5wb3coMTAsdCkpKS90Ok1hdGgucm91bmQobil9O3ZhciBjYz1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIlx4YjUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXS5tYXAoRHQpO3RhLmZvcm1hdFByZWZpeD1mdW5jdGlvbihuLHQpe3ZhciBlPTA7cmV0dXJuIG4mJigwPm4mJihuKj0tMSksdCYmKG49dGEucm91bmQobixSdChuLHQpKSksZT0xK01hdGguZmxvb3IoMWUtMTIrTWF0aC5sb2cobikvTWF0aC5MTjEwKSxlPU1hdGgubWF4KC0yNCxNYXRoLm1pbigyNCwzKk1hdGguZmxvb3IoKGUtMSkvMykpKSksY2NbOCtlLzNdfTt2YXIgbGM9Lyg/OihbXntdKT8oWzw+PV5dKSk/KFsrXC0gXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuLT9cZCspPyhbYS16JV0pPy9pLHNjPXRhLm1hcCh7YjpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygyKX0sYzpmdW5jdGlvbihuKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuKX0sbzpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZyg4KX0seDpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygxNil9LFg6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LGc6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b1ByZWNpc2lvbih0KX0sZTpmdW5jdGlvbihuLHQpe3JldHVybiBuLnRvRXhwb25lbnRpYWwodCl9LGY6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b0ZpeGVkKHQpfSxyOmZ1bmN0aW9uKG4sdCl7cmV0dXJuKG49dGEucm91bmQobixSdChuLHQpKSkudG9GaXhlZChNYXRoLm1heCgwLE1hdGgubWluKDIwLFJ0KG4qKDErMWUtMTUpLHQpKSkpfX0pLGZjPXRhLnRpbWU9e30saGM9RGF0ZTtqdC5wcm90b3R5cGU9e2dldERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0RhdGUoKX0sZ2V0RGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENEYXkoKX0sZ2V0RnVsbFllYXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0Z1bGxZZWFyKCl9LGdldEhvdXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENIb3VycygpfSxnZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ01pbGxpc2Vjb25kcygpfSxnZXRNaW51dGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNaW51dGVzKCl9LGdldE1vbnRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNb250aCgpfSxnZXRTZWNvbmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENTZWNvbmRzKCl9LGdldFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFRpbWUoKX0sZ2V0VGltZXpvbmVPZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8udmFsdWVPZigpfSxzZXREYXRlOmZ1bmN0aW9uKCl7Z2Muc2V0VVRDRGF0ZS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0RGF5OmZ1bmN0aW9uKCl7Z2Muc2V0VVRDRGF5LmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRGdWxsWWVhcjpmdW5jdGlvbigpe2djLnNldFVUQ0Z1bGxZZWFyLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRIb3VyczpmdW5jdGlvbigpe2djLnNldFVUQ0hvdXJzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtnYy5zZXRVVENNaWxsaXNlY29uZHMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldE1pbnV0ZXM6ZnVuY3Rpb24oKXtnYy5zZXRVVENNaW51dGVzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNb250aDpmdW5jdGlvbigpe2djLnNldFVUQ01vbnRoLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRTZWNvbmRzOmZ1bmN0aW9uKCl7Z2Muc2V0VVRDU2Vjb25kcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0VGltZTpmdW5jdGlvbigpe2djLnNldFRpbWUuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9fTt2YXIgZ2M9RGF0ZS5wcm90b3R5cGU7ZmMueWVhcj1GdChmdW5jdGlvbihuKXtyZXR1cm4gbj1mYy5kYXkobiksbi5zZXRNb250aCgwLDEpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEZ1bGxZZWFyKCl9KSxmYy55ZWFycz1mYy55ZWFyLnJhbmdlLGZjLnllYXJzLnV0Yz1mYy55ZWFyLnV0Yy5yYW5nZSxmYy5kYXk9RnQoZnVuY3Rpb24obil7dmFyIHQ9bmV3IGhjKDJlMywwKTtyZXR1cm4gdC5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpKSx0fSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSt0KX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RGF0ZSgpLTF9KSxmYy5kYXlzPWZjLmRheS5yYW5nZSxmYy5kYXlzLnV0Yz1mYy5kYXkudXRjLnJhbmdlLGZjLmRheU9mWWVhcj1mdW5jdGlvbihuKXt2YXIgdD1mYy55ZWFyKG4pO3JldHVybiBNYXRoLmZsb29yKChuLXQtNmU0KihuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSkvODY0ZTUpfSxbInN1bmRheSIsIm1vbmRheSIsInR1ZXNkYXkiLCJ3ZWRuZXNkYXkiLCJ0aHVyc2RheSIsImZyaWRheSIsInNhdHVyZGF5Il0uZm9yRWFjaChmdW5jdGlvbihuLHQpe3Q9Ny10O3ZhciBlPWZjW25dPUZ0KGZ1bmN0aW9uKG4pe3JldHVybihuPWZjLmRheShuKSkuc2V0RGF0ZShuLmdldERhdGUoKS0obi5nZXREYXkoKSt0KSU3KSxufSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSs3Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXt2YXIgZT1mYy55ZWFyKG4pLmdldERheSgpO3JldHVybiBNYXRoLmZsb29yKChmYy5kYXlPZlllYXIobikrKGUrdCklNykvNyktKGUhPT10KX0pO2ZjW24rInMiXT1lLnJhbmdlLGZjW24rInMiXS51dGM9ZS51dGMucmFuZ2UsZmNbbisiT2ZZZWFyIl09ZnVuY3Rpb24obil7dmFyIGU9ZmMueWVhcihuKS5nZXREYXkoKTtyZXR1cm4gTWF0aC5mbG9vcigoZmMuZGF5T2ZZZWFyKG4pKyhlK3QpJTcpLzcpfX0pLGZjLndlZWs9ZmMuc3VuZGF5LGZjLndlZWtzPWZjLnN1bmRheS5yYW5nZSxmYy53ZWVrcy51dGM9ZmMuc3VuZGF5LnV0Yy5yYW5nZSxmYy53ZWVrT2ZZZWFyPWZjLnN1bmRheU9mWWVhcjt2YXIgcGM9eyItIjoiIixfOiIgIiwwOiIwIn0sdmM9L15ccypcZCsvLGRjPS9eJS87dGEubG9jYWxlPWZ1bmN0aW9uKG4pe3JldHVybntudW1iZXJGb3JtYXQ6UHQobiksdGltZUZvcm1hdDpPdChuKX19O3ZhciBtYz10YS5sb2NhbGUoe2RlY2ltYWw6Ii4iLHRob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdLGRhdGVUaW1lOiIlYSAlYiAlZSAlWCAlWSIsZGF0ZToiJW0vJWQvJVkiLHRpbWU6IiVIOiVNOiVTIixwZXJpb2RzOlsiQU0iLCJQTSJdLGRheXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLHNob3J0RGF5czpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG1vbnRoczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc2hvcnRNb250aHM6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXX0pO3RhLmZvcm1hdD1tYy5udW1iZXJGb3JtYXQsdGEuZ2VvPXt9LGNlLnByb3RvdHlwZT17czowLHQ6MCxhZGQ6ZnVuY3Rpb24obil7bGUobix0aGlzLnQseWMpLGxlKHljLnMsdGhpcy5zLHRoaXMpLHRoaXMucz90aGlzLnQrPXljLnQ6dGhpcy5zPXljLnR9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zPXRoaXMudD0wfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc319O3ZhciB5Yz1uZXcgY2U7dGEuZ2VvLnN0cmVhbT1mdW5jdGlvbihuLHQpe24mJk1jLmhhc093blByb3BlcnR5KG4udHlwZSk/TWNbbi50eXBlXShuLHQpOnNlKG4sdCl9O3ZhciBNYz17RmVhdHVyZTpmdW5jdGlvbihuLHQpe3NlKG4uZ2VvbWV0cnksdCl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uZmVhdHVyZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylzZShlW3JdLmdlb21ldHJ5LHQpfX0seGM9e1NwaGVyZTpmdW5jdGlvbihuLHQpe3Quc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKG4sdCl7bj1uLmNvb3JkaW5hdGVzLHQucG9pbnQoblswXSxuWzFdLG5bMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uY29vcmRpbmF0ZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OyluPWVbcl0sdC5wb2ludChuWzBdLG5bMV0sblsyXSkKfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKG4sdCl7ZmUobi5jb29yZGluYXRlcyx0LDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KWZlKGVbcl0sdCwwKX0sUG9seWdvbjpmdW5jdGlvbihuLHQpe2hlKG4uY29vcmRpbmF0ZXMsdCl9LE11bHRpUG9seWdvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmNvb3JkaW5hdGVzLHI9LTEsdT1lLmxlbmd0aDsrK3I8dTspaGUoZVtyXSx0KX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uZ2VvbWV0cmllcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KXNlKGVbcl0sdCl9fTt0YS5nZW8uYXJlYT1mdW5jdGlvbihuKXtyZXR1cm4gYmM9MCx0YS5nZW8uc3RyZWFtKG4sd2MpLGJjfTt2YXIgYmMsX2M9bmV3IGNlLHdjPXtzcGhlcmU6ZnVuY3Rpb24oKXtiYys9NCpEYX0scG9pbnQ6eSxsaW5lU3RhcnQ6eSxsaW5lRW5kOnkscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7X2MucmVzZXQoKSx3Yy5saW5lU3RhcnQ9Z2V9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgbj0yKl9jO2JjKz0wPm4/NCpEYStuOm4sd2MubGluZVN0YXJ0PXdjLmxpbmVFbmQ9d2MucG9pbnQ9eX19O3RhLmdlby5ib3VuZHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sdCl7TS5wdXNoKHg9W3M9bixoPW5dKSxmPnQmJihmPXQpLHQ+ZyYmKGc9dCl9ZnVuY3Rpb24gdCh0LGUpe3ZhciByPXBlKFt0KkZhLGUqRmFdKTtpZihtKXt2YXIgdT1kZShtLHIpLGk9W3VbMV0sLXVbMF0sMF0sbz1kZShpLHUpO01lKG8pLG89eGUobyk7dmFyIGM9dC1wLGw9Yz4wPzE6LTEsdj1vWzBdKkhhKmwsZD12YShjKT4xODA7aWYoZF4odj5sKnAmJmwqdD52KSl7dmFyIHk9b1sxXSpIYTt5PmcmJihnPXkpfWVsc2UgaWYodj0odiszNjApJTM2MC0xODAsZF4odj5sKnAmJmwqdD52KSl7dmFyIHk9LW9bMV0qSGE7Zj55JiYoZj15KX1lbHNlIGY+ZSYmKGY9ZSksZT5nJiYoZz1lKTtkP3A+dD9hKHMsdCk+YShzLGgpJiYoaD10KTphKHQsaCk+YShzLGgpJiYocz10KTpoPj1zPyhzPnQmJihzPXQpLHQ+aCYmKGg9dCkpOnQ+cD9hKHMsdCk+YShzLGgpJiYoaD10KTphKHQsaCk+YShzLGgpJiYocz10KX1lbHNlIG4odCxlKTttPXIscD10fWZ1bmN0aW9uIGUoKXtiLnBvaW50PXR9ZnVuY3Rpb24gcigpe3hbMF09cyx4WzFdPWgsYi5wb2ludD1uLG09bnVsbH1mdW5jdGlvbiB1KG4sZSl7aWYobSl7dmFyIHI9bi1wO3krPXZhKHIpPjE4MD9yKyhyPjA/MzYwOi0zNjApOnJ9ZWxzZSB2PW4sZD1lO3djLnBvaW50KG4sZSksdChuLGUpfWZ1bmN0aW9uIGkoKXt3Yy5saW5lU3RhcnQoKX1mdW5jdGlvbiBvKCl7dSh2LGQpLHdjLmxpbmVFbmQoKSx2YSh5KT5UYSYmKHM9LShoPTE4MCkpLHhbMF09cyx4WzFdPWgsbT1udWxsfWZ1bmN0aW9uIGEobix0KXtyZXR1cm4odC09bik8MD90KzM2MDp0fWZ1bmN0aW9uIGMobix0KXtyZXR1cm4gblswXS10WzBdfWZ1bmN0aW9uIGwobix0KXtyZXR1cm4gdFswXTw9dFsxXT90WzBdPD1uJiZuPD10WzFdOm48dFswXXx8dFsxXTxufXZhciBzLGYsaCxnLHAsdixkLG0seSxNLHgsYj17cG9pbnQ6bixsaW5lU3RhcnQ6ZSxsaW5lRW5kOnIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Yi5wb2ludD11LGIubGluZVN0YXJ0PWksYi5saW5lRW5kPW8seT0wLHdjLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7d2MucG9seWdvbkVuZCgpLGIucG9pbnQ9bixiLmxpbmVTdGFydD1lLGIubGluZUVuZD1yLDA+X2M/KHM9LShoPTE4MCksZj0tKGc9OTApKTp5PlRhP2c9OTA6LVRhPnkmJihmPS05MCkseFswXT1zLHhbMV09aH19O3JldHVybiBmdW5jdGlvbihuKXtnPWg9LShzPWY9MS8wKSxNPVtdLHRhLmdlby5zdHJlYW0obixiKTt2YXIgdD1NLmxlbmd0aDtpZih0KXtNLnNvcnQoYyk7Zm9yKHZhciBlLHI9MSx1PU1bMF0saT1bdV07dD5yOysrcillPU1bcl0sbChlWzBdLHUpfHxsKGVbMV0sdSk/KGEodVswXSxlWzFdKT5hKHVbMF0sdVsxXSkmJih1WzFdPWVbMV0pLGEoZVswXSx1WzFdKT5hKHVbMF0sdVsxXSkmJih1WzBdPWVbMF0pKTppLnB1c2godT1lKTtmb3IodmFyIG8sZSxwPS0xLzAsdD1pLmxlbmd0aC0xLHI9MCx1PWlbdF07dD49cjt1PWUsKytyKWU9aVtyXSwobz1hKHVbMV0sZVswXSkpPnAmJihwPW8scz1lWzBdLGg9dVsxXSl9cmV0dXJuIE09eD1udWxsLDEvMD09PXN8fDEvMD09PWY/W1swLzAsMC8wXSxbMC8wLDAvMF1dOltbcyxmXSxbaCxnXV19fSgpLHRhLmdlby5jZW50cm9pZD1mdW5jdGlvbihuKXtTYz1rYz1FYz1BYz1OYz1DYz16Yz1xYz1MYz1UYz1SYz0wLHRhLmdlby5zdHJlYW0obixEYyk7dmFyIHQ9TGMsZT1UYyxyPVJjLHU9dCp0K2UqZStyKnI7cmV0dXJuIFJhPnUmJih0PUNjLGU9emMscj1xYyxUYT5rYyYmKHQ9RWMsZT1BYyxyPU5jKSx1PXQqdCtlKmUrcipyLFJhPnUpP1swLzAsMC8wXTpbTWF0aC5hdGFuMihlLHQpKkhhLG50KHIvTWF0aC5zcXJ0KHUpKSpIYV19O3ZhciBTYyxrYyxFYyxBYyxOYyxDYyx6YyxxYyxMYyxUYyxSYyxEYz17c3BoZXJlOnkscG9pbnQ6X2UsbGluZVN0YXJ0OlNlLGxpbmVFbmQ6a2UscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7RGMubGluZVN0YXJ0PUVlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7RGMubGluZVN0YXJ0PVNlfX0sUGM9TGUoTmUsUGUsamUsWy1EYSwtRGEvMl0pLFVjPTFlOTt0YS5nZW8uY2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciBuLHQsZSxyLHUsaSxvPXtzdHJlYW06ZnVuY3Rpb24obil7cmV0dXJuIHUmJih1LnZhbGlkPSExKSx1PWkobiksdS52YWxpZD0hMCx1fSxleHRlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9WWUobj0rYVswXVswXSx0PSthWzBdWzFdLGU9K2FbMV1bMF0scj0rYVsxXVsxXSksdSYmKHUudmFsaWQ9ITEsdT1udWxsKSxvKTpbW24sdF0sW2Uscl1dfX07cmV0dXJuIG8uZXh0ZW50KFtbMCwwXSxbOTYwLDUwMF1dKX0sKHRhLmdlby5jb25pY0VxdWFsQXJlYT1mdW5jdGlvbigpe3JldHVybiBJZShaZSl9KS5yYXc9WmUsdGEuZ2VvLmFsYmVycz1mdW5jdGlvbigpe3JldHVybiB0YS5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKX0sdGEuZ2VvLmFsYmVyc1VzYT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7dmFyIGk9blswXSxvPW5bMV07cmV0dXJuIHQ9bnVsbCxlKGksbyksdHx8KHIoaSxvKSx0KXx8dShpLG8pLHR9dmFyIHQsZSxyLHUsaT10YS5nZW8uYWxiZXJzKCksbz10YS5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzE1NCwwXSkuY2VudGVyKFstMiw1OC41XSkucGFyYWxsZWxzKFs1NSw2NV0pLGE9dGEuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTcsMF0pLmNlbnRlcihbLTMsMTkuOV0pLnBhcmFsbGVscyhbOCwxOF0pLGM9e3BvaW50OmZ1bmN0aW9uKG4sZSl7dD1bbixlXX19O3JldHVybiBuLmludmVydD1mdW5jdGlvbihuKXt2YXIgdD1pLnNjYWxlKCksZT1pLnRyYW5zbGF0ZSgpLHI9KG5bMF0tZVswXSkvdCx1PShuWzFdLWVbMV0pL3Q7cmV0dXJuKHU+PS4xMiYmLjIzND51JiZyPj0tLjQyNSYmLS4yMTQ+cj9vOnU+PS4xNjYmJi4yMzQ+dSYmcj49LS4yMTQmJi0uMTE1PnI/YTppKS5pbnZlcnQobil9LG4uc3RyZWFtPWZ1bmN0aW9uKG4pe3ZhciB0PWkuc3RyZWFtKG4pLGU9by5zdHJlYW0obikscj1hLnN0cmVhbShuKTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24obix1KXt0LnBvaW50KG4sdSksZS5wb2ludChuLHUpLHIucG9pbnQobix1KX0sc3BoZXJlOmZ1bmN0aW9uKCl7dC5zcGhlcmUoKSxlLnNwaGVyZSgpLHIuc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCksZS5saW5lU3RhcnQoKSxyLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dC5saW5lRW5kKCksZS5saW5lRW5kKCksci5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3QucG9seWdvblN0YXJ0KCksZS5wb2x5Z29uU3RhcnQoKSxyLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dC5wb2x5Z29uRW5kKCksZS5wb2x5Z29uRW5kKCksci5wb2x5Z29uRW5kKCl9fX0sbi5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkucHJlY2lzaW9uKHQpLG8ucHJlY2lzaW9uKHQpLGEucHJlY2lzaW9uKHQpLG4pOmkucHJlY2lzaW9uKCl9LG4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkuc2NhbGUodCksby5zY2FsZSguMzUqdCksYS5zY2FsZSh0KSxuLnRyYW5zbGF0ZShpLnRyYW5zbGF0ZSgpKSk6aS5zY2FsZSgpfSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gaS50cmFuc2xhdGUoKTt2YXIgbD1pLnNjYWxlKCkscz0rdFswXSxmPSt0WzFdO3JldHVybiBlPWkudHJhbnNsYXRlKHQpLmNsaXBFeHRlbnQoW1tzLS40NTUqbCxmLS4yMzgqbF0sW3MrLjQ1NSpsLGYrLjIzOCpsXV0pLnN0cmVhbShjKS5wb2ludCxyPW8udHJhbnNsYXRlKFtzLS4zMDcqbCxmKy4yMDEqbF0pLmNsaXBFeHRlbnQoW1tzLS40MjUqbCtUYSxmKy4xMipsK1RhXSxbcy0uMjE0KmwtVGEsZisuMjM0KmwtVGFdXSkuc3RyZWFtKGMpLnBvaW50LHU9YS50cmFuc2xhdGUoW3MtLjIwNSpsLGYrLjIxMipsXSkuY2xpcEV4dGVudChbW3MtLjIxNCpsK1RhLGYrLjE2NipsK1RhXSxbcy0uMTE1KmwtVGEsZisuMjM0KmwtVGFdXSkuc3RyZWFtKGMpLnBvaW50LG59LG4uc2NhbGUoMTA3MCl9O3ZhciBqYyxGYyxIYyxPYyxZYyxJYyxaYz17cG9pbnQ6eSxsaW5lU3RhcnQ6eSxsaW5lRW5kOnkscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7RmM9MCxaYy5saW5lU3RhcnQ9VmV9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtaYy5saW5lU3RhcnQ9WmMubGluZUVuZD1aYy5wb2ludD15LGpjKz12YShGYy8yKX19LFZjPXtwb2ludDpYZSxsaW5lU3RhcnQ6eSxsaW5lRW5kOnkscG9seWdvblN0YXJ0OnkscG9seWdvbkVuZDp5fSxYYz17cG9pbnQ6V2UsbGluZVN0YXJ0OkplLGxpbmVFbmQ6R2UscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WGMubGluZVN0YXJ0PUtlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7WGMucG9pbnQ9V2UsWGMubGluZVN0YXJ0PUplLFhjLmxpbmVFbmQ9R2V9fTt0YS5nZW8ucGF0aD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7cmV0dXJuIG4mJigiZnVuY3Rpb24iPT10eXBlb2YgYSYmaS5wb2ludFJhZGl1cygrYS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLG8mJm8udmFsaWR8fChvPXUoaSkpLHRhLmdlby5zdHJlYW0obixvKSksaS5yZXN1bHQoKX1mdW5jdGlvbiB0KCl7cmV0dXJuIG89bnVsbCxufXZhciBlLHIsdSxpLG8sYT00LjU7cmV0dXJuIG4uYXJlYT1mdW5jdGlvbihuKXtyZXR1cm4gamM9MCx0YS5nZW8uc3RyZWFtKG4sdShaYykpLGpjfSxuLmNlbnRyb2lkPWZ1bmN0aW9uKG4pe3JldHVybiBFYz1BYz1OYz1DYz16Yz1xYz1MYz1UYz1SYz0wLHRhLmdlby5zdHJlYW0obix1KFhjKSksUmM/W0xjL1JjLFRjL1JjXTpxYz9bQ2MvcWMsemMvcWNdOk5jP1tFYy9OYyxBYy9OY106WzAvMCwwLzBdfSxuLmJvdW5kcz1mdW5jdGlvbihuKXtyZXR1cm4gWWM9SWM9LShIYz1PYz0xLzApLHRhLmdlby5zdHJlYW0obix1KFZjKSksW1tIYyxPY10sW1ljLEljXV19LG4ucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0oZT1uKT9uLnN0cmVhbXx8dHIobik6RXQsdCgpKTplfSxuLmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09KHI9bik/bmV3ICRlOm5ldyBRZShuKSwiZnVuY3Rpb24iIT10eXBlb2YgYSYmaS5wb2ludFJhZGl1cyhhKSx0KCkpOnJ9LG4ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooaS5wb2ludFJhZGl1cygrdCksK3QpLG4pOmF9LG4ucHJvamVjdGlvbih0YS5nZW8uYWxiZXJzVXNhKCkpLmNvbnRleHQobnVsbCl9LHRhLmdlby50cmFuc2Zvcm09ZnVuY3Rpb24obil7cmV0dXJue3N0cmVhbTpmdW5jdGlvbih0KXt2YXIgZT1uZXcgZXIodCk7Zm9yKHZhciByIGluIG4pZVtyXT1uW3JdO3JldHVybiBlfX19LGVyLnByb3RvdHlwZT17cG9pbnQ6ZnVuY3Rpb24obix0KXt0aGlzLnN0cmVhbS5wb2ludChuLHQpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX0sdGEuZ2VvLnByb2plY3Rpb249dXIsdGEuZ2VvLnByb2plY3Rpb25NdXRhdG9yPWlyLCh0YS5nZW8uZXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKGFyKX0pLnJhdz1hci5pbnZlcnQ9YXIsdGEuZ2VvLnJvdGF0aW9uPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQ9bih0WzBdKkZhLHRbMV0qRmEpLHRbMF0qPUhhLHRbMV0qPUhhLHR9cmV0dXJuIG49bHIoblswXSUzNjAqRmEsblsxXSpGYSxuLmxlbmd0aD4yP25bMl0qRmE6MCksdC5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bi5pbnZlcnQodFswXSpGYSx0WzFdKkZhKSx0WzBdKj1IYSx0WzFdKj1IYSx0fSx0fSxjci5pbnZlcnQ9YXIsdGEuZ2VvLmNpcmNsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyLHQ9bHIoLW5bMF0qRmEsLW5bMV0qRmEsMCkuaW52ZXJ0LHU9W107cmV0dXJuIGUobnVsbCxudWxsLDEse3BvaW50OmZ1bmN0aW9uKG4sZSl7dS5wdXNoKG49dChuLGUpKSxuWzBdKj1IYSxuWzFdKj1IYX19KSx7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3VdfX12YXIgdCxlLHI9WzAsMF0sdT02O3JldHVybiBuLm9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4uYW5nbGU9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9Z3IoKHQ9K3IpKkZhLHUqRmEpLG4pOnR9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWdyKHQqRmEsKHU9K3IpKkZhKSxuKTp1fSxuLmFuZ2xlKDkwKX0sdGEuZ2VvLmRpc3RhbmNlPWZ1bmN0aW9uKG4sdCl7dmFyIGUscj0odFswXS1uWzBdKSpGYSx1PW5bMV0qRmEsaT10WzFdKkZhLG89TWF0aC5zaW4ociksYT1NYXRoLmNvcyhyKSxjPU1hdGguc2luKHUpLGw9TWF0aC5jb3ModSkscz1NYXRoLnNpbihpKSxmPU1hdGguY29zKGkpO3JldHVybiBNYXRoLmF0YW4yKE1hdGguc3FydCgoZT1mKm8pKmUrKGU9bCpzLWMqZiphKSplKSxjKnMrbCpmKmEpfSx0YS5nZW8uZ3JhdGljdWxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnQoKX19ZnVuY3Rpb24gdCgpe3JldHVybiB0YS5yYW5nZShNYXRoLmNlaWwoaS9kKSpkLHUsZCkubWFwKGgpLmNvbmNhdCh0YS5yYW5nZShNYXRoLmNlaWwobC9tKSptLGMsbSkubWFwKGcpKS5jb25jYXQodGEucmFuZ2UoTWF0aC5jZWlsKHIvcCkqcCxlLHApLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gdmEobiVkKT5UYX0pLm1hcChzKSkuY29uY2F0KHRhLnJhbmdlKE1hdGguY2VpbChhL3YpKnYsbyx2KS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIHZhKG4lbSk+VGF9KS5tYXAoZikpfXZhciBlLHIsdSxpLG8sYSxjLGwscyxmLGgsZyxwPTEwLHY9cCxkPTkwLG09MzYwLHk9Mi41O3JldHVybiBuLmxpbmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOm59fSl9LG4ub3V0bGluZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbaChpKS5jb25jYXQoZyhjKS5zbGljZSgxKSxoKHUpLnJldmVyc2UoKS5zbGljZSgxKSxnKGwpLnJldmVyc2UoKS5zbGljZSgxKSldfX0sbi5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvckV4dGVudCh0KS5taW5vckV4dGVudCh0KTpuLm1pbm9yRXh0ZW50KCl9LG4ubWFqb3JFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3RbMF1bMF0sdT0rdFsxXVswXSxsPSt0WzBdWzFdLGM9K3RbMV1bMV0saT51JiYodD1pLGk9dSx1PXQpLGw+YyYmKHQ9bCxsPWMsYz10KSxuLnByZWNpc2lvbih5KSk6W1tpLGxdLFt1LGNdXX0sbi5taW5vckV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdFswXVswXSxlPSt0WzFdWzBdLGE9K3RbMF1bMV0sbz0rdFsxXVsxXSxyPmUmJih0PXIscj1lLGU9dCksYT5vJiYodD1hLGE9byxvPXQpLG4ucHJlY2lzaW9uKHkpKTpbW3IsYV0sW2Usb11dfSxuLnN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvclN0ZXAodCkubWlub3JTdGVwKHQpOm4ubWlub3JTdGVwKCl9LG4ubWFqb3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0WzBdLG09K3RbMV0sbik6W2QsbV19LG4ubWlub3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPSt0WzBdLHY9K3RbMV0sbik6W3Asdl19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PSt0LHM9dnIoYSxvLDkwKSxmPWRyKHIsZSx5KSxoPXZyKGwsYyw5MCksZz1kcihpLHUseSksbik6eX0sbi5tYWpvckV4dGVudChbWy0xODAsLTkwK1RhXSxbMTgwLDkwLVRhXV0pLm1pbm9yRXh0ZW50KFtbLTE4MCwtODAtVGFdLFsxODAsODArVGFdXSl9LHRhLmdlby5ncmVhdEFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6W3R8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpXX19dmFyIHQsZSxyPW1yLHU9eXI7cmV0dXJuIG4uZGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZ2VvLmRpc3RhbmNlKHR8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sbi5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSx0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP251bGw6ZSxuKTpyfSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bnVsbDp0LG4pOnV9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bjowfSxufSx0YS5nZW8uaW50ZXJwb2xhdGU9ZnVuY3Rpb24obix0KXtyZXR1cm4gTXIoblswXSpGYSxuWzFdKkZhLHRbMF0qRmEsdFsxXSpGYSl9LHRhLmdlby5sZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuICRjPTAsdGEuZ2VvLnN0cmVhbShuLEJjKSwkY307dmFyICRjLEJjPXtzcGhlcmU6eSxwb2ludDp5LGxpbmVTdGFydDp4cixsaW5lRW5kOnkscG9seWdvblN0YXJ0OnkscG9seWdvbkVuZDp5fSxXYz1icihmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5zcXJ0KDIvKDErbikpfSxmdW5jdGlvbihuKXtyZXR1cm4gMipNYXRoLmFzaW4obi8yKX0pOyh0YS5nZW8uYXppbXV0aGFsRXF1YWxBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKFdjKX0pLnJhdz1XYzt2YXIgSmM9YnIoZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5hY29zKG4pO3JldHVybiB0JiZ0L01hdGguc2luKHQpfSxFdCk7KHRhLmdlby5hemltdXRoYWxFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiB1cihKYyl9KS5yYXc9SmMsKHRhLmdlby5jb25pY0NvbmZvcm1hbD1mdW5jdGlvbigpe3JldHVybiBJZShfcil9KS5yYXc9X3IsKHRhLmdlby5jb25pY0VxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIEllKHdyKX0pLnJhdz13cjt2YXIgR2M9YnIoZnVuY3Rpb24obil7cmV0dXJuIDEvbn0sTWF0aC5hdGFuKTsodGEuZ2VvLmdub21vbmljPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKEdjKX0pLnJhdz1HYyxTci5pbnZlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm5bbiwyKk1hdGguYXRhbihNYXRoLmV4cCh0KSktamFdfSwodGEuZ2VvLm1lcmNhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIGtyKFNyKX0pLnJhdz1Tcjt2YXIgS2M9YnIoZnVuY3Rpb24oKXtyZXR1cm4gMX0sTWF0aC5hc2luKTsodGEuZ2VvLm9ydGhvZ3JhcGhpYz1mdW5jdGlvbigpe3JldHVybiB1cihLYyl9KS5yYXc9S2M7dmFyIFFjPWJyKGZ1bmN0aW9uKG4pe3JldHVybiAxLygxK24pfSxmdW5jdGlvbihuKXtyZXR1cm4gMipNYXRoLmF0YW4obil9KTsodGEuZ2VvLnN0ZXJlb2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoUWMpfSkucmF3PVFjLEVyLmludmVydD1mdW5jdGlvbihuLHQpe3JldHVyblstdCwyKk1hdGguYXRhbihNYXRoLmV4cChuKSktamFdfSwodGEuZ2VvLnRyYW5zdmVyc2VNZXJjYXRvcj1mdW5jdGlvbigpe3ZhciBuPWtyKEVyKSx0PW4uY2VudGVyLGU9bi5yb3RhdGU7cmV0dXJuIG4uY2VudGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuP3QoWy1uWzFdLG5bMF1dKToobj10KCksW25bMV0sLW5bMF1dKX0sbi5yb3RhdGU9ZnVuY3Rpb24obil7cmV0dXJuIG4/ZShbblswXSxuWzFdLG4ubGVuZ3RoPjI/blsyXSs5MDo5MF0pOihuPWUoKSxbblswXSxuWzFdLG5bMl0tOTBdKX0sZShbMCwwLDkwXSl9KS5yYXc9RXIsdGEuZ2VvbT17fSx0YS5nZW9tLmh1bGw9ZnVuY3Rpb24obil7ZnVuY3Rpb24gdChuKXtpZihuLmxlbmd0aDwzKXJldHVybltdO3ZhciB0LHU9a3QoZSksaT1rdChyKSxvPW4ubGVuZ3RoLGE9W10sYz1bXTtmb3IodD0wO28+dDt0KyspYS5wdXNoKFsrdS5jYWxsKHRoaXMsblt0XSx0KSwraS5jYWxsKHRoaXMsblt0XSx0KSx0XSk7Zm9yKGEuc29ydCh6ciksdD0wO28+dDt0KyspYy5wdXNoKFthW3RdWzBdLC1hW3RdWzFdXSk7dmFyIGw9Q3IoYSkscz1DcihjKSxmPXNbMF09PT1sWzBdLGg9c1tzLmxlbmd0aC0xXT09PWxbbC5sZW5ndGgtMV0sZz1bXTtmb3IodD1sLmxlbmd0aC0xO3Q+PTA7LS10KWcucHVzaChuW2FbbFt0XV1bMl1dKTtmb3IodD0rZjt0PHMubGVuZ3RoLWg7Kyt0KWcucHVzaChuW2Fbc1t0XV1bMl1dKTtyZXR1cm4gZ312YXIgZT1BcixyPU5yO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Qobik6KHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHQpOnJ9LHQpfSx0YS5nZW9tLnBvbHlnb249ZnVuY3Rpb24obil7cmV0dXJuIHhhKG4sbmwpLG59O3ZhciBubD10YS5nZW9tLnBvbHlnb24ucHJvdG90eXBlPVtdO25sLmFyZWE9ZnVuY3Rpb24oKXtmb3IodmFyIG4sdD0tMSxlPXRoaXMubGVuZ3RoLHI9dGhpc1tlLTFdLHU9MDsrK3Q8ZTspbj1yLHI9dGhpc1t0XSx1Kz1uWzFdKnJbMF0tblswXSpyWzFdO3JldHVybi41KnV9LG5sLmNlbnRyb2lkPWZ1bmN0aW9uKG4pe3ZhciB0LGUscj0tMSx1PXRoaXMubGVuZ3RoLGk9MCxvPTAsYT10aGlzW3UtMV07Zm9yKGFyZ3VtZW50cy5sZW5ndGh8fChuPS0xLyg2KnRoaXMuYXJlYSgpKSk7KytyPHU7KXQ9YSxhPXRoaXNbcl0sZT10WzBdKmFbMV0tYVswXSp0WzFdLGkrPSh0WzBdK2FbMF0pKmUsbys9KHRbMV0rYVsxXSkqZTtyZXR1cm5baSpuLG8qbl19LG5sLmNsaXA9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1LGksbyxhPVRyKG4pLGM9LTEsbD10aGlzLmxlbmd0aC1Ucih0aGlzKSxzPXRoaXNbbC0xXTsrK2M8bDspe2Zvcih0PW4uc2xpY2UoKSxuLmxlbmd0aD0wLHU9dGhpc1tjXSxpPXRbKHI9dC5sZW5ndGgtYSktMV0sZT0tMTsrK2U8cjspbz10W2VdLHFyKG8scyx1KT8ocXIoaSxzLHUpfHxuLnB1c2goTHIoaSxvLHMsdSkpLG4ucHVzaChvKSk6cXIoaSxzLHUpJiZuLnB1c2goTHIoaSxvLHMsdSkpLGk9bzthJiZuLnB1c2goblswXSkscz11fXJldHVybiBufTt2YXIgdGwsZWwscmwsdWwsaWwsb2w9W10sYWw9W107T3IucHJvdG90eXBlLnByZXBhcmU9ZnVuY3Rpb24oKXtmb3IodmFyIG4sdD10aGlzLmVkZ2VzLGU9dC5sZW5ndGg7ZS0tOyluPXRbZV0uZWRnZSxuLmImJm4uYXx8dC5zcGxpY2UoZSwxKTtyZXR1cm4gdC5zb3J0KElyKSx0Lmxlbmd0aH0sUXIucHJvdG90eXBlPXtzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2UubD09PXRoaXMuc2l0ZT90aGlzLmVkZ2UuYTp0aGlzLmVkZ2UuYn0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZS5sPT09dGhpcy5zaXRlP3RoaXMuZWRnZS5iOnRoaXMuZWRnZS5hfX0sbnUucHJvdG90eXBlPXtpbnNlcnQ6ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU7aWYobil7aWYodC5QPW4sdC5OPW4uTixuLk4mJihuLk4uUD10KSxuLk49dCxuLlIpe2ZvcihuPW4uUjtuLkw7KW49bi5MO24uTD10fWVsc2Ugbi5SPXQ7ZT1ufWVsc2UgdGhpcy5fPyhuPXV1KHRoaXMuXyksdC5QPW51bGwsdC5OPW4sbi5QPW4uTD10LGU9bik6KHQuUD10Lk49bnVsbCx0aGlzLl89dCxlPW51bGwpO2Zvcih0Lkw9dC5SPW51bGwsdC5VPWUsdC5DPSEwLG49dDtlJiZlLkM7KXI9ZS5VLGU9PT1yLkw/KHU9ci5SLHUmJnUuQz8oZS5DPXUuQz0hMSxyLkM9ITAsbj1yKToobj09PWUuUiYmKGV1KHRoaXMsZSksbj1lLGU9bi5VKSxlLkM9ITEsci5DPSEwLHJ1KHRoaXMscikpKToodT1yLkwsdSYmdS5DPyhlLkM9dS5DPSExLHIuQz0hMCxuPXIpOihuPT09ZS5MJiYocnUodGhpcyxlKSxuPWUsZT1uLlUpLGUuQz0hMSxyLkM9ITAsZXUodGhpcyxyKSkpLGU9bi5VO3RoaXMuXy5DPSExfSxyZW1vdmU6ZnVuY3Rpb24obil7bi5OJiYobi5OLlA9bi5QKSxuLlAmJihuLlAuTj1uLk4pLG4uTj1uLlA9bnVsbDt2YXIgdCxlLHIsdT1uLlUsaT1uLkwsbz1uLlI7aWYoZT1pP28/dXUobyk6aTpvLHU/dS5MPT09bj91Lkw9ZTp1LlI9ZTp0aGlzLl89ZSxpJiZvPyhyPWUuQyxlLkM9bi5DLGUuTD1pLGkuVT1lLGUhPT1vPyh1PWUuVSxlLlU9bi5VLG49ZS5SLHUuTD1uLGUuUj1vLG8uVT1lKTooZS5VPXUsdT1lLG49ZS5SKSk6KHI9bi5DLG49ZSksbiYmKG4uVT11KSwhcil7aWYobiYmbi5DKXJldHVybiBuLkM9ITEsdm9pZCAwO2Rve2lmKG49PT10aGlzLl8pYnJlYWs7aWYobj09PXUuTCl7aWYodD11LlIsdC5DJiYodC5DPSExLHUuQz0hMCxldSh0aGlzLHUpLHQ9dS5SKSx0LkwmJnQuTC5DfHx0LlImJnQuUi5DKXt0LlImJnQuUi5DfHwodC5MLkM9ITEsdC5DPSEwLHJ1KHRoaXMsdCksdD11LlIpLHQuQz11LkMsdS5DPXQuUi5DPSExLGV1KHRoaXMsdSksbj10aGlzLl87YnJlYWt9fWVsc2UgaWYodD11LkwsdC5DJiYodC5DPSExLHUuQz0hMCxydSh0aGlzLHUpLHQ9dS5MKSx0LkwmJnQuTC5DfHx0LlImJnQuUi5DKXt0LkwmJnQuTC5DfHwodC5SLkM9ITEsdC5DPSEwLGV1KHRoaXMsdCksdD11LkwpLHQuQz11LkMsdS5DPXQuTC5DPSExLHJ1KHRoaXMsdSksbj10aGlzLl87YnJlYWt9dC5DPSEwLG49dSx1PXUuVX13aGlsZSghbi5DKTtuJiYobi5DPSExKX19fSx0YS5nZW9tLnZvcm9ub2k9ZnVuY3Rpb24obil7ZnVuY3Rpb24gdChuKXt2YXIgdD1uZXcgQXJyYXkobi5sZW5ndGgpLHI9YVswXVswXSx1PWFbMF1bMV0saT1hWzFdWzBdLG89YVsxXVsxXTtyZXR1cm4gaXUoZShuKSxhKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGUsYSl7dmFyIGM9ZS5lZGdlcyxsPWUuc2l0ZSxzPXRbYV09Yy5sZW5ndGg/Yy5tYXAoZnVuY3Rpb24obil7dmFyIHQ9bi5zdGFydCgpO3JldHVyblt0LngsdC55XX0pOmwueD49ciYmbC54PD1pJiZsLnk+PXUmJmwueTw9bz9bW3Isb10sW2ksb10sW2ksdV0sW3IsdV1dOltdO3MucG9pbnQ9blthXX0pLHR9ZnVuY3Rpb24gZShuKXtyZXR1cm4gbi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm57eDpNYXRoLnJvdW5kKGkobix0KS9UYSkqVGEseTpNYXRoLnJvdW5kKG8obix0KS9UYSkqVGEsaTp0fX0pfXZhciByPUFyLHU9TnIsaT1yLG89dSxhPWNsO3JldHVybiBuP3Qobik6KHQubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIGl1KGUobikpLmVkZ2VzLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gbi5sJiZuLnJ9KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTpuW3QubC5pXSx0YXJnZXQ6blt0LnIuaV19fSl9LHQudHJpYW5nbGVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO3JldHVybiBpdShlKG4pKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGUscil7Zm9yKHZhciB1LGksbz1lLnNpdGUsYT1lLmVkZ2VzLnNvcnQoSXIpLGM9LTEsbD1hLmxlbmd0aCxzPWFbbC0xXS5lZGdlLGY9cy5sPT09bz9zLnI6cy5sOysrYzxsOyl1PXMsaT1mLHM9YVtjXS5lZGdlLGY9cy5sPT09bz9zLnI6cy5sLHI8aS5pJiZyPGYuaSYmYXUobyxpLGYpPDAmJnQucHVzaChbbltyXSxuW2kuaV0sbltmLmldXSl9KSx0fSx0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9a3Qocj1uKSx0KTpyfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89a3QodT1uKSx0KTp1fSx0LmNsaXBFeHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bnVsbD09bj9jbDpuLHQpOmE9PT1jbD9udWxsOmF9LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90LmNsaXBFeHRlbnQobiYmW1swLDBdLG5dKTphPT09Y2w/bnVsbDphJiZhWzFdfSx0KX07dmFyIGNsPVtbLTFlNiwtMWU2XSxbMWU2LDFlNl1dO3RhLmdlb20uZGVsYXVuYXk9ZnVuY3Rpb24obil7cmV0dXJuIHRhLmdlb20udm9yb25vaSgpLnRyaWFuZ2xlcyhuKX0sdGEuZ2VvbS5xdWFkdHJlZT1mdW5jdGlvbihuLHQsZSxyLHUpe2Z1bmN0aW9uIGkobil7ZnVuY3Rpb24gaShuLHQsZSxyLHUsaSxvLGEpe2lmKCFpc05hTihlKSYmIWlzTmFOKHIpKWlmKG4ubGVhZil7dmFyIGM9bi54LHM9bi55O2lmKG51bGwhPWMpaWYodmEoYy1lKSt2YShzLXIpPC4wMSlsKG4sdCxlLHIsdSxpLG8sYSk7ZWxzZXt2YXIgZj1uLnBvaW50O24ueD1uLnk9bi5wb2ludD1udWxsLGwobixmLGMscyx1LGksbyxhKSxsKG4sdCxlLHIsdSxpLG8sYSl9ZWxzZSBuLng9ZSxuLnk9cixuLnBvaW50PXR9ZWxzZSBsKG4sdCxlLHIsdSxpLG8sYSl9ZnVuY3Rpb24gbChuLHQsZSxyLHUsbyxhLGMpe3ZhciBsPS41Kih1K2EpLHM9LjUqKG8rYyksZj1lPj1sLGg9cj49cyxnPWg8PDF8ZjtuLmxlYWY9ITEsbj1uLm5vZGVzW2ddfHwobi5ub2Rlc1tnXT1zdSgpKSxmP3U9bDphPWwsaD9vPXM6Yz1zLGkobix0LGUscix1LG8sYSxjKX12YXIgcyxmLGgsZyxwLHYsZCxtLHksTT1rdChhKSx4PWt0KGMpO2lmKG51bGwhPXQpdj10LGQ9ZSxtPXIseT11O2Vsc2UgaWYobT15PS0odj1kPTEvMCksZj1bXSxoPVtdLHA9bi5sZW5ndGgsbylmb3IoZz0wO3A+ZzsrK2cpcz1uW2ddLHMueDx2JiYodj1zLngpLHMueTxkJiYoZD1zLnkpLHMueD5tJiYobT1zLngpLHMueT55JiYoeT1zLnkpLGYucHVzaChzLngpLGgucHVzaChzLnkpO2Vsc2UgZm9yKGc9MDtwPmc7KytnKXt2YXIgYj0rTShzPW5bZ10sZyksXz0reChzLGcpO3Y+YiYmKHY9YiksZD5fJiYoZD1fKSxiPm0mJihtPWIpLF8+eSYmKHk9XyksZi5wdXNoKGIpLGgucHVzaChfKX12YXIgdz1tLXYsUz15LWQ7dz5TP3k9ZCt3Om09ditTO3ZhciBrPXN1KCk7aWYoay5hZGQ9ZnVuY3Rpb24obil7aShrLG4sK00obiwrK2cpLCt4KG4sZyksdixkLG0seSl9LGsudmlzaXQ9ZnVuY3Rpb24obil7ZnUobixrLHYsZCxtLHkpfSxrLmZpbmQ9ZnVuY3Rpb24obil7cmV0dXJuIGh1KGssblswXSxuWzFdLHYsZCxtLHkpfSxnPS0xLG51bGw9PXQpe2Zvcig7KytnPHA7KWkoayxuW2ddLGZbZ10saFtnXSx2LGQsbSx5KTstLWd9ZWxzZSBuLmZvckVhY2goay5hZGQpO3JldHVybiBmPWg9bj1zPW51bGwsa312YXIgbyxhPUFyLGM9TnI7cmV0dXJuKG89YXJndW1lbnRzLmxlbmd0aCk/KGE9Y3UsYz1sdSwzPT09byYmKHU9ZSxyPXQsZT10PTApLGkobikpOihpLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bixpKTphfSxpLnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9bixpKTpjfSxpLmV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj90PWU9cj11PW51bGw6KHQ9K25bMF1bMF0sZT0rblswXVsxXSxyPStuWzFdWzBdLHU9K25bMV1bMV0pLGkpOm51bGw9PXQ/bnVsbDpbW3QsZV0sW3IsdV1dfSxpLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/dD1lPXI9dT1udWxsOih0PWU9MCxyPStuWzBdLHU9K25bMV0pLGkpOm51bGw9PXQ/bnVsbDpbci10LHUtZV19LGkpfSx0YS5pbnRlcnBvbGF0ZVJnYj1ndSx0YS5pbnRlcnBvbGF0ZU9iamVjdD1wdSx0YS5pbnRlcnBvbGF0ZU51bWJlcj12dSx0YS5pbnRlcnBvbGF0ZVN0cmluZz1kdTt2YXIgbGw9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLHNsPW5ldyBSZWdFeHAobGwuc291cmNlLCJnIik7dGEuaW50ZXJwb2xhdGU9bXUsdGEuaW50ZXJwb2xhdG9ycz1bZnVuY3Rpb24obix0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4oInN0cmluZyI9PT1lP3RjLmhhcyh0KXx8L14oI3xyZ2JcKHxoc2xcKCkvLnRlc3QodCk/Z3U6ZHU6dCBpbnN0YW5jZW9mIGl0P2d1OkFycmF5LmlzQXJyYXkodCk/eXU6Im9iamVjdCI9PT1lJiZpc05hTih0KT9wdTp2dSkobix0KX1dLHRhLmludGVycG9sYXRlQXJyYXk9eXU7dmFyIGZsPWZ1bmN0aW9uKCl7cmV0dXJuIEV0fSxobD10YS5tYXAoe2xpbmVhcjpmbCxwb2x5Omt1LHF1YWQ6ZnVuY3Rpb24oKXtyZXR1cm4gX3V9LGN1YmljOmZ1bmN0aW9uKCl7cmV0dXJuIHd1fSxzaW46ZnVuY3Rpb24oKXtyZXR1cm4gRXV9LGV4cDpmdW5jdGlvbigpe3JldHVybiBBdX0sY2lyY2xlOmZ1bmN0aW9uKCl7cmV0dXJuIE51fSxlbGFzdGljOkN1LGJhY2s6enUsYm91bmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHF1fX0pLGdsPXRhLm1hcCh7ImluIjpFdCxvdXQ6eHUsImluLW91dCI6YnUsIm91dC1pbiI6ZnVuY3Rpb24obil7cmV0dXJuIGJ1KHh1KG4pKX19KTt0YS5lYXNlPWZ1bmN0aW9uKG4pe3ZhciB0PW4uaW5kZXhPZigiLSIpLGU9dD49MD9uLnNsaWNlKDAsdCk6bixyPXQ+PTA/bi5zbGljZSh0KzEpOiJpbiI7cmV0dXJuIGU9aGwuZ2V0KGUpfHxmbCxyPWdsLmdldChyKXx8RXQsTXUocihlLmFwcGx5KG51bGwsZWEuY2FsbChhcmd1bWVudHMsMSkpKSl9LHRhLmludGVycG9sYXRlSGNsPUx1LHRhLmludGVycG9sYXRlSHNsPVR1LHRhLmludGVycG9sYXRlTGFiPVJ1LHRhLmludGVycG9sYXRlUm91bmQ9RHUsdGEudHJhbnNmb3JtPWZ1bmN0aW9uKG4pe3ZhciB0PXVhLmNyZWF0ZUVsZW1lbnROUyh0YS5ucy5wcmVmaXguc3ZnLCJnIik7cmV0dXJuKHRhLnRyYW5zZm9ybT1mdW5jdGlvbihuKXtpZihudWxsIT1uKXt0LnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIixuKTt2YXIgZT10LnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCl9cmV0dXJuIG5ldyBQdShlP2UubWF0cml4OnBsKX0pKG4pfSxQdS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4idHJhbnNsYXRlKCIrdGhpcy50cmFuc2xhdGUrIilyb3RhdGUoIit0aGlzLnJvdGF0ZSsiKXNrZXdYKCIrdGhpcy5za2V3KyIpc2NhbGUoIit0aGlzLnNjYWxlKyIpIn07dmFyIHBsPXthOjEsYjowLGM6MCxkOjEsZTowLGY6MH07dGEuaW50ZXJwb2xhdGVUcmFuc2Zvcm09SHUsdGEubGF5b3V0PXt9LHRhLmxheW91dC5idW5kbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKHZhciB0PVtdLGU9LTEscj1uLmxlbmd0aDsrK2U8cjspdC5wdXNoKEl1KG5bZV0pKTtyZXR1cm4gdH19LHRhLmxheW91dC5jaG9yZD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbixsLGYsaCxnLHA9e30sdj1bXSxkPXRhLnJhbmdlKGkpLG09W107Zm9yKGU9W10scj1bXSxuPTAsaD0tMTsrK2g8aTspe2ZvcihsPTAsZz0tMTsrK2c8aTspbCs9dVtoXVtnXTt2LnB1c2gobCksbS5wdXNoKHRhLnJhbmdlKGkpKSxuKz1sfWZvcihvJiZkLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gbyh2W25dLHZbdF0pfSksYSYmbS5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7bi5zb3J0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIGEodVt0XVtuXSx1W3RdW2VdKX0pfSksbj0oUGEtcyppKS9uLGw9MCxoPS0xOysraDxpOyl7Zm9yKGY9bCxnPS0xOysrZzxpOyl7dmFyIHk9ZFtoXSxNPW1beV1bZ10seD11W3ldW01dLGI9bCxfPWwrPXgqbjtwW3krIi0iK01dPXtpbmRleDp5LHN1YmluZGV4Ok0sc3RhcnRBbmdsZTpiLGVuZEFuZ2xlOl8sdmFsdWU6eH19clt5XT17aW5kZXg6eSxzdGFydEFuZ2xlOmYsZW5kQW5nbGU6bCx2YWx1ZToobC1mKS9ufSxsKz1zfWZvcihoPS0xOysraDxpOylmb3IoZz1oLTE7KytnPGk7KXt2YXIgdz1wW2grIi0iK2ddLFM9cFtnKyItIitoXTsody52YWx1ZXx8Uy52YWx1ZSkmJmUucHVzaCh3LnZhbHVlPFMudmFsdWU/e3NvdXJjZTpTLHRhcmdldDp3fTp7c291cmNlOncsdGFyZ2V0OlN9KX1jJiZ0KCl9ZnVuY3Rpb24gdCgpe2Uuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiBjKChuLnNvdXJjZS52YWx1ZStuLnRhcmdldC52YWx1ZSkvMiwodC5zb3VyY2UudmFsdWUrdC50YXJnZXQudmFsdWUpLzIpfSl9dmFyIGUscix1LGksbyxhLGMsbD17fSxzPTA7cmV0dXJuIGwubWF0cml4PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSh1PW4pJiZ1Lmxlbmd0aCxlPXI9bnVsbCxsKTp1fSxsLnBhZGRpbmc9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bixlPXI9bnVsbCxsKTpzfSxsLnNvcnRHcm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bixlPXI9bnVsbCxsKTpvfSxsLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bixlPW51bGwsbCk6YX0sbC5zb3J0Q2hvcmRzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4sZSYmdCgpLGwpOmN9LGwuY2hvcmRzPWZ1bmN0aW9uKCl7cmV0dXJuIGV8fG4oKSxlfSxsLmdyb3Vwcz1mdW5jdGlvbigpe3JldHVybiByfHxuKCkscn0sbH0sdGEubGF5b3V0LmZvcmNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIsdSl7aWYodC5wb2ludCE9PW4pe3ZhciBpPXQuY3gtbi54LG89dC5jeS1uLnksYT11LWUsYz1pKmkrbypvO2lmKGM+YSphL2Qpe2lmKHA+Yyl7dmFyIGw9dC5jaGFyZ2UvYztuLnB4LT1pKmwsbi5weS09bypsfXJldHVybiEwfWlmKHQucG9pbnQmJmMmJnA+Yyl7dmFyIGw9dC5wb2ludENoYXJnZS9jO24ucHgtPWkqbCxuLnB5LT1vKmx9fXJldHVybiF0LmNoYXJnZX19ZnVuY3Rpb24gdChuKXtuLnB4PXRhLmV2ZW50Lngsbi5weT10YS5ldmVudC55LGEucmVzdW1lKCl9dmFyIGUscix1LGksbyxhPXt9LGM9dGEuZGlzcGF0Y2goInN0YXJ0IiwidGljayIsImVuZCIpLGw9WzEsMV0scz0uOSxmPXZsLGg9ZGwsZz0tMzAscD1tbCx2PS4xLGQ9LjY0LG09W10seT1bXTtyZXR1cm4gYS50aWNrPWZ1bmN0aW9uKCl7aWYoKHIqPS45OSk8LjAwNSlyZXR1cm4gYy5lbmQoe3R5cGU6ImVuZCIsYWxwaGE6cj0wfSksITA7dmFyIHQsZSxhLGYsaCxwLGQsTSx4LGI9bS5sZW5ndGgsXz15Lmxlbmd0aDtmb3IoZT0wO18+ZTsrK2UpYT15W2VdLGY9YS5zb3VyY2UsaD1hLnRhcmdldCxNPWgueC1mLngseD1oLnktZi55LChwPU0qTSt4KngpJiYocD1yKmlbZV0qKChwPU1hdGguc3FydChwKSktdVtlXSkvcCxNKj1wLHgqPXAsaC54LT1NKihkPWYud2VpZ2h0LyhoLndlaWdodCtmLndlaWdodCkpLGgueS09eCpkLGYueCs9TSooZD0xLWQpLGYueSs9eCpkKTtpZigoZD1yKnYpJiYoTT1sWzBdLzIseD1sWzFdLzIsZT0tMSxkKSlmb3IoOysrZTxiOylhPW1bZV0sYS54Kz0oTS1hLngpKmQsYS55Kz0oeC1hLnkpKmQ7aWYoZylmb3IoSnUodD10YS5nZW9tLnF1YWR0cmVlKG0pLHIsbyksZT0tMTsrK2U8YjspKGE9bVtlXSkuZml4ZWR8fHQudmlzaXQobihhKSk7Zm9yKGU9LTE7KytlPGI7KWE9bVtlXSxhLmZpeGVkPyhhLng9YS5weCxhLnk9YS5weSk6KGEueC09KGEucHgtKGEucHg9YS54KSkqcyxhLnktPShhLnB5LShhLnB5PWEueSkpKnMpO2MudGljayh7dHlwZToidGljayIsYWxwaGE6cn0pfSxhLm5vZGVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPW4sYSk6bX0sYS5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT1uLGEpOnl9LGEuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1uLGEpOmx9LGEubGlua0Rpc3RhbmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246K24sYSk6Zn0sYS5kaXN0YW5jZT1hLmxpbmtEaXN0YW5jZSxhLmxpbmtTdHJlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOituLGEpOmh9LGEuZnJpY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K24sYSk6c30sYS5jaGFyZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjorbixhKTpnfSxhLmNoYXJnZURpc3RhbmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPW4qbixhKTpNYXRoLnNxcnQocCl9LGEuZ3Jhdml0eT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj0rbixhKTp2fSxhLnRoZXRhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPW4qbixhKTpNYXRoLnNxcnQoZCl9LGEuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K24scj9yPW4+MD9uOjA6bj4wJiYoYy5zdGFydCh7dHlwZToic3RhcnQiLGFscGhhOnI9bn0pLHRhLnRpbWVyKGEudGljaykpLGEpOnJ9LGEuc3RhcnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4scil7aWYoIWUpe2ZvcihlPW5ldyBBcnJheShjKSxhPTA7Yz5hOysrYSllW2FdPVtdO2ZvcihhPTA7bD5hOysrYSl7dmFyIHU9eVthXTtlW3Uuc291cmNlLmluZGV4XS5wdXNoKHUudGFyZ2V0KSxlW3UudGFyZ2V0LmluZGV4XS5wdXNoKHUuc291cmNlKX19Zm9yKHZhciBpLG89ZVt0XSxhPS0xLGw9by5sZW5ndGg7KythPGw7KWlmKCFpc05hTihpPW9bYV1bbl0pKXJldHVybiBpO3JldHVybiBNYXRoLnJhbmRvbSgpKnJ9dmFyIHQsZSxyLGM9bS5sZW5ndGgscz15Lmxlbmd0aCxwPWxbMF0sdj1sWzFdO2Zvcih0PTA7Yz50OysrdCkocj1tW3RdKS5pbmRleD10LHIud2VpZ2h0PTA7Zm9yKHQ9MDtzPnQ7Kyt0KXI9eVt0XSwibnVtYmVyIj09dHlwZW9mIHIuc291cmNlJiYoci5zb3VyY2U9bVtyLnNvdXJjZV0pLCJudW1iZXIiPT10eXBlb2Ygci50YXJnZXQmJihyLnRhcmdldD1tW3IudGFyZ2V0XSksKytyLnNvdXJjZS53ZWlnaHQsKytyLnRhcmdldC53ZWlnaHQ7Zm9yKHQ9MDtjPnQ7Kyt0KXI9bVt0XSxpc05hTihyLngpJiYoci54PW4oIngiLHApKSxpc05hTihyLnkpJiYoci55PW4oInkiLHYpKSxpc05hTihyLnB4KSYmKHIucHg9ci54KSxpc05hTihyLnB5KSYmKHIucHk9ci55KTtpZih1PVtdLCJmdW5jdGlvbiI9PXR5cGVvZiBmKWZvcih0PTA7cz50OysrdCl1W3RdPStmLmNhbGwodGhpcyx5W3RdLHQpO2Vsc2UgZm9yKHQ9MDtzPnQ7Kyt0KXVbdF09ZjtpZihpPVtdLCJmdW5jdGlvbiI9PXR5cGVvZiBoKWZvcih0PTA7cz50OysrdClpW3RdPStoLmNhbGwodGhpcyx5W3RdLHQpO2Vsc2UgZm9yKHQ9MDtzPnQ7Kyt0KWlbdF09aDtpZihvPVtdLCJmdW5jdGlvbiI9PXR5cGVvZiBnKWZvcih0PTA7Yz50OysrdClvW3RdPStnLmNhbGwodGhpcyxtW3RdLHQpO2Vsc2UgZm9yKHQ9MDtjPnQ7Kyt0KW9bdF09ZztyZXR1cm4gYS5yZXN1bWUoKX0sYS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hbHBoYSguMSl9LGEuc3RvcD1mdW5jdGlvbigpe3JldHVybiBhLmFscGhhKDApfSxhLmRyYWc9ZnVuY3Rpb24oKXtyZXR1cm4gZXx8KGU9dGEuYmVoYXZpb3IuZHJhZygpLm9yaWdpbihFdCkub24oImRyYWdzdGFydC5mb3JjZSIsWHUpLm9uKCJkcmFnLmZvcmNlIix0KS5vbigiZHJhZ2VuZC5mb3JjZSIsJHUpKSxhcmd1bWVudHMubGVuZ3RoPyh0aGlzLm9uKCJtb3VzZW92ZXIuZm9yY2UiLEJ1KS5vbigibW91c2VvdXQuZm9yY2UiLFd1KS5jYWxsKGUpLHZvaWQgMCk6ZX0sdGEucmViaW5kKGEsYywib24iKX07dmFyIHZsPTIwLGRsPTEsbWw9MS8wO3RhLmxheW91dC5oaWVyYXJjaHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHUpe3ZhciBpLG89W3VdLGE9W107Zm9yKHUuZGVwdGg9MDtudWxsIT0oaT1vLnBvcCgpKTspaWYoYS5wdXNoKGkpLChsPWUuY2FsbChuLGksaS5kZXB0aCkpJiYoYz1sLmxlbmd0aCkpe2Zvcih2YXIgYyxsLHM7LS1jPj0wOylvLnB1c2gocz1sW2NdKSxzLnBhcmVudD1pLHMuZGVwdGg9aS5kZXB0aCsxO3ImJihpLnZhbHVlPTApLGkuY2hpbGRyZW49bH1lbHNlIHImJihpLnZhbHVlPStyLmNhbGwobixpLGkuZGVwdGgpfHwwKSxkZWxldGUgaS5jaGlsZHJlbjtyZXR1cm4gUXUodSxmdW5jdGlvbihuKXt2YXIgZSx1O3QmJihlPW4uY2hpbGRyZW4pJiZlLnNvcnQodCksciYmKHU9bi5wYXJlbnQpJiYodS52YWx1ZSs9bi52YWx1ZSl9KSxhfXZhciB0PWVpLGU9bmkscj10aTtyZXR1cm4gbi5zb3J0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi5jaGlsZHJlbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4udmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxuLnJldmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIHImJihLdSh0LGZ1bmN0aW9uKG4pe24uY2hpbGRyZW4mJihuLnZhbHVlPTApfSksUXUodCxmdW5jdGlvbih0KXt2YXIgZTt0LmNoaWxkcmVufHwodC52YWx1ZT0rci5jYWxsKG4sdCx0LmRlcHRoKXx8MCksKGU9dC5wYXJlbnQpJiYoZS52YWx1ZSs9dC52YWx1ZSl9KSksdH0sbn0sdGEubGF5b3V0LnBhcnRpdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCxlLHIsdSl7dmFyIGk9dC5jaGlsZHJlbjtpZih0Lng9ZSx0Lnk9dC5kZXB0aCp1LHQuZHg9cix0LmR5PXUsaSYmKG89aS5sZW5ndGgpKXt2YXIgbyxhLGMsbD0tMTtmb3Iocj10LnZhbHVlP3IvdC52YWx1ZTowOysrbDxvOyluKGE9aVtsXSxlLGM9YS52YWx1ZSpyLHUpLGUrPWN9fWZ1bmN0aW9uIHQobil7dmFyIGU9bi5jaGlsZHJlbixyPTA7aWYoZSYmKHU9ZS5sZW5ndGgpKWZvcih2YXIgdSxpPS0xOysraTx1OylyPU1hdGgubWF4KHIsdChlW2ldKSk7cmV0dXJuIDErcn1mdW5jdGlvbiBlKGUsaSl7dmFyIG89ci5jYWxsKHRoaXMsZSxpKTtyZXR1cm4gbihvWzBdLDAsdVswXSx1WzFdL3Qob1swXSkpLG99dmFyIHI9dGEubGF5b3V0LmhpZXJhcmNoeSgpLHU9WzEsMV07cmV0dXJuIGUuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1uLGUpOnV9LEd1KGUscil9LHRhLmxheW91dC5waWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG8pe3ZhciBhLGM9by5sZW5ndGgsbD1vLm1hcChmdW5jdGlvbihlLHIpe3JldHVybit0LmNhbGwobixlLHIpfSkscz0rKCJmdW5jdGlvbiI9PXR5cGVvZiByP3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOnIpLGY9KCJmdW5jdGlvbiI9PXR5cGVvZiB1P3UuYXBwbHkodGhpcyxhcmd1bWVudHMpOnUpLXMsaD1NYXRoLm1pbihNYXRoLmFicyhmKS9jLCsoImZ1bmN0aW9uIj09dHlwZW9mIGk/aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6aSkpLGc9aCooMD5mPy0xOjEpLHA9KGYtYypnKS90YS5zdW0obCksdj10YS5yYW5nZShjKSxkPVtdO3JldHVybiBudWxsIT1lJiZ2LnNvcnQoZT09PXlsP2Z1bmN0aW9uKG4sdCl7cmV0dXJuIGxbdF0tbFtuXX06ZnVuY3Rpb24obix0KXtyZXR1cm4gZShvW25dLG9bdF0pfSksdi5mb3JFYWNoKGZ1bmN0aW9uKG4pe2Rbbl09e2RhdGE6b1tuXSx2YWx1ZTphPWxbbl0sc3RhcnRBbmdsZTpzLGVuZEFuZ2xlOnMrPWEqcCtnLHBhZEFuZ2xlOmh9fSksZH12YXIgdD1OdW1iZXIsZT15bCxyPTAsdT1QYSxpPTA7cmV0dXJuIG4udmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLnNvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxuLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsbik6dX0sbi5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LG4pOml9LG59O3ZhciB5bD17fTt0YS5sYXlvdXQuc3RhY2s9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGEsYyl7aWYoIShoPWEubGVuZ3RoKSlyZXR1cm4gYTt2YXIgbD1hLm1hcChmdW5jdGlvbihlLHIpe3JldHVybiB0LmNhbGwobixlLHIpfSkscz1sLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm5baS5jYWxsKG4sdCxlKSxvLmNhbGwobix0LGUpXX0pfSksZj1lLmNhbGwobixzLGMpO2w9dGEucGVybXV0ZShsLGYpLHM9dGEucGVybXV0ZShzLGYpO3ZhciBoLGcscCx2LGQ9ci5jYWxsKG4scyxjKSxtPWxbMF0ubGVuZ3RoO2ZvcihwPTA7bT5wOysrcClmb3IodS5jYWxsKG4sbFswXVtwXSx2PWRbcF0sc1swXVtwXVsxXSksZz0xO2g+ZzsrK2cpdS5jYWxsKG4sbFtnXVtwXSx2Kz1zW2ctMV1bcF1bMV0sc1tnXVtwXVsxXSk7cmV0dXJuIGF9dmFyIHQ9RXQsZT1haSxyPWNpLHU9b2ksaT11aSxvPWlpO3JldHVybiBuLnZhbHVlcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4ub3JkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpNbC5nZXQodCl8fGFpLG4pOmV9LG4ub2Zmc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eGwuZ2V0KHQpfHxjaSxuKTpyfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxuKTppfSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCxuKTpvfSxuLm91dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG59O3ZhciBNbD10YS5tYXAoeyJpbnNpZGUtb3V0IjpmdW5jdGlvbihuKXt2YXIgdCxlLHI9bi5sZW5ndGgsdT1uLm1hcChsaSksaT1uLm1hcChzaSksbz10YS5yYW5nZShyKS5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHVbbl0tdVt0XX0pLGE9MCxjPTAsbD1bXSxzPVtdO2Zvcih0PTA7cj50OysrdCllPW9bdF0sYz5hPyhhKz1pW2VdLGwucHVzaChlKSk6KGMrPWlbZV0scy5wdXNoKGUpKTtyZXR1cm4gcy5yZXZlcnNlKCkuY29uY2F0KGwpfSxyZXZlcnNlOmZ1bmN0aW9uKG4pe3JldHVybiB0YS5yYW5nZShuLmxlbmd0aCkucmV2ZXJzZSgpfSwiZGVmYXVsdCI6YWl9KSx4bD10YS5tYXAoe3NpbGhvdWV0dGU6ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9bi5sZW5ndGgsaT1uWzBdLmxlbmd0aCxvPVtdLGE9MCxjPVtdO2ZvcihlPTA7aT5lOysrZSl7Zm9yKHQ9MCxyPTA7dT50O3QrKylyKz1uW3RdW2VdWzFdO3I+YSYmKGE9ciksby5wdXNoKHIpfWZvcihlPTA7aT5lOysrZSljW2VdPShhLW9bZV0pLzI7cmV0dXJuIGN9LHdpZ2dsZTpmdW5jdGlvbihuKXt2YXIgdCxlLHIsdSxpLG8sYSxjLGwscz1uLmxlbmd0aCxmPW5bMF0saD1mLmxlbmd0aCxnPVtdO2ZvcihnWzBdPWM9bD0wLGU9MTtoPmU7KytlKXtmb3IodD0wLHU9MDtzPnQ7Kyt0KXUrPW5bdF1bZV1bMV07Zm9yKHQ9MCxpPTAsYT1mW2VdWzBdLWZbZS0xXVswXTtzPnQ7Kyt0KXtmb3Iocj0wLG89KG5bdF1bZV1bMV0tblt0XVtlLTFdWzFdKS8oMiphKTt0PnI7KytyKW8rPShuW3JdW2VdWzFdLW5bcl1bZS0xXVsxXSkvYTtpKz1vKm5bdF1bZV1bMV19Z1tlXT1jLT11P2kvdSphOjAsbD5jJiYobD1jKX1mb3IoZT0wO2g+ZTsrK2UpZ1tlXS09bDtyZXR1cm4gZ30sZXhwYW5kOmZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PW4ubGVuZ3RoLGk9blswXS5sZW5ndGgsbz0xL3UsYT1bXTtmb3IoZT0wO2k+ZTsrK2Upe2Zvcih0PTAscj0wO3U+dDt0Kyspcis9blt0XVtlXVsxXTtpZihyKWZvcih0PTA7dT50O3QrKyluW3RdW2VdWzFdLz1yO2Vsc2UgZm9yKHQ9MDt1PnQ7dCsrKW5bdF1bZV1bMV09b31mb3IoZT0wO2k+ZTsrK2UpYVtlXT0wO3JldHVybiBhfSx6ZXJvOmNpfSk7dGEubGF5b3V0Lmhpc3RvZ3JhbT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixpKXtmb3IodmFyIG8sYSxjPVtdLGw9bi5tYXAoZSx0aGlzKSxzPXIuY2FsbCh0aGlzLGwsaSksZj11LmNhbGwodGhpcyxzLGwsaSksaT0tMSxoPWwubGVuZ3RoLGc9Zi5sZW5ndGgtMSxwPXQ/MToxL2g7KytpPGc7KW89Y1tpXT1bXSxvLmR4PWZbaSsxXS0oby54PWZbaV0pLG8ueT0wO2lmKGc+MClmb3IoaT0tMTsrK2k8aDspYT1sW2ldLGE+PXNbMF0mJmE8PXNbMV0mJihvPWNbdGEuYmlzZWN0KGYsYSwxLGcpLTFdLG8ueSs9cCxvLnB1c2gobltpXSkpO3JldHVybiBjfXZhciB0PSEwLGU9TnVtYmVyLHI9cGksdT1oaTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9a3QodCksbik6cn0sbi5iaW5zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbihuKXtyZXR1cm4gZ2kobix0KX06a3QodCksbik6dX0sbi5mcmVxdWVuY3k9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ISFlLG4pOnR9LG59LHRhLmxheW91dC5wYWNrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGkpe3ZhciBvPWUuY2FsbCh0aGlzLG4saSksYT1vWzBdLGM9dVswXSxsPXVbMV0scz1udWxsPT10P01hdGguc3FydDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O2lmKGEueD1hLnk9MCxRdShhLGZ1bmN0aW9uKG4pe24ucj0rcyhuLnZhbHVlKX0pLFF1KGEsTWkpLHIpe3ZhciBmPXIqKHQ/MTpNYXRoLm1heCgyKmEuci9jLDIqYS5yL2wpKS8yO1F1KGEsZnVuY3Rpb24obil7bi5yKz1mfSksUXUoYSxNaSksUXUoYSxmdW5jdGlvbihuKXtuLnItPWZ9KX1yZXR1cm4gX2koYSxjLzIsbC8yLHQ/MToxL01hdGgubWF4KDIqYS5yL2MsMiphLnIvbCkpLG99dmFyIHQsZT10YS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydCh2aSkscj0wLHU9WzEsMV07cmV0dXJuIG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG4ucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PWV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6K2Usbik6dH0sbi5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LG4pOnJ9LEd1KG4sZSl9LHRhLmxheW91dC50cmVlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBzPW8uY2FsbCh0aGlzLG4sdSksZj1zWzBdLGg9dChmKTtpZihRdShoLGUpLGgucGFyZW50Lm09LWgueixLdShoLHIpLGwpS3UoZixpKTtlbHNle3ZhciBnPWYscD1mLHY9ZjtLdShmLGZ1bmN0aW9uKG4pe24ueDxnLngmJihnPW4pLG4ueD5wLngmJihwPW4pLG4uZGVwdGg+di5kZXB0aCYmKHY9bil9KTt2YXIgZD1hKGcscCkvMi1nLngsbT1jWzBdLyhwLngrYShwLGcpLzIrZCkseT1jWzFdLyh2LmRlcHRofHwxKTtLdShmLGZ1bmN0aW9uKG4pe24ueD0obi54K2QpKm0sbi55PW4uZGVwdGgqeX0pfXJldHVybiBzfWZ1bmN0aW9uIHQobil7Zm9yKHZhciB0LGU9e0E6bnVsbCxjaGlsZHJlbjpbbl19LHI9W2VdO251bGwhPSh0PXIucG9wKCkpOylmb3IodmFyIHUsaT10LmNoaWxkcmVuLG89MCxhPWkubGVuZ3RoO2E+bzsrK28pci5wdXNoKChpW29dPXU9e186aVtvXSxwYXJlbnQ6dCxjaGlsZHJlbjoodT1pW29dLmNoaWxkcmVuKSYmdS5zbGljZSgpfHxbXSxBOm51bGwsYTpudWxsLHo6MCxtOjAsYzowLHM6MCx0Om51bGwsaTpvfSkuYT11KTtyZXR1cm4gZS5jaGlsZHJlblswXX1mdW5jdGlvbiBlKG4pe3ZhciB0PW4uY2hpbGRyZW4sZT1uLnBhcmVudC5jaGlsZHJlbixyPW4uaT9lW24uaS0xXTpudWxsO2lmKHQubGVuZ3RoKXtOaShuKTt2YXIgaT0odFswXS56K3RbdC5sZW5ndGgtMV0ueikvMjtyPyhuLno9ci56K2Eobi5fLHIuXyksbi5tPW4uei1pKTpuLno9aX1lbHNlIHImJihuLno9ci56K2Eobi5fLHIuXykpO24ucGFyZW50LkE9dShuLHIsbi5wYXJlbnQuQXx8ZVswXSl9ZnVuY3Rpb24gcihuKXtuLl8ueD1uLnorbi5wYXJlbnQubSxuLm0rPW4ucGFyZW50Lm19ZnVuY3Rpb24gdShuLHQsZSl7aWYodCl7Zm9yKHZhciByLHU9bixpPW4sbz10LGM9dS5wYXJlbnQuY2hpbGRyZW5bMF0sbD11Lm0scz1pLm0sZj1vLm0saD1jLm07bz1FaShvKSx1PWtpKHUpLG8mJnU7KWM9a2koYyksaT1FaShpKSxpLmE9bixyPW8ueitmLXUuei1sK2Eoby5fLHUuXykscj4wJiYoQWkoQ2kobyxuLGUpLG4sciksbCs9cixzKz1yKSxmKz1vLm0sbCs9dS5tLGgrPWMubSxzKz1pLm07byYmIUVpKGkpJiYoaS50PW8saS5tKz1mLXMpLHUmJiFraShjKSYmKGMudD11LGMubSs9bC1oLGU9bil9cmV0dXJuIGV9ZnVuY3Rpb24gaShuKXtuLngqPWNbMF0sbi55PW4uZGVwdGgqY1sxXX12YXIgbz10YS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxhPVNpLGM9WzEsMV0sbD1udWxsO3JldHVybiBuLnNlcGFyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxuKTphfSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bnVsbD09KGM9dCk/aTpudWxsLG4pOmw/bnVsbDpjfSxuLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW51bGw9PShjPXQpP251bGw6aSxuKTpsP2M6bnVsbH0sR3UobixvKX0sdGEubGF5b3V0LmNsdXN0ZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4saSl7dmFyIG8sYT10LmNhbGwodGhpcyxuLGkpLGM9YVswXSxsPTA7UXUoYyxmdW5jdGlvbihuKXt2YXIgdD1uLmNoaWxkcmVuO3QmJnQubGVuZ3RoPyhuLng9cWkodCksbi55PXppKHQpKToobi54PW8/bCs9ZShuLG8pOjAsbi55PTAsbz1uKX0pO3ZhciBzPUxpKGMpLGY9VGkoYyksaD1zLngtZShzLGYpLzIsZz1mLngrZShmLHMpLzI7cmV0dXJuIFF1KGMsdT9mdW5jdGlvbihuKXtuLng9KG4ueC1jLngpKnJbMF0sbi55PShjLnktbi55KSpyWzFdfTpmdW5jdGlvbihuKXtuLng9KG4ueC1oKS8oZy1oKSpyWzBdLG4ueT0oMS0oYy55P24ueS9jLnk6MSkpKnJbMV19KSxhfXZhciB0PXRhLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLGU9U2kscj1bMSwxXSx1PSExO3JldHVybiBuLnNlcGFyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbD09KHI9dCksbik6dT9udWxsOnJ9LG4ubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbCE9KHI9dCksbik6dT9yOm51bGx9LEd1KG4sdCl9LHRhLmxheW91dC50cmVlbWFwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe2Zvcih2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDsrK3U8aTspcj0oZT1uW3VdKS52YWx1ZSooMD50PzA6dCksZS5hcmVhPWlzTmFOKHIpfHwwPj1yPzA6cn1mdW5jdGlvbiB0KGUpe3ZhciBpPWUuY2hpbGRyZW47aWYoaSYmaS5sZW5ndGgpe3ZhciBvLGEsYyxsPWYoZSkscz1bXSxoPWkuc2xpY2UoKSxwPTEvMCx2PSJzbGljZSI9PT1nP2wuZHg6ImRpY2UiPT09Zz9sLmR5OiJzbGljZS1kaWNlIj09PWc/MSZlLmRlcHRoP2wuZHk6bC5keDpNYXRoLm1pbihsLmR4LGwuZHkpO2ZvcihuKGgsbC5keCpsLmR5L2UudmFsdWUpLHMuYXJlYT0wOyhjPWgubGVuZ3RoKT4wOylzLnB1c2gobz1oW2MtMV0pLHMuYXJlYSs9by5hcmVhLCJzcXVhcmlmeSIhPT1nfHwoYT1yKHMsdikpPD1wPyhoLnBvcCgpLHA9YSk6KHMuYXJlYS09cy5wb3AoKS5hcmVhLHUocyx2LGwsITEpLHY9TWF0aC5taW4obC5keCxsLmR5KSxzLmxlbmd0aD1zLmFyZWE9MCxwPTEvMCk7cy5sZW5ndGgmJih1KHMsdixsLCEwKSxzLmxlbmd0aD1zLmFyZWE9MCksaS5mb3JFYWNoKHQpfX1mdW5jdGlvbiBlKHQpe3ZhciByPXQuY2hpbGRyZW47aWYociYmci5sZW5ndGgpe3ZhciBpLG89Zih0KSxhPXIuc2xpY2UoKSxjPVtdO2ZvcihuKGEsby5keCpvLmR5L3QudmFsdWUpLGMuYXJlYT0wO2k9YS5wb3AoKTspYy5wdXNoKGkpLGMuYXJlYSs9aS5hcmVhLG51bGwhPWkueiYmKHUoYyxpLno/by5keDpvLmR5LG8sIWEubGVuZ3RoKSxjLmxlbmd0aD1jLmFyZWE9MCk7ci5mb3JFYWNoKGUpfX1mdW5jdGlvbiByKG4sdCl7Zm9yKHZhciBlLHI9bi5hcmVhLHU9MCxpPTEvMCxvPS0xLGE9bi5sZW5ndGg7KytvPGE7KShlPW5bb10uYXJlYSkmJihpPmUmJihpPWUpLGU+dSYmKHU9ZSkpO3JldHVybiByKj1yLHQqPXQscj9NYXRoLm1heCh0KnUqcC9yLHIvKHQqaSpwKSk6MS8wfWZ1bmN0aW9uIHUobix0LGUscil7dmFyIHUsaT0tMSxvPW4ubGVuZ3RoLGE9ZS54LGw9ZS55LHM9dD9jKG4uYXJlYS90KTowO2lmKHQ9PWUuZHgpe2Zvcigocnx8cz5lLmR5KSYmKHM9ZS5keSk7KytpPG87KXU9bltpXSx1Lng9YSx1Lnk9bCx1LmR5PXMsYSs9dS5keD1NYXRoLm1pbihlLngrZS5keC1hLHM/Yyh1LmFyZWEvcyk6MCk7dS56PSEwLHUuZHgrPWUueCtlLmR4LWEsZS55Kz1zLGUuZHktPXN9ZWxzZXtmb3IoKHJ8fHM+ZS5keCkmJihzPWUuZHgpOysraTxvOyl1PW5baV0sdS54PWEsdS55PWwsdS5keD1zLGwrPXUuZHk9TWF0aC5taW4oZS55K2UuZHktbCxzP2ModS5hcmVhL3MpOjApO3Uuej0hMSx1LmR5Kz1lLnkrZS5keS1sLGUueCs9cyxlLmR4LT1zfX1mdW5jdGlvbiBpKHIpe3ZhciB1PW98fGEociksaT11WzBdO3JldHVybiBpLng9MCxpLnk9MCxpLmR4PWxbMF0saS5keT1sWzFdLG8mJmEucmV2YWx1ZShpKSxuKFtpXSxpLmR4KmkuZHkvaS52YWx1ZSksKG8/ZTp0KShpKSxoJiYobz11KSx1fXZhciBvLGE9dGEubGF5b3V0LmhpZXJhcmNoeSgpLGM9TWF0aC5yb3VuZCxsPVsxLDFdLHM9bnVsbCxmPVJpLGg9ITEsZz0ic3F1YXJpZnkiLHA9LjUqKDErTWF0aC5zcXJ0KDUpKTtyZXR1cm4gaS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5wYWRkaW5nPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQodCl7dmFyIGU9bi5jYWxsKGksdCx0LmRlcHRoKTtyZXR1cm4gbnVsbD09ZT9SaSh0KTpEaSh0LCJudW1iZXIiPT10eXBlb2YgZT9bZSxlLGUsZV06ZSl9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gRGkodCxuKX1pZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gczt2YXIgcjtyZXR1cm4gZj1udWxsPT0ocz1uKT9SaToiZnVuY3Rpb24iPT0ocj10eXBlb2Ygbik/dDoibnVtYmVyIj09PXI/KG49W24sbixuLG5dLGUpOmUsaX0saS5yb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uP01hdGgucm91bmQ6TnVtYmVyLGkpOmMhPU51bWJlcn0saS5zdGlja3k9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9bixvPW51bGwsaSk6aAp9LGkucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9bixpKTpwfSxpLm1vZGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9bisiIixpKTpnfSxHdShpLGEpfSx0YS5yYW5kb209e25vcm1hbDpmdW5jdGlvbihuLHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIDI+ZSYmKHQ9MSksMT5lJiYobj0wKSxmdW5jdGlvbigpe3ZhciBlLHIsdTtkbyBlPTIqTWF0aC5yYW5kb20oKS0xLHI9MipNYXRoLnJhbmRvbSgpLTEsdT1lKmUrcipyO3doaWxlKCF1fHx1PjEpO3JldHVybiBuK3QqZSpNYXRoLnNxcnQoLTIqTWF0aC5sb2codSkvdSl9fSxsb2dOb3JtYWw6ZnVuY3Rpb24oKXt2YXIgbj10YS5yYW5kb20ubm9ybWFsLmFwcGx5KHRhLGFyZ3VtZW50cyk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZXhwKG4oKSl9fSxiYXRlczpmdW5jdGlvbihuKXt2YXIgdD10YS5yYW5kb20uaXJ3aW5IYWxsKG4pO3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KCkvbn19LGlyd2luSGFsbDpmdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTA7bj5lO2UrKyl0Kz1NYXRoLnJhbmRvbSgpO3JldHVybiB0fX19LHRhLnNjYWxlPXt9O3ZhciBibD17Zmxvb3I6RXQsY2VpbDpFdH07dGEuc2NhbGUubGluZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIFlpKFswLDFdLFswLDFdLG11LCExKX07dmFyIF9sPXtzOjEsZzoxLHA6MSxyOjEsZToxfTt0YS5zY2FsZS5sb2c9ZnVuY3Rpb24oKXtyZXR1cm4gSmkodGEuc2NhbGUubGluZWFyKCkuZG9tYWluKFswLDFdKSwxMCwhMCxbMSwxMF0pfTt2YXIgd2w9dGEuZm9ybWF0KCIuMGUiKSxTbD17Zmxvb3I6ZnVuY3Rpb24obil7cmV0dXJuLU1hdGguY2VpbCgtbil9LGNlaWw6ZnVuY3Rpb24obil7cmV0dXJuLU1hdGguZmxvb3IoLW4pfX07dGEuc2NhbGUucG93PWZ1bmN0aW9uKCl7cmV0dXJuIEdpKHRhLnNjYWxlLmxpbmVhcigpLDEsWzAsMV0pfSx0YS5zY2FsZS5zcXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLnBvdygpLmV4cG9uZW50KC41KX0sdGEuc2NhbGUub3JkaW5hbD1mdW5jdGlvbigpe3JldHVybiBRaShbXSx7dDoicmFuZ2UiLGE6W1tdXX0pfSx0YS5zY2FsZS5jYXRlZ29yeTEwPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLm9yZGluYWwoKS5yYW5nZShrbCl9LHRhLnNjYWxlLmNhdGVnb3J5MjA9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKEVsKX0sdGEuc2NhbGUuY2F0ZWdvcnkyMGI9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKEFsKX0sdGEuc2NhbGUuY2F0ZWdvcnkyMGM9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKE5sKX07dmFyIGtsPVsyMDYyMjYwLDE2NzQ0MjA2LDI5MjQ1ODgsMTQwMzQ3MjgsOTcyNTg4NSw5MTk3MTMxLDE0OTA3MzMwLDgzNTU3MTEsMTIzNjkxODYsMTU1NjE3NV0ubWFwKHl0KSxFbD1bMjA2MjI2MCwxMTQ1NDQ0MCwxNjc0NDIwNiwxNjc1OTY3MiwyOTI0NTg4LDEwMDE4Njk4LDE0MDM0NzI4LDE2NzUwNzQyLDk3MjU4ODUsMTI5NTU4NjEsOTE5NzEzMSwxMjg4NTE0MCwxNDkwNzMzMCwxNjIzNDE5NCw4MzU1NzExLDEzMDkyODA3LDEyMzY5MTg2LDE0NDA4NTg5LDE1NTYxNzUsMTA0MTA3MjVdLm1hcCh5dCksQWw9WzM3NTA3NzcsNTM5NTYxOSw3MDQwNzE5LDEwMjY0Mjg2LDY1MTkwOTcsOTIxNjU5NCwxMTkxNTExNSwxMzU1NjYzNiw5MjAyOTkzLDEyNDI2ODA5LDE1MTg2NTE0LDE1MTkwOTMyLDg2NjYxNjksMTEzNTY0OTAsMTQwNDk2NDMsMTUxNzczNzIsODA3NzY4MywxMDgzNDMyNCwxMzUyODUwOSwxNDU4OTY1NF0ubWFwKHl0KSxObD1bMzI0NDczMyw3MDU3MTEwLDEwNDA2NjI1LDEzMDMyNDMxLDE1MDk1MDUzLDE2NjE2NzY0LDE2NjI1MjU5LDE2NjM0MDE4LDMyNTMwNzYsNzY1MjQ3MCwxMDYwNzAwMywxMzEwMTUwNCw3Njk1MjgxLDEwMzk0MzEyLDEyMzY5MzcyLDE0MzQyODkxLDY1MTM1MDcsOTg2ODk1MCwxMjQzNDg3NywxNDI3NzA4MV0ubWFwKHl0KTt0YS5zY2FsZS5xdWFudGlsZT1mdW5jdGlvbigpe3JldHVybiBubyhbXSxbXSl9LHRhLnNjYWxlLnF1YW50aXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRvKDAsMSxbMCwxXSl9LHRhLnNjYWxlLnRocmVzaG9sZD1mdW5jdGlvbigpe3JldHVybiBlbyhbLjVdLFswLDFdKX0sdGEuc2NhbGUuaWRlbnRpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gcm8oWzAsMV0pfSx0YS5zdmc9e30sdGEuc3ZnLmFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbj1NYXRoLm1heCgwLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksbD1NYXRoLm1heCgwLCtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkscz1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1qYSxmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLWphLGg9TWF0aC5hYnMoZi1zKSxnPXM+Zj8wOjE7aWYobj5sJiYocD1sLGw9bixuPXApLGg+PVVhKXJldHVybiB0KGwsZykrKG4/dChuLDEtZyk6IiIpKyJaIjt2YXIgcCx2LGQsbSx5LE0seCxiLF8sdyxTLGssRT0wLEE9MCxOPVtdO2lmKChtPSgrYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fDApLzIpJiYoZD1pPT09Q2w/TWF0aC5zcXJ0KG4qbitsKmwpOitpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxnfHwoQSo9LTEpLGwmJihBPW50KGQvbCpNYXRoLnNpbihtKSkpLG4mJihFPW50KGQvbipNYXRoLnNpbihtKSkpKSxsKXt5PWwqTWF0aC5jb3MocytBKSxNPWwqTWF0aC5zaW4ocytBKSx4PWwqTWF0aC5jb3MoZi1BKSxiPWwqTWF0aC5zaW4oZi1BKTt2YXIgQz1NYXRoLmFicyhmLXMtMipBKTw9RGE/MDoxO2lmKEEmJnNvKHksTSx4LGIpPT09Z15DKXt2YXIgej0ocytmKS8yO3k9bCpNYXRoLmNvcyh6KSxNPWwqTWF0aC5zaW4oeikseD1iPW51bGx9fWVsc2UgeT1NPTA7aWYobil7Xz1uKk1hdGguY29zKGYtRSksdz1uKk1hdGguc2luKGYtRSksUz1uKk1hdGguY29zKHMrRSksaz1uKk1hdGguc2luKHMrRSk7dmFyIHE9TWF0aC5hYnMocy1mKzIqRSk8PURhPzA6MTtpZihFJiZzbyhfLHcsUyxrKT09PTEtZ15xKXt2YXIgTD0ocytmKS8yO189bipNYXRoLmNvcyhMKSx3PW4qTWF0aC5zaW4oTCksUz1rPW51bGx9fWVsc2UgXz13PTA7aWYoKHA9TWF0aC5taW4oTWF0aC5hYnMobC1uKS8yLCt1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkpPi4wMDEpe3Y9bD5uXmc/MDoxO3ZhciBUPW51bGw9PVM/W18sd106bnVsbD09eD9beSxNXTpMcihbeSxNXSxbUyxrXSxbeCxiXSxbXyx3XSksUj15LVRbMF0sRD1NLVRbMV0sUD14LVRbMF0sVT1iLVRbMV0saj0xL01hdGguc2luKE1hdGguYWNvcygoUipQK0QqVSkvKE1hdGguc3FydChSKlIrRCpEKSpNYXRoLnNxcnQoUCpQK1UqVSkpKS8yKSxGPU1hdGguc3FydChUWzBdKlRbMF0rVFsxXSpUWzFdKTtpZihudWxsIT14KXt2YXIgSD1NYXRoLm1pbihwLChsLUYpLyhqKzEpKSxPPWZvKG51bGw9PVM/W18sd106W1Msa10sW3ksTV0sbCxILGcpLFk9Zm8oW3gsYl0sW18sd10sbCxILGcpO3A9PT1IP04ucHVzaCgiTSIsT1swXSwiQSIsSCwiLCIsSCwiIDAgMCwiLHYsIiAiLE9bMV0sIkEiLGwsIiwiLGwsIiAwICIsMS1nXnNvKE9bMV1bMF0sT1sxXVsxXSxZWzFdWzBdLFlbMV1bMV0pLCIsIixnLCIgIixZWzFdLCJBIixILCIsIixILCIgMCAwLCIsdiwiICIsWVswXSk6Ti5wdXNoKCJNIixPWzBdLCJBIixILCIsIixILCIgMCAxLCIsdiwiICIsWVswXSl9ZWxzZSBOLnB1c2goIk0iLHksIiwiLE0pO2lmKG51bGwhPVMpe3ZhciBJPU1hdGgubWluKHAsKG4tRikvKGotMSkpLFo9Zm8oW3ksTV0sW1Msa10sbiwtSSxnKSxWPWZvKFtfLHddLG51bGw9PXg/W3ksTV06W3gsYl0sbiwtSSxnKTtwPT09ST9OLnB1c2goIkwiLFZbMF0sIkEiLEksIiwiLEksIiAwIDAsIix2LCIgIixWWzFdLCJBIixuLCIsIixuLCIgMCAiLGdec28oVlsxXVswXSxWWzFdWzFdLFpbMV1bMF0sWlsxXVsxXSksIiwiLDEtZywiICIsWlsxXSwiQSIsSSwiLCIsSSwiIDAgMCwiLHYsIiAiLFpbMF0pOk4ucHVzaCgiTCIsVlswXSwiQSIsSSwiLCIsSSwiIDAgMCwiLHYsIiAiLFpbMF0pfWVsc2UgTi5wdXNoKCJMIixfLCIsIix3KX1lbHNlIE4ucHVzaCgiTSIseSwiLCIsTSksbnVsbCE9eCYmTi5wdXNoKCJBIixsLCIsIixsLCIgMCAiLEMsIiwiLGcsIiAiLHgsIiwiLGIpLE4ucHVzaCgiTCIsXywiLCIsdyksbnVsbCE9UyYmTi5wdXNoKCJBIixuLCIsIixuLCIgMCAiLHEsIiwiLDEtZywiICIsUywiLCIsayk7cmV0dXJuIE4ucHVzaCgiWiIpLE4uam9pbigiIil9ZnVuY3Rpb24gdChuLHQpe3JldHVybiJNMCwiK24rIkEiK24rIiwiK24rIiAwIDEsIit0KyIgMCwiKy1uKyJBIituKyIsIituKyIgMCAxLCIrdCsiIDAsIitufXZhciBlPWlvLHI9b28sdT11byxpPUNsLG89YW8sYT1jbyxjPWxvO3JldHVybiBuLmlubmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWt0KHQpLG4pOmV9LG4ub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9a3QodCksbik6cn0sbi5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9a3QodCksbik6dX0sbi5wYWRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dD09Q2w/Q2w6a3QodCksbik6aX0sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWt0KHQpLG4pOm99LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9a3QodCksbik6YX0sbi5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1rdCh0KSxuKTpjfSxuLmNlbnRyb2lkPWZ1bmN0aW9uKCl7dmFyIG49KCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLHQ9KCtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK2EuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLWphO3JldHVybltNYXRoLmNvcyh0KSpuLE1hdGguc2luKHQpKm5dfSxufTt2YXIgQ2w9ImF1dG8iO3RhLnN2Zy5saW5lPWZ1bmN0aW9uKCl7cmV0dXJuIGhvKEV0KX07dmFyIHpsPXRhLm1hcCh7bGluZWFyOmdvLCJsaW5lYXItY2xvc2VkIjpwbyxzdGVwOnZvLCJzdGVwLWJlZm9yZSI6bW8sInN0ZXAtYWZ0ZXIiOnlvLGJhc2lzOlNvLCJiYXNpcy1vcGVuIjprbywiYmFzaXMtY2xvc2VkIjpFbyxidW5kbGU6QW8sY2FyZGluYWw6Ym8sImNhcmRpbmFsLW9wZW4iOk1vLCJjYXJkaW5hbC1jbG9zZWQiOnhvLG1vbm90b25lOlRvfSk7emwuZm9yRWFjaChmdW5jdGlvbihuLHQpe3Qua2V5PW4sdC5jbG9zZWQ9Ly1jbG9zZWQkLy50ZXN0KG4pfSk7dmFyIHFsPVswLDIvMywxLzMsMF0sTGw9WzAsMS8zLDIvMywwXSxUbD1bMCwxLzYsMi8zLDEvNl07dGEuc3ZnLmxpbmUucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49aG8oUm8pO3JldHVybiBuLnJhZGl1cz1uLngsZGVsZXRlIG4ueCxuLmFuZ2xlPW4ueSxkZWxldGUgbi55LG59LG1vLnJldmVyc2U9eW8seW8ucmV2ZXJzZT1tbyx0YS5zdmcuYXJlYT1mdW5jdGlvbigpe3JldHVybiBEbyhFdCl9LHRhLnN2Zy5hcmVhLnJhZGlhbD1mdW5jdGlvbigpe3ZhciBuPURvKFJvKTtyZXR1cm4gbi5yYWRpdXM9bi54LGRlbGV0ZSBuLngsbi5pbm5lclJhZGl1cz1uLngwLGRlbGV0ZSBuLngwLG4ub3V0ZXJSYWRpdXM9bi54MSxkZWxldGUgbi54MSxuLmFuZ2xlPW4ueSxkZWxldGUgbi55LG4uc3RhcnRBbmdsZT1uLnkwLGRlbGV0ZSBuLnkwLG4uZW5kQW5nbGU9bi55MSxkZWxldGUgbi55MSxufSx0YS5zdmcuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sYSl7dmFyIGM9dCh0aGlzLGksbixhKSxsPXQodGhpcyxvLG4sYSk7cmV0dXJuIk0iK2MucDArcihjLnIsYy5wMSxjLmExLWMuYTApKyhlKGMsbCk/dShjLnIsYy5wMSxjLnIsYy5wMCk6dShjLnIsYy5wMSxsLnIsbC5wMCkrcihsLnIsbC5wMSxsLmExLWwuYTApK3UobC5yLGwucDEsYy5yLGMucDApKSsiWiJ9ZnVuY3Rpb24gdChuLHQsZSxyKXt2YXIgdT10LmNhbGwobixlLHIpLGk9YS5jYWxsKG4sdSxyKSxvPWMuY2FsbChuLHUsciktamEscz1sLmNhbGwobix1LHIpLWphO3JldHVybntyOmksYTA6byxhMTpzLHAwOltpKk1hdGguY29zKG8pLGkqTWF0aC5zaW4obyldLHAxOltpKk1hdGguY29zKHMpLGkqTWF0aC5zaW4ocyldfX1mdW5jdGlvbiBlKG4sdCl7cmV0dXJuIG4uYTA9PXQuYTAmJm4uYTE9PXQuYTF9ZnVuY3Rpb24gcihuLHQsZSl7cmV0dXJuIkEiK24rIiwiK24rIiAwICIrICsoZT5EYSkrIiwxICIrdH1mdW5jdGlvbiB1KG4sdCxlLHIpe3JldHVybiJRIDAsMCAiK3J9dmFyIGk9bXIsbz15cixhPVBvLGM9YW8sbD1jbztyZXR1cm4gbi5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9a3QodCksbik6YX0sbi5zb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9a3QodCksbik6aX0sbi50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89a3QodCksbik6b30sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPWt0KHQpLG4pOmN9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9a3QodCksbik6bH0sbn0sdGEuc3ZnLmRpYWdvbmFsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBpPXQuY2FsbCh0aGlzLG4sdSksbz1lLmNhbGwodGhpcyxuLHUpLGE9KGkueStvLnkpLzIsYz1baSx7eDppLngseTphfSx7eDpvLngseTphfSxvXTtyZXR1cm4gYz1jLm1hcChyKSwiTSIrY1swXSsiQyIrY1sxXSsiICIrY1syXSsiICIrY1szXX12YXIgdD1tcixlPXlyLHI9VW87cmV0dXJuIG4uc291cmNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWt0KGUpLG4pOnR9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWt0KHQpLG4pOmV9LG4ucHJvamVjdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG59LHRhLnN2Zy5kaWFnb25hbC5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgbj10YS5zdmcuZGlhZ29uYWwoKSx0PVVvLGU9bi5wcm9qZWN0aW9uO3JldHVybiBuLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/ZShqbyh0PW4pKTp0fSxufSx0YS5zdmcuc3ltYm9sPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHIpe3JldHVybihSbC5nZXQodC5jYWxsKHRoaXMsbixyKSl8fE9vKShlLmNhbGwodGhpcyxuLHIpKX12YXIgdD1IbyxlPUZvO3JldHVybiBuLnR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9a3QoZSksbik6dH0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWt0KHQpLG4pOmV9LG59O3ZhciBSbD10YS5tYXAoe2NpcmNsZTpPbyxjcm9zczpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi81KS8yO3JldHVybiJNIistMyp0KyIsIistdCsiSCIrLXQrIlYiKy0zKnQrIkgiK3QrIlYiKy10KyJIIiszKnQrIlYiK3QrIkgiK3QrIlYiKzMqdCsiSCIrLXQrIlYiK3QrIkgiKy0zKnQrIloifSxkaWFtb25kOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuLygyKlBsKSksZT10KlBsO3JldHVybiJNMCwiKy10KyJMIitlKyIsMCIrIiAwLCIrdCsiICIrLWUrIiwwIisiWiJ9LHNxdWFyZTpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobikvMjtyZXR1cm4iTSIrLXQrIiwiKy10KyJMIit0KyIsIistdCsiICIrdCsiLCIrdCsiICIrLXQrIiwiK3QrIloifSwidHJpYW5nbGUtZG93biI6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vRGwpLGU9dCpEbC8yO3JldHVybiJNMCwiK2UrIkwiK3QrIiwiKy1lKyIgIistdCsiLCIrLWUrIloifSwidHJpYW5nbGUtdXAiOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuL0RsKSxlPXQqRGwvMjtyZXR1cm4iTTAsIistZSsiTCIrdCsiLCIrZSsiICIrLXQrIiwiK2UrIloifX0pO3RhLnN2Zy5zeW1ib2xUeXBlcz1SbC5rZXlzKCk7dmFyIERsPU1hdGguc3FydCgzKSxQbD1NYXRoLnRhbigzMCpGYSk7a2EudHJhbnNpdGlvbj1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyPVVsfHwrK09sLHU9WG8obiksaT1bXSxvPWpsfHx7dGltZTpEYXRlLm5vdygpLGVhc2U6U3UsZGVsYXk6MCxkdXJhdGlvbjoyNTB9LGE9LTEsYz10aGlzLmxlbmd0aDsrK2E8Yzspe2kucHVzaCh0PVtdKTtmb3IodmFyIGw9dGhpc1thXSxzPS0xLGY9bC5sZW5ndGg7KytzPGY7KShlPWxbc10pJiYkbyhlLHMsdSxyLG8pLHQucHVzaChlKX1yZXR1cm4gSW8oaSx1LHIpfSxrYS5pbnRlcnJ1cHQ9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuZWFjaChudWxsPT1uP0ZsOllvKFhvKG4pKSl9O3ZhciBVbCxqbCxGbD1ZbyhYbygpKSxIbD1bXSxPbD0wO0hsLmNhbGw9a2EuY2FsbCxIbC5lbXB0eT1rYS5lbXB0eSxIbC5ub2RlPWthLm5vZGUsSGwuc2l6ZT1rYS5zaXplLHRhLnRyYW5zaXRpb249ZnVuY3Rpb24obix0KXtyZXR1cm4gbiYmbi50cmFuc2l0aW9uP1VsP24udHJhbnNpdGlvbih0KTpuOk5hLnRyYW5zaXRpb24obil9LHRhLnRyYW5zaXRpb24ucHJvdG90eXBlPUhsLEhsLnNlbGVjdD1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdT10aGlzLmlkLGk9dGhpcy5uYW1lc3BhY2Usbz1bXTtuPWsobik7Zm9yKHZhciBhPS0xLGM9dGhpcy5sZW5ndGg7KythPGM7KXtvLnB1c2godD1bXSk7Zm9yKHZhciBsPXRoaXNbYV0scz0tMSxmPWwubGVuZ3RoOysrczxmOykocj1sW3NdKSYmKGU9bi5jYWxsKHIsci5fX2RhdGFfXyxzLGEpKT8oIl9fZGF0YV9fImluIHImJihlLl9fZGF0YV9fPXIuX19kYXRhX18pLCRvKGUscyxpLHUscltpXVt1XSksdC5wdXNoKGUpKTp0LnB1c2gobnVsbCl9cmV0dXJuIElvKG8saSx1KX0sSGwuc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1LGksbz10aGlzLmlkLGE9dGhpcy5uYW1lc3BhY2UsYz1bXTtuPUUobik7Zm9yKHZhciBsPS0xLHM9dGhpcy5sZW5ndGg7KytsPHM7KWZvcih2YXIgZj10aGlzW2xdLGg9LTEsZz1mLmxlbmd0aDsrK2g8ZzspaWYocj1mW2hdKXtpPXJbYV1bb10sZT1uLmNhbGwocixyLl9fZGF0YV9fLGgsbCksYy5wdXNoKHQ9W10pO2Zvcih2YXIgcD0tMSx2PWUubGVuZ3RoOysrcDx2OykodT1lW3BdKSYmJG8odSxwLGEsbyxpKSx0LnB1c2godSl9cmV0dXJuIElvKGMsYSxvKX0sSGwuZmlsdGVyPWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PVtdOyJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1qKG4pKTtmb3IodmFyIGk9MCxvPXRoaXMubGVuZ3RoO28+aTtpKyspe3UucHVzaCh0PVtdKTtmb3IodmFyIGU9dGhpc1tpXSxhPTAsYz1lLmxlbmd0aDtjPmE7YSsrKShyPWVbYV0pJiZuLmNhbGwocixyLl9fZGF0YV9fLGEsaSkmJnQucHVzaChyKX1yZXR1cm4gSW8odSx0aGlzLm5hbWVzcGFjZSx0aGlzLmlkKX0sSGwudHdlZW49ZnVuY3Rpb24obix0KXt2YXIgZT10aGlzLmlkLHI9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj90aGlzLm5vZGUoKVtyXVtlXS50d2Vlbi5nZXQobik6SCh0aGlzLG51bGw9PXQ/ZnVuY3Rpb24odCl7dFtyXVtlXS50d2Vlbi5yZW1vdmUobil9OmZ1bmN0aW9uKHUpe3Vbcl1bZV0udHdlZW4uc2V0KG4sdCl9KX0sSGwuYXR0cj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZShhKX1mdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhhLnNwYWNlLGEubG9jYWwpfWZ1bmN0aW9uIHUobil7cmV0dXJuIG51bGw9PW4/ZToobis9IiIsZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZ2V0QXR0cmlidXRlKGEpO3JldHVybiBlIT09biYmKHQ9byhlLG4pLGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlKGEsdChuKSl9KX0pfWZ1bmN0aW9uIGkobil7cmV0dXJuIG51bGw9PW4/cjoobis9IiIsZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZ2V0QXR0cmlidXRlTlMoYS5zcGFjZSxhLmxvY2FsKTtyZXR1cm4gZSE9PW4mJih0PW8oZSxuKSxmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZU5TKGEuc3BhY2UsYS5sb2NhbCx0KG4pKX0pfSl9aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodCBpbiBuKXRoaXMuYXR0cih0LG5bdF0pO3JldHVybiB0aGlzfXZhciBvPSJ0cmFuc2Zvcm0iPT1uP0h1Om11LGE9dGEubnMucXVhbGlmeShuKTtyZXR1cm4gWm8odGhpcywiYXR0ci4iK24sdCxhLmxvY2FsP2k6dSl9LEhsLmF0dHJUd2Vlbj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlKXt2YXIgcj10LmNhbGwodGhpcyxuLGUsdGhpcy5nZXRBdHRyaWJ1dGUodSkpO3JldHVybiByJiZmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZSh1LHIobikpfX1mdW5jdGlvbiByKG4sZSl7dmFyIHI9dC5jYWxsKHRoaXMsbixlLHRoaXMuZ2V0QXR0cmlidXRlTlModS5zcGFjZSx1LmxvY2FsKSk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlTlModS5zcGFjZSx1LmxvY2FsLHIobikpfX12YXIgdT10YS5ucy5xdWFsaWZ5KG4pO3JldHVybiB0aGlzLnR3ZWVuKCJhdHRyLiIrbix1LmxvY2FsP3I6ZSl9LEhsLnN0eWxlPWZ1bmN0aW9uKG4sdCxlKXtmdW5jdGlvbiByKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiB1KHQpe3JldHVybiBudWxsPT10P3I6KHQrPSIiLGZ1bmN0aW9uKCl7dmFyIHIsdT1vYS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKTtyZXR1cm4gdSE9PXQmJihyPW11KHUsdCksZnVuY3Rpb24odCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHIodCksZSl9KX0pfXZhciBpPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5pKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+aSYmKHQ9IiIpO2ZvcihlIGluIG4pdGhpcy5zdHlsZShlLG5bZV0sdCk7cmV0dXJuIHRoaXN9ZT0iIn1yZXR1cm4gWm8odGhpcywic3R5bGUuIituLHQsdSl9LEhsLnN0eWxlVHdlZW49ZnVuY3Rpb24obix0LGUpe2Z1bmN0aW9uIHIocix1KXt2YXIgaT10LmNhbGwodGhpcyxyLHUsb2EuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLmdldFByb3BlcnR5VmFsdWUobikpO3JldHVybiBpJiZmdW5jdGlvbih0KXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4saSh0KSxlKX19cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MyYmKGU9IiIpLHRoaXMudHdlZW4oInN0eWxlLiIrbixyKX0sSGwudGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gWm8odGhpcywidGV4dCIsbixWbyl9LEhsLnJlbW92ZT1mdW5jdGlvbigpe3ZhciBuPXRoaXMubmFtZXNwYWNlO3JldHVybiB0aGlzLmVhY2goImVuZC50cmFuc2l0aW9uIixmdW5jdGlvbigpe3ZhciB0O3RoaXNbbl0uY291bnQ8MiYmKHQ9dGhpcy5wYXJlbnROb2RlKSYmdC5yZW1vdmVDaGlsZCh0aGlzKX0pfSxIbC5lYXNlPWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQsZT10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP3RoaXMubm9kZSgpW2VdW3RdLmVhc2U6KCJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj10YS5lYXNlLmFwcGx5KHRhLGFyZ3VtZW50cykpLEgodGhpcyxmdW5jdGlvbihyKXtyW2VdW3RdLmVhc2U9bn0pKX0sSGwuZGVsYXk9ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZGVsYXk6SCh0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHIsdSxpKXtyW2VdW3RdLmRlbGF5PStuLmNhbGwocixyLl9fZGF0YV9fLHUsaSl9OihuPStuLGZ1bmN0aW9uKHIpe3JbZV1bdF0uZGVsYXk9bn0pKX0sSGwuZHVyYXRpb249ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZHVyYXRpb246SCh0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHIsdSxpKXtyW2VdW3RdLmR1cmF0aW9uPU1hdGgubWF4KDEsbi5jYWxsKHIsci5fX2RhdGFfXyx1LGkpKX06KG49TWF0aC5tYXgoMSxuKSxmdW5jdGlvbihyKXtyW2VdW3RdLmR1cmF0aW9uPW59KSl9LEhsLmVhY2g9ZnVuY3Rpb24obix0KXt2YXIgZT10aGlzLmlkLHI9dGhpcy5uYW1lc3BhY2U7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgdT1qbCxpPVVsO3RyeXtVbD1lLEgodGhpcyxmdW5jdGlvbih0LHUsaSl7amw9dFtyXVtlXSxuLmNhbGwodCx0Ll9fZGF0YV9fLHUsaSl9KX1maW5hbGx5e2psPXUsVWw9aX19ZWxzZSBIKHRoaXMsZnVuY3Rpb24odSl7dmFyIGk9dVtyXVtlXTsoaS5ldmVudHx8KGkuZXZlbnQ9dGEuZGlzcGF0Y2goInN0YXJ0IiwiZW5kIiwiaW50ZXJydXB0IikpKS5vbihuLHQpfSk7cmV0dXJuIHRoaXN9LEhsLnRyYW5zaXRpb249ZnVuY3Rpb24oKXtmb3IodmFyIG4sdCxlLHIsdT10aGlzLmlkLGk9KytPbCxvPXRoaXMubmFtZXNwYWNlLGE9W10sYz0wLGw9dGhpcy5sZW5ndGg7bD5jO2MrKyl7YS5wdXNoKG49W10pO2Zvcih2YXIgdD10aGlzW2NdLHM9MCxmPXQubGVuZ3RoO2Y+cztzKyspKGU9dFtzXSkmJihyPWVbb11bdV0sJG8oZSxzLG8saSx7dGltZTpyLnRpbWUsZWFzZTpyLmVhc2UsZGVsYXk6ci5kZWxheStyLmR1cmF0aW9uLGR1cmF0aW9uOnIuZHVyYXRpb259KSksbi5wdXNoKGUpfXJldHVybiBJbyhhLG8saSl9LHRhLnN2Zy5heGlzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtuLmVhY2goZnVuY3Rpb24oKXt2YXIgbixsPXRhLnNlbGVjdCh0aGlzKSxzPXRoaXMuX19jaGFydF9ffHxlLGY9dGhpcy5fX2NoYXJ0X189ZS5jb3B5KCksaD1udWxsPT1jP2YudGlja3M/Zi50aWNrcy5hcHBseShmLGEpOmYuZG9tYWluKCk6YyxnPW51bGw9PXQ/Zi50aWNrRm9ybWF0P2YudGlja0Zvcm1hdC5hcHBseShmLGEpOkV0OnQscD1sLnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKGgsZiksdj1wLmVudGVyKCkuaW5zZXJ0KCJnIiwiLmRvbWFpbiIpLmF0dHIoImNsYXNzIiwidGljayIpLnN0eWxlKCJvcGFjaXR5IixUYSksZD10YS50cmFuc2l0aW9uKHAuZXhpdCgpKS5zdHlsZSgib3BhY2l0eSIsVGEpLnJlbW92ZSgpLG09dGEudHJhbnNpdGlvbihwLm9yZGVyKCkpLnN0eWxlKCJvcGFjaXR5IiwxKSx5PU1hdGgubWF4KHUsMCkrbyxNPVVpKGYpLHg9bC5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFswXSksYj0oeC5lbnRlcigpLmFwcGVuZCgicGF0aCIpLmF0dHIoImNsYXNzIiwiZG9tYWluIiksdGEudHJhbnNpdGlvbih4KSk7di5hcHBlbmQoImxpbmUiKSx2LmFwcGVuZCgidGV4dCIpO3ZhciBfLHcsUyxrLEU9di5zZWxlY3QoImxpbmUiKSxBPW0uc2VsZWN0KCJsaW5lIiksTj1wLnNlbGVjdCgidGV4dCIpLnRleHQoZyksQz12LnNlbGVjdCgidGV4dCIpLHo9bS5zZWxlY3QoInRleHQiKSxxPSJ0b3AiPT09cnx8ImxlZnQiPT09cj8tMToxO2lmKCJib3R0b20iPT09cnx8InRvcCI9PT1yPyhuPUJvLF89IngiLFM9InkiLHc9IngyIixrPSJ5MiIsTi5hdHRyKCJkeSIsMD5xPyIwZW0iOiIuNzFlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLGIuYXR0cigiZCIsIk0iK01bMF0rIiwiK3EqaSsiVjBIIitNWzFdKyJWIitxKmkpKToobj1XbyxfPSJ5IixTPSJ4Iix3PSJ5MiIsaz0ieDIiLE4uYXR0cigiZHkiLCIuMzJlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsMD5xPyJlbmQiOiJzdGFydCIpLGIuYXR0cigiZCIsIk0iK3EqaSsiLCIrTVswXSsiSDBWIitNWzFdKyJIIitxKmkpKSxFLmF0dHIoayxxKnUpLEMuYXR0cihTLHEqeSksQS5hdHRyKHcsMCkuYXR0cihrLHEqdSksei5hdHRyKF8sMCkuYXR0cihTLHEqeSksZi5yYW5nZUJhbmQpe3ZhciBMPWYsVD1MLnJhbmdlQmFuZCgpLzI7cz1mPWZ1bmN0aW9uKG4pe3JldHVybiBMKG4pK1R9fWVsc2Ugcy5yYW5nZUJhbmQ/cz1mOmQuY2FsbChuLGYscyk7di5jYWxsKG4scyxmKSxtLmNhbGwobixmLGYpfSl9dmFyIHQsZT10YS5zY2FsZS5saW5lYXIoKSxyPVlsLHU9NixpPTYsbz0zLGE9WzEwXSxjPW51bGw7cmV0dXJuIG4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLm9yaWVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10IGluIElsP3QrIiI6WWwsbik6cn0sbi50aWNrcz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWFyZ3VtZW50cyxuKTphfSxuLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9dCxuKTpjfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLnRpY2tTaXplPWZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIGU/KHU9K3QsaT0rYXJndW1lbnRzW2UtMV0sbik6dX0sbi5pbm5lclRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LG4pOnV9LG4ub3V0ZXJUaWNrU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxuKTppfSxuLnRpY2tQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LG4pOm99LG4udGlja1N1YmRpdmlkZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoJiZufSxufTt2YXIgWWw9ImJvdHRvbSIsSWw9e3RvcDoxLHJpZ2h0OjEsYm90dG9tOjEsbGVmdDoxfTt0YS5zdmcuYnJ1c2g9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGkpe2kuZWFjaChmdW5jdGlvbigpe3ZhciBpPXRhLnNlbGVjdCh0aGlzKS5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2giLHUpLm9uKCJ0b3VjaHN0YXJ0LmJydXNoIix1KSxvPWkuc2VsZWN0QWxsKCIuYmFja2dyb3VuZCIpLmRhdGEoWzBdKTtvLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJiYWNrZ3JvdW5kIikuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKS5zdHlsZSgiY3Vyc29yIiwiY3Jvc3NoYWlyIiksaS5zZWxlY3RBbGwoIi5leHRlbnQiKS5kYXRhKFswXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImV4dGVudCIpLnN0eWxlKCJjdXJzb3IiLCJtb3ZlIik7dmFyIGE9aS5zZWxlY3RBbGwoIi5yZXNpemUiKS5kYXRhKHAsRXQpO2EuZXhpdCgpLnJlbW92ZSgpLGEuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24obil7cmV0dXJuInJlc2l6ZSAiK259KS5zdHlsZSgiY3Vyc29yIixmdW5jdGlvbihuKXtyZXR1cm4gWmxbbl19KS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IixmdW5jdGlvbihuKXtyZXR1cm4vW2V3XSQvLnRlc3Qobik/LTM6bnVsbH0pLmF0dHIoInkiLGZ1bmN0aW9uKG4pe3JldHVybi9eW25zXS8udGVzdChuKT8tMzpudWxsfSkuYXR0cigid2lkdGgiLDYpLmF0dHIoImhlaWdodCIsNikuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKSxhLnN0eWxlKCJkaXNwbGF5IixuLmVtcHR5KCk/Im5vbmUiOm51bGwpO3ZhciBzLGY9dGEudHJhbnNpdGlvbihpKSxoPXRhLnRyYW5zaXRpb24obyk7YyYmKHM9VWkoYyksaC5hdHRyKCJ4IixzWzBdKS5hdHRyKCJ3aWR0aCIsc1sxXS1zWzBdKSxlKGYpKSxsJiYocz1VaShsKSxoLmF0dHIoInkiLHNbMF0pLmF0dHIoImhlaWdodCIsc1sxXS1zWzBdKSxyKGYpKSx0KGYpfSl9ZnVuY3Rpb24gdChuKXtuLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7cmV0dXJuInRyYW5zbGF0ZSgiK3NbKy9lJC8udGVzdChuKV0rIiwiK2ZbKy9ecy8udGVzdChuKV0rIikifSl9ZnVuY3Rpb24gZShuKXtuLnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoIngiLHNbMF0pLG4uc2VsZWN0QWxsKCIuZXh0ZW50LC5uPnJlY3QsLnM+cmVjdCIpLmF0dHIoIndpZHRoIixzWzFdLXNbMF0pfWZ1bmN0aW9uIHIobil7bi5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ5IixmWzBdKSxuLnNlbGVjdEFsbCgiLmV4dGVudCwuZT5yZWN0LC53PnJlY3QiKS5hdHRyKCJoZWlnaHQiLGZbMV0tZlswXSl9ZnVuY3Rpb24gdSgpe2Z1bmN0aW9uIHUoKXszMj09dGEuZXZlbnQua2V5Q29kZSYmKE58fCh5PW51bGwselswXS09c1sxXSx6WzFdLT1mWzFdLE49MiksYigpKX1mdW5jdGlvbiBwKCl7MzI9PXRhLmV2ZW50LmtleUNvZGUmJjI9PU4mJih6WzBdKz1zWzFdLHpbMV0rPWZbMV0sTj0wLGIoKSl9ZnVuY3Rpb24gdigpe3ZhciBuPXRhLm1vdXNlKHgpLHU9ITE7TSYmKG5bMF0rPU1bMF0sblsxXSs9TVsxXSksTnx8KHRhLmV2ZW50LmFsdEtleT8oeXx8KHk9WyhzWzBdK3NbMV0pLzIsKGZbMF0rZlsxXSkvMl0pLHpbMF09c1srKG5bMF08eVswXSldLHpbMV09ZlsrKG5bMV08eVsxXSldKTp5PW51bGwpLEUmJmQobixjLDApJiYoZShTKSx1PSEwKSxBJiZkKG4sbCwxKSYmKHIoUyksdT0hMCksdSYmKHQoUyksdyh7dHlwZToiYnJ1c2giLG1vZGU6Tj8ibW92ZSI6InJlc2l6ZSJ9KSl9ZnVuY3Rpb24gZChuLHQsZSl7dmFyIHIsdSxhPVVpKHQpLGM9YVswXSxsPWFbMV0scD16W2VdLHY9ZT9mOnMsZD12WzFdLXZbMF07cmV0dXJuIE4mJihjLT1wLGwtPWQrcCkscj0oZT9nOmgpP01hdGgubWF4KGMsTWF0aC5taW4obCxuW2VdKSk6bltlXSxOP3U9KHIrPXApK2Q6KHkmJihwPU1hdGgubWF4KGMsTWF0aC5taW4obCwyKnlbZV0tcikpKSxyPnA/KHU9cixyPXApOnU9cCksdlswXSE9cnx8dlsxXSE9dT8oZT9vPW51bGw6aT1udWxsLHZbMF09cix2WzFdPXUsITApOnZvaWQgMH1mdW5jdGlvbiBtKCl7digpLFMuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG4uZW1wdHkoKT8ibm9uZSI6bnVsbCksdGEuc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsbnVsbCkscS5vbigibW91c2Vtb3ZlLmJydXNoIixudWxsKS5vbigibW91c2V1cC5icnVzaCIsbnVsbCkub24oInRvdWNobW92ZS5icnVzaCIsbnVsbCkub24oInRvdWNoZW5kLmJydXNoIixudWxsKS5vbigia2V5ZG93bi5icnVzaCIsbnVsbCkub24oImtleXVwLmJydXNoIixudWxsKSxDKCksdyh7dHlwZToiYnJ1c2hlbmQifSl9dmFyIHksTSx4PXRoaXMsXz10YS5zZWxlY3QodGEuZXZlbnQudGFyZ2V0KSx3PWEub2YoeCxhcmd1bWVudHMpLFM9dGEuc2VsZWN0KHgpLGs9Xy5kYXR1bSgpLEU9IS9eKG58cykkLy50ZXN0KGspJiZjLEE9IS9eKGV8dykkLy50ZXN0KGspJiZsLE49Xy5jbGFzc2VkKCJleHRlbnQiKSxDPVgoKSx6PXRhLm1vdXNlKHgpLHE9dGEuc2VsZWN0KG9hKS5vbigia2V5ZG93bi5icnVzaCIsdSkub24oImtleXVwLmJydXNoIixwKTtpZih0YS5ldmVudC5jaGFuZ2VkVG91Y2hlcz9xLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLHYpLm9uKCJ0b3VjaGVuZC5icnVzaCIsbSk6cS5vbigibW91c2Vtb3ZlLmJydXNoIix2KS5vbigibW91c2V1cC5icnVzaCIsbSksUy5pbnRlcnJ1cHQoKS5zZWxlY3RBbGwoIioiKS5pbnRlcnJ1cHQoKSxOKXpbMF09c1swXS16WzBdLHpbMV09ZlswXS16WzFdO2Vsc2UgaWYoayl7dmFyIEw9Ky93JC8udGVzdChrKSxUPSsvXm4vLnRlc3Qoayk7TT1bc1sxLUxdLXpbMF0sZlsxLVRdLXpbMV1dLHpbMF09c1tMXSx6WzFdPWZbVF19ZWxzZSB0YS5ldmVudC5hbHRLZXkmJih5PXouc2xpY2UoKSk7Uy5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJub25lIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLHRhLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLF8uc3R5bGUoImN1cnNvciIpKSx3KHt0eXBlOiJicnVzaHN0YXJ0In0pLHYoKX12YXIgaSxvLGE9dyhuLCJicnVzaHN0YXJ0IiwiYnJ1c2giLCJicnVzaGVuZCIpLGM9bnVsbCxsPW51bGwscz1bMCwwXSxmPVswLDBdLGg9ITAsZz0hMCxwPVZsWzBdO3JldHVybiBuLmV2ZW50PWZ1bmN0aW9uKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuPWEub2YodGhpcyxhcmd1bWVudHMpLHQ9e3g6cyx5OmYsaTppLGo6b30sZT10aGlzLl9fY2hhcnRfX3x8dDt0aGlzLl9fY2hhcnRfXz10LFVsP3RhLnNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuZWFjaCgic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7aT1lLmksbz1lLmoscz1lLngsZj1lLnksbih7dHlwZToiYnJ1c2hzdGFydCJ9KX0pLnR3ZWVuKCJicnVzaDpicnVzaCIsZnVuY3Rpb24oKXt2YXIgZT15dShzLHQueCkscj15dShmLHQueSk7cmV0dXJuIGk9bz1udWxsLGZ1bmN0aW9uKHUpe3M9dC54PWUodSksZj10Lnk9cih1KSxuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pfX0pLmVhY2goImVuZC5icnVzaCIsZnVuY3Rpb24oKXtpPXQuaSxvPXQuaixuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pLG4oe3R5cGU6ImJydXNoZW5kIn0pfSk6KG4oe3R5cGU6ImJydXNoc3RhcnQifSksbih7dHlwZToiYnJ1c2giLG1vZGU6InJlc2l6ZSJ9KSxuKHt0eXBlOiJicnVzaGVuZCJ9KSl9KX0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXQscD1WbFshYzw8MXwhbF0sbik6Y30sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQscD1WbFshYzw8MXwhbF0sbik6bH0sbi5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYyYmbD8oaD0hIXRbMF0sZz0hIXRbMV0pOmM/aD0hIXQ6bCYmKGc9ISF0KSxuKTpjJiZsP1toLGddOmM/aDpsP2c6bnVsbH0sbi5leHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGUscix1LGEsaDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYyYmKGU9dFswXSxyPXRbMV0sbCYmKGU9ZVswXSxyPXJbMF0pLGk9W2Uscl0sYy5pbnZlcnQmJihlPWMoZSkscj1jKHIpKSxlPnImJihoPWUsZT1yLHI9aCksKGUhPXNbMF18fHIhPXNbMV0pJiYocz1bZSxyXSkpLGwmJih1PXRbMF0sYT10WzFdLGMmJih1PXVbMV0sYT1hWzFdKSxvPVt1LGFdLGwuaW52ZXJ0JiYodT1sKHUpLGE9bChhKSksdT5hJiYoaD11LHU9YSxhPWgpLCh1IT1mWzBdfHxhIT1mWzFdKSYmKGY9W3UsYV0pKSxuKTooYyYmKGk/KGU9aVswXSxyPWlbMV0pOihlPXNbMF0scj1zWzFdLGMuaW52ZXJ0JiYoZT1jLmludmVydChlKSxyPWMuaW52ZXJ0KHIpKSxlPnImJihoPWUsZT1yLHI9aCkpKSxsJiYobz8odT1vWzBdLGE9b1sxXSk6KHU9ZlswXSxhPWZbMV0sbC5pbnZlcnQmJih1PWwuaW52ZXJ0KHUpLGE9bC5pbnZlcnQoYSkpLHU+YSYmKGg9dSx1PWEsYT1oKSkpLGMmJmw/W1tlLHVdLFtyLGFdXTpjP1tlLHJdOmwmJlt1LGFdKX0sbi5jbGVhcj1mdW5jdGlvbigpe3JldHVybiBuLmVtcHR5KCl8fChzPVswLDBdLGY9WzAsMF0saT1vPW51bGwpLG59LG4uZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4hIWMmJnNbMF09PXNbMV18fCEhbCYmZlswXT09ZlsxXX0sdGEucmViaW5kKG4sYSwib24iKX07dmFyIFpsPXtuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LFZsPVtbIm4iLCJlIiwicyIsInciLCJudyIsIm5lIiwic2UiLCJzdyJdLFsiZSIsInciXSxbIm4iLCJzIl0sW11dLFhsPWZjLmZvcm1hdD1tYy50aW1lRm9ybWF0LCRsPVhsLnV0YyxCbD0kbCgiJVktJW0tJWRUJUg6JU06JVMuJUxaIik7WGwuaXNvPURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nJiYrbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP0pvOkJsLEpvLnBhcnNlPWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBEYXRlKG4pO3JldHVybiBpc05hTih0KT9udWxsOnR9LEpvLnRvU3RyaW5nPUJsLnRvU3RyaW5nLGZjLnNlY29uZD1GdChmdW5jdGlvbihuKXtyZXR1cm4gbmV3IGhjKDFlMypNYXRoLmZsb29yKG4vMWUzKSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzFlMypNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0U2Vjb25kcygpfSksZmMuc2Vjb25kcz1mYy5zZWNvbmQucmFuZ2UsZmMuc2Vjb25kcy51dGM9ZmMuc2Vjb25kLnV0Yy5yYW5nZSxmYy5taW51dGU9RnQoZnVuY3Rpb24obil7cmV0dXJuIG5ldyBoYyg2ZTQqTWF0aC5mbG9vcihuLzZlNCkpfSxmdW5jdGlvbihuLHQpe24uc2V0VGltZShuLmdldFRpbWUoKSs2ZTQqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbnV0ZXMoKX0pLGZjLm1pbnV0ZXM9ZmMubWludXRlLnJhbmdlLGZjLm1pbnV0ZXMudXRjPWZjLm1pbnV0ZS51dGMucmFuZ2UsZmMuaG91cj1GdChmdW5jdGlvbihuKXt2YXIgdD1uLmdldFRpbWV6b25lT2Zmc2V0KCkvNjA7cmV0dXJuIG5ldyBoYygzNmU1KihNYXRoLmZsb29yKG4vMzZlNS10KSt0KSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzM2ZTUqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEhvdXJzKCl9KSxmYy5ob3Vycz1mYy5ob3VyLnJhbmdlLGZjLmhvdXJzLnV0Yz1mYy5ob3VyLnV0Yy5yYW5nZSxmYy5tb250aD1GdChmdW5jdGlvbihuKXtyZXR1cm4gbj1mYy5kYXkobiksbi5zZXREYXRlKDEpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXRNb250aChuLmdldE1vbnRoKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1vbnRoKCl9KSxmYy5tb250aHM9ZmMubW9udGgucmFuZ2UsZmMubW9udGhzLnV0Yz1mYy5tb250aC51dGMucmFuZ2U7dmFyIFdsPVsxZTMsNWUzLDE1ZTMsM2U0LDZlNCwzZTUsOWU1LDE4ZTUsMzZlNSwxMDhlNSwyMTZlNSw0MzJlNSw4NjRlNSwxNzI4ZTUsNjA0OGU1LDI1OTJlNiw3Nzc2ZTYsMzE1MzZlNl0sSmw9W1tmYy5zZWNvbmQsMV0sW2ZjLnNlY29uZCw1XSxbZmMuc2Vjb25kLDE1XSxbZmMuc2Vjb25kLDMwXSxbZmMubWludXRlLDFdLFtmYy5taW51dGUsNV0sW2ZjLm1pbnV0ZSwxNV0sW2ZjLm1pbnV0ZSwzMF0sW2ZjLmhvdXIsMV0sW2ZjLmhvdXIsM10sW2ZjLmhvdXIsNl0sW2ZjLmhvdXIsMTJdLFtmYy5kYXksMV0sW2ZjLmRheSwyXSxbZmMud2VlaywxXSxbZmMubW9udGgsMV0sW2ZjLm1vbnRoLDNdLFtmYy55ZWFyLDFdXSxHbD1YbC5tdWx0aShbWyIuJUwiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbGxpc2Vjb25kcygpfV0sWyI6JVMiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFNlY29uZHMoKX1dLFsiJUk6JU0iLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbnV0ZXMoKX1dLFsiJUkgJXAiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEhvdXJzKCl9XSxbIiVhICVkIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXREYXkoKSYmMSE9bi5nZXREYXRlKCl9XSxbIiViICVkIixmdW5jdGlvbihuKXtyZXR1cm4gMSE9bi5nZXREYXRlKCl9XSxbIiVCIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNb250aCgpfV0sWyIlWSIsTmVdXSksS2w9e3JhbmdlOmZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gdGEucmFuZ2UoTWF0aC5jZWlsKG4vZSkqZSwrdCxlKS5tYXAoS28pfSxmbG9vcjpFdCxjZWlsOkV0fTtKbC55ZWFyPWZjLnllYXIsZmMuc2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gR28odGEuc2NhbGUubGluZWFyKCksSmwsR2wpfTt2YXIgUWw9SmwubWFwKGZ1bmN0aW9uKG4pe3JldHVybltuWzBdLnV0YyxuWzFdXX0pLG5zPSRsLm11bHRpKFtbIi4lTCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTWlsbGlzZWNvbmRzKCl9XSxbIjolUyIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDU2Vjb25kcygpfV0sWyIlSTolTSIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTWludXRlcygpfV0sWyIlSSAlcCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDSG91cnMoKX1dLFsiJWEgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ0RheSgpJiYxIT1uLmdldFVUQ0RhdGUoKX1dLFsiJWIgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiAxIT1uLmdldFVUQ0RhdGUoKX1dLFsiJUIiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCl9XSxbIiVZIixOZV1dKTtRbC55ZWFyPWZjLnllYXIudXRjLGZjLnNjYWxlLnV0Yz1mdW5jdGlvbigpe3JldHVybiBHbyh0YS5zY2FsZS5saW5lYXIoKSxRbCxucyl9LHRhLnRleHQ9QXQoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVzcG9uc2VUZXh0fSksdGEuanNvbj1mdW5jdGlvbihuLHQpe3JldHVybiBOdChuLCJhcHBsaWNhdGlvbi9qc29uIixRbyx0KX0sdGEuaHRtbD1mdW5jdGlvbihuLHQpe3JldHVybiBOdChuLCJ0ZXh0L2h0bWwiLG5hLHQpfSx0YS54bWw9QXQoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVzcG9uc2VYTUx9KSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0YSk6Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzJiYobW9kdWxlLmV4cG9ydHM9dGEpLHRoaXMuZDM9dGF9KCk7"></script>
<script src="data:application/x-javascript;base64,ZDMuc2Fua2V5ID0gZnVuY3Rpb24oKSB7CiAgdmFyIHNhbmtleSA9IHt9LAogICAgICBub2RlV2lkdGggPSAyNCwKICAgICAgbm9kZVBhZGRpbmcgPSA4LAogICAgICBzaXplID0gWzEsIDFdLAogICAgICBub2RlcyA9IFtdLAogICAgICBsaW5rcyA9IFtdLAogICAgICBzaW5rc1JpZ2h0ID0gdHJ1ZTsKCiAgc2Fua2V5Lm5vZGVXaWR0aCA9IGZ1bmN0aW9uKF8pIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG5vZGVXaWR0aDsKICAgIG5vZGVXaWR0aCA9ICtfOwogICAgcmV0dXJuIHNhbmtleTsKICB9OwoKICBzYW5rZXkubm9kZVBhZGRpbmcgPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBub2RlUGFkZGluZzsKICAgIG5vZGVQYWRkaW5nID0gK187CiAgICByZXR1cm4gc2Fua2V5OwogIH07CgogIHNhbmtleS5ub2RlcyA9IGZ1bmN0aW9uKF8pIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG5vZGVzOwogICAgbm9kZXMgPSBfOwogICAgcmV0dXJuIHNhbmtleTsKICB9OwoKICBzYW5rZXkubGlua3MgPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5rczsKICAgIGxpbmtzID0gXzsKICAgIHJldHVybiBzYW5rZXk7CiAgfTsKCiAgc2Fua2V5LnNpemUgPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOwogICAgc2l6ZSA9IF87CiAgICByZXR1cm4gc2Fua2V5OwogIH07Cgogc2Fua2V5LnNpbmtzUmlnaHQgPSBmdW5jdGlvbiAoXykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2lua3NSaWdodDsKICAgIHNpbmtzUmlnaHQgPSBfOwogICAgcmV0dXJuIHNhbmtleTsKIH07CgogIHNhbmtleS5sYXlvdXQgPSBmdW5jdGlvbihpdGVyYXRpb25zKSB7CiAgICBjb21wdXRlTm9kZUxpbmtzKCk7CiAgICBjb21wdXRlTm9kZVZhbHVlcygpOwogICAgY29tcHV0ZU5vZGVCcmVhZHRocygpOwogICAgY29tcHV0ZU5vZGVEZXB0aHMoaXRlcmF0aW9ucyk7CiAgICByZXR1cm4gc2Fua2V5OwogIH07CgogIHNhbmtleS5yZWxheW91dCA9IGZ1bmN0aW9uKCkgewogICAgY29tcHV0ZUxpbmtEZXB0aHMoKTsKICAgIHJldHVybiBzYW5rZXk7CiAgfTsKCiAgLy8gU1ZHIHBhdGggZGF0YSBnZW5lcmF0b3IsIHRvIGJlIHVzZWQgYXMgImQiIGF0dHJpYnV0ZSBvbiAicGF0aCIgZWxlbWVudCBzZWxlY3Rpb24uCiAgc2Fua2V5LmxpbmsgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjdXJ2YXR1cmUgPSAuNTsKCiAgICBmdW5jdGlvbiBsaW5rKGQpIHsKICAgICAgdmFyIHhzID0gZC5zb3VyY2UueCArIGQuc291cmNlLmR4LAogICAgICAgICAgeHQgPSBkLnRhcmdldC54LAogICAgICAgICAgeGkgPSBkMy5pbnRlcnBvbGF0ZU51bWJlcih4cywgeHQpLAogICAgICAgICAgeHNjID0geGkoY3VydmF0dXJlKSwKICAgICAgICAgIHh0YyA9IHhpKDEgLSBjdXJ2YXR1cmUpLAogICAgICAgICAgeXMgPSBkLnNvdXJjZS55ICsgZC5zeSArIGQuZHkgLyAyLAogICAgICAgICAgeXQgPSBkLnRhcmdldC55ICsgZC50eSArIGQuZHkgLyAyOwoKICAgICAgaWYgKCFkLmN5Y2xlQnJlYWtlcikgewogICAgICAgIHJldHVybiAiTSIgKyB4cyArICIsIiArIHlzCiAgICAgICAgICAgICArICJDIiArIHhzYyArICIsIiArIHlzCiAgICAgICAgICAgICArICIgIiArIHh0YyArICIsIiArIHl0CiAgICAgICAgICAgICArICIgIiArIHh0ICsgIiwiICsgeXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHhkZWx0YSA9ICgxLjUgKiBkLmR5ICsgMC4wNSAqIE1hdGguYWJzKHhzIC0geHQpKTsKICAgICAgICB4c2MgPSB4cyArIHhkZWx0YTsKICAgICAgICB4dGMgPSB4dCAtIHhkZWx0YTsKICAgICAgICB2YXIgeG0gPSB4aSgwLjUpOwogICAgICAgIHZhciB5bSA9IGQzLmludGVycG9sYXRlTnVtYmVyKHlzLCB5dCkoMC41KTsKICAgICAgICB2YXIgeWRlbHRhID0gKDIgKiBkLmR5ICsgMC4xICogTWF0aC5hYnMoeHMgLSB4dCkgKyAwLjEgKiBNYXRoLmFicyh5cyAtIHl0KSkgKiAoeW0gPCAoc2l6ZVsxXSAvIDIpID8gLTEgOiAxKTsKICAgICAgICByZXR1cm4gIk0iICsgeHMgKyAiLCIgKyB5cwogICAgICAgICAgICAgKyAiQyIgKyB4c2MgKyAiLCIgKyB5cwogICAgICAgICAgICAgKyAiICIgKyB4c2MgKyAiLCIgKyAoeXMgKyB5ZGVsdGEpCiAgICAgICAgICAgICArICIgIiArIHhtICsgIiwiICsgKHltICsgeWRlbHRhKQogICAgICAgICAgICAgKyAiUyIgKyB4dGMgKyAiLCIgKyB5dAogICAgICAgICAgICAgKyAiICIgKyB4dCArICIsIiArIHl0OwoKICAgICAgfQogICAgfQoKICAgIGxpbmsuY3VydmF0dXJlID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjdXJ2YXR1cmU7CiAgICAgIGN1cnZhdHVyZSA9ICtfOwogICAgICByZXR1cm4gbGluazsKICAgIH07CgogICAgcmV0dXJuIGxpbms7CiAgfTsKCiAgLy8gUG9wdWxhdGUgdGhlIHNvdXJjZUxpbmtzIGFuZCB0YXJnZXRMaW5rcyBmb3IgZWFjaCBub2RlLgogIC8vIEFsc28sIGlmIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBhcmUgbm90IG9iamVjdHMsIGFzc3VtZSB0aGV5IGFyZSBpbmRpY2VzLgogIGZ1bmN0aW9uIGNvbXB1dGVOb2RlTGlua3MoKSB7CiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgLy8gTGlua3MgdGhhdCBoYXZlIHRoaXMgbm9kZSBhcyBzb3VyY2UuCiAgICAgIG5vZGUuc291cmNlTGlua3MgPSBbXTsKICAgICAgLy8gTGlua3MgdGhhdCBoYXZlIHRoaXMgbm9kZSBhcyB0YXJnZXQuCiAgICAgIG5vZGUudGFyZ2V0TGlua3MgPSBbXTsKICAgIH0pOwogICAgbGlua3MuZm9yRWFjaChmdW5jdGlvbihsaW5rKSB7CiAgICAgIHZhciBzb3VyY2UgPSBsaW5rLnNvdXJjZSwKICAgICAgICAgIHRhcmdldCA9IGxpbmsudGFyZ2V0OwogICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gIm51bWJlciIpIHNvdXJjZSA9IGxpbmsuc291cmNlID0gbm9kZXNbbGluay5zb3VyY2VdOwogICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gIm51bWJlciIpIHRhcmdldCA9IGxpbmsudGFyZ2V0ID0gbm9kZXNbbGluay50YXJnZXRdOwogICAgICBzb3VyY2Uuc291cmNlTGlua3MucHVzaChsaW5rKTsKICAgICAgdGFyZ2V0LnRhcmdldExpbmtzLnB1c2gobGluayk7CiAgICB9KTsKICB9CgogIC8vIENvbXB1dGUgdGhlIHZhbHVlIChzaXplKSBvZiBlYWNoIG5vZGUgYnkgc3VtbWluZyB0aGUgYXNzb2NpYXRlZCBsaW5rcy4KICBmdW5jdGlvbiBjb21wdXRlTm9kZVZhbHVlcygpIHsKICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgewogICAgICBub2RlLnZhbHVlID0gTWF0aC5tYXgoCiAgICAgICAgZDMuc3VtKG5vZGUuc291cmNlTGlua3MsIHZhbHVlKSwKICAgICAgICBkMy5zdW0obm9kZS50YXJnZXRMaW5rcywgdmFsdWUpCiAgICAgICk7CiAgICB9KTsKICB9CgogIC8vIEl0ZXJhdGl2ZWx5IGFzc2lnbiB0aGUgYnJlYWR0aCAoeC1wb3NpdGlvbikgZm9yIGVhY2ggbm9kZS4KICAvLyBOb2RlcyBhcmUgYXNzaWduZWQgdGhlIG1heGltdW0gYnJlYWR0aCBvZiBpbmNvbWluZyBuZWlnaGJvcnMgcGx1cyBvbmU7CiAgLy8gbm9kZXMgd2l0aCBubyBpbmNvbWluZyBsaW5rcyBhcmUgYXNzaWduZWQgYnJlYWR0aCB6ZXJvLCB3aGlsZQogIC8vIG5vZGVzIHdpdGggbm8gb3V0Z29pbmcgbGlua3MgYXJlIGFzc2lnbmVkIHRoZSBtYXhpbXVtIGJyZWFkdGguCiAgZnVuY3Rpb24gY29tcHV0ZU5vZGVCcmVhZHRocygpIHsKICAgIHZhciByZW1haW5pbmdOb2RlcyA9IG5vZGVzLAogICAgICAgIG5leHROb2RlcywKICAgICAgICB4ID0gMDsKCiAgICAvLyBXb3JrIGZyb20gbGVmdCB0byByaWdodC4KICAgIC8vIEtlZXAgdXBkYXRpbmcgdGhlIGJyZWF0aCAoeC1wb3NpdGlvbikgb2Ygbm9kZXMgdGhhdCBhcmUgdGFyZ2V0IG9mIHJlY2VudGx5IHVwZGF0ZWQgbm9kZXMuCiAgICB3aGlsZSAocmVtYWluaW5nTm9kZXMubGVuZ3RoICYmIHggPCBub2Rlcy5sZW5ndGgpIHsKICAgICAgbmV4dE5vZGVzID0gW107CiAgICAgIHJlbWFpbmluZ05vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgewogICAgICAgIG5vZGUueCA9IHg7CiAgICAgICAgbm9kZS5keCA9IG5vZGVXaWR0aDsKICAgICAgICBub2RlLnNvdXJjZUxpbmtzLmZvckVhY2goZnVuY3Rpb24obGluaykgewogICAgICAgICAgaWYgKG5leHROb2Rlcy5pbmRleE9mKGxpbmsudGFyZ2V0KSA8IDAgJiYgIWxpbmsuY3ljbGVCcmVha2VyKSB7CiAgICAgICAgICAgIG5leHROb2Rlcy5wdXNoKGxpbmsudGFyZ2V0KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIGlmIChuZXh0Tm9kZXMubGVuZ3RoID09IHJlbWFpbmluZ05vZGVzLmxlbmd0aCkgewogICAgICAgIC8vIFRoZXJlIG11c3QgYmUgYSBjeWNsZSBoZXJlLiBMZXQncyBzZWFyY2ggZm9yIGEgbGluayB0aGF0IGJyZWFrcyBpdC4KICAgICAgICBmaW5kQW5kTWFya0N5Y2xlQnJlYWtlcihuZXh0Tm9kZXMpOwogICAgICAgIC8vIFN0YXJ0IG92ZXIuCiAgICAgICAgLy8gVE9ETzogbWFrZSB0aGlzIG9wdGlvbmFsPwogICAgICAgIHJldHVybiBjb21wdXRlTm9kZUJyZWFkdGhzKCk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgcmVtYWluaW5nTm9kZXMgPSBuZXh0Tm9kZXM7CiAgICAgICAgKyt4OwogICAgICB9CiAgICB9CgogICAgLy8gT3B0aW9uYWxseSBtb3ZlIHB1cmUgc2lua3MgYWx3YXlzIHRvIHRoZSByaWdodC4KICAgIGlmIChzaW5rc1JpZ2h0KSB7CiAgICAgIG1vdmVTaW5rc1JpZ2h0KHgpOwogICAgfQoKICAgIHNjYWxlTm9kZUJyZWFkdGhzKChzaXplWzBdIC0gbm9kZVdpZHRoKSAvICh4IC0gMSkpOwogIH0KCiAgLy8gRmluZCBhIGxpbmsgdGhhdCBicmVha3MgYSBjeWNsZSBpbiB0aGUgZ3JhcGggKGlmIGFueSkuCiAgZnVuY3Rpb24gZmluZEFuZE1hcmtDeWNsZUJyZWFrZXIobm9kZXMpIHsKICAvLyBHbyB0aHJvdWdoIGFsbCBub2RlcyBmcm9tIHRoZSBnaXZlbiBzdWJzZXQgYW5kIHRyYXZlcnNlIGxpbmtzIHNlYXJjaGluZyBmb3IgY3ljbGVzLgogICAgdmFyIGxpbms7CiAgICBmb3IgKHZhciBuPW5vZGVzLmxlbmd0aCAtIDE7IG4gPj0gMDsgbi0tKSB7CiAgICAgIGxpbmsgPSBkZXB0aEZpcnN0Q3ljbGVTZWFyY2gobm9kZXNbbl0sIFtdKTsKICAgICAgaWYgKGxpbmspIHsKICAgICAgICByZXR1cm4gbGluazsKICAgICAgfQogICAgfQoKICAgIC8vIERlcHRoLWZpcnN0IHNlYXJjaCB0byBmaW5kIGEgbGluayB0aGF0IGlzIHBhcnQgb2YgYSBjeWNsZS4KICAgIGZ1bmN0aW9uIGRlcHRoRmlyc3RDeWNsZVNlYXJjaChjdXJzb3JOb2RlLCBwYXRoKSB7CiAgICAgIHZhciB0YXJnZXQsIGxpbms7CiAgICAgIGZvciAodmFyIG4gPSBjdXJzb3JOb2RlLnNvdXJjZUxpbmtzLmxlbmd0aCAtIDE7IG4gPj0gMDsgbi0tKSB7CiAgICAgICAgbGluayA9IGN1cnNvck5vZGUuc291cmNlTGlua3Nbbl07CiAgICAgICAgaWYgKGxpbmsuY3ljbGVCcmVha2VyKSB7CiAgICAgICAgICAvLyBTa2lwIGFscmVhZHkga25vd24gY3ljbGUgYnJlYWtlcnMuCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGlmIHRhcmdldCBvZiBsaW5rIG1ha2VzIGEgY3ljbGUgaW4gY3VycmVudCBwYXRoLgogICAgICAgIHRhcmdldCA9IGxpbmsudGFyZ2V0OwogICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgcGF0aC5sZW5ndGg7IGwrKykgewogICAgICAgICAgaWYgKHBhdGhbbF0uc291cmNlID09IHRhcmdldCkgewogICAgICAgICAgICAvLyBXZSBmb3VuZCBhIGN5Y2xlLiBTZWFyY2ggZm9yIHdlYWtlc3QgbGluayBpbiBjeWNsZQogICAgICAgICAgICB2YXIgd2Vha2VzdCA9IGxpbms7CiAgICAgICAgICAgIGZvciAoOyBsIDwgcGF0aC5sZW5ndGg7IGwrKykgewogICAgICAgICAgICAgIGlmIChwYXRoW2xdLnZhbHVlIDwgd2Vha2VzdC52YWx1ZSkgewogICAgICAgICAgICAgICAgd2Vha2VzdCA9IHBhdGhbbF07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1hcmsgd2Vha2VzdCBsaW5rIGFzIChrbm93bikgY3ljbGUgYnJlYWtlciBhbmQgYWJvcnQgc2VhcmNoLgogICAgICAgICAgICB3ZWFrZXN0LmN5Y2xlQnJlYWtlciA9IHRydWU7CiAgICAgICAgICAgIHJldHVybiB3ZWFrZXN0OwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gUmVjdXJzZSBkZWVwZXIuCiAgICAgICAgcGF0aC5wdXNoKGxpbmspOwogICAgICAgIGxpbmsgPSBkZXB0aEZpcnN0Q3ljbGVTZWFyY2godGFyZ2V0LCBwYXRoKTsKICAgICAgICBwYXRoLnBvcCgpOwogICAgICAgIC8vIFN0b3AgZnVydGhlciBzZWFyY2ggaWYgd2UgZm91bmQgYSBjeWNsZSBicmVha2VyLgogICAgICAgIGlmIChsaW5rKSB7CiAgICAgICAgICByZXR1cm4gbGluazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgoKICBmdW5jdGlvbiBtb3ZlU291cmNlc1JpZ2h0KCkgewogICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7CiAgICAgIGlmICghbm9kZS50YXJnZXRMaW5rcy5sZW5ndGgpIHsKICAgICAgICBub2RlLnggPSBkMy5taW4obm9kZS5zb3VyY2VMaW5rcywgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50YXJnZXQueDsgfSkgLSAxOwogICAgICB9CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIG1vdmVTaW5rc1JpZ2h0KHgpIHsKICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgewogICAgICBpZiAoIW5vZGUuc291cmNlTGlua3MubGVuZ3RoKSB7CiAgICAgICAgbm9kZS54ID0geCAtIDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy9tb3ZlIG5vZGUgdG8gc2Vjb25kIGZyb20gcmlnaHQgCiAgICAgICAgdmFyIG5vZGVzX3RvX3JpZ2h0ID0gMDsKICAgICAgICBub2RlLnNvdXJjZUxpbmtzLmZvckVhY2goZnVuY3Rpb24obikgewogICAgICAgICAgbm9kZXNfdG9fcmlnaHQgPSBNYXRoLm1heChub2Rlc190b19yaWdodCxuLnRhcmdldC5zb3VyY2VMaW5rcy5sZW5ndGgpCiAgICAgICAgICAvL2NvbnNvbGUubG9nKG5vZGUubmFtZSxuKQogICAgICAgIH0pCiAgICAgICAgIC8vY29uc29sZS5sb2cobm9kZS5uYW1lLG5vZGVzX3RvX3JpZ2h0KQogICAgICAgICBpZiAobm9kZXNfdG9fcmlnaHQ9PTApbm9kZS54ID0geCAtIDI7CiAgICAgIH0KICAgICAgCiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHNjYWxlTm9kZUJyZWFkdGhzKGt4KSB7CiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgbm9kZS54ICo9IGt4OwogICAgfSk7CiAgfQoKICAvLyBDb21wdXRlIHRoZSBkZXB0aCAoeS1wb3NpdGlvbikgZm9yIGVhY2ggbm9kZS4KICBmdW5jdGlvbiBjb21wdXRlTm9kZURlcHRocyhpdGVyYXRpb25zKSB7CiAgICAvLyBHcm91cCBub2RlcyBieSBicmVhdGguCiAgICB2YXIgbm9kZXNCeUJyZWFkdGggPSBkMy5uZXN0KCkKICAgICAgICAua2V5KGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQueDsgfSkKICAgICAgICAuc29ydEtleXMoZDMuYXNjZW5kaW5nKQogICAgICAgIC5lbnRyaWVzKG5vZGVzKQogICAgICAgIC5tYXAoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC52YWx1ZXM7IH0pOwoKICAgIC8vCiAgICBpbml0aWFsaXplTm9kZURlcHRoKCk7CiAgICByZXNvbHZlQ29sbGlzaW9ucygpOwogICAgY29tcHV0ZUxpbmtEZXB0aHMoKTsKICAgIGZvciAodmFyIGFscGhhID0gMTsgaXRlcmF0aW9ucyA+IDA7IC0taXRlcmF0aW9ucykgewogICAgICByZWxheFJpZ2h0VG9MZWZ0KGFscGhhICo9IC45OSk7CiAgICAgIHJlc29sdmVDb2xsaXNpb25zKCk7CiAgICAgIGNvbXB1dGVMaW5rRGVwdGhzKCk7CiAgICAgIHJlbGF4TGVmdFRvUmlnaHQoYWxwaGEpOwogICAgICByZXNvbHZlQ29sbGlzaW9ucygpOwogICAgICBjb21wdXRlTGlua0RlcHRocygpOwogICAgfQoKICAgIGZ1bmN0aW9uIGluaXRpYWxpemVOb2RlRGVwdGgoKSB7CiAgICAgIC8vIENhbGN1bGF0ZSB2ZXJ0aWNhbCBzY2FsaW5nIGZhY3Rvci4KICAgICAgdmFyIGt5ID0gZDMubWluKG5vZGVzQnlCcmVhZHRoLCBmdW5jdGlvbihub2RlcykgewogICAgICAgIHJldHVybiAoc2l6ZVsxXSAtIChub2Rlcy5sZW5ndGggLSAxKSAqIG5vZGVQYWRkaW5nKSAvIGQzLnN1bShub2RlcywgdmFsdWUpOwogICAgICB9KTsKCiAgICAgIG5vZGVzQnlCcmVhZHRoLmZvckVhY2goZnVuY3Rpb24obm9kZXMpIHsKICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUsIGkpIHsKICAgICAgICAgIG5vZGUueSA9IGk7CiAgICAgICAgICBub2RlLmR5ID0gbm9kZS52YWx1ZSAqIGt5OwogICAgICAgIH0pOwogICAgICB9KTsKCiAgICAgIGxpbmtzLmZvckVhY2goZnVuY3Rpb24obGluaykgewogICAgICAgIGxpbmsuZHkgPSBsaW5rLnZhbHVlICoga3k7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbGF4TGVmdFRvUmlnaHQoYWxwaGEpIHsKICAgICAgbm9kZXNCeUJyZWFkdGguZm9yRWFjaChmdW5jdGlvbihub2RlcywgYnJlYWR0aCkgewogICAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgewogICAgICAgICAgaWYgKG5vZGUudGFyZ2V0TGlua3MubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIFZhbHVlLXdlaWdodGVkIGF2ZXJhZ2Ugb2YgdGhlIHktcG9zaXRpb24gb2Ygc291cmNlIG5vZGUgY2VudGVycyBsaW5rZWQgdG8gdGhpcyBub2RlLgogICAgICAgICAgICB2YXIgeSA9IGQzLnN1bShub2RlLnRhcmdldExpbmtzLCB3ZWlnaHRlZFNvdXJjZSkgLyBkMy5zdW0obm9kZS50YXJnZXRMaW5rcywgdmFsdWUpOwogICAgICAgICAgICBub2RlLnkgKz0gKHkgLSBjZW50ZXIobm9kZSkpICogYWxwaGE7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgZnVuY3Rpb24gd2VpZ2h0ZWRTb3VyY2UobGluaykgewogICAgICAgIHJldHVybiAobGluay5zb3VyY2UueSArIGxpbmsuc3kgKyBsaW5rLmR5IC8gMikgKiBsaW5rLnZhbHVlOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVsYXhSaWdodFRvTGVmdChhbHBoYSkgewogICAgICBub2Rlc0J5QnJlYWR0aC5zbGljZSgpLnJldmVyc2UoKS5mb3JFYWNoKGZ1bmN0aW9uKG5vZGVzKSB7CiAgICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7CiAgICAgICAgICBpZiAobm9kZS5zb3VyY2VMaW5rcy5sZW5ndGgpIHsKICAgICAgICAgICAgLy8gVmFsdWUtd2VpZ2h0ZWQgYXZlcmFnZSBvZiB0aGUgeS1wb3NpdGlvbnMgb2YgdGFyZ2V0IG5vZGVzIGxpbmtlZCB0byB0aGlzIG5vZGUuCiAgICAgICAgICAgIHZhciB5ID0gZDMuc3VtKG5vZGUuc291cmNlTGlua3MsIHdlaWdodGVkVGFyZ2V0KSAvIGQzLnN1bShub2RlLnNvdXJjZUxpbmtzLCB2YWx1ZSk7CiAgICAgICAgICAgIG5vZGUueSArPSAoeSAtIGNlbnRlcihub2RlKSkgKiBhbHBoYTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBmdW5jdGlvbiB3ZWlnaHRlZFRhcmdldChsaW5rKSB7CiAgICAgICAgcmV0dXJuIChsaW5rLnRhcmdldC55ICsgbGluay50eSArIGxpbmsuZHkgLyAyKSAqIGxpbmsudmFsdWU7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZXNvbHZlQ29sbGlzaW9ucygpIHsKICAgICAgbm9kZXNCeUJyZWFkdGguZm9yRWFjaChmdW5jdGlvbihub2RlcykgewogICAgICAgIHZhciBub2RlLAogICAgICAgICAgICBkeSwKICAgICAgICAgICAgeTAgPSAwLAogICAgICAgICAgICBuID0gbm9kZXMubGVuZ3RoLAogICAgICAgICAgICBpOwoKICAgICAgICAvLyBQdXNoIGFueSBvdmVybGFwcGluZyBub2RlcyBkb3duLgogICAgICAgIG5vZGVzLnNvcnQoYXNjZW5kaW5nRGVwdGgpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIG5vZGUgPSBub2Rlc1tpXTsKICAgICAgICAgIGR5ID0geTAgLSBub2RlLnk7CiAgICAgICAgICBpZiAoZHkgPiAwKSBub2RlLnkgKz0gZHk7CiAgICAgICAgICB5MCA9IG5vZGUueSArIG5vZGUuZHkgKyBub2RlUGFkZGluZzsKICAgICAgICB9CgogICAgICAgIC8vIElmIHRoZSBib3R0b21tb3N0IG5vZGUgZ29lcyBvdXRzaWRlIHRoZSBib3VuZHMsIHB1c2ggaXQgYmFjayB1cC4KICAgICAgICBkeSA9IHkwIC0gbm9kZVBhZGRpbmcgLSBzaXplWzFdOwogICAgICAgIGlmIChkeSA+IDApIHsKICAgICAgICAgIHkwID0gbm9kZS55IC09IGR5OwoKICAgICAgICAgIC8vIFB1c2ggYW55IG92ZXJsYXBwaW5nIG5vZGVzIGJhY2sgdXAuCiAgICAgICAgICBmb3IgKGkgPSBuIC0gMjsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgICAgbm9kZSA9IG5vZGVzW2ldOwogICAgICAgICAgICBkeSA9IG5vZGUueSArIG5vZGUuZHkgKyBub2RlUGFkZGluZyAtIHkwOwogICAgICAgICAgICBpZiAoZHkgPiAwKSBub2RlLnkgLT0gZHk7CiAgICAgICAgICAgIHkwID0gbm9kZS55OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gYXNjZW5kaW5nRGVwdGgoYSwgYikgewogICAgICByZXR1cm4gYS55IC0gYi55OwogICAgfQogIH0KCiAgLy8gQ29tcHV0ZSB5LW9mZnNldCBvZiB0aGUgc291cmNlIGVuZHBvaW50IChzeSkgYW5kIHRhcmdldCBlbmRwb2ludHMgKHR5KSBvZiBsaW5rcywKICAvLyByZWxhdGl2ZSB0byB0aGUgc291cmNlL3RhcmdldCBub2RlJ3MgeS1wb3NpdGlvbi4KICBmdW5jdGlvbiBjb21wdXRlTGlua0RlcHRocygpIHsKICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgewogICAgICBub2RlLnNvdXJjZUxpbmtzLnNvcnQoYXNjZW5kaW5nVGFyZ2V0RGVwdGgpOwogICAgICBub2RlLnRhcmdldExpbmtzLnNvcnQoYXNjZW5kaW5nU291cmNlRGVwdGgpOwogICAgfSk7CiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgdmFyIHN5ID0gMCwgdHkgPSAwOwogICAgICBub2RlLnNvdXJjZUxpbmtzLmZvckVhY2goZnVuY3Rpb24obGluaykgewogICAgICAgIGxpbmsuc3kgPSBzeTsKICAgICAgICBzeSArPSBsaW5rLmR5OwogICAgICB9KTsKICAgICAgbm9kZS50YXJnZXRMaW5rcy5mb3JFYWNoKGZ1bmN0aW9uKGxpbmspIHsKICAgICAgICBsaW5rLnR5ID0gdHk7CiAgICAgICAgdHkgKz0gbGluay5keTsKICAgICAgfSk7CiAgICB9KTsKCiAgICBmdW5jdGlvbiBhc2NlbmRpbmdTb3VyY2VEZXB0aChhLCBiKSB7CiAgICAgIHJldHVybiBhLnNvdXJjZS55IC0gYi5zb3VyY2UueTsKICAgIH0KCiAgICBmdW5jdGlvbiBhc2NlbmRpbmdUYXJnZXREZXB0aChhLCBiKSB7CiAgICAgIHJldHVybiBhLnRhcmdldC55IC0gYi50YXJnZXQueTsKICAgIH0KICB9CgogIC8vIFktcG9zaXRpb24gb2YgdGhlIG1pZGRsZSBvZiBhIG5vZGUuCiAgZnVuY3Rpb24gY2VudGVyKG5vZGUpIHsKICAgIHJldHVybiBub2RlLnkgKyBub2RlLmR5IC8gMjsKICB9CgogIC8vIFZhbHVlIHByb3BlcnR5IGFjY2Vzc29yLgogIGZ1bmN0aW9uIHZhbHVlKHgpIHsKICAgIHJldHVybiB4LnZhbHVlOwogIH0KCiAgcmV0dXJuIHNhbmtleTsKfTs="></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsKCiAgICBuYW1lOiAic2Fua2V5TmV0d29yayIsCgogICAgdHlwZTogIm91dHB1dCIsCgogICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKCiAgICAgICAgZDMuc2VsZWN0KGVsKS5hcHBlbmQoInN2ZyIpCiAgICAgICAgICAgIC5zdHlsZSgid2lkdGgiLCAiMTAwJSIpCiAgICAgICAgICAgIC5zdHlsZSgiaGVpZ2h0IiwgIjEwMCUiKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHNhbmtleTogZDMuc2Fua2V5KCksCiAgICAgICAgICB4OiBudWxsCiAgICAgICAgfTsKICAgIH0sCgogICAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsKICAgICAgICAvKiAgaGFuZGxlIHJlc2l6aW5nIG5vdyB0aHJvdWdoIHRoZSB2aWV3Qm94CiAgICAgICAgZDMuc2VsZWN0KGVsKS5zZWxlY3QoInN2ZyIpCiAgICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsIHdpZHRoKQogICAgICAgICAgICAuYXR0cigiaGVpZ2h0IiwgaGVpZ2h0ICsgaGVpZ2h0ICogMC4wNSk7CgogICAgICAgIHRoaXMucmVuZGVyVmFsdWUoZWwsIGluc3RhbmNlLngsIGluc3RhbmNlKTsKICAgICAgICAqLwogICAgICAgIGRlYnVnZ2VyOwogICAgICAgIC8vIHdpdGggZmxleGRhc2hib2FyZCBhbmQgc2xpZGVzCiAgICAgICAgLy8gICBzYW5rZXkgbWlnaHQgYmUgaGlkZGVuIHNvIGhlaWdodCBhbmQgd2lkdGggMAogICAgICAgIC8vICAgaW4gdGhpcyBpbnN0YW5jZSByZS1yZW5kZXIgb24gcmVzaXplCiAgICAgICAgaWYoIGQzLm1pbihpbnN0YW5jZS5zYW5rZXkuc2l6ZSgpKSA8PSAwICkgewogICAgICAgICAgdGhpcy5yZW5kZXJWYWx1ZShlbCwgaW5zdGFuY2UueCwgaW5zdGFuY2UpOwogICAgICAgIH0KICAgIH0sCgogICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSkgewoKICAgICAgICAvLyBzYXZlIHRoZSB4IGluIG91ciBpbnN0YW5jZSAoZm9yIGNhbGxpbmcgYmFjayBmcm9tIHJlc2l6ZSkKICAgICAgICBpbnN0YW5jZS54ID0geDsKCiAgICAgICAgLy8gYWxpYXMgc2Fua2V5IGFuZCBvcHRpb25zCiAgICAgICAgdmFyIHNhbmtleSA9IGluc3RhbmNlLnNhbmtleTsKICAgICAgICB2YXIgb3B0aW9ucyA9IHgub3B0aW9uczsKCiAgICAgICAgLy8gY29udmVydCBsaW5rcyBhbmQgbm9kZXMgZGF0YSBmcmFtZXMgdG8gZDMgZnJpZW5kbHkgZm9ybWF0CiAgICAgICAgdmFyIGxpbmtzID0gSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyh4LmxpbmtzKTsKICAgICAgICB2YXIgbm9kZXMgPSBIVE1MV2lkZ2V0cy5kYXRhZnJhbWVUb0QzKHgubm9kZXMpOwoKCiAgICAgICAgLy8gbWFyZ2luIGhhbmRsaW5nCiAgICAgICAgLy8gICBzZXQgb3VyIGRlZmF1bHQgbWFyZ2luIHRvIGJlIDIwCiAgICAgICAgLy8gICB3aWxsIG92ZXJyaWRlIHdpdGggeC5vcHRpb25zLm1hcmdpbiBpZiBwcm92aWRlZAogICAgICAgIHZhciBtYXJnaW4gPSB7dG9wOiAyMCwgcmlnaHQ6IDIwLCBib3R0b206IDIwLCBsZWZ0OiAyMH07CiAgICAgICAgLy8gICBnbyB0aHJvdWdoIGVhY2gga2V5IG9mIHgub3B0aW9ucy5tYXJnaW4KICAgICAgICAvLyAgIHVzZSB0aGlzIHZhbHVlIGlmIHByb3ZpZGVkIGZyb20gdGhlIFIgc2lkZQogICAgICAgIE9iamVjdC5rZXlzKHgub3B0aW9ucy5tYXJnaW4pLm1hcChmdW5jdGlvbihreSl7CiAgICAgICAgICBpZih4Lm9wdGlvbnMubWFyZ2luW2t5XSAhPT0gbnVsbCkgewogICAgICAgICAgICBtYXJnaW5ba3ldID0geC5vcHRpb25zLm1hcmdpbltreV07CiAgICAgICAgICB9CiAgICAgICAgICAvLyBzZXQgdGhlIG1hcmdpbiBvbiB0aGUgc3ZnIHdpdGggY3NzIHN0eWxlCiAgICAgICAgICAvLyBjb21tZW50aW5nIHRoaXMgb3V0IHNpbmNlIG5vdCBjb3JyZWN0CiAgICAgICAgICAvLyBzLnN0eWxlKFsibWFyZ2luIixreV0uam9pbigiLSIpLCBtYXJnaW5ba3ldKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gZ2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0CiAgICAgICAgdmFyIHdpZHRoID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSBtYXJnaW4ucmlnaHQgLSBtYXJnaW4ubGVmdDsKICAgICAgICB2YXIgaGVpZ2h0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IC0gbWFyZ2luLnRvcCAtIG1hcmdpbi5ib3R0b207CgogICAgICAgIHZhciBjb2xvciA9IGV2YWwob3B0aW9ucy5jb2xvdXJTY2FsZSk7CgogICAgICAgIHZhciBjb2xvcl9ub2RlID0gZnVuY3Rpb24gY29sb3Jfbm9kZShkKXsKICAgICAgICAgIGlmIChkLmdyb3VwKXsKICAgICAgICAgICAgcmV0dXJuIGNvbG9yKGQuZ3JvdXAucmVwbGFjZSgvIC4qLywgIiIpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAiI2NjY2NjYyI7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgY29sb3JfbGluayA9IGZ1bmN0aW9uIGNvbG9yX2xpbmsoZCl7CiAgICAgICAgICBpZiAoZC5ncm91cCl7CiAgICAgICAgICAgIHJldHVybiBjb2xvcihkLmdyb3VwLnJlcGxhY2UoLyAuKi8sICIiKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIiMwMDAwMDAiOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmFyIG9wYWNpdHlfbGluayA9IGZ1bmN0aW9uIG9wYWNpdHlfbGluayhkKXsKICAgICAgICAgIGlmIChkLmdyb3VwKXsKICAgICAgICAgICAgcmV0dXJuIDAuNzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwLjI7CiAgICAgICAgICB9CiAgICAgICAgfQoKCiAgICAgICAgdmFyIGZvcm1hdE51bWJlciA9IGQzLmZvcm1hdCgiLC4wZiIpLAogICAgICAgIGZvcm1hdCA9IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGZvcm1hdE51bWJlcihkKTsgfQoKICAgICAgICAvLyBjcmVhdGUgZDMgc2Fua2V5IGxheW91dAogICAgICAgIHNhbmtleQogICAgICAgICAgICAubm9kZXMoZDMudmFsdWVzKG5vZGVzKSkKICAgICAgICAgICAgLmxpbmtzKGxpbmtzKQogICAgICAgICAgICAuc2l6ZShbd2lkdGgsIGhlaWdodF0pCiAgICAgICAgICAgIC5ub2RlV2lkdGgob3B0aW9ucy5ub2RlV2lkdGgpCiAgICAgICAgICAgIC5ub2RlUGFkZGluZyhvcHRpb25zLm5vZGVQYWRkaW5nKQogICAgICAgICAgICAubGF5b3V0KG9wdGlvbnMuaXRlcmF0aW9ucyk7CgogICAgICAgIC8vIHNlbGVjdCB0aGUgc3ZnIGVsZW1lbnQgYW5kIHJlbW92ZSBleGlzdGluZyBjaGlsZHJlbgogICAgICAgIGQzLnNlbGVjdChlbCkuc2VsZWN0KCJzdmciKS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTsKICAgICAgICAvLyByZW1vdmUgYW55IHByZXZpb3VzbHkgc2V0IHZpZXdCb3ggYXR0cmlidXRlCiAgICAgICAgZDMuc2VsZWN0KGVsKS5zZWxlY3QoInN2ZyIpLmF0dHIoInZpZXdCb3giLCBudWxsKTsKICAgICAgICAvLyBhcHBlbmQgZyBmb3Igb3VyIGNvbnRhaW5lciB0byB0cmFuc2Zvcm0gYnkgbWFyZ2luCiAgICAgICAgdmFyIHN2ZyA9IGQzLnNlbGVjdChlbCkuc2VsZWN0KCJzdmciKS5hcHBlbmQoImciKQogICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgbWFyZ2luLmxlZnQgKyAiLCIgKyBtYXJnaW4udG9wICsgIikiKTs7CgogICAgICAgIC8vIGRyYXcgcGF0aAogICAgICAgIHZhciBwYXRoID0gc2Fua2V5LmxpbmsoKTsKCiAgICAgICAgLy8gZHJhdyBsaW5rcwogICAgICAgIHZhciBsaW5rID0gc3ZnLnNlbGVjdEFsbCgiLmxpbmsiKQogICAgICAgICAgICAuZGF0YShzYW5rZXkubGlua3MoKSkKCiAgICAgICAgbGluay5lbnRlcigpLmFwcGVuZCgicGF0aCIpCiAgICAgICAgICAgIC5hdHRyKCJjbGFzcyIsICJsaW5rIikKCiAgICAgICAgbGluawogICAgICAgICAgICAuYXR0cigiZCIsIHBhdGgpCiAgICAgICAgICAgIC5zdHlsZSgic3Ryb2tlLXdpZHRoIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gTWF0aC5tYXgoMSwgZC5keSk7IH0pCiAgICAgICAgICAgIC5zdHlsZSgiZmlsbCIsICJub25lIikKICAgICAgICAgICAgLnN0eWxlKCJzdHJva2UiLCBjb2xvcl9saW5rKQogICAgICAgICAgICAuc3R5bGUoInN0cm9rZS1vcGFjaXR5Iiwgb3BhY2l0eV9saW5rKQogICAgICAgICAgICAuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBiLmR5IC0gYS5keTsgfSkKICAgICAgICAgICAgLm9uKCJtb3VzZW92ZXIiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICBkMy5zZWxlY3QodGhpcykKICAgICAgICAgICAgICAgIC5zdHlsZSgic3Ryb2tlLW9wYWNpdHkiLCBmdW5jdGlvbihkKXtyZXR1cm4gb3BhY2l0eV9saW5rKGQpICsgMC4zfSk7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5vbigibW91c2VvdXQiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICBkMy5zZWxlY3QodGhpcykKICAgICAgICAgICAgICAgIC5zdHlsZSgic3Ryb2tlLW9wYWNpdHkiLCBvcGFjaXR5X2xpbmspOwogICAgICAgICAgICB9KTsKCiAgICAgICAgLy8gYWRkIGJhY2t3YXJkcyBjbGFzcyB0byBjeWNsZXMKICAgICAgICBsaW5rLmNsYXNzZWQoJ2JhY2t3YXJkcycsIGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLnRhcmdldC54IDwgZC5zb3VyY2UueDsgfSk7CgogICAgICAgIHN2Zy5zZWxlY3RBbGwoIi5saW5rLmJhY2t3YXJkcyIpCiAgICAgICAgICAgIC5zdHlsZSgic3Ryb2tlLWRhc2hhcnJheSIsIjksMSIpCiAgICAgICAgICAgIC5zdHlsZSgic3Ryb2tlIiwiIzQwMiIpCgogICAgICAgIC8vIGRyYXcgbm9kZXMKICAgICAgICB2YXIgbm9kZSA9IHN2Zy5zZWxlY3RBbGwoIi5ub2RlIikKICAgICAgICAgICAgLmRhdGEoc2Fua2V5Lm5vZGVzKCkpCgogICAgICAgIG5vZGUuZW50ZXIoKS5hcHBlbmQoImciKQogICAgICAgICAgICAuYXR0cigiY2xhc3MiLCAibm9kZSIpCiAgICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7IHJldHVybiAidHJhbnNsYXRlKCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQueCArICIsIiArIGQueSArICIpIjsgfSkKICAgICAgICAgICAgLmNhbGwoZDMuYmVoYXZpb3IuZHJhZygpCiAgICAgICAgICAgIC5vcmlnaW4oZnVuY3Rpb24oZCkgeyByZXR1cm4gZDsgfSkKICAgICAgICAgICAgLm9uKCJkcmFnc3RhcnQiLCBmdW5jdGlvbigpIHsgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpOyB9KQogICAgICAgICAgICAub24oImRyYWciLCBkcmFnbW92ZSkpCiAgICAgICAgICAgIC5vbigibW91c2VvdmVyIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgbGluay5maWx0ZXIoZnVuY3Rpb24oZDEsIGkpIHsgcmV0dXJuIGQudGFyZ2V0TGlua3MuaW5jbHVkZXMoZDEpIHwgZC5zb3VyY2VMaW5rcy5pbmNsdWRlcyhkMSk7IH0pCiAgICAgICAgICAgICAgICAgLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsIGZ1bmN0aW9uKGQpe3JldHVybiBvcGFjaXR5X2xpbmsoZCkgKyAwLjN9KTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLm9uKCJtb3VzZW91dCIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgIGxpbmsuZmlsdGVyKGZ1bmN0aW9uKGQxLCBpKSB7IHJldHVybiBkLnRhcmdldExpbmtzLmluY2x1ZGVzKGQxKSB8IGQuc291cmNlTGlua3MuaW5jbHVkZXMoZDEpOyB9KQogICAgICAgICAgICAgICAgLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsIG9wYWNpdHlfbGluayk7CiAgICAgICAgICAgIH0pOwogICAgICAgIC8vIG5vdGU6IHUyMTkyIGlzIHJpZ2h0LWFycm93CiAgICAgICAgbGluay5hcHBlbmQoInRpdGxlIikKICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5zb3VyY2UubmFtZSArICIgXHUyMTkyICIgKyBkLnRhcmdldC5uYW1lICsKICAgICAgICAgICAgICAgICJcbiIgKyBmb3JtYXQoZC52YWx1ZSkgKyAiICIgKyBvcHRpb25zLnVuaXRzOyB9KTsKCiAgICAgICAgbm9kZS5hcHBlbmQoInJlY3QiKQogICAgICAgICAgICAuYXR0cigiaGVpZ2h0IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5keTsgfSkKICAgICAgICAgICAgLmF0dHIoIndpZHRoIiwgc2Fua2V5Lm5vZGVXaWR0aCgpKQogICAgICAgICAgICAuc3R5bGUoImZpbGwiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZC5jb2xvciA9IGNvbG9yX25vZGUoZCk7IH0pCiAgICAgICAgICAgIC5zdHlsZSgic3Ryb2tlIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZDMucmdiKGQuY29sb3IpLmRhcmtlcigyKTsgfSkKICAgICAgICAgICAgLnN0eWxlKCJvcGFjaXR5IiwgMC45KQogICAgICAgICAgICAuc3R5bGUoImN1cnNvciIsICJtb3ZlIikKICAgICAgICAgICAgLmFwcGVuZCgidGl0bGUiKQogICAgICAgICAgICAudGV4dChmdW5jdGlvbihkKSB7IHJldHVybiBkLm5hbWUgKyAiPGJyPiIgKyBmb3JtYXQoZC52YWx1ZSkgKyAKICAgICAgICAgICAgICAgICIgIiArIG9wdGlvbnMudW5pdHM7IH0pOwoKICAgICAgICBub2RlLmFwcGVuZCgidGV4dCIpCiAgICAgICAgICAgIC5hdHRyKCJ4IiwgLTYpCiAgICAgICAgICAgIC5hdHRyKCJ5IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5keSAvIDI7IH0pCiAgICAgICAgICAgIC5hdHRyKCJkeSIsICIuMzVlbSIpCiAgICAgICAgICAgIC5hdHRyKCJ0ZXh0LWFuY2hvciIsICJlbmQiKQogICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgbnVsbCkKICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5uYW1lOyB9KQogICAgICAgICAgICAuc3R5bGUoImZvbnQtc2l6ZSIsIG9wdGlvbnMuZm9udFNpemUgKyAicHgiKQogICAgICAgICAgICAuc3R5bGUoImZvbnQtZmFtaWx5Iiwgb3B0aW9ucy5mb250RmFtaWx5ID8gb3B0aW9ucy5mb250RmFtaWx5IDogImluaGVyaXQiKQogICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQueCA8IHdpZHRoIC8gMjsgfSkKICAgICAgICAgICAgLmF0dHIoIngiLCA2ICsgc2Fua2V5Lm5vZGVXaWR0aCgpKQogICAgICAgICAgICAuYXR0cigidGV4dC1hbmNob3IiLCAic3RhcnQiKTsKCgogICAgICAgIC8vIGFkanVzdCB2aWV3Qm94IHRvIGZpdCB0aGUgYm91bmRzIG9mIG91ciB0cmVlCiAgICAgICAgdmFyIHMgPSBkMy5zZWxlY3Qoc3ZnWzBdWzBdLnBhcmVudE5vZGUpOwogICAgICAgIHMuYXR0cigKICAgICAgICAgICAgInZpZXdCb3giLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgZDMubWluKAogICAgICAgICAgICAgICAgcy5zZWxlY3RBbGwoJ2cnKVswXS5tYXAoZnVuY3Rpb24oZCl7CiAgICAgICAgICAgICAgICAgIHJldHVybiBkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgKSAtIHMubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBtYXJnaW4ucmlnaHQsCiAgICAgICAgICAgICAgZDMubWluKAogICAgICAgICAgICAgICAgcy5zZWxlY3RBbGwoJ2cnKVswXS5tYXAoZnVuY3Rpb24oZCl7CiAgICAgICAgICAgICAgICAgIHJldHVybiBkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcAogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICApIC0gcy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gbWFyZ2luLnRvcCwKICAgICAgICAgICAgICBkMy5tYXgoCiAgICAgICAgICAgICAgICBzLnNlbGVjdEFsbCgnZycpWzBdLm1hcChmdW5jdGlvbihkKXsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgKSAtCiAgICAgICAgICAgICAgZDMubWluKAogICAgICAgICAgICAgICAgcy5zZWxlY3RBbGwoJ2cnKVswXS5tYXAoZnVuY3Rpb24oZCl7CiAgICAgICAgICAgICAgICAgIHJldHVybiBkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgKSAgKyBtYXJnaW4ubGVmdCArIG1hcmdpbi5yaWdodCwKICAgICAgICAgICAgICBkMy5tYXgoCiAgICAgICAgICAgICAgICBzLnNlbGVjdEFsbCgnZycpWzBdLm1hcChmdW5jdGlvbihkKXsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICkgLQogICAgICAgICAgICAgIGQzLm1pbigKICAgICAgICAgICAgICAgIHMuc2VsZWN0QWxsKCdnJylbMF0ubWFwKGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgICAgICByZXR1cm4gZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgKSArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tCiAgICAgICAgICAgIF0uam9pbigiLCIpCiAgICAgICAgICApOwoKCiAgICAgICAgZnVuY3Rpb24gZHJhZ21vdmUoZCkgewogICAgICAgICAgICBkMy5zZWxlY3QodGhpcykuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgZC54ICsgIiwiICsKICAgICAgICAgICAgKGQueSA9IE1hdGgubWF4KDAsIE1hdGgubWluKGhlaWdodCAtIGQuZHksIGQzLmV2ZW50LnkpKSkgKyAiKSIpOwogICAgICAgICAgICBzYW5rZXkucmVsYXlvdXQoKTsKICAgICAgICAgICAgbGluay5hdHRyKCJkIiwgcGF0aCk7CiAgICAgICAgfQogICAgfSwKfSk7Cg=="></script>
<script src="data:application/x-javascript;base64,d2luZG93LmRvd25sb2FkRmlsZSA9IGZ1bmN0aW9uIChzVXJsKSB7DQoNCiAgICAvL2lPUyBkZXZpY2VzIGRvIG5vdCBzdXBwb3J0IGRvd25sb2FkaW5nLiBXZSBoYXZlIHRvIGluZm9ybSB1c2VyIGFib3V0IHRoaXMuDQogICAgaWYgKC8oaVApL2cudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgew0KICAgICAgICBhbGVydCgnWW91ciBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBmaWxlcyBkb3dubG9hZGluZy4gUGxlYXNlIHRyeSBhZ2FpbiBpbiBkZXNrdG9wIGJyb3dzZXIuJyk7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICAvL0lmIGluIENocm9tZSBvciBTYWZhcmkgLSBkb3dubG9hZCB2aWEgdmlydHVhbCBsaW5rIGNsaWNrDQogICAgLy9pZiAod2luZG93LmRvd25sb2FkRmlsZS5pc0Nocm9tZSB8fCB3aW5kb3cuZG93bmxvYWRGaWxlLmlzU2FmYXJpKSB7DQogICAgICAgIC8vQ3JlYXRpbmcgbmV3IGxpbmsgbm9kZS4NCiAgICAgICAgdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQogICAgICAgIGxpbmsuaHJlZiA9IHNVcmw7DQoNCiAgICAgICAgaWYgKGxpbmsuZG93bmxvYWQgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgLy9TZXQgSFRNTDUgZG93bmxvYWQgYXR0cmlidXRlLiBUaGlzIHdpbGwgcHJldmVudCBmaWxlIGZyb20gb3BlbmluZyBpZiBzdXBwb3J0ZWQuDQogICAgICAgICAgICB2YXIgZmlsZU5hbWUgPSAnd2lkZ2V0LnBuZyc7DQogICAgICAgICAgICBsaW5rLmRvd25sb2FkID0gZmlsZU5hbWU7DQogICAgICAgIH0NCg0KICAgICAgICAvL0Rpc3BhdGNoaW5nIGNsaWNrIGV2ZW50Lg0KICAgICAgICBpZiAoZG9jdW1lbnQuY3JlYXRlRXZlbnQpIHsNCiAgICAgICAgICAgIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJyk7DQogICAgICAgICAgICBlLmluaXRFdmVudCgnY2xpY2snLCB0cnVlLCB0cnVlKTsNCiAgICAgICAgICAgIGxpbmsuZGlzcGF0Y2hFdmVudChlKTsNCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9DQovLyAgICB9DQoNCi8qDQogICAgLy8gRm9yY2UgZmlsZSBkb3dubG9hZCAod2hldGhlciBzdXBwb3J0ZWQgYnkgc2VydmVyKS4NCiAgICBpZiAoc1VybC5pbmRleE9mKCc/JykgPT09IC0xKSB7DQogICAgICAgIHNVcmwgKz0gJz9kb3dubG9hZCc7DQogICAgfQ0KDQogICAgd2luZG93Lm9wZW4oc1VybCwgJ19zZWxmJyk7DQoqLw0KICAgIHJldHVybiB0cnVlOw0KfQ0KDQp3aW5kb3cuZG93bmxvYWRGaWxlLmlzQ2hyb21lID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2Nocm9tZScpID4gLTE7DQp3aW5kb3cuZG93bmxvYWRGaWxlLmlzU2FmYXJpID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3NhZmFyaScpID4gLTE7DQo="></script>
<script src="data:application/x-javascript;base64,dmFyIGZhYnJpYz1mYWJyaWN8fHt2ZXJzaW9uOiIxLjYuNiJ9OyJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cyYmKGV4cG9ydHMuZmFicmljPWZhYnJpYyksInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/KGZhYnJpYy5kb2N1bWVudD1kb2N1bWVudCxmYWJyaWMud2luZG93PXdpbmRvdyx3aW5kb3cuZmFicmljPWZhYnJpYyk6KGZhYnJpYy5kb2N1bWVudD1yZXF1aXJlKCJqc2RvbSIpLmpzZG9tKCI8IURPQ1RZUEUgaHRtbD48aHRtbD48aGVhZD48L2hlYWQ+PGJvZHk+PC9ib2R5PjwvaHRtbD4iKSxmYWJyaWMuZG9jdW1lbnQuY3JlYXRlV2luZG93P2ZhYnJpYy53aW5kb3c9ZmFicmljLmRvY3VtZW50LmNyZWF0ZVdpbmRvdygpOmZhYnJpYy53aW5kb3c9ZmFicmljLmRvY3VtZW50LnBhcmVudFdpbmRvdyksZmFicmljLmlzVG91Y2hTdXBwb3J0ZWQ9Im9udG91Y2hzdGFydCJpbiBmYWJyaWMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGZhYnJpYy5pc0xpa2VseU5vZGU9InVuZGVmaW5lZCIhPXR5cGVvZiBCdWZmZXImJiJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93LGZhYnJpYy5TSEFSRURfQVRUUklCVVRFUz1bImRpc3BsYXkiLCJ0cmFuc2Zvcm0iLCJmaWxsIiwiZmlsbC1vcGFjaXR5IiwiZmlsbC1ydWxlIiwib3BhY2l0eSIsInN0cm9rZSIsInN0cm9rZS1kYXNoYXJyYXkiLCJzdHJva2UtbGluZWNhcCIsInN0cm9rZS1saW5lam9pbiIsInN0cm9rZS1taXRlcmxpbWl0Iiwic3Ryb2tlLW9wYWNpdHkiLCJzdHJva2Utd2lkdGgiLCJpZCJdLGZhYnJpYy5EUEk9OTYsZmFicmljLnJlTnVtPSIoPzpbLStdPyg/OlxcZCt8XFxkKlxcLlxcZCspKD86ZVstK10/XFxkKyk/KSIsZmFicmljLmZvbnRQYXRocz17fSxmYWJyaWMuY2hhcldpZHRoc0NhY2hlPXt9LGZhYnJpYy5kZXZpY2VQaXhlbFJhdGlvPWZhYnJpYy53aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8ZmFicmljLndpbmRvdy53ZWJraXREZXZpY2VQaXhlbFJhdGlvfHxmYWJyaWMud2luZG93Lm1vekRldmljZVBpeGVsUmF0aW98fDEsZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7aWYodGhpcy5fX2V2ZW50TGlzdGVuZXJzW3RdKXt2YXIgaT10aGlzLl9fZXZlbnRMaXN0ZW5lcnNbdF07ZT9pW2kuaW5kZXhPZihlKV09ITE6ZmFicmljLnV0aWwuYXJyYXkuZmlsbChpLCExKX19ZnVuY3Rpb24gZSh0LGUpe2lmKHRoaXMuX19ldmVudExpc3RlbmVyc3x8KHRoaXMuX19ldmVudExpc3RlbmVycz17fSksMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBpIGluIHQpdGhpcy5vbihpLHRbaV0pO2Vsc2UgdGhpcy5fX2V2ZW50TGlzdGVuZXJzW3RdfHwodGhpcy5fX2V2ZW50TGlzdGVuZXJzW3RdPVtdKSx0aGlzLl9fZXZlbnRMaXN0ZW5lcnNbdF0ucHVzaChlKTtyZXR1cm4gdGhpc31mdW5jdGlvbiBpKGUsaSl7aWYodGhpcy5fX2V2ZW50TGlzdGVuZXJzKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClmb3IoZSBpbiB0aGlzLl9fZXZlbnRMaXN0ZW5lcnMpdC5jYWxsKHRoaXMsZSk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCYmIm9iamVjdCI9PXR5cGVvZiBhcmd1bWVudHNbMF0pZm9yKHZhciByIGluIGUpdC5jYWxsKHRoaXMscixlW3JdKTtlbHNlIHQuY2FsbCh0aGlzLGUsaSk7cmV0dXJuIHRoaXN9fWZ1bmN0aW9uIHIodCxlKXtpZih0aGlzLl9fZXZlbnRMaXN0ZW5lcnMpe3ZhciBpPXRoaXMuX19ldmVudExpc3RlbmVyc1t0XTtpZihpKXtmb3IodmFyIHI9MCxuPWkubGVuZ3RoO3I8bjtyKyspaVtyXSYmaVtyXS5jYWxsKHRoaXMsZXx8e30pO3JldHVybiB0aGlzLl9fZXZlbnRMaXN0ZW5lcnNbdF09aS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQhPT0hMX0pLHRoaXN9fX1mYWJyaWMuT2JzZXJ2YWJsZT17b2JzZXJ2ZTplLHN0b3BPYnNlcnZpbmc6aSxmaXJlOnIsb246ZSxvZmY6aSx0cmlnZ2VyOnJ9fSgpLGZhYnJpYy5Db2xsZWN0aW9uPXtfb2JqZWN0czpbXSxhZGQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9vYmplY3RzLnB1c2guYXBwbHkodGhpcy5fb2JqZWN0cyxhcmd1bWVudHMpLHRoaXMuX29uT2JqZWN0QWRkZWQpZm9yKHZhciB0PTAsZT1hcmd1bWVudHMubGVuZ3RoO3Q8ZTt0KyspdGhpcy5fb25PYmplY3RBZGRlZChhcmd1bWVudHNbdF0pO3JldHVybiB0aGlzLnJlbmRlck9uQWRkUmVtb3ZlJiZ0aGlzLnJlbmRlckFsbCgpLHRoaXN9LGluc2VydEF0OmZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLmdldE9iamVjdHMoKTtyZXR1cm4gaT9yW2VdPXQ6ci5zcGxpY2UoZSwwLHQpLHRoaXMuX29uT2JqZWN0QWRkZWQmJnRoaXMuX29uT2JqZWN0QWRkZWQodCksdGhpcy5yZW5kZXJPbkFkZFJlbW92ZSYmdGhpcy5yZW5kZXJBbGwoKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtmb3IodmFyIHQsZT10aGlzLmdldE9iamVjdHMoKSxpPSExLHI9MCxuPWFyZ3VtZW50cy5sZW5ndGg7cjxuO3IrKyl0PWUuaW5kZXhPZihhcmd1bWVudHNbcl0pLHQhPT0tMSYmKGk9ITAsZS5zcGxpY2UodCwxKSx0aGlzLl9vbk9iamVjdFJlbW92ZWQmJnRoaXMuX29uT2JqZWN0UmVtb3ZlZChhcmd1bWVudHNbcl0pKTtyZXR1cm4gdGhpcy5yZW5kZXJPbkFkZFJlbW92ZSYmaSYmdGhpcy5yZW5kZXJBbGwoKSx0aGlzfSxmb3JFYWNoT2JqZWN0OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXRoaXMuZ2V0T2JqZWN0cygpLHI9MCxuPWkubGVuZ3RoO3I8bjtyKyspdC5jYWxsKGUsaVtyXSxyLGkpO3JldHVybiB0aGlzfSxnZXRPYmplY3RzOmZ1bmN0aW9uKHQpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgdD90aGlzLl9vYmplY3RzOnRoaXMuX29iamVjdHMuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT10fSl9LGl0ZW06ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0cygpW3RdfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmdldE9iamVjdHMoKS5sZW5ndGh9LHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RzKCkubGVuZ3RofSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRPYmplY3RzKCkuaW5kZXhPZih0KT4tMX0sY29tcGxleGl0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9iamVjdHMoKS5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCs9ZS5jb21wbGV4aXR5P2UuY29tcGxleGl0eSgpOjB9LDApfX0sZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5zcXJ0LGk9TWF0aC5hdGFuMixyPU1hdGgucG93LG49TWF0aC5hYnMscz1NYXRoLlBJLzE4MDtmYWJyaWMudXRpbD17cmVtb3ZlRnJvbUFycmF5OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5pbmRleE9mKGUpO3JldHVybiBpIT09LTEmJnQuc3BsaWNlKGksMSksdH0sZ2V0UmFuZG9tSW50OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSooZS10KzEpKSt0fSxkZWdyZWVzVG9SYWRpYW5zOmZ1bmN0aW9uKHQpe3JldHVybiB0KnN9LHJhZGlhbnNUb0RlZ3JlZXM6ZnVuY3Rpb24odCl7cmV0dXJuIHQvc30scm90YXRlUG9pbnQ6ZnVuY3Rpb24odCxlLGkpe3Quc3VidHJhY3RFcXVhbHMoZSk7dmFyIHI9ZmFicmljLnV0aWwucm90YXRlVmVjdG9yKHQsaSk7cmV0dXJuIG5ldyBmYWJyaWMuUG9pbnQoci54LHIueSkuYWRkRXF1YWxzKGUpfSxyb3RhdGVWZWN0b3I6ZnVuY3Rpb24odCxlKXt2YXIgaT1NYXRoLnNpbihlKSxyPU1hdGguY29zKGUpLG49dC54KnItdC55Kmkscz10LngqaSt0LnkqcjtyZXR1cm57eDpuLHk6c319LHRyYW5zZm9ybVBvaW50OmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gaT9uZXcgZmFicmljLlBvaW50KGVbMF0qdC54K2VbMl0qdC55LGVbMV0qdC54K2VbM10qdC55KTpuZXcgZmFicmljLlBvaW50KGVbMF0qdC54K2VbMl0qdC55K2VbNF0sZVsxXSp0LngrZVszXSp0LnkrZVs1XSl9LG1ha2VCb3VuZGluZ0JveEZyb21Qb2ludHM6ZnVuY3Rpb24odCl7dmFyIGU9W3RbMF0ueCx0WzFdLngsdFsyXS54LHRbM10ueF0saT1mYWJyaWMudXRpbC5hcnJheS5taW4oZSkscj1mYWJyaWMudXRpbC5hcnJheS5tYXgoZSksbj1NYXRoLmFicyhpLXIpLHM9W3RbMF0ueSx0WzFdLnksdFsyXS55LHRbM10ueV0sbz1mYWJyaWMudXRpbC5hcnJheS5taW4ocyksYT1mYWJyaWMudXRpbC5hcnJheS5tYXgocyksaD1NYXRoLmFicyhvLWEpO3JldHVybntsZWZ0OmksdG9wOm8sd2lkdGg6bixoZWlnaHQ6aH19LGludmVydFRyYW5zZm9ybTpmdW5jdGlvbih0KXt2YXIgZT0xLyh0WzBdKnRbM10tdFsxXSp0WzJdKSxpPVtlKnRbM10sLWUqdFsxXSwtZSp0WzJdLGUqdFswXV0scj1mYWJyaWMudXRpbC50cmFuc2Zvcm1Qb2ludCh7eDp0WzRdLHk6dFs1XX0saSwhMCk7cmV0dXJuIGlbNF09LXIueCxpWzVdPS1yLnksaX0sdG9GaXhlZDpmdW5jdGlvbih0LGUpe3JldHVybiBwYXJzZUZsb2F0KE51bWJlcih0KS50b0ZpeGVkKGUpKX0scGFyc2VVbml0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9L1xEezAsMn0kLy5leGVjKHQpLHI9cGFyc2VGbG9hdCh0KTtzd2l0Y2goZXx8KGU9ZmFicmljLlRleHQuREVGQVVMVF9TVkdfRk9OVF9TSVpFKSxpWzBdKXtjYXNlIm1tIjpyZXR1cm4gcipmYWJyaWMuRFBJLzI1LjQ7Y2FzZSJjbSI6cmV0dXJuIHIqZmFicmljLkRQSS8yLjU0O2Nhc2UiaW4iOnJldHVybiByKmZhYnJpYy5EUEk7Y2FzZSJwdCI6cmV0dXJuIHIqZmFicmljLkRQSS83MjtjYXNlInBjIjpyZXR1cm4gcipmYWJyaWMuRFBJLzcyKjEyO2Nhc2UiZW0iOnJldHVybiByKmU7ZGVmYXVsdDpyZXR1cm4gcn19LGZhbHNlRnVuY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZ2V0S2xhc3M6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1mYWJyaWMudXRpbC5zdHJpbmcuY2FtZWxpemUodC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpKSxmYWJyaWMudXRpbC5yZXNvbHZlTmFtZXNwYWNlKGUpW3RdfSxyZXNvbHZlTmFtZXNwYWNlOmZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiBmYWJyaWM7dmFyIGkscj1lLnNwbGl0KCIuIiksbj1yLmxlbmd0aCxzPXR8fGZhYnJpYy53aW5kb3c7Zm9yKGk9MDtpPG47KytpKXM9c1tyW2ldXTtyZXR1cm4gc30sbG9hZEltYWdlOmZ1bmN0aW9uKHQsZSxpLHIpe2lmKCF0KXJldHVybiB2b2lkKGUmJmUuY2FsbChpLHQpKTt2YXIgbj1mYWJyaWMudXRpbC5jcmVhdGVJbWFnZSgpO24ub25sb2FkPWZ1bmN0aW9uKCl7ZSYmZS5jYWxsKGksbiksbj1uLm9ubG9hZD1uLm9uZXJyb3I9bnVsbH0sbi5vbmVycm9yPWZ1bmN0aW9uKCl7ZmFicmljLmxvZygiRXJyb3IgbG9hZGluZyAiK24uc3JjKSxlJiZlLmNhbGwoaSxudWxsLCEwKSxuPW4ub25sb2FkPW4ub25lcnJvcj1udWxsfSwwIT09dC5pbmRleE9mKCJkYXRhIikmJnImJihuLmNyb3NzT3JpZ2luPXIpLG4uc3JjPXR9LGVubGl2ZW5PYmplY3RzOmZ1bmN0aW9uKHQsZSxpLHIpe2Z1bmN0aW9uIG4oKXsrK289PT1hJiZlJiZlKHMpfXQ9dHx8W107dmFyIHM9W10sbz0wLGE9dC5sZW5ndGg7cmV0dXJuIGE/dm9pZCB0LmZvckVhY2goZnVuY3Rpb24odCxlKXtpZighdHx8IXQudHlwZSlyZXR1cm4gdm9pZCBuKCk7dmFyIG89ZmFicmljLnV0aWwuZ2V0S2xhc3ModC50eXBlLGkpO28uYXN5bmM/by5mcm9tT2JqZWN0KHQsZnVuY3Rpb24oaSxvKXtvfHwoc1tlXT1pLHImJnIodCxzW2VdKSksbigpfSk6KHNbZV09by5mcm9tT2JqZWN0KHQpLHImJnIodCxzW2VdKSxuKCkpfSk6dm9pZChlJiZlKHMpKX0sZ3JvdXBTVkdFbGVtZW50czpmdW5jdGlvbih0LGUsaSl7dmFyIHI7cmV0dXJuIHI9bmV3IGZhYnJpYy5QYXRoR3JvdXAodCxlKSwidW5kZWZpbmVkIiE9dHlwZW9mIGkmJnIuc2V0U291cmNlUGF0aChpKSxyfSxwb3B1bGF0ZVdpdGhQcm9wZXJ0aWVzOmZ1bmN0aW9uKHQsZSxpKXtpZihpJiYiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGkpKWZvcih2YXIgcj0wLG49aS5sZW5ndGg7cjxuO3IrKylpW3JdaW4gdCYmKGVbaVtyXV09dFtpW3JdXSl9LGRyYXdEYXNoZWRMaW5lOmZ1bmN0aW9uKHQscixuLHMsbyxhKXt2YXIgaD1zLXIsYz1vLW4sbD1lKGgqaCtjKmMpLHU9aShjLGgpLGY9YS5sZW5ndGgsZD0wLGc9ITA7Zm9yKHQuc2F2ZSgpLHQudHJhbnNsYXRlKHIsbiksdC5tb3ZlVG8oMCwwKSx0LnJvdGF0ZSh1KSxyPTA7bD5yOylyKz1hW2QrKyVmXSxyPmwmJihyPWwpLHRbZz8ibGluZVRvIjoibW92ZVRvIl0ociwwKSxnPSFnO3QucmVzdG9yZSgpfSxjcmVhdGVDYW52YXNFbGVtZW50OmZ1bmN0aW9uKHQpe3JldHVybiB0fHwodD1mYWJyaWMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikpLHQuZ2V0Q29udGV4dHx8InVuZGVmaW5lZCI9PXR5cGVvZiBHX3ZtbENhbnZhc01hbmFnZXJ8fEdfdm1sQ2FudmFzTWFuYWdlci5pbml0RWxlbWVudCh0KSx0fSxjcmVhdGVJbWFnZTpmdW5jdGlvbigpe3JldHVybiBmYWJyaWMuaXNMaWtlbHlOb2RlP25ldyhyZXF1aXJlKCJjYW52YXMiKS5JbWFnZSk6ZmFicmljLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpfSxjcmVhdGVBY2Nlc3NvcnM6ZnVuY3Rpb24odCl7dmFyIGUsaSxyLG4scyxvPXQucHJvdG90eXBlO2ZvcihlPW8uc3RhdGVQcm9wZXJ0aWVzLmxlbmd0aDtlLS07KWk9by5zdGF0ZVByb3BlcnRpZXNbZV0scj1pLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2kuc2xpY2UoMSksbj0ic2V0IityLHM9ImdldCIrcixvW3NdfHwob1tzXT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcy5nZXQoIicrdCsnIiknKX0oaSkpLG9bbl18fChvW25dPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRnVuY3Rpb24oInZhbHVlIiwncmV0dXJuIHRoaXMuc2V0KCInK3QrJyIsIHZhbHVlKScpfShpKSl9LGNsaXBDb250ZXh0OmZ1bmN0aW9uKHQsZSl7ZS5zYXZlKCksZS5iZWdpblBhdGgoKSx0LmNsaXBUbyhlKSxlLmNsaXAoKX0sbXVsdGlwbHlUcmFuc2Zvcm1NYXRyaWNlczpmdW5jdGlvbih0LGUsaSl7cmV0dXJuW3RbMF0qZVswXSt0WzJdKmVbMV0sdFsxXSplWzBdK3RbM10qZVsxXSx0WzBdKmVbMl0rdFsyXSplWzNdLHRbMV0qZVsyXSt0WzNdKmVbM10saT8wOnRbMF0qZVs0XSt0WzJdKmVbNV0rdFs0XSxpPzA6dFsxXSplWzRdK3RbM10qZVs1XSt0WzVdXX0scXJEZWNvbXBvc2U6ZnVuY3Rpb24odCl7dmFyIG49aSh0WzFdLHRbMF0pLG89cih0WzBdLDIpK3IodFsxXSwyKSxhPWUobyksaD0odFswXSp0WzNdLXRbMl0qdFsxXSkvYSxjPWkodFswXSp0WzJdK3RbMV0qdFszXSxvKTtyZXR1cm57YW5nbGU6bi9zLHNjYWxlWDphLHNjYWxlWTpoLHNrZXdYOmMvcyxza2V3WTowLHRyYW5zbGF0ZVg6dFs0XSx0cmFuc2xhdGVZOnRbNV19fSxjdXN0b21UcmFuc2Zvcm1NYXRyaXg6ZnVuY3Rpb24odCxlLGkpe3ZhciByPVsxLDAsbihNYXRoLnRhbihpKnMpKSwxXSxvPVtuKHQpLDAsMCxuKGUpXTtyZXR1cm4gZmFicmljLnV0aWwubXVsdGlwbHlUcmFuc2Zvcm1NYXRyaWNlcyhvLHIsITApfSxyZXNldE9iamVjdFRyYW5zZm9ybTpmdW5jdGlvbih0KXt0LnNjYWxlWD0xLHQuc2NhbGVZPTEsdC5za2V3WD0wLHQuc2tld1k9MCx0LmZsaXBYPSExLHQuZmxpcFk9ITEsdC5zZXRBbmdsZSgwKX0sZ2V0RnVuY3Rpb25Cb2R5OmZ1bmN0aW9uKHQpe3JldHVybihTdHJpbmcodCkubWF0Y2goL2Z1bmN0aW9uW157XSpceyhbXHNcU10qKVx9Lyl8fHt9KVsxXX0saXNUcmFuc3BhcmVudDpmdW5jdGlvbih0LGUsaSxyKXtyPjAmJihlPnI/ZS09cjplPTAsaT5yP2ktPXI6aT0wKTt2YXIgbixzLG89ITAsYT10LmdldEltYWdlRGF0YShlLGksMipyfHwxLDIqcnx8MSksaD1hLmRhdGEubGVuZ3RoO2ZvcihuPTM7bjxoJiYocz1hLmRhdGFbbl0sbz1zPD0wLG8hPT0hMSk7bis9NCk7cmV0dXJuIGE9bnVsbCxvfSxwYXJzZVByZXNlcnZlQXNwZWN0UmF0aW9BdHRyaWJ1dGU6ZnVuY3Rpb24odCl7dmFyIGUsaT0ibWVldCIscj0iTWlkIixuPSJNaWQiLHM9dC5zcGxpdCgiICIpO3JldHVybiBzJiZzLmxlbmd0aCYmKGk9cy5wb3AoKSwibWVldCIhPT1pJiYic2xpY2UiIT09aT8oZT1pLGk9Im1lZXQiKTpzLmxlbmd0aCYmKGU9cy5wb3AoKSkpLHI9Im5vbmUiIT09ZT9lLnNsaWNlKDEsNCk6Im5vbmUiLG49Im5vbmUiIT09ZT9lLnNsaWNlKDUsOCk6Im5vbmUiLHttZWV0T3JTbGljZTppLGFsaWduWDpyLGFsaWduWTpufX0sY2xlYXJGYWJyaWNGb250Q2FjaGU6ZnVuY3Rpb24odCl7dD9mYWJyaWMuY2hhcldpZHRoc0NhY2hlW3RdJiZkZWxldGUgZmFicmljLmNoYXJXaWR0aHNDYWNoZVt0XTpmYWJyaWMuY2hhcldpZHRoc0NhY2hlPXt9fX19KCJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnRoaXMpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LHIscyxvLGgsYyxsKXt2YXIgdT1hLmNhbGwoYXJndW1lbnRzKTtpZihuW3VdKXJldHVybiBuW3VdO3ZhciBmPU1hdGguUEksZD1sKmYvMTgwLGc9TWF0aC5zaW4oZCkscD1NYXRoLmNvcyhkKSx2PTAsYj0wO3M9TWF0aC5hYnMocyksbz1NYXRoLmFicyhvKTt2YXIgbT0tcCp0Ki41LWcqciouNSx5PS1wKnIqLjUrZyp0Ki41LF89cypzLHg9bypvLFM9eSp5LEM9bSptLHc9Xyp4LV8qUy14KkMsTz0wO2lmKHc8MCl7dmFyIFQ9TWF0aC5zcXJ0KDEtdy8oXyp4KSk7cyo9VCxvKj1UfWVsc2UgTz0oaD09PWM/LTE6MSkqTWF0aC5zcXJ0KHcvKF8qUyt4KkMpKTt2YXIgaz1PKnMqeS9vLGo9LU8qbyptL3MsTT1wKmstZypqKy41KnQsQT1nKmsrcCpqKy41KnIsUD1pKDEsMCwobS1rKS9zLCh5LWopL28pLEk9aSgobS1rKS9zLCh5LWopL28sKC1tLWspL3MsKC15LWopL28pOzA9PT1jJiZJPjA/SS09MipmOjE9PT1jJiZJPDAmJihJKz0yKmYpO2Zvcih2YXIgRD1NYXRoLmNlaWwoTWF0aC5hYnMoSS9mKjIpKSxFPVtdLEw9SS9ELFI9OC8zKk1hdGguc2luKEwvNCkqTWF0aC5zaW4oTC80KS9NYXRoLnNpbihMLzIpLEY9UCtMLEI9MDtCPEQ7QisrKUVbQl09ZShQLEYscCxnLHMsbyxNLEEsUix2LGIpLHY9RVtCXVs0XSxiPUVbQl1bNV0sUD1GLEYrPUw7cmV0dXJuIG5bdV09RSxFfWZ1bmN0aW9uIGUodCxlLGkscixuLG8saCxjLGwsdSxmKXt2YXIgZD1hLmNhbGwoYXJndW1lbnRzKTtpZihzW2RdKXJldHVybiBzW2RdO3ZhciBnPU1hdGguY29zKHQpLHA9TWF0aC5zaW4odCksdj1NYXRoLmNvcyhlKSxiPU1hdGguc2luKGUpLG09aSpuKnYtcipvKmIraCx5PXIqbip2K2kqbypiK2MsXz11K2wqKC1pKm4qcC1yKm8qZykseD1mK2wqKC1yKm4qcCtpKm8qZyksUz1tK2wqKGkqbipiK3Iqbyp2KSxDPXkrbCoocipuKmItaSpvKnYpO3JldHVybiBzW2RdPVtfLHgsUyxDLG0seV0sc1tkXX1mdW5jdGlvbiBpKHQsZSxpLHIpe3ZhciBuPU1hdGguYXRhbjIoZSx0KSxzPU1hdGguYXRhbjIocixpKTtyZXR1cm4gcz49bj9zLW46MipNYXRoLlBJLShuLXMpfWZ1bmN0aW9uIHIodCxlLGkscixuLHMsaCxjKXt2YXIgbD1hLmNhbGwoYXJndW1lbnRzKTtpZihvW2xdKXJldHVybiBvW2xdO3ZhciB1LGYsZCxnLHAsdixiLG0seT1NYXRoLnNxcnQsXz1NYXRoLm1pbix4PU1hdGgubWF4LFM9TWF0aC5hYnMsQz1bXSx3PVtbXSxbXV07Zj02KnQtMTIqaSs2Km4sdT0tMyp0KzkqaS05Km4rMypoLGQ9MyppLTMqdDtmb3IodmFyIE89MDtPPDI7KytPKWlmKE8+MCYmKGY9NiplLTEyKnIrNipzLHU9LTMqZSs5KnItOSpzKzMqYyxkPTMqci0zKmUpLFModSk8MWUtMTIpe2lmKFMoZik8MWUtMTIpY29udGludWU7Zz0tZC9mLDA8ZyYmZzwxJiZDLnB1c2goZyl9ZWxzZSBiPWYqZi00KmQqdSxiPDB8fChtPXkoYikscD0oLWYrbSkvKDIqdSksMDxwJiZwPDEmJkMucHVzaChwKSx2PSgtZi1tKS8oMip1KSwwPHYmJnY8MSYmQy5wdXNoKHYpKTtmb3IodmFyIFQsayxqLE09Qy5sZW5ndGgsQT1NO00tLTspZz1DW01dLGo9MS1nLFQ9aipqKmoqdCszKmoqaipnKmkrMypqKmcqZypuK2cqZypnKmgsd1swXVtNXT1ULGs9aipqKmoqZSszKmoqaipnKnIrMypqKmcqZypzK2cqZypnKmMsd1sxXVtNXT1rO3dbMF1bQV09dCx3WzFdW0FdPWUsd1swXVtBKzFdPWgsd1sxXVtBKzFdPWM7dmFyIFA9W3t4Ol8uYXBwbHkobnVsbCx3WzBdKSx5Ol8uYXBwbHkobnVsbCx3WzFdKX0se3g6eC5hcHBseShudWxsLHdbMF0pLHk6eC5hcHBseShudWxsLHdbMV0pfV07cmV0dXJuIG9bbF09UCxQfXZhciBuPXt9LHM9e30sbz17fSxhPUFycmF5LnByb3RvdHlwZS5qb2luO2ZhYnJpYy51dGlsLmRyYXdBcmM9ZnVuY3Rpb24oZSxpLHIsbil7Zm9yKHZhciBzPW5bMF0sbz1uWzFdLGE9blsyXSxoPW5bM10sYz1uWzRdLGw9bls1XSx1PW5bNl0sZj1bW10sW10sW10sW11dLGQ9dChsLWksdS1yLHMsbyxoLGMsYSksZz0wLHA9ZC5sZW5ndGg7ZzxwO2crKylmW2ddWzBdPWRbZ11bMF0raSxmW2ddWzFdPWRbZ11bMV0rcixmW2ddWzJdPWRbZ11bMl0raSxmW2ddWzNdPWRbZ11bM10rcixmW2ddWzRdPWRbZ11bNF0raSxmW2ddWzVdPWRbZ11bNV0rcixlLmJlemllckN1cnZlVG8uYXBwbHkoZSxmW2ddKX0sZmFicmljLnV0aWwuZ2V0Qm91bmRzT2ZBcmM9ZnVuY3Rpb24oZSxpLG4scyxvLGEsaCxjLGwpe2Zvcih2YXIgdSxmPTAsZD0wLGc9W10scD10KGMtZSxsLWksbixzLGEsaCxvKSx2PTAsYj1wLmxlbmd0aDt2PGI7disrKXU9cihmLGQscFt2XVswXSxwW3ZdWzFdLHBbdl1bMl0scFt2XVszXSxwW3ZdWzRdLHBbdl1bNV0pLGcucHVzaCh7eDp1WzBdLngrZSx5OnVbMF0ueStpfSksZy5wdXNoKHt4OnVbMV0ueCtlLHk6dVsxXS55K2l9KSxmPXBbdl1bNF0sZD1wW3ZdWzVdO3JldHVybiBnfSxmYWJyaWMudXRpbC5nZXRCb3VuZHNPZkN1cnZlPXJ9KCksZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPXMuY2FsbChhcmd1bWVudHMsMikscj1bXSxuPTAsbz10Lmxlbmd0aDtuPG87bisrKXJbbl09aS5sZW5ndGg/dFtuXVtlXS5hcHBseSh0W25dLGkpOnRbbl1bZV0uY2FsbCh0W25dKTtyZXR1cm4gcn1mdW5jdGlvbiBlKHQsZSl7cmV0dXJuIG4odCxlLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+PWV9KX1mdW5jdGlvbiBpKHQsZSl7cmV0dXJuIG4odCxlLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZX0pfWZ1bmN0aW9uIHIodCxlKXtmb3IodmFyIGk9dC5sZW5ndGg7aS0tOyl0W2ldPWU7cmV0dXJuIHR9ZnVuY3Rpb24gbih0LGUsaSl7aWYodCYmMCE9PXQubGVuZ3RoKXt2YXIgcj10Lmxlbmd0aC0xLG49ZT90W3JdW2VdOnRbcl07aWYoZSlmb3IoO3ItLTspaSh0W3JdW2VdLG4pJiYobj10W3JdW2VdKTtlbHNlIGZvcig7ci0tOylpKHRbcl0sbikmJihuPXRbcl0pO3JldHVybiBufX12YXIgcz1BcnJheS5wcm90b3R5cGUuc2xpY2U7QXJyYXkucHJvdG90eXBlLmluZGV4T2Z8fChBcnJheS5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0KXtpZih2b2lkIDA9PT10aGlzfHxudWxsPT09dGhpcyl0aHJvdyBuZXcgVHlwZUVycm9yO3ZhciBlPU9iamVjdCh0aGlzKSxpPWUubGVuZ3RoPj4+MDtpZigwPT09aSlyZXR1cm4tMTt2YXIgcj0wO2lmKGFyZ3VtZW50cy5sZW5ndGg+MCYmKHI9TnVtYmVyKGFyZ3VtZW50c1sxXSksciE9PXI/cj0wOjAhPT1yJiZyIT09TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZJiZyIT09TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZJiYocj0ocj4wfHwtMSkqTWF0aC5mbG9vcihNYXRoLmFicyhyKSkpKSxyPj1pKXJldHVybi0xO2Zvcih2YXIgbj1yPj0wP3I6TWF0aC5tYXgoaS1NYXRoLmFicyhyKSwwKTtuPGk7bisrKWlmKG4gaW4gZSYmZVtuXT09PXQpcmV0dXJuIG47cmV0dXJuLTF9KSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaHx8KEFycmF5LnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPTAscj10aGlzLmxlbmd0aD4+PjA7aTxyO2krKylpIGluIHRoaXMmJnQuY2FsbChlLHRoaXNbaV0saSx0aGlzKX0pLEFycmF5LnByb3RvdHlwZS5tYXB8fChBcnJheS5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPVtdLHI9MCxuPXRoaXMubGVuZ3RoPj4+MDtyPG47cisrKXIgaW4gdGhpcyYmKGlbcl09dC5jYWxsKGUsdGhpc1tyXSxyLHRoaXMpKTtyZXR1cm4gaX0pLEFycmF5LnByb3RvdHlwZS5ldmVyeXx8KEFycmF5LnByb3RvdHlwZS5ldmVyeT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0wLHI9dGhpcy5sZW5ndGg+Pj4wO2k8cjtpKyspaWYoaSBpbiB0aGlzJiYhdC5jYWxsKGUsdGhpc1tpXSxpLHRoaXMpKXJldHVybiExO3JldHVybiEwfSksQXJyYXkucHJvdG90eXBlLnNvbWV8fChBcnJheS5wcm90b3R5cGUuc29tZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0wLHI9dGhpcy5sZW5ndGg+Pj4wO2k8cjtpKyspaWYoaSBpbiB0aGlzJiZ0LmNhbGwoZSx0aGlzW2ldLGksdGhpcykpcmV0dXJuITA7cmV0dXJuITF9KSxBcnJheS5wcm90b3R5cGUuZmlsdGVyfHwoQXJyYXkucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaSxyPVtdLG49MCxzPXRoaXMubGVuZ3RoPj4+MDtuPHM7bisrKW4gaW4gdGhpcyYmKGk9dGhpc1tuXSx0LmNhbGwoZSxpLG4sdGhpcykmJnIucHVzaChpKSk7cmV0dXJuIHJ9KSxBcnJheS5wcm90b3R5cGUucmVkdWNlfHwoQXJyYXkucHJvdG90eXBlLnJlZHVjZT1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMubGVuZ3RoPj4+MCxyPTA7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWU9YXJndW1lbnRzWzFdO2Vsc2UgZm9yKDs7KXtpZihyIGluIHRoaXMpe2U9dGhpc1tyKytdO2JyZWFrfWlmKCsrcj49aSl0aHJvdyBuZXcgVHlwZUVycm9yfWZvcig7cjxpO3IrKylyIGluIHRoaXMmJihlPXQuY2FsbChudWxsLGUsdGhpc1tyXSxyLHRoaXMpKTtyZXR1cm4gZX0pLGZhYnJpYy51dGlsLmFycmF5PXtmaWxsOnIsaW52b2tlOnQsbWluOmksbWF4OmV9fSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGkscil7aWYocilpZighZmFicmljLmlzTGlrZWx5Tm9kZSYmaSBpbnN0YW5jZW9mIEVsZW1lbnQpdD1pO2Vsc2UgaWYoaSBpbnN0YW5jZW9mIEFycmF5KXQ9aS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGUodCxyKX0pO2Vsc2UgaWYoaSBpbnN0YW5jZW9mIE9iamVjdClmb3IodmFyIG4gaW4gaSl0W25dPWUoaVtuXSxyKTtlbHNlIHQ9aTtlbHNlIGZvcih2YXIgbiBpbiBpKXRbbl09aVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBlKGUsaSl7cmV0dXJuIHQoe30sZSxpKX1mYWJyaWMudXRpbC5vYmplY3Q9e2V4dGVuZDp0LGNsb25lOmV9fSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gdC5yZXBsYWNlKC8tKyguKT8vZyxmdW5jdGlvbih0LGUpe3JldHVybiBlP2UudG9VcHBlckNhc2UoKToiIn0pfWZ1bmN0aW9uIGUodCxlKXtyZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSsoZT90LnNsaWNlKDEpOnQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSl9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC8nL2csIiZhcG9zOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpfVN0cmluZy5wcm90b3R5cGUudHJpbXx8KFN0cmluZy5wcm90b3R5cGUudHJpbT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcGxhY2UoL15bXHNceEEwXSsvLCIiKS5yZXBsYWNlKC9bXHNceEEwXSskLywiIil9KSxmYWJyaWMudXRpbC5zdHJpbmc9e2NhbWVsaXplOnQsY2FwaXRhbGl6ZTplLGVzY2FwZVhtbDppfX0oKSxmdW5jdGlvbigpe3ZhciB0PUFycmF5LnByb3RvdHlwZS5zbGljZSxlPUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSxpPWZ1bmN0aW9uKCl7fTtGdW5jdGlvbi5wcm90b3R5cGUuYmluZHx8KEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKHIpe3ZhciBuLHM9dGhpcyxvPXQuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIG49by5sZW5ndGg/ZnVuY3Rpb24oKXtyZXR1cm4gZS5jYWxsKHMsdGhpcyBpbnN0YW5jZW9mIGk/dGhpczpyLG8uY29uY2F0KHQuY2FsbChhcmd1bWVudHMpKSl9OmZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbChzLHRoaXMgaW5zdGFuY2VvZiBpP3RoaXM6cixhcmd1bWVudHMpfSxpLnByb3RvdHlwZT10aGlzLnByb3RvdHlwZSxuLnByb3RvdHlwZT1uZXcgaSxufSl9KCksZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fWZ1bmN0aW9uIGUodCl7dmFyIGU9dGhpcy5jb25zdHJ1Y3Rvci5zdXBlcmNsYXNzLnByb3RvdHlwZVt0XTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP2UuYXBwbHkodGhpcyxyLmNhbGwoYXJndW1lbnRzLDEpKTplLmNhbGwodGhpcyl9ZnVuY3Rpb24gaSgpe2Z1bmN0aW9uIGkoKXt0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciBzPW51bGwsYT1yLmNhbGwoYXJndW1lbnRzLDApOyJmdW5jdGlvbiI9PXR5cGVvZiBhWzBdJiYocz1hLnNoaWZ0KCkpLGkuc3VwZXJjbGFzcz1zLGkuc3ViY2xhc3Nlcz1bXSxzJiYodC5wcm90b3R5cGU9cy5wcm90b3R5cGUsaS5wcm90b3R5cGU9bmV3IHQscy5zdWJjbGFzc2VzLnB1c2goaSkpO2Zvcih2YXIgaD0wLGM9YS5sZW5ndGg7aDxjO2grKylvKGksYVtoXSxzKTtyZXR1cm4gaS5wcm90b3R5cGUuaW5pdGlhbGl6ZXx8KGkucHJvdG90eXBlLmluaXRpYWxpemU9biksaS5wcm90b3R5cGUuY29uc3RydWN0b3I9aSxpLnByb3RvdHlwZS5jYWxsU3VwZXI9ZSxpfXZhciByPUFycmF5LnByb3RvdHlwZS5zbGljZSxuPWZ1bmN0aW9uKCl7fSxzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0IGlue3RvU3RyaW5nOjF9KWlmKCJ0b1N0cmluZyI9PT10KXJldHVybiExO3JldHVybiEwfSgpLG89ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgciBpbiBlKXIgaW4gdC5wcm90b3R5cGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnByb3RvdHlwZVtyXSYmKGVbcl0rIiIpLmluZGV4T2YoImNhbGxTdXBlciIpPi0xP3QucHJvdG90eXBlW3JdPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPXRoaXMuY29uc3RydWN0b3Iuc3VwZXJjbGFzczt0aGlzLmNvbnN0cnVjdG9yLnN1cGVyY2xhc3M9aTt2YXIgbj1lW3RdLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZih0aGlzLmNvbnN0cnVjdG9yLnN1cGVyY2xhc3M9ciwiaW5pdGlhbGl6ZSIhPT10KXJldHVybiBufX0ocik6dC5wcm90b3R5cGVbcl09ZVtyXSxzJiYoZS50b1N0cmluZyE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcmJih0LnByb3RvdHlwZS50b1N0cmluZz1lLnRvU3RyaW5nKSxlLnZhbHVlT2YhPT1PYmplY3QucHJvdG90eXBlLnZhbHVlT2YmJih0LnByb3RvdHlwZS52YWx1ZU9mPWUudmFsdWVPZikpfTtmYWJyaWMudXRpbC5jcmVhdGVDbGFzcz1pfSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgZSxpLHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLG49ci5sZW5ndGg7Zm9yKGk9MDtpPG47aSsrKWlmKGU9dHlwZW9mIHRbcltpXV0sIS9eKD86ZnVuY3Rpb258b2JqZWN0fHVua25vd24pJC8udGVzdChlKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBlKHQsZSl7cmV0dXJue2hhbmRsZXI6ZSx3cmFwcGVkSGFuZGxlcjppKHQsZSl9fWZ1bmN0aW9uIGkodCxlKXtyZXR1cm4gZnVuY3Rpb24oaSl7ZS5jYWxsKG8odCksaXx8ZmFicmljLndpbmRvdy5ldmVudCl9fWZ1bmN0aW9uIHIodCxlKXtyZXR1cm4gZnVuY3Rpb24oaSl7aWYocFt0XSYmcFt0XVtlXSlmb3IodmFyIHI9cFt0XVtlXSxuPTAscz1yLmxlbmd0aDtuPHM7bisrKXJbbl0uY2FsbCh0aGlzLGl8fGZhYnJpYy53aW5kb3cuZXZlbnQpfX1mdW5jdGlvbiBuKHQpe3R8fCh0PWZhYnJpYy53aW5kb3cuZXZlbnQpO3ZhciBlPXQudGFyZ2V0fHwodHlwZW9mIHQuc3JjRWxlbWVudCE9PWg/dC5zcmNFbGVtZW50Om51bGwpLGk9ZmFicmljLnV0aWwuZ2V0U2Nyb2xsTGVmdFRvcChlKTtyZXR1cm57eDp2KHQpK2kubGVmdCx5OmIodCkraS50b3B9fWZ1bmN0aW9uIHModCxlLGkpe3ZhciByPSJ0b3VjaGVuZCI9PT10LnR5cGU/ImNoYW5nZWRUb3VjaGVzIjoidG91Y2hlcyI7cmV0dXJuIHRbcl0mJnRbcl1bMF0/dFtyXVswXVtlXS0odFtyXVswXVtlXS10W3JdWzBdW2ldKXx8dFtpXTp0W2ldfXZhciBvLGEsaD0idW5rbm93biIsYz1mdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLl9fdW5pcXVlSUR8fChlLl9fdW5pcXVlSUQ9InVuaXF1ZUlEX18iK3QrKyl9fSgpOyFmdW5jdGlvbigpe3ZhciB0PXt9O289ZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LGE9ZnVuY3Rpb24oZSxpKXt0W2VdPWl9fSgpO3ZhciBsLHUsZj10KGZhYnJpYy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIikmJnQoZmFicmljLndpbmRvdywiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiKSxkPXQoZmFicmljLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwiYXR0YWNoRXZlbnQiLCJkZXRhY2hFdmVudCIpJiZ0KGZhYnJpYy53aW5kb3csImF0dGFjaEV2ZW50IiwiZGV0YWNoRXZlbnQiKSxnPXt9LHA9e307Zj8obD1mdW5jdGlvbih0LGUsaSl7dC5hZGRFdmVudExpc3RlbmVyKGUsaSwhMSl9LHU9ZnVuY3Rpb24odCxlLGkpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLGksITEpfSk6ZD8obD1mdW5jdGlvbih0LGkscil7dmFyIG49Yyh0KTthKG4sdCksZ1tuXXx8KGdbbl09e30pLGdbbl1baV18fChnW25dW2ldPVtdKTt2YXIgcz1lKG4scik7Z1tuXVtpXS5wdXNoKHMpLHQuYXR0YWNoRXZlbnQoIm9uIitpLHMud3JhcHBlZEhhbmRsZXIpfSx1PWZ1bmN0aW9uKHQsZSxpKXt2YXIgcixuPWModCk7aWYoZ1tuXSYmZ1tuXVtlXSlmb3IodmFyIHM9MCxvPWdbbl1bZV0ubGVuZ3RoO3M8bztzKyspcj1nW25dW2VdW3NdLHImJnIuaGFuZGxlcj09PWkmJih0LmRldGFjaEV2ZW50KCJvbiIrZSxyLndyYXBwZWRIYW5kbGVyKSxnW25dW2VdW3NdPW51bGwpfSk6KGw9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPWModCk7aWYocFtuXXx8KHBbbl09e30pLCFwW25dW2VdKXtwW25dW2VdPVtdO3ZhciBzPXRbIm9uIitlXTtzJiZwW25dW2VdLnB1c2gocyksdFsib24iK2VdPXIobixlKX1wW25dW2VdLnB1c2goaSl9LHU9ZnVuY3Rpb24odCxlLGkpe3ZhciByPWModCk7aWYocFtyXSYmcFtyXVtlXSlmb3IodmFyIG49cFtyXVtlXSxzPTAsbz1uLmxlbmd0aDtzPG87cysrKW5bc109PT1pJiZuLnNwbGljZShzLDEpfSksZmFicmljLnV0aWwuYWRkTGlzdGVuZXI9bCxmYWJyaWMudXRpbC5yZW1vdmVMaXN0ZW5lcj11O3ZhciB2PWZ1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdC5jbGllbnRYIT09aD90LmNsaWVudFg6MH0sYj1mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHQuY2xpZW50WSE9PWg/dC5jbGllbnRZOjB9O2ZhYnJpYy5pc1RvdWNoU3VwcG9ydGVkJiYodj1mdW5jdGlvbih0KXtyZXR1cm4gcyh0LCJwYWdlWCIsImNsaWVudFgiKX0sYj1mdW5jdGlvbih0KXtyZXR1cm4gcyh0LCJwYWdlWSIsImNsaWVudFkiKX0pLGZhYnJpYy51dGlsLmdldFBvaW50ZXI9bixmYWJyaWMudXRpbC5vYmplY3QuZXh0ZW5kKGZhYnJpYy51dGlsLGZhYnJpYy5PYnNlcnZhYmxlKX0oKSxmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt2YXIgaT10LnN0eWxlO2lmKCFpKXJldHVybiB0O2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gdC5zdHlsZS5jc3NUZXh0Kz0iOyIrZSxlLmluZGV4T2YoIm9wYWNpdHkiKT4tMT9zKHQsZS5tYXRjaCgvb3BhY2l0eTpccyooXGQ/XC4/XGQqKS8pWzFdKTp0O2Zvcih2YXIgciBpbiBlKWlmKCJvcGFjaXR5Ij09PXIpcyh0LGVbcl0pO2Vsc2V7dmFyIG49ImZsb2F0Ij09PXJ8fCJjc3NGbG9hdCI9PT1yPyJ1bmRlZmluZWQiPT10eXBlb2YgaS5zdHlsZUZsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQiOnI7aVtuXT1lW3JdfXJldHVybiB0fXZhciBlPWZhYnJpYy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxpPSJzdHJpbmciPT10eXBlb2YgZS5zdHlsZS5vcGFjaXR5LHI9InN0cmluZyI9PXR5cGVvZiBlLnN0eWxlLmZpbHRlcixuPS9hbHBoYVxzKlwoXHMqb3BhY2l0eVxzKj1ccyooW15cKV0rKVwpLyxzPWZ1bmN0aW9uKHQpe3JldHVybiB0fTtpP3M9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5zdHlsZS5vcGFjaXR5PWUsdH06ciYmKHM9ZnVuY3Rpb24odCxlKXt2YXIgaT10LnN0eWxlO3JldHVybiB0LmN1cnJlbnRTdHlsZSYmIXQuY3VycmVudFN0eWxlLmhhc0xheW91dCYmKGkuem9vbT0xKSxuLnRlc3QoaS5maWx0ZXIpPyhlPWU+PS45OTk5PyIiOiJhbHBoYShvcGFjaXR5PSIrMTAwKmUrIikiLGkuZmlsdGVyPWkuZmlsdGVyLnJlcGxhY2UobixlKSk6aS5maWx0ZXIrPSIgYWxwaGEob3BhY2l0eT0iKzEwMCplKyIpIix0fSksZmFicmljLnV0aWwuc2V0U3R5bGU9dH0oKSxmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2ZhYnJpYy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KTp0fWZ1bmN0aW9uIGUodCxlKXt2YXIgaT1mYWJyaWMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KTtmb3IodmFyIHIgaW4gZSkiY2xhc3MiPT09cj9pLmNsYXNzTmFtZT1lW3JdOiJmb3IiPT09cj9pLmh0bWxGb3I9ZVtyXTppLnNldEF0dHJpYnV0ZShyLGVbcl0pO3JldHVybiBpfWZ1bmN0aW9uIGkodCxlKXt0JiYoIiAiK3QuY2xhc3NOYW1lKyIgIikuaW5kZXhPZigiICIrZSsiICIpPT09LTEmJih0LmNsYXNzTmFtZSs9KHQuY2xhc3NOYW1lPyIgIjoiIikrZSl9ZnVuY3Rpb24gcih0LGkscil7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBpJiYoaT1lKGkscikpLHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChpLHQpLGkuYXBwZW5kQ2hpbGQodCksaX1mdW5jdGlvbiBuKHQpe2Zvcih2YXIgZT0wLGk9MCxyPWZhYnJpYy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbj1mYWJyaWMuZG9jdW1lbnQuYm9keXx8e3Njcm9sbExlZnQ6MCxzY3JvbGxUb3A6MH07dCYmKHQucGFyZW50Tm9kZXx8dC5ob3N0KSYmKHQ9dC5wYXJlbnROb2RlfHx0Lmhvc3QsdD09PWZhYnJpYy5kb2N1bWVudD8oZT1uLnNjcm9sbExlZnR8fHIuc2Nyb2xsTGVmdHx8MCxpPW4uc2Nyb2xsVG9wfHxyLnNjcm9sbFRvcHx8MCk6KGUrPXQuc2Nyb2xsTGVmdHx8MCxpKz10LnNjcm9sbFRvcHx8MCksMSE9PXQubm9kZVR5cGV8fCJmaXhlZCIhPT1mYWJyaWMudXRpbC5nZXRFbGVtZW50U3R5bGUodCwicG9zaXRpb24iKSk7KTtyZXR1cm57bGVmdDplLHRvcDppfX1mdW5jdGlvbiBzKHQpe3ZhciBlLGkscj10JiZ0Lm93bmVyRG9jdW1lbnQscz17bGVmdDowLHRvcDowfSxvPXtsZWZ0OjAsdG9wOjB9LGE9e2JvcmRlckxlZnRXaWR0aDoibGVmdCIsYm9yZGVyVG9wV2lkdGg6InRvcCIscGFkZGluZ0xlZnQ6ImxlZnQiLHBhZGRpbmdUb3A6InRvcCJ9O2lmKCFyKXJldHVybiBvO2Zvcih2YXIgaCBpbiBhKW9bYVtoXV0rPXBhcnNlSW50KGModCxoKSwxMCl8fDA7cmV0dXJuIGU9ci5kb2N1bWVudEVsZW1lbnQsInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKHM9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksaT1uKHQpLHtsZWZ0OnMubGVmdCtpLmxlZnQtKGUuY2xpZW50TGVmdHx8MCkrby5sZWZ0LHRvcDpzLnRvcCtpLnRvcC0oZS5jbGllbnRUb3B8fDApK28udG9wfX12YXIgbyxhPUFycmF5LnByb3RvdHlwZS5zbGljZSxoPWZ1bmN0aW9uKHQpe3JldHVybiBhLmNhbGwodCwwKX07dHJ5e289aChmYWJyaWMuZG9jdW1lbnQuY2hpbGROb2RlcylpbnN0YW5jZW9mIEFycmF5fWNhdGNoKHQpe31vfHwoaD1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQubGVuZ3RoKSxpPXQubGVuZ3RoO2ktLTspZVtpXT10W2ldO3JldHVybiBlfSk7dmFyIGM7Yz1mYWJyaWMuZG9jdW1lbnQuZGVmYXVsdFZpZXcmJmZhYnJpYy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlP2Z1bmN0aW9uKHQsZSl7dmFyIGk9ZmFicmljLmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodCxudWxsKTtyZXR1cm4gaT9pW2VdOnZvaWQgMH06ZnVuY3Rpb24odCxlKXt2YXIgaT10LnN0eWxlW2VdO3JldHVybiFpJiZ0LmN1cnJlbnRTdHlsZSYmKGk9dC5jdXJyZW50U3R5bGVbZV0pLGl9LGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHQub25zZWxlY3RzdGFydCYmKHQub25zZWxlY3RzdGFydD1mYWJyaWMudXRpbC5mYWxzZUZ1bmN0aW9uKSxyP3Quc3R5bGVbcl09Im5vbmUiOiJzdHJpbmciPT10eXBlb2YgdC51bnNlbGVjdGFibGUmJih0LnVuc2VsZWN0YWJsZT0ib24iKSx0fWZ1bmN0aW9uIGUodCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0Lm9uc2VsZWN0c3RhcnQmJih0Lm9uc2VsZWN0c3RhcnQ9bnVsbCkscj90LnN0eWxlW3JdPSIiOiJzdHJpbmciPT10eXBlb2YgdC51bnNlbGVjdGFibGUmJih0LnVuc2VsZWN0YWJsZT0iIiksdH12YXIgaT1mYWJyaWMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLHI9InVzZXJTZWxlY3QiaW4gaT8idXNlclNlbGVjdCI6Ik1velVzZXJTZWxlY3QiaW4gaT8iTW96VXNlclNlbGVjdCI6IldlYmtpdFVzZXJTZWxlY3QiaW4gaT8iV2Via2l0VXNlclNlbGVjdCI6IktodG1sVXNlclNlbGVjdCJpbiBpPyJLaHRtbFVzZXJTZWxlY3QiOiIiO2ZhYnJpYy51dGlsLm1ha2VFbGVtZW50VW5zZWxlY3RhYmxlPXQsZmFicmljLnV0aWwubWFrZUVsZW1lbnRTZWxlY3RhYmxlPWV9KCksZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dmFyIGk9ZmFicmljLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0scj1mYWJyaWMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iiksbj0hMDtyLm9ubG9hZD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbih0KXtpZihuKXtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucmVhZHlTdGF0ZSYmImxvYWRlZCIhPT10aGlzLnJlYWR5U3RhdGUmJiJjb21wbGV0ZSIhPT10aGlzLnJlYWR5U3RhdGUpcmV0dXJuO249ITEsZSh0fHxmYWJyaWMud2luZG93LmV2ZW50KSxyPXIub25sb2FkPXIub25yZWFkeXN0YXRlY2hhbmdlPW51bGx9fSxyLnNyYz10LGkuYXBwZW5kQ2hpbGQocil9ZmFicmljLnV0aWwuZ2V0U2NyaXB0PXR9KCksZmFicmljLnV0aWwuZ2V0QnlJZD10LGZhYnJpYy51dGlsLnRvQXJyYXk9aCxmYWJyaWMudXRpbC5tYWtlRWxlbWVudD1lLGZhYnJpYy51dGlsLmFkZENsYXNzPWksZmFicmljLnV0aWwud3JhcEVsZW1lbnQ9cixmYWJyaWMudXRpbC5nZXRTY3JvbGxMZWZ0VG9wPW4sZmFicmljLnV0aWwuZ2V0RWxlbWVudE9mZnNldD1zLGZhYnJpYy51dGlsLmdldEVsZW1lbnRTdHlsZT1jfSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3JldHVybiB0KygvXD8vLnRlc3QodCk/IiYiOiI/IikrZX1mdW5jdGlvbiBlKCl7fWZ1bmN0aW9uIGkoaSxuKXtufHwobj17fSk7dmFyIHM9bi5tZXRob2Q/bi5tZXRob2QudG9VcHBlckNhc2UoKToiR0VUIixvPW4ub25Db21wbGV0ZXx8ZnVuY3Rpb24oKXt9LGE9cigpLGg9bi5ib2R5fHxuLnBhcmFtZXRlcnM7cmV0dXJuIGEub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09PWEucmVhZHlTdGF0ZSYmKG8oYSksYS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZSl9LCJHRVQiPT09cyYmKGg9bnVsbCwic3RyaW5nIj09dHlwZW9mIG4ucGFyYW1ldGVycyYmKGk9dChpLG4ucGFyYW1ldGVycykpKSxhLm9wZW4ocyxpLCEwKSwiUE9TVCIhPT1zJiYiUFVUIiE9PXN8fGEuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYS5zZW5kKGgpLGF9dmFyIHI9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W2Z1bmN0aW9uKCl7cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpfSxmdW5jdGlvbigpe3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgiTXN4bWwyLlhNTEhUVFAiKX0sZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoIk1zeG1sMi5YTUxIVFRQLjMuMCIpfSxmdW5jdGlvbigpe3JldHVybiBuZXcgWE1MSHR0cFJlcXVlc3R9XSxlPXQubGVuZ3RoO2UtLTspdHJ5e3ZhciBpPXRbZV0oKTtpZihpKXJldHVybiB0W2VdfWNhdGNoKHQpe319KCk7ZmFicmljLnV0aWwucmVxdWVzdD1pfSgpLGZhYnJpYy5sb2c9ZnVuY3Rpb24oKXt9LGZhYnJpYy53YXJuPWZ1bmN0aW9uKCl7fSwidW5kZWZpbmVkIiE9dHlwZW9mIGNvbnNvbGUmJlsibG9nIiwid2FybiJdLmZvckVhY2goZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBjb25zb2xlW3RdJiYiZnVuY3Rpb24iPT10eXBlb2YgY29uc29sZVt0XS5hcHBseSYmKGZhYnJpY1t0XT1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlW3RdLmFwcGx5KGNvbnNvbGUsYXJndW1lbnRzKX0pfSksZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe2UoZnVuY3Rpb24oaSl7dHx8KHQ9e30pO3ZhciByLG49aXx8K25ldyBEYXRlLHM9dC5kdXJhdGlvbnx8NTAwLG89bitzLGE9dC5vbkNoYW5nZXx8ZnVuY3Rpb24oKXt9LGg9dC5hYm9ydHx8ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYz10LmVhc2luZ3x8ZnVuY3Rpb24odCxlLGkscil7cmV0dXJuLWkqTWF0aC5jb3ModC9yKihNYXRoLlBJLzIpKStpK2V9LGw9InN0YXJ0VmFsdWUiaW4gdD90LnN0YXJ0VmFsdWU6MCx1PSJlbmRWYWx1ZSJpbiB0P3QuZW5kVmFsdWU6MTAwLGY9dC5ieVZhbHVlfHx1LWw7dC5vblN0YXJ0JiZ0Lm9uU3RhcnQoKSxmdW5jdGlvbiBpKHUpe3I9dXx8K25ldyBEYXRlO3ZhciBkPXI+bz9zOnItbjtyZXR1cm4gaCgpP3ZvaWQodC5vbkNvbXBsZXRlJiZ0Lm9uQ29tcGxldGUoKSk6KGEoYyhkLGwsZixzKSkscj5vP3ZvaWQodC5vbkNvbXBsZXRlJiZ0Lm9uQ29tcGxldGUoKSk6dm9pZCBlKGkpKX0obil9KX1mdW5jdGlvbiBlKCl7cmV0dXJuIGkuYXBwbHkoZmFicmljLndpbmRvdyxhcmd1bWVudHMpfXZhciBpPWZhYnJpYy53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxmYWJyaWMud2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZXx8ZmFicmljLndpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGZhYnJpYy53aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZXx8ZmFicmljLndpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZXx8ZnVuY3Rpb24odCl7ZmFicmljLndpbmRvdy5zZXRUaW1lb3V0KHQsMWUzLzYwKX07ZmFicmljLnV0aWwuYW5pbWF0ZT10LGZhYnJpYy51dGlsLnJlcXVlc3RBbmltRnJhbWU9ZX0oKSxmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLGkscil7cmV0dXJuIHQ8TWF0aC5hYnMoZSk/KHQ9ZSxyPWkvNCk6cj0wPT09ZSYmMD09PXQ/aS8oMipNYXRoLlBJKSpNYXRoLmFzaW4oMSk6aS8oMipNYXRoLlBJKSpNYXRoLmFzaW4oZS90KSx7YTp0LGM6ZSxwOmksczpyfX1mdW5jdGlvbiBlKHQsZSxpKXtyZXR1cm4gdC5hKk1hdGgucG93KDIsMTAqKGUtPTEpKSpNYXRoLnNpbigoZSppLXQucykqKDIqTWF0aC5QSSkvdC5wKX1mdW5jdGlvbiBpKHQsZSxpLHIpe3JldHVybiBpKigodD10L3ItMSkqdCp0KzEpK2V9ZnVuY3Rpb24gcih0LGUsaSxyKXtyZXR1cm4gdC89ci8yLHQ8MT9pLzIqdCp0KnQrZTppLzIqKCh0LT0yKSp0KnQrMikrZX1mdW5jdGlvbiBuKHQsZSxpLHIpe3JldHVybiBpKih0Lz1yKSp0KnQqdCtlfWZ1bmN0aW9uIHModCxlLGkscil7cmV0dXJuLWkqKCh0PXQvci0xKSp0KnQqdC0xKStlfWZ1bmN0aW9uIG8odCxlLGkscil7cmV0dXJuIHQvPXIvMix0PDE/aS8yKnQqdCp0KnQrZTotaS8yKigodC09MikqdCp0KnQtMikrZX1mdW5jdGlvbiBhKHQsZSxpLHIpe3JldHVybiBpKih0Lz1yKSp0KnQqdCp0K2V9ZnVuY3Rpb24gaCh0LGUsaSxyKXtyZXR1cm4gaSooKHQ9dC9yLTEpKnQqdCp0KnQrMSkrZX1mdW5jdGlvbiBjKHQsZSxpLHIpe3JldHVybiB0Lz1yLzIsdDwxP2kvMip0KnQqdCp0KnQrZTppLzIqKCh0LT0yKSp0KnQqdCp0KzIpK2V9ZnVuY3Rpb24gbCh0LGUsaSxyKXtyZXR1cm4taSpNYXRoLmNvcyh0L3IqKE1hdGguUEkvMikpK2krZX1mdW5jdGlvbiB1KHQsZSxpLHIpe3JldHVybiBpKk1hdGguc2luKHQvciooTWF0aC5QSS8yKSkrZX1mdW5jdGlvbiBmKHQsZSxpLHIpe3JldHVybi1pLzIqKE1hdGguY29zKE1hdGguUEkqdC9yKS0xKStlfWZ1bmN0aW9uIGQodCxlLGkscil7cmV0dXJuIDA9PT10P2U6aSpNYXRoLnBvdygyLDEwKih0L3ItMSkpK2V9ZnVuY3Rpb24gZyh0LGUsaSxyKXtyZXR1cm4gdD09PXI/ZStpOmkqKC1NYXRoLnBvdygyLC0xMCp0L3IpKzEpK2V9ZnVuY3Rpb24gcCh0LGUsaSxyKXtyZXR1cm4gMD09PXQ/ZTp0PT09cj9lK2k6KHQvPXIvMix0PDE/aS8yKk1hdGgucG93KDIsMTAqKHQtMSkpK2U6aS8yKigtTWF0aC5wb3coMiwtMTAqLS10KSsyKStlKX1mdW5jdGlvbiB2KHQsZSxpLHIpe3JldHVybi1pKihNYXRoLnNxcnQoMS0odC89cikqdCktMSkrZX1mdW5jdGlvbiBiKHQsZSxpLHIpe3JldHVybiBpKk1hdGguc3FydCgxLSh0PXQvci0xKSp0KStlfWZ1bmN0aW9uIG0odCxlLGkscil7cmV0dXJuIHQvPXIvMix0PDE/LWkvMiooTWF0aC5zcXJ0KDEtdCp0KS0xKStlOmkvMiooTWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpK2V9ZnVuY3Rpb24geShpLHIsbixzKXt2YXIgbz0xLjcwMTU4LGE9MCxoPW47aWYoMD09PWkpcmV0dXJuIHI7aWYoaS89cywxPT09aSlyZXR1cm4gcituO2F8fChhPS4zKnMpO3ZhciBjPXQoaCxuLGEsbyk7cmV0dXJuLWUoYyxpLHMpK3J9ZnVuY3Rpb24gXyhlLGkscixuKXt2YXIgcz0xLjcwMTU4LG89MCxhPXI7aWYoMD09PWUpcmV0dXJuIGk7aWYoZS89biwxPT09ZSlyZXR1cm4gaStyO298fChvPS4zKm4pO3ZhciBoPXQoYSxyLG8scyk7cmV0dXJuIGguYSpNYXRoLnBvdygyLC0xMCplKSpNYXRoLnNpbigoZSpuLWgucykqKDIqTWF0aC5QSSkvaC5wKStoLmMraX1mdW5jdGlvbiB4KGkscixuLHMpe3ZhciBvPTEuNzAxNTgsYT0wLGg9bjtpZigwPT09aSlyZXR1cm4gcjtpZihpLz1zLzIsMj09PWkpcmV0dXJuIHIrbjthfHwoYT1zKiguMyoxLjUpKTt2YXIgYz10KGgsbixhLG8pO3JldHVybiBpPDE/LS41KmUoYyxpLHMpK3I6Yy5hKk1hdGgucG93KDIsLTEwKihpLT0xKSkqTWF0aC5zaW4oKGkqcy1jLnMpKigyKk1hdGguUEkpL2MucCkqLjUrYy5jK3J9ZnVuY3Rpb24gUyh0LGUsaSxyLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj0xLjcwMTU4KSxpKih0Lz1yKSp0KigobisxKSp0LW4pK2V9ZnVuY3Rpb24gQyh0LGUsaSxyLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj0xLjcwMTU4KSxpKigodD10L3ItMSkqdCooKG4rMSkqdCtuKSsxKStlfWZ1bmN0aW9uIHcodCxlLGkscixuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49MS43MDE1OCksdC89ci8yLHQ8MT9pLzIqKHQqdCooKChuKj0xLjUyNSkrMSkqdC1uKSkrZTppLzIqKCh0LT0yKSp0KigoKG4qPTEuNTI1KSsxKSp0K24pKzIpK2V9ZnVuY3Rpb24gTyh0LGUsaSxyKXtyZXR1cm4gaS1UKHItdCwwLGkscikrZX1mdW5jdGlvbiBUKHQsZSxpLHIpe3JldHVybih0Lz1yKTwxLzIuNzU/aSooNy41NjI1KnQqdCkrZTp0PDIvMi43NT9pKig3LjU2MjUqKHQtPTEuNS8yLjc1KSp0Ky43NSkrZTp0PDIuNS8yLjc1P2kqKDcuNTYyNSoodC09Mi4yNS8yLjc1KSp0Ky45Mzc1KStlOmkqKDcuNTYyNSoodC09Mi42MjUvMi43NSkqdCsuOTg0Mzc1KStlfWZ1bmN0aW9uIGsodCxlLGkscil7cmV0dXJuIHQ8ci8yPy41Kk8oMip0LDAsaSxyKStlOi41KlQoMip0LXIsMCxpLHIpKy41KmkrZX1mYWJyaWMudXRpbC5lYXNlPXtlYXNlSW5RdWFkOmZ1bmN0aW9uKHQsZSxpLHIpe3JldHVybiBpKih0Lz1yKSp0K2V9LGVhc2VPdXRRdWFkOmZ1bmN0aW9uKHQsZSxpLHIpe3JldHVybi1pKih0Lz1yKSoodC0yKStlfSxlYXNlSW5PdXRRdWFkOmZ1bmN0aW9uKHQsZSxpLHIpe3JldHVybiB0Lz1yLzIsdDwxP2kvMip0KnQrZTotaS8yKigtLXQqKHQtMiktMSkrZX0sZWFzZUluQ3ViaWM6ZnVuY3Rpb24odCxlLGkscil7cmV0dXJuIGkqKHQvPXIpKnQqdCtlfSxlYXNlT3V0Q3ViaWM6aSxlYXNlSW5PdXRDdWJpYzpyLGVhc2VJblF1YXJ0Om4sZWFzZU91dFF1YXJ0OnMsZWFzZUluT3V0UXVhcnQ6byxlYXNlSW5RdWludDphLGVhc2VPdXRRdWludDpoLGVhc2VJbk91dFF1aW50OmMsZWFzZUluU2luZTpsLGVhc2VPdXRTaW5lOnUsZWFzZUluT3V0U2luZTpmLGVhc2VJbkV4cG86ZCxlYXNlT3V0RXhwbzpnLGVhc2VJbk91dEV4cG86cCxlYXNlSW5DaXJjOnYsZWFzZU91dENpcmM6YixlYXNlSW5PdXRDaXJjOm0sZWFzZUluRWxhc3RpYzp5LGVhc2VPdXRFbGFzdGljOl8sZWFzZUluT3V0RWxhc3RpYzp4LGVhc2VJbkJhY2s6UyxlYXNlT3V0QmFjazpDLGVhc2VJbk91dEJhY2s6dyxlYXNlSW5Cb3VuY2U6TyxlYXNlT3V0Qm91bmNlOlQsZWFzZUluT3V0Qm91bmNlOmt9fSgpLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKHQpe3JldHVybiB0IGluIGs/a1t0XTp0fWZ1bmN0aW9uIGkodCxlLGkscil7dmFyIG4scz0iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpO3JldHVybiJmaWxsIiE9PXQmJiJzdHJva2UiIT09dHx8Im5vbmUiIT09ZT8ic3Ryb2tlRGFzaEFycmF5Ij09PXQ/ZT1lLnJlcGxhY2UoLywvZywiICIpLnNwbGl0KC9ccysvKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlRmxvYXQodCl9KToidHJhbnNmb3JtTWF0cml4Ij09PXQ/ZT1pJiZpLnRyYW5zZm9ybU1hdHJpeD9TKGkudHJhbnNmb3JtTWF0cml4LHYucGFyc2VUcmFuc2Zvcm1BdHRyaWJ1dGUoZSkpOnYucGFyc2VUcmFuc2Zvcm1BdHRyaWJ1dGUoZSk6InZpc2libGUiPT09dD8oZT0ibm9uZSIhPT1lJiYiaGlkZGVuIiE9PWUsaSYmaS52aXNpYmxlPT09ITEmJihlPSExKSk6Im9yaWdpblgiPT09dD9lPSJzdGFydCI9PT1lPyJsZWZ0IjoiZW5kIj09PWU/InJpZ2h0IjoiY2VudGVyIjpuPXM/ZS5tYXAoeCk6eChlLHIpOmU9IiIsIXMmJmlzTmFOKG4pP2U6bn1mdW5jdGlvbiByKHQpe2Zvcih2YXIgZSBpbiBqKWlmKCJ1bmRlZmluZWQiIT10eXBlb2YgdFtqW2VdXSYmIiIhPT10W2VdKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIHRbZV0pe2lmKCF2Lk9iamVjdC5wcm90b3R5cGVbZV0pY29udGludWU7dFtlXT12Lk9iamVjdC5wcm90b3R5cGVbZV19aWYoMCE9PXRbZV0uaW5kZXhPZigidXJsKCIpKXt2YXIgaT1uZXcgdi5Db2xvcih0W2VdKTt0W2VdPWkuc2V0QWxwaGEoXyhpLmdldEFscGhhKCkqdFtqW2VdXSwyKSkudG9SZ2JhKCl9fXJldHVybiB0fWZ1bmN0aW9uIG4odCxlKXtmb3IodmFyIGkscixuPVtdLHM9MDtzPGUubGVuZ3RoO3MrKylpPWVbc10scj10LmdldEVsZW1lbnRzQnlUYWdOYW1lKGkpLG49bi5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocikpO3JldHVybiBufWZ1bmN0aW9uIHModCxyKXt2YXIgbixzO3QucmVwbGFjZSgvO1xzKiQvLCIiKS5zcGxpdCgiOyIpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG89dC5zcGxpdCgiOiIpO249ZShvWzBdLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSxzPWkobixvWzFdLnRyaW0oKSkscltuXT1zfSl9ZnVuY3Rpb24gbyh0LHIpe3ZhciBuLHM7Zm9yKHZhciBvIGluIHQpInVuZGVmaW5lZCIhPXR5cGVvZiB0W29dJiYobj1lKG8udG9Mb3dlckNhc2UoKSkscz1pKG4sdFtvXSkscltuXT1zKX1mdW5jdGlvbiBhKHQsZSl7dmFyIGk9e307Zm9yKHZhciByIGluIHYuY3NzUnVsZXNbZV0paWYoaCh0LHIuc3BsaXQoIiAiKSkpZm9yKHZhciBuIGluIHYuY3NzUnVsZXNbZV1bcl0paVtuXT12LmNzc1J1bGVzW2VdW3JdW25dO3JldHVybiBpfWZ1bmN0aW9uIGgodCxlKXt2YXIgaSxyPSEwO3JldHVybiBpPWwodCxlLnBvcCgpKSxpJiZlLmxlbmd0aCYmKHI9Yyh0LGUpKSxpJiZyJiYwPT09ZS5sZW5ndGh9ZnVuY3Rpb24gYyh0LGUpe2Zvcih2YXIgaSxyPSEwO3QucGFyZW50Tm9kZSYmMT09PXQucGFyZW50Tm9kZS5ub2RlVHlwZSYmZS5sZW5ndGg7KXImJihpPWUucG9wKCkpLHQ9dC5wYXJlbnROb2RlLHI9bCh0LGkpO3JldHVybiAwPT09ZS5sZW5ndGh9ZnVuY3Rpb24gbCh0LGUpe3ZhciBpLHI9dC5ub2RlTmFtZSxuPXQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLHM9dC5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaT1uZXcgUmVnRXhwKCJeIityLCJpIiksZT1lLnJlcGxhY2UoaSwiIikscyYmZS5sZW5ndGgmJihpPW5ldyBSZWdFeHAoIiMiK3MrIig/IVthLXpBLVpcXC1dKykiLCJpIiksZT1lLnJlcGxhY2UoaSwiIikpLG4mJmUubGVuZ3RoKXtuPW4uc3BsaXQoIiAiKTtmb3IodmFyIG89bi5sZW5ndGg7by0tOylpPW5ldyBSZWdFeHAoIlxcLiIrbltvXSsiKD8hW2EtekEtWlxcLV0rKSIsImkiKSxlPWUucmVwbGFjZShpLCIiKX1yZXR1cm4gMD09PWUubGVuZ3RofWZ1bmN0aW9uIHUodCxlKXt2YXIgaTtpZih0LmdldEVsZW1lbnRCeUlkJiYoaT10LmdldEVsZW1lbnRCeUlkKGUpKSxpKXJldHVybiBpO3ZhciByLG4scz10LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7Zm9yKG49MDtuPHMubGVuZ3RoO24rKylpZihyPXNbbl0sZT09PXIuZ2V0QXR0cmlidXRlKCJpZCIpKXJldHVybiByfWZ1bmN0aW9uIGYodCl7Zm9yKHZhciBlPW4odCxbInVzZSIsInN2Zzp1c2UiXSksaT0wO2UubGVuZ3RoJiZpPGUubGVuZ3RoOyl7dmFyIHIscyxvLGEsaCxjPWVbaV0sbD1jLmdldEF0dHJpYnV0ZSgieGxpbms6aHJlZiIpLnN1YnN0cigxKSxmPWMuZ2V0QXR0cmlidXRlKCJ4Iil8fDAsZz1jLmdldEF0dHJpYnV0ZSgieSIpfHwwLHA9dSh0LGwpLmNsb25lTm9kZSghMCksdj0ocC5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpfHwiIikrIiB0cmFuc2xhdGUoIitmKyIsICIrZysiKSIsYj1lLmxlbmd0aDtpZihkKHApLC9ec3ZnJC9pLnRlc3QocC5ub2RlTmFtZSkpe3ZhciBtPXAub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJnIik7Zm9yKG89MCxhPXAuYXR0cmlidXRlcyxoPWEubGVuZ3RoO288aDtvKyspcz1hLml0ZW0obyksbS5zZXRBdHRyaWJ1dGUocy5ub2RlTmFtZSxzLm5vZGVWYWx1ZSk7Zm9yKDtwLmZpcnN0Q2hpbGQ7KW0uYXBwZW5kQ2hpbGQocC5maXJzdENoaWxkKTtwPW19Zm9yKG89MCxhPWMuYXR0cmlidXRlcyxoPWEubGVuZ3RoO288aDtvKyspcz1hLml0ZW0obyksIngiIT09cy5ub2RlTmFtZSYmInkiIT09cy5ub2RlTmFtZSYmInhsaW5rOmhyZWYiIT09cy5ub2RlTmFtZSYmKCJ0cmFuc2Zvcm0iPT09cy5ub2RlTmFtZT92PXMubm9kZVZhbHVlKyIgIit2OnAuc2V0QXR0cmlidXRlKHMubm9kZU5hbWUscy5ub2RlVmFsdWUpKTtwLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIix2KSxwLnNldEF0dHJpYnV0ZSgiaW5zdGFudGlhdGVkX2J5X3VzZSIsIjEiKSxwLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKSxyPWMucGFyZW50Tm9kZSxyLnJlcGxhY2VDaGlsZChwLGMpLGUubGVuZ3RoPT09YiYmaSsrfX1mdW5jdGlvbiBkKHQpe3ZhciBlLGkscixuLHM9dC5nZXRBdHRyaWJ1dGUoInZpZXdCb3giKSxvPTEsYT0xLGg9MCxjPTAsbD10LmdldEF0dHJpYnV0ZSgid2lkdGgiKSx1PXQuZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxmPXQuZ2V0QXR0cmlidXRlKCJ4Iil8fDAsZD10LmdldEF0dHJpYnV0ZSgieSIpfHwwLGc9dC5nZXRBdHRyaWJ1dGUoInByZXNlcnZlQXNwZWN0UmF0aW8iKXx8IiIscD0hc3x8IXcudGVzdCh0Lm5vZGVOYW1lKXx8IShzPXMubWF0Y2goTSkpLGI9IWx8fCF1fHwiMTAwJSI9PT1sfHwiMTAwJSI9PT11LG09cCYmYix5PXt9LF89IiI7aWYoeS53aWR0aD0wLHkuaGVpZ2h0PTAseS50b0JlUGFyc2VkPW0sbSlyZXR1cm4geTtpZihwKXJldHVybiB5LndpZHRoPXgobCkseS5oZWlnaHQ9eCh1KSx5O2lmKGg9LXBhcnNlRmxvYXQoc1sxXSksYz0tcGFyc2VGbG9hdChzWzJdKSxlPXBhcnNlRmxvYXQoc1szXSksaT1wYXJzZUZsb2F0KHNbNF0pLGI/KHkud2lkdGg9ZSx5LmhlaWdodD1pKTooeS53aWR0aD14KGwpLHkuaGVpZ2h0PXgodSksbz15LndpZHRoL2UsYT15LmhlaWdodC9pKSxnPXYudXRpbC5wYXJzZVByZXNlcnZlQXNwZWN0UmF0aW9BdHRyaWJ1dGUoZyksIm5vbmUiIT09Zy5hbGlnblgmJihhPW89bz5hP2E6byksMT09PW8mJjE9PT1hJiYwPT09aCYmMD09PWMmJjA9PT1mJiYwPT09ZClyZXR1cm4geTtpZigoZnx8ZCkmJihfPSIgdHJhbnNsYXRlKCIreChmKSsiICIreChkKSsiKSAiKSxyPV8rIiBtYXRyaXgoIitvKyIgMCAwICIrYSsiICIraCpvKyIgIitjKmErIikgIiwic3ZnIj09PXQubm9kZU5hbWUpe2ZvcihuPXQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJnIik7dC5maXJzdENoaWxkOyluLmFwcGVuZENoaWxkKHQuZmlyc3RDaGlsZCk7dC5hcHBlbmRDaGlsZChuKX1lbHNlIG49dCxyPW4uZ2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iKStyO3JldHVybiBuLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIixyKSx5fWZ1bmN0aW9uIGcodCl7dmFyIGU9dC5vYmplY3RzLGk9dC5vcHRpb25zO3JldHVybiBlPWUubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB2W20odC50eXBlKV0uZnJvbU9iamVjdCh0KX0pLHtvYmplY3RzOmUsb3B0aW9uczppfX1mdW5jdGlvbiBwKHQsZSxpKXtlW2ldJiZlW2ldLnRvU1ZHJiZ0LnB1c2goJ1x0PHBhdHRlcm4geD0iMCIgeT0iMCIgaWQ9IicsaSwnUGF0dGVybiIgJywnd2lkdGg9IicsZVtpXS5zb3VyY2Uud2lkdGgsJyIgaGVpZ2h0PSInLGVbaV0uc291cmNlLmhlaWdodCwnIiBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIj5cbicsJ1x0XHQ8aW1hZ2UgeD0iMCIgeT0iMCIgJywnd2lkdGg9IicsZVtpXS5zb3VyY2Uud2lkdGgsJyIgaGVpZ2h0PSInLGVbaV0uc291cmNlLmhlaWdodCwnIiB4bGluazpocmVmPSInLGVbaV0uc291cmNlLnNyYywnIj48L2ltYWdlPlxuXHQ8L3BhdHRlcm4+XG4nKX12YXIgdj10LmZhYnJpY3x8KHQuZmFicmljPXt9KSxiPXYudXRpbC5vYmplY3QuZXh0ZW5kLG09di51dGlsLnN0cmluZy5jYXBpdGFsaXplLHk9di51dGlsLm9iamVjdC5jbG9uZSxfPXYudXRpbC50b0ZpeGVkLHg9di51dGlsLnBhcnNlVW5pdCxTPXYudXRpbC5tdWx0aXBseVRyYW5zZm9ybU1hdHJpY2VzLEM9L14ocGF0aHxjaXJjbGV8cG9seWdvbnxwb2x5bGluZXxlbGxpcHNlfHJlY3R8bGluZXxpbWFnZXx0ZXh0KSQvaSx3PS9eKHN5bWJvbHxpbWFnZXxtYXJrZXJ8cGF0dGVybnx2aWV3fHN2ZykkL2ksTz0vXig/OnBhdHRlcm58ZGVmc3xzeW1ib2x8bWV0YWRhdGEpJC9pLFQ9L14oc3ltYm9sfGd8YXxzdmcpJC9pLGs9e2N4OiJsZWZ0Iix4OiJsZWZ0IixyOiJyYWRpdXMiLGN5OiJ0b3AiLHk6InRvcCIsZGlzcGxheToidmlzaWJsZSIsdmlzaWJpbGl0eToidmlzaWJsZSIsdHJhbnNmb3JtOiJ0cmFuc2Zvcm1NYXRyaXgiLCJmaWxsLW9wYWNpdHkiOiJmaWxsT3BhY2l0eSIsImZpbGwtcnVsZSI6ImZpbGxSdWxlIiwiZm9udC1mYW1pbHkiOiJmb250RmFtaWx5IiwiZm9udC1zaXplIjoiZm9udFNpemUiLCJmb250LXN0eWxlIjoiZm9udFN0eWxlIiwiZm9udC13ZWlnaHQiOiJmb250V2VpZ2h0Iiwic3Ryb2tlLWRhc2hhcnJheSI6InN0cm9rZURhc2hBcnJheSIsInN0cm9rZS1saW5lY2FwIjoic3Ryb2tlTGluZUNhcCIsInN0cm9rZS1saW5lam9pbiI6InN0cm9rZUxpbmVKb2luIiwic3Ryb2tlLW1pdGVybGltaXQiOiJzdHJva2VNaXRlckxpbWl0Iiwic3Ryb2tlLW9wYWNpdHkiOiJzdHJva2VPcGFjaXR5Iiwic3Ryb2tlLXdpZHRoIjoic3Ryb2tlV2lkdGgiLCJ0ZXh0LWRlY29yYXRpb24iOiJ0ZXh0RGVjb3JhdGlvbiIsInRleHQtYW5jaG9yIjoib3JpZ2luWCJ9LGo9e3N0cm9rZToic3Ryb2tlT3BhY2l0eSIsZmlsbDoiZmlsbE9wYWNpdHkifTt2LmNzc1J1bGVzPXt9LHYuZ3JhZGllbnREZWZzPXt9LHYucGFyc2VUcmFuc2Zvcm1BdHRyaWJ1dGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dmFyIGk9ZVswXSxyPTM9PT1lLmxlbmd0aD9lWzFdOjAsbj0zPT09ZS5sZW5ndGg/ZVsyXTowO3RbMF09TWF0aC5jb3MoaSksdFsxXT1NYXRoLnNpbihpKSx0WzJdPS1NYXRoLnNpbihpKSx0WzNdPU1hdGguY29zKGkpLHRbNF09ci0odFswXSpyK3RbMl0qbiksdFs1XT1uLSh0WzFdKnIrdFszXSpuKX1mdW5jdGlvbiBlKHQsZSl7dmFyIGk9ZVswXSxyPTI9PT1lLmxlbmd0aD9lWzFdOmVbMF07dFswXT1pLHRbM109cn1mdW5jdGlvbiBpKHQsZSl7dFsyXT1NYXRoLnRhbih2LnV0aWwuZGVncmVlc1RvUmFkaWFucyhlWzBdKSk7Cn1mdW5jdGlvbiByKHQsZSl7dFsxXT1NYXRoLnRhbih2LnV0aWwuZGVncmVlc1RvUmFkaWFucyhlWzBdKSl9ZnVuY3Rpb24gbih0LGUpe3RbNF09ZVswXSwyPT09ZS5sZW5ndGgmJih0WzVdPWVbMV0pfXZhciBzPVsxLDAsMCwxLDAsMF0sbz12LnJlTnVtLGE9Iig/OlxccyssP1xccyp8LFxccyopIixoPSIoPzooc2tld1gpXFxzKlxcKFxccyooIitvKyIpXFxzKlxcKSkiLGM9Iig/Oihza2V3WSlcXHMqXFwoXFxzKigiK28rIilcXHMqXFwpKSIsbD0iKD86KHJvdGF0ZSlcXHMqXFwoXFxzKigiK28rIikoPzoiK2ErIigiK28rIikiK2ErIigiK28rIikpP1xccypcXCkpIix1PSIoPzooc2NhbGUpXFxzKlxcKFxccyooIitvKyIpKD86IithKyIoIitvKyIpKT9cXHMqXFwpKSIsZj0iKD86KHRyYW5zbGF0ZSlcXHMqXFwoXFxzKigiK28rIikoPzoiK2ErIigiK28rIikpP1xccypcXCkpIixkPSIoPzoobWF0cml4KVxccypcXChcXHMqKCIrbysiKSIrYSsiKCIrbysiKSIrYSsiKCIrbysiKSIrYSsiKCIrbysiKSIrYSsiKCIrbysiKSIrYSsiKCIrbysiKVxccypcXCkpIixnPSIoPzoiK2QrInwiK2YrInwiK3UrInwiK2wrInwiK2grInwiK2MrIikiLHA9Iig/OiIrZysiKD86IithKyIqIitnKyIpKikiLGI9Il5cXHMqKD86IitwKyI/KVxccyokIixtPW5ldyBSZWdFeHAoYikseT1uZXcgUmVnRXhwKGcsImciKTtyZXR1cm4gZnVuY3Rpb24obyl7dmFyIGE9cy5jb25jYXQoKSxoPVtdO2lmKCFvfHxvJiYhbS50ZXN0KG8pKXJldHVybiBhO28ucmVwbGFjZSh5LGZ1bmN0aW9uKG8pe3ZhciBjPW5ldyBSZWdFeHAoZykuZXhlYyhvKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuISF0fSksbD1jWzFdLHU9Yy5zbGljZSgyKS5tYXAocGFyc2VGbG9hdCk7c3dpdGNoKGwpe2Nhc2UidHJhbnNsYXRlIjpuKGEsdSk7YnJlYWs7Y2FzZSJyb3RhdGUiOnVbMF09di51dGlsLmRlZ3JlZXNUb1JhZGlhbnModVswXSksdChhLHUpO2JyZWFrO2Nhc2Uic2NhbGUiOmUoYSx1KTticmVhaztjYXNlInNrZXdYIjppKGEsdSk7YnJlYWs7Y2FzZSJza2V3WSI6cihhLHUpO2JyZWFrO2Nhc2UibWF0cml4IjphPXV9aC5wdXNoKGEuY29uY2F0KCkpLGE9cy5jb25jYXQoKX0pO2Zvcih2YXIgYz1oWzBdO2gubGVuZ3RoPjE7KWguc2hpZnQoKSxjPXYudXRpbC5tdWx0aXBseVRyYW5zZm9ybU1hdHJpY2VzKGMsaFswXSk7cmV0dXJuIGN9fSgpO3ZhciBNPW5ldyBSZWdFeHAoIl5cXHMqKCIrdi5yZU51bSsiKylcXHMqLD9cXHMqKCIrdi5yZU51bSsiKylcXHMqLD9cXHMqKCIrdi5yZU51bSsiKylcXHMqLD9cXHMqKCIrdi5yZU51bSsiKylcXHMqJCIpO3YucGFyc2VTVkdEb2N1bWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IoO3QmJih0PXQucGFyZW50Tm9kZSk7KWlmKHQubm9kZU5hbWUmJmUudGVzdCh0Lm5vZGVOYW1lLnJlcGxhY2UoInN2ZzoiLCIiKSkmJiF0LmdldEF0dHJpYnV0ZSgiaW5zdGFudGlhdGVkX2J5X3VzZSIpKXJldHVybiEwO3JldHVybiExfXJldHVybiBmdW5jdGlvbihlLGkscil7aWYoZSl7ZihlKTt2YXIgbj1uZXcgRGF0ZSxzPXYuT2JqZWN0Ll9fdWlkKyssbz1kKGUpLGE9di51dGlsLnRvQXJyYXkoZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTtpZihvLnN2Z1VpZD1zLDA9PT1hLmxlbmd0aCYmdi5pc0xpa2VseU5vZGUpe2E9ZS5zZWxlY3ROb2RlcygnLy8qW25hbWUoLikhPSJzdmciXScpO2Zvcih2YXIgaD1bXSxjPTAsbD1hLmxlbmd0aDtjPGw7YysrKWhbY109YVtjXTthPWh9dmFyIHU9YS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGQoZSksQy50ZXN0KGUubm9kZU5hbWUucmVwbGFjZSgic3ZnOiIsIiIpKSYmIXQoZSxPKX0pO2lmKCF1fHx1JiYhdS5sZW5ndGgpcmV0dXJuIHZvaWQoaSYmaShbXSx7fSkpO3YuZ3JhZGllbnREZWZzW3NdPXYuZ2V0R3JhZGllbnREZWZzKGUpLHYuY3NzUnVsZXNbc109di5nZXRDU1NSdWxlcyhlKSx2LnBhcnNlRWxlbWVudHModSxmdW5jdGlvbih0KXt2LmRvY3VtZW50UGFyc2luZ1RpbWU9bmV3IERhdGUtbixpJiZpKHQsbyl9LHkobykscil9fX0oKTt2YXIgQT17aGFzOmZ1bmN0aW9uKHQsZSl7ZSghMSl9LGdldDpmdW5jdGlvbigpe30sc2V0OmZ1bmN0aW9uKCl7fX0sUD1uZXcgUmVnRXhwKCIobm9ybWFsfGl0YWxpYyk/XFxzKihub3JtYWx8c21hbGwtY2Fwcyk/XFxzKihub3JtYWx8Ym9sZHxib2xkZXJ8bGlnaHRlcnwxMDB8MjAwfDMwMHw0MDB8NTAwfDYwMHw3MDB8ODAwfDkwMCk/XFxzKigiK3YucmVOdW0rIig/OnB4fGNtfG1tfGVtfHB0fHBjfGluKSopKD86XFwvKG5vcm1hbHwiK3YucmVOdW0rIikpP1xccysoLiopIik7Yih2LHtwYXJzZUZvbnREZWNsYXJhdGlvbjpmdW5jdGlvbih0LGUpe3ZhciBpPXQubWF0Y2goUCk7aWYoaSl7dmFyIHI9aVsxXSxuPWlbM10scz1pWzRdLG89aVs1XSxhPWlbNl07ciYmKGUuZm9udFN0eWxlPXIpLG4mJihlLmZvbnRXZWlnaHQ9aXNOYU4ocGFyc2VGbG9hdChuKSk/bjpwYXJzZUZsb2F0KG4pKSxzJiYoZS5mb250U2l6ZT14KHMpKSxhJiYoZS5mb250RmFtaWx5PWEpLG8mJihlLmxpbmVIZWlnaHQ9Im5vcm1hbCI9PT1vPzE6byl9fSxnZXRHcmFkaWVudERlZnM6ZnVuY3Rpb24odCl7dmFyIGUsaSxyLHM9WyJsaW5lYXJHcmFkaWVudCIsInJhZGlhbEdyYWRpZW50Iiwic3ZnOmxpbmVhckdyYWRpZW50Iiwic3ZnOnJhZGlhbEdyYWRpZW50Il0sbz1uKHQscyksYT0wLGg9e30sYz17fTtmb3IoYT1vLmxlbmd0aDthLS07KWU9b1thXSxyPWUuZ2V0QXR0cmlidXRlKCJ4bGluazpocmVmIiksaT1lLmdldEF0dHJpYnV0ZSgiaWQiKSxyJiYoY1tpXT1yLnN1YnN0cigxKSksaFtpXT1lO2ZvcihpIGluIGMpe3ZhciBsPWhbY1tpXV0uY2xvbmVOb2RlKCEwKTtmb3IoZT1oW2ldO2wuZmlyc3RDaGlsZDspZS5hcHBlbmRDaGlsZChsLmZpcnN0Q2hpbGQpfXJldHVybiBofSxwYXJzZUF0dHJpYnV0ZXM6ZnVuY3Rpb24odCxuLHMpe2lmKHQpe3ZhciBvLGgsYz17fTsidW5kZWZpbmVkIj09dHlwZW9mIHMmJihzPXQuZ2V0QXR0cmlidXRlKCJzdmdVaWQiKSksdC5wYXJlbnROb2RlJiZULnRlc3QodC5wYXJlbnROb2RlLm5vZGVOYW1lKSYmKGM9di5wYXJzZUF0dHJpYnV0ZXModC5wYXJlbnROb2RlLG4scykpLGg9YyYmYy5mb250U2l6ZXx8dC5nZXRBdHRyaWJ1dGUoImZvbnQtc2l6ZSIpfHx2LlRleHQuREVGQVVMVF9TVkdfRk9OVF9TSVpFO3ZhciBsPW4ucmVkdWNlKGZ1bmN0aW9uKHIsbil7cmV0dXJuIG89dC5nZXRBdHRyaWJ1dGUobiksbyYmKG49ZShuKSxvPWkobixvLGMsaCkscltuXT1vKSxyfSx7fSk7cmV0dXJuIGw9YihsLGIoYSh0LHMpLHYucGFyc2VTdHlsZUF0dHJpYnV0ZSh0KSkpLGwuZm9udCYmdi5wYXJzZUZvbnREZWNsYXJhdGlvbihsLmZvbnQsbCkscihiKGMsbCkpfX0scGFyc2VFbGVtZW50czpmdW5jdGlvbih0LGUsaSxyKXtuZXcgdi5FbGVtZW50c1BhcnNlcih0LGUsaSxyKS5wYXJzZSgpfSxwYXJzZVN0eWxlQXR0cmlidXRlOmZ1bmN0aW9uKHQpe3ZhciBlPXt9LGk9dC5nZXRBdHRyaWJ1dGUoInN0eWxlIik7cmV0dXJuIGk/KCJzdHJpbmciPT10eXBlb2YgaT9zKGksZSk6byhpLGUpLGUpOmV9LHBhcnNlUG9pbnRzQXR0cmlidXRlOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiBudWxsO3Q9dC5yZXBsYWNlKC8sL2csIiAiKS50cmltKCksdD10LnNwbGl0KC9ccysvKTt2YXIgZSxpLHI9W107Zm9yKGU9MCxpPXQubGVuZ3RoO2U8aTtlKz0yKXIucHVzaCh7eDpwYXJzZUZsb2F0KHRbZV0pLHk6cGFyc2VGbG9hdCh0W2UrMV0pfSk7cmV0dXJuIHJ9LGdldENTU1J1bGVzOmZ1bmN0aW9uKHQpe2Zvcih2YXIgcixuPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInN0eWxlIikscz17fSxvPTAsYT1uLmxlbmd0aDtvPGE7bysrKXt2YXIgaD1uW29dLnRleHRDb250ZW50fHxuW29dLnRleHQ7aD1oLnJlcGxhY2UoL1wvXCpbXHNcU10qP1wqXC8vZywiIiksIiIhPT1oLnRyaW0oKSYmKHI9aC5tYXRjaCgvW157XSpce1tcc1xTXSo/XH0vZykscj1yLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCl9KSxyLmZvckVhY2goZnVuY3Rpb24odCl7Zm9yKHZhciByPXQubWF0Y2goLyhbXHNcU10qPylccypceyhbXn1dKilcfS8pLG49e30sbz1yWzJdLnRyaW0oKSxhPW8ucmVwbGFjZSgvOyQvLCIiKS5zcGxpdCgvXHMqO1xzKi8pLGg9MCxjPWEubGVuZ3RoO2g8YztoKyspe3ZhciBsPWFbaF0uc3BsaXQoL1xzKjpccyovKSx1PWUobFswXSksZj1pKHUsbFsxXSxsWzBdKTtuW3VdPWZ9dD1yWzFdLHQuc3BsaXQoIiwiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Q9dC5yZXBsYWNlKC9ec3ZnL2ksIiIpLnRyaW0oKSwiIiE9PXQmJihzW3RdP3YudXRpbC5vYmplY3QuZXh0ZW5kKHNbdF0sbik6c1t0XT12LnV0aWwub2JqZWN0LmNsb25lKG4pKX0pfSkpfXJldHVybiBzfSxsb2FkU1ZHRnJvbVVSTDpmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gcihyKXt2YXIgbj1yLnJlc3BvbnNlWE1MO24mJiFuLmRvY3VtZW50RWxlbWVudCYmdi53aW5kb3cuQWN0aXZlWE9iamVjdCYmci5yZXNwb25zZVRleHQmJihuPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIiksbi5hc3luYz0iZmFsc2UiLG4ubG9hZFhNTChyLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC88IURPQ1RZUEVbXHNcU10qPyhcW1tcc1xTXSpcXSkqPz4vaSwiIikpKSxuJiZuLmRvY3VtZW50RWxlbWVudHx8ZSYmZShudWxsKSx2LnBhcnNlU1ZHRG9jdW1lbnQobi5kb2N1bWVudEVsZW1lbnQsZnVuY3Rpb24oaSxyKXtBLnNldCh0LHtvYmplY3RzOnYudXRpbC5hcnJheS5pbnZva2UoaSwidG9PYmplY3QiKSxvcHRpb25zOnJ9KSxlJiZlKGkscil9LGkpfXQ9dC5yZXBsYWNlKC9eXG5ccyovLCIiKS50cmltKCksQS5oYXModCxmdW5jdGlvbihpKXtpP0EuZ2V0KHQsZnVuY3Rpb24odCl7dmFyIGk9Zyh0KTtlKGkub2JqZWN0cyxpLm9wdGlvbnMpfSk6bmV3IHYudXRpbC5yZXF1ZXN0KHQse21ldGhvZDoiZ2V0IixvbkNvbXBsZXRlOnJ9KX0pfSxsb2FkU1ZHRnJvbVN0cmluZzpmdW5jdGlvbih0LGUsaSl7dD10LnRyaW0oKTt2YXIgcjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIERPTVBhcnNlcil7dmFyIG49bmV3IERPTVBhcnNlcjtuJiZuLnBhcnNlRnJvbVN0cmluZyYmKHI9bi5wYXJzZUZyb21TdHJpbmcodCwidGV4dC94bWwiKSl9ZWxzZSB2LndpbmRvdy5BY3RpdmVYT2JqZWN0JiYocj1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLHIuYXN5bmM9ImZhbHNlIixyLmxvYWRYTUwodC5yZXBsYWNlKC88IURPQ1RZUEVbXHNcU10qPyhcW1tcc1xTXSpcXSkqPz4vaSwiIikpKTt2LnBhcnNlU1ZHRG9jdW1lbnQoci5kb2N1bWVudEVsZW1lbnQsZnVuY3Rpb24odCxpKXtlKHQsaSl9LGkpfSxjcmVhdGVTVkdGb250RmFjZXNNYXJrdXA6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGkscixuLHMsbyxhLGg9IiIsYz17fSxsPXYuZm9udFBhdGhzLHU9MCxmPXQubGVuZ3RoO3U8Zjt1KyspaWYoZT10W3VdLGk9ZS5mb250RmFtaWx5LGUudHlwZS5pbmRleE9mKCJ0ZXh0IikhPT0tMSYmIWNbaV0mJmxbaV0mJihjW2ldPSEwLGUuc3R5bGVzKSl7cj1lLnN0eWxlcztmb3IocyBpbiByKXtuPXJbc107Zm9yKGEgaW4gbilvPW5bYV0saT1vLmZvbnRGYW1pbHksIWNbaV0mJmxbaV0mJihjW2ldPSEwKX19Zm9yKHZhciBkIGluIGMpaCs9WyJcdFx0QGZvbnQtZmFjZSB7XG4iLCJcdFx0XHRmb250LWZhbWlseTogJyIsZCwiJztcbiIsIlx0XHRcdHNyYzogdXJsKCciLGxbZF0sIicpO1xuIiwiXHRcdH1cbiJdLmpvaW4oIiIpO3JldHVybiBoJiYoaD1bJ1x0PHN0eWxlIHR5cGU9InRleHQvY3NzIj4nLCI8IVtDREFUQVtcbiIsaCwiXV0+IiwiPC9zdHlsZT5cbiJdLmpvaW4oIiIpKSxofSxjcmVhdGVTVkdSZWZFbGVtZW50c01hcmt1cDpmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gcChlLHQsImJhY2tncm91bmRDb2xvciIpLHAoZSx0LCJvdmVybGF5Q29sb3IiKSxlLmpvaW4oIiIpfX0pfSgidW5kZWZpbmVkIiE9dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0aGlzKSxmYWJyaWMuRWxlbWVudHNQYXJzZXI9ZnVuY3Rpb24odCxlLGkscil7dGhpcy5lbGVtZW50cz10LHRoaXMuY2FsbGJhY2s9ZSx0aGlzLm9wdGlvbnM9aSx0aGlzLnJldml2ZXI9cix0aGlzLnN2Z1VpZD1pJiZpLnN2Z1VpZHx8MH0sZmFicmljLkVsZW1lbnRzUGFyc2VyLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbigpe3RoaXMuaW5zdGFuY2VzPW5ldyBBcnJheSh0aGlzLmVsZW1lbnRzLmxlbmd0aCksdGhpcy5udW1FbGVtZW50cz10aGlzLmVsZW1lbnRzLmxlbmd0aCx0aGlzLmNyZWF0ZU9iamVjdHMoKX0sZmFicmljLkVsZW1lbnRzUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVPYmplY3RzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT10aGlzLmVsZW1lbnRzLmxlbmd0aDt0PGU7dCsrKXRoaXMuZWxlbWVudHNbdF0uc2V0QXR0cmlidXRlKCJzdmdVaWQiLHRoaXMuc3ZnVWlkKSxmdW5jdGlvbih0LGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmNyZWF0ZU9iamVjdCh0LmVsZW1lbnRzW2VdLGUpfSwwKX0odGhpcyx0KX0sZmFicmljLkVsZW1lbnRzUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVPYmplY3Q9ZnVuY3Rpb24odCxlKXt2YXIgaT1mYWJyaWNbZmFicmljLnV0aWwuc3RyaW5nLmNhcGl0YWxpemUodC50YWdOYW1lLnJlcGxhY2UoInN2ZzoiLCIiKSldO2lmKGkmJmkuZnJvbUVsZW1lbnQpdHJ5e3RoaXMuX2NyZWF0ZU9iamVjdChpLHQsZSl9Y2F0Y2godCl7ZmFicmljLmxvZyh0KX1lbHNlIHRoaXMuY2hlY2tJZkRvbmUoKX0sZmFicmljLkVsZW1lbnRzUGFyc2VyLnByb3RvdHlwZS5fY3JlYXRlT2JqZWN0PWZ1bmN0aW9uKHQsZSxpKXtpZih0LmFzeW5jKXQuZnJvbUVsZW1lbnQoZSx0aGlzLmNyZWF0ZUNhbGxiYWNrKGksZSksdGhpcy5vcHRpb25zKTtlbHNle3ZhciByPXQuZnJvbUVsZW1lbnQoZSx0aGlzLm9wdGlvbnMpO3RoaXMucmVzb2x2ZUdyYWRpZW50KHIsImZpbGwiKSx0aGlzLnJlc29sdmVHcmFkaWVudChyLCJzdHJva2UiKSx0aGlzLnJldml2ZXImJnRoaXMucmV2aXZlcihlLHIpLHRoaXMuaW5zdGFuY2VzW2ldPXIsdGhpcy5jaGVja0lmRG9uZSgpfX0sZmFicmljLkVsZW1lbnRzUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVDYWxsYmFjaz1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKHIpe2kucmVzb2x2ZUdyYWRpZW50KHIsImZpbGwiKSxpLnJlc29sdmVHcmFkaWVudChyLCJzdHJva2UiKSxpLnJldml2ZXImJmkucmV2aXZlcihlLHIpLGkuaW5zdGFuY2VzW3RdPXIsaS5jaGVja0lmRG9uZSgpfX0sZmFicmljLkVsZW1lbnRzUGFyc2VyLnByb3RvdHlwZS5yZXNvbHZlR3JhZGllbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10LmdldChlKTtpZigvXnVybFwoLy50ZXN0KGkpKXt2YXIgcj1pLnNsaWNlKDUsaS5sZW5ndGgtMSk7ZmFicmljLmdyYWRpZW50RGVmc1t0aGlzLnN2Z1VpZF1bcl0mJnQuc2V0KGUsZmFicmljLkdyYWRpZW50LmZyb21FbGVtZW50KGZhYnJpYy5ncmFkaWVudERlZnNbdGhpcy5zdmdVaWRdW3JdLHQpKX19LGZhYnJpYy5FbGVtZW50c1BhcnNlci5wcm90b3R5cGUuY2hlY2tJZkRvbmU9ZnVuY3Rpb24oKXswPT09LS10aGlzLm51bUVsZW1lbnRzJiYodGhpcy5pbnN0YW5jZXM9dGhpcy5pbnN0YW5jZXMuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10fSksdGhpcy5jYWxsYmFjayh0aGlzLmluc3RhbmNlcykpfSxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZSh0LGUpe3RoaXMueD10LHRoaXMueT1lfXZhciBpPXQuZmFicmljfHwodC5mYWJyaWM9e30pO3JldHVybiBpLlBvaW50P3ZvaWQgaS53YXJuKCJmYWJyaWMuUG9pbnQgaXMgYWxyZWFkeSBkZWZpbmVkIik6KGkuUG9pbnQ9ZSx2b2lkKGUucHJvdG90eXBlPXt0eXBlOiJwb2ludCIsY29uc3RydWN0b3I6ZSxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHRoaXMueCt0LngsdGhpcy55K3QueSl9LGFkZEVxdWFsczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpc30sc2NhbGFyQWRkOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0aGlzLngrdCx0aGlzLnkrdCl9LHNjYWxhckFkZEVxdWFsczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzfSxzdWJ0cmFjdDpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodGhpcy54LXQueCx0aGlzLnktdC55KX0sc3VidHJhY3RFcXVhbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXN9LHNjYWxhclN1YnRyYWN0OmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0aGlzLngtdCx0aGlzLnktdCl9LHNjYWxhclN1YnRyYWN0RXF1YWxzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngtPXQsdGhpcy55LT10LHRoaXN9LG11bHRpcGx5OmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0aGlzLngqdCx0aGlzLnkqdCl9LG11bHRpcGx5RXF1YWxzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXN9LGRpdmlkZTpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodGhpcy54L3QsdGhpcy55L3QpfSxkaXZpZGVFcXVhbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC89dCx0aGlzLnkvPXQsdGhpc30sZXE6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueD09PXQueCYmdGhpcy55PT09dC55fSxsdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54PHQueCYmdGhpcy55PHQueX0sbHRlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLng8PXQueCYmdGhpcy55PD10Lnl9LGd0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLng+dC54JiZ0aGlzLnk+dC55fSxndGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueD49dC54JiZ0aGlzLnk+PXQueX0sbGVycDpmdW5jdGlvbih0LGkpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgaSYmKGk9LjUpLGk9TWF0aC5tYXgoTWF0aC5taW4oMSxpKSwwKSxuZXcgZSh0aGlzLngrKHQueC10aGlzLngpKmksdGhpcy55Kyh0LnktdGhpcy55KSppKX0sZGlzdGFuY2VGcm9tOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMueC10LngsaT10aGlzLnktdC55O3JldHVybiBNYXRoLnNxcnQoZSplK2kqaSl9LG1pZFBvaW50RnJvbTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZXJwKHQpfSxtaW46ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKE1hdGgubWluKHRoaXMueCx0LngpLE1hdGgubWluKHRoaXMueSx0LnkpKX0sbWF4OmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZShNYXRoLm1heCh0aGlzLngsdC54KSxNYXRoLm1heCh0aGlzLnksdC55KSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueCsiLCIrdGhpcy55fSxzZXRYWTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzfSxzZXRYOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfSxzZXRZOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnk9dCx0aGlzfSxzZXRGcm9tUG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzfSxzd2FwOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMueCxpPXRoaXMueTt0aGlzLng9dC54LHRoaXMueT10LnksdC54PWUsdC55PWl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlKHRoaXMueCx0aGlzLnkpfX0pKX0oInVuZGVmaW5lZCIhPXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dGhpcyksZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGUodCl7dGhpcy5zdGF0dXM9dCx0aGlzLnBvaW50cz1bXX12YXIgaT10LmZhYnJpY3x8KHQuZmFicmljPXt9KTtyZXR1cm4gaS5JbnRlcnNlY3Rpb24/dm9pZCBpLndhcm4oImZhYnJpYy5JbnRlcnNlY3Rpb24gaXMgYWxyZWFkeSBkZWZpbmVkIik6KGkuSW50ZXJzZWN0aW9uPWUsaS5JbnRlcnNlY3Rpb24ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjplLGFwcGVuZFBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnBvaW50cy5wdXNoKHQpLHRoaXN9LGFwcGVuZFBvaW50czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wb2ludHM9dGhpcy5wb2ludHMuY29uY2F0KHQpLHRoaXN9fSxpLkludGVyc2VjdGlvbi5pbnRlcnNlY3RMaW5lTGluZT1mdW5jdGlvbih0LHIsbixzKXt2YXIgbyxhPShzLngtbi54KSoodC55LW4ueSktKHMueS1uLnkpKih0Lngtbi54KSxoPShyLngtdC54KSoodC55LW4ueSktKHIueS10LnkpKih0Lngtbi54KSxjPShzLnktbi55KSooci54LXQueCktKHMueC1uLngpKihyLnktdC55KTtpZigwIT09Yyl7dmFyIGw9YS9jLHU9aC9jOzA8PWwmJmw8PTEmJjA8PXUmJnU8PTE/KG89bmV3IGUoIkludGVyc2VjdGlvbiIpLG8uYXBwZW5kUG9pbnQobmV3IGkuUG9pbnQodC54K2wqKHIueC10LngpLHQueStsKihyLnktdC55KSkpKTpvPW5ldyBlfWVsc2Ugbz1uZXcgZSgwPT09YXx8MD09PWg/IkNvaW5jaWRlbnQiOiJQYXJhbGxlbCIpO3JldHVybiBvfSxpLkludGVyc2VjdGlvbi5pbnRlcnNlY3RMaW5lUG9seWdvbj1mdW5jdGlvbih0LGkscil7Zm9yKHZhciBuLHMsbyxhPW5ldyBlLGg9ci5sZW5ndGgsYz0wO2M8aDtjKyspbj1yW2NdLHM9clsoYysxKSVoXSxvPWUuaW50ZXJzZWN0TGluZUxpbmUodCxpLG4scyksYS5hcHBlbmRQb2ludHMoby5wb2ludHMpO3JldHVybiBhLnBvaW50cy5sZW5ndGg+MCYmKGEuc3RhdHVzPSJJbnRlcnNlY3Rpb24iKSxhfSxpLkludGVyc2VjdGlvbi5pbnRlcnNlY3RQb2x5Z29uUG9seWdvbj1mdW5jdGlvbih0LGkpe2Zvcih2YXIgcj1uZXcgZSxuPXQubGVuZ3RoLHM9MDtzPG47cysrKXt2YXIgbz10W3NdLGE9dFsocysxKSVuXSxoPWUuaW50ZXJzZWN0TGluZVBvbHlnb24obyxhLGkpO3IuYXBwZW5kUG9pbnRzKGgucG9pbnRzKX1yZXR1cm4gci5wb2ludHMubGVuZ3RoPjAmJihyLnN0YXR1cz0iSW50ZXJzZWN0aW9uIikscn0sdm9pZChpLkludGVyc2VjdGlvbi5pbnRlcnNlY3RQb2x5Z29uUmVjdGFuZ2xlPWZ1bmN0aW9uKHQscixuKXt2YXIgcz1yLm1pbihuKSxvPXIubWF4KG4pLGE9bmV3IGkuUG9pbnQoby54LHMueSksaD1uZXcgaS5Qb2ludChzLngsby55KSxjPWUuaW50ZXJzZWN0TGluZVBvbHlnb24ocyxhLHQpLGw9ZS5pbnRlcnNlY3RMaW5lUG9seWdvbihhLG8sdCksdT1lLmludGVyc2VjdExpbmVQb2x5Z29uKG8saCx0KSxmPWUuaW50ZXJzZWN0TGluZVBvbHlnb24oaCxzLHQpLGQ9bmV3IGU7cmV0dXJuIGQuYXBwZW5kUG9pbnRzKGMucG9pbnRzKSxkLmFwcGVuZFBvaW50cyhsLnBvaW50cyksZC5hcHBlbmRQb2ludHModS5wb2ludHMpLGQuYXBwZW5kUG9pbnRzKGYucG9pbnRzKSxkLnBvaW50cy5sZW5ndGg+MCYmKGQuc3RhdHVzPSJJbnRlcnNlY3Rpb24iKSxkfSkpfSgidW5kZWZpbmVkIiE9dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0aGlzKSxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZSh0KXt0P3RoaXMuX3RyeVBhcnNpbmdDb2xvcih0KTp0aGlzLnNldFNvdXJjZShbMCwwLDAsMV0pfWZ1bmN0aW9uIGkodCxlLGkpe3JldHVybiBpPDAmJihpKz0xKSxpPjEmJihpLT0xKSxpPDEvNj90KzYqKGUtdCkqaTppPC41P2U6aTwyLzM/dCsoZS10KSooMi8zLWkpKjY6dH12YXIgcj10LmZhYnJpY3x8KHQuZmFicmljPXt9KTtyZXR1cm4gci5Db2xvcj92b2lkIHIud2FybigiZmFicmljLkNvbG9yIGlzIGFscmVhZHkgZGVmaW5lZC4iKTooci5Db2xvcj1lLHIuQ29sb3IucHJvdG90eXBlPXtfdHJ5UGFyc2luZ0NvbG9yOmZ1bmN0aW9uKHQpe3ZhciBpO3QgaW4gZS5jb2xvck5hbWVNYXAmJih0PWUuY29sb3JOYW1lTWFwW3RdKSwidHJhbnNwYXJlbnQiPT09dCYmKGk9WzI1NSwyNTUsMjU1LDBdKSxpfHwoaT1lLnNvdXJjZUZyb21IZXgodCkpLGl8fChpPWUuc291cmNlRnJvbVJnYih0KSksaXx8KGk9ZS5zb3VyY2VGcm9tSHNsKHQpKSxpfHwoaT1bMCwwLDAsMV0pLGkmJnRoaXMuc2V0U291cmNlKGkpfSxfcmdiVG9Ic2w6ZnVuY3Rpb24odCxlLGkpe3QvPTI1NSxlLz0yNTUsaS89MjU1O3ZhciBuLHMsbyxhPXIudXRpbC5hcnJheS5tYXgoW3QsZSxpXSksaD1yLnV0aWwuYXJyYXkubWluKFt0LGUsaV0pO2lmKG89KGEraCkvMixhPT09aCluPXM9MDtlbHNle3ZhciBjPWEtaDtzd2l0Y2gocz1vPi41P2MvKDItYS1oKTpjLyhhK2gpLGEpe2Nhc2UgdDpuPShlLWkpL2MrKGU8aT82OjApO2JyZWFrO2Nhc2UgZTpuPShpLXQpL2MrMjticmVhaztjYXNlIGk6bj0odC1lKS9jKzR9bi89Nn1yZXR1cm5bTWF0aC5yb3VuZCgzNjAqbiksTWF0aC5yb3VuZCgxMDAqcyksTWF0aC5yb3VuZCgxMDAqbyldfSxnZXRTb3VyY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc291cmNlfSxzZXRTb3VyY2U6ZnVuY3Rpb24odCl7dGhpcy5fc291cmNlPXR9LHRvUmdiOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRTb3VyY2UoKTtyZXR1cm4icmdiKCIrdFswXSsiLCIrdFsxXSsiLCIrdFsyXSsiKSJ9LHRvUmdiYTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0U291cmNlKCk7cmV0dXJuInJnYmEoIit0WzBdKyIsIit0WzFdKyIsIit0WzJdKyIsIit0WzNdKyIpIn0sdG9Ic2w6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFNvdXJjZSgpLGU9dGhpcy5fcmdiVG9Ic2wodFswXSx0WzFdLHRbMl0pO3JldHVybiJoc2woIitlWzBdKyIsIitlWzFdKyIlLCIrZVsyXSsiJSkifSx0b0hzbGE6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFNvdXJjZSgpLGU9dGhpcy5fcmdiVG9Ic2wodFswXSx0WzFdLHRbMl0pO3JldHVybiJoc2xhKCIrZVswXSsiLCIrZVsxXSsiJSwiK2VbMl0rIiUsIit0WzNdKyIpIn0sdG9IZXg6ZnVuY3Rpb24oKXt2YXIgdCxlLGkscj10aGlzLmdldFNvdXJjZSgpO3JldHVybiB0PXJbMF0udG9TdHJpbmcoMTYpLHQ9MT09PXQubGVuZ3RoPyIwIit0OnQsZT1yWzFdLnRvU3RyaW5nKDE2KSxlPTE9PT1lLmxlbmd0aD8iMCIrZTplLGk9clsyXS50b1N0cmluZygxNiksaT0xPT09aS5sZW5ndGg/IjAiK2k6aSx0LnRvVXBwZXJDYXNlKCkrZS50b1VwcGVyQ2FzZSgpK2kudG9VcHBlckNhc2UoKX0sZ2V0QWxwaGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRTb3VyY2UoKVszXX0sc2V0QWxwaGE6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRTb3VyY2UoKTtyZXR1cm4gZVszXT10LHRoaXMuc2V0U291cmNlKGUpLHRoaXN9LHRvR3JheXNjYWxlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRTb3VyY2UoKSxlPXBhcnNlSW50KCguMyp0WzBdKy41OSp0WzFdKy4xMSp0WzJdKS50b0ZpeGVkKDApLDEwKSxpPXRbM107cmV0dXJuIHRoaXMuc2V0U291cmNlKFtlLGUsZSxpXSksdGhpc30sdG9CbGFja1doaXRlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0U291cmNlKCksaT0oLjMqZVswXSsuNTkqZVsxXSsuMTEqZVsyXSkudG9GaXhlZCgwKSxyPWVbM107cmV0dXJuIHQ9dHx8MTI3LGk9TnVtYmVyKGkpPE51bWJlcih0KT8wOjI1NSx0aGlzLnNldFNvdXJjZShbaSxpLGkscl0pLHRoaXN9LG92ZXJsYXlXaXRoOmZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBlfHwodD1uZXcgZSh0KSk7Zm9yKHZhciBpPVtdLHI9dGhpcy5nZXRBbHBoYSgpLG49LjUscz10aGlzLmdldFNvdXJjZSgpLG89dC5nZXRTb3VyY2UoKSxhPTA7YTwzO2ErKylpLnB1c2goTWF0aC5yb3VuZChzW2FdKigxLW4pK29bYV0qbikpO3JldHVybiBpWzNdPXIsdGhpcy5zZXRTb3VyY2UoaSksdGhpc319LHIuQ29sb3IucmVSR0JhPS9ecmdiYT9cKFxzKihcZHsxLDN9KD86XC5cZCspP1wlPylccyosXHMqKFxkezEsM30oPzpcLlxkKyk/XCU/KVxzKixccyooXGR7MSwzfSg/OlwuXGQrKT9cJT8pXHMqKD86XHMqLFxzKihcZCsoPzpcLlxkKyk/KVxzKik/XCkkLyxyLkNvbG9yLnJlSFNMYT0vXmhzbGE/XChccyooXGR7MSwzfSlccyosXHMqKFxkezEsM31cJSlccyosXHMqKFxkezEsM31cJSlccyooPzpccyosXHMqKFxkKyg/OlwuXGQrKT8pXHMqKT9cKSQvLHIuQ29sb3IucmVIZXg9L14jPyhbMC05YS1mXXs4fXxbMC05YS1mXXs2fXxbMC05YS1mXXs0fXxbMC05YS1mXXszfSkkL2ksci5Db2xvci5jb2xvck5hbWVNYXA9e2FxdWE6IiMwMEZGRkYiLGJsYWNrOiIjMDAwMDAwIixibHVlOiIjMDAwMEZGIixmdWNoc2lhOiIjRkYwMEZGIixncmF5OiIjODA4MDgwIixncmV5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsbGltZToiIzAwRkYwMCIsbWFyb29uOiIjODAwMDAwIixuYXZ5OiIjMDAwMDgwIixvbGl2ZToiIzgwODAwMCIsb3JhbmdlOiIjRkZBNTAwIixwdXJwbGU6IiM4MDAwODAiLHJlZDoiI0ZGMDAwMCIsc2lsdmVyOiIjQzBDMEMwIix0ZWFsOiIjMDA4MDgwIix3aGl0ZToiI0ZGRkZGRiIseWVsbG93OiIjRkZGRjAwIn0sci5Db2xvci5mcm9tUmdiPWZ1bmN0aW9uKHQpe3JldHVybiBlLmZyb21Tb3VyY2UoZS5zb3VyY2VGcm9tUmdiKHQpKX0sci5Db2xvci5zb3VyY2VGcm9tUmdiPWZ1bmN0aW9uKHQpe3ZhciBpPXQubWF0Y2goZS5yZVJHQmEpO2lmKGkpe3ZhciByPXBhcnNlSW50KGlbMV0sMTApLygvJSQvLnRlc3QoaVsxXSk/MTAwOjEpKigvJSQvLnRlc3QoaVsxXSk/MjU1OjEpLG49cGFyc2VJbnQoaVsyXSwxMCkvKC8lJC8udGVzdChpWzJdKT8xMDA6MSkqKC8lJC8udGVzdChpWzJdKT8yNTU6MSkscz1wYXJzZUludChpWzNdLDEwKS8oLyUkLy50ZXN0KGlbM10pPzEwMDoxKSooLyUkLy50ZXN0KGlbM10pPzI1NToxKTtyZXR1cm5bcGFyc2VJbnQociwxMCkscGFyc2VJbnQobiwxMCkscGFyc2VJbnQocywxMCksaVs0XT9wYXJzZUZsb2F0KGlbNF0pOjFdfX0sci5Db2xvci5mcm9tUmdiYT1lLmZyb21SZ2Isci5Db2xvci5mcm9tSHNsPWZ1bmN0aW9uKHQpe3JldHVybiBlLmZyb21Tb3VyY2UoZS5zb3VyY2VGcm9tSHNsKHQpKX0sci5Db2xvci5zb3VyY2VGcm9tSHNsPWZ1bmN0aW9uKHQpe3ZhciByPXQubWF0Y2goZS5yZUhTTGEpO2lmKHIpe3ZhciBuLHMsbyxhPShwYXJzZUZsb2F0KHJbMV0pJTM2MCszNjApJTM2MC8zNjAsaD1wYXJzZUZsb2F0KHJbMl0pLygvJSQvLnRlc3QoclsyXSk/MTAwOjEpLGM9cGFyc2VGbG9hdChyWzNdKS8oLyUkLy50ZXN0KHJbM10pPzEwMDoxKTtpZigwPT09aCluPXM9bz1jO2Vsc2V7dmFyIGw9Yzw9LjU/YyooaCsxKTpjK2gtYypoLHU9MipjLWw7bj1pKHUsbCxhKzEvMykscz1pKHUsbCxhKSxvPWkodSxsLGEtMS8zKX1yZXR1cm5bTWF0aC5yb3VuZCgyNTUqbiksTWF0aC5yb3VuZCgyNTUqcyksTWF0aC5yb3VuZCgyNTUqbykscls0XT9wYXJzZUZsb2F0KHJbNF0pOjFdfX0sci5Db2xvci5mcm9tSHNsYT1lLmZyb21Ic2wsci5Db2xvci5mcm9tSGV4PWZ1bmN0aW9uKHQpe3JldHVybiBlLmZyb21Tb3VyY2UoZS5zb3VyY2VGcm9tSGV4KHQpKX0sci5Db2xvci5zb3VyY2VGcm9tSGV4PWZ1bmN0aW9uKHQpe2lmKHQubWF0Y2goZS5yZUhleCkpe3ZhciBpPXQuc2xpY2UodC5pbmRleE9mKCIjIikrMSkscj0zPT09aS5sZW5ndGh8fDQ9PT1pLmxlbmd0aCxuPTg9PT1pLmxlbmd0aHx8ND09PWkubGVuZ3RoLHM9cj9pLmNoYXJBdCgwKStpLmNoYXJBdCgwKTppLnN1YnN0cmluZygwLDIpLG89cj9pLmNoYXJBdCgxKStpLmNoYXJBdCgxKTppLnN1YnN0cmluZygyLDQpLGE9cj9pLmNoYXJBdCgyKStpLmNoYXJBdCgyKTppLnN1YnN0cmluZyg0LDYpLGg9bj9yP2kuY2hhckF0KDMpK2kuY2hhckF0KDMpOmkuc3Vic3RyaW5nKDYsOCk6IkZGIjtyZXR1cm5bcGFyc2VJbnQocywxNikscGFyc2VJbnQobywxNikscGFyc2VJbnQoYSwxNikscGFyc2VGbG9hdCgocGFyc2VJbnQoaCwxNikvMjU1KS50b0ZpeGVkKDIpKV19fSx2b2lkKHIuQ29sb3IuZnJvbVNvdXJjZT1mdW5jdGlvbih0KXt2YXIgaT1uZXcgZTtyZXR1cm4gaS5zZXRTb3VyY2UodCksaX0pKX0oInVuZGVmaW5lZCIhPXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dGhpcyksZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBlLGkscixuPXQuZ2V0QXR0cmlidXRlKCJzdHlsZSIpLHM9dC5nZXRBdHRyaWJ1dGUoIm9mZnNldCIpfHwwO2lmKHM9cGFyc2VGbG9hdChzKS8oLyUkLy50ZXN0KHMpPzEwMDoxKSxzPXM8MD8wOnM+MT8xOnMsbil7dmFyIG89bi5zcGxpdCgvXHMqO1xzKi8pOyIiPT09b1tvLmxlbmd0aC0xXSYmby5wb3AoKTtmb3IodmFyIGE9by5sZW5ndGg7YS0tOyl7dmFyIGg9b1thXS5zcGxpdCgvXHMqOlxzKi8pLGM9aFswXS50cmltKCksbD1oWzFdLnRyaW0oKTsic3RvcC1jb2xvciI9PT1jP2U9bDoic3RvcC1vcGFjaXR5Ij09PWMmJihyPWwpfX1yZXR1cm4gZXx8KGU9dC5nZXRBdHRyaWJ1dGUoInN0b3AtY29sb3IiKXx8InJnYigwLDAsMCkiKSxyfHwocj10LmdldEF0dHJpYnV0ZSgic3RvcC1vcGFjaXR5IikpLGU9bmV3IGZhYnJpYy5Db2xvcihlKSxpPWUuZ2V0QWxwaGEoKSxyPWlzTmFOKHBhcnNlRmxvYXQocikpPzE6cGFyc2VGbG9hdChyKSxyKj1pLHtvZmZzZXQ6cyxjb2xvcjplLnRvUmdiKCksb3BhY2l0eTpyfX1mdW5jdGlvbiBlKHQpe3JldHVybnt4MTp0LmdldEF0dHJpYnV0ZSgieDEiKXx8MCx5MTp0LmdldEF0dHJpYnV0ZSgieTEiKXx8MCx4Mjp0LmdldEF0dHJpYnV0ZSgieDIiKXx8IjEwMCUiLHkyOnQuZ2V0QXR0cmlidXRlKCJ5MiIpfHwwfX1mdW5jdGlvbiBpKHQpe3JldHVybnt4MTp0LmdldEF0dHJpYnV0ZSgiZngiKXx8dC5nZXRBdHRyaWJ1dGUoImN4Iil8fCI1MCUiLHkxOnQuZ2V0QXR0cmlidXRlKCJmeSIpfHx0LmdldEF0dHJpYnV0ZSgiY3kiKXx8IjUwJSIscjE6MCx4Mjp0LmdldEF0dHJpYnV0ZSgiY3giKXx8IjUwJSIseTI6dC5nZXRBdHRyaWJ1dGUoImN5Iil8fCI1MCUiLHIyOnQuZ2V0QXR0cmlidXRlKCJyIil8fCI1MCUifX1mdW5jdGlvbiByKHQsZSxpKXt2YXIgcixuPTAscz0xLG89IiI7Zm9yKHZhciBhIGluIGUpIkluZmluaXR5Ij09PWVbYV0/ZVthXT0xOiItSW5maW5pdHkiPT09ZVthXSYmKGVbYV09MCkscj1wYXJzZUZsb2F0KGVbYV0sMTApLHM9InN0cmluZyI9PXR5cGVvZiBlW2FdJiYvXlxkKyUkLy50ZXN0KGVbYV0pPy4wMToxLCJ4MSI9PT1hfHwieDIiPT09YXx8InIyIj09PWE/KHMqPSJvYmplY3RCb3VuZGluZ0JveCI9PT1pP3Qud2lkdGg6MSxuPSJvYmplY3RCb3VuZGluZ0JveCI9PT1pP3QubGVmdHx8MDowKToieTEiIT09YSYmInkyIiE9PWF8fChzKj0ib2JqZWN0Qm91bmRpbmdCb3giPT09aT90LmhlaWdodDoxLG49Im9iamVjdEJvdW5kaW5nQm94Ij09PWk/dC50b3B8fDA6MCksZVthXT1yKnMrbjtpZigiZWxsaXBzZSI9PT10LnR5cGUmJm51bGwhPT1lLnIyJiYib2JqZWN0Qm91bmRpbmdCb3giPT09aSYmdC5yeCE9PXQucnkpe3ZhciBoPXQucnkvdC5yeDtvPSIgc2NhbGUoMSwgIitoKyIpIixlLnkxJiYoZS55MS89aCksZS55MiYmKGUueTIvPWgpfXJldHVybiBvfWZhYnJpYy5HcmFkaWVudD1mYWJyaWMudXRpbC5jcmVhdGVDbGFzcyh7b2Zmc2V0WDowLG9mZnNldFk6MCxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3R8fCh0PXt9KTt2YXIgZT17fTt0aGlzLmlkPWZhYnJpYy5PYmplY3QuX191aWQrKyx0aGlzLnR5cGU9dC50eXBlfHwibGluZWFyIixlPXt4MTp0LmNvb3Jkcy54MXx8MCx5MTp0LmNvb3Jkcy55MXx8MCx4Mjp0LmNvb3Jkcy54Mnx8MCx5Mjp0LmNvb3Jkcy55Mnx8MH0sInJhZGlhbCI9PT10aGlzLnR5cGUmJihlLnIxPXQuY29vcmRzLnIxfHwwLGUucjI9dC5jb29yZHMucjJ8fDApLHRoaXMuY29vcmRzPWUsdGhpcy5jb2xvclN0b3BzPXQuY29sb3JTdG9wcy5zbGljZSgpLHQuZ3JhZGllbnRUcmFuc2Zvcm0mJih0aGlzLmdyYWRpZW50VHJhbnNmb3JtPXQuZ3JhZGllbnRUcmFuc2Zvcm0pLHRoaXMub2Zmc2V0WD10Lm9mZnNldFh8fHRoaXMub2Zmc2V0WCx0aGlzLm9mZnNldFk9dC5vZmZzZXRZfHx0aGlzLm9mZnNldFl9LGFkZENvbG9yU3RvcDpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdCl7dmFyIGk9bmV3IGZhYnJpYy5Db2xvcih0W2VdKTt0aGlzLmNvbG9yU3RvcHMucHVzaCh7b2Zmc2V0OmUsY29sb3I6aS50b1JnYigpLG9wYWNpdHk6aS5nZXRBbHBoYSgpfSl9cmV0dXJuIHRoaXN9LHRvT2JqZWN0OmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6dGhpcy50eXBlLGNvb3Jkczp0aGlzLmNvb3Jkcyxjb2xvclN0b3BzOnRoaXMuY29sb3JTdG9wcyxvZmZzZXRYOnRoaXMub2Zmc2V0WCxvZmZzZXRZOnRoaXMub2Zmc2V0WSxncmFkaWVudFRyYW5zZm9ybTp0aGlzLmdyYWRpZW50VHJhbnNmb3JtP3RoaXMuZ3JhZGllbnRUcmFuc2Zvcm0uY29uY2F0KCk6dGhpcy5ncmFkaWVudFRyYW5zZm9ybX19LHRvU1ZHOmZ1bmN0aW9uKHQpe3ZhciBlLGkscj1mYWJyaWMudXRpbC5vYmplY3QuY2xvbmUodGhpcy5jb29yZHMpO2lmKHRoaXMuY29sb3JTdG9wcy5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQub2Zmc2V0LWUub2Zmc2V0fSksIXQuZ3JvdXB8fCJwYXRoLWdyb3VwIiE9PXQuZ3JvdXAudHlwZSlmb3IodmFyIG4gaW4gcikieDEiPT09bnx8IngyIj09PW58fCJyMiI9PT1uP3Jbbl0rPXRoaXMub2Zmc2V0WC10LndpZHRoLzI6InkxIiE9PW4mJiJ5MiIhPT1ufHwocltuXSs9dGhpcy5vZmZzZXRZLXQuaGVpZ2h0LzIpO2k9J2lkPSJTVkdJRF8nK3RoaXMuaWQrJyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiJyx0aGlzLmdyYWRpZW50VHJhbnNmb3JtJiYoaSs9JyBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KCcrdGhpcy5ncmFkaWVudFRyYW5zZm9ybS5qb2luKCIgIikrJykiICcpLCJsaW5lYXIiPT09dGhpcy50eXBlP2U9WyI8bGluZWFyR3JhZGllbnQgIixpLCcgeDE9Iicsci54MSwnIiB5MT0iJyxyLnkxLCciIHgyPSInLHIueDIsJyIgeTI9Iicsci55MiwnIj5cbiddOiJyYWRpYWwiPT09dGhpcy50eXBlJiYoZT1bIjxyYWRpYWxHcmFkaWVudCAiLGksJyBjeD0iJyxyLngyLCciIGN5PSInLHIueTIsJyIgcj0iJyxyLnIyLCciIGZ4PSInLHIueDEsJyIgZnk9Iicsci55MSwnIj5cbiddKTtmb3IodmFyIHM9MDtzPHRoaXMuY29sb3JTdG9wcy5sZW5ndGg7cysrKWUucHVzaCgiPHN0b3AgIiwnb2Zmc2V0PSInLDEwMCp0aGlzLmNvbG9yU3RvcHNbc10ub2Zmc2V0KyIlIiwnIiBzdHlsZT0ic3RvcC1jb2xvcjonLHRoaXMuY29sb3JTdG9wc1tzXS5jb2xvcixudWxsIT09dGhpcy5jb2xvclN0b3BzW3NdLm9wYWNpdHk/IjtzdG9wLW9wYWNpdHk6ICIrdGhpcy5jb2xvclN0b3BzW3NdLm9wYWNpdHk6IjsiLCciLz5cbicpO3JldHVybiBlLnB1c2goImxpbmVhciI9PT10aGlzLnR5cGU/IjwvbGluZWFyR3JhZGllbnQ+XG4iOiI8L3JhZGlhbEdyYWRpZW50PlxuIiksZS5qb2luKCIiKX0sdG9MaXZlOmZ1bmN0aW9uKHQsZSl7dmFyIGkscixuPWZhYnJpYy51dGlsLm9iamVjdC5jbG9uZSh0aGlzLmNvb3Jkcyk7aWYodGhpcy50eXBlKXtpZihlLmdyb3VwJiYicGF0aC1ncm91cCI9PT1lLmdyb3VwLnR5cGUpZm9yKHIgaW4gbikieDEiPT09cnx8IngyIj09PXI/bltyXSs9LXRoaXMub2Zmc2V0WCtlLndpZHRoLzI6InkxIiE9PXImJiJ5MiIhPT1yfHwobltyXSs9LXRoaXMub2Zmc2V0WStlLmhlaWdodC8yKTsibGluZWFyIj09PXRoaXMudHlwZT9pPXQuY3JlYXRlTGluZWFyR3JhZGllbnQobi54MSxuLnkxLG4ueDIsbi55Mik6InJhZGlhbCI9PT10aGlzLnR5cGUmJihpPXQuY3JlYXRlUmFkaWFsR3JhZGllbnQobi54MSxuLnkxLG4ucjEsbi54MixuLnkyLG4ucjIpKTtmb3IodmFyIHM9MCxvPXRoaXMuY29sb3JTdG9wcy5sZW5ndGg7czxvO3MrKyl7dmFyIGE9dGhpcy5jb2xvclN0b3BzW3NdLmNvbG9yLGg9dGhpcy5jb2xvclN0b3BzW3NdLm9wYWNpdHksYz10aGlzLmNvbG9yU3RvcHNbc10ub2Zmc2V0OyJ1bmRlZmluZWQiIT10eXBlb2YgaCYmKGE9bmV3IGZhYnJpYy5Db2xvcihhKS5zZXRBbHBoYShoKS50b1JnYmEoKSksaS5hZGRDb2xvclN0b3AocGFyc2VGbG9hdChjKSxhKX1yZXR1cm4gaX19fSksZmFicmljLnV0aWwub2JqZWN0LmV4dGVuZChmYWJyaWMuR3JhZGllbnQse2Zyb21FbGVtZW50OmZ1bmN0aW9uKG4scyl7dmFyIG8sYSxoLGM9bi5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3RvcCIpLGw9bi5nZXRBdHRyaWJ1dGUoImdyYWRpZW50VW5pdHMiKXx8Im9iamVjdEJvdW5kaW5nQm94Iix1PW4uZ2V0QXR0cmlidXRlKCJncmFkaWVudFRyYW5zZm9ybSIpLGY9W107bz0ibGluZWFyR3JhZGllbnQiPT09bi5ub2RlTmFtZXx8IkxJTkVBUkdSQURJRU5UIj09PW4ubm9kZU5hbWU/ImxpbmVhciI6InJhZGlhbCIsImxpbmVhciI9PT1vP2E9ZShuKToicmFkaWFsIj09PW8mJihhPWkobikpO2Zvcih2YXIgZD1jLmxlbmd0aDtkLS07KWYucHVzaCh0KGNbZF0pKTtoPXIocyxhLGwpO3ZhciBnPW5ldyBmYWJyaWMuR3JhZGllbnQoe3R5cGU6byxjb29yZHM6YSxjb2xvclN0b3BzOmYsb2Zmc2V0WDotcy5sZWZ0LG9mZnNldFk6LXMudG9wfSk7cmV0dXJuKHV8fCIiIT09aCkmJihnLmdyYWRpZW50VHJhbnNmb3JtPWZhYnJpYy5wYXJzZVRyYW5zZm9ybUF0dHJpYnV0ZSgodXx8IiIpK2gpKSxnfSxmb3JPYmplY3Q6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8KGU9e30pLHIodCxlLmNvb3JkcywidXNlclNwYWNlT25Vc2UiKSxuZXcgZmFicmljLkdyYWRpZW50KGUpfX0pfSgpLGZhYnJpYy5QYXR0ZXJuPWZhYnJpYy51dGlsLmNyZWF0ZUNsYXNzKHtyZXBlYXQ6InJlcGVhdCIsb2Zmc2V0WDowLG9mZnNldFk6MCxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe2lmKHR8fCh0PXt9KSx0aGlzLmlkPWZhYnJpYy5PYmplY3QuX191aWQrKyx0LnNvdXJjZSlpZigic3RyaW5nIj09dHlwZW9mIHQuc291cmNlKWlmKCJ1bmRlZmluZWQiIT10eXBlb2YgZmFicmljLnV0aWwuZ2V0RnVuY3Rpb25Cb2R5KHQuc291cmNlKSl0aGlzLnNvdXJjZT1uZXcgRnVuY3Rpb24oZmFicmljLnV0aWwuZ2V0RnVuY3Rpb25Cb2R5KHQuc291cmNlKSk7ZWxzZXt2YXIgZT10aGlzO3RoaXMuc291cmNlPWZhYnJpYy51dGlsLmNyZWF0ZUltYWdlKCksZmFicmljLnV0aWwubG9hZEltYWdlKHQuc291cmNlLGZ1bmN0aW9uKHQpe2Uuc291cmNlPXR9KX1lbHNlIHRoaXMuc291cmNlPXQuc291cmNlO3QucmVwZWF0JiYodGhpcy5yZXBlYXQ9dC5yZXBlYXQpLHQub2Zmc2V0WCYmKHRoaXMub2Zmc2V0WD10Lm9mZnNldFgpLHQub2Zmc2V0WSYmKHRoaXMub2Zmc2V0WT10Lm9mZnNldFkpfSx0b09iamVjdDpmdW5jdGlvbigpe3ZhciB0O3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnNvdXJjZT90PVN0cmluZyh0aGlzLnNvdXJjZSk6InN0cmluZyI9PXR5cGVvZiB0aGlzLnNvdXJjZS5zcmM/dD10aGlzLnNvdXJjZS5zcmM6Im9iamVjdCI9PXR5cGVvZiB0aGlzLnNvdXJjZSYmdGhpcy5zb3VyY2UudG9EYXRhVVJMJiYodD10aGlzLnNvdXJjZS50b0RhdGFVUkwoKSkse3NvdXJjZTp0LHJlcGVhdDp0aGlzLnJlcGVhdCxvZmZzZXRYOnRoaXMub2Zmc2V0WCxvZmZzZXRZOnRoaXMub2Zmc2V0WX19LHRvU1ZHOmZ1bmN0aW9uKHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnNvdXJjZT90aGlzLnNvdXJjZSgpOnRoaXMuc291cmNlLGk9ZS53aWR0aC90LmdldFdpZHRoKCkscj1lLmhlaWdodC90LmdldEhlaWdodCgpLG49dGhpcy5vZmZzZXRYL3QuZ2V0V2lkdGgoKSxzPXRoaXMub2Zmc2V0WS90LmdldEhlaWdodCgpLG89IiI7cmV0dXJuInJlcGVhdC14IiE9PXRoaXMucmVwZWF0JiYibm8tcmVwZWF0IiE9PXRoaXMucmVwZWF0fHwocj0xKSwicmVwZWF0LXkiIT09dGhpcy5yZXBlYXQmJiJuby1yZXBlYXQiIT09dGhpcy5yZXBlYXR8fChpPTEpLGUuc3JjP289ZS5zcmM6ZS50b0RhdGFVUkwmJihvPWUudG9EYXRhVVJMKCkpLCc8cGF0dGVybiBpZD0iU1ZHSURfJyt0aGlzLmlkKyciIHg9IicrbisnIiB5PSInK3MrJyIgd2lkdGg9IicraSsnIiBoZWlnaHQ9IicrcisnIj5cbjxpbWFnZSB4PSIwIiB5PSIwIiB3aWR0aD0iJytlLndpZHRoKyciIGhlaWdodD0iJytlLmhlaWdodCsnIiB4bGluazpocmVmPSInK28rJyI+PC9pbWFnZT5cbjwvcGF0dGVybj5cbid9LHRvTGl2ZTpmdW5jdGlvbih0KXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5zb3VyY2U/dGhpcy5zb3VyY2UoKTp0aGlzLnNvdXJjZTtpZighZSlyZXR1cm4iIjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGUuc3JjKXtpZighZS5jb21wbGV0ZSlyZXR1cm4iIjtpZigwPT09ZS5uYXR1cmFsV2lkdGh8fDA9PT1lLm5hdHVyYWxIZWlnaHQpcmV0dXJuIiJ9cmV0dXJuIHQuY3JlYXRlUGF0dGVybihlLHRoaXMucmVwZWF0KX19KSxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGU9dC5mYWJyaWN8fCh0LmZhYnJpYz17fSksaT1lLnV0aWwudG9GaXhlZDtyZXR1cm4gZS5TaGFkb3c/dm9pZCBlLndhcm4oImZhYnJpYy5TaGFkb3cgaXMgYWxyZWFkeSBkZWZpbmVkLiIpOihlLlNoYWRvdz1lLnV0aWwuY3JlYXRlQ2xhc3Moe2NvbG9yOiJyZ2IoMCwwLDApIixibHVyOjAsb2Zmc2V0WDowLG9mZnNldFk6MCxhZmZlY3RTdHJva2U6ITEsaW5jbHVkZURlZmF1bHRWYWx1ZXM6ITAsaW5pdGlhbGl6ZTpmdW5jdGlvbih0KXsic3RyaW5nIj09dHlwZW9mIHQmJih0PXRoaXMuX3BhcnNlU2hhZG93KHQpKTtmb3IodmFyIGkgaW4gdCl0aGlzW2ldPXRbaV07dGhpcy5pZD1lLk9iamVjdC5fX3VpZCsrfSxfcGFyc2VTaGFkb3c6ZnVuY3Rpb24odCl7dmFyIGk9dC50cmltKCkscj1lLlNoYWRvdy5yZU9mZnNldHNBbmRCbHVyLmV4ZWMoaSl8fFtdLG49aS5yZXBsYWNlKGUuU2hhZG93LnJlT2Zmc2V0c0FuZEJsdXIsIiIpfHwicmdiKDAsMCwwKSI7cmV0dXJue2NvbG9yOm4udHJpbSgpLG9mZnNldFg6cGFyc2VJbnQoclsxXSwxMCl8fDAsb2Zmc2V0WTpwYXJzZUludChyWzJdLDEwKXx8MCxibHVyOnBhcnNlSW50KHJbM10sMTApfHwwfX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5vZmZzZXRYLHRoaXMub2Zmc2V0WSx0aGlzLmJsdXIsdGhpcy5jb2xvcl0uam9pbigicHggIil9LHRvU1ZHOmZ1bmN0aW9uKHQpe3ZhciByPTQwLG49NDAscz1lLk9iamVjdC5OVU1fRlJBQ1RJT05fRElHSVRTLG89ZS51dGlsLnJvdGF0ZVZlY3Rvcih7eDp0aGlzLm9mZnNldFgseTp0aGlzLm9mZnNldFl9LGUudXRpbC5kZWdyZWVzVG9SYWRpYW5zKC10LmFuZ2xlKSksYT0yMDtyZXR1cm4gdC53aWR0aCYmdC5oZWlnaHQmJihyPTEwMCppKChNYXRoLmFicyhvLngpK3RoaXMuYmx1cikvdC53aWR0aCxzKSthLG49MTAwKmkoKE1hdGguYWJzKG8ueSkrdGhpcy5ibHVyKS90LmhlaWdodCxzKSthKSx0LmZsaXBYJiYoby54Kj0tMSksdC5mbGlwWSYmKG8ueSo9LTEpLCc8ZmlsdGVyIGlkPSJTVkdJRF8nK3RoaXMuaWQrJyIgeT0iLScrbisnJSIgaGVpZ2h0PSInKygxMDArMipuKSsnJSIgeD0iLScrcisnJSIgd2lkdGg9IicrKDEwMCsyKnIpKyclIiA+XG5cdDxmZUdhdXNzaWFuQmx1ciBpbj0iU291cmNlQWxwaGEiIHN0ZERldmlhdGlvbj0iJytpKHRoaXMuYmx1cj90aGlzLmJsdXIvMjowLHMpKyciPjwvZmVHYXVzc2lhbkJsdXI+XG5cdDxmZU9mZnNldCBkeD0iJytpKG8ueCxzKSsnIiBkeT0iJytpKG8ueSxzKSsnIiByZXN1bHQ9Im9CbHVyIiA+PC9mZU9mZnNldD5cblx0PGZlRmxvb2QgZmxvb2QtY29sb3I9IicrdGhpcy5jb2xvcisnIi8+XG5cdDxmZUNvbXBvc2l0ZSBpbjI9Im9CbHVyIiBvcGVyYXRvcj0iaW4iIC8+XG5cdDxmZU1lcmdlPlxuXHRcdDxmZU1lcmdlTm9kZT48L2ZlTWVyZ2VOb2RlPlxuXHRcdDxmZU1lcmdlTm9kZSBpbj0iU291cmNlR3JhcGhpYyI+PC9mZU1lcmdlTm9kZT5cblx0PC9mZU1lcmdlPlxuPC9maWx0ZXI+XG4nfSx0b09iamVjdDpmdW5jdGlvbigpe2lmKHRoaXMuaW5jbHVkZURlZmF1bHRWYWx1ZXMpcmV0dXJue2NvbG9yOnRoaXMuY29sb3IsYmx1cjp0aGlzLmJsdXIsb2Zmc2V0WDp0aGlzLm9mZnNldFgsb2Zmc2V0WTp0aGlzLm9mZnNldFksYWZmZWN0U3Ryb2tlOnRoaXMuYWZmZWN0U3Ryb2tlfTt2YXIgdD17fSxpPWUuU2hhZG93LnByb3RvdHlwZTtyZXR1cm5bImNvbG9yIiwiYmx1ciIsIm9mZnNldFgiLCJvZmZzZXRZIiwiYWZmZWN0U3Ryb2tlIl0uZm9yRWFjaChmdW5jdGlvbihlKXt0aGlzW2VdIT09aVtlXSYmKHRbZV09dGhpc1tlXSl9LHRoaXMpLHR9fSksdm9pZChlLlNoYWRvdy5yZU9mZnNldHNBbmRCbHVyPS8oPzpcc3xeKSgtP1xkKyg/OnB4KT8oPzpccz98JCkpPygtP1xkKyg/OnB4KT8oPzpccz98JCkpPyhcZCsoPzpweCk/KT8oPzpccz98JCkoPzokfFxzKS8pKX0oInVuZGVmaW5lZCIhPXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dGhpcyksZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7aWYoZmFicmljLlN0YXRpY0NhbnZhcylyZXR1cm4gdm9pZCBmYWJyaWMud2FybigiZmFicmljLlN0YXRpY0NhbnZhcyBpcyBhbHJlYWR5IGRlZmluZWQuIik7dmFyIHQ9ZmFicmljLnV0aWwub2JqZWN0LmV4dGVuZCxlPWZhYnJpYy51dGlsLmdldEVsZW1lbnRPZmZzZXQsaT1mYWJyaWMudXRpbC5yZW1vdmVGcm9tQXJyYXkscj1mYWJyaWMudXRpbC50b0ZpeGVkLG49bmV3IEVycm9yKCJDb3VsZCBub3QgaW5pdGlhbGl6ZSBgY2FudmFzYCBlbGVtZW50Iik7ZmFicmljLlN0YXRpY0NhbnZhcz1mYWJyaWMudXRpbC5jcmVhdGVDbGFzcyh7aW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe2V8fChlPXt9KSx0aGlzLl9pbml0U3RhdGljKHQsZSl9LGJhY2tncm91bmRDb2xvcjoiIixiYWNrZ3JvdW5kSW1hZ2U6bnVsbCxvdmVybGF5Q29sb3I6IiIsb3ZlcmxheUltYWdlOm51bGwsaW5jbHVkZURlZmF1bHRWYWx1ZXM6ITAsc3RhdGVmdWw6ITAscmVuZGVyT25BZGRSZW1vdmU6ITAsY2xpcFRvOm51bGwsY29udHJvbHNBYm92ZU92ZXJsYXk6ITEsYWxsb3dUb3VjaFNjcm9sbGluZzohMSxpbWFnZVNtb290aGluZ0VuYWJsZWQ6ITAsdmlld3BvcnRUcmFuc2Zvcm06WzEsMCwwLDEsMCwwXSxiYWNrZ3JvdW5kVnB0OiEwLG92ZXJsYXlWcHQ6ITAsb25CZWZvcmVTY2FsZVJvdGF0ZTpmdW5jdGlvbigpe30sZW5hYmxlUmV0aW5hU2NhbGluZzohMCxfaW5pdFN0YXRpYzpmdW5jdGlvbih0LGUpe3ZhciBpPWZhYnJpYy5TdGF0aWNDYW52YXMucHJvdG90eXBlLnJlbmRlckFsbC5iaW5kKHRoaXMpO3RoaXMuX29iamVjdHM9W10sdGhpcy5fY3JlYXRlTG93ZXJDYW52YXModCksdGhpcy5faW5pdE9wdGlvbnMoZSksdGhpcy5fc2V0SW1hZ2VTbW9vdGhpbmcoKSx0aGlzLmludGVyYWN0aXZlfHx0aGlzLl9pbml0UmV0aW5hU2NhbGluZygpLGUub3ZlcmxheUltYWdlJiZ0aGlzLnNldE92ZXJsYXlJbWFnZShlLm92ZXJsYXlJbWFnZSxpKSxlLmJhY2tncm91bmRJbWFnZSYmdGhpcy5zZXRCYWNrZ3JvdW5kSW1hZ2UoZS5iYWNrZ3JvdW5kSW1hZ2UsaSksZS5iYWNrZ3JvdW5kQ29sb3ImJnRoaXMuc2V0QmFja2dyb3VuZENvbG9yKGUuYmFja2dyb3VuZENvbG9yLGkpLGUub3ZlcmxheUNvbG9yJiZ0aGlzLnNldE92ZXJsYXlDb2xvcihlLm92ZXJsYXlDb2xvcixpKSx0aGlzLmNhbGNPZmZzZXQoKX0sX2lzUmV0aW5hU2NhbGluZzpmdW5jdGlvbigpe3JldHVybiAxIT09ZmFicmljLmRldmljZVBpeGVsUmF0aW8mJnRoaXMuZW5hYmxlUmV0aW5hU2NhbGluZ30sZ2V0UmV0aW5hU2NhbGluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1JldGluYVNjYWxpbmcoKT9mYWJyaWMuZGV2aWNlUGl4ZWxSYXRpbzoxfSxfaW5pdFJldGluYVNjYWxpbmc6ZnVuY3Rpb24oKXt0aGlzLl9pc1JldGluYVNjYWxpbmcoKSYmKHRoaXMubG93ZXJDYW52YXNFbC5zZXRBdHRyaWJ1dGUoIndpZHRoIix0aGlzLndpZHRoKmZhYnJpYy5kZXZpY2VQaXhlbFJhdGlvKSx0aGlzLmxvd2VyQ2FudmFzRWwuc2V0QXR0cmlidXRlKCJoZWlnaHQiLHRoaXMuaGVpZ2h0KmZhYnJpYy5kZXZpY2VQaXhlbFJhdGlvKSx0aGlzLmNvbnRleHRDb250YWluZXIuc2NhbGUoZmFicmljLmRldmljZVBpeGVsUmF0aW8sZmFicmljLmRldmljZVBpeGVsUmF0aW8pKX0sY2FsY09mZnNldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vZmZzZXQ9ZSh0aGlzLmxvd2VyQ2FudmFzRWwpLHRoaXN9LHNldE92ZXJsYXlJbWFnZTpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRoaXMuX19zZXRCZ092ZXJsYXlJbWFnZSgib3ZlcmxheUltYWdlIix0LGUsaSl9LHNldEJhY2tncm91bmRJbWFnZTpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRoaXMuX19zZXRCZ092ZXJsYXlJbWFnZSgiYmFja2dyb3VuZEltYWdlIix0LGUsaSl9LHNldE92ZXJsYXlDb2xvcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9fc2V0QmdPdmVybGF5Q29sb3IoIm92ZXJsYXlDb2xvciIsdCxlKX0sc2V0QmFja2dyb3VuZENvbG9yOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX19zZXRCZ092ZXJsYXlDb2xvcigiYmFja2dyb3VuZENvbG9yIix0LGUpfSxfc2V0SW1hZ2VTbW9vdGhpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldENvbnRleHQoKTt0LmltYWdlU21vb3RoaW5nRW5hYmxlZD10LmltYWdlU21vb3RoaW5nRW5hYmxlZHx8dC53ZWJraXRJbWFnZVNtb290aGluZ0VuYWJsZWR8fHQubW96SW1hZ2VTbW9vdGhpbmdFbmFibGVkfHx0Lm1zSW1hZ2VTbW9vdGhpbmdFbmFibGVkfHx0Lm9JbWFnZVNtb290aGluZ0VuYWJsZWQsdC5pbWFnZVNtb290aGluZ0VuYWJsZWQ9dGhpcy5pbWFnZVNtb290aGluZ0VuYWJsZWR9LF9fc2V0QmdPdmVybGF5SW1hZ2U6ZnVuY3Rpb24odCxlLGkscil7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP2ZhYnJpYy51dGlsLmxvYWRJbWFnZShlLGZ1bmN0aW9uKGUpe2UmJih0aGlzW3RdPW5ldyBmYWJyaWMuSW1hZ2UoZSxyKSksaSYmaShlKX0sdGhpcyxyJiZyLmNyb3NzT3JpZ2luKToociYmZS5zZXRPcHRpb25zKHIpLHRoaXNbdF09ZSxpJiZpKGUpKSx0aGlzfSxfX3NldEJnT3ZlcmxheUNvbG9yOmZ1bmN0aW9uKHQsZSxpKXtpZihlJiZlLnNvdXJjZSl7dmFyIHI9dGhpcztmYWJyaWMudXRpbC5sb2FkSW1hZ2UoZS5zb3VyY2UsZnVuY3Rpb24obil7clt0XT1uZXcgZmFicmljLlBhdHRlcm4oe3NvdXJjZTpuLHJlcGVhdDplLnJlcGVhdCxvZmZzZXRYOmUub2Zmc2V0WCxvZmZzZXRZOmUub2Zmc2V0WX0pLGkmJmkoKX0pfWVsc2UgdGhpc1t0XT1lLGkmJmkoKTtyZXR1cm4gdGhpc30sX2NyZWF0ZUNhbnZhc0VsZW1lbnQ6ZnVuY3Rpb24odCl7dmFyIGU9ZmFicmljLnV0aWwuY3JlYXRlQ2FudmFzRWxlbWVudCh0KTtpZihlLnN0eWxlfHwoZS5zdHlsZT17fSksIWUpdGhyb3cgbjtpZigidW5kZWZpbmVkIj09dHlwZW9mIGUuZ2V0Q29udGV4dCl0aHJvdyBuO3JldHVybiBlfSxfaW5pdE9wdGlvbnM6ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHQpdGhpc1tlXT10W2VdO3RoaXMud2lkdGg9dGhpcy53aWR0aHx8cGFyc2VJbnQodGhpcy5sb3dlckNhbnZhc0VsLndpZHRoLDEwKXx8MCx0aGlzLmhlaWdodD10aGlzLmhlaWdodHx8cGFyc2VJbnQodGhpcy5sb3dlckNhbnZhc0VsLmhlaWdodCwxMCl8fDAsdGhpcy5sb3dlckNhbnZhc0VsLnN0eWxlJiYodGhpcy5sb3dlckNhbnZhc0VsLndpZHRoPXRoaXMud2lkdGgsdGhpcy5sb3dlckNhbnZhc0VsLmhlaWdodD10aGlzLmhlaWdodCx0aGlzLmxvd2VyQ2FudmFzRWwuc3R5bGUud2lkdGg9dGhpcy53aWR0aCsicHgiLHRoaXMubG93ZXJDYW52YXNFbC5zdHlsZS5oZWlnaHQ9dGhpcy5oZWlnaHQrInB4Iix0aGlzLnZpZXdwb3J0VHJhbnNmb3JtPXRoaXMudmlld3BvcnRUcmFuc2Zvcm0uc2xpY2UoKSl9LF9jcmVhdGVMb3dlckNhbnZhczpmdW5jdGlvbih0KXt0aGlzLmxvd2VyQ2FudmFzRWw9ZmFicmljLnV0aWwuZ2V0QnlJZCh0KXx8dGhpcy5fY3JlYXRlQ2FudmFzRWxlbWVudCh0KSxmYWJyaWMudXRpbC5hZGRDbGFzcyh0aGlzLmxvd2VyQ2FudmFzRWwsImxvd2VyLWNhbnZhcyIpLHRoaXMuaW50ZXJhY3RpdmUmJnRoaXMuX2FwcGx5Q2FudmFzU3R5bGUodGhpcy5sb3dlckNhbnZhc0VsKSx0aGlzLmNvbnRleHRDb250YWluZXI9dGhpcy5sb3dlckNhbnZhc0VsLmdldENvbnRleHQoIjJkIil9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2lkdGh9LGdldEhlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhlaWdodH0sc2V0V2lkdGg6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5zZXREaW1lbnNpb25zKHt3aWR0aDp0fSxlKX0sc2V0SGVpZ2h0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc2V0RGltZW5zaW9ucyh7aGVpZ2h0OnR9LGUpfSxzZXREaW1lbnNpb25zOmZ1bmN0aW9uKHQsZSl7dmFyIGk7ZT1lfHx7fTtmb3IodmFyIHIgaW4gdClpPXRbcl0sZS5jc3NPbmx5fHwodGhpcy5fc2V0QmFja3N0b3JlRGltZW5zaW9uKHIsdFtyXSksaSs9InB4IiksZS5iYWNrc3RvcmVPbmx5fHx0aGlzLl9zZXRDc3NEaW1lbnNpb24ocixpKTtyZXR1cm4gdGhpcy5faW5pdFJldGluYVNjYWxpbmcoKSx0aGlzLl9zZXRJbWFnZVNtb290aGluZygpLHRoaXMuY2FsY09mZnNldCgpLGUuY3NzT25seXx8dGhpcy5yZW5kZXJBbGwoKSx0aGlzfSxfc2V0QmFja3N0b3JlRGltZW5zaW9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubG93ZXJDYW52YXNFbFt0XT1lLHRoaXMudXBwZXJDYW52YXNFbCYmKHRoaXMudXBwZXJDYW52YXNFbFt0XT1lKSx0aGlzLmNhY2hlQ2FudmFzRWwmJih0aGlzLmNhY2hlQ2FudmFzRWxbdF09ZSksdGhpc1t0XT1lLHRoaXN9LF9zZXRDc3NEaW1lbnNpb246ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5sb3dlckNhbnZhc0VsLnN0eWxlW3RdPWUsdGhpcy51cHBlckNhbnZhc0VsJiYodGhpcy51cHBlckNhbnZhc0VsLnN0eWxlW3RdPWUpLHRoaXMud3JhcHBlckVsJiYodGhpcy53cmFwcGVyRWwuc3R5bGVbdF09ZSksdGhpc30sZ2V0Wm9vbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy52aWV3cG9ydFRyYW5zZm9ybVswXSp0aGlzLnZpZXdwb3J0VHJhbnNmb3JtWzNdKX0sc2V0Vmlld3BvcnRUcmFuc2Zvcm06ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLl9hY3RpdmVHcm91cDt0aGlzLnZpZXdwb3J0VHJhbnNmb3JtPXQ7Zm9yKHZhciByPTAsbj10aGlzLl9vYmplY3RzLmxlbmd0aDtyPG47cisrKWU9dGhpcy5fb2JqZWN0c1tyXSxlLmdyb3VwfHxlLnNldENvb3JkcygpO3JldHVybiBpJiZpLnNldENvb3JkcygpLHRoaXMucmVuZGVyQWxsKCksdGhpc30sem9vbVRvUG9pbnQ6ZnVuY3Rpb24odCxlKXt2YXIgaT10LHI9dGhpcy52aWV3cG9ydFRyYW5zZm9ybS5zbGljZSgwKTt0PWZhYnJpYy51dGlsLnRyYW5zZm9ybVBvaW50KHQsZmFicmljLnV0aWwuaW52ZXJ0VHJhbnNmb3JtKHRoaXMudmlld3BvcnRUcmFuc2Zvcm0pKSxyWzBdPWUsclszXT1lO3ZhciBuPWZhYnJpYy51dGlsLnRyYW5zZm9ybVBvaW50KHQscik7cmV0dXJuIHJbNF0rPWkueC1uLngscls1XSs9aS55LW4ueSx0aGlzLnNldFZpZXdwb3J0VHJhbnNmb3JtKHIpfSxzZXRab29tOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnpvb21Ub1BvaW50KG5ldyBmYWJyaWMuUG9pbnQoMCwwKSx0KSx0aGlzfSxhYnNvbHV0ZVBhbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnZpZXdwb3J0VHJhbnNmb3JtLnNsaWNlKDApO3JldHVybiBlWzRdPS10LngsZVs1XT0tdC55LHRoaXMuc2V0Vmlld3BvcnRUcmFuc2Zvcm0oZSl9LHJlbGF0aXZlUGFuOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFic29sdXRlUGFuKG5ldyBmYWJyaWMuUG9pbnQoLXQueC10aGlzLnZpZXdwb3J0VHJhbnNmb3JtWzRdLC10LnktdGhpcy52aWV3cG9ydFRyYW5zZm9ybVs1XSkpfSxnZXRFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG93ZXJDYW52YXNFbH0sX29uT2JqZWN0QWRkZWQ6ZnVuY3Rpb24odCl7dGhpcy5zdGF0ZWZ1bCYmdC5zZXR1cFN0YXRlKCksdC5fc2V0KCJjYW52YXMiLHRoaXMpLHQuc2V0Q29vcmRzKCksdGhpcy5maXJlKCJvYmplY3Q6YWRkZWQiLHt0YXJnZXQ6dH0pLHQuZmlyZSgiYWRkZWQiKX0sX29uT2JqZWN0UmVtb3ZlZDpmdW5jdGlvbih0KXt0aGlzLmZpcmUoIm9iamVjdDpyZW1vdmVkIix7dGFyZ2V0OnR9KSx0LmZpcmUoInJlbW92ZWQiKSxkZWxldGUgdC5jYW52YXN9LGNsZWFyQ29udGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdC5jbGVhclJlY3QoMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLHRoaXN9LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250ZXh0Q29udGFpbmVyfSxjbGVhcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vYmplY3RzLmxlbmd0aD0wLHRoaXMuYmFja2dyb3VuZEltYWdlPW51bGwsdGhpcy5vdmVybGF5SW1hZ2U9bnVsbCx0aGlzLmJhY2tncm91bmRDb2xvcj0iIix0aGlzLm92ZXJsYXlDb2xvcj0iIix0aGlzLl9oYXNJVGV4dEhhbmRsZXJzJiYodGhpcy5vZmYoInNlbGVjdGlvbjpjbGVhcmVkIix0aGlzLl9jYW52YXNJVGV4dFNlbGVjdGlvbkNsZWFyZWRIYW5sZGVyKSx0aGlzLm9mZigib2JqZWN0OnNlbGVjdGVkIix0aGlzLl9jYW52YXNJVGV4dFNlbGVjdGlvbkNsZWFyZWRIYW5sZGVyKSx0aGlzLm9mZigibW91c2U6dXAiLHRoaXMuX21vdXNlVXBJVGV4dEhhbmRsZXIpLHRoaXMuX2lUZXh0SW5zdGFuY2VzPW51bGwsdGhpcy5faGFzSVRleHRIYW5kbGVycz0hMSksdGhpcy5jbGVhckNvbnRleHQodGhpcy5jb250ZXh0Q29udGFpbmVyKSx0aGlzLmZpcmUoImNhbnZhczpjbGVhcmVkIiksdGhpcy5yZW5kZXJBbGwoKSx0aGlzfSxyZW5kZXJBbGw6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRleHRDb250YWluZXI7cmV0dXJuIHRoaXMucmVuZGVyQ2FudmFzKHQsdGhpcy5fb2JqZWN0cyksdGhpc30scmVuZGVyQ2FudmFzOmZ1bmN0aW9uKHQsZSl7dGhpcy5jbGVhckNvbnRleHQodCksdGhpcy5maXJlKCJiZWZvcmU6cmVuZGVyIiksdGhpcy5jbGlwVG8mJmZhYnJpYy51dGlsLmNsaXBDb250ZXh0KHRoaXMsdCksdGhpcy5fcmVuZGVyQmFja2dyb3VuZCh0KSx0LnNhdmUoKSx0LnRyYW5zZm9ybS5hcHBseSh0LHRoaXMudmlld3BvcnRUcmFuc2Zvcm0pLHRoaXMuX3JlbmRlck9iamVjdHModCxlKSx0LnJlc3RvcmUoKSwhdGhpcy5jb250cm9sc0Fib3ZlT3ZlcmxheSYmdGhpcy5pbnRlcmFjdGl2ZSYmdGhpcy5kcmF3Q29udHJvbHModCksdGhpcy5jbGlwVG8mJnQucmVzdG9yZSgpLHRoaXMuX3JlbmRlck92ZXJsYXkodCksdGhpcy5jb250cm9sc0Fib3ZlT3ZlcmxheSYmdGhpcy5pbnRlcmFjdGl2ZSYmdGhpcy5kcmF3Q29udHJvbHModCksdGhpcy5maXJlKCJhZnRlcjpyZW5kZXIiKX0sX3JlbmRlck9iamVjdHM6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9MCxyPWUubGVuZ3RoO2k8cjsrK2kpZVtpXSYmZVtpXS5yZW5kZXIodCl9LF9yZW5kZXJCYWNrZ3JvdW5kT3JPdmVybGF5OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpc1tlKyJDb2xvciJdO2kmJih0LmZpbGxTdHlsZT1pLnRvTGl2ZT9pLnRvTGl2ZSh0KTppLHQuZmlsbFJlY3QoaS5vZmZzZXRYfHwwLGkub2Zmc2V0WXx8MCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSksaT10aGlzW2UrIkltYWdlIl0saSYmKHRoaXNbZSsiVnB0Il0mJih0LnNhdmUoKSx0LnRyYW5zZm9ybS5hcHBseSh0LHRoaXMudmlld3BvcnRUcmFuc2Zvcm0pKSxpLnJlbmRlcih0KSx0aGlzW2UrIlZwdCJdJiZ0LnJlc3RvcmUoKSl9LF9yZW5kZXJCYWNrZ3JvdW5kOmZ1bmN0aW9uKHQpe3RoaXMuX3JlbmRlckJhY2tncm91bmRPck92ZXJsYXkodCwiYmFja2dyb3VuZCIpfSxfcmVuZGVyT3ZlcmxheTpmdW5jdGlvbih0KXt0aGlzLl9yZW5kZXJCYWNrZ3JvdW5kT3JPdmVybGF5KHQsIm92ZXJsYXkiKX0sZ2V0Q2VudGVyOmZ1bmN0aW9uKCl7cmV0dXJue3RvcDp0aGlzLmdldEhlaWdodCgpLzIsbGVmdDp0aGlzLmdldFdpZHRoKCkvMn19LGNlbnRlck9iamVjdEg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NlbnRlck9iamVjdCh0LG5ldyBmYWJyaWMuUG9pbnQodGhpcy5nZXRDZW50ZXIoKS5sZWZ0LHQuZ2V0Q2VudGVyUG9pbnQoKS55KSl9LGNlbnRlck9iamVjdFY6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NlbnRlck9iamVjdCh0LG5ldyBmYWJyaWMuUG9pbnQodC5nZXRDZW50ZXJQb2ludCgpLngsdGhpcy5nZXRDZW50ZXIoKS50b3ApKX0sY2VudGVyT2JqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0Q2VudGVyKCk7cmV0dXJuIHRoaXMuX2NlbnRlck9iamVjdCh0LG5ldyBmYWJyaWMuUG9pbnQoZS5sZWZ0LGUudG9wKSl9LHZpZXdwb3J0Q2VudGVyT2JqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0VnBDZW50ZXIoKTtyZXR1cm4gdGhpcy5fY2VudGVyT2JqZWN0KHQsZSl9LHZpZXdwb3J0Q2VudGVyT2JqZWN0SDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFZwQ2VudGVyKCk7cmV0dXJuIHRoaXMuX2NlbnRlck9iamVjdCh0LG5ldyBmYWJyaWMuUG9pbnQoZS54LHQuZ2V0Q2VudGVyUG9pbnQoKS55KSksCnRoaXN9LHZpZXdwb3J0Q2VudGVyT2JqZWN0VjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFZwQ2VudGVyKCk7cmV0dXJuIHRoaXMuX2NlbnRlck9iamVjdCh0LG5ldyBmYWJyaWMuUG9pbnQodC5nZXRDZW50ZXJQb2ludCgpLngsZS55KSl9LGdldFZwQ2VudGVyOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRDZW50ZXIoKSxlPWZhYnJpYy51dGlsLmludmVydFRyYW5zZm9ybSh0aGlzLnZpZXdwb3J0VHJhbnNmb3JtKTtyZXR1cm4gZmFicmljLnV0aWwudHJhbnNmb3JtUG9pbnQoe3g6dC5sZWZ0LHk6dC50b3B9LGUpfSxfY2VudGVyT2JqZWN0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuc2V0UG9zaXRpb25CeU9yaWdpbihlLCJjZW50ZXIiLCJjZW50ZXIiKSx0aGlzLnJlbmRlckFsbCgpLHRoaXN9LHRvRGF0YWxlc3NKU09OOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRvRGF0YWxlc3NPYmplY3QodCl9LHRvT2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl90b09iamVjdE1ldGhvZCgidG9PYmplY3QiLHQpfSx0b0RhdGFsZXNzT2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl90b09iamVjdE1ldGhvZCgidG9EYXRhbGVzc09iamVjdCIsdCl9LF90b09iamVjdE1ldGhvZDpmdW5jdGlvbihlLGkpe3ZhciByPXtvYmplY3RzOnRoaXMuX3RvT2JqZWN0cyhlLGkpfTtyZXR1cm4gdChyLHRoaXMuX19zZXJpYWxpemVCZ092ZXJsYXkoaSkpLGZhYnJpYy51dGlsLnBvcHVsYXRlV2l0aFByb3BlcnRpZXModGhpcyxyLGkpLHJ9LF90b09iamVjdHM6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RzKCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiF0LmV4Y2x1ZGVGcm9tRXhwb3J0fSkubWFwKGZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLl90b09iamVjdChpLHQsZSl9LHRoaXMpfSxfdG9PYmplY3Q6ZnVuY3Rpb24odCxlLGkpe3ZhciByO3RoaXMuaW5jbHVkZURlZmF1bHRWYWx1ZXN8fChyPXQuaW5jbHVkZURlZmF1bHRWYWx1ZXMsdC5pbmNsdWRlRGVmYXVsdFZhbHVlcz0hMSk7dmFyIG49dFtlXShpKTtyZXR1cm4gdGhpcy5pbmNsdWRlRGVmYXVsdFZhbHVlc3x8KHQuaW5jbHVkZURlZmF1bHRWYWx1ZXM9ciksbn0sX19zZXJpYWxpemVCZ092ZXJsYXk6ZnVuY3Rpb24odCl7dmFyIGU9e2JhY2tncm91bmQ6dGhpcy5iYWNrZ3JvdW5kQ29sb3ImJnRoaXMuYmFja2dyb3VuZENvbG9yLnRvT2JqZWN0P3RoaXMuYmFja2dyb3VuZENvbG9yLnRvT2JqZWN0KHQpOnRoaXMuYmFja2dyb3VuZENvbG9yfTtyZXR1cm4gdGhpcy5vdmVybGF5Q29sb3ImJihlLm92ZXJsYXk9dGhpcy5vdmVybGF5Q29sb3IudG9PYmplY3Q/dGhpcy5vdmVybGF5Q29sb3IudG9PYmplY3QodCk6dGhpcy5vdmVybGF5Q29sb3IpLHRoaXMuYmFja2dyb3VuZEltYWdlJiYoZS5iYWNrZ3JvdW5kSW1hZ2U9dGhpcy5iYWNrZ3JvdW5kSW1hZ2UudG9PYmplY3QodCkpLHRoaXMub3ZlcmxheUltYWdlJiYoZS5vdmVybGF5SW1hZ2U9dGhpcy5vdmVybGF5SW1hZ2UudG9PYmplY3QodCkpLGV9LHN2Z1ZpZXdwb3J0VHJhbnNmb3JtYXRpb246ITAsdG9TVkc6ZnVuY3Rpb24odCxlKXt0fHwodD17fSk7dmFyIGk9W107cmV0dXJuIHRoaXMuX3NldFNWR1ByZWFtYmxlKGksdCksdGhpcy5fc2V0U1ZHSGVhZGVyKGksdCksdGhpcy5fc2V0U1ZHQmdPdmVybGF5Q29sb3IoaSwiYmFja2dyb3VuZENvbG9yIiksdGhpcy5fc2V0U1ZHQmdPdmVybGF5SW1hZ2UoaSwiYmFja2dyb3VuZEltYWdlIixlKSx0aGlzLl9zZXRTVkdPYmplY3RzKGksZSksdGhpcy5fc2V0U1ZHQmdPdmVybGF5Q29sb3IoaSwib3ZlcmxheUNvbG9yIiksdGhpcy5fc2V0U1ZHQmdPdmVybGF5SW1hZ2UoaSwib3ZlcmxheUltYWdlIixlKSxpLnB1c2goIjwvc3ZnPiIpLGkuam9pbigiIil9LF9zZXRTVkdQcmVhbWJsZTpmdW5jdGlvbih0LGUpe2Uuc3VwcHJlc3NQcmVhbWJsZXx8dC5wdXNoKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSInLGUuZW5jb2Rpbmd8fCJVVEYtOCIsJyIgc3RhbmRhbG9uZT0ibm8iID8+XG4nLCc8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICcsJyJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPlxuJyl9LF9zZXRTVkdIZWFkZXI6ZnVuY3Rpb24odCxlKXt2YXIgaSxuPWUud2lkdGh8fHRoaXMud2lkdGgscz1lLmhlaWdodHx8dGhpcy5oZWlnaHQsbz0ndmlld0JveD0iMCAwICcrdGhpcy53aWR0aCsiICIrdGhpcy5oZWlnaHQrJyIgJyxhPWZhYnJpYy5PYmplY3QuTlVNX0ZSQUNUSU9OX0RJR0lUUztlLnZpZXdCb3g/bz0ndmlld0JveD0iJytlLnZpZXdCb3gueCsiICIrZS52aWV3Qm94LnkrIiAiK2Uudmlld0JveC53aWR0aCsiICIrZS52aWV3Qm94LmhlaWdodCsnIiAnOnRoaXMuc3ZnVmlld3BvcnRUcmFuc2Zvcm1hdGlvbiYmKGk9dGhpcy52aWV3cG9ydFRyYW5zZm9ybSxvPSd2aWV3Qm94PSInK3IoLWlbNF0vaVswXSxhKSsiICIrcigtaVs1XS9pWzNdLGEpKyIgIityKHRoaXMud2lkdGgvaVswXSxhKSsiICIrcih0aGlzLmhlaWdodC9pWzNdLGEpKyciICcpLHQucHVzaCgiPHN2ZyAiLCd4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICcsJ3htbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiAnLCd2ZXJzaW9uPSIxLjEiICcsJ3dpZHRoPSInLG4sJyIgJywnaGVpZ2h0PSInLHMsJyIgJyx0aGlzLmJhY2tncm91bmRDb2xvciYmIXRoaXMuYmFja2dyb3VuZENvbG9yLnRvTGl2ZT8nc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICcrdGhpcy5iYWNrZ3JvdW5kQ29sb3IrJyIgJzpudWxsLG8sJ3htbDpzcGFjZT0icHJlc2VydmUiPlxuJywiPGRlc2M+Q3JlYXRlZCB3aXRoIEZhYnJpYy5qcyAiLGZhYnJpYy52ZXJzaW9uLCI8L2Rlc2M+XG4iLCI8ZGVmcz4iLGZhYnJpYy5jcmVhdGVTVkdGb250RmFjZXNNYXJrdXAodGhpcy5nZXRPYmplY3RzKCkpLGZhYnJpYy5jcmVhdGVTVkdSZWZFbGVtZW50c01hcmt1cCh0aGlzKSwiPC9kZWZzPlxuIil9LF9zZXRTVkdPYmplY3RzOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpLHI9MCxuPXRoaXMuZ2V0T2JqZWN0cygpLHM9bi5sZW5ndGg7cjxzO3IrKylpPW5bcl0saS5leGNsdWRlRnJvbUV4cG9ydHx8dGhpcy5fc2V0U1ZHT2JqZWN0KHQsaSxlKX0sX3NldFNWR09iamVjdDpmdW5jdGlvbih0LGUsaSl7dC5wdXNoKGUudG9TVkcoaSkpfSxfc2V0U1ZHQmdPdmVybGF5SW1hZ2U6ZnVuY3Rpb24odCxlLGkpe3RoaXNbZV0mJnRoaXNbZV0udG9TVkcmJnQucHVzaCh0aGlzW2VdLnRvU1ZHKGkpKX0sX3NldFNWR0JnT3ZlcmxheUNvbG9yOmZ1bmN0aW9uKHQsZSl7dGhpc1tlXSYmdGhpc1tlXS5zb3VyY2U/dC5wdXNoKCc8cmVjdCB4PSInLHRoaXNbZV0ub2Zmc2V0WCwnIiB5PSInLHRoaXNbZV0ub2Zmc2V0WSwnIiAnLCd3aWR0aD0iJywicmVwZWF0LXkiPT09dGhpc1tlXS5yZXBlYXR8fCJuby1yZXBlYXQiPT09dGhpc1tlXS5yZXBlYXQ/dGhpc1tlXS5zb3VyY2Uud2lkdGg6dGhpcy53aWR0aCwnIiBoZWlnaHQ9IicsInJlcGVhdC14Ij09PXRoaXNbZV0ucmVwZWF0fHwibm8tcmVwZWF0Ij09PXRoaXNbZV0ucmVwZWF0P3RoaXNbZV0uc291cmNlLmhlaWdodDp0aGlzLmhlaWdodCwnIiBmaWxsPSJ1cmwoIycrZSsnUGF0dGVybikiJywiPjwvcmVjdD5cbiIpOnRoaXNbZV0mJiJvdmVybGF5Q29sb3IiPT09ZSYmdC5wdXNoKCc8cmVjdCB4PSIwIiB5PSIwIiAnLCd3aWR0aD0iJyx0aGlzLndpZHRoLCciIGhlaWdodD0iJyx0aGlzLmhlaWdodCwnIiBmaWxsPSInLHRoaXNbZV0sJyInLCI+PC9yZWN0PlxuIil9LHNlbmRUb0JhY2s6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIHRoaXM7dmFyIGUscixuLHM9dGhpcy5fYWN0aXZlR3JvdXA7aWYodD09PXMpZm9yKG49cy5fb2JqZWN0cyxlPW4ubGVuZ3RoO2UtLTspcj1uW2VdLGkodGhpcy5fb2JqZWN0cyxyKSx0aGlzLl9vYmplY3RzLnVuc2hpZnQocik7ZWxzZSBpKHRoaXMuX29iamVjdHMsdCksdGhpcy5fb2JqZWN0cy51bnNoaWZ0KHQpO3JldHVybiB0aGlzLnJlbmRlckFsbCYmdGhpcy5yZW5kZXJBbGwoKX0sYnJpbmdUb0Zyb250OmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiB0aGlzO3ZhciBlLHIsbixzPXRoaXMuX2FjdGl2ZUdyb3VwO2lmKHQ9PT1zKWZvcihuPXMuX29iamVjdHMsZT0wO2U8bi5sZW5ndGg7ZSsrKXI9bltlXSxpKHRoaXMuX29iamVjdHMsciksdGhpcy5fb2JqZWN0cy5wdXNoKHIpO2Vsc2UgaSh0aGlzLl9vYmplY3RzLHQpLHRoaXMuX29iamVjdHMucHVzaCh0KTtyZXR1cm4gdGhpcy5yZW5kZXJBbGwmJnRoaXMucmVuZGVyQWxsKCl9LHNlbmRCYWNrd2FyZHM6ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm4gdGhpczt2YXIgcixuLHMsbyxhLGg9dGhpcy5fYWN0aXZlR3JvdXA7aWYodD09PWgpZm9yKGE9aC5fb2JqZWN0cyxyPTA7cjxhLmxlbmd0aDtyKyspbj1hW3JdLHM9dGhpcy5fb2JqZWN0cy5pbmRleE9mKG4pLDAhPT1zJiYobz1zLTEsaSh0aGlzLl9vYmplY3RzLG4pLHRoaXMuX29iamVjdHMuc3BsaWNlKG8sMCxuKSk7ZWxzZSBzPXRoaXMuX29iamVjdHMuaW5kZXhPZih0KSwwIT09cyYmKG89dGhpcy5fZmluZE5ld0xvd2VySW5kZXgodCxzLGUpLGkodGhpcy5fb2JqZWN0cyx0KSx0aGlzLl9vYmplY3RzLnNwbGljZShvLDAsdCkpO3JldHVybiB0aGlzLnJlbmRlckFsbCYmdGhpcy5yZW5kZXJBbGwoKSx0aGlzfSxfZmluZE5ld0xvd2VySW5kZXg6ZnVuY3Rpb24odCxlLGkpe3ZhciByO2lmKGkpe3I9ZTtmb3IodmFyIG49ZS0xO24+PTA7LS1uKXt2YXIgcz10LmludGVyc2VjdHNXaXRoT2JqZWN0KHRoaXMuX29iamVjdHNbbl0pfHx0LmlzQ29udGFpbmVkV2l0aGluT2JqZWN0KHRoaXMuX29iamVjdHNbbl0pfHx0aGlzLl9vYmplY3RzW25dLmlzQ29udGFpbmVkV2l0aGluT2JqZWN0KHQpO2lmKHMpe3I9bjticmVha319fWVsc2Ugcj1lLTE7cmV0dXJuIHJ9LGJyaW5nRm9yd2FyZDpmdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybiB0aGlzO3ZhciByLG4scyxvLGEsaD10aGlzLl9hY3RpdmVHcm91cDtpZih0PT09aClmb3IoYT1oLl9vYmplY3RzLHI9YS5sZW5ndGg7ci0tOyluPWFbcl0scz10aGlzLl9vYmplY3RzLmluZGV4T2YobikscyE9PXRoaXMuX29iamVjdHMubGVuZ3RoLTEmJihvPXMrMSxpKHRoaXMuX29iamVjdHMsbiksdGhpcy5fb2JqZWN0cy5zcGxpY2UobywwLG4pKTtlbHNlIHM9dGhpcy5fb2JqZWN0cy5pbmRleE9mKHQpLHMhPT10aGlzLl9vYmplY3RzLmxlbmd0aC0xJiYobz10aGlzLl9maW5kTmV3VXBwZXJJbmRleCh0LHMsZSksaSh0aGlzLl9vYmplY3RzLHQpLHRoaXMuX29iamVjdHMuc3BsaWNlKG8sMCx0KSk7cmV0dXJuIHRoaXMucmVuZGVyQWxsJiZ0aGlzLnJlbmRlckFsbCgpLHRoaXN9LF9maW5kTmV3VXBwZXJJbmRleDpmdW5jdGlvbih0LGUsaSl7dmFyIHI7aWYoaSl7cj1lO2Zvcih2YXIgbj1lKzE7bjx0aGlzLl9vYmplY3RzLmxlbmd0aDsrK24pe3ZhciBzPXQuaW50ZXJzZWN0c1dpdGhPYmplY3QodGhpcy5fb2JqZWN0c1tuXSl8fHQuaXNDb250YWluZWRXaXRoaW5PYmplY3QodGhpcy5fb2JqZWN0c1tuXSl8fHRoaXMuX29iamVjdHNbbl0uaXNDb250YWluZWRXaXRoaW5PYmplY3QodCk7aWYocyl7cj1uO2JyZWFrfX19ZWxzZSByPWUrMTtyZXR1cm4gcn0sbW92ZVRvOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkodGhpcy5fb2JqZWN0cyx0KSx0aGlzLl9vYmplY3RzLnNwbGljZShlLDAsdCksdGhpcy5yZW5kZXJBbGwmJnRoaXMucmVuZGVyQWxsKCl9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGVhcigpLHRoaXN9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIiM8ZmFicmljLkNhbnZhcyAoIit0aGlzLmNvbXBsZXhpdHkoKSsiKTogeyBvYmplY3RzOiAiK3RoaXMuZ2V0T2JqZWN0cygpLmxlbmd0aCsiIH0+In19KSx0KGZhYnJpYy5TdGF0aWNDYW52YXMucHJvdG90eXBlLGZhYnJpYy5PYnNlcnZhYmxlKSx0KGZhYnJpYy5TdGF0aWNDYW52YXMucHJvdG90eXBlLGZhYnJpYy5Db2xsZWN0aW9uKSx0KGZhYnJpYy5TdGF0aWNDYW52YXMucHJvdG90eXBlLGZhYnJpYy5EYXRhVVJMRXhwb3J0ZXIpLHQoZmFicmljLlN0YXRpY0NhbnZhcyx7RU1QVFlfSlNPTjoneyJvYmplY3RzIjogW10sICJiYWNrZ3JvdW5kIjogIndoaXRlIn0nLHN1cHBvcnRzOmZ1bmN0aW9uKHQpe3ZhciBlPWZhYnJpYy51dGlsLmNyZWF0ZUNhbnZhc0VsZW1lbnQoKTtpZighZXx8IWUuZ2V0Q29udGV4dClyZXR1cm4gbnVsbDt2YXIgaT1lLmdldENvbnRleHQoIjJkIik7aWYoIWkpcmV0dXJuIG51bGw7c3dpdGNoKHQpe2Nhc2UiZ2V0SW1hZ2VEYXRhIjpyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGkuZ2V0SW1hZ2VEYXRhO2Nhc2Uic2V0TGluZURhc2giOnJldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgaS5zZXRMaW5lRGFzaDtjYXNlInRvRGF0YVVSTCI6cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBlLnRvRGF0YVVSTDtjYXNlInRvRGF0YVVSTFdpdGhRdWFsaXR5Ijp0cnl7cmV0dXJuIGUudG9EYXRhVVJMKCJpbWFnZS9qcGVnIiwwKSwhMH1jYXRjaCh0KXt9cmV0dXJuITE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19fSksZmFicmljLlN0YXRpY0NhbnZhcy5wcm90b3R5cGUudG9KU09OPWZhYnJpYy5TdGF0aWNDYW52YXMucHJvdG90eXBlLnRvT2JqZWN0fSgpLGZhYnJpYy5CYXNlQnJ1c2g9ZmFicmljLnV0aWwuY3JlYXRlQ2xhc3Moe2NvbG9yOiJyZ2IoMCwgMCwgMCkiLHdpZHRoOjEsc2hhZG93Om51bGwsc3Ryb2tlTGluZUNhcDoicm91bmQiLHN0cm9rZUxpbmVKb2luOiJyb3VuZCIsc3Ryb2tlRGFzaEFycmF5Om51bGwsc2V0U2hhZG93OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNoYWRvdz1uZXcgZmFicmljLlNoYWRvdyh0KSx0aGlzfSxfc2V0QnJ1c2hTdHlsZXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNhbnZhcy5jb250ZXh0VG9wO3Quc3Ryb2tlU3R5bGU9dGhpcy5jb2xvcix0LmxpbmVXaWR0aD10aGlzLndpZHRoLHQubGluZUNhcD10aGlzLnN0cm9rZUxpbmVDYXAsdC5saW5lSm9pbj10aGlzLnN0cm9rZUxpbmVKb2luLHRoaXMuc3Ryb2tlRGFzaEFycmF5JiZmYWJyaWMuU3RhdGljQ2FudmFzLnN1cHBvcnRzKCJzZXRMaW5lRGFzaCIpJiZ0LnNldExpbmVEYXNoKHRoaXMuc3Ryb2tlRGFzaEFycmF5KX0sX3NldFNoYWRvdzpmdW5jdGlvbigpe2lmKHRoaXMuc2hhZG93KXt2YXIgdD10aGlzLmNhbnZhcy5jb250ZXh0VG9wO3Quc2hhZG93Q29sb3I9dGhpcy5zaGFkb3cuY29sb3IsdC5zaGFkb3dCbHVyPXRoaXMuc2hhZG93LmJsdXIsdC5zaGFkb3dPZmZzZXRYPXRoaXMuc2hhZG93Lm9mZnNldFgsdC5zaGFkb3dPZmZzZXRZPXRoaXMuc2hhZG93Lm9mZnNldFl9fSxfcmVzZXRTaGFkb3c6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNhbnZhcy5jb250ZXh0VG9wO3Quc2hhZG93Q29sb3I9IiIsdC5zaGFkb3dCbHVyPXQuc2hhZG93T2Zmc2V0WD10LnNoYWRvd09mZnNldFk9MH19KSxmdW5jdGlvbigpe2ZhYnJpYy5QZW5jaWxCcnVzaD1mYWJyaWMudXRpbC5jcmVhdGVDbGFzcyhmYWJyaWMuQmFzZUJydXNoLHtpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMuY2FudmFzPXQsdGhpcy5fcG9pbnRzPVtdfSxvbk1vdXNlRG93bjpmdW5jdGlvbih0KXt0aGlzLl9wcmVwYXJlRm9yRHJhd2luZyh0KSx0aGlzLl9jYXB0dXJlRHJhd2luZ1BhdGgodCksdGhpcy5fcmVuZGVyKCl9LG9uTW91c2VNb3ZlOmZ1bmN0aW9uKHQpe3RoaXMuX2NhcHR1cmVEcmF3aW5nUGF0aCh0KSx0aGlzLmNhbnZhcy5jbGVhckNvbnRleHQodGhpcy5jYW52YXMuY29udGV4dFRvcCksdGhpcy5fcmVuZGVyKCl9LG9uTW91c2VVcDpmdW5jdGlvbigpe3RoaXMuX2ZpbmFsaXplQW5kQWRkUGF0aCgpfSxfcHJlcGFyZUZvckRyYXdpbmc6ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGZhYnJpYy5Qb2ludCh0LngsdC55KTt0aGlzLl9yZXNldCgpLHRoaXMuX2FkZFBvaW50KGUpLHRoaXMuY2FudmFzLmNvbnRleHRUb3AubW92ZVRvKGUueCxlLnkpfSxfYWRkUG9pbnQ6ZnVuY3Rpb24odCl7dGhpcy5fcG9pbnRzLnB1c2godCl9LF9yZXNldDpmdW5jdGlvbigpe3RoaXMuX3BvaW50cy5sZW5ndGg9MCx0aGlzLl9zZXRCcnVzaFN0eWxlcygpLHRoaXMuX3NldFNoYWRvdygpfSxfY2FwdHVyZURyYXdpbmdQYXRoOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBmYWJyaWMuUG9pbnQodC54LHQueSk7dGhpcy5fYWRkUG9pbnQoZSl9LF9yZW5kZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNhbnZhcy5jb250ZXh0VG9wLGU9dGhpcy5jYW52YXMudmlld3BvcnRUcmFuc2Zvcm0saT10aGlzLl9wb2ludHNbMF0scj10aGlzLl9wb2ludHNbMV07dC5zYXZlKCksdC50cmFuc2Zvcm0oZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV0pLHQuYmVnaW5QYXRoKCksMj09PXRoaXMuX3BvaW50cy5sZW5ndGgmJmkueD09PXIueCYmaS55PT09ci55JiYoaS54LT0uNSxyLngrPS41KSx0Lm1vdmVUbyhpLngsaS55KTtmb3IodmFyIG49MSxzPXRoaXMuX3BvaW50cy5sZW5ndGg7bjxzO24rKyl7dmFyIG89aS5taWRQb2ludEZyb20ocik7dC5xdWFkcmF0aWNDdXJ2ZVRvKGkueCxpLnksby54LG8ueSksaT10aGlzLl9wb2ludHNbbl0scj10aGlzLl9wb2ludHNbbisxXX10LmxpbmVUbyhpLngsaS55KSx0LnN0cm9rZSgpLHQucmVzdG9yZSgpfSxjb252ZXJ0UG9pbnRzVG9TVkdQYXRoOmZ1bmN0aW9uKHQpe3ZhciBlPVtdLGk9bmV3IGZhYnJpYy5Qb2ludCh0WzBdLngsdFswXS55KSxyPW5ldyBmYWJyaWMuUG9pbnQodFsxXS54LHRbMV0ueSk7ZS5wdXNoKCJNICIsdFswXS54LCIgIix0WzBdLnksIiAiKTtmb3IodmFyIG49MSxzPXQubGVuZ3RoO248cztuKyspe3ZhciBvPWkubWlkUG9pbnRGcm9tKHIpO2UucHVzaCgiUSAiLGkueCwiICIsaS55LCIgIixvLngsIiAiLG8ueSwiICIpLGk9bmV3IGZhYnJpYy5Qb2ludCh0W25dLngsdFtuXS55KSxuKzE8dC5sZW5ndGgmJihyPW5ldyBmYWJyaWMuUG9pbnQodFtuKzFdLngsdFtuKzFdLnkpKX1yZXR1cm4gZS5wdXNoKCJMICIsaS54LCIgIixpLnksIiAiKSxlfSxjcmVhdGVQYXRoOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBmYWJyaWMuUGF0aCh0LHtmaWxsOm51bGwsc3Ryb2tlOnRoaXMuY29sb3Isc3Ryb2tlV2lkdGg6dGhpcy53aWR0aCxzdHJva2VMaW5lQ2FwOnRoaXMuc3Ryb2tlTGluZUNhcCxzdHJva2VMaW5lSm9pbjp0aGlzLnN0cm9rZUxpbmVKb2luLHN0cm9rZURhc2hBcnJheTp0aGlzLnN0cm9rZURhc2hBcnJheSxvcmlnaW5YOiJjZW50ZXIiLG9yaWdpblk6ImNlbnRlciJ9KTtyZXR1cm4gdGhpcy5zaGFkb3cmJih0aGlzLnNoYWRvdy5hZmZlY3RTdHJva2U9ITAsZS5zZXRTaGFkb3codGhpcy5zaGFkb3cpKSxlfSxfZmluYWxpemVBbmRBZGRQYXRoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jYW52YXMuY29udGV4dFRvcDt0LmNsb3NlUGF0aCgpO3ZhciBlPXRoaXMuY29udmVydFBvaW50c1RvU1ZHUGF0aCh0aGlzLl9wb2ludHMpLmpvaW4oIiIpO2lmKCJNIDAgMCBRIDAgMCAwIDAgTCAwIDAiPT09ZSlyZXR1cm4gdm9pZCB0aGlzLmNhbnZhcy5yZW5kZXJBbGwoKTt2YXIgaT10aGlzLmNyZWF0ZVBhdGgoZSk7dGhpcy5jYW52YXMuYWRkKGkpLGkuc2V0Q29vcmRzKCksdGhpcy5jYW52YXMuY2xlYXJDb250ZXh0KHRoaXMuY2FudmFzLmNvbnRleHRUb3ApLHRoaXMuX3Jlc2V0U2hhZG93KCksdGhpcy5jYW52YXMucmVuZGVyQWxsKCksdGhpcy5jYW52YXMuZmlyZSgicGF0aDpjcmVhdGVkIix7cGF0aDppfSl9fSl9KCksZmFicmljLkNpcmNsZUJydXNoPWZhYnJpYy51dGlsLmNyZWF0ZUNsYXNzKGZhYnJpYy5CYXNlQnJ1c2gse3dpZHRoOjEwLGluaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5jYW52YXM9dCx0aGlzLnBvaW50cz1bXX0sZHJhd0RvdDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmFkZFBvaW50KHQpLGk9dGhpcy5jYW52YXMuY29udGV4dFRvcCxyPXRoaXMuY2FudmFzLnZpZXdwb3J0VHJhbnNmb3JtO2kuc2F2ZSgpLGkudHJhbnNmb3JtKHJbMF0sclsxXSxyWzJdLHJbM10scls0XSxyWzVdKSxpLmZpbGxTdHlsZT1lLmZpbGwsaS5iZWdpblBhdGgoKSxpLmFyYyhlLngsZS55LGUucmFkaXVzLDAsMipNYXRoLlBJLCExKSxpLmNsb3NlUGF0aCgpLGkuZmlsbCgpLGkucmVzdG9yZSgpfSxvbk1vdXNlRG93bjpmdW5jdGlvbih0KXt0aGlzLnBvaW50cy5sZW5ndGg9MCx0aGlzLmNhbnZhcy5jbGVhckNvbnRleHQodGhpcy5jYW52YXMuY29udGV4dFRvcCksdGhpcy5fc2V0U2hhZG93KCksdGhpcy5kcmF3RG90KHQpfSxvbk1vdXNlTW92ZTpmdW5jdGlvbih0KXt0aGlzLmRyYXdEb3QodCl9LG9uTW91c2VVcDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuY2FudmFzLnJlbmRlck9uQWRkUmVtb3ZlO3RoaXMuY2FudmFzLnJlbmRlck9uQWRkUmVtb3ZlPSExO2Zvcih2YXIgZT1bXSxpPTAscj10aGlzLnBvaW50cy5sZW5ndGg7aTxyO2krKyl7dmFyIG49dGhpcy5wb2ludHNbaV0scz1uZXcgZmFicmljLkNpcmNsZSh7cmFkaXVzOm4ucmFkaXVzLGxlZnQ6bi54LHRvcDpuLnksb3JpZ2luWDoiY2VudGVyIixvcmlnaW5ZOiJjZW50ZXIiLGZpbGw6bi5maWxsfSk7dGhpcy5zaGFkb3cmJnMuc2V0U2hhZG93KHRoaXMuc2hhZG93KSxlLnB1c2gocyl9dmFyIG89bmV3IGZhYnJpYy5Hcm91cChlLHtvcmlnaW5YOiJjZW50ZXIiLG9yaWdpblk6ImNlbnRlciJ9KTtvLmNhbnZhcz10aGlzLmNhbnZhcyx0aGlzLmNhbnZhcy5hZGQobyksdGhpcy5jYW52YXMuZmlyZSgicGF0aDpjcmVhdGVkIix7cGF0aDpvfSksdGhpcy5jYW52YXMuY2xlYXJDb250ZXh0KHRoaXMuY2FudmFzLmNvbnRleHRUb3ApLHRoaXMuX3Jlc2V0U2hhZG93KCksdGhpcy5jYW52YXMucmVuZGVyT25BZGRSZW1vdmU9dCx0aGlzLmNhbnZhcy5yZW5kZXJBbGwoKX0sYWRkUG9pbnQ6ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGZhYnJpYy5Qb2ludCh0LngsdC55KSxpPWZhYnJpYy51dGlsLmdldFJhbmRvbUludChNYXRoLm1heCgwLHRoaXMud2lkdGgtMjApLHRoaXMud2lkdGgrMjApLzIscj1uZXcgZmFicmljLkNvbG9yKHRoaXMuY29sb3IpLnNldEFscGhhKGZhYnJpYy51dGlsLmdldFJhbmRvbUludCgwLDEwMCkvMTAwKS50b1JnYmEoKTtyZXR1cm4gZS5yYWRpdXM9aSxlLmZpbGw9cix0aGlzLnBvaW50cy5wdXNoKGUpLGV9fSksZmFicmljLlNwcmF5QnJ1c2g9ZmFicmljLnV0aWwuY3JlYXRlQ2xhc3MoZmFicmljLkJhc2VCcnVzaCx7d2lkdGg6MTAsZGVuc2l0eToyMCxkb3RXaWR0aDoxLGRvdFdpZHRoVmFyaWFuY2U6MSxyYW5kb21PcGFjaXR5OiExLG9wdGltaXplT3ZlcmxhcHBpbmc6ITAsaW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0aGlzLmNhbnZhcz10LHRoaXMuc3ByYXlDaHVua3M9W119LG9uTW91c2VEb3duOmZ1bmN0aW9uKHQpe3RoaXMuc3ByYXlDaHVua3MubGVuZ3RoPTAsdGhpcy5jYW52YXMuY2xlYXJDb250ZXh0KHRoaXMuY2FudmFzLmNvbnRleHRUb3ApLHRoaXMuX3NldFNoYWRvdygpLHRoaXMuYWRkU3ByYXlDaHVuayh0KSx0aGlzLnJlbmRlcigpfSxvbk1vdXNlTW92ZTpmdW5jdGlvbih0KXt0aGlzLmFkZFNwcmF5Q2h1bmsodCksdGhpcy5yZW5kZXIoKX0sb25Nb3VzZVVwOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jYW52YXMucmVuZGVyT25BZGRSZW1vdmU7dGhpcy5jYW52YXMucmVuZGVyT25BZGRSZW1vdmU9ITE7Zm9yKHZhciBlPVtdLGk9MCxyPXRoaXMuc3ByYXlDaHVua3MubGVuZ3RoO2k8cjtpKyspZm9yKHZhciBuPXRoaXMuc3ByYXlDaHVua3NbaV0scz0wLG89bi5sZW5ndGg7czxvO3MrKyl7dmFyIGE9bmV3IGZhYnJpYy5SZWN0KHt3aWR0aDpuW3NdLndpZHRoLGhlaWdodDpuW3NdLndpZHRoLGxlZnQ6bltzXS54KzEsdG9wOm5bc10ueSsxLG9yaWdpblg6ImNlbnRlciIsb3JpZ2luWToiY2VudGVyIixmaWxsOnRoaXMuY29sb3J9KTt0aGlzLnNoYWRvdyYmYS5zZXRTaGFkb3codGhpcy5zaGFkb3cpLGUucHVzaChhKX10aGlzLm9wdGltaXplT3ZlcmxhcHBpbmcmJihlPXRoaXMuX2dldE9wdGltaXplZFJlY3RzKGUpKTt2YXIgaD1uZXcgZmFicmljLkdyb3VwKGUse29yaWdpblg6ImNlbnRlciIsb3JpZ2luWToiY2VudGVyIn0pO2guY2FudmFzPXRoaXMuY2FudmFzLHRoaXMuY2FudmFzLmFkZChoKSx0aGlzLmNhbnZhcy5maXJlKCJwYXRoOmNyZWF0ZWQiLHtwYXRoOmh9KSx0aGlzLmNhbnZhcy5jbGVhckNvbnRleHQodGhpcy5jYW52YXMuY29udGV4dFRvcCksdGhpcy5fcmVzZXRTaGFkb3coKSx0aGlzLmNhbnZhcy5yZW5kZXJPbkFkZFJlbW92ZT10LHRoaXMuY2FudmFzLnJlbmRlckFsbCgpfSxfZ2V0T3B0aW1pemVkUmVjdHM6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9e30scj0wLG49dC5sZW5ndGg7cjxuO3IrKyllPXRbcl0ubGVmdCsiIit0W3JdLnRvcCxpW2VdfHwoaVtlXT10W3JdKTt2YXIgcz1bXTtmb3IoZSBpbiBpKXMucHVzaChpW2VdKTtyZXR1cm4gc30scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jYW52YXMuY29udGV4dFRvcDt0LmZpbGxTdHlsZT10aGlzLmNvbG9yO3ZhciBlPXRoaXMuY2FudmFzLnZpZXdwb3J0VHJhbnNmb3JtO3Quc2F2ZSgpLHQudHJhbnNmb3JtKGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdKTtmb3IodmFyIGk9MCxyPXRoaXMuc3ByYXlDaHVua1BvaW50cy5sZW5ndGg7aTxyO2krKyl7dmFyIG49dGhpcy5zcHJheUNodW5rUG9pbnRzW2ldOyJ1bmRlZmluZWQiIT10eXBlb2Ygbi5vcGFjaXR5JiYodC5nbG9iYWxBbHBoYT1uLm9wYWNpdHkpLHQuZmlsbFJlY3Qobi54LG4ueSxuLndpZHRoLG4ud2lkdGgpfXQucmVzdG9yZSgpfSxhZGRTcHJheUNodW5rOmZ1bmN0aW9uKHQpe3RoaXMuc3ByYXlDaHVua1BvaW50cz1bXTtmb3IodmFyIGUsaSxyLG49dGhpcy53aWR0aC8yLHM9MDtzPHRoaXMuZGVuc2l0eTtzKyspe2U9ZmFicmljLnV0aWwuZ2V0UmFuZG9tSW50KHQueC1uLHQueCtuKSxpPWZhYnJpYy51dGlsLmdldFJhbmRvbUludCh0Lnktbix0Lnkrbikscj10aGlzLmRvdFdpZHRoVmFyaWFuY2U/ZmFicmljLnV0aWwuZ2V0UmFuZG9tSW50KE1hdGgubWF4KDEsdGhpcy5kb3RXaWR0aC10aGlzLmRvdFdpZHRoVmFyaWFuY2UpLHRoaXMuZG90V2lkdGgrdGhpcy5kb3RXaWR0aFZhcmlhbmNlKTp0aGlzLmRvdFdpZHRoO3ZhciBvPW5ldyBmYWJyaWMuUG9pbnQoZSxpKTtvLndpZHRoPXIsdGhpcy5yYW5kb21PcGFjaXR5JiYoby5vcGFjaXR5PWZhYnJpYy51dGlsLmdldFJhbmRvbUludCgwLDEwMCkvMTAwKSx0aGlzLnNwcmF5Q2h1bmtQb2ludHMucHVzaChvKX10aGlzLnNwcmF5Q2h1bmtzLnB1c2godGhpcy5zcHJheUNodW5rUG9pbnRzKX19KSxmYWJyaWMuUGF0dGVybkJydXNoPWZhYnJpYy51dGlsLmNyZWF0ZUNsYXNzKGZhYnJpYy5QZW5jaWxCcnVzaCx7Z2V0UGF0dGVyblNyYzpmdW5jdGlvbigpe3ZhciB0PTIwLGU9NSxpPWZhYnJpYy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxyPWkuZ2V0Q29udGV4dCgiMmQiKTtyZXR1cm4gaS53aWR0aD1pLmhlaWdodD10K2Usci5maWxsU3R5bGU9dGhpcy5jb2xvcixyLmJlZ2luUGF0aCgpLHIuYXJjKHQvMix0LzIsdC8yLDAsMipNYXRoLlBJLCExKSxyLmNsb3NlUGF0aCgpLHIuZmlsbCgpLGl9LGdldFBhdHRlcm5TcmNGdW5jdGlvbjpmdW5jdGlvbigpe3JldHVybiBTdHJpbmcodGhpcy5nZXRQYXR0ZXJuU3JjKS5yZXBsYWNlKCJ0aGlzLmNvbG9yIiwnIicrdGhpcy5jb2xvcisnIicpfSxnZXRQYXR0ZXJuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FudmFzLmNvbnRleHRUb3AuY3JlYXRlUGF0dGVybih0aGlzLnNvdXJjZXx8dGhpcy5nZXRQYXR0ZXJuU3JjKCksInJlcGVhdCIpfSxfc2V0QnJ1c2hTdHlsZXM6ZnVuY3Rpb24oKXt0aGlzLmNhbGxTdXBlcigiX3NldEJydXNoU3R5bGVzIiksdGhpcy5jYW52YXMuY29udGV4dFRvcC5zdHJva2VTdHlsZT10aGlzLmdldFBhdHRlcm4oKX0sY3JlYXRlUGF0aDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNhbGxTdXBlcigiY3JlYXRlUGF0aCIsdCksaT1lLl9nZXRMZWZ0VG9wQ29vcmRzKCkuc2NhbGFyQWRkKGUuc3Ryb2tlV2lkdGgvMik7cmV0dXJuIGUuc3Ryb2tlPW5ldyBmYWJyaWMuUGF0dGVybih7c291cmNlOnRoaXMuc291cmNlfHx0aGlzLmdldFBhdHRlcm5TcmNGdW5jdGlvbigpLG9mZnNldFg6LWkueCxvZmZzZXRZOi1pLnl9KSxlfX0pLGZ1bmN0aW9uKCl7dmFyIHQ9ZmFicmljLnV0aWwuZ2V0UG9pbnRlcixlPWZhYnJpYy51dGlsLmRlZ3JlZXNUb1JhZGlhbnMsaT1mYWJyaWMudXRpbC5yYWRpYW5zVG9EZWdyZWVzLHI9TWF0aC5hdGFuMixuPU1hdGguYWJzLHM9ZmFicmljLlN0YXRpY0NhbnZhcy5zdXBwb3J0cygic2V0TGluZURhc2giKSxvPS41O2ZhYnJpYy5DYW52YXM9ZmFicmljLnV0aWwuY3JlYXRlQ2xhc3MoZmFicmljLlN0YXRpY0NhbnZhcyx7aW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe2V8fChlPXt9KSx0aGlzLl9pbml0U3RhdGljKHQsZSksdGhpcy5faW5pdEludGVyYWN0aXZlKCksdGhpcy5fY3JlYXRlQ2FjaGVDYW52YXMoKX0sdW5pU2NhbGVUcmFuc2Zvcm06ITEsdW5pU2NhbGVLZXk6InNoaWZ0S2V5IixjZW50ZXJlZFNjYWxpbmc6ITEsY2VudGVyZWRSb3RhdGlvbjohMSxjZW50ZXJlZEtleToiYWx0S2V5IixhbHRBY3Rpb25LZXk6InNoaWZ0S2V5IixpbnRlcmFjdGl2ZTohMCxzZWxlY3Rpb246ITAsc2VsZWN0aW9uS2V5OiJzaGlmdEtleSIsYWx0U2VsZWN0aW9uS2V5Om51bGwsc2VsZWN0aW9uQ29sb3I6InJnYmEoMTAwLCAxMDAsIDI1NSwgMC4zKSIsc2VsZWN0aW9uRGFzaEFycmF5OltdLHNlbGVjdGlvbkJvcmRlckNvbG9yOiJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMykiLHNlbGVjdGlvbkxpbmVXaWR0aDoxLGhvdmVyQ3Vyc29yOiJtb3ZlIixtb3ZlQ3Vyc29yOiJtb3ZlIixkZWZhdWx0Q3Vyc29yOiJkZWZhdWx0IixmcmVlRHJhd2luZ0N1cnNvcjoiY3Jvc3NoYWlyIixyb3RhdGlvbkN1cnNvcjoiY3Jvc3NoYWlyIixjb250YWluZXJDbGFzczoiY2FudmFzLWNvbnRhaW5lciIscGVyUGl4ZWxUYXJnZXRGaW5kOiExLHRhcmdldEZpbmRUb2xlcmFuY2U6MCxza2lwVGFyZ2V0RmluZDohMSxpc0RyYXdpbmdNb2RlOiExLHByZXNlcnZlT2JqZWN0U3RhY2tpbmc6ITEsc3RvcENvbnRleHRNZW51OiExLGZpcmVSaWdodENsaWNrOiExLF9pbml0SW50ZXJhY3RpdmU6ZnVuY3Rpb24oKXt0aGlzLl9jdXJyZW50VHJhbnNmb3JtPW51bGwsdGhpcy5fZ3JvdXBTZWxlY3Rvcj1udWxsLHRoaXMuX2luaXRXcmFwcGVyRWxlbWVudCgpLHRoaXMuX2NyZWF0ZVVwcGVyQ2FudmFzKCksdGhpcy5faW5pdEV2ZW50TGlzdGVuZXJzKCksdGhpcy5faW5pdFJldGluYVNjYWxpbmcoKSx0aGlzLmZyZWVEcmF3aW5nQnJ1c2g9ZmFicmljLlBlbmNpbEJydXNoJiZuZXcgZmFicmljLlBlbmNpbEJydXNoKHRoaXMpLHRoaXMuY2FsY09mZnNldCgpfSxfY2hvb3NlT2JqZWN0c1RvUmVuZGVyOmZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmdldEFjdGl2ZUdyb3VwKCksaT10aGlzLmdldEFjdGl2ZU9iamVjdCgpLHI9W10sbj1bXTtpZighZSYmIWl8fHRoaXMucHJlc2VydmVPYmplY3RTdGFja2luZylyPXRoaXMuX29iamVjdHM7ZWxzZXtmb3IodmFyIHM9MCxvPXRoaXMuX29iamVjdHMubGVuZ3RoO3M8bztzKyspdD10aGlzLl9vYmplY3RzW3NdLGUmJmUuY29udGFpbnModCl8fHQ9PT1pP24ucHVzaCh0KTpyLnB1c2godCk7ZSYmKGUuX3NldCgiX29iamVjdHMiLG4pLHIucHVzaChlKSksaSYmci5wdXNoKGkpfXJldHVybiByfSxyZW5kZXJBbGw6ZnVuY3Rpb24oKXshdGhpcy5zZWxlY3Rpb258fHRoaXMuX2dyb3VwU2VsZWN0b3J8fHRoaXMuaXNEcmF3aW5nTW9kZXx8dGhpcy5jbGVhckNvbnRleHQodGhpcy5jb250ZXh0VG9wKTt2YXIgdD10aGlzLmNvbnRleHRDb250YWluZXI7cmV0dXJuIHRoaXMucmVuZGVyQ2FudmFzKHQsdGhpcy5fY2hvb3NlT2JqZWN0c1RvUmVuZGVyKCkpLHRoaXN9LHJlbmRlclRvcDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dFRvcDtyZXR1cm4gdGhpcy5jbGVhckNvbnRleHQodCksdGhpcy5zZWxlY3Rpb24mJnRoaXMuX2dyb3VwU2VsZWN0b3ImJnRoaXMuX2RyYXdTZWxlY3Rpb24odCksdGhpcy5maXJlKCJhZnRlcjpyZW5kZXIiKSx0aGlzfSxfcmVzZXRDdXJyZW50VHJhbnNmb3JtOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY3VycmVudFRyYW5zZm9ybTt0LnRhcmdldC5zZXQoe3NjYWxlWDp0Lm9yaWdpbmFsLnNjYWxlWCxzY2FsZVk6dC5vcmlnaW5hbC5zY2FsZVksc2tld1g6dC5vcmlnaW5hbC5za2V3WCxza2V3WTp0Lm9yaWdpbmFsLnNrZXdZLGxlZnQ6dC5vcmlnaW5hbC5sZWZ0LHRvcDp0Lm9yaWdpbmFsLnRvcH0pLHRoaXMuX3Nob3VsZENlbnRlclRyYW5zZm9ybSh0LnRhcmdldCk/InJvdGF0ZSI9PT10LmFjdGlvbj90aGlzLl9zZXRPcmlnaW5Ub0NlbnRlcih0LnRhcmdldCk6KCJjZW50ZXIiIT09dC5vcmlnaW5YJiYoInJpZ2h0Ij09PXQub3JpZ2luWD90Lm1vdXNlWFNpZ249LTE6dC5tb3VzZVhTaWduPTEpLCJjZW50ZXIiIT09dC5vcmlnaW5ZJiYoImJvdHRvbSI9PT10Lm9yaWdpblk/dC5tb3VzZVlTaWduPS0xOnQubW91c2VZU2lnbj0xKSx0Lm9yaWdpblg9ImNlbnRlciIsdC5vcmlnaW5ZPSJjZW50ZXIiKToodC5vcmlnaW5YPXQub3JpZ2luYWwub3JpZ2luWCx0Lm9yaWdpblk9dC5vcmlnaW5hbC5vcmlnaW5ZKX0sY29udGFpbnNQb2ludDpmdW5jdGlvbih0LGUsaSl7dmFyIHIsbj0hMCxzPWl8fHRoaXMuZ2V0UG9pbnRlcih0LG4pO3JldHVybiByPWUuZ3JvdXAmJmUuZ3JvdXA9PT10aGlzLmdldEFjdGl2ZUdyb3VwKCk/dGhpcy5fbm9ybWFsaXplUG9pbnRlcihlLmdyb3VwLHMpOnt4OnMueCx5OnMueX0sZS5jb250YWluc1BvaW50KHIpfHxlLl9maW5kVGFyZ2V0Q29ybmVyKHMpfSxfbm9ybWFsaXplUG9pbnRlcjpmdW5jdGlvbih0LGUpe3ZhciBpPXQuY2FsY1RyYW5zZm9ybU1hdHJpeCgpLHI9ZmFicmljLnV0aWwuaW52ZXJ0VHJhbnNmb3JtKGkpLG49dGhpcy52aWV3cG9ydFRyYW5zZm9ybSxzPXRoaXMucmVzdG9yZVBvaW50ZXJWcHQoZSksbz1mYWJyaWMudXRpbC50cmFuc2Zvcm1Qb2ludChzLHIpO3JldHVybiBmYWJyaWMudXRpbC50cmFuc2Zvcm1Qb2ludChvLG4pfSxpc1RhcmdldFRyYW5zcGFyZW50OmZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10Lmhhc0JvcmRlcnMsbj10LnRyYW5zcGFyZW50Q29ybmVycyxzPXRoaXMuY29udGV4dENhY2hlLG89dC5zZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3I7dC5oYXNCb3JkZXJzPXQudHJhbnNwYXJlbnRDb3JuZXJzPSExLHQuc2VsZWN0aW9uQmFja2dyb3VuZENvbG9yPSIiLHMuc2F2ZSgpLHMudHJhbnNmb3JtLmFwcGx5KHMsdGhpcy52aWV3cG9ydFRyYW5zZm9ybSksdC5yZW5kZXIocykscy5yZXN0b3JlKCksdC5hY3RpdmUmJnQuX3JlbmRlckNvbnRyb2xzKHMpLHQuaGFzQm9yZGVycz1yLHQudHJhbnNwYXJlbnRDb3JuZXJzPW4sdC5zZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3I9bzt2YXIgYT1mYWJyaWMudXRpbC5pc1RyYW5zcGFyZW50KHMsZSxpLHRoaXMudGFyZ2V0RmluZFRvbGVyYW5jZSk7cmV0dXJuIHRoaXMuY2xlYXJDb250ZXh0KHMpLGF9LF9zaG91bGRDbGVhclNlbGVjdGlvbjpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ2V0QWN0aXZlR3JvdXAoKSxyPXRoaXMuZ2V0QWN0aXZlT2JqZWN0KCk7cmV0dXJuIWV8fGUmJmkmJiFpLmNvbnRhaW5zKGUpJiZpIT09ZSYmIXRbdGhpcy5zZWxlY3Rpb25LZXldfHxlJiYhZS5ldmVudGVkfHxlJiYhZS5zZWxlY3RhYmxlJiZyJiZyIT09ZX0sX3Nob3VsZENlbnRlclRyYW5zZm9ybTpmdW5jdGlvbih0KXtpZih0KXt2YXIgZSxpPXRoaXMuX2N1cnJlbnRUcmFuc2Zvcm07cmV0dXJuInNjYWxlIj09PWkuYWN0aW9ufHwic2NhbGVYIj09PWkuYWN0aW9ufHwic2NhbGVZIj09PWkuYWN0aW9uP2U9dGhpcy5jZW50ZXJlZFNjYWxpbmd8fHQuY2VudGVyZWRTY2FsaW5nOiJyb3RhdGUiPT09aS5hY3Rpb24mJihlPXRoaXMuY2VudGVyZWRSb3RhdGlvbnx8dC5jZW50ZXJlZFJvdGF0aW9uKSxlPyFpLmFsdEtleTppLmFsdEtleX19LF9nZXRPcmlnaW5Gcm9tQ29ybmVyOmZ1bmN0aW9uKHQsZSl7dmFyIGk9e3g6dC5vcmlnaW5YLHk6dC5vcmlnaW5ZfTtyZXR1cm4ibWwiPT09ZXx8InRsIj09PWV8fCJibCI9PT1lP2kueD0icmlnaHQiOiJtciIhPT1lJiYidHIiIT09ZSYmImJyIiE9PWV8fChpLng9ImxlZnQiKSwidGwiPT09ZXx8Im10Ij09PWV8fCJ0ciI9PT1lP2kueT0iYm90dG9tIjoiYmwiIT09ZSYmIm1iIiE9PWUmJiJiciIhPT1lfHwoaS55PSJ0b3AiKSxpfSxfZ2V0QWN0aW9uRnJvbUNvcm5lcjpmdW5jdGlvbih0LGUsaSl7aWYoIWUpcmV0dXJuImRyYWciO3N3aXRjaChlKXtjYXNlIm10ciI6cmV0dXJuInJvdGF0ZSI7Y2FzZSJtbCI6Y2FzZSJtciI6cmV0dXJuIGlbdGhpcy5hbHRBY3Rpb25LZXldPyJza2V3WSI6InNjYWxlWCI7Y2FzZSJtdCI6Y2FzZSJtYiI6cmV0dXJuIGlbdGhpcy5hbHRBY3Rpb25LZXldPyJza2V3WCI6InNjYWxlWSI7ZGVmYXVsdDpyZXR1cm4ic2NhbGUifX0sX3NldHVwQ3VycmVudFRyYW5zZm9ybTpmdW5jdGlvbih0LGkpe2lmKGkpe3ZhciByPXRoaXMuZ2V0UG9pbnRlcih0KSxuPWkuX2ZpbmRUYXJnZXRDb3JuZXIodGhpcy5nZXRQb2ludGVyKHQsITApKSxzPXRoaXMuX2dldEFjdGlvbkZyb21Db3JuZXIoaSxuLHQpLG89dGhpcy5fZ2V0T3JpZ2luRnJvbUNvcm5lcihpLG4pO3RoaXMuX2N1cnJlbnRUcmFuc2Zvcm09e3RhcmdldDppLGFjdGlvbjpzLGNvcm5lcjpuLHNjYWxlWDppLnNjYWxlWCxzY2FsZVk6aS5zY2FsZVksc2tld1g6aS5za2V3WCxza2V3WTppLnNrZXdZLG9mZnNldFg6ci54LWkubGVmdCxvZmZzZXRZOnIueS1pLnRvcCxvcmlnaW5YOm8ueCxvcmlnaW5ZOm8ueSxleDpyLngsZXk6ci55LGxhc3RYOnIueCxsYXN0WTpyLnksbGVmdDppLmxlZnQsdG9wOmkudG9wLHRoZXRhOmUoaS5hbmdsZSksd2lkdGg6aS53aWR0aCppLnNjYWxlWCxtb3VzZVhTaWduOjEsbW91c2VZU2lnbjoxLHNoaWZ0S2V5OnQuc2hpZnRLZXksYWx0S2V5OnRbdGhpcy5jZW50ZXJlZEtleV19LHRoaXMuX2N1cnJlbnRUcmFuc2Zvcm0ub3JpZ2luYWw9e2xlZnQ6aS5sZWZ0LHRvcDppLnRvcCxzY2FsZVg6aS5zY2FsZVgsc2NhbGVZOmkuc2NhbGVZLHNrZXdYOmkuc2tld1gsc2tld1k6aS5za2V3WSxvcmlnaW5YOm8ueCxvcmlnaW5ZOm8ueX0sdGhpcy5fcmVzZXRDdXJyZW50VHJhbnNmb3JtKCl9fSxfdHJhbnNsYXRlT2JqZWN0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fY3VycmVudFRyYW5zZm9ybSxyPWkudGFyZ2V0LG49dC1pLm9mZnNldFgscz1lLWkub2Zmc2V0WSxvPSFyLmdldCgibG9ja01vdmVtZW50WCIpJiZyLmxlZnQhPT1uLGE9IXIuZ2V0KCJsb2NrTW92ZW1lbnRZIikmJnIudG9wIT09cztyZXR1cm4gbyYmci5zZXQoImxlZnQiLG4pLGEmJnIuc2V0KCJ0b3AiLHMpLG98fGF9LF9jaGFuZ2VTa2V3VHJhbnNmb3JtT3JpZ2luOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcj0ib3JpZ2luWCIsbj17MDoiY2VudGVyIn0scz1lLnRhcmdldC5za2V3WCxvPSJsZWZ0IixhPSJyaWdodCIsaD0ibXQiPT09ZS5jb3JuZXJ8fCJtbCI9PT1lLmNvcm5lcj8xOi0xLGM9MTt0PXQ+MD8xOi0xLCJ5Ij09PWkmJihzPWUudGFyZ2V0LnNrZXdZLG89InRvcCIsYT0iYm90dG9tIixyPSJvcmlnaW5ZIiksblstMV09byxuWzFdPWEsZS50YXJnZXQuZmxpcFgmJihjKj0tMSksZS50YXJnZXQuZmxpcFkmJihjKj0tMSksMD09PXM/KGUuc2tld1NpZ249LWgqdCpjLGVbcl09blstdF0pOihzPXM+MD8xOi0xLGUuc2tld1NpZ249cyxlW3JdPW5bcypoKmNdKX0sX3NrZXdPYmplY3Q6ZnVuY3Rpb24odCxlLGkpe3ZhciByPXRoaXMuX2N1cnJlbnRUcmFuc2Zvcm0sbj1yLnRhcmdldCxzPSExLG89bi5nZXQoImxvY2tTa2V3aW5nWCIpLGE9bi5nZXQoImxvY2tTa2V3aW5nWSIpO2lmKG8mJiJ4Ij09PWl8fGEmJiJ5Ij09PWkpcmV0dXJuITE7dmFyIGgsYyxsPW4uZ2V0Q2VudGVyUG9pbnQoKSx1PW4udG9Mb2NhbFBvaW50KG5ldyBmYWJyaWMuUG9pbnQodCxlKSwiY2VudGVyIiwiY2VudGVyIilbaV0sZj1uLnRvTG9jYWxQb2ludChuZXcgZmFicmljLlBvaW50KHIubGFzdFgsci5sYXN0WSksImNlbnRlciIsImNlbnRlciIpW2ldLGQ9bi5fZ2V0VHJhbnNmb3JtZWREaW1lbnNpb25zKCk7cmV0dXJuIHRoaXMuX2NoYW5nZVNrZXdUcmFuc2Zvcm1PcmlnaW4odS1mLHIsaSksaD1uLnRvTG9jYWxQb2ludChuZXcgZmFicmljLlBvaW50KHQsZSksci5vcmlnaW5YLHIub3JpZ2luWSlbaV0sYz1uLnRyYW5zbGF0ZVRvT3JpZ2luUG9pbnQobCxyLm9yaWdpblgsci5vcmlnaW5ZKSxzPXRoaXMuX3NldE9iamVjdFNrZXcoaCxyLGksZCksci5sYXN0WD10LHIubGFzdFk9ZSxuLnNldFBvc2l0aW9uQnlPcmlnaW4oYyxyLm9yaWdpblgsci5vcmlnaW5ZKSxzfSxfc2V0T2JqZWN0U2tldzpmdW5jdGlvbih0LGUsaSxyKXt2YXIgbixzLG8sYSxoLGMsbCx1LGYsZD1lLnRhcmdldCxnPSExLHA9ZS5za2V3U2lnbjtyZXR1cm4ieCI9PT1pPyhhPSJ5IixoPSJZIixjPSJYIix1PTAsZj1kLnNrZXdZKTooYT0ieCIsaD0iWCIsYz0iWSIsdT1kLnNrZXdYLGY9MCksbz1kLl9nZXRUcmFuc2Zvcm1lZERpbWVuc2lvbnModSxmKSxsPTIqTWF0aC5hYnModCktb1tpXSxsPD0yP249MDoobj1wKk1hdGguYXRhbihsL2RbInNjYWxlIitjXS8ob1thXS9kWyJzY2FsZSIraF0pKSxuPWZhYnJpYy51dGlsLnJhZGlhbnNUb0RlZ3JlZXMobikpLGc9ZFsic2tldyIrY10hPT1uLGQuc2V0KCJza2V3IitjLG4pLDAhPT1kWyJza2V3IitoXSYmKHM9ZC5fZ2V0VHJhbnNmb3JtZWREaW1lbnNpb25zKCksbj1yW2FdL3NbYV0qZFsic2NhbGUiK2hdLGQuc2V0KCJzY2FsZSIraCxuKSksZ30sX3NjYWxlT2JqZWN0OmZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLl9jdXJyZW50VHJhbnNmb3JtLG49ci50YXJnZXQscz1uLmdldCgibG9ja1NjYWxpbmdYIiksbz1uLmdldCgibG9ja1NjYWxpbmdZIiksYT1uLmdldCgibG9ja1NjYWxpbmdGbGlwIik7aWYocyYmbylyZXR1cm4hMTt2YXIgaD1uLnRyYW5zbGF0ZVRvT3JpZ2luUG9pbnQobi5nZXRDZW50ZXJQb2ludCgpLHIub3JpZ2luWCxyLm9yaWdpblkpLGM9bi50b0xvY2FsUG9pbnQobmV3IGZhYnJpYy5Qb2ludCh0LGUpLHIub3JpZ2luWCxyLm9yaWdpblkpLGw9bi5fZ2V0VHJhbnNmb3JtZWREaW1lbnNpb25zKCksdT0hMTtyZXR1cm4gdGhpcy5fc2V0TG9jYWxNb3VzZShjLHIpLHU9dGhpcy5fc2V0T2JqZWN0U2NhbGUoYyxyLHMsbyxpLGEsbCksbi5zZXRQb3NpdGlvbkJ5T3JpZ2luKGgsci5vcmlnaW5YLHIub3JpZ2luWSksdX0sX3NldE9iamVjdFNjYWxlOmZ1bmN0aW9uKHQsZSxpLHIsbixzLG8pe3ZhciBhLGgsYyxsLHU9ZS50YXJnZXQsZj0hMSxkPSExLGc9ITE7cmV0dXJuIGM9dC54KnUuc2NhbGVYL28ueCxsPXQueSp1LnNjYWxlWS9vLnksYT11LnNjYWxlWCE9PWMsaD11LnNjYWxlWSE9PWwscyYmYzw9MCYmYzx1LnNjYWxlWCYmKGY9ITApLHMmJmw8PTAmJmw8dS5zY2FsZVkmJihkPSEwKSwiZXF1YWxseSIhPT1ufHxpfHxyP24/IngiIT09bnx8dS5nZXQoImxvY2tVbmlTY2FsaW5nIik/InkiIT09bnx8dS5nZXQoImxvY2tVbmlTY2FsaW5nIil8fGR8fHJ8fHUuc2V0KCJzY2FsZVkiLGwpJiYoZz1nfHxoKTpmfHxpfHx1LnNldCgic2NhbGVYIixjKSYmKGc9Z3x8YSk6KGZ8fGl8fHUuc2V0KCJzY2FsZVgiLGMpJiYoZz1nfHxhKSxkfHxyfHx1LnNldCgic2NhbGVZIixsKSYmKGc9Z3x8aCkpOmZ8fGR8fChnPXRoaXMuX3NjYWxlT2JqZWN0RXF1YWxseSh0LHUsZSxvKSksZS5uZXdTY2FsZVg9YyxlLm5ld1NjYWxlWT1sLGZ8fGR8fHRoaXMuX2ZsaXBPYmplY3QoZSxuKSxnfSxfc2NhbGVPYmplY3RFcXVhbGx5OmZ1bmN0aW9uKHQsZSxpLHIpe3ZhciBuLHM9dC55K3QueCxvPXIueSppLm9yaWdpbmFsLnNjYWxlWS9lLnNjYWxlWStyLngqaS5vcmlnaW5hbC5zY2FsZVgvZS5zY2FsZVg7cmV0dXJuIGkubmV3U2NhbGVYPWkub3JpZ2luYWwuc2NhbGVYKnMvbyxpLm5ld1NjYWxlWT1pLm9yaWdpbmFsLnNjYWxlWSpzL28sbj1pLm5ld1NjYWxlWCE9PWUuc2NhbGVYfHxpLm5ld1NjYWxlWSE9PWUuc2NhbGVZLGUuc2V0KCJzY2FsZVgiLGkubmV3U2NhbGVYKSxlLnNldCgic2NhbGVZIixpLm5ld1NjYWxlWSksbn0sX2ZsaXBPYmplY3Q6ZnVuY3Rpb24odCxlKXt0Lm5ld1NjYWxlWDwwJiYieSIhPT1lJiYoImxlZnQiPT09dC5vcmlnaW5YP3Qub3JpZ2luWD0icmlnaHQiOiJyaWdodCI9PT10Lm9yaWdpblgmJih0Lm9yaWdpblg9ImxlZnQiKSksdC5uZXdTY2FsZVk8MCYmIngiIT09ZSYmKCJ0b3AiPT09dC5vcmlnaW5ZP3Qub3JpZ2luWT0iYm90dG9tIjoiYm90dG9tIj09PXQub3JpZ2luWSYmKHQub3JpZ2luWT0idG9wIikpfSxfc2V0TG9jYWxNb3VzZTpmdW5jdGlvbih0LGUpe3ZhciBpPWUudGFyZ2V0OyJyaWdodCI9PT1lLm9yaWdpblg/dC54Kj0tMToiY2VudGVyIj09PWUub3JpZ2luWCYmKHQueCo9MiplLm1vdXNlWFNpZ24sdC54PDAmJihlLm1vdXNlWFNpZ249LWUubW91c2VYU2lnbikpLCJib3R0b20iPT09ZS5vcmlnaW5ZP3QueSo9LTE6ImNlbnRlciI9PT1lLm9yaWdpblkmJih0LnkqPTIqZS5tb3VzZVlTaWduLHQueTwwJiYoZS5tb3VzZVlTaWduPS1lLm1vdXNlWVNpZ24pKSxuKHQueCk+aS5wYWRkaW5nP3QueDwwP3QueCs9aS5wYWRkaW5nOnQueC09aS5wYWRkaW5nOnQueD0wLG4odC55KT5pLnBhZGRpbmc/dC55PDA/dC55Kz1pLnBhZGRpbmc6dC55LT1pLnBhZGRpbmc6dC55PTB9LF9yb3RhdGVPYmplY3Q6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9jdXJyZW50VHJhbnNmb3JtO2lmKG4udGFyZ2V0LmdldCgibG9ja1JvdGF0aW9uIikpcmV0dXJuITE7dmFyIHM9cihuLmV5LW4udG9wLG4uZXgtbi5sZWZ0KSxvPXIoZS1uLnRvcCx0LW4ubGVmdCksYT1pKG8tcytuLnRoZXRhKTtyZXR1cm4gYTwwJiYoYT0zNjArYSksbi50YXJnZXQuYW5nbGU9YSUzNjAsITB9LHNldEN1cnNvcjpmdW5jdGlvbih0KXt0aGlzLnVwcGVyQ2FudmFzRWwuc3R5bGUuY3Vyc29yPXR9LF9yZXNldE9iamVjdFRyYW5zZm9ybTpmdW5jdGlvbih0KXt0LnNjYWxlWD0xLHQuc2NhbGVZPTEsdC5za2V3WD0wLHQuc2tld1k9MCx0LnNldEFuZ2xlKDApfSxfZHJhd1NlbGVjdGlvbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9ncm91cFNlbGVjdG9yLGk9ZS5sZWZ0LHI9ZS50b3AsYT1uKGkpLGg9bihyKTtpZih0aGlzLnNlbGVjdGlvbkNvbG9yJiYodC5maWxsU3R5bGU9dGhpcy5zZWxlY3Rpb25Db2xvcix0LmZpbGxSZWN0KGUuZXgtKGk+MD8wOi1pKSxlLmV5LShyPjA/MDotciksYSxoKSksdGhpcy5zZWxlY3Rpb25MaW5lV2lkdGgmJnRoaXMuc2VsZWN0aW9uQm9yZGVyQ29sb3IpaWYodC5saW5lV2lkdGg9dGhpcy5zZWxlY3Rpb25MaW5lV2lkdGgsdC5zdHJva2VTdHlsZT10aGlzLnNlbGVjdGlvbkJvcmRlckNvbG9yLHRoaXMuc2VsZWN0aW9uRGFzaEFycmF5Lmxlbmd0aD4xJiYhcyl7dmFyIGM9ZS5leCtvLShpPjA/MDphKSxsPWUuZXkrby0ocj4wPzA6aCk7dC5iZWdpblBhdGgoKSxmYWJyaWMudXRpbC5kcmF3RGFzaGVkTGluZSh0LGMsbCxjK2EsbCx0aGlzLnNlbGVjdGlvbkRhc2hBcnJheSksZmFicmljLnV0aWwuZHJhd0Rhc2hlZExpbmUodCxjLGwraC0xLGMrYSxsK2gtMSx0aGlzLnNlbGVjdGlvbkRhc2hBcnJheSksZmFicmljLnV0aWwuZHJhd0Rhc2hlZExpbmUodCxjLGwsYyxsK2gsdGhpcy5zZWxlY3Rpb25EYXNoQXJyYXkpLGZhYnJpYy51dGlsLmRyYXdEYXNoZWRMaW5lKHQsYythLTEsbCxjK2EtMSxsK2gsdGhpcy5zZWxlY3Rpb25EYXNoQXJyYXkpLHQuY2xvc2VQYXRoKCksdC5zdHJva2UoKX1lbHNlIGZhYnJpYy5PYmplY3QucHJvdG90eXBlLl9zZXRMaW5lRGFzaC5jYWxsKHRoaXMsdCx0aGlzLnNlbGVjdGlvbkRhc2hBcnJheSksdC5zdHJva2VSZWN0KGUuZXgrby0oaT4wPzA6YSksZS5leStvLShyPjA/MDpoKSxhLGgpfSxmaW5kVGFyZ2V0OmZ1bmN0aW9uKHQsZSl7aWYoIXRoaXMuc2tpcFRhcmdldEZpbmQpe3ZhciBpLHI9ITAsbj10aGlzLmdldFBvaW50ZXIodCxyKSxzPXRoaXMuZ2V0QWN0aXZlR3JvdXAoKSxvPXRoaXMuZ2V0QWN0aXZlT2JqZWN0KCk7aWYocyYmIWUmJnRoaXMuX2NoZWNrVGFyZ2V0KG4scykpcmV0dXJuIHRoaXMuX2ZpcmVPdmVyT3V0RXZlbnRzKHMsdCkscztpZihvJiZvLl9maW5kVGFyZ2V0Q29ybmVyKG4pKXJldHVybiB0aGlzLl9maXJlT3Zlck91dEV2ZW50cyhvLHQpLG87aWYobyYmdGhpcy5fY2hlY2tUYXJnZXQobixvKSl7aWYoIXRoaXMucHJlc2VydmVPYmplY3RTdGFja2luZylyZXR1cm4gdGhpcy5fZmlyZU92ZXJPdXRFdmVudHMobyx0KSxvO2k9b310aGlzLnRhcmdldHM9W107dmFyIGE9dGhpcy5fc2VhcmNoUG9zc2libGVUYXJnZXRzKHRoaXMuX29iamVjdHMsbik7cmV0dXJuIHRbdGhpcy5hbHRTZWxlY3Rpb25LZXldJiZhJiZpJiZhIT09aSYmKGE9aSksdGhpcy5fZmlyZU92ZXJPdXRFdmVudHMoYSx0KSxhfX0sX2ZpcmVPdmVyT3V0RXZlbnRzOmZ1bmN0aW9uKHQsZSl7dD90aGlzLl9ob3ZlcmVkVGFyZ2V0IT09dCYmKHRoaXMuX2hvdmVyZWRUYXJnZXQmJih0aGlzLmZpcmUoIm1vdXNlOm91dCIse3RhcmdldDp0aGlzLl9ob3ZlcmVkVGFyZ2V0LGU6ZX0pLHRoaXMuX2hvdmVyZWRUYXJnZXQuZmlyZSgibW91c2VvdXQiKSksdGhpcy5maXJlKCJtb3VzZTpvdmVyIix7dGFyZ2V0OnQsZTplfSksdC5maXJlKCJtb3VzZW92ZXIiKSx0aGlzLl9ob3ZlcmVkVGFyZ2V0PXQpOnRoaXMuX2hvdmVyZWRUYXJnZXQmJih0aGlzLmZpcmUoIm1vdXNlOm91dCIse3RhcmdldDp0aGlzLl9ob3ZlcmVkVGFyZ2V0LGU6ZX0pLHRoaXMuX2hvdmVyZWRUYXJnZXQuZmlyZSgibW91c2VvdXQiKSx0aGlzLl9ob3ZlcmVkVGFyZ2V0PW51bGwpfSxfY2hlY2tUYXJnZXQ6ZnVuY3Rpb24odCxlKXtpZihlJiZlLnZpc2libGUmJmUuZXZlbnRlZCYmdGhpcy5jb250YWluc1BvaW50KG51bGwsZSx0KSl7aWYoIXRoaXMucGVyUGl4ZWxUYXJnZXRGaW5kJiYhZS5wZXJQaXhlbFRhcmdldEZpbmR8fGUuaXNFZGl0aW5nKXJldHVybiEwO3ZhciBpPXRoaXMuaXNUYXJnZXRUcmFuc3BhcmVudChlLHQueCx0LnkpO2lmKCFpKXJldHVybiEwfX0sX3NlYXJjaFBvc3NpYmxlVGFyZ2V0czpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaSxyLG4scz10Lmxlbmd0aDtzLS07KWlmKHRoaXMuX2NoZWNrVGFyZ2V0KGUsdFtzXSkpe2k9dFtzXSwiZ3JvdXAiPT09aS50eXBlJiZpLnN1YlRhcmdldENoZWNrJiYocj10aGlzLl9ub3JtYWxpemVQb2ludGVyKGksZSksbj10aGlzLl9zZWFyY2hQb3NzaWJsZVRhcmdldHMoaS5fb2JqZWN0cyxyKSxuJiZ0aGlzLnRhcmdldHMucHVzaChuKSk7YnJlYWt9cmV0dXJuIGl9LHJlc3RvcmVQb2ludGVyVnB0OmZ1bmN0aW9uKHQpe3JldHVybiBmYWJyaWMudXRpbC50cmFuc2Zvcm1Qb2ludCh0LGZhYnJpYy51dGlsLmludmVydFRyYW5zZm9ybSh0aGlzLnZpZXdwb3J0VHJhbnNmb3JtKSl9LGdldFBvaW50ZXI6ZnVuY3Rpb24oZSxpLHIpe3J8fChyPXRoaXMudXBwZXJDYW52YXNFbCk7dmFyIG4scz10KGUpLG89ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxhPW8ud2lkdGh8fDAsaD1vLmhlaWdodHx8MDtyZXR1cm4gYSYmaHx8KCJ0b3AiaW4gbyYmImJvdHRvbSJpbiBvJiYoaD1NYXRoLmFicyhvLnRvcC1vLmJvdHRvbSkpLCJyaWdodCJpbiBvJiYibGVmdCJpbiBvJiYoYT1NYXRoLmFicyhvLnJpZ2h0LW8ubGVmdCkpKSx0aGlzLmNhbGNPZmZzZXQoKSxzLng9cy54LXRoaXMuX29mZnNldC5sZWZ0LHMueT1zLnktdGhpcy5fb2Zmc2V0LnRvcCxpfHwocz10aGlzLnJlc3RvcmVQb2ludGVyVnB0KHMpKSxuPTA9PT1hfHwwPT09aD97d2lkdGg6MSxoZWlnaHQ6MX06e3dpZHRoOnIud2lkdGgvYSxoZWlnaHQ6ci5oZWlnaHQvaH0se3g6cy54Km4ud2lkdGgseTpzLnkqbi5oZWlnaHR9fSxfY3JlYXRlVXBwZXJDYW52YXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxvd2VyQ2FudmFzRWwuY2xhc3NOYW1lLnJlcGxhY2UoL1xzKmxvd2VyLWNhbnZhc1xzKi8sIiIpO3RoaXMudXBwZXJDYW52YXNFbD10aGlzLl9jcmVhdGVDYW52YXNFbGVtZW50KCksZmFicmljLnV0aWwuYWRkQ2xhc3ModGhpcy51cHBlckNhbnZhc0VsLCJ1cHBlci1jYW52YXMgIit0KSx0aGlzLndyYXBwZXJFbC5hcHBlbmRDaGlsZCh0aGlzLnVwcGVyQ2FudmFzRWwpLHRoaXMuX2NvcHlDYW52YXNTdHlsZSh0aGlzLmxvd2VyQ2FudmFzRWwsdGhpcy51cHBlckNhbnZhc0VsKSx0aGlzLl9hcHBseUNhbnZhc1N0eWxlKHRoaXMudXBwZXJDYW52YXNFbCksdGhpcy5jb250ZXh0VG9wPXRoaXMudXBwZXJDYW52YXNFbC5nZXRDb250ZXh0KCIyZCIpfSxfY3JlYXRlQ2FjaGVDYW52YXM6ZnVuY3Rpb24oKXt0aGlzLmNhY2hlQ2FudmFzRWw9dGhpcy5fY3JlYXRlQ2FudmFzRWxlbWVudCgpLHRoaXMuY2FjaGVDYW52YXNFbC5zZXRBdHRyaWJ1dGUoIndpZHRoIix0aGlzLndpZHRoKSx0aGlzLmNhY2hlQ2FudmFzRWwuc2V0QXR0cmlidXRlKCJoZWlnaHQiLHRoaXMuaGVpZ2h0KSx0aGlzLmNvbnRleHRDYWNoZT10aGlzLmNhY2hlQ2FudmFzRWwuZ2V0Q29udGV4dCgiMmQiKX0sX2luaXRXcmFwcGVyRWxlbWVudDpmdW5jdGlvbigpe3RoaXMud3JhcHBlckVsPWZhYnJpYy51dGlsLndyYXBFbGVtZW50KHRoaXMubG93ZXJDYW52YXNFbCwiZGl2Iix7Y2xhc3M6dGhpcy5jb250YWluZXJDbGFzc30pLGZhYnJpYy51dGlsLnNldFN0eWxlKHRoaXMud3JhcHBlckVsLHt3aWR0aDp0aGlzLmdldFdpZHRoKCkrInB4IixoZWlnaHQ6dGhpcy5nZXRIZWlnaHQoKSsicHgiLHBvc2l0aW9uOiJyZWxhdGl2ZSJ9KSxmYWJyaWMudXRpbC5tYWtlRWxlbWVudFVuc2VsZWN0YWJsZSh0aGlzLndyYXBwZXJFbCl9LF9hcHBseUNhbnZhc1N0eWxlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0V2lkdGgoKXx8dC53aWR0aCxpPXRoaXMuZ2V0SGVpZ2h0KCl8fHQuaGVpZ2h0O2ZhYnJpYy51dGlsLnNldFN0eWxlKHQse3Bvc2l0aW9uOiJhYnNvbHV0ZSIsd2lkdGg6ZSsicHgiLGhlaWdodDppKyJweCIsbGVmdDowLHRvcDowfSksdC53aWR0aD1lLHQuaGVpZ2h0PWksZmFicmljLnV0aWwubWFrZUVsZW1lbnRVbnNlbGVjdGFibGUodCl9LF9jb3B5Q2FudmFzU3R5bGU6ZnVuY3Rpb24odCxlKXtlLnN0eWxlLmNzc1RleHQ9dC5zdHlsZS5jc3NUZXh0fSxnZXRTZWxlY3Rpb25Db250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGV4dFRvcH0sZ2V0U2VsZWN0aW9uRWxlbWVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVwcGVyQ2FudmFzRWx9LF9zZXRBY3RpdmVPYmplY3Q6ZnVuY3Rpb24odCl7dGhpcy5fYWN0aXZlT2JqZWN0JiZ0aGlzLl9hY3RpdmVPYmplY3Quc2V0KCJhY3RpdmUiLCExKSx0aGlzLl9hY3RpdmVPYmplY3Q9dCx0LnNldCgiYWN0aXZlIiwhMCl9LHNldEFjdGl2ZU9iamVjdDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9zZXRBY3RpdmVPYmplY3QodCksdGhpcy5yZW5kZXJBbGwoKSx0aGlzLmZpcmUoIm9iamVjdDpzZWxlY3RlZCIse3RhcmdldDp0LGU6ZX0pLHQuZmlyZSgic2VsZWN0ZWQiLHtlOmV9KSx0aGlzfSxnZXRBY3RpdmVPYmplY3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWN0aXZlT2JqZWN0fSxfb25PYmplY3RSZW1vdmVkOmZ1bmN0aW9uKHQpe3RoaXMuZ2V0QWN0aXZlT2JqZWN0KCk9PT10JiYodGhpcy5maXJlKCJiZWZvcmU6c2VsZWN0aW9uOmNsZWFyZWQiLHt0YXJnZXQ6dH0pLHRoaXMuX2Rpc2NhcmRBY3RpdmVPYmplY3QoKSx0aGlzLmZpcmUoInNlbGVjdGlvbjpjbGVhcmVkIix7dGFyZ2V0OnR9KSx0LmZpcmUoImRlc2VsZWN0ZWQiKSksdGhpcy5jYWxsU3VwZXIoIl9vbk9iamVjdFJlbW92ZWQiLHQpfSxfZGlzY2FyZEFjdGl2ZU9iamVjdDpmdW5jdGlvbigpe3RoaXMuX2FjdGl2ZU9iamVjdCYmdGhpcy5fYWN0aXZlT2JqZWN0LnNldCgiYWN0aXZlIiwhMSksdGhpcy5fYWN0aXZlT2JqZWN0PW51bGx9LGRpc2NhcmRBY3RpdmVPYmplY3Q6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYWN0aXZlT2JqZWN0O3JldHVybiB0aGlzLmZpcmUoImJlZm9yZTpzZWxlY3Rpb246Y2xlYXJlZCIse3RhcmdldDplLGU6dH0pLHRoaXMuX2Rpc2NhcmRBY3RpdmVPYmplY3QoKSx0aGlzLmZpcmUoInNlbGVjdGlvbjpjbGVhcmVkIix7ZTp0fSksZSYmZS5maXJlKCJkZXNlbGVjdGVkIix7ZTp0fSksdGhpc30sX3NldEFjdGl2ZUdyb3VwOmZ1bmN0aW9uKHQpe3RoaXMuX2FjdGl2ZUdyb3VwPXQsdCYmdC5zZXQoImFjdGl2ZSIsITApfSxzZXRBY3RpdmVHcm91cDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9zZXRBY3RpdmVHcm91cCh0KSx0JiYodGhpcy5maXJlKCJvYmplY3Q6c2VsZWN0ZWQiLHt0YXJnZXQ6dCxlOmV9KSx0LmZpcmUoInNlbGVjdGVkIix7ZTplfSkpLHRoaXN9LGdldEFjdGl2ZUdyb3VwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZUdyb3VwfSxfZGlzY2FyZEFjdGl2ZUdyb3VwOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRBY3RpdmVHcm91cCgpO3QmJnQuZGVzdHJveSgpLHRoaXMuc2V0QWN0aXZlR3JvdXAobnVsbCl9LGRpc2NhcmRBY3RpdmVHcm91cDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEFjdGl2ZUdyb3VwKCk7cmV0dXJuIHRoaXMuZmlyZSgiYmVmb3JlOnNlbGVjdGlvbjpjbGVhcmVkIix7ZTp0LHRhcmdldDplfSksdGhpcy5fZGlzY2FyZEFjdGl2ZUdyb3VwKCksdGhpcy5maXJlKCJzZWxlY3Rpb246Y2xlYXJlZCIse2U6dH0pLHRoaXN9LGRlYWN0aXZhdGVBbGw6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5nZXRPYmplY3RzKCksZT0wLGk9dC5sZW5ndGg7ZTxpO2UrKyl0W2VdLnNldCgiYWN0aXZlIiwhMSk7cmV0dXJuIHRoaXMuX2Rpc2NhcmRBY3RpdmVHcm91cCgpLHRoaXMuX2Rpc2NhcmRBY3RpdmVPYmplY3QoKSx0aGlzfSxkZWFjdGl2YXRlQWxsV2l0aERpc3BhdGNoOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0QWN0aXZlR3JvdXAoKSxpPXRoaXMuZ2V0QWN0aXZlT2JqZWN0KCk7cmV0dXJuKGl8fGUpJiZ0aGlzLmZpcmUoImJlZm9yZTpzZWxlY3Rpb246Y2xlYXJlZCIse3RhcmdldDppfHxlLGU6dH0pLHRoaXMuZGVhY3RpdmF0ZUFsbCgpLChpfHxlKSYmKHRoaXMuZmlyZSgic2VsZWN0aW9uOmNsZWFyZWQiLHtlOnQsdGFyZ2V0Oml9KSxpJiZpLmZpcmUoImRlc2VsZWN0ZWQiKSksdGhpc30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuY2FsbFN1cGVyKCJkaXNwb3NlIik7dmFyIHQ9dGhpcy53cmFwcGVyRWw7cmV0dXJuIHRoaXMucmVtb3ZlTGlzdGVuZXJzKCksdC5yZW1vdmVDaGlsZCh0aGlzLnVwcGVyQ2FudmFzRWwpLHQucmVtb3ZlQ2hpbGQodGhpcy5sb3dlckNhbnZhc0VsKSxkZWxldGUgdGhpcy51cHBlckNhbnZhc0VsLHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmxvd2VyQ2FudmFzRWwsdGhpcy53cmFwcGVyRWwpLGRlbGV0ZSB0aGlzLndyYXBwZXJFbCx0aGlzfSxjbGVhcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2NhcmRBY3RpdmVHcm91cCgpLHRoaXMuZGlzY2FyZEFjdGl2ZU9iamVjdCgpLHRoaXMuY2xlYXJDb250ZXh0KHRoaXMuY29udGV4dFRvcCksdGhpcy5jYWxsU3VwZXIoImNsZWFyIil9LGRyYXdDb250cm9sczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEFjdGl2ZUdyb3VwKCk7ZT9lLl9yZW5kZXJDb250cm9scyh0KTp0aGlzLl9kcmF3T2JqZWN0c0NvbnRyb2xzKHQpfSxfZHJhd09iamVjdHNDb250cm9sczpmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxpPXRoaXMuX29iamVjdHMubGVuZ3RoO2U8aTsrK2UpdGhpcy5fb2JqZWN0c1tlXSYmdGhpcy5fb2JqZWN0c1tlXS5hY3RpdmUmJnRoaXMuX29iamVjdHNbZV0uX3JlbmRlckNvbnRyb2xzKHQpfSxfdG9PYmplY3Q6ZnVuY3Rpb24odCxlLGkpe3ZhciByPXRoaXMuX3JlYWxpemVHcm91cFRyYW5zZm9ybU9uT2JqZWN0KHQpLG49dGhpcy5jYWxsU3VwZXIoIl90b09iamVjdCIsdCxlLGkpO3JldHVybiB0aGlzLl91bndpbmRHcm91cFRyYW5zZm9ybU9uT2JqZWN0KHQsciksbn0sX3JlYWxpemVHcm91cFRyYW5zZm9ybU9uT2JqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPVsiYW5nbGUiLCJmbGlwWCIsImZsaXBZIiwiaGVpZ2h0IiwibGVmdCIsInNjYWxlWCIsInNjYWxlWSIsInRvcCIsIndpZHRoIl07aWYodC5ncm91cCYmdC5ncm91cD09PXRoaXMuZ2V0QWN0aXZlR3JvdXAoKSl7dmFyIGk9e307cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihlKXtpW2VdPXRbZV19KSx0aGlzLmdldEFjdGl2ZUdyb3VwKCkucmVhbGl6ZVRyYW5zZm9ybSh0KSxpfXJldHVybiBudWxsfSxfdW53aW5kR3JvdXBUcmFuc2Zvcm1Pbk9iamVjdDpmdW5jdGlvbih0LGUpe2UmJnQuc2V0KGUpfSxfc2V0U1ZHT2JqZWN0OmZ1bmN0aW9uKHQsZSxpKXt2YXIgcjtyPXRoaXMuX3JlYWxpemVHcm91cFRyYW5zZm9ybU9uT2JqZWN0KGUpLHRoaXMuY2FsbFN1cGVyKCJfc2V0U1ZHT2JqZWN0Iix0LGUsaSksdGhpcy5fdW53aW5kR3JvdXBUcmFuc2Zvcm1Pbk9iamVjdChlLHIpfX0pO2Zvcih2YXIgYSBpbiBmYWJyaWMuU3RhdGljQ2FudmFzKSJwcm90b3R5cGUiIT09YSYmKGZhYnJpYy5DYW52YXNbYV09ZmFicmljLlN0YXRpY0NhbnZhc1thXSk7ZmFicmljLmlzVG91Y2hTdXBwb3J0ZWQmJihmYWJyaWMuQ2FudmFzLnByb3RvdHlwZS5fc2V0Q3Vyc29yRnJvbUV2ZW50PWZ1bmN0aW9uKCl7fSksZmFicmljLkVsZW1lbnQ9ZmFicmljLkNhbnZhc30oKSxmdW5jdGlvbigpe3ZhciB0PXttdDowLHRyOjEsbXI6MixicjozLG1iOjQsYmw6NSxtbDo2LHRsOjd9LGU9ZmFicmljLnV0aWwuYWRkTGlzdGVuZXIsaT1mYWJyaWMudXRpbC5yZW1vdmVMaXN0ZW5lcjtmYWJyaWMudXRpbC5vYmplY3QuZXh0ZW5kKGZhYnJpYy5DYW52YXMucHJvdG90eXBlLHtjdXJzb3JNYXA6WyJuLXJlc2l6ZSIsIm5lLXJlc2l6ZSIsImUtcmVzaXplIiwic2UtcmVzaXplIiwicy1yZXNpemUiLCJzdy1yZXNpemUiLCJ3LXJlc2l6ZSIsIm53LXJlc2l6ZSJdLF9pbml0RXZlbnRMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLl9iaW5kRXZlbnRzKCksZShmYWJyaWMud2luZG93LCJyZXNpemUiLHRoaXMuX29uUmVzaXplKSxlKHRoaXMudXBwZXJDYW52YXNFbCwibW91c2Vkb3duIix0aGlzLl9vbk1vdXNlRG93biksZSh0aGlzLnVwcGVyQ2FudmFzRWwsIm1vdXNlbW92ZSIsdGhpcy5fb25Nb3VzZU1vdmUpLGUodGhpcy51cHBlckNhbnZhc0VsLCJtb3VzZW91dCIsdGhpcy5fb25Nb3VzZU91dCksZSh0aGlzLnVwcGVyQ2FudmFzRWwsIndoZWVsIix0aGlzLl9vbk1vdXNlV2hlZWwpLGUodGhpcy51cHBlckNhbnZhc0VsLCJjb250ZXh0bWVudSIsdGhpcy5fb25Db250ZXh0TWVudSksZSh0aGlzLnVwcGVyQ2FudmFzRWwsInRvdWNoc3RhcnQiLHRoaXMuX29uTW91c2VEb3duKSxlKHRoaXMudXBwZXJDYW52YXNFbCwidG91Y2htb3ZlIix0aGlzLl9vbk1vdXNlTW92ZSksInVuZGVmaW5lZCIhPXR5cGVvZiBldmVudGpzJiYiYWRkImluIGV2ZW50anMmJihldmVudGpzLmFkZCh0aGlzLnVwcGVyQ2FudmFzRWwsImdlc3R1cmUiLHRoaXMuX29uR2VzdHVyZSksZXZlbnRqcy5hZGQodGhpcy51cHBlckNhbnZhc0VsLCJkcmFnIix0aGlzLl9vbkRyYWcpLGV2ZW50anMuYWRkKHRoaXMudXBwZXJDYW52YXNFbCwib3JpZW50YXRpb24iLHRoaXMuX29uT3JpZW50YXRpb25DaGFuZ2UpLGV2ZW50anMuYWRkKHRoaXMudXBwZXJDYW52YXNFbCwic2hha2UiLHRoaXMuX29uU2hha2UpLGV2ZW50anMuYWRkKHRoaXMudXBwZXJDYW52YXNFbCwibG9uZ3ByZXNzIix0aGlzLl9vbkxvbmdQcmVzcykpfSxfYmluZEV2ZW50czpmdW5jdGlvbigpe3RoaXMuX29uTW91c2VEb3duPXRoaXMuX29uTW91c2VEb3duLmJpbmQodGhpcyksdGhpcy5fb25Nb3VzZU1vdmU9dGhpcy5fb25Nb3VzZU1vdmUuYmluZCh0aGlzKSx0aGlzLl9vbk1vdXNlVXA9dGhpcy5fb25Nb3VzZVVwLmJpbmQodGhpcyksdGhpcy5fb25SZXNpemU9dGhpcy5fb25SZXNpemUuYmluZCh0aGlzKSx0aGlzLl9vbkdlc3R1cmU9dGhpcy5fb25HZXN0dXJlLmJpbmQodGhpcyksdGhpcy5fb25EcmFnPXRoaXMuX29uRHJhZy5iaW5kKHRoaXMpLAp0aGlzLl9vblNoYWtlPXRoaXMuX29uU2hha2UuYmluZCh0aGlzKSx0aGlzLl9vbkxvbmdQcmVzcz10aGlzLl9vbkxvbmdQcmVzcy5iaW5kKHRoaXMpLHRoaXMuX29uT3JpZW50YXRpb25DaGFuZ2U9dGhpcy5fb25PcmllbnRhdGlvbkNoYW5nZS5iaW5kKHRoaXMpLHRoaXMuX29uTW91c2VXaGVlbD10aGlzLl9vbk1vdXNlV2hlZWwuYmluZCh0aGlzKSx0aGlzLl9vbk1vdXNlT3V0PXRoaXMuX29uTW91c2VPdXQuYmluZCh0aGlzKSx0aGlzLl9vbkNvbnRleHRNZW51PXRoaXMuX29uQ29udGV4dE1lbnUuYmluZCh0aGlzKX0scmVtb3ZlTGlzdGVuZXJzOmZ1bmN0aW9uKCl7aShmYWJyaWMud2luZG93LCJyZXNpemUiLHRoaXMuX29uUmVzaXplKSxpKHRoaXMudXBwZXJDYW52YXNFbCwibW91c2Vkb3duIix0aGlzLl9vbk1vdXNlRG93biksaSh0aGlzLnVwcGVyQ2FudmFzRWwsIm1vdXNlbW92ZSIsdGhpcy5fb25Nb3VzZU1vdmUpLGkodGhpcy51cHBlckNhbnZhc0VsLCJtb3VzZW91dCIsdGhpcy5fb25Nb3VzZU91dCksaSh0aGlzLnVwcGVyQ2FudmFzRWwsIndoZWVsIix0aGlzLl9vbk1vdXNlV2hlZWwpLGkodGhpcy51cHBlckNhbnZhc0VsLCJjb250ZXh0bWVudSIsdGhpcy5fb25Db250ZXh0TWVudSksaSh0aGlzLnVwcGVyQ2FudmFzRWwsInRvdWNoc3RhcnQiLHRoaXMuX29uTW91c2VEb3duKSxpKHRoaXMudXBwZXJDYW52YXNFbCwidG91Y2htb3ZlIix0aGlzLl9vbk1vdXNlTW92ZSksInVuZGVmaW5lZCIhPXR5cGVvZiBldmVudGpzJiYicmVtb3ZlImluIGV2ZW50anMmJihldmVudGpzLnJlbW92ZSh0aGlzLnVwcGVyQ2FudmFzRWwsImdlc3R1cmUiLHRoaXMuX29uR2VzdHVyZSksZXZlbnRqcy5yZW1vdmUodGhpcy51cHBlckNhbnZhc0VsLCJkcmFnIix0aGlzLl9vbkRyYWcpLGV2ZW50anMucmVtb3ZlKHRoaXMudXBwZXJDYW52YXNFbCwib3JpZW50YXRpb24iLHRoaXMuX29uT3JpZW50YXRpb25DaGFuZ2UpLGV2ZW50anMucmVtb3ZlKHRoaXMudXBwZXJDYW52YXNFbCwic2hha2UiLHRoaXMuX29uU2hha2UpLGV2ZW50anMucmVtb3ZlKHRoaXMudXBwZXJDYW52YXNFbCwibG9uZ3ByZXNzIix0aGlzLl9vbkxvbmdQcmVzcykpfSxfb25HZXN0dXJlOmZ1bmN0aW9uKHQsZSl7dGhpcy5fX29uVHJhbnNmb3JtR2VzdHVyZSYmdGhpcy5fX29uVHJhbnNmb3JtR2VzdHVyZSh0LGUpfSxfb25EcmFnOmZ1bmN0aW9uKHQsZSl7dGhpcy5fX29uRHJhZyYmdGhpcy5fX29uRHJhZyh0LGUpfSxfb25Nb3VzZVdoZWVsOmZ1bmN0aW9uKHQpe3RoaXMuX19vbk1vdXNlV2hlZWwodCl9LF9vbk1vdXNlT3V0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2hvdmVyZWRUYXJnZXQ7dGhpcy5maXJlKCJtb3VzZTpvdXQiLHt0YXJnZXQ6ZSxlOnR9KSx0aGlzLl9ob3ZlcmVkVGFyZ2V0PW51bGwsZSYmZS5maXJlKCJtb3VzZW91dCIse2U6dH0pfSxfb25PcmllbnRhdGlvbkNoYW5nZTpmdW5jdGlvbih0LGUpe3RoaXMuX19vbk9yaWVudGF0aW9uQ2hhbmdlJiZ0aGlzLl9fb25PcmllbnRhdGlvbkNoYW5nZSh0LGUpfSxfb25TaGFrZTpmdW5jdGlvbih0LGUpe3RoaXMuX19vblNoYWtlJiZ0aGlzLl9fb25TaGFrZSh0LGUpfSxfb25Mb25nUHJlc3M6ZnVuY3Rpb24odCxlKXt0aGlzLl9fb25Mb25nUHJlc3MmJnRoaXMuX19vbkxvbmdQcmVzcyh0LGUpfSxfb25Db250ZXh0TWVudTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zdG9wQ29udGV4dE1lbnUmJih0LnN0b3BQcm9wYWdhdGlvbigpLHQucHJldmVudERlZmF1bHQoKSksITF9LF9vbk1vdXNlRG93bjpmdW5jdGlvbih0KXt0aGlzLl9fb25Nb3VzZURvd24odCksZShmYWJyaWMuZG9jdW1lbnQsInRvdWNoZW5kIix0aGlzLl9vbk1vdXNlVXApLGUoZmFicmljLmRvY3VtZW50LCJ0b3VjaG1vdmUiLHRoaXMuX29uTW91c2VNb3ZlKSxpKHRoaXMudXBwZXJDYW52YXNFbCwibW91c2Vtb3ZlIix0aGlzLl9vbk1vdXNlTW92ZSksaSh0aGlzLnVwcGVyQ2FudmFzRWwsInRvdWNobW92ZSIsdGhpcy5fb25Nb3VzZU1vdmUpLCJ0b3VjaHN0YXJ0Ij09PXQudHlwZT9pKHRoaXMudXBwZXJDYW52YXNFbCwibW91c2Vkb3duIix0aGlzLl9vbk1vdXNlRG93bik6KGUoZmFicmljLmRvY3VtZW50LCJtb3VzZXVwIix0aGlzLl9vbk1vdXNlVXApLGUoZmFicmljLmRvY3VtZW50LCJtb3VzZW1vdmUiLHRoaXMuX29uTW91c2VNb3ZlKSl9LF9vbk1vdXNlVXA6ZnVuY3Rpb24odCl7aWYodGhpcy5fX29uTW91c2VVcCh0KSxpKGZhYnJpYy5kb2N1bWVudCwibW91c2V1cCIsdGhpcy5fb25Nb3VzZVVwKSxpKGZhYnJpYy5kb2N1bWVudCwidG91Y2hlbmQiLHRoaXMuX29uTW91c2VVcCksaShmYWJyaWMuZG9jdW1lbnQsIm1vdXNlbW92ZSIsdGhpcy5fb25Nb3VzZU1vdmUpLGkoZmFicmljLmRvY3VtZW50LCJ0b3VjaG1vdmUiLHRoaXMuX29uTW91c2VNb3ZlKSxlKHRoaXMudXBwZXJDYW52YXNFbCwibW91c2Vtb3ZlIix0aGlzLl9vbk1vdXNlTW92ZSksZSh0aGlzLnVwcGVyQ2FudmFzRWwsInRvdWNobW92ZSIsdGhpcy5fb25Nb3VzZU1vdmUpLCJ0b3VjaGVuZCI9PT10LnR5cGUpe3ZhciByPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2Uoci51cHBlckNhbnZhc0VsLCJtb3VzZWRvd24iLHIuX29uTW91c2VEb3duKX0sNDAwKX19LF9vbk1vdXNlTW92ZTpmdW5jdGlvbih0KXshdGhpcy5hbGxvd1RvdWNoU2Nyb2xsaW5nJiZ0LnByZXZlbnREZWZhdWx0JiZ0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fX29uTW91c2VNb3ZlKHQpfSxfb25SZXNpemU6ZnVuY3Rpb24oKXt0aGlzLmNhbGNPZmZzZXQoKX0sX3Nob3VsZFJlbmRlcjpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ2V0QWN0aXZlR3JvdXAoKXx8dGhpcy5nZXRBY3RpdmVPYmplY3QoKTtyZXR1cm4hISh0JiYodC5pc01vdmluZ3x8dCE9PWkpfHwhdCYmaXx8IXQmJiFpJiYhdGhpcy5fZ3JvdXBTZWxlY3Rvcnx8ZSYmdGhpcy5fcHJldmlvdXNQb2ludGVyJiZ0aGlzLnNlbGVjdGlvbiYmKGUueCE9PXRoaXMuX3ByZXZpb3VzUG9pbnRlci54fHxlLnkhPT10aGlzLl9wcmV2aW91c1BvaW50ZXIueSkpfSxfX29uTW91c2VVcDpmdW5jdGlvbih0KXt2YXIgZSxpPSEwLHI9dGhpcy5fY3VycmVudFRyYW5zZm9ybSxuPXRoaXMuX2dyb3VwU2VsZWN0b3Iscz0hbnx8MD09PW4ubGVmdCYmMD09PW4udG9wO2lmKHRoaXMuaXNEcmF3aW5nTW9kZSYmdGhpcy5faXNDdXJyZW50bHlEcmF3aW5nKXJldHVybiB2b2lkIHRoaXMuX29uTW91c2VVcEluRHJhd2luZ01vZGUodCk7ciYmKHRoaXMuX2ZpbmFsaXplQ3VycmVudFRyYW5zZm9ybSgpLGk9IXIuYWN0aW9uUGVyZm9ybWVkKSxlPWk/dGhpcy5maW5kVGFyZ2V0KHQsITApOnIudGFyZ2V0O3ZhciBvPXRoaXMuX3Nob3VsZFJlbmRlcihlLHRoaXMuZ2V0UG9pbnRlcih0KSk7ZXx8IXM/dGhpcy5fbWF5YmVHcm91cE9iamVjdHModCk6KHRoaXMuX2dyb3VwU2VsZWN0b3I9bnVsbCx0aGlzLl9jdXJyZW50VHJhbnNmb3JtPW51bGwpLGUmJihlLmlzTW92aW5nPSExKSx0aGlzLl9oYW5kbGVDdXJzb3JBbmRFdmVudCh0LGUsInVwIiksZSYmKGUuX19jb3JuZXI9MCksbyYmdGhpcy5yZW5kZXJBbGwoKX0sX2hhbmRsZUN1cnNvckFuZEV2ZW50OmZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9zZXRDdXJzb3JGcm9tRXZlbnQodCxlKSx0aGlzLl9oYW5kbGVFdmVudCh0LGksZT9lOm51bGwpfSxfaGFuZGxlRXZlbnQ6ZnVuY3Rpb24odCxlLGkpe3ZhciByPXZvaWQgMD09PXR5cGVvZiBpP3RoaXMuZmluZFRhcmdldCh0KTppLG49dGhpcy50YXJnZXRzfHxbXSxzPXtlOnQsdGFyZ2V0OnIsc3ViVGFyZ2V0czpufTt0aGlzLmZpcmUoIm1vdXNlOiIrZSxzKSxyJiZyLmZpcmUoIm1vdXNlIitlLHMpO2Zvcih2YXIgbz0wO288bi5sZW5ndGg7bysrKW5bb10uZmlyZSgibW91c2UiK2Uscyl9LF9maW5hbGl6ZUN1cnJlbnRUcmFuc2Zvcm06ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jdXJyZW50VHJhbnNmb3JtLGU9dC50YXJnZXQ7ZS5fc2NhbGluZyYmKGUuX3NjYWxpbmc9ITEpLGUuc2V0Q29vcmRzKCksdGhpcy5fcmVzdG9yZU9yaWdpblhZKGUpLCh0LmFjdGlvblBlcmZvcm1lZHx8dGhpcy5zdGF0ZWZ1bCYmZS5oYXNTdGF0ZUNoYW5nZWQoKSkmJih0aGlzLmZpcmUoIm9iamVjdDptb2RpZmllZCIse3RhcmdldDplfSksZS5maXJlKCJtb2RpZmllZCIpKX0sX3Jlc3RvcmVPcmlnaW5YWTpmdW5jdGlvbih0KXtpZih0aGlzLl9wcmV2aW91c09yaWdpblgmJnRoaXMuX3ByZXZpb3VzT3JpZ2luWSl7dmFyIGU9dC50cmFuc2xhdGVUb09yaWdpblBvaW50KHQuZ2V0Q2VudGVyUG9pbnQoKSx0aGlzLl9wcmV2aW91c09yaWdpblgsdGhpcy5fcHJldmlvdXNPcmlnaW5ZKTt0Lm9yaWdpblg9dGhpcy5fcHJldmlvdXNPcmlnaW5YLHQub3JpZ2luWT10aGlzLl9wcmV2aW91c09yaWdpblksdC5sZWZ0PWUueCx0LnRvcD1lLnksdGhpcy5fcHJldmlvdXNPcmlnaW5YPW51bGwsdGhpcy5fcHJldmlvdXNPcmlnaW5ZPW51bGx9fSxfb25Nb3VzZURvd25JbkRyYXdpbmdNb2RlOmZ1bmN0aW9uKHQpe3RoaXMuX2lzQ3VycmVudGx5RHJhd2luZz0hMCx0aGlzLmRpc2NhcmRBY3RpdmVPYmplY3QodCkucmVuZGVyQWxsKCksdGhpcy5jbGlwVG8mJmZhYnJpYy51dGlsLmNsaXBDb250ZXh0KHRoaXMsdGhpcy5jb250ZXh0VG9wKTt2YXIgZT10aGlzLmdldFBvaW50ZXIodCk7dGhpcy5mcmVlRHJhd2luZ0JydXNoLm9uTW91c2VEb3duKGUpLHRoaXMuX2hhbmRsZUV2ZW50KHQsImRvd24iKX0sX29uTW91c2VNb3ZlSW5EcmF3aW5nTW9kZTpmdW5jdGlvbih0KXtpZih0aGlzLl9pc0N1cnJlbnRseURyYXdpbmcpe3ZhciBlPXRoaXMuZ2V0UG9pbnRlcih0KTt0aGlzLmZyZWVEcmF3aW5nQnJ1c2gub25Nb3VzZU1vdmUoZSl9dGhpcy5zZXRDdXJzb3IodGhpcy5mcmVlRHJhd2luZ0N1cnNvciksdGhpcy5faGFuZGxlRXZlbnQodCwibW92ZSIpfSxfb25Nb3VzZVVwSW5EcmF3aW5nTW9kZTpmdW5jdGlvbih0KXt0aGlzLl9pc0N1cnJlbnRseURyYXdpbmc9ITEsdGhpcy5jbGlwVG8mJnRoaXMuY29udGV4dFRvcC5yZXN0b3JlKCksdGhpcy5mcmVlRHJhd2luZ0JydXNoLm9uTW91c2VVcCgpLHRoaXMuX2hhbmRsZUV2ZW50KHQsInVwIil9LF9fb25Nb3VzZURvd246ZnVuY3Rpb24odCl7dmFyIGU9IndoaWNoImluIHQ/Mz09PXQud2hpY2g6Mj09PXQuYnV0dG9uO2lmKGUpcmV0dXJuIHZvaWQodGhpcy5maXJlUmlnaHRDbGljayYmdGhpcy5faGFuZGxlRXZlbnQodCwiZG93biIsaT9pOm51bGwpKTtpZih0aGlzLmlzRHJhd2luZ01vZGUpcmV0dXJuIHZvaWQgdGhpcy5fb25Nb3VzZURvd25JbkRyYXdpbmdNb2RlKHQpO2lmKCF0aGlzLl9jdXJyZW50VHJhbnNmb3JtKXt2YXIgaT10aGlzLmZpbmRUYXJnZXQodCkscj10aGlzLmdldFBvaW50ZXIodCwhMCk7dGhpcy5fcHJldmlvdXNQb2ludGVyPXI7dmFyIG49dGhpcy5fc2hvdWxkUmVuZGVyKGkscikscz10aGlzLl9zaG91bGRHcm91cCh0LGkpO3RoaXMuX3Nob3VsZENsZWFyU2VsZWN0aW9uKHQsaSk/dGhpcy5fY2xlYXJTZWxlY3Rpb24odCxpLHIpOnMmJih0aGlzLl9oYW5kbGVHcm91cGluZyh0LGkpLGk9dGhpcy5nZXRBY3RpdmVHcm91cCgpKSxpJiYoIWkuc2VsZWN0YWJsZXx8IWkuX19jb3JuZXImJnN8fCh0aGlzLl9iZWZvcmVUcmFuc2Zvcm0odCxpKSx0aGlzLl9zZXR1cEN1cnJlbnRUcmFuc2Zvcm0odCxpKSksaSE9PXRoaXMuZ2V0QWN0aXZlR3JvdXAoKSYmaSE9PXRoaXMuZ2V0QWN0aXZlT2JqZWN0KCkmJih0aGlzLmRlYWN0aXZhdGVBbGwoKSxpLnNlbGVjdGFibGUmJnRoaXMuc2V0QWN0aXZlT2JqZWN0KGksdCkpKSx0aGlzLl9oYW5kbGVFdmVudCh0LCJkb3duIixpP2k6bnVsbCksbiYmdGhpcy5yZW5kZXJBbGwoKX19LF9iZWZvcmVUcmFuc2Zvcm06ZnVuY3Rpb24odCxlKXt0aGlzLnN0YXRlZnVsJiZlLnNhdmVTdGF0ZSgpLGUuX2ZpbmRUYXJnZXRDb3JuZXIodGhpcy5nZXRQb2ludGVyKHQpKSYmdGhpcy5vbkJlZm9yZVNjYWxlUm90YXRlKGUpfSxfY2xlYXJTZWxlY3Rpb246ZnVuY3Rpb24odCxlLGkpe3RoaXMuZGVhY3RpdmF0ZUFsbFdpdGhEaXNwYXRjaCh0KSxlJiZlLnNlbGVjdGFibGU/dGhpcy5zZXRBY3RpdmVPYmplY3QoZSx0KTp0aGlzLnNlbGVjdGlvbiYmKHRoaXMuX2dyb3VwU2VsZWN0b3I9e2V4OmkueCxleTppLnksdG9wOjAsbGVmdDowfSl9LF9zZXRPcmlnaW5Ub0NlbnRlcjpmdW5jdGlvbih0KXt0aGlzLl9wcmV2aW91c09yaWdpblg9dGhpcy5fY3VycmVudFRyYW5zZm9ybS50YXJnZXQub3JpZ2luWCx0aGlzLl9wcmV2aW91c09yaWdpblk9dGhpcy5fY3VycmVudFRyYW5zZm9ybS50YXJnZXQub3JpZ2luWTt2YXIgZT10LmdldENlbnRlclBvaW50KCk7dC5vcmlnaW5YPSJjZW50ZXIiLHQub3JpZ2luWT0iY2VudGVyIix0LmxlZnQ9ZS54LHQudG9wPWUueSx0aGlzLl9jdXJyZW50VHJhbnNmb3JtLmxlZnQ9dC5sZWZ0LHRoaXMuX2N1cnJlbnRUcmFuc2Zvcm0udG9wPXQudG9wfSxfc2V0Q2VudGVyVG9PcmlnaW46ZnVuY3Rpb24odCl7dmFyIGU9dC50cmFuc2xhdGVUb09yaWdpblBvaW50KHQuZ2V0Q2VudGVyUG9pbnQoKSx0aGlzLl9wcmV2aW91c09yaWdpblgsdGhpcy5fcHJldmlvdXNPcmlnaW5ZKTt0Lm9yaWdpblg9dGhpcy5fcHJldmlvdXNPcmlnaW5YLHQub3JpZ2luWT10aGlzLl9wcmV2aW91c09yaWdpblksdC5sZWZ0PWUueCx0LnRvcD1lLnksdGhpcy5fcHJldmlvdXNPcmlnaW5YPW51bGwsdGhpcy5fcHJldmlvdXNPcmlnaW5ZPW51bGx9LF9fb25Nb3VzZU1vdmU6ZnVuY3Rpb24odCl7dmFyIGUsaTtpZih0aGlzLmlzRHJhd2luZ01vZGUpcmV0dXJuIHZvaWQgdGhpcy5fb25Nb3VzZU1vdmVJbkRyYXdpbmdNb2RlKHQpO2lmKCEoInVuZGVmaW5lZCIhPXR5cGVvZiB0LnRvdWNoZXMmJnQudG91Y2hlcy5sZW5ndGg+MSkpe3ZhciByPXRoaXMuX2dyb3VwU2VsZWN0b3I7cj8oaT10aGlzLmdldFBvaW50ZXIodCwhMCksci5sZWZ0PWkueC1yLmV4LHIudG9wPWkueS1yLmV5LHRoaXMucmVuZGVyVG9wKCkpOnRoaXMuX2N1cnJlbnRUcmFuc2Zvcm0/dGhpcy5fdHJhbnNmb3JtT2JqZWN0KHQpOihlPXRoaXMuZmluZFRhcmdldCh0KSx0aGlzLl9zZXRDdXJzb3JGcm9tRXZlbnQodCxlKSksdGhpcy5faGFuZGxlRXZlbnQodCwibW92ZSIsZT9lOm51bGwpfX0sX19vbk1vdXNlV2hlZWw6ZnVuY3Rpb24odCl7dGhpcy5maXJlKCJtb3VzZTp3aGVlbCIse2U6dH0pfSxfdHJhbnNmb3JtT2JqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0UG9pbnRlcih0KSxpPXRoaXMuX2N1cnJlbnRUcmFuc2Zvcm07aS5yZXNldD0hMSxpLnRhcmdldC5pc01vdmluZz0hMCx0aGlzLl9iZWZvcmVTY2FsZVRyYW5zZm9ybSh0LGkpLHRoaXMuX3BlcmZvcm1UcmFuc2Zvcm1BY3Rpb24odCxpLGUpLGkuYWN0aW9uUGVyZm9ybWVkJiZ0aGlzLnJlbmRlckFsbCgpfSxfcGVyZm9ybVRyYW5zZm9ybUFjdGlvbjpmdW5jdGlvbih0LGUsaSl7dmFyIHI9aS54LG49aS55LHM9ZS50YXJnZXQsbz1lLmFjdGlvbixhPSExOyJyb3RhdGUiPT09bz8oYT10aGlzLl9yb3RhdGVPYmplY3QocixuKSkmJnRoaXMuX2ZpcmUoInJvdGF0aW5nIixzLHQpOiJzY2FsZSI9PT1vPyhhPXRoaXMuX29uU2NhbGUodCxlLHIsbikpJiZ0aGlzLl9maXJlKCJzY2FsaW5nIixzLHQpOiJzY2FsZVgiPT09bz8oYT10aGlzLl9zY2FsZU9iamVjdChyLG4sIngiKSkmJnRoaXMuX2ZpcmUoInNjYWxpbmciLHMsdCk6InNjYWxlWSI9PT1vPyhhPXRoaXMuX3NjYWxlT2JqZWN0KHIsbiwieSIpKSYmdGhpcy5fZmlyZSgic2NhbGluZyIscyx0KToic2tld1giPT09bz8oYT10aGlzLl9za2V3T2JqZWN0KHIsbiwieCIpKSYmdGhpcy5fZmlyZSgic2tld2luZyIscyx0KToic2tld1kiPT09bz8oYT10aGlzLl9za2V3T2JqZWN0KHIsbiwieSIpKSYmdGhpcy5fZmlyZSgic2tld2luZyIscyx0KTooYT10aGlzLl90cmFuc2xhdGVPYmplY3QocixuKSxhJiYodGhpcy5fZmlyZSgibW92aW5nIixzLHQpLHRoaXMuc2V0Q3Vyc29yKHMubW92ZUN1cnNvcnx8dGhpcy5tb3ZlQ3Vyc29yKSkpLGUuYWN0aW9uUGVyZm9ybWVkPWF9LF9maXJlOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLmZpcmUoIm9iamVjdDoiK3Qse3RhcmdldDplLGU6aX0pLGUuZmlyZSh0LHtlOml9KX0sX2JlZm9yZVNjYWxlVHJhbnNmb3JtOmZ1bmN0aW9uKHQsZSl7aWYoInNjYWxlIj09PWUuYWN0aW9ufHwic2NhbGVYIj09PWUuYWN0aW9ufHwic2NhbGVZIj09PWUuYWN0aW9uKXt2YXIgaT10aGlzLl9zaG91bGRDZW50ZXJUcmFuc2Zvcm0oZS50YXJnZXQpOyhpJiYoImNlbnRlciIhPT1lLm9yaWdpblh8fCJjZW50ZXIiIT09ZS5vcmlnaW5ZKXx8IWkmJiJjZW50ZXIiPT09ZS5vcmlnaW5YJiYiY2VudGVyIj09PWUub3JpZ2luWSkmJih0aGlzLl9yZXNldEN1cnJlbnRUcmFuc2Zvcm0oKSxlLnJlc2V0PSEwKX19LF9vblNjYWxlOmZ1bmN0aW9uKHQsZSxpLHIpe3JldHVybiF0W3RoaXMudW5pU2NhbGVLZXldJiYhdGhpcy51bmlTY2FsZVRyYW5zZm9ybXx8ZS50YXJnZXQuZ2V0KCJsb2NrVW5pU2NhbGluZyIpPyhlLnJlc2V0fHwic2NhbGUiIT09ZS5jdXJyZW50QWN0aW9ufHx0aGlzLl9yZXNldEN1cnJlbnRUcmFuc2Zvcm0oKSxlLmN1cnJlbnRBY3Rpb249InNjYWxlRXF1YWxseSIsdGhpcy5fc2NhbGVPYmplY3QoaSxyLCJlcXVhbGx5IikpOihlLmN1cnJlbnRBY3Rpb249InNjYWxlIix0aGlzLl9zY2FsZU9iamVjdChpLHIpKX0sX3NldEN1cnNvckZyb21FdmVudDpmdW5jdGlvbih0LGUpe2lmKCFlKXJldHVybiB0aGlzLnNldEN1cnNvcih0aGlzLmRlZmF1bHRDdXJzb3IpLCExO3ZhciBpPWUuaG92ZXJDdXJzb3J8fHRoaXMuaG92ZXJDdXJzb3I7aWYoZS5zZWxlY3RhYmxlKXt2YXIgcj10aGlzLmdldEFjdGl2ZUdyb3VwKCksbj1lLl9maW5kVGFyZ2V0Q29ybmVyJiYoIXJ8fCFyLmNvbnRhaW5zKGUpKSYmZS5fZmluZFRhcmdldENvcm5lcih0aGlzLmdldFBvaW50ZXIodCwhMCkpO24/dGhpcy5fc2V0Q29ybmVyQ3Vyc29yKG4sZSx0KTp0aGlzLnNldEN1cnNvcihpKX1lbHNlIHRoaXMuc2V0Q3Vyc29yKGkpO3JldHVybiEwfSxfc2V0Q29ybmVyQ3Vyc29yOmZ1bmN0aW9uKGUsaSxyKXtpZihlIGluIHQpdGhpcy5zZXRDdXJzb3IodGhpcy5fZ2V0Um90YXRlZENvcm5lckN1cnNvcihlLGkscikpO2Vsc2V7aWYoIm10ciIhPT1lfHwhaS5oYXNSb3RhdGluZ1BvaW50KXJldHVybiB0aGlzLnNldEN1cnNvcih0aGlzLmRlZmF1bHRDdXJzb3IpLCExO3RoaXMuc2V0Q3Vyc29yKHRoaXMucm90YXRpb25DdXJzb3IpfX0sX2dldFJvdGF0ZWRDb3JuZXJDdXJzb3I6ZnVuY3Rpb24oZSxpLHIpe3ZhciBuPU1hdGgucm91bmQoaS5nZXRBbmdsZSgpJTM2MC80NSk7cmV0dXJuIG48MCYmKG4rPTgpLG4rPXRbZV0sclt0aGlzLmFsdEFjdGlvbktleV0mJnRbZV0lMj09PTAmJihuKz0yKSxuJT04LHRoaXMuY3Vyc29yTWFwW25dfX0pfSgpLGZ1bmN0aW9uKCl7dmFyIHQ9TWF0aC5taW4sZT1NYXRoLm1heDtmYWJyaWMudXRpbC5vYmplY3QuZXh0ZW5kKGZhYnJpYy5DYW52YXMucHJvdG90eXBlLHtfc2hvdWxkR3JvdXA6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldEFjdGl2ZU9iamVjdCgpO3JldHVybiB0W3RoaXMuc2VsZWN0aW9uS2V5XSYmZSYmZS5zZWxlY3RhYmxlJiYodGhpcy5nZXRBY3RpdmVHcm91cCgpfHxpJiZpIT09ZSkmJnRoaXMuc2VsZWN0aW9ufSxfaGFuZGxlR3JvdXBpbmc6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldEFjdGl2ZUdyb3VwKCk7KGUhPT1pfHwoZT10aGlzLmZpbmRUYXJnZXQodCwhMCkpKSYmKGk/dGhpcy5fdXBkYXRlQWN0aXZlR3JvdXAoZSx0KTp0aGlzLl9jcmVhdGVBY3RpdmVHcm91cChlLHQpLHRoaXMuX2FjdGl2ZUdyb3VwJiZ0aGlzLl9hY3RpdmVHcm91cC5zYXZlQ29vcmRzKCkpfSxfdXBkYXRlQWN0aXZlR3JvdXA6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldEFjdGl2ZUdyb3VwKCk7aWYoaS5jb250YWlucyh0KSl7aWYoaS5yZW1vdmVXaXRoVXBkYXRlKHQpLHQuc2V0KCJhY3RpdmUiLCExKSwxPT09aS5zaXplKCkpcmV0dXJuIHRoaXMuZGlzY2FyZEFjdGl2ZUdyb3VwKGUpLHZvaWQgdGhpcy5zZXRBY3RpdmVPYmplY3QoaS5pdGVtKDApKX1lbHNlIGkuYWRkV2l0aFVwZGF0ZSh0KTt0aGlzLmZpcmUoInNlbGVjdGlvbjpjcmVhdGVkIix7dGFyZ2V0OmksZTplfSksaS5zZXQoImFjdGl2ZSIsITApfSxfY3JlYXRlQWN0aXZlR3JvdXA6ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9hY3RpdmVPYmplY3QmJnQhPT10aGlzLl9hY3RpdmVPYmplY3Qpe3ZhciBpPXRoaXMuX2NyZWF0ZUdyb3VwKHQpO2kuYWRkV2l0aFVwZGF0ZSgpLHRoaXMuc2V0QWN0aXZlR3JvdXAoaSksdGhpcy5fYWN0aXZlT2JqZWN0PW51bGwsdGhpcy5maXJlKCJzZWxlY3Rpb246Y3JlYXRlZCIse3RhcmdldDppLGU6ZX0pfXQuc2V0KCJhY3RpdmUiLCEwKX0sX2NyZWF0ZUdyb3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0T2JqZWN0cygpLGk9ZS5pbmRleE9mKHRoaXMuX2FjdGl2ZU9iamVjdCk8ZS5pbmRleE9mKHQpLHI9aT9bdGhpcy5fYWN0aXZlT2JqZWN0LHRdOlt0LHRoaXMuX2FjdGl2ZU9iamVjdF07cmV0dXJuIHRoaXMuX2FjdGl2ZU9iamVjdC5pc0VkaXRpbmcmJnRoaXMuX2FjdGl2ZU9iamVjdC5leGl0RWRpdGluZygpLG5ldyBmYWJyaWMuR3JvdXAocix7Y2FudmFzOnRoaXN9KX0sX2dyb3VwU2VsZWN0ZWRPYmplY3RzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NvbGxlY3RPYmplY3RzKCk7MT09PWUubGVuZ3RoP3RoaXMuc2V0QWN0aXZlT2JqZWN0KGVbMF0sdCk6ZS5sZW5ndGg+MSYmKGU9bmV3IGZhYnJpYy5Hcm91cChlLnJldmVyc2UoKSx7Y2FudmFzOnRoaXN9KSxlLmFkZFdpdGhVcGRhdGUoKSx0aGlzLnNldEFjdGl2ZUdyb3VwKGUsdCksZS5zYXZlQ29vcmRzKCksdGhpcy5maXJlKCJzZWxlY3Rpb246Y3JlYXRlZCIse3RhcmdldDplfSksdGhpcy5yZW5kZXJBbGwoKSl9LF9jb2xsZWN0T2JqZWN0czpmdW5jdGlvbigpe2Zvcih2YXIgaSxyPVtdLG49dGhpcy5fZ3JvdXBTZWxlY3Rvci5leCxzPXRoaXMuX2dyb3VwU2VsZWN0b3IuZXksbz1uK3RoaXMuX2dyb3VwU2VsZWN0b3IubGVmdCxhPXMrdGhpcy5fZ3JvdXBTZWxlY3Rvci50b3AsaD1uZXcgZmFicmljLlBvaW50KHQobixvKSx0KHMsYSkpLGM9bmV3IGZhYnJpYy5Qb2ludChlKG4sbyksZShzLGEpKSxsPW49PT1vJiZzPT09YSx1PXRoaXMuX29iamVjdHMubGVuZ3RoO3UtLSYmKGk9dGhpcy5fb2JqZWN0c1t1XSwhKGkmJmkuc2VsZWN0YWJsZSYmaS52aXNpYmxlJiYoaS5pbnRlcnNlY3RzV2l0aFJlY3QoaCxjKXx8aS5pc0NvbnRhaW5lZFdpdGhpblJlY3QoaCxjKXx8aS5jb250YWluc1BvaW50KGgpfHxpLmNvbnRhaW5zUG9pbnQoYykpJiYoaS5zZXQoImFjdGl2ZSIsITApLHIucHVzaChpKSxsKSkpOyk7cmV0dXJuIHJ9LF9tYXliZUdyb3VwT2JqZWN0czpmdW5jdGlvbih0KXt0aGlzLnNlbGVjdGlvbiYmdGhpcy5fZ3JvdXBTZWxlY3RvciYmdGhpcy5fZ3JvdXBTZWxlY3RlZE9iamVjdHModCk7dmFyIGU9dGhpcy5nZXRBY3RpdmVHcm91cCgpO2UmJihlLnNldE9iamVjdHNDb29yZHMoKS5zZXRDb29yZHMoKSxlLmlzTW92aW5nPSExLHRoaXMuc2V0Q3Vyc29yKHRoaXMuZGVmYXVsdEN1cnNvcikpLHRoaXMuX2dyb3VwU2VsZWN0b3I9bnVsbCx0aGlzLl9jdXJyZW50VHJhbnNmb3JtPW51bGx9fSl9KCksZnVuY3Rpb24oKXt2YXIgdD1mYWJyaWMuU3RhdGljQ2FudmFzLnN1cHBvcnRzKCJ0b0RhdGFVUkxXaXRoUXVhbGl0eSIpO2ZhYnJpYy51dGlsLm9iamVjdC5leHRlbmQoZmFicmljLlN0YXRpY0NhbnZhcy5wcm90b3R5cGUse3RvRGF0YVVSTDpmdW5jdGlvbih0KXt0fHwodD17fSk7dmFyIGU9dC5mb3JtYXR8fCJwbmciLGk9dC5xdWFsaXR5fHwxLHI9dC5tdWx0aXBsaWVyfHwxLG49e2xlZnQ6dC5sZWZ0fHwwLHRvcDp0LnRvcHx8MCx3aWR0aDp0LndpZHRofHwwLGhlaWdodDp0LmhlaWdodHx8MH07cmV0dXJuIHRoaXMuX190b0RhdGFVUkxXaXRoTXVsdGlwbGllcihlLGksbixyKX0sX190b0RhdGFVUkxXaXRoTXVsdGlwbGllcjpmdW5jdGlvbih0LGUsaSxyKXt2YXIgbj10aGlzLmdldFdpZHRoKCkscz10aGlzLmdldEhlaWdodCgpLG89KGkud2lkdGh8fHRoaXMuZ2V0V2lkdGgoKSkqcixhPShpLmhlaWdodHx8dGhpcy5nZXRIZWlnaHQoKSkqcixoPXRoaXMuZ2V0Wm9vbSgpLGM9aCpyLGw9dGhpcy52aWV3cG9ydFRyYW5zZm9ybSx1PShsWzRdLWkubGVmdCkqcixmPShsWzVdLWkudG9wKSpyLGQ9W2MsMCwwLGMsdSxmXSxnPXRoaXMuaW50ZXJhY3RpdmU7dGhpcy52aWV3cG9ydFRyYW5zZm9ybT1kLHRoaXMuaW50ZXJhY3RpdmUmJih0aGlzLmludGVyYWN0aXZlPSExKSxuIT09b3x8cyE9PWE/dGhpcy5zZXREaW1lbnNpb25zKHt3aWR0aDpvLGhlaWdodDphfSk6dGhpcy5yZW5kZXJBbGwoKTt2YXIgcD10aGlzLl9fdG9EYXRhVVJMKHQsZSxpKTtyZXR1cm4gZyYmKHRoaXMuaW50ZXJhY3RpdmU9ZyksdGhpcy52aWV3cG9ydFRyYW5zZm9ybT1sLHRoaXMuc2V0RGltZW5zaW9ucyh7d2lkdGg6bixoZWlnaHQ6c30pLHB9LF9fdG9EYXRhVVJMOmZ1bmN0aW9uKGUsaSl7dmFyIHI9dGhpcy5jb250ZXh0Q29udGFpbmVyLmNhbnZhczsianBnIj09PWUmJihlPSJqcGVnIik7dmFyIG49dD9yLnRvRGF0YVVSTCgiaW1hZ2UvIitlLGkpOnIudG9EYXRhVVJMKCJpbWFnZS8iK2UpO3JldHVybiBufSx0b0RhdGFVUkxXaXRoTXVsdGlwbGllcjpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRoaXMudG9EYXRhVVJMKHtmb3JtYXQ6dCxtdWx0aXBsaWVyOmUscXVhbGl0eTppfSl9fSl9KCksZmFicmljLnV0aWwub2JqZWN0LmV4dGVuZChmYWJyaWMuU3RhdGljQ2FudmFzLnByb3RvdHlwZSx7bG9hZEZyb21EYXRhbGVzc0pTT046ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLmxvYWRGcm9tSlNPTih0LGUsaSl9LGxvYWRGcm9tSlNPTjpmdW5jdGlvbih0LGUsaSl7aWYodCl7dmFyIHI9InN0cmluZyI9PXR5cGVvZiB0P0pTT04ucGFyc2UodCk6ZmFicmljLnV0aWwub2JqZWN0LmNsb25lKHQpO3RoaXMuY2xlYXIoKTt2YXIgbj10aGlzO3JldHVybiB0aGlzLl9lbmxpdmVuT2JqZWN0cyhyLm9iamVjdHMsZnVuY3Rpb24oKXtuLl9zZXRCZ092ZXJsYXkocixmdW5jdGlvbigpe2RlbGV0ZSByLm9iamVjdHMsZGVsZXRlIHIuYmFja2dyb3VuZEltYWdlLGRlbGV0ZSByLm92ZXJsYXlJbWFnZSxkZWxldGUgci5iYWNrZ3JvdW5kLGRlbGV0ZSByLm92ZXJsYXk7Zm9yKHZhciB0IGluIHIpblt0XT1yW3RdO2UmJmUoKX0pfSxpKSx0aGlzfX0sX3NldEJnT3ZlcmxheTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMscj17YmFja2dyb3VuZENvbG9yOiExLG92ZXJsYXlDb2xvcjohMSxiYWNrZ3JvdW5kSW1hZ2U6ITEsb3ZlcmxheUltYWdlOiExfTtpZighKHQuYmFja2dyb3VuZEltYWdlfHx0Lm92ZXJsYXlJbWFnZXx8dC5iYWNrZ3JvdW5kfHx0Lm92ZXJsYXkpKXJldHVybiB2b2lkKGUmJmUoKSk7dmFyIG49ZnVuY3Rpb24oKXtyLmJhY2tncm91bmRJbWFnZSYmci5vdmVybGF5SW1hZ2UmJnIuYmFja2dyb3VuZENvbG9yJiZyLm92ZXJsYXlDb2xvciYmKGkucmVuZGVyQWxsKCksZSYmZSgpKX07dGhpcy5fX3NldEJnT3ZlcmxheSgiYmFja2dyb3VuZEltYWdlIix0LmJhY2tncm91bmRJbWFnZSxyLG4pLHRoaXMuX19zZXRCZ092ZXJsYXkoIm92ZXJsYXlJbWFnZSIsdC5vdmVybGF5SW1hZ2UscixuKSx0aGlzLl9fc2V0QmdPdmVybGF5KCJiYWNrZ3JvdW5kQ29sb3IiLHQuYmFja2dyb3VuZCxyLG4pLHRoaXMuX19zZXRCZ092ZXJsYXkoIm92ZXJsYXlDb2xvciIsdC5vdmVybGF5LHIsbiksbigpfSxfX3NldEJnT3ZlcmxheTpmdW5jdGlvbih0LGUsaSxyKXt2YXIgbj10aGlzO3JldHVybiBlP3ZvaWQoImJhY2tncm91bmRJbWFnZSI9PT10fHwib3ZlcmxheUltYWdlIj09PXQ/ZmFicmljLkltYWdlLmZyb21PYmplY3QoZSxmdW5jdGlvbihlKXtuW3RdPWUsaVt0XT0hMCxyJiZyKCl9KTp0aGlzWyJzZXQiK2ZhYnJpYy51dGlsLnN0cmluZy5jYXBpdGFsaXplKHQsITApXShlLGZ1bmN0aW9uKCl7aVt0XT0hMCxyJiZyKCl9KSk6dm9pZChpW3RdPSEwKX0sX2VubGl2ZW5PYmplY3RzOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzO2lmKCF0fHwwPT09dC5sZW5ndGgpcmV0dXJuIHZvaWQoZSYmZSgpKTt2YXIgbj10aGlzLnJlbmRlck9uQWRkUmVtb3ZlO3RoaXMucmVuZGVyT25BZGRSZW1vdmU9ITEsZmFicmljLnV0aWwuZW5saXZlbk9iamVjdHModCxmdW5jdGlvbih0KXt0LmZvckVhY2goZnVuY3Rpb24odCxlKXtyLmluc2VydEF0KHQsZSl9KSxyLnJlbmRlck9uQWRkUmVtb3ZlPW4sZSYmZSgpfSxudWxsLGkpfSxfdG9EYXRhVVJMOmZ1bmN0aW9uKHQsZSl7dGhpcy5jbG9uZShmdW5jdGlvbihpKXtlKGkudG9EYXRhVVJMKHQpKX0pfSxfdG9EYXRhVVJMV2l0aE11bHRpcGxpZXI6ZnVuY3Rpb24odCxlLGkpe3RoaXMuY2xvbmUoZnVuY3Rpb24ocil7aShyLnRvRGF0YVVSTFdpdGhNdWx0aXBsaWVyKHQsZSkpfSl9LGNsb25lOmZ1bmN0aW9uKHQsZSl7dmFyIGk9SlNPTi5zdHJpbmdpZnkodGhpcy50b0pTT04oZSkpO3RoaXMuY2xvbmVXaXRob3V0RGF0YShmdW5jdGlvbihlKXtlLmxvYWRGcm9tSlNPTihpLGZ1bmN0aW9uKCl7dCYmdChlKX0pfSl9LGNsb25lV2l0aG91dERhdGE6ZnVuY3Rpb24odCl7dmFyIGU9ZmFicmljLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO2Uud2lkdGg9dGhpcy5nZXRXaWR0aCgpLGUuaGVpZ2h0PXRoaXMuZ2V0SGVpZ2h0KCk7dmFyIGk9bmV3IGZhYnJpYy5DYW52YXMoZSk7aS5jbGlwVG89dGhpcy5jbGlwVG8sdGhpcy5iYWNrZ3JvdW5kSW1hZ2U/KGkuc2V0QmFja2dyb3VuZEltYWdlKHRoaXMuYmFja2dyb3VuZEltYWdlLnNyYyxmdW5jdGlvbigpe2kucmVuZGVyQWxsKCksdCYmdChpKX0pLGkuYmFja2dyb3VuZEltYWdlT3BhY2l0eT10aGlzLmJhY2tncm91bmRJbWFnZU9wYWNpdHksaS5iYWNrZ3JvdW5kSW1hZ2VTdHJldGNoPXRoaXMuYmFja2dyb3VuZEltYWdlU3RyZXRjaCk6dCYmdChpKX19KSxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGU9dC5mYWJyaWN8fCh0LmZhYnJpYz17fSksaT1lLnV0aWwub2JqZWN0LmV4dGVuZCxyPWUudXRpbC50b0ZpeGVkLG49ZS51dGlsLnN0cmluZy5jYXBpdGFsaXplLHM9ZS51dGlsLmRlZ3JlZXNUb1JhZGlhbnMsbz1lLlN0YXRpY0NhbnZhcy5zdXBwb3J0cygic2V0TGluZURhc2giKTtlLk9iamVjdHx8KGUuT2JqZWN0PWUudXRpbC5jcmVhdGVDbGFzcyh7dHlwZToib2JqZWN0IixvcmlnaW5YOiJsZWZ0IixvcmlnaW5ZOiJ0b3AiLHRvcDowLGxlZnQ6MCx3aWR0aDowLGhlaWdodDowLHNjYWxlWDoxLHNjYWxlWToxLGZsaXBYOiExLGZsaXBZOiExLG9wYWNpdHk6MSxhbmdsZTowLHNrZXdYOjAsc2tld1k6MCxjb3JuZXJTaXplOjEzLHRyYW5zcGFyZW50Q29ybmVyczohMCxob3ZlckN1cnNvcjpudWxsLG1vdmVDdXJzb3I6bnVsbCxwYWRkaW5nOjAsYm9yZGVyQ29sb3I6InJnYmEoMTAyLDE1MywyNTUsMC43NSkiLGJvcmRlckRhc2hBcnJheTpudWxsLGNvcm5lckNvbG9yOiJyZ2JhKDEwMiwxNTMsMjU1LDAuNSkiLGNvcm5lclN0cm9rZUNvbG9yOm51bGwsY29ybmVyU3R5bGU6InJlY3QiLGNvcm5lckRhc2hBcnJheTpudWxsLGNlbnRlcmVkU2NhbGluZzohMSxjZW50ZXJlZFJvdGF0aW9uOiEwLGZpbGw6InJnYigwLDAsMCkiLGZpbGxSdWxlOiJub256ZXJvIixnbG9iYWxDb21wb3NpdGVPcGVyYXRpb246InNvdXJjZS1vdmVyIixiYWNrZ3JvdW5kQ29sb3I6IiIsc2VsZWN0aW9uQmFja2dyb3VuZENvbG9yOiIiLHN0cm9rZTpudWxsLHN0cm9rZVdpZHRoOjEsc3Ryb2tlRGFzaEFycmF5Om51bGwsc3Ryb2tlTGluZUNhcDoiYnV0dCIsc3Ryb2tlTGluZUpvaW46Im1pdGVyIixzdHJva2VNaXRlckxpbWl0OjEwLHNoYWRvdzpudWxsLGJvcmRlck9wYWNpdHlXaGVuTW92aW5nOi40LGJvcmRlclNjYWxlRmFjdG9yOjEsdHJhbnNmb3JtTWF0cml4Om51bGwsbWluU2NhbGVMaW1pdDouMDEsc2VsZWN0YWJsZTohMCxldmVudGVkOiEwLHZpc2libGU6ITAsaGFzQ29udHJvbHM6ITAsaGFzQm9yZGVyczohMCxoYXNSb3RhdGluZ1BvaW50OiEwLHJvdGF0aW5nUG9pbnRPZmZzZXQ6NDAscGVyUGl4ZWxUYXJnZXRGaW5kOiExLGluY2x1ZGVEZWZhdWx0VmFsdWVzOiEwLGNsaXBUbzpudWxsLGxvY2tNb3ZlbWVudFg6ITEsbG9ja01vdmVtZW50WTohMSxsb2NrUm90YXRpb246ITEsbG9ja1NjYWxpbmdYOiExLGxvY2tTY2FsaW5nWTohMSxsb2NrVW5pU2NhbGluZzohMSxsb2NrU2tld2luZ1g6ITEsbG9ja1NrZXdpbmdZOiExLGxvY2tTY2FsaW5nRmxpcDohMSxleGNsdWRlRnJvbUV4cG9ydDohMSxzdGF0ZVByb3BlcnRpZXM6InRvcCBsZWZ0IHdpZHRoIGhlaWdodCBzY2FsZVggc2NhbGVZIGZsaXBYIGZsaXBZIG9yaWdpblggb3JpZ2luWSB0cmFuc2Zvcm1NYXRyaXggc3Ryb2tlIHN0cm9rZVdpZHRoIHN0cm9rZURhc2hBcnJheSBzdHJva2VMaW5lQ2FwIHN0cm9rZUxpbmVKb2luIHN0cm9rZU1pdGVyTGltaXQgYW5nbGUgb3BhY2l0eSBmaWxsIGZpbGxSdWxlIGdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiBzaGFkb3cgY2xpcFRvIHZpc2libGUgYmFja2dyb3VuZENvbG9yIHNrZXdYIHNrZXdZIi5zcGxpdCgiICIpLGluaXRpYWxpemU6ZnVuY3Rpb24odCl7dCYmdGhpcy5zZXRPcHRpb25zKHQpfSxfaW5pdEdyYWRpZW50OmZ1bmN0aW9uKHQpeyF0LmZpbGx8fCF0LmZpbGwuY29sb3JTdG9wc3x8dC5maWxsIGluc3RhbmNlb2YgZS5HcmFkaWVudHx8dGhpcy5zZXQoImZpbGwiLG5ldyBlLkdyYWRpZW50KHQuZmlsbCkpLCF0LnN0cm9rZXx8IXQuc3Ryb2tlLmNvbG9yU3RvcHN8fHQuc3Ryb2tlIGluc3RhbmNlb2YgZS5HcmFkaWVudHx8dGhpcy5zZXQoInN0cm9rZSIsbmV3IGUuR3JhZGllbnQodC5zdHJva2UpKX0sX2luaXRQYXR0ZXJuOmZ1bmN0aW9uKHQpeyF0LmZpbGx8fCF0LmZpbGwuc291cmNlfHx0LmZpbGwgaW5zdGFuY2VvZiBlLlBhdHRlcm58fHRoaXMuc2V0KCJmaWxsIixuZXcgZS5QYXR0ZXJuKHQuZmlsbCkpLCF0LnN0cm9rZXx8IXQuc3Ryb2tlLnNvdXJjZXx8dC5zdHJva2UgaW5zdGFuY2VvZiBlLlBhdHRlcm58fHRoaXMuc2V0KCJzdHJva2UiLG5ldyBlLlBhdHRlcm4odC5zdHJva2UpKX0sX2luaXRDbGlwcGluZzpmdW5jdGlvbih0KXtpZih0LmNsaXBUbyYmInN0cmluZyI9PXR5cGVvZiB0LmNsaXBUbyl7dmFyIGk9ZS51dGlsLmdldEZ1bmN0aW9uQm9keSh0LmNsaXBUbyk7InVuZGVmaW5lZCIhPXR5cGVvZiBpJiYodGhpcy5jbGlwVG89bmV3IEZ1bmN0aW9uKCJjdHgiLGkpKX19LHNldE9wdGlvbnM6ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHQpdGhpcy5zZXQoZSx0W2VdKTt0aGlzLl9pbml0R3JhZGllbnQodCksdGhpcy5faW5pdFBhdHRlcm4odCksdGhpcy5faW5pdENsaXBwaW5nKHQpfSx0cmFuc2Zvcm06ZnVuY3Rpb24odCxlKXt0aGlzLmdyb3VwJiYhdGhpcy5ncm91cC5fdHJhbnNmb3JtRG9uZSYmdGhpcy5ncm91cD09PXRoaXMuY2FudmFzLl9hY3RpdmVHcm91cCYmdGhpcy5ncm91cC50cmFuc2Zvcm0odCk7dmFyIGk9ZT90aGlzLl9nZXRMZWZ0VG9wQ29vcmRzKCk6dGhpcy5nZXRDZW50ZXJQb2ludCgpO3QudHJhbnNsYXRlKGkueCxpLnkpLHQucm90YXRlKHModGhpcy5hbmdsZSkpLHQuc2NhbGUodGhpcy5zY2FsZVgqKHRoaXMuZmxpcFg/LTE6MSksdGhpcy5zY2FsZVkqKHRoaXMuZmxpcFk/LTE6MSkpLHQudHJhbnNmb3JtKDEsMCxNYXRoLnRhbihzKHRoaXMuc2tld1gpKSwxLDAsMCksdC50cmFuc2Zvcm0oMSxNYXRoLnRhbihzKHRoaXMuc2tld1kpKSwwLDEsMCwwKX0sdG9PYmplY3Q6ZnVuY3Rpb24odCl7dmFyIGk9ZS5PYmplY3QuTlVNX0ZSQUNUSU9OX0RJR0lUUyxuPXt0eXBlOnRoaXMudHlwZSxvcmlnaW5YOnRoaXMub3JpZ2luWCxvcmlnaW5ZOnRoaXMub3JpZ2luWSxsZWZ0OnIodGhpcy5sZWZ0LGkpLHRvcDpyKHRoaXMudG9wLGkpLHdpZHRoOnIodGhpcy53aWR0aCxpKSxoZWlnaHQ6cih0aGlzLmhlaWdodCxpKSxmaWxsOnRoaXMuZmlsbCYmdGhpcy5maWxsLnRvT2JqZWN0P3RoaXMuZmlsbC50b09iamVjdCgpOnRoaXMuZmlsbCxzdHJva2U6dGhpcy5zdHJva2UmJnRoaXMuc3Ryb2tlLnRvT2JqZWN0P3RoaXMuc3Ryb2tlLnRvT2JqZWN0KCk6dGhpcy5zdHJva2Usc3Ryb2tlV2lkdGg6cih0aGlzLnN0cm9rZVdpZHRoLGkpLHN0cm9rZURhc2hBcnJheTp0aGlzLnN0cm9rZURhc2hBcnJheT90aGlzLnN0cm9rZURhc2hBcnJheS5jb25jYXQoKTp0aGlzLnN0cm9rZURhc2hBcnJheSxzdHJva2VMaW5lQ2FwOnRoaXMuc3Ryb2tlTGluZUNhcCxzdHJva2VMaW5lSm9pbjp0aGlzLnN0cm9rZUxpbmVKb2luLHN0cm9rZU1pdGVyTGltaXQ6cih0aGlzLnN0cm9rZU1pdGVyTGltaXQsaSksc2NhbGVYOnIodGhpcy5zY2FsZVgsaSksc2NhbGVZOnIodGhpcy5zY2FsZVksaSksYW5nbGU6cih0aGlzLmdldEFuZ2xlKCksaSksZmxpcFg6dGhpcy5mbGlwWCxmbGlwWTp0aGlzLmZsaXBZLG9wYWNpdHk6cih0aGlzLm9wYWNpdHksaSksc2hhZG93OnRoaXMuc2hhZG93JiZ0aGlzLnNoYWRvdy50b09iamVjdD90aGlzLnNoYWRvdy50b09iamVjdCgpOnRoaXMuc2hhZG93LHZpc2libGU6dGhpcy52aXNpYmxlLGNsaXBUbzp0aGlzLmNsaXBUbyYmU3RyaW5nKHRoaXMuY2xpcFRvKSxiYWNrZ3JvdW5kQ29sb3I6dGhpcy5iYWNrZ3JvdW5kQ29sb3IsZmlsbFJ1bGU6dGhpcy5maWxsUnVsZSxnbG9iYWxDb21wb3NpdGVPcGVyYXRpb246dGhpcy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24sdHJhbnNmb3JtTWF0cml4OnRoaXMudHJhbnNmb3JtTWF0cml4P3RoaXMudHJhbnNmb3JtTWF0cml4LmNvbmNhdCgpOnRoaXMudHJhbnNmb3JtTWF0cml4LHNrZXdYOnIodGhpcy5za2V3WCxpKSxza2V3WTpyKHRoaXMuc2tld1ksaSl9O3JldHVybiB0aGlzLmluY2x1ZGVEZWZhdWx0VmFsdWVzfHwobj10aGlzLl9yZW1vdmVEZWZhdWx0VmFsdWVzKG4pKSxlLnV0aWwucG9wdWxhdGVXaXRoUHJvcGVydGllcyh0aGlzLG4sdCksbn0sdG9EYXRhbGVzc09iamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50b09iamVjdCh0KX0sX3JlbW92ZURlZmF1bHRWYWx1ZXM6ZnVuY3Rpb24odCl7dmFyIGk9ZS51dGlsLmdldEtsYXNzKHQudHlwZSkucHJvdG90eXBlLHI9aS5zdGF0ZVByb3BlcnRpZXM7cmV0dXJuIHIuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPT09aVtlXSYmZGVsZXRlIHRbZV07dmFyIHI9IltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0W2VdKSYmIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpW2VdKTtyJiYwPT09dFtlXS5sZW5ndGgmJjA9PT1pW2VdLmxlbmd0aCYmZGVsZXRlIHRbZV19KSx0fSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiIjPGZhYnJpYy4iK24odGhpcy50eXBlKSsiPiJ9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1t0XX0sZ2V0T2JqZWN0U2NhbGluZzpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc2NhbGVYLGU9dGhpcy5zY2FsZVk7aWYodGhpcy5ncm91cCl7dmFyIGk9dGhpcy5ncm91cC5nZXRPYmplY3RTY2FsaW5nKCk7dCo9aS5zY2FsZVgsZSo9aS5zY2FsZVl9cmV0dXJue3NjYWxlWDp0LHNjYWxlWTplfX0sX3NldE9iamVjdDpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdCl0aGlzLl9zZXQoZSx0W2VdKX0sc2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0P3RoaXMuX3NldE9iamVjdCh0KToiZnVuY3Rpb24iPT10eXBlb2YgZSYmImNsaXBUbyIhPT10P3RoaXMuX3NldCh0LGUodGhpcy5nZXQodCkpKTp0aGlzLl9zZXQodCxlKSx0aGlzfSxfc2V0OmZ1bmN0aW9uKHQsaSl7dmFyIHI9InNjYWxlWCI9PT10fHwic2NhbGVZIj09PXQ7cmV0dXJuIHImJihpPXRoaXMuX2NvbnN0cmFpblNjYWxlKGkpKSwic2NhbGVYIj09PXQmJmk8MD8odGhpcy5mbGlwWD0hdGhpcy5mbGlwWCxpKj0tMSk6InNjYWxlWSI9PT10JiZpPDA/KHRoaXMuZmxpcFk9IXRoaXMuZmxpcFksaSo9LTEpOiJzaGFkb3ciIT09dHx8IWl8fGkgaW5zdGFuY2VvZiBlLlNoYWRvd3x8KGk9bmV3IGUuU2hhZG93KGkpKSx0aGlzW3RdPWksIndpZHRoIiE9PXQmJiJoZWlnaHQiIT09dHx8KHRoaXMubWluU2NhbGVMaW1pdD1NYXRoLm1pbiguMSwxL01hdGgubWF4KHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpKSksdGhpc30sc2V0T25Hcm91cDpmdW5jdGlvbigpe30sdG9nZ2xlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0KHQpO3JldHVybiJib29sZWFuIj09dHlwZW9mIGUmJnRoaXMuc2V0KHQsIWUpLHRoaXN9LHNldFNvdXJjZVBhdGg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc291cmNlUGF0aD10LHRoaXN9LGdldFZpZXdwb3J0VHJhbnNmb3JtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FudmFzJiZ0aGlzLmNhbnZhcy52aWV3cG9ydFRyYW5zZm9ybT90aGlzLmNhbnZhcy52aWV3cG9ydFRyYW5zZm9ybTpbMSwwLDAsMSwwLDBdfSxyZW5kZXI6ZnVuY3Rpb24odCxpKXswPT09dGhpcy53aWR0aCYmMD09PXRoaXMuaGVpZ2h0fHwhdGhpcy52aXNpYmxlfHwodC5zYXZlKCksdGhpcy5fc2V0dXBDb21wb3NpdGVPcGVyYXRpb24odCksdGhpcy5kcmF3U2VsZWN0aW9uQmFja2dyb3VuZCh0KSxpfHx0aGlzLnRyYW5zZm9ybSh0KSx0aGlzLl9zZXRPcGFjaXR5KHQpLHRoaXMuX3NldFNoYWRvdyh0KSx0aGlzLl9yZW5kZXJCYWNrZ3JvdW5kKHQpLHRoaXMuX3NldFN0cm9rZVN0eWxlcyh0KSx0aGlzLl9zZXRGaWxsU3R5bGVzKHQpLHRoaXMudHJhbnNmb3JtTWF0cml4JiZ0LnRyYW5zZm9ybS5hcHBseSh0LHRoaXMudHJhbnNmb3JtTWF0cml4KSx0aGlzLmNsaXBUbyYmZS51dGlsLmNsaXBDb250ZXh0KHRoaXMsdCksdGhpcy5fcmVuZGVyKHQsaSksdGhpcy5jbGlwVG8mJnQucmVzdG9yZSgpLHQucmVzdG9yZSgpKX0sX3JlbmRlckJhY2tncm91bmQ6ZnVuY3Rpb24odCl7dGhpcy5iYWNrZ3JvdW5kQ29sb3ImJih0LmZpbGxTdHlsZT10aGlzLmJhY2tncm91bmRDb2xvcix0LmZpbGxSZWN0KC10aGlzLndpZHRoLzIsLXRoaXMuaGVpZ2h0LzIsdGhpcy53aWR0aCx0aGlzLmhlaWdodCksdGhpcy5fcmVtb3ZlU2hhZG93KHQpKX0sX3NldE9wYWNpdHk6ZnVuY3Rpb24odCl7dGhpcy5ncm91cCYmdGhpcy5ncm91cC5fc2V0T3BhY2l0eSh0KSx0Lmdsb2JhbEFscGhhKj10aGlzLm9wYWNpdHl9LF9zZXRTdHJva2VTdHlsZXM6ZnVuY3Rpb24odCl7dGhpcy5zdHJva2UmJih0LmxpbmVXaWR0aD10aGlzLnN0cm9rZVdpZHRoLHQubGluZUNhcD10aGlzLnN0cm9rZUxpbmVDYXAsdC5saW5lSm9pbj10aGlzLnN0cm9rZUxpbmVKb2luLHQubWl0ZXJMaW1pdD10aGlzLnN0cm9rZU1pdGVyTGltaXQsdC5zdHJva2VTdHlsZT10aGlzLnN0cm9rZS50b0xpdmU/dGhpcy5zdHJva2UudG9MaXZlKHQsdGhpcyk6dGhpcy5zdHJva2UpfSxfc2V0RmlsbFN0eWxlczpmdW5jdGlvbih0KXt0aGlzLmZpbGwmJih0LmZpbGxTdHlsZT10aGlzLmZpbGwudG9MaXZlP3RoaXMuZmlsbC50b0xpdmUodCx0aGlzKTp0aGlzLmZpbGwpfSxfc2V0TGluZURhc2g6ZnVuY3Rpb24odCxlLGkpe2UmJigxJmUubGVuZ3RoJiZlLnB1c2guYXBwbHkoZSxlKSxvP3Quc2V0TGluZURhc2goZSk6aSYmaSh0KSl9LF9yZW5kZXJDb250cm9sczpmdW5jdGlvbih0LGkpe2lmKCEoIXRoaXMuYWN0aXZlfHxpfHx0aGlzLmdyb3VwJiZ0aGlzLmdyb3VwIT09dGhpcy5jYW52YXMuZ2V0QWN0aXZlR3JvdXAoKSkpe3ZhciByLG49dGhpcy5nZXRWaWV3cG9ydFRyYW5zZm9ybSgpLG89dGhpcy5jYWxjVHJhbnNmb3JtTWF0cml4KCk7bz1lLnV0aWwubXVsdGlwbHlUcmFuc2Zvcm1NYXRyaWNlcyhuLG8pLHI9ZS51dGlsLnFyRGVjb21wb3NlKG8pLHQuc2F2ZSgpLHQudHJhbnNsYXRlKHIudHJhbnNsYXRlWCxyLnRyYW5zbGF0ZVkpLHQubGluZVdpZHRoPTEqdGhpcy5ib3JkZXJTY2FsZUZhY3Rvcix0Lmdsb2JhbEFscGhhPXRoaXMuaXNNb3Zpbmc/dGhpcy5ib3JkZXJPcGFjaXR5V2hlbk1vdmluZzoxLHRoaXMuZ3JvdXAmJnRoaXMuZ3JvdXA9PT10aGlzLmNhbnZhcy5nZXRBY3RpdmVHcm91cCgpPyh0LnJvdGF0ZShzKHIuYW5nbGUpKSx0aGlzLmRyYXdCb3JkZXJzSW5Hcm91cCh0LHIpKToodC5yb3RhdGUocyh0aGlzLmFuZ2xlKSksdGhpcy5kcmF3Qm9yZGVycyh0KSksdGhpcy5kcmF3Q29udHJvbHModCksdC5yZXN0b3JlKCl9fSxfc2V0U2hhZG93OmZ1bmN0aW9uKHQpe2lmKHRoaXMuc2hhZG93KXt2YXIgaT10aGlzLmNhbnZhcyYmdGhpcy5jYW52YXMudmlld3BvcnRUcmFuc2Zvcm1bMF18fDEscj10aGlzLmNhbnZhcyYmdGhpcy5jYW52YXMudmlld3BvcnRUcmFuc2Zvcm1bM118fDEsbj10aGlzLmdldE9iamVjdFNjYWxpbmcoKTt0aGlzLmNhbnZhcyYmdGhpcy5jYW52YXMuX2lzUmV0aW5hU2NhbGluZygpJiYoaSo9ZS5kZXZpY2VQaXhlbFJhdGlvLHIqPWUuZGV2aWNlUGl4ZWxSYXRpbyksdC5zaGFkb3dDb2xvcj10aGlzLnNoYWRvdy5jb2xvcix0LnNoYWRvd0JsdXI9dGhpcy5zaGFkb3cuYmx1ciooaStyKSoobi5zY2FsZVgrbi5zY2FsZVkpLzQsdC5zaGFkb3dPZmZzZXRYPXRoaXMuc2hhZG93Lm9mZnNldFgqaSpuLnNjYWxlWCx0LnNoYWRvd09mZnNldFk9dGhpcy5zaGFkb3cub2Zmc2V0WSpyKm4uc2NhbGVZfX0sX3JlbW92ZVNoYWRvdzpmdW5jdGlvbih0KXt0aGlzLnNoYWRvdyYmKHQuc2hhZG93Q29sb3I9IiIsdC5zaGFkb3dCbHVyPXQuc2hhZG93T2Zmc2V0WD10LnNoYWRvd09mZnNldFk9MCl9LF9yZW5kZXJGaWxsOmZ1bmN0aW9uKHQpe2lmKHRoaXMuZmlsbCl7aWYodC5zYXZlKCksdGhpcy5maWxsLmdyYWRpZW50VHJhbnNmb3JtKXt2YXIgZT10aGlzLmZpbGwuZ3JhZGllbnRUcmFuc2Zvcm07dC50cmFuc2Zvcm0uYXBwbHkodCxlKX10aGlzLmZpbGwudG9MaXZlJiZ0LnRyYW5zbGF0ZSgtdGhpcy53aWR0aC8yK3RoaXMuZmlsbC5vZmZzZXRYfHwwLC10aGlzLmhlaWdodC8yK3RoaXMuZmlsbC5vZmZzZXRZfHwwKSwiZXZlbm9kZCI9PT10aGlzLmZpbGxSdWxlP3QuZmlsbCgiZXZlbm9kZCIpOnQuZmlsbCgpLHQucmVzdG9yZSgpfX0sX3JlbmRlclN0cm9rZTpmdW5jdGlvbih0KXtpZih0aGlzLnN0cm9rZSYmMCE9PXRoaXMuc3Ryb2tlV2lkdGgpe2lmKHRoaXMuc2hhZG93JiYhdGhpcy5zaGFkb3cuYWZmZWN0U3Ryb2tlJiZ0aGlzLl9yZW1vdmVTaGFkb3codCksdC5zYXZlKCksdGhpcy5fc2V0TGluZURhc2godCx0aGlzLnN0cm9rZURhc2hBcnJheSx0aGlzLl9yZW5kZXJEYXNoZWRTdHJva2UpLHRoaXMuc3Ryb2tlLmdyYWRpZW50VHJhbnNmb3JtKXt2YXIgZT10aGlzLnN0cm9rZS5ncmFkaWVudFRyYW5zZm9ybTt0LnRyYW5zZm9ybS5hcHBseSh0LGUpfXRoaXMuc3Ryb2tlLnRvTGl2ZSYmdC50cmFuc2xhdGUoLXRoaXMud2lkdGgvMit0aGlzLnN0cm9rZS5vZmZzZXRYfHwwLC10aGlzLmhlaWdodC8yK3RoaXMuc3Ryb2tlLm9mZnNldFl8fDApLHQuc3Ryb2tlKCksdC5yZXN0b3JlKCl9fSxjbG9uZTpmdW5jdGlvbih0LGkpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLmZyb21PYmplY3Q/dGhpcy5jb25zdHJ1Y3Rvci5mcm9tT2JqZWN0KHRoaXMudG9PYmplY3QoaSksdCk6bmV3IGUuT2JqZWN0KHRoaXMudG9PYmplY3QoaSkpfSxjbG9uZUFzSW1hZ2U6ZnVuY3Rpb24odCxpKXt2YXIgcj10aGlzLnRvRGF0YVVSTChpKTtyZXR1cm4gZS51dGlsLmxvYWRJbWFnZShyLGZ1bmN0aW9uKGkpe3QmJnQobmV3IGUuSW1hZ2UoaSkpfSksdGhpc30sdG9EYXRhVVJMOmZ1bmN0aW9uKHQpe3R8fCh0PXt9KTt2YXIgaT1lLnV0aWwuY3JlYXRlQ2FudmFzRWxlbWVudCgpLHI9dGhpcy5nZXRCb3VuZGluZ1JlY3QoKTtpLndpZHRoPXIud2lkdGgsaS5oZWlnaHQ9ci5oZWlnaHQsZS51dGlsLndyYXBFbGVtZW50KGksImRpdiIpO3ZhciBuPW5ldyBlLlN0YXRpY0NhbnZhcyhpLHtlbmFibGVSZXRpbmFTY2FsaW5nOnQuZW5hYmxlUmV0aW5hU2NhbGluZ30pOyJqcGciPT09dC5mb3JtYXQmJih0LmZvcm1hdD0ianBlZyIpLCJqcGVnIj09PXQuZm9ybWF0JiYobi5iYWNrZ3JvdW5kQ29sb3I9IiNmZmYiKTt2YXIgcz17YWN0aXZlOnRoaXMuZ2V0KCJhY3RpdmUiKSxsZWZ0OnRoaXMuZ2V0TGVmdCgpLHRvcDp0aGlzLmdldFRvcCgpfTt0aGlzLnNldCgiYWN0aXZlIiwhMSksdGhpcy5zZXRQb3NpdGlvbkJ5T3JpZ2luKG5ldyBlLlBvaW50KG4uZ2V0V2lkdGgoKS8yLG4uZ2V0SGVpZ2h0KCkvMiksImNlbnRlciIsImNlbnRlciIpO3ZhciBvPXRoaXMuY2FudmFzO24uYWRkKHRoaXMpO3ZhciBhPW4udG9EYXRhVVJMKHQpO3JldHVybiB0aGlzLnNldChzKS5zZXRDb29yZHMoKSx0aGlzLmNhbnZhcz1vLG4uZGlzcG9zZSgpLG49bnVsbCxhfSxpc1R5cGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudHlwZT09PXR9LGNvbXBsZXhpdHk6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sdG9KU09OOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRvT2JqZWN0KHQpfSxzZXRHcmFkaWVudDpmdW5jdGlvbih0LGkpe2l8fChpPXt9KTt2YXIgcj17Y29sb3JTdG9wczpbXX07ci50eXBlPWkudHlwZXx8KGkucjF8fGkucjI/InJhZGlhbCI6ImxpbmVhciIpLHIuY29vcmRzPXt4MTppLngxLHkxOmkueTEseDI6aS54Mix5MjppLnkyfSwoaS5yMXx8aS5yMikmJihyLmNvb3Jkcy5yMT1pLnIxLHIuY29vcmRzLnIyPWkucjIpLGkuZ3JhZGllbnRUcmFuc2Zvcm0mJihyLmdyYWRpZW50VHJhbnNmb3JtPWkuZ3JhZGllbnRUcmFuc2Zvcm0pO2Zvcih2YXIgbiBpbiBpLmNvbG9yU3RvcHMpe3ZhciBzPW5ldyBlLkNvbG9yKGkuY29sb3JTdG9wc1tuXSk7ci5jb2xvclN0b3BzLnB1c2goe29mZnNldDpuLGNvbG9yOnMudG9SZ2IoKSxvcGFjaXR5OnMuZ2V0QWxwaGEoKX0pfXJldHVybiB0aGlzLnNldCh0LGUuR3JhZGllbnQuZm9yT2JqZWN0KHRoaXMscikpfSxzZXRQYXR0ZXJuRmlsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zZXQoImZpbGwiLG5ldyBlLlBhdHRlcm4odCkpfSxzZXRTaGFkb3c6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2V0KCJzaGFkb3ciLHQ/bmV3IGUuU2hhZG93KHQpOm51bGwpfSxzZXRDb2xvcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zZXQoImZpbGwiLHQpLHRoaXN9LHNldEFuZ2xlOmZ1bmN0aW9uKHQpe3ZhciBlPSgiY2VudGVyIiE9PXRoaXMub3JpZ2luWHx8ImNlbnRlciIhPT10aGlzLm9yaWdpblkpJiZ0aGlzLmNlbnRlcmVkUm90YXRpb247cmV0dXJuIGUmJnRoaXMuX3NldE9yaWdpblRvQ2VudGVyKCksdGhpcy5zZXQoImFuZ2xlIix0KSxlJiZ0aGlzLl9yZXNldE9yaWdpbigpLHRoaXN9LGNlbnRlckg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW52YXMmJnRoaXMuY2FudmFzLmNlbnRlck9iamVjdEgodGhpcyksdGhpc30sdmlld3BvcnRDZW50ZXJIOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FudmFzJiZ0aGlzLmNhbnZhcy52aWV3cG9ydENlbnRlck9iamVjdEgodGhpcyksdGhpc30sY2VudGVyVjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbnZhcyYmdGhpcy5jYW52YXMuY2VudGVyT2JqZWN0Vih0aGlzKSx0aGlzfSx2aWV3cG9ydENlbnRlclY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW52YXMmJnRoaXMuY2FudmFzLnZpZXdwb3J0Q2VudGVyT2JqZWN0Vih0aGlzKSx0aGlzfSxjZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW52YXMmJnRoaXMuY2FudmFzLmNlbnRlck9iamVjdCh0aGlzKSx0aGlzfSx2aWV3cG9ydENlbnRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbnZhcyYmdGhpcy5jYW52YXMudmlld3BvcnRDZW50ZXJPYmplY3QodGhpcyksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FudmFzJiZ0aGlzLmNhbnZhcy5yZW1vdmUodGhpcyksdGhpc30sZ2V0TG9jYWxQb2ludGVyOmZ1bmN0aW9uKHQsaSl7aT1pfHx0aGlzLmNhbnZhcy5nZXRQb2ludGVyKHQpO3ZhciByPW5ldyBlLlBvaW50KGkueCxpLnkpLG49dGhpcy5fZ2V0TGVmdFRvcENvb3JkcygpO3JldHVybiB0aGlzLmFuZ2xlJiYocj1lLnV0aWwucm90YXRlUG9pbnQocixuLGUudXRpbC5kZWdyZWVzVG9SYWRpYW5zKC10aGlzLmFuZ2xlKSkpLHt4OnIueC1uLngseTpyLnktbi55fX0sX3NldHVwQ29tcG9zaXRlT3BlcmF0aW9uOmZ1bmN0aW9uKHQpe3RoaXMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uJiYodC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249dGhpcy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24pfX0pLGUudXRpbC5jcmVhdGVBY2Nlc3NvcnMoZS5PYmplY3QpLGUuT2JqZWN0LnByb3RvdHlwZS5yb3RhdGU9ZS5PYmplY3QucHJvdG90eXBlLnNldEFuZ2xlLGkoZS5PYmplY3QucHJvdG90eXBlLGUuT2JzZXJ2YWJsZSksZS5PYmplY3QuTlVNX0ZSQUNUSU9OX0RJR0lUUz0yLGUuT2JqZWN0Ll9fdWlkPTApfSgidW5kZWZpbmVkIiE9dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0aGlzKSxmdW5jdGlvbigpe3ZhciB0PWZhYnJpYy51dGlsLmRlZ3JlZXNUb1JhZGlhbnMsZT17bGVmdDotLjUsY2VudGVyOjAscmlnaHQ6LjV9LGk9e3RvcDotLjUsY2VudGVyOjAsYm90dG9tOi41fTtmYWJyaWMudXRpbC5vYmplY3QuZXh0ZW5kKGZhYnJpYy5PYmplY3QucHJvdG90eXBlLHt0cmFuc2xhdGVUb0dpdmVuT3JpZ2luOmZ1bmN0aW9uKHQscixuLHMsbyl7dmFyIGEsaCxjLGw9dC54LHU9dC55O3JldHVybiJzdHJpbmciPT10eXBlb2Ygcj9yPWVbcl06ci09LjUsInN0cmluZyI9PXR5cGVvZiBzP3M9ZVtzXTpzLT0uNSxhPXMtciwic3RyaW5nIj09dHlwZW9mIG4/bj1pW25dOm4tPS41LCJzdHJpbmciPT10eXBlb2Ygbz9vPWlbb106by09LjUsaD1vLW4sKGF8fGgpJiYoYz10aGlzLl9nZXRUcmFuc2Zvcm1lZERpbWVuc2lvbnMoKSxsPXQueCthKmMueCx1PXQueStoKmMueSksbmV3IGZhYnJpYy5Qb2ludChsLHUpfSx0cmFuc2xhdGVUb0NlbnRlclBvaW50OmZ1bmN0aW9uKGUsaSxyKXt2YXIgbj10aGlzLnRyYW5zbGF0ZVRvR2l2ZW5PcmlnaW4oZSxpLHIsImNlbnRlciIsImNlbnRlciIpO3JldHVybiB0aGlzLmFuZ2xlP2ZhYnJpYy51dGlsLnJvdGF0ZVBvaW50KG4sZSx0KHRoaXMuYW5nbGUpKTpufSx0cmFuc2xhdGVUb09yaWdpblBvaW50OmZ1bmN0aW9uKGUsaSxyKXt2YXIgbj10aGlzLnRyYW5zbGF0ZVRvR2l2ZW5PcmlnaW4oZSwiY2VudGVyIiwiY2VudGVyIixpLHIpO3JldHVybiB0aGlzLmFuZ2xlP2ZhYnJpYy51dGlsLnJvdGF0ZVBvaW50KG4sZSx0KHRoaXMuYW5nbGUpKTpufSxnZXRDZW50ZXJQb2ludDpmdW5jdGlvbigpe3ZhciB0PW5ldyBmYWJyaWMuUG9pbnQodGhpcy5sZWZ0LHRoaXMudG9wKTtyZXR1cm4gdGhpcy50cmFuc2xhdGVUb0NlbnRlclBvaW50KHQsdGhpcy5vcmlnaW5YLHRoaXMub3JpZ2luWSl9LGdldFBvaW50QnlPcmlnaW46ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldENlbnRlclBvaW50KCk7cmV0dXJuIHRoaXMudHJhbnNsYXRlVG9PcmlnaW5Qb2ludChpLHQsZSl9LHRvTG9jYWxQb2ludDpmdW5jdGlvbihlLGkscil7dmFyIG4scyxvPXRoaXMuZ2V0Q2VudGVyUG9pbnQoKTtyZXR1cm4gbj0idW5kZWZpbmVkIiE9dHlwZW9mIGkmJiJ1bmRlZmluZWQiIT10eXBlb2Ygcj90aGlzLnRyYW5zbGF0ZVRvR2l2ZW5PcmlnaW4obywiY2VudGVyIiwiY2VudGVyIixpLHIpOm5ldyBmYWJyaWMuUG9pbnQodGhpcy5sZWZ0LHRoaXMudG9wKSxzPW5ldyBmYWJyaWMuUG9pbnQoZS54LGUueSksdGhpcy5hbmdsZSYmKHM9ZmFicmljLnV0aWwucm90YXRlUG9pbnQocyxvLC10KHRoaXMuYW5nbGUpKSkscy5zdWJ0cmFjdEVxdWFscyhuKX0sc2V0UG9zaXRpb25CeU9yaWdpbjpmdW5jdGlvbih0LGUsaSl7dmFyIHI9dGhpcy50cmFuc2xhdGVUb0NlbnRlclBvaW50KHQsZSxpKSxuPXRoaXMudHJhbnNsYXRlVG9PcmlnaW5Qb2ludChyLHRoaXMub3JpZ2luWCx0aGlzLm9yaWdpblkpO3RoaXMuc2V0KCJsZWZ0IixuLngpLHRoaXMuc2V0KCJ0b3AiLG4ueSl9LGFkanVzdFBvc2l0aW9uOmZ1bmN0aW9uKGkpe3ZhciByLG4scz10KHRoaXMuYW5nbGUpLG89dGhpcy5nZXRXaWR0aCgpLGE9TWF0aC5jb3MocykqbyxoPU1hdGguc2luKHMpKm87cj0ic3RyaW5nIj09dHlwZW9mIHRoaXMub3JpZ2luWD9lW3RoaXMub3JpZ2luWF06dGhpcy5vcmlnaW5YLS41LG49InN0cmluZyI9PXR5cGVvZiBpP2VbaV06aS0uNSx0aGlzLmxlZnQrPWEqKG4tciksdGhpcy50b3ArPWgqKG4tciksdGhpcy5zZXRDb29yZHMoKSx0aGlzLm9yaWdpblg9aX0sX3NldE9yaWdpblRvQ2VudGVyOmZ1bmN0aW9uKCl7dGhpcy5fb3JpZ2luYWxPcmlnaW5YPXRoaXMub3JpZ2luWCx0aGlzLl9vcmlnaW5hbE9yaWdpblk9dGhpcy5vcmlnaW5ZO3ZhciB0PXRoaXMuZ2V0Q2VudGVyUG9pbnQoKTt0aGlzLm9yaWdpblg9ImNlbnRlciIsdGhpcy5vcmlnaW5ZPSJjZW50ZXIiLHRoaXMubGVmdD10LngsdGhpcy50b3A9dC55fSxfcmVzZXRPcmlnaW46ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnRyYW5zbGF0ZVRvT3JpZ2luUG9pbnQodGhpcy5nZXRDZW50ZXJQb2ludCgpLHRoaXMuX29yaWdpbmFsT3JpZ2luWCx0aGlzLl9vcmlnaW5hbE9yaWdpblkpO3RoaXMub3JpZ2luWD10aGlzLl9vcmlnaW5hbE9yaWdpblgsdGhpcy5vcmlnaW5ZPXRoaXMuX29yaWdpbmFsT3JpZ2luWSx0aGlzLmxlZnQ9dC54LHRoaXMudG9wPXQueSx0aGlzLl9vcmlnaW5hbE9yaWdpblg9bnVsbCx0aGlzLl9vcmlnaW5hbE9yaWdpblk9bnVsbH0sX2dldExlZnRUb3BDb29yZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cmFuc2xhdGVUb09yaWdpblBvaW50KHRoaXMuZ2V0Q2VudGVyUG9pbnQoKSwibGVmdCIsInRvcCIpfX0pfSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXtyZXR1cm5bbmV3IGZhYnJpYy5Qb2ludCh0LnRsLngsdC50bC55KSxuZXcgZmFicmljLlBvaW50KHQudHIueCx0LnRyLnkpLG5ldyBmYWJyaWMuUG9pbnQodC5ici54LHQuYnIueSksbmV3IGZhYnJpYy5Qb2ludCh0LmJsLngsdC5ibC55KV19dmFyIGU9ZmFicmljLnV0aWwuZGVncmVlc1RvUmFkaWFucyxpPWZhYnJpYy51dGlsLm11bHRpcGx5VHJhbnNmb3JtTWF0cmljZXM7ZmFicmljLnV0aWwub2JqZWN0LmV4dGVuZChmYWJyaWMuT2JqZWN0LnByb3RvdHlwZSx7b0Nvb3JkczpudWxsLGludGVyc2VjdHNXaXRoUmVjdDpmdW5jdGlvbihlLGkpe3ZhciByPXQodGhpcy5vQ29vcmRzKSxuPWZhYnJpYy5JbnRlcnNlY3Rpb24uaW50ZXJzZWN0UG9seWdvblJlY3RhbmdsZShyLGUsaSk7cmV0dXJuIkludGVyc2VjdGlvbiI9PT1uLnN0YXR1c30saW50ZXJzZWN0c1dpdGhPYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIGk9ZmFicmljLkludGVyc2VjdGlvbi5pbnRlcnNlY3RQb2x5Z29uUG9seWdvbih0KHRoaXMub0Nvb3JkcyksdChlLm9Db29yZHMpKTtyZXR1cm4iSW50ZXJzZWN0aW9uIj09PWkuc3RhdHVzfHxlLmlzQ29udGFpbmVkV2l0aGluT2JqZWN0KHRoaXMpfHx0aGlzLmlzQ29udGFpbmVkV2l0aGluT2JqZWN0KGUpfSxpc0NvbnRhaW5lZFdpdGhpbk9iamVjdDpmdW5jdGlvbihlKXtmb3IodmFyIGk9dCh0aGlzLm9Db29yZHMpLHI9MDtyPDQ7cisrKWlmKCFlLmNvbnRhaW5zUG9pbnQoaVtyXSkpcmV0dXJuITE7cmV0dXJuITB9LGlzQ29udGFpbmVkV2l0aGluUmVjdDpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ2V0Qm91bmRpbmdSZWN0KCk7cmV0dXJuIGkubGVmdD49dC54JiZpLmxlZnQraS53aWR0aDw9ZS54JiZpLnRvcD49dC55JiZpLnRvcCtpLmhlaWdodDw9ZS55fSxjb250YWluc1BvaW50OmZ1bmN0aW9uKHQpe3RoaXMub0Nvb3Jkc3x8dGhpcy5zZXRDb29yZHMoKTt2YXIgZT10aGlzLl9nZXRJbWFnZUxpbmVzKHRoaXMub0Nvb3JkcyksaT10aGlzLl9maW5kQ3Jvc3NQb2ludHModCxlKTtyZXR1cm4gMCE9PWkmJmklMj09PTF9LF9nZXRJbWFnZUxpbmVzOmZ1bmN0aW9uKHQpe3JldHVybnt0b3BsaW5lOntvOnQudGwsZDp0LnRyfSxyaWdodGxpbmU6e286dC50cixkOnQuYnJ9LGJvdHRvbWxpbmU6e286dC5icixkOnQuYmx9LGxlZnRsaW5lOntvOnQuYmwsZDp0LnRsfX19LF9maW5kQ3Jvc3NQb2ludHM6ZnVuY3Rpb24odCxlKXt2YXIgaSxyLG4scyxvLGEsaD0wO2Zvcih2YXIgYyBpbiBlKWlmKGE9ZVtjXSwhKGEuby55PHQueSYmYS5kLnk8dC55fHxhLm8ueT49dC55JiZhLmQueT49dC55fHwoYS5vLng9PT1hLmQueCYmYS5vLng+PXQueD9vPWEuby54OihpPTAscj0oYS5kLnktYS5vLnkpLyhhLmQueC1hLm8ueCksbj10LnktaSp0Lngscz1hLm8ueS1yKmEuby54LG89LShuLXMpLyhpLXIpKSxvPj10LngmJihoKz0xKSwyIT09aCkpKWJyZWFrO3JldHVybiBofSxnZXRCb3VuZGluZ1JlY3RXaWR0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEJvdW5kaW5nUmVjdCgpLndpZHRofSxnZXRCb3VuZGluZ1JlY3RIZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCb3VuZGluZ1JlY3QoKS5oZWlnaHR9LGdldEJvdW5kaW5nUmVjdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9Db29yZHN8fHRoaXMuc2V0Q29vcmRzKCksZmFicmljLnV0aWwubWFrZUJvdW5kaW5nQm94RnJvbVBvaW50cyhbdGhpcy5vQ29vcmRzLnRsLHRoaXMub0Nvb3Jkcy50cix0aGlzLm9Db29yZHMuYnIsdGhpcy5vQ29vcmRzLmJsXSl9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFRyYW5zZm9ybWVkRGltZW5zaW9ucygpLnh9LGdldEhlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRUcmFuc2Zvcm1lZERpbWVuc2lvbnMoKS55fSxfY29uc3RyYWluU2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYWJzKHQpPHRoaXMubWluU2NhbGVMaW1pdD90PDA/LXRoaXMubWluU2NhbGVMaW1pdDp0aGlzLm1pblNjYWxlTGltaXQ6dH0sc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dGhpcy5fY29uc3RyYWluU2NhbGUodCksdDwwJiYodGhpcy5mbGlwWD0hdGhpcy5mbGlwWCx0aGlzLmZsaXBZPSF0aGlzLmZsaXBZLHQqPS0xKSx0aGlzLnNjYWxlWD10LHRoaXMuc2NhbGVZPXQsdGhpcy5zZXRDb29yZHMoKSx0aGlzfSxzY2FsZVRvV2lkdGg6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRCb3VuZGluZ1JlY3QoKS53aWR0aC90aGlzLmdldFdpZHRoKCk7cmV0dXJuIHRoaXMuc2NhbGUodC90aGlzLndpZHRoL2UpfSxzY2FsZVRvSGVpZ2h0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0Qm91bmRpbmdSZWN0KCkuaGVpZ2h0L3RoaXMuZ2V0SGVpZ2h0KCk7cmV0dXJuIHRoaXMuc2NhbGUodC90aGlzLmhlaWdodC9lKX0sc2V0Q29vcmRzOmZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzLmFuZ2xlKSxpPXRoaXMuZ2V0Vmlld3BvcnRUcmFuc2Zvcm0oKSxyPXRoaXMuX2NhbGN1bGF0ZUN1cnJlbnREaW1lbnNpb25zKCksbj1yLngscz1yLnk7bjwwJiYobj1NYXRoLmFicyhuKSk7dmFyIG89TWF0aC5zaW4odCksYT1NYXRoLmNvcyh0KSxoPW4+MD9NYXRoLmF0YW4ocy9uKTowLGM9bi9NYXRoLmNvcyhoKS8yLGw9TWF0aC5jb3MoaCt0KSpjLHU9TWF0aC5zaW4oaCt0KSpjLGY9ZmFicmljLnV0aWwudHJhbnNmb3JtUG9pbnQodGhpcy5nZXRDZW50ZXJQb2ludCgpLGkpLGQ9bmV3IGZhYnJpYy5Qb2ludChmLngtbCxmLnktdSksZz1uZXcgZmFicmljLlBvaW50KGQueCtuKmEsZC55K24qbykscD1uZXcgZmFicmljLlBvaW50KGQueC1zKm8sZC55K3MqYSksdj1uZXcgZmFicmljLlBvaW50KGYueCtsLGYueSt1KSxiPW5ldyBmYWJyaWMuUG9pbnQoKGQueCtwLngpLzIsKGQueStwLnkpLzIpLG09bmV3IGZhYnJpYy5Qb2ludCgoZy54K2QueCkvMiwoZy55K2QueSkvMikseT1uZXcgZmFicmljLlBvaW50KCh2LngrZy54KS8yLCh2LnkrZy55KS8yKSxfPW5ldyBmYWJyaWMuUG9pbnQoKHYueCtwLngpLzIsKHYueStwLnkpLzIpLHg9bmV3IGZhYnJpYy5Qb2ludChtLngrbyp0aGlzLnJvdGF0aW5nUG9pbnRPZmZzZXQsbS55LWEqdGhpcy5yb3RhdGluZ1BvaW50T2Zmc2V0KTtyZXR1cm4gdGhpcy5vQ29vcmRzPXt0bDpkLHRyOmcsYnI6dixibDpwLG1sOmIsbXQ6bSxtcjp5LG1iOl8sbXRyOnh9LHRoaXMuX3NldENvcm5lckNvb3JkcyYmdGhpcy5fc2V0Q29ybmVyQ29vcmRzKCksdGhpc30sX2NhbGNSb3RhdGVNYXRyaXg6ZnVuY3Rpb24oKXsKaWYodGhpcy5hbmdsZSl7dmFyIHQ9ZSh0aGlzLmFuZ2xlKSxpPU1hdGguY29zKHQpLHI9TWF0aC5zaW4odCk7cmV0dXJuW2ksciwtcixpLDAsMF19cmV0dXJuWzEsMCwwLDEsMCwwXX0sY2FsY1RyYW5zZm9ybU1hdHJpeDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0Q2VudGVyUG9pbnQoKSxlPVsxLDAsMCwxLHQueCx0LnldLHI9dGhpcy5fY2FsY1JvdGF0ZU1hdHJpeCgpLG49dGhpcy5fY2FsY0RpbWVuc2lvbnNUcmFuc2Zvcm1NYXRyaXgodGhpcy5za2V3WCx0aGlzLnNrZXdZLCEwKSxzPXRoaXMuZ3JvdXA/dGhpcy5ncm91cC5jYWxjVHJhbnNmb3JtTWF0cml4KCk6WzEsMCwwLDEsMCwwXTtyZXR1cm4gcz1pKHMsZSkscz1pKHMscikscz1pKHMsbil9LF9jYWxjRGltZW5zaW9uc1RyYW5zZm9ybU1hdHJpeDpmdW5jdGlvbih0LHIsbil7dmFyIHM9WzEsMCxNYXRoLnRhbihlKHQpKSwxXSxvPVsxLE1hdGgudGFuKGUocikpLDAsMV0sYT10aGlzLnNjYWxlWCoobiYmdGhpcy5mbGlwWD8tMToxKSxoPXRoaXMuc2NhbGVZKihuJiZ0aGlzLmZsaXBZPy0xOjEpLGM9W2EsMCwwLGhdLGw9aShjLHMsITApO3JldHVybiBpKGwsbywhMCl9fSl9KCksZmFicmljLnV0aWwub2JqZWN0LmV4dGVuZChmYWJyaWMuT2JqZWN0LnByb3RvdHlwZSx7c2VuZFRvQmFjazpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdyb3VwP2ZhYnJpYy5TdGF0aWNDYW52YXMucHJvdG90eXBlLnNlbmRUb0JhY2suY2FsbCh0aGlzLmdyb3VwLHRoaXMpOnRoaXMuY2FudmFzLnNlbmRUb0JhY2sodGhpcyksdGhpc30sYnJpbmdUb0Zyb250OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3JvdXA/ZmFicmljLlN0YXRpY0NhbnZhcy5wcm90b3R5cGUuYnJpbmdUb0Zyb250LmNhbGwodGhpcy5ncm91cCx0aGlzKTp0aGlzLmNhbnZhcy5icmluZ1RvRnJvbnQodGhpcyksdGhpc30sc2VuZEJhY2t3YXJkczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5ncm91cD9mYWJyaWMuU3RhdGljQ2FudmFzLnByb3RvdHlwZS5zZW5kQmFja3dhcmRzLmNhbGwodGhpcy5ncm91cCx0aGlzLHQpOnRoaXMuY2FudmFzLnNlbmRCYWNrd2FyZHModGhpcyx0KSx0aGlzfSxicmluZ0ZvcndhcmQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ3JvdXA/ZmFicmljLlN0YXRpY0NhbnZhcy5wcm90b3R5cGUuYnJpbmdGb3J3YXJkLmNhbGwodGhpcy5ncm91cCx0aGlzLHQpOnRoaXMuY2FudmFzLmJyaW5nRm9yd2FyZCh0aGlzLHQpLHRoaXN9LG1vdmVUbzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5ncm91cD9mYWJyaWMuU3RhdGljQ2FudmFzLnByb3RvdHlwZS5tb3ZlVG8uY2FsbCh0aGlzLmdyb3VwLHRoaXMsdCk6dGhpcy5jYW52YXMubW92ZVRvKHRoaXMsdCksdGhpc319KSxmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtpZihlKXtpZihlLnRvTGl2ZSlyZXR1cm4gdCsiOiB1cmwoI1NWR0lEXyIrZS5pZCsiKTsgIjt2YXIgaT1uZXcgZmFicmljLkNvbG9yKGUpLHI9dCsiOiAiK2kudG9SZ2IoKSsiOyAiLG49aS5nZXRBbHBoYSgpO3JldHVybiAxIT09biYmKHIrPXQrIi1vcGFjaXR5OiAiK24udG9TdHJpbmcoKSsiOyAiKSxyfXJldHVybiB0KyI6IG5vbmU7ICJ9ZmFicmljLnV0aWwub2JqZWN0LmV4dGVuZChmYWJyaWMuT2JqZWN0LnByb3RvdHlwZSx7Z2V0U3ZnU3R5bGVzOmZ1bmN0aW9uKGUpe3ZhciBpPXRoaXMuZmlsbFJ1bGUscj10aGlzLnN0cm9rZVdpZHRoP3RoaXMuc3Ryb2tlV2lkdGg6IjAiLG49dGhpcy5zdHJva2VEYXNoQXJyYXk/dGhpcy5zdHJva2VEYXNoQXJyYXkuam9pbigiICIpOiJub25lIixzPXRoaXMuc3Ryb2tlTGluZUNhcD90aGlzLnN0cm9rZUxpbmVDYXA6ImJ1dHQiLG89dGhpcy5zdHJva2VMaW5lSm9pbj90aGlzLnN0cm9rZUxpbmVKb2luOiJtaXRlciIsYT10aGlzLnN0cm9rZU1pdGVyTGltaXQ/dGhpcy5zdHJva2VNaXRlckxpbWl0OiI0IixoPSJ1bmRlZmluZWQiIT10eXBlb2YgdGhpcy5vcGFjaXR5P3RoaXMub3BhY2l0eToiMSIsYz10aGlzLnZpc2libGU/IiI6IiB2aXNpYmlsaXR5OiBoaWRkZW47IixsPWU/IiI6dGhpcy5nZXRTdmdGaWx0ZXIoKSx1PXQoImZpbGwiLHRoaXMuZmlsbCksZj10KCJzdHJva2UiLHRoaXMuc3Ryb2tlKTtyZXR1cm5bZiwic3Ryb2tlLXdpZHRoOiAiLHIsIjsgIiwic3Ryb2tlLWRhc2hhcnJheTogIixuLCI7ICIsInN0cm9rZS1saW5lY2FwOiAiLHMsIjsgIiwic3Ryb2tlLWxpbmVqb2luOiAiLG8sIjsgIiwic3Ryb2tlLW1pdGVybGltaXQ6ICIsYSwiOyAiLHUsImZpbGwtcnVsZTogIixpLCI7ICIsIm9wYWNpdHk6ICIsaCwiOyIsbCxjXS5qb2luKCIiKX0sZ2V0U3ZnRmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2hhZG93PyJmaWx0ZXI6IHVybCgjU1ZHSURfIit0aGlzLnNoYWRvdy5pZCsiKTsiOiIifSxnZXRTdmdJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkPydpZD0iJyt0aGlzLmlkKyciICc6IiJ9LGdldFN2Z1RyYW5zZm9ybTpmdW5jdGlvbigpe2lmKHRoaXMuZ3JvdXAmJiJwYXRoLWdyb3VwIj09PXRoaXMuZ3JvdXAudHlwZSlyZXR1cm4iIjt2YXIgdD1mYWJyaWMudXRpbC50b0ZpeGVkLGU9dGhpcy5nZXRBbmdsZSgpLGk9dGhpcy5nZXRTa2V3WCgpJTM2MCxyPXRoaXMuZ2V0U2tld1koKSUzNjAsbj10aGlzLmdldENlbnRlclBvaW50KCkscz1mYWJyaWMuT2JqZWN0Lk5VTV9GUkFDVElPTl9ESUdJVFMsbz0icGF0aC1ncm91cCI9PT10aGlzLnR5cGU/IiI6InRyYW5zbGF0ZSgiK3Qobi54LHMpKyIgIit0KG4ueSxzKSsiKSIsYT0wIT09ZT8iIHJvdGF0ZSgiK3QoZSxzKSsiKSI6IiIsaD0xPT09dGhpcy5zY2FsZVgmJjE9PT10aGlzLnNjYWxlWT8iIjoiIHNjYWxlKCIrdCh0aGlzLnNjYWxlWCxzKSsiICIrdCh0aGlzLnNjYWxlWSxzKSsiKSIsYz0wIT09aT8iIHNrZXdYKCIrdChpLHMpKyIpIjoiIixsPTAhPT1yPyIgc2tld1koIit0KHIscykrIikiOiIiLHU9InBhdGgtZ3JvdXAiPT09dGhpcy50eXBlP3RoaXMud2lkdGg6MCxmPXRoaXMuZmxpcFg/IiBtYXRyaXgoLTEgMCAwIDEgIit1KyIgMCkgIjoiIixkPSJwYXRoLWdyb3VwIj09PXRoaXMudHlwZT90aGlzLmhlaWdodDowLGc9dGhpcy5mbGlwWT8iIG1hdHJpeCgxIDAgMCAtMSAwICIrZCsiKSI6IiI7cmV0dXJuW28sYSxoLGYsZyxjLGxdLmpvaW4oIiIpfSxnZXRTdmdUcmFuc2Zvcm1NYXRyaXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm1NYXRyaXg/IiBtYXRyaXgoIit0aGlzLnRyYW5zZm9ybU1hdHJpeC5qb2luKCIgIikrIikgIjoiIn0sX2NyZWF0ZUJhc2VTVkdNYXJrdXA6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5maWxsJiZ0aGlzLmZpbGwudG9MaXZlJiZ0LnB1c2godGhpcy5maWxsLnRvU1ZHKHRoaXMsITEpKSx0aGlzLnN0cm9rZSYmdGhpcy5zdHJva2UudG9MaXZlJiZ0LnB1c2godGhpcy5zdHJva2UudG9TVkcodGhpcywhMSkpLHRoaXMuc2hhZG93JiZ0LnB1c2godGhpcy5zaGFkb3cudG9TVkcodGhpcykpLHR9fSl9KCksZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxyKXt2YXIgbj17fSxzPSEwO3IuZm9yRWFjaChmdW5jdGlvbihlKXtuW2VdPXRbZV19KSxpKHRbZV0sbixzKX1mdW5jdGlvbiBlKHQsaSl7aWYoIWZhYnJpYy5pc0xpa2VseU5vZGUmJnQgaW5zdGFuY2VvZiBFbGVtZW50KXJldHVybiB0PT09aTtpZih0IGluc3RhbmNlb2YgQXJyYXkpe2lmKHQubGVuZ3RoIT09aS5sZW5ndGgpcmV0dXJuITE7dmFyIHI9aS5jb25jYXQoKS5zb3J0KCksbj10LmNvbmNhdCgpLnNvcnQoKTtyZXR1cm4hbi5zb21lKGZ1bmN0aW9uKHQsaSl7cmV0dXJuIWUocltpXSx0KX0pfWlmKHQgaW5zdGFuY2VvZiBPYmplY3Qpe2Zvcih2YXIgcyBpbiB0KWlmKCFlKHRbc10saVtzXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHQ9PT1pfXZhciBpPWZhYnJpYy51dGlsLm9iamVjdC5leHRlbmQ7ZmFicmljLnV0aWwub2JqZWN0LmV4dGVuZChmYWJyaWMuT2JqZWN0LnByb3RvdHlwZSx7aGFzU3RhdGVDaGFuZ2VkOmZ1bmN0aW9uKCl7cmV0dXJuIWUodGhpcy5vcmlnaW5hbFN0YXRlLHRoaXMpfSxzYXZlU3RhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHQodGhpcywib3JpZ2luYWxTdGF0ZSIsdGhpcy5zdGF0ZVByb3BlcnRpZXMpLGUmJmUuc3RhdGVQcm9wZXJ0aWVzJiZ0KHRoaXMsIm9yaWdpbmFsU3RhdGUiLGUuc3RhdGVQcm9wZXJ0aWVzKSx0aGlzfSxzZXR1cFN0YXRlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9yaWdpbmFsU3RhdGU9e30sdGhpcy5zYXZlU3RhdGUodCksdGhpc319KX0oKSxmdW5jdGlvbigpe3ZhciB0PWZhYnJpYy51dGlsLmRlZ3JlZXNUb1JhZGlhbnMsZT1mdW5jdGlvbigpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgR192bWxDYW52YXNNYW5hZ2VyfTtmYWJyaWMudXRpbC5vYmplY3QuZXh0ZW5kKGZhYnJpYy5PYmplY3QucHJvdG90eXBlLHtfY29udHJvbHNWaXNpYmlsaXR5Om51bGwsX2ZpbmRUYXJnZXRDb3JuZXI6ZnVuY3Rpb24odCl7aWYoIXRoaXMuaGFzQ29udHJvbHN8fCF0aGlzLmFjdGl2ZSlyZXR1cm4hMTt2YXIgZSxpLHI9dC54LG49dC55O3RoaXMuX19jb3JuZXI9MDtmb3IodmFyIHMgaW4gdGhpcy5vQ29vcmRzKWlmKHRoaXMuaXNDb250cm9sVmlzaWJsZShzKSYmKCJtdHIiIT09c3x8dGhpcy5oYXNSb3RhdGluZ1BvaW50KSYmKCF0aGlzLmdldCgibG9ja1VuaVNjYWxpbmciKXx8Im10IiE9PXMmJiJtciIhPT1zJiYibWIiIT09cyYmIm1sIiE9PXMpJiYoaT10aGlzLl9nZXRJbWFnZUxpbmVzKHRoaXMub0Nvb3Jkc1tzXS5jb3JuZXIpLGU9dGhpcy5fZmluZENyb3NzUG9pbnRzKHt4OnIseTpufSxpKSwwIT09ZSYmZSUyPT09MSkpcmV0dXJuIHRoaXMuX19jb3JuZXI9cyxzO3JldHVybiExfSxfc2V0Q29ybmVyQ29vcmRzOmZ1bmN0aW9uKCl7dmFyIGUsaSxyPXRoaXMub0Nvb3JkcyxuPXQoNDUtdGhpcy5hbmdsZSkscz0uNzA3MTA2KnRoaXMuY29ybmVyU2l6ZSxvPXMqTWF0aC5jb3MobiksYT1zKk1hdGguc2luKG4pO2Zvcih2YXIgaCBpbiByKWU9cltoXS54LGk9cltoXS55LHJbaF0uY29ybmVyPXt0bDp7eDplLWEseTppLW99LHRyOnt4OmUrbyx5OmktYX0sYmw6e3g6ZS1vLHk6aSthfSxicjp7eDplK2EseTppK299fX0sX2dldE5vblRyYW5zZm9ybWVkRGltZW5zaW9uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3Ryb2tlV2lkdGgsZT10aGlzLndpZHRoLGk9dGhpcy5oZWlnaHQscj0hMCxuPSEwO3JldHVybiJsaW5lIj09PXRoaXMudHlwZSYmImJ1dHQiPT09dGhpcy5zdHJva2VMaW5lQ2FwJiYobj1lLHI9aSksbiYmKGkrPWk8MD8tdDp0KSxyJiYoZSs9ZTwwPy10OnQpLHt4OmUseTppfX0sX2dldFRyYW5zZm9ybWVkRGltZW5zaW9uczpmdW5jdGlvbih0LGUpeyJ1bmRlZmluZWQiPT10eXBlb2YgdCYmKHQ9dGhpcy5za2V3WCksInVuZGVmaW5lZCI9PXR5cGVvZiBlJiYoZT10aGlzLnNrZXdZKTt2YXIgaSxyLG49dGhpcy5fZ2V0Tm9uVHJhbnNmb3JtZWREaW1lbnNpb25zKCkscz1uLngvMixvPW4ueS8yLGE9W3t4Oi1zLHk6LW99LHt4OnMseTotb30se3g6LXMseTpvfSx7eDpzLHk6b31dLGg9dGhpcy5fY2FsY0RpbWVuc2lvbnNUcmFuc2Zvcm1NYXRyaXgodCxlLCExKTtmb3IoaT0wO2k8YS5sZW5ndGg7aSsrKWFbaV09ZmFicmljLnV0aWwudHJhbnNmb3JtUG9pbnQoYVtpXSxoKTtyZXR1cm4gcj1mYWJyaWMudXRpbC5tYWtlQm91bmRpbmdCb3hGcm9tUG9pbnRzKGEpLHt4OnIud2lkdGgseTpyLmhlaWdodH19LF9jYWxjdWxhdGVDdXJyZW50RGltZW5zaW9uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0Vmlld3BvcnRUcmFuc2Zvcm0oKSxlPXRoaXMuX2dldFRyYW5zZm9ybWVkRGltZW5zaW9ucygpLGk9ZS54LHI9ZS55LG49ZmFicmljLnV0aWwudHJhbnNmb3JtUG9pbnQobmV3IGZhYnJpYy5Qb2ludChpLHIpLHQsITApO3JldHVybiBuLnNjYWxhckFkZCgyKnRoaXMucGFkZGluZyl9LGRyYXdTZWxlY3Rpb25CYWNrZ3JvdW5kOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLnNlbGVjdGlvbkJhY2tncm91bmRDb2xvcnx8dGhpcy5ncm91cHx8IXRoaXMuYWN0aXZlKXJldHVybiB0aGlzO2Uuc2F2ZSgpO3ZhciBpPXRoaXMuZ2V0Q2VudGVyUG9pbnQoKSxyPXRoaXMuX2NhbGN1bGF0ZUN1cnJlbnREaW1lbnNpb25zKCksbj10aGlzLmNhbnZhcy52aWV3cG9ydFRyYW5zZm9ybTtyZXR1cm4gZS50cmFuc2xhdGUoaS54LGkueSksZS5zY2FsZSgxL25bMF0sMS9uWzNdKSxlLnJvdGF0ZSh0KHRoaXMuYW5nbGUpKSxlLmZpbGxTdHlsZT10aGlzLnNlbGVjdGlvbkJhY2tncm91bmRDb2xvcixlLmZpbGxSZWN0KC1yLngvMiwtci55LzIsci54LHIueSksZS5yZXN0b3JlKCksdGhpc30sZHJhd0JvcmRlcnM6ZnVuY3Rpb24odCl7aWYoIXRoaXMuaGFzQm9yZGVycylyZXR1cm4gdGhpczt2YXIgZT10aGlzLl9jYWxjdWxhdGVDdXJyZW50RGltZW5zaW9ucygpLGk9MS90aGlzLmJvcmRlclNjYWxlRmFjdG9yLHI9ZS54K2ksbj1lLnkraTtpZih0LnNhdmUoKSx0LnN0cm9rZVN0eWxlPXRoaXMuYm9yZGVyQ29sb3IsdGhpcy5fc2V0TGluZURhc2godCx0aGlzLmJvcmRlckRhc2hBcnJheSxudWxsKSx0LnN0cm9rZVJlY3QoLXIvMiwtbi8yLHIsbiksdGhpcy5oYXNSb3RhdGluZ1BvaW50JiZ0aGlzLmlzQ29udHJvbFZpc2libGUoIm10ciIpJiYhdGhpcy5nZXQoImxvY2tSb3RhdGlvbiIpJiZ0aGlzLmhhc0NvbnRyb2xzKXt2YXIgcz0tbi8yO3QuYmVnaW5QYXRoKCksdC5tb3ZlVG8oMCxzKSx0LmxpbmVUbygwLHMtdGhpcy5yb3RhdGluZ1BvaW50T2Zmc2V0KSx0LmNsb3NlUGF0aCgpLHQuc3Ryb2tlKCl9cmV0dXJuIHQucmVzdG9yZSgpLHRoaXN9LGRyYXdCb3JkZXJzSW5Hcm91cDpmdW5jdGlvbih0LGUpe2lmKCF0aGlzLmhhc0JvcmRlcnMpcmV0dXJuIHRoaXM7dmFyIGk9dGhpcy5fZ2V0Tm9uVHJhbnNmb3JtZWREaW1lbnNpb25zKCkscj1mYWJyaWMudXRpbC5jdXN0b21UcmFuc2Zvcm1NYXRyaXgoZS5zY2FsZVgsZS5zY2FsZVksZS5za2V3WCksbj1mYWJyaWMudXRpbC50cmFuc2Zvcm1Qb2ludChpLHIpLHM9MS90aGlzLmJvcmRlclNjYWxlRmFjdG9yLG89bi54K3MrMip0aGlzLnBhZGRpbmcsYT1uLnkrcysyKnRoaXMucGFkZGluZztyZXR1cm4gdC5zYXZlKCksdGhpcy5fc2V0TGluZURhc2godCx0aGlzLmJvcmRlckRhc2hBcnJheSxudWxsKSx0LnN0cm9rZVN0eWxlPXRoaXMuYm9yZGVyQ29sb3IsdC5zdHJva2VSZWN0KC1vLzIsLWEvMixvLGEpLHQucmVzdG9yZSgpLHRoaXN9LGRyYXdDb250cm9sczpmdW5jdGlvbih0KXtpZighdGhpcy5oYXNDb250cm9scylyZXR1cm4gdGhpczt2YXIgZT10aGlzLl9jYWxjdWxhdGVDdXJyZW50RGltZW5zaW9ucygpLGk9ZS54LHI9ZS55LG49dGhpcy5jb3JuZXJTaXplLHM9LShpK24pLzIsbz0tKHIrbikvMixhPXRoaXMudHJhbnNwYXJlbnRDb3JuZXJzPyJzdHJva2UiOiJmaWxsIjtyZXR1cm4gdC5zYXZlKCksdC5zdHJva2VTdHlsZT10LmZpbGxTdHlsZT10aGlzLmNvcm5lckNvbG9yLHRoaXMudHJhbnNwYXJlbnRDb3JuZXJzfHwodC5zdHJva2VTdHlsZT10aGlzLmNvcm5lclN0cm9rZUNvbG9yKSx0aGlzLl9zZXRMaW5lRGFzaCh0LHRoaXMuY29ybmVyRGFzaEFycmF5LG51bGwpLHRoaXMuX2RyYXdDb250cm9sKCJ0bCIsdCxhLHMsbyksdGhpcy5fZHJhd0NvbnRyb2woInRyIix0LGEscytpLG8pLHRoaXMuX2RyYXdDb250cm9sKCJibCIsdCxhLHMsbytyKSx0aGlzLl9kcmF3Q29udHJvbCgiYnIiLHQsYSxzK2ksbytyKSx0aGlzLmdldCgibG9ja1VuaVNjYWxpbmciKXx8KHRoaXMuX2RyYXdDb250cm9sKCJtdCIsdCxhLHMraS8yLG8pLHRoaXMuX2RyYXdDb250cm9sKCJtYiIsdCxhLHMraS8yLG8rciksdGhpcy5fZHJhd0NvbnRyb2woIm1yIix0LGEscytpLG8rci8yKSx0aGlzLl9kcmF3Q29udHJvbCgibWwiLHQsYSxzLG8rci8yKSksdGhpcy5oYXNSb3RhdGluZ1BvaW50JiZ0aGlzLl9kcmF3Q29udHJvbCgibXRyIix0LGEscytpLzIsby10aGlzLnJvdGF0aW5nUG9pbnRPZmZzZXQpLHQucmVzdG9yZSgpLHRoaXN9LF9kcmF3Q29udHJvbDpmdW5jdGlvbih0LGkscixuLHMpe2lmKHRoaXMuaXNDb250cm9sVmlzaWJsZSh0KSl7dmFyIG89dGhpcy5jb3JuZXJTaXplLGE9IXRoaXMudHJhbnNwYXJlbnRDb3JuZXJzJiZ0aGlzLmNvcm5lclN0cm9rZUNvbG9yO3N3aXRjaCh0aGlzLmNvcm5lclN0eWxlKXtjYXNlImNpcmNsZSI6aS5iZWdpblBhdGgoKSxpLmFyYyhuK28vMixzK28vMixvLzIsMCwyKk1hdGguUEksITEpLGlbcl0oKSxhJiZpLnN0cm9rZSgpO2JyZWFrO2RlZmF1bHQ6ZSgpfHx0aGlzLnRyYW5zcGFyZW50Q29ybmVyc3x8aS5jbGVhclJlY3QobixzLG8sbyksaVtyKyJSZWN0Il0obixzLG8sbyksYSYmaS5zdHJva2VSZWN0KG4scyxvLG8pfX19LGlzQ29udHJvbFZpc2libGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2dldENvbnRyb2xzVmlzaWJpbGl0eSgpW3RdfSxzZXRDb250cm9sVmlzaWJsZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9nZXRDb250cm9sc1Zpc2liaWxpdHkoKVt0XT1lLHRoaXN9LHNldENvbnRyb2xzVmlzaWJpbGl0eTpmdW5jdGlvbih0KXt0fHwodD17fSk7Zm9yKHZhciBlIGluIHQpdGhpcy5zZXRDb250cm9sVmlzaWJsZShlLHRbZV0pO3JldHVybiB0aGlzfSxfZ2V0Q29udHJvbHNWaXNpYmlsaXR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRyb2xzVmlzaWJpbGl0eXx8KHRoaXMuX2NvbnRyb2xzVmlzaWJpbGl0eT17dGw6ITAsdHI6ITAsYnI6ITAsYmw6ITAsbWw6ITAsbXQ6ITAsbXI6ITAsbWI6ITAsbXRyOiEwfSksdGhpcy5fY29udHJvbHNWaXNpYmlsaXR5fX0pfSgpLGZhYnJpYy51dGlsLm9iamVjdC5leHRlbmQoZmFicmljLlN0YXRpY0NhbnZhcy5wcm90b3R5cGUse0ZYX0RVUkFUSU9OOjUwMCxmeENlbnRlck9iamVjdEg6ZnVuY3Rpb24odCxlKXtlPWV8fHt9O3ZhciBpPWZ1bmN0aW9uKCl7fSxyPWUub25Db21wbGV0ZXx8aSxuPWUub25DaGFuZ2V8fGkscz10aGlzO3JldHVybiBmYWJyaWMudXRpbC5hbmltYXRlKHtzdGFydFZhbHVlOnQuZ2V0KCJsZWZ0IiksZW5kVmFsdWU6dGhpcy5nZXRDZW50ZXIoKS5sZWZ0LGR1cmF0aW9uOnRoaXMuRlhfRFVSQVRJT04sb25DaGFuZ2U6ZnVuY3Rpb24oZSl7dC5zZXQoImxlZnQiLGUpLHMucmVuZGVyQWxsKCksbigpfSxvbkNvbXBsZXRlOmZ1bmN0aW9uKCl7dC5zZXRDb29yZHMoKSxyKCl9fSksdGhpc30sZnhDZW50ZXJPYmplY3RWOmZ1bmN0aW9uKHQsZSl7ZT1lfHx7fTt2YXIgaT1mdW5jdGlvbigpe30scj1lLm9uQ29tcGxldGV8fGksbj1lLm9uQ2hhbmdlfHxpLHM9dGhpcztyZXR1cm4gZmFicmljLnV0aWwuYW5pbWF0ZSh7c3RhcnRWYWx1ZTp0LmdldCgidG9wIiksZW5kVmFsdWU6dGhpcy5nZXRDZW50ZXIoKS50b3AsZHVyYXRpb246dGhpcy5GWF9EVVJBVElPTixvbkNoYW5nZTpmdW5jdGlvbihlKXt0LnNldCgidG9wIixlKSxzLnJlbmRlckFsbCgpLG4oKX0sb25Db21wbGV0ZTpmdW5jdGlvbigpe3Quc2V0Q29vcmRzKCkscigpfX0pLHRoaXN9LGZ4UmVtb3ZlOmZ1bmN0aW9uKHQsZSl7ZT1lfHx7fTt2YXIgaT1mdW5jdGlvbigpe30scj1lLm9uQ29tcGxldGV8fGksbj1lLm9uQ2hhbmdlfHxpLHM9dGhpcztyZXR1cm4gZmFicmljLnV0aWwuYW5pbWF0ZSh7c3RhcnRWYWx1ZTp0LmdldCgib3BhY2l0eSIpLGVuZFZhbHVlOjAsZHVyYXRpb246dGhpcy5GWF9EVVJBVElPTixvblN0YXJ0OmZ1bmN0aW9uKCl7dC5zZXQoImFjdGl2ZSIsITEpfSxvbkNoYW5nZTpmdW5jdGlvbihlKXt0LnNldCgib3BhY2l0eSIsZSkscy5yZW5kZXJBbGwoKSxuKCl9LG9uQ29tcGxldGU6ZnVuY3Rpb24oKXtzLnJlbW92ZSh0KSxyKCl9fSksdGhpc319KSxmYWJyaWMudXRpbC5vYmplY3QuZXh0ZW5kKGZhYnJpYy5PYmplY3QucHJvdG90eXBlLHthbmltYXRlOmZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdJiYib2JqZWN0Ij09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIHQsZSxpPVtdO2Zvcih0IGluIGFyZ3VtZW50c1swXSlpLnB1c2godCk7Zm9yKHZhciByPTAsbj1pLmxlbmd0aDtyPG47cisrKXQ9aVtyXSxlPXIhPT1uLTEsdGhpcy5fYW5pbWF0ZSh0LGFyZ3VtZW50c1swXVt0XSxhcmd1bWVudHNbMV0sZSl9ZWxzZSB0aGlzLl9hbmltYXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdGhpc30sX2FuaW1hdGU6ZnVuY3Rpb24odCxlLGkscil7dmFyIG4scz10aGlzO2U9ZS50b1N0cmluZygpLGk9aT9mYWJyaWMudXRpbC5vYmplY3QuY2xvbmUoaSk6e30sfnQuaW5kZXhPZigiLiIpJiYobj10LnNwbGl0KCIuIikpO3ZhciBvPW4/dGhpcy5nZXQoblswXSlbblsxXV06dGhpcy5nZXQodCk7ImZyb20iaW4gaXx8KGkuZnJvbT1vKSxlPX5lLmluZGV4T2YoIj0iKT9vK3BhcnNlRmxvYXQoZS5yZXBsYWNlKCI9IiwiIikpOnBhcnNlRmxvYXQoZSksZmFicmljLnV0aWwuYW5pbWF0ZSh7c3RhcnRWYWx1ZTppLmZyb20sZW5kVmFsdWU6ZSxieVZhbHVlOmkuYnksZWFzaW5nOmkuZWFzaW5nLGR1cmF0aW9uOmkuZHVyYXRpb24sYWJvcnQ6aS5hYm9ydCYmZnVuY3Rpb24oKXtyZXR1cm4gaS5hYm9ydC5jYWxsKHMpfSxvbkNoYW5nZTpmdW5jdGlvbihlKXtuP3NbblswXV1bblsxXV09ZTpzLnNldCh0LGUpLHJ8fGkub25DaGFuZ2UmJmkub25DaGFuZ2UoKX0sb25Db21wbGV0ZTpmdW5jdGlvbigpe3J8fChzLnNldENvb3JkcygpLGkub25Db21wbGV0ZSYmaS5vbkNvbXBsZXRlKCkpfX0pfX0pLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKHQsZSl7dmFyIGk9dC5vcmlnaW4scj10LmF4aXMxLG49dC5heGlzMixzPXQuZGltZW5zaW9uLG89ZS5uZWFyZXN0LGE9ZS5jZW50ZXIsaD1lLmZhcnRoZXN0O3JldHVybiBmdW5jdGlvbigpe3N3aXRjaCh0aGlzLmdldChpKSl7Y2FzZSBvOnJldHVybiBNYXRoLm1pbih0aGlzLmdldChyKSx0aGlzLmdldChuKSk7Y2FzZSBhOnJldHVybiBNYXRoLm1pbih0aGlzLmdldChyKSx0aGlzLmdldChuKSkrLjUqdGhpcy5nZXQocyk7Y2FzZSBoOnJldHVybiBNYXRoLm1heCh0aGlzLmdldChyKSx0aGlzLmdldChuKSl9fX12YXIgaT10LmZhYnJpY3x8KHQuZmFicmljPXt9KSxyPWkudXRpbC5vYmplY3QuZXh0ZW5kLG49e3gxOjEseDI6MSx5MToxLHkyOjF9LHM9aS5TdGF0aWNDYW52YXMuc3VwcG9ydHMoInNldExpbmVEYXNoIik7cmV0dXJuIGkuTGluZT92b2lkIGkud2FybigiZmFicmljLkxpbmUgaXMgYWxyZWFkeSBkZWZpbmVkIik6KGkuTGluZT1pLnV0aWwuY3JlYXRlQ2xhc3MoaS5PYmplY3Qse3R5cGU6ImxpbmUiLHgxOjAseTE6MCx4MjowLHkyOjAsaW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe2U9ZXx8e30sdHx8KHQ9WzAsMCwwLDBdKSx0aGlzLmNhbGxTdXBlcigiaW5pdGlhbGl6ZSIsZSksdGhpcy5zZXQoIngxIix0WzBdKSx0aGlzLnNldCgieTEiLHRbMV0pLHRoaXMuc2V0KCJ4MiIsdFsyXSksdGhpcy5zZXQoInkyIix0WzNdKSx0aGlzLl9zZXRXaWR0aEhlaWdodChlKX0sX3NldFdpZHRoSGVpZ2h0OmZ1bmN0aW9uKHQpe3R8fCh0PXt9KSx0aGlzLndpZHRoPU1hdGguYWJzKHRoaXMueDItdGhpcy54MSksdGhpcy5oZWlnaHQ9TWF0aC5hYnModGhpcy55Mi10aGlzLnkxKSx0aGlzLmxlZnQ9ImxlZnQiaW4gdD90LmxlZnQ6dGhpcy5fZ2V0TGVmdFRvT3JpZ2luWCgpLHRoaXMudG9wPSJ0b3AiaW4gdD90LnRvcDp0aGlzLl9nZXRUb3BUb09yaWdpblkoKX0sX3NldDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNhbGxTdXBlcigiX3NldCIsdCxlKSwidW5kZWZpbmVkIiE9dHlwZW9mIG5bdF0mJnRoaXMuX3NldFdpZHRoSGVpZ2h0KCksdGhpc30sX2dldExlZnRUb09yaWdpblg6ZSh7b3JpZ2luOiJvcmlnaW5YIixheGlzMToieDEiLGF4aXMyOiJ4MiIsZGltZW5zaW9uOiJ3aWR0aCJ9LHtuZWFyZXN0OiJsZWZ0IixjZW50ZXI6ImNlbnRlciIsZmFydGhlc3Q6InJpZ2h0In0pLF9nZXRUb3BUb09yaWdpblk6ZSh7b3JpZ2luOiJvcmlnaW5ZIixheGlzMToieTEiLGF4aXMyOiJ5MiIsZGltZW5zaW9uOiJoZWlnaHQifSx7bmVhcmVzdDoidG9wIixjZW50ZXI6ImNlbnRlciIsZmFydGhlc3Q6ImJvdHRvbSJ9KSxfcmVuZGVyOmZ1bmN0aW9uKHQsZSl7aWYodC5iZWdpblBhdGgoKSxlKXt2YXIgaT10aGlzLmdldENlbnRlclBvaW50KCk7dC50cmFuc2xhdGUoaS54LXRoaXMuc3Ryb2tlV2lkdGgvMixpLnktdGhpcy5zdHJva2VXaWR0aC8yKX1pZighdGhpcy5zdHJva2VEYXNoQXJyYXl8fHRoaXMuc3Ryb2tlRGFzaEFycmF5JiZzKXt2YXIgcj10aGlzLmNhbGNMaW5lUG9pbnRzKCk7dC5tb3ZlVG8oci54MSxyLnkxKSx0LmxpbmVUbyhyLngyLHIueTIpfXQubGluZVdpZHRoPXRoaXMuc3Ryb2tlV2lkdGg7dmFyIG49dC5zdHJva2VTdHlsZTt0LnN0cm9rZVN0eWxlPXRoaXMuc3Ryb2tlfHx0LmZpbGxTdHlsZSx0aGlzLnN0cm9rZSYmdGhpcy5fcmVuZGVyU3Ryb2tlKHQpLHQuc3Ryb2tlU3R5bGU9bn0sX3JlbmRlckRhc2hlZFN0cm9rZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNhbGNMaW5lUG9pbnRzKCk7dC5iZWdpblBhdGgoKSxpLnV0aWwuZHJhd0Rhc2hlZExpbmUodCxlLngxLGUueTEsZS54MixlLnkyLHRoaXMuc3Ryb2tlRGFzaEFycmF5KSx0LmNsb3NlUGF0aCgpfSx0b09iamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gcih0aGlzLmNhbGxTdXBlcigidG9PYmplY3QiLHQpLHRoaXMuY2FsY0xpbmVQb2ludHMoKSl9LGNhbGNMaW5lUG9pbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy54MTw9dGhpcy54Mj8tMToxLGU9dGhpcy55MTw9dGhpcy55Mj8tMToxLGk9dCp0aGlzLndpZHRoKi41LHI9ZSp0aGlzLmhlaWdodCouNSxuPXQqdGhpcy53aWR0aCotLjUscz1lKnRoaXMuaGVpZ2h0Ki0uNTtyZXR1cm57eDE6aSx4MjpuLHkxOnIseTI6c319LHRvU1ZHOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NyZWF0ZUJhc2VTVkdNYXJrdXAoKSxpPXt4MTp0aGlzLngxLHgyOnRoaXMueDIseTE6dGhpcy55MSx5Mjp0aGlzLnkyfTtyZXR1cm4gdGhpcy5ncm91cCYmInBhdGgtZ3JvdXAiPT09dGhpcy5ncm91cC50eXBlfHwoaT10aGlzLmNhbGNMaW5lUG9pbnRzKCkpLGUucHVzaCgiPGxpbmUgIix0aGlzLmdldFN2Z0lkKCksJ3gxPSInLGkueDEsJyIgeTE9IicsaS55MSwnIiB4Mj0iJyxpLngyLCciIHkyPSInLGkueTIsJyIgc3R5bGU9IicsdGhpcy5nZXRTdmdTdHlsZXMoKSwnIiB0cmFuc2Zvcm09IicsdGhpcy5nZXRTdmdUcmFuc2Zvcm0oKSx0aGlzLmdldFN2Z1RyYW5zZm9ybU1hdHJpeCgpLCciLz5cbicpLHQ/dChlLmpvaW4oIiIpKTplLmpvaW4oIiIpfSxjb21wbGV4aXR5OmZ1bmN0aW9uKCl7cmV0dXJuIDF9fSksaS5MaW5lLkFUVFJJQlVURV9OQU1FUz1pLlNIQVJFRF9BVFRSSUJVVEVTLmNvbmNhdCgieDEgeTEgeDIgeTIiLnNwbGl0KCIgIikpLGkuTGluZS5mcm9tRWxlbWVudD1mdW5jdGlvbih0LGUpe3ZhciBuPWkucGFyc2VBdHRyaWJ1dGVzKHQsaS5MaW5lLkFUVFJJQlVURV9OQU1FUykscz1bbi54MXx8MCxuLnkxfHwwLG4ueDJ8fDAsbi55Mnx8MF07cmV0dXJuIG5ldyBpLkxpbmUocyxyKG4sZSkpfSx2b2lkKGkuTGluZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9W3QueDEsdC55MSx0LngyLHQueTJdLG49bmV3IGkuTGluZShyLHQpO3JldHVybiBlJiZlKG4pLG59KSl9KCJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnRoaXMpLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKHQpe3JldHVybiJyYWRpdXMiaW4gdCYmdC5yYWRpdXM+PTB9dmFyIGk9dC5mYWJyaWN8fCh0LmZhYnJpYz17fSkscj1NYXRoLlBJLG49aS51dGlsLm9iamVjdC5leHRlbmQ7cmV0dXJuIGkuQ2lyY2xlP3ZvaWQgaS53YXJuKCJmYWJyaWMuQ2lyY2xlIGlzIGFscmVhZHkgZGVmaW5lZC4iKTooaS5DaXJjbGU9aS51dGlsLmNyZWF0ZUNsYXNzKGkuT2JqZWN0LHt0eXBlOiJjaXJjbGUiLHJhZGl1czowLHN0YXJ0QW5nbGU6MCxlbmRBbmdsZToyKnIsaW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0PXR8fHt9LHRoaXMuY2FsbFN1cGVyKCJpbml0aWFsaXplIix0KSx0aGlzLnNldCgicmFkaXVzIix0LnJhZGl1c3x8MCksdGhpcy5zdGFydEFuZ2xlPXQuc3RhcnRBbmdsZXx8dGhpcy5zdGFydEFuZ2xlLHRoaXMuZW5kQW5nbGU9dC5lbmRBbmdsZXx8dGhpcy5lbmRBbmdsZX0sX3NldDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNhbGxTdXBlcigiX3NldCIsdCxlKSwicmFkaXVzIj09PXQmJnRoaXMuc2V0UmFkaXVzKGUpLHRoaXN9LHRvT2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMuY2FsbFN1cGVyKCJ0b09iamVjdCIsdCkse3JhZGl1czp0aGlzLmdldCgicmFkaXVzIiksc3RhcnRBbmdsZTp0aGlzLnN0YXJ0QW5nbGUsZW5kQW5nbGU6dGhpcy5lbmRBbmdsZX0pfSx0b1NWRzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jcmVhdGVCYXNlU1ZHTWFya3VwKCksaT0wLG49MCxzPSh0aGlzLmVuZEFuZ2xlLXRoaXMuc3RhcnRBbmdsZSklKDIqcik7aWYoMD09PXMpdGhpcy5ncm91cCYmInBhdGgtZ3JvdXAiPT09dGhpcy5ncm91cC50eXBlJiYoaT10aGlzLmxlZnQrdGhpcy5yYWRpdXMsbj10aGlzLnRvcCt0aGlzLnJhZGl1cyksZS5wdXNoKCI8Y2lyY2xlICIsdGhpcy5nZXRTdmdJZCgpLCdjeD0iJytpKyciIGN5PSInK24rJyIgJywncj0iJyx0aGlzLnJhZGl1cywnIiBzdHlsZT0iJyx0aGlzLmdldFN2Z1N0eWxlcygpLCciIHRyYW5zZm9ybT0iJyx0aGlzLmdldFN2Z1RyYW5zZm9ybSgpLCIgIix0aGlzLmdldFN2Z1RyYW5zZm9ybU1hdHJpeCgpLCciLz5cbicpO2Vsc2V7dmFyIG89TWF0aC5jb3ModGhpcy5zdGFydEFuZ2xlKSp0aGlzLnJhZGl1cyxhPU1hdGguc2luKHRoaXMuc3RhcnRBbmdsZSkqdGhpcy5yYWRpdXMsaD1NYXRoLmNvcyh0aGlzLmVuZEFuZ2xlKSp0aGlzLnJhZGl1cyxjPU1hdGguc2luKHRoaXMuZW5kQW5nbGUpKnRoaXMucmFkaXVzLGw9cz5yPyIxIjoiMCI7ZS5wdXNoKCc8cGF0aCBkPSJNICcrbysiICIrYSwiIEEgIit0aGlzLnJhZGl1cysiICIrdGhpcy5yYWRpdXMsIiAwICIsK2wrIiAxIiwiICIraCsiICIrYywnIiBzdHlsZT0iJyx0aGlzLmdldFN2Z1N0eWxlcygpLCciIHRyYW5zZm9ybT0iJyx0aGlzLmdldFN2Z1RyYW5zZm9ybSgpLCIgIix0aGlzLmdldFN2Z1RyYW5zZm9ybU1hdHJpeCgpLCciLz5cbicpfXJldHVybiB0P3QoZS5qb2luKCIiKSk6ZS5qb2luKCIiKX0sX3JlbmRlcjpmdW5jdGlvbih0LGUpe3QuYmVnaW5QYXRoKCksdC5hcmMoZT90aGlzLmxlZnQrdGhpcy5yYWRpdXM6MCxlP3RoaXMudG9wK3RoaXMucmFkaXVzOjAsdGhpcy5yYWRpdXMsdGhpcy5zdGFydEFuZ2xlLHRoaXMuZW5kQW5nbGUsITEpLHRoaXMuX3JlbmRlckZpbGwodCksdGhpcy5fcmVuZGVyU3Ryb2tlKHQpfSxnZXRSYWRpdXNYOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KCJyYWRpdXMiKSp0aGlzLmdldCgic2NhbGVYIil9LGdldFJhZGl1c1k6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoInJhZGl1cyIpKnRoaXMuZ2V0KCJzY2FsZVkiKX0sc2V0UmFkaXVzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJhZGl1cz10LHRoaXMuc2V0KCJ3aWR0aCIsMip0KS5zZXQoImhlaWdodCIsMip0KX0sY29tcGxleGl0eTpmdW5jdGlvbigpe3JldHVybiAxfX0pLGkuQ2lyY2xlLkFUVFJJQlVURV9OQU1FUz1pLlNIQVJFRF9BVFRSSUJVVEVTLmNvbmNhdCgiY3ggY3kgciIuc3BsaXQoIiAiKSksaS5DaXJjbGUuZnJvbUVsZW1lbnQ9ZnVuY3Rpb24odCxyKXtyfHwocj17fSk7dmFyIHM9aS5wYXJzZUF0dHJpYnV0ZXModCxpLkNpcmNsZS5BVFRSSUJVVEVfTkFNRVMpO2lmKCFlKHMpKXRocm93IG5ldyBFcnJvcigidmFsdWUgb2YgYHJgIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBhbmQgY2FuIG5vdCBiZSBuZWdhdGl2ZSIpO3MubGVmdD1zLmxlZnR8fDAscy50b3A9cy50b3B8fDA7dmFyIG89bmV3IGkuQ2lyY2xlKG4ocyxyKSk7cmV0dXJuIG8ubGVmdC09by5yYWRpdXMsby50b3AtPW8ucmFkaXVzLG99LHZvaWQoaS5DaXJjbGUuZnJvbU9iamVjdD1mdW5jdGlvbih0LGUpe3ZhciByPW5ldyBpLkNpcmNsZSh0KTtyZXR1cm4gZSYmZShyKSxyfSkpfSgidW5kZWZpbmVkIiE9dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0aGlzKSxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGU9dC5mYWJyaWN8fCh0LmZhYnJpYz17fSk7cmV0dXJuIGUuVHJpYW5nbGU/dm9pZCBlLndhcm4oImZhYnJpYy5UcmlhbmdsZSBpcyBhbHJlYWR5IGRlZmluZWQiKTooZS5UcmlhbmdsZT1lLnV0aWwuY3JlYXRlQ2xhc3MoZS5PYmplY3Qse3R5cGU6InRyaWFuZ2xlIixpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3Q9dHx8e30sdGhpcy5jYWxsU3VwZXIoImluaXRpYWxpemUiLHQpLHRoaXMuc2V0KCJ3aWR0aCIsdC53aWR0aHx8MTAwKS5zZXQoImhlaWdodCIsdC5oZWlnaHR8fDEwMCl9LF9yZW5kZXI6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy53aWR0aC8yLGk9dGhpcy5oZWlnaHQvMjt0LmJlZ2luUGF0aCgpLHQubW92ZVRvKC1lLGkpLHQubGluZVRvKDAsLWkpLHQubGluZVRvKGUsaSksdC5jbG9zZVBhdGgoKSx0aGlzLl9yZW5kZXJGaWxsKHQpLHRoaXMuX3JlbmRlclN0cm9rZSh0KX0sX3JlbmRlckRhc2hlZFN0cm9rZTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLndpZHRoLzIscj10aGlzLmhlaWdodC8yO3QuYmVnaW5QYXRoKCksZS51dGlsLmRyYXdEYXNoZWRMaW5lKHQsLWksciwwLC1yLHRoaXMuc3Ryb2tlRGFzaEFycmF5KSxlLnV0aWwuZHJhd0Rhc2hlZExpbmUodCwwLC1yLGkscix0aGlzLnN0cm9rZURhc2hBcnJheSksZS51dGlsLmRyYXdEYXNoZWRMaW5lKHQsaSxyLC1pLHIsdGhpcy5zdHJva2VEYXNoQXJyYXkpLHQuY2xvc2VQYXRoKCl9LHRvU1ZHOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NyZWF0ZUJhc2VTVkdNYXJrdXAoKSxpPXRoaXMud2lkdGgvMixyPXRoaXMuaGVpZ2h0LzIsbj1bLWkrIiAiK3IsIjAgIistcixpKyIgIityXS5qb2luKCIsIik7cmV0dXJuIGUucHVzaCgiPHBvbHlnb24gIix0aGlzLmdldFN2Z0lkKCksJ3BvaW50cz0iJyxuLCciIHN0eWxlPSInLHRoaXMuZ2V0U3ZnU3R5bGVzKCksJyIgdHJhbnNmb3JtPSInLHRoaXMuZ2V0U3ZnVHJhbnNmb3JtKCksJyIvPicpLHQ/dChlLmpvaW4oIiIpKTplLmpvaW4oIiIpfSxjb21wbGV4aXR5OmZ1bmN0aW9uKCl7cmV0dXJuIDF9fSksdm9pZChlLlRyaWFuZ2xlLmZyb21PYmplY3Q9ZnVuY3Rpb24odCxpKXt2YXIgcj1uZXcgZS5UcmlhbmdsZSh0KTtyZXR1cm4gaSYmaShyKSxyfSkpfSgidW5kZWZpbmVkIiE9dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0aGlzKSxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGU9dC5mYWJyaWN8fCh0LmZhYnJpYz17fSksaT0yKk1hdGguUEkscj1lLnV0aWwub2JqZWN0LmV4dGVuZDtyZXR1cm4gZS5FbGxpcHNlP3ZvaWQgZS53YXJuKCJmYWJyaWMuRWxsaXBzZSBpcyBhbHJlYWR5IGRlZmluZWQuIik6KGUuRWxsaXBzZT1lLnV0aWwuY3JlYXRlQ2xhc3MoZS5PYmplY3Qse3R5cGU6ImVsbGlwc2UiLHJ4OjAscnk6MCxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3Q9dHx8e30sdGhpcy5jYWxsU3VwZXIoImluaXRpYWxpemUiLHQpLHRoaXMuc2V0KCJyeCIsdC5yeHx8MCksdGhpcy5zZXQoInJ5Iix0LnJ5fHwwKX0sX3NldDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0aGlzLmNhbGxTdXBlcigiX3NldCIsdCxlKSx0KXtjYXNlInJ4Ijp0aGlzLnJ4PWUsdGhpcy5zZXQoIndpZHRoIiwyKmUpO2JyZWFrO2Nhc2UicnkiOnRoaXMucnk9ZSx0aGlzLnNldCgiaGVpZ2h0IiwyKmUpfXJldHVybiB0aGlzfSxnZXRSeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldCgicngiKSp0aGlzLmdldCgic2NhbGVYIil9LGdldFJ5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KCJyeSIpKnRoaXMuZ2V0KCJzY2FsZVkiKX0sdG9PYmplY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHIodGhpcy5jYWxsU3VwZXIoInRvT2JqZWN0Iix0KSx7cng6dGhpcy5nZXQoInJ4Iikscnk6dGhpcy5nZXQoInJ5Iil9KX0sdG9TVkc6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY3JlYXRlQmFzZVNWR01hcmt1cCgpLGk9MCxyPTA7cmV0dXJuIHRoaXMuZ3JvdXAmJiJwYXRoLWdyb3VwIj09PXRoaXMuZ3JvdXAudHlwZSYmKGk9dGhpcy5sZWZ0K3RoaXMucngscj10aGlzLnRvcCt0aGlzLnJ5KSxlLnB1c2goIjxlbGxpcHNlICIsdGhpcy5nZXRTdmdJZCgpLCdjeD0iJyxpLCciIGN5PSInLHIsJyIgJywncng9IicsdGhpcy5yeCwnIiByeT0iJyx0aGlzLnJ5LCciIHN0eWxlPSInLHRoaXMuZ2V0U3ZnU3R5bGVzKCksJyIgdHJhbnNmb3JtPSInLHRoaXMuZ2V0U3ZnVHJhbnNmb3JtKCksdGhpcy5nZXRTdmdUcmFuc2Zvcm1NYXRyaXgoKSwnIi8+XG4nKSx0P3QoZS5qb2luKCIiKSk6ZS5qb2luKCIiKX0sX3JlbmRlcjpmdW5jdGlvbih0LGUpe3QuYmVnaW5QYXRoKCksdC5zYXZlKCksdC50cmFuc2Zvcm0oMSwwLDAsdGhpcy5yeS90aGlzLnJ4LDAsMCksdC5hcmMoZT90aGlzLmxlZnQrdGhpcy5yeDowLGU/KHRoaXMudG9wK3RoaXMucnkpKnRoaXMucngvdGhpcy5yeTowLHRoaXMucngsMCxpLCExKSx0LnJlc3RvcmUoKSx0aGlzLl9yZW5kZXJGaWxsKHQpLHRoaXMuX3JlbmRlclN0cm9rZSh0KX0sY29tcGxleGl0eTpmdW5jdGlvbigpe3JldHVybiAxfX0pLGUuRWxsaXBzZS5BVFRSSUJVVEVfTkFNRVM9ZS5TSEFSRURfQVRUUklCVVRFUy5jb25jYXQoImN4IGN5IHJ4IHJ5Ii5zcGxpdCgiICIpKSxlLkVsbGlwc2UuZnJvbUVsZW1lbnQ9ZnVuY3Rpb24odCxpKXtpfHwoaT17fSk7dmFyIG49ZS5wYXJzZUF0dHJpYnV0ZXModCxlLkVsbGlwc2UuQVRUUklCVVRFX05BTUVTKTtuLmxlZnQ9bi5sZWZ0fHwwLG4udG9wPW4udG9wfHwwO3ZhciBzPW5ldyBlLkVsbGlwc2UocihuLGkpKTtyZXR1cm4gcy50b3AtPXMucnkscy5sZWZ0LT1zLnJ4LHN9LHZvaWQoZS5FbGxpcHNlLmZyb21PYmplY3Q9ZnVuY3Rpb24odCxpKXt2YXIgcj1uZXcgZS5FbGxpcHNlKHQpO3JldHVybiBpJiZpKHIpLHJ9KSl9KCJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnRoaXMpLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10LmZhYnJpY3x8KHQuZmFicmljPXt9KSxpPWUudXRpbC5vYmplY3QuZXh0ZW5kO2lmKGUuUmVjdClyZXR1cm4gdm9pZCBlLndhcm4oImZhYnJpYy5SZWN0IGlzIGFscmVhZHkgZGVmaW5lZCIpO3ZhciByPWUuT2JqZWN0LnByb3RvdHlwZS5zdGF0ZVByb3BlcnRpZXMuY29uY2F0KCk7ci5wdXNoKCJyeCIsInJ5IiwieCIsInkiKSxlLlJlY3Q9ZS51dGlsLmNyZWF0ZUNsYXNzKGUuT2JqZWN0LHtzdGF0ZVByb3BlcnRpZXM6cix0eXBlOiJyZWN0IixyeDowLHJ5OjAsc3Ryb2tlRGFzaEFycmF5Om51bGwsaW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0PXR8fHt9LHRoaXMuY2FsbFN1cGVyKCJpbml0aWFsaXplIix0KSx0aGlzLl9pbml0UnhSeSgpfSxfaW5pdFJ4Unk6ZnVuY3Rpb24oKXt0aGlzLnJ4JiYhdGhpcy5yeT90aGlzLnJ5PXRoaXMucng6dGhpcy5yeSYmIXRoaXMucngmJih0aGlzLnJ4PXRoaXMucnkpfSxfcmVuZGVyOmZ1bmN0aW9uKHQsZSl7aWYoMT09PXRoaXMud2lkdGgmJjE9PT10aGlzLmhlaWdodClyZXR1cm4gdm9pZCB0LmZpbGxSZWN0KC0uNSwtLjUsMSwxKTt2YXIgaT10aGlzLnJ4P01hdGgubWluKHRoaXMucngsdGhpcy53aWR0aC8yKTowLHI9dGhpcy5yeT9NYXRoLm1pbih0aGlzLnJ5LHRoaXMuaGVpZ2h0LzIpOjAsbj10aGlzLndpZHRoLHM9dGhpcy5oZWlnaHQsbz1lP3RoaXMubGVmdDotdGhpcy53aWR0aC8yLGE9ZT90aGlzLnRvcDotdGhpcy5oZWlnaHQvMixoPTAhPT1pfHwwIT09cixjPS40NDc3MTUyNTAyO3QuYmVnaW5QYXRoKCksdC5tb3ZlVG8obytpLGEpLHQubGluZVRvKG8rbi1pLGEpLGgmJnQuYmV6aWVyQ3VydmVUbyhvK24tYyppLGEsbytuLGErYypyLG8rbixhK3IpLHQubGluZVRvKG8rbixhK3MtciksaCYmdC5iZXppZXJDdXJ2ZVRvKG8rbixhK3MtYypyLG8rbi1jKmksYStzLG8rbi1pLGErcyksdC5saW5lVG8obytpLGErcyksaCYmdC5iZXppZXJDdXJ2ZVRvKG8rYyppLGErcyxvLGErcy1jKnIsbyxhK3MtciksdC5saW5lVG8obyxhK3IpLGgmJnQuYmV6aWVyQ3VydmVUbyhvLGErYypyLG8rYyppLGEsbytpLGEpLHQuY2xvc2VQYXRoKCksdGhpcy5fcmVuZGVyRmlsbCh0KSx0aGlzLl9yZW5kZXJTdHJva2UodCl9LF9yZW5kZXJEYXNoZWRTdHJva2U6ZnVuY3Rpb24odCl7dmFyIGk9LXRoaXMud2lkdGgvMixyPS10aGlzLmhlaWdodC8yLG49dGhpcy53aWR0aCxzPXRoaXMuaGVpZ2h0O3QuYmVnaW5QYXRoKCksZS51dGlsLmRyYXdEYXNoZWRMaW5lKHQsaSxyLGkrbixyLHRoaXMuc3Ryb2tlRGFzaEFycmF5KSxlLnV0aWwuZHJhd0Rhc2hlZExpbmUodCxpK24scixpK24scitzLHRoaXMuc3Ryb2tlRGFzaEFycmF5KSxlLnV0aWwuZHJhd0Rhc2hlZExpbmUodCxpK24scitzLGkscitzLHRoaXMuc3Ryb2tlRGFzaEFycmF5KSxlLnV0aWwuZHJhd0Rhc2hlZExpbmUodCxpLHIrcyxpLHIsdGhpcy5zdHJva2VEYXNoQXJyYXkpLHQuY2xvc2VQYXRoKCl9LHRvT2JqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPWkodGhpcy5jYWxsU3VwZXIoInRvT2JqZWN0Iix0KSx7cng6dGhpcy5nZXQoInJ4Iil8fDAscnk6dGhpcy5nZXQoInJ5Iil8fDB9KTtyZXR1cm4gdGhpcy5pbmNsdWRlRGVmYXVsdFZhbHVlc3x8dGhpcy5fcmVtb3ZlRGVmYXVsdFZhbHVlcyhlKSxlfSx0b1NWRzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jcmVhdGVCYXNlU1ZHTWFya3VwKCksaT10aGlzLmxlZnQscj10aGlzLnRvcDtyZXR1cm4gdGhpcy5ncm91cCYmInBhdGgtZ3JvdXAiPT09dGhpcy5ncm91cC50eXBlfHwoaT0tdGhpcy53aWR0aC8yLHI9LXRoaXMuaGVpZ2h0LzIpLGUucHVzaCgiPHJlY3QgIix0aGlzLmdldFN2Z0lkKCksJ3g9IicsaSwnIiB5PSInLHIsJyIgcng9IicsdGhpcy5nZXQoInJ4IiksJyIgcnk9IicsdGhpcy5nZXQoInJ5IiksJyIgd2lkdGg9IicsdGhpcy53aWR0aCwnIiBoZWlnaHQ9IicsdGhpcy5oZWlnaHQsJyIgc3R5bGU9IicsdGhpcy5nZXRTdmdTdHlsZXMoKSwnIiB0cmFuc2Zvcm09IicsdGhpcy5nZXRTdmdUcmFuc2Zvcm0oKSx0aGlzLmdldFN2Z1RyYW5zZm9ybU1hdHJpeCgpLCciLz5cbicpLHQ/dChlLmpvaW4oIiIpKTplLmpvaW4oIiIpfSxjb21wbGV4aXR5OmZ1bmN0aW9uKCl7cmV0dXJuIDF9fSksZS5SZWN0LkFUVFJJQlVURV9OQU1FUz1lLlNIQVJFRF9BVFRSSUJVVEVTLmNvbmNhdCgieCB5IHJ4IHJ5IHdpZHRoIGhlaWdodCIuc3BsaXQoIiAiKSksZS5SZWN0LmZyb21FbGVtZW50PWZ1bmN0aW9uKHQscil7aWYoIXQpcmV0dXJuIG51bGw7cj1yfHx7fTt2YXIgbj1lLnBhcnNlQXR0cmlidXRlcyh0LGUuUmVjdC5BVFRSSUJVVEVfTkFNRVMpO24ubGVmdD1uLmxlZnR8fDAsbi50b3A9bi50b3B8fDA7dmFyIHM9bmV3IGUuUmVjdChpKHI/ZS51dGlsLm9iamVjdC5jbG9uZShyKTp7fSxuKSk7cmV0dXJuIHMudmlzaWJsZT1zLnZpc2libGUmJnMud2lkdGg+MCYmcy5oZWlnaHQ+MCxzfSxlLlJlY3QuZnJvbU9iamVjdD1mdW5jdGlvbih0LGkpe3ZhciByPW5ldyBlLlJlY3QodCk7cmV0dXJuIGkmJmkocikscn19KCJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnRoaXMpLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10LmZhYnJpY3x8KHQuZmFicmljPXt9KTtyZXR1cm4gZS5Qb2x5bGluZT92b2lkIGUud2FybigiZmFicmljLlBvbHlsaW5lIGlzIGFscmVhZHkgZGVmaW5lZCIpOihlLlBvbHlsaW5lPWUudXRpbC5jcmVhdGVDbGFzcyhlLk9iamVjdCx7dHlwZToicG9seWxpbmUiLHBvaW50czpudWxsLG1pblg6MCxtaW5ZOjAsaW5pdGlhbGl6ZTpmdW5jdGlvbih0LGkpe3JldHVybiBlLlBvbHlnb24ucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLHQsaSl9LF9jYWxjRGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybiBlLlBvbHlnb24ucHJvdG90eXBlLl9jYWxjRGltZW5zaW9ucy5jYWxsKHRoaXMpfSx0b09iamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gZS5Qb2x5Z29uLnByb3RvdHlwZS50b09iamVjdC5jYWxsKHRoaXMsdCl9LHRvU1ZHOmZ1bmN0aW9uKHQpe3JldHVybiBlLlBvbHlnb24ucHJvdG90eXBlLnRvU1ZHLmNhbGwodGhpcyx0KX0sX3JlbmRlcjpmdW5jdGlvbih0LGkpe2UuUG9seWdvbi5wcm90b3R5cGUuY29tbW9uUmVuZGVyLmNhbGwodGhpcyx0LGkpJiYodGhpcy5fcmVuZGVyRmlsbCh0KSx0aGlzLl9yZW5kZXJTdHJva2UodCkpfSxfcmVuZGVyRGFzaGVkU3Ryb2tlOmZ1bmN0aW9uKHQpe3ZhciBpLHI7dC5iZWdpblBhdGgoKTtmb3IodmFyIG49MCxzPXRoaXMucG9pbnRzLmxlbmd0aDtuPHM7bisrKWk9dGhpcy5wb2ludHNbbl0scj10aGlzLnBvaW50c1tuKzFdfHxpLGUudXRpbC5kcmF3RGFzaGVkTGluZSh0LGkueCxpLnksci54LHIueSx0aGlzLnN0cm9rZURhc2hBcnJheSl9LGNvbXBsZXhpdHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoInBvaW50cyIpLmxlbmd0aH19KSxlLlBvbHlsaW5lLkFUVFJJQlVURV9OQU1FUz1lLlNIQVJFRF9BVFRSSUJVVEVTLmNvbmNhdCgpLGUuUG9seWxpbmUuZnJvbUVsZW1lbnQ9ZnVuY3Rpb24odCxpKXtpZighdClyZXR1cm4gbnVsbDtpfHwoaT17fSk7dmFyIHI9ZS5wYXJzZVBvaW50c0F0dHJpYnV0ZSh0LmdldEF0dHJpYnV0ZSgicG9pbnRzIikpLG49ZS5wYXJzZUF0dHJpYnV0ZXModCxlLlBvbHlsaW5lLkFUVFJJQlVURV9OQU1FUyk7cmV0dXJuIG5ldyBlLlBvbHlsaW5lKHIsZS51dGlsLm9iamVjdC5leHRlbmQobixpKSl9LHZvaWQoZS5Qb2x5bGluZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKHQsaSl7dmFyIHI9bmV3IGUuUG9seWxpbmUodC5wb2ludHMsdCk7cmV0dXJuIGkmJmkocikscn0pKX0oInVuZGVmaW5lZCIhPXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dGhpcyksZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3ZhciBlPXQuZmFicmljfHwodC5mYWJyaWM9e30pLGk9ZS51dGlsLm9iamVjdC5leHRlbmQscj1lLnV0aWwuYXJyYXkubWluLG49ZS51dGlsLmFycmF5Lm1heCxzPWUudXRpbC50b0ZpeGVkO3JldHVybiBlLlBvbHlnb24/dm9pZCBlLndhcm4oImZhYnJpYy5Qb2x5Z29uIGlzIGFscmVhZHkgZGVmaW5lZCIpOihlLlBvbHlnb249ZS51dGlsLmNyZWF0ZUNsYXNzKGUuT2JqZWN0LHt0eXBlOiJwb2x5Z29uIixwb2ludHM6bnVsbCxtaW5YOjAsbWluWTowLGluaXRpYWxpemU6ZnVuY3Rpb24odCxlKXtlPWV8fHt9LHRoaXMucG9pbnRzPXR8fFtdLHRoaXMuY2FsbFN1cGVyKCJpbml0aWFsaXplIixlKSx0aGlzLl9jYWxjRGltZW5zaW9ucygpLCJ0b3AiaW4gZXx8KHRoaXMudG9wPXRoaXMubWluWSksImxlZnQiaW4gZXx8KHRoaXMubGVmdD10aGlzLm1pblgpLHRoaXMucGF0aE9mZnNldD17eDp0aGlzLm1pblgrdGhpcy53aWR0aC8yLHk6dGhpcy5taW5ZK3RoaXMuaGVpZ2h0LzJ9fSxfY2FsY0RpbWVuc2lvbnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBvaW50cyxlPXIodCwieCIpLGk9cih0LCJ5Iikscz1uKHQsIngiKSxvPW4odCwieSIpO3RoaXMud2lkdGg9cy1lfHwwLHRoaXMuaGVpZ2h0PW8taXx8MCx0aGlzLm1pblg9ZXx8MCx0aGlzLm1pblk9aXx8MH0sdG9PYmplY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcy5jYWxsU3VwZXIoInRvT2JqZWN0Iix0KSx7cG9pbnRzOnRoaXMucG9pbnRzLmNvbmNhdCgpfSl9LHRvU1ZHOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxpPVtdLHI9dGhpcy5fY3JlYXRlQmFzZVNWR01hcmt1cCgpLG49MCxvPXRoaXMucG9pbnRzLmxlbmd0aDtuPG87bisrKWkucHVzaChzKHRoaXMucG9pbnRzW25dLngsMiksIiwiLHModGhpcy5wb2ludHNbbl0ueSwyKSwiICIpO3JldHVybiB0aGlzLmdyb3VwJiYicGF0aC1ncm91cCI9PT10aGlzLmdyb3VwLnR5cGV8fChlPSIgdHJhbnNsYXRlKCIrLXRoaXMucGF0aE9mZnNldC54KyIsICIrLXRoaXMucGF0aE9mZnNldC55KyIpICIpLHIucHVzaCgiPCIsdGhpcy50eXBlLCIgIix0aGlzLmdldFN2Z0lkKCksJ3BvaW50cz0iJyxpLmpvaW4oIiIpLCciIHN0eWxlPSInLHRoaXMuZ2V0U3ZnU3R5bGVzKCksJyIgdHJhbnNmb3JtPSInLHRoaXMuZ2V0U3ZnVHJhbnNmb3JtKCksZSwiICIsdGhpcy5nZXRTdmdUcmFuc2Zvcm1NYXRyaXgoKSwnIi8+XG4nKSx0P3Qoci5qb2luKCIiKSk6ci5qb2luKCIiKX0sX3JlbmRlcjpmdW5jdGlvbih0LGUpe3RoaXMuY29tbW9uUmVuZGVyKHQsZSkmJih0aGlzLl9yZW5kZXJGaWxsKHQpLCh0aGlzLnN0cm9rZXx8dGhpcy5zdHJva2VEYXNoQXJyYXkpJiYodC5jbG9zZVBhdGgoKSx0aGlzLl9yZW5kZXJTdHJva2UodCkpKX0sY29tbW9uUmVuZGVyOmZ1bmN0aW9uKHQsZSl7dmFyIGkscj10aGlzLnBvaW50cy5sZW5ndGg7aWYoIXJ8fGlzTmFOKHRoaXMucG9pbnRzW3ItMV0ueSkpcmV0dXJuITE7ZXx8dC50cmFuc2xhdGUoLXRoaXMucGF0aE9mZnNldC54LC10aGlzLnBhdGhPZmZzZXQueSksdC5iZWdpblBhdGgoKSx0Lm1vdmVUbyh0aGlzLnBvaW50c1swXS54LHRoaXMucG9pbnRzWzBdLnkpO2Zvcih2YXIgbj0wO248cjtuKyspaT10aGlzLnBvaW50c1tuXSx0LmxpbmVUbyhpLngsaS55KTtyZXR1cm4hMH0sX3JlbmRlckRhc2hlZFN0cm9rZTpmdW5jdGlvbih0KXtlLlBvbHlsaW5lLnByb3RvdHlwZS5fcmVuZGVyRGFzaGVkU3Ryb2tlLmNhbGwodGhpcyx0KSx0LmNsb3NlUGF0aCgpfSxjb21wbGV4aXR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9pbnRzLmxlbmd0aH19KSxlLlBvbHlnb24uQVRUUklCVVRFX05BTUVTPWUuU0hBUkVEX0FUVFJJQlVURVMuY29uY2F0KCksZS5Qb2x5Z29uLmZyb21FbGVtZW50PWZ1bmN0aW9uKHQscil7aWYoIXQpcmV0dXJuIG51bGw7cnx8KHI9e30pO3ZhciBuPWUucGFyc2VQb2ludHNBdHRyaWJ1dGUodC5nZXRBdHRyaWJ1dGUoInBvaW50cyIpKSxzPWUucGFyc2VBdHRyaWJ1dGVzKHQsZS5Qb2x5Z29uLkFUVFJJQlVURV9OQU1FUyk7cmV0dXJuIG5ldyBlLlBvbHlnb24obixpKHMscikpfSx2b2lkKGUuUG9seWdvbi5mcm9tT2JqZWN0PWZ1bmN0aW9uKHQsaSl7dmFyIHI9bmV3IGUuUG9seWdvbih0LnBvaW50cyx0KTtyZXR1cm4gaSYmaShyKSxyfSkpfSgidW5kZWZpbmVkIiE9dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0aGlzKSxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGU9dC5mYWJyaWN8fCh0LmZhYnJpYz17fSksaT1lLnV0aWwuYXJyYXkubWluLHI9ZS51dGlsLmFycmF5Lm1heCxuPWUudXRpbC5vYmplY3QuZXh0ZW5kLHM9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxvPWUudXRpbC5kcmF3QXJjLGE9e206MixsOjIsaDoxLHY6MSxjOjYsczo0LHE6NCx0OjIsYTo3fSxoPXttOiJsIixNOiJMIn07cmV0dXJuIGUuUGF0aD92b2lkIGUud2FybigiZmFicmljLlBhdGggaXMgYWxyZWFkeSBkZWZpbmVkIik6KGUuUGF0aD1lLnV0aWwuY3JlYXRlQ2xhc3MoZS5PYmplY3Qse3R5cGU6InBhdGgiLHBhdGg6bnVsbCxtaW5YOjAsbWluWTowLGluaXRpYWxpemU6ZnVuY3Rpb24odCxlKXtlPWV8fHt9LHRoaXMuc2V0T3B0aW9ucyhlKSx0fHwodD1bXSk7dmFyIGk9IltvYmplY3QgQXJyYXldIj09PXMuY2FsbCh0KTt0aGlzLnBhdGg9aT90OnQubWF0Y2gmJnQubWF0Y2goL1ttemxodmNzcXRhXVtebXpsaHZjc3F0YV0qL2dpKSx0aGlzLnBhdGgmJihpfHwodGhpcy5wYXRoPXRoaXMuX3BhcnNlUGF0aCgpKSx0aGlzLl9zZXRQb3NpdGlvbkRpbWVuc2lvbnMoZSksZS5zb3VyY2VQYXRoJiZ0aGlzLnNldFNvdXJjZVBhdGgoZS5zb3VyY2VQYXRoKSl9LF9zZXRQb3NpdGlvbkRpbWVuc2lvbnM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcGFyc2VEaW1lbnNpb25zKCk7dGhpcy5taW5YPWUubGVmdCx0aGlzLm1pblk9ZS50b3AsdGhpcy53aWR0aD1lLndpZHRoLHRoaXMuaGVpZ2h0PWUuaGVpZ2h0LCJ1bmRlZmluZWQiPT10eXBlb2YgdC5sZWZ0JiYodGhpcy5sZWZ0PWUubGVmdCsoImNlbnRlciI9PT10aGlzLm9yaWdpblg/dGhpcy53aWR0aC8yOiJyaWdodCI9PT10aGlzLm9yaWdpblg/dGhpcy53aWR0aDowKSksInVuZGVmaW5lZCI9PXR5cGVvZiB0LnRvcCYmKHRoaXMudG9wPWUudG9wKygiY2VudGVyIj09PXRoaXMub3JpZ2luWT90aGlzLmhlaWdodC8yOiJib3R0b20iPT09dGhpcy5vcmlnaW5ZP3RoaXMuaGVpZ2h0OjApKSx0aGlzLnBhdGhPZmZzZXQ9dGhpcy5wYXRoT2Zmc2V0fHx7eDp0aGlzLm1pblgrdGhpcy53aWR0aC8yLHk6dGhpcy5taW5ZK3RoaXMuaGVpZ2h0LzJ9fSxfcmVuZGVyUGF0aENvbW1hbmRzOmZ1bmN0aW9uKHQpe3ZhciBlLGkscixuPW51bGwscz0wLGE9MCxoPTAsYz0wLGw9MCx1PTAsZj0tdGhpcy5wYXRoT2Zmc2V0LngsZD0tdGhpcy5wYXRoT2Zmc2V0Lnk7dGhpcy5ncm91cCYmInBhdGgtZ3JvdXAiPT09dGhpcy5ncm91cC50eXBlJiYoZj0wLGQ9MCksdC5iZWdpblBhdGgoKTtmb3IodmFyIGc9MCxwPXRoaXMucGF0aC5sZW5ndGg7ZzxwOysrZyl7c3dpdGNoKGU9dGhpcy5wYXRoW2ddLGVbMF0pe2Nhc2UibCI6aCs9ZVsxXSxjKz1lWzJdLHQubGluZVRvKGgrZixjK2QpO2JyZWFrO2Nhc2UiTCI6aD1lWzFdLGM9ZVsyXSx0LmxpbmVUbyhoK2YsYytkKTticmVhaztjYXNlImgiOmgrPWVbMV0sdC5saW5lVG8oaCtmLGMrZCk7YnJlYWs7Y2FzZSJIIjpoPWVbMV0sdC5saW5lVG8oaCtmLGMrZCk7YnJlYWs7Y2FzZSJ2IjpjKz1lWzFdLHQubGluZVRvKGgrZixjK2QpO2JyZWFrO2Nhc2UiViI6Yz1lWzFdLHQubGluZVRvKGgrZixjK2QpO2JyZWFrO2Nhc2UibSI6aCs9ZVsxXSxjKz1lWzJdLHM9aCxhPWMsdC5tb3ZlVG8oaCtmLGMrZCk7YnJlYWs7Y2FzZSJNIjpoPWVbMV0sYz1lWzJdLHM9aCxhPWMsdC5tb3ZlVG8oaCtmLGMrZCk7YnJlYWs7Y2FzZSJjIjppPWgrZVs1XSxyPWMrZVs2XSxsPWgrZVszXSx1PWMrZVs0XSx0LmJlemllckN1cnZlVG8oaCtlWzFdK2YsYytlWzJdK2QsbCtmLHUrZCxpK2YscitkKSxoPWksYz1yO2JyZWFrO2Nhc2UiQyI6aD1lWzVdLGM9ZVs2XSxsPWVbM10sdT1lWzRdLHQuYmV6aWVyQ3VydmVUbyhlWzFdK2YsZVsyXStkLGwrZix1K2QsaCtmLGMrZCk7YnJlYWs7Y2FzZSJzIjppPWgrZVszXSxyPWMrZVs0XSxudWxsPT09blswXS5tYXRjaCgvW0NjU3NdLyk/KGw9aCx1PWMpOihsPTIqaC1sLHU9MipjLXUpLHQuYmV6aWVyQ3VydmVUbyhsK2YsdStkLGgrZVsxXStmLGMrZVsyXStkLGkrZixyK2QpLGw9aCtlWzFdLHU9YytlWzJdLGg9aSxjPXI7YnJlYWs7Y2FzZSJTIjppPWVbM10scj1lWzRdLG51bGw9PT1uWzBdLm1hdGNoKC9bQ2NTc10vKT8obD1oLHU9Yyk6KGw9MipoLWwsdT0yKmMtdSksdC5iZXppZXJDdXJ2ZVRvKGwrZix1K2QsZVsxXStmLGVbMl0rZCxpK2YscitkKSxoPWksYz1yLGw9ZVsxXSx1PWVbMl07YnJlYWs7Y2FzZSJxIjppPWgrZVszXSxyPWMrZVs0XSxsPWgrZVsxXSx1PWMrZVsyXSx0LnF1YWRyYXRpY0N1cnZlVG8obCtmLHUrZCxpK2YscitkKSxoPWksYz1yO2JyZWFrO2Nhc2UiUSI6aT1lWzNdLHI9ZVs0XSx0LnF1YWRyYXRpY0N1cnZlVG8oZVsxXStmLGVbMl0rZCxpK2YscitkKSxoPWksYz1yLGw9ZVsxXSx1PWVbMl07YnJlYWs7Y2FzZSJ0IjppPWgrZVsxXSxyPWMrZVsyXSxudWxsPT09blswXS5tYXRjaCgvW1FxVHRdLyk/KGw9aCx1PWMpOihsPTIqaC1sLHU9MipjLXUpLHQucXVhZHJhdGljQ3VydmVUbyhsK2YsdStkLGkrZixyK2QpLGg9aSxjPXI7YnJlYWs7Y2FzZSJUIjppPWVbMV0scj1lWzJdLG51bGw9PT1uWzBdLm1hdGNoKC9bUXFUdF0vKT8obD1oLHU9Yyk6KGw9MipoLWwsdT0yKmMtdSksdC5xdWFkcmF0aWNDdXJ2ZVRvKGwrZix1K2QsaStmLHIrZCksaD1pLGM9cjticmVhaztjYXNlImEiOm8odCxoK2YsYytkLFtlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV0sZVs2XStoK2YsZVs3XStjK2RdKSxoKz1lWzZdLGMrPWVbN107YnJlYWs7Y2FzZSJBIjpvKHQsaCtmLGMrZCxbZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdLGVbNl0rZixlWzddK2RdKSxoPWVbNl0sYz1lWzddO2JyZWFrO2Nhc2UieiI6Y2FzZSJaIjpoPXMsYz1hLHQuY2xvc2VQYXRoKCl9bj1lfX0sX3JlbmRlcjpmdW5jdGlvbih0KXt0aGlzLl9yZW5kZXJQYXRoQ29tbWFuZHModCksdGhpcy5fcmVuZGVyRmlsbCh0KSx0aGlzLl9yZW5kZXJTdHJva2UodCl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIiM8ZmFicmljLlBhdGggKCIrdGhpcy5jb21wbGV4aXR5KCkrJyk6IHsgInRvcCI6ICcrdGhpcy50b3ArJywgImxlZnQiOiAnK3RoaXMubGVmdCsiIH0+In0sdG9PYmplY3Q6ZnVuY3Rpb24odCl7dmFyIGU9bih0aGlzLmNhbGxTdXBlcigidG9PYmplY3QiLHQpLHtwYXRoOnRoaXMucGF0aC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuc2xpY2UoKX0pLHBhdGhPZmZzZXQ6dGhpcy5wYXRoT2Zmc2V0fSk7cmV0dXJuIHRoaXMuc291cmNlUGF0aCYmKGUuc291cmNlUGF0aD10aGlzLnNvdXJjZVBhdGgpLHRoaXMudHJhbnNmb3JtTWF0cml4JiYoZS50cmFuc2Zvcm1NYXRyaXg9dGhpcy50cmFuc2Zvcm1NYXRyaXgpLGV9LHRvRGF0YWxlc3NPYmplY3Q6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy50b09iamVjdCh0KTtyZXR1cm4gdGhpcy5zb3VyY2VQYXRoJiYoZS5wYXRoPXRoaXMuc291cmNlUGF0aCksZGVsZXRlIGUuc291cmNlUGF0aCxlfSx0b1NWRzpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT10aGlzLl9jcmVhdGVCYXNlU1ZHTWFya3VwKCkscj0iIixuPTAscz10aGlzLnBhdGgubGVuZ3RoO248cztuKyspZS5wdXNoKHRoaXMucGF0aFtuXS5qb2luKCIgIikpO3ZhciBvPWUuam9pbigiICIpO3JldHVybiB0aGlzLmdyb3VwJiYicGF0aC1ncm91cCI9PT10aGlzLmdyb3VwLnR5cGV8fChyPSIgdHJhbnNsYXRlKCIrLXRoaXMucGF0aE9mZnNldC54KyIsICIrLXRoaXMucGF0aE9mZnNldC55KyIpICIpLGkucHVzaCgiPHBhdGggIix0aGlzLmdldFN2Z0lkKCksJ2Q9IicsbywnIiBzdHlsZT0iJyx0aGlzLmdldFN2Z1N0eWxlcygpLCciIHRyYW5zZm9ybT0iJyx0aGlzLmdldFN2Z1RyYW5zZm9ybSgpLHIsdGhpcy5nZXRTdmdUcmFuc2Zvcm1NYXRyaXgoKSwnIiBzdHJva2UtbGluZWNhcD0icm91bmQiICcsIi8+XG4iKSx0P3QoaS5qb2luKCIiKSk6aS5qb2luKCIiKX0sY29tcGxleGl0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhdGgubGVuZ3RofSxfcGFyc2VQYXRoOmZ1bmN0aW9uKCl7Zm9yKHZhciB0LGUsaSxyLG4scz1bXSxvPVtdLGM9LyhbLStdPygoXGQrXC5cZCspfCgoXGQrKXwoXC5cZCspKSkoPzplWy0rXT9cZCspPykvZ2ksbD0wLHU9dGhpcy5wYXRoLmxlbmd0aDtsPHU7bCsrKXtmb3IodD10aGlzLnBhdGhbbF0scj10LnNsaWNlKDEpLnRyaW0oKSxvLmxlbmd0aD0wO2k9Yy5leGVjKHIpOylvLnB1c2goaVswXSk7bj1bdC5jaGFyQXQoMCldO2Zvcih2YXIgZj0wLGQ9by5sZW5ndGg7ZjxkO2YrKyllPXBhcnNlRmxvYXQob1tmXSksaXNOYU4oZSl8fG4ucHVzaChlKTt2YXIgZz1uWzBdLHA9YVtnLnRvTG93ZXJDYXNlKCldLHY9aFtnXXx8ZztpZihuLmxlbmd0aC0xPnApZm9yKHZhciBiPTEsbT1uLmxlbmd0aDtiPG07Yis9cClzLnB1c2goW2ddLmNvbmNhdChuLnNsaWNlKGIsYitwKSkpLGc9djtlbHNlIHMucHVzaChuKX1yZXR1cm4gc30sX3BhcnNlRGltZW5zaW9uczpmdW5jdGlvbigpe2Zvcih2YXIgdCxuLHMsbyxhPVtdLGg9W10sYz1udWxsLGw9MCx1PTAsZj0wLGQ9MCxnPTAscD0wLHY9MCxiPXRoaXMucGF0aC5sZW5ndGg7djxiOysrdil7c3dpdGNoKHQ9dGhpcy5wYXRoW3ZdLHRbMF0pe2Nhc2UibCI6Zis9dFsxXSxkKz10WzJdLG89W107YnJlYWs7Y2FzZSJMIjpmPXRbMV0sZD10WzJdLG89W107YnJlYWs7Y2FzZSJoIjpmKz10WzFdLG89W107YnJlYWs7Y2FzZSJIIjpmPXRbMV0sbz1bXTticmVhaztjYXNlInYiOmQrPXRbMV0sbz1bXTticmVhaztjYXNlIlYiOmQ9dFsxXSxvPVtdO2JyZWFrO2Nhc2UibSI6Zis9dFsxXSxkKz10WzJdLGw9Zix1PWQsbz1bXTticmVhaztjYXNlIk0iOmY9dFsxXSxkPXRbMl0sbD1mLHU9ZCxvPVtdO2JyZWFrO2Nhc2UiYyI6bj1mK3RbNV0scz1kK3RbNl0sZz1mK3RbM10scD1kK3RbNF0sbz1lLnV0aWwuZ2V0Qm91bmRzT2ZDdXJ2ZShmLGQsZit0WzFdLGQrdFsyXSxnLHAsbixzKSxmPW4sZD1zO2JyZWFrO2Nhc2UiQyI6Zj10WzVdLGQ9dFs2XSxnPXRbM10scD10WzRdLG89ZS51dGlsLmdldEJvdW5kc09mQ3VydmUoZixkLHRbMV0sdFsyXSxnLHAsZixkKTticmVhaztjYXNlInMiOm49Zit0WzNdLHM9ZCt0WzRdLG51bGw9PT1jWzBdLm1hdGNoKC9bQ2NTc10vKT8oZz1mLHA9ZCk6KGc9MipmLWcscD0yKmQtcCksbz1lLnV0aWwuZ2V0Qm91bmRzT2ZDdXJ2ZShmLGQsZyxwLGYrdFsxXSxkK3RbMl0sbixzKSxnPWYrdFsxXSxwPWQrdFsyXSxmPW4sZD1zO2JyZWFrO2Nhc2UiUyI6bj10WzNdLHM9dFs0XSxudWxsPT09Y1swXS5tYXRjaCgvW0NjU3NdLyk/KGc9ZixwPWQpOihnPTIqZi1nLHA9MipkLXApLG89ZS51dGlsLmdldEJvdW5kc09mQ3VydmUoZixkLGcscCx0WzFdLHRbMl0sbixzKSxmPW4sZD1zLGc9dFsxXSxwPXRbMl07YnJlYWs7Y2FzZSJxIjpuPWYrdFszXSxzPWQrdFs0XSxnPWYrdFsxXSxwPWQrdFsyXSxvPWUudXRpbC5nZXRCb3VuZHNPZkN1cnZlKGYsZCxnLHAsZyxwLG4scyksZj1uLGQ9czticmVhaztjYXNlIlEiOmc9dFsxXSxwPXRbMl0sbz1lLnV0aWwuZ2V0Qm91bmRzT2ZDdXJ2ZShmLGQsZyxwLGcscCx0WzNdLHRbNF0pLGY9dFszXSxkPXRbNF07YnJlYWs7Y2FzZSJ0IjpuPWYrdFsxXSxzPWQrdFsyXSxudWxsPT09Y1swXS5tYXRjaCgvW1FxVHRdLyk/KGc9ZixwPWQpOihnPTIqZi1nLHA9MipkLXApLG89ZS51dGlsLmdldEJvdW5kc09mQ3VydmUoZixkLGcscCxnLHAsbixzKSxmPW4sZD1zO2JyZWFrO2Nhc2UiVCI6bj10WzFdLHM9dFsyXSxudWxsPT09Y1swXS5tYXRjaCgvW1FxVHRdLyk/KGc9ZixwPWQpOihnPTIqZi1nLHA9MipkLXApLG89ZS51dGlsLmdldEJvdW5kc09mQ3VydmUoZixkLGcscCxnLHAsbixzKSxmPW4sZD1zO2JyZWFrO2Nhc2UiYSI6bz1lLnV0aWwuZ2V0Qm91bmRzT2ZBcmMoZixkLHRbMV0sdFsyXSx0WzNdLHRbNF0sdFs1XSx0WzZdK2YsdFs3XStkKSxmKz10WzZdLGQrPXRbN107YnJlYWs7Y2FzZSJBIjpvPWUudXRpbC5nZXRCb3VuZHNPZkFyYyhmLGQsdFsxXSx0WzJdLHRbM10sdFs0XSx0WzVdLHRbNl0sdFs3XSksZj10WzZdLGQ9dFs3XTticmVhaztjYXNlInoiOmNhc2UiWiI6Zj1sLGQ9dX1jPXQsby5mb3JFYWNoKGZ1bmN0aW9uKHQpe2EucHVzaCh0LngpLGgucHVzaCh0LnkpfSksYS5wdXNoKGYpLGgucHVzaChkKX12YXIgbT1pKGEpfHwwLHk9aShoKXx8MCxfPXIoYSl8fDAseD1yKGgpfHwwLFM9Xy1tLEM9eC15LHc9e2xlZnQ6bSx0b3A6eSx3aWR0aDpTLGhlaWdodDpDfTtyZXR1cm4gd319KSxlLlBhdGguZnJvbU9iamVjdD1mdW5jdGlvbih0LGkpe3ZhciByO3JldHVybiJzdHJpbmciIT10eXBlb2YgdC5wYXRoPyhyPW5ldyBlLlBhdGgodC5wYXRoLHQpLGkmJmkocikscik6dm9pZCBlLmxvYWRTVkdGcm9tVVJMKHQucGF0aCxmdW5jdGlvbihuKXt2YXIgcz10LnBhdGg7cj1uWzBdLGRlbGV0ZSB0LnBhdGgsZS51dGlsLm9iamVjdC5leHRlbmQocix0KSxyLnNldFNvdXJjZVBhdGgocyksaSYmaShyKX0pfSxlLlBhdGguQVRUUklCVVRFX05BTUVTPWUuU0hBUkVEX0FUVFJJQlVURVMuY29uY2F0KFsiZCJdKSxlLlBhdGguZnJvbUVsZW1lbnQ9ZnVuY3Rpb24odCxpLHIpe3ZhciBzPWUucGFyc2VBdHRyaWJ1dGVzKHQsZS5QYXRoLkFUVFJJQlVURV9OQU1FUyk7aSYmaShuZXcgZS5QYXRoKHMuZCxuKHMscikpKX0sdm9pZChlLlBhdGguYXN5bmM9ITApKX0oInVuZGVmaW5lZCIhPXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dGhpcyksZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3ZhciBlPXQuZmFicmljfHwodC5mYWJyaWM9e30pLGk9ZS51dGlsLm9iamVjdC5leHRlbmQscj1lLnV0aWwuYXJyYXkuaW52b2tlLG49ZS5PYmplY3QucHJvdG90eXBlLnRvT2JqZWN0O3JldHVybiBlLlBhdGhHcm91cD92b2lkIGUud2FybigiZmFicmljLlBhdGhHcm91cCBpcyBhbHJlYWR5IGRlZmluZWQiKTooZS5QYXRoR3JvdXA9ZS51dGlsLmNyZWF0ZUNsYXNzKGUuUGF0aCx7dHlwZToicGF0aC1ncm91cCIsZmlsbDoiIiwKaW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe2U9ZXx8e30sdGhpcy5wYXRocz10fHxbXTtmb3IodmFyIGk9dGhpcy5wYXRocy5sZW5ndGg7aS0tOyl0aGlzLnBhdGhzW2ldLmdyb3VwPXRoaXM7ZS50b0JlUGFyc2VkJiYodGhpcy5wYXJzZURpbWVuc2lvbnNGcm9tUGF0aHMoZSksZGVsZXRlIGUudG9CZVBhcnNlZCksdGhpcy5zZXRPcHRpb25zKGUpLHRoaXMuc2V0Q29vcmRzKCksZS5zb3VyY2VQYXRoJiZ0aGlzLnNldFNvdXJjZVBhdGgoZS5zb3VyY2VQYXRoKX0scGFyc2VEaW1lbnNpb25zRnJvbVBhdGhzOmZ1bmN0aW9uKHQpe2Zvcih2YXIgaSxyLG4scyxvLGEsaD1bXSxjPVtdLGw9dGhpcy5wYXRocy5sZW5ndGg7bC0tOyl7bj10aGlzLnBhdGhzW2xdLHM9bi5oZWlnaHQrbi5zdHJva2VXaWR0aCxvPW4ud2lkdGgrbi5zdHJva2VXaWR0aCxpPVt7eDpuLmxlZnQseTpuLnRvcH0se3g6bi5sZWZ0K28seTpuLnRvcH0se3g6bi5sZWZ0LHk6bi50b3Arc30se3g6bi5sZWZ0K28seTpuLnRvcCtzfV0sYT10aGlzLnBhdGhzW2xdLnRyYW5zZm9ybU1hdHJpeDtmb3IodmFyIHU9MDt1PGkubGVuZ3RoO3UrKylyPWlbdV0sYSYmKHI9ZS51dGlsLnRyYW5zZm9ybVBvaW50KHIsYSwhMSkpLGgucHVzaChyLngpLGMucHVzaChyLnkpfXQud2lkdGg9TWF0aC5tYXguYXBwbHkobnVsbCxoKSx0LmhlaWdodD1NYXRoLm1heC5hcHBseShudWxsLGMpfSxyZW5kZXI6ZnVuY3Rpb24odCl7aWYodGhpcy52aXNpYmxlKXt0LnNhdmUoKSx0aGlzLnRyYW5zZm9ybU1hdHJpeCYmdC50cmFuc2Zvcm0uYXBwbHkodCx0aGlzLnRyYW5zZm9ybU1hdHJpeCksdGhpcy50cmFuc2Zvcm0odCksdGhpcy5fc2V0U2hhZG93KHQpLHRoaXMuY2xpcFRvJiZlLnV0aWwuY2xpcENvbnRleHQodGhpcyx0KSx0LnRyYW5zbGF0ZSgtdGhpcy53aWR0aC8yLC10aGlzLmhlaWdodC8yKTtmb3IodmFyIGk9MCxyPXRoaXMucGF0aHMubGVuZ3RoO2k8cjsrK2kpdGhpcy5wYXRoc1tpXS5yZW5kZXIodCwhMCk7dGhpcy5jbGlwVG8mJnQucmVzdG9yZSgpLHQucmVzdG9yZSgpfX0sX3NldDpmdW5jdGlvbih0LGUpe2lmKCJmaWxsIj09PXQmJmUmJnRoaXMuaXNTYW1lQ29sb3IoKSlmb3IodmFyIGk9dGhpcy5wYXRocy5sZW5ndGg7aS0tOyl0aGlzLnBhdGhzW2ldLl9zZXQodCxlKTtyZXR1cm4gdGhpcy5jYWxsU3VwZXIoIl9zZXQiLHQsZSl9LHRvT2JqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPWkobi5jYWxsKHRoaXMsdCkse3BhdGhzOnIodGhpcy5nZXRPYmplY3RzKCksInRvT2JqZWN0Iix0KX0pO3JldHVybiB0aGlzLnNvdXJjZVBhdGgmJihlLnNvdXJjZVBhdGg9dGhpcy5zb3VyY2VQYXRoKSxlfSx0b0RhdGFsZXNzT2JqZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudG9PYmplY3QodCk7cmV0dXJuIHRoaXMuc291cmNlUGF0aCYmKGUucGF0aHM9dGhpcy5zb3VyY2VQYXRoKSxlfSx0b1NWRzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldE9iamVjdHMoKSxpPXRoaXMuZ2V0UG9pbnRCeU9yaWdpbigibGVmdCIsInRvcCIpLHI9InRyYW5zbGF0ZSgiK2kueCsiICIraS55KyIpIixuPXRoaXMuX2NyZWF0ZUJhc2VTVkdNYXJrdXAoKTtuLnB1c2goIjxnICIsdGhpcy5nZXRTdmdJZCgpLCdzdHlsZT0iJyx0aGlzLmdldFN2Z1N0eWxlcygpLCciICcsJ3RyYW5zZm9ybT0iJyx0aGlzLmdldFN2Z1RyYW5zZm9ybU1hdHJpeCgpLHIsdGhpcy5nZXRTdmdUcmFuc2Zvcm0oKSwnIiAnLCI+XG4iKTtmb3IodmFyIHM9MCxvPWUubGVuZ3RoO3M8bztzKyspbi5wdXNoKCJcdCIsZVtzXS50b1NWRyh0KSk7cmV0dXJuIG4ucHVzaCgiPC9nPlxuIiksdD90KG4uam9pbigiIikpOm4uam9pbigiIil9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIiM8ZmFicmljLlBhdGhHcm91cCAoIit0aGlzLmNvbXBsZXhpdHkoKSsiKTogeyB0b3A6ICIrdGhpcy50b3ArIiwgbGVmdDogIit0aGlzLmxlZnQrIiB9PiJ9LGlzU2FtZUNvbG9yOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRPYmplY3RzKClbMF0uZ2V0KCJmaWxsIil8fCIiO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC50b0xvd2VyQ2FzZSgpLHRoaXMuZ2V0T2JqZWN0cygpLmV2ZXJ5KGZ1bmN0aW9uKGUpe3ZhciBpPWUuZ2V0KCJmaWxsIil8fCIiO3JldHVybiJzdHJpbmciPT10eXBlb2YgaSYmaS50b0xvd2VyQ2FzZSgpPT09dH0pKX0sY29tcGxleGl0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhdGhzLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0KyhlJiZlLmNvbXBsZXhpdHk/ZS5jb21wbGV4aXR5KCk6MCl9LDApfSxnZXRPYmplY3RzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGF0aHN9fSksZS5QYXRoR3JvdXAuZnJvbU9iamVjdD1mdW5jdGlvbih0LGkpeyJzdHJpbmciPT10eXBlb2YgdC5wYXRocz9lLmxvYWRTVkdGcm9tVVJMKHQucGF0aHMsZnVuY3Rpb24ocil7dmFyIG49dC5wYXRocztkZWxldGUgdC5wYXRoczt2YXIgcz1lLnV0aWwuZ3JvdXBTVkdFbGVtZW50cyhyLHQsbik7aShzKX0pOmUudXRpbC5lbmxpdmVuT2JqZWN0cyh0LnBhdGhzLGZ1bmN0aW9uKHIpe2RlbGV0ZSB0LnBhdGhzLGkobmV3IGUuUGF0aEdyb3VwKHIsdCkpfSl9LHZvaWQoZS5QYXRoR3JvdXAuYXN5bmM9ITApKX0oInVuZGVmaW5lZCIhPXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dGhpcyksZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3ZhciBlPXQuZmFicmljfHwodC5mYWJyaWM9e30pLGk9ZS51dGlsLm9iamVjdC5leHRlbmQscj1lLnV0aWwuYXJyYXkubWluLG49ZS51dGlsLmFycmF5Lm1heCxzPWUudXRpbC5hcnJheS5pbnZva2U7aWYoIWUuR3JvdXApe3ZhciBvPXtsb2NrTW92ZW1lbnRYOiEwLGxvY2tNb3ZlbWVudFk6ITAsbG9ja1JvdGF0aW9uOiEwLGxvY2tTY2FsaW5nWDohMCxsb2NrU2NhbGluZ1k6ITAsbG9ja1VuaVNjYWxpbmc6ITB9O2UuR3JvdXA9ZS51dGlsLmNyZWF0ZUNsYXNzKGUuT2JqZWN0LGUuQ29sbGVjdGlvbix7dHlwZToiZ3JvdXAiLHN0cm9rZVdpZHRoOjAsc3ViVGFyZ2V0Q2hlY2s6ITEsaW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUsaSl7ZT1lfHx7fSx0aGlzLl9vYmplY3RzPVtdLGkmJnRoaXMuY2FsbFN1cGVyKCJpbml0aWFsaXplIixlKSx0aGlzLl9vYmplY3RzPXR8fFtdO2Zvcih2YXIgcj10aGlzLl9vYmplY3RzLmxlbmd0aDtyLS07KXRoaXMuX29iamVjdHNbcl0uZ3JvdXA9dGhpczt0aGlzLm9yaWdpbmFsU3RhdGU9e30sZS5vcmlnaW5YJiYodGhpcy5vcmlnaW5YPWUub3JpZ2luWCksZS5vcmlnaW5ZJiYodGhpcy5vcmlnaW5ZPWUub3JpZ2luWSksaT90aGlzLl91cGRhdGVPYmplY3RzQ29vcmRzKCEwKToodGhpcy5fY2FsY0JvdW5kcygpLHRoaXMuX3VwZGF0ZU9iamVjdHNDb29yZHMoKSx0aGlzLmNhbGxTdXBlcigiaW5pdGlhbGl6ZSIsZSkpLHRoaXMuc2V0Q29vcmRzKCksdGhpcy5zYXZlQ29vcmRzKCl9LF91cGRhdGVPYmplY3RzQ29vcmRzOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9vYmplY3RzLmxlbmd0aDtlLS07KXRoaXMuX3VwZGF0ZU9iamVjdENvb3Jkcyh0aGlzLl9vYmplY3RzW2VdLHQpfSxfdXBkYXRlT2JqZWN0Q29vcmRzOmZ1bmN0aW9uKHQsZSl7aWYodC5fX29yaWdIYXNDb250cm9scz10Lmhhc0NvbnRyb2xzLHQuaGFzQ29udHJvbHM9ITEsIWUpe3ZhciBpPXQuZ2V0TGVmdCgpLHI9dC5nZXRUb3AoKSxuPXRoaXMuZ2V0Q2VudGVyUG9pbnQoKTt0LnNldCh7b3JpZ2luYWxMZWZ0Omksb3JpZ2luYWxUb3A6cixsZWZ0Omktbi54LHRvcDpyLW4ueX0pLHQuc2V0Q29vcmRzKCl9fSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiIjPGZhYnJpYy5Hcm91cDogKCIrdGhpcy5jb21wbGV4aXR5KCkrIik+In0sYWRkV2l0aFVwZGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVzdG9yZU9iamVjdHNTdGF0ZSgpLGUudXRpbC5yZXNldE9iamVjdFRyYW5zZm9ybSh0aGlzKSx0JiYodGhpcy5fb2JqZWN0cy5wdXNoKHQpLHQuZ3JvdXA9dGhpcyx0Ll9zZXQoImNhbnZhcyIsdGhpcy5jYW52YXMpKSx0aGlzLmZvckVhY2hPYmplY3QodGhpcy5fc2V0T2JqZWN0QWN0aXZlLHRoaXMpLHRoaXMuX2NhbGNCb3VuZHMoKSx0aGlzLl91cGRhdGVPYmplY3RzQ29vcmRzKCksdGhpc30sX3NldE9iamVjdEFjdGl2ZTpmdW5jdGlvbih0KXt0LnNldCgiYWN0aXZlIiwhMCksdC5ncm91cD10aGlzfSxyZW1vdmVXaXRoVXBkYXRlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZXN0b3JlT2JqZWN0c1N0YXRlKCksZS51dGlsLnJlc2V0T2JqZWN0VHJhbnNmb3JtKHRoaXMpLHRoaXMuZm9yRWFjaE9iamVjdCh0aGlzLl9zZXRPYmplY3RBY3RpdmUsdGhpcyksdGhpcy5yZW1vdmUodCksdGhpcy5fY2FsY0JvdW5kcygpLHRoaXMuX3VwZGF0ZU9iamVjdHNDb29yZHMoKSx0aGlzfSxfb25PYmplY3RBZGRlZDpmdW5jdGlvbih0KXt0Lmdyb3VwPXRoaXMsdC5fc2V0KCJjYW52YXMiLHRoaXMuY2FudmFzKX0sX29uT2JqZWN0UmVtb3ZlZDpmdW5jdGlvbih0KXtkZWxldGUgdC5ncm91cCx0LnNldCgiYWN0aXZlIiwhMSl9LGRlbGVnYXRlZFByb3BlcnRpZXM6e2ZpbGw6ITAsc3Ryb2tlOiEwLHN0cm9rZVdpZHRoOiEwLGZvbnRGYW1pbHk6ITAsZm9udFdlaWdodDohMCxmb250U2l6ZTohMCxmb250U3R5bGU6ITAsbGluZUhlaWdodDohMCx0ZXh0RGVjb3JhdGlvbjohMCx0ZXh0QWxpZ246ITAsYmFja2dyb3VuZENvbG9yOiEwfSxfc2V0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fb2JqZWN0cy5sZW5ndGg7aWYodGhpcy5kZWxlZ2F0ZWRQcm9wZXJ0aWVzW3RdfHwiY2FudmFzIj09PXQpZm9yKDtpLS07KXRoaXMuX29iamVjdHNbaV0uc2V0KHQsZSk7ZWxzZSBmb3IoO2ktLTspdGhpcy5fb2JqZWN0c1tpXS5zZXRPbkdyb3VwKHQsZSk7dGhpcy5jYWxsU3VwZXIoIl9zZXQiLHQsZSl9LHRvT2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBpKHRoaXMuY2FsbFN1cGVyKCJ0b09iamVjdCIsdCkse29iamVjdHM6cyh0aGlzLl9vYmplY3RzLCJ0b09iamVjdCIsdCl9KX0scmVuZGVyOmZ1bmN0aW9uKHQpe2lmKHRoaXMudmlzaWJsZSl7dC5zYXZlKCksdGhpcy50cmFuc2Zvcm1NYXRyaXgmJnQudHJhbnNmb3JtLmFwcGx5KHQsdGhpcy50cmFuc2Zvcm1NYXRyaXgpLHRoaXMudHJhbnNmb3JtKHQpLHRoaXMuX3NldFNoYWRvdyh0KSx0aGlzLmNsaXBUbyYmZS51dGlsLmNsaXBDb250ZXh0KHRoaXMsdCksdGhpcy5fdHJhbnNmb3JtRG9uZT0hMDtmb3IodmFyIGk9MCxyPXRoaXMuX29iamVjdHMubGVuZ3RoO2k8cjtpKyspdGhpcy5fcmVuZGVyT2JqZWN0KHRoaXMuX29iamVjdHNbaV0sdCk7dGhpcy5jbGlwVG8mJnQucmVzdG9yZSgpLHQucmVzdG9yZSgpLHRoaXMuX3RyYW5zZm9ybURvbmU9ITF9fSxfcmVuZGVyQ29udHJvbHM6ZnVuY3Rpb24odCxlKXt0aGlzLmNhbGxTdXBlcigiX3JlbmRlckNvbnRyb2xzIix0LGUpO2Zvcih2YXIgaT0wLHI9dGhpcy5fb2JqZWN0cy5sZW5ndGg7aTxyO2krKyl0aGlzLl9vYmplY3RzW2ldLl9yZW5kZXJDb250cm9scyh0KX0sX3JlbmRlck9iamVjdDpmdW5jdGlvbih0LGUpe2lmKHQudmlzaWJsZSl7dmFyIGk9dC5oYXNSb3RhdGluZ1BvaW50O3QuaGFzUm90YXRpbmdQb2ludD0hMSx0LnJlbmRlcihlKSx0Lmhhc1JvdGF0aW5nUG9pbnQ9aX19LF9yZXN0b3JlT2JqZWN0c1N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29iamVjdHMuZm9yRWFjaCh0aGlzLl9yZXN0b3JlT2JqZWN0U3RhdGUsdGhpcyksdGhpc30scmVhbGl6ZVRyYW5zZm9ybTpmdW5jdGlvbih0KXt2YXIgaT10LmNhbGNUcmFuc2Zvcm1NYXRyaXgoKSxyPWUudXRpbC5xckRlY29tcG9zZShpKSxuPW5ldyBlLlBvaW50KHIudHJhbnNsYXRlWCxyLnRyYW5zbGF0ZVkpO3JldHVybiB0LnNjYWxlWD1yLnNjYWxlWCx0LnNjYWxlWT1yLnNjYWxlWSx0LnNrZXdYPXIuc2tld1gsdC5za2V3WT1yLnNrZXdZLHQuYW5nbGU9ci5hbmdsZSx0LmZsaXBYPSExLHQuZmxpcFk9ITEsdC5zZXRQb3NpdGlvbkJ5T3JpZ2luKG4sImNlbnRlciIsImNlbnRlciIpLHR9LF9yZXN0b3JlT2JqZWN0U3RhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVhbGl6ZVRyYW5zZm9ybSh0KSx0LnNldENvb3JkcygpLHQuaGFzQ29udHJvbHM9dC5fX29yaWdIYXNDb250cm9scyxkZWxldGUgdC5fX29yaWdIYXNDb250cm9scyx0LnNldCgiYWN0aXZlIiwhMSksZGVsZXRlIHQuZ3JvdXAsdGhpc30sZGVzdHJveTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXN0b3JlT2JqZWN0c1N0YXRlKCl9LHNhdmVDb29yZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZ2luYWxMZWZ0PXRoaXMuZ2V0KCJsZWZ0IiksdGhpcy5fb3JpZ2luYWxUb3A9dGhpcy5nZXQoInRvcCIpLHRoaXN9LGhhc01vdmVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWdpbmFsTGVmdCE9PXRoaXMuZ2V0KCJsZWZ0Iil8fHRoaXMuX29yaWdpbmFsVG9wIT09dGhpcy5nZXQoInRvcCIpfSxzZXRPYmplY3RzQ29vcmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZm9yRWFjaE9iamVjdChmdW5jdGlvbih0KXt0LnNldENvb3JkcygpfSksdGhpc30sX2NhbGNCb3VuZHM6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGkscixuPVtdLHM9W10sbz1bInRyIiwiYnIiLCJibCIsInRsIl0sYT0wLGg9dGhpcy5fb2JqZWN0cy5sZW5ndGgsYz1vLmxlbmd0aDthPGg7KythKWZvcihlPXRoaXMuX29iamVjdHNbYV0sZS5zZXRDb29yZHMoKSxyPTA7cjxjO3IrKylpPW9bcl0sbi5wdXNoKGUub0Nvb3Jkc1tpXS54KSxzLnB1c2goZS5vQ29vcmRzW2ldLnkpO3RoaXMuc2V0KHRoaXMuX2dldEJvdW5kcyhuLHMsdCkpfSxfZ2V0Qm91bmRzOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbz1lLnV0aWwuaW52ZXJ0VHJhbnNmb3JtKHRoaXMuZ2V0Vmlld3BvcnRUcmFuc2Zvcm0oKSksYT1lLnV0aWwudHJhbnNmb3JtUG9pbnQobmV3IGUuUG9pbnQocih0KSxyKGkpKSxvKSxoPWUudXRpbC50cmFuc2Zvcm1Qb2ludChuZXcgZS5Qb2ludChuKHQpLG4oaSkpLG8pLGM9e3dpZHRoOmgueC1hLnh8fDAsaGVpZ2h0OmgueS1hLnl8fDB9O3JldHVybiBzfHwoYy5sZWZ0PWEueHx8MCxjLnRvcD1hLnl8fDAsImNlbnRlciI9PT10aGlzLm9yaWdpblgmJihjLmxlZnQrPWMud2lkdGgvMiksInJpZ2h0Ij09PXRoaXMub3JpZ2luWCYmKGMubGVmdCs9Yy53aWR0aCksImNlbnRlciI9PT10aGlzLm9yaWdpblkmJihjLnRvcCs9Yy5oZWlnaHQvMiksImJvdHRvbSI9PT10aGlzLm9yaWdpblkmJihjLnRvcCs9Yy5oZWlnaHQpKSxjfSx0b1NWRzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jcmVhdGVCYXNlU1ZHTWFya3VwKCk7ZS5wdXNoKCI8ZyAiLHRoaXMuZ2V0U3ZnSWQoKSwndHJhbnNmb3JtPSInLHRoaXMuZ2V0U3ZnVHJhbnNmb3JtKCksdGhpcy5nZXRTdmdUcmFuc2Zvcm1NYXRyaXgoKSwnIiBzdHlsZT0iJyx0aGlzLmdldFN2Z0ZpbHRlcigpLCciPlxuJyk7Zm9yKHZhciBpPTAscj10aGlzLl9vYmplY3RzLmxlbmd0aDtpPHI7aSsrKWUucHVzaCgiXHQiLHRoaXMuX29iamVjdHNbaV0udG9TVkcodCkpO3JldHVybiBlLnB1c2goIjwvZz5cbiIpLHQ/dChlLmpvaW4oIiIpKTplLmpvaW4oIiIpfSxnZXQ6ZnVuY3Rpb24odCl7aWYodCBpbiBvKXtpZih0aGlzW3RdKXJldHVybiB0aGlzW3RdO2Zvcih2YXIgZT0wLGk9dGhpcy5fb2JqZWN0cy5sZW5ndGg7ZTxpO2UrKylpZih0aGlzLl9vYmplY3RzW2VdW3RdKXJldHVybiEwO3JldHVybiExfXJldHVybiB0IGluIHRoaXMuZGVsZWdhdGVkUHJvcGVydGllcz90aGlzLl9vYmplY3RzWzBdJiZ0aGlzLl9vYmplY3RzWzBdLmdldCh0KTp0aGlzW3RdfX0pLGUuR3JvdXAuZnJvbU9iamVjdD1mdW5jdGlvbih0LGkpe2UudXRpbC5lbmxpdmVuT2JqZWN0cyh0Lm9iamVjdHMsZnVuY3Rpb24ocil7ZGVsZXRlIHQub2JqZWN0cyxpJiZpKG5ldyBlLkdyb3VwKHIsdCwhMCkpfSl9LGUuR3JvdXAuYXN5bmM9ITB9fSgidW5kZWZpbmVkIiE9dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0aGlzKSxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGU9ZmFicmljLnV0aWwub2JqZWN0LmV4dGVuZDtpZih0LmZhYnJpY3x8KHQuZmFicmljPXt9KSx0LmZhYnJpYy5JbWFnZSlyZXR1cm4gdm9pZCBmYWJyaWMud2FybigiZmFicmljLkltYWdlIGlzIGFscmVhZHkgZGVmaW5lZC4iKTt2YXIgaT1mYWJyaWMuT2JqZWN0LnByb3RvdHlwZS5zdGF0ZVByb3BlcnRpZXMuY29uY2F0KCk7aS5wdXNoKCJhbGlnblgiLCJhbGlnblkiLCJtZWV0T3JTbGljZSIpLGZhYnJpYy5JbWFnZT1mYWJyaWMudXRpbC5jcmVhdGVDbGFzcyhmYWJyaWMuT2JqZWN0LHt0eXBlOiJpbWFnZSIsY3Jvc3NPcmlnaW46IiIsYWxpZ25YOiJub25lIixhbGlnblk6Im5vbmUiLG1lZXRPclNsaWNlOiJtZWV0IixzdHJva2VXaWR0aDowLF9sYXN0U2NhbGVYOjEsX2xhc3RTY2FsZVk6MSxtaW5pbXVtU2NhbGVUcmlnZ2VyOi41LHN0YXRlUHJvcGVydGllczppLGluaXRpYWxpemU6ZnVuY3Rpb24odCxlLGkpe2V8fChlPXt9KSx0aGlzLmZpbHRlcnM9W10sdGhpcy5yZXNpemVGaWx0ZXJzPVtdLHRoaXMuY2FsbFN1cGVyKCJpbml0aWFsaXplIixlKSx0aGlzLl9pbml0RWxlbWVudCh0LGUsaSl9LGdldEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxlbWVudH0sc2V0RWxlbWVudDpmdW5jdGlvbih0LGUsaSl7dmFyIHIsbjtyZXR1cm4gdGhpcy5fZWxlbWVudD10LHRoaXMuX29yaWdpbmFsRWxlbWVudD10LHRoaXMuX2luaXRDb25maWcoaSksMD09PXRoaXMucmVzaXplRmlsdGVycy5sZW5ndGg/cj1lOihuPXRoaXMscj1mdW5jdGlvbigpe24uYXBwbHlGaWx0ZXJzKGUsbi5yZXNpemVGaWx0ZXJzLG4uX2ZpbHRlcmVkRWx8fG4uX29yaWdpbmFsRWxlbWVudCwhMCl9KSwwIT09dGhpcy5maWx0ZXJzLmxlbmd0aD90aGlzLmFwcGx5RmlsdGVycyhyKTpyJiZyKHRoaXMpLHRoaXN9LHNldENyb3NzT3JpZ2luOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNyb3NzT3JpZ2luPXQsdGhpcy5fZWxlbWVudC5jcm9zc09yaWdpbj10LHRoaXN9LGdldE9yaWdpbmFsU2l6ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0RWxlbWVudCgpO3JldHVybnt3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH19LF9zdHJva2U6ZnVuY3Rpb24odCl7aWYodGhpcy5zdHJva2UmJjAhPT10aGlzLnN0cm9rZVdpZHRoKXt2YXIgZT10aGlzLndpZHRoLzIsaT10aGlzLmhlaWdodC8yO3QuYmVnaW5QYXRoKCksdC5tb3ZlVG8oLWUsLWkpLHQubGluZVRvKGUsLWkpLHQubGluZVRvKGUsaSksdC5saW5lVG8oLWUsaSksdC5saW5lVG8oLWUsLWkpLHQuY2xvc2VQYXRoKCl9fSxfcmVuZGVyRGFzaGVkU3Ryb2tlOmZ1bmN0aW9uKHQpe3ZhciBlPS10aGlzLndpZHRoLzIsaT0tdGhpcy5oZWlnaHQvMixyPXRoaXMud2lkdGgsbj10aGlzLmhlaWdodDt0LnNhdmUoKSx0aGlzLl9zZXRTdHJva2VTdHlsZXModCksdC5iZWdpblBhdGgoKSxmYWJyaWMudXRpbC5kcmF3RGFzaGVkTGluZSh0LGUsaSxlK3IsaSx0aGlzLnN0cm9rZURhc2hBcnJheSksZmFicmljLnV0aWwuZHJhd0Rhc2hlZExpbmUodCxlK3IsaSxlK3IsaStuLHRoaXMuc3Ryb2tlRGFzaEFycmF5KSxmYWJyaWMudXRpbC5kcmF3RGFzaGVkTGluZSh0LGUrcixpK24sZSxpK24sdGhpcy5zdHJva2VEYXNoQXJyYXkpLGZhYnJpYy51dGlsLmRyYXdEYXNoZWRMaW5lKHQsZSxpK24sZSxpLHRoaXMuc3Ryb2tlRGFzaEFycmF5KSx0LmNsb3NlUGF0aCgpLHQucmVzdG9yZSgpfSx0b09iamVjdDpmdW5jdGlvbih0KXt2YXIgaT1bXSxyPVtdLG49MSxzPTE7dGhpcy5maWx0ZXJzLmZvckVhY2goZnVuY3Rpb24odCl7dCYmKCJSZXNpemUiPT09dC50eXBlJiYobio9dC5zY2FsZVgscyo9dC5zY2FsZVkpLGkucHVzaCh0LnRvT2JqZWN0KCkpKX0pLHRoaXMucmVzaXplRmlsdGVycy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QmJnIucHVzaCh0LnRvT2JqZWN0KCkpfSk7dmFyIG89ZSh0aGlzLmNhbGxTdXBlcigidG9PYmplY3QiLHQpLHtzcmM6dGhpcy5nZXRTcmMoKSxmaWx0ZXJzOmkscmVzaXplRmlsdGVyczpyLGNyb3NzT3JpZ2luOnRoaXMuY3Jvc3NPcmlnaW4sYWxpZ25YOnRoaXMuYWxpZ25YLGFsaWduWTp0aGlzLmFsaWduWSxtZWV0T3JTbGljZTp0aGlzLm1lZXRPclNsaWNlfSk7cmV0dXJuIG8ud2lkdGgvPW4sby5oZWlnaHQvPXMsdGhpcy5pbmNsdWRlRGVmYXVsdFZhbHVlc3x8dGhpcy5fcmVtb3ZlRGVmYXVsdFZhbHVlcyhvKSxvfSx0b1NWRzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jcmVhdGVCYXNlU1ZHTWFya3VwKCksaT0tdGhpcy53aWR0aC8yLHI9LXRoaXMuaGVpZ2h0LzIsbj0ibm9uZSIscz0hMDtpZih0aGlzLmdyb3VwJiYicGF0aC1ncm91cCI9PT10aGlzLmdyb3VwLnR5cGUmJihpPXRoaXMubGVmdCxyPXRoaXMudG9wKSwibm9uZSIhPT10aGlzLmFsaWduWCYmIm5vbmUiIT09dGhpcy5hbGlnblkmJihuPSJ4Iit0aGlzLmFsaWduWCsiWSIrdGhpcy5hbGlnblkrIiAiK3RoaXMubWVldE9yU2xpY2UpLGUucHVzaCgnPGcgdHJhbnNmb3JtPSInLHRoaXMuZ2V0U3ZnVHJhbnNmb3JtKCksdGhpcy5nZXRTdmdUcmFuc2Zvcm1NYXRyaXgoKSwnIj5cbicsIjxpbWFnZSAiLHRoaXMuZ2V0U3ZnSWQoKSwneGxpbms6aHJlZj0iJyx0aGlzLmdldFN2Z1NyYyhzKSwnIiB4PSInLGksJyIgeT0iJyxyLCciIHN0eWxlPSInLHRoaXMuZ2V0U3ZnU3R5bGVzKCksJyIgd2lkdGg9IicsdGhpcy53aWR0aCwnIiBoZWlnaHQ9IicsdGhpcy5oZWlnaHQsJyIgcHJlc2VydmVBc3BlY3RSYXRpbz0iJyxuLCciJywiPjwvaW1hZ2U+XG4iKSx0aGlzLnN0cm9rZXx8dGhpcy5zdHJva2VEYXNoQXJyYXkpe3ZhciBvPXRoaXMuZmlsbDt0aGlzLmZpbGw9bnVsbCxlLnB1c2goIjxyZWN0ICIsJ3g9IicsaSwnIiB5PSInLHIsJyIgd2lkdGg9IicsdGhpcy53aWR0aCwnIiBoZWlnaHQ9IicsdGhpcy5oZWlnaHQsJyIgc3R5bGU9IicsdGhpcy5nZXRTdmdTdHlsZXMoKSwnIi8+XG4nKSx0aGlzLmZpbGw9b31yZXR1cm4gZS5wdXNoKCI8L2c+XG4iKSx0P3QoZS5qb2luKCIiKSk6ZS5qb2luKCIiKX0sZ2V0U3JjOmZ1bmN0aW9uKHQpe3ZhciBlPXQ/dGhpcy5fZWxlbWVudDp0aGlzLl9vcmlnaW5hbEVsZW1lbnQ7cmV0dXJuIGU/ZmFicmljLmlzTGlrZWx5Tm9kZT9lLl9zcmM6ZS5zcmM6dGhpcy5zcmN8fCIifSxzZXRTcmM6ZnVuY3Rpb24odCxlLGkpe2ZhYnJpYy51dGlsLmxvYWRJbWFnZSh0LGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNldEVsZW1lbnQodCxlLGkpfSx0aGlzLGkmJmkuY3Jvc3NPcmlnaW4pfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybicjPGZhYnJpYy5JbWFnZTogeyBzcmM6ICInK3RoaXMuZ2V0U3JjKCkrJyIgfT4nfSxhcHBseUZpbHRlcnM6ZnVuY3Rpb24odCxlLGkscil7aWYoZT1lfHx0aGlzLmZpbHRlcnMsaT1pfHx0aGlzLl9vcmlnaW5hbEVsZW1lbnQpe3ZhciBuLHMsbz1mYWJyaWMudXRpbC5jcmVhdGVJbWFnZSgpLGE9dGhpcy5jYW52YXM/dGhpcy5jYW52YXMuZ2V0UmV0aW5hU2NhbGluZygpOmZhYnJpYy5kZXZpY2VQaXhlbFJhdGlvLGg9dGhpcy5taW5pbXVtU2NhbGVUcmlnZ2VyL2EsYz10aGlzO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gdGhpcy5fZWxlbWVudD1pLHQmJnQodGhpcyksaTt2YXIgbD1mYWJyaWMudXRpbC5jcmVhdGVDYW52YXNFbGVtZW50KCk7cmV0dXJuIGwud2lkdGg9aS53aWR0aCxsLmhlaWdodD1pLmhlaWdodCxsLmdldENvbnRleHQoIjJkIikuZHJhd0ltYWdlKGksMCwwLGkud2lkdGgsaS5oZWlnaHQpLGUuZm9yRWFjaChmdW5jdGlvbih0KXt0JiYocj8obj1jLnNjYWxlWDxoP2Muc2NhbGVYOjEscz1jLnNjYWxlWTxoP2Muc2NhbGVZOjEsbiphPDEmJihuKj1hKSxzKmE8MSYmKHMqPWEpKToobj10LnNjYWxlWCxzPXQuc2NhbGVZKSx0LmFwcGx5VG8obCxuLHMpLHJ8fCJSZXNpemUiIT09dC50eXBlfHwoYy53aWR0aCo9dC5zY2FsZVgsYy5oZWlnaHQqPXQuc2NhbGVZKSl9KSxvLndpZHRoPWwud2lkdGgsby5oZWlnaHQ9bC5oZWlnaHQsZmFicmljLmlzTGlrZWx5Tm9kZT8oby5zcmM9bC50b0J1ZmZlcih2b2lkIDAsZmFicmljLkltYWdlLnBuZ0NvbXByZXNzaW9uKSxjLl9lbGVtZW50PW8sIXImJihjLl9maWx0ZXJlZEVsPW8pLHQmJnQoYykpOihvLm9ubG9hZD1mdW5jdGlvbigpe2MuX2VsZW1lbnQ9bywhciYmKGMuX2ZpbHRlcmVkRWw9byksdCYmdChjKSxvLm9ubG9hZD1sPW51bGx9LG8uc3JjPWwudG9EYXRhVVJMKCJpbWFnZS9wbmciKSksbH19LF9yZW5kZXI6ZnVuY3Rpb24odCxlKXt2YXIgaSxyLG4scz10aGlzLl9maW5kTWFyZ2lucygpO2k9ZT90aGlzLmxlZnQ6LXRoaXMud2lkdGgvMixyPWU/dGhpcy50b3A6LXRoaXMuaGVpZ2h0LzIsInNsaWNlIj09PXRoaXMubWVldE9yU2xpY2UmJih0LmJlZ2luUGF0aCgpLHQucmVjdChpLHIsdGhpcy53aWR0aCx0aGlzLmhlaWdodCksdC5jbGlwKCkpLHRoaXMuaXNNb3Zpbmc9PT0hMSYmdGhpcy5yZXNpemVGaWx0ZXJzLmxlbmd0aCYmdGhpcy5fbmVlZHNSZXNpemUoKT8odGhpcy5fbGFzdFNjYWxlWD10aGlzLnNjYWxlWCx0aGlzLl9sYXN0U2NhbGVZPXRoaXMuc2NhbGVZLG49dGhpcy5hcHBseUZpbHRlcnMobnVsbCx0aGlzLnJlc2l6ZUZpbHRlcnMsdGhpcy5fZmlsdGVyZWRFbHx8dGhpcy5fb3JpZ2luYWxFbGVtZW50LCEwKSk6bj10aGlzLl9lbGVtZW50LG4mJnQuZHJhd0ltYWdlKG4saStzLm1hcmdpblgscitzLm1hcmdpblkscy53aWR0aCxzLmhlaWdodCksdGhpcy5fc3Ryb2tlKHQpLHRoaXMuX3JlbmRlclN0cm9rZSh0KX0sX25lZWRzUmVzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2NhbGVYIT09dGhpcy5fbGFzdFNjYWxlWHx8dGhpcy5zY2FsZVkhPT10aGlzLl9sYXN0U2NhbGVZfSxfZmluZE1hcmdpbnM6ZnVuY3Rpb24oKXt2YXIgdCxlLGk9dGhpcy53aWR0aCxyPXRoaXMuaGVpZ2h0LG49MCxzPTA7cmV0dXJuIm5vbmUiPT09dGhpcy5hbGlnblgmJiJub25lIj09PXRoaXMuYWxpZ25ZfHwodD1bdGhpcy53aWR0aC90aGlzLl9lbGVtZW50LndpZHRoLHRoaXMuaGVpZ2h0L3RoaXMuX2VsZW1lbnQuaGVpZ2h0XSxlPSJtZWV0Ij09PXRoaXMubWVldE9yU2xpY2U/TWF0aC5taW4uYXBwbHkobnVsbCx0KTpNYXRoLm1heC5hcHBseShudWxsLHQpLGk9dGhpcy5fZWxlbWVudC53aWR0aCplLHI9dGhpcy5fZWxlbWVudC5oZWlnaHQqZSwiTWlkIj09PXRoaXMuYWxpZ25YJiYobj0odGhpcy53aWR0aC1pKS8yKSwiTWF4Ij09PXRoaXMuYWxpZ25YJiYobj10aGlzLndpZHRoLWkpLCJNaWQiPT09dGhpcy5hbGlnblkmJihzPSh0aGlzLmhlaWdodC1yKS8yKSwiTWF4Ij09PXRoaXMuYWxpZ25ZJiYocz10aGlzLmhlaWdodC1yKSkse3dpZHRoOmksaGVpZ2h0OnIsbWFyZ2luWDpuLG1hcmdpblk6c319LF9yZXNldFdpZHRoSGVpZ2h0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRFbGVtZW50KCk7dGhpcy5zZXQoIndpZHRoIix0LndpZHRoKSx0aGlzLnNldCgiaGVpZ2h0Iix0LmhlaWdodCl9LF9pbml0RWxlbWVudDpmdW5jdGlvbih0LGUsaSl7dGhpcy5zZXRFbGVtZW50KGZhYnJpYy51dGlsLmdldEJ5SWQodCksaSxlKSxmYWJyaWMudXRpbC5hZGRDbGFzcyh0aGlzLmdldEVsZW1lbnQoKSxmYWJyaWMuSW1hZ2UuQ1NTX0NBTlZBUyl9LF9pbml0Q29uZmlnOmZ1bmN0aW9uKHQpe3R8fCh0PXt9KSx0aGlzLnNldE9wdGlvbnModCksdGhpcy5fc2V0V2lkdGhIZWlnaHQodCksdGhpcy5fZWxlbWVudCYmdGhpcy5jcm9zc09yaWdpbiYmKHRoaXMuX2VsZW1lbnQuY3Jvc3NPcmlnaW49dGhpcy5jcm9zc09yaWdpbil9LF9pbml0RmlsdGVyczpmdW5jdGlvbih0LGUpe3QmJnQubGVuZ3RoP2ZhYnJpYy51dGlsLmVubGl2ZW5PYmplY3RzKHQsZnVuY3Rpb24odCl7ZSYmZSh0KX0sImZhYnJpYy5JbWFnZS5maWx0ZXJzIik6ZSYmZSgpfSxfc2V0V2lkdGhIZWlnaHQ6ZnVuY3Rpb24odCl7dGhpcy53aWR0aD0id2lkdGgiaW4gdD90LndpZHRoOnRoaXMuZ2V0RWxlbWVudCgpP3RoaXMuZ2V0RWxlbWVudCgpLndpZHRofHwwOjAsdGhpcy5oZWlnaHQ9ImhlaWdodCJpbiB0P3QuaGVpZ2h0OnRoaXMuZ2V0RWxlbWVudCgpP3RoaXMuZ2V0RWxlbWVudCgpLmhlaWdodHx8MDowfSxjb21wbGV4aXR5OmZ1bmN0aW9uKCl7cmV0dXJuIDF9fSksZmFicmljLkltYWdlLkNTU19DQU5WQVM9ImNhbnZhcy1pbWciLGZhYnJpYy5JbWFnZS5wcm90b3R5cGUuZ2V0U3ZnU3JjPWZhYnJpYy5JbWFnZS5wcm90b3R5cGUuZ2V0U3JjLGZhYnJpYy5JbWFnZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKHQsZSl7ZmFicmljLnV0aWwubG9hZEltYWdlKHQuc3JjLGZ1bmN0aW9uKGkpe2ZhYnJpYy5JbWFnZS5wcm90b3R5cGUuX2luaXRGaWx0ZXJzLmNhbGwodCx0LmZpbHRlcnMsZnVuY3Rpb24ocil7dC5maWx0ZXJzPXJ8fFtdLGZhYnJpYy5JbWFnZS5wcm90b3R5cGUuX2luaXRGaWx0ZXJzLmNhbGwodCx0LnJlc2l6ZUZpbHRlcnMsZnVuY3Rpb24ocil7cmV0dXJuIHQucmVzaXplRmlsdGVycz1yfHxbXSxuZXcgZmFicmljLkltYWdlKGksdCxlKX0pfSl9LG51bGwsdC5jcm9zc09yaWdpbil9LGZhYnJpYy5JbWFnZS5mcm9tVVJMPWZ1bmN0aW9uKHQsZSxpKXtmYWJyaWMudXRpbC5sb2FkSW1hZ2UodCxmdW5jdGlvbih0KXtlJiZlKG5ldyBmYWJyaWMuSW1hZ2UodCxpKSl9LG51bGwsaSYmaS5jcm9zc09yaWdpbil9LGZhYnJpYy5JbWFnZS5BVFRSSUJVVEVfTkFNRVM9ZmFicmljLlNIQVJFRF9BVFRSSUJVVEVTLmNvbmNhdCgieCB5IHdpZHRoIGhlaWdodCBwcmVzZXJ2ZUFzcGVjdFJhdGlvIHhsaW5rOmhyZWYiLnNwbGl0KCIgIikpLGZhYnJpYy5JbWFnZS5mcm9tRWxlbWVudD1mdW5jdGlvbih0LGkscil7dmFyIG4scz1mYWJyaWMucGFyc2VBdHRyaWJ1dGVzKHQsZmFicmljLkltYWdlLkFUVFJJQlVURV9OQU1FUyk7cy5wcmVzZXJ2ZUFzcGVjdFJhdGlvJiYobj1mYWJyaWMudXRpbC5wYXJzZVByZXNlcnZlQXNwZWN0UmF0aW9BdHRyaWJ1dGUocy5wcmVzZXJ2ZUFzcGVjdFJhdGlvKSxlKHMsbikpLGZhYnJpYy5JbWFnZS5mcm9tVVJMKHNbInhsaW5rOmhyZWYiXSxpLGUocj9mYWJyaWMudXRpbC5vYmplY3QuY2xvbmUocik6e30scykpfSxmYWJyaWMuSW1hZ2UuYXN5bmM9ITAsZmFicmljLkltYWdlLnBuZ0NvbXByZXNzaW9uPTF9KCJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnRoaXMpLGZhYnJpYy51dGlsLm9iamVjdC5leHRlbmQoZmFicmljLk9iamVjdC5wcm90b3R5cGUse19nZXRBbmdsZVZhbHVlRm9yU3RyYWlnaHRlbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0QW5nbGUoKSUzNjA7cmV0dXJuIHQ+MD85MCpNYXRoLnJvdW5kKCh0LTEpLzkwKTo5MCpNYXRoLnJvdW5kKHQvOTApfSxzdHJhaWdodGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0QW5nbGUodGhpcy5fZ2V0QW5nbGVWYWx1ZUZvclN0cmFpZ2h0ZW4oKSksdGhpc30sZnhTdHJhaWdodGVuOmZ1bmN0aW9uKHQpe3Q9dHx8e307dmFyIGU9ZnVuY3Rpb24oKXt9LGk9dC5vbkNvbXBsZXRlfHxlLHI9dC5vbkNoYW5nZXx8ZSxuPXRoaXM7cmV0dXJuIGZhYnJpYy51dGlsLmFuaW1hdGUoe3N0YXJ0VmFsdWU6dGhpcy5nZXQoImFuZ2xlIiksZW5kVmFsdWU6dGhpcy5fZ2V0QW5nbGVWYWx1ZUZvclN0cmFpZ2h0ZW4oKSxkdXJhdGlvbjp0aGlzLkZYX0RVUkFUSU9OLG9uQ2hhbmdlOmZ1bmN0aW9uKHQpe24uc2V0QW5nbGUodCkscigpfSxvbkNvbXBsZXRlOmZ1bmN0aW9uKCl7bi5zZXRDb29yZHMoKSxpKCl9LG9uU3RhcnQ6ZnVuY3Rpb24oKXtuLnNldCgiYWN0aXZlIiwhMSl9fSksdGhpc319KSxmYWJyaWMudXRpbC5vYmplY3QuZXh0ZW5kKGZhYnJpYy5TdGF0aWNDYW52YXMucHJvdG90eXBlLHtzdHJhaWdodGVuT2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiB0LnN0cmFpZ2h0ZW4oKSx0aGlzLnJlbmRlckFsbCgpLHRoaXN9LGZ4U3RyYWlnaHRlbk9iamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5meFN0cmFpZ2h0ZW4oe29uQ2hhbmdlOnRoaXMucmVuZGVyQWxsLmJpbmQodGhpcyl9KSx0aGlzfX0pLGZhYnJpYy5JbWFnZS5maWx0ZXJzPWZhYnJpYy5JbWFnZS5maWx0ZXJzfHx7fSxmYWJyaWMuSW1hZ2UuZmlsdGVycy5CYXNlRmlsdGVyPWZhYnJpYy51dGlsLmNyZWF0ZUNsYXNzKHt0eXBlOiJCYXNlRmlsdGVyIixpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3QmJnRoaXMuc2V0T3B0aW9ucyh0KX0sc2V0T3B0aW9uczpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdCl0aGlzW2VdPXRbZV19LHRvT2JqZWN0OmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6dGhpcy50eXBlfX0sdG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9PYmplY3QoKX19KSxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGU9dC5mYWJyaWN8fCh0LmZhYnJpYz17fSksaT1lLnV0aWwub2JqZWN0LmV4dGVuZCxyPWUuSW1hZ2UuZmlsdGVycyxuPWUudXRpbC5jcmVhdGVDbGFzcztyLkJyaWdodG5lc3M9bihyLkJhc2VGaWx0ZXIse3R5cGU6IkJyaWdodG5lc3MiLGluaXRpYWxpemU6ZnVuY3Rpb24odCl7dD10fHx7fSx0aGlzLmJyaWdodG5lc3M9dC5icmlnaHRuZXNzfHwwfSxhcHBseVRvOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LmdldENvbnRleHQoIjJkIiksaT1lLmdldEltYWdlRGF0YSgwLDAsdC53aWR0aCx0LmhlaWdodCkscj1pLmRhdGEsbj10aGlzLmJyaWdodG5lc3Mscz0wLG89ci5sZW5ndGg7czxvO3MrPTQpcltzXSs9bixyW3MrMV0rPW4scltzKzJdKz1uO2UucHV0SW1hZ2VEYXRhKGksMCwwKX0sdG9PYmplY3Q6ZnVuY3Rpb24oKXtyZXR1cm4gaSh0aGlzLmNhbGxTdXBlcigidG9PYmplY3QiKSx7YnJpZ2h0bmVzczp0aGlzLmJyaWdodG5lc3N9KX19KSxlLkltYWdlLmZpbHRlcnMuQnJpZ2h0bmVzcy5mcm9tT2JqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZS5JbWFnZS5maWx0ZXJzLkJyaWdodG5lc3ModCl9fSgidW5kZWZpbmVkIiE9dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0aGlzKSxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGU9dC5mYWJyaWN8fCh0LmZhYnJpYz17fSksaT1lLnV0aWwub2JqZWN0LmV4dGVuZCxyPWUuSW1hZ2UuZmlsdGVycyxuPWUudXRpbC5jcmVhdGVDbGFzcztyLkNvbnZvbHV0ZT1uKHIuQmFzZUZpbHRlcix7dHlwZToiQ29udm9sdXRlIixpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3Q9dHx8e30sdGhpcy5vcGFxdWU9dC5vcGFxdWUsdGhpcy5tYXRyaXg9dC5tYXRyaXh8fFswLDAsMCwwLDEsMCwwLDAsMF19LGFwcGx5VG86ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGkscixuLHMsbyxhLGgsYyxsPXRoaXMubWF0cml4LHU9dC5nZXRDb250ZXh0KCIyZCIpLGY9dS5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLGQ9TWF0aC5yb3VuZChNYXRoLnNxcnQobC5sZW5ndGgpKSxnPU1hdGguZmxvb3IoZC8yKSxwPWYuZGF0YSx2PWYud2lkdGgsYj1mLmhlaWdodCxtPXUuY3JlYXRlSW1hZ2VEYXRhKHYsYikseT1tLmRhdGEsXz10aGlzLm9wYXF1ZT8xOjAseD0wO3g8Yjt4KyspZm9yKHZhciBTPTA7Uzx2O1MrKyl7cz00Kih4KnYrUyksZT0wLGk9MCxyPTAsbj0wO2Zvcih2YXIgQz0wO0M8ZDtDKyspZm9yKHZhciB3PTA7dzxkO3crKylhPXgrQy1nLG89Uyt3LWcsYTwwfHxhPmJ8fG88MHx8bz52fHwoaD00KihhKnYrbyksYz1sW0MqZCt3XSxlKz1wW2hdKmMsaSs9cFtoKzFdKmMscis9cFtoKzJdKmMsbis9cFtoKzNdKmMpO3lbc109ZSx5W3MrMV09aSx5W3MrMl09cix5W3MrM109bitfKigyNTUtbil9dS5wdXRJbWFnZURhdGEobSwwLDApfSx0b09iamVjdDpmdW5jdGlvbigpe3JldHVybiBpKHRoaXMuY2FsbFN1cGVyKCJ0b09iamVjdCIpLHtvcGFxdWU6dGhpcy5vcGFxdWUsbWF0cml4OnRoaXMubWF0cml4fSl9fSksZS5JbWFnZS5maWx0ZXJzLkNvbnZvbHV0ZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZS5JbWFnZS5maWx0ZXJzLkNvbnZvbHV0ZSh0KX19KCJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnRoaXMpLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10LmZhYnJpY3x8KHQuZmFicmljPXt9KSxpPWUudXRpbC5vYmplY3QuZXh0ZW5kLHI9ZS5JbWFnZS5maWx0ZXJzLG49ZS51dGlsLmNyZWF0ZUNsYXNzO3IuR3JhZGllbnRUcmFuc3BhcmVuY3k9bihyLkJhc2VGaWx0ZXIse3R5cGU6IkdyYWRpZW50VHJhbnNwYXJlbmN5Iixpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3Q9dHx8e30sdGhpcy50aHJlc2hvbGQ9dC50aHJlc2hvbGR8fDEwMH0sYXBwbHlUbzpmdW5jdGlvbih0KXtmb3IodmFyIGU9dC5nZXRDb250ZXh0KCIyZCIpLGk9ZS5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLHI9aS5kYXRhLG49dGhpcy50aHJlc2hvbGQscz1yLmxlbmd0aCxvPTAsYT1yLmxlbmd0aDtvPGE7bys9NClyW28rM109bisyNTUqKHMtbykvcztlLnB1dEltYWdlRGF0YShpLDAsMCl9LHRvT2JqZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIGkodGhpcy5jYWxsU3VwZXIoInRvT2JqZWN0Iikse3RocmVzaG9sZDp0aGlzLnRocmVzaG9sZH0pfX0pLGUuSW1hZ2UuZmlsdGVycy5HcmFkaWVudFRyYW5zcGFyZW5jeS5mcm9tT2JqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZS5JbWFnZS5maWx0ZXJzLkdyYWRpZW50VHJhbnNwYXJlbmN5KHQpfX0oInVuZGVmaW5lZCIhPXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dGhpcyksZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3ZhciBlPXQuZmFicmljfHwodC5mYWJyaWM9e30pLGk9ZS5JbWFnZS5maWx0ZXJzLHI9ZS51dGlsLmNyZWF0ZUNsYXNzO2kuR3JheXNjYWxlPXIoaS5CYXNlRmlsdGVyLHt0eXBlOiJHcmF5c2NhbGUiLGFwcGx5VG86ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9dC5nZXRDb250ZXh0KCIyZCIpLHI9aS5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLG49ci5kYXRhLHM9ci53aWR0aCpyLmhlaWdodCo0LG89MDtvPHM7KWU9KG5bb10rbltvKzFdK25bbysyXSkvMyxuW29dPWUsbltvKzFdPWUsbltvKzJdPWUsbys9NDtpLnB1dEltYWdlRGF0YShyLDAsMCl9fSksZS5JbWFnZS5maWx0ZXJzLkdyYXlzY2FsZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlLkltYWdlLmZpbHRlcnMuR3JheXNjYWxlfX0oInVuZGVmaW5lZCIhPXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dGhpcyksZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3ZhciBlPXQuZmFicmljfHwodC5mYWJyaWM9e30pLGk9ZS5JbWFnZS5maWx0ZXJzLHI9ZS51dGlsLmNyZWF0ZUNsYXNzO2kuSW52ZXJ0PXIoaS5CYXNlRmlsdGVyLHt0eXBlOiJJbnZlcnQiLGFwcGx5VG86ZnVuY3Rpb24odCl7dmFyIGUsaT10LmdldENvbnRleHQoIjJkIikscj1pLmdldEltYWdlRGF0YSgwLDAsdC53aWR0aCx0LmhlaWdodCksbj1yLmRhdGEscz1uLmxlbmd0aDtmb3IoZT0wO2U8cztlKz00KW5bZV09MjU1LW5bZV0sbltlKzFdPTI1NS1uW2UrMV0sbltlKzJdPTI1NS1uW2UrMl07aS5wdXRJbWFnZURhdGEociwwLDApfX0pLGUuSW1hZ2UuZmlsdGVycy5JbnZlcnQuZnJvbU9iamVjdD1mdW5jdGlvbigpe3JldHVybiBuZXcgZS5JbWFnZS5maWx0ZXJzLkludmVydH19KCJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnRoaXMpLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10LmZhYnJpY3x8KHQuZmFicmljPXt9KSxpPWUudXRpbC5vYmplY3QuZXh0ZW5kLHI9ZS5JbWFnZS5maWx0ZXJzLG49ZS51dGlsLmNyZWF0ZUNsYXNzO3IuTWFzaz1uKHIuQmFzZUZpbHRlcix7dHlwZToiTWFzayIsaW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0PXR8fHt9LHRoaXMubWFzaz10Lm1hc2ssdGhpcy5jaGFubmVsPVswLDEsMiwzXS5pbmRleE9mKHQuY2hhbm5lbCk+LTE/dC5jaGFubmVsOjB9LGFwcGx5VG86ZnVuY3Rpb24odCl7aWYodGhpcy5tYXNrKXt2YXIgaSxyPXQuZ2V0Q29udGV4dCgiMmQiKSxuPXIuZ2V0SW1hZ2VEYXRhKDAsMCx0LndpZHRoLHQuaGVpZ2h0KSxzPW4uZGF0YSxvPXRoaXMubWFzay5nZXRFbGVtZW50KCksYT1lLnV0aWwuY3JlYXRlQ2FudmFzRWxlbWVudCgpLGg9dGhpcy5jaGFubmVsLGM9bi53aWR0aCpuLmhlaWdodCo0O2Eud2lkdGg9dC53aWR0aCxhLmhlaWdodD10LmhlaWdodCxhLmdldENvbnRleHQoIjJkIikuZHJhd0ltYWdlKG8sMCwwLHQud2lkdGgsdC5oZWlnaHQpO3ZhciBsPWEuZ2V0Q29udGV4dCgiMmQiKS5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLHU9bC5kYXRhO2ZvcihpPTA7aTxjO2krPTQpc1tpKzNdPXVbaStoXTtyLnB1dEltYWdlRGF0YShuLDAsMCl9fSx0b09iamVjdDpmdW5jdGlvbigpe3JldHVybiBpKHRoaXMuY2FsbFN1cGVyKCJ0b09iamVjdCIpLHttYXNrOnRoaXMubWFzay50b09iamVjdCgpLGNoYW5uZWw6dGhpcy5jaGFubmVsfSl9fSksZS5JbWFnZS5maWx0ZXJzLk1hc2suZnJvbU9iamVjdD1mdW5jdGlvbih0LGkpe2UudXRpbC5sb2FkSW1hZ2UodC5tYXNrLnNyYyxmdW5jdGlvbihyKXt0Lm1hc2s9bmV3IGUuSW1hZ2Uocix0Lm1hc2spLGkmJmkobmV3IGUuSW1hZ2UuZmlsdGVycy5NYXNrKHQpKX0pfSxlLkltYWdlLmZpbHRlcnMuTWFzay5hc3luYz0hMH0oInVuZGVmaW5lZCIhPXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dGhpcyksZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3ZhciBlPXQuZmFicmljfHwodC5mYWJyaWM9e30pLGk9ZS51dGlsLm9iamVjdC5leHRlbmQscj1lLkltYWdlLmZpbHRlcnMsbj1lLnV0aWwuY3JlYXRlQ2xhc3M7ci5Ob2lzZT1uKHIuQmFzZUZpbHRlcix7dHlwZToiTm9pc2UiLGluaXRpYWxpemU6ZnVuY3Rpb24odCl7dD10fHx7fSx0aGlzLm5vaXNlPXQubm9pc2V8fDB9LGFwcGx5VG86ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9dC5nZXRDb250ZXh0KCIyZCIpLHI9aS5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLG49ci5kYXRhLHM9dGhpcy5ub2lzZSxvPTAsYT1uLmxlbmd0aDtvPGE7bys9NCllPSguNS1NYXRoLnJhbmRvbSgpKSpzLG5bb10rPWUsbltvKzFdKz1lLG5bbysyXSs9ZTtpLnB1dEltYWdlRGF0YShyLDAsMCl9LHRvT2JqZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIGkodGhpcy5jYWxsU3VwZXIoInRvT2JqZWN0Iikse25vaXNlOnRoaXMubm9pc2V9KX19KSxlLkltYWdlLmZpbHRlcnMuTm9pc2UuZnJvbU9iamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUuSW1hZ2UuZmlsdGVycy5Ob2lzZSh0KX19KCJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnRoaXMpLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10LmZhYnJpY3x8KHQuZmFicmljPXt9KSxpPWUudXRpbC5vYmplY3QuZXh0ZW5kLHI9ZS5JbWFnZS5maWx0ZXJzLG49ZS51dGlsLmNyZWF0ZUNsYXNzO3IuUGl4ZWxhdGU9bihyLkJhc2VGaWx0ZXIse3R5cGU6IlBpeGVsYXRlIixpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3Q9dHx8e30sdGhpcy5ibG9ja3NpemU9dC5ibG9ja3NpemV8fDR9LGFwcGx5VG86ZnVuY3Rpb24odCl7dmFyIGUsaSxyLG4scyxvLGEsaD10LmdldENvbnRleHQoIjJkIiksYz1oLmdldEltYWdlRGF0YSgwLDAsdC53aWR0aCx0LmhlaWdodCksbD1jLmRhdGEsdT1jLmhlaWdodCxmPWMud2lkdGg7Zm9yKGk9MDtpPHU7aSs9dGhpcy5ibG9ja3NpemUpZm9yKHI9MDtyPGY7cis9dGhpcy5ibG9ja3NpemUpe2U9NCppKmYrNCpyLG49bFtlXSxzPWxbZSsxXSxvPWxbZSsyXSxhPWxbZSszXTtmb3IodmFyIGQ9aSxnPWkrdGhpcy5ibG9ja3NpemU7ZDxnO2QrKylmb3IodmFyIHA9cix2PXIrdGhpcy5ibG9ja3NpemU7cDx2O3ArKyllPTQqZCpmKzQqcCxsW2VdPW4sbFtlKzFdPXMsbFtlKzJdPW8sbFtlKzNdPWF9aC5wdXRJbWFnZURhdGEoYywwLDApfSx0b09iamVjdDpmdW5jdGlvbigpe3JldHVybiBpKHRoaXMuY2FsbFN1cGVyKCJ0b09iamVjdCIpLHtibG9ja3NpemU6dGhpcy5ibG9ja3NpemV9KX19KSxlLkltYWdlLmZpbHRlcnMuUGl4ZWxhdGUuZnJvbU9iamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUuSW1hZ2UuZmlsdGVycy5QaXhlbGF0ZSh0KX19KCJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnRoaXMpLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10LmZhYnJpY3x8KHQuZmFicmljPXt9KSxpPWUudXRpbC5vYmplY3QuZXh0ZW5kLHI9ZS5JbWFnZS5maWx0ZXJzLG49ZS51dGlsLmNyZWF0ZUNsYXNzO3IuUmVtb3ZlV2hpdGU9bihyLkJhc2VGaWx0ZXIse3R5cGU6IlJlbW92ZVdoaXRlIixpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3Q9dHx8e30sdGhpcy50aHJlc2hvbGQ9dC50aHJlc2hvbGR8fDMwLHRoaXMuZGlzdGFuY2U9dC5kaXN0YW5jZXx8MjB9LGFwcGx5VG86ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGkscixuPXQuZ2V0Q29udGV4dCgiMmQiKSxzPW4uZ2V0SW1hZ2VEYXRhKDAsMCx0LndpZHRoLHQuaGVpZ2h0KSxvPXMuZGF0YSxhPXRoaXMudGhyZXNob2xkLGg9dGhpcy5kaXN0YW5jZSxjPTI1NS1hLGw9TWF0aC5hYnMsdT0wLGY9by5sZW5ndGg7dTxmO3UrPTQpZT1vW3VdLGk9b1t1KzFdLHI9b1t1KzJdLGU+YyYmaT5jJiZyPmMmJmwoZS1pKTxoJiZsKGUtcik8aCYmbChpLXIpPGgmJihvW3UrM109MCk7bi5wdXRJbWFnZURhdGEocywwLDApfSx0b09iamVjdDpmdW5jdGlvbigpe3JldHVybiBpKHRoaXMuY2FsbFN1cGVyKCJ0b09iamVjdCIpLHt0aHJlc2hvbGQ6dGhpcy50aHJlc2hvbGQsZGlzdGFuY2U6dGhpcy5kaXN0YW5jZX0pfX0pLGUuSW1hZ2UuZmlsdGVycy5SZW1vdmVXaGl0ZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZS5JbWFnZS5maWx0ZXJzLlJlbW92ZVdoaXRlKHQpfX0oInVuZGVmaW5lZCIhPXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dGhpcyksZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3ZhciBlPXQuZmFicmljfHwodC5mYWJyaWM9e30pLGk9ZS5JbWFnZS5maWx0ZXJzLHI9ZS51dGlsLmNyZWF0ZUNsYXNzO2kuU2VwaWE9cihpLkJhc2VGaWx0ZXIse3R5cGU6IlNlcGlhIixhcHBseVRvOmZ1bmN0aW9uKHQpe3ZhciBlLGkscj10LmdldENvbnRleHQoIjJkIiksbj1yLmdldEltYWdlRGF0YSgwLDAsdC53aWR0aCx0LmhlaWdodCkscz1uLmRhdGEsbz1zLmxlbmd0aDtmb3IoZT0wO2U8bztlKz00KWk9LjMqc1tlXSsuNTkqc1tlKzFdKy4xMSpzW2UrMl0sc1tlXT1pKzEwMCxzW2UrMV09aSs1MCxzW2UrMl09aSsyNTU7ci5wdXRJbWFnZURhdGEobiwwLDApfX0pLGUuSW1hZ2UuZmlsdGVycy5TZXBpYS5mcm9tT2JqZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlLkltYWdlLmZpbHRlcnMuU2VwaWF9fSgidW5kZWZpbmVkIiE9dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0aGlzKSxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGU9dC5mYWJyaWN8fCh0LmZhYnJpYz17fSksaT1lLkltYWdlLmZpbHRlcnMscj1lLnV0aWwuY3JlYXRlQ2xhc3M7aS5TZXBpYTI9cihpLkJhc2VGaWx0ZXIse3R5cGU6IlNlcGlhMiIsYXBwbHlUbzpmdW5jdGlvbih0KXt2YXIgZSxpLHIsbixzPXQuZ2V0Q29udGV4dCgiMmQiKSxvPXMuZ2V0SW1hZ2VEYXRhKDAsMCx0LndpZHRoLHQuaGVpZ2h0KSxhPW8uZGF0YSxoPWEubGVuZ3RoO2ZvcihlPTA7ZTxoO2UrPTQpaT1hW2VdLHI9YVtlKzFdLG49YVtlKzJdLGFbZV09KC4zOTMqaSsuNzY5KnIrLjE4OSpuKS8xLjM1MSxhW2UrMV09KC4zNDkqaSsuNjg2KnIrLjE2OCpuKS8xLjIwMyxhW2UrMl09KC4yNzIqaSsuNTM0KnIrLjEzMSpuKS8yLjE0O3MucHV0SW1hZ2VEYXRhKG8sMCwwKX19KSxlLkltYWdlLmZpbHRlcnMuU2VwaWEyLmZyb21PYmplY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUuSW1hZ2UuZmlsdGVycy5TZXBpYTJ9fSgidW5kZWZpbmVkIiE9dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0aGlzKSxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGU9dC5mYWJyaWN8fCh0LmZhYnJpYz17fSksaT1lLnV0aWwub2JqZWN0LmV4dGVuZCxyPWUuSW1hZ2UuZmlsdGVycyxuPWUudXRpbC5jcmVhdGVDbGFzcztyLlRpbnQ9bihyLkJhc2VGaWx0ZXIse3R5cGU6IlRpbnQiLGluaXRpYWxpemU6ZnVuY3Rpb24odCl7dD10fHx7fSx0aGlzLmNvbG9yPXQuY29sb3J8fCIjMDAwMDAwIix0aGlzLm9wYWNpdHk9InVuZGVmaW5lZCIhPXR5cGVvZiB0Lm9wYWNpdHk/dC5vcGFjaXR5Om5ldyBlLkNvbG9yKHRoaXMuY29sb3IpLmdldEFscGhhKCl9LGFwcGx5VG86ZnVuY3Rpb24odCl7dmFyIGkscixuLHMsbyxhLGgsYyxsLHU9dC5nZXRDb250ZXh0KCIyZCIpLGY9dS5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLGQ9Zi5kYXRhLGc9ZC5sZW5ndGg7Zm9yKGw9bmV3IGUuQ29sb3IodGhpcy5jb2xvcikuZ2V0U291cmNlKCkscj1sWzBdKnRoaXMub3BhY2l0eSxuPWxbMV0qdGhpcy5vcGFjaXR5LHM9bFsyXSp0aGlzLm9wYWNpdHksYz0xLXRoaXMub3BhY2l0eSxpPTA7aTxnO2krPTQpbz1kW2ldLGE9ZFtpKzFdLGg9ZFtpKzJdLGRbaV09citvKmMsZFtpKzFdPW4rYSpjLGRbaSsyXT1zK2gqYzt1LnB1dEltYWdlRGF0YShmLDAsMCl9LHRvT2JqZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIGkodGhpcy5jYWxsU3VwZXIoInRvT2JqZWN0Iikse2NvbG9yOnRoaXMuY29sb3Isb3BhY2l0eTp0aGlzLm9wYWNpdHl9KX19KSxlLkltYWdlLmZpbHRlcnMuVGludC5mcm9tT2JqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZS5JbWFnZS5maWx0ZXJzLlRpbnQodCl9fSgidW5kZWZpbmVkIiE9dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0aGlzKSxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGU9dC5mYWJyaWN8fCh0LmZhYnJpYz17fSksaT1lLnV0aWwub2JqZWN0LmV4dGVuZCxyPWUuSW1hZ2UuZmlsdGVycyxuPWUudXRpbC5jcmVhdGVDbGFzcztyLk11bHRpcGx5PW4oci5CYXNlRmlsdGVyLHt0eXBlOiJNdWx0aXBseSIsaW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0PXR8fHt9LHRoaXMuY29sb3I9dC5jb2xvcnx8IiMwMDAwMDAifSxhcHBseVRvOmZ1bmN0aW9uKHQpe3ZhciBpLHIsbj10LmdldENvbnRleHQoIjJkIikscz1uLmdldEltYWdlRGF0YSgwLDAsdC53aWR0aCx0LmhlaWdodCksbz1zLmRhdGEsYT1vLmxlbmd0aDtmb3Iocj1uZXcgZS5Db2xvcih0aGlzLmNvbG9yKS5nZXRTb3VyY2UoKSxpPTA7aTxhO2krPTQpb1tpXSo9clswXS8yNTUsb1tpKzFdKj1yWzFdLzI1NSxvW2krMl0qPXJbMl0vMjU1O24ucHV0SW1hZ2VEYXRhKHMsMCwwKX0sdG9PYmplY3Q6ZnVuY3Rpb24oKXtyZXR1cm4gaSh0aGlzLmNhbGxTdXBlcigidG9PYmplY3QiKSx7Y29sb3I6dGhpcy5jb2xvcn0pfX0pLGUuSW1hZ2UuZmlsdGVycy5NdWx0aXBseS5mcm9tT2JqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZS5JbWFnZS5maWx0ZXJzLk11bHRpcGx5KHQpfX0oInVuZGVmaW5lZCIhPXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dGhpcyksZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3ZhciBlPXQuZmFicmljLGk9ZS5JbWFnZS5maWx0ZXJzLHI9ZS51dGlsLmNyZWF0ZUNsYXNzO2kuQmxlbmQ9cihpLkJhc2VGaWx0ZXIse3R5cGU6IkJsZW5kIixpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3Q9dHx8e30sdGhpcy5jb2xvcj10LmNvbG9yfHwiIzAwMCIsdGhpcy5pbWFnZT10LmltYWdlfHwhMSx0aGlzLm1vZGU9dC5tb2RlfHwibXVsdGlwbHkiLHRoaXMuYWxwaGE9dC5hbHBoYXx8MX0sYXBwbHlUbzpmdW5jdGlvbih0KXt2YXIgaSxyLG4scyxvLGEsaCxjLGwsdSxmPXQuZ2V0Q29udGV4dCgiMmQiKSxkPWYuZ2V0SW1hZ2VEYXRhKDAsMCx0LndpZHRoLHQuaGVpZ2h0KSxnPWQuZGF0YSxwPSExO2lmKHRoaXMuaW1hZ2Upe3A9ITA7dmFyIHY9ZS51dGlsLmNyZWF0ZUNhbnZhc0VsZW1lbnQoKTt2LndpZHRoPXRoaXMuaW1hZ2Uud2lkdGgsdi5oZWlnaHQ9dGhpcy5pbWFnZS5oZWlnaHQ7dmFyIGI9bmV3IGUuU3RhdGljQ2FudmFzKHYpO2IuYWRkKHRoaXMuaW1hZ2UpO3ZhciBtPWIuZ2V0Q29udGV4dCgiMmQiKTt1PW0uZ2V0SW1hZ2VEYXRhKDAsMCxiLndpZHRoLGIuaGVpZ2h0KS5kYXRhfWVsc2UgdT1uZXcgZS5Db2xvcih0aGlzLmNvbG9yKS5nZXRTb3VyY2UoKSxpPXVbMF0qdGhpcy5hbHBoYSxyPXVbMV0qdGhpcy5hbHBoYSxuPXVbMl0qdGhpcy5hbHBoYTtmb3IodmFyIHk9MCxfPWcubGVuZ3RoO3k8Xzt5Kz00KXN3aXRjaChzPWdbeV0sbz1nW3krMV0sYT1nW3krMl0scCYmKGk9dVt5XSp0aGlzLmFscGhhLHI9dVt5KzFdKnRoaXMuYWxwaGEsbj11W3krMl0qdGhpcy5hbHBoYSksdGhpcy5tb2RlKXtjYXNlIm11bHRpcGx5IjpnW3ldPXMqaS8yNTUsZ1t5KzFdPW8qci8yNTUsZ1t5KzJdPWEqbi8yNTU7YnJlYWs7Y2FzZSJzY3JlZW4iOmdbeV09MS0oMS1zKSooMS1pKSxnW3krMV09MS0oMS1vKSooMS1yKSxnW3krMl09MS0oMS1hKSooMS1uKTticmVhaztjYXNlImFkZCI6Z1t5XT1NYXRoLm1pbigyNTUscytpKSxnW3krMV09TWF0aC5taW4oMjU1LG8rciksZ1t5KzJdPU1hdGgubWluKDI1NSxhK24pO2JyZWFrO2Nhc2UiZGlmZiI6Y2FzZSJkaWZmZXJlbmNlIjpnW3ldPU1hdGguYWJzKHMtaSksZ1t5KzFdPU1hdGguYWJzKG8tciksZ1t5KzJdPU1hdGguYWJzKGEtbik7YnJlYWs7Y2FzZSJzdWJ0cmFjdCI6aD1zLWksYz1vLXIsbD1hLW4sZ1t5XT1oPDA/MDpoLGdbeSsxXT1jPDA/MDpjLGdbeSsyXT1sPDA/MDpsO2JyZWFrO2Nhc2UiZGFya2VuIjpnW3ldPU1hdGgubWluKHMsaSksZ1t5KzFdPU1hdGgubWluKG8sciksZ1t5KzJdPU1hdGgubWluKGEsbik7YnJlYWs7Y2FzZSJsaWdodGVuIjpnW3ldPU1hdGgubWF4KHMsaSksZ1t5KzFdPU1hdGgubWF4KG8sciksZ1t5KzJdPU1hdGgubWF4KGEsbil9Zi5wdXRJbWFnZURhdGEoZCwwLDApfSx0b09iamVjdDpmdW5jdGlvbigpe3JldHVybntjb2xvcjp0aGlzLmNvbG9yLGltYWdlOnRoaXMuaW1hZ2UsbW9kZTp0aGlzLm1vZGUsYWxwaGE6dGhpcy5hbHBoYX19fSksZS5JbWFnZS5maWx0ZXJzLkJsZW5kLmZyb21PYmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlLkltYWdlLmZpbHRlcnMuQmxlbmQodCl9fSgidW5kZWZpbmVkIiE9dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0aGlzKSxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGU9dC5mYWJyaWN8fCh0LmZhYnJpYz17fSksaT1NYXRoLnBvdyxyPU1hdGguZmxvb3Isbj1NYXRoLnNxcnQscz1NYXRoLmFicyxvPU1hdGgubWF4LGE9TWF0aC5yb3VuZCxoPU1hdGguc2luLGM9TWF0aC5jZWlsLGw9ZS5JbWFnZS5maWx0ZXJzLHU9ZS51dGlsLmNyZWF0ZUNsYXNzO2wuUmVzaXplPXUobC5CYXNlRmlsdGVyLHt0eXBlOiJSZXNpemUiLHJlc2l6ZVR5cGU6Imhlcm1pdGUiLHNjYWxlWDowLHNjYWxlWTowLGxhbmN6b3NMb2JlczozLGFwcGx5VG86ZnVuY3Rpb24odCxlLGkpe2lmKDEhPT1lfHwxIT09aSl7dGhpcy5yY3BTY2FsZVg9MS9lLHRoaXMucmNwU2NhbGVZPTEvaTt2YXIgcixuPXQud2lkdGgscz10LmhlaWdodCxvPWEobiplKSxoPWEocyppKTsic2xpY2VIYWNrIj09PXRoaXMucmVzaXplVHlwZSYmKHI9dGhpcy5zbGljZUJ5VHdvKHQsbixzLG8saCkpLCJoZXJtaXRlIj09PXRoaXMucmVzaXplVHlwZSYmKHI9dGhpcy5oZXJtaXRlRmFzdFJlc2l6ZSh0LG4scyxvLGgpKSwiYmlsaW5lYXIiPT09dGhpcy5yZXNpemVUeXBlJiYocj10aGlzLmJpbGluZWFyRmlsdGVyaW5nKHQsbixzLG8saCkpLCJsYW5jem9zIj09PXRoaXMucmVzaXplVHlwZSYmKHI9dGhpcy5sYW5jem9zUmVzaXplKHQsbixzLG8saCkpLHQud2lkdGg9byx0LmhlaWdodD1oLHQuZ2V0Q29udGV4dCgiMmQiKS5wdXRJbWFnZURhdGEociwwLDApfX0sc2xpY2VCeVR3bzpmdW5jdGlvbih0LGksbixzLGEpe3ZhciBoLGM9dC5nZXRDb250ZXh0KCIyZCIpLGw9LjUsdT0uNSxmPTEsZD0xLGc9ITEscD0hMSx2PWksYj1uLG09ZS51dGlsLmNyZWF0ZUNhbnZhc0VsZW1lbnQoKSx5PW0uZ2V0Q29udGV4dCgiMmQiKTtmb3Iocz1yKHMpLGE9cihhKSxtLndpZHRoPW8ocyxpKSxtLmhlaWdodD1vKGEsbikscz5pJiYobD0yLGY9LTEpLGE+biYmKHU9MixkPS0xKSxoPWMuZ2V0SW1hZ2VEYXRhKDAsMCxpLG4pLHQud2lkdGg9byhzLGkpLHQuaGVpZ2h0PW8oYSxuKSxjLnB1dEltYWdlRGF0YShoLDAsMCk7IWd8fCFwOylpPXYsbj1iLHMqZjxyKHYqbCpmKT92PXIodipsKToodj1zLGc9ITApLGEqZDxyKGIqdSpkKT9iPXIoYip1KTooYj1hLHA9ITApLGg9Yy5nZXRJbWFnZURhdGEoMCwwLGksbikseS5wdXRJbWFnZURhdGEoaCwwLDApLGMuY2xlYXJSZWN0KDAsMCx2LGIpLGMuZHJhd0ltYWdlKG0sMCwwLGksbiwwLDAsdixiKTtyZXR1cm4gYy5nZXRJbWFnZURhdGEoMCwwLHMsYSl9LGxhbmN6b3NSZXNpemU6ZnVuY3Rpb24odCxlLG8sYSxsKXtmdW5jdGlvbiB1KHQpe3JldHVybiBmdW5jdGlvbihlKXtpZihlPnQpcmV0dXJuIDA7aWYoZSo9TWF0aC5QSSxzKGUpPDFlLTE2KXJldHVybiAxO3ZhciBpPWUvdDtyZXR1cm4gaChlKSpoKGkpL2UvaX19ZnVuY3Rpb24gZih0KXt2YXIgaCxjLHUsZCxnLGosTSxBLFAsSSxEO2ZvcihULng9KHQrLjUpKnksay54PXIoVC54KSxoPTA7aDxsO2grKyl7Zm9yKFQueT0oaCsuNSkqXyxrLnk9cihULnkpLGc9MCxqPTAsTT0wLEE9MCxQPTAsYz1rLngtQztjPD1rLngrQztjKyspaWYoIShjPDB8fGM+PWUpKXtJPXIoMWUzKnMoYy1ULngpKSxPW0ldfHwoT1tJXT17fSk7Zm9yKHZhciBFPWsueS13O0U8PWsueSt3O0UrKylFPDB8fEU+PW98fChEPXIoMWUzKnMoRS1ULnkpKSxPW0ldW0RdfHwoT1tJXVtEXT1tKG4oaShJKngsMikraShEKlMsMikpLzFlMykpLHU9T1tJXVtEXSx1PjAmJihkPTQqKEUqZStjKSxnKz11LGorPXUqdltkXSxNKz11KnZbZCsxXSxBKz11KnZbZCsyXSxQKz11KnZbZCszXSkpfWQ9NCooaCphK3QpLGJbZF09ai9nLGJbZCsxXT1NL2csYltkKzJdPUEvZyxiW2QrM109UC9nfXJldHVybisrdDxhP2YodCk6cH12YXIgZD10LmdldENvbnRleHQoIjJkIiksZz1kLmdldEltYWdlRGF0YSgwLDAsZSxvKSxwPWQuZ2V0SW1hZ2VEYXRhKDAsMCxhLGwpLHY9Zy5kYXRhLGI9cC5kYXRhLG09dSh0aGlzLmxhbmN6b3NMb2JlcykseT10aGlzLnJjcFNjYWxlWCxfPXRoaXMucmNwU2NhbGVZLHg9Mi90aGlzLnJjcFNjYWxlWCxTPTIvdGhpcy5yY3BTY2FsZVksQz1jKHkqdGhpcy5sYW5jem9zTG9iZXMvMiksdz1jKF8qdGhpcy5sYW5jem9zTG9iZXMvMiksTz17fSxUPXt9LGs9e307cmV0dXJuIGYoMCl9LGJpbGluZWFyRmlsdGVyaW5nOmZ1bmN0aW9uKHQsZSxpLG4scyl7dmFyIG8sYSxoLGMsbCx1LGYsZCxnLHAsdixiLG0seT0wLF89dGhpcy5yY3BTY2FsZVgseD10aGlzLnJjcFNjYWxlWSxTPXQuZ2V0Q29udGV4dCgiMmQiKSxDPTQqKGUtMSksdz1TLmdldEltYWdlRGF0YSgwLDAsZSxpKSxPPXcuZGF0YSxUPVMuZ2V0SW1hZ2VEYXRhKDAsMCxuLHMpLGs9VC5kYXRhO2ZvcihmPTA7ZjxzO2YrKylmb3IoZD0wO2Q8bjtkKyspZm9yKGw9cihfKmQpLHU9cih4KmYpLGc9XypkLWwscD14KmYtdSxtPTQqKHUqZStsKSx2PTA7djw0O3YrKylvPU9bbSt2XSxhPU9bbSs0K3ZdLGg9T1ttK0Mrdl0sYz1PW20rQys0K3ZdLGI9byooMS1nKSooMS1wKSthKmcqKDEtcCkraCpwKigxLWcpK2MqZypwLGtbeSsrXT1iO3JldHVybiBUfSxoZXJtaXRlRmFzdFJlc2l6ZTpmdW5jdGlvbih0LGUsaSxvLGEpe2Zvcih2YXIgaD10aGlzLnJjcFNjYWxlWCxsPXRoaXMucmNwU2NhbGVZLHU9YyhoLzIpLGY9YyhsLzIpLGQ9dC5nZXRDb250ZXh0KCIyZCIpLGc9ZC5nZXRJbWFnZURhdGEoMCwwLGUsaSkscD1nLmRhdGEsdj1kLmdldEltYWdlRGF0YSgwLDAsbyxhKSxiPXYuZGF0YSxtPTA7bTxhO20rKylmb3IodmFyIHk9MDt5PG87eSsrKXtmb3IodmFyIF89NCooeSttKm8pLHg9MCxTPTAsQz0wLHc9MCxPPTAsVD0wLGs9MCxqPShtKy41KSpsLE09cihtKmwpO008KG0rMSkqbDtNKyspZm9yKHZhciBBPXMoai0oTSsuNSkpL2YsUD0oeSsuNSkqaCxJPUEqQSxEPXIoeSpoKTtEPCh5KzEpKmg7RCsrKXt2YXIgRT1zKFAtKEQrLjUpKS91LEw9bihJK0UqRSk7TD4xJiZMPC0xfHwoeD0yKkwqTCpMLTMqTCpMKzEseD4wJiYoRT00KihEK00qZSksays9eCpwW0UrM10sQys9eCxwW0UrM108MjU1JiYoeD14KnBbRSszXS8yNTApLHcrPXgqcFtFXSxPKz14KnBbRSsxXSxUKz14KnBbRSsyXSxTKz14KSl9YltfXT13L1MsYltfKzFdPU8vUyxiW18rMl09VC9TLGJbXyszXT1rL0N9cmV0dXJuIHZ9LHRvT2JqZWN0OmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6dGhpcy50eXBlLHNjYWxlWDp0aGlzLnNjYWxlWCxzY2FsZVk6dGhpcy5zY2FsZVkscmVzaXplVHlwZTp0aGlzLnJlc2l6ZVR5cGUsbGFuY3pvc0xvYmVzOnRoaXMubGFuY3pvc0xvYmVzfX19KSxlLkltYWdlLmZpbHRlcnMuUmVzaXplLmZyb21PYmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlLkltYWdlLmZpbHRlcnMuUmVzaXplKHQpfX0oInVuZGVmaW5lZCIhPXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dGhpcyksZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3ZhciBlPXQuZmFicmljfHwodC5mYWJyaWM9e30pLGk9ZS51dGlsLm9iamVjdC5leHRlbmQscj1lLkltYWdlLmZpbHRlcnMsbj1lLnV0aWwuY3JlYXRlQ2xhc3M7ci5Db2xvck1hdHJpeD1uKHIuQmFzZUZpbHRlcix7dHlwZToiQ29sb3JNYXRyaXgiLGluaXRpYWxpemU6ZnVuY3Rpb24odCl7dHx8KHQ9e30pLHRoaXMubWF0cml4PXQubWF0cml4fHxbMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwXX0sYXBwbHlUbzpmdW5jdGlvbih0KXt2YXIgZSxpLHIsbixzLG89dC5nZXRDb250ZXh0KCIyZCIpLGE9by5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLGg9YS5kYXRhLGM9aC5sZW5ndGgsbD10aGlzLm1hdHJpeDtmb3IoZT0wO2U8YztlKz00KWk9aFtlXSxyPWhbZSsxXSxuPWhbZSsyXSxzPWhbZSszXSxoW2VdPWkqbFswXStyKmxbMV0rbipsWzJdK3MqbFszXStsWzRdLGhbZSsxXT1pKmxbNV0rcipsWzZdK24qbFs3XStzKmxbOF0rbFs5XSxoW2UrMl09aSpsWzEwXStyKmxbMTFdK24qbFsxMl0rcypsWzEzXStsWzE0XSxoW2UrM109aSpsWzE1XStyKmxbMTZdK24qbFsxN10rcypsWzE4XStsWzE5XTtvLnB1dEltYWdlRGF0YShhLDAsMCl9LHRvT2JqZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIGkodGhpcy5jYWxsU3VwZXIoInRvT2JqZWN0Iikse3R5cGU6dGhpcy50eXBlLG1hdHJpeDp0aGlzLm1hdHJpeH0pfX0pLGUuSW1hZ2UuZmlsdGVycy5Db2xvck1hdHJpeC5mcm9tT2JqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZS5JbWFnZS5maWx0ZXJzLkNvbG9yTWF0cml4KHQpfX0oInVuZGVmaW5lZCIhPXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dGhpcyksZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO3ZhciBlPXQuZmFicmljfHwodC5mYWJyaWM9e30pLGk9ZS51dGlsLm9iamVjdC5leHRlbmQscj1lLkltYWdlLmZpbHRlcnMsbj1lLnV0aWwuY3JlYXRlQ2xhc3M7ci5Db250cmFzdD1uKHIuQmFzZUZpbHRlcix7dHlwZToiQ29udHJhc3QiLGluaXRpYWxpemU6ZnVuY3Rpb24odCl7dD10fHx7fSx0aGlzLmNvbnRyYXN0PXQuY29udHJhc3R8fDB9LGFwcGx5VG86ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuZ2V0Q29udGV4dCgiMmQiKSxpPWUuZ2V0SW1hZ2VEYXRhKDAsMCx0LndpZHRoLHQuaGVpZ2h0KSxyPWkuZGF0YSxuPTI1OSoodGhpcy5jb250cmFzdCsyNTUpLygyNTUqKDI1OS10aGlzLmNvbnRyYXN0KSkscz0wLG89ci5sZW5ndGg7czxvO3MrPTQpcltzXT1uKihyW3NdLTEyOCkrMTI4LHJbcysxXT1uKihyW3MrMV0tMTI4KSsxMjgscltzKzJdPW4qKHJbcysyXS0xMjgpKzEyODtlLnB1dEltYWdlRGF0YShpLDAsMCl9LHRvT2JqZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIGkodGhpcy5jYWxsU3VwZXIoInRvT2JqZWN0Iikse2NvbnRyYXN0OnRoaXMuY29udHJhc3R9KX19KSxlLkltYWdlLmZpbHRlcnMuQ29udHJhc3QuZnJvbU9iamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUuSW1hZ2UuZmlsdGVycy5Db250cmFzdCh0KX19KCJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnRoaXMpLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10LmZhYnJpY3x8KHQuZmFicmljPXt9KSxpPWUudXRpbC5vYmplY3QuZXh0ZW5kLHI9ZS5JbWFnZS5maWx0ZXJzLG49ZS51dGlsLmNyZWF0ZUNsYXNzO3IuU2F0dXJhdGU9bihyLkJhc2VGaWx0ZXIsewp0eXBlOiJTYXR1cmF0ZSIsaW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0PXR8fHt9LHRoaXMuc2F0dXJhdGU9dC5zYXR1cmF0ZXx8MCx0aGlzLmxvYWRQcm9ncmFtKCl9LGFwcGx5VG86ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9dC5nZXRDb250ZXh0KCIyZCIpLHI9aS5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLG49ci5kYXRhLHM9LjAxKi10aGlzLnNhdHVyYXRlLG89MCxhPW4ubGVuZ3RoO288YTtvKz00KWU9TWF0aC5tYXgobltvXSxuW28rMV0sbltvKzJdKSxuW29dKz1lIT09bltvXT8oZS1uW29dKSpzOjAsbltvKzFdKz1lIT09bltvKzFdPyhlLW5bbysxXSkqczowLG5bbysyXSs9ZSE9PW5bbysyXT8oZS1uW28rMl0pKnM6MDtpLnB1dEltYWdlRGF0YShyLDAsMCl9LHRvT2JqZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIGkodGhpcy5jYWxsU3VwZXIoInRvT2JqZWN0Iikse3NhdHVyYXRlOnRoaXMuc2F0dXJhdGV9KX19KSxlLkltYWdlLmZpbHRlcnMuU2F0dXJhdGUuZnJvbU9iamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUuSW1hZ2UuZmlsdGVycy5TYXR1cmF0ZSh0KX19KCJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnRoaXMpLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10LmZhYnJpY3x8KHQuZmFicmljPXt9KSxpPWUudXRpbC5vYmplY3QuZXh0ZW5kLHI9ZS51dGlsLm9iamVjdC5jbG9uZSxuPWUudXRpbC50b0ZpeGVkLHM9ZS5PYmplY3QuTlVNX0ZSQUNUSU9OX0RJR0lUUyxvPTI7aWYoZS5UZXh0KXJldHVybiB2b2lkIGUud2FybigiZmFicmljLlRleHQgaXMgYWxyZWFkeSBkZWZpbmVkIik7dmFyIGE9ZS5PYmplY3QucHJvdG90eXBlLnN0YXRlUHJvcGVydGllcy5jb25jYXQoKTthLnB1c2goImZvbnRGYW1pbHkiLCJmb250V2VpZ2h0IiwiZm9udFNpemUiLCJ0ZXh0IiwidGV4dERlY29yYXRpb24iLCJ0ZXh0QWxpZ24iLCJmb250U3R5bGUiLCJsaW5lSGVpZ2h0IiwidGV4dEJhY2tncm91bmRDb2xvciIpLGUuVGV4dD1lLnV0aWwuY3JlYXRlQ2xhc3MoZS5PYmplY3Qse19kaW1lbnNpb25BZmZlY3RpbmdQcm9wczp7Zm9udFNpemU6ITAsZm9udFdlaWdodDohMCxmb250RmFtaWx5OiEwLGZvbnRTdHlsZTohMCxsaW5lSGVpZ2h0OiEwLHRleHQ6ITAsY2hhclNwYWNpbmc6ITAsdGV4dEFsaWduOiEwLHN0cm9rZVdpZHRoOiExfSxfcmVOZXdsaW5lOi9ccj9cbi8sX3JlU3BhY2VzQW5kVGFiczovWyBcdFxyXSsvZyx0eXBlOiJ0ZXh0Iixmb250U2l6ZTo0MCxmb250V2VpZ2h0OiJub3JtYWwiLGZvbnRGYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsdGV4dERlY29yYXRpb246IiIsdGV4dEFsaWduOiJsZWZ0Iixmb250U3R5bGU6IiIsbGluZUhlaWdodDoxLjE2LHRleHRCYWNrZ3JvdW5kQ29sb3I6IiIsc3RhdGVQcm9wZXJ0aWVzOmEsc3Ryb2tlOm51bGwsc2hhZG93Om51bGwsX2ZvbnRTaXplRnJhY3Rpb246LjI1LF9mb250U2l6ZU11bHQ6MS4xMyxjaGFyU3BhY2luZzowLGluaXRpYWxpemU6ZnVuY3Rpb24odCxlKXtlPWV8fHt9LHRoaXMudGV4dD10LHRoaXMuX19za2lwRGltZW5zaW9uPSEwLHRoaXMuc2V0T3B0aW9ucyhlKSx0aGlzLl9fc2tpcERpbWVuc2lvbj0hMSx0aGlzLl9pbml0RGltZW5zaW9ucygpfSxfaW5pdERpbWVuc2lvbnM6ZnVuY3Rpb24odCl7dGhpcy5fX3NraXBEaW1lbnNpb258fCh0fHwodD1lLnV0aWwuY3JlYXRlQ2FudmFzRWxlbWVudCgpLmdldENvbnRleHQoIjJkIiksdGhpcy5fc2V0VGV4dFN0eWxlcyh0KSksdGhpcy5fdGV4dExpbmVzPXRoaXMuX3NwbGl0VGV4dEludG9MaW5lcygpLHRoaXMuX2NsZWFyQ2FjaGUoKSx0aGlzLndpZHRoPXRoaXMuX2dldFRleHRXaWR0aCh0KXx8dGhpcy5jdXJzb3JXaWR0aHx8byx0aGlzLmhlaWdodD10aGlzLl9nZXRUZXh0SGVpZ2h0KHQpKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iIzxmYWJyaWMuVGV4dCAoIit0aGlzLmNvbXBsZXhpdHkoKSsnKTogeyAidGV4dCI6ICInK3RoaXMudGV4dCsnIiwgImZvbnRGYW1pbHkiOiAiJyt0aGlzLmZvbnRGYW1pbHkrJyIgfT4nfSxfcmVuZGVyOmZ1bmN0aW9uKHQpe3RoaXMuY2xpcFRvJiZlLnV0aWwuY2xpcENvbnRleHQodGhpcyx0KSx0aGlzLl9zZXRPcGFjaXR5KHQpLHRoaXMuX3NldFNoYWRvdyh0KSx0aGlzLl9zZXR1cENvbXBvc2l0ZU9wZXJhdGlvbih0KSx0aGlzLl9yZW5kZXJUZXh0QmFja2dyb3VuZCh0KSx0aGlzLl9zZXRTdHJva2VTdHlsZXModCksdGhpcy5fc2V0RmlsbFN0eWxlcyh0KSx0aGlzLl9yZW5kZXJUZXh0KHQpLHRoaXMuX3JlbmRlclRleHREZWNvcmF0aW9uKHQpLHRoaXMuY2xpcFRvJiZ0LnJlc3RvcmUoKX0sX3JlbmRlclRleHQ6ZnVuY3Rpb24odCl7dGhpcy5fcmVuZGVyVGV4dEZpbGwodCksdGhpcy5fcmVuZGVyVGV4dFN0cm9rZSh0KX0sX3NldFRleHRTdHlsZXM6ZnVuY3Rpb24odCl7dC50ZXh0QmFzZWxpbmU9ImFscGhhYmV0aWMiLHQuZm9udD10aGlzLl9nZXRGb250RGVjbGFyYXRpb24oKX0sX2dldFRleHRIZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0SGVpZ2h0T2ZTaW5nbGVMaW5lKCkrKHRoaXMuX3RleHRMaW5lcy5sZW5ndGgtMSkqdGhpcy5fZ2V0SGVpZ2h0T2ZMaW5lKCl9LF9nZXRUZXh0V2lkdGg6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2dldExpbmVXaWR0aCh0LDApLGk9MSxyPXRoaXMuX3RleHRMaW5lcy5sZW5ndGg7aTxyO2krKyl7dmFyIG49dGhpcy5fZ2V0TGluZVdpZHRoKHQsaSk7bj5lJiYoZT1uKX1yZXR1cm4gZX0sX2dldE5vblRyYW5zZm9ybWVkRGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybnt4OnRoaXMud2lkdGgseTp0aGlzLmhlaWdodH19LF9yZW5kZXJDaGFyczpmdW5jdGlvbih0LGUsaSxyLG4pe3ZhciBzLG8sYT10LnNsaWNlKDAsLTQpO2lmKHRoaXNbYV0udG9MaXZlKXt2YXIgaD0tdGhpcy53aWR0aC8yK3RoaXNbYV0ub2Zmc2V0WHx8MCxjPS10aGlzLmhlaWdodC8yK3RoaXNbYV0ub2Zmc2V0WXx8MDtlLnNhdmUoKSxlLnRyYW5zbGF0ZShoLGMpLHItPWgsbi09Y31pZigwIT09dGhpcy5jaGFyU3BhY2luZyl7dmFyIGw9dGhpcy5fZ2V0V2lkdGhPZkNoYXJTcGFjaW5nKCk7aT1pLnNwbGl0KCIiKTtmb3IodmFyIHU9MCxmPWkubGVuZ3RoO3U8Zjt1Kyspcz1pW3VdLG89ZS5tZWFzdXJlVGV4dChzKS53aWR0aCtsLGVbdF0ocyxyLG4pLHIrPW8+MD9vOjB9ZWxzZSBlW3RdKGkscixuKTt0aGlzW2FdLnRvTGl2ZSYmZS5yZXN0b3JlKCl9LF9yZW5kZXJUZXh0TGluZTpmdW5jdGlvbih0LGUsaSxyLG4scyl7bi09dGhpcy5mb250U2l6ZSp0aGlzLl9mb250U2l6ZUZyYWN0aW9uO3ZhciBvPXRoaXMuX2dldExpbmVXaWR0aChlLHMpO2lmKCJqdXN0aWZ5IiE9PXRoaXMudGV4dEFsaWdufHx0aGlzLndpZHRoPG8pcmV0dXJuIHZvaWQgdGhpcy5fcmVuZGVyQ2hhcnModCxlLGkscixuLHMpO2Zvcih2YXIgYSxoPWkuc3BsaXQoL1xzKy8pLGM9MCxsPXRoaXMuX2dldFdpZHRoT2ZXb3JkcyhlLGguam9pbigiIikscywwKSx1PXRoaXMud2lkdGgtbCxmPWgubGVuZ3RoLTEsZD1mPjA/dS9mOjAsZz0wLHA9MCx2PWgubGVuZ3RoO3A8djtwKyspe2Zvcig7IiAiPT09aVtjXSYmYzxpLmxlbmd0aDspYysrO2E9aFtwXSx0aGlzLl9yZW5kZXJDaGFycyh0LGUsYSxyK2csbixzLGMpLGcrPXRoaXMuX2dldFdpZHRoT2ZXb3JkcyhlLGEscyxjKStkLGMrPWEubGVuZ3RofX0sX2dldFdpZHRoT2ZXb3JkczpmdW5jdGlvbih0LGUpe3ZhciBpLHIsbj10Lm1lYXN1cmVUZXh0KGUpLndpZHRoO3JldHVybiAwIT09dGhpcy5jaGFyU3BhY2luZyYmKGk9ZS5zcGxpdCgiIikubGVuZ3RoLHI9aSp0aGlzLl9nZXRXaWR0aE9mQ2hhclNwYWNpbmcoKSxuKz1yKSxuPjA/bjowfSxfZ2V0TGVmdE9mZnNldDpmdW5jdGlvbigpe3JldHVybi10aGlzLndpZHRoLzJ9LF9nZXRUb3BPZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4tdGhpcy5oZWlnaHQvMn0saXNFbXB0eVN0eWxlczpmdW5jdGlvbigpe3JldHVybiEwfSxfcmVuZGVyVGV4dENvbW1vbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0wLHI9dGhpcy5fZ2V0TGVmdE9mZnNldCgpLG49dGhpcy5fZ2V0VG9wT2Zmc2V0KCkscz0wLG89dGhpcy5fdGV4dExpbmVzLmxlbmd0aDtzPG87cysrKXt2YXIgYT10aGlzLl9nZXRIZWlnaHRPZkxpbmUodCxzKSxoPWEvdGhpcy5saW5lSGVpZ2h0LGM9dGhpcy5fZ2V0TGluZVdpZHRoKHQscyksbD10aGlzLl9nZXRMaW5lTGVmdE9mZnNldChjKTt0aGlzLl9yZW5kZXJUZXh0TGluZShlLHQsdGhpcy5fdGV4dExpbmVzW3NdLHIrbCxuK2kraCxzKSxpKz1hfX0sX3JlbmRlclRleHRGaWxsOmZ1bmN0aW9uKHQpeyF0aGlzLmZpbGwmJnRoaXMuaXNFbXB0eVN0eWxlcygpfHx0aGlzLl9yZW5kZXJUZXh0Q29tbW9uKHQsImZpbGxUZXh0Iil9LF9yZW5kZXJUZXh0U3Ryb2tlOmZ1bmN0aW9uKHQpeyh0aGlzLnN0cm9rZSYmMCE9PXRoaXMuc3Ryb2tlV2lkdGh8fCF0aGlzLmlzRW1wdHlTdHlsZXMoKSkmJih0aGlzLnNoYWRvdyYmIXRoaXMuc2hhZG93LmFmZmVjdFN0cm9rZSYmdGhpcy5fcmVtb3ZlU2hhZG93KHQpLHQuc2F2ZSgpLHRoaXMuX3NldExpbmVEYXNoKHQsdGhpcy5zdHJva2VkYXNoQXJyYXkpLHQuYmVnaW5QYXRoKCksdGhpcy5fcmVuZGVyVGV4dENvbW1vbih0LCJzdHJva2VUZXh0IiksdC5jbG9zZVBhdGgoKSx0LnJlc3RvcmUoKSl9LF9nZXRIZWlnaHRPZkxpbmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0SGVpZ2h0T2ZTaW5nbGVMaW5lKCkqdGhpcy5saW5lSGVpZ2h0fSxfZ2V0SGVpZ2h0T2ZTaW5nbGVMaW5lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZm9udFNpemUqdGhpcy5fZm9udFNpemVNdWx0fSxfcmVuZGVyVGV4dEJhY2tncm91bmQ6ZnVuY3Rpb24odCl7dGhpcy5fcmVuZGVyQmFja2dyb3VuZCh0KSx0aGlzLl9yZW5kZXJUZXh0TGluZXNCYWNrZ3JvdW5kKHQpfSxfcmVuZGVyVGV4dExpbmVzQmFja2dyb3VuZDpmdW5jdGlvbih0KXtpZih0aGlzLnRleHRCYWNrZ3JvdW5kQ29sb3Ipe3ZhciBlLGkscixuPTA7dC5maWxsU3R5bGU9dGhpcy50ZXh0QmFja2dyb3VuZENvbG9yO2Zvcih2YXIgcz0wLG89dGhpcy5fdGV4dExpbmVzLmxlbmd0aDtzPG87cysrKWU9dGhpcy5fZ2V0SGVpZ2h0T2ZMaW5lKHQscyksaT10aGlzLl9nZXRMaW5lV2lkdGgodCxzKSxpPjAmJihyPXRoaXMuX2dldExpbmVMZWZ0T2Zmc2V0KGkpLHQuZmlsbFJlY3QodGhpcy5fZ2V0TGVmdE9mZnNldCgpK3IsdGhpcy5fZ2V0VG9wT2Zmc2V0KCkrbixpLGUvdGhpcy5saW5lSGVpZ2h0KSksbis9ZTt0aGlzLl9yZW1vdmVTaGFkb3codCl9fSxfZ2V0TGluZUxlZnRPZmZzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuImNlbnRlciI9PT10aGlzLnRleHRBbGlnbj8odGhpcy53aWR0aC10KS8yOiJyaWdodCI9PT10aGlzLnRleHRBbGlnbj90aGlzLndpZHRoLXQ6MH0sX2NsZWFyQ2FjaGU6ZnVuY3Rpb24oKXt0aGlzLl9fbGluZVdpZHRocz1bXSx0aGlzLl9fbGluZUhlaWdodHM9W119LF9zaG91bGRDbGVhckNhY2hlOmZ1bmN0aW9uKCl7dmFyIHQ9ITE7aWYodGhpcy5fZm9yY2VDbGVhckNhY2hlKXJldHVybiB0aGlzLl9mb3JjZUNsZWFyQ2FjaGU9ITEsITA7Zm9yKHZhciBlIGluIHRoaXMuX2RpbWVuc2lvbkFmZmVjdGluZ1Byb3BzKXRoaXNbIl9fIitlXSE9PXRoaXNbZV0mJih0aGlzWyJfXyIrZV09dGhpc1tlXSx0PSEwKTtyZXR1cm4gdH0sX2dldExpbmVXaWR0aDpmdW5jdGlvbih0LGUpe2lmKHRoaXMuX19saW5lV2lkdGhzW2VdKXJldHVybiB0aGlzLl9fbGluZVdpZHRoc1tlXT09PS0xP3RoaXMud2lkdGg6dGhpcy5fX2xpbmVXaWR0aHNbZV07dmFyIGkscixuPXRoaXMuX3RleHRMaW5lc1tlXTtyZXR1cm4gaT0iIj09PW4/MDp0aGlzLl9tZWFzdXJlTGluZSh0LGUpLHRoaXMuX19saW5lV2lkdGhzW2VdPWksaSYmImp1c3RpZnkiPT09dGhpcy50ZXh0QWxpZ24mJihyPW4uc3BsaXQoL1xzKy8pLHIubGVuZ3RoPjEmJih0aGlzLl9fbGluZVdpZHRoc1tlXT0tMSkpLGl9LF9nZXRXaWR0aE9mQ2hhclNwYWNpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gMCE9PXRoaXMuY2hhclNwYWNpbmc/dGhpcy5mb250U2l6ZSp0aGlzLmNoYXJTcGFjaW5nLzFlMzowfSxfbWVhc3VyZUxpbmU6ZnVuY3Rpb24odCxlKXt2YXIgaSxyLG49dGhpcy5fdGV4dExpbmVzW2VdLHM9dC5tZWFzdXJlVGV4dChuKS53aWR0aCxvPTA7cmV0dXJuIDAhPT10aGlzLmNoYXJTcGFjaW5nJiYoaT1uLnNwbGl0KCIiKS5sZW5ndGgsbz0oaS0xKSp0aGlzLl9nZXRXaWR0aE9mQ2hhclNwYWNpbmcoKSkscj1zK28scj4wP3I6MH0sX3JlbmRlclRleHREZWNvcmF0aW9uOmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG4scyxvLGEsaCxjLGwsdT0wO2ZvcihuPTAscz1yLl90ZXh0TGluZXMubGVuZ3RoO248cztuKyspe2ZvcihoPXIuX2dldExpbmVXaWR0aCh0LG4pLGM9ci5fZ2V0TGluZUxlZnRPZmZzZXQoaCksbD1yLl9nZXRIZWlnaHRPZkxpbmUodCxuKSxvPTAsYT1lLmxlbmd0aDtvPGE7bysrKXQuZmlsbFJlY3Qoci5fZ2V0TGVmdE9mZnNldCgpK2MsdSsoci5fZm9udFNpemVNdWx0LTErZVtvXSkqci5mb250U2l6ZS1pLGgsci5mb250U2l6ZS8xNSk7dSs9bH19aWYodGhpcy50ZXh0RGVjb3JhdGlvbil7dmFyIGk9dGhpcy5oZWlnaHQvMixyPXRoaXMsbj1bXTt0aGlzLnRleHREZWNvcmF0aW9uLmluZGV4T2YoInVuZGVybGluZSIpPi0xJiZuLnB1c2goLjg1KSx0aGlzLnRleHREZWNvcmF0aW9uLmluZGV4T2YoImxpbmUtdGhyb3VnaCIpPi0xJiZuLnB1c2goLjQzKSx0aGlzLnRleHREZWNvcmF0aW9uLmluZGV4T2YoIm92ZXJsaW5lIik+LTEmJm4ucHVzaCgtLjEyKSxuLmxlbmd0aD4wJiZlKG4pfX0sX2dldEZvbnREZWNsYXJhdGlvbjpmdW5jdGlvbigpe3JldHVybltlLmlzTGlrZWx5Tm9kZT90aGlzLmZvbnRXZWlnaHQ6dGhpcy5mb250U3R5bGUsZS5pc0xpa2VseU5vZGU/dGhpcy5mb250U3R5bGU6dGhpcy5mb250V2VpZ2h0LHRoaXMuZm9udFNpemUrInB4IixlLmlzTGlrZWx5Tm9kZT8nIicrdGhpcy5mb250RmFtaWx5KyciJzp0aGlzLmZvbnRGYW1pbHldLmpvaW4oIiAiKX0scmVuZGVyOmZ1bmN0aW9uKHQsZSl7dGhpcy52aXNpYmxlJiYodC5zYXZlKCksdGhpcy5fc2V0VGV4dFN0eWxlcyh0KSx0aGlzLl9zaG91bGRDbGVhckNhY2hlKCkmJnRoaXMuX2luaXREaW1lbnNpb25zKHQpLHRoaXMuZHJhd1NlbGVjdGlvbkJhY2tncm91bmQodCksZXx8dGhpcy50cmFuc2Zvcm0odCksdGhpcy50cmFuc2Zvcm1NYXRyaXgmJnQudHJhbnNmb3JtLmFwcGx5KHQsdGhpcy50cmFuc2Zvcm1NYXRyaXgpLHRoaXMuZ3JvdXAmJiJwYXRoLWdyb3VwIj09PXRoaXMuZ3JvdXAudHlwZSYmdC50cmFuc2xhdGUodGhpcy5sZWZ0LHRoaXMudG9wKSx0aGlzLl9yZW5kZXIodCksdC5yZXN0b3JlKCkpfSxfc3BsaXRUZXh0SW50b0xpbmVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dC5zcGxpdCh0aGlzLl9yZU5ld2xpbmUpfSx0b09iamVjdDpmdW5jdGlvbih0KXt2YXIgZT1pKHRoaXMuY2FsbFN1cGVyKCJ0b09iamVjdCIsdCkse3RleHQ6dGhpcy50ZXh0LGZvbnRTaXplOnRoaXMuZm9udFNpemUsZm9udFdlaWdodDp0aGlzLmZvbnRXZWlnaHQsZm9udEZhbWlseTp0aGlzLmZvbnRGYW1pbHksZm9udFN0eWxlOnRoaXMuZm9udFN0eWxlLGxpbmVIZWlnaHQ6dGhpcy5saW5lSGVpZ2h0LHRleHREZWNvcmF0aW9uOnRoaXMudGV4dERlY29yYXRpb24sdGV4dEFsaWduOnRoaXMudGV4dEFsaWduLHRleHRCYWNrZ3JvdW5kQ29sb3I6dGhpcy50ZXh0QmFja2dyb3VuZENvbG9yLGNoYXJTcGFjaW5nOnRoaXMuY2hhclNwYWNpbmd9KTtyZXR1cm4gdGhpcy5pbmNsdWRlRGVmYXVsdFZhbHVlc3x8dGhpcy5fcmVtb3ZlRGVmYXVsdFZhbHVlcyhlKSxlfSx0b1NWRzpmdW5jdGlvbih0KXt0aGlzLmN0eHx8KHRoaXMuY3R4PWUudXRpbC5jcmVhdGVDYW52YXNFbGVtZW50KCkuZ2V0Q29udGV4dCgiMmQiKSk7dmFyIGk9dGhpcy5fY3JlYXRlQmFzZVNWR01hcmt1cCgpLHI9dGhpcy5fZ2V0U1ZHTGVmdFRvcE9mZnNldHModGhpcy5jdHgpLG49dGhpcy5fZ2V0U1ZHVGV4dEFuZEJnKHIudGV4dFRvcCxyLnRleHRMZWZ0KTtyZXR1cm4gdGhpcy5fd3JhcFNWR1RleHRBbmRCZyhpLG4pLHQ/dChpLmpvaW4oIiIpKTppLmpvaW4oIiIpfSxfZ2V0U1ZHTGVmdFRvcE9mZnNldHM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZ2V0SGVpZ2h0T2ZMaW5lKHQsMCksaT0tdGhpcy53aWR0aC8yLHI9MDtyZXR1cm57dGV4dExlZnQ6aSsodGhpcy5ncm91cCYmInBhdGgtZ3JvdXAiPT09dGhpcy5ncm91cC50eXBlP3RoaXMubGVmdDowKSx0ZXh0VG9wOnIrKHRoaXMuZ3JvdXAmJiJwYXRoLWdyb3VwIj09PXRoaXMuZ3JvdXAudHlwZT8tdGhpcy50b3A6MCksbGluZVRvcDplfX0sX3dyYXBTVkdUZXh0QW5kQmc6ZnVuY3Rpb24odCxlKXt2YXIgaT0hMCxyPXRoaXMuZ2V0U3ZnRmlsdGVyKCksbj0iIj09PXI/IiI6JyBzdHlsZT0iJytyKyciJzt0LnB1c2goIlx0PGcgIix0aGlzLmdldFN2Z0lkKCksJ3RyYW5zZm9ybT0iJyx0aGlzLmdldFN2Z1RyYW5zZm9ybSgpLHRoaXMuZ2V0U3ZnVHJhbnNmb3JtTWF0cml4KCksJyInLG4sIj5cbiIsZS50ZXh0QmdSZWN0cy5qb2luKCIiKSwiXHRcdDx0ZXh0ICIsdGhpcy5mb250RmFtaWx5Pydmb250LWZhbWlseT0iJyt0aGlzLmZvbnRGYW1pbHkucmVwbGFjZSgvIi9nLCInIikrJyIgJzoiIix0aGlzLmZvbnRTaXplPydmb250LXNpemU9IicrdGhpcy5mb250U2l6ZSsnIiAnOiIiLHRoaXMuZm9udFN0eWxlPydmb250LXN0eWxlPSInK3RoaXMuZm9udFN0eWxlKyciICc6IiIsdGhpcy5mb250V2VpZ2h0Pydmb250LXdlaWdodD0iJyt0aGlzLmZvbnRXZWlnaHQrJyIgJzoiIix0aGlzLnRleHREZWNvcmF0aW9uPyd0ZXh0LWRlY29yYXRpb249IicrdGhpcy50ZXh0RGVjb3JhdGlvbisnIiAnOiIiLCdzdHlsZT0iJyx0aGlzLmdldFN2Z1N0eWxlcyhpKSwnIiA+XG4nLGUudGV4dFNwYW5zLmpvaW4oIiIpLCJcdFx0PC90ZXh0PlxuIiwiXHQ8L2c+XG4iKX0sX2dldFNWR1RleHRBbmRCZzpmdW5jdGlvbih0LGUpe3ZhciBpPVtdLHI9W10sbj0wO3RoaXMuX3NldFNWR0JnKHIpO2Zvcih2YXIgcz0wLG89dGhpcy5fdGV4dExpbmVzLmxlbmd0aDtzPG87cysrKXRoaXMudGV4dEJhY2tncm91bmRDb2xvciYmdGhpcy5fc2V0U1ZHVGV4dExpbmVCZyhyLHMsZSx0LG4pLHRoaXMuX3NldFNWR1RleHRMaW5lVGV4dChzLGksbixlLHQsciksbis9dGhpcy5fZ2V0SGVpZ2h0T2ZMaW5lKHRoaXMuY3R4LHMpO3JldHVybnt0ZXh0U3BhbnM6aSx0ZXh0QmdSZWN0czpyfX0sX3NldFNWR1RleHRMaW5lVGV4dDpmdW5jdGlvbih0LGkscixvLGEpe3ZhciBoPXRoaXMuZm9udFNpemUqKHRoaXMuX2ZvbnRTaXplTXVsdC10aGlzLl9mb250U2l6ZUZyYWN0aW9uKS1hK3ItdGhpcy5oZWlnaHQvMjtyZXR1cm4ianVzdGlmeSI9PT10aGlzLnRleHRBbGlnbj92b2lkIHRoaXMuX3NldFNWR1RleHRMaW5lSnVzdGlmZWQodCxpLGgsbyk6dm9pZCBpLnB1c2goJ1x0XHRcdDx0c3BhbiB4PSInLG4obyt0aGlzLl9nZXRMaW5lTGVmdE9mZnNldCh0aGlzLl9nZXRMaW5lV2lkdGgodGhpcy5jdHgsdCkpLHMpLCciICcsJ3k9IicsbihoLHMpLCciICcsdGhpcy5fZ2V0RmlsbEF0dHJpYnV0ZXModGhpcy5maWxsKSwiPiIsZS51dGlsLnN0cmluZy5lc2NhcGVYbWwodGhpcy5fdGV4dExpbmVzW3RdKSwiPC90c3Bhbj5cbiIpfSxfc2V0U1ZHVGV4dExpbmVKdXN0aWZlZDpmdW5jdGlvbih0LGkscixvKXt2YXIgYT1lLnV0aWwuY3JlYXRlQ2FudmFzRWxlbWVudCgpLmdldENvbnRleHQoIjJkIik7dGhpcy5fc2V0VGV4dFN0eWxlcyhhKTt2YXIgaCxjLGw9dGhpcy5fdGV4dExpbmVzW3RdLHU9bC5zcGxpdCgvXHMrLyksZj10aGlzLl9nZXRXaWR0aE9mV29yZHMoYSx1LmpvaW4oIiIpKSxkPXRoaXMud2lkdGgtZixnPXUubGVuZ3RoLTEscD1nPjA/ZC9nOjAsdj10aGlzLl9nZXRGaWxsQXR0cmlidXRlcyh0aGlzLmZpbGwpO2ZvcihvKz10aGlzLl9nZXRMaW5lTGVmdE9mZnNldCh0aGlzLl9nZXRMaW5lV2lkdGgoYSx0KSksdD0wLGM9dS5sZW5ndGg7dDxjO3QrKyloPXVbdF0saS5wdXNoKCdcdFx0XHQ8dHNwYW4geD0iJyxuKG8scyksJyIgJywneT0iJyxuKHIscyksJyIgJyx2LCI+IixlLnV0aWwuc3RyaW5nLmVzY2FwZVhtbChoKSwiPC90c3Bhbj5cbiIpLG8rPXRoaXMuX2dldFdpZHRoT2ZXb3JkcyhhLGgpK3B9LF9zZXRTVkdUZXh0TGluZUJnOmZ1bmN0aW9uKHQsZSxpLHIsbyl7dC5wdXNoKCJcdFx0PHJlY3QgIix0aGlzLl9nZXRGaWxsQXR0cmlidXRlcyh0aGlzLnRleHRCYWNrZ3JvdW5kQ29sb3IpLCcgeD0iJyxuKGkrdGhpcy5fZ2V0TGluZUxlZnRPZmZzZXQodGhpcy5fZ2V0TGluZVdpZHRoKHRoaXMuY3R4LGUpKSxzKSwnIiB5PSInLG4oby10aGlzLmhlaWdodC8yLHMpLCciIHdpZHRoPSInLG4odGhpcy5fZ2V0TGluZVdpZHRoKHRoaXMuY3R4LGUpLHMpLCciIGhlaWdodD0iJyxuKHRoaXMuX2dldEhlaWdodE9mTGluZSh0aGlzLmN0eCxlKS90aGlzLmxpbmVIZWlnaHQscyksJyI+PC9yZWN0PlxuJyl9LF9zZXRTVkdCZzpmdW5jdGlvbih0KXt0aGlzLmJhY2tncm91bmRDb2xvciYmdC5wdXNoKCJcdFx0PHJlY3QgIix0aGlzLl9nZXRGaWxsQXR0cmlidXRlcyh0aGlzLmJhY2tncm91bmRDb2xvciksJyB4PSInLG4oLXRoaXMud2lkdGgvMixzKSwnIiB5PSInLG4oLXRoaXMuaGVpZ2h0LzIscyksJyIgd2lkdGg9Iicsbih0aGlzLndpZHRoLHMpLCciIGhlaWdodD0iJyxuKHRoaXMuaGVpZ2h0LHMpLCciPjwvcmVjdD5cbicpfSxfZ2V0RmlsbEF0dHJpYnV0ZXM6ZnVuY3Rpb24odCl7dmFyIGk9dCYmInN0cmluZyI9PXR5cGVvZiB0P25ldyBlLkNvbG9yKHQpOiIiO3JldHVybiBpJiZpLmdldFNvdXJjZSgpJiYxIT09aS5nZXRBbHBoYSgpPydvcGFjaXR5PSInK2kuZ2V0QWxwaGEoKSsnIiBmaWxsPSInK2kuc2V0QWxwaGEoMSkudG9SZ2IoKSsnIic6J2ZpbGw9IicrdCsnIid9LF9zZXQ6ZnVuY3Rpb24odCxlKXt0aGlzLmNhbGxTdXBlcigiX3NldCIsdCxlKSx0IGluIHRoaXMuX2RpbWVuc2lvbkFmZmVjdGluZ1Byb3BzJiYodGhpcy5faW5pdERpbWVuc2lvbnMoKSx0aGlzLnNldENvb3JkcygpKX0sY29tcGxleGl0eTpmdW5jdGlvbigpe3JldHVybiAxfX0pLGUuVGV4dC5BVFRSSUJVVEVfTkFNRVM9ZS5TSEFSRURfQVRUUklCVVRFUy5jb25jYXQoInggeSBkeCBkeSBmb250LWZhbWlseSBmb250LXN0eWxlIGZvbnQtd2VpZ2h0IGZvbnQtc2l6ZSB0ZXh0LWRlY29yYXRpb24gdGV4dC1hbmNob3IiLnNwbGl0KCIgIikpLGUuVGV4dC5ERUZBVUxUX1NWR19GT05UX1NJWkU9MTYsZS5UZXh0LmZyb21FbGVtZW50PWZ1bmN0aW9uKHQsaSl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIHI9ZS5wYXJzZUF0dHJpYnV0ZXModCxlLlRleHQuQVRUUklCVVRFX05BTUVTKTtpPWUudXRpbC5vYmplY3QuZXh0ZW5kKGk/ZS51dGlsLm9iamVjdC5jbG9uZShpKTp7fSxyKSxpLnRvcD1pLnRvcHx8MCxpLmxlZnQ9aS5sZWZ0fHwwLCJkeCJpbiByJiYoaS5sZWZ0Kz1yLmR4KSwiZHkiaW4gciYmKGkudG9wKz1yLmR5KSwiZm9udFNpemUiaW4gaXx8KGkuZm9udFNpemU9ZS5UZXh0LkRFRkFVTFRfU1ZHX0ZPTlRfU0laRSksaS5vcmlnaW5YfHwoaS5vcmlnaW5YPSJsZWZ0Iik7dmFyIG49IiI7InRleHRDb250ZW50ImluIHQ/bj10LnRleHRDb250ZW50OiJmaXJzdENoaWxkImluIHQmJm51bGwhPT10LmZpcnN0Q2hpbGQmJiJkYXRhImluIHQuZmlyc3RDaGlsZCYmbnVsbCE9PXQuZmlyc3RDaGlsZC5kYXRhJiYobj10LmZpcnN0Q2hpbGQuZGF0YSksbj1uLnJlcGxhY2UoL15ccyt8XHMrJHxcbisvZywiIikucmVwbGFjZSgvXHMrL2csIiAiKTt2YXIgcz1uZXcgZS5UZXh0KG4saSksbz1zLmdldEhlaWdodCgpL3MuaGVpZ2h0LGE9KHMuaGVpZ2h0K3Muc3Ryb2tlV2lkdGgpKnMubGluZUhlaWdodC1zLmhlaWdodCxoPWEqbyxjPXMuZ2V0SGVpZ2h0KCkraCxsPTA7cmV0dXJuImxlZnQiPT09cy5vcmlnaW5YJiYobD1zLmdldFdpZHRoKCkvMiksInJpZ2h0Ij09PXMub3JpZ2luWCYmKGw9LXMuZ2V0V2lkdGgoKS8yKSxzLnNldCh7bGVmdDpzLmdldExlZnQoKStsLHRvcDpzLmdldFRvcCgpLWMvMitzLmZvbnRTaXplKiguMTgrcy5fZm9udFNpemVGcmFjdGlvbikvcy5saW5lSGVpZ2h0fSksc30sZS5UZXh0LmZyb21PYmplY3Q9ZnVuY3Rpb24odCxpKXt2YXIgbj1uZXcgZS5UZXh0KHQudGV4dCxyKHQpKTtyZXR1cm4gaSYmaShuKSxufSxlLnV0aWwuY3JlYXRlQWNjZXNzb3JzKGUuVGV4dCl9KCJ1bmRlZmluZWQiIT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnRoaXMpLGZ1bmN0aW9uKCl7dmFyIHQ9ZmFicmljLnV0aWwub2JqZWN0LmNsb25lO2ZhYnJpYy5JVGV4dD1mYWJyaWMudXRpbC5jcmVhdGVDbGFzcyhmYWJyaWMuVGV4dCxmYWJyaWMuT2JzZXJ2YWJsZSx7dHlwZToiaS10ZXh0IixzZWxlY3Rpb25TdGFydDowLHNlbGVjdGlvbkVuZDowLHNlbGVjdGlvbkNvbG9yOiJyZ2JhKDE3LDExOSwyNTUsMC4zKSIsaXNFZGl0aW5nOiExLGVkaXRhYmxlOiEwLGVkaXRpbmdCb3JkZXJDb2xvcjoicmdiYSgxMDIsMTUzLDI1NSwwLjI1KSIsY3Vyc29yV2lkdGg6MixjdXJzb3JDb2xvcjoiIzMzMyIsY3Vyc29yRGVsYXk6MWUzLGN1cnNvckR1cmF0aW9uOjYwMCxzdHlsZXM6bnVsbCxjYWNoaW5nOiEwLF9yZVNwYWNlOi9cc3xcbi8sX2N1cnJlbnRDdXJzb3JPcGFjaXR5OjAsX3NlbGVjdGlvbkRpcmVjdGlvbjpudWxsLF9hYm9ydEN1cnNvckFuaW1hdGlvbjohMSxfX3dpZHRoT2ZTcGFjZTpbXSxpbml0aWFsaXplOmZ1bmN0aW9uKHQsZSl7dGhpcy5zdHlsZXM9ZT9lLnN0eWxlc3x8e306e30sdGhpcy5jYWxsU3VwZXIoImluaXRpYWxpemUiLHQsZSksdGhpcy5pbml0QmVoYXZpb3IoKX0sX2NsZWFyQ2FjaGU6ZnVuY3Rpb24oKXt0aGlzLmNhbGxTdXBlcigiX2NsZWFyQ2FjaGUiKSx0aGlzLl9fd2lkdGhPZlNwYWNlPVtdfSxpc0VtcHR5U3R5bGVzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc3R5bGVzKXJldHVybiEwO3ZhciB0PXRoaXMuc3R5bGVzO2Zvcih2YXIgZSBpbiB0KWZvcih2YXIgaSBpbiB0W2VdKWZvcih2YXIgciBpbiB0W2VdW2ldKXJldHVybiExO3JldHVybiEwfSxzZXRTZWxlY3Rpb25TdGFydDpmdW5jdGlvbih0KXt0PU1hdGgubWF4KHQsMCksdGhpcy5fdXBkYXRlQW5kRmlyZSgic2VsZWN0aW9uU3RhcnQiLHQpfSxzZXRTZWxlY3Rpb25FbmQ6ZnVuY3Rpb24odCl7dD1NYXRoLm1pbih0LHRoaXMudGV4dC5sZW5ndGgpLHRoaXMuX3VwZGF0ZUFuZEZpcmUoInNlbGVjdGlvbkVuZCIsdCl9LF91cGRhdGVBbmRGaXJlOmZ1bmN0aW9uKHQsZSl7dGhpc1t0XSE9PWUmJih0aGlzLl9maXJlU2VsZWN0aW9uQ2hhbmdlZCgpLHRoaXNbdF09ZSksdGhpcy5fdXBkYXRlVGV4dGFyZWEoKX0sX2ZpcmVTZWxlY3Rpb25DaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJzZWxlY3Rpb246Y2hhbmdlZCIpLHRoaXMuY2FudmFzJiZ0aGlzLmNhbnZhcy5maXJlKCJ0ZXh0OnNlbGVjdGlvbjpjaGFuZ2VkIix7dGFyZ2V0OnRoaXN9KX0sZ2V0U2VsZWN0aW9uU3R5bGVzOmZ1bmN0aW9uKHQsZSl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgaT1bXSxyPXQ7cjxlO3IrKylpLnB1c2godGhpcy5nZXRTZWxlY3Rpb25TdHlsZXMocikpO3JldHVybiBpfXZhciBuPXRoaXMuZ2V0MkRDdXJzb3JMb2NhdGlvbih0KSxzPXRoaXMuX2dldFN0eWxlRGVjbGFyYXRpb24obi5saW5lSW5kZXgsbi5jaGFySW5kZXgpO3JldHVybiBzfHx7fX0sc2V0U2VsZWN0aW9uU3R5bGVzOmZ1bmN0aW9uKHQpe2lmKHRoaXMuc2VsZWN0aW9uU3RhcnQ9PT10aGlzLnNlbGVjdGlvbkVuZCl0aGlzLl9leHRlbmRTdHlsZXModGhpcy5zZWxlY3Rpb25TdGFydCx0KTtlbHNlIGZvcih2YXIgZT10aGlzLnNlbGVjdGlvblN0YXJ0O2U8dGhpcy5zZWxlY3Rpb25FbmQ7ZSsrKXRoaXMuX2V4dGVuZFN0eWxlcyhlLHQpO3JldHVybiB0aGlzLl9mb3JjZUNsZWFyQ2FjaGU9ITAsdGhpc30sX2V4dGVuZFN0eWxlczpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ2V0MkRDdXJzb3JMb2NhdGlvbih0KTt0aGlzLl9nZXRMaW5lU3R5bGUoaS5saW5lSW5kZXgpfHx0aGlzLl9zZXRMaW5lU3R5bGUoaS5saW5lSW5kZXgse30pLHRoaXMuX2dldFN0eWxlRGVjbGFyYXRpb24oaS5saW5lSW5kZXgsaS5jaGFySW5kZXgpfHx0aGlzLl9zZXRTdHlsZURlY2xhcmF0aW9uKGkubGluZUluZGV4LGkuY2hhckluZGV4LHt9KSxmYWJyaWMudXRpbC5vYmplY3QuZXh0ZW5kKHRoaXMuX2dldFN0eWxlRGVjbGFyYXRpb24oaS5saW5lSW5kZXgsaS5jaGFySW5kZXgpLGUpfSxfcmVuZGVyOmZ1bmN0aW9uKHQpe3RoaXMub2xkV2lkdGg9dGhpcy53aWR0aCx0aGlzLm9sZEhlaWdodD10aGlzLmhlaWdodCx0aGlzLmNhbGxTdXBlcigiX3JlbmRlciIsdCksdGhpcy5jdHg9dCx0aGlzLmN1cnNvck9mZnNldENhY2hlPXt9LHRoaXMucmVuZGVyQ3Vyc29yT3JTZWxlY3Rpb24oKX0scmVuZGVyQ3Vyc29yT3JTZWxlY3Rpb246ZnVuY3Rpb24oKXtpZih0aGlzLmFjdGl2ZSYmdGhpcy5pc0VkaXRpbmcpe3ZhciB0LGUsaT10aGlzLnRleHQuc3BsaXQoIiIpO3RoaXMuY2FudmFzLmNvbnRleHRUb3A/KGU9dGhpcy5jYW52YXMuY29udGV4dFRvcCxlLnNhdmUoKSxlLnRyYW5zZm9ybS5hcHBseShlLHRoaXMuY2FudmFzLnZpZXdwb3J0VHJhbnNmb3JtKSx0aGlzLnRyYW5zZm9ybShlKSx0aGlzLnRyYW5zZm9ybU1hdHJpeCYmZS50cmFuc2Zvcm0uYXBwbHkoZSx0aGlzLnRyYW5zZm9ybU1hdHJpeCksdGhpcy5fY2xlYXJUZXh0QXJlYShlKSk6KGU9dGhpcy5jdHgsZS5zYXZlKCkpLHRoaXMuc2VsZWN0aW9uU3RhcnQ9PT10aGlzLnNlbGVjdGlvbkVuZD8odD10aGlzLl9nZXRDdXJzb3JCb3VuZGFyaWVzKGksImN1cnNvciIpLHRoaXMucmVuZGVyQ3Vyc29yKHQsZSkpOih0PXRoaXMuX2dldEN1cnNvckJvdW5kYXJpZXMoaSwic2VsZWN0aW9uIiksdGhpcy5yZW5kZXJTZWxlY3Rpb24oaSx0LGUpKSxlLnJlc3RvcmUoKX19LF9jbGVhclRleHRBcmVhOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub2xkV2lkdGgrNCxpPXRoaXMub2xkSGVpZ2h0KzQ7dC5jbGVhclJlY3QoLWUvMiwtaS8yLGUsaSl9LGdldDJEQ3Vyc29yTG9jYXRpb246ZnVuY3Rpb24odCl7InVuZGVmaW5lZCI9PXR5cGVvZiB0JiYodD10aGlzLnNlbGVjdGlvblN0YXJ0KTtmb3IodmFyIGU9dGhpcy5fdGV4dExpbmVzLmxlbmd0aCxpPTA7aTxlO2krKyl7aWYodDw9dGhpcy5fdGV4dExpbmVzW2ldLmxlbmd0aClyZXR1cm57bGluZUluZGV4OmksY2hhckluZGV4OnR9O3QtPXRoaXMuX3RleHRMaW5lc1tpXS5sZW5ndGgrMX1yZXR1cm57bGluZUluZGV4OmktMSxjaGFySW5kZXg6dGhpcy5fdGV4dExpbmVzW2ktMV0ubGVuZ3RoPHQ/dGhpcy5fdGV4dExpbmVzW2ktMV0ubGVuZ3RoOnR9fSxnZXRDdXJyZW50Q2hhclN0eWxlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fZ2V0U3R5bGVEZWNsYXJhdGlvbih0LDA9PT1lPzA6ZS0xKTtyZXR1cm57Zm9udFNpemU6aSYmaS5mb250U2l6ZXx8dGhpcy5mb250U2l6ZSxmaWxsOmkmJmkuZmlsbHx8dGhpcy5maWxsLHRleHRCYWNrZ3JvdW5kQ29sb3I6aSYmaS50ZXh0QmFja2dyb3VuZENvbG9yfHx0aGlzLnRleHRCYWNrZ3JvdW5kQ29sb3IsdGV4dERlY29yYXRpb246aSYmaS50ZXh0RGVjb3JhdGlvbnx8dGhpcy50ZXh0RGVjb3JhdGlvbixmb250RmFtaWx5OmkmJmkuZm9udEZhbWlseXx8dGhpcy5mb250RmFtaWx5LGZvbnRXZWlnaHQ6aSYmaS5mb250V2VpZ2h0fHx0aGlzLmZvbnRXZWlnaHQsZm9udFN0eWxlOmkmJmkuZm9udFN0eWxlfHx0aGlzLmZvbnRTdHlsZSxzdHJva2U6aSYmaS5zdHJva2V8fHRoaXMuc3Ryb2tlLHN0cm9rZVdpZHRoOmkmJmkuc3Ryb2tlV2lkdGh8fHRoaXMuc3Ryb2tlV2lkdGh9fSxnZXRDdXJyZW50Q2hhckZvbnRTaXplOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fZ2V0U3R5bGVEZWNsYXJhdGlvbih0LDA9PT1lPzA6ZS0xKTtyZXR1cm4gaSYmaS5mb250U2l6ZT9pLmZvbnRTaXplOnRoaXMuZm9udFNpemV9LGdldEN1cnJlbnRDaGFyQ29sb3I6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9nZXRTdHlsZURlY2xhcmF0aW9uKHQsMD09PWU/MDplLTEpO3JldHVybiBpJiZpLmZpbGw/aS5maWxsOnRoaXMuY3Vyc29yQ29sb3J9LF9nZXRDdXJzb3JCb3VuZGFyaWVzOmZ1bmN0aW9uKHQsZSl7dmFyIGk9TWF0aC5yb3VuZCh0aGlzLl9nZXRMZWZ0T2Zmc2V0KCkpLHI9dGhpcy5fZ2V0VG9wT2Zmc2V0KCksbj10aGlzLl9nZXRDdXJzb3JCb3VuZGFyaWVzT2Zmc2V0cyh0LGUpO3JldHVybntsZWZ0OmksdG9wOnIsbGVmdE9mZnNldDpuLmxlZnQrbi5saW5lTGVmdCx0b3BPZmZzZXQ6bi50b3B9fSxfZ2V0Q3Vyc29yQm91bmRhcmllc09mZnNldHM6ZnVuY3Rpb24odCxlKXtpZih0aGlzLmN1cnNvck9mZnNldENhY2hlJiYidG9wImluIHRoaXMuY3Vyc29yT2Zmc2V0Q2FjaGUpcmV0dXJuIHRoaXMuY3Vyc29yT2Zmc2V0Q2FjaGU7Zm9yKHZhciBpLHI9MCxuPTAscz0wLG89MCxhPTAsaD0wO2g8dGhpcy5zZWxlY3Rpb25TdGFydDtoKyspIlxuIj09PXRbaF0/KGE9MCxvKz10aGlzLl9nZXRIZWlnaHRPZkxpbmUodGhpcy5jdHgsbiksbisrLHM9MCk6KGErPXRoaXMuX2dldFdpZHRoT2ZDaGFyKHRoaXMuY3R4LHRbaF0sbixzKSxzKyspLHI9dGhpcy5fZ2V0TGluZUxlZnRPZmZzZXQodGhpcy5fZ2V0TGluZVdpZHRoKHRoaXMuY3R4LG4pKTtyZXR1cm4iY3Vyc29yIj09PWUmJihvKz0oMS10aGlzLl9mb250U2l6ZUZyYWN0aW9uKSp0aGlzLl9nZXRIZWlnaHRPZkxpbmUodGhpcy5jdHgsbikvdGhpcy5saW5lSGVpZ2h0LXRoaXMuZ2V0Q3VycmVudENoYXJGb250U2l6ZShuLHMpKigxLXRoaXMuX2ZvbnRTaXplRnJhY3Rpb24pKSwwIT09dGhpcy5jaGFyU3BhY2luZyYmcz09PXRoaXMuX3RleHRMaW5lc1tuXS5sZW5ndGgmJihhLT10aGlzLl9nZXRXaWR0aE9mQ2hhclNwYWNpbmcoKSksaT17dG9wOm8sbGVmdDphPjA/YTowLGxpbmVMZWZ0OnJ9LHRoaXMuY3Vyc29yT2Zmc2V0Q2FjaGU9aSx0aGlzLmN1cnNvck9mZnNldENhY2hlfSxyZW5kZXJDdXJzb3I6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldDJEQ3Vyc29yTG9jYXRpb24oKSxyPWkubGluZUluZGV4LG49aS5jaGFySW5kZXgscz10aGlzLmdldEN1cnJlbnRDaGFyRm9udFNpemUocixuKSxvPTA9PT1yJiYwPT09bj90aGlzLl9nZXRMaW5lTGVmdE9mZnNldCh0aGlzLl9nZXRMaW5lV2lkdGgoZSxyKSk6dC5sZWZ0T2Zmc2V0LGE9dGhpcy5zY2FsZVgqdGhpcy5jYW52YXMuZ2V0Wm9vbSgpLGg9dGhpcy5jdXJzb3JXaWR0aC9hO2UuZmlsbFN0eWxlPXRoaXMuZ2V0Q3VycmVudENoYXJDb2xvcihyLG4pLGUuZ2xvYmFsQWxwaGE9dGhpcy5fX2lzTW91c2Vkb3duPzE6dGhpcy5fY3VycmVudEN1cnNvck9wYWNpdHksZS5maWxsUmVjdCh0LmxlZnQrby1oLzIsdC50b3ArdC50b3BPZmZzZXQsaCxzKX0scmVuZGVyU2VsZWN0aW9uOmZ1bmN0aW9uKHQsZSxpKXtpLmZpbGxTdHlsZT10aGlzLnNlbGVjdGlvbkNvbG9yO2Zvcih2YXIgcj10aGlzLmdldDJEQ3Vyc29yTG9jYXRpb24odGhpcy5zZWxlY3Rpb25TdGFydCksbj10aGlzLmdldDJEQ3Vyc29yTG9jYXRpb24odGhpcy5zZWxlY3Rpb25FbmQpLHM9ci5saW5lSW5kZXgsbz1uLmxpbmVJbmRleCxhPXM7YTw9bzthKyspe3ZhciBoPXRoaXMuX2dldExpbmVMZWZ0T2Zmc2V0KHRoaXMuX2dldExpbmVXaWR0aChpLGEpKXx8MCxjPXRoaXMuX2dldEhlaWdodE9mTGluZSh0aGlzLmN0eCxhKSxsPTAsdT0wLGY9dGhpcy5fdGV4dExpbmVzW2FdO2lmKGE9PT1zKXtmb3IodmFyIGQ9MCxnPWYubGVuZ3RoO2Q8ZztkKyspZD49ci5jaGFySW5kZXgmJihhIT09b3x8ZDxuLmNoYXJJbmRleCkmJih1Kz10aGlzLl9nZXRXaWR0aE9mQ2hhcihpLGZbZF0sYSxkKSksZDxyLmNoYXJJbmRleCYmKGgrPXRoaXMuX2dldFdpZHRoT2ZDaGFyKGksZltkXSxhLGQpKTtkPT09Zi5sZW5ndGgmJih1LT10aGlzLl9nZXRXaWR0aE9mQ2hhclNwYWNpbmcoKSl9ZWxzZSBpZihhPnMmJmE8byl1Kz10aGlzLl9nZXRMaW5lV2lkdGgoaSxhKXx8NTtlbHNlIGlmKGE9PT1vKXtmb3IodmFyIHA9MCx2PW4uY2hhckluZGV4O3A8djtwKyspdSs9dGhpcy5fZ2V0V2lkdGhPZkNoYXIoaSxmW3BdLGEscCk7bi5jaGFySW5kZXg9PT1mLmxlbmd0aCYmKHUtPXRoaXMuX2dldFdpZHRoT2ZDaGFyU3BhY2luZygpKX1sPWMsKHRoaXMubGluZUhlaWdodDwxfHxhPT09byYmdGhpcy5saW5lSGVpZ2h0PjEpJiYoYy89dGhpcy5saW5lSGVpZ2h0KSxpLmZpbGxSZWN0KGUubGVmdCtoLGUudG9wK2UudG9wT2Zmc2V0LHU+MD91OjAsYyksZS50b3BPZmZzZXQrPWx9fSxfcmVuZGVyQ2hhcnM6ZnVuY3Rpb24odCxlLGkscixuLHMsbyl7aWYodGhpcy5pc0VtcHR5U3R5bGVzKCkpcmV0dXJuIHRoaXMuX3JlbmRlckNoYXJzRmFzdCh0LGUsaSxyLG4pO289b3x8MDt2YXIgYSxoLGM9dGhpcy5fZ2V0SGVpZ2h0T2ZMaW5lKGUscyksbD0iIjtlLnNhdmUoKSxuLT1jL3RoaXMubGluZUhlaWdodCp0aGlzLl9mb250U2l6ZUZyYWN0aW9uO2Zvcih2YXIgdT1vLGY9aS5sZW5ndGgrbzt1PD1mO3UrKylhPWF8fHRoaXMuZ2V0Q3VycmVudENoYXJTdHlsZShzLHUpLGg9dGhpcy5nZXRDdXJyZW50Q2hhclN0eWxlKHMsdSsxKSwodGhpcy5faGFzU3R5bGVDaGFuZ2VkKGEsaCl8fHU9PT1mKSYmKHRoaXMuX3JlbmRlckNoYXIodCxlLHMsdS0xLGwscixuLGMpLGw9IiIsYT1oKSxsKz1pW3Utb107ZS5yZXN0b3JlKCl9LF9yZW5kZXJDaGFyc0Zhc3Q6ZnVuY3Rpb24odCxlLGkscixuKXsiZmlsbFRleHQiPT09dCYmdGhpcy5maWxsJiZ0aGlzLmNhbGxTdXBlcigiX3JlbmRlckNoYXJzIix0LGUsaSxyLG4pLCJzdHJva2VUZXh0Ij09PXQmJih0aGlzLnN0cm9rZSYmdGhpcy5zdHJva2VXaWR0aD4wfHx0aGlzLnNraXBGaWxsU3Ryb2tlQ2hlY2spJiZ0aGlzLmNhbGxTdXBlcigiX3JlbmRlckNoYXJzIix0LGUsaSxyLG4pfSxfcmVuZGVyQ2hhcjpmdW5jdGlvbih0LGUsaSxyLG4scyxvLGEpe3ZhciBoLGMsbCx1LGYsZCxnLHAsdixiPXRoaXMuX2dldFN0eWxlRGVjbGFyYXRpb24oaSxyKTtpZihiPyhjPXRoaXMuX2dldEhlaWdodE9mQ2hhcihlLG4saSxyKSx1PWIuc3Ryb2tlLGw9Yi5maWxsLGQ9Yi50ZXh0RGVjb3JhdGlvbik6Yz10aGlzLmZvbnRTaXplLHU9KHV8fHRoaXMuc3Ryb2tlKSYmInN0cm9rZVRleHQiPT09dCxsPShsfHx0aGlzLmZpbGwpJiYiZmlsbFRleHQiPT09dCxiJiZlLnNhdmUoKSxoPXRoaXMuX2FwcGx5Q2hhclN0eWxlc0dldFdpZHRoKGUsbixpLHIsYnx8bnVsbCksZD1kfHx0aGlzLnRleHREZWNvcmF0aW9uLGImJmIudGV4dEJhY2tncm91bmRDb2xvciYmdGhpcy5fcmVtb3ZlU2hhZG93KGUpLDAhPT10aGlzLmNoYXJTcGFjaW5nKXtwPXRoaXMuX2dldFdpZHRoT2ZDaGFyU3BhY2luZygpLGc9bi5zcGxpdCgiIiksaD0wO2Zvcih2YXIgbSx5PTAsXz1nLmxlbmd0aDt5PF87eSsrKW09Z1t5XSxsJiZlLmZpbGxUZXh0KG0scytoLG8pLHUmJmUuc3Ryb2tlVGV4dChtLHMraCxvKSx2PWUubWVhc3VyZVRleHQobSkud2lkdGgrcCxoKz12PjA/djowfWVsc2UgbCYmZS5maWxsVGV4dChuLHMsbyksdSYmZS5zdHJva2VUZXh0KG4scyxvKTsoZHx8IiIhPT1kKSYmKGY9dGhpcy5fZm9udFNpemVGcmFjdGlvbiphL3RoaXMubGluZUhlaWdodCx0aGlzLl9yZW5kZXJDaGFyRGVjb3JhdGlvbihlLGQscyxvLGYsaCxjKSksYiYmZS5yZXN0b3JlKCksZS50cmFuc2xhdGUoaCwwKX0sX2hhc1N0eWxlQ2hhbmdlZDpmdW5jdGlvbih0LGUpe3JldHVybiB0LmZpbGwhPT1lLmZpbGx8fHQuZm9udFNpemUhPT1lLmZvbnRTaXplfHx0LnRleHRCYWNrZ3JvdW5kQ29sb3IhPT1lLnRleHRCYWNrZ3JvdW5kQ29sb3J8fHQudGV4dERlY29yYXRpb24hPT1lLnRleHREZWNvcmF0aW9ufHx0LmZvbnRGYW1pbHkhPT1lLmZvbnRGYW1pbHl8fHQuZm9udFdlaWdodCE9PWUuZm9udFdlaWdodHx8dC5mb250U3R5bGUhPT1lLmZvbnRTdHlsZXx8dC5zdHJva2UhPT1lLnN0cm9rZXx8dC5zdHJva2VXaWR0aCE9PWUuc3Ryb2tlV2lkdGh9LF9yZW5kZXJDaGFyRGVjb3JhdGlvbjpmdW5jdGlvbih0LGUsaSxyLG4scyxvKXtpZihlKXt2YXIgYSxoLGM9by8xNSxsPXt1bmRlcmxpbmU6citvLzEwLCJsaW5lLXRocm91Z2giOnItbyoodGhpcy5fZm9udFNpemVGcmFjdGlvbit0aGlzLl9mb250U2l6ZU11bHQtMSkrYyxvdmVybGluZTpyLSh0aGlzLl9mb250U2l6ZU11bHQtdGhpcy5fZm9udFNpemVGcmFjdGlvbikqb30sdT1bInVuZGVybGluZSIsImxpbmUtdGhyb3VnaCIsIm92ZXJsaW5lIl07Zm9yKGE9MDthPHUubGVuZ3RoO2ErKyloPXVbYV0sZS5pbmRleE9mKGgpPi0xJiZ0LmZpbGxSZWN0KGksbFtoXSxzLGMpfX0sX3JlbmRlclRleHRMaW5lOmZ1bmN0aW9uKHQsZSxpLHIsbixzKXt0aGlzLmlzRW1wdHlTdHlsZXMoKXx8KG4rPXRoaXMuZm9udFNpemUqKHRoaXMuX2ZvbnRTaXplRnJhY3Rpb24rLjAzKSksdGhpcy5jYWxsU3VwZXIoIl9yZW5kZXJUZXh0TGluZSIsdCxlLGkscixuLHMpfSxfcmVuZGVyVGV4dERlY29yYXRpb246ZnVuY3Rpb24odCl7aWYodGhpcy5pc0VtcHR5U3R5bGVzKCkpcmV0dXJuIHRoaXMuY2FsbFN1cGVyKCJfcmVuZGVyVGV4dERlY29yYXRpb24iLHQpfSxfcmVuZGVyVGV4dExpbmVzQmFja2dyb3VuZDpmdW5jdGlvbih0KXt0aGlzLmNhbGxTdXBlcigiX3JlbmRlclRleHRMaW5lc0JhY2tncm91bmQiLHQpO2Zvcih2YXIgZSxpLHIsbixzLG8sYT0wLGg9dGhpcy5fZ2V0TGVmdE9mZnNldCgpLGM9dGhpcy5fZ2V0VG9wT2Zmc2V0KCksbD0wLHU9dGhpcy5fdGV4dExpbmVzLmxlbmd0aDtsPHU7bCsrKWlmKGU9dGhpcy5fZ2V0SGVpZ2h0T2ZMaW5lKHQsbCksbj10aGlzLl90ZXh0TGluZXNbbF0sIiIhPT1uJiZ0aGlzLnN0eWxlcyYmdGhpcy5fZ2V0TGluZVN0eWxlKGwpKXtpPXRoaXMuX2dldExpbmVXaWR0aCh0LGwpLHI9dGhpcy5fZ2V0TGluZUxlZnRPZmZzZXQoaSk7Zm9yKHZhciBmPTAsZD1uLmxlbmd0aDtmPGQ7ZisrKW89dGhpcy5fZ2V0U3R5bGVEZWNsYXJhdGlvbihsLGYpLG8mJm8udGV4dEJhY2tncm91bmRDb2xvciYmKHM9bltmXSx0LmZpbGxTdHlsZT1vLnRleHRCYWNrZ3JvdW5kQ29sb3IsdC5maWxsUmVjdChoK3IrdGhpcy5fZ2V0V2lkdGhPZkNoYXJzQXQodCxsLGYpLGMrYSx0aGlzLl9nZXRXaWR0aE9mQ2hhcih0LHMsbCxmKSsxLGUvdGhpcy5saW5lSGVpZ2h0KSk7YSs9ZX1lbHNlIGErPWV9LF9nZXRDYWNoZVByb3A6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlLmZvbnRTaXplK2UuZm9udFdlaWdodCtlLmZvbnRTdHlsZX0sX2dldEZvbnRDYWNoZTpmdW5jdGlvbih0KXtyZXR1cm4gZmFicmljLmNoYXJXaWR0aHNDYWNoZVt0XXx8KGZhYnJpYy5jaGFyV2lkdGhzQ2FjaGVbdF09e30pLGZhYnJpYy5jaGFyV2lkdGhzQ2FjaGVbdF19LF9hcHBseUNoYXJTdHlsZXNHZXRXaWR0aDpmdW5jdGlvbihlLGkscixuLHMpe3ZhciBvLGEsaCxjPXN8fHRoaXMuX2dldFN0eWxlRGVjbGFyYXRpb24ocixuKSxsPXQoYyk7aWYodGhpcy5fYXBwbHlGb250U3R5bGVzKGwpLGg9dGhpcy5fZ2V0Rm9udENhY2hlKGwuZm9udEZhbWlseSksYT10aGlzLl9nZXRDYWNoZVByb3AoaSxsKSwhYyYmaFthXSYmdGhpcy5jYWNoaW5nKXJldHVybiBoW2FdOyJzdHJpbmciPT10eXBlb2YgbC5zaGFkb3cmJihsLnNoYWRvdz1uZXcgZmFicmljLlNoYWRvdyhsLnNoYWRvdykpO3ZhciB1PWwuZmlsbHx8dGhpcy5maWxsO3JldHVybiBlLmZpbGxTdHlsZT11LnRvTGl2ZT91LnRvTGl2ZShlLHRoaXMpOnUsbC5zdHJva2UmJihlLnN0cm9rZVN0eWxlPWwuc3Ryb2tlJiZsLnN0cm9rZS50b0xpdmU/bC5zdHJva2UudG9MaXZlKGUsdGhpcyk6bC5zdHJva2UpLGUubGluZVdpZHRoPWwuc3Ryb2tlV2lkdGh8fHRoaXMuc3Ryb2tlV2lkdGgsZS5mb250PXRoaXMuX2dldEZvbnREZWNsYXJhdGlvbi5jYWxsKGwpLGwuc2hhZG93JiYobC5zY2FsZVg9dGhpcy5zY2FsZVgsbC5zY2FsZVk9dGhpcy5zY2FsZVksbC5jYW52YXM9dGhpcy5jYW52YXMsbC5nZXRPYmplY3RTY2FsaW5nPXRoaXMuZ2V0T2JqZWN0U2NhbGluZyx0aGlzLl9zZXRTaGFkb3cuY2FsbChsLGUpKSx0aGlzLmNhY2hpbmcmJmhbYV0/aFthXToobz1lLm1lYXN1cmVUZXh0KGkpLndpZHRoLHRoaXMuY2FjaGluZyYmKGhbYV09byksbyl9LF9hcHBseUZvbnRTdHlsZXM6ZnVuY3Rpb24odCl7dC5mb250RmFtaWx5fHwodC5mb250RmFtaWx5PXRoaXMuZm9udEZhbWlseSksdC5mb250U2l6ZXx8KHQuZm9udFNpemU9dGhpcy5mb250U2l6ZSksdC5mb250V2VpZ2h0fHwodC5mb250V2VpZ2h0PXRoaXMuZm9udFdlaWdodCksdC5mb250U3R5bGV8fCh0LmZvbnRTdHlsZT10aGlzLmZvbnRTdHlsZSl9LF9nZXRTdHlsZURlY2xhcmF0aW9uOmZ1bmN0aW9uKGUsaSxyKXtyZXR1cm4gcj90aGlzLnN0eWxlc1tlXSYmdGhpcy5zdHlsZXNbZV1baV0/dCh0aGlzLnN0eWxlc1tlXVtpXSk6e306dGhpcy5zdHlsZXNbZV0mJnRoaXMuc3R5bGVzW2VdW2ldP3RoaXMuc3R5bGVzW2VdW2ldOm51bGx9LF9zZXRTdHlsZURlY2xhcmF0aW9uOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLnN0eWxlc1t0XVtlXT1pfSxfZGVsZXRlU3R5bGVEZWNsYXJhdGlvbjpmdW5jdGlvbih0LGUpe2RlbGV0ZSB0aGlzLnN0eWxlc1t0XVtlXX0sX2dldExpbmVTdHlsZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zdHlsZXNbdF19LF9zZXRMaW5lU3R5bGU6ZnVuY3Rpb24odCxlKXt0aGlzLnN0eWxlc1t0XT1lfSxfZGVsZXRlTGluZVN0eWxlOmZ1bmN0aW9uKHQpe2RlbGV0ZSB0aGlzLnN0eWxlc1t0XX0sX2dldFdpZHRoT2ZDaGFyOmZ1bmN0aW9uKHQsZSxpLHIpe2lmKCF0aGlzLl9pc01lYXN1cmluZyYmImp1c3RpZnkiPT09dGhpcy50ZXh0QWxpZ24mJnRoaXMuX3JlU3BhY2VzQW5kVGFicy50ZXN0KGUpKXJldHVybiB0aGlzLl9nZXRXaWR0aE9mU3BhY2UodCxpKTt0LnNhdmUoKTt2YXIgbj10aGlzLl9hcHBseUNoYXJTdHlsZXNHZXRXaWR0aCh0LGUsaSxyKTtyZXR1cm4gMCE9PXRoaXMuY2hhclNwYWNpbmcmJihuKz10aGlzLl9nZXRXaWR0aE9mQ2hhclNwYWNpbmcoKSksdC5yZXN0b3JlKCksbj4wP246MH0sX2dldEhlaWdodE9mQ2hhcjpmdW5jdGlvbih0LGUsaSl7dmFyIHI9dGhpcy5fZ2V0U3R5bGVEZWNsYXJhdGlvbihlLGkpO3JldHVybiByJiZyLmZvbnRTaXplP3IuZm9udFNpemU6dGhpcy5mb250U2l6ZX0sX2dldFdpZHRoT2ZDaGFyc0F0OmZ1bmN0aW9uKHQsZSxpKXt2YXIgcixuLHM9MDtmb3Iocj0wO3I8aTtyKyspbj10aGlzLl90ZXh0TGluZXNbZV1bcl0scys9dGhpcy5fZ2V0V2lkdGhPZkNoYXIodCxuLGUscik7cmV0dXJuIHN9LF9tZWFzdXJlTGluZTpmdW5jdGlvbih0LGUpe3RoaXMuX2lzTWVhc3VyaW5nPSEwO3ZhciBpPXRoaXMuX2dldFdpZHRoT2ZDaGFyc0F0KHQsZSx0aGlzLl90ZXh0TGluZXNbZV0ubGVuZ3RoKTtyZXR1cm4gMCE9PXRoaXMuY2hhclNwYWNpbmcmJihpLT10aGlzLl9nZXRXaWR0aE9mQ2hhclNwYWNpbmcoKSksdGhpcy5faXNNZWFzdXJpbmc9ITEsaT4wP2k6MH0sX2dldFdpZHRoT2ZTcGFjZTpmdW5jdGlvbih0LGUpe2lmKHRoaXMuX193aWR0aE9mU3BhY2VbZV0pcmV0dXJuIHRoaXMuX193aWR0aE9mU3BhY2VbZV07dmFyIGk9dGhpcy5fdGV4dExpbmVzW2VdLHI9dGhpcy5fZ2V0V2lkdGhPZldvcmRzKHQsaSxlLDApLG49dGhpcy53aWR0aC1yLHM9aS5sZW5ndGgtaS5yZXBsYWNlKHRoaXMuX3JlU3BhY2VzQW5kVGFicywiIikubGVuZ3RoLG89TWF0aC5tYXgobi9zLHQubWVhc3VyZVRleHQoIiAiKS53aWR0aCk7cmV0dXJuIHRoaXMuX193aWR0aE9mU3BhY2VbZV09byxvfSxfZ2V0V2lkdGhPZldvcmRzOmZ1bmN0aW9uKHQsZSxpLHIpe2Zvcih2YXIgbj0wLHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIG89ZVtzXTtvLm1hdGNoKC9ccy8pfHwobis9dGhpcy5fZ2V0V2lkdGhPZkNoYXIodCxvLGkscytyKSl9cmV0dXJuIG59LF9nZXRIZWlnaHRPZkxpbmU6ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9fbGluZUhlaWdodHNbZV0pcmV0dXJuIHRoaXMuX19saW5lSGVpZ2h0c1tlXTtmb3IodmFyIGk9dGhpcy5fdGV4dExpbmVzW2VdLHI9dGhpcy5fZ2V0SGVpZ2h0T2ZDaGFyKHQsZSwwKSxuPTEscz1pLmxlbmd0aDtuPHM7bisrKXt2YXIgbz10aGlzLl9nZXRIZWlnaHRPZkNoYXIodCxlLG4pO28+ciYmKHI9byl9cmV0dXJuIHRoaXMuX19saW5lSGVpZ2h0c1tlXT1yKnRoaXMubGluZUhlaWdodCp0aGlzLl9mb250U2l6ZU11bHQsdGhpcy5fX2xpbmVIZWlnaHRzW2VdfSxfZ2V0VGV4dEhlaWdodDpmdW5jdGlvbih0KXtmb3IodmFyIGUsaT0wLHI9MCxuPXRoaXMuX3RleHRMaW5lcy5sZW5ndGg7cjxuO3IrKyllPXRoaXMuX2dldEhlaWdodE9mTGluZSh0LHIpLGkrPXI9PT1uLTE/ZS90aGlzLmxpbmVIZWlnaHQ6ZTtyZXR1cm4gaX0sdG9PYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIGkscixuLHM9e307Zm9yKGkgaW4gdGhpcy5zdHlsZXMpe249dGhpcy5zdHlsZXNbaV0sc1tpXT17fTtmb3IociBpbiBuKXNbaV1bcl09dChuW3JdKX1yZXR1cm4gZmFicmljLnV0aWwub2JqZWN0LmV4dGVuZCh0aGlzLmNhbGxTdXBlcigidG9PYmplY3QiLGUpLHtzdHlsZXM6c30pfX0pLGZhYnJpYy5JVGV4dC5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUsaSl7dmFyIHI9bmV3IGZhYnJpYy5JVGV4dChlLnRleHQsdChlKSk7cmV0dXJuIGkmJmkocikscn19KCksZnVuY3Rpb24oKXt2YXIgdD1mYWJyaWMudXRpbC5vYmplY3QuY2xvbmU7ZmFicmljLnV0aWwub2JqZWN0LmV4dGVuZChmYWJyaWMuSVRleHQucHJvdG90eXBlLHtpbml0QmVoYXZpb3I6ZnVuY3Rpb24oKXt0aGlzLmluaXRBZGRlZEhhbmRsZXIoKSx0aGlzLmluaXRSZW1vdmVkSGFuZGxlcigpLHRoaXMuaW5pdEN1cnNvclNlbGVjdGlvbkhhbmRsZXJzKCksdGhpcy5pbml0RG91YmxlQ2xpY2tTaW11bGF0aW9uKCksdGhpcy5tb3VzZU1vdmVIYW5kbGVyPXRoaXMubW91c2VNb3ZlSGFuZGxlci5iaW5kKHRoaXMpfSxpbml0U2VsZWN0ZWRIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5vbigic2VsZWN0ZWQiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5zZWxlY3RlZD0hMH0sMTAwKX0pfSxpbml0QWRkZWRIYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLm9uKCJhZGRlZCIsZnVuY3Rpb24oKXt2YXIgZT10LmNhbnZhcztlJiYoZS5faGFzSVRleHRIYW5kbGVyc3x8KGUuX2hhc0lUZXh0SGFuZGxlcnM9ITAsdC5faW5pdENhbnZhc0hhbmRsZXJzKGUpKSxlLl9pVGV4dEluc3RhbmNlcz1lLl9pVGV4dEluc3RhbmNlc3x8W10sZS5faVRleHRJbnN0YW5jZXMucHVzaCh0KSl9KX0saW5pdFJlbW92ZWRIYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLm9uKCJyZW1vdmVkIixmdW5jdGlvbigpe3ZhciBlPXQuY2FudmFzO2UmJihlLl9pVGV4dEluc3RhbmNlcz1lLl9pVGV4dEluc3RhbmNlc3x8W10sZmFicmljLnV0aWwucmVtb3ZlRnJvbUFycmF5KGUuX2lUZXh0SW5zdGFuY2VzLHQpLDA9PT1lLl9pVGV4dEluc3RhbmNlcy5sZW5ndGgmJihlLl9oYXNJVGV4dEhhbmRsZXJzPSExLHQuX3JlbW92ZUNhbnZhc0hhbmRsZXJzKGUpKSl9KX0sX2luaXRDYW52YXNIYW5kbGVyczpmdW5jdGlvbih0KXt0Ll9jYW52YXNJVGV4dFNlbGVjdGlvbkNsZWFyZWRIYW5sZGVyPWZ1bmN0aW9uKCl7ZmFicmljLklUZXh0LnByb3RvdHlwZS5leGl0RWRpdGluZ09uT3RoZXJzKHQpfS5iaW5kKHRoaXMpLHQuX21vdXNlVXBJVGV4dEhhbmRsZXI9ZnVuY3Rpb24oKXt0Ll9pVGV4dEluc3RhbmNlcyYmdC5faVRleHRJbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbih0KXt0Ll9faXNNb3VzZWRvd249ITF9KX0uYmluZCh0aGlzKSx0Lm9uKCJzZWxlY3Rpb246Y2xlYXJlZCIsdC5fY2FudmFzSVRleHRTZWxlY3Rpb25DbGVhcmVkSGFubGRlciksdC5vbigib2JqZWN0OnNlbGVjdGVkIix0Ll9jYW52YXNJVGV4dFNlbGVjdGlvbkNsZWFyZWRIYW5sZGVyKSx0Lm9uKCJtb3VzZTp1cCIsdC5fbW91c2VVcElUZXh0SGFuZGxlcil9LF9yZW1vdmVDYW52YXNIYW5kbGVyczpmdW5jdGlvbih0KXt0Lm9mZigic2VsZWN0aW9uOmNsZWFyZWQiLHQuX2NhbnZhc0lUZXh0U2VsZWN0aW9uQ2xlYXJlZEhhbmxkZXIpLHQub2ZmKCJvYmplY3Q6c2VsZWN0ZWQiLHQuX2NhbnZhc0lUZXh0U2VsZWN0aW9uQ2xlYXJlZEhhbmxkZXIpLHQub2ZmKCJtb3VzZTp1cCIsdC5fbW91c2VVcElUZXh0SGFuZGxlcil9LF90aWNrOmZ1bmN0aW9uKCl7dGhpcy5fY3VycmVudFRpY2tTdGF0ZT10aGlzLl9hbmltYXRlQ3Vyc29yKHRoaXMsMSx0aGlzLmN1cnNvckR1cmF0aW9uLCJfb25UaWNrQ29tcGxldGUiKX0sX2FuaW1hdGVDdXJzb3I6ZnVuY3Rpb24odCxlLGkscil7dmFyIG47cmV0dXJuIG49e2lzQWJvcnRlZDohMSxhYm9ydDpmdW5jdGlvbigpe3RoaXMuaXNBYm9ydGVkPSEwfX0sdC5hbmltYXRlKCJfY3VycmVudEN1cnNvck9wYWNpdHkiLGUse2R1cmF0aW9uOmksb25Db21wbGV0ZTpmdW5jdGlvbigpe24uaXNBYm9ydGVkfHx0W3JdKCl9LG9uQ2hhbmdlOmZ1bmN0aW9uKCl7dC5jYW52YXMmJnQuc2VsZWN0aW9uU3RhcnQ9PT10LnNlbGVjdGlvbkVuZCYmdC5yZW5kZXJDdXJzb3JPclNlbGVjdGlvbigpfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiBuLmlzQWJvcnRlZH19KSxufSxfb25UaWNrQ29tcGxldGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2N1cnNvclRpbWVvdXQxJiZjbGVhclRpbWVvdXQodGhpcy5fY3Vyc29yVGltZW91dDEpLHRoaXMuX2N1cnNvclRpbWVvdXQxPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0Ll9jdXJyZW50VGlja0NvbXBsZXRlU3RhdGU9dC5fYW5pbWF0ZUN1cnNvcih0LDAsdGhpcy5jdXJzb3JEdXJhdGlvbi8yLCJfdGljayIpfSwxMDApfSxpbml0RGVsYXllZEN1cnNvcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLGk9dD8wOnRoaXMuY3Vyc29yRGVsYXk7dGhpcy5hYm9ydEN1cnNvckFuaW1hdGlvbigpLHRoaXMuX2N1cnJlbnRDdXJzb3JPcGFjaXR5PTEsdGhpcy5fY3Vyc29yVGltZW91dDI9c2V0VGltZW91dChmdW5jdGlvbigpe2UuX3RpY2soKX0saSl9LGFib3J0Q3Vyc29yQW5pbWF0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY3VycmVudFRpY2tTdGF0ZXx8dGhpcy5fY3VycmVudFRpY2tDb21wbGV0ZVN0YXRlO3RoaXMuX2N1cnJlbnRUaWNrU3RhdGUmJnRoaXMuX2N1cnJlbnRUaWNrU3RhdGUuYWJvcnQoKSx0aGlzLl9jdXJyZW50VGlja0NvbXBsZXRlU3RhdGUmJnRoaXMuX2N1cnJlbnRUaWNrQ29tcGxldGVTdGF0ZS5hYm9ydCgpLGNsZWFyVGltZW91dCh0aGlzLl9jdXJzb3JUaW1lb3V0MSksY2xlYXJUaW1lb3V0KHRoaXMuX2N1cnNvclRpbWVvdXQyKSx0aGlzLl9jdXJyZW50Q3Vyc29yT3BhY2l0eT0wLHQmJnRoaXMuY2FudmFzJiZ0aGlzLmNhbnZhcy5jbGVhckNvbnRleHQodGhpcy5jYW52YXMuY29udGV4dFRvcHx8dGhpcy5jdHgpfSxzZWxlY3RBbGw6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvblN0YXJ0PTAsdGhpcy5zZWxlY3Rpb25FbmQ9dGhpcy50ZXh0Lmxlbmd0aCx0aGlzLl9maXJlU2VsZWN0aW9uQ2hhbmdlZCgpLHRoaXMuX3VwZGF0ZVRleHRhcmVhKCl9LGdldFNlbGVjdGVkVGV4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRleHQuc2xpY2UodGhpcy5zZWxlY3Rpb25TdGFydCx0aGlzLnNlbGVjdGlvbkVuZCl9LGZpbmRXb3JkQm91bmRhcnlMZWZ0OmZ1bmN0aW9uKHQpe3ZhciBlPTAsaT10LTE7aWYodGhpcy5fcmVTcGFjZS50ZXN0KHRoaXMudGV4dC5jaGFyQXQoaSkpKWZvcig7dGhpcy5fcmVTcGFjZS50ZXN0KHRoaXMudGV4dC5jaGFyQXQoaSkpOyllKyssaS0tO2Zvcig7L1xTLy50ZXN0KHRoaXMudGV4dC5jaGFyQXQoaSkpJiZpPi0xOyllKyssaS0tO3JldHVybiB0LWV9LGZpbmRXb3JkQm91bmRhcnlSaWdodDpmdW5jdGlvbih0KXt2YXIgZT0wLGk9dDtpZih0aGlzLl9yZVNwYWNlLnRlc3QodGhpcy50ZXh0LmNoYXJBdChpKSkpZm9yKDt0aGlzLl9yZVNwYWNlLnRlc3QodGhpcy50ZXh0LmNoYXJBdChpKSk7KWUrKyxpKys7Zm9yKDsvXFMvLnRlc3QodGhpcy50ZXh0LmNoYXJBdChpKSkmJmk8dGhpcy50ZXh0Lmxlbmd0aDspZSsrLGkrKztyZXR1cm4gdCtlfSxmaW5kTGluZUJvdW5kYXJ5TGVmdDpmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxpPXQtMTshL1xuLy50ZXN0KHRoaXMudGV4dC5jaGFyQXQoaSkpJiZpPi0xOyllKyssaS0tO3JldHVybiB0LWV9LGZpbmRMaW5lQm91bmRhcnlSaWdodDpmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxpPXQ7IS9cbi8udGVzdCh0aGlzLnRleHQuY2hhckF0KGkpKSYmaTx0aGlzLnRleHQubGVuZ3RoOyllKyssaSsrO3JldHVybiB0K2V9LGdldE51bU5ld0xpbmVzSW5TZWxlY3RlZFRleHQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5nZXRTZWxlY3RlZFRleHQoKSxlPTAsaT0wLHI9dC5sZW5ndGg7aTxyO2krKykiXG4iPT09dFtpXSYmZSsrO3JldHVybiBlfSxzZWFyY2hXb3JkQm91bmRhcnk6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dGhpcy5fcmVTcGFjZS50ZXN0KHRoaXMudGV4dC5jaGFyQXQodCkpP3QtMTp0LHI9dGhpcy50ZXh0LmNoYXJBdChpKSxuPS9bIFxuXC4sOyFcP1wtXS87IW4udGVzdChyKSYmaT4wJiZpPHRoaXMudGV4dC5sZW5ndGg7KWkrPWUscj10aGlzLnRleHQuY2hhckF0KGkpO3JldHVybiBuLnRlc3QocikmJiJcbiIhPT1yJiYoaSs9MT09PWU/MDoxKSxpfSxzZWxlY3RXb3JkOmZ1bmN0aW9uKHQpe3Q9dHx8dGhpcy5zZWxlY3Rpb25TdGFydDt2YXIgZT10aGlzLnNlYXJjaFdvcmRCb3VuZGFyeSh0LC0xKSxpPXRoaXMuc2VhcmNoV29yZEJvdW5kYXJ5KHQsMSk7dGhpcy5zZWxlY3Rpb25TdGFydD1lLHRoaXMuc2VsZWN0aW9uRW5kPWksdGhpcy5fZmlyZVNlbGVjdGlvbkNoYW5nZWQoKSx0aGlzLl91cGRhdGVUZXh0YXJlYSgpLHRoaXMucmVuZGVyQ3Vyc29yT3JTZWxlY3Rpb24oKX0sc2VsZWN0TGluZTpmdW5jdGlvbih0KXt0PXR8fHRoaXMuc2VsZWN0aW9uU3RhcnQ7dmFyIGU9dGhpcy5maW5kTGluZUJvdW5kYXJ5TGVmdCh0KSxpPXRoaXMuZmluZExpbmVCb3VuZGFyeVJpZ2h0KHQpO3RoaXMuc2VsZWN0aW9uU3RhcnQ9ZSx0aGlzLnNlbGVjdGlvbkVuZD1pLHRoaXMuX2ZpcmVTZWxlY3Rpb25DaGFuZ2VkKCksdGhpcy5fdXBkYXRlVGV4dGFyZWEoKX0sZW50ZXJFZGl0aW5nOmZ1bmN0aW9uKHQpe2lmKCF0aGlzLmlzRWRpdGluZyYmdGhpcy5lZGl0YWJsZSlyZXR1cm4gdGhpcy5jYW52YXMmJnRoaXMuZXhpdEVkaXRpbmdPbk90aGVycyh0aGlzLmNhbnZhcyksdGhpcy5pc0VkaXRpbmc9ITAsdGhpcy5pbml0SGlkZGVuVGV4dGFyZWEodCksdGhpcy5oaWRkZW5UZXh0YXJlYS5mb2N1cygpLHRoaXMuX3VwZGF0ZVRleHRhcmVhKCksdGhpcy5fc2F2ZUVkaXRpbmdQcm9wcygpLHRoaXMuX3NldEVkaXRpbmdQcm9wcygpLHRoaXMuX3RleHRCZWZvcmVFZGl0PXRoaXMudGV4dCx0aGlzLl90aWNrKCksdGhpcy5maXJlKCJlZGl0aW5nOmVudGVyZWQiKSx0aGlzLmNhbnZhcz8odGhpcy5jYW52YXMuZmlyZSgidGV4dDplZGl0aW5nOmVudGVyZWQiLHt0YXJnZXQ6dGhpc30pLHRoaXMuaW5pdE1vdXNlTW92ZUhhbmRsZXIoKSx0aGlzLmNhbnZhcy5yZW5kZXJBbGwoKSx0aGlzKTp0aGlzfSxleGl0RWRpdGluZ09uT3RoZXJzOmZ1bmN0aW9uKHQpe3QuX2lUZXh0SW5zdGFuY2VzJiZ0Ll9pVGV4dEluc3RhbmNlcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Quc2VsZWN0ZWQ9ITEsdC5pc0VkaXRpbmcmJnQuZXhpdEVkaXRpbmcoKX0pfSxpbml0TW91c2VNb3ZlSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuY2FudmFzLm9uKCJtb3VzZTptb3ZlIix0aGlzLm1vdXNlTW92ZUhhbmRsZXIpfSxtb3VzZU1vdmVIYW5kbGVyOmZ1bmN0aW9uKHQpe2lmKHRoaXMuX19pc01vdXNlZG93biYmdGhpcy5pc0VkaXRpbmcpe3ZhciBlPXRoaXMuZ2V0U2VsZWN0aW9uU3RhcnRGcm9tUG9pbnRlcih0LmUpLGk9dGhpcy5zZWxlY3Rpb25TdGFydCxyPXRoaXMuc2VsZWN0aW9uRW5kO2UhPT10aGlzLl9fc2VsZWN0aW9uU3RhcnRPbk1vdXNlRG93biYmKGU+dGhpcy5fX3NlbGVjdGlvblN0YXJ0T25Nb3VzZURvd24/KHRoaXMuc2VsZWN0aW9uU3RhcnQ9dGhpcy5fX3NlbGVjdGlvblN0YXJ0T25Nb3VzZURvd24sdGhpcy5zZWxlY3Rpb25FbmQ9ZSk6KHRoaXMuc2VsZWN0aW9uU3RhcnQ9ZSx0aGlzLnNlbGVjdGlvbkVuZD10aGlzLl9fc2VsZWN0aW9uU3RhcnRPbk1vdXNlRG93biksdGhpcy5zZWxlY3Rpb25TdGFydD09PWkmJnRoaXMuc2VsZWN0aW9uRW5kPT09cnx8KHRoaXMuX2ZpcmVTZWxlY3Rpb25DaGFuZ2VkKCksdGhpcy5fdXBkYXRlVGV4dGFyZWEoKSx0aGlzLnJlbmRlckN1cnNvck9yU2VsZWN0aW9uKCkpKX19LF9zZXRFZGl0aW5nUHJvcHM6ZnVuY3Rpb24oKXt0aGlzLmhvdmVyQ3Vyc29yPSJ0ZXh0Iix0aGlzLmNhbnZhcyYmKHRoaXMuY2FudmFzLmRlZmF1bHRDdXJzb3I9dGhpcy5jYW52YXMubW92ZUN1cnNvcj0idGV4dCIpLHRoaXMuYm9yZGVyQ29sb3I9dGhpcy5lZGl0aW5nQm9yZGVyQ29sb3IsdGhpcy5oYXNDb250cm9scz10aGlzLnNlbGVjdGFibGU9ITEsdGhpcy5sb2NrTW92ZW1lbnRYPXRoaXMubG9ja01vdmVtZW50WT0hMH0sX3VwZGF0ZVRleHRhcmVhOmZ1bmN0aW9uKCl7aWYodGhpcy5oaWRkZW5UZXh0YXJlYSYmIXRoaXMuaW5Db21wb3NpdGlvbk1vZGUmJih0aGlzLmN1cnNvck9mZnNldENhY2hlPXt9LHRoaXMuaGlkZGVuVGV4dGFyZWEudmFsdWU9dGhpcy50ZXh0LHRoaXMuaGlkZGVuVGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQ9dGhpcy5zZWxlY3Rpb25TdGFydCx0aGlzLmhpZGRlblRleHRhcmVhLnNlbGVjdGlvbkVuZD10aGlzLnNlbGVjdGlvbkVuZCx0aGlzLnNlbGVjdGlvblN0YXJ0PT09dGhpcy5zZWxlY3Rpb25FbmQpKXt2YXIgdD10aGlzLl9jYWxjVGV4dGFyZWFQb3NpdGlvbigpO3RoaXMuaGlkZGVuVGV4dGFyZWEuc3R5bGUubGVmdD10LmxlZnQsdGhpcy5oaWRkZW5UZXh0YXJlYS5zdHlsZS50b3A9dC50b3AsdGhpcy5oaWRkZW5UZXh0YXJlYS5zdHlsZS5mb250U2l6ZT10LmZvbnRTaXplfX0sX2NhbGNUZXh0YXJlYVBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FudmFzKXJldHVybnt4OjEseToxfTt2YXIgdD10aGlzLnRleHQuc3BsaXQoIiIpLGU9dGhpcy5fZ2V0Q3Vyc29yQm91bmRhcmllcyh0LCJjdXJzb3IiKSxpPXRoaXMuZ2V0MkRDdXJzb3JMb2NhdGlvbigpLHI9aS5saW5lSW5kZXgsbj1pLmNoYXJJbmRleCxzPXRoaXMuZ2V0Q3VycmVudENoYXJGb250U2l6ZShyLG4pLG89MD09PXImJjA9PT1uP3RoaXMuX2dldExpbmVMZWZ0T2Zmc2V0KHRoaXMuX2dldExpbmVXaWR0aCh0aGlzLmN0eCxyKSk6ZS5sZWZ0T2Zmc2V0LGE9dGhpcy5jYWxjVHJhbnNmb3JtTWF0cml4KCksaD17eDplLmxlZnQrbyx5OmUudG9wK2UudG9wT2Zmc2V0K3N9LGM9dGhpcy5jYW52YXMudXBwZXJDYW52YXNFbCxsPWMud2lkdGgtcyx1PWMuaGVpZ2h0LXM7cmV0dXJuIGg9ZmFicmljLnV0aWwudHJhbnNmb3JtUG9pbnQoaCxhKSxoPWZhYnJpYy51dGlsLnRyYW5zZm9ybVBvaW50KGgsdGhpcy5jYW52YXMudmlld3BvcnRUcmFuc2Zvcm0pLGgueDwwJiYoaC54PTApLGgueD5sJiYoaC54PWwpLGgueTwwJiYoaC55PTApLGgueT51JiYoaC55PXUpLGgueCs9dGhpcy5jYW52YXMuX29mZnNldC5sZWZ0LGgueSs9dGhpcy5jYW52YXMuX29mZnNldC50b3Ase2xlZnQ6aC54KyJweCIsdG9wOmgueSsicHgiLGZvbnRTaXplOnN9fSxfc2F2ZUVkaXRpbmdQcm9wczpmdW5jdGlvbigpe3RoaXMuX3NhdmVkUHJvcHM9e2hhc0NvbnRyb2xzOnRoaXMuaGFzQ29udHJvbHMsYm9yZGVyQ29sb3I6dGhpcy5ib3JkZXJDb2xvcixsb2NrTW92ZW1lbnRYOnRoaXMubG9ja01vdmVtZW50WCxsb2NrTW92ZW1lbnRZOnRoaXMubG9ja01vdmVtZW50WSxob3ZlckN1cnNvcjp0aGlzLmhvdmVyQ3Vyc29yLGRlZmF1bHRDdXJzb3I6dGhpcy5jYW52YXMmJnRoaXMuY2FudmFzLmRlZmF1bHRDdXJzb3IsbW92ZUN1cnNvcjp0aGlzLmNhbnZhcyYmdGhpcy5jYW52YXMubW92ZUN1cnNvcgp9fSxfcmVzdG9yZUVkaXRpbmdQcm9wczpmdW5jdGlvbigpe3RoaXMuX3NhdmVkUHJvcHMmJih0aGlzLmhvdmVyQ3Vyc29yPXRoaXMuX3NhdmVkUHJvcHMub3ZlckN1cnNvcix0aGlzLmhhc0NvbnRyb2xzPXRoaXMuX3NhdmVkUHJvcHMuaGFzQ29udHJvbHMsdGhpcy5ib3JkZXJDb2xvcj10aGlzLl9zYXZlZFByb3BzLmJvcmRlckNvbG9yLHRoaXMubG9ja01vdmVtZW50WD10aGlzLl9zYXZlZFByb3BzLmxvY2tNb3ZlbWVudFgsdGhpcy5sb2NrTW92ZW1lbnRZPXRoaXMuX3NhdmVkUHJvcHMubG9ja01vdmVtZW50WSx0aGlzLmNhbnZhcyYmKHRoaXMuY2FudmFzLmRlZmF1bHRDdXJzb3I9dGhpcy5fc2F2ZWRQcm9wcy5kZWZhdWx0Q3Vyc29yLHRoaXMuY2FudmFzLm1vdmVDdXJzb3I9dGhpcy5fc2F2ZWRQcm9wcy5tb3ZlQ3Vyc29yKSl9LGV4aXRFZGl0aW5nOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fdGV4dEJlZm9yZUVkaXQhPT10aGlzLnRleHQ7cmV0dXJuIHRoaXMuc2VsZWN0ZWQ9ITEsdGhpcy5pc0VkaXRpbmc9ITEsdGhpcy5zZWxlY3RhYmxlPSEwLHRoaXMuc2VsZWN0aW9uRW5kPXRoaXMuc2VsZWN0aW9uU3RhcnQsdGhpcy5oaWRkZW5UZXh0YXJlYSYmdGhpcy5jYW52YXMmJnRoaXMuaGlkZGVuVGV4dGFyZWEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmhpZGRlblRleHRhcmVhKSx0aGlzLmhpZGRlblRleHRhcmVhPW51bGwsdGhpcy5hYm9ydEN1cnNvckFuaW1hdGlvbigpLHRoaXMuX3Jlc3RvcmVFZGl0aW5nUHJvcHMoKSx0aGlzLl9jdXJyZW50Q3Vyc29yT3BhY2l0eT0wLHRoaXMuZmlyZSgiZWRpdGluZzpleGl0ZWQiKSx0JiZ0aGlzLmZpcmUoIm1vZGlmaWVkIiksdGhpcy5jYW52YXMmJih0aGlzLmNhbnZhcy5vZmYoIm1vdXNlOm1vdmUiLHRoaXMubW91c2VNb3ZlSGFuZGxlciksdGhpcy5jYW52YXMuZmlyZSgidGV4dDplZGl0aW5nOmV4aXRlZCIse3RhcmdldDp0aGlzfSksdCYmdGhpcy5jYW52YXMuZmlyZSgib2JqZWN0Om1vZGlmaWVkIix7dGFyZ2V0OnRoaXN9KSksdGhpc30sX3JlbW92ZUV4dHJhbmVvdXNTdHlsZXM6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5zdHlsZXMpdGhpcy5fdGV4dExpbmVzW3RdfHxkZWxldGUgdGhpcy5zdHlsZXNbdF19LF9yZW1vdmVDaGFyc0Zyb21UbzpmdW5jdGlvbih0LGUpe2Zvcig7ZSE9PXQ7KXRoaXMuX3JlbW92ZVNpbmdsZUNoYXJBbmRTdHlsZSh0KzEpLGUtLTt0aGlzLnNlbGVjdGlvblN0YXJ0PXQsdGhpcy5zZWxlY3Rpb25FbmQ9dH0sX3JlbW92ZVNpbmdsZUNoYXJBbmRTdHlsZTpmdW5jdGlvbih0KXt2YXIgZT0iXG4iPT09dGhpcy50ZXh0W3QtMV0saT1lP3Q6dC0xO3RoaXMucmVtb3ZlU3R5bGVPYmplY3QoZSxpKSx0aGlzLnRleHQ9dGhpcy50ZXh0LnNsaWNlKDAsdC0xKSt0aGlzLnRleHQuc2xpY2UodCksdGhpcy5fdGV4dExpbmVzPXRoaXMuX3NwbGl0VGV4dEludG9MaW5lcygpfSxpbnNlcnRDaGFyczpmdW5jdGlvbih0LGUpe3ZhciBpO2lmKHRoaXMuc2VsZWN0aW9uRW5kLXRoaXMuc2VsZWN0aW9uU3RhcnQ+MSYmdGhpcy5fcmVtb3ZlQ2hhcnNGcm9tVG8odGhpcy5zZWxlY3Rpb25TdGFydCx0aGlzLnNlbGVjdGlvbkVuZCksIWUmJnRoaXMuaXNFbXB0eVN0eWxlcygpKXJldHVybiB2b2lkIHRoaXMuaW5zZXJ0Q2hhcih0LCExKTtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspZSYmKGk9ZmFicmljLmNvcGllZFRleHRTdHlsZVtyXSksdGhpcy5pbnNlcnRDaGFyKHRbcl0scjxuLTEsaSl9LGluc2VydENoYXI6ZnVuY3Rpb24odCxlLGkpe3ZhciByPSJcbiI9PT10aGlzLnRleHRbdGhpcy5zZWxlY3Rpb25TdGFydF07dGhpcy50ZXh0PXRoaXMudGV4dC5zbGljZSgwLHRoaXMuc2VsZWN0aW9uU3RhcnQpK3QrdGhpcy50ZXh0LnNsaWNlKHRoaXMuc2VsZWN0aW9uRW5kKSx0aGlzLl90ZXh0TGluZXM9dGhpcy5fc3BsaXRUZXh0SW50b0xpbmVzKCksdGhpcy5pbnNlcnRTdHlsZU9iamVjdHModCxyLGkpLHRoaXMuc2VsZWN0aW9uU3RhcnQrPXQubGVuZ3RoLHRoaXMuc2VsZWN0aW9uRW5kPXRoaXMuc2VsZWN0aW9uU3RhcnQsZXx8KHRoaXMuX3VwZGF0ZVRleHRhcmVhKCksdGhpcy5zZXRDb29yZHMoKSx0aGlzLl9maXJlU2VsZWN0aW9uQ2hhbmdlZCgpLHRoaXMuZmlyZSgiY2hhbmdlZCIpLHRoaXMuY2FudmFzJiZ0aGlzLmNhbnZhcy5maXJlKCJ0ZXh0OmNoYW5nZWQiLHt0YXJnZXQ6dGhpc30pLHRoaXMuY2FudmFzJiZ0aGlzLmNhbnZhcy5yZW5kZXJBbGwoKSl9LGluc2VydE5ld2xpbmVTdHlsZU9iamVjdDpmdW5jdGlvbihlLGkscil7dGhpcy5zaGlmdExpbmVTdHlsZXMoZSwxKSx0aGlzLnN0eWxlc1tlKzFdfHwodGhpcy5zdHlsZXNbZSsxXT17fSk7dmFyIG49e30scz17fTtpZih0aGlzLnN0eWxlc1tlXSYmdGhpcy5zdHlsZXNbZV1baS0xXSYmKG49dGhpcy5zdHlsZXNbZV1baS0xXSkscilzWzBdPXQobiksdGhpcy5zdHlsZXNbZSsxXT1zO2Vsc2V7Zm9yKHZhciBvIGluIHRoaXMuc3R5bGVzW2VdKXBhcnNlSW50KG8sMTApPj1pJiYoc1twYXJzZUludChvLDEwKS1pXT10aGlzLnN0eWxlc1tlXVtvXSxkZWxldGUgdGhpcy5zdHlsZXNbZV1bb10pO3RoaXMuc3R5bGVzW2UrMV09c310aGlzLl9mb3JjZUNsZWFyQ2FjaGU9ITB9LGluc2VydENoYXJTdHlsZU9iamVjdDpmdW5jdGlvbihlLGkscil7dmFyIG49dGhpcy5zdHlsZXNbZV0scz10KG4pOzAhPT1pfHxyfHwoaT0xKTtmb3IodmFyIG8gaW4gcyl7dmFyIGE9cGFyc2VJbnQobywxMCk7YT49aSYmKG5bYSsxXT1zW2FdLHNbYS0xXXx8ZGVsZXRlIG5bYV0pfXRoaXMuc3R5bGVzW2VdW2ldPXJ8fHQobltpLTFdKSx0aGlzLl9mb3JjZUNsZWFyQ2FjaGU9ITB9LGluc2VydFN0eWxlT2JqZWN0czpmdW5jdGlvbih0LGUsaSl7dmFyIHI9dGhpcy5nZXQyREN1cnNvckxvY2F0aW9uKCksbj1yLmxpbmVJbmRleCxzPXIuY2hhckluZGV4O3RoaXMuX2dldExpbmVTdHlsZShuKXx8dGhpcy5fc2V0TGluZVN0eWxlKG4se30pLCJcbiI9PT10P3RoaXMuaW5zZXJ0TmV3bGluZVN0eWxlT2JqZWN0KG4scyxlKTp0aGlzLmluc2VydENoYXJTdHlsZU9iamVjdChuLHMsaSl9LHNoaWZ0TGluZVN0eWxlczpmdW5jdGlvbihlLGkpe3ZhciByPXQodGhpcy5zdHlsZXMpO2Zvcih2YXIgbiBpbiB0aGlzLnN0eWxlcyl7dmFyIHM9cGFyc2VJbnQobiwxMCk7cz5lJiYodGhpcy5zdHlsZXNbcytpXT1yW3NdLHJbcy1pXXx8ZGVsZXRlIHRoaXMuc3R5bGVzW3NdKX19LHJlbW92ZVN0eWxlT2JqZWN0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5nZXQyREN1cnNvckxvY2F0aW9uKGUpLHI9aS5saW5lSW5kZXgsbj1pLmNoYXJJbmRleDt0aGlzLl9yZW1vdmVTdHlsZU9iamVjdCh0LGkscixuKX0sX2dldFRleHRPblByZXZpb3VzTGluZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdGV4dExpbmVzW3QtMV19LF9yZW1vdmVTdHlsZU9iamVjdDpmdW5jdGlvbihlLGkscixuKXtpZihlKXt2YXIgcz10aGlzLl9nZXRUZXh0T25QcmV2aW91c0xpbmUoaS5saW5lSW5kZXgpLG89cz9zLmxlbmd0aDowO3RoaXMuc3R5bGVzW3ItMV18fCh0aGlzLnN0eWxlc1tyLTFdPXt9KTtmb3IobiBpbiB0aGlzLnN0eWxlc1tyXSl0aGlzLnN0eWxlc1tyLTFdW3BhcnNlSW50KG4sMTApK29dPXRoaXMuc3R5bGVzW3JdW25dO3RoaXMuc2hpZnRMaW5lU3R5bGVzKGkubGluZUluZGV4LC0xKX1lbHNle3ZhciBhPXRoaXMuc3R5bGVzW3JdO2EmJmRlbGV0ZSBhW25dO3ZhciBoPXQoYSk7Zm9yKHZhciBjIGluIGgpe3ZhciBsPXBhcnNlSW50KGMsMTApO2w+PW4mJjAhPT1sJiYoYVtsLTFdPWhbbF0sZGVsZXRlIGFbbF0pfX19LGluc2VydE5ld2xpbmU6ZnVuY3Rpb24oKXt0aGlzLmluc2VydENoYXJzKCJcbiIpfSxzZXRTZWxlY3Rpb25TdGFydEVuZFdpdGhTaGlmdDpmdW5jdGlvbih0LGUsaSl7aTw9dD8oZT09PXQ/dGhpcy5fc2VsZWN0aW9uRGlyZWN0aW9uPSJsZWZ0IjoicmlnaHQiPT09dGhpcy5fc2VsZWN0aW9uRGlyZWN0aW9uJiYodGhpcy5fc2VsZWN0aW9uRGlyZWN0aW9uPSJsZWZ0Iix0aGlzLnNlbGVjdGlvbkVuZD10KSx0aGlzLnNlbGVjdGlvblN0YXJ0PWkpOmk+dCYmaTxlPyJyaWdodCI9PT10aGlzLl9zZWxlY3Rpb25EaXJlY3Rpb24/dGhpcy5zZWxlY3Rpb25FbmQ9aTp0aGlzLnNlbGVjdGlvblN0YXJ0PWk6KGU9PT10P3RoaXMuX3NlbGVjdGlvbkRpcmVjdGlvbj0icmlnaHQiOiJsZWZ0Ij09PXRoaXMuX3NlbGVjdGlvbkRpcmVjdGlvbiYmKHRoaXMuX3NlbGVjdGlvbkRpcmVjdGlvbj0icmlnaHQiLHRoaXMuc2VsZWN0aW9uU3RhcnQ9ZSksdGhpcy5zZWxlY3Rpb25FbmQ9aSl9LHNldFNlbGVjdGlvbkluQm91bmRhcmllczpmdW5jdGlvbigpe3ZhciB0PXRoaXMudGV4dC5sZW5ndGg7dGhpcy5zZWxlY3Rpb25TdGFydD50P3RoaXMuc2VsZWN0aW9uU3RhcnQ9dDp0aGlzLnNlbGVjdGlvblN0YXJ0PDAmJih0aGlzLnNlbGVjdGlvblN0YXJ0PTApLHRoaXMuc2VsZWN0aW9uRW5kPnQ/dGhpcy5zZWxlY3Rpb25FbmQ9dDp0aGlzLnNlbGVjdGlvbkVuZDwwJiYodGhpcy5zZWxlY3Rpb25FbmQ9MCl9fSl9KCksZmFicmljLnV0aWwub2JqZWN0LmV4dGVuZChmYWJyaWMuSVRleHQucHJvdG90eXBlLHtpbml0RG91YmxlQ2xpY2tTaW11bGF0aW9uOmZ1bmN0aW9uKCl7dGhpcy5fX2xhc3RDbGlja1RpbWU9K25ldyBEYXRlLHRoaXMuX19sYXN0TGFzdENsaWNrVGltZT0rbmV3IERhdGUsdGhpcy5fX2xhc3RQb2ludGVyPXt9LHRoaXMub24oIm1vdXNlZG93biIsdGhpcy5vbk1vdXNlRG93bi5iaW5kKHRoaXMpKX0sb25Nb3VzZURvd246ZnVuY3Rpb24odCl7dGhpcy5fX25ld0NsaWNrVGltZT0rbmV3IERhdGU7dmFyIGU9dGhpcy5jYW52YXMuZ2V0UG9pbnRlcih0LmUpO3RoaXMuaXNUcmlwbGVDbGljayhlKT8odGhpcy5maXJlKCJ0cmlwbGVjbGljayIsdCksdGhpcy5fc3RvcEV2ZW50KHQuZSkpOnRoaXMuaXNEb3VibGVDbGljayhlKSYmKHRoaXMuZmlyZSgiZGJsY2xpY2siLHQpLHRoaXMuX3N0b3BFdmVudCh0LmUpKSx0aGlzLl9fbGFzdExhc3RDbGlja1RpbWU9dGhpcy5fX2xhc3RDbGlja1RpbWUsdGhpcy5fX2xhc3RDbGlja1RpbWU9dGhpcy5fX25ld0NsaWNrVGltZSx0aGlzLl9fbGFzdFBvaW50ZXI9ZSx0aGlzLl9fbGFzdElzRWRpdGluZz10aGlzLmlzRWRpdGluZyx0aGlzLl9fbGFzdFNlbGVjdGVkPXRoaXMuc2VsZWN0ZWR9LGlzRG91YmxlQ2xpY2s6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19uZXdDbGlja1RpbWUtdGhpcy5fX2xhc3RDbGlja1RpbWU8NTAwJiZ0aGlzLl9fbGFzdFBvaW50ZXIueD09PXQueCYmdGhpcy5fX2xhc3RQb2ludGVyLnk9PT10LnkmJnRoaXMuX19sYXN0SXNFZGl0aW5nfSxpc1RyaXBsZUNsaWNrOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fbmV3Q2xpY2tUaW1lLXRoaXMuX19sYXN0Q2xpY2tUaW1lPDUwMCYmdGhpcy5fX2xhc3RDbGlja1RpbWUtdGhpcy5fX2xhc3RMYXN0Q2xpY2tUaW1lPDUwMCYmdGhpcy5fX2xhc3RQb2ludGVyLng9PT10LngmJnRoaXMuX19sYXN0UG9pbnRlci55PT09dC55fSxfc3RvcEV2ZW50OmZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQmJnQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbiYmdC5zdG9wUHJvcGFnYXRpb24oKX0saW5pdEN1cnNvclNlbGVjdGlvbkhhbmRsZXJzOmZ1bmN0aW9uKCl7dGhpcy5pbml0U2VsZWN0ZWRIYW5kbGVyKCksdGhpcy5pbml0TW91c2Vkb3duSGFuZGxlcigpLHRoaXMuaW5pdE1vdXNldXBIYW5kbGVyKCksdGhpcy5pbml0Q2xpY2tzKCl9LGluaXRDbGlja3M6ZnVuY3Rpb24oKXt0aGlzLm9uKCJkYmxjbGljayIsZnVuY3Rpb24odCl7dGhpcy5zZWxlY3RXb3JkKHRoaXMuZ2V0U2VsZWN0aW9uU3RhcnRGcm9tUG9pbnRlcih0LmUpKX0pLHRoaXMub24oInRyaXBsZWNsaWNrIixmdW5jdGlvbih0KXt0aGlzLnNlbGVjdExpbmUodGhpcy5nZXRTZWxlY3Rpb25TdGFydEZyb21Qb2ludGVyKHQuZSkpfSl9LGluaXRNb3VzZWRvd25IYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5vbigibW91c2Vkb3duIixmdW5jdGlvbih0KXtpZih0aGlzLmVkaXRhYmxlKXt2YXIgZT10aGlzLmNhbnZhcy5nZXRQb2ludGVyKHQuZSk7dGhpcy5fX21vdXNlZG93blg9ZS54LHRoaXMuX19tb3VzZWRvd25ZPWUueSx0aGlzLl9faXNNb3VzZWRvd249ITAsdGhpcy5zZWxlY3RlZCYmdGhpcy5zZXRDdXJzb3JCeUNsaWNrKHQuZSksdGhpcy5pc0VkaXRpbmcmJih0aGlzLl9fc2VsZWN0aW9uU3RhcnRPbk1vdXNlRG93bj10aGlzLnNlbGVjdGlvblN0YXJ0LHRoaXMuc2VsZWN0aW9uU3RhcnQ9PT10aGlzLnNlbGVjdGlvbkVuZCYmdGhpcy5hYm9ydEN1cnNvckFuaW1hdGlvbigpLHRoaXMucmVuZGVyQ3Vyc29yT3JTZWxlY3Rpb24oKSl9fSl9LF9pc09iamVjdE1vdmVkOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY2FudmFzLmdldFBvaW50ZXIodCk7cmV0dXJuIHRoaXMuX19tb3VzZWRvd25YIT09ZS54fHx0aGlzLl9fbW91c2Vkb3duWSE9PWUueX0saW5pdE1vdXNldXBIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5vbigibW91c2V1cCIsZnVuY3Rpb24odCl7dGhpcy5fX2lzTW91c2Vkb3duPSExLHRoaXMuZWRpdGFibGUmJiF0aGlzLl9pc09iamVjdE1vdmVkKHQuZSkmJih0aGlzLl9fbGFzdFNlbGVjdGVkJiYhdGhpcy5fX2Nvcm5lciYmKHRoaXMuZW50ZXJFZGl0aW5nKHQuZSksdGhpcy5zZWxlY3Rpb25TdGFydD09PXRoaXMuc2VsZWN0aW9uRW5kP3RoaXMuaW5pdERlbGF5ZWRDdXJzb3IoITApOnRoaXMucmVuZGVyQ3Vyc29yT3JTZWxlY3Rpb24oKSksdGhpcy5zZWxlY3RlZD0hMCl9KX0sc2V0Q3Vyc29yQnlDbGljazpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFNlbGVjdGlvblN0YXJ0RnJvbVBvaW50ZXIodCksaT10aGlzLnNlbGVjdGlvblN0YXJ0LHI9dGhpcy5zZWxlY3Rpb25FbmQ7dC5zaGlmdEtleT90aGlzLnNldFNlbGVjdGlvblN0YXJ0RW5kV2l0aFNoaWZ0KGkscixlKToodGhpcy5zZWxlY3Rpb25TdGFydD1lLHRoaXMuc2VsZWN0aW9uRW5kPWUpLHRoaXMuX2ZpcmVTZWxlY3Rpb25DaGFuZ2VkKCksdGhpcy5fdXBkYXRlVGV4dGFyZWEoKX0sZ2V0U2VsZWN0aW9uU3RhcnRGcm9tUG9pbnRlcjpmdW5jdGlvbih0KXtmb3IodmFyIGUsaSxyPXRoaXMuZ2V0TG9jYWxQb2ludGVyKHQpLG49MCxzPTAsbz0wLGE9MCxoPTAsYz10aGlzLl90ZXh0TGluZXMubGVuZ3RoO2g8YztoKyspe2k9dGhpcy5fdGV4dExpbmVzW2hdLG8rPXRoaXMuX2dldEhlaWdodE9mTGluZSh0aGlzLmN0eCxoKSp0aGlzLnNjYWxlWTt2YXIgbD10aGlzLl9nZXRMaW5lV2lkdGgodGhpcy5jdHgsaCksdT10aGlzLl9nZXRMaW5lTGVmdE9mZnNldChsKTtzPXUqdGhpcy5zY2FsZVg7Zm9yKHZhciBmPTAsZD1pLmxlbmd0aDtmPGQ7ZisrKXtpZihuPXMscys9dGhpcy5fZ2V0V2lkdGhPZkNoYXIodGhpcy5jdHgsaVtmXSxoLHRoaXMuZmxpcFg/ZC1mOmYpKnRoaXMuc2NhbGVYLCEobzw9ci55fHxzPD1yLngpKXJldHVybiB0aGlzLl9nZXROZXdTZWxlY3Rpb25TdGFydEZyb21PZmZzZXQocixuLHMsYStoLGQpO2ErK31pZihyLnk8bylyZXR1cm4gdGhpcy5fZ2V0TmV3U2VsZWN0aW9uU3RhcnRGcm9tT2Zmc2V0KHIsbixzLGEraC0xLGQpfWlmKCJ1bmRlZmluZWQiPT10eXBlb2YgZSlyZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aH0sX2dldE5ld1NlbGVjdGlvblN0YXJ0RnJvbU9mZnNldDpmdW5jdGlvbih0LGUsaSxyLG4pe3ZhciBzPXQueC1lLG89aS10LngsYT1vPnM/MDoxLGg9cithO3JldHVybiB0aGlzLmZsaXBYJiYoaD1uLWgpLGg+dGhpcy50ZXh0Lmxlbmd0aCYmKGg9dGhpcy50ZXh0Lmxlbmd0aCksaH19KSxmYWJyaWMudXRpbC5vYmplY3QuZXh0ZW5kKGZhYnJpYy5JVGV4dC5wcm90b3R5cGUse2luaXRIaWRkZW5UZXh0YXJlYTpmdW5jdGlvbigpe3RoaXMuaGlkZGVuVGV4dGFyZWE9ZmFicmljLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIiksdGhpcy5oaWRkZW5UZXh0YXJlYS5zZXRBdHRyaWJ1dGUoImF1dG9jYXBpdGFsaXplIiwib2ZmIik7dmFyIHQ9dGhpcy5fY2FsY1RleHRhcmVhUG9zaXRpb24oKTt0aGlzLmhpZGRlblRleHRhcmVhLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAiK3QudG9wKyI7IGxlZnQ6ICIrdC5sZWZ0KyI7IG9wYWNpdHk6IDA7IHdpZHRoOiAwcHg7IGhlaWdodDogMHB4OyB6LWluZGV4OiAtOTk5OyIsZmFicmljLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5oaWRkZW5UZXh0YXJlYSksZmFicmljLnV0aWwuYWRkTGlzdGVuZXIodGhpcy5oaWRkZW5UZXh0YXJlYSwia2V5ZG93biIsdGhpcy5vbktleURvd24uYmluZCh0aGlzKSksZmFicmljLnV0aWwuYWRkTGlzdGVuZXIodGhpcy5oaWRkZW5UZXh0YXJlYSwia2V5dXAiLHRoaXMub25LZXlVcC5iaW5kKHRoaXMpKSxmYWJyaWMudXRpbC5hZGRMaXN0ZW5lcih0aGlzLmhpZGRlblRleHRhcmVhLCJpbnB1dCIsdGhpcy5vbklucHV0LmJpbmQodGhpcykpLGZhYnJpYy51dGlsLmFkZExpc3RlbmVyKHRoaXMuaGlkZGVuVGV4dGFyZWEsImNvcHkiLHRoaXMuY29weS5iaW5kKHRoaXMpKSxmYWJyaWMudXRpbC5hZGRMaXN0ZW5lcih0aGlzLmhpZGRlblRleHRhcmVhLCJjdXQiLHRoaXMuY3V0LmJpbmQodGhpcykpLGZhYnJpYy51dGlsLmFkZExpc3RlbmVyKHRoaXMuaGlkZGVuVGV4dGFyZWEsInBhc3RlIix0aGlzLnBhc3RlLmJpbmQodGhpcykpLGZhYnJpYy51dGlsLmFkZExpc3RlbmVyKHRoaXMuaGlkZGVuVGV4dGFyZWEsImNvbXBvc2l0aW9uc3RhcnQiLHRoaXMub25Db21wb3NpdGlvblN0YXJ0LmJpbmQodGhpcykpLGZhYnJpYy51dGlsLmFkZExpc3RlbmVyKHRoaXMuaGlkZGVuVGV4dGFyZWEsImNvbXBvc2l0aW9udXBkYXRlIix0aGlzLm9uQ29tcG9zaXRpb25VcGRhdGUuYmluZCh0aGlzKSksZmFicmljLnV0aWwuYWRkTGlzdGVuZXIodGhpcy5oaWRkZW5UZXh0YXJlYSwiY29tcG9zaXRpb25lbmQiLHRoaXMub25Db21wb3NpdGlvbkVuZC5iaW5kKHRoaXMpKSwhdGhpcy5fY2xpY2tIYW5kbGVySW5pdGlhbGl6ZWQmJnRoaXMuY2FudmFzJiYoZmFicmljLnV0aWwuYWRkTGlzdGVuZXIodGhpcy5jYW52YXMudXBwZXJDYW52YXNFbCwiY2xpY2siLHRoaXMub25DbGljay5iaW5kKHRoaXMpKSx0aGlzLl9jbGlja0hhbmRsZXJJbml0aWFsaXplZD0hMCl9LF9rZXlzTWFwOns4OiJyZW1vdmVDaGFycyIsOToiZXhpdEVkaXRpbmciLDI3OiJleGl0RWRpdGluZyIsMTM6Imluc2VydE5ld2xpbmUiLDMzOiJtb3ZlQ3Vyc29yVXAiLDM0OiJtb3ZlQ3Vyc29yRG93biIsMzU6Im1vdmVDdXJzb3JSaWdodCIsMzY6Im1vdmVDdXJzb3JMZWZ0IiwzNzoibW92ZUN1cnNvckxlZnQiLDM4OiJtb3ZlQ3Vyc29yVXAiLDM5OiJtb3ZlQ3Vyc29yUmlnaHQiLDQwOiJtb3ZlQ3Vyc29yRG93biIsNDY6ImZvcndhcmREZWxldGUifSxfY3RybEtleXNNYXBVcDp7Njc6ImNvcHkiLDg4OiJjdXQifSxfY3RybEtleXNNYXBEb3duOns2NToic2VsZWN0QWxsIn0sb25DbGljazpmdW5jdGlvbigpe3RoaXMuaGlkZGVuVGV4dGFyZWEmJnRoaXMuaGlkZGVuVGV4dGFyZWEuZm9jdXMoKX0sb25LZXlEb3duOmZ1bmN0aW9uKHQpe2lmKHRoaXMuaXNFZGl0aW5nKXtpZih0LmtleUNvZGUgaW4gdGhpcy5fa2V5c01hcCl0aGlzW3RoaXMuX2tleXNNYXBbdC5rZXlDb2RlXV0odCk7ZWxzZXtpZighKHQua2V5Q29kZSBpbiB0aGlzLl9jdHJsS2V5c01hcERvd24mJih0LmN0cmxLZXl8fHQubWV0YUtleSkpKXJldHVybjt0aGlzW3RoaXMuX2N0cmxLZXlzTWFwRG93blt0LmtleUNvZGVdXSh0KX10LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHQucHJldmVudERlZmF1bHQoKSx0aGlzLmNhbnZhcyYmdGhpcy5jYW52YXMucmVuZGVyQWxsKCl9fSxvbktleVVwOmZ1bmN0aW9uKHQpe3JldHVybiF0aGlzLmlzRWRpdGluZ3x8dGhpcy5fY29weURvbmU/dm9pZCh0aGlzLl9jb3B5RG9uZT0hMSk6dm9pZCh0LmtleUNvZGUgaW4gdGhpcy5fY3RybEtleXNNYXBVcCYmKHQuY3RybEtleXx8dC5tZXRhS2V5KSYmKHRoaXNbdGhpcy5fY3RybEtleXNNYXBVcFt0LmtleUNvZGVdXSh0KSx0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHQucHJldmVudERlZmF1bHQoKSx0aGlzLmNhbnZhcyYmdGhpcy5jYW52YXMucmVuZGVyQWxsKCkpKX0sb25JbnB1dDpmdW5jdGlvbih0KXtpZih0aGlzLmlzRWRpdGluZyYmIXRoaXMuaW5Db21wb3NpdGlvbk1vZGUpe3ZhciBlLGkscixuPXRoaXMuc2VsZWN0aW9uU3RhcnR8fDAscz10aGlzLnNlbGVjdGlvbkVuZHx8MCxvPXRoaXMudGV4dC5sZW5ndGgsYT10aGlzLmhpZGRlblRleHRhcmVhLnZhbHVlLmxlbmd0aDthPm8/KHI9ImxlZnQiPT09dGhpcy5fc2VsZWN0aW9uRGlyZWN0aW9uP3M6bixlPWEtbyxpPXRoaXMuaGlkZGVuVGV4dGFyZWEudmFsdWUuc2xpY2UocixyK2UpKTooZT1hLW8rcy1uLGk9dGhpcy5oaWRkZW5UZXh0YXJlYS52YWx1ZS5zbGljZShuLG4rZSkpLHRoaXMuaW5zZXJ0Q2hhcnMoaSksdC5zdG9wUHJvcGFnYXRpb24oKX19LG9uQ29tcG9zaXRpb25TdGFydDpmdW5jdGlvbigpe3RoaXMuaW5Db21wb3NpdGlvbk1vZGU9ITAsdGhpcy5wcmV2Q29tcG9zaXRpb25MZW5ndGg9MCx0aGlzLmNvbXBvc2l0aW9uU3RhcnQ9dGhpcy5zZWxlY3Rpb25TdGFydH0sb25Db21wb3NpdGlvbkVuZDpmdW5jdGlvbigpe3RoaXMuaW5Db21wb3NpdGlvbk1vZGU9ITF9LG9uQ29tcG9zaXRpb25VcGRhdGU6ZnVuY3Rpb24odCl7dmFyIGU9dC5kYXRhO3RoaXMuc2VsZWN0aW9uU3RhcnQ9dGhpcy5jb21wb3NpdGlvblN0YXJ0LHRoaXMuc2VsZWN0aW9uRW5kPXRoaXMuc2VsZWN0aW9uRW5kPT09dGhpcy5zZWxlY3Rpb25TdGFydD90aGlzLmNvbXBvc2l0aW9uU3RhcnQrdGhpcy5wcmV2Q29tcG9zaXRpb25MZW5ndGg6dGhpcy5zZWxlY3Rpb25FbmQsdGhpcy5pbnNlcnRDaGFycyhlLCExKSx0aGlzLnByZXZDb21wb3NpdGlvbkxlbmd0aD1lLmxlbmd0aH0sZm9yd2FyZERlbGV0ZTpmdW5jdGlvbih0KXtpZih0aGlzLnNlbGVjdGlvblN0YXJ0PT09dGhpcy5zZWxlY3Rpb25FbmQpe2lmKHRoaXMuc2VsZWN0aW9uU3RhcnQ9PT10aGlzLnRleHQubGVuZ3RoKXJldHVybjt0aGlzLm1vdmVDdXJzb3JSaWdodCh0KX10aGlzLnJlbW92ZUNoYXJzKHQpfSxjb3B5OmZ1bmN0aW9uKHQpe2lmKHRoaXMuc2VsZWN0aW9uU3RhcnQhPT10aGlzLnNlbGVjdGlvbkVuZCl7dmFyIGU9dGhpcy5nZXRTZWxlY3RlZFRleHQoKSxpPXRoaXMuX2dldENsaXBib2FyZERhdGEodCk7aSYmaS5zZXREYXRhKCJ0ZXh0IixlKSxmYWJyaWMuY29waWVkVGV4dD1lLGZhYnJpYy5jb3BpZWRUZXh0U3R5bGU9dGhpcy5nZXRTZWxlY3Rpb25TdHlsZXModGhpcy5zZWxlY3Rpb25TdGFydCx0aGlzLnNlbGVjdGlvbkVuZCksdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fY29weURvbmU9ITB9fSxwYXN0ZTpmdW5jdGlvbih0KXt2YXIgZT1udWxsLGk9dGhpcy5fZ2V0Q2xpcGJvYXJkRGF0YSh0KSxyPSEwO2k/KGU9aS5nZXREYXRhKCJ0ZXh0IikucmVwbGFjZSgvXHIvZywiIiksZmFicmljLmNvcGllZFRleHRTdHlsZSYmZmFicmljLmNvcGllZFRleHQ9PT1lfHwocj0hMSkpOmU9ZmFicmljLmNvcGllZFRleHQsZSYmdGhpcy5pbnNlcnRDaGFycyhlLHIpLHQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdC5wcmV2ZW50RGVmYXVsdCgpfSxjdXQ6ZnVuY3Rpb24odCl7dGhpcy5zZWxlY3Rpb25TdGFydCE9PXRoaXMuc2VsZWN0aW9uRW5kJiYodGhpcy5jb3B5KHQpLHRoaXMucmVtb3ZlQ2hhcnModCkpfSxfZ2V0Q2xpcGJvYXJkRGF0YTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5jbGlwYm9hcmREYXRhfHxmYWJyaWMud2luZG93LmNsaXBib2FyZERhdGF9LF9nZXRXaWR0aEJlZm9yZUN1cnNvcjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaSxyPXRoaXMuX3RleHRMaW5lc1t0XS5zbGljZSgwLGUpLG49dGhpcy5fZ2V0TGluZVdpZHRoKHRoaXMuY3R4LHQpLHM9dGhpcy5fZ2V0TGluZUxlZnRPZmZzZXQobiksbz0wLGE9ci5sZW5ndGg7bzxhO28rKylpPXJbb10scys9dGhpcy5fZ2V0V2lkdGhPZkNoYXIodGhpcy5jdHgsaSx0LG8pO3JldHVybiBzfSxnZXREb3duQ3Vyc29yT2Zmc2V0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fZ2V0U2VsZWN0aW9uRm9yT2Zmc2V0KHQsZSkscj10aGlzLmdldDJEQ3Vyc29yTG9jYXRpb24oaSksbj1yLmxpbmVJbmRleDtpZihuPT09dGhpcy5fdGV4dExpbmVzLmxlbmd0aC0xfHx0Lm1ldGFLZXl8fDM0PT09dC5rZXlDb2RlKXJldHVybiB0aGlzLnRleHQubGVuZ3RoLWk7dmFyIHM9ci5jaGFySW5kZXgsbz10aGlzLl9nZXRXaWR0aEJlZm9yZUN1cnNvcihuLHMpLGE9dGhpcy5fZ2V0SW5kZXhPbkxpbmUobisxLG8pLGg9dGhpcy5fdGV4dExpbmVzW25dLnNsaWNlKHMpO3JldHVybiBoLmxlbmd0aCthKzJ9LF9nZXRTZWxlY3Rpb25Gb3JPZmZzZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5zaGlmdEtleSYmdGhpcy5zZWxlY3Rpb25TdGFydCE9PXRoaXMuc2VsZWN0aW9uRW5kJiZlP3RoaXMuc2VsZWN0aW9uRW5kOnRoaXMuc2VsZWN0aW9uU3RhcnR9LGdldFVwQ3Vyc29yT2Zmc2V0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fZ2V0U2VsZWN0aW9uRm9yT2Zmc2V0KHQsZSkscj10aGlzLmdldDJEQ3Vyc29yTG9jYXRpb24oaSksbj1yLmxpbmVJbmRleDtpZigwPT09bnx8dC5tZXRhS2V5fHwzMz09PXQua2V5Q29kZSlyZXR1cm4taTt2YXIgcz1yLmNoYXJJbmRleCxvPXRoaXMuX2dldFdpZHRoQmVmb3JlQ3Vyc29yKG4scyksYT10aGlzLl9nZXRJbmRleE9uTGluZShuLTEsbyksaD10aGlzLl90ZXh0TGluZXNbbl0uc2xpY2UoMCxzKTtyZXR1cm4tdGhpcy5fdGV4dExpbmVzW24tMV0ubGVuZ3RoK2EtaC5sZW5ndGh9LF9nZXRJbmRleE9uTGluZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaSxyPXRoaXMuX2dldExpbmVXaWR0aCh0aGlzLmN0eCx0KSxuPXRoaXMuX3RleHRMaW5lc1t0XSxzPXRoaXMuX2dldExpbmVMZWZ0T2Zmc2V0KHIpLG89cyxhPTAsaD0wLGM9bi5sZW5ndGg7aDxjO2grKyl7dmFyIGw9bltoXSx1PXRoaXMuX2dldFdpZHRoT2ZDaGFyKHRoaXMuY3R4LGwsdCxoKTtpZihvKz11LG8+ZSl7aT0hMDt2YXIgZj1vLXUsZD1vLGc9TWF0aC5hYnMoZi1lKSxwPU1hdGguYWJzKGQtZSk7YT1wPGc/aDpoLTE7YnJlYWt9fXJldHVybiBpfHwoYT1uLmxlbmd0aC0xKSxhfSxtb3ZlQ3Vyc29yRG93bjpmdW5jdGlvbih0KXt0aGlzLnNlbGVjdGlvblN0YXJ0Pj10aGlzLnRleHQubGVuZ3RoJiZ0aGlzLnNlbGVjdGlvbkVuZD49dGhpcy50ZXh0Lmxlbmd0aHx8dGhpcy5fbW92ZUN1cnNvclVwT3JEb3duKCJEb3duIix0KX0sbW92ZUN1cnNvclVwOmZ1bmN0aW9uKHQpezA9PT10aGlzLnNlbGVjdGlvblN0YXJ0JiYwPT09dGhpcy5zZWxlY3Rpb25FbmR8fHRoaXMuX21vdmVDdXJzb3JVcE9yRG93bigiVXAiLHQpfSxfbW92ZUN1cnNvclVwT3JEb3duOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ImdldCIrdCsiQ3Vyc29yT2Zmc2V0IixyPXRoaXNbaV0oZSwicmlnaHQiPT09dGhpcy5fc2VsZWN0aW9uRGlyZWN0aW9uKTtlLnNoaWZ0S2V5P3RoaXMubW92ZUN1cnNvcldpdGhTaGlmdChyKTp0aGlzLm1vdmVDdXJzb3JXaXRob3V0U2hpZnQociksMCE9PXImJih0aGlzLnNldFNlbGVjdGlvbkluQm91bmRhcmllcygpLHRoaXMuYWJvcnRDdXJzb3JBbmltYXRpb24oKSx0aGlzLl9jdXJyZW50Q3Vyc29yT3BhY2l0eT0xLHRoaXMuaW5pdERlbGF5ZWRDdXJzb3IoKSx0aGlzLl9maXJlU2VsZWN0aW9uQ2hhbmdlZCgpLHRoaXMuX3VwZGF0ZVRleHRhcmVhKCkpfSxtb3ZlQ3Vyc29yV2l0aFNoaWZ0OmZ1bmN0aW9uKHQpe3ZhciBlPSJsZWZ0Ij09PXRoaXMuX3NlbGVjdGlvbkRpcmVjdGlvbj90aGlzLnNlbGVjdGlvblN0YXJ0K3Q6dGhpcy5zZWxlY3Rpb25FbmQrdDtyZXR1cm4gdGhpcy5zZXRTZWxlY3Rpb25TdGFydEVuZFdpdGhTaGlmdCh0aGlzLnNlbGVjdGlvblN0YXJ0LHRoaXMuc2VsZWN0aW9uRW5kLGUpLDAhPT10fSxtb3ZlQ3Vyc29yV2l0aG91dFNoaWZ0OmZ1bmN0aW9uKHQpe3JldHVybiB0PDA/KHRoaXMuc2VsZWN0aW9uU3RhcnQrPXQsdGhpcy5zZWxlY3Rpb25FbmQ9dGhpcy5zZWxlY3Rpb25TdGFydCk6KHRoaXMuc2VsZWN0aW9uRW5kKz10LHRoaXMuc2VsZWN0aW9uU3RhcnQ9dGhpcy5zZWxlY3Rpb25FbmQpLDAhPT10fSxtb3ZlQ3Vyc29yTGVmdDpmdW5jdGlvbih0KXswPT09dGhpcy5zZWxlY3Rpb25TdGFydCYmMD09PXRoaXMuc2VsZWN0aW9uRW5kfHx0aGlzLl9tb3ZlQ3Vyc29yTGVmdE9yUmlnaHQoIkxlZnQiLHQpfSxfbW92ZTpmdW5jdGlvbih0LGUsaSl7dmFyIHI7aWYodC5hbHRLZXkpcj10aGlzWyJmaW5kV29yZEJvdW5kYXJ5IitpXSh0aGlzW2VdKTtlbHNle2lmKCF0Lm1ldGFLZXkmJjM1IT09dC5rZXlDb2RlJiYzNiE9PXQua2V5Q29kZSlyZXR1cm4gdGhpc1tlXSs9IkxlZnQiPT09aT8tMToxLCEwO3I9dGhpc1siZmluZExpbmVCb3VuZGFyeSIraV0odGhpc1tlXSl9aWYodm9pZCAwIT09dHlwZW9mIHImJnRoaXNbZV0hPT1yKXJldHVybiB0aGlzW2VdPXIsITB9LF9tb3ZlTGVmdDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9tb3ZlKHQsZSwiTGVmdCIpfSxfbW92ZVJpZ2h0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX21vdmUodCxlLCJSaWdodCIpfSxtb3ZlQ3Vyc29yTGVmdFdpdGhvdXRTaGlmdDpmdW5jdGlvbih0KXt2YXIgZT0hMDtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uRGlyZWN0aW9uPSJsZWZ0Iix0aGlzLnNlbGVjdGlvbkVuZD09PXRoaXMuc2VsZWN0aW9uU3RhcnQmJjAhPT10aGlzLnNlbGVjdGlvblN0YXJ0JiYoZT10aGlzLl9tb3ZlTGVmdCh0LCJzZWxlY3Rpb25TdGFydCIpKSx0aGlzLnNlbGVjdGlvbkVuZD10aGlzLnNlbGVjdGlvblN0YXJ0LGV9LG1vdmVDdXJzb3JMZWZ0V2l0aFNoaWZ0OmZ1bmN0aW9uKHQpe3JldHVybiJyaWdodCI9PT10aGlzLl9zZWxlY3Rpb25EaXJlY3Rpb24mJnRoaXMuc2VsZWN0aW9uU3RhcnQhPT10aGlzLnNlbGVjdGlvbkVuZD90aGlzLl9tb3ZlTGVmdCh0LCJzZWxlY3Rpb25FbmQiKTowIT09dGhpcy5zZWxlY3Rpb25TdGFydD8odGhpcy5fc2VsZWN0aW9uRGlyZWN0aW9uPSJsZWZ0Iix0aGlzLl9tb3ZlTGVmdCh0LCJzZWxlY3Rpb25TdGFydCIpKTp2b2lkIDB9LG1vdmVDdXJzb3JSaWdodDpmdW5jdGlvbih0KXt0aGlzLnNlbGVjdGlvblN0YXJ0Pj10aGlzLnRleHQubGVuZ3RoJiZ0aGlzLnNlbGVjdGlvbkVuZD49dGhpcy50ZXh0Lmxlbmd0aHx8dGhpcy5fbW92ZUN1cnNvckxlZnRPclJpZ2h0KCJSaWdodCIsdCl9LF9tb3ZlQ3Vyc29yTGVmdE9yUmlnaHQ6ZnVuY3Rpb24odCxlKXt2YXIgaT0ibW92ZUN1cnNvciIrdCsiV2l0aCI7dGhpcy5fY3VycmVudEN1cnNvck9wYWNpdHk9MSxpKz1lLnNoaWZ0S2V5PyJTaGlmdCI6Im91dFNoaWZ0Iix0aGlzW2ldKGUpJiYodGhpcy5hYm9ydEN1cnNvckFuaW1hdGlvbigpLHRoaXMuaW5pdERlbGF5ZWRDdXJzb3IoKSx0aGlzLl9maXJlU2VsZWN0aW9uQ2hhbmdlZCgpLHRoaXMuX3VwZGF0ZVRleHRhcmVhKCkpfSxtb3ZlQ3Vyc29yUmlnaHRXaXRoU2hpZnQ6ZnVuY3Rpb24odCl7cmV0dXJuImxlZnQiPT09dGhpcy5fc2VsZWN0aW9uRGlyZWN0aW9uJiZ0aGlzLnNlbGVjdGlvblN0YXJ0IT09dGhpcy5zZWxlY3Rpb25FbmQ/dGhpcy5fbW92ZVJpZ2h0KHQsInNlbGVjdGlvblN0YXJ0Iik6dGhpcy5zZWxlY3Rpb25FbmQhPT10aGlzLnRleHQubGVuZ3RoPyh0aGlzLl9zZWxlY3Rpb25EaXJlY3Rpb249InJpZ2h0Iix0aGlzLl9tb3ZlUmlnaHQodCwic2VsZWN0aW9uRW5kIikpOnZvaWQgMH0sbW92ZUN1cnNvclJpZ2h0V2l0aG91dFNoaWZ0OmZ1bmN0aW9uKHQpe3ZhciBlPSEwO3JldHVybiB0aGlzLl9zZWxlY3Rpb25EaXJlY3Rpb249InJpZ2h0Iix0aGlzLnNlbGVjdGlvblN0YXJ0PT09dGhpcy5zZWxlY3Rpb25FbmQ/KGU9dGhpcy5fbW92ZVJpZ2h0KHQsInNlbGVjdGlvblN0YXJ0IiksdGhpcy5zZWxlY3Rpb25FbmQ9dGhpcy5zZWxlY3Rpb25TdGFydCk6dGhpcy5zZWxlY3Rpb25TdGFydD10aGlzLnNlbGVjdGlvbkVuZCxlfSxyZW1vdmVDaGFyczpmdW5jdGlvbih0KXt0aGlzLnNlbGVjdGlvblN0YXJ0PT09dGhpcy5zZWxlY3Rpb25FbmQ/dGhpcy5fcmVtb3ZlQ2hhcnNOZWFyQ3Vyc29yKHQpOnRoaXMuX3JlbW92ZUNoYXJzRnJvbVRvKHRoaXMuc2VsZWN0aW9uU3RhcnQsdGhpcy5zZWxlY3Rpb25FbmQpLHRoaXMuc2V0U2VsZWN0aW9uRW5kKHRoaXMuc2VsZWN0aW9uU3RhcnQpLHRoaXMuX3JlbW92ZUV4dHJhbmVvdXNTdHlsZXMoKSx0aGlzLmNhbnZhcyYmdGhpcy5jYW52YXMucmVuZGVyQWxsKCksdGhpcy5zZXRDb29yZHMoKSx0aGlzLmZpcmUoImNoYW5nZWQiKSx0aGlzLmNhbnZhcyYmdGhpcy5jYW52YXMuZmlyZSgidGV4dDpjaGFuZ2VkIix7dGFyZ2V0OnRoaXN9KX0sX3JlbW92ZUNoYXJzTmVhckN1cnNvcjpmdW5jdGlvbih0KXtpZigwIT09dGhpcy5zZWxlY3Rpb25TdGFydClpZih0Lm1ldGFLZXkpe3ZhciBlPXRoaXMuZmluZExpbmVCb3VuZGFyeUxlZnQodGhpcy5zZWxlY3Rpb25TdGFydCk7dGhpcy5fcmVtb3ZlQ2hhcnNGcm9tVG8oZSx0aGlzLnNlbGVjdGlvblN0YXJ0KSx0aGlzLnNldFNlbGVjdGlvblN0YXJ0KGUpfWVsc2UgaWYodC5hbHRLZXkpe3ZhciBpPXRoaXMuZmluZFdvcmRCb3VuZGFyeUxlZnQodGhpcy5zZWxlY3Rpb25TdGFydCk7dGhpcy5fcmVtb3ZlQ2hhcnNGcm9tVG8oaSx0aGlzLnNlbGVjdGlvblN0YXJ0KSx0aGlzLnNldFNlbGVjdGlvblN0YXJ0KGkpfWVsc2UgdGhpcy5fcmVtb3ZlU2luZ2xlQ2hhckFuZFN0eWxlKHRoaXMuc2VsZWN0aW9uU3RhcnQpLHRoaXMuc2V0U2VsZWN0aW9uU3RhcnQodGhpcy5zZWxlY3Rpb25TdGFydC0xKX19KSxmdW5jdGlvbigpe3ZhciB0PWZhYnJpYy51dGlsLnRvRml4ZWQsZT1mYWJyaWMuT2JqZWN0Lk5VTV9GUkFDVElPTl9ESUdJVFM7ZmFicmljLnV0aWwub2JqZWN0LmV4dGVuZChmYWJyaWMuSVRleHQucHJvdG90eXBlLHtfc2V0U1ZHVGV4dExpbmVUZXh0OmZ1bmN0aW9uKHQsZSxpLHIsbixzKXt0aGlzLl9nZXRMaW5lU3R5bGUodCk/dGhpcy5fc2V0U1ZHVGV4dExpbmVDaGFycyh0LGUsaSxyLHMpOmZhYnJpYy5UZXh0LnByb3RvdHlwZS5fc2V0U1ZHVGV4dExpbmVUZXh0LmNhbGwodGhpcyx0LGUsaSxyLG4pfSxfc2V0U1ZHVGV4dExpbmVDaGFyczpmdW5jdGlvbih0LGUsaSxyLG4pe2Zvcih2YXIgcz10aGlzLl90ZXh0TGluZXNbdF0sbz0wLGE9dGhpcy5fZ2V0TGluZUxlZnRPZmZzZXQodGhpcy5fZ2V0TGluZVdpZHRoKHRoaXMuY3R4LHQpKS10aGlzLndpZHRoLzIsaD10aGlzLl9nZXRTVkdMaW5lVG9wT2Zmc2V0KHQpLGM9dGhpcy5fZ2V0SGVpZ2h0T2ZMaW5lKHRoaXMuY3R4LHQpLGw9MCx1PXMubGVuZ3RoO2w8dTtsKyspe3ZhciBmPXRoaXMuX2dldFN0eWxlRGVjbGFyYXRpb24odCxsKXx8e307ZS5wdXNoKHRoaXMuX2NyZWF0ZVRleHRDaGFyU3BhbihzW2xdLGYsYSxoLmxpbmVUb3AraC5vZmZzZXQsbykpO3ZhciBkPXRoaXMuX2dldFdpZHRoT2ZDaGFyKHRoaXMuY3R4LHNbbF0sdCxsKTtmLnRleHRCYWNrZ3JvdW5kQ29sb3ImJm4ucHVzaCh0aGlzLl9jcmVhdGVUZXh0Q2hhckJnKGYsYSxoLmxpbmVUb3AsYyxkLG8pKSxvKz1kfX0sX2dldFNWR0xpbmVUb3BPZmZzZXQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsaT0wLHI9MDtyPHQ7cisrKWUrPXRoaXMuX2dldEhlaWdodE9mTGluZSh0aGlzLmN0eCxyKTtyZXR1cm4gaT10aGlzLl9nZXRIZWlnaHRPZkxpbmUodGhpcy5jdHgscikse2xpbmVUb3A6ZSxvZmZzZXQ6KHRoaXMuX2ZvbnRTaXplTXVsdC10aGlzLl9mb250U2l6ZUZyYWN0aW9uKSppLyh0aGlzLmxpbmVIZWlnaHQqdGhpcy5fZm9udFNpemVNdWx0KX19LF9jcmVhdGVUZXh0Q2hhckJnOmZ1bmN0aW9uKGkscixuLHMsbyxhKXtyZXR1cm5bJ1x0XHQ8cmVjdCBmaWxsPSInLGkudGV4dEJhY2tncm91bmRDb2xvciwnIiB4PSInLHQocithLGUpLCciIHk9IicsdChuLXRoaXMuaGVpZ2h0LzIsZSksJyIgd2lkdGg9IicsdChvLGUpLCciIGhlaWdodD0iJyx0KHMvdGhpcy5saW5lSGVpZ2h0LGUpLCciPjwvcmVjdD5cbiddLmpvaW4oIiIpfSxfY3JlYXRlVGV4dENoYXJTcGFuOmZ1bmN0aW9uKGkscixuLHMsbyl7dmFyIGE9dGhpcy5nZXRTdmdTdHlsZXMuY2FsbChmYWJyaWMudXRpbC5vYmplY3QuZXh0ZW5kKHt2aXNpYmxlOiEwLGZpbGw6dGhpcy5maWxsLHN0cm9rZTp0aGlzLnN0cm9rZSx0eXBlOiJ0ZXh0IixnZXRTdmdGaWx0ZXI6ZmFicmljLk9iamVjdC5wcm90b3R5cGUuZ2V0U3ZnRmlsdGVyfSxyKSk7cmV0dXJuWydcdFx0XHQ8dHNwYW4geD0iJyx0KG4rbyxlKSwnIiB5PSInLHQocy10aGlzLmhlaWdodC8yLGUpLCciICcsci5mb250RmFtaWx5Pydmb250LWZhbWlseT0iJytyLmZvbnRGYW1pbHkucmVwbGFjZSgvIi9nLCInIikrJyIgJzoiIixyLmZvbnRTaXplPydmb250LXNpemU9Iicrci5mb250U2l6ZSsnIiAnOiIiLHIuZm9udFN0eWxlPydmb250LXN0eWxlPSInK3IuZm9udFN0eWxlKyciICc6IiIsci5mb250V2VpZ2h0Pydmb250LXdlaWdodD0iJytyLmZvbnRXZWlnaHQrJyIgJzoiIixyLnRleHREZWNvcmF0aW9uPyd0ZXh0LWRlY29yYXRpb249Iicrci50ZXh0RGVjb3JhdGlvbisnIiAnOiIiLCdzdHlsZT0iJyxhLCciPicsZmFicmljLnV0aWwuc3RyaW5nLmVzY2FwZVhtbChpKSwiPC90c3Bhbj5cbiJdLmpvaW4oIiIpfX0pfSgpLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10LmZhYnJpY3x8KHQuZmFicmljPXt9KSxpPWUudXRpbC5vYmplY3QuY2xvbmU7ZS5UZXh0Ym94PWUudXRpbC5jcmVhdGVDbGFzcyhlLklUZXh0LGUuT2JzZXJ2YWJsZSx7dHlwZToidGV4dGJveCIsbWluV2lkdGg6MjAsZHluYW1pY01pbldpZHRoOjIsX19jYWNoZWRMaW5lczpudWxsLGxvY2tTY2FsaW5nWTohMCxsb2NrU2NhbGluZ0ZsaXA6ITAsaW5pdGlhbGl6ZTpmdW5jdGlvbih0LGkpe3RoaXMuY3R4PWUudXRpbC5jcmVhdGVDYW52YXNFbGVtZW50KCkuZ2V0Q29udGV4dCgiMmQiKSx0aGlzLmNhbGxTdXBlcigiaW5pdGlhbGl6ZSIsdCxpKSx0aGlzLnNldENvbnRyb2xzVmlzaWJpbGl0eShlLlRleHRib3guZ2V0VGV4dGJveENvbnRyb2xWaXNpYmlsaXR5KCkpLHRoaXMuX2RpbWVuc2lvbkFmZmVjdGluZ1Byb3BzLndpZHRoPSEwfSxfaW5pdERpbWVuc2lvbnM6ZnVuY3Rpb24odCl7dGhpcy5fX3NraXBEaW1lbnNpb258fCh0fHwodD1lLnV0aWwuY3JlYXRlQ2FudmFzRWxlbWVudCgpLmdldENvbnRleHQoIjJkIiksdGhpcy5fc2V0VGV4dFN0eWxlcyh0KSksdGhpcy5keW5hbWljTWluV2lkdGg9MCx0aGlzLl90ZXh0TGluZXM9dGhpcy5fc3BsaXRUZXh0SW50b0xpbmVzKCksdGhpcy5keW5hbWljTWluV2lkdGg+dGhpcy53aWR0aCYmdGhpcy5fc2V0KCJ3aWR0aCIsdGhpcy5keW5hbWljTWluV2lkdGgpLHRoaXMuX2NsZWFyQ2FjaGUoKSx0aGlzLmhlaWdodD10aGlzLl9nZXRUZXh0SGVpZ2h0KHQpKX0sX2dlbmVyYXRlU3R5bGVNYXA6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTAsaT0wLHI9e30sbj0wO248dGhpcy5fdGV4dExpbmVzLmxlbmd0aDtuKyspIlxuIj09PXRoaXMudGV4dFtpXSYmbj4wPyhlPTAsaSsrLHQrKyk6IiAiPT09dGhpcy50ZXh0W2ldJiZuPjAmJihlKyssaSsrKSxyW25dPXtsaW5lOnQsb2Zmc2V0OmV9LGkrPXRoaXMuX3RleHRMaW5lc1tuXS5sZW5ndGgsZSs9dGhpcy5fdGV4dExpbmVzW25dLmxlbmd0aDtyZXR1cm4gcn0sX2dldFN0eWxlRGVjbGFyYXRpb246ZnVuY3Rpb24odCxlLGkpe2lmKHRoaXMuX3N0eWxlTWFwKXt2YXIgcj10aGlzLl9zdHlsZU1hcFt0XTtpZighcilyZXR1cm4gaT97fTpudWxsO3Q9ci5saW5lLGU9ci5vZmZzZXQrZX1yZXR1cm4gdGhpcy5jYWxsU3VwZXIoIl9nZXRTdHlsZURlY2xhcmF0aW9uIix0LGUsaSl9LF9zZXRTdHlsZURlY2xhcmF0aW9uOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLl9zdHlsZU1hcFt0XTt0PXIubGluZSxlPXIub2Zmc2V0K2UsdGhpcy5zdHlsZXNbdF1bZV09aX0sX2RlbGV0ZVN0eWxlRGVjbGFyYXRpb246ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9zdHlsZU1hcFt0XTt0PWkubGluZSxlPWkub2Zmc2V0K2UsZGVsZXRlIHRoaXMuc3R5bGVzW3RdW2VdfSxfZ2V0TGluZVN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3N0eWxlTWFwW3RdO3JldHVybiB0aGlzLnN0eWxlc1tlLmxpbmVdfSxfc2V0TGluZVN0eWxlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fc3R5bGVNYXBbdF07dGhpcy5zdHlsZXNbaS5saW5lXT1lfSxfZGVsZXRlTGluZVN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3N0eWxlTWFwW3RdO2RlbGV0ZSB0aGlzLnN0eWxlc1tlLmxpbmVdfSxfd3JhcFRleHQ6ZnVuY3Rpb24odCxlKXt2YXIgaSxyPWUuc3BsaXQodGhpcy5fcmVOZXdsaW5lKSxuPVtdO2ZvcihpPTA7aTxyLmxlbmd0aDtpKyspbj1uLmNvbmNhdCh0aGlzLl93cmFwTGluZSh0LHJbaV0saSkpO3JldHVybiBufSxfbWVhc3VyZVRleHQ6ZnVuY3Rpb24odCxlLGkscil7dmFyIG49MDtyPXJ8fDA7Zm9yKHZhciBzPTAsbz1lLmxlbmd0aDtzPG87cysrKW4rPXRoaXMuX2dldFdpZHRoT2ZDaGFyKHQsZVtzXSxpLHMrcik7cmV0dXJuIG59LF93cmFwTGluZTpmdW5jdGlvbih0LGUsaSl7Zm9yKHZhciByPTAsbj1bXSxzPSIiLG89ZS5zcGxpdCgiICIpLGE9IiIsaD0wLGM9IiAiLGw9MCx1PTAsZj0wLGQ9ITAsZz10aGlzLl9nZXRXaWR0aE9mQ2hhclNwYWNpbmcoKSxwPTA7cDxvLmxlbmd0aDtwKyspYT1vW3BdLGw9dGhpcy5fbWVhc3VyZVRleHQodCxhLGksaCksaCs9YS5sZW5ndGgscis9dStsLWcscj49dGhpcy53aWR0aCYmIWQ/KG4ucHVzaChzKSxzPSIiLHI9bCxkPSEwKTpyKz1nLGR8fChzKz1jKSxzKz1hLHU9dGhpcy5fbWVhc3VyZVRleHQodCxjLGksaCksaCsrLGQ9ITEsbD5mJiYoZj1sKTtyZXR1cm4gcCYmbi5wdXNoKHMpLGY+dGhpcy5keW5hbWljTWluV2lkdGgmJih0aGlzLmR5bmFtaWNNaW5XaWR0aD1mLWcpLG59LF9zcGxpdFRleHRJbnRvTGluZXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnRleHRBbGlnbjt0aGlzLmN0eC5zYXZlKCksdGhpcy5fc2V0VGV4dFN0eWxlcyh0aGlzLmN0eCksdGhpcy50ZXh0QWxpZ249ImxlZnQiO3ZhciBlPXRoaXMuX3dyYXBUZXh0KHRoaXMuY3R4LHRoaXMudGV4dCk7cmV0dXJuIHRoaXMudGV4dEFsaWduPXQsdGhpcy5jdHgucmVzdG9yZSgpLHRoaXMuX3RleHRMaW5lcz1lLHRoaXMuX3N0eWxlTWFwPXRoaXMuX2dlbmVyYXRlU3R5bGVNYXAoKSxlfSxzZXRPbkdyb3VwOmZ1bmN0aW9uKHQsZSl7InNjYWxlWCI9PT10JiYodGhpcy5zZXQoInNjYWxlWCIsTWF0aC5hYnMoMS9lKSksdGhpcy5zZXQoIndpZHRoIix0aGlzLmdldCgid2lkdGgiKSplLygidW5kZWZpbmVkIj09dHlwZW9mIHRoaXMuX19vbGRTY2FsZVg/MTp0aGlzLl9fb2xkU2NhbGVYKSksdGhpcy5fX29sZFNjYWxlWD1lKX0sZ2V0MkRDdXJzb3JMb2NhdGlvbjpmdW5jdGlvbih0KXsidW5kZWZpbmVkIj09dHlwZW9mIHQmJih0PXRoaXMuc2VsZWN0aW9uU3RhcnQpO2Zvcih2YXIgZT10aGlzLl90ZXh0TGluZXMubGVuZ3RoLGk9MCxyPTA7cjxlO3IrKyl7dmFyIG49dGhpcy5fdGV4dExpbmVzW3JdLHM9bi5sZW5ndGg7aWYodDw9aStzKXJldHVybntsaW5lSW5kZXg6cixjaGFySW5kZXg6dC1pfTtpKz1zLCJcbiIhPT10aGlzLnRleHRbaV0mJiIgIiE9PXRoaXMudGV4dFtpXXx8aSsrfXJldHVybntsaW5lSW5kZXg6ZS0xLGNoYXJJbmRleDp0aGlzLl90ZXh0TGluZXNbZS0xXS5sZW5ndGh9fSxfZ2V0Q3Vyc29yQm91bmRhcmllc09mZnNldHM6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9MCxyPTAsbj10aGlzLmdldDJEQ3Vyc29yTG9jYXRpb24oKSxzPXRoaXMuX3RleHRMaW5lc1tuLmxpbmVJbmRleF0uc3BsaXQoIiIpLG89dGhpcy5fZ2V0TGluZUxlZnRPZmZzZXQodGhpcy5fZ2V0TGluZVdpZHRoKHRoaXMuY3R4LG4ubGluZUluZGV4KSksYT0wO2E8bi5jaGFySW5kZXg7YSsrKXIrPXRoaXMuX2dldFdpZHRoT2ZDaGFyKHRoaXMuY3R4LHNbYV0sbi5saW5lSW5kZXgsYSk7Zm9yKGE9MDthPG4ubGluZUluZGV4O2ErKylpKz10aGlzLl9nZXRIZWlnaHRPZkxpbmUodGhpcy5jdHgsYSk7cmV0dXJuImN1cnNvciI9PT1lJiYoaSs9KDEtdGhpcy5fZm9udFNpemVGcmFjdGlvbikqdGhpcy5fZ2V0SGVpZ2h0T2ZMaW5lKHRoaXMuY3R4LG4ubGluZUluZGV4KS90aGlzLmxpbmVIZWlnaHQtdGhpcy5nZXRDdXJyZW50Q2hhckZvbnRTaXplKG4ubGluZUluZGV4LG4uY2hhckluZGV4KSooMS10aGlzLl9mb250U2l6ZUZyYWN0aW9uKSkse3RvcDppLGxlZnQ6cixsaW5lTGVmdDpvfX0sZ2V0TWluV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5tYXgodGhpcy5taW5XaWR0aCx0aGlzLmR5bmFtaWNNaW5XaWR0aCl9LHRvT2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBlLnV0aWwub2JqZWN0LmV4dGVuZCh0aGlzLmNhbGxTdXBlcigidG9PYmplY3QiLHQpLHttaW5XaWR0aDp0aGlzLm1pbldpZHRofSl9fSksZS5UZXh0Ym94LmZyb21PYmplY3Q9ZnVuY3Rpb24odCxyKXt2YXIgbj1uZXcgZS5UZXh0Ym94KHQudGV4dCxpKHQpKTtyZXR1cm4gciYmcihuKSxufSxlLlRleHRib3guZ2V0VGV4dGJveENvbnRyb2xWaXNpYmlsaXR5PWZ1bmN0aW9uKCl7cmV0dXJue3RsOiExLHRyOiExLGJyOiExLGJsOiExLG1sOiEwLG10OiExLG1yOiEwLG1iOiExLG10cjohMH19fSgidW5kZWZpbmVkIiE9dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0aGlzKSxmdW5jdGlvbigpe3ZhciB0PWZhYnJpYy5DYW52YXMucHJvdG90eXBlLl9zZXRPYmplY3RTY2FsZTtmYWJyaWMuQ2FudmFzLnByb3RvdHlwZS5fc2V0T2JqZWN0U2NhbGU9ZnVuY3Rpb24oZSxpLHIsbixzLG8sYSl7dmFyIGg9aS50YXJnZXQ7aWYoIShoIGluc3RhbmNlb2YgZmFicmljLlRleHRib3gpKXJldHVybiB0LmNhbGwoZmFicmljLkNhbnZhcy5wcm90b3R5cGUsZSxpLHIsbixzLG8sYSk7dmFyIGM9aC53aWR0aCooZS54L2kuc2NhbGVYLyhoLndpZHRoK2guc3Ryb2tlV2lkdGgpKTtyZXR1cm4gYz49aC5nZXRNaW5XaWR0aCgpPyhoLnNldCgid2lkdGgiLGMpLCEwKTp2b2lkIDB9LGZhYnJpYy5Hcm91cC5wcm90b3R5cGUuX3JlZnJlc2hDb250cm9sc1Zpc2liaWxpdHk9ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGZhYnJpYy5UZXh0Ym94KWZvcih2YXIgdD10aGlzLl9vYmplY3RzLmxlbmd0aDt0LS07KWlmKHRoaXMuX29iamVjdHNbdF1pbnN0YW5jZW9mIGZhYnJpYy5UZXh0Ym94KXJldHVybiB2b2lkIHRoaXMuc2V0Q29udHJvbHNWaXNpYmlsaXR5KGZhYnJpYy5UZXh0Ym94LmdldFRleHRib3hDb250cm9sVmlzaWJpbGl0eSgpKX07dmFyIGU9ZmFicmljLnV0aWwub2JqZWN0LmNsb25lO2ZhYnJpYy51dGlsLm9iamVjdC5leHRlbmQoZmFicmljLlRleHRib3gucHJvdG90eXBlLHtfcmVtb3ZlRXh0cmFuZW91c1N0eWxlczpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl9zdHlsZU1hcCl0aGlzLl90ZXh0TGluZXNbdF18fGRlbGV0ZSB0aGlzLnN0eWxlc1t0aGlzLl9zdHlsZU1hcFt0XS5saW5lXX0saW5zZXJ0Q2hhclN0eWxlT2JqZWN0OmZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLl9zdHlsZU1hcFt0XTt0PXIubGluZSxlPXIub2Zmc2V0K2UsZmFicmljLklUZXh0LnByb3RvdHlwZS5pbnNlcnRDaGFyU3R5bGVPYmplY3QuYXBwbHkodGhpcyxbdCxlLGldKX0saW5zZXJ0TmV3bGluZVN0eWxlT2JqZWN0OmZ1bmN0aW9uKHQsZSxpKXt2YXIgcj10aGlzLl9zdHlsZU1hcFt0XTt0PXIubGluZSxlPXIub2Zmc2V0K2UsZmFicmljLklUZXh0LnByb3RvdHlwZS5pbnNlcnROZXdsaW5lU3R5bGVPYmplY3QuYXBwbHkodGhpcyxbdCxlLGldKX0sc2hpZnRMaW5lU3R5bGVzOmZ1bmN0aW9uKHQsaSl7dmFyIHI9ZSh0aGlzLnN0eWxlcyksbj10aGlzLl9zdHlsZU1hcFt0XTt0PW4ubGluZTtmb3IodmFyIHMgaW4gdGhpcy5zdHlsZXMpe3ZhciBvPXBhcnNlSW50KHMsMTApO28+dCYmKHRoaXMuc3R5bGVzW28raV09cltvXSxyW28taV18fGRlbGV0ZSB0aGlzLnN0eWxlc1tvXSl9fSxfZ2V0VGV4dE9uUHJldmlvdXNMaW5lOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl90ZXh0TGluZXNbdC0xXTt0aGlzLl9zdHlsZU1hcFt0LTJdJiZ0aGlzLl9zdHlsZU1hcFt0LTJdLmxpbmU9PT10aGlzLl9zdHlsZU1hcFt0LTFdLmxpbmU7KWU9dGhpcy5fdGV4dExpbmVzW3QtMl0rZSx0LS07cmV0dXJuIGV9LHJlbW92ZVN0eWxlT2JqZWN0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5nZXQyREN1cnNvckxvY2F0aW9uKGUpLHI9dGhpcy5fc3R5bGVNYXBbaS5saW5lSW5kZXhdLG49ci5saW5lLHM9ci5vZmZzZXQraS5jaGFySW5kZXg7dGhpcy5fcmVtb3ZlU3R5bGVPYmplY3QodCxpLG4scyl9fSl9KCksZnVuY3Rpb24oKXt2YXIgdD1mYWJyaWMuSVRleHQucHJvdG90eXBlLl9nZXROZXdTZWxlY3Rpb25TdGFydEZyb21PZmZzZXQ7ZmFicmljLklUZXh0LnByb3RvdHlwZS5fZ2V0TmV3U2VsZWN0aW9uU3RhcnRGcm9tT2Zmc2V0PWZ1bmN0aW9uKGUsaSxyLG4scyl7bj10LmNhbGwodGhpcyxlLGkscixuLHMpO2Zvcih2YXIgbz0wLGE9MCxoPTA7aDx0aGlzLl90ZXh0TGluZXMubGVuZ3RoJiYobys9dGhpcy5fdGV4dExpbmVzW2hdLmxlbmd0aCwhKG8rYT49bikpO2grKykiXG4iIT09dGhpcy50ZXh0W28rYV0mJiIgIiE9PXRoaXMudGV4dFtvK2FdfHxhKys7cmV0dXJuIG4taCthfX0oKSxmdW5jdGlvbigpe2Z1bmN0aW9uIHJlcXVlc3QodCxlLGkpe3ZhciByPVVSTC5wYXJzZSh0KTtyLnBvcnR8fChyLnBvcnQ9MD09PXIucHJvdG9jb2wuaW5kZXhPZigiaHR0cHM6Iik/NDQzOjgwKTt2YXIgbj0wPT09ci5wcm90b2NvbC5pbmRleE9mKCJodHRwczoiKT9IVFRQUzpIVFRQLHM9bi5yZXF1ZXN0KHtob3N0bmFtZTpyLmhvc3RuYW1lLHBvcnQ6ci5wb3J0LHBhdGg6ci5wYXRoLG1ldGhvZDoiR0VUIn0sZnVuY3Rpb24odCl7dmFyIHI9IiI7ZSYmdC5zZXRFbmNvZGluZyhlKSx0Lm9uKCJlbmQiLGZ1bmN0aW9uKCl7aShyKX0pLHQub24oImRhdGEiLGZ1bmN0aW9uKGUpezIwMD09PXQuc3RhdHVzQ29kZSYmKHIrPWUpfSl9KTtzLm9uKCJlcnJvciIsZnVuY3Rpb24odCl7dC5lcnJubz09PXByb2Nlc3MuRUNPTk5SRUZVU0VEP2ZhYnJpYy5sb2coIkVDT05OUkVGVVNFRDogY29ubmVjdGlvbiByZWZ1c2VkIHRvICIrci5ob3N0bmFtZSsiOiIrci5wb3J0KTpmYWJyaWMubG9nKHQubWVzc2FnZSksaShudWxsKX0pLHMuZW5kKCl9ZnVuY3Rpb24gcmVxdWVzdEZzKHQsZSl7dmFyIGk9cmVxdWlyZSgiZnMiKTtpLnJlYWRGaWxlKHQsZnVuY3Rpb24odCxpKXtpZih0KXRocm93IGZhYnJpYy5sb2codCksdDtlKGkpfSl9aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBkb2N1bWVudHx8InVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3cpe3ZhciBET01QYXJzZXI9cmVxdWlyZSgieG1sZG9tIikuRE9NUGFyc2VyLFVSTD1yZXF1aXJlKCJ1cmwiKSxIVFRQPXJlcXVpcmUoImh0dHAiKSxIVFRQUz1yZXF1aXJlKCJodHRwcyIpLENhbnZhcz1yZXF1aXJlKCJjYW52YXMiKSxJbWFnZT1yZXF1aXJlKCJjYW52YXMiKS5JbWFnZTtmYWJyaWMudXRpbC5sb2FkSW1hZ2U9ZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIHIocil7cj8obi5zcmM9bmV3IEJ1ZmZlcihyLCJiaW5hcnkiKSxuLl9zcmM9dCxlJiZlLmNhbGwoaSxuKSk6KG49bnVsbCxlJiZlLmNhbGwoaSxudWxsLCEwKSl9dmFyIG49bmV3IEltYWdlO3QmJih0IGluc3RhbmNlb2YgQnVmZmVyfHwwPT09dC5pbmRleE9mKCJkYXRhIikpPyhuLnNyYz1uLl9zcmM9dCxlJiZlLmNhbGwoaSxuKSk6dCYmMCE9PXQuaW5kZXhPZigiaHR0cCIpP3JlcXVlc3RGcyh0LHIpOnQ/cmVxdWVzdCh0LCJiaW5hcnkiLHIpOmUmJmUuY2FsbChpLHQpfSxmYWJyaWMubG9hZFNWR0Zyb21VUkw9ZnVuY3Rpb24odCxlLGkpe3Q9dC5yZXBsYWNlKC9eXG5ccyovLCIiKS5yZXBsYWNlKC9cPy4qJC8sIiIpLnRyaW0oKSwwIT09dC5pbmRleE9mKCJodHRwIik/cmVxdWVzdEZzKHQsZnVuY3Rpb24odCl7ZmFicmljLmxvYWRTVkdGcm9tU3RyaW5nKHQudG9TdHJpbmcoKSxlLGkpfSk6cmVxdWVzdCh0LCIiLGZ1bmN0aW9uKHQpe2ZhYnJpYy5sb2FkU1ZHRnJvbVN0cmluZyh0LGUsaSl9KX0sZmFicmljLmxvYWRTVkdGcm9tU3RyaW5nPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj0obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQpO2ZhYnJpYy5wYXJzZVNWR0RvY3VtZW50KHIuZG9jdW1lbnRFbGVtZW50LGZ1bmN0aW9uKHQsaSl7ZSYmZSh0LGkpfSxpKX0sZmFicmljLnV0aWwuZ2V0U2NyaXB0PWZ1bmN0aW9uKHVybCxjYWxsYmFjayl7cmVxdWVzdCh1cmwsIiIsZnVuY3Rpb24oYm9keSl7ZXZhbChib2R5KSxjYWxsYmFjayYmY2FsbGJhY2soKX0pfSxmYWJyaWMuY3JlYXRlQ2FudmFzRm9yTm9kZT1mdW5jdGlvbih0LGUsaSxyKXtyPXJ8fGk7dmFyIG49ZmFicmljLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLHM9bmV3IENhbnZhcyh0fHw2MDAsZXx8NjAwLHIpLG89bmV3IENhbnZhcyh0fHw2MDAsZXx8NjAwLHIpO24uc3R5bGU9e30sbi53aWR0aD1zLndpZHRoLG4uaGVpZ2h0PXMuaGVpZ2h0LGk9aXx8e30saS5ub2RlQ2FudmFzPXMsaS5ub2RlQ2FjaGVDYW52YXM9bzt2YXIgYT1mYWJyaWMuQ2FudmFzfHxmYWJyaWMuU3RhdGljQ2FudmFzLGg9bmV3IGEobixpKTtyZXR1cm4gaC5ub2RlQ2FudmFzPXMsaC5ub2RlQ2FjaGVDYW52YXM9byxoLmNvbnRleHRDb250YWluZXI9cy5nZXRDb250ZXh0KCIyZCIpLGguY29udGV4dENhY2hlPW8uZ2V0Q29udGV4dCgiMmQiKSxoLkZvbnQ9Q2FudmFzLkZvbnQsaH07dmFyIG9yaWdpbmFJbml0U3RhdGljPWZhYnJpYy5TdGF0aWNDYW52YXMucHJvdG90eXBlLl9pbml0U3RhdGljO2ZhYnJpYy5TdGF0aWNDYW52YXMucHJvdG90eXBlLl9pbml0U3RhdGljPWZ1bmN0aW9uKHQsZSl7dD10fHxmYWJyaWMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksdGhpcy5ub2RlQ2FudmFzPW5ldyBDYW52YXModC53aWR0aCx0LmhlaWdodCksdGhpcy5ub2RlQ2FjaGVDYW52YXM9bmV3IENhbnZhcyh0LndpZHRoLHQuaGVpZ2h0KSxvcmlnaW5hSW5pdFN0YXRpYy5jYWxsKHRoaXMsdCxlKSx0aGlzLmNvbnRleHRDb250YWluZXI9dGhpcy5ub2RlQ2FudmFzLmdldENvbnRleHQoIjJkIiksdGhpcy5jb250ZXh0Q2FjaGU9dGhpcy5ub2RlQ2FjaGVDYW52YXMuZ2V0Q29udGV4dCgiMmQiKSx0aGlzLkZvbnQ9Q2FudmFzLkZvbnR9LGZhYnJpYy5TdGF0aWNDYW52YXMucHJvdG90eXBlLmNyZWF0ZVBOR1N0cmVhbT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGVDYW52YXMuY3JlYXRlUE5HU3RyZWFtKCl9LGZhYnJpYy5TdGF0aWNDYW52YXMucHJvdG90eXBlLmNyZWF0ZUpQRUdTdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubm9kZUNhbnZhcy5jcmVhdGVKUEVHU3RyZWFtKHQpfSxmYWJyaWMuU3RhdGljQ2FudmFzLnByb3RvdHlwZS5faW5pdFJldGluYVNjYWxpbmc9ZnVuY3Rpb24oKXtpZih0aGlzLl9pc1JldGluYVNjYWxpbmcoKSlyZXR1cm4gdGhpcy5sb3dlckNhbnZhc0VsLnNldEF0dHJpYnV0ZSgid2lkdGgiLHRoaXMud2lkdGgqZmFicmljLmRldmljZVBpeGVsUmF0aW8pLHRoaXMubG93ZXJDYW52YXNFbC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsdGhpcy5oZWlnaHQqZmFicmljLmRldmljZVBpeGVsUmF0aW8pLHRoaXMubm9kZUNhbnZhcy53aWR0aD10aGlzLndpZHRoKmZhYnJpYy5kZXZpY2VQaXhlbFJhdGlvLHRoaXMubm9kZUNhbnZhcy5oZWlnaHQ9dGhpcy5oZWlnaHQqZmFicmljLmRldmljZVBpeGVsUmF0aW8sdGhpcy5jb250ZXh0Q29udGFpbmVyLnNjYWxlKGZhYnJpYy5kZXZpY2VQaXhlbFJhdGlvLGZhYnJpYy5kZXZpY2VQaXhlbFJhdGlvKSx0aGlzfSxmYWJyaWMuQ2FudmFzJiYoZmFicmljLkNhbnZhcy5wcm90b3R5cGUuX2luaXRSZXRpbmFTY2FsaW5nPWZhYnJpYy5TdGF0aWNDYW52YXMucHJvdG90eXBlLl9pbml0UmV0aW5hU2NhbGluZyk7dmFyIG9yaWdTZXRCYWNrc3RvcmVEaW1lbnNpb249ZmFicmljLlN0YXRpY0NhbnZhcy5wcm90b3R5cGUuX3NldEJhY2tzdG9yZURpbWVuc2lvbjtmYWJyaWMuU3RhdGljQ2FudmFzLnByb3RvdHlwZS5fc2V0QmFja3N0b3JlRGltZW5zaW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG9yaWdTZXRCYWNrc3RvcmVEaW1lbnNpb24uY2FsbCh0aGlzLHQsZSksdGhpcy5ub2RlQ2FudmFzW3RdPWUsdGhpc30sZmFicmljLkNhbnZhcyYmKGZhYnJpYy5DYW52YXMucHJvdG90eXBlLl9zZXRCYWNrc3RvcmVEaW1lbnNpb249ZmFicmljLlN0YXRpY0NhbnZhcy5wcm90b3R5cGUuX3NldEJhY2tzdG9yZURpbWVuc2lvbil9fSgpOw=="></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsNCg0KICBuYW1lOiAnZXhwb3J0X3dpZGdldCcsDQoNCiAgdHlwZTogJ291dHB1dCcsDQoNCiAgLy8gb3VyIGZ1bmN0aW9uIHRvIGV4cG9ydCBhcyBwbmcNCiAgcG5naWZ5OiBmdW5jdGlvbiggc3ZnICl7DQogICAgdmFyIGN2cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOw0KICAgIGN2cy5zZXRBdHRyaWJ1dGUoImlkIiwiY2FudmFzLWV4cG9ydHdpZGdldCIpOw0KICAgIGN2cy53aWR0aCA9IHN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDsNCiAgICBjdnMuaGVpZ2h0ID0gc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDsNCiAgICAvL2N2cy5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY3ZzKTsNCg0KICAgIHZhciBmX2NhbnZhcyA9IG5ldyBmYWJyaWMuQ2FudmFzKCJjYW52YXMtZXhwb3J0d2lkZ2V0Iik7DQogICAgZl9jYW52YXMuYmFja2dyb3VuZENvbG9yID0gIndoaXRlIjsNCg0KICAgIHZhciBkYXRVcmw7DQoNCiAgICB0cnkgew0KICAgICAgZmFicmljLmxvYWRTVkdGcm9tU3RyaW5nKA0KICAgICAgICBzdmcub3V0ZXJIVE1MLA0KICAgICAgICBmdW5jdGlvbihvYmplY3RzLCBvcHRpb25zKSB7DQogICAgICAgICAgdmFyIG9iaiA9IGZhYnJpYy51dGlsLmdyb3VwU1ZHRWxlbWVudHMob2JqZWN0cywgb3B0aW9ucyk7DQogICAgICAgICAgZl9jYW52YXMuYWRkKG9iaikucmVuZGVyQWxsKCk7DQogICAgICAgICAgZGF0VXJsID0gZl9jYW52YXMudG9EYXRhVVJMKCk7DQogICAgICAgICAgZG93bmxvYWRGaWxlKCBkYXRVcmwgKTsNCiAgICAgICAgICBmX2NhbnZhcy5kaXNwb3NlKCk7DQogICAgICAgICAgY3ZzLnJlbW92ZSgpOw0KICAgICAgICB9DQogICAgICApDQogICAgfSBjYXRjaChlKSB7DQogICAgICBjb25zb2xlLmxvZyhbImZhaWxlZCB3aXRoIGVycm9yIiwgZV0uam9pbigiICIpKTsNCiAgICB9Ow0KDQogIH0sDQoNCiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsNCg0KICAgIC8vIGFkZCBvdXIgZnVuY3Rpb24gdG8gSFRNTFdpZGdldHMNCiAgICBpZih0eXBlb2Ygd2luZG93LkhUTUxXaWRnZXRzLnBuZ2lmeSA9PT0gInVuZGVmaW5lZCIpICB3aW5kb3cuSFRNTFdpZGdldHMucG5naWZ5ID0gdGhpcy5wbmdpZnk7DQoNCiAgICByZXR1cm4geyB9Ow0KDQogIH0sDQoNCiAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSkgew0KDQogICAgdmFyIGVsU2VsZWN0Ow0KDQogICAgLy8gaWYgYSBzdHJpbmcgYXNzdW1lIGl0IGlzIGEgc2VsZWN0b3INCiAgICBpZiggdHlwZW9mIHguc2VsZWN0b3IgPT09ICJzdHJpbmciICl7DQogICAgICBlbFNlbGVjdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIHguc2VsZWN0b3IgKQ0KICAgIH0NCg0KICAgIC8vIGlmIG5vdGhpbmcgZ2V0IGFsbCBodG1sd2lkZ2V0cw0KICAgIGlmKCB0eXBlb2YgeC5zZWxlY3RvciA9PT0gInVuZGVmaW5lZCIgfHwgeC5zZWxlY3RvciA9PT0gbnVsbCApew0KICAgICAgLy8gZmlsdGVyIG91dCBleHBvcnRfd2lkZ2V0IGh0bWx3aWRnZXRzDQogICAgICBlbFNlbGVjdCA9IFtdLmZpbHRlci5jYWxsKA0KICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuaHRtbC13aWRnZXQtc3RhdGljLWJvdW5kIiksDQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGUpew0KICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXS5pbmRleE9mLmNhbGwoZS5jbGFzc0xpc3QsImV4cG9ydF93aWRnZXQiKSA8IDANCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgKQ0KICAgIH0NCg0KICAgIFtdLmZvckVhY2guY2FsbCggZWxTZWxlY3QsIGZ1bmN0aW9uKGUpew0KICAgICAgICB2YXIgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIikNCiAgICAgICAgYnRuLnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIg0KICAgICAgICBidG4uc3R5bGUuYm90dG9tID0gIjk1JSINCiAgICAgICAgYnRuLnN0eWxlLmxlZnQgPSAiOTUlIg0KICAgICAgICBidG4uc3R5bGUud2lkdGggPSAiMzBweCI7DQogICAgICAgIGJ0bi5zdHlsZS5oZWlnaHQgPSAiMzBweCI7DQogICAgICAgIC8vIGRvd25sb2FkIGljb24gY291cnRlc3kgRm9udCBBd2Vzb21lIChNSVQgTGljZW5zZSkNCiAgICAgICAgYnRuLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IFsidXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHN2ZyB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xMzQ0IDEzNDRxMC0yNi0xOS00NXQtNDUtMTktNDUgMTktMTkgNDUgMTkgNDUgNDUgMTkgNDUtMTkgMTktNDV6bTI1NiAwcTAtMjYtMTktNDV0LTQ1LTE5LTQ1IDE5LTE5IDQ1IDE5IDQ1IDQ1IDE5IDQ1LTE5IDE5LTQ1em0xMjgtMjI0djMyMHEwIDQwLTI4IDY4dC02OCAyOGgtMTQ3MnEtNDAgMC02OC0yOHQtMjgtNjh2LTMyMHEwLTQwIDI4LTY4dDY4LTI4aDQ2NWwxMzUgMTM2cTU4IDU2IDEzNiA1NnQxMzYtNTZsMTM2LTEzNmg0NjRxNDAgMCA2OCAyOHQyOCA2OHptLTMyNS01NjlxMTcgNDEtMTQgNzBsLTQ0OCA0NDhxLTE4IDE5LTQ1IDE5dC00NS0xOWwtNDQ4LTQ0OHEtMzEtMjktMTQtNzAgMTctMzkgNTktMzloMjU2di00NDhxMC0yNiAxOS00NXQ0NS0xOWgyNTZxMjYgMCA0NSAxOXQxOSA0NXY0NDhoMjU2cTQyIDAgNTkgMzl6Ii8+PC9zdmc+JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicpIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbigiIikNCiAgICAgICAgYnRuLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICBIVE1MV2lkZ2V0cy5wbmdpZnkoDQogICAgICAgICAgICBlLnRhZ05hbWUgPT09ICJzdmciID8gZSA6IGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInN2ZyIpWzBdDQogICAgICAgICAgKQ0KICAgICAgICB9DQogICAgICAgIC8vIGhhbmRsZSBwbGFjZW1lbnQNCiAgICAgICAgaWYgKCBlLnRhZ05hbWUgPT09ICJzdmciICkgew0KICAgICAgICAgIGUucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCggYnRuICkNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBlLmFwcGVuZENoaWxkKCBidG4gKQ0KICAgICAgICB9DQogICAgfSkNCg0KICB9LA0KDQogIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGluc3RhbmNlKSB7DQoNCiAgfQ0KDQp9KTsNCg=="></script>
</head>
<body style="background-color:white;">
<div id="htmlwidget-2a834357c3094391994e" class="sankeyNetwork html-widget" style="width:960px;height:500px;">
</div>
<script type="application/json" data-for="htmlwidget-2a834357c3094391994e">{"x":{"links":{"source":[0,1,1,1,1,6,7,8,10,9,11,11,11,15,15,15,15,15,15,15,15,15,15,15,23,25,5,5,5,5,5,27,17,17,28,29,2,2,2,2,2,2,2,2,34,24,35,36,38,37,39,39,40,40,41,42,43,43,4,4,4,26,26,26,44,45,46,47],"target":[1,2,3,4,5,2,4,9,9,4,12,13,14,16,14,17,12,18,19,13,3,20,21,22,24,24,13,3,26,19,12,15,28,3,18,15,12,30,18,31,32,19,33,20,1,5,26,37,37,2,4,1,14,13,15,14,42,41,19,26,12,15,3,11,15,1,15,15],"value":[124.729,0.597,26.862,280.322,81.144,35,35,11.606,63.965,75.571,10.639,22.505,46.184,104.453,113.726,27.14,342.165,37.797,4.412,40.858,56.691,7.863,90.008,93.494,40.719,82.233,0.129,1.401,151.891,2.096,48.58,7.013,20.897,6.242,20.897,6.995,121.066,128.69,135.835,14.458,206.267,3.64,33.218,4.413,4.375,122.952,839.978,504.287,107.703,611.99,56.587,77.81,193.026,70.672,59.901,19.263,19.263,59.901,0.882,400.12,46.477,525.531,787.129,79.329,9.452,182.01,19.013,289.366]},"nodes":{"name":["Agricultural 'waste'","Bio-conversion","Liquid","Losses","Solid","Gas","Biofuel imports","Biomass imports","Coal imports","Coal","Coal reserves","District heating","Industry","Heating and cooling - commercial","Heating and cooling - homes","Electricity grid","Over generation / exports","H2 conversion","Road transport","Agriculture","Rail transport","Lighting & appliances - commercial","Lighting & appliances - homes","Gas imports","Ngas","Gas reserves","Thermal generation","Geothermal","H2","Hydro","International shipping","Domestic aviation","International aviation","National navigation","Marine algae","Nuclear","Oil imports","Oil","Oil reserves","Other waste","Pumped heat","Solar PV","Solar Thermal","Solar","Tidal","UK land based bioenergy","Wave","Wind"],"group":["Agricultural 'waste'","Bio-conversion","Liquid","Losses","Solid","Gas","Biofuel imports","Biomass imports","Coal imports","Coal","Coal reserves","District heating","Industry","Heating and cooling - commercial","Heating and cooling - homes","Electricity grid","Over generation / exports","H2 conversion","Road transport","Agriculture","Rail transport","Lighting & appliances - commercial","Lighting & appliances - homes","Gas imports","Ngas","Gas reserves","Thermal generation","Geothermal","H2","Hydro","International shipping","Domestic aviation","International aviation","National navigation","Marine algae","Nuclear","Oil imports","Oil","Oil reserves","Other waste","Pumped heat","Solar PV","Solar Thermal","Solar","Tidal","UK land based bioenergy","Wave","Wind"]},"options":{"NodeID":"name","NodeGroup":"name","LinkGroup":null,"colourScale":"d3.scale.category20()","fontSize":12,"fontFamily":null,"nodeWidth":30,"nodePadding":10,"units":"TWh","margin":{"top":null,"right":null,"bottom":null,"left":null},"iterations":32}},"evals":[],"jsHooks":[]}</script>
<div id="htmlwidget-6c7f66575d393ac29c6b" class="export_widget html-widget" style="width:0px;height:0px;">
</div>
<script type="application/json" data-for="htmlwidget-6c7f66575d393ac29c6b">{"x":{"selector":null},"evals":[],"jsHooks":[]}</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment