Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active March 20, 2017 01:37
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/5ab93494dedad6e5a79a07bbb3a78ecd to your computer and use it in GitHub Desktop.
Save timelyportfolio/5ab93494dedad6e5a79a07bbb3a78ecd to your computer and use it in GitHub Desktop.
d3fc for R as htmlwidget
license: mit

Install

devtools::install_github("timelyportfolio/rd3fc")

Example

quantmod is an superpower of R. Let's remember how few lines of code we need to make a static candlestick chart.

library(quantmod)

getSymbols("^GSPC", from = "2016-12-31")
chart_Series(GSPC)

I view this as simply amazing, but the only thing missing is some interactivity. rd3fc plans to eventually complete translate chart_Series to an interactive chart, but for now it will just produce the candlestick.

library(rd3fc)
# will use the current.chob() if no arguments
chartseries()
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBjPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCF1JiZjKXJldHVybiBjKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IGYuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsZn12YXIgYT1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwoYS5leHBvcnRzLGZ1bmN0aW9uKG4pe3ZhciByPXRbb11bMV1bbl07cmV0dXJuIHMocj9yOm4pfSxhLGEuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfWZvcih2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30oezE6W2Z1bmN0aW9uKHQsbixyKXsoZnVuY3Rpb24obil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGRlZmluZSh0LG4sZSl7dFtuXXx8T2JqZWN0W3JdKHQsbix7d3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwLHZhbHVlOmV9KX1pZih0KDI5NSksdCgyOTYpLHQoMiksbi5fYmFiZWxQb2x5ZmlsbCl0aHJvdyBuZXcgRXJyb3IoIm9ubHkgb25lIGluc3RhbmNlIG9mIGJhYmVsLXBvbHlmaWxsIGlzIGFsbG93ZWQiKTtuLl9iYWJlbFBvbHlmaWxsPSEwO3ZhciByPSJkZWZpbmVQcm9wZXJ0eSI7ZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsInBhZExlZnQiLCIiLnBhZFN0YXJ0KSxkZWZpbmUoU3RyaW5nLnByb3RvdHlwZSwicGFkUmlnaHQiLCIiLnBhZEVuZCksInBvcCxyZXZlcnNlLHNoaWZ0LGtleXMsdmFsdWVzLGVudHJpZXMsaW5kZXhPZixldmVyeSxzb21lLGZvckVhY2gsbWFwLGZpbHRlcixmaW5kLGZpbmRJbmRleCxpbmNsdWRlcyxqb2luLHNsaWNlLGNvbmNhdCxwdXNoLHNwbGljZSx1bnNoaWZ0LHNvcnQsbGFzdEluZGV4T2YscmVkdWNlLHJlZHVjZVJpZ2h0LGNvcHlXaXRoaW4sZmlsbCIuc3BsaXQoIiwiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe1tdW3RdJiZkZWZpbmUoQXJyYXksdCxGdW5jdGlvbi5jYWxsLmJpbmQoW11bdF0pKX0pfSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7MjoyLDI5NToyOTUsMjk2OjI5Nn1dLDI6W2Z1bmN0aW9uKHQsbixyKXt0KDExOSksbi5leHBvcnRzPXQoMjMpLlJlZ0V4cC5lc2NhcGV9LHsxMTk6MTE5LDIzOjIzfV0sMzpbZnVuY3Rpb24odCxuLHIpe24uZXhwb3J0cz1mdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIGZ1bmN0aW9uISIpO3JldHVybiB0fX0se31dLDQ6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDE4KTtuLmV4cG9ydHM9ZnVuY3Rpb24odCxuKXtpZigibnVtYmVyIiE9dHlwZW9mIHQmJiJOdW1iZXIiIT1lKHQpKXRocm93IFR5cGVFcnJvcihuKTtyZXR1cm4rdH19LHsxODoxOH1dLDU6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDExNykoInVuc2NvcGFibGVzIiksaT1BcnJheS5wcm90b3R5cGU7dm9pZCAwPT1pW2VdJiZ0KDQwKShpLGUse30pLG4uZXhwb3J0cz1mdW5jdGlvbih0KXtpW2VdW3RdPSEwfX0sezExNzoxMTcsNDA6NDB9XSw2OltmdW5jdGlvbih0LG4scil7bi5leHBvcnRzPWZ1bmN0aW9uKHQsbixyLGUpe2lmKCEodCBpbnN0YW5jZW9mIG4pfHx2b2lkIDAhPT1lJiZlIGluIHQpdGhyb3cgVHlwZUVycm9yKHIrIjogaW5jb3JyZWN0IGludm9jYXRpb24hIik7cmV0dXJuIHR9fSx7fV0sNzpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoNDkpO24uZXhwb3J0cz1mdW5jdGlvbih0KXtpZighZSh0KSl0aHJvdyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhbiBvYmplY3QhIik7cmV0dXJuIHR9fSx7NDk6NDl9XSw4OltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBlPXQoMTA5KSxpPXQoMTA1KSxvPXQoMTA4KTtuLmV4cG9ydHM9W10uY29weVdpdGhpbnx8ZnVuY3Rpb24gY29weVdpdGhpbih0LG4pe3ZhciByPWUodGhpcyksdT1vKHIubGVuZ3RoKSxjPWkodCx1KSxmPWkobix1KSxhPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLHM9TWF0aC5taW4oKHZvaWQgMD09PWE/dTppKGEsdSkpLWYsdS1jKSxsPTE7Zm9yKGY8YyYmYzxmK3MmJihsPS0xLGYrPXMtMSxjKz1zLTEpO3MtLSA+MDspZiBpbiByP3JbY109cltmXTpkZWxldGUgcltjXSxjKz1sLGYrPWw7cmV0dXJuIHJ9fSx7MTA1OjEwNSwxMDg6MTA4LDEwOToxMDl9XSw5OltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBlPXQoMTA5KSxpPXQoMTA1KSxvPXQoMTA4KTtuLmV4cG9ydHM9ZnVuY3Rpb24gZmlsbCh0KXtmb3IodmFyIG49ZSh0aGlzKSxyPW8obi5sZW5ndGgpLHU9YXJndW1lbnRzLmxlbmd0aCxjPWkodT4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsciksZj11PjI/YXJndW1lbnRzWzJdOnZvaWQgMCxhPXZvaWQgMD09PWY/cjppKGYscik7YT5jOyluW2MrK109dDtyZXR1cm4gbn19LHsxMDU6MTA1LDEwODoxMDgsMTA5OjEwOX1dLDEwOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzNyk7bi5leHBvcnRzPWZ1bmN0aW9uKHQsbil7dmFyIHI9W107cmV0dXJuIGUodCwhMSxyLnB1c2gscixuKSxyfX0sezM3OjM3fV0sMTE6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDEwNyksaT10KDEwOCksbz10KDEwNSk7bi5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuLHIsdSl7dmFyIGMsZj1lKG4pLGE9aShmLmxlbmd0aCkscz1vKHUsYSk7aWYodCYmciE9cil7Zm9yKDthPnM7KWlmKGM9ZltzKytdLGMhPWMpcmV0dXJuITB9ZWxzZSBmb3IoO2E+cztzKyspaWYoKHR8fHMgaW4gZikmJmZbc109PT1yKXJldHVybiB0fHxzfHwwO3JldHVybiF0JiYtMX19fSx7MTA1OjEwNSwxMDc6MTA3LDEwODoxMDh9XSwxMjpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMjUpLGk9dCg0NSksbz10KDEwOSksdT10KDEwOCksYz10KDE1KTtuLmV4cG9ydHM9ZnVuY3Rpb24odCxuKXt2YXIgcj0xPT10LGY9Mj09dCxhPTM9PXQscz00PT10LGw9Nj09dCxoPTU9PXR8fGwsdj1ufHxjO3JldHVybiBmdW5jdGlvbihuLGMscCl7Zm9yKHZhciBkLHksZz1vKG4pLGI9aShnKSx4PWUoYyxwLDMpLG09dShiLmxlbmd0aCksdz0wLFM9cj92KG4sbSk6Zj92KG4sMCk6dm9pZCAwO20+dzt3KyspaWYoKGh8fHcgaW4gYikmJihkPWJbd10seT14KGQsdyxnKSx0KSlpZihyKVNbd109eTtlbHNlIGlmKHkpc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIGQ7Y2FzZSA2OnJldHVybiB3O2Nhc2UgMjpTLnB1c2goZCl9ZWxzZSBpZihzKXJldHVybiExO3JldHVybiBsPy0xOmF8fHM/czpTfX19LHsxMDg6MTA4LDEwOToxMDksMTU6MTUsMjU6MjUsNDU6NDV9XSwxMzpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMyksaT10KDEwOSksbz10KDQ1KSx1PXQoMTA4KTtuLmV4cG9ydHM9ZnVuY3Rpb24odCxuLHIsYyxmKXtlKG4pO3ZhciBhPWkodCkscz1vKGEpLGw9dShhLmxlbmd0aCksaD1mP2wtMTowLHY9Zj8tMToxO2lmKHI8Milmb3IoOzspe2lmKGggaW4gcyl7Yz1zW2hdLGgrPXY7YnJlYWt9aWYoaCs9dixmP2g8MDpsPD1oKXRocm93IFR5cGVFcnJvcigiUmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZSIpfWZvcig7Zj9oPj0wOmw+aDtoKz12KWggaW4gcyYmKGM9bihjLHNbaF0saCxhKSk7cmV0dXJuIGN9fSx7MTA4OjEwOCwxMDk6MTA5LDM6Myw0NTo0NX1dLDE0OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg0OSksaT10KDQ3KSxvPXQoMTE3KSgic3BlY2llcyIpO24uZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgbjtyZXR1cm4gaSh0KSYmKG49dC5jb25zdHJ1Y3RvciwiZnVuY3Rpb24iIT10eXBlb2Ygbnx8biE9PUFycmF5JiYhaShuLnByb3RvdHlwZSl8fChuPXZvaWQgMCksZShuKSYmKG49bltvXSxudWxsPT09biYmKG49dm9pZCAwKSkpLHZvaWQgMD09PW4/QXJyYXk6bn19LHsxMTc6MTE3LDQ3OjQ3LDQ5OjQ5fV0sMTU6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDE0KTtuLmV4cG9ydHM9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3KGUodCkpKG4pfX0sezE0OjE0fV0sMTY6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgzKSxpPXQoNDkpLG89dCg0NCksdT1bXS5zbGljZSxjPXt9LGY9ZnVuY3Rpb24odCxuLHIpe2lmKCEobiBpbiBjKSl7Zm9yKHZhciBlPVtdLGk9MDtpPG47aSsrKWVbaV09ImFbIitpKyJdIjtjW25dPUZ1bmN0aW9uKCJGLGEiLCJyZXR1cm4gbmV3IEYoIitlLmpvaW4oIiwiKSsiKSIpfXJldHVybiBjW25dKHQscil9O24uZXhwb3J0cz1GdW5jdGlvbi5iaW5kfHxmdW5jdGlvbiBiaW5kKHQpe3ZhciBuPWUodGhpcykscj11LmNhbGwoYXJndW1lbnRzLDEpLGM9ZnVuY3Rpb24oKXt2YXIgZT1yLmNvbmNhdCh1LmNhbGwoYXJndW1lbnRzKSk7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBjP2YobixlLmxlbmd0aCxlKTpvKG4sZSx0KX07cmV0dXJuIGkobi5wcm90b3R5cGUpJiYoYy5wcm90b3R5cGU9bi5wcm90b3R5cGUpLGN9fSx7MzozLDQ0OjQ0LDQ5OjQ5fV0sMTc6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDE4KSxpPXQoMTE3KSgidG9TdHJpbmdUYWciKSxvPSJBcmd1bWVudHMiPT1lKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSksdT1mdW5jdGlvbih0LG4pe3RyeXtyZXR1cm4gdFtuXX1jYXRjaCh0KXt9fTtuLmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIG4scixjO3JldHVybiB2b2lkIDA9PT10PyJVbmRlZmluZWQiOm51bGw9PT10PyJOdWxsIjoic3RyaW5nIj09dHlwZW9mKHI9dShuPU9iamVjdCh0KSxpKSk/cjpvP2Uobik6Ik9iamVjdCI9PShjPWUobikpJiYiZnVuY3Rpb24iPT10eXBlb2Ygbi5jYWxsZWU/IkFyZ3VtZW50cyI6Y319LHsxMTc6MTE3LDE4OjE4fV0sMTg6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT17fS50b1N0cmluZztuLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGUuY2FsbCh0KS5zbGljZSg4LC0xKX19LHt9XSwxOTpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDY3KS5mLGk9dCg2Niksbz10KDg2KSx1PXQoMjUpLGM9dCg2KSxmPXQoMjcpLGE9dCgzNykscz10KDUzKSxsPXQoNTUpLGg9dCg5MSksdj10KDI4KSxwPXQoNjIpLmZhc3RLZXksZD12PyJfcyI6InNpemUiLHk9ZnVuY3Rpb24odCxuKXt2YXIgcixlPXAobik7aWYoIkYiIT09ZSlyZXR1cm4gdC5faVtlXTtmb3Iocj10Ll9mO3I7cj1yLm4paWYoci5rPT1uKXJldHVybiByfTtuLmV4cG9ydHM9e2dldENvbnN0cnVjdG9yOmZ1bmN0aW9uKHQsbixyLHMpe3ZhciBsPXQoZnVuY3Rpb24odCxlKXtjKHQsbCxuLCJfaSIpLHQuX2k9aShudWxsKSx0Ll9mPXZvaWQgMCx0Ll9sPXZvaWQgMCx0W2RdPTAsdm9pZCAwIT1lJiZhKGUscix0W3NdLHQpfSk7cmV0dXJuIG8obC5wcm90b3R5cGUse2NsZWFyOmZ1bmN0aW9uIGNsZWFyKCl7Zm9yKHZhciB0PXRoaXMsbj10Ll9pLHI9dC5fZjtyO3I9ci5uKXIucj0hMCxyLnAmJihyLnA9ci5wLm49dm9pZCAwKSxkZWxldGUgbltyLmldO3QuX2Y9dC5fbD12b2lkIDAsdFtkXT0wfSxkZWxldGU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcyxyPXkobix0KTtpZihyKXt2YXIgZT1yLm4saT1yLnA7ZGVsZXRlIG4uX2lbci5pXSxyLnI9ITAsaSYmKGkubj1lKSxlJiYoZS5wPWkpLG4uX2Y9PXImJihuLl9mPWUpLG4uX2w9PXImJihuLl9sPWkpLG5bZF0tLX1yZXR1cm4hIXJ9LGZvckVhY2g6ZnVuY3Rpb24gZm9yRWFjaCh0KXtjKHRoaXMsbCwiZm9yRWFjaCIpO2Zvcih2YXIgbixyPXUodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKTtuPW4/bi5uOnRoaXMuX2Y7KWZvcihyKG4udixuLmssdGhpcyk7biYmbi5yOyluPW4ucH0saGFzOmZ1bmN0aW9uIGhhcyh0KXtyZXR1cm4hIXkodGhpcyx0KX19KSx2JiZlKGwucHJvdG90eXBlLCJzaXplIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGYodGhpc1tkXSl9fSksbH0sZGVmOmZ1bmN0aW9uKHQsbixyKXt2YXIgZSxpLG89eSh0LG4pO3JldHVybiBvP28udj1yOih0Ll9sPW89e2k6aT1wKG4sITApLGs6bix2OnIscDplPXQuX2wsbjp2b2lkIDAscjohMX0sdC5fZnx8KHQuX2Y9byksZSYmKGUubj1vKSx0W2RdKyssIkYiIT09aSYmKHQuX2lbaV09bykpLHR9LGdldEVudHJ5Onksc2V0U3Ryb25nOmZ1bmN0aW9uKHQsbixyKXtzKHQsbixmdW5jdGlvbih0LG4pe3RoaXMuX3Q9dCx0aGlzLl9rPW4sdGhpcy5fbD12b2lkIDB9LGZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsbj10Ll9rLHI9dC5fbDtyJiZyLnI7KXI9ci5wO3JldHVybiB0Ll90JiYodC5fbD1yPXI/ci5uOnQuX3QuX2YpPyJrZXlzIj09bj9sKDAsci5rKToidmFsdWVzIj09bj9sKDAsci52KTpsKDAsW3IuayxyLnZdKToodC5fdD12b2lkIDAsbCgxKSl9LHI/ImVudHJpZXMiOiJ2YWx1ZXMiLCFyLCEwKSxoKG4pfX19LHsyNToyNSwyNzoyNywyODoyOCwzNzozNyw1Mzo1Myw1NTo1NSw2OjYsNjI6NjIsNjY6NjYsNjc6NjcsODY6ODYsOTE6OTF9XSwyMDpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMTcpLGk9dCgxMCk7bi5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiB0b0pTT04oKXtpZihlKHRoaXMpIT10KXRocm93IFR5cGVFcnJvcih0KyIjdG9KU09OIGlzbid0IGdlbmVyaWMiKTtyZXR1cm4gaSh0aGlzKX19fSx7MTA6MTAsMTc6MTd9XSwyMTpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDg2KSxpPXQoNjIpLmdldFdlYWssbz10KDcpLHU9dCg0OSksYz10KDYpLGY9dCgzNyksYT10KDEyKSxzPXQoMzkpLGw9YSg1KSxoPWEoNiksdj0wLHA9ZnVuY3Rpb24odCl7cmV0dXJuIHQuX2x8fCh0Ll9sPW5ldyBkKX0sZD1mdW5jdGlvbigpe3RoaXMuYT1bXX0seT1mdW5jdGlvbih0LG4pe3JldHVybiBsKHQuYSxmdW5jdGlvbih0KXtyZXR1cm4gdFswXT09PW59KX07ZC5wcm90b3R5cGU9e2dldDpmdW5jdGlvbih0KXt2YXIgbj15KHRoaXMsdCk7aWYobilyZXR1cm4gblsxXX0saGFzOmZ1bmN0aW9uKHQpe3JldHVybiEheSh0aGlzLHQpfSxzZXQ6ZnVuY3Rpb24odCxuKXt2YXIgcj15KHRoaXMsdCk7cj9yWzFdPW46dGhpcy5hLnB1c2goW3Qsbl0pfSxkZWxldGU6ZnVuY3Rpb24odCl7dmFyIG49aCh0aGlzLmEsZnVuY3Rpb24obil7cmV0dXJuIG5bMF09PT10fSk7cmV0dXJufm4mJnRoaXMuYS5zcGxpY2UobiwxKSwhIX5ufX0sbi5leHBvcnRzPXtnZXRDb25zdHJ1Y3RvcjpmdW5jdGlvbih0LG4scixvKXt2YXIgYT10KGZ1bmN0aW9uKHQsZSl7Yyh0LGEsbiwiX2kiKSx0Ll9pPXYrKyx0Ll9sPXZvaWQgMCx2b2lkIDAhPWUmJmYoZSxyLHRbb10sdCl9KTtyZXR1cm4gZShhLnByb3RvdHlwZSx7ZGVsZXRlOmZ1bmN0aW9uKHQpe2lmKCF1KHQpKXJldHVybiExO3ZhciBuPWkodCk7cmV0dXJuIG49PT0hMD9wKHRoaXMpLmRlbGV0ZSh0KTpuJiZzKG4sdGhpcy5faSkmJmRlbGV0ZSBuW3RoaXMuX2ldfSxoYXM6ZnVuY3Rpb24gaGFzKHQpe2lmKCF1KHQpKXJldHVybiExO3ZhciBuPWkodCk7cmV0dXJuIG49PT0hMD9wKHRoaXMpLmhhcyh0KTpuJiZzKG4sdGhpcy5faSl9fSksYX0sZGVmOmZ1bmN0aW9uKHQsbixyKXt2YXIgZT1pKG8obiksITApO3JldHVybiBlPT09ITA/cCh0KS5zZXQobixyKTplW3QuX2ldPXIsdH0sdWZzdG9yZTpwfX0sezEyOjEyLDM3OjM3LDM5OjM5LDQ5OjQ5LDY6Niw2Mjo2Miw3OjcsODY6ODZ9XSwyMjpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDM4KSxpPXQoMzIpLG89dCg4NyksdT10KDg2KSxjPXQoNjIpLGY9dCgzNyksYT10KDYpLHM9dCg0OSksbD10KDM0KSxoPXQoNTQpLHY9dCg5MikscD10KDQzKTtuLmV4cG9ydHM9ZnVuY3Rpb24odCxuLHIsZCx5LGcpe3ZhciBiPWVbdF0seD1iLG09eT8ic2V0IjoiYWRkIix3PXgmJngucHJvdG90eXBlLFM9e30sXz1mdW5jdGlvbih0KXt2YXIgbj13W3RdO28odyx0LCJkZWxldGUiPT10P2Z1bmN0aW9uKHQpe3JldHVybiEoZyYmIXModCkpJiZuLmNhbGwodGhpcywwPT09dD8wOnQpfToiaGFzIj09dD9mdW5jdGlvbiBoYXModCl7cmV0dXJuIShnJiYhcyh0KSkmJm4uY2FsbCh0aGlzLDA9PT10PzA6dCl9OiJnZXQiPT10P2Z1bmN0aW9uIGdldCh0KXtyZXR1cm4gZyYmIXModCk/dm9pZCAwOm4uY2FsbCh0aGlzLDA9PT10PzA6dCl9OiJhZGQiPT10P2Z1bmN0aW9uIGFkZCh0KXtyZXR1cm4gbi5jYWxsKHRoaXMsMD09PXQ/MDp0KSx0aGlzfTpmdW5jdGlvbiBzZXQodCxyKXtyZXR1cm4gbi5jYWxsKHRoaXMsMD09PXQ/MDp0LHIpLHRoaXN9KX07aWYoImZ1bmN0aW9uIj09dHlwZW9mIHgmJihnfHx3LmZvckVhY2gmJiFsKGZ1bmN0aW9uKCl7KG5ldyB4KS5lbnRyaWVzKCkubmV4dCgpfSkpKXt2YXIgRT1uZXcgeCxPPUVbbV0oZz97fTotMCwxKSE9RSxGPWwoZnVuY3Rpb24oKXtFLmhhcygxKX0pLFA9aChmdW5jdGlvbih0KXtuZXcgeCh0KX0pLE09IWcmJmwoZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IHgsbj01O24tLTspdFttXShuLG4pO3JldHVybiF0LmhhcygtMCl9KTtQfHwoeD1uKGZ1bmN0aW9uKG4scil7YShuLHgsdCk7dmFyIGU9cChuZXcgYixuLHgpO3JldHVybiB2b2lkIDAhPXImJmYocix5LGVbbV0sZSksZX0pLHgucHJvdG90eXBlPXcsdy5jb25zdHJ1Y3Rvcj14KSwoRnx8TSkmJihfKCJkZWxldGUiKSxfKCJoYXMiKSx5JiZfKCJnZXQiKSksKE18fE8pJiZfKG0pLGcmJncuY2xlYXImJmRlbGV0ZSB3LmNsZWFyfWVsc2UgeD1kLmdldENvbnN0cnVjdG9yKG4sdCx5LG0pLHUoeC5wcm90b3R5cGUsciksYy5ORUVEPSEwO3JldHVybiB2KHgsdCksU1t0XT14LGkoaS5HK2kuVytpLkYqKHghPWIpLFMpLGd8fGQuc2V0U3Ryb25nKHgsdCx5KSx4fX0sezMyOjMyLDM0OjM0LDM3OjM3LDM4OjM4LDQzOjQzLDQ5OjQ5LDU0OjU0LDY6Niw2Mjo2Miw4Njo4Niw4Nzo4Nyw5Mjo5Mn1dLDIzOltmdW5jdGlvbih0LG4scil7dmFyIGU9bi5leHBvcnRzPXt2ZXJzaW9uOiIyLjQuMCJ9OyJudW1iZXIiPT10eXBlb2YgX19lJiYoX19lPWUpfSx7fV0sMjQ6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCg2NyksaT10KDg1KTtuLmV4cG9ydHM9ZnVuY3Rpb24odCxuLHIpe24gaW4gdD9lLmYodCxuLGkoMCxyKSk6dFtuXT1yfX0sezY3OjY3LDg1Ojg1fV0sMjU6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMpO24uZXhwb3J0cz1mdW5jdGlvbih0LG4scil7aWYoZSh0KSx2b2lkIDA9PT1uKXJldHVybiB0O3N3aXRjaChyKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiB0LmNhbGwobixyKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihyLGUpe3JldHVybiB0LmNhbGwobixyLGUpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKHIsZSxpKXtyZXR1cm4gdC5jYWxsKG4scixlLGkpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShuLGFyZ3VtZW50cyl9fX0sezM6M31dLDI2OltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBlPXQoNyksaT10KDExMCksbz0ibnVtYmVyIjtuLmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoInN0cmluZyIhPT10JiZ0IT09byYmImRlZmF1bHQiIT09dCl0aHJvdyBUeXBlRXJyb3IoIkluY29ycmVjdCBoaW50Iik7cmV0dXJuIGkoZSh0aGlzKSx0IT1vKX19LHsxMTA6MTEwLDc6N31dLDI3OltmdW5jdGlvbih0LG4scil7bi5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09dCl0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNhbGwgbWV0aG9kIG9uICAiK3QpO3JldHVybiB0fX0se31dLDI4OltmdW5jdGlvbih0LG4scil7bi5leHBvcnRzPSF0KDM0KShmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LHszNDozNH1dLDI5OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg0OSksaT10KDM4KS5kb2N1bWVudCxvPWUoaSkmJmUoaS5jcmVhdGVFbGVtZW50KTtuLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG8/aS5jcmVhdGVFbGVtZW50KHQpOnt9fX0sezM4OjM4LDQ5OjQ5fV0sMzA6W2Z1bmN0aW9uKHQsbixyKXtuLmV4cG9ydHM9ImNvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZiIuc3BsaXQoIiwiKX0se31dLDMxOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg3NiksaT10KDczKSxvPXQoNzcpO24uZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgbj1lKHQpLHI9aS5mO2lmKHIpZm9yKHZhciB1LGM9cih0KSxmPW8uZixhPTA7Yy5sZW5ndGg+YTspZi5jYWxsKHQsdT1jW2ErK10pJiZuLnB1c2godSk7cmV0dXJuIG59fSx7NzM6NzMsNzY6NzYsNzc6Nzd9XSwzMjpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzgpLGk9dCgyMyksbz10KDQwKSx1PXQoODcpLGM9dCgyNSksZj0icHJvdG90eXBlIixhPWZ1bmN0aW9uKHQsbixyKXt2YXIgcyxsLGgsdixwPXQmYS5GLGQ9dCZhLkcseT10JmEuUyxnPXQmYS5QLGI9dCZhLkIseD1kP2U6eT9lW25dfHwoZVtuXT17fSk6KGVbbl18fHt9KVtmXSxtPWQ/aTppW25dfHwoaVtuXT17fSksdz1tW2ZdfHwobVtmXT17fSk7ZCYmKHI9bik7Zm9yKHMgaW4gcilsPSFwJiZ4JiZ2b2lkIDAhPT14W3NdLGg9KGw/eDpyKVtzXSx2PWImJmw/YyhoLGUpOmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBoP2MoRnVuY3Rpb24uY2FsbCxoKTpoLHgmJnUoeCxzLGgsdCZhLlUpLG1bc10hPWgmJm8obSxzLHYpLGcmJndbc10hPWgmJih3W3NdPWgpfTtlLmNvcmU9aSxhLkY9MSxhLkc9MixhLlM9NCxhLlA9OCxhLkI9MTYsYS5XPTMyLGEuVT02NCxhLlI9MTI4LG4uZXhwb3J0cz1hfSx7MjM6MjMsMjU6MjUsMzg6MzgsNDA6NDAsODc6ODd9XSwzMzpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMTE3KSgibWF0Y2giKTtuLmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIG49Ly4vO3RyeXsiLy4vIlt0XShuKX1jYXRjaChyKXt0cnl7cmV0dXJuIG5bZV09ITEsISIvLi8iW3RdKG4pfWNhdGNoKHQpe319cmV0dXJuITB9fSx7MTE3OjExN31dLDM0OltmdW5jdGlvbih0LG4scil7bi5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4hIXQoKX1jYXRjaCh0KXtyZXR1cm4hMH19fSx7fV0sMzU6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCg0MCksaT10KDg3KSxvPXQoMzQpLHU9dCgyNyksYz10KDExNyk7bi5leHBvcnRzPWZ1bmN0aW9uKHQsbixyKXt2YXIgZj1jKHQpLGE9cih1LGYsIiJbdF0pLHM9YVswXSxsPWFbMV07byhmdW5jdGlvbigpe3ZhciBuPXt9O3JldHVybiBuW2ZdPWZ1bmN0aW9uKCl7cmV0dXJuIDd9LDchPSIiW3RdKG4pfSkmJihpKFN0cmluZy5wcm90b3R5cGUsdCxzKSxlKFJlZ0V4cC5wcm90b3R5cGUsZiwyPT1uP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGwuY2FsbCh0LHRoaXMsbil9OmZ1bmN0aW9uKHQpe3JldHVybiBsLmNhbGwodCx0aGlzKX0pKX19LHsxMTc6MTE3LDI3OjI3LDM0OjM0LDQwOjQwLDg3Ojg3fV0sMzY6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCg3KTtuLmV4cG9ydHM9ZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLG49IiI7cmV0dXJuIHQuZ2xvYmFsJiYobis9ImciKSx0Lmlnbm9yZUNhc2UmJihuKz0iaSIpLHQubXVsdGlsaW5lJiYobis9Im0iKSx0LnVuaWNvZGUmJihuKz0idSIpLHQuc3RpY2t5JiYobis9InkiKSxufX0sezc6N31dLDM3OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgyNSksaT10KDUxKSxvPXQoNDYpLHU9dCg3KSxjPXQoMTA4KSxmPXQoMTE4KSxhPXt9LHM9e30scj1uLmV4cG9ydHM9ZnVuY3Rpb24odCxuLHIsbCxoKXt2YXIgdixwLGQseSxnPWg/ZnVuY3Rpb24oKXtyZXR1cm4gdH06Zih0KSxiPWUocixsLG4/MjoxKSx4PTA7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGcpdGhyb3cgVHlwZUVycm9yKHQrIiBpcyBub3QgaXRlcmFibGUhIik7aWYobyhnKSl7Zm9yKHY9Yyh0Lmxlbmd0aCk7dj54O3grKylpZih5PW4/Yih1KHA9dFt4XSlbMF0scFsxXSk6Yih0W3hdKSx5PT09YXx8eT09PXMpcmV0dXJuIHl9ZWxzZSBmb3IoZD1nLmNhbGwodCk7IShwPWQubmV4dCgpKS5kb25lOylpZih5PWkoZCxiLHAudmFsdWUsbikseT09PWF8fHk9PT1zKXJldHVybiB5fTtyLkJSRUFLPWEsci5SRVRVUk49c30sezEwODoxMDgsMTE4OjExOCwyNToyNSw0Njo0Niw1MTo1MSw3Ojd9XSwzODpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPW4uZXhwb3J0cz0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lk1hdGg9PU1hdGg/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5NYXRoPT1NYXRoP3NlbGY6RnVuY3Rpb24oInJldHVybiB0aGlzIikoKTsibnVtYmVyIj09dHlwZW9mIF9fZyYmKF9fZz1lKX0se31dLDM5OltmdW5jdGlvbih0LG4scil7dmFyIGU9e30uaGFzT3duUHJvcGVydHk7bi5leHBvcnRzPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuY2FsbCh0LG4pfX0se31dLDQwOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg2NyksaT10KDg1KTtuLmV4cG9ydHM9dCgyOCk/ZnVuY3Rpb24odCxuLHIpe3JldHVybiBlLmYodCxuLGkoMSxyKSl9OmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdFtuXT1yLHR9fSx7Mjg6MjgsNjc6NjcsODU6ODV9XSw0MTpbZnVuY3Rpb24odCxuLHIpe24uZXhwb3J0cz10KDM4KS5kb2N1bWVudCYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fSx7Mzg6Mzh9XSw0MjpbZnVuY3Rpb24odCxuLHIpe24uZXhwb3J0cz0hdCgyOCkmJiF0KDM0KShmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkodCgyOSkoImRpdiIpLCJhIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pfSx7Mjg6MjgsMjk6MjksMzQ6MzR9XSw0MzpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoNDkpLGk9dCg5MCkuc2V0O24uZXhwb3J0cz1mdW5jdGlvbih0LG4scil7dmFyIG8sdT1uLmNvbnN0cnVjdG9yO3JldHVybiB1IT09ciYmImZ1bmN0aW9uIj09dHlwZW9mIHUmJihvPXUucHJvdG90eXBlKSE9PXIucHJvdG90eXBlJiZlKG8pJiZpJiZpKHQsbyksdH19LHs0OTo0OSw5MDo5MH1dLDQ0OltmdW5jdGlvbih0LG4scil7bi5leHBvcnRzPWZ1bmN0aW9uKHQsbixyKXt2YXIgZT12b2lkIDA9PT1yO3N3aXRjaChuLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBlP3QoKTp0LmNhbGwocik7Y2FzZSAxOnJldHVybiBlP3QoblswXSk6dC5jYWxsKHIsblswXSk7Y2FzZSAyOnJldHVybiBlP3QoblswXSxuWzFdKTp0LmNhbGwocixuWzBdLG5bMV0pO2Nhc2UgMzpyZXR1cm4gZT90KG5bMF0sblsxXSxuWzJdKTp0LmNhbGwocixuWzBdLG5bMV0sblsyXSk7Y2FzZSA0OnJldHVybiBlP3QoblswXSxuWzFdLG5bMl0sblszXSk6dC5jYWxsKHIsblswXSxuWzFdLG5bMl0sblszXSl9cmV0dXJuIHQuYXBwbHkocixuKX19LHt9XSw0NTpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMTgpO24uZXhwb3J0cz1PYmplY3QoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKT9PYmplY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIlN0cmluZyI9PWUodCk/dC5zcGxpdCgiIik6T2JqZWN0KHQpfX0sezE4OjE4fV0sNDY6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDU2KSxpPXQoMTE3KSgiaXRlcmF0b3IiKSxvPUFycmF5LnByb3RvdHlwZTtuLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQmJihlLkFycmF5PT09dHx8b1tpXT09PXQpfX0sezExNzoxMTcsNTY6NTZ9XSw0NzpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMTgpO24uZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbiBpc0FycmF5KHQpe3JldHVybiJBcnJheSI9PWUodCl9fSx7MTg6MTh9XSw0ODpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoNDkpLGk9TWF0aC5mbG9vcjtuLmV4cG9ydHM9ZnVuY3Rpb24gaXNJbnRlZ2VyKHQpe3JldHVybiFlKHQpJiZpc0Zpbml0ZSh0KSYmaSh0KT09PXR9fSx7NDk6NDl9XSw0OTpbZnVuY3Rpb24odCxuLHIpe24uZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ/bnVsbCE9PXQ6ImZ1bmN0aW9uIj09dHlwZW9mIHR9fSx7fV0sNTA6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDQ5KSxpPXQoMTgpLG89dCgxMTcpKCJtYXRjaCIpO24uZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgbjtyZXR1cm4gZSh0KSYmKHZvaWQgMCE9PShuPXRbb10pPyEhbjoiUmVnRXhwIj09aSh0KSl9fSx7MTE3OjExNywxODoxOCw0OTo0OX1dLDUxOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg3KTtuLmV4cG9ydHM9ZnVuY3Rpb24odCxuLHIsaSl7dHJ5e3JldHVybiBpP24oZShyKVswXSxyWzFdKTpuKHIpfWNhdGNoKG4pe3ZhciBvPXQucmV0dXJuO3Rocm93IHZvaWQgMCE9PW8mJmUoby5jYWxsKHQpKSxufX19LHs3Ojd9XSw1MjpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDY2KSxpPXQoODUpLG89dCg5MiksdT17fTt0KDQwKSh1LHQoMTE3KSgiaXRlcmF0b3IiKSxmdW5jdGlvbigpe3JldHVybiB0aGlzfSksbi5leHBvcnRzPWZ1bmN0aW9uKHQsbixyKXt0LnByb3RvdHlwZT1lKHUse25leHQ6aSgxLHIpfSksbyh0LG4rIiBJdGVyYXRvciIpfX0sezExNzoxMTcsNDA6NDAsNjY6NjYsODU6ODUsOTI6OTJ9XSw1MzpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDU4KSxpPXQoMzIpLG89dCg4NyksdT10KDQwKSxjPXQoMzkpLGY9dCg1NiksYT10KDUyKSxzPXQoOTIpLGw9dCg3NCksaD10KDExNykoIml0ZXJhdG9yIiksdj0hKFtdLmtleXMmJiJuZXh0ImluW10ua2V5cygpKSxwPSJAQGl0ZXJhdG9yIixkPSJrZXlzIix5PSJ2YWx1ZXMiLGc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307bi5leHBvcnRzPWZ1bmN0aW9uKHQsbixyLGIseCxtLHcpe2EocixuLGIpO3ZhciBTLF8sRSxPPWZ1bmN0aW9uKHQpe2lmKCF2JiZ0IGluIEEpcmV0dXJuIEFbdF07c3dpdGNoKHQpe2Nhc2UgZDpyZXR1cm4gZnVuY3Rpb24ga2V5cygpe3JldHVybiBuZXcgcih0aGlzLHQpfTtjYXNlIHk6cmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpe3JldHVybiBuZXcgcih0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24gZW50cmllcygpe3JldHVybiBuZXcgcih0aGlzLHQpfX0sRj1uKyIgSXRlcmF0b3IiLFA9eD09eSxNPSExLEE9dC5wcm90b3R5cGUsST1BW2hdfHxBW3BdfHx4JiZBW3hdLGo9SXx8Tyh4KSxOPXg/UD9PKCJlbnRyaWVzIik6ajp2b2lkIDAsaz0iQXJyYXkiPT1uP0EuZW50cmllc3x8STpJO2lmKGsmJihFPWwoay5jYWxsKG5ldyB0KSksRSE9PU9iamVjdC5wcm90b3R5cGUmJihzKEUsRiwhMCksZXx8YyhFLGgpfHx1KEUsaCxnKSkpLFAmJkkmJkkubmFtZSE9PXkmJihNPSEwLGo9ZnVuY3Rpb24gdmFsdWVzKCl7cmV0dXJuIEkuY2FsbCh0aGlzKX0pLGUmJiF3fHwhdiYmIU0mJkFbaF18fHUoQSxoLGopLGZbbl09aixmW0ZdPWcseClpZihTPXt2YWx1ZXM6UD9qOk8oeSksa2V5czptP2o6TyhkKSxlbnRyaWVzOk59LHcpZm9yKF8gaW4gUylfIGluIEF8fG8oQSxfLFNbX10pO2Vsc2UgaShpLlAraS5GKih2fHxNKSxuLFMpO3JldHVybiBTfX0sezExNzoxMTcsMzI6MzIsMzk6MzksNDA6NDAsNTI6NTIsNTY6NTYsNTg6NTgsNzQ6NzQsODc6ODcsOTI6OTJ9XSw1NDpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMTE3KSgiaXRlcmF0b3IiKSxpPSExO3RyeXt2YXIgbz1bN11bZV0oKTtvLnJldHVybj1mdW5jdGlvbigpe2k9ITB9LEFycmF5LmZyb20obyxmdW5jdGlvbigpe3Rocm93IDJ9KX1jYXRjaCh0KXt9bi5leHBvcnRzPWZ1bmN0aW9uKHQsbil7aWYoIW4mJiFpKXJldHVybiExO3ZhciByPSExO3RyeXt2YXIgbz1bN10sdT1vW2VdKCk7dS5uZXh0PWZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6cj0hMH19LG9bZV09ZnVuY3Rpb24oKXtyZXR1cm4gdX0sdChvKX1jYXRjaCh0KXt9cmV0dXJuIHJ9fSx7MTE3OjExN31dLDU1OltmdW5jdGlvbih0LG4scil7bi5leHBvcnRzPWZ1bmN0aW9uKHQsbil7cmV0dXJue3ZhbHVlOm4sZG9uZTohIXR9fX0se31dLDU2OltmdW5jdGlvbih0LG4scil7bi5leHBvcnRzPXt9fSx7fV0sNTc6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDc2KSxpPXQoMTA3KTtuLmV4cG9ydHM9ZnVuY3Rpb24odCxuKXtmb3IodmFyIHIsbz1pKHQpLHU9ZShvKSxjPXUubGVuZ3RoLGY9MDtjPmY7KWlmKG9bcj11W2YrK11dPT09bilyZXR1cm4gcn19LHsxMDc6MTA3LDc2Ojc2fV0sNTg6W2Z1bmN0aW9uKHQsbixyKXtuLmV4cG9ydHM9ITF9LHt9XSw1OTpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPU1hdGguZXhwbTE7bi5leHBvcnRzPSFlfHxlKDEwKT4yMjAyNS40NjU3OTQ4MDY3MTh8fGUoMTApPDIyMDI1LjQ2NTc5NDgwNjcxOHx8ZSgtMmUtMTcpIT0tMmUtMTc/ZnVuY3Rpb24gZXhwbTEodCl7cmV0dXJuIDA9PSh0PSt0KT90OnQ+LTFlLTYmJnQ8MWUtNj90K3QqdC8yOk1hdGguZXhwKHQpLTF9OmV9LHt9XSw2MDpbZnVuY3Rpb24odCxuLHIpe24uZXhwb3J0cz1NYXRoLmxvZzFwfHxmdW5jdGlvbiBsb2cxcCh0KXtyZXR1cm4odD0rdCk+LTFlLTgmJnQ8MWUtOD90LXQqdC8yOk1hdGgubG9nKDErdCl9fSx7fV0sNjE6W2Z1bmN0aW9uKHQsbixyKXtuLmV4cG9ydHM9TWF0aC5zaWdufHxmdW5jdGlvbiBzaWduKHQpe3JldHVybiAwPT0odD0rdCl8fHQhPXQ/dDp0PDA/LTE6MX19LHt9XSw2MjpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMTE0KSgibWV0YSIpLGk9dCg0OSksbz10KDM5KSx1PXQoNjcpLmYsYz0wLGY9T2JqZWN0LmlzRXh0ZW5zaWJsZXx8ZnVuY3Rpb24oKXtyZXR1cm4hMH0sYT0hdCgzNCkoZnVuY3Rpb24oKXtyZXR1cm4gZihPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKX0pLHM9ZnVuY3Rpb24odCl7dSh0LGUse3ZhbHVlOntpOiJPIisgKytjLHc6e319fSl9LGw9ZnVuY3Rpb24odCxuKXtpZighaSh0KSlyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHQ/dDooInN0cmluZyI9PXR5cGVvZiB0PyJTIjoiUCIpK3Q7aWYoIW8odCxlKSl7aWYoIWYodCkpcmV0dXJuIkYiO2lmKCFuKXJldHVybiJFIjtzKHQpfXJldHVybiB0W2VdLml9LGg9ZnVuY3Rpb24odCxuKXtpZighbyh0LGUpKXtpZighZih0KSlyZXR1cm4hMDtpZighbilyZXR1cm4hMTtzKHQpfXJldHVybiB0W2VdLnd9LHY9ZnVuY3Rpb24odCl7cmV0dXJuIGEmJnAuTkVFRCYmZih0KSYmIW8odCxlKSYmcyh0KSx0fSxwPW4uZXhwb3J0cz17S0VZOmUsTkVFRDohMSxmYXN0S2V5OmwsZ2V0V2VhazpoLG9uRnJlZXplOnZ9fSx7MTE0OjExNCwzNDozNCwzOTozOSw0OTo0OSw2Nzo2N31dLDYzOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgxNDkpLGk9dCgzMiksbz10KDk0KSgibWV0YWRhdGEiKSx1PW8uc3RvcmV8fChvLnN0b3JlPW5ldyh0KDI1NSkpKSxjPWZ1bmN0aW9uKHQsbixyKXt2YXIgaT11LmdldCh0KTtpZighaSl7aWYoIXIpcmV0dXJuO3Uuc2V0KHQsaT1uZXcgZSl9dmFyIG89aS5nZXQobik7aWYoIW8pe2lmKCFyKXJldHVybjtpLnNldChuLG89bmV3IGUpfXJldHVybiBvfSxmPWZ1bmN0aW9uKHQsbixyKXt2YXIgZT1jKG4sciwhMSk7cmV0dXJuIHZvaWQgMCE9PWUmJmUuaGFzKHQpfSxhPWZ1bmN0aW9uKHQsbixyKXt2YXIgZT1jKG4sciwhMSk7cmV0dXJuIHZvaWQgMD09PWU/dm9pZCAwOmUuZ2V0KHQpfSxzPWZ1bmN0aW9uKHQsbixyLGUpe2MocixlLCEwKS5zZXQodCxuKX0sbD1mdW5jdGlvbih0LG4pe3ZhciByPWModCxuLCExKSxlPVtdO3JldHVybiByJiZyLmZvckVhY2goZnVuY3Rpb24odCxuKXtlLnB1c2gobil9KSxlfSxoPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10fHwic3ltYm9sIj09dHlwZW9mIHQ/dDpTdHJpbmcodCl9LHY9ZnVuY3Rpb24odCl7aShpLlMsIlJlZmxlY3QiLHQpfTtuLmV4cG9ydHM9e3N0b3JlOnUsbWFwOmMsaGFzOmYsZ2V0OmEsc2V0OnMsa2V5czpsLGtleTpoLGV4cDp2fX0sezE0OToxNDksMjU1OjI1NSwzMjozMiw5NDo5NH1dLDY0OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzOCksaT10KDEwNCkuc2V0LG89ZS5NdXRhdGlvbk9ic2VydmVyfHxlLldlYktpdE11dGF0aW9uT2JzZXJ2ZXIsdT1lLnByb2Nlc3MsYz1lLlByb21pc2UsZj0icHJvY2VzcyI9PXQoMTgpKHUpO24uZXhwb3J0cz1mdW5jdGlvbigpe3ZhciB0LG4scixhPWZ1bmN0aW9uKCl7dmFyIGUsaTtmb3IoZiYmKGU9dS5kb21haW4pJiZlLmV4aXQoKTt0Oyl7aT10LmZuLHQ9dC5uZXh0O3RyeXtpKCl9Y2F0Y2goZSl7dGhyb3cgdD9yKCk6bj12b2lkIDAsZX19bj12b2lkIDAsZSYmZS5lbnRlcigpfTtpZihmKXI9ZnVuY3Rpb24oKXt1Lm5leHRUaWNrKGEpfTtlbHNlIGlmKG8pe3ZhciBzPSEwLGw9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpO25ldyBvKGEpLm9ic2VydmUobCx7Y2hhcmFjdGVyRGF0YTohMH0pLHI9ZnVuY3Rpb24oKXtsLmRhdGE9cz0hc319ZWxzZSBpZihjJiZjLnJlc29sdmUpe3ZhciBoPWMucmVzb2x2ZSgpO3I9ZnVuY3Rpb24oKXtoLnRoZW4oYSl9fWVsc2Ugcj1mdW5jdGlvbigpe2kuY2FsbChlLGEpfTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIGk9e2ZuOmUsbmV4dDp2b2lkIDB9O24mJihuLm5leHQ9aSksdHx8KHQ9aSxyKCkpLG49aX19fSx7MTA0OjEwNCwxODoxOCwzODozOH1dLDY1OltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBlPXQoNzYpLGk9dCg3Myksbz10KDc3KSx1PXQoMTA5KSxjPXQoNDUpLGY9T2JqZWN0LmFzc2lnbjtuLmV4cG9ydHM9IWZ8fHQoMzQpKGZ1bmN0aW9uKCl7dmFyIHQ9e30sbj17fSxyPVN5bWJvbCgpLGU9ImFiY2RlZmdoaWprbG1ub3BxcnN0IjtyZXR1cm4gdFtyXT03LGUuc3BsaXQoIiIpLmZvckVhY2goZnVuY3Rpb24odCl7blt0XT10fSksNyE9Zih7fSx0KVtyXXx8T2JqZWN0LmtleXMoZih7fSxuKSkuam9pbigiIikhPWV9KT9mdW5jdGlvbiBhc3NpZ24odCxuKXtmb3IodmFyIHI9dSh0KSxmPWFyZ3VtZW50cy5sZW5ndGgsYT0xLHM9aS5mLGw9by5mO2Y+YTspZm9yKHZhciBoLHY9Yyhhcmd1bWVudHNbYSsrXSkscD1zP2UodikuY29uY2F0KHModikpOmUodiksZD1wLmxlbmd0aCx5PTA7ZD55OylsLmNhbGwodixoPXBbeSsrXSkmJihyW2hdPXZbaF0pO3JldHVybiByfTpmfSx7MTA5OjEwOSwzNDozNCw0NTo0NSw3Mzo3Myw3Njo3Niw3Nzo3N31dLDY2OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg3KSxpPXQoNjgpLG89dCgzMCksdT10KDkzKSgiSUVfUFJPVE8iKSxjPWZ1bmN0aW9uKCl7fSxmPSJwcm90b3R5cGUiLGE9ZnVuY3Rpb24oKXt2YXIgbixyPXQoMjkpKCJpZnJhbWUiKSxlPW8ubGVuZ3RoLGk9IjwiLHU9Ij4iO2ZvcihyLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHQoNDEpLmFwcGVuZENoaWxkKHIpLHIuc3JjPSJqYXZhc2NyaXB0OiIsbj1yLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQsbi5vcGVuKCksbi53cml0ZShpKyJzY3JpcHQiK3UrImRvY3VtZW50LkY9T2JqZWN0IitpKyIvc2NyaXB0Iit1KSxuLmNsb3NlKCksYT1uLkY7ZS0tOylkZWxldGUgYVtmXVtvW2VdXTtyZXR1cm4gYSgpfTtuLmV4cG9ydHM9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24gY3JlYXRlKHQsbil7dmFyIHI7cmV0dXJuIG51bGwhPT10PyhjW2ZdPWUodCkscj1uZXcgYyxjW2ZdPW51bGwsclt1XT10KTpyPWEoKSx2b2lkIDA9PT1uP3I6aShyLG4pfX0sezI5OjI5LDMwOjMwLDQxOjQxLDY4OjY4LDc6Nyw5Mzo5M31dLDY3OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg3KSxpPXQoNDIpLG89dCgxMTApLHU9T2JqZWN0LmRlZmluZVByb3BlcnR5O3IuZj10KDI4KT9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodCxuLHIpe2lmKGUodCksbj1vKG4sITApLGUociksaSl0cnl7cmV0dXJuIHUodCxuLHIpfWNhdGNoKHQpe31pZigiZ2V0ImluIHJ8fCJzZXQiaW4gcil0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkISIpO3JldHVybiJ2YWx1ZSJpbiByJiYodFtuXT1yLnZhbHVlKSx0fX0sezExMDoxMTAsMjg6MjgsNDI6NDIsNzo3fV0sNjg6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDY3KSxpPXQoNyksbz10KDc2KTtuLmV4cG9ydHM9dCgyOCk/T2JqZWN0LmRlZmluZVByb3BlcnRpZXM6ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0LG4pe2kodCk7Zm9yKHZhciByLHU9byhuKSxjPXUubGVuZ3RoLGY9MDtjPmY7KWUuZih0LHI9dVtmKytdLG5bcl0pO3JldHVybiB0fX0sezI4OjI4LDY3OjY3LDc6Nyw3Njo3Nn1dLDY5OltmdW5jdGlvbih0LG4scil7bi5leHBvcnRzPXQoNTgpfHwhdCgzNCkoZnVuY3Rpb24oKXt2YXIgbj1NYXRoLnJhbmRvbSgpO19fZGVmaW5lU2V0dGVyX18uY2FsbChudWxsLG4sZnVuY3Rpb24oKXt9KSxkZWxldGUgdCgzOClbbl19KX0sezM0OjM0LDM4OjM4LDU4OjU4fV0sNzA6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDc3KSxpPXQoODUpLG89dCgxMDcpLHU9dCgxMTApLGM9dCgzOSksZj10KDQyKSxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7ci5mPXQoMjgpP2E6ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbil7aWYodD1vKHQpLG49dShuLCEwKSxmKXRyeXtyZXR1cm4gYSh0LG4pfWNhdGNoKHQpe31pZihjKHQsbikpcmV0dXJuIGkoIWUuZi5jYWxsKHQsbiksdFtuXSl9fSx7MTA3OjEwNywxMTA6MTEwLDI4OjI4LDM5OjM5LDQyOjQyLDc3Ojc3LDg1Ojg1fV0sNzE6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDEwNyksaT10KDcyKS5mLG89e30udG9TdHJpbmcsdT0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93JiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcz9PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpOltdLGM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiBpKHQpfWNhdGNoKHQpe3JldHVybiB1LnNsaWNlKCl9fTtuLmV4cG9ydHMuZj1mdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKHQpe3JldHVybiB1JiYiW29iamVjdCBXaW5kb3ddIj09by5jYWxsKHQpP2ModCk6aShlKHQpKX19LHsxMDc6MTA3LDcyOjcyfV0sNzI6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDc1KSxpPXQoMzApLmNvbmNhdCgibGVuZ3RoIiwicHJvdG90eXBlIik7ci5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzfHxmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKHQpe3JldHVybiBlKHQsaSl9fSx7MzA6MzAsNzU6NzV9XSw3MzpbZnVuY3Rpb24odCxuLHIpe3IuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSx7fV0sNzQ6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDM5KSxpPXQoMTA5KSxvPXQoOTMpKCJJRV9QUk9UTyIpLHU9T2JqZWN0LnByb3RvdHlwZTtuLmV4cG9ydHM9T2JqZWN0LmdldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0KXtyZXR1cm4gdD1pKHQpLGUodCxvKT90W29dOiJmdW5jdGlvbiI9PXR5cGVvZiB0LmNvbnN0cnVjdG9yJiZ0IGluc3RhbmNlb2YgdC5jb25zdHJ1Y3Rvcj90LmNvbnN0cnVjdG9yLnByb3RvdHlwZTp0IGluc3RhbmNlb2YgT2JqZWN0P3U6bnVsbH19LHsxMDk6MTA5LDM5OjM5LDkzOjkzfV0sNzU6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDM5KSxpPXQoMTA3KSxvPXQoMTEpKCExKSx1PXQoOTMpKCJJRV9QUk9UTyIpO24uZXhwb3J0cz1mdW5jdGlvbih0LG4pe3ZhciByLGM9aSh0KSxmPTAsYT1bXTtmb3IociBpbiBjKXIhPXUmJmUoYyxyKSYmYS5wdXNoKHIpO2Zvcig7bi5sZW5ndGg+ZjspZShjLHI9bltmKytdKSYmKH5vKGEscil8fGEucHVzaChyKSk7cmV0dXJuIGF9fSx7MTA3OjEwNywxMToxMSwzOTozOSw5Mzo5M31dLDc2OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg3NSksaT10KDMwKTtuLmV4cG9ydHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uIGtleXModCl7cmV0dXJuIGUodCxpKX19LHszMDozMCw3NTo3NX1dLDc3OltmdW5jdGlvbih0LG4scil7ci5mPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlfSx7fV0sNzg6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKSxpPXQoMjMpLG89dCgzNCk7bi5leHBvcnRzPWZ1bmN0aW9uKHQsbil7dmFyIHI9KGkuT2JqZWN0fHx7fSlbdF18fE9iamVjdFt0XSx1PXt9O3VbdF09bihyKSxlKGUuUytlLkYqbyhmdW5jdGlvbigpe3IoMSl9KSwiT2JqZWN0Iix1KX19LHsyMzoyMywzMjozMiwzNDozNH1dLDc5OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg3NiksaT10KDEwNyksbz10KDc3KS5mO24uZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKHZhciByLHU9aShuKSxjPWUodSksZj1jLmxlbmd0aCxhPTAscz1bXTtmPmE7KW8uY2FsbCh1LHI9Y1thKytdKSYmcy5wdXNoKHQ/W3IsdVtyXV06dVtyXSk7cmV0dXJuIHN9fX0sezEwNzoxMDcsNzY6NzYsNzc6Nzd9XSw4MDpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoNzIpLGk9dCg3Myksbz10KDcpLHU9dCgzOCkuUmVmbGVjdDtuLmV4cG9ydHM9dSYmdS5vd25LZXlzfHxmdW5jdGlvbiBvd25LZXlzKHQpe3ZhciBuPWUuZihvKHQpKSxyPWkuZjtyZXR1cm4gcj9uLmNvbmNhdChyKHQpKTpufX0sezM4OjM4LDc6Nyw3Mjo3Miw3Mzo3M31dLDgxOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzOCkucGFyc2VGbG9hdCxpPXQoMTAyKS50cmltO24uZXhwb3J0cz0xL2UodCgxMDMpKyItMCIpIT09LSgxLzApP2Z1bmN0aW9uIHBhcnNlRmxvYXQodCl7dmFyIG49aShTdHJpbmcodCksMykscj1lKG4pO3JldHVybiAwPT09ciYmIi0iPT1uLmNoYXJBdCgwKT8tMDpyfTplfSx7MTAyOjEwMiwxMDM6MTAzLDM4OjM4fV0sODI6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDM4KS5wYXJzZUludCxpPXQoMTAyKS50cmltLG89dCgxMDMpLHU9L15bXC0rXT8wW3hYXS87bi5leHBvcnRzPTghPT1lKG8rIjA4Iil8fDIyIT09ZShvKyIweDE2Iik/ZnVuY3Rpb24gcGFyc2VJbnQodCxuKXt2YXIgcj1pKFN0cmluZyh0KSwzKTtyZXR1cm4gZShyLG4+Pj4wfHwodS50ZXN0KHIpPzE2OjEwKSl9OmV9LHsxMDI6MTAyLDEwMzoxMDMsMzg6Mzh9XSw4MzpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDg0KSxpPXQoNDQpLG89dCgzKTtuLmV4cG9ydHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9byh0aGlzKSxuPWFyZ3VtZW50cy5sZW5ndGgscj1BcnJheShuKSx1PTAsYz1lLl8sZj0hMTtuPnU7KShyW3VdPWFyZ3VtZW50c1t1KytdKT09PWMmJihmPSEwKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZSxvPXRoaXMsdT1hcmd1bWVudHMubGVuZ3RoLGE9MCxzPTA7aWYoIWYmJiF1KXJldHVybiBpKHQscixvKTtpZihlPXIuc2xpY2UoKSxmKWZvcig7bj5hO2ErKyllW2FdPT09YyYmKGVbYV09YXJndW1lbnRzW3MrK10pO2Zvcig7dT5zOyllLnB1c2goYXJndW1lbnRzW3MrK10pO3JldHVybiBpKHQsZSxvKX19fSx7MzozLDQ0OjQ0LDg0Ojg0fV0sODQ6W2Z1bmN0aW9uKHQsbixyKXtuLmV4cG9ydHM9dCgzOCl9LHszODozOH1dLDg1OltmdW5jdGlvbih0LG4scil7bi5leHBvcnRzPWZ1bmN0aW9uKHQsbil7cmV0dXJue2VudW1lcmFibGU6ISgxJnQpLGNvbmZpZ3VyYWJsZTohKDImdCksd3JpdGFibGU6ISg0JnQpLHZhbHVlOm59fX0se31dLDg2OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg4Nyk7bi5leHBvcnRzPWZ1bmN0aW9uKHQsbixyKXtmb3IodmFyIGkgaW4gbillKHQsaSxuW2ldLHIpO3JldHVybiB0fX0sezg3Ojg3fV0sODc6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDM4KSxpPXQoNDApLG89dCgzOSksdT10KDExNCkoInNyYyIpLGM9InRvU3RyaW5nIixmPUZ1bmN0aW9uW2NdLGE9KCIiK2YpLnNwbGl0KGMpO3QoMjMpLmluc3BlY3RTb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGYuY2FsbCh0KX0sKG4uZXhwb3J0cz1mdW5jdGlvbih0LG4scixjKXt2YXIgZj0iZnVuY3Rpb24iPT10eXBlb2YgcjtmJiYobyhyLCJuYW1lIil8fGkociwibmFtZSIsbikpLHRbbl0hPT1yJiYoZiYmKG8ocix1KXx8aShyLHUsdFtuXT8iIit0W25dOmEuam9pbihTdHJpbmcobikpKSksdD09PWU/dFtuXT1yOmM/dFtuXT90W25dPXI6aSh0LG4scik6KGRlbGV0ZSB0W25dLGkodCxuLHIpKSl9KShGdW5jdGlvbi5wcm90b3R5cGUsYyxmdW5jdGlvbiB0b1N0cmluZygpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzJiZ0aGlzW3VdfHxmLmNhbGwodGhpcyl9KX0sezExNDoxMTQsMjM6MjMsMzg6MzgsMzk6MzksNDA6NDB9XSw4ODpbZnVuY3Rpb24odCxuLHIpe24uZXhwb3J0cz1mdW5jdGlvbih0LG4pe3ZhciByPW49PT1PYmplY3Qobik/ZnVuY3Rpb24odCl7cmV0dXJuIG5bdF19Om47cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBTdHJpbmcobikucmVwbGFjZSh0LHIpfX19LHt9XSw4OTpbZnVuY3Rpb24odCxuLHIpe24uZXhwb3J0cz1PYmplY3QuaXN8fGZ1bmN0aW9uIGlzKHQsbil7cmV0dXJuIHQ9PT1uPzAhPT10fHwxL3Q9PT0xL246dCE9dCYmbiE9bn19LHt9XSw5MDpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoNDkpLGk9dCg3KSxvPWZ1bmN0aW9uKHQsbil7aWYoaSh0KSwhZShuKSYmbnVsbCE9PW4pdGhyb3cgVHlwZUVycm9yKG4rIjogY2FuJ3Qgc2V0IGFzIHByb3RvdHlwZSEiKX07bi5leHBvcnRzPXtzZXQ6T2JqZWN0LnNldFByb3RvdHlwZU9mfHwoIl9fcHJvdG9fXyJpbnt9P2Z1bmN0aW9uKG4scixlKXt0cnl7ZT10KDI1KShGdW5jdGlvbi5jYWxsLHQoNzApLmYoT2JqZWN0LnByb3RvdHlwZSwiX19wcm90b19fIikuc2V0LDIpLGUobixbXSkscj0hKG4gaW5zdGFuY2VvZiBBcnJheSl9Y2F0Y2godCl7cj0hMH1yZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YodCxuKXtyZXR1cm4gbyh0LG4pLHI/dC5fX3Byb3RvX189bjplKHQsbiksdH19KHt9LCExKTp2b2lkIDApLGNoZWNrOm99fSx7MjU6MjUsNDk6NDksNzo3LDcwOjcwfV0sOTE6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgzOCksaT10KDY3KSxvPXQoMjgpLHU9dCgxMTcpKCJzcGVjaWVzIik7bi5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBuPWVbdF07byYmbiYmIW5bdV0mJmkuZihuLHUse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319KX19LHsxMTc6MTE3LDI4OjI4LDM4OjM4LDY3OjY3fV0sOTI6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDY3KS5mLGk9dCgzOSksbz10KDExNykoInRvU3RyaW5nVGFnIik7bi5leHBvcnRzPWZ1bmN0aW9uKHQsbixyKXt0JiYhaSh0PXI/dDp0LnByb3RvdHlwZSxvKSYmZSh0LG8se2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTpufSl9fSx7MTE3OjExNywzOTozOSw2Nzo2N31dLDkzOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg5NCkoImtleXMiKSxpPXQoMTE0KTtuLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGVbdF18fChlW3RdPWkodCkpfX0sezExNDoxMTQsOTQ6OTR9XSw5NDpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzgpLGk9Il9fY29yZS1qc19zaGFyZWRfXyIsbz1lW2ldfHwoZVtpXT17fSk7bi5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvW3RdfHwob1t0XT17fSl9fSx7Mzg6Mzh9XSw5NTpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoNyksaT10KDMpLG89dCgxMTcpKCJzcGVjaWVzIik7bi5leHBvcnRzPWZ1bmN0aW9uKHQsbil7dmFyIHIsdT1lKHQpLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT11fHx2b2lkIDA9PShyPWUodSlbb10pP246aShyKX19LHsxMTc6MTE3LDM6Myw3Ojd9XSw5NjpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzQpO24uZXhwb3J0cz1mdW5jdGlvbih0LG4pe3JldHVybiEhdCYmZShmdW5jdGlvbigpe24/dC5jYWxsKG51bGwsZnVuY3Rpb24oKXt9LDEpOnQuY2FsbChudWxsKX0pfX0sezM0OjM0fV0sOTc6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDEwNiksaT10KDI3KTtuLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4scil7dmFyIG8sdSxjPVN0cmluZyhpKG4pKSxmPWUociksYT1jLmxlbmd0aDtyZXR1cm4gZjwwfHxmPj1hP3Q/IiI6dm9pZCAwOihvPWMuY2hhckNvZGVBdChmKSxvPDU1Mjk2fHxvPjU2MzE5fHxmKzE9PT1hfHwodT1jLmNoYXJDb2RlQXQoZisxKSk8NTYzMjB8fHU+NTczNDM/dD9jLmNoYXJBdChmKTpvOnQ/Yy5zbGljZShmLGYrMik6KG8tNTUyOTY8PDEwKSsodS01NjMyMCkrNjU1MzYpfX19LHsxMDY6MTA2LDI3OjI3fV0sOTg6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDUwKSxpPXQoMjcpO24uZXhwb3J0cz1mdW5jdGlvbih0LG4scil7aWYoZShuKSl0aHJvdyBUeXBlRXJyb3IoIlN0cmluZyMiK3IrIiBkb2Vzbid0IGFjY2VwdCByZWdleCEiKTtyZXR1cm4gU3RyaW5nKGkodCkpfX0sezI3OjI3LDUwOjUwfV0sOTk6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKSxpPXQoMzQpLG89dCgyNyksdT0vIi9nLGM9ZnVuY3Rpb24odCxuLHIsZSl7dmFyIGk9U3RyaW5nKG8odCkpLGM9IjwiK247cmV0dXJuIiIhPT1yJiYoYys9IiAiK3IrJz0iJytTdHJpbmcoZSkucmVwbGFjZSh1LCImcXVvdDsiKSsnIicpLGMrIj4iK2krIjwvIituKyI+In07bi5leHBvcnRzPWZ1bmN0aW9uKHQsbil7dmFyIHI9e307clt0XT1uKGMpLGUoZS5QK2UuRippKGZ1bmN0aW9uKCl7dmFyIG49IiJbdF0oJyInKTtyZXR1cm4gbiE9PW4udG9Mb3dlckNhc2UoKXx8bi5zcGxpdCgnIicpLmxlbmd0aD4zfSksIlN0cmluZyIscil9fSx7Mjc6MjcsMzI6MzIsMzQ6MzR9XSwxMDA6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDEwOCksaT10KDEwMSksbz10KDI3KTtuLmV4cG9ydHM9ZnVuY3Rpb24odCxuLHIsdSl7dmFyIGM9U3RyaW5nKG8odCkpLGY9Yy5sZW5ndGgsYT12b2lkIDA9PT1yPyIgIjpTdHJpbmcocikscz1lKG4pO2lmKHM8PWZ8fCIiPT1hKXJldHVybiBjO3ZhciBsPXMtZixoPWkuY2FsbChhLE1hdGguY2VpbChsL2EubGVuZ3RoKSk7cmV0dXJuIGgubGVuZ3RoPmwmJihoPWguc2xpY2UoMCxsKSksdT9oK2M6YytofX0sezEwMToxMDEsMTA4OjEwOCwyNzoyN31dLDEwMTpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDEwNiksaT10KDI3KTtuLmV4cG9ydHM9ZnVuY3Rpb24gcmVwZWF0KHQpe3ZhciBuPVN0cmluZyhpKHRoaXMpKSxyPSIiLG89ZSh0KTtpZihvPDB8fG89PTEvMCl0aHJvdyBSYW5nZUVycm9yKCJDb3VudCBjYW4ndCBiZSBuZWdhdGl2ZSIpO2Zvcig7bz4wOyhvPj4+PTEpJiYobis9bikpMSZvJiYocis9bik7cmV0dXJuIHJ9fSx7MTA2OjEwNiwyNzoyN31dLDEwMjpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpLGk9dCgyNyksbz10KDM0KSx1PXQoMTAzKSxjPSJbIit1KyJdIixmPSLigIvChSIsYT1SZWdFeHAoIl4iK2MrYysiKiIpLHM9UmVnRXhwKGMrYysiKiQiKSxsPWZ1bmN0aW9uKHQsbixyKXt2YXIgaT17fSxjPW8oZnVuY3Rpb24oKXtyZXR1cm4hIXVbdF0oKXx8Zlt0XSgpIT1mfSksYT1pW3RdPWM/bihoKTp1W3RdO3ImJihpW3JdPWEpLGUoZS5QK2UuRipjLCJTdHJpbmciLGkpfSxoPWwudHJpbT1mdW5jdGlvbih0LG4pe3JldHVybiB0PVN0cmluZyhpKHQpKSwxJm4mJih0PXQucmVwbGFjZShhLCIiKSksMiZuJiYodD10LnJlcGxhY2UocywiIikpLHR9O24uZXhwb3J0cz1sfSx7MTAzOjEwMywyNzoyNywzMjozMiwzNDozNH1dLDEwMzpbZnVuY3Rpb24odCxuLHIpe24uZXhwb3J0cz0iXHRcblx2XGZcciDCoOGagOGgjuKAgOKAgeKAguKAg+KAhOKAheKAhuKAh+KAiOKAieKAiuKAr+KBn+OAgFx1MjAyOFx1MjAyOVx1ZmVmZiJ9LHt9XSwxMDQ6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZSxpLG8sdT10KDI1KSxjPXQoNDQpLGY9dCg0MSksYT10KDI5KSxzPXQoMzgpLGw9cy5wcm9jZXNzLGg9cy5zZXRJbW1lZGlhdGUsdj1zLmNsZWFySW1tZWRpYXRlLHA9cy5NZXNzYWdlQ2hhbm5lbCxkPTAseT17fSxnPSJvbnJlYWR5c3RhdGVjaGFuZ2UiLGI9ZnVuY3Rpb24oKXt2YXIgdD0rdGhpcztpZih5Lmhhc093blByb3BlcnR5KHQpKXt2YXIgbj15W3RdO2RlbGV0ZSB5W3RdLG4oKX19LHg9ZnVuY3Rpb24odCl7Yi5jYWxsKHQuZGF0YSl9O2gmJnZ8fChoPWZ1bmN0aW9uIHNldEltbWVkaWF0ZSh0KXtmb3IodmFyIG49W10scj0xO2FyZ3VtZW50cy5sZW5ndGg+cjspbi5wdXNoKGFyZ3VtZW50c1tyKytdKTtyZXR1cm4geVsrK2RdPWZ1bmN0aW9uKCl7YygiZnVuY3Rpb24iPT10eXBlb2YgdD90OkZ1bmN0aW9uKHQpLG4pfSxlKGQpLGR9LHY9ZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUodCl7ZGVsZXRlIHlbdF19LCJwcm9jZXNzIj09dCgxOCkobCk/ZT1mdW5jdGlvbih0KXtsLm5leHRUaWNrKHUoYix0LDEpKX06cD8oaT1uZXcgcCxvPWkucG9ydDIsaS5wb3J0MS5vbm1lc3NhZ2U9eCxlPXUoby5wb3N0TWVzc2FnZSxvLDEpKTpzLmFkZEV2ZW50TGlzdGVuZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBwb3N0TWVzc2FnZSYmIXMuaW1wb3J0U2NyaXB0cz8oZT1mdW5jdGlvbih0KXtzLnBvc3RNZXNzYWdlKHQrIiIsIioiKX0scy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix4LCExKSk6ZT1nIGluIGEoInNjcmlwdCIpP2Z1bmN0aW9uKHQpe2YuYXBwZW5kQ2hpbGQoYSgic2NyaXB0IikpW2ddPWZ1bmN0aW9uKCl7Zi5yZW1vdmVDaGlsZCh0aGlzKSxiLmNhbGwodCl9fTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHUoYix0LDEpLDApfSksbi5leHBvcnRzPXtzZXQ6aCxjbGVhcjp2fX0sezE4OjE4LDI1OjI1LDI5OjI5LDM4OjM4LDQxOjQxLDQ0OjQ0fV0sMTA1OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgxMDYpLGk9TWF0aC5tYXgsbz1NYXRoLm1pbjtuLmV4cG9ydHM9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdD1lKHQpLHQ8MD9pKHQrbiwwKTpvKHQsbil9fSx7MTA2OjEwNn1dLDEwNjpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPU1hdGguY2VpbCxpPU1hdGguZmxvb3I7bi5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA/aTplKSh0KX19LHt9XSwxMDc6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDQ1KSxpPXQoMjcpO24uZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZShpKHQpKX19LHsyNzoyNyw0NTo0NX1dLDEwODpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMTA2KSxpPU1hdGgubWluO24uZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdD4wP2koZSh0KSw5MDA3MTk5MjU0NzQwOTkxKTowfX0sezEwNjoxMDZ9XSwxMDk6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDI3KTtuLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChlKHQpKX19LHsyNzoyN31dLDExMDpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoNDkpO24uZXhwb3J0cz1mdW5jdGlvbih0LG4pe2lmKCFlKHQpKXJldHVybiB0O3ZhciByLGk7aWYobiYmImZ1bmN0aW9uIj09dHlwZW9mKHI9dC50b1N0cmluZykmJiFlKGk9ci5jYWxsKHQpKSlyZXR1cm4gaTtpZigiZnVuY3Rpb24iPT10eXBlb2Yocj10LnZhbHVlT2YpJiYhZShpPXIuY2FsbCh0KSkpcmV0dXJuIGk7aWYoIW4mJiJmdW5jdGlvbiI9PXR5cGVvZihyPXQudG9TdHJpbmcpJiYhZShpPXIuY2FsbCh0KSkpcmV0dXJuIGk7dGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWUiKX19LHs0OTo0OX1dLDExMTpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0IjtpZih0KDI4KSl7dmFyIGU9dCg1OCksaT10KDM4KSxvPXQoMzQpLHU9dCgzMiksYz10KDExMyksZj10KDExMiksYT10KDI1KSxzPXQoNiksbD10KDg1KSxoPXQoNDApLHY9dCg4NikscD10KDEwNiksZD10KDEwOCkseT10KDEwNSksZz10KDExMCksYj10KDM5KSx4PXQoODkpLG09dCgxNyksdz10KDQ5KSxTPXQoMTA5KSxfPXQoNDYpLEU9dCg2NiksTz10KDc0KSxGPXQoNzIpLmYsUD10KDExOCksTT10KDExNCksQT10KDExNyksST10KDEyKSxqPXQoMTEpLE49dCg5NSksaz10KDEzMCksUj10KDU2KSxUPXQoNTQpLEw9dCg5MSksQz10KDkpLFU9dCg4KSxHPXQoNjcpLEQ9dCg3MCksVz1HLmYsQj1ELmYsVj1pLlJhbmdlRXJyb3Isej1pLlR5cGVFcnJvcixLPWkuVWludDhBcnJheSxKPSJBcnJheUJ1ZmZlciIsWT0iU2hhcmVkIitKLHE9IkJZVEVTX1BFUl9FTEVNRU5UIixYPSJwcm90b3R5cGUiLCQ9QXJyYXlbWF0sSD1mLkFycmF5QnVmZmVyLFo9Zi5EYXRhVmlldyxRPUkoMCksdHQ9SSgyKSxudD1JKDMpLHJ0PUkoNCksZXQ9SSg1KSxpdD1JKDYpLG90PWooITApLHV0PWooITEpLGN0PWsudmFsdWVzLGZ0PWsua2V5cyxhdD1rLmVudHJpZXMsc3Q9JC5sYXN0SW5kZXhPZixsdD0kLnJlZHVjZSxodD0kLnJlZHVjZVJpZ2h0LHZ0PSQuam9pbixwdD0kLnNvcnQsZHQ9JC5zbGljZSx5dD0kLnRvU3RyaW5nLGd0PSQudG9Mb2NhbGVTdHJpbmcsYnQ9QSgiaXRlcmF0b3IiKSx4dD1BKCJ0b1N0cmluZ1RhZyIpLG10PU0oInR5cGVkX2NvbnN0cnVjdG9yIiksd3Q9TSgiZGVmX2NvbnN0cnVjdG9yIiksU3Q9Yy5DT05TVFIsX3Q9Yy5UWVBFRCxFdD1jLlZJRVcsT3Q9Ildyb25nIGxlbmd0aCEiLEZ0PUkoMSxmdW5jdGlvbih0LG4pe3JldHVybiBOdChOKHQsdFt3dF0pLG4pfSksUHQ9byhmdW5jdGlvbigpe3JldHVybiAxPT09bmV3IEsobmV3IFVpbnQxNkFycmF5KFsxXSkuYnVmZmVyKVswXX0pLE10PSEhSyYmISFLW1hdLnNldCYmbyhmdW5jdGlvbigpe25ldyBLKDEpLnNldCh7fSl9KSxBdD1mdW5jdGlvbih0LG4pe2lmKHZvaWQgMD09PXQpdGhyb3cgeihPdCk7dmFyIHI9K3QsZT1kKHQpO2lmKG4mJiF4KHIsZSkpdGhyb3cgVihPdCk7cmV0dXJuIGV9LEl0PWZ1bmN0aW9uKHQsbil7dmFyIHI9cCh0KTtpZihyPDB8fHIlbil0aHJvdyBWKCJXcm9uZyBvZmZzZXQhIik7cmV0dXJuIHJ9LGp0PWZ1bmN0aW9uKHQpe2lmKHcodCkmJl90IGluIHQpcmV0dXJuIHQ7dGhyb3cgeih0KyIgaXMgbm90IGEgdHlwZWQgYXJyYXkhIil9LE50PWZ1bmN0aW9uKHQsbil7aWYoISh3KHQpJiZtdCBpbiB0KSl0aHJvdyB6KCJJdCBpcyBub3QgYSB0eXBlZCBhcnJheSBjb25zdHJ1Y3RvciEiKTtyZXR1cm4gbmV3IHQobil9LGt0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIFJ0KE4odCx0W3d0XSksbil9LFJ0PWZ1bmN0aW9uKHQsbil7Zm9yKHZhciByPTAsZT1uLmxlbmd0aCxpPU50KHQsZSk7ZT5yOylpW3JdPW5bcisrXTtyZXR1cm4gaX0sVHQ9ZnVuY3Rpb24odCxuLHIpe1codCxuLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZFtyXX19KX0sTHQ9ZnVuY3Rpb24gZnJvbSh0KXt2YXIgbixyLGUsaSxvLHUsYz1TKHQpLGY9YXJndW1lbnRzLmxlbmd0aCxzPWY+MT9hcmd1bWVudHNbMV06dm9pZCAwLGw9dm9pZCAwIT09cyxoPVAoYyk7aWYodm9pZCAwIT1oJiYhXyhoKSl7Zm9yKHU9aC5jYWxsKGMpLGU9W10sbj0wOyEobz11Lm5leHQoKSkuZG9uZTtuKyspZS5wdXNoKG8udmFsdWUpO2M9ZX1mb3IobCYmZj4yJiYocz1hKHMsYXJndW1lbnRzWzJdLDIpKSxuPTAscj1kKGMubGVuZ3RoKSxpPU50KHRoaXMscik7cj5uO24rKylpW25dPWw/cyhjW25dLG4pOmNbbl07cmV0dXJuIGl9LEN0PWZ1bmN0aW9uIG9mKCl7Zm9yKHZhciB0PTAsbj1hcmd1bWVudHMubGVuZ3RoLHI9TnQodGhpcyxuKTtuPnQ7KXJbdF09YXJndW1lbnRzW3QrK107cmV0dXJuIHJ9LFV0PSEhSyYmbyhmdW5jdGlvbigpe2d0LmNhbGwobmV3IEsoMSkpfSksR3Q9ZnVuY3Rpb24gdG9Mb2NhbGVTdHJpbmcoKXtyZXR1cm4gZ3QuYXBwbHkoVXQ/ZHQuY2FsbChqdCh0aGlzKSk6anQodGhpcyksYXJndW1lbnRzKX0sRHQ9e2NvcHlXaXRoaW46ZnVuY3Rpb24gY29weVdpdGhpbih0LG4pe3JldHVybiBVLmNhbGwoanQodGhpcyksdCxuLGFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwKX0sZXZlcnk6ZnVuY3Rpb24gZXZlcnkodCl7cmV0dXJuIHJ0KGp0KHRoaXMpLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSxmaWxsOmZ1bmN0aW9uIGZpbGwodCl7cmV0dXJuIEMuYXBwbHkoanQodGhpcyksYXJndW1lbnRzKX0sZmlsdGVyOmZ1bmN0aW9uIGZpbHRlcih0KXtyZXR1cm4ga3QodGhpcyx0dChqdCh0aGlzKSx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKSl9LGZpbmQ6ZnVuY3Rpb24gZmluZCh0KXtyZXR1cm4gZXQoanQodGhpcyksdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9LGZpbmRJbmRleDpmdW5jdGlvbiBmaW5kSW5kZXgodCl7CnJldHVybiBpdChqdCh0aGlzKSx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX0sZm9yRWFjaDpmdW5jdGlvbiBmb3JFYWNoKHQpe1EoanQodGhpcyksdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9LGluZGV4T2Y6ZnVuY3Rpb24gaW5kZXhPZih0KXtyZXR1cm4gdXQoanQodGhpcyksdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9LGluY2x1ZGVzOmZ1bmN0aW9uIGluY2x1ZGVzKHQpe3JldHVybiBvdChqdCh0aGlzKSx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX0sam9pbjpmdW5jdGlvbiBqb2luKHQpe3JldHVybiB2dC5hcHBseShqdCh0aGlzKSxhcmd1bWVudHMpfSxsYXN0SW5kZXhPZjpmdW5jdGlvbiBsYXN0SW5kZXhPZih0KXtyZXR1cm4gc3QuYXBwbHkoanQodGhpcyksYXJndW1lbnRzKX0sbWFwOmZ1bmN0aW9uIG1hcCh0KXtyZXR1cm4gRnQoanQodGhpcyksdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9LHJlZHVjZTpmdW5jdGlvbiByZWR1Y2UodCl7cmV0dXJuIGx0LmFwcGx5KGp0KHRoaXMpLGFyZ3VtZW50cyl9LHJlZHVjZVJpZ2h0OmZ1bmN0aW9uIHJlZHVjZVJpZ2h0KHQpe3JldHVybiBodC5hcHBseShqdCh0aGlzKSxhcmd1bWVudHMpfSxyZXZlcnNlOmZ1bmN0aW9uIHJldmVyc2UoKXtmb3IodmFyIHQsbj10aGlzLHI9anQobikubGVuZ3RoLGU9TWF0aC5mbG9vcihyLzIpLGk9MDtpPGU7KXQ9bltpXSxuW2krK109blstLXJdLG5bcl09dDtyZXR1cm4gbn0sc29tZTpmdW5jdGlvbiBzb21lKHQpe3JldHVybiBudChqdCh0aGlzKSx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX0sc29ydDpmdW5jdGlvbiBzb3J0KHQpe3JldHVybiBwdC5jYWxsKGp0KHRoaXMpLHQpfSxzdWJhcnJheTpmdW5jdGlvbiBzdWJhcnJheSh0LG4pe3ZhciByPWp0KHRoaXMpLGU9ci5sZW5ndGgsaT15KHQsZSk7cmV0dXJuIG5ldyhOKHIsclt3dF0pKShyLmJ1ZmZlcixyLmJ5dGVPZmZzZXQraSpyLkJZVEVTX1BFUl9FTEVNRU5ULGQoKHZvaWQgMD09PW4/ZTp5KG4sZSkpLWkpKX19LFd0PWZ1bmN0aW9uIHNsaWNlKHQsbil7cmV0dXJuIGt0KHRoaXMsZHQuY2FsbChqdCh0aGlzKSx0LG4pKX0sQnQ9ZnVuY3Rpb24gc2V0KHQpe2p0KHRoaXMpO3ZhciBuPUl0KGFyZ3VtZW50c1sxXSwxKSxyPXRoaXMubGVuZ3RoLGU9Uyh0KSxpPWQoZS5sZW5ndGgpLG89MDtpZihpK24+cil0aHJvdyBWKE90KTtmb3IoO288aTspdGhpc1tuK29dPWVbbysrXX0sVnQ9e2VudHJpZXM6ZnVuY3Rpb24gZW50cmllcygpe3JldHVybiBhdC5jYWxsKGp0KHRoaXMpKX0sa2V5czpmdW5jdGlvbiBrZXlzKCl7cmV0dXJuIGZ0LmNhbGwoanQodGhpcykpfSx2YWx1ZXM6ZnVuY3Rpb24gdmFsdWVzKCl7cmV0dXJuIGN0LmNhbGwoanQodGhpcykpfX0senQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdyh0KSYmdFtfdF0mJiJzeW1ib2wiIT10eXBlb2YgbiYmbiBpbiB0JiZTdHJpbmcoK24pPT1TdHJpbmcobil9LEt0PWZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG4pe3JldHVybiB6dCh0LG49ZyhuLCEwKSk/bCgyLHRbbl0pOkIodCxuKX0sSnQ9ZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodCxuLHIpe3JldHVybiEoenQodCxuPWcobiwhMCkpJiZ3KHIpJiZiKHIsInZhbHVlIikpfHxiKHIsImdldCIpfHxiKHIsInNldCIpfHxyLmNvbmZpZ3VyYWJsZXx8YihyLCJ3cml0YWJsZSIpJiYhci53cml0YWJsZXx8YihyLCJlbnVtZXJhYmxlIikmJiFyLmVudW1lcmFibGU/Vyh0LG4scik6KHRbbl09ci52YWx1ZSx0KX07U3R8fChELmY9S3QsRy5mPUp0KSx1KHUuUyt1LkYqIVN0LCJPYmplY3QiLHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6S3QsZGVmaW5lUHJvcGVydHk6SnR9KSxvKGZ1bmN0aW9uKCl7eXQuY2FsbCh7fSl9KSYmKHl0PWd0PWZ1bmN0aW9uIHRvU3RyaW5nKCl7cmV0dXJuIHZ0LmNhbGwodGhpcyl9KTt2YXIgWXQ9dih7fSxEdCk7dihZdCxWdCksaChZdCxidCxWdC52YWx1ZXMpLHYoWXQse3NsaWNlOld0LHNldDpCdCxjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe30sdG9TdHJpbmc6eXQsdG9Mb2NhbGVTdHJpbmc6R3R9KSxUdChZdCwiYnVmZmVyIiwiYiIpLFR0KFl0LCJieXRlT2Zmc2V0IiwibyIpLFR0KFl0LCJieXRlTGVuZ3RoIiwibCIpLFR0KFl0LCJsZW5ndGgiLCJlIiksVyhZdCx4dCx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbX3RdfX0pLG4uZXhwb3J0cz1mdW5jdGlvbih0LG4scixmKXtmPSEhZjt2YXIgYT10KyhmPyJDbGFtcGVkIjoiIikrIkFycmF5IixsPSJVaW50OEFycmF5IiE9YSx2PSJnZXQiK3QscD0ic2V0Iit0LHk9aVthXSxnPXl8fHt9LGI9eSYmTyh5KSx4PSF5fHwhYy5BQlYsUz17fSxfPXkmJnlbWF0sUD1mdW5jdGlvbih0LHIpe3ZhciBlPXQuX2Q7cmV0dXJuIGUudlt2XShyKm4rZS5vLFB0KX0sTT1mdW5jdGlvbih0LHIsZSl7dmFyIGk9dC5fZDtmJiYoZT0oZT1NYXRoLnJvdW5kKGUpKTwwPzA6ZT4yNTU/MjU1OjI1NSZlKSxpLnZbcF0ocipuK2kubyxlLFB0KX0sQT1mdW5jdGlvbih0LG4pe1codCxuLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUCh0aGlzLG4pfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIE0odGhpcyxuLHQpfSxlbnVtZXJhYmxlOiEwfSl9O3g/KHk9cihmdW5jdGlvbih0LHIsZSxpKXtzKHQseSxhLCJfZCIpO3ZhciBvLHUsYyxmLGw9MCx2PTA7aWYodyhyKSl7aWYoIShyIGluc3RhbmNlb2YgSHx8KGY9bShyKSk9PUp8fGY9PVkpKXJldHVybiBfdCBpbiByP1J0KHkscik6THQuY2FsbCh5LHIpO289cix2PUl0KGUsbik7dmFyIHA9ci5ieXRlTGVuZ3RoO2lmKHZvaWQgMD09PWkpe2lmKHAlbil0aHJvdyBWKE90KTtpZih1PXAtdix1PDApdGhyb3cgVihPdCl9ZWxzZSBpZih1PWQoaSkqbix1K3Y+cCl0aHJvdyBWKE90KTtjPXUvbn1lbHNlIGM9QXQociwhMCksdT1jKm4sbz1uZXcgSCh1KTtmb3IoaCh0LCJfZCIse2I6byxvOnYsbDp1LGU6Yyx2Om5ldyBaKG8pfSk7bDxjOylBKHQsbCsrKX0pLF89eVtYXT1FKFl0KSxoKF8sImNvbnN0cnVjdG9yIix5KSk6VChmdW5jdGlvbih0KXtuZXcgeShudWxsKSxuZXcgeSh0KX0sITApfHwoeT1yKGZ1bmN0aW9uKHQscixlLGkpe3ModCx5LGEpO3ZhciBvO3JldHVybiB3KHIpP3IgaW5zdGFuY2VvZiBIfHwobz1tKHIpKT09Snx8bz09WT92b2lkIDAhPT1pP25ldyBnKHIsSXQoZSxuKSxpKTp2b2lkIDAhPT1lP25ldyBnKHIsSXQoZSxuKSk6bmV3IGcocik6X3QgaW4gcj9SdCh5LHIpOkx0LmNhbGwoeSxyKTpuZXcgZyhBdChyLGwpKX0pLFEoYiE9PUZ1bmN0aW9uLnByb3RvdHlwZT9GKGcpLmNvbmNhdChGKGIpKTpGKGcpLGZ1bmN0aW9uKHQpe3QgaW4geXx8aCh5LHQsZ1t0XSl9KSx5W1hdPV8sZXx8KF8uY29uc3RydWN0b3I9eSkpO3ZhciBJPV9bYnRdLGo9ISFJJiYoInZhbHVlcyI9PUkubmFtZXx8dm9pZCAwPT1JLm5hbWUpLE49VnQudmFsdWVzO2goeSxtdCwhMCksaChfLF90LGEpLGgoXyxFdCwhMCksaChfLHd0LHkpLChmP25ldyB5KDEpW3h0XT09YTp4dCBpbiBfKXx8VyhfLHh0LHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYX19KSxTW2FdPXksdSh1LkcrdS5XK3UuRiooeSE9ZyksUyksdSh1LlMsYSx7QllURVNfUEVSX0VMRU1FTlQ6bixmcm9tOkx0LG9mOkN0fSkscSBpbiBffHxoKF8scSxuKSx1KHUuUCxhLER0KSxMKGEpLHUodS5QK3UuRipNdCxhLHtzZXQ6QnR9KSx1KHUuUCt1LkYqIWosYSxWdCksdSh1LlArdS5GKihfLnRvU3RyaW5nIT15dCksYSx7dG9TdHJpbmc6eXR9KSx1KHUuUCt1LkYqbyhmdW5jdGlvbigpe25ldyB5KDEpLnNsaWNlKCl9KSxhLHtzbGljZTpXdH0pLHUodS5QK3UuRioobyhmdW5jdGlvbigpe3JldHVyblsxLDJdLnRvTG9jYWxlU3RyaW5nKCkhPW5ldyB5KFsxLDJdKS50b0xvY2FsZVN0cmluZygpfSl8fCFvKGZ1bmN0aW9uKCl7Xy50b0xvY2FsZVN0cmluZy5jYWxsKFsxLDJdKX0pKSxhLHt0b0xvY2FsZVN0cmluZzpHdH0pLFJbYV09aj9JOk4sZXx8anx8aChfLGJ0LE4pfX1lbHNlIG4uZXhwb3J0cz1mdW5jdGlvbigpe319LHsxMDU6MTA1LDEwNjoxMDYsMTA4OjEwOCwxMDk6MTA5LDExOjExLDExMDoxMTAsMTEyOjExMiwxMTM6MTEzLDExNDoxMTQsMTE3OjExNywxMTg6MTE4LDEyOjEyLDEzMDoxMzAsMTc6MTcsMjU6MjUsMjg6MjgsMzI6MzIsMzQ6MzQsMzg6MzgsMzk6MzksNDA6NDAsNDY6NDYsNDk6NDksNTQ6NTQsNTY6NTYsNTg6NTgsNjo2LDY2OjY2LDY3OjY3LDcwOjcwLDcyOjcyLDc0Ojc0LDg6OCw4NTo4NSw4Njo4Niw4OTo4OSw5OjksOTE6OTEsOTU6OTV9XSwxMTI6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgzOCksaT10KDI4KSxvPXQoNTgpLHU9dCgxMTMpLGM9dCg0MCksZj10KDg2KSxhPXQoMzQpLHM9dCg2KSxsPXQoMTA2KSxoPXQoMTA4KSx2PXQoNzIpLmYscD10KDY3KS5mLGQ9dCg5KSx5PXQoOTIpLGc9IkFycmF5QnVmZmVyIixiPSJEYXRhVmlldyIseD0icHJvdG90eXBlIixtPSJXcm9uZyBsZW5ndGghIix3PSJXcm9uZyBpbmRleCEiLFM9ZVtnXSxfPWVbYl0sRT1lLk1hdGgsTz1lLlJhbmdlRXJyb3IsRj1lLkluZmluaXR5LFA9UyxNPUUuYWJzLEE9RS5wb3csST1FLmZsb29yLGo9RS5sb2csTj1FLkxOMixrPSJidWZmZXIiLFI9ImJ5dGVMZW5ndGgiLFQ9ImJ5dGVPZmZzZXQiLEw9aT8iX2IiOmssQz1pPyJfbCI6UixVPWk/Il9vIjpULEc9ZnVuY3Rpb24odCxuLHIpe3ZhciBlLGksbyx1PUFycmF5KHIpLGM9OCpyLW4tMSxmPSgxPDxjKS0xLGE9Zj4+MSxzPTIzPT09bj9BKDIsLTI0KS1BKDIsLTc3KTowLGw9MCxoPXQ8MHx8MD09PXQmJjEvdDwwPzE6MDtmb3IodD1NKHQpLHQhPXR8fHQ9PT1GPyhpPXQhPXQ/MTowLGU9Zik6KGU9SShqKHQpL04pLHQqKG89QSgyLC1lKSk8MSYmKGUtLSxvKj0yKSx0Kz1lK2E+PTE/cy9vOnMqQSgyLDEtYSksdCpvPj0yJiYoZSsrLG8vPTIpLGUrYT49Zj8oaT0wLGU9Zik6ZSthPj0xPyhpPSh0Km8tMSkqQSgyLG4pLGUrPWEpOihpPXQqQSgyLGEtMSkqQSgyLG4pLGU9MCkpO24+PTg7dVtsKytdPTI1NSZpLGkvPTI1NixuLT04KTtmb3IoZT1lPDxufGksYys9bjtjPjA7dVtsKytdPTI1NSZlLGUvPTI1NixjLT04KTtyZXR1cm4gdVstLWxdfD0xMjgqaCx1fSxEPWZ1bmN0aW9uKHQsbixyKXt2YXIgZSxpPTgqci1uLTEsbz0oMTw8aSktMSx1PW8+PjEsYz1pLTcsZj1yLTEsYT10W2YtLV0scz0xMjcmYTtmb3IoYT4+PTc7Yz4wO3M9MjU2KnMrdFtmXSxmLS0sYy09OCk7Zm9yKGU9cyYoMTw8LWMpLTEscz4+PS1jLGMrPW47Yz4wO2U9MjU2KmUrdFtmXSxmLS0sYy09OCk7aWYoMD09PXMpcz0xLXU7ZWxzZXtpZihzPT09bylyZXR1cm4gZT9OYU46YT8tRjpGO2UrPUEoMixuKSxzLT11fXJldHVybihhPy0xOjEpKmUqQSgyLHMtbil9LFc9ZnVuY3Rpb24odCl7cmV0dXJuIHRbM108PDI0fHRbMl08PDE2fHRbMV08PDh8dFswXX0sQj1mdW5jdGlvbih0KXtyZXR1cm5bMjU1JnRdfSxWPWZ1bmN0aW9uKHQpe3JldHVyblsyNTUmdCx0Pj44JjI1NV19LHo9ZnVuY3Rpb24odCl7cmV0dXJuWzI1NSZ0LHQ+PjgmMjU1LHQ+PjE2JjI1NSx0Pj4yNCYyNTVdfSxLPWZ1bmN0aW9uKHQpe3JldHVybiBHKHQsNTIsOCl9LEo9ZnVuY3Rpb24odCl7cmV0dXJuIEcodCwyMyw0KX0sWT1mdW5jdGlvbih0LG4scil7cCh0W3hdLG4se2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzW3JdfX0pfSxxPWZ1bmN0aW9uKHQsbixyLGUpe3ZhciBpPStyLG89bChpKTtpZihpIT1vfHxvPDB8fG8rbj50W0NdKXRocm93IE8odyk7dmFyIHU9dFtMXS5fYixjPW8rdFtVXSxmPXUuc2xpY2UoYyxjK24pO3JldHVybiBlP2Y6Zi5yZXZlcnNlKCl9LFg9ZnVuY3Rpb24odCxuLHIsZSxpLG8pe3ZhciB1PStyLGM9bCh1KTtpZih1IT1jfHxjPDB8fGMrbj50W0NdKXRocm93IE8odyk7Zm9yKHZhciBmPXRbTF0uX2IsYT1jK3RbVV0scz1lKCtpKSxoPTA7aDxuO2grKylmW2EraF09c1tvP2g6bi1oLTFdfSwkPWZ1bmN0aW9uKHQsbil7cyh0LFMsZyk7dmFyIHI9K24sZT1oKHIpO2lmKHIhPWUpdGhyb3cgTyhtKTtyZXR1cm4gZX07aWYodS5BQlYpe2lmKCFhKGZ1bmN0aW9uKCl7bmV3IFN9KXx8IWEoZnVuY3Rpb24oKXtuZXcgUyguNSl9KSl7Uz1mdW5jdGlvbiBBcnJheUJ1ZmZlcih0KXtyZXR1cm4gbmV3IFAoJCh0aGlzLHQpKX07Zm9yKHZhciBILFo9U1t4XT1QW3hdLFE9dihQKSx0dD0wO1EubGVuZ3RoPnR0OykoSD1RW3R0KytdKWluIFN8fGMoUyxILFBbSF0pO298fChaLmNvbnN0cnVjdG9yPVMpfXZhciBudD1uZXcgXyhuZXcgUygyKSkscnQ9X1t4XS5zZXRJbnQ4O250LnNldEludDgoMCwyMTQ3NDgzNjQ4KSxudC5zZXRJbnQ4KDEsMjE0NzQ4MzY0OSksIW50LmdldEludDgoMCkmJm50LmdldEludDgoMSl8fGYoX1t4XSx7c2V0SW50ODpmdW5jdGlvbiBzZXRJbnQ4KHQsbil7cnQuY2FsbCh0aGlzLHQsbjw8MjQ+PjI0KX0sc2V0VWludDg6ZnVuY3Rpb24gc2V0VWludDgodCxuKXtydC5jYWxsKHRoaXMsdCxuPDwyND4+MjQpfX0sITApfWVsc2UgUz1mdW5jdGlvbiBBcnJheUJ1ZmZlcih0KXt2YXIgbj0kKHRoaXMsdCk7dGhpcy5fYj1kLmNhbGwoQXJyYXkobiksMCksdGhpc1tDXT1ufSxfPWZ1bmN0aW9uIERhdGFWaWV3KHQsbixyKXtzKHRoaXMsXyxiKSxzKHQsUyxiKTt2YXIgZT10W0NdLGk9bChuKTtpZihpPDB8fGk+ZSl0aHJvdyBPKCJXcm9uZyBvZmZzZXQhIik7aWYocj12b2lkIDA9PT1yP2UtaTpoKHIpLGkrcj5lKXRocm93IE8obSk7dGhpc1tMXT10LHRoaXNbVV09aSx0aGlzW0NdPXJ9LGkmJihZKFMsUiwiX2wiKSxZKF8saywiX2IiKSxZKF8sUiwiX2wiKSxZKF8sVCwiX28iKSksZihfW3hdLHtnZXRJbnQ4OmZ1bmN0aW9uIGdldEludDgodCl7cmV0dXJuIHEodGhpcywxLHQpWzBdPDwyND4+MjR9LGdldFVpbnQ4OmZ1bmN0aW9uIGdldFVpbnQ4KHQpe3JldHVybiBxKHRoaXMsMSx0KVswXX0sZ2V0SW50MTY6ZnVuY3Rpb24gZ2V0SW50MTYodCl7dmFyIG49cSh0aGlzLDIsdCxhcmd1bWVudHNbMV0pO3JldHVybihuWzFdPDw4fG5bMF0pPDwxNj4+MTZ9LGdldFVpbnQxNjpmdW5jdGlvbiBnZXRVaW50MTYodCl7dmFyIG49cSh0aGlzLDIsdCxhcmd1bWVudHNbMV0pO3JldHVybiBuWzFdPDw4fG5bMF19LGdldEludDMyOmZ1bmN0aW9uIGdldEludDMyKHQpe3JldHVybiBXKHEodGhpcyw0LHQsYXJndW1lbnRzWzFdKSl9LGdldFVpbnQzMjpmdW5jdGlvbiBnZXRVaW50MzIodCl7cmV0dXJuIFcocSh0aGlzLDQsdCxhcmd1bWVudHNbMV0pKT4+PjB9LGdldEZsb2F0MzI6ZnVuY3Rpb24gZ2V0RmxvYXQzMih0KXtyZXR1cm4gRChxKHRoaXMsNCx0LGFyZ3VtZW50c1sxXSksMjMsNCl9LGdldEZsb2F0NjQ6ZnVuY3Rpb24gZ2V0RmxvYXQ2NCh0KXtyZXR1cm4gRChxKHRoaXMsOCx0LGFyZ3VtZW50c1sxXSksNTIsOCl9LHNldEludDg6ZnVuY3Rpb24gc2V0SW50OCh0LG4pe1godGhpcywxLHQsQixuKX0sc2V0VWludDg6ZnVuY3Rpb24gc2V0VWludDgodCxuKXtYKHRoaXMsMSx0LEIsbil9LHNldEludDE2OmZ1bmN0aW9uIHNldEludDE2KHQsbil7WCh0aGlzLDIsdCxWLG4sYXJndW1lbnRzWzJdKX0sc2V0VWludDE2OmZ1bmN0aW9uIHNldFVpbnQxNih0LG4pe1godGhpcywyLHQsVixuLGFyZ3VtZW50c1syXSl9LHNldEludDMyOmZ1bmN0aW9uIHNldEludDMyKHQsbil7WCh0aGlzLDQsdCx6LG4sYXJndW1lbnRzWzJdKX0sc2V0VWludDMyOmZ1bmN0aW9uIHNldFVpbnQzMih0LG4pe1godGhpcyw0LHQseixuLGFyZ3VtZW50c1syXSl9LHNldEZsb2F0MzI6ZnVuY3Rpb24gc2V0RmxvYXQzMih0LG4pe1godGhpcyw0LHQsSixuLGFyZ3VtZW50c1syXSl9LHNldEZsb2F0NjQ6ZnVuY3Rpb24gc2V0RmxvYXQ2NCh0LG4pe1godGhpcyw4LHQsSyxuLGFyZ3VtZW50c1syXSl9fSk7eShTLGcpLHkoXyxiKSxjKF9beF0sdS5WSUVXLCEwKSxyW2ddPVMscltiXT1ffSx7MTA2OjEwNiwxMDg6MTA4LDExMzoxMTMsMjg6MjgsMzQ6MzQsMzg6MzgsNDA6NDAsNTg6NTgsNjo2LDY3OjY3LDcyOjcyLDg2Ojg2LDk6OSw5Mjo5Mn1dLDExMzpbZnVuY3Rpb24odCxuLHIpe2Zvcih2YXIgZSxpPXQoMzgpLG89dCg0MCksdT10KDExNCksYz11KCJ0eXBlZF9hcnJheSIpLGY9dSgidmlldyIpLGE9ISghaS5BcnJheUJ1ZmZlcnx8IWkuRGF0YVZpZXcpLHM9YSxsPTAsaD05LHY9IkludDhBcnJheSxVaW50OEFycmF5LFVpbnQ4Q2xhbXBlZEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5Ii5zcGxpdCgiLCIpO2w8aDspKGU9aVt2W2wrK11dKT8obyhlLnByb3RvdHlwZSxjLCEwKSxvKGUucHJvdG90eXBlLGYsITApKTpzPSExO24uZXhwb3J0cz17QUJWOmEsQ09OU1RSOnMsVFlQRUQ6YyxWSUVXOmZ9fSx7MTE0OjExNCwzODozOCw0MDo0MH1dLDExNDpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPTAsaT1NYXRoLnJhbmRvbSgpO24uZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4iU3ltYm9sKCIuY29uY2F0KHZvaWQgMD09PXQ/IiI6dCwiKV8iLCgrK2UraSkudG9TdHJpbmcoMzYpKX19LHt9XSwxMTU6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDM4KSxpPXQoMjMpLG89dCg1OCksdT10KDExNiksYz10KDY3KS5mO24uZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgbj1pLlN5bWJvbHx8KGkuU3ltYm9sPW8/e306ZS5TeW1ib2x8fHt9KTsiXyI9PXQuY2hhckF0KDApfHx0IGluIG58fGMobix0LHt2YWx1ZTp1LmYodCl9KX19LHsxMTY6MTE2LDIzOjIzLDM4OjM4LDU4OjU4LDY3OjY3fV0sMTE2OltmdW5jdGlvbih0LG4scil7ci5mPXQoMTE3KX0sezExNzoxMTd9XSwxMTc6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDk0KSgid2tzIiksaT10KDExNCksbz10KDM4KS5TeW1ib2wsdT0iZnVuY3Rpb24iPT10eXBlb2YgbyxjPW4uZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZVt0XXx8KGVbdF09dSYmb1t0XXx8KHU/bzppKSgiU3ltYm9sLiIrdCkpfTtjLnN0b3JlPWV9LHsxMTQ6MTE0LDM4OjM4LDk0Ojk0fV0sMTE4OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgxNyksaT10KDExNykoIml0ZXJhdG9yIiksbz10KDU2KTtuLmV4cG9ydHM9dCgyMykuZ2V0SXRlcmF0b3JNZXRob2Q9ZnVuY3Rpb24odCl7aWYodm9pZCAwIT10KXJldHVybiB0W2ldfHx0WyJAQGl0ZXJhdG9yIl18fG9bZSh0KV19fSx7MTE3OjExNywxNzoxNywyMzoyMyw1Njo1Nn1dLDExOTpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpLGk9dCg4OCkoL1tcXF4kKis/LigpfFtcXXt9XS9nLCJcXCQmIik7ZShlLlMsIlJlZ0V4cCIse2VzY2FwZTpmdW5jdGlvbiBlc2NhcGUodCl7cmV0dXJuIGkodCl9fSl9LHszMjozMiw4ODo4OH1dLDEyMDpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpO2UoZS5QLCJBcnJheSIse2NvcHlXaXRoaW46dCg4KX0pLHQoNSkoImNvcHlXaXRoaW4iKX0sezMyOjMyLDU6NSw4Ojh9XSwxMjE6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgzMiksaT10KDEyKSg0KTtlKGUuUCtlLkYqIXQoOTYpKFtdLmV2ZXJ5LCEwKSwiQXJyYXkiLHtldmVyeTpmdW5jdGlvbiBldmVyeSh0KXtyZXR1cm4gaSh0aGlzLHQsYXJndW1lbnRzWzFdKX19KX0sezEyOjEyLDMyOjMyLDk2Ojk2fV0sMTIyOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMik7ZShlLlAsIkFycmF5Iix7ZmlsbDp0KDkpfSksdCg1KSgiZmlsbCIpfSx7MzI6MzIsNTo1LDk6OX1dLDEyMzpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDMyKSxpPXQoMTIpKDIpO2UoZS5QK2UuRiohdCg5NikoW10uZmlsdGVyLCEwKSwiQXJyYXkiLHtmaWx0ZXI6ZnVuY3Rpb24gZmlsdGVyKHQpe3JldHVybiBpKHRoaXMsdCxhcmd1bWVudHNbMV0pfX0pfSx7MTI6MTIsMzI6MzIsOTY6OTZ9XSwxMjQ6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgzMiksaT10KDEyKSg2KSxvPSJmaW5kSW5kZXgiLHU9ITA7byBpbltdJiZBcnJheSgxKVtvXShmdW5jdGlvbigpe3U9ITF9KSxlKGUuUCtlLkYqdSwiQXJyYXkiLHtmaW5kSW5kZXg6ZnVuY3Rpb24gZmluZEluZGV4KHQpe3JldHVybiBpKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSksdCg1KShvKX0sezEyOjEyLDMyOjMyLDU6NX1dLDEyNTpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDMyKSxpPXQoMTIpKDUpLG89ImZpbmQiLHU9ITA7byBpbltdJiZBcnJheSgxKVtvXShmdW5jdGlvbigpe3U9ITF9KSxlKGUuUCtlLkYqdSwiQXJyYXkiLHtmaW5kOmZ1bmN0aW9uIGZpbmQodCl7cmV0dXJuIGkodGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KSx0KDUpKG8pfSx7MTI6MTIsMzI6MzIsNTo1fV0sMTI2OltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBlPXQoMzIpLGk9dCgxMikoMCksbz10KDk2KShbXS5mb3JFYWNoLCEwKTtlKGUuUCtlLkYqIW8sIkFycmF5Iix7Zm9yRWFjaDpmdW5jdGlvbiBmb3JFYWNoKHQpe3JldHVybiBpKHRoaXMsdCxhcmd1bWVudHNbMV0pfX0pfSx7MTI6MTIsMzI6MzIsOTY6OTZ9XSwxMjc6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgyNSksaT10KDMyKSxvPXQoMTA5KSx1PXQoNTEpLGM9dCg0NiksZj10KDEwOCksYT10KDI0KSxzPXQoMTE4KTtpKGkuUytpLkYqIXQoNTQpKGZ1bmN0aW9uKHQpe0FycmF5LmZyb20odCl9KSwiQXJyYXkiLHtmcm9tOmZ1bmN0aW9uIGZyb20odCl7dmFyIG4scixpLGwsaD1vKHQpLHY9ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXM/dGhpczpBcnJheSxwPWFyZ3VtZW50cy5sZW5ndGgsZD1wPjE/YXJndW1lbnRzWzFdOnZvaWQgMCx5PXZvaWQgMCE9PWQsZz0wLGI9cyhoKTtpZih5JiYoZD1lKGQscD4yP2FyZ3VtZW50c1syXTp2b2lkIDAsMikpLHZvaWQgMD09Ynx8dj09QXJyYXkmJmMoYikpZm9yKG49ZihoLmxlbmd0aCkscj1uZXcgdihuKTtuPmc7ZysrKWEocixnLHk/ZChoW2ddLGcpOmhbZ10pO2Vsc2UgZm9yKGw9Yi5jYWxsKGgpLHI9bmV3IHY7IShpPWwubmV4dCgpKS5kb25lO2crKylhKHIsZyx5P3UobCxkLFtpLnZhbHVlLGddLCEwKTppLnZhbHVlKTtyZXR1cm4gci5sZW5ndGg9ZyxyfX0pfSx7MTA4OjEwOCwxMDk6MTA5LDExODoxMTgsMjQ6MjQsMjU6MjUsMzI6MzIsNDY6NDYsNTE6NTEsNTQ6NTR9XSwxMjg6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgzMiksaT10KDExKSghMSksbz1bXS5pbmRleE9mLHU9ISFvJiYxL1sxXS5pbmRleE9mKDEsLTApPDA7ZShlLlArZS5GKih1fHwhdCg5NikobykpLCJBcnJheSIse2luZGV4T2Y6ZnVuY3Rpb24gaW5kZXhPZih0KXtyZXR1cm4gdT9vLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8MDppKHRoaXMsdCxhcmd1bWVudHNbMV0pfX0pfSx7MTE6MTEsMzI6MzIsOTY6OTZ9XSwxMjk6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKTtlKGUuUywiQXJyYXkiLHtpc0FycmF5OnQoNDcpfSl9LHszMjozMiw0Nzo0N31dLDEzMDpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDUpLGk9dCg1NSksbz10KDU2KSx1PXQoMTA3KTtuLmV4cG9ydHM9dCg1MykoQXJyYXksIkFycmF5IixmdW5jdGlvbih0LG4pe3RoaXMuX3Q9dSh0KSx0aGlzLl9pPTAsdGhpcy5faz1ufSxmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3Qsbj10aGlzLl9rLHI9dGhpcy5faSsrO3JldHVybiF0fHxyPj10Lmxlbmd0aD8odGhpcy5fdD12b2lkIDAsaSgxKSk6ImtleXMiPT1uP2koMCxyKToidmFsdWVzIj09bj9pKDAsdFtyXSk6aSgwLFtyLHRbcl1dKX0sInZhbHVlcyIpLG8uQXJndW1lbnRzPW8uQXJyYXksZSgia2V5cyIpLGUoInZhbHVlcyIpLGUoImVudHJpZXMiKX0sezEwNzoxMDcsNTo1LDUzOjUzLDU1OjU1LDU2OjU2fV0sMTMxOltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBlPXQoMzIpLGk9dCgxMDcpLG89W10uam9pbjtlKGUuUCtlLkYqKHQoNDUpIT1PYmplY3R8fCF0KDk2KShvKSksIkFycmF5Iix7am9pbjpmdW5jdGlvbiBqb2luKHQpe3JldHVybiBvLmNhbGwoaSh0aGlzKSx2b2lkIDA9PT10PyIsIjp0KX19KX0sezEwNzoxMDcsMzI6MzIsNDU6NDUsOTY6OTZ9XSwxMzI6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgzMiksaT10KDEwNyksbz10KDEwNiksdT10KDEwOCksYz1bXS5sYXN0SW5kZXhPZixmPSEhYyYmMS9bMV0ubGFzdEluZGV4T2YoMSwtMCk8MDtlKGUuUCtlLkYqKGZ8fCF0KDk2KShjKSksIkFycmF5Iix7bGFzdEluZGV4T2Y6ZnVuY3Rpb24gbGFzdEluZGV4T2YodCl7aWYoZilyZXR1cm4gYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fDA7dmFyIG49aSh0aGlzKSxyPXUobi5sZW5ndGgpLGU9ci0xO2Zvcihhcmd1bWVudHMubGVuZ3RoPjEmJihlPU1hdGgubWluKGUsbyhhcmd1bWVudHNbMV0pKSksZTwwJiYoZT1yK2UpO2U+PTA7ZS0tKWlmKGUgaW4gbiYmbltlXT09PXQpcmV0dXJuIGV8fDA7cmV0dXJuLTF9fSl9LHsxMDY6MTA2LDEwNzoxMDcsMTA4OjEwOCwzMjozMiw5Njo5Nn1dLDEzMzpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDMyKSxpPXQoMTIpKDEpO2UoZS5QK2UuRiohdCg5NikoW10ubWFwLCEwKSwiQXJyYXkiLHttYXA6ZnVuY3Rpb24gbWFwKHQpe3JldHVybiBpKHRoaXMsdCxhcmd1bWVudHNbMV0pfX0pfSx7MTI6MTIsMzI6MzIsOTY6OTZ9XSwxMzQ6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgzMiksaT10KDI0KTtlKGUuUytlLkYqdCgzNCkoZnVuY3Rpb24oKXtmdW5jdGlvbiBGKCl7fXJldHVybiEoQXJyYXkub2YuY2FsbChGKWluc3RhbmNlb2YgRil9KSwiQXJyYXkiLHtvZjpmdW5jdGlvbiBvZigpe2Zvcih2YXIgdD0wLG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldygiZnVuY3Rpb24iPT10eXBlb2YgdGhpcz90aGlzOkFycmF5KShuKTtuPnQ7KWkocix0LGFyZ3VtZW50c1t0KytdKTtyZXR1cm4gci5sZW5ndGg9bixyfX0pfSx7MjQ6MjQsMzI6MzIsMzQ6MzR9XSwxMzU6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgzMiksaT10KDEzKTtlKGUuUCtlLkYqIXQoOTYpKFtdLnJlZHVjZVJpZ2h0LCEwKSwiQXJyYXkiLHtyZWR1Y2VSaWdodDpmdW5jdGlvbiByZWR1Y2VSaWdodCh0KXtyZXR1cm4gaSh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aCxhcmd1bWVudHNbMV0sITApfX0pfSx7MTM6MTMsMzI6MzIsOTY6OTZ9XSwxMzY6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgzMiksaT10KDEzKTtlKGUuUCtlLkYqIXQoOTYpKFtdLnJlZHVjZSwhMCksIkFycmF5Iix7cmVkdWNlOmZ1bmN0aW9uIHJlZHVjZSh0KXtyZXR1cm4gaSh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aCxhcmd1bWVudHNbMV0sITEpfX0pfSx7MTM6MTMsMzI6MzIsOTY6OTZ9XSwxMzc6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgzMiksaT10KDQxKSxvPXQoMTgpLHU9dCgxMDUpLGM9dCgxMDgpLGY9W10uc2xpY2U7ZShlLlArZS5GKnQoMzQpKGZ1bmN0aW9uKCl7aSYmZi5jYWxsKGkpfSksIkFycmF5Iix7c2xpY2U6ZnVuY3Rpb24gc2xpY2UodCxuKXt2YXIgcj1jKHRoaXMubGVuZ3RoKSxlPW8odGhpcyk7aWYobj12b2lkIDA9PT1uP3I6biwiQXJyYXkiPT1lKXJldHVybiBmLmNhbGwodGhpcyx0LG4pO2Zvcih2YXIgaT11KHQsciksYT11KG4scikscz1jKGEtaSksbD1BcnJheShzKSxoPTA7aDxzO2grKylsW2hdPSJTdHJpbmciPT1lP3RoaXMuY2hhckF0KGkraCk6dGhpc1tpK2hdO3JldHVybiBsfX0pfSx7MTA1OjEwNSwxMDg6MTA4LDE4OjE4LDMyOjMyLDM0OjM0LDQxOjQxfV0sMTM4OltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBlPXQoMzIpLGk9dCgxMikoMyk7ZShlLlArZS5GKiF0KDk2KShbXS5zb21lLCEwKSwiQXJyYXkiLHtzb21lOmZ1bmN0aW9uIHNvbWUodCl7cmV0dXJuIGkodGhpcyx0LGFyZ3VtZW50c1sxXSl9fSl9LHsxMjoxMiwzMjozMiw5Njo5Nn1dLDEzOTpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDMyKSxpPXQoMyksbz10KDEwOSksdT10KDM0KSxjPVtdLnNvcnQsZj1bMSwyLDNdO2UoZS5QK2UuRioodShmdW5jdGlvbigpe2Yuc29ydCh2b2lkIDApfSl8fCF1KGZ1bmN0aW9uKCl7Zi5zb3J0KG51bGwpfSl8fCF0KDk2KShjKSksIkFycmF5Iix7c29ydDpmdW5jdGlvbiBzb3J0KHQpe3JldHVybiB2b2lkIDA9PT10P2MuY2FsbChvKHRoaXMpKTpjLmNhbGwobyh0aGlzKSxpKHQpKX19KX0sezEwOToxMDksMzozLDMyOjMyLDM0OjM0LDk2Ojk2fV0sMTQwOltmdW5jdGlvbih0LG4scil7dCg5MSkoIkFycmF5Iil9LHs5MTo5MX1dLDE0MTpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpO2UoZS5TLCJEYXRlIix7bm93OmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9fSl9LHszMjozMn1dLDE0MjpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDMyKSxpPXQoMzQpLG89RGF0ZS5wcm90b3R5cGUuZ2V0VGltZSx1PWZ1bmN0aW9uKHQpe3JldHVybiB0Pjk/dDoiMCIrdH07ZShlLlArZS5GKihpKGZ1bmN0aW9uKCl7cmV0dXJuIjAzODUtMDctMjVUMDc6MDY6MzkuOTk5WiIhPW5ldyBEYXRlKC01ZTEzLTEpLnRvSVNPU3RyaW5nKCl9KXx8IWkoZnVuY3Rpb24oKXtuZXcgRGF0ZShOYU4pLnRvSVNPU3RyaW5nKCl9KSksIkRhdGUiLHt0b0lTT1N0cmluZzpmdW5jdGlvbiB0b0lTT1N0cmluZygpe2lmKCFpc0Zpbml0ZShvLmNhbGwodGhpcykpKXRocm93IFJhbmdlRXJyb3IoIkludmFsaWQgdGltZSB2YWx1ZSIpO3ZhciB0PXRoaXMsbj10LmdldFVUQ0Z1bGxZZWFyKCkscj10LmdldFVUQ01pbGxpc2Vjb25kcygpLGU9bjwwPyItIjpuPjk5OTk/IisiOiIiO3JldHVybiBlKygiMDAwMDAiK01hdGguYWJzKG4pKS5zbGljZShlPy02Oi00KSsiLSIrdSh0LmdldFVUQ01vbnRoKCkrMSkrIi0iK3UodC5nZXRVVENEYXRlKCkpKyJUIit1KHQuZ2V0VVRDSG91cnMoKSkrIjoiK3UodC5nZXRVVENNaW51dGVzKCkpKyI6Iit1KHQuZ2V0VVRDU2Vjb25kcygpKSsiLiIrKHI+OTk/cjoiMCIrdShyKSkrIloifX0pfSx7MzI6MzIsMzQ6MzR9XSwxNDM6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgzMiksaT10KDEwOSksbz10KDExMCk7ZShlLlArZS5GKnQoMzQpKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT1uZXcgRGF0ZShOYU4pLnRvSlNPTigpfHwxIT09RGF0ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoe3RvSVNPU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIDF9fSl9KSwiRGF0ZSIse3RvSlNPTjpmdW5jdGlvbiB0b0pTT04odCl7dmFyIG49aSh0aGlzKSxyPW8obik7cmV0dXJuIm51bWJlciIhPXR5cGVvZiByfHxpc0Zpbml0ZShyKT9uLnRvSVNPU3RyaW5nKCk6bnVsbH19KX0sezEwOToxMDksMTEwOjExMCwzMjozMiwzNDozNH1dLDE0NDpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMTE3KSgidG9QcmltaXRpdmUiKSxpPURhdGUucHJvdG90eXBlO2UgaW4gaXx8dCg0MCkoaSxlLHQoMjYpKX0sezExNzoxMTcsMjY6MjYsNDA6NDB9XSwxNDU6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT1EYXRlLnByb3RvdHlwZSxpPSJJbnZhbGlkIERhdGUiLG89InRvU3RyaW5nIix1PWVbb10sYz1lLmdldFRpbWU7bmV3IERhdGUoTmFOKSsiIiE9aSYmdCg4NykoZSxvLGZ1bmN0aW9uIHRvU3RyaW5nKCl7dmFyIHQ9Yy5jYWxsKHRoaXMpO3JldHVybiB0PT09dD91LmNhbGwodGhpcyk6aX0pfSx7ODc6ODd9XSwxNDY6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKTtlKGUuUCwiRnVuY3Rpb24iLHtiaW5kOnQoMTYpfSl9LHsxNjoxNiwzMjozMn1dLDE0NzpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDQ5KSxpPXQoNzQpLG89dCgxMTcpKCJoYXNJbnN0YW5jZSIpLHU9RnVuY3Rpb24ucHJvdG90eXBlO28gaW4gdXx8dCg2NykuZih1LG8se3ZhbHVlOmZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzfHwhZSh0KSlyZXR1cm4hMTtpZighZSh0aGlzLnByb3RvdHlwZSkpcmV0dXJuIHQgaW5zdGFuY2VvZiB0aGlzO2Zvcig7dD1pKHQpOylpZih0aGlzLnByb3RvdHlwZT09PXQpcmV0dXJuITA7cmV0dXJuITF9fSl9LHsxMTc6MTE3LDQ5OjQ5LDY3OjY3LDc0Ojc0fV0sMTQ4OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg2NykuZixpPXQoODUpLG89dCgzOSksdT1GdW5jdGlvbi5wcm90b3R5cGUsYz0vXlxzKmZ1bmN0aW9uIChbXiAoXSopLyxmPSJuYW1lIixhPU9iamVjdC5pc0V4dGVuc2libGV8fGZ1bmN0aW9uKCl7cmV0dXJuITB9O2YgaW4gdXx8dCgyOCkmJmUodSxmLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dHJ5e3ZhciB0PXRoaXMsbj0oIiIrdCkubWF0Y2goYylbMV07cmV0dXJuIG8odCxmKXx8IWEodCl8fGUodCxmLGkoNSxuKSksbn1jYXRjaCh0KXtyZXR1cm4iIn19fSl9LHsyODoyOCwzOTozOSw2Nzo2Nyw4NTo4NX1dLDE0OTpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDE5KTtuLmV4cG9ydHM9dCgyMikoIk1hcCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIE1hcCgpe3JldHVybiB0KHRoaXMsYXJndW1lbnRzLmxlbmd0aD4wP2FyZ3VtZW50c1swXTp2b2lkIDApfX0se2dldDpmdW5jdGlvbiBnZXQodCl7dmFyIG49ZS5nZXRFbnRyeSh0aGlzLHQpO3JldHVybiBuJiZuLnZ9LHNldDpmdW5jdGlvbiBzZXQodCxuKXtyZXR1cm4gZS5kZWYodGhpcywwPT09dD8wOnQsbil9fSxlLCEwKX0sezE5OjE5LDIyOjIyfV0sMTUwOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMiksaT10KDYwKSxvPU1hdGguc3FydCx1PU1hdGguYWNvc2g7ZShlLlMrZS5GKiEodSYmNzEwPT1NYXRoLmZsb29yKHUoTnVtYmVyLk1BWF9WQUxVRSkpJiZ1KDEvMCk9PTEvMCksIk1hdGgiLHthY29zaDpmdW5jdGlvbiBhY29zaCh0KXtyZXR1cm4odD0rdCk8MT9OYU46dD45NDkwNjI2NS42MjQyNTE1Nj9NYXRoLmxvZyh0KStNYXRoLkxOMjppKHQtMStvKHQtMSkqbyh0KzEpKX19KX0sezMyOjMyLDYwOjYwfV0sMTUxOltmdW5jdGlvbih0LG4scil7ZnVuY3Rpb24gYXNpbmgodCl7cmV0dXJuIGlzRmluaXRlKHQ9K3QpJiYwIT10P3Q8MD8tYXNpbmgoLXQpOk1hdGgubG9nKHQrTWF0aC5zcXJ0KHQqdCsxKSk6dH12YXIgZT10KDMyKSxpPU1hdGguYXNpbmg7ZShlLlMrZS5GKiEoaSYmMS9pKDApPjApLCJNYXRoIix7YXNpbmg6YXNpbmh9KX0sezMyOjMyfV0sMTUyOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMiksaT1NYXRoLmF0YW5oO2UoZS5TK2UuRiohKGkmJjEvaSgtMCk8MCksIk1hdGgiLHthdGFuaDpmdW5jdGlvbiBhdGFuaCh0KXtyZXR1cm4gMD09KHQ9K3QpP3Q6TWF0aC5sb2coKDErdCkvKDEtdCkpLzJ9fSl9LHszMjozMn1dLDE1MzpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpLGk9dCg2MSk7ZShlLlMsIk1hdGgiLHtjYnJ0OmZ1bmN0aW9uIGNicnQodCl7cmV0dXJuIGkodD0rdCkqTWF0aC5wb3coTWF0aC5hYnModCksMS8zKX19KX0sezMyOjMyLDYxOjYxfV0sMTU0OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMik7ZShlLlMsIk1hdGgiLHtjbHozMjpmdW5jdGlvbiBjbHozMih0KXtyZXR1cm4odD4+Pj0wKT8zMS1NYXRoLmZsb29yKE1hdGgubG9nKHQrLjUpKk1hdGguTE9HMkUpOjMyfX0pfSx7MzI6MzJ9XSwxNTU6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKSxpPU1hdGguZXhwO2UoZS5TLCJNYXRoIix7Y29zaDpmdW5jdGlvbiBjb3NoKHQpe3JldHVybihpKHQ9K3QpK2koLXQpKS8yfX0pfSx7MzI6MzJ9XSwxNTY6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKSxpPXQoNTkpO2UoZS5TK2UuRiooaSE9TWF0aC5leHBtMSksIk1hdGgiLHtleHBtMTppfSl9LHszMjozMiw1OTo1OX1dLDE1NzpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpLGk9dCg2MSksbz1NYXRoLnBvdyx1PW8oMiwtNTIpLGM9bygyLC0yMyksZj1vKDIsMTI3KSooMi1jKSxhPW8oMiwtMTI2KSxzPWZ1bmN0aW9uKHQpe3JldHVybiB0KzEvdS0xL3V9O2UoZS5TLCJNYXRoIix7ZnJvdW5kOmZ1bmN0aW9uIGZyb3VuZCh0KXt2YXIgbixyLGU9TWF0aC5hYnModCksbz1pKHQpO3JldHVybiBlPGE/bypzKGUvYS9jKSphKmM6KG49KDErYy91KSplLHI9bi0obi1lKSxyPmZ8fHIhPXI/byooMS8wKTpvKnIpfX0pfSx7MzI6MzIsNjE6NjF9XSwxNTg6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKSxpPU1hdGguYWJzO2UoZS5TLCJNYXRoIix7aHlwb3Q6ZnVuY3Rpb24gaHlwb3QodCxuKXtmb3IodmFyIHIsZSxvPTAsdT0wLGM9YXJndW1lbnRzLmxlbmd0aCxmPTA7dTxjOylyPWkoYXJndW1lbnRzW3UrK10pLGY8cj8oZT1mL3Isbz1vKmUqZSsxLGY9cik6cj4wPyhlPXIvZixvKz1lKmUpOm8rPXI7cmV0dXJuIGY9PT0xLzA/MS8wOmYqTWF0aC5zcXJ0KG8pfX0pfSx7MzI6MzJ9XSwxNTk6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKSxpPU1hdGguaW11bDtlKGUuUytlLkYqdCgzNCkoZnVuY3Rpb24oKXtyZXR1cm4gaSg0Mjk0OTY3Mjk1LDUpIT0tNXx8MiE9aS5sZW5ndGh9KSwiTWF0aCIse2ltdWw6ZnVuY3Rpb24gaW11bCh0LG4pe3ZhciByPTY1NTM1LGU9K3QsaT0rbixvPXImZSx1PXImaTtyZXR1cm4gMHxvKnUrKChyJmU+Pj4xNikqdStvKihyJmk+Pj4xNik8PDE2Pj4+MCl9fSl9LHszMjozMiwzNDozNH1dLDE2MDpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpO2UoZS5TLCJNYXRoIix7bG9nMTA6ZnVuY3Rpb24gbG9nMTAodCl7cmV0dXJuIE1hdGgubG9nKHQpL01hdGguTE4xMH19KX0sezMyOjMyfV0sMTYxOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMik7ZShlLlMsIk1hdGgiLHtsb2cxcDp0KDYwKX0pfSx7MzI6MzIsNjA6NjB9XSwxNjI6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKTtlKGUuUywiTWF0aCIse2xvZzI6ZnVuY3Rpb24gbG9nMih0KXtyZXR1cm4gTWF0aC5sb2codCkvTWF0aC5MTjJ9fSl9LHszMjozMn1dLDE2MzpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpO2UoZS5TLCJNYXRoIix7c2lnbjp0KDYxKX0pfSx7MzI6MzIsNjE6NjF9XSwxNjQ6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKSxpPXQoNTkpLG89TWF0aC5leHA7ZShlLlMrZS5GKnQoMzQpKGZ1bmN0aW9uKCl7cmV0dXJuIU1hdGguc2luaCgtMmUtMTcpIT0tMmUtMTd9KSwiTWF0aCIse3Npbmg6ZnVuY3Rpb24gc2luaCh0KXtyZXR1cm4gTWF0aC5hYnModD0rdCk8MT8oaSh0KS1pKC10KSkvMjoobyh0LTEpLW8oLXQtMSkpKihNYXRoLkUvMil9fSl9LHszMjozMiwzNDozNCw1OTo1OX1dLDE2NTpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpLGk9dCg1OSksbz1NYXRoLmV4cDtlKGUuUywiTWF0aCIse3Rhbmg6ZnVuY3Rpb24gdGFuaCh0KXt2YXIgbj1pKHQ9K3QpLHI9aSgtdCk7cmV0dXJuIG49PTEvMD8xOnI9PTEvMD8tMToobi1yKS8obyh0KStvKC10KSl9fSl9LHszMjozMiw1OTo1OX1dLDE2NjpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpO2UoZS5TLCJNYXRoIix7dHJ1bmM6ZnVuY3Rpb24gdHJ1bmModCl7cmV0dXJuKHQ+MD9NYXRoLmZsb29yOk1hdGguY2VpbCkodCl9fSl9LHszMjozMn1dLDE2NzpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDM4KSxpPXQoMzkpLG89dCgxOCksdT10KDQzKSxjPXQoMTEwKSxmPXQoMzQpLGE9dCg3MikuZixzPXQoNzApLmYsbD10KDY3KS5mLGg9dCgxMDIpLnRyaW0sdj0iTnVtYmVyIixwPWVbdl0sZD1wLHk9cC5wcm90b3R5cGUsZz1vKHQoNjYpKHkpKT09dixiPSJ0cmltImluIFN0cmluZy5wcm90b3R5cGUseD1mdW5jdGlvbih0KXt2YXIgbj1jKHQsITEpO2lmKCJzdHJpbmciPT10eXBlb2YgbiYmbi5sZW5ndGg+Mil7bj1iP24udHJpbSgpOmgobiwzKTt2YXIgcixlLGksbz1uLmNoYXJDb2RlQXQoMCk7aWYoNDM9PT1vfHw0NT09PW8pe2lmKHI9bi5jaGFyQ29kZUF0KDIpLDg4PT09cnx8MTIwPT09cilyZXR1cm4gTmFOfWVsc2UgaWYoNDg9PT1vKXtzd2l0Y2gobi5jaGFyQ29kZUF0KDEpKXtjYXNlIDY2OmNhc2UgOTg6ZT0yLGk9NDk7YnJlYWs7Y2FzZSA3OTpjYXNlIDExMTplPTgsaT01NTticmVhaztkZWZhdWx0OnJldHVybitufWZvcih2YXIgdSxmPW4uc2xpY2UoMiksYT0wLHM9Zi5sZW5ndGg7YTxzO2ErKylpZih1PWYuY2hhckNvZGVBdChhKSx1PDQ4fHx1PmkpcmV0dXJuIE5hTjtyZXR1cm4gcGFyc2VJbnQoZixlKX19cmV0dXJuK259O2lmKCFwKCIgMG8xIil8fCFwKCIwYjEiKXx8cCgiKzB4MSIpKXtwPWZ1bmN0aW9uIE51bWJlcih0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPDE/MDp0LHI9dGhpcztyZXR1cm4gciBpbnN0YW5jZW9mIHAmJihnP2YoZnVuY3Rpb24oKXt5LnZhbHVlT2YuY2FsbChyKX0pOm8ocikhPXYpP3UobmV3IGQoeChuKSkscixwKTp4KG4pfTtmb3IodmFyIG0sdz10KDI4KT9hKGQpOiJNQVhfVkFMVUUsTUlOX1ZBTFVFLE5hTixORUdBVElWRV9JTkZJTklUWSxQT1NJVElWRV9JTkZJTklUWSxFUFNJTE9OLGlzRmluaXRlLGlzSW50ZWdlcixpc05hTixpc1NhZmVJbnRlZ2VyLE1BWF9TQUZFX0lOVEVHRVIsTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlciIuc3BsaXQoIiwiKSxTPTA7dy5sZW5ndGg+UztTKyspaShkLG09d1tTXSkmJiFpKHAsbSkmJmwocCxtLHMoZCxtKSk7cC5wcm90b3R5cGU9eSx5LmNvbnN0cnVjdG9yPXAsdCg4NykoZSx2LHApfX0sezEwMjoxMDIsMTEwOjExMCwxODoxOCwyODoyOCwzNDozNCwzODozOCwzOTozOSw0Mzo0Myw2Njo2Niw2Nzo2Nyw3MDo3MCw3Mjo3Miw4Nzo4N31dLDE2ODpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpO2UoZS5TLCJOdW1iZXIiLHtFUFNJTE9OOk1hdGgucG93KDIsLTUyKX0pfSx7MzI6MzJ9XSwxNjk6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKSxpPXQoMzgpLmlzRmluaXRlO2UoZS5TLCJOdW1iZXIiLHtpc0Zpbml0ZTpmdW5jdGlvbiBpc0Zpbml0ZSh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJmkodCl9fSl9LHszMjozMiwzODozOH1dLDE3MDpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpO2UoZS5TLCJOdW1iZXIiLHtpc0ludGVnZXI6dCg0OCl9KX0sezMyOjMyLDQ4OjQ4fV0sMTcxOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMik7ZShlLlMsIk51bWJlciIse2lzTmFOOmZ1bmN0aW9uIGlzTmFOKHQpe3JldHVybiB0IT10fX0pfSx7MzI6MzJ9XSwxNzI6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKSxpPXQoNDgpLG89TWF0aC5hYnM7ZShlLlMsIk51bWJlciIse2lzU2FmZUludGVnZXI6ZnVuY3Rpb24gaXNTYWZlSW50ZWdlcih0KXtyZXR1cm4gaSh0KSYmbyh0KTw9OTAwNzE5OTI1NDc0MDk5MX19KX0sezMyOjMyLDQ4OjQ4fV0sMTczOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMik7ZShlLlMsIk51bWJlciIse01BWF9TQUZFX0lOVEVHRVI6OTAwNzE5OTI1NDc0MDk5MX0pfSx7MzI6MzJ9XSwxNzQ6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKTtlKGUuUywiTnVtYmVyIix7TUlOX1NBRkVfSU5URUdFUjotOTAwNzE5OTI1NDc0MDk5MX0pfSx7MzI6MzJ9XSwxNzU6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKSxpPXQoODEpO2UoZS5TK2UuRiooTnVtYmVyLnBhcnNlRmxvYXQhPWkpLCJOdW1iZXIiLHtwYXJzZUZsb2F0Oml9KX0sezMyOjMyLDgxOjgxfV0sMTc2OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMiksaT10KDgyKTtlKGUuUytlLkYqKE51bWJlci5wYXJzZUludCE9aSksIk51bWJlciIse3BhcnNlSW50Oml9KX0sezMyOjMyLDgyOjgyfV0sMTc3OltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBlPXQoMzIpLGk9dCgxMDYpLG89dCg0KSx1PXQoMTAxKSxjPTEuLnRvRml4ZWQsZj1NYXRoLmZsb29yLGE9WzAsMCwwLDAsMCwwXSxzPSJOdW1iZXIudG9GaXhlZDogaW5jb3JyZWN0IGludm9jYXRpb24hIixsPSIwIixoPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciByPS0xLGU9bjsrK3I8NjspZSs9dCphW3JdLGFbcl09ZSUxZTcsZT1mKGUvMWU3KX0sdj1mdW5jdGlvbih0KXtmb3IodmFyIG49NixyPTA7LS1uPj0wOylyKz1hW25dLGFbbl09ZihyL3QpLHI9ciV0KjFlN30scD1mdW5jdGlvbigpe2Zvcih2YXIgdD02LG49IiI7LS10Pj0wOylpZigiIiE9PW58fDA9PT10fHwwIT09YVt0XSl7dmFyIHI9U3RyaW5nKGFbdF0pO249IiI9PT1uP3I6bit1LmNhbGwobCw3LXIubGVuZ3RoKStyfXJldHVybiBufSxkPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gMD09PW4/cjpuJTI9PT0xP2QodCxuLTEscip0KTpkKHQqdCxuLzIscil9LHk9ZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAscj10O3I+PTQwOTY7KW4rPTEyLHIvPTQwOTY7Zm9yKDtyPj0yOyluKz0xLHIvPTI7cmV0dXJuIG59O2UoZS5QK2UuRiooISFjJiYoIjAuMDAwIiE9PThlLTUudG9GaXhlZCgzKXx8IjEiIT09LjkudG9GaXhlZCgwKXx8IjEuMjUiIT09MS4yNTUudG9GaXhlZCgyKXx8IjEwMDAwMDAwMDAwMDAwMDAxMjgiIT09KDB4ZGUwYjZiM2E3NjQwMDgwKS50b0ZpeGVkKDApKXx8IXQoMzQpKGZ1bmN0aW9uKCl7Yy5jYWxsKHt9KX0pKSwiTnVtYmVyIix7dG9GaXhlZDpmdW5jdGlvbiB0b0ZpeGVkKHQpe3ZhciBuLHIsZSxjLGY9byh0aGlzLHMpLGE9aSh0KSxnPSIiLGI9bDtpZihhPDB8fGE+MjApdGhyb3cgUmFuZ2VFcnJvcihzKTtpZihmIT1mKXJldHVybiJOYU4iO2lmKGY8PS0xZTIxfHxmPj0xZTIxKXJldHVybiBTdHJpbmcoZik7aWYoZjwwJiYoZz0iLSIsZj0tZiksZj4xZS0yMSlpZihuPXkoZipkKDIsNjksMSkpLTY5LHI9bjwwP2YqZCgyLC1uLDEpOmYvZCgyLG4sMSkscio9NDUwMzU5OTYyNzM3MDQ5NixuPTUyLW4sbj4wKXtmb3IoaCgwLHIpLGU9YTtlPj03OyloKDFlNywwKSxlLT03O2ZvcihoKGQoMTAsZSwxKSwwKSxlPW4tMTtlPj0yMzspdigxPDwyMyksZS09MjM7digxPDxlKSxoKDEsMSksdigyKSxiPXAoKX1lbHNlIGgoMCxyKSxoKDE8PC1uLDApLGI9cCgpK3UuY2FsbChsLGEpO3JldHVybiBhPjA/KGM9Yi5sZW5ndGgsYj1nKyhjPD1hPyIwLiIrdS5jYWxsKGwsYS1jKStiOmIuc2xpY2UoMCxjLWEpKyIuIitiLnNsaWNlKGMtYSkpKTpiPWcrYixifX0pfSx7MTAxOjEwMSwxMDY6MTA2LDMyOjMyLDM0OjM0LDQ6NH1dLDE3ODpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDMyKSxpPXQoMzQpLG89dCg0KSx1PTEuLnRvUHJlY2lzaW9uO2UoZS5QK2UuRiooaShmdW5jdGlvbigpe3JldHVybiIxIiE9PXUuY2FsbCgxLHZvaWQgMCl9KXx8IWkoZnVuY3Rpb24oKXt1LmNhbGwoe30pfSkpLCJOdW1iZXIiLHt0b1ByZWNpc2lvbjpmdW5jdGlvbiB0b1ByZWNpc2lvbih0KXt2YXIgbj1vKHRoaXMsIk51bWJlciN0b1ByZWNpc2lvbjogaW5jb3JyZWN0IGludm9jYXRpb24hIik7cmV0dXJuIHZvaWQgMD09PXQ/dS5jYWxsKG4pOnUuY2FsbChuLHQpfX0pfSx7MzI6MzIsMzQ6MzQsNDo0fV0sMTc5OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMik7ZShlLlMrZS5GLCJPYmplY3QiLHthc3NpZ246dCg2NSl9KX0sezMyOjMyLDY1OjY1fV0sMTgwOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMik7ZShlLlMsIk9iamVjdCIse2NyZWF0ZTp0KDY2KX0pfSx7MzI6MzIsNjY6NjZ9XSwxODE6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKTtlKGUuUytlLkYqIXQoMjgpLCJPYmplY3QiLHtkZWZpbmVQcm9wZXJ0aWVzOnQoNjgpfSl9LHsyODoyOCwzMjozMiw2ODo2OH1dLDE4MjpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpO2UoZS5TK2UuRiohdCgyOCksIk9iamVjdCIse2RlZmluZVByb3BlcnR5OnQoNjcpLmZ9KX0sezI4OjI4LDMyOjMyLDY3OjY3fV0sMTgzOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg0OSksaT10KDYyKS5vbkZyZWV6ZTt0KDc4KSgiZnJlZXplIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gZnJlZXplKG4pe3JldHVybiB0JiZlKG4pP3QoaShuKSk6bn19KX0sezQ5OjQ5LDYyOjYyLDc4Ojc4fV0sMTg0OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgxMDcpLGk9dCg3MCkuZjt0KDc4KSgiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKXtyZXR1cm4gaShlKHQpLG4pfX0pfSx7MTA3OjEwNyw3MDo3MCw3ODo3OH1dLDE4NTpbZnVuY3Rpb24odCxuLHIpe3QoNzgpKCJnZXRPd25Qcm9wZXJ0eU5hbWVzIixmdW5jdGlvbigpe3JldHVybiB0KDcxKS5mfSl9LHs3MTo3MSw3ODo3OH1dLDE4NjpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMTA5KSxpPXQoNzQpO3QoNzgpKCJnZXRQcm90b3R5cGVPZiIsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuIGkoZSh0KSl9fSl9LHsxMDk6MTA5LDc0Ojc0LDc4Ojc4fV0sMTg3OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg0OSk7dCg3OCkoImlzRXh0ZW5zaWJsZSIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShuKXtyZXR1cm4hIWUobikmJighdHx8dChuKSl9fSl9LHs0OTo0OSw3ODo3OH1dLDE4ODpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoNDkpO3QoNzgpKCJpc0Zyb3plbiIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIGlzRnJvemVuKG4pe3JldHVybiFlKG4pfHwhIXQmJnQobil9fSl9LHs0OTo0OSw3ODo3OH1dLDE4OTpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoNDkpO3QoNzgpKCJpc1NlYWxlZCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIGlzU2VhbGVkKG4pe3JldHVybiFlKG4pfHwhIXQmJnQobil9fSl9LHs0OTo0OSw3ODo3OH1dLDE5MDpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpO2UoZS5TLCJPYmplY3QiLHtpczp0KDg5KX0pfSx7MzI6MzIsODk6ODl9XSwxOTE6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDEwOSksaT10KDc2KTt0KDc4KSgia2V5cyIsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24ga2V5cyh0KXtyZXR1cm4gaShlKHQpKX19KX0sezEwOToxMDksNzY6NzYsNzg6Nzh9XSwxOTI6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDQ5KSxpPXQoNjIpLm9uRnJlZXplO3QoNzgpKCJwcmV2ZW50RXh0ZW5zaW9ucyIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIHByZXZlbnRFeHRlbnNpb25zKG4pe3JldHVybiB0JiZlKG4pP3QoaShuKSk6bn19KX0sezQ5OjQ5LDYyOjYyLDc4Ojc4fV0sMTkzOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg0OSksaT10KDYyKS5vbkZyZWV6ZTt0KDc4KSgic2VhbCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIHNlYWwobil7cmV0dXJuIHQmJmUobik/dChpKG4pKTpufX0pfSx7NDk6NDksNjI6NjIsNzg6Nzh9XSwxOTQ6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKTtlKGUuUywiT2JqZWN0Iix7c2V0UHJvdG90eXBlT2Y6dCg5MCkuc2V0fSl9LHszMjozMiw5MDo5MH1dLDE5NTpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDE3KSxpPXt9O2lbdCgxMTcpKCJ0b1N0cmluZ1RhZyIpXT0ieiIsaSsiIiE9IltvYmplY3Qgel0iJiZ0KDg3KShPYmplY3QucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24gdG9TdHJpbmcoKXtyZXR1cm4iW29iamVjdCAiK2UodGhpcykrIl0ifSwhMCl9LHsxMTc6MTE3LDE3OjE3LDg3Ojg3fV0sMTk2OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMiksaT10KDgxKTtlKGUuRytlLkYqKHBhcnNlRmxvYXQhPWkpLHtwYXJzZUZsb2F0Oml9KX0sezMyOjMyLDgxOjgxfV0sMTk3OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMiksaT10KDgyKTtlKGUuRytlLkYqKHBhcnNlSW50IT1pKSx7cGFyc2VJbnQ6aX0pfSx7MzI6MzIsODI6ODJ9XSwxOTg6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGUsaSxvLHU9dCg1OCksYz10KDM4KSxmPXQoMjUpLGE9dCgxNykscz10KDMyKSxsPXQoNDkpLGg9dCgzKSx2PXQoNikscD10KDM3KSxkPXQoOTUpLHk9dCgxMDQpLnNldCxnPXQoNjQpKCksYj0iUHJvbWlzZSIseD1jLlR5cGVFcnJvcixtPWMucHJvY2Vzcyx3PWNbYl0sbT1jLnByb2Nlc3MsUz0icHJvY2VzcyI9PWEobSksXz1mdW5jdGlvbigpe30sRT0hIWZ1bmN0aW9uKCl7dHJ5e3ZhciBuPXcucmVzb2x2ZSgxKSxyPShuLmNvbnN0cnVjdG9yPXt9KVt0KDExNykoInNwZWNpZXMiKV09ZnVuY3Rpb24odCl7dChfLF8pfTtyZXR1cm4oU3x8ImZ1bmN0aW9uIj09dHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCkmJm4udGhlbihfKWluc3RhbmNlb2Ygcn1jYXRjaCh0KXt9fSgpLE89ZnVuY3Rpb24odCxuKXtyZXR1cm4gdD09PW58fHQ9PT13JiZuPT09b30sRj1mdW5jdGlvbih0KXt2YXIgbjtyZXR1cm4hKCFsKHQpfHwiZnVuY3Rpb24iIT10eXBlb2Yobj10LnRoZW4pKSYmbn0sUD1mdW5jdGlvbih0KXtyZXR1cm4gTyh3LHQpP25ldyBNKHQpOm5ldyBpKHQpfSxNPWk9ZnVuY3Rpb24odCl7dmFyIG4scjt0aGlzLnByb21pc2U9bmV3IHQoZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1ufHx2b2lkIDAhPT1yKXRocm93IHgoIkJhZCBQcm9taXNlIGNvbnN0cnVjdG9yIik7bj10LHI9ZX0pLHRoaXMucmVzb2x2ZT1oKG4pLHRoaXMucmVqZWN0PWgocil9LEE9ZnVuY3Rpb24odCl7dHJ5e3QoKX1jYXRjaCh0KXtyZXR1cm57ZXJyb3I6dH19fSxJPWZ1bmN0aW9uKHQsbil7aWYoIXQuX24pe3QuX249ITA7dmFyIHI9dC5fYztnKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPXQuX3YsaT0xPT10Ll9zLG89MCx1PWZ1bmN0aW9uKG4pe3ZhciByLG8sdT1pP24ub2s6bi5mYWlsLGM9bi5yZXNvbHZlLGY9bi5yZWplY3QsYT1uLmRvbWFpbjt0cnl7dT8oaXx8KDI9PXQuX2gmJmsodCksdC5faD0xKSx1PT09ITA/cj1lOihhJiZhLmVudGVyKCkscj11KGUpLGEmJmEuZXhpdCgpKSxyPT09bi5wcm9taXNlP2YoeCgiUHJvbWlzZS1jaGFpbiBjeWNsZSIpKToobz1GKHIpKT9vLmNhbGwocixjLGYpOmMocikpOmYoZSl9Y2F0Y2godCl7Zih0KX19O3IubGVuZ3RoPm87KXUocltvKytdKTt0Ll9jPVtdLHQuX249ITEsbiYmIXQuX2gmJmoodCl9KX19LGo9ZnVuY3Rpb24odCl7eS5jYWxsKGMsZnVuY3Rpb24oKXt2YXIgbixyLGUsaT10Ll92O2lmKE4odCkmJihuPUEoZnVuY3Rpb24oKXtTP20uZW1pdCgidW5oYW5kbGVkUmVqZWN0aW9uIixpLHQpOihyPWMub251bmhhbmRsZWRyZWplY3Rpb24pP3Ioe3Byb21pc2U6dCxyZWFzb246aX0pOihlPWMuY29uc29sZSkmJmUuZXJyb3ImJmUuZXJyb3IoIlVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiIsaSl9KSx0Ll9oPVN8fE4odCk/MjoxKSx0Ll9hPXZvaWQgMCxuKXRocm93IG4uZXJyb3J9KX0sTj1mdW5jdGlvbih0KXtpZigxPT10Ll9oKXJldHVybiExO2Zvcih2YXIgbixyPXQuX2F8fHQuX2MsZT0wO3IubGVuZ3RoPmU7KWlmKG49cltlKytdLG4uZmFpbHx8IU4obi5wcm9taXNlKSlyZXR1cm4hMTtyZXR1cm4hMH0saz1mdW5jdGlvbih0KXt5LmNhbGwoYyxmdW5jdGlvbigpe3ZhciBuO1M/bS5lbWl0KCJyZWplY3Rpb25IYW5kbGVkIix0KToobj1jLm9ucmVqZWN0aW9uaGFuZGxlZCkmJm4oe3Byb21pc2U6dCxyZWFzb246dC5fdn0pfSl9LFI9ZnVuY3Rpb24odCl7dmFyIG49dGhpcztuLl9kfHwobi5fZD0hMCxuPW4uX3d8fG4sbi5fdj10LG4uX3M9MixuLl9hfHwobi5fYT1uLl9jLnNsaWNlKCkpLEkobiwhMCkpfSxUPWZ1bmN0aW9uKHQpe3ZhciBuLHI9dGhpcztpZighci5fZCl7ci5fZD0hMCxyPXIuX3d8fHI7dHJ5e2lmKHI9PT10KXRocm93IHgoIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmIik7KG49Rih0KSk/ZyhmdW5jdGlvbigpe3ZhciBlPXtfdzpyLF9kOiExfTt0cnl7bi5jYWxsKHQsZihULGUsMSksZihSLGUsMSkpfWNhdGNoKHQpe1IuY2FsbChlLHQpfX0pOihyLl92PXQsci5fcz0xLEkociwhMSkpfWNhdGNoKHQpe1IuY2FsbCh7X3c6cixfZDohMX0sdCl9fX07RXx8KHc9ZnVuY3Rpb24gUHJvbWlzZSh0KXt2KHRoaXMsdyxiLCJfaCIpLGgodCksZS5jYWxsKHRoaXMpO3RyeXt0KGYoVCx0aGlzLDEpLGYoUix0aGlzLDEpKX1jYXRjaCh0KXtSLmNhbGwodGhpcyx0KX19LGU9ZnVuY3Rpb24gUHJvbWlzZSh0KXt0aGlzLl9jPVtdLHRoaXMuX2E9dm9pZCAwLHRoaXMuX3M9MCx0aGlzLl9kPSExLHRoaXMuX3Y9dm9pZCAwLHRoaXMuX2g9MCx0aGlzLl9uPSExfSxlLnByb3RvdHlwZT10KDg2KSh3LnByb3RvdHlwZSx7dGhlbjpmdW5jdGlvbiB0aGVuKHQsbil7dmFyIHI9UChkKHRoaXMsdykpO3JldHVybiByLm9rPSJmdW5jdGlvbiIhPXR5cGVvZiB0fHx0LHIuZmFpbD0iZnVuY3Rpb24iPT10eXBlb2YgbiYmbixyLmRvbWFpbj1TP20uZG9tYWluOnZvaWQgMCx0aGlzLl9jLnB1c2gociksdGhpcy5fYSYmdGhpcy5fYS5wdXNoKHIpLHRoaXMuX3MmJkkodGhpcywhMSksci5wcm9taXNlfSxjYXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCx0KX19KSxNPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGU7dGhpcy5wcm9taXNlPXQsdGhpcy5yZXNvbHZlPWYoVCx0LDEpLHRoaXMucmVqZWN0PWYoUix0LDEpfSkscyhzLkcrcy5XK3MuRiohRSx7UHJvbWlzZTp3fSksdCg5MikodyxiKSx0KDkxKShiKSxvPXQoMjMpW2JdLHMocy5TK3MuRiohRSxiLHtyZWplY3Q6ZnVuY3Rpb24gcmVqZWN0KHQpe3ZhciBuPVAodGhpcykscj1uLnJlamVjdDtyZXR1cm4gcih0KSxuLnByb21pc2V9fSkscyhzLlMrcy5GKih1fHwhRSksYix7cmVzb2x2ZTpmdW5jdGlvbiByZXNvbHZlKHQpe2lmKHQgaW5zdGFuY2VvZiB3JiZPKHQuY29uc3RydWN0b3IsdGhpcykpcmV0dXJuIHQ7dmFyIG49UCh0aGlzKSxyPW4ucmVzb2x2ZTtyZXR1cm4gcih0KSxuLnByb21pc2V9fSkscyhzLlMrcy5GKiEoRSYmdCg1NCkoZnVuY3Rpb24odCl7dy5hbGwodCkuY2F0Y2goXyl9KSksYix7YWxsOmZ1bmN0aW9uIGFsbCh0KXt2YXIgbj10aGlzLHI9UChuKSxlPXIucmVzb2x2ZSxpPXIucmVqZWN0LG89QShmdW5jdGlvbigpe3ZhciByPVtdLG89MCx1PTE7cCh0LCExLGZ1bmN0aW9uKHQpe3ZhciBjPW8rKyxmPSExO3IucHVzaCh2b2lkIDApLHUrKyxuLnJlc29sdmUodCkudGhlbihmdW5jdGlvbih0KXtmfHwoZj0hMCxyW2NdPXQsLS11fHxlKHIpKX0saSl9KSwtLXV8fGUocil9KTtyZXR1cm4gbyYmaShvLmVycm9yKSxyLnByb21pc2V9LHJhY2U6ZnVuY3Rpb24gcmFjZSh0KXt2YXIgbj10aGlzLHI9UChuKSxlPXIucmVqZWN0LGk9QShmdW5jdGlvbigpe3AodCwhMSxmdW5jdGlvbih0KXtuLnJlc29sdmUodCkudGhlbihyLnJlc29sdmUsZSl9KX0pO3JldHVybiBpJiZlKGkuZXJyb3IpLHIucHJvbWlzZX19KX0sezEwNDoxMDQsMTE3OjExNywxNzoxNywyMzoyMywyNToyNSwzOjMsMzI6MzIsMzc6MzcsMzg6MzgsNDk6NDksNTQ6NTQsNTg6NTgsNjo2LDY0OjY0LDg2Ojg2LDkxOjkxLDkyOjkyLDk1Ojk1fV0sMTk5OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMiksaT10KDMpLG89dCg3KSx1PSh0KDM4KS5SZWZsZWN0fHx7fSkuYXBwbHksYz1GdW5jdGlvbi5hcHBseTtlKGUuUytlLkYqIXQoMzQpKGZ1bmN0aW9uKCl7dShmdW5jdGlvbigpe30pfSksIlJlZmxlY3QiLHthcHBseTpmdW5jdGlvbiBhcHBseSh0LG4scil7dmFyIGU9aSh0KSxmPW8ocik7cmV0dXJuIHU/dShlLG4sZik6Yy5jYWxsKGUsbixmKX19KX0sezM6MywzMjozMiwzNDozNCwzODozOCw3Ojd9XSwyMDA6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKSxpPXQoNjYpLG89dCgzKSx1PXQoNyksYz10KDQ5KSxmPXQoMzQpLGE9dCgxNikscz0odCgzOCkuUmVmbGVjdHx8e30pLmNvbnN0cnVjdCxsPWYoZnVuY3Rpb24oKXtmdW5jdGlvbiBGKCl7fXJldHVybiEocyhmdW5jdGlvbigpe30sW10sRilpbnN0YW5jZW9mIEYpfSksaD0hZihmdW5jdGlvbigpe3MoZnVuY3Rpb24oKXt9KX0pO2UoZS5TK2UuRioobHx8aCksIlJlZmxlY3QiLHtjb25zdHJ1Y3Q6ZnVuY3Rpb24gY29uc3RydWN0KHQsbil7byh0KSx1KG4pO3ZhciByPWFyZ3VtZW50cy5sZW5ndGg8Mz90Om8oYXJndW1lbnRzWzJdKTtpZihoJiYhbClyZXR1cm4gcyh0LG4scik7aWYodD09cil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyB0O2Nhc2UgMTpyZXR1cm4gbmV3IHQoblswXSk7Y2FzZSAyOnJldHVybiBuZXcgdChuWzBdLG5bMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IHQoblswXSxuWzFdLG5bMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IHQoblswXSxuWzFdLG5bMl0sblszXSl9dmFyIGU9W251bGxdO3JldHVybiBlLnB1c2guYXBwbHkoZSxuKSxuZXcoYS5hcHBseSh0LGUpKX12YXIgZj1yLnByb3RvdHlwZSx2PWkoYyhmKT9mOk9iamVjdC5wcm90b3R5cGUpLHA9RnVuY3Rpb24uYXBwbHkuY2FsbCh0LHYsbik7cmV0dXJuIGMocCk/cDp2fX0pfSx7MTY6MTYsMzozLDMyOjMyLDM0OjM0LDM4OjM4LDQ5OjQ5LDY2OjY2LDc6N31dLDIwMTpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoNjcpLGk9dCgzMiksbz10KDcpLHU9dCgxMTApO2koaS5TK2kuRip0KDM0KShmdW5jdGlvbigpe1JlZmxlY3QuZGVmaW5lUHJvcGVydHkoZS5mKHt9LDEse3ZhbHVlOjF9KSwxLHt2YWx1ZToyfSl9KSwiUmVmbGVjdCIse2RlZmluZVByb3BlcnR5OmZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHQsbixyKXtvKHQpLG49dShuLCEwKSxvKHIpO3RyeXtyZXR1cm4gZS5mKHQsbixyKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19fSl9LHsxMTA6MTEwLDMyOjMyLDM0OjM0LDY3OjY3LDc6N31dLDIwMjpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpLGk9dCg3MCkuZixvPXQoNyk7ZShlLlMsIlJlZmxlY3QiLHtkZWxldGVQcm9wZXJ0eTpmdW5jdGlvbiBkZWxldGVQcm9wZXJ0eSh0LG4pe3ZhciByPWkobyh0KSxuKTtyZXR1cm4hKHImJiFyLmNvbmZpZ3VyYWJsZSkmJmRlbGV0ZSB0W25dfX0pfSx7MzI6MzIsNzo3LDcwOjcwfV0sMjAzOltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBlPXQoMzIpLGk9dCg3KSxvPWZ1bmN0aW9uKHQpe3RoaXMuX3Q9aSh0KSx0aGlzLl9pPTA7dmFyIG4scj10aGlzLl9rPVtdO2ZvcihuIGluIHQpci5wdXNoKG4pfTt0KDUyKShvLCJPYmplY3QiLGZ1bmN0aW9uKCl7dmFyIHQsbj10aGlzLHI9bi5faztkbyBpZihuLl9pPj1yLmxlbmd0aClyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9O3doaWxlKCEoKHQ9cltuLl9pKytdKWluIG4uX3QpKTtyZXR1cm57dmFsdWU6dCxkb25lOiExfX0pLGUoZS5TLCJSZWZsZWN0Iix7ZW51bWVyYXRlOmZ1bmN0aW9uIGVudW1lcmF0ZSh0KXtyZXR1cm4gbmV3IG8odCl9fSl9LHszMjozMiw1Mjo1Miw3Ojd9XSwyMDQ6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDcwKSxpPXQoMzIpLG89dCg3KTtpKGkuUywiUmVmbGVjdCIse2dldE93blByb3BlcnR5RGVzY3JpcHRvcjpmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKXtyZXR1cm4gZS5mKG8odCksbil9fSl9LHszMjozMiw3OjcsNzA6NzB9XSwyMDU6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKSxpPXQoNzQpLG89dCg3KTtlKGUuUywiUmVmbGVjdCIse2dldFByb3RvdHlwZU9mOmZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKHQpe3JldHVybiBpKG8odCkpfX0pfSx7MzI6MzIsNzo3LDc0Ojc0fV0sMjA2OltmdW5jdGlvbih0LG4scil7ZnVuY3Rpb24gZ2V0KHQsbil7dmFyIHIsdSxhPWFyZ3VtZW50cy5sZW5ndGg8Mz90OmFyZ3VtZW50c1syXTtyZXR1cm4gZih0KT09PWE/dFtuXToocj1lLmYodCxuKSk/byhyLCJ2YWx1ZSIpP3IudmFsdWU6dm9pZCAwIT09ci5nZXQ/ci5nZXQuY2FsbChhKTp2b2lkIDA6Yyh1PWkodCkpP2dldCh1LG4sYSk6dm9pZCAwfXZhciBlPXQoNzApLGk9dCg3NCksbz10KDM5KSx1PXQoMzIpLGM9dCg0OSksZj10KDcpO3UodS5TLCJSZWZsZWN0Iix7Z2V0OmdldH0pfSx7MzI6MzIsMzk6MzksNDk6NDksNzo3LDcwOjcwLDc0Ojc0fV0sMjA3OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMik7ZShlLlMsIlJlZmxlY3QiLHtoYXM6ZnVuY3Rpb24gaGFzKHQsbil7cmV0dXJuIG4gaW4gdDsKfX0pfSx7MzI6MzJ9XSwyMDg6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKSxpPXQoNyksbz1PYmplY3QuaXNFeHRlbnNpYmxlO2UoZS5TLCJSZWZsZWN0Iix7aXNFeHRlbnNpYmxlOmZ1bmN0aW9uIGlzRXh0ZW5zaWJsZSh0KXtyZXR1cm4gaSh0KSwhb3x8byh0KX19KX0sezMyOjMyLDc6N31dLDIwOTpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpO2UoZS5TLCJSZWZsZWN0Iix7b3duS2V5czp0KDgwKX0pfSx7MzI6MzIsODA6ODB9XSwyMTA6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKSxpPXQoNyksbz1PYmplY3QucHJldmVudEV4dGVuc2lvbnM7ZShlLlMsIlJlZmxlY3QiLHtwcmV2ZW50RXh0ZW5zaW9uczpmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyh0KXtpKHQpO3RyeXtyZXR1cm4gbyYmbyh0KSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19fSl9LHszMjozMiw3Ojd9XSwyMTE6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKSxpPXQoOTApO2kmJmUoZS5TLCJSZWZsZWN0Iix7c2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YodCxuKXtpLmNoZWNrKHQsbik7dHJ5e3JldHVybiBpLnNldCh0LG4pLCEwfWNhdGNoKHQpe3JldHVybiExfX19KX0sezMyOjMyLDkwOjkwfV0sMjEyOltmdW5jdGlvbih0LG4scil7ZnVuY3Rpb24gc2V0KHQsbixyKXt2YXIgYyxsLGg9YXJndW1lbnRzLmxlbmd0aDw0P3Q6YXJndW1lbnRzWzNdLHY9aS5mKGEodCksbik7aWYoIXYpe2lmKHMobD1vKHQpKSlyZXR1cm4gc2V0KGwsbixyLGgpO3Y9ZigwKX1yZXR1cm4gdSh2LCJ2YWx1ZSIpPyEodi53cml0YWJsZT09PSExfHwhcyhoKSkmJihjPWkuZihoLG4pfHxmKDApLGMudmFsdWU9cixlLmYoaCxuLGMpLCEwKTp2b2lkIDAhPT12LnNldCYmKHYuc2V0LmNhbGwoaCxyKSwhMCl9dmFyIGU9dCg2NyksaT10KDcwKSxvPXQoNzQpLHU9dCgzOSksYz10KDMyKSxmPXQoODUpLGE9dCg3KSxzPXQoNDkpO2MoYy5TLCJSZWZsZWN0Iix7c2V0OnNldH0pfSx7MzI6MzIsMzk6MzksNDk6NDksNjc6NjcsNzo3LDcwOjcwLDc0Ojc0LDg1Ojg1fV0sMjEzOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzOCksaT10KDQzKSxvPXQoNjcpLmYsdT10KDcyKS5mLGM9dCg1MCksZj10KDM2KSxhPWUuUmVnRXhwLHM9YSxsPWEucHJvdG90eXBlLGg9L2EvZyx2PS9hL2cscD1uZXcgYShoKSE9PWg7aWYodCgyOCkmJighcHx8dCgzNCkoZnVuY3Rpb24oKXtyZXR1cm4gdlt0KDExNykoIm1hdGNoIildPSExLGEoaCkhPWh8fGEodik9PXZ8fCIvYS9pIiE9YShoLCJpIil9KSkpe2E9ZnVuY3Rpb24gUmVnRXhwKHQsbil7dmFyIHI9dGhpcyBpbnN0YW5jZW9mIGEsZT1jKHQpLG89dm9pZCAwPT09bjtyZXR1cm4hciYmZSYmdC5jb25zdHJ1Y3Rvcj09PWEmJm8/dDppKHA/bmV3IHMoZSYmIW8/dC5zb3VyY2U6dCxuKTpzKChlPXQgaW5zdGFuY2VvZiBhKT90LnNvdXJjZTp0LGUmJm8/Zi5jYWxsKHQpOm4pLHI/dGhpczpsLGEpfTtmb3IodmFyIGQ9KGZ1bmN0aW9uKHQpe3QgaW4gYXx8byhhLHQse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gc1t0XX0sc2V0OmZ1bmN0aW9uKG4pe3NbdF09bn19KX0pLHk9dShzKSxnPTA7eS5sZW5ndGg+ZzspZCh5W2crK10pO2wuY29uc3RydWN0b3I9YSxhLnByb3RvdHlwZT1sLHQoODcpKGUsIlJlZ0V4cCIsYSl9dCg5MSkoIlJlZ0V4cCIpfSx7MTE3OjExNywyODoyOCwzNDozNCwzNjozNiwzODozOCw0Mzo0Myw1MDo1MCw2Nzo2Nyw3Mjo3Miw4Nzo4Nyw5MTo5MX1dLDIxNDpbZnVuY3Rpb24odCxuLHIpe3QoMjgpJiYiZyIhPS8uL2cuZmxhZ3MmJnQoNjcpLmYoUmVnRXhwLnByb3RvdHlwZSwiZmxhZ3MiLHtjb25maWd1cmFibGU6ITAsZ2V0OnQoMzYpfSl9LHsyODoyOCwzNjozNiw2Nzo2N31dLDIxNTpbZnVuY3Rpb24odCxuLHIpe3QoMzUpKCJtYXRjaCIsMSxmdW5jdGlvbih0LG4scil7cmV0dXJuW2Z1bmN0aW9uIG1hdGNoKHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KHRoaXMpLGk9dm9pZCAwPT1yP3ZvaWQgMDpyW25dO3JldHVybiB2b2lkIDAhPT1pP2kuY2FsbChyLGUpOm5ldyBSZWdFeHAocilbbl0oU3RyaW5nKGUpKX0scl19KX0sezM1OjM1fV0sMjE2OltmdW5jdGlvbih0LG4scil7dCgzNSkoInJlcGxhY2UiLDIsZnVuY3Rpb24odCxuLHIpe3JldHVybltmdW5jdGlvbiByZXBsYWNlKGUsaSl7InVzZSBzdHJpY3QiO3ZhciBvPXQodGhpcyksdT12b2lkIDA9PWU/dm9pZCAwOmVbbl07cmV0dXJuIHZvaWQgMCE9PXU/dS5jYWxsKGUsbyxpKTpyLmNhbGwoU3RyaW5nKG8pLGUsaSl9LHJdfSl9LHszNTozNX1dLDIxNzpbZnVuY3Rpb24odCxuLHIpe3QoMzUpKCJzZWFyY2giLDEsZnVuY3Rpb24odCxuLHIpe3JldHVybltmdW5jdGlvbiBzZWFyY2gocil7InVzZSBzdHJpY3QiO3ZhciBlPXQodGhpcyksaT12b2lkIDA9PXI/dm9pZCAwOnJbbl07cmV0dXJuIHZvaWQgMCE9PWk/aS5jYWxsKHIsZSk6bmV3IFJlZ0V4cChyKVtuXShTdHJpbmcoZSkpfSxyXX0pfSx7MzU6MzV9XSwyMTg6W2Z1bmN0aW9uKHQsbixyKXt0KDM1KSgic3BsaXQiLDIsZnVuY3Rpb24obixyLGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT10KDUwKSxvPWUsdT1bXS5wdXNoLGM9InNwbGl0IixmPSJsZW5ndGgiLGE9Imxhc3RJbmRleCI7aWYoImMiPT0iYWJiYyJbY10oLyhiKSovKVsxXXx8NCE9InRlc3QiW2NdKC8oPzopLywtMSlbZl18fDIhPSJhYiJbY10oLyg/OmFiKSovKVtmXXx8NCE9Ii4iW2NdKC8oLj8pKC4/KS8pW2ZdfHwiLiJbY10oLygpKCkvKVtmXT4xfHwiIltjXSgvLj8vKVtmXSl7dmFyIHM9dm9pZCAwPT09LygpPz8vLmV4ZWMoIiIpWzFdO2U9ZnVuY3Rpb24odCxuKXt2YXIgcj1TdHJpbmcodGhpcyk7aWYodm9pZCAwPT09dCYmMD09PW4pcmV0dXJuW107aWYoIWkodCkpcmV0dXJuIG8uY2FsbChyLHQsbik7dmFyIGUsYyxsLGgsdixwPVtdLGQ9KHQuaWdub3JlQ2FzZT8iaSI6IiIpKyh0Lm11bHRpbGluZT8ibSI6IiIpKyh0LnVuaWNvZGU/InUiOiIiKSsodC5zdGlja3k/InkiOiIiKSx5PTAsZz12b2lkIDA9PT1uPzQyOTQ5NjcyOTU6bj4+PjAsYj1uZXcgUmVnRXhwKHQuc291cmNlLGQrImciKTtmb3Ioc3x8KGU9bmV3IFJlZ0V4cCgiXiIrYi5zb3VyY2UrIiQoPyFcXHMpIixkKSk7KGM9Yi5leGVjKHIpKSYmKGw9Yy5pbmRleCtjWzBdW2ZdLCEobD55JiYocC5wdXNoKHIuc2xpY2UoeSxjLmluZGV4KSksIXMmJmNbZl0+MSYmY1swXS5yZXBsYWNlKGUsZnVuY3Rpb24oKXtmb3Iodj0xO3Y8YXJndW1lbnRzW2ZdLTI7disrKXZvaWQgMD09PWFyZ3VtZW50c1t2XSYmKGNbdl09dm9pZCAwKX0pLGNbZl0+MSYmYy5pbmRleDxyW2ZdJiZ1LmFwcGx5KHAsYy5zbGljZSgxKSksaD1jWzBdW2ZdLHk9bCxwW2ZdPj1nKSkpOyliW2FdPT09Yy5pbmRleCYmYlthXSsrO3JldHVybiB5PT09cltmXT8haCYmYi50ZXN0KCIiKXx8cC5wdXNoKCIiKTpwLnB1c2goci5zbGljZSh5KSkscFtmXT5nP3Auc2xpY2UoMCxnKTpwfX1lbHNlIjAiW2NdKHZvaWQgMCwwKVtmXSYmKGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdm9pZCAwPT09dCYmMD09PW4/W106by5jYWxsKHRoaXMsdCxuKX0pO3JldHVybltmdW5jdGlvbiBzcGxpdCh0LGkpe3ZhciBvPW4odGhpcyksdT12b2lkIDA9PXQ/dm9pZCAwOnRbcl07cmV0dXJuIHZvaWQgMCE9PXU/dS5jYWxsKHQsbyxpKTplLmNhbGwoU3RyaW5nKG8pLHQsaSl9LGVdfSl9LHszNTozNSw1MDo1MH1dLDIxOTpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt0KDIxNCk7dmFyIGU9dCg3KSxpPXQoMzYpLG89dCgyOCksdT0idG9TdHJpbmciLGM9Ly4vW3VdLGY9ZnVuY3Rpb24obil7dCg4NykoUmVnRXhwLnByb3RvdHlwZSx1LG4sITApfTt0KDM0KShmdW5jdGlvbigpe3JldHVybiIvYS9iIiE9Yy5jYWxsKHtzb3VyY2U6ImEiLGZsYWdzOiJiIn0pfSk/ZihmdW5jdGlvbiB0b1N0cmluZygpe3ZhciB0PWUodGhpcyk7cmV0dXJuIi8iLmNvbmNhdCh0LnNvdXJjZSwiLyIsImZsYWdzImluIHQ/dC5mbGFnczohbyYmdCBpbnN0YW5jZW9mIFJlZ0V4cD9pLmNhbGwodCk6dm9pZCAwKX0pOmMubmFtZSE9dSYmZihmdW5jdGlvbiB0b1N0cmluZygpe3JldHVybiBjLmNhbGwodGhpcyl9KX0sezIxNDoyMTQsMjg6MjgsMzQ6MzQsMzY6MzYsNzo3LDg3Ojg3fV0sMjIwOltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBlPXQoMTkpO24uZXhwb3J0cz10KDIyKSgiU2V0IixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gU2V0KCl7cmV0dXJuIHQodGhpcyxhcmd1bWVudHMubGVuZ3RoPjA/YXJndW1lbnRzWzBdOnZvaWQgMCl9fSx7YWRkOmZ1bmN0aW9uIGFkZCh0KXtyZXR1cm4gZS5kZWYodGhpcyx0PTA9PT10PzA6dCx0KX19LGUpfSx7MTk6MTksMjI6MjJ9XSwyMjE6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dCg5OSkoImFuY2hvciIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIGFuY2hvcihuKXtyZXR1cm4gdCh0aGlzLCJhIiwibmFtZSIsbil9fSl9LHs5OTo5OX1dLDIyMjpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt0KDk5KSgiYmlnIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gYmlnKCl7cmV0dXJuIHQodGhpcywiYmlnIiwiIiwiIil9fSl9LHs5OTo5OX1dLDIyMzpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt0KDk5KSgiYmxpbmsiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBibGluaygpe3JldHVybiB0KHRoaXMsImJsaW5rIiwiIiwiIil9fSl9LHs5OTo5OX1dLDIyNDpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt0KDk5KSgiYm9sZCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIGJvbGQoKXtyZXR1cm4gdCh0aGlzLCJiIiwiIiwiIil9fSl9LHs5OTo5OX1dLDIyNTpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDMyKSxpPXQoOTcpKCExKTtlKGUuUCwiU3RyaW5nIix7Y29kZVBvaW50QXQ6ZnVuY3Rpb24gY29kZVBvaW50QXQodCl7cmV0dXJuIGkodGhpcyx0KX19KX0sezMyOjMyLDk3Ojk3fV0sMjI2OltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBlPXQoMzIpLGk9dCgxMDgpLG89dCg5OCksdT0iZW5kc1dpdGgiLGM9IiJbdV07ZShlLlArZS5GKnQoMzMpKHUpLCJTdHJpbmciLHtlbmRzV2l0aDpmdW5jdGlvbiBlbmRzV2l0aCh0KXt2YXIgbj1vKHRoaXMsdCx1KSxyPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLGU9aShuLmxlbmd0aCksZj12b2lkIDA9PT1yP2U6TWF0aC5taW4oaShyKSxlKSxhPVN0cmluZyh0KTtyZXR1cm4gYz9jLmNhbGwobixhLGYpOm4uc2xpY2UoZi1hLmxlbmd0aCxmKT09PWF9fSl9LHsxMDg6MTA4LDMyOjMyLDMzOjMzLDk4Ojk4fV0sMjI3OltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3QoOTkpKCJmaXhlZCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIGZpeGVkKCl7cmV0dXJuIHQodGhpcywidHQiLCIiLCIiKX19KX0sezk5Ojk5fV0sMjI4OltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3QoOTkpKCJmb250Y29sb3IiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBmb250Y29sb3Iobil7cmV0dXJuIHQodGhpcywiZm9udCIsImNvbG9yIixuKX19KX0sezk5Ojk5fV0sMjI5OltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3QoOTkpKCJmb250c2l6ZSIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIGZvbnRzaXplKG4pe3JldHVybiB0KHRoaXMsImZvbnQiLCJzaXplIixuKX19KX0sezk5Ojk5fV0sMjMwOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMiksaT10KDEwNSksbz1TdHJpbmcuZnJvbUNoYXJDb2RlLHU9U3RyaW5nLmZyb21Db2RlUG9pbnQ7ZShlLlMrZS5GKighIXUmJjEhPXUubGVuZ3RoKSwiU3RyaW5nIix7ZnJvbUNvZGVQb2ludDpmdW5jdGlvbiBmcm9tQ29kZVBvaW50KHQpe2Zvcih2YXIgbixyPVtdLGU9YXJndW1lbnRzLmxlbmd0aCx1PTA7ZT51Oyl7aWYobj0rYXJndW1lbnRzW3UrK10saShuLDExMTQxMTEpIT09bil0aHJvdyBSYW5nZUVycm9yKG4rIiBpcyBub3QgYSB2YWxpZCBjb2RlIHBvaW50Iik7ci5wdXNoKG48NjU1MzY/byhuKTpvKCgobi09NjU1MzYpPj4xMCkrNTUyOTYsbiUxMDI0KzU2MzIwKSl9cmV0dXJuIHIuam9pbigiIil9fSl9LHsxMDU6MTA1LDMyOjMyfV0sMjMxOltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBlPXQoMzIpLGk9dCg5OCksbz0iaW5jbHVkZXMiO2UoZS5QK2UuRip0KDMzKShvKSwiU3RyaW5nIix7aW5jbHVkZXM6ZnVuY3Rpb24gaW5jbHVkZXModCl7cmV0dXJuISF+aSh0aGlzLHQsbykuaW5kZXhPZih0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sezMyOjMyLDMzOjMzLDk4Ojk4fV0sMjMyOltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3QoOTkpKCJpdGFsaWNzIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gaXRhbGljcygpe3JldHVybiB0KHRoaXMsImkiLCIiLCIiKX19KX0sezk5Ojk5fV0sMjMzOltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBlPXQoOTcpKCEwKTt0KDUzKShTdHJpbmcsIlN0cmluZyIsZnVuY3Rpb24odCl7dGhpcy5fdD1TdHJpbmcodCksdGhpcy5faT0wfSxmdW5jdGlvbigpe3ZhciB0LG49dGhpcy5fdCxyPXRoaXMuX2k7cmV0dXJuIHI+PW4ubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KHQ9ZShuLHIpLHRoaXMuX2krPXQubGVuZ3RoLHt2YWx1ZTp0LGRvbmU6ITF9KX0pfSx7NTM6NTMsOTc6OTd9XSwyMzQ6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dCg5OSkoImxpbmsiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBsaW5rKG4pe3JldHVybiB0KHRoaXMsImEiLCJocmVmIixuKX19KX0sezk5Ojk5fV0sMjM1OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMiksaT10KDEwNyksbz10KDEwOCk7ZShlLlMsIlN0cmluZyIse3JhdzpmdW5jdGlvbiByYXcodCl7Zm9yKHZhciBuPWkodC5yYXcpLHI9byhuLmxlbmd0aCksZT1hcmd1bWVudHMubGVuZ3RoLHU9W10sYz0wO3I+YzspdS5wdXNoKFN0cmluZyhuW2MrK10pKSxjPGUmJnUucHVzaChTdHJpbmcoYXJndW1lbnRzW2NdKSk7cmV0dXJuIHUuam9pbigiIil9fSl9LHsxMDc6MTA3LDEwODoxMDgsMzI6MzJ9XSwyMzY6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKTtlKGUuUCwiU3RyaW5nIix7cmVwZWF0OnQoMTAxKX0pfSx7MTAxOjEwMSwzMjozMn1dLDIzNzpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt0KDk5KSgic21hbGwiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBzbWFsbCgpe3JldHVybiB0KHRoaXMsInNtYWxsIiwiIiwiIil9fSl9LHs5OTo5OX1dLDIzODpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDMyKSxpPXQoMTA4KSxvPXQoOTgpLHU9InN0YXJ0c1dpdGgiLGM9IiJbdV07ZShlLlArZS5GKnQoMzMpKHUpLCJTdHJpbmciLHtzdGFydHNXaXRoOmZ1bmN0aW9uIHN0YXJ0c1dpdGgodCl7dmFyIG49byh0aGlzLHQsdSkscj1pKE1hdGgubWluKGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLG4ubGVuZ3RoKSksZT1TdHJpbmcodCk7cmV0dXJuIGM/Yy5jYWxsKG4sZSxyKTpuLnNsaWNlKHIscitlLmxlbmd0aCk9PT1lfX0pfSx7MTA4OjEwOCwzMjozMiwzMzozMyw5ODo5OH1dLDIzOTpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt0KDk5KSgic3RyaWtlIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gc3RyaWtlKCl7cmV0dXJuIHQodGhpcywic3RyaWtlIiwiIiwiIil9fSl9LHs5OTo5OX1dLDI0MDpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt0KDk5KSgic3ViIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gc3ViKCl7cmV0dXJuIHQodGhpcywic3ViIiwiIiwiIil9fSl9LHs5OTo5OX1dLDI0MTpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt0KDk5KSgic3VwIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gc3VwKCl7cmV0dXJuIHQodGhpcywic3VwIiwiIiwiIil9fSl9LHs5OTo5OX1dLDI0MjpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt0KDEwMikoInRyaW0iLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiB0cmltKCl7cmV0dXJuIHQodGhpcywzKX19KX0sezEwMjoxMDJ9XSwyNDM6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgzOCksaT10KDM5KSxvPXQoMjgpLHU9dCgzMiksYz10KDg3KSxmPXQoNjIpLktFWSxhPXQoMzQpLHM9dCg5NCksbD10KDkyKSxoPXQoMTE0KSx2PXQoMTE3KSxwPXQoMTE2KSxkPXQoMTE1KSx5PXQoNTcpLGc9dCgzMSksYj10KDQ3KSx4PXQoNyksbT10KDEwNyksdz10KDExMCksUz10KDg1KSxfPXQoNjYpLEU9dCg3MSksTz10KDcwKSxGPXQoNjcpLFA9dCg3NiksTT1PLmYsQT1GLmYsST1FLmYsaj1lLlN5bWJvbCxOPWUuSlNPTixrPU4mJk4uc3RyaW5naWZ5LFI9InByb3RvdHlwZSIsVD12KCJfaGlkZGVuIiksTD12KCJ0b1ByaW1pdGl2ZSIpLEM9e30ucHJvcGVydHlJc0VudW1lcmFibGUsVT1zKCJzeW1ib2wtcmVnaXN0cnkiKSxHPXMoInN5bWJvbHMiKSxEPXMoIm9wLXN5bWJvbHMiKSxXPU9iamVjdFtSXSxCPSJmdW5jdGlvbiI9PXR5cGVvZiBqLFY9ZS5RT2JqZWN0LHo9IVZ8fCFWW1JdfHwhVltSXS5maW5kQ2hpbGQsSz1vJiZhKGZ1bmN0aW9uKCl7cmV0dXJuIDchPV8oQSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiBBKHRoaXMsImEiLHt2YWx1ZTo3fSkuYX19KSkuYX0pP2Z1bmN0aW9uKHQsbixyKXt2YXIgZT1NKFcsbik7ZSYmZGVsZXRlIFdbbl0sQSh0LG4sciksZSYmdCE9PVcmJkEoVyxuLGUpfTpBLEo9ZnVuY3Rpb24odCl7dmFyIG49R1t0XT1fKGpbUl0pO3JldHVybiBuLl9rPXQsbn0sWT1CJiYic3ltYm9sIj09dHlwZW9mIGouaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGp9LHE9ZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodCxuLHIpe3JldHVybiB0PT09VyYmcShELG4scikseCh0KSxuPXcobiwhMCkseChyKSxpKEcsbik/KHIuZW51bWVyYWJsZT8oaSh0LFQpJiZ0W1RdW25dJiYodFtUXVtuXT0hMSkscj1fKHIse2VudW1lcmFibGU6UygwLCExKX0pKTooaSh0LFQpfHxBKHQsVCxTKDEse30pKSx0W1RdW25dPSEwKSxLKHQsbixyKSk6QSh0LG4scil9LFg9ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0LG4pe3godCk7Zm9yKHZhciByLGU9ZyhuPW0obikpLGk9MCxvPWUubGVuZ3RoO28+aTspcSh0LHI9ZVtpKytdLG5bcl0pO3JldHVybiB0fSwkPWZ1bmN0aW9uIGNyZWF0ZSh0LG4pe3JldHVybiB2b2lkIDA9PT1uP18odCk6WChfKHQpLG4pfSxIPWZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKHQpe3ZhciBuPUMuY2FsbCh0aGlzLHQ9dyh0LCEwKSk7cmV0dXJuISh0aGlzPT09VyYmaShHLHQpJiYhaShELHQpKSYmKCEobnx8IWkodGhpcyx0KXx8IWkoRyx0KXx8aSh0aGlzLFQpJiZ0aGlzW1RdW3RdKXx8bil9LFo9ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbil7aWYodD1tKHQpLG49dyhuLCEwKSx0IT09V3x8IWkoRyxuKXx8aShELG4pKXt2YXIgcj1NKHQsbik7cmV0dXJuIXJ8fCFpKEcsbil8fGkodCxUKSYmdFtUXVtuXXx8KHIuZW51bWVyYWJsZT0hMCkscn19LFE9ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyh0KXtmb3IodmFyIG4scj1JKG0odCkpLGU9W10sbz0wO3IubGVuZ3RoPm87KWkoRyxuPXJbbysrXSl8fG49PVR8fG49PWZ8fGUucHVzaChuKTtyZXR1cm4gZX0sdHQ9ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpe2Zvcih2YXIgbixyPXQ9PT1XLGU9SShyP0Q6bSh0KSksbz1bXSx1PTA7ZS5sZW5ndGg+dTspIWkoRyxuPWVbdSsrXSl8fHImJiFpKFcsbil8fG8ucHVzaChHW25dKTtyZXR1cm4gb307Qnx8KGo9ZnVuY3Rpb24gU3ltYm9sKCl7aWYodGhpcyBpbnN0YW5jZW9mIGopdGhyb3cgVHlwZUVycm9yKCJTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhIik7dmFyIHQ9aChhcmd1bWVudHMubGVuZ3RoPjA/YXJndW1lbnRzWzBdOnZvaWQgMCksbj1mdW5jdGlvbihyKXt0aGlzPT09VyYmbi5jYWxsKEQsciksaSh0aGlzLFQpJiZpKHRoaXNbVF0sdCkmJih0aGlzW1RdW3RdPSExKSxLKHRoaXMsdCxTKDEscikpfTtyZXR1cm4gbyYmeiYmSyhXLHQse2NvbmZpZ3VyYWJsZTohMCxzZXQ6bn0pLEoodCl9LGMoaltSXSwidG9TdHJpbmciLGZ1bmN0aW9uIHRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuX2t9KSxPLmY9WixGLmY9cSx0KDcyKS5mPUUuZj1RLHQoNzcpLmY9SCx0KDczKS5mPXR0LG8mJiF0KDU4KSYmYyhXLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsSCwhMCkscC5mPWZ1bmN0aW9uKHQpe3JldHVybiBKKHYodCkpfSksdSh1LkcrdS5XK3UuRiohQix7U3ltYm9sOmp9KTtmb3IodmFyIG50PSJoYXNJbnN0YW5jZSxpc0NvbmNhdFNwcmVhZGFibGUsaXRlcmF0b3IsbWF0Y2gscmVwbGFjZSxzZWFyY2gsc3BlY2llcyxzcGxpdCx0b1ByaW1pdGl2ZSx0b1N0cmluZ1RhZyx1bnNjb3BhYmxlcyIuc3BsaXQoIiwiKSxydD0wO250Lmxlbmd0aD5ydDspdihudFtydCsrXSk7Zm9yKHZhciBudD1QKHYuc3RvcmUpLHJ0PTA7bnQubGVuZ3RoPnJ0OylkKG50W3J0KytdKTt1KHUuUyt1LkYqIUIsIlN5bWJvbCIse2ZvcjpmdW5jdGlvbih0KXtyZXR1cm4gaShVLHQrPSIiKT9VW3RdOlVbdF09aih0KX0sa2V5Rm9yOmZ1bmN0aW9uIGtleUZvcih0KXtpZihZKHQpKXJldHVybiB5KFUsdCk7dGhyb3cgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBzeW1ib2whIil9LHVzZVNldHRlcjpmdW5jdGlvbigpe3o9ITB9LHVzZVNpbXBsZTpmdW5jdGlvbigpe3o9ITF9fSksdSh1LlMrdS5GKiFCLCJPYmplY3QiLHtjcmVhdGU6JCxkZWZpbmVQcm9wZXJ0eTpxLGRlZmluZVByb3BlcnRpZXM6WCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6WixnZXRPd25Qcm9wZXJ0eU5hbWVzOlEsZ2V0T3duUHJvcGVydHlTeW1ib2xzOnR0fSksTiYmdSh1LlMrdS5GKighQnx8YShmdW5jdGlvbigpe3ZhciB0PWooKTtyZXR1cm4iW251bGxdIiE9ayhbdF0pfHwie30iIT1rKHthOnR9KXx8Int9IiE9ayhPYmplY3QodCkpfSkpLCJKU09OIix7c3RyaW5naWZ5OmZ1bmN0aW9uIHN0cmluZ2lmeSh0KXtpZih2b2lkIDAhPT10JiYhWSh0KSl7Zm9yKHZhciBuLHIsZT1bdF0saT0xO2FyZ3VtZW50cy5sZW5ndGg+aTspZS5wdXNoKGFyZ3VtZW50c1tpKytdKTtyZXR1cm4gbj1lWzFdLCJmdW5jdGlvbiI9PXR5cGVvZiBuJiYocj1uKSwhciYmYihuKXx8KG49ZnVuY3Rpb24odCxuKXtpZihyJiYobj1yLmNhbGwodGhpcyx0LG4pKSwhWShuKSlyZXR1cm4gbn0pLGVbMV09bixrLmFwcGx5KE4sZSl9fX0pLGpbUl1bTF18fHQoNDApKGpbUl0sTCxqW1JdLnZhbHVlT2YpLGwoaiwiU3ltYm9sIiksbChNYXRoLCJNYXRoIiwhMCksbChlLkpTT04sIkpTT04iLCEwKX0sezEwNzoxMDcsMTEwOjExMCwxMTQ6MTE0LDExNToxMTUsMTE2OjExNiwxMTc6MTE3LDI4OjI4LDMxOjMxLDMyOjMyLDM0OjM0LDM4OjM4LDM5OjM5LDQwOjQwLDQ3OjQ3LDU3OjU3LDU4OjU4LDYyOjYyLDY2OjY2LDY3OjY3LDc6Nyw3MDo3MCw3MTo3MSw3Mjo3Miw3Mzo3Myw3Njo3Niw3Nzo3Nyw4NTo4NSw4Nzo4Nyw5Mjo5Miw5NDo5NH1dLDI0NDpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDMyKSxpPXQoMTEzKSxvPXQoMTEyKSx1PXQoNyksYz10KDEwNSksZj10KDEwOCksYT10KDQ5KSxzPXQoMzgpLkFycmF5QnVmZmVyLGw9dCg5NSksaD1vLkFycmF5QnVmZmVyLHY9by5EYXRhVmlldyxwPWkuQUJWJiZzLmlzVmlldyxkPWgucHJvdG90eXBlLnNsaWNlLHk9aS5WSUVXLGc9IkFycmF5QnVmZmVyIjtlKGUuRytlLlcrZS5GKihzIT09aCkse0FycmF5QnVmZmVyOmh9KSxlKGUuUytlLkYqIWkuQ09OU1RSLGcse2lzVmlldzpmdW5jdGlvbiBpc1ZpZXcodCl7cmV0dXJuIHAmJnAodCl8fGEodCkmJnkgaW4gdH19KSxlKGUuUCtlLlUrZS5GKnQoMzQpKGZ1bmN0aW9uKCl7cmV0dXJuIW5ldyBoKDIpLnNsaWNlKDEsdm9pZCAwKS5ieXRlTGVuZ3RofSksZyx7c2xpY2U6ZnVuY3Rpb24gc2xpY2UodCxuKXtpZih2b2lkIDAhPT1kJiZ2b2lkIDA9PT1uKXJldHVybiBkLmNhbGwodSh0aGlzKSx0KTtmb3IodmFyIHI9dSh0aGlzKS5ieXRlTGVuZ3RoLGU9Yyh0LHIpLGk9Yyh2b2lkIDA9PT1uP3I6bixyKSxvPW5ldyhsKHRoaXMsaCkpKGYoaS1lKSksYT1uZXcgdih0aGlzKSxzPW5ldyB2KG8pLHA9MDtlPGk7KXMuc2V0VWludDgocCsrLGEuZ2V0VWludDgoZSsrKSk7cmV0dXJuIG99fSksdCg5MSkoZyl9LHsxMDU6MTA1LDEwODoxMDgsMTEyOjExMiwxMTM6MTEzLDMyOjMyLDM0OjM0LDM4OjM4LDQ5OjQ5LDc6Nyw5MTo5MSw5NTo5NX1dLDI0NTpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpO2UoZS5HK2UuVytlLkYqIXQoMTEzKS5BQlYse0RhdGFWaWV3OnQoMTEyKS5EYXRhVmlld30pfSx7MTEyOjExMiwxMTM6MTEzLDMyOjMyfV0sMjQ2OltmdW5jdGlvbih0LG4scil7dCgxMTEpKCJGbG9hdDMyIiw0LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBGbG9hdDMyQXJyYXkobixyLGUpe3JldHVybiB0KHRoaXMsbixyLGUpfX0pfSx7MTExOjExMX1dLDI0NzpbZnVuY3Rpb24odCxuLHIpe3QoMTExKSgiRmxvYXQ2NCIsOCxmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gRmxvYXQ2NEFycmF5KG4scixlKXtyZXR1cm4gdCh0aGlzLG4scixlKX19KX0sezExMToxMTF9XSwyNDg6W2Z1bmN0aW9uKHQsbixyKXt0KDExMSkoIkludDE2IiwyLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBJbnQxNkFycmF5KG4scixlKXtyZXR1cm4gdCh0aGlzLG4scixlKX19KX0sezExMToxMTF9XSwyNDk6W2Z1bmN0aW9uKHQsbixyKXt0KDExMSkoIkludDMyIiw0LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBJbnQzMkFycmF5KG4scixlKXtyZXR1cm4gdCh0aGlzLG4scixlKX19KX0sezExMToxMTF9XSwyNTA6W2Z1bmN0aW9uKHQsbixyKXt0KDExMSkoIkludDgiLDEsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIEludDhBcnJheShuLHIsZSl7cmV0dXJuIHQodGhpcyxuLHIsZSl9fSl9LHsxMTE6MTExfV0sMjUxOltmdW5jdGlvbih0LG4scil7dCgxMTEpKCJVaW50MTYiLDIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIFVpbnQxNkFycmF5KG4scixlKXtyZXR1cm4gdCh0aGlzLG4scixlKX19KX0sezExMToxMTF9XSwyNTI6W2Z1bmN0aW9uKHQsbixyKXt0KDExMSkoIlVpbnQzMiIsNCxmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gVWludDMyQXJyYXkobixyLGUpe3JldHVybiB0KHRoaXMsbixyLGUpfX0pfSx7MTExOjExMX1dLDI1MzpbZnVuY3Rpb24odCxuLHIpe3QoMTExKSgiVWludDgiLDEsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIFVpbnQ4QXJyYXkobixyLGUpe3JldHVybiB0KHRoaXMsbixyLGUpfX0pfSx7MTExOjExMX1dLDI1NDpbZnVuY3Rpb24odCxuLHIpe3QoMTExKSgiVWludDgiLDEsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIFVpbnQ4Q2xhbXBlZEFycmF5KG4scixlKXtyZXR1cm4gdCh0aGlzLG4scixlKX19LCEwKX0sezExMToxMTF9XSwyNTU6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGUsaT10KDEyKSgwKSxvPXQoODcpLHU9dCg2MiksYz10KDY1KSxmPXQoMjEpLGE9dCg0OSkscz11LmdldFdlYWssbD1PYmplY3QuaXNFeHRlbnNpYmxlLGg9Zi51ZnN0b3JlLHY9e30scD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gV2Vha01hcCgpe3JldHVybiB0KHRoaXMsYXJndW1lbnRzLmxlbmd0aD4wP2FyZ3VtZW50c1swXTp2b2lkIDApfX0sZD17Z2V0OmZ1bmN0aW9uIGdldCh0KXtpZihhKHQpKXt2YXIgbj1zKHQpO3JldHVybiBuPT09ITA/aCh0aGlzKS5nZXQodCk6bj9uW3RoaXMuX2ldOnZvaWQgMH19LHNldDpmdW5jdGlvbiBzZXQodCxuKXtyZXR1cm4gZi5kZWYodGhpcyx0LG4pfX0seT1uLmV4cG9ydHM9dCgyMikoIldlYWtNYXAiLHAsZCxmLCEwLCEwKTs3IT0obmV3IHkpLnNldCgoT2JqZWN0LmZyZWV6ZXx8T2JqZWN0KSh2KSw3KS5nZXQodikmJihlPWYuZ2V0Q29uc3RydWN0b3IocCksYyhlLnByb3RvdHlwZSxkKSx1Lk5FRUQ9ITAsaShbImRlbGV0ZSIsImhhcyIsImdldCIsInNldCJdLGZ1bmN0aW9uKHQpe3ZhciBuPXkucHJvdG90eXBlLHI9blt0XTtvKG4sdCxmdW5jdGlvbihuLGkpe2lmKGEobikmJiFsKG4pKXt0aGlzLl9mfHwodGhpcy5fZj1uZXcgZSk7dmFyIG89dGhpcy5fZlt0XShuLGkpO3JldHVybiJzZXQiPT10P3RoaXM6b31yZXR1cm4gci5jYWxsKHRoaXMsbixpKX0pfSkpfSx7MTI6MTIsMjE6MjEsMjI6MjIsNDk6NDksNjI6NjIsNjU6NjUsODc6ODd9XSwyNTY6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgyMSk7dCgyMikoIldlYWtTZXQiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBXZWFrU2V0KCl7cmV0dXJuIHQodGhpcyxhcmd1bWVudHMubGVuZ3RoPjA/YXJndW1lbnRzWzBdOnZvaWQgMCl9fSx7YWRkOmZ1bmN0aW9uIGFkZCh0KXtyZXR1cm4gZS5kZWYodGhpcyx0LCEwKX19LGUsITEsITApfSx7MjE6MjEsMjI6MjJ9XSwyNTc6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgzMiksaT10KDExKSghMCk7ZShlLlAsIkFycmF5Iix7aW5jbHVkZXM6ZnVuY3Rpb24gaW5jbHVkZXModCl7cmV0dXJuIGkodGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KSx0KDUpKCJpbmNsdWRlcyIpfSx7MTE6MTEsMzI6MzIsNTo1fV0sMjU4OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMiksaT10KDY0KSgpLG89dCgzOCkucHJvY2Vzcyx1PSJwcm9jZXNzIj09dCgxOCkobyk7ZShlLkcse2FzYXA6ZnVuY3Rpb24gYXNhcCh0KXt2YXIgbj11JiZvLmRvbWFpbjtpKG4/bi5iaW5kKHQpOnQpfX0pfSx7MTg6MTgsMzI6MzIsMzg6MzgsNjQ6NjR9XSwyNTk6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKSxpPXQoMTgpO2UoZS5TLCJFcnJvciIse2lzRXJyb3I6ZnVuY3Rpb24gaXNFcnJvcih0KXtyZXR1cm4iRXJyb3IiPT09aSh0KX19KX0sezE4OjE4LDMyOjMyfV0sMjYwOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMik7ZShlLlArZS5SLCJNYXAiLHt0b0pTT046dCgyMCkoIk1hcCIpfSl9LHsyMDoyMCwzMjozMn1dLDI2MTpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpO2UoZS5TLCJNYXRoIix7aWFkZGg6ZnVuY3Rpb24gaWFkZGgodCxuLHIsZSl7dmFyIGk9dD4+PjAsbz1uPj4+MCx1PXI+Pj4wO3JldHVybiBvKyhlPj4+MCkrKChpJnV8KGl8dSkmfihpK3U+Pj4wKSk+Pj4zMSl8MH19KX0sezMyOjMyfV0sMjYyOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMik7ZShlLlMsIk1hdGgiLHtpbXVsaDpmdW5jdGlvbiBpbXVsaCh0LG4pe3ZhciByPTY1NTM1LGU9K3QsaT0rbixvPWUmcix1PWkmcixjPWU+PjE2LGY9aT4+MTYsYT0oYyp1Pj4+MCkrKG8qdT4+PjE2KTtyZXR1cm4gYypmKyhhPj4xNikrKChvKmY+Pj4wKSsoYSZyKT4+MTYpfX0pfSx7MzI6MzJ9XSwyNjM6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKTtlKGUuUywiTWF0aCIse2lzdWJoOmZ1bmN0aW9uIGlzdWJoKHQsbixyLGUpe3ZhciBpPXQ+Pj4wLG89bj4+PjAsdT1yPj4+MDtyZXR1cm4gby0oZT4+PjApLSgofmkmdXx+KGledSkmaS11Pj4+MCk+Pj4zMSl8MH19KX0sezMyOjMyfV0sMjY0OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMik7ZShlLlMsIk1hdGgiLHt1bXVsaDpmdW5jdGlvbiB1bXVsaCh0LG4pe3ZhciByPTY1NTM1LGU9K3QsaT0rbixvPWUmcix1PWkmcixjPWU+Pj4xNixmPWk+Pj4xNixhPShjKnU+Pj4wKSsobyp1Pj4+MTYpO3JldHVybiBjKmYrKGE+Pj4xNikrKChvKmY+Pj4wKSsoYSZyKT4+PjE2KX19KX0sezMyOjMyfV0sMjY1OltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBlPXQoMzIpLGk9dCgxMDkpLG89dCgzKSx1PXQoNjcpO3QoMjgpJiZlKGUuUCt0KDY5KSwiT2JqZWN0Iix7X19kZWZpbmVHZXR0ZXJfXzpmdW5jdGlvbiBfX2RlZmluZUdldHRlcl9fKHQsbil7dS5mKGkodGhpcyksdCx7Z2V0Om8obiksZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KX19KX0sezEwOToxMDksMjg6MjgsMzozLDMyOjMyLDY3OjY3LDY5OjY5fV0sMjY2OltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBlPXQoMzIpLGk9dCgxMDkpLG89dCgzKSx1PXQoNjcpO3QoMjgpJiZlKGUuUCt0KDY5KSwiT2JqZWN0Iix7X19kZWZpbmVTZXR0ZXJfXzpmdW5jdGlvbiBfX2RlZmluZVNldHRlcl9fKHQsbil7dS5mKGkodGhpcyksdCx7c2V0Om8obiksZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KX19KX0sezEwOToxMDksMjg6MjgsMzozLDMyOjMyLDY3OjY3LDY5OjY5fV0sMjY3OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMiksaT10KDc5KSghMCk7ZShlLlMsIk9iamVjdCIse2VudHJpZXM6ZnVuY3Rpb24gZW50cmllcyh0KXtyZXR1cm4gaSh0KX19KX0sezMyOjMyLDc5Ojc5fV0sMjY4OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMiksaT10KDgwKSxvPXQoMTA3KSx1PXQoNzApLGM9dCgyNCk7ZShlLlMsIk9iamVjdCIse2dldE93blByb3BlcnR5RGVzY3JpcHRvcnM6ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KXtmb3IodmFyIG4scj1vKHQpLGU9dS5mLGY9aShyKSxhPXt9LHM9MDtmLmxlbmd0aD5zOyljKGEsbj1mW3MrK10sZShyLG4pKTtyZXR1cm4gYX19KX0sezEwNzoxMDcsMjQ6MjQsMzI6MzIsNzA6NzAsODA6ODB9XSwyNjk6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgzMiksaT10KDEwOSksbz10KDExMCksdT10KDc0KSxjPXQoNzApLmY7dCgyOCkmJmUoZS5QK3QoNjkpLCJPYmplY3QiLHtfX2xvb2t1cEdldHRlcl9fOmZ1bmN0aW9uIF9fbG9va3VwR2V0dGVyX18odCl7dmFyIG4scj1pKHRoaXMpLGU9byh0LCEwKTtkbyBpZihuPWMocixlKSlyZXR1cm4gbi5nZXQ7d2hpbGUocj11KHIpKX19KX0sezEwOToxMDksMTEwOjExMCwyODoyOCwzMjozMiw2OTo2OSw3MDo3MCw3NDo3NH1dLDI3MDpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDMyKSxpPXQoMTA5KSxvPXQoMTEwKSx1PXQoNzQpLGM9dCg3MCkuZjt0KDI4KSYmZShlLlArdCg2OSksIk9iamVjdCIse19fbG9va3VwU2V0dGVyX186ZnVuY3Rpb24gX19sb29rdXBTZXR0ZXJfXyh0KXt2YXIgbixyPWkodGhpcyksZT1vKHQsITApO2RvIGlmKG49YyhyLGUpKXJldHVybiBuLnNldDt3aGlsZShyPXUocikpfX0pfSx7MTA5OjEwOSwxMTA6MTEwLDI4OjI4LDMyOjMyLDY5OjY5LDcwOjcwLDc0Ojc0fV0sMjcxOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzMiksaT10KDc5KSghMSk7ZShlLlMsIk9iamVjdCIse3ZhbHVlczpmdW5jdGlvbiB2YWx1ZXModCl7cmV0dXJuIGkodCl9fSl9LHszMjozMiw3OTo3OX1dLDI3MjpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDMyKSxpPXQoMzgpLG89dCgyMyksdT10KDY0KSgpLGM9dCgxMTcpKCJvYnNlcnZhYmxlIiksZj10KDMpLGE9dCg3KSxzPXQoNiksbD10KDg2KSxoPXQoNDApLHY9dCgzNykscD12LlJFVFVSTixkPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMDpmKHQpfSx5PWZ1bmN0aW9uKHQpe3ZhciBuPXQuX2M7biYmKHQuX2M9dm9pZCAwLG4oKSl9LGc9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQuX299LGI9ZnVuY3Rpb24odCl7Zyh0KXx8KHQuX289dm9pZCAwLHkodCkpfSx4PWZ1bmN0aW9uKHQsbil7YSh0KSx0aGlzLl9jPXZvaWQgMCx0aGlzLl9vPXQsdD1uZXcgbSh0aGlzKTt0cnl7dmFyIHI9bih0KSxlPXI7bnVsbCE9ciYmKCJmdW5jdGlvbiI9PXR5cGVvZiByLnVuc3Vic2NyaWJlP3I9ZnVuY3Rpb24oKXtlLnVuc3Vic2NyaWJlKCl9OmYociksdGhpcy5fYz1yKX1jYXRjaChuKXtyZXR1cm4gdm9pZCB0LmVycm9yKG4pfWcodGhpcykmJnkodGhpcyl9O3gucHJvdG90eXBlPWwoe30se3Vuc3Vic2NyaWJlOmZ1bmN0aW9uIHVuc3Vic2NyaWJlKCl7Yih0aGlzKX19KTt2YXIgbT1mdW5jdGlvbih0KXt0aGlzLl9zPXR9O20ucHJvdG90eXBlPWwoe30se25leHQ6ZnVuY3Rpb24gbmV4dCh0KXt2YXIgbj10aGlzLl9zO2lmKCFnKG4pKXt2YXIgcj1uLl9vO3RyeXt2YXIgZT1kKHIubmV4dCk7aWYoZSlyZXR1cm4gZS5jYWxsKHIsdCl9Y2F0Y2godCl7dHJ5e2Iobil9ZmluYWxseXt0aHJvdyB0fX19fSxlcnJvcjpmdW5jdGlvbiBlcnJvcih0KXt2YXIgbj10aGlzLl9zO2lmKGcobikpdGhyb3cgdDt2YXIgcj1uLl9vO24uX289dm9pZCAwO3RyeXt2YXIgZT1kKHIuZXJyb3IpO2lmKCFlKXRocm93IHQ7dD1lLmNhbGwocix0KX1jYXRjaCh0KXt0cnl7eShuKX1maW5hbGx5e3Rocm93IHR9fXJldHVybiB5KG4pLHR9LGNvbXBsZXRlOmZ1bmN0aW9uIGNvbXBsZXRlKHQpe3ZhciBuPXRoaXMuX3M7aWYoIWcobikpe3ZhciByPW4uX287bi5fbz12b2lkIDA7dHJ5e3ZhciBlPWQoci5jb21wbGV0ZSk7dD1lP2UuY2FsbChyLHQpOnZvaWQgMH1jYXRjaCh0KXt0cnl7eShuKX1maW5hbGx5e3Rocm93IHR9fXJldHVybiB5KG4pLHR9fX0pO3ZhciB3PWZ1bmN0aW9uIE9ic2VydmFibGUodCl7cyh0aGlzLHcsIk9ic2VydmFibGUiLCJfZiIpLl9mPWYodCl9O2wody5wcm90b3R5cGUse3N1YnNjcmliZTpmdW5jdGlvbiBzdWJzY3JpYmUodCl7cmV0dXJuIG5ldyB4KHQsdGhpcy5fZil9LGZvckVhY2g6ZnVuY3Rpb24gZm9yRWFjaCh0KXt2YXIgbj10aGlzO3JldHVybiBuZXcoby5Qcm9taXNlfHxpLlByb21pc2UpKGZ1bmN0aW9uKHIsZSl7Zih0KTt2YXIgaT1uLnN1YnNjcmliZSh7bmV4dDpmdW5jdGlvbihuKXt0cnl7cmV0dXJuIHQobil9Y2F0Y2godCl7ZSh0KSxpLnVuc3Vic2NyaWJlKCl9fSxlcnJvcjplLGNvbXBsZXRlOnJ9KX0pfX0pLGwodyx7ZnJvbTpmdW5jdGlvbiBmcm9tKHQpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzP3RoaXM6dyxyPWQoYSh0KVtjXSk7aWYocil7dmFyIGU9YShyLmNhbGwodCkpO3JldHVybiBlLmNvbnN0cnVjdG9yPT09bj9lOm5ldyBuKGZ1bmN0aW9uKHQpe3JldHVybiBlLnN1YnNjcmliZSh0KX0pfXJldHVybiBuZXcgbihmdW5jdGlvbihuKXt2YXIgcj0hMTtyZXR1cm4gdShmdW5jdGlvbigpe2lmKCFyKXt0cnl7aWYodih0LCExLGZ1bmN0aW9uKHQpe2lmKG4ubmV4dCh0KSxyKXJldHVybiBwfSk9PT1wKXJldHVybn1jYXRjaCh0KXtpZihyKXRocm93IHQ7cmV0dXJuIHZvaWQgbi5lcnJvcih0KX1uLmNvbXBsZXRlKCl9fSksZnVuY3Rpb24oKXtyPSEwfX0pfSxvZjpmdW5jdGlvbiBvZigpe2Zvcih2YXIgdD0wLG49YXJndW1lbnRzLmxlbmd0aCxyPUFycmF5KG4pO3Q8bjspclt0XT1hcmd1bWVudHNbdCsrXTtyZXR1cm4gbmV3KCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzP3RoaXM6dykoZnVuY3Rpb24odCl7dmFyIG49ITE7cmV0dXJuIHUoZnVuY3Rpb24oKXtpZighbil7Zm9yKHZhciBlPTA7ZTxyLmxlbmd0aDsrK2UpaWYodC5uZXh0KHJbZV0pLG4pcmV0dXJuO3QuY29tcGxldGUoKX19KSxmdW5jdGlvbigpe249ITB9fSl9fSksaCh3LnByb3RvdHlwZSxjLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxlKGUuRyx7T2JzZXJ2YWJsZTp3fSksdCg5MSkoIk9ic2VydmFibGUiKX0sezExNzoxMTcsMjM6MjMsMzozLDMyOjMyLDM3OjM3LDM4OjM4LDQwOjQwLDY6Niw2NDo2NCw3OjcsODY6ODYsOTE6OTF9XSwyNzM6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDYzKSxpPXQoNyksbz1lLmtleSx1PWUuc2V0O2UuZXhwKHtkZWZpbmVNZXRhZGF0YTpmdW5jdGlvbiBkZWZpbmVNZXRhZGF0YSh0LG4scixlKXt1KHQsbixpKHIpLG8oZSkpfX0pfSx7NjM6NjMsNzo3fV0sMjc0OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg2MyksaT10KDcpLG89ZS5rZXksdT1lLm1hcCxjPWUuc3RvcmU7ZS5leHAoe2RlbGV0ZU1ldGFkYXRhOmZ1bmN0aW9uIGRlbGV0ZU1ldGFkYXRhKHQsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDwzP3ZvaWQgMDpvKGFyZ3VtZW50c1syXSksZT11KGkobiksciwhMSk7aWYodm9pZCAwPT09ZXx8IWUuZGVsZXRlKHQpKXJldHVybiExO2lmKGUuc2l6ZSlyZXR1cm4hMDt2YXIgZj1jLmdldChuKTtyZXR1cm4gZi5kZWxldGUociksISFmLnNpemV8fGMuZGVsZXRlKG4pfX0pfSx7NjM6NjMsNzo3fV0sMjc1OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgyMjApLGk9dCgxMCksbz10KDYzKSx1PXQoNyksYz10KDc0KSxmPW8ua2V5cyxhPW8ua2V5LHM9ZnVuY3Rpb24odCxuKXt2YXIgcj1mKHQsbiksbz1jKHQpO2lmKG51bGw9PT1vKXJldHVybiByO3ZhciB1PXMobyxuKTtyZXR1cm4gdS5sZW5ndGg/ci5sZW5ndGg/aShuZXcgZShyLmNvbmNhdCh1KSkpOnU6cn07by5leHAoe2dldE1ldGFkYXRhS2V5czpmdW5jdGlvbiBnZXRNZXRhZGF0YUtleXModCl7cmV0dXJuIHModSh0KSxhcmd1bWVudHMubGVuZ3RoPDI/dm9pZCAwOmEoYXJndW1lbnRzWzFdKSl9fSl9LHsxMDoxMCwyMjA6MjIwLDYzOjYzLDc6Nyw3NDo3NH1dLDI3NjpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoNjMpLGk9dCg3KSxvPXQoNzQpLHU9ZS5oYXMsYz1lLmdldCxmPWUua2V5LGE9ZnVuY3Rpb24odCxuLHIpe3ZhciBlPXUodCxuLHIpO2lmKGUpcmV0dXJuIGModCxuLHIpO3ZhciBpPW8obik7cmV0dXJuIG51bGwhPT1pP2EodCxpLHIpOnZvaWQgMH07ZS5leHAoe2dldE1ldGFkYXRhOmZ1bmN0aW9uIGdldE1ldGFkYXRhKHQsbil7cmV0dXJuIGEodCxpKG4pLGFyZ3VtZW50cy5sZW5ndGg8Mz92b2lkIDA6Zihhcmd1bWVudHNbMl0pKX19KX0sezYzOjYzLDc6Nyw3NDo3NH1dLDI3NzpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoNjMpLGk9dCg3KSxvPWUua2V5cyx1PWUua2V5O2UuZXhwKHtnZXRPd25NZXRhZGF0YUtleXM6ZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGFLZXlzKHQpe3JldHVybiBvKGkodCksYXJndW1lbnRzLmxlbmd0aDwyP3ZvaWQgMDp1KGFyZ3VtZW50c1sxXSkpfX0pfSx7NjM6NjMsNzo3fV0sMjc4OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg2MyksaT10KDcpLG89ZS5nZXQsdT1lLmtleTtlLmV4cCh7Z2V0T3duTWV0YWRhdGE6ZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGEodCxuKXtyZXR1cm4gbyh0LGkobiksYXJndW1lbnRzLmxlbmd0aDwzP3ZvaWQgMDp1KGFyZ3VtZW50c1syXSkpfX0pfSx7NjM6NjMsNzo3fV0sMjc5OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg2MyksaT10KDcpLG89dCg3NCksdT1lLmhhcyxjPWUua2V5LGY9ZnVuY3Rpb24odCxuLHIpe3ZhciBlPXUodCxuLHIpO2lmKGUpcmV0dXJuITA7dmFyIGk9byhuKTtyZXR1cm4gbnVsbCE9PWkmJmYodCxpLHIpfTtlLmV4cCh7aGFzTWV0YWRhdGE6ZnVuY3Rpb24gaGFzTWV0YWRhdGEodCxuKXtyZXR1cm4gZih0LGkobiksYXJndW1lbnRzLmxlbmd0aDwzP3ZvaWQgMDpjKGFyZ3VtZW50c1syXSkpfX0pfSx7NjM6NjMsNzo3LDc0Ojc0fV0sMjgwOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg2MyksaT10KDcpLG89ZS5oYXMsdT1lLmtleTtlLmV4cCh7aGFzT3duTWV0YWRhdGE6ZnVuY3Rpb24gaGFzT3duTWV0YWRhdGEodCxuKXtyZXR1cm4gbyh0LGkobiksYXJndW1lbnRzLmxlbmd0aDwzP3ZvaWQgMDp1KGFyZ3VtZW50c1syXSkpfX0pfSx7NjM6NjMsNzo3fV0sMjgxOltmdW5jdGlvbih0LG4scil7dmFyIGU9dCg2MyksaT10KDcpLG89dCgzKSx1PWUua2V5LGM9ZS5zZXQ7ZS5leHAoe21ldGFkYXRhOmZ1bmN0aW9uIG1ldGFkYXRhKHQsbil7cmV0dXJuIGZ1bmN0aW9uIGRlY29yYXRvcihyLGUpe2ModCxuLCh2b2lkIDAhPT1lP2k6bykociksdShlKSl9fX0pfSx7MzozLDYzOjYzLDc6N31dLDI4MjpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpO2UoZS5QK2UuUiwiU2V0Iix7dG9KU09OOnQoMjApKCJTZXQiKX0pfSx7MjA6MjAsMzI6MzJ9XSwyODM6W2Z1bmN0aW9uKHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGU9dCgzMiksaT10KDk3KSghMCk7ZShlLlAsIlN0cmluZyIse2F0OmZ1bmN0aW9uIGF0KHQpe3JldHVybiBpKHRoaXMsdCl9fSl9LHszMjozMiw5Nzo5N31dLDI4NDpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT10KDMyKSxpPXQoMjcpLG89dCgxMDgpLHU9dCg1MCksYz10KDM2KSxmPVJlZ0V4cC5wcm90b3R5cGUsYT1mdW5jdGlvbih0LG4pe3RoaXMuX3I9dCx0aGlzLl9zPW59O3QoNTIpKGEsIlJlZ0V4cCBTdHJpbmciLGZ1bmN0aW9uIG5leHQoKXt2YXIgdD10aGlzLl9yLmV4ZWModGhpcy5fcyk7cmV0dXJue3ZhbHVlOnQsZG9uZTpudWxsPT09dH19KSxlKGUuUCwiU3RyaW5nIix7bWF0Y2hBbGw6ZnVuY3Rpb24gbWF0Y2hBbGwodCl7aWYoaSh0aGlzKSwhdSh0KSl0aHJvdyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIHJlZ2V4cCEiKTt2YXIgbj1TdHJpbmcodGhpcykscj0iZmxhZ3MiaW4gZj9TdHJpbmcodC5mbGFncyk6Yy5jYWxsKHQpLGU9bmV3IFJlZ0V4cCh0LnNvdXJjZSx+ci5pbmRleE9mKCJnIik/cjoiZyIrcik7cmV0dXJuIGUubGFzdEluZGV4PW8odC5sYXN0SW5kZXgpLG5ldyBhKGUsbil9fSl9LHsxMDg6MTA4LDI3OjI3LDMyOjMyLDM2OjM2LDUwOjUwLDUyOjUyfV0sMjg1OltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBlPXQoMzIpLGk9dCgxMDApO2UoZS5QLCJTdHJpbmciLHtwYWRFbmQ6ZnVuY3Rpb24gcGFkRW5kKHQpe3JldHVybiBpKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwhMSl9fSl9LHsxMDA6MTAwLDMyOjMyfV0sMjg2OltmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBlPXQoMzIpLGk9dCgxMDApO2UoZS5QLCJTdHJpbmciLHtwYWRTdGFydDpmdW5jdGlvbiBwYWRTdGFydCh0KXtyZXR1cm4gaSh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsITApfX0pfSx7MTAwOjEwMCwzMjozMn1dLDI4NzpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt0KDEwMikoInRyaW1MZWZ0IixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gdHJpbUxlZnQoKXtyZXR1cm4gdCh0aGlzLDEpfX0sInRyaW1TdGFydCIpfSx7MTAyOjEwMn1dLDI4ODpbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt0KDEwMikoInRyaW1SaWdodCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIHRyaW1SaWdodCgpe3JldHVybiB0KHRoaXMsMil9fSwidHJpbUVuZCIpfSx7MTAyOjEwMn1dLDI4OTpbZnVuY3Rpb24odCxuLHIpe3QoMTE1KSgiYXN5bmNJdGVyYXRvciIpfSx7MTE1OjExNX1dLDI5MDpbZnVuY3Rpb24odCxuLHIpe3QoMTE1KSgib2JzZXJ2YWJsZSIpfSx7MTE1OjExNX1dLDI5MTpbZnVuY3Rpb24odCxuLHIpe3ZhciBlPXQoMzIpO2UoZS5TLCJTeXN0ZW0iLHtnbG9iYWw6dCgzOCl9KX0sezMyOjMyLDM4OjM4fV0sMjkyOltmdW5jdGlvbih0LG4scil7Zm9yKHZhciBlPXQoMTMwKSxpPXQoODcpLG89dCgzOCksdT10KDQwKSxjPXQoNTYpLGY9dCgxMTcpLGE9ZigiaXRlcmF0b3IiKSxzPWYoInRvU3RyaW5nVGFnIiksbD1jLkFycmF5LGg9WyJOb2RlTGlzdCIsIkRPTVRva2VuTGlzdCIsIk1lZGlhTGlzdCIsIlN0eWxlU2hlZXRMaXN0IiwiQ1NTUnVsZUxpc3QiXSx2PTA7djw1O3YrKyl7dmFyIHAsZD1oW3ZdLHk9b1tkXSxnPXkmJnkucHJvdG90eXBlO2lmKGcpe2dbYV18fHUoZyxhLGwpLGdbc118fHUoZyxzLGQpLGNbZF09bDtmb3IocCBpbiBlKWdbcF18fGkoZyxwLGVbcF0sITApfX19LHsxMTc6MTE3LDEzMDoxMzAsMzg6MzgsNDA6NDAsNTY6NTYsODc6ODd9XSwyOTM6W2Z1bmN0aW9uKHQsbixyKXt2YXIgZT10KDMyKSxpPXQoMTA0KTtlKGUuRytlLkIse3NldEltbWVkaWF0ZTppLnNldCxjbGVhckltbWVkaWF0ZTppLmNsZWFyfSl9LHsxMDQ6MTA0LDMyOjMyfV0sMjk0OltmdW5jdGlvbih0LG4scil7dmFyIGU9dCgzOCksaT10KDMyKSxvPXQoNDQpLHU9dCg4MyksYz1lLm5hdmlnYXRvcixmPSEhYyYmL01TSUUgLlwuLy50ZXN0KGMudXNlckFnZW50KSxhPWZ1bmN0aW9uKHQpe3JldHVybiBmP2Z1bmN0aW9uKG4scil7cmV0dXJuIHQobyh1LFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpLCJmdW5jdGlvbiI9PXR5cGVvZiBuP246RnVuY3Rpb24obikpLHIpfTp0fTtpKGkuRytpLkIraS5GKmYse3NldFRpbWVvdXQ6YShlLnNldFRpbWVvdXQpLHNldEludGVydmFsOmEoZS5zZXRJbnRlcnZhbCl9KX0sezMyOjMyLDM4OjM4LDQ0OjQ0LDgzOjgzfV0sMjk1OltmdW5jdGlvbih0LG4scil7dCgyNDMpLHQoMTgwKSx0KDE4MiksdCgxODEpLHQoMTg0KSx0KDE4NiksdCgxOTEpLHQoMTg1KSx0KDE4MyksdCgxOTMpLHQoMTkyKSx0KDE4OCksdCgxODkpLHQoMTg3KSx0KDE3OSksdCgxOTApLHQoMTk0KSx0KDE5NSksdCgxNDYpLHQoMTQ4KSx0KDE0NyksdCgxOTcpLHQoMTk2KSx0KDE2NyksdCgxNzcpLHQoMTc4KSx0KDE2OCksdCgxNjkpLHQoMTcwKSx0KDE3MSksdCgxNzIpLHQoMTczKSx0KDE3NCksdCgxNzUpLHQoMTc2KSx0KDE1MCksdCgxNTEpLHQoMTUyKSx0KDE1MyksdCgxNTQpLHQoMTU1KSx0KDE1NiksdCgxNTcpLHQoMTU4KSx0KDE1OSksdCgxNjApLHQoMTYxKSx0KDE2MiksdCgxNjMpLHQoMTY0KSx0KDE2NSksdCgxNjYpLHQoMjMwKSx0KDIzNSksdCgyNDIpLHQoMjMzKSx0KDIyNSksdCgyMjYpLHQoMjMxKSx0KDIzNiksdCgyMzgpLHQoMjIxKSx0KDIyMiksdCgyMjMpLHQoMjI0KSx0KDIyNyksdCgyMjgpLHQoMjI5KSx0KDIzMiksdCgyMzQpLHQoMjM3KSx0KDIzOSksdCgyNDApLHQoMjQxKSx0KDE0MSksdCgxNDMpLHQoMTQyKSx0KDE0NSksdCgxNDQpLHQoMTI5KSx0KDEyNyksdCgxMzQpLHQoMTMxKSx0KDEzNyksdCgxMzkpLHQoMTI2KSx0KDEzMyksdCgxMjMpLHQoMTM4KSx0KDEyMSksdCgxMzYpLHQoMTM1KSx0KDEyOCksdCgxMzIpLHQoMTIwKSx0KDEyMiksdCgxMjUpLHQoMTI0KSx0KDE0MCksdCgxMzApLHQoMjEzKSx0KDIxOSksdCgyMTQpLHQoMjE1KSx0KDIxNiksdCgyMTcpLHQoMjE4KSx0KDE5OCksdCgxNDkpLHQoMjIwKSx0KDI1NSksdCgyNTYpLHQoMjQ0KSx0KDI0NSksdCgyNTApLHQoMjUzKSx0KDI1NCksdCgyNDgpLHQoMjUxKSx0KDI0OSksdCgyNTIpLHQoMjQ2KSx0KDI0NyksdCgxOTkpLHQoMjAwKSx0KDIwMSksdCgyMDIpLHQoMjAzKSx0KDIwNiksdCgyMDQpLHQoMjA1KSx0KDIwNyksdCgyMDgpLHQoMjA5KSx0KDIxMCksdCgyMTIpLHQoMjExKSx0KDI1NyksdCgyODMpLHQoMjg2KSx0KDI4NSksdCgyODcpLHQoMjg4KSx0KDI4NCksdCgyODkpLHQoMjkwKSx0KDI2OCksdCgyNzEpLHQoMjY3KSx0KDI2NSksdCgyNjYpLHQoMjY5KSx0KDI3MCksdCgyNjApLHQoMjgyKSx0KDI5MSksdCgyNTkpLHQoMjYxKSx0KDI2MyksdCgyNjIpLHQoMjY0KSx0KDI3MyksdCgyNzQpLHQoMjc2KSx0KDI3NSksdCgyNzgpLHQoMjc3KSx0KDI3OSksdCgyODApLHQoMjgxKSx0KDI1OCksdCgyNzIpLHQoMjk0KSx0KDI5MyksdCgyOTIpLG4uZXhwb3J0cz10KDIzKX0sezEyMDoxMjAsMTIxOjEyMSwxMjI6MTIyLDEyMzoxMjMsMTI0OjEyNCwxMjU6MTI1LDEyNjoxMjYsMTI3OjEyNywxMjg6MTI4LDEyOToxMjksMTMwOjEzMCwxMzE6MTMxLDEzMjoxMzIsMTMzOjEzMywxMzQ6MTM0LDEzNToxMzUsMTM2OjEzNiwxMzc6MTM3LDEzODoxMzgsMTM5OjEzOSwxNDA6MTQwLDE0MToxNDEsMTQyOjE0MiwxNDM6MTQzLDE0NDoxNDQsMTQ1OjE0NSwxNDY6MTQ2LDE0NzoxNDcsMTQ4OjE0OCwxNDk6MTQ5LDE1MDoxNTAsMTUxOjE1MSwxNTI6MTUyLDE1MzoxNTMsMTU0OjE1NCwxNTU6MTU1LDE1NjoxNTYsMTU3OjE1NywxNTg6MTU4LDE1OToxNTksMTYwOjE2MCwxNjE6MTYxLDE2MjoxNjIsMTYzOjE2MywxNjQ6MTY0LDE2NToxNjUsMTY2OjE2NiwxNjc6MTY3LDE2ODoxNjgsMTY5OjE2OSwxNzA6MTcwLDE3MToxNzEsMTcyOjE3MiwxNzM6MTczLDE3NDoxNzQsMTc1OjE3NSwxNzY6MTc2LDE3NzoxNzcsMTc4OjE3OCwxNzk6MTc5LDE4MDoxODAsMTgxOjE4MSwxODI6MTgyLDE4MzoxODMsMTg0OjE4NCwxODU6MTg1LDE4NjoxODYsMTg3OjE4NywxODg6MTg4LDE4OToxODksMTkwOjE5MCwxOTE6MTkxLDE5MjoxOTIsMTkzOjE5MywxOTQ6MTk0LDE5NToxOTUsMTk2OjE5NiwxOTc6MTk3LDE5ODoxOTgsMTk5OjE5OSwyMDA6MjAwLDIwMToyMDEsMjAyOjIwMiwyMDM6MjAzLDIwNDoyMDQsMjA1OjIwNSwyMDY6MjA2LDIwNzoyMDcsMjA4OjIwOCwyMDk6MjA5LDIxMDoyMTAsMjExOjIxMSwyMTI6MjEyLDIxMzoyMTMsMjE0OjIxNCwyMTU6MjE1LDIxNjoyMTYsMjE3OjIxNywyMTg6MjE4LDIxOToyMTksMjIwOjIyMCwyMjE6MjIxLDIyMjoyMjIsMjIzOjIyMywyMjQ6MjI0LDIyNToyMjUsMjI2OjIyNiwyMjc6MjI3LDIyODoyMjgsMjI5OjIyOSwyMzoyMywyMzA6MjMwLDIzMToyMzEsMjMyOjIzMiwyMzM6MjMzLDIzNDoyMzQsMjM1OjIzNSwyMzY6MjM2LDIzNzoyMzcsMjM4OjIzOCwyMzk6MjM5LDI0MDoyNDAsMjQxOjI0MSwyNDI6MjQyLDI0MzoyNDMsMjQ0OjI0NCwyNDU6MjQ1LDI0NjoyNDYsMjQ3OjI0NywyNDg6MjQ4LDI0OToyNDksMjUwOjI1MCwyNTE6MjUxLDI1MjoyNTIsMjUzOjI1MywyNTQ6MjU0LDI1NToyNTUsMjU2OjI1NiwyNTc6MjU3LDI1ODoyNTgsMjU5OjI1OSwyNjA6MjYwLDI2MToyNjEsMjYyOjI2MiwyNjM6MjYzLDI2NDoyNjQsMjY1OjI2NSwyNjY6MjY2LDI2NzoyNjcsMjY4OjI2OCwyNjk6MjY5LDI3MDoyNzAsMjcxOjI3MSwyNzI6MjcyLDI3MzoyNzMsMjc0OjI3NCwyNzU6Mjc1LDI3NjoyNzYsMjc3OjI3NywyNzg6Mjc4LDI3OToyNzksMjgwOjI4MCwyODE6MjgxLDI4MjoyODIsMjgzOjI4MywyODQ6Mjg0LDI4NToyODUsMjg2OjI4NiwyODc6Mjg3LDI4ODoyODgsMjg5OjI4OSwyOTA6MjkwLDI5MToyOTEsMjkyOjI5MiwyOTM6MjkzLDI5NDoyOTR9XSwyOTY6W2Z1bmN0aW9uKHQsbixyKXsoZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB3cmFwKHQsbixyLGUpe3ZhciBpPW4mJm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yP246R2VuZXJhdG9yLG89T2JqZWN0LmNyZWF0ZShpLnByb3RvdHlwZSksdT1uZXcgQ29udGV4dChlfHxbXSk7cmV0dXJuIG8uX2ludm9rZT1tYWtlSW52b2tlTWV0aG9kKHQscix1KSxvfWZ1bmN0aW9uIHRyeUNhdGNoKHQsbixyKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOnQuY2FsbChuLHIpfX1jYXRjaCh0KXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzp0fX19ZnVuY3Rpb24gR2VuZXJhdG9yKCl7fWZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCl7fWZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCl7fWZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyh0KXtbIm5leHQiLCJ0aHJvdyIsInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24obil7dFtuXT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faW52b2tlKG4sdCl9fSl9ZnVuY3Rpb24gQXN5bmNJdGVyYXRvcih0KXtmdW5jdGlvbiBpbnZva2UobixyLGUsbyl7dmFyIHU9dHJ5Q2F0Y2godFtuXSx0LHIpO2lmKCJ0aHJvdyIhPT11LnR5cGUpe3ZhciBjPXUuYXJnLGY9Yy52YWx1ZTtyZXR1cm4gZiYmIm9iamVjdCI9PXR5cGVvZiBmJiZpLmNhbGwoZiwiX19hd2FpdCIpP1Byb21pc2UucmVzb2x2ZShmLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odCl7aW52b2tlKCJuZXh0Iix0LGUsbyl9LGZ1bmN0aW9uKHQpe2ludm9rZSgidGhyb3ciLHQsZSxvKX0pOlByb21pc2UucmVzb2x2ZShmKS50aGVuKGZ1bmN0aW9uKHQpe2MudmFsdWU9dCxlKGMpfSxvKX1vKHUuYXJnKX1mdW5jdGlvbiBlbnF1ZXVlKHQscil7ZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obixlKXtpbnZva2UodCxyLG4sZSl9KX1yZXR1cm4gbj1uP24udGhlbihjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyk6Y2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKX0ib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MmJnByb2Nlc3MuZG9tYWluJiYoaW52b2tlPXByb2Nlc3MuZG9tYWluLmJpbmQoaW52b2tlKSk7dmFyIG47dGhpcy5faW52b2tlPWVucXVldWV9ZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZCh0LG4sZSl7dmFyIGk9cztyZXR1cm4gZnVuY3Rpb24gaW52b2tlKG8sdSl7aWYoaT09PWgpdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7aWYoaT09PXYpe2lmKCJ0aHJvdyI9PT1vKXRocm93IHU7cmV0dXJuIGRvbmVSZXN1bHQoKX1mb3IoOzspe3ZhciBjPWUuZGVsZWdhdGU7aWYoYyl7aWYoInJldHVybiI9PT1vfHwidGhyb3ciPT09byYmYy5pdGVyYXRvcltvXT09PXIpe2UuZGVsZWdhdGU9bnVsbDt2YXIgZj1jLml0ZXJhdG9yLnJldHVybjtpZihmKXt2YXIgYT10cnlDYXRjaChmLGMuaXRlcmF0b3IsdSk7aWYoInRocm93Ij09PWEudHlwZSl7bz0idGhyb3ciLHU9YS5hcmc7Y29udGludWV9fWlmKCJyZXR1cm4iPT09byljb250aW51ZX12YXIgYT10cnlDYXRjaChjLml0ZXJhdG9yW29dLGMuaXRlcmF0b3IsdSk7aWYoInRocm93Ij09PWEudHlwZSl7ZS5kZWxlZ2F0ZT1udWxsLG89InRocm93Iix1PWEuYXJnO2NvbnRpbnVlfW89Im5leHQiLHU9cjt2YXIgZD1hLmFyZztpZighZC5kb25lKXJldHVybiBpPWwsZDtlW2MucmVzdWx0TmFtZV09ZC52YWx1ZSxlLm5leHQ9Yy5uZXh0TG9jLGUuZGVsZWdhdGU9bnVsbH1pZigibmV4dCI9PT1vKWUuc2VudD1lLl9zZW50PXU7ZWxzZSBpZigidGhyb3ciPT09byl7aWYoaT09PXMpdGhyb3cgaT12LHU7ZS5kaXNwYXRjaEV4Y2VwdGlvbih1KSYmKG89Im5leHQiLHU9cil9ZWxzZSJyZXR1cm4iPT09byYmZS5hYnJ1cHQoInJldHVybiIsdSk7aT1oO3ZhciBhPXRyeUNhdGNoKHQsbixlKTtpZigibm9ybWFsIj09PWEudHlwZSl7aT1lLmRvbmU/djpsO3ZhciBkPXt2YWx1ZTphLmFyZyxkb25lOmUuZG9uZX07aWYoYS5hcmchPT1wKXJldHVybiBkO2UuZGVsZWdhdGUmJiJuZXh0Ij09PW8mJih1PXIpfWVsc2UidGhyb3ciPT09YS50eXBlJiYoaT12LG89InRocm93Iix1PWEuYXJnKX19fWZ1bmN0aW9uIHB1c2hUcnlFbnRyeSh0KXt2YXIgbj17dHJ5TG9jOnRbMF19OzEgaW4gdCYmKG4uY2F0Y2hMb2M9dFsxXSksMiBpbiB0JiYobi5maW5hbGx5TG9jPXRbMl0sbi5hZnRlckxvYz10WzNdKSx0aGlzLnRyeUVudHJpZXMucHVzaChuKX1mdW5jdGlvbiByZXNldFRyeUVudHJ5KHQpe3ZhciBuPXQuY29tcGxldGlvbnx8e307bi50eXBlPSJub3JtYWwiLGRlbGV0ZSBuLmFyZyx0LmNvbXBsZXRpb249bn1mdW5jdGlvbiBDb250ZXh0KHQpe3RoaXMudHJ5RW50cmllcz1be3RyeUxvYzoicm9vdCJ9XSx0LmZvckVhY2gocHVzaFRyeUVudHJ5LHRoaXMpLHRoaXMucmVzZXQoITApfWZ1bmN0aW9uIHZhbHVlcyh0KXtpZih0KXt2YXIgbj10W3VdO2lmKG4pcmV0dXJuIG4uY2FsbCh0KTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5uZXh0KXJldHVybiB0O2lmKCFpc05hTih0Lmxlbmd0aCkpe3ZhciBlPS0xLG89ZnVuY3Rpb24gbmV4dCgpe2Zvcig7KytlPHQubGVuZ3RoOylpZihpLmNhbGwodCxlKSlyZXR1cm4gbmV4dC52YWx1ZT10W2VdLG5leHQuZG9uZT0hMSxuZXh0O3JldHVybiBuZXh0LnZhbHVlPXIsbmV4dC5kb25lPSEwLG5leHR9O3JldHVybiBvLm5leHQ9b319cmV0dXJue25leHQ6ZG9uZVJlc3VsdH19ZnVuY3Rpb24gZG9uZVJlc3VsdCgpe3JldHVybnt2YWx1ZTpyLGRvbmU6ITB9fXZhciByLGU9T2JqZWN0LnByb3RvdHlwZSxpPWUuaGFzT3duUHJvcGVydHksbz0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sP1N5bWJvbDp7fSx1PW8uaXRlcmF0b3J8fCJAQGl0ZXJhdG9yIixjPW8udG9TdHJpbmdUYWd8fCJAQHRvU3RyaW5nVGFnIixmPSJvYmplY3QiPT10eXBlb2YgbixhPXQucmVnZW5lcmF0b3JSdW50aW1lO2lmKGEpcmV0dXJuIHZvaWQoZiYmKG4uZXhwb3J0cz1hKSk7YT10LnJlZ2VuZXJhdG9yUnVudGltZT1mP24uZXhwb3J0czp7fSxhLndyYXA9d3JhcDt2YXIgcz0ic3VzcGVuZGVkU3RhcnQiLGw9InN1c3BlbmRlZFlpZWxkIixoPSJleGVjdXRpbmciLHY9ImNvbXBsZXRlZCIscD17fSxkPXt9O2RbdV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307dmFyIHk9T2JqZWN0LmdldFByb3RvdHlwZU9mLGc9eSYmeSh5KHZhbHVlcyhbXSkpKTtnJiZnIT09ZSYmaS5jYWxsKGcsdSkmJihkPWcpO3ZhciBiPUdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZT1HZW5lcmF0b3IucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZCk7R2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlPWIuY29uc3RydWN0b3I9R2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3I9R2VuZXJhdG9yRnVuY3Rpb24sR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGVbY109R2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWU9IkdlbmVyYXRvckZ1bmN0aW9uIixhLmlzR2VuZXJhdG9yRnVuY3Rpb249ZnVuY3Rpb24odCl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuY29uc3RydWN0b3I7cmV0dXJuISFuJiYobj09PUdlbmVyYXRvckZ1bmN0aW9ufHwiR2VuZXJhdG9yRnVuY3Rpb24iPT09KG4uZGlzcGxheU5hbWV8fG4ubmFtZSkpfSxhLm1hcms9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk6KHQuX19wcm90b19fPUdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLGMgaW4gdHx8KHRbY109IkdlbmVyYXRvckZ1bmN0aW9uIikpLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYiksdH0sYS5hd3JhcD1mdW5jdGlvbih0KXtyZXR1cm57X19hd2FpdDp0fX0sZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKSxhLkFzeW5jSXRlcmF0b3I9QXN5bmNJdGVyYXRvcixhLmFzeW5jPWZ1bmN0aW9uKHQsbixyLGUpe3ZhciBpPW5ldyBBc3luY0l0ZXJhdG9yKHdyYXAodCxuLHIsZSkpO3JldHVybiBhLmlzR2VuZXJhdG9yRnVuY3Rpb24obik/aTppLm5leHQoKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiB0LmRvbmU/dC52YWx1ZTppLm5leHQoKX0pfSxkZWZpbmVJdGVyYXRvck1ldGhvZHMoYiksYltjXT0iR2VuZXJhdG9yIixiLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgR2VuZXJhdG9yXSJ9LGEua2V5cz1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIHIgaW4gdCluLnB1c2gocik7cmV0dXJuIG4ucmV2ZXJzZSgpLGZ1bmN0aW9uIG5leHQoKXtmb3IoO24ubGVuZ3RoOyl7dmFyIHI9bi5wb3AoKTtpZihyIGluIHQpcmV0dXJuIG5leHQudmFsdWU9cixuZXh0LmRvbmU9ITEsbmV4dH1yZXR1cm4gbmV4dC5kb25lPSEwLG5leHR9fSxhLnZhbHVlcz12YWx1ZXMsQ29udGV4dC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkNvbnRleHQscmVzZXQ6ZnVuY3Rpb24odCl7aWYodGhpcy5wcmV2PTAsdGhpcy5uZXh0PTAsdGhpcy5zZW50PXRoaXMuX3NlbnQ9cix0aGlzLmRvbmU9ITEsdGhpcy5kZWxlZ2F0ZT1udWxsLHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpLCF0KWZvcih2YXIgbiBpbiB0aGlzKSJ0Ij09PW4uY2hhckF0KDApJiZpLmNhbGwodGhpcyxuKSYmIWlzTmFOKCtuLnNsaWNlKDEpKSYmKHRoaXNbbl09cil9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmRvbmU9ITA7dmFyIHQ9dGhpcy50cnlFbnRyaWVzWzBdLG49dC5jb21wbGV0aW9uO2lmKCJ0aHJvdyI9PT1uLnR5cGUpdGhyb3cgbi5hcmc7cmV0dXJuIHRoaXMucnZhbH0sZGlzcGF0Y2hFeGNlcHRpb246ZnVuY3Rpb24odCl7ZnVuY3Rpb24gaGFuZGxlKHIsZSl7cmV0dXJuIG8udHlwZT0idGhyb3ciLG8uYXJnPXQsbi5uZXh0PXIsISFlfWlmKHRoaXMuZG9uZSl0aHJvdyB0O2Zvcih2YXIgbj10aGlzLHI9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO3I+PTA7LS1yKXt2YXIgZT10aGlzLnRyeUVudHJpZXNbcl0sbz1lLmNvbXBsZXRpb247CmlmKCJyb290Ij09PWUudHJ5TG9jKXJldHVybiBoYW5kbGUoImVuZCIpO2lmKGUudHJ5TG9jPD10aGlzLnByZXYpe3ZhciB1PWkuY2FsbChlLCJjYXRjaExvYyIpLGM9aS5jYWxsKGUsImZpbmFsbHlMb2MiKTtpZih1JiZjKXtpZih0aGlzLnByZXY8ZS5jYXRjaExvYylyZXR1cm4gaGFuZGxlKGUuY2F0Y2hMb2MsITApO2lmKHRoaXMucHJldjxlLmZpbmFsbHlMb2MpcmV0dXJuIGhhbmRsZShlLmZpbmFsbHlMb2MpfWVsc2UgaWYodSl7aWYodGhpcy5wcmV2PGUuY2F0Y2hMb2MpcmV0dXJuIGhhbmRsZShlLmNhdGNoTG9jLCEwKX1lbHNle2lmKCFjKXRocm93IG5ldyBFcnJvcigidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHkiKTtpZih0aGlzLnByZXY8ZS5maW5hbGx5TG9jKXJldHVybiBoYW5kbGUoZS5maW5hbGx5TG9jKX19fX0sYWJydXB0OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciByPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtyPj0wOy0tcil7dmFyIGU9dGhpcy50cnlFbnRyaWVzW3JdO2lmKGUudHJ5TG9jPD10aGlzLnByZXYmJmkuY2FsbChlLCJmaW5hbGx5TG9jIikmJnRoaXMucHJldjxlLmZpbmFsbHlMb2Mpe3ZhciBvPWU7YnJlYWt9fW8mJigiYnJlYWsiPT09dHx8ImNvbnRpbnVlIj09PXQpJiZvLnRyeUxvYzw9biYmbjw9by5maW5hbGx5TG9jJiYobz1udWxsKTt2YXIgdT1vP28uY29tcGxldGlvbjp7fTtyZXR1cm4gdS50eXBlPXQsdS5hcmc9bixvP3RoaXMubmV4dD1vLmZpbmFsbHlMb2M6dGhpcy5jb21wbGV0ZSh1KSxwfSxjb21wbGV0ZTpmdW5jdGlvbih0LG4pe2lmKCJ0aHJvdyI9PT10LnR5cGUpdGhyb3cgdC5hcmc7ImJyZWFrIj09PXQudHlwZXx8ImNvbnRpbnVlIj09PXQudHlwZT90aGlzLm5leHQ9dC5hcmc6InJldHVybiI9PT10LnR5cGU/KHRoaXMucnZhbD10LmFyZyx0aGlzLm5leHQ9ImVuZCIpOiJub3JtYWwiPT09dC50eXBlJiZuJiYodGhpcy5uZXh0PW4pfSxmaW5pc2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtuPj0wOy0tbil7dmFyIHI9dGhpcy50cnlFbnRyaWVzW25dO2lmKHIuZmluYWxseUxvYz09PXQpcmV0dXJuIHRoaXMuY29tcGxldGUoci5jb21wbGV0aW9uLHIuYWZ0ZXJMb2MpLHJlc2V0VHJ5RW50cnkocikscH19LGNhdGNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7bj49MDstLW4pe3ZhciByPXRoaXMudHJ5RW50cmllc1tuXTtpZihyLnRyeUxvYz09PXQpe3ZhciBlPXIuY29tcGxldGlvbjtpZigidGhyb3ciPT09ZS50eXBlKXt2YXIgaT1lLmFyZztyZXNldFRyeUVudHJ5KHIpfXJldHVybiBpfX10aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpfSxkZWxlZ2F0ZVlpZWxkOmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZT17aXRlcmF0b3I6dmFsdWVzKHQpLHJlc3VsdE5hbWU6bixuZXh0TG9jOnJ9LHB9fX0oIm9iamVjdCI9PXR5cGVvZiB0P3Q6Im9iamVjdCI9PXR5cGVvZiB3aW5kb3c/d2luZG93OiJvYmplY3QiPT10eXBlb2Ygc2VsZj9zZWxmOnRoaXMpfSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7fV19LHt9LFsxXSk7Cg=="></script>
<script src="data:application/x-javascript;base64,Ly8gaHR0cHM6Ly9kM2pzLm9yZyBWZXJzaW9uIDQuNy4wLiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suCihmdW5jdGlvbih0LG4peyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/bihleHBvcnRzKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImV4cG9ydHMiXSxuKTpuKHQuZDM9dC5kM3x8e30pfSkodGhpcyxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm4gcXModChuKSxlKX19ZnVuY3Rpb24gZSh0LG4pe3JldHVyblt0LG5dfWZ1bmN0aW9uIHIodCxuLGUpe3ZhciByPU1hdGguYWJzKG4tdCkvTWF0aC5tYXgoMCxlKSxpPU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2cocikvTWF0aC5MTjEwKSksbz1yL2k7cmV0dXJuIG8+PUtzP2kqPTEwOm8+PXRmP2kqPTU6bz49bmYmJihpKj0yKSxuPHQ/LWk6aX1mdW5jdGlvbiBpKHQpe3JldHVybiB0Lmxlbmd0aH1mdW5jdGlvbiBvKHQpe3JldHVybiJ0cmFuc2xhdGUoIit0KyIsMCkifWZ1bmN0aW9uIHUodCl7cmV0dXJuInRyYW5zbGF0ZSgwLCIrdCsiKSJ9ZnVuY3Rpb24gYSh0KXt2YXIgbj10LmJhbmR3aWR0aCgpLzI7cmV0dXJuIHQucm91bmQoKSYmKG49TWF0aC5yb3VuZChuKSksZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSkrbn19ZnVuY3Rpb24gYygpe3JldHVybiF0aGlzLl9fYXhpc31mdW5jdGlvbiBzKHQsbil7ZnVuY3Rpb24gZShlKXt2YXIgbz1udWxsPT1zP24udGlja3M/bi50aWNrcy5hcHBseShuLGkpOm4uZG9tYWluKCk6cyx1PW51bGw9PWY/bi50aWNrRm9ybWF0P24udGlja0Zvcm1hdC5hcHBseShuLGkpOmJmOmYsZz1NYXRoLm1heChsLDApK3AseT1uLnJhbmdlKCksbT15WzBdKy41LHg9eVt5Lmxlbmd0aC0xXSsuNSxiPShuLmJhbmR3aWR0aD9hOmJmKShuLmNvcHkoKSksdz1lLnNlbGVjdGlvbj9lLnNlbGVjdGlvbigpOmUsTT13LnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoW251bGxdKSxUPXcuc2VsZWN0QWxsKCIudGljayIpLmRhdGEobyxuKS5vcmRlcigpLGs9VC5leGl0KCksUz1ULmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJ0aWNrIiksTj1ULnNlbGVjdCgibGluZSIpLEU9VC5zZWxlY3QoInRleHQiKTtNPU0ubWVyZ2UoTS5lbnRlcigpLmluc2VydCgicGF0aCIsIi50aWNrIikuYXR0cigiY2xhc3MiLCJkb21haW4iKS5hdHRyKCJzdHJva2UiLCIjMDAwIikpLFQ9VC5tZXJnZShTKSxOPU4ubWVyZ2UoUy5hcHBlbmQoImxpbmUiKS5hdHRyKCJzdHJva2UiLCIjMDAwIikuYXR0cihyKyIyIixkKmwpLmF0dHIodisiMSIsLjUpLmF0dHIodisiMiIsLjUpKSxFPUUubWVyZ2UoUy5hcHBlbmQoInRleHQiKS5hdHRyKCJmaWxsIiwiIzAwMCIpLmF0dHIocixkKmcpLmF0dHIodiwuNSkuYXR0cigiZHkiLHQ9PT13Zj8iMGVtIjp0PT09VGY/IjAuNzFlbSI6IjAuMzJlbSIpKSxlIT09dyYmKE09TS50cmFuc2l0aW9uKGUpLFQ9VC50cmFuc2l0aW9uKGUpLE49Ti50cmFuc2l0aW9uKGUpLEU9RS50cmFuc2l0aW9uKGUpLGs9ay50cmFuc2l0aW9uKGUpLmF0dHIoIm9wYWNpdHkiLFNmKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PWIodCkpP18odCk6dGhpcy5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpfSksUy5hdHRyKCJvcGFjaXR5IixTZikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih0KXt2YXIgbj10aGlzLnBhcmVudE5vZGUuX19heGlzO3JldHVybiBfKG4mJmlzRmluaXRlKG49bih0KSk/bjpiKHQpKX0pKSxrLnJlbW92ZSgpLE0uYXR0cigiZCIsdD09PWtmfHx0PT1NZj8iTSIrZCpoKyIsIittKyJIMC41ViIreCsiSCIrZCpoOiJNIittKyIsIitkKmgrIlYwLjVIIit4KyJWIitkKmgpLFQuYXR0cigib3BhY2l0eSIsMSkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih0KXtyZXR1cm4gXyhiKHQpKX0pLE4uYXR0cihyKyIyIixkKmwpLEUuYXR0cihyLGQqZykudGV4dCh1KSx3LmZpbHRlcihjKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoImZvbnQtc2l6ZSIsMTApLmF0dHIoImZvbnQtZmFtaWx5Iiwic2Fucy1zZXJpZiIpLmF0dHIoInRleHQtYW5jaG9yIix0PT09TWY/InN0YXJ0Ijp0PT09a2Y/ImVuZCI6Im1pZGRsZSIpLHcuZWFjaChmdW5jdGlvbigpe3RoaXMuX19heGlzPWJ9KX12YXIgcixpPVtdLHM9bnVsbCxmPW51bGwsbD02LGg9NixwPTMsZD10PT09d2Z8fHQ9PT1rZj8tMToxLHY9dD09PWtmfHx0PT09TWY/KHI9IngiLCJ5Iik6KHI9InkiLCJ4IiksXz10PT09d2Z8fHQ9PT1UZj9vOnU7cmV0dXJuIGUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlKTpufSxlLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIGk9eGYuY2FsbChhcmd1bWVudHMpLGV9LGUudGlja0FyZ3VtZW50cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsPT10P1tdOnhmLmNhbGwodCksZSk6aS5zbGljZSgpfSxlLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bnVsbD09dD9udWxsOnhmLmNhbGwodCksZSk6cyYmcy5zbGljZSgpfSxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9dCxlKTpmfSxlLnRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPWg9K3QsZSk6bH0sZS50aWNrU2l6ZUlubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPSt0LGUpOmx9LGUudGlja1NpemVPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdCxlKTpofSxlLnRpY2tQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPSt0LGUpOnB9LGV9ZnVuY3Rpb24gZih0KXtyZXR1cm4gcyh3Zix0KX1mdW5jdGlvbiBsKHQpe3JldHVybiBzKE1mLHQpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHMoVGYsdCl9ZnVuY3Rpb24gcCh0KXtyZXR1cm4gcyhrZix0KX1mdW5jdGlvbiBkKCl7Zm9yKHZhciB0LG49MCxlPWFyZ3VtZW50cy5sZW5ndGgscj17fTtuPGU7KytuKXtpZighKHQ9YXJndW1lbnRzW25dKyIiKXx8dCBpbiByKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO3JbdF09W119cmV0dXJuIG5ldyB2KHIpfWZ1bmN0aW9uIHYodCl7dGhpcy5fPXR9ZnVuY3Rpb24gXyh0LG4pe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9IiIscj10LmluZGV4T2YoIi4iKTtpZihyPj0wJiYoZT10LnNsaWNlKHIrMSksdD10LnNsaWNlKDAscikpLHQmJiFuLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTplfX0pfWZ1bmN0aW9uIGcodCxuKXtmb3IodmFyIGUscj0wLGk9dC5sZW5ndGg7cjxpOysrcilpZigoZT10W3JdKS5uYW1lPT09bilyZXR1cm4gZS52YWx1ZX1mdW5jdGlvbiB5KHQsbixlKXtmb3IodmFyIHI9MCxpPXQubGVuZ3RoO3I8aTsrK3IpaWYodFtyXS5uYW1lPT09bil7dFtyXT1OZix0PXQuc2xpY2UoMCxyKS5jb25jYXQodC5zbGljZShyKzEpKTticmVha31yZXR1cm4gbnVsbCE9ZSYmdC5wdXNoKHtuYW1lOm4sdmFsdWU6ZX0pLHR9ZnVuY3Rpb24gbSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLm93bmVyRG9jdW1lbnQsZT10aGlzLm5hbWVzcGFjZVVSSTtyZXR1cm4gZT09PUVmJiZuLmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkk9PT1FZj9uLmNyZWF0ZUVsZW1lbnQodCk6bi5jcmVhdGVFbGVtZW50TlMoZSx0KX19ZnVuY3Rpb24geCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBiKCl7cmV0dXJuIG5ldyB3fWZ1bmN0aW9uIHcoKXt0aGlzLl89IkAiKygrK1BmKS50b1N0cmluZygzNil9ZnVuY3Rpb24gTSh0LG4sZSl7cmV0dXJuIHQ9VCh0LG4sZSksZnVuY3Rpb24obil7dmFyIGU9bi5yZWxhdGVkVGFyZ2V0O2UmJihlPT09dGhpc3x8OCZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsbil9fWZ1bmN0aW9uIFQobixlLHIpe3JldHVybiBmdW5jdGlvbihpKXt2YXIgbz10LmV2ZW50O3QuZXZlbnQ9aTt0cnl7bi5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxlLHIpfWZpbmFsbHl7dC5ldmVudD1vfX19ZnVuY3Rpb24gayh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGU9dC5pbmRleE9mKCIuIik7cmV0dXJuIGU+PTAmJihuPXQuc2xpY2UoZSsxKSx0PXQuc2xpY2UoMCxlKSkse3R5cGU6dCxuYW1lOm59fSl9ZnVuY3Rpb24gUyh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLl9fb247aWYobil7Zm9yKHZhciBlLHI9MCxpPS0xLG89bi5sZW5ndGg7cjxvOysrcillPW5bcl0sdC50eXBlJiZlLnR5cGUhPT10LnR5cGV8fGUubmFtZSE9PXQubmFtZT9uWysraV09ZTp0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZS50eXBlLGUubGlzdGVuZXIsZS5jYXB0dXJlKTsrK2k/bi5sZW5ndGg9aTpkZWxldGUgdGhpcy5fX29ufX19ZnVuY3Rpb24gTih0LG4sZSl7dmFyIHI9RGYuaGFzT3duUHJvcGVydHkodC50eXBlKT9NOlQ7cmV0dXJuIGZ1bmN0aW9uKGksbyx1KXt2YXIgYSxjPXRoaXMuX19vbixzPXIobixvLHUpO2lmKGMpZm9yKHZhciBmPTAsbD1jLmxlbmd0aDtmPGw7KytmKWlmKChhPWNbZl0pLnR5cGU9PT10LnR5cGUmJmEubmFtZT09PXQubmFtZSlyZXR1cm4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGEudHlwZSxhLmxpc3RlbmVyLGEuY2FwdHVyZSksdGhpcy5hZGRFdmVudExpc3RlbmVyKGEudHlwZSxhLmxpc3RlbmVyPXMsYS5jYXB0dXJlPWUpLHZvaWQoYS52YWx1ZT1uKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIodC50eXBlLHMsZSksYT17dHlwZTp0LnR5cGUsbmFtZTp0Lm5hbWUsdmFsdWU6bixsaXN0ZW5lcjpzLGNhcHR1cmU6ZX0sYz9jLnB1c2goYSk6dGhpcy5fX29uPVthXX19ZnVuY3Rpb24gRShuLGUscixpKXt2YXIgbz10LmV2ZW50O24uc291cmNlRXZlbnQ9dC5ldmVudCx0LmV2ZW50PW47dHJ5e3JldHVybiBlLmFwcGx5KHIsaSl9ZmluYWxseXt0LmV2ZW50PW99fWZ1bmN0aW9uIEEoKXt9ZnVuY3Rpb24gQygpe3JldHVybltdfWZ1bmN0aW9uIHoodCxuKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPW59ZnVuY3Rpb24gUCh0LG4sZSxyLGksbyl7Zm9yKHZhciB1LGE9MCxjPW4ubGVuZ3RoLHM9by5sZW5ndGg7YTxzOysrYSkodT1uW2FdKT8odS5fX2RhdGFfXz1vW2FdLHJbYV09dSk6ZVthXT1uZXcgeih0LG9bYV0pO2Zvcig7YTxjOysrYSkodT1uW2FdKSYmKGlbYV09dSl9ZnVuY3Rpb24gUih0LG4sZSxyLGksbyx1KXt2YXIgYSxjLHMsZj17fSxsPW4ubGVuZ3RoLGg9by5sZW5ndGgscD1uZXcgQXJyYXkobCk7Zm9yKGE9MDthPGw7KythKShjPW5bYV0pJiYocFthXT1zPUdmK3UuY2FsbChjLGMuX19kYXRhX18sYSxuKSxzIGluIGY/aVthXT1jOmZbc109Yyk7Zm9yKGE9MDthPGg7KythKXM9R2YrdS5jYWxsKHQsb1thXSxhLG8pLChjPWZbc10pPyhyW2FdPWMsYy5fX2RhdGFfXz1vW2FdLGZbc109bnVsbCk6ZVthXT1uZXcgeih0LG9bYV0pO2ZvcihhPTA7YTxsOysrYSkoYz1uW2FdKSYmZltwW2FdXT09PWMmJihpW2FdPWMpfWZ1bmN0aW9uIEwodCxuKXtyZXR1cm4gdDxuPy0xOnQ+bj8xOnQ+PW4/MDpOYU59ZnVuY3Rpb24gcSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24gVSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIEQodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSh0LG4pfX1mdW5jdGlvbiBPKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsbil9fWZ1bmN0aW9uIEYodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQsZSl9fWZ1bmN0aW9uIEkodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTp0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxlKX19ZnVuY3Rpb24gWSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX1mdW5jdGlvbiBCKHQsbixlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsbixlKX19ZnVuY3Rpb24gaih0LG4sZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09cj90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxyLGUpfX1mdW5jdGlvbiBIKHQpe3JldHVybiBmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW3RdfX1mdW5jdGlvbiBYKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpc1t0XT1ufX1mdW5jdGlvbiBWKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPWV9fWZ1bmN0aW9uIFcodCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uICQodCl7cmV0dXJuIHQuY2xhc3NMaXN0fHxuZXcgWih0KX1mdW5jdGlvbiBaKHQpe3RoaXMuX25vZGU9dCx0aGlzLl9uYW1lcz1XKHQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9ZnVuY3Rpb24gRyh0LG4pe2Zvcih2YXIgZT0kKHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5hZGQobltyXSl9ZnVuY3Rpb24gSih0LG4pe2Zvcih2YXIgZT0kKHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5yZW1vdmUobltyXSl9ZnVuY3Rpb24gUSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtHKHRoaXMsdCl9fWZ1bmN0aW9uIEsodCl7cmV0dXJuIGZ1bmN0aW9uKCl7Sih0aGlzLHQpfX1mdW5jdGlvbiB0dCh0LG4pe3JldHVybiBmdW5jdGlvbigpeyhuLmFwcGx5KHRoaXMsYXJndW1lbnRzKT9HOkopKHRoaXMsdCl9fWZ1bmN0aW9uIG50KCl7dGhpcy50ZXh0Q29udGVudD0iIn1mdW5jdGlvbiBldCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fWZ1bmN0aW9uIHJ0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX1mdW5jdGlvbiBpdCgpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIG90KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPXR9fWZ1bmN0aW9uIHV0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PW4/IiI6bn19ZnVuY3Rpb24gYXQoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gY3QoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiBzdCgpe3JldHVybiBudWxsfWZ1bmN0aW9uIGZ0KCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gbHQodCxuLGUpe3ZhciByPXNsKHQpLGk9ci5DdXN0b21FdmVudDtpP2k9bmV3IGkobixlKTooaT1yLmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGU/KGkuaW5pdEV2ZW50KG4sZS5idWJibGVzLGUuY2FuY2VsYWJsZSksaS5kZXRhaWw9ZS5kZXRhaWwpOmkuaW5pdEV2ZW50KG4sITEsITEpKSx0LmRpc3BhdGNoRXZlbnQoaSl9ZnVuY3Rpb24gaHQodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbHQodGhpcyx0LG4pfX1mdW5jdGlvbiBwdCh0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBsdCh0aGlzLHQsbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX1mdW5jdGlvbiBkdCh0LG4pe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bn1mdW5jdGlvbiB2dCgpe3JldHVybiBuZXcgZHQoW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSx3bCl9ZnVuY3Rpb24gX3QoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIGd0KHQsbil7dmFyIGU9dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQscj1NbCh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLG51bGwpO24mJihyLm9uKCJjbGljay5kcmFnIixObCwhMCksc2V0VGltZW91dChmdW5jdGlvbigpe3Iub24oImNsaWNrLmRyYWciLG51bGwpfSwwKSksIm9uc2VsZWN0c3RhcnQiaW4gZT9yLm9uKCJzZWxlY3RzdGFydC5kcmFnIixudWxsKTooZS5zdHlsZS5Nb3pVc2VyU2VsZWN0PWUuX19ub3NlbGVjdCxkZWxldGUgZS5fX25vc2VsZWN0KX1mdW5jdGlvbiB5dCh0LG4sZSxyLGksbyx1LGEsYyxzKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc3ViamVjdD1lLHRoaXMuaWRlbnRpZmllcj1yLHRoaXMuYWN0aXZlPWksdGhpcy54PW8sdGhpcy55PXUsdGhpcy5keD1hLHRoaXMuZHk9Yyx0aGlzLl89c31mdW5jdGlvbiBtdCgpe3JldHVybiF0LmV2ZW50LmJ1dHRvbn1mdW5jdGlvbiB4dCgpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9ZnVuY3Rpb24gYnQobil7cmV0dXJuIG51bGw9PW4/e3g6dC5ldmVudC54LHk6dC5ldmVudC55fTpufWZ1bmN0aW9uIHd0KHQsbil7dmFyIGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSk7Zm9yKHZhciByIGluIG4pZVtyXT1uW3JdO3JldHVybiBlfWZ1bmN0aW9uIE10KCl7fWZ1bmN0aW9uIFR0KHQpe3ZhciBuO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwobj1EbC5leGVjKHQpKT8obj1wYXJzZUludChuWzFdLDE2KSxuZXcgQXQobj4+OCYxNXxuPj40JjI0MCxuPj40JjE1fDI0MCZuLCgxNSZuKTw8NHwxNSZuLDEpKToobj1PbC5leGVjKHQpKT9rdChwYXJzZUludChuWzFdLDE2KSk6KG49RmwuZXhlYyh0KSk/bmV3IEF0KG5bMV0sblsyXSxuWzNdLDEpOihuPUlsLmV4ZWModCkpP25ldyBBdCgyNTUqblsxXS8xMDAsMjU1Km5bMl0vMTAwLDI1NSpuWzNdLzEwMCwxKToobj1ZbC5leGVjKHQpKT9TdChuWzFdLG5bMl0sblszXSxuWzRdKToobj1CbC5leGVjKHQpKT9TdCgyNTUqblsxXS8xMDAsMjU1Km5bMl0vMTAwLDI1NSpuWzNdLzEwMCxuWzRdKToobj1qbC5leGVjKHQpKT9DdChuWzFdLG5bMl0vMTAwLG5bM10vMTAwLDEpOihuPUhsLmV4ZWModCkpP0N0KG5bMV0sblsyXS8xMDAsblszXS8xMDAsbls0XSk6WGwuaGFzT3duUHJvcGVydHkodCk/a3QoWGxbdF0pOiJ0cmFuc3BhcmVudCI9PT10P25ldyBBdChOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIGt0KHQpe3JldHVybiBuZXcgQXQodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0LDEpfWZ1bmN0aW9uIFN0KHQsbixlLHIpe3JldHVybiByPD0wJiYodD1uPWU9TmFOKSxuZXcgQXQodCxuLGUscil9ZnVuY3Rpb24gTnQodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBNdHx8KHQ9VHQodCkpLHQ/KHQ9dC5yZ2IoKSxuZXcgQXQodC5yLHQuZyx0LmIsdC5vcGFjaXR5KSk6bmV3IEF0fWZ1bmN0aW9uIEV0KHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9OdCh0KTpuZXcgQXQodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIEF0KHQsbixlLHIpe3RoaXMucj0rdCx0aGlzLmc9K24sdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBDdCh0LG4sZSxyKXtyZXR1cm4gcjw9MD90PW49ZT1OYU46ZTw9MHx8ZT49MT90PW49TmFOOm48PTAmJih0PU5hTiksbmV3IFJ0KHQsbixlLHIpfWZ1bmN0aW9uIHp0KHQpe2lmKHQgaW5zdGFuY2VvZiBSdClyZXR1cm4gbmV3IFJ0KHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIE10fHwodD1UdCh0KSksIXQpcmV0dXJuIG5ldyBSdDtpZih0IGluc3RhbmNlb2YgUnQpcmV0dXJuIHQ7dD10LnJnYigpO3ZhciBuPXQuci8yNTUsZT10LmcvMjU1LHI9dC5iLzI1NSxpPU1hdGgubWluKG4sZSxyKSxvPU1hdGgubWF4KG4sZSxyKSx1PU5hTixhPW8taSxjPShvK2kpLzI7cmV0dXJuIGE/KHU9bj09PW8/KGUtcikvYSs2KihlPHIpOmU9PT1vPyhyLW4pL2ErMjoobi1lKS9hKzQsYS89YzwuNT9vK2k6Mi1vLWksdSo9NjApOmE9Yz4wJiZjPDE/MDp1LG5ldyBSdCh1LGEsYyx0Lm9wYWNpdHkpfWZ1bmN0aW9uIFB0KHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD96dCh0KTpuZXcgUnQodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIFJ0KHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBMdCh0LG4sZSl7cmV0dXJuIDI1NSoodDw2MD9uKyhlLW4pKnQvNjA6dDwxODA/ZTp0PDI0MD9uKyhlLW4pKigyNDAtdCkvNjA6bil9ZnVuY3Rpb24gcXQodCl7aWYodCBpbnN0YW5jZW9mIER0KXJldHVybiBuZXcgRHQodC5sLHQuYSx0LmIsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgSHQpe3ZhciBuPXQuaCpWbDtyZXR1cm4gbmV3IER0KHQubCxNYXRoLmNvcyhuKSp0LmMsTWF0aC5zaW4obikqdC5jLHQub3BhY2l0eSl9dCBpbnN0YW5jZW9mIEF0fHwodD1OdCh0KSk7dmFyIGU9WXQodC5yKSxyPVl0KHQuZyksaT1ZdCh0LmIpLG89T3QoKC40MTI0NTY0KmUrLjM1NzU3NjEqcisuMTgwNDM3NSppKS9abCksdT1PdCgoLjIxMjY3MjkqZSsuNzE1MTUyMipyKy4wNzIxNzUqaSkvR2wpO3JldHVybiBuZXcgRHQoMTE2KnUtMTYsNTAwKihvLXUpLDIwMCoodS1PdCgoLjAxOTMzMzkqZSsuMTE5MTkyKnIrLjk1MDMwNDEqaSkvSmwpKSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIFV0KHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9xdCh0KTpuZXcgRHQodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIER0KHQsbixlLHIpe3RoaXMubD0rdCx0aGlzLmE9K24sdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBPdCh0KXtyZXR1cm4gdD5uaD9NYXRoLnBvdyh0LDEvMyk6dC90aCtRbH1mdW5jdGlvbiBGdCh0KXtyZXR1cm4gdD5LbD90KnQqdDp0aCoodC1RbCl9ZnVuY3Rpb24gSXQodCl7cmV0dXJuIDI1NSoodDw9LjAwMzEzMDg/MTIuOTIqdDoxLjA1NSpNYXRoLnBvdyh0LDEvMi40KS0uMDU1KX1mdW5jdGlvbiBZdCh0KXtyZXR1cm4odC89MjU1KTw9LjA0MDQ1P3QvMTIuOTI6TWF0aC5wb3coKHQrLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBCdCh0KXtpZih0IGluc3RhbmNlb2YgSHQpcmV0dXJuIG5ldyBIdCh0LmgsdC5jLHQubCx0Lm9wYWNpdHkpO3QgaW5zdGFuY2VvZiBEdHx8KHQ9cXQodCkpO3ZhciBuPU1hdGguYXRhbjIodC5iLHQuYSkqV2w7cmV0dXJuIG5ldyBIdChuPDA/biszNjA6bixNYXRoLnNxcnQodC5hKnQuYSt0LmIqdC5iKSx0LmwsdC5vcGFjaXR5KX1mdW5jdGlvbiBqdCh0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/QnQodCk6bmV3IEh0KHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBIdCh0LG4sZSxyKXt0aGlzLmg9K3QsdGhpcy5jPStuLHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gWHQodCl7aWYodCBpbnN0YW5jZW9mIFd0KXJldHVybiBuZXcgV3QodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgQXR8fCh0PU50KHQpKTt2YXIgbj10LnIvMjU1LGU9dC5nLzI1NSxyPXQuYi8yNTUsaT0oc2gqcithaCpuLWNoKmUpLyhzaCthaC1jaCksbz1yLWksdT0odWgqKGUtaSktaWgqbykvb2gsYT1NYXRoLnNxcnQodSp1K28qbykvKHVoKmkqKDEtaSkpLGM9YT9NYXRoLmF0YW4yKHUsbykqV2wtMTIwOk5hTjtyZXR1cm4gbmV3IFd0KGM8MD9jKzM2MDpjLGEsaSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIFZ0KHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9YdCh0KTpuZXcgV3QodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIFd0KHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiAkdCh0LG4sZSxyLGkpe3ZhciBvPXQqdCx1PW8qdDtyZXR1cm4oKDEtMyp0KzMqby11KSpuKyg0LTYqbyszKnUpKmUrKDErMyp0KzMqby0zKnUpKnIrdSppKS82fWZ1bmN0aW9uIFp0KHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0K2Uqbn19ZnVuY3Rpb24gR3QodCxuLGUpe3JldHVybiB0PU1hdGgucG93KHQsZSksbj1NYXRoLnBvdyhuLGUpLXQsZT0xL2UsZnVuY3Rpb24ocil7cmV0dXJuIE1hdGgucG93KHQrcipuLGUpfX1mdW5jdGlvbiBKdCh0LG4pe3ZhciBlPW4tdDtyZXR1cm4gZT9adCh0LGU+MTgwfHxlPC0xODA/ZS0zNjAqTWF0aC5yb3VuZChlLzM2MCk6ZSk6eWgoaXNOYU4odCk/bjp0KX1mdW5jdGlvbiBRdCh0KXtyZXR1cm4gMT09PSh0PSt0KT9LdDpmdW5jdGlvbihuLGUpe3JldHVybiBlLW4/R3QobixlLHQpOnloKGlzTmFOKG4pP2U6bil9fWZ1bmN0aW9uIEt0KHQsbil7dmFyIGU9bi10O3JldHVybiBlP1p0KHQsZSk6eWgoaXNOYU4odCk/bjp0KX1mdW5jdGlvbiB0bih0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGUscixpPW4ubGVuZ3RoLG89bmV3IEFycmF5KGkpLHU9bmV3IEFycmF5KGkpLGE9bmV3IEFycmF5KGkpO2ZvcihlPTA7ZTxpOysrZSlyPUV0KG5bZV0pLG9bZV09ci5yfHwwLHVbZV09ci5nfHwwLGFbZV09ci5ifHwwO3JldHVybiBvPXQobyksdT10KHUpLGE9dChhKSxyLm9wYWNpdHk9MSxmdW5jdGlvbih0KXtyZXR1cm4gci5yPW8odCksci5nPXUodCksci5iPWEodCkscisiIn19fWZ1bmN0aW9uIG5uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBlbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQobikrIiJ9fWZ1bmN0aW9uIHJuKHQpe3JldHVybiJub25lIj09PXQ/UGg6KGZofHwoZmg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksbGg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGhoPWRvY3VtZW50LmRlZmF1bHRWaWV3KSxmaC5zdHlsZS50cmFuc2Zvcm09dCx0PWhoLmdldENvbXB1dGVkU3R5bGUobGguYXBwZW5kQ2hpbGQoZmgpLG51bGwpLmdldFByb3BlcnR5VmFsdWUoInRyYW5zZm9ybSIpLGxoLnJlbW92ZUNoaWxkKGZoKSx0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSxSaCgrdFswXSwrdFsxXSwrdFsyXSwrdFszXSwrdFs0XSwrdFs1XSkpfWZ1bmN0aW9uIG9uKHQpe3JldHVybiBudWxsPT10P1BoOihwaHx8KHBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpLHBoLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIix0KSwodD1waC50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKT8odD10Lm1hdHJpeCxSaCh0LmEsdC5iLHQuYyx0LmQsdC5lLHQuZikpOlBoKX1mdW5jdGlvbiB1bih0LG4sZSxyKXtmdW5jdGlvbiBpKHQpe3JldHVybiB0Lmxlbmd0aD90LnBvcCgpKyIgIjoiIn1mdW5jdGlvbiBvKHQscixpLG8sdSxhKXtpZih0IT09aXx8ciE9PW8pe3ZhciBjPXUucHVzaCgidHJhbnNsYXRlKCIsbnVsbCxuLG51bGwsZSk7YS5wdXNoKHtpOmMtNCx4OlRoKHQsaSl9LHtpOmMtMix4OlRoKHIsbyl9KX1lbHNlKGl8fG8pJiZ1LnB1c2goInRyYW5zbGF0ZSgiK2krbitvK2UpfWZ1bmN0aW9uIHUodCxuLGUsbyl7dCE9PW4/KHQtbj4xODA/bis9MzYwOm4tdD4xODAmJih0Kz0zNjApLG8ucHVzaCh7aTplLnB1c2goaShlKSsicm90YXRlKCIsbnVsbCxyKS0yLHg6VGgodCxuKX0pKTpuJiZlLnB1c2goaShlKSsicm90YXRlKCIrbityKX1mdW5jdGlvbiBhKHQsbixlLG8pe3QhPT1uP28ucHVzaCh7aTplLnB1c2goaShlKSsic2tld1goIixudWxsLHIpLTIseDpUaCh0LG4pfSk6biYmZS5wdXNoKGkoZSkrInNrZXdYKCIrbityKX1mdW5jdGlvbiBjKHQsbixlLHIsbyx1KXtpZih0IT09ZXx8biE9PXIpe3ZhciBhPW8ucHVzaChpKG8pKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTt1LnB1c2goe2k6YS00LHg6VGgodCxlKX0se2k6YS0yLHg6VGgobixyKX0pfWVsc2UgMT09PWUmJjE9PT1yfHxvLnB1c2goaShvKSsic2NhbGUoIitlKyIsIityKyIpIil9cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9W10saT1bXTtyZXR1cm4gbj10KG4pLGU9dChlKSxvKG4udHJhbnNsYXRlWCxuLnRyYW5zbGF0ZVksZS50cmFuc2xhdGVYLGUudHJhbnNsYXRlWSxyLGkpLHUobi5yb3RhdGUsZS5yb3RhdGUscixpKSxhKG4uc2tld1gsZS5za2V3WCxyLGkpLGMobi5zY2FsZVgsbi5zY2FsZVksZS5zY2FsZVgsZS5zY2FsZVkscixpKSxuPWU9bnVsbCxmdW5jdGlvbih0KXtmb3IodmFyIG4sZT0tMSxvPWkubGVuZ3RoOysrZTxvOylyWyhuPWlbZV0pLmldPW4ueCh0KTtyZXR1cm4gci5qb2luKCIiKX19fWZ1bmN0aW9uIGFuKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSkrMS90KS8yfWZ1bmN0aW9uIGNuKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfWZ1bmN0aW9uIHNuKHQpe3JldHVybigodD1NYXRoLmV4cCgyKnQpKS0xKS8odCsxKX1mdW5jdGlvbiBmbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPVB0KG4pKS5oLChlPVB0KGUpKS5oKSxpPUt0KG4ucyxlLnMpLG89S3Qobi5sLGUubCksdT1LdChuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4ucz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT11KHQpLG4rIiJ9fX1mdW5jdGlvbiBsbih0LG4pe3ZhciBlPUt0KCh0PVV0KHQpKS5sLChuPVV0KG4pKS5sKSxyPUt0KHQuYSxuLmEpLGk9S3QodC5iLG4uYiksbz1LdCh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQubD1lKG4pLHQuYT1yKG4pLHQuYj1pKG4pLHQub3BhY2l0eT1vKG4pLHQrIiJ9fWZ1bmN0aW9uIGhuKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQoKG49anQobikpLmgsKGU9anQoZSkpLmgpLGk9S3Qobi5jLGUuYyksbz1LdChuLmwsZS5sKSx1PUt0KG4ub3BhY2l0eSxlLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5oPXIodCksbi5jPWkodCksbi5sPW8odCksbi5vcGFjaXR5PXUodCksbisiIn19fWZ1bmN0aW9uIHBuKHQpe3JldHVybiBmdW5jdGlvbiBuKGUpe2Z1bmN0aW9uIHIobixyKXt2YXIgaT10KChuPVZ0KG4pKS5oLChyPVZ0KHIpKS5oKSxvPUt0KG4ucyxyLnMpLHU9S3Qobi5sLHIubCksYT1LdChuLm9wYWNpdHksci5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1pKHQpLG4ucz1vKHQpLG4ubD11KE1hdGgucG93KHQsZSkpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fXJldHVybiBlPStlLHIuZ2FtbWE9bixyfSgxKX1mdW5jdGlvbiBkbigpe3JldHVybiBLaHx8KGVwKHZuKSxLaD1ucC5ub3coKSt0cCl9ZnVuY3Rpb24gdm4oKXtLaD0wfWZ1bmN0aW9uIF9uKCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiBnbih0LG4sZSl7dmFyIHI9bmV3IF9uO3JldHVybiByLnJlc3RhcnQodCxuLGUpLHJ9ZnVuY3Rpb24geW4oKXtkbigpLCsrJGg7Zm9yKHZhciB0LG49ZGg7bjspKHQ9S2gtbi5fdGltZSk+PTAmJm4uX2NhbGwuY2FsbChudWxsLHQpLG49bi5fbmV4dDstLSRofWZ1bmN0aW9uIG1uKCl7S2g9KFFoPW5wLm5vdygpKSt0cCwkaD1aaD0wO3RyeXt5bigpfWZpbmFsbHl7JGg9MCxibigpLEtoPTB9fWZ1bmN0aW9uIHhuKCl7dmFyIHQ9bnAubm93KCksbj10LVFoO24+SmgmJih0cC09bixRaD10KX1mdW5jdGlvbiBibigpe2Zvcih2YXIgdCxuLGU9ZGgscj0xLzA7ZTspZS5fY2FsbD8ocj5lLl90aW1lJiYocj1lLl90aW1lKSx0PWUsZT1lLl9uZXh0KToobj1lLl9uZXh0LGUuX25leHQ9bnVsbCxlPXQ/dC5fbmV4dD1uOmRoPW4pO3ZoPXQsd24ocil9ZnVuY3Rpb24gd24odCl7aWYoISRoKXtaaCYmKFpoPWNsZWFyVGltZW91dChaaCkpO3ZhciBuPXQtS2g7bj4yND8odDwxLzAmJihaaD1zZXRUaW1lb3V0KG1uLG4pKSxHaCYmKEdoPWNsZWFySW50ZXJ2YWwoR2gpKSk6KEdofHwoUWg9S2gsR2g9c2V0SW50ZXJ2YWwoeG4sSmgpKSwkaD0xLGVwKG1uKSl9fWZ1bmN0aW9uIE1uKHQsbil7dmFyIGU9dC5fX3RyYW5zaXRpb247aWYoIWV8fCEoZT1lW25dKXx8ZS5zdGF0ZT5hcCl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlIik7cmV0dXJuIGV9ZnVuY3Rpb24gVG4odCxuKXt2YXIgZT10Ll9fdHJhbnNpdGlvbjtpZighZXx8IShlPWVbbl0pfHxlLnN0YXRlPnNwKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGUiKTtyZXR1cm4gZX1mdW5jdGlvbiBrbih0LG4pe3ZhciBlPXQuX190cmFuc2l0aW9uO2lmKCFlfHwhKGU9ZVtuXSkpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZSIpO3JldHVybiBlfWZ1bmN0aW9uIFNuKHQsbixlKXtmdW5jdGlvbiByKHQpe2Uuc3RhdGU9Y3AsZS50aW1lci5yZXN0YXJ0KGksZS5kZWxheSxlLnRpbWUpLGUuZGVsYXk8PXQmJmkodC1lLmRlbGF5KX1mdW5jdGlvbiBpKHIpe3ZhciBzLGYsbCxoO2lmKGUuc3RhdGUhPT1jcClyZXR1cm4gdSgpO2ZvcihzIGluIGMpaWYoaD1jW3NdLGgubmFtZT09PWUubmFtZSl7aWYoaC5zdGF0ZT09PWZwKXJldHVybiBycChpKTtoLnN0YXRlPT09bHA/KGguc3RhdGU9cHAsaC50aW1lci5zdG9wKCksaC5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxoLmluZGV4LGguZ3JvdXApLGRlbGV0ZSBjW3NdKTorczxuJiYoaC5zdGF0ZT1wcCxoLnRpbWVyLnN0b3AoKSxkZWxldGUgY1tzXSl9aWYocnAoZnVuY3Rpb24oKXtlLnN0YXRlPT09ZnAmJihlLnN0YXRlPWxwLGUudGltZXIucmVzdGFydChvLGUuZGVsYXksZS50aW1lKSxvKHIpKX0pLGUuc3RhdGU9c3AsZS5vbi5jYWxsKCJzdGFydCIsdCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCksZS5zdGF0ZT09PXNwKXtmb3IoZS5zdGF0ZT1mcCxhPW5ldyBBcnJheShsPWUudHdlZW4ubGVuZ3RoKSxzPTAsZj0tMTtzPGw7KytzKShoPWUudHdlZW5bc10udmFsdWUuY2FsbCh0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSkmJihhWysrZl09aCk7YS5sZW5ndGg9ZisxfX1mdW5jdGlvbiBvKG4pe2Zvcih2YXIgcj1uPGUuZHVyYXRpb24/ZS5lYXNlLmNhbGwobnVsbCxuL2UuZHVyYXRpb24pOihlLnRpbWVyLnJlc3RhcnQodSksZS5zdGF0ZT1ocCwxKSxpPS0xLG89YS5sZW5ndGg7KytpPG87KWFbaV0uY2FsbChudWxsLHIpO2Uuc3RhdGU9PT1ocCYmKGUub24uY2FsbCgiZW5kIix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSx1KCkpfWZ1bmN0aW9uIHUoKXtlLnN0YXRlPXBwLGUudGltZXIuc3RvcCgpLGRlbGV0ZSBjW25dO2Zvcih2YXIgciBpbiBjKXJldHVybjtkZWxldGUgdC5fX3RyYW5zaXRpb259dmFyIGEsYz10Ll9fdHJhbnNpdGlvbjtjW25dPWUsZS50aW1lcj1nbihyLDAsZS50aW1lKX1mdW5jdGlvbiBObih0LG4pe3ZhciBlLHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9VG4odGhpcyx0KSxvPWkudHdlZW47aWYobyE9PWUpe3I9ZT1vO2Zvcih2YXIgdT0wLGE9ci5sZW5ndGg7dTxhOysrdSlpZihyW3VdLm5hbWU9PT1uKXtyPXIuc2xpY2UoKSxyLnNwbGljZSh1LDEpO2JyZWFrfX1pLnR3ZWVuPXJ9fWZ1bmN0aW9uIEVuKHQsbixlKXt2YXIgcixpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1Ubih0aGlzLHQpLHU9by50d2VlbjtpZih1IT09cil7aT0ocj11KS5zbGljZSgpO2Zvcih2YXIgYT17bmFtZTpuLHZhbHVlOmV9LGM9MCxzPWkubGVuZ3RoO2M8czsrK2MpaWYoaVtjXS5uYW1lPT09bil7aVtjXT1hO2JyZWFrfWM9PT1zJiZpLnB1c2goYSl9by50d2Vlbj1pfX1mdW5jdGlvbiBBbih0LG4sZSl7dmFyIHI9dC5faWQ7cmV0dXJuIHQuZWFjaChmdW5jdGlvbigpe3ZhciB0PVRuKHRoaXMscik7KHQudmFsdWV8fCh0LnZhbHVlPXt9KSlbbl09ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSxmdW5jdGlvbih0KXtyZXR1cm4ga24odCxyKS52YWx1ZVtuXX19ZnVuY3Rpb24gQ24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIHpuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gUG4odCxuLGUpe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcy5nZXRBdHRyaWJ1dGUodCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX1mdW5jdGlvbiBSbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX1mdW5jdGlvbiBMbih0LG4sZSl7dmFyIHIsaSxvO3JldHVybiBmdW5jdGlvbigpe3ZhciB1LGE9ZSh0aGlzKTtyZXR1cm4gbnVsbD09YT92b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKHQpOih1PXRoaXMuZ2V0QXR0cmlidXRlKHQpLHU9PT1hP251bGw6dT09PXImJmE9PT1pP286bz1uKHI9dSxpPWEpKX19ZnVuY3Rpb24gcW4odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdSxhPWUodGhpcyk7cmV0dXJuIG51bGw9PWE/dm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6KHU9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpLHU9PT1hP251bGw6dT09PXImJmE9PT1pP286bz1uKHI9dSxpPWEpKX19ZnVuY3Rpb24gVW4odCxuKXtmdW5jdGlvbiBlKCl7dmFyIGU9dGhpcyxyPW4uYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiByJiZmdW5jdGlvbihuKXtlLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxyKG4pKX19cmV0dXJuIGUuX3ZhbHVlPW4sZX1mdW5jdGlvbiBEbih0LG4pe2Z1bmN0aW9uIGUoKXt2YXIgZT10aGlzLHI9bi5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe2Uuc2V0QXR0cmlidXRlKHQscihuKSl9fXJldHVybiBlLl92YWx1ZT1uLGV9ZnVuY3Rpb24gT24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtNbih0aGlzLHQpLmRlbGF5PStuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gRm4odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe01uKHRoaXMsdCkuZGVsYXk9bn19ZnVuY3Rpb24gSW4odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtUbih0aGlzLHQpLmR1cmF0aW9uPStuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gWW4odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe1RuKHRoaXMsdCkuZHVyYXRpb249bn19ZnVuY3Rpb24gQm4odCxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7VG4odGhpcyx0KS5lYXNlPW59fWZ1bmN0aW9uIGpuKHQpe3JldHVybih0KyIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoZnVuY3Rpb24odCl7dmFyIG49dC5pbmRleE9mKCIuIik7cmV0dXJuIG4+PTAmJih0PXQuc2xpY2UoMCxuKSksIXR8fCJzdGFydCI9PT10fSl9ZnVuY3Rpb24gSG4odCxuLGUpe3ZhciByLGksbz1qbihuKT9NbjpUbjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdT1vKHRoaXMsdCksYT11Lm9uO2EhPT1yJiYoaT0ocj1hKS5jb3B5KCkpLm9uKG4sZSksdS5vbj1pfX1mdW5jdGlvbiBYbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBlIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtlIT09dClyZXR1cm47biYmbi5yZW1vdmVDaGlsZCh0aGlzKX19ZnVuY3Rpb24gVm4odCxuKXt2YXIgZSxyLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89c2wodGhpcykuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLHU9by5nZXRQcm9wZXJ0eVZhbHVlKHQpLGE9KHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCksby5nZXRQcm9wZXJ0eVZhbHVlKHQpKTtyZXR1cm4gdT09PWE/bnVsbDp1PT09ZSYmYT09PXI/aTppPW4oZT11LHI9YSl9fWZ1bmN0aW9uIFduKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fWZ1bmN0aW9uICRuKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXNsKHRoaXMpLmdldENvbXB1dGVkU3R5bGUodGhpcyxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKHQpO3JldHVybiBvPT09ZT9udWxsOm89PT1yP2k6aT1uKHI9byxlKX19ZnVuY3Rpb24gWm4odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdT1zbCh0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCksYT11LmdldFByb3BlcnR5VmFsdWUodCksYz1lKHRoaXMpO3JldHVybiBudWxsPT1jJiYodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxjPXUuZ2V0UHJvcGVydHlWYWx1ZSh0KSksYT09PWM/bnVsbDphPT09ciYmYz09PWk/bzpvPW4ocj1hLGk9Yyl9fWZ1bmN0aW9uIEduKHQsbixlKXtmdW5jdGlvbiByKCl7dmFyIHI9dGhpcyxpPW4uYXBwbHkocixhcmd1bWVudHMpO3JldHVybiBpJiZmdW5jdGlvbihuKXtyLnN0eWxlLnNldFByb3BlcnR5KHQsaShuKSxlKX19cmV0dXJuIHIuX3ZhbHVlPW4scn1mdW5jdGlvbiBKbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fWZ1bmN0aW9uIFFuKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQodGhpcyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1uPyIiOm59fWZ1bmN0aW9uIEtuKHQsbixlLHIpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bix0aGlzLl9uYW1lPWUsdGhpcy5faWQ9cn1mdW5jdGlvbiB0ZSh0KXtyZXR1cm4gdnQoKS50cmFuc2l0aW9uKHQpfWZ1bmN0aW9uIG5lKCl7cmV0dXJuKytVcH1mdW5jdGlvbiBlZSh0KXtyZXR1cm4rdH1mdW5jdGlvbiByZSh0KXtyZXR1cm4gdCp0fWZ1bmN0aW9uIGllKHQpe3JldHVybiB0KigyLXQpfWZ1bmN0aW9uIG9lKHQpe3JldHVybigodCo9Mik8PTE/dCp0Oi0tdCooMi10KSsxKS8yfWZ1bmN0aW9uIHVlKHQpe3JldHVybiB0KnQqdH1mdW5jdGlvbiBhZSh0KXtyZXR1cm4tLXQqdCp0KzF9ZnVuY3Rpb24gY2UodCl7cmV0dXJuKCh0Kj0yKTw9MT90KnQqdDoodC09MikqdCp0KzIpLzJ9ZnVuY3Rpb24gc2UodCl7cmV0dXJuIDEtTWF0aC5jb3ModCpqcCl9ZnVuY3Rpb24gZmUodCl7cmV0dXJuIE1hdGguc2luKHQqanApfWZ1bmN0aW9uIGxlKHQpe3JldHVybigxLU1hdGguY29zKEJwKnQpKS8yfWZ1bmN0aW9uIGhlKHQpe3JldHVybiBNYXRoLnBvdygyLDEwKnQtMTApfWZ1bmN0aW9uIHBlKHQpe3JldHVybiAxLU1hdGgucG93KDIsLTEwKnQpfWZ1bmN0aW9uIGRlKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3coMiwxMCp0LTEwKToyLU1hdGgucG93KDIsMTAtMTAqdCkpLzJ9ZnVuY3Rpb24gdmUodCl7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtdCp0KX1mdW5jdGlvbiBfZSh0KXtyZXR1cm4gTWF0aC5zcXJ0KDEtIC0tdCp0KX1mdW5jdGlvbiBnZSh0KXtyZXR1cm4oKHQqPTIpPD0xPzEtTWF0aC5zcXJ0KDEtdCp0KTpNYXRoLnNxcnQoMS0odC09MikqdCkrMSkvMn1mdW5jdGlvbiB5ZSh0KXtyZXR1cm4gMS1tZSgxLXQpfWZ1bmN0aW9uIG1lKHQpe3JldHVybih0PSt0KTxIcD9LcCp0KnQ6dDxWcD9LcCoodC09WHApKnQrV3A6dDxacD9LcCoodC09JHApKnQrR3A6S3AqKHQtPUpwKSp0K1FwfWZ1bmN0aW9uIHhlKHQpe3JldHVybigodCo9Mik8PTE/MS1tZSgxLXQpOm1lKHQtMSkrMSkvMn1mdW5jdGlvbiBiZSh0LG4pe2Zvcih2YXIgZTshKGU9dC5fX3RyYW5zaXRpb24pfHwhKGU9ZVtuXSk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybiBmZC50aW1lPWRuKCksZmQ7cmV0dXJuIGV9ZnVuY3Rpb24gd2UoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIE1lKHQpe3JldHVybnt0eXBlOnR9fWZ1bmN0aW9uIFRlKCl7cmV0dXJuIXQuZXZlbnQuYnV0dG9ufWZ1bmN0aW9uIGtlKCl7dmFyIHQ9dGhpcy5vd25lclNWR0VsZW1lbnR8fHRoaXM7cmV0dXJuW1swLDBdLFt0LndpZHRoLmJhc2VWYWwudmFsdWUsdC5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dfWZ1bmN0aW9uIFNlKHQpe2Zvcig7IXQuX19icnVzaDspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuO3JldHVybiB0Ll9fYnJ1c2h9ZnVuY3Rpb24gTmUodCl7cmV0dXJuIHRbMF1bMF09PT10WzFdWzBdfHx0WzBdWzFdPT09dFsxXVsxXX1mdW5jdGlvbiBFZSh0KXt2YXIgbj10Ll9fYnJ1c2g7cmV0dXJuIG4/bi5kaW0ub3V0cHV0KG4uc2VsZWN0aW9uKTpudWxsfWZ1bmN0aW9uIEFlKCl7cmV0dXJuIHplKGJkKX1mdW5jdGlvbiBDZSgpe3JldHVybiB6ZSh3ZCl9ZnVuY3Rpb24gemUobil7ZnVuY3Rpb24gZSh0KXt2YXIgZT10LnByb3BlcnR5KCJfX2JydXNoIixhKS5zZWxlY3RBbGwoIi5vdmVybGF5IikuZGF0YShbTWUoIm92ZXJsYXkiKV0pO2UuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsIm92ZXJsYXkiKS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLmF0dHIoImN1cnNvciIsVGQub3ZlcmxheSkubWVyZ2UoZSkuZWFjaChmdW5jdGlvbigpe3ZhciB0PVNlKHRoaXMpLmV4dGVudDtNbCh0aGlzKS5hdHRyKCJ4Iix0WzBdWzBdKS5hdHRyKCJ5Iix0WzBdWzFdKS5hdHRyKCJ3aWR0aCIsdFsxXVswXS10WzBdWzBdKS5hdHRyKCJoZWlnaHQiLHRbMV1bMV0tdFswXVsxXSl9KSx0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpLmRhdGEoW01lKCJzZWxlY3Rpb24iKV0pLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJzZWxlY3Rpb24iKS5hdHRyKCJjdXJzb3IiLFRkLnNlbGVjdGlvbikuYXR0cigiZmlsbCIsIiM3NzciKS5hdHRyKCJmaWxsLW9wYWNpdHkiLC4zKS5hdHRyKCJzdHJva2UiLCIjZmZmIikuYXR0cigic2hhcGUtcmVuZGVyaW5nIiwiY3Jpc3BFZGdlcyIpO3ZhciBpPXQuc2VsZWN0QWxsKCIuaGFuZGxlIikuZGF0YShuLmhhbmRsZXMsZnVuY3Rpb24odCl7cmV0dXJuIHQudHlwZX0pO2kuZXhpdCgpLnJlbW92ZSgpLGkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24odCl7cmV0dXJuImhhbmRsZSBoYW5kbGUtLSIrdC50eXBlfSkuYXR0cigiY3Vyc29yIixmdW5jdGlvbih0KXtyZXR1cm4gVGRbdC50eXBlXX0pLHQuZWFjaChyKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKS5vbigibW91c2Vkb3duLmJydXNoIHRvdWNoc3RhcnQuYnJ1c2giLHUpfWZ1bmN0aW9uIHIoKXt2YXIgdD1NbCh0aGlzKSxuPVNlKHRoaXMpLnNlbGVjdGlvbjtuPyh0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IixuWzBdWzBdKS5hdHRyKCJ5IixuWzBdWzFdKS5hdHRyKCJ3aWR0aCIsblsxXVswXS1uWzBdWzBdKS5hdHRyKCJoZWlnaHQiLG5bMV1bMV0tblswXVsxXSksdC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5zdHlsZSgiZGlzcGxheSIsbnVsbCkuYXR0cigieCIsZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlW3QudHlwZS5sZW5ndGgtMV0/blsxXVswXS1oLzI6blswXVswXS1oLzJ9KS5hdHRyKCJ5IixmdW5jdGlvbih0KXtyZXR1cm4icyI9PT10LnR5cGVbMF0/blsxXVsxXS1oLzI6blswXVsxXS1oLzJ9KS5hdHRyKCJ3aWR0aCIsZnVuY3Rpb24odCl7cmV0dXJuIm4iPT09dC50eXBlfHwicyI9PT10LnR5cGU/blsxXVswXS1uWzBdWzBdK2g6aH0pLmF0dHIoImhlaWdodCIsZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlfHwidyI9PT10LnR5cGU/blsxXVsxXS1uWzBdWzFdK2g6aH0pKTp0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiwuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLCJub25lIikuYXR0cigieCIsbnVsbCkuYXR0cigieSIsbnVsbCkuYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCl9ZnVuY3Rpb24gaSh0LG4pe3JldHVybiB0Ll9fYnJ1c2guZW1pdHRlcnx8bmV3IG8odCxuKX1mdW5jdGlvbiBvKHQsbil7dGhpcy50aGF0PXQsdGhpcy5hcmdzPW4sdGhpcy5zdGF0ZT10Ll9fYnJ1c2gsdGhpcy5hY3RpdmU9MH1mdW5jdGlvbiB1KCl7ZnVuY3Rpb24gZSgpe3ZhciB0PVlmKFQpOyFVfHx3fHxNfHwoTWF0aC5hYnModFswXS1PWzBdKT5NYXRoLmFicyh0WzFdLU9bMV0pP009ITA6dz0hMCksTz10LGI9ITAsX2QoKSxvKCl9ZnVuY3Rpb24gbygpe3ZhciB0O3N3aXRjaChtPU9bMF0tRFswXSx4PU9bMV0tRFsxXSxTKXtjYXNlIHlkOmNhc2UgZ2Q6TiYmKG09TWF0aC5tYXgoUC1sLE1hdGgubWluKEwtdixtKSksaD1sK20sXz12K20pLEUmJih4PU1hdGgubWF4KFItcCxNYXRoLm1pbihxLWcseCkpLGQ9cCt4LHk9Zyt4KTticmVhaztjYXNlIG1kOk48MD8obT1NYXRoLm1heChQLWwsTWF0aC5taW4oTC1sLG0pKSxoPWwrbSxfPXYpOk4+MCYmKG09TWF0aC5tYXgoUC12LE1hdGgubWluKEwtdixtKSksaD1sLF89dittKSxFPDA/KHg9TWF0aC5tYXgoUi1wLE1hdGgubWluKHEtcCx4KSksZD1wK3gseT1nKTpFPjAmJih4PU1hdGgubWF4KFItZyxNYXRoLm1pbihxLWcseCkpLGQ9cCx5PWcreCk7YnJlYWs7Y2FzZSB4ZDpOJiYoaD1NYXRoLm1heChQLE1hdGgubWluKEwsbC1tKk4pKSxfPU1hdGgubWF4KFAsTWF0aC5taW4oTCx2K20qTikpKSxFJiYoZD1NYXRoLm1heChSLE1hdGgubWluKHEscC14KkUpKSx5PU1hdGgubWF4KFIsTWF0aC5taW4ocSxnK3gqRSkpKX1fPGgmJihOKj0tMSx0PWwsbD12LHY9dCx0PWgsaD1fLF89dCxrIGluIGtkJiZZLmF0dHIoImN1cnNvciIsVGRbaz1rZFtrXV0pKSx5PGQmJihFKj0tMSx0PXAscD1nLGc9dCx0PWQsZD15LHk9dCxrIGluIFNkJiZZLmF0dHIoImN1cnNvciIsVGRbaz1TZFtrXV0pKSxBLnNlbGVjdGlvbiYmKHo9QS5zZWxlY3Rpb24pLHcmJihoPXpbMF1bMF0sXz16WzFdWzBdKSxNJiYoZD16WzBdWzFdLHk9elsxXVsxXSkselswXVswXT09PWgmJnpbMF1bMV09PT1kJiZ6WzFdWzBdPT09XyYmelsxXVsxXT09PXl8fChBLnNlbGVjdGlvbj1bW2gsZF0sW18seV1dLHIuY2FsbChUKSxGLmJydXNoKCkpfWZ1bmN0aW9uIHUoKXtpZih3ZSgpLHQuZXZlbnQudG91Y2hlcyl7aWYodC5ldmVudC50b3VjaGVzLmxlbmd0aClyZXR1cm47YyYmY2xlYXJUaW1lb3V0KGMpLGM9c2V0VGltZW91dChmdW5jdGlvbigpe2M9bnVsbH0sNTAwKSxJLm9uKCJ0b3VjaG1vdmUuYnJ1c2ggdG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLG51bGwpfWVsc2UgZ3QodC5ldmVudC52aWV3LGIpLEIub24oImtleWRvd24uYnJ1c2gga2V5dXAuYnJ1c2ggbW91c2Vtb3ZlLmJydXNoIG1vdXNldXAuYnJ1c2giLG51bGwpO0kuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKSxZLmF0dHIoImN1cnNvciIsVGQub3ZlcmxheSksQS5zZWxlY3Rpb24mJih6PUEuc2VsZWN0aW9uKSxOZSh6KSYmKEEuc2VsZWN0aW9uPW51bGwsci5jYWxsKFQpKSxGLmVuZCgpfWZ1bmN0aW9uIGEoKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2OlU9TiYmRTticmVhaztjYXNlIDE4OlM9PT1tZCYmKE4mJih2PV8tbSpOLGw9aCttKk4pLEUmJihnPXkteCpFLHA9ZCt4KkUpLFM9eGQsbygpKTticmVhaztjYXNlIDMyOlMhPT1tZCYmUyE9PXhkfHwoTjwwP3Y9Xy1tOk4+MCYmKGw9aC1tKSxFPDA/Zz15LXg6RT4wJiYocD1kLXgpLFM9eWQsWS5hdHRyKCJjdXJzb3IiLFRkLnNlbGVjdGlvbiksbygpKTticmVhaztkZWZhdWx0OnJldHVybn1fZCgpfWZ1bmN0aW9uIHMoKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2OlUmJih3PU09VT0hMSxvKCkpO2JyZWFrO2Nhc2UgMTg6Uz09PXhkJiYoTjwwP3Y9XzpOPjAmJihsPWgpLEU8MD9nPXk6RT4wJiYocD1kKSxTPW1kLG8oKSk7YnJlYWs7Y2FzZSAzMjpTPT09eWQmJih0LmV2ZW50LmFsdEtleT8oTiYmKHY9Xy1tKk4sbD1oK20qTiksRSYmKGc9eS14KkUscD1kK3gqRSksUz14ZCk6KE48MD92PV86Tj4wJiYobD1oKSxFPDA/Zz15OkU+MCYmKHA9ZCksUz1tZCksWS5hdHRyKCJjdXJzb3IiLFRkW2tdKSxvKCkpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufV9kKCl9aWYodC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDx0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybiBfZCgpfWVsc2UgaWYoYylyZXR1cm47aWYoZi5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBsLGgscCxkLHYsXyxnLHksbSx4LGIsdyxNLFQ9dGhpcyxrPXQuZXZlbnQudGFyZ2V0Ll9fZGF0YV9fLnR5cGUsUz0ic2VsZWN0aW9uIj09PSh0LmV2ZW50Lm1ldGFLZXk/az0ib3ZlcmxheSI6ayk/Z2Q6dC5ldmVudC5hbHRLZXk/eGQ6bWQsTj1uPT09d2Q/bnVsbDpOZFtrXSxFPW49PT1iZD9udWxsOkVkW2tdLEE9U2UoVCksQz1BLmV4dGVudCx6PUEuc2VsZWN0aW9uLFA9Q1swXVswXSxSPUNbMF1bMV0sTD1DWzFdWzBdLHE9Q1sxXVsxXSxVPU4mJkUmJnQuZXZlbnQuc2hpZnRLZXksRD1ZZihUKSxPPUQsRj1pKFQsYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpOyJvdmVybGF5Ij09PWs/QS5zZWxlY3Rpb249ej1bW2w9bj09PXdkP1A6RFswXSxwPW49PT1iZD9SOkRbMV1dLFt2PW49PT13ZD9MOmwsZz1uPT09YmQ/cTpwXV06KGw9elswXVswXSxwPXpbMF1bMV0sdj16WzFdWzBdLGc9elsxXVsxXSksaD1sLGQ9cCxfPXYseT1nO3ZhciBJPU1sKFQpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpLFk9SS5zZWxlY3RBbGwoIi5vdmVybGF5IikuYXR0cigiY3Vyc29yIixUZFtrXSk7aWYodC5ldmVudC50b3VjaGVzKUkub24oInRvdWNobW92ZS5icnVzaCIsZSwhMCkub24oInRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIix1LCEwKTtlbHNle3ZhciBCPU1sKHQuZXZlbnQudmlldykub24oImtleWRvd24uYnJ1c2giLGEsITApLm9uKCJrZXl1cC5icnVzaCIscywhMCkub24oIm1vdXNlbW92ZS5icnVzaCIsZSwhMCkub24oIm1vdXNldXAuYnJ1c2giLHUsITApO0VsKHQuZXZlbnQudmlldyl9d2UoKSx2cChUKSxyLmNhbGwoVCksRi5zdGFydCgpfX1mdW5jdGlvbiBhKCl7dmFyIHQ9dGhpcy5fX2JydXNofHx7c2VsZWN0aW9uOm51bGx9O3JldHVybiB0LmV4dGVudD1zLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmRpbT1uLHR9dmFyIGMscz1rZSxmPVRlLGw9ZChlLCJzdGFydCIsImJydXNoIiwiZW5kIiksaD02O3JldHVybiBlLm1vdmU9ZnVuY3Rpb24odCxlKXt0LnNlbGVjdGlvbj90Lm9uKCJzdGFydC5icnVzaCIsZnVuY3Rpb24oKXtpKHRoaXMsYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpLnN0YXJ0KCl9KS5vbigiaW50ZXJydXB0LmJydXNoIGVuZC5icnVzaCIsZnVuY3Rpb24oKXtpKHRoaXMsYXJndW1lbnRzKS5lbmQoKX0pLnR3ZWVuKCJicnVzaCIsZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3Uuc2VsZWN0aW9uPTE9PT10JiZOZShzKT9udWxsOmYodCksci5jYWxsKG8pLGEuYnJ1c2goKX12YXIgbz10aGlzLHU9by5fX2JydXNoLGE9aShvLGFyZ3VtZW50cyksYz11LnNlbGVjdGlvbixzPW4uaW5wdXQoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZSx1LmV4dGVudCksZj1BaChjLHMpO3JldHVybiBjJiZzP3Q6dCgxKX0pOnQuZWFjaChmdW5jdGlvbigpe3ZhciB0PXRoaXMsbz1hcmd1bWVudHMsdT10Ll9fYnJ1c2gsYT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodCxvKTplLHUuZXh0ZW50KSxjPWkodCxvKS5iZWZvcmVzdGFydCgpO3ZwKHQpLHUuc2VsZWN0aW9uPW51bGw9PWF8fE5lKGEpP251bGw6YSxyLmNhbGwodCksYy5zdGFydCgpLmJydXNoKCkuZW5kKCl9KX0sby5wcm90b3R5cGU9e2JlZm9yZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PT0rK3RoaXMuYWN0aXZlJiYodGhpcy5zdGF0ZS5lbWl0dGVyPXRoaXMsdGhpcy5zdGFydGluZz0hMCksdGhpc30sc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydGluZyYmKHRoaXMuc3RhcnRpbmc9ITEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSxicnVzaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVtaXQoImJydXNoIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT0tLXRoaXMuYWN0aXZlJiYoZGVsZXRlIHRoaXMuc3RhdGUuZW1pdHRlcix0aGlzLmVtaXQoImVuZCIpKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKHQpe0UobmV3IHZkKGUsdCxuLm91dHB1dCh0aGlzLnN0YXRlLnNlbGVjdGlvbikpLGwuYXBwbHksbCxbdCx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSxlLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmRkKFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSxlKTpzfSxlLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmRkKCEhdCksZSk6Zn0sZS5oYW5kbGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0LGUpOmh9LGUub249ZnVuY3Rpb24oKXt2YXIgdD1sLm9uLmFwcGx5KGwsYXJndW1lbnRzKTtyZXR1cm4gdD09PWw/ZTp0fSxlfWZ1bmN0aW9uIFBlKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3JldHVybiB0KG4uc291cmNlLnZhbHVlK24udGFyZ2V0LnZhbHVlLGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlKX19ZnVuY3Rpb24gUmUoKXt0aGlzLl94MD10aGlzLl95MD10aGlzLl94MT10aGlzLl95MT1udWxsLHRoaXMuXz0iIn1mdW5jdGlvbiBMZSgpe3JldHVybiBuZXcgUmV9ZnVuY3Rpb24gcWUodCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uIFVlKHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiBEZSh0KXtyZXR1cm4gdC5yYWRpdXN9ZnVuY3Rpb24gT2UodCl7cmV0dXJuIHQuc3RhcnRBbmdsZX1mdW5jdGlvbiBGZSh0KXtyZXR1cm4gdC5lbmRBbmdsZX1mdW5jdGlvbiBJZSgpe31mdW5jdGlvbiBZZSh0LG4pe3ZhciBlPW5ldyBJZTtpZih0IGluc3RhbmNlb2YgSWUpdC5lYWNoKGZ1bmN0aW9uKHQsbil7ZS5zZXQobix0KX0pO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIHIsaT0tMSxvPXQubGVuZ3RoO2lmKG51bGw9PW4pZm9yKDsrK2k8bzspZS5zZXQoaSx0W2ldKTtlbHNlIGZvcig7KytpPG87KWUuc2V0KG4ocj10W2ldLGksdCkscil9ZWxzZSBpZih0KWZvcih2YXIgdSBpbiB0KWUuc2V0KHUsdFt1XSk7cmV0dXJuIGV9ZnVuY3Rpb24gQmUoKXtyZXR1cm57fX1mdW5jdGlvbiBqZSh0LG4sZSl7dFtuXT1lfWZ1bmN0aW9uIEhlKCl7cmV0dXJuIFllKCl9ZnVuY3Rpb24gWGUodCxuLGUpe3Quc2V0KG4sZSl9ZnVuY3Rpb24gVmUoKXt9ZnVuY3Rpb24gV2UodCxuKXt2YXIgZT1uZXcgVmU7aWYodCBpbnN0YW5jZW9mIFZlKXQuZWFjaChmdW5jdGlvbih0KXtlLmFkZCh0KX0pO2Vsc2UgaWYodCl7dmFyIHI9LTEsaT10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytyPGk7KWUuYWRkKHRbcl0pO2Vsc2UgZm9yKDsrK3I8aTspZS5hZGQobih0W3JdLHIsdCkpfXJldHVybiBlfWZ1bmN0aW9uICRlKHQpe3JldHVybiBuZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrdC5tYXAoZnVuY3Rpb24odCxuKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCkrIjogZFsiK24rIl0ifSkuam9pbigiLCIpKyJ9Iil9ZnVuY3Rpb24gWmUodCxuKXt2YXIgZT0kZSh0KTtyZXR1cm4gZnVuY3Rpb24ocixpKXtyZXR1cm4gbihlKHIpLGksdCl9fWZ1bmN0aW9uIEdlKHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgciBpbiB0KXIgaW4gbnx8ZS5wdXNoKG5bcl09cil9KSxlfWZ1bmN0aW9uIEplKHQsbixlLHIpe2lmKGlzTmFOKG4pfHxpc05hTihlKSlyZXR1cm4gdDt2YXIgaSxvLHUsYSxjLHMsZixsLGgscD10Ll9yb290LGQ9e2RhdGE6cn0sdj10Ll94MCxfPXQuX3kwLGc9dC5feDEseT10Ll95MTtpZighcClyZXR1cm4gdC5fcm9vdD1kLHQ7Zm9yKDtwLmxlbmd0aDspaWYoKHM9bj49KG89KHYrZykvMikpP3Y9bzpnPW8sKGY9ZT49KHU9KF8reSkvMikpP189dTp5PXUsaT1wLCEocD1wW2w9Zjw8MXxzXSkpcmV0dXJuIGlbbF09ZCx0O2lmKGE9K3QuX3guY2FsbChudWxsLHAuZGF0YSksYz0rdC5feS5jYWxsKG51bGwscC5kYXRhKSxuPT09YSYmZT09PWMpcmV0dXJuIGQubmV4dD1wLGk/aVtsXT1kOnQuX3Jvb3Q9ZCx0O2RvIGk9aT9pW2xdPW5ldyBBcnJheSg0KTp0Ll9yb290PW5ldyBBcnJheSg0KSwocz1uPj0obz0oditnKS8yKSk/dj1vOmc9bywoZj1lPj0odT0oXyt5KS8yKSk/Xz11Onk9dTt3aGlsZSgobD1mPDwxfHMpPT09KGg9KGM+PXUpPDwxfGE+PW8pKTtyZXR1cm4gaVtoXT1wLGlbbF09ZCx0fWZ1bmN0aW9uIFFlKHQpe3ZhciBuLGUscixpLG89dC5sZW5ndGgsdT1uZXcgQXJyYXkobyksYT1uZXcgQXJyYXkobyksYz0xLzAscz0xLzAsZj0tKDEvMCksbD0tKDEvMCk7Zm9yKGU9MDtlPG87KytlKWlzTmFOKHI9K3RoaXMuX3guY2FsbChudWxsLG49dFtlXSkpfHxpc05hTihpPSt0aGlzLl95LmNhbGwobnVsbCxuKSl8fCh1W2VdPXIsYVtlXT1pLHI8YyYmKGM9cikscj5mJiYoZj1yKSxpPHMmJihzPWkpLGk+bCYmKGw9aSkpO2ZvcihmPGMmJihjPXRoaXMuX3gwLGY9dGhpcy5feDEpLGw8cyYmKHM9dGhpcy5feTAsbD10aGlzLl95MSksdGhpcy5jb3ZlcihjLHMpLmNvdmVyKGYsbCksZT0wO2U8bzsrK2UpSmUodGhpcyx1W2VdLGFbZV0sdFtlXSk7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gS2UodCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aDtuPGU7KytuKXRoaXMucmVtb3ZlKHRbbl0pO3JldHVybiB0aGlzfWZ1bmN0aW9uIHRyKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIG5yKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIGVyKHQsbixlKXt2YXIgcj1uZXcgcnIobnVsbD09bj90cjpuLG51bGw9PWU/bnI6ZSxOYU4sTmFOLE5hTixOYU4pO3JldHVybiBudWxsPT10P3I6ci5hZGRBbGwodCl9ZnVuY3Rpb24gcnIodCxuLGUscixpLG8pe3RoaXMuX3g9dCx0aGlzLl95PW4sdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzLl9yb290PXZvaWQgMH1mdW5jdGlvbiBpcih0KXtmb3IodmFyIG49e2RhdGE6dC5kYXRhfSxlPW47dD10Lm5leHQ7KWU9ZS5uZXh0PXtkYXRhOnQuZGF0YX07cmV0dXJuIG59ZnVuY3Rpb24gb3IodCl7cmV0dXJuIHQueCt0LnZ4fWZ1bmN0aW9uIHVyKHQpe3JldHVybiB0LnkrdC52eX1mdW5jdGlvbiBhcih0KXtyZXR1cm4gdC5pbmRleH1mdW5jdGlvbiBjcih0LG4pe3ZhciBlPXQuZ2V0KG4pO2lmKCFlKXRocm93IG5ldyBFcnJvcigibWlzc2luZzogIituKTtyZXR1cm4gZX1mdW5jdGlvbiBzcih0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIGZyKHQpe3JldHVybiB0Lnl9ZnVuY3Rpb24gbHIodCl7cmV0dXJuIG5ldyBocih0KX1mdW5jdGlvbiBocih0KXtpZighKG49WXYuZXhlYyh0KSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIit0KTt2YXIgbixlPW5bMV18fCIgIixyPW5bMl18fCI+IixpPW5bM118fCItIixvPW5bNF18fCIiLHU9ISFuWzVdLGE9bls2XSYmK25bNl0sYz0hIW5bN10scz1uWzhdJiYrbls4XS5zbGljZSgxKSxmPW5bOV18fCIiOyJuIj09PWY/KGM9ITAsZj0iZyIpOkl2W2ZdfHwoZj0iIiksKHV8fCIwIj09PWUmJiI9Ij09PXIpJiYodT0hMCxlPSIwIixyPSI9IiksdGhpcy5maWxsPWUsdGhpcy5hbGlnbj1yLHRoaXMuc2lnbj1pLHRoaXMuc3ltYm9sPW8sdGhpcy56ZXJvPXUsdGhpcy53aWR0aD1hLHRoaXMuY29tbWE9Yyx0aGlzLnByZWNpc2lvbj1zLHRoaXMudHlwZT1mfWZ1bmN0aW9uIHByKG4pewpyZXR1cm4gQnY9WHYobiksdC5mb3JtYXQ9QnYuZm9ybWF0LHQuZm9ybWF0UHJlZml4PUJ2LmZvcm1hdFByZWZpeCxCdn1mdW5jdGlvbiBkcigpe3RoaXMucmVzZXQoKX1mdW5jdGlvbiB2cih0LG4sZSl7dmFyIHI9dC5zPW4rZSxpPXItbixvPXItaTt0LnQ9bi1vKyhlLWkpfWZ1bmN0aW9uIF9yKHQpe3JldHVybiB0PjE/MDp0PC0xP0NfOk1hdGguYWNvcyh0KX1mdW5jdGlvbiBncih0KXtyZXR1cm4gdD4xP3pfOnQ8LTE/LXpfOk1hdGguYXNpbih0KX1mdW5jdGlvbiB5cih0KXtyZXR1cm4odD1IXyh0LzIpKSp0fWZ1bmN0aW9uIG1yKCl7fWZ1bmN0aW9uIHhyKHQsbil7dCYmWl8uaGFzT3duUHJvcGVydHkodC50eXBlKSYmWl9bdC50eXBlXSh0LG4pfWZ1bmN0aW9uIGJyKHQsbixlKXt2YXIgcixpPS0xLG89dC5sZW5ndGgtZTtmb3Iobi5saW5lU3RhcnQoKTsrK2k8bzspcj10W2ldLG4ucG9pbnQoclswXSxyWzFdLHJbMl0pO24ubGluZUVuZCgpfWZ1bmN0aW9uIHdyKHQsbil7dmFyIGU9LTEscj10Lmxlbmd0aDtmb3Iobi5wb2x5Z29uU3RhcnQoKTsrK2U8cjspYnIodFtlXSxuLDEpO24ucG9seWdvbkVuZCgpfWZ1bmN0aW9uIE1yKCl7S18ucG9pbnQ9a3J9ZnVuY3Rpb24gVHIoKXtTcihHdixKdil9ZnVuY3Rpb24ga3IodCxuKXtLXy5wb2ludD1TcixHdj10LEp2PW4sdCo9cV8sbio9cV8sUXY9dCxLdj1GXyhuPW4vMitQXyksdF89SF8obil9ZnVuY3Rpb24gU3IodCxuKXt0Kj1xXyxuKj1xXyxuPW4vMitQXzt2YXIgZT10LVF2LHI9ZT49MD8xOi0xLGk9ciplLG89Rl8obiksdT1IXyhuKSxhPXRfKnUsYz1LdipvK2EqRl8oaSkscz1hKnIqSF8oaSk7Sl8uYWRkKE9fKHMsYykpLFF2PXQsS3Y9byx0Xz11fWZ1bmN0aW9uIE5yKHQpe3JldHVybltPXyh0WzFdLHRbMF0pLGdyKHRbMl0pXX1mdW5jdGlvbiBFcih0KXt2YXIgbj10WzBdLGU9dFsxXSxyPUZfKGUpO3JldHVybltyKkZfKG4pLHIqSF8obiksSF8oZSldfWZ1bmN0aW9uIEFyKHQsbil7cmV0dXJuIHRbMF0qblswXSt0WzFdKm5bMV0rdFsyXSpuWzJdfWZ1bmN0aW9uIENyKHQsbil7cmV0dXJuW3RbMV0qblsyXS10WzJdKm5bMV0sdFsyXSpuWzBdLXRbMF0qblsyXSx0WzBdKm5bMV0tdFsxXSpuWzBdXX1mdW5jdGlvbiB6cih0LG4pe3RbMF0rPW5bMF0sdFsxXSs9blsxXSx0WzJdKz1uWzJdfWZ1bmN0aW9uIFByKHQsbil7cmV0dXJuW3RbMF0qbix0WzFdKm4sdFsyXSpuXX1mdW5jdGlvbiBScih0KXt2YXIgbj1WXyh0WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSk7dFswXS89bix0WzFdLz1uLHRbMl0vPW59ZnVuY3Rpb24gTHIodCxuKXtzXy5wdXNoKGZfPVtuXz10LHJfPXRdKSxuPGVfJiYoZV89biksbj5pXyYmKGlfPW4pfWZ1bmN0aW9uIHFyKHQsbil7dmFyIGU9RXIoW3QqcV8sbipxX10pO2lmKGNfKXt2YXIgcj1DcihjXyxlKSxpPVtyWzFdLC1yWzBdLDBdLG89Q3IoaSxyKTtScihvKSxvPU5yKG8pO3ZhciB1LGE9dC1vXyxjPWE+MD8xOi0xLHM9b1swXSpMXypjLGY9VV8oYSk+MTgwO2ZeKGMqb188cyYmczxjKnQpPyh1PW9bMV0qTF8sdT5pXyYmKGlfPXUpKToocz0ocyszNjApJTM2MC0xODAsZl4oYypvXzxzJiZzPGMqdCk/KHU9LW9bMV0qTF8sdTxlXyYmKGVfPXUpKToobjxlXyYmKGVfPW4pLG4+aV8mJihpXz1uKSkpLGY/dDxvXz9ZcihuXyx0KT5ZcihuXyxyXykmJihyXz10KTpZcih0LHJfKT5ZcihuXyxyXykmJihuXz10KTpyXz49bl8/KHQ8bl8mJihuXz10KSx0PnJfJiYocl89dCkpOnQ+b18/WXIobl8sdCk+WXIobl8scl8pJiYocl89dCk6WXIodCxyXyk+WXIobl8scl8pJiYobl89dCl9ZWxzZSBzXy5wdXNoKGZfPVtuXz10LHJfPXRdKTtuPGVfJiYoZV89biksbj5pXyYmKGlfPW4pLGNfPWUsb189dH1mdW5jdGlvbiBVcigpe2VnLnBvaW50PXFyfWZ1bmN0aW9uIERyKCl7Zl9bMF09bl8sZl9bMV09cl8sZWcucG9pbnQ9THIsY189bnVsbH1mdW5jdGlvbiBPcih0LG4pe2lmKGNfKXt2YXIgZT10LW9fO25nLmFkZChVXyhlKT4xODA/ZSsoZT4wPzM2MDotMzYwKTplKX1lbHNlIHVfPXQsYV89bjtLXy5wb2ludCh0LG4pLHFyKHQsbil9ZnVuY3Rpb24gRnIoKXtLXy5saW5lU3RhcnQoKX1mdW5jdGlvbiBJcigpe09yKHVfLGFfKSxLXy5saW5lRW5kKCksVV8obmcpPkVfJiYobl89LShyXz0xODApKSxmX1swXT1uXyxmX1sxXT1yXyxjXz1udWxsfWZ1bmN0aW9uIFlyKHQsbil7cmV0dXJuKG4tPXQpPDA/biszNjA6bn1mdW5jdGlvbiBCcih0LG4pe3JldHVybiB0WzBdLW5bMF19ZnVuY3Rpb24ganIodCxuKXtyZXR1cm4gdFswXTw9dFsxXT90WzBdPD1uJiZuPD10WzFdOm48dFswXXx8dFsxXTxufWZ1bmN0aW9uIEhyKHQsbil7dCo9cV8sbio9cV87dmFyIGU9Rl8obik7WHIoZSpGXyh0KSxlKkhfKHQpLEhfKG4pKX1mdW5jdGlvbiBYcih0LG4sZSl7KytsXyxwXys9KHQtcF8pL2xfLGRfKz0obi1kXykvbF8sdl8rPShlLXZfKS9sX31mdW5jdGlvbiBWcigpe2lnLnBvaW50PVdyfWZ1bmN0aW9uIFdyKHQsbil7dCo9cV8sbio9cV87dmFyIGU9Rl8obik7VF89ZSpGXyh0KSxrXz1lKkhfKHQpLFNfPUhfKG4pLGlnLnBvaW50PSRyLFhyKFRfLGtfLFNfKX1mdW5jdGlvbiAkcih0LG4pe3QqPXFfLG4qPXFfO3ZhciBlPUZfKG4pLHI9ZSpGXyh0KSxpPWUqSF8odCksbz1IXyhuKSx1PU9fKFZfKCh1PWtfKm8tU18qaSkqdSsodT1TXypyLVRfKm8pKnUrKHU9VF8qaS1rXypyKSp1KSxUXypyK2tfKmkrU18qbyk7aF8rPXUsX18rPXUqKFRfKyhUXz1yKSksZ18rPXUqKGtfKyhrXz1pKSkseV8rPXUqKFNfKyhTXz1vKSksWHIoVF8sa18sU18pfWZ1bmN0aW9uIFpyKCl7aWcucG9pbnQ9SHJ9ZnVuY3Rpb24gR3IoKXtpZy5wb2ludD1Rcn1mdW5jdGlvbiBKcigpe0tyKHdfLE1fKSxpZy5wb2ludD1Icn1mdW5jdGlvbiBRcih0LG4pe3dfPXQsTV89bix0Kj1xXyxuKj1xXyxpZy5wb2ludD1Lcjt2YXIgZT1GXyhuKTtUXz1lKkZfKHQpLGtfPWUqSF8odCksU189SF8obiksWHIoVF8sa18sU18pfWZ1bmN0aW9uIEtyKHQsbil7dCo9cV8sbio9cV87dmFyIGU9Rl8obikscj1lKkZfKHQpLGk9ZSpIXyh0KSxvPUhfKG4pLHU9a18qby1TXyppLGE9U18qci1UXypvLGM9VF8qaS1rXypyLHM9Vl8odSp1K2EqYStjKmMpLGY9Z3IocyksbD1zJiYtZi9zO21fKz1sKnUseF8rPWwqYSxiXys9bCpjLGhfKz1mLF9fKz1mKihUXysoVF89cikpLGdfKz1mKihrXysoa189aSkpLHlfKz1mKihTXysoU189bykpLFhyKFRfLGtfLFNfKX1mdW5jdGlvbiB0aSh0LG4pe3JldHVyblt0PkNfP3QtUl86dDwtQ18/dCtSXzp0LG5dfWZ1bmN0aW9uIG5pKHQsbixlKXtyZXR1cm4odCU9Ul8pP258fGU/YWcocmkodCksaWkobixlKSk6cmkodCk6bnx8ZT9paShuLGUpOnRpfWZ1bmN0aW9uIGVpKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3JldHVybiBuKz10LFtuPkNfP24tUl86bjwtQ18/bitSXzpuLGVdfX1mdW5jdGlvbiByaSh0KXt2YXIgbj1laSh0KTtyZXR1cm4gbi5pbnZlcnQ9ZWkoLXQpLG59ZnVuY3Rpb24gaWkodCxuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9Rl8obiksYT1GXyh0KSplLGM9SF8odCkqZSxzPUhfKG4pLGY9cypyK2EqaTtyZXR1cm5bT18oYypvLWYqdSxhKnItcyppKSxncihmKm8rYyp1KV19dmFyIHI9Rl8odCksaT1IXyh0KSxvPUZfKG4pLHU9SF8obik7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9Rl8obiksYT1GXyh0KSplLGM9SF8odCkqZSxzPUhfKG4pLGY9cypvLWMqdTtyZXR1cm5bT18oYypvK3MqdSxhKnIrZippKSxncihmKnItYSppKV19LGV9ZnVuY3Rpb24gb2kodCxuLGUscixpLG8pe2lmKGUpe3ZhciB1PUZfKG4pLGE9SF8obiksYz1yKmU7bnVsbD09aT8oaT1uK3IqUl8sbz1uLWMvMik6KGk9dWkodSxpKSxvPXVpKHUsbyksKHI+MD9pPG86aT5vKSYmKGkrPXIqUl8pKTtmb3IodmFyIHMsZj1pO3I+MD9mPm86ZjxvO2YtPWMpcz1OcihbdSwtYSpGXyhmKSwtYSpIXyhmKV0pLHQucG9pbnQoc1swXSxzWzFdKX19ZnVuY3Rpb24gdWkodCxuKXtuPUVyKG4pLG5bMF0tPXQsUnIobik7dmFyIGU9X3IoLW5bMV0pO3JldHVybigoLW5bMl08MD8tZTplKStSXy1FXyklUl99ZnVuY3Rpb24gYWkodCxuLGUscil7dGhpcy54PXQsdGhpcy56PW4sdGhpcy5vPWUsdGhpcy5lPXIsdGhpcy52PSExLHRoaXMubj10aGlzLnA9bnVsbH1mdW5jdGlvbiBjaSh0KXtpZihuPXQubGVuZ3RoKXtmb3IodmFyIG4sZSxyPTAsaT10WzBdOysrcjxuOylpLm49ZT10W3JdLGUucD1pLGk9ZTtpLm49ZT10WzBdLGUucD1pfX1mdW5jdGlvbiBzaSh0LG4sZSxyKXtmdW5jdGlvbiBpKGksbyl7cmV0dXJuIHQ8PWkmJmk8PWUmJm48PW8mJm88PXJ9ZnVuY3Rpb24gbyhpLG8sYSxzKXt2YXIgZj0wLGw9MDtpZihudWxsPT1pfHwoZj11KGksYSkpIT09KGw9dShvLGEpKXx8YyhpLG8pPDBeYT4wKXtkbyBzLnBvaW50KDA9PT1mfHwzPT09Zj90OmUsZj4xP3I6bik7d2hpbGUoKGY9KGYrYSs0KSU0KSE9PWwpfWVsc2Ugcy5wb2ludChvWzBdLG9bMV0pfWZ1bmN0aW9uIHUocixpKXtyZXR1cm4gVV8oclswXS10KTxFXz9pPjA/MDozOlVfKHJbMF0tZSk8RV8/aT4wPzI6MTpVXyhyWzFdLW4pPEVfP2k+MD8xOjA6aT4wPzM6Mn1mdW5jdGlvbiBhKHQsbil7cmV0dXJuIGModC54LG4ueCl9ZnVuY3Rpb24gYyh0LG4pe3ZhciBlPXUodCwxKSxyPXUobiwxKTtyZXR1cm4gZSE9PXI/ZS1yOjA9PT1lP25bMV0tdFsxXToxPT09ZT90WzBdLW5bMF06Mj09PWU/dFsxXS1uWzFdOm5bMF0tdFswXX1yZXR1cm4gZnVuY3Rpb24odSl7ZnVuY3Rpb24gYyh0LG4pe2kodCxuKSYmUy5wb2ludCh0LG4pfWZ1bmN0aW9uIHMoKXtmb3IodmFyIG49MCxlPTAsaT1fLmxlbmd0aDtlPGk7KytlKWZvcih2YXIgbyx1LGE9X1tlXSxjPTEscz1hLmxlbmd0aCxmPWFbMF0sbD1mWzBdLGg9ZlsxXTtjPHM7KytjKW89bCx1PWgsZj1hW2NdLGw9ZlswXSxoPWZbMV0sdTw9cj9oPnImJihsLW8pKihyLXUpPihoLXUpKih0LW8pJiYrK246aDw9ciYmKGwtbykqKHItdSk8KGgtdSkqKHQtbykmJi0tbjtyZXR1cm4gbn1mdW5jdGlvbiBmKCl7Uz1OLHY9W10sXz1bXSxrPSEwfWZ1bmN0aW9uIGwoKXt2YXIgdD1zKCksbj1rJiZ0LGU9KHY9aGYodikpLmxlbmd0aDsobnx8ZSkmJih1LnBvbHlnb25TdGFydCgpLG4mJih1LmxpbmVTdGFydCgpLG8obnVsbCxudWxsLDEsdSksdS5saW5lRW5kKCkpLGUmJlRnKHYsYSx0LG8sdSksdS5wb2x5Z29uRW5kKCkpLFM9dSx2PV89Zz1udWxsfWZ1bmN0aW9uIGgoKXtFLnBvaW50PWQsXyYmXy5wdXNoKGc9W10pLFQ9ITAsTT0hMSxiPXc9TmFOfWZ1bmN0aW9uIHAoKXt2JiYoZCh5LG0pLHgmJk0mJk4ucmVqb2luKCksdi5wdXNoKE4ucmVzdWx0KCkpKSxFLnBvaW50PWMsTSYmUy5saW5lRW5kKCl9ZnVuY3Rpb24gZChvLHUpe3ZhciBhPWkobyx1KTtpZihfJiZnLnB1c2goW28sdV0pLFQpeT1vLG09dSx4PWEsVD0hMSxhJiYoUy5saW5lU3RhcnQoKSxTLnBvaW50KG8sdSkpO2Vsc2UgaWYoYSYmTSlTLnBvaW50KG8sdSk7ZWxzZXt2YXIgYz1bYj1NYXRoLm1heChTZyxNYXRoLm1pbihrZyxiKSksdz1NYXRoLm1heChTZyxNYXRoLm1pbihrZyx3KSldLHM9W289TWF0aC5tYXgoU2csTWF0aC5taW4oa2csbykpLHU9TWF0aC5tYXgoU2csTWF0aC5taW4oa2csdSkpXTt3ZyhjLHMsdCxuLGUscik/KE18fChTLmxpbmVTdGFydCgpLFMucG9pbnQoY1swXSxjWzFdKSksUy5wb2ludChzWzBdLHNbMV0pLGF8fFMubGluZUVuZCgpLGs9ITEpOmEmJihTLmxpbmVTdGFydCgpLFMucG9pbnQobyx1KSxrPSExKX1iPW8sdz11LE09YX12YXIgdixfLGcseSxtLHgsYix3LE0sVCxrLFM9dSxOPWJnKCksRT17cG9pbnQ6YyxsaW5lU3RhcnQ6aCxsaW5lRW5kOnAscG9seWdvblN0YXJ0OmYscG9seWdvbkVuZDpsfTtyZXR1cm4gRX19ZnVuY3Rpb24gZmkoKXt6Zy5wb2ludD1oaSx6Zy5saW5lRW5kPWxpfWZ1bmN0aW9uIGxpKCl7emcucG9pbnQ9emcubGluZUVuZD1tcn1mdW5jdGlvbiBoaSh0LG4pe3QqPXFfLG4qPXFfLGNnPXQsc2c9SF8obiksZmc9Rl8obiksemcucG9pbnQ9cGl9ZnVuY3Rpb24gcGkodCxuKXt0Kj1xXyxuKj1xXzt2YXIgZT1IXyhuKSxyPUZfKG4pLGk9VV8odC1jZyksbz1GXyhpKSx1PUhfKGkpLGE9cip1LGM9ZmcqZS1zZypyKm8scz1zZyplK2ZnKnIqbztDZy5hZGQoT18oVl8oYSphK2MqYykscykpLGNnPXQsc2c9ZSxmZz1yfWZ1bmN0aW9uIGRpKHQsbil7cmV0dXJuISghdHx8IURnLmhhc093blByb3BlcnR5KHQudHlwZSkpJiZEZ1t0LnR5cGVdKHQsbil9ZnVuY3Rpb24gdmkodCxuKXtyZXR1cm4gMD09PXFnKHQsbil9ZnVuY3Rpb24gX2kodCxuKXt2YXIgZT1xZyh0WzBdLHRbMV0pO3JldHVybiBxZyh0WzBdLG4pK3FnKG4sdFsxXSk8PWUrRV99ZnVuY3Rpb24gZ2kodCxuKXtyZXR1cm4hIUFnKHQubWFwKHlpKSxtaShuKSl9ZnVuY3Rpb24geWkodCl7cmV0dXJuIHQ9dC5tYXAobWkpLHQucG9wKCksdH1mdW5jdGlvbiBtaSh0KXtyZXR1cm5bdFswXSpxXyx0WzFdKnFfXX1mdW5jdGlvbiB4aSh0LG4sZSl7dmFyIHI9UXModCxuLUVfLGUpLmNvbmNhdChuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKG4pe3JldHVyblt0LG5dfSl9fWZ1bmN0aW9uIGJpKHQsbixlKXt2YXIgcj1Rcyh0LG4tRV8sZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoZnVuY3Rpb24obil7cmV0dXJuW24sdF19KX19ZnVuY3Rpb24gd2koKXtmdW5jdGlvbiB0KCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6bigpfX1mdW5jdGlvbiBuKCl7cmV0dXJuIFFzKElfKG8vXykqXyxpLF8pLm1hcChoKS5jb25jYXQoUXMoSV8ocy9nKSpnLGMsZykubWFwKHApKS5jb25jYXQoUXMoSV8oci9kKSpkLGUsZCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBVXyh0JV8pPkVffSkubWFwKGYpKS5jb25jYXQoUXMoSV8oYS92KSp2LHUsdikuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBVXyh0JWcpPkVffSkubWFwKGwpKX12YXIgZSxyLGksbyx1LGEsYyxzLGYsbCxoLHAsZD0xMCx2PWQsXz05MCxnPTM2MCx5PTIuNTtyZXR1cm4gdC5saW5lcz1mdW5jdGlvbigpe3JldHVybiBuKCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fX0pfSx0Lm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W2gobykuY29uY2F0KHAoYykuc2xpY2UoMSksaChpKS5yZXZlcnNlKCkuc2xpY2UoMSkscChzKS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LHQuZXh0ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QuZXh0ZW50TWFqb3IobikuZXh0ZW50TWlub3Iobik6dC5leHRlbnRNaW5vcigpfSx0LmV4dGVudE1ham9yPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPStuWzBdWzBdLGk9K25bMV1bMF0scz0rblswXVsxXSxjPStuWzFdWzFdLG8+aSYmKG49byxvPWksaT1uKSxzPmMmJihuPXMscz1jLGM9biksdC5wcmVjaXNpb24oeSkpOltbbyxzXSxbaSxjXV19LHQuZXh0ZW50TWlub3I9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K25bMF1bMF0sZT0rblsxXVswXSxhPStuWzBdWzFdLHU9K25bMV1bMV0scj5lJiYobj1yLHI9ZSxlPW4pLGE+dSYmKG49YSxhPXUsdT1uKSx0LnByZWNpc2lvbih5KSk6W1tyLGFdLFtlLHVdXX0sdC5zdGVwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Quc3RlcE1ham9yKG4pLnN0ZXBNaW5vcihuKTp0LnN0ZXBNaW5vcigpfSx0LnN0ZXBNYWpvcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oXz0rblswXSxnPStuWzFdLHQpOltfLGddfSx0LnN0ZXBNaW5vcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD0rblswXSx2PStuWzFdLHQpOltkLHZdfSx0LnByZWNpc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0rbixmPXhpKGEsdSw5MCksbD1iaShyLGUseSksaD14aShzLGMsOTApLHA9YmkobyxpLHkpLHQpOnl9LHQuZXh0ZW50TWFqb3IoW1stMTgwLC05MCtFX10sWzE4MCw5MC1FX11dKS5leHRlbnRNaW5vcihbWy0xODAsLTgwLUVfXSxbMTgwLDgwK0VfXV0pfWZ1bmN0aW9uIE1pKCl7cmV0dXJuIHdpKCkoKX1mdW5jdGlvbiBUaSgpe2pnLnBvaW50PWtpfWZ1bmN0aW9uIGtpKHQsbil7amcucG9pbnQ9U2ksbGc9cGc9dCxoZz1kZz1ufWZ1bmN0aW9uIFNpKHQsbil7QmcuYWRkKGRnKnQtcGcqbikscGc9dCxkZz1ufWZ1bmN0aW9uIE5pKCl7U2kobGcsaGcpfWZ1bmN0aW9uIEVpKHQsbil7dDxIZyYmKEhnPXQpLHQ+VmcmJihWZz10KSxuPFhnJiYoWGc9biksbj5XZyYmKFdnPW4pfWZ1bmN0aW9uIEFpKHQsbil7WmcrPXQsR2crPW4sKytKZ31mdW5jdGlvbiBDaSgpe2l5LnBvaW50PXppfWZ1bmN0aW9uIHppKHQsbil7aXkucG9pbnQ9UGksQWkoZ2c9dCx5Zz1uKX1mdW5jdGlvbiBQaSh0LG4pe3ZhciBlPXQtZ2cscj1uLXlnLGk9Vl8oZSplK3Iqcik7UWcrPWkqKGdnK3QpLzIsS2crPWkqKHlnK24pLzIsdHkrPWksQWkoZ2c9dCx5Zz1uKX1mdW5jdGlvbiBSaSgpe2l5LnBvaW50PUFpfWZ1bmN0aW9uIExpKCl7aXkucG9pbnQ9VWl9ZnVuY3Rpb24gcWkoKXtEaSh2ZyxfZyl9ZnVuY3Rpb24gVWkodCxuKXtpeS5wb2ludD1EaSxBaSh2Zz1nZz10LF9nPXlnPW4pfWZ1bmN0aW9uIERpKHQsbil7dmFyIGU9dC1nZyxyPW4teWcsaT1WXyhlKmUrcipyKTtRZys9aSooZ2crdCkvMixLZys9aSooeWcrbikvMix0eSs9aSxpPXlnKnQtZ2cqbixueSs9aSooZ2crdCksZXkrPWkqKHlnK24pLHJ5Kz0zKmksQWkoZ2c9dCx5Zz1uKX1mdW5jdGlvbiBPaSh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gRmkodCxuKXtseS5wb2ludD1JaSx1eT1jeT10LGF5PXN5PW59ZnVuY3Rpb24gSWkodCxuKXtjeS09dCxzeS09bixmeS5hZGQoVl8oY3kqY3krc3kqc3kpKSxjeT10LHN5PW59ZnVuY3Rpb24gWWkoKXt0aGlzLl9zdHJpbmc9W119ZnVuY3Rpb24gQmkodCl7cmV0dXJuIm0wLCIrdCsiYSIrdCsiLCIrdCsiIDAgMSwxIDAsIistMip0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKzIqdCsieiJ9ZnVuY3Rpb24gamkodCl7cmV0dXJuIHQubGVuZ3RoPjF9ZnVuY3Rpb24gSGkodCxuKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tel8tRV86el8tdFsxXSktKChuPW4ueClbMF08MD9uWzFdLXpfLUVfOnpfLW5bMV0pfWZ1bmN0aW9uIFhpKHQpe3ZhciBuLGU9TmFOLHI9TmFOLGk9TmFOO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LmxpbmVTdGFydCgpLG49MX0scG9pbnQ6ZnVuY3Rpb24obyx1KXt2YXIgYT1vPjA/Q186LUNfLGM9VV8oby1lKTtVXyhjLUNfKTxFXz8odC5wb2ludChlLHI9KHIrdSkvMj4wP3pfOi16XyksdC5wb2ludChpLHIpLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChhLHIpLHQucG9pbnQobyxyKSxuPTApOmkhPT1hJiZjPj1DXyYmKFVfKGUtaSk8RV8mJihlLT1pKkVfKSxVXyhvLWEpPEVfJiYoby09YSpFXykscj1WaShlLHIsbyx1KSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KGEsciksbj0wKSx0LnBvaW50KGU9byxyPXUpLGk9YX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGU9cj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItbn19fWZ1bmN0aW9uIFZpKHQsbixlLHIpe3ZhciBpLG8sdT1IXyh0LWUpO3JldHVybiBVXyh1KT5FXz9EXygoSF8obikqKG89Rl8ocikpKkhfKGUpLUhfKHIpKihpPUZfKG4pKSpIXyh0KSkvKGkqbyp1KSk6KG4rcikvMn1mdW5jdGlvbiBXaSh0LG4sZSxyKXt2YXIgaTtpZihudWxsPT10KWk9ZSp6XyxyLnBvaW50KC1DXyxpKSxyLnBvaW50KDAsaSksci5wb2ludChDXyxpKSxyLnBvaW50KENfLDApLHIucG9pbnQoQ18sLWkpLHIucG9pbnQoMCwtaSksci5wb2ludCgtQ18sLWkpLHIucG9pbnQoLUNfLDApLHIucG9pbnQoLUNfLGkpO2Vsc2UgaWYoVV8odFswXS1uWzBdKT5FXyl7dmFyIG89dFswXTxuWzBdP0NfOi1DXztpPWUqby8yLHIucG9pbnQoLW8saSksci5wb2ludCgwLGkpLHIucG9pbnQobyxpKX1lbHNlIHIucG9pbnQoblswXSxuWzFdKX1mdW5jdGlvbiAkaSh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bmV3IFppO2Zvcih2YXIgciBpbiB0KWVbcl09dFtyXTtyZXR1cm4gZS5zdHJlYW09bixlfX1mdW5jdGlvbiBaaSgpe31mdW5jdGlvbiBHaSh0LG4sZSl7dmFyIHI9blsxXVswXS1uWzBdWzBdLGk9blsxXVsxXS1uWzBdWzFdLG89dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTt0LnNjYWxlKDE1MCkudHJhbnNsYXRlKFswLDBdKSxudWxsIT1vJiZ0LmNsaXBFeHRlbnQobnVsbCksR18oZSx0LnN0cmVhbSgkZykpO3ZhciB1PSRnLnJlc3VsdCgpLGE9TWF0aC5taW4oci8odVsxXVswXS11WzBdWzBdKSxpLyh1WzFdWzFdLXVbMF1bMV0pKSxjPStuWzBdWzBdKyhyLWEqKHVbMV1bMF0rdVswXVswXSkpLzIscz0rblswXVsxXSsoaS1hKih1WzFdWzFdK3VbMF1bMV0pKS8yO3JldHVybiBudWxsIT1vJiZ0LmNsaXBFeHRlbnQobyksdC5zY2FsZSgxNTAqYSkudHJhbnNsYXRlKFtjLHNdKX1mdW5jdGlvbiBKaSh0LG4sZSl7cmV0dXJuIEdpKHQsW1swLDBdLG5dLGUpfWZ1bmN0aW9uIFFpKHQpe3JldHVybiAkaSh7cG9pbnQ6ZnVuY3Rpb24obixlKXtuPXQobixlKSx0aGlzLnN0cmVhbS5wb2ludChuWzBdLG5bMV0pfX0pfWZ1bmN0aW9uIEtpKHQsbil7ZnVuY3Rpb24gZShyLGksbyx1LGEsYyxzLGYsbCxoLHAsZCx2LF8pe3ZhciBnPXMtcix5PWYtaSxtPWcqZyt5Knk7aWYobT40Km4mJnYtLSl7dmFyIHg9dStoLGI9YStwLHc9YytkLE09Vl8oeCp4K2IqYit3KncpLFQ9Z3Iody89TSksaz1VXyhVXyh3KS0xKTxFX3x8VV8oby1sKTxFXz8obytsKS8yOk9fKGIseCksUz10KGssVCksTj1TWzBdLEU9U1sxXSxBPU4tcixDPUUtaSx6PXkqQS1nKkM7KHoqei9tPm58fFVfKChnKkEreSpDKS9tLS41KT4uM3x8dSpoK2EqcCtjKmQ8eXkpJiYoZShyLGksbyx1LGEsYyxOLEUsayx4Lz1NLGIvPU0sdyx2LF8pLF8ucG9pbnQoTixFKSxlKE4sRSxrLHgsYix3LHMsZixsLGgscCxkLHYsXykpfX1yZXR1cm4gZnVuY3Rpb24obil7ZnVuY3Rpb24gcihlLHIpe2U9dChlLHIpLG4ucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiBpKCl7Zz1OYU4sdy5wb2ludD1vLG4ubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbyhyLGkpe3ZhciBvPUVyKFtyLGldKSx1PXQocixpKTtlKGcseSxfLG0seCxiLGc9dVswXSx5PXVbMV0sXz1yLG09b1swXSx4PW9bMV0sYj1vWzJdLGd5LG4pLG4ucG9pbnQoZyx5KX1mdW5jdGlvbiB1KCl7dy5wb2ludD1yLG4ubGluZUVuZCgpfWZ1bmN0aW9uIGEoKXtpKCksdy5wb2ludD1jLHcubGluZUVuZD1zfWZ1bmN0aW9uIGModCxuKXtvKGY9dCxuKSxsPWcsaD15LHA9bSxkPXgsdj1iLHcucG9pbnQ9b31mdW5jdGlvbiBzKCl7ZShnLHksXyxtLHgsYixsLGgsZixwLGQsdixneSxuKSx3LmxpbmVFbmQ9dSx1KCl9dmFyIGYsbCxoLHAsZCx2LF8sZyx5LG0seCxiLHc9e3BvaW50OnIsbGluZVN0YXJ0OmksbGluZUVuZDp1LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksdy5saW5lU3RhcnQ9YX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLHcubGluZVN0YXJ0PWl9fTtyZXR1cm4gd319ZnVuY3Rpb24gdG8odCl7cmV0dXJuIG5vKGZ1bmN0aW9uKCl7cmV0dXJuIHR9KSgpfWZ1bmN0aW9uIG5vKHQpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIHQ9Zih0WzBdKnFfLHRbMV0qcV8pLFt0WzBdKl8rYSxjLXRbMV0qX119ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdD1mLmludmVydCgodFswXS1hKS9fLChjLXRbMV0pL18pLHQmJlt0WzBdKkxfLHRbMV0qTF9dfWZ1bmN0aW9uIHIodCxuKXtyZXR1cm4gdD11KHQsbiksW3RbMF0qXythLGMtdFsxXSpfXX1mdW5jdGlvbiBpKCl7Zj1hZyhzPW5pKGIsdyxNKSx1KTt2YXIgdD11KG0seCk7cmV0dXJuIGE9Zy10WzBdKl8sYz15K3RbMV0qXyxvKCl9ZnVuY3Rpb24gbygpe3JldHVybiBkPXY9bnVsbCxufXZhciB1LGEsYyxzLGYsbCxoLHAsZCx2LF89MTUwLGc9NDgwLHk9MjUwLG09MCx4PTAsYj0wLHc9MCxNPTAsVD1udWxsLGs9ZHksUz1udWxsLE49SWcsRT0uNSxBPW15KHIsRSk7cmV0dXJuIG4uc3RyZWFtPWZ1bmN0aW9uKHQpe3JldHVybiBkJiZ2PT09dD9kOmQ9eHkoayhzLEEoTih2PXQpKSkpfSxuLmNsaXBBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz0rdD92eShUPXQqcV8sNipxXyk6KFQ9bnVsbCxkeSksbygpKTpUKkxffSxuLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE49bnVsbD09dD8oUz1sPWg9cD1udWxsLElnKTpzaShTPSt0WzBdWzBdLGw9K3RbMF1bMV0saD0rdFsxXVswXSxwPSt0WzFdWzFdKSxvKCkpOm51bGw9PVM/bnVsbDpbW1MsbF0sW2gscF1dfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPSt0LGkoKSk6X30sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9K3RbMF0seT0rdFsxXSxpKCkpOltnLHldfSxuLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT10WzBdJTM2MCpxXyx4PXRbMV0lMzYwKnFfLGkoKSk6W20qTF8seCpMX119LG4ucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPXRbMF0lMzYwKnFfLHc9dFsxXSUzNjAqcV8sTT10Lmxlbmd0aD4yP3RbMl0lMzYwKnFfOjAsaSgpKTpbYipMXyx3KkxfLE0qTF9dfSxuLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT1teShyLEU9dCp0KSxvKCkpOlZfKEUpfSxuLmZpdEV4dGVudD1mdW5jdGlvbih0LGUpe3JldHVybiBHaShuLHQsZSl9LG4uZml0U2l6ZT1mdW5jdGlvbih0LGUpe3JldHVybiBKaShuLHQsZSl9LGZ1bmN0aW9uKCl7cmV0dXJuIHU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksbi5pbnZlcnQ9dS5pbnZlcnQmJmUsaSgpfX1mdW5jdGlvbiBlbyh0KXt2YXIgbj0wLGU9Q18vMyxyPW5vKHQpLGk9cihuLGUpO3JldHVybiBpLnBhcmFsbGVscz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9yKG49dFswXSpxXyxlPXRbMV0qcV8pOltuKkxfLGUqTF9dfSxpfWZ1bmN0aW9uIHJvKHQpe2Z1bmN0aW9uIG4odCxuKXtyZXR1cm5bdCplLEhfKG4pL2VdfXZhciBlPUZfKHQpO3JldHVybiBuLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblt0L2UsZ3IobiplKV19LG59ZnVuY3Rpb24gaW8odCxuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9Vl8oby0yKmkqSF8obikpL2k7cmV0dXJuW2UqSF8odCo9aSksdS1lKkZfKHQpXX12YXIgcj1IXyh0KSxpPShyK0hfKG4pKS8yO2lmKFVfKGkpPEVfKXJldHVybiBybyh0KTt2YXIgbz0xK3IqKDIqaS1yKSx1PVZfKG8pL2k7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9dS1uO3JldHVybltPXyh0LFVfKGUpKS9pKlhfKGUpLGdyKChvLSh0KnQrZSplKSppKmkpLygyKmkpKV19LGV9ZnVuY3Rpb24gb28odCl7dmFyIG49dC5sZW5ndGg7cmV0dXJue3BvaW50OmZ1bmN0aW9uKGUscil7Zm9yKHZhciBpPS0xOysraTxuOyl0W2ldLnBvaW50KGUscil9LHNwaGVyZTpmdW5jdGlvbigpe2Zvcih2YXIgZT0tMTsrK2U8bjspdFtlXS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLnBvbHlnb25FbmQoKX19fWZ1bmN0aW9uIHVvKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPUZfKG4pLGk9Rl8oZSksbz10KHIqaSk7cmV0dXJuW28qaSpIXyhuKSxvKkhfKGUpXX19ZnVuY3Rpb24gYW8odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9Vl8obipuK2UqZSksaT10KHIpLG89SF8oaSk7cmV0dXJuW09fKG4qbyxyKkZfKGkpKSxncihyJiZlKm8vcildfX1mdW5jdGlvbiBjbyh0LG4pe3JldHVyblt0LEJfKFdfKCh6XytuKS8yKSldfWZ1bmN0aW9uIHNvKHQpe3ZhciBuLGU9dG8odCkscj1lLnNjYWxlLGk9ZS50cmFuc2xhdGUsbz1lLmNsaXBFeHRlbnQ7cmV0dXJuIGUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHIodCksbiYmZS5jbGlwRXh0ZW50KG51bGwpLGUpOnIoKX0sZS50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkodCksbiYmZS5jbGlwRXh0ZW50KG51bGwpLGUpOmkoKX0sZS5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBuP251bGw6bygpO2lmKG49bnVsbD09dCl7dmFyIHU9Q18qcigpLGE9aSgpO3Q9W1thWzBdLXUsYVsxXS11XSxbYVswXSt1LGFbMV0rdV1dfXJldHVybiBvKHQpLGV9LGUuY2xpcEV4dGVudChudWxsKX1mdW5jdGlvbiBmbyh0KXtyZXR1cm4gV18oKHpfK3QpLzIpfWZ1bmN0aW9uIGxvKHQsbil7ZnVuY3Rpb24gZSh0LG4pe28+MD9uPC16XytFXyYmKG49LXpfK0VfKTpuPnpfLUVfJiYobj16Xy1FXyk7dmFyIGU9by9qXyhmbyhuKSxpKTtyZXR1cm5bZSpIXyhpKnQpLG8tZSpGXyhpKnQpXX12YXIgcj1GXyh0KSxpPXQ9PT1uP0hfKHQpOkJfKHIvRl8obikpL0JfKGZvKG4pL2ZvKHQpKSxvPXIqal8oZm8odCksaSkvaTtyZXR1cm4gaT8oZS5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1vLW4scj1YXyhpKSpWXyh0KnQrZSplKTtyZXR1cm5bT18odCxVXyhlKSkvaSpYXyhlKSwyKkRfKGpfKG8vciwxL2kpKS16X119LGUpOmNvfWZ1bmN0aW9uIGhvKHQsbil7cmV0dXJuW3Qsbl19ZnVuY3Rpb24gcG8odCxuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9by1uLHI9aSp0O3JldHVybltlKkhfKHIpLG8tZSpGXyhyKV19dmFyIHI9Rl8odCksaT10PT09bj9IXyh0KTooci1GXyhuKSkvKG4tdCksbz1yL2krdDtyZXR1cm4gVV8oaSk8RV8/aG86KGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9by1uO3JldHVybltPXyh0LFVfKGUpKS9pKlhfKGUpLG8tWF8oaSkqVl8odCp0K2UqZSldfSxlKX1mdW5jdGlvbiB2byh0LG4pe3ZhciBlPUZfKG4pLHI9Rl8odCkqZTtyZXR1cm5bZSpIXyh0KS9yLEhfKG4pL3JdfWZ1bmN0aW9uIF9vKHQsbixlLHIpe3JldHVybiAxPT09dCYmMT09PW4mJjA9PT1lJiYwPT09cj9JZzokaSh7cG9pbnQ6ZnVuY3Rpb24oaSxvKXt0aGlzLnN0cmVhbS5wb2ludChpKnQrZSxvKm4rcil9fSl9ZnVuY3Rpb24gZ28odCxuKXtyZXR1cm5bRl8obikqSF8odCksSF8obildfWZ1bmN0aW9uIHlvKHQsbil7dmFyIGU9Rl8obikscj0xK0ZfKHQpKmU7cmV0dXJuW2UqSF8odCkvcixIXyhuKS9yXX1mdW5jdGlvbiBtbyh0LG4pe3JldHVybltCXyhXXygoel8rbikvMikpLC10XX1mdW5jdGlvbiB4byh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBibyh0KXtyZXR1cm4gdC5yZWR1Y2Uod28sMCkvdC5sZW5ndGh9ZnVuY3Rpb24gd28odCxuKXtyZXR1cm4gdCtuLnh9ZnVuY3Rpb24gTW8odCl7cmV0dXJuIDErdC5yZWR1Y2UoVG8sMCl9ZnVuY3Rpb24gVG8odCxuKXtyZXR1cm4gTWF0aC5tYXgodCxuLnkpfWZ1bmN0aW9uIGtvKHQpe2Zvcih2YXIgbjtuPXQuY2hpbGRyZW47KXQ9blswXTtyZXR1cm4gdH1mdW5jdGlvbiBTbyh0KXtmb3IodmFyIG47bj10LmNoaWxkcmVuOyl0PW5bbi5sZW5ndGgtMV07cmV0dXJuIHR9ZnVuY3Rpb24gTm8odCl7dmFyIG49MCxlPXQuY2hpbGRyZW4scj1lJiZlLmxlbmd0aDtpZihyKWZvcig7LS1yPj0wOyluKz1lW3JdLnZhbHVlO2Vsc2Ugbj0xO3QudmFsdWU9bn1mdW5jdGlvbiBFbyh0LG4pe2lmKHQ9PT1uKXJldHVybiB0O3ZhciBlPXQuYW5jZXN0b3JzKCkscj1uLmFuY2VzdG9ycygpLGk9bnVsbDtmb3IodD1lLnBvcCgpLG49ci5wb3AoKTt0PT09bjspaT10LHQ9ZS5wb3AoKSxuPXIucG9wKCk7cmV0dXJuIGl9ZnVuY3Rpb24gQW8odCxuKXt2YXIgZSxyLGksbyx1LGE9bmV3IExvKHQpLGM9K3QudmFsdWUmJihhLnZhbHVlPXQudmFsdWUpLHM9W2FdO2ZvcihudWxsPT1uJiYobj16byk7ZT1zLnBvcCgpOylpZihjJiYoZS52YWx1ZT0rZS5kYXRhLnZhbHVlKSwoaT1uKGUuZGF0YSkpJiYodT1pLmxlbmd0aCkpZm9yKGUuY2hpbGRyZW49bmV3IEFycmF5KHUpLG89dS0xO28+PTA7LS1vKXMucHVzaChyPWUuY2hpbGRyZW5bb109bmV3IExvKGlbb10pKSxyLnBhcmVudD1lLHIuZGVwdGg9ZS5kZXB0aCsxO3JldHVybiBhLmVhY2hCZWZvcmUoUm8pfWZ1bmN0aW9uIENvKCl7cmV0dXJuIEFvKHRoaXMpLmVhY2hCZWZvcmUoUG8pfWZ1bmN0aW9uIHpvKHQpe3JldHVybiB0LmNoaWxkcmVufWZ1bmN0aW9uIFBvKHQpe3QuZGF0YT10LmRhdGEuZGF0YX1mdW5jdGlvbiBSbyh0KXt2YXIgbj0wO2RvIHQuaGVpZ2h0PW47d2hpbGUoKHQ9dC5wYXJlbnQpJiZ0LmhlaWdodDwrK24pfWZ1bmN0aW9uIExvKHQpe3RoaXMuZGF0YT10LHRoaXMuZGVwdGg9dGhpcy5oZWlnaHQ9MCx0aGlzLnBhcmVudD1udWxsfWZ1bmN0aW9uIHFvKHQpe3RoaXMuXz10LHRoaXMubmV4dD1udWxsfWZ1bmN0aW9uIFVvKHQsbil7dmFyIGU9bi54LXQueCxyPW4ueS10LnksaT10LnItbi5yO3JldHVybiBpKmkrMWUtNj5lKmUrcipyfWZ1bmN0aW9uIERvKHQsbil7dmFyIGUscixpLG89bnVsbCx1PXQuaGVhZDtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMTplPU9vKG5bMF0pO2JyZWFrO2Nhc2UgMjplPUZvKG5bMF0sblsxXSk7YnJlYWs7Y2FzZSAzOmU9SW8oblswXSxuWzFdLG5bMl0pfWZvcig7dTspaT11Ll8scj11Lm5leHQsZSYmVW8oZSxpKT9vPXU6KG8/KHQudGFpbD1vLG8ubmV4dD1udWxsKTp0LmhlYWQ9dC50YWlsPW51bGwsbi5wdXNoKGkpLGU9RG8odCxuKSxuLnBvcCgpLHQuaGVhZD8odS5uZXh0PXQuaGVhZCx0LmhlYWQ9dSk6KHUubmV4dD1udWxsLHQuaGVhZD10LnRhaWw9dSksbz10LnRhaWwsby5uZXh0PXIpLHU9cjtyZXR1cm4gdC50YWlsPW8sZX1mdW5jdGlvbiBPbyh0KXtyZXR1cm57eDp0LngseTp0Lnkscjp0LnJ9fWZ1bmN0aW9uIEZvKHQsbil7dmFyIGU9dC54LHI9dC55LGk9dC5yLG89bi54LHU9bi55LGE9bi5yLGM9by1lLHM9dS1yLGY9YS1pLGw9TWF0aC5zcXJ0KGMqYytzKnMpO3JldHVybnt4OihlK28rYy9sKmYpLzIseToocit1K3MvbCpmKS8yLHI6KGwraSthKS8yfX1mdW5jdGlvbiBJbyh0LG4sZSl7dmFyIHI9dC54LGk9dC55LG89dC5yLHU9bi54LGE9bi55LGM9bi5yLHM9ZS54LGY9ZS55LGw9ZS5yLGg9Miooci11KSxwPTIqKGktYSksZD0yKihjLW8pLHY9cipyK2kqaS1vKm8tdSp1LWEqYStjKmMsXz0yKihyLXMpLGc9MiooaS1mKSx5PTIqKGwtbyksbT1yKnIraSppLW8qby1zKnMtZipmK2wqbCx4PV8qcC1oKmcsYj0ocCptLWcqdikveC1yLHc9KGcqZC1wKnkpL3gsTT0oXyp2LWgqbSkveC1pLFQ9KGgqeS1fKmQpL3gsaz13KncrVCpULTEsUz0yKihiKncrTSpUK28pLE49YipiK00qTS1vKm8sRT0oLVMtTWF0aC5zcXJ0KFMqUy00KmsqTikpLygyKmspO3JldHVybnt4OmIrdypFK3IseTpNK1QqRStpLHI6RX19ZnVuY3Rpb24gWW8odCxuLGUpe3ZhciByPXQueCxpPXQueSxvPW4ucitlLnIsdT10LnIrZS5yLGE9bi54LXIsYz1uLnktaSxzPWEqYStjKmM7aWYocyl7dmFyIGY9LjUrKCh1Kj11KS0obyo9bykpLygyKnMpLGw9TWF0aC5zcXJ0KE1hdGgubWF4KDAsMipvKih1K3MpLSh1LT1zKSp1LW8qbykpLygyKnMpO2UueD1yK2YqYStsKmMsZS55PWkrZipjLWwqYX1lbHNlIGUueD1yK3UsZS55PWl9ZnVuY3Rpb24gQm8odCxuKXt2YXIgZT1uLngtdC54LHI9bi55LXQueSxpPXQucituLnI7cmV0dXJuIGkqaS0xZS02PmUqZStyKnJ9ZnVuY3Rpb24gam8odCxuKXtmb3IodmFyIGU9dC5fLnI7dCE9PW47KWUrPTIqKHQ9dC5uZXh0KS5fLnI7cmV0dXJuIGUtbi5fLnJ9ZnVuY3Rpb24gSG8odCxuLGUpe3ZhciByPXQuXyxpPXQubmV4dC5fLG89ci5yK2kucix1PShyLngqaS5yK2kueCpyLnIpL28tbixhPShyLnkqaS5yK2kueSpyLnIpL28tZTtyZXR1cm4gdSp1K2EqYX1mdW5jdGlvbiBYbyh0KXt0aGlzLl89dCx0aGlzLm5leHQ9bnVsbCx0aGlzLnByZXZpb3VzPW51bGx9ZnVuY3Rpb24gVm8odCl7aWYoIShpPXQubGVuZ3RoKSlyZXR1cm4gMDt2YXIgbixlLHIsaTtpZihuPXRbMF0sbi54PTAsbi55PTAsIShpPjEpKXJldHVybiBuLnI7aWYoZT10WzFdLG4ueD0tZS5yLGUueD1uLnIsZS55PTAsIShpPjIpKXJldHVybiBuLnIrZS5yO1lvKGUsbixyPXRbMl0pO3ZhciBvLHUsYSxjLHMsZixsLGg9bi5yKm4ucixwPWUuciplLnIsZD1yLnIqci5yLHY9aCtwK2QsXz1oKm4ueCtwKmUueCtkKnIueCxnPWgqbi55K3AqZS55K2Qqci55O249bmV3IFhvKG4pLGU9bmV3IFhvKGUpLHI9bmV3IFhvKHIpLG4ubmV4dD1yLnByZXZpb3VzPWUsZS5uZXh0PW4ucHJldmlvdXM9cixyLm5leHQ9ZS5wcmV2aW91cz1uO3Q6Zm9yKGE9MzthPGk7KythKXtZbyhuLl8sZS5fLHI9dFthXSkscj1uZXcgWG8ociksYz1lLm5leHQscz1uLnByZXZpb3VzLGY9ZS5fLnIsbD1uLl8ucjtkbyBpZihmPD1sKXtpZihCbyhjLl8sci5fKSl7ZituLl8ucitlLl8ucj5qbyhjLGUpP249YzplPWMsbi5uZXh0PWUsZS5wcmV2aW91cz1uLC0tYTtjb250aW51ZSB0fWYrPWMuXy5yLGM9Yy5uZXh0fWVsc2V7aWYoQm8ocy5fLHIuXykpe2pvKG4scyk+bCtuLl8ucitlLl8ucj9uPXM6ZT1zLG4ubmV4dD1lLGUucHJldmlvdXM9biwtLWE7Y29udGludWUgdH1sKz1zLl8ucixzPXMucHJldmlvdXN9d2hpbGUoYyE9PXMubmV4dCk7Zm9yKHIucHJldmlvdXM9bixyLm5leHQ9ZSxuLm5leHQ9ZS5wcmV2aW91cz1lPXIsdis9ZD1yLl8ucipyLl8ucixfKz1kKnIuXy54LGcrPWQqci5fLnksaD1IbyhuLG89Xy92LHU9Zy92KTsocj1yLm5leHQpIT09ZTspKGQ9SG8ocixvLHUpKTxoJiYobj1yLGg9ZCk7ZT1uLm5leHR9Zm9yKG49W2UuX10scj1lOyhyPXIubmV4dCkhPT1lOyluLnB1c2goci5fKTtmb3Iocj1HeShuKSxhPTA7YTxpOysrYSluPXRbYV0sbi54LT1yLngsbi55LT1yLnk7cmV0dXJuIHIucn1mdW5jdGlvbiBXbyh0KXtyZXR1cm4gbnVsbD09dD9udWxsOiRvKHQpfWZ1bmN0aW9uICRvKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdH1mdW5jdGlvbiBabygpe3JldHVybiAwfWZ1bmN0aW9uIEdvKHQpe3JldHVybiBNYXRoLnNxcnQodC52YWx1ZSl9ZnVuY3Rpb24gSm8odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe24uY2hpbGRyZW58fChuLnI9TWF0aC5tYXgoMCwrdChuKXx8MCkpfX1mdW5jdGlvbiBRbyh0LG4pe3JldHVybiBmdW5jdGlvbihlKXtpZihyPWUuY2hpbGRyZW4pe3ZhciByLGksbyx1PXIubGVuZ3RoLGE9dChlKSpufHwwO2lmKGEpZm9yKGk9MDtpPHU7KytpKXJbaV0ucis9YTtpZihvPVZvKHIpLGEpZm9yKGk9MDtpPHU7KytpKXJbaV0uci09YTtlLnI9bythfX19ZnVuY3Rpb24gS28odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlPW4ucGFyZW50O24ucio9dCxlJiYobi54PWUueCt0Km4ueCxuLnk9ZS55K3Qqbi55KX19ZnVuY3Rpb24gdHUodCl7cmV0dXJuIHQuaWR9ZnVuY3Rpb24gbnUodCl7cmV0dXJuIHQucGFyZW50SWR9ZnVuY3Rpb24gZXUodCxuKXtyZXR1cm4gdC5wYXJlbnQ9PT1uLnBhcmVudD8xOjJ9ZnVuY3Rpb24gcnUodCl7dmFyIG49dC5jaGlsZHJlbjtyZXR1cm4gbj9uWzBdOnQudH1mdW5jdGlvbiBpdSh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bbi5sZW5ndGgtMV06dC50fWZ1bmN0aW9uIG91KHQsbixlKXt2YXIgcj1lLyhuLmktdC5pKTtuLmMtPXIsbi5zKz1lLHQuYys9cixuLnorPWUsbi5tKz1lfWZ1bmN0aW9uIHV1KHQpe2Zvcih2YXIgbixlPTAscj0wLGk9dC5jaGlsZHJlbixvPWkubGVuZ3RoOy0tbz49MDspbj1pW29dLG4ueis9ZSxuLm0rPWUsZSs9bi5zKyhyKz1uLmMpfWZ1bmN0aW9uIGF1KHQsbixlKXtyZXR1cm4gdC5hLnBhcmVudD09PW4ucGFyZW50P3QuYTplfWZ1bmN0aW9uIGN1KHQsbil7dGhpcy5fPXQsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPW51bGwsdGhpcy5BPW51bGwsdGhpcy5hPXRoaXMsdGhpcy56PTAsdGhpcy5tPTAsdGhpcy5jPTAsdGhpcy5zPTAsdGhpcy50PW51bGwsdGhpcy5pPW59ZnVuY3Rpb24gc3UodCl7Zm9yKHZhciBuLGUscixpLG8sdT1uZXcgY3UodCwwKSxhPVt1XTtuPWEucG9wKCk7KWlmKHI9bi5fLmNoaWxkcmVuKWZvcihuLmNoaWxkcmVuPW5ldyBBcnJheShvPXIubGVuZ3RoKSxpPW8tMTtpPj0wOy0taSlhLnB1c2goZT1uLmNoaWxkcmVuW2ldPW5ldyBjdShyW2ldLGkpKSxlLnBhcmVudD1uO3JldHVybih1LnBhcmVudD1uZXcgY3UobnVsbCwwKSkuY2hpbGRyZW49W3VdLHV9ZnVuY3Rpb24gZnUodCxuLGUscixpLG8pe2Zvcih2YXIgdSxhLGMscyxmLGwsaCxwLGQsdixfLGc9W10seT1uLmNoaWxkcmVuLG09MCx4PTAsYj15Lmxlbmd0aCx3PW4udmFsdWU7bTxiOyl7Yz1pLWUscz1vLXI7ZG8gZj15W3grK10udmFsdWU7d2hpbGUoIWYmJng8Yik7Zm9yKGw9aD1mLHY9TWF0aC5tYXgocy9jLGMvcykvKHcqdCksXz1mKmYqdixkPU1hdGgubWF4KGgvXyxfL2wpO3g8YjsrK3gpe2lmKGYrPWE9eVt4XS52YWx1ZSxhPGwmJihsPWEpLGE+aCYmKGg9YSksXz1mKmYqdixwPU1hdGgubWF4KGgvXyxfL2wpLHA+ZCl7Zi09YTticmVha31kPXB9Zy5wdXNoKHU9e3ZhbHVlOmYsZGljZTpjPHMsY2hpbGRyZW46eS5zbGljZShtLHgpfSksdS5kaWNlP25tKHUsZSxyLGksdz9yKz1zKmYvdzpvKTpjbSh1LGUscix3P2UrPWMqZi93Omksbyksdy09ZixtPXh9cmV0dXJuIGd9ZnVuY3Rpb24gbHUodCxuKXtyZXR1cm4gdFswXS1uWzBdfHx0WzFdLW5bMV19ZnVuY3Rpb24gaHUodCl7Zm9yKHZhciBuPXQubGVuZ3RoLGU9WzAsMV0scj0yLGk9MjtpPG47KytpKXtmb3IoO3I+MSYmZ20odFtlW3ItMl1dLHRbZVtyLTFdXSx0W2ldKTw9MDspLS1yO2VbcisrXT1pfXJldHVybiBlLnNsaWNlKDAscil9ZnVuY3Rpb24gcHUodCl7aWYoISh0Pj0xKSl0aHJvdyBuZXcgRXJyb3I7dGhpcy5fc2l6ZT10LHRoaXMuX2NhbGw9dGhpcy5fZXJyb3I9bnVsbCx0aGlzLl90YXNrcz1bXSx0aGlzLl9kYXRhPVtdLHRoaXMuX3dhaXRpbmc9dGhpcy5fYWN0aXZlPXRoaXMuX2VuZGVkPXRoaXMuX3N0YXJ0PTB9ZnVuY3Rpb24gZHUodCl7aWYoIXQuX3N0YXJ0KXRyeXt2dSh0KX1jYXRjaChuKXtpZih0Ll90YXNrc1t0Ll9lbmRlZCt0Ll9hY3RpdmUtMV0pZ3UodCxuKTtlbHNlIGlmKCF0Ll9kYXRhKXRocm93IG59fWZ1bmN0aW9uIHZ1KHQpe2Zvcig7dC5fc3RhcnQ9dC5fd2FpdGluZyYmdC5fYWN0aXZlPHQuX3NpemU7KXt2YXIgbj10Ll9lbmRlZCt0Ll9hY3RpdmUsZT10Ll90YXNrc1tuXSxyPWUubGVuZ3RoLTEsaT1lW3JdO2Vbcl09X3UodCxuKSwtLXQuX3dhaXRpbmcsKyt0Ll9hY3RpdmUsZT1pLmFwcGx5KG51bGwsZSksdC5fdGFza3Nbbl0mJih0Ll90YXNrc1tuXT1lfHx3bSl9fWZ1bmN0aW9uIF91KHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUscil7dC5fdGFza3Nbbl0mJigtLXQuX2FjdGl2ZSwrK3QuX2VuZGVkLHQuX3Rhc2tzW25dPW51bGwsbnVsbD09dC5fZXJyb3ImJihudWxsIT1lP2d1KHQsZSk6KHQuX2RhdGFbbl09cix0Ll93YWl0aW5nP2R1KHQpOnl1KHQpKSkpfX1mdW5jdGlvbiBndSh0LG4pe3ZhciBlLHI9dC5fdGFza3MubGVuZ3RoO2Zvcih0Ll9lcnJvcj1uLHQuX2RhdGE9dm9pZCAwLHQuX3dhaXRpbmc9TmFOOy0tcj49MDspaWYoKGU9dC5fdGFza3Nbcl0pJiYodC5fdGFza3Nbcl09bnVsbCxlLmFib3J0KSl0cnl7ZS5hYm9ydCgpfWNhdGNoKHQpe310Ll9hY3RpdmU9TmFOLHl1KHQpfWZ1bmN0aW9uIHl1KHQpe2lmKCF0Ll9hY3RpdmUmJnQuX2NhbGwpe3ZhciBuPXQuX2RhdGE7dC5fZGF0YT12b2lkIDAsdC5fY2FsbCh0Ll9lcnJvcixuKX19ZnVuY3Rpb24gbXUodCl7cmV0dXJuIG5ldyBwdShhcmd1bWVudHMubGVuZ3RoPyt0OjEvMCl9ZnVuY3Rpb24geHUodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dChudWxsPT1uP2U6bnVsbCl9fWZ1bmN0aW9uIGJ1KHQpe3ZhciBuPXQucmVzcG9uc2VUeXBlO3JldHVybiBuJiYidGV4dCIhPT1uP3QucmVzcG9uc2U6dC5yZXNwb25zZVRleHR9ZnVuY3Rpb24gd3UodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZS5yZXNwb25zZVRleHQsbil9fWZ1bmN0aW9uIE11KHQpe2Z1bmN0aW9uIG4obil7dmFyIG89bisiIix1PWUuZ2V0KG8pO2lmKCF1KXtpZihpIT09WW0pcmV0dXJuIGk7ZS5zZXQobyx1PXIucHVzaChuKSl9cmV0dXJuIHRbKHUtMSkldC5sZW5ndGhdfXZhciBlPVllKCkscj1bXSxpPVltO3JldHVybiB0PW51bGw9PXQ/W106SW0uY2FsbCh0KSxuLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gci5zbGljZSgpO3I9W10sZT1ZZSgpO2Zvcih2YXIgaSxvLHU9LTEsYT10Lmxlbmd0aDsrK3U8YTspZS5oYXMobz0oaT10W3VdKSsiIil8fGUuc2V0KG8sci5wdXNoKGkpKTtyZXR1cm4gbn0sbi5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1JbS5jYWxsKGUpLG4pOnQuc2xpY2UoKX0sbi51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIE11KCkuZG9tYWluKHIpLnJhbmdlKHQpLnVua25vd24oaSl9LG59ZnVuY3Rpb24gVHUoKXtmdW5jdGlvbiB0KCl7dmFyIHQ9aSgpLmxlbmd0aCxyPXVbMV08dVswXSxsPXVbci0wXSxoPXVbMS1yXTtuPShoLWwpL01hdGgubWF4KDEsdC1jKzIqcyksYSYmKG49TWF0aC5mbG9vcihuKSksbCs9KGgtbC1uKih0LWMpKSpmLGU9biooMS1jKSxhJiYobD1NYXRoLnJvdW5kKGwpLGU9TWF0aC5yb3VuZChlKSk7dmFyIHA9UXModCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBsK24qdH0pO3JldHVybiBvKHI/cC5yZXZlcnNlKCk6cCl9dmFyIG4sZSxyPU11KCkudW5rbm93bih2b2lkIDApLGk9ci5kb21haW4sbz1yLnJhbmdlLHU9WzAsMV0sYT0hMSxjPTAscz0wLGY9LjU7cmV0dXJuIGRlbGV0ZSByLnVua25vd24sci5kb21haW49ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkobiksdCgpKTppKCl9LHIucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9WytuWzBdLCtuWzFdXSx0KCkpOnUuc2xpY2UoKX0sci5yYW5nZVJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiB1PVsrblswXSwrblsxXV0sYT0hMCx0KCl9LHIuYmFuZHdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHIuc3RlcD1mdW5jdGlvbigpe3JldHVybiBufSxyLnJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSEhbix0KCkpOmF9LHIucGFkZGluZz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1zPU1hdGgubWF4KDAsTWF0aC5taW4oMSxuKSksdCgpKTpjfSxyLnBhZGRpbmdJbm5lcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1NYXRoLm1heCgwLE1hdGgubWluKDEsbikpLHQoKSk6Y30sci5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9TWF0aC5tYXgoMCxNYXRoLm1pbigxLG4pKSx0KCkpOnN9LHIuYWxpZ249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9TWF0aC5tYXgoMCxNYXRoLm1pbigxLG4pKSx0KCkpOmZ9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBUdSgpLmRvbWFpbihpKCkpLnJhbmdlKHUpLnJvdW5kKGEpLnBhZGRpbmdJbm5lcihjKS5wYWRkaW5nT3V0ZXIocykuYWxpZ24oZil9LHQoKX1mdW5jdGlvbiBrdSh0KXt2YXIgbj10LmNvcHk7cmV0dXJuIHQucGFkZGluZz10LnBhZGRpbmdPdXRlcixkZWxldGUgdC5wYWRkaW5nSW5uZXIsZGVsZXRlIHQucGFkZGluZ091dGVyLHQuY29weT1mdW5jdGlvbigpe3JldHVybiBrdShuKCkpfSx0fWZ1bmN0aW9uIFN1KCl7cmV0dXJuIGt1KFR1KCkucGFkZGluZ0lubmVyKDEpKX1mdW5jdGlvbiBOdSh0LG4pe3JldHVybihuLT10PSt0KT9mdW5jdGlvbihlKXtyZXR1cm4oZS10KS9ufTpCbShuKX1mdW5jdGlvbiBFdSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KG49K24sZT0rZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0PD1uPzA6dD49ZT8xOnIodCl9fX1mdW5jdGlvbiBBdSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KG49K24sZT0rZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0PD0wP246dD49MT9lOnIodCl9fX1mdW5jdGlvbiBDdSh0LG4sZSxyKXt2YXIgaT10WzBdLG89dFsxXSx1PW5bMF0sYT1uWzFdO3JldHVybiBvPGk/KGk9ZShvLGkpLHU9cihhLHUpKTooaT1lKGksbyksdT1yKHUsYSkpLGZ1bmN0aW9uKHQpe3JldHVybiB1KGkodCkpfX1mdW5jdGlvbiB6dSh0LG4sZSxyKXt2YXIgaT1NYXRoLm1pbih0Lmxlbmd0aCxuLmxlbmd0aCktMSxvPW5ldyBBcnJheShpKSx1PW5ldyBBcnJheShpKSxhPS0xO2Zvcih0W2ldPHRbMF0mJih0PXQuc2xpY2UoKS5yZXZlcnNlKCksbj1uLnNsaWNlKCkucmV2ZXJzZSgpKTsrK2E8aTspb1thXT1lKHRbYV0sdFthKzFdKSx1W2FdPXIoblthXSxuW2ErMV0pO3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1Pcyh0LG4sMSxpKS0xO3JldHVybiB1W2VdKG9bZV0obikpfX1mdW5jdGlvbiBQdSh0LG4pe3JldHVybiBuLmRvbWFpbih0LmRvbWFpbigpKS5yYW5nZSh0LnJhbmdlKCkpLmludGVycG9sYXRlKHQuaW50ZXJwb2xhdGUoKSkuY2xhbXAodC5jbGFtcCgpKX1mdW5jdGlvbiBSdSh0LG4pe2Z1bmN0aW9uIGUoKXtyZXR1cm4gaT1NYXRoLm1pbihhLmxlbmd0aCxjLmxlbmd0aCk+Mj96dTpDdSxvPXU9bnVsbCxyfWZ1bmN0aW9uIHIobil7cmV0dXJuKG98fChvPWkoYSxjLGY/RXUodCk6dCxzKSkpKCtuKX12YXIgaSxvLHUsYT1IbSxjPUhtLHM9QWgsZj0hMTtyZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuKHV8fCh1PWkoYyxhLE51LGY/QXUobik6bikpKSgrdCl9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPUZtLmNhbGwodCxqbSksZSgpKTphLnNsaWNlKCl9LHIucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9SW0uY2FsbCh0KSxlKCkpOmMuc2xpY2UoKX0sci5yYW5nZVJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBjPUltLmNhbGwodCkscz1DaCxlKCl9LHIuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ISF0LGUoKSk6Zn0sci5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10LGUoKSk6c30sZSgpfWZ1bmN0aW9uIEx1KHQpe3ZhciBuPXQuZG9tYWluO3JldHVybiB0LnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBlPW4oKTtyZXR1cm4gZWYoZVswXSxlW2UubGVuZ3RoLTFdLG51bGw9PXQ/MTA6dCl9LHQudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiBYbShuKCksdCxlKX0sdC5uaWNlPWZ1bmN0aW9uKGUpe3ZhciBpPW4oKSxvPWkubGVuZ3RoLTEsdT1udWxsPT1lPzEwOmUsYT1pWzBdLGM9aVtvXSxzPXIoYSxjLHUpO3JldHVybiBzJiYocz1yKE1hdGguZmxvb3IoYS9zKSpzLE1hdGguY2VpbChjL3MpKnMsdSksaVswXT1NYXRoLmZsb29yKGEvcykqcyxpW29dPU1hdGguY2VpbChjL3MpKnMsbihpKSksdH0sdH1mdW5jdGlvbiBxdSgpe3ZhciB0PVJ1KE51LFRoKTtyZXR1cm4gdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFB1KHQscXUoKSl9LEx1KHQpfWZ1bmN0aW9uIFV1KCl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4rdH12YXIgbj1bMCwxXTtyZXR1cm4gdC5pbnZlcnQ9dCx0LmRvbWFpbj10LnJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPUZtLmNhbGwoZSxqbSksdCk6bi5zbGljZSgpfSx0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gVXUoKS5kb21haW4obil9LEx1KHQpfWZ1bmN0aW9uIER1KHQsbil7cmV0dXJuKG49TWF0aC5sb2cobi90KSk/ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubG9nKGUvdCkvbn06Qm0obil9ZnVuY3Rpb24gT3UodCxuKXtyZXR1cm4gdDwwP2Z1bmN0aW9uKGUpe3JldHVybi1NYXRoLnBvdygtbixlKSpNYXRoLnBvdygtdCwxLWUpfTpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3cobixlKSpNYXRoLnBvdyh0LDEtZSl9fWZ1bmN0aW9uIEZ1KHQpe3JldHVybiBpc0Zpbml0ZSh0KT8rKCIxZSIrdCk6dDwwPzA6dH1mdW5jdGlvbiBJdSh0KXtyZXR1cm4gMTA9PT10P0Z1OnQ9PT1NYXRoLkU/TWF0aC5leHA6ZnVuY3Rpb24obil7cmV0dXJuIE1hdGgucG93KHQsbil9fWZ1bmN0aW9uIFl1KHQpe3JldHVybiB0PT09TWF0aC5FP01hdGgubG9nOjEwPT09dCYmTWF0aC5sb2cxMHx8Mj09PXQmJk1hdGgubG9nMnx8KHQ9TWF0aC5sb2codCksZnVuY3Rpb24obil7cmV0dXJuIE1hdGgubG9nKG4pL3R9KX1mdW5jdGlvbiBCdSh0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuLXQoLW4pfX1mdW5jdGlvbiBqdSgpe2Z1bmN0aW9uIG4oKXtyZXR1cm4gbz1ZdShpKSx1PUl1KGkpLHIoKVswXTwwJiYobz1CdShvKSx1PUJ1KHUpKSxlfXZhciBlPVJ1KER1LE91KS5kb21haW4oWzEsMTBdKSxyPWUuZG9tYWluLGk9MTAsbz1ZdSgxMCksdT1JdSgxMCk7cmV0dXJuIGUuYmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxuKCkpOml9LGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKHQpLG4oKSk6cigpfSxlLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuLGU9cigpLGE9ZVswXSxjPWVbZS5sZW5ndGgtMV07KG49YzxhKSYmKGg9YSxhPWMsYz1oKTt2YXIgcyxmLGwsaD1vKGEpLHA9byhjKSxkPW51bGw9PXQ/MTA6K3Qsdj1bXTtpZighKGklMSkmJnAtaDxkKXtpZihoPU1hdGgucm91bmQoaCktMSxwPU1hdGgucm91bmQocCkrMSxhPjApe2Zvcig7aDxwOysraClmb3IoZj0xLHM9dShoKTtmPGk7KytmKWlmKGw9cypmLCEobDxhKSl7aWYobD5jKWJyZWFrO3YucHVzaChsKX19ZWxzZSBmb3IoO2g8cDsrK2gpZm9yKGY9aS0xLHM9dShoKTtmPj0xOy0tZilpZihsPXMqZiwhKGw8YSkpe2lmKGw+YylicmVhazt2LnB1c2gobCl9fWVsc2Ugdj1lZihoLHAsTWF0aC5taW4ocC1oLGQpKS5tYXAodSk7cmV0dXJuIG4/di5yZXZlcnNlKCk6dn0sZS50aWNrRm9ybWF0PWZ1bmN0aW9uKG4scil7aWYobnVsbD09ciYmKHI9MTA9PT1pPyIuMGUiOiIsIiksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihyPXQuZm9ybWF0KHIpKSxuPT09MS8wKXJldHVybiByO251bGw9PW4mJihuPTEwKTt2YXIgYT1NYXRoLm1heCgxLGkqbi9lLnRpY2tzKCkubGVuZ3RoKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC91KE1hdGgucm91bmQobyh0KSkpO3JldHVybiBuKmk8aS0uNSYmKG4qPWkpLG48PWE/cih0KToiIn19LGUubmljZT1mdW5jdGlvbigpe3JldHVybiByKFZtKHIoKSx7Zmxvb3I6ZnVuY3Rpb24odCl7cmV0dXJuIHUoTWF0aC5mbG9vcihvKHQpKSl9LGNlaWw6ZnVuY3Rpb24odCl7cmV0dXJuIHUoTWF0aC5jZWlsKG8odCkpKX19KSl9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBQdShlLGp1KCkuYmFzZShpKSl9LGV9ZnVuY3Rpb24gSHUodCxuKXtyZXR1cm4gdDwwPy1NYXRoLnBvdygtdCxuKTpNYXRoLnBvdyh0LG4pfWZ1bmN0aW9uIFh1KCl7ZnVuY3Rpb24gdCh0LG4pe3JldHVybihuPUh1KG4sZSktKHQ9SHUodCxlKSkpP2Z1bmN0aW9uKHIpe3JldHVybihIdShyLGUpLXQpL259OkJtKG4pfWZ1bmN0aW9uIG4odCxuKXtyZXR1cm4gbj1IdShuLGUpLSh0PUh1KHQsZSkpLGZ1bmN0aW9uKHIpe3JldHVybiBIdSh0K24qciwxL2UpfX12YXIgZT0xLHI9UnUodCxuKSxpPXIuZG9tYWluO3JldHVybiByLmV4cG9uZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0LGkoaSgpKSk6ZX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFB1KHIsWHUoKS5leHBvbmVudChlKSl9LEx1KHIpfWZ1bmN0aW9uIFZ1KCl7cmV0dXJuIFh1KCkuZXhwb25lbnQoLjUpfWZ1bmN0aW9uIFd1KCl7ZnVuY3Rpb24gdCgpe3ZhciB0PTAsbz1NYXRoLm1heCgxLHIubGVuZ3RoKTtmb3IoaT1uZXcgQXJyYXkoby0xKTsrK3Q8bzspaVt0LTFdPXVmKGUsdC9vKTtyZXR1cm4gbn1mdW5jdGlvbiBuKHQpe2lmKCFpc05hTih0PSt0KSlyZXR1cm4gcltPcyhpLHQpXX12YXIgZT1bXSxyPVtdLGk9W107cmV0dXJuIG4uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBuPXIuaW5kZXhPZih0KTtyZXR1cm4gbjwwP1tOYU4sTmFOXTpbbj4wP2lbbi0xXTplWzBdLG48aS5sZW5ndGg/aVtuXTplW2UubGVuZ3RoLTFdXX0sbi5kb21haW49ZnVuY3Rpb24obil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdO2Zvcih2YXIgcixpPTAsbz1uLmxlbmd0aDtpPG87KytpKXI9bltpXSxudWxsPT1yfHxpc05hTihyPStyKXx8ZS5wdXNoKHIpO3JldHVybiBlLnNvcnQocXMpLHQoKX0sbi5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1JbS5jYWxsKG4pLHQoKSk6ci5zbGljZSgpfSxuLnF1YW50aWxlcz1mdW5jdGlvbigpe3JldHVybiBpLnNsaWNlKCl9LG4uY29weT1mdW5jdGlvbigpe3JldHVybiBXdSgpLmRvbWFpbihlKS5yYW5nZShyKX0sbn1mdW5jdGlvbiAkdSgpe2Z1bmN0aW9uIHQodCl7aWYodDw9dClyZXR1cm4gdVtPcyhvLHQsMCxpKV19ZnVuY3Rpb24gbigpe3ZhciBuPS0xO2ZvcihvPW5ldyBBcnJheShpKTsrK248aTspb1tuXT0oKG4rMSkqci0obi1pKSplKS8oaSsxKTtyZXR1cm4gdH12YXIgZT0wLHI9MSxpPTEsbz1bLjVdLHU9WzAsMV07cmV0dXJuIHQuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0sbigpKTpbZSxyXX0sdC5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0odT1JbS5jYWxsKHQpKS5sZW5ndGgtMSxuKCkpOnUuc2xpY2UoKX0sdC5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIG49dS5pbmRleE9mKHQpO3JldHVybiBuPDA/W05hTixOYU5dOm48MT9bZSxvWzBdXTpuPj1pP1tvW2ktMV0scl06W29bbi0xXSxvW25dXX0sdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuICR1KCkuZG9tYWluKFtlLHJdKS5yYW5nZSh1KX0sTHUodCl9ZnVuY3Rpb24gWnUoKXtmdW5jdGlvbiB0KHQpe2lmKHQ8PXQpcmV0dXJuIGVbT3Mobix0LDAscildfXZhciBuPVsuNV0sZT1bMCwxXSxyPTE7cmV0dXJuIHQuZG9tYWluPWZ1bmN0aW9uKGkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPUltLmNhbGwoaSkscj1NYXRoLm1pbihuLmxlbmd0aCxlLmxlbmd0aC0xKSx0KTpuLnNsaWNlKCl9LHQucmFuZ2U9ZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9SW0uY2FsbChpKSxyPU1hdGgubWluKG4ubGVuZ3RoLGUubGVuZ3RoLTEpLHQpOmUuc2xpY2UoKX0sdC5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIHI9ZS5pbmRleE9mKHQpO3JldHVybltuW3ItMV0sbltyXV19LHQuY29weT1mdW5jdGlvbigpe3JldHVybiBadSgpLmRvbWFpbihuKS5yYW5nZShlKX0sdH1mdW5jdGlvbiBHdSh0LG4sZSxyKXtmdW5jdGlvbiBpKG4pe3JldHVybiB0KG49bmV3IERhdGUoK24pKSxufXJldHVybiBpLmZsb29yPWksaS5jZWlsPWZ1bmN0aW9uKGUpe3JldHVybiB0KGU9bmV3IERhdGUoZS0xKSksbihlLDEpLHQoZSksZX0saS5yb3VuZD1mdW5jdGlvbih0KXt2YXIgbj1pKHQpLGU9aS5jZWlsKHQpO3JldHVybiB0LW48ZS10P246ZX0saS5vZmZzZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbih0PW5ldyBEYXRlKCt0KSxudWxsPT1lPzE6TWF0aC5mbG9vcihlKSksdH0saS5yYW5nZT1mdW5jdGlvbihlLHIsbyl7dmFyIHU9W107aWYoZT1pLmNlaWwoZSksbz1udWxsPT1vPzE6TWF0aC5mbG9vcihvKSwhKGU8ciYmbz4wKSlyZXR1cm4gdTtkbyB1LnB1c2gobmV3IERhdGUoK2UpKTt3aGlsZShuKGUsbyksdChlKSxlPHIpO3JldHVybiB1fSxpLmZpbHRlcj1mdW5jdGlvbihlKXtyZXR1cm4gR3UoZnVuY3Rpb24obil7aWYobj49bilmb3IoO3QobiksIWUobik7KW4uc2V0VGltZShuLTEpfSxmdW5jdGlvbih0LHIpe2lmKHQ+PXQpZm9yKDstLXI+PTA7KWZvcig7bih0LDEpLCFlKHQpOyk7fSl9LGUmJihpLmNvdW50PWZ1bmN0aW9uKG4scil7cmV0dXJuIFdtLnNldFRpbWUoK24pLCRtLnNldFRpbWUoK3IpLHQoV20pLHQoJG0pLE1hdGguZmxvb3IoZShXbSwkbSkpfSxpLmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGguZmxvb3IodCksaXNGaW5pdGUodCkmJnQ+MD90PjE/aS5maWx0ZXIocj9mdW5jdGlvbihuKXtyZXR1cm4gcihuKSV0PT09MH06ZnVuY3Rpb24obil7cmV0dXJuIGkuY291bnQoMCxuKSV0PT09MH0pOmk6bnVsbH0pLGl9ZnVuY3Rpb24gSnUodCl7cmV0dXJuIEd1KGZ1bmN0aW9uKG4pe24uc2V0RGF0ZShuLmdldERhdGUoKS0obi5nZXREYXkoKSs3LXQpJTcpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpKzcqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdC0obi5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkqUW0pL254fSl9ZnVuY3Rpb24gUXUodCl7cmV0dXJuIEd1KGZ1bmN0aW9uKG4pe24uc2V0VVRDRGF0ZShuLmdldFVUQ0RhdGUoKS0obi5nZXRVVENEYXkoKSs3LXQpJTcpLG4uc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpKzcqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvbnh9KX1mdW5jdGlvbiBLdSh0KXtpZigwPD10LnkmJnQueTwxMDApe3ZhciBuPW5ldyBEYXRlKC0xLHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKTtyZXR1cm4gbi5zZXRGdWxsWWVhcih0LnkpLG59cmV0dXJuIG5ldyBEYXRlKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCl9ZnVuY3Rpb24gdGEodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgbj1uZXcgRGF0ZShEYXRlLlVUQygtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpO3JldHVybiBuLnNldFVUQ0Z1bGxZZWFyKHQueSksbn1yZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEModC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSl9ZnVuY3Rpb24gbmEodCl7cmV0dXJue3k6dCxtOjAsZDoxLEg6MCxNOjAsUzowLEw6MH19ZnVuY3Rpb24gZWEodCl7ZnVuY3Rpb24gbih0LG4pe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcixpLG8sdT1bXSxhPS0xLGM9MCxzPXQubGVuZ3RoO2ZvcihlIGluc3RhbmNlb2YgRGF0ZXx8KGU9bmV3IERhdGUoK2UpKTsrK2E8czspMzc9PT10LmNoYXJDb2RlQXQoYSkmJih1LnB1c2godC5zbGljZShjLGEpKSxudWxsIT0oaT1LeFtyPXQuY2hhckF0KCsrYSldKT9yPXQuY2hhckF0KCsrYSk6aT0iZSI9PT1yPyIgIjoiMCIsKG89bltyXSkmJihyPW8oZSxpKSksdS5wdXNoKHIpLGM9YSsxKTtyZXR1cm4gdS5wdXNoKHQuc2xpY2UoYyxhKSksdS5qb2luKCIiKX19ZnVuY3Rpb24gZSh0LG4pe3JldHVybiBmdW5jdGlvbihlKXt2YXIgaT1uYSgxOTAwKTtpZihyKGksdCxlKz0iIiwwKSE9ZS5sZW5ndGgpcmV0dXJuIG51bGw7aWYoInAiaW4gaSYmKGkuSD1pLkglMTIrMTIqaS5wKSwiVyJpbiBpfHwiVSJpbiBpKXsidyJpbiBpfHwoaS53PSJXImluIGk/MTowKTt2YXIgbz0iWiJpbiBpP3RhKG5hKGkueSkpLmdldFVUQ0RheSgpOm4obmEoaS55KSkuZ2V0RGF5KCk7aS5tPTAsaS5kPSJXImluIGk/KGkudys2KSU3KzcqaS5XLShvKzUpJTc6aS53KzcqaS5VLShvKzYpJTd9cmV0dXJuIloiaW4gaT8oaS5IKz1pLlovMTAwfDAsaS5NKz1pLlolMTAwLHRhKGkpKTpuKGkpfX1mdW5jdGlvbiByKHQsbixlLHIpewpmb3IodmFyIGksbyx1PTAsYT1uLmxlbmd0aCxjPWUubGVuZ3RoO3U8YTspe2lmKHI+PWMpcmV0dXJuLTE7aWYoaT1uLmNoYXJDb2RlQXQodSsrKSwzNz09PWkpe2lmKGk9bi5jaGFyQXQodSsrKSxvPUJbaSBpbiBLeD9uLmNoYXJBdCh1KyspOmldLCFvfHwocj1vKHQsZSxyKSk8MClyZXR1cm4tMX1lbHNlIGlmKGkhPWUuY2hhckNvZGVBdChyKyspKXJldHVybi0xfXJldHVybiByfWZ1bmN0aW9uIGkodCxuLGUpe3ZhciByPUMuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5wPXpbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBvKHQsbixlKXt2YXIgcj1MLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz1xW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gdSh0LG4sZSl7dmFyIHI9UC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lnc9UltyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGEodCxuLGUpe3ZhciByPU8uZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPUZbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBjKHQsbixlKXt2YXIgcj1VLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQubT1EW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcyh0LG4sZSl7cmV0dXJuIHIodCx3LG4sZSl9ZnVuY3Rpb24gZih0LG4sZSl7cmV0dXJuIHIodCxNLG4sZSl9ZnVuY3Rpb24gbCh0LG4sZSl7cmV0dXJuIHIodCxULG4sZSl9ZnVuY3Rpb24gaCh0KXtyZXR1cm4gTlt0LmdldERheSgpXX1mdW5jdGlvbiBwKHQpe3JldHVybiBTW3QuZ2V0RGF5KCldfWZ1bmN0aW9uIGQodCl7cmV0dXJuIEFbdC5nZXRNb250aCgpXX1mdW5jdGlvbiB2KHQpe3JldHVybiBFW3QuZ2V0TW9udGgoKV19ZnVuY3Rpb24gXyh0KXtyZXR1cm4ga1srKHQuZ2V0SG91cnMoKT49MTIpXX1mdW5jdGlvbiBnKHQpe3JldHVybiBOW3QuZ2V0VVRDRGF5KCldfWZ1bmN0aW9uIHkodCl7cmV0dXJuIFNbdC5nZXRVVENEYXkoKV19ZnVuY3Rpb24gbSh0KXtyZXR1cm4gQVt0LmdldFVUQ01vbnRoKCldfWZ1bmN0aW9uIHgodCl7cmV0dXJuIEVbdC5nZXRVVENNb250aCgpXX1mdW5jdGlvbiBiKHQpe3JldHVybiBrWysodC5nZXRVVENIb3VycygpPj0xMildfXZhciB3PXQuZGF0ZVRpbWUsTT10LmRhdGUsVD10LnRpbWUsaz10LnBlcmlvZHMsUz10LmRheXMsTj10LnNob3J0RGF5cyxFPXQubW9udGhzLEE9dC5zaG9ydE1vbnRocyxDPW9hKGspLHo9dWEoayksUD1vYShTKSxSPXVhKFMpLEw9b2EoTikscT11YShOKSxVPW9hKEUpLEQ9dWEoRSksTz1vYShBKSxGPXVhKEEpLEk9e2E6aCxBOnAsYjpkLEI6dixjOm51bGwsZDpiYSxlOmJhLEg6d2EsSTpNYSxqOlRhLEw6a2EsbTpTYSxNOk5hLHA6XyxTOkVhLFU6QWEsdzpDYSxXOnphLHg6bnVsbCxYOm51bGwseTpQYSxZOlJhLFo6TGEsIiUiOlphfSxZPXthOmcsQTp5LGI6bSxCOngsYzpudWxsLGQ6cWEsZTpxYSxIOlVhLEk6RGEsajpPYSxMOkZhLG06SWEsTTpZYSxwOmIsUzpCYSxVOmphLHc6SGEsVzpYYSx4Om51bGwsWDpudWxsLHk6VmEsWTpXYSxaOiRhLCIlIjpaYX0sQj17YTpvLEE6dSxiOmEsQjpjLGM6cyxkOmRhLGU6ZGEsSDpfYSxJOl9hLGo6dmEsTDptYSxtOnBhLE06Z2EscDppLFM6eWEsVTpjYSx3OmFhLFc6c2EseDpmLFg6bCx5OmxhLFk6ZmEsWjpoYSwiJSI6eGF9O3JldHVybiBJLng9bihNLEkpLEkuWD1uKFQsSSksSS5jPW4odyxJKSxZLng9bihNLFkpLFkuWD1uKFQsWSksWS5jPW4odyxZKSx7Zm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBlPW4odCs9IiIsSSk7cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX0scGFyc2U6ZnVuY3Rpb24odCl7dmFyIG49ZSh0Kz0iIixLdSk7cmV0dXJuIG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sbn0sdXRjRm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBlPW4odCs9IiIsWSk7cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX0sdXRjUGFyc2U6ZnVuY3Rpb24odCl7dmFyIG49ZSh0LHRhKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufX19ZnVuY3Rpb24gcmEodCxuLGUpe3ZhciByPXQ8MD8iLSI6IiIsaT0ocj8tdDp0KSsiIixvPWkubGVuZ3RoO3JldHVybiByKyhvPGU/bmV3IEFycmF5KGUtbysxKS5qb2luKG4pK2k6aSl9ZnVuY3Rpb24gaWEodCl7cmV0dXJuIHQucmVwbGFjZShlYiwiXFwkJiIpfWZ1bmN0aW9uIG9hKHQpe3JldHVybiBuZXcgUmVnRXhwKCJeKD86Iit0Lm1hcChpYSkuam9pbigifCIpKyIpIiwiaSIpfWZ1bmN0aW9uIHVhKHQpe2Zvcih2YXIgbj17fSxlPS0xLHI9dC5sZW5ndGg7KytlPHI7KW5bdFtlXS50b0xvd2VyQ2FzZSgpXT1lO3JldHVybiBufWZ1bmN0aW9uIGFhKHQsbixlKXt2YXIgcj10Yi5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj8odC53PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGNhKHQsbixlKXt2YXIgcj10Yi5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LlU9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gc2EodCxuLGUpe3ZhciByPXRiLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQuVz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBmYSh0LG4sZSl7dmFyIHI9dGIuZXhlYyhuLnNsaWNlKGUsZSs0KSk7cmV0dXJuIHI/KHQueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBsYSh0LG4sZSl7dmFyIHI9dGIuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQueT0rclswXSsoK3JbMF0+Njg/MTkwMDoyZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGhhKHQsbixlKXt2YXIgcj0vXihaKXwoWystXVxkXGQpKD86XDo/KFxkXGQpKT8vLmV4ZWMobi5zbGljZShlLGUrNikpO3JldHVybiByPyh0Llo9clsxXT8wOi0oclsyXSsoclszXXx8IjAwIikpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHBhKHQsbixlKXt2YXIgcj10Yi5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5tPXJbMF0tMSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBkYSh0LG4sZSl7dmFyIHI9dGIuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuZD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB2YSh0LG4sZSl7dmFyIHI9dGIuZXhlYyhuLnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KHQubT0wLHQuZD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBfYSh0LG4sZSl7dmFyIHI9dGIuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuSD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBnYSh0LG4sZSl7dmFyIHI9dGIuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuTT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB5YSh0LG4sZSl7dmFyIHI9dGIuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuUz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBtYSh0LG4sZSl7dmFyIHI9dGIuZXhlYyhuLnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KHQuTD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB4YSh0LG4sZSl7dmFyIHI9bmIuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/ZStyWzBdLmxlbmd0aDotMX1mdW5jdGlvbiBiYSh0LG4pe3JldHVybiByYSh0LmdldERhdGUoKSxuLDIpfWZ1bmN0aW9uIHdhKHQsbil7cmV0dXJuIHJhKHQuZ2V0SG91cnMoKSxuLDIpfWZ1bmN0aW9uIE1hKHQsbil7cmV0dXJuIHJhKHQuZ2V0SG91cnMoKSUxMnx8MTIsbiwyKX1mdW5jdGlvbiBUYSh0LG4pe3JldHVybiByYSgxK2N4LmNvdW50KFN4KHQpLHQpLG4sMyl9ZnVuY3Rpb24ga2EodCxuKXtyZXR1cm4gcmEodC5nZXRNaWxsaXNlY29uZHMoKSxuLDMpfWZ1bmN0aW9uIFNhKHQsbil7cmV0dXJuIHJhKHQuZ2V0TW9udGgoKSsxLG4sMil9ZnVuY3Rpb24gTmEodCxuKXtyZXR1cm4gcmEodC5nZXRNaW51dGVzKCksbiwyKX1mdW5jdGlvbiBFYSh0LG4pe3JldHVybiByYSh0LmdldFNlY29uZHMoKSxuLDIpfWZ1bmN0aW9uIEFhKHQsbil7cmV0dXJuIHJhKGZ4LmNvdW50KFN4KHQpLHQpLG4sMil9ZnVuY3Rpb24gQ2EodCl7cmV0dXJuIHQuZ2V0RGF5KCl9ZnVuY3Rpb24gemEodCxuKXtyZXR1cm4gcmEobHguY291bnQoU3godCksdCksbiwyKX1mdW5jdGlvbiBQYSh0LG4pe3JldHVybiByYSh0LmdldEZ1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24gUmEodCxuKXtyZXR1cm4gcmEodC5nZXRGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uIExhKHQpe3ZhciBuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4obj4wPyItIjoobio9LTEsIisiKSkrcmEobi82MHwwLCIwIiwyKStyYShuJTYwLCIwIiwyKX1mdW5jdGlvbiBxYSh0LG4pe3JldHVybiByYSh0LmdldFVUQ0RhdGUoKSxuLDIpfWZ1bmN0aW9uIFVhKHQsbil7cmV0dXJuIHJhKHQuZ2V0VVRDSG91cnMoKSxuLDIpfWZ1bmN0aW9uIERhKHQsbil7cmV0dXJuIHJhKHQuZ2V0VVRDSG91cnMoKSUxMnx8MTIsbiwyKX1mdW5jdGlvbiBPYSh0LG4pe3JldHVybiByYSgxK1B4LmNvdW50KEd4KHQpLHQpLG4sMyl9ZnVuY3Rpb24gRmEodCxuKXtyZXR1cm4gcmEodC5nZXRVVENNaWxsaXNlY29uZHMoKSxuLDMpfWZ1bmN0aW9uIElhKHQsbil7cmV0dXJuIHJhKHQuZ2V0VVRDTW9udGgoKSsxLG4sMil9ZnVuY3Rpb24gWWEodCxuKXtyZXR1cm4gcmEodC5nZXRVVENNaW51dGVzKCksbiwyKX1mdW5jdGlvbiBCYSh0LG4pe3JldHVybiByYSh0LmdldFVUQ1NlY29uZHMoKSxuLDIpfWZ1bmN0aW9uIGphKHQsbil7cmV0dXJuIHJhKEx4LmNvdW50KEd4KHQpLHQpLG4sMil9ZnVuY3Rpb24gSGEodCl7cmV0dXJuIHQuZ2V0VVRDRGF5KCl9ZnVuY3Rpb24gWGEodCxuKXtyZXR1cm4gcmEocXguY291bnQoR3godCksdCksbiwyKX1mdW5jdGlvbiBWYSh0LG4pe3JldHVybiByYSh0LmdldFVUQ0Z1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24gV2EodCxuKXtyZXR1cm4gcmEodC5nZXRVVENGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uICRhKCl7cmV0dXJuIiswMDAwIn1mdW5jdGlvbiBaYSgpe3JldHVybiIlIn1mdW5jdGlvbiBHYShuKXtyZXR1cm4gSng9ZWEobiksdC50aW1lRm9ybWF0PUp4LmZvcm1hdCx0LnRpbWVQYXJzZT1KeC5wYXJzZSx0LnV0Y0Zvcm1hdD1KeC51dGNGb3JtYXQsdC51dGNQYXJzZT1KeC51dGNQYXJzZSxKeH1mdW5jdGlvbiBKYSh0KXtyZXR1cm4gdC50b0lTT1N0cmluZygpfWZ1bmN0aW9uIFFhKHQpe3ZhciBuPW5ldyBEYXRlKHQpO3JldHVybiBpc05hTihuKT9udWxsOm59ZnVuY3Rpb24gS2EodCl7cmV0dXJuIG5ldyBEYXRlKHQpfWZ1bmN0aW9uIHRjKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZT8rdDorbmV3IERhdGUoK3QpfWZ1bmN0aW9uIG5jKHQsbixlLGksbyx1LGEsYyxzKXtmdW5jdGlvbiBmKHIpe3JldHVybihhKHIpPHI/djp1KHIpPHI/XzpvKHIpPHI/ZzppKHIpPHI/eTpuKHIpPHI/ZShyKTxyP206eDp0KHIpPHI/Yjp3KShyKX1mdW5jdGlvbiBsKG4sZSxpLG8pe2lmKG51bGw9PW4mJihuPTEwKSwibnVtYmVyIj09dHlwZW9mIG4pe3ZhciB1PU1hdGguYWJzKGktZSkvbixhPVVzKGZ1bmN0aW9uKHQpe3JldHVybiB0WzJdfSkucmlnaHQoTSx1KTthPT09TS5sZW5ndGg/KG89cihlL2hiLGkvaGIsbiksbj10KTphPyhhPU1bdS9NW2EtMV1bMl08TVthXVsyXS91P2EtMTphXSxvPWFbMV0sbj1hWzBdKToobz1yKGUsaSxuKSxuPWMpfXJldHVybiBudWxsPT1vP246bi5ldmVyeShvKX12YXIgaD1SdShOdSxUaCkscD1oLmludmVydCxkPWguZG9tYWluLHY9cygiLiVMIiksXz1zKCI6JVMiKSxnPXMoIiVJOiVNIikseT1zKCIlSSAlcCIpLG09cygiJWEgJWQiKSx4PXMoIiViICVkIiksYj1zKCIlQiIpLHc9cygiJVkiKSxNPVtbYSwxLHViXSxbYSw1LDUqdWJdLFthLDE1LDE1KnViXSxbYSwzMCwzMCp1Yl0sW3UsMSxhYl0sW3UsNSw1KmFiXSxbdSwxNSwxNSphYl0sW3UsMzAsMzAqYWJdLFtvLDEsY2JdLFtvLDMsMypjYl0sW28sNiw2KmNiXSxbbywxMiwxMipjYl0sW2ksMSxzYl0sW2ksMiwyKnNiXSxbZSwxLGZiXSxbbiwxLGxiXSxbbiwzLDMqbGJdLFt0LDEsaGJdXTtyZXR1cm4gaC5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBEYXRlKHAodCkpfSxoLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9kKEZtLmNhbGwodCx0YykpOmQoKS5tYXAoS2EpfSxoLnRpY2tzPWZ1bmN0aW9uKHQsbil7dmFyIGUscj1kKCksaT1yWzBdLG89cltyLmxlbmd0aC0xXSx1PW88aTtyZXR1cm4gdSYmKGU9aSxpPW8sbz1lKSxlPWwodCxpLG8sbiksZT1lP2UucmFuZ2UoaSxvKzEpOltdLHU/ZS5yZXZlcnNlKCk6ZX0saC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIG51bGw9PW4/ZjpzKG4pfSxoLm5pY2U9ZnVuY3Rpb24odCxuKXt2YXIgZT1kKCk7cmV0dXJuKHQ9bCh0LGVbMF0sZVtlLmxlbmd0aC0xXSxuKSk/ZChWbShlLHQpKTpofSxoLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gUHUoaCxuYyh0LG4sZSxpLG8sdSxhLGMscykpfSxofWZ1bmN0aW9uIGVjKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKG4tMSxNYXRoLmZsb29yKGUqbikpKV19fWZ1bmN0aW9uIHJjKHQpe2Z1bmN0aW9uIG4obil7dmFyIG89KG4tZSkvKHItZSk7cmV0dXJuIHQoaT9NYXRoLm1heCgwLE1hdGgubWluKDEsbykpOm8pfXZhciBlPTAscj0xLGk9ITE7cmV0dXJuIG4uZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0sbik6W2Uscl19LG4uY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ISF0LG4pOml9LG4uaW50ZXJwb2xhdG9yPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHJjKHQpLmRvbWFpbihbZSxyXSkuY2xhbXAoaSl9LEx1KG4pfWZ1bmN0aW9uIGljKHQpe3JldHVybiB0PjE/MDp0PC0xP09iOk1hdGguYWNvcyh0KX1mdW5jdGlvbiBvYyh0KXtyZXR1cm4gdD49MT9GYjp0PD0tMT8tRmI6TWF0aC5hc2luKHQpfWZ1bmN0aW9uIHVjKHQpe3JldHVybiB0LmlubmVyUmFkaXVzfWZ1bmN0aW9uIGFjKHQpe3JldHVybiB0Lm91dGVyUmFkaXVzfWZ1bmN0aW9uIGNjKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gc2ModCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24gZmModCl7cmV0dXJuIHQmJnQucGFkQW5nbGV9ZnVuY3Rpb24gbGModCxuLGUscixpLG8sdSxhKXt2YXIgYz1lLXQscz1yLW4sZj11LWksbD1hLW8saD0oZioobi1vKS1sKih0LWkpKS8obCpjLWYqcyk7cmV0dXJuW3QraCpjLG4raCpzXX1mdW5jdGlvbiBoYyh0LG4sZSxyLGksbyx1KXt2YXIgYT10LWUsYz1uLXIscz0odT9vOi1vKS9VYihhKmErYypjKSxmPXMqYyxsPS1zKmEsaD10K2YscD1uK2wsZD1lK2Ysdj1yK2wsXz0oaCtkKS8yLGc9KHArdikvMix5PWQtaCxtPXYtcCx4PXkqeSttKm0sYj1pLW8sdz1oKnYtZCpwLE09KG08MD8tMToxKSpVYihSYigwLGIqYip4LXcqdykpLFQ9KHcqbS15Kk0pL3gsaz0oLXcqeS1tKk0pL3gsUz0odyptK3kqTSkveCxOPSgtdyp5K20qTSkveCxFPVQtXyxBPWstZyxDPVMtXyx6PU4tZztyZXR1cm4gRSpFK0EqQT5DKkMreip6JiYoVD1TLGs9Tikse2N4OlQsY3k6ayx4MDE6LWYseTAxOi1sLHgxMTpUKihpL2ItMSkseTExOmsqKGkvYi0xKX19ZnVuY3Rpb24gcGModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGRjKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIHZjKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIF9jKHQpe3RoaXMuX2N1cnZlPXR9ZnVuY3Rpb24gZ2ModCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbmV3IF9jKHQobikpfXJldHVybiBuLl9jdXJ2ZT10LG59ZnVuY3Rpb24geWModCl7dmFyIG49dC5jdXJ2ZTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oZ2ModCkpOm4oKS5fY3VydmV9LHR9ZnVuY3Rpb24gbWModCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygoMip0Ll94MCt0Ll94MSkvMywoMip0Ll95MCt0Ll95MSkvMywodC5feDArMip0Ll94MSkvMywodC5feTArMip0Ll95MSkvMywodC5feDArNCp0Ll94MStuKS82LCh0Ll95MCs0KnQuX3kxK2UpLzYpfWZ1bmN0aW9uIHhjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBiYyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gd2ModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIE1jKHQsbil7dGhpcy5fYmFzaXM9bmV3IHhjKHQpLHRoaXMuX2JldGE9bn1mdW5jdGlvbiBUYyh0LG4sZSl7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtbiksdC5feTIrdC5fayoodC5feTEtZSksdC5feDIsdC5feTIpfWZ1bmN0aW9uIGtjKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1mdW5jdGlvbiBTYyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLW4pLzZ9ZnVuY3Rpb24gTmModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fWZ1bmN0aW9uIEVjKHQsbixlKXt2YXIgcj10Ll94MSxpPXQuX3kxLG89dC5feDIsdT10Ll95MjtpZih0Ll9sMDFfYT5EYil7dmFyIGE9Mip0Ll9sMDFfMmErMyp0Ll9sMDFfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsYz0zKnQuX2wwMV9hKih0Ll9sMDFfYSt0Ll9sMTJfYSk7cj0ociphLXQuX3gwKnQuX2wxMl8yYSt0Ll94Mip0Ll9sMDFfMmEpL2MsaT0oaSphLXQuX3kwKnQuX2wxMl8yYSt0Ll95Mip0Ll9sMDFfMmEpL2N9aWYodC5fbDIzX2E+RGIpe3ZhciBzPTIqdC5fbDIzXzJhKzMqdC5fbDIzX2EqdC5fbDEyX2ErdC5fbDEyXzJhLGY9Myp0Ll9sMjNfYSoodC5fbDIzX2ErdC5fbDEyX2EpO289KG8qcyt0Ll94MSp0Ll9sMjNfMmEtbip0Ll9sMTJfMmEpL2YsdT0odSpzK3QuX3kxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvZn10Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocixpLG8sdSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gQWModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1mdW5jdGlvbiBDYyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufWZ1bmN0aW9uIHpjKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59ZnVuY3Rpb24gUGModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIFJjKHQpe3JldHVybiB0PDA/LTE6MX1mdW5jdGlvbiBMYyh0LG4sZSl7dmFyIHI9dC5feDEtdC5feDAsaT1uLXQuX3gxLG89KHQuX3kxLXQuX3kwKS8ocnx8aTwwJiYtMCksdT0oZS10Ll95MSkvKGl8fHI8MCYmLTApLGE9KG8qaSt1KnIpLyhyK2kpO3JldHVybihSYyhvKStSYyh1KSkqTWF0aC5taW4oTWF0aC5hYnMobyksTWF0aC5hYnModSksLjUqTWF0aC5hYnMoYSkpfHwwfWZ1bmN0aW9uIHFjKHQsbil7dmFyIGU9dC5feDEtdC5feDA7cmV0dXJuIGU/KDMqKHQuX3kxLXQuX3kwKS9lLW4pLzI6bn1mdW5jdGlvbiBVYyh0LG4sZSl7dmFyIHI9dC5feDAsaT10Ll95MCxvPXQuX3gxLHU9dC5feTEsYT0oby1yKS8zO3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyK2EsaSthKm4sby1hLHUtYSplLG8sdSl9ZnVuY3Rpb24gRGModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIE9jKHQpe3RoaXMuX2NvbnRleHQ9bmV3IEZjKHQpfWZ1bmN0aW9uIEZjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBJYyh0KXtyZXR1cm4gbmV3IERjKHQpfWZ1bmN0aW9uIFljKHQpe3JldHVybiBuZXcgT2ModCl9ZnVuY3Rpb24gQmModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGpjKHQpe3ZhciBuLGUscj10Lmxlbmd0aC0xLGk9bmV3IEFycmF5KHIpLG89bmV3IEFycmF5KHIpLHU9bmV3IEFycmF5KHIpO2ZvcihpWzBdPTAsb1swXT0yLHVbMF09dFswXSsyKnRbMV0sbj0xO248ci0xOysrbilpW25dPTEsb1tuXT00LHVbbl09NCp0W25dKzIqdFtuKzFdO2ZvcihpW3ItMV09MixvW3ItMV09Nyx1W3ItMV09OCp0W3ItMV0rdFtyXSxuPTE7bjxyOysrbillPWlbbl0vb1tuLTFdLG9bbl0tPWUsdVtuXS09ZSp1W24tMV07Zm9yKGlbci0xXT11W3ItMV0vb1tyLTFdLG49ci0yO24+PTA7LS1uKWlbbl09KHVbbl0taVtuKzFdKS9vW25dO2ZvcihvW3ItMV09KHRbcl0raVtyLTFdKS8yLG49MDtuPHItMTsrK24pb1tuXT0yKnRbbisxXS1pW24rMV07cmV0dXJuW2ksb119ZnVuY3Rpb24gSGModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fdD1ufWZ1bmN0aW9uIFhjKHQpe3JldHVybiBuZXcgSGModCwwKX1mdW5jdGlvbiBWYyh0KXtyZXR1cm4gbmV3IEhjKHQsMSl9ZnVuY3Rpb24gV2ModCxuKXtyZXR1cm4gdFtuXX1mdW5jdGlvbiAkYyh0KXtmb3IodmFyIG4sZT0wLHI9LTEsaT10Lmxlbmd0aDsrK3I8aTspKG49K3Rbcl1bMV0pJiYoZSs9bik7cmV0dXJuIGV9ZnVuY3Rpb24gWmModCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gR2ModCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gSmMoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBRYyh0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIEtjKHQsbil7dmFyIGU9bixyPW4uUixpPWUuVTtpP2kuTD09PWU/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiB0cyh0LG4pe3ZhciBlPW4scj1uLkwsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gbnModCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIGVzKHQsbixlLHIpe3ZhciBpPVtudWxsLG51bGxdLG89V3cucHVzaChpKS0xO3JldHVybiBpLmxlZnQ9dCxpLnJpZ2h0PW4sZSYmaXMoaSx0LG4sZSksciYmaXMoaSxuLHQsciksWHdbdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksWHdbbi5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksaX1mdW5jdGlvbiBycyh0LG4sZSl7dmFyIHI9W24sZV07cmV0dXJuIHIubGVmdD10LHJ9ZnVuY3Rpb24gaXModCxuLGUscil7dFswXXx8dFsxXT90LmxlZnQ9PT1lP3RbMV09cjp0WzBdPXI6KHRbMF09cix0LmxlZnQ9bix0LnJpZ2h0PWUpfWZ1bmN0aW9uIG9zKHQsbixlLHIsaSl7dmFyIG8sdT10WzBdLGE9dFsxXSxjPXVbMF0scz11WzFdLGY9YVswXSxsPWFbMV0saD0wLHA9MSxkPWYtYyx2PWwtcztpZihvPW4tYyxkfHwhKG8+MCkpe2lmKG8vPWQsZDwwKXtpZihvPGgpcmV0dXJuO288cCYmKHA9byl9ZWxzZSBpZihkPjApe2lmKG8+cClyZXR1cm47bz5oJiYoaD1vKX1pZihvPXItYyxkfHwhKG88MCkpe2lmKG8vPWQsZDwwKXtpZihvPnApcmV0dXJuO28+aCYmKGg9byl9ZWxzZSBpZihkPjApe2lmKG88aClyZXR1cm47bzxwJiYocD1vKX1pZihvPWUtcyx2fHwhKG8+MCkpe2lmKG8vPXYsdjwwKXtpZihvPGgpcmV0dXJuO288cCYmKHA9byl9ZWxzZSBpZih2PjApe2lmKG8+cClyZXR1cm47bz5oJiYoaD1vKX1pZihvPWktcyx2fHwhKG88MCkpe2lmKG8vPXYsdjwwKXtpZihvPnApcmV0dXJuO28+aCYmKGg9byl9ZWxzZSBpZih2PjApe2lmKG88aClyZXR1cm47bzxwJiYocD1vKX1yZXR1cm4hKGg+MHx8cDwxKXx8KGg+MCYmKHRbMF09W2MraCpkLHMraCp2XSkscDwxJiYodFsxXT1bYytwKmQscytwKnZdKSwhMCl9fX19fWZ1bmN0aW9uIHVzKHQsbixlLHIsaSl7dmFyIG89dFsxXTtpZihvKXJldHVybiEwO3ZhciB1LGEsYz10WzBdLHM9dC5sZWZ0LGY9dC5yaWdodCxsPXNbMF0saD1zWzFdLHA9ZlswXSxkPWZbMV0sdj0obCtwKS8yLF89KGgrZCkvMjtpZihkPT09aCl7aWYodjxufHx2Pj1yKXJldHVybjtpZihsPnApe2lmKGMpe2lmKGNbMV0+PWkpcmV0dXJufWVsc2UgYz1bdixlXTtvPVt2LGldfWVsc2V7aWYoYyl7aWYoY1sxXTxlKXJldHVybn1lbHNlIGM9W3YsaV07bz1bdixlXX19ZWxzZSBpZih1PShsLXApLyhkLWgpLGE9Xy11KnYsdTwtMXx8dT4xKWlmKGw+cCl7aWYoYyl7aWYoY1sxXT49aSlyZXR1cm59ZWxzZSBjPVsoZS1hKS91LGVdO289WyhpLWEpL3UsaV19ZWxzZXtpZihjKXtpZihjWzFdPGUpcmV0dXJufWVsc2UgYz1bKGktYSkvdSxpXTtvPVsoZS1hKS91LGVdfWVsc2UgaWYoaDxkKXtpZihjKXtpZihjWzBdPj1yKXJldHVybn1lbHNlIGM9W24sdSpuK2FdO289W3IsdSpyK2FdfWVsc2V7aWYoYyl7aWYoY1swXTxuKXJldHVybn1lbHNlIGM9W3IsdSpyK2FdO289W24sdSpuK2FdfXJldHVybiB0WzBdPWMsdFsxXT1vLCEwfWZ1bmN0aW9uIGFzKHQsbixlLHIpe2Zvcih2YXIgaSxvPVd3Lmxlbmd0aDtvLS07KXVzKGk9V3dbb10sdCxuLGUscikmJm9zKGksdCxuLGUscikmJihNYXRoLmFicyhpWzBdWzBdLWlbMV1bMF0pPkd3fHxNYXRoLmFicyhpWzBdWzFdLWlbMV1bMV0pPkd3KXx8ZGVsZXRlIFd3W29dfWZ1bmN0aW9uIGNzKHQpe3JldHVybiBYd1t0LmluZGV4XT17c2l0ZTp0LGhhbGZlZGdlczpbXX19ZnVuY3Rpb24gc3ModCxuKXt2YXIgZT10LnNpdGUscj1uLmxlZnQsaT1uLnJpZ2h0O3JldHVybiBlPT09aSYmKGk9cixyPWUpLGk/TWF0aC5hdGFuMihpWzFdLXJbMV0saVswXS1yWzBdKTooZT09PXI/KHI9blsxXSxpPW5bMF0pOihyPW5bMF0saT1uWzFdKSxNYXRoLmF0YW4yKHJbMF0taVswXSxpWzFdLXJbMV0pKX1mdW5jdGlvbiBmcyh0LG4pe3JldHVybiBuWysobi5sZWZ0IT09dC5zaXRlKV19ZnVuY3Rpb24gbHModCxuKXtyZXR1cm4gblsrKG4ubGVmdD09PXQuc2l0ZSldfWZ1bmN0aW9uIGhzKCl7Zm9yKHZhciB0LG4sZSxyLGk9MCxvPVh3Lmxlbmd0aDtpPG87KytpKWlmKCh0PVh3W2ldKSYmKHI9KG49dC5oYWxmZWRnZXMpLmxlbmd0aCkpe3ZhciB1PW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKTtmb3IoZT0wO2U8cjsrK2UpdVtlXT1lLGFbZV09c3ModCxXd1tuW2VdXSk7Zm9yKHUuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBhW25dLWFbdF19KSxlPTA7ZTxyOysrZSlhW2VdPW5bdVtlXV07Zm9yKGU9MDtlPHI7KytlKW5bZV09YVtlXX19ZnVuY3Rpb24gcHModCxuLGUscil7dmFyIGksbyx1LGEsYyxzLGYsbCxoLHAsZCx2LF89WHcubGVuZ3RoLGc9ITA7Zm9yKGk9MDtpPF87KytpKWlmKG89WHdbaV0pe2Zvcih1PW8uc2l0ZSxjPW8uaGFsZmVkZ2VzLGE9Yy5sZW5ndGg7YS0tOylXd1tjW2FdXXx8Yy5zcGxpY2UoYSwxKTtmb3IoYT0wLHM9Yy5sZW5ndGg7YTxzOylwPWxzKG8sV3dbY1thXV0pLGQ9cFswXSx2PXBbMV0sZj1mcyhvLFd3W2NbKythJXNdXSksbD1mWzBdLGg9ZlsxXSwoTWF0aC5hYnMoZC1sKT5Hd3x8TWF0aC5hYnModi1oKT5HdykmJihjLnNwbGljZShhLDAsV3cucHVzaChycyh1LHAsTWF0aC5hYnMoZC10KTxHdyYmci12Pkd3P1t0LE1hdGguYWJzKGwtdCk8R3c/aDpyXTpNYXRoLmFicyh2LXIpPEd3JiZlLWQ+R3c/W01hdGguYWJzKGgtcik8R3c/bDplLHJdOk1hdGguYWJzKGQtZSk8R3cmJnYtbj5Hdz9bZSxNYXRoLmFicyhsLWUpPEd3P2g6bl06TWF0aC5hYnModi1uKTxHdyYmZC10Pkd3P1tNYXRoLmFicyhoLW4pPEd3P2w6dCxuXTpudWxsKSktMSksKytzKTtzJiYoZz0hMSl9aWYoZyl7dmFyIHksbSx4LGI9MS8wO2ZvcihpPTAsZz1udWxsO2k8XzsrK2kpKG89WHdbaV0pJiYodT1vLnNpdGUseT11WzBdLXQsbT11WzFdLW4seD15KnkrbSptLHg8YiYmKGI9eCxnPW8pKTtpZihnKXt2YXIgdz1bdCxuXSxNPVt0LHJdLFQ9W2Uscl0saz1bZSxuXTtnLmhhbGZlZGdlcy5wdXNoKFd3LnB1c2gocnModT1nLnNpdGUsdyxNKSktMSxXdy5wdXNoKHJzKHUsTSxUKSktMSxXdy5wdXNoKHJzKHUsVCxrKSktMSxXdy5wdXNoKHJzKHUsayx3KSktMSl9fWZvcihpPTA7aTxfOysraSkobz1Yd1tpXSkmJihvLmhhbGZlZGdlcy5sZW5ndGh8fGRlbGV0ZSBYd1tpXSl9ZnVuY3Rpb24gZHMoKXtRYyh0aGlzKSx0aGlzLng9dGhpcy55PXRoaXMuYXJjPXRoaXMuc2l0ZT10aGlzLmN5PW51bGx9ZnVuY3Rpb24gdnModCl7dmFyIG49dC5QLGU9dC5OO2lmKG4mJmUpe3ZhciByPW4uc2l0ZSxpPXQuc2l0ZSxvPWUuc2l0ZTtpZihyIT09byl7dmFyIHU9aVswXSxhPWlbMV0sYz1yWzBdLXUscz1yWzFdLWEsZj1vWzBdLXUsbD1vWzFdLWEsaD0yKihjKmwtcypmKTtpZighKGg+PS1Kdykpe3ZhciBwPWMqYytzKnMsZD1mKmYrbCpsLHY9KGwqcC1zKmQpL2gsXz0oYypkLWYqcCkvaCxnPSR3LnBvcCgpfHxuZXcgZHM7Zy5hcmM9dCxnLnNpdGU9aSxnLng9dit1LGcueT0oZy5jeT1fK2EpK01hdGguc3FydCh2KnYrXypfKSx0LmNpcmNsZT1nO2Zvcih2YXIgeT1udWxsLG09VncuXzttOylpZihnLnk8bS55fHxnLnk9PT1tLnkmJmcueDw9bS54KXtpZighbS5MKXt5PW0uUDticmVha31tPW0uTH1lbHNle2lmKCFtLlIpe3k9bTticmVha31tPW0uUn1Wdy5pbnNlcnQoeSxnKSx5fHwoanc9Zyl9fX19ZnVuY3Rpb24gX3ModCl7dmFyIG49dC5jaXJjbGU7biYmKG4uUHx8KGp3PW4uTiksVncucmVtb3ZlKG4pLCR3LnB1c2gobiksUWMobiksdC5jaXJjbGU9bnVsbCl9ZnVuY3Rpb24gZ3MoKXtRYyh0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24geXModCl7dmFyIG49WncucG9wKCl8fG5ldyBncztyZXR1cm4gbi5zaXRlPXQsbn1mdW5jdGlvbiBtcyh0KXtfcyh0KSxIdy5yZW1vdmUodCksWncucHVzaCh0KSxRYyh0KX1mdW5jdGlvbiB4cyh0KXt2YXIgbj10LmNpcmNsZSxlPW4ueCxyPW4uY3ksaT1bZSxyXSxvPXQuUCx1PXQuTixhPVt0XTttcyh0KTtmb3IodmFyIGM9bztjLmNpcmNsZSYmTWF0aC5hYnMoZS1jLmNpcmNsZS54KTxHdyYmTWF0aC5hYnMoci1jLmNpcmNsZS5jeSk8R3c7KW89Yy5QLGEudW5zaGlmdChjKSxtcyhjKSxjPW87YS51bnNoaWZ0KGMpLF9zKGMpO2Zvcih2YXIgcz11O3MuY2lyY2xlJiZNYXRoLmFicyhlLXMuY2lyY2xlLngpPEd3JiZNYXRoLmFicyhyLXMuY2lyY2xlLmN5KTxHdzspdT1zLk4sYS5wdXNoKHMpLG1zKHMpLHM9dTthLnB1c2gocyksX3Mocyk7dmFyIGYsbD1hLmxlbmd0aDtmb3IoZj0xO2Y8bDsrK2Ypcz1hW2ZdLGM9YVtmLTFdLGlzKHMuZWRnZSxjLnNpdGUscy5zaXRlLGkpO2M9YVswXSxzPWFbbC0xXSxzLmVkZ2U9ZXMoYy5zaXRlLHMuc2l0ZSxudWxsLGkpLHZzKGMpLHZzKHMpfWZ1bmN0aW9uIGJzKHQpe2Zvcih2YXIgbixlLHIsaSxvPXRbMF0sdT10WzFdLGE9SHcuXzthOylpZihyPXdzKGEsdSktbyxyPkd3KWE9YS5MO2Vsc2V7aWYoaT1vLU1zKGEsdSksIShpPkd3KSl7cj4tR3c/KG49YS5QLGU9YSk6aT4tR3c/KG49YSxlPWEuTik6bj1lPWE7YnJlYWt9aWYoIWEuUil7bj1hO2JyZWFrfWE9YS5SfWNzKHQpO3ZhciBjPXlzKHQpO2lmKEh3Lmluc2VydChuLGMpLG58fGUpe2lmKG49PT1lKXJldHVybiBfcyhuKSxlPXlzKG4uc2l0ZSksSHcuaW5zZXJ0KGMsZSksYy5lZGdlPWUuZWRnZT1lcyhuLnNpdGUsYy5zaXRlKSx2cyhuKSx2b2lkIHZzKGUpO2lmKCFlKXJldHVybiB2b2lkKGMuZWRnZT1lcyhuLnNpdGUsYy5zaXRlKSk7X3MobiksX3MoZSk7dmFyIHM9bi5zaXRlLGY9c1swXSxsPXNbMV0saD10WzBdLWYscD10WzFdLWwsZD1lLnNpdGUsdj1kWzBdLWYsXz1kWzFdLWwsZz0yKihoKl8tcCp2KSx5PWgqaCtwKnAsbT12KnYrXypfLHg9WyhfKnktcCptKS9nK2YsKGgqbS12KnkpL2crbF07aXMoZS5lZGdlLHMsZCx4KSxjLmVkZ2U9ZXMocyx0LG51bGwseCksZS5lZGdlPWVzKHQsZCxudWxsLHgpLHZzKG4pLHZzKGUpfX1mdW5jdGlvbiB3cyh0LG4pe3ZhciBlPXQuc2l0ZSxyPWVbMF0saT1lWzFdLG89aS1uO2lmKCFvKXJldHVybiByO3ZhciB1PXQuUDtpZighdSlyZXR1cm4tKDEvMCk7ZT11LnNpdGU7dmFyIGE9ZVswXSxjPWVbMV0scz1jLW47aWYoIXMpcmV0dXJuIGE7dmFyIGY9YS1yLGw9MS9vLTEvcyxoPWYvcztyZXR1cm4gbD8oLWgrTWF0aC5zcXJ0KGgqaC0yKmwqKGYqZi8oLTIqcyktYytzLzIraS1vLzIpKSkvbCtyOihyK2EpLzJ9ZnVuY3Rpb24gTXModCxuKXt2YXIgZT10Lk47aWYoZSlyZXR1cm4gd3MoZSxuKTt2YXIgcj10LnNpdGU7cmV0dXJuIHJbMV09PT1uP3JbMF06MS8wfWZ1bmN0aW9uIFRzKHQsbixlKXtyZXR1cm4odFswXS1lWzBdKSooblsxXS10WzFdKS0odFswXS1uWzBdKSooZVsxXS10WzFdKX1mdW5jdGlvbiBrcyh0LG4pe3JldHVybiBuWzFdLXRbMV18fG5bMF0tdFswXX1mdW5jdGlvbiBTcyh0LG4pe3ZhciBlLHIsaSxvPXQuc29ydChrcykucG9wKCk7Zm9yKFd3PVtdLFh3PW5ldyBBcnJheSh0Lmxlbmd0aCksSHc9bmV3IEpjLFZ3PW5ldyBKYzs7KWlmKGk9ancsbyYmKCFpfHxvWzFdPGkueXx8b1sxXT09PWkueSYmb1swXTxpLngpKW9bMF09PT1lJiZvWzFdPT09cnx8KGJzKG8pLGU9b1swXSxyPW9bMV0pLG89dC5wb3AoKTtlbHNle2lmKCFpKWJyZWFrO3hzKGkuYXJjKX1pZihocygpLG4pe3ZhciB1PStuWzBdWzBdLGE9K25bMF1bMV0sYz0rblsxXVswXSxzPStuWzFdWzFdO2FzKHUsYSxjLHMpLHBzKHUsYSxjLHMpfXRoaXMuZWRnZXM9V3csdGhpcy5jZWxscz1YdyxIdz1Wdz1Xdz1Ydz1udWxsfWZ1bmN0aW9uIE5zKHQsbixlKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMudHJhbnNmb3JtPWV9ZnVuY3Rpb24gRXModCxuLGUpe3RoaXMuaz10LHRoaXMueD1uLHRoaXMueT1lfWZ1bmN0aW9uIEFzKHQpe3JldHVybiB0Ll9fem9vbXx8dE19ZnVuY3Rpb24gQ3MoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIHpzKCl7cmV0dXJuIXQuZXZlbnQuYnV0dG9ufWZ1bmN0aW9uIFBzKCl7dmFyIHQsbixlPXRoaXM7cmV0dXJuIGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50PyhlPWUub3duZXJTVkdFbGVtZW50fHxlLHQ9ZS53aWR0aC5iYXNlVmFsLnZhbHVlLG49ZS5oZWlnaHQuYmFzZVZhbC52YWx1ZSk6KHQ9ZS5jbGllbnRXaWR0aCxuPWUuY2xpZW50SGVpZ2h0KSxbWzAsMF0sW3Qsbl1dfWZ1bmN0aW9uIFJzKCl7cmV0dXJuIHRoaXMuX196b29tfHx0TX12YXIgTHM9IjQuNy4wIixxcz1mdW5jdGlvbih0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn0sVXM9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10Lmxlbmd0aCYmKHQ9bih0KSkse2xlZnQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKTwwP3I9bysxOmk9b31yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKT4wP2k9bzpyPW8rMX1yZXR1cm4gcn19fSxEcz1VcyhxcyksT3M9RHMucmlnaHQsRnM9RHMubGVmdCxJcz1mdW5jdGlvbih0LG4pe251bGw9PW4mJihuPWUpO2Zvcih2YXIgcj0wLGk9dC5sZW5ndGgtMSxvPXRbMF0sdT1uZXcgQXJyYXkoaTwwPzA6aSk7cjxpOyl1W3JdPW4obyxvPXRbKytyXSk7cmV0dXJuIHV9LFlzPWZ1bmN0aW9uKHQsbixyKXt2YXIgaSxvLHUsYSxjPXQubGVuZ3RoLHM9bi5sZW5ndGgsZj1uZXcgQXJyYXkoYypzKTtmb3IobnVsbD09ciYmKHI9ZSksaT11PTA7aTxjOysraSlmb3IoYT10W2ldLG89MDtvPHM7KytvLCsrdSlmW3VdPXIoYSxuW29dKTtyZXR1cm4gZn0sQnM9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbjx0Py0xOm4+dD8xOm4+PXQ/MDpOYU59LGpzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dD9OYU46K3R9LEhzPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89MCx1PTAsYT0tMSxjPTA7aWYobnVsbD09bilmb3IoOysrYTxpOylpc05hTihlPWpzKHRbYV0pKXx8KHI9ZS1vLG8rPXIvKytjLHUrPXIqKGUtbykpO2Vsc2UgZm9yKDsrK2E8aTspaXNOYU4oZT1qcyhuKHRbYV0sYSx0KSkpfHwocj1lLW8sbys9ci8rK2MsdSs9ciooZS1vKSk7aWYoYz4xKXJldHVybiB1LyhjLTEpfSxYcz1mdW5jdGlvbih0LG4pe3ZhciBlPUhzKHQsbik7cmV0dXJuIGU/TWF0aC5zcXJ0KGUpOmV9LFZzPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpLG89LTEsdT10Lmxlbmd0aDtpZihudWxsPT1uKXtmb3IoOysrbzx1OylpZihudWxsIT0ocj10W29dKSYmcj49cil7ZT1pPXI7YnJlYWt9Zm9yKDsrK288dTspbnVsbCE9KHI9dFtvXSkmJihlPnImJihlPXIpLGk8ciYmKGk9cikpfWVsc2V7Zm9yKDsrK288dTspaWYobnVsbCE9KHI9bih0W29dLG8sdCkpJiZyPj1yKXtlPWk9cjticmVha31mb3IoOysrbzx1OyludWxsIT0ocj1uKHRbb10sbyx0KSkmJihlPnImJihlPXIpLGk8ciYmKGk9cikpfXJldHVybltlLGldfSxXcz1BcnJheS5wcm90b3R5cGUsJHM9V3Muc2xpY2UsWnM9V3MubWFwLEdzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sSnM9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LFFzPWZ1bmN0aW9uKHQsbixlKXt0PSt0LG49K24sZT0oaT1hcmd1bWVudHMubGVuZ3RoKTwyPyhuPXQsdD0wLDEpOmk8Mz8xOitlO2Zvcih2YXIgcj0tMSxpPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKG4tdCkvZSkpLG89bmV3IEFycmF5KGkpOysrcjxpOylvW3JdPXQrciplO3JldHVybiBvfSxLcz1NYXRoLnNxcnQoNTApLHRmPU1hdGguc3FydCgxMCksbmY9TWF0aC5zcXJ0KDIpLGVmPWZ1bmN0aW9uKHQsbixlKXt2YXIgaT1yKHQsbixlKTtyZXR1cm4gUXMoTWF0aC5jZWlsKHQvaSkqaSxNYXRoLmZsb29yKG4vaSkqaStpLzIsaSl9LHJmPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmNlaWwoTWF0aC5sb2codC5sZW5ndGgpL01hdGguTE4yKSsxfSxvZj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGksbyx1PXQubGVuZ3RoLGE9bmV3IEFycmF5KHUpO2ZvcihpPTA7aTx1OysraSlhW2ldPW4odFtpXSxpLHQpO3ZhciBjPWUoYSkscz1jWzBdLGY9Y1sxXSxsPXIoYSxzLGYpO0FycmF5LmlzQXJyYXkobCl8fChsPWVmKHMsZixsKSk7Zm9yKHZhciBoPWwubGVuZ3RoO2xbMF08PXM7KWwuc2hpZnQoKSwtLWg7Zm9yKDtsW2gtMV0+PWY7KWwucG9wKCksLS1oO3ZhciBwLGQ9bmV3IEFycmF5KGgrMSk7Zm9yKGk9MDtpPD1oOysraSlwPWRbaV09W10scC54MD1pPjA/bFtpLTFdOnMscC54MT1pPGg/bFtpXTpmO2ZvcihpPTA7aTx1OysraSlvPWFbaV0sczw9byYmbzw9ZiYmZFtPcyhsLG8sMCxoKV0ucHVzaCh0W2ldKTtyZXR1cm4gZH12YXIgbj1KcyxlPVZzLHI9cmY7cmV0dXJuIHQudmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpHcyhlKSx0KTpufSx0LmRvbWFpbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkdzKFtuWzBdLG5bMV1dKSx0KTplfSx0LnRocmVzaG9sZHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHcyhBcnJheS5pc0FycmF5KG4pPyRzLmNhbGwobik6biksdCk6cn0sdH0sdWY9ZnVuY3Rpb24odCxuLGUpe2lmKG51bGw9PWUmJihlPWpzKSxyPXQubGVuZ3RoKXtpZigobj0rbik8PTB8fHI8MilyZXR1cm4rZSh0WzBdLDAsdCk7aWYobj49MSlyZXR1cm4rZSh0W3ItMV0sci0xLHQpO3ZhciByLGk9KHItMSkqbixvPU1hdGguZmxvb3IoaSksdT0rZSh0W29dLG8sdCk7cmV0dXJuIHUrKCtlKHRbbysxXSxvKzEsdCktdSkqKGktbyl9fSxhZj1mdW5jdGlvbih0LG4sZSl7cmV0dXJuIHQ9WnMuY2FsbCh0LGpzKS5zb3J0KHFzKSxNYXRoLmNlaWwoKGUtbikvKDIqKHVmKHQsLjc1KS11Zih0LC4yNSkpKk1hdGgucG93KHQubGVuZ3RoLC0xLzMpKSl9LGNmPWZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gTWF0aC5jZWlsKChlLW4pLygzLjUqWHModCkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0sc2Y9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1uKXtmb3IoOysraTxvOylpZihudWxsIT0ocj10W2ldKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7KytpPG87KW51bGwhPShyPXRbaV0pJiZyPmUmJihlPXIpfWVsc2V7Zm9yKDsrK2k8bzspaWYobnVsbCE9KHI9bih0W2ldLGksdCkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK2k8bzspbnVsbCE9KHI9bih0W2ldLGksdCkpJiZyPmUmJihlPXIpfXJldHVybiBlfSxmZj1mdW5jdGlvbih0LG4pe3ZhciBlLHI9MCxpPXQubGVuZ3RoLG89LTEsdT1pO2lmKG51bGw9PW4pZm9yKDsrK288aTspaXNOYU4oZT1qcyh0W29dKSk/LS11OnIrPWU7ZWxzZSBmb3IoOysrbzxpOylpc05hTihlPWpzKG4odFtvXSxvLHQpKSk/LS11OnIrPWU7aWYodSlyZXR1cm4gci91fSxsZj1mdW5jdGlvbih0LG4pe3ZhciBlLHI9W10saT10Lmxlbmd0aCxvPS0xO2lmKG51bGw9PW4pZm9yKDsrK288aTspaXNOYU4oZT1qcyh0W29dKSl8fHIucHVzaChlKTtlbHNlIGZvcig7KytvPGk7KWlzTmFOKGU9anMobih0W29dLG8sdCkpKXx8ci5wdXNoKGUpO3JldHVybiB1ZihyLnNvcnQocXMpLC41KX0saGY9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscixpPXQubGVuZ3RoLG89LTEsdT0wOysrbzxpOyl1Kz10W29dLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkodSk7LS1pPj0wOylmb3Iocj10W2ldLG49ci5sZW5ndGg7LS1uPj0wOyllWy0tdV09cltuXTtyZXR1cm4gZX0scGY9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1uKXtmb3IoOysraTxvOylpZihudWxsIT0ocj10W2ldKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7KytpPG87KW51bGwhPShyPXRbaV0pJiZlPnImJihlPXIpfWVsc2V7Zm9yKDsrK2k8bzspaWYobnVsbCE9KHI9bih0W2ldLGksdCkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK2k8bzspbnVsbCE9KHI9bih0W2ldLGksdCkpJiZlPnImJihlPXIpfXJldHVybiBlfSxkZj1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtuW2VdXTtyZXR1cm4gcn0sdmY9ZnVuY3Rpb24odCxuKXtpZihlPXQubGVuZ3RoKXt2YXIgZSxyLGk9MCxvPTAsdT10W29dO2ZvcihufHwobj1xcyk7KytpPGU7KShuKHI9dFtpXSx1KTwwfHwwIT09bih1LHUpKSYmKHU9cixvPWkpO3JldHVybiAwPT09bih1LHUpP286dm9pZCAwfX0sX2Y9ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89KG51bGw9PWU/dC5sZW5ndGg6ZSktKG49bnVsbD09bj8wOituKTtvOylpPU1hdGgucmFuZG9tKCkqby0tfDAscj10W28rbl0sdFtvK25dPXRbaStuXSx0W2krbl09cjtyZXR1cm4gdH0sZ2Y9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPTAsaT10Lmxlbmd0aCxvPS0xO2lmKG51bGw9PW4pZm9yKDsrK288aTspKGU9K3Rbb10pJiYocis9ZSk7ZWxzZSBmb3IoOysrbzxpOykoZT0rbih0W29dLG8sdCkpJiYocis9ZSk7cmV0dXJuIHJ9LHlmPWZ1bmN0aW9uKHQpe2lmKCEobz10Lmxlbmd0aCkpcmV0dXJuW107Zm9yKHZhciBuPS0xLGU9cGYodCxpKSxyPW5ldyBBcnJheShlKTsrK248ZTspZm9yKHZhciBvLHU9LTEsYT1yW25dPW5ldyBBcnJheShvKTsrK3U8bzspYVt1XT10W3VdW25dO3JldHVybiByfSxtZj1mdW5jdGlvbigpe3JldHVybiB5Zihhcmd1bWVudHMpfSx4Zj1BcnJheS5wcm90b3R5cGUuc2xpY2UsYmY9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHdmPTEsTWY9MixUZj0zLGtmPTQsU2Y9MWUtNixOZj17dmFsdWU6ZnVuY3Rpb24oKXt9fTt2LnByb3RvdHlwZT1kLnByb3RvdHlwZT17Y29uc3RydWN0b3I6dixvbjpmdW5jdGlvbih0LG4pe3ZhciBlLHI9dGhpcy5fLGk9Xyh0KyIiLHIpLG89LTEsdT1pLmxlbmd0aDt7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1uJiYiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrbik7Zm9yKDsrK288dTspaWYoZT0odD1pW29dKS50eXBlKXJbZV09eShyW2VdLHQubmFtZSxuKTtlbHNlIGlmKG51bGw9PW4pZm9yKGUgaW4gcilyW2VdPXkocltlXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK288dTspaWYoKGU9KHQ9aVtvXSkudHlwZSkmJihlPWcocltlXSx0Lm5hbWUpKSlyZXR1cm4gZX19LGNvcHk6ZnVuY3Rpb24oKXt2YXIgdD17fSxuPXRoaXMuXztmb3IodmFyIGUgaW4gbil0W2VdPW5bZV0uc2xpY2UoKTtyZXR1cm4gbmV3IHYodCl9LGNhbGw6ZnVuY3Rpb24odCxuKXtpZigoZT1hcmd1bWVudHMubGVuZ3RoLTIpPjApZm9yKHZhciBlLHIsaT1uZXcgQXJyYXkoZSksbz0wO288ZTsrK28paVtvXT1hcmd1bWVudHNbbysyXTtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2ZvcihyPXRoaXMuX1t0XSxvPTAsZT1yLmxlbmd0aDtvPGU7KytvKXJbb10udmFsdWUuYXBwbHkobixpKX0sYXBwbHk6ZnVuY3Rpb24odCxuLGUpe2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKHZhciByPXRoaXMuX1t0XSxpPTAsbz1yLmxlbmd0aDtpPG87KytpKXJbaV0udmFsdWUuYXBwbHkobixlKX19O3ZhciBFZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsQWY9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOkVmLHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4bWw6Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIn0sQ2Y9ZnVuY3Rpb24odCl7dmFyIG49dCs9IiIsZT1uLmluZGV4T2YoIjoiKTtyZXR1cm4gZT49MCYmInhtbG5zIiE9PShuPXQuc2xpY2UoMCxlKSkmJih0PXQuc2xpY2UoZSsxKSksQWYuaGFzT3duUHJvcGVydHkobik/e3NwYWNlOkFmW25dLGxvY2FsOnR9OnR9LHpmPWZ1bmN0aW9uKHQpe3ZhciBuPUNmKHQpO3JldHVybihuLmxvY2FsP3g6bSkobil9LFBmPTA7dy5wcm90b3R5cGU9Yi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOncsZ2V0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl87IShuIGluIHQpOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHRbbl19LHNldDpmdW5jdGlvbih0LG4pe3JldHVybiB0W3RoaXMuX109bn0scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl8gaW4gdCYmZGVsZXRlIHRbdGhpcy5fXX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07dmFyIFJmPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoZXModCl9fTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KXt2YXIgTGY9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2lmKCFMZi5tYXRjaGVzKXt2YXIgcWY9TGYud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxMZi5tc01hdGNoZXNTZWxlY3Rvcnx8TGYubW96TWF0Y2hlc1NlbGVjdG9yfHxMZi5vTWF0Y2hlc1NlbGVjdG9yO1JmPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBxZi5jYWxsKHRoaXMsdCl9fX19dmFyIFVmPVJmLERmPXt9O2lmKHQuZXZlbnQ9bnVsbCwidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KXsib25tb3VzZWVudGVyImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8KERmPXttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pfXZhciBPZj1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPWsodCsiIiksdT1vLmxlbmd0aDt7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtmb3IoYT1uP046UyxudWxsPT1lJiYoZT0hMSkscj0wO3I8dTsrK3IpdGhpcy5lYWNoKGEob1tyXSxuLGUpKTtyZXR1cm4gdGhpc312YXIgYT10aGlzLm5vZGUoKS5fX29uO2lmKGEpZm9yKHZhciBjLHM9MCxmPWEubGVuZ3RoO3M8ZjsrK3MpZm9yKHI9MCxjPWFbc107cjx1OysrcilpZigoaT1vW3JdKS50eXBlPT09Yy50eXBlJiZpLm5hbWU9PT1jLm5hbWUpcmV0dXJuIGMudmFsdWV9fSxGZj1mdW5jdGlvbigpe2Zvcih2YXIgbixlPXQuZXZlbnQ7bj1lLnNvdXJjZUV2ZW50OyllPW47cmV0dXJuIGV9LElmPWZ1bmN0aW9uKHQsbil7dmFyIGU9dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYoZS5jcmVhdGVTVkdQb2ludCl7dmFyIHI9ZS5jcmVhdGVTVkdQb2ludCgpO3JldHVybiByLng9bi5jbGllbnRYLHIueT1uLmNsaWVudFkscj1yLm1hdHJpeFRyYW5zZm9ybSh0LmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSksW3IueCxyLnldfXZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW24uY2xpZW50WC1pLmxlZnQtdC5jbGllbnRMZWZ0LG4uY2xpZW50WS1pLnRvcC10LmNsaWVudFRvcF19LFlmPWZ1bmN0aW9uKHQpe3ZhciBuPUZmKCk7cmV0dXJuIG4uY2hhbmdlZFRvdWNoZXMmJihuPW4uY2hhbmdlZFRvdWNoZXNbMF0pLElmKHQsbil9LEJmPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P0E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX0samY9ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUJmKHQpKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9bi5sZW5ndGgscj1uZXcgQXJyYXkoZSksaT0wO2k8ZTsrK2kpZm9yKHZhciBvLHUsYT1uW2ldLGM9YS5sZW5ndGgscz1yW2ldPW5ldyBBcnJheShjKSxmPTA7ZjxjOysrZikobz1hW2ZdKSYmKHU9dC5jYWxsKG8sby5fX2RhdGFfXyxmLGEpKSYmKCJfX2RhdGFfXyJpbiBvJiYodS5fX2RhdGFfXz1vLl9fZGF0YV9fKSxzW2ZdPXUpO3JldHVybiBuZXcgZHQocix0aGlzLl9wYXJlbnRzKX0sSGY9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/QzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwodCl9fSxYZj1mdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9SGYodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPVtdLGk9W10sbz0wO288ZTsrK28pZm9yKHZhciB1LGE9bltvXSxjPWEubGVuZ3RoLHM9MDtzPGM7KytzKSh1PWFbc10pJiYoci5wdXNoKHQuY2FsbCh1LHUuX19kYXRhX18scyxhKSksaS5wdXNoKHUpKTtyZXR1cm4gbmV3IGR0KHIsaSl9LFZmPWZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1VZih0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyx1PW5baV0sYT11Lmxlbmd0aCxjPXJbaV09W10scz0wO3M8YTsrK3MpKG89dVtzXSkmJnQuY2FsbChvLG8uX19kYXRhX18scyx1KSYmYy5wdXNoKG8pO3JldHVybiBuZXcgZHQocix0aGlzLl9wYXJlbnRzKX0sV2Y9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9LCRmPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBkdCh0aGlzLl9lbnRlcnx8dGhpcy5fZ3JvdXBzLm1hcChXZiksdGhpcy5fcGFyZW50cyl9O3oucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp6LGFwcGVuZENoaWxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsdGhpcy5fbmV4dCl9LGluc2VydEJlZm9yZTpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsbil9LHF1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHQpfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbCh0KX19O3ZhciBaZj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LEdmPSIkIixKZj1mdW5jdGlvbih0LG4pe2lmKCF0KXJldHVybiBwPW5ldyBBcnJheSh0aGlzLnNpemUoKSkscz0tMSx0aGlzLmVhY2goZnVuY3Rpb24odCl7cFsrK3NdPXR9KSxwO3ZhciBlPW4/UjpQLHI9dGhpcy5fcGFyZW50cyxpPXRoaXMuX2dyb3VwczsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9WmYodCkpO2Zvcih2YXIgbz1pLmxlbmd0aCx1PW5ldyBBcnJheShvKSxhPW5ldyBBcnJheShvKSxjPW5ldyBBcnJheShvKSxzPTA7czxvOysrcyl7dmFyIGY9cltzXSxsPWlbc10saD1sLmxlbmd0aCxwPXQuY2FsbChmLGYmJmYuX19kYXRhX18scyxyKSxkPXAubGVuZ3RoLHY9YVtzXT1uZXcgQXJyYXkoZCksXz11W3NdPW5ldyBBcnJheShkKTtlKGYsbCx2LF8sY1tzXT1uZXcgQXJyYXkoaCkscCxuKTtmb3IodmFyIGcseSxtPTAseD0wO208ZDsrK20paWYoZz12W21dKXtmb3IobT49eCYmKHg9bSsxKTshKHk9X1t4XSkmJisreDxkOyk7Zy5fbmV4dD15fHxudWxsfX1yZXR1cm4gdT1uZXcgZHQodSxyKSx1Ll9lbnRlcj1hLHUuX2V4aXQ9Yyx1fSxRZj1mdW5jdGlvbigpe3JldHVybiBuZXcgZHQodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChXZiksdGhpcy5fcGFyZW50cyl9LEtmPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSx1PW5ldyBBcnJheShyKSxhPTA7YTxvOysrYSlmb3IodmFyIGMscz1uW2FdLGY9ZVthXSxsPXMubGVuZ3RoLGg9dVthXT1uZXcgQXJyYXkobCkscD0wO3A8bDsrK3ApKGM9c1twXXx8ZltwXSkmJihoW3BdPWMpO2Zvcig7YTxyOysrYSl1W2FdPW5bYV07cmV0dXJuIG5ldyBkdCh1LHRoaXMuX3BhcmVudHMpfSx0bD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsbj0tMSxlPXQubGVuZ3RoOysrbjxlOylmb3IodmFyIHIsaT10W25dLG89aS5sZW5ndGgtMSx1PWlbb107LS1vPj0wOykocj1pW29dKSYmKHUmJnUhPT1yLm5leHRTaWJsaW5nJiZ1LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHIsdSksdT1yKTtyZXR1cm4gdGhpc30sbmw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihuLGUpe3JldHVybiBuJiZlP3Qobi5fX2RhdGFfXyxlLl9fZGF0YV9fKTohbi0hZX10fHwodD1MKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLHI9ZS5sZW5ndGgsaT1uZXcgQXJyYXkociksbz0wO288cjsrK28pe2Zvcih2YXIgdSxhPWVbb10sYz1hLmxlbmd0aCxzPWlbb109bmV3IEFycmF5KGMpLGY9MDtmPGM7KytmKSh1PWFbZl0pJiYoc1tmXT11KTtzLnNvcnQobil9cmV0dXJuIG5ldyBkdChpLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGVsPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxybD1mdW5jdGlvbigpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksbj0tMTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dFsrK25dPXRoaXN9KSx0fSxpbD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsbj0wLGU9dC5sZW5ndGg7bjxlOysrbilmb3IodmFyIHI9dFtuXSxpPTAsbz1yLmxlbmd0aDtpPG87KytpKXt2YXIgdT1yW2ldO2lmKHUpcmV0dXJuIHV9cmV0dXJuIG51bGx9LG9sPWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Kyt0fSksdH0sdWw9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LGFsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlmb3IodmFyIGksbz1uW2VdLHU9MCxhPW8ubGVuZ3RoO3U8YTsrK3UpKGk9b1t1XSkmJnQuY2FsbChpLGkuX19kYXRhX18sdSxvKTtyZXR1cm4gdGhpc30sY2w9ZnVuY3Rpb24odCxuKXt2YXIgZT1DZih0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciByPXRoaXMubm9kZSgpO3JldHVybiBlLmxvY2FsP3IuZ2V0QXR0cmlidXRlTlMoZS5zcGFjZSxlLmxvY2FsKTpyLmdldEF0dHJpYnV0ZShlKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1uP2UubG9jYWw/VTpxOiJmdW5jdGlvbiI9PXR5cGVvZiBuP2UubG9jYWw/STpGOmUubG9jYWw/TzpEKShlLG4pKX0sc2w9ZnVuY3Rpb24odCl7cmV0dXJuIHQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx0LmRvY3VtZW50JiZ0fHx0LmRlZmF1bHRWaWV3fSxmbD1mdW5jdGlvbih0LG4sZSl7dmFyIHI7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PW4/WToiZnVuY3Rpb24iPT10eXBlb2Ygbj9qOkIpKHQsbixudWxsPT1lPyIiOmUpKTpzbChyPXRoaXMubm9kZSgpKS5nZXRDb21wdXRlZFN0eWxlKHIsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSh0KX0sbGw9ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9IOiJmdW5jdGlvbiI9PXR5cGVvZiBuP1Y6WCkodCxuKSk6dGhpcy5ub2RlKClbdF19O1oucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtuPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKG4sMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgaGw9ZnVuY3Rpb24odCxuKXt2YXIgZT1XKHQrIiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciByPSQodGhpcy5ub2RlKCkpLGk9LTEsbz1lLmxlbmd0aDsrK2k8bzspaWYoIXIuY29udGFpbnMoZVtpXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIG4/dHQ6bj9ROkspKGUsbikpfSxwbD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9udDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/cnQ6ZXQpKHQpKTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0sZGw9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/aXQ6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3V0Om90KSh0KSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSx2bD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goYXQpfSxfbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goY3QpfSxnbD1mdW5jdGlvbih0KXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnpmKHQpO3JldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwcGVuZENoaWxkKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pfSx5bD1mdW5jdGlvbih0LG4pe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6emYodCkscj1udWxsPT1uP3N0OiJmdW5jdGlvbiI9PXR5cGVvZiBuP246QmYobik7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKGUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfHxudWxsKX0pfSxtbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goZnQpfSx4bD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsdCk6dGhpcy5ub2RlKCkuX19kYXRhX199LGJsPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIG4/cHQ6aHQpKHQsbikpfSx3bD1bbnVsbF07ZHQucHJvdG90eXBlPXZ0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZHQsc2VsZWN0OmpmLHNlbGVjdEFsbDpYZixmaWx0ZXI6VmYsZGF0YTpKZixlbnRlcjokZixleGl0OlFmLG1lcmdlOktmLG9yZGVyOnRsLHNvcnQ6bmwsY2FsbDplbCxub2RlczpybCxub2RlOmlsLHNpemU6b2wsZW1wdHk6dWwsZWFjaDphbCxhdHRyOmNsLHN0eWxlOmZsLHByb3BlcnR5OmxsLGNsYXNzZWQ6aGwsdGV4dDpwbCxodG1sOmRsLHJhaXNlOnZsLGxvd2VyOl9sLGFwcGVuZDpnbCxpbnNlcnQ6eWwscmVtb3ZlOm1sLGRhdHVtOnhsLG9uOk9mLGRpc3BhdGNoOmJsfTt2YXIgTWw9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBkdChbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCldXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IGR0KFtbdF1dLHdsKX0sVGw9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBkdChbZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0KV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyBkdChbbnVsbD09dD9bXTp0XSx3bCl9LGtsPWZ1bmN0aW9uKHQsbixlKXthcmd1bWVudHMubGVuZ3RoPDMmJihlPW4sbj1GZigpLmNoYW5nZWRUb3VjaGVzKTtmb3IodmFyIHIsaT0wLG89bj9uLmxlbmd0aDowO2k8bzsrK2kpaWYoKHI9bltpXSkuaWRlbnRpZmllcj09PWUpcmV0dXJuIElmKHQscik7cmV0dXJuIG51bGx9LFNsPWZ1bmN0aW9uKHQsbil7bnVsbD09biYmKG49RmYoKS50b3VjaGVzKTtmb3IodmFyIGU9MCxyPW4/bi5sZW5ndGg6MCxpPW5ldyBBcnJheShyKTtlPHI7KytlKWlbZV09SWYodCxuW2VdKTtyZXR1cm4gaX0sTmw9ZnVuY3Rpb24oKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX0sRWw9ZnVuY3Rpb24odCl7dmFyIG49dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZT1NbCh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLE5sLCEwKTsib25zZWxlY3RzdGFydCJpbiBuP2Uub24oInNlbGVjdHN0YXJ0LmRyYWciLE5sLCEwKToobi5fX25vc2VsZWN0PW4uc3R5bGUuTW96VXNlclNlbGVjdCxuLnN0eWxlLk1velVzZXJTZWxlY3Q9Im5vbmUiKX0sQWw9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fTt5dC5wcm90b3R5cGUub249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl8ub24uYXBwbHkodGhpcy5fLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT10aGlzLl8/dGhpczp0fTt2YXIgQ2w9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQpe3Qub24oIm1vdXNlZG93bi5kcmFnIixlKS5vbigidG91Y2hzdGFydC5kcmFnIixvKS5vbigidG91Y2htb3ZlLmRyYWciLHUpLm9uKCJ0b3VjaGVuZC5kcmFnIHRvdWNoY2FuY2VsLmRyYWciLGEpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIil9ZnVuY3Rpb24gZSgpe2lmKCFmJiZsLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG49YygibW91c2UiLGguYXBwbHkodGhpcyxhcmd1bWVudHMpLFlmLHRoaXMsYXJndW1lbnRzKTtuJiYoTWwodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWciLHIsITApLm9uKCJtb3VzZXVwLmRyYWciLGksITApLEVsKHQuZXZlbnQudmlldyksX3QoKSxzPSExLG4oInN0YXJ0IikpfX1mdW5jdGlvbiByKCl7TmwoKSxzPSEwLHYubW91c2UoImRyYWciKX1mdW5jdGlvbiBpKCl7TWwodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnIixudWxsKSxndCh0LmV2ZW50LnZpZXcscyksTmwoKSx2Lm1vdXNlKCJlbmQiKX1mdW5jdGlvbiBvKCl7aWYobC5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9aC5hcHBseSh0aGlzLGFyZ3VtZW50cyksbz1yLmxlbmd0aDtmb3Iobj0wO248bzsrK24pKGU9YyhyW25dLmlkZW50aWZpZXIsaSxrbCx0aGlzLGFyZ3VtZW50cykpJiYoX3QoKSxlKCJzdGFydCIpKX19ZnVuY3Rpb24gdSgpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKG49MDtuPGk7KytuKShlPXZbcltuXS5pZGVudGlmaWVyXSkmJihObCgpLGUoImRyYWciKSl9ZnVuY3Rpb24gYSgpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKGYmJmNsZWFyVGltZW91dChmKSxmPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtmPW51bGx9LDUwMCksCm49MDtuPGk7KytuKShlPXZbcltuXS5pZGVudGlmaWVyXSkmJihfdCgpLGUoImVuZCIpKX1mdW5jdGlvbiBjKGUscixpLG8sdSl7dmFyIGEsYyxzLGY9aShyLGUpLGw9Xy5jb3B5KCk7aWYoRShuZXcgeXQobiwiYmVmb3Jlc3RhcnQiLGEsZSxnLGZbMF0sZlsxXSwwLDAsbCksZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9KHQuZXZlbnQuc3ViamVjdD1hPXAuYXBwbHkobyx1KSkmJihjPWEueC1mWzBdfHwwLHM9YS55LWZbMV18fDAsITApfSkpcmV0dXJuIGZ1bmN0aW9uIHQoaCl7dmFyIHAsZD1mO3N3aXRjaChoKXtjYXNlInN0YXJ0Ijp2W2VdPXQscD1nKys7YnJlYWs7Y2FzZSJlbmQiOmRlbGV0ZSB2W2VdLC0tZztjYXNlImRyYWciOmY9aShyLGUpLHA9Z31FKG5ldyB5dChuLGgsYSxlLHAsZlswXStjLGZbMV0rcyxmWzBdLWRbMF0sZlsxXS1kWzFdLGwpLGwuYXBwbHksbCxbaCxvLHVdKX19dmFyIHMsZixsPW10LGg9eHQscD1idCx2PXt9LF89ZCgic3RhcnQiLCJkcmFnIiwiZW5kIiksZz0wO3JldHVybiBuLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkFsKCEhdCksbik6bH0sbi5jb250YWluZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBbCh0KSxuKTpofSxuLnN1YmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBbCh0KSxuKTpwfSxuLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9Xy5vbi5hcHBseShfLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1fP246dH0sbn0semw9ZnVuY3Rpb24odCxuLGUpe3QucHJvdG90eXBlPW4ucHJvdG90eXBlPWUsZS5jb25zdHJ1Y3Rvcj10fSxQbD0uNyxSbD0xL1BsLExsPSJcXHMqKFsrLV0/XFxkKylcXHMqIixxbD0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixVbD0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsRGw9L14jKFswLTlhLWZdezN9KSQvLE9sPS9eIyhbMC05YS1mXXs2fSkkLyxGbD1uZXcgUmVnRXhwKCJecmdiXFwoIitbTGwsTGwsTGxdKyJcXCkkIiksSWw9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW1VsLFVsLFVsXSsiXFwpJCIpLFlsPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbTGwsTGwsTGwscWxdKyJcXCkkIiksQmw9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tVbCxVbCxVbCxxbF0rIlxcKSQiKSxqbD1uZXcgUmVnRXhwKCJeaHNsXFwoIitbcWwsVWwsVWxdKyJcXCkkIiksSGw9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1txbCxVbCxVbCxxbF0rIlxcKSQiKSxYbD17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTt6bChNdCxUdCx7ZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpKyIifX0pLHpsKEF0LEV0LHd0KE10LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P1JsOk1hdGgucG93KFJsLHQpLG5ldyBBdCh0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9QbDpNYXRoLnBvdyhQbCx0KSxuZXcgQXQodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PXRoaXMuciYmdGhpcy5yPD0yNTUmJjA8PXRoaXMuZyYmdGhpcy5nPD0yNTUmJjA8PXRoaXMuYiYmdGhpcy5iPD0yNTUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSx0b1N0cmluZzpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3BhY2l0eTtyZXR1cm4gdD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksKDE9PT10PyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksemwoUnQsUHQsd3QoTXQse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Umw6TWF0aC5wb3coUmwsdCksbmV3IFJ0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/UGw6TWF0aC5wb3coUGwsdCksbmV3IFJ0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5oJTM2MCszNjAqKHRoaXMuaDwwKSxuPWlzTmFOKHQpfHxpc05hTih0aGlzLnMpPzA6dGhpcy5zLGU9dGhpcy5sLHI9ZSsoZTwuNT9lOjEtZSkqbixpPTIqZS1yO3JldHVybiBuZXcgQXQoTHQodD49MjQwP3QtMjQwOnQrMTIwLGksciksTHQodCxpLHIpLEx0KHQ8MTIwP3QrMjQwOnQtMTIwLGksciksdGhpcy5vcGFjaXR5KX0sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4oMDw9dGhpcy5zJiZ0aGlzLnM8PTF8fGlzTmFOKHRoaXMucykpJiYwPD10aGlzLmwmJnRoaXMubDw9MSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9fSkpO3ZhciBWbD1NYXRoLlBJLzE4MCxXbD0xODAvTWF0aC5QSSwkbD0xOCxabD0uOTUwNDcsR2w9MSxKbD0xLjA4ODgzLFFsPTQvMjksS2w9Ni8yOSx0aD0zKktsKktsLG5oPUtsKktsKktsO3psKER0LFV0LHd0KE10LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IER0KHRoaXMubCskbCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRHQodGhpcy5sLSRsKihudWxsPT10PzE6dCksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD0odGhpcy5sKzE2KS8xMTYsbj1pc05hTih0aGlzLmEpP3Q6dCt0aGlzLmEvNTAwLGU9aXNOYU4odGhpcy5iKT90OnQtdGhpcy5iLzIwMDtyZXR1cm4gdD1HbCpGdCh0KSxuPVpsKkZ0KG4pLGU9SmwqRnQoZSksbmV3IEF0KEl0KDMuMjQwNDU0MipuLTEuNTM3MTM4NSp0LS40OTg1MzE0KmUpLEl0KC0uOTY5MjY2Km4rMS44NzYwMTA4KnQrLjA0MTU1NiplKSxJdCguMDU1NjQzNCpuLS4yMDQwMjU5KnQrMS4wNTcyMjUyKmUpLHRoaXMub3BhY2l0eSl9fSkpLHpsKEh0LGp0LHd0KE10LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEh0KHRoaXMuaCx0aGlzLmMsdGhpcy5sKyRsKihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgSHQodGhpcy5oLHRoaXMuYyx0aGlzLmwtJGwqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gcXQodGhpcykucmdiKCl9fSkpO3ZhciBlaD0tLjE0ODYxLHJoPTEuNzgyNzcsaWg9LS4yOTIyNyxvaD0tLjkwNjQ5LHVoPTEuOTcyOTQsYWg9dWgqb2gsY2g9dWgqcmgsc2g9cmgqaWgtb2gqZWg7emwoV3QsVnQsd3QoTXQse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Umw6TWF0aC5wb3coUmwsdCksbmV3IFd0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/UGw6TWF0aC5wb3coUGwsdCksbmV3IFd0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9aXNOYU4odGhpcy5oKT8wOih0aGlzLmgrMTIwKSpWbCxuPSt0aGlzLmwsZT1pc05hTih0aGlzLnMpPzA6dGhpcy5zKm4qKDEtbikscj1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpO3JldHVybiBuZXcgQXQoMjU1KihuK2UqKGVoKnIrcmgqaSkpLDI1NSoobitlKihpaCpyK29oKmkpKSwyNTUqKG4rZSoodWgqcikpLHRoaXMub3BhY2l0eSl9fSkpO3ZhciBmaCxsaCxoaCxwaCxkaCx2aCxfaD1mdW5jdGlvbih0KXt2YXIgbj10Lmxlbmd0aC0xO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1lPD0wP2U9MDplPj0xPyhlPTEsbi0xKTpNYXRoLmZsb29yKGUqbiksaT10W3JdLG89dFtyKzFdO3JldHVybiAkdCgoZS1yL24pKm4scj4wP3Rbci0xXToyKmktbyxpLG8scjxuLTE/dFtyKzJdOjIqby1pKX19LGdoPWZ1bmN0aW9uKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1NYXRoLmZsb29yKCgoZSU9MSk8MD8rK2U6ZSkqbik7cmV0dXJuICR0KChlLXIvbikqbix0WyhyK24tMSklbl0sdFtyJW5dLHRbKHIrMSklbl0sdFsocisyKSVuXSl9fSx5aD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LG1oPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LG4pe3ZhciBlPXIoKHQ9RXQodCkpLnIsKG49RXQobikpLnIpLGk9cih0Lmcsbi5nKSxvPXIodC5iLG4uYiksdT1LdCh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQucj1lKG4pLHQuZz1pKG4pLHQuYj1vKG4pLHQub3BhY2l0eT11KG4pLHQrIiJ9fXZhciByPVF0KG4pO3JldHVybiBlLmdhbW1hPXQsZX0oMSkseGg9dG4oX2gpLGJoPXRuKGdoKSx3aD1mdW5jdGlvbih0LG4pe3ZhciBlLHI9bj9uLmxlbmd0aDowLGk9dD9NYXRoLm1pbihyLHQubGVuZ3RoKTowLG89bmV3IEFycmF5KHIpLHU9bmV3IEFycmF5KHIpO2ZvcihlPTA7ZTxpOysrZSlvW2VdPUFoKHRbZV0sbltlXSk7Zm9yKDtlPHI7KytlKXVbZV09bltlXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGU9MDtlPGk7KytlKXVbZV09b1tlXSh0KTtyZXR1cm4gdX19LE1oPWZ1bmN0aW9uKHQsbil7dmFyIGU9bmV3IERhdGU7cmV0dXJuIHQ9K3Qsbi09dCxmdW5jdGlvbihyKXtyZXR1cm4gZS5zZXRUaW1lKHQrbipyKSxlfX0sVGg9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdD0rdCxuLT10LGZ1bmN0aW9uKGUpe3JldHVybiB0K24qZX19LGtoPWZ1bmN0aW9uKHQsbil7dmFyIGUscj17fSxpPXt9O251bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHR8fCh0PXt9KSxudWxsIT09biYmIm9iamVjdCI9PXR5cGVvZiBufHwobj17fSk7Zm9yKGUgaW4gbillIGluIHQ/cltlXT1BaCh0W2VdLG5bZV0pOmlbZV09bltlXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGUgaW4gcilpW2VdPXJbZV0odCk7cmV0dXJuIGl9fSxTaD0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csTmg9bmV3IFJlZ0V4cChTaC5zb3VyY2UsImciKSxFaD1mdW5jdGlvbih0LG4pe3ZhciBlLHIsaSxvPVNoLmxhc3RJbmRleD1OaC5sYXN0SW5kZXg9MCx1PS0xLGE9W10sYz1bXTtmb3IodCs9IiIsbis9IiI7KGU9U2guZXhlYyh0KSkmJihyPU5oLmV4ZWMobikpOykoaT1yLmluZGV4KT5vJiYoaT1uLnNsaWNlKG8saSksYVt1XT9hW3VdKz1pOmFbKyt1XT1pKSwoZT1lWzBdKT09PShyPXJbMF0pP2FbdV0/YVt1XSs9cjphWysrdV09cjooYVsrK3VdPW51bGwsYy5wdXNoKHtpOnUseDpUaChlLHIpfSkpLG89TmgubGFzdEluZGV4O3JldHVybiBvPG4ubGVuZ3RoJiYoaT1uLnNsaWNlKG8pLGFbdV0/YVt1XSs9aTphWysrdV09aSksYS5sZW5ndGg8Mj9jWzBdP2VuKGNbMF0ueCk6bm4obik6KG49Yy5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciBlLHI9MDtyPG47KytyKWFbKGU9Y1tyXSkuaV09ZS54KHQpO3JldHVybiBhLmpvaW4oIiIpfSl9LEFoPWZ1bmN0aW9uKHQsbil7dmFyIGUscj10eXBlb2YgbjtyZXR1cm4gbnVsbD09bnx8ImJvb2xlYW4iPT09cj95aChuKTooIm51bWJlciI9PT1yP1RoOiJzdHJpbmciPT09cj8oZT1UdChuKSk/KG49ZSxtaCk6RWg6biBpbnN0YW5jZW9mIFR0P21oOm4gaW5zdGFuY2VvZiBEYXRlP01oOkFycmF5LmlzQXJyYXkobik/d2g6aXNOYU4obik/a2g6VGgpKHQsbil9LENoPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9K3Qsbi09dCxmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5yb3VuZCh0K24qZSl9fSx6aD0xODAvTWF0aC5QSSxQaD17dHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MCxyb3RhdGU6MCxza2V3WDowLHNjYWxlWDoxLHNjYWxlWToxfSxSaD1mdW5jdGlvbih0LG4sZSxyLGksbyl7dmFyIHUsYSxjO3JldHVybih1PU1hdGguc3FydCh0KnQrbipuKSkmJih0Lz11LG4vPXUpLChjPXQqZStuKnIpJiYoZS09dCpjLHItPW4qYyksKGE9TWF0aC5zcXJ0KGUqZStyKnIpKSYmKGUvPWEsci89YSxjLz1hKSx0KnI8biplJiYodD0tdCxuPS1uLGM9LWMsdT0tdSkse3RyYW5zbGF0ZVg6aSx0cmFuc2xhdGVZOm8scm90YXRlOk1hdGguYXRhbjIobix0KSp6aCxza2V3WDpNYXRoLmF0YW4oYykqemgsc2NhbGVYOnUsc2NhbGVZOmF9fSxMaD11bihybiwicHgsICIsInB4KSIsImRlZykiKSxxaD11bihvbiwiLCAiLCIpIiwiKSIpLFVoPU1hdGguU1FSVDIsRGg9MixPaD00LEZoPTFlLTEyLEloPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXRbMF0sbz10WzFdLHU9dFsyXSxhPW5bMF0sYz1uWzFdLHM9blsyXSxmPWEtaSxsPWMtbyxoPWYqZitsKmw7aWYoaDxGaClyPU1hdGgubG9nKHMvdSkvVWgsZT1mdW5jdGlvbih0KXtyZXR1cm5baSt0KmYsbyt0KmwsdSpNYXRoLmV4cChVaCp0KnIpXX07ZWxzZXt2YXIgcD1NYXRoLnNxcnQoaCksZD0ocypzLXUqdStPaCpoKS8oMip1KkRoKnApLHY9KHMqcy11KnUtT2gqaCkvKDIqcypEaCpwKSxfPU1hdGgubG9nKE1hdGguc3FydChkKmQrMSktZCk7cj0oTWF0aC5sb2coTWF0aC5zcXJ0KHYqdisxKS12KS1fKS9VaCxlPWZ1bmN0aW9uKHQpe3ZhciBuPXQqcixlPWFuKF8pLGE9dS8oRGgqcCkqKGUqc24oVWgqbitfKS1jbihfKSk7cmV0dXJuW2krYSpmLG8rYSpsLHUqZS9hbihVaCpuK18pXX19cmV0dXJuIGUuZHVyYXRpb249MWUzKnIsZX0sWWg9Zm4oSnQpLEJoPWZuKEt0KSxqaD1obihKdCksSGg9aG4oS3QpLFhoPXBuKEp0KSxWaD1wbihLdCksV2g9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWVbcl09dChyLyhuLTEpKTtyZXR1cm4gZX0sJGg9MCxaaD0wLEdoPTAsSmg9MWUzLFFoPTAsS2g9MCx0cD0wLG5wPSJvYmplY3QiPT10eXBlb2YgcGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZTpEYXRlLGVwPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU/cmVxdWVzdEFuaW1hdGlvbkZyYW1lOmZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNyl9O19uLnByb3RvdHlwZT1nbi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOl9uLHJlc3RhcnQ6ZnVuY3Rpb24odCxuLGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7ZT0obnVsbD09ZT9kbigpOitlKSsobnVsbD09bj8wOituKSx0aGlzLl9uZXh0fHx2aD09PXRoaXN8fCh2aD92aC5fbmV4dD10aGlzOmRoPXRoaXMsdmg9dGhpcyksdGhpcy5fY2FsbD10LHRoaXMuX3RpbWU9ZSx3bigpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5fY2FsbCYmKHRoaXMuX2NhbGw9bnVsbCx0aGlzLl90aW1lPTEvMCx3bigpKX19O3ZhciBycD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IF9uO3JldHVybiBuPW51bGw9PW4/MDorbixyLnJlc3RhcnQoZnVuY3Rpb24oZSl7ci5zdG9wKCksdChlK24pfSxuLGUpLHJ9LGlwPWZ1bmN0aW9uKHQsbixlKXt2YXIgcj1uZXcgX24saT1uO3JldHVybiBudWxsPT1uPyhyLnJlc3RhcnQodCxuLGUpLHIpOihuPStuLGU9bnVsbD09ZT9kbigpOitlLHIucmVzdGFydChmdW5jdGlvbiBvKHUpe3UrPWksci5yZXN0YXJ0KG8saSs9bixlKSx0KHUpfSxuLGUpLHIpfSxvcD1kKCJzdGFydCIsImVuZCIsImludGVycnVwdCIpLHVwPVtdLGFwPTAsY3A9MSxzcD0yLGZwPTMsbHA9NCxocD01LHBwPTYsZHA9ZnVuY3Rpb24odCxuLGUscixpLG8pe3ZhciB1PXQuX190cmFuc2l0aW9uO2lmKHUpe2lmKGUgaW4gdSlyZXR1cm59ZWxzZSB0Ll9fdHJhbnNpdGlvbj17fTtTbih0LGUse25hbWU6bixpbmRleDpyLGdyb3VwOmksb246b3AsdHdlZW46dXAsdGltZTpvLnRpbWUsZGVsYXk6by5kZWxheSxkdXJhdGlvbjpvLmR1cmF0aW9uLGVhc2U6by5lYXNlLHRpbWVyOm51bGwsc3RhdGU6YXB9KX0sdnA9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGksbz10Ll9fdHJhbnNpdGlvbix1PSEwO2lmKG8pe249bnVsbD09bj9udWxsOm4rIiI7Zm9yKGkgaW4gbykoZT1vW2ldKS5uYW1lPT09bj8ocj1lLnN0YXRlPnNwJiZlLnN0YXRlPGhwLGUuc3RhdGU9cHAsZS50aW1lci5zdG9wKCksciYmZS5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLGRlbGV0ZSBvW2ldKTp1PSExO3UmJmRlbGV0ZSB0Ll9fdHJhbnNpdGlvbn19LF9wPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2cCh0aGlzLHQpfSl9LGdwPWZ1bmN0aW9uKHQsbil7dmFyIGU9dGhpcy5faWQ7aWYodCs9IiIsYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodmFyIHIsaT1rbih0aGlzLm5vZGUoKSxlKS50d2VlbixvPTAsdT1pLmxlbmd0aDtvPHU7KytvKWlmKChyPWlbb10pLm5hbWU9PT10KXJldHVybiByLnZhbHVlO3JldHVybiBudWxsfXJldHVybiB0aGlzLmVhY2goKG51bGw9PW4/Tm46RW4pKGUsdCxuKSl9LHlwPWZ1bmN0aW9uKHQsbil7dmFyIGU7cmV0dXJuKCJudW1iZXIiPT10eXBlb2Ygbj9UaDpuIGluc3RhbmNlb2YgVHQ/bWg6KGU9VHQobikpPyhuPWUsbWgpOkVoKSh0LG4pfSxtcD1mdW5jdGlvbih0LG4pe3ZhciBlPUNmKHQpLHI9InRyYW5zZm9ybSI9PT1lP3FoOnlwO3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBuPyhlLmxvY2FsP3FuOkxuKShlLHIsQW4odGhpcywiYXR0ci4iK3QsbikpOm51bGw9PW4/KGUubG9jYWw/em46Q24pKGUpOihlLmxvY2FsP1JuOlBuKShlLHIsbikpfSx4cD1mdW5jdGlvbih0LG4pe3ZhciBlPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7dmFyIHI9Q2YodCk7cmV0dXJuIHRoaXMudHdlZW4oZSwoci5sb2NhbD9VbjpEbikocixuKSl9LGJwPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/T246Rm4pKG4sdCkpOmtuKHRoaXMubm9kZSgpLG4pLmRlbGF5fSx3cD1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiB0P0luOlluKShuLHQpKTprbih0aGlzLm5vZGUoKSxuKS5kdXJhdGlvbn0sTXA9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKEJuKG4sdCkpOmtuKHRoaXMubm9kZSgpLG4pLmVhc2V9LFRwPWZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1VZih0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyx1PW5baV0sYT11Lmxlbmd0aCxjPXJbaV09W10scz0wO3M8YTsrK3MpKG89dVtzXSkmJnQuY2FsbChvLG8uX19kYXRhX18scyx1KSYmYy5wdXNoKG8pO3JldHVybiBuZXcgS24ocix0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxrcD1mdW5jdGlvbih0KXtpZih0Ll9pZCE9PXRoaXMuX2lkKXRocm93IG5ldyBFcnJvcjtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9dC5fZ3JvdXBzLHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxvPU1hdGgubWluKHIsaSksdT1uZXcgQXJyYXkociksYT0wO2E8bzsrK2EpZm9yKHZhciBjLHM9blthXSxmPWVbYV0sbD1zLmxlbmd0aCxoPXVbYV09bmV3IEFycmF5KGwpLHA9MDtwPGw7KytwKShjPXNbcF18fGZbcF0pJiYoaFtwXT1jKTtmb3IoO2E8cjsrK2EpdVthXT1uW2FdO3JldHVybiBuZXcgS24odSx0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxTcD1mdW5jdGlvbih0LG4pe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/a24odGhpcy5ub2RlKCksZSkub24ub24odCk6dGhpcy5lYWNoKEhuKGUsdCxuKSl9LE5wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub24oImVuZC5yZW1vdmUiLFhuKHRoaXMuX2lkKSl9LEVwPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25hbWUsZT10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9QmYodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPW5ldyBBcnJheShpKSx1PTA7dTxpOysrdSlmb3IodmFyIGEsYyxzPXJbdV0sZj1zLmxlbmd0aCxsPW9bdV09bmV3IEFycmF5KGYpLGg9MDtoPGY7KytoKShhPXNbaF0pJiYoYz10LmNhbGwoYSxhLl9fZGF0YV9fLGgscykpJiYoIl9fZGF0YV9fImluIGEmJihjLl9fZGF0YV9fPWEuX19kYXRhX18pLGxbaF09YyxkcChsW2hdLG4sZSxoLGwsa24oYSxlKSkpO3JldHVybiBuZXcgS24obyx0aGlzLl9wYXJlbnRzLG4sZSl9LEFwPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25hbWUsZT10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9SGYodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPVtdLHU9W10sYT0wO2E8aTsrK2EpZm9yKHZhciBjLHM9clthXSxmPXMubGVuZ3RoLGw9MDtsPGY7KytsKWlmKGM9c1tsXSl7Zm9yKHZhciBoLHA9dC5jYWxsKGMsYy5fX2RhdGFfXyxsLHMpLGQ9a24oYyxlKSx2PTAsXz1wLmxlbmd0aDt2PF87Kyt2KShoPXBbdl0pJiZkcChoLG4sZSx2LHAsZCk7by5wdXNoKHApLHUucHVzaChjKX1yZXR1cm4gbmV3IEtuKG8sdSxuLGUpfSxDcD12dC5wcm90b3R5cGUuY29uc3RydWN0b3IsenA9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IENwKHRoaXMuX2dyb3Vwcyx0aGlzLl9wYXJlbnRzKX0sUHA9ZnVuY3Rpb24odCxuLGUpe3ZhciByPSJ0cmFuc2Zvcm0iPT0odCs9IiIpP0xoOnlwO3JldHVybiBudWxsPT1uP3RoaXMuc3R5bGVUd2Vlbih0LFZuKHQscikpLm9uKCJlbmQuc3R5bGUuIit0LFduKHQpKTp0aGlzLnN0eWxlVHdlZW4odCwiZnVuY3Rpb24iPT10eXBlb2Ygbj9abih0LHIsQW4odGhpcywic3R5bGUuIit0LG4pKTokbih0LHIsbiksZSl9LFJwPWZ1bmN0aW9uKHQsbixlKXt2YXIgcj0ic3R5bGUuIisodCs9IiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4ocj10aGlzLnR3ZWVuKHIpKSYmci5fdmFsdWU7aWYobnVsbD09bilyZXR1cm4gdGhpcy50d2VlbihyLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy50d2VlbihyLEduKHQsbixudWxsPT1lPyIiOmUpKX0sTHA9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudHdlZW4oInRleHQiLCJmdW5jdGlvbiI9PXR5cGVvZiB0P1FuKEFuKHRoaXMsInRleHQiLHQpKTpKbihudWxsPT10PyIiOnQrIiIpKX0scXA9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fbmFtZSxuPXRoaXMuX2lkLGU9bmUoKSxyPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89MDtvPGk7KytvKWZvcih2YXIgdSxhPXJbb10sYz1hLmxlbmd0aCxzPTA7czxjOysrcylpZih1PWFbc10pe3ZhciBmPWtuKHUsbik7ZHAodSx0LGUscyxhLHt0aW1lOmYudGltZStmLmRlbGF5K2YuZHVyYXRpb24sZGVsYXk6MCxkdXJhdGlvbjpmLmR1cmF0aW9uLGVhc2U6Zi5lYXNlfSl9cmV0dXJuIG5ldyBLbihyLHRoaXMuX3BhcmVudHMsdCxlKX0sVXA9MCxEcD12dC5wcm90b3R5cGU7S24ucHJvdG90eXBlPXRlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6S24sc2VsZWN0OkVwLHNlbGVjdEFsbDpBcCxmaWx0ZXI6VHAsbWVyZ2U6a3Asc2VsZWN0aW9uOnpwLHRyYW5zaXRpb246cXAsY2FsbDpEcC5jYWxsLG5vZGVzOkRwLm5vZGVzLG5vZGU6RHAubm9kZSxzaXplOkRwLnNpemUsZW1wdHk6RHAuZW1wdHksZWFjaDpEcC5lYWNoLG9uOlNwLGF0dHI6bXAsYXR0clR3ZWVuOnhwLHN0eWxlOlBwLHN0eWxlVHdlZW46UnAsdGV4dDpMcCxyZW1vdmU6TnAsdHdlZW46Z3AsZGVsYXk6YnAsZHVyYXRpb246d3AsZWFzZTpNcH07dmFyIE9wPTMsRnA9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfXJldHVybiBuPStuLGUuZXhwb25lbnQ9dCxlfShPcCksSXA9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oT3ApLFlwPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4oKHQqPTIpPD0xP01hdGgucG93KHQsbik6Mi1NYXRoLnBvdygyLXQsbikpLzJ9cmV0dXJuIG49K24sZS5leHBvbmVudD10LGV9KE9wKSxCcD1NYXRoLlBJLGpwPUJwLzIsSHA9NC8xMSxYcD02LzExLFZwPTgvMTEsV3A9Ljc1LCRwPTkvMTEsWnA9MTAvMTEsR3A9LjkzNzUsSnA9MjEvMjIsUXA9NjMvNjQsS3A9MS9IcC9IcCx0ZD0xLjcwMTU4LG5kPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCp0KigobisxKSp0LW4pfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0odGQpLGVkPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4tLXQqdCooKG4rMSkqdCtuKSsxfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0odGQpLHJkPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4oKHQqPTIpPDE/dCp0KigobisxKSp0LW4pOih0LT0yKSp0KigobisxKSp0K24pKzIpLzJ9cmV0dXJuIG49K24sZS5vdmVyc2hvb3Q9dCxlfSh0ZCksaWQ9MipNYXRoLlBJLG9kPTEsdWQ9LjMsYWQ9ZnVuY3Rpb24gdChuLGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIG4qTWF0aC5wb3coMiwxMCotLXQpKk1hdGguc2luKChpLXQpL2UpfXZhciBpPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89aWQpO3JldHVybiByLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqaWQpfSxyLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxyfShvZCx1ZCksY2Q9ZnVuY3Rpb24gdChuLGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIDEtbipNYXRoLnBvdygyLC0xMCoodD0rdCkpKk1hdGguc2luKCh0K2kpL2UpfXZhciBpPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89aWQpO3JldHVybiByLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqaWQpfSxyLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxyfShvZCx1ZCksc2Q9ZnVuY3Rpb24gdChuLGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuKCh0PTIqdC0xKTwwP24qTWF0aC5wb3coMiwxMCp0KSpNYXRoLnNpbigoaS10KS9lKToyLW4qTWF0aC5wb3coMiwtMTAqdCkqTWF0aC5zaW4oKGkrdCkvZSkpLzJ9dmFyIGk9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz1pZCk7cmV0dXJuIHIuYW1wbGl0dWRlPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4sZSppZCl9LHIucGVyaW9kPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4sZSl9LHJ9KG9kLHVkKSxmZD17dGltZTpudWxsLGRlbGF5OjAsZHVyYXRpb246MjUwLGVhc2U6Y2V9LGxkPWZ1bmN0aW9uKHQpe3ZhciBuLGU7dCBpbnN0YW5jZW9mIEtuPyhuPXQuX2lkLHQ9dC5fbmFtZSk6KG49bmUoKSwoZT1mZCkudGltZT1kbigpLHQ9bnVsbD09dD9udWxsOnQrIiIpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPTA7bzxpOysrbylmb3IodmFyIHUsYT1yW29dLGM9YS5sZW5ndGgscz0wO3M8YzsrK3MpKHU9YVtzXSkmJmRwKHUsdCxuLHMsYSxlfHxiZSh1LG4pKTtyZXR1cm4gbmV3IEtuKHIsdGhpcy5fcGFyZW50cyx0LG4pfTt2dC5wcm90b3R5cGUuaW50ZXJydXB0PV9wLHZ0LnByb3RvdHlwZS50cmFuc2l0aW9uPWxkO3ZhciBoZD1bbnVsbF0scGQ9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9dC5fX3RyYW5zaXRpb247aWYoaSl7bj1udWxsPT1uP251bGw6bisiIjtmb3IociBpbiBpKWlmKChlPWlbcl0pLnN0YXRlPmNwJiZlLm5hbWU9PT1uKXJldHVybiBuZXcgS24oW1t0XV0saGQsbiwrcil9cmV0dXJuIG51bGx9LGRkPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sdmQ9ZnVuY3Rpb24odCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy5zZWxlY3Rpb249ZX0sX2Q9ZnVuY3Rpb24oKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX0sZ2Q9e25hbWU6ImRyYWcifSx5ZD17bmFtZToic3BhY2UifSxtZD17bmFtZToiaGFuZGxlIn0seGQ9e25hbWU6ImNlbnRlciJ9LGJkPXtuYW1lOiJ4IixoYW5kbGVzOlsiZSIsInciXS5tYXAoTWUpLGlucHV0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQmJltbdFswXSxuWzBdWzFdXSxbdFsxXSxuWzFdWzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMF0sdFsxXVswXV19fSx3ZD17bmFtZToieSIsaGFuZGxlczpbIm4iLCJzIl0ubWFwKE1lKSxpbnB1dDpmdW5jdGlvbih0LG4pe3JldHVybiB0JiZbW25bMF1bMF0sdFswXV0sW25bMV1bMF0sdFsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzFdLHRbMV1bMV1dfX0sTWQ9e25hbWU6Inh5IixoYW5kbGVzOlsibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0ubWFwKE1lKSxpbnB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fX0sVGQ9e292ZXJsYXk6ImNyb3NzaGFpciIsc2VsZWN0aW9uOiJtb3ZlIixuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LGtkPXtlOiJ3Iix3OiJlIixudzoibmUiLG5lOiJudyIsc2U6InN3Iixzdzoic2UifSxTZD17bjoicyIsczoibiIsbnc6InN3IixuZToic2UiLHNlOiJuZSIsc3c6Im53In0sTmQ9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOm51bGwsZToxLHM6bnVsbCx3Oi0xLG53Oi0xLG5lOjEsc2U6MSxzdzotMX0sRWQ9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOi0xLGU6bnVsbCxzOjEsdzpudWxsLG53Oi0xLG5lOi0xLHNlOjEsc3c6MX0sQWQ9ZnVuY3Rpb24oKXtyZXR1cm4gemUoTWQpfSxDZD1NYXRoLmNvcyx6ZD1NYXRoLnNpbixQZD1NYXRoLlBJLFJkPVBkLzIsTGQ9MipQZCxxZD1NYXRoLm1heCxVZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG8sdSxhLGMscyxmLGw9dC5sZW5ndGgsaD1bXSxwPVFzKGwpLGQ9W10sdj1bXSxfPXYuZ3JvdXBzPW5ldyBBcnJheShsKSxnPW5ldyBBcnJheShsKmwpO2ZvcihvPTAscz0tMTsrK3M8bDspe2Zvcih1PTAsZj0tMTsrK2Y8bDspdSs9dFtzXVtmXTtoLnB1c2godSksZC5wdXNoKFFzKGwpKSxvKz11fWZvcihlJiZwLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gZShoW3RdLGhbbl0pfSksciYmZC5mb3JFYWNoKGZ1bmN0aW9uKG4sZSl7bi5zb3J0KGZ1bmN0aW9uKG4saSl7cmV0dXJuIHIodFtlXVtuXSx0W2VdW2ldKX0pfSksbz1xZCgwLExkLW4qbCkvbyxjPW8/bjpMZC9sLHU9MCxzPS0xOysrczxsOyl7Zm9yKGE9dSxmPS0xOysrZjxsOyl7dmFyIHk9cFtzXSxtPWRbeV1bZl0seD10W3ldW21dLGI9dSx3PXUrPXgqbztnW20qbCt5XT17aW5kZXg6eSxzdWJpbmRleDptLHN0YXJ0QW5nbGU6YixlbmRBbmdsZTp3LHZhbHVlOnh9fV9beV09e2luZGV4Onksc3RhcnRBbmdsZTphLGVuZEFuZ2xlOnUsdmFsdWU6aFt5XX0sdSs9Y31mb3Iocz0tMTsrK3M8bDspZm9yKGY9cy0xOysrZjxsOyl7dmFyIE09Z1tmKmwrc10sVD1nW3MqbCtmXTsoTS52YWx1ZXx8VC52YWx1ZSkmJnYucHVzaChNLnZhbHVlPFQudmFsdWU/e3NvdXJjZTpULHRhcmdldDpNfTp7c291cmNlOk0sdGFyZ2V0OlR9KX1yZXR1cm4gaT92LnNvcnQoaSk6dn12YXIgbj0wLGU9bnVsbCxyPW51bGwsaT1udWxsO3JldHVybiB0LnBhZEFuZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXFkKDAsZSksdCk6bn0sdC5zb3J0R3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdC5zb3J0Q2hvcmRzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP2k9bnVsbDooaT1QZShuKSkuXz1uLHQpOmkmJmkuX30sdH0sRGQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLE9kPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sRmQ9TWF0aC5QSSxJZD0yKkZkLFlkPTFlLTYsQmQ9SWQtWWQ7UmUucHJvdG90eXBlPUxlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6UmUsbW92ZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStuKX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX3gxJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl8rPSJMIisodGhpcy5feDE9K3QpKyIsIisodGhpcy5feTE9K24pfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIpe3RoaXMuXys9IlEiKyArdCsiLCIrICtuKyIsIisodGhpcy5feDE9K2UpKyIsIisodGhpcy5feTE9K3IpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl8rPSJDIisgK3QrIiwiKyArbisiLCIrICtlKyIsIisgK3IrIiwiKyh0aGlzLl94MT0raSkrIiwiKyh0aGlzLl95MT0rbyl9LGFyY1RvOmZ1bmN0aW9uKHQsbixlLHIsaSl7dD0rdCxuPStuLGU9K2Uscj0rcixpPStpO3ZhciBvPXRoaXMuX3gxLHU9dGhpcy5feTEsYT1lLXQsYz1yLW4scz1vLXQsZj11LW4sbD1zKnMrZipmO2lmKGk8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIitpKTtpZihudWxsPT09dGhpcy5feDEpdGhpcy5fKz0iTSIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9bik7ZWxzZSBpZihsPllkKWlmKE1hdGguYWJzKGYqYS1jKnMpPllkJiZpKXt2YXIgaD1lLW8scD1yLXUsZD1hKmErYypjLHY9aCpoK3AqcCxfPU1hdGguc3FydChkKSxnPU1hdGguc3FydChsKSx5PWkqTWF0aC50YW4oKEZkLU1hdGguYWNvcygoZCtsLXYpLygyKl8qZykpKS8yKSxtPXkvZyx4PXkvXztNYXRoLmFicyhtLTEpPllkJiYodGhpcy5fKz0iTCIrKHQrbSpzKSsiLCIrKG4rbSpmKSksdGhpcy5fKz0iQSIraSsiLCIraSsiLDAsMCwiKyArKGYqaD5zKnApKyIsIisodGhpcy5feDE9dCt4KmEpKyIsIisodGhpcy5feTE9bit4KmMpfWVsc2UgdGhpcy5fKz0iTCIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9bik7ZWxzZTt9LGFyYzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dD0rdCxuPStuLGU9K2U7dmFyIHU9ZSpNYXRoLmNvcyhyKSxhPWUqTWF0aC5zaW4ociksYz10K3Uscz1uK2EsZj0xXm8sbD1vP3ItaTppLXI7aWYoZTwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK2UpO251bGw9PT10aGlzLl94MT90aGlzLl8rPSJNIitjKyIsIitzOihNYXRoLmFicyh0aGlzLl94MS1jKT5ZZHx8TWF0aC5hYnModGhpcy5feTEtcyk+WWQpJiYodGhpcy5fKz0iTCIrYysiLCIrcyksZSYmKGw+QmQ/dGhpcy5fKz0iQSIrZSsiLCIrZSsiLDAsMSwiK2YrIiwiKyh0LXUpKyIsIisobi1hKSsiQSIrZSsiLCIrZSsiLDAsMSwiK2YrIiwiKyh0aGlzLl94MT1jKSsiLCIrKHRoaXMuX3kxPXMpOihsPDAmJihsPWwlSWQrSWQpLHRoaXMuXys9IkEiK2UrIiwiK2UrIiwwLCIrICsobD49RmQpKyIsIitmKyIsIisodGhpcy5feDE9dCtlKk1hdGguY29zKGkpKSsiLCIrKHRoaXMuX3kxPW4rZSpNYXRoLnNpbihpKSkpKX0scmVjdDpmdW5jdGlvbih0LG4sZSxyKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3QpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K24pKyJoIisgK2UrInYiKyArcisiaCIrLWUrIloifSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fTt2YXIgamQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIHQsYT1EZC5jYWxsKGFyZ3VtZW50cyksYz1uLmFwcGx5KHRoaXMsYSkscz1lLmFwcGx5KHRoaXMsYSksZj0rci5hcHBseSh0aGlzLChhWzBdPWMsYSkpLGw9aS5hcHBseSh0aGlzLGEpLVJkLGg9by5hcHBseSh0aGlzLGEpLVJkLHA9ZipDZChsKSxkPWYqemQobCksdj0rci5hcHBseSh0aGlzLChhWzBdPXMsYSkpLF89aS5hcHBseSh0aGlzLGEpLVJkLGc9by5hcHBseSh0aGlzLGEpLVJkO2lmKHV8fCh1PXQ9TGUoKSksdS5tb3ZlVG8ocCxkKSx1LmFyYygwLDAsZixsLGgpLGw9PT1fJiZoPT09Z3x8KHUucXVhZHJhdGljQ3VydmVUbygwLDAsdipDZChfKSx2KnpkKF8pKSx1LmFyYygwLDAsdixfLGcpKSx1LnF1YWRyYXRpY0N1cnZlVG8oMCwwLHAsZCksdS5jbG9zZVBhdGgoKSx0KXJldHVybiB1PW51bGwsdCsiInx8bnVsbH12YXIgbj1xZSxlPVVlLHI9RGUsaT1PZSxvPUZlLHU9bnVsbDtyZXR1cm4gdC5yYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpPZCgrbiksdCk6cn0sdC5zdGFydEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246T2QoK24pLHQpOml9LHQuZW5kQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpPZCgrbiksdCk6b30sdC5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSx0KTpufSx0LnRhcmdldD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQuY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1udWxsPT1uP251bGw6bix0KTp1fSx0fSxIZD0iJCI7SWUucHJvdG90eXBlPVllLnByb3RvdHlwZT17Y29uc3RydWN0b3I6SWUsaGFzOmZ1bmN0aW9uKHQpe3JldHVybiBIZCt0IGluIHRoaXN9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1tIZCt0XX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXNbSGQrdF09bix0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49SGQrdDtyZXR1cm4gbiBpbiB0aGlzJiZkZWxldGUgdGhpc1tuXX0sY2xlYXI6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcyl0WzBdPT09SGQmJmRlbGV0ZSB0aGlzW3RdfSxrZXlzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBuIGluIHRoaXMpblswXT09PUhkJiZ0LnB1c2gobi5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKW5bMF09PT1IZCYmdC5wdXNoKHRoaXNbbl0pO3JldHVybiB0fSxlbnRyaWVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBuIGluIHRoaXMpblswXT09PUhkJiZ0LnB1c2goe2tleTpuLnNsaWNlKDEpLHZhbHVlOnRoaXNbbl19KTtyZXR1cm4gdH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBuIGluIHRoaXMpblswXT09PUhkJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYodFswXT09PUhkKXJldHVybiExO3JldHVybiEwfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbiBpbiB0aGlzKW5bMF09PT1IZCYmdCh0aGlzW25dLG4uc2xpY2UoMSksdGhpcyl9fTt2YXIgWGQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KG4saSx1LGEpe2lmKGk+PW8ubGVuZ3RoKXJldHVybiBudWxsIT1yP3Iobik6bnVsbCE9ZT9uLnNvcnQoZSk6bjtmb3IodmFyIGMscyxmLGw9LTEsaD1uLmxlbmd0aCxwPW9baSsrXSxkPVllKCksdj11KCk7KytsPGg7KShmPWQuZ2V0KGM9cChzPW5bbF0pKyIiKSk/Zi5wdXNoKHMpOmQuc2V0KGMsW3NdKTtyZXR1cm4gZC5lYWNoKGZ1bmN0aW9uKG4sZSl7YSh2LGUsdChuLGksdSxhKSl9KSx2fWZ1bmN0aW9uIG4odCxlKXtpZigrK2U+by5sZW5ndGgpcmV0dXJuIHQ7dmFyIGksYT11W2UtMV07cmV0dXJuIG51bGwhPXImJmU+PW8ubGVuZ3RoP2k9dC5lbnRyaWVzKCk6KGk9W10sdC5lYWNoKGZ1bmN0aW9uKHQscil7aS5wdXNoKHtrZXk6cix2YWx1ZXM6bih0LGUpfSl9KSksbnVsbCE9YT9pLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gYSh0LmtleSxuLmtleSl9KTppfXZhciBlLHIsaSxvPVtdLHU9W107cmV0dXJuIGk9e29iamVjdDpmdW5jdGlvbihuKXtyZXR1cm4gdChuLDAsQmUsamUpfSxtYXA6ZnVuY3Rpb24obil7cmV0dXJuIHQobiwwLEhlLFhlKX0sZW50cmllczpmdW5jdGlvbihlKXtyZXR1cm4gbih0KGUsMCxIZSxYZSksMCl9LGtleTpmdW5jdGlvbih0KXtyZXR1cm4gby5wdXNoKHQpLGl9LHNvcnRLZXlzOmZ1bmN0aW9uKHQpe3JldHVybiB1W28ubGVuZ3RoLTFdPXQsaX0sc29ydFZhbHVlczpmdW5jdGlvbih0KXtyZXR1cm4gZT10LGl9LHJvbGx1cDpmdW5jdGlvbih0KXtyZXR1cm4gcj10LGl9fX0sVmQ9WWUucHJvdG90eXBlO1ZlLnByb3RvdHlwZT1XZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlZlLGhhczpWZC5oYXMsYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0Kz0iIix0aGlzW0hkK3RdPXQsdGhpc30scmVtb3ZlOlZkLnJlbW92ZSxjbGVhcjpWZC5jbGVhcix2YWx1ZXM6VmQua2V5cyxzaXplOlZkLnNpemUsZW1wdHk6VmQuZW1wdHksZWFjaDpWZC5lYWNofTt2YXIgV2Q9ZnVuY3Rpb24odCl7dmFyIG49W107Zm9yKHZhciBlIGluIHQpbi5wdXNoKGUpO3JldHVybiBufSwkZD1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2godFtlXSk7cmV0dXJuIG59LFpkPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh7a2V5OmUsdmFsdWU6dFtlXX0pO3JldHVybiBufSxHZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQsbil7dmFyIHIsaSxvPWUodCxmdW5jdGlvbih0LGUpe2lmKHIpcmV0dXJuIHIodCxlLTEpO2k9dCxyPW4/WmUodCxuKTokZSh0KX0pO3JldHVybiBvLmNvbHVtbnM9aSxvfWZ1bmN0aW9uIGUodCxuKXtmdW5jdGlvbiBlKCl7aWYoZj49cylyZXR1cm4gdTtpZihpKXJldHVybiBpPSExLG87dmFyIG4sZT1mO2lmKDM0PT09dC5jaGFyQ29kZUF0KGUpKXtmb3IodmFyIHI9ZTtyKys8czspaWYoMzQ9PT10LmNoYXJDb2RlQXQocikpe2lmKDM0IT09dC5jaGFyQ29kZUF0KHIrMSkpYnJlYWs7KytyfXJldHVybiBmPXIrMixuPXQuY2hhckNvZGVBdChyKzEpLDEzPT09bj8oaT0hMCwxMD09PXQuY2hhckNvZGVBdChyKzIpJiYrK2YpOjEwPT09biYmKGk9ITApLHQuc2xpY2UoZSsxLHIpLnJlcGxhY2UoLyIiL2csJyInKX1mb3IoO2Y8czspe3ZhciBhPTE7aWYobj10LmNoYXJDb2RlQXQoZisrKSwxMD09PW4paT0hMDtlbHNlIGlmKDEzPT09bilpPSEwLDEwPT09dC5jaGFyQ29kZUF0KGYpJiYoKytmLCsrYSk7ZWxzZSBpZihuIT09Yyljb250aW51ZTtyZXR1cm4gdC5zbGljZShlLGYtYSl9cmV0dXJuIHQuc2xpY2UoZSl9Zm9yKHZhciByLGksbz17fSx1PXt9LGE9W10scz10Lmxlbmd0aCxmPTAsbD0wOyhyPWUoKSkhPT11Oyl7Zm9yKHZhciBoPVtdO3IhPT1vJiZyIT09dTspaC5wdXNoKHIpLHI9ZSgpO24mJm51bGw9PShoPW4oaCxsKyspKXx8YS5wdXNoKGgpfXJldHVybiBhfWZ1bmN0aW9uIHIobixlKXtyZXR1cm4gbnVsbD09ZSYmKGU9R2UobikpLFtlLm1hcCh1KS5qb2luKHQpXS5jb25jYXQobi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB1KG5bdF0pfSkuam9pbih0KX0pKS5qb2luKCJcbiIpfWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQubWFwKG8pLmpvaW4oIlxuIil9ZnVuY3Rpb24gbyhuKXtyZXR1cm4gbi5tYXAodSkuam9pbih0KX1mdW5jdGlvbiB1KHQpe3JldHVybiBudWxsPT10PyIiOmEudGVzdCh0Kz0iIik/JyInK3QucmVwbGFjZSgvXCIvZywnIiInKSsnIic6dH12YXIgYT1uZXcgUmVnRXhwKCdbIicrdCsiXG5dIiksYz10LmNoYXJDb2RlQXQoMCk7cmV0dXJue3BhcnNlOm4scGFyc2VSb3dzOmUsZm9ybWF0OnIsZm9ybWF0Um93czppfX0sSmQ9R2QoIiwiKSxRZD1KZC5wYXJzZSxLZD1KZC5wYXJzZVJvd3MsdHY9SmQuZm9ybWF0LG52PUpkLmZvcm1hdFJvd3MsZXY9R2QoIlx0IikscnY9ZXYucGFyc2UsaXY9ZXYucGFyc2VSb3dzLG92PWV2LmZvcm1hdCx1dj1ldi5mb3JtYXRSb3dzLGF2PWZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlLGksbz1yLmxlbmd0aCx1PTAsYT0wO2ZvcihlPTA7ZTxvOysrZSlpPXJbZV0sdSs9aS54LGErPWkueTtmb3IodT11L28tdCxhPWEvby1uLGU9MDtlPG87KytlKWk9cltlXSxpLngtPXUsaS55LT1hfXZhciByO3JldHVybiBudWxsPT10JiYodD0wKSxudWxsPT1uJiYobj0wKSxlLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10fSxlLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K24sZSk6dH0sZS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LGUpOm59LGV9LGN2PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sc3Y9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtNiooTWF0aC5yYW5kb20oKS0uNSl9LGZ2PWZ1bmN0aW9uKHQpe3ZhciBuPSt0aGlzLl94LmNhbGwobnVsbCx0KSxlPSt0aGlzLl95LmNhbGwobnVsbCx0KTtyZXR1cm4gSmUodGhpcy5jb3ZlcihuLGUpLG4sZSx0KX0sbHY9ZnVuY3Rpb24odCxuKXtpZihpc05hTih0PSt0KXx8aXNOYU4obj0rbikpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5feDAscj10aGlzLl95MCxpPXRoaXMuX3gxLG89dGhpcy5feTE7aWYoaXNOYU4oZSkpaT0oZT1NYXRoLmZsb29yKHQpKSsxLG89KHI9TWF0aC5mbG9vcihuKSkrMTtlbHNle2lmKCEoZT50fHx0Pml8fHI+bnx8bj5vKSlyZXR1cm4gdGhpczt2YXIgdSxhLGM9aS1lLHM9dGhpcy5fcm9vdDtzd2l0Y2goYT0objwocitvKS8yKTw8MXx0PChlK2kpLzIpe2Nhc2UgMDpkbyB1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11O3doaWxlKGMqPTIsaT1lK2Msbz1yK2MsdD5pfHxuPm8pO2JyZWFrO2Nhc2UgMTpkbyB1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11O3doaWxlKGMqPTIsZT1pLWMsbz1yK2MsZT50fHxuPm8pO2JyZWFrO2Nhc2UgMjpkbyB1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11O3doaWxlKGMqPTIsaT1lK2Mscj1vLWMsdD5pfHxyPm4pO2JyZWFrO2Nhc2UgMzpkbyB1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11O3doaWxlKGMqPTIsZT1pLWMscj1vLWMsZT50fHxyPm4pfXRoaXMuX3Jvb3QmJnRoaXMuX3Jvb3QubGVuZ3RoJiYodGhpcy5fcm9vdD1zKX1yZXR1cm4gdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzfSxodj1mdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLnZpc2l0KGZ1bmN0aW9uKG4pe2lmKCFuLmxlbmd0aClkbyB0LnB1c2gobi5kYXRhKTt3aGlsZShuPW4ubmV4dCl9KSx0fSxwdj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmNvdmVyKCt0WzBdWzBdLCt0WzBdWzFdKS5jb3ZlcigrdFsxXVswXSwrdFsxXVsxXSk6aXNOYU4odGhpcy5feDApP3ZvaWQgMDpbW3RoaXMuX3gwLHRoaXMuX3kwXSxbdGhpcy5feDEsdGhpcy5feTFdXX0sZHY9ZnVuY3Rpb24odCxuLGUscixpKXt0aGlzLm5vZGU9dCx0aGlzLngwPW4sdGhpcy55MD1lLHRoaXMueDE9cix0aGlzLnkxPWl9LHZ2PWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sdSxhLGMscyxmPXRoaXMuX3gwLGw9dGhpcy5feTAsaD10aGlzLl94MSxwPXRoaXMuX3kxLGQ9W10sdj10aGlzLl9yb290O2Zvcih2JiZkLnB1c2gobmV3IGR2KHYsZixsLGgscCkpLG51bGw9PWU/ZT0xLzA6KGY9dC1lLGw9bi1lLGg9dCtlLHA9bitlLGUqPWUpO2M9ZC5wb3AoKTspaWYoISghKHY9Yy5ub2RlKXx8KGk9Yy54MCk+aHx8KG89Yy55MCk+cHx8KHU9Yy54MSk8Znx8KGE9Yy55MSk8bCkpaWYodi5sZW5ndGgpe3ZhciBfPShpK3UpLzIsZz0obythKS8yO2QucHVzaChuZXcgZHYodlszXSxfLGcsdSxhKSxuZXcgZHYodlsyXSxpLGcsXyxhKSxuZXcgZHYodlsxXSxfLG8sdSxnKSxuZXcgZHYodlswXSxpLG8sXyxnKSksKHM9KG4+PWcpPDwxfHQ+PV8pJiYoYz1kW2QubGVuZ3RoLTFdLGRbZC5sZW5ndGgtMV09ZFtkLmxlbmd0aC0xLXNdLGRbZC5sZW5ndGgtMS1zXT1jKX1lbHNle3ZhciB5PXQtK3RoaXMuX3guY2FsbChudWxsLHYuZGF0YSksbT1uLSt0aGlzLl95LmNhbGwobnVsbCx2LmRhdGEpLHg9eSp5K20qbTtpZih4PGUpe3ZhciBiPU1hdGguc3FydChlPXgpO2Y9dC1iLGw9bi1iLGg9dCtiLHA9bitiLHI9di5kYXRhfX1yZXR1cm4gcn0sX3Y9ZnVuY3Rpb24odCl7aWYoaXNOYU4obz0rdGhpcy5feC5jYWxsKG51bGwsdCkpfHxpc05hTih1PSt0aGlzLl95LmNhbGwobnVsbCx0KSkpcmV0dXJuIHRoaXM7dmFyIG4sZSxyLGksbyx1LGEsYyxzLGYsbCxoLHA9dGhpcy5fcm9vdCxkPXRoaXMuX3gwLHY9dGhpcy5feTAsXz10aGlzLl94MSxnPXRoaXMuX3kxO2lmKCFwKXJldHVybiB0aGlzO2lmKHAubGVuZ3RoKWZvcig7Oyl7aWYoKHM9bz49KGE9KGQrXykvMikpP2Q9YTpfPWEsKGY9dT49KGM9KHYrZykvMikpP3Y9YzpnPWMsbj1wLCEocD1wW2w9Zjw8MXxzXSkpcmV0dXJuIHRoaXM7aWYoIXAubGVuZ3RoKWJyZWFrOyhuW2wrMSYzXXx8bltsKzImM118fG5bbCszJjNdKSYmKGU9bixoPWwpfWZvcig7cC5kYXRhIT09dDspaWYocj1wLCEocD1wLm5leHQpKXJldHVybiB0aGlzO3JldHVybihpPXAubmV4dCkmJmRlbGV0ZSBwLm5leHQscj8oaT9yLm5leHQ9aTpkZWxldGUgci5uZXh0LHRoaXMpOm4/KGk/bltsXT1pOmRlbGV0ZSBuW2xdLChwPW5bMF18fG5bMV18fG5bMl18fG5bM10pJiZwPT09KG5bM118fG5bMl18fG5bMV18fG5bMF0pJiYhcC5sZW5ndGgmJihlP2VbaF09cDp0aGlzLl9yb290PXApLHRoaXMpOih0aGlzLl9yb290PWksdGhpcyl9LGd2PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3R9LHl2PWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG8rK3Q7d2hpbGUobj1uLm5leHQpfSksdH0sbXY9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyx1LGE9W10sYz10aGlzLl9yb290O2ZvcihjJiZhLnB1c2gobmV3IGR2KGMsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPWEucG9wKCk7KWlmKCF0KGM9bi5ub2RlLHI9bi54MCxpPW4ueTAsbz1uLngxLHU9bi55MSkmJmMubGVuZ3RoKXt2YXIgcz0ocitvKS8yLGY9KGkrdSkvMjsoZT1jWzNdKSYmYS5wdXNoKG5ldyBkdihlLHMsZixvLHUpKSwoZT1jWzJdKSYmYS5wdXNoKG5ldyBkdihlLHIsZixzLHUpKSwoZT1jWzFdKSYmYS5wdXNoKG5ldyBkdihlLHMsaSxvLGYpKSwoZT1jWzBdKSYmYS5wdXNoKG5ldyBkdihlLHIsaSxzLGYpKX1yZXR1cm4gdGhpc30seHY9ZnVuY3Rpb24odCl7dmFyIG4sZT1bXSxyPVtdO2Zvcih0aGlzLl9yb290JiZlLnB1c2gobmV3IGR2KHRoaXMuX3Jvb3QsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPWUucG9wKCk7KXt2YXIgaT1uLm5vZGU7aWYoaS5sZW5ndGgpe3ZhciBvLHU9bi54MCxhPW4ueTAsYz1uLngxLHM9bi55MSxmPSh1K2MpLzIsbD0oYStzKS8yOyhvPWlbMF0pJiZlLnB1c2gobmV3IGR2KG8sdSxhLGYsbCkpLChvPWlbMV0pJiZlLnB1c2gobmV3IGR2KG8sZixhLGMsbCkpLChvPWlbMl0pJiZlLnB1c2gobmV3IGR2KG8sdSxsLGYscykpLChvPWlbM10pJiZlLnB1c2gobmV3IGR2KG8sZixsLGMscykpfXIucHVzaChuKX1mb3IoO249ci5wb3AoKTspdChuLm5vZGUsbi54MCxuLnkwLG4ueDEsbi55MSk7cmV0dXJuIHRoaXN9LGJ2PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl94PXQsdGhpcyk6dGhpcy5feH0sd3Y9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3k9dCx0aGlzKTp0aGlzLl95fSxNdj1lci5wcm90b3R5cGU9cnIucHJvdG90eXBlO012LmNvcHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGU9bmV3IHJyKHRoaXMuX3gsdGhpcy5feSx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkscj10aGlzLl9yb290O2lmKCFyKXJldHVybiBlO2lmKCFyLmxlbmd0aClyZXR1cm4gZS5fcm9vdD1pcihyKSxlO2Zvcih0PVt7c291cmNlOnIsdGFyZ2V0OmUuX3Jvb3Q9bmV3IEFycmF5KDQpfV07cj10LnBvcCgpOylmb3IodmFyIGk9MDtpPDQ7KytpKShuPXIuc291cmNlW2ldKSYmKG4ubGVuZ3RoP3QucHVzaCh7c291cmNlOm4sdGFyZ2V0OnIudGFyZ2V0W2ldPW5ldyBBcnJheSg0KX0pOnIudGFyZ2V0W2ldPWlyKG4pKTtyZXR1cm4gZX0sTXYuYWRkPWZ2LE12LmFkZEFsbD1RZSxNdi5jb3Zlcj1sdixNdi5kYXRhPWh2LE12LmV4dGVudD1wdixNdi5maW5kPXZ2LE12LnJlbW92ZT1fdixNdi5yZW1vdmVBbGw9S2UsTXYucm9vdD1ndixNdi5zaXplPXl2LE12LnZpc2l0PW12LE12LnZpc2l0QWZ0ZXI9eHYsTXYueD1idixNdi55PXd2O3ZhciBUdixrdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKCl7ZnVuY3Rpb24gdCh0LG4sZSxyLGkpe3ZhciBvPXQuZGF0YSxhPXQucixwPWwrYTt7aWYoIW8pcmV0dXJuIG4+cytwfHxyPHMtcHx8ZT5mK3B8fGk8Zi1wO2lmKG8uaW5kZXg+Yy5pbmRleCl7dmFyIGQ9cy1vLngtby52eCx2PWYtby55LW8udnksXz1kKmQrdip2O188cCpwJiYoMD09PWQmJihkPXN2KCksXys9ZCpkKSwwPT09diYmKHY9c3YoKSxfKz12KnYpLF89KHAtKF89TWF0aC5zcXJ0KF8pKSkvXyp1LGMudngrPShkKj1fKSoocD0oYSo9YSkvKGgrYSkpLGMudnkrPSh2Kj1fKSpwLG8udngtPWQqKHA9MS1wKSxvLnZ5LT12KnApfX19Zm9yKHZhciBuLHIsYyxzLGYsbCxoLHA9aS5sZW5ndGgsZD0wO2Q8YTsrK2QpZm9yKHI9ZXIoaSxvcix1cikudmlzaXRBZnRlcihlKSxuPTA7bjxwOysrbiljPWlbbl0sbD1vW2MuaW5kZXhdLGg9bCpsLHM9Yy54K2MudngsZj1jLnkrYy52eSxyLnZpc2l0KHQpfWZ1bmN0aW9uIGUodCl7aWYodC5kYXRhKXJldHVybiB0LnI9b1t0LmRhdGEuaW5kZXhdO2Zvcih2YXIgbj10LnI9MDtuPDQ7KytuKXRbbl0mJnRbbl0ucj50LnImJih0LnI9dFtuXS5yKX1mdW5jdGlvbiByKCl7aWYoaSl7dmFyIG4sZSxyPWkubGVuZ3RoO2ZvcihvPW5ldyBBcnJheShyKSxuPTA7bjxyOysrbillPWlbbl0sb1tlLmluZGV4XT0rdChlLG4saSl9fXZhciBpLG8sdT0xLGE9MTtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9Y3YobnVsbD09dD8xOit0KSksbi5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2k9dCxyKCl9LG4uaXRlcmF0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxuKTphfSxuLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LG4pOnV9LG4ucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6Y3YoK2UpLHIoKSxuKTp0fSxufSxTdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQpe3JldHVybiAxL01hdGgubWluKHNbdC5zb3VyY2UuaW5kZXhdLHNbdC50YXJnZXQuaW5kZXhdKX1mdW5jdGlvbiBlKG4pe2Zvcih2YXIgZT0wLHI9dC5sZW5ndGg7ZTxkOysrZSlmb3IodmFyIGksbyxjLHMsbCxoLHAsdj0wO3Y8cjsrK3YpaT10W3ZdLG89aS5zb3VyY2UsYz1pLnRhcmdldCxzPWMueCtjLnZ4LW8ueC1vLnZ4fHxzdigpLGw9Yy55K2Mudnktby55LW8udnl8fHN2KCksaD1NYXRoLnNxcnQocypzK2wqbCksaD0oaC1hW3ZdKS9oKm4qdVt2XSxzKj1oLGwqPWgsYy52eC09cyoocD1mW3ZdKSxjLnZ5LT1sKnAsby52eCs9cyoocD0xLXApLG8udnkrPWwqcH1mdW5jdGlvbiByKCl7aWYoYyl7dmFyIG4sZSxyPWMubGVuZ3RoLGg9dC5sZW5ndGgscD1ZZShjLGwpO2ZvcihuPTAscz1uZXcgQXJyYXkocik7bjxoOysrbillPXRbbl0sZS5pbmRleD1uLCJvYmplY3QiIT10eXBlb2YgZS5zb3VyY2UmJihlLnNvdXJjZT1jcihwLGUuc291cmNlKSksIm9iamVjdCIhPXR5cGVvZiBlLnRhcmdldCYmKGUudGFyZ2V0PWNyKHAsZS50YXJnZXQpKSxzW2Uuc291cmNlLmluZGV4XT0oc1tlLnNvdXJjZS5pbmRleF18fDApKzEsc1tlLnRhcmdldC5pbmRleF09KHNbZS50YXJnZXQuaW5kZXhdfHwwKSsxO2ZvcihuPTAsZj1uZXcgQXJyYXkoaCk7bjxoOysrbillPXRbbl0sZltuXT1zW2Uuc291cmNlLmluZGV4XS8oc1tlLnNvdXJjZS5pbmRleF0rc1tlLnRhcmdldC5pbmRleF0pO3U9bmV3IEFycmF5KGgpLGkoKSxhPW5ldyBBcnJheShoKSxvKCl9fWZ1bmN0aW9uIGkoKXtpZihjKWZvcih2YXIgbj0wLGU9dC5sZW5ndGg7bjxlOysrbil1W25dPStoKHRbbl0sbix0KX1mdW5jdGlvbiBvKCl7aWYoYylmb3IodmFyIG49MCxlPXQubGVuZ3RoO248ZTsrK24pYVtuXT0rcCh0W25dLG4sdCl9dmFyIHUsYSxjLHMsZixsPWFyLGg9bixwPWN2KDMwKSxkPTE7cmV0dXJuIG51bGw9PXQmJih0PVtdKSxlLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7Yz10LHIoKX0sZS5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLHIoKSxlKTp0fSxlLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQsZSk6bH0sZS5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0LGUpOmR9LGUuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpjdigrdCksaSgpLGUpOmh9LGUuZGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpjdigrdCksbygpLGUpOnB9LGV9LE52PTEwLEV2PU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKSxBdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKCl7ZSgpLHAuY2FsbCgidGljayIsbyksdTxhJiYoaC5zdG9wKCkscC5jYWxsKCJlbmQiLG8pKX1mdW5jdGlvbiBlKCl7dmFyIG4sZSxyPXQubGVuZ3RoO2Zvcih1Kz0ocy11KSpjLGwuZWFjaChmdW5jdGlvbih0KXt0KHUpfSksbj0wO248cjsrK24pZT10W25dLG51bGw9PWUuZng/ZS54Kz1lLnZ4Kj1mOihlLng9ZS5meCxlLnZ4PTApLApudWxsPT1lLmZ5P2UueSs9ZS52eSo9ZjooZS55PWUuZnksZS52eT0wKX1mdW5jdGlvbiByKCl7Zm9yKHZhciBuLGU9MCxyPXQubGVuZ3RoO2U8cjsrK2Upe2lmKG49dFtlXSxuLmluZGV4PWUsaXNOYU4obi54KXx8aXNOYU4obi55KSl7dmFyIGk9TnYqTWF0aC5zcXJ0KGUpLG89ZSpFdjtuLng9aSpNYXRoLmNvcyhvKSxuLnk9aSpNYXRoLnNpbihvKX0oaXNOYU4obi52eCl8fGlzTmFOKG4udnkpKSYmKG4udng9bi52eT0wKX19ZnVuY3Rpb24gaShuKXtyZXR1cm4gbi5pbml0aWFsaXplJiZuLmluaXRpYWxpemUodCksbn12YXIgbyx1PTEsYT0uMDAxLGM9MS1NYXRoLnBvdyhhLDEvMzAwKSxzPTAsZj0uNixsPVllKCksaD1nbihuKSxwPWQoInRpY2siLCJlbmQiKTtyZXR1cm4gbnVsbD09dCYmKHQ9W10pLHIoKSxvPXt0aWNrOmUscmVzdGFydDpmdW5jdGlvbigpe3JldHVybiBoLnJlc3RhcnQobiksb30sc3RvcDpmdW5jdGlvbigpe3JldHVybiBoLnN0b3AoKSxvfSxub2RlczpmdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLHIoKSxsLmVhY2goaSksbyk6dH0sYWxwaGE6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3Qsbyk6dX0sYWxwaGFNaW46ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3Qsbyk6YX0sYWxwaGFEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0rdCxvKTorY30sYWxwaGFUYXJnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K3Qsbyk6c30sdmVsb2NpdHlEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0xLXQsbyk6MS1mfSxmb3JjZTpmdW5jdGlvbih0LG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KG51bGw9PW4/bC5yZW1vdmUodCk6bC5zZXQodCxpKG4pKSxvKTpsLmdldCh0KX0sZmluZDpmdW5jdGlvbihuLGUscil7dmFyIGksbyx1LGEsYyxzPTAsZj10Lmxlbmd0aDtmb3IobnVsbD09cj9yPTEvMDpyKj1yLHM9MDtzPGY7KytzKWE9dFtzXSxpPW4tYS54LG89ZS1hLnksdT1pKmkrbypvLHU8ciYmKGM9YSxyPXUpO3JldHVybiBjfSxvbjpmdW5jdGlvbih0LG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KHAub24odCxuKSxvKTpwLm9uKHQpfX19LEN2PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbixhPWkubGVuZ3RoLGM9ZXIoaSxzcixmcikudmlzaXRBZnRlcihlKTtmb3IodT10LG49MDtuPGE7KytuKW89aVtuXSxjLnZpc2l0KHIpfWZ1bmN0aW9uIG4oKXtpZihpKXt2YXIgdCxuLGU9aS5sZW5ndGg7Zm9yKGE9bmV3IEFycmF5KGUpLHQ9MDt0PGU7Kyt0KW49aVt0XSxhW24uaW5kZXhdPStjKG4sdCxpKX19ZnVuY3Rpb24gZSh0KXt2YXIgbixlLHIsaSxvLHU9MDtpZih0Lmxlbmd0aCl7Zm9yKHI9aT1vPTA7bzw0Oysrbykobj10W29dKSYmKGU9bi52YWx1ZSkmJih1Kz1lLHIrPWUqbi54LGkrPWUqbi55KTt0Lng9ci91LHQueT1pL3V9ZWxzZXtuPXQsbi54PW4uZGF0YS54LG4ueT1uLmRhdGEueTtkbyB1Kz1hW24uZGF0YS5pbmRleF07d2hpbGUobj1uLm5leHQpfXQudmFsdWU9dX1mdW5jdGlvbiByKHQsbixlLHIpe2lmKCF0LnZhbHVlKXJldHVybiEwO3ZhciBpPXQueC1vLngsYz10Lnktby55LGg9ci1uLHA9aSppK2MqYztpZihoKmgvbDxwKXJldHVybiBwPGYmJigwPT09aSYmKGk9c3YoKSxwKz1pKmkpLDA9PT1jJiYoYz1zdigpLHArPWMqYykscDxzJiYocD1NYXRoLnNxcnQocypwKSksby52eCs9aSp0LnZhbHVlKnUvcCxvLnZ5Kz1jKnQudmFsdWUqdS9wKSwhMDtpZighKHQubGVuZ3RofHxwPj1mKSl7KHQuZGF0YSE9PW98fHQubmV4dCkmJigwPT09aSYmKGk9c3YoKSxwKz1pKmkpLDA9PT1jJiYoYz1zdigpLHArPWMqYykscDxzJiYocD1NYXRoLnNxcnQocypwKSkpO2RvIHQuZGF0YSE9PW8mJihoPWFbdC5kYXRhLmluZGV4XSp1L3Asby52eCs9aSpoLG8udnkrPWMqaCk7d2hpbGUodD10Lm5leHQpfX12YXIgaSxvLHUsYSxjPWN2KC0zMCkscz0xLGY9MS8wLGw9LjgxO3JldHVybiB0LmluaXRpYWxpemU9ZnVuY3Rpb24odCl7aT10LG4oKX0sdC5zdHJlbmd0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOmN2KCtlKSxuKCksdCk6Y30sdC5kaXN0YW5jZU1pbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1uKm4sdCk6TWF0aC5zcXJ0KHMpfSx0LmRpc3RhbmNlTWF4PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPW4qbix0KTpNYXRoLnNxcnQoZil9LHQudGhldGE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bipuLHQpOk1hdGguc3FydChsKX0sdH0senY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbih0KXtmb3IodmFyIG4sZT0wLHU9ci5sZW5ndGg7ZTx1OysrZSluPXJbZV0sbi52eCs9KG9bZV0tbi54KSppW2VdKnR9ZnVuY3Rpb24gZSgpe2lmKHIpe3ZhciBuLGU9ci5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKWlbbl09aXNOYU4ob1tuXT0rdChyW25dLG4scikpPzA6K3UocltuXSxuLHIpfX12YXIgcixpLG8sdT1jdiguMSk7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWN2KG51bGw9PXQ/MDordCkpLG4uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtyPXQsZSgpfSxuLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Y3YoK3QpLGUoKSxuKTp1fSxuLng9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjpjdigrciksZSgpLG4pOnR9LG59LFB2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4odCl7Zm9yKHZhciBuLGU9MCx1PXIubGVuZ3RoO2U8dTsrK2Upbj1yW2VdLG4udnkrPShvW2VdLW4ueSkqaVtlXSp0fWZ1bmN0aW9uIGUoKXtpZihyKXt2YXIgbixlPXIubGVuZ3RoO2ZvcihpPW5ldyBBcnJheShlKSxvPW5ldyBBcnJheShlKSxuPTA7bjxlOysrbilpW25dPWlzTmFOKG9bbl09K3QocltuXSxuLHIpKT8wOit1KHJbbl0sbixyKX19dmFyIHIsaSxvLHU9Y3YoLjEpO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1jdihudWxsPT10PzA6K3QpKSxuLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10LGUoKX0sbi5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmN2KCt0KSxlKCksbik6dX0sbi55PWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiByP3I6Y3YoK3IpLGUoKSxuKTp0fSxufSxSdj1mdW5jdGlvbih0LG4pe2lmKChlPSh0PW4/dC50b0V4cG9uZW50aWFsKG4tMSk6dC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgZSxyPXQuc2xpY2UoMCxlKTtyZXR1cm5bci5sZW5ndGg+MT9yWzBdK3Iuc2xpY2UoMik6ciwrdC5zbGljZShlKzEpXX0sTHY9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9UnYoTWF0aC5hYnModCkpLHQ/dFsxXTpOYU59LHF2PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUscil7Zm9yKHZhciBpPWUubGVuZ3RoLG89W10sdT0wLGE9dFswXSxjPTA7aT4wJiZhPjAmJihjK2ErMT5yJiYoYT1NYXRoLm1heCgxLHItYykpLG8ucHVzaChlLnN1YnN0cmluZyhpLT1hLGkrYSkpLCEoKGMrPWErMSk+cikpOylhPXRbdT0odSsxKSV0Lmxlbmd0aF07cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4obil9fSxVdj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZSgvWzAtOV0vZyxmdW5jdGlvbihuKXtyZXR1cm4gdFsrbl19KX19LER2PWZ1bmN0aW9uKHQsbil7dD10LnRvUHJlY2lzaW9uKG4pO3Q6Zm9yKHZhciBlLHI9dC5sZW5ndGgsaT0xLG89LTE7aTxyOysraSlzd2l0Y2godFtpXSl7Y2FzZSIuIjpvPWU9aTticmVhaztjYXNlIjAiOjA9PT1vJiYobz1pKSxlPWk7YnJlYWs7Y2FzZSJlIjpicmVhayB0O2RlZmF1bHQ6bz4wJiYobz0wKX1yZXR1cm4gbz4wP3Quc2xpY2UoMCxvKSt0LnNsaWNlKGUrMSk6dH0sT3Y9ZnVuY3Rpb24odCxuKXt2YXIgZT1Sdih0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdLG89aS0oVHY9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoaS8zKSkpKSsxLHU9ci5sZW5ndGg7cmV0dXJuIG89PT11P3I6bz51P3IrbmV3IEFycmF5KG8tdSsxKS5qb2luKCIwIik6bz4wP3Iuc2xpY2UoMCxvKSsiLiIrci5zbGljZShvKToiMC4iK25ldyBBcnJheSgxLW8pLmpvaW4oIjAiKStSdih0LE1hdGgubWF4KDAsbitvLTEpKVswXX0sRnY9ZnVuY3Rpb24odCxuKXt2YXIgZT1Sdih0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdO3JldHVybiBpPDA/IjAuIituZXcgQXJyYXkoLWkpLmpvaW4oIjAiKStyOnIubGVuZ3RoPmkrMT9yLnNsaWNlKDAsaSsxKSsiLiIrci5zbGljZShpKzEpOnIrbmV3IEFycmF5KGktci5sZW5ndGgrMikuam9pbigiMCIpfSxJdj17IiI6RHYsIiUiOmZ1bmN0aW9uKHQsbil7cmV0dXJuKDEwMCp0KS50b0ZpeGVkKG4pfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDIpfSxjOmZ1bmN0aW9uKHQpe3JldHVybiB0KyIifSxkOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDEwKX0sZTpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRXhwb25lbnRpYWwobil9LGY6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b0ZpeGVkKG4pfSxnOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9QcmVjaXNpb24obil9LG86ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoOCl9LHA6ZnVuY3Rpb24odCxuKXtyZXR1cm4gRnYoMTAwKnQsbil9LHI6RnYsczpPdixYOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSx4OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KX19LFl2PS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLVwoIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KFthLXolXSk/JC9pO2xyLnByb3RvdHlwZT1oci5wcm90b3R5cGUsaHIucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCt0aGlzLmFsaWduK3RoaXMuc2lnbit0aGlzLnN5bWJvbCsodGhpcy56ZXJvPyIwIjoiIikrKG51bGw9PXRoaXMud2lkdGg/IiI6TWF0aC5tYXgoMSwwfHRoaXMud2lkdGgpKSsodGhpcy5jb21tYT8iLCI6IiIpKyhudWxsPT10aGlzLnByZWNpc2lvbj8iIjoiLiIrTWF0aC5tYXgoMCwwfHRoaXMucHJlY2lzaW9uKSkrdGhpcy50eXBlfTt2YXIgQnYsanY9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LEh2PVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXSxYdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQpe2Z1bmN0aW9uIG4odCl7dmFyIG4saSxzLG09dix4PV87aWYoImMiPT09ZCl4PWcodCkreCx0PSIiO2Vsc2V7dD0rdDt2YXIgYj10PDA7aWYodD1nKE1hdGguYWJzKHQpLHApLGImJjA9PT0rdCYmKGI9ITEpLG09KGI/IigiPT09Yz9jOiItIjoiLSI9PT1jfHwiKCI9PT1jPyIiOmMpK20seD14KygicyI9PT1kP0h2WzgrVHYvM106IiIpKyhiJiYiKCI9PT1jPyIpIjoiIikseSlmb3Iobj0tMSxpPXQubGVuZ3RoOysrbjxpOylpZihzPXQuY2hhckNvZGVBdChuKSw0OD5zfHxzPjU3KXt4PSg0Nj09PXM/byt0LnNsaWNlKG4rMSk6dC5zbGljZShuKSkreCx0PXQuc2xpY2UoMCxuKTticmVha319aCYmIWYmJih0PXIodCwxLzApKTt2YXIgdz1tLmxlbmd0aCt0Lmxlbmd0aCt4Lmxlbmd0aCxNPXc8bD9uZXcgQXJyYXkobC13KzEpLmpvaW4oZSk6IiI7c3dpdGNoKGgmJmYmJih0PXIoTSt0LE0ubGVuZ3RoP2wteC5sZW5ndGg6MS8wKSxNPSIiKSxhKXtjYXNlIjwiOnQ9bSt0K3grTTticmVhaztjYXNlIj0iOnQ9bStNK3QreDticmVhaztjYXNlIl4iOnQ9TS5zbGljZSgwLHc9TS5sZW5ndGg+PjEpK20rdCt4K00uc2xpY2Uodyk7YnJlYWs7ZGVmYXVsdDp0PU0rbSt0K3h9cmV0dXJuIHUodCl9dD1scih0KTt2YXIgZT10LmZpbGwsYT10LmFsaWduLGM9dC5zaWduLHM9dC5zeW1ib2wsZj10Lnplcm8sbD10LndpZHRoLGg9dC5jb21tYSxwPXQucHJlY2lzaW9uLGQ9dC50eXBlLHY9IiQiPT09cz9pWzBdOiIjIj09PXMmJi9bYm94WF0vLnRlc3QoZCk/IjAiK2QudG9Mb3dlckNhc2UoKToiIixfPSIkIj09PXM/aVsxXTovWyVwXS8udGVzdChkKT8iJSI6IiIsZz1JdltkXSx5PSFkfHwvW2RlZmdwcnMlXS8udGVzdChkKTtyZXR1cm4gcD1udWxsPT1wP2Q/NjoxMjovW2dwcnNdLy50ZXN0KGQpP01hdGgubWF4KDEsTWF0aC5taW4oMjEscCkpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAscCkpLG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdCsiIn0sbn1mdW5jdGlvbiBlKHQsZSl7dmFyIHI9bigodD1scih0KSx0LnR5cGU9ImYiLHQpKSxpPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKEx2KGUpLzMpKSksbz1NYXRoLnBvdygxMCwtaSksdT1Idls4K2kvM107cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiByKG8qdCkrdX19dmFyIHI9dC5ncm91cGluZyYmdC50aG91c2FuZHM/cXYodC5ncm91cGluZyx0LnRob3VzYW5kcyk6anYsaT10LmN1cnJlbmN5LG89dC5kZWNpbWFsLHU9dC5udW1lcmFscz9Vdih0Lm51bWVyYWxzKTpqdjtyZXR1cm57Zm9ybWF0Om4sZm9ybWF0UHJlZml4OmV9fTtwcih7ZGVjaW1hbDoiLiIsdGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl19KTt2YXIgVnY9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgubWF4KDAsLUx2KE1hdGguYWJzKHQpKSl9LFd2PWZ1bmN0aW9uKHQsbil7cmV0dXJuIE1hdGgubWF4KDAsMypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoTHYobikvMykpKS1MdihNYXRoLmFicyh0KSkpfSwkdj1mdW5jdGlvbih0LG4pe3JldHVybiB0PU1hdGguYWJzKHQpLG49TWF0aC5hYnMobiktdCxNYXRoLm1heCgwLEx2KG4pLUx2KHQpKSsxfSxadj1mdW5jdGlvbigpe3JldHVybiBuZXcgZHJ9O2RyLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZHIscmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LGFkZDpmdW5jdGlvbih0KXt2cihOXyx0LHRoaXMudCksdnIodGhpcyxOXy5zLHRoaXMucyksdGhpcy5zP3RoaXMudCs9Tl8udDp0aGlzLnM9Tl8udH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgR3YsSnYsUXYsS3YsdF8sbl8sZV8scl8saV8sb18sdV8sYV8sY18sc18sZl8sbF8saF8scF8sZF8sdl8sX18sZ18seV8sbV8seF8sYl8sd18sTV8sVF8sa18sU18sTl89bmV3IGRyLEVfPTFlLTYsQV89MWUtMTIsQ189TWF0aC5QSSx6Xz1DXy8yLFBfPUNfLzQsUl89MipDXyxMXz0xODAvQ18scV89Q18vMTgwLFVfPU1hdGguYWJzLERfPU1hdGguYXRhbixPXz1NYXRoLmF0YW4yLEZfPU1hdGguY29zLElfPU1hdGguY2VpbCxZXz1NYXRoLmV4cCxCXz1NYXRoLmxvZyxqXz1NYXRoLnBvdyxIXz1NYXRoLnNpbixYXz1NYXRoLnNpZ258fGZ1bmN0aW9uKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH0sVl89TWF0aC5zcXJ0LFdfPU1hdGgudGFuLCRfPXtGZWF0dXJlOmZ1bmN0aW9uKHQsbil7eHIodC5nZW9tZXRyeSxuKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5mZWF0dXJlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KXhyKGVbcl0uZ2VvbWV0cnksbil9fSxaXz17U3BoZXJlOmZ1bmN0aW9uKHQsbil7bi5zcGhlcmUoKX0sUG9pbnQ6ZnVuY3Rpb24odCxuKXt0PXQuY29vcmRpbmF0ZXMsbi5wb2ludCh0WzBdLHRbMV0sdFsyXSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KXQ9ZVtyXSxuLnBvaW50KHRbMF0sdFsxXSx0WzJdKX0sTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2JyKHQuY29vcmRpbmF0ZXMsbiwwKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylicihlW3JdLG4sMCl9LFBvbHlnb246ZnVuY3Rpb24odCxuKXt3cih0LmNvb3JkaW5hdGVzLG4pfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KXdyKGVbcl0sbil9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10Lmdlb21ldHJpZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyl4cihlW3JdLG4pfX0sR189ZnVuY3Rpb24odCxuKXt0JiYkXy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpPyRfW3QudHlwZV0odCxuKTp4cih0LG4pfSxKXz1adigpLFFfPVp2KCksS189e3BvaW50Om1yLGxpbmVTdGFydDptcixsaW5lRW5kOm1yLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0pfLnJlc2V0KCksS18ubGluZVN0YXJ0PU1yLEtfLmxpbmVFbmQ9VHJ9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgdD0rSl87UV8uYWRkKHQ8MD9SXyt0OnQpLHRoaXMubGluZVN0YXJ0PXRoaXMubGluZUVuZD10aGlzLnBvaW50PW1yfSxzcGhlcmU6ZnVuY3Rpb24oKXtRXy5hZGQoUl8pfX0sdGc9ZnVuY3Rpb24odCl7cmV0dXJuIFFfLnJlc2V0KCksR18odCxLXyksMipRX30sbmc9WnYoKSxlZz17cG9pbnQ6THIsbGluZVN0YXJ0OlVyLGxpbmVFbmQ6RHIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7ZWcucG9pbnQ9T3IsZWcubGluZVN0YXJ0PUZyLGVnLmxpbmVFbmQ9SXIsbmcucmVzZXQoKSxLXy5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe0tfLnBvbHlnb25FbmQoKSxlZy5wb2ludD1McixlZy5saW5lU3RhcnQ9VXIsZWcubGluZUVuZD1EcixKXzwwPyhuXz0tKHJfPTE4MCksZV89LShpXz05MCkpOm5nPkVfP2lfPTkwOm5nPC1FXyYmKGVfPS05MCksZl9bMF09bl8sZl9bMV09cl99fSxyZz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLHUsYTtpZihpXz1yXz0tKG5fPWVfPTEvMCksc189W10sR18odCxlZyksZT1zXy5sZW5ndGgpe2ZvcihzXy5zb3J0KEJyKSxuPTEscj1zX1swXSxvPVtyXTtuPGU7KytuKWk9c19bbl0sanIocixpWzBdKXx8anIocixpWzFdKT8oWXIoclswXSxpWzFdKT5ZcihyWzBdLHJbMV0pJiYoclsxXT1pWzFdKSxZcihpWzBdLHJbMV0pPllyKHJbMF0sclsxXSkmJihyWzBdPWlbMF0pKTpvLnB1c2gocj1pKTtmb3IodT0tKDEvMCksZT1vLmxlbmd0aC0xLG49MCxyPW9bZV07bjw9ZTtyPWksKytuKWk9b1tuXSwoYT1ZcihyWzFdLGlbMF0pKT51JiYodT1hLG5fPWlbMF0scl89clsxXSl9cmV0dXJuIHNfPWZfPW51bGwsbl89PT0xLzB8fGVfPT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW25fLGVfXSxbcl8saV9dXX0saWc9e3NwaGVyZTptcixwb2ludDpIcixsaW5lU3RhcnQ6VnIsbGluZUVuZDpacixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtpZy5saW5lU3RhcnQ9R3IsaWcubGluZUVuZD1Kcn0scG9seWdvbkVuZDpmdW5jdGlvbigpe2lnLmxpbmVTdGFydD1WcixpZy5saW5lRW5kPVpyfX0sb2c9ZnVuY3Rpb24odCl7bF89aF89cF89ZF89dl89X189Z189eV89bV89eF89Yl89MCxHXyh0LGlnKTt2YXIgbj1tXyxlPXhfLHI9Yl8saT1uKm4rZSplK3IqcjtyZXR1cm4gaTxBXyYmKG49X18sZT1nXyxyPXlfLGhfPEVfJiYobj1wXyxlPWRfLHI9dl8pLGk9bipuK2UqZStyKnIsaTxBXyk/W05hTixOYU5dOltPXyhlLG4pKkxfLGdyKHIvVl8oaSkpKkxfXX0sdWc9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxhZz1mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUoZSxyKXtyZXR1cm4gZT10KGUsciksbihlWzBdLGVbMV0pfXJldHVybiB0LmludmVydCYmbi5pbnZlcnQmJihlLmludmVydD1mdW5jdGlvbihlLHIpe3JldHVybiBlPW4uaW52ZXJ0KGUsciksZSYmdC5pbnZlcnQoZVswXSxlWzFdKX0pLGV9O3RpLmludmVydD10aTt2YXIgY2csc2csZmcsbGcsaGcscGcsZGcsdmcsX2csZ2cseWcsbWc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbj10KG5bMF0qcV8sblsxXSpxXyksblswXSo9TF8sblsxXSo9TF8sbn1yZXR1cm4gdD1uaSh0WzBdKnFfLHRbMV0qcV8sdC5sZW5ndGg+Mj90WzJdKnFfOjApLG4uaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiBuPXQuaW52ZXJ0KG5bMF0qcV8sblsxXSpxXyksblswXSo9TF8sblsxXSo9TF8sbn0sbn0seGc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsbil7ZS5wdXNoKHQ9cih0LG4pKSx0WzBdKj1MXyx0WzFdKj1MX31mdW5jdGlvbiBuKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbj1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpxXyxjPXUuYXBwbHkodGhpcyxhcmd1bWVudHMpKnFfO3JldHVybiBlPVtdLHI9bmkoLXRbMF0qcV8sLXRbMV0qcV8sMCkuaW52ZXJ0LG9pKGEsbixjLDEpLHQ9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltlXX0sZT1yPW51bGwsdH12YXIgZSxyLGk9dWcoWzAsMF0pLG89dWcoOTApLHU9dWcoNiksYT17cG9pbnQ6dH07cmV0dXJuIG4uY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dWcoWyt0WzBdLCt0WzFdXSksbik6aX0sbi5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp1ZygrdCksbik6b30sbi5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp1ZygrdCksbik6dX0sbn0sYmc9ZnVuY3Rpb24oKXt2YXIgdCxuPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihuLGUpe3QucHVzaChbbixlXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe24ucHVzaCh0PVtdKX0sbGluZUVuZDptcixyZWpvaW46ZnVuY3Rpb24oKXtuLmxlbmd0aD4xJiZuLnB1c2gobi5wb3AoKS5jb25jYXQobi5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciBlPW47cmV0dXJuIG49W10sdD1udWxsLGV9fX0sd2c9ZnVuY3Rpb24odCxuLGUscixpLG8pe3ZhciB1LGE9dFswXSxjPXRbMV0scz1uWzBdLGY9blsxXSxsPTAsaD0xLHA9cy1hLGQ9Zi1jO2lmKHU9ZS1hLHB8fCEodT4wKSl7aWYodS89cCxwPDApe2lmKHU8bClyZXR1cm47dTxoJiYoaD11KX1lbHNlIGlmKHA+MCl7aWYodT5oKXJldHVybjt1PmwmJihsPXUpfWlmKHU9aS1hLHB8fCEodTwwKSl7aWYodS89cCxwPDApe2lmKHU+aClyZXR1cm47dT5sJiYobD11KX1lbHNlIGlmKHA+MCl7aWYodTxsKXJldHVybjt1PGgmJihoPXUpfWlmKHU9ci1jLGR8fCEodT4wKSl7aWYodS89ZCxkPDApe2lmKHU8bClyZXR1cm47dTxoJiYoaD11KX1lbHNlIGlmKGQ+MCl7aWYodT5oKXJldHVybjt1PmwmJihsPXUpfWlmKHU9by1jLGR8fCEodTwwKSl7aWYodS89ZCxkPDApe2lmKHU+aClyZXR1cm47dT5sJiYobD11KX1lbHNlIGlmKGQ+MCl7aWYodTxsKXJldHVybjt1PGgmJihoPXUpfXJldHVybiBsPjAmJih0WzBdPWErbCpwLHRbMV09YytsKmQpLGg8MSYmKG5bMF09YStoKnAsblsxXT1jK2gqZCksITB9fX19fSxNZz1mdW5jdGlvbih0LG4pe3JldHVybiBVXyh0WzBdLW5bMF0pPEVfJiZVXyh0WzFdLW5bMV0pPEVffSxUZz1mdW5jdGlvbih0LG4sZSxyLGkpe3ZhciBvLHUsYT1bXSxjPVtdO2lmKHQuZm9yRWFjaChmdW5jdGlvbih0KXtpZighKChuPXQubGVuZ3RoLTEpPD0wKSl7dmFyIG4sZSxyPXRbMF0sdT10W25dO2lmKE1nKHIsdSkpe2ZvcihpLmxpbmVTdGFydCgpLG89MDtvPG47KytvKWkucG9pbnQoKHI9dFtvXSlbMF0sclsxXSk7cmV0dXJuIHZvaWQgaS5saW5lRW5kKCl9YS5wdXNoKGU9bmV3IGFpKHIsdCxudWxsLCEwKSksYy5wdXNoKGUubz1uZXcgYWkocixudWxsLGUsITEpKSxhLnB1c2goZT1uZXcgYWkodSx0LG51bGwsITEpKSxjLnB1c2goZS5vPW5ldyBhaSh1LG51bGwsZSwhMCkpfX0pLGEubGVuZ3RoKXtmb3IoYy5zb3J0KG4pLGNpKGEpLGNpKGMpLG89MCx1PWMubGVuZ3RoO288dTsrK28pY1tvXS5lPWU9IWU7Zm9yKHZhciBzLGYsbD1hWzBdOzspe2Zvcih2YXIgaD1sLHA9ITA7aC52OylpZigoaD1oLm4pPT09bClyZXR1cm47cz1oLnosaS5saW5lU3RhcnQoKTtkb3tpZihoLnY9aC5vLnY9ITAsaC5lKXtpZihwKWZvcihvPTAsdT1zLmxlbmd0aDtvPHU7KytvKWkucG9pbnQoKGY9c1tvXSlbMF0sZlsxXSk7ZWxzZSByKGgueCxoLm4ueCwxLGkpO2g9aC5ufWVsc2V7aWYocClmb3Iocz1oLnAueixvPXMubGVuZ3RoLTE7bz49MDstLW8paS5wb2ludCgoZj1zW29dKVswXSxmWzFdKTtlbHNlIHIoaC54LGgucC54LC0xLGkpO2g9aC5wfWg9aC5vLHM9aC56LHA9IXB9d2hpbGUoIWgudik7aS5saW5lRW5kKCl9fX0sa2c9MWU5LFNnPS1rZyxOZz1mdW5jdGlvbigpe3ZhciB0LG4sZSxyPTAsaT0wLG89OTYwLHU9NTAwO3JldHVybiBlPXtzdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIHQmJm49PT1lP3Q6dD1zaShyLGksbyx1KShuPWUpfSxleHRlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K2FbMF1bMF0saT0rYVswXVsxXSxvPSthWzFdWzBdLHU9K2FbMV1bMV0sdD1uPW51bGwsZSk6W1tyLGldLFtvLHVdXX19fSxFZz1adigpLEFnPWZ1bmN0aW9uKHQsbil7dmFyIGU9blswXSxyPW5bMV0saT1bSF8oZSksLUZfKGUpLDBdLG89MCx1PTA7RWcucmVzZXQoKTtmb3IodmFyIGE9MCxjPXQubGVuZ3RoO2E8YzsrK2EpaWYoZj0ocz10W2FdKS5sZW5ndGgpZm9yKHZhciBzLGYsbD1zW2YtMV0saD1sWzBdLHA9bFsxXS8yK1BfLGQ9SF8ocCksdj1GXyhwKSxfPTA7XzxmOysrXyxoPXksZD14LHY9YixsPWcpe3ZhciBnPXNbX10seT1nWzBdLG09Z1sxXS8yK1BfLHg9SF8obSksYj1GXyhtKSx3PXktaCxNPXc+PTA/MTotMSxUPU0qdyxrPVQ+Q18sUz1kKng7aWYoRWcuYWRkKE9fKFMqTSpIXyhUKSx2KmIrUypGXyhUKSkpLG8rPWs/dytNKlJfOncsa15oPj1lXnk+PWUpe3ZhciBOPUNyKEVyKGwpLEVyKGcpKTtScihOKTt2YXIgRT1DcihpLE4pO1JyKEUpO3ZhciBBPShrXnc+PTA/LTE6MSkqZ3IoRVsyXSk7KHI+QXx8cj09PUEmJihOWzBdfHxOWzFdKSkmJih1Kz1rXnc+PTA/MTotMSl9fXJldHVybihvPC1FX3x8bzxFXyYmRWc8LUVfKV4xJnV9LENnPVp2KCksemc9e3NwaGVyZTptcixwb2ludDptcixsaW5lU3RhcnQ6ZmksbGluZUVuZDptcixwb2x5Z29uU3RhcnQ6bXIscG9seWdvbkVuZDptcn0sUGc9ZnVuY3Rpb24odCl7cmV0dXJuIENnLnJlc2V0KCksR18odCx6ZyksK0NnfSxSZz1bbnVsbCxudWxsXSxMZz17dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6Umd9LHFnPWZ1bmN0aW9uKHQsbil7cmV0dXJuIFJnWzBdPXQsUmdbMV09bixQZyhMZyl9LFVnPXtGZWF0dXJlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGRpKHQuZ2VvbWV0cnksbil9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZmVhdHVyZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihkaShlW3JdLmdlb21ldHJ5LG4pKXJldHVybiEwO3JldHVybiExfX0sRGc9e1NwaGVyZTpmdW5jdGlvbigpe3JldHVybiEwfSxQb2ludDpmdW5jdGlvbih0LG4pe3JldHVybiB2aSh0LmNvb3JkaW5hdGVzLG4pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZih2aShlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7cmV0dXJuIF9pKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYoX2koZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sUG9seWdvbjpmdW5jdGlvbih0LG4pe3JldHVybiBnaSh0LmNvb3JkaW5hdGVzLG4pfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGdpKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10Lmdlb21ldHJpZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihkaShlW3JdLG4pKXJldHVybiEwO3JldHVybiExfX0sT2c9ZnVuY3Rpb24odCxuKXtyZXR1cm4odCYmVWcuaGFzT3duUHJvcGVydHkodC50eXBlKT9VZ1t0LnR5cGVdOmRpKSh0LG4pfSxGZz1mdW5jdGlvbih0LG4pe3ZhciBlPXRbMF0qcV8scj10WzFdKnFfLGk9blswXSpxXyxvPW5bMV0qcV8sdT1GXyhyKSxhPUhfKHIpLGM9Rl8obykscz1IXyhvKSxmPXUqRl8oZSksbD11KkhfKGUpLGg9YypGXyhpKSxwPWMqSF8oaSksZD0yKmdyKFZfKHlyKG8tcikrdSpjKnlyKGktZSkpKSx2PUhfKGQpLF89ZD9mdW5jdGlvbih0KXt2YXIgbj1IXyh0Kj1kKS92LGU9SF8oZC10KS92LHI9ZSpmK24qaCxpPWUqbCtuKnAsbz1lKmErbipzO3JldHVybltPXyhpLHIpKkxfLE9fKG8sVl8ocipyK2kqaSkpKkxfXX06ZnVuY3Rpb24oKXtyZXR1cm5bZSpMXyxyKkxfXX07cmV0dXJuIF8uZGlzdGFuY2U9ZCxffSxJZz1mdW5jdGlvbih0KXtyZXR1cm4gdH0sWWc9WnYoKSxCZz1adigpLGpnPXtwb2ludDptcixsaW5lU3RhcnQ6bXIsbGluZUVuZDptcixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtqZy5saW5lU3RhcnQ9VGksamcubGluZUVuZD1OaX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2pnLmxpbmVTdGFydD1qZy5saW5lRW5kPWpnLnBvaW50PW1yLFlnLmFkZChVXyhCZykpLEJnLnJlc2V0KCl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVlnLzI7cmV0dXJuIFlnLnJlc2V0KCksdH19LEhnPTEvMCxYZz1IZyxWZz0tSGcsV2c9VmcsJGc9e3BvaW50OkVpLGxpbmVTdGFydDptcixsaW5lRW5kOm1yLHBvbHlnb25TdGFydDptcixwb2x5Z29uRW5kOm1yLHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVtbSGcsWGddLFtWZyxXZ11dO3JldHVybiBWZz1XZz0tKFhnPUhnPTEvMCksdH19LFpnPTAsR2c9MCxKZz0wLFFnPTAsS2c9MCx0eT0wLG55PTAsZXk9MCxyeT0wLGl5PXtwb2ludDpBaSxsaW5lU3RhcnQ6Q2ksbGluZUVuZDpSaSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtpeS5saW5lU3RhcnQ9TGksaXkubGluZUVuZD1xaX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2l5LnBvaW50PUFpLGl5LmxpbmVTdGFydD1DaSxpeS5saW5lRW5kPVJpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1yeT9bbnkvcnksZXkvcnldOnR5P1tRZy90eSxLZy90eV06Smc/W1pnL0pnLEdnL0pnXTpbTmFOLE5hTl07cmV0dXJuIFpnPUdnPUpnPVFnPUtnPXR5PW55PWV5PXJ5PTAsdH19O09pLnByb3RvdHlwZT17X3JhZGl1czo0LjUscG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JhZGl1cz10LHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbiksdGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTticmVhaztkZWZhdWx0OnRoaXMuX2NvbnRleHQubW92ZVRvKHQrdGhpcy5fcmFkaXVzLG4pLHRoaXMuX2NvbnRleHQuYXJjKHQsbix0aGlzLl9yYWRpdXMsMCxSXyl9fSxyZXN1bHQ6bXJ9O3ZhciBveSx1eSxheSxjeSxzeSxmeT1adigpLGx5PXtwb2ludDptcixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtseS5wb2ludD1GaX0sbGluZUVuZDpmdW5jdGlvbigpe295JiZJaSh1eSxheSksbHkucG9pbnQ9bXJ9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe295PSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7b3k9bnVsbH0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9K2Z5O3JldHVybiBmeS5yZXNldCgpLHR9fTtZaS5wcm90b3R5cGU9e19jaXJjbGU6QmkoNC41KSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2lyY2xlPUJpKHQpLHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX3N0cmluZy5wdXNoKCJaIiksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3N0cmluZy5wdXNoKCJNIix0LCIsIixuKSx0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9zdHJpbmcucHVzaCgiTCIsdCwiLCIsbik7YnJlYWs7ZGVmYXVsdDp0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsbix0aGlzLl9jaXJjbGUpfX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RyaW5nLmxlbmd0aCl7dmFyIHQ9dGhpcy5fc3RyaW5nLmpvaW4oIiIpO3JldHVybiB0aGlzLl9zdHJpbmc9W10sdH19fTt2YXIgaHk9ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIG8mJmkucG9pbnRSYWRpdXMoK28uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxHXyh0LHIoaSkpKSxpLnJlc3VsdCgpfXZhciByLGksbz00LjU7cmV0dXJuIGUuYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gR18odCxyKGpnKSksamcucmVzdWx0KCl9LGUubWVhc3VyZT1mdW5jdGlvbih0KXtyZXR1cm4gR18odCxyKGx5KSksbHkucmVzdWx0KCl9LGUuYm91bmRzPWZ1bmN0aW9uKHQpe3JldHVybiBHXyh0LHIoJGcpKSwkZy5yZXN1bHQoKX0sZS5jZW50cm9pZD1mdW5jdGlvbih0KXtyZXR1cm4gR18odCxyKGl5KSksaXkucmVzdWx0KCl9LGUucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uPyh0PW51bGwsSWcpOih0PW4pLnN0cmVhbSxlKTp0fSxlLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09dD8obj1udWxsLG5ldyBZaSk6bmV3IE9pKG49dCksImZ1bmN0aW9uIiE9dHlwZW9mIG8mJmkucG9pbnRSYWRpdXMobyksZSk6bn0sZS5wb2ludFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OihpLnBvaW50UmFkaXVzKCt0KSwrdCksZSk6b30sZS5wcm9qZWN0aW9uKHQpLmNvbnRleHQobil9LHB5PWZ1bmN0aW9uKHQsbixlLHIpe3JldHVybiBmdW5jdGlvbihpLG8pe2Z1bmN0aW9uIHUobixlKXt2YXIgcj1pKG4sZSk7dChuPXJbMF0sZT1yWzFdKSYmby5wb2ludChuLGUpfWZ1bmN0aW9uIGEodCxuKXt2YXIgZT1pKHQsbik7Xy5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGMoKXtiLnBvaW50PWEsXy5saW5lU3RhcnQoKX1mdW5jdGlvbiBzKCl7Yi5wb2ludD11LF8ubGluZUVuZCgpfWZ1bmN0aW9uIGYodCxuKXt2LnB1c2goW3Qsbl0pO3ZhciBlPWkodCxuKTttLnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gbCgpe20ubGluZVN0YXJ0KCksdj1bXX1mdW5jdGlvbiBoKCl7Zih2WzBdWzBdLHZbMF1bMV0pLG0ubGluZUVuZCgpO3ZhciB0LG4sZSxyLGk9bS5jbGVhbigpLHU9eS5yZXN1bHQoKSxhPXUubGVuZ3RoO2lmKHYucG9wKCkscC5wdXNoKHYpLHY9bnVsbCxhKWlmKDEmaSl7aWYoZT11WzBdLChuPWUubGVuZ3RoLTEpPjApe2Zvcih4fHwoby5wb2x5Z29uU3RhcnQoKSx4PSEwKSxvLmxpbmVTdGFydCgpLHQ9MDt0PG47Kyt0KW8ucG9pbnQoKHI9ZVt0XSlbMF0sclsxXSk7by5saW5lRW5kKCl9fWVsc2UgYT4xJiYyJmkmJnUucHVzaCh1LnBvcCgpLmNvbmNhdCh1LnNoaWZ0KCkpKSxkLnB1c2godS5maWx0ZXIoamkpKX12YXIgcCxkLHYsXz1uKG8pLGc9aS5pbnZlcnQoclswXSxyWzFdKSx5PWJnKCksbT1uKHkpLHg9ITEsYj17cG9pbnQ6dSxsaW5lU3RhcnQ6YyxsaW5lRW5kOnMscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Yi5wb2ludD1mLGIubGluZVN0YXJ0PWwsYi5saW5lRW5kPWgsZD1bXSxwPVtdfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Yi5wb2ludD11LGIubGluZVN0YXJ0PWMsYi5saW5lRW5kPXMsZD1oZihkKTt2YXIgdD1BZyhwLGcpO2QubGVuZ3RoPyh4fHwoby5wb2x5Z29uU3RhcnQoKSx4PSEwKSxUZyhkLEhpLHQsZSxvKSk6dCYmKHh8fChvLnBvbHlnb25TdGFydCgpLHg9ITApLG8ubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxvKSxvLmxpbmVFbmQoKSkseCYmKG8ucG9seWdvbkVuZCgpLHg9ITEpLGQ9cD1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXtvLnBvbHlnb25TdGFydCgpLG8ubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxvKSxvLmxpbmVFbmQoKSxvLnBvbHlnb25FbmQoKX19O3JldHVybiBifX0sZHk9cHkoZnVuY3Rpb24oKXtyZXR1cm4hMH0sWGksV2ksWy1DXywtel9dKSx2eT1mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUoZSxyLGksbyl7b2kobyx0LG4saSxlLHIpfWZ1bmN0aW9uIHIodCxuKXtyZXR1cm4gRl8odCkqRl8obik+YX1mdW5jdGlvbiBpKHQpe3ZhciBuLGUsaSxhLGY7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2E9aT0hMSxmPTF9LHBvaW50OmZ1bmN0aW9uKGwsaCl7dmFyIHAsZD1bbCxoXSx2PXIobCxoKSxfPWM/dj8wOnUobCxoKTp2P3UobCsobDwwP0NfOi1DXyksaCk6MDtpZighbiYmKGE9aT12KSYmdC5saW5lU3RhcnQoKSx2IT09aSYmKHA9byhuLGQpLChNZyhuLHApfHxNZyhkLHApKSYmKGRbMF0rPUVfLGRbMV0rPUVfLHY9cihkWzBdLGRbMV0pKSksdiE9PWkpZj0wLHY/KHQubGluZVN0YXJ0KCkscD1vKGQsbiksdC5wb2ludChwWzBdLHBbMV0pKToocD1vKG4sZCksdC5wb2ludChwWzBdLHBbMV0pLHQubGluZUVuZCgpKSxuPXA7ZWxzZSBpZihzJiZuJiZjXnYpe3ZhciBnO18mZXx8IShnPW8oZCxuLCEwKSl8fChmPTAsYz8odC5saW5lU3RhcnQoKSx0LnBvaW50KGdbMF1bMF0sZ1swXVsxXSksdC5wb2ludChnWzFdWzBdLGdbMV1bMV0pLHQubGluZUVuZCgpKToodC5wb2ludChnWzFdWzBdLGdbMV1bMV0pLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChnWzBdWzBdLGdbMF1bMV0pKSl9IXZ8fG4mJk1nKG4sZCl8fHQucG9pbnQoZFswXSxkWzFdKSxuPWQsaT12LGU9X30sbGluZUVuZDpmdW5jdGlvbigpe2kmJnQubGluZUVuZCgpLG49bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gZnwoYSYmaSk8PDF9fX1mdW5jdGlvbiBvKHQsbixlKXt2YXIgcj1Fcih0KSxpPUVyKG4pLG89WzEsMCwwXSx1PUNyKHIsaSksYz1Bcih1LHUpLHM9dVswXSxmPWMtcypzO2lmKCFmKXJldHVybiFlJiZ0O3ZhciBsPWEqYy9mLGg9LWEqcy9mLHA9Q3Iobyx1KSxkPVByKG8sbCk7enIoZCxQcih1LGgpKTt2YXIgdj1wLF89QXIoZCx2KSxnPUFyKHYsdikseT1fKl8tZyooQXIoZCxkKS0xKTtpZighKHk8MCkpe3ZhciBtPVZfKHkpLHg9UHIodiwoLV8tbSkvZyk7aWYoenIoeCxkKSx4PU5yKHgpLCFlKXJldHVybiB4O3ZhciBiLHc9dFswXSxNPW5bMF0sVD10WzFdLGs9blsxXTtNPHcmJihiPXcsdz1NLE09Yik7dmFyIFM9TS13LE49VV8oUy1DXyk8RV8sRT1OfHxTPEVfO2lmKCFOJiZrPFQmJihiPVQsVD1rLGs9YiksRT9OP1Qraz4wXnhbMV08KFVfKHhbMF0tdyk8RV8/VDprKTpUPD14WzFdJiZ4WzFdPD1rOlM+Q19eKHc8PXhbMF0mJnhbMF08PU0pKXt2YXIgQT1Qcih2LCgtXyttKS9nKTtyZXR1cm4genIoQSxkKSxbeCxOcihBKV19fX1mdW5jdGlvbiB1KG4sZSl7dmFyIHI9Yz90OkNfLXQsaT0wO3JldHVybiBuPC1yP2l8PTE6bj5yJiYoaXw9MiksZTwtcj9pfD00OmU+ciYmKGl8PTgpLGl9dmFyIGE9Rl8odCksYz1hPjAscz1VXyhhKT5FXztyZXR1cm4gcHkocixpLGUsYz9bMCwtdF06Wy1DXyx0LUNfXSl9LF95PWZ1bmN0aW9uKHQpe3JldHVybntzdHJlYW06JGkodCl9fTtaaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlppLHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5zdHJlYW0ucG9pbnQodCxuKX0sc3BoZXJlOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25FbmQoKX19O3ZhciBneT0xNix5eT1GXygzMCpxXyksbXk9ZnVuY3Rpb24odCxuKXtyZXR1cm4rbj9LaSh0LG4pOlFpKHQpfSx4eT0kaSh7cG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0KnFfLG4qcV8pfX0pLGJ5PWZ1bmN0aW9uKCl7cmV0dXJuIGVvKGlvKS5zY2FsZSgxNTUuNDI0KS5jZW50ZXIoWzAsMzMuNjQ0Ml0pfSx3eT1mdW5jdGlvbigpe3JldHVybiBieSgpLnBhcmFsbGVscyhbMjkuNSw0NS41XSkuc2NhbGUoMTA3MCkudHJhbnNsYXRlKFs0ODAsMjUwXSkucm90YXRlKFs5NiwwXSkuY2VudGVyKFstLjYsMzguN10pfSxNeT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG49dFswXSxlPXRbMV07cmV0dXJuIGE9bnVsbCxpLnBvaW50KG4sZSksYXx8KG8ucG9pbnQobixlKSxhKXx8KHUucG9pbnQobixlKSxhKX1mdW5jdGlvbiBuKCl7cmV0dXJuIGU9cj1udWxsLHR9dmFyIGUscixpLG8sdSxhLGM9d3koKSxzPWJ5KCkucm90YXRlKFsxNTQsMF0pLmNlbnRlcihbLTIsNTguNV0pLnBhcmFsbGVscyhbNTUsNjVdKSxmPWJ5KCkucm90YXRlKFsxNTcsMF0pLmNlbnRlcihbLTMsMTkuOV0pLnBhcmFsbGVscyhbOCwxOF0pLGw9e3BvaW50OmZ1bmN0aW9uKHQsbil7YT1bdCxuXX19O3JldHVybiB0LmludmVydD1mdW5jdGlvbih0KXt2YXIgbj1jLnNjYWxlKCksZT1jLnRyYW5zbGF0ZSgpLHI9KHRbMF0tZVswXSkvbixpPSh0WzFdLWVbMV0pL247cmV0dXJuKGk+PS4xMiYmaTwuMjM0JiZyPj0tLjQyNSYmcjwtLjIxND9zOmk+PS4xNjYmJmk8LjIzNCYmcj49LS4yMTQmJnI8LS4xMTU/ZjpjKS5pbnZlcnQodCl9LHQuc3RyZWFtPWZ1bmN0aW9uKHQpe3JldHVybiBlJiZyPT09dD9lOmU9b28oW2Muc3RyZWFtKHI9dCkscy5zdHJlYW0odCksZi5zdHJlYW0odCldKX0sdC5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGMucHJlY2lzaW9uKHQpLHMucHJlY2lzaW9uKHQpLGYucHJlY2lzaW9uKHQpLG4oKSk6Yy5wcmVjaXNpb24oKX0sdC5zY2FsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYy5zY2FsZShuKSxzLnNjYWxlKC4zNSpuKSxmLnNjYWxlKG4pLHQudHJhbnNsYXRlKGMudHJhbnNsYXRlKCkpKTpjLnNjYWxlKCl9LHQudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBjLnRyYW5zbGF0ZSgpO3ZhciBlPWMuc2NhbGUoKSxyPSt0WzBdLGE9K3RbMV07cmV0dXJuIGk9Yy50cmFuc2xhdGUodCkuY2xpcEV4dGVudChbW3ItLjQ1NSplLGEtLjIzOCplXSxbcisuNDU1KmUsYSsuMjM4KmVdXSkuc3RyZWFtKGwpLG89cy50cmFuc2xhdGUoW3ItLjMwNyplLGErLjIwMSplXSkuY2xpcEV4dGVudChbW3ItLjQyNSplK0VfLGErLjEyKmUrRV9dLFtyLS4yMTQqZS1FXyxhKy4yMzQqZS1FX11dKS5zdHJlYW0obCksdT1mLnRyYW5zbGF0ZShbci0uMjA1KmUsYSsuMjEyKmVdKS5jbGlwRXh0ZW50KFtbci0uMjE0KmUrRV8sYSsuMTY2KmUrRV9dLFtyLS4xMTUqZS1FXyxhKy4yMzQqZS1FX11dKS5zdHJlYW0obCksbigpfSx0LmZpdEV4dGVudD1mdW5jdGlvbihuLGUpe3JldHVybiBHaSh0LG4sZSl9LHQuZml0U2l6ZT1mdW5jdGlvbihuLGUpe3JldHVybiBKaSh0LG4sZSl9LHQuc2NhbGUoMTA3MCl9LFR5PXVvKGZ1bmN0aW9uKHQpe3JldHVybiBWXygyLygxK3QpKX0pO1R5LmludmVydD1hbyhmdW5jdGlvbih0KXtyZXR1cm4gMipncih0LzIpfSk7dmFyIGt5PWZ1bmN0aW9uKCl7cmV0dXJuIHRvKFR5KS5zY2FsZSgxMjQuNzUpLmNsaXBBbmdsZSgxNzkuOTk5KX0sU3k9dW8oZnVuY3Rpb24odCl7cmV0dXJuKHQ9X3IodCkpJiZ0L0hfKHQpfSk7U3kuaW52ZXJ0PWFvKGZ1bmN0aW9uKHQpe3JldHVybiB0fSk7dmFyIE55PWZ1bmN0aW9uKCl7cmV0dXJuIHRvKFN5KS5zY2FsZSg3OS40MTg4KS5jbGlwQW5nbGUoMTc5Ljk5OSl9O2NvLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblt0LDIqRF8oWV8obikpLXpfXX07dmFyIEV5PWZ1bmN0aW9uKCl7cmV0dXJuIHNvKGNvKS5zY2FsZSg5NjEvUl8pfSxBeT1mdW5jdGlvbigpe3JldHVybiBlbyhsbykuc2NhbGUoMTA5LjUpLnBhcmFsbGVscyhbMzAsMzBdKX07aG8uaW52ZXJ0PWhvO3ZhciBDeT1mdW5jdGlvbigpe3JldHVybiB0byhobykuc2NhbGUoMTUyLjYzKX0senk9ZnVuY3Rpb24oKXtyZXR1cm4gZW8ocG8pLnNjYWxlKDEzMS4xNTQpLmNlbnRlcihbMCwxMy45Mzg5XSl9O3ZvLmludmVydD1hbyhEXyk7dmFyIFB5PWZ1bmN0aW9uKCl7cmV0dXJuIHRvKHZvKS5zY2FsZSgxNDQuMDQ5KS5jbGlwQW5nbGUoNjApfSxSeT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gaT1vPW51bGwsdX12YXIgbixlLHIsaSxvLHUsYT0xLGM9MCxzPTAsZj0xLGw9MSxoPUlnLHA9bnVsbCxkPUlnO3JldHVybiB1PXtzdHJlYW06ZnVuY3Rpb24odCl7cmV0dXJuIGkmJm89PT10P2k6aT1oKGQobz10KSl9LGNsaXBFeHRlbnQ6ZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9bnVsbD09aT8ocD1uPWU9cj1udWxsLElnKTpzaShwPStpWzBdWzBdLG49K2lbMF1bMV0sZT0raVsxXVswXSxyPStpWzFdWzFdKSx0KCkpOm51bGw9PXA/bnVsbDpbW3Asbl0sW2Uscl1dfSxzY2FsZTpmdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1fbygoYT0rbikqZixhKmwsYyxzKSx0KCkpOmF9LHRyYW5zbGF0ZTpmdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1fbyhhKmYsYSpsLGM9K25bMF0scz0rblsxXSksdCgpKTpbYyxzXX0scmVmbGVjdFg6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9X28oYSooZj1uPy0xOjEpLGEqbCxjLHMpLHQoKSk6ZjwwfSxyZWZsZWN0WTpmdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1fbyhhKmYsYSoobD1uPy0xOjEpLGMscyksdCgpKTpsPDB9LGZpdEV4dGVudDpmdW5jdGlvbih0LG4pe3JldHVybiBHaSh1LHQsbil9LGZpdFNpemU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gSmkodSx0LG4pfX19O2dvLmludmVydD1hbyhncik7dmFyIEx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRvKGdvKS5zY2FsZSgyNDkuNSkuY2xpcEFuZ2xlKDkwK0VfKX07eW8uaW52ZXJ0PWFvKGZ1bmN0aW9uKHQpe3JldHVybiAyKkRfKHQpfSk7dmFyIHF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRvKHlvKS5zY2FsZSgyNTApLmNsaXBBbmdsZSgxNDIpfTttby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtyZXR1cm5bLW4sMipEXyhZXyh0KSktel9dfTt2YXIgVXk9ZnVuY3Rpb24oKXt2YXIgdD1zbyhtbyksbj10LmNlbnRlcixlPXQucm90YXRlO3JldHVybiB0LmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKFstdFsxXSx0WzBdXSk6KHQ9bigpLFt0WzFdLC10WzBdXSl9LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKToodD1lKCksW3RbMF0sdFsxXSx0WzJdLTkwXSl9LGUoWzAsMCw5MF0pLnNjYWxlKDE1OS4xNTUpfSxEeT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG8sdT0wO3QuZWFjaEFmdGVyKGZ1bmN0aW9uKHQpe3ZhciBlPXQuY2hpbGRyZW47ZT8odC54PWJvKGUpLHQueT1NbyhlKSk6KHQueD1vP3UrPW4odCxvKTowLHQueT0wLG89dCl9KTt2YXIgYT1rbyh0KSxjPVNvKHQpLHM9YS54LW4oYSxjKS8yLGY9Yy54K24oYyxhKS8yO3JldHVybiB0LmVhY2hBZnRlcihpP2Z1bmN0aW9uKG4pe24ueD0obi54LXQueCkqZSxuLnk9KHQueS1uLnkpKnJ9OmZ1bmN0aW9uKG4pe24ueD0obi54LXMpLyhmLXMpKmUsbi55PSgxLSh0Lnk/bi55L3QueToxKSkqcn0pfXZhciBuPXhvLGU9MSxyPTEsaT0hMTtyZXR1cm4gdC5zZXBhcmF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUsdCk6bn0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSExLGU9K25bMF0scj0rblsxXSx0KTppP251bGw6W2Uscl19LHQubm9kZVNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ITAsZT0rblswXSxyPStuWzFdLHQpOmk/W2Uscl06bnVsbH0sdH0sT3k9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoTm8pfSxGeT1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvPXRoaXMsdT1bb107ZG8gZm9yKG49dS5yZXZlcnNlKCksdT1bXTtvPW4ucG9wKCk7KWlmKHQobyksZT1vLmNoaWxkcmVuKWZvcihyPTAsaT1lLmxlbmd0aDtyPGk7KytyKXUucHVzaChlW3JdKTt3aGlsZSh1Lmxlbmd0aCk7cmV0dXJuIHRoaXN9LEl5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9dGhpcyxpPVtyXTtyPWkucG9wKCk7KWlmKHQociksbj1yLmNoaWxkcmVuKWZvcihlPW4ubGVuZ3RoLTE7ZT49MDstLWUpaS5wdXNoKG5bZV0pO3JldHVybiB0aGlzfSxZeT1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyLGk9dGhpcyxvPVtpXSx1PVtdO2k9by5wb3AoKTspaWYodS5wdXNoKGkpLG49aS5jaGlsZHJlbilmb3IoZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlvLnB1c2gobltlXSk7Zm9yKDtpPXUucG9wKCk7KXQoaSk7cmV0dXJuIHRoaXN9LEJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hBZnRlcihmdW5jdGlvbihuKXtmb3IodmFyIGU9K3Qobi5kYXRhKXx8MCxyPW4uY2hpbGRyZW4saT1yJiZyLmxlbmd0aDstLWk+PTA7KWUrPXJbaV0udmFsdWU7bi52YWx1ZT1lfSl9LGp5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmbi5jaGlsZHJlbi5zb3J0KHQpfSl9LEh5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLGU9RW8obix0KSxyPVtuXTtuIT09ZTspbj1uLnBhcmVudCxyLnB1c2gobik7Zm9yKHZhciBpPXIubGVuZ3RoO3QhPT1lOylyLnNwbGljZShpLDAsdCksdD10LnBhcmVudDtyZXR1cm4gcn0sWHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxuPVt0XTt0PXQucGFyZW50OyluLnB1c2godCk7cmV0dXJuIG59LFZ5PWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXt0LnB1c2gobil9KSx0fSxXeT1mdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8dC5wdXNoKG4pfSksdH0sJHk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49W107cmV0dXJuIHQuZWFjaChmdW5jdGlvbihlKXtlIT09dCYmbi5wdXNoKHtzb3VyY2U6ZS5wYXJlbnQsdGFyZ2V0OmV9KX0pLG59O0xvLnByb3RvdHlwZT1Bby5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkxvLGNvdW50Ok95LGVhY2g6RnksZWFjaEFmdGVyOll5LGVhY2hCZWZvcmU6SXksc3VtOkJ5LHNvcnQ6ankscGF0aDpIeSxhbmNlc3RvcnM6WHksZGVzY2VuZGFudHM6VnksbGVhdmVzOld5LGxpbmtzOiR5LGNvcHk6Q299O3ZhciBaeT1mdW5jdGlvbih0KXtmb3IodmFyIG4sZT0odD10LnNsaWNlKCkpLmxlbmd0aCxyPW51bGwsaT1yO2U7KXt2YXIgbz1uZXcgcW8odFtlLTFdKTtpPWk/aS5uZXh0PW86cj1vLHRbbl09dFstLWVdfXJldHVybntoZWFkOnIsdGFpbDppfX0sR3k9ZnVuY3Rpb24odCl7cmV0dXJuIERvKFp5KHQpLFtdKX0sSnk9ZnVuY3Rpb24odCl7cmV0dXJuIFZvKHQpLHR9LFF5PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sS3k9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiB0Lng9ZS8yLHQueT1yLzIsbj90LmVhY2hCZWZvcmUoSm8obikpLmVhY2hBZnRlcihRbyhpLC41KSkuZWFjaEJlZm9yZShLbygxKSk6dC5lYWNoQmVmb3JlKEpvKEdvKSkuZWFjaEFmdGVyKFFvKFpvLDEpKS5lYWNoQWZ0ZXIoUW8oaSx0LnIvTWF0aC5taW4oZSxyKSkpLmVhY2hCZWZvcmUoS28oTWF0aC5taW4oZSxyKS8oMip0LnIpKSksdH12YXIgbj1udWxsLGU9MSxyPTEsaT1abztyZXR1cm4gdC5yYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49V28oZSksdCk6bn0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPStuWzBdLHI9K25bMV0sdCk6W2Uscl19LHQucGFkZGluZz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlF5KCtuKSx0KTppfSx0fSx0bT1mdW5jdGlvbih0KXt0LngwPU1hdGgucm91bmQodC54MCksdC55MD1NYXRoLnJvdW5kKHQueTApLHQueDE9TWF0aC5yb3VuZCh0LngxKSx0LnkxPU1hdGgucm91bmQodC55MSl9LG5tPWZ1bmN0aW9uKHQsbixlLHIsaSl7Zm9yKHZhciBvLHU9dC5jaGlsZHJlbixhPS0xLGM9dS5sZW5ndGgscz10LnZhbHVlJiYoci1uKS90LnZhbHVlOysrYTxjOylvPXVbYV0sby55MD1lLG8ueTE9aSxvLngwPW4sby54MT1uKz1vLnZhbHVlKnN9LGVtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgdT10LmhlaWdodCsxO3JldHVybiB0LngwPXQueTA9aSx0LngxPWUsdC55MT1yL3UsdC5lYWNoQmVmb3JlKG4ocix1KSksbyYmdC5lYWNoQmVmb3JlKHRtKSx0fWZ1bmN0aW9uIG4odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7ZS5jaGlsZHJlbiYmbm0oZSxlLngwLHQqKGUuZGVwdGgrMSkvbixlLngxLHQqKGUuZGVwdGgrMikvbik7dmFyIHI9ZS54MCxvPWUueTAsdT1lLngxLWksYT1lLnkxLWk7dTxyJiYocj11PShyK3UpLzIpLGE8byYmKG89YT0obythKS8yKSxlLngwPXIsZS55MD1vLGUueDE9dSxlLnkxPWF9fXZhciBlPTEscj0xLGk9MCxvPSExO3JldHVybiB0LnJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSEhbix0KTpvfSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K25bMF0scj0rblsxXSx0KTpbZSxyXX0sdC5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPStuLHQpOml9LHR9LHJtPSIkIixpbT17ZGVwdGg6LTF9LG9tPXt9LHVtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgcixpLG8sdSxhLGMscyxmPXQubGVuZ3RoLGw9bmV3IEFycmF5KGYpLGg9e307Zm9yKGk9MDtpPGY7KytpKXI9dFtpXSxhPWxbaV09bmV3IExvKHIpLG51bGwhPShjPW4ocixpLHQpKSYmKGMrPSIiKSYmKHM9cm0rKGEuaWQ9YyksaFtzXT1zIGluIGg/b206YSk7Zm9yKGk9MDtpPGY7KytpKWlmKGE9bFtpXSxjPWUodFtpXSxpLHQpLG51bGwhPWMmJihjKz0iIikpe2lmKHU9aFtybStjXSwhdSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrYyk7aWYodT09PW9tKXRocm93IG5ldyBFcnJvcigiYW1iaWd1b3VzOiAiK2MpO3UuY2hpbGRyZW4/dS5jaGlsZHJlbi5wdXNoKGEpOnUuY2hpbGRyZW49W2FdLGEucGFyZW50PXV9ZWxzZXtpZihvKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgcm9vdHMiKTtvPWF9aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJubyByb290Iik7aWYoby5wYXJlbnQ9aW0sby5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QuZGVwdGg9dC5wYXJlbnQuZGVwdGgrMSwtLWZ9KS5lYWNoQmVmb3JlKFJvKSxvLnBhcmVudD1udWxsLGY+MCl0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7cmV0dXJuIG99dmFyIG49dHUsZT1udTtyZXR1cm4gdC5pZD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0kbyhlKSx0KTpufSx0LnBhcmVudElkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSRvKG4pLHQpOmV9LHR9O2N1LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKExvLnByb3RvdHlwZSk7dmFyIGFtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgcj1zdSh0KTtpZihyLmVhY2hBZnRlcihuKSxyLnBhcmVudC5tPS1yLnosci5lYWNoQmVmb3JlKGUpLGMpdC5lYWNoQmVmb3JlKGkpO2Vsc2V7dmFyIHM9dCxmPXQsbD10O3QuZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0Lng8cy54JiYocz10KSx0Lng+Zi54JiYoZj10KSx0LmRlcHRoPmwuZGVwdGgmJihsPXQpfSk7dmFyIGg9cz09PWY/MTpvKHMsZikvMixwPWgtcy54LGQ9dS8oZi54K2grcCksdj1hLyhsLmRlcHRofHwxKTt0LmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PSh0LngrcCkqZCx0Lnk9dC5kZXB0aCp2fSl9cmV0dXJuIHR9ZnVuY3Rpb24gbih0KXt2YXIgbj10LmNoaWxkcmVuLGU9dC5wYXJlbnQuY2hpbGRyZW4saT10Lmk/ZVt0LmktMV06bnVsbDtpZihuKXt1dSh0KTt2YXIgdT0oblswXS56K25bbi5sZW5ndGgtMV0ueikvMjtpPyh0Lno9aS56K28odC5fLGkuXyksdC5tPXQuei11KTp0Lno9dX1lbHNlIGkmJih0Lno9aS56K28odC5fLGkuXykpO3QucGFyZW50LkE9cih0LGksdC5wYXJlbnQuQXx8ZVswXSl9ZnVuY3Rpb24gZSh0KXt0Ll8ueD10LnordC5wYXJlbnQubSx0Lm0rPXQucGFyZW50Lm19ZnVuY3Rpb24gcih0LG4sZSl7aWYobil7Zm9yKHZhciByLGk9dCx1PXQsYT1uLGM9aS5wYXJlbnQuY2hpbGRyZW5bMF0scz1pLm0sZj11Lm0sbD1hLm0saD1jLm07YT1pdShhKSxpPXJ1KGkpLGEmJmk7KWM9cnUoYyksdT1pdSh1KSx1LmE9dCxyPWEueitsLWkuei1zK28oYS5fLGkuXykscj4wJiYob3UoYXUoYSx0LGUpLHQscikscys9cixmKz1yKSxsKz1hLm0scys9aS5tLGgrPWMubSxmKz11Lm07YSYmIWl1KHUpJiYodS50PWEsdS5tKz1sLWYpLGkmJiFydShjKSYmKGMudD1pLGMubSs9cy1oLGU9dCl9cmV0dXJuIGV9ZnVuY3Rpb24gaSh0KXt0LngqPXUsdC55PXQuZGVwdGgqYX12YXIgbz1ldSx1PTEsYT0xLGM9bnVsbDtyZXR1cm4gdC5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sdCk6b30sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSExLHU9K25bMF0sYT0rblsxXSx0KTpjP251bGw6W3UsYV19LHQubm9kZVNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ITAsdT0rblswXSxhPStuWzFdLHQpOmM/W3UsYV06bnVsbH0sdH0sY209ZnVuY3Rpb24odCxuLGUscixpKXtmb3IodmFyIG8sdT10LmNoaWxkcmVuLGE9LTEsYz11Lmxlbmd0aCxzPXQudmFsdWUmJihpLWUpL3QudmFsdWU7KythPGM7KW89dVthXSxvLngwPW4sby54MT1yLG8ueTA9ZSxvLnkxPWUrPW8udmFsdWUqc30sc209KDErTWF0aC5zcXJ0KDUpKS8yLGZtPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUscixpLG8pe2Z1KG4sdCxlLHIsaSxvKX1yZXR1cm4gZS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gdCgobj0rbik+MT9uOjEpfSxlfShzbSksbG09ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiB0LngwPXQueTA9MCx0LngxPWksdC55MT1vLHQuZWFjaEJlZm9yZShuKSx1PVswXSxyJiZ0LmVhY2hCZWZvcmUodG0pLHR9ZnVuY3Rpb24gbih0KXt2YXIgbj11W3QuZGVwdGhdLHI9dC54MCtuLGk9dC55MCtuLG89dC54MS1uLGg9dC55MS1uO288ciYmKHI9bz0ocitvKS8yKSxoPGkmJihpPWg9KGkraCkvMiksdC54MD1yLHQueTA9aSx0LngxPW8sdC55MT1oLHQuY2hpbGRyZW4mJihuPXVbdC5kZXB0aCsxXT1hKHQpLzIscis9bCh0KS1uLGkrPWModCktbixvLT1zKHQpLW4saC09Zih0KS1uLG88ciYmKHI9bz0ocitvKS8yKSxoPGkmJihpPWg9KGkraCkvMiksZSh0LHIsaSxvLGgpKX12YXIgZT1mbSxyPSExLGk9MSxvPTEsdT1bMF0sYT1abyxjPVpvLHM9Wm8sZj1abyxsPVpvO3JldHVybiB0LnJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSEhbix0KTpyfSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K25bMF0sbz0rblsxXSx0KTpbaSxvXX0sdC50aWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSRvKG4pLHQpOmV9LHQucGFkZGluZz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90LnBhZGRpbmdJbm5lcihuKS5wYWRkaW5nT3V0ZXIobik6dC5wYWRkaW5nSW5uZXIoKX0sdC5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpReSgrbiksdCk6YX0sdC5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5wYWRkaW5nVG9wKG4pLnBhZGRpbmdSaWdodChuKS5wYWRkaW5nQm90dG9tKG4pLnBhZGRpbmdMZWZ0KG4pOnQucGFkZGluZ1RvcCgpfSx0LnBhZGRpbmdUb3A9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpReSgrbiksdCk6Y30sdC5wYWRkaW5nUmlnaHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpReSgrbiksdCk6c30sdC5wYWRkaW5nQm90dG9tPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UXkoK24pLHQpOmZ9LHQucGFkZGluZ0xlZnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpReSgrbiksdCk6bH0sdH0saG09ZnVuY3Rpb24odCxuLGUscixpKXtmdW5jdGlvbiBvKHQsbixlLHIsaSx1LGEpe2lmKHQ+PW4tMSl7dmFyIHM9Y1t0XTtyZXR1cm4gcy54MD1yLHMueTA9aSxzLngxPXUscy55MT1hLHZvaWQgMH1mb3IodmFyIGw9Zlt0XSxoPWUvMitsLHA9dCsxLGQ9bi0xO3A8ZDspe3ZhciB2PXArZD4+PjE7Zlt2XTxoP3A9disxOmQ9dn12YXIgXz1mW3BdLWwsZz1lLV87aWYoYS1pPnUtcil7dmFyIHk9KGkqZythKl8pL2U7byh0LHAsXyxyLGksdSx5KSxvKHAsbixnLHIseSx1LGEpfWVsc2V7dmFyIG09KHIqZyt1Kl8pL2U7byh0LHAsXyxyLGksbSxhKSxvKHAsbixnLG0saSx1LGEpfX12YXIgdSxhLGM9dC5jaGlsZHJlbixzPWMubGVuZ3RoLGY9bmV3IEFycmF5KHMrMSk7Zm9yKGZbMF09YT11PTA7dTxzOysrdSlmW3UrMV09YSs9Y1t1XS52YWx1ZTtvKDAscyx0LnZhbHVlLG4sZSxyLGkpfSxwbT1mdW5jdGlvbih0LG4sZSxyLGkpeygxJnQuZGVwdGg/Y206bm0pKHQsbixlLHIsaSl9LGRtPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUscixpLG8pe2lmKCh1PXQuX3NxdWFyaWZ5KSYmdS5yYXRpbz09PW4pZm9yKHZhciB1LGEsYyxzLGYsbD0tMSxoPXUubGVuZ3RoLHA9dC52YWx1ZTsrK2w8aDspe2ZvcihhPXVbbF0sYz1hLmNoaWxkcmVuLHM9YS52YWx1ZT0wLGY9Yy5sZW5ndGg7czxmOysrcylhLnZhbHVlKz1jW3NdLnZhbHVlO2EuZGljZT9ubShhLGUscixpLHIrPShvLXIpKmEudmFsdWUvcCk6Y20oYSxlLHIsZSs9KGktZSkqYS52YWx1ZS9wLG8pLHAtPWEudmFsdWV9ZWxzZSB0Ll9zcXVhcmlmeT11PWZ1KG4sdCxlLHIsaSxvKSx1LnJhdGlvPW59cmV0dXJuIGUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIHQoKG49K24pPjE/bjoxKX0sZX0oc20pLHZtPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPS0xLHI9dC5sZW5ndGgsaT10W3ItMV0sbz0wOysrZTxyOyluPWksaT10W2VdLG8rPW5bMV0qaVswXS1uWzBdKmlbMV07cmV0dXJuIG8vMgp9LF9tPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9LTEsaT10Lmxlbmd0aCxvPTAsdT0wLGE9dFtpLTFdLGM9MDsrK3I8aTspbj1hLGE9dFtyXSxjKz1lPW5bMF0qYVsxXS1hWzBdKm5bMV0sbys9KG5bMF0rYVswXSkqZSx1Kz0oblsxXSthWzFdKSplO3JldHVybiBjKj0zLFtvL2MsdS9jXX0sZ209ZnVuY3Rpb24odCxuLGUpe3JldHVybihuWzBdLXRbMF0pKihlWzFdLXRbMV0pLShuWzFdLXRbMV0pKihlWzBdLXRbMF0pfSx5bT1mdW5jdGlvbih0KXtpZigoZT10Lmxlbmd0aCk8MylyZXR1cm4gbnVsbDt2YXIgbixlLHI9bmV3IEFycmF5KGUpLGk9bmV3IEFycmF5KGUpO2ZvcihuPTA7bjxlOysrbilyW25dPVsrdFtuXVswXSwrdFtuXVsxXSxuXTtmb3Ioci5zb3J0KGx1KSxuPTA7bjxlOysrbilpW25dPVtyW25dWzBdLC1yW25dWzFdXTt2YXIgbz1odShyKSx1PWh1KGkpLGE9dVswXT09PW9bMF0sYz11W3UubGVuZ3RoLTFdPT09b1tvLmxlbmd0aC0xXSxzPVtdO2ZvcihuPW8ubGVuZ3RoLTE7bj49MDstLW4pcy5wdXNoKHRbcltvW25dXVsyXV0pO2ZvcihuPSthO248dS5sZW5ndGgtYzsrK24pcy5wdXNoKHRbclt1W25dXVsyXV0pO3JldHVybiBzfSxtbT1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZSxyLGk9dC5sZW5ndGgsbz10W2ktMV0sdT1uWzBdLGE9blsxXSxjPW9bMF0scz1vWzFdLGY9ITEsbD0wO2w8aTsrK2wpbz10W2xdLGU9b1swXSxyPW9bMV0scj5hIT1zPmEmJnU8KGMtZSkqKGEtcikvKHMtcikrZSYmKGY9IWYpLGM9ZSxzPXI7cmV0dXJuIGZ9LHhtPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9LTEsaT10Lmxlbmd0aCxvPXRbaS0xXSx1PW9bMF0sYT1vWzFdLGM9MDsrK3I8aTspbj11LGU9YSxvPXRbcl0sdT1vWzBdLGE9b1sxXSxuLT11LGUtPWEsYys9TWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybiBjfSxibT1bXS5zbGljZSx3bT17fTtwdS5wcm90b3R5cGU9bXUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpwdSxkZWZlcjpmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8dGhpcy5fY2FsbCl0aHJvdyBuZXcgRXJyb3I7aWYobnVsbCE9dGhpcy5fZXJyb3IpcmV0dXJuIHRoaXM7dmFyIG49Ym0uY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIG4ucHVzaCh0KSwrK3RoaXMuX3dhaXRpbmcsdGhpcy5fdGFza3MucHVzaChuKSxkdSh0aGlzKSx0aGlzfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLl9lcnJvciYmZ3UodGhpcyxuZXcgRXJyb3IoImFib3J0IikpLHRoaXN9LGF3YWl0OmZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHx0aGlzLl9jYWxsKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy5fY2FsbD1mdW5jdGlvbihuLGUpe3QuYXBwbHkobnVsbCxbbl0uY29uY2F0KGUpKX0seXUodGhpcyksdGhpc30sYXdhaXRBbGw6ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fHRoaXMuX2NhbGwpdGhyb3cgbmV3IEVycm9yO3JldHVybiB0aGlzLl9jYWxsPXQseXUodGhpcyksdGhpc319O3ZhciBNbT1mdW5jdGlvbih0LG4pe3JldHVybiB0PW51bGw9PXQ/MDordCxuPW51bGw9PW4/MTorbiwxPT09YXJndW1lbnRzLmxlbmd0aD8obj10LHQ9MCk6bi09dCxmdW5jdGlvbigpe3JldHVybiBNYXRoLnJhbmRvbSgpKm4rdH19LFRtPWZ1bmN0aW9uKHQsbil7dmFyIGUscjtyZXR1cm4gdD1udWxsPT10PzA6K3Qsbj1udWxsPT1uPzE6K24sZnVuY3Rpb24oKXt2YXIgaTtpZihudWxsIT1lKWk9ZSxlPW51bGw7ZWxzZSBkbyBlPTIqTWF0aC5yYW5kb20oKS0xLGk9MipNYXRoLnJhbmRvbSgpLTEscj1lKmUraSppO3doaWxlKCFyfHxyPjEpO3JldHVybiB0K24qaSpNYXRoLnNxcnQoLTIqTWF0aC5sb2cocikvcil9fSxrbT1mdW5jdGlvbigpe3ZhciB0PVRtLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAodCgpKX19LFNtPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgbj0wLGU9MDtlPHQ7KytlKW4rPU1hdGgucmFuZG9tKCk7cmV0dXJuIG59fSxObT1mdW5jdGlvbih0KXt2YXIgbj1TbSh0KTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbigpL3R9fSxFbT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5sb2coMS1NYXRoLnJhbmRvbSgpKS90fX0sQW09ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKHQpe3ZhciBuLGU9cy5zdGF0dXM7aWYoIWUmJmJ1KHMpfHxlPj0yMDAmJmU8MzAwfHwzMDQ9PT1lKXtpZihvKXRyeXtuPW8uY2FsbChyLHMpfWNhdGNoKHQpe3JldHVybiB2b2lkIGEuY2FsbCgiZXJyb3IiLHIsdCl9ZWxzZSBuPXM7YS5jYWxsKCJsb2FkIixyLG4pfWVsc2UgYS5jYWxsKCJlcnJvciIscix0KX12YXIgcixpLG8sdSxhPWQoImJlZm9yZXNlbmQiLCJwcm9ncmVzcyIsImxvYWQiLCJlcnJvciIpLGM9WWUoKSxzPW5ldyBYTUxIdHRwUmVxdWVzdCxmPW51bGwsbD1udWxsLGg9MDtpZigidW5kZWZpbmVkIj09dHlwZW9mIFhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIHN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3QodCl8fChzPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBzP3Mub25sb2FkPXMub25lcnJvcj1zLm9udGltZW91dD1lOnMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKHQpe3MucmVhZHlTdGF0ZT4zJiZlKHQpfSxzLm9ucHJvZ3Jlc3M9ZnVuY3Rpb24odCl7YS5jYWxsKCJwcm9ncmVzcyIscix0KX0scj17aGVhZGVyOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9KHQrIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP2MuZ2V0KHQpOihudWxsPT1uP2MucmVtb3ZlKHQpOmMuc2V0KHQsbisiIikscil9LG1pbWVUeXBlOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDp0KyIiLHIpOml9LHJlc3BvbnNlVHlwZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LHIpOnV9LHRpbWVvdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K3Qscik6aH0sdXNlcjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP2Y6KGY9bnVsbD09dD9udWxsOnQrIiIscil9LHBhc3N3b3JkOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/bDoobD1udWxsPT10P251bGw6dCsiIixyKX0scmVzcG9uc2U6ZnVuY3Rpb24odCl7cmV0dXJuIG89dCxyfSxnZXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gci5zZW5kKCJHRVQiLHQsbil9LHBvc3Q6ZnVuY3Rpb24odCxuKXtyZXR1cm4gci5zZW5kKCJQT1NUIix0LG4pfSxzZW5kOmZ1bmN0aW9uKG4sZSxvKXtyZXR1cm4gcy5vcGVuKG4sdCwhMCxmLGwpLG51bGw9PWl8fGMuaGFzKCJhY2NlcHQiKXx8Yy5zZXQoImFjY2VwdCIsaSsiLCovKiIpLHMuc2V0UmVxdWVzdEhlYWRlciYmYy5lYWNoKGZ1bmN0aW9uKHQsbil7cy5zZXRSZXF1ZXN0SGVhZGVyKG4sdCl9KSxudWxsIT1pJiZzLm92ZXJyaWRlTWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZShpKSxudWxsIT11JiYocy5yZXNwb25zZVR5cGU9dSksaD4wJiYocy50aW1lb3V0PWgpLG51bGw9PW8mJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYobz1lLGU9bnVsbCksbnVsbCE9byYmMT09PW8ubGVuZ3RoJiYobz14dShvKSksbnVsbCE9byYmci5vbigiZXJyb3IiLG8pLm9uKCJsb2FkIixmdW5jdGlvbih0KXtvKG51bGwsdCl9KSxhLmNhbGwoImJlZm9yZXNlbmQiLHIscykscy5zZW5kKG51bGw9PWU/bnVsbDplKSxyfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiBzLmFib3J0KCkscn0sb246ZnVuY3Rpb24oKXt2YXIgdD1hLm9uLmFwcGx5KGEsYXJndW1lbnRzKTtyZXR1cm4gdD09PWE/cjp0fX0sbnVsbCE9bil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK24pO3JldHVybiByLmdldChuKX1yZXR1cm4gcn0sQ209ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSxyKXt2YXIgaT1BbShlKS5taW1lVHlwZSh0KS5yZXNwb25zZShuKTtpZihudWxsIT1yKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrcik7cmV0dXJuIGkuZ2V0KHIpfXJldHVybiBpfX0sem09Q20oInRleHQvaHRtbCIsZnVuY3Rpb24odCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHQucmVzcG9uc2VUZXh0KX0pLFBtPUNtKCJhcHBsaWNhdGlvbi9qc29uIixmdW5jdGlvbih0KXtyZXR1cm4gSlNPTi5wYXJzZSh0LnJlc3BvbnNlVGV4dCl9KSxSbT1DbSgidGV4dC9wbGFpbiIsZnVuY3Rpb24odCl7cmV0dXJuIHQucmVzcG9uc2VUZXh0fSksTG09Q20oImFwcGxpY2F0aW9uL3htbCIsZnVuY3Rpb24odCl7dmFyIG49dC5yZXNwb25zZVhNTDtpZighbil0aHJvdyBuZXcgRXJyb3IoInBhcnNlIGVycm9yIik7cmV0dXJuIG59KSxxbT1mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihlLHIsaSl7YXJndW1lbnRzLmxlbmd0aDwzJiYoaT1yLHI9bnVsbCk7dmFyIG89QW0oZSkubWltZVR5cGUodCk7cmV0dXJuIG8ucm93PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP28ucmVzcG9uc2Uod3UobixyPXQpKTpyfSxvLnJvdyhyKSxpP28uZ2V0KGkpOm99fSxVbT1xbSgidGV4dC9jc3YiLFFkKSxEbT1xbSgidGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyIscnYpLE9tPUFycmF5LnByb3RvdHlwZSxGbT1PbS5tYXAsSW09T20uc2xpY2UsWW09e25hbWU6ImltcGxpY2l0In0sQm09ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxqbT1mdW5jdGlvbih0KXtyZXR1cm4rdH0sSG09WzAsMV0sWG09ZnVuY3Rpb24obixlLGkpe3ZhciBvLHU9blswXSxhPW5bbi5sZW5ndGgtMV0sYz1yKHUsYSxudWxsPT1lPzEwOmUpO3N3aXRjaChpPWxyKG51bGw9PWk/IixmIjppKSxpLnR5cGUpe2Nhc2UicyI6dmFyIHM9TWF0aC5tYXgoTWF0aC5hYnModSksTWF0aC5hYnMoYSkpO3JldHVybiBudWxsIT1pLnByZWNpc2lvbnx8aXNOYU4obz1XdihjLHMpKXx8KGkucHJlY2lzaW9uPW8pLHQuZm9ybWF0UHJlZml4KGkscyk7Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6bnVsbCE9aS5wcmVjaXNpb258fGlzTmFOKG89JHYoYyxNYXRoLm1heChNYXRoLmFicyh1KSxNYXRoLmFicyhhKSkpKXx8KGkucHJlY2lzaW9uPW8tKCJlIj09PWkudHlwZSkpO2JyZWFrO2Nhc2UiZiI6Y2FzZSIlIjpudWxsIT1pLnByZWNpc2lvbnx8aXNOYU4obz1WdihjKSl8fChpLnByZWNpc2lvbj1vLTIqKCIlIj09PWkudHlwZSkpfXJldHVybiB0LmZvcm1hdChpKX0sVm09ZnVuY3Rpb24odCxuKXt0PXQuc2xpY2UoKTt2YXIgZSxyPTAsaT10Lmxlbmd0aC0xLG89dFtyXSx1PXRbaV07cmV0dXJuIHU8byYmKGU9cixyPWksaT1lLGU9byxvPXUsdT1lKSx0W3JdPW4uZmxvb3IobyksdFtpXT1uLmNlaWwodSksdH0sV209bmV3IERhdGUsJG09bmV3IERhdGUsWm09R3UoZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLXR9KTtabS5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP0d1KGZ1bmN0aW9uKG4pe24uc2V0VGltZShNYXRoLmZsb29yKG4vdCkqdCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRUaW1lKCtuK2UqdCl9LGZ1bmN0aW9uKG4sZSl7cmV0dXJuKGUtbikvdH0pOlptOm51bGx9O3ZhciBHbT1abS5yYW5nZSxKbT0xZTMsUW09NmU0LEttPTM2ZTUsdHg9ODY0ZTUsbng9NjA0OGU1LGV4PUd1KGZ1bmN0aW9uKHQpe3Quc2V0VGltZShNYXRoLmZsb29yKHQvSm0pKkptKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipKbSl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvSm19LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ1NlY29uZHMoKX0pLHJ4PWV4LnJhbmdlLGl4PUd1KGZ1bmN0aW9uKHQpe3Quc2V0VGltZShNYXRoLmZsb29yKHQvUW0pKlFtKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipRbSl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvUW19LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1pbnV0ZXMoKX0pLG94PWl4LnJhbmdlLHV4PUd1KGZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSpRbSVLbTtuPDAmJihuKz1LbSksdC5zZXRUaW1lKE1hdGguZmxvb3IoKCt0LW4pL0ttKSpLbStuKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipLbSl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvS219LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEhvdXJzKCl9KSxheD11eC5yYW5nZSxjeD1HdShmdW5jdGlvbih0KXt0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0RGF0ZSh0LmdldERhdGUoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpRbSkvdHh9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERhdGUoKS0xfSksc3g9Y3gucmFuZ2UsZng9SnUoMCksbHg9SnUoMSksaHg9SnUoMikscHg9SnUoMyksZHg9SnUoNCksdng9SnUoNSksX3g9SnUoNiksZ3g9ZngucmFuZ2UseXg9bHgucmFuZ2UsbXg9aHgucmFuZ2UseHg9cHgucmFuZ2UsYng9ZHgucmFuZ2Usd3g9dngucmFuZ2UsTXg9X3gucmFuZ2UsVHg9R3UoZnVuY3Rpb24odCl7dC5zZXREYXRlKDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNb250aCgpfSksa3g9VHgucmFuZ2UsU3g9R3UoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRGdWxsWWVhcih0LmdldEZ1bGxZZWFyKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KTtTeC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP0d1KGZ1bmN0aW9uKG4pe24uc2V0RnVsbFllYXIoTWF0aC5mbG9vcihuLmdldEZ1bGxZZWFyKCkvdCkqdCksbi5zZXRNb250aCgwLDEpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrZSp0KX0pOm51bGx9O3ZhciBOeD1TeC5yYW5nZSxFeD1HdShmdW5jdGlvbih0KXt0LnNldFVUQ1NlY29uZHMoMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipRbSl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvUW19LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX0pLEF4PUV4LnJhbmdlLEN4PUd1KGZ1bmN0aW9uKHQpe3Quc2V0VVRDTWludXRlcygwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24qS20pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL0ttfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENIb3VycygpfSkseng9Q3gucmFuZ2UsUHg9R3UoZnVuY3Rpb24odCl7dC5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvdHh9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0RhdGUoKS0xfSksUng9UHgucmFuZ2UsTHg9UXUoMCkscXg9UXUoMSksVXg9UXUoMiksRHg9UXUoMyksT3g9UXUoNCksRng9UXUoNSksSXg9UXUoNiksWXg9THgucmFuZ2UsQng9cXgucmFuZ2Usang9VXgucmFuZ2UsSHg9RHgucmFuZ2UsWHg9T3gucmFuZ2UsVng9RngucmFuZ2UsV3g9SXgucmFuZ2UsJHg9R3UoZnVuY3Rpb24odCl7dC5zZXRVVENEYXRlKDEpLHQuc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENNb250aCh0LmdldFVUQ01vbnRoKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0VVRDTW9udGgoKS10LmdldFVUQ01vbnRoKCkrMTIqKG4uZ2V0VVRDRnVsbFllYXIoKS10LmdldFVUQ0Z1bGxZZWFyKCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENNb250aCgpfSksWng9JHgucmFuZ2UsR3g9R3UoZnVuY3Rpb24odCl7dC5zZXRVVENNb250aCgwLDEpLHQuc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENGdWxsWWVhcih0LmdldFVUQ0Z1bGxZZWFyKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0VVRDRnVsbFllYXIoKS10LmdldFVUQ0Z1bGxZZWFyKCl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0Z1bGxZZWFyKCl9KTtHeC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP0d1KGZ1bmN0aW9uKG4pe24uc2V0VVRDRnVsbFllYXIoTWF0aC5mbG9vcihuLmdldFVUQ0Z1bGxZZWFyKCkvdCkqdCksbi5zZXRVVENNb250aCgwLDEpLG4uc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRVVENGdWxsWWVhcihuLmdldFVUQ0Z1bGxZZWFyKCkrZSp0KX0pOm51bGx9O3ZhciBKeCxReD1HeC5yYW5nZSxLeD17Ii0iOiIiLF86IiAiLDA6IjAifSx0Yj0vXlxzKlxkKy8sbmI9L14lLyxlYj0vW1xcXF5cJFwqXCtcP1x8XFtcXVwoXClcLlx7XH1dL2c7R2Eoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgcmI9IiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIsaWI9RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc/SmE6dC51dGNGb3JtYXQocmIpLG9iPStuZXcgRGF0ZSgiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaIik/UWE6dC51dGNQYXJzZShyYiksdWI9MWUzLGFiPTYwKnViLGNiPTYwKmFiLHNiPTI0KmNiLGZiPTcqc2IsbGI9MzAqc2IsaGI9MzY1KnNiLHBiPWZ1bmN0aW9uKCl7cmV0dXJuIG5jKFN4LFR4LGZ4LGN4LHV4LGl4LGV4LFptLHQudGltZUZvcm1hdCkuZG9tYWluKFtuZXcgRGF0ZSgyZTMsMCwxKSxuZXcgRGF0ZSgyZTMsMCwyKV0pfSxkYj1mdW5jdGlvbigpe3JldHVybiBuYyhHeCwkeCxMeCxQeCxDeCxFeCxleCxabSx0LnV0Y0Zvcm1hdCkuZG9tYWluKFtEYXRlLlVUQygyZTMsMCwxKSxEYXRlLlVUQygyZTMsMCwyKV0pfSx2Yj1mdW5jdGlvbih0KXtyZXR1cm4gdC5tYXRjaCgvLns2fS9nKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIiMiK3R9KX0sX2I9dmIoIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpLGdiPXZiKCIzOTNiNzk1MjU0YTM2YjZlY2Y5YzllZGU2Mzc5Mzk4Y2EyNTJiNWNmNmJjZWRiOWM4YzZkMzFiZDllMzllN2JhNTJlN2NiOTQ4NDNjMzlhZDQ5NGFkNjYxNmJlNzk2OWM3YjQxNzNhNTUxOTRjZTZkYmRkZTllZDYiKSx5Yj12YigiMzE4MmJkNmJhZWQ2OWVjYWUxYzZkYmVmZTY1NTBkZmQ4ZDNjZmRhZTZiZmRkMGEyMzFhMzU0NzRjNDc2YTFkOTliYzdlOWMwNzU2YmIxOWU5YWM4YmNiZGRjZGFkYWViNjM2MzYzOTY5Njk2YmRiZGJkZDlkOWQ5IiksbWI9dmIoIjFmNzdiNGFlYzdlOGZmN2YwZWZmYmI3ODJjYTAyYzk4ZGY4YWQ2MjcyOGZmOTg5Njk0NjdiZGM1YjBkNThjNTY0YmM0OWM5NGUzNzdjMmY3YjZkMjdmN2Y3ZmM3YzdjN2JjYmQyMmRiZGI4ZDE3YmVjZjllZGFlNSIpLHhiPVZoKFZ0KDMwMCwuNSwwKSxWdCgtMjQwLC41LDEpKSxiYj1WaChWdCgtMTAwLC43NSwuMzUpLFZ0KDgwLDEuNSwuOCkpLHdiPVZoKFZ0KDI2MCwuNzUsLjM1KSxWdCg4MCwxLjUsLjgpKSxNYj1WdCgpLFRiPWZ1bmN0aW9uKHQpeyh0PDB8fHQ+MSkmJih0LT1NYXRoLmZsb29yKHQpKTt2YXIgbj1NYXRoLmFicyh0LS41KTtyZXR1cm4gTWIuaD0zNjAqdC0xMDAsTWIucz0xLjUtMS41Km4sTWIubD0uOC0uOSpuLE1iKyIifSxrYj1lYyh2YigiNDQwMTU0NDQwMjU2NDUwNDU3NDUwNTU5NDYwNzVhNDYwODVjNDYwYTVkNDYwYjVlNDcwZDYwNDcwZTYxNDcxMDYzNDcxMTY0NDcxMzY1NDgxNDY3NDgxNjY4NDgxNzY5NDgxODZhNDgxYTZjNDgxYjZkNDgxYzZlNDgxZDZmNDgxZjcwNDgyMDcxNDgyMTczNDgyMzc0NDgyNDc1NDgyNTc2NDgyNjc3NDgyODc4NDgyOTc5NDcyYTdhNDcyYzdhNDcyZDdiNDcyZTdjNDcyZjdkNDYzMDdlNDYzMjdlNDYzMzdmNDYzNDgwNDUzNTgxNDUzNzgxNDUzODgyNDQzOTgzNDQzYTgzNDQzYjg0NDMzZDg0NDMzZTg1NDIzZjg1NDI0MDg2NDI0MTg2NDE0Mjg3NDE0NDg3NDA0NTg4NDA0Njg4M2Y0Nzg4M2Y0ODg5M2U0OTg5M2U0YTg5M2U0YzhhM2Q0ZDhhM2Q0ZThhM2M0ZjhhM2M1MDhiM2I1MThiM2I1MjhiM2E1MzhiM2E1NDhjMzk1NThjMzk1NjhjMzg1ODhjMzg1OThjMzc1YThjMzc1YjhkMzY1YzhkMzY1ZDhkMzU1ZThkMzU1ZjhkMzQ2MDhkMzQ2MThkMzM2MjhkMzM2MzhkMzI2NDhlMzI2NThlMzE2NjhlMzE2NzhlMzE2ODhlMzA2OThlMzA2YThlMmY2YjhlMmY2YzhlMmU2ZDhlMmU2ZThlMmU2ZjhlMmQ3MDhlMmQ3MThlMmM3MThlMmM3MjhlMmM3MzhlMmI3NDhlMmI3NThlMmE3NjhlMmE3NzhlMmE3ODhlMjk3OThlMjk3YThlMjk3YjhlMjg3YzhlMjg3ZDhlMjc3ZThlMjc3ZjhlMjc4MDhlMjY4MThlMjY4MjhlMjY4MjhlMjU4MzhlMjU4NDhlMjU4NThlMjQ4NjhlMjQ4NzhlMjM4ODhlMjM4OThlMjM4YThkMjI4YjhkMjI4YzhkMjI4ZDhkMjE4ZThkMjE4ZjhkMjE5MDhkMjE5MThjMjA5MjhjMjA5MjhjMjA5MzhjMWY5NDhjMWY5NThiMWY5NjhiMWY5NzhiMWY5ODhiMWY5OThhMWY5YThhMWU5YjhhMWU5Yzg5MWU5ZDg5MWY5ZTg5MWY5Zjg4MWZhMDg4MWZhMTg4MWZhMTg3MWZhMjg3MjBhMzg2MjBhNDg2MjFhNTg1MjFhNjg1MjJhNzg1MjJhODg0MjNhOTgzMjRhYTgzMjVhYjgyMjVhYzgyMjZhZDgxMjdhZDgxMjhhZTgwMjlhZjdmMmFiMDdmMmNiMTdlMmRiMjdkMmViMzdjMmZiNDdjMzFiNTdiMzJiNjdhMzRiNjc5MzViNzc5MzdiODc4MzhiOTc3M2FiYTc2M2JiYjc1M2RiYzc0M2ZiYzczNDBiZDcyNDJiZTcxNDRiZjcwNDZjMDZmNDhjMTZlNGFjMTZkNGNjMjZjNGVjMzZiNTBjNDZhNTJjNTY5NTRjNTY4NTZjNjY3NThjNzY1NWFjODY0NWNjODYzNWVjOTYyNjBjYTYwNjNjYjVmNjVjYjVlNjdjYzVjNjljZDViNmNjZDVhNmVjZTU4NzBjZjU3NzNkMDU2NzVkMDU0NzdkMTUzN2FkMTUxN2NkMjUwN2ZkMzRlODFkMzRkODRkNDRiODZkNTQ5ODlkNTQ4OGJkNjQ2OGVkNjQ1OTBkNzQzOTNkNzQxOTVkODQwOThkODNlOWJkOTNjOWRkOTNiYTBkYTM5YTJkYTM3YTVkYjM2YThkYjM0YWFkYzMyYWRkYzMwYjBkZDJmYjJkZDJkYjVkZTJiYjhkZTI5YmFkZTI4YmRkZjI2YzBkZjI1YzJkZjIzYzVlMDIxYzhlMDIwY2FlMTFmY2RlMTFkZDBlMTFjZDJlMjFiZDVlMjFhZDhlMjE5ZGFlMzE5ZGRlMzE4ZGZlMzE4ZTJlNDE4ZTVlNDE5ZTdlNDE5ZWFlNTFhZWNlNTFiZWZlNTFjZjFlNTFkZjRlNjFlZjZlNjIwZjhlNjIxZmJlNzIzZmRlNzI1IikpLFNiPWVjKHZiKCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMDkwMjAyMGIwMjAyMGQwMzAzMGYwMzAzMTIwNDA0MTQwNTA0MTYwNjA1MTgwNjA1MWEwNzA2MWMwODA3MWUwOTA3MjAwYTA4MjIwYjA5MjQwYzA5MjYwZDBhMjkwZTBiMmIxMDBiMmQxMTBjMmYxMjBkMzExMzBkMzQxNDBlMzYxNTBlMzgxNjBmM2IxODBmM2QxOTEwM2YxYTEwNDIxYzEwNDQxZDExNDcxZTExNDkyMDExNGIyMTExNGUyMjExNTAyNDEyNTMyNTEyNTUyNzEyNTgyOTExNWEyYTExNWMyYzExNWYyZDExNjEyZjExNjMzMTExNjUzMzEwNjczNDEwNjkzNjEwNmIzODEwNmMzOTBmNmUzYjBmNzAzZDBmNzEzZjBmNzI0MDBmNzQ0MjBmNzU0NDBmNzY0NTEwNzc0NzEwNzg0OTEwNzg0YTEwNzk0YzExN2E0ZTExN2I0ZjEyN2I1MTEyN2M1MjEzN2M1NDEzN2Q1NjE0N2Q1NzE1N2U1OTE1N2U1YTE2N2U1YzE2N2Y1ZDE3N2Y1ZjE4N2Y2MDE4ODA2MjE5ODA2NDFhODA2NTFhODA2NzFiODA2ODFjODE2YTFjODE2YjFkODE2ZDFkODE2ZTFlODE3MDFmODE3MjFmODE3MzIwODE3NTIxODE3NjIxODE3ODIyODE3OTIyODI3YjIzODI3YzIzODI3ZTI0ODI4MDI1ODI4MTI1ODE4MzI2ODE4NDI2ODE4NjI3ODE4ODI3ODE4OTI4ODE4YjI5ODE4YzI5ODE4ZTJhODE5MDJhODE5MTJiODE5MzJiODA5NDJjODA5NjJjODA5ODJkODA5OTJkODA5YjJlN2Y5YzJlN2Y5ZTJmN2ZhMDJmN2ZhMTMwN2VhMzMwN2VhNTMxN2VhNjMxN2RhODMyN2RhYTMzN2RhYjMzN2NhZDM0N2NhZTM0N2JiMDM1N2JiMjM1N2JiMzM2N2FiNTM2N2FiNzM3NzliODM3NzliYTM4NzhiYzM5NzhiZDM5NzdiZjNhNzdjMDNhNzZjMjNiNzVjNDNjNzVjNTNjNzRjNzNkNzNjODNlNzNjYTNlNzJjYzNmNzFjZDQwNzFjZjQwNzBkMDQxNmZkMjQyNmZkMzQzNmVkNTQ0NmRkNjQ1NmNkODQ1NmNkOTQ2NmJkYjQ3NmFkYzQ4NjlkZTQ5NjhkZjRhNjhlMDRjNjdlMjRkNjZlMzRlNjVlNDRmNjRlNTUwNjRlNzUyNjNlODUzNjJlOTU0NjJlYTU2NjFlYjU3NjBlYzU4NjBlZDVhNWZlZTViNWVlZjVkNWVmMDVmNWVmMTYwNWRmMjYyNWRmMjY0NWNmMzY1NWNmNDY3NWNmNDY5NWNmNTZiNWNmNjZjNWNmNjZlNWNmNzcwNWNmNzcyNWNmODc0NWNmODc2NWNmOTc4NWRmOTc5NWRmOTdiNWRmYTdkNWVmYTdmNWVmYTgxNWZmYjgzNWZmYjg1NjBmYjg3NjFmYzg5NjFmYzhhNjJmYzhjNjNmYzhlNjRmYzkwNjVmZDkyNjZmZDk0NjdmZDk2NjhmZDk4NjlmZDlhNmFmZDliNmJmZTlkNmNmZTlmNmRmZWExNmVmZWEzNmZmZWE1NzFmZWE3NzJmZWE5NzNmZWFhNzRmZWFjNzZmZWFlNzdmZWIwNzhmZWIyN2FmZWI0N2JmZWI2N2NmZWI3N2VmZWI5N2ZmZWJiODFmZWJkODJmZWJmODRmZWMxODVmZWMyODdmZWM0ODhmZWM2OGFmZWM4OGNmZWNhOGRmZWNjOGZmZWNkOTBmZWNmOTJmZWQxOTRmZWQzOTVmZWQ1OTdmZWQ3OTlmZWQ4OWFmZGRhOWNmZGRjOWVmZGRlYTBmZGUwYTFmZGUyYTNmZGUzYTVmZGU1YTdmZGU3YTlmZGU5YWFmZGViYWNmY2VjYWVmY2VlYjBmY2YwYjJmY2YyYjRmY2Y0YjZmY2Y2YjhmY2Y3YjlmY2Y5YmJmY2ZiYmRmY2ZkYmYiKSksTmI9ZWModmIoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwYTAyMDIwYzAyMDIwZTAzMDIxMDA0MDMxMjA0MDMxNDA1MDQxNzA2MDQxOTA3MDUxYjA4MDUxZDA5MDYxZjBhMDcyMjBiMDcyNDBjMDgyNjBkMDgyOTBlMDkyYjEwMDkyZDExMGEzMDEyMGEzMjE0MGIzNDE1MGIzNzE2MGIzOTE4MGMzYzE5MGMzZTFiMGM0MTFjMGM0MzFlMGM0NTFmMGM0ODIxMGM0YTIzMGM0YzI0MGM0ZjI2MGM1MTI4MGI1MzI5MGI1NTJiMGI1NzJkMGI1OTJmMGE1YjMxMGE1YzMyMGE1ZTM0MGE1ZjM2MDk2MTM4MDk2MjM5MDk2MzNiMDk2NDNkMDk2NTNlMDk2NjQwMGE2NzQyMGE2ODQ0MGE2ODQ1MGE2OTQ3MGI2YTQ5MGI2YTRhMGM2YjRjMGM2YjRkMGQ2YzRmMGQ2YzUxMGU2YzUyMGU2ZDU0MGY2ZDU1MGY2ZDU3MTA2ZTU5MTA2ZTVhMTE2ZTVjMTI2ZTVkMTI2ZTVmMTM2ZTYxMTM2ZTYyMTQ2ZTY0MTU2ZTY1MTU2ZTY3MTY2ZTY5MTY2ZTZhMTc2ZTZjMTg2ZTZkMTg2ZTZmMTk2ZTcxMTk2ZTcyMWE2ZTc0MWE2ZTc1MWI2ZTc3MWM2ZDc4MWM2ZDdhMWQ2ZDdjMWQ2ZDdkMWU2ZDdmMWU2YzgwMWY2YzgyMjA2Yzg0MjA2Yjg1MjE2Yjg3MjE2Yjg4MjI2YThhMjI2YThjMjM2OThkMjM2OThmMjQ2OTkwMjU2ODkyMjU2ODkzMjY2Nzk1MjY2Nzk3Mjc2Njk4Mjc2NjlhMjg2NTliMjk2NDlkMjk2NDlmMmE2M2EwMmE2M2EyMmI2MmEzMmM2MWE1MmM2MGE2MmQ2MGE4MmU1ZmE5MmU1ZWFiMmY1ZWFkMzA1ZGFlMzA1Y2IwMzE1YmIxMzI1YWIzMzI1YWI0MzM1OWI2MzQ1OGI3MzU1N2I5MzU1NmJhMzY1NWJjMzc1NGJkMzg1M2JmMzk1MmMwM2E1MWMxM2E1MGMzM2I0ZmM0M2M0ZWM2M2Q0ZGM3M2U0Y2M4M2Y0YmNhNDA0YWNiNDE0OWNjNDI0OGNlNDM0N2NmNDQ0NmQwNDU0NWQyNDY0NGQzNDc0M2Q0NDg0MmQ1NGE0MWQ3NGIzZmQ4NGMzZWQ5NGQzZGRhNGUzY2RiNTAzYmRkNTEzYWRlNTIzOGRmNTMzN2UwNTUzNmUxNTYzNWUyNTczNGUzNTkzM2U0NWEzMWU1NWMzMGU2NWQyZmU3NWUyZWU4NjAyZGU5NjEyYmVhNjMyYWViNjQyOWViNjYyOGVjNjcyNmVkNjkyNWVlNmEyNGVmNmMyM2VmNmUyMWYwNmYyMGYxNzExZmYxNzMxZGYyNzQxY2YzNzYxYmYzNzgxOWY0NzkxOGY1N2IxN2Y1N2QxNWY2N2UxNGY2ODAxM2Y3ODIxMmY3ODQxMGY4ODUwZmY4ODcwZWY4ODkwY2Y5OGIwYmY5OGMwYWY5OGUwOWZhOTAwOGZhOTIwN2ZhOTQwN2ZiOTYwNmZiOTcwNmZiOTkwNmZiOWIwNmZiOWQwN2ZjOWYwN2ZjYTEwOGZjYTMwOWZjYTUwYWZjYTYwY2ZjYTgwZGZjYWEwZmZjYWMxMWZjYWUxMmZjYjAxNGZjYjIxNmZjYjQxOGZiYjYxYWZiYjgxZGZiYmExZmZiYmMyMWZiYmUyM2ZhYzAyNmZhYzIyOGZhYzQyYWZhYzYyZGY5YzcyZmY5YzkzMmY5Y2IzNWY4Y2QzN2Y4Y2YzYWY3ZDEzZGY3ZDM0MGY2ZDU0M2Y2ZDc0NmY1ZDk0OWY1ZGI0Y2Y0ZGQ0ZmY0ZGY1M2Y0ZTE1NmYzZTM1YWYzZTU1ZGYyZTY2MWYyZTg2NWYyZWE2OWYxZWM2ZGYxZWQ3MWYxZWY3NWYxZjE3OWYyZjI3ZGYyZjQ4MmYzZjU4NmYzZjY4YWY0Zjg4ZWY1Zjk5MmY2ZmE5NmY4ZmI5YWY5ZmM5ZGZhZmRhMWZjZmZhNCIpKSxFYj1lYyh2YigiMGQwODg3MTAwNzg4MTMwNzg5MTYwNzhhMTkwNjhjMWIwNjhkMWQwNjhlMjAwNjhmMjIwNjkwMjQwNjkxMjYwNTkxMjgwNTkyMmEwNTkzMmMwNTk0MmUwNTk1MmYwNTk2MzEwNTk3MzMwNTk3MzUwNDk4MzcwNDk5MzgwNDlhM2EwNDlhM2MwNDliM2UwNDljM2YwNDljNDEwNDlkNDMwMzllNDQwMzllNDYwMzlmNDgwMzlmNDkwM2EwNGIwM2ExNGMwMmExNGUwMmEyNTAwMmEyNTEwMmEzNTMwMmEzNTUwMmE0NTYwMWE0NTgwMWE0NTkwMWE1NWIwMWE1NWMwMWE2NWUwMWE2NjAwMWE2NjEwMGE3NjMwMGE3NjQwMGE3NjYwMGE3NjcwMGE4NjkwMGE4NmEwMGE4NmMwMGE4NmUwMGE4NmYwMGE4NzEwMGE4NzIwMWE4NzQwMWE4NzUwMWE4NzcwMWE4NzgwMWE4N2EwMmE4N2IwMmE4N2QwM2E4N2UwM2E4ODAwNGE4ODEwNGE3ODMwNWE3ODQwNWE3ODYwNmE2ODcwN2E2ODgwOGE2OGEwOWE1OGIwYWE1OGQwYmE1OGUwY2E0OGYwZGE0OTEwZWEzOTIwZmEzOTQxMGEyOTUxMWExOTYxM2ExOTgxNGEwOTkxNTlmOWExNjlmOWMxNzllOWQxODlkOWUxOTlkYTAxYTljYTExYjliYTIxZDlhYTMxZTlhYTUxZjk5YTYyMDk4YTcyMTk3YTgyMjk2YWEyMzk1YWIyNDk0YWMyNjk0YWQyNzkzYWUyODkyYjAyOTkxYjEyYTkwYjIyYjhmYjMyYzhlYjQyZThkYjUyZjhjYjYzMDhiYjczMThhYjgzMjg5YmEzMzg4YmIzNDg4YmMzNTg3YmQzNzg2YmUzODg1YmYzOTg0YzAzYTgzYzEzYjgyYzIzYzgxYzMzZDgwYzQzZTdmYzU0MDdlYzY0MTdkYzc0MjdjYzg0MzdiYzk0NDdhY2E0NTdhY2I0Njc5Y2M0Nzc4Y2M0OTc3Y2Q0YTc2Y2U0Yjc1Y2Y0Yzc0ZDA0ZDczZDE0ZTcyZDI0ZjcxZDM1MTcxZDQ1MjcwZDU1MzZmZDU1NDZlZDY1NTZkZDc1NjZjZDg1NzZiZDk1ODZhZGE1YTZhZGE1YjY5ZGI1YzY4ZGM1ZDY3ZGQ1ZTY2ZGU1ZjY1ZGU2MTY0ZGY2MjYzZTA2MzYzZTE2NDYyZTI2NTYxZTI2NjYwZTM2ODVmZTQ2OTVlZTU2YTVkZTU2YjVkZTY2YzVjZTc2ZTViZTc2ZjVhZTg3MDU5ZTk3MTU4ZTk3MjU3ZWE3NDU3ZWI3NTU2ZWI3NjU1ZWM3NzU0ZWQ3OTUzZWQ3YTUyZWU3YjUxZWY3YzUxZWY3ZTUwZjA3ZjRmZjA4MDRlZjE4MTRkZjE4MzRjZjI4NDRiZjM4NTRiZjM4NzRhZjQ4ODQ5ZjQ4OTQ4ZjU4YjQ3ZjU4YzQ2ZjY4ZDQ1ZjY4ZjQ0Zjc5MDQ0Zjc5MTQzZjc5MzQyZjg5NDQxZjg5NTQwZjk5NzNmZjk5ODNlZjk5YTNlZmE5YjNkZmE5YzNjZmE5ZTNiZmI5ZjNhZmJhMTM5ZmJhMjM4ZmNhMzM4ZmNhNTM3ZmNhNjM2ZmNhODM1ZmNhOTM0ZmRhYjMzZmRhYzMzZmRhZTMyZmRhZjMxZmRiMTMwZmRiMjJmZmRiNDJmZmRiNTJlZmViNzJkZmViODJjZmViYTJjZmViYjJiZmViZDJhZmViZTJhZmVjMDI5ZmRjMjI5ZmRjMzI4ZmRjNTI3ZmRjNjI3ZmRjODI3ZmRjYTI2ZmRjYjI2ZmNjZDI1ZmNjZTI1ZmNkMDI1ZmNkMjI1ZmJkMzI0ZmJkNTI0ZmJkNzI0ZmFkODI0ZmFkYTI0ZjlkYzI0ZjlkZDI1ZjhkZjI1ZjhlMTI1ZjdlMjI1ZjdlNDI1ZjZlNjI2ZjZlODI2ZjVlOTI2ZjVlYjI3ZjRlZDI3ZjNlZTI3ZjNmMDI3ZjJmMjI3ZjFmNDI2ZjFmNTI1ZjBmNzI0ZjBmOTIxIikpLEFiPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sQ2I9TWF0aC5hYnMsemI9TWF0aC5hdGFuMixQYj1NYXRoLmNvcyxSYj1NYXRoLm1heCxMYj1NYXRoLm1pbixxYj1NYXRoLnNpbixVYj1NYXRoLnNxcnQsRGI9MWUtMTIsT2I9TWF0aC5QSSxGYj1PYi8yLEliPTIqT2IsWWI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIHQscyxmPStuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxsPStlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxoPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLUZiLHA9dS5hcHBseSh0aGlzLGFyZ3VtZW50cyktRmIsZD1DYihwLWgpLHY9cD5oO2lmKGN8fChjPXQ9TGUoKSksbDxmJiYocz1sLGw9ZixmPXMpLGw+RGIpaWYoZD5JYi1EYiljLm1vdmVUbyhsKlBiKGgpLGwqcWIoaCkpLGMuYXJjKDAsMCxsLGgscCwhdiksZj5EYiYmKGMubW92ZVRvKGYqUGIocCksZipxYihwKSksYy5hcmMoMCwwLGYscCxoLHYpKTtlbHNle3ZhciBfLGcseT1oLG09cCx4PWgsYj1wLHc9ZCxNPWQsVD1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKS8yLGs9VD5EYiYmKGk/K2kuYXBwbHkodGhpcyxhcmd1bWVudHMpOlViKGYqZitsKmwpKSxTPUxiKENiKGwtZikvMiwrci5hcHBseSh0aGlzLGFyZ3VtZW50cykpLE49UyxFPVM7aWYoaz5EYil7dmFyIEE9b2Moay9mKnFiKFQpKSxDPW9jKGsvbCpxYihUKSk7KHctPTIqQSk+RGI/KEEqPXY/MTotMSx4Kz1BLGItPUEpOih3PTAseD1iPShoK3ApLzIpLChNLT0yKkMpPkRiPyhDKj12PzE6LTEseSs9QyxtLT1DKTooTT0wLHk9bT0oaCtwKS8yKX12YXIgej1sKlBiKHkpLFA9bCpxYih5KSxSPWYqUGIoYiksTD1mKnFiKGIpO2lmKFM+RGIpe3ZhciBxPWwqUGIobSksVT1sKnFiKG0pLEQ9ZipQYih4KSxPPWYqcWIoeCk7aWYoZDxPYil7dmFyIEY9dz5EYj9sYyh6LFAsRCxPLHEsVSxSLEwpOltSLExdLEk9ei1GWzBdLFk9UC1GWzFdLEI9cS1GWzBdLGo9VS1GWzFdLEg9MS9xYihpYygoSSpCK1kqaikvKFViKEkqSStZKlkpKlViKEIqQitqKmopKSkvMiksWD1VYihGWzBdKkZbMF0rRlsxXSpGWzFdKTtOPUxiKFMsKGYtWCkvKEgtMSkpLEU9TGIoUywobC1YKS8oSCsxKSl9fU0+RGI/RT5EYj8oXz1oYyhELE8seixQLGwsRSx2KSxnPWhjKHEsVSxSLEwsbCxFLHYpLGMubW92ZVRvKF8uY3grXy54MDEsXy5jeStfLnkwMSksRTxTP2MuYXJjKF8uY3gsXy5jeSxFLHpiKF8ueTAxLF8ueDAxKSx6YihnLnkwMSxnLngwMSksIXYpOihjLmFyYyhfLmN4LF8uY3ksRSx6YihfLnkwMSxfLngwMSksemIoXy55MTEsXy54MTEpLCF2KSxjLmFyYygwLDAsbCx6YihfLmN5K18ueTExLF8uY3grXy54MTEpLHpiKGcuY3krZy55MTEsZy5jeCtnLngxMSksIXYpLGMuYXJjKGcuY3gsZy5jeSxFLHpiKGcueTExLGcueDExKSx6YihnLnkwMSxnLngwMSksIXYpKSk6KGMubW92ZVRvKHosUCksYy5hcmMoMCwwLGwseSxtLCF2KSk6Yy5tb3ZlVG8oeixQKSxmPkRiJiZ3PkRiP04+RGI/KF89aGMoUixMLHEsVSxmLC1OLHYpLGc9aGMoeixQLEQsTyxmLC1OLHYpLGMubGluZVRvKF8uY3grXy54MDEsXy5jeStfLnkwMSksTjxTP2MuYXJjKF8uY3gsXy5jeSxOLHpiKF8ueTAxLF8ueDAxKSx6YihnLnkwMSxnLngwMSksIXYpOihjLmFyYyhfLmN4LF8uY3ksTix6YihfLnkwMSxfLngwMSksemIoXy55MTEsXy54MTEpLCF2KSxjLmFyYygwLDAsZix6YihfLmN5K18ueTExLF8uY3grXy54MTEpLHpiKGcuY3krZy55MTEsZy5jeCtnLngxMSksdiksYy5hcmMoZy5jeCxnLmN5LE4semIoZy55MTEsZy54MTEpLHpiKGcueTAxLGcueDAxKSwhdikpKTpjLmFyYygwLDAsZixiLHgsdik6Yy5saW5lVG8oUixMKX1lbHNlIGMubW92ZVRvKDAsMCk7aWYoYy5jbG9zZVBhdGgoKSx0KXJldHVybiBjPW51bGwsdCsiInx8bnVsbH12YXIgbj11YyxlPWFjLHI9QWIoMCksaT1udWxsLG89Y2MsdT1zYyxhPWZjLGM9bnVsbDtyZXR1cm4gdC5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciB0PSgrbi5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixyPSgrby5hcHBseSh0aGlzLGFyZ3VtZW50cykrICt1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1PYi8yO3JldHVybltQYihyKSp0LHFiKHIpKnRdfSx0LmlubmVyUmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6QWIoK2UpLHQpOm59LHQub3V0ZXJSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpBYigrbiksdCk6ZX0sdC5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpBYigrbiksdCk6cn0sdC5wYWRSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09bj9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiBuP246QWIoK24pLHQpOml9LHQuc3RhcnRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkFiKCtuKSx0KTpvfSx0LmVuZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QWIoK24pLHQpOnV9LHQucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpBYigrbiksdCk6YX0sdC5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW51bGw9PW4/bnVsbDpuLHQpOmN9LHR9O3BjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7ZGVmYXVsdDp0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pfX19O3ZhciBCYj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHBjKHQpfSxqYj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGEsYyxzLGY9dC5sZW5ndGgsbD0hMTtmb3IobnVsbD09aSYmKHU9byhzPUxlKCkpKSxhPTA7YTw9ZjsrK2EpIShhPGYmJnIoYz10W2FdLGEsdCkpPT09bCYmKChsPSFsKT91LmxpbmVTdGFydCgpOnUubGluZUVuZCgpKSxsJiZ1LnBvaW50KCtuKGMsYSx0KSwrZShjLGEsdCkpO2lmKHMpcmV0dXJuIHU9bnVsbCxzKyIifHxudWxsfXZhciBuPWRjLGU9dmMscj1BYighMCksaT1udWxsLG89QmIsdT1udWxsO3JldHVybiB0Lng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpBYigrZSksdCk6bn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QWIoK24pLHQpOmV9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkFiKCEhbiksdCk6cn0sdC5jdXJ2ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLG51bGwhPWkmJih1PW8oaSkpLHQpOm99LHQuY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj9pPXU9bnVsbDp1PW8oaT1uKSx0KTppfSx0fSxIYj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG4sZixsLGgscCxkPXQubGVuZ3RoLHY9ITEsXz1uZXcgQXJyYXkoZCksZz1uZXcgQXJyYXkoZCk7Zm9yKG51bGw9PWEmJihzPWMocD1MZSgpKSksbj0wO248PWQ7KytuKXtpZighKG48ZCYmdShoPXRbbl0sbix0KSk9PT12KWlmKHY9IXYpZj1uLHMuYXJlYVN0YXJ0KCkscy5saW5lU3RhcnQoKTtlbHNle2ZvcihzLmxpbmVFbmQoKSxzLmxpbmVTdGFydCgpLGw9bi0xO2w+PWY7LS1sKXMucG9pbnQoX1tsXSxnW2xdKTtzLmxpbmVFbmQoKSxzLmFyZWFFbmQoKX12JiYoX1tuXT0rZShoLG4sdCksZ1tuXT0raShoLG4sdCkscy5wb2ludChyPytyKGgsbix0KTpfW25dLG8/K28oaCxuLHQpOmdbbl0pKX1pZihwKXJldHVybiBzPW51bGwscCsiInx8bnVsbH1mdW5jdGlvbiBuKCl7cmV0dXJuIGpiKCkuZGVmaW5lZCh1KS5jdXJ2ZShjKS5jb250ZXh0KGEpfXZhciBlPWRjLHI9bnVsbCxpPUFiKDApLG89dmMsdT1BYighMCksYT1udWxsLGM9QmIscz1udWxsO3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpBYigrbikscj1udWxsLHQpOmV9LHQueDA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpBYigrbiksdCk6ZX0sdC54MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uP251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpBYigrbiksdCk6cn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QWIoK24pLG89bnVsbCx0KTppfSx0LnkwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QWIoK24pLHQpOml9LHQueTE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09bj9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiBuP246QWIoK24pLHQpOm99LHQubGluZVgwPXQubGluZVkwPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKS54KGUpLnkoaSl9LHQubGluZVkxPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKS54KGUpLnkobyl9LHQubGluZVgxPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKS54KHIpLnkoaSl9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkFiKCEhbiksdCk6dX0sdC5jdXJ2ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uLG51bGwhPWEmJihzPWMoYSkpLHQpOmN9LHQuY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj9hPXM9bnVsbDpzPWMoYT1uKSx0KTphfSx0fSxYYj1mdW5jdGlvbih0LG4pe3JldHVybiBuPHQ/LTE6bj50PzE6bj49dD8wOk5hTn0sVmI9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LFdiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgYSxjLHMsZixsLGg9dC5sZW5ndGgscD0wLGQ9bmV3IEFycmF5KGgpLHY9bmV3IEFycmF5KGgpLF89K2kuYXBwbHkodGhpcyxhcmd1bWVudHMpLGc9TWF0aC5taW4oSWIsTWF0aC5tYXgoLUliLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpLV8pKSx5PU1hdGgubWluKE1hdGguYWJzKGcpL2gsdS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLG09eSooZzwwPy0xOjEpO2ZvcihhPTA7YTxoOysrYSkobD12W2RbYV09YV09K24odFthXSxhLHQpKT4wJiYocCs9bCk7Zm9yKG51bGwhPWU/ZC5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUodlt0XSx2W25dKX0pOm51bGwhPXImJmQuc29ydChmdW5jdGlvbihuLGUpe3JldHVybiByKHRbbl0sdFtlXSl9KSxhPTAscz1wPyhnLWgqbSkvcDowO2E8aDsrK2EsXz1mKWM9ZFthXSxsPXZbY10sZj1fKyhsPjA/bCpzOjApK20sdltjXT17ZGF0YTp0W2NdLGluZGV4OmEsdmFsdWU6bCxzdGFydEFuZ2xlOl8sZW5kQW5nbGU6ZixwYWRBbmdsZTp5fTtyZXR1cm4gdn12YXIgbj1WYixlPVhiLHI9bnVsbCxpPUFiKDApLG89QWIoSWIpLHU9QWIoMCk7cmV0dXJuIHQudmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpBYigrZSksdCk6bn0sdC5zb3J0VmFsdWVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4scj1udWxsLHQpOmV9LHQuc29ydD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLGU9bnVsbCx0KTpyfSx0LnN0YXJ0QW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpBYigrbiksdCk6aX0sdC5lbmRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkFiKCtuKSx0KTpvfSx0LnBhZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QWIoK24pLHQpOnV9LHR9LCRiPWdjKEJiKTtfYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmFyZWFTdGFydCgpfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYUVuZCgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVFbmQoKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLl9jdXJ2ZS5wb2ludChuKk1hdGguc2luKHQpLG4qLU1hdGguY29zKHQpKX19O3ZhciBaYj1mdW5jdGlvbigpe3JldHVybiB5YyhqYigpLmN1cnZlKCRiKSl9LEdiPWZ1bmN0aW9uKCl7dmFyIHQ9SGIoKS5jdXJ2ZSgkYiksbj10LmN1cnZlLGU9dC5saW5lWDAscj10LmxpbmVYMSxpPXQubGluZVkwLG89dC5saW5lWTE7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5zdGFydEFuZ2xlPXQueDAsZGVsZXRlIHQueDAsdC5lbmRBbmdsZT10LngxLGRlbGV0ZSB0LngxLHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuaW5uZXJSYWRpdXM9dC55MCxkZWxldGUgdC55MCx0Lm91dGVyUmFkaXVzPXQueTEsZGVsZXRlIHQueTEsdC5saW5lU3RhcnRBbmdsZT1mdW5jdGlvbigpe3JldHVybiB5YyhlKCkpfSxkZWxldGUgdC5saW5lWDAsdC5saW5lRW5kQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4geWMocigpKX0sZGVsZXRlIHQubGluZVgxLHQubGluZUlubmVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIHljKGkoKSl9LGRlbGV0ZSB0LmxpbmVZMCx0LmxpbmVPdXRlclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiB5YyhvKCkpfSxkZWxldGUgdC5saW5lWTEsdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKGdjKHQpKTpuKCkuX2N1cnZlfSx0fSxKYj17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL09iKTt0Lm1vdmVUbyhlLDApLHQuYXJjKDAsMCxlLDAsSWIpfX0sUWI9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobi81KS8yO3QubW92ZVRvKC0zKmUsLWUpLHQubGluZVRvKC1lLC1lKSx0LmxpbmVUbygtZSwtMyplKSx0LmxpbmVUbyhlLC0zKmUpLHQubGluZVRvKGUsLWUpLHQubGluZVRvKDMqZSwtZSksdC5saW5lVG8oMyplLGUpLHQubGluZVRvKGUsZSksdC5saW5lVG8oZSwzKmUpLHQubGluZVRvKC1lLDMqZSksdC5saW5lVG8oLWUsZSksdC5saW5lVG8oLTMqZSxlKSx0LmNsb3NlUGF0aCgpfX0sS2I9TWF0aC5zcXJ0KDEvMyksdHc9MipLYixudz17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL3R3KSxyPWUqS2I7dC5tb3ZlVG8oMCwtZSksdC5saW5lVG8ociwwKSx0LmxpbmVUbygwLGUpLHQubGluZVRvKC1yLDApLHQuY2xvc2VQYXRoKCl9fSxldz0uODkwODEzMDkxNTI5Mjg1Mixydz1NYXRoLnNpbihPYi8xMCkvTWF0aC5zaW4oNypPYi8xMCksaXc9TWF0aC5zaW4oSWIvMTApKnJ3LG93PS1NYXRoLmNvcyhJYi8xMCkqcncsdXc9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobipldykscj1pdyplLGk9b3cqZTt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLGkpO2Zvcih2YXIgbz0xO288NTsrK28pe3ZhciB1PUliKm8vNSxhPU1hdGguY29zKHUpLGM9TWF0aC5zaW4odSk7dC5saW5lVG8oYyplLC1hKmUpLHQubGluZVRvKGEqci1jKmksYypyK2EqaSl9dC5jbG9zZVBhdGgoKX19LGF3PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4pLHI9LWUvMjt0LnJlY3QocixyLGUsZSl9fSxjdz1NYXRoLnNxcnQoMyksc3c9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT0tTWF0aC5zcXJ0KG4vKDMqY3cpKTt0Lm1vdmVUbygwLDIqZSksdC5saW5lVG8oLWN3KmUsLWUpLHQubGluZVRvKGN3KmUsLWUpLHQuY2xvc2VQYXRoKCl9fSxmdz0tLjUsbHc9TWF0aC5zcXJ0KDMpLzIsaHc9MS9NYXRoLnNxcnQoMTIpLHB3PTMqKGh3LzIrMSksZHc9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobi9wdykscj1lLzIsaT1lKmh3LG89cix1PWUqaHcrZSxhPS1vLGM9dTt0Lm1vdmVUbyhyLGkpLHQubGluZVRvKG8sdSksdC5saW5lVG8oYSxjKSx0LmxpbmVUbyhmdypyLWx3KmksbHcqcitmdyppKSx0LmxpbmVUbyhmdypvLWx3KnUsbHcqbytmdyp1KSx0LmxpbmVUbyhmdyphLWx3KmMsbHcqYStmdypjKSx0LmxpbmVUbyhmdypyK2x3KmksZncqaS1sdypyKSx0LmxpbmVUbyhmdypvK2x3KnUsZncqdS1sdypvKSx0LmxpbmVUbyhmdyphK2x3KmMsZncqYy1sdyphKSx0LmNsb3NlUGF0aCgpfX0sdnc9W0piLFFiLG53LGF3LHV3LHN3LGR3XSxfdz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt2YXIgdDtpZihyfHwocj10PUxlKCkpLG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLmRyYXcociwrZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLHQpcmV0dXJuIHI9bnVsbCx0KyIifHxudWxsfXZhciBuPUFiKEpiKSxlPUFiKDY0KSxyPW51bGw7cmV0dXJuIHQudHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOkFiKGUpLHQpOm59LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkFiKCtuKSx0KTplfSx0LmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09bj9udWxsOm4sdCk6cn0sdH0sZ3c9ZnVuY3Rpb24oKXt9O3hjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDM6bWModGhpcyx0aGlzLl94MSx0aGlzLl95MSk7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5fY29udGV4dC5saW5lVG8oKDUqdGhpcy5feDArdGhpcy5feDEpLzYsKDUqdGhpcy5feTArdGhpcy5feTEpLzYpO2RlZmF1bHQ6bWModGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bn19O3ZhciB5dz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHhjKHQpfTtiYy5wcm90b3R5cGU9e2FyZWFTdGFydDpndyxhcmVhRW5kOmd3LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKSx0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCl9fSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gyPXQsdGhpcy5feTI9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDQ9dCx0aGlzLl95ND1uLHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsKHRoaXMuX3kwKzQqdGhpcy5feTErbikvNik7YnJlYWs7ZGVmYXVsdDptYyh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX07dmFyIG13PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYmModCl9O3djLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYzPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO3ZhciBlPSh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYscj0odGhpcy5feTArNCp0aGlzLl95MStuKS82O3RoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8oZSxyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyhlLHIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6bWModGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bn19O3ZhciB4dz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHdjKHQpfTtNYy5wcm90b3R5cGU9e2xpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9W10sdGhpcy5feT1bXSx0aGlzLl9iYXNpcy5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3gsbj10aGlzLl95LGU9dC5sZW5ndGgtMTtpZihlPjApZm9yKHZhciByLGk9dFswXSxvPW5bMF0sdT10W2VdLWksYT1uW2VdLW8sYz0tMTsrK2M8PWU7KXI9Yy9lLHRoaXMuX2Jhc2lzLnBvaW50KHRoaXMuX2JldGEqdFtjXSsoMS10aGlzLl9iZXRhKSooaStyKnUpLHRoaXMuX2JldGEqbltjXSsoMS10aGlzLl9iZXRhKSoobytyKmEpKTt0aGlzLl94PXRoaXMuX3k9bnVsbCx0aGlzLl9iYXNpcy5saW5lRW5kKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX07dmFyIGJ3PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gMT09PW4/bmV3IHhjKHQpOm5ldyBNYyh0LG4pfXJldHVybiBlLmJldGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguODUpO2tjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzpUYyh0aGlzLHRoaXMuX3gxLHRoaXMuX3kxKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5feDE9dCx0aGlzLl95MT1uO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO2RlZmF1bHQ6VGModGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciB3dz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBrYyh0LG4pfXJldHVybiBlLnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSgwKTtTYy5wcm90b3R5cGU9e2FyZWFTdGFydDpndyxhcmVhRW5kOmd3LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6VGModGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBNdz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBTYyh0LG4pfXJldHVybiBlLnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSgwKTtOYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpUYyh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIFR3PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IE5jKHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO0FjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gyLHRoaXMuX3kyKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zCjtkZWZhdWx0OkVjKHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIGt3PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgQWModCxuKTpuZXcga2ModCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtDYy5wcm90b3R5cGU9e2FyZWFTdGFydDpndyxhcmVhRW5kOmd3LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gzPXQsdGhpcy5feTM9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94ND10LHRoaXMuX3k0PW4pO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g1PXQsdGhpcy5feTU9bjticmVhaztkZWZhdWx0OkVjKHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIFN3PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgQ2ModCxuKTpuZXcgU2ModCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTt6Yy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6RWModGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgTnc9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyB6Yyh0LG4pOm5ldyBOYyh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO1BjLnByb3RvdHlwZT17YXJlYVN0YXJ0Omd3LGFyZWFFbmQ6Z3csbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuX3BvaW50JiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3Q9K3Qsbj0rbix0aGlzLl9wb2ludD90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOih0aGlzLl9wb2ludD0xLHRoaXMuX2NvbnRleHQubW92ZVRvKHQsbikpfX07dmFyIEV3PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUGModCl9O0RjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3QwPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsdGhpcy5feTEpO2JyZWFrO2Nhc2UgMzpVYyh0aGlzLHRoaXMuX3QwLHFjKHRoaXMsdGhpcy5fdDApKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7dmFyIGU9TmFOO2lmKHQ9K3Qsbj0rbix0IT09dGhpcy5feDF8fG4hPT10aGlzLl95MSl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MyxVYyh0aGlzLHFjKHRoaXMsZT1MYyh0aGlzLHQsbikpLGUpO2JyZWFrO2RlZmF1bHQ6VWModGhpcyx0aGlzLl90MCxlPUxjKHRoaXMsdCxuKSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1uLHRoaXMuX3QwPWV9fX0sKE9jLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKERjLnByb3RvdHlwZSkpLnBvaW50PWZ1bmN0aW9uKHQsbil7RGMucHJvdG90eXBlLnBvaW50LmNhbGwodGhpcyxuLHQpfSxGYy5wcm90b3R5cGU9e21vdmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuX2NvbnRleHQubW92ZVRvKG4sdCl9LGNsb3NlUGF0aDpmdW5jdGlvbigpe3RoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LGxpbmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuX2NvbnRleHQubGluZVRvKG4sdCl9LGJlemllckN1cnZlVG86ZnVuY3Rpb24odCxuLGUscixpLG8pe3RoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhuLHQscixlLG8saSl9fSxCYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W119LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LG49dGhpcy5feSxlPXQubGVuZ3RoO2lmKGUpaWYodGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0WzBdLG5bMF0pOnRoaXMuX2NvbnRleHQubW92ZVRvKHRbMF0sblswXSksMj09PWUpdGhpcy5fY29udGV4dC5saW5lVG8odFsxXSxuWzFdKTtlbHNlIGZvcih2YXIgcj1qYyh0KSxpPWpjKG4pLG89MCx1PTE7dTxlOysrbywrK3UpdGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHJbMF1bb10saVswXVtvXSxyWzFdW29dLGlbMV1bb10sdFt1XSxuW3VdKTsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT1lKSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZSx0aGlzLl94PXRoaXMuX3k9bnVsbH0scG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLl94LnB1c2goK3QpLHRoaXMuX3kucHVzaCgrbil9fTt2YXIgQXc9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBCYyh0KX07SGMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD10aGlzLl95PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MDx0aGlzLl90JiZ0aGlzLl90PDEmJjI9PT10aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KSwodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT49MCYmKHRoaXMuX3Q9MS10aGlzLl90LHRoaXMuX2xpbmU9MS10aGlzLl9saW5lKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OmlmKHRoaXMuX3Q8PTApdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCxuKSx0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2Vsc2V7dmFyIGU9dGhpcy5feCooMS10aGlzLl90KSt0KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0aGlzLl95KSx0aGlzLl9jb250ZXh0LmxpbmVUbyhlLG4pfX10aGlzLl94PXQsdGhpcy5feT1ufX07dmFyIEN3PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgSGModCwuNSl9LHp3PUFycmF5LnByb3RvdHlwZS5zbGljZSxQdz1mdW5jdGlvbih0LG4pe2lmKChyPXQubGVuZ3RoKT4xKWZvcih2YXIgZSxyLGk9MSxvPXRbblswXV0sdT1vLmxlbmd0aDtpPHI7KytpKXtlPW8sbz10W25baV1dO2Zvcih2YXIgYT0wO2E8dTsrK2Epb1thXVsxXSs9b1thXVswXT1pc05hTihlW2FdWzFdKT9lW2FdWzBdOmVbYV1bMV19fSxSdz1mdW5jdGlvbih0KXtmb3IodmFyIG49dC5sZW5ndGgsZT1uZXcgQXJyYXkobik7LS1uPj0wOyllW25dPW47cmV0dXJuIGV9LEx3PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbyx1LGE9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksYz10Lmxlbmd0aCxzPWEubGVuZ3RoLGY9bmV3IEFycmF5KHMpO2ZvcihvPTA7bzxzOysrbyl7Zm9yKHZhciBsLGg9YVtvXSxwPWZbb109bmV3IEFycmF5KGMpLGQ9MDtkPGM7KytkKXBbZF09bD1bMCwraSh0W2RdLGgsZCx0KV0sbC5kYXRhPXRbZF07cC5rZXk9aH1mb3Iobz0wLHU9ZShmKTtvPHM7KytvKWZbdVtvXV0uaW5kZXg9bztyZXR1cm4gcihmLHUpLGZ9dmFyIG49QWIoW10pLGU9Uncscj1QdyxpPVdjO3JldHVybiB0LmtleXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpBYih6dy5jYWxsKGUpKSx0KTpufSx0LnZhbHVlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QWIoK24pLHQpOml9LHQub3JkZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09bj9SdzoiZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkFiKHp3LmNhbGwobikpLHQpOmV9LHQub2Zmc2V0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PW4/UHc6bix0KTpyfSx0fSxxdz1mdW5jdGlvbih0LG4pe2lmKChyPXQubGVuZ3RoKT4wKXtmb3IodmFyIGUscixpLG89MCx1PXRbMF0ubGVuZ3RoO288dTsrK28pe2ZvcihpPWU9MDtlPHI7KytlKWkrPXRbZV1bb11bMV18fDA7aWYoaSlmb3IoZT0wO2U8cjsrK2UpdFtlXVtvXVsxXS89aX1Qdyh0LG4pfX0sVXc9ZnVuY3Rpb24odCxuKXtpZigoZT10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHI9MCxpPXRbblswXV0sbz1pLmxlbmd0aDtyPG87KytyKXtmb3IodmFyIHU9MCxhPTA7dTxlOysrdSlhKz10W3VdW3JdWzFdfHwwO2lbcl1bMV0rPWlbcl1bMF09LWEvMn1Qdyh0LG4pfX0sRHc9ZnVuY3Rpb24odCxuKXtpZigoaT10Lmxlbmd0aCk+MCYmKHI9KGU9dFtuWzBdXSkubGVuZ3RoKT4wKXtmb3IodmFyIGUscixpLG89MCx1PTE7dTxyOysrdSl7Zm9yKHZhciBhPTAsYz0wLHM9MDthPGk7KythKXtmb3IodmFyIGY9dFtuW2FdXSxsPWZbdV1bMV18fDAsaD1mW3UtMV1bMV18fDAscD0obC1oKS8yLGQ9MDtkPGE7KytkKXt2YXIgdj10W25bZF1dO3ArPSh2W3VdWzFdfHwwKS0odlt1LTFdWzFdfHwwKX1jKz1sLHMrPXAqbH1lW3UtMV1bMV0rPWVbdS0xXVswXT1vLGMmJihvLT1zL2MpfWVbdS0xXVsxXSs9ZVt1LTFdWzBdPW8sUHcodCxuKX19LE93PWZ1bmN0aW9uKHQpe3ZhciBuPXQubWFwKCRjKTtyZXR1cm4gUncodCkuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBuW3RdLW5bZV19KX0sRnc9ZnVuY3Rpb24odCl7cmV0dXJuIE93KHQpLnJldmVyc2UoKX0sSXc9ZnVuY3Rpb24odCl7dmFyIG4sZSxyPXQubGVuZ3RoLGk9dC5tYXAoJGMpLG89UncodCkuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBpW25dLWlbdF19KSx1PTAsYT0wLGM9W10scz1bXTtmb3Iobj0wO248cjsrK24pZT1vW25dLHU8YT8odSs9aVtlXSxjLnB1c2goZSkpOihhKz1pW2VdLHMucHVzaChlKSk7cmV0dXJuIHMucmV2ZXJzZSgpLmNvbmNhdChjKX0sWXc9ZnVuY3Rpb24odCl7cmV0dXJuIFJ3KHQpLnJldmVyc2UoKX0sQnc9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fTtKYy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkpjLGluc2VydDpmdW5jdGlvbih0LG4pe3ZhciBlLHIsaTtpZih0KXtpZihuLlA9dCxuLk49dC5OLHQuTiYmKHQuTi5QPW4pLHQuTj1uLHQuUil7Zm9yKHQ9dC5SO3QuTDspdD10Lkw7dC5MPW59ZWxzZSB0LlI9bjtlPXR9ZWxzZSB0aGlzLl8/KHQ9bnModGhpcy5fKSxuLlA9bnVsbCxuLk49dCx0LlA9dC5MPW4sZT10KToobi5QPW4uTj1udWxsLHRoaXMuXz1uLGU9bnVsbCk7Zm9yKG4uTD1uLlI9bnVsbCxuLlU9ZSxuLkM9ITAsdD1uO2UmJmUuQzspcj1lLlUsZT09PXIuTD8oaT1yLlIsaSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5SJiYoS2ModGhpcyxlKSx0PWUsZT10LlUpLGUuQz0hMSxyLkM9ITAsdHModGhpcyxyKSkpOihpPXIuTCxpJiZpLkM/KGUuQz1pLkM9ITEsci5DPSEwLHQ9cik6KHQ9PT1lLkwmJih0cyh0aGlzLGUpLHQ9ZSxlPXQuVSksZS5DPSExLHIuQz0hMCxLYyh0aGlzLHIpKSksZT10LlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbih0KXt0Lk4mJih0Lk4uUD10LlApLHQuUCYmKHQuUC5OPXQuTiksdC5OPXQuUD1udWxsO3ZhciBuLGUscixpPXQuVSxvPXQuTCx1PXQuUjtpZihlPW8/dT9ucyh1KTpvOnUsaT9pLkw9PT10P2kuTD1lOmkuUj1lOnRoaXMuXz1lLG8mJnU/KHI9ZS5DLGUuQz10LkMsZS5MPW8sby5VPWUsZSE9PXU/KGk9ZS5VLGUuVT10LlUsdD1lLlIsaS5MPXQsZS5SPXUsdS5VPWUpOihlLlU9aSxpPWUsdD1lLlIpKToocj10LkMsdD1lKSx0JiYodC5VPWkpLCFyKXtpZih0JiZ0LkMpcmV0dXJuIHZvaWQodC5DPSExKTtkb3tpZih0PT09dGhpcy5fKWJyZWFrO2lmKHQ9PT1pLkwpe2lmKG49aS5SLG4uQyYmKG4uQz0hMSxpLkM9ITAsS2ModGhpcyxpKSxuPWkuUiksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5SJiZuLlIuQ3x8KG4uTC5DPSExLG4uQz0hMCx0cyh0aGlzLG4pLG49aS5SKSxuLkM9aS5DLGkuQz1uLlIuQz0hMSxLYyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfX1lbHNlIGlmKG49aS5MLG4uQyYmKG4uQz0hMSxpLkM9ITAsdHModGhpcyxpKSxuPWkuTCksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5MJiZuLkwuQ3x8KG4uUi5DPSExLG4uQz0hMCxLYyh0aGlzLG4pLG49aS5MKSxuLkM9aS5DLGkuQz1uLkwuQz0hMSx0cyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfW4uQz0hMCx0PWksaT1pLlV9d2hpbGUoIXQuQyk7dCYmKHQuQz0hMSl9fX07dmFyIGp3LEh3LFh3LFZ3LFd3LCR3PVtdLFp3PVtdLEd3PTFlLTYsSnc9MWUtMTI7U3MucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpTcyxwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKGZ1bmN0aW9uKG4pe3ZhciBlPW4uaGFsZmVkZ2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZnMobix0W2VdKX0pO3JldHVybiBlLmRhdGE9bi5zaXRlLmRhdGEsZX0pfSx0cmlhbmdsZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXSxuPXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2lmKG89KGk9ZS5oYWxmZWRnZXMpLmxlbmd0aClmb3IodmFyIGksbyx1LGE9ZS5zaXRlLGM9LTEscz1uW2lbby0xXV0sZj1zLmxlZnQ9PT1hP3MucmlnaHQ6cy5sZWZ0OysrYzxvOyl1PWYscz1uW2lbY11dLGY9cy5sZWZ0PT09YT9zLnJpZ2h0OnMubGVmdCx1JiZmJiZyPHUuaW5kZXgmJnI8Zi5pbmRleCYmVHMoYSx1LGYpPDAmJnQucHVzaChbYS5kYXRhLHUuZGF0YSxmLmRhdGFdKX0pLHR9LGxpbmtzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZXMuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJpZ2h0fSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6dC5sZWZ0LmRhdGEsdGFyZ2V0OnQucmlnaHQuZGF0YX19KX0sZmluZDpmdW5jdGlvbih0LG4sZSl7Zm9yKHZhciByLGksbz10aGlzLHU9by5fZm91bmR8fDAsYT1vLmNlbGxzLmxlbmd0aDshKGk9by5jZWxsc1t1XSk7KWlmKCsrdT49YSlyZXR1cm4gbnVsbDt2YXIgYz10LWkuc2l0ZVswXSxzPW4taS5zaXRlWzFdLGY9YypjK3MqcztkbyBpPW8uY2VsbHNbcj11XSx1PW51bGwsaS5oYWxmZWRnZXMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgcj1vLmVkZ2VzW2VdLGE9ci5sZWZ0O2lmKGEhPT1pLnNpdGUmJmF8fChhPXIucmlnaHQpKXt2YXIgYz10LWFbMF0scz1uLWFbMV0sbD1jKmMrcypzO2w8ZiYmKGY9bCx1PWEuaW5kZXgpfX0pO3doaWxlKG51bGwhPT11KTtyZXR1cm4gby5fZm91bmQ9cixudWxsPT1lfHxmPD1lKmU/aS5zaXRlOm51bGx9fTt2YXIgUXc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiBuZXcgU3ModC5tYXAoZnVuY3Rpb24ocixpKXt2YXIgbz1bTWF0aC5yb3VuZChuKHIsaSx0KS9HdykqR3csTWF0aC5yb3VuZChlKHIsaSx0KS9HdykqR3ddO3JldHVybiBvLmluZGV4PWksby5kYXRhPXIsb30pLHIpfXZhciBuPVpjLGU9R2Mscj1udWxsO3JldHVybiB0LnBvbHlnb25zPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4pLnBvbHlnb25zKCl9LHQubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIHQobikubGlua3MoKX0sdC50cmlhbmdsZXM9ZnVuY3Rpb24obil7cmV0dXJuIHQobikudHJpYW5nbGVzKCl9LHQueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOkJ3KCtlKSx0KTpufSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpCdygrbiksdCk6ZX0sdC5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09bj9udWxsOltbK25bMF1bMF0sK25bMF1bMV1dLFsrblsxXVswXSwrblsxXVsxXV1dLHQpOnImJltbclswXVswXSxyWzBdWzFdXSxbclsxXVswXSxyWzFdWzFdXV19LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uP251bGw6W1swLDBdLFsrblswXSwrblsxXV1dLHQpOnImJltyWzFdWzBdLXJbMF1bMF0sclsxXVsxXS1yWzBdWzFdXX0sdH0sS3c9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fTtFcy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkVzLHNjYWxlOmZ1bmN0aW9uKHQpe3JldHVybiAxPT09dD90aGlzOm5ldyBFcyh0aGlzLmsqdCx0aGlzLngsdGhpcy55KX0sdHJhbnNsYXRlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIDA9PT10JjA9PT1uP3RoaXM6bmV3IEVzKHRoaXMuayx0aGlzLngrdGhpcy5rKnQsdGhpcy55K3RoaXMuaypuKX0sYXBwbHk6ZnVuY3Rpb24odCl7cmV0dXJuW3RbMF0qdGhpcy5rK3RoaXMueCx0WzFdKnRoaXMuayt0aGlzLnldfSxhcHBseVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQqdGhpcy5rK3RoaXMueH0sYXBwbHlZOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnl9LGludmVydDpmdW5jdGlvbih0KXtyZXR1cm5bKHRbMF0tdGhpcy54KS90aGlzLmssKHRbMV0tdGhpcy55KS90aGlzLmtdfSxpbnZlcnRYOmZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMueCkvdGhpcy5rfSxpbnZlcnRZOmZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMueSkvdGhpcy5rfSxyZXNjYWxlWDpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHJlc2NhbGVZOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoKS5kb21haW4odC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksdGhpcykubWFwKHQuaW52ZXJ0LHQpKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4idHJhbnNsYXRlKCIrdGhpcy54KyIsIit0aGlzLnkrIikgc2NhbGUoIit0aGlzLmsrIikifX07dmFyIHRNPW5ldyBFcygxLDAsMCk7QXMucHJvdG90eXBlPUVzLnByb3RvdHlwZTt2YXIgbk09ZnVuY3Rpb24oKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX0sZU09ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQpe3Qub24oIndoZWVsLnpvb20iLHMpLm9uKCJtb3VzZWRvd24uem9vbSIsZikub24oImRibGNsaWNrLnpvb20iLGwpLm9uKCJ0b3VjaHN0YXJ0Lnpvb20iLGgpLm9uKCJ0b3VjaG1vdmUuem9vbSIscCkub24oInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbSIsdikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKS5wcm9wZXJ0eSgiX196b29tIixScyl9ZnVuY3Rpb24gZSh0LG4pe3JldHVybiBuPU1hdGgubWF4KHgsTWF0aC5taW4oYixuKSksbj09PXQuaz90Om5ldyBFcyhuLHQueCx0LnkpfWZ1bmN0aW9uIHIodCxuLGUpe3ZhciByPW5bMF0tZVswXSp0LmssaT1uWzFdLWVbMV0qdC5rO3JldHVybiByPT09dC54JiZpPT09dC55P3Q6bmV3IEVzKHQuayxyLGkpfWZ1bmN0aW9uIGkodCxuKXt2YXIgZT10LmludmVydFgoblswXVswXSktdyxyPXQuaW52ZXJ0WChuWzFdWzBdKS1NLGk9dC5pbnZlcnRZKG5bMF1bMV0pLVQsbz10LmludmVydFkoblsxXVsxXSktaztyZXR1cm4gdC50cmFuc2xhdGUocj5lPyhlK3IpLzI6TWF0aC5taW4oMCxlKXx8TWF0aC5tYXgoMCxyKSxvPmk/KGkrbykvMjpNYXRoLm1pbigwLGkpfHxNYXRoLm1heCgwLG8pKX1mdW5jdGlvbiBvKHQpe3JldHVyblsoK3RbMF1bMF0rICt0WzFdWzBdKS8yLCgrdFswXVsxXSsgK3RbMV1bMV0pLzJdfWZ1bmN0aW9uIHUodCxuLGUpe3Qub24oInN0YXJ0Lnpvb20iLGZ1bmN0aW9uKCl7YSh0aGlzLGFyZ3VtZW50cykuc3RhcnQoKX0pLm9uKCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbSIsZnVuY3Rpb24oKXthKHRoaXMsYXJndW1lbnRzKS5lbmQoKX0pLnR3ZWVuKCJ6b29tIixmdW5jdGlvbigpe3ZhciB0PXRoaXMscj1hcmd1bWVudHMsaT1hKHQsciksdT1tLmFwcGx5KHQsciksYz1lfHxvKHUpLHM9TWF0aC5tYXgodVsxXVswXS11WzBdWzBdLHVbMV1bMV0tdVswXVsxXSksZj10Ll9fem9vbSxsPSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodCxyKTpuLGg9TihmLmludmVydChjKS5jb25jYXQocy9mLmspLGwuaW52ZXJ0KGMpLmNvbmNhdChzL2wuaykpO3JldHVybiBmdW5jdGlvbih0KXtpZigxPT09dCl0PWw7ZWxzZXt2YXIgbj1oKHQpLGU9cy9uWzJdO3Q9bmV3IEVzKGUsY1swXS1uWzBdKmUsY1sxXS1uWzFdKmUpfWkuem9vbShudWxsLHQpfX0pfWZ1bmN0aW9uIGEodCxuKXtmb3IodmFyIGUscj0wLGk9QS5sZW5ndGg7cjxpOysrcilpZigoZT1BW3JdKS50aGF0PT09dClyZXR1cm4gZTtyZXR1cm4gbmV3IGModCxuKX1mdW5jdGlvbiBjKHQsbil7dGhpcy50aGF0PXQsdGhpcy5hcmdzPW4sdGhpcy5pbmRleD0tMSx0aGlzLmFjdGl2ZT0wLHRoaXMuZXh0ZW50PW0uYXBwbHkodCxuKX1mdW5jdGlvbiBzKCl7ZnVuY3Rpb24gbigpe28ud2hlZWw9bnVsbCxvLmVuZCgpfWlmKHkuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbz1hKHRoaXMsYXJndW1lbnRzKSx1PXRoaXMuX196b29tLGM9TWF0aC5tYXgoeCxNYXRoLm1pbihiLHUuaypNYXRoLnBvdygyLC10LmV2ZW50LmRlbHRhWSoodC5ldmVudC5kZWx0YU1vZGU/MTIwOjEpLzUwMCkpKSxzPVlmKHRoaXMpO2lmKG8ud2hlZWwpby5tb3VzZVswXVswXT09PXNbMF0mJm8ubW91c2VbMF1bMV09PT1zWzFdfHwoby5tb3VzZVsxXT11LmludmVydChvLm1vdXNlWzBdPXMpKSxjbGVhclRpbWVvdXQoby53aGVlbCk7ZWxzZXtpZih1Lms9PT1jKXJldHVybjtvLm1vdXNlPVtzLHUuaW52ZXJ0KHMpXSx2cCh0aGlzKSxvLnN0YXJ0KCl9bk0oKSxvLndoZWVsPXNldFRpbWVvdXQobixQKSxvLnpvb20oIm1vdXNlIixpKHIoZSh1LGMpLG8ubW91c2VbMF0sby5tb3VzZVsxXSksby5leHRlbnQpKX19ZnVuY3Rpb24gZigpe2Z1bmN0aW9uIG4oKXtuTSgpLG8ubW92ZWQ9ITAsby56b29tKCJtb3VzZSIsaShyKG8udGhhdC5fX3pvb20sby5tb3VzZVswXT1ZZihvLnRoYXQpLG8ubW91c2VbMV0pLG8uZXh0ZW50KSl9ZnVuY3Rpb24gZSgpe3Uub24oIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbSIsbnVsbCksZ3QodC5ldmVudC52aWV3LG8ubW92ZWQpLG5NKCksby5lbmQoKX1pZighZyYmeS5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBvPWEodGhpcyxhcmd1bWVudHMpLHU9TWwodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLnpvb20iLG4sITApLm9uKCJtb3VzZXVwLnpvb20iLGUsITApLGM9WWYodGhpcyk7RWwodC5ldmVudC52aWV3KSxDcygpLG8ubW91c2U9W2MsdGhpcy5fX3pvb20uaW52ZXJ0KGMpXSx2cCh0aGlzKSxvLnN0YXJ0KCl9fWZ1bmN0aW9uIGwoKXtpZih5LmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG89dGhpcy5fX3pvb20sYT1ZZih0aGlzKSxjPW8uaW52ZXJ0KGEpLHM9by5rKih0LmV2ZW50LnNoaWZ0S2V5Py41OjIpLGY9aShyKGUobyxzKSxhLGMpLG0uYXBwbHkodGhpcyxhcmd1bWVudHMpKTtuTSgpLFM+MD9NbCh0aGlzKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oUykuY2FsbCh1LGYsYSk6TWwodGhpcykuY2FsbChuLnRyYW5zZm9ybSxmKX19ZnVuY3Rpb24gaCgpe2lmKHkuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbixlLHIsaSxvPWEodGhpcyxhcmd1bWVudHMpLHU9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxjPXUubGVuZ3RoO2ZvcihDcygpLGU9MDtlPGM7KytlKXI9dVtlXSxpPWtsKHRoaXMsdSxyLmlkZW50aWZpZXIpLGk9W2ksdGhpcy5fX3pvb20uaW52ZXJ0KGkpLHIuaWRlbnRpZmllcl0sby50b3VjaDA/by50b3VjaDF8fChvLnRvdWNoMT1pKTooby50b3VjaDA9aSxuPSEwKTtpZihfJiYoXz1jbGVhclRpbWVvdXQoXyksIW8udG91Y2gxKSlyZXR1cm4gby5lbmQoKSxpPU1sKHRoaXMpLm9uKCJkYmxjbGljay56b29tIiksdm9pZChpJiZpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7biYmKF89c2V0VGltZW91dChmdW5jdGlvbigpe189bnVsbH0seiksdnAodGhpcyksby5zdGFydCgpKX19ZnVuY3Rpb24gcCgpe3ZhciBuLG8sdSxjLHM9YSh0aGlzLGFyZ3VtZW50cyksZj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGw9Zi5sZW5ndGg7Zm9yKG5NKCksXyYmKF89Y2xlYXJUaW1lb3V0KF8pKSxuPTA7bjxsOysrbilvPWZbbl0sdT1rbCh0aGlzLGYsby5pZGVudGlmaWVyKSxzLnRvdWNoMCYmcy50b3VjaDBbMl09PT1vLmlkZW50aWZpZXI/cy50b3VjaDBbMF09dTpzLnRvdWNoMSYmcy50b3VjaDFbMl09PT1vLmlkZW50aWZpZXImJihzLnRvdWNoMVswXT11KTtpZihvPXMudGhhdC5fX3pvb20scy50b3VjaDEpe3ZhciBoPXMudG91Y2gwWzBdLHA9cy50b3VjaDBbMV0sZD1zLnRvdWNoMVswXSx2PXMudG91Y2gxWzFdLGc9KGc9ZFswXS1oWzBdKSpnKyhnPWRbMV0taFsxXSkqZyx5PSh5PXZbMF0tcFswXSkqeSsoeT12WzFdLXBbMV0pKnk7bz1lKG8sTWF0aC5zcXJ0KGcveSkpLHU9WyhoWzBdK2RbMF0pLzIsKGhbMV0rZFsxXSkvMl0sYz1bKHBbMF0rdlswXSkvMiwocFsxXSt2WzFdKS8yXX1lbHNle2lmKCFzLnRvdWNoMClyZXR1cm47dT1zLnRvdWNoMFswXSxjPXMudG91Y2gwWzFdfXMuem9vbSgidG91Y2giLGkocihvLHUsYykscy5leHRlbnQpKX1mdW5jdGlvbiB2KCl7dmFyIG4sZSxyPWEodGhpcyxhcmd1bWVudHMpLGk9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxvPWkubGVuZ3RoO2ZvcihDcygpLGcmJmNsZWFyVGltZW91dChnKSxnPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtnPW51bGx9LHopLG49MDtuPG87KytuKWU9aVtuXSxyLnRvdWNoMCYmci50b3VjaDBbMl09PT1lLmlkZW50aWZpZXI/ZGVsZXRlIHIudG91Y2gwOnIudG91Y2gxJiZyLnRvdWNoMVsyXT09PWUuaWRlbnRpZmllciYmZGVsZXRlIHIudG91Y2gxO3IudG91Y2gxJiYhci50b3VjaDAmJihyLnRvdWNoMD1yLnRvdWNoMSxkZWxldGUgci50b3VjaDEpLHIudG91Y2gwfHxyLmVuZCgpfXZhciBfLGcseT16cyxtPVBzLHg9MCxiPTEvMCx3PS1iLE09YixUPXcsaz1NLFM9MjUwLE49SWgsQT1bXSxDPWQoInN0YXJ0Iiwiem9vbSIsImVuZCIpLHo9NTAwLFA9MTUwO3JldHVybiBuLnRyYW5zZm9ybT1mdW5jdGlvbih0LG4pe3ZhciBlPXQuc2VsZWN0aW9uP3Quc2VsZWN0aW9uKCk6dDtlLnByb3BlcnR5KCJfX3pvb20iLFJzKSx0IT09ZT91KHQsbik6ZS5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCl7YSh0aGlzLGFyZ3VtZW50cykuc3RhcnQoKS56b29tKG51bGwsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bikuZW5kKCl9KX0sbi5zY2FsZUJ5PWZ1bmN0aW9uKHQsZSl7bi5zY2FsZVRvKHQsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3pvb20uayooImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZSl9KX0sbi5zY2FsZVRvPWZ1bmN0aW9uKHQsdSl7bi50cmFuc2Zvcm0odCxmdW5jdGlvbigpe3ZhciB0PW0uYXBwbHkodGhpcyxhcmd1bWVudHMpLG49dGhpcy5fX3pvb20sYT1vKHQpLGM9bi5pbnZlcnQoYSk7cmV0dXJuIGkocihlKG4sImZ1bmN0aW9uIj09dHlwZW9mIHU/dS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dSksYSxjKSx0KX0pfSxuLnRyYW5zbGF0ZUJ5PWZ1bmN0aW9uKHQsZSxyKXtuLnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7cmV0dXJuIGkodGhpcy5fX3pvb20udHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ciksbS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LGMucHJvdG90eXBlPXtzdGFydDpmdW5jdGlvbigpe3JldHVybiAxPT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMuaW5kZXg9QS5wdXNoKHRoaXMpLTEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSx6b29tOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMubW91c2UmJiJtb3VzZSIhPT10JiYodGhpcy5tb3VzZVsxXT1uLmludmVydCh0aGlzLm1vdXNlWzBdKSksdGhpcy50b3VjaDAmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDBbMV09bi5pbnZlcnQodGhpcy50b3VjaDBbMF0pKSx0aGlzLnRvdWNoMSYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMVsxXT1uLmludmVydCh0aGlzLnRvdWNoMVswXSkpLHRoaXMudGhhdC5fX3pvb209bix0aGlzLmVtaXQoInpvb20iKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09PS0tdGhpcy5hY3RpdmUmJihBLnNwbGljZSh0aGlzLmluZGV4LDEpLHRoaXMuaW5kZXg9LTEsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtFKG5ldyBOcyhuLHQsdGhpcy50aGF0Ll9fem9vbSksQy5hcHBseSxDLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LG4uZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6S3coISF0KSxuKTp5fSxuLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT0iZnVuY3Rpb24iPT10eXBlb2YgdD90Okt3KFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSxuKTptfSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PSt0WzBdLGI9K3RbMV0sbik6W3gsYl19LG4udHJhbnNsYXRlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PSt0WzBdWzBdLE09K3RbMV1bMF0sVD0rdFswXVsxXSxrPSt0WzFdWzFdLG4pOltbdyxUXSxbTSxrXV19LG4uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KFM9K3Qsbik6U30sbi5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTj10LG4pOk59LG4ub249ZnVuY3Rpb24oKXt2YXIgdD1DLm9uLmFwcGx5KEMsYXJndW1lbnRzKTtyZXR1cm4gdD09PUM/bjp0fSxufTt0LnZlcnNpb249THMsdC5iaXNlY3Q9T3MsdC5iaXNlY3RSaWdodD1Pcyx0LmJpc2VjdExlZnQ9RnMsdC5hc2NlbmRpbmc9cXMsdC5iaXNlY3Rvcj1Vcyx0LmNyb3NzPVlzLHQuZGVzY2VuZGluZz1Ccyx0LmRldmlhdGlvbj1Ycyx0LmV4dGVudD1Wcyx0Lmhpc3RvZ3JhbT1vZix0LnRocmVzaG9sZEZyZWVkbWFuRGlhY29uaXM9YWYsdC50aHJlc2hvbGRTY290dD1jZix0LnRocmVzaG9sZFN0dXJnZXM9cmYsdC5tYXg9c2YsdC5tZWFuPWZmLHQubWVkaWFuPWxmLHQubWVyZ2U9aGYsdC5taW49cGYsdC5wYWlycz1Jcyx0LnBlcm11dGU9ZGYsdC5xdWFudGlsZT11Zix0LnJhbmdlPVFzLHQuc2Nhbj12Zix0LnNodWZmbGU9X2YsdC5zdW09Z2YsdC50aWNrcz1lZix0LnRpY2tTdGVwPXIsdC50cmFuc3Bvc2U9eWYsdC52YXJpYW5jZT1Icyx0LnppcD1tZix0LmF4aXNUb3A9Zix0LmF4aXNSaWdodD1sLHQuYXhpc0JvdHRvbT1oLHQuYXhpc0xlZnQ9cCx0LmJydXNoPUFkLHQuYnJ1c2hYPUFlLHQuYnJ1c2hZPUNlLHQuYnJ1c2hTZWxlY3Rpb249RWUsdC5jaG9yZD1VZCx0LnJpYmJvbj1qZCx0Lm5lc3Q9WGQsdC5zZXQ9V2UsdC5tYXA9WWUsdC5rZXlzPVdkLHQudmFsdWVzPSRkLHQuZW50cmllcz1aZCx0LmNvbG9yPVR0LHQucmdiPUV0LHQuaHNsPVB0LHQubGFiPVV0LHQuaGNsPWp0LHQuY3ViZWhlbGl4PVZ0LHQuZGlzcGF0Y2g9ZCx0LmRyYWc9Q2wsdC5kcmFnRGlzYWJsZT1FbCx0LmRyYWdFbmFibGU9Z3QsdC5kc3ZGb3JtYXQ9R2QsdC5jc3ZQYXJzZT1RZCx0LmNzdlBhcnNlUm93cz1LZCx0LmNzdkZvcm1hdD10dix0LmNzdkZvcm1hdFJvd3M9bnYsdC50c3ZQYXJzZT1ydix0LnRzdlBhcnNlUm93cz1pdix0LnRzdkZvcm1hdD1vdix0LnRzdkZvcm1hdFJvd3M9dXYsdC5lYXNlTGluZWFyPWVlLHQuZWFzZVF1YWQ9b2UsdC5lYXNlUXVhZEluPXJlLHQuZWFzZVF1YWRPdXQ9aWUsdC5lYXNlUXVhZEluT3V0PW9lLHQuZWFzZUN1YmljPWNlLHQuZWFzZUN1YmljSW49dWUsdC5lYXNlQ3ViaWNPdXQ9YWUsdC5lYXNlQ3ViaWNJbk91dD1jZSx0LmVhc2VQb2x5PVlwLHQuZWFzZVBvbHlJbj1GcCx0LmVhc2VQb2x5T3V0PUlwLHQuZWFzZVBvbHlJbk91dD1ZcCx0LmVhc2VTaW49bGUsdC5lYXNlU2luSW49c2UsdC5lYXNlU2luT3V0PWZlLHQuZWFzZVNpbkluT3V0PWxlLHQuZWFzZUV4cD1kZSx0LmVhc2VFeHBJbj1oZSx0LmVhc2VFeHBPdXQ9cGUsdC5lYXNlRXhwSW5PdXQ9ZGUsdC5lYXNlQ2lyY2xlPWdlLHQuZWFzZUNpcmNsZUluPXZlLHQuZWFzZUNpcmNsZU91dD1fZSx0LmVhc2VDaXJjbGVJbk91dD1nZSx0LmVhc2VCb3VuY2U9bWUsdC5lYXNlQm91bmNlSW49eWUsdC5lYXNlQm91bmNlT3V0PW1lLHQuZWFzZUJvdW5jZUluT3V0PXhlLHQuZWFzZUJhY2s9cmQsdC5lYXNlQmFja0luPW5kLHQuZWFzZUJhY2tPdXQ9ZWQsdC5lYXNlQmFja0luT3V0PXJkLHQuZWFzZUVsYXN0aWM9Y2QsdC5lYXNlRWxhc3RpY0luPWFkLHQuZWFzZUVsYXN0aWNPdXQ9Y2QsdC5lYXNlRWxhc3RpY0luT3V0PXNkLHQuZm9yY2VDZW50ZXI9YXYsdC5mb3JjZUNvbGxpZGU9a3YsdC5mb3JjZUxpbms9U3YsdC5mb3JjZU1hbnlCb2R5PUN2LHQuZm9yY2VTaW11bGF0aW9uPUF2LHQuZm9yY2VYPXp2LHQuZm9yY2VZPVB2LHQuZm9ybWF0RGVmYXVsdExvY2FsZT1wcix0LmZvcm1hdExvY2FsZT1Ydix0LmZvcm1hdFNwZWNpZmllcj1scix0LnByZWNpc2lvbkZpeGVkPVZ2LHQucHJlY2lzaW9uUHJlZml4PVd2LHQucHJlY2lzaW9uUm91bmQ9JHYsdC5nZW9BcmVhPXRnLHQuZ2VvQm91bmRzPXJnLHQuZ2VvQ2VudHJvaWQ9b2csdC5nZW9DaXJjbGU9eGcsdC5nZW9DbGlwRXh0ZW50PU5nLHQuZ2VvQ29udGFpbnM9T2csdC5nZW9EaXN0YW5jZT1xZyx0Lmdlb0dyYXRpY3VsZT13aSx0Lmdlb0dyYXRpY3VsZTEwPU1pLHQuZ2VvSW50ZXJwb2xhdGU9RmcsdC5nZW9MZW5ndGg9UGcsdC5nZW9QYXRoPWh5LHQuZ2VvQWxiZXJzPXd5LHQuZ2VvQWxiZXJzVXNhPU15LHQuZ2VvQXppbXV0aGFsRXF1YWxBcmVhPWt5LHQuZ2VvQXppbXV0aGFsRXF1YWxBcmVhUmF3PVR5LHQuZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnQ9TnksdC5nZW9BemltdXRoYWxFcXVpZGlzdGFudFJhdz1TeSx0Lmdlb0NvbmljQ29uZm9ybWFsPUF5LHQuZ2VvQ29uaWNDb25mb3JtYWxSYXc9bG8sdC5nZW9Db25pY0VxdWFsQXJlYT1ieSx0Lmdlb0NvbmljRXF1YWxBcmVhUmF3PWlvLHQuZ2VvQ29uaWNFcXVpZGlzdGFudD16eSx0Lmdlb0NvbmljRXF1aWRpc3RhbnRSYXc9cG8sdC5nZW9FcXVpcmVjdGFuZ3VsYXI9Q3ksdC5nZW9FcXVpcmVjdGFuZ3VsYXJSYXc9aG8sdC5nZW9Hbm9tb25pYz1QeSx0Lmdlb0dub21vbmljUmF3PXZvLHQuZ2VvSWRlbnRpdHk9UnksdC5nZW9Qcm9qZWN0aW9uPXRvLHQuZ2VvUHJvamVjdGlvbk11dGF0b3I9bm8sdC5nZW9NZXJjYXRvcj1FeSx0Lmdlb01lcmNhdG9yUmF3PWNvLHQuZ2VvT3J0aG9ncmFwaGljPUx5LHQuZ2VvT3J0aG9ncmFwaGljUmF3PWdvLHQuZ2VvU3RlcmVvZ3JhcGhpYz1xeSx0Lmdlb1N0ZXJlb2dyYXBoaWNSYXc9eW8sdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3I9VXksdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3JSYXc9bW8sdC5nZW9Sb3RhdGlvbj1tZyx0Lmdlb1N0cmVhbT1HXyx0Lmdlb1RyYW5zZm9ybT1feSx0LmNsdXN0ZXI9RHksdC5oaWVyYXJjaHk9QW8sdC5wYWNrPUt5LHQucGFja1NpYmxpbmdzPUp5LHQucGFja0VuY2xvc2U9R3ksdC5wYXJ0aXRpb249ZW0sdC5zdHJhdGlmeT11bSx0LnRyZWU9YW0sdC50cmVlbWFwPWxtLHQudHJlZW1hcEJpbmFyeT1obSx0LnRyZWVtYXBEaWNlPW5tLHQudHJlZW1hcFNsaWNlPWNtLHQudHJlZW1hcFNsaWNlRGljZT1wbSx0LnRyZWVtYXBTcXVhcmlmeT1mbSx0LnRyZWVtYXBSZXNxdWFyaWZ5PWRtLHQuaW50ZXJwb2xhdGU9QWgsdC5pbnRlcnBvbGF0ZUFycmF5PXdoLHQuaW50ZXJwb2xhdGVCYXNpcz1faCx0LmludGVycG9sYXRlQmFzaXNDbG9zZWQ9Z2gsdC5pbnRlcnBvbGF0ZURhdGU9TWgsdC5pbnRlcnBvbGF0ZU51bWJlcj1UaCx0LmludGVycG9sYXRlT2JqZWN0PWtoLHQuaW50ZXJwb2xhdGVSb3VuZD1DaCx0LmludGVycG9sYXRlU3RyaW5nPUVoLHQuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3M9TGgsdC5pbnRlcnBvbGF0ZVRyYW5zZm9ybVN2Zz1xaCx0LmludGVycG9sYXRlWm9vbT1JaCx0LmludGVycG9sYXRlUmdiPW1oLHQuaW50ZXJwb2xhdGVSZ2JCYXNpcz14aCx0LmludGVycG9sYXRlUmdiQmFzaXNDbG9zZWQ9YmgsdC5pbnRlcnBvbGF0ZUhzbD1ZaCx0LmludGVycG9sYXRlSHNsTG9uZz1CaCx0LmludGVycG9sYXRlTGFiPWxuLHQuaW50ZXJwb2xhdGVIY2w9amgsdC5pbnRlcnBvbGF0ZUhjbExvbmc9SGgsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeD1YaCx0LmludGVycG9sYXRlQ3ViZWhlbGl4TG9uZz1WaCx0LnF1YW50aXplPVdoLHQucGF0aD1MZSx0LnBvbHlnb25BcmVhPXZtLHQucG9seWdvbkNlbnRyb2lkPV9tLHQucG9seWdvbkh1bGw9eW07dC5wb2x5Z29uQ29udGFpbnM9bW0sdC5wb2x5Z29uTGVuZ3RoPXhtLHQucXVhZHRyZWU9ZXIsdC5xdWV1ZT1tdSx0LnJhbmRvbVVuaWZvcm09TW0sdC5yYW5kb21Ob3JtYWw9VG0sdC5yYW5kb21Mb2dOb3JtYWw9a20sdC5yYW5kb21CYXRlcz1ObSx0LnJhbmRvbUlyd2luSGFsbD1TbSx0LnJhbmRvbUV4cG9uZW50aWFsPUVtLHQucmVxdWVzdD1BbSx0Lmh0bWw9em0sdC5qc29uPVBtLHQudGV4dD1SbSx0LnhtbD1MbSx0LmNzdj1VbSx0LnRzdj1EbSx0LnNjYWxlQmFuZD1UdSx0LnNjYWxlUG9pbnQ9U3UsdC5zY2FsZUlkZW50aXR5PVV1LHQuc2NhbGVMaW5lYXI9cXUsdC5zY2FsZUxvZz1qdSx0LnNjYWxlT3JkaW5hbD1NdSx0LnNjYWxlSW1wbGljaXQ9WW0sdC5zY2FsZVBvdz1YdSx0LnNjYWxlU3FydD1WdSx0LnNjYWxlUXVhbnRpbGU9V3UsdC5zY2FsZVF1YW50aXplPSR1LHQuc2NhbGVUaHJlc2hvbGQ9WnUsdC5zY2FsZVRpbWU9cGIsdC5zY2FsZVV0Yz1kYix0LnNjaGVtZUNhdGVnb3J5MTA9X2IsdC5zY2hlbWVDYXRlZ29yeTIwYj1nYix0LnNjaGVtZUNhdGVnb3J5MjBjPXliLHQuc2NoZW1lQ2F0ZWdvcnkyMD1tYix0LmludGVycG9sYXRlQ3ViZWhlbGl4RGVmYXVsdD14Yix0LmludGVycG9sYXRlUmFpbmJvdz1UYix0LmludGVycG9sYXRlV2FybT1iYix0LmludGVycG9sYXRlQ29vbD13Yix0LmludGVycG9sYXRlVmlyaWRpcz1rYix0LmludGVycG9sYXRlTWFnbWE9U2IsdC5pbnRlcnBvbGF0ZUluZmVybm89TmIsdC5pbnRlcnBvbGF0ZVBsYXNtYT1FYix0LnNjYWxlU2VxdWVudGlhbD1yYyx0LmNyZWF0b3I9emYsdC5sb2NhbD1iLHQubWF0Y2hlcj1VZix0Lm1vdXNlPVlmLHQubmFtZXNwYWNlPUNmLHQubmFtZXNwYWNlcz1BZix0LnNlbGVjdD1NbCx0LnNlbGVjdEFsbD1UbCx0LnNlbGVjdGlvbj12dCx0LnNlbGVjdG9yPUJmLHQuc2VsZWN0b3JBbGw9SGYsdC50b3VjaD1rbCx0LnRvdWNoZXM9U2wsdC53aW5kb3c9c2wsdC5jdXN0b21FdmVudD1FLHQuYXJjPVliLHQuYXJlYT1IYix0LmxpbmU9amIsdC5waWU9V2IsdC5yYWRpYWxBcmVhPUdiLHQucmFkaWFsTGluZT1aYix0LnN5bWJvbD1fdyx0LnN5bWJvbHM9dncsdC5zeW1ib2xDaXJjbGU9SmIsdC5zeW1ib2xDcm9zcz1RYix0LnN5bWJvbERpYW1vbmQ9bncsdC5zeW1ib2xTcXVhcmU9YXcsdC5zeW1ib2xTdGFyPXV3LHQuc3ltYm9sVHJpYW5nbGU9c3csdC5zeW1ib2xXeWU9ZHcsdC5jdXJ2ZUJhc2lzQ2xvc2VkPW13LHQuY3VydmVCYXNpc09wZW49eHcsdC5jdXJ2ZUJhc2lzPXl3LHQuY3VydmVCdW5kbGU9YncsdC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkPU13LHQuY3VydmVDYXJkaW5hbE9wZW49VHcsdC5jdXJ2ZUNhcmRpbmFsPXd3LHQuY3VydmVDYXRtdWxsUm9tQ2xvc2VkPVN3LHQuY3VydmVDYXRtdWxsUm9tT3Blbj1Odyx0LmN1cnZlQ2F0bXVsbFJvbT1rdyx0LmN1cnZlTGluZWFyQ2xvc2VkPUV3LHQuY3VydmVMaW5lYXI9QmIsdC5jdXJ2ZU1vbm90b25lWD1JYyx0LmN1cnZlTW9ub3RvbmVZPVljLHQuY3VydmVOYXR1cmFsPUF3LHQuY3VydmVTdGVwPUN3LHQuY3VydmVTdGVwQWZ0ZXI9VmMsdC5jdXJ2ZVN0ZXBCZWZvcmU9WGMsdC5zdGFjaz1Mdyx0LnN0YWNrT2Zmc2V0RXhwYW5kPXF3LHQuc3RhY2tPZmZzZXROb25lPVB3LHQuc3RhY2tPZmZzZXRTaWxob3VldHRlPVV3LHQuc3RhY2tPZmZzZXRXaWdnbGU9RHcsdC5zdGFja09yZGVyQXNjZW5kaW5nPU93LHQuc3RhY2tPcmRlckRlc2NlbmRpbmc9RncsdC5zdGFja09yZGVySW5zaWRlT3V0PUl3LHQuc3RhY2tPcmRlck5vbmU9UncsdC5zdGFja09yZGVyUmV2ZXJzZT1Zdyx0LnRpbWVJbnRlcnZhbD1HdSx0LnRpbWVNaWxsaXNlY29uZD1abSx0LnRpbWVNaWxsaXNlY29uZHM9R20sdC51dGNNaWxsaXNlY29uZD1abSx0LnV0Y01pbGxpc2Vjb25kcz1HbSx0LnRpbWVTZWNvbmQ9ZXgsdC50aW1lU2Vjb25kcz1yeCx0LnV0Y1NlY29uZD1leCx0LnV0Y1NlY29uZHM9cngsdC50aW1lTWludXRlPWl4LHQudGltZU1pbnV0ZXM9b3gsdC50aW1lSG91cj11eCx0LnRpbWVIb3Vycz1heCx0LnRpbWVEYXk9Y3gsdC50aW1lRGF5cz1zeCx0LnRpbWVXZWVrPWZ4LHQudGltZVdlZWtzPWd4LHQudGltZVN1bmRheT1meCx0LnRpbWVTdW5kYXlzPWd4LHQudGltZU1vbmRheT1seCx0LnRpbWVNb25kYXlzPXl4LHQudGltZVR1ZXNkYXk9aHgsdC50aW1lVHVlc2RheXM9bXgsdC50aW1lV2VkbmVzZGF5PXB4LHQudGltZVdlZG5lc2RheXM9eHgsdC50aW1lVGh1cnNkYXk9ZHgsdC50aW1lVGh1cnNkYXlzPWJ4LHQudGltZUZyaWRheT12eCx0LnRpbWVGcmlkYXlzPXd4LHQudGltZVNhdHVyZGF5PV94LHQudGltZVNhdHVyZGF5cz1NeCx0LnRpbWVNb250aD1UeCx0LnRpbWVNb250aHM9a3gsdC50aW1lWWVhcj1TeCx0LnRpbWVZZWFycz1OeCx0LnV0Y01pbnV0ZT1FeCx0LnV0Y01pbnV0ZXM9QXgsdC51dGNIb3VyPUN4LHQudXRjSG91cnM9engsdC51dGNEYXk9UHgsdC51dGNEYXlzPVJ4LHQudXRjV2Vlaz1MeCx0LnV0Y1dlZWtzPVl4LHQudXRjU3VuZGF5PUx4LHQudXRjU3VuZGF5cz1ZeCx0LnV0Y01vbmRheT1xeCx0LnV0Y01vbmRheXM9QngsdC51dGNUdWVzZGF5PVV4LHQudXRjVHVlc2RheXM9angsdC51dGNXZWRuZXNkYXk9RHgsdC51dGNXZWRuZXNkYXlzPUh4LHQudXRjVGh1cnNkYXk9T3gsdC51dGNUaHVyc2RheXM9WHgsdC51dGNGcmlkYXk9RngsdC51dGNGcmlkYXlzPVZ4LHQudXRjU2F0dXJkYXk9SXgsdC51dGNTYXR1cmRheXM9V3gsdC51dGNNb250aD0keCx0LnV0Y01vbnRocz1aeCx0LnV0Y1llYXI9R3gsdC51dGNZZWFycz1ReCx0LnRpbWVGb3JtYXREZWZhdWx0TG9jYWxlPUdhLHQudGltZUZvcm1hdExvY2FsZT1lYSx0Lmlzb0Zvcm1hdD1pYix0Lmlzb1BhcnNlPW9iLHQubm93PWRuLHQudGltZXI9Z24sdC50aW1lckZsdXNoPXluLHQudGltZW91dD1ycCx0LmludGVydmFsPWlwLHQudHJhbnNpdGlvbj10ZSx0LmFjdGl2ZT1wZCx0LmludGVycnVwdD12cCx0LnZvcm9ub2k9UXcsdC56b29tPWVNLHQuem9vbVRyYW5zZm9ybT1Bcyx0Lnpvb21JZGVudGl0eT10TSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KTs="></script>
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uKHQsbil7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9uKGV4cG9ydHMscmVxdWlyZSgiZDMtYXJyYXkiKSxyZXF1aXJlKCJkMy1zY2FsZSIpLHJlcXVpcmUoImQzLXRpbWUiKSxyZXF1aXJlKCJkMy1yYW5kb20iKSxyZXF1aXJlKCJkMy1yZXF1ZXN0IikscmVxdWlyZSgiZDMtcGF0aCIpLHJlcXVpcmUoImQzLXNlbGVjdGlvbiIpLHJlcXVpcmUoImQzLXNoYXBlIikscmVxdWlyZSgiZDMtZGlzcGF0Y2giKSk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIiwiZDMtYXJyYXkiLCJkMy1zY2FsZSIsImQzLXRpbWUiLCJkMy1yYW5kb20iLCJkMy1yZXF1ZXN0IiwiZDMtcGF0aCIsImQzLXNlbGVjdGlvbiIsImQzLXNoYXBlIiwiZDMtZGlzcGF0Y2giXSxuKTpuKHQuZmM9dC5mY3x8e30sdC5kMyx0LmQzLHQuZDMsdC5kMyx0LmQzLHQuZDMsdC5kMyx0LmQzLHQuZDMpfSh0aGlzLGZ1bmN0aW9uKHQsbixlLHIsaSxvLHUsYSxjLGwpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBmKHQpe3JldHVybiB0fWZ1bmN0aW9uIGgodCl7fWZ1bmN0aW9uIHModCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBkKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmaXNOYU4odCk/dm9pZCAwOnR9ZnVuY3Rpb24gZyh0LG4sZSl7dmFyIHI9dC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW24odCksdF19KSxpPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZT90LmdldFRpbWUoKTp0fSxvPXIucmVkdWNlKGZ1bmN0aW9uKHQsbil7cmV0dXJuIDA9PT10LmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gaSh0WzBdKT09PWkoblswXSl9KS5sZW5ndGgmJnQucHVzaChuKSx0fSxbXSk7cmV0dXJuIG8ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0WzFdfSl9ZnVuY3Rpb24gdih0KXt2YXIgbj10aGlzO2FyZ3VtZW50cy5sZW5ndGh8fCh0PWUuc2NhbGVJZGVudGl0eSgpKTt2YXIgcj1RKCksaT1mdW5jdGlvbihuKXt2YXIgZT10LmRvbWFpbigpLGk9dC5yYW5nZSgpLG89ci5kaXN0YW5jZShlWzBdLGVbMV0pLHU9ci5kaXN0YW5jZShlWzBdLG4pLGE9dS9vLGM9YSooaVsxXS1pWzBdKStpWzBdO3JldHVybiBjfTtyZXR1cm4gaS5pbnZlcnQ9ZnVuY3Rpb24obil7dmFyIGU9dC5kb21haW4oKSxpPXQucmFuZ2UoKSxvPShuLWlbMF0pLyhpWzFdLWlbMF0pLHU9ci5kaXN0YW5jZShlWzBdLGVbMV0pLGE9byp1O3JldHVybiByLm9mZnNldChlWzBdLGEpfSxpLmRvbWFpbj1mdW5jdGlvbigpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LmRvbWFpbigpO3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxlPXIuY2xhbXBVcChuWzBdKSxvPXIuY2xhbXBEb3duKG5bMV0pO3JldHVybiB0LmRvbWFpbihbZSxvXSksaX0saS5uaWNlPWZ1bmN0aW9uKCl7dC5uaWNlKCk7dmFyIG49dC5kb21haW4oKSxlPXIuY2xhbXBVcChuWzBdKSxvPXIuY2xhbXBEb3duKG5bMV0pO3JldHVybiB0LmRvbWFpbihbZSxvXSksaX0saS50aWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHI9QXJyYXkoZSksbz0wO288ZTtvKyspcltvXT1hcmd1bWVudHNbb107dmFyIHU9dC50aWNrcy5hcHBseShuLHIpO3JldHVybiBnKHUsaSxpLmRvbWFpbigpKX0saS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHYodC5jb3B5KCkpLmRpc2NvbnRpbnVpdHlQcm92aWRlcihyLmNvcHkoKSl9LGkuZGlzY29udGludWl0eVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGkpOnJ9LFQoaSx0LE0oInJhbmdlIiwicmFuZ2VSb3VuZCIsImludGVycG9sYXRlIiwiY2xhbXAiLCJ0aWNrRm9ybWF0IikpLGl9ZnVuY3Rpb24gcCh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIG0oKXt2YXIgdD1hcmd1bWVudHM7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7cisrKWlmKG51bGw9PXRbcl0obixlKSlyZXR1cm4hMTtyZXR1cm4hMH19ZnVuY3Rpb24geSgpe3ZhciB0PWFyZ3VtZW50cztyZXR1cm4gZnVuY3Rpb24obixlKXtmb3IodmFyIHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspaWYobnVsbD09dFtyXShuLGUpKXJldHVybiExO3JldHVybiEwfX12YXIgYj1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bltlXTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcil0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHQgdG8gcmViaW5kICIrZSsiIHdoaWNoIGlzbid0IGEgZnVuY3Rpb24gb24gdGhlIHNvdXJjZSBvYmplY3QiKTtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxpPUFycmF5KGUpLG89MDtvPGU7bysrKWlbb109YXJndW1lbnRzW29dO3ZhciB1PXIuYXBwbHkobixpKTtyZXR1cm4gdT09PW4/dDp1fX0sdz1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHI9QXJyYXkoZT4yP2UtMjowKSxpPTI7aTxlO2krKylyW2ktMl09YXJndW1lbnRzW2ldO3ZhciBvPSEwLHU9ITEsYT12b2lkIDA7dHJ5e2Zvcih2YXIgYyxsPXJbU3ltYm9sLml0ZXJhdG9yXSgpOyEobz0oYz1sLm5leHQoKSkuZG9uZSk7bz0hMCl7dmFyIGY9Yy52YWx1ZTt0W2ZdPWIodCxuLGYpfX1jYXRjaCh0KXt1PSEwLGE9dH1maW5hbGx5e3RyeXshbyYmbC5yZXR1cm4mJmwucmV0dXJuKCl9ZmluYWxseXtpZih1KXRocm93IGF9fXJldHVybiB0fSx4PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdC5yZWR1Y2UoZnVuY3Rpb24odCxuKXtyZXR1cm4gdCYmbih0KX0sbil9fSxUPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgscj1BcnJheShlPjI/ZS0yOjApLGk9MjtpPGU7aSsrKXJbaS0yXT1hcmd1bWVudHNbaV07dmFyIG89eChyKSx1PSEwLGE9ITEsYz12b2lkIDA7dHJ5e2Zvcih2YXIgbCxmPU9iamVjdC5rZXlzKG4pW1N5bWJvbC5pdGVyYXRvcl0oKTshKHU9KGw9Zi5uZXh0KCkpLmRvbmUpO3U9ITApe3ZhciBoPWwudmFsdWUscz1vKGgpO3MmJih0W3NdPWIodCxuLGgpKX19Y2F0Y2godCl7YT0hMCxjPXR9ZmluYWxseXt0cnl7IXUmJmYucmV0dXJuJiZmLnJldHVybigpfWZpbmFsbHl7aWYoYSl0aHJvdyBjfX1yZXR1cm4gdH0sRT1mdW5jdGlvbih0KXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBSZWdFeHAoIl4iK3QrIiQiKTp0fSl9LFM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPUFycmF5KHQpLGU9MDtlPHQ7ZSsrKW5bZV09YXJndW1lbnRzW2VdO3JldHVybiBuPUUobiksZnVuY3Rpb24odCl7cmV0dXJuIG4uZXZlcnkoZnVuY3Rpb24obil7cmV0dXJuIW4udGVzdCh0KX0pJiZ0fX0sTT1mdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49QXJyYXkodCksZT0wO2U8dDtlKyspbltlXT1hcmd1bWVudHNbZV07cmV0dXJuIG49RShuKSxmdW5jdGlvbih0KXtyZXR1cm4gbi5zb21lKGZ1bmN0aW9uKG4pe3JldHVybiBuLnRlc3QodCl9KSYmdH19LGs9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0W25dfX0sTD1mdW5jdGlvbih0KXtyZXR1cm4gdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSl9LEE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0K0wobil9fSxIPWZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTB9LG49aCxlPWYscj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dH0saT1mdW5jdGlvbihpKXt2YXIgbz10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx1PWkuc2xpY2UoMCxvKS5tYXAoZSk7cmV0dXJuIGkubWFwKGZ1bmN0aW9uKHQsaSl7cmV0dXJuIGk+PW8mJih1LnNoaWZ0KCksdS5wdXNoKGUodCxpKSkpLGk8by0xfHx1LnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIXIodCl9KT9uKHZvaWQgMCxpKTpuKHUsaSl9KX07cmV0dXJuIGkucGVyaW9kPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9cyhhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGkpOnR9LGkuYWNjdW11bGF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0saSk6bn0saS5kZWZpbmVkPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGkpOnJ9LGkudmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0saSk6ZX0saX0sTz1mdW5jdGlvbigpe3ZhciB0PTIsZT1IKCkuYWNjdW11bGF0b3IoZnVuY3Rpb24oZSl7dmFyIHI9ZSYmbi5kZXZpYXRpb24oZSksaT1lJiZuLm1lYW4oZSk7cmV0dXJue2F2ZXJhZ2U6aSx1cHBlcjpkKGkrdCpyKSxsb3dlcjpkKGktdCpyKX19KSxyPWZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfTtyZXR1cm4gci5tdWx0aXBsaWVyPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLHIpOnR9LHcocixlLCJwZXJpb2QiLCJ2YWx1ZSIpLHJ9LF89ZnVuY3Rpb24oKXt2YXIgdD1mLGU9ZnVuY3Rpb24oKXtyZXR1cm4gOX0scj1mdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIGk9dm9pZCAwO3JldHVybiBlLmxlbmd0aDx0JiYobnVsbCE9cj9lLnB1c2gocik6ZT1bXSksZS5sZW5ndGg+PXQmJihpPW4ubWVhbihlKSksaX19LGk9ZnVuY3Rpb24obil7dmFyIGk9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbz0yLyhpKzEpLHU9cihpKSxhPXZvaWQgMDtyZXR1cm4gbi5tYXAoZnVuY3Rpb24obixlKXt2YXIgcj10KG4sZSk7cmV0dXJuIGE9dm9pZCAwPT09YT91KHIpOnIqbysoMS1vKSphLGQoYSl9KX07cmV0dXJuIGkucGVyaW9kPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9cyhhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGkpOmV9LGkudmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0saSk6dH0saX0sQz1mdW5jdGlvbigpe3ZhciB0PWYsZT1fKCkucGVyaW9kKDEyKSxyPV8oKS5wZXJpb2QoMjYpLGk9XygpLnBlcmlvZCg5KSxvPWZ1bmN0aW9uKG8pe2UudmFsdWUodCksci52YWx1ZSh0KTt2YXIgdT1uLnppcChlKG8pLHIobykpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dFswXSYmdm9pZCAwIT09dFsxXT90WzBdLXRbMV06dm9pZCAwfSksYT1pKHUpO3JldHVybiBuLnppcCh1LGEpLm1hcChmdW5jdGlvbih0KXtyZXR1cm57bWFjZDp0WzBdLHNpZ25hbDp0WzFdLGRpdmVyZ2VuY2U6dm9pZCAwIT09dFswXSYmdm9pZCAwIT09dFsxXT90WzBdLXRbMV06dm9pZCAwfX0pfTtyZXR1cm4gby52YWx1ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxvKTp0fSxUKG8sZSxrKHtwZXJpb2Q6ImZhc3RQZXJpb2QifSkpLFQobyxyLGsoe3BlcmlvZDoic2xvd1BlcmlvZCJ9KSksVChvLGksayh7cGVyaW9kOiJzaWduYWxQZXJpb2QifSkpLG99LEQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LE49ZnVuY3Rpb24odCxuKXtpZighKHQgaW5zdGFuY2VvZiBuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0sST1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxuKXtmb3IodmFyIGU9MDtlPG4ubGVuZ3RoO2UrKyl7dmFyIHI9bltlXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24obixlLHIpe3JldHVybiBlJiZ0KG4ucHJvdG90eXBlLGUpLHImJnQobixyKSxufX0oKSxWPWZ1bmN0aW9uKHQsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4mJm51bGwhPT1uKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2Ygbik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuJiZuLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksbiYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxuKTp0Ll9fcHJvdG9fXz1uKX0sUD1mdW5jdGlvbih0LG4pe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIW58fCJvYmplY3QiIT10eXBlb2YgbiYmImZ1bmN0aW9uIiE9dHlwZW9mIG4/dDpufSx6PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LG4pe3ZhciBlPVtdLHI9ITAsaT0hMSxvPXZvaWQgMDt0cnl7Zm9yKHZhciB1LGE9dFtTeW1ib2wuaXRlcmF0b3JdKCk7IShyPSh1PWEubmV4dCgpKS5kb25lKSYmKGUucHVzaCh1LnZhbHVlKSwhbnx8ZS5sZW5ndGghPT1uKTtyPSEwKTt9Y2F0Y2godCl7aT0hMCxvPXR9ZmluYWxseXt0cnl7IXImJmEucmV0dXJuJiZhLnJldHVybigpfWZpbmFsbHl7aWYoaSl0aHJvdyBvfX1yZXR1cm4gZX1yZXR1cm4gZnVuY3Rpb24obixlKXtpZihBcnJheS5pc0FycmF5KG4pKXJldHVybiBuO2lmKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QobikpcmV0dXJuIHQobixlKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlIil9fSgpLFI9ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHZhciBuPTAsZT1BcnJheSh0Lmxlbmd0aCk7bjx0Lmxlbmd0aDtuKyspZVtuXT10W25dO3JldHVybiBlfXJldHVybiBBcnJheS5mcm9tKHQpfSxGPWZ1bmN0aW9uKCl7dmFyIHQ9SCgpLnBlcmlvZCgxNCksZT1mdW5jdGlvbih0LG4pe3JldHVybiBuKyh0W3QubGVuZ3RoLTFdLW4pL3QubGVuZ3RofSxyPWZ1bmN0aW9uKHQpe3ZhciBuPXoodCwyKSxlPW5bMF0scj1uWzFdO3JldHVybiBlPHI/MDplLXJ9LGk9ZnVuY3Rpb24odCl7dmFyIG49eih0LDIpLGU9blswXSxyPW5bMV07cmV0dXJuIGU+cj8wOnItZX0sbz1mdW5jdGlvbih0LHIpe3JldHVybiB2b2lkIDAhPT1yP2UodCxyKTpuLm1lYW4odCl9LHU9ZnVuY3Rpb24oKXt2YXIgdD12b2lkIDAsZT12b2lkIDAsdT12b2lkIDA7cmV0dXJuIGZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiB2b2lkKHZvaWQgMCE9PXQmJih0PU5hTikpO2lmKHZvaWQgMD09PXQpcmV0dXJuIHZvaWQodD1hWzBdKTt2YXIgYz1uLnBhaXJzKFt0XS5jb25jYXQoUihhKSkpO2U9byhjLm1hcChyKSxlKSx1PW8oYy5tYXAoaSksdSk7dmFyIGw9aXNOYU4odCk/TmFOOnUvZTtyZXR1cm4gZCgxMDAtMTAwLygxK2wpKX19LGE9ZnVuY3Rpb24obil7dmFyIGU9dSgpO3JldHVybiB0LmFjY3VtdWxhdG9yKGUpLHQobil9O3JldHVybiB3KGEsdCwicGVyaW9kIiwidmFsdWUiKSxhfSxVPWZ1bmN0aW9uKCl7dmFyIHQ9SCgpLmFjY3VtdWxhdG9yKGZ1bmN0aW9uKHQpe3JldHVybiB0JiZuLm1lYW4odCl9KSxlPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4pfTtyZXR1cm4gdyhlLHQsInBlcmlvZCIsInZhbHVlIiksZX0sQj1mdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQuY2xvc2V9LGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC5oaWdofSxyPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQubG93fSxpPUgoKS5wZXJpb2QoNSkuZGVmaW5lZChmdW5jdGlvbihuKXtyZXR1cm4gbnVsbCE9dChuKSYmbnVsbCE9ZShuKSYmbnVsbCE9cihuKX0pLmFjY3VtdWxhdG9yKGZ1bmN0aW9uKGkpe3ZhciBvPWkmJm4ubWF4KGksZSksdT1pJiZuLm1pbihpLHIpLGE9aSYmMTAwKih0KGlbaS5sZW5ndGgtMV0pLXUpLyhvLXUpO3JldHVybiBkKGEpfSksbz1VKCkucGVyaW9kKDMpLHU9ZnVuY3Rpb24odCl7dmFyIG49aSh0KSxlPW8obik7cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKHQsbil7cmV0dXJue2s6dCxkOmVbbl19fSl9O3JldHVybiB1LmNsb3NlVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sdSk6dH0sdS5oaWdoVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sdSk6ZX0sdS5sb3dWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSx1KTpyfSxUKHUsaSxrKHtwZXJpb2Q6ImtQZXJpb2QifSkpLFQodSxvLGsoe3BlcmlvZDoiZFBlcmlvZCJ9KSksdX0scT1mdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudm9sdW1lfSxuPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQuY2xvc2V9LGU9XygpLnBlcmlvZCgxMykscj1IKCkucGVyaW9kKDIpLmRlZmluZWQoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPW4oZSkmJm51bGwhPXQoZSl9KS5hY2N1bXVsYXRvcihmdW5jdGlvbihlKXtyZXR1cm4gZSYmZCgobihlWzFdKS1uKGVbMF0pKSp0KGVbMV0pKX0pLGk9ZnVuY3Rpb24odCl7dmFyIG49cih0KTtyZXR1cm4gZShuKX07cmV0dXJuIGkudm9sdW1lVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0saSk6dH0saS5jbG9zZVZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGkpOm59LHcoaSxlLCJwZXJpb2QiKSxpfSxXPWZ1bmN0aW9uKCl7dmFyIHQ9LjEsbj1mLGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUpe3ZhciByPWQobihlKSooMS10KSksaT1kKG4oZSkqKDErdCkpO3JldHVybntsb3dlcjpyLHVwcGVyOml9fSl9O3JldHVybiBlLmZhY3Rvcj1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxlKTp0fSxlLnZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGUpOm59LGV9LGo9ZnVuY3Rpb24oKXt2YXIgdD1mdW5jdGlvbih0LG4pe3JldHVybiB0LmNsb3NlfSxlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQuaGlnaH0scj1mdW5jdGlvbih0LG4pe3JldHVybiB0Lmxvd30saT1fKCkucGVyaW9kKDEzKSxvPWZ1bmN0aW9uKG8pe3JldHVybiBpLnZhbHVlKHQpLG4uemlwKG8saShvKSkubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPWQoZSh0WzBdKS10WzFdKSxpPWQocih0WzBdKS10WzFdKTtyZXR1cm57YnVsbFBvd2VyOm4sYmVhclBvd2VyOml9fSl9O3JldHVybiBvLmNsb3NlVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sbyk6dH0sby5oaWdoVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sbyk6ZX0sby5sb3dWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxvKTpyfSx3KG8saSwicGVyaW9kIiksb30sUT1mdW5jdGlvbigpe3ZhciB0PXt9O3JldHVybiB0LmRpc3RhbmNlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG4tdH0sdC5vZmZzZXQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGU/bmV3IERhdGUodC5nZXRUaW1lKCkrbik6dCtufSx0LmNsYW1wVXA9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHQuY2xhbXBEb3duPWZ1bmN0aW9uKHQpe3JldHVybiB0fSx0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sdH0sRz1mdW5jdGlvbigpe3ZhciB0PTg2NGU1LG49NSp0LGU9Nyp0LGk9e30sbz1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXQuZ2V0RGF5KCl8fDY9PT10LmdldERheSgpfTtyZXR1cm4gaS5jbGFtcERvd249ZnVuY3Rpb24odCl7aWYodCYmbyh0KSl7dmFyIG49MD09PXQuZ2V0RGF5KCk/MjoxLGU9ci50aW1lRGF5LmNlaWwodCk7cmV0dXJuIHIudGltZURheS5vZmZzZXQoZSwtbil9cmV0dXJuIHR9LGkuY2xhbXBVcD1mdW5jdGlvbih0KXtpZih0JiZvKHQpKXt2YXIgbj0wPT09dC5nZXREYXkoKT8xOjIsZT1yLnRpbWVEYXkuZmxvb3IodCk7cmV0dXJuIHIudGltZURheS5vZmZzZXQoZSxuKX1yZXR1cm4gdH0saS5kaXN0YW5jZT1mdW5jdGlvbih0LG8pe3Q9aS5jbGFtcFVwKHQpLG89aS5jbGFtcERvd24obyk7dmFyIHU9ci50aW1lU2F0dXJkYXkuY2VpbCh0KTtpZihvPHUpcmV0dXJuIG8uZ2V0VGltZSgpLXQuZ2V0VGltZSgpO3ZhciBhPXUuZ2V0VGltZSgpLXQuZ2V0VGltZSgpLGM9ci50aW1lU2F0dXJkYXkuY2VpbChvKSxsPWMuZ2V0VGltZSgpLW8uZ2V0VGltZSgpLGY9TWF0aC5yb3VuZCgoYy5nZXRUaW1lKCktdS5nZXRUaW1lKCkpL2UpO3JldHVybiBmKm4rYS1sfSxpLm9mZnNldD1mdW5jdGlvbih0LGUpe3ZhciB1PW8odCk/aS5jbGFtcFVwKHQpOnQ7aWYoMD09PWUpcmV0dXJuIHU7dmFyIGE9ZTwwLGM9ZT4wLGw9ZSxmPWE/ci50aW1lTW9uZGF5LmZsb29yKHUpOnIudGltZVNhdHVyZGF5LmNlaWwodSk7aWYobC09Zi5nZXRUaW1lKCktdS5nZXRUaW1lKCksYSYmbD4wfHxjJiZsPDApcmV0dXJuIG5ldyBEYXRlKHUuZ2V0VGltZSgpK2UpO3U9YT9mOnIudGltZURheS5vZmZzZXQoZiwyKTt2YXIgaD1NYXRoLmZsb29yKGwvbik7cmV0dXJuIHU9ci50aW1lRGF5Lm9mZnNldCh1LDcqaCksbC09aCpuLHU9bmV3IERhdGUodS5nZXRUaW1lKCkrbCl9LGkuY29weT1mdW5jdGlvbigpe3JldHVybiBpfSxpfSxZPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1BcnJheSh0KSxlPTA7ZTx0O2UrKyluW2VdPWFyZ3VtZW50c1tlXTt2YXIgcj1mdW5jdGlvbih0LG4pe3JldHVybiB0Pm5bMF0mJnQ8blsxXX0saT1mdW5jdGlvbih0LG4pe3JldHVybiB0WzBdPj1uWzBdJiZ0WzFdPD1uWzFdfSxvPXt9O28uZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXt0PW8uY2xhbXBVcCh0KSxlPW8uY2xhbXBEb3duKGUpO3ZhciByPW4uZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiBpKG4sW3QsZV0pfSksdT1yLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdFsxXS10WzBdfSk7cmV0dXJuIGUtdC11LnJlZHVjZShmdW5jdGlvbih0LG4pe3JldHVybiB0K259LDApfTt2YXIgdT1mdW5jdGlvbih0LG4pe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZT9uZXcgRGF0ZSh0LmdldFRpbWUoKStuKTp0K259O3JldHVybiBvLm9mZnNldD1mdW5jdGlvbih0LGUpe2lmKGU+MCl7dmFyIHI9ZnVuY3Rpb24oKXtmb3IodmFyIHI9by5jbGFtcFVwKHQpLGk9ZTtpPjA7KXt2YXIgYT1uLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdFswXT5yfSkuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiB0WzBdLW5bMF19KTtpZihhLmxlbmd0aCl7dmFyIGM9YVswXSxsPWNbMF0tcjtsPmk/KHI9dShyLGkpLGk9MCk6KHI9Y1sxXSxpLT1sKX1lbHNlIHI9dShyLGkpLGk9MH1yZXR1cm57djpyfX0oKTtpZigib2JqZWN0Ij09PSgidW5kZWZpbmVkIj09dHlwZW9mIHI/InVuZGVmaW5lZCI6RChyKSkpcmV0dXJuIHIudn1lbHNle3ZhciBpPWZ1bmN0aW9uKCl7Zm9yKHZhciByPW8uY2xhbXBEb3duKHQpLGk9ZTtpPDA7KXt2YXIgYT1uLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdFsxXTxyfSkuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBuWzBdLXRbMF19KTtpZihhLmxlbmd0aCl7dmFyIGM9YVswXSxsPWNbMV0tcjtsPGk/KHI9dShyLGkpLGk9MCk6KHI9Y1swXSxpLT1sKX1lbHNlIHI9dShyLGkpLGk9MH1yZXR1cm57djpyfX0oKTtpZigib2JqZWN0Ij09PSgidW5kZWZpbmVkIj09dHlwZW9mIGk/InVuZGVmaW5lZCI6RChpKSkpcmV0dXJuIGkudn19LG8uY2xhbXBVcD1mdW5jdGlvbih0KXtyZXR1cm4gbi5yZWR1Y2UoZnVuY3Rpb24odCxuKXtyZXR1cm4gcih0LG4pP25bMV06dH0sdCl9LG8uY2xhbXBEb3duPWZ1bmN0aW9uKHQpe3JldHVybiBuLnJlZHVjZShmdW5jdGlvbih0LG4pe3JldHVybiByKHQsbik/blswXTp0fSx0KX0sby5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIG99LG99LFg9ZnVuY3Rpb24oKXt2YXIgdD1bZnVuY3Rpb24odCl7cmV0dXJuIHR9XSxlPVswLDBdLHI9InBlcmNlbnQiLGk9bnVsbCxvPVtdLHU9ZnVuY3Rpb24odSl7dmFyIGE9bmV3IEFycmF5KHUubGVuZ3RoKSxjPSEwLGw9ITEsZj12b2lkIDA7dHJ5e2Zvcih2YXIgaCxzPXRbU3ltYm9sLml0ZXJhdG9yXSgpOyEoYz0oaD1zLm5leHQoKSkuZG9uZSk7Yz0hMClmb3IodmFyIGQ9aC52YWx1ZSxnPTA7Zzx1Lmxlbmd0aDtnKyspe3ZhciB2PWQodVtnXSxnKTtBcnJheS5pc0FycmF5KHYpP2EucHVzaC5hcHBseShhLFIodikpOmEucHVzaCh2KX19Y2F0Y2godCl7bD0hMCxmPXR9ZmluYWxseXt0cnl7IWMmJnMucmV0dXJuJiZzLnJldHVybigpfWZpbmFsbHl7aWYobCl0aHJvdyBmfX12YXIgcD1bbi5taW4oYSksbi5tYXgoYSldO2lmKHBbMF09bnVsbD09cFswXT9uLm1pbihvKTpuLm1pbihbcFswXV0uY29uY2F0KFIobykpKSxwWzFdPW51bGw9PXBbMV0/bi5tYXgobyk6bi5tYXgoW3BbMV1dLmNvbmNhdChSKG8pKSksbnVsbCE9aSl7dmFyIG09TWF0aC5tYXgoTWF0aC5hYnMocFsxXS1pKSxNYXRoLmFicyhwWzBdLWkpKTtwWzBdPWktbSxwWzFdPWkrbX1zd2l0Y2gocil7Y2FzZSJkb21haW4iOnBbMF0tPWVbMF0scFsxXSs9ZVsxXTticmVhaztjYXNlInBlcmNlbnQiOnZhciB5PXBbMV0tcFswXTtwWzBdLT1lWzBdKnkscFsxXSs9ZVsxXSp5O2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHBhZFVuaXQ6ICIrcil9cmV0dXJuIHB9O3JldHVybiB1LmFjY2Vzc29ycz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSx1KTp0fSx1LnBhZD1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSx1KTplfSx1LnBhZFVuaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sdSk6cn0sdS5pbmNsdWRlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLHUpOm99LHUuc3ltbWV0cmljYWxBYm91dD1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSx1KTppfSx1fSxaPWZ1bmN0aW9uKCl7dmFyIHQ9W10sbj1bMCwwXSxlPSJwZXJjZW50IixyPW51bGwsaT1bXSxvPVgoKSx1PWZ1bmN0aW9uKHUpe3ZhciBhPXQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQuYXBwbHkodm9pZCAwLGFyZ3VtZW50cyk7cmV0dXJuIEFycmF5LmlzQXJyYXkobik/bi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWVPZigpfSk6bi52YWx1ZU9mKCl9fSk7cmV0dXJuIG8uYWNjZXNzb3JzKGEpLnBhZChuKS5wYWRVbml0KGUpLnN5bW1ldHJpY2FsQWJvdXQobnVsbCE9cj9yLnZhbHVlT2YoKTpudWxsKS5pbmNsdWRlKGkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlT2YoKX0pKSxvKHUpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gbmV3IERhdGUodCl9KX07cmV0dXJuIHUuYWNjZXNzb3JzPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLHUpOnR9LHUucGFkPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLHUpOm59LHUucGFkVW5pdD1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSx1KTplfSx1LmluY2x1ZGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sdSk6aX0sdS5zeW1tZXRyaWNhbEFib3V0PWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLHUpOnJ9LHV9LEs9ZnVuY3Rpb24oKXt2YXIgdD0xLG49MjAsZT0uMSxyPS4xLG89aS5yYW5kb21Ob3JtYWwoKSx1PWZ1bmN0aW9uKGkpe2Zvcih2YXIgdT10L24sYT1bXSxjPTA7YzxuKzE7YysrKXthLnB1c2goaSk7dmFyIGw9bygpKk1hdGguc3FydCh1KSpyKyhlLXIqci8yKSp1O2kqPU1hdGguZXhwKGwpfXJldHVybiBhfTtyZXR1cm4gdS5wZXJpb2Q9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sdSk6dH0sdS5zdGVwcz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSx1KTpufSx1Lm11PWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLHUpOmV9LHUuc2lnbWE9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sdSk6cn0sdS5yYW5kb21Ob3JtYWw9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sdSk6b30sdX0sJD1mdW5jdGlvbigpe3ZhciB0PW5ldyBEYXRlLG49MTAwLGU9ci50aW1lRGF5LG89MSx1PXIudGltZVllYXIsYT0xLGM9bnVsbCxsPWZ1bmN0aW9uKCl7dmFyIHQ9aS5yYW5kb21Ob3JtYWwoMSwuMSk7cmV0dXJuIE1hdGguY2VpbCgxZTMqdCgpKX0sZj1LKCksaD1mdW5jdGlvbih0KXt2YXIgbj11Lm9mZnNldCh0LGEpLXQ7cmV0dXJuKGUub2Zmc2V0KHQsbyktdCkvbn0scz1mdW5jdGlvbih0LG4pe3ZhciBlPWgodCkscj1mLnBlcmlvZChlKShuKSxpPXtkYXRlOnQsb3BlbjpyWzBdLGhpZ2g6TWF0aC5tYXguYXBwbHkoTWF0aCxyKSxsb3c6TWF0aC5taW4uYXBwbHkoTWF0aCxyKSxjbG9zZTpyW2Yuc3RlcHMoKV19O3JldHVybiBpLnZvbHVtZT1sKGkpLGl9LGQ9ZnVuY3Rpb24ocil7dmFyIGk9dm9pZCAwLHU9dm9pZCAwLGE9dm9pZCAwO2RvIGk9cj9lLm9mZnNldChyLmRhdGUsbyk6bmV3IERhdGUodC5nZXRUaW1lKCkpLHU9cj9yLmNsb3NlOm4scj1zKGksdSksYT1jJiYhYyhyKTt3aGlsZShhKTtyZXR1cm4gcn0sZz1mdW5jdGlvbigpe3ZhciB0PXZvaWQgMCxuPXt9O3JldHVybiBuLm5leHQ9ZnVuY3Rpb24oKXt2YXIgbj1kKHQpO3JldHVybiB0PW4sbn0sbi50YWtlPWZ1bmN0aW9uKHQpe3JldHVybiBuLnVudGlsKGZ1bmN0aW9uKG4sZSl7cmV0dXJuIXR8fHQ8MHx8ZT09PXR9KX0sbi51bnRpbD1mdW5jdGlvbihuKXtmb3IodmFyIGU9W10scj0wLGk9ZCh0KSxvPW4mJiFuKGkscik7bzspZS5wdXNoKGkpLHQ9aSxpPWQodCkscis9MSxvPW4mJiFuKGkscik7cmV0dXJuIGV9LG59LHY9ZnVuY3Rpb24odCl7cmV0dXJuIGcoKS50YWtlKHQpfTtyZXR1cm4gdi5zdHJlYW09Zyx2W1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXt2YXIgdD1nKCk7cmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57dmFsdWU6dC5uZXh0KCksZG9uZTohMX19fX0sdi5zdGFydERhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sdik6dH0sdi5zdGFydFByaWNlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLHYpOm59LHYuaW50ZXJ2YWw9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sdik6ZX0sdi5pbnRlcnZhbFN0ZXA9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sdik6b30sdi51bml0SW50ZXJ2YWw9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sdik6dX0sdi51bml0SW50ZXJ2YWxTdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLHYpOmF9LHYuZmlsdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLHYpOmN9LHYudm9sdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9cChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLHYpOmx9LHcodixmLCJzdGVwcyIsIm11Iiwic2lnbWEiKSx2fSxKPWZ1bmN0aW9uKHQpe3ZhciBuPXQuZGF0ZS5nZXREYXkoKTtyZXR1cm4hKDA9PT1ufHw2PT09bil9LHR0PWZ1bmN0aW9uKCl7dmFyIHQ9IkJUQy1VU0QiLG49bnVsbCxlPW51bGwscj1udWxsLGk9ZnVuY3Rpb24oaSl7dmFyIHU9W107bnVsbCE9biYmdS5wdXNoKCJzdGFydD0iK24udG9JU09TdHJpbmcoKSksbnVsbCE9ZSYmdS5wdXNoKCJlbmQ9IitlLnRvSVNPU3RyaW5nKCkpLG51bGwhPXImJnUucHVzaCgiZ3JhbnVsYXJpdHk9IityKTt2YXIgYT0iaHR0cHM6Ly9hcGkuZ2RheC5jb20vcHJvZHVjdHMvIit0KyIvY2FuZGxlcz8iK3Uuam9pbigiJiIpO28uanNvbihhLGZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ/dm9pZCBpKHQpOihuPW4ubWFwKGZ1bmN0aW9uKHQpe3JldHVybntkYXRlOm5ldyBEYXRlKDFlMyp0WzBdKSxvcGVuOnRbM10saGlnaDp0WzJdLGxvdzp0WzFdLGNsb3NlOnRbNF0sdm9sdW1lOnRbNV19fSksdm9pZCBpKHQsbikpfSl9O3JldHVybiBpLnByb2R1Y3Q9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixpKTp0fSxpLnN0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsaSk6bn0saS5lbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxpKTplfSxpLmdyYW51bGFyaXR5PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsaSk6cn0saX0sbnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiB0WzBdLnRvTG93ZXJDYXNlKCkrdC5zdWJzdHIoMSl9dmFyIG49IllBSE9PIixlPSJHT09HIixyPW51bGwsaT1udWxsLHU9bnVsbCxhPW51bGwsYz0hMSxsPW51bGwsZj10LGg9ZnVuY3Rpb24odCl7dmFyIGg9W107bnVsbCE9ciYmaC5wdXNoKCJhcGlfa2V5PSIrciksbnVsbCE9aSYmaC5wdXNoKCJzdGFydF9kYXRlPSIraS50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLDEwKSksbnVsbCE9dSYmaC5wdXNoKCJlbmRfZGF0ZT0iK3UudG9JU09TdHJpbmcoKS5zdWJzdHJpbmcoMCwxMCkpLG51bGwhPWEmJmgucHVzaCgicm93cz0iK2EpLGN8fGgucHVzaCgib3JkZXI9YXNjIiksbnVsbCE9bCYmaC5wdXNoKCJjb2xsYXBzZT0iK2wpO3ZhciBzPSJodHRwczovL3d3dy5xdWFuZGwuY29tL2FwaS92My9kYXRhc2V0cy8iK24rIi8iK2UrIi9kYXRhLmpzb24/IitoLmpvaW4oIiYiKTtvLmpzb24ocyxmdW5jdGlvbihuLGUpe2lmKG4pcmV0dXJuIHZvaWQgdChuKTt2YXIgcj1lLmRhdGFzZXRfZGF0YSxpPWZ8fGZ1bmN0aW9uKHQpe3JldHVybiB0fSxvPXIuY29sdW1uX25hbWVzLm1hcChmdW5jdGlvbih0LG4pe3JldHVybltuLGkodCldfSkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0WzFdfSksdT1yLmRhdGEubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPXt9O3JldHVybiBvLmZvckVhY2goZnVuY3Rpb24oZSl7bltlWzFdXT0wPT09ZVswXT9uZXcgRGF0ZSh0W2VbMF1dKTp0W2VbMF1dfSksbn0pO3Qobix1KX0pfTtyZXR1cm4gaC5kYXRhYmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGgpOm59LGguZGF0YXNldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LGgpOmV9LGguYXBpS2V5PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsaCk6cn0saC5zdGFydD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LGgpOml9LGguZW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsaCk6dX0saC5yb3dzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsaCk6YX0saC5kZXNjZW5kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXQsaCk6Y30saC5jb2xsYXBzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD10LGgpOmx9LGguY29sdW1uTmFtZU1hcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj10LGgpOmZ9LGguZGVmYXVsdENvbHVtbk5hbWVNYXA9dCxofSxldD1mdW5jdGlvbigpe3ZhciB0PTEwLGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQ8PTE/ZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW3RdfSk6bi5yYW5nZSgwLE1hdGguY2VpbChlLmxlbmd0aC90KSkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBlLnNsaWNlKG4qdCwobisxKSp0KX0pfTtyZXR1cm4gZS5idWNrZXRTaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sZSk6dH0sZX0scnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBlPXQubWFwKGZ1bmN0aW9uKHQpe3JldHVybltyKHQpLGkodCldfSksbz1uLnJhbmdlKDEsZS5sZW5ndGgtMSkubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPWVbdC0xXSxyPWVbdF0saT1lW3QrMV0sbz0oblswXS1pWzBdKSooclsxXS1uWzFdKSx1PShuWzBdLXJbMF0pKihpWzFdLW5bMV0pO3JldHVybiBNYXRoLmFicyguNSpvKnUpfSk7cmV0dXJuIG99dmFyIGU9ZXQoKSxyPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxpPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxvPWZ1bmN0aW9uKHIpe2lmKGUuYnVja2V0U2l6ZSgpPj1yLmxlbmd0aClyZXR1cm4gcjt2YXIgaT10KHIpLG89ZShpKSx1PWUoci5zbGljZSgxLHIubGVuZ3RoLTEpKSxhPXUubWFwKGZ1bmN0aW9uKHQsZSl7dmFyIHI9b1tlXSxpPW4ubWF4KHIpLHU9ci5pbmRleE9mKGkpO3JldHVybiB0W3VdfSk7cmV0dXJuW10uY29uY2F0KFtyWzBdXSxhLFtyW3IubGVuZ3RoLTFdXSl9O3JldHVybiB3KG8sZSwiYnVja2V0U2l6ZSIpLG8ueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG8pOnJ9LG8ueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LG8pOml9LG99LGl0PWZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGU9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHI9ZXQoKSxpPWZ1bmN0aW9uKGkpe2lmKHIuYnVja2V0U2l6ZSgpPj1pLmxlbmd0aClyZXR1cm4gaTt2YXIgbz1yKGkuc2xpY2UoMSxpLmxlbmd0aC0xKSksdT1pWzBdLGE9aVtpLmxlbmd0aC0xXSxjPVtdLmNvbmNhdChbdV0sbyxbYV0pLGw9dCh1KSxmPWUodSksaD1vLm1hcChmdW5jdGlvbihyLGkpe3ZhciBvPW4ubWVhbihjW2krMV0sdCksdT1uLm1lYW4oY1tpKzFdLGUpLGE9ci5tYXAoZnVuY3Rpb24obil7cmV0dXJuW3QobiksZShuKV19KSxoPWEubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPShsLW8pKih0WzFdLWYpLGU9KGwtdFswXSkqKHUtZik7cmV0dXJuIE1hdGguYWJzKC41Km4qZSl9KSxzPWguaW5kZXhPZihuLm1heChoKSksZD1hW3NdO3JldHVybiBsPWRbMF0sZj1kWzFdLHJbc119KTtyZXR1cm5bXS5jb25jYXQoW2lbMF1dLGgsW2lbaS5sZW5ndGgtMV1dKX07cmV0dXJuIHcoaSxyLCJidWNrZXRTaXplIiksaS54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4saSk6dH0saS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsaSk6ZX0saX0sb3Q9ZnVuY3Rpb24oKXt2YXIgdD1ldCgpLGU9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHI9ZnVuY3Rpb24ocil7aWYodC5idWNrZXRTaXplKCk+ci5sZW5ndGgpcmV0dXJuIHI7dmFyIGk9bi5leHRlbnQocixlKSxvPXQoci5zbGljZSgxLHIubGVuZ3RoLTEpKSx1PW8ubWFwKGZ1bmN0aW9uKHQsbil7dmFyIHIsbyx1PXt9LGE9ITAsYz10Lm1hcChlKSxsPWMuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0PT09aVswXXx8dD09PWlbMV19KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGMuaW5kZXhPZih0KX0pWzBdO3JldHVybiB2b2lkIDAhPT1sP3RbbF06KGMuZm9yRWFjaChmdW5jdGlvbih0LG4pe3ZvaWQgMD09PXVbdF0mJih1W3RdPTApLHVbdF0rKyx1W3RdPnVbcl18fHZvaWQgMD09PXI/KHI9dCxvPW4sYT0hMCk6dVt0XT09PXVbcl0mJihhPSExKX0pLGE/dFtvXTp0W01hdGguZmxvb3IodC5sZW5ndGgvMildKX0pO3JldHVybltdLmNvbmNhdChbclswXV0sdSxbcltyLmxlbmd0aC0xXV0pfTtyZXR1cm4gdyhyLHQsImJ1Y2tldFNpemUiKSxyLnZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQscik6ZX0scn0sdXQ9ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbigpe3JldHVybiB0fX0sYXQ9ZnVuY3Rpb24oKXt2YXIgdD1udWxsLG49ZnVuY3Rpb24odCl7cmV0dXJuIHQuZGF0ZX0sZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5vcGVufSxyPWZ1bmN0aW9uKHQpe3JldHVybiB0LmhpZ2h9LGk9ZnVuY3Rpb24odCl7cmV0dXJuIHQubG93fSxvPWZ1bmN0aW9uKHQpe3JldHVybiB0LmNsb3NlfSxhPSJ2ZXJ0aWNhbCIsYz11dCgzKSxsPWZ1bmN0aW9uKGwpe3ZhciBmPXR8fHUucGF0aCgpO3JldHVybiBsLmZvckVhY2goZnVuY3Rpb24odCx1KXt2YXIgbD1uKHQsdSksaD1lKHQsdSkscz1yKHQsdSksZD1pKHQsdSksZz1vKHQsdSksdj1jKHQsdSkvMjsidmVydGljYWwiPT09YT8oZi5tb3ZlVG8obCxkKSxmLmxpbmVUbyhsLHMpLGYubW92ZVRvKGwsaCksZi5saW5lVG8obC12LGgpLGYubW92ZVRvKGwsZyksZi5saW5lVG8obCt2LGcpKTooZi5tb3ZlVG8oZCxsKSxmLmxpbmVUbyhzLGwpLGYubW92ZVRvKGgsbCksZi5saW5lVG8oaCxsK3YpLGYubW92ZVRvKGcsbCksZi5saW5lVG8oZyxsLXYpKX0pLHQ/bnVsbDpmLnRvU3RyaW5nKCl9O3JldHVybiBsLmNvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sbCk6dH0sbC54PWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dXQoYXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdKSxsKTpufSxsLm9wZW49ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT11dChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGwpOmV9LGwuaGlnaD1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXV0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksbCk6cn0sbC5sb3c9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT11dChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGwpOml9LGwuY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz11dChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGwpOm99LGwud2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz11dChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGwpOmN9LGwub3JpZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGwpOmF9LGx9LGN0PWZ1bmN0aW9uKCl7dmFyIHQ9bnVsbCxuPWZ1bmN0aW9uKHQpe3JldHVybiB0Lnh9LGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQueX0scj0iY2VudGVyIixpPSJjZW50ZXIiLG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuaGVpZ2h0fSxhPXV0KDMpLGM9ZnVuY3Rpb24oYyxsKXt2YXIgZj10fHx1LnBhdGgoKTtyZXR1cm4gYy5mb3JFYWNoKGZ1bmN0aW9uKHQsdSl7dmFyIGM9bi5jYWxsKHRoaXMsdCxsfHx1KSxoPWUuY2FsbCh0aGlzLHQsbHx8dSkscz1vLmNhbGwodGhpcyx0LGx8fHUpLGQ9YS5jYWxsKHRoaXMsdCxsfHx1KSxnPXZvaWQgMDtzd2l0Y2gocil7Y2FzZSJsZWZ0IjpnPWQ7YnJlYWs7Y2FzZSJyaWdodCI6Zz0wO2JyZWFrO2Nhc2UiY2VudGVyIjpnPWQvMjticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBob3Jpem9udGFsIGFsaWdubWVudCAiK3IpfXZhciB2PXZvaWQgMDtzd2l0Y2goaSl7Y2FzZSJib3R0b20iOnY9LXM7YnJlYWs7Y2FzZSJ0b3AiOnY9MDticmVhaztjYXNlImNlbnRlciI6dj1zLzI7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgdmVydGljYWwgYWxpZ25tZW50ICIraSl9Zi5yZWN0KGMtZyxoLXYsZCxzKX0sdGhpcyksdD9udWxsOmYudG9TdHJpbmcoKX07cmV0dXJuIGMuY29udGV4dD1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxjKTp0fSxjLng9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj11dChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGMpOm59LGMueT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXV0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksYyk6ZX0sYy53aWR0aD1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXV0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksYyk6YX0sYy5ob3Jpem9udGFsQWxpZ249ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sYyk6cn0sYy5oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz11dChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGMpOm99LGMudmVydGljYWxBbGlnbj1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxjKTppfSxjfSxsdD1mdW5jdGlvbigpe3ZhciB0PW51bGwsbj1mdW5jdGlvbih0KXtyZXR1cm4gdC5kYXRlfSxlPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm9wZW59LHI9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaGlnaH0saT1mdW5jdGlvbih0KXtyZXR1cm4gdC5sb3d9LG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xvc2V9LGE9dXQoMyksYz1mdW5jdGlvbihjKXt2YXIgbD10fHx1LnBhdGgoKTtyZXR1cm4gYy5mb3JFYWNoKGZ1bmN0aW9uKHQsdSl7dmFyIGM9bih0LHUpLGY9ZSh0LHUpLGg9cih0LHUpLHM9aSh0LHUpLGQ9byh0LHUpLGc9YSh0LHUpLHY9Zy8yO2wucmVjdChjLXYsZixnLGQtZiksbC5tb3ZlVG8oYyxNYXRoLm1pbihkLGYpKSxsLmxpbmVUbyhjLGgpLGwubW92ZVRvKGMsTWF0aC5tYXgoZCxmKSksbC5saW5lVG8oYyxzKX0pLHQ/bnVsbDpsLnRvU3RyaW5nKCl9O3JldHVybiBjLmNvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sYyk6dH0sYy54PWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dXQoYXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdKSxjKTpufSxjLm9wZW49ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT11dChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGMpOmV9LGMuaGlnaD1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXV0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksYyk6cn0sYy5sb3c9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT11dChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGMpOml9LGMuY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz11dChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGMpOm99LGMud2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT11dChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGMpOmF9LGN9LGZ0PWZ1bmN0aW9uKCl7dmFyIHQ9bnVsbCxuPWZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlfSxlPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm1lZGlhbn0scj1mdW5jdGlvbih0KXtyZXR1cm4gdC51cHBlclF1YXJ0aWxlfSxpPWZ1bmN0aW9uKHQpe3JldHVybiB0Lmxvd2VyUXVhcnRpbGV9LG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuaGlnaH0sYT1mdW5jdGlvbih0KXtyZXR1cm4gdC5sb3d9LGM9InZlcnRpY2FsIixsPXV0KDUpLGY9dXQoLjUpLGg9ZnVuY3Rpb24oaCl7dmFyIHM9dHx8dS5wYXRoKCk7cmV0dXJuIGguZm9yRWFjaChmdW5jdGlvbih0LHUpe3ZhciBoPW4odCx1KSxkPWwodCx1KSxnPWQvMix2PWQqZih0LHUpLHA9di8yLG09byh0LHUpLHk9cih0LHUpLGI9ZSh0LHUpLHc9aSh0LHUpLHg9YSh0LHUpLFQ9dy15OyJ2ZXJ0aWNhbCI9PT1jPyhzLm1vdmVUbyhoLXAsbSkscy5saW5lVG8oaCtwLG0pLHMubW92ZVRvKGgsbSkscy5saW5lVG8oaCx5KSxzLnJlY3QoaC1nLHksZCxUKSxzLm1vdmVUbyhoLWcsYikscy5saW5lVG8oaCtnLGIpLHMubW92ZVRvKGgsdykscy5saW5lVG8oaCx4KSxzLm1vdmVUbyhoLXAseCkscy5saW5lVG8oaCtwLHgpKToocy5tb3ZlVG8oeCxoLXApLHMubGluZVRvKHgsaCtwKSxzLm1vdmVUbyh4LGgpLHMubGluZVRvKHcsaCkscy5yZWN0KHcsaC1nLC1ULGQpLHMubW92ZVRvKGIsaC1nKSxzLmxpbmVUbyhiLGgrZykscy5tb3ZlVG8oeSxoKSxzLmxpbmVUbyhtLGgpLHMubW92ZVRvKG0saC1wKSxzLmxpbmVUbyhtLGgrcCkpfSksdD9udWxsOnMudG9TdHJpbmcoKX07cmV0dXJuIGguY29udGV4dD1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxoKTp0fSxoLnZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dXQoYXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdKSxoKTpufSxoLm1lZGlhbj1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXV0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksaCk6ZX0saC51cHBlclF1YXJ0aWxlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dXQoYXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdKSxoKTpyfSxoLmxvd2VyUXVhcnRpbGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT11dChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGgpOml9LGguaGlnaD1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXV0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksaCk6b30saC5sb3c9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT11dChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGgpOmF9LGgud2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD11dChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGgpOmx9LGgub3JpZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGgpOmN9LGguY2FwPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9dXQoYXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdKSxoKTpmfSxofSxodD1mdW5jdGlvbigpe3ZhciB0PW51bGwsbj1mdW5jdGlvbih0KXtyZXR1cm4gdC54fSxlPWZ1bmN0aW9uKHQpe3JldHVybiB0LmhpZ2h9LHI9ZnVuY3Rpb24odCl7cmV0dXJuIHQubG93fSxpPSJ2ZXJ0aWNhbCIsbz11dCg1KSxhPWZ1bmN0aW9uKGEpe3ZhciBjPXR8fHUucGF0aCgpO3JldHVybiBhLmZvckVhY2goZnVuY3Rpb24odCx1KXt2YXIgYT1uKHQsdSksbD1vKHQsdSksZj1sLzIsaD1lKHQsdSkscz1yKHQsdSk7InZlcnRpY2FsIj09PWk/KGMubW92ZVRvKGEtZixoKSxjLmxpbmVUbyhhK2YsaCksYy5tb3ZlVG8oYSxoKSxjLmxpbmVUbyhhLHMpLGMubW92ZVRvKGEtZixzKSxjLmxpbmVUbyhhK2YscykpOihjLm1vdmVUbyhzLGEtZiksYy5saW5lVG8ocyxhK2YpLGMubW92ZVRvKHMsYSksYy5saW5lVG8oaCxhKSxjLm1vdmVUbyhoLGEtZiksYy5saW5lVG8oaCxhK2YpKX0pLHQ/bnVsbDpjLnRvU3RyaW5nKCl9O3JldHVybiBhLmNvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sYSk6dH0sYS52YWx1ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXV0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksYSk6bn0sYS5oaWdoPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dXQoYXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdKSxhKTplfSxhLmxvdz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXV0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksYSk6cn0sYS53aWR0aD1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXV0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksYSk6b30sYS5vcmllbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sYSk6aX0sYX0sc3Q9ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbigpe3JldHVybiB0fX0sZHQ9MWUtNixndD1mdW5jdGlvbih0LG4pe3Q9dHx8ImciO3ZhciBlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG59LHI9ZnVuY3Rpb24ocixpKXtpPWl8fGZ1bmN0aW9uKHQpe3JldHVybiB0fTt2YXIgbz1udWxsPT1uP3Q6dCsiLiIrbix1PXIuc2VsZWN0QWxsKG8pLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudE5vZGU9PT1yLm5vZGUoKX0pLGM9dS5kYXRhKGksZSksbD1jLmVudGVyKCkuaW5zZXJ0KHQpLmF0dHIoImNsYXNzIixuKSxmPWMuZXhpdCgpO3JldHVybiBjPWMubWVyZ2UobCksYS5zZWxlY3Rpb24ucHJvdG90eXBlLnRyYW5zaXRpb24mJihsLnN0eWxlKCJvcGFjaXR5IixkdCksYy50cmFuc2l0aW9uKCkuc3R5bGUoIm9wYWNpdHkiLDEpLGYudHJhbnNpdGlvbigpLnN0eWxlKCJvcGFjaXR5IixkdCkpLGYucmVtb3ZlKCksYy5lbnRlcj1mdW5jdGlvbigpe3JldHVybiBsfSxjLmV4aXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZn0sY307cmV0dXJuIHIuZWxlbWVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLHIpOnR9LHIuY2xhc3NOYW1lPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQscik6bn0sci5rZXk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxyKTplfSxyfSx2dD1mdW5jdGlvbih0KXt2YXIgbj1mdW5jdGlvbigpe30sZT1mdW5jdGlvbigpe3JldHVyblswLDBdfSxyPWZ1bmN0aW9uKHQsbil7cmV0dXJuW3QueCx0LnldfSxpPXR8fGZ1bmN0aW9uKHQpe3JldHVybiB0fSxvPWZ1bmN0aW9uKCl7fSx1PWd0KCJnIiwibGFiZWwiKSxjPWZ1bmN0aW9uKHQpe3QuZWFjaChmdW5jdGlvbih0LGMsbCl7dmFyIGY9dShhLnNlbGVjdChsW2NdKSx0KS5jYWxsKG8pLGg9Zi5ub2RlcygpLHM9aC5tYXAoZnVuY3Rpb24odCxuKXt2YXIgaT1hLnNlbGVjdCh0KS5kYXR1bSgpLG89cihpLG4saCksdT1lKGksbixoKTtyZXR1cm57aGlkZGVuOiExLHg6b1swXSx5Om9bMV0sd2lkdGg6dVswXSxoZWlnaHQ6dVsxXX19KSxkPWkocyk7Zi5hdHRyKCJzdHlsZSIsZnVuY3Rpb24odCxuKXtyZXR1cm4iZGlzcGxheToiKyhkW25dLmhpZGRlbj8ibm9uZSI6ImluaGVyaXQiKX0pLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCxuKXtyZXR1cm4idHJhbnNsYXRlKCIrZFtuXS54KyIsICIrZFtuXS55KyIpIn0pLmF0dHIoImxheW91dC13aWR0aCIsZnVuY3Rpb24odCxuKXtyZXR1cm4gZFtuXS53aWR0aH0pLmF0dHIoImxheW91dC1oZWlnaHQiLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGRbbl0uaGVpZ2h0fSkuYXR0cigiYW5jaG9yLXgiLGZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gcih0LG4sZSlbMF0tZFtuXS54fSkuYXR0cigiYW5jaG9yLXkiLGZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gcih0LG4sZSlbMV0tZFtuXS55fSksZi5jYWxsKG8pLG4oZix0LGMpfSl9O3JldHVybiBUKGMsdSxNKCJrZXkiKSksVChjLGkpLGMuc2l6ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXN0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksYyk6ZX0sYy5wb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXN0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksYyk6cn0sYy5jb21wb25lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sYyk6b30sYy5kZWNvcmF0ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxjKTpufSxjfSxwdD1mdW5jdGlvbih0KXt2YXIgbj0yLGU9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHI9Z3QoInRleHQiKSxpPWd0KCJyZWN0Iiksbz1ndCgiY2lyY2xlIiksdT1mdW5jdGlvbih0KXt0LmVhY2goZnVuY3Rpb24odCx1LGMpe3ZhciBsPWNbdV0sZj1hLnNlbGVjdChsKSxoPU51bWJlcihsLmdldEF0dHJpYnV0ZSgibGF5b3V0LXdpZHRoIikpLHM9TnVtYmVyKGwuZ2V0QXR0cmlidXRlKCJsYXlvdXQtaGVpZ2h0IikpLGQ9aShmLFt0XSk7ZC5hdHRyKCJ3aWR0aCIsaCkuYXR0cigiaGVpZ2h0IixzKTt2YXIgZz1OdW1iZXIobC5nZXRBdHRyaWJ1dGUoImFuY2hvci14IikpLHY9TnVtYmVyKGwuZ2V0QXR0cmlidXRlKCJhbmNob3IteSIpKSxwPW8oZixbdF0pO3AuYXR0cigiciIsMikuYXR0cigiY3giLGcpLmF0dHIoImN5Iix2KTt2YXIgbT1yKGYsW3RdKTttLmVudGVyKCkuYXR0cigiZHkiLCIwLjllbSIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK24rIiwgIituKyIpIiksbS50ZXh0KGUpfSl9O3JldHVybiB1LnBhZGRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sdSk6bn0sdS52YWx1ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXN0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksdSk6ZX0sdX0sbXQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4hKHQueD49bi54K24ud2lkdGh8fHQueCt0LndpZHRoPD1uLnh8fHQueT49bi55K24uaGVpZ2h0fHx0LnkrdC5oZWlnaHQ8PW4ueSl9LHl0PWZ1bmN0aW9uKHQsbil7aWYobXQodCxuKSl7dmFyIGU9TWF0aC5tYXgodC54LG4ueCkscj1NYXRoLm1pbih0LngrdC53aWR0aCxuLngrbi53aWR0aCksaT1NYXRoLm1heCh0Lnksbi55KSxvPU1hdGgubWluKHQueSt0LmhlaWdodCxuLnkrbi5oZWlnaHQpO3JldHVybihyLWUpKihvLWkpfXJldHVybiAwfSxidD1mdW5jdGlvbih0LGUpe3JldHVybiBuLnN1bSh0Lm1hcChmdW5jdGlvbihuLHIpe3JldHVybiBlPT09cj8wOnl0KHRbZV0sbil9KSl9LHd0PWZ1bmN0aW9uKHQsbixlLHIsaSl7cmV0dXJue3g6dCx5Om4sd2lkdGg6ZSxoZWlnaHQ6cixsb2NhdGlvbjppfX0seHQ9ZnVuY3Rpb24odCl7dmFyIG49dC54LGU9dC55LHI9dC53aWR0aCxpPXQuaGVpZ2h0O3JldHVyblt3dChuLGUscixpLCJib3R0b20tcmlnaHQiKSx3dChuLXIsZSxyLGksImJvdHRvbS1sZWZ0Iiksd3Qobi1yLGUtaSxyLGksInRvcC1sZWZ0Iiksd3QobixlLWkscixpLCJ0b3AtcmlnaHQiKSx3dChuLGUtaS8yLHIsaSwibWlkZGxlLXJpZ2h0Iiksd3Qobi1yLzIsZSxyLGksImJvdHRvbS1jZW50ZXIiKSx3dChuLXIsZS1pLzIscixpLCJtaWRkbGUtbGVmdCIpLHd0KG4tci8yLGUtaSxyLGksInRvcC1jZW50ZXIiKV19LFR0PWZ1bmN0aW9uKHQsbixlKXtyZXR1cm5bXS5jb25jYXQoUih0LnNsaWNlKDAsbikpLFtlXSxSKHQuc2xpY2UobisxKSkpfSxFdD1mdW5jdGlvbih0LG4pe3JldHVybiB0PG59LFN0PWZ1bmN0aW9uIHQoKXt2YXIgZT1udWxsLHI9RXQsaT1mdW5jdGlvbigpe3JldHVybiAwfSxvPXZvaWQgMCx1PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGUtaShvW25dLG4sbykraSh0LG4sVHQobyxuLHQpKX0sYT1mdW5jdGlvbiBhKGMsbCl7ZXx8KGU9bi5zdW0oby5tYXAoZnVuY3Rpb24odCxuKXtyZXR1cm4gaSh0LG4sbyl9KSkpO3ZhciBmPXUoYyxsKTtyZXR1cm4gcihmLGUpP3QoKS5sb2NhdGlvblNjb3JlKGkpLndpbm5pbmdTY29yZShyKS5zY29yZShmKS5yZWN0YW5nbGVzKFR0KG8sbCxjKSk6YX07cmV0dXJuIGEucmVjdGFuZ2xlcz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxhKTpvfSxhLnNjb3JlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGEpOmV9LGEud2lubmluZ1Njb3JlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLA0KYSk6cn0sYS5sb2NhdGlvblNjb3JlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGEpOml9LGF9LE10PWZ1bmN0aW9uKCl7dmFyIHQ9dm9pZCAwLG49ZnVuY3Rpb24obil7cmV0dXJuIHQ/bi53aWR0aCpuLmhlaWdodC15dChuLHQpOjB9LGU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBidChyLGUpK24odCl9LHI9ZnVuY3Rpb24odCl7dmFyIG49U3QoKS5sb2NhdGlvblNjb3JlKGUpLnJlY3RhbmdsZXModCk7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0LGUpe3h0KHQpLmZvckVhY2goZnVuY3Rpb24odCxyKXtuPW4odCxlKX0pfSksbi5yZWN0YW5nbGVzKCl9O3JldHVybiByLmJvdW5kcz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxyKTp0fSxyfSxrdD1mdW5jdGlvbih0KXtyZXR1cm4gdFtMdCh0KV19LEx0PWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdC5sZW5ndGgpfSxBdD1mdW5jdGlvbigpe3ZhciB0PTFlMyxuPTEsZT12b2lkIDAscj1mdW5jdGlvbih0KXtzd2l0Y2godC5sb2NhdGlvbil7Y2FzZSJib3R0b20tcmlnaHQiOnJldHVybiAwO2Nhc2UibWlkZGxlLXJpZ2h0IjpjYXNlImJvdHRvbS1jZW50ZXIiOnJldHVybiB0LndpZHRoKnQuaGVpZ2h0Lzh9cmV0dXJuIHQud2lkdGgqdC5oZWlnaHQvNH0saT1mdW5jdGlvbih0KXtyZXR1cm4gZT90LndpZHRoKnQuaGVpZ2h0LXl0KHQsZSk6MH0sbz1mdW5jdGlvbih0LG4sZSl7cmV0dXJuIGJ0KGUsbikraSh0KStyKHQpfSx1PWZ1bmN0aW9uKGUpe2Zvcih2YXIgcj10LGk9ZnVuY3Rpb24odCxuKXtyZXR1cm4gTWF0aC5leHAoKG4tdCkvcik+TWF0aC5yYW5kb20oKX0sdT1TdCgpLmxvY2F0aW9uU2NvcmUobykud2lubmluZ1Njb3JlKGkpLnJlY3RhbmdsZXMoZSk7cj4wOyl7dmFyIGE9THQoZSksYz1rdCh4dChlW2FdKSk7dT11KGMsYSksci09bn1yZXR1cm4gdS5yZWN0YW5nbGVzKCl9O3JldHVybiB1LnRlbXBlcmF0dXJlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLHUpOnR9LHUuY29vbGluZz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSx1KTpufSx1LmJvdW5kcz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSx1KTplfSx1fSxIdD1mdW5jdGlvbih0LGUpe3JldHVybiB0W24uc2Nhbih0LGUpXX0sT3Q9ZnVuY3Rpb24odCl7dD10fHxmdW5jdGlvbih0KXtyZXR1cm4gdH07dmFyIG49ZnVuY3Rpb24obil7bj10KG4pO2Zvcih2YXIgZT1mdW5jdGlvbigpe3ZhciB0PW4uZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiF0LmhpZGRlbn0pLGU9dC5tYXAoZnVuY3Rpb24obixlKXtyZXR1cm5bbixidCh0LGUpXX0pLHI9SHQoZSxmdW5jdGlvbih0LG4pe3JldHVybiBuWzFdLXRbMV19KTtyZXR1cm4gclsxXT4wP3ZvaWQoclswXS5oaWRkZW49ITApOiJicmVhayJ9Ozspe3ZhciByPWUoKTtpZigiYnJlYWsiPT09cilicmVha31yZXR1cm4gbn07cmV0dXJuIFQobix0KSxufSxfdD1mdW5jdGlvbigpe3ZhciB0PVswLDBdLG49ZnVuY3Rpb24obil7cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKG4sZSl7dmFyIHI9bi54LGk9bi55O3JldHVybiByK24ud2lkdGg+dFswXSYmKHItPW4ud2lkdGgpLGkrbi5oZWlnaHQ+dFsxXSYmKGktPW4uaGVpZ2h0KSx7aGVpZ2h0Om4uaGVpZ2h0LHdpZHRoOm4ud2lkdGgseDpyLHk6aX19KX07cmV0dXJuIG4uYm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLG4pOnR9LG59LEN0PTFlLTYsRHQ9ZnVuY3Rpb24odCxuKXt0PXR8fCJnIjt2YXIgZT1mdW5jdGlvbih0LG4pe3JldHVybiBufSxyPW51bGwsaT1mdW5jdGlvbihpLG8pe289b3x8ZnVuY3Rpb24odCl7cmV0dXJuIHR9O3ZhciB1PWkuc2VsZWN0aW9uP2k6bnVsbDt1JiYoaT1pLnNlbGVjdGlvbigpKTt2YXIgYT1pLnNlbGVjdEFsbChmdW5jdGlvbih0LG4sZSl7cmV0dXJuIEFycmF5LmZyb20oZVtuXS5jaGlsZE5vZGVzKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10Lm5vZGVUeXBlfSl9KS5maWx0ZXIobnVsbD09bj90OnQrIi4iK24pLGM9YS5kYXRhKG8sZSksbD1jLmVudGVyKCkuYXBwZW5kKHQpLmF0dHIoImNsYXNzIixuKSxmPWMuZXhpdCgpO2M9Yy5tZXJnZShsKTt2YXIgaD11fHxyO3JldHVybiBoPyhjPWMudHJhbnNpdGlvbihoKSxsLnN0eWxlKCJvcGFjaXR5IixDdCkudHJhbnNpdGlvbihoKS5zdHlsZSgib3BhY2l0eSIsMSksZj1mLnRyYW5zaXRpb24oaCkuc3R5bGUoIm9wYWNpdHkiLEN0KS5yZW1vdmUoKSk6Zi5yZW1vdmUoKSxjLmVudGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGx9LGMuZXhpdD1mdW5jdGlvbigpe3JldHVybiBmfSxjfTtyZXR1cm4gaS5lbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGkpOnR9LGkuY2xhc3NOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGkpOm59LGkua2V5PWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGkpOmV9LGkudHJhbnNpdGlvbj1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxpKTpyfSxpfSxOdD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoZS5sZW5ndGg8PTEpcmV0dXJuIDEwO2Uuc29ydCgpO3ZhciByPW4ucGFpcnMoZSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmFicyh0WzBdLXRbMV0pfSksaT1uLm1pbihyKTtyZXR1cm4gdCppfX0sSXQ9ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbigpe3JldHVybiB0fX0sVnQ9ZnVuY3Rpb24oKXt2YXIgdD1lLnNjYWxlSWRlbnRpdHkoKSxuPWUuc2NhbGVJZGVudGl0eSgpLHI9ZnVuY3Rpb24oKXtyZXR1cm4gMH0saT1mdW5jdGlvbih0KXtyZXR1cm4gdC54fSxvPWZ1bmN0aW9uKHQpe3JldHVybiB0Lnl9LHU9ZnVuY3Rpb24oKXt9LGE9TnQoLjc1KSxjPSJ2ZXJ0aWNhbCIsbD1mdW5jdGlvbigpe307cmV0dXJuIGwuZGVmaW5lZD1mdW5jdGlvbih0LG4pe3JldHVybiBtKHIsaSxvKSh0LG4pfSxsLnZhbHVlcz1mdW5jdGlvbihlLHUpe2lmKCJ2ZXJ0aWNhbCI9PT1jKXt2YXIgYT1uKG8oZSx1KSksbD1uKHIoZSx1KSksZj10KGkoZSx1KSk7cmV0dXJue2Q6ZSx4OmYseTphLHkwOmwsaGVpZ2h0OmEtbCxvcmlnaW46W2YsYV0sYmFzZU9yaWdpbjpbZixsXSx0cmFuc3Bvc2VkWDpmLHRyYW5zcG9zZWRZOmF9fXZhciBoPXQobyhlLHUpKSxzPXQocihlLHUpKSxkPW4oaShlLHUpKTtyZXR1cm57ZDplLHg6ZCx5OmgseTA6cyxoZWlnaHQ6aC1zLG9yaWdpbjpbaCxkXSxiYXNlT3JpZ2luOltzLGRdLHRyYW5zcG9zZWRYOmgsdHJhbnNwb3NlZFk6ZH19LGwuZGVjb3JhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sbCk6dX0sbC54U2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sbCk6dH0sbC55U2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sbCk6bn0sbC5iYXNlVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1JdChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGwpOnJ9LGwuY3Jvc3NWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUl0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksbCk6aX0sbC5tYWluVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1JdChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGwpOm99LGwuYmFyV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1JdChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGwpOmF9LGwub3JpZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGwpOmN9LGx9LFB0PSIjYzYwIix6dD0iIzZjMCIsUnQ9IiMwMDAiLEZ0PSIjZGRkIixVdD0iIzk5OSIsQnQ9e3JlZDpQdCxncmVlbjp6dCxibGFjazpSdCxncmF5OkZ0LGRhcmtHcmF5OlV0fSxxdD1mdW5jdGlvbigpe3ZhciB0PVZ0KCksbj1jLmxpbmUoKS5kZWZpbmVkKHQuZGVmaW5lZCkueChmdW5jdGlvbihuLGUpe3JldHVybiB0LnZhbHVlcyhuLGUpLnRyYW5zcG9zZWRYfSkueShmdW5jdGlvbihuLGUpe3JldHVybiB0LnZhbHVlcyhuLGUpLnRyYW5zcG9zZWRZfSksZT1EdCgicGF0aCIsImxpbmUiKSxyPWZ1bmN0aW9uKHIpe3Iuc2VsZWN0aW9uJiZlLnRyYW5zaXRpb24ociksci5lYWNoKGZ1bmN0aW9uKHIsaSxvKXt2YXIgdT1lKGEuc2VsZWN0KG9baV0pLFtyXSk7dS5hdHRyKCJkIixuKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInN0cm9rZSIsQnQuYmxhY2spLHQuZGVjb3JhdGUoKSh1LHIsaSl9KX07cmV0dXJuIFQocix0LFMoImJhc2VWYWx1ZSIsImJhcldpZHRoIikpLHcocixlLCJrZXkiKSx3KHIsbiwiY3VydmUiKSxyfSxXdD1mdW5jdGlvbigpe3ZhciB0PVZ0KCksbj1jLmxpbmUoKS5kZWZpbmVkKHQuZGVmaW5lZCkueChmdW5jdGlvbihuLGUpe3JldHVybiB0LnZhbHVlcyhuLGUpLnRyYW5zcG9zZWRYfSkueShmdW5jdGlvbihuLGUpe3JldHVybiB0LnZhbHVlcyhuLGUpLnRyYW5zcG9zZWRZfSksZT1mdW5jdGlvbihlKXt2YXIgcj1uLmNvbnRleHQoKTtyLmJlZ2luUGF0aCgpLG4oZSksci5zdHJva2VTdHlsZT1CdC5ibGFjayx0LmRlY29yYXRlKCkocixlKSxyLnN0cm9rZSgpLHIuY2xvc2VQYXRoKCl9O3JldHVybiBUKGUsdCxTKCJiYXNlVmFsdWUiLCJiYXJXaWR0aCIpKSx3KGUsbiwiY3VydmUiLCJjb250ZXh0IiksZX0sanQ9ZnVuY3Rpb24oKXt2YXIgdD1jLnN5bWJvbCgpLG49VnQoKSxlPUR0KCJnIiwicG9pbnQiKSxyPWZ1bmN0aW9uKHQpe3JldHVybiJ0cmFuc2xhdGUoIit0WzBdKyIsICIrdFsxXSsiKSJ9LGk9ZnVuY3Rpb24oaSl7aS5zZWxlY3Rpb24mJmUudHJhbnNpdGlvbihpKSxpLmVhY2goZnVuY3Rpb24oaSxvLHUpe3ZhciBjPWkuZmlsdGVyKG4uZGVmaW5lZCksbD1lKGEuc2VsZWN0KHVbb10pLGMpO2wuZW50ZXIoKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIobi52YWx1ZXModCxlKS5vcmlnaW4pfSkuYXR0cigiZmlsbCIsQnQuZ3JheSkuYXR0cigic3Ryb2tlIixCdC5ibGFjaykuYXBwZW5kKCJwYXRoIiksbC5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIobi52YWx1ZXModCxlKS5vcmlnaW4pfSkuc2VsZWN0KCJwYXRoIikuYXR0cigiZCIsdCksbi5kZWNvcmF0ZSgpKGwsaSxvKX0pfTtyZXR1cm4gVChpLG4sUygiYmFzZVZhbHVlIiwiYmFyV2lkdGgiKSksdyhpLGUsImtleSIpLHcoaSx0LCJ0eXBlIiwic2l6ZSIpLGl9LFF0PWZ1bmN0aW9uKCl7dmFyIHQ9Yy5zeW1ib2woKSxuPVZ0KCksZT1mdW5jdGlvbihlKXt2YXIgcj1lLmZpbHRlcihuLmRlZmluZWQpLGk9dC5jb250ZXh0KCk7ci5mb3JFYWNoKGZ1bmN0aW9uKHIsbyl7aS5zYXZlKCk7dmFyIHU9bi52YWx1ZXMocixvKTtpLnRyYW5zbGF0ZSh1Lm9yaWdpblswXSx1Lm9yaWdpblsxXSksaS5iZWdpblBhdGgoKSx0KGUpLGkuc3Ryb2tlU3R5bGU9QnQuYmxhY2ssaS5maWxsU3R5bGU9QnQuZ3JheSxuLmRlY29yYXRlKCkoaSxyLG8pLGkuc3Ryb2tlKCksaS5maWxsKCksaS5jbG9zZVBhdGgoKSxpLnJlc3RvcmUoKX0pfTtyZXR1cm4gVChlLG4sUygiYmFzZVZhbHVlIiwiYmFyV2lkdGgiKSksdyhlLHQsInNpemUiLCJ0eXBlIiwiY29udGV4dCIpLGV9LEd0PWZ1bmN0aW9uKCl7dmFyIHQ9Y3QoKS54KDApLnkoMCksbj1WdCgpLGU9RHQoImciLCJiYXIiKSxyPWZ1bmN0aW9uKHQpe3JldHVybiJ2ZXJ0aWNhbCI9PT1uLm9yaWVudCgpP3QuaGVpZ2h0OnQud2lkdGh9LGk9ZnVuY3Rpb24odCl7cmV0dXJuInZlcnRpY2FsIj09PW4ub3JpZW50KCk/dC53aWR0aDp0LmhlaWdodH0sbz1mdW5jdGlvbih0KXtyZXR1cm4idHJhbnNsYXRlKCIrdFswXSsiLCAiK3RbMV0rIikifSx1PWZ1bmN0aW9uKHUpe3Uuc2VsZWN0aW9uJiZlLnRyYW5zaXRpb24odSksdS5lYWNoKGZ1bmN0aW9uKHUsYyxsKXt2YXIgZj1uLm9yaWVudCgpO2lmKCJ2ZXJ0aWNhbCIhPT1mJiYiaG9yaXpvbnRhbCIhPT1mKXRocm93IG5ldyBFcnJvcigiVGhlIGJhciBzZXJpZXMgZG9lcyBub3Qgc3VwcG9ydCBhbiBvcmllbnRhdGlvbiBvZiAiK2YpO3ZhciBoPXUuZmlsdGVyKG4uZGVmaW5lZCkscz1oLm1hcChuLnZhbHVlcyk7dC53aWR0aCgwKS5oZWlnaHQoMCksInZlcnRpY2FsIj09PW4ub3JpZW50KCk/KHQudmVydGljYWxBbGlnbigidG9wIiksdC5ob3Jpem9udGFsQWxpZ24oImNlbnRlciIpKToodC5ob3Jpem9udGFsQWxpZ24oInJpZ2h0IiksdC52ZXJ0aWNhbEFsaWduKCJjZW50ZXIiKSk7dmFyIGQ9bi5iYXJXaWR0aCgpKHMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lnh9KSk7aSh0KShkKTt2YXIgZz1lKGEuc2VsZWN0KGxbY10pLGgpO2cuZW50ZXIoKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQsbil7cmV0dXJuIG8oc1tuXS5iYXNlT3JpZ2luKX0pLmF0dHIoImNsYXNzIiwiYmFyICIrbi5vcmllbnQoKSkuYXR0cigiZmlsbCIsQnQuZGFya0dyYXkpLmFwcGVuZCgicGF0aCIpLmF0dHIoImQiLGZ1bmN0aW9uKG4pe3JldHVybiB0KFtuXSl9KSxnLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCxuKXtyZXR1cm4gbyhzW25dLm9yaWdpbil9KS5zZWxlY3QoInBhdGgiKS5hdHRyKCJkIixmdW5jdGlvbihuLGUpe3JldHVybiByKHQpKC1zW2VdLmhlaWdodCksdChbbl0pfSksbi5kZWNvcmF0ZSgpKGcsaCxjKX0pfTtyZXR1cm4gVCh1LG4pLHcodSxlLCJrZXkiKSx1fSxZdD1mdW5jdGlvbigpe3ZhciB0PVZ0KCksbj1jdCgpLngoMCkueSgwKSxlPWZ1bmN0aW9uKG4pe3JldHVybiJ2ZXJ0aWNhbCI9PT10Lm9yaWVudCgpP24uaGVpZ2h0Om4ud2lkdGh9LHI9ZnVuY3Rpb24obil7cmV0dXJuInZlcnRpY2FsIj09PXQub3JpZW50KCk/bi53aWR0aDpuLmhlaWdodH0saT1mdW5jdGlvbihpKXt2YXIgbz1uLmNvbnRleHQoKSx1PWkuZmlsdGVyKHQuZGVmaW5lZCksYT11Lm1hcCh0LnZhbHVlcyksYz10LmJhcldpZHRoKCkoYS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQueH0pKTtyKG4pKGMpLCJ2ZXJ0aWNhbCI9PT10Lm9yaWVudCgpPyhuLnZlcnRpY2FsQWxpZ24oInRvcCIpLG4uaG9yaXpvbnRhbEFsaWduKCJjZW50ZXIiKSk6KG4uaG9yaXpvbnRhbEFsaWduKCJyaWdodCIpLG4udmVydGljYWxBbGlnbigiY2VudGVyIikpLGEuZm9yRWFjaChmdW5jdGlvbihyLGkpe28uc2F2ZSgpLG8uYmVnaW5QYXRoKCksby50cmFuc2xhdGUoci5vcmlnaW5bMF0sci5vcmlnaW5bMV0pLGUobikoLXIuaGVpZ2h0KSxuKFtyXSksby5maWxsU3R5bGU9QnQuZGFya0dyYXksdC5kZWNvcmF0ZSgpKG8sci5kLGkpLG8uZmlsbCgpLG8uY2xvc2VQYXRoKCksby5yZXN0b3JlKCl9KX07cmV0dXJuIFQoaSx0KSx3KGksbiwiY29udGV4dCIpLGl9LFh0PWZ1bmN0aW9uKCl7dmFyIHQ9ZS5zY2FsZUlkZW50aXR5KCksbj1lLnNjYWxlSWRlbnRpdHkoKSxyPWZ1bmN0aW9uKHQpe3JldHVybiB0LmhpZ2h9LGk9ZnVuY3Rpb24odCl7cmV0dXJuIHQubG93fSxvPWZ1bmN0aW9uKHQpe3JldHVybiB0LmNyb3NzfSx1PSJ2ZXJ0aWNhbCIsYT1OdCguNSksYz1mdW5jdGlvbigpe30sbD1mdW5jdGlvbigpe307cmV0dXJuIGwuZGVmaW5lZD1mdW5jdGlvbih0LG4pe3JldHVybiBtKGkscixvKSh0LG4pfSxsLmNvbXB1dGVCYXJXaWR0aD1mdW5jdGlvbihlKXt2YXIgcj0idmVydGljYWwiPT09dT90Om47cmV0dXJuIGEoZS5tYXAoZnVuY3Rpb24odCxuKXtyZXR1cm4gcihvKHQsbikpfSkpfSxsLnZhbHVlcz1mdW5jdGlvbihlLGEpe2lmKCJ2ZXJ0aWNhbCI9PT11KXt2YXIgYz1uKHIoZSxhKSk7cmV0dXJue29yaWdpbjpbdChvKGUsYSkpLGNdLGhpZ2g6MCxsb3c6bihpKGUsYSkpLWN9fXZhciBsPXQoaShlLGEpKTtyZXR1cm57b3JpZ2luOltsLG4obyhlLGEpKV0saGlnaDp0KHIoZSxhKSktbCxsb3c6MH19LGwuZGVjb3JhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sbCk6Y30sbC5vcmllbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sbCk6dX0sbC54U2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sbCk6dH0sbC55U2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sbCk6bn0sbC5sb3dWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUl0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksbCk6aX0sbC5oaWdoVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1JdChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGwpOnJ9LGwuY3Jvc3NWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPUl0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksbCk6b30sbC5iYXJXaWR0aD1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPUl0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksbCk6YX0sbC5kZWNvcmF0ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxsKTpjfSxsfSxadD1mdW5jdGlvbigpe3ZhciB0PVh0KCksbj1EdCgiZyIsImVycm9yLWJhciIpLGU9aHQoKS52YWx1ZSgwKSxyPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdC5zZWxlY3Rpb24/bi50cmFuc2l0aW9uKHQpOm59fSxpPWZ1bmN0aW9uKHQpe3JldHVybiJ0cmFuc2xhdGUoIit0Lm9yaWdpblswXSsiLCAiK3Qub3JpZ2luWzFdKyIpIn0sbz1mdW5jdGlvbihvKXtvLnNlbGVjdGlvbiYmbi50cmFuc2l0aW9uKG8pO3ZhciB1PXIobyk7by5lYWNoKGZ1bmN0aW9uKHIsbyxjKXt2YXIgbD1yLmZpbHRlcih0LmRlZmluZWQpLGY9bC5tYXAodC52YWx1ZXMpLGg9bihhLnNlbGVjdChjW29dKSxsKTtoLmVudGVyKCkuYXR0cigic3Ryb2tlIixCdC5ibGFjaykuYXR0cigiZmlsbCIsQnQuZ3JheSkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihuLGUpe3JldHVybiBpKHQudmFsdWVzKG4sZSkpKyIgc2NhbGUoMWUtNiwgMSkifSkuYXBwZW5kKCJwYXRoIik7dmFyIHM9dC5jb21wdXRlQmFyV2lkdGgobCk7ZS5vcmllbnQodC5vcmllbnQoKSkud2lkdGgocyksaC5lYWNoKGZ1bmN0aW9uKHQsbixyKXt2YXIgbz1mW25dO2UuaGlnaChvLmhpZ2gpLmxvdyhvLmxvdyksdShhLnNlbGVjdChyW25dKSkuYXR0cigidHJhbnNmb3JtIixpKG8pKyIgc2NhbGUoMSkiKS5zZWxlY3QoInBhdGgiKS5hdHRyKCJkIixlKFt0XSkpfSksdC5kZWNvcmF0ZSgpKGgscixvKX0pfTtyZXR1cm4gVChvLHQpLHcobyxuLCJrZXkiKSxvfSxLdD1mdW5jdGlvbigpe3ZhciB0PVh0KCksbj1odCgpLnZhbHVlKDApLGU9ZnVuY3Rpb24oZSl7dmFyIHI9ZS5maWx0ZXIodC5kZWZpbmVkKSxpPW4uY29udGV4dCgpLG89dC5jb21wdXRlQmFyV2lkdGgocik7bi5vcmllbnQodC5vcmllbnQoKSkud2lkdGgobyksci5mb3JFYWNoKGZ1bmN0aW9uKGUscil7aS5zYXZlKCk7dmFyIG89dC52YWx1ZXMoZSxyKTtpLnRyYW5zbGF0ZShvLm9yaWdpblswXSxvLm9yaWdpblsxXSksaS5iZWdpblBhdGgoKSxuLmhpZ2goby5oaWdoKS5sb3coby5sb3cpKFtlXSksaS5zdHJva2VTdHlsZT1CdC5ibGFjayxpLmZpbGxTdHlsZT1CdC5ncmF5LHQuZGVjb3JhdGUoKShpLGUsciksaS5zdHJva2UoKSxpLmZpbGwoKSxpLmNsb3NlUGF0aCgpLGkucmVzdG9yZSgpfSl9O3JldHVybiBUKGUsdCksdyhlLG4sImNvbnRleHQiKSxlfSwkdD1mdW5jdGlvbigpe3ZhciB0PVZ0KCksbj1jLmFyZWEoKS5kZWZpbmVkKHQuZGVmaW5lZCksZT1EdCgicGF0aCIsImFyZWEiKSxyPWZ1bmN0aW9uKHIpe3Iuc2VsZWN0aW9uJiZlLnRyYW5zaXRpb24ociksci5lYWNoKGZ1bmN0aW9uKHIsaSxvKXt2YXIgdT1yLm1hcCh0LnZhbHVlcyk7bi54KGZ1bmN0aW9uKHQsbil7cmV0dXJuIHVbbl0udHJhbnNwb3NlZFh9KS55KGZ1bmN0aW9uKHQsbil7cmV0dXJuIHVbbl0udHJhbnNwb3NlZFl9KTt2YXIgYz0idmVydGljYWwiPT09dC5vcmllbnQoKT8ieSI6IngiO25bYysiMCJdKGZ1bmN0aW9uKHQsbil7cmV0dXJuIHVbbl0ueTB9KSxuW2MrIjEiXShmdW5jdGlvbih0LG4pe3JldHVybiB1W25dLnl9KTt2YXIgbD1lKGEuc2VsZWN0KG9baV0pLFtyXSk7bC5hdHRyKCJkIixuKS5hdHRyKCJmaWxsIixCdC5ncmF5KSx0LmRlY29yYXRlKCkobCxyLGkpfSl9O3JldHVybiBUKHIsdCxTKCJiYXJXaWR0aCIpKSx3KHIsZSwia2V5IiksdyhyLG4sImN1cnZlIikscn0sSnQ9ZnVuY3Rpb24oKXt2YXIgdD1WdCgpLG49Yy5hcmVhKCkuZGVmaW5lZCh0LmRlZmluZWQpLGU9ZnVuY3Rpb24oZSl7dmFyIHI9bi5jb250ZXh0KCksaT1lLm1hcCh0LnZhbHVlcyk7bi54KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGlbbl0udHJhbnNwb3NlZFh9KS55KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGlbbl0udHJhbnNwb3NlZFl9KTt2YXIgbz0idmVydGljYWwiPT09dC5vcmllbnQoKT8ieSI6IngiO25bbysiMCJdKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGlbbl0ueTB9KSxuW28rIjEiXShmdW5jdGlvbih0LG4pe3JldHVybiBpW25dLnl9KSxyLmJlZ2luUGF0aCgpLG4oZSksci5maWxsU3R5bGU9QnQuZ3JheSx0LmRlY29yYXRlKCkocixlKSxyLmZpbGwoKSxyLmNsb3NlUGF0aCgpfTtyZXR1cm4gVChlLHQsUygiYmFyV2lkdGgiKSksdyhlLG4sImN1cnZlIiwiY29udGV4dCIpLGV9LHRuPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5zY2FsZUlkZW50aXR5KCksbj1lLnNjYWxlSWRlbnRpdHkoKSxyPWZ1bmN0aW9uKHQpe3JldHVybiB0LmRhdGV9LGk9ZnVuY3Rpb24odCl7cmV0dXJuIHQub3Blbn0sbz1mdW5jdGlvbih0KXtyZXR1cm4gdC5oaWdofSx1PWZ1bmN0aW9uKHQpe3JldHVybiB0Lmxvd30sYT1mdW5jdGlvbih0KXtyZXR1cm4gdC5jbG9zZX0sYz1OdCguNzUpLGw9ZnVuY3Rpb24oKXt9LGY9ZnVuY3Rpb24obixlKXtyZXR1cm4gdChyKG4sZSkpfSxoPWZ1bmN0aW9uKCl7fTtyZXR1cm4gaC53aWR0aD1mdW5jdGlvbih0KXtyZXR1cm4gYyh0Lm1hcChmKSl9LGguZGVmaW5lZD1mdW5jdGlvbih0LG4pe3JldHVybiBtKHIsaSx1LG8sYSkodCxuKX0saC52YWx1ZXM9ZnVuY3Rpb24odCxlKXt2YXIgcj1hKHQsZSksYz1pKHQsZSksbD0iIjtyZXR1cm4gcj5jP2w9InVwIjpyPGMmJihsPSJkb3duIikse2Nyb3NzOmYodCxlKSxvcGVuOm4oYyksaGlnaDpuKG8odCxlKSksbG93Om4odSh0LGUpKSxjbG9zZTpuKHIpLGRpcmVjdGlvbjpsfX0saC5kZWNvcmF0ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxoKTpsfSxoLnhTY2FsZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxoKTp0fSxoLnlTY2FsZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxoKTpufSxoLmNyb3NzVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0saCk6cn0saC5vcGVuVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0saCk6aX0saC5oaWdoVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0saCk6b30saC5sb3dWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxoKTp1fSxoLnlWYWx1ZT1oLmNsb3NlVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0saCk6YX0saC5iYXJXaWR0aD1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPUl0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksaCk6Y30saH0sbm49ZnVuY3Rpb24odCxuKXt2YXIgZT10bigpLHI9RHQoImciLG4pLGk9ZnVuY3Rpb24odCl7cmV0dXJuInRyYW5zbGF0ZSgiK3QuY3Jvc3MrIiwgIit0LmhpZ2grIikifSxvPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdC5zZWxlY3Rpb24/bi50cmFuc2l0aW9uKHQpOm59fSx1PWZ1bmN0aW9uKHUpe3Uuc2VsZWN0aW9uJiZyLnRyYW5zaXRpb24odSk7dmFyIGM9byh1KTt1LmVhY2goZnVuY3Rpb24obyx1LGwpe3ZhciBmPW8uZmlsdGVyKGUuZGVmaW5lZCk7dC53aWR0aChlLndpZHRoKGYpKTt2YXIgaD1yKGEuc2VsZWN0KGxbdV0pLGYpO2guZW50ZXIoKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGkoZS52YWx1ZXModCxuKSkrIiBzY2FsZSgxZS02LCAxKSJ9KS5hcHBlbmQoInBhdGgiKSxoLmVhY2goZnVuY3Rpb24ocixvLHUpe3ZhciBsPWUudmFsdWVzKHIsbyksZj0idXAiPT09bC5kaXJlY3Rpb24/QnQuZ3JlZW46QnQucmVkLGg9YyhhLnNlbGVjdCh1W29dKSkuYXR0cigiY2xhc3MiLG4rIiAiK2wuZGlyZWN0aW9uKS5hdHRyKCJzdHJva2UiLGYpLmF0dHIoImZpbGwiLGYpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oKXtyZXR1cm4gaShsKSsiIHNjYWxlKDEpIn0pO3QueCgwKS5vcGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGwub3Blbi1sLmhpZ2h9KS5oaWdoKDApLmxvdyhmdW5jdGlvbigpe3JldHVybiBsLmxvdy1sLmhpZ2h9KS5jbG9zZShmdW5jdGlvbigpe3JldHVybiBsLmNsb3NlLWwuaGlnaH0pLGguc2VsZWN0KCJwYXRoIikuYXR0cigiZCIsdChbcl0pKX0pLGUuZGVjb3JhdGUoKShoLG8sdSl9KX07cmV0dXJuIHcodSxyLCJrZXkiKSxUKHUsZSksdX0sZW49ZnVuY3Rpb24oKXtyZXR1cm4gbm4obHQoKSwiY2FuZGxlc3RpY2siKX0scm49ZnVuY3Rpb24odCl7dmFyIG49dG4oKSxlPWZ1bmN0aW9uKGUpe3ZhciByPWUuZmlsdGVyKG4uZGVmaW5lZCk7dC53aWR0aChuLndpZHRoKHIpKTt2YXIgaT10LmNvbnRleHQoKTtyLmZvckVhY2goZnVuY3Rpb24oZSxyKXtpLnNhdmUoKTt2YXIgbz1uLnZhbHVlcyhlLHIpO2kudHJhbnNsYXRlKG8uY3Jvc3Msby5oaWdoKSxpLmJlZ2luUGF0aCgpLHQueCgwKS5vcGVuKGZ1bmN0aW9uKCl7cmV0dXJuIG8ub3Blbi1vLmhpZ2h9KS5oaWdoKDApLmxvdyhmdW5jdGlvbigpe3JldHVybiBvLmxvdy1vLmhpZ2h9KS5jbG9zZShmdW5jdGlvbigpe3JldHVybiBvLmNsb3NlLW8uaGlnaH0pKFtlXSk7dmFyIHU9InVwIj09PW8uZGlyZWN0aW9uP0J0LmdyZWVuOkJ0LnJlZDtpLnN0cm9rZVN0eWxlPXUsaS5maWxsU3R5bGU9dSxuLmRlY29yYXRlKCkoaSxlLHIpLGkuc3Ryb2tlKCksaS5maWxsKCksaS5jbG9zZVBhdGgoKSxpLnJlc3RvcmUoKX0pfTtyZXR1cm4gdyhlLHQsImNvbnRleHQiKSxUKGUsbiksZX0sb249ZnVuY3Rpb24oKXtyZXR1cm4gcm4obHQoKSl9LHVuPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5zY2FsZUlkZW50aXR5KCksbj1lLnNjYWxlSWRlbnRpdHkoKSxyPWZ1bmN0aW9uKHQpe3JldHVybiB0LnVwcGVyUXVhcnRpbGV9LGk9ZnVuY3Rpb24odCl7cmV0dXJuIHQubG93ZXJRdWFydGlsZX0sbz1mdW5jdGlvbih0KXtyZXR1cm4gdC5oaWdofSx1PWZ1bmN0aW9uKHQpe3JldHVybiB0Lmxvd30sYT1mdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZX0sYz1mdW5jdGlvbih0KXtyZXR1cm4gdC5tZWRpYW59LGw9InZlcnRpY2FsIixmPU50KC41KSxoPWZ1bmN0aW9uKCl7fSxzPWZ1bmN0aW9uKCl7fTtyZXR1cm4gcy5kZWZpbmVkPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG0odSxvLGkscixhLGMpKHQsbil9LHMuY29tcHV0ZUJhcldpZHRoPWZ1bmN0aW9uKGUpe3ZhciByPSJ2ZXJ0aWNhbCI9PT1sP3Q6bjtyZXR1cm4gZihlLm1hcChmdW5jdGlvbih0LG4pe3JldHVybiByKGEodCxuKSl9KSl9LHMudmFsdWVzPWZ1bmN0aW9uKGUsZil7aWYoInZlcnRpY2FsIj09PWwpe3ZhciBoPW4obyhlLGYpKTtyZXR1cm57b3JpZ2luOlt0KGEoZSxmKSksaF0saGlnaDowLHVwcGVyUXVhcnRpbGU6bihyKGUsZikpLWgsbWVkaWFuOm4oYyhlLGYpKS1oLGxvd2VyUXVhcnRpbGU6bihpKGUsZikpLWgsbG93Om4odShlLGYpKS1ofX12YXIgcz10KHUoZSxmKSk7cmV0dXJue29yaWdpbjpbcyxuKGEoZSxmKSldLGhpZ2g6dChvKGUsZikpLXMsdXBwZXJRdWFydGlsZTp0KHIoZSxmKSktcyxtZWRpYW46dChjKGUsZikpLXMsbG93ZXJRdWFydGlsZTp0KGkoZSxmKSktcyxsb3c6MH19LHMuZGVjb3JhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0scyk6aH0scy5vcmllbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0scyk6bH0scy54U2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0scyk6dH0scy55U2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0scyk6bn0scy5sb3dlclF1YXJ0aWxlVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1JdChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLHMpOml9LHMudXBwZXJRdWFydGlsZVZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9SXQoYXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdKSxzKTpyfSxzLmxvd1ZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9SXQoYXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdKSxzKTp1fSxzLmhpZ2hWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPUl0KGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSkscyk6b30scy5jcm9zc1ZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9SXQoYXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdKSxzKTphfSxzLm1lZGlhblZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9SXQoYXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdKSxzKTpjfSxzLmJhcldpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9SXQoYXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdKSxzKTpmfSxzLmRlY29yYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLHMpOmh9LHN9LGFuPWZ1bmN0aW9uKCl7dmFyIHQ9dW4oKSxuPUR0KCJnIiwiYm94LXBsb3QiKSxlPWZ0KCkudmFsdWUoMCkscj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQuc2VsZWN0aW9uP24udHJhbnNpdGlvbih0KTpufX0saT1mdW5jdGlvbih0KXtyZXR1cm4idHJhbnNsYXRlKCIrdC5vcmlnaW5bMF0rIiwgIit0Lm9yaWdpblsxXSsiKSJ9LG89ZnVuY3Rpb24obyl7by5zZWxlY3Rpb24mJm4udHJhbnNpdGlvbihvKTt2YXIgdT1yKG8pO28uZWFjaChmdW5jdGlvbihyLG8sYyl7dmFyIGw9ci5maWx0ZXIodC5kZWZpbmVkKSxmPW4oYS5zZWxlY3QoY1tvXSksbCk7Zi5lbnRlcigpLmF0dHIoInN0cm9rZSIsQnQuYmxhY2spLmF0dHIoImZpbGwiLEJ0LmdyYXkpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obixlKXtyZXR1cm4gaSh0LnZhbHVlcyhuLGUpKSsiIHNjYWxlKDFlLTYsIDEpIn0pLmFwcGVuZCgicGF0aCIpO3ZhciBoPXQuY29tcHV0ZUJhcldpZHRoKGwpO2Uub3JpZW50KHQub3JpZW50KCkpLndpZHRoKGgpLGYuZWFjaChmdW5jdGlvbihuLHIsbyl7dmFyIGM9dC52YWx1ZXMobixyKTtlLm1lZGlhbihjLm1lZGlhbikudXBwZXJRdWFydGlsZShjLnVwcGVyUXVhcnRpbGUpLmxvd2VyUXVhcnRpbGUoYy5sb3dlclF1YXJ0aWxlKS5oaWdoKGMuaGlnaCkubG93KGMubG93KSx1KGEuc2VsZWN0KG9bcl0pKS5hdHRyKCJ0cmFuc2Zvcm0iLGkoYykpLnNlbGVjdCgicGF0aCIpLmF0dHIoImQiLGUoW25dKSl9KSx0LmRlY29yYXRlKCkoZixyLG8pfSl9O3JldHVybiBUKG8sdCksdyhvLG4sImtleSIpLHcobyxlLCJjYXAiKSxvfSxjbj1mdW5jdGlvbigpe3ZhciB0PXVuKCksbj1mdCgpLnZhbHVlKDApLGU9ZnVuY3Rpb24oZSl7dmFyIHI9ZS5maWx0ZXIodC5kZWZpbmVkKSxpPW4uY29udGV4dCgpLG89dC5jb21wdXRlQmFyV2lkdGgocik7bi5vcmllbnQodC5vcmllbnQoKSkud2lkdGgobyksci5mb3JFYWNoKGZ1bmN0aW9uKGUscil7aS5zYXZlKCk7dmFyIG89dC52YWx1ZXMoZSxyKTtpLnRyYW5zbGF0ZShvLm9yaWdpblswXSxvLm9yaWdpblsxXSksaS5iZWdpblBhdGgoKSxuLm1lZGlhbihvLm1lZGlhbikudXBwZXJRdWFydGlsZShvLnVwcGVyUXVhcnRpbGUpLmxvd2VyUXVhcnRpbGUoby5sb3dlclF1YXJ0aWxlKS5oaWdoKG8uaGlnaCkubG93KG8ubG93KShbZV0pLGkuc3Ryb2tlU3R5bGU9QnQuYmxhY2ssaS5maWxsU3R5bGU9QnQuZ3JheSx0LmRlY29yYXRlKCkoaSxlLHIpLGkuc3Ryb2tlKCksaS5maWxsKCksaS5jbG9zZVBhdGgoKSxpLnJlc3RvcmUoKX0pfTtyZXR1cm4gVChlLHQpLHcoZSxuLCJjYXAiLCJjb250ZXh0IiksZX0sbG49ZnVuY3Rpb24oKXtyZXR1cm4gbm4oYXQoKSwib2hsYyIpfSxmbj1mdW5jdGlvbigpe3JldHVybiBybihhdCgpKX0saG49ZnVuY3Rpb24oKXt2YXIgdD1mdW5jdGlvbigpe30sbj1lLnNjYWxlSWRlbnRpdHkoKSxyPWUuc2NhbGVJZGVudGl0eSgpLGk9W10sbz1mdW5jdGlvbih0KXtyZXR1cm4gdH0sdT1mdW5jdGlvbih0LG4pe3JldHVybiBufSxhPWZ1bmN0aW9uKCl7fTtyZXR1cm4gYS5tYXBwaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGEpOm99LGEua2V5PWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGEpOnV9LGEuc2VyaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGEpOml9LGEueFNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGEpOm59LGEueVNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGEpOnJ9LGEuZGVjb3JhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sYSk6dH0sYX0sc249ZnVuY3Rpb24oKXt2YXIgdD1obigpLG49RHQoImciKSxlPUR0KCJnIiwibXVsdGkiKSxyPWZ1bmN0aW9uKHIpe3Iuc2VsZWN0aW9uJiYoZS50cmFuc2l0aW9uKHIpLG4udHJhbnNpdGlvbihyKSk7dmFyIGk9dC5tYXBwaW5nKCksbz10LnNlcmllcygpLHU9dC54U2NhbGUoKSxjPXQueVNjYWxlKCk7ci5lYWNoKGZ1bmN0aW9uKHIsbCxmKXt2YXIgaD1lKGEuc2VsZWN0KGZbbF0pLG8pO2guZWFjaChmdW5jdGlvbih0LGUsbCl7dC54U2NhbGUodSkueVNjYWxlKGMpO3ZhciBmPWkocixlLG8pLGg9bihhLnNlbGVjdChsW2VdKSxbZl0pO2guY2FsbCh0KX0pO3ZhciBzPWguc2VsZWN0aW9uP2guc2VsZWN0aW9uKCk6aDtzLm9yZGVyKCksdC5kZWNvcmF0ZSgpKGgscixsKX0pfTtyZXR1cm4gVChyLHQpLHcocixlLCJrZXkiKSxyfSxkbj1mdW5jdGlvbigpe3ZhciB0PW51bGwsbj1obigpLGU9ZnVuY3Rpb24oZSl7dmFyIHI9bi5tYXBwaW5nKCksaT1uLnNlcmllcygpLG89bi54U2NhbGUoKSx1PW4ueVNjYWxlKCk7aS5mb3JFYWNoKGZ1bmN0aW9uKGEsYyl7dmFyIGw9cihlLGMsaSk7YS5jb250ZXh0KHQpLnhTY2FsZShvKS55U2NhbGUodSk7dmFyIGY9YS5kZWNvcmF0ZSgpO2EuZGVjb3JhdGUoZnVuY3Rpb24odCxyLGkpe24uZGVjb3JhdGUoKSh0LGUsYyksZih0LHIsaSl9KSxhKGwpLGEuZGVjb3JhdGUoZil9KX07cmV0dXJuIGUuY29udGV4dD1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxlKTp0fSxUKGUsbiksZX0sZ249ZnVuY3Rpb24odCl7dmFyIHI9TnQoLjc1KSxpPWZ1bmN0aW9uKCl7fSxvPWUuc2NhbGVMaW5lYXIoKSx1PWUuc2NhbGVCYW5kKCksYT1mdW5jdGlvbigpe30sYz1mdW5jdGlvbihuKXtpZighbi5sZW5ndGgpcmV0dXJuIDA7dmFyIGU9blswXSxpPXQuY3Jvc3NWYWx1ZSgpLHU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbyhpKHQsbikpfSxhPXIoZS5tYXAodSkpO3JldHVybiBhfTtyZXR1cm4gYS5jb25maWd1cmVPZmZzZXRTY2FsZT1mdW5jdGlvbihlKXt2YXIgcj1jKGUpLGk9ci8yO3UuZG9tYWluKG4ucmFuZ2UoMCxlLmxlbmd0aCkpLnJhbmdlKFstaSxpXSksdC5iYXJXaWR0aCYmdC5iYXJXaWR0aCh1LmJhbmR3aWR0aCgpKX0sYS5vZmZzZXRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB1fSxhLmdyb3VwV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1JdChhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGEpOnJ9LGEuZGVjb3JhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sYSk6aX0sYS54U2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sYSk6b30sVChhLHUsayh7cGFkZGluZ0lubmVyOiJzdWJQYWRkaW5nIn0pKSxhfSx2bj1mdW5jdGlvbih0KXt2YXIgbj1nbih0KSxlPUR0KCJnIiwiZ3JvdXBlZCIpLHI9ZnVuY3Rpb24ocil7ci5zZWxlY3Rpb24mJmUudHJhbnNpdGlvbihyKSxyLmVhY2goZnVuY3Rpb24ocixpLG8pe24uY29uZmlndXJlT2Zmc2V0U2NhbGUocik7dmFyIHU9ZShhLnNlbGVjdChvW2ldKSxyKTt1LmVudGVyKCkuYXBwZW5kKCJnIiksdS5zZWxlY3QoImciKS5lYWNoKGZ1bmN0aW9uKGUscixpKXt2YXIgbz1hLnNlbGVjdChpW3JdKSx1PWZ1bmN0aW9uKHQpe3JldHVybiBuLnhTY2FsZSgpKHQpK24ub2Zmc2V0U2NhbGUoKShyKStuLm9mZnNldFNjYWxlKCkuYmFuZHdpZHRoKCkvMn07dC54U2NhbGUodSksdC5kZWNvcmF0ZShmdW5jdGlvbih0LGUpe3JldHVybiBuLmRlY29yYXRlKCkodCxlLHIpfSksby5jYWxsKHQpfSl9KX07cmV0dXJuIFQocix0LFMoImRlY29yYXRlIiwieFNjYWxlIikpLFQocixuLFMoImNvbmZpZ3VyZU9mZnNldFNjYWxlIiwiY29uZmlndXJlT2Zmc2V0IikpLHJ9LHBuPWZ1bmN0aW9uKHQpe3ZhciBuPWduKHQpLGU9ZnVuY3Rpb24oZSl7bi5jb25maWd1cmVPZmZzZXRTY2FsZShlKSxlLmZvckVhY2goZnVuY3Rpb24oZSxyKXt2YXIgaT1mdW5jdGlvbih0KXtyZXR1cm4gbi54U2NhbGUoKSh0KStuLm9mZnNldFNjYWxlKCkocikrbi5vZmZzZXRTY2FsZSgpLmJhbmR3aWR0aCgpLzJ9O3QueFNjYWxlKGkpLHQuZGVjb3JhdGUoZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5kZWNvcmF0ZSgpKHQsZSxyKX0pLHQoZSl9KX07cmV0dXJuIFQoZSx0LFMoImRlY29yYXRlIiwieFNjYWxlIikpLFQoZSxuLFMoImNvbmZpZ3VyZU9mZnNldFNjYWxlIiwiY29uZmlndXJlT2Zmc2V0IikpLGV9LG1uPWZ1bmN0aW9uKCl7dmFyIHQ9InZlcnRpY2FsIixuPXF0KCksZT1zbigpLHI9ZnVuY3Rpb24ocil7cmV0dXJuIHIuZWFjaChmdW5jdGlvbihyLGksbyl7InZlcnRpY2FsIj09PXQ/ZS5zZXJpZXMoclswXS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIG59KSkubWFwcGluZyhmdW5jdGlvbih0LG4pe3JldHVybiB0Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdFtuXX0pfSk6ZS5zZXJpZXMoci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIG59KSkubWFwcGluZyhmdW5jdGlvbih0LG4pe3JldHVybiB0W25dfSksYS5zZWxlY3Qob1tpXSkuY2FsbChlKX0pfTtyZXR1cm4gci5zZXJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0scik6bn0sci5vcmllbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0scik6dH0sVChyLGUsUygic2VyaWVzIiwibWFwcGluZyIpKSxyfSx5bj1mdW5jdGlvbigpe3ZhciB0PSJ2ZXJ0aWNhbCIsbj1XdCgpLGU9ZG4oKSxyPWZ1bmN0aW9uKHIpeyJ2ZXJ0aWNhbCI9PT10P2Uuc2VyaWVzKHJbMF0ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBufSkpLm1hcHBpbmcoZnVuY3Rpb24odCxuKXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHRbbl19KX0pOmUuc2VyaWVzKHIubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBufSkpLm1hcHBpbmcoZnVuY3Rpb24odCxuKXtyZXR1cm4gdFtuXX0pLGUocil9O3JldHVybiByLnNlcmllcz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxyKTpufSxyLm9yaWVudD1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxyKTp0fSxUKHIsZSxTKCJzZXJpZXMiLCJtYXBwaW5nIikpLHJ9LGJuPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdH19LHduPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5zY2FsZUlkZW50aXR5KCksbj1lLnNjYWxlSWRlbnRpdHkoKSxyPSJob3Jpem9udGFsIixpPWZ1bmN0aW9uKHQpe3JldHVybiB0LmZyb219LG89ZnVuY3Rpb24odCl7cmV0dXJuIHQudG99LHU9ZnVuY3Rpb24oKXt9LGM9RHQoImciLCJhbm5vdGF0aW9uLWJhbmQiKSxsPWN0KCkuaG9yaXpvbnRhbEFsaWduKCJjZW50ZXIiKS52ZXJ0aWNhbEFsaWduKCJjZW50ZXIiKS54KDApLnkoMCksZj1mdW5jdGlvbihlKXtpZihlLnNlbGVjdGlvbiYmYy50cmFuc2l0aW9uKGUpLCJob3Jpem9udGFsIiE9PXImJiJ2ZXJ0aWNhbCIhPT1yKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBvcmllbnRhdGlvbiIpO3ZhciBmPSJob3Jpem9udGFsIj09PXIsaD1mP2Z1bmN0aW9uKHQsbil7cmV0dXJuInRyYW5zbGF0ZSgiK3QrIiwgIituKyIpIn06ZnVuY3Rpb24odCxuKXtyZXR1cm4idHJhbnNsYXRlKCIrbisiLCAiK3QrIikifSxzPWY/dDpuLGQ9Zj9uOnQsZz1zLnJhbmdlKCksdj1nWzFdLWdbMF0scD1mPyJoZWlnaHQiOiJ3aWR0aCIsbT1mPyJ3aWR0aCI6ImhlaWdodCIseT1mdW5jdGlvbigpe3JldHVybiBoKChnWzFdK2dbMF0pLzIsKGQoby5hcHBseSh2b2lkIDAsYXJndW1lbnRzKSkrZChpLmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpKSkvMil9O2xbbV0odiksbFtwXShmdW5jdGlvbigpe3JldHVybiBkKG8uYXBwbHkodm9pZCAwLGFyZ3VtZW50cykpLWQoaS5hcHBseSh2b2lkIDAsYXJndW1lbnRzKSl9KSxlLmVhY2goZnVuY3Rpb24odCxuLGUpe3ZhciBpPWMoYS5zZWxlY3QoZVtuXSksdCk7aS5lbnRlcigpLmF0dHIoInRyYW5zZm9ybSIseSkuYXBwZW5kKCJwYXRoIikuY2xhc3NlZCgiYmFuZCIsITApLGkuYXR0cigiY2xhc3MiLCJhbm5vdGF0aW9uLWJhbmQgIityKS5hdHRyKCJ0cmFuc2Zvcm0iLHkpLnNlbGVjdCgicGF0aCIpLmF0dHIoImQiLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGwoW3RdLG4pfSksdShpLHQsbil9KX07cmV0dXJuIGYueFNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGYpOnR9LGYueVNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGYpOm59LGYub3JpZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGYpOnJ9LGYuZGVjb3JhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sZik6dX0sZi5mcm9tVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1ibihhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGYpOml9LGYudG9WYWx1ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWJuKGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksZik6b30sZn0seG49ZnVuY3Rpb24oKXt2YXIgdD1lLnNjYWxlSWRlbnRpdHkoKSxuPWUuc2NhbGVJZGVudGl0eSgpLHI9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGk9cixvPWZ1bmN0aW9uKCl7fSx1PSJob3Jpem9udGFsIixjPUR0KCJnIiwiYW5ub3RhdGlvbi1saW5lIiksbD1mdW5jdGlvbihlKXtpZihlLnNlbGVjdGlvbiYmYy50cmFuc2l0aW9uKGUpLCJob3Jpem9udGFsIiE9PXUmJiJ2ZXJ0aWNhbCIhPT11KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBvcmllbnRhdGlvbiIpO3ZhciBsPSJob3Jpem9udGFsIj09PXUsZj1sP2Z1bmN0aW9uKHQsbil7cmV0dXJuInRyYW5zbGF0ZSgiK3QrIiwgIituKyIpIn06ZnVuY3Rpb24odCxuKXtyZXR1cm4idHJhbnNsYXRlKCIrbisiLCAiK3QrIikifSxoPWw/IngyIjoieTIiLHM9bD90Om4sZD1sP246dCxnPWw/ImxlZnQtaGFuZGxlIjoiYm90dG9tLWhhbmRsZSIsdj1sPyJyaWdodC1oYW5kbGUiOiJ0b3AtaGFuZGxlIixwPWw/IjkiOiIwIixtPWw/IjAiOiI5Iix5PWw/IjAuMzJlbSI6IjAuNzFlbSIsYj1sPyJzdGFydCI6Im1pZGRsZSIsdz1zLnJhbmdlKCkseD1mdW5jdGlvbigpe3JldHVybiBmKHdbMF0sZChyLmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpKSl9LFQ9d1sxXS13WzBdO2UuZWFjaChmdW5jdGlvbih0LG4sZSl7dmFyIHI9YyhhLnNlbGVjdChlW25dKSx0KSxsPXIuZW50ZXIoKS5hdHRyKCJ0cmFuc2Zvcm0iLHgpLnN0eWxlKCJzdHJva2UiLCIjYmJiIik7bC5hcHBlbmQoImxpbmUiKS5hdHRyKGgsVCksbC5hcHBlbmQoImciKS5jbGFzc2VkKGcsITApLnN0eWxlKCJzdHJva2UiLCJub25lIiksbC5hcHBlbmQoImciKS5jbGFzc2VkKHYsITApLnN0eWxlKCJzdHJva2UiLCJub25lIikuYXR0cigidHJhbnNmb3JtIixmKFQsMCkpLmFwcGVuZCgidGV4dCIpLmF0dHIoInRleHQtYW5jaG9yIixiKS5hdHRyKCJ4IixwKS5hdHRyKCJ5IixtKS5hdHRyKCJkeSIseSksci5hdHRyKCJjbGFzcyIsImFubm90YXRpb24tbGluZSAiK3UpLHIuYXR0cigidHJhbnNmb3JtIix4KSxyLnNlbGVjdCgibGluZSIpLmF0dHIoaCxUKSxyLnNlbGVjdCgiZy4iK3YpLmF0dHIoInRyYW5zZm9ybSIsZihULDApKSxyLnNlbGVjdCgidGV4dCIpLnRleHQoaSksbyhyLHQsbil9KX07cmV0dXJuIGwueFNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGwpOnR9LGwueVNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGwpOm59LGwudmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1ibihhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGwpOnJ9LGwubGFiZWw9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1ibihhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGwpOml9LGwuZGVjb3JhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sbCk6b30sbC5vcmllbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sbCk6dX0sbH0sVG49ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKGUubGVuZ3RoPD0xKXJldHVybiAxMDtlLnNvcnQoKTt2YXIgcj1uLnBhaXJzKGUpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5hYnModFswXS10WzFdKX0pLGk9bi5taW4ocik7cmV0dXJuIHQqaX19LEVuPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdH19LFNuPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5zY2FsZUlkZW50aXR5KCksbj1lLnNjYWxlSWRlbnRpdHkoKSxyPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGk9ZnVuY3Rpb24odCl7cmV0dXJuIHQueH0sbz1mdW5jdGlvbih0KXtyZXR1cm4gdC55fSx1PWZ1bmN0aW9uKCl7fSxhPVRuKC43NSksYz0idmVydGljYWwiLGw9ZnVuY3Rpb24oKXt9O3JldHVybiBsLmRlZmluZWQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4geShyLGksbykodCxuKX0sbC52YWx1ZXM9ZnVuY3Rpb24oZSx1KXtpZigidmVydGljYWwiPT09Yyl7dmFyIGE9bihvKGUsdSkpLGw9bihyKGUsdSkpLGY9dChpKGUsdSkpO3JldHVybntkOmUseDpmLHk6YSx5MDpsLGhlaWdodDphLWwsb3JpZ2luOltmLGFdLGJhc2VPcmlnaW46W2YsbF0sdHJhbnNwb3NlZFg6Zix0cmFuc3Bvc2VkWTphfX12YXIgaD10KG8oZSx1KSkscz10KHIoZSx1KSksZD1uKGkoZSx1KSk7cmV0dXJue2Q6ZSx4OmQseTpoLHkwOnMsaGVpZ2h0OmgtcyxvcmlnaW46W2gsZF0sYmFzZU9yaWdpbjpbcyxkXSx0cmFuc3Bvc2VkWDpoLHRyYW5zcG9zZWRZOmR9fSxsLmRlY29yYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGwpOnV9LGwueFNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGwpOnR9LGwueVNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGwpOm59LGwuYmFzZVZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9RW4oYXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdKSxsKTpyfSxsLmNyb3NzVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1Fbihhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLGwpOml9LGwubWFpblZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89RW4oYXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdKSxsKTpvfSxsLmJhcldpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9RW4oYXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdKSxsKTphfSxsLm9yaWVudD1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxsKTpjfSxsfSxNbj0iI2M2MCIsa249IiM2YzAiLExuPSIjMDAwIixBbj0iI2RkZCIsSG49IiM5OTkiLE9uPXtyZWQ6TW4sZ3JlZW46a24sYmxhY2s6TG4sZ3JheTpBbixkYXJrR3JheTpIbn0sX249ZnVuY3Rpb24oKXt2YXIgdD1jLnN5bWJvbCgpLG49U24oKSxlPUR0KCJnIiwicG9pbnQiKSxyPWZ1bmN0aW9uKHQpe3JldHVybiJ0cmFuc2xhdGUoIit0WzBdKyIsICIrdFsxXSsiKSJ9LGk9ZnVuY3Rpb24oaSl7aS5zZWxlY3Rpb24mJmUudHJhbnNpdGlvbihpKSxpLmVhY2goZnVuY3Rpb24oaSxvLHUpe3ZhciBjPWkuZmlsdGVyKG4uZGVmaW5lZCksbD1lKGEuc2VsZWN0KHVbb10pLGMpO2wuZW50ZXIoKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIobi52YWx1ZXModCxlKS5vcmlnaW4pfSkuYXR0cigiZmlsbCIsT24uZ3JheSkuYXR0cigic3Ryb2tlIixPbi5ibGFjaykuYXBwZW5kKCJwYXRoIiksbC5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIobi52YWx1ZXModCxlKS5vcmlnaW4pfSkuc2VsZWN0KCJwYXRoIikuYXR0cigiZCIsdCksbi5kZWNvcmF0ZSgpKGwsaSxvKX0pfTtyZXR1cm4gVChpLG4sUygiYmFzZVZhbHVlIiwiYmFyV2lkdGgiKSksdyhpLGUsImtleSIpLHcoaSx0LCJ0eXBlIiwic2l6ZSIpLGl9LENuPWZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24oKXt9LG49ZS5zY2FsZUlkZW50aXR5KCkscj1lLnNjYWxlSWRlbnRpdHkoKSxpPVtdLG89ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbn0sYT1mdW5jdGlvbigpe307cmV0dXJuIGEubWFwcGluZz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxhKTpvfSxhLmtleT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxhKTp1fSxhLnNlcmllcz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxhKTppfSxhLnhTY2FsZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxhKTpufSxhLnlTY2FsZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxhKTpyfSxhLmRlY29yYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGEpOnR9LGF9LERuPWZ1bmN0aW9uKCl7dmFyIHQ9Q24oKSxuPUR0KCJnIiksZT1EdCgiZyIsIm11bHRpIikscj1mdW5jdGlvbihyKXtyLnNlbGVjdGlvbiYmKGUudHJhbnNpdGlvbihyKSxuLnRyYW5zaXRpb24ocikpO3ZhciBpPXQubWFwcGluZygpLG89dC5zZXJpZXMoKSx1PXQueFNjYWxlKCksYz10LnlTY2FsZSgpO3IuZWFjaChmdW5jdGlvbihyLGwsZil7dmFyIGg9ZShhLnNlbGVjdChmW2xdKSxvKTtoLmVhY2goZnVuY3Rpb24odCxlLG8pe3QueFNjYWxlKHUpLnlTY2FsZShjKTt2YXIgbD1pKHIsdCxlKSxmPW4oYS5zZWxlY3Qob1tlXSksW2xdKTtmLmNhbGwodCl9KTt2YXIgcz1oLnNlbGVjdGlvbj9oLnNlbGVjdGlvbigpOmg7cy5vcmRlcigpLHQuZGVjb3JhdGUoKShoLHIsbCl9KX07cmV0dXJuIFQocix0KSx3KHIsZSwia2V5Iikscn0sTm49ZnVuY3Rpb24oKXt2YXIgdD1mdW5jdGlvbih0KXtyZXR1cm4gdC54fSxuPWZ1bmN0aW9uKHQpe3JldHVybiB0Lnl9LHI9ZS5zY2FsZUlkZW50aXR5KCksaT1lLnNjYWxlSWRlbnRpdHkoKSxvPWZ1bmN0aW9uKCl7fSx1PUR0KCJnIiwiYW5ub3RhdGlvbi1jcm9zc2hhaXIiKSxjPV9uKCksbD14bigpLGY9eG4oKS5vcmllbnQoInZlcnRpY2FsIiksaD1lLnNjYWxlSWRlbnRpdHkoKSxzPWUuc2NhbGVJZGVudGl0eSgpLGQ9RG4oKS5zZXJpZXMoW2wsZixjXSkueFNjYWxlKGgpLnlTY2FsZShzKS5tYXBwaW5nKGZ1bmN0aW9uKHQpe3JldHVyblt0XX0pLGc9ZnVuY3Rpb24oZSl7ZS5zZWxlY3Rpb24mJnUudHJhbnNpdGlvbihlKSxlLmVhY2goZnVuY3Rpb24oZSxnLHYpe3ZhciBwPXUoYS5zZWxlY3QodltnXSksZSk7cC5lbnRlcigpLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKSxoLnJhbmdlKHIucmFuZ2UoKSkscy5yYW5nZShpLnJhbmdlKCkpLGMuY3Jvc3NWYWx1ZSh0KS5tYWluVmFsdWUobiksbC52YWx1ZShuKSxmLnZhbHVlKHQpLHAuY2FsbChkKSxvKHAsZSxnKX0pfTtnLng9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sZyk6dH0sZy55PWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGcpOm59LGcueFNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGcpOnJ9LGcueVNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGcpOml9LGcuZGVjb3JhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sZyk6b307dmFyIHY9TSgibGFiZWwiKTtyZXR1cm4gVChnLGwsdixBKCJ5IikpLFQoZyxmLHYsQSgieCIpKSxnfSxJbj1mdW5jdGlvbigpe3ZhciB0PWUuc2NhbGVJZGVudGl0eSgpLG49MTAscj1udWxsLGk9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9cj9yOnQudGlja3M/dC50aWNrcyhuKTp0LmRvbWFpbigpfTtyZXR1cm4gaS5zY2FsZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxpKTp0fSxpLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGkpOm59LGkudGlja1ZhbHVlcz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxpKTpyfSxpfSxWbj1mdW5jdGlvbih0KXtyZXR1cm4gdH0sUG49ZnVuY3Rpb24oKXt2YXIgdD1mdW5jdGlvbigpe30sbj1mdW5jdGlvbigpe30sZT1JbigpLHI9SW4oKSxpPUR0KCJsaW5lIiwiZ3JpZGxpbmUteSIpLmtleShWbiksbz1EdCgibGluZSIsImdyaWRsaW5lLXgiKS5rZXkoVm4pLHU9ZnVuY3Rpb24odSl7dS5zZWxlY3Rpb24mJihpLnRyYW5zaXRpb24odSksby50cmFuc2l0aW9uKHUpKSx1LmVhY2goZnVuY3Rpb24odSxjLGwpe3ZhciBmPWxbY10saD1hLnNlbGVjdChsW2NdKSxzPWUuc2NhbGUoKSxkPXIuc2NhbGUoKSxnPWYuX194X3NjYWxlX198fHM7Zi5fX3hfc2NhbGVfXz1zLmNvcHkoKTt2YXIgdj1lKCkscD1pKGgsdik7cC5hdHRyKCJ4MSIscykuYXR0cigieDIiLHMpLmF0dHIoInkxIixkLnJhbmdlKClbMF0pLmF0dHIoInkyIixkLnJhbmdlKClbMV0pLmF0dHIoInN0cm9rZSIsIiNiYmIiKSxwLmVudGVyKCkuYXR0cigieDEiLGcpLmF0dHIoIngyIixnKS5hdHRyKCJ5MSIsZC5yYW5nZSgpWzBdKS5hdHRyKCJ5MiIsZC5yYW5nZSgpWzFdKSxwLmV4aXQoKS5hdHRyKCJ4MSIscykuYXR0cigieDIiLHMpLHQocCx2LGMpO3ZhciBtPWYuX195X3NjYWxlX198fGQ7Zi5fX3lfc2NhbGVfXz1kLmNvcHkoKTt2YXIgeT1yKCksYj1vKGgseSk7Yi5hdHRyKCJ5MSIsZCkuYXR0cigieTIiLGQpLmF0dHIoIngxIixzLnJhbmdlKClbMF0pLmF0dHIoIngyIixzLnJhbmdlKClbMV0pLmF0dHIoInN0cm9rZSIsIiNiYmIiKSxiLmVudGVyKCkuYXR0cigieTEiLG0pLmF0dHIoInkyIixtKS5hdHRyKCJ4MSIscy5yYW5nZSgpWzBdKS5hdHRyKCJ4MiIscy5yYW5nZSgpWzFdKSxiLmV4aXQoKS5hdHRyKCJ5MSIsZCkuYXR0cigieTIiLGQpLG4oYix5LGMpfSl9O3JldHVybiB1LnlEZWNvcmF0ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSx1KTpufSx1LnhEZWNvcmF0ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSx1KTp0fSxUKHUsaSxrKHtrZXk6InhLZXkifSkpLFQodSxvLGsoe2tleToieUtleSJ9KSksVCh1LGUsQSgieCIpKSxUKHUscixBKCJ5IikpLHV9LHpuPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxSbj1mdW5jdGlvbiB0KG4sZSl7dmFyIHI9WzEwXSxpPW51bGwsbz1mdW5jdGlvbigpe30sdT1udWxsLGw9NixmPTYsaD0zLHM9Yy5saW5lKCksZD1EdCgiZyIsInRpY2siKS5rZXkoem4pLGc9RHQoInBhdGgiLCJkb21haW4iKSx2PWZ1bmN0aW9uKHQsbil7dmFyIGU9MDtyZXR1cm4gdC5iYW5kd2lkdGgmJihlPXQuYmFuZHdpZHRoKCkvMix0LnJvdW5kKCkmJihlPU1hdGgucm91bmQoZSkpKSxmdW5jdGlvbihyKXtyZXR1cm4gbih0KHIpK2UsMCl9fSxwPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHkoKT8idHJhbnNsYXRlKCIrbisiLCAiK3QrIikiOiJ0cmFuc2xhdGUoIit0KyIsICIrbisiKSJ9LG09ZnVuY3Rpb24odCl7cmV0dXJuIHkoKT90Lm1hcChmdW5jdGlvbih0KXtyZXR1cm5bdFsxXSx0WzBdXX0pOnR9LHk9ZnVuY3Rpb24oKXtyZXR1cm4ibGVmdCI9PT1ufHwicmlnaHQiPT09bn0sYj1mdW5jdGlvbih0LG4scil7cmV0dXJuIGVbdF0/ZVt0XS5hcHBseShlLG4pOnJ9LHQ9ZnVuY3Rpb24odCl7dC5zZWxlY3Rpb24mJihkLnRyYW5zaXRpb24odCksZy50cmFuc2l0aW9uKHQpKSx0LmVhY2goZnVuY3Rpb24odCxjLHcpe3ZhciB4PXdbY10sVD1hLnNlbGVjdCh4KTt4Ll9fc2NhbGVfX3x8VC5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoImZvbnQtc2l6ZSIsMTApLmF0dHIoImZvbnQtZmFtaWx5Iiwic2Fucy1zZXJpZiIpLmF0dHIoInRleHQtYW5jaG9yIiwicmlnaHQiPT09bj8ic3RhcnQiOiJsZWZ0Ij09PW4/ImVuZCI6Im1pZGRsZSIpO3ZhciBFPXguX19zY2FsZV9ffHxlOw0KeC5fX3NjYWxlX189ZS5jb3B5KCk7dmFyIFM9bnVsbD09aT9iKCJ0aWNrcyIscixlLmRvbWFpbigpKTppLE09bnVsbD09dT9iKCJ0aWNrRm9ybWF0IixyLHpuKTp1LGs9ImJvdHRvbSI9PT1ufHwicmlnaHQiPT09bj8xOi0xLEw9ZS5yYW5nZSgpLEE9bShbW0xbMF0saypsXSxbTFswXSwwXSxbTFsxXSwwXSxbTFsxXSxrKmxdXSksSD1nKFQsW3RdKTtILmF0dHIoImQiLHMoQSkpLmF0dHIoInN0cm9rZSIsIiMwMDAiKTt2YXIgTz1kKFQsUyk7Ty5lbnRlcigpLmF0dHIoInRyYW5zZm9ybSIsdihFLHApKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJzdHJva2UiLCIjMDAwIik7dmFyIF89ayooZitoKTtPLmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuYXR0cigidHJhbnNmb3JtIixwKDAsXykpLmF0dHIoImZpbGwiLCIjMDAwIiksTy5leGl0KCkuYXR0cigidHJhbnNmb3JtIix2KGUscCkpLE8uc2VsZWN0KCJwYXRoIikuYXR0cigiZCIsZnVuY3Rpb24odCl7cmV0dXJuIHMobShbWzAsMF0sWzAsaypmXV0pKX0pLE8uc2VsZWN0KCJ0ZXh0IikuYXR0cigidHJhbnNmb3JtIixwKDAsXykpLmF0dHIoImR5IixmdW5jdGlvbigpe3ZhciB0PSIwZW0iO3JldHVybiB5KCk/dD0iMC4zMmVtIjoiYm90dG9tIj09PW4mJih0PSIwLjcxZW0iKSx0fSkudGV4dChNKSxPLmF0dHIoInRyYW5zZm9ybSIsdihlLHApKSxvKE8sdCxjKX0pfTtyZXR1cm4gdC50aWNrRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLHQpOnV9LHQudGlja1NpemU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1sPU51bWJlcihhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLHQpOmZ9LHQudGlja1NpemVJbm5lcj1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPU51bWJlcihhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLHQpOmZ9LHQudGlja1NpemVPdXRlcj1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPU51bWJlcihhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pLHQpOmx9LHQudGlja1BhZGRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sdCk6aH0sdC5kZWNvcmF0ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSx0KTpvfSx0LnNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLHQpOmV9LHQudGlja3M9ZnVuY3Rpb24oKXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxlPUFycmF5KG4pLGk9MDtpPG47aSsrKWVbaV09YXJndW1lbnRzW2ldO3JldHVybiByPVtdLmNvbmNhdChlKSx0fSx0LnRpY2tBcmd1bWVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT0oYXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdKT9bXTpbXS5jb25jYXQoUihhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pKSx0KTpyLnNsaWNlKCl9LHQudGlja1ZhbHVlcz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PShhcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0pP1tdOltdLmNvbmNhdChSKGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSkpLHQpOmkuc2xpY2UoKX0sdH0sRm49ZnVuY3Rpb24odCl7cmV0dXJuIFJuKCJ0b3AiLHQpfSxVbj1mdW5jdGlvbih0KXtyZXR1cm4gUm4oImJvdHRvbSIsdCl9LEJuPWZ1bmN0aW9uKHQpe3JldHVybiBSbigibGVmdCIsdCl9LHFuPWZ1bmN0aW9uKHQpe3JldHVybiBSbigicmlnaHQiLHQpfTshZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKCl7dmFyIHQ9ay5zcGxpY2UoMCxrLmxlbmd0aCk7Zm9yKFh0PTA7dC5sZW5ndGg7KXQuc2hpZnQoKS5jYWxsKG51bGwsdC5zaGlmdCgpKX1mdW5jdGlvbiByKHQsbil7Zm9yKHZhciBlPTAscj10Lmxlbmd0aDtlPHI7ZSsrKXYodFtlXSxuKX1mdW5jdGlvbiBpKHQpe2Zvcih2YXIgbixlPTAscj10Lmxlbmd0aDtlPHI7ZSsrKW49dFtlXSxEKG4saXRbdShuKV0pfWZ1bmN0aW9uIG8odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe1Z0KG4pJiYodihuLHQpLG90Lmxlbmd0aCYmcihuLnF1ZXJ5U2VsZWN0b3JBbGwob3QpLHQpKX19ZnVuY3Rpb24gdSh0KXt2YXIgbj1VdC5jYWxsKHQsImlzIiksZT10Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkscj1hdC5jYWxsKHJ0LG4/dHQrbi50b1VwcGVyQ2FzZSgpOkorZSk7cmV0dXJuIG4mJi0xPHImJiFhKGUsbik/LTE6cn1mdW5jdGlvbiBhKHQsbil7cmV0dXJuLTE8b3QuaW5kZXhPZih0KydbaXM9IicrbisnIl0nKX1mdW5jdGlvbiBjKHQpe3ZhciBuPXQuY3VycmVudFRhcmdldCxlPXQuYXR0ckNoYW5nZSxyPXQuYXR0ck5hbWUsaT10LnRhcmdldCxvPXRbR118fDIsdT10W1hdfHwzO25uJiYoIWl8fGk9PT1uKSYmbltVXSYmInN0eWxlIiE9PXImJih0LnByZXZWYWx1ZSE9PXQubmV3VmFsdWV8fCIiPT09dC5uZXdWYWx1ZSYmKGU9PT1vfHxlPT09dSkpJiZuW1VdKHIsZT09PW8/bnVsbDp0LnByZXZWYWx1ZSxlPT09dT9udWxsOnQubmV3VmFsdWUpfWZ1bmN0aW9uIGwodCl7dmFyIG49byh0KTtyZXR1cm4gZnVuY3Rpb24odCl7ay5wdXNoKG4sdC50YXJnZXQpLFh0JiZjbGVhclRpbWVvdXQoWHQpLFh0PXNldFRpbWVvdXQoZSwxKX19ZnVuY3Rpb24gZih0KXt0biYmKHRuPSExLHQuY3VycmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKEssZikpLG90Lmxlbmd0aCYmcigodC50YXJnZXR8fEUpLnF1ZXJ5U2VsZWN0b3JBbGwob3QpLHQuZGV0YWlsPT09Uj9SOlApLE50JiZkKCl9ZnVuY3Rpb24gaCh0LG4pe3ZhciBlPXRoaXM7V3QuY2FsbChlLHQsbiksTC5jYWxsKGUse3RhcmdldDplfSl9ZnVuY3Rpb24gcyh0LG4pe190KHQsbiksTz9PLm9ic2VydmUodCxHdCk6KEp0JiYodC5zZXRBdHRyaWJ1dGU9aCx0W0ldPUgodCksdFtWXSgkLEwpKSx0W1ZdKFosYykpLHRbal0mJm5uJiYodC5jcmVhdGVkPSEwLHRbal0oKSx0LmNyZWF0ZWQ9ITEpfWZ1bmN0aW9uIGQoKXtmb3IodmFyIHQsbj0wLGU9UHQubGVuZ3RoO248ZTtuKyspdD1QdFtuXSx1dC5jb250YWlucyh0KXx8KGUtLSxQdC5zcGxpY2Uobi0tLDEpLHYodCxSKSl9ZnVuY3Rpb24gZyh0KXt0aHJvdyBuZXcgRXJyb3IoIkEgIit0KyIgdHlwZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQiKX1mdW5jdGlvbiB2KHQsbil7dmFyIGUscj11KHQpOy0xPHImJihDKHQsaXRbcl0pLHI9MCxuIT09UHx8dFtQXT9uPT09UiYmIXRbUl0mJih0W1BdPSExLHRbUl09ITAscj0xKToodFtSXT0hMSx0W1BdPSEwLHI9MSxOdCYmYXQuY2FsbChQdCx0KTwwJiZQdC5wdXNoKHQpKSxyJiYoZT10W24rel0pJiZlLmNhbGwodCkpfWZ1bmN0aW9uIHAoKXt9ZnVuY3Rpb24gbSh0LG4sZSl7dmFyIHI9ZSYmZVtGXXx8IiIsaT1uLnByb3RvdHlwZSxvPU90KGkpLHU9bi5vYnNlcnZlZEF0dHJpYnV0ZXN8fHN0LGE9e3Byb3RvdHlwZTpvfTtJdChvLGose3ZhbHVlOmZ1bmN0aW9uKCl7aWYoTXQpTXQ9ITE7ZWxzZSBpZighdGhpc1tidF0pe3RoaXNbYnRdPSEwLG5ldyBuKHRoaXMpLGlbal0mJmlbal0uY2FsbCh0aGlzKTt2YXIgdD1rdFtBdC5nZXQobildOygheHR8fHQuY3JlYXRlLmxlbmd0aD4xKSYmdyh0aGlzKX19fSksSXQobyxVLHt2YWx1ZTpmdW5jdGlvbih0KXstMTxhdC5jYWxsKHUsdCkmJmlbVV0uYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pLGlbcV0mJkl0KG8sQix7dmFsdWU6aVtxXX0pLGlbV10mJkl0KG8sUSx7dmFsdWU6aVtXXX0pLHImJihhW0ZdPXIpLHQ9dC50b1VwcGVyQ2FzZSgpLGt0W3RdPXtjb25zdHJ1Y3RvcjpuLGNyZWF0ZTpyP1tyLEh0KHQpXTpbdF19LEF0LnNldChuLHQpLEVbTl0odC50b0xvd2VyQ2FzZSgpLGEpLHgodCksTHRbdF0ucigpfWZ1bmN0aW9uIHkodCl7dmFyIG49a3RbdC50b1VwcGVyQ2FzZSgpXTtyZXR1cm4gbiYmbi5jb25zdHJ1Y3Rvcn1mdW5jdGlvbiBiKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90OnQmJnQuaXN8fCIifWZ1bmN0aW9uIHcodCl7Zm9yKHZhciBuLGU9dFtVXSxyPWU/dC5hdHRyaWJ1dGVzOnN0LGk9ci5sZW5ndGg7aS0tOyluPXJbaV0sZS5jYWxsKHQsbi5uYW1lfHxuLm5vZGVOYW1lLG51bGwsbi52YWx1ZXx8bi5ub2RlVmFsdWUpfWZ1bmN0aW9uIHgodCl7cmV0dXJuIHQ9dC50b1VwcGVyQ2FzZSgpLHQgaW4gTHR8fChMdFt0XT17fSxMdFt0XS5wPW5ldyBTdChmdW5jdGlvbihuKXtMdFt0XS5yPW59KSksTHRbdF0ucH1mdW5jdGlvbiBUKCl7d3QmJmRlbGV0ZSB0LmN1c3RvbUVsZW1lbnRzLGh0KHQsImN1c3RvbUVsZW1lbnRzIix7Y29uZmlndXJhYmxlOiEwLHZhbHVlOm5ldyBwfSksaHQodCwiQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5Iix7Y29uZmlndXJhYmxlOiEwLHZhbHVlOnB9KTtmb3IodmFyIG49ZnVuY3Rpb24obil7dmFyIGU9dFtuXTtpZihlKXt0W25dPWZ1bmN0aW9uKHQpe3ZhciBuLHI7cmV0dXJuIHR8fCh0PXRoaXMpLHRbYnRdfHwoTXQ9ITAsbj1rdFtBdC5nZXQodC5jb25zdHJ1Y3RvcildLHI9eHQmJjE9PT1uLmNyZWF0ZS5sZW5ndGgsdD1yP1JlZmxlY3QuY29uc3RydWN0KGUsc3Qsbi5jb25zdHJ1Y3Rvcik6RS5jcmVhdGVFbGVtZW50LmFwcGx5KEUsbi5jcmVhdGUpLHRbYnRdPSEwLE10PSExLHJ8fHcodCkpLHR9LHRbbl0ucHJvdG90eXBlPWUucHJvdG90eXBlO3RyeXtlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10W25dfWNhdGNoKHIpe3l0PSEwLGh0KGUsYnQse3ZhbHVlOnRbbl19KX19fSxlPU0uZ2V0KC9eSFRNTFtBLVpdKlthLXpdLykscj1lLmxlbmd0aDtyLS07bihlW3JdKSk7RS5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKHQsbil7dmFyIGU9YihuKTtyZXR1cm4gZT9RdC5jYWxsKHRoaXMsdCxIdChlKSk6UXQuY2FsbCh0aGlzLHQpfSxadHx8KCR0PSEwLEVbTl0oIiIpKX12YXIgRT10LmRvY3VtZW50LFM9dC5PYmplY3QsTT1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvPS9eW0EtWl0rW2Etel0vLHU9ZnVuY3Rpb24gdChuKXt2YXIgdCxlPVtdO2Zvcih0IGluIGMpbi50ZXN0KHQpJiZlLnB1c2godCk7cmV0dXJuIGV9LGE9ZnVuY3Rpb24odCxuKXtuPW4udG9Mb3dlckNhc2UoKSxuIGluIGN8fChjW3RdPShjW3RdfHxbXSkuY29uY2F0KG4pLGNbbl09Y1tuLnRvVXBwZXJDYXNlKCldPXQpfSxjPShTLmNyZWF0ZXx8UykobnVsbCksbD17fTtmb3IoZSBpbiB0KWZvcihpIGluIHRbZV0pZm9yKHI9dFtlXVtpXSxjW2ldPXIsbj0wO248ci5sZW5ndGg7bisrKWNbcltuXS50b0xvd2VyQ2FzZSgpXT1jW3Jbbl0udG9VcHBlckNhc2UoKV09aTtyZXR1cm4gbC5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2NbdF18fChvLnRlc3QodCk/W106IiIpOnUodCl9LGwuc2V0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIG8udGVzdCh0KT9hKHQsbik6YShuLHQpLGx9LGx9KHtjb2xsZWN0aW9uczp7SFRNTEFsbENvbGxlY3Rpb246WyJhbGwiXSxIVE1MQ29sbGVjdGlvbjpbImZvcm1zIl0sSFRNTEZvcm1Db250cm9sc0NvbGxlY3Rpb246WyJlbGVtZW50cyJdLEhUTUxPcHRpb25zQ29sbGVjdGlvbjpbIm9wdGlvbnMiXX0sZWxlbWVudHM6e0VsZW1lbnQ6WyJlbGVtZW50Il0sSFRNTEFuY2hvckVsZW1lbnQ6WyJhIl0sSFRNTEFwcGxldEVsZW1lbnQ6WyJhcHBsZXQiXSxIVE1MQXJlYUVsZW1lbnQ6WyJhcmVhIl0sSFRNTEF0dGFjaG1lbnRFbGVtZW50OlsiYXR0YWNobWVudCJdLEhUTUxBdWRpb0VsZW1lbnQ6WyJhdWRpbyJdLEhUTUxCUkVsZW1lbnQ6WyJiciJdLEhUTUxCYXNlRWxlbWVudDpbImJhc2UiXSxIVE1MQm9keUVsZW1lbnQ6WyJib2R5Il0sSFRNTEJ1dHRvbkVsZW1lbnQ6WyJidXR0b24iXSxIVE1MQ2FudmFzRWxlbWVudDpbImNhbnZhcyJdLEhUTUxDb250ZW50RWxlbWVudDpbImNvbnRlbnQiXSxIVE1MRExpc3RFbGVtZW50OlsiZGwiXSxIVE1MRGF0YUVsZW1lbnQ6WyJkYXRhIl0sSFRNTERhdGFMaXN0RWxlbWVudDpbImRhdGFsaXN0Il0sSFRNTERldGFpbHNFbGVtZW50OlsiZGV0YWlscyJdLEhUTUxEaWFsb2dFbGVtZW50OlsiZGlhbG9nIl0sSFRNTERpcmVjdG9yeUVsZW1lbnQ6WyJkaXIiXSxIVE1MRGl2RWxlbWVudDpbImRpdiJdLEhUTUxEb2N1bWVudDpbImRvY3VtZW50Il0sSFRNTEVsZW1lbnQ6WyJlbGVtZW50IiwiYWJiciIsImFkZHJlc3MiLCJhcnRpY2xlIiwiYXNpZGUiLCJiIiwiYmRpIiwiYmRvIiwiY2l0ZSIsImNvZGUiLCJjb21tYW5kIiwiZGQiLCJkZm4iLCJkdCIsImVtIiwiZmlnY2FwdGlvbiIsImZpZ3VyZSIsImZvb3RlciIsImhlYWRlciIsImkiLCJrYmQiLCJtYXJrIiwibmF2Iiwibm9zY3JpcHQiLCJycCIsInJ0IiwicnVieSIsInMiLCJzYW1wIiwic2VjdGlvbiIsInNtYWxsIiwic3Ryb25nIiwic3ViIiwic3VtbWFyeSIsInN1cCIsInUiLCJ2YXIiLCJ3YnIiXSxIVE1MRW1iZWRFbGVtZW50OlsiZW1iZWQiXSxIVE1MRmllbGRTZXRFbGVtZW50OlsiZmllbGRzZXQiXSxIVE1MRm9udEVsZW1lbnQ6WyJmb250Il0sSFRNTEZvcm1FbGVtZW50OlsiZm9ybSJdLEhUTUxGcmFtZUVsZW1lbnQ6WyJmcmFtZSJdLEhUTUxGcmFtZVNldEVsZW1lbnQ6WyJmcmFtZXNldCJdLEhUTUxIUkVsZW1lbnQ6WyJociJdLEhUTUxIZWFkRWxlbWVudDpbImhlYWQiXSxIVE1MSGVhZGluZ0VsZW1lbnQ6WyJoMSIsImgyIiwiaDMiLCJoNCIsImg1IiwiaDYiXSxIVE1MSHRtbEVsZW1lbnQ6WyJodG1sIl0sSFRNTElGcmFtZUVsZW1lbnQ6WyJpZnJhbWUiXSxIVE1MSW1hZ2VFbGVtZW50OlsiaW1nIl0sSFRNTElucHV0RWxlbWVudDpbImlucHV0Il0sSFRNTEtleWdlbkVsZW1lbnQ6WyJrZXlnZW4iXSxIVE1MTElFbGVtZW50OlsibGkiXSxIVE1MTGFiZWxFbGVtZW50OlsibGFiZWwiXSxIVE1MTGVnZW5kRWxlbWVudDpbImxlZ2VuZCJdLEhUTUxMaW5rRWxlbWVudDpbImxpbmsiXSxIVE1MTWFwRWxlbWVudDpbIm1hcCJdLEhUTUxNYXJxdWVlRWxlbWVudDpbIm1hcnF1ZWUiXSxIVE1MTWVkaWFFbGVtZW50OlsibWVkaWEiXSxIVE1MTWVudUVsZW1lbnQ6WyJtZW51Il0sSFRNTE1lbnVJdGVtRWxlbWVudDpbIm1lbnVpdGVtIl0sSFRNTE1ldGFFbGVtZW50OlsibWV0YSJdLEhUTUxNZXRlckVsZW1lbnQ6WyJtZXRlciJdLEhUTUxNb2RFbGVtZW50OlsiZGVsIiwiaW5zIl0sSFRNTE9MaXN0RWxlbWVudDpbIm9sIl0sSFRNTE9iamVjdEVsZW1lbnQ6WyJvYmplY3QiXSxIVE1MT3B0R3JvdXBFbGVtZW50Olsib3B0Z3JvdXAiXSxIVE1MT3B0aW9uRWxlbWVudDpbIm9wdGlvbiJdLEhUTUxPdXRwdXRFbGVtZW50Olsib3V0cHV0Il0sSFRNTFBhcmFncmFwaEVsZW1lbnQ6WyJwIl0sSFRNTFBhcmFtRWxlbWVudDpbInBhcmFtIl0sSFRNTFBpY3R1cmVFbGVtZW50OlsicGljdHVyZSJdLEhUTUxQcmVFbGVtZW50OlsicHJlIl0sSFRNTFByb2dyZXNzRWxlbWVudDpbInByb2dyZXNzIl0sSFRNTFF1b3RlRWxlbWVudDpbImJsb2NrcXVvdGUiLCJxIiwicXVvdGUiXSxIVE1MU2NyaXB0RWxlbWVudDpbInNjcmlwdCJdLEhUTUxTZWxlY3RFbGVtZW50Olsic2VsZWN0Il0sSFRNTFNoYWRvd0VsZW1lbnQ6WyJzaGFkb3ciXSxIVE1MU2xvdEVsZW1lbnQ6WyJzbG90Il0sSFRNTFNvdXJjZUVsZW1lbnQ6WyJzb3VyY2UiXSxIVE1MU3BhbkVsZW1lbnQ6WyJzcGFuIl0sSFRNTFN0eWxlRWxlbWVudDpbInN0eWxlIl0sSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ6WyJjYXB0aW9uIl0sSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6WyJ0ZCIsInRoIl0sSFRNTFRhYmxlQ29sRWxlbWVudDpbImNvbCIsImNvbGdyb3VwIl0sSFRNTFRhYmxlRWxlbWVudDpbInRhYmxlIl0sSFRNTFRhYmxlUm93RWxlbWVudDpbInRyIl0sSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6WyJ0aGVhZCIsInRib2R5IiwidGZvb3QiXSxIVE1MVGVtcGxhdGVFbGVtZW50OlsidGVtcGxhdGUiXSxIVE1MVGV4dEFyZWFFbGVtZW50OlsidGV4dGFyZWEiXSxIVE1MVGltZUVsZW1lbnQ6WyJ0aW1lIl0sSFRNTFRpdGxlRWxlbWVudDpbInRpdGxlIl0sSFRNTFRyYWNrRWxlbWVudDpbInRyYWNrIl0sSFRNTFVMaXN0RWxlbWVudDpbInVsIl0sSFRNTFVua25vd25FbGVtZW50OlsidW5rbm93biIsInZoZ3JvdXB2IiwidmtleWdlbiJdLEhUTUxWaWRlb0VsZW1lbnQ6WyJ2aWRlbyJdfSxub2Rlczp7QXR0cjpbIm5vZGUiXSxBdWRpbzpbImF1ZGlvIl0sQ0RBVEFTZWN0aW9uOlsibm9kZSJdLENoYXJhY3RlckRhdGE6WyJub2RlIl0sQ29tbWVudDpbIiNjb21tZW50Il0sRG9jdW1lbnQ6WyIjZG9jdW1lbnQiXSxEb2N1bWVudEZyYWdtZW50OlsiI2RvY3VtZW50LWZyYWdtZW50Il0sRG9jdW1lbnRUeXBlOlsibm9kZSJdLEhUTUxEb2N1bWVudDpbIiNkb2N1bWVudCJdLEltYWdlOlsiaW1nIl0sT3B0aW9uOlsib3B0aW9uIl0sUHJvY2Vzc2luZ0luc3RydWN0aW9uOlsibm9kZSJdLFNoYWRvd1Jvb3Q6WyIjc2hhZG93LXJvb3QiXSxUZXh0OlsiI3RleHQiXSxYTUxEb2N1bWVudDpbInhtbCJdfX0pO258fChuPSJhdXRvIik7dmFyIGssTCxBLEgsTyxfLEMsRCxOPSJyZWdpc3RlckVsZW1lbnQiLEk9Il9fIitOKygxZTUqdC5NYXRoLnJhbmRvbSgpPj4wKSxWPSJhZGRFdmVudExpc3RlbmVyIixQPSJhdHRhY2hlZCIsej0iQ2FsbGJhY2siLFI9ImRldGFjaGVkIixGPSJleHRlbmRzIixVPSJhdHRyaWJ1dGVDaGFuZ2VkIit6LEI9UCt6LHE9ImNvbm5lY3RlZCIreixXPSJkaXNjb25uZWN0ZWQiK3osaj0iY3JlYXRlZCIreixRPVIreixHPSJBRERJVElPTiIsWT0iTU9ESUZJQ0FUSU9OIixYPSJSRU1PVkFMIixaPSJET01BdHRyTW9kaWZpZWQiLEs9IkRPTUNvbnRlbnRMb2FkZWQiLCQ9IkRPTVN1YnRyZWVNb2RpZmllZCIsSj0iPCIsdHQ9Ij0iLG50PS9eW0EtWl1bQS1aMC05XSooPzotW0EtWjAtOV0rKSskLyxldD1bIkFOTk9UQVRJT04tWE1MIiwiQ09MT1ItUFJPRklMRSIsIkZPTlQtRkFDRSIsIkZPTlQtRkFDRS1TUkMiLCJGT05ULUZBQ0UtVVJJIiwiRk9OVC1GQUNFLUZPUk1BVCIsIkZPTlQtRkFDRS1OQU1FIiwiTUlTU0lORy1HTFlQSCJdLHJ0PVtdLGl0PVtdLG90PSIiLHV0PUUuZG9jdW1lbnRFbGVtZW50LGF0PXJ0LmluZGV4T2Z8fGZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLmxlbmd0aDtuLS0mJnRoaXNbbl0hPT10Oyk7cmV0dXJuIG59LGN0PVMucHJvdG90eXBlLGx0PWN0Lmhhc093blByb3BlcnR5LGZ0PWN0LmlzUHJvdG90eXBlT2YsaHQ9Uy5kZWZpbmVQcm9wZXJ0eSxzdD1bXSxkdD1TLmdldE93blByb3BlcnR5RGVzY3JpcHRvcixndD1TLmdldE93blByb3BlcnR5TmFtZXMsdnQ9Uy5nZXRQcm90b3R5cGVPZixwdD1TLnNldFByb3RvdHlwZU9mLG10PSEhUy5fX3Byb3RvX18seXQ9ITEsYnQ9Il9fZHJlQ0V2MSIsd3Q9dC5jdXN0b21FbGVtZW50cyx4dD0iZm9yY2UiIT09biYmISEod3QmJnd0LmRlZmluZSYmd3QuZ2V0JiZ3dC53aGVuRGVmaW5lZCksVHQ9Uy5jcmVhdGV8fFMsRXQ9dC5NYXB8fGZ1bmN0aW9uKCl7dmFyIHQsbj1bXSxlPVtdO3JldHVybntnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGVbYXQuY2FsbChuLHQpXX0sc2V0OmZ1bmN0aW9uKHIsaSl7dD1hdC5jYWxsKG4sciksdDwwP2Vbbi5wdXNoKHIpLTFdPWk6ZVt0XT1pfX19LFN0PXQuUHJvbWlzZXx8ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbih0KXtmb3Iocj0hMDtlLmxlbmd0aDspZS5zaGlmdCgpKHQpfXZhciBlPVtdLHI9ITEsaT17Y2F0Y2g6ZnVuY3Rpb24oKXtyZXR1cm4gaX0sdGhlbjpmdW5jdGlvbih0KXtyZXR1cm4gZS5wdXNoKHQpLHImJnNldFRpbWVvdXQobiwxKSxpfX07cmV0dXJuIHQobiksaX0sTXQ9ITEsa3Q9VHQobnVsbCksTHQ9VHQobnVsbCksQXQ9bmV3IEV0LEh0PVN0cmluZyxPdD1TLmNyZWF0ZXx8ZnVuY3Rpb24gdChuKXtyZXR1cm4gbj8odC5wcm90b3R5cGU9bixuZXcgdCk6dGhpc30sX3Q9cHR8fChtdD9mdW5jdGlvbih0LG4pe3JldHVybiB0Ll9fcHJvdG9fXz1uLHR9Omd0JiZkdD9mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxuKXtmb3IodmFyIGUscj1ndChuKSxpPTAsbz1yLmxlbmd0aDtpPG87aSsrKWU9cltpXSxsdC5jYWxsKHQsZSl8fGh0KHQsZSxkdChuLGUpKX1yZXR1cm4gZnVuY3Rpb24obixlKXtkbyB0KG4sZSk7d2hpbGUoKGU9dnQoZSkpJiYhZnQuY2FsbChlLG4pKTtyZXR1cm4gbn19KCk6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGUgaW4gbil0W2VdPW5bZV07cmV0dXJuIHR9KSxDdD10Lk11dGF0aW9uT2JzZXJ2ZXJ8fHQuV2ViS2l0TXV0YXRpb25PYnNlcnZlcixEdD0odC5IVE1MRWxlbWVudHx8dC5FbGVtZW50fHx0Lk5vZGUpLnByb3RvdHlwZSxOdD0hZnQuY2FsbChEdCx1dCksSXQ9TnQ/ZnVuY3Rpb24odCxuLGUpe3JldHVybiB0W25dPWUudmFsdWUsdH06aHQsVnQ9TnQ/ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10Lm5vZGVUeXBlfTpmdW5jdGlvbih0KXtyZXR1cm4gZnQuY2FsbChEdCx0KX0sUHQ9TnQmJltdLHp0PUR0LmF0dGFjaFNoYWRvdyxSdD1EdC5jbG9uZU5vZGUsRnQ9RHQuZGlzcGF0Y2hFdmVudCxVdD1EdC5nZXRBdHRyaWJ1dGUsQnQ9RHQuaGFzQXR0cmlidXRlLHF0PUR0LnJlbW92ZUF0dHJpYnV0ZSxXdD1EdC5zZXRBdHRyaWJ1dGUsanQ9RS5jcmVhdGVFbGVtZW50LFF0PWp0LEd0PUN0JiZ7YXR0cmlidXRlczohMCxjaGFyYWN0ZXJEYXRhOiEwLGF0dHJpYnV0ZU9sZFZhbHVlOiEwfSxZdD1DdHx8ZnVuY3Rpb24odCl7SnQ9ITEsdXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihaLFl0KX0sWHQ9MCxadD1OIGluIEUsS3Q9ITAsJHQ9ITEsSnQ9ITAsdG49ITAsbm49ITA7aWYoWnR8fChwdHx8bXQ/KEM9ZnVuY3Rpb24odCxuKXtmdC5jYWxsKG4sdCl8fHModCxuKX0sRD1zKTooQz1mdW5jdGlvbih0LG4pe3RbSV18fCh0W0ldPVMoITApLHModCxuKSl9LEQ9QyksTnQ/KEp0PSExLGZ1bmN0aW9uKCl7dmFyIHQ9ZHQoRHQsViksbj10LnZhbHVlLGU9ZnVuY3Rpb24odCl7dmFyIG49bmV3IEN1c3RvbUV2ZW50KFose2J1YmJsZXM6ITB9KTtuLmF0dHJOYW1lPXQsbi5wcmV2VmFsdWU9VXQuY2FsbCh0aGlzLHQpLG4ubmV3VmFsdWU9bnVsbCxuW1hdPW4uYXR0ckNoYW5nZT0yLHF0LmNhbGwodGhpcyx0KSxGdC5jYWxsKHRoaXMsbil9LHI9ZnVuY3Rpb24gdChuLGUpe3ZhciByPUJ0LmNhbGwodGhpcyxuKSx0PXImJlV0LmNhbGwodGhpcyxuKSxpPW5ldyBDdXN0b21FdmVudChaLHtidWJibGVzOiEwfSk7V3QuY2FsbCh0aGlzLG4sZSksaS5hdHRyTmFtZT1uLGkucHJldlZhbHVlPXI/dDpudWxsLGkubmV3VmFsdWU9ZSxyP2lbWV09aS5hdHRyQ2hhbmdlPTE6aVtHXT1pLmF0dHJDaGFuZ2U9MCxGdC5jYWxsKHRoaXMsaSl9LGk9ZnVuY3Rpb24gdChuKXt2YXIgdCxlPW4uY3VycmVudFRhcmdldCxyPWVbSV0saT1uLnByb3BlcnR5TmFtZTtyLmhhc093blByb3BlcnR5KGkpJiYocj1yW2ldLHQ9bmV3IEN1c3RvbUV2ZW50KFose2J1YmJsZXM6ITB9KSx0LmF0dHJOYW1lPXIubmFtZSx0LnByZXZWYWx1ZT1yLnZhbHVlfHxudWxsLHQubmV3VmFsdWU9ci52YWx1ZT1lW2ldfHxudWxsLG51bGw9PXQucHJldlZhbHVlP3RbR109dC5hdHRyQ2hhbmdlPTA6dFtZXT10LmF0dHJDaGFuZ2U9MSxGdC5jYWxsKGUsdCkpfTt0LnZhbHVlPWZ1bmN0aW9uKHQsbyx1KXt0PT09WiYmdGhpc1tVXSYmdGhpcy5zZXRBdHRyaWJ1dGUhPT1yJiYodGhpc1tJXT17Y2xhc3NOYW1lOntuYW1lOiJjbGFzcyIsdmFsdWU6dGhpcy5jbGFzc05hbWV9fSx0aGlzLnNldEF0dHJpYnV0ZT1yLHRoaXMucmVtb3ZlQXR0cmlidXRlPWUsbi5jYWxsKHRoaXMsInByb3BlcnR5Y2hhbmdlIixpKSksbi5jYWxsKHRoaXMsdCxvLHUpfSxodChEdCxWLHQpfSgpKTpDdHx8KHV0W1ZdKFosWXQpLHV0LnNldEF0dHJpYnV0ZShJLDEpLHV0LnJlbW92ZUF0dHJpYnV0ZShJKSxKdCYmKEw9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGk9dGhpcztpZihpPT09dC50YXJnZXQpe249aVtJXSxpW0ldPWU9SChpKTtmb3IociBpbiBlKXtpZighKHIgaW4gbikpcmV0dXJuIEEoMCxpLHIsbltyXSxlW3JdLEcpO2lmKGVbcl0hPT1uW3JdKXJldHVybiBBKDEsaSxyLG5bcl0sZVtyXSxZKX1mb3IociBpbiBuKWlmKCEociBpbiBlKSlyZXR1cm4gQSgyLGkscixuW3JdLGVbcl0sWCl9fSxBPWZ1bmN0aW9uKHQsbixlLHIsaSxvKXt2YXIgdT17YXR0ckNoYW5nZTp0LGN1cnJlbnRUYXJnZXQ6bixhdHRyTmFtZTplLHByZXZWYWx1ZTpyLG5ld1ZhbHVlOml9O3Vbb109dCxjKHUpfSxIPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9e30saT10LmF0dHJpYnV0ZXMsbz0wLHU9aS5sZW5ndGg7bzx1O28rKyluPWlbb10sZT1uLm5hbWUsInNldEF0dHJpYnV0ZSIhPT1lJiYocltlXT1uLnZhbHVlKTtyZXR1cm4gcn0pKSxFW05dPWZ1bmN0aW9uKHQsbil7aWYoZT10LnRvVXBwZXJDYXNlKCksS3QmJihLdD0hMSxDdD8oTz1mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUodCxuKXtmb3IodmFyIGU9MCxyPXQubGVuZ3RoO2U8cjtuKHRbZSsrXSkpO31yZXR1cm4gbmV3IEN0KGZ1bmN0aW9uKHIpe2Zvcih2YXIgaSxvLHUsYT0wLGM9ci5sZW5ndGg7YTxjO2ErKylpPXJbYV0sImNoaWxkTGlzdCI9PT1pLnR5cGU/KGUoaS5hZGRlZE5vZGVzLHQpLGUoaS5yZW1vdmVkTm9kZXMsbikpOihvPWkudGFyZ2V0LG5uJiZvW1VdJiYic3R5bGUiIT09aS5hdHRyaWJ1dGVOYW1lJiYodT1VdC5jYWxsKG8saS5hdHRyaWJ1dGVOYW1lKSx1IT09aS5vbGRWYWx1ZSYmb1tVXShpLmF0dHJpYnV0ZU5hbWUsaS5vbGRWYWx1ZSx1KSkpfSl9KG8oUCksbyhSKSksXz1mdW5jdGlvbih0KXtyZXR1cm4gTy5vYnNlcnZlKHQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSksdH0sXyhFKSx6dCYmKER0LmF0dGFjaFNoYWRvdz1mdW5jdGlvbigpe3JldHVybiBfKHp0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KSk6KGs9W10sRVtWXSgiRE9NTm9kZUluc2VydGVkIixsKFApKSxFW1ZdKCJET01Ob2RlUmVtb3ZlZCIsbChSKSkpLEVbVl0oSyxmKSxFW1ZdKCJyZWFkeXN0YXRlY2hhbmdlIixmKSxEdC5jbG9uZU5vZGU9ZnVuY3Rpb24odCl7dmFyIG49UnQuY2FsbCh0aGlzLCEhdCksZT11KG4pO3JldHVybi0xPGUmJkQobixpdFtlXSksdCYmb3QubGVuZ3RoJiZpKG4ucXVlcnlTZWxlY3RvckFsbChvdCkpLG59KSwkdClyZXR1cm4gJHQ9ITE7aWYoLTI8YXQuY2FsbChydCx0dCtlKSthdC5jYWxsKHJ0LEorZSkmJmcodCksIW50LnRlc3QoZSl8fC0xPGF0LmNhbGwoZXQsZSkpdGhyb3cgbmV3IEVycm9yKCJUaGUgdHlwZSAiK3QrIiBpcyBpbnZhbGlkIik7dmFyIGUsYSxjPWZ1bmN0aW9uKCl7cmV0dXJuIHM/RS5jcmVhdGVFbGVtZW50KGQsZSk6RS5jcmVhdGVFbGVtZW50KGQpfSxoPW58fGN0LHM9bHQuY2FsbChoLEYpLGQ9cz9uW0ZdLnRvVXBwZXJDYXNlKCk6ZTtyZXR1cm4gcyYmLTE8YXQuY2FsbChydCxKK2QpJiZnKGQpLGE9cnQucHVzaCgocz90dDpKKStlKS0xLG90PW90LmNvbmNhdChvdC5sZW5ndGg/IiwiOiIiLHM/ZCsnW2lzPSInK3QudG9Mb3dlckNhc2UoKSsnIl0nOmQpLGMucHJvdG90eXBlPWl0W2FdPWx0LmNhbGwoaCwicHJvdG90eXBlIik/aC5wcm90b3R5cGU6T3QoRHQpLG90Lmxlbmd0aCYmcihFLnF1ZXJ5U2VsZWN0b3JBbGwob3QpLFApLGN9LEUuY3JlYXRlRWxlbWVudD1RdD1mdW5jdGlvbih0LG4pe3ZhciBlPWIobikscj1lP2p0LmNhbGwoRSx0LEh0KGUpKTpqdC5jYWxsKEUsdCksaT0iIit0LG89YXQuY2FsbChydCwoZT90dDpKKSsoZXx8aSkudG9VcHBlckNhc2UoKSksdT0tMTxvO3JldHVybiBlJiYoci5zZXRBdHRyaWJ1dGUoImlzIixlPWUudG9Mb3dlckNhc2UoKSksdSYmKHU9YShpLnRvVXBwZXJDYXNlKCksZSkpKSxubj0hRS5jcmVhdGVFbGVtZW50LmlubmVySFRNTEhlbHBlcix1JiZEKHIsaXRbb10pLHJ9KSxwLnByb3RvdHlwZT17Y29uc3RydWN0b3I6cCxkZWZpbmU6eHQ/ZnVuY3Rpb24odCxuLGUpe2lmKGUpbSh0LG4sZSk7ZWxzZXt2YXIgcj10LnRvVXBwZXJDYXNlKCk7a3Rbcl09e2NvbnN0cnVjdG9yOm4sY3JlYXRlOltyXX0sQXQuc2V0KG4sciksd3QuZGVmaW5lKHQsbil9fTptLGdldDp4dD9mdW5jdGlvbih0KXtyZXR1cm4gd3QuZ2V0KHQpfHx5KHQpfTp5LHdoZW5EZWZpbmVkOnh0P2Z1bmN0aW9uKHQpe3JldHVybiBTdC5yYWNlKFt3dC53aGVuRGVmaW5lZCh0KSx4KHQpXSl9Onh9LHd0JiYiZm9yY2UiIT09bil0cnl7IWZ1bmN0aW9uKG4sZSxyKXtpZihlW0ZdPSJhIixuLnByb3RvdHlwZT1PdChIVE1MQW5jaG9yRWxlbWVudC5wcm90b3R5cGUpLG4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPW4sdC5jdXN0b21FbGVtZW50cy5kZWZpbmUocixuLGUpLFV0LmNhbGwoRS5jcmVhdGVFbGVtZW50KCJhIix7aXM6cn0pLCJpcyIpIT09cnx8eHQmJlV0LmNhbGwobmV3IG4sImlzIikhPT1yKXRocm93IGV9KGZ1bmN0aW9uIHQoKXtyZXR1cm4gUmVmbGVjdC5jb25zdHJ1Y3QoSFRNTEFuY2hvckVsZW1lbnQsW10sdCl9LHt9LCJkb2N1bWVudC1yZWdpc3Rlci1lbGVtZW50LWEiKX1jYXRjaCh0KXtUKCl9ZWxzZSBUKCk7dHJ5e2p0LmNhbGwoRSwiYSIsImEiKX1jYXRjaCh0KXtIdD1mdW5jdGlvbih0KXtyZXR1cm57aXM6dH19fX0od2luZG93KTt2YXIgV249Il9fZDNmYy1lbGVtZW50c19fIixqbj1mdW5jdGlvbih0KXtyZXR1cm4gdFtXbl18fHt9fSxRbj1mdW5jdGlvbih0LG4pe3JldHVybiB2b2lkKHRbV25dPW4pfSxHbj1mdW5jdGlvbih0KXtyZXR1cm4gZGVsZXRlIHRbV25dfSxZbj1mdW5jdGlvbih0KXtyZXR1cm4iRDNGQy1HUk9VUCI9PT10LnRhZ05hbWU/W3RdLmNvbmNhdChSKHQucXVlcnlTZWxlY3RvckFsbCgiZDNmYy1jYW52YXMsIGQzZmMtZ3JvdXAsIGQzZmMtc3ZnIikpKTpbdF19LFhuPWZ1bmN0aW9uKHQpe2lmKCJEM0ZDLUdST1VQIiE9PXQudGFnTmFtZSl7dmFyIG49am4odCksZT1uLndpZHRoLHI9bi5oZWlnaHQsaT10LmNsaWVudFdpZHRoLG89dC5jbGllbnRIZWlnaHQsdT1pIT09ZXx8byE9PXI7UW4odCx7d2lkdGg6aSxoZWlnaHQ6byxyZXNpemVkOnV9KX19LFpuPWZ1bmN0aW9uKHQpe2lmKCJEM0ZDLUdST1VQIiE9PXQudGFnTmFtZSl7dmFyIG49am4odCksZT10LmNoaWxkTm9kZXNbMF07ZS5zZXRBdHRyaWJ1dGUoIndpZHRoIixuLndpZHRoKSxlLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixuLmhlaWdodCk7dmFyIHI9bmV3IEN1c3RvbUV2ZW50KCJtZWFzdXJlIix7ZGV0YWlsOm59KTt0LmRpc3BhdGNoRXZlbnQocil9fSxLbj1mdW5jdGlvbih0KXt2YXIgbj1qbih0KSxlPW5ldyBDdXN0b21FdmVudCgiZHJhdyIse2RldGFpbDpufSk7dC5kaXNwYXRjaEV2ZW50KGUpfSwkbj1mdW5jdGlvbih0KXt2YXIgbj10Lm1hcChZbikucmVkdWNlKGZ1bmN0aW9uKHQsbil7cmV0dXJuIHQuY29uY2F0KG4pfSk7bi5mb3JFYWNoKFhuKSxuLmZvckVhY2goWm4pLG4uZm9yRWFjaChLbil9LEpuPWZ1bmN0aW9uKHQpe3JldHVybiBqbih0Lm93bmVyRG9jdW1lbnQpLnF1ZXVlfHxbXX0sdGU9ZnVuY3Rpb24odCxuKXt2YXIgZT1qbih0Lm93bmVyRG9jdW1lbnQpLHI9ZS5yZXF1ZXN0SWQ7bnVsbD09ciYmKHI9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7dmFyIG49Sm4odCk7JG4obiksbmUodCl9KSksUW4odC5vd25lckRvY3VtZW50LHtxdWV1ZTpuLHJlcXVlc3RJZDpyfSl9LG5lPWZ1bmN0aW9uKHQpe3JldHVybiBHbih0Lm93bmVyRG9jdW1lbnQpfSxlZT1mdW5jdGlvbih0LG4pe3ZhciBlPXQ7ZG8gaWYoZS5wYXJlbnROb2RlPT09bilyZXR1cm4hMDt3aGlsZShlPWUucGFyZW50Tm9kZSk7cmV0dXJuITF9LHJlPWZ1bmN0aW9uKHQpe3ZhciBuPUpuKHQpLGU9bi5pbmRleE9mKHQpPi0xO2lmKCFlKXt2YXIgcj1uLnNvbWUoZnVuY3Rpb24obil7cmV0dXJuIGVlKHQsbil9KTtpZighcil7dmFyIGk9bi5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIWVlKG4sdCl9KTtpLnB1c2godCksdGUodCxpKX19fSxpZT1mdW5jdGlvbih0LG4pe3QuX19ub2RlX189bn0sb2U9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe2Z1bmN0aW9uIGUobil7dmFyIHIsaTtyZXR1cm4gTih0aGlzLGUpLGllKG49cj1QKHRoaXMsKGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpLmNhbGwodGhpcyxuKSksdCgpKSxpPW4sUChyLGkpfXJldHVybiBWKGUsbiksSShlLFt7a2V5OiJjb25uZWN0ZWRDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmFwcGVuZENoaWxkKHRoaXMuX19ub2RlX18pfX0se2tleToicmVxdWVzdFJlZHJhdyIsdmFsdWU6ZnVuY3Rpb24oKXtyZSh0aGlzKX19XSksZX0oSFRNTEVsZW1lbnQpfSx1ZT1vZShmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKX0pLGFlPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4odCl7dmFyIGUscjtyZXR1cm4gTih0aGlzLG4pLHI9dD1lPVAodGhpcywobi5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihuKSkuY2FsbCh0aGlzLHQpKSxQKGUscil9cmV0dXJuIFYobix0KSxJKG4sW3trZXk6InJlcXVlc3RSZWRyYXciLHZhbHVlOmZ1bmN0aW9uKCl7cmUodGhpcyl9fSx7a2V5OiJ1cGRhdGVBdXRvUmVzaXplIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5hdXRvUmVzaXplPyhudWxsPT10aGlzLl9fYXV0b1Jlc2l6ZUxpc3RlbmVyX18mJih0aGlzLl9fYXV0b1Jlc2l6ZUxpc3RlbmVyX189ZnVuY3Rpb24oKXtyZXR1cm4gcmUodCl9KSxhZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRoaXMuX19hdXRvUmVzaXplTGlzdGVuZXJfXykpOnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdGhpcy5fX2F1dG9SZXNpemVMaXN0ZW5lcl9fKX19LHtrZXk6ImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UiYXV0by1yZXNpemUiOnRoaXMudXBkYXRlQXV0b1Jlc2l6ZSgpfX19LHtrZXk6ImF1dG9SZXNpemUiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgiYXV0by1yZXNpemUiKSYmImZhbHNlIiE9PXRoaXMuZ2V0QXR0cmlidXRlKCJhdXRvLXJlc2l6ZSIpfSxzZXQ6ZnVuY3Rpb24odCl7dCYmIXRoaXMuYXV0b1Jlc2l6ZT90aGlzLnNldEF0dHJpYnV0ZSgiYXV0by1yZXNpemUiLCIiKTohdCYmdGhpcy5hdXRvUmVzaXplJiZ0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXV0by1yZXNpemUiKSx0aGlzLnVwZGF0ZUF1dG9SZXNpemUoKX19XSxbe2tleToib2JzZXJ2ZWRBdHRyaWJ1dGVzIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm5bImF1dG8tcmVzaXplIl19fV0pLG59KEhUTUxFbGVtZW50KSxjZT1vZShmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwic3ZnIil9KSxsZT0iZDNmYy1jYW52YXMsZDNmYy1zdmd7cG9zaXRpb246cmVsYXRpdmV9ZDNmYy1jYW52YXM+Y2FudmFzLGQzZmMtc3ZnPnN2Z3twb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO2xlZnQ6MDtib3R0b206IDB9ZDNmYy1zdmc+c3Zne292ZXJmbG93OnZpc2libGV9IixmZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2ZlLnNldEF0dHJpYnV0ZSgidHlwZSIsInRleHQvY3NzIiksZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaGVhZCIpLmFwcGVuZENoaWxkKGZlKSxmZS5zdHlsZVNoZWV0P2ZlLnN0eWxlU2hlZXQuY3NzVGV4dCs9bGU6ZmUudGV4dENvbnRlbnQrPWxlLGN1c3RvbUVsZW1lbnRzLmRlZmluZSgiZDNmYy1jYW52YXMiLHVlKSxjdXN0b21FbGVtZW50cy5kZWZpbmUoImQzZmMtZ3JvdXAiLGFlKSxjdXN0b21FbGVtZW50cy5kZWZpbmUoImQzZmMtc3ZnIixjZSk7dmFyIGhlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0PWEubW91c2UodGhpcyk7ZS5jYWxsKCJwb2ludCIsdGhpcyxbe3g6dFswXSx5OnRbMV19XSl9ZnVuY3Rpb24gbigpe3ZvaWQgZS5jYWxsKCJwb2ludCIsdGhpcyxbXSl9dmFyIGU9bC5kaXNwYXRjaCgicG9pbnQiKSxyPWZ1bmN0aW9uKGUpe2Uub24oIm1vdXNlZW50ZXIucG9pbnRlciIsdCkub24oIm1vdXNlbW92ZS5wb2ludGVyIix0KS5vbigibW91c2VsZWF2ZS5wb2ludGVyIixuKX07cmV0dXJuIHcocixlLCJvbiIpLHJ9LHNlPWZ1bmN0aW9uKCl7dmFyIHQ9IiIsbj0idmVydGljYWwiLGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gTnVtYmVyKHRbbl0pfSxyPWZ1bmN0aW9uKG4pe3JldHVybiBPYmplY3Qua2V5cyhuWzBdKS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIG4hPT10fSkubWFwKGZ1bmN0aW9uKHIpe3ZhciBpPW4uZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0W3JdfSkubWFwKGZ1bmN0aW9uKG4pe3ZhciBpPVtuW3RdLGUobixyKV07cmV0dXJuIGkuZGF0YT1uLGl9KTtyZXR1cm4gaS5rZXk9cixpfSl9LGk9ZnVuY3Rpb24obil7cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKG4pe3ZhciByPU9iamVjdC5rZXlzKG4pLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gbiE9PXR9KS5tYXAoZnVuY3Rpb24odCl7dmFyIHI9W3QsZShuLHQpXTtyZXR1cm4gci5kYXRhPW4scn0pO3JldHVybiByLmtleT1uW3RdLHJ9KX0sbz1mdW5jdGlvbih0KXtyZXR1cm4idmVydGljYWwiPT09bj9yKHQpOmkodCl9O3JldHVybiBvLmtleT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxvKTp0fSxvLnZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLG8pOmV9LG8ub3JpZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLG8pOm59LG99LGRlPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdH19LGdlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOmUuc2NhbGVJZGVudGl0eSgpLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOmUuc2NhbGVJZGVudGl0eSgpLG89ZGUoIiIpLHU9ZGUoIiIpLGM9InJpZ2h0IixsPSJib3R0b20iLGY9ZGUoIiIpLGg9cXQoKSxzPW51bGwsZD12b2lkIDAsZz1mdW5jdGlvbigpe30sdj1udWxsLHA9dm9pZCAwLG09ZnVuY3Rpb24oKXt9LHk9ZnVuY3Rpb24oKXt9LGI9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UiYm90dG9tIjpyZXR1cm4gVW4oKTtjYXNlInRvcCI6cmV0dXJuIEZuKCk7Y2FzZSJsZWZ0IjpyZXR1cm4gQm4oKTtjYXNlInJpZ2h0IjpyZXR1cm4gcW4oKX19LHc9YihsKSx4PWIoYyksRT1EdCgiZDNmYy1ncm91cCIsImNhcnRlc2lhbi1jaGFydCIpLE09ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0LnNlbGVjdGlvbj9uLnRyYW5zaXRpb24odCk6bn19LGs9ZnVuY3Rpb24oZSl7dmFyIGI9TShlKTtlLmVhY2goZnVuY3Rpb24oZSxULFMpe3ZhciBNPUUoYS5zZWxlY3QoU1tUXSksW2VdKTtNLmVudGVyKCkuYXR0cigic3R5bGUiLCJkaXNwbGF5OiBmbGV4OyBoZWlnaHQ6IDEwMCU7IHdpZHRoOiAxMDAlOyBmbGV4LWRpcmVjdGlvbjogY29sdW1uIikuYXR0cigiYXV0by1yZXNpemUiLCIiKS5odG1sKCI8ZGl2IGNsYXNzPSdjaGFydC1sYWJlbCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9J2hlaWdodDogIisoZj8yOjApKyJlbTsgbGluZS1oZWlnaHQ6IDJlbTsgdGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tIitjKyI6IDRlbSc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSdmbGV4OiAxOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogIisoImJvdHRvbSI9PT1sPyJjb2x1bW4iOiJjb2x1bW4tcmV2ZXJzZSIpKyInPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0nZmxleDogMTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246ICIrKCJyaWdodCI9PT1jPyJyb3ciOiJyb3ctcmV2ZXJzZSIpKyInPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwiK3QrIiBjbGFzcz0ncGxvdC1hcmVhJyBzdHlsZT0nZmxleDogMTsgb3ZlcmZsb3c6IGhpZGRlbic+PC8iK3QrIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZDNmYy1zdmcgY2xhc3M9J3ktYXhpcycgc3R5bGU9J3dpZHRoOiAzZW0nPjwvZDNmYy1zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0nd2lkdGg6IDFlbTsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXInPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSd5LWF4aXMtbGFiZWwnIHN0eWxlPSd0cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpJz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGQzZmMtc3ZnIGNsYXNzPSd4LWF4aXMnIHN0eWxlPSdoZWlnaHQ6IDJlbTsgbWFyZ2luLSIrYysiOiA0ZW0nPjwvZDNmYy1zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSd4LWF4aXMtbGFiZWwnIHN0eWxlPSdoZWlnaHQ6IDFlbTsgbGluZS1oZWlnaHQ6IDFlbTsgdGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tIitjKyI6IDRlbSc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiIpLE0uc2VsZWN0KCIueS1heGlzLWxhYmVsIikudGV4dChvKGUpKSxNLnNlbGVjdCgiLngtYXhpcy1sYWJlbCIpLnRleHQodShlKSksTS5zZWxlY3QoIi5jaGFydC1sYWJlbCIpLnRleHQoZihlKSksTS5zZWxlY3QoIi55LWF4aXMiKS5vbigibWVhc3VyZSIsZnVuY3Rpb24odCxuLGUpe2lmKCJsZWZ0Ij09PWMpe3ZhciByPWEuZXZlbnQuZGV0YWlsLGk9ci53aWR0aCxvPXIuaGVpZ2h0O2Euc2VsZWN0KGVbbl0pLnNlbGVjdCgic3ZnIikuYXR0cigidmlld0JveCIsLWkrIiAwICIraSsiICIrbyl9fSkub24oImRyYXciLGZ1bmN0aW9uKHQsbixlKXtpZih4LnRpY2tGb3JtYXQodikuZGVjb3JhdGUobSkscCl7dmFyIHI7KHI9eCkudGlja3MuYXBwbHkocixSKHApKX1iKGEuc2VsZWN0KGVbbl0pKS5zZWxlY3QoInN2ZyIpLmNhbGwoeC5zY2FsZShpKSl9KSxNLnNlbGVjdCgiLngtYXhpcyIpLm9uKCJtZWFzdXJlIixmdW5jdGlvbih0LG4sZSl7aWYoInRvcCI9PT1sKXt2YXIgcj1hLmV2ZW50LmRldGFpbCxpPXIud2lkdGgsbz1yLmhlaWdodDthLnNlbGVjdChlW25dKS5zZWxlY3QoInN2ZyIpLmF0dHIoInZpZXdCb3giLCIwICIrLW8rIiAiK2krIiAiK28pfX0pLm9uKCJkcmF3IixmdW5jdGlvbih0LG4sZSl7aWYody50aWNrRm9ybWF0KHMpLmRlY29yYXRlKGcpLGQpe3ZhciBpOyhpPXcpLnRpY2tzLmFwcGx5KGksUihkKSl9YihhLnNlbGVjdChlW25dKSkuc2VsZWN0KCJzdmciKS5jYWxsKHcuc2NhbGUocikpfSksTS5zZWxlY3QoIi5wbG90LWFyZWEiKS5vbigibWVhc3VyZSIsZnVuY3Rpb24oKXt2YXIgdD1hLmV2ZW50LmRldGFpbCxuPXQud2lkdGgsZT10LmhlaWdodDtyLnJhbmdlKFswLG5dKSxpLnJhbmdlKFtlLDBdKX0pLm9uKCJkcmF3IixmdW5jdGlvbih0LGUsbyl7aC54U2NhbGUocikueVNjYWxlKGkpLG4odCxvW2VdLGgsYil9KSxNLmVhY2goZnVuY3Rpb24odCxuLGUpe3JldHVybiBlW25dLnJlcXVlc3RSZWRyYXcoKX0pLHkoTSxlLFQpfSl9LEw9UygvcmFuZ2VcdyovLC90aWNrRm9ybWF0Lyk7cmV0dXJuIFQoayxyLEwsQSgieCIpKSxUKGssaSxMLEEoInkiKSksay54VGlja0Zvcm1hdD1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxrKTpzfSxrLnhUaWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49QXJyYXkodCksZT0wO2U8dDtlKyspbltlXT1hcmd1bWVudHNbZV07cmV0dXJuIGQ9bixrfSxrLnhEZWNvcmF0ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxrKTpnfSxrLnlUaWNrRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGspOnZ9LGsueVRpY2tzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1BcnJheSh0KSxlPTA7ZTx0O2UrKyluW2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gcD1uLGt9LGsueURlY29yYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGspOm19LGsueU9yaWVudD1mdW5jdGlvbigpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBjO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXTtyZXR1cm4gdCE9PWMmJih4PWIodCkpLGM9dCxrfSxrLnhPcmllbnQ9ZnVuY3Rpb24oKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbDt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF07cmV0dXJuIHQhPT1sJiYodz1iKHQpKSxsPXQsa30say5jaGFydExhYmVsPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ZGUoYXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdKSxrKTpmfSxrLnBsb3RBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLGspOmh9LGsueExhYmVsPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ZGUoYXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdKSxrKTp1fSxrLnlMYWJlbD1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWRlKGFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSksayk6b30say5kZWNvcmF0ZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PWFyZ3VtZW50cy5sZW5ndGg8PTA/dm9pZCAwOmFyZ3VtZW50c1swXSxrKTp5fSxrfX0sdmU9Z2UoImQzZmMtc3ZnIixmdW5jdGlvbih0LG4sZSxyKXtyKGEuc2VsZWN0KG4pKS5zZWxlY3QoInN2ZyIpLmNhbGwoZSl9KSxwZT1mdW5jdGlvbigpe3JldHVybiB2ZS5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX0sbWU9Z2UoImQzZmMtY2FudmFzIixmdW5jdGlvbih0LG4sZSl7dmFyIHI9bi5jaGlsZE5vZGVzWzBdO2UuY29udGV4dChyLmdldENvbnRleHQoIjJkIikpLGUodCl9KSx5ZT1mdW5jdGlvbigpe3JldHVybiBtZS5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX07dC5pbmRpY2F0b3JCb2xsaW5nZXJCYW5kcz1PLHQuaW5kaWNhdG9yRXhwb25lbnRpYWxNb3ZpbmdBdmVyYWdlPV8sdC5pbmRpY2F0b3JNYWNkPUMsdC5pbmRpY2F0b3JSZWxhdGl2ZVN0cmVuZ3RoSW5kZXg9Rix0LmluZGljYXRvclN0b2NoYXN0aWNPc2NpbGxhdG9yPUIsdC5pbmRpY2F0b3JGb3JjZUluZGV4PXEsdC5pbmRpY2F0b3JFbnZlbG9wZT1XLHQuaW5kaWNhdG9yRWxkZXJSYXk9aix0LmluZGljYXRvck1vdmluZ0F2ZXJhZ2U9VSx0LnNjYWxlRGlzY29udGludW91cz12LHQuZGlzY29udGludWl0eVNraXBXZWVrZW5kcz1HLHQuZGlzY29udGludWl0eUlkZW50aXR5PVEsdC5kaXNjb250aW51aXR5UmFuZ2U9WSx0LmV4dGVudExpbmVhcj1YLHQuZXh0ZW50RGF0ZT1aLHQucmFuZG9tRmluYW5jaWFsPSQsdC5yYW5kb21HZW9tZXRyaWNCcm93bmlhbk1vdGlvbj1LLHQucmFuZG9tU2tpcFdlZWtlbmRzPUosdC5mZWVkR2RheD10dCx0LmZlZWRRdWFuZGw9bnQsdC5idWNrZXQ9ZXQsdC5sYXJnZXN0VHJpYW5nbGVPbmVCdWNrZXQ9cnQsdC5sYXJnZXN0VHJpYW5nbGVUaHJlZUJ1Y2tldD1pdCx0Lm1vZGVNZWRpYW49b3QsdC5yZWJpbmQ9dyx0LnJlYmluZEFsbD1ULHQuZXhjbHVkZT1TLHQuaW5jbHVkZT1NLHQuaW5jbHVkZU1hcD1rLHQucHJlZml4PUEsdC5zaGFwZU9obGM9YXQsdC5zaGFwZUJhcj1jdCx0LnNoYXBlQ2FuZGxlc3RpY2s9bHQsdC5zaGFwZUJveFBsb3Q9ZnQsdC5zaGFwZUVycm9yQmFyPWh0LHQubGF5b3V0TGFiZWw9dnQsdC5sYXlvdXRUZXh0TGFiZWw9cHQsdC5sYXlvdXRHcmVlZHk9TXQsdC5sYXlvdXRBbm5lYWxpbmc9QXQsdC5sYXlvdXRSZW1vdmVPdmVybGFwcz1PdCx0LmxheW91dEJvdW5kaW5nQm94PV90LHQuZGF0YUpvaW49RHQsdC5lZmZlY3RpdmVseVplcm89Q3QsdC5zZXJpZXNGcmFjdGlvbmFsQmFyV2lkdGg9TnQsdC5zZXJpZXNTdmdMaW5lPXF0LHQuc2VyaWVzQ2FudmFzTGluZT1XdCx0LnNlcmllc1N2Z1BvaW50PWp0LHQuc2VyaWVzQ2FudmFzUG9pbnQ9UXQsdC5zZXJpZXNTdmdCYXI9R3QsdC5zZXJpZXNDYW52YXNCYXI9WXQsdC5zZXJpZXNTdmdFcnJvckJhcj1adCx0LnNlcmllc0NhbnZhc0Vycm9yQmFyPUt0LHQuc2VyaWVzU3ZnQXJlYT0kdCx0LnNlcmllc0NhbnZhc0FyZWE9SnQsdC5zZXJpZXNTdmdDYW5kbGVzdGljaz1lbix0LnNlcmllc0NhbnZhc0NhbmRsZXN0aWNrPW9uLHQuc2VyaWVzU3ZnQm94UGxvdD1hbix0LnNlcmllc0NhbnZhc0JveFBsb3Q9Y24sdC5zZXJpZXNTdmdPaGxjPWxuLHQuc2VyaWVzQ2FudmFzT2hsYz1mbix0LnNlcmllc1N2Z011bHRpPXNuLHQuc2VyaWVzQ2FudmFzTXVsdGk9ZG4sdC5zZXJpZXNTdmdHcm91cGVkPXZuLHQuc2VyaWVzQ2FudmFzR3JvdXBlZD1wbix0LnNlcmllc1N2Z1JlcGVhdD1tbix0LnNlcmllc0NhbnZhc1JlcGVhdD15bix0LmFubm90YXRpb25TdmdCYW5kPXduLHQuYW5ub3RhdGlvblN2Z0Nyb3NzaGFpcj1Obix0LmFubm90YXRpb25TdmdMaW5lPXhuLHQuYW5ub3RhdGlvblN2Z0dyaWRsaW5lPVBuLHQuYXhpc1RvcD1Gbix0LmF4aXNCb3R0b209VW4sdC5heGlzTGVmdD1Cbix0LmF4aXNSaWdodD1xbix0LnBvaW50ZXI9aGUsdC5ncm91cD1zZSx0LmNoYXJ0U3ZnQ2FydGVzaWFuPXBlLHQuY2hhcnRDYW52YXNDYXJ0ZXNpYW49eWUsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSk7"></script>
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgew0KICAvLyBJZiB3aW5kb3cuSFRNTFdpZGdldHMgaXMgYWxyZWFkeSBkZWZpbmVkLCB0aGVuIHVzZSBpdDsgb3RoZXJ3aXNlIGNyZWF0ZSBhDQogIC8vIG5ldyBvYmplY3QuIFRoaXMgYWxsb3dzIHByZWNlZGluZyBjb2RlIHRvIHNldCBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZQ0KICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLg0KICB3aW5kb3cuSFRNTFdpZGdldHMgPSB3aW5kb3cuSFRNTFdpZGdldHMgfHwge307DQoNCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLg0KICB2YXIgdmlld2VyTW9kZSA9IHdpbmRvdy5IVE1MV2lkZ2V0cy52aWV3ZXJNb2RlID0NCiAgICAgIC9cYnZpZXdlcl9wYW5lPTFcYi8udGVzdCh3aW5kb3cubG9jYXRpb24pOw0KDQogIC8vIFNlZSBpZiB3ZSdyZSBydW5uaW5nIGluIFNoaW55IG1vZGUuIElmIG5vdCwgaXQncyBhIHN0YXRpYyBkb2N1bWVudC4NCiAgLy8gTm90ZSB0aGF0IHN0YXRpYyB3aWRnZXRzIGNhbiBhcHBlYXIgaW4gYm90aCBTaGlueSBhbmQgc3RhdGljIG1vZGVzLCBidXQNCiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4NCiAgdmFyIHNoaW55TW9kZSA9IHdpbmRvdy5IVE1MV2lkZ2V0cy5zaGlueU1vZGUgPQ0KICAgICAgdHlwZW9mKHdpbmRvdy5TaGlueSkgIT09ICJ1bmRlZmluZWQiICYmICEhd2luZG93LlNoaW55Lm91dHB1dEJpbmRpbmdzOw0KDQogIC8vIFdlIGNhbid0IGNvdW50IG9uIGpRdWVyeSBiZWluZyBhdmFpbGFibGUsIHNvIHdlIGltcGxlbWVudCBvdXIgb3duDQogIC8vIHZlcnNpb24gaWYgbmVjZXNzYXJ5Lg0KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3Rvcikgew0KICAgIGlmICh0eXBlb2YoalF1ZXJ5KSAhPT0gInVuZGVmaW5lZCIgJiYgc2NvcGUgaW5zdGFuY2VvZiBqUXVlcnkpIHsNCiAgICAgIHJldHVybiBzY29wZS5maW5kKHNlbGVjdG9yKTsNCiAgICB9DQogICAgaWYgKHNjb3BlLnF1ZXJ5U2VsZWN0b3JBbGwpIHsNCiAgICAgIHJldHVybiBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7DQogICAgaWYgKHZhbHVlID09PSBudWxsKQ0KICAgICAgcmV0dXJuIFtdOw0KICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQ0KICAgICAgcmV0dXJuIHZhbHVlOw0KICAgIHJldHVybiBbdmFsdWVdOw0KICB9DQoNCiAgLy8gSW1wbGVtZW50IGpRdWVyeSdzIGV4dGVuZA0KICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICByZXR1cm4gdGFyZ2V0Ow0KICAgIH0NCiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgew0KICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsNCiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7DQogICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsNCiAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHRhcmdldDsNCiAgfQ0KDQogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4NCiAgZnVuY3Rpb24gZm9yRWFjaCh2YWx1ZXMsIGNhbGxiYWNrLCB0aGlzQXJnKSB7DQogICAgaWYgKHZhbHVlcy5mb3JFYWNoKSB7DQogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7DQogICAgfSBlbHNlIHsNCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8vIFJlcGxhY2VzIHRoZSBzcGVjaWZpZWQgbWV0aG9kIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiBmdW5jU291cmNlLg0KICAvLw0KICAvLyBOb3RlIHRoYXQgZnVuY1NvdXJjZSBzaG91bGQgbm90IEJFIHRoZSBuZXcgbWV0aG9kLCBpdCBzaG91bGQgYmUgYSBmdW5jdGlvbg0KICAvLyB0aGF0IFJFVFVSTlMgdGhlIG5ldyBtZXRob2QuIGZ1bmNTb3VyY2UgcmVjZWl2ZXMgYSBzaW5nbGUgYXJndW1lbnQgdGhhdCBpcw0KICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4NCiAgLy8gbWV0aG9kIGNhbiBiZSBjYWxsZWQgbGlrZSBhIHJlZ3VsYXIgZnVuY3Rpb24sIGl0IGhhcyB0aGUgdGFyZ2V0IHBlcm1hbmVudGx5DQogIC8vIGJvdW5kIHRvIGl0IHNvICJ0aGlzIiB3aWxsIHdvcmsgY29ycmVjdGx5Lg0KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsNCiAgICB2YXIgc3VwZXJGdW5jID0gdGFyZ2V0W21ldGhvZE5hbWVdIHx8IGZ1bmN0aW9uKCkge307DQogICAgdmFyIHN1cGVyRnVuY0JvdW5kID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsNCiAgICB9Ow0KICAgIHRhcmdldFttZXRob2ROYW1lXSA9IGZ1bmNTb3VyY2Uoc3VwZXJGdW5jQm91bmQpOw0KICB9DQoNCiAgLy8gQWRkIGEgbWV0aG9kIHRvIGRlbGVnYXRvciB0aGF0LCB3aGVuIGludm9rZWQsIGNhbGxzDQogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbg0KICAvLyB0aGUgZGVsZWdhdGVlLCBidXQgdGhlcmUgd2FzIG9uZSBvbiBkZWxlZ2F0b3IgYmVmb3JlDQogIC8vIGRlbGVnYXRlTWV0aG9kIHdhcyBjYWxsZWQsIHRoZW4gdGhlIG9yaWdpbmFsIHZlcnNpb24NCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLg0KICAvLyBGb3IgZXhhbXBsZToNCiAgLy8NCiAgLy8gdmFyIGEgPSB7DQogIC8vICAgbWV0aG9kMTogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdhMScpOyB9DQogIC8vICAgbWV0aG9kMjogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdhMicpOyB9DQogIC8vIH07DQogIC8vIHZhciBiID0gew0KICAvLyAgIG1ldGhvZDE6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYjEnKTsgfQ0KICAvLyB9Ow0KICAvLyBkZWxlZ2F0ZU1ldGhvZChhLCBiLCAibWV0aG9kMSIpOw0KICAvLyBkZWxlZ2F0ZU1ldGhvZChhLCBiLCAibWV0aG9kMiIpOw0KICAvLyBhLm1ldGhvZDEoKTsNCiAgLy8gYS5tZXRob2QyKCk7DQogIC8vDQogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4NCiAgZnVuY3Rpb24gZGVsZWdhdGVNZXRob2QoZGVsZWdhdG9yLCBkZWxlZ2F0ZWUsIG1ldGhvZE5hbWUpIHsNCiAgICB2YXIgaW5oZXJpdGVkID0gZGVsZWdhdG9yW21ldGhvZE5hbWVdOw0KICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIHRhcmdldCA9IGRlbGVnYXRlZTsNCiAgICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZWVbbWV0aG9kTmFtZV07DQoNCiAgICAgIC8vIFRoZSBtZXRob2QgZG9lc24ndCBleGlzdCBvbiB0aGUgZGVsZWdhdGVlLiBJbnN0ZWFkLA0KICAgICAgLy8gY2FsbCB0aGUgbWV0aG9kIG9uIHRoZSBkZWxlZ2F0b3IsIGlmIGl0IGV4aXN0cy4NCiAgICAgIGlmICghbWV0aG9kKSB7DQogICAgICAgIHRhcmdldCA9IGRlbGVnYXRvcjsNCiAgICAgICAgbWV0aG9kID0gaW5oZXJpdGVkOw0KICAgICAgfQ0KDQogICAgICBpZiAobWV0aG9kKSB7DQogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOw0KICAgICAgfQ0KICAgIH07DQogIH0NCg0KICAvLyBJbXBsZW1lbnQgYSB2YWd1ZSBmYWNzaW1pbGllIG9mIGpRdWVyeSdzIGRhdGEgbWV0aG9kDQogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgew0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHsNCiAgICAgIHJldHVybiBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXTsNCiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgew0KICAgICAgZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV0gPSB2YWx1ZTsNCiAgICAgIHJldHVybiBlbDsNCiAgICB9IGVsc2Ugew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBlbGVtZW50RGF0YTogIiArDQogICAgICAgIGFyZ3VtZW50cy5sZW5ndGgpOw0KICAgIH0NCiAgfQ0KDQogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleA0KICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyKSB7DQogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csICJcXCQmIik7DQogIH0NCg0KICBmdW5jdGlvbiBoYXNDbGFzcyhlbCwgY2xhc3NOYW1lKSB7DQogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOw0KICAgIHJldHVybiByZS50ZXN0KGVsLmNsYXNzTmFtZSk7DQogIH0NCg0KICAvLyBlbGVtZW50cyAtIGFycmF5IChvciBhcnJheS1saWtlIG9iamVjdCkgb2YgSFRNTCBlbGVtZW50cw0KICAvLyBjbGFzc05hbWUgLSBjbGFzcyBuYW1lIHRvIHRlc3QgZm9yDQogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsNCiAgLy8gICBpZiBmYWxzZSwgb25seSByZXR1cm4gZWxlbWVudHMgKndpdGhvdXQqIGdpdmVuIGNsYXNzTmFtZQ0KICBmdW5jdGlvbiBmaWx0ZXJCeUNsYXNzKGVsZW1lbnRzLCBjbGFzc05hbWUsIGluY2x1ZGUpIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCiAgICAgIGlmIChoYXNDbGFzcyhlbGVtZW50c1tpXSwgY2xhc3NOYW1lKSA9PSBpbmNsdWRlKQ0KICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOw0KICAgIH0NCiAgICByZXR1cm4gcmVzdWx0czsNCiAgfQ0KDQogIGZ1bmN0aW9uIG9uKG9iaiwgZXZlbnROYW1lLCBmdW5jKSB7DQogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmMsIGZhbHNlKTsNCiAgICB9IGVsc2UgaWYgKG9iai5hdHRhY2hFdmVudCkgew0KICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gb2ZmKG9iaiwgZXZlbnROYW1lLCBmdW5jKSB7DQogICAgaWYgKG9iai5yZW1vdmVFdmVudExpc3RlbmVyKQ0KICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7DQogICAgZWxzZSBpZiAob2JqLmRldGFjaEV2ZW50KSB7DQogICAgICBvYmouZGV0YWNoRXZlbnQoZXZlbnROYW1lLCBmdW5jKTsNCiAgICB9DQogIH0NCg0KICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aA0KICAvLyB0aGUgInBhZGRpbmciIENTUyBwcm9wZXJ0eQ0KICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvcGFkZGluZw0KICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7DQogICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJudW1iZXIiKQ0KICAgICAgdmFsdWUgPSBbdmFsdWVdOw0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzBdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVswXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVsxXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVsxXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVszXX07DQogICAgfQ0KICB9DQoNCiAgLy8gQ29udmVydCBhbiB1bnBhY2tlZCBwYWRkaW5nIG9iamVjdCB0byBhIENTUyB2YWx1ZQ0KICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgew0KICAgIHJldHVybiBwYWRkaW5nT2JqLnRvcCArICJweCAiICsgcGFkZGluZ09iai5yaWdodCArICJweCAiICsgcGFkZGluZ09iai5ib3R0b20gKyAicHggIiArIHBhZGRpbmdPYmoubGVmdCArICJweCI7DQogIH0NCg0KICAvLyBNYWtlcyBhIG51bWJlciBzdWl0YWJsZSBmb3IgQ1NTDQogIGZ1bmN0aW9uIHB4KHgpIHsNCiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikNCiAgICAgIHJldHVybiB4ICsgInB4IjsNCiAgICBlbHNlDQogICAgICByZXR1cm4geDsNCiAgfQ0KDQogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuDQogIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgZWl0aGVyIG51bGwsIG9yIGFuIG9iamVjdCB3aXRoIGZpbGwsIHBhZGRpbmcsDQogIC8vIGRlZmF1bHRXaWR0aCwgZGVmYXVsdEhlaWdodCBmaWVsZHMuDQogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgew0KICAgIHZhciBzaXppbmdFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2h0bWx3aWRnZXQtc2l6aW5nJ10iKTsNCiAgICBpZiAoIXNpemluZ0VsKQ0KICAgICAgcmV0dXJuIG51bGw7DQogICAgdmFyIHNwID0gSlNPTi5wYXJzZShzaXppbmdFbC50ZXh0Q29udGVudCB8fCBzaXppbmdFbC50ZXh0IHx8ICJ7fSIpOw0KICAgIGlmICh2aWV3ZXJNb2RlKSB7DQogICAgICByZXR1cm4gc3Audmlld2VyOw0KICAgIH0gZWxzZSB7DQogICAgICByZXR1cm4gc3AuYnJvd3NlcjsNCiAgICB9DQogIH0NCg0KICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLg0KICAvLyAgIEVhY2ggZWxlbWVudCBtdXN0IGJlIGEgdmFsaWQgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRoYXQgeWllbGRzIGENCiAgLy8gICBmdW5jdGlvbi4gT3IsIGNhbiBiZSBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggImNvZGUiIGFuZCAiZGF0YSINCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nDQogIC8vICAgb2YgSlMgdGhhdCdzIGFuIGV4cHIgdGhhdCB5aWVsZHMgYSBmdW5jdGlvbiwgYW5kICJkYXRhIiBzaG91bGQgYmUNCiAgLy8gICBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgd2hlbiB0aGF0DQogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLg0KICAvLyBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3QgdGhhdCB3aWxsIGJlICJ0aGlzIiBmb3IgZWFjaCBmdW5jdGlvbg0KICAvLyAgIGV4ZWN1dGlvbi4NCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlDQogIC8vICAgc2FtZSBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgdG8gYWxsIGZ1bmN0aW9ucy4pDQogIGZ1bmN0aW9uIGV2YWxBbmRSdW4odGFza3MsIHRhcmdldCwgYXJncykgew0KICAgIGlmICh0YXNrcykgew0KICAgICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykgew0KICAgICAgICB2YXIgdGhlc2VBcmdzID0gYXJnczsNCiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsNCiAgICAgICAgICB0aGVzZUFyZ3MgPSB0aGVzZUFyZ3MuY29uY2F0KFt0YXNrLmRhdGFdKTsNCiAgICAgICAgICB0YXNrID0gdGFzay5jb2RlOw0KICAgICAgICB9DQogICAgICAgIHZhciB0YXNrRnVuYyA9IGV2YWwoIigiICsgdGFzayArICIpIik7DQogICAgICAgIGlmICh0eXBlb2YodGFza0Z1bmMpICE9PSAiZnVuY3Rpb24iKSB7DQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOw0KICAgICAgICB9DQogICAgICAgIHRhc2tGdW5jLmFwcGx5KHRhcmdldCwgdGhlc2VBcmdzKTsNCiAgICAgIH0pOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIGluaXRTaXppbmcoZWwpIHsNCiAgICB2YXIgc2l6aW5nID0gc2l6aW5nUG9saWN5KGVsKTsNCiAgICBpZiAoIXNpemluZykNCiAgICAgIHJldHVybjsNCg0KICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsNCiAgICBpZiAoIWNlbCkNCiAgICAgIHJldHVybjsNCg0KICAgIGlmICh0eXBlb2Yoc2l6aW5nLnBhZGRpbmcpICE9PSAidW5kZWZpbmVkIikgew0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW4gPSAiMCI7DQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOw0KICAgIH0NCg0KICAgIGlmIChzaXppbmcuZmlsbCkgew0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOw0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS53aWR0aCA9ICIxMDAlIjsNCiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOw0KICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLndpZHRoID0gIjEwMCUiOw0KICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmhlaWdodCA9ICIxMDAlIjsNCiAgICAgIGlmIChjZWwpIHsNCiAgICAgICAgY2VsLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsNCiAgICAgICAgdmFyIHBhZCA9IHVucGFja1BhZGRpbmcoc2l6aW5nLnBhZGRpbmcpOw0KICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7DQogICAgICAgIGNlbC5zdHlsZS5yaWdodCA9IHBhZC5yaWdodCArICJweCI7DQogICAgICAgIGNlbC5zdHlsZS5ib3R0b20gPSBwYWQuYm90dG9tICsgInB4IjsNCiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7DQogICAgICAgIGVsLnN0eWxlLndpZHRoID0gIjEwMCUiOw0KICAgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7DQogICAgICB9DQoNCiAgICAgIHJldHVybiB7DQogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwNCiAgICAgICAgZ2V0SGVpZ2h0OiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRIZWlnaHQ7IH0NCiAgICAgIH07DQoNCiAgICB9IGVsc2Ugew0KICAgICAgZWwuc3R5bGUud2lkdGggPSBweChzaXppbmcud2lkdGgpOw0KICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7DQoNCiAgICAgIHJldHVybiB7DQogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LA0KICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZWwub2Zmc2V0SGVpZ2h0OyB9DQogICAgICB9Ow0KICAgIH0NCiAgfQ0KDQogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzDQogIHZhciBkZWZhdWx0cyA9IHsNCiAgICBmaW5kOiBmdW5jdGlvbihzY29wZSkgew0KICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7DQogICAgfSwNCiAgICByZW5kZXJFcnJvcjogZnVuY3Rpb24oZWwsIGVycikgew0KICAgICAgdmFyICRlbCA9ICQoZWwpOw0KDQogICAgICB0aGlzLmNsZWFyRXJyb3IoZWwpOw0KDQogICAgICAvLyBBZGQgYWxsIHRoZXNlIGVycm9yIGNsYXNzZXMsIGFzIFNoaW55IGRvZXMNCiAgICAgIHZhciBlcnJDbGFzcyA9ICJzaGlueS1vdXRwdXQtZXJyb3IiOw0KICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7DQogICAgICAgIC8vIHVzZSB0aGUgY2xhc3NlcyBvZiB0aGUgZXJyb3IgY29uZGl0aW9uIGFzIENTUyBjbGFzcyBuYW1lcw0KICAgICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiAiICsgJC5tYXAoYXNBcnJheShlcnIudHlwZSksIGZ1bmN0aW9uKHR5cGUpIHsNCiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOw0KICAgICAgICB9KS5qb2luKCIgIik7DQogICAgICB9DQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7DQoNCiAgICAgIC8vIElzIGVsIGlubGluZSBvciBibG9jaz8gSWYgaW5saW5lIG9yIGlubGluZS1ibG9jaywganVzdCBkaXNwbGF5Om5vbmUgaXQNCiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLg0KICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuY3NzKCJkaXNwbGF5Iik7DQogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBkaXNwbGF5KTsNCg0KICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7DQogICAgICAgICRlbC5oaWRlKCk7DQogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsNCiAgICAgICAgICB2YXIgZXJyb3JTcGFuID0gJCgiPHNwYW4+IikuYWRkQ2xhc3MoZXJyQ2xhc3MpOw0KICAgICAgICAgIGVycm9yU3Bhbi50ZXh0KGVyci5tZXNzYWdlKTsNCiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmIChkaXNwbGF5ID09PSAiYmxvY2siKSB7DQogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlDQogICAgICAgIC8vIGVsLCBhbmQgcG9zaXRpb24gdGhlIGVycm9yIHRvIGJlIG9uIHRvcCBvZiB0aGUgZWwuDQogICAgICAgIC8vIE1hcmsgaXQgd2l0aCBhIHVuaXF1ZSBJRCBhbmQgQ1NTIGNsYXNzIHNvIHdlIGNhbiByZW1vdmUgaXQgbGF0ZXIuDQogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7DQogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsNCiAgICAgICAgICB2YXIgZXJyb3JEaXYgPSAkKCI8ZGl2PiIpLmFkZENsYXNzKGVyckNsYXNzKS5jc3MoInBvc2l0aW9uIiwgImFic29sdXRlIikNCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkNCiAgICAgICAgICAgIC5jc3MoImxlZnQiLCBlbC5vZmZzZXRMZWZ0KQ0KICAgICAgICAgICAgLy8gc2V0dGluZyB3aWR0aCBjYW4gcHVzaCBvdXQgdGhlIHBhZ2Ugc2l6ZSwgZm9yY2luZyBvdGhlcndpc2UNCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3INCiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHRvIHNocmluazsgc28gdXNlIG1heC13aWR0aCBpbnN0ZWFkDQogICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQ0KICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsNCiAgICAgICAgICBlcnJvckRpdi50ZXh0KGVyci5tZXNzYWdlKTsNCiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JEaXYpOw0KDQogICAgICAgICAgLy8gUmVhbGx5IGR1bWIgd2F5IHRvIGtlZXAgdGhlIHNpemUvcG9zaXRpb24gb2YgdGhlIGVycm9yIGluIHN5bmMgd2l0aA0KICAgICAgICAgIC8vIHRoZSBwYXJlbnQgZWxlbWVudCBhcyB0aGUgd2luZG93IGlzIHJlc2l6ZWQgb3Igd2hhdGV2ZXIuDQogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBpZiAoIWVycm9yRGl2WzBdLnBhcmVudEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRJZCk7DQogICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVycm9yRGl2DQogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkNCiAgICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpDQogICAgICAgICAgICAgIC5jc3MoIm1heFdpZHRoIiwgZWwub2Zmc2V0V2lkdGgpDQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgfSwgNTAwKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQogICAgY2xlYXJFcnJvcjogZnVuY3Rpb24oZWwpIHsNCiAgICAgIHZhciAkZWwgPSAkKGVsKTsNCiAgICAgIHZhciBkaXNwbGF5ID0gJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIik7DQogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBudWxsKTsNCg0KICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7DQogICAgICAgIGlmIChkaXNwbGF5KQ0KICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsNCiAgICAgICAgJChlbC5uZXh0U2libGluZykuZmlsdGVyKCIuaHRtbHdpZGdldHMtZXJyb3IiKS5yZW1vdmUoKTsNCiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIil7DQogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOw0KICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOw0KICAgICAgfQ0KICAgIH0sDQogICAgc2l6aW5nOiB7fQ0KICB9Ow0KDQogIC8vIENhbGxlZCBieSB3aWRnZXQgYmluZGluZ3MgdG8gcmVnaXN0ZXIgYSBuZXcgdHlwZSBvZiB3aWRnZXQuIFRoZSBkZWZpbml0aW9uDQogIC8vIG9iamVjdCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6DQogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlDQogIC8vICAgdXNlZCBieSBkZWZhdWx0IGFzIHRoZSBDU1MgY2xhc3NuYW1lIHRvIGxvb2sgZm9yLg0KICAvLyAtIGluaXRpYWxpemUgKG9wdGlvbmFsKSAtIEEgZnVuY3Rpb24oZWwpIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25jZSBwZXINCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkDQogIC8vICAgdmFsdWUgdG8gcmVuZGVyVmFsdWUuDQogIC8vIC0gcmVuZGVyVmFsdWUgKHJlcXVpcmVkKSAtIEEgZnVuY3Rpb24oZWwsIGRhdGEsIGluaXRWYWx1ZSkgdGhhdCB3aWxsIGJlDQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXINCiAgLy8gICBlbGVtZW50OyBTaGlueSBhcHBzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgcGVyDQogIC8vICAgZWxlbWVudCwgYXMgdGhlIGRhdGEgY2hhbmdlcy4NCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsNCiAgICBpZiAoIWRlZmluaXRpb24ubmFtZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgbmFtZSIpOw0KICAgIH0NCiAgICBpZiAoIWRlZmluaXRpb24udHlwZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgdHlwZSIpOw0KICAgIH0NCiAgICAvLyBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IG91dHB1dCB3aWRnZXRzDQogICAgaWYgKGRlZmluaXRpb24udHlwZSAhPT0gIm91dHB1dCIpIHsNCiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsNCiAgICB9DQogICAgLy8gVE9ETzogVmVyaWZ5IHRoYXQgLm5hbWUgaXMgYSB2YWxpZCBDU1MgY2xhc3NuYW1lDQoNCiAgICAvLyBTdXBwb3J0IG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucy4gT2xkLXN0eWxlIGNsYXNzLWJvdW5kDQogICAgLy8gZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0ICJvYmplY3QiIHBlciB3aWRnZXQgcGVyIHR5cGUvY2xhc3Mgb2YNCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cw0KICAgIC8vIHRha2UgZWwgYW5kIGluc3RhbmNlIGFyZ3VtZW50cywgYmVjYXVzZSB0aGUgd2lkZ2V0IG9iamVjdCBjYW4ndA0KICAgIC8vIHN0b3JlIHRoZW0uIE5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucyBoYXZlIG9uZSB3aWRnZXQNCiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0DQogICAgLy8gcHJvdmlkZSByZW5kZXJWYWx1ZSBvciByZXNpemUgbWV0aG9kcyBhdCBhbGwsIGp1c3QgdGhlIHNpbmdsZSBtZXRob2QNCiAgICAvLyAgIGZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpDQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4NCiAgICAvLyBUaGlzIGVuYWJsZXMgYSBmYXIgbW9yZSBuYXR1cmFsIHByb2dyYW1taW5nIHN0eWxlIGZvciB0aGUgd2lkZ2V0DQogICAgLy8gYXV0aG9yLCB3aG8gY2FuIHN0b3JlIHBlci1pbnN0YW5jZSBzdGF0ZSB1c2luZyBlaXRoZXIgT08tc3R5bGUNCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzDQogICAgLy8gaXMgaW4gY29udHJhc3QgdG8gd2hhdCBjYW4gb25seSBiZSBjYWxsZWQgQy1zdHlsZSBwc2V1ZG8tT08gd2hpY2ggaXMNCiAgICAvLyB3aGF0IHdlIHJlcXVpcmVkIGJlZm9yZSkuDQogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgew0KICAgICAgZGVmaW5pdGlvbiA9IGNyZWF0ZUxlZ2FjeURlZmluaXRpb25BZGFwdGVyKGRlZmluaXRpb24pOw0KICAgIH0NCg0KICAgIGlmICghZGVmaW5pdGlvbi5yZW5kZXJWYWx1ZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgcmVuZGVyVmFsdWUgZnVuY3Rpb24iKTsNCiAgICB9DQoNCiAgICAvLyBGb3Igc3RhdGljIHJlbmRlcmluZyAobm9uLVNoaW55KSwgdXNlIGEgc2ltcGxlIHdpZGdldCByZWdpc3RyYXRpb24NCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28NCiAgICAvLyBjb250YWluIHN0YXRpYyB3aWRnZXRzLg0KICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107DQogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLg0KICAgIHZhciBzdGF0aWNCaW5kaW5nID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgZGVmaW5pdGlvbik7DQogICAgb3ZlcnJpZGVNZXRob2Qoc3RhdGljQmluZGluZywgImZpbmQiLCBmdW5jdGlvbihzdXBlcmZ1bmMpIHsNCiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgew0KICAgICAgICB2YXIgcmVzdWx0cyA9IHN1cGVyZnVuYyhzY29wZSk7DQogICAgICAgIC8vIEZpbHRlciBvdXQgU2hpbnkgb3V0cHV0cywgd2Ugb25seSB3YW50IHRoZSBzdGF0aWMga2luZA0KICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOw0KICAgICAgfTsNCiAgICB9KTsNCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOw0KDQogICAgaWYgKHNoaW55TW9kZSkgew0KICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4NCiAgICAgIC8vIFRoZSBkZWZpbml0aW9uIGl0c2VsZiB3aWxsIG5vdCBiZSB0aGUgb3V0cHV0IGJpbmRpbmcsIGluc3RlYWQNCiAgICAgIC8vIHdlIHdpbGwgbWFrZSBhbiBvdXRwdXQgYmluZGluZyBvYmplY3QgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlDQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kDQogICAgICAvLyBuYW1lIChyZW5kZXJWYWx1ZSkgZm9yIGh0bWx3aWRnZXRzIGRlZmluaXRpb24gYW5kIFNoaW55IGJpbmRpbmdzDQogICAgICAvLyBidXQgdGhleSBhY3R1YWxseSBoYXZlIHF1aXRlIGRpZmZlcmVudCBzZW1hbnRpY3MgKHRoZSBTaGlueQ0KICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0DQogICAgICAvLyBzdHJpcHMgb2ZmIGJlZm9yZSBjYWxsaW5nIGh0bWx3aWRnZXRzIHJlbmRlclZhbHVlKS4gV2UgY2FuJ3QNCiAgICAgIC8vIGp1c3QgaWdub3JlIHRoZSBkaWZmZXJlbmNlIGJlY2F1c2UgaW4gc29tZSB3aWRnZXRzIGl0J3MgaGVscGZ1bA0KICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZg0KICAgICAgLy8gd2UncmUgbm90IGRlbGVnYXRpbmcsIHRoZW4gdGhhdCBjYWxsIHdpbGwgZ28gdG8gdGhlIFNoaW55DQogICAgICAvLyB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIGh0bWx3aWRnZXRzIHZlcnNpb24uDQoNCiAgICAgIC8vIE1lcmdlIGRlZmF1bHRzIHdpdGggZGVmaW5pdGlvbiwgd2l0aG91dCBtdXRhdGluZyBlaXRoZXIuDQogICAgICB2YXIgYmluZGluZ0RlZiA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIGRlZmluaXRpb24pOw0KDQogICAgICAvLyBUaGlzIG9iamVjdCB3aWxsIGJlIG91ciBhY3R1YWwgU2hpbnkgYmluZGluZy4NCiAgICAgIHZhciBzaGlueUJpbmRpbmcgPSBuZXcgU2hpbnkuT3V0cHV0QmluZGluZygpOw0KDQogICAgICAvLyBXaXRoIGEgZmV3IGV4Y2VwdGlvbnMsIHdlJ2xsIHdhbnQgdG8gc2ltcGx5IHVzZSB0aGUgYmluZGluZ0RlZidzDQogICAgICAvLyB2ZXJzaW9uIG9mIG1ldGhvZHMgaWYgdGhleSBhcmUgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvDQogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwNCiAgICAgIC8vIG1ldGhvZHMgaW4gdGhlIGZ1dHVyZSwgYW5kIHdlIHdhbnQgdGhlbSB0byBiZSBvdmVycmlkZWFibGUgYnkNCiAgICAgIC8vIEhUTUxXaWRnZXQgYmluZGluZyBkZWZpbml0aW9ucywgdGhlbiB3ZSdsbCBuZWVkIHRvIGFkZCB0aGVtIHRvIHRoaXMNCiAgICAgIC8vIGxpc3QuDQogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJnZXRJZCIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUNoYW5nZSIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7DQogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJyZW5kZXJFcnJvciIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAiY2xlYXJFcnJvciIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7DQoNCiAgICAgIC8vIFRoZSBmaW5kLCByZW5kZXJWYWx1ZSwgYW5kIHJlc2l6ZSBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgYmVjYXVzZSB3ZQ0KICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4NCg0KICAgICAgc2hpbnlCaW5kaW5nLmZpbmQgPSBmdW5jdGlvbihzY29wZSkgew0KICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7DQoNCiAgICAgICAgLy8gT25seSByZXR1cm4gZWxlbWVudHMgdGhhdCBhcmUgU2hpbnkgb3V0cHV0cywgbm90IHN0YXRpYyBvbmVzDQogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7DQoNCiAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdoYXRldmVyIGNhdXNlZCBTaGlueSB0byB0aGluayB0aGVyZSBtaWdodCBiZQ0KICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuDQogICAgICAgIC8vIFNpbmNlIHRoZXJlIG1pZ2h0IGJlIGxvdHMgb2YgZGlmZmVyZW50IGh0bWx3aWRnZXRzIGJpbmRpbmdzLCB3ZQ0KICAgICAgICAvLyBzY2hlZHVsZSBleGVjdXRpb24gZm9yIGxhdGVyLS1ubyBuZWVkIHRvIHN0YXRpY1JlbmRlciBtdWx0aXBsZQ0KICAgICAgICAvLyB0aW1lcy4NCiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9PSBkeW5hbWljUmVzdWx0cy5sZW5ndGgpDQogICAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXIoKTsNCg0KICAgICAgICByZXR1cm4gZHluYW1pY1Jlc3VsdHM7DQogICAgICB9Ow0KDQogICAgICAvLyBXcmFwIHJlbmRlclZhbHVlIHRvIGhhbmRsZSBpbml0aWFsaXphdGlvbiwgd2hpY2ggdW5mb3J0dW5hdGVseSBpc24ndA0KICAgICAgLy8gc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IFNoaW55IGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZy4NCg0KICAgICAgc2hpbnlCaW5kaW5nLnJlbmRlclZhbHVlID0gZnVuY3Rpb24oZWwsIGRhdGEpIHsNCiAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMNCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGRhdGEuZXZhbHMgJiYgaSA8IGRhdGEuZXZhbHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2ldKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIWJpbmRpbmdEZWYucmVuZGVyT25OdWxsVmFsdWUpIHsNCiAgICAgICAgICBpZiAoZGF0YS54ID09PSBudWxsKSB7DQogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7DQogICAgICAgICAgaW5pdFNpemluZyhlbCk7DQoNCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7DQogICAgICAgICAgaWYgKGJpbmRpbmdEZWYuaW5pdGlhbGl6ZSkgew0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGJpbmRpbmdEZWYuaW5pdGlhbGl6ZShlbCwgZWwub2Zmc2V0V2lkdGgsDQogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgcmVzdWx0KTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgU2hpbnkucmVuZGVyRGVwZW5kZW5jaWVzKGRhdGEuZGVwcyk7DQogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsNCiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7DQogICAgICB9Ow0KDQogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQNCiAgICAgIGlmIChiaW5kaW5nRGVmLnJlc2l6ZSkgew0KICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsNCiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuDQogICAgICAgICAgLy8gY2FsbGVkLCB3aGljaCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHdpZGdldHMuDQogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgew0KICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7DQogICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgfQ0KDQogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7DQogICAgfQ0KICB9Ow0KDQogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOw0KICBmdW5jdGlvbiBzY2hlZHVsZVN0YXRpY1JlbmRlcigpIHsNCiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgew0KICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gbnVsbDsNCiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOw0KICAgICAgfSwgMSk7DQogICAgfQ0KICB9DQoNCiAgLy8gUmVuZGVyIHN0YXRpYyB3aWRnZXRzIGFmdGVyIHRoZSBkb2N1bWVudCBmaW5pc2hlcyBsb2FkaW5nDQogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgYmluZGluZ3MgPSB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyB8fCBbXTsNCiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7DQogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOw0KICAgICAgZm9yRWFjaChtYXRjaGVzLCBmdW5jdGlvbihlbCkgew0KICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOw0KDQogICAgICAgIGlmIChoYXNDbGFzcyhlbCwgImh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCIpKQ0KICAgICAgICAgIHJldHVybjsNCiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOw0KDQogICAgICAgIHZhciBpbml0UmVzdWx0Ow0KICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7DQogICAgICAgICAgaW5pdFJlc3VsdCA9IGJpbmRpbmcuaW5pdGlhbGl6ZShlbCwNCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwNCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0DQogICAgICAgICAgKTsNCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsNCiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsNCiAgICAgICAgICB2YXIgcmVzaXplSGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHZhciBzaXplID0gew0KICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsDQogICAgICAgICAgICAgIGg6IHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApDQogICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQ0KICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICBsYXN0U2l6ZSA9IHNpemU7DQogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOw0KICAgICAgICAgIH07DQoNCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsNCg0KICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciBjYXNlcyB3aGVyZSB3ZSdyZSBydW5uaW5nIGluIGEgU2hpbnkNCiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dA0KICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzDQogICAgICAgICAgLy8gYW4gcm1hcmtkb3duIGRvY3VtZW50IHRoYXQgaGFzIHJ1bnRpbWU6c2hpbnkgYW5kIHdpZGdldA0KICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8NCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMNCiAgICAgICAgICAvLyB3aWRnZXRzLCBzbyB3ZSBkbyBpdCBvdXJzZWx2ZXMuDQogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsNCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKA0KICAgICAgICAgICAgICAic2hvd24uaHRtbHdpZGdldHMgc2hvd24uYnMudGFiLmh0bWx3aWRnZXRzIHNob3duLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwNCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcg0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKA0KICAgICAgICAgICAgICAiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMgaGlkZGVuLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwNCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcg0KICAgICAgICAgICAgKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIHNwZWNpZmljIGNhc2Ugb2YgaW9zbGlkZXMsIHdoaWNoDQogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLg0KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUNCiAgICAgICAgICAvLyBoZXJlLCBidXQgcmF0aGVyIGhhdmUgaW9zbGlkZXMgcmFpc2UgYSBnZW5lcmljIGV2ZW50LA0KICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlDQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4NCiAgICAgICAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHsNCiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcg0KICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cw0KICAgICAgICAgICAgLy8gc3VjaCBicm93c2Vycy4NCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOw0KICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHNjcmlwdERhdGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHRbZGF0YS1mb3I9JyIgKyBlbC5pZCArICInXVt0eXBlPSdhcHBsaWNhdGlvbi9qc29uJ10iKTsNCiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsNCiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOw0KICAgICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzDQogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsNCiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgew0KICAgICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1trXSk7DQogICAgICAgICAgfQ0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7DQogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBpbml0UmVzdWx0LCBbZWwsIGRhdGEueF0pOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9KTsNCg0KICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOw0KICB9DQoNCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuDQogIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgew0KICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsNCiAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsNCiAgICB9LCBmYWxzZSk7DQogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsNCiAgICBkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKSB7DQogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgew0KICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7DQogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsNCiAgICAgIH0NCiAgICB9KTsNCiAgfQ0KDQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEF0dGFjaG1lbnRVcmwgPSBmdW5jdGlvbihkZXBuYW1lLCBrZXkpIHsNCiAgICAvLyBJZiBubyBrZXksIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGl0ZW0NCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQ0KICAgICAga2V5ID0gMTsNCg0KICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOw0KICAgIGlmICghbGluaykgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdHRhY2htZW50ICIgKyBkZXBuYW1lICsgIi8iICsga2V5ICsgIiBub3QgZm91bmQgaW4gZG9jdW1lbnQiKTsNCiAgICB9DQogICAgcmV0dXJuIGxpbmsuZ2V0QXR0cmlidXRlKCJocmVmIik7DQogIH07DQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLmRhdGFmcmFtZVRvRDMgPSBmdW5jdGlvbihkZikgew0KICAgIHZhciBuYW1lcyA9IFtdOw0KICAgIHZhciBsZW5ndGg7DQogICAgZm9yICh2YXIgbmFtZSBpbiBkZikgew0KICAgICAgICBpZiAoZGYuaGFzT3duUHJvcGVydHkobmFtZSkpDQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOw0KICAgICAgICBpZiAodHlwZW9mKGRmW25hbWVdKSAhPT0gIm9iamVjdCIgfHwgdHlwZW9mKGRmW25hbWVdLmxlbmd0aCkgPT09ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTsNCiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGgiKTsNCiAgICAgICAgfQ0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7DQogICAgfQ0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgdmFyIGl0ZW07DQogICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbGVuZ3RoOyByb3crKykgew0KICAgICAgICBpdGVtID0ge307DQogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsNCiAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXV0gPSBkZltuYW1lc1tjb2xdXVtyb3ddOw0KICAgICAgICB9DQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsNCiAgICB9DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH07DQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLnRyYW5zcG9zZUFycmF5MkQgPSBmdW5jdGlvbihhcnJheSkgew0KICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5Ow0KICAgICAgdmFyIG5ld0FycmF5ID0gYXJyYXlbMF0ubWFwKGZ1bmN0aW9uKGNvbCwgaSkgew0KICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24ocm93KSB7DQogICAgICAgICAgICAgIHJldHVybiByb3dbaV0NCiAgICAgICAgICB9KQ0KICAgICAgfSk7DQogICAgICByZXR1cm4gbmV3QXJyYXk7DQogIH07DQogIC8vIFNwbGl0IHZhbHVlIGF0IHNwbGl0Q2hhciwgYnV0IGFsbG93IHNwbGl0Q2hhciB0byBiZSBlc2NhcGVkDQogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcg0KICAvLyB3aWxsIGJlIGluY2x1ZGVkIGFzIHVzdWFsIChpbmNsdWRpbmcgZXNjYXBlQ2hhciBpdHNlbGYpLg0KICBmdW5jdGlvbiBzcGxpdFdpdGhFc2NhcGUodmFsdWUsIHNwbGl0Q2hhciwgZXNjYXBlQ2hhcikgew0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgdmFyIGVzY2FwZU1vZGUgPSBmYWxzZTsNCiAgICB2YXIgY3VycmVudFJlc3VsdCA9ICIiOw0KICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsNCiAgICAgIGlmICghZXNjYXBlTW9kZSkgew0KICAgICAgICBpZiAodmFsdWVbcG9zXSA9PT0gc3BsaXRDaGFyKSB7DQogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOw0KICAgICAgICAgIGN1cnJlbnRSZXN1bHQgPSAiIjsNCiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtwb3NdID09PSBlc2NhcGVDaGFyKSB7DQogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107DQogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsNCiAgICAgIH0NCiAgICB9DQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7DQogICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7DQogICAgfQ0KICAgIHJldHVybiByZXN1bHRzOw0KICB9DQogIC8vIEZ1bmN0aW9uIGF1dGhvcmVkIGJ5IFlpaHVpL0pKIEFsbGFpcmUNCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7DQogICAgdmFyIHBhcnRzID0gc3BsaXRXaXRoRXNjYXBlKG1lbWJlciwgJy4nLCAnXFwnKTsNCiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsNCiAgICAgIC8vIHBhcnQgbWF5IGJlIGEgY2hhcmFjdGVyIG9yICdudW1lcmljJyBtZW1iZXIgbmFtZQ0KICAgICAgaWYgKG8gIT09IG51bGwgJiYgdHlwZW9mIG8gPT09ICJvYmplY3QiICYmIHBhcnQgaW4gbykgew0KICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlDQogICAgICAgICAgaWYgKHR5cGVvZiBvW3BhcnRdID09PSAic3RyaW5nIikNCiAgICAgICAgICAgIG9bcGFydF0gPSBldmFsKCIoIiArIG9bcGFydF0gKyAiKSIpOw0KICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QNCiAgICAgICAgICBvID0gb1twYXJ0XTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfTsNCg0KICAvLyBSZXRyaWV2ZSB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuDQogIC8vIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pDQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKGVsKSB7DQogICAgcmV0dXJuIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKTsNCiAgfTsNCg0KICAvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwNCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZg0KICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQ0KICAvLyBhc3NvY2lhdGVkIHdpdGggdGhhdCBlbGVtZW50LCBpZiBhbnkuIElmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUNCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0DQogIC8vIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBpdCwgdGhlbiBudWxsIGlzIHJldHVybmVkLg0KICAvLw0KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7DQogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgew0KICAgICAgc2VsZWN0b3IgPSBzY29wZTsNCiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7DQogICAgfQ0KDQogICAgdmFyIGVsID0gc2NvcGUucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7DQogICAgaWYgKGVsID09PSBudWxsKSB7DQogICAgICByZXR1cm4gbnVsbDsNCiAgICB9IGVsc2Ugew0KICAgICAgcmV0dXJuIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShlbCk7DQogICAgfQ0KICB9Ow0KDQogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZA0KICAvLyByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlcyAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlcyBvZg0KICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQ0KICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdA0KICAvLyBtYXRjaCB0aGUgc2VsZWN0b3IgZG9uJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIEhUTUxXaWRnZXQNCiAgLy8gaW5zdGFuY2UsIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4gbnVsbHMuDQogIC8vDQogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4NCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmRBbGwgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICBzZWxlY3RvciA9IHNjb3BlOw0KICAgICAgc2NvcGUgPSBkb2N1bWVudDsNCiAgICB9DQoNCiAgICB2YXIgbm9kZXMgPSBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgIHJlc3VsdHMucHVzaCh3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2Uobm9kZXNbaV0pKTsNCiAgICB9DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH07DQoNCiAgdmFyIHBvc3RSZW5kZXJIYW5kbGVycyA9IFtdOw0KICBmdW5jdGlvbiBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKSB7DQogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsNCiAgICAgIHZhciBoYW5kbGVyID0gcG9zdFJlbmRlckhhbmRsZXJzLnNoaWZ0KCk7DQogICAgICBpZiAoaGFuZGxlcikgew0KICAgICAgICBoYW5kbGVyKCk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgLy8gUmVnaXN0ZXIgdGhlIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlDQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5hZGRQb3N0UmVuZGVySGFuZGxlciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQogICAgcG9zdFJlbmRlckhhbmRsZXJzLnB1c2goY2FsbGJhY2spOw0KICB9Ow0KDQogIC8vIFRha2VzIGEgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb24sIGFuZCByZXR1cm5zIGFuDQogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nDQogIC8vIHRvIHJld3JpdGUgYWxsIHRoZSBsb2dpYyBpbiB0aGlzIGZpbGUgdG8gYWNjb21vZGF0ZSBib3RoDQogIC8vIHR5cGVzIG9mIGRlZmluaXRpb25zLg0KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7DQogICAgdmFyIHJlc3VsdCA9IHsNCiAgICAgIG5hbWU6IGRlZm4ubmFtZSwNCiAgICAgIHR5cGU6IGRlZm4udHlwZSwNCiAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgIHJldHVybiBkZWZuLmZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpOw0KICAgICAgfSwNCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgaW5zdGFuY2UpIHsNCiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlbmRlclZhbHVlKHgpOw0KICAgICAgfSwNCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGluc3RhbmNlKSB7DQogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXNpemUod2lkdGgsIGhlaWdodCk7DQogICAgICB9DQogICAgfTsNCg0KICAgIGlmIChkZWZuLmZpbmQpDQogICAgICByZXN1bHQuZmluZCA9IGRlZm4uZmluZDsNCiAgICBpZiAoZGVmbi5yZW5kZXJFcnJvcikNCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7DQogICAgaWYgKGRlZm4uY2xlYXJFcnJvcikNCiAgICAgIHJlc3VsdC5jbGVhckVycm9yID0gZGVmbi5jbGVhckVycm9yOw0KDQogICAgcmV0dXJuIHJlc3VsdDsNCiAgfQ0KfSkoKTsNCg0K"></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsNCg0KICBuYW1lOiAnY2hhcnRzZXJpZXMnLA0KDQogIHR5cGU6ICdvdXRwdXQnLA0KDQogIGZhY3Rvcnk6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7DQoNCiAgICBmdW5jdGlvbiBjb252ZXJ0X2RhdGEoeCkgew0KICAgICAgdmFyIGRhdGEgPSB4LnhkYXRhLm1hcCggZnVuY3Rpb24oZCxpKSB7DQogICAgICAgIHZhciByb3cgPSB7fTsNCiAgICAgICAgcm93LmRhdGUgPSBuZXcgRGF0ZSh4LmRhdGVbaV0pIHx8IGk7DQogICAgICAgIHJvdy5vcGVuID0gZFswXTsNCiAgICAgICAgcm93LmhpZ2ggPSBkWzFdOw0KICAgICAgICByb3cubG93ID0gZFsyXTsNCiAgICAgICAgcm93LmNsb3NlID0gZFszXTsNCiAgICAgICAgcmV0dXJuIHJvdzsNCiAgICAgIH0pOw0KDQogICAgICByZXR1cm4gZGF0YTsNCiAgICB9DQoNCiAgICByZXR1cm4gew0KDQogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oeCkgew0KDQogICAgICAgIHZhciBkYXRhID0gY29udmVydF9kYXRhKHgpOw0KDQogICAgICAgIC8vIGZyb20gaHR0cHM6Ly9kM2ZjLmlvL2ludHJvZHVjdGlvbi9nZXR0aW5nLXN0YXJ0ZWQuaHRtbA0KICAgICAgICAvLyAgd2l0aCBtaW5vciBtb2RpZmljYXRpb25zDQoNCiAgICAgICAgdmFyIHlFeHRlbnQgPSBmYy5leHRlbnRMaW5lYXIoKQ0KICAgICAgICAgIC5hY2Nlc3NvcnMoWw0KICAgICAgICAgICAgZnVuY3Rpb24oZCkgew0KICAgICAgICAgICAgICByZXR1cm4gZC5oaWdoOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgICAgICAgcmV0dXJuIGQubG93Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgIF0pOw0KDQogICAgICAgIHZhciB4RXh0ZW50ID0gZmMuZXh0ZW50RGF0ZSgpDQogICAgICAgICAgLmFjY2Vzc29ycyhbZnVuY3Rpb24oZCkgew0KICAgICAgICAgICAgcmV0dXJuIGQuZGF0ZTsNCiAgICAgICAgICB9XSk7DQoNCiAgICAgICAgdmFyIGdyaWRsaW5lcyA9IGZjLmFubm90YXRpb25TdmdHcmlkbGluZSgpDQogICAgICAgICAgLnhEZWNvcmF0ZShmdW5jdGlvbihsaW5lcykgew0KICAgICAgICAgICAgbGluZXMNCiAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAnMC4yNXB4JykNCiAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgMik7DQogICAgICAgICAgfSkNCiAgICAgICAgICAueURlY29yYXRlKGZ1bmN0aW9uKGxpbmVzKSB7DQogICAgICAgICAgICBsaW5lcw0KICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsICcwLjI1cHgnKQ0KICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAyKTsNCiAgICAgICAgICB9KTsNCiAgICAgICAgdmFyIGNhbmRsZXN0aWNrID0gZmMuc2VyaWVzU3ZnQ2FuZGxlc3RpY2soKQ0KICAgICAgICAgIC5jcm9zc1ZhbHVlKGZ1bmN0aW9uKGQpIHtyZXR1cm4gbmV3IERhdGUoZC5kYXRlKX0pOw0KICAgICAgICB2YXIgbXVsdGkgPSBmYy5zZXJpZXNTdmdNdWx0aSgpDQogICAgICAgICAgLnNlcmllcyhbZ3JpZGxpbmVzLCBjYW5kbGVzdGlja10pOw0KDQogICAgICAgIHZhciB4U2NhbGUgPSBmYy5zY2FsZURpc2NvbnRpbnVvdXMoZDMuc2NhbGVUaW1lKCkpDQogICAgICAgICAgLmRpc2NvbnRpbnVpdHlQcm92aWRlcihmYy5kaXNjb250aW51aXR5U2tpcFdlZWtlbmRzKCkpOw0KICAgICAgICB2YXIgeVNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKTsNCg0KICAgICAgICB2YXIgZmluZF9wb2ludCA9IGZ1bmN0aW9uKHB0KSB7DQogICAgICAgICAgdmFyIHJvdyA9IGQzLmJpc2VjdFJpZ2h0KA0KICAgICAgICAgICAgZGF0YS5tYXAoZnVuY3Rpb24ocm93KXtyZXR1cm4gcm93LmRhdGU7fSksDQogICAgICAgICAgICB4U2NhbGUuaW52ZXJ0KHB0LngpDQogICAgICAgICAgKTsNCiAgICAgICAgICBpZihyb3cgPT09IGRhdGEubGVuZ3RoKSByb3cgPSByb3cgLSAxOw0KICAgICAgICAgIHZhciBkYXRhX3ByaWNlID0gZGF0YVtyb3ddOw0KICAgICAgICAgIHJldHVybiBkYXRhX3ByaWNlOw0KICAgICAgICB9Ow0KDQogICAgICAgIHZhciBjcm9zc2hhaXIgPSBmYy5hbm5vdGF0aW9uU3ZnQ3Jvc3NoYWlyKCkNCiAgICAgICAgICAueFNjYWxlKHhTY2FsZSkNCiAgICAgICAgICAueVNjYWxlKHlTY2FsZSkNCiAgICAgICAgICAueChmdW5jdGlvbihkKSB7DQogICAgICAgICAgICAvLyBkb24ndCBnbyBpbnRvIGxlZnQgYXhpcw0KICAgICAgICAgICAgcmV0dXJuIHhTY2FsZShkLmRhdGUpOw0KICAgICAgICAgIH0pDQogICAgICAgICAgLnkoZnVuY3Rpb24oZCkgew0KICAgICAgICAgICAgcmV0dXJuIHlTY2FsZShkLmNsb3NlKTsNCiAgICAgICAgICB9KQ0KICAgICAgICAgIC54TGFiZWwoZnVuY3Rpb24oZCkgew0KICAgICAgICAgICAgcmV0dXJuIGQzLnRpbWVGb3JtYXQoJyViICVkLCAlWScpKGQuZGF0ZSk7DQogICAgICAgICAgfSkNCiAgICAgICAgICAueUxhYmVsKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgICAgIHJldHVybiBkLmNsb3NlOw0KICAgICAgICAgIH0pDQogICAgICAgICAgLmRlY29yYXRlKGZ1bmN0aW9uKGVsLCBkYXRhKSB7DQogICAgICAgICAgICBlbC5zZWxlY3QoJy5yaWdodC1oYW5kbGUgdGV4dCcpDQogICAgICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdlbmQnKQ0KICAgICAgICAgICAgICAuYXR0cigneCcsIC0yKQ0KICAgICAgICAgICAgICAuYXR0cignZHknLCAnMWVtJykNCiAgICAgICAgICAgICAgLmF0dHIoJ2R4JywgJy0wLjMyZW0nKTsNCiAgICAgICAgICB9KTsNCg0KICAgICAgICB2YXIgZHJhd19jcm9zc2hhaXIgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICBkMy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICAgIGQzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOw0KDQogICAgICAgICAgdmFyIGNyb3NzaGFpcl9lbCA9IGQzLnNlbGVjdCh0aGlzKS5zZWxlY3QoIi5kM2ZjLWNyb3NzaGFpci1jb250YWluZXIiKTsNCiAgICAgICAgICB2YXIgcHQgPSBkMy5tb3VzZSh0aGlzKSB8fCBkMy50b3VjaCh0aGlzKTsNCiAgICAgICAgICB2YXIgZGF0YSA9IFtmaW5kX3BvaW50KHsgeDogcHRbMF0sIHk6IHB0WzFdIH0pXTsNCiAgICAgICAgICBjcm9zc2hhaXJfZWwuZGF0dW0oZGF0YSk7DQogICAgICAgICAgY3Jvc3NoYWlyX2VsLmNhbGwoY3Jvc3NoYWlyKTsNCiAgICAgICAgfTsNCg0KICAgICAgICB2YXIgY2hhcnQgPSBmYy5jaGFydFN2Z0NhcnRlc2lhbigNCiAgICAgICAgICB4U2NhbGUsDQogICAgICAgICAgeVNjYWxlDQogICAgICAgICkNCiAgICAgICAgICAueURvbWFpbih5RXh0ZW50KGRhdGEpKQ0KICAgICAgICAgIC54RG9tYWluKHhFeHRlbnQoZGF0YSkpDQogICAgICAgICAgLmNoYXJ0TGFiZWwoeC5uYW1lKQ0KICAgICAgICAgIC5wbG90QXJlYShtdWx0aSkNCiAgICAgICAgICAuZGVjb3JhdGUoZnVuY3Rpb24oZWwsIGRhdGEpew0KICAgICAgICAgICAgLy8gbGVmdCBhbGlnbiBjaGFydCB0aXRsZQ0KICAgICAgICAgICAgZWwuc2VsZWN0KCcuY2hhcnQtbGFiZWwnKQ0KICAgICAgICAgICAgICAuc3R5bGUoJ3RleHQtYWxpZ24nLCAnbGVmdCcpOw0KDQogICAgICAgICAgICB2YXIgY3Jvc3NoYWlyX2VsID0gZWwuc2VsZWN0KCIucGxvdC1hcmVhIHN2ZyIpDQogICAgICAgICAgICAgIC5hcHBlbmQoImciKQ0KICAgICAgICAgICAgICAuY2xhc3NlZCgiZDNmYy1jcm9zc2hhaXItY29udGFpbmVyIiwgdHJ1ZSk7DQogICAgICAgICAgICAvLyBub25lIG9mIHRoaXMgdG91Y2ggc2VlbXMgdG8gd29yaw0KICAgICAgICAgICAgLy8gIHdoaWxlIHRoZSBtb3VzZSBhdCBsZWFzdCB3b3JrcyBvbiB3aW5kb3dzDQogICAgICAgICAgICAvLyAgd2lsbCBuZWVkIHRvIHdvcmsgbW9yZSBvbiB0aGlzDQoNCiAgICAgICAgICAgIGVsLm9uKCJ0b3VjaHN0YXJ0IiwgZHJhd19jcm9zc2hhaXIpOw0KICAgICAgICAgICAgZWwub24oInRvdWNobW92ZSIsIGRyYXdfY3Jvc3NoYWlyKTsNCiAgICAgICAgICAgIGVsLm9uKCJtb3VzZW92ZXIiLCBkcmF3X2Nyb3NzaGFpcik7DQogICAgICAgICAgICBlbC5vbigibW91c2Vtb3ZlIiwgZHJhd19jcm9zc2hhaXIpOw0KICAgICAgICAgIH0pOw0KDQogICAgICAgIGQzLnNlbGVjdChlbCkNCiAgICAgICAgICAuZGF0dW0oZGF0YSkNCiAgICAgICAgICAuY2FsbChjaGFydCk7DQoNCiAgICAgIH0sDQoNCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24od2lkdGgsIGhlaWdodCkgew0KDQogICAgICAgIC8vIFRPRE86IGNvZGUgdG8gcmUtcmVuZGVyIHRoZSB3aWRnZXQgd2l0aCBhIG5ldyBzaXplDQoNCiAgICAgIH0NCg0KICAgIH07DQogIH0NCn0pOw0K"></script>
</head>
<body style="background-color:white;">
<div id="htmlwidget_container">
<div id="htmlwidget-7019ffcd016187f6133e" class="chartseries html-widget" style="width:100%;height:400px;">
</div>
</div>
<script type="application/json" data-for="htmlwidget-7019ffcd016187f6133e">{"x":{"make_pretty_labels":["function (ylim) ","{"," p <- pretty(ylim, 10)"," p[p > ylim[1] & p < ylim[2]]","}"],"theme":{"bbands":{"col":{"fill":"whitesmoke","upper":"#D5D5D5","lower":"#D5D5D5","ma":"#D5D5D5"},"lty":{"upper":"dashed","lower":"dashed","ma":"dotted"}},"shading":1,"line.col":"darkorange","up.col":null,"dn.col":"red","up.border":"#333333","dn.border":"#333333","rylab":true,"lylab":true,"bg":"#FFFFFF","grid":"#F0F0F0","grid2":"#F5F5F5","labels":"#333333","label.bg":"#F0F0F0"},"ticks.on":"months","axt":[1,5,10,14,19,24,29,34,38,43,48,52],"frame":2,"xlim":[1,52],"type":"candlesticks","name":"GSPC","xdata":[[2251.5701,2263.8799,2245.1299,2257.8301],[2261.6001,2272.8201,2261.6001,2270.75],[2268.1799,2271.5,2260.45,2269],[2271.1399,2282.1001,2264.0601,2276.98],[2273.5901,2275.49,2268.8999,2268.8999],[2269.72,2279.27,2265.27,2268.8999],[2268.6001,2275.3201,2260.8301,2275.3201],[2271.1399,2271.78,2254.25,2270.4399],[2272.74,2278.6799,2271.51,2274.6399],[2269.1399,2272.0801,2262.8101,2267.8899],[2269.1399,2272.01,2263.3501,2271.8899],[2271.8999,2274.3301,2258.4099,2263.6899],[2269.96,2276.96,2265.01,2271.3101],[2267.78,2271.78,2257.02,2265.2],[2267.8799,2284.6299,2266.6799,2280.0701],[2288.8799,2299.55,2288.8799,2298.3701],[2298.6299,2300.99,2294.0801,2296.6799],[2299.02,2299.02,2291.6201,2294.6899],[2286.01,2286.01,2268.04,2280.8999],[2274.02,2279.0901,2267.21,2278.8701],[2285.5901,2289.1399,2272.4399,2279.55],[2276.6899,2283.97,2271.6499,2280.8501],[2288.54,2298.3101,2287.8799,2297.4199],[2294.28,2296.1799,2288.5701,2292.5601],[2295.8701,2299.3999,2290.1599,2293.0801],[2289.55,2295.9099,2285.3799,2294.6699],[2296.7,2311.0801,2296.6101,2307.8701],[2312.27,2319.23,2311.1001,2316.1001],[2321.72,2331.5801,2321.4199,2328.25],[2326.1201,2337.5801,2322.1699,2337.5801],[2335.5801,2351.3,2334.8101,2349.25],[2349.6399,2351.3101,2338.8701,2347.22],[2343.01,2351.1599,2339.5801,2351.1599],[2354.9099,2366.71,2354.9099,2365.3799],[2361.1101,2365.1299,2358.3401,2362.8201],[2367.5,2368.26,2355.0901,2363.8101],[2355.73,2367.3401,2352.8701,2367.3401],[2365.23,2371.54,2361.8701,2369.73],[2366.0801,2367.79,2358.96,2363.6399],[2380.1299,2400.98,2380.1299,2395.96],[2394.75,2394.75,2380.1699,2381.9199],[2380.9199,2383.8899,2375.3899,2383.1201],[2375.23,2378.8,2367.98,2375.3101],[2370.74,2375.1201,2365.51,2368.3899],[2369.8101,2373.0901,2361.01,2362.98],[2363.49,2369.0801,2354.54,2364.8701],[2372.52,2376.8601,2363.04,2372.6001],[2371.5601,2374.4199,2368.52,2373.47],[2368.55,2368.55,2358.1799,2365.45],[2370.3401,2390.01,2368.9399,2385.26],[2387.71,2388.1001,2377.1799,2381.3799],[2383.71,2385.71,2377.6399,2378.25]],"grid.ticks.lwd":1,"alabels":[2260,2280,2300,2320,2340,2360,2380,2400],"axis_labels":["function (xdata, xsubset, scale = 5) ","{"," axTicksByValue(na.omit(xdata[xsubset]))","}"],"cex":0.6,"pad1":-0,"atbt":[1,5,10,14,19,24,29,34,38,43,48,52],"pad3":0,"mar":[3,1,0,1],"ylim":[[0,1],[2245.1299,2400.98]],"asp":[0.2,3],"xsubset":"","clev":0.01,"vo":[[3770530000],[3764890000],[3761820000],[3339890000],[3217610000],[3638790000],[3620410000],[3462130000],[3081270000],[3584990000],[3315250000],[3165970000],[3524970000],[3152710000],[3810960000],[3846020000],[3610360000],[3135890000],[3591270000],[4087450000],[3916610000],[3807710000],[3597970000],[3109050000],[3448690000],[3609740000],[3677940000],[3475020000],[3349730000],[3520910000],[3775590000],[3672370000],[3513060000],[3579780000],[3468670000],[4015260000],[3831570000],[3582610000],[4210140000],[4345180000],[3821320000],[3555260000],[3232700000],[3518390000],[3812100000],[3716340000],[3432950000],[3133900000],[3172630000],[3906840000],[3365660000],[5178040000]],"actions":[{},{},{},{},{},{},{},{},{},{}],"format.labels":true,"date":[1483401600000,1483488000000,1483574400000,1483660800000,1483920000000,1484006400000,1484092800000,1484179200000,1484265600000,1484611200000,1484697600000,1484784000000,1484870400000,1485129600000,1485216000000,1485302400000,1485388800000,1485475200000,1485734400000,1485820800000,1485907200000,1485993600000,1486080000000,1486339200000,1486425600000,1486512000000,1486598400000,1486684800000,1486944000000,1487030400000,1487116800000,1487203200000,1487289600000,1487635200000,1487721600000,1487808000000,1487894400000,1488153600000,1488240000000,1488326400000,1488412800000,1488499200000,1488758400000,1488844800000,1488931200000,1489017600000,1489104000000,1489363200000,1489449600000,1489536000000,1489622400000,1489708800000],"axis_ticks":["function (xdata, xsubset) ","{"," ticks <- diff(axTicksByTime2(xdata[xsubset], labels = FALSE))/2 + "," last(axTicksByTime2(xdata[xsubset], labels = TRUE), -1)"," if (!theme$coarse.time || length(ticks) == 1) "," return(unname(ticks))"," if (min(diff(ticks)) < max(strwidth(names(ticks)))) {"," ticks <- unname(ticks)"," }"," ticks","}"]},"evals":[],"jsHooks":[]}</script>
<script type="application/htmlwidget-sizing" data-for="htmlwidget-7019ffcd016187f6133e">{"viewer":{"width":"100%","height":400,"padding":15,"fill":false},"browser":{"width":"100%","height":400,"padding":40,"fill":false}}</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment