@sprig-technologies/sprig-browser 2.14.8 → 2.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/index.d.ts +30 -7
  2. package/index.js +697 -181
  3. package/package.json +1 -1
  4. package/LICENSE +0 -22
  5. package/controller/controller.d.ts +0 -13
  6. package/controller/controller.d.ts.map +0 -1
  7. package/controller/controller.js +0 -1061
  8. package/controller/encodedViewJs.d.ts +0 -3
  9. package/controller/encodedViewJs.d.ts.map +0 -1
  10. package/controller/encodedViewJs.js +0 -1
  11. package/controller/iframe.d.ts +0 -9
  12. package/controller/iframe.d.ts.map +0 -1
  13. package/controller/iframe.js +0 -184
  14. package/controller/index.js +0 -3
  15. package/controller/queue.d.ts +0 -2
  16. package/controller/queue.d.ts.map +0 -1
  17. package/controller/queue.js +0 -95
  18. package/index.d.ts.map +0 -1
  19. package/shared/conflicting_widgets/index.d.ts +0 -5
  20. package/shared/conflicting_widgets/index.d.ts.map +0 -1
  21. package/shared/conflicting_widgets/index.js +0 -13
  22. package/shared/conflicting_widgets/intercom.d.ts +0 -3
  23. package/shared/conflicting_widgets/intercom.d.ts.map +0 -1
  24. package/shared/conflicting_widgets/intercom.js +0 -28
  25. package/shared/constants.d.ts +0 -49
  26. package/shared/constants.d.ts.map +0 -1
  27. package/shared/constants.js +0 -65
  28. package/shared/deferred.d.ts +0 -10
  29. package/shared/deferred.d.ts.map +0 -1
  30. package/shared/deferred.js +0 -15
  31. package/shared/eventEmitter.d.ts +0 -10
  32. package/shared/eventEmitter.d.ts.map +0 -1
  33. package/shared/eventEmitter.js +0 -52
  34. package/shared/network.d.ts +0 -8
  35. package/shared/network.d.ts.map +0 -1
  36. package/shared/network.js +0 -130
  37. package/shared/networkHelper.d.ts +0 -5
  38. package/shared/networkHelper.d.ts.map +0 -1
  39. package/shared/networkHelper.js +0 -9
  40. package/shared/shouldDirectEmbed.d.ts +0 -7
  41. package/shared/shouldDirectEmbed.d.ts.map +0 -1
  42. package/shared/shouldDirectEmbed.js +0 -8
  43. package/shared/tool.d.ts +0 -3
  44. package/shared/tool.d.ts.map +0 -1
  45. package/shared/tool.js +0 -19
  46. package/shared/ulEvents.d.ts +0 -33
  47. package/shared/ulEvents.d.ts.map +0 -1
  48. package/shared/ulEvents.js +0 -45
@@ -1,3 +0,0 @@
1
- declare var _default: "LyoqKioqKi8gKGZ1bmN0aW9uKCkgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwCi8qKioqKiovIAl2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9ICh7CgovKioqLyAiLi9zcmMvc2hhcmVkL2NvbmZsaWN0aW5nX3dpZGdldHMvaW5kZXguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy9zaGFyZWQvY29uZmxpY3Rpbmdfd2lkZ2V0cy9pbmRleC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7Ci8qIGhhcm1vbnkgZXhwb3J0ICovICAgImRlZmF1bHQiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gQ29uZmxpY3RpbmdXaWRnZXRzOyB9Ci8qIGhhcm1vbnkgZXhwb3J0ICovIH0pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19jbGFzc0NhbGxDaGVja19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjayAqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19jbGFzc0NhbGxDaGVja19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfY2xhc3NDYWxsQ2hlY2tfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2NyZWF0ZUNsYXNzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2NyZWF0ZUNsYXNzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc19jcmVhdGVDbGFzc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9pbnRlcmNvbV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9pbnRlcmNvbSAqLyAiLi9zcmMvc2hhcmVkL2NvbmZsaWN0aW5nX3dpZGdldHMvaW50ZXJjb20uanMiKTsKCgoKdmFyIHdpZGdldHMgPSBbX2ludGVyY29tX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19dOwoKdmFyIENvbmZsaWN0aW5nV2lkZ2V0cyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgZnVuY3Rpb24gQ29uZmxpY3RpbmdXaWRnZXRzKCkgewogICAgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19jbGFzc0NhbGxDaGVja19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQoKSh0aGlzLCBDb25mbGljdGluZ1dpZGdldHMpOwogIH0KCiAgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19jcmVhdGVDbGFzc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fX2RlZmF1bHQoKShDb25mbGljdGluZ1dpZGdldHMsIG51bGwsIFt7CiAgICBrZXk6ICJkaXNhYmxlIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNhYmxlKCkgewogICAgICB3aWRnZXRzLmZvckVhY2goZnVuY3Rpb24gKHcpIHsKICAgICAgICByZXR1cm4gdy5kaXNhYmxlKCk7CiAgICAgIH0pOwogICAgfQogIH0sIHsKICAgIGtleTogImVuYWJsZSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZW5hYmxlKCkgewogICAgICB3aWRnZXRzLmZvckVhY2goZnVuY3Rpb24gKHcpIHsKICAgICAgICByZXR1cm4gdy5lbmFibGUoKTsKICAgICAgfSk7CiAgICB9CiAgfV0pOwoKICByZXR1cm4gQ29uZmxpY3RpbmdXaWRnZXRzOwp9KCk7CgoKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3NoYXJlZC9jb25mbGljdGluZ193aWRnZXRzL2ludGVyY29tLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvc2hhcmVkL2NvbmZsaWN0aW5nX3dpZGdldHMvaW50ZXJjb20uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwovKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgewovKiBoYXJtb255IGV4cG9ydCAqLyAgICJlbmFibGUiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gZW5hYmxlOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJkaXNhYmxlIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIGRpc2FibGU7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8qIGdsb2JhbCB3aW5kb3csIGRvY3VtZW50ICovCnZhciBnZXRJbnRlcmNvbSA9IGZ1bmN0aW9uIGdldEludGVyY29tKCkgewogIHRyeSB7CiAgICByZXR1cm4gd2luZG93LnBhcmVudC5JbnRlcmNvbTsKICB9IGNhdGNoIChlcnIpIHt9Cn07Cgp2YXIgZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkgewogIHZhciBJbnRlcmNvbSA9IGdldEludGVyY29tKCk7CiAgaWYgKCFJbnRlcmNvbSkgcmV0dXJuOwoKICBpZiAoSW50ZXJjb20udWxfd2FzVmlzaWJsZSkgewogICAgSW50ZXJjb20oJ3VwZGF0ZScsIHsKICAgICAgaGlkZV9kZWZhdWx0X2xhdW5jaGVyOiBmYWxzZQogICAgfSk7CiAgfQoKICBkZWxldGUgSW50ZXJjb20udWxfd2FzVmlzaWJsZTsKfTsKdmFyIGRpc2FibGUgPSBmdW5jdGlvbiBkaXNhYmxlKCkgewogIHZhciBJbnRlcmNvbSA9IGdldEludGVyY29tKCk7CiAgaWYgKCFJbnRlcmNvbSkgcmV0dXJuOwogIEludGVyY29tLnVsX3dhc1Zpc2libGUgPSAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZS5pbnRlcmNvbS1sYXVuY2hlci1mcmFtZScpOwoKICBpZiAoSW50ZXJjb20udWxfd2FzVmlzaWJsZSkgewogICAgSW50ZXJjb20oJ3VwZGF0ZScsIHsKICAgICAgaGlkZV9kZWZhdWx0X2xhdW5jaGVyOiB0cnVlCiAgICB9KTsKICB9Cn07CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy9zaGFyZWQvY29uc3RhbnRzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy9zaGFyZWQvY29uc3RhbnRzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwovKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgewovKiBoYXJtb255IGV4cG9ydCAqLyAgICJBUFBfTU9ERVMiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gQVBQX01PREVTOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJQQUdFX1VSTF9FVkVOVF9OQU1FIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIFBBR0VfVVJMX0VWRU5UX05BTUU7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgIkhFQURFUlMiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gSEVBREVSUzsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAiSU5TVEFMTEFUSU9OX01FVEhPRCI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBJTlNUQUxMQVRJT05fTUVUSE9EOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJDU1NfQ09OU1RBTlRTIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIENTU19DT05TVEFOVFM7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgIkVYUEVSSU1FTlRfRkxBR1MiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gRVhQRVJJTUVOVF9GTEFHUzsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAiTU9CSUxFX01BWF9XSURUSCI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBNT0JJTEVfTUFYX1dJRFRIOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJnZXRDbGFzc2VzIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIGdldENsYXNzZXM7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgImdldFBsYXRmb3JtQ2xhc3MiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gZ2V0UGxhdGZvcm1DbGFzczsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAiTU9CSUxFX1BMQVRGT1JNX0hFQURFUlMiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gTU9CSUxFX1BMQVRGT1JNX0hFQURFUlM7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8qKgogKiBWYXJpb3VzIG1vZGVzIHRoYXQgdGhlIGFwcCBjYW4gYmUgaW4uIEZvciBub3cgdGVzdCBpcyB0aGUKICogb25seSBvbmUgdGhhdCBtYXR0ZXJzCiAqIEB0eXBlIHtPYmplY3R9CiAqLwp2YXIgQVBQX01PREVTID0gewogIHRlc3Q6ICd0ZXN0Jwp9Owp2YXIgUEFHRV9VUkxfRVZFTlRfTkFNRSA9ICdwYWdlVXJsJzsKdmFyIEhFQURFUlMgPSB7CiAgRU5WSVJPTk1FTlRfSUQ6ICd4LXVsLWVudmlyb25tZW50LWlkJywKICBQQVJUTkVSX0FOT05ZTU9VU19JRDogJ3gtdWwtYW5vbnltb3VzLWlkJywKICBVU0VSX0lEOiAneC11bC11c2VyLWlkJywKICBWSVNJVE9SX0lEOiAneC11bC12aXNpdG9yLWlkJywKICBJTlNUQUxMQVRJT05fTUVUSE9EOiAneC11bC1pbnN0YWxsYXRpb24tbWV0aG9kJwp9Owp2YXIgSU5TVEFMTEFUSU9OX01FVEhPRCA9IHsKICBOUE06ICd3ZWItbnBtJywKICBHVE06ICd3ZWItZ3RtJywKICBTRUdNRU5UOiAnd2ViLXNlZ21lbnQnLAogIFNOSVBQRVQ6ICd3ZWItc25pcHBldCcKfTsKdmFyIENTU19DT05TVEFOVFMgPSB7CiAgQ1VTVE9NX1NUWUxFX1RBR19JRDogJ3VsLWN1c3RvbS1zdHlsZScsCiAgQ0FSRF9DT05UQUlORVJfQ0xBU1M6ICd1bC1jYXJkX19jb250YWluZXInLAogIFZJREVPX0NBUkRfQ0xBU1M6ICd1bC1jYXJkLS12aWRlbycsCiAgQ0xPU0VfQ09OVEFJTkVSX0NMQVNTOiAnY2xvc2UtY29udGFpbmVyJywKICBDTE9TRV9CVVRUT05fQ0xBU1M6ICdjbG9zZS1idG4nLAogIExJS0VSVF9OVU1CRVJfQ0xBU1M6ICdsaWtlcnQtbnVtYmVyJywKICBOUFNfTlVNQkVSX0NMQVNTOiAnbnBzLW51bWJlcicsCiAgQ0hPSUNFX0NMQVNTOiAnY2hvaWNlJywKICBDSE9JQ0VfTEFCRUxfQ0xBU1M6ICdzZWxlY3QtbGFiZWwnLAogIENIT0lDRV9DSEVDS0JPWF9DTEFTUzogJ3NlbGVjdC1jaGVja2JveCcsCiAgQ0hPSUNFX1JBRElPX0NMQVNTOiAnc2VsZWN0LXJhZGlvJywKICBDSE9JQ0VfR1JPVVBfQ0xBU1M6ICd1bC1jYXJkX19jaG9pY2VzJywKICBPUEVOX1RFWFRfSU5QVVQ6ICd1bC1jYXJkLXRleHRfX2lucHV0JywKICBERVNLVE9QX1NVRkZJWDogJy0tZGVza3RvcCcsCiAgTU9CSUxFX1NVRkZJWDogJy0tbW9iaWxlJywKICBRVUVTVElPTl9IRUFERVJfQ0xBU1M6ICd1bC1xdWVzdGlvbicsCiAgQ0FQVElPTl9DTEFTUzogJ3VsLWNhcHRpb24nLAogIEZBREVfSU5fQ0xBU1M6ICdmYWRlLWluLXRyYW5zaXRpb24nLAogIENBUkRfTUFJTl9DT05URU5UOiAndWwtY2FyZC1tYWluLWNvbnRlbnQnCn07CnZhciBFWFBFUklNRU5UX0ZMQUdTID0gewogIFNVUlZFWV9NT0JJTEVfU1RZTElORzogJ3N1cnZleS1tb2JpbGUtc3R5bGluZycKfTsKdmFyIE1PQklMRV9NQVhfV0lEVEggPSA1MDA7CnZhciBnZXRDbGFzc2VzID0gZnVuY3Rpb24gZ2V0Q2xhc3NlcyhiYXNlQ2xhc3MsIHVzZU1vYmlsZVN0eWxpbmcpIHsKICB2YXIgc3VmZml4ID0gdXNlTW9iaWxlU3R5bGluZyA/IENTU19DT05TVEFOVFMuTU9CSUxFX1NVRkZJWCA6IENTU19DT05TVEFOVFMuREVTS1RPUF9TVUZGSVg7CiAgcmV0dXJuIFtiYXNlQ2xhc3MgKyBzdWZmaXgsIGJhc2VDbGFzc107Cn07CnZhciBnZXRQbGF0Zm9ybUNsYXNzID0gZnVuY3Rpb24gZ2V0UGxhdGZvcm1DbGFzcyhiYXNlQ2xhc3MsIHBsYXRmb3JtKSB7CiAgcmV0dXJuIFtiYXNlQ2xhc3MsICIiLmNvbmNhdChiYXNlQ2xhc3MsICJfXyIpLmNvbmNhdChwbGF0Zm9ybSldOwp9Owp2YXIgTU9CSUxFX1BMQVRGT1JNX0hFQURFUlMgPSBbJ2lvcycsICdhbmRyb2lkJ107CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy9zaGFyZWQvZGVmZXJyZWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvc2hhcmVkL2RlZmVycmVkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2NsYXNzQ2FsbENoZWNrX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2NsYXNzQ2FsbENoZWNrX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc19jbGFzc0NhbGxDaGVja19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfY3JlYXRlQ2xhc3NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfY3JlYXRlQ2xhc3NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2NyZWF0ZUNsYXNzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18pOwoKCgp2YXIgRGVmZXJyZWQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogIGZ1bmN0aW9uIERlZmVycmVkKHBheWxvYWQpIHsKICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19jbGFzc0NhbGxDaGVja19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQoKSh0aGlzLCBEZWZlcnJlZCk7CgogICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBfdGhpcy5wYXlsb2FkID0gcGF5bG9hZDsKICAgICAgX3RoaXMucmVqZWN0ID0gcmVqZWN0OwogICAgICBfdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTsKICAgIH0pOwogIH0KCiAgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19jcmVhdGVDbGFzc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fX2RlZmF1bHQoKShEZWZlcnJlZCwgW3sKICAgIGtleTogInJlc29sdmVSZXF1ZXN0IiwKICAgIHZhbHVlOiBmdW5jdGlvbiByZXNvbHZlUmVxdWVzdChyZXN1bHQpIHsKICAgICAgdGhpcy5yZXNvbHZlKHJlc3VsdCk7CiAgICB9CiAgfV0pOwoKICByZXR1cm4gRGVmZXJyZWQ7Cn0oKTsKCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gKERlZmVycmVkKTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3NoYXJlZC9uZXR3b3JrLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvc2hhcmVkL25ldHdvcmsuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwovKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgewovKiBoYXJtb255IGV4cG9ydCAqLyAgICJraWxsTmV0d29ya1JlcXVlc3RzIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIGtpbGxOZXR3b3JrUmVxdWVzdHM7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgImdldEh0dHBIZWFkZXJzIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIGdldEh0dHBIZWFkZXJzOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJ1bEZldGNoIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIHVsRmV0Y2g7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgd2hhdHdnX2ZldGNoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISB3aGF0d2ctZmV0Y2ggKi8gIi4vbm9kZV9tb2R1bGVzL3doYXR3Zy1mZXRjaC9mZXRjaC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9jb25zdGFudHMgKi8gIi4vc3JjL3NoYXJlZC9jb25zdGFudHMuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9kZWZlcnJlZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9kZWZlcnJlZCAqLyAiLi9zcmMvc2hhcmVkL2RlZmVycmVkLmpzIik7CgoKCi8qZ2xvYmFsIGZldGNoICovCgoKCgp2YXIgX3JlcXVpcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL25ldHdvcmtIZWxwZXIgKi8gIi4vc3JjL3NoYXJlZC9uZXR3b3JrSGVscGVyLmpzIiksCiAgICBkZWxheSA9IF9yZXF1aXJlLmRlbGF5LAogICAgTkVUV09SS19DT05GSUcgPSBfcmVxdWlyZS5ORVRXT1JLX0NPTkZJRzsKCnZhciBraWxsc3dpdGNoID0gZmFsc2U7CnZhciBraWxsc3dpdGNoUmVhc29uID0gJyc7CnZhciBpc1JhdGVMaW1pdGVkID0gZmFsc2U7CnZhciBwZW5kaW5nUmVxdWVzdFF1ZXVlID0gW107CgpmdW5jdGlvbiBnZXRJbnN0YWxsYXRpb25NZXRob2RIZWFkZXIoU3ByaWcpIHsKICBpZiAoU3ByaWcuX2NvbmZpZyAmJiBTcHJpZy5fY29uZmlnLmluc3RhbGxhdGlvbk1ldGhvZCkgcmV0dXJuIFNwcmlnLl9jb25maWcuaW5zdGFsbGF0aW9uTWV0aG9kOwogIGlmIChTcHJpZy5fZ3RtKSByZXR1cm4gX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLklOU1RBTExBVElPTl9NRVRIT0QuR1RNOwogIGlmIChTcHJpZy5fc2VnbWVudCkgcmV0dXJuIF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5JTlNUQUxMQVRJT05fTUVUSE9ELlNFR01FTlQ7CiAgcmV0dXJuIF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5JTlNUQUxMQVRJT05fTUVUSE9ELlNOSVBQRVQ7Cn0KCmZ1bmN0aW9uIGtpbGxOZXR3b3JrUmVxdWVzdHMocmVhc29uKSB7CiAga2lsbHN3aXRjaCA9IHRydWU7CiAga2lsbHN3aXRjaFJlYXNvbiA9IHJlYXNvbjsKfQpmdW5jdGlvbiBnZXRIdHRwSGVhZGVycygpIHsKICB2YXIgU3ByaWcgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9OwogIHZhciBoZWFkZXJzID0gewogICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICd1c2VybGVhcC1wbGF0Zm9ybSc6ICd3ZWInLAogICAgJ3gtdWwtc2RrLXZlcnNpb24nOiAnMi4xNC40JyAvL3ZlcnNpb24gaGVyZSBkb2Vzbid0IG1hdHRlci4gaXQgaXMgc3RyaW5nLXJlcGxhY2VkIHdoZW4gY29tcGlsZWQKCiAgfTsKICBpZiAoU3ByaWcuZW52SWQpIGhlYWRlcnNbX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLkhFQURFUlMuRU5WSVJPTk1FTlRfSURdID0gU3ByaWcuZW52SWQ7CiAgaWYgKFNwcmlnLnRva2VuKSBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSAnQmVhcmVyICcgKyBTcHJpZy50b2tlbjsKICBpZiAoU3ByaWcudXNlcklkKSBoZWFkZXJzW19jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5IRUFERVJTLlVTRVJfSURdID0gU3ByaWcudXNlcklkOwogIGlmIChTcHJpZy52aXNpdG9ySWQpIGhlYWRlcnNbX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLkhFQURFUlMuVklTSVRPUl9JRF0gPSBTcHJpZy52aXNpdG9ySWQ7CiAgaWYgKFNwcmlnLnBhcnRuZXJBbm9ueW1vdXNJZCkgaGVhZGVyc1tfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uSEVBREVSUy5QQVJUTkVSX0FOT05ZTU9VU19JRF0gPSBTcHJpZy5wYXJ0bmVyQW5vbnltb3VzSWQ7CgogIGlmIChTcHJpZy5tb2JpbGVIZWFkZXJzSlNPTikgewogICAgdmFyIG1vYmlsZUhlYWRlcnMgPSBKU09OLnBhcnNlKFNwcmlnLm1vYmlsZUhlYWRlcnNKU09OKTsKICAgIE9iamVjdC5hc3NpZ24oaGVhZGVycywgbW9iaWxlSGVhZGVycyk7CiAgfQoKICBoZWFkZXJzW19jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5IRUFERVJTLklOU1RBTExBVElPTl9NRVRIT0RdID0gZ2V0SW5zdGFsbGF0aW9uTWV0aG9kSGVhZGVyKFNwcmlnKTsKICBpZiAoU3ByaWcubG9jYWxlKSBoZWFkZXJzWydhY2NlcHQtbGFuZ3VhZ2UnXSA9IFNwcmlnLmxvY2FsZTsgLy8gY3VzdG9tIHNldCBsb2NhbGUgb3ZlcnJpZGVzIG9yaWdpbmFsIGhlYWRlciBsb2NhbGVzCgogIHJldHVybiBoZWFkZXJzOwp9CgpmdW5jdGlvbiBkcm9wT3JRdWV1ZVJlcXVlc3QoX3gsIF94MiwgX3gzKSB7CiAgcmV0dXJuIF9kcm9wT3JRdWV1ZVJlcXVlc3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfQoKZnVuY3Rpb24gX2Ryb3BPclF1ZXVlUmVxdWVzdCgpIHsKICBfZHJvcE9yUXVldWVSZXF1ZXN0ID0gX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpKCAvKiNfX1BVUkVfXyovX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkubWFyayhmdW5jdGlvbiBfY2FsbGVlKHNob3VsZERyb3BPblJhdGVMaW1pdCwgaXNSYXRlTGltaXRSZXRyeSwgcmVxdWVzdEluZm8pIHsKICAgIHZhciBkZWZlcnJlZFJlcXVlc3Q7CiAgICByZXR1cm4gX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICB3aGlsZSAoMSkgewogICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgaWYgKCFzaG91bGREcm9wT25SYXRlTGltaXQpIHsKICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgewogICAgICAgICAgICAgIHN0YXR1czogNDI5CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgZGVmZXJyZWRSZXF1ZXN0ID0gbmV3IF9kZWZlcnJlZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJkZWZhdWx0Il0ocmVxdWVzdEluZm8pOwogICAgICAgICAgICBwZW5kaW5nUmVxdWVzdFF1ZXVlLnB1c2goZGVmZXJyZWRSZXF1ZXN0KTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgZGVmZXJyZWRSZXF1ZXN0LnByb21pc2UpOwoKICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCBfY2FsbGVlKTsKICB9KSk7CiAgcmV0dXJuIF9kcm9wT3JRdWV1ZVJlcXVlc3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfQoKZnVuY3Rpb24gdWxGZXRjaChfeDQsIF94NSkgewogIHJldHVybiBfdWxGZXRjaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwp9CgpmdW5jdGlvbiBfdWxGZXRjaCgpIHsKICBfdWxGZXRjaCA9IF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfYXN5bmNUb0dlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fX2RlZmF1bHQoKSggLyojX19QVVJFX18qL19iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTModXJsLCBvcHRpb25zKSB7CiAgICB2YXIgYXR0ZW1wdCwKICAgICAgICBzaG91bGREcm9wT25SYXRlTGltaXQsCiAgICAgICAgc2hvdWxkUmV0cnlSZXF1ZXN0LAogICAgICAgIHJlcXVlc3RJbmZvLAogICAgICAgIGtpbGxzd2l0Y2hSZXNwb25zZSwKICAgICAgICByZXN1bHQsCiAgICAgICAgc2hvdWxkUmV0cnlDdXJyZW50UmVxdWVzdCwKICAgICAgICByYXRlTGltaXRSZXNldFRpbWUsCiAgICAgICAgcmVzcG9uc2VUZXh0LAogICAgICAgIG5ld0F0dGVtcHQsCiAgICAgICAgX2FyZ3MzID0gYXJndW1lbnRzOwogICAgcmV0dXJuIF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0MykgewogICAgICB3aGlsZSAoMSkgewogICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBhdHRlbXB0ID0gX2FyZ3MzLmxlbmd0aCA+IDIgJiYgX2FyZ3MzWzJdICE9PSB1bmRlZmluZWQgPyBfYXJnczNbMl0gOiAwOwogICAgICAgICAgICBzaG91bGREcm9wT25SYXRlTGltaXQgPSBfYXJnczMubGVuZ3RoID4gMyAmJiBfYXJnczNbM10gIT09IHVuZGVmaW5lZCA/IF9hcmdzM1szXSA6IGZhbHNlOwogICAgICAgICAgICBzaG91bGRSZXRyeVJlcXVlc3QgPSBfYXJnczMubGVuZ3RoID4gNCAmJiBfYXJnczNbNF0gIT09IHVuZGVmaW5lZCA/IF9hcmdzM1s0XSA6IGZhbHNlOwogICAgICAgICAgICAvLyBkcm9wIG9yIHF1ZXVlIHJlcXVlc3QgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmF0ZSBsaW1pdCBzdGF0dXMKICAgICAgICAgICAgcmVxdWVzdEluZm8gPSB7CiAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgb3B0aW9uczogb3B0aW9ucywKICAgICAgICAgICAgICBhdHRlbXB0OiBhdHRlbXB0LAogICAgICAgICAgICAgIHNob3VsZERyb3BPblJhdGVMaW1pdDogc2hvdWxkRHJvcE9uUmF0ZUxpbWl0CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoIShpc1JhdGVMaW1pdGVkICYmICFzaG91bGRSZXRyeVJlcXVlc3QpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA2OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIiwgZHJvcE9yUXVldWVSZXF1ZXN0KHNob3VsZERyb3BPblJhdGVMaW1pdCwgc2hvdWxkUmV0cnlSZXF1ZXN0LCByZXF1ZXN0SW5mbykpOwoKICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAga2lsbHN3aXRjaFJlc3BvbnNlID0gewogICAgICAgICAgICAgIG9rOiBmYWxzZSwKICAgICAgICAgICAgICByZXBvcnRFcnJvcjogZmFsc2UKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICgha2lsbHN3aXRjaCkgewogICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMTA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJVc2VyTGVhcCAtICIuY29uY2F0KGtpbGxzd2l0Y2hSZWFzb24pKTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIGtpbGxzd2l0Y2hSZXNwb25zZSk7CgogICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgX2NvbnRleHQzLnByZXYgPSAxMDsKICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbihnZXRIdHRwSGVhZGVycygpLCBvcHRpb25zLmhlYWRlcnMpOwogICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDE0OwogICAgICAgICAgICByZXR1cm4gZmV0Y2godXJsLCBvcHRpb25zKTsKCiAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICByZXN1bHQgPSBfY29udGV4dDMuc2VudDsKCiAgICAgICAgICAgIGlmICghKHJlc3VsdC5zdGF0dXMgPT09IDQyOSkpIHsKICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDI0OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyByZXRyeSBpZiByYXRlIGxpbWl0IGlzIG5vdCBpbiBlZmZlY3QgeWV0IGFuZCB0aGUgcmVxdWVzdCBpcyBub3QgZHJvcHBhYmxlCiAgICAgICAgICAgIHNob3VsZFJldHJ5Q3VycmVudFJlcXVlc3QgPSAhaXNSYXRlTGltaXRlZCAmJiAhc2hvdWxkRHJvcE9uUmF0ZUxpbWl0IHx8IHNob3VsZFJldHJ5UmVxdWVzdDsKCiAgICAgICAgICAgIGlmICghc2hvdWxkUmV0cnlDdXJyZW50UmVxdWVzdCkgewogICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjM7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlzUmF0ZUxpbWl0ZWQgPSB0cnVlOwogICAgICAgICAgICByYXRlTGltaXRSZXNldFRpbWUgPSByZXN1bHQuaGVhZGVycy5oYXMoJ3JhdGVsaW1pdC1yZXNldCcpID8gTnVtYmVyKHJlc3VsdC5oZWFkZXJzLmdldCgncmF0ZWxpbWl0LXJlc2V0JykpIDogTkVUV09SS19DT05GSUcuUkFURUxJTUlUX1JFU0VUX0RFRkFVTFQ7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCBkZWxheShyYXRlTGltaXRSZXNldFRpbWUgKiAxMDAwKS50aGVuKCAvKiNfX1BVUkVfXyovX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpKCAvKiNfX1BVUkVfXyovX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMigpIHsKICAgICAgICAgICAgICByZXR1cm4gX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdCgicmV0dXJuIiwgdWxGZXRjaCh1cmwsIG9wdGlvbnMsIDAsIHNob3VsZERyb3BPblJhdGVMaW1pdCwgdHJ1ZSkpOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwgX2NhbGxlZTIpOwogICAgICAgICAgICB9KSkpKTsKCiAgICAgICAgICBjYXNlIDIzOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdCgicmV0dXJuIiwgZHJvcE9yUXVldWVSZXF1ZXN0KHNob3VsZERyb3BPblJhdGVMaW1pdCwgZmFsc2UsIHJlcXVlc3RJbmZvKSk7CgogICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgaXNSYXRlTGltaXRlZCA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKHBlbmRpbmdSZXF1ZXN0UXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgcGVuZGluZ1JlcXVlc3RRdWV1ZS5tYXAoZnVuY3Rpb24gKGRlZmVycmVkUmVxdWVzdCkgewogICAgICAgICAgICAgICAgdmFyIF9kZWZlcnJlZFJlcXVlc3QkcGF5bCA9IGRlZmVycmVkUmVxdWVzdC5wYXlsb2FkLAogICAgICAgICAgICAgICAgICAgIHVybCA9IF9kZWZlcnJlZFJlcXVlc3QkcGF5bC51cmwsCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IF9kZWZlcnJlZFJlcXVlc3QkcGF5bC5vcHRpb25zLAogICAgICAgICAgICAgICAgICAgIGF0dGVtcHQgPSBfZGVmZXJyZWRSZXF1ZXN0JHBheWwuYXR0ZW1wdCwKICAgICAgICAgICAgICAgICAgICBzaG91bGREcm9wT25SYXRlTGltaXQgPSBfZGVmZXJyZWRSZXF1ZXN0JHBheWwuc2hvdWxkRHJvcE9uUmF0ZUxpbWl0OwogICAgICAgICAgICAgICAgdWxGZXRjaCh1cmwsIG9wdGlvbnMsIGF0dGVtcHQsIHNob3VsZERyb3BPblJhdGVMaW1pdCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgIGRlZmVycmVkUmVxdWVzdC5yZXNvbHZlUmVxdWVzdChyZXN1bHQpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgcGVuZGluZ1JlcXVlc3RRdWV1ZSA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXJlc3VsdC5vaykgewogICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gNDE7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghKHJlc3VsdC5zdGF0dXMgPT09IDI0OSkpIHsKICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDMwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBraWxsTmV0d29ya1JlcXVlc3RzKCk7CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCBraWxsc3dpdGNoUmVzcG9uc2UpOwoKICAgICAgICAgIGNhc2UgMzA6CiAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMzI7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGV4dCgpOwoKICAgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgIHJlc3BvbnNlVGV4dCA9IF9jb250ZXh0My5zZW50OwogICAgICAgICAgICBfY29udGV4dDMucHJldiA9IDMzOwoKICAgICAgICAgICAgaWYgKHJlc3BvbnNlVGV4dCAmJiByZXNwb25zZVRleHQgIT09ICdPSycpIHsKICAgICAgICAgICAgICByZXN1bHQuanNvbiA9IEpTT04ucGFyc2UocmVzcG9uc2VUZXh0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIHJlc3VsdCk7CgogICAgICAgICAgY2FzZSAzODoKICAgICAgICAgICAgX2NvbnRleHQzLnByZXYgPSAzODsKICAgICAgICAgICAgX2NvbnRleHQzLnQwID0gX2NvbnRleHQzWyJjYXRjaCJdKDMzKTsKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBvazogZmFsc2UsCiAgICAgICAgICAgICAgcmVwb3J0RXJyb3I6IHRydWUsCiAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcigiZmFpbGVkIHBhcnNpbmcgcmVzcG9uc2UganNvbiBmb3IgIi5jb25jYXQodXJsLCAiIC0gIikuY29uY2F0KHJlc3BvbnNlVGV4dCkpCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgIGNhc2UgNDE6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KCJyZXR1cm4iLCByZXN1bHQpOwoKICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgIF9jb250ZXh0My5wcmV2ID0gNDQ7CiAgICAgICAgICAgIF9jb250ZXh0My50MSA9IF9jb250ZXh0M1siY2F0Y2giXSgxMCk7CiAgICAgICAgICAgIC8vcmV0cnkKICAgICAgICAgICAgbmV3QXR0ZW1wdCA9IGF0dGVtcHQgKyAxOwoKICAgICAgICAgICAgaWYgKCEobmV3QXR0ZW1wdCA+IDIpKSB7CiAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA0OTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIHsKICAgICAgICAgICAgICBvazogZmFsc2UsCiAgICAgICAgICAgICAgcmVwb3J0RXJyb3I6IGZhbHNlLAogICAgICAgICAgICAgIGVycm9yOiBfY29udGV4dDMudDEKICAgICAgICAgICAgfSk7CgogICAgICAgICAgY2FzZSA0OToKICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoInJldHVybiIsIGRlbGF5KG5ld0F0dGVtcHQgKiAxMDAwKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICByZXR1cm4gdWxGZXRjaCh1cmwsIG9wdGlvbnMsIG5ld0F0dGVtcHQpOwogICAgICAgICAgICB9KSk7CgogICAgICAgICAgY2FzZSA1MDoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwgX2NhbGxlZTMsIG51bGwsIFtbMTAsIDQ0XSwgWzMzLCAzOF1dKTsKICB9KSk7CiAgcmV0dXJuIF91bEZldGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn0KCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3NoYXJlZC9uZXR3b3JrSGVscGVyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvc2hhcmVkL25ldHdvcmtIZWxwZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwovKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgewovKiBoYXJtb255IGV4cG9ydCAqLyAgICJkZWxheSI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBkZWxheTsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAiTkVUV09SS19DT05GSUciOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gTkVUV09SS19DT05GSUc7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7CmZ1bmN0aW9uIGRlbGF5KHQsIHYpIHsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgIHNldFRpbWVvdXQocmVzb2x2ZS5iaW5kKG51bGwsIHYpLCB0KTsKICB9KTsKfQp2YXIgTkVUV09SS19DT05GSUcgPSB7CiAgUkFURUxJTUlUX1JFU0VUX0RFRkFVTFQ6IDEwIC8vIDEwcyB0byByZXN0YXJ0IHJhdGUgbGltaXQgcmV0cnkKCn07CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy9zaGFyZWQvc2hvdWxkRGlyZWN0RW1iZWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvc2hhcmVkL3Nob3VsZERpcmVjdEVtYmVkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7Ci8qIGhhcm1vbnkgZXhwb3J0ICovICAgImRlZmF1bHQiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gc2hvdWxkRGlyZWN0RW1iZWQ7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8qKgogKiBHZXQgdHJ1ZSBvciBmYWxzZSBmb3Igd2hldGhlciB0byBkaXJlY3QgZW1iZWQgZnJvbSBwbGF0Zm9ybSBoZWFkZXJzCiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucyA9IHt9XQogKiBAcmV0dXJuIHtPYmplY3R9IFVzZXIgbWV0YSBpbmZvcm1hdGlvbgogKi8KZnVuY3Rpb24gc2hvdWxkRGlyZWN0RW1iZWQoX3JlZikgewogIHZhciBwbGF0Zm9ybSA9IF9yZWZbJ3VzZXJsZWFwLXBsYXRmb3JtJ107CiAgcmV0dXJuIHBsYXRmb3JtICE9PSAnd2ViJzsKfQoKLyoqKi8gfSksCgovKioqLyAiLi9zcmMvc2hhcmVkL3Rvb2wuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy9zaGFyZWQvdG9vbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7Ci8qIGhhcm1vbnkgZXhwb3J0ICovICAgIm92ZXJyaWRlU3R5bGVzIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIG92ZXJyaWRlU3R5bGVzOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJjYWxjdWxhdGVGcmFtZUhlaWdodCI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBjYWxjdWxhdGVGcmFtZUhlaWdodDsgfQovKiBoYXJtb255IGV4cG9ydCAqLyB9KTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vY29uc3RhbnRzICovICIuL3NyYy9zaGFyZWQvY29uc3RhbnRzLmpzIik7Ci8vIGZvciBzaGFyZWQgZnVuY3Rpb25zIGFjcm9zcyB0aGUgc2RrCgp2YXIgb3ZlcnJpZGVTdHlsZXMgPSBmdW5jdGlvbiBvdmVycmlkZVN0eWxlcyhkb2N1bWVudCwgc3R5bGVTdHJpbmcpIHsKICB2YXIgb3ZlcnJpZGVTdHlsZXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogIG92ZXJyaWRlU3R5bGVzLnR5cGUgPSAndGV4dC9jc3MnOwogIG92ZXJyaWRlU3R5bGVzLnRleHRDb250ZW50ID0gc3R5bGVTdHJpbmc7CiAgb3ZlcnJpZGVTdHlsZXMuaWQgPSBfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uQ1NTX0NPTlNUQU5UUy5DVVNUT01fU1RZTEVfVEFHX0lEOwogIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQob3ZlcnJpZGVTdHlsZXMpOwp9Owp2YXIgY2FsY3VsYXRlRnJhbWVIZWlnaHQgPSBmdW5jdGlvbiBjYWxjdWxhdGVGcmFtZUhlaWdodChkb2N1bWVudCkgewogIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLkNTU19DT05TVEFOVFMuQ0FSRF9DT05UQUlORVJfQ0xBU1MpKTsKICB2YXIgY29udGFpbmVySGVpZ2h0ID0gY29udGFpbmVyID8gY29udGFpbmVyLnNjcm9sbEhlaWdodCA6IDYwMDsKICB2YXIgd2hpdGVTcGFjZSA9IGNvbnRhaW5lciAmJiBjb250YWluZXIucGFyZW50RWxlbWVudCA/IGNvbnRhaW5lci5wYXJlbnRFbGVtZW50LmNsaWVudEhlaWdodCAtIGNvbnRhaW5lci5jbGllbnRIZWlnaHQgOiAwOwogIHJldHVybiBjb250YWluZXJIZWlnaHQgKyB3aGl0ZVNwYWNlOwp9OwoKLyoqKi8gfSksCgovKioqLyAiLi9zcmMvc2hhcmVkL3VsRXZlbnRzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3NoYXJlZC91bEV2ZW50cy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwovKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgewovKiBoYXJtb255IGV4cG9ydCAqLyAgICJ1bEV2ZW50cyI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyB1bEV2ZW50czsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAiaW50ZXJuYWxFdmVudHMiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gaW50ZXJuYWxFdmVudHM7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgIkRJU01JU1NfUkVBU09OUyI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBESVNNSVNTX1JFQVNPTlM7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgIlNVUlZFWV9TVEFURSI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBTVVJWRVlfU1RBVEU7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8vIFVzZXJMZWFwIGV2ZW50IGNvbnN0YW50cwovLyBldmVudCBjb252ZW50aW9uCi8vIGV2ZW50IG5hbWU6IGRlc2NyaXB0aXZlIG5hbWUgb2YgdGhlIGV2ZW50IHRoYXQgaGFwcGVuZWQKLy8gIHBheWxvYWQ6IHsKLy8gICAgbmFtZTogJ2V2ZW50IG5hbWUnLAovLyAgICBkZXNjcmlwdGl2ZURhdGFOYW1lOiBkYXRhCi8vICB9CnZhciB1bEV2ZW50cyA9IHsKICAvLyBwYXNzaW5nIGludG8gY29udHJvbGxlcgogIFNVUlZFWV9MSUZFX0NZQ0xFOiAnc3VydmV5LmxpZmVDeWNsZScsCiAgU1VSVkVZX0RJTUVOU0lPTlM6ICdzdXJ2ZXkuZGltZW5zaW9ucycsCiAgU1VSVkVZX0hFSUdIVDogJ3N1cnZleS5oZWlnaHQnLAogIFNVUlZFWV9QUkVTRU5URUQ6ICdzdXJ2ZXkucHJlc2VudGVkJywKICBTVVJWRVlfQVBQRUFSRUQ6ICdzdXJ2ZXkuYXBwZWFyZWQnLAogIFNVUlZFWV9GQURJTkdfT1VUOiAnc3VydmV5LmZhZGluZ091dCcsCiAgU1VSVkVZX1dJTExfQ0xPU0U6ICdzdXJ2ZXkud2lsbENsb3NlJywKICBTVVJWRVlfQ0xPU0VEOiAnc3VydmV5LmNsb3NlZCcsCiAgU0RLX1JFQURZOiAnc2RrLnJlYWR5JywKICAvLyBwYXNzaW5nIGludG8gdmlldwogIENMT1NFX1NVUlZFWV9PTl9PVkVSTEFZX0NMSUNLOiAnY2xvc2Uuc3VydmV5Lm92ZXJsYXlDbGljaycsCiAgVklTSVRPUl9JRF9VUERBVEVEOiAndmlzaXRvci5pZC51cGRhdGVkJwp9OyAvLyBldmVudHMgbm90IGVtaXR0ZWQgZXh0ZXJuYWxseSBhbmQgbm90IGluIHRoZSBkb2N1bWVudGF0aW9uCgp2YXIgaW50ZXJuYWxFdmVudHMgPSB7CiAgbmFtZTogewogICAgVkVSSUZZX1ZJRVdfVkVSU0lPTjogJ3ZlcmlmeS52aWV3LnZlcnNpb24nCiAgfSwKICBkYXRhOiB7CiAgICBWSUVXX1ZFUlNJT046ICd2aWV3LnZlcnNpb24nCiAgfQp9Owp2YXIgRElTTUlTU19SRUFTT05TID0gewogIENMT1NFRDogJ2Nsb3NlLmNsaWNrJywKICAvLyB1c2VyIGNsaWNrZWQgdGhlIGNsb3NlIGJ1dHRvbgogIENPTVBMRVRFOiAnc3VydmV5LmNvbXBsZXRlZCcsCiAgLy8gdXNlciBhbnN3ZXJlZCBhbGwgcXVlc3Rpb25zCiAgUEFHRV9DSEFOR0U6ICdwYWdlLmNoYW5nZScsCiAgLy8gcHJvZHVjdENvbmZpZy5kaXNtaXNzT25QYWdlQ2hhbmdlID09IHRydWUgYW5kIHdlIGRldGVjdGVkIGEgcGFnZSBjaGFuZ2UgKGV4Y2x1ZGVzIGhhc2gvcXVlcnkgcGFyYW0gY2hhbmdlcykKICBBUEk6ICdhcGknLAogIC8vIEpTIGNhbGxlZCBTcHJpZygnZGlzbWlzc0FjdGl2ZVN1cnZleScpCiAgT1ZFUlJJREU6ICdvdmVycmlkZScgLy8gSlMgY2FsbGVkIFNwcmlnKCdkaXNwbGF5U3VydmV5JywgU1VSVkVZX0lEKQoKfTsKdmFyIFNVUlZFWV9TVEFURSA9IHsKICBSRUFEWTogJ3JlYWR5JywKICBOT19TVVJWRVk6ICdubyBzdXJ2ZXknCn07CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy92aWV3L0FwcC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvQXBwLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19leHRlbmRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHMgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcy5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19leHRlbmRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc19leHRlbmRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheS5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGh5cGVyYXBwICovICIuL25vZGVfbW9kdWxlcy9oeXBlcmFwcC9zcmMvaW5kZXguanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjbGFzc2NhdCAqLyAiLi9ub2RlX21vZHVsZXMvY2xhc3NjYXQvc3JjL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vc2hhcmVkL2NvbnN0YW50cyAqLyAiLi9zcmMvc2hhcmVkL2NvbnN0YW50cy5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfY29tcG9uZW50c19Gb290ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEAvdmlldy9jb21wb25lbnRzL0Zvb3RlciAqLyAiLi9zcmMvdmlldy9jb21wb25lbnRzL0Zvb3Rlci5qcyIpOwoKCgoKCgpmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSAidW5kZWZpbmVkIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1siQEBpdGVyYXRvciJdOyBpZiAoIWl0KSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBpdC5jYWxsKG8pOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0LnJldHVybiAhPSBudWxsKSBpdC5yZXR1cm4oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfQoKZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSAiQXJndW1lbnRzIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH0KCmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfQoKCgoKIC8vIGltcG9ydCBjbG9zZUljb24gZnJvbSAnLi9hc3NldHMvY2xvc2Uuc3ZnJzsKCi8qKgogKiBAY29uc3Qge1N0cmluZ30gRGVjayBpZAogKi8KCnZhciBhcHBJZCA9ICd1bC1hcHAnOwovKioKICogRnJhbWUgYXBwbGljYXRpb24KICogQHJldHVybiB7RnVuY3Rpb259IEZyYW1lIGFwcAogKi8KCnZhciBBcHAgPSBmdW5jdGlvbiBBcHAoX3JlZiwgYWN0aW9ucykgewogIHZhciBhcHAgPSBfcmVmLmFwcDsKCiAgLy8gSWYgYXBwbGljYXRpb24gaGFzIHN0b3BwZWQgcnVubmluZywgc2h1dCBpdCBkb3duCiAgaWYgKCFhcHAucnVubmluZykgewogICAgYWN0aW9ucy5kZXN0cm95KGFwcElkKTsKICB9CgogIHZhciBfYXBwJGRlY2skY2FyZHMkYXBwJGQgPSBhcHAuZGVjay5jYXJkc1thcHAuZGVjay5pbmRleF0sCiAgICAgIENhcmQgPSBfYXBwJGRlY2skY2FyZHMkYXBwJGQuQ2FyZCwKICAgICAgcHJvcHMgPSBfYXBwJGRlY2skY2FyZHMkYXBwJGQucHJvcHMsCiAgICAgIHR5cGUgPSBfYXBwJGRlY2skY2FyZHMkYXBwJGQudHlwZSwKICAgICAgbmFtZSA9IF9hcHAkZGVjayRjYXJkcyRhcHAkZC5uYW1lOwogIHZhciBib3JkZXIgPSBhcHAuYm9yZGVyOwogIC8qKgogICAqIERpc3BhdGNoIHRvIGZyYW1lIHBhcmVudCB0aGF0IGFwcCBoYXMgcmVuZGVyZWQKICAgKi8KCiAgdmFyIG9uQ3JlYXRlID0gZnVuY3Rpb24gb25DcmVhdGUoZWwpIHsKICAgIHZhciB0cmFuc2l0aW9ucyA9IFsndHJhbnNpdGlvbmVuZCcsICd3ZWJraXRUcmFuc2l0aW9uRW5kJywgJ21velRyYW5zaXRpb25FbmQnXTsKICAgIHZhciB0cmFuc2l0aW9uRW5kZWQgPSBmYWxzZTsKCiAgICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIGhhbmRsZXIoKSB7CiAgICAgIC8vIG11bHRpcGxlIHRyYW5zaXRpb25FbmQgZXZlbnRzIG1heSBmaXJlLAogICAgICAvLyBzbyBvbmx5IGxldCB0aGUgcmVuZGVyZWQgZXZlbnQgZmlyZSBvbmNlCiAgICAgIGlmICghdHJhbnNpdGlvbkVuZGVkICYmIHdpbmRvdy5mcmFtZUVsZW1lbnQpIHsKICAgICAgICB2YXIgZXZlbnQgPSBuZXcgRXZlbnQoJ3VsOmZyYW1lOnJlbmRlcmVkJyk7CiAgICAgICAgd2luZG93LmZyYW1lRWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgfQoKICAgICAgdHJhbnNpdGlvbkVuZGVkID0gdHJ1ZTsKICAgICAgdHJhbnNpdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAodHJhbnNpdGlvbikgewogICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJhbnNpdGlvbiwgaGFuZGxlcik7CiAgICAgIH0pOyAvL3RyaWdnZXIgYW4gdXBkYXRlIGFmdGVyIHRyYW5zaXRpb25zIGFyZSBjb21wbGV0ZQogICAgICAvL3NwZWNpZmljYWxseSwgZm9udCBsb2FkaW5nIHRoYXQgY2FuIGNoYW5nZSBkaW1lbnNpb25zIG9mIHRoZSBjb250YWluZXIKCiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBhY3Rpb25zLnVwZGF0ZShhcHBJZCk7CiAgICAgIH0sIDMwMCk7CiAgICB9OwoKICAgIHRyYW5zaXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHRyYW5zaXRpb24pIHsKICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcih0cmFuc2l0aW9uLCBoYW5kbGVyKTsKICAgIH0pOwogICAgYXBwLmNvbmZpZ3VyZUV4aXRPbk92ZXJsYXlDbGljayhmdW5jdGlvbiAoKSB7CiAgICAgIGFjdGlvbnMuY2xvc2UoYXBwSWQpOwogICAgfSk7CiAgICBhY3Rpb25zLnVwZGF0ZShhcHBJZCk7CiAgfTsKICAvKioKICAgKiBEaXNwYXRjaCB0byBmcmFtZSBwYXJlbnQgdGhhdCBhcHAgaXMgY2xvc2luZwogICAqLwoKCiAgdmFyIGNsb3NlQXBwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIHZhciBfcmVmMiA9IF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfYXN5bmNUb0dlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fX2RlZmF1bHQoKSggLyojX19QVVJFX18qL19iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19fZGVmYXVsdCgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKICAgICAgcmV0dXJuIF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19fZGVmYXVsdCgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7CiAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnMuY2xvc2UoYXBwSWQpOwoKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LCBfY2FsbGVlKTsKICAgIH0pKTsKCiAgICByZXR1cm4gZnVuY3Rpb24gY2xvc2VBcHAoKSB7CiAgICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9KCk7CiAgLyoqCiAgICogQ2xvc2UgYXBwIGlmIHVzZXIgdXNlcyBlbnRlciBrZXkKICAgKi8KCgogIHZhciBvbktleVByZXNzQ2xvc2VBcHAgPSBmdW5jdGlvbiBvbktleVByZXNzQ2xvc2VBcHAoZSkgewogICAgaWYgKGUua2V5Q29kZSA9PSAxMykgY2xvc2VBcHAoKTsKICB9OwoKICB2YXIgc3RlcHMgPSBhcHAuZGVjay5jYXJkczsKICB2YXIgY3VycmVudFN0ZXAgPSBhcHAuZGVjay5pbmRleDsKICB2YXIgZGl2U3R5bGUgPSBhcHAuZm9udEZhbWlseSA/IHsKICAgIGZvbnRGYW1pbHk6IGFwcC5mb250RmFtaWx5LnJlcGxhY2UoJzsnLCAnJykKICB9IDoge307CiAgdmFyIGVuZENhcmQgPSBhcHAuZW5kQ2FyZDsKCiAgdmFyIG5leHRGdW5jdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICB2YXIgX3JlZjMgPSBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2FzeW5jVG9HZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX19kZWZhdWx0KCkoIC8qI19fUFVSRV9fKi9fYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fX2RlZmF1bHQoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKGRhdGEpIHsKICAgICAgcmV0dXJuIF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19fZGVmYXVsdCgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgIC8vIG5leHRGdW5jdGlvbiBpbmNsdWRlcyB0aGUgbm9ybWFsIG5leHQgZnVuY3Rpb24gd2l0aCBhIGNvbXBsZXRlU3VydmV5IHJvdXRpbmUgdG8gY2FsbCB3aGVuIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzdXJ2ZXkKICAgICAgICAgICAgICBhY3Rpb25zLmFwcC5uZXh0KHsKICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsCiAgICAgICAgICAgICAgICBjb21wbGV0ZVN1cnZleTogZnVuY3Rpb24gY29tcGxldGVTdXJ2ZXkoKSB7CiAgICAgICAgICAgICAgICAgIGFjdGlvbnMuZGVzdHJveShhcHBJZCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZW5kQ2FyZDogZW5kQ2FyZAogICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZTIpOwogICAgfSkpOwoKICAgIHJldHVybiBmdW5jdGlvbiBuZXh0RnVuY3Rpb24oX3gpIHsKICAgICAgcmV0dXJuIF9yZWYzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0oKTsKCiAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGFwcC5hbnN3ZXJzIHx8IFtdKSwKICAgICAgX3N0ZXA7CgogIHRyeSB7CiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCgpIHsKICAgICAgdmFyIGFuc3dlciA9IF9zdGVwLnZhbHVlOwoKICAgICAgaWYgKGFuc3dlci5xdWVzdGlvbklkID09PSBuYW1lKSB7CiAgICAgICAgdmFyIGRhdGE7CgogICAgICAgIGlmICh0eXBlID09PSAnbXVsdGlwbGVjaG9pY2UnKSB7CiAgICAgICAgICB2YXIgb3B0aW9uID0gcHJvcHMub3B0aW9ucy5maW5kKGZ1bmN0aW9uIChfcmVmNCkgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBfcmVmNC52YWx1ZTsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSBhbnN3ZXIudmFsdWU7CiAgICAgICAgICB9KTsKICAgICAgICAgIGlmICghb3B0aW9uKSByZXR1cm4gImJyZWFrIjsKICAgICAgICAgIGRhdGEgPSBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCgpKHt9LCBvcHRpb24uaWQsIG9wdGlvbi52YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRhdGEgPSBhbnN3ZXIudmFsdWU7CiAgICAgICAgfQoKICAgICAgICBuZXh0RnVuY3Rpb24oewogICAgICAgICAgdmFsdWU6IGRhdGEKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gImJyZWFrIjsKICAgICAgfQogICAgfTsKCiAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykgewogICAgICB2YXIgX3JldCA9IF9sb29wKCk7CgogICAgICBpZiAoX3JldCA9PT0gImJyZWFrIikgYnJlYWs7CiAgICB9CiAgfSBjYXRjaCAoZXJyKSB7CiAgICBfaXRlcmF0b3IuZShlcnIpOwogIH0gZmluYWxseSB7CiAgICBfaXRlcmF0b3IuZigpOwogIH0KCiAgdmFyIHNob3dDbG9zZUJ1dHRvbiA9IGZ1bmN0aW9uIHNob3dDbG9zZUJ1dHRvbigpIHsKICAgIC8vIGRvbid0IHNob3cgY2xvc2UgYnV0dG9uIHdoZW4gd2UncmUgZGlyZWN0bHkgZW1iZWRkZWQgb24gbGluay9lbWFpbCBzdHVkaWVzCiAgICBpZiAoYXBwLmhlYWRlcnNbJ3VzZXJsZWFwLXBsYXRmb3JtJ10gPT09ICdlbWFpbCcgfHwgYXBwLmhlYWRlcnNbJ3VzZXJsZWFwLXBsYXRmb3JtJ10gPT09ICdsaW5rJykgcmV0dXJuIGZhbHNlOyAvLyBpZiB0aGVyZSdzIGFuIGVuZCBjYXJkIGFuZCB3ZSdyZSBvbiB0aGUgbGFzdCBzdGVwICh0aGUgZW5kIGNhcmQpLCBoaWRlIHRoZSBjbG9zZSBidXR0b24sIGVsc2Ugc2hvdyBpdC4KCiAgICByZXR1cm4gIWVuZENhcmQgfHwgY3VycmVudFN0ZXAgKyAxICE9PSBzdGVwcy5sZW5ndGg7CiAgfTsKCiAgdmFyIGdldFN0dWR5U3R5bGUgPSBmdW5jdGlvbiBnZXRTdHVkeVN0eWxlKCkgewogICAgLy8gTGluayBzdHVkeSBkbyBub3QgaGF2ZSBib3JkZXJzIHVubGlrZSB3ZWIKICAgIGlmIChhcHAuaGVhZGVyc1sndXNlcmxlYXAtcGxhdGZvcm0nXSA9PT0gJ2xpbmsnKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgYm94U2hhZG93OiAndW5zZXQnLAogICAgICAgIGJvcmRlclJhZGl1czogJ3Vuc2V0JywKICAgICAgICBib3JkZXI6ICdub25lICFpbXBvcnRhbnQnCiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gYXBwLnVzZU1vYmlsZVN0eWxpbmcgPyB7CiAgICAgICAgYm9yZGVyQ29sb3I6IGJvcmRlcgogICAgICB9IDogewogICAgICAgIGJvcmRlckNvbG9yOiBib3JkZXIsCiAgICAgICAgbWFyZ2luOiAnMTVweCcKICAgICAgfTsKICAgIH0KICB9OwoKICByZXR1cm4gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5oKSgiZGl2IiwgewogICAgY2xhc3NOYW1lOiAidWwtYXBwIiwKICAgIGlkOiBhcHBJZCwKICAgIG9uY3JlYXRlOiBmdW5jdGlvbiBvbmNyZWF0ZShlbCkgewogICAgICByZXR1cm4gb25DcmVhdGUoZWwpOwogICAgfSwKICAgIG9udXBkYXRlOiBmdW5jdGlvbiBvbnVwZGF0ZSgpIHsKICAgICAgcmV0dXJuIGFjdGlvbnMudXBkYXRlKGFwcElkKTsKICAgIH0sCiAgICBzdHlsZTogZGl2U3R5bGUKICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLmgpKCJkaXYiLCB7CiAgICBjbGFzc05hbWU6ICJ1bC1hcHBfX2NvbnRhaW5lciIKICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLmgpKCJkaXYiLCB7CiAgICBjbGFzc05hbWU6ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X19bImRlZmF1bHQiXSkoX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fX2RlZmF1bHQoKSgoMCxfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fLmdldENsYXNzZXMpKF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18uQ1NTX0NPTlNUQU5UUy5DQVJEX0NPTlRBSU5FUl9DTEFTUywgYXBwLnVzZU1vYmlsZVN0eWxpbmcpKSksCiAgICBzdHlsZTogZ2V0U3R1ZHlTdHlsZSgpCiAgfSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5oKShDYXJkLCBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkoe30sIHByb3BzLCB7CiAgICBib3JkZXI6IGJvcmRlciwKICAgIGNsYXNzTmFtZTogInVsLWNhcmQiLAogICAgbmV4dDogbmV4dEZ1bmN0aW9uLAogICAgZW5kQ2FyZDogZW5kQ2FyZCwKICAgIGxvY2FsZTogYXBwLmxvY2FsZSwKICAgIHF1ZXN0aW9uSWQ6IG5hbWUsCiAgICB1cGRhdGVIZWlnaHQ6IGZ1bmN0aW9uIHVwZGF0ZUhlaWdodCgpIHsKICAgICAgcmV0dXJuIGFjdGlvbnMudXBkYXRlKGFwcElkKTsKICAgIH0KICB9KSksICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uaCkoX3ZpZXdfY29tcG9uZW50c19Gb290ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfX1siZGVmYXVsdCJdLCBudWxsKSksIHNob3dDbG9zZUJ1dHRvbigpICYmICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uaCkoImRpdiIsIHsKICAgIGNsYXNzTmFtZTogKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfX1siZGVmYXVsdCJdKSgoMCxfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fLmdldENsYXNzZXMpKF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18uQ1NTX0NPTlNUQU5UUy5DTE9TRV9DT05UQUlORVJfQ0xBU1MsIGFwcC51c2VNb2JpbGVTdHlsaW5nKSkKICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLmgpKCJkaXYiLCB7CiAgICBjbGFzc05hbWU6IF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18uQ1NTX0NPTlNUQU5UUy5DTE9TRV9CVVRUT05fQ0xBU1MsCiAgICBvbmNsaWNrOiBjbG9zZUFwcCwKICAgIG9ua2V5cHJlc3M6IG9uS2V5UHJlc3NDbG9zZUFwcCwKICAgIHJvbGU6ICJidXR0b24iLAogICAgImFyaWEtbGFiZWwiOiAiQ2xvc2UgYnV0dG9uIiwKICAgIHRhYmluZGV4OiAwCiAgfSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5oKSgic3ZnIiwgewogICAgd2lkdGg6ICIxOHB4IiwKICAgIGhlaWdodDogIjE4cHgiLAogICAgdmlld0JveDogIjAgMCAxMyAxMyIsCiAgICBmaWxsOiAibm9uZSIsCiAgICB4bWxuczogImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uaCkoInBhdGgiLCB7CiAgICBkOiAiTTIuNTQ5NjQgMS43ODM2OUwxLjc4MzY5IDIuNTQ5NjRMNS43MzQwNSA2LjVMMS43ODM2OSAxMC40NTA0TDIuNTQ5NjQgMTEuMjE2M0w2LjUgNy4yNjU5NUwxMC40NTA0IDExLjIxNjNMMTEuMjE2MyAxMC40NTA0TDcuMjY1OTUgNi41TDExLjIxNjMgMi41NDk2NEwxMC40NTA0IDEuNzgzNjlMNi41IDUuNzM0MDVMMi41NDk2NCAxLjc4MzY5WiIsCiAgICBmaWxsOiAiIzI2MjEzNiIKICB9KSkpKSkpOwp9OwoKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fWyJkZWZhdWx0Il0gPSAoQXBwKTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3ZpZXcvTGlrZXJ0Q2FyZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy92aWV3L0xpa2VydENhcmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZXh0ZW5kc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHMuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZXh0ZW5kc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZXh0ZW5kc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGh5cGVyYXBwICovICIuL25vZGVfbW9kdWxlcy9oeXBlcmFwcC9zcmMvaW5kZXguanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjbGFzc2NhdCAqLyAiLi9ub2RlX21vZHVsZXMvY2xhc3NjYXQvc3JjL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2hlbHBlcnMvY2FyZCAqLyAiLi9zcmMvdmlldy9oZWxwZXJzL2NhcmQuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9zaGFyZWQvY29uc3RhbnRzICovICIuL3NyYy9zaGFyZWQvY29uc3RhbnRzLmpzIik7CgoKCgoKCi8qKgogKiBMaWtlcnQgQ2FyZAogKiBAcGFyYW0ge09iamVjdH0gc3RhdGUKICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlLmNsYXNzTmFtZSBBZGRpdGlvbmFsIGNsYXNzbmFtZXMKICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlLm1lc3NhZ2UgTWVzc2FnZQogKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBQcm9wZXJ0aWVzIGluY2x1ZGluZyBjYXB0aW9uIGJ1dHRvbiBhbmQgb3BlblRleHRQbGFjaG9sZGVyCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0YXRlLm5leHQgUHJvY2VlZCBtZXRob2QKICogQHJldHVybiB7T2JqZWN0fSBMaWtlcnQgY2FyZAogKi8KCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gKGZ1bmN0aW9uIChfcmVmKSB7CiAgdmFyIGJvcmRlciA9IF9yZWYuYm9yZGVyLAogICAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSwKICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsCiAgICAgIGxhYmVscyA9IF9yZWYubGFiZWxzLAogICAgICBtZXNzYWdlID0gX3JlZi5tZXNzYWdlLAogICAgICBwcm9wZXJ0aWVzID0gX3JlZi5wcm9wZXJ0aWVzLAogICAgICBuZXh0ID0gX3JlZi5uZXh0LAogICAgICBxdWVzdGlvbklkID0gX3JlZi5xdWVzdGlvbklkOwogIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikgewogICAgdmFyIF9zdGF0ZSRhcHAgPSBzdGF0ZS5hcHAsCiAgICAgICAgdXNlTW9iaWxlU3R5bGluZyA9IF9zdGF0ZSRhcHAudXNlTW9iaWxlU3R5bGluZywKICAgICAgICBpbmRleCA9IF9zdGF0ZSRhcHAuZGVjay5pbmRleCwKICAgICAgICBoZWFkZXJzID0gX3N0YXRlJGFwcC5oZWFkZXJzOwogICAgdmFyIGNsYXNzZXMgPSAoMCxjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fWyJkZWZhdWx0Il0pKFtjbGFzc05hbWUsICd1bC1jYXJkLS1saWtlcnQnLCBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkNTU19DT05TVEFOVFMuRkFERV9JTl9DTEFTU10pOwogICAgdmFyIGxlZnRMYWJlbCA9IGxhYmVscyAmJiBsYWJlbHMubGVmdDsKICAgIHZhciByaWdodExhYmVsID0gbGFiZWxzICYmIGxhYmVscy5yaWdodDsKCiAgICB2YXIgbnVtcyA9IF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkoQXJyYXkoNSkpLm1hcChmdW5jdGlvbiAoXywgaSkgewogICAgICB2YXIgbnVtID0gaSArIDE7CiAgICAgIHZhciBkaXZJZCA9ICJvcHRpb24tIi5jb25jYXQobnVtKTsKCiAgICAgIHZhciBzZXRBY3RpdmVCb3JkZXIgPSBmdW5jdGlvbiBzZXRBY3RpdmVCb3JkZXIoZSkgewogICAgICAgIGUudGFyZ2V0LnN0eWxlLnpJbmRleCA9IDI7CiAgICAgICAgZS50YXJnZXQuc3R5bGUuYm9yZGVyQ29sb3IgPSBib3JkZXI7CiAgICAgIH07CgogICAgICB2YXIgc2V0RGVmYXVsdEJvcmRlciA9IGZ1bmN0aW9uIHNldERlZmF1bHRCb3JkZXIoZSkgewogICAgICAgIGUudGFyZ2V0LnN0eWxlLnpJbmRleCA9ICdhdXRvJzsKICAgICAgICBlLnRhcmdldC5zdHlsZS5ib3JkZXJDb2xvciA9ICcjZTZlNmU2JzsKICAgICAgfTsKCiAgICAgIHZhciBvbktleVByZXNzID0gZnVuY3Rpb24gb25LZXlQcmVzcyhlKSB7CiAgICAgICAgaWYgKGUua2V5Q29kZSA9PSAxMyB8fCBlLmtleUNvZGUgPT0gMzIpIG5leHQobnVtKTsKICAgICAgfTsKCiAgICAgIHZhciBjbGlja0FyZ3MgPSB7CiAgICAgICAgb25jbGljazogZnVuY3Rpb24gb25jbGljaygpIHsKICAgICAgICAgIHJldHVybiBuZXh0KG51bSk7CiAgICAgICAgfSwKICAgICAgICBvbmtleXByZXNzOiBmdW5jdGlvbiBvbmtleXByZXNzKGUpIHsKICAgICAgICAgIHJldHVybiBvbktleVByZXNzKGUpOwogICAgICAgIH0KICAgICAgfTsKCiAgICAgIGlmICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHsKICAgICAgICBjbGlja0FyZ3Mub250b3VjaHN0YXJ0ID0gc2V0QWN0aXZlQm9yZGVyOwogICAgICAgIGNsaWNrQXJncy5vbnRvdWNoY2FuY2VsID0gc2V0RGVmYXVsdEJvcmRlcjsKICAgICAgICBjbGlja0FyZ3Mub250b3VjaG1vdmUgPSBzZXREZWZhdWx0Qm9yZGVyOwogICAgICAgIGNsaWNrQXJncy5vbnRvdWNoZW5kID0gc2V0RGVmYXVsdEJvcmRlcjsKICAgICAgfSBlbHNlIHsKICAgICAgICBjbGlja0FyZ3Mub25tb3VzZWRvd24gPSBzZXRBY3RpdmVCb3JkZXI7CiAgICAgICAgY2xpY2tBcmdzLm9ubW91c2VsZWF2ZSA9IHNldERlZmF1bHRCb3JkZXI7CiAgICAgIH0KCiAgICAgIHJldHVybiAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmgpKCJkaXYiLCBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkoewogICAgICAgIGlkOiBkaXZJZCwKICAgICAgICBjbGFzc05hbWU6ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19bImRlZmF1bHQiXSkoW10uY29uY2F0KF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkoKDAsX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5nZXRDbGFzc2VzKShfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkNTU19DT05TVEFOVFMuTElLRVJUX05VTUJFUl9DTEFTUywgdXNlTW9iaWxlU3R5bGluZykpLCBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpKCgwLF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uZ2V0Q2xhc3NlcykoIiIuY29uY2F0KF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uQ1NTX0NPTlNUQU5UUy5MSUtFUlRfTlVNQkVSX0NMQVNTLCAiLSIpLmNvbmNhdChudW0pLCB1c2VNb2JpbGVTdHlsaW5nKSkpKQogICAgICB9LCBjbGlja0FyZ3MsIHsKICAgICAgICAiYXJpYS1sYWJlbGxlZGJ5IjogIiIuY29uY2F0KF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uQ1NTX0NPTlNUQU5UUy5RVUVTVElPTl9IRUFERVJfQ0xBU1MsICIgIikuY29uY2F0KGRpdklkKSwKICAgICAgICByb2xlOiAidGV4dGJveCIsCiAgICAgICAgdGFiaW5kZXg6IDAsCiAgICAgICAgImFyaWEtZGVzY3JpYmVkYnkiOiBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkNTU19DT05TVEFOVFMuQ0FQVElPTl9DTEFTUwogICAgICB9KSwgbnVtKTsKICAgIH0pOwoKICAgIHZhciBjYXB0aW9uID0gKDAsX2hlbHBlcnNfY2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLmdldENhcHRpb24pKHByb3BlcnRpZXMpOwogICAgcmV0dXJuICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAoMCxjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fWyJkZWZhdWx0Il0pKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkoKDAsX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5nZXRQbGF0Zm9ybUNsYXNzKShfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkNTU19DT05TVEFOVFMuQ0FSRF9NQUlOX0NPTlRFTlQsIGhlYWRlcnNbJ3VzZXJsZWFwLXBsYXRmb3JtJ10pKSkKICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImZvcm0iLCB7CiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcywKICAgICAga2V5OiBxdWVzdGlvbklkCiAgICB9LCAoMCxfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uZ2V0SGVhZGxpbmUpKGNhcHRpb24sIG1lc3NhZ2UpLCBjYXB0aW9uLCBpbmRleCAlIDIgPT09IDAgJiYgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgiZGl2IiwgbnVsbCkKICAgIC8qIGFsdGVybmF0ZSBkaXYgc3RydWN0dXJlIHRvIHByZXZlbnQgYWN0aXZlIHN0YXRlIGNhY2hpbmcgaXNzdWVzIHdpdGggY29uc2VjdXRpdmUgcXVlc3Rpb25zICovCiAgICAsICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAidWwtY2FyZC0tbGlrZXJ0X19udW1iZXJzIgogICAgfSwgbnVtcyksICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAidWwtY2FyZC0tbGlrZXJ0X19sYWJlbHMiCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmgpKCJzcGFuIiwgbnVsbCwgbGVmdExhYmVsKSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgic3BhbiIsIG51bGwsIHJpZ2h0TGFiZWwpKSkpOwogIH07Cn0pOwoKLyoqKi8gfSksCgovKioqLyAiLi9zcmMvdmlldy9NdWx0aXBsZUNob2ljZUNhcmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy92aWV3L011bHRpcGxlQ2hvaWNlQ2FyZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5ICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGh5cGVyYXBwICovICIuL25vZGVfbW9kdWxlcy9oeXBlcmFwcC9zcmMvaW5kZXguanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjbGFzc2NhdCAqLyAiLi9ub2RlX21vZHVsZXMvY2xhc3NjYXQvc3JjL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfdmlld19jb21wb25lbnRzX1NlbGVjdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQC92aWV3L2NvbXBvbmVudHMvU2VsZWN0ICovICIuL3NyYy92aWV3L2NvbXBvbmVudHMvU2VsZWN0LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2hlbHBlcnMvY2FyZCAqLyAiLi9zcmMvdmlldy9oZWxwZXJzL2NhcmQuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9zaGFyZWQvY29uc3RhbnRzICovICIuL3NyYy9zaGFyZWQvY29uc3RhbnRzLmpzIik7CgoKCgoKCgovKioKICogTXVsdGlwbGVDaG9pY2UgQ2FyZAogKiBAcGFyYW0ge09iamVjdH0gc3RhdGUKICogQHBhcmFtIHtPYmplY3R9IHN0YXRlLmNsYXNzTmFtZQogKiBAcGFyYW0ge1N0cmluZ30gc3RhdGUubWVzc2FnZQogKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBQcm9wZXJ0aWVzIGluY2x1ZGluZyBjYXB0aW9uIGJ1dHRvbiBhbmQgb3BlblRleHRQbGFjaG9sZGVyY2FwdGlvblRleHQKICogQHBhcmFtIHtBcnJheX0gc3RhdGUub3B0aW9ucwogKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdGF0ZS5uZXh0CiAqIEByZXR1cm4ge09iamVjdH0gTXVsdGlwbGVDaG9pY2UgY2FyZAogKi8KCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gKGZ1bmN0aW9uIChfcmVmKSB7CiAgdmFyIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLAogICAgICBib3JkZXIgPSBfcmVmLmJvcmRlciwKICAgICAgbWVzc2FnZSA9IF9yZWYubWVzc2FnZSwKICAgICAgcHJvcGVydGllcyA9IF9yZWYucHJvcGVydGllcywKICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsCiAgICAgIF9yZWYkb3B0aW9ucyA9IF9yZWYub3B0aW9ucywKICAgICAgb3B0aW9ucyA9IF9yZWYkb3B0aW9ucyA9PT0gdm9pZCAwID8gW10gOiBfcmVmJG9wdGlvbnMsCiAgICAgIG5leHQgPSBfcmVmLm5leHQsCiAgICAgIHF1ZXN0aW9uSWQgPSBfcmVmLnF1ZXN0aW9uSWQ7CiAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7CiAgICB2YXIgX3N0YXRlJGFwcCA9IHN0YXRlLmFwcCwKICAgICAgICB1c2VNb2JpbGVTdHlsaW5nID0gX3N0YXRlJGFwcC51c2VNb2JpbGVTdHlsaW5nLAogICAgICAgIGhlYWRlcnMgPSBfc3RhdGUkYXBwLmhlYWRlcnM7CiAgICB2YXIgY2xhc3NlcyA9ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19bImRlZmF1bHQiXSkoW2NsYXNzTmFtZSwgJ3VsLWNhcmQtLW11bHRpcGxlJywgX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXy5DU1NfQ09OU1RBTlRTLkZBREVfSU5fQ0xBU1NdKTsKCiAgICBmdW5jdGlvbiBzdWJtaXQoaWQsIHZhbHVlKSB7CiAgICAgIG5leHQoewogICAgICAgIHZhbHVlOiBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpKHt9LCBpZCwgdmFsdWUpCiAgICAgIH0pOwogICAgfQoKICAgIHZhciBjaG9pY2VzID0gb3B0aW9ucy5tYXAoZnVuY3Rpb24gKF9yZWYyLCBpbmRleCkgewogICAgICB2YXIgaWQgPSBfcmVmMi5pZCwKICAgICAgICAgIGxhYmVsID0gX3JlZjIubGFiZWwsCiAgICAgICAgICB2YWx1ZSA9IF9yZWYyLnZhbHVlOwogICAgICByZXR1cm4gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKShfdmlld19jb21wb25lbnRzX1NlbGVjdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fWyJkZWZhdWx0Il0sIHsKICAgICAgICBib3JkZXI6IGJvcmRlciwKICAgICAgICBpbmRleDogaW5kZXgsCiAgICAgICAgbGFiZWw6IGxhYmVsLAogICAgICAgIHRhYmluZGV4OiBpbmRleCArIDEsCiAgICAgICAgb25TZWxlY3Q6IHN1Ym1pdC5iaW5kKG51bGwsIGlkLCB2YWx1ZSksCiAgICAgICAgaWQ6IGlkLAogICAgICAgIGlzUmFkaW86IHRydWUsCiAgICAgICAgdXNlTW9iaWxlU3R5bGluZzogdXNlTW9iaWxlU3R5bGluZwogICAgICB9KTsKICAgIH0pOwogICAgdmFyIGNhcHRpb24gPSAoMCxfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uZ2V0Q2FwdGlvbikocHJvcGVydGllcyk7CiAgICByZXR1cm4gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgiZGl2IiwgewogICAgICBjbGFzc05hbWU6ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19bImRlZmF1bHQiXSkoX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQoKSgoMCxfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLmdldFBsYXRmb3JtQ2xhc3MpKF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18uQ1NTX0NPTlNUQU5UUy5DQVJEX01BSU5fQ09OVEVOVCwgaGVhZGVyc1sndXNlcmxlYXAtcGxhdGZvcm0nXSkpKQogICAgfSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgiZGl2IiwgewogICAgICBjbGFzc05hbWU6IGNsYXNzZXMsCiAgICAgIGtleTogcXVlc3Rpb25JZAogICAgfSwgKDAsX2hlbHBlcnNfY2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLmdldEhlYWRsaW5lKShjYXB0aW9uLCBtZXNzYWdlKSwgY2FwdGlvbiwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgiZGl2IiwgewogICAgICBjbGFzc05hbWU6ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19bImRlZmF1bHQiXSkoKDAsX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXy5nZXRDbGFzc2VzKShfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLkNTU19DT05TVEFOVFMuQ0hPSUNFX0dST1VQX0NMQVNTLCB1c2VNb2JpbGVTdHlsaW5nKSksCiAgICAgIHJvbGU6ICJyYWRpb2dyb3VwIiwKICAgICAgImFyaWEtbGFiZWxlZGJ5IjogX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXy5DU1NfQ09OU1RBTlRTLlFVRVNUSU9OX0hFQURFUl9DTEFTUwogICAgfSwgY2hvaWNlcykpKTsKICB9Owp9KTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3ZpZXcvTXVsdGlwbGVTZWxlY3RDYXJkLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvdmlldy9NdWx0aXBsZVNlbGVjdENhcmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheS5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgaHlwZXJhcHAgKi8gIi4vbm9kZV9tb2R1bGVzL2h5cGVyYXBwL3NyYy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNsYXNzY2F0ICovICIuL25vZGVfbW9kdWxlcy9jbGFzc2NhdC9zcmMvaW5kZXguanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9oZWxwZXJzX2NhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vaGVscGVycy9jYXJkICovICIuL3NyYy92aWV3L2hlbHBlcnMvY2FyZC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfY29tcG9uZW50c19TZWxlY3RfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEAvdmlldy9jb21wb25lbnRzL1NlbGVjdCAqLyAiLi9zcmMvdmlldy9jb21wb25lbnRzL1NlbGVjdC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfY29tcG9uZW50c19Gb290ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEAvdmlldy9jb21wb25lbnRzL0Zvb3RlciAqLyAiLi9zcmMvdmlldy9jb21wb25lbnRzL0Zvb3Rlci5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3NoYXJlZC9jb25zdGFudHMgKi8gIi4vc3JjL3NoYXJlZC9jb25zdGFudHMuanMiKTsKCgoKCgoKCi8qKgogKiBTdWJtaXNzaW9uCiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50CiAqIEBwYXJhbSB7RnVuY3Rpb259IG5leHQKICovCgpmdW5jdGlvbiBzdWJtaXQodmFsdWUsIG5leHQpIHsKICBuZXh0KHsKICAgIHZhbHVlOiB2YWx1ZQogIH0pOwp9Ci8qKgogKiBNdWx0aXBsZVNlbGVjdCBDYXJkCiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZQogKiBAcGFyYW0ge09iamVjdH0gc3RhdGUuY2xhc3NOYW1lCiAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0ZS5tZXNzYWdlCiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIFByb3BlcnRpZXMgaW5jbHVkaW5nIGNhcHRpb24gYnV0dG9uIGFuZCBvcGVuVGV4dFBsYWNob2xkZXIKICogQHBhcmFtIHtBcnJheX0gc3RhdGUub3B0aW9ucwogKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdGF0ZS5uZXh0CiAqIEByZXR1cm4ge09iamVjdH0gTXVsdGlwbGVTZWxlY3QgY2FyZAogKi8KCgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bImRlZmF1bHQiXSA9IChmdW5jdGlvbiAoX3JlZikgewogIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSwKICAgICAgYm9yZGVyID0gX3JlZi5ib3JkZXIsCiAgICAgIG1lc3NhZ2UgPSBfcmVmLm1lc3NhZ2UsCiAgICAgIHByb3BlcnRpZXMgPSBfcmVmLnByb3BlcnRpZXMsCiAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlLAogICAgICBfcmVmJG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsCiAgICAgIG9wdGlvbnMgPSBfcmVmJG9wdGlvbnMgPT09IHZvaWQgMCA/IFtdIDogX3JlZiRvcHRpb25zLAogICAgICBpc0xhc3QgPSBfcmVmLmlzTGFzdCwKICAgICAgbmV4dCA9IF9yZWYubmV4dCwKICAgICAgcXVlc3Rpb25JZCA9IF9yZWYucXVlc3Rpb25JZDsKICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHsKICAgIHZhciBjbGFzc2VzID0gKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siZGVmYXVsdCJdKShbY2xhc3NOYW1lLCAndWwtY2FyZC0tbXVsdGlwbGUnLCBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLkNTU19DT05TVEFOVFMuRkFERV9JTl9DTEFTU10pOwogICAgdmFyIHNlbGVjdGVkT3B0aW9ucyA9IHN0YXRlLm11bHRpcGxlc2VsZWN0LnNlbGVjdGVkT3B0aW9uczsKICAgIHZhciBfYWN0aW9uJG11bHRpcGxlc2VsZWMgPSBhY3Rpb24ubXVsdGlwbGVzZWxlY3QsCiAgICAgICAgaW5pdCA9IF9hY3Rpb24kbXVsdGlwbGVzZWxlYy5pbml0LAogICAgICAgIHJlc2V0ID0gX2FjdGlvbiRtdWx0aXBsZXNlbGVjLnJlc2V0LAogICAgICAgIHVwZGF0ZVNlbGVjdGVkID0gX2FjdGlvbiRtdWx0aXBsZXNlbGVjLnVwZGF0ZVNlbGVjdGVkOwogICAgdmFyIF9zdGF0ZSRhcHAgPSBzdGF0ZS5hcHAsCiAgICAgICAgdXNlTW9iaWxlU3R5bGluZyA9IF9zdGF0ZSRhcHAudXNlTW9iaWxlU3R5bGluZywKICAgICAgICBoZWFkZXJzID0gX3N0YXRlJGFwcC5oZWFkZXJzOwoKICAgIHZhciBvbkNyZWF0ZSA9IGZ1bmN0aW9uIG9uQ3JlYXRlKCkgewogICAgICB2YXIgc2VsZWN0aW9ucyA9IHt9OwogICAgICBvcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKG8pIHsKICAgICAgICBzZWxlY3Rpb25zW28uaWRdID0gZmFsc2U7CiAgICAgIH0pOwogICAgICBpbml0KHNlbGVjdGlvbnMpOwogICAgfTsKCiAgICB2YXIgaGFuZGxlU3VibWl0ID0gZnVuY3Rpb24gaGFuZGxlU3VibWl0KGUpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBzdWJtaXQoc3RhdGUubXVsdGlwbGVzZWxlY3Quc2VsZWN0ZWRPcHRpb25zLCBuZXh0KTsKICAgICAgcmVzZXQoKTsKICAgIH07CgogICAgdmFyIGNob2ljZXMgPSBvcHRpb25zLm1hcChmdW5jdGlvbiAoX3JlZjIsIGluZGV4KSB7CiAgICAgIHZhciBpZCA9IF9yZWYyLmlkLAogICAgICAgICAgbGFiZWwgPSBfcmVmMi5sYWJlbCwKICAgICAgICAgIHZhbHVlID0gX3JlZjIudmFsdWU7CiAgICAgIHJldHVybiAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKF92aWV3X2NvbXBvbmVudHNfU2VsZWN0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bImRlZmF1bHQiXSwgewogICAgICAgIGJvcmRlcjogYm9yZGVyLAogICAgICAgIGluZGV4OiBpbmRleCwKICAgICAgICBsYWJlbDogbGFiZWwsCiAgICAgICAgb25TZWxlY3Q6IHVwZGF0ZVNlbGVjdGVkLAogICAgICAgIHNlbGVjdGVkOiBzZWxlY3RlZE9wdGlvbnNbaWRdLAogICAgICAgIGlkOiBpZCwKICAgICAgICBpc1JhZGlvOiBmYWxzZSwKICAgICAgICB1c2VNb2JpbGVTdHlsaW5nOiB1c2VNb2JpbGVTdHlsaW5nCiAgICAgIH0pOwogICAgfSk7CiAgICB2YXIgY2FwdGlvbiA9ICgwLF9oZWxwZXJzX2NhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5nZXRDYXB0aW9uKShwcm9wZXJ0aWVzKTsKICAgIHJldHVybiAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJkaXYiLCB7CiAgICAgIGNsYXNzTmFtZTogKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siZGVmYXVsdCJdKShfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCgpKCgwLF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18uZ2V0UGxhdGZvcm1DbGFzcykoX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXy5DU1NfQ09OU1RBTlRTLkNBUkRfTUFJTl9DT05URU5ULCBoZWFkZXJzWyd1c2VybGVhcC1wbGF0Zm9ybSddKSkpCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJmb3JtIiwgewogICAgICBpZDogInRleHQtZm9ybSIsCiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcywKICAgICAgb25zdWJtaXQ6IGhhbmRsZVN1Ym1pdCwKICAgICAgb25jcmVhdGU6IGZ1bmN0aW9uIG9uY3JlYXRlKGVsKSB7CiAgICAgICAgcmV0dXJuIG9uQ3JlYXRlKGVsKTsKICAgICAgfSwKICAgICAga2V5OiBxdWVzdGlvbklkCiAgICB9LCAoMCxfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uZ2V0SGVhZGxpbmUpKGNhcHRpb24sIG1lc3NhZ2UpLCBjYXB0aW9uLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJkaXYiLCB7CiAgICAgIGNsYXNzTmFtZTogKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siZGVmYXVsdCJdKSgoMCxfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLmdldENsYXNzZXMpKF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18uQ1NTX0NPTlNUQU5UUy5DSE9JQ0VfR1JPVVBfQ0xBU1MsIHVzZU1vYmlsZVN0eWxpbmcpKSwKICAgICAgcm9sZTogInJhZGlvZ3JvdXAiCiAgICB9LCBjaG9pY2VzKSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5oKSgiZGl2IiwgewogICAgICBjbGFzc05hbWU6ICJ1bC1jYXJkLXRleHQiCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJidXR0b24iLCB7CiAgICAgIGlkOiAidWwtY2FyZC10ZXh0X19idXR0b24iLAogICAgICBjbGFzc05hbWU6ICJ1bC1jYXJkLXRleHRfX2J1dHRvbiIsCiAgICAgIHN0eWxlOiB7CiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBib3JkZXIKICAgICAgfSwKICAgICAgb25jbGljazogaGFuZGxlU3VibWl0LAogICAgICByb2xlOiAiYnV0dG9uIiwKICAgICAgImFyaWEtbGFiZWxsZWRieSI6ICIiLmNvbmNhdChfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLkNTU19DT05TVEFOVFMuUVVFU1RJT05fSEVBREVSX0NMQVNTLCAiIHVsLWNhcmQtdGV4dF9fYnV0dG9uIikKICAgIH0sICgwLF9oZWxwZXJzX2NhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5nZXRCdXR0b25UZXh0KShwcm9wZXJ0aWVzKSkpKSk7CiAgfTsKfSk7CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy92aWV3L05wc0NhcmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvdmlldy9OcHNDYXJkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcyAqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5ICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBoeXBlcmFwcCAqLyAiLi9ub2RlX21vZHVsZXMvaHlwZXJhcHAvc3JjL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY2xhc3NjYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NsYXNzY2F0L3NyYy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2hlbHBlcnNfY2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9oZWxwZXJzL2NhcmQgKi8gIi4vc3JjL3ZpZXcvaGVscGVycy9jYXJkLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vc2hhcmVkL2NvbnN0YW50cyAqLyAiLi9zcmMvc2hhcmVkL2NvbnN0YW50cy5qcyIpOwoKCgoKCgovKioKICogTnBzIENhcmQKICogQHBhcmFtIHtPYmplY3R9IHN0YXRlCiAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0ZS5jbGFzc05hbWUgQWRkaXRpb25hbCBjbGFzc25hbWVzCiAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0ZS5tZXNzYWdlIE1lc3NhZ2UKICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgUHJvcGVydGllcyBpbmNsdWRpbmcgY2FwdGlvbiBidXR0b24gYW5kIG9wZW5UZXh0UGxhY2hvbGRlcgogKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdGF0ZS5uZXh0IFByb2NlZWQgbWV0aG9kCiAqIEByZXR1cm4ge09iamVjdH0gTnBzIGNhcmQKICovCgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bImRlZmF1bHQiXSA9IChmdW5jdGlvbiAoX3JlZikgewogIHZhciBib3JkZXIgPSBfcmVmLmJvcmRlciwKICAgICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsCiAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlLAogICAgICBsYWJlbHMgPSBfcmVmLmxhYmVscywKICAgICAgbWVzc2FnZSA9IF9yZWYubWVzc2FnZSwKICAgICAgcHJvcGVydGllcyA9IF9yZWYucHJvcGVydGllcywKICAgICAgbmV4dCA9IF9yZWYubmV4dCwKICAgICAgcXVlc3Rpb25JZCA9IF9yZWYucXVlc3Rpb25JZDsKICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHsKICAgIHZhciBfc3RhdGUkYXBwID0gc3RhdGUuYXBwLAogICAgICAgIHVzZU1vYmlsZVN0eWxpbmcgPSBfc3RhdGUkYXBwLnVzZU1vYmlsZVN0eWxpbmcsCiAgICAgICAgaW5kZXggPSBfc3RhdGUkYXBwLmRlY2suaW5kZXgsCiAgICAgICAgaGVhZGVycyA9IF9zdGF0ZSRhcHAuaGVhZGVyczsKICAgIHZhciBjbGFzc2VzID0gKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfX1siZGVmYXVsdCJdKShbY2xhc3NOYW1lLCAndWwtY2FyZC0tbnBzJywgX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5DU1NfQ09OU1RBTlRTLkZBREVfSU5fQ0xBU1NdKTsKICAgIHZhciBsZWZ0TGFiZWwgPSBsYWJlbHMgJiYgbGFiZWxzLmxlZnQ7CiAgICB2YXIgcmlnaHRMYWJlbCA9IGxhYmVscyAmJiBsYWJlbHMucmlnaHQ7CgogICAgdmFyIG51bXMgPSBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpKEFycmF5KDExKSkubWFwKGZ1bmN0aW9uIChfLCBpKSB7CiAgICAgIHZhciBudW0gPSBpOwogICAgICB2YXIgZGl2SWQgPSAib3B0aW9uLSIuY29uY2F0KG51bSk7CgogICAgICB2YXIgc2V0QWN0aXZlQm9yZGVyID0gZnVuY3Rpb24gc2V0QWN0aXZlQm9yZGVyKGUpIHsKICAgICAgICBlLnRhcmdldC5zdHlsZS56SW5kZXggPSAyOwogICAgICAgIGUudGFyZ2V0LnN0eWxlLmJvcmRlckNvbG9yID0gYm9yZGVyOwogICAgICB9OwoKICAgICAgdmFyIHNldERlZmF1bHRCb3JkZXIgPSBmdW5jdGlvbiBzZXREZWZhdWx0Qm9yZGVyKGUpIHsKICAgICAgICBlLnRhcmdldC5zdHlsZS56SW5kZXggPSAnYXV0byc7CiAgICAgICAgZS50YXJnZXQuc3R5bGUuYm9yZGVyQ29sb3IgPSAnI2U2ZTZlNic7CiAgICAgIH07CgogICAgICB2YXIgb25LZXlQcmVzcyA9IGZ1bmN0aW9uIG9uS2V5UHJlc3MoZSkgewogICAgICAgIGlmIChlLmtleUNvZGUgPT0gMTMgfHwgZS5rZXlDb2RlID09IDMyKSBuZXh0KG51bSk7CiAgICAgIH07CgogICAgICB2YXIgY2xpY2tBcmdzID0gewogICAgICAgIG9uY2xpY2s6IGZ1bmN0aW9uIG9uY2xpY2soKSB7CiAgICAgICAgICByZXR1cm4gbmV4dChudW0pOwogICAgICAgIH0sCiAgICAgICAgb25rZXlwcmVzczogZnVuY3Rpb24gb25rZXlwcmVzcyhlKSB7CiAgICAgICAgICByZXR1cm4gb25LZXlQcmVzcyhlKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7CiAgICAgICAgY2xpY2tBcmdzLm9udG91Y2hzdGFydCA9IHNldEFjdGl2ZUJvcmRlcjsKICAgICAgICBjbGlja0FyZ3Mub250b3VjaGNhbmNlbCA9IHNldERlZmF1bHRCb3JkZXI7CiAgICAgICAgY2xpY2tBcmdzLm9udG91Y2htb3ZlID0gc2V0RGVmYXVsdEJvcmRlcjsKICAgICAgICBjbGlja0FyZ3Mub250b3VjaGVuZCA9IHNldERlZmF1bHRCb3JkZXI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2xpY2tBcmdzLm9ubW91c2Vkb3duID0gc2V0QWN0aXZlQm9yZGVyOwogICAgICAgIGNsaWNrQXJncy5vbm1vdXNlbGVhdmUgPSBzZXREZWZhdWx0Qm9yZGVyOwogICAgICB9CgogICAgICByZXR1cm4gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgiZGl2IiwgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19leHRlbmRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCgpKHsKICAgICAgICBjbGFzc05hbWU6ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19bImRlZmF1bHQiXSkoW10uY29uY2F0KF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkoKDAsX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5nZXRDbGFzc2VzKShfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkNTU19DT05TVEFOVFMuTlBTX05VTUJFUl9DTEFTUywgdXNlTW9iaWxlU3R5bGluZykpLCBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpKCgwLF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uZ2V0Q2xhc3NlcykoIiIuY29uY2F0KF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uQ1NTX0NPTlNUQU5UUy5OUFNfTlVNQkVSX0NMQVNTLCAiLSIpLmNvbmNhdChudW0pLCB1c2VNb2JpbGVTdHlsaW5nKSkpKQogICAgICB9LCBjbGlja0FyZ3MsIHsKICAgICAgICAiYXJpYS1sYWJlbGxlZGJ5IjogIiIuY29uY2F0KF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uQ1NTX0NPTlNUQU5UUy5RVUVTVElPTl9IRUFERVJfQ0xBU1MsICIgIikuY29uY2F0KGRpdklkKSwKICAgICAgICByb2xlOiAicmFkaW8iLAogICAgICAgIHRhYmluZGV4OiAwLAogICAgICAgIGlkOiBkaXZJZAogICAgICB9KSwgbnVtKTsKICAgIH0pOwoKICAgIHZhciBjYXB0aW9uID0gKDAsX2hlbHBlcnNfY2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLmdldENhcHRpb24pKHByb3BlcnRpZXMpOwogICAgcmV0dXJuICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAoMCxjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fWyJkZWZhdWx0Il0pKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkoKDAsX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5nZXRQbGF0Zm9ybUNsYXNzKShfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkNTU19DT05TVEFOVFMuQ0FSRF9NQUlOX0NPTlRFTlQsIGhlYWRlcnNbJ3VzZXJsZWFwLXBsYXRmb3JtJ10pKSkKICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImZvcm0iLCB7CiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcywKICAgICAga2V5OiBxdWVzdGlvbklkCiAgICB9LCAoMCxfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uZ2V0SGVhZGxpbmUpKGNhcHRpb24sIG1lc3NhZ2UpLCBjYXB0aW9uLCBpbmRleCAlIDIgPT09IDAgJiYgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgiZGl2IiwgbnVsbCkKICAgIC8qIGFsdGVybmF0ZSBkaXYgc3RydWN0dXJlIHRvIHByZXZlbnQgYWN0aXZlIHN0YXRlIGNhY2hpbmcgaXNzdWVzIHdpdGggY29uc2VjdXRpdmUgcXVlc3Rpb25zICovCiAgICAsICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAidWwtY2FyZC0tbnBzX19udW1iZXJzIgogICAgfSwgbnVtcyksICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAidWwtY2FyZC0tbnBzX19sYWJlbHMiCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmgpKCJzcGFuIiwgbnVsbCwgbGVmdExhYmVsKSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgic3BhbiIsIG51bGwsIHJpZ2h0TGFiZWwpKSkpOwogIH07Cn0pOwoKLyoqKi8gfSksCgovKioqLyAiLi9zcmMvdmlldy9PcGVuVGV4dENhcmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy92aWV3L09wZW5UZXh0Q2FyZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5ICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBoeXBlcmFwcCAqLyAiLi9ub2RlX21vZHVsZXMvaHlwZXJhcHAvc3JjL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBhdXRvc2l6ZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgYXV0b3NpemUgKi8gIi4vbm9kZV9tb2R1bGVzL2F1dG9zaXplL2Rpc3QvYXV0b3NpemUuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGF1dG9zaXplX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oYXV0b3NpemVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY2xhc3NjYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NsYXNzY2F0L3NyYy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2hlbHBlcnNfY2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9oZWxwZXJzL2NhcmQgKi8gIi4vc3JjL3ZpZXcvaGVscGVycy9jYXJkLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vc2hhcmVkL2NvbnN0YW50cyAqLyAiLi9zcmMvc2hhcmVkL2NvbnN0YW50cy5qcyIpOwoKCgoKCgovKioKICogU3VibWlzc2lvbgogKiBAcGFyYW0ge0V2ZW50fSBldmVudAogKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXh0CiAqLwoKZnVuY3Rpb24gc3VibWl0KHZhbHVlLCBuZXh0KSB7CiAgbmV4dCh2YWx1ZSk7Cn0KLyoqCiAqIFRleHQgQ2FyZAogKiBAcGFyYW0ge09iamVjdH0gc3RhdGUKICogQHBhcmFtIHtPYmplY3R9IHN0YXRlLmNsYXNzTmFtZSBPcGVuVGV4dENhcmQgY2xhc3MKICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlLm1lc3NhZ2UgTWVzc2FnZQogKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBQcm9wZXJ0aWVzIGluY2x1ZGluZyBjYXB0aW9uIGJ1dHRvbiBhbmQgb3BlblRleHRQbGFjaG9sZGVyCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0YXRlLm5leHQgTmV4dCBjYXJkIGNhbGxiYWNrCiAqIEByZXR1cm4ge09iamVjdH0gVGV4dCBjYXJkCiAqLwoKCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gKGZ1bmN0aW9uIChfcmVmKSB7CiAgdmFyIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLAogICAgICBtZXNzYWdlID0gX3JlZi5tZXNzYWdlLAogICAgICBwcm9wZXJ0aWVzID0gX3JlZi5wcm9wZXJ0aWVzLAogICAgICBsb2NhbGUgPSBfcmVmLmxvY2FsZSwKICAgICAgbmV4dCA9IF9yZWYubmV4dCwKICAgICAgcXVlc3Rpb25JZCA9IF9yZWYucXVlc3Rpb25JZDsKICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHsKICAgIHZhciBfc3RhdGUkYXBwID0gc3RhdGUuYXBwLAogICAgICAgIHVzZU1vYmlsZVN0eWxpbmcgPSBfc3RhdGUkYXBwLnVzZU1vYmlsZVN0eWxpbmcsCiAgICAgICAgYm9yZGVyID0gX3N0YXRlJGFwcC5ib3JkZXIsCiAgICAgICAgaGVhZGVycyA9IF9zdGF0ZSRhcHAuaGVhZGVyczsKICAgIHZhciBjbGFzc2VzID0gKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfX1siZGVmYXVsdCJdKShbY2xhc3NOYW1lLCAndWwtY2FyZC0tdGV4dCcsIF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uQ1NTX0NPTlNUQU5UUy5GQURFX0lOX0NMQVNTXSk7CgogICAgdmFyIGdldFRyaW1tZWRWYWx1ZSA9IGZ1bmN0aW9uIGdldFRyaW1tZWRWYWx1ZSgpIHsKICAgICAgcmV0dXJuIHN0YXRlLm9wZW5UZXh0LnZhbHVlLnRyaW0oKTsKICAgIH07CgogICAgdmFyIGhhbmRsZVN1Ym1pdCA9IGZ1bmN0aW9uIGhhbmRsZVN1Ym1pdChlKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgdmFyIGZvcm0gPSBkb2N1bWVudC5mb3Jtc1sndGV4dC1mb3JtJ107CiAgICAgIGlmICghZm9ybSkgcmV0dXJuOwogICAgICB2YXIgdmFsdWUgPSBnZXRUcmltbWVkVmFsdWUoKTsKICAgICAgc3VibWl0KHZhbHVlLCBuZXh0KTsKICAgICAgc3RhdGUub3BlblRleHQudmFsdWUgPSAnJzsKICAgIH07CgogICAgdmFyIGhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZShlKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgYWN0aW9uLm9wZW5UZXh0Lm9uVGV4dENoYW5nZShlLnRhcmdldC52YWx1ZSk7CiAgICB9OwoKICAgIHZhciBjYXB0aW9uID0gKDAsX2hlbHBlcnNfY2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLmdldENhcHRpb24pKHByb3BlcnRpZXMpOwogICAgdmFyIG9wZW5UZXh0UGxhY2Vob2xkZXIgPSBwcm9wZXJ0aWVzICYmIHByb3BlcnRpZXMub3BlblRleHRQbGFjZWhvbGRlciA/IHByb3BlcnRpZXMub3BlblRleHRQbGFjZWhvbGRlciA6IG51bGw7CgogICAgdmFyIHNldEFjdGl2ZUJvcmRlciA9IGZ1bmN0aW9uIHNldEFjdGl2ZUJvcmRlcihlKSB7CiAgICAgIGUudGFyZ2V0LnN0eWxlLmJvcmRlckNvbG9yID0gYm9yZGVyOwogICAgfTsKCiAgICB2YXIgc2V0RGVmYXVsdEJvcmRlciA9IGZ1bmN0aW9uIHNldERlZmF1bHRCb3JkZXIoZSkgewogICAgICBlLnRhcmdldC5zdHlsZS5ib3JkZXJDb2xvciA9ICcjZTZlNmU2JzsKICAgIH07CgogICAgcmV0dXJuICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAoMCxjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fWyJkZWZhdWx0Il0pKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkoKDAsX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5nZXRQbGF0Zm9ybUNsYXNzKShfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkNTU19DT05TVEFOVFMuQ0FSRF9NQUlOX0NPTlRFTlQsIGhlYWRlcnNbJ3VzZXJsZWFwLXBsYXRmb3JtJ10pKSkKICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoImZvcm0iLCB7CiAgICAgIGlkOiAidGV4dC1mb3JtIiwKICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLAogICAgICBvbnN1Ym1pdDogZnVuY3Rpb24gb25zdWJtaXQoZXZlbnQpIHsKICAgICAgICByZXR1cm4gc3VibWl0KGV2ZW50LCBuZXh0KTsKICAgICAgfSwKICAgICAga2V5OiBxdWVzdGlvbklkCiAgICB9LCAoMCxfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uZ2V0SGVhZGxpbmUpKGNhcHRpb24sIG1lc3NhZ2UpLCBjYXB0aW9uLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJkaXYiLCB7CiAgICAgIGNsYXNzTmFtZTogInVsLWNhcmQtdGV4dCIKICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAidWwtY2FyZC10ZXh0X19jb250YWluZXIiCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJ0ZXh0YXJlYSIsIHsKICAgICAgImRhdGEtZ3JhbW0iOiAiZmFsc2UiLAogICAgICBtYXhsZW5ndGg6ICI1MDAwIiwKICAgICAgY2xhc3NOYW1lOiAoMCxjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fWyJkZWZhdWx0Il0pKCgwLF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uZ2V0Q2xhc3NlcykoX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5DU1NfQ09OU1RBTlRTLk9QRU5fVEVYVF9JTlBVVCwgdXNlTW9iaWxlU3R5bGluZykpLAogICAgICBuYW1lOiAidGV4dCIsCiAgICAgIHBsYWNlaG9sZGVyOiBvcGVuVGV4dFBsYWNlaG9sZGVyLAogICAgICAiYXJpYS1wbGFjZWhvbGRlciI6IG9wZW5UZXh0UGxhY2Vob2xkZXIsCiAgICAgICJhcmlhLW11bHRpbGluZSI6ICJ0cnVlIiwKICAgICAgdmFsdWU6IHN0YXRlLm9wZW5UZXh0LnZhbHVlLAogICAgICBvbmNyZWF0ZTogKGF1dG9zaXplX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19fZGVmYXVsdCgpKSwKICAgICAgb25pbnB1dDogaGFuZGxlQ2hhbmdlLAogICAgICBvbmZvY3VzOiBzZXRBY3RpdmVCb3JkZXIsCiAgICAgIG9uYmx1cjogc2V0RGVmYXVsdEJvcmRlciwKICAgICAgdGFiaW5kZXg6IDAsCiAgICAgICJhcmlhLWxhYmVsbGVkYnkiOiBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkNTU19DT05TVEFOVFMuUVVFU1RJT05fSEVBREVSX0NMQVNTLAogICAgICBjb250ZW50ZWRpdGFibGU6ICJ0cnVlIiwKICAgICAgcm9sZTogInRleHRib3giLAogICAgICAiYXJpYS1sYWJlbCI6IG9wZW5UZXh0UGxhY2Vob2xkZXIKICAgIH0pKSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5oKSgiYnV0dG9uIiwgewogICAgICBpZDogInVsLWNhcmQtdGV4dF9fYnV0dG9uIiwKICAgICAgY2xhc3NOYW1lOiAidWwtY2FyZC10ZXh0X19idXR0b24iLAogICAgICBzdHlsZTogewogICAgICAgIGJhY2tncm91bmRDb2xvcjogYm9yZGVyCiAgICAgIH0sCiAgICAgIG9uY2xpY2s6IGhhbmRsZVN1Ym1pdCwKICAgICAgcm9sZTogImJ1dHRvbiIsCiAgICAgICJhcmlhLWxhYmVsbGVkYnkiOiAiIi5jb25jYXQoX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5DU1NfQ09OU1RBTlRTLlFVRVNUSU9OX0hFQURFUl9DTEFTUywgIiB1bC1jYXJkLXRleHRfX2J1dHRvbiIpCiAgICB9LCAoMCxfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uZ2V0QnV0dG9uVGV4dCkocHJvcGVydGllcykpKSkpOwogIH07Cn0pOwoKLyoqKi8gfSksCgovKioqLyAiLi9zcmMvdmlldy9UZXh0VXJsQnV0dG9uQ2FyZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvdmlldy9UZXh0VXJsQnV0dG9uQ2FyZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGh5cGVyYXBwICovICIuL25vZGVfbW9kdWxlcy9oeXBlcmFwcC9zcmMvaW5kZXguanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjbGFzc2NhdCAqLyAiLi9ub2RlX21vZHVsZXMvY2xhc3NjYXQvc3JjL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vc2hhcmVkL2NvbnN0YW50cyAqLyAiLi9zcmMvc2hhcmVkL2NvbnN0YW50cy5qcyIpOwoKCgoKLyoqCiAqIFRleHQgQ2FyZAogKiBAcGFyYW0ge09iamVjdH0gc3RhdGUKICogQHBhcmFtIHtPYmplY3R9IHN0YXRlLmNsYXNzTmFtZSBUZXh0VXJsQnV0dG9uIGNsYXNzCiAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0ZS5tZXNzYWdlIE1lc3NhZ2UKICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgUHJvcGVydGllcyBpbmNsdWRpbmcgYnV0dG9uIHRleHQKICogQHBhcmFtIHtGdW5jdGlvbn0gc3RhdGUubmV4dCBOZXh0IGNhcmQgY2FsbGJhY2sKICogQHJldHVybiB7T2JqZWN0fSBUZXh0IGNhcmQKICovCgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bImRlZmF1bHQiXSA9IChmdW5jdGlvbiAoX3JlZikgewogIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSwKICAgICAgbWVzc2FnZSA9IF9yZWYubWVzc2FnZSwKICAgICAgcHJvcGVydGllcyA9IF9yZWYucHJvcGVydGllcywKICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsCiAgICAgIG5leHQgPSBfcmVmLm5leHQsCiAgICAgIHF1ZXN0aW9uSWQgPSBfcmVmLnF1ZXN0aW9uSWQ7CiAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7CiAgICB2YXIgY2xhc3NlcyA9ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bImRlZmF1bHQiXSkoW2NsYXNzTmFtZSwgJ3VsLWNhcmRfX3RleHQtdXJsLXByb21wdCcsIF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uQ1NTX0NPTlNUQU5UUy5GQURFX0lOX0NMQVNTXSk7CiAgICB2YXIgX3N0YXRlJGFwcCA9IHN0YXRlLmFwcCwKICAgICAgICBib3JkZXIgPSBfc3RhdGUkYXBwLmJvcmRlciwKICAgICAgICBoZWFkZXJzID0gX3N0YXRlJGFwcC5oZWFkZXJzOwoKICAgIHZhciBoYW5kbGVMaW5rQnV0dG9uVGFwID0gZnVuY3Rpb24gaGFuZGxlTGlua0J1dHRvblRhcChlKSB7CiAgICAgIG5leHQoKTsKICAgIH07CgogICAgdmFyIGhhbmRsZUtleVByZXNzTGlua0J1dHRvbiA9IGZ1bmN0aW9uIGhhbmRsZUtleVByZXNzTGlua0J1dHRvbihlKSB7CiAgICAgIGlmIChlLmtleUNvZGUgPT0gMTMgfHwgZS5rZXlDb2RlID09IDMyKSBuZXh0KCk7CiAgICB9OwoKICAgIHJldHVybiAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJkaXYiLCB7CiAgICAgIGNsYXNzTmFtZTogKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siZGVmYXVsdCJdKShfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCgpKCgwLF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uZ2V0UGxhdGZvcm1DbGFzcykoX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5DU1NfQ09OU1RBTlRTLkNBUkRfTUFJTl9DT05URU5ULCBoZWFkZXJzWyd1c2VybGVhcC1wbGF0Zm9ybSddKSkpCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJkaXYiLCB7CiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcywKICAgICAga2V5OiBxdWVzdGlvbklkCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJwIiwgewogICAgICBpZDogX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5DU1NfQ09OU1RBTlRTLlFVRVNUSU9OX0hFQURFUl9DTEFTUywKICAgICAgY2xhc3NOYW1lOiAidWwtcXVlc3Rpb24iCiAgICB9LCBtZXNzYWdlKSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5oKSgiZGl2IiwgewogICAgICBpZDogInVsLWNhcmRfX3RleHQtdXJsLWJvZHktY29udGFpbmVyIiwKICAgICAgY2xhc3NOYW1lOiAidWwtY2FyZF9fdGV4dC11cmwtYm9keS1jb250YWluZXIiCiAgICB9LCAocHJvcGVydGllcyAmJiBwcm9wZXJ0aWVzLmJvZHkgPyBwcm9wZXJ0aWVzLmJvZHkuc3BsaXQoL1xuXHMqXG4vZykgOiBbXSkubWFwKGZ1bmN0aW9uIChsaW5lKSB7CiAgICAgIHJldHVybiAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJwIiwgewogICAgICAgIGNsYXNzTmFtZTogInVsLWNhcmRfX3RleHQtdXJsLXByb21wdC1ib2R5IgogICAgICB9LCBsaW5lKTsKICAgIH0pKSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5oKSgiYSIsIHsKICAgICAgaWQ6ICJ1bC1jYXJkLXRleHRfX2J1dHRvbiIsCiAgICAgIGNsYXNzTmFtZTogInVsLWNhcmQtdGV4dF9fYnV0dG9uIHVsLWNhcmRfX3RleHQtdXJsLXByb21wdC1idXR0b24iLAogICAgICBzdHlsZTogewogICAgICAgIGJhY2tncm91bmRDb2xvcjogYm9yZGVyLAogICAgICAgICdtYXJnaW4tcmlnaHQnOiAnYXV0bycsCiAgICAgICAgJ3RleHQtb3ZlcmZsb3cnOiAnZWxsaXBzaXMnLAogICAgICAgIHRleHREZWNvcmF0aW9uOiAnbm9uZScsCiAgICAgICAgb3ZlcmZsb3c6ICd2aXNpYmxlJwogICAgICB9LAogICAgICBvbmNsaWNrOiBoYW5kbGVMaW5rQnV0dG9uVGFwLAogICAgICBvbmtleXByZXNzOiBoYW5kbGVLZXlQcmVzc0xpbmtCdXR0b24sCiAgICAgIGhyZWY6IHByb3BlcnRpZXMgJiYgcHJvcGVydGllcy5idXR0b25VcmwsCiAgICAgIHRhcmdldDogIl9ibGFuayIsCiAgICAgIHJvbGU6ICJidXR0b24iLAogICAgICB0YWJpbmRleDogMCwKICAgICAgImFyaWEtbGFiZWxsZWRieSI6ICIiLmNvbmNhdChfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLkNTU19DT05TVEFOVFMuUVVFU1RJT05fSEVBREVSX0NMQVNTLCAiIHVsLWNhcmQtdGV4dF9fYnV0dG9uIiksCiAgICAgICJhcmlhLWRlc2NyaWJlZGJ5IjogInVsLWNhcmRfX3RleHQtdXJsLWJvZHktY29udGFpbmVyIgogICAgfSwgcHJvcGVydGllcyAmJiBwcm9wZXJ0aWVzLmJ1dHRvblRleHQgPyBwcm9wZXJ0aWVzLmJ1dHRvblRleHQgOiAnTmV4dCcpKSk7CiAgfTsKfSk7CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy92aWV3L1RoYW5rc0NhcmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvdmlldy9UaGFua3NDYXJkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5ICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBoeXBlcmFwcCAqLyAiLi9ub2RlX21vZHVsZXMvaHlwZXJhcHAvc3JjL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY2xhc3NjYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NsYXNzY2F0L3NyYy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3NoYXJlZC9jb25zdGFudHMgKi8gIi4vc3JjL3NoYXJlZC9jb25zdGFudHMuanMiKTsKCgoKCi8qKgogKiBUaGFua3MgQ2FyZAogKiBAcGFyYW0ge09iamVjdH0gc3RhdGUKICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlLmNsYXNzTmFtZSBBZGRpdGlvbmFsIGNsYXNzbmFtZXMKICogQHBhcmFtIHtPYmplY3R9IGVuZENhcmQgSGVhZGxpbmUgYW5kIG9wdGlvbmFsIHN1YmhlYWRlcgogKiBAcGFyYW0ge051bWJlcn0gc3RhdGUudGltZW91dCBUaGFua3MgdGltZW91dAogKiBAcmV0dXJuIHtPYmplY3R9IFRoYW5rcyBjYXJkCiAqLwoKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fWyJkZWZhdWx0Il0gPSAoZnVuY3Rpb24gKF9yZWYpIHsKICB2YXIgZW5kQ2FyZCA9IF9yZWYuZW5kQ2FyZCwKICAgICAgYm9yZGVyID0gX3JlZi5ib3JkZXIsCiAgICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLAogICAgICBsb2NhbGUgPSBfcmVmLmxvY2FsZSwKICAgICAgcXVlc3Rpb25JZCA9IF9yZWYucXVlc3Rpb25JZDsKICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHsKICAgIHZhciBjbGFzc2VzID0gKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siZGVmYXVsdCJdKShbY2xhc3NOYW1lLCAndWwtY2FyZC0tdGhhbmtzJywgX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5DU1NfQ09OU1RBTlRTLkZBREVfSU5fQ0xBU1NdKTsKICAgIHZhciBjYXB0aW9uID0gZW5kQ2FyZCAmJiBlbmRDYXJkLnN1YmhlYWRlciA/ICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoInAiLCB7CiAgICAgIGNsYXNzTmFtZTogInVsLWNhcHRpb24iCiAgICB9LCBlbmRDYXJkLnN1YmhlYWRlcikgOiBudWxsOwogICAgdmFyIGhlYWRsaW5lID0gZW5kQ2FyZCAmJiBlbmRDYXJkLmhlYWRsaW5lID8gZW5kQ2FyZC5oZWFkbGluZSA6IG51bGw7CiAgICByZXR1cm4gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5oKSgiZGl2IiwgewogICAgICBjbGFzc05hbWU6ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bImRlZmF1bHQiXSkoX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQoKSgoMCxfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLmdldFBsYXRmb3JtQ2xhc3MpKF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uQ1NTX0NPTlNUQU5UUy5DQVJEX01BSU5fQ09OVEVOVCwgc3RhdGUuYXBwLmhlYWRlcnNbJ3VzZXJsZWFwLXBsYXRmb3JtJ10pKSkKICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLAogICAgICBrZXk6IHF1ZXN0aW9uSWQKICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoImRpdiIsIHsKICAgICAgb25jcmVhdGU6IGZ1bmN0aW9uIG9uY3JlYXRlKCkgewogICAgICAgIHJldHVybiBhY3Rpb24uYXBwLmNvbXBsZXRlKCk7CiAgICAgIH0KICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAidWwtY2FyZC0tdGhhbmtzLWNvbnRlbnQiCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJkaXYiLCB7CiAgICAgIGNsYXNzTmFtZTogInVsLXRoYW5rcy1jaGVjayIKICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoInN2ZyIsIHsKICAgICAgd2lkdGg6ICI4MSIsCiAgICAgIGhlaWdodDogIjk5IiwKICAgICAgdmlld0JveDogIjAgMCA4MSA5OSIsCiAgICAgIGZpbGw6ICJub25lIiwKICAgICAgeG1sbnM6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsCiAgICAgICJhcmlhLWxhYmVsbGVkYnkiOiAidGl0bGUiCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJwYXRoIiwgewogICAgICAiZmlsbC1ydWxlIjogImV2ZW5vZGQiLAogICAgICAiY2xpcC1ydWxlIjogImV2ZW5vZGQiLAogICAgICBkOiAiTTQwLjUgNzdDNjAuOTM0NSA3NyA3Ny41IDYwLjQzNDUgNzcuNSA0MEM3Ny41IDE5LjU2NTUgNjAuOTM0NSAzIDQwLjUgM0MyMC4wNjU1IDMgMy41IDE5LjU2NTUgMy41IDQwQzMuNSA2MC40MzQ1IDIwLjA2NTUgNzcgNDAuNSA3N1pNODAuNSA0MEM4MC41IDYyLjA5MTQgNjIuNTkxNCA4MCA0MC41IDgwQzE4LjQwODYgODAgMC41IDYyLjA5MTQgMC41IDQwQzAuNSAxNy45MDg2IDE4LjQwODYgMCA0MC41IDBDNjIuNTkxNCAwIDgwLjUgMTcuOTA4NiA4MC41IDQwWiIsCiAgICAgIGZpbGw6IGJvcmRlcgogICAgfSksICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoInBhdGgiLCB7CiAgICAgICJmaWxsLXJ1bGUiOiAiZXZlbm9kZCIsCiAgICAgICJjbGlwLXJ1bGUiOiAiZXZlbm9kZCIsCiAgICAgIGQ6ICJNNTUuMDI1IDIyLjkwNDZDNTUuNjI5OSAyMy40NzA1IDU1LjY2MTYgMjQuNDE5OCA1NS4wOTU2IDI1LjAyNDdDNTQuODcyNCAyNS4yNjM0IDU0LjYxMDkgMjUuNTI4NSA1NC4zMTU3IDI1LjgyNzdDNTIuMjU0NyAyNy45MTY4IDQ4LjU1NDkgMzEuNjY3IDQ0LjgxMzUgMzkuNjY1OEM0My4yODE4IDQyLjk0MDYgNDIuMDg2NCA0NS44Mzg2IDQxLjA4MjMgNDguMjcyOUM0MC42NTM5IDQ5LjMxMTYgNDAuMjYwMyA1MC4yNjU5IDM5Ljg5MDIgNTEuMTI5QzM5LjI4NyA1Mi41MzU5IDM4LjcyNDggNTMuNzUwOCAzOC4xNzQ0IDU0LjYyNUMzNy44OTk3IDU1LjA2MTMgMzcuNTgwNiA1NS40OTA1IDM3LjIwMTcgNTUuODI0NUMzNi44MjAxIDU2LjE2MDcgMzYuMjYxMyA1Ni41IDM1LjU0NTcgNTYuNUMzNC42NzQyIDU2LjUgMzQuMDg5MiA1NS45NjkyIDMzLjc3NzQgNTUuNjA4M0MzMy40NTAyIDU1LjIyOTYgMzMuMTc1MiA1NC43NTExIDMyLjkzOTYgNTQuMzAxQzMyLjczMDUgNTMuOTAxMyAzMi41MDg4IDUzLjQzNjcgMzIuMjc5NyA1Mi45NTY1QzMyLjI0MjkgNTIuODc5NCAzMi4yMDU5IDUyLjgwMTkgMzIuMTY4OCA1Mi43MjQzQzMxLjg5NDIgNTIuMTQ5OSAzMS41OTU5IDUxLjUzNCAzMS4yNTM3IDUwLjg4NjhDMjkuODg4NiA0OC4zMDUgMjcuODUzOSA0NS4yODc4IDI0LjIzNDMgNDMuMTM4MkMyMy41MjIgNDIuNzE1MiAyMy4yODc1IDQxLjc5NDkgMjMuNzEwNSA0MS4wODI2QzI0LjEzMzUgNDAuMzcwMyAyNS4wNTM5IDQwLjEzNTggMjUuNzY2MiA0MC41NTg4QzMwLjA1NTYgNDMuMTA2MiAzMi40MTQ5IDQ2LjY2NDcgMzMuOTA1OCA0OS40ODQ1QzM0LjI3NzYgNTAuMTg3NiAzNC41OTczIDUwLjg0ODcgMzQuODc1MyA1MS40MzAyQzM0LjkxNDcgNTEuNTEyNCAzNC45NTI5IDUxLjU5MjYgMzQuOTkwMiA1MS42NzA3QzM1LjIyMjIgNTIuMTU2NyAzNS40MTY0IDUyLjU2MzcgMzUuNTk3OCA1Mi45MTAyQzM1LjYxNTEgNTIuOTQzNCAzNS42MzIxIDUyLjk3NTQgMzUuNjQ4NSA1My4wMDYxQzM2LjA1NjUgNTIuMzUzMSAzNi41MzQxIDUxLjM0MzQgMzcuMTMzIDQ5Ljk0NjhDMzcuNDc4MSA0OS4xNDE4IDM3Ljg1NzIgNDguMjIyOSAzOC4yNzYxIDQ3LjIwNzRDMzkuMjg4NiA0NC43NTMyIDQwLjUzMzkgNDEuNzM0NyA0Mi4wOTYxIDM4LjM5NDhDNDYuMDU5MSAyOS45MjIxIDUwLjA2NDEgMjUuODY0OCA1Mi4xNTM1IDIzLjc0ODJDNTIuNDQyMyAyMy40NTU2IDUyLjY5NDQgMjMuMjAwMiA1Mi45MDQ4IDIyLjk3NTNDNTMuNDcwOCAyMi4zNzAzIDU0LjQyIDIyLjMzODcgNTUuMDI1IDIyLjkwNDZaTTM1LjE5OTQgNTMuNTg5MkMzNS4xOTk0IDUzLjU4OTIgMzUuMiA1My41ODg4IDM1LjIwMTIgNTMuNTg3OUMzNS4yIDUzLjU4ODkgMzUuMTk5NCA1My41ODkzIDM1LjE5OTQgNTMuNTg5MlpNMzYuMDY2NiA1My42NjgyQzM2LjA3MzIgNTMuNjc0IDM2LjA3NjUgNTMuNjc3NSAzNi4wNzY1IDUzLjY3NzdDMzYuMDc2NSA1My42NzggMzYuMDczMiA1My42NzUxIDM2LjA2NjYgNTMuNjY4MloiLAogICAgICBmaWxsOiBib3JkZXIKICAgIH0pLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJwYXRoIiwgewogICAgICBkOiAiTTY5LjUgOTdDNjkuNSA5OC4xMDQ2IDU2LjI5MjQgOTkgNDAgOTlDMjMuNzA3NiA5OSAxMC41IDk4LjEwNDYgMTAuNSA5N0MxMC41IDk1Ljg5NTQgMjMuNzA3NiA5NSA0MCA5NUM1Ni4yOTI0IDk1IDY5LjUgOTUuODk1NCA2OS41IDk3WiIsCiAgICAgIGZpbGw6ICJibGFjayIsCiAgICAgICJmaWxsLW9wYWNpdHkiOiAiMC4yIgogICAgfSkpKSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5oKSgicCIsIHsKICAgICAgY2xhc3NOYW1lOiBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLkNTU19DT05TVEFOVFMuUVVFU1RJT05fSEVBREVSX0NMQVNTLAogICAgICBpZDogX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5DU1NfQ09OU1RBTlRTLlFVRVNUSU9OX0hFQURFUl9DTEFTUwogICAgfSwgaGVhZGxpbmUpLCBjYXB0aW9uKSkpKTsKICB9Owp9KTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3ZpZXcvVm9pY2VWaWRlb0NhcmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvVm9pY2VWaWRlb0NhcmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5ICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc190b0NvbnN1bWFibGVBcnJheV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGh5cGVyYXBwICovICIuL25vZGVfbW9kdWxlcy9oeXBlcmFwcC9zcmMvaW5kZXguanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjbGFzc2NhdCAqLyAiLi9ub2RlX21vZHVsZXMvY2xhc3NjYXQvc3JjL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfdmlld19jb21wb25lbnRzX0Zvb3Rlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQC92aWV3L2NvbXBvbmVudHMvRm9vdGVyICovICIuL3NyYy92aWV3L2NvbXBvbmVudHMvRm9vdGVyLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfdXNlcmxlYXBfdmlkZW9fcGxheWVyX3JlY29yZGVyX3ZpZGVvUGxheWVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAdXNlcmxlYXAvdmlkZW8tcGxheWVyLXJlY29yZGVyL3ZpZGVvUGxheWVyICovICIuL25vZGVfbW9kdWxlcy9AdXNlcmxlYXAvdmlkZW8tcGxheWVyLXJlY29yZGVyL3ZpZGVvUGxheWVyLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2hlbHBlcnMvY2FyZCAqLyAiLi9zcmMvdmlldy9oZWxwZXJzL2NhcmQuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9zaGFyZWQvY29uc3RhbnRzICovICIuL3NyYy9zaGFyZWQvY29uc3RhbnRzLmpzIik7CgoKCmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHsgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyB9IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfQoKZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19kZWZpbmVQcm9wZXJ0eV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fX2RlZmF1bHQoKSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfQoKCgoKCgoKdmFyIElOQUNUSVZFX0JVVFRPTiA9ICd1bC1idXR0b24taW5hY3RpdmUnOwovKioKICogU3VibWlzc2lvbgogKiBAcGFyYW0ge0V2ZW50fSBldmVudAogKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXh0CiAqLwoKZnVuY3Rpb24gc3VibWl0KHZhbHVlLCBuZXh0KSB7CiAgbmV4dCh2YWx1ZSk7Cn0KLyoqCiAqIFRleHQgQ2FyZAogKiBAcGFyYW0ge09iamVjdH0gc3RhdGUKICogQHBhcmFtIHtPYmplY3R9IHN0YXRlLmNsYXNzTmFtZSBPcGVuVGV4dENhcmQgY2xhc3MKICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlLm1lc3NhZ2UgTWVzc2FnZQogKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBQcm9wZXJ0aWVzIGluY2x1ZGluZyBjYXB0aW9uIGJ1dHRvbiBhbmQgb3BlblRleHRQbGFjaG9sZGVyCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0YXRlLm5leHQgTmV4dCBjYXJkIGNhbGxiYWNrCiAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0ZS5hcGlVUkwgVVJMIGZvciBVc2VyTGVhcCBhcGkgcmVxdWVzdAogKiBAcmV0dXJuIHtPYmplY3R9IFRleHQgY2FyZAogKi8KCgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bImRlZmF1bHQiXSA9IChmdW5jdGlvbiAoX3JlZikgewogIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSwKICAgICAgbWVzc2FnZSA9IF9yZWYubWVzc2FnZSwKICAgICAgcHJvcGVydGllcyA9IF9yZWYucHJvcGVydGllcywKICAgICAgbmV4dCA9IF9yZWYubmV4dCwKICAgICAgcXVlc3Rpb25JZCA9IF9yZWYucXVlc3Rpb25JZCwKICAgICAgdXBkYXRlSGVpZ2h0ID0gX3JlZi51cGRhdGVIZWlnaHQ7CiAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7CiAgICB2YXIgY2xhc3NlcyA9ICgwLGNsYXNzY2F0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19bImRlZmF1bHQiXSkoW2NsYXNzTmFtZSwgX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXy5DU1NfQ09OU1RBTlRTLlZJREVPX0NBUkRfQ0xBU1NdKTsKICAgIHZhciBQTEFZRVJfUkVDT1JERVJfRUxFTUVOVF9JRCA9ICd1bC1jYXJkLXZpZGVvX19wbGF5ZXJfcmVjb3JkZXInOwogICAgdmFyIE5FWFRfQlVUVE9OX0lEID0gJ3VsLWNhcmQtdmlkZW9fX25leHRfYnV0dG9uJzsKICAgIHZhciBGT1JNX0lEID0gJ3VsLXZpZGVvLWludGVydmlldy1mb3JtJzsKICAgIHZhciBRVUVTVElPTl9WSURFT19TQ1JFRU5fSUQgPSAndWwtcXVlc3Rpb24tcGxheWVyLWNvbnRhaW5lcic7CiAgICB2YXIgUkVTUE9OU0VfVklERU9fU0NSRUVOX0lEID0gJ3VsLXJlY29yZGVyLXBsYXllci1jb250YWluZXInOwogICAgdmFyIFFVRVNUSU9OX1JFU1BPTlNFX0JUTlMgPSAndWwtdmlkZW8tYnRuJzsKICAgIHZhciBzdXJ2ZXlWaWRlb1VybCA9IHByb3BlcnRpZXMgJiYgcHJvcGVydGllcy52aWRlb1VybDsKICAgIHZhciBfc3RhdGUkYXBwID0gc3RhdGUuYXBwLAogICAgICAgIHN1cnZleUlkID0gX3N0YXRlJGFwcC5zdXJ2ZXlJZCwKICAgICAgICByZXNwb25zZUdyb3VwVWlkID0gX3N0YXRlJGFwcC5yZXNwb25zZUdyb3VwVWlkLAogICAgICAgIGFwaVVSTCA9IF9zdGF0ZSRhcHAuYXBpVVJMLAogICAgICAgIHZpc2l0b3JJZCA9IF9zdGF0ZSRhcHAudXNlcklkLAogICAgICAgIGJvcmRlciA9IF9zdGF0ZSRhcHAuYm9yZGVyLAogICAgICAgIGVudklkID0gX3N0YXRlJGFwcC5lbnZJZCwKICAgICAgICBoZWFkZXJzID0gX3N0YXRlJGFwcC5oZWFkZXJzOyAvLyBuZWVkIHRvIHVzZSBzdGF0ZSBwcm9wZXJ0eSBiZWNhdXNlIGh5cGVyYXBwIHJldXNlcyBjb21wb25lbnQgc3RhdGUuCiAgICAvLyBXZSBoYWQgYSBidWcgd2hlcmUgdXBsb2FkSWQgd2FzIG5vdCB1cGRhdGluZyBmb3Igc3Vic2VxdWVudCBxdWVzdGlvbnMKCiAgICBpZiAoIXN0YXRlLmNhcmREYXRhKSBzdGF0ZS5jYXJkRGF0YSA9IHt9OwogICAgc3RhdGUuY2FyZERhdGEudXBsb2FkSWQgPSB1bmRlZmluZWQ7CiAgICBzdGF0ZS5jYXJkRGF0YS5idXR0b25UZXh0ID0gKDAsX2hlbHBlcnNfY2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLmdldEJ1dHRvblRleHQpKHByb3BlcnRpZXMpOwogICAgc3RhdGUuY2FyZERhdGEuc2tpcEJ1dHRvblRleHQgPSAoMCxfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18uZ2V0U2tpcEJ1dHRvblRleHQpKHByb3BlcnRpZXMpOwogICAgdmFyIGV4aXN0aW5nUGxheWVyQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoUExBWUVSX1JFQ09SREVSX0VMRU1FTlRfSUQpOwoKICAgIGlmIChleGlzdGluZ1BsYXllckNvbnRhaW5lcikgewogICAgICAvLyB3ZSBhcmUgYXQgYSByZWZyZXNoIHNjZW5hcmlvCiAgICAgICgwLF91c2VybGVhcF92aWRlb19wbGF5ZXJfcmVjb3JkZXJfdmlkZW9QbGF5ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5yZWZyZXNoUGxheWVyUmVjb3JkZXJDb21ibykoUExBWUVSX1JFQ09SREVSX0VMRU1FTlRfSUQsIHN1cnZleVZpZGVvVXJsLCB7CiAgICAgICAgc3VydmV5SWQ6IHN1cnZleUlkLAogICAgICAgIHJlc3BvbnNlR3JvdXBVaWQ6IHJlc3BvbnNlR3JvdXBVaWQsCiAgICAgICAgcXVlc3Rpb25JZDogcXVlc3Rpb25JZCwKICAgICAgICB2aXNpdG9ySWQ6IHZpc2l0b3JJZAogICAgICB9LCBwcm9wZXJ0aWVzLm1lZGlhVHlwZSA9PT0gX3VzZXJsZWFwX3ZpZGVvX3BsYXllcl9yZWNvcmRlcl92aWRlb1BsYXllcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLlJFQ09SREVSLk1FRElBX1RZUEVfQVVESU8pOwogICAgICB2YXIgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoTkVYVF9CVVRUT05fSUQpOwogICAgICBidXR0b24uaW5uZXJUZXh0ID0gc3RhdGUuY2FyZERhdGEuc2tpcEJ1dHRvblRleHQ7CiAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKElOQUNUSVZFX0JVVFRPTik7CiAgICB9CgogICAgdmFyIHZpZGVvUmVjb3JkZXJDYWxsYmFjayA9IGZ1bmN0aW9uIHZpZGVvUmVjb3JkZXJDYWxsYmFjayhzdGF0dXMsIGRhdGEpIHsKICAgICAgdmFyIGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKE5FWFRfQlVUVE9OX0lEKTsKCiAgICAgIGlmIChzdGF0dXMgPT09IF91c2VybGVhcF92aWRlb19wbGF5ZXJfcmVjb3JkZXJfdmlkZW9QbGF5ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5SRUNPUkRFUi5VUExPQURfU1RBUlRFRCkgewogICAgICAgIHN0YXRlLmNhcmREYXRhLnVwbG9hZElkID0gZGF0YVtfdXNlcmxlYXBfdmlkZW9fcGxheWVyX3JlY29yZGVyX3ZpZGVvUGxheWVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uUkVDT1JERVIuVVBMT0FEX0lEXTsKICAgICAgICBidXR0b24uaW5uZXJUZXh0ID0gc3RhdGUuY2FyZERhdGEuYnV0dG9uVGV4dDsKICAgICAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZShJTkFDVElWRV9CVVRUT04pOwogICAgICAgIE9iamVjdC5hc3NpZ24oYnV0dG9uLnN0eWxlLCB7CiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGJvcmRlcgogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gX3VzZXJsZWFwX3ZpZGVvX3BsYXllcl9yZWNvcmRlcl92aWRlb1BsYXllcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLlJFQ09SREVSLkRFTEVURSkgewogICAgICAgIHN0YXRlLmNhcmREYXRhLnVwbG9hZElkID0gbnVsbDsKICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZChJTkFDVElWRV9CVVRUT04pOwogICAgICAgIGJ1dHRvbi5pbm5lclRleHQgPSBzdGF0ZS5jYXJkRGF0YS5za2lwQnV0dG9uVGV4dDsKICAgICAgICBPYmplY3QuYXNzaWduKGJ1dHRvbi5zdHlsZSwgewogICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnJwogICAgICAgIH0pOwogICAgICB9IC8vIGVsc2UgaWYgKHN0YXR1cyA9PT0gUkVDT1JERVIuRVJST1IpICAvLyB0b2RvIHNob3cgYSBwZXJtaXNzaW9uIGRlbmllZCBzY3JlZW4gaW5zdGVhZCBvZiB0aGUgcmVjb3JkZXIgYXQgdGhpcyBwb2ludAoKICAgIH07CgogICAgdmFyIGhhbmRsZVN1Ym1pdCA9IGZ1bmN0aW9uIGhhbmRsZVN1Ym1pdChlKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgKDAsX3VzZXJsZWFwX3ZpZGVvX3BsYXllcl9yZWNvcmRlcl92aWRlb1BsYXllcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLnN0b3BSZWNvcmRpbmcpKFBMQVlFUl9SRUNPUkRFUl9FTEVNRU5UX0lEKTsKICAgICAgdmFyIGZvcm0gPSBkb2N1bWVudC5mb3Jtc1tGT1JNX0lEXTsKICAgICAgaWYgKCFmb3JtKSByZXR1cm47CgogICAgICBpZiAoc3RhdGUuY2FyZERhdGEudXBsb2FkSWQpIHsKICAgICAgICAvLyB1c2VyIHN1Ym1pdHRlZCBhIHZhbGlkIHZpZGVvLCB3aGljaCB3aWxsIGJlIHN0b3JlZCBvbiB0aGUgcmVzcG9uc2UgdmlhIHdlYmhvb2sKICAgICAgICBzdWJtaXQoe30sIG5leHQpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIHVzZXIgbmV2ZXIgcmVjb3JkZWQgYSB2aWRlbywgb3IgcmVjb3JkZWQgaXQgYnV0IHRoZW4gZGVsZXRlZCBpdCBiZWZvcmUgY29udGludWluZwogICAgICAgIHN1Ym1pdCh7CiAgICAgICAgICBkZWxldGVkQXQ6IERhdGUubm93KCkKICAgICAgICB9LCBuZXh0KTsKICAgICAgfSAvLyBTaG93IHF1ZXN0aW9uIHZpZGVvIHBsYXllciBmb3IgYW55IGZvbGxvd2luZyBWK1YgY2FyZHMKCgogICAgICB2YXIgZ2V0UXVlc3Rpb25WaWRlbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFFVRVNUSU9OX1ZJREVPX1NDUkVFTl9JRCk7CiAgICAgIHZhciBnZXRSZXNwb25zZVZpZGVvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoUkVTUE9OU0VfVklERU9fU0NSRUVOX0lEKTsKICAgICAgZ2V0UmVzcG9uc2VWaWRlby5jbGFzc0xpc3QuYWRkKF91c2VybGVhcF92aWRlb19wbGF5ZXJfcmVjb3JkZXJfdmlkZW9QbGF5ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5ISURERU5fQ0xBU1MpOwogICAgICBnZXRRdWVzdGlvblZpZGVvLmNsYXNzTGlzdC5yZW1vdmUoX3VzZXJsZWFwX3ZpZGVvX3BsYXllcl9yZWNvcmRlcl92aWRlb1BsYXllcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLkhJRERFTl9DTEFTUyk7CiAgICB9OwoKICAgIHZhciBoYW5kbGVTY3JlZW5DaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVTY3JlZW5DaGFuZ2UoKSB7CiAgICAgIHZhciBzaG93UXVlc3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7CiAgICAgIHZhciBnZXRRdWVzdGlvblZpZGVvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoUVVFU1RJT05fVklERU9fU0NSRUVOX0lEKTsKICAgICAgdmFyIGdldFJlc3BvbnNlVmlkZW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChSRVNQT05TRV9WSURFT19TQ1JFRU5fSUQpOwoKICAgICAgaWYgKHNob3dRdWVzdGlvbikgewogICAgICAgIGdldFF1ZXN0aW9uVmlkZW8uY2xhc3NMaXN0LnJlbW92ZShfdXNlcmxlYXBfdmlkZW9fcGxheWVyX3JlY29yZGVyX3ZpZGVvUGxheWVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uSElEREVOX0NMQVNTKTsKICAgICAgICBnZXRRdWVzdGlvblZpZGVvLmNsYXNzTGlzdC5hZGQoX3VzZXJsZWFwX3ZpZGVvX3BsYXllcl9yZWNvcmRlcl92aWRlb1BsYXllcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLlZJU0lCTEVfQ0xBU1MpOwogICAgICAgIGdldFJlc3BvbnNlVmlkZW8uY2xhc3NMaXN0LmFkZChfdXNlcmxlYXBfdmlkZW9fcGxheWVyX3JlY29yZGVyX3ZpZGVvUGxheWVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uSElEREVOX0NMQVNTKTsKICAgICAgICBnZXRSZXNwb25zZVZpZGVvLmNsYXNzTGlzdC5yZW1vdmUoX3VzZXJsZWFwX3ZpZGVvX3BsYXllcl9yZWNvcmRlcl92aWRlb1BsYXllcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLlZJU0lCTEVfQ0xBU1MpOwogICAgICB9IGVsc2UgewogICAgICAgICgwLF91c2VybGVhcF92aWRlb19wbGF5ZXJfcmVjb3JkZXJfdmlkZW9QbGF5ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5wYXVzZVF1ZXN0aW9uUGxheWVyKShQTEFZRVJfUkVDT1JERVJfRUxFTUVOVF9JRCk7CiAgICAgICAgZ2V0UXVlc3Rpb25WaWRlby5jbGFzc0xpc3QuYWRkKF91c2VybGVhcF92aWRlb19wbGF5ZXJfcmVjb3JkZXJfdmlkZW9QbGF5ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5ISURERU5fQ0xBU1MpOwogICAgICAgIGdldFF1ZXN0aW9uVmlkZW8uY2xhc3NMaXN0LnJlbW92ZShfdXNlcmxlYXBfdmlkZW9fcGxheWVyX3JlY29yZGVyX3ZpZGVvUGxheWVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uVklTSUJMRV9DTEFTUyk7CiAgICAgICAgZ2V0UmVzcG9uc2VWaWRlby5jbGFzc0xpc3QucmVtb3ZlKF91c2VybGVhcF92aWRlb19wbGF5ZXJfcmVjb3JkZXJfdmlkZW9QbGF5ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5ISURERU5fQ0xBU1MpOwogICAgICAgIGdldFJlc3BvbnNlVmlkZW8uY2xhc3NMaXN0LmFkZChfdXNlcmxlYXBfdmlkZW9fcGxheWVyX3JlY29yZGVyX3ZpZGVvUGxheWVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uVklTSUJMRV9DTEFTUyk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIHNldFJlc2l6ZU9ic2VydmVyID0gZnVuY3Rpb24gc2V0UmVzaXplT2JzZXJ2ZXIoKSB7CiAgICAgIC8vIExpc3RlbiBmb3IgaGVpZ2h0IGNoYW5nZXMsIGFuZCB1cGRhdGUgYXBwIGhlaWdodCB3aGVuIHRoZXkgb2NjdXIuCiAgICAgIHZhciB2aWRlb0NhcmRSZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihmdW5jdGlvbiAoZW50cmllcykgewogICAgICAgIHJldHVybiB1cGRhdGVIZWlnaHQoKTsKICAgICAgfSk7CiAgICAgIHZhciB2aWRlb0NhcmRFbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLiIuY29uY2F0KF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18uQ1NTX0NPTlNUQU5UUy5WSURFT19DQVJEX0NMQVNTKSk7CiAgICAgIHZpZGVvQ2FyZFJlc2l6ZU9ic2VydmVyLm9ic2VydmUodmlkZW9DYXJkRWxlbSk7CiAgICB9OwoKICAgIHZhciBhcHBlbmRQbGF5ZXJSZWNvcmRlciA9IGZ1bmN0aW9uIGFwcGVuZFBsYXllclJlY29yZGVyKCkgewogICAgICB2YXIgdmlkZW9Db250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChQTEFZRVJfUkVDT1JERVJfRUxFTUVOVF9JRCk7CiAgICAgIHZpZGVvQ29udGFpbmVyLmFwcGVuZENoaWxkKGdldFF1ZXN0aW9uUGxheWVyU2NyZWVuKCkpOwogICAgICB2aWRlb0NvbnRhaW5lci5hcHBlbmRDaGlsZChnZXRSZWNvcmRlclBsYXllclNjcmVlbigpKTsKICAgICAgcmV0dXJuIHZpZGVvQ29udGFpbmVyOwogICAgfTsKCiAgICB2YXIgY3JlYXRlTmF2aWdhdGlvbkJ0biA9IGZ1bmN0aW9uIGNyZWF0ZU5hdmlnYXRpb25CdG4oY2xhc3NOYW1lLCBjYW5IYW5kbGVTY3JlZW5DaGFuZ2UpIHsKICAgICAgdmFyIG5ld0J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgICBuZXdCdXR0b24uY2xhc3NOYW1lID0gIiIuY29uY2F0KFFVRVNUSU9OX1JFU1BPTlNFX0JUTlMsICIgIikuY29uY2F0KGNsYXNzTmFtZSk7CiAgICAgIG5ld0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgaGFuZGxlU2NyZWVuQ2hhbmdlKGNhbkhhbmRsZVNjcmVlbkNoYW5nZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3QnV0dG9uOwogICAgfTsgLy8gVitWIHF1ZXN0aW9uIGFuZCByZXNwb25zZSBhcmUgc2VwYXJhdGVkIGludG8gdHdvIHNjcmVlbnMgbm93LgogICAgLy8gVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBxdWVzdGlvbiBzY3JlZW4uCgoKICAgIHZhciBnZXRRdWVzdGlvblBsYXllclNjcmVlbiA9IGZ1bmN0aW9uIGdldFF1ZXN0aW9uUGxheWVyU2NyZWVuKCkgewogICAgICB2YXIgcXVlc3Rpb25QbGF5ZXJDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgcXVlc3Rpb25QbGF5ZXJDb250YWluZXIuaWQgPSAndWwtcXVlc3Rpb24tcGxheWVyLWNvbnRhaW5lcic7CiAgICAgIHF1ZXN0aW9uUGxheWVyQ29udGFpbmVyLmNsYXNzTmFtZSA9ICJ1bC12aWRlby1jb250YWluZXIgIi5jb25jYXQoX3VzZXJsZWFwX3ZpZGVvX3BsYXllcl9yZWNvcmRlcl92aWRlb1BsYXllcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLlZJU0lCTEVfQ0xBU1MpOyAvLyBhcHBlbmQgdmlkZW8gcXVlc3Rpb24KCiAgICAgIHF1ZXN0aW9uUGxheWVyQ29udGFpbmVyLmFwcGVuZENoaWxkKCgwLF91c2VybGVhcF92aWRlb19wbGF5ZXJfcmVjb3JkZXJfdmlkZW9QbGF5ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy52aWRlb1BsYXllcikoUExBWUVSX1JFQ09SREVSX0VMRU1FTlRfSUQsIHsKICAgICAgICBzcmM6IHN1cnZleVZpZGVvVXJsLAogICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi94LW1wZWdVUkwnCiAgICAgIH0sIHVuZGVmaW5lZCwgcHJvcGVydGllcy5tZWRpYVR5cGUgPT09IF91c2VybGVhcF92aWRlb19wbGF5ZXJfcmVjb3JkZXJfdmlkZW9QbGF5ZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXy5SRUNPUkRFUi5NRURJQV9UWVBFX0FVRElPLCBhcGlVUkwpKTsgLy8gYXBwZW5kIHJlc3BvbnNlIGJ1dHRvbgoKICAgICAgdmFyIHJlY29yZFJlc3BvbnNlQnRuID0gY3JlYXRlTmF2aWdhdGlvbkJ0bigndWwtcmVjb3JkLXJlc3BvbnNlLWJ0bicsIGZhbHNlKTsKICAgICAgcXVlc3Rpb25QbGF5ZXJDb250YWluZXIuYXBwZW5kQ2hpbGQocmVjb3JkUmVzcG9uc2VCdG4pOwogICAgICByZXR1cm4gcXVlc3Rpb25QbGF5ZXJDb250YWluZXI7CiAgICB9OyAvLyBWK1YgcXVlc3Rpb24gYW5kIHJlc3BvbnNlIGFyZSBzZXBhcmF0ZWQgaW50byB0d28gc2NyZWVucyBub3cuCiAgICAvLyBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIHJlc3BvbnNlIHNjcmVlbi4KCgogICAgdmFyIGdldFJlY29yZGVyUGxheWVyU2NyZWVuID0gZnVuY3Rpb24gZ2V0UmVjb3JkZXJQbGF5ZXJTY3JlZW4oKSB7CiAgICAgIHZhciBxdWVzdGlvblBsYXllckNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBxdWVzdGlvblBsYXllckNvbnRhaW5lci5pZCA9ICd1bC1yZWNvcmRlci1wbGF5ZXItY29udGFpbmVyJzsKICAgICAgcXVlc3Rpb25QbGF5ZXJDb250YWluZXIuY2xhc3NOYW1lID0gInVsLXZpZGVvLWNvbnRhaW5lciAiLmNvbmNhdChfdXNlcmxlYXBfdmlkZW9fcGxheWVyX3JlY29yZGVyX3ZpZGVvUGxheWVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uSElEREVOX0NMQVNTKTsgLy8gYXBwZW5kIGJhY2sgdG8gcXVlc3Rpb24gYnV0dG9uCgogICAgICB2YXIgcXVlc3Rpb25TY3JlZW5CdG4gPSBjcmVhdGVOYXZpZ2F0aW9uQnRuKCd1bC1iYWNrLXF1ZXN0aW9uLWJ0bicsIHRydWUpOwogICAgICBxdWVzdGlvblBsYXllckNvbnRhaW5lci5hcHBlbmRDaGlsZChxdWVzdGlvblNjcmVlbkJ0bik7IC8vIGFwcGVuZCByZXNwb25zZSB2aWRlbwoKICAgICAgcXVlc3Rpb25QbGF5ZXJDb250YWluZXIuYXBwZW5kQ2hpbGQoKDAsX3VzZXJsZWFwX3ZpZGVvX3BsYXllcl9yZWNvcmRlcl92aWRlb1BsYXllcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fLnZpZGVvUmVjb3JkZXJQbGF5ZXIpKFBMQVlFUl9SRUNPUkRFUl9FTEVNRU5UX0lELCB7CiAgICAgICAgc3VydmV5SWQ6IHN1cnZleUlkLAogICAgICAgIHJlc3BvbnNlR3JvdXBVaWQ6IHJlc3BvbnNlR3JvdXBVaWQsCiAgICAgICAgcXVlc3Rpb25JZDogcXVlc3Rpb25JZCwKICAgICAgICB2aXNpdG9ySWQ6IHZpc2l0b3JJZCwKICAgICAgICBlbnZJZDogZW52SWQKICAgICAgfSwgYXBpVVJMLCB2aWRlb1JlY29yZGVyQ2FsbGJhY2ssIGZhbHNlLCBfb2JqZWN0U3ByZWFkKHt9LCBoZWFkZXJzLCB7CiAgICAgICAgJ3gtdWwtdmlkZW8tcmVjb3JkZXItb3JpZ2luJzogJ3NkaycKICAgICAgfSksIHByb3BlcnRpZXMubWVkaWFUeXBlID09PSBfdXNlcmxlYXBfdmlkZW9fcGxheWVyX3JlY29yZGVyX3ZpZGVvUGxheWVyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uUkVDT1JERVIuTUVESUFfVFlQRV9BVURJTykpOwogICAgICByZXR1cm4gcXVlc3Rpb25QbGF5ZXJDb250YWluZXI7CiAgICB9OwoKICAgIHZhciBjYXB0aW9uID0gKDAsX2hlbHBlcnNfY2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fLmdldENhcHRpb24pKHByb3BlcnRpZXMpOwogICAgcmV0dXJuICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiAoMCxjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fWyJkZWZhdWx0Il0pKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkoKDAsX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXy5nZXRQbGF0Zm9ybUNsYXNzKShfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fLkNTU19DT05TVEFOVFMuQ0FSRF9NQUlOX0NPTlRFTlQsIGhlYWRlcnNbJ3VzZXJsZWFwLXBsYXRmb3JtJ10pKSksCiAgICAgIHN0eWxlOiB7CiAgICAgICAgbWFyZ2luVG9wOiAndW5zZXQnCiAgICAgIH0KICAgIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uaCkoImRpdiIsIHsKICAgICAgY2xhc3NOYW1lOiBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fLkNTU19DT05TVEFOVFMuRkFERV9JTl9DTEFTUywKICAgICAga2V5OiBxdWVzdGlvbklkCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmgpKCJmb3JtIiwgewogICAgICBpZDogRk9STV9JRCwKICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLAogICAgICBvbmNyZWF0ZTogc2V0UmVzaXplT2JzZXJ2ZXIsCiAgICAgIG9uc3VibWl0OiBmdW5jdGlvbiBvbnN1Ym1pdChldmVudCkgewogICAgICAgIHJldHVybiBzdWJtaXQoZXZlbnQsIG5leHQpOwogICAgICB9CiAgICB9LCAoMCxfaGVscGVyc19jYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18uZ2V0SGVhZGxpbmUpKGNhcHRpb24sIG1lc3NhZ2UpLCBjYXB0aW9uLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmgpKCJkaXYiLCB7CiAgICAgIGlkOiAidWwtY2FyZC12b2ljZV9fdmlkZW8iCiAgICB9LCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmgpKCJkaXYiLCB7CiAgICAgIGlkOiBQTEFZRVJfUkVDT1JERVJfRUxFTUVOVF9JRCwKICAgICAgb25jcmVhdGU6IGFwcGVuZFBsYXllclJlY29yZGVyCiAgICB9KSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5oKSgiYnV0dG9uIiwgewogICAgICBpZDogTkVYVF9CVVRUT05fSUQsCiAgICAgIGNsYXNzTmFtZTogInVsLWNhcmQtdGV4dF9fYnV0dG9uICIuY29uY2F0KElOQUNUSVZFX0JVVFRPTiksCiAgICAgIG9uY2xpY2s6IGhhbmRsZVN1Ym1pdCwKICAgICAgcm9sZTogImJ1dHRvbiIKICAgIH0sICgwLF9oZWxwZXJzX2NhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXy5nZXRTa2lwQnV0dG9uVGV4dCkocHJvcGVydGllcykpKSkpKTsKICB9Owp9KTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3ZpZXcvY29tcG9uZW50cy9Gb290ZXIuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvY29tcG9uZW50cy9Gb290ZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgaHlwZXJhcHAgKi8gIi4vbm9kZV9tb2R1bGVzL2h5cGVyYXBwL3NyYy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfY29tcG9uZW50c19Mb2dvX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvY29tcG9uZW50cy9Mb2dvLmpzICovICIuL3NyYy92aWV3L2NvbXBvbmVudHMvTG9nby5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfdXRpbF9za2lwTG9naWNIZWxwZXJzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvdXRpbC9za2lwTG9naWNIZWxwZXJzICovICIuL3NyYy92aWV3L3V0aWwvc2tpcExvZ2ljSGVscGVycy5qcyIpOwoKCgovKioKICogRm9vdGVyIGNvbXBvbmVudAogKiBAcmV0dXJuIHtPYmplY3R9IENvbXBvbmVudAogKi8KCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gKGZ1bmN0aW9uICgpIHsKICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlKSB7CiAgICB2YXIgc3RlcHMgPSBzdGF0ZS5hcHAuZGVjay5jYXJkcyB8fCBbXTsKICAgIHZhciBxdWVzdGlvblN0ZXBzID0gc3RlcHMuZmlsdGVyKGZ1bmN0aW9uIChzdGVwKSB7CiAgICAgIHJldHVybiBzdGVwLnR5cGU7CiAgICB9KTsKICAgIHZhciBjdXJyZW50U3RlcCA9IHN0YXRlLmFwcC5kZWNrLmluZGV4OwogICAgdmFyIF9zdGF0ZSRhcHAgPSBzdGF0ZS5hcHAsCiAgICAgICAgc2hvd1N1cnZleUJyYW5kID0gX3N0YXRlJGFwcC5zaG93U3VydmV5QnJhbmQsCiAgICAgICAgbWFya2V0aW5nVXJsID0gX3N0YXRlJGFwcC5tYXJrZXRpbmdVcmwsCiAgICAgICAgc2x1Z05hbWUgPSBfc3RhdGUkYXBwLnNsdWdOYW1lLAogICAgICAgIHN1cnZleUlkID0gX3N0YXRlJGFwcC5zdXJ2ZXlJZCwKICAgICAgICB2aWV3ZWRDYXJkQ291bnQgPSBfc3RhdGUkYXBwLnZpZXdlZENhcmRDb3VudCwKICAgICAgICBoZWFkZXJzID0gX3N0YXRlJGFwcC5oZWFkZXJzLAogICAgICAgIGRlY2sgPSBfc3RhdGUkYXBwLmRlY2ssCiAgICAgICAgYm9yZGVyID0gX3N0YXRlJGFwcC5ib3JkZXI7CiAgICB2YXIgbWF4UmVtYWluaW5nQ2FyZHMgPSAoMCxfdmlld191dGlsX3NraXBMb2dpY0hlbHBlcnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5nZXRNYXhSZW1haW5pbmdDYXJkcykoZGVjay5jYXJkcyB8fCBbXSwgZGVjay5pbmRleCk7IC8vIGNvdW50IHRoZSBjdXJyZW50IGNhcmQgYXMgdmlld2VkIHNvIHRoZXJlIGlzIG5vdCAwIHByb2dyZXNzIGZvciBmaXJzdCBxdWVzdGlvbi4KICAgIC8vIG5vdGUgdGhpcyBpbmNyZWFzZXMgdG90YWwgZGVub21pbmF0b3IgYnkgMQogICAgLy8gZXg6IGlmIHRoZXJlIGFyZSAyIHF1ZXN0aW9ucywgaXQgd2lsbCBsb29rIDEvMyBkb25lIGZvciB0aGUgZmlyc3QgcXVlc3Rpb24sIGFuZCAyLzMgZG9uZSBmb3IgdGhlIHNlY29uZC4KCiAgICB2YXIgcGFkZGVkVmlld2VkQ2FyZENvdW50ID0gdmlld2VkQ2FyZENvdW50ICsgMTsKICAgIHZhciBmcmFjdGlvbkNvbXBsZXRlZCA9IHBhZGRlZFZpZXdlZENhcmRDb3VudCAvIChwYWRkZWRWaWV3ZWRDYXJkQ291bnQgKyBtYXhSZW1haW5pbmdDYXJkcyk7CgogICAgdmFyIGJyYW5kZWRMb2dvID0gZnVuY3Rpb24gYnJhbmRlZExvZ28oKSB7CiAgICAgIHJldHVybiBzaG93U3VydmV5QnJhbmQgPyAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmgpKCJhIiwgewogICAgICAgIHN0eWxlOiAiZGlzcGxheTogYmxvY2s7IG1hcmdpbjogNXB4IDAgMTBweCAwIiwKICAgICAgICBocmVmOiAiIi5jb25jYXQobWFya2V0aW5nVXJsLCAiP3V0bV9zb3VyY2U9c3VydmV5X2JyYW5kaW5nJnV0bV9tZWRpdW09d2Vic2l0ZSZ1dG1fY2FtcGFpZ249IikuY29uY2F0KHNsdWdOYW1lLCAiJnV0bV9jb250ZW50PSIpLmNvbmNhdChzdXJ2ZXlJZCksCiAgICAgICAgdGFyZ2V0OiAiX2JsYW5rIgogICAgICB9LCBfdmlld19jb21wb25lbnRzX0xvZ29fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1siZGVmYXVsdCJdKSA6IG51bGw7CiAgICB9OyAvLyBUaGVyZSdzIG9ubHkgMSBxdWVzdGlvbiBpbiB0aGUgc3R1ZHksIG5vIHByb2dyZXNzIGJhcgoKCiAgICBpZiAoIXF1ZXN0aW9uU3RlcHMgfHwgcXVlc3Rpb25TdGVwcy5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaCkoImZvb3RlciIsIHsKICAgICAgICBjbGFzc05hbWU6ICJ1bC1mb290ZXIiCiAgICAgIH0sIGJyYW5kZWRMb2dvKTsKICAgIH0KCiAgICB2YXIgcHJvZ3Jlc3NJbmRpY2F0b3IgPSBmdW5jdGlvbiBwcm9ncmVzc0luZGljYXRvcigpIHsKICAgICAgaWYgKHF1ZXN0aW9uU3RlcHMubGVuZ3RoID4gMSkgewogICAgICAgIHJldHVybiAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmgpKCJkaXYiLCB7CiAgICAgICAgICBpZDogInVsLXByb2dyZXNzLWJhci1jb250YWluZXIiCiAgICAgICAgfSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgiZGl2IiwgewogICAgICAgICAgaWQ6ICJ1bC1wcm9ncmVzcy1iYXItY3VycmVudCIsCiAgICAgICAgICBzdHlsZTogZ2V0UHJvZ3Jlc3NXaWR0aCgpCiAgICAgICAgfSkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9OwoKICAgIHZhciBnZXRQcm9ncmVzc1dpZHRoID0gZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NXaWR0aCgpIHsKICAgICAgdmFyIHByb2dyZXNzQmFyV2lkdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndWwtcHJvZ3Jlc3MtYmFyLWNvbnRhaW5lcicpOyAvLyBUaGUgZmlyc3QgcXVlc3Rpb24gZG9lc24ndCBoYXZlIERPTSBmdWxseSByZW5kZXJlZCB5ZXQKCiAgICAgIHZhciB0b3RhbFdpZHRoID0gcHJvZ3Jlc3NCYXJXaWR0aCA/IHByb2dyZXNzQmFyV2lkdGguY2xpZW50V2lkdGggOiAyNTA7CiAgICAgIHZhciBnZXRPbGRXaWR0aCA9IHByb2dyZXNzQmFyV2lkdGggPyAiIi5jb25jYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VsLXByb2dyZXNzLWJhci1jdXJyZW50Jykuc3R5bGUud2lkdGgucmVwbGFjZSgncHgnLCAnJykpIDogMDsKICAgICAgdmFyIGdldE5ld1dpZHRoID0gIiIuY29uY2F0KHBhcnNlRmxvYXQoKGZyYWN0aW9uQ29tcGxldGVkICogdG90YWxXaWR0aCkudG9GaXhlZCg0KSkpOwogICAgICBpZiAoZ2V0T2xkV2lkdGggIT09IGdldE5ld1dpZHRoKSBhZGRBbmltYXRpb24oZ2V0T2xkV2lkdGgsIGdldE5ld1dpZHRoKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB3aWR0aDogIiIuY29uY2F0KGdldE5ld1dpZHRoLCAicHgiKSwKICAgICAgICBhbmltYXRpb246ICJncm93UmlnaHQgMXMiLAogICAgICAgIGJvcmRlcjogIjFweCBzb2xpZCAiLmNvbmNhdChib3JkZXIgPyBib3JkZXIgOiAnIzAwMCcpCiAgICAgIH07CiAgICB9OyAvLyBEeW5hbWljYWxseSBhZGQga2V5ZnJhbWUgYW5pbWF0aW9uIGZvciBwcm9ncmVzcyBiYXIgdG8gaW5jcmVhc2UKCgogICAgdmFyIGFkZEFuaW1hdGlvbiA9IGZ1bmN0aW9uIGFkZEFuaW1hdGlvbihzdGFydCwgZW5kKSB7CiAgICAgIHZhciBjc3NBbmltYXRpb24gPSAiXG4gICAgICBAa2V5ZnJhbWVzIGdyb3dSaWdodCB7XG4gICAgICAgIGZyb20ge1xuICAgICAgICAgIHdpZHRoOiAiLmNvbmNhdChzdGFydCwgInB4O1xuICAgICAgICB9XG4gICAgICAgIHRvIHtcbiAgICAgICAgICB3aWR0aDogIikuY29uY2F0KGVuZCwgInB4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgIik7CiAgICAgIHZhciBkeW5hbWljU3R5bGVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgZHluYW1pY1N0eWxlcy50eXBlID0gJ3RleHQvY3NzJzsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChkeW5hbWljU3R5bGVzKTsKICAgICAgZHluYW1pY1N0eWxlcy5zaGVldC5pbnNlcnRSdWxlKGNzc0FuaW1hdGlvbiwgZHluYW1pY1N0eWxlcy5sZW5ndGgpOwogICAgfTsKCiAgICByZXR1cm4gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgiZm9vdGVyIiwgewogICAgICBjbGFzc05hbWU6ICJ1bC1mb290ZXIgIi5jb25jYXQoaGVhZGVyc1sndXNlcmxlYXAtcGxhdGZvcm0nXSA9PT0gJ2xpbmsnID8gJ3VsLWZvb3Rlcl9fbGluaycgOiAnJyksCiAgICAgIGtleTogY3VycmVudFN0ZXAKICAgIH0sIHByb2dyZXNzSW5kaWNhdG9yLCBicmFuZGVkTG9nbyk7CiAgfTsKfSk7CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy92aWV3L2NvbXBvbmVudHMvTG9nby5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvY29tcG9uZW50cy9Mb2dvLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBoeXBlcmFwcCAqLyAiLi9ub2RlX21vZHVsZXMvaHlwZXJhcHAvc3JjL2luZGV4LmpzIik7CgovKioKICogVXNlckxlYXAgbG9nbyBjb21wb25lbnQKICogQHJldHVybiB7T2JqZWN0fSBMb2dvIGNvbXBvbmVudAogKi8KCi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gKGZ1bmN0aW9uICgpIHsKICByZXR1cm4gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgic3ZnIiwgewogICAgd2lkdGg6ICIxMDAiLAogICAgaGVpZ2h0OiAiMTMiLAogICAgdmlld0JveDogIjAgMCAxMDAgMTMiLAogICAgZmlsbDogIm5vbmUiLAogICAgeG1sbnM6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsCiAgICBhbHQ6ICJQb3dlcmVkIGJ5IFNwcmlnIgogIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaCkoInBhdGgiLCB7CiAgICBkOiAiTTMuMDM2OSAwLjgzOTk4MUgwLjAyNDkwMjNWOC45OTk5OEgxLjMyMDlWNi41Mzk5OEgyLjg1NjlDNC44OTY5IDYuNTM5OTggNi4yNDA5IDUuMzc1OTggNi4yNDA5IDMuNjIzOThDNi4yNDA5IDEuOTU1OTggNC45Njg5IDAuODM5OTgxIDMuMDM2OSAwLjgzOTk4MVpNMy4wMDA5IDUuMzUxOThIMS4zMjA5VjIuMDI3OThIMy4wMDA5QzQuMTc2OSAyLjAyNzk4IDQuOTY4OSAyLjY3NTk4IDQuOTY4OSAzLjYyMzk4QzQuOTY4OSA0LjY1NTk4IDQuMTc2OSA1LjM1MTk4IDMuMDAwOSA1LjM1MTk4WiIsCiAgICBmaWxsOiAiIzVENjk2RiIKICB9KSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgicGF0aCIsIHsKICAgIGQ6ICJNOS45MDY1MyAzLjIxNTk4QzguMTU0NTMgMy4yMTU5OCA2LjkwNjUzIDQuNDUxOTggNi45MDY1MyA2LjE3OTk4QzYuOTA2NTMgNy45MDc5OCA4LjE1NDUzIDkuMTQzOTggOS45MDY1MyA5LjE0Mzk4QzExLjY1ODUgOS4xNDM5OCAxMi45MDY1IDcuOTA3OTggMTIuOTA2NSA2LjE3OTk4QzEyLjkwNjUgNC40NTE5OCAxMS42NTg1IDMuMjE1OTggOS45MDY1MyAzLjIxNTk4Wk05LjkwNjUzIDguMDE1OThDOC44ODY1MyA4LjAxNTk4IDguMTU0NTMgNy4yMzU5OCA4LjE1NDUzIDYuMTc5OThDOC4xNTQ1MyA1LjExMTk4IDguODg2NTMgNC4zNDM5OCA5LjkwNjUzIDQuMzQzOThDMTAuOTI2NSA0LjM0Mzk4IDExLjY1ODUgNS4xMTE5OCAxMS42NTg1IDYuMTc5OThDMTEuNjU4NSA3LjIzNTk4IDEwLjkyNjUgOC4wMTU5OCA5LjkwNjUzIDguMDE1OThaIiwKICAgIGZpbGw6ICIjNUQ2OTZGIgogIH0pLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmgpKCJwYXRoIiwgewogICAgZDogIk0yMC45NjMxIDMuMzU5OThMMTkuNzM5MSA3LjExNTk4TDE4LjM5NTEgMy4zNTk5OEgxNy4zMjcxTDE1Ljk4MzEgNy4xMjc5OEwxNC43NTkxIDMuMzU5OThIMTMuNDE1MUwxNS40NDMxIDguOTk5OThIMTYuNTM1MUwxNy44NjcxIDUuMDg3OThMMTkuMTg3MSA4Ljk5OTk4SDIwLjI3OTFMMjIuMzA3MSAzLjM1OTk4SDIwLjk2MzFaIiwKICAgIGZpbGw6ICIjNUQ2OTZGIgogIH0pLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmgpKCJwYXRoIiwgewogICAgZDogIk0yNS43MjQ2IDMuMjE1OThDMjQuMDA4NiAzLjIxNTk4IDIyLjgyMDYgNC41MTE5OCAyMi44MjA2IDYuMTc5OThDMjIuODIwNiA3Ljg1OTk4IDI0LjAyMDYgOS4xNDM5OCAyNS43OTY2IDkuMTQzOThDMjcuMDIwNiA5LjE0Mzk4IDI4LjAxNjYgOC41NDM5OCAyOC4zNzY2IDcuNTIzOThIMjcuMDA4NkMyNi43ODA2IDcuODgzOTggMjYuMzYwNiA4LjA1MTk4IDI1LjgwODYgOC4wNTE5OEMyNC43NTI2IDguMDUxOTggMjQuMjEyNiA3LjQwMzk4IDI0LjA5MjYgNi41NTE5OEgyOC41MjA2QzI4Ljc2MDYgNC42NDM5OCAyNy41OTY2IDMuMjE1OTggMjUuNzI0NiAzLjIxNTk4Wk0yNS43MzY2IDQuMjcxOThDMjYuNjEyNiA0LjI3MTk4IDI3LjIxMjYgNC43NjM5OCAyNy4yODQ2IDUuNjg3OThIMjQuMTE2NkMyNC4yNjA2IDQuODk1OTggMjQuODAwNiA0LjI3MTk4IDI1LjczNjYgNC4yNzE5OFoiLAogICAgZmlsbDogIiM1RDY5NkYiCiAgfSksICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaCkoInBhdGgiLCB7CiAgICBkOiAiTTMxLjEyOTcgNC4xMjc5OFYzLjM1OTk4SDI5Ljg4MTdWOC45OTk5OEgzMS4xMjk3VjUuNDQ3OThDMzEuNjMzNyA0Ljc4Nzk4IDMyLjMxNzcgNC40NTE5OCAzMy4yMTc3IDQuNDE1OThWMy4yMzk5OEMzMi4zNTM3IDMuMjM5OTggMzEuNjQ1NyAzLjU2Mzk4IDMxLjEyOTcgNC4xMjc5OFoiLAogICAgZmlsbDogIiM1RDY5NkYiCiAgfSksICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaCkoInBhdGgiLCB7CiAgICBkOiAiTTM2LjgyMjIgMy4yMTU5OEMzNS4xMDYyIDMuMjE1OTggMzMuOTE4MiA0LjUxMTk4IDMzLjkxODIgNi4xNzk5OEMzMy45MTgyIDcuODU5OTggMzUuMTE4MiA5LjE0Mzk4IDM2Ljg5NDIgOS4xNDM5OEMzOC4xMTgyIDkuMTQzOTggMzkuMTE0MiA4LjU0Mzk4IDM5LjQ3NDIgNy41MjM5OEgzOC4xMDYyQzM3Ljg3ODIgNy44ODM5OCAzNy40NTgyIDguMDUxOTggMzYuOTA2MiA4LjA1MTk4QzM1Ljg1MDIgOC4wNTE5OCAzNS4zMTAyIDcuNDAzOTggMzUuMTkwMiA2LjU1MTk4SDM5LjYxODJDMzkuODU4MiA0LjY0Mzk4IDM4LjY5NDIgMy4yMTU5OCAzNi44MjIyIDMuMjE1OThaTTM2LjgzNDIgNC4yNzE5OEMzNy43MTAyIDQuMjcxOTggMzguMzEwMiA0Ljc2Mzk4IDM4LjM4MjIgNS42ODc5OEgzNS4yMTQyQzM1LjM1ODIgNC44OTU5OCAzNS44OTgyIDQuMjcxOTggMzYuODM0MiA0LjI3MTk4WiIsCiAgICBmaWxsOiAiIzVENjk2RiIKICB9KSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgicGF0aCIsIHsKICAgIGQ6ICJNNDUuNDg4NiAwLjQ3OTk4VjMuODAzOThDNDUuMDA4NiAzLjQzMTk4IDQ0LjM5NjYgMy4yMTU5OCA0My42NzY2IDMuMjE1OThDNDIuMDkyNiAzLjIxNTk4IDQwLjgyMDYgNC41MzU5OCA0MC44MjA2IDYuMTY3OThDNDAuODIwNiA3LjgyMzk4IDQyLjA5MjYgOS4xNDM5OCA0My42NzY2IDkuMTQzOThDNDQuMzk2NiA5LjE0Mzk4IDQ1LjAwODYgOC45Mjc5OCA0NS40ODg2IDguNTQzOThWOC45OTk5OEg0Ni43MjQ2VjAuNDc5OThINDUuNDg4NlpNNDMuODU2NiA4LjAxNTk4QzQyLjgyNDYgOC4wMTU5OCA0Mi4wNjg2IDcuMTc1OTggNDIuMDY4NiA2LjE2Nzk4QzQyLjA2ODYgNS4xNzE5OCA0Mi44MjQ2IDQuMzQzOTggNDMuODU2NiA0LjM0Mzk4QzQ0LjQ4MDYgNC4zNDM5OCA0NS4wNjg2IDQuNTU5OTggNDUuNDg4NiA1LjE1OTk4VjcuMTg3OThDNDUuMDY4NiA3Ljc5OTk4IDQ0LjQ4MDYgOC4wMTU5OCA0My44NTY2IDguMDE1OThaIiwKICAgIGZpbGw6ICIjNUQ2OTZGIgogIH0pLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmgpKCJwYXRoIiwgewogICAgZDogIk01NC42Nzk3IDMuMjE1OThDNTMuOTU5NyAzLjIxNTk4IDUzLjM0NzcgMy40MzE5OCA1Mi44Nzk3IDMuNzkxOThWMC40Nzk5OEg1MS42MzE3VjguOTk5OThINTIuODc5N1Y4LjU1NTk4QzUzLjM0NzcgOC45Mjc5OCA1My45NTk3IDkuMTQzOTggNTQuNjc5NyA5LjE0Mzk4QzU2LjI2MzcgOS4xNDM5OCA1Ny41NDc3IDcuODIzOTggNTcuNTQ3NyA2LjE2Nzk4QzU3LjU0NzcgNC41MzU5OCA1Ni4yNjM3IDMuMjE1OTggNTQuNjc5NyAzLjIxNTk4Wk01NC40OTk3IDguMDE1OThDNTMuODc1NyA4LjAxNTk4IDUzLjI5OTcgNy43OTk5OCA1Mi44Nzk3IDcuMjExOThWNS4xMzU5OEM1My4yOTk3IDQuNTQ3OTggNTMuODc1NyA0LjM0Mzk4IDU0LjQ5OTcgNC4zNDM5OEM1NS41NDM3IDQuMzQzOTggNTYuMjk5NyA1LjE3MTk4IDU2LjI5OTcgNi4xNjc5OEM1Ni4yOTk3IDcuMTc1OTggNTUuNTQzNyA4LjAxNTk4IDU0LjQ5OTcgOC4wMTU5OFoiLAogICAgZmlsbDogIiM1RDY5NkYiCiAgfSksICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaCkoInBhdGgiLCB7CiAgICBkOiAiTTYzLjMzNDcgMy4zNDc5OEw2MS4zOTA3IDcuNzYzOThMNTkuMjY2NyAzLjM0Nzk4SDU3LjkzNDdMNjAuODE0NyA5LjA4Mzk4TDU5LjYyNjcgMTEuNzg0SDYwLjkzNDdMNjQuNjU0NyAzLjM0Nzk4SDYzLjMzNDdaIiwKICAgIGZpbGw6ICIjNUQ2OTZGIgogIH0pLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmgpKCJwYXRoIiwgewogICAgZDogIk03MS4xNDY2IDQuMzQ2NjFDNjkuODA5MiA0LjA1MDM4IDY5LjEzMSAzLjUzMDAxIDY5LjEzMSAyLjgwMDY1QzY5LjEzMSAyLjA0NzA1IDY5Ljg1NDYgMS40NzgyMiA3MC44MTQyIDEuNDc4MjJDNzEuODAzNCAxLjQ3ODIyIDcyLjU0OTYgMi4xMDMzOSA3Mi41NDk2IDIuOTMyMVYyLjk5ODEzSDczLjkxNjVWMi45MzIxQzczLjkxNjUgMS40MTc2NCA3Mi41ODgzIDAuMjcyNzA1IDcwLjgyNzEgMC4yNzI3MDVDNjkuOTc4NCAwLjI3MjcwNSA2OS4yMDA5IDAuNTMzMTkxIDY4LjYzNzkgMS4wMDU3QzY4LjM1ODQgMS4yMzYxOSA2OC4xMzM5IDEuNTI0ODcgNjcuOTgwNSAxLjg1MTFDNjcuODI3MSAyLjE3NzMzIDY3Ljc0ODYgMi41MzMwMyA2Ny43NTA2IDIuODkyNzNDNjcuNzQ1MSAzLjIyMjU1IDY3LjgxMzcgMy41NDk0OSA2Ny45NTE1IDMuODQ5OTRDNjguMDg5NCA0LjE1MDM4IDY4LjI5MyA0LjQxNjg2IDY4LjU0NzggNC42MzAxMkM2OS4wMjE4IDUuMDQyNjYgNjkuNjk0NSA1LjM0Nzk4IDcwLjU0NjMgNS41Mzg4QzcxLjk4MDYgNS44NTUwMiA3Mi43MDc4IDYuMzkyOTYgNzIuNzA3OCA3LjEzNjg2QzcyLjcwNzggNy45NDMxNiA3MS45MTU2IDguNTUwNzYgNzAuODY4MiA4LjU1MDc2QzY5Ljc4MDQgOC41NTA3NiA2OC45NTk5IDcuODc1MzEgNjguOTU5OSA2Ljk3OTk2VjYuOTEzOTNINjcuNTkxOFY2Ljk3OTk2QzY3LjU5MTggOC41NjM0OCA2OC45OTQyIDkuNzU2ODggNzAuODUzNSA5Ljc1Njg4QzcxLjc0MjYgOS43NTY4OCA3Mi41NTg4IDkuNDg3MzEgNzMuMTUxOCA4Ljk5NjYyQzczLjQ0NiA4Ljc1ODMxIDczLjY4MjcgOC40NTgxIDczLjg0NDUgOC4xMTc5Qzc0LjAwNjMgNy43Nzc3IDc0LjA4OTEgNy40MDYxMSA3NC4wODcgNy4wMzAyNEM3NC4wODcgNS42ODU0IDczLjA5OTEgNC43ODIxNyA3MS4xNDY2IDQuMzQ2NjFaIiwKICAgIGZpbGw6ICIjNUQ2OTZGIgogIH0pLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmgpKCJwYXRoIiwgewogICAgZDogIk03OC43OTg2IDIuNTA4MDZDNzguMjg3NCAyLjUwMTc1IDc3Ljc4MjMgMi42MTc2IDc3LjMyNjMgMi44NDU3NkM3Ni44NzAzIDMuMDczOTEgNzYuNDc2OCAzLjQwNzU5IDc2LjE3OTUgMy44MTgzN1YyLjY2NzM4SDc0Ljg3ODlWMTIuMDc1Mkg3Ni4xNzk1VjguNDg3MTZDNzYuNDc2OCA4Ljg5NzkgNzYuODcwMyA5LjIzMTUyIDc3LjMyNjMgOS40NTk1N0M3Ny43ODI0IDkuNjg3NjMgNzguMjg3NSA5LjgwMzM1IDc4Ljc5ODYgOS43OTY4N0M4MC44MTY3IDkuNzk2ODcgODIuMzM4MSA4LjIzMDMxIDgyLjMzODEgNi4xNTI0NkM4Mi4zMzgxIDQuMDc0NjIgODAuODE2NyAyLjUwODA2IDc4Ljc5ODYgMi41MDgwNlpNODAuOTgzNSA2LjQyMjY0QzgwLjkzMTYgNi45NjI5IDgwLjY5MjEgNy40Njg3OSA4MC4zMDU2IDcuODU0NEM3OS45MTkgOC4yNDAwMSA3OS40MDkzIDguNDgxNTYgNzguODYzIDguNTM4MDRDNzguMTM2OSA4LjYxMDc0IDc3LjQ2MDUgOC40MDI5NSA3Ni45NTgzIDcuOTU0MDdDNzYuNDU2MSA3LjUwNTE4IDc2LjE3OTUgNi44NjM2NSA3Ni4xNzk1IDYuMTUyNDZDNzYuMTc5NSA0Ljc4NDYgNzcuMjEyMiAzLjc1Mjk1IDc4LjU4MTUgMy43NTI5NUM3OS4yOTA0IDMuNzUyOTUgNzkuOTMwNiA0LjAyMTkxIDgwLjM3NzYgNC41MTAxOEM4MC44Mzg3IDUuMDExMTYgODEuMDU0IDUuNjkwMjUgODAuOTgzNSA2LjQyMjY0WiIsCiAgICBmaWxsOiAiIzVENjk2RiIKICB9KSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgicGF0aCIsIHsKICAgIGQ6ICJNOTguMjkwOCAyLjY2OTJWMy44MDc0N0M5Ny42Nzc2IDIuOTc4NzUgOTYuNzMwMiAyLjUwODA2IDk1LjY1ODMgMi41MDgwNkM5My42NDgyIDIuNTA4MDYgOTIuMTMyMyA0LjA0NjE1IDkyLjEzMjMgNi4wODU4MkM5Mi4xMzIzIDguMTI1NSA5My42NDgyIDkuNjYyOTkgOTUuNjU4MyA5LjY2Mjk5Qzk2LjczNDUgOS42NjI5OSA5Ny42ODE5IDkuMTk3MTQgOTguMjkwOCA4LjM3NjkxVjguNTUxOThDOTguMjkwOCA5Ljk2ODkxIDk3LjM5MDYgMTAuODg0MyA5NS45OTc0IDEwLjg4NDNDOTUuMDU2MSAxMC44ODQzIDk0LjI3MTggMTAuNDc2NiA5My44OTk2IDkuNzkzODRMOTMuODgwNiA5Ljc1ODdIOTIuNTM4OUw5Mi41Njk1IDkuODQ2NTRDOTIuNzk2MSAxMC41MTQgOTMuMjM5MiAxMS4wODg5IDkzLjgzMDMgMTEuNDgyMkM5NC40MjMzIDExLjg3MjMgOTUuMTcyNiAxMi4wNzgzIDk1Ljk5NzQgMTIuMDc4M0M5Ny4wNTUyIDEyLjA3ODMgOTcuOTU1NCAxMS43NDUxIDk4LjYwMTcgMTEuMTE1N0M5OS4yNDgxIDEwLjQ4NjIgOTkuNTkxNSA5LjYwMTIgOTkuNTkxNSA4LjU2NzczVjIuNjY5Mkg5OC4yOTA4Wk05Ny41NjExIDcuODQyQzk3LjAwOTIgOC4zNjQxOCA5Ni4yMjI1IDguNTgzNDggOTUuNDAwMSA4LjQ0Mjk0Qzk0LjkxMzIgOC4zNTc5NiA5NC40NjY0IDguMTIxODQgOTQuMTI0NSA3Ljc2ODg5QzkzLjc4MjcgNy40MTU5MyA5My41NjM2IDYuOTY0NTIgOTMuNDk5MiA2LjQ4MDE5QzkzLjM4MzMgNS42NjU0MSA5My42MzEgNC44OTM2NCA5NC4xNzg2IDQuMzY0MThDOTQuNjM4MyAzLjkyNzQxIDk1LjI1NDIgMy42ODc4OCA5NS44OTE5IDMuNjk3ODJDOTYuMDQ2NCAzLjY5Nzk1IDk2LjIwMDYgMy43MTAzMSA5Ni4zNTMxIDMuNzM0NzdDOTcuMzQ1OSAzLjg5MzQ5IDk4LjEzMTQgNC43MDQwMyA5OC4yNjMyIDUuNzEwMjRDOTguMzc0OSA2LjUzODM1IDk4LjExNzkgNy4zMTQzNiA5Ny41NjExIDcuODQyWiIsCiAgICBmaWxsOiAiIzVENjk2RiIKICB9KSwgKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgicGF0aCIsIHsKICAgIGQ6ICJNOTAuNzA1IDAuMDk5NTk3NUM5MC40NjAyIDAuMDQ2NzczIDkwLjIwNDMgMC4wOTExOTcxIDg5Ljk5MjUgMC4yMjMyNjlDODkuNzgwNiAwLjM1NTM0IDg5LjYyOTkgMC41NjQ0NTIgODkuNTcyOSAwLjgwNTQwOUM4OS41MTU5IDEuMDQ2MzcgODkuNTU3MSAxLjI5OTgyIDg5LjY4NzcgMS41MTA5OEM4OS44MTgzIDEuNzIyMTUgOTAuMDI3NyAxLjg3NDA3IDkwLjI3MDggMS45MzM5MUM5MC4zNDE1IDEuOTQ5NTQgOTAuNDEzNiAxLjk1NzQ3IDkwLjQ4NiAxLjk1NzU0QzkwLjcyIDEuOTU3OSA5MC45NDU4IDEuODczMjUgOTEuMTIwNiAxLjcxOTczQzkxLjI5NTUgMS41NjYyIDkxLjQwNyAxLjM1NDUyIDkxLjQzNDEgMS4xMjVDOTEuNDYxMSAwLjg5NTQ3IDkxLjQwMTcgMC42NjQxMzUgOTEuMjY3MyAwLjQ3NTA0NkM5MS4xMzI5IDAuMjg1OTU4IDkwLjkzMjcgMC4xNTIzMjUgOTAuNzA1IDAuMDk5NTk3NVYwLjA5OTU5NzVaIiwKICAgIGZpbGw6ICIjNUQ2OTZGIgogIH0pLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fLmgpKCJwYXRoIiwgewogICAgZDogIk04OS44MzY2IDguMzkxNDNIODguNzE1Qzg3LjkxNzggOC4zOTE0MyA4Ny40Mzg5IDcuODU1MzEgODcuNDM4OSA2Ljk1NjkzQzg3LjQzODkgNi4wODA5NiA4Ny44NjgxIDUuMDM2NTkgODguNzQzMiAzLjc2NDQ0TDg4Ljc1NDggMy43NDc0OFYzLjM4ODI1TDg1LjAyNzEgMi44NjcyN0M4NS4wMjg0IDIuNzE1NTMgODQuOTg4NiAyLjU2NjIyIDg0LjkxMTggMi40MzQ3OEM4NC44MzUxIDIuMzAzMzUgODQuNzI0MSAyLjE5NDU4IDg0LjU5MDUgMi4xMTk3M0M4NC4yNTYzIDEuOTM4IDgzLjg5MDggMS45MzggODMuNTg3OSAyLjExMzY4QzgzLjQzNjEgMi4yMDIzIDgzLjMxMjIgMi4zMzA3NyA4My4yMyAyLjQ4NDhDODMuMTQ3NyAyLjYzODg0IDgzLjExMDMgMi44MTI0IDgzLjEyMTkgMi45ODYxOEM4My4xMzM2IDMuMTU5OTYgODMuMTkzOCAzLjMyNzE0IDgzLjI5NTggMy40NjkxNEM4My4zOTc5IDMuNjExMTQgODMuNTM3OSAzLjcyMjM4IDgzLjcwMDEgMy43OTA0OUw4Mi41NDA1IDkuNjM3NTNIODMuODI4M0w4NC44OTc3IDQuMDg1NTFMODYuOTExNSA0LjQyMTExQzg2LjM3MDEgNS4zODAwNyA4Ni4wOTUzIDYuMjc0MjEgODYuMDk1MyA3LjA3ODY5Qzg2LjA5NTMgOC41NjM0NyA4Ny4wMDQxIDkuNTM1NzYgODguNDczNCA5LjYyOTY1VjkuNjM3NTNIOTEuMTM0MVYyLjY5MDk5SDg5LjgzNjZWOC4zOTE0M1oiLAogICAgZmlsbDogIiM1RDY5NkYiCiAgfSkpOwp9KTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3ZpZXcvY29tcG9uZW50cy9TZWxlY3QuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvY29tcG9uZW50cy9TZWxlY3QuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcyAqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgaHlwZXJhcHAgKi8gIi4vbm9kZV9tb2R1bGVzL2h5cGVyYXBwL3NyYy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNsYXNzY2F0ICovICIuL25vZGVfbW9kdWxlcy9jbGFzc2NhdC9zcmMvaW5kZXguanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi8uLi9zaGFyZWQvY29uc3RhbnRzICovICIuL3NyYy9zaGFyZWQvY29uc3RhbnRzLmpzIik7CgoKCgovKioKICogU2VsZWN0IGNvbXBvbmVudAogKiBAcGFyYW0ge09iamVjdH0gc3RhdGUKICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlLmJvcmRlciBUaGVtZSBib3JkZXIgY29sb3IKICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlLmxhYmVsIENob2ljZSBsYWJlbAogKiBAcGFyYW0ge051bWJlcn0gc3RhdGUuaW5kZXggVGFiIGluZGV4CiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0YXRlLm9uc2VsZWN0IE9uIHNlbGVjdCBoYW5kbGVyCiAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0ZS5pZCBJZCBvZiB0aGUgb3B0aW9uCiAqIEBwYXJhbSB7Qm9vbGVhbn0gc3RhdGUuaXNyYWRpbyBSYWRpbyBvciBjaGVja2JveCBvcHRpb24KICogQHBhcmFtIHtCb29sZWFufSBzdGF0ZS51c2Vtb2JpbGVzdHlsaW5nIE1vYmlsZSB2cyBkZXNrdG9wIHN0eWxpbmcKICogQHBhcmFtIHtCb29sZWFufSBzdGF0ZS5zZWxlY3RlZCBJZiBjaGVja2JveCBvcHRpb24gaXMgc2VsZWN0ZWQKICogQHJldHVybiB7T2JqZWN0fSBDb21wb25lbnQKICovCgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bImRlZmF1bHQiXSA9IChmdW5jdGlvbiAoX3JlZikgewogIHZhciBib3JkZXIgPSBfcmVmLmJvcmRlciwKICAgICAgbGFiZWwgPSBfcmVmLmxhYmVsLAogICAgICBzZWxlY3RlZCA9IF9yZWYuc2VsZWN0ZWQsCiAgICAgIGluZGV4ID0gX3JlZi5pbmRleCwKICAgICAgaWQgPSBfcmVmLmlkLAogICAgICBvblNlbGVjdCA9IF9yZWYub25TZWxlY3QsCiAgICAgIGlzUmFkaW8gPSBfcmVmLmlzUmFkaW8sCiAgICAgIHVzZU1vYmlsZVN0eWxpbmcgPSBfcmVmLnVzZU1vYmlsZVN0eWxpbmc7CgogIHZhciBzZXRBY3RpdmVTdHlsZSA9IGZ1bmN0aW9uIHNldEFjdGl2ZVN0eWxlKGUpIHsKICAgIHZhciBjaG9pY2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2hvaWNlLWRpdi0iLmNvbmNhdChpZCkpOwogICAgdmFyIHJhZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJhZGlvLSIuY29uY2F0KGlkKSk7CiAgICBpZiAoY2hvaWNlKSBjaG9pY2Uuc3R5bGUuYm9yZGVyQ29sb3IgPSBib3JkZXI7CgogICAgaWYgKHJhZGlvKSB7CiAgICAgIHJhZGlvLnN0eWxlLmJvcmRlcldpZHRoID0gJzZweCc7CiAgICAgIHJhZGlvLnN0eWxlLmJvcmRlckNvbG9yID0gYm9yZGVyOwogICAgICByYWRpby5zdHlsZS5ib3hTaGFkb3cgPSAnbm9uZSc7CiAgICB9CiAgfTsKCiAgdmFyIHNldERlZmF1bHRTdHlsZSA9IGZ1bmN0aW9uIHNldERlZmF1bHRTdHlsZShlKSB7CiAgICB2YXIgY2hvaWNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNob2ljZS1kaXYtIi5jb25jYXQoaWQpKTsKICAgIHZhciByYWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyYWRpby0iLmNvbmNhdChpZCkpOwogICAgaWYgKGNob2ljZSkgY2hvaWNlLnN0eWxlLmJvcmRlckNvbG9yID0gJyNlNmU2ZTYnOwoKICAgIGlmIChyYWRpbykgewogICAgICByYWRpby5zdHlsZS5ib3JkZXJXaWR0aCA9ICcxcHgnOwogICAgICByYWRpby5zdHlsZS5ib3JkZXJDb2xvciA9ICcjMzIzMjMyJzsKICAgICAgcmFkaW8uc3R5bGUuYm94U2hhZG93ID0gJ2luc2V0IDNweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xKSc7CiAgICB9CiAgfTsKCiAgdmFyIG9uQ2xpY2tFdmVudCA9IGZ1bmN0aW9uIG9uQ2xpY2tFdmVudChlKSB7CiAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgc2V0RGVmYXVsdFN0eWxlKGUpOwogICAgb25TZWxlY3QoaWQpOwogIH07CgogIHZhciBvbktleVByZXNzID0gZnVuY3Rpb24gb25LZXlQcmVzcyhlKSB7CiAgICBpZiAoZS5rZXlDb2RlID09IDEzIHx8IGUua2V5Q29kZSA9PSAzMikgb25DbGlja0V2ZW50KGUpOwogIH07CgogIHZhciBjbGlja0FyZ3MgPSB7CiAgICBvbmNsaWNrOiBmdW5jdGlvbiBvbmNsaWNrKGUpIHsKICAgICAgcmV0dXJuIG9uQ2xpY2tFdmVudChlKTsKICAgIH0sCiAgICBvbmtleXByZXNzOiBmdW5jdGlvbiBvbmtleXByZXNzKGUpIHsKICAgICAgcmV0dXJuIG9uS2V5UHJlc3MoZSk7CiAgICB9CiAgfTsKCiAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgewogICAgY2xpY2tBcmdzLm9udG91Y2hzdGFydCA9IHNldEFjdGl2ZVN0eWxlOwogICAgY2xpY2tBcmdzLm9udG91Y2hjYW5jZWwgPSBzZXREZWZhdWx0U3R5bGU7CiAgICBjbGlja0FyZ3Mub250b3VjaG1vdmUgPSBzZXREZWZhdWx0U3R5bGU7CiAgICBjbGlja0FyZ3Mub250b3VjaGVuZCA9IHNldERlZmF1bHRTdHlsZTsKICB9IGVsc2UgewogICAgY2xpY2tBcmdzLm9ubW91c2Vkb3duID0gc2V0QWN0aXZlU3R5bGU7CiAgICBjbGlja0FyZ3Mub25tb3VzZWxlYXZlID0gc2V0RGVmYXVsdFN0eWxlOwogIH0KCiAgdmFyIGRpdklkID0gaXNSYWRpbyA/ICJyYWRpby0iLmNvbmNhdChpZCkgOiAiY2hlY2tib3gtIi5jb25jYXQoaWQpOwogIHJldHVybiAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJkaXYiLCBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2V4dGVuZHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkoewogICAgY2xhc3NOYW1lOiAoMCxjbGFzc2NhdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fWyJkZWZhdWx0Il0pKCgwLF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uZ2V0Q2xhc3NlcykoX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5DU1NfQ09OU1RBTlRTLkNIT0lDRV9DTEFTUywgdXNlTW9iaWxlU3R5bGluZykpLAogICAgaWQ6ICJjaG9pY2UtZGl2LSIuY29uY2F0KGlkKQogIH0sIGNsaWNrQXJncyksICFpc1JhZGlvICYmICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoImRpdiIsIHsKICAgIGNsYXNzTmFtZTogX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5DU1NfQ09OU1RBTlRTLkNIT0lDRV9DSEVDS0JPWF9DTEFTUywKICAgIGlkOiBkaXZJZCwKICAgIHN0eWxlOiBzZWxlY3RlZCA/IHsKICAgICAgYmFja2dyb3VuZENvbG9yOiBib3JkZXIsCiAgICAgIGJvcmRlckNvbG9yOiBib3JkZXIsCiAgICAgIGJveFNoYWRvdzogJ25vbmUnCiAgICB9IDoge30sCiAgICByb2xlOiAiY2hlY2tib3giLAogICAgImFyaWEtbGFiZWxsZWRieSI6ICIiLmNvbmNhdChfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLkNTU19DT05TVEFOVFMuUVVFU1RJT05fSEVBREVSX0NMQVNTLCAiIGxhYmVsLSIpLmNvbmNhdChpZCksCiAgICAiYXJpYS1jaGVja2VkIjogc2VsZWN0ZWQsCiAgICB0YWJpbmRleDogMAogIH0sIHNlbGVjdGVkICYmICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoInN2ZyIsIHsKICAgIHdpZHRoOiAiMTAiLAogICAgaGVpZ2h0OiAiMTAiLAogICAgdmlld0JveDogIjAgMCAxMCAxMCIsCiAgICBmaWxsOiAibm9uZSIsCiAgICB4bWxuczogImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIH0sICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uaCkoInBhdGgiLCB7CiAgICBkOiAiTTkuMTUzNzcgMS4zMDc3NEw0LjA3Njg1IDguMjMwODJMMS4zMDc2MiA1LjAwMDA1IiwKICAgIHN0cm9rZTogIndoaXRlIiwKICAgICJzdHJva2Utd2lkdGgiOiAiMiIsCiAgICAic3Ryb2tlLWxpbmVjYXAiOiAicm91bmQiCiAgfSkpKSwgaXNSYWRpbyAmJiAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJkaXYiLCB7CiAgICBjbGFzc05hbWU6IF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uQ1NTX0NPTlNUQU5UUy5DSE9JQ0VfUkFESU9fQ0xBU1MsCiAgICBpZDogZGl2SWQsCiAgICByb2xlOiAicmFkaW8iLAogICAgImFyaWEtbGFiZWxsZWRieSI6ICIiLmNvbmNhdChfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLkNTU19DT05TVEFOVFMuUVVFU1RJT05fSEVBREVSX0NMQVNTLCAiIGxhYmVsLSIpLmNvbmNhdChpZCksCiAgICB0YWJpbmRleDogMAogIH0pLCAoMCxoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmgpKCJsYWJlbCIsIHsKICAgIGNsYXNzTmFtZTogKDAsY2xhc3NjYXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1siZGVmYXVsdCJdKSgoMCxfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLmdldENsYXNzZXMpKF9zaGFyZWRfY29uc3RhbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uQ1NTX0NPTlNUQU5UUy5DSE9JQ0VfTEFCRUxfQ0xBU1MsIHVzZU1vYmlsZVN0eWxpbmcpKSwKICAgIGZvcjogZGl2SWQsCiAgICBpZDogImxhYmVsLSIuY29uY2F0KGlkKQogIH0sIGxhYmVsKSk7Cn0pOwoKLyoqKi8gfSksCgovKioqLyAiLi9zcmMvdmlldy9oZWxwZXJzL2NhcmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy92aWV3L2hlbHBlcnMvY2FyZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7Ci8qIGhhcm1vbnkgZXhwb3J0ICovICAgImdldENhcHRpb24iOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gZ2V0Q2FwdGlvbjsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAiZ2V0SGVhZGxpbmUiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gZ2V0SGVhZGxpbmU7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgImdldEJ1dHRvblRleHQiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gZ2V0QnV0dG9uVGV4dDsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAiZ2V0U2tpcEJ1dHRvblRleHQiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gZ2V0U2tpcEJ1dHRvblRleHQ7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgaHlwZXJhcHAgKi8gIi4vbm9kZV9tb2R1bGVzL2h5cGVyYXBwL3NyYy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uLy4uL3NoYXJlZC9jb25zdGFudHMgKi8gIi4vc3JjL3NoYXJlZC9jb25zdGFudHMuanMiKTsKLy8gZm9yIHNoYXJlZCBmdW5jdGlvbnMgcmVsYXRlZCB0byBxdWVzdGlvbi9jYXJkIHZpZXdzCgoKdmFyIGdldENhcHRpb24gPSBmdW5jdGlvbiBnZXRDYXB0aW9uKHByb3BlcnRpZXMpIHsKICByZXR1cm4gcHJvcGVydGllcyAmJiBwcm9wZXJ0aWVzLmNhcHRpb25UZXh0ID8gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgicCIsIHsKICAgIGlkOiBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLkNTU19DT05TVEFOVFMuQ0FQVElPTl9DTEFTUywKICAgIGNsYXNzTmFtZTogX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5DU1NfQ09OU1RBTlRTLkNBUFRJT05fQ0xBU1MKICB9LCBwcm9wZXJ0aWVzLmNhcHRpb25UZXh0KSA6IG51bGw7Cn07CnZhciBnZXRIZWFkbGluZSA9IGZ1bmN0aW9uIGdldEhlYWRsaW5lKGNhcHRpb24sIG1lc3NhZ2UpIHsKICByZXR1cm4gY2FwdGlvbiA/ICgwLGh5cGVyYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uaCkoInAiLCB7CiAgICBpZDogX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5DU1NfQ09OU1RBTlRTLlFVRVNUSU9OX0hFQURFUl9DTEFTUywKICAgIGNsYXNzTmFtZTogX3NoYXJlZF9jb25zdGFudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5DU1NfQ09OU1RBTlRTLlFVRVNUSU9OX0hFQURFUl9DTEFTUywKICAgIHJvbGU6ICJoZWFkaW5nIgogIH0sIG1lc3NhZ2UpIDogKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5oKSgicCIsIHsKICAgIGlkOiBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLkNTU19DT05TVEFOVFMuUVVFU1RJT05fSEVBREVSX0NMQVNTLAogICAgY2xhc3NOYW1lOiBfc2hhcmVkX2NvbnN0YW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLkNTU19DT05TVEFOVFMuUVVFU1RJT05fSEVBREVSX0NMQVNTLAogICAgc3R5bGU6ICJtYXJnaW4tYm90dG9tOiAxNXB4IiwKICAgIHJvbGU6ICJoZWFkaW5nIgogIH0sIG1lc3NhZ2UpOwp9Owp2YXIgZ2V0QnV0dG9uVGV4dCA9IGZ1bmN0aW9uIGdldEJ1dHRvblRleHQocHJvcGVydGllcykgewogIHJldHVybiBwcm9wZXJ0aWVzICYmIHByb3BlcnRpZXMuYnV0dG9uVGV4dCA/IHByb3BlcnRpZXMuYnV0dG9uVGV4dCA6ICdOZXh0JzsKfTsKdmFyIGdldFNraXBCdXR0b25UZXh0ID0gZnVuY3Rpb24gZ2V0U2tpcEJ1dHRvblRleHQocHJvcGVydGllcykgewogIHJldHVybiBwcm9wZXJ0aWVzICYmIHByb3BlcnRpZXMuc2tpcEJ1dHRvblRleHQgPyBwcm9wZXJ0aWVzLnNraXBCdXR0b25UZXh0IDogJ1NraXAnOwp9OwoKLyoqKi8gfSksCgovKioqLyAiLi9zcmMvdmlldy9zdG9yZS9hY3Rpb25zLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvc3RvcmUvYWN0aW9ucy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19kZWZpbmVQcm9wZXJ0eV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19kZWZpbmVQcm9wZXJ0eV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF9jb25mbGljdGluZ193aWRnZXRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3NoYXJlZC9jb25mbGljdGluZ193aWRnZXRzICovICIuL3NyYy9zaGFyZWQvY29uZmxpY3Rpbmdfd2lkZ2V0cy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX21vZHVsZXNfYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL21vZHVsZXMvYXBwICovICIuL3NyYy92aWV3L3N0b3JlL21vZHVsZXMvYXBwLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfbW9kdWxlc19tdWx0aXBsZXNlbGVjdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9tb2R1bGVzL211bHRpcGxlc2VsZWN0ICovICIuL3NyYy92aWV3L3N0b3JlL21vZHVsZXMvbXVsdGlwbGVzZWxlY3QuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9tb2R1bGVzX29wZW5UZXh0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL21vZHVsZXMvb3BlblRleHQgKi8gIi4vc3JjL3ZpZXcvc3RvcmUvbW9kdWxlcy9vcGVuVGV4dC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF91bEV2ZW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vLi4vc2hhcmVkL3VsRXZlbnRzICovICIuL3NyYy9zaGFyZWQvdWxFdmVudHMuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfc2hvdWxkRGlyZWN0RW1iZWRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uLy4uL3NoYXJlZC9zaG91bGREaXJlY3RFbWJlZCAqLyAiLi9zcmMvc2hhcmVkL3Nob3VsZERpcmVjdEVtYmVkLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2hhcmVkX3Rvb2xfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uLy4uL3NoYXJlZC90b29sICovICIuL3NyYy9zaGFyZWQvdG9vbC5qcyIpOwoKCgoKZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgeyBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IH0ga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9CgpmdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCgpKHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9CgovKiBnbG9iYWxzIHdpbmRvdywgZG9jdW1lbnQgKi8KCgoKCgoKCgp2YXIgYWN0aW9ucyA9IHsKICAvKioKICAgKiBJbml0aWFsaXplIHRoZSBhcHBsaWNhdGlvbiBzdGF0ZSBmb3IgdGhpcyB1c2VyCiAgICogQHBhcmFtIHtTdHJpbmd9IGZyYW1lIEZyYW1lJ3MgaWQKICAgKiBAcGFyYW0ge1N0cmluZ30gYXBwSWQgQXBwbGljYXRpb24gdHJhY2tpbmcgaWQKICAgKiBAcGFyYW0ge1N0cmluZ30gdXNlcklkIFVzZXIgdHJhY2tpbmcgaWQKICAgKiBAcGFyYW0ge09iamVjdH0gbWV0YSBVc2VyIG1ldGEgaW5mb3JtYXRpb24KICAgKiBAcGFyYW0ge1N0cmluZ30gYm9yZGVyIEJvcmRlciBjb2xvciBvZiB0aGUgd2lkZ2V0CiAgICovCiAgaW5pdDogZnVuY3Rpb24gaW5pdChfcmVmKSB7CiAgICB2YXIgZnJhbWUgPSBfcmVmLmZyYW1lLAogICAgICAgIGNhcmRzID0gX3JlZi5jYXJkcywKICAgICAgICBzdXJ2ZXlJZCA9IF9yZWYuc3VydmV5SWQsCiAgICAgICAgZW52SWQgPSBfcmVmLmVudklkLAogICAgICAgIHVzZXJJZCA9IF9yZWYudXNlcklkLAogICAgICAgIG1ldGEgPSBfcmVmLm1ldGEsCiAgICAgICAgYm9yZGVyID0gX3JlZi5ib3JkZXIsCiAgICAgICAgZm9udEZhbWlseSA9IF9yZWYuZm9udEZhbWlseSwKICAgICAgICBmb250RmFtaWx5VVJMID0gX3JlZi5mb250RmFtaWx5VVJMLAogICAgICAgIGNvbnRleHQgPSBfcmVmLmNvbnRleHQsCiAgICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsCiAgICAgICAgYXBpVVJMID0gX3JlZi5hcGlVUkwsCiAgICAgICAgc2hvd1N1cnZleUJyYW5kID0gX3JlZi5zaG93U3VydmV5QnJhbmQsCiAgICAgICAgbWFya2V0aW5nVXJsID0gX3JlZi5tYXJrZXRpbmdVcmwsCiAgICAgICAgc2x1Z05hbWUgPSBfcmVmLnNsdWdOYW1lLAogICAgICAgIHJlc3BvbnNlR3JvdXBVaWQgPSBfcmVmLnJlc3BvbnNlR3JvdXBVaWQsCiAgICAgICAgaGVhZGVycyA9IF9yZWYuaGVhZGVycywKICAgICAgICBlbmRDYXJkID0gX3JlZi5lbmRDYXJkLAogICAgICAgIGNvbmZpZ3VyZUV4aXRPbk92ZXJsYXlDbGljayA9IF9yZWYuY29uZmlndXJlRXhpdE9uT3ZlcmxheUNsaWNrLAogICAgICAgIGlzUHJldmlldyA9IF9yZWYuaXNQcmV2aWV3LAogICAgICAgIGFuc3dlcnMgPSBfcmVmLmFuc3dlcnMsCiAgICAgICAgY3VzdG9tTWV0YWRhdGEgPSBfcmVmLmN1c3RvbU1ldGFkYXRhLAogICAgICAgIGV4cGVyaW1lbnRGbGFncyA9IF9yZWYuZXhwZXJpbWVudEZsYWdzLAogICAgICAgIHVzZU1vYmlsZVN0eWxpbmcgPSBfcmVmLnVzZU1vYmlsZVN0eWxpbmcsCiAgICAgICAgbW9iaWxlUGxhdGZvcm0gPSBfcmVmLm1vYmlsZVBsYXRmb3JtLAogICAgICAgIGV2ZW50RW1pdHRlciA9IF9yZWYuZXZlbnRFbWl0dGVyLAogICAgICAgIHZpZXdlZENhcmRDb3VudCA9IF9yZWYudmlld2VkQ2FyZENvdW50OwogICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9ucykgewogICAgICB2YXIgZG9jID0gKDAsX3NoYXJlZF9zaG91bGREaXJlY3RFbWJlZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fWyJkZWZhdWx0Il0pKGhlYWRlcnMpID8gd2luZG93LmRvY3VtZW50IDogd2luZG93LnBhcmVudC5kb2N1bWVudDsKICAgICAgYWN0aW9ucy5hcHAuaW5pdCh7CiAgICAgICAgZnJhbWU6IGRvYy5nZXRFbGVtZW50QnlJZChmcmFtZSksCiAgICAgICAgc3VydmV5SWQ6IHN1cnZleUlkLAogICAgICAgIGNhcmRzOiBjYXJkcywKICAgICAgICBlbnZJZDogZW52SWQsCiAgICAgICAgdXNlcklkOiB1c2VySWQsCiAgICAgICAgbWV0YTogbWV0YSwKICAgICAgICBib3JkZXI6IGJvcmRlciwKICAgICAgICBmb250RmFtaWx5OiBmb250RmFtaWx5LAogICAgICAgIGZvbnRGYW1pbHlVUkw6IGZvbnRGYW1pbHlVUkwsCiAgICAgICAgY29udGV4dDogY29udGV4dCwKICAgICAgICBsb2NhbGU6IGxvY2FsZSwKICAgICAgICBhcGlVUkw6IGFwaVVSTCwKICAgICAgICBzaG93U3VydmV5QnJhbmQ6IHNob3dTdXJ2ZXlCcmFuZCwKICAgICAgICBtYXJrZXRpbmdVcmw6IG1hcmtldGluZ1VybCwKICAgICAgICBzbHVnTmFtZTogc2x1Z05hbWUsCiAgICAgICAgcmVzcG9uc2VHcm91cFVpZDogcmVzcG9uc2VHcm91cFVpZCwKICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLAogICAgICAgIGVuZENhcmQ6IGVuZENhcmQsCiAgICAgICAgY29uZmlndXJlRXhpdE9uT3ZlcmxheUNsaWNrOiBjb25maWd1cmVFeGl0T25PdmVybGF5Q2xpY2ssCiAgICAgICAgaXNQcmV2aWV3OiBpc1ByZXZpZXcsCiAgICAgICAgYW5zd2VyczogYW5zd2VycywKICAgICAgICBjdXN0b21NZXRhZGF0YTogY3VzdG9tTWV0YWRhdGEsCiAgICAgICAgZXhwZXJpbWVudEZsYWdzOiBleHBlcmltZW50RmxhZ3MsCiAgICAgICAgdXNlTW9iaWxlU3R5bGluZzogdXNlTW9iaWxlU3R5bGluZywKICAgICAgICBtb2JpbGVQbGF0Zm9ybTogbW9iaWxlUGxhdGZvcm0sCiAgICAgICAgZXZlbnRFbWl0dGVyOiBldmVudEVtaXR0ZXIsCiAgICAgICAgdmlld2VkQ2FyZENvdW50OiB2aWV3ZWRDYXJkQ291bnQKICAgICAgfSk7CiAgICAgIGFjdGlvbnMuYXBwLnNlZW4oKTsKICAgIH07CiAgfSwKCiAgLyoqCiAgICogVXBkYXRlIHRoZSBwYXJlbnQgY29udGFpbmVyJ3MgaGVpZ2h0CiAgICogQHBhcmFtIHtTdHJpbmd9IGlkIEFwcCBpZCBhdHRyaWJ1dGUKICAgKi8KICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShpZCkgewogICAgcmV0dXJuIGZ1bmN0aW9uIChfcmVmMikgewogICAgICB2YXIgYXBwID0gX3JlZjIuYXBwOwogICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICAgICAgdmFyIGNsYXNzTGlzdCA9IGVsZW1lbnQuY2xhc3NMaXN0OyAvLyBIYW5kbGUgaW5pdGlhbCBhbmltYXRpb24KCiAgICAgIGlmIChhcHAucnVubmluZyAmJiAhY2xhc3NMaXN0LmNvbnRhaW5zKCd1bC1hcHAtLXZpc2libGUnKSkgewogICAgICAgIGlmICgoMCxfc2hhcmVkX3Nob3VsZERpcmVjdEVtYmVkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X19bImRlZmF1bHQiXSkoYXBwLmhlYWRlcnMpKSB7CiAgICAgICAgICBjbGFzc0xpc3QuYWRkKCd1bC1hcHAtLXZpc2libGUnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2xhc3NMaXN0LmFkZCgndWwtYXBwLS1vdmVybGF5Jyk7CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgY2xhc3NMaXN0LmFkZCgndWwtYXBwLS12aXNpYmxlJyk7CiAgICAgICAgICB9LCAxMDApOwogICAgICAgIH0KCiAgICAgICAgaWYgKGFwcC5ldmVudEVtaXR0ZXIpIGFwcC5ldmVudEVtaXR0ZXIuZW1pdChfc2hhcmVkX3VsRXZlbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18udWxFdmVudHMuU1VSVkVZX0FQUEVBUkVEKTsKICAgICAgfQoKICAgICAgaWYgKCEoMCxfc2hhcmVkX3Nob3VsZERpcmVjdEVtYmVkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X19bImRlZmF1bHQiXSkoYXBwLmhlYWRlcnMpKSB7CiAgICAgICAgYXBwLmZyYW1lLnNldEhlaWdodCgoMCxfc2hhcmVkX3Rvb2xfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXy5jYWxjdWxhdGVGcmFtZUhlaWdodCkoZG9jdW1lbnQpKTsKICAgICAgfQogICAgfTsKICB9LAoKICAvKioKICAgKiBGYWRlIGFwcCBET00gb3V0CiAgICogQHBhcmFtIHtTdHJpbmd9IGlkIEFwcCBpZCBhdHRyaWJ1dGUKICAgKi8KICBmYWRlb3V0OiBmdW5jdGlvbiBmYWRlb3V0KGlkKSB7CiAgICByZXR1cm4gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgdmFyIF9yZWY0ID0gX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19fZGVmYXVsdCgpKCAvKiNfX1BVUkVfXyovX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkubWFyayhmdW5jdGlvbiBfY2FsbGVlKF9yZWYzKSB7CiAgICAgICAgdmFyIGFwcCwgZXZlbnRFbWl0dGVyOwogICAgICAgIHJldHVybiBfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fX2RlZmF1bHQoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgYXBwID0gX3JlZjMuYXBwOwogICAgICAgICAgICAgICAgZXZlbnRFbWl0dGVyID0gYXBwLmV2ZW50RW1pdHRlcjsKCiAgICAgICAgICAgICAgICBpZiAoISgwLF9zaGFyZWRfc2hvdWxkRGlyZWN0RW1iZWRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfX1siZGVmYXVsdCJdKShhcHAuaGVhZGVycykpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIpOwoKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBldmVudEVtaXR0ZXIuZW1pdChfc2hhcmVkX3VsRXZlbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18udWxFdmVudHMuU1VSVkVZX0ZBRElOR19PVVQpOwogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwogICAgICAgICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24gKF9yZWY1KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IF9yZWY1LnByb3BlcnR5TmFtZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PT0gJ29wYWNpdHknKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgndWwtYXBwLS12aXNpYmxlJyk7CiAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sIF9jYWxsZWUpOwogICAgICB9KSk7CgogICAgICByZXR1cm4gZnVuY3Rpb24gKF94KSB7CiAgICAgICAgcmV0dXJuIF9yZWY0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICB9KCk7CiAgfSwKCiAgLyoqCiAgICogUmVtb3ZlIHRoZSBhcHAgRE9NIGVsZW1lbnQKICAgKi8KICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShfcmVmNikgewogICAgdmFyIGluaXRpYXRvciA9IF9yZWY2LmluaXRpYXRvcjsKICAgIHJldHVybiBmdW5jdGlvbiAoX3JlZjcpIHsKICAgICAgdmFyIGFwcCA9IF9yZWY3LmFwcDsKICAgICAgdmFyIGZyYW1lID0gYXBwLmZyYW1lLAogICAgICAgICAgZXZlbnRFbWl0dGVyID0gYXBwLmV2ZW50RW1pdHRlcjsKICAgICAgdmFyIGlzTW9iaWxlID0gWydpb3MnLCAnYW5kcm9pZCddLmluY2x1ZGVzKGFwcC5oZWFkZXJzWyd1c2VybGVhcC1wbGF0Zm9ybSddKTsKICAgICAgaWYgKGlzTW9iaWxlKSBldmVudEVtaXR0ZXIuZW1pdChfc2hhcmVkX3VsRXZlbnRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18udWxFdmVudHMuU1VSVkVZX1dJTExfQ0xPU0UsIHsKICAgICAgICBpbml0aWF0b3I6IGluaXRpYXRvcgogICAgICB9KTsKICAgICAgaWYgKCgwLF9zaGFyZWRfc2hvdWxkRGlyZWN0RW1iZWRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfX1siZGVmYXVsdCJdKShhcHAuaGVhZGVycykpIHJldHVybjsKICAgICAgZXZlbnRFbWl0dGVyLmVtaXQoX3NoYXJlZF91bEV2ZW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fLnVsRXZlbnRzLlNVUlZFWV9XSUxMX0NMT1NFLCB7CiAgICAgICAgaW5pdGlhdG9yOiBpbml0aWF0b3IKICAgICAgfSk7CiAgICAgIGZyYW1lLnJlbW92ZSgpOwogICAgfTsKICB9LAoKICAvKioKICAgKiBDbG9zZXMgdGhlIHN1cnZleSB3aGVuIHVzZXIgWCdzIG91dCBvciBjbGlja3Mgb3ZlcmxheSB0byBkaXNtaXNzCiAgICogc3VibWl0cyBhbiBldmVudCB0byByZWNvcmQgaW4gdGhlIGFwaQogICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBBcHAgaWQgYXR0cmlidXRlCiAgICovCiAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKGlkKSB7CiAgICByZXR1cm4gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgdmFyIF9yZWY4ID0gX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19fZGVmYXVsdCgpKCAvKiNfX1BVUkVfXyovX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMihfLCBhY3Rpb25zKSB7CiAgICAgICAgcmV0dXJuIF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyOwogICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnMuZmFkZW91dChpZCk7CgogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNDsKICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb25zLmFwcC5jbG9zZSgpOwoKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBfc2hhcmVkX2NvbmZsaWN0aW5nX3dpZGdldHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfX1siZGVmYXVsdCJdLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgYWN0aW9ucy5yZW1vdmUoewogICAgICAgICAgICAgICAgICBpbml0aWF0b3I6IF9zaGFyZWRfdWxFdmVudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXy5ESVNNSVNTX1JFQVNPTlMuQ0xPU0VECiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sIF9jYWxsZWUyKTsKICAgICAgfSkpOwoKICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDIsIF94MykgewogICAgICAgIHJldHVybiBfcmVmOC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB9OwogICAgfSgpOwogIH0sCgogIC8qKgogICAqIENsb3NlcyB0aGUgc3VydmV5IGFmdGVyIGNvbXBsZXRpbmcgdGhlIHN1cnZleQogICAqIEBwYXJhbSB7U3RyaW5nfSBpZCBBcHAgaWQgYXR0cmlidXRlCiAgICovCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveShpZCkgewogICAgcmV0dXJuIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgIHZhciBfcmVmOSA9IF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfYXN5bmNUb0dlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fX2RlZmF1bHQoKSggLyojX19QVVJFX18qL19iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMoXywgYWN0aW9ucykgewogICAgICAgIHJldHVybiBfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fX2RlZmF1bHQoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMjsKICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb25zLmZhZGVvdXQoaWQpOwoKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBfc2hhcmVkX2NvbmZsaWN0aW5nX3dpZGdldHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfX1siZGVmYXVsdCJdLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgYWN0aW9ucy5yZW1vdmUoewogICAgICAgICAgICAgICAgICBpbml0aWF0b3I6IF9zaGFyZWRfdWxFdmVudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXy5ESVNNSVNTX1JFQVNPTlMuQ09NUExFVEUKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwgX2NhbGxlZTMpOwogICAgICB9KSk7CgogICAgICByZXR1cm4gZnVuY3Rpb24gKF94NCwgX3g1KSB7CiAgICAgICAgcmV0dXJuIF9yZWY5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICB9KCk7CiAgfQp9OwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bImRlZmF1bHQiXSA9IChfb2JqZWN0U3ByZWFkKHsKICBhcHA6IF9tb2R1bGVzX2FwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fLmFjdGlvbnMsCiAgbXVsdGlwbGVzZWxlY3Q6IF9tb2R1bGVzX211bHRpcGxlc2VsZWN0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18uYWN0aW9ucywKICBvcGVuVGV4dDogX21vZHVsZXNfb3BlblRleHRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXy5hY3Rpb25zCn0sIGFjdGlvbnMpKTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3ZpZXcvc3RvcmUvbW9kdWxlcy9hcHAuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvc3RvcmUvbW9kdWxlcy9hcHAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7Ci8qIGhhcm1vbnkgZXhwb3J0ICovICAgInN0YXRlIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIHN0YXRlOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJhY3Rpb25zIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIGFjdGlvbnM7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3R5cGVvZl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3R5cGVvZl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdHlwZW9mX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9yZWdlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF9jb25mbGljdGluZ193aWRnZXRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3NoYXJlZC9jb25mbGljdGluZ193aWRnZXRzICovICIuL3NyYy9zaGFyZWQvY29uZmxpY3Rpbmdfd2lkZ2V0cy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfTGlrZXJ0Q2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQC92aWV3L0xpa2VydENhcmQgKi8gIi4vc3JjL3ZpZXcvTGlrZXJ0Q2FyZC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfT3BlblRleHRDYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvT3BlblRleHRDYXJkICovICIuL3NyYy92aWV3L09wZW5UZXh0Q2FyZC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfVGV4dFVybEJ1dHRvbkNhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEAvdmlldy9UZXh0VXJsQnV0dG9uQ2FyZCAqLyAiLi9zcmMvdmlldy9UZXh0VXJsQnV0dG9uQ2FyZC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfTXVsdGlwbGVDaG9pY2VDYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvTXVsdGlwbGVDaG9pY2VDYXJkICovICIuL3NyYy92aWV3L011bHRpcGxlQ2hvaWNlQ2FyZC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfTXVsdGlwbGVTZWxlY3RDYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvTXVsdGlwbGVTZWxlY3RDYXJkICovICIuL3NyYy92aWV3L011bHRpcGxlU2VsZWN0Q2FyZC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfVm9pY2VWaWRlb0NhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvVm9pY2VWaWRlb0NhcmQgKi8gIi4vc3JjL3ZpZXcvVm9pY2VWaWRlb0NhcmQuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF92aWV3X05wc0NhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzExX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvTnBzQ2FyZCAqLyAiLi9zcmMvdmlldy9OcHNDYXJkLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfdmlld19UaGFua3NDYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQC92aWV3L1RoYW5rc0NhcmQgKi8gIi4vc3JjL3ZpZXcvVGhhbmtzQ2FyZC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfdXRpbF9za2lwTG9naWNIZWxwZXJzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQC92aWV3L3V0aWwvc2tpcExvZ2ljSGVscGVycyAqLyAiLi9zcmMvdmlldy91dGlsL3NraXBMb2dpY0hlbHBlcnMuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfbmV0d29ya19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEAvc2hhcmVkL25ldHdvcmsgKi8gIi4vc3JjL3NoYXJlZC9uZXR3b3JrLmpzIik7CgoKCgoKZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgeyBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IH0ga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9CgpmdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19fZGVmYXVsdCgpKHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9CgovKiBnbG9iYWxzIGRvY3VtZW50LCB3aW5kb3cgKi8KCgoKCgoKCgoKCgoKZnVuY3Rpb24gcmVwb3J0RXJyb3IoX3gsIF94MiwgX3gzKSB7CiAgcmV0dXJuIF9yZXBvcnRFcnJvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwp9CgpmdW5jdGlvbiBfcmVwb3J0RXJyb3IoKSB7CiAgX3JlcG9ydEVycm9yID0gX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19fZGVmYXVsdCgpKCAvKiNfX1BVUkVfXyovX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhzdGF0ZSwgYWN0aW9uLCBlcnIpIHsKICAgIHZhciBtb2RlLCB2aWQsIGVudklkLCBhcGlVUkwsIGhlYWRlcnMsIHBkZSwgbWV0YSwgYm9keSwgcmVzdWx0OwogICAgcmV0dXJuIF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0MykgewogICAgICB3aGlsZSAoMSkgewogICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBtb2RlID0gc3RhdGUubW9kZSwgdmlkID0gc3RhdGUudXNlcklkLCBlbnZJZCA9IHN0YXRlLmVudklkLCBhcGlVUkwgPSBzdGF0ZS5hcGlVUkwsIGhlYWRlcnMgPSBzdGF0ZS5oZWFkZXJzOwogICAgICAgICAgICBwZGUgPSB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgICAgICAgICBtZXRhID0gewogICAgICAgICAgICAgIG1vZGU6IG1vZGUsCiAgICAgICAgICAgICAgc2NyZWVuV2lkdGg6IHdpbmRvdy5zY3JlZW4ud2lkdGgsCiAgICAgICAgICAgICAgc2NyZWVuSGVpZ2h0OiB3aW5kb3cuc2NyZWVuLmhlaWdodCwKICAgICAgICAgICAgICBjbGllbnRXaWR0aDogcGRlLmNsaWVudFdpZHRoLAogICAgICAgICAgICAgIGNsaWVudEhlaWdodDogcGRlLmNsaWVudEhlaWdodCwKICAgICAgICAgICAgICBsb2NhdGlvbjogd2luZG93LmxvY2F0aW9uLmhyZWYsCiAgICAgICAgICAgICAgbGFuZ3VhZ2U6IHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2UKICAgICAgICAgICAgfTsKICAgICAgICAgICAgYm9keSA9IHsKICAgICAgICAgICAgICBhY3Rpb246IGFjdGlvbiwKICAgICAgICAgICAgICBlcnI6IHsKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLAogICAgICAgICAgICAgICAgc3RhY2s6IGVyci5zdGFjawogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgbWV0YTogbWV0YSwKICAgICAgICAgICAgICB2aWQ6IHZpZCwKICAgICAgICAgICAgICBlbnZJZDogZW52SWQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA2OwogICAgICAgICAgICByZXR1cm4gKDAsX3NoYXJlZF9uZXR3b3JrX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNF9fLnVsRmV0Y2gpKCIiLmNvbmNhdChhcGlVUkwsICIvc2RrLzEvZXJyb3JzIiksIHsKICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICBoZWFkZXJzOiBPYmplY3QuYXNzaWduKHsKICAgICAgICAgICAgICAgICd4LXVsLWVycm9yJzogd2luZG93LmJ0b2EoInVzZXJsZWFwLSIuY29uY2F0KERhdGUubm93KCksICItZXJyb3IiKSkKICAgICAgICAgICAgICB9LCBoZWFkZXJzKSwKICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KQogICAgICAgICAgICB9KTsKCiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgIHJlc3VsdCA9IF9jb250ZXh0My5zZW50OwoKICAgICAgICAgICAgaWYgKCFyZXN1bHQub2spIHsKICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIltVc2VyTGVhcF0gKEVSUi00NDQpIEZhaWxlZCB0byByZXBvcnQgZXJyb3IgdG8gQVBJIiwgZXJyKTsKICAgICAgICAgICAgfQoKICAgICAgICAgIGNhc2UgODoKICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwgX2NhbGxlZTMpOwogIH0pKTsKICByZXR1cm4gX3JlcG9ydEVycm9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn0KCnZhciBza2lwV3JpdGVGb3JBY3Rpb24gPSBmdW5jdGlvbiBza2lwV3JpdGVGb3JBY3Rpb24oc3RhdGUpIHsKICByZXR1cm4gc3RhdGUudXNlcklkID09PSAwIHx8IHN0YXRlLm1ldGEgJiYgc3RhdGUubWV0YS5tb2RlID09PSAndGVzdCcgfHwgc3RhdGUuaXNQcmV2aWV3Owp9OwovKioKICogQXBwIGluaXRpYWwgc3RhdGUKICovCgoKdmFyIHN0YXRlID0gewogIC8qKgogICAqIEBwcm9wIHtTdHJpbmd9IHN1cnZleUlkIFRoaXMgaWQgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCB3aGljaCBzdXJ2ZXkgaXMgYmVpbmcgdXNlZAogICAqLwogIHN1cnZleUlkOiBudWxsLAoKICAvKioKICAgKiBAcHJvcCB7Qm9vbGVhbn0gcnVubmluZyBJZiB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZywgaWYgYGZhbHNlYCB0aGUKICAgKiAgIGFwcGxpY2F0aW9uIHdpbGwgc3RvcCBhbmQgZGVzdHJveSBpdHNlbGYKICAgKi8KICBydW5uaW5nOiBmYWxzZSwKCiAgLyoqCiAgICogQHByb3Age0RPTUVsZW1lbnR9IGZyYW1lIFJlZmVyZW5jZSB0byB0aGUgaG9zdCBmcmFtZQogICAqLwogIGZyYW1lOiBudWxsLAoKICAvKioKICAgKiBAcHJvcCB7U3RyaW5nfSBlbnZJZCBFbnZpcm9ubWVudCBJZAogICAqLwogIGVudklkOiBudWxsLAoKICAvKioKICAgKiBAcHJvcCB7U3RyaW5nfSB1c2VySWQgVHJhY2tlZCB1c2VyIGlkCiAgICovCiAgdXNlcklkOiBudWxsLAoKICAvKioKICAgKiBAcHJvcCB7T2JqZWN0fSBtZXRhIFVzZXIgbWV0YSBpbmZvcm1hdGlvbgogICAqLwogIG1ldGE6IHt9LAoKICAvKioKICAgKiBAcHJvcCB7U3RyaW5nfSBib3JkZXIgV2lkZ2V0IGJvcmRlciBjb2xvcgogICAqLwogIGJvcmRlcjogbnVsbCwKCiAgLyoqCiAgICogQHByb3Age1N0cmluZ30gZm9udEZhbWlseSBDU1MgY2xhc3MgbmFtZSB0byBhZGQgdG8gdWwtYXBwCiAgICovCiAgZm9udEZhbWlseTogbnVsbCwKCiAgLyoqCiAgICogQHByb3Age1N0cmluZ30gZm9udEZhbWlseVVSTCBVUkwgdG8gZGVmaW5lZCBmb250IGZhbWlseSBpZiBub3Qgc3lzdGVtIGZvbnQKICAgKi8KICBmb250RmFtaWx5VVJMOiBudWxsLAoKICAvKioKICAgKiBAcHJvcCB7TnVtYmVyfSB0aW1lb3V0IENvdW50ZG93biB0aW1lcgogICAqLwogIHRpbWVvdXQ6IG51bGwsCgogIC8qKgogICAqIEBwcm9wIHtOdW1iZXJ9IGludGVydmFsIENvdW50ZG93biBpbnRlcnZhbCBpZAogICAqLwogIGludGVydmFsOiBudWxsLAoKICAvKioKICAgKiBAcHJvcCB7U3RyaW5nfSBtb2RlIFdpZGdldCBtb2RlLCB1c2VkIHdoZW4gc3dpdGNoaW5nIHRvICd0ZXN0JwogICAqLwogIG1vZGU6IG51bGwsCgogIC8qKgogICAqIEBwcm9wIHtPYmplY3R9IGRlY2sgQ3VycmVudGx5IHNlbGVjdGVkIGRlY2sgdG8gZGlzcGxheQogICAqIEBwcm9wIHtOdW1iZXJ9IGRlY2suaW5kZXggQ3VycmVudCBjYXJkIGluZGV4CiAgICogQHByb3Age0FycmF5fSBkZWNrLmNhcmRzIENhcmRzIHRvIGRpc3BsYXkKICAgKi8KICBkZWNrOiB7CiAgICBpbmRleDogMCwKICAgIGNhcmRzOiBbXQogIH0sCiAgY29udGV4dDoge30sCiAgc2VuZGluZzogZmFsc2UsCgogIC8qKgogICAqIEBwcm9wIHtPYmplY3R9IGNhcmRzIEF2YWlsYWJsZSBjYXJkcyB0byB1c2UKICAgKi8KICBjYXJkczogewogICAgb3BlbjogX3ZpZXdfT3BlblRleHRDYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X19bImRlZmF1bHQiXSwKICAgIHRleHR1cmxwcm9tcHQ6IF92aWV3X1RleHRVcmxCdXR0b25DYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X19bImRlZmF1bHQiXSwKICAgIG11bHRpcGxlY2hvaWNlOiBfdmlld19NdWx0aXBsZUNob2ljZUNhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfX1siZGVmYXVsdCJdLAogICAgbXVsdGlwbGVzZWxlY3Q6IF92aWV3X011bHRpcGxlU2VsZWN0Q2FyZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOV9fWyJkZWZhdWx0Il0sCiAgICBsaWtlcnQ6IF92aWV3X0xpa2VydENhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfX1siZGVmYXVsdCJdLAogICAgdGhhbmtzOiBfdmlld19UaGFua3NDYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMl9fWyJkZWZhdWx0Il0sCiAgICBucHM6IF92aWV3X05wc0NhcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzExX19bImRlZmF1bHQiXSwKICAgIHZpZGVvdm9pY2U6IF92aWV3X1ZvaWNlVmlkZW9DYXJkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fWyJkZWZhdWx0Il0KICB9LAogIGxvY2FsZTogJ2VuJywKICBhcGlVUkw6ICdodHRwczovL2FwaS51c2VybGVhcC5jb20nLAogIHNob3dTdXJ2ZXlCcmFuZDogdHJ1ZSwKICBtYXJrZXRpbmdVcmw6ICdodHRwczovL3VzZXJsZWFwLmNvbScsCiAgc2x1Z05hbWU6IG51bGwsCiAgcmVzcG9uc2VHcm91cFVpZDogbnVsbCwKICBoZWFkZXJzOiB7fSwKCiAgLyoqCiAgICogQHByb3Age0Jvb2xlYW59IGlzUHJldmlldyBzZXQgdG8gYHRydWVgIGZvciBwcmV2aWV3IG1vZGU6IHJlc3BvbnNlcyBhcmUgbm90IHdyaXR0ZW4KICAgKiBhbmQgc3VydmV5IHJlc2V0cyB1cG9uIGNvbXBsZXRpb24gaW4gdGhpcyBjYXNlCiAgICovCiAgaXNQcmV2aWV3OiBmYWxzZSwKCiAgLyoqCiAgICogQHByb3Age0FycmF5fSBhbnN3ZXJzIGEgbGlzdCBvZiB7IHF1ZXN0aW9uSWQsIHZhbHVlIH0gdmFsdWVzLgogICAqIElmIGEgdmFsaWQgcmVzcG9uc2UgdmFsdWUgaXMgc3VwcGxpZWQgZm9yIGEgcXVlc3Rpb25JZCwgdGhhdCBxdWVzdGlvbiB3aWxsIGJlIHNraXBwZWQsIGFuZCBhbnN3ZXIgc2F2ZWQuCiAgICogRm9yIG5vdywgb25seSBhIHJlc3BvbnNlIHRvIHRoZSBmaXJzdCBxdWVzdGlvbiBpcyBzdXBwb3J0ZWQuCiAgICovCiAgYW5zd2VyczogW10sCgogIC8qKgogICAqIEBwcm9wIHtPYmplY3R9IGN1c3RvbU1ldGFkYXRhIGFuIG9iamVjdCB3aXRoIGF0IG1vc3QgMjUga2V5cywgd2l0aCB0aGUgY29tYmluZWQgbGVuZ3RoIGtleXMgYW5kIHZhbHVlcyBhdCBtb3N0IDEwMDAgY2hhcmFjdGVycywKICAgKiB1c2VkIHRvIHN0b3JlIGFyYml0cmFyeSBtZXRhZGF0YSByZWxhdGVkIHRvIHRoaXMgcmVzcG9uc2UsCiAgICogZm9yIGV4YW1wbGUsIHRvIGFzc29jaWF0ZSBpdCB3aXRoIGFuIEEvQiB0ZXN0IC8gZmFjaWxhdGUgZG93bnN0cmVhbSBhbmFseXNpcy4KICAgKi8KICBjdXN0b21NZXRhZGF0YToge30sCgogIC8qKgogICAqIEBwcm9wIHtudW1iZXJ9IHZpZXdlZENhcmRDb3VudCBjb3VudCBvZiB2aWV3ZWQgY2FyZHMsIHVzZWQgZm9yIHByb2dyZXNzIGluZGljYXRvcgogICAqLwogIHZpZXdlZENhcmRDb3VudDogMAp9OwovKioKICogQXBwIGFjdGlvbnMKICovCgp2YXIgYWN0aW9ucyA9IHsKICAvKioKICAgKiBJbml0aWFsaXplIHN0YXRlCiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWQKICAgKiBAcGFyYW0ge1N0cmluZ30gcGF5bG9hZC5yZXNwb25zZUdyb3VwSWQKICAgKiBAcGFyYW0ge1N0cmluZ30gcGF5bG9hZC5mcmFtZQogICAqIEBwYXJhbSB7U3RyaW5nfSBwYXlsb2FkLmVudklkCiAgICogQHBhcmFtIHtTdHJpbmd9IHBheWxvYWQudXNlcklkCiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWQubWV0YQogICAqIEBwYXJhbSB7U3RyaW5nfSBwYXlsb2FkLm1vZGUKICAgKi8KICBpbml0OiBmdW5jdGlvbiBpbml0KF9yZWYpIHsKICAgIHZhciBzdXJ2ZXlJZCA9IF9yZWYuc3VydmV5SWQsCiAgICAgICAgZnJhbWUgPSBfcmVmLmZyYW1lLAogICAgICAgIGNhcmRzID0gX3JlZi5jYXJkcywKICAgICAgICBlbnZJZCA9IF9yZWYuZW52SWQsCiAgICAgICAgdXNlcklkID0gX3JlZi51c2VySWQsCiAgICAgICAgbWV0YSA9IF9yZWYubWV0YSwKICAgICAgICBib3JkZXIgPSBfcmVmLmJvcmRlciwKICAgICAgICBmb250RmFtaWx5ID0gX3JlZi5mb250RmFtaWx5LAogICAgICAgIGZvbnRGYW1pbHlVUkwgPSBfcmVmLmZvbnRGYW1pbHlVUkwsCiAgICAgICAgbW9kZSA9IF9yZWYubW9kZSwKICAgICAgICBjb250ZXh0ID0gX3JlZi5jb250ZXh0LAogICAgICAgIGxvY2FsZSA9IF9yZWYubG9jYWxlLAogICAgICAgIGFwaVVSTCA9IF9yZWYuYXBpVVJMLAogICAgICAgIHNob3dTdXJ2ZXlCcmFuZCA9IF9yZWYuc2hvd1N1cnZleUJyYW5kLAogICAgICAgIG1hcmtldGluZ1VybCA9IF9yZWYubWFya2V0aW5nVXJsLAogICAgICAgIHNsdWdOYW1lID0gX3JlZi5zbHVnTmFtZSwKICAgICAgICByZXNwb25zZUdyb3VwVWlkID0gX3JlZi5yZXNwb25zZUdyb3VwVWlkLAogICAgICAgIGhlYWRlcnMgPSBfcmVmLmhlYWRlcnMsCiAgICAgICAgZW5kQ2FyZCA9IF9yZWYuZW5kQ2FyZCwKICAgICAgICBjb25maWd1cmVFeGl0T25PdmVybGF5Q2xpY2sgPSBfcmVmLmNvbmZpZ3VyZUV4aXRPbk92ZXJsYXlDbGljaywKICAgICAgICBpc1ByZXZpZXcgPSBfcmVmLmlzUHJldmlldywKICAgICAgICBhbnN3ZXJzID0gX3JlZi5hbnN3ZXJzLAogICAgICAgIGN1c3RvbU1ldGFkYXRhID0gX3JlZi5jdXN0b21NZXRhZGF0YSwKICAgICAgICBleHBlcmltZW50RmxhZ3MgPSBfcmVmLmV4cGVyaW1lbnRGbGFncywKICAgICAgICB1c2VNb2JpbGVTdHlsaW5nID0gX3JlZi51c2VNb2JpbGVTdHlsaW5nLAogICAgICAgIGV2ZW50RW1pdHRlciA9IF9yZWYuZXZlbnRFbWl0dGVyOwogICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7CiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBhY3Rpb24uYWRkRGVjayh7CiAgICAgICAgZGVjazogY2FyZHMsCiAgICAgICAgaGFzRW5kQ2FyZDogZW5kQ2FyZAogICAgICB9KSwgewogICAgICAgIHN1cnZleUlkOiBzdXJ2ZXlJZCwKICAgICAgICBydW5uaW5nOiB0cnVlLAogICAgICAgIGZyYW1lOiBmcmFtZSwKICAgICAgICBlbnZJZDogZW52SWQsCiAgICAgICAgdXNlcklkOiB1c2VySWQsCiAgICAgICAgbWV0YTogbWV0YSwKICAgICAgICBib3JkZXI6IGJvcmRlciwKICAgICAgICBmb250RmFtaWx5OiBmb250RmFtaWx5LAogICAgICAgIGZvbnRGYW1pbHlVUkw6IGZvbnRGYW1pbHlVUkwsCiAgICAgICAgdGltZW91dDogMSwKICAgICAgICBtb2RlOiBtb2RlLAogICAgICAgIGNvbnRleHQ6IGNvbnRleHQsCiAgICAgICAgbG9jYWxlOiBsb2NhbGUsCiAgICAgICAgYXBpVVJMOiBhcGlVUkwsCiAgICAgICAgc2hvd1N1cnZleUJyYW5kOiBzaG93U3VydmV5QnJhbmQsCiAgICAgICAgbWFya2V0aW5nVXJsOiBtYXJrZXRpbmdVcmwsCiAgICAgICAgc2x1Z05hbWU6IHNsdWdOYW1lLAogICAgICAgIHJlc3BvbnNlR3JvdXBVaWQ6IHJlc3BvbnNlR3JvdXBVaWQsCiAgICAgICAgaGVhZGVyczogaGVhZGVycywKICAgICAgICBlbmRDYXJkOiBlbmRDYXJkLAogICAgICAgIGNvbmZpZ3VyZUV4aXRPbk92ZXJsYXlDbGljazogY29uZmlndXJlRXhpdE9uT3ZlcmxheUNsaWNrLAogICAgICAgIGlzUHJldmlldzogaXNQcmV2aWV3LAogICAgICAgIGFuc3dlcnM6IGFuc3dlcnMsCiAgICAgICAgY3VzdG9tTWV0YWRhdGE6IGN1c3RvbU1ldGFkYXRhLAogICAgICAgIGV4cGVyaW1lbnRGbGFnczogZXhwZXJpbWVudEZsYWdzLAogICAgICAgIHVzZU1vYmlsZVN0eWxpbmc6IHVzZU1vYmlsZVN0eWxpbmcsCiAgICAgICAgZXZlbnRFbWl0dGVyOiBldmVudEVtaXR0ZXIsCiAgICAgICAgdmlld2VkQ2FyZENvdW50OiAwCiAgICAgIH0pOwogICAgfTsKICB9LAoKICAvKioKICAgKiBBZGQgZGVjayB0byB1c2UKICAgKiBAcGFyYW0ge0FycmF5fSBkZWNrIERlY2sgb2YgY2FyZHMKICAgKiBAcmV0dXJuIHtPYmplY3R9IERlY2sgc3RhdGUKICAgKi8KICBhZGREZWNrOiBmdW5jdGlvbiBhZGREZWNrKF9yZWYyKSB7CiAgICB2YXIgZGVjayA9IF9yZWYyLmRlY2ssCiAgICAgICAgaGFzRW5kQ2FyZCA9IF9yZWYyLmhhc0VuZENhcmQ7CiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlKSB7CiAgICAgIHZhciBjYXJkcyA9IGRlY2subWFwKGZ1bmN0aW9uIChjYXJkKSB7CiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIGNhcmQsIHsKICAgICAgICAgIENhcmQ6IHN0YXRlLmNhcmRzW2NhcmQudHlwZV0KICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBpZiAoaGFzRW5kQ2FyZCkgewogICAgICAgIGNhcmRzLnB1c2goewogICAgICAgICAgQ2FyZDogc3RhdGUuY2FyZHMudGhhbmtzCiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIHJldHVybiB7CiAgICAgICAgZGVjazogewogICAgICAgICAgaW5kZXg6IDAsCiAgICAgICAgICBjYXJkczogY2FyZHMKICAgICAgICB9CiAgICAgIH07CiAgICB9OwogIH0sCgogIC8qKgogICAqIFN0YXJ0IHRoZSBjbG9zaW5nIGNvdW50ZG93bgogICAqIEByZXR1cm4ge09iamVjdH0gSW50ZXJ2YWwgY291bnRkb3duIGlkCiAgICovCiAgY29tcGxldGU6IGZ1bmN0aW9uIGNvbXBsZXRlKCkgewogICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgaW50ZXJ2YWw6IHNldEludGVydmFsKGFjdGlvbi5kZWR1Y3QsIDEwMDApCiAgICAgIH07CiAgICB9OwogIH0sCgogIC8qKgogICAqIFNhdmVzIGEgJ3NlZW4nIGV2ZW50IHNvIHRoZSBBUEkgY2FuIHRyYWNrIHdoYXQgd2FzIHNlZW4KICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlcyBvbiBhIHN1Y2Nlc3NmdWwgUFVUCiAgICovCiAgc2VlbjogZnVuY3Rpb24gc2VlbigpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikgewogICAgICBpZiAoc2tpcFdyaXRlRm9yQWN0aW9uKHN0YXRlKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgYWN0aW9uLnRyYWNrSGlzdG9yeSh7CiAgICAgICAgZXZlbnQ6ICdzZWVuJywKICAgICAgICBpc05ldzogdHJ1ZQogICAgICB9KTsKICAgIH07CiAgfSwKCiAgLyoqCiAgICogU2F2ZXMgYSAnY2xvc2UnIGV2ZW50IHNvIHRoZSBBUEkgY2FuIHRyYWNrIHdoYXQgd2FzIHNlZW4KICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlcyBvbiBhIHN1Y2Nlc3NmdWwgUFVUCiAgICovCiAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkgewogICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7CiAgICAgIGlmIChza2lwV3JpdGVGb3JBY3Rpb24oc3RhdGUpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICByZXR1cm4gYWN0aW9uLnRyYWNrSGlzdG9yeSh7CiAgICAgICAgZXZlbnQ6ICdjbG9zZWQnCiAgICAgIH0pOwogICAgfTsKICB9LAoKICAvKioKICAgKiBTdWJtaXQgcGF5bG9hZCByZXNwb25zZQogICAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZSBTdWJtaXNzaW9uCiAgICogQHBhcmFtIHtJbnRlZ2VyfSByZXNwb25zZS5xdWVzdGlvbklkIHRoZSBxdWVzdGlvbklkIGZvciB0aGUgc3VydmV5IHF1ZXN0aW9uCiAgICogQHBhcmFtIHtJbnRlZ2VyfFN0cmluZ3xPYmplY3R9IHJlc3BvbnNlLnZhbHVlIHRoZSBjb2xsZWN0ZWQgcmVzcG9uc2UgZm9yIHRoZSBzdXJ2ZXkgcXVlc3Rpb24KICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlcyBvbiBhIHN1Y2Nlc3NmdWwgc3VibWl0CiAgICovCiAgc3VibWl0OiBmdW5jdGlvbiBzdWJtaXQoX3JlZjMpIHsKICAgIHZhciByZXNwb25zZSA9IF9yZWYzLnJlc3BvbnNlLAogICAgICAgIHJlc3BvbnNlR3JvdXBVaWQgPSBfcmVmMy5yZXNwb25zZUdyb3VwVWlkLAogICAgICAgIGNvbXBsZXRlZEF0ID0gX3JlZjMuY29tcGxldGVkQXQ7CiAgICByZXR1cm4gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgdmFyIF9yZWY0ID0gX2JhYmVsX3J1bnRpbWVfaGVscGVyc19hc3luY1RvR2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19fZGVmYXVsdCgpKCAvKiNfX1BVUkVfXyovX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkubWFyayhmdW5jdGlvbiBfY2FsbGVlKHN0YXRlKSB7CiAgICAgICAgdmFyIHBheWxvYWQsIHJlc3VsdDsKICAgICAgICByZXR1cm4gX2JhYmVsX3J1bnRpbWVfcmVnZW5lcmF0b3JfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIGlmICghKCFyZXNwb25zZUdyb3VwVWlkIHx8IHNraXBXcml0ZUZvckFjdGlvbihzdGF0ZSkpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKCiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgcGF5bG9hZCA9IHsKICAgICAgICAgICAgICAgICAgcmVzcG9uc2VHcm91cFVpZDogcmVzcG9uc2VHcm91cFVpZCwKICAgICAgICAgICAgICAgICAgbWV0YTogc3RhdGUubWV0YSwKICAgICAgICAgICAgICAgICAgY3VzdG9tTWV0YWRhdGE6IHN0YXRlLmN1c3RvbU1ldGFkYXRhLAogICAgICAgICAgICAgICAgICByZXNwb25zZXM6IFtyZXNwb25zZV0sCiAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBjb21wbGV0ZWRBdAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1OwogICAgICAgICAgICAgICAgcmV0dXJuICgwLF9zaGFyZWRfbmV0d29ya19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTRfXy51bEZldGNoKSgiIi5jb25jYXQoc3RhdGUuYXBpVVJMLCAiL3Nkay8xL2Vudmlyb25tZW50cy8iKS5jb25jYXQoc3RhdGUuZW52SWQsICIvdmlzaXRvcnMvIikuY29uY2F0KHN0YXRlLnVzZXJJZCwgIi9yZXNwb25zZXMvc3VibWl0IiksIHsKICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksCiAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHN0YXRlLmhlYWRlcnMsCiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgcmVzdWx0ID0gX2NvbnRleHQuc2VudDsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpOwoKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQub2spIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5yZXBvcnRFcnJvcikgewogICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTI7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybigiW1VzZXJMZWFwXSAoRVJSLTQyNykgRmFpbGVkIHRvIHN1Ym1pdCByZXNwb25zZSIsIHJlc3VsdC5lcnJvcik7CiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTI7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVwb3J0RXJyb3Ioc3RhdGUsICdzdWJtaXRSZXNwb25zZScsIHJlc3VsdC5lcnJvcik7CgogICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KCJyZXR1cm4iKTsKCiAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sIF9jYWxsZWUpOwogICAgICB9KSk7CgogICAgICByZXR1cm4gZnVuY3Rpb24gKF94NCkgewogICAgICAgIHJldHVybiBfcmVmNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB9OwogICAgfSgpOwogIH0sCgogIC8qKgogICAqIERlZHVjdCBmcm9tIHRoZSB0aW1lb3V0CiAgICogQHJldHVybiB7T2JqZWN0fSBEZWR1Y3RlZCB0aW1lb3V0IHN0YXRlCiAgICovCiAgZGVkdWN0OiBmdW5jdGlvbiBkZWR1Y3QoKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlKSB7CiAgICAgIHZhciB0aW1lb3V0ID0gc3RhdGUudGltZW91dCAtIDE7CgogICAgICBpZiAodGltZW91dCA8PSAwKSB7CiAgICAgICAgY2xlYXJJbnRlcnZhbChzdGF0ZS5pbnRlcnZhbCk7CiAgICAgICAgX3NoYXJlZF9jb25mbGljdGluZ193aWRnZXRzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bImRlZmF1bHQiXS5lbmFibGUoKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgcnVubmluZzogZmFsc2UsCiAgICAgICAgICBpbnRlcnZhbDogbnVsbCwKICAgICAgICAgIHRpbWVvdXQ6IHRpbWVvdXQKICAgICAgICB9OwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIHRpbWVvdXQ6IHRpbWVvdXQKICAgICAgfTsKICAgIH07CiAgfSwKCiAgLyoqCiAgICogQ29udGludWUgb24gdG8gdGhlIG5leHQgY2FyZCBpbiB0aGUgZGVjawogICAqIEByZXR1cm4ge09iamVjdH0gSW5jcmVtZW50IGRlY2sKICAgKi8KICBuZXh0OiBmdW5jdGlvbiBuZXh0KHBhcmFtcykgewogICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7CiAgICAgIC8vIFN0b3JlIHRoZSB2YWx1ZSBpbnRvIHRoZSBjYXJkcwogICAgICB2YXIgYW5zd2VyZWRBdCA9IERhdGUubm93KCk7CiAgICAgIHZhciBfc3RhdGUkZGVjayA9IHN0YXRlLmRlY2ssCiAgICAgICAgICBjYXJkcyA9IF9zdGF0ZSRkZWNrLmNhcmRzLAogICAgICAgICAgaW5kZXggPSBfc3RhdGUkZGVjay5pbmRleDsKICAgICAgdmFyIF9jYXJkcyRpbmRleCA9IGNhcmRzW2luZGV4XSwKICAgICAgICAgIHF1ZXN0aW9uSWQgPSBfY2FyZHMkaW5kZXgubmFtZSwKICAgICAgICAgIHR5cGUgPSBfY2FyZHMkaW5kZXgudHlwZTsKICAgICAgdmFyIHJlc3BvbnNlR3JvdXBVaWQgPSBzdGF0ZS5yZXNwb25zZUdyb3VwVWlkOwogICAgICB2YXIgcmVzcG9uc2UgPSBfYmFiZWxfcnVudGltZV9oZWxwZXJzX3R5cGVvZl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQoKShwYXJhbXMuZGF0YSkgPT09ICdvYmplY3QnID8gcGFyYW1zLmRhdGEgOiB7CiAgICAgICAgdmFsdWU6IHBhcmFtcy5kYXRhCiAgICAgIH07CiAgICAgIHZhciB2YWx1ZSA9IHJlc3BvbnNlLnZhbHVlOwogICAgICBjYXJkc1tpbmRleF0udmFsdWUgPSB2YWx1ZTsKICAgICAgcmVzcG9uc2UucXVlc3Rpb25JZCA9IHF1ZXN0aW9uSWQ7CiAgICAgIHJlc3BvbnNlLmFuc3dlcmVkQXQgPSBhbnN3ZXJlZEF0OwogICAgICB2YXIgc3VibWlzc2lvbiA9IHsKICAgICAgICByZXNwb25zZTogcmVzcG9uc2UsCiAgICAgICAgcmVzcG9uc2VHcm91cFVpZDogcmVzcG9uc2VHcm91cFVpZCwKICAgICAgICB0eXBlOiB0eXBlCiAgICAgIH07CiAgICAgIHZhciByb3V0aW5nVmFsdWUgPSB0eXBlID09PSAnbXVsdGlwbGVjaG9pY2UnID8gT2JqZWN0LnZhbHVlcyh2YWx1ZSkuZmluZChmdW5jdGlvbiAodikgewogICAgICAgIHJldHVybiB2ICE9PSBmYWxzZTsKICAgICAgfSkgOiB2YWx1ZTsgLy8gTXVsdGlDaG9pY2UgTXVsdGkgU2VsZWN0LCBzaG91bGQgdGVzdCByb3V0ZSBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgb3B0aW9ucwoKICAgICAgdmFyIGhhc1ZhbGlkQW5zd2VyID0gdHlwZSA9PT0gJ3ZpZGVvdm9pY2UnICYmIHJlc3BvbnNlLmRlbGV0ZWRBdCA/IGZhbHNlIDogdHJ1ZTsKCiAgICAgIGlmICh0eXBlID09PSAnbXVsdGlwbGVzZWxlY3QnKSB7CiAgICAgICAgcm91dGluZ1ZhbHVlID0gY2FyZHNbaW5kZXhdLnByb3BzLm9wdGlvbnMucmVkdWNlKGZ1bmN0aW9uIChhY2N1bXVsYXRvciwgb3B0aW9uKSB7CiAgICAgICAgICBpZiAodmFsdWVbb3B0aW9uLmlkXSkgewogICAgICAgICAgICBhY2N1bXVsYXRvci5wdXNoKG9wdGlvbi52YWx1ZSk7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yOwogICAgICAgIH0sIFtdKTsKICAgICAgfQoKICAgICAgdmFyIHJvdXRpbmdUYXJnZXQgPSAoMCxfdmlld191dGlsX3NraXBMb2dpY0hlbHBlcnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEzX18uZ2V0TmV4dENhcmRJbmRleCkoY2FyZHMsIGluZGV4LCByb3V0aW5nVmFsdWUsICEhcGFyYW1zLmVuZENhcmQsIGhhc1ZhbGlkQW5zd2VyKTsKCiAgICAgIGlmIChyb3V0aW5nVGFyZ2V0ID09PSBudWxsKSB7CiAgICAgICAgLy8gbm8gbW9yZSBuZXh0IGluZGV4LCBzdXJ2ZXkgY29tcGxldGVkCiAgICAgICAgc3VibWlzc2lvbi5jb21wbGV0ZWRBdCA9IGFuc3dlcmVkQXQ7CiAgICAgICAgYWN0aW9uLnN1Ym1pdChzdWJtaXNzaW9uKTsKICAgICAgICBwYXJhbXMuY29tcGxldGVTdXJ2ZXkoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSBpZiAoY2FyZHNbcm91dGluZ1RhcmdldF0uQ2FyZCA9PT0gc3RhdGUuY2FyZHMudGhhbmtzKSB7CiAgICAgICAgc3VibWlzc2lvbi5jb21wbGV0ZWRBdCA9IGFuc3dlcmVkQXQ7CiAgICAgIH0KCiAgICAgIHZhciBwID0gYWN0aW9uLnN1Ym1pdChzdWJtaXNzaW9uKTsKCiAgICAgIGlmIChjYXJkc1tyb3V0aW5nVGFyZ2V0XS5DYXJkICE9IHN0YXRlLmNhcmRzLnRoYW5rcykgewogICAgICAgIHAuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgICBhY3Rpb24udHJhY2tIaXN0b3J5KHsKICAgICAgICAgICAgZXZlbnQ6ICdzZWVuJywKICAgICAgICAgICAgaW5kZXg6IHJvdXRpbmdUYXJnZXQKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIHZpZXdlZENhcmRDb3VudDogc3RhdGUudmlld2VkQ2FyZENvdW50ICsgMSwKICAgICAgICBkZWNrOiB7CiAgICAgICAgICBjYXJkczogY2FyZHMsCiAgICAgICAgICBpbmRleDogcm91dGluZ1RhcmdldAogICAgICAgIH0KICAgICAgfTsKICAgIH07CiAgfSwKICB0cmFja0hpc3Rvcnk6IGZ1bmN0aW9uIHRyYWNrSGlzdG9yeShfcmVmNSkgewogICAgdmFyIGV2ZW50ID0gX3JlZjUuZXZlbnQsCiAgICAgICAgaWR4ID0gX3JlZjUuaW5kZXgsCiAgICAgICAgX3JlZjUkaXNOZXcgPSBfcmVmNS5pc05ldywKICAgICAgICBpc05ldyA9IF9yZWY1JGlzTmV3ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWY1JGlzTmV3OwogICAgcmV0dXJuIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgIHZhciBfcmVmNiA9IF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfYXN5bmNUb0dlbmVyYXRvcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fX2RlZmF1bHQoKSggLyojX19QVVJFX18qL19iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoc3RhdGUpIHsKICAgICAgICB2YXIgX3N0YXRlJGRlY2syLCBjYXJkcywgaW5kZXgsIGNhcmQsIGhpc3QsIHJlc3VsdDsKCiAgICAgICAgcmV0dXJuIF9iYWJlbF9ydW50aW1lX3JlZ2VuZXJhdG9yX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgaWYgKCFza2lwV3JpdGVGb3JBY3Rpb24oc3RhdGUpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoInJldHVybiIpOwoKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBfc3RhdGUkZGVjazIgPSBzdGF0ZS5kZWNrLCBjYXJkcyA9IF9zdGF0ZSRkZWNrMi5jYXJkcywgaW5kZXggPSBfc3RhdGUkZGVjazIuaW5kZXg7CiAgICAgICAgICAgICAgICBjYXJkID0gaWR4ICE9PSB1bmRlZmluZWQgPyBjYXJkc1tpZHhdIDogY2FyZHNbaW5kZXhdOwogICAgICAgICAgICAgICAgaGlzdCA9IHsKICAgICAgICAgICAgICAgICAgc2lkOiBzdGF0ZS5zdXJ2ZXlJZCwKICAgICAgICAgICAgICAgICAgcWlkOiBjYXJkLm5hbWUsCiAgICAgICAgICAgICAgICAgIGFjdGlvbjogZXZlbnQsCiAgICAgICAgICAgICAgICAgIHZpZDogc3RhdGUudXNlcklkLAogICAgICAgICAgICAgICAgICBlaWQ6IHN0YXRlLmVudklkLAogICAgICAgICAgICAgICAgICBpc05ldzogaXNOZXcsCiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlR3JvdXBVaWQ6IHN0YXRlLnJlc3BvbnNlR3JvdXBVaWQKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDc7CiAgICAgICAgICAgICAgICByZXR1cm4gKDAsX3NoYXJlZF9uZXR3b3JrX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNF9fLnVsRmV0Y2gpKCIiLmNvbmNhdChzdGF0ZS5hcGlVUkwsICIvc2RrLzEvdmlzaXRvcnMvIikuY29uY2F0KHN0YXRlLnVzZXJJZCwgIi9zdXJ2ZXlzLyIpLmNvbmNhdChzdGF0ZS5zdXJ2ZXlJZCwgIi9oaXN0b3J5IiksIHsKICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoaGlzdCksCiAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHN0YXRlLmhlYWRlcnMsCiAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgcmVzdWx0ID0gX2NvbnRleHQyLnNlbnQ7CgogICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5vaykgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEzOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5yZXBvcnRFcnJvcikgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEzOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIltVc2VyTGVhcF0gKEVSUi00MjgpIEZhaWxlZCB0byB0cmFjayBzdXJ2ZXkgZXZlbnQiLCByZXN1bHQuZXJyb3IpOwogICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMzsKICAgICAgICAgICAgICAgIHJldHVybiByZXBvcnRFcnJvcihzdGF0ZSwgJ3RyYWNrSGlzdG9yeScsIHJlc3VsdC5lcnJvcik7CgogICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwgX2NhbGxlZTIpOwogICAgICB9KSk7CgogICAgICByZXR1cm4gZnVuY3Rpb24gKF94NSkgewogICAgICAgIHJldHVybiBfcmVmNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB9OwogICAgfSgpOwogIH0KfTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3ZpZXcvc3RvcmUvbW9kdWxlcy9tdWx0aXBsZXNlbGVjdC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy92aWV3L3N0b3JlL21vZHVsZXMvbXVsdGlwbGVzZWxlY3QuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHsKLyogaGFybW9ueSBleHBvcnQgKi8gICAic3RhdGUiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gc3RhdGU7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgImFjdGlvbnMiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gYWN0aW9uczsgfQovKiBoYXJtb255IGV4cG9ydCAqLyB9KTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18pOwoKCmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHsgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyB9IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfQoKZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19kZWZpbmVQcm9wZXJ0eV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQoKSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfQoKLyoqCiAqIE11bHRpcGxlIFNlbGVjdCBpbml0aWFsIHN0YXRlCiAqLwp2YXIgc3RhdGUgPSB7CiAgc2VsZWN0ZWRPcHRpb25zOiB7fQp9OwovKioKICogTXVsdGlwbGUgU2VsZWN0IGFjdGlvbnMKICovCgp2YXIgYWN0aW9ucyA9IHsKICBpbml0OiBmdW5jdGlvbiBpbml0KG9wdGlvbnMpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUpIHsKICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHN0YXRlLCB7CiAgICAgICAgc2VsZWN0ZWRPcHRpb25zOiBvcHRpb25zCiAgICAgIH0pOwogICAgfTsKICB9LAogIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUpIHsKICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHN0YXRlLCB7CiAgICAgICAgc2VsZWN0ZWRPcHRpb25zOiB7fQogICAgICB9KTsKICAgIH07CiAgfSwKICB1cGRhdGVTZWxlY3RlZDogZnVuY3Rpb24gdXBkYXRlU2VsZWN0ZWQoaWQpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUpIHsKICAgICAgaWYgKGlkID09IG51bGwpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciBzZWxlY3RlZE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHN0YXRlLnNlbGVjdGVkT3B0aW9ucyk7CiAgICAgIHNlbGVjdGVkT3B0aW9uc1tpZF0gPSAhc2VsZWN0ZWRPcHRpb25zW2lkXTsKICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHN0YXRlLCB7CiAgICAgICAgc2VsZWN0ZWRPcHRpb25zOiBzZWxlY3RlZE9wdGlvbnMKICAgICAgfSk7CiAgICB9OwogIH0KfTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vc3JjL3ZpZXcvc3RvcmUvbW9kdWxlcy9vcGVuVGV4dC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL3NyYy92aWV3L3N0b3JlL21vZHVsZXMvb3BlblRleHQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHsKLyogaGFybW9ueSBleHBvcnQgKi8gICAic3RhdGUiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gc3RhdGU7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgImFjdGlvbnMiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gYWN0aW9uczsgfQovKiBoYXJtb255IGV4cG9ydCAqLyB9KTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18pOwoKCmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHsgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyB9IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfQoKZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2JhYmVsX3J1bnRpbWVfaGVscGVyc19kZWZpbmVQcm9wZXJ0eV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQoKSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfQoKLyoqCiAqIFRleHQgaW5pdGlhbCBzdGF0ZQogKi8KdmFyIHN0YXRlID0gewogIHZhbHVlOiAnJwp9OwovKioKICogVGV4dCBhY3Rpb25zCiAqLwoKdmFyIGFjdGlvbnMgPSB7CiAgb25UZXh0Q2hhbmdlOiBmdW5jdGlvbiBvblRleHRDaGFuZ2UodGV4dCkgewogICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSkgewogICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgc3RhdGUsIHsKICAgICAgICB2YWx1ZTogdGV4dAogICAgICB9KTsKICAgIH07CiAgfQp9OwoKLyoqKi8gfSksCgovKioqLyAiLi9zcmMvdmlldy9zdG9yZS9zdGF0ZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvdmlldy9zdG9yZS9zdGF0ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9tb2R1bGVzX2FwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9tb2R1bGVzL2FwcCAqLyAiLi9zcmMvdmlldy9zdG9yZS9tb2R1bGVzL2FwcC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX21vZHVsZXNfbXVsdGlwbGVzZWxlY3RfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vbW9kdWxlcy9tdWx0aXBsZXNlbGVjdCAqLyAiLi9zcmMvdmlldy9zdG9yZS9tb2R1bGVzL211bHRpcGxlc2VsZWN0LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfbW9kdWxlc19vcGVuVGV4dF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9tb2R1bGVzL29wZW5UZXh0ICovICIuL3NyYy92aWV3L3N0b3JlL21vZHVsZXMvb3BlblRleHQuanMiKTsKCgoKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fWyJkZWZhdWx0Il0gPSAoewogIGFwcDogX21vZHVsZXNfYXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uc3RhdGUsCiAgbXVsdGlwbGVzZWxlY3Q6IF9tb2R1bGVzX211bHRpcGxlc2VsZWN0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18uc3RhdGUsCiAgb3BlblRleHQ6IF9tb2R1bGVzX29wZW5UZXh0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uc3RhdGUKfSk7CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy92aWV3L3V0aWwvZ2V0VXNlck1ldGEuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvdmlldy91dGlsL2dldFVzZXJNZXRhLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7Ci8qIGhhcm1vbnkgZXhwb3J0ICovICAgImRlZmF1bHQiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gZ2V0VXNlck1ldGE7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8qIGdsb2JhbHMgd2luZG93ICovCgovKioKICogR2V0IGJhc2ljIHVzZXIgbWV0YSBpbmZvcm1hdGlvbgogKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMgPSB7fV0KICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1ldGEgPSBudWxsXQogKiBAcmV0dXJuIHtPYmplY3R9IFVzZXIgbWV0YSBpbmZvcm1hdGlvbgogKi8KZnVuY3Rpb24gZ2V0VXNlck1ldGEoX3JlZikgewogIHZhciBkaXJlY3RFbWJlZCA9IF9yZWYuZGlyZWN0RW1iZWQsCiAgICAgIF9yZWYkbW9kZSA9IF9yZWYubW9kZSwKICAgICAgbW9kZSA9IF9yZWYkbW9kZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkbW9kZTsKICB2YXIgbWF5YmVQYXJlbnRXaW5kb3cgPSBkaXJlY3RFbWJlZCA/IHdpbmRvdyA6IHdpbmRvdy5wYXJlbnQ7CiAgdmFyIHBkZSA9IG1heWJlUGFyZW50V2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKICByZXR1cm4gewogICAgbW9kZTogbW9kZSwKICAgIHN3OiBtYXliZVBhcmVudFdpbmRvdy5zY3JlZW4ud2lkdGgsCiAgICBzaDogbWF5YmVQYXJlbnRXaW5kb3cuc2NyZWVuLmhlaWdodCwKICAgIGN3OiBwZGUuY2xpZW50V2lkdGgsCiAgICBjaDogcGRlLmNsaWVudEhlaWdodCwKICAgIHA6IG1heWJlUGFyZW50V2luZG93LmxvY2F0aW9uLmhyZWYsCiAgICBsOiBtYXliZVBhcmVudFdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2UKICB9Owp9CgovKioqLyB9KSwKCi8qKiovICIuL3NyYy92aWV3L3V0aWwvc2tpcExvZ2ljSGVscGVycy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvdXRpbC9za2lwTG9naWNIZWxwZXJzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHsKLyogaGFybW9ueSBleHBvcnQgKi8gICAiZ2V0TmV4dENhcmRJbmRleCI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBnZXROZXh0Q2FyZEluZGV4OyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJnZXRNYXhSZW1haW5pbmdDYXJkcyI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBnZXRNYXhSZW1haW5pbmdDYXJkczsgfQovKiBoYXJtb255IGV4cG9ydCAqLyB9KTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdHlwZW9mX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZiAqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdHlwZW9mX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc190eXBlb2ZfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX2JhYmVsX3J1bnRpbWVfaGVscGVyc19kZWZpbmVQcm9wZXJ0eV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX3RvQ29uc3VtYWJsZUFycmF5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18pOwoKCgp2YXIgQU5TV0VSRUQgPSAxOwp2YXIgY29tcGFyYXRvcnMgPSB7CiAgZXE6IGZ1bmN0aW9uIGVxKGEsIGIpIHsKICAgIHJldHVybiBhID09IGI7CiAgfSwKICBuZXE6IGZ1bmN0aW9uIG5lcShhLCBiKSB7CiAgICByZXR1cm4gIXRoaXMuZXEoYSwgYik7CiAgfSwKICBndDogZnVuY3Rpb24gZ3QoYSwgYikgewogICAgcmV0dXJuIGEgPiBiOwogIH0sCiAgZ3RlOiBmdW5jdGlvbiBndGUoYSwgYikgewogICAgcmV0dXJuIGEgPj0gYjsKICB9LAogIGx0OiBmdW5jdGlvbiBsdChhLCBiKSB7CiAgICByZXR1cm4gYSA8IGI7CiAgfSwKICBsdGU6IGZ1bmN0aW9uIGx0ZShhLCBiKSB7CiAgICByZXR1cm4gYSA8PSBiOwogIH0sCiAgLy8gbXVsdGlzZWxlY3QgY29tcGFyYXRvcnMKCiAgLyoqCiAgICogYSBpcyBleGFjdGx5IGIKICAgKiBAcGFyYW0ge1tTdHJpbmddfSBhCiAgICogQHBhcmFtIHtbU3RyaW5nXX0gYgogICAqLwogIGxpc3RfZXhhY3Q6IGZ1bmN0aW9uIGxpc3RfZXhhY3QoYSwgYikgewogICAgaWYgKCFBcnJheS5pc0FycmF5KGEpIHx8ICFBcnJheS5pc0FycmF5KGIpKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gYS5zbGljZSgpLnNvcnQoKS5qb2luKCcsJykgPT09IGIuc2xpY2UoKS5zb3J0KCkuam9pbignLCcpOwogIH0sCgogIC8qKgogICAqIGEgY29udGFpbnMgYgogICAqIEBwYXJhbSB7W1N0cmluZ119IGEKICAgKiBAcGFyYW0ge1tTdHJpbmddfSBiCiAgICovCiAgbGlzdF9hbGw6IGZ1bmN0aW9uIGxpc3RfYWxsKGEsIGIpIHsKICAgIGlmICghQXJyYXkuaXNBcnJheShhKSB8fCAhQXJyYXkuaXNBcnJheShiKSkgcmV0dXJuIGZhbHNlOyAvLyB0aGVyZSdzIG5vIHNvbWUgdmFsdWUgaW4gYiB0aGF0IGRvZXNuJ3QgZXhpc3QgaW4gYSBpcyBsb2dpY2FsbHkgZXF1aXZhbGVudCB0byBhbGwgdmFsdWUgaW4gYiBleGlzdCBpbiBhCgogICAgcmV0dXJuICFiLnNvbWUoZnVuY3Rpb24gKHZhbCkgewogICAgICByZXR1cm4gYS5pbmRleE9mKHZhbCkgPT09IC0xOwogICAgfSk7CiAgfSwKCiAgLyoqCiAgICogYSBoYXMgYXQgbGVhc3Qgb25lIHZhbHVlIGZyb20gYgogICAqIEBwYXJhbSB7W1N0cmluZ119IGEKICAgKiBAcGFyYW0ge1tTdHJpbmddfSBiCiAgICovCiAgbGlzdF9hbG86IGZ1bmN0aW9uIGxpc3RfYWxvKGEsIGIpIHsKICAgIGlmICghQXJyYXkuaXNBcnJheShhKSB8fCAhQXJyYXkuaXNBcnJheShiKSkgcmV0dXJuIGZhbHNlOyAvLyBzb21lIHZhbHVlIGV4aXN0IGluIGIgdGhhdCBhbHNvIGV4aXN0IGluIGEKCiAgICByZXR1cm4gYi5zb21lKGZ1bmN0aW9uICh2YWwpIHsKICAgICAgcmV0dXJuIGEuaW5kZXhPZih2YWwpICE9IC0xOwogICAgfSk7CiAgfQp9OwovKioKICogQHBhcmFtIHtBcnJheSBvZiBvYmplY3RzfSBjYXJkcyAtIEFycmF5IG9mIGFsbCBjYXJkcwogKiBAcGFyYW0ge0ludH0gaW5kZXggLSBDdXJyZW50IGluZGV4IGluIHRoZSBjYXJkcwogKiBAcGFyYW0ge0FueX0gc2VsZWN0ZWRWYWx1ZSAtIFZhbHVlIHRoYXQgd2FzIHNlbGVjdGVkIHdoaWNoIGRldGVybWluZXMgcm91dGluZyBvcHRpb25zCiAqIEBwYXJhbSB7Qm9vbGVhbn0gaGFzRW5kQ2FyZCAtIGlzIHRoZSB0aGFua3MgY2FyZCBjb25maWd1cmVkCiAqIEByZXR1cm5zIHtJbnR9IG9wdGlvbmFsIG5leHQgaW5kZXggdmFsdWUsIGlmIG5leHQgaW5kZXggaXMgbnVsbCwgc3VydmV5IGVuZHMgaW1tZWRpYXRlbHkKICovCgp2YXIgZ2V0TmV4dENhcmRJbmRleCA9IGZ1bmN0aW9uIGdldE5leHRDYXJkSW5kZXgoY2FyZHMsIGluZGV4LCBzZWxlY3RlZFZhbHVlLCBoYXNFbmRDYXJkKSB7CiAgdmFyIGhhc1ZhbGlkQW5zd2VyID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlOwogIGlmIChpbmRleCA+PSBjYXJkcy5sZW5ndGggfHwgaW5kZXggPCAwKSByZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBzY2VuYXJpbwoKICB2YXIgcm91dGluZ09wdGlvbnMgPSBjYXJkc1tpbmRleF0gJiYgY2FyZHNbaW5kZXhdLnByb3BzICYmIGNhcmRzW2luZGV4XS5wcm9wcy5yb3V0aW5nT3B0aW9ucyB8fCBbXTsKICB2YXIgc2FmZU5leHRJbmRleCA9IE1hdGgubWluKGluZGV4ICsgMSwgY2FyZHMubGVuZ3RoIC0gMSk7CiAgdmFyIHJvdXRpbmdUYXJnZXQgPSBudWxsOwoKICBmb3IgKHZhciBpID0gMDsgaSA8IHJvdXRpbmdPcHRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgX3JvdXRpbmdPcHRpb25zJGkgPSByb3V0aW5nT3B0aW9uc1tpXSwKICAgICAgICBjb21wYXJhdG9yID0gX3JvdXRpbmdPcHRpb25zJGkuY29tcGFyYXRvciwKICAgICAgICB0YXJnZXQgPSBfcm91dGluZ09wdGlvbnMkaS50YXJnZXQsCiAgICAgICAgdmFsdWUgPSBfcm91dGluZ09wdGlvbnMkaS52YWx1ZTsKCiAgICBpZiAoY29tcGFyYXRvciA9PT0gJ2Fuc3dlcmVkJyAmJiBoYXNWYWxpZEFuc3dlcikgewogICAgICByb3V0aW5nVGFyZ2V0ID0gcGFyc2VJbnQodGFyZ2V0LCAxMCk7CiAgICAgIGJyZWFrOwogICAgfSBlbHNlIGlmIChjb21wYXJhdG9yc1tjb21wYXJhdG9yXSAmJiBjb21wYXJhdG9yc1tjb21wYXJhdG9yXShzZWxlY3RlZFZhbHVlLCB2YWx1ZSkpIHsKICAgICAgcm91dGluZ1RhcmdldCA9IHBhcnNlSW50KHRhcmdldCwgMTApOwogICAgICBicmVhazsKICAgIH0KICB9IC8vIHRoZSAyIGVuZCBzY2VuYXJpb3MgYXJlOgogIC8vIDEuIHdoZW4gdGhlcmUncyBubyByb3V0aW5nIGFuZCBpbmRleCBpcyBjdXJyZW50bHkgYXQgdGhlIGVuZC4KICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiB3aGVuIHRoZXJlJ3Mgbm8gZW5kIGNhcmQKCgogIGlmIChyb3V0aW5nVGFyZ2V0ID09PSBudWxsICYmIGluZGV4ID09PSBjYXJkcy5sZW5ndGggLSAxKSByZXR1cm4gbnVsbDsgLy8gMi4gdGFyZ2V0IHNwZWNpZnkgc2tpcCB0byBlbmQKICAvLyBUaGVuLCB3aGVuIHRoZXJlJ3MgZW5kIGNhcmQgdGhlIGVuZCBpbmRleCBpcyB0aGUgbGFzdCBpdGVtIGluIHRoZSBhcnJheQogIC8vIE90aGVyd2lzZSwgdGhlcmUncyBubyBlbmQgaW5kZXgKCiAgaWYgKHJvdXRpbmdUYXJnZXQgPT09IC0xKSByZXR1cm4gaGFzRW5kQ2FyZCA/IGNhcmRzLmxlbmd0aCAtIDEgOiBudWxsOwogIHJldHVybiByb3V0aW5nVGFyZ2V0ID09PSBudWxsID8gc2FmZU5leHRJbmRleCA6IHJvdXRpbmdUYXJnZXQ7Cn07CnZhciBNQVhfTEVOR1RIX1RPX0NBTENVTEFURV9TVUJTRVRTID0gMTM7IC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQyNzczODM2L2hvdy10by1maW5kLWFsbC1zdWJzZXRzLW9mLWEtc2V0LWluLWphdmFzY3JpcHQtcG93ZXJzZXQtb2YtYXJyYXkKCnZhciBnZXRBbGxTdWJzZXRzID0gZnVuY3Rpb24gZ2V0QWxsU3Vic2V0cyhhcnJheSkgewogIHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24gKHN1YnNldHMsIHZhbHVlKSB7CiAgICByZXR1cm4gc3Vic2V0cy5jb25jYXQoc3Vic2V0cy5tYXAoZnVuY3Rpb24gKHNldCkgewogICAgICByZXR1cm4gW10uY29uY2F0KF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdG9Db25zdW1hYmxlQXJyYXlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX19kZWZhdWx0KCkoc2V0KSwgW3ZhbHVlXSk7CiAgICB9KSk7CiAgfSwgW1tdXSk7Cn07CgpmdW5jdGlvbiBnZW5lcmF0ZVBvc3NpYmxlU2VsZWN0ZWRWYWx1ZXMoY2FyZCkgewogIHN3aXRjaCAoY2FyZC50eXBlKSB7CiAgICBjYXNlICdtdWx0aXBsZXNlbGVjdCc6CiAgICAgIC8vIHJldHVybiBudWxsIGlmIGludmFsaWQgb3B0aW9ucwogICAgICBpZiAoIWNhcmQgfHwgIWNhcmQucHJvcHMgfHwgIWNhcmQucHJvcHMub3B0aW9ucykgcmV0dXJuIG51bGw7CgogICAgICBpZiAoY2FyZC5wcm9wcy5vcHRpb25zLmxlbmd0aCA+IE1BWF9MRU5HVEhfVE9fQ0FMQ1VMQVRFX1NVQlNFVFMpIHsKICAgICAgICAvLyAyICoqIE1BWF9MRU5HVEhfVE9fQ0FMQ1VMQVRFX1NVQlNFVFMgKDEzKSA9IDgxOTIuIGFib3ZlIHRoaXMgbGltaXQsIGNvbXB1dGF0aW9uIG1heSBiZSB0b28gc2xvdy4KICAgICAgICAvLyBXZSBzaG91bGQgYWxtb3N0IG5ldmVyIHNlZSBtb3JlIHRoYW4gMTMgb3B0aW9ucywgYnV0IGluIHRoaXMgZWRnZSBjYXNlLCBvbmx5IGNvbnNpZGVyIGxlbmd0aC0xIGNvbWJpbmF0aW9ucy4KICAgICAgICAvLyBUaGlzIG1heSBsZWFkIHRvIGFuIGluYWNjdXJhdGUgY2FsY3VsYXRpb24sIGJ1dCB3ZSBwcmVmZXIgdGhhdCB0aGFuIHBvb3IgcGVyZm9ybWFuY2UuCiAgICAgICAgcmV0dXJuIGNhcmQucHJvcHMub3B0aW9ucy5tYXAoZnVuY3Rpb24gKG9wdGlvbikgewogICAgICAgICAgcmV0dXJuIFtvcHRpb24udmFsdWVdOwogICAgICAgIH0pOwogICAgICB9CgogICAgICByZXR1cm4gZ2V0QWxsU3Vic2V0cyhjYXJkLnByb3BzLm9wdGlvbnMubWFwKGZ1bmN0aW9uIChvcHRpb24pIHsKICAgICAgICByZXR1cm4gb3B0aW9uLnZhbHVlOwogICAgICB9KSk7CgogICAgY2FzZSAnbXVsdGlwbGVjaG9pY2UnOgogICAgICAvLyByZXR1cm4gbnVsbCBpZiBpbnZhbGlkIG9wdGlvbnMKICAgICAgaWYgKCFjYXJkIHx8ICFjYXJkLnByb3BzIHx8ICFjYXJkLnByb3BzLm9wdGlvbnMpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gY2FyZC5wcm9wcy5vcHRpb25zLm1hcChmdW5jdGlvbiAob3B0aW9uKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbi52YWx1ZTsKICAgICAgfSk7CgogICAgY2FzZSAnbGlrZXJ0JzoKICAgICAgcmV0dXJuIFsxLCAyLCAzLCA0LCA1XTsKCiAgICBjYXNlICducHMnOgogICAgICByZXR1cm4gWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldOwoKICAgIGNhc2UgJ3ZpZGVvdm9pY2UnOgogICAgY2FzZSAnb3Blbic6CiAgICBjYXNlICd0ZXh0dXJscHJvbXB0JzoKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBbQU5TV0VSRURdOwogIH0KfQoKdmFyIGdldE1heFJlbWFpbmluZ0NhcmRzID0gZnVuY3Rpb24gZ2V0TWF4UmVtYWluaW5nQ2FyZHMocmF3Q2FyZHMsIGluZGV4KSB7CiAgdmFyIF9jYWNoZTsKCiAgLy8gcmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVtYWluaW5nIGNhcmRzLCBpbmNsdWRpbmcgdGhpcyBjYXJkCiAgaWYgKCFyYXdDYXJkcyB8fCAhcmF3Q2FyZHMubGVuZ3RoIHx8IGluZGV4ID49IHJhd0NhcmRzLmxlbmd0aCB8fCBpbmRleCA8IDApIHJldHVybiAwOyAvLyBpbnZhbGlkIHNjZW5hcmlvCgogIGlmICghcmF3Q2FyZHNbaW5kZXhdLnR5cGUpIHsKICAgIC8vIHRoaXMgaXMgdGhlIHRoYW5rIHlvdSBjYXJkCiAgICByZXR1cm4gMDsKICB9IC8vIGZpbHRlciBvdXQgdGhhbmsgeW91IGNhcmQgZnJvbSBjYWxjdWxhdGlvbiwgaWYgcHJlc2VudAoKCiAgdmFyIGNhcmRzID0gcmF3Q2FyZHMuZmlsdGVyKGZ1bmN0aW9uIChjYXJkKSB7CiAgICByZXR1cm4gY2FyZC50eXBlOwogIH0pOyAvLyB0aGlzIGlzIHRoZSBsYXN0IGNhcmQsIHNvIHdlIGNhbiBzaG9ydC1jaXJjdWl0LgoKICBpZiAoaW5kZXggPT09IGNhcmRzLmxlbmd0aCAtIDEpIHJldHVybiAxOyAvLyByb3V0aW5nVGFyZ2V0IG9mIGVuZCBjYXJkIGlzIC0xLCBpbiB0aGlzIGNhc2UsIHRoZXJlIGFyZSBubyBxdWVzdGlvbnMgbGVmdC4KCiAgdmFyIGNhY2hlID0gKF9jYWNoZSA9IHt9LCBfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCgpKF9jYWNoZSwgY2FyZHMubGVuZ3RoIC0gMSwgMSksIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX19kZWZhdWx0KCkoX2NhY2hlLCAtMSwgMCksIF9jYWNoZSk7IC8vIGZvciBlYWNoIGNhcmQgaW4gcmV2ZXJzZSBvcmRlciwgZW5kaW5nIHdpdGggdGhlIGN1cnJlbnQgZGVzaXJlZCBpbmRleCwgY29tcHV0ZSB0aGUgbG9uZ2VzdCBwb3NzaWJsZQogIC8vIG51bWJlciBvZiByZW1haW5pbmcgY2FyZHMsIGNvbnNpZGVyaW5nIHRoZSB2YWx1ZXMgb2YgbG9uZ2VzdCBwb3NzaWJsZSBudW1iZXIgb2YgcmVtYWluaW5nIGNhcmRzIGFmdGVyIGl0LgoKICBmb3IgKHZhciBjdXJyZW50SW5kZXggPSBjYXJkcy5sZW5ndGggLSAyOyBjdXJyZW50SW5kZXggPj0gaW5kZXg7IGN1cnJlbnRJbmRleC0tKSB7CiAgICB2YXIgY2FyZCA9IGNhcmRzW2N1cnJlbnRJbmRleF07CiAgICB2YXIgcm91dGluZ09wdGlvbnMgPSBjYXJkICYmIGNhcmQucHJvcHMgJiYgY2FyZC5wcm9wcy5yb3V0aW5nT3B0aW9ucyB8fCBbXTsgLy8gaWYgdGhlcmUgYXJlbid0IHJvdXRpbmcgb3B0aW9ucywgd2UgaGF2ZSB0byBnbyB0byB0aGUgbmV4dCBxdWVzdGlvbgoKICAgIGlmIChyb3V0aW5nT3B0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgY2FjaGVbY3VycmVudEluZGV4XSA9IGNhY2hlW2N1cnJlbnRJbmRleCArIDFdICsgMTsKICAgICAgY29udGludWU7CiAgICB9CgogICAgdmFyIG1heFJlbWFpbmluZ0NhcmRzID0gMDsKICAgIHZhciBwb3NzaWJsZVNlbGVjdGVkVmFsdWVzID0gZ2VuZXJhdGVQb3NzaWJsZVNlbGVjdGVkVmFsdWVzKGNhcmQpOwoKICAgIGlmIChwb3NzaWJsZVNlbGVjdGVkVmFsdWVzID09PSBudWxsKSB7CiAgICAgIC8vIGludmFsaWQgcXVlc3Rpb24gb3B0aW9ucywgc2hvcnQtY2lyY3VpdCB3aXRoIHJlbWFpbmluZyBjYXJkIGNvdW50CiAgICAgIHJldHVybiBjYXJkcy5sZW5ndGggLSAxIC0gaW5kZXg7CiAgICB9IC8vIGNvbnNpZGVyIGVhY2ggcm91dGluZyBvcHRpb246IGlmIGl0J3MgcG9zc2libGUgZm9yIGl0IHRvIG1hdGNoLAogICAgLy8gY29uc2lkZXIgd2hlcmUgaXQgbGVhZHMgYXMgcGFydCBvZiBjb21wdXRpbmcgdGhlIGxvbmdlc3QgcG9zc2libGUgbnVtYmVyIG9mIHJlbWFpbmluZyBjYXJkcy4KCgogICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3Aocm91dGluZ09wdGlvbkluZGV4KSB7CiAgICAgIGlmIChwb3NzaWJsZVNlbGVjdGVkVmFsdWVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIC8vIHJlbWFpbmluZyByb3V0aW5nT3B0aW9ucyBhcmUgbmV2ZXIgY29uc2lkZXJlZAogICAgICAgIHJldHVybiAiYnJlYWsiOwogICAgICB9CgogICAgICB2YXIgX3JvdXRpbmdPcHRpb25zJHJvdXRpID0gcm91dGluZ09wdGlvbnNbcm91dGluZ09wdGlvbkluZGV4XSwKICAgICAgICAgIGNvbXBhcmF0b3IgPSBfcm91dGluZ09wdGlvbnMkcm91dGkuY29tcGFyYXRvciwKICAgICAgICAgIHRhcmdldCA9IF9yb3V0aW5nT3B0aW9ucyRyb3V0aS50YXJnZXQsCiAgICAgICAgICB2YWx1ZSA9IF9yb3V0aW5nT3B0aW9ucyRyb3V0aS52YWx1ZTsgLy8gZmlsdGVyIG91dCBhbnkgcmVtYWluaW5nIHBvc3NpYmxlIHZhbHVlcyB0aGF0IG1hdGNoIHRoZSBjdXJyZW50IHJvdXRpbmcgb3B0aW9uCgogICAgICB2YXIgbmV3UG9zc2libGVTZWxlY3RlZFZhbHVlcyA9IHBvc3NpYmxlU2VsZWN0ZWRWYWx1ZXMuZmlsdGVyKGZ1bmN0aW9uIChzZWxlY3RlZFZhbHVlKSB7CiAgICAgICAgcmV0dXJuICEoY29tcGFyYXRvciA9PT0gJ2Fuc3dlcmVkJyB8fCBjb21wYXJhdG9yc1tjb21wYXJhdG9yXSAmJiBjb21wYXJhdG9yc1tjb21wYXJhdG9yXShzZWxlY3RlZFZhbHVlLCB2YWx1ZSkpOwogICAgICB9KTsgLy8gaWYgYW55dGhpbmcgd2FzIGZpbHRlcmVkIG91dCwgaXQncyBwb3NzaWJsZSB0byBtYXRjaCB0aGUgcm91dGluZyBvcHRpb25zLCBzbyB1c2Ugcm91dGluZyB0YXJnZXQKCiAgICAgIGlmIChuZXdQb3NzaWJsZVNlbGVjdGVkVmFsdWVzLmxlbmd0aCA8IHBvc3NpYmxlU2VsZWN0ZWRWYWx1ZXMubGVuZ3RoKSB7CiAgICAgICAgdmFyIHJvdXRpbmdUYXJnZXQgPSBwYXJzZUludCh0YXJnZXQsIDEwKTsKCiAgICAgICAgaWYgKHJvdXRpbmdUYXJnZXQgIT09IC0xICYmIHJvdXRpbmdUYXJnZXQgPD0gY3VycmVudEluZGV4IHx8IHJvdXRpbmdUYXJnZXQgPj0gY2FyZHMubGVuZ3RoKSB7CiAgICAgICAgICAvLyBpbnZhbGlkIHJvdXRpbmcgdGFyZ2V0LCBzaG9ydC1jaXJjdWl0IHdpdGggcmVtYWluaW5nIGNhcmQgY291bnQKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHY6IGNhcmRzLmxlbmd0aCAtIDEgLSBpbmRleAogICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIG1heFJlbWFpbmluZ0NhcmRzID0gTWF0aC5tYXgoY2FjaGVbcm91dGluZ1RhcmdldF0gKyAxLCBtYXhSZW1haW5pbmdDYXJkcyk7CiAgICAgIH0KCiAgICAgIHBvc3NpYmxlU2VsZWN0ZWRWYWx1ZXMgPSBuZXdQb3NzaWJsZVNlbGVjdGVkVmFsdWVzOwogICAgfTsKCiAgICBmb3IgKHZhciByb3V0aW5nT3B0aW9uSW5kZXggPSAwOyByb3V0aW5nT3B0aW9uSW5kZXggPCByb3V0aW5nT3B0aW9ucy5sZW5ndGg7IHJvdXRpbmdPcHRpb25JbmRleCsrKSB7CiAgICAgIHZhciBfcmV0ID0gX2xvb3Aocm91dGluZ09wdGlvbkluZGV4KTsKCiAgICAgIGlmIChfcmV0ID09PSAiYnJlYWsiKSBicmVhazsKICAgICAgaWYgKF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfdHlwZW9mX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCgpKF9yZXQpID09PSAib2JqZWN0IikgcmV0dXJuIF9yZXQudjsKICAgIH0KCiAgICBpZiAocG9zc2libGVTZWxlY3RlZFZhbHVlcy5sZW5ndGggPiAwIHx8IGNhcmQudHlwZSA9PT0gJ3ZpZGVvdm9pY2UnKSB7CiAgICAgIC8vIGl0J3MgcG9zc2libGUgdG8gbm90IG1hdGNoIGFueSBvZiB0aGUgcm91dGluZyB2YWx1ZXMgYW5kIGdvIHRvIHRoZSBuZXh0IHF1ZXN0aW9uCiAgICAgIC8vIChhbHdheXMgcG9zc2libGUgYnkgc2VsZWN0aW5nIFNraXAgb24gYSB2aWRlbyBxdWVzdGlvbikKICAgICAgbWF4UmVtYWluaW5nQ2FyZHMgPSBNYXRoLm1heChjYWNoZVtjdXJyZW50SW5kZXggKyAxXSArIDEsIG1heFJlbWFpbmluZ0NhcmRzKTsKICAgIH0KCiAgICBjYWNoZVtjdXJyZW50SW5kZXhdID0gbWF4UmVtYWluaW5nQ2FyZHM7CiAgfQoKICByZXR1cm4gY2FjaGVbaW5kZXhdOwp9OwoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy9jYXJkLmNzcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy9jYXJkLmNzcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKLy8gSW1wb3J0cwp2YXIgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyAqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIik7CmV4cG9ydHMgPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oZmFsc2UpOwovLyBNb2R1bGUKZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsICIudWwtY2FyZCB7XG4gIGZsZXg6IDEgMSBhdXRvO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGZvbnQtc2l6ZTogMTdweDtcbiAgbGluZS1oZWlnaHQ6IDE5cHg7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIG1hcmdpbjogYXV0bztcbn1cblxuLnVsLWNhcmRfX2NvbnRhaW5lci0tZGVza3RvcCB7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNmZmY7XG4gIGJveC1zaGFkb3c6IDBweCAwcHggMTVweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xufVxuXG4udWwtY2FyZF9fY29udGFpbmVyLS1tb2JpbGUge1xuICBib3JkZXItd2lkdGg6IDA7XG4gIGJveC1zaGFkb3c6IDBweCAwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIG1hcmdpbi10b3A6IDVweDtcbn1cblxuLnVsLWNhcmRfX2NvbnRhaW5lciB7XG4gIHBhZGRpbmc6IDIwcHggMjBweCA1cHggMjBweDtcbiAgZmxleDogMSAxIGF1dG87XG4gIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGZvbnQtc2l6ZTogMTdweDtcbiAgbGluZS1oZWlnaHQ6IDIzcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgZmxleC1ncm93OiAxO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi51bC1jYXJkLW1haW4tY29udGVudF9fbGluayB7XG4gIGZsZXgtZ3JvdzogNTU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIHBhZGRpbmctYm90dG9tOiAzNSU7XG59XG5cbi51bC1jYXJkLW1haW4tY29udGVudF9fd2ViIHtcbiAgcGFkZGluZy10b3A6IDE1cHg7XG59XG5cbi51bC1xdWVzdGlvbiB7XG4gIGZsZXg6IDEgMCBhdXRvO1xuICBjb2xvcjogIzM0MzQ0MjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgbGluZS1oZWlnaHQ6IDEyNSU7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLnVsLWNhcHRpb24ge1xuICBmbGV4OiAxIDAgYXV0bztcbiAgbWFyZ2luLXRvcDogOHB4O1xuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xuICBmb250LXNpemU6IDE1cHg7XG4gIGxpbmUtaGVpZ2h0OiAxMzAuMzUlO1xuICBsZXR0ZXItc3BhY2luZzogMC4wMmVtO1xuICBjb2xvcjogIzZjNmM2ZTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLnVsLWNhcmRfX2Nob2ljZXMge1xuICBtYXJnaW46IDVweCAwIDAgMDtcbiAgZmxleDogMSAwO1xuICBoZWlnaHQ6IDEwMCU7XG59XG5cbi5jaG9pY2UtLW1vYmlsZSB7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNlNmU2ZTY7XG59XG5cbi5jaG9pY2UtLWRlc2t0b3Age1xuICBib3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2O1xufVxuXG4uY2hvaWNlIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sb3I6ICMyNjIxMzY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcblxuICBtYXJnaW4tYm90dG9tOiA3cHg7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gIHBhZGRpbmc6IDEwcHggMjBweCAxMHB4IDE1cHg7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wMSk7XG59XG5cbi5jaG9pY2UtLWRlc2t0b3A6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDUpO1xufVxuXG4uY2hvaWNlLS1kZXNrdG9wOmFjdGl2ZSxcbi5jaG9pY2UtLW1vYmlsZTphY3RpdmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDUpO1xufVxuXG4udWwtdGhhbmtzLWNoZWNrIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG4udWwtY2FyZC0tdGhhbmtzLWNvbnRlbnQge1xuICBwYWRkaW5nOiAyMHB4IDAgMTBweCAwO1xufVxuXG4udWwtY2FyZC0tdGhhbmtzIC51bC1xdWVzdGlvbiB7XG4gIHBhZGRpbmctdG9wOiAwO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi51bC1jYXJkLS10aGFua3MgLnVsLWNhcHRpb24ge1xuICBwYWRkaW5nLXRvcDogMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xuICBoeXBoZW5zOiBhdXRvO1xuICBoeXBoZW5hdGUtbGltaXQtbGluZXM6IG5vLWxpbWl0O1xufVxuXG4uc2VsZWN0LWNoZWNrYm94IHtcbiAgaGVpZ2h0OiAxNnB4O1xuICB3aWR0aDogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjMzIzMjMyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3gtc2hhZG93OiBpbnNldCAzcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gIGJhY2tncm91bmQtY29sb3I6ICd0cmFuc3BhcmVudCc7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4uc2VsZWN0LXJhZGlvIHtcbiAgaGVpZ2h0OiAxNnB4O1xuICB3aWR0aDogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgYm9yZGVyOiAxcHggc29saWQgIzMyMzIzMjtcbiAgZGlzcGxheTogZmxleDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm94LXNoYWRvdzogaW5zZXQgMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAndHJhbnNwYXJlbnQnO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cblxuLmZhZGUtaW4tdHJhbnNpdGlvbiB7XG4gIGFuaW1hdGlvbjogZmFkZUluIDQwMG1zIGVhc2UtaW47XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBmYWRlSW4gNDAwbXMgZWFzZS1pbjtcbiAgLW1vei1hbmltYXRpb246IGZhZGVJbiA0MDBtcyBlYXNlLWluO1xuICAtby1hbmltYXRpb246IGZhZGVJbiA0MDBtcyBlYXNlLWluO1xuICAtbXMtYW5pbWF0aW9uOiBmYWRlSW4gNDAwbXMgZWFzZS1pbjtcbn1cblxuQGtleWZyYW1lcyBmYWRlSW4ge1xuICAwJSB7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxuICAxMDAlIHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG59XG5cbkAtbW96LWtleWZyYW1lcyBmYWRlSW4ge1xuICAwJSB7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxuICAxMDAlIHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG59XG5cbkAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW4ge1xuICAwJSB7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxuICAxMDAlIHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG59XG5cbkAtby1rZXlmcmFtZXMgZmFkZUluIHtcbiAgMCUge1xuICAgIG9wYWNpdHk6IDA7XG4gIH1cbiAgMTAwJSB7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxufVxuXG5ALW1zLWtleWZyYW1lcyBmYWRlSW4ge1xuICAwJSB7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxuICAxMDAlIHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG59XG4iLCAiIl0pOwovLyBFeHBvcnRzCm1vZHVsZS5leHBvcnRzID0gZXhwb3J0czsKCgovKioqLyB9KSwKCi8qKiovICIuL3NyYy92aWV3L3N0eWxlcy9pbmRleC5jc3MiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9zcmMvdmlldy9zdHlsZXMvaW5kZXguY3NzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIEltcG9ydHMKdmFyIF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMgKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIpOwp2YXIgX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8wX19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Jlc2V0LmNzcyAqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy9yZXNldC5jc3MiKTsKdmFyIF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfMV9fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9jYXJkLmNzcyAqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy9jYXJkLmNzcyIpOwp2YXIgX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8yX19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2xpa2VydC5jc3MgKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zcmMvdmlldy9zdHlsZXMvbGlrZXJ0LmNzcyIpOwp2YXIgX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8zX19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL211bHRpc2VsZWN0LmNzcyAqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy9tdWx0aXNlbGVjdC5jc3MiKTsKdmFyIF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfNF9fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9ucHMuY3NzICovICIuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3JjL3ZpZXcvc3R5bGVzL25wcy5jc3MiKTsKdmFyIF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfNV9fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90ZXh0LWNhcmQuY3NzICovICIuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3JjL3ZpZXcvc3R5bGVzL3RleHQtY2FyZC5jc3MiKTsKdmFyIF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfNl9fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90ZXh0LXVybC1wcm9tcHQuY3NzICovICIuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3JjL3ZpZXcvc3R5bGVzL3RleHQtdXJsLXByb21wdC5jc3MiKTsKdmFyIF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfN19fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi92b2ljZS12aWRlby5jc3MgKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zcmMvdmlldy9zdHlsZXMvdm9pY2UtdmlkZW8uY3NzIik7CmV4cG9ydHMgPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oZmFsc2UpOwpleHBvcnRzLmkoX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8wX19fKTsKZXhwb3J0cy5pKF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfMV9fXyk7CmV4cG9ydHMuaShfX19DU1NfTE9BREVSX0FUX1JVTEVfSU1QT1JUXzJfX18pOwpleHBvcnRzLmkoX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8zX19fKTsKZXhwb3J0cy5pKF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfNF9fXyk7CmV4cG9ydHMuaShfX19DU1NfTE9BREVSX0FUX1JVTEVfSU1QT1JUXzVfX18pOwpleHBvcnRzLmkoX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF82X19fKTsKZXhwb3J0cy5pKF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfN19fXyk7Ci8vIE1vZHVsZQpleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgImh0bWwsXG5ib2R5IHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBSb2JvdG8sIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYsICdBcHBsZSBDb2xvciBFbW9qaScsXG4gICAgJ1NlZ29lIFVJIEVtb2ppJywgJ1NlZ29lIFVJIFN5bWJvbCc7XG4gIGhlaWdodDogMTAwJTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lO1xufVxuXG5iIHtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cblxuI3VsLWFwcCB7XG4gIG9wYWNpdHk6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBmbGV4LWdyb3c6IDI7XG4gIGRpc3BsYXk6IGZsZXg7XG59XG5cbiN1bC1hcHAudWwtYXBwLS1vdmVybGF5IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDA7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xcyBlYXNlLW91dDtcbn1cblxuI3VsLWFwcC51bC1hcHAtLXZpc2libGUge1xuICBvcGFjaXR5OiAxO1xuICBib3R0b206IDA7XG59XG5cbi51bC1hcHBfX2NvbnRhaW5lciB7XG4gIHdpZHRoOiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1heC1oZWlnaHQ6IDEwMHZoO1xufVxuXG4udWwtZm9vdGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIG1hcmdpbi10b3A6IGF1dG87XG4gIGZsZXgtZ3JvdzogMTtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi51bC1mb290ZXItYnViYmxlIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW46IDAgM3B4O1xuICB3aWR0aDogN3B4O1xuICBoZWlnaHQ6IDdweDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbn1cblxuLmNsb3NlLWNvbnRhaW5lci0tZGVza3RvcCxcbi5jbG9zZS1jb250YWluZXItLW1vYmlsZSB7XG4gIGhlaWdodDogMjJweDtcbiAgd2lkdGg6IDIycHg7XG4gIGJvcmRlci1yYWRpdXM6IDIycHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4uY2xvc2UtY29udGFpbmVyLS1kZXNrdG9wIHtcbiAgdG9wOiAyNXB4O1xuICByaWdodDogMjVweDtcbn1cblxuLmNsb3NlLWNvbnRhaW5lci0tbW9iaWxlIHtcbiAgdG9wOiAxNXB4O1xuICByaWdodDogMTBweDtcbn1cblxuLmNsb3NlLWNvbnRhaW5lciB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cblxuLmNsb3NlLWJ0biB7XG4gIGhlaWdodDogMThweDtcbiAgd2lkdGg6IDE4cHg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi51bC1hcHBfX2NvbnRhaW5lciB7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcyBlYXNlLW91dDtcbn1cblxuI3VsLXByb2dyZXNzLWJhci1jb250YWluZXIge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAycHg7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xuICBtYXgtd2lkdGg6IDI1MHB4O1xuICBtYXJnaW46IDI1cHggMDtcbn1cblxuI3VsLXByb2dyZXNzLWJhci1jdXJyZW50IHtcbiAgd2lkdGg6IDBweDtcbiAgaGVpZ2h0OiAwO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG59XG4iLCAiIl0pOwovLyBFeHBvcnRzCm1vZHVsZS5leHBvcnRzID0gZXhwb3J0czsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3JjL3ZpZXcvc3R5bGVzL2xpa2VydC5jc3MiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy9saWtlcnQuY3NzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIEltcG9ydHMKdmFyIF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMgKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIpOwpleHBvcnRzID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKGZhbHNlKTsKLy8gTW9kdWxlCmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCAiLyogaWRlbnRpY2FsIHRvIG5wcy5jc3MsIG90aGVyIHRoYW4gY2xhc3MgbmFtZXMuICovXG4udWwtY2FyZC0tbGlrZXJ0X19udW1iZXJzIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBmbGV4OiAxIDA7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBtYXJnaW46IDVweCAwIDAgMDtcbn1cblxuLmxpa2VydC1udW1iZXItLW1vYmlsZSB7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNlNmU2ZTY7XG4gIG1hcmdpbi1sZWZ0OiAtMnB4O1xufVxuXG4ubGlrZXJ0LW51bWJlci0tZGVza3RvcCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNlNmU2ZTY7XG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xufVxuXG4ubGlrZXJ0LW51bWJlciB7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGZsZXg6IDEgMDtcblxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDEpO1xuICBmb250LXNpemU6IDE4cHg7XG4gIGxpbmUtaGVpZ2h0OiAyNHB4O1xuICBoZWlnaHQ6IDY3cHg7XG59XG5cbi5saWtlcnQtbnVtYmVyOmFjdGl2ZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5saWtlcnQtbnVtYmVyLS1kZXNrdG9wOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cblxuLmxpa2VydC1udW1iZXItMSB7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDVweDtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNXB4O1xufVxuXG4ubGlrZXJ0LW51bWJlci01IHtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDVweDtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDVweDtcbn1cblxuLnVsLWNhcmQtLWxpa2VydF9fbGFiZWxzIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sb3I6ICMyNjIxMzY7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGZsZXg6IDEgMDtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMTVweDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBtYXJnaW46IDdweCAwIDEwcHggMDtcbn1cblxuLnVsLWNhcmQtLWxpa2VydF9fbGFiZWxzIHNwYW46bGFzdC1jaGlsZCB7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xufVxuIiwgIiJdKTsKLy8gRXhwb3J0cwptb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHM7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy9tdWx0aXNlbGVjdC5jc3MiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3JjL3ZpZXcvc3R5bGVzL211bHRpc2VsZWN0LmNzcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIEltcG9ydHMKdmFyIF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMgKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIpOwpleHBvcnRzID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKGZhbHNlKTsKLy8gTW9kdWxlCmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCAiLnNlbGVjdC1sYWJlbCB7XG4gIGZsZXg6IDE7XG4gIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmctbGVmdDogMTVweDtcbn1cbiIsICIiXSk7Ci8vIEV4cG9ydHMKbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zcmMvdmlldy9zdHlsZXMvbnBzLmNzcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3JjL3ZpZXcvc3R5bGVzL25wcy5jc3MgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKLy8gSW1wb3J0cwp2YXIgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyAqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIik7CmV4cG9ydHMgPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oZmFsc2UpOwovLyBNb2R1bGUKZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsICIvKiBpZGVudGljYWwgdG8gbGlrZXJ0LmNzcywgb3RoZXIgdGhhbiBjbGFzcyBuYW1lcy4gKi9cbi51bC1jYXJkLS1ucHNfX251bWJlcnMge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBib3JkZXItcmFkaXVzOiA1cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGZsZXg6IDEgMDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIG1hcmdpbjogNXB4IDAgMCAwO1xufVxuXG4ubnBzLW51bWJlci0tbW9iaWxlIHtcbiAgYm9yZGVyOiAycHggc29saWQgI2U2ZTZlNjtcbiAgbWFyZ2luLWxlZnQ6IC0ycHg7XG59XG5cbi5ucHMtbnVtYmVyLS1kZXNrdG9wIHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTZlNjtcbiAgbWFyZ2luLWxlZnQ6IC0xcHg7XG59XG5cbi5ucHMtbnVtYmVyIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgZmxleDogMSAwO1xuXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wMSk7XG4gIGZvbnQtc2l6ZTogMThweDtcbiAgbGluZS1oZWlnaHQ6IDI0cHg7XG4gIGhlaWdodDogNjdweDtcbn1cblxuLm5wcy1udW1iZXI6YWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cblxuLm5wcy1udW1iZXItLWRlc2t0b3A6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDUpO1xuICBmb250LXdlaWdodDogNTAwO1xufVxuXG4ubnBzLW51bWJlci0wIHtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNXB4O1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA1cHg7XG59XG5cbi5ucHMtbnVtYmVyLTEwIHtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDVweDtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDVweDtcbn1cblxuLnVsLWNhcmQtLW5wc19fbGFiZWxzIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sb3I6ICMyNjIxMzY7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGZsZXg6IDEgMDtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMTVweDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBtYXJnaW46IDdweCAwIDEwcHggMDtcbn1cblxuLnVsLWNhcmQtLW5wc19fbGFiZWxzIHNwYW46bGFzdC1jaGlsZCB7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xufVxuIiwgIiJdKTsKLy8gRXhwb3J0cwptb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHM7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy9yZXNldC5jc3MiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3JjL3ZpZXcvc3R5bGVzL3Jlc2V0LmNzcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIEltcG9ydHMKdmFyIF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMgKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIpOwpleHBvcnRzID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKGZhbHNlKTsKLy8gTW9kdWxlCmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCAiLyoqXG4gKiBtaW5pcmVzZXQuY3NzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vamd0aG1zL21pbmlyZXNldC5jc3NcbiAqL1xuXG5odG1sLFxuYm9keSxcbnAsXG5vbCxcbnVsLFxubGksXG5kbCxcbmR0LFxuZGQsXG5ibG9ja3F1b3RlLFxuZmlndXJlLFxuZmllbGRzZXQsXG5sZWdlbmQsXG50ZXh0YXJlYSxcbnByZSxcbmlmcmFtZSxcbmhyLFxuaDEsXG5oMixcbmgzLFxuaDQsXG5oNSxcbmg2IHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG5oMSxcbmgyLFxuaDMsXG5oNCxcbmg1LFxuaDYge1xuICBmb250LXNpemU6IDEwMCU7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG59XG5cbnVsIHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbn1cblxuYnV0dG9uLFxuaW5wdXQsXG5zZWxlY3QsXG50ZXh0YXJlYSB7XG4gIG1hcmdpbjogMDtcbn1cblxuaHRtbCB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbiosICo6YmVmb3JlLCAqOmFmdGVyIHtcbiAgYm94LXNpemluZzogaW5oZXJpdDtcbn1cbiIsICIiXSk7Ci8vIEV4cG9ydHMKbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zcmMvdmlldy9zdHlsZXMvdGV4dC1jYXJkLmNzcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3JjL3ZpZXcvc3R5bGVzL3RleHQtY2FyZC5jc3MgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKLy8gSW1wb3J0cwp2YXIgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyAqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIik7CmV4cG9ydHMgPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oZmFsc2UpOwovLyBNb2R1bGUKZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsICIudWwtY2FyZC10ZXh0IHtcbiAgZmxleDogMSAwIGF1dG87XG4gIG1hcmdpbi10b3A6IDJweDtcbiAgbWFyZ2luLWJvdHRvbTogM3B4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBwYWRkaW5nOiAwO1xufVxuXG4udWwtY2FyZC10ZXh0X19jb250YWluZXIge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuICBmbGV4OiAxIDAgMTAwJTtcbn1cblxuLnVsLWNhcmQtdGV4dF9faW5wdXQtLW1vYmlsZSB7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNlNmU2ZTY7XG4gIG1heC1oZWlnaHQ6IDYzcHg7XG59XG5cbi51bC1jYXJkLXRleHRfX2lucHV0LS1kZXNrdG9wIHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTZlNjtcbiAgbWF4LWhlaWdodDogMTUwcHg7XG59XG5cbi51bC1jYXJkLXRleHRfX2lucHV0IHtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjAxKTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgY29sb3I6ICMzNDM0NDI7XG4gIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiwgJ0FwcGxlIENvbG9yIEVtb2ppJyxcbiAgICAnU2Vnb2UgVUkgRW1vamknLCAnU2Vnb2UgVUkgU3ltYm9sJztcbiAgbWluLWhlaWdodDogNjNweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcGFkZGluZzogMTJweDtcbiAgcmVzaXplOiBub25lO1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBmb250LXNpemU6IDE1cHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xufVxuXG4udWwtY2FyZC10ZXh0X19pbnB1dDo6cGxhY2Vob2xkZXIge1xuICBjb2xvcjogcmdiYSgxMDgsIDEwOCwgMTEwLCAwLjUpO1xufVxuXG4udWwtY2FyZC10ZXh0X19pbnB1dDpmb2N1cyB7XG4gIG91dGxpbmU6IG5vbmU7XG4gIGJhY2tncm91bmQ6IHdoaXRlO1xufVxuXG4udWwtY2FyZC10ZXh0X19idXR0b24ge1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGNvbG9yOiB3aGl0ZTtcbiAgZm9udC1zaXplOiAxNXB4O1xuICBsaW5lLWhlaWdodDogMThweDtcbiAgcGFkZGluZzogMTAuNXB4IDIxcHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGJvcmRlcjogbm9uZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuIiwgIiJdKTsKLy8gRXhwb3J0cwptb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHM7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy90ZXh0LXVybC1wcm9tcHQuY3NzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zcmMvdmlldy9zdHlsZXMvdGV4dC11cmwtcHJvbXB0LmNzcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyBJbXBvcnRzCnZhciBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzICovICIuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiKTsKZXhwb3J0cyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhmYWxzZSk7Ci8vIE1vZHVsZQpleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgIi51bC1jYXJkX190ZXh0LXVybC1ib2R5LWNvbnRhaW5lcixcbi51bC1jYXJkX190ZXh0LXVybC1wcm9tcHQtYm9keSB7XG4gIG1hcmdpbi10b3A6IDEwcHg7XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG59XG5cbi51bC1jYXJkX190ZXh0LXVybC1wcm9tcHQtYm9keSB7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgbGluZS1oZWlnaHQ6IDEzMC4zNSU7XG4gIGxldHRlci1zcGFjaW5nOiAwLjAyZW07XG4gIGNvbG9yOiAjMzQzNDQyO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICB3aGl0ZS1zcGFjZTogcHJlLWxpbmU7XG59XG5cbi51bC1jYXJkX190ZXh0LXVybC1wcm9tcHQtYm9keTpsYXN0LWNoaWxkIHtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cblxuLnVsLWNhcmRfX3RleHQtdXJsLXByb21wdC1idXR0b24ge1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBtYXgtd2lkdGg6IDEwMCU7XG59XG5cbi51bC1jYXJkX190ZXh0LXVybC1ib2R5LWNvbnRhaW5lciB7XG4gIG1pbi1oZWlnaHQ6IDJlbTtcbn1cbiIsICIiXSk7Ci8vIEV4cG9ydHMKbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zcmMvdmlldy9zdHlsZXMvdm9pY2UtdmlkZW8uY3NzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy92aWV3L3N0eWxlcy92b2ljZS12aWRlby5jc3MgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyBJbXBvcnRzCnZhciBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzICovICIuL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiKTsKZXhwb3J0cyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhmYWxzZSk7Ci8vIE1vZHVsZQpleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgIi51bC1jYXJkLS12aWRlbyB7XG4gIG1hcmdpbi10b3A6IDE1cHg7XG59XG5cbiN1bC1jYXJkLXZvaWNlX192aWRlbyB7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XG4udWwtY2FyZC10ZXh0X19idXR0b24udWwtYnV0dG9uLWluYWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcbiAgY29sb3I6ICM1ZDY5NmYgIWltcG9ydGFudDtcbn1cblxuI3VsLWNhcmQtdmlkZW9fX3BsYXllcl9yZWNvcmRlciB7XG4gIHdpZHRoOiAxMDAlO1xuICB3aWR0aDogLW1vei1hdmFpbGFibGU7IC8qIFdlYktpdC1iYXNlZCBicm93c2VycyB3aWxsIGlnbm9yZSB0aGlzLiAqL1xuICB3aWR0aDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZTsgLyogTW96aWxsYS1iYXNlZCBicm93c2VycyB3aWxsIGlnbm9yZSB0aGlzLiAqL1xuICB3aWR0aDogZmlsbC1hdmFpbGFibGU7XG59XG4iLCAiIl0pOwovLyBFeHBvcnRzCm1vZHVsZS5leHBvcnRzID0gZXhwb3J0czsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5V2l0aG91dEhvbGVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5V2l0aG91dEhvbGVzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7CgpmdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7CiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgewogICAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKICAgICAgYXJyMltpXSA9IGFycltpXTsKICAgIH0KCiAgICByZXR1cm4gYXJyMjsKICB9Cn0KCm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aG91dEhvbGVzOwoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7CgpmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7CiAgdHJ5IHsKICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsKICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIHJlamVjdChlcnJvcik7CiAgICByZXR1cm47CiAgfQoKICBpZiAoaW5mby5kb25lKSB7CiAgICByZXNvbHZlKHZhbHVlKTsKICB9IGVsc2UgewogICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOwogIH0KfQoKZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHsKICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgdmFyIHNlbGYgPSB0aGlzLAogICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7CgogICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkgewogICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgIm5leHQiLCB2YWx1ZSk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsKICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJ0aHJvdyIsIGVycik7CiAgICAgIH0KCiAgICAgIF9uZXh0KHVuZGVmaW5lZCk7CiAgICB9KTsKICB9Owp9Cgptb2R1bGUuZXhwb3J0cyA9IF9hc3luY1RvR2VuZXJhdG9yOwoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsKICB9Cn0KCm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrOwoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgewogIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07CiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7CiAgICBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsKICB9Cn0KCmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsKICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7CiAgcmV0dXJuIENvbnN0cnVjdG9yOwp9Cgptb2R1bGUuZXhwb3J0cyA9IF9jcmVhdGVDbGFzczsKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsKICBpZiAoa2V5IGluIG9iaikgewogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7CiAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICB3cml0YWJsZTogdHJ1ZQogICAgfSk7CiAgfSBlbHNlIHsKICAgIG9ialtrZXldID0gdmFsdWU7CiAgfQoKICByZXR1cm4gb2JqOwp9Cgptb2R1bGUuZXhwb3J0cyA9IF9kZWZpbmVQcm9wZXJ0eTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKZnVuY3Rpb24gX2V4dGVuZHMoKSB7CiAgbW9kdWxlLmV4cG9ydHMgPSBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgewogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsKCiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsKICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgewogICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdGFyZ2V0OwogIH07CgogIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwp9Cgptb2R1bGUuZXhwb3J0cyA9IF9leHRlbmRzOwoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgewogIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gIltvYmplY3QgQXJndW1lbnRzXSIpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOwp9Cgptb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXk7CgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlU3ByZWFkLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlU3ByZWFkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7CgpmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7CiAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UiKTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBfbm9uSXRlcmFibGVTcHJlYWQ7CgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBhcnJheVdpdGhvdXRIb2xlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vYXJyYXlXaXRob3V0SG9sZXMgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRob3V0SG9sZXMuanMiKTsKCnZhciBpdGVyYWJsZVRvQXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2l0ZXJhYmxlVG9BcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXkuanMiKTsKCnZhciBub25JdGVyYWJsZVNwcmVhZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vbm9uSXRlcmFibGVTcHJlYWQgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvbm9uSXRlcmFibGVTcHJlYWQuanMiKTsKCmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsKICByZXR1cm4gYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpOwp9Cgptb2R1bGUuZXhwb3J0cyA9IF90b0NvbnN1bWFibGVBcnJheTsKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7CgpmdW5jdGlvbiBfdHlwZW9mKG9iaikgewogIGlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiKSB7CiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgewogICAgICByZXR1cm4gdHlwZW9mIG9iajsKICAgIH07CiAgfSBlbHNlIHsKICAgIG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7CiAgICB9OwogIH0KCiAgcmV0dXJuIF90eXBlb2Yob2JqKTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mOwoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISByZWdlbmVyYXRvci1ydW50aW1lICovICIuL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9AdXNlcmxlYXAvdmlkZW8tcGxheWVyLXJlY29yZGVyL3ZpZGVvUGxheWVyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9AdXNlcmxlYXAvdmlkZW8tcGxheWVyLXJlY29yZGVyL3ZpZGVvUGxheWVyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwovKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgewovKiBoYXJtb255IGV4cG9ydCAqLyAgICJISURERU5fQ0xBU1MiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gSElEREVOX0NMQVNTOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJWSVNJQkxFX0NMQVNTIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIFZJU0lCTEVfQ0xBU1M7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgInZpZGVvUGxheWVyIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIHZpZGVvUGxheWVyOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJ2aWRlb1JlY29yZGVyUGxheWVyIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIHZpZGVvUmVjb3JkZXJQbGF5ZXI7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgInZpZGVvUGxheWVyUmVjb3JkZXJDb21ibyI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyB2aWRlb1BsYXllclJlY29yZGVyQ29tYm87IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgImRlc3Ryb3lQbGF5ZXIiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gZGVzdHJveVBsYXllcjsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAic3RvcFJlY29yZGluZyI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBzdG9wUmVjb3JkaW5nOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJyZXNldFBsYXllclNvdXJjZSI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyByZXNldFBsYXllclNvdXJjZTsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAicGF1c2VRdWVzdGlvblBsYXllciI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBwYXVzZVF1ZXN0aW9uUGxheWVyOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJyZWZyZXNoUGxheWVyUmVjb3JkZXJDb21ibyI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyByZWZyZXNoUGxheWVyUmVjb3JkZXJDb21ibzsgfSwKLyogaGFybW9ueSBleHBvcnQgKi8gICAiUkVDT1JERVIiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gUkVDT1JERVI7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7Ci8vIFRvIHRlc3Qgc3RhZ2luZyBDRE4sIHRlbXBvcmFyaWx5IHVwZGF0ZSB0aGlzIGxpbmsgdG8gJ2h0dHBzOi8vY2RuLXN0YWdpbmcuc3ByaWcuY29tJwpjb25zdCBDRE5fTElOSyA9ICdodHRwczovL2Nkbi5zcHJpZy5jb20nOwoKY29uc3QgdmlkZW9QbGF5ZXJDc3MgPSBgLyogcHJvZ3Jlc3MgY29udHJvbCBzdHlsZXMgKi8KLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtY29udHJvbCAudmpzLXByb2dyZXNzLWhvbGRlciB7CiAgbWFyZ2luOiAwIDBweDsKfQoKLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtY29udHJvbCB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGhlaWdodDogM3B4OwogIHdpZHRoOiAxMDAlOwp9Ci8qIHBvc2l0aW9uIGFuZCBhbGlnbiB0aGUgYnV0dG9ucyBhbmQgYnV0dG9uIHRleHRzICovCi51bC1jb250cm9sLXBhbmVsIHsKICBib3R0b206IDA7CiAgd2lkdGg6IDEwMCU7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICBoZWlnaHQ6IGZpdC1jb250ZW50OwogIHotaW5kZXg6IDI7CiAgYmFja2dyb3VuZC1jb2xvcjogI0Y4RjhGODsKfQoKLnVsLWJ1dHRvbnMtcGFuZWwgewogIGRpc3BsYXk6IGZsZXg7CiAgY29sb3I6IGJsYWNrOwogIGhlaWdodDogNTBweDsKICBwYWRkaW5nOiAycHggMTRweCAwOwp9CgoudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgewogIGhlaWdodDogMzBweDsKICB3aWR0aDogNDBweDsKfQoKLnVsLWJ1dHRvbnMtcGFuZWwgPiAudmpzLWJ1dHRvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTsKICBib3JkZXItcmFkaXVzOiA1MCU7CiAgaGVpZ2h0OiAzZW07CiAgd2lkdGg6IDNlbTsKICBtYXJnaW46IDAgMTBweDsKfQoKc3Bhbi51bC1idXR0b24tdGV4dCB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgMjVweCk7CiAgLW1vei10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxcHgsIDI1cHgpOwp9CgojdWwtY2FtZXJhLWJ1dHRvbiB7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLnVsLWluYWN0aXZlIHsKICBvcGFjaXR5OiAwLjM7CiAgY3Vyc29yOiBkZWZhdWx0OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoudmlkZW8tanMgLnZqcy12b2x1bWUtY29udHJvbC52anMtdm9sdW1lLWhvcml6b250YWwgewogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgei1pbmRleDogMTsKfQoKLnZqcy12b2x1bWUtYmFyLnZqcy1zbGlkZXItaG9yaXpvbnRhbCAudmpzLXZvbHVtZS1sZXZlbCB7CiAgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7Cn0KCi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbC52anMtdm9sdW1lLXBhbmVsLWhvcml6b250YWwudmpzLWhvdmVyLAoudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwudmpzLXZvbHVtZS1wYW5lbC1ob3Jpem9udGFsLnZqcy1zbGlkZXItYWN0aXZlLAoudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwudmpzLXZvbHVtZS1wYW5lbC1ob3Jpem9udGFsOmFjdGl2ZSB7CiAgd2lkdGg6IDQwcHg7Cn0KCi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbCAudmpzLXZvbHVtZS1jb250cm9sLnZqcy1zbGlkZXItYWN0aXZlLAoudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwgLnZqcy12b2x1bWUtY29udHJvbDphY3RpdmUsCi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbC52anMtaG92ZXIgLnZqcy1tdXRlLWNvbnRyb2wgfiAudmpzLXZvbHVtZS1jb250cm9sLAoudmlkZW8tanMgLnZqcy12b2x1bWUtcGFuZWwudmpzLWhvdmVyIC52anMtdm9sdW1lLWNvbnRyb2wsCi52aWRlby1qcyAudmpzLXZvbHVtZS1wYW5lbDphY3RpdmUgLnZqcy12b2x1bWUtY29udHJvbCwKLnZpZGVvLWpzIC52anMtdm9sdW1lLXBhbmVsOmZvY3VzIC52anMtdm9sdW1lLWNvbnRyb2wgewogIHZpc2liaWxpdHk6IHZpc2libGU7CiAgbGVmdDogNDBweDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjFzLCBvcGFjaXR5IDAuMXMsIGhlaWdodCAwLjFzLCB3aWR0aCAwLjFzLCBsZWZ0IDBzLCB0b3AgMHM7Cn0KCi8qIHBsYXkgYnV0dG9uIGN1c3RvbWl6YXRpb24gKi8KLnZpZGVvLWpzIC52anMtcGxheS1jb250cm9sIHsKICBjb2xvcjogYmxhY2s7Cn0KCi52aWRlby1qcyAudmpzLXBsYXktY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHsKICBjb250ZW50OiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzEyJyBoZWlnaHQ9JzEyJyB2aWV3Qm94PScwIDAgMTIgMTInIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGQ9J00xMC41MzYzIDYuNDAyMjZMMS45Mzk1OCAxMC43MDA2QzEuNjQwMzcgMTAuODUwMiAxLjI4ODMzIDEwLjYzMjYgMS4yODgzMyAxMC4yOTgxVjEuNzAxNEMxLjI4ODMzIDEuMzY2ODggMS42NDAzNyAxLjE0OTMxIDEuOTM5NTggMS4yOTg5MUwxMC41MzYzIDUuNTk3MjdDMTAuODY4IDUuNzYzMTEgMTAuODY4IDYuMjM2NDIgMTAuNTM2MyA2LjQwMjI2Wicgc3Ryb2tlPSdibGFjaycgc3Ryb2tlLXdpZHRoPScxLjUnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcvJTNFJTNDL3N2ZyUzRSIpOwp9CgovKiBwb3NpdGlvbiBhbmQgc3R5bGUgdGhlIGN1cnJlbnQgdGltZXIgKi8KLnVsLXRpbWUtcGFuZWwgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBib3R0b206IDgwcHg7CiAgbGVmdDogMTBweDsKICBoZWlnaHQ6IDIycHg7CiAgY29sb3I6IGJsYWNrOwogIGJvcmRlcjogMXB4IHNvbGlkICNlMGUwZWI7CiAgYm9yZGVyLXJhZGl1czogMjNweDsKICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICB3aWR0aDogZml0LWNvbnRlbnQ7Cn0KCi52aWRlby1qcyAudmpzLWN1cnJlbnQtdGltZSwKLnZqcy1uby1mbGV4IC52anMtY3VycmVudC10aW1lIHsKICBkaXNwbGF5OiBmbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgovKiByZW1vdmUgdGhlIGRvdCBwcm9ncmVzcyBpbmRpY2F0b3IgKi8KLnZpZGVvLWpzIC52anMtcGxheS1wcm9ncmVzczpiZWZvcmUsCi52aWRlby1qcyAudmpzLXZvbHVtZS1sZXZlbDpiZWZvcmUsCi52anMtaWNvbi1jaXJjbGU6YmVmb3JlLAoudmpzLXNlZWstdG8tbGl2ZS1jb250cm9sIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUgewogIGNvbnRlbnQ6IG5vbmU7Cn0KCi52aWRlby1qcyAudmpzLW11dGUtY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHsKICBjb250ZW50OiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzE5JyBoZWlnaHQ9JzE0JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGNsaXAtcnVsZT0nZXZlbm9kZCcgZD0nTTguODI1LjMyNEEuNzUuNzUgMCAwMTkuMjUgMXYxMS42NjdhLjc1Ljc1IDAgMDEtMS4yMTkuNTg1bC0zLjk2LTMuMTY5SDFhLjc1Ljc1IDAgMDEtLjc1LS43NXYtNWEuNzUuNzUgMCAwMS43NS0uNzVoMy4wN0w4LjAzMS40MTRhLjc1Ljc1IDAgMDEuNzk0LS4wOXpNNy43NSAyLjU2TDQuODAyIDQuOTJhLjc1Ljc1IDAgMDEtLjQ2OS4xNjRIMS43NXYzLjVoMi41ODNhLjc1Ljc1IDAgMDEuNDY5LjE2NWwyLjk0OCAyLjM1OFYyLjU2ek0xNC45MTEuNDdhLjc1Ljc1IDAgMDExLjA2MSAwIDkuMDg0IDkuMDg0IDAgMDEwIDEyLjg0NC43NS43NSAwIDAxLTEuMDYtMS4wNiA3LjU4NCA3LjU4NCAwIDAwMC0xMC43MjQuNzUuNzUgMCAwMTAtMS4wNnpNMTEuOTcgMy40MWEuNzUuNzUgMCAwMTEuMDYgMCA0LjkxNyA0LjkxNyAwIDAxMCA2Ljk1My43NS43NSAwIDExLTEuMDYtMS4wNiAzLjQxNyAzLjQxNyAwIDAwMC00LjgzMi43NS43NSAwIDAxMC0xLjA2eicgZmlsbD0nJTIzMjYyMTM2Jy8lM0UlM0Mvc3ZnJTNFIik7Cn0KCi52aWRlby1qcyAudmpzLW11dGUtY29udHJvbC52anMtdm9sLTAgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7CiAgY29udGVudDogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScxOScgaGVpZ2h0PScxNCcgZmlsbD0nbm9uZScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZD0nTTguNSAxLjE2N0w0LjMzMyA0LjVIMXY1aDMuMzMzTDguNSAxMi44MzNWMS4xNjd6TTE3LjE3IDQuNWwtNSA1TTEyLjE3IDQuNWw1IDUnIHN0cm9rZT0nJTIzMjYyMTM2JyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFIik7Cn0KCi52aWRlby1qcyAudmpzLW11dGUtY29udHJvbC52anMtdm9sLTEgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7CiAgY29udGVudDogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScxOScgaGVpZ2h0PScxNCcgdmlld0JveD0nMCAwIDE5IDE0JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGNsaXAtcnVsZT0nZXZlbm9kZCcgZD0nTTguODI0ODkgMC4zMjQwM0M5LjA4NDc0IDAuNDQ4OTIgOS4yNSAwLjcxMTcwMyA5LjI1IDEuMDAwMDFWMTIuNjY2N0M5LjI1IDEyLjk1NSA5LjA4NDc0IDEzLjIxNzggOC44MjQ4OSAxMy4zNDI3QzguNTY1MDQgMTMuNDY3NSA4LjI1NjYxIDEzLjQzMjQgOC4wMzE0OCAxMy4yNTIzTDQuMDcwMjUgMTAuMDgzM0gxQzAuNTg1Nzg2IDEwLjA4MzMgMC4yNSA5Ljc0NzU1IDAuMjUgOS4zMzMzNFY0LjMzMzM0QzAuMjUgMy45MTkxMyAwLjU4NTc4NiAzLjU4MzM0IDEgMy41ODMzNEg0LjA3MDI1TDguMDMxNDggMC40MTQzNTVDOC4yNTY2MSAwLjIzNDI1MyA4LjU2NTA0IDAuMTk5MTQgOC44MjQ4OSAwLjMyNDAzWk03Ljc1IDIuNTYwNDhMNC44MDE4NSA0LjkxODk5QzQuNjY4ODcgNS4wMjUzOCA0LjUwMzY0IDUuMDgzMzQgNC4zMzMzMyA1LjA4MzM0SDEuNzVWOC41ODMzNEg0LjMzMzMzQzQuNTAzNjQgOC41ODMzNCA0LjY2ODg3IDguNjQxMyA0LjgwMTg1IDguNzQ3NjlMNy43NSAxMS4xMDYyVjIuNTYwNDhaJyBmaWxsPSclMjMyNjIxMzYnLyUzRSUzQy9zdmclM0UlMEEiKTsKfQoKLnZpZGVvLWpzIC52anMtbXV0ZS1jb250cm9sLnZqcy12b2wtMiAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHsKICBjb250ZW50OiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzE5JyBoZWlnaHQ9JzE0JyB2aWV3Qm94PScwIDAgMTkgMTQnIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGwtcnVsZT0nZXZlbm9kZCcgY2xpcC1ydWxlPSdldmVub2RkJyBkPSdNOC44MjQ4OSAwLjMyNDAzQzkuMDg0NzQgMC40NDg5MiA5LjI1IDAuNzExNzAzIDkuMjUgMS4wMDAwMVYxMi42NjY3QzkuMjUgMTIuOTU1IDkuMDg0NzQgMTMuMjE3OCA4LjgyNDg5IDEzLjM0MjdDOC41NjUwNCAxMy40Njc1IDguMjU2NjEgMTMuNDMyNCA4LjAzMTQ4IDEzLjI1MjNMNC4wNzAyNSAxMC4wODMzSDFDMC41ODU3ODYgMTAuMDgzMyAwLjI1IDkuNzQ3NTUgMC4yNSA5LjMzMzM0VjQuMzMzMzRDMC4yNSAzLjkxOTEzIDAuNTg1Nzg2IDMuNTgzMzQgMSAzLjU4MzM0SDQuMDcwMjVMOC4wMzE0OCAwLjQxNDM1NUM4LjI1NjYxIDAuMjM0MjUzIDguNTY1MDQgMC4xOTkxNCA4LjgyNDg5IDAuMzI0MDNaTTcuNzUgMi41NjA0OEw0LjgwMTg1IDQuOTE4OTlDNC42Njg4NyA1LjAyNTM4IDQuNTAzNjQgNS4wODMzNCA0LjMzMzMzIDUuMDgzMzRIMS43NVY4LjU4MzM0SDQuMzMzMzNDNC41MDM2NCA4LjU4MzM0IDQuNjY4ODcgOC42NDEzIDQuODAxODUgOC43NDc2OUw3Ljc1IDExLjEwNjJWMi41NjA0OFonIGZpbGw9JyUyMzI2MjEzNicvJTNFJTNDcGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGNsaXAtcnVsZT0nZXZlbm9kZCcgZD0nTTExLjk2OTggMy40MTEyNEMxMi4yNjI3IDMuMTE4MzkgMTIuNzM3NiAzLjExODQ2IDEzLjAzMDQgMy40MTE0QzEzLjk1MjEgNC4zMzM0MSAxNC40Njk5IDUuNTgzNzYgMTQuNDY5OSA2Ljg4NzQ4QzE0LjQ2OTkgOC4xOTEyMSAxMy45NTIxIDkuNDQxNTYgMTMuMDMwNCAxMC4zNjM2QzEyLjczNzYgMTAuNjU2NSAxMi4yNjI3IDEwLjY1NjYgMTEuOTY5OCAxMC4zNjM3QzExLjY3NjggMTAuMDcwOSAxMS42NzY3IDkuNTk2IDExLjk2OTYgOS4zMDMwN0MxMi42MTAxIDguNjYyMzUgMTIuOTY5OSA3Ljc5MzQ2IDEyLjk2OTkgNi44ODc0OEMxMi45Njk5IDUuOTgxNTEgMTIuNjEwMSA1LjExMjYyIDExLjk2OTYgNC40NzE5QzExLjY3NjcgNC4xNzg5NiAxMS42NzY4IDMuNzA0MDkgMTEuOTY5OCAzLjQxMTI0WicgZmlsbD0nJTIzMjYyMTM2Jy8lM0UlM0Mvc3ZnJTNFJTBBIik7Cn0KCi52aWRlby1qcyAudmpzLXZvbHVtZS1jb250cm9sOmhvdmVyIC52anMtbW91c2UtZGlzcGxheSB7CiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9CgoudmlkZW8tanMgLnZqcy1wbGF5LXByb2dyZXNzIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsKfQoKLyogcG9zaXRpb24gdmlkZW8gcGxheWVyIGluc2lkZSB0aGUgY29udGFpbmVyICovCi52aWRlby1qcyAudmpzLXRlY2ggewogIHBvc2l0aW9uOiBzdGF0aWM7Cn0KCi52aWRlby1qcyAudmpzLXRpbWUtdG9vbHRpcCB7CiAgcGFkZGluZzogMC4yNWVtIDAuNzVlbTsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGNvbG9yOiAjMzMzOwogIGJhY2tncm91bmQ6ICNGQ0ZDRkQ7CiAgYm9yZGVyLXJhZGl1czogOTlweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgYm9yZGVyOiAxcHggc29saWQgI0UwRTBFQjsKICBkaXNwbGF5OiBmbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgdG9wOiAtMjVweDsKICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDsKICB3aWR0aDogNTBweCAhaW1wb3J0YW50Owp9CgoudmlkZW8tanMgLnZqcy1wbGF5LXByb2dyZXNzLnZqcy1zbGlkZXItYmFyIC52anMtdGltZS10b29sdGlwIHsKICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKfQoKLnZpZGVvLWpzIC52anMtcHJvZ3Jlc3MtY29udHJvbCAudmpzLW1vdXNlLWRpc3BsYXkgewogIHotaW5kZXg6IDI7Cn0KCi51bC12aWRlby1wbGF5ZXIgewogIHdpZHRoOiAxMDAlOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBoZWlnaHQ6IGF1dG87CiAgYm9yZGVyOiAxcHggc29saWQgI0U2RTZFNjsKICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIGJvcmRlci1yYWRpdXM6IDRweDsKICBiYWNrZ3JvdW5kLWNsaXA6IGJvcmRlci1ib3g7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnZpZGVvLWpzLnZqcy1mdWxsc2NyZWVuOm5vdCgudmpzLWlvcy1uYXRpdmUtZnMpIHsKICBib3JkZXI6IG5vbmU7Cn0KCiN1bC1jYXJkLXZpZGVvX19wbGF5ZXJfcmVjb3JkZXItdmlkZW8tcmVjb3JkZXIudmpzLWZ1bGxzY3JlZW4gewogIGRpc3BsYXk6IHRhYmxlOwp9CgoudmlkZW8tanMgZGl2LnZqcy1wcm9ncmVzcy1jb250cm9sIHsKICBtYXJnaW4tdG9wOiAtM3B4Owp9CgoudmlkZW8tanMgLnZqcy1wcm9ncmVzcy1jb250cm9sIC52anMtc2xpZGVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjQjJCQkJEOwp9CgoudmpzLXJlY29yZC52aWRlby1qcyAudmpzLWNvbnRyb2wudmpzLWJ1dHRvbi52anMtZnVsbHNjcmVlbi1jb250cm9sIHsKICBwb3NpdGlvbjpyZWxhdGl2ZTsKfQoKLyogZml4IGEgc3VidGxlIG1pc2FsaWdubWVudCBidWcgb24gY2lyY3VsYXIgcGxheSBjb250cm9sIGJ1dHRvbnMgKi8KLnZpZGVvLWpzIC52anMtcGxheS1jb250cm9sIC52anMtaWNvbi1wbGFjZWhvbGRlciB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMXB4LCAycHgpOwogIC1tb3otdHJhbnNmb3JtOiB0cmFuc2xhdGUoMXB4LCA1cHgpOwp9CgoudmlkZW8tanMgLnZqcy1wbGF5LWNvbnRyb2wudmpzLXBsYXlpbmcgPiAudmpzLWljb24tcGxhY2Vob2xkZXIgewogIHRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgMnB4KTsKICAtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgNHB4KTsKfQoKLyogZml4IG9wcG9zaXRlIG1pc2FsaWdubWVudCBidWcgb24gbm9uY2lyY3VsYXIgYnV0dG9ucyAqLwoudmlkZW8tanMgLnZqcy1tdXRlLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpOwp9CgoudmlkZW8tanMgLnZqcy1mdWxsc2NyZWVuLWNvbnRyb2wgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7CiAgY29udGVudDogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgdmlld0JveD0nMCAwIDE2IDE2JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBkPSdNOS44MjE0MyAyLjU0MDA0TDEyLjI2MTQgMi41NDAwNEMxMi45MjQyIDIuNTQwMDQgMTMuNDYxNCAzLjA3NzMgMTMuNDYxNCAzLjc0MDA0TDEzLjQ2MTQgNi4xODAwNCcgc3Ryb2tlPSdibGFjaycgc3Ryb2tlLXdpZHRoPScxLjUnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCcvJTNFJTNDcGF0aCBkPSdNNi4xNzk1NSAxMy40NkwzLjczOTU1IDEzLjQ2QzMuMDc2ODEgMTMuNDYgMi41Mzk1NSAxMi45MjI3IDIuNTM5NTUgMTIuMjZMMi41Mzk1NSA5LjgxOTk2JyBzdHJva2U9J2JsYWNrJyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0NwYXRoIGQ9J00xMi43NzcyIDMuMjIyNjZMOS4zNjQ3NSA2LjYzNTE2JyBzdHJva2U9J2JsYWNrJyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0NwYXRoIGQ9J002LjI5NDM0IDkuNzA2MDVMMi44ODE4NCAxMy4xMTg2JyBzdHJva2U9J2JsYWNrJyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFIik7Cn0KCi52aWRlby1qcy52anMtZnVsbHNjcmVlbiAudmpzLWZ1bGxzY3JlZW4tY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHsKICBjb250ZW50OiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzE2JyBoZWlnaHQ9JzE2JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBkPSdNMS41ODMgOS44MTNINS4yNWExIDEgMCAwMTEgMXYzLjY2Nk01LjM3NSAxMC42ODhMMSAxNS4wNjFNMTQuOTE3IDUuODEzSDExLjI1YTEgMSAwIDAxLTEtMVYxLjE0Nk0xNS4wNjMgMWwtNC4zNzYgNC4zNzUnIHN0cm9rZT0nJTIzMjYyMTM2JyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFIik7Cn0KCi52aWRlby1qcyAudmpzLXBsYXktY29udHJvbC52anMtZW5kZWQgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwgLnZpZGVvLWpzIC52anMtaWNvbi1yZXBsYXk6YmVmb3JlIHsKICBjb250ZW50OiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzEyJyBoZWlnaHQ9JzEyJyB2aWV3Qm94PScwIDAgMTIgMTInIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGQ9J00xMC41MzYzIDYuNDAyMjZMMS45Mzk1OCAxMC43MDA2QzEuNjQwMzcgMTAuODUwMiAxLjI4ODMzIDEwLjYzMjYgMS4yODgzMyAxMC4yOTgxVjEuNzAxNEMxLjI4ODMzIDEuMzY2ODggMS42NDAzNyAxLjE0OTMxIDEuOTM5NTggMS4yOTg5MUwxMC41MzYzIDUuNTk3MjdDMTAuODY4IDUuNzYzMTEgMTAuODY4IDYuMjM2NDIgMTAuNTM2MyA2LjQwMjI2Wicgc3Ryb2tlPSdibGFjaycgc3Ryb2tlLXdpZHRoPScxLjUnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcvJTNFJTNDL3N2ZyUzRSIpOwp9CgoudmlkZW8tanMgLnZqcy1wbGF5LWNvbnRyb2wudmpzLXBsYXlpbmcgLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSwgLnZqcy1pY29uLXBhdXNlOmJlZm9yZSB7CiAgY29udGVudDogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgdmlld0JveD0nMCAwIDE2IDE2JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcmVjdCB4PSczLjYxODg1JyB5PScyLjA2MDc0JyB3aWR0aD0nMy4xNjE4NScgaGVpZ2h0PScxMS44OCcgcng9JzAuOScgZmlsbD0nYmxhY2snIHN0cm9rZT0nJTIzRURFREVEJyBzdHJva2Utd2lkdGg9JzAuNicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJy8lM0UlM0NyZWN0IHg9JzkuMjE3OTcnIHk9JzIuMDYwNzQnIHdpZHRoPSczLjE2MTg1JyBoZWlnaHQ9JzExLjg4JyByeD0nMC45JyBmaWxsPSdibGFjaycgc3Ryb2tlPSclMjNFREVERUQnIHN0cm9rZS13aWR0aD0nMC42JyBzdHJva2UtbGluZWNhcD0ncm91bmQnLyUzRSUzQy9zdmclM0UlMEEiKTsKICBwYWRkaW5nOiAycHg7Cn0KCi52anMtZXJyb3ItZGlzcGxheSB7CiAgZGlzcGxheTogbm9uZTsKfQoKLnVsLXZpZGVvLXBsYXllci12aWRlbyB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHRvcDogMDsKICBsZWZ0OiAwOwogIHdpZHRoOiAxMDAlOwp9CgoudWwtdmlkZW8tY29udGFpbmVyIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IGF1dG87CiAgbGVmdDogMHB4OwogIHRvcDogMHB4OwoKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwogIGJvcmRlci1yYWRpdXM6IDRweDsKCiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CgogIC8qIEluc2lkZSBBdXRvIExheW91dCAqLwoKICBmbGV4OiBub25lOwogIG9yZGVyOiAwOwogIGZsZXgtZ3JvdzogMDsKICBtYXJnaW46IDEwcHggMHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLnZqcy1yZWNvcmQgYnV0dG9uLnZqcy1kZXZpY2UtYnV0dG9uLnZqcy1jb250cm9sIHsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDk2KTsKICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBSb2JvdG8sIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYsICJBcHBsZSBDb2xvciBFbW9qaSIsICJTZWdvZSBVSSBFbW9qaSIsICJTZWdvZSBVSSBTeW1ib2wiOwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICBsZWZ0OiAwOwogIHRvcDogMDsKICBtYXJnaW46IDA7CiAgYm9yZGVyLXJhZGl1czogMDsKICBsaW5lLWhlaWdodDogMC42OwogIHBhZGRpbmc6IDEwcHg7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgei1pbmRleDogMzsKfQoKLnZqcy1yZWNvcmQgLnZqcy1kZXZpY2UtYnV0dG9uLnZqcy1jb250cm9sOmJlZm9yZSB7CiAgZm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7CiAgY29sb3I6ICMzMzM7CiAgY29udGVudDogIllvdXIgYnJvd3NlciBuZWVkcyB0byBhY2Nlc3MgeW91ciBjYW1lcmEgYW5kIG1pY3JvcGhvbmUgZm9yIHZpZGVvIHJlY29yZGluZyI7CiAgbGluZS1oZWlnaHQ6IDEzNSU7Cn0KCi52anMtcmVjb3JkIC52anMtZGV2aWNlLWJ1dHRvbi52anMtY29udHJvbC5wZXJtaXNzaW9uLWRlbmllZDpiZWZvcmUgewogIGZvbnQtc2l6ZTogMTZweCAhaW1wb3J0YW50OwogIGNvbG9yOiAjMjYyMTM2OwogIGNvbnRlbnQ6ICJVbmFibGUgdG8gYWNjZXNzIHlvdXIgY2FtZXJhIGFuZCBtaWNyb3Bob25lIjsKfQoKLnZqcy1yZWNvcmQgLnZqcy1kZXZpY2UtYnV0dG9uLnZqcy1jb250cm9sOmFmdGVyIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgYmFja2dyb3VuZDogI0YwRjBGNTsKICBmb250LXNpemU6IDEzcHg7CiAgYm9yZGVyLXJhZGl1czogNHB4OwogIGNvbnRlbnQ6ICJSZXF1ZXN0IFBlcm1pc3Npb25zIjsKICBwYWRkaW5nOiAxZW0gMmVtOwogIGNvbG9yOiAjMzMzOwogIG1hcmdpbi10b3A6IDIwcHg7Cn0KCi52anMtcmVjb3JkIC52anMtZGV2aWNlLWJ1dHRvbi52anMtY29udHJvbC5wZXJtaXNzaW9uLWRlbmllZDphZnRlciB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGJhY2tncm91bmQ6IHdoaXRlOwogIGZvbnQtc2l6ZTogMTNweDsKICBjb250ZW50OiAiUGxlYXNlIGdvIHRvIHlvdXIgYnJvd3NlciBzZXR0aW5ncyBhbmQgdXBkYXRlIHBlcm1pc3Npb25zIHRvIGVuYWJsZSByZWNvcmRpbmciOwogIHBhZGRpbmc6IDFlbTsKICBjb2xvcjogIzRCNTc1RDsKICBtYXJnaW46IDVweDsKICBsaW5lLWhlaWdodDogMTM1JTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi52anMtY29udHJvbC52anMtYnV0dG9uLnVsLXZpZGVvLXJlY29yZGVyLWRlbGV0ZS1idXR0b24sIC52anMtY29udHJvbC52anMtYnV0dG9uLnVsLXZpZGVvLXJlY29yZGVyLXRvZ2dsZS1idXR0b24sIC52anMtY29udHJvbC52anMtYnV0dG9uLnVsLXZpZGVvLXJlY29yZGVyLWNhbWVyYS1vZmYtYnV0dG9uLWF1ZGlvLW9ubHksIC52anMtY29udHJvbC52anMtYnV0dG9uLnVsLXZpZGVvLXJlY29yZGVyLWNhbWVyYS1vZmYtYnV0dG9uIHsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi51bC12aWRlby1yZWNvcmRlci1kZWxldGUtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUgewogIGNvbnRlbnQ6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIHZpZXdCb3g9JzAgMCAxNiAxNicgZmlsbD0nbm9uZScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZD0nTTkuMjEyMzQgNy4zNzU0OVYxMS4xMTkzTTIuNTM5MzEgNC4yNTU5NUgxMy40NTkzSDIuNTM5MzFaTTUuNTcyMzQgNC4yNTU5NVYzLjAwODMzQzUuNTcyMjIgMi44NDQzMyA1LjYwMzU0IDIuNjgxOTIgNS42NjQ1IDIuNTMwMzhDNS43MjU0NiAyLjM3ODg0IDUuODE0ODggMi4yNDExNSA1LjkyNzYyIDIuMTI1MTlDNi4wNDAzNyAyLjAwOTIyIDYuMTc0MjQgMS45MTcyNiA2LjMyMTU4IDEuODU0NTZDNi40Njg5MiAxLjc5MTg1IDYuNjI2ODMgMS43NTk2NCA2Ljc4NjI4IDEuNzU5NzdIOS4yMTIzNEM5LjM3MTc5IDEuNzU5NjQgOS41Mjk3IDEuNzkxODUgOS42NzcwMyAxLjg1NDU2QzkuODI0MzcgMS45MTcyNiA5Ljk1ODI0IDIuMDA5MjIgMTAuMDcxIDIuMTI1MTlDMTAuMTgzNyAyLjI0MTE1IDEwLjI3MzIgMi4zNzg4NCAxMC4zMzQxIDIuNTMwMzhDMTAuMzk1MSAyLjY4MTkyIDEwLjQyNjQgMi44NDQzMyAxMC40MjYzIDMuMDA4MzNWNC4yNTU5NUg1LjU3MjM0Wk0xMi4yNDYzIDQuMjU1OTVWMTIuOTkxMkMxMi4yNDYzIDEzLjMyMjMgMTIuMTE4NCAxMy42Mzk5IDExLjg5MDcgMTMuODc0MUMxMS42NjMxIDE0LjEwODIgMTEuMzU0MyAxNC4yMzk4IDExLjAzMjMgMTQuMjM5OEg0Ljk2NjI4QzQuNjQ0MzIgMTQuMjM5OCA0LjMzNTU1IDE0LjEwODIgNC4xMDc4OSAxMy44NzQxQzMuODgwMjMgMTMuNjM5OSAzLjc1MjM0IDEzLjMyMjMgMy43NTIzNCAxMi45OTEyVjQuMjU1OTVIMTIuMjQ2M1pNNi43ODYyOCA3LjM3NTQ5VjExLjExOTNWNy4zNzU0OVonIHN0cm9rZT0nYmxhY2snIHN0cm9rZS13aWR0aD0nMS41JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9zdmclM0UlMEEiKTsKfQoKLnVsLXZpZGVvLXJlY29yZGVyLXRvZ2dsZS1idXR0b24gLnZqcy1pY29uLXBsYWNlaG9sZGVyOmJlZm9yZSB7CiAgY29udGVudDogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScxNicgaGVpZ2h0PScxNicgdmlld0JveD0nMCAwIDE2IDE2JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBkPSdNOCAwQzEyLjQxODMgMCAxNiAzLjU4MTcyIDE2IDhDMTYgMTIuNDE4MyAxMi40MTgzIDE2IDggMTZDMy41ODE3MiAxNiAwIDEyLjQxODMgMCA4QzAgMy41ODE3MiAzLjU4MTcyIDAgOCAwWicgZmlsbD0nJTIzRDE1MTUzJy8lM0UlM0Mvc3ZnJTNFIik7Cn0KCi51bC12aWRlby1yZWNvcmRlci10b2dnbGUtYnV0dG9uLnVsLXJlY29yZGluZy1pbi1zZXNzaW9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUgewogIGNvbnRlbnQ6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB3aWR0aD0nMTInIGhlaWdodD0nMTInIHZpZXdCb3g9JzAgMCAxMiAxMicgZmlsbD0nbm9uZScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZD0nTTEyIDEwTDEyIDJDMTIgMC44OTU0MyAxMS4xMDQ2IC00Ljg1Mzk2ZS0wNyAxMCAtNC4zNzExNGUtMDdMMiAtOC43NDIyOGUtMDhDMC44OTU0MyAtMy45MTQwNWUtMDggLTQuODUzOTZlLTA3IDAuODk1NDMxIC00LjM3MTE0ZS0wNyAyTC04Ljc0MjI4ZS0wOCAxMEMtMy45MTQwNWUtMDggMTEuMTA0NiAwLjg5NTQzMSAxMiAyIDEyTDEwIDEyQzExLjEwNDYgMTIgMTIgMTEuMTA0NiAxMiAxMFonIGZpbGw9JyUyM0QxNTE1MycvJTNFJTNDL3N2ZyUzRSUwQSIpOwp9CgoudWwtdmlkZW8tcmVjb3JkZXItZGVsZXRlLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIsIC51bC12aWRlby1yZWNvcmRlci10b2dnbGUtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlciB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCA3cHgpOwogIC1tb3otdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCA1cHgpOwp9CgoudWwtcmVjb3JkaW5nLWluLXNlc3Npb24udWwtdmlkZW8tcmVjb3JkZXItdG9nZ2xlLWJ1dHRvbiAudmpzLWljb24tcGxhY2Vob2xkZXIgewogIHRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgNXB4KTsKfQoKLnVsLXZpZGVvLXJlY29yZGVyLWNhbWVyYS1vZmYtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlciB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMXB4LCA3cHgpOwogIC1tb3otdHJhbnNmb3JtOiB0cmFuc2xhdGUoMXB4LCA2cHgpOwp9CgoudWwtdmlkZW8tcmVjb3JkZXItY2FtZXJhLW9mZi1idXR0b24tYXVkaW8tb25seSAudmpzLWljb24tcGxhY2Vob2xkZXIgewogIHRyYW5zZm9ybTogc2NhbGUoMC43NSkgdHJhbnNsYXRlKDFweCwgOHB4KTsKICAtbW96LXRyYW5zZm9ybTogc2NhbGUoMC43NSkgdHJhbnNsYXRlKDFweCwgOHB4KTsKfQoKLyogZml4IGEgc3VidGxlIG1pc2FsaWdubWVudCBidWcgZm9yIGZ1bGwgc2NyZWVuIGJ1dHRvbnMgKi8KLnZqcy1mdWxsc2NyZWVuIC51bC1yZWNvcmRpbmctaW4tc2Vzc2lvbiAudmpzLWljb24tcGxhY2Vob2xkZXIgewogIHRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgNnB4KTsKICAtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgNnB4KTsKfQoKLnVsLXZpZGVvLXJlY29yZGVyLWNhbWVyYS1vZmYtYnV0dG9uIC52anMtaWNvbi1wbGFjZWhvbGRlcjpiZWZvcmUgewogIGNvbnRlbnQ6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB3aWR0aD0nMTYnIGhlaWdodD0nMTYnIHZpZXdCb3g9JzAgMCAxNiAxNicgZmlsbD0nbm9uZScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ2cgY2xpcC1wYXRoPSd1cmwoJTIzY2xpcDBfMjY0NV80NjU0KSclM0UlM0NwYXRoIGQ9J00xNS4xNDkxIDQuNzVMMTAuNTk5MSA4TDE1LjE0OTEgMTEuMjVWNC43NVonIHN0cm9rZT0nYmxhY2snIHN0cm9rZS13aWR0aD0nMS41JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQ3BhdGggZD0nTTkuMjk5MTIgMy40NTAySDIuMTQ5MTJDMS40MzExNSAzLjQ1MDIgMC44NDkxMjEgNC4wMzIyMyAwLjg0OTEyMSA0Ljc1MDJWMTEuMjUwMkMwLjg0OTEyMSAxMS45NjgyIDEuNDMxMTUgMTIuNTUwMiAyLjE0OTEyIDEyLjU1MDJIOS4yOTkxMkMxMC4wMTcxIDEyLjU1MDIgMTAuNTk5MSAxMS45NjgyIDEwLjU5OTEgMTEuMjUwMlY0Ljc1MDJDMTAuNTk5MSA0LjAzMjIzIDEwLjAxNzEgMy40NTAyIDkuMjk5MTIgMy40NTAyWicgc3Ryb2tlPSdibGFjaycgc3Ryb2tlLXdpZHRoPScxLjUnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCcvJTNFJTNDL2clM0UlM0NkZWZzJTNFJTNDY2xpcFBhdGggaWQ9J2NsaXAwXzI2NDVfNDY1NCclM0UlM0NyZWN0IHdpZHRoPScxNS42JyBoZWlnaHQ9JzE1LjYnIGZpbGw9J3doaXRlJyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgwLjE5OTk1MSAwLjIwMDE5NSknLyUzRSUzQy9jbGlwUGF0aCUzRSUzQy9kZWZzJTNFJTNDL3N2ZyUzRSIpOwp9CgoudWwtdmlkZW8tcmVjb3JkZXItY2FtZXJhLW9mZi1idXR0b24tYXVkaW8tb25seSAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHsKICBjb250ZW50OiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzIyJyBoZWlnaHQ9JzE1JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGNsaXAtcnVsZT0nZXZlbm9kZCcgZD0nTS43NSAzQTIuNzUgMi43NSAwIDAxMy41LjI1aDkuMDgxQTIuNzUgMi43NSAwIDAxMTUuMzMxIDN2OWEyLjc1IDIuNzUgMCAwMS0yLjc1IDIuNzVIMy41QTIuNzUgMi43NSAwIDAxLjc1IDEyVjN6TTMuNSAxLjc1Yy0uNjkgMC0xLjI1LjU2LTEuMjUgMS4yNXY5YzAgLjY5LjU2IDEuMjUgMS4yNSAxLjI1aDkuMDgxYy42OSAwIDEuMjUtLjU2IDEuMjUtMS4yNVYzYzAtLjY5LS41Ni0xLjI1LTEuMjUtMS4yNUgzLjV6JyBmaWxsPSclMjMyNjIxMzYnLyUzRSUzQ3BhdGggZmlsbC1ydWxlPSdldmVub2RkJyBjbGlwLXJ1bGU9J2V2ZW5vZGQnIGQ9J00xNC41MyAyLjAzbC0xMiAxMi0xLjA2LTEuMDYgMTItMTIgMS4wNiAxLjA2ek0yMC44NyAxLjUyNWEuNzUuNzUgMCAwMS4zOC42NTJ2MTAuNTg4YS43NS43NSAwIDAxLTEuMTM0LjY0NGwtNS45Mi0zLjUzYS43NS43NSAwIDAxLS4zNjUtLjY0M3YtMy41M2EuNzUuNzUgMCAwMS4zNjYtLjY0NGw1LjkxOS0zLjUzYS43NS43NSAwIDAxLjc1NC0uMDA3em0tNS41MzkgNC42MDdWOC44MWw0LjQxOSAyLjYzNVYzLjQ5N2wtNC40MTkgMi42MzV6JyBmaWxsPSclMjMyNjIxMzYnLyUzRSUzQy9zdmclM0UiKTsKfQoKLnVsLXVwbG9hZC1wcm9ncmVzcy1sYWJlbCB7CiAgcGFkZGluZzogMC4xNWVtIDAuNzVlbTsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGZvbnQtc2l6ZTogMTJweDsKICBjb2xvcjogIzMzMzsKICBiYWNrZ3JvdW5kOiAjRkNGQ0ZEOwogIGJvcmRlci1yYWRpdXM6IDk5cHg7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGJvcmRlcjogMXB4IHNvbGlkICNFMEUwRUI7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBib3R0b206IDc1cHg7CiAgbGVmdDogY2FsYyg1MCUgLSA2NXB4KTsKICB3aWR0aDogMTMwcHg7CiAgei1pbmRleDogNTsKfQoKLnVsLXVwbG9hZC1wcm9ncmVzcy1sYWJlbF9fdGltZSB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgbWFyZ2luLWxlZnQ6IDAuOGVtOwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi51bC11cGxvYWQtcHJvZ3Jlc3MtbGFiZWxfX3RpbWU6YmVmb3JlIHsKICBjb250ZW50OiAiIjsKICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICB3aWR0aDogMXB4OwogIGhlaWdodDogMTJweDsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTBFMEVCOwogIG1hcmdpbi1yaWdodDogMC44ZW07Cn0KCkBrZXlmcmFtZXMgZ3JvdyB7CiAgMCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNFRUVDRkM7CiAgfQogIDUwJSAgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjIpOwogICAgYmFja2dyb3VuZC1jb2xvcjogI0UxREZGNDsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgYmFja2dyb3VuZC1jb2xvcjogI0VFRUNGQzsKICB9Cn0KCi51bC1hdWRpby1yZWNvcmRlci1wbGFjZWhvbGRlcjpiZWZvcmUgewogIHdpZHRoOiA4MHB4OwogIGhlaWdodDogODBweDsKICBib3JkZXItcmFkaXVzOiAxMjBweDsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUVFQ0ZDOwogIGNvbnRlbnQ6ICIiOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiBjYWxjKDUwJSAtIDQwcHgpOwogIHRvcDogY2FsYyg1MCUgLSA0MHB4KTsKICBhbmltYXRpb246IDZzIGluZmluaXRlIGdyb3c7CiAgdHJhbnNmb3JtLW9yaWdpbjogNTAlIDYwJTsKfQoKLnVsLWF1ZGlvLXJlY29yZGVyLXBsYWNlaG9sZGVyOmFmdGVyIHsKICBjb250ZW50OiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9Jzk4JyBoZWlnaHQ9Jzk4JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDbWFzayBpZD0nYScgbWFza1VuaXRzPSd1c2VyU3BhY2VPblVzZScgeD0nMCcgeT0nMCcgd2lkdGg9Jzk4JyBoZWlnaHQ9Jzk4JyUzRSUzQ2NpcmNsZSBjeD0nNDknIGN5PSc0OScgcj0nNDknIGZpbGw9JyUyM0VERUNGOCcvJTNFJTNDL21hc2slM0UlM0NnIG1hc2s9J3VybCglMjNhKSclM0UlM0NjaXJjbGUgY3g9JzQ5JyBjeT0nNDknIHI9JzUwJyBmaWxsPSclMjM2NDVDQzInLyUzRSUzQ3BhdGggZmlsbC1ydWxlPSdldmVub2RkJyBjbGlwLXJ1bGU9J2V2ZW5vZGQnIGQ9J00xMS40MjIgODEuODEyYzUuNDA1LTE1LjU0NyAyMC4xODctMjYuNzA2IDM3LjU3Ni0yNi43MDYgMTcuMzkgMCAzMi4xNzIgMTEuMTU5IDM3LjU3NyAyNi43MDctOS4xNjQgMTAuNDMtMjIuNjAxIDE3LjAxMy0zNy41NzYgMTcuMDEzLTE0Ljk3NiAwLTI4LjQxNC02LjU4My0zNy41NzctMTcuMDE0eicgZmlsbD0nJTIzZmZmJyBmaWxsLW9wYWNpdHk9Jy42Jy8lM0UlM0NjaXJjbGUgY3g9JzQ5JyBjeT0nMjknIHI9JzE3JyBmaWxsPSclMjNmZmYnIGZpbGwtb3BhY2l0eT0nLjcnLyUzRSUzQy9nJTNFJTNDL3N2ZyUzRSIpOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiA1MCU7CiAgdG9wOiA1MCU7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgc2NhbGUoMC42KTsKfQoKLnVsLWF1ZGlvLXJlY29yZGVyLXBsYWNlaG9sZGVyIHsKICBtaW4taGVpZ2h0OiAxNTBweDsKICB3aWR0aDogMTAwJTsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmY2ZkOwogIGRpc3BsYXk6IGJsb2NrOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLnZqcy1mdWxsc2NyZWVuIC51bC1hdWRpby1yZWNvcmRlci1wbGFjZWhvbGRlciB7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICBkaXNwbGF5OiB0YWJsZS1jZWxsOwp9CgpAa2V5ZnJhbWVzIGdyb3cgewogIDAlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUVFQ0ZDOwogIH0KICA1MCUgIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4yKTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNFMURGRjQ7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgIGJhY2tncm91bmQtY29sb3I6ICNFRUVDRkM7CiAgfQp9CgoudmpzLWZ1bGxzY3JlZW4gLnVsLWNvbnRyb2wtcGFuZWwgewogIGhlaWdodDogODBweDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgYm90dG9tOiAwOwogIGxlZnQ6IDA7CiAgd2lkdGg6IDEwMCU7CiAgbWF4LXdpZHRoOiAxMDAlOwogIGJhY2tncm91bmQtY29sb3I6ICNGOEY4Rjg7Cn0KCi51bC1idXR0b25zLXBhbmVsIHsKICBtYXJnaW46IDEwcHg7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi52anMtcGxheWJhY2stcmF0ZSAudmpzLXBsYXliYWNrLXJhdGUtdmFsdWUgewogIGZvbnQtc2l6ZTogMTJweDsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAzcHgpOwp9CgoudmpzLXBsYXliYWNrLXJhdGUgLnZqcy1tZW51IHsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNnB4LCAxMnB4KTsKICBwb3NpdGlvbjogdW5zZXQ7Cn0KCi52anMtbWVudS1idXR0b24tcG9wdXAgLnZqcy1tZW51IC52anMtbWVudS1jb250ZW50IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMSk7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBib3JkZXItcmFkaXVzOiA0cHg7Cn0KCi52anMtbWVudS1idXR0b24tcG9wdXAgLnZqcy1tZW51IHsKICBtYXJnaW4tYm90dG9tOiB1bnNldDsKfQoKLnZqcy1tZW51IGxpIHsKICBmb250LXNpemU6IDEycHg7CiAgcGFkZGluZzogNXB4IDA7Cn0KCi52anMtbWVudSBsaS52anMtc2VsZWN0ZWQgewogIGNvbG9yOiBsaWdodGdyYXk7Cn0KCi52anMtbWVudSBsaS52anMtbWVudS1pdGVtOmhvdmVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDUpOwp9CgoudmpzLWZ1bGxzY3JlZW4gLnVsLWJ1dHRvbnMtcGFuZWwgewogIHRvcDogY2FsYyg1MCUgLSAzMHB4KTsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi52anMtZnVsbHNjcmVlbiAudmpzLXJlY29yZC1pbmRpY2F0b3IudmpzLWNvbnRyb2wgewogIGJvdHRvbTogOTBweCAhaW1wb3J0YW50Owp9CgoudmpzLXJlY29yZC52aWRlby1qcyBkaXYudmpzLWNvbnRyb2wudmpzLXJlY29yZC1pbmRpY2F0b3IgewogIHBhZGRpbmc6IDAuM2VtIDAuNzVlbSAwLjE1ZW0gMTVweDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGZvbnQtc2l6ZTogMTJweDsKICBjb2xvcjogIzMzMzsKICBiYWNrZ3JvdW5kOiAjRkNGQ0ZEOwogIGJvcmRlci1yYWRpdXM6IDk5cHg7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGJvcmRlcjogMXB4IHNvbGlkICNFMEUwRUI7CiAgZGlzcGxheTogZmxleDsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBib3R0b206IDc1cHg7CiAgdG9wOiBhdXRvOwogIGxlZnQ6IGNhbGMoNTAlIC0gMjFweCk7CiAgd2lkdGg6IDQzcHg7CiAgaGVpZ2h0OiAxNnB4OwogIHotaW5kZXg6IDQ7Cn0KCi52anMtcmVjb3JkLnZpZGVvLWpzIGRpdi52anMtY29udHJvbC52anMtcmVjb3JkLWluZGljYXRvcjphZnRlciB7CiAgY29udGVudDogIiI7CiAgYmFja2dyb3VuZC1jb2xvcjogI0VCNTc1NzsKICB3aWR0aDogNnB4OwogIGhlaWdodDogNnB4OwogIGJvcmRlci1yYWRpdXM6IDhweDsKICBhbmltYXRpb246IG5vbmU7CiAgdG9wOiA0cHg7CiAgbGVmdDogNXB4Owp9CgoudmpzLXJlY29yZC52aWRlby1qcyBkaXYudmpzLWNvbnRyb2wudmpzLXJlY29yZC1pbmRpY2F0b3I6YmVmb3JlIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgZm9udC1zaXplOiA5cHg7CiAgYW5pbWF0aW9uOiBub25lOwogIG9wYWNpdHk6IDE7CiAgY29sb3I6ICMzMzM7CiAgdG9wOiBhdXRvOwogIGxlZnQ6IGF1dG87Cn0KCi51bC12aWRlby1wbGF5ZXItbG9hZGluZyB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB3aWR0aDogNnJlbTsKICBoZWlnaHQ6IDZyZW07Cgp9Ci51bC12aWRlby1wbGF5ZXItbG9hZGluZyBkaXYgewogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiA4MCU7CiAgaGVpZ2h0OiA4MCU7CiAgbWFyZ2luOiA1cHg7CiAgYm9yZGVyOiA1cHggc29saWQgIzY2NjsKICBib3JkZXItcmFkaXVzOiA1MCU7CiAgYW5pbWF0aW9uOiBsZHMtcmluZyAxLjJzIGN1YmljLWJlemllcigwLjUsIDAsIDAuNSwgMSkgaW5maW5pdGU7CiAgYm9yZGVyLWNvbG9yOiAjNjY2IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50Owp9CgouZmlyc3QgewogIGFuaW1hdGlvbi1kZWxheTogLTAuNDVzOwp9Ci5zZWNvbmQgewogIGFuaW1hdGlvbi1kZWxheTogLTAuM3M7Cn0KLnRoaXJkIHsKICBhbmltYXRpb24tZGVsYXk6IC0wLjE1czsKfQoKQGtleWZyYW1lcyBsZHMtcmluZyB7CiAgMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgfQogIDEwMCUgewogICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICB9Cn0KCi51bC12aWRlby1idG4gewogIHdpZHRoOiAxMDAlOwogIGJvcmRlcjogMXB4IHNvbGlkICNFNkU2RTY7CiAgYm9yZGVyLXJhZGl1czogNHB4OwogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wMik7CiAgcGFkZGluZzogOHB4OwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgZm9udC1zaXplOiAxNXB4Owp9CgoudWwtcmVjb3JkLXJlc3BvbnNlLWJ0bjpiZWZvcmUsIC51bC1yZWNvcmQtcmVzcG9uc2UtYnRuOmFmdGVyLCAudWwtYmFjay1xdWVzdGlvbi1idG46YmVmb3JlLCAudWwtYmFjay1xdWVzdGlvbi1idG46YWZ0ZXIgewogIG1hcmdpbjogMCA1cHg7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnVsLXJlY29yZC1yZXNwb25zZS1idG46YmVmb3JlIHsKICBjb250ZW50OiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzE2JyBoZWlnaHQ9JzE2JyB2aWV3Qm94PScwIDAgMTYgMTYnIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NnIGNsaXAtcGF0aD0ndXJsKCUyM2NsaXAwXzI2NDVfNDY1NCknJTNFJTNDcGF0aCBkPSdNMTUuMTQ5MSA0Ljc1TDEwLjU5OTEgOEwxNS4xNDkxIDExLjI1VjQuNzVaJyBzdHJva2U9J2JsYWNrJyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0NwYXRoIGQ9J005LjI5OTEyIDMuNDUwMkgyLjE0OTEyQzEuNDMxMTUgMy40NTAyIDAuODQ5MTIxIDQuMDMyMjMgMC44NDkxMjEgNC43NTAyVjExLjI1MDJDMC44NDkxMjEgMTEuOTY4MiAxLjQzMTE1IDEyLjU1MDIgMi4xNDkxMiAxMi41NTAySDkuMjk5MTJDMTAuMDE3MSAxMi41NTAyIDEwLjU5OTEgMTEuOTY4MiAxMC41OTkxIDExLjI1MDJWNC43NTAyQzEwLjU5OTEgNC4wMzIyMyAxMC4wMTcxIDMuNDUwMiA5LjI5OTEyIDMuNDUwMlonIHN0cm9rZT0nYmxhY2snIHN0cm9rZS13aWR0aD0nMS41JyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9nJTNFJTNDZGVmcyUzRSUzQ2NsaXBQYXRoIGlkPSdjbGlwMF8yNjQ1XzQ2NTQnJTNFJTNDcmVjdCB3aWR0aD0nMTUuNicgaGVpZ2h0PScxNS42JyBmaWxsPSd3aGl0ZScgdHJhbnNmb3JtPSd0cmFuc2xhdGUoMC4xOTk5NTEgMC4yMDAxOTUpJy8lM0UlM0MvY2xpcFBhdGglM0UlM0MvZGVmcyUzRSUzQy9zdmclM0UiKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMHB4LCAycHgpOwp9CgoudWwtcmVjb3JkLXJlc3BvbnNlLWJ0bjphZnRlciB7CiAgY29udGVudDogJ1JlY29yZCB5b3VyIFJlc3BvbnNlJzsKfQoKLnVsLWJhY2stcXVlc3Rpb24tYnRuOmJlZm9yZSB7CiAgY29udGVudDogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScxNScgaGVpZ2h0PScxNicgdmlld0JveD0nMCAwIDE1IDE2JyBmaWxsPSdub25lJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBkPSdNMTMuODc1NyA4LjIyMzYxTDEuMTExOCAxNC42MDU2QzAuOTQ1NTc4IDE0LjY4ODcgMC43NSAxNC41Njc4IDAuNzUgMTQuMzgyVjEuNjE4MDNDMC43NSAxLjQzMjE5IDAuOTQ1NTc5IDEuMzExMzEgMS4xMTE4IDEuMzk0NDNMMTMuODc1NyA3Ljc3NjM5QzE0LjA2IDcuODY4NTIgMTQuMDYgOC4xMzE0OCAxMy44NzU3IDguMjIzNjFaJyBzdHJva2U9J2JsYWNrJyBzdHJva2Utd2lkdGg9JzEuNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFIik7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHRyYW5zZm9ybTogc2NhbGUoMC44NSkgdHJhbnNsYXRlKDAsIDFweCk7CiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDAuODUpIHRyYW5zbGF0ZSgwLCAycHgpOwp9CgoudWwtYmFjay1xdWVzdGlvbi1idG46YWZ0ZXIgewogIGNvbnRlbnQ6ICdCYWNrIHRvIFF1ZXN0aW9uJzsKfQoKLmhpZGRlbiB7CiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogIG9wYWNpdHk6IDA7CiAgdmlzaWJpbGl0eTogaGlkZGVuOwp9CgoudmlzaWJsZSB7CiAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICBvcGFjaXR5OiAxOwogIGFuaW1hdGlvbjogZmFkZSAwLjNzOwp9CgpAa2V5ZnJhbWVzIGZhZGUgewogIDAlIHsKICAgICAgb3BhY2l0eTogMDsKICB9CgogIDEwMCUgewogICAgICBvcGFjaXR5OiAxOwogIH0KfQoKI3VsLXJlY29yZGluZy1jb3VudGRvd24tc2NyZWVuIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgY29sb3I6IGJsYWNrOwogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGZvbnQtc2l6ZTogMTVweDsKICB6LWluZGV4OiAxOwogIGRpc3BsYXk6IHRhYmxlOwp9CgoudWwtY291bnRkb3duLXRleHQgewogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgZGlzcGxheTogdGFibGUtY2VsbDsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMjVweCk7Cn0KCi52anMtZnVsbHNjcmVlbiA+ICN1bC1yZWNvcmRpbmctY291bnRkb3duLXNjcmVlbiB7CiAgZm9udC1zaXplOiAyNXB4OwogIHRyYW5zZm9ybTogdW5zZXQ7Cn0KCi52anMtY29udHJvbCAudmpzLWljb24tcGxhY2Vob2xkZXI6YmVmb3JlIHsKICBkaXNwbGF5OiBmbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCiN1bC1TcGVlZCB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMzVweCk7Cn0KCi52anMtcG9zdGVyIHsKICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiB1bnNldDsKfQpgOwoKY29uc3Qgc3Bpbm5lciA9IChwbGF5ZXJJZCkgPT4gewogIGNvbnN0IHNwaW5uZXJDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICBzcGlubmVyQ29udGFpbmVyLmNsYXNzTmFtZSA9ICd1bC12aWRlby1wbGF5ZXItbG9hZGluZyc7CiAgc3Bpbm5lckNvbnRhaW5lci5pZCA9IGdldFNwaW5uZXJJZChwbGF5ZXJJZCk7CiAgWydmaXJzdCcsICdzZWNvbmQnLCAndGhpcmQnLCAnZm91cnRoJ10ubWFwKChkaXZOYW1lKSA9PiB7CiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IGRpdk5hbWU7CiAgICBzcGlubmVyQ29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpOwogIH0pOwogIHJldHVybiBzcGlubmVyQ29udGFpbmVyOwp9Owpjb25zdCBnZXRTcGlubmVySWQgPSAocGxheWVySWQpID0+IHsKICByZXR1cm4gcGxheWVySWQgKyAnLWxvYWRpbmctc3BpbmVyJzsKfTsKCmNvbnN0IEhJRERFTl9DTEFTUyA9ICdoaWRkZW4nOwpjb25zdCBWSVNJQkxFX0NMQVNTID0gJ3Zpc2libGUnOwoKY29uc3QgQ0FNRVJBX09GRl9CVVRUT05fQ0xBU1MgPSAndWwtdmlkZW8tcmVjb3JkZXItY2FtZXJhLW9mZi1idXR0b24nOwpjb25zdCBSRUNPUkRJTkdfSU5fU0VTU0lPTiA9ICd1bC1yZWNvcmRpbmctaW4tc2Vzc2lvbic7CmNvbnN0IHJlY29yZGVyU2NyaXB0cyA9IFsKICB7IHR5cGU6ICdsaW5rJywgY29udGVudDogYCR7Q0ROX0xJTkt9L2RlcGVuZGVuY2llcy92aWRlb2pzLXJlY29yZC00LjUuMC5taW4uY3NzYCB9LAogIHsgdHlwZTogJ3NjcmlwdCcsIGNvbnRlbnQ6IGAke0NETl9MSU5LfS9kZXBlbmRlbmNpZXMvUmVjb3JkUlRDLTUuNi4yLmpzYCB9LAogIHsgdHlwZTogJ3NjcmlwdCcsIGNvbnRlbnQ6IGAke0NETl9MSU5LfS9kZXBlbmRlbmNpZXMvYWRhcHRlci44LjAuMC5taW4uanNgIH0sCiAgeyB0eXBlOiAnc2NyaXB0JywgY29udGVudDogYCR7Q0ROX0xJTkt9L2RlcGVuZGVuY2llcy92aWRlb2pzLXJlY29yZC00LjUuMC5taW4uanNgIH0sCiAgeyB0eXBlOiAnc2NyaXB0JywgY29udGVudDogYCR7Q0ROX0xJTkt9L3VzZXJsZWFwLXdlYi11cGNodW5rLXYyLjIuMi5qc2AgfSwKXTsKY29uc3QgdmlkZW9QbGF5ZXJTY3JpcHRzID0gWwogIHsgdHlwZTogJ2xpbmsnLCBjb250ZW50OiBgJHtDRE5fTElOS30vZGVwZW5kZW5jaWVzL3ZpZGVvLWpzLTcuMTguMC5taW4uY3NzYCB9LAogIHsgdHlwZTogJ3NjcmlwdCcsIGNvbnRlbnQ6IGAke0NETl9MSU5LfS9kZXBlbmRlbmNpZXMvdmlkZW8tanMtNy4xOC4wLm1pbi5qc2AgfSwKICB7IHR5cGU6ICdzdHlsZScsIGNvbnRlbnQ6IHZpZGVvUGxheWVyQ3NzIH0sCl07CmNvbnN0IFZJREVPX1BMQVlFUl9QT1NURklYID0gJy12aWRlby1wbGF5ZXInOwpjb25zdCBWSURFT19SRUNPUkRFUl9QT1NURklYID0gJy12aWRlby1yZWNvcmRlcic7CmxldCB1cGxvYWQ7CmxldCBjdXJyZW50UGxheWVyU2Vzc2lvbjsKCi8qKgogKgogKiBAcGFyYW0ge0Vycm9yfSBlcnIgdGhlIGVycm9yIGJlaW5nIHJlcG9ydGVkCiAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb24gdGhlIGFjdGlvbiBkdXJpbmcgd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkCiAqIEBwYXJhbSB7U3RyaW5nfSBhcGlCYXNlIGJhc2UgdXJsIGZvciB0aGUgYXBpIGNhbGxzIGRlZmF1bHQgaXMgcHJvZCBhcGkKICogQHBhcmFtIHsneC11bC12aWRlby1yZWNvcmRlci1vcmlnaW4nOiAnZGFzaGJvYXJkJyB8ICdzZGsnfSBoZWFkZXJzIHJlcXVlc3QgaGVhZGVycyBmb3IgZXJyb3IgbG9nZ2luZyAocG90ZW50aWFsbHkgY29udGFpbnMgYWRkaXRpb25hbCBoZWFkZXJzKQogKiBAcGFyYW0ge1N0cmluZ30gdmlzaXRvcklkIG9wdGlvbmFsCiAqIEBwYXJhbSB7U3RyaW5nfSBlbnZJZCBvcHRpb25hbAogKi8KY29uc3QgcmVwb3J0RXJyb3IgPSBhc3luYyAoZXJyLCBhY3Rpb24sIGFwaUJhc2UsIGhlYWRlcnMsIHZpc2l0b3JJZCwgZW52SWQpID0+IHsKICBjb25zdCBwZGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CiAgY29uc3QgbWV0YSA9IHsKICAgIHNjcmVlbldpZHRoOiB3aW5kb3cuc2NyZWVuLndpZHRoLAogICAgc2NyZWVuSGVpZ2h0OiB3aW5kb3cuc2NyZWVuLmhlaWdodCwKICAgIGNsaWVudFdpZHRoOiBwZGUuY2xpZW50V2lkdGgsCiAgICBjbGllbnRIZWlnaHQ6IHBkZS5jbGllbnRIZWlnaHQsCiAgICBsb2NhdGlvbjogd2luZG93LmxvY2F0aW9uLmhyZWYsCiAgICBsYW5ndWFnZTogbmF2aWdhdG9yLmxhbmd1YWdlLAogIH07CiAgY29uc3QgYm9keSA9IHsKICAgIGFjdGlvbiwKICAgIGVycjogeyBtZXNzYWdlOiBlcnIubWVzc2FnZSwgc3RhY2s6IGVyci5zdGFjayB9LAogICAgbWV0YSwKICAgIHZpZDogdmlzaXRvcklkLAogICAgZW52SWQsCiAgfTsKCiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2goYCR7YXBpQmFzZX0vc2RrLzEvZXJyb3JzYCwgewogICAgbWV0aG9kOiAnUE9TVCcsCiAgICBjYWNoZTogJ25vLWNhY2hlJywKICAgIGhlYWRlcnM6IHsKICAgICAgLi4uaGVhZGVycywKICAgICAgJ3VzZXJsZWFwLXBsYXRmb3JtJzogJ3ZpZGVvX3JlY29yZGVyJywKICAgICAgJ3gtdWwtZXJyb3InOiB3aW5kb3cuYnRvYShgdXNlcmxlYXAtJHtEYXRlLm5vdygpfS1lcnJvcmApLAogICAgfSwKICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLAogIH0pOwoKICBpZiAoIXJlc3VsdC5vaykgewogICAgY29uc29sZS53YXJuKGBbVXNlckxlYXBdIChFUlItNDQ0KSBGYWlsZWQgdG8gcmVwb3J0IGVycm9yIHRvIEFQSWAsIGVycik7CiAgfQp9OwoKLyoqCiAqCiAqIEBwYXJhbSB7aHRtbCBlbGVtZW50fSBwYXJlbnRFbGVtZW50IHBhcmVudCBlbGVtZW50IHRvIGF0dGFjaCB0aGUgY3JlYXRlZCBlbGVtZW50cwogKiBAcGFyYW0ge3t0eXBlLCBjb250ZW50fX0gc2NyaXB0RGF0YSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc2NyaXB0J3MgdHlwZSBhbmQgdGhlIGNvbnRlbnQKICogQHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBzY3JpcHQgaXMgbG9hZGVkCiAqLwpjb25zdCBsb2FkU2NyaXB0ID0gKHBhcmVudEVsZW1lbnQsIHsgdHlwZSwgY29udGVudCB9KSA9PiB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgbGV0IGVsZW1lbnQ7CiAgICBpZiAodHlwZSA9PT0gJ3NjcmlwdCcpIHsKICAgICAgLy8gcmVtb3RlIGpzCiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgZWxlbWVudC5zcmMgPSBjb250ZW50OwogICAgfSBlbHNlIGlmICh0eXBlID09PSAnbGluaycpIHsKICAgICAgLy8gcmVtb3RlIHN0eWxlCiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7CiAgICAgIGVsZW1lbnQucmVsID0gJ3N0eWxlc2hlZXQnOwogICAgICBlbGVtZW50LmhyZWYgPSBjb250ZW50OwogICAgICBlbGVtZW50LnR5cGUgPSAndGV4dC9jc3MnOwogICAgfSBlbHNlIHsKICAgICAgLy8gbG9jYWwgc3R5bGUKICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudDsKICAgIH0KICAgIGVsZW1lbnQub25sb2FkID0gZnVuY3Rpb24oKSB7CiAgICAgIHJlc29sdmUoY29udGVudCk7CiAgICB9OwogICAgZWxlbWVudC5vbmVycm9yID0gZnVuY3Rpb24oKSB7CiAgICAgIHJlamVjdChjb250ZW50KTsKICAgIH07CiAgICBlbGVtZW50LmFzeW5jID0gZmFsc2U7CiAgICBlbGVtZW50LmlkID0gYnRvYShjb250ZW50KTsKICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7CiAgfSk7Cn07CgovKioKICoKICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcGFyZW50RWxlbWVudCBwYXJlbnQgZWxlbWVudCB0byBhdHRhY2ggdGhlIGNyZWF0ZWQgZWxlbWVudHMKICogQHBhcmFtIHtbe3R5cGU6IFN0cmluZywgY29udGVudDogVVJJIFN0cmluZ31dfSBzY3JpcHRzIChvcHRpb25hbCkgYWRkaXRpb25hbCBzY3JpcHRzIHRvIGFkZCB0byB0aGUgbG9hZCBxdWV1ZQogKiBAcGFyYW0geygpPT57fX0gb25sb2FkQ2FsbGJhY2sgKG9wdGlvbmFsKSBjYWxsYmFjayB0byBpbmZvcm0gd2hlbiB0aGUgcGxheWVyIGhhcyBsb2FkZWQKICogQHBhcmFtIHthcGlCYXNlOiBTdHJpbmcsIGhlYWRlcnM6IEpTT04sIHZpc2l0b3JJZDogU3RyaW5nLCBlbnZJZDogU3RyaW5nfSBlcnJvckxvZ2dpbmdEZXRhaWxzIGlmIHByZXNlbnQsIHNlbmQgc2NyaXB0IGxvYWQgZXJyb3IKICovCmNvbnN0IGxvYWRQbGF5ZXJTY3JpcHRzID0gKHBhcmVudEVsZW1lbnQsIHNjcmlwdHMsIG9ubG9hZENhbGxiYWNrKSA9PiB7CiAgaWYgKHNjcmlwdHMubGVuZ3RoID09PSAwKSByZXR1cm4gb25sb2FkQ2FsbGJhY2sgJiYgb25sb2FkQ2FsbGJhY2soKTsKICBQcm9taXNlLmFsbCgKICAgIHNjcmlwdHMucmVkdWNlKChwcmV2LCBjdXIpID0+IHsKICAgICAgcHJldi5wdXNoKGxvYWRTY3JpcHQocGFyZW50RWxlbWVudCwgY3VyKSk7CiAgICAgIHJldHVybiBwcmV2OwogICAgfSwgW10pCiAgKQogICAgLnRoZW4oKCkgPT4gewogICAgICBvbmxvYWRDYWxsYmFjayAmJiBvbmxvYWRDYWxsYmFjaygpOwogICAgfSkKICAgIC5jYXRjaChmdW5jdGlvbihzY3JpcHQpIHsKICAgICAgY29uc29sZS5sb2coc2NyaXB0ICsgJyBmYWlsZWQgdG8gbG9hZCcpOwogICAgfSk7Cn07Cgpjb25zdCBzZXRVcGxvYWRQcm9ncmVzcyA9ICh1cGxvYWRQcm9ncmVzc0xhYmVsLCB0eXBlLCBmcmFjdGlvbikgPT4gewogIGlmICh0eXBlID09PSAnc3RhcnQnKSB7CiAgICB1cGxvYWRQcm9ncmVzc0xhYmVsLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7CiAgfQogIGlmICh0eXBlID09PSAnbm9uZScpIHsKICAgIHVwbG9hZFByb2dyZXNzTGFiZWwuc3R5bGUudmlzaWJpbGl0eSA9IEhJRERFTl9DTEFTUzsKICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdWNjZXNzJykgewogICAgdXBsb2FkUHJvZ3Jlc3NMYWJlbC5zdHlsZS52aXNpYmlsaXR5ID0gSElEREVOX0NMQVNTOwogICAgdXBsb2FkUHJvZ3Jlc3NMYWJlbC5pbm5lckhUTUwgPSAnVXBsb2FkIHN1Y2NlZWRlZCEnOwogIH0gZWxzZSB7CiAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGZyYWN0aW9uKSk7CiAgICB1cGxvYWRQcm9ncmVzc0xhYmVsLmlubmVySFRNTCA9IGBVcGxvYWRpbmcgPHNwYW4gY2xhc3M9InVsLXVwbG9hZC1wcm9ncmVzcy1sYWJlbF9fdGltZSI+JHtwZXJjZW50fSU8L3NwYW4+YDsKICAgIHVwbG9hZFByb2dyZXNzTGFiZWwuc3R5bGUuYmFja2dyb3VuZCA9IGBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICNFMEUwRUIgMCUsICNFMEUwRUIgJHtwZXJjZW50fSUsICNGQ0ZDRkQgJHtwZXJjZW50fSUsICNGQ0ZDRkQgMTAwJSlgOwogIH0KfTsKCmNvbnN0IHNldHVwUmVjb3JkRXZlbnRzSGFuZGxpbmcgPSAocGxheWVyLCBhcGlCYXNlLCByZWNvcmRFdmVudHNDYWxsYmFjaywgc2V0VXBsb2FkUHJvZ3Jlc3MsIGhlYWRlcnMpID0+IHsKICAvLyBlcnJvciBoYW5kbGluZwogIHBsYXllci5vbignZGV2aWNlRXJyb3InLCBmdW5jdGlvbigpIHsKICAgIGNvbnNvbGUubG9nKCdkZXZpY2UgZXJyb3I6JywgcGxheWVyLmRldmljZUVycm9yQ29kZSk7CiAgICBpZiAocGxheWVyLmRldmljZUVycm9yQ29kZS5tZXNzYWdlID09PSAnUGVybWlzc2lvbiBkZW5pZWQnKSB7CiAgICAgIHBsYXllci5kZXZpY2VCdXR0b24uYWRkQ2xhc3MoJ3Blcm1pc3Npb24tZGVuaWVkJyk7CiAgICAgIHJlY29yZEV2ZW50c0NhbGxiYWNrICYmIHJlY29yZEV2ZW50c0NhbGxiYWNrKFJFQ09SREVSLkVSUk9SLCB7IHR5cGU6IFJFQ09SREVSLlBFUk1JU1NJT05fREVOSUVEIH0pOwogICAgfSBlbHNlIHsKICAgICAgcmVjb3JkRXZlbnRzQ2FsbGJhY2sgJiYgcmVjb3JkRXZlbnRzQ2FsbGJhY2soUkVDT1JERVIuRVJST1IsIHsgdHlwZTogUkVDT1JERVIuT1RIRVIgfSk7CiAgICAgIHJlcG9ydEVycm9yKAogICAgICAgIG5ldyBFcnJvcihwbGF5ZXIuZGV2aWNlRXJyb3JDb2RlLm1lc3NhZ2UpLAogICAgICAgICdyZWNvcmRlckRldmljZUVycm9yJywKICAgICAgICBhcGlCYXNlLAogICAgICAgIGhlYWRlcnMsCiAgICAgICAgcGxheWVyLnBheWxvYWQudmlzaXRvcklkLAogICAgICAgIHBsYXllci5wYXlsb2FkLmVudklkCiAgICAgICk7CiAgICB9CiAgfSk7CgogIHBsYXllci5vbignZXJyb3InLCBmdW5jdGlvbihlbGVtZW50LCBlcnJvcikgewogICAgcmVwb3J0RXJyb3IoZXJyb3IgfHwgcGxheWVyLmVycm9yKCksICdyZWNvcmRlckVycm9yJywgYXBpQmFzZSwgaGVhZGVycywgcGxheWVyLnBheWxvYWQudmlzaXRvcklkLCBwbGF5ZXIucGF5bG9hZC5lbnZJZCk7CiAgfSk7CgogIHBsYXllci5vbignc3RhcnRSZWNvcmQnLCBmdW5jdGlvbihlbGVtZW50LCBlcnJvcikgewogICAgc2V0VXBsb2FkUHJvZ3Jlc3MocGxheWVyLnVwbG9hZFByb2dyZXNzTGFiZWwsICdub25lJyk7CiAgfSk7CgogIC8vIHVzZXIgY29tcGxldGVkIHJlY29yZGluZyBhbmQgc3RyZWFtIGlzIGF2YWlsYWJsZQogIHBsYXllci5vbignZmluaXNoUmVjb3JkJywgYXN5bmMgZnVuY3Rpb24oKSB7CiAgICBzZXRVcGxvYWRQcm9ncmVzcyhwbGF5ZXIudXBsb2FkUHJvZ3Jlc3NMYWJlbCwgJ3N0YXJ0JywgMCk7CgogICAgY29uc3QgeyBzdXJ2ZXlJZCwgcXVlc3Rpb25JZCwgcmVzcG9uc2VHcm91cFVpZCwgdmlzaXRvcklkLCBlbnZJZCB9ID0gcGxheWVyLnBheWxvYWQ7CiAgICBpZiAoIXN1cnZleUlkKSB7CiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9ICdpbnRlcm5hbCBlcnJvcjogbWlzc2luZyBmaWVsZHMgaW4gcGF5bG9hZCc7CiAgICAgIHJlY29yZEV2ZW50c0NhbGxiYWNrICYmIHJlY29yZEV2ZW50c0NhbGxiYWNrKFJFQ09SREVSLkVSUk9SLCB7IHR5cGU6IFJFQ09SREVSLk9USEVSIH0pOwogICAgICByZXBvcnRFcnJvcihuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSwgJ2ZpbmlzaFJlY29yZCcsIGFwaUJhc2UsIGhlYWRlcnMsIHZpc2l0b3JJZCwgZW52SWQpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwbGF5ZXIucmVjb3JkKCkuc3RvcERldmljZSgpOyAvLyB0dXJucyBvZmYgY2FtZXJhIGFuZCBsaWdodAogICAgLy8gdGhlIGJsb2Igb2JqZWN0IGNvbnRhaW5zIHRoZSByZWNvcmRlZCBkYXRhIHRoYXQKICAgIC8vIGNhbiBiZSBkb3dubG9hZGVkIGJ5IHRoZSB1c2VyLCBzdG9yZWQgb24gc2VydmVyIGV0Yy4KICAgIGNvbnN0IG1lZGlhVHlwZSA9IHBsYXllci5jYW1lcmFPZmYgPyBSRUNPUkRFUi5NRURJQV9UWVBFX0FVRElPIDogUkVDT1JERVIuTUVESUFfVFlQRV9WSURFTzsKICAgIGNvbnN0IGJvZHkgPSB7CiAgICAgIHN1cnZleUlkLAogICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgbWVkaWFUeXBlLAogICAgfTsKCiAgICBpZiAocXVlc3Rpb25JZCkgYm9keS5xdWVzdGlvbklkID0gcXVlc3Rpb25JZDsKICAgIGlmIChyZXNwb25zZUdyb3VwVWlkKSBib2R5LnJlc3BvbnNlR3JvdXBVaWQgPSByZXNwb25zZUdyb3VwVWlkOwogICAgaWYgKHZpc2l0b3JJZCkgYm9keS52aXNpdG9ySWQgPSB2aXNpdG9ySWQ7CgogICAgY29uc3QgY3JlYXRlVXBsb2FkID0gYXN5bmMgKCkgPT4gewogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaUJhc2V9LzIvZW52aXJvbm1lbnRzL2ludGVncmF0aW9ucy91cGxvYWRgLCB7CiAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgY2FjaGU6ICduby1jYWNoZScsCiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksCiAgICAgIH0pOwogICAgICBpZiAocmVzcG9uc2Uub2spIHsKICAgICAgICBjb25zdCB1cGxvYWRSZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsKICAgICAgICByZWNvcmRFdmVudHNDYWxsYmFjayAmJgogICAgICAgICAgcmVjb3JkRXZlbnRzQ2FsbGJhY2soUkVDT1JERVIuVVBMT0FEX1NUQVJURUQsIHsKICAgICAgICAgICAgW1JFQ09SREVSLlVQTE9BRF9JRF06IHVwbG9hZFJlc3BvbnNlLnVwbG9hZC5pZCwKICAgICAgICAgICAgW1JFQ09SREVSLk1FRElBX1RZUEVdOiBtZWRpYVR5cGUsCiAgICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdXBsb2FkUmVzcG9uc2UudXBsb2FkLnVybDsKICAgICAgfSBlbHNlIHsKICAgICAgICByZWNvcmRFdmVudHNDYWxsYmFjayAmJiByZWNvcmRFdmVudHNDYWxsYmFjayhSRUNPUkRFUi5FUlJPUiwgeyB0eXBlOiBSRUNPUkRFUi5PVEhFUiwgcmVzcG9uc2UgfSk7CiAgICAgICAgcmVwb3J0RXJyb3IoCiAgICAgICAgICBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBnZXQgdXBsb2FkIHJlc3BvbnNlIHdpdGggdXJsJyksCiAgICAgICAgICAnZmluaXNoUmVjb3JkJywKICAgICAgICAgIGFwaUJhc2UsCiAgICAgICAgICBoZWFkZXJzLAogICAgICAgICAgcGxheWVyLnBheWxvYWQudmlzaXRvcklkLAogICAgICAgICAgcGxheWVyLnBheWxvYWQuZW52SWQKICAgICAgICApOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9OwoKICAgIGNvbnN0IHVybCA9IGF3YWl0IGNyZWF0ZVVwbG9hZCgpOwogICAgaWYgKCF1cmwpIHJldHVybjsKCiAgICB1cGxvYWQgPSB3aW5kb3cuVXBDaHVuay5jcmVhdGVVcGxvYWQoewogICAgICAvLyBlbmRwb2ludCBjb21wdXRlZCBmcm9tIGJhY2tlbmQgc2VwYXJhdGVseSBhbmQgaGFja2VkIHRvZ2V0aGVyCiAgICAgIGVuZHBvaW50OiB1cmwsCiAgICAgIGZpbGU6IG5ldyBGaWxlKFtwbGF5ZXIucmVjb3JkZWREYXRhXSwgYHJlY29yZGluZyAke21lZGlhVHlwZX0gJHtEYXRlLm5vdygpfWApLAogICAgICBjaHVua1NpemU6IDUxMjAsIC8vIFVwbG9hZHMgdGhlIGZpbGUgaW4gfjVtYiBjaHVua3MKICAgIH0pOwogICAgdXBsb2FkLnN0YXJ0VGltZSA9IERhdGUubm93KCk7CgogICAgLy8gc3Vic2NyaWJlIHRvIGV2ZW50cwogICAgdXBsb2FkLm9uKCdlcnJvcicsIChlcnIpID0+IHsKICAgICAgc2V0VXBsb2FkUHJvZ3Jlc3MocGxheWVyLnVwbG9hZFByb2dyZXNzTGFiZWwsICdub25lJyk7CiAgICAgIHJlcG9ydEVycm9yKGVyciwgJ2ZpbmlzaFJlY29yZCcsIGFwaUJhc2UsIGhlYWRlcnMsIHBsYXllci5wYXlsb2FkLnZpc2l0b3JJZCwgcGxheWVyLnBheWxvYWQuZW52SWQpOwogICAgfSk7CgogICAgdXBsb2FkLm9uKCdwcm9ncmVzcycsIChwcm9ncmVzcykgPT4gewogICAgICBzZXRVcGxvYWRQcm9ncmVzcyhwbGF5ZXIudXBsb2FkUHJvZ3Jlc3NMYWJlbCwgJ3Byb2dyZXNzJywgcHJvZ3Jlc3MuZGV0YWlsKTsKICAgIH0pOwoKICAgIHVwbG9hZC5vbignc3VjY2VzcycsICgpID0+IHsKICAgICAgc2V0VXBsb2FkUHJvZ3Jlc3MocGxheWVyLnVwbG9hZFByb2dyZXNzTGFiZWwsICdzdWNjZXNzJyk7CiAgICAgIHJlY29yZEV2ZW50c0NhbGxiYWNrICYmIHJlY29yZEV2ZW50c0NhbGxiYWNrKFJFQ09SREVSLlVQTE9BRF9GSU5JU0hFRCk7CiAgICB9KTsKICB9KTsKfTsKCmNvbnN0IG1ha2VCdXR0b25zUGFuZWwgPSAocGxheWVyLCBjaGlsZHJlbikgPT4gewogIGNvbnN0IGJ1dHRvbnNQYW5lbCA9IG5ldyAod2luZG93LnZpZGVvanMuZ2V0Q29tcG9uZW50KCdDb21wb25lbnQnKSkocGxheWVyKTsKICBidXR0b25zUGFuZWwuYWRkQ2xhc3MoJ3VsLWJ1dHRvbnMtcGFuZWwnKTsKICBjaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB7CiAgICBidXR0b25zUGFuZWwuYWRkQ2hpbGQoY2hpbGQpOwogIH0pOwoKICBhZGRUZXh0VG9CdXR0b25zUGFuZWwoYnV0dG9uc1BhbmVsKTsKCiAgcmV0dXJuIGJ1dHRvbnNQYW5lbDsKfTsKCmNvbnN0IGFkZFRleHRUb0J1dHRvbnNQYW5lbCA9IChidXR0b25zUGFuZWwpID0+IHsKICBidXR0b25zUGFuZWwuY2hpbGRyZW4oKS5mb3JFYWNoKChidXR0b24pID0+IHsKICAgIGlmIChCVVRUT05fTkFNRV9USVRMRVtidXR0b24ubmFtZV9dKSB7CiAgICAgIGNvbnN0IGJ1dHRvblRleHRFbCA9IGNyZWF0ZUJ1dHRvblRleHQoQlVUVE9OX05BTUVfVElUTEVbYnV0dG9uLm5hbWVfXSwgYHVsLSR7QlVUVE9OX05BTUVfVElUTEVbYnV0dG9uLm5hbWVfXX1gKTsKICAgICAgY29uc3QgZ2V0QnV0dG9uRWwgPSBidXR0b24uZWxfOwoKICAgICAgZ2V0QnV0dG9uRWwuYXBwZW5kQ2hpbGQoYnV0dG9uVGV4dEVsKTsKICAgIH0KICB9KTsKfQoKY29uc3QgY3JlYXRlQnV0dG9uVGV4dCA9IChidXR0b25OYW1lLCBpZCA9ICcnKSA9PiB7CiAgY29uc3QgYnV0dG9uVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICBidXR0b25UZXh0LmNsYXNzTmFtZSA9ICd1bC1idXR0b24tdGV4dCc7CiAgYnV0dG9uVGV4dC5pbm5lckhUTUwgPSBidXR0b25OYW1lOwogIGJ1dHRvblRleHQuaWQgPSBpZDsKCiAgcmV0dXJuIGJ1dHRvblRleHQ7Cn0KCmNvbnN0IHByZXBhcmVWaWRlb1BsYXllciA9IChwbGF5ZXIsIGJ1dHRvbnNQYW5lbCwgc291cmNlLCBvbmxvYWRDYWxsYmFjaywgaXNBdWRpb1N0cmVhbSA9IGZhbHNlKSA9PiB7CiAgcGxheWVyLmFkZENsYXNzKCd1bC12aWRlby1wbGF5ZXInKTsKICBjb25zdCBjb250cm9scyA9IG5ldyAod2luZG93LnZpZGVvanMuZ2V0Q29tcG9uZW50KCdDb21wb25lbnQnKSkocGxheWVyKTsKICBjb250cm9scy5hZGRDbGFzcygndWwtY29udHJvbC1wYW5lbCcpOwogIHBsYXllci5wcm9ncmVzc0JhciA9IGNvbnRyb2xzLmFkZENoaWxkKCdQcm9ncmVzc0NvbnRyb2wnKTsKICBzb3VyY2UgJiYgcGxheWVyLnNyYyhzb3VyY2UpOwogIHBsYXllci5hdWRpb1BsYXllclBsYWNlaG9sZGVyID0gbmV3ICh3aW5kb3cudmlkZW9qcy5nZXRDb21wb25lbnQoJ0NvbXBvbmVudCcpKShwbGF5ZXIpOwogIHBsYXllci5hdWRpb1BsYXllclBsYWNlaG9sZGVyLmFkZENsYXNzKCd1bC1hdWRpby1yZWNvcmRlci1wbGFjZWhvbGRlcicpOwogIGNvbnN0IHRodW1ibmFpbCA9IHNvdXJjZSAmJiBzb3VyY2Uuc3JjID8gZ2V0UG9zdGVyVGh1bWJuYWlsKHNvdXJjZS5zcmMpIDogbnVsbDsKICBpZiAoc291cmNlICYmIChpc0F1ZGlvU3RyZWFtIHx8ICF0aHVtYm5haWwpKSB7IC8vIEhhbmRsZSBhdWRpbyBzdHJlYW0gT1Igbm9uLWV4aXN0aW5nIHRodW1ibmFpbCB3aXRoIHNvdXJjZSBwbGF5ZXIKICAgIHBsYXllci5jaGlsZHJlbigpWzBdLmNsYXNzTGlzdC5hZGQoJ3Zqcy1oaWRkZW4nKTsgLy8gaGlkZSB0aGUgdmlkZW8gc2NyZWVuIHdoZW4gY2FtZXJhIGlzIG9mZgogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7cGxheWVyLmlkKCl9X2h0bWw1X2FwaWApLnN0eWxlLmhlaWdodCA9ICcwcHgnOwogIH0gZWxzZSB7IC8vIEhhbmRsZSB2aWRlbyBzdHJlYW0KICAgIHBsYXllci5hdWRpb1BsYXllclBsYWNlaG9sZGVyLmhpZGUoKTsgLy8gbm90IGEgcmVjb3JkZXIgaW4gcGxheWJhY2sgbW9kZSBzbyBoaWRlIHBsYWNlaG9sZGVyIGlmIHRoZXJlIGlzIGEgcG9zdGVyCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtwbGF5ZXIuaWQoKX1faHRtbDVfYXBpYCkuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnOwogICAgaWYgKHRodW1ibmFpbCkgcGxheWVyLnBvc3Rlcih0aHVtYm5haWwpOwogIH0KCiAgcGxheWVyLm9uKCdwbGF5JywgKCkgPT4gewogICAgLy8gaGlkZSBhdWRpbyBwbGFjZWhvbGRlciBpbiBjYXNlIGl0IHdhcyB0b2dnbGVkIGVhcmxpZXIgd2hlbiBwb3N0ZXIgZGlkbid0IGV4aXN0CiAgICBpZiAoIWlzQXVkaW9TdHJlYW0gJiYgc291cmNlICYmICF0aHVtYm5haWwpIHsKICAgICAgdG9nZ2xlQXVkaW9QbGFjZWhvbGRlcihwbGF5ZXIsIGZhbHNlKTsKICAgIH0KICB9KTsKCiAgcGxheWVyLmFkZENoaWxkKHBsYXllci5hdWRpb1BsYXllclBsYWNlaG9sZGVyLCB7fSwgMSk7IC8vIGZpcnN0IGNoaWxkIGlzIHRoZSB2aWRlbyBlbGVtZW50IGRvIG5vdCByZXNldAogIGNvbnRyb2xzLmFkZENoaWxkKGJ1dHRvbnNQYW5lbCk7CiAgcGxheWVyLmFkZENoaWxkKGNvbnRyb2xzKTsKICBvbmxvYWRDYWxsYmFjayAmJiBvbmxvYWRDYWxsYmFjayhwbGF5ZXIpOwp9OwoKY29uc3QgcHJlcGFyZVJlY29yZGVyID0gKAogIHZpZGVvUGxheWVyQ29udGFpbmVyLAogIHBsYXllcklkLAogIHBheWxvYWQsCiAgYXBpQmFzZSwKICByZWNvcmRFdmVudHNDYWxsYmFjaywKICBzb3VyY2UsCiAgaGVhZGVycywKICBpc0F1ZGlvU3RyZWFtID0gZmFsc2UKKSA9PiB7CiAgY3VycmVudFBsYXllclNlc3Npb24gPSBEYXRlLm5vdygpOwogIGNvbnN0IHZpZGVvanMgPSB3aW5kb3cudmlkZW9qczsKICBjb25zdCBvcHRpb25zID0gewogICAgY29udHJvbHM6IGZhbHNlLAogICAgYmlnUGxheUJ1dHRvbjogZmFsc2UsCiAgICBmbHVpZDogZmFsc2UsCiAgICB3aWR0aDogMTI4MCwKICAgIGhlaWdodDogNzIwLAogICAgcGxheXNpbmxpbmU6IHRydWUsCiAgICBwbHVnaW5zOiB7CiAgICAgIHJlY29yZDogewogICAgICAgIGF1ZGlvOiB0cnVlLAogICAgICAgIHZpZGVvOiB7CiAgICAgICAgICAvLyB2aWRlbyBjb25zdHJhaW50czogc2V0IHJlc29sdXRpb24gb2YgY2FtZXJhCiAgICAgICAgICBtYW5kYXRvcnk6IHsKICAgICAgICAgICAgbWluV2lkdGg6IDEyODAsCiAgICAgICAgICAgIG1pbkhlaWdodDogNzIwLAogICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIC8vIGRpbWVuc2lvbnMgb2YgY2FwdHVyZWQgdmlkZW8gZnJhbWVzCiAgICAgICAgZnJhbWVXaWR0aDogMTI4MCwKICAgICAgICBmcmFtZUhlaWdodDogNzIwLAogICAgICAgIG1heExlbmd0aDogNjAwLCAvLyBzZXQgMTAtbWluIG1heCBsZW5ndGgKICAgICAgICBhdXRvTXV0ZURldmljZTogdHJ1ZSwKICAgICAgfSwKICAgIH0sCiAgfTsKCiAgY29uc3QgcGxheWVyID0gdmlkZW9qcyhwbGF5ZXJJZCwgb3B0aW9ucyk7CiAgcGxheWVyLnBheWxvYWQgPSBwYXlsb2FkOwogIGNvbnN0IHJlc3RhcnREZXZpY2UgPSAoY2FtZXJhT2ZmKSA9PiB7CiAgICBjb25zdCBjYW1lcmFPbkNsYXNzID0gQ0FNRVJBX09GRl9CVVRUT05fQ0xBU1M7CiAgICBjb25zdCBjYW1lcmFPZmZDbGFzcyA9IENBTUVSQV9PRkZfQlVUVE9OX0NMQVNTICsgJy1hdWRpby1vbmx5JzsKICAgIHNldFVwbG9hZFByb2dyZXNzKHBsYXllci51cGxvYWRQcm9ncmVzc0xhYmVsLCAnbm9uZScpOwogICAgdXBsb2FkICYmIHVwbG9hZC5zdGFydFRpbWUgPj0gY3VycmVudFBsYXllclNlc3Npb24gJiYgdXBsb2FkLmFib3J0KCk7CiAgICBjb25zdCBjYW1lcmFCdXR0b25UeHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndWwtY2FtZXJhLWJ1dHRvbicpCiAgICBpZiAoY2FtZXJhT2ZmKSB7CiAgICAgIHBsYXllci5jaGlsZHJlbigpWzBdLmNsYXNzTGlzdC5hZGQoJ3Zqcy1oaWRkZW4nKTsgLy8gaGlkZSB0aGUgdmlkZW8gc2NyZWVuIHdoZW4gY2FtZXJhIGlzIG9mZgogICAgICBjYW1lcmFPZmZCdXR0b24ucmVtb3ZlQ2xhc3MoY2FtZXJhT25DbGFzcyk7CiAgICAgIGNhbWVyYU9mZkJ1dHRvbi5hZGRDbGFzcyhjYW1lcmFPZmZDbGFzcyk7CiAgICAgIGNhbWVyYUJ1dHRvblR4dC5pbm5lckhUTUwgPSBCVVRUT05fTkFNRV9USVRMRS5UdXJuT25DYW1lcmE7CiAgICAgIHBsYXllci5hdWRpb1BsYXllclBsYWNlaG9sZGVyLnJlbW92ZUNsYXNzKCd2anMtaGlkZGVuJyk7CiAgICAgIHdpbmRvdy5uYXZpZ2F0b3IubWVkaWFEZXZpY2VzCiAgICAgICAgLmdldFVzZXJNZWRpYSh7IHZpZGVvOiB0cnVlLCBhdWRpbzogdHJ1ZSB9KQogICAgICAgIC50aGVuKChzdHJlYW0pID0+IHsKICAgICAgICAgIHBsYXllci5yZWNvcmQoKS5vbkRldmljZVJlYWR5KHN0cmVhbSk7CiAgICAgICAgICBzdHJlYW0uZ2V0VmlkZW9UcmFja3MoKS5mb3JFYWNoKChzdHJlYW0pID0+IHsKICAgICAgICAgICAgc3RyZWFtLnN0b3AoKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pCiAgICAgICAgLmNhdGNoKHBsYXllci5yZWNvcmQoKS5vbkRldmljZUVycm9yLmJpbmQocGxheWVyLnJlY29yZCgpKSk7CiAgICB9IGVsc2UgewogICAgICBwbGF5ZXIuY2hpbGRyZW4oKVswXS5jbGFzc0xpc3QucmVtb3ZlKCd2anMtaGlkZGVuJyk7CiAgICAgIHBsYXllci5yZWNvcmQoKS5nZXREZXZpY2UoKTsKICAgICAgY2FtZXJhT2ZmQnV0dG9uLnJlbW92ZUNsYXNzKGNhbWVyYU9mZkNsYXNzKTsKICAgICAgY2FtZXJhT2ZmQnV0dG9uLmFkZENsYXNzKGNhbWVyYU9uQ2xhc3MpOwogICAgICBjYW1lcmFCdXR0b25UeHQuaW5uZXJIVE1MID0gQlVUVE9OX05BTUVfVElUTEUuVHVybk9mZkNhbWVyYTsKICAgICAgcGxheWVyLmF1ZGlvUGxheWVyUGxhY2Vob2xkZXIuYWRkQ2xhc3MoJ3Zqcy1oaWRkZW4nKTsKICAgIH0KICB9OwogIGNvbnN0IGRlbGV0ZUJ1dHRvbiA9IG5ldyAodmlkZW9qcy5nZXRDb21wb25lbnQoJ0J1dHRvbicpKShwbGF5ZXIsIHsKICAgIGNsaWNrSGFuZGxlcjogKCkgPT4gewogICAgICBpZiAoZGVsZXRlQnV0dG9uLmhhc0NsYXNzKEhJRERFTl9DTEFTUykpIHJldHVybjsKICAgICAgcmVzdGFydERldmljZShwbGF5ZXIuY2FtZXJhT2ZmKTsKICAgICAgcmVjb3JkRXZlbnRzQ2FsbGJhY2soUkVDT1JERVIuREVMRVRFLCB7fSk7CiAgICAgIGNhbWVyYU9mZkJ1dHRvbi5yZW1vdmVDbGFzcyhISURERU5fQ0xBU1MpOwogICAgICBkZWxldGVCdXR0b24uYWRkQ2xhc3MoSElEREVOX0NMQVNTKTsKICAgIH0sCiAgfSk7CiAgZGVsZXRlQnV0dG9uLmFkZENsYXNzKCd1bC12aWRlby1yZWNvcmRlci1kZWxldGUtYnV0dG9uJyk7CiAgZGVsZXRlQnV0dG9uLmVsXy5hcHBlbmRDaGlsZChjcmVhdGVCdXR0b25UZXh0KEJVVFRPTl9OQU1FX1RJVExFLkRlbGV0ZUJ1dHRvbiwgJ3VsLWRlbGV0ZS1idXR0b24nKSk7CgogIGNvbnN0IHZpZGVvUGxheWVyRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwbGF5ZXJJZCk7CgogIGNvbnN0IHVwZGF0ZVBsYXllckRpc3BsYXkgPSAoKSA9PiB7CiAgICBpZiAodmlkZW9QbGF5ZXJFbC5jbGFzc0xpc3QuY29udGFpbnMoJ3Zqcy1mdWxsc2NyZWVuJykgJiYgcGxheWVyLmNhbWVyYU9mZikgdmlkZW9QbGF5ZXJFbC5zdHlsZS5kaXNwbGF5ID0gJ3RhYmxlJzsKICAgIGVsc2UgdmlkZW9QbGF5ZXJFbC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwogIH0KCiAgdXBkYXRlUGxheWVyRGlzcGxheSgpOwoKICBjb25zdCBjYW1lcmFPZmZCdXR0b24gPSBuZXcgKHZpZGVvanMuZ2V0Q29tcG9uZW50KCdCdXR0b24nKSkocGxheWVyLCB7CiAgICBjbGlja0hhbmRsZXI6ICgpID0+IHsKICAgICAgaWYgKHBsYXllci5yZWNvcmQoKS5pc1JlY29yZGluZygpKSByZXR1cm47CiAgICAgIHBsYXllci5jYW1lcmFPZmYgPSAhcGxheWVyLmNhbWVyYU9mZjsKICAgICAgcmVzdGFydERldmljZShwbGF5ZXIuY2FtZXJhT2ZmKTsKICAgICAgIWRlbGV0ZUJ1dHRvbi5oYXNDbGFzcyhISURERU5fQ0xBU1MpICYmIGRlbGV0ZUJ1dHRvbi5hZGRDbGFzcyhISURERU5fQ0xBU1MpOwogICAgICByZWNvcmRFdmVudHNDYWxsYmFjayhSRUNPUkRFUi5ERUxFVEUsIHt9KTsKICAgICAgdXBkYXRlUGxheWVyRGlzcGxheSgpOwogICAgfSwKICB9KTsKICBjYW1lcmFPZmZCdXR0b24uYWRkQ2xhc3MoQ0FNRVJBX09GRl9CVVRUT05fQ0xBU1MpOwogIGNhbWVyYU9mZkJ1dHRvbi5lbF8uYXBwZW5kQ2hpbGQoY3JlYXRlQnV0dG9uVGV4dChCVVRUT05fTkFNRV9USVRMRS5UdXJuT2ZmQ2FtZXJhLCAndWwtY2FtZXJhLWJ1dHRvbicpKTsKCiAgY29uc3QgcmVjb3JkVG9nZ2xlID0gbmV3ICh2aWRlb2pzLmdldENvbXBvbmVudCgnQnV0dG9uJykpKHBsYXllciwgewogICAgY2xpY2tIYW5kbGVyOiAoKSA9PiB7CiAgICAgIGNvbnN0IHJlY29yZEJ1dHRvblRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndWwtcmVjb3JkZXItdG9nZ2xlJyk7CiAgICAgIGlmICghcGxheWVyLnJlY29yZCgpLmlzUmVjb3JkaW5nKCkpIHsKICAgICAgICBjb25zdCBnZXRDb3VudGRvd25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1bC1yZWNvcmRpbmctY291bnRkb3duLXNjcmVlbicpOwogICAgICAgIGlmIChnZXRDb3VudGRvd25FbCkgeyAvLyBTdG9wcGluZyByZWNvcmRlciBiZWZvcmUgcmVjb3JkaW5nIHN0YXJ0cwogICAgICAgICAgZ2V0Q291bnRkb3duRWwucmVtb3ZlKCk7CiAgICAgICAgICBpZiAocmVjb3JkQnV0dG9uVGV4dCkgcmVjb3JkQnV0dG9uVGV4dC5pbm5lckhUTUwgPSBCVVRUT05fTkFNRV9USVRMRS5SZWNvcmRCdXR0b247CiAgICAgICAgICByZXN0YXJ0RGV2aWNlKHBsYXllci5jYW1lcmFPZmYpOwogICAgICAgICAgcmVjb3JkRXZlbnRzQ2FsbGJhY2soUkVDT1JERVIuREVMRVRFLCB7fSk7CiAgICAgICAgICBjYW1lcmFPZmZCdXR0b24ucmVtb3ZlQ2xhc3MoSElEREVOX0NMQVNTKTsKICAgICAgICAgIGRlbGV0ZUJ1dHRvbi5hZGRDbGFzcyhISURERU5fQ0xBU1MpOwogICAgICAgICAgcmVjb3JkVG9nZ2xlLnJlbW92ZUNsYXNzKFJFQ09SRElOR19JTl9TRVNTSU9OKTsKICAgICAgICAgIGV4cGFuZFRvZ2dsZS5zaG93KCk7CiAgICAgICAgfSBlbHNlIHsgLy8gc3RhcnQgcmVjb3JkaW5nCiAgICAgICAgICByZWNvcmRUb2dnbGUuYWRkQ2xhc3MoUkVDT1JESU5HX0lOX1NFU1NJT04pOwogICAgICAgICAgZXhwYW5kVG9nZ2xlLmhpZGUoKTsKICAgICAgICAgIGNhbWVyYU9mZkJ1dHRvbi5hZGRDbGFzcyhISURERU5fQ0xBU1MpOwogICAgICAgICAgZGVsZXRlQnV0dG9uLmFkZENsYXNzKEhJRERFTl9DTEFTUyk7CiAgICAgICAgICBpZiAocmVjb3JkQnV0dG9uVGV4dCkgcmVjb3JkQnV0dG9uVGV4dC5pbm5lckhUTUwgPSBCVVRUT05fTkFNRV9USVRMRS5TdG9wQnV0dG9uOwoKICAgICAgICAgIGNvbnN0IHJlY29yZGluZ1ByZXZpZXcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgIHJlY29yZGluZ1ByZXZpZXcuaWQgPSAndWwtcmVjb3JkaW5nLWNvdW50ZG93bi1zY3JlZW4nOwogICAgICAgICAgdmlkZW9QbGF5ZXJFbC5pbnNlcnRCZWZvcmUocmVjb3JkaW5nUHJldmlldywgdmlkZW9QbGF5ZXJFbC5jaGlsZHJlblsxXSk7CiAgICAgICAgICByZWNvcmRpbmdQcmV2aWV3LnN0eWxlLmhlaWdodCA9IGAke3ZpZGVvUGxheWVyRWwub2Zmc2V0SGVpZ2h0fXB4YDsKICAgICAgICAgIHJlY29yZGluZ0NvdW50ZG93blN0YXJ0KHBsYXllciwgMyk7IC8vIHJlY29yZGluZyBzdGFydHMgb25jZSBjb3VudGRvd24gaXMgZmluaXNoZWQKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxheWVyLnJlY29yZCgpLnN0b3AoKTsKICAgICAgICBpZiAocmVjb3JkQnV0dG9uVGV4dCkgcmVjb3JkQnV0dG9uVGV4dC5pbm5lckhUTUwgPSBCVVRUT05fTkFNRV9USVRMRS5SZWNvcmRCdXR0b247CiAgICAgICAgcmVjb3JkVG9nZ2xlLnJlbW92ZUNsYXNzKFJFQ09SRElOR19JTl9TRVNTSU9OKTsKICAgICAgICBkZWxldGVCdXR0b24ucmVtb3ZlQ2xhc3MoSElEREVOX0NMQVNTKTsKICAgICAgfQogICAgfSwKICB9KTsKICByZWNvcmRUb2dnbGUuYWRkQ2xhc3MoJ3VsLXZpZGVvLXJlY29yZGVyLXRvZ2dsZS1idXR0b24nKTsKICByZWNvcmRUb2dnbGUuZWxfLmFwcGVuZENoaWxkKGNyZWF0ZUJ1dHRvblRleHQoQlVUVE9OX05BTUVfVElUTEUuUmVjb3JkQnV0dG9uLCAndWwtcmVjb3JkZXItdG9nZ2xlJykpOwoKICBjb25zdCB1cGxvYWRQcm9ncmVzc0xhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpOwogIHVwbG9hZFByb2dyZXNzTGFiZWwuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nOwogIHVwbG9hZFByb2dyZXNzTGFiZWwuY2xhc3NOYW1lID0gJ3VsLXVwbG9hZC1wcm9ncmVzcy1sYWJlbCc7CiAgdmlkZW9QbGF5ZXJDb250YWluZXIuYXBwZW5kQ2hpbGQodXBsb2FkUHJvZ3Jlc3NMYWJlbCk7CiAgcGxheWVyLnVwbG9hZFByb2dyZXNzTGFiZWwgPSB1cGxvYWRQcm9ncmVzc0xhYmVsOwoKICBjb25zdCBidXR0b25zUGFuZWwgPSBtYWtlQnV0dG9uc1BhbmVsKHBsYXllciwgWwogICAgZGVsZXRlQnV0dG9uLAogICAgY2FtZXJhT2ZmQnV0dG9uLAogICAgJ1BsYXlUb2dnbGUnLAogICAgcmVjb3JkVG9nZ2xlLAogICAgJ0Z1bGxzY3JlZW5Ub2dnbGUnLAogIF0pOwoKICBjb25zdCBleHBhbmRUb2dnbGUgPSBidXR0b25zUGFuZWwuY2hpbGRyZW4oKS5maW5kKChjaGlsZCkgPT4gY2hpbGQubmFtZV8gPT09ICdGdWxsc2NyZWVuVG9nZ2xlJyk7CiAgaWYgKGV4cGFuZFRvZ2dsZS5oYXNDbGFzcygndmpzLWRpc2FibGVkJykpIHsKICAgIGV4cGFuZFRvZ2dsZS5oaWRlKCk7CiAgfQoKICAvLyBoaWRlIHBsYXkgdG9nZ2xlIGZvciByZWNvcmRlcgogIGNvbnN0IHBsYXlUb2dnbGUgPSBidXR0b25zUGFuZWwuY2hpbGRyZW4oKS5maW5kKChjaGlsZCkgPT4gY2hpbGQubmFtZV8gPT09ICdQbGF5VG9nZ2xlJyk7CiAgcGxheVRvZ2dsZS5oaWRlKCk7CgogIHNvdXJjZSAmJiBjYW1lcmFPZmZCdXR0b24uYWRkQ2xhc3MoSElEREVOX0NMQVNTKTsKICAhc291cmNlICYmIGRlbGV0ZUJ1dHRvbi5hZGRDbGFzcyhISURERU5fQ0xBU1MpOwoKICBwcmVwYXJlVmlkZW9QbGF5ZXIocGxheWVyLCBidXR0b25zUGFuZWwsIHNvdXJjZSwgZmFsc2UsIGlzQXVkaW9TdHJlYW0pOwoKICBwbGF5ZXIub24oJ3N0b3BSZWNvcmQnLCAoKSA9PiB7CiAgICByZWNvcmRUb2dnbGUuaGlkZSgpOwogICAgcGxheVRvZ2dsZS5zaG93KCk7CiAgICBleHBhbmRUb2dnbGUuc2hvdygpOwogICAgZGVsZXRlQnV0dG9uLnJlbW92ZUNsYXNzKEhJRERFTl9DTEFTUyk7CiAgfSk7CgogIHBsYXllci5vbignZGV2aWNlUmVhZHknLCAoKSA9PiB7CiAgICByZWNvcmRUb2dnbGUuc2hvdygpOwogICAgcGxheVRvZ2dsZS5oaWRlKCk7CiAgICBkZWxldGVCdXR0b24uYWRkQ2xhc3MoSElEREVOX0NMQVNTKTsKICB9KTsKCiAgc2V0dXBSZWNvcmRFdmVudHNIYW5kbGluZyhwbGF5ZXIsIGFwaUJhc2UsIHJlY29yZEV2ZW50c0NhbGxiYWNrLCBzZXRVcGxvYWRQcm9ncmVzcywgaGVhZGVycyk7CiAgLy8gU2hvdyB2aWRlbyBpZiBzb3VyY2UgZXhpc3QuCiAgaWYgKHNvdXJjZSkgewogICAgcGxheWVyLmRldmljZUJ1dHRvbiAmJiBwbGF5ZXIuZGV2aWNlQnV0dG9uLmhpZGUoKTsKICAgIHBsYXllci5zcmMoc291cmNlKTsKICAgIHBsYXlUb2dnbGUuc2hvdygpOwogICAgcmVjb3JkVG9nZ2xlLmhpZGUoKTsKICAgIGRlbGV0ZUJ1dHRvbi5yZW1vdmVDbGFzcyhISURERU5fQ0xBU1MpOwogIH0KCiAgLy8gTG9va2luZyBmb3Igc2F2ZWQgcGVybWlzc2lvbnMgaW4gYnJvd3Nlci4gTm90ZSwgbmF2aWdhdG9yLnBlcm1pc3Npb25zIGlzIGV4cGVyaW1lbnRhbCBvbiBzb21lIGJyb3dzZXJzLgogIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9QZXJtaXNzaW9ucy9xdWVyeQogIGNvbnN0IHBlcm1pc3Npb25EZXNjcmlwdG9ycyA9IFt7IG5hbWU6ICdtaWNyb3Bob25lJyB9XTsKICAhcGxheWVyLmNhbWVyYU9mZiAmJiBwZXJtaXNzaW9uRGVzY3JpcHRvcnMucHVzaCh7IG5hbWU6ICdjYW1lcmEnIH0pOwogIFByb21pc2UuYWxsKHBlcm1pc3Npb25EZXNjcmlwdG9ycy5tYXAoKHBlcm1pc3Npb25EZXNjcmlwdG9yKSA9PiBuYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkocGVybWlzc2lvbkRlc2NyaXB0b3IpKSkKICAudGhlbigoc3RhdHVzKSA9PiB7CiAgICBjb25zdCBhbGxHcmFudGVkID0gc3RhdHVzLnJlZHVjZSgocHJldiwgY3VyKSA9PiB7CiAgICAgIHJldHVybiBwcmV2ICYgKGN1ci5zdGF0ZSA9PT0gJ2dyYW50ZWQnKTsKICAgIH0sIHRydWUpOwogICAgaWYgKGFsbEdyYW50ZWQgJiYgcGxheWVyKSB7CiAgICAgIHBsYXllci5kZXZpY2VCdXR0b24gJiYgcGxheWVyLmRldmljZUJ1dHRvbi5oaWRlKCk7CiAgICAgICFzb3VyY2UgJiYgcGxheWVyLnJlY29yZCgpLmdldERldmljZSgpOwogICAgfQogIH0pLmNhdGNoKChlKSA9PiB7CiAgICAvLyBmYWlsIHNpbGVudGx5CiAgfSkKfTsKCi8vIFJlY3Vyc2l2ZSBmdW5jdGlvbiB0byB1cGRhdGUgdGhlIGNvdW50ZG93biBvbiByZWNvcmRpbmcgcGxheWVyIHNjcmVlbgpjb25zdCByZWNvcmRpbmdDb3VudGRvd25TdGFydCA9IChwbGF5ZXIsIHN0YXJ0aW5nTnVtID0gMykgPT4gewogIGNvbnN0IGdldENvdW50ZG93bkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VsLXJlY29yZGluZy1jb3VudGRvd24tc2NyZWVuJyk7CiAgaWYgKGdldENvdW50ZG93bkVsICYmIHN0YXJ0aW5nTnVtID09PSAwKSB7CiAgICAvLyByZW1vdmUgcmVjb3JkaW5nIHNjcmVlbiBvbmNlIGl0IGhpdHMgMCB0byBzdGFydCB0aGUgcmVjb3JkaW5nLgogICAgZ2V0Q291bnRkb3duRWwucmVtb3ZlKCk7CiAgICBwbGF5ZXIucmVjb3JkKCkuc3RhcnQoKTsKICB9IGVsc2UgaWYgKGdldENvdW50ZG93bkVsKSB7CiAgICBnZXRDb3VudGRvd25FbC5pbm5lckhUTUwgPSBgPHNwYW4gY2xhc3M9J3VsLWNvdW50ZG93bi10ZXh0Jz5SZWNvcmRpbmcgaW4uLi4gJHtzdGFydGluZ051bX08L3NwYW4+YDsKCiAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgcmVjb3JkaW5nQ291bnRkb3duU3RhcnQocGxheWVyLCBzdGFydGluZ051bSAtIDEpOwogICAgfSwgMTAwMCk7CiAgfQp9Cgpjb25zdCBjcmVhdGVWaWRlb1BsYXllckNvbnRhaW5lciA9IChwbGF5ZXJJZCkgPT4gewogIGNvbnN0IHZpZGVvUGxheWVyQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgdmlkZW9QbGF5ZXJDb250YWluZXIuY2xhc3NOYW1lID0gJ3VsLXZpZGVvLWNvbnRhaW5lcic7CiAgdmlkZW9QbGF5ZXJDb250YWluZXIuYXBwZW5kQ2hpbGQoc3Bpbm5lcihwbGF5ZXJJZCkpOwogIHJldHVybiB2aWRlb1BsYXllckNvbnRhaW5lcjsKfTsKCmNvbnN0IGNyZWF0ZVZpZGVvUGxheWVyQ29tcG9uZW50cyA9IChwbGF5ZXJJZCwgdmlkZW9QbGF5ZXJDb250YWluZXIpID0+IHsKICBjb25zdCB2aWRlb1BsYXllciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7CiAgdmlkZW9QbGF5ZXIuaWQgPSBwbGF5ZXJJZDsKICB2aWRlb1BsYXllci5jbGFzc05hbWUgPSAndmlkZW8tanMgdmpzLWRlZmF1bHQtc2tpbiB1bC12aWRlby1wbGF5ZXItdmlkZW8nOwoKICBjb25zdCBjb21wYXRpYmlsaXR5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpOwogIGNvbXBhdGliaWxpdHkuY2xhc3NOYW1lID0gJ3Zqcy1uby1qcyc7CiAgY29tcGF0aWJpbGl0eS5pbm5lckhUTUwgPSAnVG8gdmlldyB0aGlzIHZpZGVvIHBsZWFzZSBlbmFibGUgSmF2YVNjcmlwdCwgYW5kIGNvbnNpZGVyIHVwZ3JhZGluZyB0byBhIHdlYiBicm93c2VyIHRoYXQnOwogIGNvbnN0IGNvbXBhdGliaWxpdHlMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogIGNvbXBhdGliaWxpdHlMaW5rLmhyZWYgPSAnaHR0cHM6Ly92aWRlb2pzLmNvbS9odG1sNS12aWRlby1zdXBwb3J0Lyc7CiAgY29tcGF0aWJpbGl0eUxpbmsudGFyZ2V0ID0gJ19ibGFuayc7CiAgY29tcGF0aWJpbGl0eUxpbmsuaW5uZXJIVE1MID0gJ3N1cHBvcnRzIEhUTUw1IHZpZGVvJzsKICBjb21wYXRpYmlsaXR5LmFwcGVuZENoaWxkKGNvbXBhdGliaWxpdHlMaW5rKTsKICB2aWRlb1BsYXllci5hcHBlbmRDaGlsZChjb21wYXRpYmlsaXR5KTsKICB2aWRlb1BsYXllckNvbnRhaW5lci5hcHBlbmRDaGlsZCh2aWRlb1BsYXllcik7CiAgcmV0dXJuIHZpZGVvUGxheWVyQ29udGFpbmVyOwp9OwoKY29uc3QgdG9nZ2xlQXVkaW9QbGFjZWhvbGRlciA9IChwbGF5ZXIsIGlzQXVkaW9TdHJlYW0pID0+IHsKICBpZiAoaXNBdWRpb1N0cmVhbSkgewogICAgcGxheWVyLmNoaWxkcmVuKClbMF0uY2xhc3NMaXN0LmFkZCgndmpzLWhpZGRlbicpOyAvLyBoaWRlIHRoZSB2aWRlbyBzY3JlZW4gd2hlbiBjYW1lcmEgaXMgb2ZmCiAgICBwbGF5ZXIuYXVkaW9QbGF5ZXJQbGFjZWhvbGRlci5zaG93KCk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtwbGF5ZXIuaWQoKX1faHRtbDVfYXBpYCkuc3R5bGUuaGVpZ2h0ID0gJzBweCc7CiAgfSBlbHNlIHsKICAgIHBsYXllci5jaGlsZHJlbigpWzBdLmNsYXNzTGlzdC5yZW1vdmUoJ3Zqcy1oaWRkZW4nKTsgLy8gaGlkZSB0aGUgdmlkZW8gc2NyZWVuIHdoZW4gY2FtZXJhIGlzIG9mZgogICAgcGxheWVyLmF1ZGlvUGxheWVyUGxhY2Vob2xkZXIuaGlkZSgpOyAvLyBub3QgYSByZWNvcmRlciBpbiBwbGF5YmFjayBtb2RlIHNvIGhpZGUgcGxhY2Vob2xkZXIKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke3BsYXllci5pZCgpfV9odG1sNV9hcGlgKS5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7CiAgfQp9OwoKLy8gcHVibGljIGFwaQoKLyoqCiAqCiAqIEBwYXJhbSB7U3RyaW5nfSBwbGF5ZXJJZCB1bmlxdWUgaWQgZm9yIHRoZSB2aWRlbyBwbGF5ZXIncyBjb250YWluZXIKICogQHBhcmFtIHt7c3JjOiBTdHJpbmcsIHR5cGU6IFN0cmluZ319IHNvdXJjZSBzcmMgcHJvcGVydGllcyB0byBiZSBwbHVnZ2VkIGludG8gdGhlIHBsYXllciwgZXguIHtzcmM6ICd1cmwnLCB0eXBlOiAnYXBwbGljYXRpb24veC1tcGVnVVJMJyB9CiAqIEBwYXJhbSB7Kn0gb25sb2FkQ2FsbGJhY2sgKG9wdGlvbmFsKSBjYWxsYmFjayB0byBpbmZvcm0gd2hlbiB0aGUgcGxheWVyIGhhcyBsb2FkZWQKICogQHBhcmFtIHtib29sZWFufSBpc0F1ZGlvU3RyZWFtIHRydWUgaWYgbWVkaWEgdHlwZSBmb3IgdGhlIHBsYXliYWNrIGlzIGF1ZGlvIG9ubHkgZGVmYXVsdCBmYWxzZQogKiBAcGFyYW0ge1N0cmluZ30gYXBpQmFzZSBiYXNlIHVybCBmb3IgdGhlIGFwaSBjYWxscy4gZGVmYXVsdCBpcyBwcm9kIGFwaQogKiBAcmV0dXJucyBodG1sIGVsZW1lbnQgZm9yIHRoZSB2aWRlbyBwbGF5ZXIgY29udGFpbmVyCiAqLwpjb25zdCB2aWRlb1BsYXllciA9IChjb250YWluZXJJZCwgc291cmNlLCBvbmxvYWRDYWxsYmFjaywgaXNBdWRpb1N0cmVhbSA9IGZhbHNlLCBhcGlCYXNlID0gJ2h0dHBzOi8vYXBpLnNwcmlnLmNvbScpID0+IHsKICBjb25zdCBwbGF5ZXJJZCA9IGNvbnRhaW5lcklkICsgVklERU9fUExBWUVSX1BPU1RGSVg7CiAgY29uc3QgdmlkZW9QbGF5ZXJDb250YWluZXIgPSBjcmVhdGVWaWRlb1BsYXllckNvbnRhaW5lcihwbGF5ZXJJZCk7CgogIC8vIEFkZCBldmVudCBsaXN0ZW5lciBiZWZvcmUgbG9hZGluZyB0aGlyZCBwYXJ0eSBzY3JpcHRzIGluIHRvIGxvZyBhbnkgQ1NQIHZpb2xhdGlvbnMKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzZWN1cml0eXBvbGljeXZpb2xhdGlvbiIsIChlKSA9PiB7CiAgICByZXBvcnRFcnJvcigKICAgICAgbmV3IEVycm9yKGBWb2ljZSAmIFZpZGVvIGZlYXR1cmUgdmlvbGF0ZXMgJHtlLnZpb2xhdGVkRGlyZWN0aXZlfSB3ZWIgcGFnZSBDU1AgcG9saWNpZXMgZm9yIHRoZSBxdWVzdGlvbiBwbGF5ZXIuYCksCiAgICAgICdwbGF5ZXJEZXZpY2VFcnJvcicsCiAgICAgIGFwaUJhc2UsCiAgICAgIHt9LAogICAgKTsKICB9KTsKCiAgbG9hZFBsYXllclNjcmlwdHModmlkZW9QbGF5ZXJDb250YWluZXIsIHZpZGVvUGxheWVyU2NyaXB0cywgKCkgPT4gewogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2V0U3Bpbm5lcklkKHBsYXllcklkKSkucmVtb3ZlKCk7CiAgICBjcmVhdGVWaWRlb1BsYXllckNvbXBvbmVudHMocGxheWVySWQsIHZpZGVvUGxheWVyQ29udGFpbmVyKTsKICAgIGNvbnN0IG9wdGlvbnMgPSB7CiAgICAgIHBsYXlzaW5saW5lOiB0cnVlLAogICAgICBwbGF5YmFja1JhdGVzOiBbMC41LCAxLCAxLjUsIDJdLAogICAgfQoKICAgIGNvbnN0IHBsYXllciA9IHdpbmRvdy52aWRlb2pzKHBsYXllcklkLCBvcHRpb25zKTsKICAgIGNvbnN0IGJ1dHRvbnNQYW5lbCA9IG1ha2VCdXR0b25zUGFuZWwocGxheWVyLCBbJ1BsYXliYWNrUmF0ZU1lbnVCdXR0b24nLCAnUGxheVRvZ2dsZScsICdGdWxsc2NyZWVuVG9nZ2xlJ10pOwogICAgY29uc3QgZXhwYW5kVG9nZ2xlID0gYnV0dG9uc1BhbmVsLmNoaWxkcmVuKCkuZmluZCgoY2hpbGQpID0+IGNoaWxkLm5hbWVfID09PSAnRnVsbHNjcmVlblRvZ2dsZScpOwogICAgaWYgKGV4cGFuZFRvZ2dsZS5oYXNDbGFzcygndmpzLWRpc2FibGVkJykpIHsKICAgICAgZXhwYW5kVG9nZ2xlLmhpZGUoKTsKICAgIH0KICAgIHByZXBhcmVWaWRlb1BsYXllcigKICAgICAgcGxheWVyLAogICAgICBidXR0b25zUGFuZWwsCiAgICAgIHNvdXJjZSwKICAgICAgb25sb2FkQ2FsbGJhY2ssCiAgICAgIGlzQXVkaW9TdHJlYW0KICAgICk7CiAgfSk7CiAgcmV0dXJuIHZpZGVvUGxheWVyQ29udGFpbmVyOwp9OwoKLyoqCiAqCiAqIEBwYXJhbSB7U3RyaW5nfSBwbGF5ZXJJZCB1bmlxdWUgaWQgZm9yIHRoZSB2aWRlbyBwbGF5ZXIncyBjb250YWluZXIKICogQHBhcmFtIHtKU09OfSBwYXlsb2FkIGFwaS1yZWxhdGVkIGpzb24gY29uZmlndXJhdGlvbiBvYmplY3QKICogQHBhcmFtIHtTdHJpbmd9IGFwaUJhc2UgYmFzZSB1cmwgZm9yIHRoZSBhcGkgY2FsbHMuIGRlZmF1bHQgaXMgcHJvZCBhcGkKICogQHBhcmFtIHsoc3RhdHVzOiBTdHJpbmcsIGRhdGE6IE9iamVjdCkgPT4gVm9pZH0gcmVjb3JkRXZlbnRzQ2FsbGJhY2sgY2FsbGJhY2sgdG8gdGhlIG91dHNpZGUgd29ybGQgdG8gbm90aWZ5IHVwbG9hZCBzdGF0dXMKICogQHBhcmFtIHt7c3JjOiBTdHJpbmcsIHR5cGU6IFN0cmluZ319IHNvdXJjZSBzcmMgcHJvcGVydGllcyB0byBiZSBwbHVnZ2VkIGludG8gdGhlIHBsYXllciwgZXguIHtzcmM6ICd1cmwnLCB0eXBlOiAnYXBwbGljYXRpb24veC1tcGVnVVJMJyB9CiAqIEBwYXJhbSB7J3gtdWwtdmlkZW8tcmVjb3JkZXItb3JpZ2luJzogJ2Rhc2hib2FyZCcgfCAnc2RrJ30gaGVhZGVycyByZXF1ZXN0IGhlYWRlcnMgZm9yIGVycm9yIGxvZ2dpbmcgKHBvdGVudGlhbGx5IGNvbnRhaW5zIGFkZGl0aW9uYWwgaGVhZGVycykKICogQHBhcmFtIHtib29sZWFufSBpc0F1ZGlvU3RyZWFtIHRydWUgaWYgbWVkaWEgdHlwZSBmb3IgdGhlIHBsYXliYWNrIGlzIGF1ZGlvIG9ubHkgZGVmYXVsdCBmYWxzZQogKiBAcmV0dXJucyBodG1sIGVsZW1lbnQgZm9yIHRoZSB2aWRlbyBwbGF5ZXIgY29udGFpbmVyCiAqLwpjb25zdCB2aWRlb1JlY29yZGVyUGxheWVyID0gKAogIHBsYXllcklkLAogIHBheWxvYWQgPSB7fSwKICBhcGlCYXNlID0gJ2h0dHBzOi8vYXBpLnVzZXJsZWFwLmNvbScsCiAgcmVjb3JkRXZlbnRzQ2FsbGJhY2ssCiAgc291cmNlLAogIGhlYWRlcnMsCiAgaXNBdWRpb1N0cmVhbSA9IGZhbHNlCikgPT4gewogIGNvbnN0IHZpZGVvSWQgPSBwbGF5ZXJJZCArIFZJREVPX1JFQ09SREVSX1BPU1RGSVg7CiAgY29uc3QgdmlkZW9QbGF5ZXJDb250YWluZXIgPSBjcmVhdGVWaWRlb1BsYXllckNvbnRhaW5lcih2aWRlb0lkKTsKCiAgLy8gQWRkIGV2ZW50IGxpc3RlbmVyIGJlZm9yZSBsb2FkaW5nIHRoaXJkIHBhcnR5IHNjcmlwdHMgaW4gdG8gbG9nIGFueSBDU1AgdmlvbGF0aW9ucwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNlY3VyaXR5cG9saWN5dmlvbGF0aW9uIiwgKGUpID0+IHsKICAgIGNvbnN0IHBsYXllciA9IHdpbmRvdy52aWRlb2pzKHZpZGVvSWQpOwogICAgcmVwb3J0RXJyb3IoCiAgICAgIG5ldyBFcnJvcihgVm9pY2UgJiBWaWRlbyBmZWF0dXJlIHZpb2xhdGVzICR7ZS52aW9sYXRlZERpcmVjdGl2ZX0gd2ViIHBhZ2UgQ1NQIHBvbGljaWVzIGZvciB0aGUgcmVjb3JkZXIgcGxheWVyLmApLAogICAgICAncmVjb3JkZXJEZXZpY2VFcnJvcicsCiAgICAgIGFwaUJhc2UsCiAgICAgIGhlYWRlcnMsCiAgICAgIHBsYXllci5wYXlsb2FkLnZpc2l0b3JJZCwKICAgICAgcGxheWVyLnBheWxvYWQuZW52SWQKICAgICk7CiAgfSk7CgogIGxvYWRQbGF5ZXJTY3JpcHRzKHZpZGVvUGxheWVyQ29udGFpbmVyLCB2aWRlb1BsYXllclNjcmlwdHMuY29uY2F0KHJlY29yZGVyU2NyaXB0cyksICgpID0+IHsKICAgIGNyZWF0ZVZpZGVvUGxheWVyQ29tcG9uZW50cyh2aWRlb0lkLCB2aWRlb1BsYXllckNvbnRhaW5lcik7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnZXRTcGlubmVySWQodmlkZW9JZCkpLnJlbW92ZSgpOwogICAgcHJlcGFyZVJlY29yZGVyKAogICAgICB2aWRlb1BsYXllckNvbnRhaW5lciwKICAgICAgdmlkZW9JZCwKICAgICAgcGF5bG9hZCwKICAgICAgYXBpQmFzZSwKICAgICAgcmVjb3JkRXZlbnRzQ2FsbGJhY2ssCiAgICAgIHNvdXJjZSwKICAgICAgaGVhZGVycywKICAgICAgaXNBdWRpb1N0cmVhbQogICAgKTsKICB9KTsKICByZXR1cm4gdmlkZW9QbGF5ZXJDb250YWluZXI7Cn07CgovKioKICoKICogQHBhcmFtIHtTdHJpbmd9IGNvbnRhaW5lcklkIHVuaXF1ZSBpZCBmb3IgdGhlIHZpZGVvIHBsYXllcidzIGNvbnRhaW5lcgogKiBAcGFyYW0ge0pTT059IHBheWxvYWQgYXBpLXJlbGF0ZWQganNvbiBjb25maWd1cmF0aW9uIG9iamVjdAogKiBAcGFyYW0ge3tzcmM6IFN0cmluZywgdHlwZTogU3RyaW5nfX0gc291cmNlIHNyYyBwcm9wZXJ0aWVzIGZvciB0aGUgcGxheWVyCiAqIEBwYXJhbSB7U3RyaW5nfSBhcGlCYXNlIGJhc2UgdXJsIGZvciB0aGUgYXBpIGNhbGxzIGRlZmF1bHQgaXMgcHJvZCBhcGkKICogQHBhcmFtIHsoc3RhdHVzOiBTdHJpbmcsIGRhdGE6IE9iamVjdCkgPT4gVm9pZH0gcmVjb3JkRXZlbnRzQ2FsbGJhY2sgY2FsbGJhY2sgdG8gdGhlIG91dHNpZGUgd29ybGQgdG8gbm90aWZ5IHVwbG9hZCBzdGF0dXMKICogQHBhcmFtIHsneC11bC12aWRlby1yZWNvcmRlci1vcmlnaW4nOiAnZGFzaGJvYXJkJyB8ICdzZGsnfSBoZWFkZXJzIHJlcXVlc3QgaGVhZGVycyBmb3IgZXJyb3IgbG9nZ2luZyAocG90ZW50aWFsbHkgY29udGFpbnMgYWRkaXRpb25hbCBoZWFkZXJzKQogKiBAcGFyYW0ge2Jvb2xlYW59IGlzQXVkaW9TdHJlYW0gdHJ1ZSBpZiBtZWRpYSB0eXBlIGZvciB0aGUgcGxheWJhY2sgaXMgYXVkaW8gb25seSBkZWZhdWx0IGZhbHNlCiAqIEByZXR1cm5zIGh0bWwgZWxlbWVudCBmb3IgdGhlIGNvbWJvIGNvbnRhaW5lcgogKi8KY29uc3QgdmlkZW9QbGF5ZXJSZWNvcmRlckNvbWJvID0gKAogIGNvbnRhaW5lcklkLAogIHBheWxvYWQgPSB7fSwKICBzb3VyY2UsCiAgYXBpQmFzZSA9ICdodHRwczovL2FwaS51c2VybGVhcC5jb20nLAogIHJlY29yZEV2ZW50c0NhbGxiYWNrLAogIGhlYWRlcnMsCiAgaXNBdWRpb1N0cmVhbSA9IGZhbHNlCikgPT4gewogIGNvbnN0IHZpZGVvUGxheWVySWQgPSBjb250YWluZXJJZCArIFZJREVPX1BMQVlFUl9QT1NURklYOwogIGNvbnN0IHZpZGVvUmVjb3JkZXJJZCA9IGNvbnRhaW5lcklkICsgVklERU9fUkVDT1JERVJfUE9TVEZJWDsKICBjb25zdCBjb21ib0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGNvbnN0IHZpZGVvUGxheWVyQ29udGFpbmVyID0gY3JlYXRlVmlkZW9QbGF5ZXJDb250YWluZXIodmlkZW9QbGF5ZXJJZCk7CiAgY29uc3QgcmVjb3JkZXJDb250YWluZXIgPSBjcmVhdGVWaWRlb1BsYXllckNvbnRhaW5lcih2aWRlb1JlY29yZGVySWQpOwogIGNvbWJvQ29udGFpbmVyLmFwcGVuZENoaWxkKHZpZGVvUGxheWVyQ29udGFpbmVyKTsKICBjb21ib0NvbnRhaW5lci5hcHBlbmRDaGlsZChyZWNvcmRlckNvbnRhaW5lcik7CgogIGxvYWRQbGF5ZXJTY3JpcHRzKGNvbWJvQ29udGFpbmVyLCB2aWRlb1BsYXllclNjcmlwdHMuY29uY2F0KHJlY29yZGVyU2NyaXB0cyksICgpID0+IHsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFNwaW5uZXJJZCh2aWRlb1BsYXllcklkKSkucmVtb3ZlKCk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnZXRTcGlubmVySWQodmlkZW9SZWNvcmRlcklkKSkucmVtb3ZlKCk7CiAgICBjcmVhdGVWaWRlb1BsYXllckNvbXBvbmVudHModmlkZW9QbGF5ZXJJZCwgdmlkZW9QbGF5ZXJDb250YWluZXIpOwogICAgY3JlYXRlVmlkZW9QbGF5ZXJDb21wb25lbnRzKHZpZGVvUmVjb3JkZXJJZCwgcmVjb3JkZXJDb250YWluZXIpOwogICAgY29uc3QgcGxheWVyID0gd2luZG93LnZpZGVvanModmlkZW9QbGF5ZXJJZCwgeyBwbGF5c2lubGluZTogdHJ1ZSwgcGxheWJhY2tSYXRlczogWzAuNSwgMSwgMS41LCAyXSB9KTsKCiAgICBwcmVwYXJlVmlkZW9QbGF5ZXIoCiAgICAgIHBsYXllciwKICAgICAgbWFrZUJ1dHRvbnNQYW5lbChwbGF5ZXIsIFsnUGxheWJhY2tSYXRlTWVudUJ1dHRvbicsICdQbGF5VG9nZ2xlJywgJ0Z1bGxzY3JlZW5Ub2dnbGUnXSksCiAgICAgIHNvdXJjZSwKICAgICAgZmFsc2UsCiAgICAgIGlzQXVkaW9TdHJlYW0KICAgICk7CiAgICBwcmVwYXJlUmVjb3JkZXIocmVjb3JkZXJDb250YWluZXIsIHZpZGVvUmVjb3JkZXJJZCwgcGF5bG9hZCwgYXBpQmFzZSwgcmVjb3JkRXZlbnRzQ2FsbGJhY2ssIGZhbHNlLCBoZWFkZXJzKTsKICB9KTsKICByZXR1cm4gY29tYm9Db250YWluZXI7Cn07CgovKioKICogQHBhcmFtIHtTdHJpbmd9IGNvbnRhaW5lcklkIHBsYXllciBpZCB0byBiZSBkZXN0cm95ZWQsIHRoaXMgd2lsbCByZW1vdmUgYWxsIHRoZSB2aWRlbyBwbGF5ZXIgYW5kIHJlY29yZGVyIGluc3RhbmNlcyBvbiB0aGUgcGFnZSB3aXRoIHRoZSBpZAogKiBAcmV0dXJucwogKi8KY29uc3QgZGVzdHJveVBsYXllciA9IChjb250YWluZXJJZCkgPT4gewogIGNvbnN0IHZpZGVvanMgPSB3aW5kb3cudmlkZW9qczsKICBjb25zdCB2aWRlb1BsYXllcklkID0gY29udGFpbmVySWQgKyBWSURFT19QTEFZRVJfUE9TVEZJWDsKICBjb25zdCB2aWRlb1JlY29yZGVySWQgPSBjb250YWluZXJJZCArIFZJREVPX1JFQ09SREVSX1BPU1RGSVg7CiAgaWYgKCF2aWRlb2pzKSByZXR1cm47CiAgc3RvcFJlY29yZGluZyhjb250YWluZXJJZCk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVySWQpICYmIHZpZGVvanMoY29udGFpbmVySWQpLmRpc3Bvc2UoKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWRlb1BsYXllcklkKSAmJiB2aWRlb2pzKHZpZGVvUGxheWVySWQpLmRpc3Bvc2UoKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWRlb1JlY29yZGVySWQpICYmIHZpZGVvanModmlkZW9SZWNvcmRlcklkKS5kaXNwb3NlKCk7Cn07CgovKioKICoKICogQHBhcmFtIHtzdHJpbmd9IGNvbnRhaW5lcklkIGNvbnRhaW5lciBpZCBzdXBwbGllZCBwcmV2aW91c2x5IHRvIGNyZWF0ZSB0aGUgdmlkZW8gY29tcG9uZW5ldAogKiBAcmV0dXJucwogKi8KY29uc3Qgc3RvcFJlY29yZGluZyA9IChjb250YWluZXJJZCkgPT4gewogIGNvbnN0IHZpZGVvanMgPSB3aW5kb3cudmlkZW9qczsKICBjb25zdCB2aWRlb1JlY29yZGVySWQgPSBjb250YWluZXJJZCArIFZJREVPX1JFQ09SREVSX1BPU1RGSVg7CiAgaWYgKCF2aWRlb2pzKSByZXR1cm47CiAgdHJ5IHsKICAgIGlmICghdmlkZW9qcyh2aWRlb1JlY29yZGVySWQpLnJlY29yZCgpLnN0cmVhbSkgcmV0dXJuOyAvLyB0cnlpbmcgdG8gc3RvcCBhIG5vbiBleGlzdGVudCBzdHJlYW0gd2lsbCBjcmFzaAogIH0gY2F0Y2ggKGUpIHsKICAgIHJldHVybjsKICB9CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodmlkZW9SZWNvcmRlcklkKSAmJgogICAgdmlkZW9qcyh2aWRlb1JlY29yZGVySWQpCiAgICAgIC5yZWNvcmQoKQogICAgICAuc3RvcCgpOwogIHZpZGVvanModmlkZW9SZWNvcmRlcklkKQogICAgLnJlY29yZCgpCiAgICAuc3RvcERldmljZSgpOwp9OwoKLyoqCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBjb250YWluZXJJZCB0aGUgY29udGFpbmVyIGlkCiAqIEBwYXJhbSB7dXJsIHN0cmluZ30gc3JjVXJsIHRoZSB1cmwgc3RyaW5nIG9mIHRoZSBzb3VyY2UKICogQHBhcmFtIHtib29sZWFufSBpc0F1ZGlvU3RyZWFtIHRydWUgaWYgbWVkaWEgdHlwZSBmb3IgdGhlIHBsYXliYWNrIGlzIGF1ZGlvIG9ubHkgZGVmYXVsdCBmYWxzZQogKi8KY29uc3QgcmVzZXRQbGF5ZXJTb3VyY2UgPSAoY29udGFpbmVySWQsIHNyY1VybCwgaXNBdWRpb1N0cmVhbSkgPT4gewogIGNvbnN0IHBsYXllciA9IHdpbmRvdy52aWRlb2pzKGNvbnRhaW5lcklkICsgVklERU9fUExBWUVSX1BPU1RGSVgpOwogICFwbGF5ZXIucGF1c2VkKCkgJiYgcGxheWVyLnBhdXNlKCk7CiAgcGxheWVyLnNyYyh7IHNyYzogc3JjVXJsLCB0eXBlOiAnYXBwbGljYXRpb24veC1tcGVnVVJMJyB9KTsKICBwbGF5ZXIuY3VycmVudFRpbWUoMCk7CiAgdG9nZ2xlQXVkaW9QbGFjZWhvbGRlcihwbGF5ZXIsIGlzQXVkaW9TdHJlYW0pOwogIGNvbnN0IHRodW1ibmFpbCA9IGdldFBvc3RlclRodW1ibmFpbChzcmNVcmwpOwogIGlmICghaXNBdWRpb1N0cmVhbSAmJiBzcmNVcmwpIHsKICAgIGlmICh0aHVtYm5haWwpIHBsYXllci5wb3N0ZXIodGh1bWJuYWlsKTsKICAgIGVsc2UgdG9nZ2xlQXVkaW9QbGFjZWhvbGRlcihwbGF5ZXIsIHRydWUpOyAvLyB0b2dnbGUgYXVkaW8gcGxhY2Vob2xkZXIgaWYgcG9zdGVyIGRvZXNuJ3QgZXhpc3Q7CiAgfQoKICAvLyBoYXZlIHRvIHJlc2V0IHBsYXkgYWN0aW9uIGFnYWluIGluIGhlcmUgc2luY2UgcmVzZXQgcGxheWVyIGRvZXMgbm90IHVwZGF0ZSBpc0F1ZGlvU3RyZWFtIHZhcmlhYmxlCiAgcGxheWVyLm9uKCdwbGF5JywgKCkgPT4gewogICAgLy8gaGlkZSBhdWRpbyBwbGFjZWhvbGRlciBpbiBjYXNlIGl0IHdhcyB0b2dnbGVkIGVhcmxpZXIgd2hlbiBwb3N0ZXIgZGlkbid0IGV4aXN0CiAgICBpZiAoIWlzQXVkaW9TdHJlYW0gJiYgc3JjVXJsICYmICF0aHVtYm5haWwpIHsKICAgICAgdG9nZ2xlQXVkaW9QbGFjZWhvbGRlcihwbGF5ZXIsIGZhbHNlKTsKICAgIH0KICB9KTsKfTsKCmNvbnN0IHBhdXNlUXVlc3Rpb25QbGF5ZXIgPSAocGxheWVySWQpID0+IHsKICBjb25zdCBwbGF5ZXIgPSB3aW5kb3cudmlkZW9qcyhwbGF5ZXJJZCArIFZJREVPX1BMQVlFUl9QT1NURklYKTsKICBwbGF5ZXIucGF1c2UoKTsKfQoKLyoqCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBjb250YWluZXJJZCB0aGUgcGxheWVyIHJlY29yZGVyJ3MgY29udGFpbmVyIGlkCiAqIEBwYXJhbSB7Kn0gdmlkZW9VcmwgdXJsIGZvciB0aGUgbmV3IHZpZGVvIHRvIHBsYXkKICovCmNvbnN0IHJlZnJlc2hQbGF5ZXJSZWNvcmRlckNvbWJvID0gKGNvbnRhaW5lcklkLCB2aWRlb1VybCwgcGF5bG9hZCwgaXNBdWRpb1N0cmVhbSkgPT4gewogIGNvbnN0IHBsYXllciA9IHdpbmRvdy52aWRlb2pzKGNvbnRhaW5lcklkICsgVklERU9fUExBWUVSX1BPU1RGSVgpOwogIGNvbnN0IHJlY29yZGVyID0gd2luZG93LnZpZGVvanMoY29udGFpbmVySWQgKyBWSURFT19SRUNPUkRFUl9QT1NURklYKTsKICByZXNldFBsYXllclNvdXJjZShjb250YWluZXJJZCwgdmlkZW9VcmwsIGlzQXVkaW9TdHJlYW0pOwogIHJlY29yZGVyLnJlY29yZCgpLnJlc2V0U3RhdGUoKTsKICByZWNvcmRlci5yZWNvcmQoKS5nZXREZXZpY2UoKTsKCiAgLy8gUmVzZXQgZGVsZXRlIGFuZCBjYW1lcmEgYnV0dG9uIG9uIGNvbnRyb2wgcGFuZWwgZm9yIHJlY29yZGVyIHBsYXllcgogIGNvbnN0IGRlbGV0ZUJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3VsLXZpZGVvLXJlY29yZGVyLWRlbGV0ZS1idXR0b24nKVswXTsKICBkZWxldGVCdXR0b24uY2xhc3NMaXN0LmFkZChISURERU5fQ0xBU1MpOwoKICAvLyBhZnRlciByZWZyZXNoaW5nIGRldmljZXMgd2UgbmVlZCB0byB0dXJuIG9mZiBjYW1lcmEgYWdhaW4gaWYgdGhlIGNhbWVyYSB3YXMgcHJldmlvdXNseSB0dXJuZWQgb2ZmCiAgaWYgKHJlY29yZGVyLmNhbWVyYU9mZikgewogICAgY29uc3QgY2FtZXJhQXVkaW9CdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd1bC12aWRlby1yZWNvcmRlci1jYW1lcmEtb2ZmLWJ1dHRvbi1hdWRpby1vbmx5JylbMF07CiAgICBjYW1lcmFBdWRpb0J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKEhJRERFTl9DTEFTUyk7CgogICAgd2luZG93Lm5hdmlnYXRvci5tZWRpYURldmljZXMKICAgICAgLmdldFVzZXJNZWRpYSh7IHZpZGVvOiB0cnVlLCBhdWRpbzogdHJ1ZSB9KQogICAgICAudGhlbigoc3RyZWFtKSA9PiB7CiAgICAgICAgcmVjb3JkZXIucmVjb3JkKCkub25EZXZpY2VSZWFkeShzdHJlYW0pOwogICAgICAgIHN0cmVhbS5nZXRWaWRlb1RyYWNrcygpLmZvckVhY2goKHN0cmVhbSkgPT4gewogICAgICAgICAgc3RyZWFtLnN0b3AoKTsKICAgICAgICB9KTsKICAgICAgfSkKICAgICAgLmNhdGNoKHJlY29yZGVyLnJlY29yZCgpLm9uRGV2aWNlRXJyb3IuYmluZChyZWNvcmRlci5yZWNvcmQoKSkpOwogIH0gZWxzZSB7CiAgICBjb25zdCBjYW1lcmFCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd1bC12aWRlby1yZWNvcmRlci1jYW1lcmEtb2ZmLWJ1dHRvbicpWzBdOwogICAgY2FtZXJhQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoSElEREVOX0NMQVNTKTsKICB9CiAgcmVjb3JkZXIucGF5bG9hZCA9IHBheWxvYWQ7CiAgc2V0VXBsb2FkUHJvZ3Jlc3MocmVjb3JkZXIudXBsb2FkUHJvZ3Jlc3NMYWJlbCwgJ25vbmUnKTsKICBjdXJyZW50UGxheWVyU2Vzc2lvbiA9IERhdGUubm93KCk7Cn07Cgpjb25zdCBnZXRQb3N0ZXJUaHVtYm5haWwgPSAoc291cmNlKSA9PiB7CiAgY29uc3QgZmluZE11eElkID0gc291cmNlLm1hdGNoKC9odHRwczpcL1wvc3RyZWFtLm11eC5jb21cLyguKikvKTsgLy8gTWF0Y2ggcmV0dXJucyBhbiBhcnJheSwgbm90IHRoZSBleGFjdCBtYXRjaGVkIHN0cmluZwogIGNvbnN0IG11eElkID0gZmluZE11eElkID8gZmluZE11eElkWzFdIDogbnVsbDsKICByZXR1cm4gbXV4SWQgPyBgaHR0cHM6Ly9pbWFnZS5tdXguY29tLyR7bXV4SWR9L3RodW1ibmFpbC5qcGc/dGltZT0wYCA6IG51bGw7Cn0KCi8qKgogKiBDb25zdGFudHMgZm9yIHJlY29yZGVyIGNhbGxiYWNrIGV2ZW50cyBhbmQgZGF0YQogKi8KY29uc3QgUkVDT1JERVIgPSB7CiAgLy8gZXZlbnRzCiAgVVBMT0FEX1NUQVJURUQ6ICd1cGxvYWQuc3RhcnRlZCcsCiAgVVBMT0FEX0ZJTklTSEVEOiAndXBsb2FkLmZpbmlzaGVkJywKICBERUxFVEU6ICdkZWxldGUnLAogIEVSUk9SOiAnZXJyb3InLAogIE1FRElBX1RZUEU6ICdtZWRpYS50eXBlJywKICAvLyBlcnJvciB0eXBlcwogIFBFUk1JU1NJT05fREVOSUVEOiAncGVybWlzc2lvbl9kZW5pZWQnLAogIE9USEVSOiAnb3RoZXInLAogIC8vZGF0YQogIFVQTE9BRF9JRDogJ3VwbG9hZC5pZCcsCiAgTUVESUFfVFlQRV9WSURFTzogJ3ZpZGVvJywKICBNRURJQV9UWVBFX0FVRElPOiAnYXVkaW8nLAp9OwoKY29uc3QgQlVUVE9OX05BTUVfVElUTEUgPSB7CiAgUGxheWJhY2tSYXRlTWVudUJ1dHRvbjogJ1NwZWVkJywKICBQbGF5VG9nZ2xlOiAnUGxheScsCiAgRnVsbHNjcmVlblRvZ2dsZTogJ0V4cGFuZCcsCiAgVHVybk9uQ2FtZXJhOiAnVHVybiBvbicsCiAgVHVybk9mZkNhbWVyYTogJ1R1cm4gb2ZmJywKICBEZWxldGVCdXR0b246ICdEZWxldGUnLAogIFJlY29yZEJ1dHRvbjogJ1JlY29yZCcsCiAgU3RvcEJ1dHRvbjogJ1N0b3AnLAogIFBhdXNlQnV0dG9uOiAnUGF1c2UnLAp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvYXV0b3NpemUvZGlzdC9hdXRvc2l6ZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvYXV0b3NpemUvZGlzdC9hdXRvc2l6ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykgewoKdmFyIF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXywgX19XRUJQQUNLX0FNRF9ERUZJTkVfQVJSQVlfXywgX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX187LyohCglhdXRvc2l6ZSA0LjAuMgoJbGljZW5zZTogTUlUCglodHRwOi8vd3d3LmphY2tsbW9vcmUuY29tL2F1dG9zaXplCiovCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7CglpZiAodHJ1ZSkgewoJCSEoX19XRUJQQUNLX0FNRF9ERUZJTkVfQVJSQVlfXyA9IFttb2R1bGUsIGV4cG9ydHNdLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18gPSAoZmFjdG9yeSksCgkJX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18gPSAodHlwZW9mIF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXyA9PT0gJ2Z1bmN0aW9uJyA/CgkJKF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXy5hcHBseShleHBvcnRzLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fKSkgOiBfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18pLAoJCV9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fICE9PSB1bmRlZmluZWQgJiYgKG1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18pKTsKCX0gZWxzZSB7IHZhciBtb2Q7IH0KfSkodGhpcywgZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewoJJ3VzZSBzdHJpY3QnOwoKCXZhciBtYXAgPSB0eXBlb2YgTWFwID09PSAiZnVuY3Rpb24iID8gbmV3IE1hcCgpIDogZnVuY3Rpb24gKCkgewoJCXZhciBrZXlzID0gW107CgkJdmFyIHZhbHVlcyA9IFtdOwoKCQlyZXR1cm4gewoJCQloYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHsKCQkJCXJldHVybiBrZXlzLmluZGV4T2Yoa2V5KSA+IC0xOwoJCQl9LAoJCQlnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHsKCQkJCXJldHVybiB2YWx1ZXNba2V5cy5pbmRleE9mKGtleSldOwoJCQl9LAoJCQlzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7CgkJCQlpZiAoa2V5cy5pbmRleE9mKGtleSkgPT09IC0xKSB7CgkJCQkJa2V5cy5wdXNoKGtleSk7CgkJCQkJdmFsdWVzLnB1c2godmFsdWUpOwoJCQkJfQoJCQl9LAoJCQlkZWxldGU6IGZ1bmN0aW9uIF9kZWxldGUoa2V5KSB7CgkJCQl2YXIgaW5kZXggPSBrZXlzLmluZGV4T2Yoa2V5KTsKCQkJCWlmIChpbmRleCA+IC0xKSB7CgkJCQkJa2V5cy5zcGxpY2UoaW5kZXgsIDEpOwoJCQkJCXZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpOwoJCQkJfQoJCQl9CgkJfTsKCX0oKTsKCgl2YXIgY3JlYXRlRXZlbnQgPSBmdW5jdGlvbiBjcmVhdGVFdmVudChuYW1lKSB7CgkJcmV0dXJuIG5ldyBFdmVudChuYW1lLCB7IGJ1YmJsZXM6IHRydWUgfSk7Cgl9OwoJdHJ5IHsKCQluZXcgRXZlbnQoJ3Rlc3QnKTsKCX0gY2F0Y2ggKGUpIHsKCQkvLyBJRSBkb2VzIG5vdCBzdXBwb3J0IGBuZXcgRXZlbnQoKWAKCQljcmVhdGVFdmVudCA9IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50KG5hbWUpIHsKCQkJdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpOwoJCQlldnQuaW5pdEV2ZW50KG5hbWUsIHRydWUsIGZhbHNlKTsKCQkJcmV0dXJuIGV2dDsKCQl9OwoJfQoKCWZ1bmN0aW9uIGFzc2lnbih0YSkgewoJCWlmICghdGEgfHwgIXRhLm5vZGVOYW1lIHx8IHRhLm5vZGVOYW1lICE9PSAnVEVYVEFSRUEnIHx8IG1hcC5oYXModGEpKSByZXR1cm47CgoJCXZhciBoZWlnaHRPZmZzZXQgPSBudWxsOwoJCXZhciBjbGllbnRXaWR0aCA9IG51bGw7CgkJdmFyIGNhY2hlZEhlaWdodCA9IG51bGw7CgoJCWZ1bmN0aW9uIGluaXQoKSB7CgkJCXZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhLCBudWxsKTsKCgkJCWlmIChzdHlsZS5yZXNpemUgPT09ICd2ZXJ0aWNhbCcpIHsKCQkJCXRhLnN0eWxlLnJlc2l6ZSA9ICdub25lJzsKCQkJfSBlbHNlIGlmIChzdHlsZS5yZXNpemUgPT09ICdib3RoJykgewoJCQkJdGEuc3R5bGUucmVzaXplID0gJ2hvcml6b250YWwnOwoJCQl9CgoJCQlpZiAoc3R5bGUuYm94U2l6aW5nID09PSAnY29udGVudC1ib3gnKSB7CgkJCQloZWlnaHRPZmZzZXQgPSAtKHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ1RvcCkgKyBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmdCb3R0b20pKTsKCQkJfSBlbHNlIHsKCQkJCWhlaWdodE9mZnNldCA9IHBhcnNlRmxvYXQoc3R5bGUuYm9yZGVyVG9wV2lkdGgpICsgcGFyc2VGbG9hdChzdHlsZS5ib3JkZXJCb3R0b21XaWR0aCk7CgkJCX0KCQkJLy8gRml4IHdoZW4gYSB0ZXh0YXJlYSBpcyBub3Qgb24gZG9jdW1lbnQgYm9keSBhbmQgaGVpZ2h0T2Zmc2V0IGlzIE5vdCBhIE51bWJlcgoJCQlpZiAoaXNOYU4oaGVpZ2h0T2Zmc2V0KSkgewoJCQkJaGVpZ2h0T2Zmc2V0ID0gMDsKCQkJfQoKCQkJdXBkYXRlKCk7CgkJfQoKCQlmdW5jdGlvbiBjaGFuZ2VPdmVyZmxvdyh2YWx1ZSkgewoJCQl7CgkJCQkvLyBDaHJvbWUvU2FmYXJpLXNwZWNpZmljIGZpeDoKCQkJCS8vIFdoZW4gdGhlIHRleHRhcmVhIHktb3ZlcmZsb3cgaXMgaGlkZGVuLCBDaHJvbWUvU2FmYXJpIGRvIG5vdCByZWZsb3cgdGhlIHRleHQgdG8gYWNjb3VudCBmb3IgdGhlIHNwYWNlCgkJCQkvLyBtYWRlIGF2YWlsYWJsZSBieSByZW1vdmluZyB0aGUgc2Nyb2xsYmFyLiBUaGUgZm9sbG93aW5nIGZvcmNlcyB0aGUgbmVjZXNzYXJ5IHRleHQgcmVmbG93LgoJCQkJdmFyIHdpZHRoID0gdGEuc3R5bGUud2lkdGg7CgkJCQl0YS5zdHlsZS53aWR0aCA9ICcwcHgnOwoJCQkJLy8gRm9yY2UgcmVmbG93OgoJCQkJLyoganNoaW50IGlnbm9yZTpzdGFydCAqLwoJCQkJdGEub2Zmc2V0V2lkdGg7CgkJCQkvKiBqc2hpbnQgaWdub3JlOmVuZCAqLwoJCQkJdGEuc3R5bGUud2lkdGggPSB3aWR0aDsKCQkJfQoKCQkJdGEuc3R5bGUub3ZlcmZsb3dZID0gdmFsdWU7CgkJfQoKCQlmdW5jdGlvbiBnZXRQYXJlbnRPdmVyZmxvd3MoZWwpIHsKCQkJdmFyIGFyciA9IFtdOwoKCQkJd2hpbGUgKGVsICYmIGVsLnBhcmVudE5vZGUgJiYgZWwucGFyZW50Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKCQkJCWlmIChlbC5wYXJlbnROb2RlLnNjcm9sbFRvcCkgewoJCQkJCWFyci5wdXNoKHsKCQkJCQkJbm9kZTogZWwucGFyZW50Tm9kZSwKCQkJCQkJc2Nyb2xsVG9wOiBlbC5wYXJlbnROb2RlLnNjcm9sbFRvcAoJCQkJCX0pOwoJCQkJfQoJCQkJZWwgPSBlbC5wYXJlbnROb2RlOwoJCQl9CgoJCQlyZXR1cm4gYXJyOwoJCX0KCgkJZnVuY3Rpb24gcmVzaXplKCkgewoJCQlpZiAodGEuc2Nyb2xsSGVpZ2h0ID09PSAwKSB7CgkJCQkvLyBJZiB0aGUgc2Nyb2xsSGVpZ2h0IGlzIDAsIHRoZW4gdGhlIGVsZW1lbnQgcHJvYmFibHkgaGFzIGRpc3BsYXk6bm9uZSBvciBpcyBkZXRhY2hlZCBmcm9tIHRoZSBET00uCgkJCQlyZXR1cm47CgkJCX0KCgkJCXZhciBvdmVyZmxvd3MgPSBnZXRQYXJlbnRPdmVyZmxvd3ModGEpOwoJCQl2YXIgZG9jVG9wID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7IC8vIE5lZWRlZCBmb3IgTW9iaWxlIElFICh0aWNrZXQgIzI0MCkKCgkJCXRhLnN0eWxlLmhlaWdodCA9ICcnOwoJCQl0YS5zdHlsZS5oZWlnaHQgPSB0YS5zY3JvbGxIZWlnaHQgKyBoZWlnaHRPZmZzZXQgKyAncHgnOwoKCQkJLy8gdXNlZCB0byBjaGVjayBpZiBhbiB1cGRhdGUgaXMgYWN0dWFsbHkgbmVjZXNzYXJ5IG9uIHdpbmRvdy5yZXNpemUKCQkJY2xpZW50V2lkdGggPSB0YS5jbGllbnRXaWR0aDsKCgkJCS8vIHByZXZlbnRzIHNjcm9sbC1wb3NpdGlvbiBqdW1waW5nCgkJCW92ZXJmbG93cy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgewoJCQkJZWwubm9kZS5zY3JvbGxUb3AgPSBlbC5zY3JvbGxUb3A7CgkJCX0pOwoKCQkJaWYgKGRvY1RvcCkgewoJCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IGRvY1RvcDsKCQkJfQoJCX0KCgkJZnVuY3Rpb24gdXBkYXRlKCkgewoJCQlyZXNpemUoKTsKCgkJCXZhciBzdHlsZUhlaWdodCA9IE1hdGgucm91bmQocGFyc2VGbG9hdCh0YS5zdHlsZS5oZWlnaHQpKTsKCQkJdmFyIGNvbXB1dGVkID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGEsIG51bGwpOwoKCQkJLy8gVXNpbmcgb2Zmc2V0SGVpZ2h0IGFzIGEgcmVwbGFjZW1lbnQgZm9yIGNvbXB1dGVkLmhlaWdodCBpbiBJRSwgYmVjYXVzZSBJRSBkb2VzIG5vdCBhY2NvdW50IHVzZSBvZiBib3JkZXItYm94CgkJCXZhciBhY3R1YWxIZWlnaHQgPSBjb21wdXRlZC5ib3hTaXppbmcgPT09ICdjb250ZW50LWJveCcgPyBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoY29tcHV0ZWQuaGVpZ2h0KSkgOiB0YS5vZmZzZXRIZWlnaHQ7CgoJCQkvLyBUaGUgYWN0dWFsIGhlaWdodCBub3QgbWF0Y2hpbmcgdGhlIHN0eWxlIGhlaWdodCAoc2V0IHZpYSB0aGUgcmVzaXplIG1ldGhvZCkgaW5kaWNhdGVzIHRoYXQgCgkJCS8vIHRoZSBtYXgtaGVpZ2h0IGhhcyBiZWVuIGV4Y2VlZGVkLCBpbiB3aGljaCBjYXNlIHRoZSBvdmVyZmxvdyBzaG91bGQgYmUgYWxsb3dlZC4KCQkJaWYgKGFjdHVhbEhlaWdodCA8IHN0eWxlSGVpZ2h0KSB7CgkJCQlpZiAoY29tcHV0ZWQub3ZlcmZsb3dZID09PSAnaGlkZGVuJykgewoJCQkJCWNoYW5nZU92ZXJmbG93KCdzY3JvbGwnKTsKCQkJCQlyZXNpemUoKTsKCQkJCQlhY3R1YWxIZWlnaHQgPSBjb21wdXRlZC5ib3hTaXppbmcgPT09ICdjb250ZW50LWJveCcgPyBNYXRoLnJvdW5kKHBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGEsIG51bGwpLmhlaWdodCkpIDogdGEub2Zmc2V0SGVpZ2h0OwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJLy8gTm9ybWFsbHkga2VlcCBvdmVyZmxvdyBzZXQgdG8gaGlkZGVuLCB0byBhdm9pZCBmbGFzaCBvZiBzY3JvbGxiYXIgYXMgdGhlIHRleHRhcmVhIGV4cGFuZHMuCgkJCQlpZiAoY29tcHV0ZWQub3ZlcmZsb3dZICE9PSAnaGlkZGVuJykgewoJCQkJCWNoYW5nZU92ZXJmbG93KCdoaWRkZW4nKTsKCQkJCQlyZXNpemUoKTsKCQkJCQlhY3R1YWxIZWlnaHQgPSBjb21wdXRlZC5ib3hTaXppbmcgPT09ICdjb250ZW50LWJveCcgPyBNYXRoLnJvdW5kKHBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGEsIG51bGwpLmhlaWdodCkpIDogdGEub2Zmc2V0SGVpZ2h0OwoJCQkJfQoJCQl9CgoJCQlpZiAoY2FjaGVkSGVpZ2h0ICE9PSBhY3R1YWxIZWlnaHQpIHsKCQkJCWNhY2hlZEhlaWdodCA9IGFjdHVhbEhlaWdodDsKCQkJCXZhciBldnQgPSBjcmVhdGVFdmVudCgnYXV0b3NpemU6cmVzaXplZCcpOwoJCQkJdHJ5IHsKCQkJCQl0YS5kaXNwYXRjaEV2ZW50KGV2dCk7CgkJCQl9IGNhdGNoIChlcnIpIHsKCQkJCQkvLyBGaXJlZm94IHdpbGwgdGhyb3cgYW4gZXJyb3Igb24gZGlzcGF0Y2hFdmVudCBmb3IgYSBkZXRhY2hlZCBlbGVtZW50CgkJCQkJLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODg5Mzc2CgkJCQl9CgkJCX0KCQl9CgoJCXZhciBwYWdlUmVzaXplID0gZnVuY3Rpb24gcGFnZVJlc2l6ZSgpIHsKCQkJaWYgKHRhLmNsaWVudFdpZHRoICE9PSBjbGllbnRXaWR0aCkgewoJCQkJdXBkYXRlKCk7CgkJCX0KCQl9OwoKCQl2YXIgZGVzdHJveSA9IGZ1bmN0aW9uIChzdHlsZSkgewoJCQl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgcGFnZVJlc2l6ZSwgZmFsc2UpOwoJCQl0YS5yZW1vdmVFdmVudExpc3RlbmVyKCdpbnB1dCcsIHVwZGF0ZSwgZmFsc2UpOwoJCQl0YS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHVwZGF0ZSwgZmFsc2UpOwoJCQl0YS5yZW1vdmVFdmVudExpc3RlbmVyKCdhdXRvc2l6ZTpkZXN0cm95JywgZGVzdHJveSwgZmFsc2UpOwoJCQl0YS5yZW1vdmVFdmVudExpc3RlbmVyKCdhdXRvc2l6ZTp1cGRhdGUnLCB1cGRhdGUsIGZhbHNlKTsKCgkJCU9iamVjdC5rZXlzKHN0eWxlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKCQkJCXRhLnN0eWxlW2tleV0gPSBzdHlsZVtrZXldOwoJCQl9KTsKCgkJCW1hcC5kZWxldGUodGEpOwoJCX0uYmluZCh0YSwgewoJCQloZWlnaHQ6IHRhLnN0eWxlLmhlaWdodCwKCQkJcmVzaXplOiB0YS5zdHlsZS5yZXNpemUsCgkJCW92ZXJmbG93WTogdGEuc3R5bGUub3ZlcmZsb3dZLAoJCQlvdmVyZmxvd1g6IHRhLnN0eWxlLm92ZXJmbG93WCwKCQkJd29yZFdyYXA6IHRhLnN0eWxlLndvcmRXcmFwCgkJfSk7CgoJCXRhLmFkZEV2ZW50TGlzdGVuZXIoJ2F1dG9zaXplOmRlc3Ryb3knLCBkZXN0cm95LCBmYWxzZSk7CgoJCS8vIElFOSBkb2VzIG5vdCBmaXJlIG9ucHJvcGVydHljaGFuZ2Ugb3Igb25pbnB1dCBmb3IgZGVsZXRpb25zLAoJCS8vIHNvIGJpbmRpbmcgdG8gb25rZXl1cCB0byBjYXRjaCBtb3N0IG9mIHRob3NlIGV2ZW50cy4KCQkvLyBUaGVyZSBpcyBubyB3YXkgdGhhdCBJIGtub3cgb2YgdG8gZGV0ZWN0IHNvbWV0aGluZyBsaWtlICdjdXQnIGluIElFOS4KCQlpZiAoJ29ucHJvcGVydHljaGFuZ2UnIGluIHRhICYmICdvbmlucHV0JyBpbiB0YSkgewoJCQl0YS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHVwZGF0ZSwgZmFsc2UpOwoJCX0KCgkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHBhZ2VSZXNpemUsIGZhbHNlKTsKCQl0YS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIHVwZGF0ZSwgZmFsc2UpOwoJCXRhLmFkZEV2ZW50TGlzdGVuZXIoJ2F1dG9zaXplOnVwZGF0ZScsIHVwZGF0ZSwgZmFsc2UpOwoJCXRhLnN0eWxlLm92ZXJmbG93WCA9ICdoaWRkZW4nOwoJCXRhLnN0eWxlLndvcmRXcmFwID0gJ2JyZWFrLXdvcmQnOwoKCQltYXAuc2V0KHRhLCB7CgkJCWRlc3Ryb3k6IGRlc3Ryb3ksCgkJCXVwZGF0ZTogdXBkYXRlCgkJfSk7CgoJCWluaXQoKTsKCX0KCglmdW5jdGlvbiBkZXN0cm95KHRhKSB7CgkJdmFyIG1ldGhvZHMgPSBtYXAuZ2V0KHRhKTsKCQlpZiAobWV0aG9kcykgewoJCQltZXRob2RzLmRlc3Ryb3koKTsKCQl9Cgl9CgoJZnVuY3Rpb24gdXBkYXRlKHRhKSB7CgkJdmFyIG1ldGhvZHMgPSBtYXAuZ2V0KHRhKTsKCQlpZiAobWV0aG9kcykgewoJCQltZXRob2RzLnVwZGF0ZSgpOwoJCX0KCX0KCgl2YXIgYXV0b3NpemUgPSBudWxsOwoKCS8vIERvIG5vdGhpbmcgaW4gTm9kZS5qcyBlbnZpcm9ubWVudCBhbmQgSUU4IChvciBsb3dlcikKCWlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygd2luZG93LmdldENvbXB1dGVkU3R5bGUgIT09ICdmdW5jdGlvbicpIHsKCQlhdXRvc2l6ZSA9IGZ1bmN0aW9uIGF1dG9zaXplKGVsKSB7CgkJCXJldHVybiBlbDsKCQl9OwoJCWF1dG9zaXplLmRlc3Ryb3kgPSBmdW5jdGlvbiAoZWwpIHsKCQkJcmV0dXJuIGVsOwoJCX07CgkJYXV0b3NpemUudXBkYXRlID0gZnVuY3Rpb24gKGVsKSB7CgkJCXJldHVybiBlbDsKCQl9OwoJfSBlbHNlIHsKCQlhdXRvc2l6ZSA9IGZ1bmN0aW9uIGF1dG9zaXplKGVsLCBvcHRpb25zKSB7CgkJCWlmIChlbCkgewoJCQkJQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlbC5sZW5ndGggPyBlbCA6IFtlbF0sIGZ1bmN0aW9uICh4KSB7CgkJCQkJcmV0dXJuIGFzc2lnbih4LCBvcHRpb25zKTsKCQkJCX0pOwoJCQl9CgkJCXJldHVybiBlbDsKCQl9OwoJCWF1dG9zaXplLmRlc3Ryb3kgPSBmdW5jdGlvbiAoZWwpIHsKCQkJaWYgKGVsKSB7CgkJCQlBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGVsLmxlbmd0aCA/IGVsIDogW2VsXSwgZGVzdHJveSk7CgkJCX0KCQkJcmV0dXJuIGVsOwoJCX07CgkJYXV0b3NpemUudXBkYXRlID0gZnVuY3Rpb24gKGVsKSB7CgkJCWlmIChlbCkgewoJCQkJQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlbC5sZW5ndGggPyBlbCA6IFtlbF0sIHVwZGF0ZSk7CgkJCX0KCQkJcmV0dXJuIGVsOwoJCX07Cgl9CgoJZXhwb3J0cy5kZWZhdWx0ID0gYXV0b3NpemU7Cgltb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsKfSk7CgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jbGFzc2NhdC9zcmMvaW5kZXguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY2xhc3NjYXQvc3JjL2luZGV4LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwpfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7Ci8qIGhhcm1vbnkgZXhwb3J0ICovICAgImRlZmF1bHQiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gY2M7IH0KLyogaGFybW9ueSBleHBvcnQgKi8gfSk7CnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheQoKZnVuY3Rpb24gY2MobmFtZXMpIHsKICB2YXIgaQogIHZhciBsZW4KICB2YXIgdG1wID0gdHlwZW9mIG5hbWVzCiAgdmFyIG91dCA9ICIiCgogIGlmICh0bXAgPT09ICJzdHJpbmciIHx8IHRtcCA9PT0gIm51bWJlciIpIHJldHVybiBuYW1lcyB8fCAiIgoKICBpZiAoaXNBcnJheShuYW1lcykgJiYgbmFtZXMubGVuZ3RoID4gMCkgewogICAgZm9yIChpID0gMCwgbGVuID0gbmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgaWYgKCh0bXAgPSBjYyhuYW1lc1tpXSkpICE9PSAiIikgb3V0ICs9IChvdXQgJiYgIiAiKSArIHRtcAogICAgfQogIH0gZWxzZSB7CiAgICBmb3IgKGkgaW4gbmFtZXMpIHsKICAgICAgaWYgKG5hbWVzLmhhc093blByb3BlcnR5KGkpICYmIG5hbWVzW2ldKSBvdXQgKz0gKG91dCAmJiAiICIpICsgaQogICAgfQogIH0KCiAgcmV0dXJuIG91dAp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9pbmRleC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9pbmRleC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN5bWJvbC5hc3luYy1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5hc3luYy1pdGVyYXRvci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN5bWJvbC5oYXMtaW5zdGFuY2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaGFzLWluc3RhbmNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3ltYm9sLmlzLWNvbmNhdC1zcHJlYWRhYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmlzLWNvbmNhdC1zcHJlYWRhYmxlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5tYXRjaC1hbGwuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zeW1ib2wucmVwbGFjZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5yZXBsYWNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3ltYm9sLnNlYXJjaCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5zZWFyY2guanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zeW1ib2wuc3BlY2llcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5zcGVjaWVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3ltYm9sLnNwbGl0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnNwbGl0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3ltYm9sLnRvLXByaW1pdGl2ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC50by1wcmltaXRpdmUuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zeW1ib2wudG8tc3RyaW5nLXRhZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC50by1zdHJpbmctdGFnLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3ltYm9sLnVuc2NvcGFibGVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnVuc2NvcGFibGVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5vYmplY3QuY3JlYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmNyZWF0ZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0aWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0aWVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZW50cmllcy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5mcmVlemUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZnJlZXplLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0LmZyb20tZW50cmllcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5mcm9tLWVudHJpZXMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0LmdldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZ2V0LXByb3RvdHlwZS1vZi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5pcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5pcy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5pcy1leHRlbnNpYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmlzLWV4dGVuc2libGUuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5vYmplY3QuaXMtZnJvemVuICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmlzLWZyb3plbi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5pcy1zZWFsZWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaXMtc2VhbGVkLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0LmtleXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5wcmV2ZW50LWV4dGVuc2lvbnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QucHJldmVudC1leHRlbnNpb25zLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0LnNlYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Quc2VhbC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5zZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5vYmplY3QudmFsdWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnZhbHVlcy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1nZXR0ZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLWdldHRlci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtc2V0dGVyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1zZXR0ZXIuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5vYmplY3QubG9va3VwLWdldHRlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5sb29rdXAtZ2V0dGVyLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMub2JqZWN0Lmxvb2t1cC1zZXR0ZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QubG9va3VwLXNldHRlci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmZ1bmN0aW9uLmJpbmQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5iaW5kLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuZnVuY3Rpb24ubmFtZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWUuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5mdW5jdGlvbi5oYXMtaW5zdGFuY2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5oYXMtaW5zdGFuY2UuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5nbG9iYWwtdGhpcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmdsb2JhbC10aGlzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuZnJvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZyb20uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5pcy1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmlzLWFycmF5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkub2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5vZi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LmNvcHktd2l0aGluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29weS13aXRoaW4uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5ldmVyeSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmV2ZXJ5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuZmlsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbGwuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5maW5kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWluZGV4LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuZmxhdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5mbGF0LW1hcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQtbWFwLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuZm9yLWVhY2ggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mb3ItZWFjaC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5pbmRleC1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluZGV4LW9mLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuam9pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmpvaW4uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5sYXN0LWluZGV4LW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkubGFzdC1pbmRleC1vZi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5Lm1hcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lm1hcC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LnJlZHVjZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnJlZHVjZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LnJlZHVjZS1yaWdodCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnJlZHVjZS1yaWdodC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LnJldmVyc2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5yZXZlcnNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuc2xpY2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zbGljZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LnNvbWUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zb21lLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuc29ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNvcnQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS5zcGVjaWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc3BlY2llcy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5LnVuc2NvcGFibGVzLmZsYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS51bnNjb3BhYmxlcy5mbGF0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkudW5zY29wYWJsZXMuZmxhdC1tYXAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS51bnNjb3BhYmxlcy5mbGF0LW1hcC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcuZnJvbS1jb2RlLXBvaW50ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5yYXcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmF3LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLmNvZGUtcG9pbnQtYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuY29kZS1wb2ludC1hdC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5lbmRzLXdpdGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZW5kcy13aXRoLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC1hbGwuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcucGFkLWVuZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5wYWQtZW5kLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLnBhZC1zdGFydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5wYWQtc3RhcnQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcucmVwZWF0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGVhdC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcuc2VhcmNoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNlYXJjaC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy50cmltICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcudHJpbS1zdGFydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLXN0YXJ0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tZW5kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tZW5kLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLmFuY2hvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5hbmNob3IuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcuYmlnICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmJpZy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5ibGluayAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5ibGluay5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5ib2xkICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmJvbGQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcuZml4ZWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZml4ZWQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcuZm9udGNvbG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZvbnRjb2xvci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5mb250c2l6ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5mb250c2l6ZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5pdGFsaWNzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0YWxpY3MuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcubGluayAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5saW5rLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLnNtYWxsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNtYWxsLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc3RyaW5nLnN0cmlrZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdHJpa2UuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zdHJpbmcuc3ViICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN1Yi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5zdXAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3VwLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnJlZ2V4cC5mbGFncyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5mbGFncy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucGFyc2UtaW50ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucGFyc2UtaW50LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucGFyc2UtZmxvYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1mbG9hdC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm51bWJlci5jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5jb25zdHJ1Y3Rvci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm51bWJlci5lcHNpbG9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmVwc2lsb24uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5udW1iZXIuaXMtZmluaXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLWZpbml0ZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm51bWJlci5pcy1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXIuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5udW1iZXIuaXMtbmFuICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLW5hbi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm51bWJlci5pcy1zYWZlLWludGVnZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMubnVtYmVyLm1heC1zYWZlLWludGVnZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIubWF4LXNhZmUtaW50ZWdlci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm51bWJlci5taW4tc2FmZS1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLm1pbi1zYWZlLWludGVnZXIuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtZmxvYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtZmxvYXQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtaW50ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWludC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm51bWJlci50by1maXhlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci50by1maXhlZC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm51bWJlci50by1wcmVjaXNpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tcHJlY2lzaW9uLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMubWF0aC5hY29zaCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguYWNvc2guanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLmFzaW5oICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5hc2luaC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm1hdGguYXRhbmggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmF0YW5oLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMubWF0aC5jYnJ0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5jYnJ0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMubWF0aC5jbHozMiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguY2x6MzIuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLmNvc2ggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmNvc2guanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLmV4cG0xICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5leHBtMS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm1hdGguZnJvdW5kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5mcm91bmQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLmh5cG90ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5oeXBvdC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm1hdGguaW11bCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguaW11bC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm1hdGgubG9nMTAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmxvZzEwLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMubWF0aC5sb2cxcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGgubG9nMXAuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLmxvZzIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmxvZzIuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLnNpZ24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnNpZ24uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLnNpbmggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnNpbmguanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLnRhbmggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnRhbmguanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLnRvLXN0cmluZy10YWcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnRvLXN0cmluZy10YWcuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5tYXRoLnRydW5jICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC50cnVuYy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmRhdGUubm93ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZGF0ZS5ub3cuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5kYXRlLnRvLWpzb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5kYXRlLnRvLWpzb24uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5kYXRlLnRvLWlzby1zdHJpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5kYXRlLnRvLWlzby1zdHJpbmcuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5kYXRlLnRvLXN0cmluZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGUudG8tc3RyaW5nLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuZGF0ZS50by1wcmltaXRpdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5kYXRlLnRvLXByaW1pdGl2ZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5qc29uLnRvLXN0cmluZy10YWcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5qc29uLnRvLXN0cmluZy10YWcuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5wcm9taXNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnByb21pc2UuYWxsLXNldHRsZWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMubWFwICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWFwLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuc2V0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc2V0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMud2Vhay1tYXAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLW1hcC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLndlYWstc2V0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMud2Vhay1zZXQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuY29uc3RydWN0b3IuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuaXMtdmlldyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LWJ1ZmZlci5pcy12aWV3LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLnNsaWNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLnNsaWNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuZGF0YS12aWV3ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZGF0YS12aWV3LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50OC1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDgtYXJyYXkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS51aW50OC1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQ4LWFycmF5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtY2xhbXBlZC1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQ4LWNsYW1wZWQtYXJyYXkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbnQxNi1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDE2LWFycmF5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDE2LWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDE2LWFycmF5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50MzItYXJyYXkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbnQzMi1hcnJheS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQzMi1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQzMi1hcnJheS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZsb2F0MzItYXJyYXkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5mbG9hdDMyLWFycmF5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmxvYXQ2NC1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZsb2F0NjQtYXJyYXkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5mcm9tICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZnJvbS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5Lm9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkub2YuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5jb3B5LXdpdGhpbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmNvcHktd2l0aGluLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZXZlcnkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5ldmVyeS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maWxsLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmlsdGVyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmlsdGVyLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbmQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maW5kLWluZGV4ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1pbmRleC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZvci1lYWNoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZm9yLWVhY2guanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbmNsdWRlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmluY2x1ZGVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW5kZXgtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbmRleC1vZi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5Lml0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaXRlcmF0b3IuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5qb2luICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuam9pbi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5Lmxhc3QtaW5kZXgtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5sYXN0LWluZGV4LW9mLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkubWFwICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkubWFwLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmVkdWNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmVkdWNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmVkdWNlLXJpZ2h0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmVkdWNlLXJpZ2h0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmV2ZXJzZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnJldmVyc2UuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zZXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zZXQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zbGljZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNsaWNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc29tZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNvbWUuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc29ydC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnN1YmFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc3ViYXJyYXkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1sb2NhbGUtc3RyaW5nICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudG8tbG9jYWxlLXN0cmluZy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLXN0cmluZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLXN0cmluZy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnJlZmxlY3QuYXBwbHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmFwcGx5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucmVmbGVjdC5jb25zdHJ1Y3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmNvbnN0cnVjdC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnJlZmxlY3QuZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5yZWZsZWN0LmRlbGV0ZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucmVmbGVjdC5nZXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmdldC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnJlZmxlY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5yZWZsZWN0LmhhcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuaGFzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucmVmbGVjdC5pcy1leHRlbnNpYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5pcy1leHRlbnNpYmxlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucmVmbGVjdC5vd24ta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3Qub3duLWtleXMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5yZWZsZWN0LnByZXZlbnQtZXh0ZW5zaW9ucyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QucHJldmVudC1leHRlbnNpb25zLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucmVmbGVjdC5zZXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LnNldC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIpOwp2YXIgcGF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wYXRoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wYXRoLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IHBhdGg7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbmRleC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbmRleC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2VzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL2luZGV4LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcHJvcG9zYWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9pbmRleC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3dlYiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy93ZWIvaW5kZXguanMiKTsKdmFyIHBhdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2ludGVybmFscy9wYXRoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wYXRoLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IHBhdGg7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHsKICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYSBmdW5jdGlvbicpOwogIH0gcmV0dXJuIGl0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICBpZiAoIWlzT2JqZWN0KGl0KSAmJiBpdCAhPT0gbnVsbCkgewogICAgdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBzZXQgIiArIFN0cmluZyhpdCkgKyAnIGFzIGEgcHJvdG90eXBlJyk7CiAgfSByZXR1cm4gaXQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIpOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7Cgp2YXIgVU5TQ09QQUJMRVMgPSB3ZWxsS25vd25TeW1ib2woJ3Vuc2NvcGFibGVzJyk7CnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTsKCi8vIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXQovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlcwppZiAoQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkgewogIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShBcnJheVByb3RvdHlwZSwgVU5TQ09QQUJMRVMsIGNyZWF0ZShudWxsKSk7Cn0KCi8vIGFkZCBhIGtleSB0byBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc10KbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7CiAgQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBjaGFyQXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZS5qcyIpLmNoYXJBdDsKCi8vIGBBZHZhbmNlU3RyaW5nSW5kZXhgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hZHZhbmNlc3RyaW5naW5kZXgKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoUywgaW5kZXgsIHVuaWNvZGUpIHsKICByZXR1cm4gaW5kZXggKyAodW5pY29kZSA/IGNoYXJBdChTLCBpbmRleCkubGVuZ3RoIDogMSk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSkgewogIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCAnICsgKG5hbWUgPyBuYW1lICsgJyAnIDogJycpICsgJ2ludm9jYXRpb24nKTsKICB9IHJldHVybiBpdDsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIGlmICghaXNPYmplY3QoaXQpKSB7CiAgICB0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKGl0KSArICcgaXMgbm90IGFuIG9iamVjdCcpOwogIH0gcmV0dXJuIGl0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgaGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLmpzIik7CnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanMiKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgcmVkZWZpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVkZWZpbmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIikuZjsKdmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIpOwp2YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciB1aWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdWlkICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiKTsKCnZhciBEYXRhVmlldyA9IGdsb2JhbC5EYXRhVmlldzsKdmFyIERhdGFWaWV3UHJvdG90eXBlID0gRGF0YVZpZXcgJiYgRGF0YVZpZXcucHJvdG90eXBlOwp2YXIgSW50OEFycmF5ID0gZ2xvYmFsLkludDhBcnJheTsKdmFyIEludDhBcnJheVByb3RvdHlwZSA9IEludDhBcnJheSAmJiBJbnQ4QXJyYXkucHJvdG90eXBlOwp2YXIgVWludDhDbGFtcGVkQXJyYXkgPSBnbG9iYWwuVWludDhDbGFtcGVkQXJyYXk7CnZhciBVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSA9IFVpbnQ4Q2xhbXBlZEFycmF5ICYmIFVpbnQ4Q2xhbXBlZEFycmF5LnByb3RvdHlwZTsKdmFyIFR5cGVkQXJyYXkgPSBJbnQ4QXJyYXkgJiYgZ2V0UHJvdG90eXBlT2YoSW50OEFycmF5KTsKdmFyIFR5cGVkQXJyYXlQcm90b3R5cGUgPSBJbnQ4QXJyYXlQcm90b3R5cGUgJiYgZ2V0UHJvdG90eXBlT2YoSW50OEFycmF5UHJvdG90eXBlKTsKdmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7CnZhciBpc1Byb3RvdHlwZU9mID0gT2JqZWN0UHJvdG90eXBlLmlzUHJvdG90eXBlT2Y7Cgp2YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTsKdmFyIFRZUEVEX0FSUkFZX1RBRyA9IHVpZCgnVFlQRURfQVJSQVlfVEFHJyk7CnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSID0gISEoZ2xvYmFsLkFycmF5QnVmZmVyICYmIERhdGFWaWV3KTsKLy8gRml4aW5nIG5hdGl2ZSB0eXBlZCBhcnJheXMgaW4gT3BlcmEgUHJlc3RvIGNyYXNoZXMgdGhlIGJyb3dzZXIsIHNlZSAjNTk1CnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gTkFUSVZFX0FSUkFZX0JVRkZFUiAmJiAhIXNldFByb3RvdHlwZU9mICYmIGNsYXNzb2YoZ2xvYmFsLm9wZXJhKSAhPT0gJ09wZXJhJzsKdmFyIFRZUEVEX0FSUkFZX1RBR19SRVFJUkVEID0gZmFsc2U7CnZhciBOQU1FOwoKdmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0ID0gewogIEludDhBcnJheTogMSwKICBVaW50OEFycmF5OiAxLAogIFVpbnQ4Q2xhbXBlZEFycmF5OiAxLAogIEludDE2QXJyYXk6IDIsCiAgVWludDE2QXJyYXk6IDIsCiAgSW50MzJBcnJheTogNCwKICBVaW50MzJBcnJheTogNCwKICBGbG9hdDMyQXJyYXk6IDQsCiAgRmxvYXQ2NEFycmF5OiA4Cn07Cgp2YXIgaXNWaWV3ID0gZnVuY3Rpb24gaXNWaWV3KGl0KSB7CiAgdmFyIGtsYXNzID0gY2xhc3NvZihpdCk7CiAgcmV0dXJuIGtsYXNzID09PSAnRGF0YVZpZXcnIHx8IGhhcyhUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCwga2xhc3MpOwp9OwoKdmFyIGlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uIChpdCkgewogIHJldHVybiBpc09iamVjdChpdCkgJiYgaGFzKFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0LCBjbGFzc29mKGl0KSk7Cn07Cgp2YXIgYVR5cGVkQXJyYXkgPSBmdW5jdGlvbiAoaXQpIHsKICBpZiAoaXNUeXBlZEFycmF5KGl0KSkgcmV0dXJuIGl0OwogIHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5Jyk7Cn07Cgp2YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChDKSB7CiAgaWYgKHNldFByb3RvdHlwZU9mKSB7CiAgICBpZiAoaXNQcm90b3R5cGVPZi5jYWxsKFR5cGVkQXJyYXksIEMpKSByZXR1cm4gQzsKICB9IGVsc2UgZm9yICh2YXIgQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIGlmIChoYXMoVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIE5BTUUpKSB7CiAgICB2YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZ2xvYmFsW0FSUkFZXTsKICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgKEMgPT09IFR5cGVkQXJyYXlDb25zdHJ1Y3RvciB8fCBpc1Byb3RvdHlwZU9mLmNhbGwoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBDKSkpIHsKICAgICAgcmV0dXJuIEM7CiAgICB9CiAgfSB0aHJvdyBUeXBlRXJyb3IoJ1RhcmdldCBpcyBub3QgYSB0eXBlZCBhcnJheSBjb25zdHJ1Y3RvcicpOwp9OwoKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBmdW5jdGlvbiAoS0VZLCBwcm9wZXJ0eSwgZm9yY2VkKSB7CiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuOwogIGlmIChmb3JjZWQpIGZvciAodmFyIEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7CiAgICB2YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZ2xvYmFsW0FSUkFZXTsKICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgaGFzKFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIEtFWSkpIHsKICAgICAgZGVsZXRlIFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGVbS0VZXTsKICAgIH0KICB9CiAgaWYgKCFUeXBlZEFycmF5UHJvdG90eXBlW0tFWV0gfHwgZm9yY2VkKSB7CiAgICByZWRlZmluZShUeXBlZEFycmF5UHJvdG90eXBlLCBLRVksIGZvcmNlZCA/IHByb3BlcnR5CiAgICAgIDogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBJbnQ4QXJyYXlQcm90b3R5cGVbS0VZXSB8fCBwcm9wZXJ0eSk7CiAgfQp9OwoKdmFyIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QgPSBmdW5jdGlvbiAoS0VZLCBwcm9wZXJ0eSwgZm9yY2VkKSB7CiAgdmFyIEFSUkFZLCBUeXBlZEFycmF5Q29uc3RydWN0b3I7CiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuOwogIGlmIChzZXRQcm90b3R5cGVPZikgewogICAgaWYgKGZvcmNlZCkgZm9yIChBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgewogICAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldOwogICAgICBpZiAoVHlwZWRBcnJheUNvbnN0cnVjdG9yICYmIGhhcyhUeXBlZEFycmF5Q29uc3RydWN0b3IsIEtFWSkpIHsKICAgICAgICBkZWxldGUgVHlwZWRBcnJheUNvbnN0cnVjdG9yW0tFWV07CiAgICAgIH0KICAgIH0KICAgIGlmICghVHlwZWRBcnJheVtLRVldIHx8IGZvcmNlZCkgewogICAgICAvLyBWOCB+IENocm9tZSA0OS01MCBgJVR5cGVkQXJyYXklYCBtZXRob2RzIGFyZSBub24td3JpdGFibGUgbm9uLWNvbmZpZ3VyYWJsZQogICAgICB0cnkgewogICAgICAgIHJldHVybiByZWRlZmluZShUeXBlZEFycmF5LCBLRVksIGZvcmNlZCA/IHByb3BlcnR5IDogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBJbnQ4QXJyYXlbS0VZXSB8fCBwcm9wZXJ0eSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH0KICAgIH0gZWxzZSByZXR1cm47CiAgfQogIGZvciAoQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHsKICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGdsb2JhbFtBUlJBWV07CiAgICBpZiAoVHlwZWRBcnJheUNvbnN0cnVjdG9yICYmICghVHlwZWRBcnJheUNvbnN0cnVjdG9yW0tFWV0gfHwgZm9yY2VkKSkgewogICAgICByZWRlZmluZShUeXBlZEFycmF5Q29uc3RydWN0b3IsIEtFWSwgcHJvcGVydHkpOwogICAgfQogIH0KfTsKCmZvciAoTkFNRSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgewogIGlmICghZ2xvYmFsW05BTUVdKSBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gZmFsc2U7Cn0KCi8vIFdlYktpdCBidWcgLSB0eXBlZCBhcnJheXMgY29uc3RydWN0b3JzIHByb3RvdHlwZSBpcyBPYmplY3QucHJvdG90eXBlCmlmICghTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB8fCB0eXBlb2YgVHlwZWRBcnJheSAhPSAnZnVuY3Rpb24nIHx8IFR5cGVkQXJyYXkgPT09IEZ1bmN0aW9uLnByb3RvdHlwZSkgewogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cKICBUeXBlZEFycmF5ID0gZnVuY3Rpb24gVHlwZWRBcnJheSgpIHsKICAgIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0IGludm9jYXRpb24nKTsKICB9OwogIGlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKSBmb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHsKICAgIGlmIChnbG9iYWxbTkFNRV0pIHNldFByb3RvdHlwZU9mKGdsb2JhbFtOQU1FXSwgVHlwZWRBcnJheSk7CiAgfQp9CgppZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfHwgIVR5cGVkQXJyYXlQcm90b3R5cGUgfHwgVHlwZWRBcnJheVByb3RvdHlwZSA9PT0gT2JqZWN0UHJvdG90eXBlKSB7CiAgVHlwZWRBcnJheVByb3RvdHlwZSA9IFR5cGVkQXJyYXkucHJvdG90eXBlOwogIGlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKSBmb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHsKICAgIGlmIChnbG9iYWxbTkFNRV0pIHNldFByb3RvdHlwZU9mKGdsb2JhbFtOQU1FXS5wcm90b3R5cGUsIFR5cGVkQXJyYXlQcm90b3R5cGUpOwogIH0KfQoKLy8gV2ViS2l0IGJ1ZyAtIG9uZSBtb3JlIG9iamVjdCBpbiBVaW50OENsYW1wZWRBcnJheSBwcm90b3R5cGUgY2hhaW4KaWYgKE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgJiYgZ2V0UHJvdG90eXBlT2YoVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUpICE9PSBUeXBlZEFycmF5UHJvdG90eXBlKSB7CiAgc2V0UHJvdG90eXBlT2YoVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUsIFR5cGVkQXJyYXlQcm90b3R5cGUpOwp9CgppZiAoREVTQ1JJUFRPUlMgJiYgIWhhcyhUeXBlZEFycmF5UHJvdG90eXBlLCBUT19TVFJJTkdfVEFHKSkgewogIFRZUEVEX0FSUkFZX1RBR19SRVFJUkVEID0gdHJ1ZTsKICBkZWZpbmVQcm9wZXJ0eShUeXBlZEFycmF5UHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB7IGdldDogZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIGlzT2JqZWN0KHRoaXMpID8gdGhpc1tUWVBFRF9BUlJBWV9UQUddIDogdW5kZWZpbmVkOwogIH0gfSk7CiAgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSBpZiAoZ2xvYmFsW05BTUVdKSB7CiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoZ2xvYmFsW05BTUVdLCBUWVBFRF9BUlJBWV9UQUcsIE5BTUUpOwogIH0KfQoKLy8gV2ViS2l0IGJ1ZyAtIHRoZSBzYW1lIHBhcmVudCBwcm90b3R5cGUgZm9yIHR5cGVkIGFycmF5cyBhbmQgZGF0YSB2aWV3CmlmIChOQVRJVkVfQVJSQVlfQlVGRkVSICYmIHNldFByb3RvdHlwZU9mICYmIGdldFByb3RvdHlwZU9mKERhdGFWaWV3UHJvdG90eXBlKSAhPT0gT2JqZWN0UHJvdG90eXBlKSB7CiAgc2V0UHJvdG90eXBlT2YoRGF0YVZpZXdQcm90b3R5cGUsIE9iamVjdFByb3RvdHlwZSk7Cn0KCm1vZHVsZS5leHBvcnRzID0gewogIE5BVElWRV9BUlJBWV9CVUZGRVI6IE5BVElWRV9BUlJBWV9CVUZGRVIsCiAgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUzogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUywKICBUWVBFRF9BUlJBWV9UQUc6IFRZUEVEX0FSUkFZX1RBR19SRVFJUkVEICYmIFRZUEVEX0FSUkFZX1RBRywKICBhVHlwZWRBcnJheTogYVR5cGVkQXJyYXksCiAgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjogYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciwKICBleHBvcnRUeXBlZEFycmF5TWV0aG9kOiBleHBvcnRUeXBlZEFycmF5TWV0aG9kLAogIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2Q6IGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QsCiAgaXNWaWV3OiBpc1ZpZXcsCiAgaXNUeXBlZEFycmF5OiBpc1R5cGVkQXJyYXksCiAgVHlwZWRBcnJheTogVHlwZWRBcnJheSwKICBUeXBlZEFycmF5UHJvdG90eXBlOiBUeXBlZEFycmF5UHJvdG90eXBlCn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgTkFUSVZFX0FSUkFZX0JVRkZFUiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIikuTkFUSVZFX0FSUkFZX0JVRkZFUjsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgcmVkZWZpbmVBbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS1hbGwuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiKTsKdmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgdG9JbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbmRleCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXguanMiKTsKdmFyIElFRUU3NTQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaWVlZTc1NCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWVlZTc1NC5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMiKS5mOwp2YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpLmY7CnZhciBhcnJheUZpbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktZmlsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZmlsbC5qcyIpOwp2YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIik7CnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIpOwoKdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDsKdmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKdmFyIEFSUkFZX0JVRkZFUiA9ICdBcnJheUJ1ZmZlcic7CnZhciBEQVRBX1ZJRVcgPSAnRGF0YVZpZXcnOwp2YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7CnZhciBXUk9OR19MRU5HVEggPSAnV3JvbmcgbGVuZ3RoJzsKdmFyIFdST05HX0lOREVYID0gJ1dyb25nIGluZGV4JzsKdmFyIE5hdGl2ZUFycmF5QnVmZmVyID0gZ2xvYmFsW0FSUkFZX0JVRkZFUl07CnZhciAkQXJyYXlCdWZmZXIgPSBOYXRpdmVBcnJheUJ1ZmZlcjsKdmFyICREYXRhVmlldyA9IGdsb2JhbFtEQVRBX1ZJRVddOwp2YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yOwoKdmFyIHBhY2tJRUVFNzU0ID0gSUVFRTc1NC5wYWNrOwp2YXIgdW5wYWNrSUVFRTc1NCA9IElFRUU3NTQudW5wYWNrOwoKdmFyIHBhY2tJbnQ4ID0gZnVuY3Rpb24gKG51bWJlcikgewogIHJldHVybiBbbnVtYmVyICYgMHhGRl07Cn07Cgp2YXIgcGFja0ludDE2ID0gZnVuY3Rpb24gKG51bWJlcikgewogIHJldHVybiBbbnVtYmVyICYgMHhGRiwgbnVtYmVyID4+IDggJiAweEZGXTsKfTsKCnZhciBwYWNrSW50MzIgPSBmdW5jdGlvbiAobnVtYmVyKSB7CiAgcmV0dXJuIFtudW1iZXIgJiAweEZGLCBudW1iZXIgPj4gOCAmIDB4RkYsIG51bWJlciA+PiAxNiAmIDB4RkYsIG51bWJlciA+PiAyNCAmIDB4RkZdOwp9OwoKdmFyIHVucGFja0ludDMyID0gZnVuY3Rpb24gKGJ1ZmZlcikgewogIHJldHVybiBidWZmZXJbM10gPDwgMjQgfCBidWZmZXJbMl0gPDwgMTYgfCBidWZmZXJbMV0gPDwgOCB8IGJ1ZmZlclswXTsKfTsKCnZhciBwYWNrRmxvYXQzMiA9IGZ1bmN0aW9uIChudW1iZXIpIHsKICByZXR1cm4gcGFja0lFRUU3NTQobnVtYmVyLCAyMywgNCk7Cn07Cgp2YXIgcGFja0Zsb2F0NjQgPSBmdW5jdGlvbiAobnVtYmVyKSB7CiAgcmV0dXJuIHBhY2tJRUVFNzU0KG51bWJlciwgNTIsIDgpOwp9OwoKdmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uIChDb25zdHJ1Y3Rvciwga2V5KSB7CiAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3JbUFJPVE9UWVBFXSwga2V5LCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKVtrZXldOyB9IH0pOwp9OwoKdmFyIGdldCA9IGZ1bmN0aW9uICh2aWV3LCBjb3VudCwgaW5kZXgsIGlzTGl0dGxlRW5kaWFuKSB7CiAgdmFyIGludEluZGV4ID0gdG9JbmRleChpbmRleCk7CiAgdmFyIHN0b3JlID0gZ2V0SW50ZXJuYWxTdGF0ZSh2aWV3KTsKICBpZiAoaW50SW5kZXggKyBjb3VudCA+IHN0b3JlLmJ5dGVMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfSU5ERVgpOwogIHZhciBieXRlcyA9IGdldEludGVybmFsU3RhdGUoc3RvcmUuYnVmZmVyKS5ieXRlczsKICB2YXIgc3RhcnQgPSBpbnRJbmRleCArIHN0b3JlLmJ5dGVPZmZzZXQ7CiAgdmFyIHBhY2sgPSBieXRlcy5zbGljZShzdGFydCwgc3RhcnQgKyBjb3VudCk7CiAgcmV0dXJuIGlzTGl0dGxlRW5kaWFuID8gcGFjayA6IHBhY2sucmV2ZXJzZSgpOwp9OwoKdmFyIHNldCA9IGZ1bmN0aW9uICh2aWV3LCBjb3VudCwgaW5kZXgsIGNvbnZlcnNpb24sIHZhbHVlLCBpc0xpdHRsZUVuZGlhbikgewogIHZhciBpbnRJbmRleCA9IHRvSW5kZXgoaW5kZXgpOwogIHZhciBzdG9yZSA9IGdldEludGVybmFsU3RhdGUodmlldyk7CiAgaWYgKGludEluZGV4ICsgY291bnQgPiBzdG9yZS5ieXRlTGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0lOREVYKTsKICB2YXIgYnl0ZXMgPSBnZXRJbnRlcm5hbFN0YXRlKHN0b3JlLmJ1ZmZlcikuYnl0ZXM7CiAgdmFyIHN0YXJ0ID0gaW50SW5kZXggKyBzdG9yZS5ieXRlT2Zmc2V0OwogIHZhciBwYWNrID0gY29udmVyc2lvbigrdmFsdWUpOwogIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgYnl0ZXNbc3RhcnQgKyBpXSA9IHBhY2tbaXNMaXR0bGVFbmRpYW4gPyBpIDogY291bnQgLSBpIC0gMV07Cn07CgppZiAoIU5BVElWRV9BUlJBWV9CVUZGRVIpIHsKICAkQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiBBcnJheUJ1ZmZlcihsZW5ndGgpIHsKICAgIGFuSW5zdGFuY2UodGhpcywgJEFycmF5QnVmZmVyLCBBUlJBWV9CVUZGRVIpOwogICAgdmFyIGJ5dGVMZW5ndGggPSB0b0luZGV4KGxlbmd0aCk7CiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsKICAgICAgYnl0ZXM6IGFycmF5RmlsbC5jYWxsKG5ldyBBcnJheShieXRlTGVuZ3RoKSwgMCksCiAgICAgIGJ5dGVMZW5ndGg6IGJ5dGVMZW5ndGgKICAgIH0pOwogICAgaWYgKCFERVNDUklQVE9SUykgdGhpcy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aDsKICB9OwoKICAkRGF0YVZpZXcgPSBmdW5jdGlvbiBEYXRhVmlldyhidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpIHsKICAgIGFuSW5zdGFuY2UodGhpcywgJERhdGFWaWV3LCBEQVRBX1ZJRVcpOwogICAgYW5JbnN0YW5jZShidWZmZXIsICRBcnJheUJ1ZmZlciwgREFUQV9WSUVXKTsKICAgIHZhciBidWZmZXJMZW5ndGggPSBnZXRJbnRlcm5hbFN0YXRlKGJ1ZmZlcikuYnl0ZUxlbmd0aDsKICAgIHZhciBvZmZzZXQgPSB0b0ludGVnZXIoYnl0ZU9mZnNldCk7CiAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmZXJMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG9mZnNldCcpOwogICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPT09IHVuZGVmaW5lZCA/IGJ1ZmZlckxlbmd0aCAtIG9mZnNldCA6IHRvTGVuZ3RoKGJ5dGVMZW5ndGgpOwogICAgaWYgKG9mZnNldCArIGJ5dGVMZW5ndGggPiBidWZmZXJMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTsKICAgIHNldEludGVybmFsU3RhdGUodGhpcywgewogICAgICBidWZmZXI6IGJ1ZmZlciwKICAgICAgYnl0ZUxlbmd0aDogYnl0ZUxlbmd0aCwKICAgICAgYnl0ZU9mZnNldDogb2Zmc2V0CiAgICB9KTsKICAgIGlmICghREVTQ1JJUFRPUlMpIHsKICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7CiAgICAgIHRoaXMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7CiAgICAgIHRoaXMuYnl0ZU9mZnNldCA9IG9mZnNldDsKICAgIH0KICB9OwoKICBpZiAoREVTQ1JJUFRPUlMpIHsKICAgIGFkZEdldHRlcigkQXJyYXlCdWZmZXIsICdieXRlTGVuZ3RoJyk7CiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCAnYnVmZmVyJyk7CiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCAnYnl0ZUxlbmd0aCcpOwogICAgYWRkR2V0dGVyKCREYXRhVmlldywgJ2J5dGVPZmZzZXQnKTsKICB9CgogIHJlZGVmaW5lQWxsKCREYXRhVmlld1tQUk9UT1RZUEVdLCB7CiAgICBnZXRJbnQ4OiBmdW5jdGlvbiBnZXRJbnQ4KGJ5dGVPZmZzZXQpIHsKICAgICAgcmV0dXJuIGdldCh0aGlzLCAxLCBieXRlT2Zmc2V0KVswXSA8PCAyNCA+PiAyNDsKICAgIH0sCiAgICBnZXRVaW50ODogZnVuY3Rpb24gZ2V0VWludDgoYnl0ZU9mZnNldCkgewogICAgICByZXR1cm4gZ2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQpWzBdOwogICAgfSwKICAgIGdldEludDE2OiBmdW5jdGlvbiBnZXRJbnQxNihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7CiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CiAgICAgIHJldHVybiAoYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdKSA8PCAxNiA+PiAxNjsKICAgIH0sCiAgICBnZXRVaW50MTY6IGZ1bmN0aW9uIGdldFVpbnQxNihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7CiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CiAgICAgIHJldHVybiBieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF07CiAgICB9LAogICAgZ2V0SW50MzI6IGZ1bmN0aW9uIGdldEludDMyKGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHsKICAgICAgcmV0dXJuIHVucGFja0ludDMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCkpOwogICAgfSwKICAgIGdldFVpbnQzMjogZnVuY3Rpb24gZ2V0VWludDMyKGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHsKICAgICAgcmV0dXJuIHVucGFja0ludDMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCkpID4+PiAwOwogICAgfSwKICAgIGdldEZsb2F0MzI6IGZ1bmN0aW9uIGdldEZsb2F0MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykgewogICAgICByZXR1cm4gdW5wYWNrSUVFRTc1NChnZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpLCAyMyk7CiAgICB9LAogICAgZ2V0RmxvYXQ2NDogZnVuY3Rpb24gZ2V0RmxvYXQ2NChieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7CiAgICAgIHJldHVybiB1bnBhY2tJRUVFNzU0KGdldCh0aGlzLCA4LCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCksIDUyKTsKICAgIH0sCiAgICBzZXRJbnQ4OiBmdW5jdGlvbiBzZXRJbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7CiAgICAgIHNldCh0aGlzLCAxLCBieXRlT2Zmc2V0LCBwYWNrSW50OCwgdmFsdWUpOwogICAgfSwKICAgIHNldFVpbnQ4OiBmdW5jdGlvbiBzZXRVaW50OChieXRlT2Zmc2V0LCB2YWx1ZSkgewogICAgICBzZXQodGhpcywgMSwgYnl0ZU9mZnNldCwgcGFja0ludDgsIHZhbHVlKTsKICAgIH0sCiAgICBzZXRJbnQxNjogZnVuY3Rpb24gc2V0SW50MTYoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHsKICAgICAgc2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIHBhY2tJbnQxNiwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkKTsKICAgIH0sCiAgICBzZXRVaW50MTY6IGZ1bmN0aW9uIHNldFVpbnQxNihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykgewogICAgICBzZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgcGFja0ludDE2LCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpOwogICAgfSwKICAgIHNldEludDMyOiBmdW5jdGlvbiBzZXRJbnQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykgewogICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0ludDMyLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpOwogICAgfSwKICAgIHNldFVpbnQzMjogZnVuY3Rpb24gc2V0VWludDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7CiAgICAgIHNldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBwYWNrSW50MzIsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7CiAgICB9LAogICAgc2V0RmxvYXQzMjogZnVuY3Rpb24gc2V0RmxvYXQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykgewogICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0Zsb2F0MzIsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7CiAgICB9LAogICAgc2V0RmxvYXQ2NDogZnVuY3Rpb24gc2V0RmxvYXQ2NChieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykgewogICAgICBzZXQodGhpcywgOCwgYnl0ZU9mZnNldCwgcGFja0Zsb2F0NjQsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7CiAgICB9CiAgfSk7Cn0gZWxzZSB7CiAgaWYgKCFmYWlscyhmdW5jdGlvbiAoKSB7CiAgICBOYXRpdmVBcnJheUJ1ZmZlcigxKTsKICB9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkgewogICAgbmV3IE5hdGl2ZUFycmF5QnVmZmVyKC0xKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXcKICB9KSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7CiAgICBuZXcgTmF0aXZlQXJyYXlCdWZmZXIoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXcKICAgIG5ldyBOYXRpdmVBcnJheUJ1ZmZlcigxLjUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldwogICAgbmV3IE5hdGl2ZUFycmF5QnVmZmVyKE5hTik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3CiAgICByZXR1cm4gTmF0aXZlQXJyYXlCdWZmZXIubmFtZSAhPSBBUlJBWV9CVUZGRVI7CiAgfSkpIHsKICAgICRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIEFycmF5QnVmZmVyKGxlbmd0aCkgewogICAgICBhbkluc3RhbmNlKHRoaXMsICRBcnJheUJ1ZmZlcik7CiAgICAgIHJldHVybiBuZXcgTmF0aXZlQXJyYXlCdWZmZXIodG9JbmRleChsZW5ndGgpKTsKICAgIH07CiAgICB2YXIgQXJyYXlCdWZmZXJQcm90b3R5cGUgPSAkQXJyYXlCdWZmZXJbUFJPVE9UWVBFXSA9IE5hdGl2ZUFycmF5QnVmZmVyW1BST1RPVFlQRV07CiAgICBmb3IgKHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhOYXRpdmVBcnJheUJ1ZmZlciksIGogPSAwLCBrZXk7IGtleXMubGVuZ3RoID4gajspIHsKICAgICAgaWYgKCEoKGtleSA9IGtleXNbaisrXSkgaW4gJEFycmF5QnVmZmVyKSkgewogICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSgkQXJyYXlCdWZmZXIsIGtleSwgTmF0aXZlQXJyYXlCdWZmZXJba2V5XSk7CiAgICAgIH0KICAgIH0KICAgIEFycmF5QnVmZmVyUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gJEFycmF5QnVmZmVyOwogIH0KICAvLyBpT1MgU2FmYXJpIDcueCBidWcKICB2YXIgdGVzdFZpZXcgPSBuZXcgJERhdGFWaWV3KG5ldyAkQXJyYXlCdWZmZXIoMikpOwogIHZhciBuYXRpdmVTZXRJbnQ4ID0gJERhdGFWaWV3W1BST1RPVFlQRV0uc2V0SW50ODsKICB0ZXN0Vmlldy5zZXRJbnQ4KDAsIDIxNDc0ODM2NDgpOwogIHRlc3RWaWV3LnNldEludDgoMSwgMjE0NzQ4MzY0OSk7CiAgaWYgKHRlc3RWaWV3LmdldEludDgoMCkgfHwgIXRlc3RWaWV3LmdldEludDgoMSkpIHJlZGVmaW5lQWxsKCREYXRhVmlld1tQUk9UT1RZUEVdLCB7CiAgICBzZXRJbnQ4OiBmdW5jdGlvbiBzZXRJbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7CiAgICAgIG5hdGl2ZVNldEludDguY2FsbCh0aGlzLCBieXRlT2Zmc2V0LCB2YWx1ZSA8PCAyNCA+PiAyNCk7CiAgICB9LAogICAgc2V0VWludDg6IGZ1bmN0aW9uIHNldFVpbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7CiAgICAgIG5hdGl2ZVNldEludDguY2FsbCh0aGlzLCBieXRlT2Zmc2V0LCB2YWx1ZSA8PCAyNCA+PiAyNCk7CiAgICB9CiAgfSwgeyB1bnNhZmU6IHRydWUgfSk7Cn0KCnNldFRvU3RyaW5nVGFnKCRBcnJheUJ1ZmZlciwgQVJSQVlfQlVGRkVSKTsKc2V0VG9TdHJpbmdUYWcoJERhdGFWaWV3LCBEQVRBX1ZJRVcpOwoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgQXJyYXlCdWZmZXI6ICRBcnJheUJ1ZmZlciwKICBEYXRhVmlldzogJERhdGFWaWV3Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktY29weS13aXRoaW4uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1jb3B5LXdpdGhpbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciB0b0Fic29sdXRlSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwoKdmFyIG1pbiA9IE1hdGgubWluOwoKLy8gYEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluYCBtZXRob2QgaW1wbGVtZW50YXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmNvcHl3aXRoaW4KbW9kdWxlLmV4cG9ydHMgPSBbXS5jb3B5V2l0aGluIHx8IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0IC8qID0gMCAqLywgc3RhcnQgLyogPSAwLCBlbmQgPSBAbGVuZ3RoICovKSB7CiAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTsKICB2YXIgbGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpOwogIHZhciB0byA9IHRvQWJzb2x1dGVJbmRleCh0YXJnZXQsIGxlbik7CiAgdmFyIGZyb20gPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbik7CiAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkOwogIHZhciBjb3VudCA9IG1pbigoZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW4pKSAtIGZyb20sIGxlbiAtIHRvKTsKICB2YXIgaW5jID0gMTsKICBpZiAoZnJvbSA8IHRvICYmIHRvIDwgZnJvbSArIGNvdW50KSB7CiAgICBpbmMgPSAtMTsKICAgIGZyb20gKz0gY291bnQgLSAxOwogICAgdG8gKz0gY291bnQgLSAxOwogIH0KICB3aGlsZSAoY291bnQtLSA+IDApIHsKICAgIGlmIChmcm9tIGluIE8pIE9bdG9dID0gT1tmcm9tXTsKICAgIGVsc2UgZGVsZXRlIE9bdG9dOwogICAgdG8gKz0gaW5jOwogICAgZnJvbSArPSBpbmM7CiAgfSByZXR1cm4gTzsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1maWxsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1maWxsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgdG9BYnNvbHV0ZUluZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKCi8vIGBBcnJheS5wcm90b3R5cGUuZmlsbGAgbWV0aG9kIGltcGxlbWVudGF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWxsCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZmlsbCh2YWx1ZSAvKiAsIHN0YXJ0ID0gMCwgZW5kID0gQGxlbmd0aCAqLykgewogIHZhciBPID0gdG9PYmplY3QodGhpcyk7CiAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTsKICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoYXJndW1lbnRzTGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgbGVuZ3RoKTsKICB2YXIgZW5kID0gYXJndW1lbnRzTGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDsKICB2YXIgZW5kUG9zID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW5ndGgpOwogIHdoaWxlIChlbmRQb3MgPiBpbmRleCkgT1tpbmRleCsrXSA9IHZhbHVlOwogIHJldHVybiBPOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZvci1lYWNoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZm9yLWVhY2guanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkZm9yRWFjaCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLmZvckVhY2g7CnZhciBzbG9wcHlBcnJheU1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zbG9wcHktYXJyYXktbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zbG9wcHktYXJyYXktbWV0aG9kLmpzIik7CgovLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZm9yZWFjaAptb2R1bGUuZXhwb3J0cyA9IHNsb3BweUFycmF5TWV0aG9kKCdmb3JFYWNoJykgPyBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7CiAgcmV0dXJuICRmb3JFYWNoKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKfSA6IFtdLmZvckVhY2g7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiKTsKdmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nLmpzIik7CnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QuanMiKTsKdmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIik7CnZhciBjcmVhdGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS5qcyIpOwp2YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIpOwoKLy8gYEFycmF5LmZyb21gIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5mcm9tCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UgLyogLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZCAqLykgewogIHZhciBPID0gdG9PYmplY3QoYXJyYXlMaWtlKTsKICB2YXIgQyA9IHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXk7CiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgdmFyIG1hcGZuID0gYXJndW1lbnRzTGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDsKICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7CiAgdmFyIGluZGV4ID0gMDsKICB2YXIgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChPKTsKICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yLCBuZXh0OwogIGlmIChtYXBwaW5nKSBtYXBmbiA9IGJpbmQobWFwZm4sIGFyZ3VtZW50c0xlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQsIDIpOwogIC8vIGlmIHRoZSB0YXJnZXQgaXMgbm90IGl0ZXJhYmxlIG9yIGl0J3MgYW4gYXJyYXkgd2l0aCB0aGUgZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBhIHNpbXBsZSBjYXNlCiAgaWYgKGl0ZXJhdG9yTWV0aG9kICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkpIHsKICAgIGl0ZXJhdG9yID0gaXRlcmF0b3JNZXRob2QuY2FsbChPKTsKICAgIG5leHQgPSBpdGVyYXRvci5uZXh0OwogICAgcmVzdWx0ID0gbmV3IEMoKTsKICAgIGZvciAoOyEoc3RlcCA9IG5leHQuY2FsbChpdGVyYXRvcikpLmRvbmU7IGluZGV4KyspIHsKICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZwogICAgICAgID8gY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpCiAgICAgICAgOiBzdGVwLnZhbHVlCiAgICAgICk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTsKICAgIHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7CiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgewogICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdKTsKICAgIH0KICB9CiAgcmVzdWx0Lmxlbmd0aCA9IGluZGV4OwogIHJldHVybiByZXN1bHQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanMiKTsKdmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIik7CnZhciB0b0Fic29sdXRlSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIik7CgovLyBgQXJyYXkucHJvdG90eXBlLnsgaW5kZXhPZiwgaW5jbHVkZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvbgp2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7CiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkgewogICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpOwogICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTsKICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7CiAgICB2YXIgdmFsdWU7CiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtCiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlCiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkgewogICAgICB2YWx1ZSA9IE9baW5kZXgrK107CiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUKICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTsKICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3QKICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgewogICAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7CiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7CiAgfTsKfTsKCm1vZHVsZS5leHBvcnRzID0gewogIC8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlcwogIGluY2x1ZGVzOiBjcmVhdGVNZXRob2QodHJ1ZSksCiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmRleE9mYCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5kZXhvZgogIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSkKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiKTsKdmFyIEluZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKdmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanMiKTsKCnZhciBwdXNoID0gW10ucHVzaDsKCi8vIGBBcnJheS5wcm90b3R5cGUueyBmb3JFYWNoLCBtYXAsIGZpbHRlciwgc29tZSwgZXZlcnksIGZpbmQsIGZpbmRJbmRleCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uCnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVFlQRSkgewogIHZhciBJU19NQVAgPSBUWVBFID09IDE7CiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjsKICB2YXIgSVNfU09NRSA9IFRZUEUgPT0gMzsKICB2YXIgSVNfRVZFUlkgPSBUWVBFID09IDQ7CiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7CiAgdmFyIE5PX0hPTEVTID0gVFlQRSA9PSA1IHx8IElTX0ZJTkRfSU5ERVg7CiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgY2FsbGJhY2tmbiwgdGhhdCwgc3BlY2lmaWNDcmVhdGUpIHsKICAgIHZhciBPID0gdG9PYmplY3QoJHRoaXMpOwogICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pOwogICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIHRoYXQsIDMpOwogICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKHNlbGYubGVuZ3RoKTsKICAgIHZhciBpbmRleCA9IDA7CiAgICB2YXIgY3JlYXRlID0gc3BlY2lmaWNDcmVhdGUgfHwgYXJyYXlTcGVjaWVzQ3JlYXRlOwogICAgdmFyIHRhcmdldCA9IElTX01BUCA/IGNyZWF0ZSgkdGhpcywgbGVuZ3RoKSA6IElTX0ZJTFRFUiA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWQ7CiAgICB2YXIgdmFsdWUsIHJlc3VsdDsKICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZikgewogICAgICB2YWx1ZSA9IHNlbGZbaW5kZXhdOwogICAgICByZXN1bHQgPSBib3VuZEZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgTyk7CiAgICAgIGlmIChUWVBFKSB7CiAgICAgICAgaWYgKElTX01BUCkgdGFyZ2V0W2luZGV4XSA9IHJlc3VsdDsgLy8gbWFwCiAgICAgICAgZWxzZSBpZiAocmVzdWx0KSBzd2l0Y2ggKFRZUEUpIHsKICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAvLyBzb21lCiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWx1ZTsgICAgICAgICAgICAgLy8gZmluZAogICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgIC8vIGZpbmRJbmRleAogICAgICAgICAgY2FzZSAyOiBwdXNoLmNhbGwodGFyZ2V0LCB2YWx1ZSk7IC8vIGZpbHRlcgogICAgICAgIH0gZWxzZSBpZiAoSVNfRVZFUlkpIHJldHVybiBmYWxzZTsgIC8vIGV2ZXJ5CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBJU19GSU5EX0lOREVYID8gLTEgOiBJU19TT01FIHx8IElTX0VWRVJZID8gSVNfRVZFUlkgOiB0YXJnZXQ7CiAgfTsKfTsKCm1vZHVsZS5leHBvcnRzID0gewogIC8vIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZvcmVhY2gKICBmb3JFYWNoOiBjcmVhdGVNZXRob2QoMCksCiAgLy8gYEFycmF5LnByb3RvdHlwZS5tYXBgIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5tYXAKICBtYXA6IGNyZWF0ZU1ldGhvZCgxKSwKICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbHRlcgogIGZpbHRlcjogY3JlYXRlTWV0aG9kKDIpLAogIC8vIGBBcnJheS5wcm90b3R5cGUuc29tZWAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNvbWUKICBzb21lOiBjcmVhdGVNZXRob2QoMyksCiAgLy8gYEFycmF5LnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmV2ZXJ5CiAgZXZlcnk6IGNyZWF0ZU1ldGhvZCg0KSwKICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRgIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kCiAgZmluZDogY3JlYXRlTWV0aG9kKDUpLAogIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4YCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZEluZGV4CiAgZmluZEluZGV4OiBjcmVhdGVNZXRob2QoNikKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1sYXN0LWluZGV4LW9mLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1sYXN0LWluZGV4LW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIik7CnZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW50ZWdlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKdmFyIHNsb3BweUFycmF5TWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Nsb3BweS1hcnJheS1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Nsb3BweS1hcnJheS1tZXRob2QuanMiKTsKCnZhciBtaW4gPSBNYXRoLm1pbjsKdmFyIG5hdGl2ZUxhc3RJbmRleE9mID0gW10ubGFzdEluZGV4T2Y7CnZhciBORUdBVElWRV9aRVJPID0gISFuYXRpdmVMYXN0SW5kZXhPZiAmJiAxIC8gWzFdLmxhc3RJbmRleE9mKDEsIC0wKSA8IDA7CnZhciBTTE9QUFlfTUVUSE9EID0gc2xvcHB5QXJyYXlNZXRob2QoJ2xhc3RJbmRleE9mJyk7CgovLyBgQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mYCBtZXRob2QgaW1wbGVtZW50YXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmxhc3RpbmRleG9mCm1vZHVsZS5leHBvcnRzID0gKE5FR0FUSVZFX1pFUk8gfHwgU0xPUFBZX01FVEhPRCkgPyBmdW5jdGlvbiBsYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ID0gQFsqLTFdICovKSB7CiAgLy8gY29udmVydCAtMCB0byArMAogIGlmIChORUdBVElWRV9aRVJPKSByZXR1cm4gbmF0aXZlTGFzdEluZGV4T2YuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCAwOwogIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KHRoaXMpOwogIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7CiAgdmFyIGluZGV4ID0gbGVuZ3RoIC0gMTsKICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIGluZGV4ID0gbWluKGluZGV4LCB0b0ludGVnZXIoYXJndW1lbnRzWzFdKSk7CiAgaWYgKGluZGV4IDwgMCkgaW5kZXggPSBsZW5ndGggKyBpbmRleDsKICBmb3IgKDtpbmRleCA+PSAwOyBpbmRleC0tKSBpZiAoaW5kZXggaW4gTyAmJiBPW2luZGV4XSA9PT0gc2VhcmNoRWxlbWVudCkgcmV0dXJuIGluZGV4IHx8IDA7CiAgcmV0dXJuIC0xOwp9IDogbmF0aXZlTGFzdEluZGV4T2Y7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwp2YXIgVjhfVkVSU0lPTiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy92OC12ZXJzaW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92OC12ZXJzaW9uLmpzIik7Cgp2YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUpIHsKICAvLyBXZSBjYW4ndCB1c2UgdGhpcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXMKICAvLyBkZW9wdGltaXphdGlvbiBhbmQgc2VyaW91cyBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbgogIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzcKICByZXR1cm4gVjhfVkVSU0lPTiA+PSA1MSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkgewogICAgdmFyIGFycmF5ID0gW107CiAgICB2YXIgY29uc3RydWN0b3IgPSBhcnJheS5jb25zdHJ1Y3RvciA9IHt9OwogICAgY29uc3RydWN0b3JbU1BFQ0lFU10gPSBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7IGZvbzogMSB9OwogICAgfTsKICAgIHJldHVybiBhcnJheVtNRVRIT0RfTkFNRV0oQm9vbGVhbikuZm9vICE9PSAxOwogIH0pOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXJlZHVjZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1yZWR1Y2UuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciBJbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKCi8vIGBBcnJheS5wcm90b3R5cGUueyByZWR1Y2UsIHJlZHVjZVJpZ2h0IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb24KdmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19SSUdIVCkgewogIHJldHVybiBmdW5jdGlvbiAodGhhdCwgY2FsbGJhY2tmbiwgYXJndW1lbnRzTGVuZ3RoLCBtZW1vKSB7CiAgICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7CiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoYXQpOwogICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pOwogICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTsKICAgIHZhciBpbmRleCA9IElTX1JJR0hUID8gbGVuZ3RoIC0gMSA6IDA7CiAgICB2YXIgaSA9IElTX1JJR0hUID8gLTEgOiAxOwogICAgaWYgKGFyZ3VtZW50c0xlbmd0aCA8IDIpIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChpbmRleCBpbiBzZWxmKSB7CiAgICAgICAgbWVtbyA9IHNlbGZbaW5kZXhdOwogICAgICAgIGluZGV4ICs9IGk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaW5kZXggKz0gaTsKICAgICAgaWYgKElTX1JJR0hUID8gaW5kZXggPCAwIDogbGVuZ3RoIDw9IGluZGV4KSB7CiAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7CiAgICAgIH0KICAgIH0KICAgIGZvciAoO0lTX1JJR0hUID8gaW5kZXggPj0gMCA6IGxlbmd0aCA+IGluZGV4OyBpbmRleCArPSBpKSBpZiAoaW5kZXggaW4gc2VsZikgewogICAgICBtZW1vID0gY2FsbGJhY2tmbihtZW1vLCBzZWxmW2luZGV4XSwgaW5kZXgsIE8pOwogICAgfQogICAgcmV0dXJuIG1lbW87CiAgfTsKfTsKCm1vZHVsZS5leHBvcnRzID0gewogIC8vIGBBcnJheS5wcm90b3R5cGUucmVkdWNlYCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmVkdWNlCiAgbGVmdDogY3JlYXRlTWV0aG9kKGZhbHNlKSwKICAvLyBgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0YCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmVkdWNlcmlnaHQKICByaWdodDogY3JlYXRlTWV0aG9kKHRydWUpCn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIik7CnZhciBpc0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKdmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTsKCi8vIGBBcnJheVNwZWNpZXNDcmVhdGVgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheXNwZWNpZXNjcmVhdGUKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7CiAgdmFyIEM7CiAgaWYgKGlzQXJyYXkob3JpZ2luYWxBcnJheSkpIHsKICAgIEMgPSBvcmlnaW5hbEFycmF5LmNvbnN0cnVjdG9yOwogICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2sKICAgIGlmICh0eXBlb2YgQyA9PSAnZnVuY3Rpb24nICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpIEMgPSB1bmRlZmluZWQ7CiAgICBlbHNlIGlmIChpc09iamVjdChDKSkgewogICAgICBDID0gQ1tTUEVDSUVTXTsKICAgICAgaWYgKEMgPT09IG51bGwpIEMgPSB1bmRlZmluZWQ7CiAgICB9CiAgfSByZXR1cm4gbmV3IChDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEMpKGxlbmd0aCA9PT0gMCA/IDAgOiBsZW5ndGgpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLWl0ZXJhdGlvbi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hc3luYy1pdGVyYXRvci1pdGVyYXRpb24uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKCnZhciBQcm9taXNlID0gZ2V0QnVpbHRJbignUHJvbWlzZScpOwp2YXIgcHVzaCA9IFtdLnB1c2g7Cgp2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHsKICB2YXIgSVNfVE9fQVJSQVkgPSBUWVBFID09IDA7CiAgdmFyIElTX0ZPUl9FQUNIID0gVFlQRSA9PSAxOwogIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gMjsKICB2YXIgSVNfU09NRSA9IFRZUEUgPT0gMzsKICByZXR1cm4gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbikgewogICAgYW5PYmplY3QoaXRlcmF0b3IpOwogICAgdmFyIG5leHQgPSBhRnVuY3Rpb24oaXRlcmF0b3IubmV4dCk7CiAgICB2YXIgYXJyYXkgPSBJU19UT19BUlJBWSA/IFtdIDogdW5kZWZpbmVkOwogICAgaWYgKCFJU19UT19BUlJBWSkgYUZ1bmN0aW9uKGZuKTsKCiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGFuT2JqZWN0KG5leHQuY2FsbChpdGVyYXRvcikpKS50aGVuKGZ1bmN0aW9uIChzdGVwKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgaWYgKGFuT2JqZWN0KHN0ZXApLmRvbmUpIHsKICAgICAgICAgICAgICAgIHJlc29sdmUoSVNfVE9fQVJSQVkgPyBhcnJheSA6IElTX1NPTUUgPyBmYWxzZSA6IElTX0VWRVJZIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHN0ZXAudmFsdWU7CiAgICAgICAgICAgICAgICBpZiAoSVNfVE9fQVJSQVkpIHsKICAgICAgICAgICAgICAgICAgcHVzaC5jYWxsKGFycmF5LCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIGxvb3AoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShmbih2YWx1ZSkpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChJU19GT1JfRUFDSCkgewogICAgICAgICAgICAgICAgICAgICAgbG9vcCgpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNfRVZFUlkpIHsKICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA/IGxvb3AoKSA6IHJlc29sdmUoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPyByZXNvbHZlKElTX1NPTUUgfHwgdmFsdWUpIDogbG9vcCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgeyByZWplY3QoZXJyKTsgfQogICAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyB9CiAgICAgIH07CgogICAgICBsb29wKCk7CiAgICB9KTsKICB9Owp9OwoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgdG9BcnJheTogY3JlYXRlTWV0aG9kKDApLAogIGZvckVhY2g6IGNyZWF0ZU1ldGhvZCgxKSwKICBldmVyeTogY3JlYXRlTWV0aG9kKDIpLAogIHNvbWU6IGNyZWF0ZU1ldGhvZCgzKSwKICBmaW5kOiBjcmVhdGVNZXRob2QoNCkKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hc3luYy1pdGVyYXRvci1wcm90b3R5cGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXN5bmMtaXRlcmF0b3ItcHJvdG90eXBlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzIik7CnZhciBnZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiKTsKdmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKCnZhciBVU0VfRlVOQ1RJT05fQ09OU1RSVUNUT1IgPSAnVVNFX0ZVTkNUSU9OX0NPTlNUUlVDVE9SJzsKdmFyIEFTWU5DX0lURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdhc3luY0l0ZXJhdG9yJyk7CnZhciBBc3luY0l0ZXJhdG9yID0gZ2xvYmFsLkFzeW5jSXRlcmF0b3I7CnZhciBQYXNzZWRBc3luY0l0ZXJhdG9yUHJvdG90eXBlID0gc2hhcmVkLkFzeW5jSXRlcmF0b3JQcm90b3R5cGU7CnZhciBBc3luY0l0ZXJhdG9yUHJvdG90eXBlLCBwcm90b3R5cGU7CgppZiAoIUlTX1BVUkUpIHsKICBpZiAoUGFzc2VkQXN5bmNJdGVyYXRvclByb3RvdHlwZSkgewogICAgQXN5bmNJdGVyYXRvclByb3RvdHlwZSA9IFBhc3NlZEFzeW5jSXRlcmF0b3JQcm90b3R5cGU7CiAgfSBlbHNlIGlmICh0eXBlb2YgQXN5bmNJdGVyYXRvciA9PSAnZnVuY3Rpb24nKSB7CiAgICBBc3luY0l0ZXJhdG9yUHJvdG90eXBlID0gQXN5bmNJdGVyYXRvci5wcm90b3R5cGU7CiAgfSBlbHNlIGlmIChzaGFyZWRbVVNFX0ZVTkNUSU9OX0NPTlNUUlVDVE9SXSB8fCBnbG9iYWxbVVNFX0ZVTkNUSU9OX0NPTlNUUlVDVE9SXSkgewogICAgdHJ5IHsKICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jCiAgICAgIHByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKEZ1bmN0aW9uKCdyZXR1cm4gYXN5bmMgZnVuY3Rpb24qKCl7fSgpJykoKSkpKTsKICAgICAgaWYgKGdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IE9iamVjdC5wcm90b3R5cGUpIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSBwcm90b3R5cGU7CiAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9CiAgfQp9CgppZiAoIUFzeW5jSXRlcmF0b3JQcm90b3R5cGUpIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSB7fTsKCmlmICghaGFzKEFzeW5jSXRlcmF0b3JQcm90b3R5cGUsIEFTWU5DX0lURVJBVE9SKSkgewogIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShBc3luY0l0ZXJhdG9yUHJvdG90eXBlLCBBU1lOQ19JVEVSQVRPUiwgZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSk7Cn0KCm1vZHVsZS5leHBvcnRzID0gQXN5bmNJdGVyYXRvclByb3RvdHlwZTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CgovLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmcKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkgewogIGFGdW5jdGlvbihmbik7CiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuOwogIHN3aXRjaCAobGVuZ3RoKSB7CiAgICBjYXNlIDA6IHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQpOwogICAgfTsKICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7CiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpOwogICAgfTsKICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpOwogICAgfTsKICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7CiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpOwogICAgfTsKICB9CiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7CiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTsKICB9Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwoKLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvcgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBFTlRSSUVTKSB7CiAgdHJ5IHsKICAgIHJldHVybiBFTlRSSUVTID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7CiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbikKICB9IGNhdGNoIChlcnJvcikgewogICAgdmFyIHJldHVybk1ldGhvZCA9IGl0ZXJhdG9yWydyZXR1cm4nXTsKICAgIGlmIChyZXR1cm5NZXRob2QgIT09IHVuZGVmaW5lZCkgYW5PYmplY3QocmV0dXJuTWV0aG9kLmNhbGwoaXRlcmF0b3IpKTsKICAgIHRocm93IGVycm9yOwogIH0KfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTsKdmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlOwoKdHJ5IHsKICB2YXIgY2FsbGVkID0gMDsKICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0gewogICAgbmV4dDogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4geyBkb25lOiAhIWNhbGxlZCsrIH07CiAgICB9LAogICAgJ3JldHVybic6IGZ1bmN0aW9uICgpIHsKICAgICAgU0FGRV9DTE9TSU5HID0gdHJ1ZTsKICAgIH0KICB9OwogIGl0ZXJhdG9yV2l0aFJldHVybltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gdGhpczsKICB9OwogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsCiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7Cn0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH0KCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykgewogIGlmICghU0tJUF9DTE9TSU5HICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTsKICB2YXIgSVRFUkFUSU9OX1NVUFBPUlQgPSBmYWxzZTsKICB0cnkgewogICAgdmFyIG9iamVjdCA9IHt9OwogICAgb2JqZWN0W0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4geyBkb25lOiBJVEVSQVRJT05fU1VQUE9SVCA9IHRydWUgfTsKICAgICAgICB9CiAgICAgIH07CiAgICB9OwogICAgZXhlYyhvYmplY3QpOwogIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH0KICByZXR1cm4gSVRFUkFUSU9OX1NVUFBPUlQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCnZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcyIpOwp2YXIgY2xhc3NvZlJhdyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mLXJhdyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpOwovLyBFUzMgd3JvbmcgaGVyZQp2YXIgQ09SUkVDVF9BUkdVTUVOVFMgPSBjbGFzc29mUmF3KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJzsKCi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yCnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkgewogIHRyeSB7CiAgICByZXR1cm4gaXRba2V5XTsKICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9Cn07CgovLyBnZXR0aW5nIHRhZyBmcm9tIEVTNisgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgCm1vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8gY2xhc3NvZlJhdyA6IGZ1bmN0aW9uIChpdCkgewogIHZhciBPLCB0YWcsIHJlc3VsdDsKICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCcKICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZQogICAgOiB0eXBlb2YgKHRhZyA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVE9fU1RSSU5HX1RBRykpID09ICdzdHJpbmcnID8gdGFnCiAgICAvLyBidWlsdGluVGFnIGNhc2UKICAgIDogQ09SUkVDVF9BUkdVTUVOVFMgPyBjbGFzc29mUmF3KE8pCiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrCiAgICA6IChyZXN1bHQgPSBjbGFzc29mUmF3KE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogcmVzdWx0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tYWRkLWFsbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLWFkZC1hbGwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9jb2xsZWN0aW9uLW1ldGhvZHMKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoLyogLi4uZWxlbWVudHMgKi8pIHsKICB2YXIgc2V0ID0gYW5PYmplY3QodGhpcyk7CiAgdmFyIGFkZGVyID0gYUZ1bmN0aW9uKHNldC5hZGQpOwogIGZvciAodmFyIGsgPSAwLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoOyBrIDwgbGVuOyBrKyspIHsKICAgIGFkZGVyLmNhbGwoc2V0LCBhcmd1bWVudHNba10pOwogIH0KICByZXR1cm4gc2V0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tZGVsZXRlLWFsbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLWRlbGV0ZS1hbGwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9jb2xsZWN0aW9uLW1ldGhvZHMKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoLyogLi4uZWxlbWVudHMgKi8pIHsKICB2YXIgY29sbGVjdGlvbiA9IGFuT2JqZWN0KHRoaXMpOwogIHZhciByZW1vdmVyID0gYUZ1bmN0aW9uKGNvbGxlY3Rpb25bJ2RlbGV0ZSddKTsKICB2YXIgYWxsRGVsZXRlZCA9IHRydWU7CiAgdmFyIHdhc0RlbGV0ZWQ7CiAgZm9yICh2YXIgayA9IDAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGsgPCBsZW47IGsrKykgewogICAgd2FzRGVsZXRlZCA9IHJlbW92ZXIuY2FsbChjb2xsZWN0aW9uLCBhcmd1bWVudHNba10pOwogICAgYWxsRGVsZXRlZCA9IGFsbERlbGV0ZWQgJiYgd2FzRGVsZXRlZDsKICB9CiAgcmV0dXJuICEhYWxsRGVsZXRlZDsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLWZyb20uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1mcm9tLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKHNvdXJjZSAvKiAsIG1hcEZuLCB0aGlzQXJnICovKSB7CiAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgdmFyIG1hcEZuID0gbGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDsKICB2YXIgbWFwcGluZywgQSwgbiwgYm91bmRGdW5jdGlvbjsKICBhRnVuY3Rpb24odGhpcyk7CiAgbWFwcGluZyA9IG1hcEZuICE9PSB1bmRlZmluZWQ7CiAgaWYgKG1hcHBpbmcpIGFGdW5jdGlvbihtYXBGbik7CiAgaWYgKHNvdXJjZSA9PSB1bmRlZmluZWQpIHJldHVybiBuZXcgdGhpcygpOwogIEEgPSBbXTsKICBpZiAobWFwcGluZykgewogICAgbiA9IDA7CiAgICBib3VuZEZ1bmN0aW9uID0gYmluZChtYXBGbiwgbGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCwgMik7CiAgICBpdGVyYXRlKHNvdXJjZSwgZnVuY3Rpb24gKG5leHRJdGVtKSB7CiAgICAgIEEucHVzaChib3VuZEZ1bmN0aW9uKG5leHRJdGVtLCBuKyspKTsKICAgIH0pOwogIH0gZWxzZSB7CiAgICBpdGVyYXRlKHNvdXJjZSwgQS5wdXNoLCBBKTsKICB9CiAgcmV0dXJuIG5ldyB0aGlzKEEpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tb2YuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8KbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBvZigpIHsKICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICB2YXIgQSA9IG5ldyBBcnJheShsZW5ndGgpOwogIHdoaWxlIChsZW5ndGgtLSkgQVtsZW5ndGhdID0gYXJndW1lbnRzW2xlbmd0aF07CiAgcmV0dXJuIG5ldyB0aGlzKEEpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIikuZjsKdmFyIGNyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzIik7CnZhciByZWRlZmluZUFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLWFsbC5qcyIpOwp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwp2YXIgZGVmaW5lSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3IuanMiKTsKdmFyIHNldFNwZWNpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIik7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIGZhc3RLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIikuZmFzdEtleTsKdmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIik7Cgp2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0Owp2YXIgaW50ZXJuYWxTdGF0ZUdldHRlckZvciA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yOwoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKSB7CiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7CiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgQ09OU1RSVUNUT1JfTkFNRSk7CiAgICAgIHNldEludGVybmFsU3RhdGUodGhhdCwgewogICAgICAgIHR5cGU6IENPTlNUUlVDVE9SX05BTUUsCiAgICAgICAgaW5kZXg6IGNyZWF0ZShudWxsKSwKICAgICAgICBmaXJzdDogdW5kZWZpbmVkLAogICAgICAgIGxhc3Q6IHVuZGVmaW5lZCwKICAgICAgICBzaXplOiAwCiAgICAgIH0pOwogICAgICBpZiAoIURFU0NSSVBUT1JTKSB0aGF0LnNpemUgPSAwOwogICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgdGhhdCwgSVNfTUFQKTsKICAgIH0pOwoKICAgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTsKCiAgICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHsKICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTsKICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTsKICAgICAgdmFyIHByZXZpb3VzLCBpbmRleDsKICAgICAgLy8gY2hhbmdlIGV4aXN0aW5nIGVudHJ5CiAgICAgIGlmIChlbnRyeSkgewogICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWU7CiAgICAgIC8vIGNyZWF0ZSBuZXcgZW50cnkKICAgICAgfSBlbHNlIHsKICAgICAgICBzdGF0ZS5sYXN0ID0gZW50cnkgPSB7CiAgICAgICAgICBpbmRleDogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksCiAgICAgICAgICBrZXk6IGtleSwKICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICAgIHByZXZpb3VzOiBwcmV2aW91cyA9IHN0YXRlLmxhc3QsCiAgICAgICAgICBuZXh0OiB1bmRlZmluZWQsCiAgICAgICAgICByZW1vdmVkOiBmYWxzZQogICAgICAgIH07CiAgICAgICAgaWYgKCFzdGF0ZS5maXJzdCkgc3RhdGUuZmlyc3QgPSBlbnRyeTsKICAgICAgICBpZiAocHJldmlvdXMpIHByZXZpb3VzLm5leHQgPSBlbnRyeTsKICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUrKzsKICAgICAgICBlbHNlIHRoYXQuc2l6ZSsrOwogICAgICAgIC8vIGFkZCB0byBpbmRleAogICAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSBzdGF0ZS5pbmRleFtpbmRleF0gPSBlbnRyeTsKICAgICAgfSByZXR1cm4gdGhhdDsKICAgIH07CgogICAgdmFyIGdldEVudHJ5ID0gZnVuY3Rpb24gKHRoYXQsIGtleSkgewogICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpOwogICAgICAvLyBmYXN0IGNhc2UKICAgICAgdmFyIGluZGV4ID0gZmFzdEtleShrZXkpOwogICAgICB2YXIgZW50cnk7CiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSByZXR1cm4gc3RhdGUuaW5kZXhbaW5kZXhdOwogICAgICAvLyBmcm96ZW4gb2JqZWN0IGNhc2UKICAgICAgZm9yIChlbnRyeSA9IHN0YXRlLmZpcnN0OyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uZXh0KSB7CiAgICAgICAgaWYgKGVudHJ5LmtleSA9PSBrZXkpIHJldHVybiBlbnRyeTsKICAgICAgfQogICAgfTsKCiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwgewogICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKCkKICAgICAgLy8gMjMuMi4zLjIgU2V0LnByb3RvdHlwZS5jbGVhcigpCiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHsKICAgICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTsKICAgICAgICB2YXIgZGF0YSA9IHN0YXRlLmluZGV4OwogICAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmZpcnN0OwogICAgICAgIHdoaWxlIChlbnRyeSkgewogICAgICAgICAgZW50cnkucmVtb3ZlZCA9IHRydWU7CiAgICAgICAgICBpZiAoZW50cnkucHJldmlvdXMpIGVudHJ5LnByZXZpb3VzID0gZW50cnkucHJldmlvdXMubmV4dCA9IHVuZGVmaW5lZDsKICAgICAgICAgIGRlbGV0ZSBkYXRhW2VudHJ5LmluZGV4XTsKICAgICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsKICAgICAgICB9CiAgICAgICAgc3RhdGUuZmlyc3QgPSBzdGF0ZS5sYXN0ID0gdW5kZWZpbmVkOwogICAgICAgIGlmIChERVNDUklQVE9SUykgc3RhdGUuc2l6ZSA9IDA7CiAgICAgICAgZWxzZSB0aGF0LnNpemUgPSAwOwogICAgICB9LAogICAgICAvLyAyMy4xLjMuMyBNYXAucHJvdG90eXBlLmRlbGV0ZShrZXkpCiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKQogICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkgewogICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpOwogICAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7CiAgICAgICAgaWYgKGVudHJ5KSB7CiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm5leHQ7CiAgICAgICAgICB2YXIgcHJldiA9IGVudHJ5LnByZXZpb3VzOwogICAgICAgICAgZGVsZXRlIHN0YXRlLmluZGV4W2VudHJ5LmluZGV4XTsKICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlOwogICAgICAgICAgaWYgKHByZXYpIHByZXYubmV4dCA9IG5leHQ7CiAgICAgICAgICBpZiAobmV4dCkgbmV4dC5wcmV2aW91cyA9IHByZXY7CiAgICAgICAgICBpZiAoc3RhdGUuZmlyc3QgPT0gZW50cnkpIHN0YXRlLmZpcnN0ID0gbmV4dDsKICAgICAgICAgIGlmIChzdGF0ZS5sYXN0ID09IGVudHJ5KSBzdGF0ZS5sYXN0ID0gcHJldjsKICAgICAgICAgIGlmIChERVNDUklQVE9SUykgc3RhdGUuc2l6ZS0tOwogICAgICAgICAgZWxzZSB0aGF0LnNpemUtLTsKICAgICAgICB9IHJldHVybiAhIWVudHJ5OwogICAgICB9LAogICAgICAvLyAyMy4yLjMuNiBTZXQucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZCkKICAgICAgLy8gMjMuMS4zLjUgTWFwLnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpCiAgICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHsKICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOwogICAgICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7CiAgICAgICAgdmFyIGVudHJ5OwogICAgICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubmV4dCA6IHN0YXRlLmZpcnN0KSB7CiAgICAgICAgICBib3VuZEZ1bmN0aW9uKGVudHJ5LnZhbHVlLCBlbnRyeS5rZXksIHRoaXMpOwogICAgICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5CiAgICAgICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucmVtb3ZlZCkgZW50cnkgPSBlbnRyeS5wcmV2aW91czsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSkKICAgICAgLy8gMjMuMi4zLjcgU2V0LnByb3RvdHlwZS5oYXModmFsdWUpCiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkgewogICAgICAgIHJldHVybiAhIWdldEVudHJ5KHRoaXMsIGtleSk7CiAgICAgIH0KICAgIH0pOwoKICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBJU19NQVAgPyB7CiAgICAgIC8vIDIzLjEuMy42IE1hcC5wcm90b3R5cGUuZ2V0KGtleSkKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7CiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhpcywga2V5KTsKICAgICAgICByZXR1cm4gZW50cnkgJiYgZW50cnkudmFsdWU7CiAgICAgIH0sCiAgICAgIC8vIDIzLjEuMy45IE1hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpCiAgICAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTsKICAgICAgfQogICAgfSA6IHsKICAgICAgLy8gMjMuMi4zLjEgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpCiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCB2YWx1ZSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlLCB2YWx1ZSk7CiAgICAgIH0KICAgIH0pOwogICAgaWYgKERFU0NSSVBUT1JTKSBkZWZpbmVQcm9wZXJ0eShDLnByb3RvdHlwZSwgJ3NpemUnLCB7CiAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNpemU7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIEM7CiAgfSwKICBzZXRTdHJvbmc6IGZ1bmN0aW9uIChDLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVApIHsKICAgIHZhciBJVEVSQVRPUl9OQU1FID0gQ09OU1RSVUNUT1JfTkFNRSArICcgSXRlcmF0b3InOwogICAgdmFyIGdldEludGVybmFsQ29sbGVjdGlvblN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTsKICAgIHZhciBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKElURVJBVE9SX05BTUUpOwogICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdCiAgICAvLyAyMy4xLjMuNCwgMjMuMS4zLjgsIDIzLjEuMy4xMSwgMjMuMS4zLjEyLCAyMy4yLjMuNSwgMjMuMi4zLjgsIDIzLjIuMy4xMCwgMjMuMi4zLjExCiAgICBkZWZpbmVJdGVyYXRvcihDLCBDT05TVFJVQ1RPUl9OQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHsKICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7CiAgICAgICAgdHlwZTogSVRFUkFUT1JfTkFNRSwKICAgICAgICB0YXJnZXQ6IGl0ZXJhdGVkLAogICAgICAgIHN0YXRlOiBnZXRJbnRlcm5hbENvbGxlY3Rpb25TdGF0ZShpdGVyYXRlZCksCiAgICAgICAga2luZDoga2luZCwKICAgICAgICBsYXN0OiB1bmRlZmluZWQKICAgICAgfSk7CiAgICB9LCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSh0aGlzKTsKICAgICAgdmFyIGtpbmQgPSBzdGF0ZS5raW5kOwogICAgICB2YXIgZW50cnkgPSBzdGF0ZS5sYXN0OwogICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnkKICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnJlbW92ZWQpIGVudHJ5ID0gZW50cnkucHJldmlvdXM7CiAgICAgIC8vIGdldCBuZXh0IGVudHJ5CiAgICAgIGlmICghc3RhdGUudGFyZ2V0IHx8ICEoc3RhdGUubGFzdCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuc3RhdGUuZmlyc3QpKSB7CiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb24KICAgICAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7CiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9OwogICAgICB9CiAgICAgIC8vIHJldHVybiBzdGVwIGJ5IGtpbmQKICAgICAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4geyB2YWx1ZTogZW50cnkua2V5LCBkb25lOiBmYWxzZSB9OwogICAgICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IGVudHJ5LnZhbHVlLCBkb25lOiBmYWxzZSB9OwogICAgICByZXR1cm4geyB2YWx1ZTogW2VudHJ5LmtleSwgZW50cnkudmFsdWVdLCBkb25lOiBmYWxzZSB9OwogICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpOwoKICAgIC8vIGFkZCBbQEBzcGVjaWVzXSwgMjMuMS4yLjIsIDIzLjIuMi4yCiAgICBzZXRTcGVjaWVzKENPTlNUUlVDVE9SX05BTUUpOwogIH0KfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXdlYWsuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIHJlZGVmaW5lQWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzIik7CnZhciBnZXRXZWFrRGF0YSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanMiKS5nZXRXZWFrRGF0YTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwp2YXIgQXJyYXlJdGVyYXRpb25Nb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiKTsKdmFyICRoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIik7Cgp2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0Owp2YXIgaW50ZXJuYWxTdGF0ZUdldHRlckZvciA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yOwp2YXIgZmluZCA9IEFycmF5SXRlcmF0aW9uTW9kdWxlLmZpbmQ7CnZhciBmaW5kSW5kZXggPSBBcnJheUl0ZXJhdGlvbk1vZHVsZS5maW5kSW5kZXg7CnZhciBpZCA9IDA7CgovLyBmYWxsYmFjayBmb3IgdW5jYXVnaHQgZnJvemVuIGtleXMKdmFyIHVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoc3RvcmUpIHsKICByZXR1cm4gc3RvcmUuZnJvemVuIHx8IChzdG9yZS5mcm96ZW4gPSBuZXcgVW5jYXVnaHRGcm96ZW5TdG9yZSgpKTsKfTsKCnZhciBVbmNhdWdodEZyb3plblN0b3JlID0gZnVuY3Rpb24gKCkgewogIHRoaXMuZW50cmllcyA9IFtdOwp9OwoKdmFyIGZpbmRVbmNhdWdodEZyb3plbiA9IGZ1bmN0aW9uIChzdG9yZSwga2V5KSB7CiAgcmV0dXJuIGZpbmQoc3RvcmUuZW50cmllcywgZnVuY3Rpb24gKGl0KSB7CiAgICByZXR1cm4gaXRbMF0gPT09IGtleTsKICB9KTsKfTsKClVuY2F1Z2h0RnJvemVuU3RvcmUucHJvdG90eXBlID0gewogIGdldDogZnVuY3Rpb24gKGtleSkgewogICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7CiAgICBpZiAoZW50cnkpIHJldHVybiBlbnRyeVsxXTsKICB9LAogIGhhczogZnVuY3Rpb24gKGtleSkgewogICAgcmV0dXJuICEhZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7CiAgfSwKICBzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CiAgICB2YXIgZW50cnkgPSBmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTsKICAgIGlmIChlbnRyeSkgZW50cnlbMV0gPSB2YWx1ZTsKICAgIGVsc2UgdGhpcy5lbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTsKICB9LAogICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7CiAgICB2YXIgaW5kZXggPSBmaW5kSW5kZXgodGhpcy5lbnRyaWVzLCBmdW5jdGlvbiAoaXQpIHsKICAgICAgcmV0dXJuIGl0WzBdID09PSBrZXk7CiAgICB9KTsKICAgIGlmICh+aW5kZXgpIHRoaXMuZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpOwogICAgcmV0dXJuICEhfmluZGV4OwogIH0KfTsKCm1vZHVsZS5leHBvcnRzID0gewogIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUikgewogICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkgewogICAgICBhbkluc3RhbmNlKHRoYXQsIEMsIENPTlNUUlVDVE9SX05BTUUpOwogICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHsKICAgICAgICB0eXBlOiBDT05TVFJVQ1RPUl9OQU1FLAogICAgICAgIGlkOiBpZCsrLAogICAgICAgIGZyb3plbjogdW5kZWZpbmVkCiAgICAgIH0pOwogICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgdGhhdCwgSVNfTUFQKTsKICAgIH0pOwoKICAgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTsKCiAgICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHsKICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTsKICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShhbk9iamVjdChrZXkpLCB0cnVlKTsKICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpLnNldChrZXksIHZhbHVlKTsKICAgICAgZWxzZSBkYXRhW3N0YXRlLmlkXSA9IHZhbHVlOwogICAgICByZXR1cm4gdGhhdDsKICAgIH07CgogICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIHsKICAgICAgLy8gMjMuMy4zLjIgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlKGtleSkKICAgICAgLy8gMjMuNC4zLjMgV2Vha1NldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKQogICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkgewogICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7CiAgICAgICAgaWYgKCFpc09iamVjdChrZXkpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShrZXkpOwogICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSlbJ2RlbGV0ZSddKGtleSk7CiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCBzdGF0ZS5pZCkgJiYgZGVsZXRlIGRhdGFbc3RhdGUuaWRdOwogICAgICB9LAogICAgICAvLyAyMy4zLjMuNCBXZWFrTWFwLnByb3RvdHlwZS5oYXMoa2V5KQogICAgICAvLyAyMy40LjMuNCBXZWFrU2V0LnByb3RvdHlwZS5oYXModmFsdWUpCiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkgewogICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7CiAgICAgICAgaWYgKCFpc09iamVjdChrZXkpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShrZXkpOwogICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuaGFzKGtleSk7CiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCBzdGF0ZS5pZCk7CiAgICAgIH0KICAgIH0pOwoKICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBJU19NQVAgPyB7CiAgICAgIC8vIDIzLjMuMy4zIFdlYWtNYXAucHJvdG90eXBlLmdldChrZXkpCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkgewogICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7CiAgICAgICAgaWYgKGlzT2JqZWN0KGtleSkpIHsKICAgICAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoa2V5KTsKICAgICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuZ2V0KGtleSk7CiAgICAgICAgICByZXR1cm4gZGF0YSA/IGRhdGFbc3RhdGUuaWRdIDogdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLy8gMjMuMy4zLjUgV2Vha01hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpCiAgICAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIGtleSwgdmFsdWUpOwogICAgICB9CiAgICB9IDogewogICAgICAvLyAyMy40LjMuMSBXZWFrU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpCiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCB2YWx1ZSwgdHJ1ZSk7CiAgICAgIH0KICAgIH0pOwoKICAgIHJldHVybiBDOwogIH0KfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIGlzRm9yY2VkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzIik7CnZhciByZWRlZmluZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUuanMiKTsKdmFyIEludGVybmFsTWV0YWRhdGFNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKdmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiKTsKdmFyIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyIpOwp2YXIgaW5oZXJpdElmUmVxdWlyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZC5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSwgd3JhcHBlciwgY29tbW9uKSB7CiAgdmFyIElTX01BUCA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignTWFwJykgIT09IC0xOwogIHZhciBJU19XRUFLID0gQ09OU1RSVUNUT1JfTkFNRS5pbmRleE9mKCdXZWFrJykgIT09IC0xOwogIHZhciBBRERFUiA9IElTX01BUCA/ICdzZXQnIDogJ2FkZCc7CiAgdmFyIE5hdGl2ZUNvbnN0cnVjdG9yID0gZ2xvYmFsW0NPTlNUUlVDVE9SX05BTUVdOwogIHZhciBOYXRpdmVQcm90b3R5cGUgPSBOYXRpdmVDb25zdHJ1Y3RvciAmJiBOYXRpdmVDb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgdmFyIENvbnN0cnVjdG9yID0gTmF0aXZlQ29uc3RydWN0b3I7CiAgdmFyIGV4cG9ydGVkID0ge307CgogIHZhciBmaXhNZXRob2QgPSBmdW5jdGlvbiAoS0VZKSB7CiAgICB2YXIgbmF0aXZlTWV0aG9kID0gTmF0aXZlUHJvdG90eXBlW0tFWV07CiAgICByZWRlZmluZShOYXRpdmVQcm90b3R5cGUsIEtFWSwKICAgICAgS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKHZhbHVlKSB7CiAgICAgICAgbmF0aXZlTWV0aG9kLmNhbGwodGhpcywgdmFsdWUgPT09IDAgPyAwIDogdmFsdWUpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9IDogS0VZID09ICdkZWxldGUnID8gZnVuY3Rpb24gKGtleSkgewogICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gZmFsc2UgOiBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5KTsKICAgICAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChrZXkpIHsKICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IHVuZGVmaW5lZCA6IG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpOwogICAgICB9IDogS0VZID09ICdoYXMnID8gZnVuY3Rpb24gaGFzKGtleSkgewogICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gZmFsc2UgOiBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5KTsKICAgICAgfSA6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7CiAgICAgICAgbmF0aXZlTWV0aG9kLmNhbGwodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICApOwogIH07CgogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuCiAgaWYgKGlzRm9yY2VkKENPTlNUUlVDVE9SX05BTUUsIHR5cGVvZiBOYXRpdmVDb25zdHJ1Y3RvciAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBOYXRpdmVQcm90b3R5cGUuZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgewogICAgbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCkuZW50cmllcygpLm5leHQoKTsKICB9KSkpKSB7CiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvcgogICAgQ29uc3RydWN0b3IgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUik7CiAgICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLlJFUVVJUkVEID0gdHJ1ZTsKICB9IGVsc2UgaWYgKGlzRm9yY2VkKENPTlNUUlVDVE9SX05BTUUsIHRydWUpKSB7CiAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTsKICAgIC8vIGVhcmx5IGltcGxlbWVudGF0aW9ucyBub3Qgc3VwcG9ydHMgY2hhaW5pbmcKICAgIHZhciBIQVNOVF9DSEFJTklORyA9IGluc3RhbmNlW0FEREVSXShJU19XRUFLID8ge30gOiAtMCwgMSkgIT0gaW5zdGFuY2U7CiAgICAvLyBWOCB+IENocm9taXVtIDQwLSB3ZWFrLWNvbGxlY3Rpb25zIHRocm93cyBvbiBwcmltaXRpdmVzLCBidXQgc2hvdWxkIHJldHVybiBmYWxzZQogICAgdmFyIFRIUk9XU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBpbnN0YW5jZS5oYXMoMSk7IH0pOwogICAgLy8gbW9zdCBlYXJseSBpbXBsZW1lbnRhdGlvbnMgZG9lc24ndCBzdXBwb3J0cyBpdGVyYWJsZXMsIG1vc3QgbW9kZXJuIC0gbm90IGNsb3NlIGl0IGNvcnJlY3RseQogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldwogICAgdmFyIEFDQ0VQVF9JVEVSQUJMRVMgPSBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7IG5ldyBOYXRpdmVDb25zdHJ1Y3RvcihpdGVyYWJsZSk7IH0pOwogICAgLy8gZm9yIGVhcmx5IGltcGxlbWVudGF0aW9ucyAtMCBhbmQgKzAgbm90IHRoZSBzYW1lCiAgICB2YXIgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uICgpIHsKICAgICAgLy8gVjggfiBDaHJvbWl1bSA0Mi0gZmFpbHMgb25seSB3aXRoIDUrIGVsZW1lbnRzCiAgICAgIHZhciAkaW5zdGFuY2UgPSBuZXcgTmF0aXZlQ29uc3RydWN0b3IoKTsKICAgICAgdmFyIGluZGV4ID0gNTsKICAgICAgd2hpbGUgKGluZGV4LS0pICRpbnN0YW5jZVtBRERFUl0oaW5kZXgsIGluZGV4KTsKICAgICAgcmV0dXJuICEkaW5zdGFuY2UuaGFzKC0wKTsKICAgIH0pOwoKICAgIGlmICghQUNDRVBUX0lURVJBQkxFUykgewogICAgICBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKGR1bW15LCBpdGVyYWJsZSkgewogICAgICAgIGFuSW5zdGFuY2UoZHVtbXksIENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FKTsKICAgICAgICB2YXIgdGhhdCA9IGluaGVyaXRJZlJlcXVpcmVkKG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLCBkdW1teSwgQ29uc3RydWN0b3IpOwogICAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGl0ZXJhdGUoaXRlcmFibGUsIHRoYXRbQURERVJdLCB0aGF0LCBJU19NQVApOwogICAgICAgIHJldHVybiB0aGF0OwogICAgICB9KTsKICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gTmF0aXZlUHJvdG90eXBlOwogICAgICBOYXRpdmVQcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjsKICAgIH0KCiAgICBpZiAoVEhST1dTX09OX1BSSU1JVElWRVMgfHwgQlVHR1lfWkVSTykgewogICAgICBmaXhNZXRob2QoJ2RlbGV0ZScpOwogICAgICBmaXhNZXRob2QoJ2hhcycpOwogICAgICBJU19NQVAgJiYgZml4TWV0aG9kKCdnZXQnKTsKICAgIH0KCiAgICBpZiAoQlVHR1lfWkVSTyB8fCBIQVNOVF9DSEFJTklORykgZml4TWV0aG9kKEFEREVSKTsKCiAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIHNob3VsZCBub3QgY29udGFpbnMgLmNsZWFyIG1ldGhvZAogICAgaWYgKElTX1dFQUsgJiYgTmF0aXZlUHJvdG90eXBlLmNsZWFyKSBkZWxldGUgTmF0aXZlUHJvdG90eXBlLmNsZWFyOwogIH0KCiAgZXhwb3J0ZWRbQ09OU1RSVUNUT1JfTkFNRV0gPSBDb25zdHJ1Y3RvcjsKICAkKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IENvbnN0cnVjdG9yICE9IE5hdGl2ZUNvbnN0cnVjdG9yIH0sIGV4cG9ydGVkKTsKCiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpOwoKICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCk7CgogIHJldHVybiBDb25zdHJ1Y3RvcjsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb21wb3NpdGUta2V5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb21wb3NpdGUta2V5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIFRPRE86IGluIGNvcmUtanNANCwgbW92ZSAvbW9kdWxlcy8gZGVwZW5kZW5jaWVzIHRvIHB1YmxpYyBlbnRyaWVzIGZvciBiZXR0ZXIgb3B0aW1pemF0aW9uIGJ5IHRvb2xzIGxpa2UgYHByZXNldC1lbnZgCnZhciBNYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm1hcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyIpOwp2YXIgV2Vha01hcCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMud2Vhay1tYXAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLW1hcC5qcyIpOwp2YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiKTsKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIik7Cgp2YXIgTm9kZSA9IGZ1bmN0aW9uICgpIHsKICAvLyBrZXlzCiAgdGhpcy5vYmplY3QgPSBudWxsOwogIHRoaXMuc3ltYm9sID0gbnVsbDsKICAvLyBjaGlsZCBub2RlcwogIHRoaXMucHJpbWl0aXZlcyA9IG51bGw7CiAgdGhpcy5vYmplY3RzQnlJbmRleCA9IGNyZWF0ZShudWxsKTsKfTsKCk5vZGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXksIGluaXRpYWxpemVyKSB7CiAgcmV0dXJuIHRoaXNba2V5XSB8fCAodGhpc1trZXldID0gaW5pdGlhbGl6ZXIoKSk7Cn07CgpOb2RlLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKGksIGl0LCBJU19PQkpFQ1QpIHsKICB2YXIgc3RvcmUgPSBJU19PQkpFQ1QKICAgID8gdGhpcy5vYmplY3RzQnlJbmRleFtpXSB8fCAodGhpcy5vYmplY3RzQnlJbmRleFtpXSA9IG5ldyBXZWFrTWFwKCkpCiAgICA6IHRoaXMucHJpbWl0aXZlcyB8fCAodGhpcy5wcmltaXRpdmVzID0gbmV3IE1hcCgpKTsKICB2YXIgZW50cnkgPSBzdG9yZS5nZXQoaXQpOwogIGlmICghZW50cnkpIHN0b3JlLnNldChpdCwgZW50cnkgPSBuZXcgTm9kZSgpKTsKICByZXR1cm4gZW50cnk7Cn07Cgp2YXIgcm9vdCA9IG5ldyBOb2RlKCk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsKICB2YXIgYWN0aXZlID0gcm9vdDsKICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICB2YXIgaSwgaXQ7CiAgLy8gZm9yIHByZXZlbnQgbGVha2luZywgc3RhcnQgZnJvbSBvYmplY3RzCiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBpZiAoaXNPYmplY3QoaXQgPSBhcmd1bWVudHNbaV0pKSBhY3RpdmUgPSBhY3RpdmUubmV4dChpLCBpdCwgdHJ1ZSk7CiAgfQogIGlmICh0aGlzID09PSBPYmplY3QgJiYgYWN0aXZlID09PSByb290KSB0aHJvdyBUeXBlRXJyb3IoJ0NvbXBvc2l0ZSBrZXlzIG11c3QgY29udGFpbiBhIG5vbi1wcmltaXRpdmUgY29tcG9uZW50Jyk7CiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBpZiAoIWlzT2JqZWN0KGl0ID0gYXJndW1lbnRzW2ldKSkgYWN0aXZlID0gYWN0aXZlLm5leHQoaSwgaXQsIGZhbHNlKTsKICB9IHJldHVybiBhY3RpdmU7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIG93bktleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb3duLWtleXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIik7CnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHsKICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTsKICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mOwogIHZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjsKICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBrZXkgPSBrZXlzW2ldOwogICAgaWYgKCFoYXModGFyZ2V0LCBrZXkpKSBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7CiAgfQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7Cgp2YXIgTUFUQ0ggPSB3ZWxsS25vd25TeW1ib2woJ21hdGNoJyk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkgewogIHZhciByZWdleHAgPSAvLi87CiAgdHJ5IHsKICAgICcvLi8nW01FVEhPRF9OQU1FXShyZWdleHApOwogIH0gY2F0Y2ggKGUpIHsKICAgIHRyeSB7CiAgICAgIHJlZ2V4cFtNQVRDSF0gPSBmYWxzZTsKICAgICAgcmV0dXJuICcvLi8nW01FVEhPRF9OQU1FXShyZWdleHApOwogICAgfSBjYXRjaCAoZikgeyAvKiBlbXB0eSAqLyB9CiAgfSByZXR1cm4gZmFsc2U7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKCm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsKICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9CiAgRi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBudWxsOwogIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYoKSkgIT09IEYucHJvdG90eXBlOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtYXN5bmMtaXRlcmF0b3ItcHJveHkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWFzeW5jLWl0ZXJhdG9yLXByb3h5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIHBhdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGF0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIpOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7CnZhciByZWRlZmluZUFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLWFsbC5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwp2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKCnZhciBQcm9taXNlID0gZ2V0QnVpbHRJbignUHJvbWlzZScpOwoKdmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDsKCnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpOwoKdmFyICRyZXR1cm4gPSBmdW5jdGlvbiAodmFsdWUpIHsKICB2YXIgaXRlcmF0b3IgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLml0ZXJhdG9yOwogIHZhciAkJHJldHVybiA9IGl0ZXJhdG9yWydyZXR1cm4nXTsKICByZXR1cm4gJCRyZXR1cm4gPT09IHVuZGVmaW5lZAogICAgPyBQcm9taXNlLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSkKICAgIDogYW5PYmplY3QoJCRyZXR1cm4uY2FsbChpdGVyYXRvciwgdmFsdWUpKTsKfTsKCnZhciAkdGhyb3cgPSBmdW5jdGlvbiAodmFsdWUpIHsKICB2YXIgaXRlcmF0b3IgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLml0ZXJhdG9yOwogIHZhciAkJHRocm93ID0gaXRlcmF0b3JbJ3Rocm93J107CiAgcmV0dXJuICQkdGhyb3cgPT09IHVuZGVmaW5lZAogICAgPyBQcm9taXNlLnJlamVjdCh2YWx1ZSkKICAgIDogJCR0aHJvdy5jYWxsKGl0ZXJhdG9yLCB2YWx1ZSk7Cn07Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuZXh0SGFuZGxlciwgSVNfSVRFUkFUT1IpIHsKICB2YXIgQXN5bmNJdGVyYXRvclByb3h5ID0gZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihzdGF0ZSkgewogICAgc3RhdGUubmV4dCA9IGFGdW5jdGlvbihzdGF0ZS5pdGVyYXRvci5uZXh0KTsKICAgIHN0YXRlLmRvbmUgPSBmYWxzZTsKICAgIHNldEludGVybmFsU3RhdGUodGhpcywgc3RhdGUpOwogIH07CgogIEFzeW5jSXRlcmF0b3JQcm94eS5wcm90b3R5cGUgPSByZWRlZmluZUFsbChjcmVhdGUocGF0aC5Bc3luY0l0ZXJhdG9yLnByb3RvdHlwZSksIHsKICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoYXJnKSB7CiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7CiAgICAgIGlmIChzdGF0ZS5kb25lKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFuT2JqZWN0KG5leHRIYW5kbGVyLmNhbGwoc3RhdGUsIGFyZywgUHJvbWlzZSkpKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpOwogICAgICB9CiAgICB9LAogICAgJ3JldHVybic6ICRyZXR1cm4sCiAgICAndGhyb3cnOiAkdGhyb3cKICB9KTsKCiAgaWYgKCFJU19JVEVSQVRPUikgewogICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEFzeW5jSXRlcmF0b3JQcm94eS5wcm90b3R5cGUsIFRPX1NUUklOR19UQUcsICdHZW5lcmF0b3InKTsKICB9CgogIHJldHVybiBBc3luY0l0ZXJhdG9yUHJveHk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWh0bWwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaHRtbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanMiKTsKCnZhciBxdW90ID0gLyIvZzsKCi8vIEIuMi4zLjIuMSBDcmVhdGVIVE1MKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKQovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jcmVhdGVodG1sCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKSB7CiAgdmFyIFMgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZShzdHJpbmcpKTsKICB2YXIgcDEgPSAnPCcgKyB0YWc7CiAgaWYgKGF0dHJpYnV0ZSAhPT0gJycpIHAxICs9ICcgJyArIGF0dHJpYnV0ZSArICc9IicgKyBTdHJpbmcodmFsdWUpLnJlcGxhY2UocXVvdCwgJyZxdW90OycpICsgJyInOwogIHJldHVybiBwMSArICc+JyArIFMgKyAnPC8nICsgdGFnICsgJz4nOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3Rvci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlLmpzIikuSXRlcmF0b3JQcm90b3R5cGU7CnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIpOwp2YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIpOwp2YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIik7CnZhciBJdGVyYXRvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanMiKTsKCnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHsKICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJzsKICBJdGVyYXRvckNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgbmV4dCkgfSk7CiAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JDb25zdHJ1Y3RvciwgVE9fU1RSSU5HX1RBRywgZmFsc2UsIHRydWUpOwogIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7CiAgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLXByb3h5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1wcm94eS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBwYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3BhdGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgcmVkZWZpbmVBbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS1hbGwuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKdmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIik7Cgp2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0Owp2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0OwoKdmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7Cgp2YXIgJHJldHVybiA9IGZ1bmN0aW9uICh2YWx1ZSkgewogIHZhciBpdGVyYXRvciA9IGdldEludGVybmFsU3RhdGUodGhpcykuaXRlcmF0b3I7CiAgdmFyICQkcmV0dXJuID0gaXRlcmF0b3JbJ3JldHVybiddOwogIHJldHVybiAkJHJldHVybiA9PT0gdW5kZWZpbmVkID8geyBkb25lOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSA6IGFuT2JqZWN0KCQkcmV0dXJuLmNhbGwoaXRlcmF0b3IsIHZhbHVlKSk7Cn07Cgp2YXIgJHRocm93ID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgdmFyIGl0ZXJhdG9yID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5pdGVyYXRvcjsKICB2YXIgJCR0aHJvdyA9IGl0ZXJhdG9yWyd0aHJvdyddOwogIGlmICgkJHRocm93ID09PSB1bmRlZmluZWQpIHRocm93IHZhbHVlOwogIHJldHVybiAkJHRocm93LmNhbGwoaXRlcmF0b3IsIHZhbHVlKTsKfTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5leHRIYW5kbGVyLCBJU19JVEVSQVRPUikgewogIHZhciBJdGVyYXRvclByb3h5ID0gZnVuY3Rpb24gSXRlcmF0b3Ioc3RhdGUpIHsKICAgIHN0YXRlLm5leHQgPSBhRnVuY3Rpb24oc3RhdGUuaXRlcmF0b3IubmV4dCk7CiAgICBzdGF0ZS5kb25lID0gZmFsc2U7CiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHN0YXRlKTsKICB9OwoKICBJdGVyYXRvclByb3h5LnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKGNyZWF0ZShwYXRoLkl0ZXJhdG9yLnByb3RvdHlwZSksIHsKICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7CiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7CiAgICAgIHZhciByZXN1bHQgPSBzdGF0ZS5kb25lID8gdW5kZWZpbmVkIDogbmV4dEhhbmRsZXIuYXBwbHkoc3RhdGUsIGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiB7IGRvbmU6IHN0YXRlLmRvbmUsIHZhbHVlOiByZXN1bHQgfTsKICAgIH0sCiAgICAncmV0dXJuJzogJHJldHVybiwKICAgICd0aHJvdyc6ICR0aHJvdwogIH0pOwoKICBpZiAoIUlTX0lURVJBVE9SKSB7CiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmF0b3JQcm94eS5wcm90b3R5cGUsIFRPX1NUUklOR19UQUcsICdHZW5lcmF0b3InKTsKICB9CgogIHJldHVybiBJdGVyYXRvclByb3h5Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIik7CnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkgewogIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTsKfSA6IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHsKICBvYmplY3Rba2V5XSA9IHZhbHVlOwogIHJldHVybiBvYmplY3Q7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHsKICByZXR1cm4gewogICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSwKICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSwKICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLAogICAgdmFsdWU6IHZhbHVlCiAgfTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIHRvUHJpbWl0aXZlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIik7CnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHsKICB2YXIgcHJvcGVydHlLZXkgPSB0b1ByaW1pdGl2ZShrZXkpOwogIGlmIChwcm9wZXJ0eUtleSBpbiBvYmplY3QpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBwcm9wZXJ0eUtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIHZhbHVlKSk7CiAgZWxzZSBvYmplY3RbcHJvcGVydHlLZXldID0gdmFsdWU7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGF0ZS10by1pc28tc3RyaW5nLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RhdGUtdG8taXNvLXN0cmluZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIHBhZFN0YXJ0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy1wYWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1wYWQuanMiKS5zdGFydDsKCnZhciBhYnMgPSBNYXRoLmFiczsKdmFyIERhdGVQcm90b3R5cGUgPSBEYXRlLnByb3RvdHlwZTsKdmFyIGdldFRpbWUgPSBEYXRlUHJvdG90eXBlLmdldFRpbWU7CnZhciBuYXRpdmVEYXRlVG9JU09TdHJpbmcgPSBEYXRlUHJvdG90eXBlLnRvSVNPU3RyaW5nOwoKLy8gYERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nYCBtZXRob2QgaW1wbGVtZW50YXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZGF0ZS5wcm90b3R5cGUudG9pc29zdHJpbmcKLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBmYWlscyBoZXJlOgptb2R1bGUuZXhwb3J0cyA9IChmYWlscyhmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIG5hdGl2ZURhdGVUb0lTT1N0cmluZy5jYWxsKG5ldyBEYXRlKC01ZTEzIC0gMSkpICE9ICcwMzg1LTA3LTI1VDA3OjA2OjM5Ljk5OVonOwp9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkgewogIG5hdGl2ZURhdGVUb0lTT1N0cmluZy5jYWxsKG5ldyBEYXRlKE5hTikpOwp9KSkgPyBmdW5jdGlvbiB0b0lTT1N0cmluZygpIHsKICBpZiAoIWlzRmluaXRlKGdldFRpbWUuY2FsbCh0aGlzKSkpIHRocm93IFJhbmdlRXJyb3IoJ0ludmFsaWQgdGltZSB2YWx1ZScpOwogIHZhciBkYXRlID0gdGhpczsKICB2YXIgeWVhciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKTsKICB2YXIgbWlsbGlzZWNvbmRzID0gZGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKTsKICB2YXIgc2lnbiA9IHllYXIgPCAwID8gJy0nIDogeWVhciA+IDk5OTkgPyAnKycgOiAnJzsKICByZXR1cm4gc2lnbiArIHBhZFN0YXJ0KGFicyh5ZWFyKSwgc2lnbiA/IDYgOiA0LCAwKSArCiAgICAnLScgKyBwYWRTdGFydChkYXRlLmdldFVUQ01vbnRoKCkgKyAxLCAyLCAwKSArCiAgICAnLScgKyBwYWRTdGFydChkYXRlLmdldFVUQ0RhdGUoKSwgMiwgMCkgKwogICAgJ1QnICsgcGFkU3RhcnQoZGF0ZS5nZXRVVENIb3VycygpLCAyLCAwKSArCiAgICAnOicgKyBwYWRTdGFydChkYXRlLmdldFVUQ01pbnV0ZXMoKSwgMiwgMCkgKwogICAgJzonICsgcGFkU3RhcnQoZGF0ZS5nZXRVVENTZWNvbmRzKCksIDIsIDApICsKICAgICcuJyArIHBhZFN0YXJ0KG1pbGxpc2Vjb25kcywgMywgMCkgKwogICAgJ1onOwp9IDogbmF0aXZlRGF0ZVRvSVNPU3RyaW5nOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RhdGUtdG8tcHJpbWl0aXZlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGF0ZS10by1wcmltaXRpdmUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgdG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanMiKTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGhpbnQpIHsKICBpZiAoaGludCAhPT0gJ3N0cmluZycgJiYgaGludCAhPT0gJ251bWJlcicgJiYgaGludCAhPT0gJ2RlZmF1bHQnKSB7CiAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBoaW50Jyk7CiAgfSByZXR1cm4gdG9QcmltaXRpdmUoYW5PYmplY3QodGhpcyksIGhpbnQgIT09ICdudW1iZXInKTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3IuanMiKTsKdmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIpOwp2YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzIik7CnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMiKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgcmVkZWZpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVkZWZpbmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIEl0ZXJhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qcyIpOwp2YXIgSXRlcmF0b3JzQ29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMiKTsKCnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7CnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gSXRlcmF0b3JzQ29yZS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTOwp2YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7CnZhciBLRVlTID0gJ2tleXMnOwp2YXIgVkFMVUVTID0gJ3ZhbHVlcyc7CnZhciBFTlRSSUVTID0gJ2VudHJpZXMnOwoKdmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9OwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7CiAgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTsKCiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7CiAgICBpZiAoS0lORCA9PT0gREVGQVVMVCAmJiBkZWZhdWx0SXRlcmF0b3IpIHJldHVybiBkZWZhdWx0SXRlcmF0b3I7CiAgICBpZiAoIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgS0lORCBpbiBJdGVyYWJsZVByb3RvdHlwZSkgcmV0dXJuIEl0ZXJhYmxlUHJvdG90eXBlW0tJTkRdOwogICAgc3dpdGNoIChLSU5EKSB7CiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTsKICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTsKICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9OwogICAgfSByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcyk7IH07CiAgfTsKCiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7CiAgdmFyIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IGZhbHNlOwogIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTsKICB2YXIgbmF0aXZlSXRlcmF0b3IgPSBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0KICAgIHx8IEl0ZXJhYmxlUHJvdG90eXBlWydAQGl0ZXJhdG9yJ10KICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07CiAgdmFyIGRlZmF1bHRJdGVyYXRvciA9ICFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIG5hdGl2ZUl0ZXJhdG9yIHx8IGdldEl0ZXJhdGlvbk1ldGhvZChERUZBVUxUKTsKICB2YXIgYW55TmF0aXZlSXRlcmF0b3IgPSBOQU1FID09ICdBcnJheScgPyBJdGVyYWJsZVByb3RvdHlwZS5lbnRyaWVzIHx8IG5hdGl2ZUl0ZXJhdG9yIDogbmF0aXZlSXRlcmF0b3I7CiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZOwoKICAvLyBmaXggbmF0aXZlCiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7CiAgICBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbnlOYXRpdmVJdGVyYXRvci5jYWxsKG5ldyBJdGVyYWJsZSgpKSk7CiAgICBpZiAoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHsKICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7CiAgICAgICAgaWYgKHNldFByb3RvdHlwZU9mKSB7CiAgICAgICAgICBzZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIEl0ZXJhdG9yUHJvdG90eXBlKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9ycwogICAgICBzZXRUb1N0cmluZ1RhZyhDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHRydWUsIHRydWUpOwogICAgICBpZiAoSVNfUFVSRSkgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpczsKICAgIH0KICB9CgogIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkYKICBpZiAoREVGQVVMVCA9PSBWQUxVRVMgJiYgbmF0aXZlSXRlcmF0b3IgJiYgbmF0aXZlSXRlcmF0b3IubmFtZSAhPT0gVkFMVUVTKSB7CiAgICBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSB0cnVlOwogICAgZGVmYXVsdEl0ZXJhdG9yID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmF0aXZlSXRlcmF0b3IuY2FsbCh0aGlzKTsgfTsKICB9CgogIC8vIGRlZmluZSBpdGVyYXRvcgogIGlmICgoIUlTX1BVUkUgfHwgRk9SQ0VEKSAmJiBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gIT09IGRlZmF1bHRJdGVyYXRvcikgewogICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhYmxlUHJvdG90eXBlLCBJVEVSQVRPUiwgZGVmYXVsdEl0ZXJhdG9yKTsKICB9CiAgSXRlcmF0b3JzW05BTUVdID0gZGVmYXVsdEl0ZXJhdG9yOwoKICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzCiAgaWYgKERFRkFVTFQpIHsKICAgIG1ldGhvZHMgPSB7CiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksCiAgICAgIGtleXM6IElTX1NFVCA/IGRlZmF1bHRJdGVyYXRvciA6IGdldEl0ZXJhdGlvbk1ldGhvZChLRVlTKSwKICAgICAgZW50cmllczogZ2V0SXRlcmF0aW9uTWV0aG9kKEVOVFJJRVMpCiAgICB9OwogICAgaWYgKEZPUkNFRCkgZm9yIChLRVkgaW4gbWV0aG9kcykgewogICAgICBpZiAoQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfHwgIShLRVkgaW4gSXRlcmFibGVQcm90b3R5cGUpKSB7CiAgICAgICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTsKICAgICAgfQogICAgfSBlbHNlICQoeyB0YXJnZXQ6IE5BTUUsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIH0sIG1ldGhvZHMpOwogIH0KCiAgcmV0dXJuIG1ldGhvZHM7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBwYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3BhdGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiKTsKdmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93cmFwcGVkLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93cmFwcGVkLXdlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIikuZjsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUpIHsKICB2YXIgU3ltYm9sID0gcGF0aC5TeW1ib2wgfHwgKHBhdGguU3ltYm9sID0ge30pOwogIGlmICghaGFzKFN5bWJvbCwgTkFNRSkpIGRlZmluZVByb3BlcnR5KFN5bWJvbCwgTkFNRSwgewogICAgdmFsdWU6IHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUuZihOQU1FKQogIH0pOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKCi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHkKbW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkgewogIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3Owp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwoKdmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50OwovLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUUKdmFyIEVYSVNUUyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CiAgcmV0dXJuIEVYSVNUUyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKLy8gaXRlcmFibGUgRE9NIGNvbGxlY3Rpb25zCi8vIGZsYWcgLSBgaXRlcmFibGVgIGludGVyZmFjZSAtICdlbnRyaWVzJywgJ2tleXMnLCAndmFsdWVzJywgJ2ZvckVhY2gnIG1ldGhvZHMKbW9kdWxlLmV4cG9ydHMgPSB7CiAgQ1NTUnVsZUxpc3Q6IDAsCiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogMCwKICBDU1NWYWx1ZUxpc3Q6IDAsCiAgQ2xpZW50UmVjdExpc3Q6IDAsCiAgRE9NUmVjdExpc3Q6IDAsCiAgRE9NU3RyaW5nTGlzdDogMCwKICBET01Ub2tlbkxpc3Q6IDEsCiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IDAsCiAgRmlsZUxpc3Q6IDAsCiAgSFRNTEFsbENvbGxlY3Rpb246IDAsCiAgSFRNTENvbGxlY3Rpb246IDAsCiAgSFRNTEZvcm1FbGVtZW50OiAwLAogIEhUTUxTZWxlY3RFbGVtZW50OiAwLAogIE1lZGlhTGlzdDogMCwKICBNaW1lVHlwZUFycmF5OiAwLAogIE5hbWVkTm9kZU1hcDogMCwKICBOb2RlTGlzdDogMSwKICBQYWludFJlcXVlc3RMaXN0OiAwLAogIFBsdWdpbjogMCwKICBQbHVnaW5BcnJheTogMCwKICBTVkdMZW5ndGhMaXN0OiAwLAogIFNWR051bWJlckxpc3Q6IDAsCiAgU1ZHUGF0aFNlZ0xpc3Q6IDAsCiAgU1ZHUG9pbnRMaXN0OiAwLAogIFNWR1N0cmluZ0xpc3Q6IDAsCiAgU1ZHVHJhbnNmb3JtTGlzdDogMCwKICBTb3VyY2VCdWZmZXJMaXN0OiAwLAogIFN0eWxlU2hlZXRMaXN0OiAwLAogIFRleHRUcmFja0N1ZUxpc3Q6IDAsCiAgVGV4dFRyYWNrTGlzdDogMCwKICBUb3VjaExpc3Q6IDAKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7CgovLyBJRTgtIGRvbid0IGVudW0gYnVnIGtleXMKbW9kdWxlLmV4cG9ydHMgPSBbCiAgJ2NvbnN0cnVjdG9yJywKICAnaGFzT3duUHJvcGVydHknLAogICdpc1Byb3RvdHlwZU9mJywKICAncHJvcGVydHlJc0VudW1lcmFibGUnLAogICd0b0xvY2FsZVN0cmluZycsCiAgJ3RvU3RyaW5nJywKICAndmFsdWVPZicKXTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiKS5mOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7CnZhciByZWRlZmluZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUuanMiKTsKdmFyIHNldEdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzIik7CnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzIik7CnZhciBpc0ZvcmNlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1mb3JjZWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWZvcmNlZC5qcyIpOwoKLyoKICBvcHRpb25zLnRhcmdldCAgICAgIC0gbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdAogIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3QKICBvcHRpb25zLnN0YXQgICAgICAgIC0gZXhwb3J0IGFzIHN0YXRpYyBtZXRob2RzIG9mIHRhcmdldAogIG9wdGlvbnMucHJvdG8gICAgICAgLSBleHBvcnQgYXMgcHJvdG90eXBlIG1ldGhvZHMgb2YgdGFyZ2V0CiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uCiAgb3B0aW9ucy5mb3JjZWQgICAgICAtIGV4cG9ydCBldmVuIGlmIHRoZSBuYXRpdmUgZmVhdHVyZSBpcyBhdmFpbGFibGUKICBvcHRpb25zLmJpbmQgICAgICAgIC0gYmluZCBtZXRob2RzIHRvIHRoZSB0YXJnZXQsIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb24KICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uCiAgb3B0aW9ucy51bnNhZmUgICAgICAtIHVzZSB0aGUgc2ltcGxlIGFzc2lnbm1lbnQgb2YgcHJvcGVydHkgaW5zdGVhZCBvZiBkZWxldGUgKyBkZWZpbmVQcm9wZXJ0eQogIG9wdGlvbnMuc2hhbSAgICAgICAgLSBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzCiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5CiAgb3B0aW9ucy5ub1RhcmdldEdldCAtIHByZXZlbnQgY2FsbGluZyBhIGdldHRlciBvbiB0YXJnZXQKKi8KbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7CiAgdmFyIFRBUkdFVCA9IG9wdGlvbnMudGFyZ2V0OwogIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDsKICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0OwogIHZhciBGT1JDRUQsIHRhcmdldCwga2V5LCB0YXJnZXRQcm9wZXJ0eSwgc291cmNlUHJvcGVydHksIGRlc2NyaXB0b3I7CiAgaWYgKEdMT0JBTCkgewogICAgdGFyZ2V0ID0gZ2xvYmFsOwogIH0gZWxzZSBpZiAoU1RBVElDKSB7CiAgICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSB8fCBzZXRHbG9iYWwoVEFSR0VULCB7fSk7CiAgfSBlbHNlIHsKICAgIHRhcmdldCA9IChnbG9iYWxbVEFSR0VUXSB8fCB7fSkucHJvdG90eXBlOwogIH0KICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHsKICAgIHNvdXJjZVByb3BlcnR5ID0gc291cmNlW2tleV07CiAgICBpZiAob3B0aW9ucy5ub1RhcmdldEdldCkgewogICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTsKICAgICAgdGFyZ2V0UHJvcGVydHkgPSBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWU7CiAgICB9IGVsc2UgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRba2V5XTsKICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7CiAgICAvLyBjb250YWluZWQgaW4gdGFyZ2V0CiAgICBpZiAoIUZPUkNFRCAmJiB0YXJnZXRQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT09IHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSkgY29udGludWU7CiAgICAgIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoc291cmNlUHJvcGVydHksIHRhcmdldFByb3BlcnR5KTsKICAgIH0KICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHMKICAgIGlmIChvcHRpb25zLnNoYW0gfHwgKHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pKSB7CiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTsKICAgIH0KICAgIC8vIGV4dGVuZCBnbG9iYWwKICAgIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7CiAgfQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7CiAgdHJ5IHsKICAgIHJldHVybiAhIWV4ZWMoKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgcmV0dXJuIHRydWU7CiAgfQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgcmVkZWZpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVkZWZpbmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKdmFyIHJlZ2V4cEV4ZWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLmpzIik7Cgp2YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpOwoKdmFyIFJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsKICAvLyAjcmVwbGFjZSBuZWVkcyBidWlsdC1pbiBzdXBwb3J0IGZvciBuYW1lZCBncm91cHMuCiAgLy8gI21hdGNoIHdvcmtzIGZpbmUgYmVjYXVzZSBpdCBqdXN0IHJldHVybiB0aGUgZXhlYyByZXN1bHRzLCBldmVuIGlmIGl0IGhhcwogIC8vIGEgImdyb3BzIiBwcm9wZXJ0eS4KICB2YXIgcmUgPSAvLi87CiAgcmUuZXhlYyA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciByZXN1bHQgPSBbXTsKICAgIHJlc3VsdC5ncm91cHMgPSB7IGE6ICc3JyB9OwogICAgcmV0dXJuIHJlc3VsdDsKICB9OwogIHJldHVybiAnJy5yZXBsYWNlKHJlLCAnJDxhPicpICE9PSAnNyc7Cn0pOwoKLy8gQ2hyb21lIDUxIGhhcyBhIGJ1Z2d5ICJzcGxpdCIgaW1wbGVtZW50YXRpb24gd2hlbiBSZWdFeHAjZXhlYyAhPT0gbmF0aXZlRXhlYwovLyBXZWV4IEpTIGhhcyBmcm96ZW4gYnVpbHQtaW4gcHJvdG90eXBlcywgc28gdXNlIHRyeSAvIGNhdGNoIHdyYXBwZXIKdmFyIFNQTElUX1dPUktTX1dJVEhfT1ZFUldSSVRURU5fRVhFQyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgdmFyIHJlID0gLyg/OikvOwogIHZhciBvcmlnaW5hbEV4ZWMgPSByZS5leGVjOwogIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBvcmlnaW5hbEV4ZWMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfTsKICB2YXIgcmVzdWx0ID0gJ2FiJy5zcGxpdChyZSk7CiAgcmV0dXJuIHJlc3VsdC5sZW5ndGggIT09IDIgfHwgcmVzdWx0WzBdICE9PSAnYScgfHwgcmVzdWx0WzFdICE9PSAnYic7Cn0pOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBsZW5ndGgsIGV4ZWMsIHNoYW0pIHsKICB2YXIgU1lNQk9MID0gd2VsbEtub3duU3ltYm9sKEtFWSk7CgogIHZhciBERUxFR0FURVNfVE9fU1lNQk9MID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsKICAgIC8vIFN0cmluZyBtZXRob2RzIGNhbGwgc3ltYm9sLW5hbWVkIFJlZ0VwIG1ldGhvZHMKICAgIHZhciBPID0ge307CiAgICBPW1NZTUJPTF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9OwogICAgcmV0dXJuICcnW0tFWV0oTykgIT0gNzsKICB9KTsKCiAgdmFyIERFTEVHQVRFU19UT19FWEVDID0gREVMRUdBVEVTX1RPX1NZTUJPTCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgewogICAgLy8gU3ltYm9sLW5hbWVkIFJlZ0V4cCBtZXRob2RzIGNhbGwgLmV4ZWMKICAgIHZhciBleGVjQ2FsbGVkID0gZmFsc2U7CiAgICB2YXIgcmUgPSAvYS87CgogICAgaWYgKEtFWSA9PT0gJ3NwbGl0JykgewogICAgICAvLyBXZSBjYW4ndCB1c2UgcmVhbCByZWdleCBoZXJlIHNpbmNlIGl0IGNhdXNlcyBkZW9wdGltaXphdGlvbgogICAgICAvLyBhbmQgc2VyaW91cyBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBpbiBWOAogICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzA2CiAgICAgIHJlID0ge307CiAgICAgIC8vIFJlZ0V4cFtAQHNwbGl0XSBkb2Vzbid0IGNhbGwgdGhlIHJlZ2V4J3MgZXhlYyBtZXRob2QsIGJ1dCBmaXJzdCBjcmVhdGVzCiAgICAgIC8vIGEgbmV3IG9uZS4gV2UgbmVlZCB0byByZXR1cm4gdGhlIHBhdGNoZWQgcmVnZXggd2hlbiBjcmVhdGluZyB0aGUgbmV3IG9uZS4KICAgICAgcmUuY29uc3RydWN0b3IgPSB7fTsKICAgICAgcmUuY29uc3RydWN0b3JbU1BFQ0lFU10gPSBmdW5jdGlvbiAoKSB7IHJldHVybiByZTsgfTsKICAgICAgcmUuZmxhZ3MgPSAnJzsKICAgICAgcmVbU1lNQk9MXSA9IC8uL1tTWU1CT0xdOwogICAgfQoKICAgIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7IGV4ZWNDYWxsZWQgPSB0cnVlOyByZXR1cm4gbnVsbDsgfTsKCiAgICByZVtTWU1CT0xdKCcnKTsKICAgIHJldHVybiAhZXhlY0NhbGxlZDsKICB9KTsKCiAgaWYgKAogICAgIURFTEVHQVRFU19UT19TWU1CT0wgfHwKICAgICFERUxFR0FURVNfVE9fRVhFQyB8fAogICAgKEtFWSA9PT0gJ3JlcGxhY2UnICYmICFSRVBMQUNFX1NVUFBPUlRTX05BTUVEX0dST1VQUykgfHwKICAgIChLRVkgPT09ICdzcGxpdCcgJiYgIVNQTElUX1dPUktTX1dJVEhfT1ZFUldSSVRURU5fRVhFQykKICApIHsKICAgIHZhciBuYXRpdmVSZWdFeHBNZXRob2QgPSAvLi9bU1lNQk9MXTsKICAgIHZhciBtZXRob2RzID0gZXhlYyhTWU1CT0wsICcnW0tFWV0sIGZ1bmN0aW9uIChuYXRpdmVNZXRob2QsIHJlZ2V4cCwgc3RyLCBhcmcyLCBmb3JjZVN0cmluZ01ldGhvZCkgewogICAgICBpZiAocmVnZXhwLmV4ZWMgPT09IHJlZ2V4cEV4ZWMpIHsKICAgICAgICBpZiAoREVMRUdBVEVTX1RPX1NZTUJPTCAmJiAhZm9yY2VTdHJpbmdNZXRob2QpIHsKICAgICAgICAgIC8vIFRoZSBuYXRpdmUgU3RyaW5nIG1ldGhvZCBhbHJlYWR5IGRlbGVnYXRlcyB0byBAQG1ldGhvZCAodGhpcwogICAgICAgICAgLy8gcG9seWZpbGxlZCBmdW5jdGlvbiksIGxlYXNpbmcgdG8gaW5maW5pdGUgcmVjdXJzaW9uLgogICAgICAgICAgLy8gV2UgYXZvaWQgaXQgYnkgZGlyZWN0bHkgY2FsbGluZyB0aGUgbmF0aXZlIEBAbWV0aG9kIG1ldGhvZC4KICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBuYXRpdmVSZWdFeHBNZXRob2QuY2FsbChyZWdleHAsIHN0ciwgYXJnMikgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG5hdGl2ZU1ldGhvZC5jYWxsKHN0ciwgcmVnZXhwLCBhcmcyKSB9OwogICAgICB9CiAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlIH07CiAgICB9KTsKICAgIHZhciBzdHJpbmdNZXRob2QgPSBtZXRob2RzWzBdOwogICAgdmFyIHJlZ2V4TWV0aG9kID0gbWV0aG9kc1sxXTsKCiAgICByZWRlZmluZShTdHJpbmcucHJvdG90eXBlLCBLRVksIHN0cmluZ01ldGhvZCk7CiAgICByZWRlZmluZShSZWdFeHAucHJvdG90eXBlLCBTWU1CT0wsIGxlbmd0aCA9PSAyCiAgICAgIC8vIDIxLjIuNS44IFJlZ0V4cC5wcm90b3R5cGVbQEByZXBsYWNlXShzdHJpbmcsIHJlcGxhY2VWYWx1ZSkKICAgICAgLy8gMjEuMi41LjExIFJlZ0V4cC5wcm90b3R5cGVbQEBzcGxpdF0oc3RyaW5nLCBsaW1pdCkKICAgICAgPyBmdW5jdGlvbiAoc3RyaW5nLCBhcmcpIHsgcmV0dXJuIHJlZ2V4TWV0aG9kLmNhbGwoc3RyaW5nLCB0aGlzLCBhcmcpOyB9CiAgICAgIC8vIDIxLjIuNS42IFJlZ0V4cC5wcm90b3R5cGVbQEBtYXRjaF0oc3RyaW5nKQogICAgICAvLyAyMS4yLjUuOSBSZWdFeHAucHJvdG90eXBlW0BAc2VhcmNoXShzdHJpbmcpCiAgICAgIDogZnVuY3Rpb24gKHN0cmluZykgeyByZXR1cm4gcmVnZXhNZXRob2QuY2FsbChzdHJpbmcsIHRoaXMpOyB9CiAgICApOwogICAgaWYgKHNoYW0pIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShSZWdFeHAucHJvdG90eXBlW1NZTUJPTF0sICdzaGFtJywgdHJ1ZSk7CiAgfQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZsYXR0ZW4taW50by1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mbGF0dGVuLWludG8tYXJyYXkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgaXNBcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanMiKTsKdmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIik7CnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzIik7CgovLyBgRmxhdHRlbkludG9BcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtZmxhdE1hcC8jc2VjLUZsYXR0ZW5JbnRvQXJyYXkKdmFyIGZsYXR0ZW5JbnRvQXJyYXkgPSBmdW5jdGlvbiAodGFyZ2V0LCBvcmlnaW5hbCwgc291cmNlLCBzb3VyY2VMZW4sIHN0YXJ0LCBkZXB0aCwgbWFwcGVyLCB0aGlzQXJnKSB7CiAgdmFyIHRhcmdldEluZGV4ID0gc3RhcnQ7CiAgdmFyIHNvdXJjZUluZGV4ID0gMDsKICB2YXIgbWFwRm4gPSBtYXBwZXIgPyBiaW5kKG1hcHBlciwgdGhpc0FyZywgMykgOiBmYWxzZTsKICB2YXIgZWxlbWVudDsKCiAgd2hpbGUgKHNvdXJjZUluZGV4IDwgc291cmNlTGVuKSB7CiAgICBpZiAoc291cmNlSW5kZXggaW4gc291cmNlKSB7CiAgICAgIGVsZW1lbnQgPSBtYXBGbiA/IG1hcEZuKHNvdXJjZVtzb3VyY2VJbmRleF0sIHNvdXJjZUluZGV4LCBvcmlnaW5hbCkgOiBzb3VyY2Vbc291cmNlSW5kZXhdOwoKICAgICAgaWYgKGRlcHRoID4gMCAmJiBpc0FycmF5KGVsZW1lbnQpKSB7CiAgICAgICAgdGFyZ2V0SW5kZXggPSBmbGF0dGVuSW50b0FycmF5KHRhcmdldCwgb3JpZ2luYWwsIGVsZW1lbnQsIHRvTGVuZ3RoKGVsZW1lbnQubGVuZ3RoKSwgdGFyZ2V0SW5kZXgsIGRlcHRoIC0gMSkgLSAxOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0YXJnZXRJbmRleCA+PSAweDFGRkZGRkZGRkZGRkZGKSB0aHJvdyBUeXBlRXJyb3IoJ0V4Y2VlZCB0aGUgYWNjZXB0YWJsZSBhcnJheSBsZW5ndGgnKTsKICAgICAgICB0YXJnZXRbdGFyZ2V0SW5kZXhdID0gZWxlbWVudDsKICAgICAgfQoKICAgICAgdGFyZ2V0SW5kZXgrKzsKICAgIH0KICAgIHNvdXJjZUluZGV4Kys7CiAgfQogIHJldHVybiB0YXJnZXRJbmRleDsKfTsKCm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbkludG9BcnJheTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtb2JqZWN0LXByb3RvdHlwZS1hY2Nlc3NvcnMtbWV0aG9kcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1vYmplY3QtcHJvdG90eXBlLWFjY2Vzc29ycy1tZXRob2RzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwoKLy8gRm9yY2VkIHJlcGxhY2VtZW50IG9iamVjdCBwcm90b3R5cGUgYWNjZXNzb3JzIG1ldGhvZHMKbW9kdWxlLmV4cG9ydHMgPSBJU19QVVJFIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgdmFyIGtleSA9IE1hdGgucmFuZG9tKCk7CiAgLy8gSW4gRkYgdGhyb3dzIG9ubHkgZGVmaW5lIG1ldGhvZHMKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYsIG5vLXVzZWxlc3MtY2FsbAogIF9fZGVmaW5lU2V0dGVyX18uY2FsbChudWxsLCBrZXksIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7CiAgZGVsZXRlIGdsb2JhbFtrZXldOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKCi8vIGNoZWNrIHRoZSBleGlzdGVuY2Ugb2YgYSBtZXRob2QsIGxvd2VyY2FzZQovLyBvZiBhIHRhZyBhbmQgZXNjYXBpbmcgcXVvdGVzIGluIGFyZ3VtZW50cwptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkgewogIHJldHVybiBmYWlscyhmdW5jdGlvbiAoKSB7CiAgICB2YXIgdGVzdCA9ICcnW01FVEhPRF9OQU1FXSgnIicpOwogICAgcmV0dXJuIHRlc3QgIT09IHRlc3QudG9Mb3dlckNhc2UoKSB8fCB0ZXN0LnNwbGl0KCciJykubGVuZ3RoID4gMzsKICB9KTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLXRyaW0tbWV0aG9kLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLXRyaW0tbWV0aG9kLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIHdoaXRlc3BhY2VzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93aGl0ZXNwYWNlcy5qcyIpOwoKdmFyIG5vbiA9ICdcdTIwMEJcdTAwODVcdTE4MEUnOwoKLy8gY2hlY2sgdGhhdCBhIG1ldGhvZCB3b3JrcyB3aXRoIHRoZSBjb3JyZWN0IGxpc3QKLy8gb2Ygd2hpdGVzcGFjZXMgYW5kIGhhcyBhIGNvcnJlY3QgbmFtZQptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkgewogIHJldHVybiBmYWlscyhmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gISF3aGl0ZXNwYWNlc1tNRVRIT0RfTkFNRV0oKSB8fCBub25bTUVUSE9EX05BTUVdKCkgIT0gbm9uIHx8IHdoaXRlc3BhY2VzW01FVEhPRF9OQU1FXS5uYW1lICE9PSBNRVRIT0RfTkFNRTsKICB9KTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mcmVlemluZy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZyZWV6aW5nLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIE9iamVjdC5pc0V4dGVuc2libGUoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KSk7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwoKdmFyIHNsaWNlID0gW10uc2xpY2U7CnZhciBmYWN0b3JpZXMgPSB7fTsKCnZhciBjb25zdHJ1Y3QgPSBmdW5jdGlvbiAoQywgYXJnc0xlbmd0aCwgYXJncykgewogIGlmICghKGFyZ3NMZW5ndGggaW4gZmFjdG9yaWVzKSkgewogICAgZm9yICh2YXIgbGlzdCA9IFtdLCBpID0gMDsgaSA8IGFyZ3NMZW5ndGg7IGkrKykgbGlzdFtpXSA9ICdhWycgKyBpICsgJ10nOwogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jCiAgICBmYWN0b3JpZXNbYXJnc0xlbmd0aF0gPSBGdW5jdGlvbignQyxhJywgJ3JldHVybiBuZXcgQygnICsgbGlzdC5qb2luKCcsJykgKyAnKScpOwogIH0gcmV0dXJuIGZhY3Rvcmllc1thcmdzTGVuZ3RoXShDLCBhcmdzKTsKfTsKCi8vIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgbWV0aG9kIGltcGxlbWVudGF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kCm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24uYmluZCB8fCBmdW5jdGlvbiBiaW5kKHRoYXQgLyogLCAuLi5hcmdzICovKSB7CiAgdmFyIGZuID0gYUZ1bmN0aW9uKHRoaXMpOwogIHZhciBwYXJ0QXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICB2YXIgYm91bmRGdW5jdGlvbiA9IGZ1bmN0aW9uIGJvdW5kKC8qIGFyZ3MuLi4gKi8pIHsKICAgIHZhciBhcmdzID0gcGFydEFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSk7CiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGJvdW5kRnVuY3Rpb24gPyBjb25zdHJ1Y3QoZm4sIGFyZ3MubGVuZ3RoLCBhcmdzKSA6IGZuLmFwcGx5KHRoYXQsIGFyZ3MpOwogIH07CiAgaWYgKGlzT2JqZWN0KGZuLnByb3RvdHlwZSkpIGJvdW5kRnVuY3Rpb24ucHJvdG90eXBlID0gZm4ucHJvdG90eXBlOwogIHJldHVybiBib3VuZEZ1bmN0aW9uOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1hc3luYy1pdGVyYXRvci1tZXRob2QuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1hc3luYy1pdGVyYXRvci1tZXRob2QuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCnZhciBBU1lOQ19JVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnYXN5bmNJdGVyYXRvcicpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICB2YXIgbWV0aG9kID0gaXRbQVNZTkNfSVRFUkFUT1JdOwogIHJldHVybiBtZXRob2QgPT09IHVuZGVmaW5lZCA/IGdldEl0ZXJhdG9yTWV0aG9kKGl0KSA6IG1ldGhvZDsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHBhdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGF0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7Cgp2YXIgYUZ1bmN0aW9uID0gZnVuY3Rpb24gKHZhcmlhYmxlKSB7CiAgcmV0dXJuIHR5cGVvZiB2YXJpYWJsZSA9PSAnZnVuY3Rpb24nID8gdmFyaWFibGUgOiB1bmRlZmluZWQ7Cn07Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1ldGhvZCkgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGFGdW5jdGlvbihwYXRoW25hbWVzcGFjZV0pIHx8IGFGdW5jdGlvbihnbG9iYWxbbmFtZXNwYWNlXSkKICAgIDogcGF0aFtuYW1lc3BhY2VdICYmIHBhdGhbbmFtZXNwYWNlXVttZXRob2RdIHx8IGdsb2JhbFtuYW1lc3BhY2VdICYmIGdsb2JhbFtuYW1lc3BhY2VdW21ldGhvZF07Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzIik7CnZhciBJdGVyYXRvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SXQogICAgfHwgaXRbJ0BAaXRlcmF0b3InXQogICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKGl0KTsKICBpZiAodHlwZW9mIGl0ZXJhdG9yTWV0aG9kICE9ICdmdW5jdGlvbicpIHsKICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgaXRlcmFibGUnKTsKICB9IHJldHVybiBhbk9iamVjdChpdGVyYXRvck1ldGhvZC5jYWxsKGl0KSk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBnZXRJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBJU19QVVJFID8gZ2V0SXRlcmF0b3IgOiBmdW5jdGlvbiAoaXQpIHsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYKICByZXR1cm4gTWFwLnByb3RvdHlwZS5lbnRyaWVzLmNhbGwoaXQpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1zZXQtaXRlcmF0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1zZXQtaXRlcmF0b3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgZ2V0SXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3IuanMiKTsKCm1vZHVsZS5leHBvcnRzID0gSVNfUFVSRSA/IGdldEl0ZXJhdG9yIDogZnVuY3Rpb24gKGl0KSB7CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmCiAgcmV0dXJuIFNldC5wcm90b3R5cGUudmFsdWVzLmNhbGwoaXQpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PSBNYXRoICYmIGl0Owp9OwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjgKbW9kdWxlLmV4cG9ydHMgPQogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZgogIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09ICdvYmplY3QnICYmIGdsb2JhbFRoaXMpIHx8CiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cpIHx8CiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHwKICBjaGVjayh0eXBlb2YgX193ZWJwYWNrX3JlcXVpcmVfXy5nID09ICdvYmplY3QnICYmIF9fd2VicGFja19yZXF1aXJlX18uZykgfHwKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmMKICBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKdmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7CiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCm1vZHVsZS5leHBvcnRzID0ge307CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGEsIGIpIHsKICB2YXIgY29uc29sZSA9IGdsb2JhbC5jb25zb2xlOwogIGlmIChjb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIHsKICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBjb25zb2xlLmVycm9yKGEpIDogY29uc29sZS5lcnJvcihhLCBiKTsKICB9Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaHRtbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaHRtbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdkb2N1bWVudCcsICdkb2N1bWVudEVsZW1lbnQnKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZTgtZG9tLWRlZmluZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIGNyZWF0ZUVsZW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzIik7CgovLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5Cm1vZHVsZS5leHBvcnRzID0gIURFU0NSSVBUT1JTICYmICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2EnLCB7CiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0KICB9KS5hICE9IDc7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2llZWU3NTQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2llZWU3NTQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCi8vIElFRUU3NTQgY29udmVyc2lvbnMgYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9pZWVlNzU0Ci8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3ctcmVzdHJpY3RlZC1uYW1lcwp2YXIgSW5maW5pdHkgPSAxIC8gMDsKdmFyIGFicyA9IE1hdGguYWJzOwp2YXIgcG93ID0gTWF0aC5wb3c7CnZhciBmbG9vciA9IE1hdGguZmxvb3I7CnZhciBsb2cgPSBNYXRoLmxvZzsKdmFyIExOMiA9IE1hdGguTE4yOwoKdmFyIHBhY2sgPSBmdW5jdGlvbiAobnVtYmVyLCBtYW50aXNzYUxlbmd0aCwgYnl0ZXMpIHsKICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KGJ5dGVzKTsKICB2YXIgZXhwb25lbnRMZW5ndGggPSBieXRlcyAqIDggLSBtYW50aXNzYUxlbmd0aCAtIDE7CiAgdmFyIGVNYXggPSAoMSA8PCBleHBvbmVudExlbmd0aCkgLSAxOwogIHZhciBlQmlhcyA9IGVNYXggPj4gMTsKICB2YXIgcnQgPSBtYW50aXNzYUxlbmd0aCA9PT0gMjMgPyBwb3coMiwgLTI0KSAtIHBvdygyLCAtNzcpIDogMDsKICB2YXIgc2lnbiA9IG51bWJlciA8IDAgfHwgbnVtYmVyID09PSAwICYmIDEgLyBudW1iZXIgPCAwID8gMSA6IDA7CiAgdmFyIGluZGV4ID0gMDsKICB2YXIgZXhwb25lbnQsIG1hbnRpc3NhLCBjOwogIG51bWJlciA9IGFicyhudW1iZXIpOwogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUKICBpZiAobnVtYmVyICE9IG51bWJlciB8fCBudW1iZXIgPT09IEluZmluaXR5KSB7CiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlCiAgICBtYW50aXNzYSA9IG51bWJlciAhPSBudW1iZXIgPyAxIDogMDsKICAgIGV4cG9uZW50ID0gZU1heDsKICB9IGVsc2UgewogICAgZXhwb25lbnQgPSBmbG9vcihsb2cobnVtYmVyKSAvIExOMik7CiAgICBpZiAobnVtYmVyICogKGMgPSBwb3coMiwgLWV4cG9uZW50KSkgPCAxKSB7CiAgICAgIGV4cG9uZW50LS07CiAgICAgIGMgKj0gMjsKICAgIH0KICAgIGlmIChleHBvbmVudCArIGVCaWFzID49IDEpIHsKICAgICAgbnVtYmVyICs9IHJ0IC8gYzsKICAgIH0gZWxzZSB7CiAgICAgIG51bWJlciArPSBydCAqIHBvdygyLCAxIC0gZUJpYXMpOwogICAgfQogICAgaWYgKG51bWJlciAqIGMgPj0gMikgewogICAgICBleHBvbmVudCsrOwogICAgICBjIC89IDI7CiAgICB9CiAgICBpZiAoZXhwb25lbnQgKyBlQmlhcyA+PSBlTWF4KSB7CiAgICAgIG1hbnRpc3NhID0gMDsKICAgICAgZXhwb25lbnQgPSBlTWF4OwogICAgfSBlbHNlIGlmIChleHBvbmVudCArIGVCaWFzID49IDEpIHsKICAgICAgbWFudGlzc2EgPSAobnVtYmVyICogYyAtIDEpICogcG93KDIsIG1hbnRpc3NhTGVuZ3RoKTsKICAgICAgZXhwb25lbnQgPSBleHBvbmVudCArIGVCaWFzOwogICAgfSBlbHNlIHsKICAgICAgbWFudGlzc2EgPSBudW1iZXIgKiBwb3coMiwgZUJpYXMgLSAxKSAqIHBvdygyLCBtYW50aXNzYUxlbmd0aCk7CiAgICAgIGV4cG9uZW50ID0gMDsKICAgIH0KICB9CiAgZm9yICg7IG1hbnRpc3NhTGVuZ3RoID49IDg7IGJ1ZmZlcltpbmRleCsrXSA9IG1hbnRpc3NhICYgMjU1LCBtYW50aXNzYSAvPSAyNTYsIG1hbnRpc3NhTGVuZ3RoIC09IDgpOwogIGV4cG9uZW50ID0gZXhwb25lbnQgPDwgbWFudGlzc2FMZW5ndGggfCBtYW50aXNzYTsKICBleHBvbmVudExlbmd0aCArPSBtYW50aXNzYUxlbmd0aDsKICBmb3IgKDsgZXhwb25lbnRMZW5ndGggPiAwOyBidWZmZXJbaW5kZXgrK10gPSBleHBvbmVudCAmIDI1NSwgZXhwb25lbnQgLz0gMjU2LCBleHBvbmVudExlbmd0aCAtPSA4KTsKICBidWZmZXJbLS1pbmRleF0gfD0gc2lnbiAqIDEyODsKICByZXR1cm4gYnVmZmVyOwp9OwoKdmFyIHVucGFjayA9IGZ1bmN0aW9uIChidWZmZXIsIG1hbnRpc3NhTGVuZ3RoKSB7CiAgdmFyIGJ5dGVzID0gYnVmZmVyLmxlbmd0aDsKICB2YXIgZXhwb25lbnRMZW5ndGggPSBieXRlcyAqIDggLSBtYW50aXNzYUxlbmd0aCAtIDE7CiAgdmFyIGVNYXggPSAoMSA8PCBleHBvbmVudExlbmd0aCkgLSAxOwogIHZhciBlQmlhcyA9IGVNYXggPj4gMTsKICB2YXIgbkJpdHMgPSBleHBvbmVudExlbmd0aCAtIDc7CiAgdmFyIGluZGV4ID0gYnl0ZXMgLSAxOwogIHZhciBzaWduID0gYnVmZmVyW2luZGV4LS1dOwogIHZhciBleHBvbmVudCA9IHNpZ24gJiAxMjc7CiAgdmFyIG1hbnRpc3NhOwogIHNpZ24gPj49IDc7CiAgZm9yICg7IG5CaXRzID4gMDsgZXhwb25lbnQgPSBleHBvbmVudCAqIDI1NiArIGJ1ZmZlcltpbmRleF0sIGluZGV4LS0sIG5CaXRzIC09IDgpOwogIG1hbnRpc3NhID0gZXhwb25lbnQgJiAoMSA8PCAtbkJpdHMpIC0gMTsKICBleHBvbmVudCA+Pj0gLW5CaXRzOwogIG5CaXRzICs9IG1hbnRpc3NhTGVuZ3RoOwogIGZvciAoOyBuQml0cyA+IDA7IG1hbnRpc3NhID0gbWFudGlzc2EgKiAyNTYgKyBidWZmZXJbaW5kZXhdLCBpbmRleC0tLCBuQml0cyAtPSA4KTsKICBpZiAoZXhwb25lbnQgPT09IDApIHsKICAgIGV4cG9uZW50ID0gMSAtIGVCaWFzOwogIH0gZWxzZSBpZiAoZXhwb25lbnQgPT09IGVNYXgpIHsKICAgIHJldHVybiBtYW50aXNzYSA/IE5hTiA6IHNpZ24gPyAtSW5maW5pdHkgOiBJbmZpbml0eTsKICB9IGVsc2UgewogICAgbWFudGlzc2EgPSBtYW50aXNzYSArIHBvdygyLCBtYW50aXNzYUxlbmd0aCk7CiAgICBleHBvbmVudCA9IGV4cG9uZW50IC0gZUJpYXM7CiAgfSByZXR1cm4gKHNpZ24gPyAtMSA6IDEpICogbWFudGlzc2EgKiBwb3coMiwgZXhwb25lbnQgLSBtYW50aXNzYUxlbmd0aCk7Cn07Cgptb2R1bGUuZXhwb3J0cyA9IHsKICBwYWNrOiBwYWNrLAogIHVucGFjazogdW5wYWNrCn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mLXJhdyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiKTsKCnZhciBzcGxpdCA9ICcnLnNwbGl0OwoKLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3MKbW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7CiAgLy8gdGhyb3dzIGFuIGVycm9yIGluIHJoaW5vLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcmhpbm8vaXNzdWVzLzM0NgogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMKICByZXR1cm4gIU9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApOwp9KSA/IGZ1bmN0aW9uIChpdCkgewogIHJldHVybiBjbGFzc29mKGl0KSA9PSAnU3RyaW5nJyA/IHNwbGl0LmNhbGwoaXQsICcnKSA6IE9iamVjdChpdCk7Cn0gOiBPYmplY3Q7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIHNldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIpOwoKLy8gbWFrZXMgc3ViY2xhc3Npbmcgd29yayBjb3JyZWN0IGZvciB3cmFwcGVkIGJ1aWx0LWlucwptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgkdGhpcywgZHVtbXksIFdyYXBwZXIpIHsKICB2YXIgTmV3VGFyZ2V0LCBOZXdUYXJnZXRQcm90b3R5cGU7CiAgaWYgKAogICAgLy8gaXQgY2FuIHdvcmsgb25seSB3aXRoIG5hdGl2ZSBgc2V0UHJvdG90eXBlT2ZgCiAgICBzZXRQcm90b3R5cGVPZiAmJgogICAgLy8gd2UgaGF2ZW4ndCBjb21wbGV0ZWx5IGNvcnJlY3QgcHJlLUVTNiB3YXkgZm9yIGdldHRpbmcgYG5ldy50YXJnZXRgLCBzbyB1c2UgdGhpcwogICAgdHlwZW9mIChOZXdUYXJnZXQgPSBkdW1teS5jb25zdHJ1Y3RvcikgPT0gJ2Z1bmN0aW9uJyAmJgogICAgTmV3VGFyZ2V0ICE9PSBXcmFwcGVyICYmCiAgICBpc09iamVjdChOZXdUYXJnZXRQcm90b3R5cGUgPSBOZXdUYXJnZXQucHJvdG90eXBlKSAmJgogICAgTmV3VGFyZ2V0UHJvdG90eXBlICE9PSBXcmFwcGVyLnByb3RvdHlwZQogICkgc2V0UHJvdG90eXBlT2YoJHRoaXMsIE5ld1RhcmdldFByb3RvdHlwZSk7CiAgcmV0dXJuICR0aGlzOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBzdG9yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qcyIpOwoKdmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSBGdW5jdGlvbi50b1N0cmluZzsKCi8vIHRoaXMgaGVscGVyIGJyb2tlbiBpbiBgMy40LjEtMy40LjRgLCBzbyB3ZSBjYW4ndCB1c2UgYHNoYXJlZGAgaGVscGVyCmlmICh0eXBlb2Ygc3RvcmUuaW5zcGVjdFNvdXJjZSAhPSAnZnVuY3Rpb24nKSB7CiAgc3RvcmUuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkgewogICAgcmV0dXJuIGZ1bmN0aW9uVG9TdHJpbmcuY2FsbChpdCk7CiAgfTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBzdG9yZS5pbnNwZWN0U291cmNlOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBoaWRkZW5LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpLmY7CnZhciB1aWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdWlkICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiKTsKdmFyIEZSRUVaSU5HID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZyZWV6aW5nICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mcmVlemluZy5qcyIpOwoKdmFyIE1FVEFEQVRBID0gdWlkKCdtZXRhJyk7CnZhciBpZCA9IDA7Cgp2YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIHRydWU7Cn07Cgp2YXIgc2V0TWV0YWRhdGEgPSBmdW5jdGlvbiAoaXQpIHsKICBkZWZpbmVQcm9wZXJ0eShpdCwgTUVUQURBVEEsIHsgdmFsdWU6IHsKICAgIG9iamVjdElEOiAnTycgKyArK2lkLCAvLyBvYmplY3QgSUQKICAgIHdlYWtEYXRhOiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEcwogIH0gfSk7Cn07Cgp2YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7CiAgLy8gcmV0dXJuIGEgcHJpbWl0aXZlIHdpdGggcHJlZml4CiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7CiAgaWYgKCFoYXMoaXQsIE1FVEFEQVRBKSkgewogICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3QKICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJzsKICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhCiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuICdFJzsKICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhCiAgICBzZXRNZXRhZGF0YShpdCk7CiAgLy8gcmV0dXJuIG9iamVjdCBJRAogIH0gcmV0dXJuIGl0W01FVEFEQVRBXS5vYmplY3RJRDsKfTsKCnZhciBnZXRXZWFrRGF0YSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7CiAgaWYgKCFoYXMoaXQsIE1FVEFEQVRBKSkgewogICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3QKICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuIHRydWU7CiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YQogICAgaWYgKCFjcmVhdGUpIHJldHVybiBmYWxzZTsKICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhCiAgICBzZXRNZXRhZGF0YShpdCk7CiAgLy8gcmV0dXJuIHRoZSBzdG9yZSBvZiB3ZWFrIGNvbGxlY3Rpb25zIElEcwogIH0gcmV0dXJuIGl0W01FVEFEQVRBXS53ZWFrRGF0YTsKfTsKCi8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZwp2YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHsKICBpZiAoRlJFRVpJTkcgJiYgbWV0YS5SRVFVSVJFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEFEQVRBKSkgc2V0TWV0YWRhdGEoaXQpOwogIHJldHVybiBpdDsKfTsKCnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7CiAgUkVRVUlSRUQ6IGZhbHNlLAogIGZhc3RLZXk6IGZhc3RLZXksCiAgZ2V0V2Vha0RhdGE6IGdldFdlYWtEYXRhLAogIG9uRnJlZXplOiBvbkZyZWV6ZQp9OwoKaGlkZGVuS2V5c1tNRVRBREFUQV0gPSB0cnVlOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBOQVRJVkVfV0VBS19NQVAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAuanMiKTsKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgb2JqZWN0SGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLmpzIik7CnZhciBzaGFyZWRLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2hhcmVkLWtleSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyIpOwp2YXIgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oaWRkZW4ta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiKTsKCnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7CnZhciBzZXQsIGdldCwgaGFzOwoKdmFyIGVuZm9yY2UgPSBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gaGFzKGl0KSA/IGdldChpdCkgOiBzZXQoaXQsIHt9KTsKfTsKCnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoVFlQRSkgewogIHJldHVybiBmdW5jdGlvbiAoaXQpIHsKICAgIHZhciBzdGF0ZTsKICAgIGlmICghaXNPYmplY3QoaXQpIHx8IChzdGF0ZSA9IGdldChpdCkpLnR5cGUgIT09IFRZUEUpIHsKICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpOwogICAgfSByZXR1cm4gc3RhdGU7CiAgfTsKfTsKCmlmIChOQVRJVkVfV0VBS19NQVApIHsKICB2YXIgc3RvcmUgPSBuZXcgV2Vha01hcCgpOwogIHZhciB3bWdldCA9IHN0b3JlLmdldDsKICB2YXIgd21oYXMgPSBzdG9yZS5oYXM7CiAgdmFyIHdtc2V0ID0gc3RvcmUuc2V0OwogIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHsKICAgIHdtc2V0LmNhbGwoc3RvcmUsIGl0LCBtZXRhZGF0YSk7CiAgICByZXR1cm4gbWV0YWRhdGE7CiAgfTsKICBnZXQgPSBmdW5jdGlvbiAoaXQpIHsKICAgIHJldHVybiB3bWdldC5jYWxsKHN0b3JlLCBpdCkgfHwge307CiAgfTsKICBoYXMgPSBmdW5jdGlvbiAoaXQpIHsKICAgIHJldHVybiB3bWhhcy5jYWxsKHN0b3JlLCBpdCk7CiAgfTsKfSBlbHNlIHsKICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7CiAgaGlkZGVuS2V5c1tTVEFURV0gPSB0cnVlOwogIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHsKICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShpdCwgU1RBVEUsIG1ldGFkYXRhKTsKICAgIHJldHVybiBtZXRhZGF0YTsKICB9OwogIGdldCA9IGZ1bmN0aW9uIChpdCkgewogICAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307CiAgfTsKICBoYXMgPSBmdW5jdGlvbiAoaXQpIHsKICAgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKTsKICB9Owp9Cgptb2R1bGUuZXhwb3J0cyA9IHsKICBzZXQ6IHNldCwKICBnZXQ6IGdldCwKICBoYXM6IGhhcywKICBlbmZvcmNlOiBlbmZvcmNlLAogIGdldHRlckZvcjogZ2V0dGVyRm9yCn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBJdGVyYXRvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanMiKTsKCnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTsKdmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlOwoKLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvcgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIHJldHVybiBpdCAhPT0gdW5kZWZpbmVkICYmIChJdGVyYXRvcnMuQXJyYXkgPT09IGl0IHx8IEFycmF5UHJvdG90eXBlW0lURVJBVE9SXSA9PT0gaXQpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcyIpOwoKLy8gYElzQXJyYXlgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2FycmF5Cm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZykgewogIHJldHVybiBjbGFzc29mKGFyZykgPT0gJ0FycmF5JzsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwoKdmFyIHJlcGxhY2VtZW50ID0gLyN8XC5wcm90b3R5cGVcLi87Cgp2YXIgaXNGb3JjZWQgPSBmdW5jdGlvbiAoZmVhdHVyZSwgZGV0ZWN0aW9uKSB7CiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldOwogIHJldHVybiB2YWx1ZSA9PSBQT0xZRklMTCA/IHRydWUKICAgIDogdmFsdWUgPT0gTkFUSVZFID8gZmFsc2UKICAgIDogdHlwZW9mIGRldGVjdGlvbiA9PSAnZnVuY3Rpb24nID8gZmFpbHMoZGV0ZWN0aW9uKQogICAgOiAhIWRldGVjdGlvbjsKfTsKCnZhciBub3JtYWxpemUgPSBpc0ZvcmNlZC5ub3JtYWxpemUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7CiAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTsKfTsKCnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9Owp2YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nOwp2YXIgUE9MWUZJTEwgPSBpc0ZvcmNlZC5QT0xZRklMTCA9ICdQJzsKCm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdlci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKCnZhciBmbG9vciA9IE1hdGguZmxvb3I7CgovLyBgTnVtYmVyLmlzSW50ZWdlcmAgbWV0aG9kIGltcGxlbWVudGF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci5pc2ludGVnZXIKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0ludGVnZXIoaXQpIHsKICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1pb3MuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW9zLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHVzZXJBZ2VudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91c2VyLWFnZW50ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91c2VyLWFnZW50LmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IC8oaXBob25lfGlwb2R8aXBhZCkuKmFwcGxld2Via2l0L2kudGVzdCh1c2VyQWdlbnQpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCm1vZHVsZS5leHBvcnRzID0gZmFsc2U7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcmVnZXhwLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mLXJhdyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCnZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTsKCi8vIGBJc1JlZ0V4cGAgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzcmVnZXhwCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CiAgdmFyIGlzUmVnRXhwOwogIHJldHVybiBpc09iamVjdChpdCkgJiYgKChpc1JlZ0V4cCA9IGl0W01BVENIXSkgIT09IHVuZGVmaW5lZCA/ICEhaXNSZWdFeHAgOiBjbGFzc29mKGl0KSA9PSAnUmVnRXhwJyk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKdmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiKTsKdmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiKTsKdmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nLmpzIik7Cgp2YXIgUmVzdWx0ID0gZnVuY3Rpb24gKHN0b3BwZWQsIHJlc3VsdCkgewogIHRoaXMuc3RvcHBlZCA9IHN0b3BwZWQ7CiAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7Cn07Cgp2YXIgaXRlcmF0ZSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBmbiwgdGhhdCwgQVNfRU5UUklFUywgSVNfSVRFUkFUT1IpIHsKICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoZm4sIHRoYXQsIEFTX0VOVFJJRVMgPyAyIDogMSk7CiAgdmFyIGl0ZXJhdG9yLCBpdGVyRm4sIGluZGV4LCBsZW5ndGgsIHJlc3VsdCwgbmV4dCwgc3RlcDsKCiAgaWYgKElTX0lURVJBVE9SKSB7CiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlOwogIH0gZWxzZSB7CiAgICBpdGVyRm4gPSBnZXRJdGVyYXRvck1ldGhvZChpdGVyYWJsZSk7CiAgICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoJ1RhcmdldCBpcyBub3QgaXRlcmFibGUnKTsKICAgIC8vIG9wdGltaXNhdGlvbiBmb3IgYXJyYXkgaXRlcmF0b3JzCiAgICBpZiAoaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJGbikpIHsKICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7CiAgICAgICAgcmVzdWx0ID0gQVNfRU5UUklFUwogICAgICAgICAgPyBib3VuZEZ1bmN0aW9uKGFuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKQogICAgICAgICAgOiBib3VuZEZ1bmN0aW9uKGl0ZXJhYmxlW2luZGV4XSk7CiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQgaW5zdGFuY2VvZiBSZXN1bHQpIHJldHVybiByZXN1bHQ7CiAgICAgIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpOwogICAgfQogICAgaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7CiAgfQoKICBuZXh0ID0gaXRlcmF0b3IubmV4dDsKICB3aGlsZSAoIShzdGVwID0gbmV4dC5jYWxsKGl0ZXJhdG9yKSkuZG9uZSkgewogICAgcmVzdWx0ID0gY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgYm91bmRGdW5jdGlvbiwgc3RlcC52YWx1ZSwgQVNfRU5UUklFUyk7CiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnb2JqZWN0JyAmJiByZXN1bHQgJiYgcmVzdWx0IGluc3RhbmNlb2YgUmVzdWx0KSByZXR1cm4gcmVzdWx0OwogIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpOwp9OwoKaXRlcmF0ZS5zdG9wID0gZnVuY3Rpb24gKHJlc3VsdCkgewogIHJldHVybiBuZXcgUmVzdWx0KHRydWUsIHJlc3VsdCk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMtY29yZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIpOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7CnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwoKdmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwp2YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IGZhbHNlOwoKdmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9OwoKLy8gYCVJdGVyYXRvclByb3RvdHlwZSVgIG9iamVjdAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLW9iamVjdAp2YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjsKCmlmIChbXS5rZXlzKSB7CiAgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTsKICAvLyBTYWZhcmkgOCBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGAKICBpZiAoISgnbmV4dCcgaW4gYXJyYXlJdGVyYXRvcikpIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSB0cnVlOwogIGVsc2UgewogICAgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoZ2V0UHJvdG90eXBlT2YoYXJyYXlJdGVyYXRvcikpOwogICAgaWYgKFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkgSXRlcmF0b3JQcm90b3R5cGUgPSBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGU7CiAgfQp9CgppZiAoSXRlcmF0b3JQcm90b3R5cGUgPT0gdW5kZWZpbmVkKSBJdGVyYXRvclByb3RvdHlwZSA9IHt9OwoKLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKCkKaWYgKCFJU19QVVJFICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSkgewogIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpOwp9Cgptb2R1bGUuZXhwb3J0cyA9IHsKICBJdGVyYXRvclByb3RvdHlwZTogSXRlcmF0b3JQcm90b3R5cGUsCiAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SUwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKbW9kdWxlLmV4cG9ydHMgPSB7fTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXAtdXBzZXJ0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXAtdXBzZXJ0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwoKLy8gYE1hcC5wcm90b3R5cGUudXBzZXJ0YCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RodW1ic3VwZXAvcHJvcG9zYWwtdXBzZXJ0Cm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdXBzZXJ0KGtleSwgdXBkYXRlRm4gLyogLCBpbnNlcnRGbiAqLykgewogIHZhciBtYXAgPSBhbk9iamVjdCh0aGlzKTsKICB2YXIgaW5zZXJ0Rm4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDsKICB2YXIgdmFsdWU7CiAgaWYgKHR5cGVvZiB1cGRhdGVGbiAhPSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnNlcnRGbiAhPSAnZnVuY3Rpb24nKSB7CiAgICB0aHJvdyBUeXBlRXJyb3IoJ0F0IGxlYXN0IG9uZSBjYWxsYmFjayByZXF1aXJlZCcpOwogIH0KICBpZiAobWFwLmhhcyhrZXkpKSB7CiAgICB2YWx1ZSA9IG1hcC5nZXQoa2V5KTsKICAgIGlmICh0eXBlb2YgdXBkYXRlRm4gPT0gJ2Z1bmN0aW9uJykgewogICAgICB2YWx1ZSA9IHVwZGF0ZUZuKHZhbHVlKTsKICAgICAgbWFwLnNldChrZXksIHZhbHVlKTsKICAgIH0KICB9IGVsc2UgaWYgKHR5cGVvZiBpbnNlcnRGbiA9PSAnZnVuY3Rpb24nKSB7CiAgICB2YWx1ZSA9IGluc2VydEZuKCk7CiAgICBtYXAuc2V0KGtleSwgdmFsdWUpOwogIH0gcmV0dXJuIHZhbHVlOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtZXhwbTEuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtZXhwbTEuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCnZhciBuYXRpdmVFeHBtMSA9IE1hdGguZXhwbTE7CnZhciBleHAgPSBNYXRoLmV4cDsKCi8vIGBNYXRoLmV4cG0xYCBtZXRob2QgaW1wbGVtZW50YXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5leHBtMQptb2R1bGUuZXhwb3J0cyA9ICghbmF0aXZlRXhwbTEKICAvLyBPbGQgRkYgYnVnCiAgfHwgbmF0aXZlRXhwbTEoMTApID4gMjIwMjUuNDY1Nzk0ODA2NzE5IHx8IG5hdGl2ZUV4cG0xKDEwKSA8IDIyMDI1LjQ2NTc5NDgwNjcxNjUxNjgKICAvLyBUb3IgQnJvd3NlciBidWcKICB8fCBuYXRpdmVFeHBtMSgtMmUtMTcpICE9IC0yZS0xNwopID8gZnVuY3Rpb24gZXhwbTEoeCkgewogIHJldHVybiAoeCA9ICt4KSA9PSAwID8geCA6IHggPiAtMWUtNiAmJiB4IDwgMWUtNiA/IHggKyB4ICogeCAvIDIgOiBleHAoeCkgLSAxOwp9IDogbmF0aXZlRXhwbTE7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC1mcm91bmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXRoLWZyb3VuZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHNpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWF0aC1zaWduICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXRoLXNpZ24uanMiKTsKCnZhciBhYnMgPSBNYXRoLmFiczsKdmFyIHBvdyA9IE1hdGgucG93Owp2YXIgRVBTSUxPTiA9IHBvdygyLCAtNTIpOwp2YXIgRVBTSUxPTjMyID0gcG93KDIsIC0yMyk7CnZhciBNQVgzMiA9IHBvdygyLCAxMjcpICogKDIgLSBFUFNJTE9OMzIpOwp2YXIgTUlOMzIgPSBwb3coMiwgLTEyNik7Cgp2YXIgcm91bmRUaWVzVG9FdmVuID0gZnVuY3Rpb24gKG4pIHsKICByZXR1cm4gbiArIDEgLyBFUFNJTE9OIC0gMSAvIEVQU0lMT047Cn07CgovLyBgTWF0aC5mcm91bmRgIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmZyb3VuZAptb2R1bGUuZXhwb3J0cyA9IE1hdGguZnJvdW5kIHx8IGZ1bmN0aW9uIGZyb3VuZCh4KSB7CiAgdmFyICRhYnMgPSBhYnMoeCk7CiAgdmFyICRzaWduID0gc2lnbih4KTsKICB2YXIgYSwgcmVzdWx0OwogIGlmICgkYWJzIDwgTUlOMzIpIHJldHVybiAkc2lnbiAqIHJvdW5kVGllc1RvRXZlbigkYWJzIC8gTUlOMzIgLyBFUFNJTE9OMzIpICogTUlOMzIgKiBFUFNJTE9OMzI7CiAgYSA9ICgxICsgRVBTSUxPTjMyIC8gRVBTSUxPTikgKiAkYWJzOwogIHJlc3VsdCA9IGEgLSAoYSAtICRhYnMpOwogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUKICBpZiAocmVzdWx0ID4gTUFYMzIgfHwgcmVzdWx0ICE9IHJlc3VsdCkgcmV0dXJuICRzaWduICogSW5maW5pdHk7CiAgcmV0dXJuICRzaWduICogcmVzdWx0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtbG9nMXAuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtbG9nMXAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCnZhciBsb2cgPSBNYXRoLmxvZzsKCi8vIGBNYXRoLmxvZzFwYCBtZXRob2QgaW1wbGVtZW50YXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5sb2cxcAptb2R1bGUuZXhwb3J0cyA9IE1hdGgubG9nMXAgfHwgZnVuY3Rpb24gbG9nMXAoeCkgewogIHJldHVybiAoeCA9ICt4KSA+IC0xZS04ICYmIHggPCAxZS04ID8geCAtIHggKiB4IC8gMiA6IGxvZygxICsgeCk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC1zY2FsZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC1zY2FsZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKLy8gYE1hdGguc2NhbGVgIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgovLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvCm1vZHVsZS5leHBvcnRzID0gTWF0aC5zY2FsZSB8fCBmdW5jdGlvbiBzY2FsZSh4LCBpbkxvdywgaW5IaWdoLCBvdXRMb3csIG91dEhpZ2gpIHsKICBpZiAoCiAgICBhcmd1bWVudHMubGVuZ3RoID09PSAwCiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqLwogICAgICB8fCB4ICE9IHgKICAgICAgfHwgaW5Mb3cgIT0gaW5Mb3cKICAgICAgfHwgaW5IaWdoICE9IGluSGlnaAogICAgICB8fCBvdXRMb3cgIT0gb3V0TG93CiAgICAgIHx8IG91dEhpZ2ggIT0gb3V0SGlnaAogICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSAqLwogICkgcmV0dXJuIE5hTjsKICBpZiAoeCA9PT0gSW5maW5pdHkgfHwgeCA9PT0gLUluZmluaXR5KSByZXR1cm4geDsKICByZXR1cm4gKHggLSBpbkxvdykgKiAob3V0SGlnaCAtIG91dExvdykgLyAoaW5IaWdoIC0gaW5Mb3cpICsgb3V0TG93Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtc2lnbi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXRoLXNpZ24uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKLy8gYE1hdGguc2lnbmAgbWV0aG9kIGltcGxlbWVudGF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGguc2lnbgptb2R1bGUuZXhwb3J0cyA9IE1hdGguc2lnbiB8fCBmdW5jdGlvbiBzaWduKHgpIHsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlCiAgcmV0dXJuICh4ID0gK3gpID09IDAgfHwgeCAhPSB4ID8geCA6IHggPCAwID8gLTEgOiAxOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21pY3JvdGFzay5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9taWNyb3Rhc2suanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIpLmY7CnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcyIpOwp2YXIgbWFjcm90YXNrID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Rhc2sgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Rhc2suanMiKS5zZXQ7CnZhciBJU19JT1MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtaW9zICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1pb3MuanMiKTsKCnZhciBNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7CnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7CnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7CnZhciBJU19OT0RFID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7Ci8vIE5vZGUuanMgMTEgc2hvd3MgRXhwZXJpbWVudGFsV2FybmluZyBvbiBnZXR0aW5nIGBxdWV1ZU1pY3JvdGFza2AKdmFyIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWwsICdxdWV1ZU1pY3JvdGFzaycpOwp2YXIgcXVldWVNaWNyb3Rhc2sgPSBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IgJiYgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yLnZhbHVlOwoKdmFyIGZsdXNoLCBoZWFkLCBsYXN0LCBub3RpZnksIHRvZ2dsZSwgbm9kZSwgcHJvbWlzZSwgdGhlbjsKCi8vIG1vZGVybiBlbmdpbmVzIGhhdmUgcXVldWVNaWNyb3Rhc2sgbWV0aG9kCmlmICghcXVldWVNaWNyb3Rhc2spIHsKICBmbHVzaCA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBwYXJlbnQsIGZuOwogICAgaWYgKElTX05PREUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTsKICAgIHdoaWxlIChoZWFkKSB7CiAgICAgIGZuID0gaGVhZC5mbjsKICAgICAgaGVhZCA9IGhlYWQubmV4dDsKICAgICAgdHJ5IHsKICAgICAgICBmbigpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTsKICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgIH0KICAgIH0gbGFzdCA9IHVuZGVmaW5lZDsKICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpOwogIH07CgogIC8vIE5vZGUuanMKICBpZiAoSVNfTk9ERSkgewogICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkgewogICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTsKICAgIH07CiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyLCBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOQogIH0gZWxzZSBpZiAoTXV0YXRpb25PYnNlcnZlciAmJiAhSVNfSU9TKSB7CiAgICB0b2dnbGUgPSB0cnVlOwogICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsKICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHsKICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTsKICAgIH07CiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2UKICB9IGVsc2UgaWYgKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7CiAgICAvLyBQcm9taXNlLnJlc29sdmUgd2l0aG91dCBhbiBhcmd1bWVudCB0aHJvd3MgYW4gZXJyb3IgaW4gTEcgV2ViT1MgMgogICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpOwogICAgdGhlbiA9IHByb21pc2UudGhlbjsKICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHsKICAgICAgdGhlbi5jYWxsKHByb21pc2UsIGZsdXNoKTsKICAgIH07CiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjoKICAvLyAtIHNldEltbWVkaWF0ZQogIC8vIC0gTWVzc2FnZUNoYW5uZWwKICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnCiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2UKICAvLyAtIHNldFRpbWVvdXQKICB9IGVsc2UgewogICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkgewogICAgICAvLyBzdHJhbmdlIElFICsgd2VicGFjayBkZXYgc2VydmVyIGJ1ZyAtIHVzZSAuY2FsbChnbG9iYWwpCiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpOwogICAgfTsKICB9Cn0KCm1vZHVsZS5leHBvcnRzID0gcXVldWVNaWNyb3Rhc2sgfHwgZnVuY3Rpb24gKGZuKSB7CiAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07CiAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7CiAgaWYgKCFoZWFkKSB7CiAgICBoZWFkID0gdGFzazsKICAgIG5vdGlmeSgpOwogIH0gbGFzdCA9IHRhc2s7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtcHJvbWlzZS1jb25zdHJ1Y3Rvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuUHJvbWlzZTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtc3ltYm9sLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtc3ltYm9sLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKCm1vZHVsZS5leHBvcnRzID0gISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICYmICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb24KICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYKICByZXR1cm4gIVN0cmluZyhTeW1ib2woKSk7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS11cmwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS11cmwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7Cgp2YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7Cgptb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgdmFyIHVybCA9IG5ldyBVUkwoJ2I/YT0xJmI9MiZjPTMnLCAnaHR0cDovL2EnKTsKICB2YXIgc2VhcmNoUGFyYW1zID0gdXJsLnNlYXJjaFBhcmFtczsKICB2YXIgcmVzdWx0ID0gJyc7CiAgdXJsLnBhdGhuYW1lID0gJ2MlMjBkJzsKICBzZWFyY2hQYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkgewogICAgc2VhcmNoUGFyYW1zWydkZWxldGUnXSgnYicpOwogICAgcmVzdWx0ICs9IGtleSArIHZhbHVlOwogIH0pOwogIHJldHVybiAoSVNfUFVSRSAmJiAhdXJsLnRvSlNPTikKICAgIHx8ICFzZWFyY2hQYXJhbXMuc29ydAogICAgfHwgdXJsLmhyZWYgIT09ICdodHRwOi8vYS9jJTIwZD9hPTEmYz0zJwogICAgfHwgc2VhcmNoUGFyYW1zLmdldCgnYycpICE9PSAnMycKICAgIHx8IFN0cmluZyhuZXcgVVJMU2VhcmNoUGFyYW1zKCc/YT0xJykpICE9PSAnYT0xJwogICAgfHwgIXNlYXJjaFBhcmFtc1tJVEVSQVRPUl0KICAgIC8vIHRocm93cyBpbiBFZGdlCiAgICB8fCBuZXcgVVJMKCdodHRwczovL2FAYicpLnVzZXJuYW1lICE9PSAnYScKICAgIHx8IG5ldyBVUkxTZWFyY2hQYXJhbXMobmV3IFVSTFNlYXJjaFBhcmFtcygnYT1iJykpLmdldCgnYScpICE9PSAnYicKICAgIC8vIG5vdCBwdW55Y29kZWQgaW4gRWRnZQogICAgfHwgbmV3IFVSTCgnaHR0cDovL9GC0LXRgdGCJykuaG9zdCAhPT0gJ3huLS1lMWF5YmMnCiAgICAvLyBub3QgZXNjYXBlZCBpbiBDaHJvbWUgNjItCiAgICB8fCBuZXcgVVJMKCdodHRwOi8vYSPQsScpLmhhc2ggIT09ICcjJUQwJUIxJwogICAgLy8gZmFpbHMgaW4gQ2hyb21lIDY2LQogICAgfHwgcmVzdWx0ICE9PSAnYTFjMycKICAgIC8vIHRocm93cyBpbiBTYWZhcmkKICAgIHx8IG5ldyBVUkwoJ2h0dHA6Ly94JywgdW5kZWZpbmVkKS5ob3N0ICE9PSAneCc7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS13ZWFrLW1hcC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBpbnNwZWN0U291cmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZS5qcyIpOwoKdmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDsKCm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KGluc3BlY3RTb3VyY2UoV2Vha01hcCkpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7Cgp2YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykgewogIHZhciByZXNvbHZlLCByZWplY3Q7CiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHsKICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTsKICAgIHJlc29sdmUgPSAkJHJlc29sdmU7CiAgICByZWplY3QgPSAkJHJlamVjdDsKICB9KTsKICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7CiAgdGhpcy5yZWplY3QgPSBhRnVuY3Rpb24ocmVqZWN0KTsKfTsKCi8vIDI1LjQuMS41IE5ld1Byb21pc2VDYXBhYmlsaXR5KEMpCm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykgewogIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm90LWEtcmVnZXhwLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25vdC1hLXJlZ2V4cC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBpc1JlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1yZWdleHAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICBpZiAoaXNSZWdFeHAoaXQpKSB7CiAgICB0aHJvdyBUeXBlRXJyb3IoIlRoZSBtZXRob2QgZG9lc24ndCBhY2NlcHQgcmVndWxhciBleHByZXNzaW9ucyIpOwogIH0gcmV0dXJuIGl0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1pcy1maW5pdGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1pcy1maW5pdGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwoKdmFyIGdsb2JhbElzRmluaXRlID0gZ2xvYmFsLmlzRmluaXRlOwoKLy8gYE51bWJlci5pc0Zpbml0ZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci5pc2Zpbml0ZQptb2R1bGUuZXhwb3J0cyA9IE51bWJlci5pc0Zpbml0ZSB8fCBmdW5jdGlvbiBpc0Zpbml0ZShpdCkgewogIHJldHVybiB0eXBlb2YgaXQgPT0gJ251bWJlcicgJiYgZ2xvYmFsSXNGaW5pdGUoaXQpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBvYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiKTsKdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcyIpOwp2YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiKTsKdmFyIEluZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzIik7Cgp2YXIgbmF0aXZlQXNzaWduID0gT2JqZWN0LmFzc2lnbjsKdmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5OwoKLy8gYE9iamVjdC5hc3NpZ25gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuYXNzaWduCm1vZHVsZS5leHBvcnRzID0gIW5hdGl2ZUFzc2lnbiB8fCBmYWlscyhmdW5jdGlvbiAoKSB7CiAgLy8gc2hvdWxkIGhhdmUgY29ycmVjdCBvcmRlciBvZiBvcGVyYXRpb25zIChFZGdlIGJ1ZykKICBpZiAoREVTQ1JJUFRPUlMgJiYgbmF0aXZlQXNzaWduKHsgYjogMSB9LCBuYXRpdmVBc3NpZ24oZGVmaW5lUHJvcGVydHkoe30sICdhJywgewogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYicsIHsKICAgICAgICB2YWx1ZTogMywKICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZQogICAgICB9KTsKICAgIH0KICB9KSwgeyBiOiAyIH0pKS5iICE9PSAxKSByZXR1cm4gdHJ1ZTsKICAvLyBzaG91bGQgd29yayB3aXRoIHN5bWJvbHMgYW5kIHNob3VsZCBoYXZlIGRldGVybWluaXN0aWMgcHJvcGVydHkgb3JkZXIgKFY4IGJ1ZykKICB2YXIgQSA9IHt9OwogIHZhciBCID0ge307CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmCiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgpOwogIHZhciBhbHBoYWJldCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7CiAgQVtzeW1ib2xdID0gNzsKICBhbHBoYWJldC5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoY2hyKSB7IEJbY2hyXSA9IGNocjsgfSk7CiAgcmV0dXJuIG5hdGl2ZUFzc2lnbih7fSwgQSlbc3ltYm9sXSAhPSA3IHx8IG9iamVjdEtleXMobmF0aXZlQXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gYWxwaGFiZXQ7Cn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7CiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgdmFyIGluZGV4ID0gMTsKICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7CiAgdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZjsKICB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHsKICAgIHZhciBTID0gSW5kZXhlZE9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pOwogICAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBvYmplY3RLZXlzKFMpLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoUykpIDogb2JqZWN0S2V5cyhTKTsKICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDsKICAgIHZhciBqID0gMDsKICAgIHZhciBrZXk7CiAgICB3aGlsZSAobGVuZ3RoID4gaikgewogICAgICBrZXkgPSBrZXlzW2orK107CiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChTLCBrZXkpKSBUW2tleV0gPSBTW2tleV07CiAgICB9CiAgfSByZXR1cm4gVDsKfSA6IG5hdGl2ZUFzc2lnbjsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydGllcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qcyIpOwp2YXIgZW51bUJ1Z0tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIpOwp2YXIgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oaWRkZW4ta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiKTsKdmFyIGh0bWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaHRtbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaHRtbC5qcyIpOwp2YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIpOwp2YXIgc2hhcmVkS2V5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiKTsKdmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpOwoKdmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnOwp2YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07CgovLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlCnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkgewogIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnCiAgdmFyIGlmcmFtZSA9IGRvY3VtZW50Q3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7CiAgdmFyIGxlbmd0aCA9IGVudW1CdWdLZXlzLmxlbmd0aDsKICB2YXIgbHQgPSAnPCc7CiAgdmFyIHNjcmlwdCA9ICdzY3JpcHQnOwogIHZhciBndCA9ICc+JzsKICB2YXIganMgPSAnamF2YScgKyBzY3JpcHQgKyAnOic7CiAgdmFyIGlmcmFtZURvY3VtZW50OwogIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTsKICBpZnJhbWUuc3JjID0gU3RyaW5nKGpzKTsKICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50OwogIGlmcmFtZURvY3VtZW50Lm9wZW4oKTsKICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArIHNjcmlwdCArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy8nICsgc2NyaXB0ICsgZ3QpOwogIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7CiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7CiAgd2hpbGUgKGxlbmd0aC0tKSBkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2xlbmd0aF1dOwogIHJldHVybiBjcmVhdGVEaWN0KCk7Cn07CgovLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGUKbW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7CiAgdmFyIHJlc3VsdDsKICBpZiAoTyAhPT0gbnVsbCkgewogICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pOwogICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7CiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDsKICAgIC8vIGFkZCAiX19wcm90b19fIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsCiAgICByZXN1bHRbSUVfUFJPVE9dID0gTzsKICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpOwogIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgUHJvcGVydGllcyk7Cn07CgpoaWRkZW5LZXlzW0lFX1BST1RPXSA9IHRydWU7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBvYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIpOwoKLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnRpZXMKbW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7CiAgYW5PYmplY3QoTyk7CiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpOwogIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDsKICB2YXIgaW5kZXggPSAwOwogIHZhciBrZXk7CiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKE8sIGtleSA9IGtleXNbaW5kZXgrK10sIFByb3BlcnRpZXNba2V5XSk7CiAgcmV0dXJuIE87Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBJRThfRE9NX0RFRklORSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciB0b1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcmltaXRpdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIpOwoKdmFyIG5hdGl2ZURlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5OwoKLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0eWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0eQpleHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZURlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykgewogIGFuT2JqZWN0KE8pOwogIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTsKICBhbk9iamVjdChBdHRyaWJ1dGVzKTsKICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7CiAgICByZXR1cm4gbmF0aXZlRGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7CiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfQogIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQnKTsKICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTsKICByZXR1cm4gTzsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcyIpOwp2YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIpOwp2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIpOwp2YXIgdG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanMiKTsKdmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgSUU4X0RPTV9ERUZJTkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lLmpzIik7Cgp2YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKCi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvcgpleHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7CiAgTyA9IHRvSW5kZXhlZE9iamVjdChPKTsKICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7CiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkgewogICAgcmV0dXJuIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKTsKICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9CiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZi5jYWxsKE8sIFApLCBPW1BdKTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIpOwp2YXIgbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMiKS5mOwoKdmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7Cgp2YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcwogID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdOwoKdmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24gKGl0KSB7CiAgdHJ5IHsKICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KTsKICB9IGNhdGNoIChlcnJvcikgewogICAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7CiAgfQp9OwoKLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvdwptb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkgewogIHJldHVybiB3aW5kb3dOYW1lcyAmJiB0b1N0cmluZy5jYWxsKGl0KSA9PSAnW29iamVjdCBXaW5kb3ddJwogICAgPyBnZXRXaW5kb3dOYW1lcyhpdCkKICAgIDogbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyh0b0luZGV4ZWRPYmplY3QoaXQpKTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIpOwp2YXIgZW51bUJ1Z0tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIpOwoKdmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTsKCi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzCmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykgewogIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSB7CgpleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciBzaGFyZWRLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2hhcmVkLWtleSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyIpOwp2YXIgQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIik7Cgp2YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7CnZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlOwoKLy8gYE9iamVjdC5nZXRQcm90b3R5cGVPZmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRwcm90b3R5cGVvZgptb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7CiAgTyA9IHRvT2JqZWN0KE8pOwogIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107CiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHsKICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTsKICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG90eXBlIDogbnVsbDsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXRlcmF0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWl0ZXJhdG9yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIik7CnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzIik7CnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIG9iamVjdEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwoKdmFyIE9CSkVDVF9JVEVSQVRPUiA9ICdPYmplY3QgSXRlcmF0b3InOwp2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0Owp2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKE9CSkVDVF9JVEVSQVRPUik7Cgptb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoZnVuY3Rpb24gT2JqZWN0SXRlcmF0b3Ioc291cmNlLCBtb2RlKSB7CiAgdmFyIG9iamVjdCA9IHRvT2JqZWN0KHNvdXJjZSk7CiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7CiAgICB0eXBlOiBPQkpFQ1RfSVRFUkFUT1IsCiAgICBtb2RlOiBtb2RlLAogICAgb2JqZWN0OiBvYmplY3QsCiAgICBrZXlzOiBvYmplY3RLZXlzKG9iamVjdCksCiAgICBpbmRleDogMAogIH0pOwp9LCAnT2JqZWN0JywgZnVuY3Rpb24gbmV4dCgpIHsKICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOwogIHZhciBrZXlzID0gc3RhdGUua2V5czsKICB3aGlsZSAodHJ1ZSkgewogICAgaWYgKGtleXMgPT09IG51bGwgfHwgc3RhdGUuaW5kZXggPj0ga2V5cy5sZW5ndGgpIHsKICAgICAgc3RhdGUub2JqZWN0ID0gc3RhdGUua2V5cyA9IG51bGw7CiAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTsKICAgIH0KICAgIHZhciBrZXkgPSBrZXlzW3N0YXRlLmluZGV4KytdOwogICAgdmFyIG9iamVjdCA9IHN0YXRlLm9iamVjdDsKICAgIGlmICghaGFzKG9iamVjdCwga2V5KSkgY29udGludWU7CiAgICBzd2l0Y2ggKHN0YXRlLm1vZGUpIHsKICAgICAgY2FzZSAna2V5cyc6IHJldHVybiB7IHZhbHVlOiBrZXksIGRvbmU6IGZhbHNlIH07CiAgICAgIGNhc2UgJ3ZhbHVlcyc6IHJldHVybiB7IHZhbHVlOiBvYmplY3Rba2V5XSwgZG9uZTogZmFsc2UgfTsKICAgIH0gLyogZW50cmllcyAqLyByZXR1cm4geyB2YWx1ZTogW2tleSwgb2JqZWN0W2tleV1dLCBkb25lOiBmYWxzZSB9OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIpOwp2YXIgaW5kZXhPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiKS5pbmRleE9mOwp2YXIgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oaWRkZW4ta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiKTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHsKICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpOwogIHZhciBpID0gMDsKICB2YXIgcmVzdWx0ID0gW107CiAgdmFyIGtleTsKICBmb3IgKGtleSBpbiBPKSAhaGFzKGhpZGRlbktleXMsIGtleSkgJiYgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTsKICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzCiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHsKICAgIH5pbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpOwogIH0KICByZXR1cm4gcmVzdWx0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBpbnRlcm5hbE9iamVjdEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsLmpzIik7CnZhciBlbnVtQnVnS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzLmpzIik7CgovLyBgT2JqZWN0LmtleXNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3Qua2V5cwptb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykgewogIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgZW51bUJ1Z0tleXMpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlOwp2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKCi8vIE5hc2hvcm4gfiBKREs4IGJ1Zwp2YXIgTkFTSE9STl9CVUcgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgIW5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoeyAxOiAyIH0sIDEpOwoKLy8gYE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGVgIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnByb3BlcnR5aXNlbnVtZXJhYmxlCmV4cG9ydHMuZiA9IE5BU0hPUk5fQlVHID8gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikgewogIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpOwogIHJldHVybiAhIWRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5lbnVtZXJhYmxlOwp9IDogbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGU7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBhUG9zc2libGVQcm90b3R5cGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlLmpzIik7CgovLyBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnNldHByb3RvdHlwZW9mCi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLgovKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqLwptb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7CiAgdmFyIENPUlJFQ1RfU0VUVEVSID0gZmFsc2U7CiAgdmFyIHRlc3QgPSB7fTsKICB2YXIgc2V0dGVyOwogIHRyeSB7CiAgICBzZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQ7CiAgICBzZXR0ZXIuY2FsbCh0ZXN0LCBbXSk7CiAgICBDT1JSRUNUX1NFVFRFUiA9IHRlc3QgaW5zdGFuY2VvZiBBcnJheTsKICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9CiAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7CiAgICBhbk9iamVjdChPKTsKICAgIGFQb3NzaWJsZVByb3RvdHlwZShwcm90byk7CiAgICBpZiAoQ09SUkVDVF9TRVRURVIpIHNldHRlci5jYWxsKE8sIHByb3RvKTsKICAgIGVsc2UgTy5fX3Byb3RvX18gPSBwcm90bzsKICAgIHJldHVybiBPOwogIH07Cn0oKSA6IHVuZGVmaW5lZCk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLWFycmF5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC10by1hcnJheS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIG9iamVjdEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzIik7CnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIik7CnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMiKS5mOwoKLy8gYE9iamVjdC57IGVudHJpZXMsIHZhbHVlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uCnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVE9fRU5UUklFUykgewogIHJldHVybiBmdW5jdGlvbiAoaXQpIHsKICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KGl0KTsKICAgIHZhciBrZXlzID0gb2JqZWN0S2V5cyhPKTsKICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDsKICAgIHZhciBpID0gMDsKICAgIHZhciByZXN1bHQgPSBbXTsKICAgIHZhciBrZXk7CiAgICB3aGlsZSAobGVuZ3RoID4gaSkgewogICAgICBrZXkgPSBrZXlzW2krK107CiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChPLCBrZXkpKSB7CiAgICAgICAgcmVzdWx0LnB1c2goVE9fRU5UUklFUyA/IFtrZXksIE9ba2V5XV0gOiBPW2tleV0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH07Cn07Cgptb2R1bGUuZXhwb3J0cyA9IHsKICAvLyBgT2JqZWN0LmVudHJpZXNgIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzCiAgZW50cmllczogY3JlYXRlTWV0aG9kKHRydWUpLAogIC8vIGBPYmplY3QudmFsdWVzYCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QudmFsdWVzCiAgdmFsdWVzOiBjcmVhdGVNZXRob2QoZmFsc2UpCn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0LmpzIik7CnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanMiKTsKCi8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2QgaW1wbGVtZW50YXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZwptb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IHt9LnRvU3RyaW5nIDogZnVuY3Rpb24gdG9TdHJpbmcoKSB7CiAgcmV0dXJuICdbb2JqZWN0ICcgKyBjbGFzc29mKHRoaXMpICsgJ10nOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3duLWtleXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIik7CnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CgovLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzCm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdvd25LZXlzJykgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkgewogIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7CiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mOwogIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpKSA6IGtleXM7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGFyc2UtZmxvYXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wYXJzZS1mbG9hdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgdHJpbSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctdHJpbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiKS50cmltOwp2YXIgd2hpdGVzcGFjZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3doaXRlc3BhY2VzLmpzIik7Cgp2YXIgbmF0aXZlUGFyc2VGbG9hdCA9IGdsb2JhbC5wYXJzZUZsb2F0Owp2YXIgRk9SQ0VEID0gMSAvIG5hdGl2ZVBhcnNlRmxvYXQod2hpdGVzcGFjZXMgKyAnLTAnKSAhPT0gLUluZmluaXR5OwoKLy8gYHBhcnNlRmxvYXRgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wYXJzZWZsb2F0LXN0cmluZwptb2R1bGUuZXhwb3J0cyA9IEZPUkNFRCA/IGZ1bmN0aW9uIHBhcnNlRmxvYXQoc3RyaW5nKSB7CiAgdmFyIHRyaW1tZWRTdHJpbmcgPSB0cmltKFN0cmluZyhzdHJpbmcpKTsKICB2YXIgcmVzdWx0ID0gbmF0aXZlUGFyc2VGbG9hdCh0cmltbWVkU3RyaW5nKTsKICByZXR1cm4gcmVzdWx0ID09PSAwICYmIHRyaW1tZWRTdHJpbmcuY2hhckF0KDApID09ICctJyA/IC0wIDogcmVzdWx0Owp9IDogbmF0aXZlUGFyc2VGbG9hdDsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wYXJzZS1pbnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGFyc2UtaW50LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgdHJpbSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctdHJpbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiKS50cmltOwp2YXIgd2hpdGVzcGFjZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3doaXRlc3BhY2VzLmpzIik7Cgp2YXIgbmF0aXZlUGFyc2VJbnQgPSBnbG9iYWwucGFyc2VJbnQ7CnZhciBoZXggPSAvXlsrLV0/MFtYeF0vOwp2YXIgRk9SQ0VEID0gbmF0aXZlUGFyc2VJbnQod2hpdGVzcGFjZXMgKyAnMDgnKSAhPT0gOCB8fCBuYXRpdmVQYXJzZUludCh3aGl0ZXNwYWNlcyArICcweDE2JykgIT09IDIyOwoKLy8gYHBhcnNlSW50YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcGFyc2VpbnQtc3RyaW5nLXJhZGl4Cm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEID8gZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLCByYWRpeCkgewogIHZhciBTID0gdHJpbShTdHJpbmcoc3RyaW5nKSk7CiAgcmV0dXJuIG5hdGl2ZVBhcnNlSW50KFMsIChyYWRpeCA+Pj4gMCkgfHwgKGhleC50ZXN0KFMpID8gMTYgOiAxMCkpOwp9IDogbmF0aXZlUGFyc2VJbnQ7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IGdsb2JhbDsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7CiAgdHJ5IHsKICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSwgdmFsdWU6IGV4ZWMoKSB9OwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgdmFsdWU6IGVycm9yIH07CiAgfQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIik7CnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7CiAgYW5PYmplY3QoQyk7CiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4OwogIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7CiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlOwogIHJlc29sdmUoeCk7CiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHVueWNvZGUtdG8tYXNjaWkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wdW55Y29kZS10by1hc2NpaS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9iZXN0aWVqcy9wdW55Y29kZS5qcy9ibG9iL21hc3Rlci9wdW55Y29kZS5qcwp2YXIgbWF4SW50ID0gMjE0NzQ4MzY0NzsgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMQp2YXIgYmFzZSA9IDM2Owp2YXIgdE1pbiA9IDE7CnZhciB0TWF4ID0gMjY7CnZhciBza2V3ID0gMzg7CnZhciBkYW1wID0gNzAwOwp2YXIgaW5pdGlhbEJpYXMgPSA3MjsKdmFyIGluaXRpYWxOID0gMTI4OyAvLyAweDgwCnZhciBkZWxpbWl0ZXIgPSAnLSc7IC8vICdceDJEJwp2YXIgcmVnZXhOb25BU0NJSSA9IC9bXlwwLVx1MDA3RV0vOyAvLyBub24tQVNDSUkgY2hhcnMKdmFyIHJlZ2V4U2VwYXJhdG9ycyA9IC9bLlx1MzAwMlx1RkYwRVx1RkY2MV0vZzsgLy8gUkZDIDM0OTAgc2VwYXJhdG9ycwp2YXIgT1ZFUkZMT1dfRVJST1IgPSAnT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3MnOwp2YXIgYmFzZU1pbnVzVE1pbiA9IGJhc2UgLSB0TWluOwp2YXIgZmxvb3IgPSBNYXRoLmZsb29yOwp2YXIgc3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTsKCi8qKgogKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgY29kZSBwb2ludHMgb2YgZWFjaCBVbmljb2RlCiAqIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLiBXaGlsZSBKYXZhU2NyaXB0IHVzZXMgVUNTLTIgaW50ZXJuYWxseSwKICogdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgYSBwYWlyIG9mIHN1cnJvZ2F0ZSBoYWx2ZXMgKGVhY2ggb2Ygd2hpY2gKICogVUNTLTIgZXhwb3NlcyBhcyBzZXBhcmF0ZSBjaGFyYWN0ZXJzKSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQsCiAqIG1hdGNoaW5nIFVURi0xNi4KICovCnZhciB1Y3MyZGVjb2RlID0gZnVuY3Rpb24gKHN0cmluZykgewogIHZhciBvdXRwdXQgPSBbXTsKICB2YXIgY291bnRlciA9IDA7CiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7CiAgd2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHsKICAgIHZhciB2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7CiAgICBpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7CiAgICAgIC8vIEl0J3MgYSBoaWdoIHN1cnJvZ2F0ZSwgYW5kIHRoZXJlIGlzIGEgbmV4dCBjaGFyYWN0ZXIuCiAgICAgIHZhciBleHRyYSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7CiAgICAgIGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBMb3cgc3Vycm9nYXRlLgogICAgICAgIG91dHB1dC5wdXNoKCgodmFsdWUgJiAweDNGRikgPDwgMTApICsgKGV4dHJhICYgMHgzRkYpICsgMHgxMDAwMCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gSXQncyBhbiB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGUKICAgICAgICAvLyBuZXh0IGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpci4KICAgICAgICBvdXRwdXQucHVzaCh2YWx1ZSk7CiAgICAgICAgY291bnRlci0tOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBvdXRwdXQucHVzaCh2YWx1ZSk7CiAgICB9CiAgfQogIHJldHVybiBvdXRwdXQ7Cn07CgovKioKICogQ29udmVydHMgYSBkaWdpdC9pbnRlZ2VyIGludG8gYSBiYXNpYyBjb2RlIHBvaW50LgogKi8KdmFyIGRpZ2l0VG9CYXNpYyA9IGZ1bmN0aW9uIChkaWdpdCkgewogIC8vICAwLi4yNSBtYXAgdG8gQVNDSUkgYS4ueiBvciBBLi5aCiAgLy8gMjYuLjM1IG1hcCB0byBBU0NJSSAwLi45CiAgcmV0dXJuIGRpZ2l0ICsgMjIgKyA3NSAqIChkaWdpdCA8IDI2KTsKfTsKCi8qKgogKiBCaWFzIGFkYXB0YXRpb24gZnVuY3Rpb24gYXMgcGVyIHNlY3Rpb24gMy40IG9mIFJGQyAzNDkyLgogKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ5MiNzZWN0aW9uLTMuNAogKi8KdmFyIGFkYXB0ID0gZnVuY3Rpb24gKGRlbHRhLCBudW1Qb2ludHMsIGZpcnN0VGltZSkgewogIHZhciBrID0gMDsKICBkZWx0YSA9IGZpcnN0VGltZSA/IGZsb29yKGRlbHRhIC8gZGFtcCkgOiBkZWx0YSA+PiAxOwogIGRlbHRhICs9IGZsb29yKGRlbHRhIC8gbnVtUG9pbnRzKTsKICBmb3IgKDsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHsKICAgIGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTsKICB9CiAgcmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7Cn07CgovKioKICogQ29udmVydHMgYSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzIChlLmcuIGEgZG9tYWluIG5hbWUgbGFiZWwpIHRvIGEKICogUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy4KICovCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAgbWF4LXN0YXRlbWVudHMKdmFyIGVuY29kZSA9IGZ1bmN0aW9uIChpbnB1dCkgewogIHZhciBvdXRwdXQgPSBbXTsKCiAgLy8gQ29udmVydCB0aGUgaW5wdXQgaW4gVUNTLTIgdG8gYW4gYXJyYXkgb2YgVW5pY29kZSBjb2RlIHBvaW50cy4KICBpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpOwoKICAvLyBDYWNoZSB0aGUgbGVuZ3RoLgogIHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDsKCiAgLy8gSW5pdGlhbGl6ZSB0aGUgc3RhdGUuCiAgdmFyIG4gPSBpbml0aWFsTjsKICB2YXIgZGVsdGEgPSAwOwogIHZhciBiaWFzID0gaW5pdGlhbEJpYXM7CiAgdmFyIGksIGN1cnJlbnRWYWx1ZTsKCiAgLy8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50cy4KICBmb3IgKGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHsKICAgIGN1cnJlbnRWYWx1ZSA9IGlucHV0W2ldOwogICAgaWYgKGN1cnJlbnRWYWx1ZSA8IDB4ODApIHsKICAgICAgb3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGN1cnJlbnRWYWx1ZSkpOwogICAgfQogIH0KCiAgdmFyIGJhc2ljTGVuZ3RoID0gb3V0cHV0Lmxlbmd0aDsgLy8gbnVtYmVyIG9mIGJhc2ljIGNvZGUgcG9pbnRzLgogIHZhciBoYW5kbGVkQ1BDb3VudCA9IGJhc2ljTGVuZ3RoOyAvLyBudW1iZXIgb2YgY29kZSBwb2ludHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZDsKCiAgLy8gRmluaXNoIHRoZSBiYXNpYyBzdHJpbmcgd2l0aCBhIGRlbGltaXRlciB1bmxlc3MgaXQncyBlbXB0eS4KICBpZiAoYmFzaWNMZW5ndGgpIHsKICAgIG91dHB1dC5wdXNoKGRlbGltaXRlcik7CiAgfQoKICAvLyBNYWluIGVuY29kaW5nIGxvb3A6CiAgd2hpbGUgKGhhbmRsZWRDUENvdW50IDwgaW5wdXRMZW5ndGgpIHsKICAgIC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHQgbGFyZ2VyIG9uZToKICAgIHZhciBtID0gbWF4SW50OwogICAgZm9yIChpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIGN1cnJlbnRWYWx1ZSA9IGlucHV0W2ldOwogICAgICBpZiAoY3VycmVudFZhbHVlID49IG4gJiYgY3VycmVudFZhbHVlIDwgbSkgewogICAgICAgIG0gPSBjdXJyZW50VmFsdWU7CiAgICAgIH0KICAgIH0KCiAgICAvLyBJbmNyZWFzZSBgZGVsdGFgIGVub3VnaCB0byBhZHZhbmNlIHRoZSBkZWNvZGVyJ3MgPG4saT4gc3RhdGUgdG8gPG0sMD4sIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93LgogICAgdmFyIGhhbmRsZWRDUENvdW50UGx1c09uZSA9IGhhbmRsZWRDUENvdW50ICsgMTsKICAgIGlmIChtIC0gbiA+IGZsb29yKChtYXhJbnQgLSBkZWx0YSkgLyBoYW5kbGVkQ1BDb3VudFBsdXNPbmUpKSB7CiAgICAgIHRocm93IFJhbmdlRXJyb3IoT1ZFUkZMT1dfRVJST1IpOwogICAgfQoKICAgIGRlbHRhICs9IChtIC0gbikgKiBoYW5kbGVkQ1BDb3VudFBsdXNPbmU7CiAgICBuID0gbTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHsKICAgICAgY3VycmVudFZhbHVlID0gaW5wdXRbaV07CiAgICAgIGlmIChjdXJyZW50VmFsdWUgPCBuICYmICsrZGVsdGEgPiBtYXhJbnQpIHsKICAgICAgICB0aHJvdyBSYW5nZUVycm9yKE9WRVJGTE9XX0VSUk9SKTsKICAgICAgfQogICAgICBpZiAoY3VycmVudFZhbHVlID09IG4pIHsKICAgICAgICAvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlci4KICAgICAgICB2YXIgcSA9IGRlbHRhOwogICAgICAgIGZvciAodmFyIGsgPSBiYXNlOyAvKiBubyBjb25kaXRpb24gKi87IGsgKz0gYmFzZSkgewogICAgICAgICAgdmFyIHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpOwogICAgICAgICAgaWYgKHEgPCB0KSBicmVhazsKICAgICAgICAgIHZhciBxTWludXNUID0gcSAtIHQ7CiAgICAgICAgICB2YXIgYmFzZU1pbnVzVCA9IGJhc2UgLSB0OwogICAgICAgICAgb3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyh0ICsgcU1pbnVzVCAlIGJhc2VNaW51c1QpKSk7CiAgICAgICAgICBxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpOwogICAgICAgIH0KCiAgICAgICAgb3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyhxKSkpOwogICAgICAgIGJpYXMgPSBhZGFwdChkZWx0YSwgaGFuZGxlZENQQ291bnRQbHVzT25lLCBoYW5kbGVkQ1BDb3VudCA9PSBiYXNpY0xlbmd0aCk7CiAgICAgICAgZGVsdGEgPSAwOwogICAgICAgICsraGFuZGxlZENQQ291bnQ7CiAgICAgIH0KICAgIH0KCiAgICArK2RlbHRhOwogICAgKytuOwogIH0KICByZXR1cm4gb3V0cHV0LmpvaW4oJycpOwp9OwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQpIHsKICB2YXIgZW5jb2RlZCA9IFtdOwogIHZhciBsYWJlbHMgPSBpbnB1dC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UocmVnZXhTZXBhcmF0b3JzLCAnXHUwMDJFJykuc3BsaXQoJy4nKTsKICB2YXIgaSwgbGFiZWw7CiAgZm9yIChpID0gMDsgaSA8IGxhYmVscy5sZW5ndGg7IGkrKykgewogICAgbGFiZWwgPSBsYWJlbHNbaV07CiAgICBlbmNvZGVkLnB1c2gocmVnZXhOb25BU0NJSS50ZXN0KGxhYmVsKSA/ICd4bi0tJyArIGVuY29kZShsYWJlbCkgOiBsYWJlbCk7CiAgfQogIHJldHVybiBlbmNvZGVkLmpvaW4oJy4nKTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS1hbGwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHJlZGVmaW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZGVmaW5lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIG9wdGlvbnMpIHsKICBmb3IgKHZhciBrZXkgaW4gc3JjKSByZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIG9wdGlvbnMpOwogIHJldHVybiB0YXJnZXQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7CnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIHNldEdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzIik7CnZhciBpbnNwZWN0U291cmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZS5qcyIpOwp2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiKTsKCnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7CnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTsKdmFyIFRFTVBMQVRFID0gU3RyaW5nKFN0cmluZykuc3BsaXQoJ1N0cmluZycpOwoKKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsdWUsIG9wdGlvbnMpIHsKICB2YXIgdW5zYWZlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy51bnNhZmUgOiBmYWxzZTsKICB2YXIgc2ltcGxlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5lbnVtZXJhYmxlIDogZmFsc2U7CiAgdmFyIG5vVGFyZ2V0R2V0ID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5ub1RhcmdldEdldCA6IGZhbHNlOwogIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykgewogICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgJiYgIWhhcyh2YWx1ZSwgJ25hbWUnKSkgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHZhbHVlLCAnbmFtZScsIGtleSk7CiAgICBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh2YWx1ZSkuc291cmNlID0gVEVNUExBVEUuam9pbih0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8ga2V5IDogJycpOwogIH0KICBpZiAoTyA9PT0gZ2xvYmFsKSB7CiAgICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTsKICAgIGVsc2Ugc2V0R2xvYmFsKGtleSwgdmFsdWUpOwogICAgcmV0dXJuOwogIH0gZWxzZSBpZiAoIXVuc2FmZSkgewogICAgZGVsZXRlIE9ba2V5XTsKICB9IGVsc2UgaWYgKCFub1RhcmdldEdldCAmJiBPW2tleV0pIHsKICAgIHNpbXBsZSA9IHRydWU7CiAgfQogIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlOwogIGVsc2UgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KE8sIGtleSwgdmFsdWUpOwovLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmUKfSkoRnVuY3Rpb24ucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHsKICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNvdXJjZSB8fCBpbnNwZWN0U291cmNlKHRoaXMpOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIFRPRE86IGluIGNvcmUtanNANCwgbW92ZSAvbW9kdWxlcy8gZGVwZW5kZW5jaWVzIHRvIHB1YmxpYyBlbnRyaWVzIGZvciBiZXR0ZXIgb3B0aW1pemF0aW9uIGJ5IHRvb2xzIGxpa2UgYHByZXNldC1lbnZgCnZhciBNYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLm1hcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyIpOwp2YXIgV2Vha01hcCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMud2Vhay1tYXAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLW1hcC5qcyIpOwp2YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIik7Cgp2YXIgbWV0YWRhdGEgPSBzaGFyZWQoJ21ldGFkYXRhJyk7CnZhciBzdG9yZSA9IG1ldGFkYXRhLnN0b3JlIHx8IChtZXRhZGF0YS5zdG9yZSA9IG5ldyBXZWFrTWFwKCkpOwoKdmFyIGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAgPSBmdW5jdGlvbiAodGFyZ2V0LCB0YXJnZXRLZXksIGNyZWF0ZSkgewogIHZhciB0YXJnZXRNZXRhZGF0YSA9IHN0b3JlLmdldCh0YXJnZXQpOwogIGlmICghdGFyZ2V0TWV0YWRhdGEpIHsKICAgIGlmICghY3JlYXRlKSByZXR1cm47CiAgICBzdG9yZS5zZXQodGFyZ2V0LCB0YXJnZXRNZXRhZGF0YSA9IG5ldyBNYXAoKSk7CiAgfQogIHZhciBrZXlNZXRhZGF0YSA9IHRhcmdldE1ldGFkYXRhLmdldCh0YXJnZXRLZXkpOwogIGlmICgha2V5TWV0YWRhdGEpIHsKICAgIGlmICghY3JlYXRlKSByZXR1cm47CiAgICB0YXJnZXRNZXRhZGF0YS5zZXQodGFyZ2V0S2V5LCBrZXlNZXRhZGF0YSA9IG5ldyBNYXAoKSk7CiAgfSByZXR1cm4ga2V5TWV0YWRhdGE7Cn07Cgp2YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTywgUCkgewogIHZhciBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgZmFsc2UpOwogIHJldHVybiBtZXRhZGF0YU1hcCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBtZXRhZGF0YU1hcC5oYXMoTWV0YWRhdGFLZXkpOwp9OwoKdmFyIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHsKICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIGZhbHNlKTsKICByZXR1cm4gbWV0YWRhdGFNYXAgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG1ldGFkYXRhTWFwLmdldChNZXRhZGF0YUtleSk7Cn07Cgp2YXIgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkgewogIGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgdHJ1ZSkuc2V0KE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlKTsKfTsKCnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHRhcmdldEtleSkgewogIHZhciBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAodGFyZ2V0LCB0YXJnZXRLZXksIGZhbHNlKTsKICB2YXIga2V5cyA9IFtdOwogIGlmIChtZXRhZGF0YU1hcCkgbWV0YWRhdGFNYXAuZm9yRWFjaChmdW5jdGlvbiAoXywga2V5KSB7IGtleXMucHVzaChrZXkpOyB9KTsKICByZXR1cm4ga2V5czsKfTsKCnZhciB0b01ldGFkYXRhS2V5ID0gZnVuY3Rpb24gKGl0KSB7CiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiBTdHJpbmcoaXQpOwp9OwoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgc3RvcmU6IHN0b3JlLAogIGdldE1hcDogZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCwKICBoYXM6IG9yZGluYXJ5SGFzT3duTWV0YWRhdGEsCiAgZ2V0OiBvcmRpbmFyeUdldE93bk1ldGFkYXRhLAogIHNldDogb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSwKICBrZXlzOiBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cywKICB0b0tleTogdG9NZXRhZGF0YUtleQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9jbGFzc29mLXJhdyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiKTsKdmFyIHJlZ2V4cEV4ZWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3JlZ2V4cC1leGVjICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy5qcyIpOwoKLy8gYFJlZ0V4cEV4ZWNgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHBleGVjCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFIsIFMpIHsKICB2YXIgZXhlYyA9IFIuZXhlYzsKICBpZiAodHlwZW9mIGV4ZWMgPT09ICdmdW5jdGlvbicpIHsKICAgIHZhciByZXN1bHQgPSBleGVjLmNhbGwoUiwgUyk7CiAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ29iamVjdCcpIHsKICAgICAgdGhyb3cgVHlwZUVycm9yKCdSZWdFeHAgZXhlYyBtZXRob2QgcmV0dXJuZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYW4gT2JqZWN0IG9yIG51bGwnKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBpZiAoY2xhc3NvZihSKSAhPT0gJ1JlZ0V4cCcpIHsKICAgIHRocm93IFR5cGVFcnJvcignUmVnRXhwI2V4ZWMgY2FsbGVkIG9uIGluY29tcGF0aWJsZSByZWNlaXZlcicpOwogIH0KCiAgcmV0dXJuIHJlZ2V4cEV4ZWMuY2FsbChSLCBTKTsKfTsKCgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIHJlZ2V4cEZsYWdzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9yZWdleHAtZmxhZ3MgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1mbGFncy5qcyIpOwoKdmFyIG5hdGl2ZUV4ZWMgPSBSZWdFeHAucHJvdG90eXBlLmV4ZWM7Ci8vIFRoaXMgYWx3YXlzIHJlZmVycyB0byB0aGUgbmF0aXZlIGltcGxlbWVudGF0aW9uLCBiZWNhdXNlIHRoZQovLyBTdHJpbmcjcmVwbGFjZSBwb2x5ZmlsbCB1c2VzIC4vZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qcywKLy8gd2hpY2ggbG9hZHMgdGhpcyBmaWxlIGJlZm9yZSBwYXRjaGluZyB0aGUgbWV0aG9kLgp2YXIgbmF0aXZlUmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTsKCnZhciBwYXRjaGVkRXhlYyA9IG5hdGl2ZUV4ZWM7Cgp2YXIgVVBEQVRFU19MQVNUX0lOREVYX1dST05HID0gKGZ1bmN0aW9uICgpIHsKICB2YXIgcmUxID0gL2EvOwogIHZhciByZTIgPSAvYiovZzsKICBuYXRpdmVFeGVjLmNhbGwocmUxLCAnYScpOwogIG5hdGl2ZUV4ZWMuY2FsbChyZTIsICdhJyk7CiAgcmV0dXJuIHJlMS5sYXN0SW5kZXggIT09IDAgfHwgcmUyLmxhc3RJbmRleCAhPT0gMDsKfSkoKTsKCi8vIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwLCBjb3BpZWQgZnJvbSBlczUtc2hpbSdzIFN0cmluZyNzcGxpdCBwYXRjaC4KdmFyIE5QQ0dfSU5DTFVERUQgPSAvKCk/Py8uZXhlYygnJylbMV0gIT09IHVuZGVmaW5lZDsKCnZhciBQQVRDSCA9IFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyB8fCBOUENHX0lOQ0xVREVEOwoKaWYgKFBBVENIKSB7CiAgcGF0Y2hlZEV4ZWMgPSBmdW5jdGlvbiBleGVjKHN0cikgewogICAgdmFyIHJlID0gdGhpczsKICAgIHZhciBsYXN0SW5kZXgsIHJlQ29weSwgbWF0Y2gsIGk7CgogICAgaWYgKE5QQ0dfSU5DTFVERUQpIHsKICAgICAgcmVDb3B5ID0gbmV3IFJlZ0V4cCgnXicgKyByZS5zb3VyY2UgKyAnJCg/IVxccyknLCByZWdleHBGbGFncy5jYWxsKHJlKSk7CiAgICB9CiAgICBpZiAoVVBEQVRFU19MQVNUX0lOREVYX1dST05HKSBsYXN0SW5kZXggPSByZS5sYXN0SW5kZXg7CgogICAgbWF0Y2ggPSBuYXRpdmVFeGVjLmNhbGwocmUsIHN0cik7CgogICAgaWYgKFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyAmJiBtYXRjaCkgewogICAgICByZS5sYXN0SW5kZXggPSByZS5nbG9iYWwgPyBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCA6IGxhc3RJbmRleDsKICAgIH0KICAgIGlmIChOUENHX0lOQ0xVREVEICYmIG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDEpIHsKICAgICAgLy8gRml4IGJyb3dzZXJzIHdob3NlIGBleGVjYCBtZXRob2RzIGRvbid0IGNvbnNpc3RlbnRseSByZXR1cm4gYHVuZGVmaW5lZGAKICAgICAgLy8gZm9yIE5QQ0csIGxpa2UgSUU4LiBOT1RFOiBUaGlzIGRvZXNuJyB3b3JrIGZvciAvKC4/KT8vCiAgICAgIG5hdGl2ZVJlcGxhY2UuY2FsbChtYXRjaFswXSwgcmVDb3B5LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgZm9yIChpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAyOyBpKyspIHsKICAgICAgICAgIGlmIChhcmd1bWVudHNbaV0gPT09IHVuZGVmaW5lZCkgbWF0Y2hbaV0gPSB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICByZXR1cm4gbWF0Y2g7CiAgfTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBwYXRjaGVkRXhlYzsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZmxhZ3MuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CgovLyBgUmVnRXhwLnByb3RvdHlwZS5mbGFnc2AgZ2V0dGVyIGltcGxlbWVudGF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWdldC1yZWdleHAucHJvdG90eXBlLmZsYWdzCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogIHZhciB0aGF0ID0gYW5PYmplY3QodGhpcyk7CiAgdmFyIHJlc3VsdCA9ICcnOwogIGlmICh0aGF0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJzsKICBpZiAodGhhdC5pZ25vcmVDYXNlKSByZXN1bHQgKz0gJ2knOwogIGlmICh0aGF0Lm11bHRpbGluZSkgcmVzdWx0ICs9ICdtJzsKICBpZiAodGhhdC5kb3RBbGwpIHJlc3VsdCArPSAncyc7CiAgaWYgKHRoYXQudW5pY29kZSkgcmVzdWx0ICs9ICd1JzsKICBpZiAodGhhdC5zdGlja3kpIHJlc3VsdCArPSAneSc7CiAgcmV0dXJuIHJlc3VsdDsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCi8vIGBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlYCBhYnN0cmFjdCBvcGVyYXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVxdWlyZW9iamVjdGNvZXJjaWJsZQptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIiArIGl0KTsKICByZXR1cm4gaXQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2FtZS12YWx1ZS16ZXJvLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NhbWUtdmFsdWUtemVyby5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7CgovLyBgU2FtZVZhbHVlWmVyb2AgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXNhbWV2YWx1ZXplcm8KbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoeCwgeSkgewogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUKICByZXR1cm4geCA9PT0geSB8fCB4ICE9IHggJiYgeSAhPSB5Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NhbWUtdmFsdWUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NhbWUtdmFsdWUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCi8vIGBTYW1lVmFsdWVgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zYW1ldmFsdWUKbW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuaXMgfHwgZnVuY3Rpb24gaXMoeCwgeSkgewogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUKICByZXR1cm4geCA9PT0geSA/IHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5IDogeCAhPSB4ICYmIHkgIT0geTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogIHRyeSB7CiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoZ2xvYmFsLCBrZXksIHZhbHVlKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgZ2xvYmFsW2tleV0gPSB2YWx1ZTsKICB9IHJldHVybiB2YWx1ZTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7Cgp2YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSkgewogIHZhciBDb25zdHJ1Y3RvciA9IGdldEJ1aWx0SW4oQ09OU1RSVUNUT1JfTkFNRSk7CiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjsKCiAgaWYgKERFU0NSSVBUT1JTICYmIENvbnN0cnVjdG9yICYmICFDb25zdHJ1Y3RvcltTUEVDSUVTXSkgewogICAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFNQRUNJRVMsIHsKICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0KICAgIH0pOwogIH0KfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpLmY7CnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRBRywgU1RBVElDKSB7CiAgaWYgKGl0ICYmICFoYXMoaXQgPSBTVEFUSUMgPyBpdCA6IGl0LnByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHsKICAgIGRlZmluZVByb3BlcnR5KGl0LCBUT19TVFJJTkdfVEFHLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IFRBRyB9KTsKICB9Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIik7CnZhciB1aWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdWlkICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiKTsKCnZhciBrZXlzID0gc2hhcmVkKCdrZXlzJyk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHsKICByZXR1cm4ga2V5c1trZXldIHx8IChrZXlzW2tleV0gPSB1aWQoa2V5KSk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIHNldEdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzIik7Cgp2YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7CnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IHNldEdsb2JhbChTSEFSRUQsIHt9KTsKCm1vZHVsZS5leHBvcnRzID0gc3RvcmU7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIHN0b3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzIik7CgoobW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pOwp9KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7CiAgdmVyc2lvbjogJzMuNS4wJywKICBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsCiAgY29weXJpZ2h0OiAnwqkgMjAxOSBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KScKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSwgYXJndW1lbnQpIHsKICB2YXIgbWV0aG9kID0gW11bTUVUSE9EX05BTUVdOwogIHJldHVybiAhbWV0aG9kIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jYWxsLG5vLXRocm93LWxpdGVyYWwKICAgIG1ldGhvZC5jYWxsKG51bGwsIGFyZ3VtZW50IHx8IGZ1bmN0aW9uICgpIHsgdGhyb3cgMTsgfSwgMSk7CiAgfSk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7Cgp2YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpOwoKLy8gYFNwZWNpZXNDb25zdHJ1Y3RvcmAgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXNwZWNpZXNjb25zdHJ1Y3Rvcgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBkZWZhdWx0Q29uc3RydWN0b3IpIHsKICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yOwogIHZhciBTOwogIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gZGVmYXVsdENvbnN0cnVjdG9yIDogYUZ1bmN0aW9uKFMpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIik7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7CgovLyBgU3RyaW5nLnByb3RvdHlwZS57IGNvZGVQb2ludEF0LCBhdCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uCnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoQ09OVkVSVF9UT19TVFJJTkcpIHsKICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBwb3MpIHsKICAgIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTsKICAgIHZhciBwb3NpdGlvbiA9IHRvSW50ZWdlcihwb3MpOwogICAgdmFyIHNpemUgPSBTLmxlbmd0aDsKICAgIHZhciBmaXJzdCwgc2Vjb25kOwogICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBzaXplKSByZXR1cm4gQ09OVkVSVF9UT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDsKICAgIGZpcnN0ID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uKTsKICAgIHJldHVybiBmaXJzdCA8IDB4RDgwMCB8fCBmaXJzdCA+IDB4REJGRiB8fCBwb3NpdGlvbiArIDEgPT09IHNpemUKICAgICAgfHwgKHNlY29uZCA9IFMuY2hhckNvZGVBdChwb3NpdGlvbiArIDEpKSA8IDB4REMwMCB8fCBzZWNvbmQgPiAweERGRkYKICAgICAgICA/IENPTlZFUlRfVE9fU1RSSU5HID8gUy5jaGFyQXQocG9zaXRpb24pIDogZmlyc3QKICAgICAgICA6IENPTlZFUlRfVE9fU1RSSU5HID8gUy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyAyKSA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7CiAgfTsKfTsKCm1vZHVsZS5leHBvcnRzID0gewogIC8vIGBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0YCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmNvZGVwb2ludGF0CiAgY29kZUF0OiBjcmVhdGVNZXRob2QoZmFsc2UpLAogIC8vIGBTdHJpbmcucHJvdG90eXBlLmF0YCBtZXRob2QKICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLmF0CiAgY2hhckF0OiBjcmVhdGVNZXRob2QodHJ1ZSkKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcGFkLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcGFkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kCnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgcmVwZWF0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQuanMiKTsKdmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanMiKTsKCnZhciBjZWlsID0gTWF0aC5jZWlsOwoKLy8gYFN0cmluZy5wcm90b3R5cGUueyBwYWRTdGFydCwgcGFkRW5kIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb24KdmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19FTkQpIHsKICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcpIHsKICAgIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTsKICAgIHZhciBzdHJpbmdMZW5ndGggPSBTLmxlbmd0aDsKICAgIHZhciBmaWxsU3RyID0gZmlsbFN0cmluZyA9PT0gdW5kZWZpbmVkID8gJyAnIDogU3RyaW5nKGZpbGxTdHJpbmcpOwogICAgdmFyIGludE1heExlbmd0aCA9IHRvTGVuZ3RoKG1heExlbmd0aCk7CiAgICB2YXIgZmlsbExlbiwgc3RyaW5nRmlsbGVyOwogICAgaWYgKGludE1heExlbmd0aCA8PSBzdHJpbmdMZW5ndGggfHwgZmlsbFN0ciA9PSAnJykgcmV0dXJuIFM7CiAgICBmaWxsTGVuID0gaW50TWF4TGVuZ3RoIC0gc3RyaW5nTGVuZ3RoOwogICAgc3RyaW5nRmlsbGVyID0gcmVwZWF0LmNhbGwoZmlsbFN0ciwgY2VpbChmaWxsTGVuIC8gZmlsbFN0ci5sZW5ndGgpKTsKICAgIGlmIChzdHJpbmdGaWxsZXIubGVuZ3RoID4gZmlsbExlbikgc3RyaW5nRmlsbGVyID0gc3RyaW5nRmlsbGVyLnNsaWNlKDAsIGZpbGxMZW4pOwogICAgcmV0dXJuIElTX0VORCA/IFMgKyBzdHJpbmdGaWxsZXIgOiBzdHJpbmdGaWxsZXIgKyBTOwogIH07Cn07Cgptb2R1bGUuZXhwb3J0cyA9IHsKICAvLyBgU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydGAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5wYWRzdGFydAogIHN0YXJ0OiBjcmVhdGVNZXRob2QoZmFsc2UpLAogIC8vIGBTdHJpbmcucHJvdG90eXBlLnBhZEVuZGAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5wYWRlbmQKICBlbmQ6IGNyZWF0ZU1ldGhvZCh0cnVlKQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIik7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5yZXBlYXRgIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnJlcGVhdAptb2R1bGUuZXhwb3J0cyA9ICcnLnJlcGVhdCB8fCBmdW5jdGlvbiByZXBlYXQoY291bnQpIHsKICB2YXIgc3RyID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpOwogIHZhciByZXN1bHQgPSAnJzsKICB2YXIgbiA9IHRvSW50ZWdlcihjb3VudCk7CiAgaWYgKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG51bWJlciBvZiByZXBldGl0aW9ucycpOwogIGZvciAoO24gPiAwOyAobiA+Pj49IDEpICYmIChzdHIgKz0gc3RyKSkgaWYgKG4gJiAxKSByZXN1bHQgKz0gc3RyOwogIHJldHVybiByZXN1bHQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanMiKTsKdmFyIHdoaXRlc3BhY2VzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93aGl0ZXNwYWNlcy5qcyIpOwoKdmFyIHdoaXRlc3BhY2UgPSAnWycgKyB3aGl0ZXNwYWNlcyArICddJzsKdmFyIGx0cmltID0gUmVnRXhwKCdeJyArIHdoaXRlc3BhY2UgKyB3aGl0ZXNwYWNlICsgJyonKTsKdmFyIHJ0cmltID0gUmVnRXhwKHdoaXRlc3BhY2UgKyB3aGl0ZXNwYWNlICsgJyokJyk7CgovLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW0sIHRyaW1TdGFydCwgdHJpbUVuZCwgdHJpbUxlZnQsIHRyaW1SaWdodCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uCnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVFlQRSkgewogIHJldHVybiBmdW5jdGlvbiAoJHRoaXMpIHsKICAgIHZhciBzdHJpbmcgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpOwogICAgaWYgKFRZUEUgJiAxKSBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShsdHJpbSwgJycpOwogICAgaWYgKFRZUEUgJiAyKSBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShydHJpbSwgJycpOwogICAgcmV0dXJuIHN0cmluZzsKICB9Owp9OwoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltTGVmdCwgdHJpbVN0YXJ0IH1gIG1ldGhvZHMKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1zdGFydAogIHN0YXJ0OiBjcmVhdGVNZXRob2QoMSksCiAgLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltUmlnaHQsIHRyaW1FbmQgfWAgbWV0aG9kcwogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbWVuZAogIGVuZDogY3JlYXRlTWV0aG9kKDIpLAogIC8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW1gIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbQogIHRyaW06IGNyZWF0ZU1ldGhvZCgzKQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Rhc2suanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Rhc2suanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcyIpOwp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgaHRtbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9odG1sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9odG1sLmpzIik7CnZhciBjcmVhdGVFbGVtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIpOwp2YXIgSVNfSU9TID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWlvcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW9zLmpzIik7Cgp2YXIgbG9jYXRpb24gPSBnbG9iYWwubG9jYXRpb247CnZhciBzZXQgPSBnbG9iYWwuc2V0SW1tZWRpYXRlOwp2YXIgY2xlYXIgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGU7CnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7CnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDsKdmFyIERpc3BhdGNoID0gZ2xvYmFsLkRpc3BhdGNoOwp2YXIgY291bnRlciA9IDA7CnZhciBxdWV1ZSA9IHt9Owp2YXIgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7CnZhciBkZWZlciwgY2hhbm5lbCwgcG9ydDsKCnZhciBydW4gPSBmdW5jdGlvbiAoaWQpIHsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zCiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkgewogICAgdmFyIGZuID0gcXVldWVbaWRdOwogICAgZGVsZXRlIHF1ZXVlW2lkXTsKICAgIGZuKCk7CiAgfQp9OwoKdmFyIHJ1bm5lciA9IGZ1bmN0aW9uIChpZCkgewogIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICBydW4oaWQpOwogIH07Cn07Cgp2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHsKICBydW4oZXZlbnQuZGF0YSk7Cn07Cgp2YXIgcG9zdCA9IGZ1bmN0aW9uIChpZCkgewogIC8vIG9sZCBlbmdpbmVzIGhhdmUgbm90IGxvY2F0aW9uLm9yaWdpbgogIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCBsb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyBsb2NhdGlvbi5ob3N0KTsKfTsKCi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZToKaWYgKCFzZXQgfHwgIWNsZWFyKSB7CiAgc2V0ID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7CiAgICB2YXIgYXJncyA9IFtdOwogICAgdmFyIGkgPSAxOwogICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pOwogICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jCiAgICAgICh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pKS5hcHBseSh1bmRlZmluZWQsIGFyZ3MpOwogICAgfTsKICAgIGRlZmVyKGNvdW50ZXIpOwogICAgcmV0dXJuIGNvdW50ZXI7CiAgfTsKICBjbGVhciA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKSB7CiAgICBkZWxldGUgcXVldWVbaWRdOwogIH07CiAgLy8gTm9kZS5qcyAwLjgtCiAgaWYgKGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKSB7CiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkgewogICAgICBwcm9jZXNzLm5leHRUaWNrKHJ1bm5lcihpZCkpOwogICAgfTsKICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUEkKICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykgewogICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHsKICAgICAgRGlzcGF0Y2gubm93KHJ1bm5lcihpZCkpOwogICAgfTsKICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzCiAgLy8gZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82MjQKICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsICYmICFJU19JT1MpIHsKICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTsKICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyOwogICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjsKICAgIGRlZmVyID0gYmluZChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTsKICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnMKICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0JwogIH0gZWxzZSBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiYgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzICYmICFmYWlscyhwb3N0KSkgewogICAgZGVmZXIgPSBwb3N0OwogICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpOwogIC8vIElFOC0KICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkgewogICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHsKICAgICAgaHRtbC5hcHBlbmRDaGlsZChjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpOwogICAgICAgIHJ1bihpZCk7CiAgICAgIH07CiAgICB9OwogIC8vIFJlc3Qgb2xkIGJyb3dzZXJzCiAgfSBlbHNlIHsKICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7CiAgICAgIHNldFRpbWVvdXQocnVubmVyKGlkKSwgMCk7CiAgICB9OwogIH0KfQoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgc2V0OiBzZXQsCiAgY2xlYXI6IGNsZWFyCn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGhpcy1udW1iZXItdmFsdWUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90aGlzLW51bWJlci12YWx1ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIik7CgovLyBgdGhpc051bWJlclZhbHVlYCBhYnN0cmFjdCBvcGVyYXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdGhpc251bWJlcnZhbHVlCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnbnVtYmVyJyAmJiBjbGFzc29mKHZhbHVlKSAhPSAnTnVtYmVyJykgewogICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvcnJlY3QgaW52b2NhdGlvbicpOwogIH0KICByZXR1cm4gK3ZhbHVlOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW50ZWdlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci5qcyIpOwoKdmFyIG1heCA9IE1hdGgubWF4Owp2YXIgbWluID0gTWF0aC5taW47CgovLyBIZWxwZXIgZm9yIGEgcG9wdWxhciByZXBlYXRpbmcgY2FzZSBvZiB0aGUgc3BlYzoKLy8gTGV0IGludGVnZXIgYmUgPyBUb0ludGVnZXIoaW5kZXgpLgovLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihpbnRlZ2VyLCBsZW5ndGgpLgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7CiAgdmFyIGludGVnZXIgPSB0b0ludGVnZXIoaW5kZXgpOwogIHJldHVybiBpbnRlZ2VyIDwgMCA/IG1heChpbnRlZ2VyICsgbGVuZ3RoLCAwKSA6IG1pbihpbnRlZ2VyLCBsZW5ndGgpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW50ZWdlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKCi8vIGBUb0luZGV4YCBhYnN0cmFjdCBvcGVyYXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9pbmRleAptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIGlmIChpdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDsKICB2YXIgbnVtYmVyID0gdG9JbnRlZ2VyKGl0KTsKICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgobnVtYmVyKTsKICBpZiAobnVtYmVyICE9PSBsZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCBvciBpbmRleCcpOwogIHJldHVybiBsZW5ndGg7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKLy8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3MKdmFyIEluZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzIik7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIHJldHVybiBJbmRleGVkT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoaXQpKTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7Cgp2YXIgY2VpbCA9IE1hdGguY2VpbDsKdmFyIGZsb29yID0gTWF0aC5mbG9vcjsKCi8vIGBUb0ludGVnZXJgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2ludGVnZXIKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHsKICByZXR1cm4gaXNOYU4oYXJndW1lbnQgPSArYXJndW1lbnQpID8gMCA6IChhcmd1bWVudCA+IDAgPyBmbG9vciA6IGNlaWwpKGFyZ3VtZW50KTsKfTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIik7Cgp2YXIgbWluID0gTWF0aC5taW47CgovLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2xlbmd0aAptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkgewogIHJldHVybiBhcmd1bWVudCA+IDAgPyBtaW4odG9JbnRlZ2VyKGFyZ3VtZW50KSwgMHgxRkZGRkZGRkZGRkZGRikgOiAwOyAvLyAyICoqIDUzIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxCn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7CgovLyBgVG9PYmplY3RgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b29iamVjdAptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkgewogIHJldHVybiBPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9mZnNldC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vZmZzZXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgdG9Qb3NpdGl2ZUludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlci5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIEJZVEVTKSB7CiAgdmFyIG9mZnNldCA9IHRvUG9zaXRpdmVJbnRlZ2VyKGl0KTsKICBpZiAob2Zmc2V0ICUgQllURVMpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG9mZnNldCcpOwogIHJldHVybiBvZmZzZXQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXIuanMiKTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CiAgdmFyIHJlc3VsdCA9IHRvSW50ZWdlcihpdCk7CiAgaWYgKHJlc3VsdCA8IDApIHRocm93IFJhbmdlRXJyb3IoIlRoZSBhcmd1bWVudCBjYW4ndCBiZSBsZXNzIHRoYW4gMCIpOwogIHJldHVybiByZXN1bHQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwoKLy8gYFRvUHJpbWl0aXZlYCBhYnN0cmFjdCBvcGVyYXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmUKLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2UKLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmcKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIFBSRUZFUlJFRF9TVFJJTkcpIHsKICBpZiAoIWlzT2JqZWN0KGlucHV0KSkgcmV0dXJuIGlucHV0OwogIHZhciBmbiwgdmFsOwogIGlmIChQUkVGRVJSRURfU1RSSU5HICYmIHR5cGVvZiAoZm4gPSBpbnB1dC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsOwogIGlmICh0eXBlb2YgKGZuID0gaW5wdXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsOwogIGlmICghUFJFRkVSUkVEX1NUUklORyAmJiB0eXBlb2YgKGZuID0gaW5wdXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaW5wdXQpKSkgcmV0dXJuIHZhbDsKICB0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKdmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7CnZhciB0ZXN0ID0ge307Cgp0ZXN0W1RPX1NUUklOR19UQUddID0gJ3onOwoKbW9kdWxlLmV4cG9ydHMgPSBTdHJpbmcodGVzdCkgPT09ICdbb2JqZWN0IHpdJzsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIFRZUEVEX0FSUkFZU19DT05TVFJVQ1RPUlNfUkVRVUlSRVNfV1JBUFBFUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXlzLWNvbnN0cnVjdG9ycy1yZXF1aXJlcy13cmFwcGVycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXlzLWNvbnN0cnVjdG9ycy1yZXF1aXJlcy13cmFwcGVycy5qcyIpOwp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7CnZhciBBcnJheUJ1ZmZlck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci5qcyIpOwp2YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiKTsKdmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKdmFyIHRvSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4LmpzIik7CnZhciB0b09mZnNldCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vZmZzZXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9mZnNldC5qcyIpOwp2YXIgdG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanMiKTsKdmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiKTsKdmFyIHNldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMiKS5mOwp2YXIgdHlwZWRBcnJheUZyb20gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktZnJvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXktZnJvbS5qcyIpOwp2YXIgZm9yRWFjaCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLmZvckVhY2g7CnZhciBzZXRTcGVjaWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC1zcGVjaWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiKTsKdmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIik7CnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzIik7Cgp2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0Owp2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0Owp2YXIgbmF0aXZlRGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mOwp2YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7CnZhciByb3VuZCA9IE1hdGgucm91bmQ7CnZhciBSYW5nZUVycm9yID0gZ2xvYmFsLlJhbmdlRXJyb3I7CnZhciBBcnJheUJ1ZmZlciA9IEFycmF5QnVmZmVyTW9kdWxlLkFycmF5QnVmZmVyOwp2YXIgRGF0YVZpZXcgPSBBcnJheUJ1ZmZlck1vZHVsZS5EYXRhVmlldzsKdmFyIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLk5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1M7CnZhciBUWVBFRF9BUlJBWV9UQUcgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLlRZUEVEX0FSUkFZX1RBRzsKdmFyIFR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLlR5cGVkQXJyYXk7CnZhciBUeXBlZEFycmF5UHJvdG90eXBlID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5UeXBlZEFycmF5UHJvdG90eXBlOwp2YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjsKdmFyIGlzVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuaXNUeXBlZEFycmF5Owp2YXIgQllURVNfUEVSX0VMRU1FTlQgPSAnQllURVNfUEVSX0VMRU1FTlQnOwp2YXIgV1JPTkdfTEVOR1RIID0gJ1dyb25nIGxlbmd0aCc7Cgp2YXIgZnJvbUxpc3QgPSBmdW5jdGlvbiAoQywgbGlzdCkgewogIHZhciBpbmRleCA9IDA7CiAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoOwogIHZhciByZXN1bHQgPSBuZXcgKGFUeXBlZEFycmF5Q29uc3RydWN0b3IoQykpKGxlbmd0aCk7CiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSByZXN1bHRbaW5kZXhdID0gbGlzdFtpbmRleCsrXTsKICByZXR1cm4gcmVzdWx0Owp9OwoKdmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uIChpdCwga2V5KSB7CiAgbmF0aXZlRGVmaW5lUHJvcGVydHkoaXQsIGtleSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpW2tleV07CiAgfSB9KTsKfTsKCnZhciBpc0FycmF5QnVmZmVyID0gZnVuY3Rpb24gKGl0KSB7CiAgdmFyIGtsYXNzOwogIHJldHVybiBpdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IChrbGFzcyA9IGNsYXNzb2YoaXQpKSA9PSAnQXJyYXlCdWZmZXInIHx8IGtsYXNzID09ICdTaGFyZWRBcnJheUJ1ZmZlcic7Cn07Cgp2YXIgaXNUeXBlZEFycmF5SW5kZXggPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsKICByZXR1cm4gaXNUeXBlZEFycmF5KHRhcmdldCkKICAgICYmIHR5cGVvZiBrZXkgIT0gJ3N5bWJvbCcKICAgICYmIGtleSBpbiB0YXJnZXQKICAgICYmIFN0cmluZygra2V5KSA9PSBTdHJpbmcoa2V5KTsKfTsKCnZhciB3cmFwcGVkR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSB7CiAgcmV0dXJuIGlzVHlwZWRBcnJheUluZGV4KHRhcmdldCwga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSkKICAgID8gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDIsIHRhcmdldFtrZXldKQogICAgOiBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpOwp9OwoKdmFyIHdyYXBwZWREZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKSB7CiAgaWYgKGlzVHlwZWRBcnJheUluZGV4KHRhcmdldCwga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSkKICAgICYmIGlzT2JqZWN0KGRlc2NyaXB0b3IpCiAgICAmJiBoYXMoZGVzY3JpcHRvciwgJ3ZhbHVlJykKICAgICYmICFoYXMoZGVzY3JpcHRvciwgJ2dldCcpCiAgICAmJiAhaGFzKGRlc2NyaXB0b3IsICdzZXQnKQogICAgLy8gVE9ETzogYWRkIHZhbGlkYXRpb24gZGVzY3JpcHRvciB3L28gY2FsbGluZyBhY2Nlc3NvcnMKICAgICYmICFkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZQogICAgJiYgKCFoYXMoZGVzY3JpcHRvciwgJ3dyaXRhYmxlJykgfHwgZGVzY3JpcHRvci53cml0YWJsZSkKICAgICYmICghaGFzKGRlc2NyaXB0b3IsICdlbnVtZXJhYmxlJykgfHwgZGVzY3JpcHRvci5lbnVtZXJhYmxlKQogICkgewogICAgdGFyZ2V0W2tleV0gPSBkZXNjcmlwdG9yLnZhbHVlOwogICAgcmV0dXJuIHRhcmdldDsKICB9IHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcik7Cn07CgppZiAoREVTQ1JJUFRPUlMpIHsKICBpZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MpIHsKICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mID0gd3JhcHBlZEdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKICAgIGRlZmluZVByb3BlcnR5TW9kdWxlLmYgPSB3cmFwcGVkRGVmaW5lUHJvcGVydHk7CiAgICBhZGRHZXR0ZXIoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2J1ZmZlcicpOwogICAgYWRkR2V0dGVyKFR5cGVkQXJyYXlQcm90b3R5cGUsICdieXRlT2Zmc2V0Jyk7CiAgICBhZGRHZXR0ZXIoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2J5dGVMZW5ndGgnKTsKICAgIGFkZEdldHRlcihUeXBlZEFycmF5UHJvdG90eXBlLCAnbGVuZ3RoJyk7CiAgfQoKICAkKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB9LCB7CiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IHdyYXBwZWRHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsCiAgICBkZWZpbmVQcm9wZXJ0eTogd3JhcHBlZERlZmluZVByb3BlcnR5CiAgfSk7CgogIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRZUEUsIHdyYXBwZXIsIENMQU1QRUQpIHsKICAgIHZhciBCWVRFUyA9IFRZUEUubWF0Y2goL1xkKyQvKVswXSAvIDg7CiAgICB2YXIgQ09OU1RSVUNUT1JfTkFNRSA9IFRZUEUgKyAoQ0xBTVBFRCA/ICdDbGFtcGVkJyA6ICcnKSArICdBcnJheSc7CiAgICB2YXIgR0VUVEVSID0gJ2dldCcgKyBUWVBFOwogICAgdmFyIFNFVFRFUiA9ICdzZXQnICsgVFlQRTsKICAgIHZhciBOYXRpdmVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQ09OU1RSVUNUT1JfTkFNRV07CiAgICB2YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yOwogICAgdmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSA9IFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiBUeXBlZEFycmF5Q29uc3RydWN0b3IucHJvdG90eXBlOwogICAgdmFyIGV4cG9ydGVkID0ge307CgogICAgdmFyIGdldHRlciA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCkgewogICAgICB2YXIgZGF0YSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7CiAgICAgIHJldHVybiBkYXRhLnZpZXdbR0VUVEVSXShpbmRleCAqIEJZVEVTICsgZGF0YS5ieXRlT2Zmc2V0LCB0cnVlKTsKICAgIH07CgogICAgdmFyIHNldHRlciA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCwgdmFsdWUpIHsKICAgICAgdmFyIGRhdGEgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpOwogICAgICBpZiAoQ0xBTVBFRCkgdmFsdWUgPSAodmFsdWUgPSByb3VuZCh2YWx1ZSkpIDwgMCA/IDAgOiB2YWx1ZSA+IDB4RkYgPyAweEZGIDogdmFsdWUgJiAweEZGOwogICAgICBkYXRhLnZpZXdbU0VUVEVSXShpbmRleCAqIEJZVEVTICsgZGF0YS5ieXRlT2Zmc2V0LCB2YWx1ZSwgdHJ1ZSk7CiAgICB9OwoKICAgIHZhciBhZGRFbGVtZW50ID0gZnVuY3Rpb24gKHRoYXQsIGluZGV4KSB7CiAgICAgIG5hdGl2ZURlZmluZVByb3BlcnR5KHRoYXQsIGluZGV4LCB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gZ2V0dGVyKHRoaXMsIGluZGV4KTsKICAgICAgICB9LAogICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gc2V0dGVyKHRoaXMsIGluZGV4LCB2YWx1ZSk7CiAgICAgICAgfSwKICAgICAgICBlbnVtZXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgfTsKCiAgICBpZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MpIHsKICAgICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgZGF0YSwgb2Zmc2V0LCAkbGVuZ3RoKSB7CiAgICAgICAgYW5JbnN0YW5jZSh0aGF0LCBUeXBlZEFycmF5Q29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpOwogICAgICAgIHZhciBpbmRleCA9IDA7CiAgICAgICAgdmFyIGJ5dGVPZmZzZXQgPSAwOwogICAgICAgIHZhciBidWZmZXIsIGJ5dGVMZW5ndGgsIGxlbmd0aDsKICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7CiAgICAgICAgICBsZW5ndGggPSB0b0luZGV4KGRhdGEpOwogICAgICAgICAgYnl0ZUxlbmd0aCA9IGxlbmd0aCAqIEJZVEVTOwogICAgICAgICAgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVMZW5ndGgpOwogICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheUJ1ZmZlcihkYXRhKSkgewogICAgICAgICAgYnVmZmVyID0gZGF0YTsKICAgICAgICAgIGJ5dGVPZmZzZXQgPSB0b09mZnNldChvZmZzZXQsIEJZVEVTKTsKICAgICAgICAgIHZhciAkbGVuID0gZGF0YS5ieXRlTGVuZ3RoOwogICAgICAgICAgaWYgKCRsZW5ndGggPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoJGxlbiAlIEJZVEVTKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7CiAgICAgICAgICAgIGJ5dGVMZW5ndGggPSAkbGVuIC0gYnl0ZU9mZnNldDsKICAgICAgICAgICAgaWYgKGJ5dGVMZW5ndGggPCAwKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBieXRlTGVuZ3RoID0gdG9MZW5ndGgoJGxlbmd0aCkgKiBCWVRFUzsKICAgICAgICAgICAgaWYgKGJ5dGVMZW5ndGggKyBieXRlT2Zmc2V0ID4gJGxlbikgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpOwogICAgICAgICAgfQogICAgICAgICAgbGVuZ3RoID0gYnl0ZUxlbmd0aCAvIEJZVEVTOwogICAgICAgIH0gZWxzZSBpZiAoaXNUeXBlZEFycmF5KGRhdGEpKSB7CiAgICAgICAgICByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHR5cGVkQXJyYXlGcm9tLmNhbGwoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTsKICAgICAgICB9CiAgICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7CiAgICAgICAgICBidWZmZXI6IGJ1ZmZlciwKICAgICAgICAgIGJ5dGVPZmZzZXQ6IGJ5dGVPZmZzZXQsCiAgICAgICAgICBieXRlTGVuZ3RoOiBieXRlTGVuZ3RoLAogICAgICAgICAgbGVuZ3RoOiBsZW5ndGgsCiAgICAgICAgICB2aWV3OiBuZXcgRGF0YVZpZXcoYnVmZmVyKQogICAgICAgIH0pOwogICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkgYWRkRWxlbWVudCh0aGF0LCBpbmRleCsrKTsKICAgICAgfSk7CgogICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHNldFByb3RvdHlwZU9mKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgVHlwZWRBcnJheSk7CiAgICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSA9IFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoVHlwZWRBcnJheVByb3RvdHlwZSk7CiAgICB9IGVsc2UgaWYgKFRZUEVEX0FSUkFZU19DT05TVFJVQ1RPUlNfUkVRVUlSRVNfV1JBUFBFUlMpIHsKICAgICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAoZHVtbXksIGRhdGEsIHR5cGVkQXJyYXlPZmZzZXQsICRsZW5ndGgpIHsKICAgICAgICBhbkluc3RhbmNlKGR1bW15LCBUeXBlZEFycmF5Q29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpOwogICAgICAgIHJldHVybiBpbmhlcml0SWZSZXF1aXJlZChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSByZXR1cm4gbmV3IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0b0luZGV4KGRhdGEpKTsKICAgICAgICAgIGlmIChpc0FycmF5QnVmZmVyKGRhdGEpKSByZXR1cm4gJGxlbmd0aCAhPT0gdW5kZWZpbmVkCiAgICAgICAgICAgID8gbmV3IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihkYXRhLCB0b09mZnNldCh0eXBlZEFycmF5T2Zmc2V0LCBCWVRFUyksICRsZW5ndGgpCiAgICAgICAgICAgIDogdHlwZWRBcnJheU9mZnNldCAhPT0gdW5kZWZpbmVkCiAgICAgICAgICAgICAgPyBuZXcgTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yKGRhdGEsIHRvT2Zmc2V0KHR5cGVkQXJyYXlPZmZzZXQsIEJZVEVTKSkKICAgICAgICAgICAgICA6IG5ldyBOYXRpdmVUeXBlZEFycmF5Q29uc3RydWN0b3IoZGF0YSk7CiAgICAgICAgICBpZiAoaXNUeXBlZEFycmF5KGRhdGEpKSByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTsKICAgICAgICAgIHJldHVybiB0eXBlZEFycmF5RnJvbS5jYWxsKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgZGF0YSk7CiAgICAgICAgfSgpLCBkdW1teSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yKTsKICAgICAgfSk7CgogICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHNldFByb3RvdHlwZU9mKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgVHlwZWRBcnJheSk7CiAgICAgIGZvckVhY2goZ2V0T3duUHJvcGVydHlOYW1lcyhOYXRpdmVUeXBlZEFycmF5Q29uc3RydWN0b3IpLCBmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgaWYgKCEoa2V5IGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcikpIHsKICAgICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShUeXBlZEFycmF5Q29uc3RydWN0b3IsIGtleSwgTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yW2tleV0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGU7CiAgICB9CgogICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZS5jb25zdHJ1Y3RvciAhPT0gVHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7CiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcik7CiAgICB9CgogICAgaWYgKFRZUEVEX0FSUkFZX1RBRykgewogICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlLCBUWVBFRF9BUlJBWV9UQUcsIENPTlNUUlVDVE9SX05BTUUpOwogICAgfQoKICAgIGV4cG9ydGVkW0NPTlNUUlVDVE9SX05BTUVdID0gVHlwZWRBcnJheUNvbnN0cnVjdG9yOwoKICAgICQoewogICAgICBnbG9iYWw6IHRydWUsIGZvcmNlZDogVHlwZWRBcnJheUNvbnN0cnVjdG9yICE9IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3Rvciwgc2hhbTogIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MKICAgIH0sIGV4cG9ydGVkKTsKCiAgICBpZiAoIShCWVRFU19QRVJfRUxFTUVOVCBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3IpKSB7CiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShUeXBlZEFycmF5Q29uc3RydWN0b3IsIEJZVEVTX1BFUl9FTEVNRU5ULCBCWVRFUyk7CiAgICB9CgogICAgaWYgKCEoQllURVNfUEVSX0VMRU1FTlQgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlKSkgewogICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlLCBCWVRFU19QRVJfRUxFTUVOVCwgQllURVMpOwogICAgfQoKICAgIHNldFNwZWNpZXMoQ09OU1RSVUNUT1JfTkFNRSk7CiAgfTsKfSBlbHNlIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9OwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWZyb20uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWZyb20uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIpOwp2YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzIik7CnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzIik7CnZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMiKS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKHNvdXJjZSAvKiAsIG1hcGZuLCB0aGlzQXJnICovKSB7CiAgdmFyIE8gPSB0b09iamVjdChzb3VyY2UpOwogIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogIHZhciBtYXBmbiA9IGFyZ3VtZW50c0xlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7CiAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkOwogIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pOwogIHZhciBpLCBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3IsIG5leHQ7CiAgaWYgKGl0ZXJhdG9yTWV0aG9kICE9IHVuZGVmaW5lZCAmJiAhaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkgewogICAgaXRlcmF0b3IgPSBpdGVyYXRvck1ldGhvZC5jYWxsKE8pOwogICAgbmV4dCA9IGl0ZXJhdG9yLm5leHQ7CiAgICBPID0gW107CiAgICB3aGlsZSAoIShzdGVwID0gbmV4dC5jYWxsKGl0ZXJhdG9yKSkuZG9uZSkgewogICAgICBPLnB1c2goc3RlcC52YWx1ZSk7CiAgICB9CiAgfQogIGlmIChtYXBwaW5nICYmIGFyZ3VtZW50c0xlbmd0aCA+IDIpIHsKICAgIG1hcGZuID0gYmluZChtYXBmbiwgYXJndW1lbnRzWzJdLCAyKTsKICB9CiAgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpOwogIHJlc3VsdCA9IG5ldyAoYVR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0aGlzKSkobGVuZ3RoKTsKICBmb3IgKGkgPSAwOyBsZW5ndGggPiBpOyBpKyspIHsKICAgIHJlc3VsdFtpXSA9IG1hcHBpbmcgPyBtYXBmbihPW2ldLCBpKSA6IE9baV07CiAgfQogIHJldHVybiByZXN1bHQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXlzLWNvbnN0cnVjdG9ycy1yZXF1aXJlcy13cmFwcGVycy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXlzLWNvbnN0cnVjdG9ycy1yZXF1aXJlcy13cmFwcGVycy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovKiBlc2xpbnQtZGlzYWJsZSBuby1uZXcgKi8KdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiKTsKdmFyIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpLk5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1M7Cgp2YXIgQXJyYXlCdWZmZXIgPSBnbG9iYWwuQXJyYXlCdWZmZXI7CnZhciBJbnQ4QXJyYXkgPSBnbG9iYWwuSW50OEFycmF5OwoKbW9kdWxlLmV4cG9ydHMgPSAhTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB8fCAhZmFpbHMoZnVuY3Rpb24gKCkgewogIEludDhBcnJheSgxKTsKfSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHsKICBuZXcgSW50OEFycmF5KC0xKTsKfSkgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHsKICBuZXcgSW50OEFycmF5KCk7CiAgbmV3IEludDhBcnJheShudWxsKTsKICBuZXcgSW50OEFycmF5KDEuNSk7CiAgbmV3IEludDhBcnJheShpdGVyYWJsZSk7Cn0sIHRydWUpIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHsKICAvLyBTYWZhcmkgKDExKykgYnVnIC0gYSByZWFzb24gd2h5IGV2ZW4gU2FmYXJpIDEzIHNob3VsZCBsb2FkIGEgdHlwZWQgYXJyYXkgcG9seWZpbGwKICByZXR1cm4gbmV3IEludDhBcnJheShuZXcgQXJyYXlCdWZmZXIoMiksIDEsIHVuZGVmaW5lZCkubGVuZ3RoICE9PSAxOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCnZhciBpZCA9IDA7CnZhciBwb3N0Zml4ID0gTWF0aC5yYW5kb20oKTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkgewogIHJldHVybiAnU3ltYm9sKCcgKyBTdHJpbmcoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSkgKyAnKV8nICsgKCsraWQgKyBwb3N0Zml4KS50b1N0cmluZygzNik7Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIE5BVElWRV9TWU1CT0wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbC5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmCiAgJiYgIVN5bWJvbC5zaGFtCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmCiAgJiYgdHlwZW9mIFN5bWJvbCgpID09ICdzeW1ib2wnOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZXItYWdlbnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZXItYWdlbnQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKCm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignbmF2aWdhdG9yJywgJ3VzZXJBZ2VudCcpIHx8ICcnOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Y4LXZlcnNpb24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Y4LXZlcnNpb24uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgdXNlckFnZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3VzZXItYWdlbnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZXItYWdlbnQuanMiKTsKCnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7CnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9uczsKdmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjg7CnZhciBtYXRjaCwgdmVyc2lvbjsKCmlmICh2OCkgewogIG1hdGNoID0gdjguc3BsaXQoJy4nKTsKICB2ZXJzaW9uID0gbWF0Y2hbMF0gKyBtYXRjaFsxXTsKfSBlbHNlIGlmICh1c2VyQWdlbnQpIHsKICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvRWRnZVwvKFxkKykvKTsKICBpZiAoIW1hdGNoIHx8IG1hdGNoWzFdID49IDc0KSB7CiAgICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXC8oXGQrKS8pOwogICAgaWYgKG1hdGNoKSB2ZXJzaW9uID0gbWF0Y2hbMV07CiAgfQp9Cgptb2R1bGUuZXhwb3J0cyA9IHZlcnNpb24gJiYgK3ZlcnNpb247CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2Via2l0LXN0cmluZy1wYWQtYnVnLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlYmtpdC1zdHJpbmctcGFkLWJ1Zy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8yODAKdmFyIHVzZXJBZ2VudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91c2VyLWFnZW50ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91c2VyLWFnZW50LmpzIik7CgovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby11bnNhZmUtcmVnZXgKbW9kdWxlLmV4cG9ydHMgPSAvVmVyc2lvblwvMTBcLlxkKyhcLlxkKyk/KCBNb2JpbGVcL1x3Kyk/IFNhZmFyaVwvLy50ZXN0KHVzZXJBZ2VudCk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIik7CnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIHVpZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91aWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qcyIpOwp2YXIgTkFUSVZFX1NZTUJPTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtc3ltYm9sLmpzIik7CnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiKTsKCnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpOwp2YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDsKdmFyIGNyZWF0ZVdlbGxLbm93blN5bWJvbCA9IFVTRV9TWU1CT0xfQVNfVUlEID8gU3ltYm9sIDogdWlkOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkgewogIGlmICghaGFzKFdlbGxLbm93blN5bWJvbHNTdG9yZSwgbmFtZSkpIHsKICAgIGlmIChOQVRJVkVfU1lNQk9MICYmIGhhcyhTeW1ib2wsIG5hbWUpKSBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBTeW1ib2xbbmFtZV07CiAgICBlbHNlIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXSA9IGNyZWF0ZVdlbGxLbm93blN5bWJvbCgnU3ltYm9sLicgKyBuYW1lKTsKICB9IHJldHVybiBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV07Cn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93aGl0ZXNwYWNlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCi8vIGEgc3RyaW5nIG9mIGFsbCB2YWxpZCB1bmljb2RlIHdoaXRlc3BhY2VzCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuCm1vZHVsZS5leHBvcnRzID0gJ1x1MDAwOVx1MDAwQVx1MDAwQlx1MDAwQ1x1MDAwRFx1MDAyMFx1MDBBMFx1MTY4MFx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwQVx1MjAyRlx1MjA1Rlx1MzAwMFx1MjAyOFx1MjAyOVx1RkVGRic7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd3JhcHBlZC13ZWxsLWtub3duLXN5bWJvbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd3JhcHBlZC13ZWxsLWtub3duLXN5bWJvbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKZXhwb3J0cy5mID0gd2VsbEtub3duU3ltYm9sOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuY29uc3RydWN0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuY29uc3RydWN0b3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBhcnJheUJ1ZmZlck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci5qcyIpOwp2YXIgc2V0U3BlY2llcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtc3BlY2llcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXNwZWNpZXMuanMiKTsKCnZhciBBUlJBWV9CVUZGRVIgPSAnQXJyYXlCdWZmZXInOwp2YXIgQXJyYXlCdWZmZXIgPSBhcnJheUJ1ZmZlck1vZHVsZVtBUlJBWV9CVUZGRVJdOwp2YXIgTmF0aXZlQXJyYXlCdWZmZXIgPSBnbG9iYWxbQVJSQVlfQlVGRkVSXTsKCi8vIGBBcnJheUJ1ZmZlcmAgY29uc3RydWN0b3IKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXlidWZmZXItY29uc3RydWN0b3IKJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiBOYXRpdmVBcnJheUJ1ZmZlciAhPT0gQXJyYXlCdWZmZXIgfSwgewogIEFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcgp9KTsKCnNldFNwZWNpZXMoQVJSQVlfQlVGRkVSKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLmlzLXZpZXcuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LWJ1ZmZlci5pcy12aWV3LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7Cgp2YXIgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyA9IEFycmF5QnVmZmVyVmlld0NvcmUuTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUzsKCi8vIGBBcnJheUJ1ZmZlci5pc1ZpZXdgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheWJ1ZmZlci5pc3ZpZXcKJCh7IHRhcmdldDogJ0FycmF5QnVmZmVyJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB9LCB7CiAgaXNWaWV3OiBBcnJheUJ1ZmZlclZpZXdDb3JlLmlzVmlldwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLnNsaWNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLnNsaWNlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgQXJyYXlCdWZmZXJNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXIuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciB0b0Fic29sdXRlSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiKTsKCnZhciBBcnJheUJ1ZmZlciA9IEFycmF5QnVmZmVyTW9kdWxlLkFycmF5QnVmZmVyOwp2YXIgRGF0YVZpZXcgPSBBcnJheUJ1ZmZlck1vZHVsZS5EYXRhVmlldzsKdmFyIG5hdGl2ZUFycmF5QnVmZmVyU2xpY2UgPSBBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2U7Cgp2YXIgSU5DT1JSRUNUX1NMSUNFID0gZmFpbHMoZnVuY3Rpb24gKCkgewogIHJldHVybiAhbmV3IEFycmF5QnVmZmVyKDIpLnNsaWNlKDEsIHVuZGVmaW5lZCkuYnl0ZUxlbmd0aDsKfSk7CgovLyBgQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXlidWZmZXIucHJvdG90eXBlLnNsaWNlCiQoeyB0YXJnZXQ6ICdBcnJheUJ1ZmZlcicsIHByb3RvOiB0cnVlLCB1bnNhZmU6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX1NMSUNFIH0sIHsKICBzbGljZTogZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkgewogICAgaWYgKG5hdGl2ZUFycmF5QnVmZmVyU2xpY2UgIT09IHVuZGVmaW5lZCAmJiBlbmQgPT09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm4gbmF0aXZlQXJyYXlCdWZmZXJTbGljZS5jYWxsKGFuT2JqZWN0KHRoaXMpLCBzdGFydCk7IC8vIEZGIGZpeAogICAgfQogICAgdmFyIGxlbmd0aCA9IGFuT2JqZWN0KHRoaXMpLmJ5dGVMZW5ndGg7CiAgICB2YXIgZmlyc3QgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbmd0aCk7CiAgICB2YXIgZmluID0gdG9BYnNvbHV0ZUluZGV4KGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kLCBsZW5ndGgpOwogICAgdmFyIHJlc3VsdCA9IG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIEFycmF5QnVmZmVyKSkodG9MZW5ndGgoZmluIC0gZmlyc3QpKTsKICAgIHZhciB2aWV3U291cmNlID0gbmV3IERhdGFWaWV3KHRoaXMpOwogICAgdmFyIHZpZXdUYXJnZXQgPSBuZXcgRGF0YVZpZXcocmVzdWx0KTsKICAgIHZhciBpbmRleCA9IDA7CiAgICB3aGlsZSAoZmlyc3QgPCBmaW4pIHsKICAgICAgdmlld1RhcmdldC5zZXRVaW50OChpbmRleCsrLCB2aWV3U291cmNlLmdldFVpbnQ4KGZpcnN0KyspKTsKICAgIH0gcmV0dXJuIHJlc3VsdDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBpc0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgY3JlYXRlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiKTsKdmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanMiKTsKdmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0LmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBWOF9WRVJTSU9OID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Y4LXZlcnNpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Y4LXZlcnNpb24uanMiKTsKCnZhciBJU19DT05DQVRfU1BSRUFEQUJMRSA9IHdlbGxLbm93blN5bWJvbCgnaXNDb25jYXRTcHJlYWRhYmxlJyk7CnZhciBNQVhfU0FGRV9JTlRFR0VSID0gMHgxRkZGRkZGRkZGRkZGRjsKdmFyIE1BWElNVU1fQUxMT1dFRF9JTkRFWF9FWENFRURFRCA9ICdNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWQnOwoKLy8gV2UgY2FuJ3QgdXNlIHRoaXMgZmVhdHVyZSBkZXRlY3Rpb24gaW4gVjggc2luY2UgaXQgY2F1c2VzCi8vIGRlb3B0aW1pemF0aW9uIGFuZCBzZXJpb3VzIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzkKdmFyIElTX0NPTkNBVF9TUFJFQURBQkxFX1NVUFBPUlQgPSBWOF9WRVJTSU9OID49IDUxIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgdmFyIGFycmF5ID0gW107CiAgYXJyYXlbSVNfQ09OQ0FUX1NQUkVBREFCTEVdID0gZmFsc2U7CiAgcmV0dXJuIGFycmF5LmNvbmNhdCgpWzBdICE9PSBhcnJheTsKfSk7Cgp2YXIgU1BFQ0lFU19TVVBQT1JUID0gYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnY29uY2F0Jyk7Cgp2YXIgaXNDb25jYXRTcHJlYWRhYmxlID0gZnVuY3Rpb24gKE8pIHsKICBpZiAoIWlzT2JqZWN0KE8pKSByZXR1cm4gZmFsc2U7CiAgdmFyIHNwcmVhZGFibGUgPSBPW0lTX0NPTkNBVF9TUFJFQURBQkxFXTsKICByZXR1cm4gc3ByZWFkYWJsZSAhPT0gdW5kZWZpbmVkID8gISFzcHJlYWRhYmxlIDogaXNBcnJheShPKTsKfTsKCnZhciBGT1JDRUQgPSAhSVNfQ09OQ0FUX1NQUkVBREFCTEVfU1VQUE9SVCB8fCAhU1BFQ0lFU19TVVBQT1JUOwoKLy8gYEFycmF5LnByb3RvdHlwZS5jb25jYXRgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuY29uY2F0Ci8vIHdpdGggYWRkaW5nIHN1cHBvcnQgb2YgQEBpc0NvbmNhdFNwcmVhZGFibGUgYW5kIEBAc3BlY2llcwokKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwgewogIGNvbmNhdDogZnVuY3Rpb24gY29uY2F0KGFyZykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpOwogICAgdmFyIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7CiAgICB2YXIgbiA9IDA7CiAgICB2YXIgaSwgaywgbGVuZ3RoLCBsZW4sIEU7CiAgICBmb3IgKGkgPSAtMSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIEUgPSBpID09PSAtMSA/IE8gOiBhcmd1bWVudHNbaV07CiAgICAgIGlmIChpc0NvbmNhdFNwcmVhZGFibGUoRSkpIHsKICAgICAgICBsZW4gPSB0b0xlbmd0aChFLmxlbmd0aCk7CiAgICAgICAgaWYgKG4gKyBsZW4gPiBNQVhfU0FGRV9JTlRFR0VSKSB0aHJvdyBUeXBlRXJyb3IoTUFYSU1VTV9BTExPV0VEX0lOREVYX0VYQ0VFREVEKTsKICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbGVuOyBrKyssIG4rKykgaWYgKGsgaW4gRSkgY3JlYXRlUHJvcGVydHkoQSwgbiwgRVtrXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKG4gPj0gTUFYX1NBRkVfSU5URUdFUikgdGhyb3cgVHlwZUVycm9yKE1BWElNVU1fQUxMT1dFRF9JTkRFWF9FWENFRURFRCk7CiAgICAgICAgY3JlYXRlUHJvcGVydHkoQSwgbisrLCBFKTsKICAgICAgfQogICAgfQogICAgQS5sZW5ndGggPSBuOwogICAgcmV0dXJuIEE7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29weS13aXRoaW4uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmNvcHktd2l0aGluLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgY29weVdpdGhpbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1jb3B5LXdpdGhpbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktY29weS13aXRoaW4uanMiKTsKdmFyIGFkZFRvVW5zY29wYWJsZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanMiKTsKCi8vIGBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5jb3B5d2l0aGluCiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlIH0sIHsKICBjb3B5V2l0aGluOiBjb3B5V2l0aGluCn0pOwoKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXMKYWRkVG9VbnNjb3BhYmxlcygnY29weVdpdGhpbicpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5ldmVyeS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZXZlcnkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciAkZXZlcnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiKS5ldmVyeTsKdmFyIHNsb3BweUFycmF5TWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Nsb3BweS1hcnJheS1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Nsb3BweS1hcnJheS1tZXRob2QuanMiKTsKCi8vIGBBcnJheS5wcm90b3R5cGUuZXZlcnlgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZXZlcnkKJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogc2xvcHB5QXJyYXlNZXRob2QoJ2V2ZXJ5JykgfSwgewogIGV2ZXJ5OiBmdW5jdGlvbiBldmVyeShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogICAgcmV0dXJuICRldmVyeSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmlsbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWxsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmaWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWZpbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZpbGwuanMiKTsKdmFyIGFkZFRvVW5zY29wYWJsZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanMiKTsKCi8vIGBBcnJheS5wcm90b3R5cGUuZmlsbGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWxsCiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlIH0sIHsKICBmaWxsOiBmaWxsCn0pOwoKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXMKYWRkVG9VbnNjb3BhYmxlcygnZmlsbCcpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgJGZpbHRlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLmZpbHRlcjsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQuanMiKTsKCnZhciBIQVNfU1BFQ0lFU19TVVBQT1JUID0gYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnZmlsdGVyJyk7Ci8vIEVkZ2UgMTQtIGlzc3VlCnZhciBVU0VTX1RPX0xFTkdUSCA9IEhBU19TUEVDSUVTX1NVUFBPUlQgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsKICBbXS5maWx0ZXIuY2FsbCh7IGxlbmd0aDogLTEsIDA6IDEgfSwgZnVuY3Rpb24gKGl0KSB7IHRocm93IGl0OyB9KTsKfSk7CgovLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWx0ZXIKLy8gd2l0aCBhZGRpbmcgc3VwcG9ydCBvZiBAQHNwZWNpZXMKJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIUhBU19TUEVDSUVTX1NVUFBPUlQgfHwgIVVTRVNfVE9fTEVOR1RIIH0sIHsKICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogICAgcmV0dXJuICRmaWx0ZXIodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC1pbmRleC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgJGZpbmRJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLmZpbmRJbmRleDsKdmFyIGFkZFRvVW5zY29wYWJsZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanMiKTsKCnZhciBGSU5EX0lOREVYID0gJ2ZpbmRJbmRleCc7CnZhciBTS0lQU19IT0xFUyA9IHRydWU7CgovLyBTaG91bGRuJ3Qgc2tpcCBob2xlcwppZiAoRklORF9JTkRFWCBpbiBbXSkgQXJyYXkoMSlbRklORF9JTkRFWF0oZnVuY3Rpb24gKCkgeyBTS0lQU19IT0xFUyA9IGZhbHNlOyB9KTsKCi8vIGBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRpbmRleAokKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBTS0lQU19IT0xFUyB9LCB7CiAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHsKICAgIHJldHVybiAkZmluZEluZGV4KHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKICB9Cn0pOwoKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXMKYWRkVG9VbnNjb3BhYmxlcyhGSU5EX0lOREVYKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciAkZmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLmZpbmQ7CnZhciBhZGRUb1Vuc2NvcGFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIik7Cgp2YXIgRklORCA9ICdmaW5kJzsKdmFyIFNLSVBTX0hPTEVTID0gdHJ1ZTsKCi8vIFNob3VsZG4ndCBza2lwIGhvbGVzCmlmIChGSU5EIGluIFtdKSBBcnJheSgxKVtGSU5EXShmdW5jdGlvbiAoKSB7IFNLSVBTX0hPTEVTID0gZmFsc2U7IH0pOwoKLy8gYEFycmF5LnByb3RvdHlwZS5maW5kYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmQKJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogU0tJUFNfSE9MRVMgfSwgewogIGZpbmQ6IGZ1bmN0aW9uIGZpbmQoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHsKICAgIHJldHVybiAkZmluZCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CiAgfQp9KTsKCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzCmFkZFRvVW5zY29wYWJsZXMoRklORCk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQtbWFwLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mbGF0LW1hcC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGZsYXR0ZW5JbnRvQXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmxhdHRlbi1pbnRvLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mbGF0dGVuLWludG8tYXJyYXkuanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanMiKTsKCi8vIGBBcnJheS5wcm90b3R5cGUuZmxhdE1hcGAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWZsYXRNYXAKJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUgfSwgewogIGZsYXRNYXA6IGZ1bmN0aW9uIGZsYXRNYXAoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHsKICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7CiAgICB2YXIgc291cmNlTGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpOwogICAgdmFyIEE7CiAgICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7CiAgICBBID0gYXJyYXlTcGVjaWVzQ3JlYXRlKE8sIDApOwogICAgQS5sZW5ndGggPSBmbGF0dGVuSW50b0FycmF5KEEsIE8sIE8sIHNvdXJjZUxlbiwgMCwgMSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOwogICAgcmV0dXJuIEE7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmxhdC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mbGF0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmbGF0dGVuSW50b0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZsYXR0ZW4taW50by1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmxhdHRlbi1pbnRvLWFycmF5LmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKdmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIik7CnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzIik7CgovLyBgQXJyYXkucHJvdG90eXBlLmZsYXRgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1mbGF0TWFwCiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlIH0sIHsKICBmbGF0OiBmdW5jdGlvbiBmbGF0KC8qIGRlcHRoQXJnID0gMSAqLykgewogICAgdmFyIGRlcHRoQXJnID0gYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZDsKICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7CiAgICB2YXIgc291cmNlTGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpOwogICAgdmFyIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7CiAgICBBLmxlbmd0aCA9IGZsYXR0ZW5JbnRvQXJyYXkoQSwgTywgTywgc291cmNlTGVuLCAwLCBkZXB0aEFyZyA9PT0gdW5kZWZpbmVkID8gMSA6IHRvSW50ZWdlcihkZXB0aEFyZykpOwogICAgcmV0dXJuIEE7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZm9yLWVhY2guanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZvci1lYWNoLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZm9yRWFjaCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1mb3ItZWFjaCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZm9yLWVhY2guanMiKTsKCi8vIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoCiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFtdLmZvckVhY2ggIT0gZm9yRWFjaCB9LCB7CiAgZm9yRWFjaDogZm9yRWFjaAp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mcm9tLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmcm9tID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWZyb20gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZyb20uanMiKTsKdmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qcyIpOwoKdmFyIElOQ09SUkVDVF9JVEVSQVRJT04gPSAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkgewogIEFycmF5LmZyb20oaXRlcmFibGUpOwp9KTsKCi8vIGBBcnJheS5mcm9tYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbQokKHsgdGFyZ2V0OiAnQXJyYXknLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVF9JVEVSQVRJT04gfSwgewogIGZyb206IGZyb20KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICRpbmNsdWRlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiKS5pbmNsdWRlczsKdmFyIGFkZFRvVW5zY29wYWJsZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanMiKTsKCi8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXMKJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUgfSwgewogIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhlbCAvKiAsIGZyb21JbmRleCA9IDAgKi8pIHsKICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKICB9Cn0pOwoKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXMKYWRkVG9VbnNjb3BhYmxlcygnaW5jbHVkZXMnKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5kZXgtb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluZGV4LW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgJGluZGV4T2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzLmpzIikuaW5kZXhPZjsKdmFyIHNsb3BweUFycmF5TWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Nsb3BweS1hcnJheS1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Nsb3BweS1hcnJheS1tZXRob2QuanMiKTsKCnZhciBuYXRpdmVJbmRleE9mID0gW10uaW5kZXhPZjsKCnZhciBORUdBVElWRV9aRVJPID0gISFuYXRpdmVJbmRleE9mICYmIDEgLyBbMV0uaW5kZXhPZigxLCAtMCkgPCAwOwp2YXIgU0xPUFBZX01FVEhPRCA9IHNsb3BweUFycmF5TWV0aG9kKCdpbmRleE9mJyk7CgovLyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2ZgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5kZXhvZgokKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBORUdBVElWRV9aRVJPIHx8IFNMT1BQWV9NRVRIT0QgfSwgewogIGluZGV4T2Y6IGZ1bmN0aW9uIGluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCA9IDAgKi8pIHsKICAgIHJldHVybiBORUdBVElWRV9aRVJPCiAgICAgIC8vIGNvbnZlcnQgLTAgdG8gKzAKICAgICAgPyBuYXRpdmVJbmRleE9mLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgMAogICAgICA6ICRpbmRleE9mKHRoaXMsIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pcy1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXMtYXJyYXkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBpc0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIpOwoKLy8gYEFycmF5LmlzQXJyYXlgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5pc2FycmF5CiQoeyB0YXJnZXQ6ICdBcnJheScsIHN0YXQ6IHRydWUgfSwgewogIGlzQXJyYXk6IGlzQXJyYXkKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIik7CnZhciBhZGRUb1Vuc2NvcGFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIik7CnZhciBJdGVyYXRvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanMiKTsKdmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIik7CnZhciBkZWZpbmVJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvci5qcyIpOwoKdmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJzsKdmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihBUlJBWV9JVEVSQVRPUik7CgovLyBgQXJyYXkucHJvdG90eXBlLmVudHJpZXNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZW50cmllcwovLyBgQXJyYXkucHJvdG90eXBlLmtleXNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUua2V5cwovLyBgQXJyYXkucHJvdG90eXBlLnZhbHVlc2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXMKLy8gYEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQGl0ZXJhdG9yCi8vIGBDcmVhdGVBcnJheUl0ZXJhdG9yYCBpbnRlcm5hbCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtY3JlYXRlYXJyYXlpdGVyYXRvcgptb2R1bGUuZXhwb3J0cyA9IGRlZmluZUl0ZXJhdG9yKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHsKICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsKICAgIHR5cGU6IEFSUkFZX0lURVJBVE9SLAogICAgdGFyZ2V0OiB0b0luZGV4ZWRPYmplY3QoaXRlcmF0ZWQpLCAvLyB0YXJnZXQKICAgIGluZGV4OiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleAogICAga2luZDoga2luZCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBraW5kCiAgfSk7Ci8vIGAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSVhcnJheWl0ZXJhdG9ycHJvdG90eXBlJS5uZXh0Cn0sIGZ1bmN0aW9uICgpIHsKICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOwogIHZhciB0YXJnZXQgPSBzdGF0ZS50YXJnZXQ7CiAgdmFyIGtpbmQgPSBzdGF0ZS5raW5kOwogIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7CiAgaWYgKCF0YXJnZXQgfHwgaW5kZXggPj0gdGFyZ2V0Lmxlbmd0aCkgewogICAgc3RhdGUudGFyZ2V0ID0gdW5kZWZpbmVkOwogICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9OwogIH0KICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiB7IHZhbHVlOiBpbmRleCwgZG9uZTogZmFsc2UgfTsKICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IHRhcmdldFtpbmRleF0sIGRvbmU6IGZhbHNlIH07CiAgcmV0dXJuIHsgdmFsdWU6IFtpbmRleCwgdGFyZ2V0W2luZGV4XV0sIGRvbmU6IGZhbHNlIH07Cn0sICd2YWx1ZXMnKTsKCi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJQovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jcmVhdGV1bm1hcHBlZGFyZ3VtZW50c29iamVjdAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jcmVhdGVtYXBwZWRhcmd1bWVudHNvYmplY3QKSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTsKCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzCmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTsKYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7CmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuam9pbi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5qb2luLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcyIpOwp2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIpOwp2YXIgc2xvcHB5QXJyYXlNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZC5qcyIpOwoKdmFyIG5hdGl2ZUpvaW4gPSBbXS5qb2luOwoKdmFyIEVTM19TVFJJTkdTID0gSW5kZXhlZE9iamVjdCAhPSBPYmplY3Q7CnZhciBTTE9QUFlfTUVUSE9EID0gc2xvcHB5QXJyYXlNZXRob2QoJ2pvaW4nLCAnLCcpOwoKLy8gYEFycmF5LnByb3RvdHlwZS5qb2luYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmpvaW4KJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogRVMzX1NUUklOR1MgfHwgU0xPUFBZX01FVEhPRCB9LCB7CiAgam9pbjogZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpIHsKICAgIHJldHVybiBuYXRpdmVKb2luLmNhbGwodG9JbmRleGVkT2JqZWN0KHRoaXMpLCBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCA/ICcsJyA6IHNlcGFyYXRvcik7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkubGFzdC1pbmRleC1vZi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5sYXN0LWluZGV4LW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBsYXN0SW5kZXhPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1sYXN0LWluZGV4LW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1sYXN0LWluZGV4LW9mLmpzIik7CgovLyBgQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmxhc3RpbmRleG9mCiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGxhc3RJbmRleE9mICE9PSBbXS5sYXN0SW5kZXhPZiB9LCB7CiAgbGFzdEluZGV4T2Y6IGxhc3RJbmRleE9mCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXAuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgJG1hcCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLm1hcDsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQuanMiKTsKCnZhciBIQVNfU1BFQ0lFU19TVVBQT1JUID0gYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnbWFwJyk7Ci8vIEZGNDktIGlzc3VlCnZhciBVU0VTX1RPX0xFTkdUSCA9IEhBU19TUEVDSUVTX1NVUFBPUlQgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsKICBbXS5tYXAuY2FsbCh7IGxlbmd0aDogLTEsIDA6IDEgfSwgZnVuY3Rpb24gKGl0KSB7IHRocm93IGl0OyB9KTsKfSk7CgovLyBgQXJyYXkucHJvdG90eXBlLm1hcGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5tYXAKLy8gd2l0aCBhZGRpbmcgc3VwcG9ydCBvZiBAQHNwZWNpZXMKJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIUhBU19TUEVDSUVTX1NVUFBPUlQgfHwgIVVTRVNfVE9fTEVOR1RIIH0sIHsKICBtYXA6IGZ1bmN0aW9uIG1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogICAgcmV0dXJuICRtYXAodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lm9mLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5vZi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgY3JlYXRlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiKTsKCnZhciBJU05UX0dFTkVSSUMgPSBmYWlscyhmdW5jdGlvbiAoKSB7CiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfQogIHJldHVybiAhKEFycmF5Lm9mLmNhbGwoRikgaW5zdGFuY2VvZiBGKTsKfSk7CgovLyBgQXJyYXkub2ZgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5vZgovLyBXZWJLaXQgQXJyYXkub2YgaXNuJ3QgZ2VuZXJpYwokKHsgdGFyZ2V0OiAnQXJyYXknLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElTTlRfR0VORVJJQyB9LCB7CiAgb2Y6IGZ1bmN0aW9uIG9mKC8qIC4uLmFyZ3MgKi8pIHsKICAgIHZhciBpbmRleCA9IDA7CiAgICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIHZhciByZXN1bHQgPSBuZXcgKHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXkpKGFyZ3VtZW50c0xlbmd0aCk7CiAgICB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIGFyZ3VtZW50c1tpbmRleCsrXSk7CiAgICByZXN1bHQubGVuZ3RoID0gYXJndW1lbnRzTGVuZ3RoOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5yZWR1Y2UtcmlnaHQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5yZWR1Y2UtcmlnaHQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgJHJlZHVjZVJpZ2h0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXJlZHVjZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktcmVkdWNlLmpzIikucmlnaHQ7CnZhciBzbG9wcHlBcnJheU1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zbG9wcHktYXJyYXktbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zbG9wcHktYXJyYXktbWV0aG9kLmpzIik7CgovLyBgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnJlZHVjZXJpZ2h0CiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IHNsb3BweUFycmF5TWV0aG9kKCdyZWR1Y2VSaWdodCcpIH0sIHsKICByZWR1Y2VSaWdodDogZnVuY3Rpb24gcmVkdWNlUmlnaHQoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykgewogICAgcmV0dXJuICRyZWR1Y2VSaWdodCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmVkdWNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmVkdWNlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICRyZWR1Y2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktcmVkdWNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1yZWR1Y2UuanMiKS5sZWZ0Owp2YXIgc2xvcHB5QXJyYXlNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZC5qcyIpOwoKLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmVkdWNlCiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IHNsb3BweUFycmF5TWV0aG9kKCdyZWR1Y2UnKSB9LCB7CiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykgewogICAgcmV0dXJuICRyZWR1Y2UodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnJldmVyc2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmV2ZXJzZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXNBcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanMiKTsKCnZhciBuYXRpdmVSZXZlcnNlID0gW10ucmV2ZXJzZTsKdmFyIHRlc3QgPSBbMSwgMl07CgovLyBgQXJyYXkucHJvdG90eXBlLnJldmVyc2VgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmV2ZXJzZQovLyBmaXggZm9yIFNhZmFyaSAxMi4wIGJ1ZwovLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTg4Nzk0CiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFN0cmluZyh0ZXN0KSA9PT0gU3RyaW5nKHRlc3QucmV2ZXJzZSgpKSB9LCB7CiAgcmV2ZXJzZTogZnVuY3Rpb24gcmV2ZXJzZSgpIHsKICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWFzc2lnbgogICAgaWYgKGlzQXJyYXkodGhpcykpIHRoaXMubGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICByZXR1cm4gbmF0aXZlUmV2ZXJzZS5jYWxsKHRoaXMpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNsaWNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zbGljZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIik7CnZhciBpc0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIpOwp2YXIgdG9BYnNvbHV0ZUluZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKdmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanMiKTsKdmFyIGNyZWF0ZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzIik7CnZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydC5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKdmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTsKdmFyIG5hdGl2ZVNsaWNlID0gW10uc2xpY2U7CnZhciBtYXggPSBNYXRoLm1heDsKCi8vIGBBcnJheS5wcm90b3R5cGUuc2xpY2VgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc2xpY2UKLy8gZmFsbGJhY2sgZm9yIG5vdCBhcnJheS1saWtlIEVTMyBzdHJpbmdzIGFuZCBET00gb2JqZWN0cwokKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnc2xpY2UnKSB9LCB7CiAgc2xpY2U6IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpIHsKICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KHRoaXMpOwogICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTsKICAgIHZhciBrID0gdG9BYnNvbHV0ZUluZGV4KHN0YXJ0LCBsZW5ndGgpOwogICAgdmFyIGZpbiA9IHRvQWJzb2x1dGVJbmRleChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IGVuZCwgbGVuZ3RoKTsKICAgIC8vIGlubGluZSBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBmb3IgdXNhZ2UgbmF0aXZlIGBBcnJheSNzbGljZWAgd2hlcmUgaXQncyBwb3NzaWJsZQogICAgdmFyIENvbnN0cnVjdG9yLCByZXN1bHQsIG47CiAgICBpZiAoaXNBcnJheShPKSkgewogICAgICBDb25zdHJ1Y3RvciA9IE8uY29uc3RydWN0b3I7CiAgICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrCiAgICAgIGlmICh0eXBlb2YgQ29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiAoQ29uc3RydWN0b3IgPT09IEFycmF5IHx8IGlzQXJyYXkoQ29uc3RydWN0b3IucHJvdG90eXBlKSkpIHsKICAgICAgICBDb25zdHJ1Y3RvciA9IHVuZGVmaW5lZDsKICAgICAgfSBlbHNlIGlmIChpc09iamVjdChDb25zdHJ1Y3RvcikpIHsKICAgICAgICBDb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yW1NQRUNJRVNdOwogICAgICAgIGlmIChDb25zdHJ1Y3RvciA9PT0gbnVsbCkgQ29uc3RydWN0b3IgPSB1bmRlZmluZWQ7CiAgICAgIH0KICAgICAgaWYgKENvbnN0cnVjdG9yID09PSBBcnJheSB8fCBDb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuIG5hdGl2ZVNsaWNlLmNhbGwoTywgaywgZmluKTsKICAgICAgfQogICAgfQogICAgcmVzdWx0ID0gbmV3IChDb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDb25zdHJ1Y3RvcikobWF4KGZpbiAtIGssIDApKTsKICAgIGZvciAobiA9IDA7IGsgPCBmaW47IGsrKywgbisrKSBpZiAoayBpbiBPKSBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIG4sIE9ba10pOwogICAgcmVzdWx0Lmxlbmd0aCA9IG47CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNvbWUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc29tZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgJHNvbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiKS5zb21lOwp2YXIgc2xvcHB5QXJyYXlNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZC5qcyIpOwoKLy8gYEFycmF5LnByb3RvdHlwZS5zb21lYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNvbWUKJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogc2xvcHB5QXJyYXlNZXRob2QoJ3NvbWUnKSB9LCB7CiAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogICAgcmV0dXJuICRzb21lKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zb3J0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNvcnQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBzbG9wcHlBcnJheU1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zbG9wcHktYXJyYXktbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zbG9wcHktYXJyYXktbWV0aG9kLmpzIik7Cgp2YXIgdGVzdCA9IFtdOwp2YXIgbmF0aXZlU29ydCA9IHRlc3Quc29ydDsKCi8vIElFOC0KdmFyIEZBSUxTX09OX1VOREVGSU5FRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHsKICB0ZXN0LnNvcnQodW5kZWZpbmVkKTsKfSk7Ci8vIFY4IGJ1Zwp2YXIgRkFJTFNfT05fTlVMTCA9IGZhaWxzKGZ1bmN0aW9uICgpIHsKICB0ZXN0LnNvcnQobnVsbCk7Cn0pOwovLyBPbGQgV2ViS2l0CnZhciBTTE9QUFlfTUVUSE9EID0gc2xvcHB5QXJyYXlNZXRob2QoJ3NvcnQnKTsKCnZhciBGT1JDRUQgPSBGQUlMU19PTl9VTkRFRklORUQgfHwgIUZBSUxTX09OX05VTEwgfHwgU0xPUFBZX01FVEhPRDsKCi8vIGBBcnJheS5wcm90b3R5cGUuc29ydGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zb3J0CiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7CiAgc29ydDogZnVuY3Rpb24gc29ydChjb21wYXJlZm4pIHsKICAgIHJldHVybiBjb21wYXJlZm4gPT09IHVuZGVmaW5lZAogICAgICA/IG5hdGl2ZVNvcnQuY2FsbCh0b09iamVjdCh0aGlzKSkKICAgICAgOiBuYXRpdmVTb3J0LmNhbGwodG9PYmplY3QodGhpcyksIGFGdW5jdGlvbihjb21wYXJlZm4pKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zcGVjaWVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNwZWNpZXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHNldFNwZWNpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIik7CgovLyBgQXJyYXlbQEBzcGVjaWVzXWAgZ2V0dGVyCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWdldC1hcnJheS1AQHNwZWNpZXMKc2V0U3BlY2llcygnQXJyYXknKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXguanMiKTsKdmFyIHRvSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiKTsKdmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanMiKTsKdmFyIGNyZWF0ZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzIik7CnZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydC5qcyIpOwoKdmFyIG1heCA9IE1hdGgubWF4Owp2YXIgbWluID0gTWF0aC5taW47CnZhciBNQVhfU0FGRV9JTlRFR0VSID0gMHgxRkZGRkZGRkZGRkZGRjsKdmFyIE1BWElNVU1fQUxMT1dFRF9MRU5HVEhfRVhDRUVERUQgPSAnTWF4aW11bSBhbGxvd2VkIGxlbmd0aCBleGNlZWRlZCc7CgovLyBgQXJyYXkucHJvdG90eXBlLnNwbGljZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zcGxpY2UKLy8gd2l0aCBhZGRpbmcgc3VwcG9ydCBvZiBAQHNwZWNpZXMKJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIWFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQoJ3NwbGljZScpIH0sIHsKICBzcGxpY2U6IGZ1bmN0aW9uIHNwbGljZShzdGFydCwgZGVsZXRlQ291bnQgLyogLCAuLi5pdGVtcyAqLykgewogICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTsKICAgIHZhciBsZW4gPSB0b0xlbmd0aChPLmxlbmd0aCk7CiAgICB2YXIgYWN0dWFsU3RhcnQgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbik7CiAgICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIHZhciBpbnNlcnRDb3VudCwgYWN0dWFsRGVsZXRlQ291bnQsIEEsIGssIGZyb20sIHRvOwogICAgaWYgKGFyZ3VtZW50c0xlbmd0aCA9PT0gMCkgewogICAgICBpbnNlcnRDb3VudCA9IGFjdHVhbERlbGV0ZUNvdW50ID0gMDsKICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzTGVuZ3RoID09PSAxKSB7CiAgICAgIGluc2VydENvdW50ID0gMDsKICAgICAgYWN0dWFsRGVsZXRlQ291bnQgPSBsZW4gLSBhY3R1YWxTdGFydDsKICAgIH0gZWxzZSB7CiAgICAgIGluc2VydENvdW50ID0gYXJndW1lbnRzTGVuZ3RoIC0gMjsKICAgICAgYWN0dWFsRGVsZXRlQ291bnQgPSBtaW4obWF4KHRvSW50ZWdlcihkZWxldGVDb3VudCksIDApLCBsZW4gLSBhY3R1YWxTdGFydCk7CiAgICB9CiAgICBpZiAobGVuICsgaW5zZXJ0Q291bnQgLSBhY3R1YWxEZWxldGVDb3VudCA+IE1BWF9TQUZFX0lOVEVHRVIpIHsKICAgICAgdGhyb3cgVHlwZUVycm9yKE1BWElNVU1fQUxMT1dFRF9MRU5HVEhfRVhDRUVERUQpOwogICAgfQogICAgQSA9IGFycmF5U3BlY2llc0NyZWF0ZShPLCBhY3R1YWxEZWxldGVDb3VudCk7CiAgICBmb3IgKGsgPSAwOyBrIDwgYWN0dWFsRGVsZXRlQ291bnQ7IGsrKykgewogICAgICBmcm9tID0gYWN0dWFsU3RhcnQgKyBrOwogICAgICBpZiAoZnJvbSBpbiBPKSBjcmVhdGVQcm9wZXJ0eShBLCBrLCBPW2Zyb21dKTsKICAgIH0KICAgIEEubGVuZ3RoID0gYWN0dWFsRGVsZXRlQ291bnQ7CiAgICBpZiAoaW5zZXJ0Q291bnQgPCBhY3R1YWxEZWxldGVDb3VudCkgewogICAgICBmb3IgKGsgPSBhY3R1YWxTdGFydDsgayA8IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50OyBrKyspIHsKICAgICAgICBmcm9tID0gayArIGFjdHVhbERlbGV0ZUNvdW50OwogICAgICAgIHRvID0gayArIGluc2VydENvdW50OwogICAgICAgIGlmIChmcm9tIGluIE8pIE9bdG9dID0gT1tmcm9tXTsKICAgICAgICBlbHNlIGRlbGV0ZSBPW3RvXTsKICAgICAgfQogICAgICBmb3IgKGsgPSBsZW47IGsgPiBsZW4gLSBhY3R1YWxEZWxldGVDb3VudCArIGluc2VydENvdW50OyBrLS0pIGRlbGV0ZSBPW2sgLSAxXTsKICAgIH0gZWxzZSBpZiAoaW5zZXJ0Q291bnQgPiBhY3R1YWxEZWxldGVDb3VudCkgewogICAgICBmb3IgKGsgPSBsZW4gLSBhY3R1YWxEZWxldGVDb3VudDsgayA+IGFjdHVhbFN0YXJ0OyBrLS0pIHsKICAgICAgICBmcm9tID0gayArIGFjdHVhbERlbGV0ZUNvdW50IC0gMTsKICAgICAgICB0byA9IGsgKyBpbnNlcnRDb3VudCAtIDE7CiAgICAgICAgaWYgKGZyb20gaW4gTykgT1t0b10gPSBPW2Zyb21dOwogICAgICAgIGVsc2UgZGVsZXRlIE9bdG9dOwogICAgICB9CiAgICB9CiAgICBmb3IgKGsgPSAwOyBrIDwgaW5zZXJ0Q291bnQ7IGsrKykgewogICAgICBPW2sgKyBhY3R1YWxTdGFydF0gPSBhcmd1bWVudHNbayArIDJdOwogICAgfQogICAgTy5sZW5ndGggPSBsZW4gLSBhY3R1YWxEZWxldGVDb3VudCArIGluc2VydENvdW50OwogICAgcmV0dXJuIEE7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkudW5zY29wYWJsZXMuZmxhdC1tYXAuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnVuc2NvcGFibGVzLmZsYXQtbWFwLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyB0aGlzIG1ldGhvZCB3YXMgYWRkZWQgdG8gdW5zY29wYWJsZXMgYWZ0ZXIgaW1wbGVtZW50YXRpb24KLy8gaW4gcG9wdWxhciBlbmdpbmVzLCBzbyBpdCdzIG1vdmVkIHRvIGEgc2VwYXJhdGUgbW9kdWxlCnZhciBhZGRUb1Vuc2NvcGFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIik7CgphZGRUb1Vuc2NvcGFibGVzKCdmbGF0TWFwJyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnVuc2NvcGFibGVzLmZsYXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkudW5zY29wYWJsZXMuZmxhdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyB0aGlzIG1ldGhvZCB3YXMgYWRkZWQgdG8gdW5zY29wYWJsZXMgYWZ0ZXIgaW1wbGVtZW50YXRpb24KLy8gaW4gcG9wdWxhciBlbmdpbmVzLCBzbyBpdCdzIG1vdmVkIHRvIGEgc2VwYXJhdGUgbW9kdWxlCnZhciBhZGRUb1Vuc2NvcGFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIik7CgphZGRUb1Vuc2NvcGFibGVzKCdmbGF0Jyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGEtdmlldy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGEtdmlldy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBBcnJheUJ1ZmZlck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci5qcyIpOwp2YXIgTkFUSVZFX0FSUkFZX0JVRkZFUiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIikuTkFUSVZFX0FSUkFZX0JVRkZFUjsKCi8vIGBEYXRhVmlld2AgY29uc3RydWN0b3IKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZGF0YXZpZXctY29uc3RydWN0b3IKJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX0FSUkFZX0JVRkZFUiB9LCB7CiAgRGF0YVZpZXc6IEFycmF5QnVmZmVyTW9kdWxlLkRhdGFWaWV3Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5kYXRlLm5vdy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZGF0ZS5ub3cuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CgovLyBgRGF0ZS5ub3dgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1kYXRlLm5vdwokKHsgdGFyZ2V0OiAnRGF0ZScsIHN0YXQ6IHRydWUgfSwgewogIG5vdzogZnVuY3Rpb24gbm93KCkgewogICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGUudG8taXNvLXN0cmluZy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGUudG8taXNvLXN0cmluZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciB0b0lTT1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kYXRlLXRvLWlzby1zdHJpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RhdGUtdG8taXNvLXN0cmluZy5qcyIpOwoKLy8gYERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZGF0ZS5wcm90b3R5cGUudG9pc29zdHJpbmcKLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBoYXMgYSBicm9rZW4gaW1wbGVtZW50YXRpb25zCiQoeyB0YXJnZXQ6ICdEYXRlJywgcHJvdG86IHRydWUsIGZvcmNlZDogRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgIT09IHRvSVNPU3RyaW5nIH0sIHsKICB0b0lTT1N0cmluZzogdG9JU09TdHJpbmcKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGUudG8tanNvbi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGUudG8tanNvbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciB0b1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcmltaXRpdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIpOwoKdmFyIEZPUkNFRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHsKICByZXR1cm4gbmV3IERhdGUoTmFOKS50b0pTT04oKSAhPT0gbnVsbAogICAgfHwgRGF0ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoeyB0b0lTT1N0cmluZzogZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfSB9KSAhPT0gMTsKfSk7CgovLyBgRGF0ZS5wcm90b3R5cGUudG9KU09OYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZGF0ZS5wcm90b3R5cGUudG9qc29uCiQoeyB0YXJnZXQ6ICdEYXRlJywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMKICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHsKICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7CiAgICB2YXIgcHYgPSB0b1ByaW1pdGl2ZShPKTsKICAgIHJldHVybiB0eXBlb2YgcHYgPT0gJ251bWJlcicgJiYgIWlzRmluaXRlKHB2KSA/IG51bGwgOiBPLnRvSVNPU3RyaW5nKCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZGF0ZS50by1wcmltaXRpdmUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGUudG8tcHJpbWl0aXZlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7CnZhciBkYXRlVG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGF0ZS10by1wcmltaXRpdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RhdGUtdG8tcHJpbWl0aXZlLmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7Cgp2YXIgVE9fUFJJTUlUSVZFID0gd2VsbEtub3duU3ltYm9sKCd0b1ByaW1pdGl2ZScpOwp2YXIgRGF0ZVByb3RvdHlwZSA9IERhdGUucHJvdG90eXBlOwoKLy8gYERhdGUucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZGF0ZS5wcm90b3R5cGUtQEB0b3ByaW1pdGl2ZQppZiAoIShUT19QUklNSVRJVkUgaW4gRGF0ZVByb3RvdHlwZSkpIHsKICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoRGF0ZVByb3RvdHlwZSwgVE9fUFJJTUlUSVZFLCBkYXRlVG9QcmltaXRpdmUpOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGUudG8tc3RyaW5nLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5kYXRlLnRvLXN0cmluZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHJlZGVmaW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZGVmaW5lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIpOwoKdmFyIERhdGVQcm90b3R5cGUgPSBEYXRlLnByb3RvdHlwZTsKdmFyIElOVkFMSURfREFURSA9ICdJbnZhbGlkIERhdGUnOwp2YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJzsKdmFyIG5hdGl2ZURhdGVUb1N0cmluZyA9IERhdGVQcm90b3R5cGVbVE9fU1RSSU5HXTsKdmFyIGdldFRpbWUgPSBEYXRlUHJvdG90eXBlLmdldFRpbWU7CgovLyBgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1kYXRlLnByb3RvdHlwZS50b3N0cmluZwppZiAobmV3IERhdGUoTmFOKSArICcnICE9IElOVkFMSURfREFURSkgewogIHJlZGVmaW5lKERhdGVQcm90b3R5cGUsIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7CiAgICB2YXIgdmFsdWUgPSBnZXRUaW1lLmNhbGwodGhpcyk7CiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlCiAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gbmF0aXZlRGF0ZVRvU3RyaW5nLmNhbGwodGhpcykgOiBJTlZBTElEX0RBVEU7CiAgfSk7Cn0KCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24uYmluZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5iaW5kLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQuanMiKTsKCi8vIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kCiQoeyB0YXJnZXQ6ICdGdW5jdGlvbicsIHByb3RvOiB0cnVlIH0sIHsKICBiaW5kOiBiaW5kCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5oYXMtaW5zdGFuY2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5oYXMtaW5zdGFuY2UuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiKTsKdmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKdmFyIEhBU19JTlNUQU5DRSA9IHdlbGxLbm93blN5bWJvbCgnaGFzSW5zdGFuY2UnKTsKdmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlOwoKLy8gYEZ1bmN0aW9uLnByb3RvdHlwZVtAQGhhc0luc3RhbmNlXWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWZ1bmN0aW9uLnByb3RvdHlwZS1AQGhhc2luc3RhbmNlCmlmICghKEhBU19JTlNUQU5DRSBpbiBGdW5jdGlvblByb3RvdHlwZSkpIHsKICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKEZ1bmN0aW9uUHJvdG90eXBlLCBIQVNfSU5TVEFOQ0UsIHsgdmFsdWU6IGZ1bmN0aW9uIChPKSB7CiAgICBpZiAodHlwZW9mIHRoaXMgIT0gJ2Z1bmN0aW9uJyB8fCAhaXNPYmplY3QoTykpIHJldHVybiBmYWxzZTsKICAgIGlmICghaXNPYmplY3QodGhpcy5wcm90b3R5cGUpKSByZXR1cm4gTyBpbnN0YW5jZW9mIHRoaXM7CiAgICAvLyBmb3IgZW52aXJvbm1lbnQgdy9vIG5hdGl2ZSBgQEBoYXNJbnN0YW5jZWAgbG9naWMgZW5vdWdoIGBpbnN0YW5jZW9mYCwgYnV0IGFkZCB0aGlzOgogICAgd2hpbGUgKE8gPSBnZXRQcm90b3R5cGVPZihPKSkgaWYgKHRoaXMucHJvdG90eXBlID09PSBPKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9IH0pOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24ubmFtZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIikuZjsKCnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTsKdmFyIEZ1bmN0aW9uUHJvdG90eXBlVG9TdHJpbmcgPSBGdW5jdGlvblByb3RvdHlwZS50b1N0cmluZzsKdmFyIG5hbWVSRSA9IC9eXHMqZnVuY3Rpb24gKFteIChdKikvOwp2YXIgTkFNRSA9ICduYW1lJzsKCi8vIEZ1bmN0aW9uIGluc3RhbmNlcyBgLm5hbWVgIHByb3BlcnR5Ci8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWZ1bmN0aW9uLWluc3RhbmNlcy1uYW1lCmlmIChERVNDUklQVE9SUyAmJiAhKE5BTUUgaW4gRnVuY3Rpb25Qcm90b3R5cGUpKSB7CiAgZGVmaW5lUHJvcGVydHkoRnVuY3Rpb25Qcm90b3R5cGUsIE5BTUUsIHsKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICB0cnkgewogICAgICAgIHJldHVybiBGdW5jdGlvblByb3RvdHlwZVRvU3RyaW5nLmNhbGwodGhpcykubWF0Y2gobmFtZVJFKVsxXTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICByZXR1cm4gJyc7CiAgICAgIH0KICAgIH0KICB9KTsKfQoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5nbG9iYWwtdGhpcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZ2xvYmFsLXRoaXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKCi8vIGBnbG9iYWxUaGlzYCBvYmplY3QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZ2xvYmFsCiQoeyBnbG9iYWw6IHRydWUgfSwgewogIGdsb2JhbFRoaXM6IGdsb2JhbAp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7Cgp2YXIgJHN0cmluZ2lmeSA9IGdldEJ1aWx0SW4oJ0pTT04nLCAnc3RyaW5naWZ5Jyk7CnZhciByZSA9IC9bXHVEODAwLVx1REZGRl0vZzsKdmFyIGxvdyA9IC9eW1x1RDgwMC1cdURCRkZdJC87CnZhciBoaSA9IC9eW1x1REMwMC1cdURGRkZdJC87Cgp2YXIgZml4ID0gZnVuY3Rpb24gKG1hdGNoLCBvZmZzZXQsIHN0cmluZykgewogIHZhciBwcmV2ID0gc3RyaW5nLmNoYXJBdChvZmZzZXQgLSAxKTsKICB2YXIgbmV4dCA9IHN0cmluZy5jaGFyQXQob2Zmc2V0ICsgMSk7CiAgaWYgKChsb3cudGVzdChtYXRjaCkgJiYgIWhpLnRlc3QobmV4dCkpIHx8IChoaS50ZXN0KG1hdGNoKSAmJiAhbG93LnRlc3QocHJldikpKSB7CiAgICByZXR1cm4gJ1xcdScgKyBtYXRjaC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KTsKICB9IHJldHVybiBtYXRjaDsKfTsKCnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7CiAgcmV0dXJuICRzdHJpbmdpZnkoJ1x1REYwNlx1RDgzNCcpICE9PSAnIlxcdWRmMDZcXHVkODM0IicKICAgIHx8ICRzdHJpbmdpZnkoJ1x1REVBRCcpICE9PSAnIlxcdWRlYWQiJzsKfSk7CgppZiAoJHN0cmluZ2lmeSkgewogIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXdlbGwtZm9ybWVkLXN0cmluZ2lmeQogICQoeyB0YXJnZXQ6ICdKU09OJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwgewogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzCiAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCwgcmVwbGFjZXIsIHNwYWNlKSB7CiAgICAgIHZhciByZXN1bHQgPSAkc3RyaW5naWZ5LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiB0eXBlb2YgcmVzdWx0ID09ICdzdHJpbmcnID8gcmVzdWx0LnJlcGxhY2UocmUsIGZpeCkgOiByZXN1bHQ7CiAgICB9CiAgfSk7Cn0KCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuanNvbi50by1zdHJpbmctdGFnLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuanNvbi50by1zdHJpbmctdGFnLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIik7CgovLyBKU09OW0BAdG9TdHJpbmdUYWddIHByb3BlcnR5Ci8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWpzb24tQEB0b3N0cmluZ3RhZwpzZXRUb1N0cmluZ1RhZyhnbG9iYWwuSlNPTiwgJ0pTT04nLCB0cnVlKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWFwLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWFwLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBjb2xsZWN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24uanMiKTsKdmFyIGNvbGxlY3Rpb25TdHJvbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nLmpzIik7CgovLyBgTWFwYCBjb25zdHJ1Y3RvcgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXAtb2JqZWN0cwptb2R1bGUuZXhwb3J0cyA9IGNvbGxlY3Rpb24oJ01hcCcsIGZ1bmN0aW9uIChpbml0KSB7CiAgcmV0dXJuIGZ1bmN0aW9uIE1hcCgpIHsgcmV0dXJuIGluaXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07Cn0sIGNvbGxlY3Rpb25TdHJvbmcpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmFjb3NoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguYWNvc2guanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGxvZzFwID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21hdGgtbG9nMXAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtbG9nMXAuanMiKTsKCnZhciBuYXRpdmVBY29zaCA9IE1hdGguYWNvc2g7CnZhciBsb2cgPSBNYXRoLmxvZzsKdmFyIHNxcnQgPSBNYXRoLnNxcnQ7CnZhciBMTjIgPSBNYXRoLkxOMjsKCnZhciBGT1JDRUQgPSAhbmF0aXZlQWNvc2gKICAvLyBWOCBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zNTA5CiAgfHwgTWF0aC5mbG9vcihuYXRpdmVBY29zaChOdW1iZXIuTUFYX1ZBTFVFKSkgIT0gNzEwCiAgLy8gVG9yIEJyb3dzZXIgYnVnOiBNYXRoLmFjb3NoKEluZmluaXR5KSAtPiBOYU4KICB8fCBuYXRpdmVBY29zaChJbmZpbml0eSkgIT0gSW5maW5pdHk7CgovLyBgTWF0aC5hY29zaGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGguYWNvc2gKJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7CiAgYWNvc2g6IGZ1bmN0aW9uIGFjb3NoKHgpIHsKICAgIHJldHVybiAoeCA9ICt4KSA8IDEgPyBOYU4gOiB4ID4gOTQ5MDYyNjUuNjI0MjUxNTYKICAgICAgPyBsb2coeCkgKyBMTjIKICAgICAgOiBsb2cxcCh4IC0gMSArIHNxcnQoeCAtIDEpICogc3FydCh4ICsgMSkpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguYXNpbmguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5hc2luaC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwoKdmFyIG5hdGl2ZUFzaW5oID0gTWF0aC5hc2luaDsKdmFyIGxvZyA9IE1hdGgubG9nOwp2YXIgc3FydCA9IE1hdGguc3FydDsKCmZ1bmN0aW9uIGFzaW5oKHgpIHsKICByZXR1cm4gIWlzRmluaXRlKHggPSAreCkgfHwgeCA9PSAwID8geCA6IHggPCAwID8gLWFzaW5oKC14KSA6IGxvZyh4ICsgc3FydCh4ICogeCArIDEpKTsKfQoKLy8gYE1hdGguYXNpbmhgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmFzaW5oCi8vIFRvciBCcm93c2VyIGJ1ZzogTWF0aC5hc2luaCgwKSAtPiAtMAokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIShuYXRpdmVBc2luaCAmJiAxIC8gbmF0aXZlQXNpbmgoMCkgPiAwKSB9LCB7CiAgYXNpbmg6IGFzaW5oCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmF0YW5oLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguYXRhbmguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCnZhciBuYXRpdmVBdGFuaCA9IE1hdGguYXRhbmg7CnZhciBsb2cgPSBNYXRoLmxvZzsKCi8vIGBNYXRoLmF0YW5oYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5hdGFuaAovLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYXRhbmgoLTApIC0+IDAKJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICEobmF0aXZlQXRhbmggJiYgMSAvIG5hdGl2ZUF0YW5oKC0wKSA8IDApIH0sIHsKICBhdGFuaDogZnVuY3Rpb24gYXRhbmgoeCkgewogICAgcmV0dXJuICh4ID0gK3gpID09IDAgPyB4IDogbG9nKCgxICsgeCkgLyAoMSAtIHgpKSAvIDI7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5jYnJ0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5jYnJ0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIHNpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWF0aC1zaWduICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXRoLXNpZ24uanMiKTsKCnZhciBhYnMgPSBNYXRoLmFiczsKdmFyIHBvdyA9IE1hdGgucG93OwoKLy8gYE1hdGguY2JydGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGguY2JydAokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIGNicnQ6IGZ1bmN0aW9uIGNicnQoeCkgewogICAgcmV0dXJuIHNpZ24oeCA9ICt4KSAqIHBvdyhhYnMoeCksIDEgLyAzKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmNsejMyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguY2x6MzIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCnZhciBmbG9vciA9IE1hdGguZmxvb3I7CnZhciBsb2cgPSBNYXRoLmxvZzsKdmFyIExPRzJFID0gTWF0aC5MT0cyRTsKCi8vIGBNYXRoLmNsejMyYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5jbHozMgokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIGNsejMyOiBmdW5jdGlvbiBjbHozMih4KSB7CiAgICByZXR1cm4gKHggPj4+PSAwKSA/IDMxIC0gZmxvb3IobG9nKHggKyAwLjUpICogTE9HMkUpIDogMzI7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5jb3NoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5jb3NoLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGV4cG0xID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21hdGgtZXhwbTEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtZXhwbTEuanMiKTsKCnZhciBuYXRpdmVDb3NoID0gTWF0aC5jb3NoOwp2YXIgYWJzID0gTWF0aC5hYnM7CnZhciBFID0gTWF0aC5FOwoKLy8gYE1hdGguY29zaGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGguY29zaAokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIW5hdGl2ZUNvc2ggfHwgbmF0aXZlQ29zaCg3MTApID09PSBJbmZpbml0eSB9LCB7CiAgY29zaDogZnVuY3Rpb24gY29zaCh4KSB7CiAgICB2YXIgdCA9IGV4cG0xKGFicyh4KSAtIDEpICsgMTsKICAgIHJldHVybiAodCArIDEgLyAodCAqIEUgKiBFKSkgKiAoRSAvIDIpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguZXhwbTEuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5leHBtMS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZXhwbTEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWF0aC1leHBtMSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC1leHBtMS5qcyIpOwoKLy8gYE1hdGguZXhwbTFgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmV4cG0xCiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBleHBtMSAhPSBNYXRoLmV4cG0xIH0sIHsgZXhwbTE6IGV4cG0xIH0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmZyb3VuZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5mcm91bmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmcm91bmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWF0aC1mcm91bmQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtZnJvdW5kLmpzIik7CgovLyBgTWF0aC5mcm91bmRgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmZyb3VuZAokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgeyBmcm91bmQ6IGZyb3VuZCB9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5oeXBvdC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmh5cG90LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7Cgp2YXIgJGh5cG90ID0gTWF0aC5oeXBvdDsKdmFyIGFicyA9IE1hdGguYWJzOwp2YXIgc3FydCA9IE1hdGguc3FydDsKCi8vIENocm9tZSA3NyBidWcKLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9OTU0Ngp2YXIgQlVHR1kgPSAhISRoeXBvdCAmJiAkaHlwb3QoSW5maW5pdHksIE5hTikgIT09IEluZmluaXR5OwoKLy8gYE1hdGguaHlwb3RgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmh5cG90CiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBCVUdHWSB9LCB7CiAgaHlwb3Q6IGZ1bmN0aW9uIGh5cG90KHZhbHVlMSwgdmFsdWUyKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgIHZhciBzdW0gPSAwOwogICAgdmFyIGkgPSAwOwogICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoOwogICAgdmFyIGxhcmcgPSAwOwogICAgdmFyIGFyZywgZGl2OwogICAgd2hpbGUgKGkgPCBhTGVuKSB7CiAgICAgIGFyZyA9IGFicyhhcmd1bWVudHNbaSsrXSk7CiAgICAgIGlmIChsYXJnIDwgYXJnKSB7CiAgICAgICAgZGl2ID0gbGFyZyAvIGFyZzsKICAgICAgICBzdW0gPSBzdW0gKiBkaXYgKiBkaXYgKyAxOwogICAgICAgIGxhcmcgPSBhcmc7CiAgICAgIH0gZWxzZSBpZiAoYXJnID4gMCkgewogICAgICAgIGRpdiA9IGFyZyAvIGxhcmc7CiAgICAgICAgc3VtICs9IGRpdiAqIGRpdjsKICAgICAgfSBlbHNlIHN1bSArPSBhcmc7CiAgICB9CiAgICByZXR1cm4gbGFyZyA9PT0gSW5maW5pdHkgPyBJbmZpbml0eSA6IGxhcmcgKiBzcXJ0KHN1bSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5pbXVsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5pbXVsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwoKdmFyIG5hdGl2ZUltdWwgPSBNYXRoLmltdWw7Cgp2YXIgRk9SQ0VEID0gZmFpbHMoZnVuY3Rpb24gKCkgewogIHJldHVybiBuYXRpdmVJbXVsKDB4RkZGRkZGRkYsIDUpICE9IC01IHx8IG5hdGl2ZUltdWwubGVuZ3RoICE9IDI7Cn0pOwoKLy8gYE1hdGguaW11bGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGguaW11bAovLyBzb21lIFdlYktpdCB2ZXJzaW9ucyBmYWlscyB3aXRoIGJpZyBudW1iZXJzLCBzb21lIGhhcyB3cm9uZyBhcml0eQokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHsKICBpbXVsOiBmdW5jdGlvbiBpbXVsKHgsIHkpIHsKICAgIHZhciBVSU5UMTYgPSAweEZGRkY7CiAgICB2YXIgeG4gPSAreDsKICAgIHZhciB5biA9ICt5OwogICAgdmFyIHhsID0gVUlOVDE2ICYgeG47CiAgICB2YXIgeWwgPSBVSU5UMTYgJiB5bjsKICAgIHJldHVybiAwIHwgeGwgKiB5bCArICgoVUlOVDE2ICYgeG4gPj4+IDE2KSAqIHlsICsgeGwgKiAoVUlOVDE2ICYgeW4gPj4+IDE2KSA8PCAxNiA+Pj4gMCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5sb2cxMC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmxvZzEwLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7Cgp2YXIgbG9nID0gTWF0aC5sb2c7CnZhciBMT0cxMEUgPSBNYXRoLkxPRzEwRTsKCi8vIGBNYXRoLmxvZzEwYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5sb2cxMAokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIGxvZzEwOiBmdW5jdGlvbiBsb2cxMCh4KSB7CiAgICByZXR1cm4gbG9nKHgpICogTE9HMTBFOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGgubG9nMXAuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5sb2cxcC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgbG9nMXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWF0aC1sb2cxcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC1sb2cxcC5qcyIpOwoKLy8gYE1hdGgubG9nMXBgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmxvZzFwCiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7IGxvZzFwOiBsb2cxcCB9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5sb2cyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5sb2cyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCnZhciBsb2cgPSBNYXRoLmxvZzsKdmFyIExOMiA9IE1hdGguTE4yOwoKLy8gYE1hdGgubG9nMmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGgubG9nMgokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIGxvZzI6IGZ1bmN0aW9uIGxvZzIoeCkgewogICAgcmV0dXJuIGxvZyh4KSAvIExOMjsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnNpZ24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnNpZ24uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgc2lnbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9tYXRoLXNpZ24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtc2lnbi5qcyIpOwoKLy8gYE1hdGguc2lnbmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGguc2lnbgokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIHNpZ246IHNpZ24KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguc2luaC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguc2luaC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIGV4cG0xID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21hdGgtZXhwbTEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtZXhwbTEuanMiKTsKCnZhciBhYnMgPSBNYXRoLmFiczsKdmFyIGV4cCA9IE1hdGguZXhwOwp2YXIgRSA9IE1hdGguRTsKCnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIE1hdGguc2luaCgtMmUtMTcpICE9IC0yZS0xNzsKfSk7CgovLyBgTWF0aC5zaW5oYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5zaW5oCi8vIFY4IG5lYXIgQ2hyb21pdW0gMzggaGFzIGEgcHJvYmxlbSB3aXRoIHZlcnkgc21hbGwgbnVtYmVycwokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHsKICBzaW5oOiBmdW5jdGlvbiBzaW5oKHgpIHsKICAgIHJldHVybiBhYnMoeCA9ICt4KSA8IDEgPyAoZXhwbTEoeCkgLSBleHBtMSgteCkpIC8gMiA6IChleHAoeCAtIDEpIC0gZXhwKC14IC0gMSkpICogKEUgLyAyKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnRhbmguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnRhbmguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZXhwbTEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWF0aC1leHBtMSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC1leHBtMS5qcyIpOwoKdmFyIGV4cCA9IE1hdGguZXhwOwoKLy8gYE1hdGgudGFuaGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGgudGFuaAokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIHRhbmg6IGZ1bmN0aW9uIHRhbmgoeCkgewogICAgdmFyIGEgPSBleHBtMSh4ID0gK3gpOwogICAgdmFyIGIgPSBleHBtMSgteCk7CiAgICByZXR1cm4gYSA9PSBJbmZpbml0eSA/IDEgOiBiID09IEluZmluaXR5ID8gLTEgOiAoYSAtIGIpIC8gKGV4cCh4KSArIGV4cCgteCkpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGgudG8tc3RyaW5nLXRhZy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGgudG8tc3RyaW5nLXRhZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMiKTsKCi8vIE1hdGhbQEB0b1N0cmluZ1RhZ10gcHJvcGVydHkKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC1AQHRvc3RyaW5ndGFnCnNldFRvU3RyaW5nVGFnKE1hdGgsICdNYXRoJywgdHJ1ZSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGgudHJ1bmMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC50cnVuYy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwoKdmFyIGNlaWwgPSBNYXRoLmNlaWw7CnZhciBmbG9vciA9IE1hdGguZmxvb3I7CgovLyBgTWF0aC50cnVuY2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGgudHJ1bmMKJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlIH0sIHsKICB0cnVuYzogZnVuY3Rpb24gdHJ1bmMoaXQpIHsKICAgIHJldHVybiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmNvbnN0cnVjdG9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmNvbnN0cnVjdG9yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBpc0ZvcmNlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1mb3JjZWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWZvcmNlZC5qcyIpOwp2YXIgcmVkZWZpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVkZWZpbmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIik7CnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIik7CnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzIik7CnZhciB0b1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcmltaXRpdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMiKS5mOwp2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiKS5mOwp2YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpLmY7CnZhciB0cmltID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy10cmltICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qcyIpLnRyaW07Cgp2YXIgTlVNQkVSID0gJ051bWJlcic7CnZhciBOYXRpdmVOdW1iZXIgPSBnbG9iYWxbTlVNQkVSXTsKdmFyIE51bWJlclByb3RvdHlwZSA9IE5hdGl2ZU51bWJlci5wcm90b3R5cGU7CgovLyBPcGVyYSB+MTIgaGFzIGJyb2tlbiBPYmplY3QjdG9TdHJpbmcKdmFyIEJST0tFTl9DTEFTU09GID0gY2xhc3NvZihjcmVhdGUoTnVtYmVyUHJvdG90eXBlKSkgPT0gTlVNQkVSOwoKLy8gYFRvTnVtYmVyYCBhYnN0cmFjdCBvcGVyYXRpb24KLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9udW1iZXIKdmFyIHRvTnVtYmVyID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7CiAgdmFyIGl0ID0gdG9QcmltaXRpdmUoYXJndW1lbnQsIGZhbHNlKTsKICB2YXIgZmlyc3QsIHRoaXJkLCByYWRpeCwgbWF4Q29kZSwgZGlnaXRzLCBsZW5ndGgsIGluZGV4LCBjb2RlOwogIGlmICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgJiYgaXQubGVuZ3RoID4gMikgewogICAgaXQgPSB0cmltKGl0KTsKICAgIGZpcnN0ID0gaXQuY2hhckNvZGVBdCgwKTsKICAgIGlmIChmaXJzdCA9PT0gNDMgfHwgZmlyc3QgPT09IDQ1KSB7CiAgICAgIHRoaXJkID0gaXQuY2hhckNvZGVBdCgyKTsKICAgICAgaWYgKHRoaXJkID09PSA4OCB8fCB0aGlyZCA9PT0gMTIwKSByZXR1cm4gTmFOOyAvLyBOdW1iZXIoJysweDEnKSBzaG91bGQgYmUgTmFOLCBvbGQgVjggZml4CiAgICB9IGVsc2UgaWYgKGZpcnN0ID09PSA0OCkgewogICAgICBzd2l0Y2ggKGl0LmNoYXJDb2RlQXQoMSkpIHsKICAgICAgICBjYXNlIDY2OiBjYXNlIDk4OiByYWRpeCA9IDI7IG1heENvZGUgPSA0OTsgYnJlYWs7IC8vIGZhc3QgZXF1YWwgb2YgL14wYlswMV0rJC9pCiAgICAgICAgY2FzZSA3OTogY2FzZSAxMTE6IHJhZGl4ID0gODsgbWF4Q29kZSA9IDU1OyBicmVhazsgLy8gZmFzdCBlcXVhbCBvZiAvXjBvWzAtN10rJC9pCiAgICAgICAgZGVmYXVsdDogcmV0dXJuICtpdDsKICAgICAgfQogICAgICBkaWdpdHMgPSBpdC5zbGljZSgyKTsKICAgICAgbGVuZ3RoID0gZGlnaXRzLmxlbmd0aDsKICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgY29kZSA9IGRpZ2l0cy5jaGFyQ29kZUF0KGluZGV4KTsKICAgICAgICAvLyBwYXJzZUludCBwYXJzZXMgYSBzdHJpbmcgdG8gYSBmaXJzdCB1bmF2YWlsYWJsZSBzeW1ib2wKICAgICAgICAvLyBidXQgVG9OdW1iZXIgc2hvdWxkIHJldHVybiBOYU4gaWYgYSBzdHJpbmcgY29udGFpbnMgdW5hdmFpbGFibGUgc3ltYm9scwogICAgICAgIGlmIChjb2RlIDwgNDggfHwgY29kZSA+IG1heENvZGUpIHJldHVybiBOYU47CiAgICAgIH0gcmV0dXJuIHBhcnNlSW50KGRpZ2l0cywgcmFkaXgpOwogICAgfQogIH0gcmV0dXJuICtpdDsKfTsKCi8vIGBOdW1iZXJgIGNvbnN0cnVjdG9yCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci1jb25zdHJ1Y3RvcgppZiAoaXNGb3JjZWQoTlVNQkVSLCAhTmF0aXZlTnVtYmVyKCcgMG8xJykgfHwgIU5hdGl2ZU51bWJlcignMGIxJykgfHwgTmF0aXZlTnVtYmVyKCcrMHgxJykpKSB7CiAgdmFyIE51bWJlcldyYXBwZXIgPSBmdW5jdGlvbiBOdW1iZXIodmFsdWUpIHsKICAgIHZhciBpdCA9IGFyZ3VtZW50cy5sZW5ndGggPCAxID8gMCA6IHZhbHVlOwogICAgdmFyIGR1bW15ID0gdGhpczsKICAgIHJldHVybiBkdW1teSBpbnN0YW5jZW9mIE51bWJlcldyYXBwZXIKICAgICAgLy8gY2hlY2sgb24gMS4uY29uc3RydWN0b3IoZm9vKSBjYXNlCiAgICAgICYmIChCUk9LRU5fQ0xBU1NPRiA/IGZhaWxzKGZ1bmN0aW9uICgpIHsgTnVtYmVyUHJvdG90eXBlLnZhbHVlT2YuY2FsbChkdW1teSk7IH0pIDogY2xhc3NvZihkdW1teSkgIT0gTlVNQkVSKQogICAgICAgID8gaW5oZXJpdElmUmVxdWlyZWQobmV3IE5hdGl2ZU51bWJlcih0b051bWJlcihpdCkpLCBkdW1teSwgTnVtYmVyV3JhcHBlcikgOiB0b051bWJlcihpdCk7CiAgfTsKICBmb3IgKHZhciBrZXlzID0gREVTQ1JJUFRPUlMgPyBnZXRPd25Qcm9wZXJ0eU5hbWVzKE5hdGl2ZU51bWJlcikgOiAoCiAgICAvLyBFUzM6CiAgICAnTUFYX1ZBTFVFLE1JTl9WQUxVRSxOYU4sTkVHQVRJVkVfSU5GSU5JVFksUE9TSVRJVkVfSU5GSU5JVFksJyArCiAgICAvLyBFUzIwMTUgKGluIGNhc2UsIGlmIG1vZHVsZXMgd2l0aCBFUzIwMTUgTnVtYmVyIHN0YXRpY3MgcmVxdWlyZWQgYmVmb3JlKToKICAgICdFUFNJTE9OLGlzRmluaXRlLGlzSW50ZWdlcixpc05hTixpc1NhZmVJbnRlZ2VyLE1BWF9TQUZFX0lOVEVHRVIsJyArCiAgICAnTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlcicKICApLnNwbGl0KCcsJyksIGogPSAwLCBrZXk7IGtleXMubGVuZ3RoID4gajsgaisrKSB7CiAgICBpZiAoaGFzKE5hdGl2ZU51bWJlciwga2V5ID0ga2V5c1tqXSkgJiYgIWhhcyhOdW1iZXJXcmFwcGVyLCBrZXkpKSB7CiAgICAgIGRlZmluZVByb3BlcnR5KE51bWJlcldyYXBwZXIsIGtleSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5hdGl2ZU51bWJlciwga2V5KSk7CiAgICB9CiAgfQogIE51bWJlcldyYXBwZXIucHJvdG90eXBlID0gTnVtYmVyUHJvdG90eXBlOwogIE51bWJlclByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE51bWJlcldyYXBwZXI7CiAgcmVkZWZpbmUoZ2xvYmFsLCBOVU1CRVIsIE51bWJlcldyYXBwZXIpOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5lcHNpbG9uLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuZXBzaWxvbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCi8vIGBOdW1iZXIuRVBTSUxPTmAgY29uc3RhbnQKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLmVwc2lsb24KJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUgfSwgewogIEVQU0lMT046IE1hdGgucG93KDIsIC01MikKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1maW5pdGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLWZpbml0ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgbnVtYmVySXNGaW5pdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbnVtYmVyLWlzLWZpbml0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbnVtYmVyLWlzLWZpbml0ZS5qcyIpOwoKLy8gYE51bWJlci5pc0Zpbml0ZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci5pc2Zpbml0ZQokKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7IGlzRmluaXRlOiBudW1iZXJJc0Zpbml0ZSB9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXIuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1pbnRlZ2VyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXNJbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWludGVnZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWludGVnZXIuanMiKTsKCi8vIGBOdW1iZXIuaXNJbnRlZ2VyYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLmlzaW50ZWdlcgokKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7CiAgaXNJbnRlZ2VyOiBpc0ludGVnZXIKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1uYW4uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLW5hbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwoKLy8gYE51bWJlci5pc05hTmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci5pc25hbgokKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7CiAgaXNOYU46IGZ1bmN0aW9uIGlzTmFOKG51bWJlcikgewogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZQogICAgcmV0dXJuIG51bWJlciAhPSBudW1iZXI7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLXNhZmUtaW50ZWdlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBpc0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtaW50ZWdlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdlci5qcyIpOwoKdmFyIGFicyA9IE1hdGguYWJzOwoKLy8gYE51bWJlci5pc1NhZmVJbnRlZ2VyYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLmlzc2FmZWludGVnZXIKJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUgfSwgewogIGlzU2FmZUludGVnZXI6IGZ1bmN0aW9uIGlzU2FmZUludGVnZXIobnVtYmVyKSB7CiAgICByZXR1cm4gaXNJbnRlZ2VyKG51bWJlcikgJiYgYWJzKG51bWJlcikgPD0gMHgxRkZGRkZGRkZGRkZGRjsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIubWF4LXNhZmUtaW50ZWdlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLm1heC1zYWZlLWludGVnZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CgovLyBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgIGNvbnN0YW50Ci8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci5tYXhfc2FmZV9pbnRlZ2VyCiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlIH0sIHsKICBNQVhfU0FGRV9JTlRFR0VSOiAweDFGRkZGRkZGRkZGRkZGCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIubWluLXNhZmUtaW50ZWdlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLm1pbi1zYWZlLWludGVnZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CgovLyBgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJgIGNvbnN0YW50Ci8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci5taW5fc2FmZV9pbnRlZ2VyCiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlIH0sIHsKICBNSU5fU0FGRV9JTlRFR0VSOiAtMHgxRkZGRkZGRkZGRkZGRgp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWZsb2F0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWZsb2F0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIHBhcnNlRmxvYXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGFyc2UtZmxvYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhcnNlLWZsb2F0LmpzIik7CgovLyBgTnVtYmVyLnBhcnNlRmxvYXRgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1udW1iZXIucGFyc2VGbG9hdAokKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBOdW1iZXIucGFyc2VGbG9hdCAhPSBwYXJzZUZsb2F0IH0sIHsKICBwYXJzZUZsb2F0OiBwYXJzZUZsb2F0Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtaW50LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1pbnQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIHBhcnNlSW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3BhcnNlLWludCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGFyc2UtaW50LmpzIik7CgovLyBgTnVtYmVyLnBhcnNlSW50YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLnBhcnNlaW50CiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE51bWJlci5wYXJzZUludCAhPSBwYXJzZUludCB9LCB7CiAgcGFyc2VJbnQ6IHBhcnNlSW50Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tZml4ZWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tZml4ZWQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXIuanMiKTsKdmFyIHRoaXNOdW1iZXJWYWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90aGlzLW51bWJlci12YWx1ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGhpcy1udW1iZXItdmFsdWUuanMiKTsKdmFyIHJlcGVhdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctcmVwZWF0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcmVwZWF0LmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKCnZhciBuYXRpdmVUb0ZpeGVkID0gMS4wLnRvRml4ZWQ7CnZhciBmbG9vciA9IE1hdGguZmxvb3I7Cgp2YXIgcG93ID0gZnVuY3Rpb24gKHgsIG4sIGFjYykgewogIHJldHVybiBuID09PSAwID8gYWNjIDogbiAlIDIgPT09IDEgPyBwb3coeCwgbiAtIDEsIGFjYyAqIHgpIDogcG93KHggKiB4LCBuIC8gMiwgYWNjKTsKfTsKCnZhciBsb2cgPSBmdW5jdGlvbiAoeCkgewogIHZhciBuID0gMDsKICB2YXIgeDIgPSB4OwogIHdoaWxlICh4MiA+PSA0MDk2KSB7CiAgICBuICs9IDEyOwogICAgeDIgLz0gNDA5NjsKICB9CiAgd2hpbGUgKHgyID49IDIpIHsKICAgIG4gKz0gMTsKICAgIHgyIC89IDI7CiAgfSByZXR1cm4gbjsKfTsKCnZhciBGT1JDRUQgPSBuYXRpdmVUb0ZpeGVkICYmICgKICAwLjAwMDA4LnRvRml4ZWQoMykgIT09ICcwLjAwMCcgfHwKICAwLjkudG9GaXhlZCgwKSAhPT0gJzEnIHx8CiAgMS4yNTUudG9GaXhlZCgyKSAhPT0gJzEuMjUnIHx8CiAgMTAwMDAwMDAwMDAwMDAwMDEyOC4wLnRvRml4ZWQoMCkgIT09ICcxMDAwMDAwMDAwMDAwMDAwMTI4JwopIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgLy8gVjggfiBBbmRyb2lkIDQuMy0KICBuYXRpdmVUb0ZpeGVkLmNhbGwoe30pOwp9KTsKCi8vIGBOdW1iZXIucHJvdG90eXBlLnRvRml4ZWRgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1udW1iZXIucHJvdG90eXBlLnRvZml4ZWQKJCh7IHRhcmdldDogJ051bWJlcicsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzCiAgdG9GaXhlZDogZnVuY3Rpb24gdG9GaXhlZChmcmFjdGlvbkRpZ2l0cykgewogICAgdmFyIG51bWJlciA9IHRoaXNOdW1iZXJWYWx1ZSh0aGlzKTsKICAgIHZhciBmcmFjdERpZ2l0cyA9IHRvSW50ZWdlcihmcmFjdGlvbkRpZ2l0cyk7CiAgICB2YXIgZGF0YSA9IFswLCAwLCAwLCAwLCAwLCAwXTsKICAgIHZhciBzaWduID0gJyc7CiAgICB2YXIgcmVzdWx0ID0gJzAnOwogICAgdmFyIGUsIHosIGosIGs7CgogICAgdmFyIG11bHRpcGx5ID0gZnVuY3Rpb24gKG4sIGMpIHsKICAgICAgdmFyIGluZGV4ID0gLTE7CiAgICAgIHZhciBjMiA9IGM7CiAgICAgIHdoaWxlICgrK2luZGV4IDwgNikgewogICAgICAgIGMyICs9IG4gKiBkYXRhW2luZGV4XTsKICAgICAgICBkYXRhW2luZGV4XSA9IGMyICUgMWU3OwogICAgICAgIGMyID0gZmxvb3IoYzIgLyAxZTcpOwogICAgICB9CiAgICB9OwoKICAgIHZhciBkaXZpZGUgPSBmdW5jdGlvbiAobikgewogICAgICB2YXIgaW5kZXggPSA2OwogICAgICB2YXIgYyA9IDA7CiAgICAgIHdoaWxlICgtLWluZGV4ID49IDApIHsKICAgICAgICBjICs9IGRhdGFbaW5kZXhdOwogICAgICAgIGRhdGFbaW5kZXhdID0gZmxvb3IoYyAvIG4pOwogICAgICAgIGMgPSAoYyAlIG4pICogMWU3OwogICAgICB9CiAgICB9OwoKICAgIHZhciBkYXRhVG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBpbmRleCA9IDY7CiAgICAgIHZhciBzID0gJyc7CiAgICAgIHdoaWxlICgtLWluZGV4ID49IDApIHsKICAgICAgICBpZiAocyAhPT0gJycgfHwgaW5kZXggPT09IDAgfHwgZGF0YVtpbmRleF0gIT09IDApIHsKICAgICAgICAgIHZhciB0ID0gU3RyaW5nKGRhdGFbaW5kZXhdKTsKICAgICAgICAgIHMgPSBzID09PSAnJyA/IHQgOiBzICsgcmVwZWF0LmNhbGwoJzAnLCA3IC0gdC5sZW5ndGgpICsgdDsKICAgICAgICB9CiAgICAgIH0gcmV0dXJuIHM7CiAgICB9OwoKICAgIGlmIChmcmFjdERpZ2l0cyA8IDAgfHwgZnJhY3REaWdpdHMgPiAyMCkgdGhyb3cgUmFuZ2VFcnJvcignSW5jb3JyZWN0IGZyYWN0aW9uIGRpZ2l0cycpOwogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZQogICAgaWYgKG51bWJlciAhPSBudW1iZXIpIHJldHVybiAnTmFOJzsKICAgIGlmIChudW1iZXIgPD0gLTFlMjEgfHwgbnVtYmVyID49IDFlMjEpIHJldHVybiBTdHJpbmcobnVtYmVyKTsKICAgIGlmIChudW1iZXIgPCAwKSB7CiAgICAgIHNpZ24gPSAnLSc7CiAgICAgIG51bWJlciA9IC1udW1iZXI7CiAgICB9CiAgICBpZiAobnVtYmVyID4gMWUtMjEpIHsKICAgICAgZSA9IGxvZyhudW1iZXIgKiBwb3coMiwgNjksIDEpKSAtIDY5OwogICAgICB6ID0gZSA8IDAgPyBudW1iZXIgKiBwb3coMiwgLWUsIDEpIDogbnVtYmVyIC8gcG93KDIsIGUsIDEpOwogICAgICB6ICo9IDB4MTAwMDAwMDAwMDAwMDA7CiAgICAgIGUgPSA1MiAtIGU7CiAgICAgIGlmIChlID4gMCkgewogICAgICAgIG11bHRpcGx5KDAsIHopOwogICAgICAgIGogPSBmcmFjdERpZ2l0czsKICAgICAgICB3aGlsZSAoaiA+PSA3KSB7CiAgICAgICAgICBtdWx0aXBseSgxZTcsIDApOwogICAgICAgICAgaiAtPSA3OwogICAgICAgIH0KICAgICAgICBtdWx0aXBseShwb3coMTAsIGosIDEpLCAwKTsKICAgICAgICBqID0gZSAtIDE7CiAgICAgICAgd2hpbGUgKGogPj0gMjMpIHsKICAgICAgICAgIGRpdmlkZSgxIDw8IDIzKTsKICAgICAgICAgIGogLT0gMjM7CiAgICAgICAgfQogICAgICAgIGRpdmlkZSgxIDw8IGopOwogICAgICAgIG11bHRpcGx5KDEsIDEpOwogICAgICAgIGRpdmlkZSgyKTsKICAgICAgICByZXN1bHQgPSBkYXRhVG9TdHJpbmcoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtdWx0aXBseSgwLCB6KTsKICAgICAgICBtdWx0aXBseSgxIDw8IC1lLCAwKTsKICAgICAgICByZXN1bHQgPSBkYXRhVG9TdHJpbmcoKSArIHJlcGVhdC5jYWxsKCcwJywgZnJhY3REaWdpdHMpOwogICAgICB9CiAgICB9CiAgICBpZiAoZnJhY3REaWdpdHMgPiAwKSB7CiAgICAgIGsgPSByZXN1bHQubGVuZ3RoOwogICAgICByZXN1bHQgPSBzaWduICsgKGsgPD0gZnJhY3REaWdpdHMKICAgICAgICA/ICcwLicgKyByZXBlYXQuY2FsbCgnMCcsIGZyYWN0RGlnaXRzIC0gaykgKyByZXN1bHQKICAgICAgICA6IHJlc3VsdC5zbGljZSgwLCBrIC0gZnJhY3REaWdpdHMpICsgJy4nICsgcmVzdWx0LnNsaWNlKGsgLSBmcmFjdERpZ2l0cykpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gc2lnbiArIHJlc3VsdDsKICAgIH0gcmV0dXJuIHJlc3VsdDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tcHJlY2lzaW9uLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci50by1wcmVjaXNpb24uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgdGhpc051bWJlclZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RoaXMtbnVtYmVyLXZhbHVlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90aGlzLW51bWJlci12YWx1ZS5qcyIpOwoKdmFyIG5hdGl2ZVRvUHJlY2lzaW9uID0gMS4wLnRvUHJlY2lzaW9uOwoKdmFyIEZPUkNFRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHsKICAvLyBJRTctCiAgcmV0dXJuIG5hdGl2ZVRvUHJlY2lzaW9uLmNhbGwoMSwgdW5kZWZpbmVkKSAhPT0gJzEnOwp9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkgewogIC8vIFY4IH4gQW5kcm9pZCA0LjMtCiAgbmF0aXZlVG9QcmVjaXNpb24uY2FsbCh7fSk7Cn0pOwoKLy8gYE51bWJlci5wcm90b3R5cGUudG9QcmVjaXNpb25gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1udW1iZXIucHJvdG90eXBlLnRvcHJlY2lzaW9uCiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwgewogIHRvUHJlY2lzaW9uOiBmdW5jdGlvbiB0b1ByZWNpc2lvbihwcmVjaXNpb24pIHsKICAgIHJldHVybiBwcmVjaXNpb24gPT09IHVuZGVmaW5lZAogICAgICA/IG5hdGl2ZVRvUHJlY2lzaW9uLmNhbGwodGhpc051bWJlclZhbHVlKHRoaXMpKQogICAgICA6IG5hdGl2ZVRvUHJlY2lzaW9uLmNhbGwodGhpc051bWJlclZhbHVlKHRoaXMpLCBwcmVjaXNpb24pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYXNzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1hc3NpZ24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanMiKTsKCi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnbgokKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBPYmplY3QuYXNzaWduICE9PSBhc3NpZ24gfSwgewogIGFzc2lnbjogYXNzaWduCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuY3JlYXRlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5jcmVhdGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiKTsKCi8vIGBPYmplY3QuY3JlYXRlYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmNyZWF0ZQokKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgc2hhbTogIURFU0NSSVBUT1JTIH0sIHsKICBjcmVhdGU6IGNyZWF0ZQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1nZXR0ZXIuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtZ2V0dGVyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBGT1JDRUQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZm9yY2VkLW9iamVjdC1wcm90b3R5cGUtYWNjZXNzb3JzLW1ldGhvZHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1vYmplY3QtcHJvdG90eXBlLWFjY2Vzc29ycy1tZXRob2RzLmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiKTsKCi8vIGBPYmplY3QucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX19gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18KaWYgKERFU0NSSVBUT1JTKSB7CiAgJCh7IHRhcmdldDogJ09iamVjdCcsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7CiAgICBfX2RlZmluZUdldHRlcl9fOiBmdW5jdGlvbiBfX2RlZmluZUdldHRlcl9fKFAsIGdldHRlcikgewogICAgICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKHRvT2JqZWN0KHRoaXMpLCBQLCB7IGdldDogYUZ1bmN0aW9uKGdldHRlciksIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTsKICAgIH0KICB9KTsKfQoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnRpZXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnRpZXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0aWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzIik7CgovLyBgT2JqZWN0LmRlZmluZVByb3BlcnRpZXNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydGllcwokKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhREVTQ1JJUFRPUlMsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7CiAgZGVmaW5lUHJvcGVydGllczogZGVmaW5lUHJvcGVydGllcwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIG9iamVjdERlZmluZVByb3BlcnR5TW9kaWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiKTsKCi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHkKJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIURFU0NSSVBUT1JTLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwgewogIGRlZmluZVByb3BlcnR5OiBvYmplY3REZWZpbmVQcm9wZXJ0eU1vZGlsZS5mCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXNldHRlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1zZXR0ZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIEZPUkNFRCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mb3JjZWQtb2JqZWN0LXByb3RvdHlwZS1hY2Nlc3NvcnMtbWV0aG9kcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZm9yY2VkLW9iamVjdC1wcm90b3R5cGUtYWNjZXNzb3JzLW1ldGhvZHMuanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpOwoKLy8gYE9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfX2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfXwppZiAoREVTQ1JJUFRPUlMpIHsKICAkKHsgdGFyZ2V0OiAnT2JqZWN0JywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHsKICAgIF9fZGVmaW5lU2V0dGVyX186IGZ1bmN0aW9uIF9fZGVmaW5lU2V0dGVyX18oUCwgc2V0dGVyKSB7CiAgICAgIGRlZmluZVByb3BlcnR5TW9kdWxlLmYodG9PYmplY3QodGhpcyksIFAsIHsgc2V0OiBhRnVuY3Rpb24oc2V0dGVyKSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pOwogICAgfQogIH0pOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5lbnRyaWVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZW50cmllcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICRlbnRyaWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC10by1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXRvLWFycmF5LmpzIikuZW50cmllczsKCi8vIGBPYmplY3QuZW50cmllc2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzCiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKE8pIHsKICAgIHJldHVybiAkZW50cmllcyhPKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZnJlZXplLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5mcmVlemUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIEZSRUVaSU5HID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZyZWV6aW5nICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mcmVlemluZy5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgb25GcmVlemUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIikub25GcmVlemU7Cgp2YXIgbmF0aXZlRnJlZXplID0gT2JqZWN0LmZyZWV6ZTsKdmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IG5hdGl2ZUZyZWV6ZSgxKTsgfSk7CgovLyBgT2JqZWN0LmZyZWV6ZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5mcmVlemUKJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRkFJTFNfT05fUFJJTUlUSVZFUywgc2hhbTogIUZSRUVaSU5HIH0sIHsKICBmcmVlemU6IGZ1bmN0aW9uIGZyZWV6ZShpdCkgewogICAgcmV0dXJuIG5hdGl2ZUZyZWV6ZSAmJiBpc09iamVjdChpdCkgPyBuYXRpdmVGcmVlemUob25GcmVlemUoaXQpKSA6IGl0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5mcm9tLWVudHJpZXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmZyb20tZW50cmllcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CnZhciBjcmVhdGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS5qcyIpOwoKLy8gYE9iamVjdC5mcm9tRW50cmllc2AgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC1mcm9tLWVudHJpZXMKJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwgewogIGZyb21FbnRyaWVzOiBmdW5jdGlvbiBmcm9tRW50cmllcyhpdGVyYWJsZSkgewogICAgdmFyIG9iaiA9IHt9OwogICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKGssIHYpIHsKICAgICAgY3JlYXRlUHJvcGVydHkob2JqLCBrLCB2KTsKICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSk7CiAgICByZXR1cm4gb2JqOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIik7CnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIpLmY7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKCnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoMSk7IH0pOwp2YXIgRk9SQ0VEID0gIURFU0NSSVBUT1JTIHx8IEZBSUxTX09OX1BSSU1JVElWRVM7CgovLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IKJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VELCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwgewogIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHsKICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodG9JbmRleGVkT2JqZWN0KGl0KSwga2V5KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIG93bktleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb3duLWtleXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIik7CnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIik7CnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIpOwp2YXIgY3JlYXRlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiKTsKCi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JzCiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwgewogIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnM6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KSB7CiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpOwogICAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mOwogICAgdmFyIGtleXMgPSBvd25LZXlzKE8pOwogICAgdmFyIHJlc3VsdCA9IHt9OwogICAgdmFyIGluZGV4ID0gMDsKICAgIHZhciBrZXksIGRlc2NyaXB0b3I7CiAgICB3aGlsZSAoa2V5cy5sZW5ndGggPiBpbmRleCkgewogICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIGtleSA9IGtleXNbaW5kZXgrK10pOwogICAgICBpZiAoZGVzY3JpcHRvciAhPT0gdW5kZWZpbmVkKSBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGtleSwgZGVzY3JpcHRvcik7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMtZXh0ZXJuYWwuanMiKS5mOwoKdmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IHJldHVybiAhT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoMSk7IH0pOwoKLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXMKJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRkFJTFNfT05fUFJJTUlUSVZFUyB9LCB7CiAgZ2V0T3duUHJvcGVydHlOYW1lczogbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5nZXQtcHJvdG90eXBlLW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgbmF0aXZlR2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIik7CnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXIuanMiKTsKCnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBuYXRpdmVHZXRQcm90b3R5cGVPZigxKTsgfSk7CgovLyBgT2JqZWN0LmdldFByb3RvdHlwZU9mYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldHByb3RvdHlwZW9mCiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZBSUxTX09OX1BSSU1JVElWRVMsIHNoYW06ICFDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgfSwgewogIGdldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCkgewogICAgcmV0dXJuIG5hdGl2ZUdldFByb3RvdHlwZU9mKHRvT2JqZWN0KGl0KSk7CiAgfQp9KTsKCgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5pcy1leHRlbnNpYmxlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaXMtZXh0ZW5zaWJsZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKCnZhciBuYXRpdmVJc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlOwp2YXIgRkFJTFNfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgbmF0aXZlSXNFeHRlbnNpYmxlKDEpOyB9KTsKCi8vIGBPYmplY3QuaXNFeHRlbnNpYmxlYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmlzZXh0ZW5zaWJsZQokKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGQUlMU19PTl9QUklNSVRJVkVTIH0sIHsKICBpc0V4dGVuc2libGU6IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShpdCkgewogICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/IG5hdGl2ZUlzRXh0ZW5zaWJsZSA/IG5hdGl2ZUlzRXh0ZW5zaWJsZShpdCkgOiB0cnVlIDogZmFsc2U7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmlzLWZyb3plbi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaXMtZnJvemVuLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIik7Cgp2YXIgbmF0aXZlSXNGcm96ZW4gPSBPYmplY3QuaXNGcm96ZW47CnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBuYXRpdmVJc0Zyb3plbigxKTsgfSk7CgovLyBgT2JqZWN0LmlzRnJvemVuYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmlzZnJvemVuCiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZBSUxTX09OX1BSSU1JVElWRVMgfSwgewogIGlzRnJvemVuOiBmdW5jdGlvbiBpc0Zyb3plbihpdCkgewogICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/IG5hdGl2ZUlzRnJvemVuID8gbmF0aXZlSXNGcm96ZW4oaXQpIDogZmFsc2UgOiB0cnVlOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5pcy1zZWFsZWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmlzLXNlYWxlZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwoKdmFyIG5hdGl2ZUlzU2VhbGVkID0gT2JqZWN0LmlzU2VhbGVkOwp2YXIgRkFJTFNfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgbmF0aXZlSXNTZWFsZWQoMSk7IH0pOwoKLy8gYE9iamVjdC5pc1NlYWxlZGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5pc3NlYWxlZAokKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGQUlMU19PTl9QUklNSVRJVkVTIH0sIHsKICBpc1NlYWxlZDogZnVuY3Rpb24gaXNTZWFsZWQoaXQpIHsKICAgIHJldHVybiBpc09iamVjdChpdCkgPyBuYXRpdmVJc1NlYWxlZCA/IG5hdGl2ZUlzU2VhbGVkKGl0KSA6IGZhbHNlIDogdHJ1ZTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2FtZS12YWx1ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2FtZS12YWx1ZS5qcyIpOwoKLy8gYE9iamVjdC5pc2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5pcwokKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSB9LCB7CiAgaXM6IGlzCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmtleXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgbmF0aXZlS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3Qta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwoKdmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IG5hdGl2ZUtleXMoMSk7IH0pOwoKLy8gYE9iamVjdC5rZXlzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXMKJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRkFJTFNfT05fUFJJTUlUSVZFUyB9LCB7CiAga2V5czogZnVuY3Rpb24ga2V5cyhpdCkgewogICAgcmV0dXJuIG5hdGl2ZUtleXModG9PYmplY3QoaXQpKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QubG9va3VwLWdldHRlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0Lmxvb2t1cC1nZXR0ZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIEZPUkNFRCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mb3JjZWQtb2JqZWN0LXByb3RvdHlwZS1hY2Nlc3NvcnMtbWV0aG9kcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZm9yY2VkLW9iamVjdC1wcm90b3R5cGUtYWNjZXNzb3JzLW1ldGhvZHMuanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciB0b1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcmltaXRpdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIpOwp2YXIgZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIik7CnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIpLmY7CgovLyBgT2JqZWN0LnByb3RvdHlwZS5fX2xvb2t1cEdldHRlcl9fYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5fX2xvb2t1cEdldHRlcl9fCmlmIChERVNDUklQVE9SUykgewogICQoeyB0YXJnZXQ6ICdPYmplY3QnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwgewogICAgX19sb29rdXBHZXR0ZXJfXzogZnVuY3Rpb24gX19sb29rdXBHZXR0ZXJfXyhQKSB7CiAgICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7CiAgICAgIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTsKICAgICAgdmFyIGRlc2M7CiAgICAgIGRvIHsKICAgICAgICBpZiAoZGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBrZXkpKSByZXR1cm4gZGVzYy5nZXQ7CiAgICAgIH0gd2hpbGUgKE8gPSBnZXRQcm90b3R5cGVPZihPKSk7CiAgICB9CiAgfSk7Cn0KCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0Lmxvb2t1cC1zZXR0ZXIuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5sb29rdXAtc2V0dGVyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBGT1JDRUQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZm9yY2VkLW9iamVjdC1wcm90b3R5cGUtYWNjZXNzb3JzLW1ldGhvZHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1vYmplY3QtcHJvdG90eXBlLWFjY2Vzc29ycy1tZXRob2RzLmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgdG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanMiKTsKdmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiKS5mOwoKLy8gYE9iamVjdC5wcm90b3R5cGUuX19sb29rdXBTZXR0ZXJfX2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUuX19sb29rdXBTZXR0ZXJfXwppZiAoREVTQ1JJUFRPUlMpIHsKICAkKHsgdGFyZ2V0OiAnT2JqZWN0JywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHsKICAgIF9fbG9va3VwU2V0dGVyX186IGZ1bmN0aW9uIF9fbG9va3VwU2V0dGVyX18oUCkgewogICAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpOwogICAgICB2YXIga2V5ID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7CiAgICAgIHZhciBkZXNjOwogICAgICBkbyB7CiAgICAgICAgaWYgKGRlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywga2V5KSkgcmV0dXJuIGRlc2Muc2V0OwogICAgICB9IHdoaWxlIChPID0gZ2V0UHJvdG90eXBlT2YoTykpOwogICAgfQogIH0pOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIG9uRnJlZXplID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YS5qcyIpLm9uRnJlZXplOwp2YXIgRlJFRVpJTkcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnJlZXppbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZyZWV6aW5nLmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKCnZhciBuYXRpdmVQcmV2ZW50RXh0ZW5zaW9ucyA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uczsKdmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IG5hdGl2ZVByZXZlbnRFeHRlbnNpb25zKDEpOyB9KTsKCi8vIGBPYmplY3QucHJldmVudEV4dGVuc2lvbnNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QucHJldmVudGV4dGVuc2lvbnMKJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRkFJTFNfT05fUFJJTUlUSVZFUywgc2hhbTogIUZSRUVaSU5HIH0sIHsKICBwcmV2ZW50RXh0ZW5zaW9uczogZnVuY3Rpb24gcHJldmVudEV4dGVuc2lvbnMoaXQpIHsKICAgIHJldHVybiBuYXRpdmVQcmV2ZW50RXh0ZW5zaW9ucyAmJiBpc09iamVjdChpdCkgPyBuYXRpdmVQcmV2ZW50RXh0ZW5zaW9ucyhvbkZyZWV6ZShpdCkpIDogaXQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnNlYWwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5zZWFsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIG9uRnJlZXplID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YS5qcyIpLm9uRnJlZXplOwp2YXIgRlJFRVpJTkcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnJlZXppbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZyZWV6aW5nLmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKCnZhciBuYXRpdmVTZWFsID0gT2JqZWN0LnNlYWw7CnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBuYXRpdmVTZWFsKDEpOyB9KTsKCi8vIGBPYmplY3Quc2VhbGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5zZWFsCiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZBSUxTX09OX1BSSU1JVElWRVMsIHNoYW06ICFGUkVFWklORyB9LCB7CiAgc2VhbDogZnVuY3Rpb24gc2VhbChpdCkgewogICAgcmV0dXJuIG5hdGl2ZVNlYWwgJiYgaXNPYmplY3QoaXQpID8gbmF0aXZlU2VhbChvbkZyZWV6ZShpdCkpIDogaXQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5zZXQtcHJvdG90eXBlLW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzIik7CgovLyBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnNldHByb3RvdHlwZW9mCiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBzZXRQcm90b3R5cGVPZjogc2V0UHJvdG90eXBlT2YKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0LmpzIik7CnZhciByZWRlZmluZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUuanMiKTsKdmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcuanMiKTsKCi8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZwppZiAoIVRPX1NUUklOR19UQUdfU1VQUE9SVCkgewogIHJlZGVmaW5lKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIHRvU3RyaW5nLCB7IHVuc2FmZTogdHJ1ZSB9KTsKfQoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudmFsdWVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC52YWx1ZXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICR2YWx1ZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXRvLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtdG8tYXJyYXkuanMiKS52YWx1ZXM7CgovLyBgT2JqZWN0LnZhbHVlc2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC52YWx1ZXMKJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwgewogIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKE8pIHsKICAgIHJldHVybiAkdmFsdWVzKE8pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnBhcnNlLWZsb2F0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1mbG9hdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIHBhcnNlRmxvYXRJbXBsZW1lbnRhdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wYXJzZS1mbG9hdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGFyc2UtZmxvYXQuanMiKTsKCi8vIGBwYXJzZUZsb2F0YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcGFyc2VmbG9hdC1zdHJpbmcKJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiBwYXJzZUZsb2F0ICE9IHBhcnNlRmxvYXRJbXBsZW1lbnRhdGlvbiB9LCB7CiAgcGFyc2VGbG9hdDogcGFyc2VGbG9hdEltcGxlbWVudGF0aW9uCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1pbnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1pbnQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgcGFyc2VJbnRJbXBsZW1lbnRhdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wYXJzZS1pbnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhcnNlLWludC5qcyIpOwoKLy8gYHBhcnNlSW50YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcGFyc2VpbnQtc3RyaW5nLXJhZGl4CiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogcGFyc2VJbnQgIT0gcGFyc2VJbnRJbXBsZW1lbnRhdGlvbiB9LCB7CiAgcGFyc2VJbnQ6IHBhcnNlSW50SW1wbGVtZW50YXRpb24KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuYWxsLXNldHRsZWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5hbGwtc2V0dGxlZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiKTsKdmFyIHBlcmZvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGVyZm9ybSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGVyZm9ybS5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgUHJvbWlzZS5hbGxTZXR0bGVkYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS1hbGxTZXR0bGVkCiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSB9LCB7CiAgYWxsU2V0dGxlZDogZnVuY3Rpb24gYWxsU2V0dGxlZChpdGVyYWJsZSkgewogICAgdmFyIEMgPSB0aGlzOwogICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpOwogICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7CiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7CiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpOwogICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgIHZhciBjb3VudGVyID0gMDsKICAgICAgdmFyIHJlbWFpbmluZyA9IDE7CiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7CiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrOwogICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7CiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTsKICAgICAgICByZW1haW5pbmcrKzsKICAgICAgICBwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuOwogICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7CiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0geyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZTogdmFsdWUgfTsKICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTsKICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjsKICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlOwogICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGUgfTsKICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTsKICAgIH0pOwogICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7CiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIE5hdGl2ZVByb21pc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS1wcm9taXNlLWNvbnN0cnVjdG9yLmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKdmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIik7CnZhciBwcm9taXNlUmVzb2x2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZS5qcyIpOwp2YXIgcmVkZWZpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVkZWZpbmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIik7CgovLyBTYWZhcmkgYnVnIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDA4MjkKdmFyIE5PTl9HRU5FUklDID0gISFOYXRpdmVQcm9taXNlICYmIGZhaWxzKGZ1bmN0aW9uICgpIHsKICBOYXRpdmVQcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddLmNhbGwoeyB0aGVuOiBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTsKfSk7CgovLyBgUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmZpbmFsbHkKJCh7IHRhcmdldDogJ1Byb21pc2UnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBOT05fR0VORVJJQyB9LCB7CiAgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7CiAgICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBnZXRCdWlsdEluKCdQcm9taXNlJykpOwogICAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2Ygb25GaW5hbGx5ID09ICdmdW5jdGlvbic7CiAgICByZXR1cm4gdGhpcy50aGVuKAogICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHsKICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4geDsgfSk7CiAgICAgIH0gOiBvbkZpbmFsbHksCiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkgewogICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IGU7IH0pOwogICAgICB9IDogb25GaW5hbGx5CiAgICApOwogIH0KfSk7CgovLyBwYXRjaCBuYXRpdmUgUHJvbWlzZS5wcm90b3R5cGUgZm9yIG5hdGl2ZSBhc3luYyBmdW5jdGlvbnMKaWYgKCFJU19QVVJFICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlID09ICdmdW5jdGlvbicgJiYgIU5hdGl2ZVByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10pIHsKICByZWRlZmluZShOYXRpdmVQcm9taXNlLnByb3RvdHlwZSwgJ2ZpbmFsbHknLCBnZXRCdWlsdEluKCdQcm9taXNlJykucHJvdG90eXBlWydmaW5hbGx5J10pOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKdmFyIE5hdGl2ZVByb21pc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS1wcm9taXNlLWNvbnN0cnVjdG9yLmpzIik7CnZhciByZWRlZmluZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUuanMiKTsKdmFyIHJlZGVmaW5lQWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzIik7CnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMiKTsKdmFyIHNldFNwZWNpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzIik7CnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcyIpOwp2YXIgaW5zcGVjdFNvdXJjZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwp2YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uLmpzIik7CnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIpOwp2YXIgdGFzayA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90YXNrICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90YXNrLmpzIikuc2V0Owp2YXIgbWljcm90YXNrID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21pY3JvdGFzayAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzIik7CnZhciBwcm9taXNlUmVzb2x2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZS5qcyIpOwp2YXIgaG9zdFJlcG9ydEVycm9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9ob3N0LXJlcG9ydC1lcnJvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycy5qcyIpOwp2YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIpOwp2YXIgcGVyZm9ybSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wZXJmb3JtICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzIik7CnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIpOwp2YXIgaXNGb3JjZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtZm9yY2VkICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKdmFyIFY4X1ZFUlNJT04gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdjgtdmVyc2lvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdjgtdmVyc2lvbi5qcyIpOwoKdmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTsKdmFyIFBST01JU0UgPSAnUHJvbWlzZSc7CnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7CnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7CnZhciBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFBST01JU0UpOwp2YXIgUHJvbWlzZUNvbnN0cnVjdG9yID0gTmF0aXZlUHJvbWlzZTsKdmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7CnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDsKdmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzczsKdmFyICRmZXRjaCA9IGdldEJ1aWx0SW4oJ2ZldGNoJyk7CnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7CnZhciBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eTsKdmFyIElTX05PREUgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJzsKdmFyIERJU1BBVENIX0VWRU5UID0gISEoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgZ2xvYmFsLmRpc3BhdGNoRXZlbnQpOwp2YXIgVU5IQU5ETEVEX1JFSkVDVElPTiA9ICd1bmhhbmRsZWRyZWplY3Rpb24nOwp2YXIgUkVKRUNUSU9OX0hBTkRMRUQgPSAncmVqZWN0aW9uaGFuZGxlZCc7CnZhciBQRU5ESU5HID0gMDsKdmFyIEZVTEZJTExFRCA9IDE7CnZhciBSRUpFQ1RFRCA9IDI7CnZhciBIQU5ETEVEID0gMTsKdmFyIFVOSEFORExFRCA9IDI7CnZhciBJbnRlcm5hbCwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFByb21pc2VXcmFwcGVyLCBuYXRpdmVUaGVuOwoKdmFyIEZPUkNFRCA9IGlzRm9yY2VkKFBST01JU0UsIGZ1bmN0aW9uICgpIHsKICB2YXIgR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSA9IGluc3BlY3RTb3VyY2UoUHJvbWlzZUNvbnN0cnVjdG9yKSAhPT0gU3RyaW5nKFByb21pc2VDb25zdHJ1Y3Rvcik7CiAgaWYgKCFHTE9CQUxfQ09SRV9KU19QUk9NSVNFKSB7CiAgICAvLyBWOCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzCiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjUKICAgIC8vIFdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zCiAgICBpZiAoVjhfVkVSU0lPTiA9PT0gNjYpIHJldHVybiB0cnVlOwogICAgLy8gVW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdAogICAgaWYgKCFJU19OT0RFICYmIHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgIT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHRydWU7CiAgfQogIC8vIFdlIG5lZWQgUHJvbWlzZSNmaW5hbGx5IGluIHRoZSBwdXJlIHZlcnNpb24gZm9yIHByZXZlbnRpbmcgcHJvdG90eXBlIHBvbGx1dGlvbgogIGlmIChJU19QVVJFICYmICFQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlWydmaW5hbGx5J10pIHJldHVybiB0cnVlOwogIC8vIFdlIGNhbid0IHVzZSBAQHNwZWNpZXMgZmVhdHVyZSBkZXRlY3Rpb24gaW4gVjggc2luY2UgaXQgY2F1c2VzCiAgLy8gZGVvcHRpbWl6YXRpb24gYW5kIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uCiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3OQogIGlmIChWOF9WRVJTSU9OID49IDUxICYmIC9uYXRpdmUgY29kZS8udGVzdChQcm9taXNlQ29uc3RydWN0b3IpKSByZXR1cm4gZmFsc2U7CiAgLy8gRGV0ZWN0IGNvcnJlY3RuZXNzIG9mIHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnQKICB2YXIgcHJvbWlzZSA9IFByb21pc2VDb25zdHJ1Y3Rvci5yZXNvbHZlKDEpOwogIHZhciBGYWtlUHJvbWlzZSA9IGZ1bmN0aW9uIChleGVjKSB7CiAgICBleGVjKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTsKICB9OwogIHZhciBjb25zdHJ1Y3RvciA9IHByb21pc2UuY29uc3RydWN0b3IgPSB7fTsKICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IEZha2VQcm9taXNlOwogIHJldHVybiAhKHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pIGluc3RhbmNlb2YgRmFrZVByb21pc2UpOwp9KTsKCnZhciBJTkNPUlJFQ1RfSVRFUkFUSU9OID0gRk9SQ0VEIHx8ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7CiAgUHJvbWlzZUNvbnN0cnVjdG9yLmFsbChpdGVyYWJsZSlbJ2NhdGNoJ10oZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTsKfSk7CgovLyBoZWxwZXJzCnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7CiAgdmFyIHRoZW47CiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlOwp9OwoKdmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSwgaXNSZWplY3QpIHsKICBpZiAoc3RhdGUubm90aWZpZWQpIHJldHVybjsKICBzdGF0ZS5ub3RpZmllZCA9IHRydWU7CiAgdmFyIGNoYWluID0gc3RhdGUucmVhY3Rpb25zOwogIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7CiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTsKICAgIHZhciBvayA9IHN0YXRlLnN0YXRlID09IEZVTEZJTExFRDsKICAgIHZhciBpbmRleCA9IDA7CiAgICAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaAogICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGluZGV4KSB7CiAgICAgIHZhciByZWFjdGlvbiA9IGNoYWluW2luZGV4KytdOwogICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsOwogICAgICB2YXIgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmU7CiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7CiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47CiAgICAgIHZhciByZXN1bHQsIHRoZW4sIGV4aXRlZDsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoaGFuZGxlcikgewogICAgICAgICAgaWYgKCFvaykgewogICAgICAgICAgICBpZiAoc3RhdGUucmVqZWN0aW9uID09PSBVTkhBTkRMRUQpIG9uSGFuZGxlVW5oYW5kbGVkKHByb21pc2UsIHN0YXRlKTsKICAgICAgICAgICAgc3RhdGUucmVqZWN0aW9uID0gSEFORExFRDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTsKICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTsKICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIGNhbiB0aHJvdwogICAgICAgICAgICBpZiAoZG9tYWluKSB7CiAgICAgICAgICAgICAgZG9tYWluLmV4aXQoKTsKICAgICAgICAgICAgICBleGl0ZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7CiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7CiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpIHsKICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKSBkb21haW4uZXhpdCgpOwogICAgICAgIHJlamVjdChlcnJvcik7CiAgICAgIH0KICAgIH0KICAgIHN0YXRlLnJlYWN0aW9ucyA9IFtdOwogICAgc3RhdGUubm90aWZpZWQgPSBmYWxzZTsKICAgIGlmIChpc1JlamVjdCAmJiAhc3RhdGUucmVqZWN0aW9uKSBvblVuaGFuZGxlZChwcm9taXNlLCBzdGF0ZSk7CiAgfSk7Cn07Cgp2YXIgZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uIChuYW1lLCBwcm9taXNlLCByZWFzb24pIHsKICB2YXIgZXZlbnQsIGhhbmRsZXI7CiAgaWYgKERJU1BBVENIX0VWRU5UKSB7CiAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpOwogICAgZXZlbnQucHJvbWlzZSA9IHByb21pc2U7CiAgICBldmVudC5yZWFzb24gPSByZWFzb247CiAgICBldmVudC5pbml0RXZlbnQobmFtZSwgZmFsc2UsIHRydWUpOwogICAgZ2xvYmFsLmRpc3BhdGNoRXZlbnQoZXZlbnQpOwogIH0gZWxzZSBldmVudCA9IHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiByZWFzb24gfTsKICBpZiAoaGFuZGxlciA9IGdsb2JhbFsnb24nICsgbmFtZV0pIGhhbmRsZXIoZXZlbnQpOwogIGVsc2UgaWYgKG5hbWUgPT09IFVOSEFORExFRF9SRUpFQ1RJT04pIGhvc3RSZXBvcnRFcnJvcnMoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHJlYXNvbik7Cn07Cgp2YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUpIHsKICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTsKICAgIHZhciBJU19VTkhBTkRMRUQgPSBpc1VuaGFuZGxlZChzdGF0ZSk7CiAgICB2YXIgcmVzdWx0OwogICAgaWYgKElTX1VOSEFORExFRCkgewogICAgICByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoSVNfTk9ERSkgewogICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7CiAgICAgICAgfSBlbHNlIGRpc3BhdGNoRXZlbnQoVU5IQU5ETEVEX1JFSkVDVElPTiwgcHJvbWlzZSwgdmFsdWUpOwogICAgICB9KTsKICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGQKICAgICAgc3RhdGUucmVqZWN0aW9uID0gSVNfTk9ERSB8fCBpc1VuaGFuZGxlZChzdGF0ZSkgPyBVTkhBTkRMRUQgOiBIQU5ETEVEOwogICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQudmFsdWU7CiAgICB9CiAgfSk7Cn07Cgp2YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHsKICByZXR1cm4gc3RhdGUucmVqZWN0aW9uICE9PSBIQU5ETEVEICYmICFzdGF0ZS5wYXJlbnQ7Cn07Cgp2YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUpIHsKICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7CiAgICBpZiAoSVNfTk9ERSkgewogICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTsKICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFJFSkVDVElPTl9IQU5ETEVELCBwcm9taXNlLCBzdGF0ZS52YWx1ZSk7CiAgfSk7Cn07Cgp2YXIgYmluZCA9IGZ1bmN0aW9uIChmbiwgcHJvbWlzZSwgc3RhdGUsIHVud3JhcCkgewogIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHsKICAgIGZuKHByb21pc2UsIHN0YXRlLCB2YWx1ZSwgdW53cmFwKTsKICB9Owp9OwoKdmFyIGludGVybmFsUmVqZWN0ID0gZnVuY3Rpb24gKHByb21pc2UsIHN0YXRlLCB2YWx1ZSwgdW53cmFwKSB7CiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjsKICBzdGF0ZS5kb25lID0gdHJ1ZTsKICBpZiAodW53cmFwKSBzdGF0ZSA9IHVud3JhcDsKICBzdGF0ZS52YWx1ZSA9IHZhbHVlOwogIHN0YXRlLnN0YXRlID0gUkVKRUNURUQ7CiAgbm90aWZ5KHByb21pc2UsIHN0YXRlLCB0cnVlKTsKfTsKCnZhciBpbnRlcm5hbFJlc29sdmUgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUsIHZhbHVlLCB1bndyYXApIHsKICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuOwogIHN0YXRlLmRvbmUgPSB0cnVlOwogIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwOwogIHRyeSB7CiAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcigiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGYiKTsKICAgIHZhciB0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSk7CiAgICBpZiAodGhlbikgewogICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkgewogICAgICAgIHZhciB3cmFwcGVyID0geyBkb25lOiBmYWxzZSB9OwogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsCiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBwcm9taXNlLCB3cmFwcGVyLCBzdGF0ZSksCiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZWplY3QsIHByb21pc2UsIHdyYXBwZXIsIHN0YXRlKQogICAgICAgICAgKTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgaW50ZXJuYWxSZWplY3QocHJvbWlzZSwgd3JhcHBlciwgZXJyb3IsIHN0YXRlKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgc3RhdGUudmFsdWUgPSB2YWx1ZTsKICAgICAgc3RhdGUuc3RhdGUgPSBGVUxGSUxMRUQ7CiAgICAgIG5vdGlmeShwcm9taXNlLCBzdGF0ZSwgZmFsc2UpOwogICAgfQogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICBpbnRlcm5hbFJlamVjdChwcm9taXNlLCB7IGRvbmU6IGZhbHNlIH0sIGVycm9yLCBzdGF0ZSk7CiAgfQp9OwoKLy8gY29uc3RydWN0b3IgcG9seWZpbGwKaWYgKEZPUkNFRCkgewogIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpCiAgUHJvbWlzZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikgewogICAgYW5JbnN0YW5jZSh0aGlzLCBQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UpOwogICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTsKICAgIEludGVybmFsLmNhbGwodGhpcyk7CiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOwogICAgdHJ5IHsKICAgICAgZXhlY3V0b3IoYmluZChpbnRlcm5hbFJlc29sdmUsIHRoaXMsIHN0YXRlKSwgYmluZChpbnRlcm5hbFJlamVjdCwgdGhpcywgc3RhdGUpKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGludGVybmFsUmVqZWN0KHRoaXMsIHN0YXRlLCBlcnJvcik7CiAgICB9CiAgfTsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMKICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHsKICAgIHNldEludGVybmFsU3RhdGUodGhpcywgewogICAgICB0eXBlOiBQUk9NSVNFLAogICAgICBkb25lOiBmYWxzZSwKICAgICAgbm90aWZpZWQ6IGZhbHNlLAogICAgICBwYXJlbnQ6IGZhbHNlLAogICAgICByZWFjdGlvbnM6IFtdLAogICAgICByZWplY3Rpb246IGZhbHNlLAogICAgICBzdGF0ZTogUEVORElORywKICAgICAgdmFsdWU6IHVuZGVmaW5lZAogICAgfSk7CiAgfTsKICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZWRlZmluZUFsbChQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlLCB7CiAgICAvLyBgUHJvbWlzZS5wcm90b3R5cGUudGhlbmAgbWV0aG9kCiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS50aGVuCiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7CiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpOwogICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yKSk7CiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7CiAgICAgIHJlYWN0aW9uLmZhaWwgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7CiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IElTX05PREUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDsKICAgICAgc3RhdGUucGFyZW50ID0gdHJ1ZTsKICAgICAgc3RhdGUucmVhY3Rpb25zLnB1c2gocmVhY3Rpb24pOwogICAgICBpZiAoc3RhdGUuc3RhdGUgIT0gUEVORElORykgbm90aWZ5KHRoaXMsIHN0YXRlLCBmYWxzZSk7CiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlOwogICAgfSwKICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS5jYXRjaGAgbWV0aG9kCiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5jYXRjaAogICAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHsKICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpOwogICAgfQogIH0pOwogIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTsKICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUocHJvbWlzZSk7CiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlOwogICAgdGhpcy5yZXNvbHZlID0gYmluZChpbnRlcm5hbFJlc29sdmUsIHByb21pc2UsIHN0YXRlKTsKICAgIHRoaXMucmVqZWN0ID0gYmluZChpbnRlcm5hbFJlamVjdCwgcHJvbWlzZSwgc3RhdGUpOwogIH07CiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHsKICAgIHJldHVybiBDID09PSBQcm9taXNlQ29uc3RydWN0b3IgfHwgQyA9PT0gUHJvbWlzZVdyYXBwZXIKICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQykKICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7CiAgfTsKCiAgaWYgKCFJU19QVVJFICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlID09ICdmdW5jdGlvbicpIHsKICAgIG5hdGl2ZVRoZW4gPSBOYXRpdmVQcm9taXNlLnByb3RvdHlwZS50aGVuOwoKICAgIC8vIHdyYXAgbmF0aXZlIFByb21pc2UjdGhlbiBmb3IgbmF0aXZlIGFzeW5jIGZ1bmN0aW9ucwogICAgcmVkZWZpbmUoTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUsICd0aGVuJywgZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkgewogICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICBuYXRpdmVUaGVuLmNhbGwodGhhdCwgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgfSkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7CiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjQwCiAgICB9LCB7IHVuc2FmZTogdHJ1ZSB9KTsKCiAgICAvLyB3cmFwIGZldGNoIHJlc3VsdAogICAgaWYgKHR5cGVvZiAkZmV0Y2ggPT0gJ2Z1bmN0aW9uJykgJCh7IGdsb2JhbDogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgZm9yY2VkOiB0cnVlIH0sIHsKICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgIGZldGNoOiBmdW5jdGlvbiBmZXRjaChpbnB1dCAvKiAsIGluaXQgKi8pIHsKICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoUHJvbWlzZUNvbnN0cnVjdG9yLCAkZmV0Y2guYXBwbHkoZ2xvYmFsLCBhcmd1bWVudHMpKTsKICAgICAgfQogICAgfSk7CiAgfQp9CgokKHsgZ2xvYmFsOiB0cnVlLCB3cmFwOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7CiAgUHJvbWlzZTogUHJvbWlzZUNvbnN0cnVjdG9yCn0pOwoKc2V0VG9TdHJpbmdUYWcoUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFLCBmYWxzZSwgdHJ1ZSk7CnNldFNwZWNpZXMoUFJPTUlTRSk7CgpQcm9taXNlV3JhcHBlciA9IGdldEJ1aWx0SW4oUFJPTUlTRSk7CgovLyBzdGF0aWNzCiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHsKICAvLyBgUHJvbWlzZS5yZWplY3RgIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucmVqZWN0CiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3QocikgewogICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTsKICAgIGNhcGFiaWxpdHkucmVqZWN0LmNhbGwodW5kZWZpbmVkLCByKTsKICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7CiAgfQp9KTsKCiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB8fCBGT1JDRUQgfSwgewogIC8vIGBQcm9taXNlLnJlc29sdmVgIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucmVzb2x2ZQogIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkgewogICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKElTX1BVUkUgJiYgdGhpcyA9PT0gUHJvbWlzZVdyYXBwZXIgPyBQcm9taXNlQ29uc3RydWN0b3IgOiB0aGlzLCB4KTsKICB9Cn0pOwoKJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHsKICAvLyBgUHJvbWlzZS5hbGxgIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UuYWxsCiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHsKICAgIHZhciBDID0gdGhpczsKICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7CiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTsKICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDsKICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHsKICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpOwogICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgIHZhciBjb3VudGVyID0gMDsKICAgICAgdmFyIHJlbWFpbmluZyA9IDE7CiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7CiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrOwogICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7CiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTsKICAgICAgICByZW1haW5pbmcrKzsKICAgICAgICAkcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjsKICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlOwogICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlOwogICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpOwogICAgICAgIH0sIHJlamVjdCk7CiAgICAgIH0pOwogICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7CiAgICB9KTsKICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpOwogICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTsKICB9LAogIC8vIGBQcm9taXNlLnJhY2VgIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucmFjZQogIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpIHsKICAgIHZhciBDID0gdGhpczsKICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7CiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7CiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7CiAgICAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTsKICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHsKICAgICAgICAkcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgfSk7CiAgICB9KTsKICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpOwogICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmFwcGx5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuYXBwbHkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7Cgp2YXIgbmF0aXZlQXBwbHkgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ2FwcGx5Jyk7CnZhciBmdW5jdGlvbkFwcGx5ID0gRnVuY3Rpb24uYXBwbHk7CgovLyBNUyBFZGdlIGFyZ3VtZW50c0xpc3QgYXJndW1lbnQgaXMgb3B0aW9uYWwKdmFyIE9QVElPTkFMX0FSR1VNRU5UU19MSVNUID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsKICBuYXRpdmVBcHBseShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pOwp9KTsKCi8vIGBSZWZsZWN0LmFwcGx5YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVmbGVjdC5hcHBseQokKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogT1BUSU9OQUxfQVJHVU1FTlRTX0xJU1QgfSwgewogIGFwcGx5OiBmdW5jdGlvbiBhcHBseSh0YXJnZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRzTGlzdCkgewogICAgYUZ1bmN0aW9uKHRhcmdldCk7CiAgICBhbk9iamVjdChhcmd1bWVudHNMaXN0KTsKICAgIHJldHVybiBuYXRpdmVBcHBseQogICAgICA/IG5hdGl2ZUFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KQogICAgICA6IGZ1bmN0aW9uQXBwbHkuY2FsbCh0YXJnZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRzTGlzdCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5jb25zdHJ1Y3QuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuY29uc3RydWN0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiKTsKdmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7Cgp2YXIgbmF0aXZlQ29uc3RydWN0ID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdjb25zdHJ1Y3QnKTsKCi8vIGBSZWZsZWN0LmNvbnN0cnVjdGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuY29uc3RydWN0Ci8vIE1TIEVkZ2Ugc3VwcG9ydHMgb25seSAyIGFyZ3VtZW50cyBhbmQgYXJndW1lbnRzTGlzdCBhcmd1bWVudCBpcyBvcHRpb25hbAovLyBGRiBOaWdodGx5IHNldHMgdGhpcmQgYXJndW1lbnQgYXMgYG5ldy50YXJnZXRgLCBidXQgZG9lcyBub3QgY3JlYXRlIGB0aGlzYCBmcm9tIGl0CnZhciBORVdfVEFSR0VUX0JVRyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsKICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9CiAgcmV0dXJuICEobmF0aXZlQ29uc3RydWN0KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgW10sIEYpIGluc3RhbmNlb2YgRik7Cn0pOwp2YXIgQVJHU19CVUcgPSAhZmFpbHMoZnVuY3Rpb24gKCkgewogIG5hdGl2ZUNvbnN0cnVjdChmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pOwp9KTsKdmFyIEZPUkNFRCA9IE5FV19UQVJHRVRfQlVHIHx8IEFSR1NfQlVHOwoKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCwgc2hhbTogRk9SQ0VEIH0sIHsKICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIGNvbnN0cnVjdChUYXJnZXQsIGFyZ3MgLyogLCBuZXdUYXJnZXQgKi8pIHsKICAgIGFGdW5jdGlvbihUYXJnZXQpOwogICAgYW5PYmplY3QoYXJncyk7CiAgICB2YXIgbmV3VGFyZ2V0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyBUYXJnZXQgOiBhRnVuY3Rpb24oYXJndW1lbnRzWzJdKTsKICAgIGlmIChBUkdTX0JVRyAmJiAhTkVXX1RBUkdFVF9CVUcpIHJldHVybiBuYXRpdmVDb25zdHJ1Y3QoVGFyZ2V0LCBhcmdzLCBuZXdUYXJnZXQpOwogICAgaWYgKFRhcmdldCA9PSBuZXdUYXJnZXQpIHsKICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBvcHRpbWl6YXRpb24gZm9yIDAtNCBhcmd1bWVudHMKICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkgewogICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBUYXJnZXQoKTsKICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0pOwogICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSk7CiAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTsKICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pOwogICAgICB9CiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgbG90IG9mIGFyZ3VtZW50cyBjYXNlCiAgICAgIHZhciAkYXJncyA9IFtudWxsXTsKICAgICAgJGFyZ3MucHVzaC5hcHBseSgkYXJncywgYXJncyk7CiAgICAgIHJldHVybiBuZXcgKGJpbmQuYXBwbHkoVGFyZ2V0LCAkYXJncykpKCk7CiAgICB9CiAgICAvLyB3aXRoIGFsdGVyZWQgbmV3VGFyZ2V0LCBub3Qgc3VwcG9ydCBidWlsdC1pbiBjb25zdHJ1Y3RvcnMKICAgIHZhciBwcm90byA9IG5ld1RhcmdldC5wcm90b3R5cGU7CiAgICB2YXIgaW5zdGFuY2UgPSBjcmVhdGUoaXNPYmplY3QocHJvdG8pID8gcHJvdG8gOiBPYmplY3QucHJvdG90eXBlKTsKICAgIHZhciByZXN1bHQgPSBGdW5jdGlvbi5hcHBseS5jYWxsKFRhcmdldCwgaW5zdGFuY2UsIGFyZ3MpOwogICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiBpbnN0YW5jZTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmRlZmluZS1wcm9wZXJ0eS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciB0b1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcmltaXRpdmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CgovLyBNUyBFZGdlIGhhcyBicm9rZW4gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSAtIHRocm93aW5nIGluc3RlYWQgb2YgcmV0dXJuaW5nIGZhbHNlCnZhciBFUlJPUl9JTlNURUFEX09GX0ZBTFNFID0gZmFpbHMoZnVuY3Rpb24gKCkgewogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZgogIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoZGVmaW5lUHJvcGVydHlNb2R1bGUuZih7fSwgMSwgeyB2YWx1ZTogMSB9KSwgMSwgeyB2YWx1ZTogMiB9KTsKfSk7CgovLyBgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuZGVmaW5lcHJvcGVydHkKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEVSUk9SX0lOU1RFQURfT0ZfRkFMU0UsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7CiAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpIHsKICAgIGFuT2JqZWN0KHRhcmdldCk7CiAgICB2YXIga2V5ID0gdG9QcmltaXRpdmUocHJvcGVydHlLZXksIHRydWUpOwogICAgYW5PYmplY3QoYXR0cmlidXRlcyk7CiAgICB0cnkgewogICAgICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKHRhcmdldCwga2V5LCBhdHRyaWJ1dGVzKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5kZWxldGUtcHJvcGVydHkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIikuZjsKCi8vIGBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVmbGVjdC5kZWxldGVwcm9wZXJ0eQokKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwgewogIGRlbGV0ZVByb3BlcnR5OiBmdW5jdGlvbiBkZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5KSB7CiAgICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7CiAgICByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci5jb25maWd1cmFibGUgPyBmYWxzZSA6IGRlbGV0ZSB0YXJnZXRbcHJvcGVydHlLZXldOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIik7CgovLyBgUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWZsZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvcgokKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7CiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSkgewogICAgcmV0dXJuIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIG9iamVjdEdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIpOwp2YXIgQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIik7CgovLyBgUmVmbGVjdC5nZXRQcm90b3R5cGVPZmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuZ2V0cHJvdG90eXBlb2YKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlLCBzaGFtOiAhQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSIH0sIHsKICBnZXRQcm90b3R5cGVPZjogZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSB7CiAgICByZXR1cm4gb2JqZWN0R2V0UHJvdG90eXBlT2YoYW5PYmplY3QodGFyZ2V0KSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5nZXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuZ2V0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIik7CnZhciBnZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiKTsKCi8vIGBSZWZsZWN0LmdldGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuZ2V0CmZ1bmN0aW9uIGdldCh0YXJnZXQsIHByb3BlcnR5S2V5IC8qICwgcmVjZWl2ZXIgKi8pIHsKICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHRhcmdldCA6IGFyZ3VtZW50c1syXTsKICB2YXIgZGVzY3JpcHRvciwgcHJvdG90eXBlOwogIGlmIChhbk9iamVjdCh0YXJnZXQpID09PSByZWNlaXZlcikgcmV0dXJuIHRhcmdldFtwcm9wZXJ0eUtleV07CiAgaWYgKGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZih0YXJnZXQsIHByb3BlcnR5S2V5KSkgcmV0dXJuIGhhcyhkZXNjcmlwdG9yLCAndmFsdWUnKQogICAgPyBkZXNjcmlwdG9yLnZhbHVlCiAgICA6IGRlc2NyaXB0b3IuZ2V0ID09PSB1bmRlZmluZWQKICAgICAgPyB1bmRlZmluZWQKICAgICAgOiBkZXNjcmlwdG9yLmdldC5jYWxsKHJlY2VpdmVyKTsKICBpZiAoaXNPYmplY3QocHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSkpIHJldHVybiBnZXQocHJvdG90eXBlLCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpOwp9CgokKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwgewogIGdldDogZ2V0Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0Lmhhcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5oYXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CgovLyBgUmVmbGVjdC5oYXNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWZsZWN0LmhhcwokKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwgewogIGhhczogZnVuY3Rpb24gaGFzKHRhcmdldCwgcHJvcGVydHlLZXkpIHsKICAgIHJldHVybiBwcm9wZXJ0eUtleSBpbiB0YXJnZXQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5pcy1leHRlbnNpYmxlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5pcy1leHRlbnNpYmxlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7Cgp2YXIgb2JqZWN0SXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTsKCi8vIGBSZWZsZWN0LmlzRXh0ZW5zaWJsZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuaXNleHRlbnNpYmxlCiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7CiAgaXNFeHRlbnNpYmxlOiBmdW5jdGlvbiBpc0V4dGVuc2libGUodGFyZ2V0KSB7CiAgICBhbk9iamVjdCh0YXJnZXQpOwogICAgcmV0dXJuIG9iamVjdElzRXh0ZW5zaWJsZSA/IG9iamVjdElzRXh0ZW5zaWJsZSh0YXJnZXQpIDogdHJ1ZTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0Lm93bi1rZXlzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3Qub3duLWtleXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIG93bktleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb3duLWtleXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIik7CgovLyBgUmVmbGVjdC5vd25LZXlzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVmbGVjdC5vd25rZXlzCiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7CiAgb3duS2V5czogb3duS2V5cwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QucHJldmVudC1leHRlbnNpb25zLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIEZSRUVaSU5HID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZyZWV6aW5nICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mcmVlemluZy5qcyIpOwoKLy8gYFJlZmxlY3QucHJldmVudEV4dGVuc2lvbnNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWZsZWN0LnByZXZlbnRleHRlbnNpb25zCiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSwgc2hhbTogIUZSRUVaSU5HIH0sIHsKICBwcmV2ZW50RXh0ZW5zaW9uczogZnVuY3Rpb24gcHJldmVudEV4dGVuc2lvbnModGFyZ2V0KSB7CiAgICBhbk9iamVjdCh0YXJnZXQpOwogICAgdHJ5IHsKICAgICAgdmFyIG9iamVjdFByZXZlbnRFeHRlbnNpb25zID0gZ2V0QnVpbHRJbignT2JqZWN0JywgJ3ByZXZlbnRFeHRlbnNpb25zJyk7CiAgICAgIGlmIChvYmplY3RQcmV2ZW50RXh0ZW5zaW9ucykgb2JqZWN0UHJldmVudEV4dGVuc2lvbnModGFyZ2V0KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBhUG9zc2libGVQcm90b3R5cGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlLmpzIik7CnZhciBvYmplY3RTZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanMiKTsKCi8vIGBSZWZsZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVmbGVjdC5zZXRwcm90b3R5cGVvZgppZiAob2JqZWN0U2V0UHJvdG90eXBlT2YpICQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7CiAgc2V0UHJvdG90eXBlT2Y6IGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pIHsKICAgIGFuT2JqZWN0KHRhcmdldCk7CiAgICBhUG9zc2libGVQcm90b3R5cGUocHJvdG8pOwogICAgdHJ5IHsKICAgICAgb2JqZWN0U2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90byk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3Quc2V0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LnNldC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgaGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiKTsKdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIik7CnZhciBnZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiKTsKdmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiKTsKCi8vIGBSZWZsZWN0LnNldGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3Quc2V0CmZ1bmN0aW9uIHNldCh0YXJnZXQsIHByb3BlcnR5S2V5LCBWIC8qICwgcmVjZWl2ZXIgKi8pIHsKICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgNCA/IHRhcmdldCA6IGFyZ3VtZW50c1szXTsKICB2YXIgb3duRGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KTsKICB2YXIgZXhpc3RpbmdEZXNjcmlwdG9yLCBwcm90b3R5cGU7CiAgaWYgKCFvd25EZXNjcmlwdG9yKSB7CiAgICBpZiAoaXNPYmplY3QocHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSkpIHsKICAgICAgcmV0dXJuIHNldChwcm90b3R5cGUsIHByb3BlcnR5S2V5LCBWLCByZWNlaXZlcik7CiAgICB9CiAgICBvd25EZXNjcmlwdG9yID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDApOwogIH0KICBpZiAoaGFzKG93bkRlc2NyaXB0b3IsICd2YWx1ZScpKSB7CiAgICBpZiAob3duRGVzY3JpcHRvci53cml0YWJsZSA9PT0gZmFsc2UgfHwgIWlzT2JqZWN0KHJlY2VpdmVyKSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGV4aXN0aW5nRGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mKHJlY2VpdmVyLCBwcm9wZXJ0eUtleSkpIHsKICAgICAgaWYgKGV4aXN0aW5nRGVzY3JpcHRvci5nZXQgfHwgZXhpc3RpbmdEZXNjcmlwdG9yLnNldCB8fCBleGlzdGluZ0Rlc2NyaXB0b3Iud3JpdGFibGUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7CiAgICAgIGV4aXN0aW5nRGVzY3JpcHRvci52YWx1ZSA9IFY7CiAgICAgIGRlZmluZVByb3BlcnR5TW9kdWxlLmYocmVjZWl2ZXIsIHByb3BlcnR5S2V5LCBleGlzdGluZ0Rlc2NyaXB0b3IpOwogICAgfSBlbHNlIGRlZmluZVByb3BlcnR5TW9kdWxlLmYocmVjZWl2ZXIsIHByb3BlcnR5S2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgVikpOwogICAgcmV0dXJuIHRydWU7CiAgfQogIHJldHVybiBvd25EZXNjcmlwdG9yLnNldCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiAob3duRGVzY3JpcHRvci5zZXQuY2FsbChyZWNlaXZlciwgViksIHRydWUpOwp9CgovLyBNUyBFZGdlIDE3LTE4IFJlZmxlY3Quc2V0IGFsbG93cyBzZXR0aW5nIHRoZSBwcm9wZXJ0eSB0byBvYmplY3QKLy8gd2l0aCBub24td3JpdGFibGUgcHJvcGVydHkgb24gdGhlIHByb3RvdHlwZQp2YXIgTVNfRURHRV9CVUcgPSBmYWlscyhmdW5jdGlvbiAoKSB7CiAgdmFyIG9iamVjdCA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmYoe30sICdhJywgeyBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmCiAgcmV0dXJuIFJlZmxlY3Quc2V0KGdldFByb3RvdHlwZU9mKG9iamVjdCksICdhJywgMSwgb2JqZWN0KSAhPT0gZmFsc2U7Cn0pOwoKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE1TX0VER0VfQlVHIH0sIHsKICBzZXQ6IHNldAp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBpc0ZvcmNlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1mb3JjZWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWZvcmNlZC5qcyIpOwp2YXIgaW5oZXJpdElmUmVxdWlyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZC5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpLmY7CnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIpLmY7CnZhciBpc1JlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1yZWdleHAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qcyIpOwp2YXIgZ2V0RmxhZ3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZmxhZ3MuanMiKTsKdmFyIHJlZGVmaW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZGVmaW5lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciBzZXRTcGVjaWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC1zcGVjaWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKdmFyIE1BVENIID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaCcpOwp2YXIgTmF0aXZlUmVnRXhwID0gZ2xvYmFsLlJlZ0V4cDsKdmFyIFJlZ0V4cFByb3RvdHlwZSA9IE5hdGl2ZVJlZ0V4cC5wcm90b3R5cGU7CnZhciByZTEgPSAvYS9nOwp2YXIgcmUyID0gL2EvZzsKCi8vICJuZXciIHNob3VsZCBjcmVhdGUgYSBuZXcgb2JqZWN0LCBvbGQgd2Via2l0IGJ1Zwp2YXIgQ09SUkVDVF9ORVcgPSBuZXcgTmF0aXZlUmVnRXhwKHJlMSkgIT09IHJlMTsKCnZhciBGT1JDRUQgPSBERVNDUklQVE9SUyAmJiBpc0ZvcmNlZCgnUmVnRXhwJywgKCFDT1JSRUNUX05FVyB8fCBmYWlscyhmdW5jdGlvbiAoKSB7CiAgcmUyW01BVENIXSA9IGZhbHNlOwogIC8vIFJlZ0V4cCBjb25zdHJ1Y3RvciBjYW4gYWx0ZXIgZmxhZ3MgYW5kIElzUmVnRXhwIHdvcmtzIGNvcnJlY3Qgd2l0aCBAQG1hdGNoCiAgcmV0dXJuIE5hdGl2ZVJlZ0V4cChyZTEpICE9IHJlMSB8fCBOYXRpdmVSZWdFeHAocmUyKSA9PSByZTIgfHwgTmF0aXZlUmVnRXhwKHJlMSwgJ2knKSAhPSAnL2EvaSc7Cn0pKSk7CgovLyBgUmVnRXhwYCBjb25zdHJ1Y3RvcgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAtY29uc3RydWN0b3IKaWYgKEZPUkNFRCkgewogIHZhciBSZWdFeHBXcmFwcGVyID0gZnVuY3Rpb24gUmVnRXhwKHBhdHRlcm4sIGZsYWdzKSB7CiAgICB2YXIgdGhpc0lzUmVnRXhwID0gdGhpcyBpbnN0YW5jZW9mIFJlZ0V4cFdyYXBwZXI7CiAgICB2YXIgcGF0dGVybklzUmVnRXhwID0gaXNSZWdFeHAocGF0dGVybik7CiAgICB2YXIgZmxhZ3NBcmVVbmRlZmluZWQgPSBmbGFncyA9PT0gdW5kZWZpbmVkOwogICAgcmV0dXJuICF0aGlzSXNSZWdFeHAgJiYgcGF0dGVybklzUmVnRXhwICYmIHBhdHRlcm4uY29uc3RydWN0b3IgPT09IFJlZ0V4cFdyYXBwZXIgJiYgZmxhZ3NBcmVVbmRlZmluZWQgPyBwYXR0ZXJuCiAgICAgIDogaW5oZXJpdElmUmVxdWlyZWQoQ09SUkVDVF9ORVcKICAgICAgICA/IG5ldyBOYXRpdmVSZWdFeHAocGF0dGVybklzUmVnRXhwICYmICFmbGFnc0FyZVVuZGVmaW5lZCA/IHBhdHRlcm4uc291cmNlIDogcGF0dGVybiwgZmxhZ3MpCiAgICAgICAgOiBOYXRpdmVSZWdFeHAoKHBhdHRlcm5Jc1JlZ0V4cCA9IHBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHBXcmFwcGVyKQogICAgICAgICAgPyBwYXR0ZXJuLnNvdXJjZQogICAgICAgICAgOiBwYXR0ZXJuLCBwYXR0ZXJuSXNSZWdFeHAgJiYgZmxhZ3NBcmVVbmRlZmluZWQgPyBnZXRGbGFncy5jYWxsKHBhdHRlcm4pIDogZmxhZ3MpCiAgICAgICwgdGhpc0lzUmVnRXhwID8gdGhpcyA6IFJlZ0V4cFByb3RvdHlwZSwgUmVnRXhwV3JhcHBlcik7CiAgfTsKICB2YXIgcHJveHkgPSBmdW5jdGlvbiAoa2V5KSB7CiAgICBrZXkgaW4gUmVnRXhwV3JhcHBlciB8fCBkZWZpbmVQcm9wZXJ0eShSZWdFeHBXcmFwcGVyLCBrZXksIHsKICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE5hdGl2ZVJlZ0V4cFtrZXldOyB9LAogICAgICBzZXQ6IGZ1bmN0aW9uIChpdCkgeyBOYXRpdmVSZWdFeHBba2V5XSA9IGl0OyB9CiAgICB9KTsKICB9OwogIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhOYXRpdmVSZWdFeHApOwogIHZhciBpbmRleCA9IDA7CiAgd2hpbGUgKGtleXMubGVuZ3RoID4gaW5kZXgpIHByb3h5KGtleXNbaW5kZXgrK10pOwogIFJlZ0V4cFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlZ0V4cFdyYXBwZXI7CiAgUmVnRXhwV3JhcHBlci5wcm90b3R5cGUgPSBSZWdFeHBQcm90b3R5cGU7CiAgcmVkZWZpbmUoZ2xvYmFsLCAnUmVnRXhwJywgUmVnRXhwV3JhcHBlcik7Cn0KCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWdldC1yZWdleHAtQEBzcGVjaWVzCnNldFNwZWNpZXMoJ1JlZ0V4cCcpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBleGVjID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy5qcyIpOwoKJCh7IHRhcmdldDogJ1JlZ0V4cCcsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IC8uLy5leGVjICE9PSBleGVjIH0sIHsKICBleGVjOiBleGVjCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZmxhZ3MuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZmxhZ3MuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBvYmplY3REZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIik7CnZhciByZWdFeHBGbGFncyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZmxhZ3MgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1mbGFncy5qcyIpOwoKLy8gYFJlZ0V4cC5wcm90b3R5cGUuZmxhZ3NgIGdldHRlcgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXQtcmVnZXhwLnByb3RvdHlwZS5mbGFncwppZiAoREVTQ1JJUFRPUlMgJiYgLy4vZy5mbGFncyAhPSAnZycpIHsKICBvYmplY3REZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKFJlZ0V4cC5wcm90b3R5cGUsICdmbGFncycsIHsKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgIGdldDogcmVnRXhwRmxhZ3MKICB9KTsKfQoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIHJlZGVmaW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZGVmaW5lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgZmxhZ3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZmxhZ3MuanMiKTsKCnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnOwp2YXIgUmVnRXhwUHJvdG90eXBlID0gUmVnRXhwLnByb3RvdHlwZTsKdmFyIG5hdGl2ZVRvU3RyaW5nID0gUmVnRXhwUHJvdG90eXBlW1RPX1NUUklOR107Cgp2YXIgTk9UX0dFTkVSSUMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IHJldHVybiBuYXRpdmVUb1N0cmluZy5jYWxsKHsgc291cmNlOiAnYScsIGZsYWdzOiAnYicgfSkgIT0gJy9hL2InOyB9KTsKLy8gRkY0NC0gUmVnRXhwI3RvU3RyaW5nIGhhcyBhIHdyb25nIG5hbWUKdmFyIElOQ09SUkVDVF9OQU1FID0gbmF0aXZlVG9TdHJpbmcubmFtZSAhPSBUT19TVFJJTkc7CgovLyBgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmcKaWYgKE5PVF9HRU5FUklDIHx8IElOQ09SUkVDVF9OQU1FKSB7CiAgcmVkZWZpbmUoUmVnRXhwLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpIHsKICAgIHZhciBSID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgcCA9IFN0cmluZyhSLnNvdXJjZSk7CiAgICB2YXIgcmYgPSBSLmZsYWdzOwogICAgdmFyIGYgPSBTdHJpbmcocmYgPT09IHVuZGVmaW5lZCAmJiBSIGluc3RhbmNlb2YgUmVnRXhwICYmICEoJ2ZsYWdzJyBpbiBSZWdFeHBQcm90b3R5cGUpID8gZmxhZ3MuY2FsbChSKSA6IHJmKTsKICAgIHJldHVybiAnLycgKyBwICsgJy8nICsgZjsKICB9LCB7IHVuc2FmZTogdHJ1ZSB9KTsKfQoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zZXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zZXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGNvbGxlY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi5qcyIpOwp2YXIgY29sbGVjdGlvblN0cm9uZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcuanMiKTsKCi8vIGBTZXRgIGNvbnN0cnVjdG9yCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXNldC1vYmplY3RzCm1vZHVsZS5leHBvcnRzID0gY29sbGVjdGlvbignU2V0JywgZnVuY3Rpb24gKGluaXQpIHsKICByZXR1cm4gZnVuY3Rpb24gU2V0KCkgeyByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTsKfSwgY29sbGVjdGlvblN0cm9uZyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5hbmNob3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmFuY2hvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgY3JlYXRlSFRNTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtaHRtbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWh0bWwuanMiKTsKdmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZC5qcyIpOwoKLy8gYFN0cmluZy5wcm90b3R5cGUuYW5jaG9yYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5hbmNob3IKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ2FuY2hvcicpIH0sIHsKICBhbmNob3I6IGZ1bmN0aW9uIGFuY2hvcihuYW1lKSB7CiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYScsICduYW1lJywgbmFtZSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmJpZy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuYmlnLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBjcmVhdGVIVE1MID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaHRtbC5qcyIpOwp2YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kLmpzIik7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5iaWdgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmJpZwokKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnYmlnJykgfSwgewogIGJpZzogZnVuY3Rpb24gYmlnKCkgewogICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2JpZycsICcnLCAnJyk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmJsaW5rLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmJsaW5rLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGNyZWF0ZUhUTUwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1odG1sLmpzIik7CnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QuanMiKTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLmJsaW5rYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5ibGluawokKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnYmxpbmsnKSB9LCB7CiAgYmxpbms6IGZ1bmN0aW9uIGJsaW5rKCkgewogICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2JsaW5rJywgJycsICcnKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuYm9sZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmJvbGQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBjcmVhdGVIVE1MID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaHRtbC5qcyIpOwp2YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kLmpzIik7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5ib2xkYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5ib2xkCiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kKCdib2xkJykgfSwgewogIGJvbGQ6IGZ1bmN0aW9uIGJvbGQoKSB7CiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYicsICcnLCAnJyk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmNvZGUtcG9pbnQtYXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5jb2RlLXBvaW50LWF0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgY29kZUF0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMiKS5jb2RlQXQ7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuY29kZXBvaW50YXQKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlIH0sIHsKICBjb2RlUG9pbnRBdDogZnVuY3Rpb24gY29kZVBvaW50QXQocG9zKSB7CiAgICByZXR1cm4gY29kZUF0KHRoaXMsIHBvcyk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmVuZHMtd2l0aC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZW5kcy13aXRoLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIpLmY7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgbm90QVJlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9ub3QtYS1yZWdleHAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25vdC1hLXJlZ2V4cC5qcyIpOwp2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIpOwp2YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljLmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKCnZhciBuYXRpdmVFbmRzV2l0aCA9ICcnLmVuZHNXaXRoOwp2YXIgbWluID0gTWF0aC5taW47Cgp2YXIgQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgPSBjb3JyZWN0SXNSZWdFeHBMb2dpYygnZW5kc1dpdGgnKTsKLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcHVsbC83MDIKdmFyIE1ETl9QT0xZRklMTF9CVUcgPSAhSVNfUFVSRSAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgJiYgISFmdW5jdGlvbiAoKSB7CiAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nLnByb3RvdHlwZSwgJ2VuZHNXaXRoJyk7CiAgcmV0dXJuIGRlc2NyaXB0b3IgJiYgIWRlc2NyaXB0b3Iud3JpdGFibGU7Cn0oKTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5lbmRzd2l0aAokKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogIU1ETl9QT0xZRklMTF9CVUcgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDIH0sIHsKICBlbmRzV2l0aDogZnVuY3Rpb24gZW5kc1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgZW5kUG9zaXRpb24gPSBAbGVuZ3RoICovKSB7CiAgICB2YXIgdGhhdCA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTsKICAgIG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKTsKICAgIHZhciBlbmRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkOwogICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHRoYXQubGVuZ3RoKTsKICAgIHZhciBlbmQgPSBlbmRQb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gbGVuIDogbWluKHRvTGVuZ3RoKGVuZFBvc2l0aW9uKSwgbGVuKTsKICAgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTsKICAgIHJldHVybiBuYXRpdmVFbmRzV2l0aAogICAgICA/IG5hdGl2ZUVuZHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBlbmQpCiAgICAgIDogdGhhdC5zbGljZShlbmQgLSBzZWFyY2gubGVuZ3RoLCBlbmQpID09PSBzZWFyY2g7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZpeGVkLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZpeGVkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGNyZWF0ZUhUTUwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1odG1sLmpzIik7CnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QuanMiKTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLmZpeGVkYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5maXhlZAokKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnZml4ZWQnKSB9LCB7CiAgZml4ZWQ6IGZ1bmN0aW9uIGZpeGVkKCkgewogICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3R0JywgJycsICcnKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZm9udGNvbG9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5mb250Y29sb3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGNyZWF0ZUhUTUwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1odG1sLmpzIik7CnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QuanMiKTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLmZvbnRjb2xvcmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuZm9udGNvbG9yCiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kKCdmb250Y29sb3InKSB9LCB7CiAgZm9udGNvbG9yOiBmdW5jdGlvbiBmb250Y29sb3IoY29sb3IpIHsKICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdmb250JywgJ2NvbG9yJywgY29sb3IpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5mb250c2l6ZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5mb250c2l6ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBjcmVhdGVIVE1MID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaHRtbC5qcyIpOwp2YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kLmpzIik7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5mb250c2l6ZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuZm9udHNpemUKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ2ZvbnRzaXplJykgfSwgewogIGZvbnRzaXplOiBmdW5jdGlvbiBmb250c2l6ZShzaXplKSB7CiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnZm9udCcsICdzaXplJywgc2l6ZSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZnJvbS1jb2RlLXBvaW50LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciB0b0Fic29sdXRlSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIik7Cgp2YXIgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTsKdmFyIG5hdGl2ZUZyb21Db2RlUG9pbnQgPSBTdHJpbmcuZnJvbUNvZGVQb2ludDsKCi8vIGxlbmd0aCBzaG91bGQgYmUgMSwgb2xkIEZGIHByb2JsZW0KdmFyIElOQ09SUkVDVF9MRU5HVEggPSAhIW5hdGl2ZUZyb21Db2RlUG9pbnQgJiYgbmF0aXZlRnJvbUNvZGVQb2ludC5sZW5ndGggIT0gMTsKCi8vIGBTdHJpbmcuZnJvbUNvZGVQb2ludGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5mcm9tY29kZXBvaW50CiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVF9MRU5HVEggfSwgewogIGZyb21Db2RlUG9pbnQ6IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICB2YXIgZWxlbWVudHMgPSBbXTsKICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogICAgdmFyIGkgPSAwOwogICAgdmFyIGNvZGU7CiAgICB3aGlsZSAobGVuZ3RoID4gaSkgewogICAgICBjb2RlID0gK2FyZ3VtZW50c1tpKytdOwogICAgICBpZiAodG9BYnNvbHV0ZUluZGV4KGNvZGUsIDB4MTBGRkZGKSAhPT0gY29kZSkgdGhyb3cgUmFuZ2VFcnJvcihjb2RlICsgJyBpcyBub3QgYSB2YWxpZCBjb2RlIHBvaW50Jyk7CiAgICAgIGVsZW1lbnRzLnB1c2goY29kZSA8IDB4MTAwMDAKICAgICAgICA/IGZyb21DaGFyQ29kZShjb2RlKQogICAgICAgIDogZnJvbUNoYXJDb2RlKCgoY29kZSAtPSAweDEwMDAwKSA+PiAxMCkgKyAweEQ4MDAsIGNvZGUgJSAweDQwMCArIDB4REMwMCkKICAgICAgKTsKICAgIH0gcmV0dXJuIGVsZW1lbnRzLmpvaW4oJycpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBub3RBUmVnRXhwID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm90LWEtcmVnZXhwLmpzIik7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7CnZhciBjb3JyZWN0SXNSZWdFeHBMb2dpYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanMiKTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcwokKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogIWNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdpbmNsdWRlcycpIH0sIHsKICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7CiAgICByZXR1cm4gISF+U3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpCiAgICAgIC5pbmRleE9mKG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGFsaWNzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRhbGljcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGNyZWF0ZUhUTUwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1odG1sLmpzIik7CnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QuanMiKTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLml0YWxpY3NgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLml0YWxpY3MKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ2l0YWxpY3MnKSB9LCB7CiAgaXRhbGljczogZnVuY3Rpb24gaXRhbGljcygpIHsKICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdpJywgJycsICcnKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgY2hhckF0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMiKS5jaGFyQXQ7CnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIpOwp2YXIgZGVmaW5lSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3IuanMiKTsKCnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJzsKdmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTVFJJTkdfSVRFUkFUT1IpOwoKLy8gYFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLUBAaXRlcmF0b3IKZGVmaW5lSXRlcmF0b3IoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7CiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7CiAgICB0eXBlOiBTVFJJTkdfSVRFUkFUT1IsCiAgICBzdHJpbmc6IFN0cmluZyhpdGVyYXRlZCksCiAgICBpbmRleDogMAogIH0pOwovLyBgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXN0cmluZ2l0ZXJhdG9ycHJvdG90eXBlJS5uZXh0Cn0sIGZ1bmN0aW9uIG5leHQoKSB7CiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTsKICB2YXIgc3RyaW5nID0gc3RhdGUuc3RyaW5nOwogIHZhciBpbmRleCA9IHN0YXRlLmluZGV4OwogIHZhciBwb2ludDsKICBpZiAoaW5kZXggPj0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9OwogIHBvaW50ID0gY2hhckF0KHN0cmluZywgaW5kZXgpOwogIHN0YXRlLmluZGV4ICs9IHBvaW50Lmxlbmd0aDsKICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubGluay5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmxpbmsuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBjcmVhdGVIVE1MID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaHRtbC5qcyIpOwp2YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLWh0bWwtbWV0aG9kLmpzIik7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5saW5rYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5saW5rCiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kKCdsaW5rJykgfSwgewogIGxpbms6IGZ1bmN0aW9uIGxpbmsodXJsKSB7CiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYScsICdocmVmJywgdXJsKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2gtYWxsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC1hbGwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3IuanMiKTsKdmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanMiKTsKdmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIik7CnZhciBpc1JlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1yZWdleHAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qcyIpOwp2YXIgZ2V0UmVnRXhwRmxhZ3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZmxhZ3MuanMiKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIpOwp2YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZHZhbmNlLXN0cmluZy1pbmRleC5qcyIpOwp2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwoKdmFyIE1BVENIX0FMTCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2hBbGwnKTsKdmFyIFJFR0VYUF9TVFJJTkcgPSAnUmVnRXhwIFN0cmluZyc7CnZhciBSRUdFWFBfU1RSSU5HX0lURVJBVE9SID0gUkVHRVhQX1NUUklORyArICcgSXRlcmF0b3InOwp2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0Owp2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFJFR0VYUF9TVFJJTkdfSVRFUkFUT1IpOwp2YXIgUmVnRXhwUHJvdG90eXBlID0gUmVnRXhwLnByb3RvdHlwZTsKdmFyIHJlZ0V4cEJ1aWx0aW5FeGVjID0gUmVnRXhwUHJvdG90eXBlLmV4ZWM7CnZhciBuYXRpdmVNYXRjaEFsbCA9ICcnLm1hdGNoQWxsOwoKdmFyIFdPUktTX1dJVEhfTk9OX0dMT0JBTF9SRUdFWCA9ICEhbmF0aXZlTWF0Y2hBbGwgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsKICAnYScubWF0Y2hBbGwoLy4vKTsKfSk7Cgp2YXIgcmVnRXhwRXhlYyA9IGZ1bmN0aW9uIChSLCBTKSB7CiAgdmFyIGV4ZWMgPSBSLmV4ZWM7CiAgdmFyIHJlc3VsdDsKICBpZiAodHlwZW9mIGV4ZWMgPT0gJ2Z1bmN0aW9uJykgewogICAgcmVzdWx0ID0gZXhlYy5jYWxsKFIsIFMpOwogICAgaWYgKHR5cGVvZiByZXN1bHQgIT0gJ29iamVjdCcpIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0IGV4ZWMgcmVzdWx0Jyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0gcmV0dXJuIHJlZ0V4cEJ1aWx0aW5FeGVjLmNhbGwoUiwgUyk7Cn07CgovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlbgp2YXIgJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yID0gY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihmdW5jdGlvbiBSZWdFeHBTdHJpbmdJdGVyYXRvcihyZWdleHAsIHN0cmluZywgZ2xvYmFsLCBmdWxsVW5pY29kZSkgewogIHNldEludGVybmFsU3RhdGUodGhpcywgewogICAgdHlwZTogUkVHRVhQX1NUUklOR19JVEVSQVRPUiwKICAgIHJlZ2V4cDogcmVnZXhwLAogICAgc3RyaW5nOiBzdHJpbmcsCiAgICBnbG9iYWw6IGdsb2JhbCwKICAgIHVuaWNvZGU6IGZ1bGxVbmljb2RlLAogICAgZG9uZTogZmFsc2UKICB9KTsKfSwgUkVHRVhQX1NUUklORywgZnVuY3Rpb24gbmV4dCgpIHsKICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOwogIGlmIChzdGF0ZS5kb25lKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07CiAgdmFyIFIgPSBzdGF0ZS5yZWdleHA7CiAgdmFyIFMgPSBzdGF0ZS5zdHJpbmc7CiAgdmFyIG1hdGNoID0gcmVnRXhwRXhlYyhSLCBTKTsKICBpZiAobWF0Y2ggPT09IG51bGwpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHN0YXRlLmRvbmUgPSB0cnVlIH07CiAgaWYgKHN0YXRlLmdsb2JhbCkgewogICAgaWYgKFN0cmluZyhtYXRjaFswXSkgPT0gJycpIFIubGFzdEluZGV4ID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHRvTGVuZ3RoKFIubGFzdEluZGV4KSwgc3RhdGUudW5pY29kZSk7CiAgICByZXR1cm4geyB2YWx1ZTogbWF0Y2gsIGRvbmU6IGZhbHNlIH07CiAgfQogIHN0YXRlLmRvbmUgPSB0cnVlOwogIHJldHVybiB7IHZhbHVlOiBtYXRjaCwgZG9uZTogZmFsc2UgfTsKfSk7Cgp2YXIgJG1hdGNoQWxsID0gZnVuY3Rpb24gKHN0cmluZykgewogIHZhciBSID0gYW5PYmplY3QodGhpcyk7CiAgdmFyIFMgPSBTdHJpbmcoc3RyaW5nKTsKICB2YXIgQywgZmxhZ3NWYWx1ZSwgZmxhZ3MsIG1hdGNoZXIsIGdsb2JhbCwgZnVsbFVuaWNvZGU7CiAgQyA9IHNwZWNpZXNDb25zdHJ1Y3RvcihSLCBSZWdFeHApOwogIGZsYWdzVmFsdWUgPSBSLmZsYWdzOwogIGlmIChmbGFnc1ZhbHVlID09PSB1bmRlZmluZWQgJiYgUiBpbnN0YW5jZW9mIFJlZ0V4cCAmJiAhKCdmbGFncycgaW4gUmVnRXhwUHJvdG90eXBlKSkgewogICAgZmxhZ3NWYWx1ZSA9IGdldFJlZ0V4cEZsYWdzLmNhbGwoUik7CiAgfQogIGZsYWdzID0gZmxhZ3NWYWx1ZSA9PT0gdW5kZWZpbmVkID8gJycgOiBTdHJpbmcoZmxhZ3NWYWx1ZSk7CiAgbWF0Y2hlciA9IG5ldyBDKEMgPT09IFJlZ0V4cCA/IFIuc291cmNlIDogUiwgZmxhZ3MpOwogIGdsb2JhbCA9ICEhfmZsYWdzLmluZGV4T2YoJ2cnKTsKICBmdWxsVW5pY29kZSA9ICEhfmZsYWdzLmluZGV4T2YoJ3UnKTsKICBtYXRjaGVyLmxhc3RJbmRleCA9IHRvTGVuZ3RoKFIubGFzdEluZGV4KTsKICByZXR1cm4gbmV3ICRSZWdFeHBTdHJpbmdJdGVyYXRvcihtYXRjaGVyLCBTLCBnbG9iYWwsIGZ1bGxVbmljb2RlKTsKfTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLm1hdGNoQWxsYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLW1hdGNoYWxsCiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBXT1JLU19XSVRIX05PTl9HTE9CQUxfUkVHRVggfSwgewogIG1hdGNoQWxsOiBmdW5jdGlvbiBtYXRjaEFsbChyZWdleHApIHsKICAgIHZhciBPID0gcmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTsKICAgIHZhciBmbGFncywgUywgbWF0Y2hlciwgcng7CiAgICBpZiAocmVnZXhwICE9IG51bGwpIHsKICAgICAgaWYgKGlzUmVnRXhwKHJlZ2V4cCkpIHsKICAgICAgICBmbGFncyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCdmbGFncycgaW4gUmVnRXhwUHJvdG90eXBlCiAgICAgICAgICA/IHJlZ2V4cC5mbGFncwogICAgICAgICAgOiBnZXRSZWdFeHBGbGFncy5jYWxsKHJlZ2V4cCkKICAgICAgICApKTsKICAgICAgICBpZiAoIX5mbGFncy5pbmRleE9mKCdnJykpIHRocm93IFR5cGVFcnJvcignYC5tYXRjaEFsbGAgZG9lcyBub3QgYWxsb3cgbm9uLWdsb2JhbCByZWdleGVzJyk7CiAgICAgIH0KICAgICAgaWYgKFdPUktTX1dJVEhfTk9OX0dMT0JBTF9SRUdFWCkgcmV0dXJuIG5hdGl2ZU1hdGNoQWxsLmFwcGx5KE8sIGFyZ3VtZW50cyk7CiAgICAgIG1hdGNoZXIgPSByZWdleHBbTUFUQ0hfQUxMXTsKICAgICAgaWYgKG1hdGNoZXIgPT09IHVuZGVmaW5lZCAmJiBJU19QVVJFICYmIGNsYXNzb2YocmVnZXhwKSA9PSAnUmVnRXhwJykgbWF0Y2hlciA9ICRtYXRjaEFsbDsKICAgICAgaWYgKG1hdGNoZXIgIT0gbnVsbCkgcmV0dXJuIGFGdW5jdGlvbihtYXRjaGVyKS5jYWxsKHJlZ2V4cCwgTyk7CiAgICB9IGVsc2UgaWYgKFdPUktTX1dJVEhfTk9OX0dMT0JBTF9SRUdFWCkgcmV0dXJuIG5hdGl2ZU1hdGNoQWxsLmFwcGx5KE8sIGFyZ3VtZW50cyk7CiAgICBTID0gU3RyaW5nKE8pOwogICAgcnggPSBuZXcgUmVnRXhwKHJlZ2V4cCwgJ2cnKTsKICAgIHJldHVybiBJU19QVVJFID8gJG1hdGNoQWxsLmNhbGwocngsIFMpIDogcnhbTUFUQ0hfQUxMXShTKTsKICB9Cn0pOwoKSVNfUFVSRSB8fCBNQVRDSF9BTEwgaW4gUmVnRXhwUHJvdG90eXBlIHx8IGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShSZWdFeHBQcm90b3R5cGUsIE1BVENIX0FMTCwgJG1hdGNoQWxsKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIpOwp2YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZHZhbmNlLXN0cmluZy1pbmRleC5qcyIpOwp2YXIgcmVnRXhwRXhlYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanMiKTsKCi8vIEBAbWF0Y2ggbG9naWMKZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMoJ21hdGNoJywgMSwgZnVuY3Rpb24gKE1BVENILCBuYXRpdmVNYXRjaCwgbWF5YmVDYWxsTmF0aXZlKSB7CiAgcmV0dXJuIFsKICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLm1hdGNoYCBtZXRob2QKICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUubWF0Y2gKICAgIGZ1bmN0aW9uIG1hdGNoKHJlZ2V4cCkgewogICAgICB2YXIgTyA9IHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7CiAgICAgIHZhciBtYXRjaGVyID0gcmVnZXhwID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJlZ2V4cFtNQVRDSF07CiAgICAgIHJldHVybiBtYXRjaGVyICE9PSB1bmRlZmluZWQgPyBtYXRjaGVyLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtNQVRDSF0oU3RyaW5nKE8pKTsKICAgIH0sCiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXWAgbWV0aG9kCiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAbWF0Y2gKICAgIGZ1bmN0aW9uIChyZWdleHApIHsKICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZShuYXRpdmVNYXRjaCwgcmVnZXhwLCB0aGlzKTsKICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlOwoKICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTsKICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7CgogICAgICBpZiAoIXJ4Lmdsb2JhbCkgcmV0dXJuIHJlZ0V4cEV4ZWMocngsIFMpOwoKICAgICAgdmFyIGZ1bGxVbmljb2RlID0gcngudW5pY29kZTsKICAgICAgcngubGFzdEluZGV4ID0gMDsKICAgICAgdmFyIEEgPSBbXTsKICAgICAgdmFyIG4gPSAwOwogICAgICB2YXIgcmVzdWx0OwogICAgICB3aGlsZSAoKHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpKSAhPT0gbnVsbCkgewogICAgICAgIHZhciBtYXRjaFN0ciA9IFN0cmluZyhyZXN1bHRbMF0pOwogICAgICAgIEFbbl0gPSBtYXRjaFN0cjsKICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpOwogICAgICAgIG4rKzsKICAgICAgfQogICAgICByZXR1cm4gbiA9PT0gMCA/IG51bGwgOiBBOwogICAgfQogIF07Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucGFkLWVuZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnBhZC1lbmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciAkcGFkRW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy1wYWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1wYWQuanMiKS5lbmQ7CnZhciBXRUJLSVRfQlVHID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlYmtpdC1zdHJpbmctcGFkLWJ1ZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2Via2l0LXN0cmluZy1wYWQtYnVnLmpzIik7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5wYWRFbmRgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnBhZGVuZAokKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogV0VCS0lUX0JVRyB9LCB7CiAgcGFkRW5kOiBmdW5jdGlvbiBwYWRFbmQobWF4TGVuZ3RoIC8qICwgZmlsbFN0cmluZyA9ICcgJyAqLykgewogICAgcmV0dXJuICRwYWRFbmQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnBhZC1zdGFydC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucGFkLXN0YXJ0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciAkcGFkU3RhcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXBhZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXBhZC5qcyIpLnN0YXJ0Owp2YXIgV0VCS0lUX0JVRyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWJraXQtc3RyaW5nLXBhZC1idWcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlYmtpdC1zdHJpbmctcGFkLWJ1Zy5qcyIpOwoKLy8gYFN0cmluZy5wcm90b3R5cGUucGFkU3RhcnRgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnBhZHN0YXJ0CiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBXRUJLSVRfQlVHIH0sIHsKICBwYWRTdGFydDogZnVuY3Rpb24gcGFkU3RhcnQobWF4TGVuZ3RoIC8qICwgZmlsbFN0cmluZyA9ICcgJyAqLykgewogICAgcmV0dXJuICRwYWRTdGFydCh0aGlzLCBtYXhMZW5ndGgsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmF3LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yYXcuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanMiKTsKdmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIik7CgovLyBgU3RyaW5nLnJhd2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5yYXcKJCh7IHRhcmdldDogJ1N0cmluZycsIHN0YXQ6IHRydWUgfSwgewogIHJhdzogZnVuY3Rpb24gcmF3KHRlbXBsYXRlKSB7CiAgICB2YXIgcmF3VGVtcGxhdGUgPSB0b0luZGV4ZWRPYmplY3QodGVtcGxhdGUucmF3KTsKICAgIHZhciBsaXRlcmFsU2VnbWVudHMgPSB0b0xlbmd0aChyYXdUZW1wbGF0ZS5sZW5ndGgpOwogICAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICB2YXIgZWxlbWVudHMgPSBbXTsKICAgIHZhciBpID0gMDsKICAgIHdoaWxlIChsaXRlcmFsU2VnbWVudHMgPiBpKSB7CiAgICAgIGVsZW1lbnRzLnB1c2goU3RyaW5nKHJhd1RlbXBsYXRlW2krK10pKTsKICAgICAgaWYgKGkgPCBhcmd1bWVudHNMZW5ndGgpIGVsZW1lbnRzLnB1c2goU3RyaW5nKGFyZ3VtZW50c1tpXSkpOwogICAgfSByZXR1cm4gZWxlbWVudHMuam9pbignJyk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGVhdC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwZWF0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciByZXBlYXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXJlcGVhdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXJlcGVhdC5qcyIpOwoKLy8gYFN0cmluZy5wcm90b3R5cGUucmVwZWF0YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5yZXBlYXQKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlIH0sIHsKICByZXBlYXQ6IHJlcGVhdAp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXIuanMiKTsKdmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanMiKTsKdmFyIGFkdmFuY2VTdHJpbmdJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZHZhbmNlLXN0cmluZy1pbmRleCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXguanMiKTsKdmFyIHJlZ0V4cEV4ZWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0LmpzIik7Cgp2YXIgbWF4ID0gTWF0aC5tYXg7CnZhciBtaW4gPSBNYXRoLm1pbjsKdmFyIGZsb29yID0gTWF0aC5mbG9vcjsKdmFyIFNVQlNUSVRVVElPTl9TWU1CT0xTID0gL1wkKFskJidgXXxcZFxkP3w8W14+XSo+KS9nOwp2YXIgU1VCU1RJVFVUSU9OX1NZTUJPTFNfTk9fTkFNRUQgPSAvXCQoWyQmJ2BdfFxkXGQ/KS9nOwoKdmFyIG1heWJlVG9TdHJpbmcgPSBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/IGl0IDogU3RyaW5nKGl0KTsKfTsKCi8vIEBAcmVwbGFjZSBsb2dpYwpmaXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYygncmVwbGFjZScsIDIsIGZ1bmN0aW9uIChSRVBMQUNFLCBuYXRpdmVSZXBsYWNlLCBtYXliZUNhbGxOYXRpdmUpIHsKICByZXR1cm4gWwogICAgLy8gYFN0cmluZy5wcm90b3R5cGUucmVwbGFjZWAgbWV0aG9kCiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnJlcGxhY2UKICAgIGZ1bmN0aW9uIHJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSkgewogICAgICB2YXIgTyA9IHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7CiAgICAgIHZhciByZXBsYWNlciA9IHNlYXJjaFZhbHVlID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlYXJjaFZhbHVlW1JFUExBQ0VdOwogICAgICByZXR1cm4gcmVwbGFjZXIgIT09IHVuZGVmaW5lZAogICAgICAgID8gcmVwbGFjZXIuY2FsbChzZWFyY2hWYWx1ZSwgTywgcmVwbGFjZVZhbHVlKQogICAgICAgIDogbmF0aXZlUmVwbGFjZS5jYWxsKFN0cmluZyhPKSwgc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSk7CiAgICB9LAogICAgLy8gYFJlZ0V4cC5wcm90b3R5cGVbQEByZXBsYWNlXWAgbWV0aG9kCiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAcmVwbGFjZQogICAgZnVuY3Rpb24gKHJlZ2V4cCwgcmVwbGFjZVZhbHVlKSB7CiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUobmF0aXZlUmVwbGFjZSwgcmVnZXhwLCB0aGlzLCByZXBsYWNlVmFsdWUpOwogICAgICBpZiAocmVzLmRvbmUpIHJldHVybiByZXMudmFsdWU7CgogICAgICB2YXIgcnggPSBhbk9iamVjdChyZWdleHApOwogICAgICB2YXIgUyA9IFN0cmluZyh0aGlzKTsKCiAgICAgIHZhciBmdW5jdGlvbmFsUmVwbGFjZSA9IHR5cGVvZiByZXBsYWNlVmFsdWUgPT09ICdmdW5jdGlvbic7CiAgICAgIGlmICghZnVuY3Rpb25hbFJlcGxhY2UpIHJlcGxhY2VWYWx1ZSA9IFN0cmluZyhyZXBsYWNlVmFsdWUpOwoKICAgICAgdmFyIGdsb2JhbCA9IHJ4Lmdsb2JhbDsKICAgICAgaWYgKGdsb2JhbCkgewogICAgICAgIHZhciBmdWxsVW5pY29kZSA9IHJ4LnVuaWNvZGU7CiAgICAgICAgcngubGFzdEluZGV4ID0gMDsKICAgICAgfQogICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIHZhciByZXN1bHQgPSByZWdFeHBFeGVjKHJ4LCBTKTsKICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSBicmVhazsKCiAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7CiAgICAgICAgaWYgKCFnbG9iYWwpIGJyZWFrOwoKICAgICAgICB2YXIgbWF0Y2hTdHIgPSBTdHJpbmcocmVzdWx0WzBdKTsKICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpOwogICAgICB9CgogICAgICB2YXIgYWNjdW11bGF0ZWRSZXN1bHQgPSAnJzsKICAgICAgdmFyIG5leHRTb3VyY2VQb3NpdGlvbiA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykgewogICAgICAgIHJlc3VsdCA9IHJlc3VsdHNbaV07CgogICAgICAgIHZhciBtYXRjaGVkID0gU3RyaW5nKHJlc3VsdFswXSk7CiAgICAgICAgdmFyIHBvc2l0aW9uID0gbWF4KG1pbih0b0ludGVnZXIocmVzdWx0LmluZGV4KSwgUy5sZW5ndGgpLCAwKTsKICAgICAgICB2YXIgY2FwdHVyZXMgPSBbXTsKICAgICAgICAvLyBOT1RFOiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KICAgICAgICAvLyAgIGNhcHR1cmVzID0gcmVzdWx0LnNsaWNlKDEpLm1hcChtYXliZVRvU3RyaW5nKQogICAgICAgIC8vIGJ1dCBmb3Igc29tZSByZWFzb24gYG5hdGl2ZVNsaWNlLmNhbGwocmVzdWx0LCAxLCByZXN1bHQubGVuZ3RoKWAgKGNhbGxlZCBpbgogICAgICAgIC8vIHRoZSBzbGljZSBwb2x5ZmlsbCB3aGVuIHNsaWNpbmcgbmF0aXZlIGFycmF5cykgImRvZXNuJ3Qgd29yayIgaW4gc2FmYXJpIDkgYW5kCiAgICAgICAgLy8gY2F1c2VzIGEgY3Jhc2ggKGh0dHBzOi8vcGFzdGViaW4uY29tL04yMVF6ZVFBKSB3aGVuIHRyeWluZyB0byBkZWJ1ZyBpdC4KICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgY2FwdHVyZXMucHVzaChtYXliZVRvU3RyaW5nKHJlc3VsdFtqXSkpOwogICAgICAgIHZhciBuYW1lZENhcHR1cmVzID0gcmVzdWx0Lmdyb3VwczsKICAgICAgICBpZiAoZnVuY3Rpb25hbFJlcGxhY2UpIHsKICAgICAgICAgIHZhciByZXBsYWNlckFyZ3MgPSBbbWF0Y2hlZF0uY29uY2F0KGNhcHR1cmVzLCBwb3NpdGlvbiwgUyk7CiAgICAgICAgICBpZiAobmFtZWRDYXB0dXJlcyAhPT0gdW5kZWZpbmVkKSByZXBsYWNlckFyZ3MucHVzaChuYW1lZENhcHR1cmVzKTsKICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IFN0cmluZyhyZXBsYWNlVmFsdWUuYXBwbHkodW5kZWZpbmVkLCByZXBsYWNlckFyZ3MpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVwbGFjZW1lbnQgPSBnZXRTdWJzdGl0dXRpb24obWF0Y2hlZCwgUywgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlVmFsdWUpOwogICAgICAgIH0KICAgICAgICBpZiAocG9zaXRpb24gPj0gbmV4dFNvdXJjZVBvc2l0aW9uKSB7CiAgICAgICAgICBhY2N1bXVsYXRlZFJlc3VsdCArPSBTLnNsaWNlKG5leHRTb3VyY2VQb3NpdGlvbiwgcG9zaXRpb24pICsgcmVwbGFjZW1lbnQ7CiAgICAgICAgICBuZXh0U291cmNlUG9zaXRpb24gPSBwb3NpdGlvbiArIG1hdGNoZWQubGVuZ3RoOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYWNjdW11bGF0ZWRSZXN1bHQgKyBTLnNsaWNlKG5leHRTb3VyY2VQb3NpdGlvbik7CiAgICB9CiAgXTsKCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2V0c3Vic3RpdHV0aW9uCiAgZnVuY3Rpb24gZ2V0U3Vic3RpdHV0aW9uKG1hdGNoZWQsIHN0ciwgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlbWVudCkgewogICAgdmFyIHRhaWxQb3MgPSBwb3NpdGlvbiArIG1hdGNoZWQubGVuZ3RoOwogICAgdmFyIG0gPSBjYXB0dXJlcy5sZW5ndGg7CiAgICB2YXIgc3ltYm9scyA9IFNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEOwogICAgaWYgKG5hbWVkQ2FwdHVyZXMgIT09IHVuZGVmaW5lZCkgewogICAgICBuYW1lZENhcHR1cmVzID0gdG9PYmplY3QobmFtZWRDYXB0dXJlcyk7CiAgICAgIHN5bWJvbHMgPSBTVUJTVElUVVRJT05fU1lNQk9MUzsKICAgIH0KICAgIHJldHVybiBuYXRpdmVSZXBsYWNlLmNhbGwocmVwbGFjZW1lbnQsIHN5bWJvbHMsIGZ1bmN0aW9uIChtYXRjaCwgY2gpIHsKICAgICAgdmFyIGNhcHR1cmU7CiAgICAgIHN3aXRjaCAoY2guY2hhckF0KDApKSB7CiAgICAgICAgY2FzZSAnJCc6IHJldHVybiAnJCc7CiAgICAgICAgY2FzZSAnJic6IHJldHVybiBtYXRjaGVkOwogICAgICAgIGNhc2UgJ2AnOiByZXR1cm4gc3RyLnNsaWNlKDAsIHBvc2l0aW9uKTsKICAgICAgICBjYXNlICInIjogcmV0dXJuIHN0ci5zbGljZSh0YWlsUG9zKTsKICAgICAgICBjYXNlICc8JzoKICAgICAgICAgIGNhcHR1cmUgPSBuYW1lZENhcHR1cmVzW2NoLnNsaWNlKDEsIC0xKV07CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OiAvLyBcZFxkPwogICAgICAgICAgdmFyIG4gPSArY2g7CiAgICAgICAgICBpZiAobiA9PT0gMCkgcmV0dXJuIG1hdGNoOwogICAgICAgICAgaWYgKG4gPiBtKSB7CiAgICAgICAgICAgIHZhciBmID0gZmxvb3IobiAvIDEwKTsKICAgICAgICAgICAgaWYgKGYgPT09IDApIHJldHVybiBtYXRjaDsKICAgICAgICAgICAgaWYgKGYgPD0gbSkgcmV0dXJuIGNhcHR1cmVzW2YgLSAxXSA9PT0gdW5kZWZpbmVkID8gY2guY2hhckF0KDEpIDogY2FwdHVyZXNbZiAtIDFdICsgY2guY2hhckF0KDEpOwogICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgICB9CiAgICAgICAgICBjYXB0dXJlID0gY2FwdHVyZXNbbiAtIDFdOwogICAgICB9CiAgICAgIHJldHVybiBjYXB0dXJlID09PSB1bmRlZmluZWQgPyAnJyA6IGNhcHR1cmU7CiAgICB9KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc2VhcmNoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zZWFyY2guanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7CnZhciBzYW1lVmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2FtZS12YWx1ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2FtZS12YWx1ZS5qcyIpOwp2YXIgcmVnRXhwRXhlYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanMiKTsKCi8vIEBAc2VhcmNoIGxvZ2ljCmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdzZWFyY2gnLCAxLCBmdW5jdGlvbiAoU0VBUkNILCBuYXRpdmVTZWFyY2gsIG1heWJlQ2FsbE5hdGl2ZSkgewogIHJldHVybiBbCiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5zZWFyY2hgIG1ldGhvZAogICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zZWFyY2gKICAgIGZ1bmN0aW9uIHNlYXJjaChyZWdleHApIHsKICAgICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpOwogICAgICB2YXIgc2VhcmNoZXIgPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW1NFQVJDSF07CiAgICAgIHJldHVybiBzZWFyY2hlciAhPT0gdW5kZWZpbmVkID8gc2VhcmNoZXIuY2FsbChyZWdleHAsIE8pIDogbmV3IFJlZ0V4cChyZWdleHApW1NFQVJDSF0oU3RyaW5nKE8pKTsKICAgIH0sCiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHNlYXJjaF1gIG1ldGhvZAogICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQHNlYXJjaAogICAgZnVuY3Rpb24gKHJlZ2V4cCkgewogICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKG5hdGl2ZVNlYXJjaCwgcmVnZXhwLCB0aGlzKTsKICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlOwoKICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTsKICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7CgogICAgICB2YXIgcHJldmlvdXNMYXN0SW5kZXggPSByeC5sYXN0SW5kZXg7CiAgICAgIGlmICghc2FtZVZhbHVlKHByZXZpb3VzTGFzdEluZGV4LCAwKSkgcngubGFzdEluZGV4ID0gMDsKICAgICAgdmFyIHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpOwogICAgICBpZiAoIXNhbWVWYWx1ZShyeC5sYXN0SW5kZXgsIHByZXZpb3VzTGFzdEluZGV4KSkgcngubGFzdEluZGV4ID0gcHJldmlvdXNMYXN0SW5kZXg7CiAgICAgIHJldHVybiByZXN1bHQgPT09IG51bGwgPyAtMSA6IHJlc3VsdC5pbmRleDsKICAgIH0KICBdOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNtYWxsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNtYWxsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGNyZWF0ZUhUTUwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1odG1sLmpzIik7CnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctaHRtbC1tZXRob2QuanMiKTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLnNtYWxsYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zbWFsbAokKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnc21hbGwnKSB9LCB7CiAgc21hbGw6IGZ1bmN0aW9uIHNtYWxsKCkgewogICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3NtYWxsJywgJycsICcnKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3BsaXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3BsaXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qcyIpOwp2YXIgaXNSZWdFeHAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcmVnZXhwICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1yZWdleHAuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7CnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIpOwp2YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZHZhbmNlLXN0cmluZy1pbmRleC5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKdmFyIGNhbGxSZWdFeHBFeGVjID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdC5qcyIpOwp2YXIgcmVnZXhwRXhlYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZXhlYyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwoKdmFyIGFycmF5UHVzaCA9IFtdLnB1c2g7CnZhciBtaW4gPSBNYXRoLm1pbjsKdmFyIE1BWF9VSU5UMzIgPSAweEZGRkZGRkZGOwoKLy8gYmFiZWwtbWluaWZ5IHRyYW5zcGlsZXMgUmVnRXhwKCd4JywgJ3knKSAtPiAveC95IGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3IKdmFyIFNVUFBPUlRTX1kgPSAhZmFpbHMoZnVuY3Rpb24gKCkgeyByZXR1cm4gIVJlZ0V4cChNQVhfVUlOVDMyLCAneScpOyB9KTsKCi8vIEBAc3BsaXQgbG9naWMKZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMoJ3NwbGl0JywgMiwgZnVuY3Rpb24gKFNQTElULCBuYXRpdmVTcGxpdCwgbWF5YmVDYWxsTmF0aXZlKSB7CiAgdmFyIGludGVybmFsU3BsaXQ7CiAgaWYgKAogICAgJ2FiYmMnLnNwbGl0KC8oYikqLylbMV0gPT0gJ2MnIHx8CiAgICAndGVzdCcuc3BsaXQoLyg/OikvLCAtMSkubGVuZ3RoICE9IDQgfHwKICAgICdhYicuc3BsaXQoLyg/OmFiKSovKS5sZW5ndGggIT0gMiB8fAogICAgJy4nLnNwbGl0KC8oLj8pKC4/KS8pLmxlbmd0aCAhPSA0IHx8CiAgICAnLicuc3BsaXQoLygpKCkvKS5sZW5ndGggPiAxIHx8CiAgICAnJy5zcGxpdCgvLj8vKS5sZW5ndGgKICApIHsKICAgIC8vIGJhc2VkIG9uIGVzNS1zaGltIGltcGxlbWVudGF0aW9uLCBuZWVkIHRvIHJld29yayBpdAogICAgaW50ZXJuYWxTcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7CiAgICAgIHZhciBzdHJpbmcgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7CiAgICAgIHZhciBsaW0gPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX1VJTlQzMiA6IGxpbWl0ID4+PiAwOwogICAgICBpZiAobGltID09PSAwKSByZXR1cm4gW107CiAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtzdHJpbmddOwogICAgICAvLyBJZiBgc2VwYXJhdG9yYCBpcyBub3QgYSByZWdleCwgdXNlIG5hdGl2ZSBzcGxpdAogICAgICBpZiAoIWlzUmVnRXhwKHNlcGFyYXRvcikpIHsKICAgICAgICByZXR1cm4gbmF0aXZlU3BsaXQuY2FsbChzdHJpbmcsIHNlcGFyYXRvciwgbGltKTsKICAgICAgfQogICAgICB2YXIgb3V0cHV0ID0gW107CiAgICAgIHZhciBmbGFncyA9IChzZXBhcmF0b3IuaWdub3JlQ2FzZSA/ICdpJyA6ICcnKSArCiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3IubXVsdGlsaW5lID8gJ20nIDogJycpICsKICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICsKICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5zdGlja3kgPyAneScgOiAnJyk7CiAgICAgIHZhciBsYXN0TGFzdEluZGV4ID0gMDsKICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHkKICAgICAgdmFyIHNlcGFyYXRvckNvcHkgPSBuZXcgUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIGZsYWdzICsgJ2cnKTsKICAgICAgdmFyIG1hdGNoLCBsYXN0SW5kZXgsIGxhc3RMZW5ndGg7CiAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4cEV4ZWMuY2FsbChzZXBhcmF0b3JDb3B5LCBzdHJpbmcpKSB7CiAgICAgICAgbGFzdEluZGV4ID0gc2VwYXJhdG9yQ29weS5sYXN0SW5kZXg7CiAgICAgICAgaWYgKGxhc3RJbmRleCA+IGxhc3RMYXN0SW5kZXgpIHsKICAgICAgICAgIG91dHB1dC5wdXNoKHN0cmluZy5zbGljZShsYXN0TGFzdEluZGV4LCBtYXRjaC5pbmRleCkpOwogICAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA+IDEgJiYgbWF0Y2guaW5kZXggPCBzdHJpbmcubGVuZ3RoKSBhcnJheVB1c2guYXBwbHkob3V0cHV0LCBtYXRjaC5zbGljZSgxKSk7CiAgICAgICAgICBsYXN0TGVuZ3RoID0gbWF0Y2hbMF0ubGVuZ3RoOwogICAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDsKICAgICAgICAgIGlmIChvdXRwdXQubGVuZ3RoID49IGxpbSkgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleCA9PT0gbWF0Y2guaW5kZXgpIHNlcGFyYXRvckNvcHkubGFzdEluZGV4Kys7IC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3AKICAgICAgfQogICAgICBpZiAobGFzdExhc3RJbmRleCA9PT0gc3RyaW5nLmxlbmd0aCkgewogICAgICAgIGlmIChsYXN0TGVuZ3RoIHx8ICFzZXBhcmF0b3JDb3B5LnRlc3QoJycpKSBvdXRwdXQucHVzaCgnJyk7CiAgICAgIH0gZWxzZSBvdXRwdXQucHVzaChzdHJpbmcuc2xpY2UobGFzdExhc3RJbmRleCkpOwogICAgICByZXR1cm4gb3V0cHV0Lmxlbmd0aCA+IGxpbSA/IG91dHB1dC5zbGljZSgwLCBsaW0pIDogb3V0cHV0OwogICAgfTsKICAvLyBDaGFrcmEsIFY4CiAgfSBlbHNlIGlmICgnMCcuc3BsaXQodW5kZWZpbmVkLCAwKS5sZW5ndGgpIHsKICAgIGludGVybmFsU3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkgewogICAgICByZXR1cm4gc2VwYXJhdG9yID09PSB1bmRlZmluZWQgJiYgbGltaXQgPT09IDAgPyBbXSA6IG5hdGl2ZVNwbGl0LmNhbGwodGhpcywgc2VwYXJhdG9yLCBsaW1pdCk7CiAgICB9OwogIH0gZWxzZSBpbnRlcm5hbFNwbGl0ID0gbmF0aXZlU3BsaXQ7CgogIHJldHVybiBbCiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5zcGxpdGAgbWV0aG9kCiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnNwbGl0CiAgICBmdW5jdGlvbiBzcGxpdChzZXBhcmF0b3IsIGxpbWl0KSB7CiAgICAgIHZhciBPID0gcmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTsKICAgICAgdmFyIHNwbGl0dGVyID0gc2VwYXJhdG9yID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlcGFyYXRvcltTUExJVF07CiAgICAgIHJldHVybiBzcGxpdHRlciAhPT0gdW5kZWZpbmVkCiAgICAgICAgPyBzcGxpdHRlci5jYWxsKHNlcGFyYXRvciwgTywgbGltaXQpCiAgICAgICAgOiBpbnRlcm5hbFNwbGl0LmNhbGwoU3RyaW5nKE8pLCBzZXBhcmF0b3IsIGxpbWl0KTsKICAgIH0sCiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XWAgbWV0aG9kCiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAc3BsaXQKICAgIC8vCiAgICAvLyBOT1RFOiBUaGlzIGNhbm5vdCBiZSBwcm9wZXJseSBwb2x5ZmlsbGVkIGluIGVuZ2luZXMgdGhhdCBkb24ndCBzdXBwb3J0CiAgICAvLyB0aGUgJ3knIGZsYWcuCiAgICBmdW5jdGlvbiAocmVnZXhwLCBsaW1pdCkgewogICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKGludGVybmFsU3BsaXQsIHJlZ2V4cCwgdGhpcywgbGltaXQsIGludGVybmFsU3BsaXQgIT09IG5hdGl2ZVNwbGl0KTsKICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlOwoKICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTsKICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7CiAgICAgIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHJ4LCBSZWdFeHApOwoKICAgICAgdmFyIHVuaWNvZGVNYXRjaGluZyA9IHJ4LnVuaWNvZGU7CiAgICAgIHZhciBmbGFncyA9IChyeC5pZ25vcmVDYXNlID8gJ2knIDogJycpICsKICAgICAgICAgICAgICAgICAgKHJ4Lm11bHRpbGluZSA/ICdtJyA6ICcnKSArCiAgICAgICAgICAgICAgICAgIChyeC51bmljb2RlID8gJ3UnIDogJycpICsKICAgICAgICAgICAgICAgICAgKFNVUFBPUlRTX1kgPyAneScgOiAnZycpOwoKICAgICAgLy8gXig/ICsgcnggKyApIGlzIG5lZWRlZCwgaW4gY29tYmluYXRpb24gd2l0aCBzb21lIFMgc2xpY2luZywgdG8KICAgICAgLy8gc2ltdWxhdGUgdGhlICd5JyBmbGFnLgogICAgICB2YXIgc3BsaXR0ZXIgPSBuZXcgQyhTVVBQT1JUU19ZID8gcnggOiAnXig/OicgKyByeC5zb3VyY2UgKyAnKScsIGZsYWdzKTsKICAgICAgdmFyIGxpbSA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyBNQVhfVUlOVDMyIDogbGltaXQgPj4+IDA7CiAgICAgIGlmIChsaW0gPT09IDApIHJldHVybiBbXTsKICAgICAgaWYgKFMubGVuZ3RoID09PSAwKSByZXR1cm4gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFMpID09PSBudWxsID8gW1NdIDogW107CiAgICAgIHZhciBwID0gMDsKICAgICAgdmFyIHEgPSAwOwogICAgICB2YXIgQSA9IFtdOwogICAgICB3aGlsZSAocSA8IFMubGVuZ3RoKSB7CiAgICAgICAgc3BsaXR0ZXIubGFzdEluZGV4ID0gU1VQUE9SVFNfWSA/IHEgOiAwOwogICAgICAgIHZhciB6ID0gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFNVUFBPUlRTX1kgPyBTIDogUy5zbGljZShxKSk7CiAgICAgICAgdmFyIGU7CiAgICAgICAgaWYgKAogICAgICAgICAgeiA9PT0gbnVsbCB8fAogICAgICAgICAgKGUgPSBtaW4odG9MZW5ndGgoc3BsaXR0ZXIubGFzdEluZGV4ICsgKFNVUFBPUlRTX1kgPyAwIDogcSkpLCBTLmxlbmd0aCkpID09PSBwCiAgICAgICAgKSB7CiAgICAgICAgICBxID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHEsIHVuaWNvZGVNYXRjaGluZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIEEucHVzaChTLnNsaWNlKHAsIHEpKTsKICAgICAgICAgIGlmIChBLmxlbmd0aCA9PT0gbGltKSByZXR1cm4gQTsKICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IHoubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgIEEucHVzaCh6W2ldKTsKICAgICAgICAgICAgaWYgKEEubGVuZ3RoID09PSBsaW0pIHJldHVybiBBOwogICAgICAgICAgfQogICAgICAgICAgcSA9IHAgPSBlOwogICAgICAgIH0KICAgICAgfQogICAgICBBLnB1c2goUy5zbGljZShwKSk7CiAgICAgIHJldHVybiBBOwogICAgfQogIF07Cn0sICFTVVBQT1JUU19ZKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN0YXJ0cy13aXRoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN0YXJ0cy13aXRoLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIikuZjsKdmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIik7CnZhciBub3RBUmVnRXhwID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm90LWEtcmVnZXhwLmpzIik7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7CnZhciBjb3JyZWN0SXNSZWdFeHBMb2dpYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwoKdmFyIG5hdGl2ZVN0YXJ0c1dpdGggPSAnJy5zdGFydHNXaXRoOwp2YXIgbWluID0gTWF0aC5taW47Cgp2YXIgQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgPSBjb3JyZWN0SXNSZWdFeHBMb2dpYygnc3RhcnRzV2l0aCcpOwovLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9wdWxsLzcwMgp2YXIgTUROX1BPTFlGSUxMX0JVRyA9ICFJU19QVVJFICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyAmJiAhIWZ1bmN0aW9uICgpIHsKICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnc3RhcnRzV2l0aCcpOwogIHJldHVybiBkZXNjcmlwdG9yICYmICFkZXNjcmlwdG9yLndyaXRhYmxlOwp9KCk7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zdGFydHN3aXRoCiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhTUROX1BPTFlGSUxMX0JVRyAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgfSwgewogIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7CiAgICB2YXIgdGhhdCA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTsKICAgIG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKTsKICAgIHZhciBpbmRleCA9IHRvTGVuZ3RoKG1pbihhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgdGhhdC5sZW5ndGgpKTsKICAgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTsKICAgIHJldHVybiBuYXRpdmVTdGFydHNXaXRoCiAgICAgID8gbmF0aXZlU3RhcnRzV2l0aC5jYWxsKHRoYXQsIHNlYXJjaCwgaW5kZXgpCiAgICAgIDogdGhhdC5zbGljZShpbmRleCwgaW5kZXggKyBzZWFyY2gubGVuZ3RoKSA9PT0gc2VhcmNoOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdHJpa2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN0cmlrZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgY3JlYXRlSFRNTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtaHRtbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWh0bWwuanMiKTsKdmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZC5qcyIpOwoKLy8gYFN0cmluZy5wcm90b3R5cGUuc3RyaWtlYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zdHJpa2UKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ3N0cmlrZScpIH0sIHsKICBzdHJpa2U6IGZ1bmN0aW9uIHN0cmlrZSgpIHsKICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzdHJpa2UnLCAnJywgJycpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdWIuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN1Yi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgY3JlYXRlSFRNTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtaHRtbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWh0bWwuanMiKTsKdmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZC5qcyIpOwoKLy8gYFN0cmluZy5wcm90b3R5cGUuc3ViYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zdWIKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ3N1YicpIH0sIHsKICBzdWI6IGZ1bmN0aW9uIHN1YigpIHsKICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzdWInLCAnJywgJycpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdXAuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN1cC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgY3JlYXRlSFRNTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtaHRtbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWh0bWwuanMiKTsKdmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZm9yY2VkLXN0cmluZy1odG1sLW1ldGhvZC5qcyIpOwoKLy8gYFN0cmluZy5wcm90b3R5cGUuc3VwYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zdXAKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ3N1cCcpIH0sIHsKICBzdXA6IGZ1bmN0aW9uIHN1cCgpIHsKICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzdXAnLCAnJywgJycpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLWVuZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLWVuZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciAkdHJpbUVuZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctdHJpbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiKS5lbmQ7CnZhciBmb3JjZWRTdHJpbmdUcmltTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctdHJpbS1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctdHJpbS1tZXRob2QuanMiKTsKCnZhciBGT1JDRUQgPSBmb3JjZWRTdHJpbmdUcmltTWV0aG9kKCd0cmltRW5kJyk7Cgp2YXIgdHJpbUVuZCA9IEZPUkNFRCA/IGZ1bmN0aW9uIHRyaW1FbmQoKSB7CiAgcmV0dXJuICR0cmltRW5kKHRoaXMpOwp9IDogJycudHJpbUVuZDsKCi8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbUVuZCwgdHJpbVJpZ2h0IH1gIG1ldGhvZHMKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvZWNtYXNjcmlwdC1zdHJpbmctbGVmdC1yaWdodC10cmltCiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwgewogIHRyaW1FbmQ6IHRyaW1FbmQsCiAgdHJpbVJpZ2h0OiB0cmltRW5kCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS1zdGFydC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tc3RhcnQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciAkdHJpbVN0YXJ0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy10cmltICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qcyIpLnN0YXJ0Owp2YXIgZm9yY2VkU3RyaW5nVHJpbU1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLXRyaW0tbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mb3JjZWQtc3RyaW5nLXRyaW0tbWV0aG9kLmpzIik7Cgp2YXIgRk9SQ0VEID0gZm9yY2VkU3RyaW5nVHJpbU1ldGhvZCgndHJpbVN0YXJ0Jyk7Cgp2YXIgdHJpbVN0YXJ0ID0gRk9SQ0VEID8gZnVuY3Rpb24gdHJpbVN0YXJ0KCkgewogIHJldHVybiAkdHJpbVN0YXJ0KHRoaXMpOwp9IDogJycudHJpbVN0YXJ0OwoKLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltU3RhcnQsIHRyaW1MZWZ0IH1gIG1ldGhvZHMKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvZWNtYXNjcmlwdC1zdHJpbmctbGVmdC1yaWdodC10cmltCiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwgewogIHRyaW1TdGFydDogdHJpbVN0YXJ0LAogIHRyaW1MZWZ0OiB0cmltU3RhcnQKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICR0cmltID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy10cmltICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qcyIpLnRyaW07CnZhciBmb3JjZWRTdHJpbmdUcmltTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctdHJpbS1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZvcmNlZC1zdHJpbmctdHJpbS1tZXRob2QuanMiKTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW1gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW0KJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ1RyaW1NZXRob2QoJ3RyaW0nKSB9LCB7CiAgdHJpbTogZnVuY3Rpb24gdHJpbSgpIHsKICAgIHJldHVybiAkdHJpbSh0aGlzKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLmFzeW5jSXRlcmF0b3JgIHdlbGwta25vd24gc3ltYm9sCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5hc3luY2l0ZXJhdG9yCmRlZmluZVdlbGxLbm93blN5bWJvbCgnYXN5bmNJdGVyYXRvcicpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb24uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Ci8vIGBTeW1ib2wucHJvdG90eXBlLmRlc2NyaXB0aW9uYCBnZXR0ZXIKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS5kZXNjcmlwdGlvbgoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiKTsKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIikuZjsKdmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanMiKTsKCnZhciBOYXRpdmVTeW1ib2wgPSBnbG9iYWwuU3ltYm9sOwoKaWYgKERFU0NSSVBUT1JTICYmIHR5cGVvZiBOYXRpdmVTeW1ib2wgPT0gJ2Z1bmN0aW9uJyAmJiAoISgnZGVzY3JpcHRpb24nIGluIE5hdGl2ZVN5bWJvbC5wcm90b3R5cGUpIHx8CiAgLy8gU2FmYXJpIDEyIGJ1ZwogIE5hdGl2ZVN5bWJvbCgpLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQKKSkgewogIHZhciBFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmUgPSB7fTsKICAvLyB3cmFwIFN5bWJvbCBjb25zdHJ1Y3RvciBmb3IgY29ycmVjdCB3b3JrIHdpdGggdW5kZWZpbmVkIGRlc2NyaXB0aW9uCiAgdmFyIFN5bWJvbFdyYXBwZXIgPSBmdW5jdGlvbiBTeW1ib2woKSB7CiAgICB2YXIgZGVzY3JpcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoIDwgMSB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFN0cmluZyhhcmd1bWVudHNbMF0pOwogICAgdmFyIHJlc3VsdCA9IHRoaXMgaW5zdGFuY2VvZiBTeW1ib2xXcmFwcGVyCiAgICAgID8gbmV3IE5hdGl2ZVN5bWJvbChkZXNjcmlwdGlvbikKICAgICAgLy8gaW4gRWRnZSAxMywgU3RyaW5nKFN5bWJvbCh1bmRlZmluZWQpKSA9PT0gJ1N5bWJvbCh1bmRlZmluZWQpJwogICAgICA6IGRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQgPyBOYXRpdmVTeW1ib2woKSA6IE5hdGl2ZVN5bWJvbChkZXNjcmlwdGlvbik7CiAgICBpZiAoZGVzY3JpcHRpb24gPT09ICcnKSBFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmVbcmVzdWx0XSA9IHRydWU7CiAgICByZXR1cm4gcmVzdWx0OwogIH07CiAgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhTeW1ib2xXcmFwcGVyLCBOYXRpdmVTeW1ib2wpOwogIHZhciBzeW1ib2xQcm90b3R5cGUgPSBTeW1ib2xXcmFwcGVyLnByb3RvdHlwZSA9IE5hdGl2ZVN5bWJvbC5wcm90b3R5cGU7CiAgc3ltYm9sUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ltYm9sV3JhcHBlcjsKCiAgdmFyIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG90eXBlLnRvU3RyaW5nOwogIHZhciBuYXRpdmUgPSBTdHJpbmcoTmF0aXZlU3ltYm9sKCd0ZXN0JykpID09ICdTeW1ib2wodGVzdCknOwogIHZhciByZWdleHAgPSAvXlN5bWJvbFwoKC4qKVwpW14pXSskLzsKICBkZWZpbmVQcm9wZXJ0eShzeW1ib2xQcm90b3R5cGUsICdkZXNjcmlwdGlvbicsIHsKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgIGdldDogZnVuY3Rpb24gZGVzY3JpcHRpb24oKSB7CiAgICAgIHZhciBzeW1ib2wgPSBpc09iamVjdCh0aGlzKSA/IHRoaXMudmFsdWVPZigpIDogdGhpczsKICAgICAgdmFyIHN0cmluZyA9IHN5bWJvbFRvU3RyaW5nLmNhbGwoc3ltYm9sKTsKICAgICAgaWYgKGhhcyhFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmUsIHN5bWJvbCkpIHJldHVybiAnJzsKICAgICAgdmFyIGRlc2MgPSBuYXRpdmUgPyBzdHJpbmcuc2xpY2UoNywgLTEpIDogc3RyaW5nLnJlcGxhY2UocmVnZXhwLCAnJDEnKTsKICAgICAgcmV0dXJuIGRlc2MgPT09ICcnID8gdW5kZWZpbmVkIDogZGVzYzsKICAgIH0KICB9KTsKCiAgJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiB0cnVlIH0sIHsKICAgIFN5bWJvbDogU3ltYm9sV3JhcHBlcgogIH0pOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5oYXMtaW5zdGFuY2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmhhcy1pbnN0YW5jZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLmhhc0luc3RhbmNlYCB3ZWxsLWtub3duIHN5bWJvbAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuaGFzaW5zdGFuY2UKZGVmaW5lV2VsbEtub3duU3ltYm9sKCdoYXNJbnN0YW5jZScpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaXMtY29uY2F0LXNwcmVhZGFibGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaXMtY29uY2F0LXNwcmVhZGFibGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZWAgd2VsbC1rbm93biBzeW1ib2wKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLmlzY29uY2F0c3ByZWFkYWJsZQpkZWZpbmVXZWxsS25vd25TeW1ib2woJ2lzQ29uY2F0U3ByZWFkYWJsZScpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaXRlcmF0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaXRlcmF0b3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLml0ZXJhdG9yYCB3ZWxsLWtub3duIHN5bWJvbAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuaXRlcmF0b3IKZGVmaW5lV2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgTkFUSVZFX1NZTUJPTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtc3ltYm9sLmpzIik7CnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgaGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLmpzIik7CnZhciBpc0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIpOwp2YXIgdG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanMiKTsKdmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiKTsKdmFyIG5hdGl2ZU9iamVjdENyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzIik7CnZhciBvYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIpOwp2YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMiKTsKdmFyIGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMtZXh0ZXJuYWwuanMiKTsKdmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIik7CnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIpOwp2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIpOwp2YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzIik7CnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMiKTsKdmFyIHJlZGVmaW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZGVmaW5lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIpOwp2YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIik7CnZhciBzaGFyZWRLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2hhcmVkLWtleSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyIpOwp2YXIgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oaWRkZW4ta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiKTsKdmFyIHVpZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91aWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwp2YXIgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93cmFwcGVkLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93cmFwcGVkLXdlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKdmFyIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyIpOwp2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiKTsKdmFyICRmb3JFYWNoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLmpzIikuZm9yRWFjaDsKCnZhciBISURERU4gPSBzaGFyZWRLZXkoJ2hpZGRlbicpOwp2YXIgU1lNQk9MID0gJ1N5bWJvbCc7CnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJzsKdmFyIFRPX1BSSU1JVElWRSA9IHdlbGxLbm93blN5bWJvbCgndG9QcmltaXRpdmUnKTsKdmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTWU1CT0wpOwp2YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0W1BST1RPVFlQRV07CnZhciAkU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDsKdmFyICRzdHJpbmdpZnkgPSBnZXRCdWlsdEluKCdKU09OJywgJ3N0cmluZ2lmeScpOwp2YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7CnZhciBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7CnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsLmY7CnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmY7CnZhciBBbGxTeW1ib2xzID0gc2hhcmVkKCdzeW1ib2xzJyk7CnZhciBPYmplY3RQcm90b3R5cGVTeW1ib2xzID0gc2hhcmVkKCdvcC1zeW1ib2xzJyk7CnZhciBTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5Jyk7CnZhciBTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5Jyk7CnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpOwp2YXIgUU9iamVjdCA9IGdsb2JhbC5RT2JqZWN0OwovLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzMKdmFyIFVTRV9TRVRURVIgPSAhUU9iamVjdCB8fCAhUU9iamVjdFtQUk9UT1RZUEVdIHx8ICFRT2JqZWN0W1BST1RPVFlQRV0uZmluZENoaWxkOwoKLy8gZmFsbGJhY2sgZm9yIG9sZCBBbmRyb2lkLCBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Njg3CnZhciBzZXRTeW1ib2xEZXNjcmlwdG9yID0gREVTQ1JJUFRPUlMgJiYgZmFpbHMoZnVuY3Rpb24gKCkgewogIHJldHVybiBuYXRpdmVPYmplY3RDcmVhdGUobmF0aXZlRGVmaW5lUHJvcGVydHkoe30sICdhJywgewogICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYScsIHsgdmFsdWU6IDcgfSkuYTsgfQogIH0pKS5hICE9IDc7Cn0pID8gZnVuY3Rpb24gKE8sIFAsIEF0dHJpYnV0ZXMpIHsKICB2YXIgT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvciA9IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3RQcm90b3R5cGUsIFApOwogIGlmIChPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKSBkZWxldGUgT2JqZWN0UHJvdG90eXBlW1BdOwogIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpOwogIGlmIChPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yICYmIE8gIT09IE9iamVjdFByb3RvdHlwZSkgewogICAgbmF0aXZlRGVmaW5lUHJvcGVydHkoT2JqZWN0UHJvdG90eXBlLCBQLCBPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKTsKICB9Cn0gOiBuYXRpdmVEZWZpbmVQcm9wZXJ0eTsKCnZhciB3cmFwID0gZnVuY3Rpb24gKHRhZywgZGVzY3JpcHRpb24pIHsKICB2YXIgc3ltYm9sID0gQWxsU3ltYm9sc1t0YWddID0gbmF0aXZlT2JqZWN0Q3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFXSk7CiAgc2V0SW50ZXJuYWxTdGF0ZShzeW1ib2wsIHsKICAgIHR5cGU6IFNZTUJPTCwKICAgIHRhZzogdGFnLAogICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uCiAgfSk7CiAgaWYgKCFERVNDUklQVE9SUykgc3ltYm9sLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CiAgcmV0dXJuIHN5bWJvbDsKfTsKCnZhciBpc1N5bWJvbCA9IE5BVElWRV9TWU1CT0wgJiYgdHlwZW9mICRTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCcgPyBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnOwp9IDogZnVuY3Rpb24gKGl0KSB7CiAgcmV0dXJuIE9iamVjdChpdCkgaW5zdGFuY2VvZiAkU3ltYm9sOwp9OwoKdmFyICRkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHsKICBpZiAoTyA9PT0gT2JqZWN0UHJvdG90eXBlKSAkZGVmaW5lUHJvcGVydHkoT2JqZWN0UHJvdG90eXBlU3ltYm9scywgUCwgQXR0cmlidXRlcyk7CiAgYW5PYmplY3QoTyk7CiAgdmFyIGtleSA9IHRvUHJpbWl0aXZlKFAsIHRydWUpOwogIGFuT2JqZWN0KEF0dHJpYnV0ZXMpOwogIGlmIChoYXMoQWxsU3ltYm9scywga2V5KSkgewogICAgaWYgKCFBdHRyaWJ1dGVzLmVudW1lcmFibGUpIHsKICAgICAgaWYgKCFoYXMoTywgSElEREVOKSkgbmF0aXZlRGVmaW5lUHJvcGVydHkoTywgSElEREVOLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwge30pKTsKICAgICAgT1tISURERU5dW2tleV0gPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGhhcyhPLCBISURERU4pICYmIE9bSElEREVOXVtrZXldKSBPW0hJRERFTl1ba2V5XSA9IGZhbHNlOwogICAgICBBdHRyaWJ1dGVzID0gbmF0aXZlT2JqZWN0Q3JlYXRlKEF0dHJpYnV0ZXMsIHsgZW51bWVyYWJsZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIGZhbHNlKSB9KTsKICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2NyaXB0b3IoTywga2V5LCBBdHRyaWJ1dGVzKTsKICB9IHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBrZXksIEF0dHJpYnV0ZXMpOwp9OwoKdmFyICRkZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7CiAgYW5PYmplY3QoTyk7CiAgdmFyIHByb3BlcnRpZXMgPSB0b0luZGV4ZWRPYmplY3QoUHJvcGVydGllcyk7CiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKHByb3BlcnRpZXMpLmNvbmNhdCgkZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByb3BlcnRpZXMpKTsKICAkZm9yRWFjaChrZXlzLCBmdW5jdGlvbiAoa2V5KSB7CiAgICBpZiAoIURFU0NSSVBUT1JTIHx8ICRwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHByb3BlcnRpZXMsIGtleSkpICRkZWZpbmVQcm9wZXJ0eShPLCBrZXksIHByb3BlcnRpZXNba2V5XSk7CiAgfSk7CiAgcmV0dXJuIE87Cn07Cgp2YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7CiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IG5hdGl2ZU9iamVjdENyZWF0ZShPKSA6ICRkZWZpbmVQcm9wZXJ0aWVzKG5hdGl2ZU9iamVjdENyZWF0ZShPKSwgUHJvcGVydGllcyk7Cn07Cgp2YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikgewogIHZhciBQID0gdG9QcmltaXRpdmUoViwgdHJ1ZSk7CiAgdmFyIGVudW1lcmFibGUgPSBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHRoaXMsIFApOwogIGlmICh0aGlzID09PSBPYmplY3RQcm90b3R5cGUgJiYgaGFzKEFsbFN5bWJvbHMsIFApICYmICFoYXMoT2JqZWN0UHJvdG90eXBlU3ltYm9scywgUCkpIHJldHVybiBmYWxzZTsKICByZXR1cm4gZW51bWVyYWJsZSB8fCAhaGFzKHRoaXMsIFApIHx8ICFoYXMoQWxsU3ltYm9scywgUCkgfHwgaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW1BdID8gZW51bWVyYWJsZSA6IHRydWU7Cn07Cgp2YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7CiAgdmFyIGl0ID0gdG9JbmRleGVkT2JqZWN0KE8pOwogIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTsKICBpZiAoaXQgPT09IE9iamVjdFByb3RvdHlwZSAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9iamVjdFByb3RvdHlwZVN5bWJvbHMsIGtleSkpIHJldHVybjsKICB2YXIgZGVzY3JpcHRvciA9IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KTsKICBpZiAoZGVzY3JpcHRvciAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKSB7CiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlOwogIH0KICByZXR1cm4gZGVzY3JpcHRvcjsKfTsKCnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykgewogIHZhciBuYW1lcyA9IG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXModG9JbmRleGVkT2JqZWN0KE8pKTsKICB2YXIgcmVzdWx0ID0gW107CiAgJGZvckVhY2gobmFtZXMsIGZ1bmN0aW9uIChrZXkpIHsKICAgIGlmICghaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhoaWRkZW5LZXlzLCBrZXkpKSByZXN1bHQucHVzaChrZXkpOwogIH0pOwogIHJldHVybiByZXN1bHQ7Cn07Cgp2YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhPKSB7CiAgdmFyIElTX09CSkVDVF9QUk9UT1RZUEUgPSBPID09PSBPYmplY3RQcm90b3R5cGU7CiAgdmFyIG5hbWVzID0gbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyhJU19PQkpFQ1RfUFJPVE9UWVBFID8gT2JqZWN0UHJvdG90eXBlU3ltYm9scyA6IHRvSW5kZXhlZE9iamVjdChPKSk7CiAgdmFyIHJlc3VsdCA9IFtdOwogICRmb3JFYWNoKG5hbWVzLCBmdW5jdGlvbiAoa2V5KSB7CiAgICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgKCFJU19PQkpFQ1RfUFJPVE9UWVBFIHx8IGhhcyhPYmplY3RQcm90b3R5cGUsIGtleSkpKSB7CiAgICAgIHJlc3VsdC5wdXNoKEFsbFN5bWJvbHNba2V5XSk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIHJlc3VsdDsKfTsKCi8vIGBTeW1ib2xgIGNvbnN0cnVjdG9yCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC1jb25zdHJ1Y3RvcgppZiAoIU5BVElWRV9TWU1CT0wpIHsKICAkU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKCkgewogICAgaWYgKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKSB0aHJvdyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvcicpOwogICAgdmFyIGRlc2NyaXB0aW9uID0gIWFyZ3VtZW50cy5sZW5ndGggfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdHJpbmcoYXJndW1lbnRzWzBdKTsKICAgIHZhciB0YWcgPSB1aWQoZGVzY3JpcHRpb24pOwogICAgdmFyIHNldHRlciA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG90eXBlKSBzZXR0ZXIuY2FsbChPYmplY3RQcm90b3R5cGVTeW1ib2xzLCB2YWx1ZSk7CiAgICAgIGlmIChoYXModGhpcywgSElEREVOKSAmJiBoYXModGhpc1tISURERU5dLCB0YWcpKSB0aGlzW0hJRERFTl1bdGFnXSA9IGZhbHNlOwogICAgICBzZXRTeW1ib2xEZXNjcmlwdG9yKHRoaXMsIHRhZywgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7CiAgICB9OwogICAgaWYgKERFU0NSSVBUT1JTICYmIFVTRV9TRVRURVIpIHNldFN5bWJvbERlc2NyaXB0b3IoT2JqZWN0UHJvdG90eXBlLCB0YWcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCBzZXQ6IHNldHRlciB9KTsKICAgIHJldHVybiB3cmFwKHRhZywgZGVzY3JpcHRpb24pOwogIH07CgogIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS50YWc7CiAgfSk7CgogIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7CiAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZiA9ICRkZWZpbmVQcm9wZXJ0eTsKICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mID0gZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsLmYgPSAkZ2V0T3duUHJvcGVydHlOYW1lczsKICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7CgogIGlmIChERVNDUklQVE9SUykgewogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtU3ltYm9sLWRlc2NyaXB0aW9uCiAgICBuYXRpdmVEZWZpbmVQcm9wZXJ0eSgkU3ltYm9sW1BST1RPVFlQRV0sICdkZXNjcmlwdGlvbicsIHsKICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICBnZXQ6IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkgewogICAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLmRlc2NyaXB0aW9uOwogICAgICB9CiAgICB9KTsKICAgIGlmICghSVNfUFVSRSkgewogICAgICByZWRlZmluZShPYmplY3RQcm90b3R5cGUsICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgeyB1bnNhZmU6IHRydWUgfSk7CiAgICB9CiAgfQp9CgppZiAoIVVTRV9TWU1CT0xfQVNfVUlEKSB7CiAgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mID0gZnVuY3Rpb24gKG5hbWUpIHsKICAgIHJldHVybiB3cmFwKHdlbGxLbm93blN5bWJvbChuYW1lKSwgbmFtZSk7CiAgfTsKfQoKJCh7IGdsb2JhbDogdHJ1ZSwgd3JhcDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCwgc2hhbTogIU5BVElWRV9TWU1CT0wgfSwgewogIFN5bWJvbDogJFN5bWJvbAp9KTsKCiRmb3JFYWNoKG9iamVjdEtleXMoV2VsbEtub3duU3ltYm9sc1N0b3JlKSwgZnVuY3Rpb24gKG5hbWUpIHsKICBkZWZpbmVXZWxsS25vd25TeW1ib2wobmFtZSk7Cn0pOwoKJCh7IHRhcmdldDogU1lNQk9MLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MIH0sIHsKICAvLyBgU3ltYm9sLmZvcmAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLmZvcgogICdmb3InOiBmdW5jdGlvbiAoa2V5KSB7CiAgICB2YXIgc3RyaW5nID0gU3RyaW5nKGtleSk7CiAgICBpZiAoaGFzKFN0cmluZ1RvU3ltYm9sUmVnaXN0cnksIHN0cmluZykpIHJldHVybiBTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5W3N0cmluZ107CiAgICB2YXIgc3ltYm9sID0gJFN5bWJvbChzdHJpbmcpOwogICAgU3RyaW5nVG9TeW1ib2xSZWdpc3RyeVtzdHJpbmddID0gc3ltYm9sOwogICAgU3ltYm9sVG9TdHJpbmdSZWdpc3RyeVtzeW1ib2xdID0gc3RyaW5nOwogICAgcmV0dXJuIHN5bWJvbDsKICB9LAogIC8vIGBTeW1ib2wua2V5Rm9yYCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wua2V5Zm9yCiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioc3ltKSB7CiAgICBpZiAoIWlzU3ltYm9sKHN5bSkpIHRocm93IFR5cGVFcnJvcihzeW0gKyAnIGlzIG5vdCBhIHN5bWJvbCcpOwogICAgaWYgKGhhcyhTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5LCBzeW0pKSByZXR1cm4gU3ltYm9sVG9TdHJpbmdSZWdpc3RyeVtzeW1dOwogIH0sCiAgdXNlU2V0dGVyOiBmdW5jdGlvbiAoKSB7IFVTRV9TRVRURVIgPSB0cnVlOyB9LAogIHVzZVNpbXBsZTogZnVuY3Rpb24gKCkgeyBVU0VfU0VUVEVSID0gZmFsc2U7IH0KfSk7CgokKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCwgc2hhbTogIURFU0NSSVBUT1JTIH0sIHsKICAvLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmNyZWF0ZQogIGNyZWF0ZTogJGNyZWF0ZSwKICAvLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHkKICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LAogIC8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnRpZXMKICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcywKICAvLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvcnMKICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKfSk7CgokKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCB9LCB7CiAgLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHluYW1lcwogIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLAogIC8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzYCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlzeW1ib2xzCiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiAkZ2V0T3duUHJvcGVydHlTeW1ib2xzCn0pOwoKLy8gQ2hyb21lIDM4IGFuZCAzOSBgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc2AgZmFpbHMgb24gcHJpbWl0aXZlcwovLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zNDQzCiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IGZhaWxzKGZ1bmN0aW9uICgpIHsgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmYoMSk7IH0pIH0sIHsKICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhpdCkgewogICAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mKHRvT2JqZWN0KGl0KSk7CiAgfQp9KTsKCi8vIGBKU09OLnN0cmluZ2lmeWAgbWV0aG9kIGJlaGF2aW9yIHdpdGggc3ltYm9scwovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1qc29uLnN0cmluZ2lmeQppZiAoJHN0cmluZ2lmeSkgewogIHZhciBGT1JDRURfSlNPTl9TVFJJTkdJRlkgPSAhTkFUSVZFX1NZTUJPTCB8fCBmYWlscyhmdW5jdGlvbiAoKSB7CiAgICB2YXIgc3ltYm9sID0gJFN5bWJvbCgpOwogICAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge30KICAgIHJldHVybiAkc3RyaW5naWZ5KFtzeW1ib2xdKSAhPSAnW251bGxdJwogICAgICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGwKICAgICAgfHwgJHN0cmluZ2lmeSh7IGE6IHN5bWJvbCB9KSAhPSAne30nCiAgICAgIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzCiAgICAgIHx8ICRzdHJpbmdpZnkoT2JqZWN0KHN5bWJvbCkpICE9ICd7fSc7CiAgfSk7CgogICQoeyB0YXJnZXQ6ICdKU09OJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRURfSlNPTl9TVFJJTkdJRlkgfSwgewogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzCiAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCwgcmVwbGFjZXIsIHNwYWNlKSB7CiAgICAgIHZhciBhcmdzID0gW2l0XTsKICAgICAgdmFyIGluZGV4ID0gMTsKICAgICAgdmFyICRyZXBsYWNlcjsKICAgICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpbmRleCkgYXJncy5wdXNoKGFyZ3VtZW50c1tpbmRleCsrXSk7CiAgICAgICRyZXBsYWNlciA9IHJlcGxhY2VyOwogICAgICBpZiAoIWlzT2JqZWN0KHJlcGxhY2VyKSAmJiBpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkgcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkCiAgICAgIGlmICghaXNBcnJheShyZXBsYWNlcikpIHJlcGxhY2VyID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICBpZiAodHlwZW9mICRyZXBsYWNlciA9PSAnZnVuY3Rpb24nKSB2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpOwogICAgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSByZXR1cm4gdmFsdWU7CiAgICAgIH07CiAgICAgIGFyZ3NbMV0gPSByZXBsYWNlcjsKICAgICAgcmV0dXJuICRzdHJpbmdpZnkuYXBwbHkobnVsbCwgYXJncyk7CiAgICB9CiAgfSk7Cn0KCi8vIGBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS1AQHRvcHJpbWl0aXZlCmlmICghJFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0pIHsKICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoJFN5bWJvbFtQUk9UT1RZUEVdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFXS52YWx1ZU9mKTsKfQovLyBgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXWAgcHJvcGVydHkKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS1AQHRvc3RyaW5ndGFnCnNldFRvU3RyaW5nVGFnKCRTeW1ib2wsIFNZTUJPTCk7CgpoaWRkZW5LZXlzW0hJRERFTl0gPSB0cnVlOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2gtYWxsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5tYXRjaC1hbGwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKLy8gYFN5bWJvbC5tYXRjaEFsbGAgd2VsbC1rbm93biBzeW1ib2wKZGVmaW5lV2VsbEtub3duU3ltYm9sKCdtYXRjaEFsbCcpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2guanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2guanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLm1hdGNoYCB3ZWxsLWtub3duIHN5bWJvbAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wubWF0Y2gKZGVmaW5lV2VsbEtub3duU3ltYm9sKCdtYXRjaCcpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wucmVwbGFjZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnJlcGxhY2UuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCi8vIGBTeW1ib2wucmVwbGFjZWAgd2VsbC1rbm93biBzeW1ib2wKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnJlcGxhY2UKZGVmaW5lV2VsbEtub3duU3ltYm9sKCdyZXBsYWNlJyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5zZWFyY2guanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnNlYXJjaC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLnNlYXJjaGAgd2VsbC1rbm93biBzeW1ib2wKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnNlYXJjaApkZWZpbmVXZWxsS25vd25TeW1ib2woJ3NlYXJjaCcpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuc3BlY2llcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnNwZWNpZXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCi8vIGBTeW1ib2wuc3BlY2llc2Agd2VsbC1rbm93biBzeW1ib2wKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnNwZWNpZXMKZGVmaW5lV2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5zcGxpdC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5zcGxpdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCi8vIGBTeW1ib2wuc3BsaXRgIHdlbGwta25vd24gc3ltYm9sCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5zcGxpdApkZWZpbmVXZWxsS25vd25TeW1ib2woJ3NwbGl0Jyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC50by1wcmltaXRpdmUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnRvLXByaW1pdGl2ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLnRvUHJpbWl0aXZlYCB3ZWxsLWtub3duIHN5bWJvbAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wudG9wcmltaXRpdmUKZGVmaW5lV2VsbEtub3duU3ltYm9sKCd0b1ByaW1pdGl2ZScpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wudG8tc3RyaW5nLXRhZy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnRvLXN0cmluZy10YWcuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCi8vIGBTeW1ib2wudG9TdHJpbmdUYWdgIHdlbGwta25vd24gc3ltYm9sCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC50b3N0cmluZ3RhZwpkZWZpbmVXZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC51bnNjb3BhYmxlcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC51bnNjb3BhYmxlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCi8vIGBTeW1ib2wudW5zY29wYWJsZXNgIHdlbGwta25vd24gc3ltYm9sCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC51bnNjb3BhYmxlcwpkZWZpbmVXZWxsS25vd25TeW1ib2woJ3Vuc2NvcGFibGVzJyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmNvcHktd2l0aGluLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5jb3B5LXdpdGhpbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwp2YXIgJGNvcHlXaXRoaW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktY29weS13aXRoaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWNvcHktd2l0aGluLmpzIik7Cgp2YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Owp2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDsKCi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLmNvcHlXaXRoaW5gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmNvcHl3aXRoaW4KZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnY29weVdpdGhpbicsIGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0LCBzdGFydCAvKiAsIGVuZCAqLykgewogIHJldHVybiAkY29weVdpdGhpbi5jYWxsKGFUeXBlZEFycmF5KHRoaXMpLCB0YXJnZXQsIHN0YXJ0LCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5ldmVyeS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZXZlcnkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMiKTsKdmFyICRldmVyeSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLmV2ZXJ5OwoKdmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTsKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuZXZlcnkKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZXZlcnknLCBmdW5jdGlvbiBldmVyeShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogIHJldHVybiAkZXZlcnkoYVR5cGVkQXJyYXkodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbGwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmlsbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7CnZhciAkZmlsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1maWxsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1maWxsLmpzIik7Cgp2YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Owp2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDsKCi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLmZpbGxgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmZpbGwKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzCmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2ZpbGwnLCBmdW5jdGlvbiBmaWxsKHZhbHVlIC8qICwgc3RhcnQsIGVuZCAqLykgewogIHJldHVybiAkZmlsbC5hcHBseShhVHlwZWRBcnJheSh0aGlzKSwgYXJndW1lbnRzKTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbHRlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbHRlci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMiKTsKdmFyICRmaWx0ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiKS5maWx0ZXI7CnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIpOwoKdmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTsKdmFyIGFUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Q29uc3RydWN0b3I7CnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwoKLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5maWx0ZXIKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZmlsdGVyJywgZnVuY3Rpb24gZmlsdGVyKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7CiAgdmFyIGxpc3QgPSAkZmlsdGVyKGFUeXBlZEFycmF5KHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7CiAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CiAgdmFyIGluZGV4ID0gMDsKICB2YXIgbGVuZ3RoID0gbGlzdC5sZW5ndGg7CiAgdmFyIHJlc3VsdCA9IG5ldyAoYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihDKSkobGVuZ3RoKTsKICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHJlc3VsdFtpbmRleF0gPSBsaXN0W2luZGV4KytdOwogIHJldHVybiByZXN1bHQ7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maW5kLWluZGV4LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbmQtaW5kZXguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwp2YXIgJGZpbmRJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLmZpbmRJbmRleDsKCnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7CnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwoKLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZmluZEluZGV4YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5maW5kaW5kZXgKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZmluZEluZGV4JywgZnVuY3Rpb24gZmluZEluZGV4KHByZWRpY2F0ZSAvKiAsIHRoaXNBcmcgKi8pIHsKICByZXR1cm4gJGZpbmRJbmRleChhVHlwZWRBcnJheSh0aGlzKSwgcHJlZGljYXRlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maW5kLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwp2YXIgJGZpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiKS5maW5kOwoKdmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTsKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5maW5kYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5maW5kCmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2ZpbmQnLCBmdW5jdGlvbiBmaW5kKHByZWRpY2F0ZSAvKiAsIHRoaXNBcmcgKi8pIHsKICByZXR1cm4gJGZpbmQoYVR5cGVkQXJyYXkodGhpcyksIHByZWRpY2F0ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmxvYXQzMi1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5mbG9hdDMyLWFycmF5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yLmpzIik7CgovLyBgRmxvYXQzMkFycmF5YCBjb25zdHJ1Y3RvcgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10eXBlZGFycmF5LW9iamVjdHMKY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yKCdGbG9hdDMyJywgZnVuY3Rpb24gKGluaXQpIHsKICByZXR1cm4gZnVuY3Rpb24gRmxvYXQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkgewogICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTsKICB9Owp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmxvYXQ2NC1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5mbG9hdDY0LWFycmF5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yLmpzIik7CgovLyBgRmxvYXQ2NEFycmF5YCBjb25zdHJ1Y3RvcgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10eXBlZGFycmF5LW9iamVjdHMKY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yKCdGbG9hdDY0JywgZnVuY3Rpb24gKGluaXQpIHsKICByZXR1cm4gZnVuY3Rpb24gRmxvYXQ2NEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkgewogICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTsKICB9Owp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZm9yLWVhY2guanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZvci1lYWNoLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7CnZhciAkZm9yRWFjaCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLmZvckVhY2g7Cgp2YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Owp2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDsKCi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmZvcmVhY2gKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZm9yRWFjaCcsIGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHsKICAkZm9yRWFjaChhVHlwZWRBcnJheSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZnJvbS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5mcm9tLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBUWVBFRF9BUlJBWVNfQ09OU1RSVUNUT1JTX1JFUVVJUkVTX1dSQVBQRVJTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5cy1jb25zdHJ1Y3RvcnMtcmVxdWlyZXMtd3JhcHBlcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5cy1jb25zdHJ1Y3RvcnMtcmVxdWlyZXMtd3JhcHBlcnMuanMiKTsKdmFyIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpLmV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2Q7CnZhciB0eXBlZEFycmF5RnJvbSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90eXBlZC1hcnJheS1mcm9tICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1mcm9tLmpzIik7CgovLyBgJVR5cGVkQXJyYXklLmZyb21gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUuZnJvbQpleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kKCdmcm9tJywgdHlwZWRBcnJheUZyb20sIFRZUEVEX0FSUkFZU19DT05TVFJVQ1RPUlNfUkVRVUlSRVNfV1JBUFBFUlMpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbmNsdWRlcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW5jbHVkZXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMiKTsKdmFyICRpbmNsdWRlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiKS5pbmNsdWRlczsKCnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7CnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwoKLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmluY2x1ZGVzCmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2luY2x1ZGVzJywgZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCAqLykgewogIHJldHVybiAkaW5jbHVkZXMoYVR5cGVkQXJyYXkodGhpcyksIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmluZGV4LW9mLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbmRleC1vZi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwp2YXIgJGluZGV4T2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzLmpzIikuaW5kZXhPZjsKCnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7CnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwoKLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuaW5kZXhPZmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuaW5kZXhvZgpleHBvcnRUeXBlZEFycmF5TWV0aG9kKCdpbmRleE9mJywgZnVuY3Rpb24gaW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ICovKSB7CiAgcmV0dXJuICRpbmRleE9mKGFUeXBlZEFycmF5KHRoaXMpLCBzZWFyY2hFbGVtZW50LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbnQxNi1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50MTYtYXJyYXkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yLmpzIik7CgovLyBgSW50MTZBcnJheWAgY29uc3RydWN0b3IKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZWRhcnJheS1vYmplY3RzCmNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcignSW50MTYnLCBmdW5jdGlvbiAoaW5pdCkgewogIHJldHVybiBmdW5jdGlvbiBJbnQxNkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkgewogICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTsKICB9Owp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50MzItYXJyYXkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDMyLWFycmF5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qcyIpOwoKLy8gYEludDMyQXJyYXlgIGNvbnN0cnVjdG9yCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0cwpjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IoJ0ludDMyJywgZnVuY3Rpb24gKGluaXQpIHsKICByZXR1cm4gZnVuY3Rpb24gSW50MzJBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHsKICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7CiAgfTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDgtYXJyYXkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50OC1hcnJheS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qcyIpOwoKLy8gYEludDhBcnJheWAgY29uc3RydWN0b3IKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZWRhcnJheS1vYmplY3RzCmNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcignSW50OCcsIGZ1bmN0aW9uIChpbml0KSB7CiAgcmV0dXJuIGZ1bmN0aW9uIEludDhBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHsKICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7CiAgfTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5Lml0ZXJhdG9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pdGVyYXRvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7CnZhciBBcnJheUl0ZXJhdG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKdmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwp2YXIgVWludDhBcnJheSA9IGdsb2JhbC5VaW50OEFycmF5Owp2YXIgYXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9ycy52YWx1ZXM7CnZhciBhcnJheUtleXMgPSBBcnJheUl0ZXJhdG9ycy5rZXlzOwp2YXIgYXJyYXlFbnRyaWVzID0gQXJyYXlJdGVyYXRvcnMuZW50cmllczsKdmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTsKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7CnZhciBuYXRpdmVUeXBlZEFycmF5SXRlcmF0b3IgPSBVaW50OEFycmF5ICYmIFVpbnQ4QXJyYXkucHJvdG90eXBlW0lURVJBVE9SXTsKCnZhciBDT1JSRUNUX0lURVJfTkFNRSA9ICEhbmF0aXZlVHlwZWRBcnJheUl0ZXJhdG9yCiAgJiYgKG5hdGl2ZVR5cGVkQXJyYXlJdGVyYXRvci5uYW1lID09ICd2YWx1ZXMnIHx8IG5hdGl2ZVR5cGVkQXJyYXlJdGVyYXRvci5uYW1lID09IHVuZGVmaW5lZCk7Cgp2YXIgdHlwZWRBcnJheVZhbHVlcyA9IGZ1bmN0aW9uIHZhbHVlcygpIHsKICByZXR1cm4gYXJyYXlWYWx1ZXMuY2FsbChhVHlwZWRBcnJheSh0aGlzKSk7Cn07CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5lbnRyaWVzCmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2VudHJpZXMnLCBmdW5jdGlvbiBlbnRyaWVzKCkgewogIHJldHVybiBhcnJheUVudHJpZXMuY2FsbChhVHlwZWRBcnJheSh0aGlzKSk7Cn0pOwovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5rZXlzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5rZXlzCmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2tleXMnLCBmdW5jdGlvbiBrZXlzKCkgewogIHJldHVybiBhcnJheUtleXMuY2FsbChhVHlwZWRBcnJheSh0aGlzKSk7Cn0pOwovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS52YWx1ZXNgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnZhbHVlcwpleHBvcnRUeXBlZEFycmF5TWV0aG9kKCd2YWx1ZXMnLCB0eXBlZEFycmF5VmFsdWVzLCAhQ09SUkVDVF9JVEVSX05BTUUpOwovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUtQEBpdGVyYXRvcgpleHBvcnRUeXBlZEFycmF5TWV0aG9kKElURVJBVE9SLCB0eXBlZEFycmF5VmFsdWVzLCAhQ09SUkVDVF9JVEVSX05BTUUpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5qb2luLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmpvaW4uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwoKdmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTsKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7CnZhciAkam9pbiA9IFtdLmpvaW47CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5qb2luYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5qb2luCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycwpleHBvcnRUeXBlZEFycmF5TWV0aG9kKCdqb2luJywgZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpIHsKICByZXR1cm4gJGpvaW4uYXBwbHkoYVR5cGVkQXJyYXkodGhpcyksIGFyZ3VtZW50cyk7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5sYXN0LWluZGV4LW9mLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5Lmxhc3QtaW5kZXgtb2YuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwp2YXIgJGxhc3RJbmRleE9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWxhc3QtaW5kZXgtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWxhc3QtaW5kZXgtb2YuanMiKTsKCnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7CnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwoKLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUubGFzdEluZGV4T2ZgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmxhc3RpbmRleG9mCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycwpleHBvcnRUeXBlZEFycmF5TWV0aG9kKCdsYXN0SW5kZXhPZicsIGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggKi8pIHsKICByZXR1cm4gJGxhc3RJbmRleE9mLmFwcGx5KGFUeXBlZEFycmF5KHRoaXMpLCBhcmd1bWVudHMpOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkubWFwLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkubWFwLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwp2YXIgJG1hcCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLm1hcDsKdmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIik7Cgp2YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Owp2YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjsKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5tYXBgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLm1hcApleHBvcnRUeXBlZEFycmF5TWV0aG9kKCdtYXAnLCBmdW5jdGlvbiBtYXAobWFwZm4gLyogLCB0aGlzQXJnICovKSB7CiAgcmV0dXJuICRtYXAoYVR5cGVkQXJyYXkodGhpcyksIG1hcGZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgZnVuY3Rpb24gKE8sIGxlbmd0aCkgewogICAgcmV0dXJuIG5ldyAoYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihzcGVjaWVzQ29uc3RydWN0b3IoTywgTy5jb25zdHJ1Y3RvcikpKShsZW5ndGgpOwogIH0pOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkub2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5Lm9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7CnZhciBUWVBFRF9BUlJBWVNfQ09OU1RSVUNUT1JTX1JFUVVJUkVTX1dSQVBQRVJTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5cy1jb25zdHJ1Y3RvcnMtcmVxdWlyZXMtd3JhcHBlcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5cy1jb25zdHJ1Y3RvcnMtcmVxdWlyZXMtd3JhcHBlcnMuanMiKTsKCnZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yOwp2YXIgZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZDsKCi8vIGAlVHlwZWRBcnJheSUub2ZgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUub2YKZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZCgnb2YnLCBmdW5jdGlvbiBvZigvKiAuLi5pdGVtcyAqLykgewogIHZhciBpbmRleCA9IDA7CiAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgdmFyIHJlc3VsdCA9IG5ldyAoYVR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0aGlzKSkobGVuZ3RoKTsKICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHJlc3VsdFtpbmRleF0gPSBhcmd1bWVudHNbaW5kZXgrK107CiAgcmV0dXJuIHJlc3VsdDsKfSwgVFlQRURfQVJSQVlTX0NPTlNUUlVDVE9SU19SRVFVSVJFU19XUkFQUEVSUyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnJlZHVjZS1yaWdodC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnJlZHVjZS1yaWdodC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMiKTsKdmFyICRyZWR1Y2VSaWdodCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1yZWR1Y2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXJlZHVjZS5qcyIpLnJpZ2h0OwoKdmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTsKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5yZWR1Y2VSaWNodGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUucmVkdWNlcmlnaHQKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgncmVkdWNlUmlnaHQnLCBmdW5jdGlvbiByZWR1Y2VSaWdodChjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7CiAgcmV0dXJuICRyZWR1Y2VSaWdodChhVHlwZWRBcnJheSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpOwp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmVkdWNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmVkdWNlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwp2YXIgJHJlZHVjZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1yZWR1Y2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXJlZHVjZS5qcyIpLmxlZnQ7Cgp2YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Owp2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDsKCi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUucmVkdWNlCmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3JlZHVjZScsIGZ1bmN0aW9uIHJlZHVjZShjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7CiAgcmV0dXJuICRyZWR1Y2UoYVR5cGVkQXJyYXkodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnJldmVyc2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmV2ZXJzZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7Cgp2YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Owp2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDsKdmFyIGZsb29yID0gTWF0aC5mbG9vcjsKCi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnJldmVyc2VgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnJldmVyc2UKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgncmV2ZXJzZScsIGZ1bmN0aW9uIHJldmVyc2UoKSB7CiAgdmFyIHRoYXQgPSB0aGlzOwogIHZhciBsZW5ndGggPSBhVHlwZWRBcnJheSh0aGF0KS5sZW5ndGg7CiAgdmFyIG1pZGRsZSA9IGZsb29yKGxlbmd0aCAvIDIpOwogIHZhciBpbmRleCA9IDA7CiAgdmFyIHZhbHVlOwogIHdoaWxlIChpbmRleCA8IG1pZGRsZSkgewogICAgdmFsdWUgPSB0aGF0W2luZGV4XTsKICAgIHRoYXRbaW5kZXgrK10gPSB0aGF0Wy0tbGVuZ3RoXTsKICAgIHRoYXRbbGVuZ3RoXSA9IHZhbHVlOwogIH0gcmV0dXJuIHRoYXQ7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zZXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zZXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7CnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIpOwp2YXIgdG9PZmZzZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2Zmc2V0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vZmZzZXQuanMiKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIik7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKCnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7CnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwoKdmFyIEZPUkNFRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYKICBuZXcgSW50OEFycmF5KDEpLnNldCh7fSk7Cn0pOwoKLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuc2V0YCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5zZXQKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc2V0JywgZnVuY3Rpb24gc2V0KGFycmF5TGlrZSAvKiAsIG9mZnNldCAqLykgewogIGFUeXBlZEFycmF5KHRoaXMpOwogIHZhciBvZmZzZXQgPSB0b09mZnNldChhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMSk7CiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoOwogIHZhciBzcmMgPSB0b09iamVjdChhcnJheUxpa2UpOwogIHZhciBsZW4gPSB0b0xlbmd0aChzcmMubGVuZ3RoKTsKICB2YXIgaW5kZXggPSAwOwogIGlmIChsZW4gKyBvZmZzZXQgPiBsZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCcpOwogIHdoaWxlIChpbmRleCA8IGxlbikgdGhpc1tvZmZzZXQgKyBpbmRleF0gPSBzcmNbaW5kZXgrK107Cn0sIEZPUkNFRCk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNsaWNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zbGljZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpOwp2YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwoKdmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTsKdmFyIGFUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Q29uc3RydWN0b3I7CnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwp2YXIgJHNsaWNlID0gW10uc2xpY2U7Cgp2YXIgRk9SQ0VEID0gZmFpbHMoZnVuY3Rpb24gKCkgewogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZgogIG5ldyBJbnQ4QXJyYXkoMSkuc2xpY2UoKTsKfSk7CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5zbGljZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc2xpY2UKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc2xpY2UnLCBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7CiAgdmFyIGxpc3QgPSAkc2xpY2UuY2FsbChhVHlwZWRBcnJheSh0aGlzKSwgc3RhcnQsIGVuZCk7CiAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CiAgdmFyIGluZGV4ID0gMDsKICB2YXIgbGVuZ3RoID0gbGlzdC5sZW5ndGg7CiAgdmFyIHJlc3VsdCA9IG5ldyAoYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihDKSkobGVuZ3RoKTsKICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHJlc3VsdFtpbmRleF0gPSBsaXN0W2luZGV4KytdOwogIHJldHVybiByZXN1bHQ7Cn0sIEZPUkNFRCk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNvbWUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc29tZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7CnZhciAkc29tZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIpLnNvbWU7Cgp2YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Owp2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDsKCi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnNvbWVgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnNvbWUKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc29tZScsIGZ1bmN0aW9uIHNvbWUoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHsKICByZXR1cm4gJHNvbWUoYVR5cGVkQXJyYXkodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNvcnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc29ydC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIik7Cgp2YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5Owp2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDsKdmFyICRzb3J0ID0gW10uc29ydDsKCi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnNvcnRgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnNvcnQKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc29ydCcsIGZ1bmN0aW9uIHNvcnQoY29tcGFyZWZuKSB7CiAgcmV0dXJuICRzb3J0LmNhbGwoYVR5cGVkQXJyYXkodGhpcyksIGNvbXBhcmVmbik7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zdWJhcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc3ViYXJyYXkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMiKTsKdmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIik7CnZhciB0b0Fic29sdXRlSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzIik7CnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIpOwoKdmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTsKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5zdWJhcnJheWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc3ViYXJyYXkKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc3ViYXJyYXknLCBmdW5jdGlvbiBzdWJhcnJheShiZWdpbiwgZW5kKSB7CiAgdmFyIE8gPSBhVHlwZWRBcnJheSh0aGlzKTsKICB2YXIgbGVuZ3RoID0gTy5sZW5ndGg7CiAgdmFyIGJlZ2luSW5kZXggPSB0b0Fic29sdXRlSW5kZXgoYmVnaW4sIGxlbmd0aCk7CiAgcmV0dXJuIG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKE8sIE8uY29uc3RydWN0b3IpKSgKICAgIE8uYnVmZmVyLAogICAgTy5ieXRlT2Zmc2V0ICsgYmVnaW5JbmRleCAqIE8uQllURVNfUEVSX0VMRU1FTlQsCiAgICB0b0xlbmd0aCgoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW5ndGgpKSAtIGJlZ2luSW5kZXgpCiAgKTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLWxvY2FsZS1zdHJpbmcuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudG8tbG9jYWxlLXN0cmluZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwoKdmFyIEludDhBcnJheSA9IGdsb2JhbC5JbnQ4QXJyYXk7CnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7CnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwp2YXIgJHRvTG9jYWxlU3RyaW5nID0gW10udG9Mb2NhbGVTdHJpbmc7CnZhciAkc2xpY2UgPSBbXS5zbGljZTsKCi8vIGlPUyBTYWZhcmkgNi54IGZhaWxzIGhlcmUKdmFyIFRPX0xPQ0FMRV9TVFJJTkdfQlVHID0gISFJbnQ4QXJyYXkgJiYgZmFpbHMoZnVuY3Rpb24gKCkgewogICR0b0xvY2FsZVN0cmluZy5jYWxsKG5ldyBJbnQ4QXJyYXkoMSkpOwp9KTsKCnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIFsxLCAyXS50b0xvY2FsZVN0cmluZygpICE9IG5ldyBJbnQ4QXJyYXkoWzEsIDJdKS50b0xvY2FsZVN0cmluZygpOwp9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkgewogIEludDhBcnJheS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcuY2FsbChbMSwgMl0pOwp9KTsKCi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS50b2xvY2FsZXN0cmluZwpleHBvcnRUeXBlZEFycmF5TWV0aG9kKCd0b0xvY2FsZVN0cmluZycsIGZ1bmN0aW9uIHRvTG9jYWxlU3RyaW5nKCkgewogIHJldHVybiAkdG9Mb2NhbGVTdHJpbmcuYXBwbHkoVE9fTE9DQUxFX1NUUklOR19CVUcgPyAkc2xpY2UuY2FsbChhVHlwZWRBcnJheSh0aGlzKSkgOiBhVHlwZWRBcnJheSh0aGlzKSwgYXJndW1lbnRzKTsKfSwgRk9SQ0VEKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudG8tc3RyaW5nLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudG8tc3RyaW5nLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIpLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiKTsKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwoKdmFyIFVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheTsKdmFyIFVpbnQ4QXJyYXlQcm90b3R5cGUgPSBVaW50OEFycmF5ICYmIFVpbnQ4QXJyYXkucHJvdG90eXBlIHx8IHt9Owp2YXIgYXJyYXlUb1N0cmluZyA9IFtdLnRvU3RyaW5nOwp2YXIgYXJyYXlKb2luID0gW10uam9pbjsKCmlmIChmYWlscyhmdW5jdGlvbiAoKSB7IGFycmF5VG9TdHJpbmcuY2FsbCh7fSk7IH0pKSB7CiAgYXJyYXlUb1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIGFycmF5Sm9pbi5jYWxsKHRoaXMpOwogIH07Cn0KCnZhciBJU19OT1RfQVJSQVlfTUVUSE9EID0gVWludDhBcnJheVByb3RvdHlwZS50b1N0cmluZyAhPSBhcnJheVRvU3RyaW5nOwoKLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnRvc3RyaW5nCmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3RvU3RyaW5nJywgYXJyYXlUb1N0cmluZywgSVNfTk9UX0FSUkFZX01FVEhPRCk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQxNi1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQxNi1hcnJheS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yLmpzIik7CgovLyBgVWludDE2QXJyYXlgIGNvbnN0cnVjdG9yCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0cwpjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IoJ1VpbnQxNicsIGZ1bmN0aW9uIChpbml0KSB7CiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQxNkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkgewogICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTsKICB9Owp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDMyLWFycmF5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDMyLWFycmF5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IuanMiKTsKCi8vIGBVaW50MzJBcnJheWAgY29uc3RydWN0b3IKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZWRhcnJheS1vYmplY3RzCmNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcignVWludDMyJywgZnVuY3Rpb24gKGluaXQpIHsKICByZXR1cm4gZnVuY3Rpb24gVWludDMyQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7CiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpOwogIH07Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS51aW50OC1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtYXJyYXkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yLmpzIik7CgovLyBgVWludDhBcnJheWAgY29uc3RydWN0b3IKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZWRhcnJheS1vYmplY3RzCmNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcignVWludDgnLCBmdW5jdGlvbiAoaW5pdCkgewogIHJldHVybiBmdW5jdGlvbiBVaW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkgewogICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTsKICB9Owp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtY2xhbXBlZC1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS51aW50OC1jbGFtcGVkLWFycmF5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yLmpzIik7CgovLyBgVWludDhDbGFtcGVkQXJyYXlgIGNvbnN0cnVjdG9yCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0cwpjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IoJ1VpbnQ4JywgZnVuY3Rpb24gKGluaXQpIHsKICByZXR1cm4gZnVuY3Rpb24gVWludDhDbGFtcGVkQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7CiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpOwogIH07Cn0sIHRydWUpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLW1hcC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMud2Vhay1tYXAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciByZWRlZmluZUFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLWFsbC5qcyIpOwp2YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanMiKTsKdmFyIGNvbGxlY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi5qcyIpOwp2YXIgY29sbGVjdGlvbldlYWsgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXdlYWsuanMiKTsKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIik7CnZhciBlbmZvcmNlSXRlcm5hbFN0YXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIpLmVuZm9yY2U7CnZhciBOQVRJVkVfV0VBS19NQVAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAuanMiKTsKCnZhciBJU19JRTExID0gIWdsb2JhbC5BY3RpdmVYT2JqZWN0ICYmICdBY3RpdmVYT2JqZWN0JyBpbiBnbG9iYWw7CnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlOwp2YXIgSW50ZXJuYWxXZWFrTWFwOwoKdmFyIHdyYXBwZXIgPSBmdW5jdGlvbiAoaW5pdCkgewogIHJldHVybiBmdW5jdGlvbiBXZWFrTWFwKCkgewogICAgcmV0dXJuIGluaXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7CiAgfTsKfTsKCi8vIGBXZWFrTWFwYCBjb25zdHJ1Y3RvcgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy13ZWFrbWFwLWNvbnN0cnVjdG9yCnZhciAkV2Vha01hcCA9IG1vZHVsZS5leHBvcnRzID0gY29sbGVjdGlvbignV2Vha01hcCcsIHdyYXBwZXIsIGNvbGxlY3Rpb25XZWFrKTsKCi8vIElFMTEgV2Vha01hcCBmcm96ZW4ga2V5cyBmaXgKLy8gV2UgY2FuJ3QgdXNlIGZlYXR1cmUgZGV0ZWN0aW9uIGJlY2F1c2UgaXQgY3Jhc2ggc29tZSBvbGQgSUUgYnVpbGRzCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy80ODUKaWYgKE5BVElWRV9XRUFLX01BUCAmJiBJU19JRTExKSB7CiAgSW50ZXJuYWxXZWFrTWFwID0gY29sbGVjdGlvbldlYWsuZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgJ1dlYWtNYXAnLCB0cnVlKTsKICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLlJFUVVJUkVEID0gdHJ1ZTsKICB2YXIgV2Vha01hcFByb3RvdHlwZSA9ICRXZWFrTWFwLnByb3RvdHlwZTsKICB2YXIgbmF0aXZlRGVsZXRlID0gV2Vha01hcFByb3RvdHlwZVsnZGVsZXRlJ107CiAgdmFyIG5hdGl2ZUhhcyA9IFdlYWtNYXBQcm90b3R5cGUuaGFzOwogIHZhciBuYXRpdmVHZXQgPSBXZWFrTWFwUHJvdG90eXBlLmdldDsKICB2YXIgbmF0aXZlU2V0ID0gV2Vha01hcFByb3RvdHlwZS5zZXQ7CiAgcmVkZWZpbmVBbGwoV2Vha01hcFByb3RvdHlwZSwgewogICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHsKICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7CiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUl0ZXJuYWxTdGF0ZSh0aGlzKTsKICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpOwogICAgICAgIHJldHVybiBuYXRpdmVEZWxldGUuY2FsbCh0aGlzLCBrZXkpIHx8IHN0YXRlLmZyb3plblsnZGVsZXRlJ10oa2V5KTsKICAgICAgfSByZXR1cm4gbmF0aXZlRGVsZXRlLmNhbGwodGhpcywga2V5KTsKICAgIH0sCiAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHsKICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7CiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUl0ZXJuYWxTdGF0ZSh0aGlzKTsKICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpOwogICAgICAgIHJldHVybiBuYXRpdmVIYXMuY2FsbCh0aGlzLCBrZXkpIHx8IHN0YXRlLmZyb3plbi5oYXMoa2V5KTsKICAgICAgfSByZXR1cm4gbmF0aXZlSGFzLmNhbGwodGhpcywga2V5KTsKICAgIH0sCiAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHsKICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7CiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUl0ZXJuYWxTdGF0ZSh0aGlzKTsKICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpOwogICAgICAgIHJldHVybiBuYXRpdmVIYXMuY2FsbCh0aGlzLCBrZXkpID8gbmF0aXZlR2V0LmNhbGwodGhpcywga2V5KSA6IHN0YXRlLmZyb3plbi5nZXQoa2V5KTsKICAgICAgfSByZXR1cm4gbmF0aXZlR2V0LmNhbGwodGhpcywga2V5KTsKICAgIH0sCiAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7CiAgICAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkgewogICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJdGVybmFsU3RhdGUodGhpcyk7CiAgICAgICAgaWYgKCFzdGF0ZS5mcm96ZW4pIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTsKICAgICAgICBuYXRpdmVIYXMuY2FsbCh0aGlzLCBrZXkpID8gbmF0aXZlU2V0LmNhbGwodGhpcywga2V5LCB2YWx1ZSkgOiBzdGF0ZS5mcm96ZW4uc2V0KGtleSwgdmFsdWUpOwogICAgICB9IGVsc2UgbmF0aXZlU2V0LmNhbGwodGhpcywga2V5LCB2YWx1ZSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogIH0pOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLndlYWstc2V0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLXNldC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIGNvbGxlY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi5qcyIpOwp2YXIgY29sbGVjdGlvbldlYWsgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXdlYWsuanMiKTsKCi8vIGBXZWFrU2V0YCBjb25zdHJ1Y3RvcgovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy13ZWFrc2V0LWNvbnN0cnVjdG9yCmNvbGxlY3Rpb24oJ1dlYWtTZXQnLCBmdW5jdGlvbiAoaW5pdCkgewogIHJldHVybiBmdW5jdGlvbiBXZWFrU2V0KCkgeyByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTsKfSwgY29sbGVjdGlvbldlYWspOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYWdncmVnYXRlLWVycm9yLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hZ2dyZWdhdGUtZXJyb3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIik7CnZhciBzZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanMiKTsKdmFyIGNyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIik7CnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIpOwp2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiKTsKCnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7CnZhciBnZXRJbnRlcm5hbEFnZ3JlZ2F0ZUVycm9yU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcignQWdncmVnYXRlRXJyb3InKTsKCnZhciAkQWdncmVnYXRlRXJyb3IgPSBmdW5jdGlvbiBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIG1lc3NhZ2UpIHsKICB2YXIgdGhhdCA9IHRoaXM7CiAgaWYgKCEodGhhdCBpbnN0YW5jZW9mICRBZ2dyZWdhdGVFcnJvcikpIHJldHVybiBuZXcgJEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgbWVzc2FnZSk7CiAgaWYgKHNldFByb3RvdHlwZU9mKSB7CiAgICB0aGF0ID0gc2V0UHJvdG90eXBlT2YobmV3IEVycm9yKG1lc3NhZ2UpLCBnZXRQcm90b3R5cGVPZih0aGF0KSk7CiAgfQogIHZhciBlcnJvcnNBcnJheSA9IFtdOwogIGl0ZXJhdGUoZXJyb3JzLCBlcnJvcnNBcnJheS5wdXNoLCBlcnJvcnNBcnJheSk7CiAgaWYgKERFU0NSSVBUT1JTKSBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHsgZXJyb3JzOiBlcnJvcnNBcnJheSwgdHlwZTogJ0FnZ3JlZ2F0ZUVycm9yJyB9KTsKICBlbHNlIHRoYXQuZXJyb3JzID0gZXJyb3JzQXJyYXk7CiAgaWYgKG1lc3NhZ2UgIT09IHVuZGVmaW5lZCkgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsICdtZXNzYWdlJywgU3RyaW5nKG1lc3NhZ2UpKTsKICByZXR1cm4gdGhhdDsKfTsKCiRBZ2dyZWdhdGVFcnJvci5wcm90b3R5cGUgPSBjcmVhdGUoRXJyb3IucHJvdG90eXBlLCB7CiAgY29uc3RydWN0b3I6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcig1LCAkQWdncmVnYXRlRXJyb3IpLAogIG1lc3NhZ2U6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcig1LCAnJyksCiAgbmFtZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDUsICdBZ2dyZWdhdGVFcnJvcicpCn0pOwoKaWYgKERFU0NSSVBUT1JTKSBkZWZpbmVQcm9wZXJ0eS5mKCRBZ2dyZWdhdGVFcnJvci5wcm90b3R5cGUsICdlcnJvcnMnLCB7CiAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gZ2V0SW50ZXJuYWxBZ2dyZWdhdGVFcnJvclN0YXRlKHRoaXMpLmVycm9yczsKICB9LAogIGNvbmZpZ3VyYWJsZTogdHJ1ZQp9KTsKCiQoeyBnbG9iYWw6IHRydWUgfSwgewogIEFnZ3JlZ2F0ZUVycm9yOiAkQWdncmVnYXRlRXJyb3IKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hcnJheS5pcy10ZW1wbGF0ZS1vYmplY3QuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFycmF5LmlzLXRlbXBsYXRlLW9iamVjdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXNBcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1hcnJheSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanMiKTsKCnZhciBpc0Zyb3plbiA9IE9iamVjdC5pc0Zyb3plbjsKCnZhciBpc0Zyb3plblN0cmluZ0FycmF5ID0gZnVuY3Rpb24gKGFycmF5LCBhbGxvd1VuZGVmaW5lZCkgewogIGlmICghaXNGcm96ZW4gfHwgIWlzQXJyYXkoYXJyYXkpIHx8ICFpc0Zyb3plbihhcnJheSkpIHJldHVybiBmYWxzZTsKICB2YXIgaW5kZXggPSAwOwogIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7CiAgdmFyIGVsZW1lbnQ7CiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7CiAgICBlbGVtZW50ID0gYXJyYXlbaW5kZXgrK107CiAgICBpZiAoISh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycgfHwgKGFsbG93VW5kZWZpbmVkICYmIHR5cGVvZiBlbGVtZW50ID09PSAndW5kZWZpbmVkJykpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9IHJldHVybiBsZW5ndGggIT09IDA7Cn07CgovLyBgQXJyYXkuaXNUZW1wbGF0ZU9iamVjdGAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWFycmF5LWlzLXRlbXBsYXRlLW9iamVjdAokKHsgdGFyZ2V0OiAnQXJyYXknLCBzdGF0OiB0cnVlIH0sIHsKICBpc1RlbXBsYXRlT2JqZWN0OiBmdW5jdGlvbiBpc1RlbXBsYXRlT2JqZWN0KHZhbHVlKSB7CiAgICBpZiAoIWlzRnJvemVuU3RyaW5nQXJyYXkodmFsdWUsIHRydWUpKSByZXR1cm4gZmFsc2U7CiAgICB2YXIgcmF3ID0gdmFsdWUucmF3OwogICAgaWYgKHJhdy5sZW5ndGggIT09IHZhbHVlLmxlbmd0aCB8fCAhaXNGcm96ZW5TdHJpbmdBcnJheShyYXcsIGZhbHNlKSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFycmF5Lmxhc3QtaW5kZXguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hcnJheS5sYXN0LWluZGV4LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBhZGRUb1Vuc2NvcGFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIik7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiKTsKdmFyIGRlZmluZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiKS5mOwoKLy8gYEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhgIGdldHRlcgovLyBodHRwczovL2dpdGh1Yi5jb20va2VpdGhhbXVzL3Byb3Bvc2FsLWFycmF5LWxhc3QKaWYgKERFU0NSSVBUT1JTICYmICEoJ2xhc3RJbmRleCcgaW4gW10pKSB7CiAgZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCAnbGFzdEluZGV4JywgewogICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgZ2V0OiBmdW5jdGlvbiBsYXN0SW5kZXgoKSB7CiAgICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7CiAgICAgIHZhciBsZW4gPSB0b0xlbmd0aChPLmxlbmd0aCk7CiAgICAgIHJldHVybiBsZW4gPT0gMCA/IDAgOiBsZW4gLSAxOwogICAgfQogIH0pOwoKICBhZGRUb1Vuc2NvcGFibGVzKCdsYXN0SW5kZXgnKTsKfQoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXJyYXkubGFzdC1pdGVtLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hcnJheS5sYXN0LWl0ZW0uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIpOwp2YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcy5qcyIpOwp2YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiKTsKdmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIik7CnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIikuZjsKCi8vIGBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4YCBhY2Nlc3NvcgovLyBodHRwczovL2dpdGh1Yi5jb20va2VpdGhhbXVzL3Byb3Bvc2FsLWFycmF5LWxhc3QKaWYgKERFU0NSSVBUT1JTICYmICEoJ2xhc3RJdGVtJyBpbiBbXSkpIHsKICBkZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsICdsYXN0SXRlbScsIHsKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgIGdldDogZnVuY3Rpb24gbGFzdEl0ZW0oKSB7CiAgICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7CiAgICAgIHZhciBsZW4gPSB0b0xlbmd0aChPLmxlbmd0aCk7CiAgICAgIHJldHVybiBsZW4gPT0gMCA/IHVuZGVmaW5lZCA6IE9bbGVuIC0gMV07CiAgICB9LAogICAgc2V0OiBmdW5jdGlvbiBsYXN0SXRlbSh2YWx1ZSkgewogICAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpOwogICAgICB2YXIgbGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpOwogICAgICByZXR1cm4gT1tsZW4gPT0gMCA/IDAgOiBsZW4gLSAxXSA9IHZhbHVlOwogICAgfQogIH0pOwoKICBhZGRUb1Vuc2NvcGFibGVzKCdsYXN0SXRlbScpOwp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5hcy1pbmRleGVkLXBhaXJzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuYXMtaW5kZXhlZC1wYWlycy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGNyZWF0ZUFzeW5jSXRlcmF0b3JQcm94eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtYXN5bmMtaXRlcmF0b3ItcHJveHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1hc3luYy1pdGVyYXRvci1wcm94eS5qcyIpOwoKdmFyIEFzeW5jSXRlcmF0b3JQcm94eSA9IGNyZWF0ZUFzeW5jSXRlcmF0b3JQcm94eShmdW5jdGlvbiAoYXJnLCBQcm9taXNlKSB7CiAgdmFyIHN0YXRlID0gdGhpczsKICB2YXIgaXRlcmF0b3IgPSBzdGF0ZS5pdGVyYXRvcjsKCiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhbk9iamVjdChzdGF0ZS5uZXh0LmNhbGwoaXRlcmF0b3IsIGFyZykpKS50aGVuKGZ1bmN0aW9uIChzdGVwKSB7CiAgICBpZiAoYW5PYmplY3Qoc3RlcCkuZG9uZSkgewogICAgICBzdGF0ZS5kb25lID0gdHJ1ZTsKICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9OwogICAgfQogICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBbc3RhdGUuaW5kZXgrKywgc3RlcC52YWx1ZV0gfTsKICB9KTsKfSk7CgokKHsgdGFyZ2V0OiAnQXN5bmNJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBhc0luZGV4ZWRQYWlyczogZnVuY3Rpb24gYXNJbmRleGVkUGFpcnMoKSB7CiAgICByZXR1cm4gbmV3IEFzeW5jSXRlcmF0b3JQcm94eSh7CiAgICAgIGl0ZXJhdG9yOiBhbk9iamVjdCh0aGlzKSwKICAgICAgaW5kZXg6IDAKICAgIH0pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5jb25zdHJ1Y3Rvci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5jb25zdHJ1Y3Rvci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzIik7CnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMiKTsKdmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwp2YXIgQXN5bmNJdGVyYXRvclByb3RvdHlwZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hc3luYy1pdGVyYXRvci1wcm90b3R5cGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLXByb3RvdHlwZS5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7Cgp2YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTsKCnZhciBBc3luY0l0ZXJhdG9yQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKCkgewogIGFuSW5zdGFuY2UodGhpcywgQXN5bmNJdGVyYXRvckNvbnN0cnVjdG9yKTsKfTsKCkFzeW5jSXRlcmF0b3JDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBBc3luY0l0ZXJhdG9yUHJvdG90eXBlOwoKaWYgKCFoYXMoQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHsKICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgJ0FzeW5jSXRlcmF0b3InKTsKfQoKaWYgKCFoYXMoQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJykgfHwgQXN5bmNJdGVyYXRvclByb3RvdHlwZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7CiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEFzeW5jSXRlcmF0b3JQcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIEFzeW5jSXRlcmF0b3JDb25zdHJ1Y3Rvcik7Cn0KCiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgQXN5bmNJdGVyYXRvcjogQXN5bmNJdGVyYXRvckNvbnN0cnVjdG9yCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZHJvcC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmRyb3AuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciB0b1Bvc2l0aXZlSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wb3NpdGl2ZS1pbnRlZ2VyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wb3NpdGl2ZS1pbnRlZ2VyLmpzIik7CnZhciBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWFzeW5jLWl0ZXJhdG9yLXByb3h5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtYXN5bmMtaXRlcmF0b3ItcHJveHkuanMiKTsKCnZhciBBc3luY0l0ZXJhdG9yUHJveHkgPSBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkoZnVuY3Rpb24gKGFyZywgUHJvbWlzZSkgewogIHZhciBzdGF0ZSA9IHRoaXM7CgogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgdHJ5IHsKICAgICAgICBQcm9taXNlLnJlc29sdmUoCiAgICAgICAgICBhbk9iamVjdChzdGF0ZS5uZXh0LmNhbGwoc3RhdGUuaXRlcmF0b3IsIHN0YXRlLnJlbWFpbmluZyA/IHVuZGVmaW5lZCA6IGFyZykpCiAgICAgICAgKS50aGVuKGZ1bmN0aW9uIChzdGVwKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoYW5PYmplY3Qoc3RlcCkuZG9uZSkgewogICAgICAgICAgICAgIHN0YXRlLmRvbmUgPSB0cnVlOwogICAgICAgICAgICAgIHJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLnJlbWFpbmluZykgewogICAgICAgICAgICAgIHN0YXRlLnJlbWFpbmluZy0tOwogICAgICAgICAgICAgIGxvb3AoKTsKICAgICAgICAgICAgfSBlbHNlIHJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHN0ZXAudmFsdWUgfSk7CiAgICAgICAgICB9IGNhdGNoIChlcnIpIHsgcmVqZWN0KGVycik7IH0KICAgICAgICB9LCByZWplY3QpOwogICAgICB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyB9CiAgICB9OwoKICAgIGxvb3AoKTsKICB9KTsKfSk7CgokKHsgdGFyZ2V0OiAnQXN5bmNJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBkcm9wOiBmdW5jdGlvbiBkcm9wKGxpbWl0KSB7CiAgICByZXR1cm4gbmV3IEFzeW5jSXRlcmF0b3JQcm94eSh7CiAgICAgIGl0ZXJhdG9yOiBhbk9iamVjdCh0aGlzKSwKICAgICAgcmVtYWluaW5nOiB0b1Bvc2l0aXZlSW50ZWdlcihsaW1pdCkKICAgIH0pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5ldmVyeS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5ldmVyeS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICRldmVyeSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hc3luYy1pdGVyYXRvci1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLWl0ZXJhdGlvbi5qcyIpLmV2ZXJ5OwoKJCh7IHRhcmdldDogJ0FzeW5jSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGZuKSB7CiAgICByZXR1cm4gJGV2ZXJ5KHRoaXMsIGZuKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZmlsdGVyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5maWx0ZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWFzeW5jLWl0ZXJhdG9yLXByb3h5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtYXN5bmMtaXRlcmF0b3ItcHJveHkuanMiKTsKCnZhciBBc3luY0l0ZXJhdG9yUHJveHkgPSBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkoZnVuY3Rpb24gKGFyZywgUHJvbWlzZSkgewogIHZhciBzdGF0ZSA9IHRoaXM7CiAgdmFyIGZpbHRlcmVyID0gc3RhdGUuZmlsdGVyZXI7CgogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgdHJ5IHsKICAgICAgICBQcm9taXNlLnJlc29sdmUoYW5PYmplY3Qoc3RhdGUubmV4dC5jYWxsKHN0YXRlLml0ZXJhdG9yLCBhcmcpKSkudGhlbihmdW5jdGlvbiAoc3RlcCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKGFuT2JqZWN0KHN0ZXApLmRvbmUpIHsKICAgICAgICAgICAgICBzdGF0ZS5kb25lID0gdHJ1ZTsKICAgICAgICAgICAgICByZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzdGVwLnZhbHVlOwogICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShmaWx0ZXJlcih2YWx1ZSkpLnRoZW4oZnVuY3Rpb24gKHNlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICBzZWxlY3RlZCA/IHJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHZhbHVlIH0pIDogbG9vcCgpOwogICAgICAgICAgICAgIH0sIHJlamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGVycikgeyByZWplY3QoZXJyKTsgfQogICAgICAgIH0sIHJlamVjdCk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7IHJlamVjdChlcnJvcik7IH0KICAgIH07CgogICAgbG9vcCgpOwogIH0pOwp9KTsKCiQoeyB0YXJnZXQ6ICdBc3luY0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwgewogIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKGZpbHRlcmVyKSB7CiAgICByZXR1cm4gbmV3IEFzeW5jSXRlcmF0b3JQcm94eSh7CiAgICAgIGl0ZXJhdG9yOiBhbk9iamVjdCh0aGlzKSwKICAgICAgZmlsdGVyZXI6IGFGdW5jdGlvbihmaWx0ZXJlcikKICAgIH0pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5maW5kLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZmluZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgJGZpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXN5bmMtaXRlcmF0b3ItaXRlcmF0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hc3luYy1pdGVyYXRvci1pdGVyYXRpb24uanMiKS5maW5kOwoKJCh7IHRhcmdldDogJ0FzeW5jSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgZmluZDogZnVuY3Rpb24gZmluZChmbikgewogICAgcmV0dXJuICRmaW5kKHRoaXMsIGZuKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZmxhdC1tYXAuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZmxhdC1tYXAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGNyZWF0ZUFzeW5jSXRlcmF0b3JQcm94eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtYXN5bmMtaXRlcmF0b3ItcHJveHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1hc3luYy1pdGVyYXRvci1wcm94eS5qcyIpOwp2YXIgZ2V0QXN5bmNJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYXN5bmMtaXRlcmF0b3ItbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYXN5bmMtaXRlcmF0b3ItbWV0aG9kLmpzIik7Cgp2YXIgQXN5bmNJdGVyYXRvclByb3h5ID0gY3JlYXRlQXN5bmNJdGVyYXRvclByb3h5KGZ1bmN0aW9uIChhcmcsIFByb21pc2UpIHsKICB2YXIgc3RhdGUgPSB0aGlzOwogIHZhciBtYXBwZXIgPSBzdGF0ZS5tYXBwZXI7CiAgdmFyIGlubmVySXRlcmF0b3IsIGl0ZXJhdG9yTWV0aG9kOwoKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgdmFyIG91dGVyTG9vcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgdHJ5IHsKICAgICAgICBQcm9taXNlLnJlc29sdmUoYW5PYmplY3Qoc3RhdGUubmV4dC5jYWxsKHN0YXRlLml0ZXJhdG9yLCBhcmcpKSkudGhlbihmdW5jdGlvbiAoc3RlcCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKGFuT2JqZWN0KHN0ZXApLmRvbmUpIHsKICAgICAgICAgICAgICBzdGF0ZS5kb25lID0gdHJ1ZTsKICAgICAgICAgICAgICByZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUobWFwcGVyKHN0ZXAudmFsdWUpKS50aGVuKGZ1bmN0aW9uIChtYXBwZWQpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yTWV0aG9kID0gZ2V0QXN5bmNJdGVyYXRvck1ldGhvZChtYXBwZWQpOwogICAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3JNZXRob2QgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLmlubmVySXRlcmF0b3IgPSBpbm5lckl0ZXJhdG9yID0gYW5PYmplY3QoaXRlcmF0b3JNZXRob2QuY2FsbChtYXBwZWQpKTsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5pbm5lck5leHQgPSBhRnVuY3Rpb24oaW5uZXJJdGVyYXRvci5uZXh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5uZXJMb29wKCk7CiAgICAgICAgICAgICAgICAgIH0gcmVqZWN0KFR5cGVFcnJvcignLmZsYXRNYXAgY2FsbGJhY2sgc2hvdWxkIHJldHVybiBhbiBpdGVyYWJsZSBvYmplY3QnKSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjIpIHsgcmVqZWN0KGVycm9yMik7IH0KICAgICAgICAgICAgICB9LCByZWplY3QpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIChlcnJvcjEpIHsgcmVqZWN0KGVycm9yMSk7IH0KICAgICAgICB9LCByZWplY3QpOwogICAgICB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyB9CiAgICB9OwoKICAgIHZhciBpbm5lckxvb3AgPSBmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChpbm5lckl0ZXJhdG9yID0gc3RhdGUuaW5uZXJJdGVyYXRvcikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoYW5PYmplY3Qoc3RhdGUuaW5uZXJOZXh0LmNhbGwoaW5uZXJJdGVyYXRvcikpKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBpZiAoYW5PYmplY3QocmVzdWx0KS5kb25lKSB7CiAgICAgICAgICAgICAgICBzdGF0ZS5pbm5lckl0ZXJhdG9yID0gc3RhdGUuaW5uZXJOZXh0ID0gbnVsbDsKICAgICAgICAgICAgICAgIG91dGVyTG9vcCgpOwogICAgICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXN1bHQudmFsdWUgfSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yMSkgeyByZWplY3QoZXJyb3IxKTsgfQogICAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyB9CiAgICAgIH0gZWxzZSBvdXRlckxvb3AoKTsKICAgIH07CgogICAgaW5uZXJMb29wKCk7CiAgfSk7Cn0pOwoKJCh7IHRhcmdldDogJ0FzeW5jSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgZmxhdE1hcDogZnVuY3Rpb24gZmxhdE1hcChtYXBwZXIpIHsKICAgIHJldHVybiBuZXcgQXN5bmNJdGVyYXRvclByb3h5KHsKICAgICAgaXRlcmF0b3I6IGFuT2JqZWN0KHRoaXMpLAogICAgICBtYXBwZXI6IGFGdW5jdGlvbihtYXBwZXIpLAogICAgICBpbm5lckl0ZXJhdG9yOiBudWxsLAogICAgICBpbm5lck5leHQ6IG51bGwKICAgIH0pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5mb3ItZWFjaC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5mb3ItZWFjaC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICRmb3JFYWNoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLWl0ZXJhdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXN5bmMtaXRlcmF0b3ItaXRlcmF0aW9uLmpzIikuZm9yRWFjaDsKCiQoeyB0YXJnZXQ6ICdBc3luY0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwgewogIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goZm4pIHsKICAgIHJldHVybiAkZm9yRWFjaCh0aGlzLCBmbik7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmZyb20uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5mcm9tLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBwYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3BhdGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiKTsKdmFyIGNyZWF0ZUFzeW5jSXRlcmF0b3JQcm94eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtYXN5bmMtaXRlcmF0b3ItcHJveHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1hc3luYy1pdGVyYXRvci1wcm94eS5qcyIpOwp2YXIgZ2V0QXN5bmNJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYXN5bmMtaXRlcmF0b3ItbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYXN5bmMtaXRlcmF0b3ItbWV0aG9kLmpzIik7Cgp2YXIgQXN5bmNJdGVyYXRvciA9IHBhdGguQXN5bmNJdGVyYXRvcjsKCnZhciBBc3luY0l0ZXJhdG9yUHJveHkgPSBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkoZnVuY3Rpb24gKGFyZykgewogIHJldHVybiBhbk9iamVjdCh0aGlzLm5leHQuY2FsbCh0aGlzLml0ZXJhdG9yLCBhcmcpKTsKfSwgdHJ1ZSk7CgokKHsgdGFyZ2V0OiAnQXN5bmNJdGVyYXRvcicsIHN0YXQ6IHRydWUgfSwgewogIGZyb206IGZ1bmN0aW9uIGZyb20oTykgewogICAgdmFyIG9iamVjdCA9IHRvT2JqZWN0KE8pOwogICAgdmFyIHVzaW5nSXRlcmF0b3IgPSBnZXRBc3luY0l0ZXJhdG9yTWV0aG9kKG9iamVjdCk7CiAgICB2YXIgaXRlcmF0b3I7CiAgICBpZiAodXNpbmdJdGVyYXRvciAhPSBudWxsKSB7CiAgICAgIGl0ZXJhdG9yID0gYUZ1bmN0aW9uKHVzaW5nSXRlcmF0b3IpLmNhbGwob2JqZWN0KTsKICAgICAgaWYgKGl0ZXJhdG9yIGluc3RhbmNlb2YgQXN5bmNJdGVyYXRvcikgcmV0dXJuIGl0ZXJhdG9yOwogICAgfSBlbHNlIHsKICAgICAgaXRlcmF0b3IgPSBvYmplY3Q7CiAgICB9IHJldHVybiBuZXcgQXN5bmNJdGVyYXRvclByb3h5KHsKICAgICAgaXRlcmF0b3I6IGl0ZXJhdG9yCiAgICB9KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IubWFwLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5tYXAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWFzeW5jLWl0ZXJhdG9yLXByb3h5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtYXN5bmMtaXRlcmF0b3ItcHJveHkuanMiKTsKCnZhciBBc3luY0l0ZXJhdG9yUHJveHkgPSBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkoZnVuY3Rpb24gKGFyZywgUHJvbWlzZSkgewogIHZhciBzdGF0ZSA9IHRoaXM7CiAgdmFyIG1hcHBlciA9IHN0YXRlLm1hcHBlcjsKCiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhbk9iamVjdChzdGF0ZS5uZXh0LmNhbGwoc3RhdGUuaXRlcmF0b3IsIGFyZykpKS50aGVuKGZ1bmN0aW9uIChzdGVwKSB7CiAgICBpZiAoYW5PYmplY3Qoc3RlcCkuZG9uZSkgewogICAgICBzdGF0ZS5kb25lID0gdHJ1ZTsKICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9OwogICAgfQogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXBwZXIoc3RlcC52YWx1ZSkpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogdmFsdWUgfTsKICAgIH0pOwogIH0pOwp9KTsKCiQoeyB0YXJnZXQ6ICdBc3luY0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwgewogIG1hcDogZnVuY3Rpb24gbWFwKG1hcHBlcikgewogICAgcmV0dXJuIG5ldyBBc3luY0l0ZXJhdG9yUHJveHkoewogICAgICBpdGVyYXRvcjogYW5PYmplY3QodGhpcyksCiAgICAgIG1hcHBlcjogYUZ1bmN0aW9uKG1hcHBlcikKICAgIH0pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5yZWR1Y2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLnJlZHVjZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKCnZhciBQcm9taXNlID0gZ2V0QnVpbHRJbignUHJvbWlzZScpOwoKJCh7IHRhcmdldDogJ0FzeW5jSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UocmVkdWNlciAvKiAsIGluaXRpYWxWYWx1ZSAqLykgewogICAgdmFyIGl0ZXJhdG9yID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgbmV4dCA9IGFGdW5jdGlvbihpdGVyYXRvci5uZXh0KTsKICAgIHZhciBub0luaXRpYWwgPSBhcmd1bWVudHMubGVuZ3RoIDwgMjsKICAgIHZhciBhY2N1bXVsYXRvciA9IG5vSW5pdGlhbCA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1sxXTsKICAgIGFGdW5jdGlvbihyZWR1Y2VyKTsKCiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGFuT2JqZWN0KG5leHQuY2FsbChpdGVyYXRvcikpKS50aGVuKGZ1bmN0aW9uIChzdGVwKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgaWYgKGFuT2JqZWN0KHN0ZXApLmRvbmUpIHsKICAgICAgICAgICAgICAgIG5vSW5pdGlhbCA/IHJlamVjdChUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBpdGVyYXRvciB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKSkgOiByZXNvbHZlKGFjY3VtdWxhdG9yKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gc3RlcC52YWx1ZTsKICAgICAgICAgICAgICAgIGlmIChub0luaXRpYWwpIHsKICAgICAgICAgICAgICAgICAgbm9Jbml0aWFsID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgIGxvb3AoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShyZWR1Y2VyKGFjY3VtdWxhdG9yLCB2YWx1ZSkpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgIGxvb3AoKTsKICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgeyByZWplY3QoZXJyKTsgfQogICAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyB9CiAgICAgIH07CgogICAgICBsb29wKCk7CiAgICB9KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3Iuc29tZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLnNvbWUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICRzb21lID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLWl0ZXJhdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXN5bmMtaXRlcmF0b3ItaXRlcmF0aW9uLmpzIikuc29tZTsKCiQoeyB0YXJnZXQ6ICdBc3luY0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwgewogIHNvbWU6IGZ1bmN0aW9uIHNvbWUoZm4pIHsKICAgIHJldHVybiAkc29tZSh0aGlzLCBmbik7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLnRha2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci50YWtlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgdG9Qb3NpdGl2ZUludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlci5qcyIpOwp2YXIgY3JlYXRlQXN5bmNJdGVyYXRvclByb3h5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1hc3luYy1pdGVyYXRvci1wcm94eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWFzeW5jLWl0ZXJhdG9yLXByb3h5LmpzIik7Cgp2YXIgQXN5bmNJdGVyYXRvclByb3h5ID0gY3JlYXRlQXN5bmNJdGVyYXRvclByb3h5KGZ1bmN0aW9uIChhcmcpIHsKICBpZiAoIXRoaXMucmVtYWluaW5nLS0pIHsKICAgIHRoaXMuZG9uZSA9IHRydWU7CiAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07CiAgfSByZXR1cm4gdGhpcy5uZXh0LmNhbGwodGhpcy5pdGVyYXRvciwgYXJnKTsKfSk7CgokKHsgdGFyZ2V0OiAnQXN5bmNJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICB0YWtlOiBmdW5jdGlvbiB0YWtlKGxpbWl0KSB7CiAgICByZXR1cm4gbmV3IEFzeW5jSXRlcmF0b3JQcm94eSh7CiAgICAgIGl0ZXJhdG9yOiBhbk9iamVjdCh0aGlzKSwKICAgICAgcmVtYWluaW5nOiB0b1Bvc2l0aXZlSW50ZWdlcihsaW1pdCkKICAgIH0pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci50by1hcnJheS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci50by1hcnJheS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyICR0b0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLWl0ZXJhdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXN5bmMtaXRlcmF0b3ItaXRlcmF0aW9uLmpzIikudG9BcnJheTsKCiQoeyB0YXJnZXQ6ICdBc3luY0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwgewogIHRvQXJyYXk6IGZ1bmN0aW9uIHRvQXJyYXkoKSB7CiAgICByZXR1cm4gJHRvQXJyYXkodGhpcyk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmNvbXBvc2l0ZS1rZXkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5jb21wb3NpdGUta2V5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2V0Q29tcG9zaXRlS2V5Tm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb21wb3NpdGUta2V5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb21wb3NpdGUta2V5LmpzIik7CnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIik7CnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIpOwoKdmFyIGluaXRpYWxpemVyID0gZnVuY3Rpb24gKCkgewogIHZhciBmcmVlemUgPSBnZXRCdWlsdEluKCdPYmplY3QnLCAnZnJlZXplJyk7CiAgcmV0dXJuIGZyZWV6ZSA/IGZyZWV6ZShjcmVhdGUobnVsbCkpIDogY3JlYXRlKG51bGwpOwp9OwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcmljaGVyLWtleXMvdHJlZS9tYXN0ZXIvY29tcG9zaXRlS2V5CiQoeyBnbG9iYWw6IHRydWUgfSwgewogIGNvbXBvc2l0ZUtleTogZnVuY3Rpb24gY29tcG9zaXRlS2V5KCkgewogICAgcmV0dXJuIGdldENvbXBvc2l0ZUtleU5vZGUuYXBwbHkoT2JqZWN0LCBhcmd1bWVudHMpLmdldCgnb2JqZWN0JywgaW5pdGlhbGl6ZXIpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5jb21wb3NpdGUtc3ltYm9sLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuY29tcG9zaXRlLXN5bWJvbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGdldENvbXBvc2l0ZUtleU5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29tcG9zaXRlLWtleSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29tcG9zaXRlLWtleS5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcmljaGVyLWtleXMvdHJlZS9tYXN0ZXIvY29tcG9zaXRlS2V5CiQoeyBnbG9iYWw6IHRydWUgfSwgewogIGNvbXBvc2l0ZVN5bWJvbDogZnVuY3Rpb24gY29tcG9zaXRlU3ltYm9sKCkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ3N0cmluZycpIHJldHVybiBnZXRCdWlsdEluKCdTeW1ib2wnKVsnZm9yJ10oYXJndW1lbnRzWzBdKTsKICAgIHJldHVybiBnZXRDb21wb3NpdGVLZXlOb2RlLmFwcGx5KG51bGwsIGFyZ3VtZW50cykuZ2V0KCdzeW1ib2wnLCBnZXRCdWlsdEluKCdTeW1ib2wnKSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lmdsb2JhbC10aGlzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lmdsb2JhbC10aGlzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGAKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9lcy5nbG9iYWwtdGhpcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmdsb2JhbC10aGlzLmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5hcy1pbmRleGVkLXBhaXJzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuYXMtaW5kZXhlZC1wYWlycy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGNyZWF0ZUl0ZXJhdG9yUHJveHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLXByb3h5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItcHJveHkuanMiKTsKCnZhciBJdGVyYXRvclByb3h5ID0gY3JlYXRlSXRlcmF0b3JQcm94eShmdW5jdGlvbiAoYXJnKSB7CiAgdmFyIHJlc3VsdCA9IGFuT2JqZWN0KHRoaXMubmV4dC5jYWxsKHRoaXMuaXRlcmF0b3IsIGFyZykpOwogIHZhciBkb25lID0gdGhpcy5kb25lID0gISFyZXN1bHQuZG9uZTsKICBpZiAoIWRvbmUpIHJldHVybiBbdGhpcy5pbmRleCsrLCByZXN1bHQudmFsdWVdOwp9KTsKCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBhc0luZGV4ZWRQYWlyczogZnVuY3Rpb24gYXNJbmRleGVkUGFpcnMoKSB7CiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yUHJveHkoewogICAgICBpdGVyYXRvcjogYW5PYmplY3QodGhpcyksCiAgICAgIGluZGV4OiAwCiAgICB9KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuY29uc3RydWN0b3IuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuY29uc3RydWN0b3IuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzIik7CnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMiKTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIpOwp2YXIgaGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7CnZhciBJdGVyYXRvclByb3RvdHlwZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMiKS5JdGVyYXRvclByb3RvdHlwZTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwoKdmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwp2YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTsKCnZhciBOYXRpdmVJdGVyYXRvciA9IGdsb2JhbC5JdGVyYXRvcjsKCi8vIEZGNTYtIGhhdmUgbm9uLXN0YW5kYXJkIGdsb2JhbCBoZWxwZXIgYEl0ZXJhdG9yYAp2YXIgRk9SQ0VEID0gSVNfUFVSRQogIHx8IHR5cGVvZiBOYXRpdmVJdGVyYXRvciAhPSAnZnVuY3Rpb24nCiAgfHwgTmF0aXZlSXRlcmF0b3IucHJvdG90eXBlICE9PSBJdGVyYXRvclByb3RvdHlwZQogIC8vIEZGNDQtIG5vbi1zdGFuZGFyZCBgSXRlcmF0b3JgIHBhc3NlcyBwcmV2aW91cyB0ZXN0cwogIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7IE5hdGl2ZUl0ZXJhdG9yKHt9KTsgfSk7Cgp2YXIgSXRlcmF0b3JDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIEl0ZXJhdG9yKCkgewogIGFuSW5zdGFuY2UodGhpcywgSXRlcmF0b3JDb25zdHJ1Y3Rvcik7Cn07CgppZiAoSVNfUFVSRSkgewogIEl0ZXJhdG9yUHJvdG90eXBlID0ge307CiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSk7Cn0KCmlmICghaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHKSkgewogIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgJ0l0ZXJhdG9yJyk7Cn0KCmlmIChGT1JDRUQgfHwgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJykgfHwgSXRlcmF0b3JQcm90b3R5cGUuY29uc3RydWN0b3IgPT09IE9iamVjdCkgewogIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShJdGVyYXRvclByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywgSXRlcmF0b3JDb25zdHJ1Y3Rvcik7Cn0KCkl0ZXJhdG9yQ29uc3RydWN0b3IucHJvdG90eXBlID0gSXRlcmF0b3JQcm90b3R5cGU7CgokKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7CiAgSXRlcmF0b3I6IEl0ZXJhdG9yQ29uc3RydWN0b3IKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5kcm9wLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZHJvcC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIHRvUG9zaXRpdmVJbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXBvc2l0aXZlLWludGVnZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXBvc2l0aXZlLWludGVnZXIuanMiKTsKdmFyIGNyZWF0ZUl0ZXJhdG9yUHJveHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLXByb3h5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItcHJveHkuanMiKTsKCnZhciBJdGVyYXRvclByb3h5ID0gY3JlYXRlSXRlcmF0b3JQcm94eShmdW5jdGlvbiAoYXJnKSB7CiAgdmFyIGl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcjsKICB2YXIgbmV4dCA9IHRoaXMubmV4dDsKICB2YXIgcmVzdWx0LCBkb25lOwogIHdoaWxlICh0aGlzLnJlbWFpbmluZykgewogICAgdGhpcy5yZW1haW5pbmctLTsKICAgIHJlc3VsdCA9IGFuT2JqZWN0KG5leHQuY2FsbChpdGVyYXRvcikpOwogICAgZG9uZSA9IHRoaXMuZG9uZSA9ICEhcmVzdWx0LmRvbmU7CiAgICBpZiAoZG9uZSkgcmV0dXJuOwogIH0KICByZXN1bHQgPSBhbk9iamVjdChuZXh0LmNhbGwoaXRlcmF0b3IsIGFyZykpOwogIGRvbmUgPSB0aGlzLmRvbmUgPSAhIXJlc3VsdC5kb25lOwogIGlmICghZG9uZSkgcmV0dXJuIHJlc3VsdC52YWx1ZTsKfSk7CgokKHsgdGFyZ2V0OiAnSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgZHJvcDogZnVuY3Rpb24gZHJvcChsaW1pdCkgewogICAgcmV0dXJuIG5ldyBJdGVyYXRvclByb3h5KHsKICAgICAgaXRlcmF0b3I6IGFuT2JqZWN0KHRoaXMpLAogICAgICByZW1haW5pbmc6IHRvUG9zaXRpdmVJbnRlZ2VyKGxpbWl0KQogICAgfSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmV2ZXJ5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmV2ZXJ5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBldmVyeTogZnVuY3Rpb24gZXZlcnkoZm4pIHsKICAgIGFuT2JqZWN0KHRoaXMpOwogICAgYUZ1bmN0aW9uKGZuKTsKICAgIHJldHVybiAhaXRlcmF0ZSh0aGlzLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgaWYgKCFmbih2YWx1ZSkpIHJldHVybiBpdGVyYXRlLnN0b3AoKTsKICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHRydWUpLnN0b3BwZWQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZpbHRlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmlsdGVyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgY3JlYXRlSXRlcmF0b3JQcm94eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItcHJveHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1wcm94eS5qcyIpOwp2YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcuanMiKTsKCnZhciBJdGVyYXRvclByb3h5ID0gY3JlYXRlSXRlcmF0b3JQcm94eShmdW5jdGlvbiAoYXJnKSB7CiAgdmFyIGl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcjsKICB2YXIgZmlsdGVyZXIgPSB0aGlzLmZpbHRlcmVyOwogIHZhciBuZXh0ID0gdGhpcy5uZXh0OwogIHZhciByZXN1bHQsIGRvbmUsIHZhbHVlOwogIHdoaWxlICh0cnVlKSB7CiAgICByZXN1bHQgPSBhbk9iamVjdChuZXh0LmNhbGwoaXRlcmF0b3IsIGFyZykpOwogICAgZG9uZSA9IHRoaXMuZG9uZSA9ICEhcmVzdWx0LmRvbmU7CiAgICBpZiAoZG9uZSkgcmV0dXJuOwogICAgdmFsdWUgPSByZXN1bHQudmFsdWU7CiAgICBpZiAoY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgZmlsdGVyZXIsIHZhbHVlKSkgcmV0dXJuIHZhbHVlOwogIH0KfSk7CgokKHsgdGFyZ2V0OiAnSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoZmlsdGVyZXIpIHsKICAgIHJldHVybiBuZXcgSXRlcmF0b3JQcm94eSh7CiAgICAgIGl0ZXJhdG9yOiBhbk9iamVjdCh0aGlzKSwKICAgICAgZmlsdGVyZXI6IGFGdW5jdGlvbihmaWx0ZXJlcikKICAgIH0pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5maW5kLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmluZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBmaW5kOiBmdW5jdGlvbiBmaW5kKGZuKSB7CiAgICBhbk9iamVjdCh0aGlzKTsKICAgIGFGdW5jdGlvbihmbik7CiAgICByZXR1cm4gaXRlcmF0ZSh0aGlzLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgaWYgKGZuKHZhbHVlKSkgcmV0dXJuIGl0ZXJhdGUuc3RvcCh2YWx1ZSk7CiAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB0cnVlKS5yZXN1bHQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZsYXQtbWFwLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZsYXQtbWFwLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIik7CnZhciBjcmVhdGVJdGVyYXRvclByb3h5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1wcm94eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLXByb3h5LmpzIik7CnZhciBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIpOwoKdmFyIEl0ZXJhdG9yUHJveHkgPSBjcmVhdGVJdGVyYXRvclByb3h5KGZ1bmN0aW9uIChhcmcpIHsKICB2YXIgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yOwogIHZhciByZXN1bHQsIG1hcHBlZCwgaXRlcmF0b3JNZXRob2QsIGlubmVySXRlcmF0b3I7CgogIHdoaWxlICh0cnVlKSB7CiAgICBpZiAoaW5uZXJJdGVyYXRvciA9IHRoaXMuaW5uZXJJdGVyYXRvcikgewogICAgICByZXN1bHQgPSBhbk9iamVjdCh0aGlzLmlubmVyTmV4dC5jYWxsKGlubmVySXRlcmF0b3IpKTsKICAgICAgaWYgKCFyZXN1bHQuZG9uZSkgcmV0dXJuIHJlc3VsdC52YWx1ZTsKICAgICAgdGhpcy5pbm5lckl0ZXJhdG9yID0gdGhpcy5pbm5lck5leHQgPSBudWxsOwogICAgfQoKICAgIHJlc3VsdCA9IGFuT2JqZWN0KHRoaXMubmV4dC5jYWxsKGl0ZXJhdG9yLCBhcmcpKTsKCiAgICBpZiAodGhpcy5kb25lID0gISFyZXN1bHQuZG9uZSkgcmV0dXJuOwoKICAgIG1hcHBlZCA9IGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIHRoaXMubWFwcGVyLCByZXN1bHQudmFsdWUpOwogICAgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChtYXBwZWQpOwoKICAgIGlmIChpdGVyYXRvck1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHRocm93IFR5cGVFcnJvcignLmZsYXRNYXAgY2FsbGJhY2sgc2hvdWxkIHJldHVybiBhbiBpdGVyYWJsZSBvYmplY3QnKTsKICAgIH0KCiAgICB0aGlzLmlubmVySXRlcmF0b3IgPSBpbm5lckl0ZXJhdG9yID0gYW5PYmplY3QoaXRlcmF0b3JNZXRob2QuY2FsbChtYXBwZWQpKTsKICAgIHRoaXMuaW5uZXJOZXh0ID0gYUZ1bmN0aW9uKGlubmVySXRlcmF0b3IubmV4dCk7CiAgfQp9KTsKCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBmbGF0TWFwOiBmdW5jdGlvbiBmbGF0TWFwKG1hcHBlcikgewogICAgcmV0dXJuIG5ldyBJdGVyYXRvclByb3h5KHsKICAgICAgaXRlcmF0b3I6IGFuT2JqZWN0KHRoaXMpLAogICAgICBtYXBwZXI6IGFGdW5jdGlvbihtYXBwZXIpLAogICAgICBpbm5lckl0ZXJhdG9yOiBudWxsLAogICAgICBpbm5lck5leHQ6IG51bGwKICAgIH0pOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5mb3ItZWFjaC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5mb3ItZWFjaC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGZuKSB7CiAgICBpdGVyYXRlKGFuT2JqZWN0KHRoaXMpLCBmbiwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZyb20uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5mcm9tLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBwYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3BhdGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiKTsKdmFyIGNyZWF0ZUl0ZXJhdG9yUHJveHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLXByb3h5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItcHJveHkuanMiKTsKdmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiKTsKCnZhciBJdGVyYXRvciA9IHBhdGguSXRlcmF0b3I7Cgp2YXIgSXRlcmF0b3JQcm94eSA9IGNyZWF0ZUl0ZXJhdG9yUHJveHkoZnVuY3Rpb24gKGFyZykgewogIHZhciByZXN1bHQgPSBhbk9iamVjdCh0aGlzLm5leHQuY2FsbCh0aGlzLml0ZXJhdG9yLCBhcmcpKTsKICB2YXIgZG9uZSA9IHRoaXMuZG9uZSA9ICEhcmVzdWx0LmRvbmU7CiAgaWYgKCFkb25lKSByZXR1cm4gcmVzdWx0LnZhbHVlOwp9LCB0cnVlKTsKCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHN0YXQ6IHRydWUgfSwgewogIGZyb206IGZ1bmN0aW9uIGZyb20oTykgewogICAgdmFyIG9iamVjdCA9IHRvT2JqZWN0KE8pOwogICAgdmFyIHVzaW5nSXRlcmF0b3IgPSBnZXRJdGVyYXRvck1ldGhvZChvYmplY3QpOwogICAgdmFyIGl0ZXJhdG9yOwogICAgaWYgKHVzaW5nSXRlcmF0b3IgIT0gbnVsbCkgewogICAgICBpdGVyYXRvciA9IGFGdW5jdGlvbih1c2luZ0l0ZXJhdG9yKS5jYWxsKG9iamVjdCk7CiAgICAgIGlmIChpdGVyYXRvciBpbnN0YW5jZW9mIEl0ZXJhdG9yKSByZXR1cm4gaXRlcmF0b3I7CiAgICB9IGVsc2UgewogICAgICBpdGVyYXRvciA9IG9iamVjdDsKICAgIH0gcmV0dXJuIG5ldyBJdGVyYXRvclByb3h5KHsKICAgICAgaXRlcmF0b3I6IGl0ZXJhdG9yCiAgICB9KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IubWFwLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5tYXAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBjcmVhdGVJdGVyYXRvclByb3h5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1wcm94eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLXByb3h5LmpzIik7CnZhciBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIpOwoKdmFyIEl0ZXJhdG9yUHJveHkgPSBjcmVhdGVJdGVyYXRvclByb3h5KGZ1bmN0aW9uIChhcmcpIHsKICB2YXIgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yOwogIHZhciByZXN1bHQgPSBhbk9iamVjdCh0aGlzLm5leHQuY2FsbChpdGVyYXRvciwgYXJnKSk7CiAgdmFyIGRvbmUgPSB0aGlzLmRvbmUgPSAhIXJlc3VsdC5kb25lOwogIGlmICghZG9uZSkgcmV0dXJuIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIHRoaXMubWFwcGVyLCByZXN1bHQudmFsdWUpOwp9KTsKCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBtYXA6IGZ1bmN0aW9uIG1hcChtYXBwZXIpIHsKICAgIHJldHVybiBuZXcgSXRlcmF0b3JQcm94eSh7CiAgICAgIGl0ZXJhdG9yOiBhbk9iamVjdCh0aGlzKSwKICAgICAgbWFwcGVyOiBhRnVuY3Rpb24obWFwcGVyKQogICAgfSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLnJlZHVjZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IucmVkdWNlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CgokKHsgdGFyZ2V0OiAnSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UocmVkdWNlciAvKiAsIGluaXRpYWxWYWx1ZSAqLykgewogICAgYW5PYmplY3QodGhpcyk7CiAgICBhRnVuY3Rpb24ocmVkdWNlcik7CiAgICB2YXIgbm9Jbml0aWFsID0gYXJndW1lbnRzLmxlbmd0aCA8IDI7CiAgICB2YXIgYWNjdW11bGF0b3IgPSBub0luaXRpYWwgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV07CiAgICBpdGVyYXRlKHRoaXMsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICBpZiAobm9Jbml0aWFsKSB7CiAgICAgICAgbm9Jbml0aWFsID0gZmFsc2U7CiAgICAgICAgYWNjdW11bGF0b3IgPSB2YWx1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhY2N1bXVsYXRvciA9IHJlZHVjZXIoYWNjdW11bGF0b3IsIHZhbHVlKTsKICAgICAgfQogICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSk7CiAgICBpZiAobm9Jbml0aWFsKSB0aHJvdyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBpdGVyYXRvciB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTsKICAgIHJldHVybiBhY2N1bXVsYXRvcjsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3Iuc29tZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLnNvbWUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CgokKHsgdGFyZ2V0OiAnSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgc29tZTogZnVuY3Rpb24gc29tZShmbikgewogICAgYW5PYmplY3QodGhpcyk7CiAgICBhRnVuY3Rpb24oZm4pOwogICAgcmV0dXJuIGl0ZXJhdGUodGhpcywgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgIGlmIChmbih2YWx1ZSkpIHJldHVybiBpdGVyYXRlLnN0b3AoKTsKICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHRydWUpLnN0b3BwZWQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLnRha2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci50YWtlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgdG9Qb3NpdGl2ZUludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlci5qcyIpOwp2YXIgY3JlYXRlSXRlcmF0b3JQcm94eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItcHJveHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1wcm94eS5qcyIpOwoKdmFyIEl0ZXJhdG9yUHJveHkgPSBjcmVhdGVJdGVyYXRvclByb3h5KGZ1bmN0aW9uIChhcmcpIHsKICBpZiAoIXRoaXMucmVtYWluaW5nLS0pIHsKICAgIHRoaXMuZG9uZSA9IHRydWU7CiAgICByZXR1cm47CiAgfQogIHZhciByZXN1bHQgPSBhbk9iamVjdCh0aGlzLm5leHQuY2FsbCh0aGlzLml0ZXJhdG9yLCBhcmcpKTsKICB2YXIgZG9uZSA9IHRoaXMuZG9uZSA9ICEhcmVzdWx0LmRvbmU7CiAgaWYgKCFkb25lKSByZXR1cm4gcmVzdWx0LnZhbHVlOwp9KTsKCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICB0YWtlOiBmdW5jdGlvbiB0YWtlKGxpbWl0KSB7CiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yUHJveHkoewogICAgICBpdGVyYXRvcjogYW5PYmplY3QodGhpcyksCiAgICAgIHJlbWFpbmluZzogdG9Qb3NpdGl2ZUludGVnZXIobGltaXQpCiAgICB9KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IudG8tYXJyYXkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IudG8tYXJyYXkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7CgovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7Cgp2YXIgcHVzaCA9IFtdLnB1c2g7CgokKHsgdGFyZ2V0OiAnSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgdG9BcnJheTogZnVuY3Rpb24gdG9BcnJheSgpIHsKICAgIHZhciByZXN1bHQgPSBbXTsKICAgIGl0ZXJhdGUoYW5PYmplY3QodGhpcyksIHB1c2gsIHJlc3VsdCwgZmFsc2UsIHRydWUpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmRlbGV0ZS1hbGwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmRlbGV0ZS1hbGwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBjb2xsZWN0aW9uRGVsZXRlQWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tZGVsZXRlLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1kZWxldGUtYWxsLmpzIik7CgovLyBgTWFwLnByb3RvdHlwZS5kZWxldGVBbGxgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHMKJCh7IHRhcmdldDogJ01hcCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIGRlbGV0ZUFsbDogZnVuY3Rpb24gZGVsZXRlQWxsKC8qIC4uLmVsZW1lbnRzICovKSB7CiAgICByZXR1cm4gY29sbGVjdGlvbkRlbGV0ZUFsbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAuZXZlcnkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5ldmVyeS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgZ2V0TWFwSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgTWFwLnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnTWFwJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7CiAgICB2YXIgbWFwID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgaXRlcmF0b3IgPSBnZXRNYXBJdGVyYXRvcihtYXApOwogICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTsKICAgIHJldHVybiAhaXRlcmF0ZShpdGVyYXRvciwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgaWYgKCFib3VuZEZ1bmN0aW9uKHZhbHVlLCBrZXksIG1hcCkpIHJldHVybiBpdGVyYXRlLnN0b3AoKTsKICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdHJ1ZSkuc3RvcHBlZDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmZpbHRlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5maWx0ZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiKTsKdmFyIGdldE1hcEl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1tYXAtaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1tYXAtaXRlcmF0b3IuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwoKLy8gYE1hcC5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogICAgdmFyIG1hcCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIGl0ZXJhdG9yID0gZ2V0TWFwSXRlcmF0b3IobWFwKTsKICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7CiAgICB2YXIgbmV3TWFwID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IobWFwLCBnZXRCdWlsdEluKCdNYXAnKSkpKCk7CiAgICB2YXIgc2V0dGVyID0gYUZ1bmN0aW9uKG5ld01hcC5zZXQpOwogICAgaXRlcmF0ZShpdGVyYXRvciwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgaWYgKGJvdW5kRnVuY3Rpb24odmFsdWUsIGtleSwgbWFwKSkgc2V0dGVyLmNhbGwobmV3TWFwLCBrZXksIHZhbHVlKTsKICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdHJ1ZSk7CiAgICByZXR1cm4gbmV3TWFwOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAuZmluZC1rZXkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5maW5kLWtleS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgZ2V0TWFwSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgTWFwLnByb3RvdHlwZS5maW5kS2V5YCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBmaW5kS2V5OiBmdW5jdGlvbiBmaW5kS2V5KGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7CiAgICB2YXIgbWFwID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgaXRlcmF0b3IgPSBnZXRNYXBJdGVyYXRvcihtYXApOwogICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTsKICAgIHJldHVybiBpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICBpZiAoYm91bmRGdW5jdGlvbih2YWx1ZSwga2V5LCBtYXApKSByZXR1cm4gaXRlcmF0ZS5zdG9wKGtleSk7CiAgICB9LCB1bmRlZmluZWQsIHRydWUsIHRydWUpLnJlc3VsdDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmZpbmQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmZpbmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgZ2V0TWFwSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgTWFwLnByb3RvdHlwZS5maW5kYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7CiAgICB2YXIgbWFwID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgaXRlcmF0b3IgPSBnZXRNYXBJdGVyYXRvcihtYXApOwogICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTsKICAgIHJldHVybiBpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICBpZiAoYm91bmRGdW5jdGlvbih2YWx1ZSwga2V5LCBtYXApKSByZXR1cm4gaXRlcmF0ZS5zdG9wKHZhbHVlKTsKICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdHJ1ZSkucmVzdWx0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAuZnJvbS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAuZnJvbS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmcm9tID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tZnJvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1mcm9tLmpzIik7CgovLyBgTWFwLmZyb21gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1tYXAuZnJvbQokKHsgdGFyZ2V0OiAnTWFwJywgc3RhdDogdHJ1ZSB9LCB7CiAgZnJvbTogZnJvbQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5ncm91cC1ieS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmdyb3VwLWJ5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CgovLyBgTWFwLmdyb3VwQnlgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHMKJCh7IHRhcmdldDogJ01hcCcsIHN0YXQ6IHRydWUgfSwgewogIGdyb3VwQnk6IGZ1bmN0aW9uIGdyb3VwQnkoaXRlcmFibGUsIGtleURlcml2YXRpdmUpIHsKICAgIHZhciBuZXdNYXAgPSBuZXcgdGhpcygpOwogICAgYUZ1bmN0aW9uKGtleURlcml2YXRpdmUpOwogICAgdmFyIGhhcyA9IGFGdW5jdGlvbihuZXdNYXAuaGFzKTsKICAgIHZhciBnZXQgPSBhRnVuY3Rpb24obmV3TWFwLmdldCk7CiAgICB2YXIgc2V0ID0gYUZ1bmN0aW9uKG5ld01hcC5zZXQpOwogICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKGVsZW1lbnQpIHsKICAgICAgdmFyIGRlcml2ZWRLZXkgPSBrZXlEZXJpdmF0aXZlKGVsZW1lbnQpOwogICAgICBpZiAoIWhhcy5jYWxsKG5ld01hcCwgZGVyaXZlZEtleSkpIHNldC5jYWxsKG5ld01hcCwgZGVyaXZlZEtleSwgW2VsZW1lbnRdKTsKICAgICAgZWxzZSBnZXQuY2FsbChuZXdNYXAsIGRlcml2ZWRLZXkpLnB1c2goZWxlbWVudCk7CiAgICB9KTsKICAgIHJldHVybiBuZXdNYXA7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5pbmNsdWRlcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmluY2x1ZGVzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBnZXRNYXBJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtbWFwLWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtbWFwLWl0ZXJhdG9yLmpzIik7CnZhciBzYW1lVmFsdWVaZXJvID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NhbWUtdmFsdWUtemVybyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2FtZS12YWx1ZS16ZXJvLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCi8vIGBNYXAucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoRWxlbWVudCkgewogICAgcmV0dXJuIGl0ZXJhdGUoZ2V0TWFwSXRlcmF0b3IoYW5PYmplY3QodGhpcykpLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICBpZiAoc2FtZVZhbHVlWmVybyh2YWx1ZSwgc2VhcmNoRWxlbWVudCkpIHJldHVybiBpdGVyYXRlLnN0b3AoKTsKICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdHJ1ZSkuc3RvcHBlZDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmtleS1ieS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5rZXktYnkuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CgovLyBgTWFwLmtleUJ5YCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdNYXAnLCBzdGF0OiB0cnVlIH0sIHsKICBrZXlCeTogZnVuY3Rpb24ga2V5QnkoaXRlcmFibGUsIGtleURlcml2YXRpdmUpIHsKICAgIHZhciBuZXdNYXAgPSBuZXcgdGhpcygpOwogICAgYUZ1bmN0aW9uKGtleURlcml2YXRpdmUpOwogICAgdmFyIHNldHRlciA9IGFGdW5jdGlvbihuZXdNYXAuc2V0KTsKICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICAgIHNldHRlci5jYWxsKG5ld01hcCwga2V5RGVyaXZhdGl2ZShlbGVtZW50KSwgZWxlbWVudCk7CiAgICB9KTsKICAgIHJldHVybiBuZXdNYXA7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5rZXktb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAua2V5LW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgZ2V0TWFwSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgTWFwLnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnTWFwJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAga2V5T2Y6IGZ1bmN0aW9uIGtleU9mKHNlYXJjaEVsZW1lbnQpIHsKICAgIHJldHVybiBpdGVyYXRlKGdldE1hcEl0ZXJhdG9yKGFuT2JqZWN0KHRoaXMpKSwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgaWYgKHZhbHVlID09PSBzZWFyY2hFbGVtZW50KSByZXR1cm4gaXRlcmF0ZS5zdG9wKGtleSk7CiAgICB9LCB1bmRlZmluZWQsIHRydWUsIHRydWUpLnJlc3VsdDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLm1hcC1rZXlzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAubWFwLWtleXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzIik7CnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIpOwp2YXIgZ2V0TWFwSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgTWFwLnByb3RvdHlwZS5tYXBLZXlzYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBtYXBLZXlzOiBmdW5jdGlvbiBtYXBLZXlzKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7CiAgICB2YXIgbWFwID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgaXRlcmF0b3IgPSBnZXRNYXBJdGVyYXRvcihtYXApOwogICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTsKICAgIHZhciBuZXdNYXAgPSBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihtYXAsIGdldEJ1aWx0SW4oJ01hcCcpKSkoKTsKICAgIHZhciBzZXR0ZXIgPSBhRnVuY3Rpb24obmV3TWFwLnNldCk7CiAgICBpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICBzZXR0ZXIuY2FsbChuZXdNYXAsIGJvdW5kRnVuY3Rpb24odmFsdWUsIGtleSwgbWFwKSwgdmFsdWUpOwogICAgfSwgdW5kZWZpbmVkLCB0cnVlLCB0cnVlKTsKICAgIHJldHVybiBuZXdNYXA7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5tYXAtdmFsdWVzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5tYXAtdmFsdWVzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzIik7CnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIpOwp2YXIgZ2V0TWFwSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgTWFwLnByb3RvdHlwZS5tYXBWYWx1ZXNgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHMKJCh7IHRhcmdldDogJ01hcCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIG1hcFZhbHVlczogZnVuY3Rpb24gbWFwVmFsdWVzKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7CiAgICB2YXIgbWFwID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgaXRlcmF0b3IgPSBnZXRNYXBJdGVyYXRvcihtYXApOwogICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTsKICAgIHZhciBuZXdNYXAgPSBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihtYXAsIGdldEJ1aWx0SW4oJ01hcCcpKSkoKTsKICAgIHZhciBzZXR0ZXIgPSBhRnVuY3Rpb24obmV3TWFwLnNldCk7CiAgICBpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICBzZXR0ZXIuY2FsbChuZXdNYXAsIGtleSwgYm91bmRGdW5jdGlvbih2YWx1ZSwga2V5LCBtYXApKTsKICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdHJ1ZSk7CiAgICByZXR1cm4gbmV3TWFwOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAubWVyZ2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5tZXJnZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwoKLy8gYE1hcC5wcm90b3R5cGUubWVyZ2VgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHMKJCh7IHRhcmdldDogJ01hcCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycwogIG1lcmdlOiBmdW5jdGlvbiBtZXJnZShpdGVyYWJsZSAvKiAuLi5pdGVyYmxlcyAqLykgewogICAgdmFyIG1hcCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIHNldHRlciA9IGFGdW5jdGlvbihtYXAuc2V0KTsKICAgIHZhciBpID0gMDsKICAgIHdoaWxlIChpIDwgYXJndW1lbnRzLmxlbmd0aCkgewogICAgICBpdGVyYXRlKGFyZ3VtZW50c1tpKytdLCBzZXR0ZXIsIG1hcCwgdHJ1ZSk7CiAgICB9CiAgICByZXR1cm4gbWFwOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAub2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5vZi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1vZi5qcyIpOwoKLy8gYE1hcC5vZmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLW1hcC5vZgokKHsgdGFyZ2V0OiAnTWFwJywgc3RhdDogdHJ1ZSB9LCB7CiAgb2Y6IG9mCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLnJlZHVjZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5yZWR1Y2UuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgZ2V0TWFwSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgTWFwLnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHMKJCh7IHRhcmdldDogJ01hcCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlKGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHsKICAgIHZhciBtYXAgPSBhbk9iamVjdCh0aGlzKTsKICAgIHZhciBpdGVyYXRvciA9IGdldE1hcEl0ZXJhdG9yKG1hcCk7CiAgICB2YXIgbm9Jbml0aWFsID0gYXJndW1lbnRzLmxlbmd0aCA8IDI7CiAgICB2YXIgYWNjdW11bGF0b3IgPSBub0luaXRpYWwgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV07CiAgICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7CiAgICBpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICBpZiAobm9Jbml0aWFsKSB7CiAgICAgICAgbm9Jbml0aWFsID0gZmFsc2U7CiAgICAgICAgYWNjdW11bGF0b3IgPSB2YWx1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhY2N1bXVsYXRvciA9IGNhbGxiYWNrZm4oYWNjdW11bGF0b3IsIHZhbHVlLCBrZXksIG1hcCk7CiAgICAgIH0KICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdHJ1ZSk7CiAgICBpZiAobm9Jbml0aWFsKSB0aHJvdyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBtYXAgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7CiAgICByZXR1cm4gYWNjdW11bGF0b3I7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5zb21lLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5zb21lLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiKTsKdmFyIGdldE1hcEl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1tYXAtaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1tYXAtaXRlcmF0b3IuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwoKLy8gYFNldC5wcm90b3R5cGUuc29tZWAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnTWFwJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogICAgdmFyIG1hcCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIGl0ZXJhdG9yID0gZ2V0TWFwSXRlcmF0b3IobWFwKTsKICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7CiAgICByZXR1cm4gaXRlcmF0ZShpdGVyYXRvciwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgaWYgKGJvdW5kRnVuY3Rpb24odmFsdWUsIGtleSwgbWFwKSkgcmV0dXJuIGl0ZXJhdGUuc3RvcCgpOwogICAgfSwgdW5kZWZpbmVkLCB0cnVlLCB0cnVlKS5zdG9wcGVkOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAudXBkYXRlLW9yLWluc2VydC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAudXBkYXRlLW9yLWluc2VydC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIFRPRE86IHJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyICR1cHNlcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWFwLXVwc2VydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWFwLXVwc2VydC5qcyIpOwoKLy8gYE1hcC5wcm90b3R5cGUudXBkYXRlT3JJbnNlcnRgIG1ldGhvZCAocmVwbGFjZWQgYnkgYE1hcC5wcm90b3R5cGUudXBzZXJ0YCkKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RodW1ic3VwZXAvcHJvcG9zYWwtdXBzZXJ0CiQoeyB0YXJnZXQ6ICdNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICB1cGRhdGVPckluc2VydDogJHVwc2VydAp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC51cGRhdGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAudXBkYXRlLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKCi8vIGBTZXQucHJvdG90eXBlLnVwZGF0ZWAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnTWFwJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoa2V5LCBjYWxsYmFjayAvKiAsIHRodW5rICovKSB7CiAgICB2YXIgbWFwID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIGFGdW5jdGlvbihjYWxsYmFjayk7CiAgICB2YXIgaXNQcmVzZW50SW5NYXAgPSBtYXAuaGFzKGtleSk7CiAgICBpZiAoIWlzUHJlc2VudEluTWFwICYmIGxlbmd0aCA8IDMpIHsKICAgICAgdGhyb3cgVHlwZUVycm9yKCdVcGRhdGluZyBhYnNlbnQgdmFsdWUnKTsKICAgIH0KICAgIHZhciB2YWx1ZSA9IGlzUHJlc2VudEluTWFwID8gbWFwLmdldChrZXkpIDogYUZ1bmN0aW9uKGxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpKGtleSwgbWFwKTsKICAgIG1hcC5zZXQoa2V5LCBjYWxsYmFjayh2YWx1ZSwga2V5LCBtYXApKTsKICAgIHJldHVybiBtYXA7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC51cHNlcnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAudXBzZXJ0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciAkdXBzZXJ0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21hcC11cHNlcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hcC11cHNlcnQuanMiKTsKCi8vIGBNYXAucHJvdG90eXBlLnVwc2VydGAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90aHVtYnN1cGVwL3Byb3Bvc2FsLXVwc2VydAokKHsgdGFyZ2V0OiAnTWFwJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgdXBzZXJ0OiAkdXBzZXJ0Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5jbGFtcC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguY2xhbXAuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7Cgp2YXIgbWluID0gTWF0aC5taW47CnZhciBtYXggPSBNYXRoLm1heDsKCi8vIGBNYXRoLmNsYW1wYCBtZXRob2QKLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zLwokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIGNsYW1wOiBmdW5jdGlvbiBjbGFtcCh4LCBsb3dlciwgdXBwZXIpIHsKICAgIHJldHVybiBtaW4odXBwZXIsIG1heChsb3dlciwgeCkpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmRlZy1wZXItcmFkLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5kZWctcGVyLXJhZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCi8vIGBNYXRoLkRFR19QRVJfUkFEYCBjb25zdGFudAovLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvCiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7CiAgREVHX1BFUl9SQUQ6IE1hdGguUEkgLyAxODAKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmRlZ3JlZXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguZGVncmVlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwoKdmFyIFJBRF9QRVJfREVHID0gMTgwIC8gTWF0aC5QSTsKCi8vIGBNYXRoLmRlZ3JlZXNgIG1ldGhvZAovLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvCiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7CiAgZGVncmVlczogZnVuY3Rpb24gZGVncmVlcyhyYWRpYW5zKSB7CiAgICByZXR1cm4gcmFkaWFucyAqIFJBRF9QRVJfREVHOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmZzY2FsZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmZzY2FsZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7Cgp2YXIgc2NhbGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWF0aC1zY2FsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC1zY2FsZS5qcyIpOwp2YXIgZnJvdW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21hdGgtZnJvdW5kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXRoLWZyb3VuZC5qcyIpOwoKLy8gYE1hdGguZnNjYWxlYCBtZXRob2QKLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zLwokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIGZzY2FsZTogZnVuY3Rpb24gZnNjYWxlKHgsIGluTG93LCBpbkhpZ2gsIG91dExvdywgb3V0SGlnaCkgewogICAgcmV0dXJuIGZyb3VuZChzY2FsZSh4LCBpbkxvdywgaW5IaWdoLCBvdXRMb3csIG91dEhpZ2gpKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5pYWRkaC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguaWFkZGguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CgovLyBgTWF0aC5pYWRkaGAgbWV0aG9kCi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyZW5kYW5FaWNoLzQyOTRkNWMyMTJhNmQyMjU0NzAzCi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgCiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7CiAgaWFkZGg6IGZ1bmN0aW9uIGlhZGRoKHgwLCB4MSwgeTAsIHkxKSB7CiAgICB2YXIgJHgwID0geDAgPj4+IDA7CiAgICB2YXIgJHgxID0geDEgPj4+IDA7CiAgICB2YXIgJHkwID0geTAgPj4+IDA7CiAgICByZXR1cm4gJHgxICsgKHkxID4+PiAwKSArICgoJHgwICYgJHkwIHwgKCR4MCB8ICR5MCkgJiB+KCR4MCArICR5MCA+Pj4gMCkpID4+PiAzMSkgfCAwOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmltdWxoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5pbXVsaC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCi8vIGBNYXRoLmltdWxoYCBtZXRob2QKLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJlbmRhbkVpY2gvNDI5NGQ1YzIxMmE2ZDIyNTQ3MDMKLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGAKJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlIH0sIHsKICBpbXVsaDogZnVuY3Rpb24gaW11bGgodSwgdikgewogICAgdmFyIFVJTlQxNiA9IDB4RkZGRjsKICAgIHZhciAkdSA9ICt1OwogICAgdmFyICR2ID0gK3Y7CiAgICB2YXIgdTAgPSAkdSAmIFVJTlQxNjsKICAgIHZhciB2MCA9ICR2ICYgVUlOVDE2OwogICAgdmFyIHUxID0gJHUgPj4gMTY7CiAgICB2YXIgdjEgPSAkdiA+PiAxNjsKICAgIHZhciB0ID0gKHUxICogdjAgPj4+IDApICsgKHUwICogdjAgPj4+IDE2KTsKICAgIHJldHVybiB1MSAqIHYxICsgKHQgPj4gMTYpICsgKCh1MCAqIHYxID4+PiAwKSArICh0ICYgVUlOVDE2KSA+PiAxNik7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguaXN1YmguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmlzdWJoLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwoKLy8gYE1hdGguaXN1YmhgIG1ldGhvZAovLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwMwovLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YAokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIGlzdWJoOiBmdW5jdGlvbiBpc3ViaCh4MCwgeDEsIHkwLCB5MSkgewogICAgdmFyICR4MCA9IHgwID4+PiAwOwogICAgdmFyICR4MSA9IHgxID4+PiAwOwogICAgdmFyICR5MCA9IHkwID4+PiAwOwogICAgcmV0dXJuICR4MSAtICh5MSA+Pj4gMCkgLSAoKH4keDAgJiAkeTAgfCB+KCR4MCBeICR5MCkgJiAkeDAgLSAkeTAgPj4+IDApID4+PiAzMSkgfCAwOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLnJhZC1wZXItZGVnLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5yYWQtcGVyLWRlZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCi8vIGBNYXRoLlJBRF9QRVJfREVHYCBjb25zdGFudAovLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvCiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7CiAgUkFEX1BFUl9ERUc6IDE4MCAvIE1hdGguUEkKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLnJhZGlhbnMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGgucmFkaWFucy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwoKdmFyIERFR19QRVJfUkFEID0gTWF0aC5QSSAvIDE4MDsKCi8vIGBNYXRoLnJhZGlhbnNgIG1ldGhvZAovLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvCiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7CiAgcmFkaWFuczogZnVuY3Rpb24gcmFkaWFucyhkZWdyZWVzKSB7CiAgICByZXR1cm4gZGVncmVlcyAqIERFR19QRVJfUkFEOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLnNjYWxlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5zY2FsZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIHNjYWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21hdGgtc2NhbGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtc2NhbGUuanMiKTsKCi8vIGBNYXRoLnNjYWxlYCBtZXRob2QKLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zLwokKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgewogIHNjYWxlOiBzY2FsZQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguc2VlZGVkLXBybmcuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLnNlZWRlZC1wcm5nLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIG51bWJlcklzRmluaXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL251bWJlci1pcy1maW5pdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1pcy1maW5pdGUuanMiKTsKdmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3IuanMiKTsKdmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIik7Cgp2YXIgU0VFREVEX1JBTkRPTSA9ICdTZWVkZWQgUmFuZG9tJzsKdmFyIFNFRURFRF9SQU5ET01fR0VORVJBVE9SID0gU0VFREVEX1JBTkRPTSArICcgR2VuZXJhdG9yJzsKdmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTRUVERURfUkFORE9NX0dFTkVSQVRPUik7CnZhciBTRUVEX1RZUEVfRVJST1IgPSAnTWF0aC5zZWVkZWRQUk5HKCkgYXJndW1lbnQgc2hvdWxkIGhhdmUgYSAic2VlZCIgZmllbGQgd2l0aCBhIGZpbml0ZSB2YWx1ZS4nOwoKdmFyICRTZWVkZWRSYW5kb21HZW5lcmF0b3IgPSBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yKGZ1bmN0aW9uIFNlZWRlZFJhbmRvbUdlbmVyYXRvcihzZWVkKSB7CiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7CiAgICB0eXBlOiBTRUVERURfUkFORE9NX0dFTkVSQVRPUiwKICAgIHNlZWQ6IHNlZWQgJSAyMTQ3NDgzNjQ3CiAgfSk7Cn0sIFNFRURFRF9SQU5ET00sIGZ1bmN0aW9uIG5leHQoKSB7CiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTsKICB2YXIgc2VlZCA9IHN0YXRlLnNlZWQgPSAoc3RhdGUuc2VlZCAqIDExMDM1MTUyNDUgKyAxMjM0NSkgJSAyMTQ3NDgzNjQ3OwogIHJldHVybiB7IHZhbHVlOiAoc2VlZCAmIDEwNzM3NDE4MjMpIC8gMTA3Mzc0MTgyMywgZG9uZTogZmFsc2UgfTsKfSk7CgovLyBgTWF0aC5zZWVkZWRQUk5HYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2VlZGVkLXJhbmRvbQovLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZWVkZWQtcmFuZG9tL2Jsb2IvNzhiODI1ODgzNWI1N2ZjMjEwMGQwNzYxNTFhYjUwNmJjMzIwMmFlNi9kZW1vLmh0bWwKJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwgewogIHNlZWRlZFBSTkc6IGZ1bmN0aW9uIHNlZWRlZFBSTkcoaXQpIHsKICAgIHZhciBzZWVkID0gYW5PYmplY3QoaXQpLnNlZWQ7CiAgICBpZiAoIW51bWJlcklzRmluaXRlKHNlZWQpKSB0aHJvdyBUeXBlRXJyb3IoU0VFRF9UWVBFX0VSUk9SKTsKICAgIHJldHVybiBuZXcgJFNlZWRlZFJhbmRvbUdlbmVyYXRvcihzZWVkKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5zaWduYml0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLnNpZ25iaXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCi8vIGBNYXRoLnNpZ25iaXRgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1NYXRoLnNpZ25iaXQKJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlIH0sIHsKICBzaWduYml0OiBmdW5jdGlvbiBzaWduYml0KHgpIHsKICAgIHJldHVybiAoeCA9ICt4KSA9PSB4ICYmIHggPT0gMCA/IDEgLyB4ID09IC1JbmZpbml0eSA6IHggPCAwOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLnVtdWxoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC51bXVsaC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCi8vIGBNYXRoLnVtdWxoYCBtZXRob2QKLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJlbmRhbkVpY2gvNDI5NGQ1YzIxMmE2ZDIyNTQ3MDMKLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGAKJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlIH0sIHsKICB1bXVsaDogZnVuY3Rpb24gdW11bGgodSwgdikgewogICAgdmFyIFVJTlQxNiA9IDB4RkZGRjsKICAgIHZhciAkdSA9ICt1OwogICAgdmFyICR2ID0gK3Y7CiAgICB2YXIgdTAgPSAkdSAmIFVJTlQxNjsKICAgIHZhciB2MCA9ICR2ICYgVUlOVDE2OwogICAgdmFyIHUxID0gJHUgPj4+IDE2OwogICAgdmFyIHYxID0gJHYgPj4+IDE2OwogICAgdmFyIHQgPSAodTEgKiB2MCA+Pj4gMCkgKyAodTAgKiB2MCA+Pj4gMTYpOwogICAgcmV0dXJuIHUxICogdjEgKyAodCA+Pj4gMTYpICsgKCh1MCAqIHYxID4+PiAwKSArICh0ICYgVUlOVDE2KSA+Pj4gMTYpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5udW1iZXIuZnJvbS1zdHJpbmcuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm51bWJlci5mcm9tLXN0cmluZy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXIuanMiKTsKdmFyIHBhcnNlSW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3BhcnNlLWludCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGFyc2UtaW50LmpzIik7Cgp2YXIgSU5WQUxJRF9OVU1CRVJfUkVQUkVTRU5UQVRJT04gPSAnSW52YWxpZCBudW1iZXIgcmVwcmVzZW50YXRpb24nOwp2YXIgSU5WQUxJRF9SQURJWCA9ICdJbnZhbGlkIHJhZGl4JzsKdmFyIHZhbGlkID0gL15bXGRhLXpdKyQvOwoKLy8gYE51bWJlci5mcm9tU3RyaW5nYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtbnVtYmVyLWZyb21zdHJpbmcKJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUgfSwgewogIGZyb21TdHJpbmc6IGZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyaW5nLCByYWRpeCkgewogICAgdmFyIHNpZ24gPSAxOwogICAgdmFyIFIsIG1hdGhOdW07CiAgICBpZiAodHlwZW9mIHN0cmluZyAhPSAnc3RyaW5nJykgdGhyb3cgVHlwZUVycm9yKElOVkFMSURfTlVNQkVSX1JFUFJFU0VOVEFUSU9OKTsKICAgIGlmICghc3RyaW5nLmxlbmd0aCkgdGhyb3cgU3ludGF4RXJyb3IoSU5WQUxJRF9OVU1CRVJfUkVQUkVTRU5UQVRJT04pOwogICAgaWYgKHN0cmluZy5jaGFyQXQoMCkgPT0gJy0nKSB7CiAgICAgIHNpZ24gPSAtMTsKICAgICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKDEpOwogICAgICBpZiAoIXN0cmluZy5sZW5ndGgpIHRocm93IFN5bnRheEVycm9yKElOVkFMSURfTlVNQkVSX1JFUFJFU0VOVEFUSU9OKTsKICAgIH0KICAgIFIgPSByYWRpeCA9PT0gdW5kZWZpbmVkID8gMTAgOiB0b0ludGVnZXIocmFkaXgpOwogICAgaWYgKFIgPCAyIHx8IFIgPiAzNikgdGhyb3cgUmFuZ2VFcnJvcihJTlZBTElEX1JBRElYKTsKICAgIGlmICghdmFsaWQudGVzdChzdHJpbmcpIHx8IChtYXRoTnVtID0gcGFyc2VJbnQoc3RyaW5nLCBSKSkudG9TdHJpbmcoUikgIT09IHN0cmluZykgewogICAgICB0aHJvdyBTeW50YXhFcnJvcihJTlZBTElEX05VTUJFUl9SRVBSRVNFTlRBVElPTik7CiAgICB9CiAgICByZXR1cm4gc2lnbiAqIG1hdGhOdW07CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm9iamVjdC5pdGVyYXRlLWVudHJpZXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5vYmplY3QuaXRlcmF0ZS1lbnRyaWVzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgT2JqZWN0SXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXRlcmF0b3IuanMiKTsKCi8vIGBPYmplY3QuaXRlcmF0ZUVudHJpZXNgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtaXRlcmF0aW9uCiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBpdGVyYXRlRW50cmllczogZnVuY3Rpb24gaXRlcmF0ZUVudHJpZXMob2JqZWN0KSB7CiAgICByZXR1cm4gbmV3IE9iamVjdEl0ZXJhdG9yKG9iamVjdCwgJ2VudHJpZXMnKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQub2JqZWN0Lml0ZXJhdGUta2V5cy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm9iamVjdC5pdGVyYXRlLWtleXMuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBPYmplY3RJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pdGVyYXRvci5qcyIpOwoKLy8gYE9iamVjdC5pdGVyYXRlS2V5c2AgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC1pdGVyYXRpb24KJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwgewogIGl0ZXJhdGVLZXlzOiBmdW5jdGlvbiBpdGVyYXRlS2V5cyhvYmplY3QpIHsKICAgIHJldHVybiBuZXcgT2JqZWN0SXRlcmF0b3Iob2JqZWN0LCAna2V5cycpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5vYmplY3QuaXRlcmF0ZS12YWx1ZXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm9iamVjdC5pdGVyYXRlLXZhbHVlcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgT2JqZWN0SXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXRlcmF0b3IuanMiKTsKCi8vIGBPYmplY3QuaXRlcmF0ZVZhbHVlc2AgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC1pdGVyYXRpb24KJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwgewogIGl0ZXJhdGVWYWx1ZXM6IGZ1bmN0aW9uIGl0ZXJhdGVWYWx1ZXMob2JqZWN0KSB7CiAgICByZXR1cm4gbmV3IE9iamVjdEl0ZXJhdG9yKG9iamVjdCwgJ3ZhbHVlcycpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5vYnNlcnZhYmxlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQub2JzZXJ2YWJsZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JzZXJ2YWJsZQp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBzZXRTcGVjaWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC1zcGVjaWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIpOwp2YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiKTsKdmFyIGRlZmluZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiKS5mOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7CnZhciByZWRlZmluZUFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLWFsbC5qcyIpOwp2YXIgZ2V0SXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3IuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwp2YXIgaG9zdFJlcG9ydEVycm9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9ob3N0LXJlcG9ydC1lcnJvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycy5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwp2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiKTsKCnZhciBPQlNFUlZBQkxFID0gd2VsbEtub3duU3ltYm9sKCdvYnNlcnZhYmxlJyk7CnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7CnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7Cgp2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24gKGZuKSB7CiAgcmV0dXJuIGZuID09IG51bGwgPyB1bmRlZmluZWQgOiBhRnVuY3Rpb24oZm4pOwp9OwoKdmFyIGNsZWFudXBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uU3RhdGUpIHsKICB2YXIgY2xlYW51cCA9IHN1YnNjcmlwdGlvblN0YXRlLmNsZWFudXA7CiAgaWYgKGNsZWFudXApIHsKICAgIHN1YnNjcmlwdGlvblN0YXRlLmNsZWFudXAgPSB1bmRlZmluZWQ7CiAgICB0cnkgewogICAgICBjbGVhbnVwKCk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBob3N0UmVwb3J0RXJyb3JzKGVycm9yKTsKICAgIH0KICB9Cn07Cgp2YXIgc3Vic2NyaXB0aW9uQ2xvc2VkID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvblN0YXRlKSB7CiAgcmV0dXJuIHN1YnNjcmlwdGlvblN0YXRlLm9ic2VydmVyID09PSB1bmRlZmluZWQ7Cn07Cgp2YXIgY2xvc2UgPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uLCBzdWJzY3JpcHRpb25TdGF0ZSkgewogIGlmICghREVTQ1JJUFRPUlMpIHsKICAgIHN1YnNjcmlwdGlvbi5jbG9zZWQgPSB0cnVlOwogICAgdmFyIHN1YnNjcmlwdGlvbk9ic2VydmVyID0gc3Vic2NyaXB0aW9uU3RhdGUuc3Vic2NyaXB0aW9uT2JzZXJ2ZXI7CiAgICBpZiAoc3Vic2NyaXB0aW9uT2JzZXJ2ZXIpIHN1YnNjcmlwdGlvbk9ic2VydmVyLmNsb3NlZCA9IHRydWU7CiAgfSBzdWJzY3JpcHRpb25TdGF0ZS5vYnNlcnZlciA9IHVuZGVmaW5lZDsKfTsKCnZhciBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAob2JzZXJ2ZXIsIHN1YnNjcmliZXIpIHsKICB2YXIgc3Vic2NyaXB0aW9uU3RhdGUgPSBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsKICAgIGNsZWFudXA6IHVuZGVmaW5lZCwKICAgIG9ic2VydmVyOiBhbk9iamVjdChvYnNlcnZlciksCiAgICBzdWJzY3JpcHRpb25PYnNlcnZlcjogdW5kZWZpbmVkCiAgfSk7CiAgdmFyIHN0YXJ0OwogIGlmICghREVTQ1JJUFRPUlMpIHRoaXMuY2xvc2VkID0gZmFsc2U7CiAgdHJ5IHsKICAgIGlmIChzdGFydCA9IGdldE1ldGhvZChvYnNlcnZlci5zdGFydCkpIHN0YXJ0LmNhbGwob2JzZXJ2ZXIsIHRoaXMpOwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICBob3N0UmVwb3J0RXJyb3JzKGVycm9yKTsKICB9CiAgaWYgKHN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb25TdGF0ZSkpIHJldHVybjsKICB2YXIgc3Vic2NyaXB0aW9uT2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb25TdGF0ZS5zdWJzY3JpcHRpb25PYnNlcnZlciA9IG5ldyBTdWJzY3JpcHRpb25PYnNlcnZlcih0aGlzKTsKICB0cnkgewogICAgdmFyIGNsZWFudXAgPSBzdWJzY3JpYmVyKHN1YnNjcmlwdGlvbk9ic2VydmVyKTsKICAgIHZhciBzdWJzY3JpcHRpb24gPSBjbGVhbnVwOwogICAgaWYgKGNsZWFudXAgIT0gbnVsbCkgc3Vic2NyaXB0aW9uU3RhdGUuY2xlYW51cCA9IHR5cGVvZiBjbGVhbnVwLnVuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nCiAgICAgID8gZnVuY3Rpb24gKCkgeyBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsgfQogICAgICA6IGFGdW5jdGlvbihjbGVhbnVwKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgc3Vic2NyaXB0aW9uT2JzZXJ2ZXIuZXJyb3IoZXJyb3IpOwogICAgcmV0dXJuOwogIH0gaWYgKHN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb25TdGF0ZSkpIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uU3RhdGUpOwp9OwoKU3Vic2NyaXB0aW9uLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKHt9LCB7CiAgdW5zdWJzY3JpYmU6IGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkgewogICAgdmFyIHN1YnNjcmlwdGlvblN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTsKICAgIGlmICghc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvblN0YXRlKSkgewogICAgICBjbG9zZSh0aGlzLCBzdWJzY3JpcHRpb25TdGF0ZSk7CiAgICAgIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uU3RhdGUpOwogICAgfQogIH0KfSk7CgppZiAoREVTQ1JJUFRPUlMpIGRlZmluZVByb3BlcnR5KFN1YnNjcmlwdGlvbi5wcm90b3R5cGUsICdjbG9zZWQnLCB7CiAgY29uZmlndXJhYmxlOiB0cnVlLAogIGdldDogZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIHN1YnNjcmlwdGlvbkNsb3NlZChnZXRJbnRlcm5hbFN0YXRlKHRoaXMpKTsKICB9Cn0pOwoKdmFyIFN1YnNjcmlwdGlvbk9ic2VydmVyID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikgewogIHNldEludGVybmFsU3RhdGUodGhpcywgeyBzdWJzY3JpcHRpb246IHN1YnNjcmlwdGlvbiB9KTsKICBpZiAoIURFU0NSSVBUT1JTKSB0aGlzLmNsb3NlZCA9IGZhbHNlOwp9OwoKU3Vic2NyaXB0aW9uT2JzZXJ2ZXIucHJvdG90eXBlID0gcmVkZWZpbmVBbGwoe30sIHsKICBuZXh0OiBmdW5jdGlvbiBuZXh0KHZhbHVlKSB7CiAgICB2YXIgc3Vic2NyaXB0aW9uU3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKGdldEludGVybmFsU3RhdGUodGhpcykuc3Vic2NyaXB0aW9uKTsKICAgIGlmICghc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvblN0YXRlKSkgewogICAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb25TdGF0ZS5vYnNlcnZlcjsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgbmV4dE1ldGhvZCA9IGdldE1ldGhvZChvYnNlcnZlci5uZXh0KTsKICAgICAgICBpZiAobmV4dE1ldGhvZCkgbmV4dE1ldGhvZC5jYWxsKG9ic2VydmVyLCB2YWx1ZSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgaG9zdFJlcG9ydEVycm9ycyhlcnJvcik7CiAgICAgIH0KICAgIH0KICB9LAogIGVycm9yOiBmdW5jdGlvbiBlcnJvcih2YWx1ZSkgewogICAgdmFyIHN1YnNjcmlwdGlvbiA9IGdldEludGVybmFsU3RhdGUodGhpcykuc3Vic2NyaXB0aW9uOwogICAgdmFyIHN1YnNjcmlwdGlvblN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZShzdWJzY3JpcHRpb24pOwogICAgaWYgKCFzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uU3RhdGUpKSB7CiAgICAgIHZhciBvYnNlcnZlciA9IHN1YnNjcmlwdGlvblN0YXRlLm9ic2VydmVyOwogICAgICBjbG9zZShzdWJzY3JpcHRpb24sIHN1YnNjcmlwdGlvblN0YXRlKTsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgZXJyb3JNZXRob2QgPSBnZXRNZXRob2Qob2JzZXJ2ZXIuZXJyb3IpOwogICAgICAgIGlmIChlcnJvck1ldGhvZCkgZXJyb3JNZXRob2QuY2FsbChvYnNlcnZlciwgdmFsdWUpOwogICAgICAgIGVsc2UgaG9zdFJlcG9ydEVycm9ycyh2YWx1ZSk7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGhvc3RSZXBvcnRFcnJvcnMoZXJyKTsKICAgICAgfSBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvblN0YXRlKTsKICAgIH0KICB9LAogIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZSgpIHsKICAgIHZhciBzdWJzY3JpcHRpb24gPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnN1YnNjcmlwdGlvbjsKICAgIHZhciBzdWJzY3JpcHRpb25TdGF0ZSA9IGdldEludGVybmFsU3RhdGUoc3Vic2NyaXB0aW9uKTsKICAgIGlmICghc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvblN0YXRlKSkgewogICAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb25TdGF0ZS5vYnNlcnZlcjsKICAgICAgY2xvc2Uoc3Vic2NyaXB0aW9uLCBzdWJzY3JpcHRpb25TdGF0ZSk7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGNvbXBsZXRlTWV0aG9kID0gZ2V0TWV0aG9kKG9ic2VydmVyLmNvbXBsZXRlKTsKICAgICAgICBpZiAoY29tcGxldGVNZXRob2QpIGNvbXBsZXRlTWV0aG9kLmNhbGwob2JzZXJ2ZXIpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGhvc3RSZXBvcnRFcnJvcnMoZXJyb3IpOwogICAgICB9IGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uU3RhdGUpOwogICAgfQogIH0KfSk7CgppZiAoREVTQ1JJUFRPUlMpIGRlZmluZVByb3BlcnR5KFN1YnNjcmlwdGlvbk9ic2VydmVyLnByb3RvdHlwZSwgJ2Nsb3NlZCcsIHsKICBjb25maWd1cmFibGU6IHRydWUsCiAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gc3Vic2NyaXB0aW9uQ2xvc2VkKGdldEludGVybmFsU3RhdGUoZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zdWJzY3JpcHRpb24pKTsKICB9Cn0pOwoKdmFyICRPYnNlcnZhYmxlID0gZnVuY3Rpb24gT2JzZXJ2YWJsZShzdWJzY3JpYmVyKSB7CiAgYW5JbnN0YW5jZSh0aGlzLCAkT2JzZXJ2YWJsZSwgJ09ic2VydmFibGUnKTsKICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsgc3Vic2NyaWJlcjogYUZ1bmN0aW9uKHN1YnNjcmliZXIpIH0pOwp9OwoKcmVkZWZpbmVBbGwoJE9ic2VydmFibGUucHJvdG90eXBlLCB7CiAgc3Vic2NyaWJlOiBmdW5jdGlvbiBzdWJzY3JpYmUob2JzZXJ2ZXIpIHsKICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24odHlwZW9mIG9ic2VydmVyID09PSAnZnVuY3Rpb24nID8gewogICAgICBuZXh0OiBvYnNlcnZlciwKICAgICAgZXJyb3I6IGxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsCiAgICAgIGNvbXBsZXRlOiBsZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkCiAgICB9IDogaXNPYmplY3Qob2JzZXJ2ZXIpID8gb2JzZXJ2ZXIgOiB7fSwgZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zdWJzY3JpYmVyKTsKICB9Cn0pOwoKcmVkZWZpbmVBbGwoJE9ic2VydmFibGUsIHsKICBmcm9tOiBmdW5jdGlvbiBmcm9tKHgpIHsKICAgIHZhciBDID0gdHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogJE9ic2VydmFibGU7CiAgICB2YXIgb2JzZXJ2YWJsZU1ldGhvZCA9IGdldE1ldGhvZChhbk9iamVjdCh4KVtPQlNFUlZBQkxFXSk7CiAgICBpZiAob2JzZXJ2YWJsZU1ldGhvZCkgewogICAgICB2YXIgb2JzZXJ2YWJsZSA9IGFuT2JqZWN0KG9ic2VydmFibGVNZXRob2QuY2FsbCh4KSk7CiAgICAgIHJldHVybiBvYnNlcnZhYmxlLmNvbnN0cnVjdG9yID09PSBDID8gb2JzZXJ2YWJsZSA6IG5ldyBDKGZ1bmN0aW9uIChvYnNlcnZlcikgewogICAgICAgIHJldHVybiBvYnNlcnZhYmxlLnN1YnNjcmliZShvYnNlcnZlcik7CiAgICAgIH0pOwogICAgfQogICAgdmFyIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoeCk7CiAgICByZXR1cm4gbmV3IEMoZnVuY3Rpb24gKG9ic2VydmVyKSB7CiAgICAgIGl0ZXJhdGUoaXRlcmF0b3IsIGZ1bmN0aW9uIChpdCkgewogICAgICAgIG9ic2VydmVyLm5leHQoaXQpOwogICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybiBpdGVyYXRlLnN0b3AoKTsKICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSk7CiAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7CiAgICB9KTsKICB9LAogIG9mOiBmdW5jdGlvbiBvZigpIHsKICAgIHZhciBDID0gdHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogJE9ic2VydmFibGU7CiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIHZhciBpdGVtcyA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgdmFyIGluZGV4ID0gMDsKICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkgaXRlbXNbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4KytdOwogICAgcmV0dXJuIG5ldyBDKGZ1bmN0aW9uIChvYnNlcnZlcikgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgb2JzZXJ2ZXIubmV4dChpdGVtc1tpXSk7CiAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuOwogICAgICB9IG9ic2VydmVyLmNvbXBsZXRlKCk7CiAgICB9KTsKICB9Cn0pOwoKY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KCRPYnNlcnZhYmxlLnByb3RvdHlwZSwgT0JTRVJWQUJMRSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7CgokKHsgZ2xvYmFsOiB0cnVlIH0sIHsKICBPYnNlcnZhYmxlOiAkT2JzZXJ2YWJsZQp9KTsKCnNldFNwZWNpZXMoJ09ic2VydmFibGUnKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnByb21pc2UuYWxsLXNldHRsZWQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLmFsbC1zZXR0bGVkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YApfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2VzLnByb21pc2UuYWxsLXNldHRsZWQuanMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLmFueS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLmFueS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIpOwp2YXIgcGVyZm9ybSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wZXJmb3JtICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCnZhciBQUk9NSVNFX0FOWV9FUlJPUiA9ICdObyBvbmUgcHJvbWlzZSByZXNvbHZlZCc7CgovLyBgUHJvbWlzZS5hbnlgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLWFueQokKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUgfSwgewogIGFueTogZnVuY3Rpb24gYW55KGl0ZXJhYmxlKSB7CiAgICB2YXIgQyA9IHRoaXM7CiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYoQyk7CiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTsKICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDsKICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7CiAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgdmFyIGNvdW50ZXIgPSAwOwogICAgICB2YXIgcmVtYWluaW5nID0gMTsKICAgICAgdmFyIGFscmVhZHlSZXNvbHZlZCA9IGZhbHNlOwogICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkgewogICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKzsKICAgICAgICB2YXIgYWxyZWFkeVJlamVjdGVkID0gZmFsc2U7CiAgICAgICAgZXJyb3JzLnB1c2godW5kZWZpbmVkKTsKICAgICAgICByZW1haW5pbmcrKzsKICAgICAgICBwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICBpZiAoYWxyZWFkeVJlamVjdGVkIHx8IGFscmVhZHlSZXNvbHZlZCkgcmV0dXJuOwogICAgICAgICAgYWxyZWFkeVJlc29sdmVkID0gdHJ1ZTsKICAgICAgICAgIHJlc29sdmUodmFsdWUpOwogICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICBpZiAoYWxyZWFkeVJlamVjdGVkIHx8IGFscmVhZHlSZXNvbHZlZCkgcmV0dXJuOwogICAgICAgICAgYWxyZWFkeVJlamVjdGVkID0gdHJ1ZTsKICAgICAgICAgIGVycm9yc1tpbmRleF0gPSBlOwogICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVqZWN0KG5ldyAoZ2V0QnVpbHRJbignQWdncmVnYXRlRXJyb3InKSkoZXJyb3JzLCBQUk9NSVNFX0FOWV9FUlJPUikpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgICAgLS1yZW1haW5pbmcgfHwgcmVqZWN0KG5ldyAoZ2V0QnVpbHRJbignQWdncmVnYXRlRXJyb3InKSkoZXJyb3JzLCBQUk9NSVNFX0FOWV9FUlJPUikpOwogICAgfSk7CiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTsKICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnByb21pc2UudHJ5LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnByb21pc2UudHJ5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiKTsKdmFyIHBlcmZvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGVyZm9ybSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGVyZm9ybS5qcyIpOwoKLy8gYFByb21pc2UudHJ5YCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS10cnkKJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlIH0sIHsKICAndHJ5JzogZnVuY3Rpb24gKGNhbGxiYWNrZm4pIHsKICAgIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYodGhpcyk7CiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShjYWxsYmFja2ZuKTsKICAgIChyZXN1bHQuZXJyb3IgPyBwcm9taXNlQ2FwYWJpbGl0eS5yZWplY3QgOiBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlKShyZXN1bHQudmFsdWUpOwogICAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZGVmaW5lLW1ldGFkYXRhLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZGVmaW5lLW1ldGFkYXRhLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIFJlZmxlY3RNZXRhZGF0YU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwoKdmFyIHRvTWV0YWRhdGFLZXkgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUudG9LZXk7CnZhciBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnNldDsKCi8vIGBSZWZsZWN0LmRlZmluZU1ldGFkYXRhYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGEKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBkZWZpbmVNZXRhZGF0YTogZnVuY3Rpb24gZGVmaW5lTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykgewogICAgdmFyIHRhcmdldEtleSA9IGFyZ3VtZW50cy5sZW5ndGggPCA0ID8gdW5kZWZpbmVkIDogdG9NZXRhZGF0YUtleShhcmd1bWVudHNbM10pOwogICAgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgYW5PYmplY3QodGFyZ2V0KSwgdGFyZ2V0S2V5KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5kZWxldGUtbWV0YWRhdGEuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5kZWxldGUtbWV0YWRhdGEuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgUmVmbGVjdE1ldGFkYXRhTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7Cgp2YXIgdG9NZXRhZGF0YUtleSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS50b0tleTsKdmFyIGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUuZ2V0TWFwOwp2YXIgc3RvcmUgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUuc3RvcmU7CgovLyBgUmVmbGVjdC5kZWxldGVNZXRhZGF0YWAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yYnVja3Rvbi9yZWZsZWN0LW1ldGFkYXRhCiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7CiAgZGVsZXRlTWV0YWRhdGE6IGZ1bmN0aW9uIGRlbGV0ZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHsKICAgIHZhciB0YXJnZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YWRhdGFLZXkoYXJndW1lbnRzWzJdKTsKICAgIHZhciBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoYW5PYmplY3QodGFyZ2V0KSwgdGFyZ2V0S2V5LCBmYWxzZSk7CiAgICBpZiAobWV0YWRhdGFNYXAgPT09IHVuZGVmaW5lZCB8fCAhbWV0YWRhdGFNYXBbJ2RlbGV0ZSddKG1ldGFkYXRhS2V5KSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKG1ldGFkYXRhTWFwLnNpemUpIHJldHVybiB0cnVlOwogICAgdmFyIHRhcmdldE1ldGFkYXRhID0gc3RvcmUuZ2V0KHRhcmdldCk7CiAgICB0YXJnZXRNZXRhZGF0YVsnZGVsZXRlJ10odGFyZ2V0S2V5KTsKICAgIHJldHVybiAhIXRhcmdldE1ldGFkYXRhLnNpemUgfHwgc3RvcmVbJ2RlbGV0ZSddKHRhcmdldCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLWtleXMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1tZXRhZGF0YS1rZXlzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwovLyBUT0RPOiBpbiBjb3JlLWpzQDQsIG1vdmUgL21vZHVsZXMvIGRlcGVuZGVuY2llcyB0byBwdWJsaWMgZW50cmllcyBmb3IgYmV0dGVyIG9wdGltaXphdGlvbiBieSB0b29scyBsaWtlIGBwcmVzZXQtZW52YAp2YXIgU2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5zZXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zZXQuanMiKTsKdmFyIFJlZmxlY3RNZXRhZGF0YU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS5rZXlzOwp2YXIgdG9NZXRhZGF0YUtleSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS50b0tleTsKCnZhciBmcm9tID0gZnVuY3Rpb24gKGl0ZXIpIHsKICB2YXIgcmVzdWx0ID0gW107CiAgaXRlcmF0ZShpdGVyLCByZXN1bHQucHVzaCwgcmVzdWx0KTsKICByZXR1cm4gcmVzdWx0Owp9OwoKdmFyIG9yZGluYXJ5TWV0YWRhdGFLZXlzID0gZnVuY3Rpb24gKE8sIFApIHsKICB2YXIgb0tleXMgPSBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKTsKICB2YXIgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7CiAgaWYgKHBhcmVudCA9PT0gbnVsbCkgcmV0dXJuIG9LZXlzOwogIHZhciBwS2V5cyA9IG9yZGluYXJ5TWV0YWRhdGFLZXlzKHBhcmVudCwgUCk7CiAgcmV0dXJuIHBLZXlzLmxlbmd0aCA/IG9LZXlzLmxlbmd0aCA/IGZyb20obmV3IFNldChvS2V5cy5jb25jYXQocEtleXMpKSkgOiBwS2V5cyA6IG9LZXlzOwp9OwoKLy8gYFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGEKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBnZXRNZXRhZGF0YUtleXM6IGZ1bmN0aW9uIGdldE1ldGFkYXRhS2V5cyh0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHsKICAgIHZhciB0YXJnZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IHVuZGVmaW5lZCA6IHRvTWV0YWRhdGFLZXkoYXJndW1lbnRzWzFdKTsKICAgIHJldHVybiBvcmRpbmFyeU1ldGFkYXRhS2V5cyhhbk9iamVjdCh0YXJnZXQpLCB0YXJnZXRLZXkpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1tZXRhZGF0YS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1tZXRhZGF0YS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBSZWZsZWN0TWV0YWRhdGFNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVmbGVjdC1tZXRhZGF0YSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVmbGVjdC1tZXRhZGF0YS5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIpOwoKdmFyIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUuaGFzOwp2YXIgb3JkaW5hcnlHZXRPd25NZXRhZGF0YSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS5nZXQ7CnZhciB0b01ldGFkYXRhS2V5ID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnRvS2V5OwoKdmFyIG9yZGluYXJ5R2V0TWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHsKICB2YXIgaGFzT3duID0gb3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7CiAgaWYgKGhhc093bikgcmV0dXJuIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApOwogIHZhciBwYXJlbnQgPSBnZXRQcm90b3R5cGVPZihPKTsKICByZXR1cm4gcGFyZW50ICE9PSBudWxsID8gb3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKSA6IHVuZGVmaW5lZDsKfTsKCi8vIGBSZWZsZWN0LmdldE1ldGFkYXRhYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGEKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBnZXRNZXRhZGF0YTogZnVuY3Rpb24gZ2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykgewogICAgdmFyIHRhcmdldEtleSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhZGF0YUtleShhcmd1bWVudHNbMl0pOwogICAgcmV0dXJuIG9yZGluYXJ5R2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS1rZXlzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS1rZXlzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIFJlZmxlY3RNZXRhZGF0YU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwoKdmFyIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLmtleXM7CnZhciB0b01ldGFkYXRhS2V5ID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnRvS2V5OwoKLy8gYFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGEKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBnZXRPd25NZXRhZGF0YUtleXM6IGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhS2V5cyh0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHsKICAgIHZhciB0YXJnZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IHVuZGVmaW5lZCA6IHRvTWV0YWRhdGFLZXkoYXJndW1lbnRzWzFdKTsKICAgIHJldHVybiBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhhbk9iamVjdCh0YXJnZXQpLCB0YXJnZXRLZXkpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgUmVmbGVjdE1ldGFkYXRhTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7Cgp2YXIgb3JkaW5hcnlHZXRPd25NZXRhZGF0YSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS5nZXQ7CnZhciB0b01ldGFkYXRhS2V5ID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnRvS2V5OwoKLy8gYFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vcmJ1Y2t0b24vcmVmbGVjdC1tZXRhZGF0YQokKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwgewogIGdldE93bk1ldGFkYXRhOiBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7CiAgICB2YXIgdGFyZ2V0S2V5ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFkYXRhS2V5KGFyZ3VtZW50c1syXSk7CiAgICByZXR1cm4gb3JkaW5hcnlHZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgYW5PYmplY3QodGFyZ2V0KSwgdGFyZ2V0S2V5KTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5oYXMtbWV0YWRhdGEuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5oYXMtbWV0YWRhdGEuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgUmVmbGVjdE1ldGFkYXRhTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBnZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanMiKTsKCnZhciBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLmhhczsKdmFyIHRvTWV0YWRhdGFLZXkgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUudG9LZXk7Cgp2YXIgb3JkaW5hcnlIYXNNZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTywgUCkgewogIHZhciBoYXNPd24gPSBvcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTsKICBpZiAoaGFzT3duKSByZXR1cm4gdHJ1ZTsKICB2YXIgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7CiAgcmV0dXJuIHBhcmVudCAhPT0gbnVsbCA/IG9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIHBhcmVudCwgUCkgOiBmYWxzZTsKfTsKCi8vIGBSZWZsZWN0Lmhhc01ldGFkYXRhYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGEKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBoYXNNZXRhZGF0YTogZnVuY3Rpb24gaGFzTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykgewogICAgdmFyIHRhcmdldEtleSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhZGF0YUtleShhcmd1bWVudHNbMl0pOwogICAgcmV0dXJuIG9yZGluYXJ5SGFzTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuaGFzLW93bi1tZXRhZGF0YS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5oYXMtb3duLW1ldGFkYXRhLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBSZWZsZWN0TWV0YWRhdGFNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVmbGVjdC1tZXRhZGF0YSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVmbGVjdC1tZXRhZGF0YS5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKCnZhciBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLmhhczsKdmFyIHRvTWV0YWRhdGFLZXkgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUudG9LZXk7CgovLyBgUmVmbGVjdC5oYXNPd25NZXRhZGF0YWAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yYnVja3Rvbi9yZWZsZWN0LW1ldGFkYXRhCiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7CiAgaGFzT3duTWV0YWRhdGE6IGZ1bmN0aW9uIGhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHsKICAgIHZhciB0YXJnZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YWRhdGFLZXkoYXJndW1lbnRzWzJdKTsKICAgIHJldHVybiBvcmRpbmFyeUhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBhbk9iamVjdCh0YXJnZXQpLCB0YXJnZXRLZXkpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0Lm1ldGFkYXRhLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5tZXRhZGF0YS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIFJlZmxlY3RNZXRhZGF0YU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwoKdmFyIHRvTWV0YWRhdGFLZXkgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUudG9LZXk7CnZhciBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnNldDsKCi8vIGBSZWZsZWN0Lm1ldGFkYXRhYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGEKJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHsKICBtZXRhZGF0YTogZnVuY3Rpb24gbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiBkZWNvcmF0b3IodGFyZ2V0LCBrZXkpIHsKICAgICAgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgYW5PYmplY3QodGFyZ2V0KSwgdG9NZXRhZGF0YUtleShrZXkpKTsKICAgIH07CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5hZGQtYWxsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5hZGQtYWxsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgY29sbGVjdGlvbkFkZEFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb2xsZWN0aW9uLWFkZC1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tYWRkLWFsbC5qcyIpOwoKLy8gYFNldC5wcm90b3R5cGUuYWRkQWxsYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBhZGRBbGw6IGZ1bmN0aW9uIGFkZEFsbCgvKiAuLi5lbGVtZW50cyAqLykgewogICAgcmV0dXJuIGNvbGxlY3Rpb25BZGRBbGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmRlbGV0ZS1hbGwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmRlbGV0ZS1hbGwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBjb2xsZWN0aW9uRGVsZXRlQWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tZGVsZXRlLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1kZWxldGUtYWxsLmpzIik7CgovLyBgU2V0LnByb3RvdHlwZS5kZWxldGVBbGxgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHMKJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIGRlbGV0ZUFsbDogZnVuY3Rpb24gZGVsZXRlQWxsKC8qIC4uLmVsZW1lbnRzICovKSB7CiAgICByZXR1cm4gY29sbGVjdGlvbkRlbGV0ZUFsbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZGlmZmVyZW5jZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZGlmZmVyZW5jZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwoKLy8gYFNldC5wcm90b3R5cGUuZGlmZmVyZW5jZWAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzCiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBkaWZmZXJlbmNlOiBmdW5jdGlvbiBkaWZmZXJlbmNlKGl0ZXJhYmxlKSB7CiAgICB2YXIgc2V0ID0gYW5PYmplY3QodGhpcyk7CiAgICB2YXIgbmV3U2V0ID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3Ioc2V0LCBnZXRCdWlsdEluKCdTZXQnKSkpKHNldCk7CiAgICB2YXIgcmVtb3ZlciA9IGFGdW5jdGlvbihuZXdTZXRbJ2RlbGV0ZSddKTsKICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICByZW1vdmVyLmNhbGwobmV3U2V0LCB2YWx1ZSk7CiAgICB9KTsKICAgIHJldHVybiBuZXdTZXQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5ldmVyeS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmV2ZXJ5LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzIik7CnZhciBnZXRTZXRJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCi8vIGBTZXQucHJvdG90eXBlLmV2ZXJ5YCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBldmVyeTogZnVuY3Rpb24gZXZlcnkoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHsKICAgIHZhciBzZXQgPSBhbk9iamVjdCh0aGlzKTsKICAgIHZhciBpdGVyYXRvciA9IGdldFNldEl0ZXJhdG9yKHNldCk7CiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpOwogICAgcmV0dXJuICFpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgaWYgKCFib3VuZEZ1bmN0aW9uKHZhbHVlLCB2YWx1ZSwgc2V0KSkgcmV0dXJuIGl0ZXJhdGUuc3RvcCgpOwogICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSkuc3RvcHBlZDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmZpbHRlci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5maWx0ZXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiKTsKdmFyIGdldFNldEl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1zZXQtaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1zZXQtaXRlcmF0b3IuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwoKLy8gYFNldC5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIGl0ZXJhdG9yID0gZ2V0U2V0SXRlcmF0b3Ioc2V0KTsKICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7CiAgICB2YXIgbmV3U2V0ID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3Ioc2V0LCBnZXRCdWlsdEluKCdTZXQnKSkpKCk7CiAgICB2YXIgYWRkZXIgPSBhRnVuY3Rpb24obmV3U2V0LmFkZCk7CiAgICBpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgaWYgKGJvdW5kRnVuY3Rpb24odmFsdWUsIHZhbHVlLCBzZXQpKSBhZGRlci5jYWxsKG5ld1NldCwgdmFsdWUpOwogICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSk7CiAgICByZXR1cm4gbmV3U2V0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZmluZC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZmluZC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYmluZC1jb250ZXh0LmpzIik7CnZhciBnZXRTZXRJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCi8vIGBTZXQucHJvdG90eXBlLmZpbmRgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHMKJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIGZpbmQ6IGZ1bmN0aW9uIGZpbmQoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHsKICAgIHZhciBzZXQgPSBhbk9iamVjdCh0aGlzKTsKICAgIHZhciBpdGVyYXRvciA9IGdldFNldEl0ZXJhdG9yKHNldCk7CiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpOwogICAgcmV0dXJuIGl0ZXJhdGUoaXRlcmF0b3IsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICBpZiAoYm91bmRGdW5jdGlvbih2YWx1ZSwgdmFsdWUsIHNldCkpIHJldHVybiBpdGVyYXRlLnN0b3AodmFsdWUpOwogICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSkucmVzdWx0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZnJvbS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZnJvbS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBmcm9tID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tZnJvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1mcm9tLmpzIik7CgovLyBgU2V0LmZyb21gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1zZXQuZnJvbQokKHsgdGFyZ2V0OiAnU2V0Jywgc3RhdDogdHJ1ZSB9LCB7CiAgZnJvbTogZnJvbQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5pbnRlcnNlY3Rpb24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuaW50ZXJzZWN0aW9uLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCi8vIGBTZXQucHJvdG90eXBlLmludGVyc2VjdGlvbmAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzCiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBpbnRlcnNlY3Rpb246IGZ1bmN0aW9uIGludGVyc2VjdGlvbihpdGVyYWJsZSkgewogICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIG5ld1NldCA9IG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKHNldCwgZ2V0QnVpbHRJbignU2V0JykpKSgpOwogICAgdmFyIGhhc0NoZWNrID0gYUZ1bmN0aW9uKHNldC5oYXMpOwogICAgdmFyIGFkZGVyID0gYUZ1bmN0aW9uKG5ld1NldC5hZGQpOwogICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgIGlmIChoYXNDaGVjay5jYWxsKHNldCwgdmFsdWUpKSBhZGRlci5jYWxsKG5ld1NldCwgdmFsdWUpOwogICAgfSk7CiAgICByZXR1cm4gbmV3U2V0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuaXMtZGlzam9pbnQtZnJvbS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuaXMtZGlzam9pbnQtZnJvbS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgU2V0LnByb3RvdHlwZS5pc0Rpc2pvaW50RnJvbWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0LW1ldGhvZHMvI1NldC5wcm90b3R5cGUuaXNEaXNqb2ludEZyb20KJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIGlzRGlzam9pbnRGcm9tOiBmdW5jdGlvbiBpc0Rpc2pvaW50RnJvbShpdGVyYWJsZSkgewogICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIGhhc0NoZWNrID0gYUZ1bmN0aW9uKHNldC5oYXMpOwogICAgcmV0dXJuICFpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgaWYgKGhhc0NoZWNrLmNhbGwoc2V0LCB2YWx1ZSkgPT09IHRydWUpIHJldHVybiBpdGVyYXRlLnN0b3AoKTsKICAgIH0pLnN0b3BwZWQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5pcy1zdWJzZXQtb2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuaXMtc3Vic2V0LW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGdldEl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCi8vIGBTZXQucHJvdG90eXBlLmlzU3Vic2V0T2ZgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldC1tZXRob2RzLyNTZXQucHJvdG90eXBlLmlzU3Vic2V0T2YKJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIGlzU3Vic2V0T2Y6IGZ1bmN0aW9uIGlzU3Vic2V0T2YoaXRlcmFibGUpIHsKICAgIHZhciBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKHRoaXMpOwogICAgdmFyIG90aGVyU2V0ID0gYW5PYmplY3QoaXRlcmFibGUpOwogICAgdmFyIGhhc0NoZWNrID0gb3RoZXJTZXQuaGFzOwogICAgaWYgKHR5cGVvZiBoYXNDaGVjayAhPSAnZnVuY3Rpb24nKSB7CiAgICAgIG90aGVyU2V0ID0gbmV3IChnZXRCdWlsdEluKCdTZXQnKSkoaXRlcmFibGUpOwogICAgICBoYXNDaGVjayA9IGFGdW5jdGlvbihvdGhlclNldC5oYXMpOwogICAgfQogICAgcmV0dXJuICFpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgaWYgKGhhc0NoZWNrLmNhbGwob3RoZXJTZXQsIHZhbHVlKSA9PT0gZmFsc2UpIHJldHVybiBpdGVyYXRlLnN0b3AoKTsKICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHRydWUpLnN0b3BwZWQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5pcy1zdXBlcnNldC1vZi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmlzLXN1cGVyc2V0LW9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiKTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIik7CnZhciBhRnVuY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgU2V0LnByb3RvdHlwZS5pc1N1cGVyc2V0T2ZgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldC1tZXRob2RzLyNTZXQucHJvdG90eXBlLmlzU3VwZXJzZXRPZgokKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgaXNTdXBlcnNldE9mOiBmdW5jdGlvbiBpc1N1cGVyc2V0T2YoaXRlcmFibGUpIHsKICAgIHZhciBzZXQgPSBhbk9iamVjdCh0aGlzKTsKICAgIHZhciBoYXNDaGVjayA9IGFGdW5jdGlvbihzZXQuaGFzKTsKICAgIHJldHVybiAhaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgIGlmIChoYXNDaGVjay5jYWxsKHNldCwgdmFsdWUpID09PSBmYWxzZSkgcmV0dXJuIGl0ZXJhdGUuc3RvcCgpOwogICAgfSkuc3RvcHBlZDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmpvaW4uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmpvaW4uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgZ2V0U2V0SXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LXNldC1pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LXNldC1pdGVyYXRvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgU2V0LnByb3RvdHlwZS5qb2luYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICBqb2luOiBmdW5jdGlvbiBqb2luKHNlcGFyYXRvcikgewogICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIGl0ZXJhdG9yID0gZ2V0U2V0SXRlcmF0b3Ioc2V0KTsKICAgIHZhciBzZXAgPSBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCA/ICcsJyA6IFN0cmluZyhzZXBhcmF0b3IpOwogICAgdmFyIHJlc3VsdCA9IFtdOwogICAgaXRlcmF0ZShpdGVyYXRvciwgcmVzdWx0LnB1c2gsIHJlc3VsdCwgZmFsc2UsIHRydWUpOwogICAgcmV0dXJuIHJlc3VsdC5qb2luKHNlcCk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5tYXAuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQubWFwLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiKTsKdmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIik7CnZhciBnZXRTZXRJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCi8vIGBTZXQucHJvdG90eXBlLm1hcGAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgbWFwOiBmdW5jdGlvbiBtYXAoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHsKICAgIHZhciBzZXQgPSBhbk9iamVjdCh0aGlzKTsKICAgIHZhciBpdGVyYXRvciA9IGdldFNldEl0ZXJhdG9yKHNldCk7CiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpOwogICAgdmFyIG5ld1NldCA9IG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKHNldCwgZ2V0QnVpbHRJbignU2V0JykpKSgpOwogICAgdmFyIGFkZGVyID0gYUZ1bmN0aW9uKG5ld1NldC5hZGQpOwogICAgaXRlcmF0ZShpdGVyYXRvciwgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgIGFkZGVyLmNhbGwobmV3U2V0LCBib3VuZEZ1bmN0aW9uKHZhbHVlLCB2YWx1ZSwgc2V0KSk7CiAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB0cnVlKTsKICAgIHJldHVybiBuZXdTZXQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5vZi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0Lm9mLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb2xsZWN0aW9uLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLW9mLmpzIik7CgovLyBgU2V0Lm9mYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtc2V0Lm9mCiQoeyB0YXJnZXQ6ICdTZXQnLCBzdGF0OiB0cnVlIH0sIHsKICBvZjogb2YKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQucmVkdWNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LnJlZHVjZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBnZXRTZXRJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCi8vIGBTZXQucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykgewogICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIGl0ZXJhdG9yID0gZ2V0U2V0SXRlcmF0b3Ioc2V0KTsKICAgIHZhciBub0luaXRpYWwgPSBhcmd1bWVudHMubGVuZ3RoIDwgMjsKICAgIHZhciBhY2N1bXVsYXRvciA9IG5vSW5pdGlhbCA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1sxXTsKICAgIGFGdW5jdGlvbihjYWxsYmFja2ZuKTsKICAgIGl0ZXJhdGUoaXRlcmF0b3IsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICBpZiAobm9Jbml0aWFsKSB7CiAgICAgICAgbm9Jbml0aWFsID0gZmFsc2U7CiAgICAgICAgYWNjdW11bGF0b3IgPSB2YWx1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhY2N1bXVsYXRvciA9IGNhbGxiYWNrZm4oYWNjdW11bGF0b3IsIHZhbHVlLCB2YWx1ZSwgc2V0KTsKICAgICAgfQogICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSk7CiAgICBpZiAobm9Jbml0aWFsKSB0aHJvdyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBzZXQgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7CiAgICByZXR1cm4gYWNjdW11bGF0b3I7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5zb21lLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5zb21lLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiKTsKdmFyIGdldFNldEl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1zZXQtaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1zZXQtaXRlcmF0b3IuanMiKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIpOwoKLy8gYFNldC5wcm90b3R5cGUuc29tZWAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykgewogICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIGl0ZXJhdG9yID0gZ2V0U2V0SXRlcmF0b3Ioc2V0KTsKICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7CiAgICByZXR1cm4gaXRlcmF0ZShpdGVyYXRvciwgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgIGlmIChib3VuZEZ1bmN0aW9uKHZhbHVlLCB2YWx1ZSwgc2V0KSkgcmV0dXJuIGl0ZXJhdGUuc3RvcCgpOwogICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSkuc3RvcHBlZDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LnN5bW1ldHJpYy1kaWZmZXJlbmNlLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuc3ltbWV0cmljLWRpZmZlcmVuY2UuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiKTsKdmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWZ1bmN0aW9uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIik7CnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIik7CgovLyBgU2V0LnByb3RvdHlwZS5zeW1tZXRyaWNEaWZmZXJlbmNlYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHMKJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIHN5bW1ldHJpY0RpZmZlcmVuY2U6IGZ1bmN0aW9uIHN5bW1ldHJpY0RpZmZlcmVuY2UoaXRlcmFibGUpIHsKICAgIHZhciBzZXQgPSBhbk9iamVjdCh0aGlzKTsKICAgIHZhciBuZXdTZXQgPSBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihzZXQsIGdldEJ1aWx0SW4oJ1NldCcpKSkoc2V0KTsKICAgIHZhciByZW1vdmVyID0gYUZ1bmN0aW9uKG5ld1NldFsnZGVsZXRlJ10pOwogICAgdmFyIGFkZGVyID0gYUZ1bmN0aW9uKG5ld1NldC5hZGQpOwogICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgIHJlbW92ZXIuY2FsbChuZXdTZXQsIHZhbHVlKSB8fCBhZGRlci5jYWxsKG5ld1NldCwgdmFsdWUpOwogICAgfSk7CiAgICByZXR1cm4gbmV3U2V0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQudW5pb24uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC51bmlvbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgYUZ1bmN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiKTsKdmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIik7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiKTsKCi8vIGBTZXQucHJvdG90eXBlLnVuaW9uYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHMKJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIHVuaW9uOiBmdW5jdGlvbiB1bmlvbihpdGVyYWJsZSkgewogICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpOwogICAgdmFyIG5ld1NldCA9IG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKHNldCwgZ2V0QnVpbHRJbignU2V0JykpKShzZXQpOwogICAgaXRlcmF0ZShpdGVyYWJsZSwgYUZ1bmN0aW9uKG5ld1NldC5hZGQpLCBuZXdTZXQpOwogICAgcmV0dXJuIG5ld1NldDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3RyaW5nLmF0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zdHJpbmcuYXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGNoYXJBdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlLmpzIikuY2hhckF0OwoKLy8gYFN0cmluZy5wcm90b3R5cGUuYXRgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLmF0CiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSB9LCB7CiAgYXQ6IGZ1bmN0aW9uIGF0KHBvcykgewogICAgcmV0dXJuIGNoYXJBdCh0aGlzLCBwb3MpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zdHJpbmcuY29kZS1wb2ludHMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN0cmluZy5jb2RlLXBvaW50cy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3Rvci5qcyIpOwp2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIpOwp2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiKTsKdmFyIFN0cmluZ011bHRpYnl0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlLmpzIik7Cgp2YXIgY29kZUF0ID0gU3RyaW5nTXVsdGlieXRlTW9kdWxlLmNvZGVBdDsKdmFyIGNoYXJBdCA9IFN0cmluZ011bHRpYnl0ZU1vZHVsZS5jaGFyQXQ7CnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJzsKdmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTVFJJTkdfSVRFUkFUT1IpOwoKLy8gVE9ETzogdW5pZnkgd2l0aCBTdHJpbmcjQEBpdGVyYXRvcgp2YXIgJFN0cmluZ0l0ZXJhdG9yID0gY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihmdW5jdGlvbiBTdHJpbmdJdGVyYXRvcihzdHJpbmcpIHsKICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsKICAgIHR5cGU6IFNUUklOR19JVEVSQVRPUiwKICAgIHN0cmluZzogc3RyaW5nLAogICAgaW5kZXg6IDAKICB9KTsKfSwgJ1N0cmluZycsIGZ1bmN0aW9uIG5leHQoKSB7CiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTsKICB2YXIgc3RyaW5nID0gc3RhdGUuc3RyaW5nOwogIHZhciBpbmRleCA9IHN0YXRlLmluZGV4OwogIHZhciBwb2ludDsKICBpZiAoaW5kZXggPj0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9OwogIHBvaW50ID0gY2hhckF0KHN0cmluZywgaW5kZXgpOwogIHN0YXRlLmluZGV4ICs9IHBvaW50Lmxlbmd0aDsKICByZXR1cm4geyB2YWx1ZTogeyBjb2RlUG9pbnQ6IGNvZGVBdChwb2ludCwgMCksIHBvc2l0aW9uOiBpbmRleCB9LCBkb25lOiBmYWxzZSB9Owp9KTsKCi8vIGBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludHNgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcHJvdG90eXBlLWNvZGVwb2ludHMKJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlIH0sIHsKICBjb2RlUG9pbnRzOiBmdW5jdGlvbiBjb2RlUG9pbnRzKCkgewogICAgcmV0dXJuIG5ldyAkU3RyaW5nSXRlcmF0b3IoU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpKTsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3RyaW5nLm1hdGNoLWFsbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN0cmluZy5tYXRjaC1hbGwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZXMuc3RyaW5nLm1hdGNoLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC1hbGwuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN0cmluZy5yZXBsYWNlLWFsbC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3RyaW5nLnJlcGxhY2UtYWxsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIik7CnZhciBpc1JlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1yZWdleHAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qcyIpOwp2YXIgZ2V0UmVnRXhwRmxhZ3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZmxhZ3MuanMiKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwoKdmFyIFJFUExBQ0UgPSB3ZWxsS25vd25TeW1ib2woJ3JlcGxhY2UnKTsKdmFyIFJlZ0V4cFByb3RvdHlwZSA9IFJlZ0V4cC5wcm90b3R5cGU7CgovLyBgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLXJlcGxhY2UtYWxsCiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSB9LCB7CiAgcmVwbGFjZUFsbDogZnVuY3Rpb24gcmVwbGFjZUFsbChzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSB7CiAgICB2YXIgTyA9IHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7CiAgICB2YXIgSVNfUkVHX0VYUCwgZmxhZ3MsIHJlcGxhY2VyLCBzdHJpbmcsIHNlYXJjaFN0cmluZywgdGVtcGxhdGUsIHJlc3VsdCwgcG9zaXRpb24sIGluZGV4OwogICAgaWYgKHNlYXJjaFZhbHVlICE9IG51bGwpIHsKICAgICAgSVNfUkVHX0VYUCA9IGlzUmVnRXhwKHNlYXJjaFZhbHVlKTsKICAgICAgaWYgKElTX1JFR19FWFApIHsKICAgICAgICBmbGFncyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCdmbGFncycgaW4gUmVnRXhwUHJvdG90eXBlCiAgICAgICAgICA/IHNlYXJjaFZhbHVlLmZsYWdzCiAgICAgICAgICA6IGdldFJlZ0V4cEZsYWdzLmNhbGwoc2VhcmNoVmFsdWUpCiAgICAgICAgKSk7CiAgICAgICAgaWYgKCF+ZmxhZ3MuaW5kZXhPZignZycpKSB0aHJvdyBUeXBlRXJyb3IoJ2AucmVwbGFjZUFsbGAgZG9lcyBub3QgYWxsb3cgbm9uLWdsb2JhbCByZWdleGVzJyk7CiAgICAgIH0KICAgICAgcmVwbGFjZXIgPSBzZWFyY2hWYWx1ZVtSRVBMQUNFXTsKICAgICAgaWYgKHJlcGxhY2VyICE9PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm4gcmVwbGFjZXIuY2FsbChzZWFyY2hWYWx1ZSwgTywgcmVwbGFjZVZhbHVlKTsKICAgICAgfSBlbHNlIGlmIChJU19QVVJFICYmIElTX1JFR19FWFApIHsKICAgICAgICByZXR1cm4gU3RyaW5nKE8pLnJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIHN0cmluZyA9IFN0cmluZyhPKTsKICAgIHNlYXJjaFN0cmluZyA9IFN0cmluZyhzZWFyY2hWYWx1ZSk7CiAgICBpZiAoc2VhcmNoU3RyaW5nID09PSAnJykgcmV0dXJuIHJlcGxhY2VBbGwuY2FsbChzdHJpbmcsIC8oPzopL2csIHJlcGxhY2VWYWx1ZSk7CiAgICB0ZW1wbGF0ZSA9IHN0cmluZy5zcGxpdChzZWFyY2hTdHJpbmcpOwogICAgaWYgKHR5cGVvZiByZXBsYWNlVmFsdWUgIT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIHRlbXBsYXRlLmpvaW4oU3RyaW5nKHJlcGxhY2VWYWx1ZSkpOwogICAgfQogICAgcmVzdWx0ID0gdGVtcGxhdGVbMF07CiAgICBwb3NpdGlvbiA9IHJlc3VsdC5sZW5ndGg7CiAgICBmb3IgKGluZGV4ID0gMTsgaW5kZXggPCB0ZW1wbGF0ZS5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgcmVzdWx0ICs9IFN0cmluZyhyZXBsYWNlVmFsdWUoc2VhcmNoU3RyaW5nLCBwb3NpdGlvbiwgc3RyaW5nKSk7CiAgICAgIHBvc2l0aW9uICs9IHNlYXJjaFN0cmluZy5sZW5ndGggKyB0ZW1wbGF0ZVtpbmRleF0ubGVuZ3RoOwogICAgICByZXN1bHQgKz0gdGVtcGxhdGVbaW5kZXhdOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3ltYm9sLmFzeW5jLWRpc3Bvc2UuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3ltYm9sLmFzeW5jLWRpc3Bvc2UuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLmFzeW5jRGlzcG9zZWAgd2VsbC1rbm93biBzeW1ib2wKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtdXNpbmctc3RhdGVtZW50CmRlZmluZVdlbGxLbm93blN5bWJvbCgnYXN5bmNEaXNwb3NlJyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuZGlzcG9zZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuZGlzcG9zZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCi8vIGBTeW1ib2wuZGlzcG9zZWAgd2VsbC1rbm93biBzeW1ib2wKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtdXNpbmctc3RhdGVtZW50CmRlZmluZVdlbGxLbm93blN5bWJvbCgnZGlzcG9zZScpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3ltYm9sLm9ic2VydmFibGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3ltYm9sLm9ic2VydmFibGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgovLyBgU3ltYm9sLm9ic2VydmFibGVgIHdlbGwta25vd24gc3ltYm9sCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9ic2VydmFibGUKZGVmaW5lV2VsbEtub3duU3ltYm9sKCdvYnNlcnZhYmxlJyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zeW1ib2wucGF0dGVybi1tYXRjaC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zeW1ib2wucGF0dGVybi1tYXRjaC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiKTsKCi8vIGBTeW1ib2wucGF0dGVybk1hdGNoYCB3ZWxsLWtub3duIHN5bWJvbAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wYXR0ZXJuLW1hdGNoaW5nCmRlZmluZVdlbGxLbm93blN5bWJvbCgncGF0dGVybk1hdGNoJyk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zeW1ib2wucmVwbGFjZS1hbGwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5yZXBsYWNlLWFsbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyBUT0RPOiByZW1vdmUgZnJvbSBgY29yZS1qc0A0YAp2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sLmpzIik7CgpkZWZpbmVXZWxsS25vd25TeW1ib2woJ3JlcGxhY2VBbGwnKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LndlYWstbWFwLmRlbGV0ZS1hbGwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC5kZWxldGUtYWxsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciBjb2xsZWN0aW9uRGVsZXRlQWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tZGVsZXRlLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1kZWxldGUtYWxsLmpzIik7CgovLyBgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlQWxsYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzCiQoeyB0YXJnZXQ6ICdXZWFrTWFwJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgZGVsZXRlQWxsOiBmdW5jdGlvbiBkZWxldGVBbGwoLyogLi4uZWxlbWVudHMgKi8pIHsKICAgIHJldHVybiBjb2xsZWN0aW9uRGVsZXRlQWxsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LndlYWstbWFwLmZyb20uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC5mcm9tLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZnJvbSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb2xsZWN0aW9uLWZyb20gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tZnJvbS5qcyIpOwoKLy8gYFdlYWtNYXAuZnJvbWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXdlYWttYXAuZnJvbQokKHsgdGFyZ2V0OiAnV2Vha01hcCcsIHN0YXQ6IHRydWUgfSwgewogIGZyb206IGZyb20KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC5vZi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC5vZi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb2xsZWN0aW9uLW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLW9mLmpzIik7CgovLyBgV2Vha01hcC5vZmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXdlYWttYXAub2YKJCh7IHRhcmdldDogJ1dlYWtNYXAnLCBzdGF0OiB0cnVlIH0sIHsKICBvZjogb2YKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC51cHNlcnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LndlYWstbWFwLnVwc2VydC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzIik7CnZhciAkdXBzZXJ0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21hcC11cHNlcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hcC11cHNlcnQuanMiKTsKCi8vIGBXZWFrTWFwLnByb3RvdHlwZS51cHNlcnRgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGh1bWJzdXBlcC9wcm9wb3NhbC11cHNlcnQKJCh7IHRhcmdldDogJ1dlYWtNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHsKICB1cHNlcnQ6ICR1cHNlcnQKfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLXNldC5hZGQtYWxsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1zZXQuYWRkLWFsbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgY29sbGVjdGlvbkFkZEFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb2xsZWN0aW9uLWFkZC1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tYWRkLWFsbC5qcyIpOwoKLy8gYFdlYWtTZXQucHJvdG90eXBlLmFkZEFsbGAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnV2Vha1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIGFkZEFsbDogZnVuY3Rpb24gYWRkQWxsKC8qIC4uLmVsZW1lbnRzICovKSB7CiAgICByZXR1cm4gY29sbGVjdGlvbkFkZEFsbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLXNldC5kZWxldGUtYWxsLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1zZXQuZGVsZXRlLWFsbC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIpOwp2YXIgY29sbGVjdGlvbkRlbGV0ZUFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb2xsZWN0aW9uLWRlbGV0ZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tZGVsZXRlLWFsbC5qcyIpOwoKLy8gYFdlYWtTZXQucHJvdG90eXBlLmRlbGV0ZUFsbGAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kcwokKHsgdGFyZ2V0OiAnV2Vha1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIGRlbGV0ZUFsbDogZnVuY3Rpb24gZGVsZXRlQWxsKC8qIC4uLmVsZW1lbnRzICovKSB7CiAgICByZXR1cm4gY29sbGVjdGlvbkRlbGV0ZUFsbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLXNldC5mcm9tLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1zZXQuZnJvbS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGZyb20gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1mcm9tICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLWZyb20uanMiKTsKCi8vIGBXZWFrU2V0LmZyb21gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy13ZWFrc2V0LmZyb20KJCh7IHRhcmdldDogJ1dlYWtTZXQnLCBzdGF0OiB0cnVlIH0sIHsKICBmcm9tOiBmcm9tCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1zZXQub2YuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1zZXQub2YuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1vZi5qcyIpOwoKLy8gYFdlYWtTZXQub2ZgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy13ZWFrc2V0Lm9mCiQoeyB0YXJnZXQ6ICdXZWFrU2V0Jywgc3RhdDogdHJ1ZSB9LCB7CiAgb2Y6IG9mCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgRE9NSXRlcmFibGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanMiKTsKdmFyIGZvckVhY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktZm9yLWVhY2ggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZvci1lYWNoLmpzIik7CnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanMiKTsKCmZvciAodmFyIENPTExFQ1RJT05fTkFNRSBpbiBET01JdGVyYWJsZXMpIHsKICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtDT0xMRUNUSU9OX05BTUVdOwogIHZhciBDb2xsZWN0aW9uUHJvdG90eXBlID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTsKICAvLyBzb21lIENocm9tZSB2ZXJzaW9ucyBoYXZlIG5vbi1jb25maWd1cmFibGUgbWV0aG9kcyBvbiBET01Ub2tlbkxpc3QKICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZSAmJiBDb2xsZWN0aW9uUHJvdG90eXBlLmZvckVhY2ggIT09IGZvckVhY2gpIHRyeSB7CiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgJ2ZvckVhY2gnLCBmb3JFYWNoKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgQ29sbGVjdGlvblByb3RvdHlwZS5mb3JFYWNoID0gZm9yRWFjaDsKICB9Cn0KCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvci5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIERPTUl0ZXJhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kb20taXRlcmFibGVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20taXRlcmFibGVzLmpzIik7CnZhciBBcnJheUl0ZXJhdG9yTWV0aG9kcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyIpOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIik7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIik7Cgp2YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7CnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpOwp2YXIgQXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9yTWV0aG9kcy52YWx1ZXM7Cgpmb3IgKHZhciBDT0xMRUNUSU9OX05BTUUgaW4gRE9NSXRlcmFibGVzKSB7CiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbQ09MTEVDVElPTl9OQU1FXTsKICB2YXIgQ29sbGVjdGlvblByb3RvdHlwZSA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7CiAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGUpIHsKICAgIC8vIHNvbWUgQ2hyb21lIHZlcnNpb25zIGhhdmUgbm9uLWNvbmZpZ3VyYWJsZSBtZXRob2RzIG9uIERPTVRva2VuTGlzdAogICAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdICE9PSBBcnJheVZhbHVlcykgdHJ5IHsKICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIElURVJBVE9SLCBBcnJheVZhbHVlcyk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBDb2xsZWN0aW9uUHJvdG90eXBlW0lURVJBVE9SXSA9IEFycmF5VmFsdWVzOwogICAgfQogICAgaWYgKCFDb2xsZWN0aW9uUHJvdG90eXBlW1RPX1NUUklOR19UQUddKSB7CiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCBDT0xMRUNUSU9OX05BTUUpOwogICAgfQogICAgaWYgKERPTUl0ZXJhYmxlc1tDT0xMRUNUSU9OX05BTUVdKSBmb3IgKHZhciBNRVRIT0RfTkFNRSBpbiBBcnJheUl0ZXJhdG9yTWV0aG9kcykgewogICAgICAvLyBzb21lIENocm9tZSB2ZXJzaW9ucyBoYXZlIG5vbi1jb25maWd1cmFibGUgbWV0aG9kcyBvbiBET01Ub2tlbkxpc3QKICAgICAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdICE9PSBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV0pIHRyeSB7CiAgICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KENvbGxlY3Rpb25Qcm90b3R5cGUsIE1FVEhPRF9OQU1FLCBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV0pOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdID0gQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdOwogICAgICB9CiAgICB9CiAgfQp9CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5pbW1lZGlhdGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmltbWVkaWF0ZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7Cgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7CnZhciB0YXNrID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Rhc2sgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Rhc2suanMiKTsKCnZhciBGT1JDRUQgPSAhZ2xvYmFsLnNldEltbWVkaWF0ZSB8fCAhZ2xvYmFsLmNsZWFySW1tZWRpYXRlOwoKLy8gaHR0cDovL3czYy5naXRodWIuaW8vc2V0SW1tZWRpYXRlLwokKHsgZ2xvYmFsOiB0cnVlLCBiaW5kOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7CiAgLy8gYHNldEltbWVkaWF0ZWAgbWV0aG9kCiAgLy8gaHR0cDovL3czYy5naXRodWIuaW8vc2V0SW1tZWRpYXRlLyNzaS1zZXRJbW1lZGlhdGUKICBzZXRJbW1lZGlhdGU6IHRhc2suc2V0LAogIC8vIGBjbGVhckltbWVkaWF0ZWAgbWV0aG9kCiAgLy8gaHR0cDovL3czYy5naXRodWIuaW8vc2V0SW1tZWRpYXRlLyNzaS1jbGVhckltbWVkaWF0ZQogIGNsZWFySW1tZWRpYXRlOiB0YXNrLmNsZWFyCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIucXVldWUtbWljcm90YXNrLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5xdWV1ZS1taWNyb3Rhc2suanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKdmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIpOwp2YXIgbWljcm90YXNrID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL21pY3JvdGFzayAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzIik7CnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcyIpOwoKdmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzczsKdmFyIGlzTm9kZSA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnOwoKLy8gYHF1ZXVlTWljcm90YXNrYCBtZXRob2QKLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvdGltZXJzLWFuZC11c2VyLXByb21wdHMuaHRtbCNkb20tcXVldWVtaWNyb3Rhc2sKJCh7IGdsb2JhbDogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgbm9UYXJnZXRHZXQ6IHRydWUgfSwgewogIHF1ZXVlTWljcm90YXNrOiBmdW5jdGlvbiBxdWV1ZU1pY3JvdGFzayhmbikgewogICAgdmFyIGRvbWFpbiA9IGlzTm9kZSAmJiBwcm9jZXNzLmRvbWFpbjsKICAgIG1pY3JvdGFzayhkb21haW4gPyBkb21haW4uYmluZChmbikgOiBmbik7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnRpbWVycy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudGltZXJzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIik7CnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIHVzZXJBZ2VudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91c2VyLWFnZW50ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91c2VyLWFnZW50LmpzIik7Cgp2YXIgc2xpY2UgPSBbXS5zbGljZTsKdmFyIE1TSUUgPSAvTVNJRSAuXC4vLnRlc3QodXNlckFnZW50KTsgLy8gPC0gZGlydHkgaWU5LSBjaGVjawoKdmFyIHdyYXAgPSBmdW5jdGlvbiAoc2NoZWR1bGVyKSB7CiAgcmV0dXJuIGZ1bmN0aW9uIChoYW5kbGVyLCB0aW1lb3V0IC8qICwgLi4uYXJndW1lbnRzICovKSB7CiAgICB2YXIgYm91bmRBcmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7CiAgICB2YXIgYXJncyA9IGJvdW5kQXJncyA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSA6IHVuZGVmaW5lZDsKICAgIHJldHVybiBzY2hlZHVsZXIoYm91bmRBcmdzID8gZnVuY3Rpb24gKCkgewogICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmMKICAgICAgKHR5cGVvZiBoYW5kbGVyID09ICdmdW5jdGlvbicgPyBoYW5kbGVyIDogRnVuY3Rpb24oaGFuZGxlcikpLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgfSA6IGhhbmRsZXIsIHRpbWVvdXQpOwogIH07Cn07CgovLyBpZTktIHNldFRpbWVvdXQgJiBzZXRJbnRlcnZhbCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZml4Ci8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3RpbWVycy1hbmQtdXNlci1wcm9tcHRzLmh0bWwjdGltZXJzCiQoeyBnbG9iYWw6IHRydWUsIGJpbmQ6IHRydWUsIGZvcmNlZDogTVNJRSB9LCB7CiAgLy8gYHNldFRpbWVvdXRgIG1ldGhvZAogIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3RpbWVycy1hbmQtdXNlci1wcm9tcHRzLmh0bWwjZG9tLXNldHRpbWVvdXQKICBzZXRUaW1lb3V0OiB3cmFwKGdsb2JhbC5zZXRUaW1lb3V0KSwKICAvLyBgc2V0SW50ZXJ2YWxgIG1ldGhvZAogIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3RpbWVycy1hbmQtdXNlci1wcm9tcHRzLmh0bWwjZG9tLXNldGludGVydmFsCiAgc2V0SW50ZXJ2YWw6IHdyYXAoZ2xvYmFsLnNldEludGVydmFsKQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8vIFRPRE86IGluIGNvcmUtanNANCwgbW92ZSAvbW9kdWxlcy8gZGVwZW5kZW5jaWVzIHRvIHB1YmxpYyBlbnRyaWVzIGZvciBiZXR0ZXIgb3B0aW1pemF0aW9uIGJ5IHRvb2xzIGxpa2UgYHByZXNldC1lbnZgCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyIpOwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIpOwp2YXIgVVNFX05BVElWRV9VUkwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmF0aXZlLXVybCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXVybC5qcyIpOwp2YXIgcmVkZWZpbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVkZWZpbmUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIik7CnZhciByZWRlZmluZUFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWRlZmluZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLWFsbC5qcyIpOwp2YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIik7CnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3RvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yLmpzIik7CnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIpOwp2YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiKTsKdmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9iaW5kLWNvbnRleHQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIpOwp2YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzIik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIpOwp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiKTsKdmFyIGNyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzIik7CnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIik7CnZhciBnZXRJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci5qcyIpOwp2YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIpOwoKdmFyICRmZXRjaCA9IGdldEJ1aWx0SW4oJ2ZldGNoJyk7CnZhciBIZWFkZXJzID0gZ2V0QnVpbHRJbignSGVhZGVycycpOwp2YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7CnZhciBVUkxfU0VBUkNIX1BBUkFNUyA9ICdVUkxTZWFyY2hQYXJhbXMnOwp2YXIgVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IgPSBVUkxfU0VBUkNIX1BBUkFNUyArICdJdGVyYXRvcic7CnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7CnZhciBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoVVJMX1NFQVJDSF9QQVJBTVMpOwp2YXIgZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IpOwoKdmFyIHBsdXMgPSAvXCsvZzsKdmFyIHNlcXVlbmNlcyA9IEFycmF5KDQpOwoKdmFyIHBlcmNlbnRTZXF1ZW5jZSA9IGZ1bmN0aW9uIChieXRlcykgewogIHJldHVybiBzZXF1ZW5jZXNbYnl0ZXMgLSAxXSB8fCAoc2VxdWVuY2VzW2J5dGVzIC0gMV0gPSBSZWdFeHAoJygoPzolW1xcZGEtZl17Mn0peycgKyBieXRlcyArICd9KScsICdnaScpKTsKfTsKCnZhciBwZXJjZW50RGVjb2RlID0gZnVuY3Rpb24gKHNlcXVlbmNlKSB7CiAgdHJ5IHsKICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc2VxdWVuY2UpOwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICByZXR1cm4gc2VxdWVuY2U7CiAgfQp9OwoKdmFyIGRlc2VyaWFsaXplID0gZnVuY3Rpb24gKGl0KSB7CiAgdmFyIHJlc3VsdCA9IGl0LnJlcGxhY2UocGx1cywgJyAnKTsKICB2YXIgYnl0ZXMgPSA0OwogIHRyeSB7CiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdCk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIHdoaWxlIChieXRlcykgewogICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShwZXJjZW50U2VxdWVuY2UoYnl0ZXMtLSksIHBlcmNlbnREZWNvZGUpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn07Cgp2YXIgZmluZCA9IC9bIScoKX5dfCUyMC9nOwoKdmFyIHJlcGxhY2UgPSB7CiAgJyEnOiAnJTIxJywKICAiJyI6ICclMjcnLAogICcoJzogJyUyOCcsCiAgJyknOiAnJTI5JywKICAnfic6ICclN0UnLAogICclMjAnOiAnKycKfTsKCnZhciByZXBsYWNlciA9IGZ1bmN0aW9uIChtYXRjaCkgewogIHJldHVybiByZXBsYWNlW21hdGNoXTsKfTsKCnZhciBzZXJpYWxpemUgPSBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGl0KS5yZXBsYWNlKGZpbmQsIHJlcGxhY2VyKTsKfTsKCnZhciBwYXJzZVNlYXJjaFBhcmFtcyA9IGZ1bmN0aW9uIChyZXN1bHQsIHF1ZXJ5KSB7CiAgaWYgKHF1ZXJ5KSB7CiAgICB2YXIgYXR0cmlidXRlcyA9IHF1ZXJ5LnNwbGl0KCcmJyk7CiAgICB2YXIgaW5kZXggPSAwOwogICAgdmFyIGF0dHJpYnV0ZSwgZW50cnk7CiAgICB3aGlsZSAoaW5kZXggPCBhdHRyaWJ1dGVzLmxlbmd0aCkgewogICAgICBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2luZGV4KytdOwogICAgICBpZiAoYXR0cmlidXRlLmxlbmd0aCkgewogICAgICAgIGVudHJ5ID0gYXR0cmlidXRlLnNwbGl0KCc9Jyk7CiAgICAgICAgcmVzdWx0LnB1c2goewogICAgICAgICAga2V5OiBkZXNlcmlhbGl6ZShlbnRyeS5zaGlmdCgpKSwKICAgICAgICAgIHZhbHVlOiBkZXNlcmlhbGl6ZShlbnRyeS5qb2luKCc9JykpCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICB9Cn07Cgp2YXIgdXBkYXRlU2VhcmNoUGFyYW1zID0gZnVuY3Rpb24gKHF1ZXJ5KSB7CiAgdGhpcy5lbnRyaWVzLmxlbmd0aCA9IDA7CiAgcGFyc2VTZWFyY2hQYXJhbXModGhpcy5lbnRyaWVzLCBxdWVyeSk7Cn07Cgp2YXIgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGggPSBmdW5jdGlvbiAocGFzc2VkLCByZXF1aXJlZCkgewogIGlmIChwYXNzZWQgPCByZXF1aXJlZCkgdGhyb3cgVHlwZUVycm9yKCdOb3QgZW5vdWdoIGFyZ3VtZW50cycpOwp9OwoKdmFyIFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yID0gY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihmdW5jdGlvbiBJdGVyYXRvcihwYXJhbXMsIGtpbmQpIHsKICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsKICAgIHR5cGU6IFVSTF9TRUFSQ0hfUEFSQU1TX0lURVJBVE9SLAogICAgaXRlcmF0b3I6IGdldEl0ZXJhdG9yKGdldEludGVybmFsUGFyYW1zU3RhdGUocGFyYW1zKS5lbnRyaWVzKSwKICAgIGtpbmQ6IGtpbmQKICB9KTsKfSwgJ0l0ZXJhdG9yJywgZnVuY3Rpb24gbmV4dCgpIHsKICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUodGhpcyk7CiAgdmFyIGtpbmQgPSBzdGF0ZS5raW5kOwogIHZhciBzdGVwID0gc3RhdGUuaXRlcmF0b3IubmV4dCgpOwogIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7CiAgaWYgKCFzdGVwLmRvbmUpIHsKICAgIHN0ZXAudmFsdWUgPSBraW5kID09PSAna2V5cycgPyBlbnRyeS5rZXkgOiBraW5kID09PSAndmFsdWVzJyA/IGVudHJ5LnZhbHVlIDogW2VudHJ5LmtleSwgZW50cnkudmFsdWVdOwogIH0gcmV0dXJuIHN0ZXA7Cn0pOwoKLy8gYFVSTFNlYXJjaFBhcmFtc2AgY29uc3RydWN0b3IKLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNpbnRlcmZhY2UtdXJsc2VhcmNocGFyYW1zCnZhciBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIFVSTFNlYXJjaFBhcmFtcygvKiBpbml0ICovKSB7CiAgYW5JbnN0YW5jZSh0aGlzLCBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvciwgVVJMX1NFQVJDSF9QQVJBTVMpOwogIHZhciBpbml0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQ7CiAgdmFyIHRoYXQgPSB0aGlzOwogIHZhciBlbnRyaWVzID0gW107CiAgdmFyIGl0ZXJhdG9yTWV0aG9kLCBpdGVyYXRvciwgbmV4dCwgc3RlcCwgZW50cnlJdGVyYXRvciwgZW50cnlOZXh0LCBmaXJzdCwgc2Vjb25kLCBrZXk7CgogIHNldEludGVybmFsU3RhdGUodGhhdCwgewogICAgdHlwZTogVVJMX1NFQVJDSF9QQVJBTVMsCiAgICBlbnRyaWVzOiBlbnRyaWVzLAogICAgdXBkYXRlVVJMOiBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sCiAgICB1cGRhdGVTZWFyY2hQYXJhbXM6IHVwZGF0ZVNlYXJjaFBhcmFtcwogIH0pOwoKICBpZiAoaW5pdCAhPT0gdW5kZWZpbmVkKSB7CiAgICBpZiAoaXNPYmplY3QoaW5pdCkpIHsKICAgICAgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChpbml0KTsKICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvck1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGl0ZXJhdG9yID0gaXRlcmF0b3JNZXRob2QuY2FsbChpbml0KTsKICAgICAgICBuZXh0ID0gaXRlcmF0b3IubmV4dDsKICAgICAgICB3aGlsZSAoIShzdGVwID0gbmV4dC5jYWxsKGl0ZXJhdG9yKSkuZG9uZSkgewogICAgICAgICAgZW50cnlJdGVyYXRvciA9IGdldEl0ZXJhdG9yKGFuT2JqZWN0KHN0ZXAudmFsdWUpKTsKICAgICAgICAgIGVudHJ5TmV4dCA9IGVudHJ5SXRlcmF0b3IubmV4dDsKICAgICAgICAgIGlmICgKICAgICAgICAgICAgKGZpcnN0ID0gZW50cnlOZXh0LmNhbGwoZW50cnlJdGVyYXRvcikpLmRvbmUgfHwKICAgICAgICAgICAgKHNlY29uZCA9IGVudHJ5TmV4dC5jYWxsKGVudHJ5SXRlcmF0b3IpKS5kb25lIHx8CiAgICAgICAgICAgICFlbnRyeU5leHQuY2FsbChlbnRyeUl0ZXJhdG9yKS5kb25lCiAgICAgICAgICApIHRocm93IFR5cGVFcnJvcignRXhwZWN0ZWQgc2VxdWVuY2Ugd2l0aCBsZW5ndGggMicpOwogICAgICAgICAgZW50cmllcy5wdXNoKHsga2V5OiBmaXJzdC52YWx1ZSArICcnLCB2YWx1ZTogc2Vjb25kLnZhbHVlICsgJycgfSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgZm9yIChrZXkgaW4gaW5pdCkgaWYgKGhhc093bihpbml0LCBrZXkpKSBlbnRyaWVzLnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IGluaXRba2V5XSArICcnIH0pOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VTZWFyY2hQYXJhbXMoZW50cmllcywgdHlwZW9mIGluaXQgPT09ICdzdHJpbmcnID8gaW5pdC5jaGFyQXQoMCkgPT09ICc/JyA/IGluaXQuc2xpY2UoMSkgOiBpbml0IDogaW5pdCArICcnKTsKICAgIH0KICB9Cn07Cgp2YXIgVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlID0gVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IucHJvdG90eXBlOwoKcmVkZWZpbmVBbGwoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCB7CiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuYXBwZW50YCBtZXRob2QKICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtYXBwZW5kCiAgYXBwZW5kOiBmdW5jdGlvbiBhcHBlbmQobmFtZSwgdmFsdWUpIHsKICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDIpOwogICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKTsKICAgIHN0YXRlLmVudHJpZXMucHVzaCh7IGtleTogbmFtZSArICcnLCB2YWx1ZTogdmFsdWUgKyAnJyB9KTsKICAgIHN0YXRlLnVwZGF0ZVVSTCgpOwogIH0sCiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZGVsZXRlYCBtZXRob2QKICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtZGVsZXRlCiAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTsKICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyk7CiAgICB2YXIgZW50cmllcyA9IHN0YXRlLmVudHJpZXM7CiAgICB2YXIga2V5ID0gbmFtZSArICcnOwogICAgdmFyIGluZGV4ID0gMDsKICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7CiAgICAgIGlmIChlbnRyaWVzW2luZGV4XS5rZXkgPT09IGtleSkgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICBlbHNlIGluZGV4Kys7CiAgICB9CiAgICBzdGF0ZS51cGRhdGVVUkwoKTsKICB9LAogIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmdldGAgbWV0aG9kCiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLWdldAogIGdldDogZnVuY3Rpb24gZ2V0KG5hbWUpIHsKICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpOwogICAgdmFyIGVudHJpZXMgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLmVudHJpZXM7CiAgICB2YXIga2V5ID0gbmFtZSArICcnOwogICAgdmFyIGluZGV4ID0gMDsKICAgIGZvciAoOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgIGlmIChlbnRyaWVzW2luZGV4XS5rZXkgPT09IGtleSkgcmV0dXJuIGVudHJpZXNbaW5kZXhdLnZhbHVlOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfSwKICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5nZXRBbGxgIG1ldGhvZAogIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1nZXRhbGwKICBnZXRBbGw6IGZ1bmN0aW9uIGdldEFsbChuYW1lKSB7CiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTsKICAgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzOwogICAgdmFyIGtleSA9IG5hbWUgKyAnJzsKICAgIHZhciByZXN1bHQgPSBbXTsKICAgIHZhciBpbmRleCA9IDA7CiAgICBmb3IgKDsgaW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICBpZiAoZW50cmllc1tpbmRleF0ua2V5ID09PSBrZXkpIHJlc3VsdC5wdXNoKGVudHJpZXNbaW5kZXhdLnZhbHVlKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfSwKICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5oYXNgIG1ldGhvZAogIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1oYXMKICBoYXM6IGZ1bmN0aW9uIGhhcyhuYW1lKSB7CiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTsKICAgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzOwogICAgdmFyIGtleSA9IG5hbWUgKyAnJzsKICAgIHZhciBpbmRleCA9IDA7CiAgICB3aGlsZSAoaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkgewogICAgICBpZiAoZW50cmllc1tpbmRleCsrXS5rZXkgPT09IGtleSkgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfSwKICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5zZXRgIG1ldGhvZAogIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1zZXQKICBzZXQ6IGZ1bmN0aW9uIHNldChuYW1lLCB2YWx1ZSkgewogICAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMSk7CiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpOwogICAgdmFyIGVudHJpZXMgPSBzdGF0ZS5lbnRyaWVzOwogICAgdmFyIGZvdW5kID0gZmFsc2U7CiAgICB2YXIga2V5ID0gbmFtZSArICcnOwogICAgdmFyIHZhbCA9IHZhbHVlICsgJyc7CiAgICB2YXIgaW5kZXggPSAwOwogICAgdmFyIGVudHJ5OwogICAgZm9yICg7IGluZGV4IDwgZW50cmllcy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgZW50cnkgPSBlbnRyaWVzW2luZGV4XTsKICAgICAgaWYgKGVudHJ5LmtleSA9PT0ga2V5KSB7CiAgICAgICAgaWYgKGZvdW5kKSBlbnRyaWVzLnNwbGljZShpbmRleC0tLCAxKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgIGVudHJ5LnZhbHVlID0gdmFsOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKCFmb3VuZCkgZW50cmllcy5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiB2YWwgfSk7CiAgICBzdGF0ZS51cGRhdGVVUkwoKTsKICB9LAogIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnNvcnRgIG1ldGhvZAogIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1zb3J0CiAgc29ydDogZnVuY3Rpb24gc29ydCgpIHsKICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyk7CiAgICB2YXIgZW50cmllcyA9IHN0YXRlLmVudHJpZXM7CiAgICAvLyBBcnJheSNzb3J0IGlzIG5vdCBzdGFibGUgaW4gc29tZSBlbmdpbmVzCiAgICB2YXIgc2xpY2UgPSBlbnRyaWVzLnNsaWNlKCk7CiAgICB2YXIgZW50cnksIGVudHJpZXNJbmRleCwgc2xpY2VJbmRleDsKICAgIGVudHJpZXMubGVuZ3RoID0gMDsKICAgIGZvciAoc2xpY2VJbmRleCA9IDA7IHNsaWNlSW5kZXggPCBzbGljZS5sZW5ndGg7IHNsaWNlSW5kZXgrKykgewogICAgICBlbnRyeSA9IHNsaWNlW3NsaWNlSW5kZXhdOwogICAgICBmb3IgKGVudHJpZXNJbmRleCA9IDA7IGVudHJpZXNJbmRleCA8IHNsaWNlSW5kZXg7IGVudHJpZXNJbmRleCsrKSB7CiAgICAgICAgaWYgKGVudHJpZXNbZW50cmllc0luZGV4XS5rZXkgPiBlbnRyeS5rZXkpIHsKICAgICAgICAgIGVudHJpZXMuc3BsaWNlKGVudHJpZXNJbmRleCwgMCwgZW50cnkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChlbnRyaWVzSW5kZXggPT09IHNsaWNlSW5kZXgpIGVudHJpZXMucHVzaChlbnRyeSk7CiAgICB9CiAgICBzdGF0ZS51cGRhdGVVUkwoKTsKICB9LAogIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZAogIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2sgLyogLCB0aGlzQXJnICovKSB7CiAgICB2YXIgZW50cmllcyA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuZW50cmllczsKICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFjaywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpOwogICAgdmFyIGluZGV4ID0gMDsKICAgIHZhciBlbnRyeTsKICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7CiAgICAgIGVudHJ5ID0gZW50cmllc1tpbmRleCsrXTsKICAgICAgYm91bmRGdW5jdGlvbihlbnRyeS52YWx1ZSwgZW50cnkua2V5LCB0aGlzKTsKICAgIH0KICB9LAogIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmtleXNgIG1ldGhvZAogIGtleXM6IGZ1bmN0aW9uIGtleXMoKSB7CiAgICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yKHRoaXMsICdrZXlzJyk7CiAgfSwKICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS52YWx1ZXNgIG1ldGhvZAogIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKCkgewogICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXNJdGVyYXRvcih0aGlzLCAndmFsdWVzJyk7CiAgfSwKICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2QKICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKCkgewogICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXNJdGVyYXRvcih0aGlzLCAnZW50cmllcycpOwogIH0KfSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pOwoKLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZApyZWRlZmluZShVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsIElURVJBVE9SLCBVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUuZW50cmllcyk7CgovLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kCi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsc2VhcmNocGFyYW1zLXN0cmluZ2lmaWNhdGlvbi1iZWhhdmlvcgpyZWRlZmluZShVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkgewogIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzOwogIHZhciByZXN1bHQgPSBbXTsKICB2YXIgaW5kZXggPSAwOwogIHZhciBlbnRyeTsKICB3aGlsZSAoaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkgewogICAgZW50cnkgPSBlbnRyaWVzW2luZGV4KytdOwogICAgcmVzdWx0LnB1c2goc2VyaWFsaXplKGVudHJ5LmtleSkgKyAnPScgKyBzZXJpYWxpemUoZW50cnkudmFsdWUpKTsKICB9IHJldHVybiByZXN1bHQuam9pbignJicpOwp9LCB7IGVudW1lcmFibGU6IHRydWUgfSk7CgpzZXRUb1N0cmluZ1RhZyhVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvciwgVVJMX1NFQVJDSF9QQVJBTVMpOwoKJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiAhVVNFX05BVElWRV9VUkwgfSwgewogIFVSTFNlYXJjaFBhcmFtczogVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IKfSk7CgovLyBXcmFwIGBmZXRjaGAgZm9yIGNvcnJlY3Qgd29yayB3aXRoIHBvbHlmaWxsZWQgYFVSTFNlYXJjaFBhcmFtc2AKLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3NAppZiAoIVVTRV9OQVRJVkVfVVJMICYmIHR5cGVvZiAkZmV0Y2ggPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgSGVhZGVycyA9PSAnZnVuY3Rpb24nKSB7CiAgJCh7IGdsb2JhbDogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgZm9yY2VkOiB0cnVlIH0sIHsKICAgIGZldGNoOiBmdW5jdGlvbiBmZXRjaChpbnB1dCAvKiAsIGluaXQgKi8pIHsKICAgICAgdmFyIGFyZ3MgPSBbaW5wdXRdOwogICAgICB2YXIgaW5pdCwgYm9keSwgaGVhZGVyczsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CiAgICAgICAgaW5pdCA9IGFyZ3VtZW50c1sxXTsKICAgICAgICBpZiAoaXNPYmplY3QoaW5pdCkpIHsKICAgICAgICAgIGJvZHkgPSBpbml0LmJvZHk7CiAgICAgICAgICBpZiAoY2xhc3NvZihib2R5KSA9PT0gVVJMX1NFQVJDSF9QQVJBTVMpIHsKICAgICAgICAgICAgaGVhZGVycyA9IGluaXQuaGVhZGVycyA/IG5ldyBIZWFkZXJzKGluaXQuaGVhZGVycykgOiBuZXcgSGVhZGVycygpOwogICAgICAgICAgICBpZiAoIWhlYWRlcnMuaGFzKCdjb250ZW50LXR5cGUnKSkgewogICAgICAgICAgICAgIGhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbml0ID0gY3JlYXRlKGluaXQsIHsKICAgICAgICAgICAgICBib2R5OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgU3RyaW5nKGJvZHkpKSwKICAgICAgICAgICAgICBoZWFkZXJzOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgaGVhZGVycykKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGFyZ3MucHVzaChpbml0KTsKICAgICAgfSByZXR1cm4gJGZldGNoLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgfQogIH0pOwp9Cgptb2R1bGUuZXhwb3J0cyA9IHsKICBVUkxTZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yLAogIGdldFN0YXRlOiBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlCn07CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7CgovLyBUT0RPOiBpbiBjb3JlLWpzQDQsIG1vdmUgL21vZHVsZXMvIGRlcGVuZGVuY2llcyB0byBwdWJsaWMgZW50cmllcyBmb3IgYmV0dGVyIG9wdGltaXphdGlvbiBieSB0b29scyBsaWtlIGBwcmVzZXQtZW52YApfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvci5qcyIpOwp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIpOwp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIik7CnZhciBVU0VfTkFUSVZFX1VSTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9uYXRpdmUtdXJsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtdXJsLmpzIik7CnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiKTsKdmFyIGRlZmluZVByb3BlcnRpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMuanMiKTsKdmFyIHJlZGVmaW5lID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZGVmaW5lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIpOwp2YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiKTsKdmFyIGhhcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIpOwp2YXIgYXNzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1hc3NpZ24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanMiKTsKdmFyIGFycmF5RnJvbSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1mcm9tICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1mcm9tLmpzIik7CnZhciBjb2RlQXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZS5qcyIpLmNvZGVBdDsKdmFyIHRvQVNDSUkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHVueWNvZGUtdG8tYXNjaWkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3B1bnljb2RlLXRvLWFzY2lpLmpzIik7CnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMiKTsKdmFyIFVSTFNlYXJjaFBhcmFtc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmpzIik7CnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIpOwoKdmFyIE5hdGl2ZVVSTCA9IGdsb2JhbC5VUkw7CnZhciBVUkxTZWFyY2hQYXJhbXMgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuVVJMU2VhcmNoUGFyYW1zOwp2YXIgZ2V0SW50ZXJuYWxTZWFyY2hQYXJhbXNTdGF0ZSA9IFVSTFNlYXJjaFBhcmFtc01vZHVsZS5nZXRTdGF0ZTsKdmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKdmFyIGdldEludGVybmFsVVJMU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcignVVJMJyk7CnZhciBmbG9vciA9IE1hdGguZmxvb3I7CnZhciBwb3cgPSBNYXRoLnBvdzsKCnZhciBJTlZBTElEX0FVVEhPUklUWSA9ICdJbnZhbGlkIGF1dGhvcml0eSc7CnZhciBJTlZBTElEX1NDSEVNRSA9ICdJbnZhbGlkIHNjaGVtZSc7CnZhciBJTlZBTElEX0hPU1QgPSAnSW52YWxpZCBob3N0JzsKdmFyIElOVkFMSURfUE9SVCA9ICdJbnZhbGlkIHBvcnQnOwoKdmFyIEFMUEhBID0gL1tBLVphLXpdLzsKdmFyIEFMUEhBTlVNRVJJQyA9IC9bXGQrXC0uQS1aYS16XS87CnZhciBESUdJVCA9IC9cZC87CnZhciBIRVhfU1RBUlQgPSAvXigweHwwWCkvOwp2YXIgT0NUID0gL15bMC03XSskLzsKdmFyIERFQyA9IC9eXGQrJC87CnZhciBIRVggPSAvXltcZEEtRmEtZl0rJC87Ci8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4CnZhciBGT1JCSURERU5fSE9TVF9DT0RFX1BPSU5UID0gL1tcdTAwMDBcdTAwMDlcdTAwMEFcdTAwMEQgIyUvOj9AW1xcXV0vOwovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleAp2YXIgRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVF9FWENMVURJTkdfUEVSQ0VOVCA9IC9bXHUwMDAwXHUwMDA5XHUwMDBBXHUwMDBEICMvOj9AW1xcXV0vOwovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleAp2YXIgTEVBRElOR19BTkRfVFJBSUxJTkdfQzBfQ09OVFJPTF9PUl9TUEFDRSA9IC9eW1x1MDAwMC1cdTAwMUYgXSt8W1x1MDAwMC1cdTAwMUYgXSskL2c7Ci8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4CnZhciBUQUJfQU5EX05FV19MSU5FID0gL1tcdTAwMDlcdTAwMEFcdTAwMERdL2c7CnZhciBFT0Y7Cgp2YXIgcGFyc2VIb3N0ID0gZnVuY3Rpb24gKHVybCwgaW5wdXQpIHsKICB2YXIgcmVzdWx0LCBjb2RlUG9pbnRzLCBpbmRleDsKICBpZiAoaW5wdXQuY2hhckF0KDApID09ICdbJykgewogICAgaWYgKGlucHV0LmNoYXJBdChpbnB1dC5sZW5ndGggLSAxKSAhPSAnXScpIHJldHVybiBJTlZBTElEX0hPU1Q7CiAgICByZXN1bHQgPSBwYXJzZUlQdjYoaW5wdXQuc2xpY2UoMSwgLTEpKTsKICAgIGlmICghcmVzdWx0KSByZXR1cm4gSU5WQUxJRF9IT1NUOwogICAgdXJsLmhvc3QgPSByZXN1bHQ7CiAgLy8gb3BhcXVlIGhvc3QKICB9IGVsc2UgaWYgKCFpc1NwZWNpYWwodXJsKSkgewogICAgaWYgKEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlRfRVhDTFVESU5HX1BFUkNFTlQudGVzdChpbnB1dCkpIHJldHVybiBJTlZBTElEX0hPU1Q7CiAgICByZXN1bHQgPSAnJzsKICAgIGNvZGVQb2ludHMgPSBhcnJheUZyb20oaW5wdXQpOwogICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY29kZVBvaW50cy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgcmVzdWx0ICs9IHBlcmNlbnRFbmNvZGUoY29kZVBvaW50c1tpbmRleF0sIEMwQ29udHJvbFBlcmNlbnRFbmNvZGVTZXQpOwogICAgfQogICAgdXJsLmhvc3QgPSByZXN1bHQ7CiAgfSBlbHNlIHsKICAgIGlucHV0ID0gdG9BU0NJSShpbnB1dCk7CiAgICBpZiAoRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVC50ZXN0KGlucHV0KSkgcmV0dXJuIElOVkFMSURfSE9TVDsKICAgIHJlc3VsdCA9IHBhcnNlSVB2NChpbnB1dCk7CiAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gSU5WQUxJRF9IT1NUOwogICAgdXJsLmhvc3QgPSByZXN1bHQ7CiAgfQp9OwoKdmFyIHBhcnNlSVB2NCA9IGZ1bmN0aW9uIChpbnB1dCkgewogIHZhciBwYXJ0cyA9IGlucHV0LnNwbGl0KCcuJyk7CiAgdmFyIHBhcnRzTGVuZ3RoLCBudW1iZXJzLCBpbmRleCwgcGFydCwgcmFkaXgsIG51bWJlciwgaXB2NDsKICBpZiAocGFydHMubGVuZ3RoICYmIHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdID09ICcnKSB7CiAgICBwYXJ0cy5wb3AoKTsKICB9CiAgcGFydHNMZW5ndGggPSBwYXJ0cy5sZW5ndGg7CiAgaWYgKHBhcnRzTGVuZ3RoID4gNCkgcmV0dXJuIGlucHV0OwogIG51bWJlcnMgPSBbXTsKICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwYXJ0c0xlbmd0aDsgaW5kZXgrKykgewogICAgcGFydCA9IHBhcnRzW2luZGV4XTsKICAgIGlmIChwYXJ0ID09ICcnKSByZXR1cm4gaW5wdXQ7CiAgICByYWRpeCA9IDEwOwogICAgaWYgKHBhcnQubGVuZ3RoID4gMSAmJiBwYXJ0LmNoYXJBdCgwKSA9PSAnMCcpIHsKICAgICAgcmFkaXggPSBIRVhfU1RBUlQudGVzdChwYXJ0KSA/IDE2IDogODsKICAgICAgcGFydCA9IHBhcnQuc2xpY2UocmFkaXggPT0gOCA/IDEgOiAyKTsKICAgIH0KICAgIGlmIChwYXJ0ID09PSAnJykgewogICAgICBudW1iZXIgPSAwOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCEocmFkaXggPT0gMTAgPyBERUMgOiByYWRpeCA9PSA4ID8gT0NUIDogSEVYKS50ZXN0KHBhcnQpKSByZXR1cm4gaW5wdXQ7CiAgICAgIG51bWJlciA9IHBhcnNlSW50KHBhcnQsIHJhZGl4KTsKICAgIH0KICAgIG51bWJlcnMucHVzaChudW1iZXIpOwogIH0KICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwYXJ0c0xlbmd0aDsgaW5kZXgrKykgewogICAgbnVtYmVyID0gbnVtYmVyc1tpbmRleF07CiAgICBpZiAoaW5kZXggPT0gcGFydHNMZW5ndGggLSAxKSB7CiAgICAgIGlmIChudW1iZXIgPj0gcG93KDI1NiwgNSAtIHBhcnRzTGVuZ3RoKSkgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgaWYgKG51bWJlciA+IDI1NSkgcmV0dXJuIG51bGw7CiAgfQogIGlwdjQgPSBudW1iZXJzLnBvcCgpOwogIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWJlcnMubGVuZ3RoOyBpbmRleCsrKSB7CiAgICBpcHY0ICs9IG51bWJlcnNbaW5kZXhdICogcG93KDI1NiwgMyAtIGluZGV4KTsKICB9CiAgcmV0dXJuIGlwdjQ7Cn07CgovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHMKdmFyIHBhcnNlSVB2NiA9IGZ1bmN0aW9uIChpbnB1dCkgewogIHZhciBhZGRyZXNzID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdOwogIHZhciBwaWVjZUluZGV4ID0gMDsKICB2YXIgY29tcHJlc3MgPSBudWxsOwogIHZhciBwb2ludGVyID0gMDsKICB2YXIgdmFsdWUsIGxlbmd0aCwgbnVtYmVyc1NlZW4sIGlwdjRQaWVjZSwgbnVtYmVyLCBzd2Fwcywgc3dhcDsKCiAgdmFyIGNoYXIgPSBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gaW5wdXQuY2hhckF0KHBvaW50ZXIpOwogIH07CgogIGlmIChjaGFyKCkgPT0gJzonKSB7CiAgICBpZiAoaW5wdXQuY2hhckF0KDEpICE9ICc6JykgcmV0dXJuOwogICAgcG9pbnRlciArPSAyOwogICAgcGllY2VJbmRleCsrOwogICAgY29tcHJlc3MgPSBwaWVjZUluZGV4OwogIH0KICB3aGlsZSAoY2hhcigpKSB7CiAgICBpZiAocGllY2VJbmRleCA9PSA4KSByZXR1cm47CiAgICBpZiAoY2hhcigpID09ICc6JykgewogICAgICBpZiAoY29tcHJlc3MgIT09IG51bGwpIHJldHVybjsKICAgICAgcG9pbnRlcisrOwogICAgICBwaWVjZUluZGV4Kys7CiAgICAgIGNvbXByZXNzID0gcGllY2VJbmRleDsKICAgICAgY29udGludWU7CiAgICB9CiAgICB2YWx1ZSA9IGxlbmd0aCA9IDA7CiAgICB3aGlsZSAobGVuZ3RoIDwgNCAmJiBIRVgudGVzdChjaGFyKCkpKSB7CiAgICAgIHZhbHVlID0gdmFsdWUgKiAxNiArIHBhcnNlSW50KGNoYXIoKSwgMTYpOwogICAgICBwb2ludGVyKys7CiAgICAgIGxlbmd0aCsrOwogICAgfQogICAgaWYgKGNoYXIoKSA9PSAnLicpIHsKICAgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm47CiAgICAgIHBvaW50ZXIgLT0gbGVuZ3RoOwogICAgICBpZiAocGllY2VJbmRleCA+IDYpIHJldHVybjsKICAgICAgbnVtYmVyc1NlZW4gPSAwOwogICAgICB3aGlsZSAoY2hhcigpKSB7CiAgICAgICAgaXB2NFBpZWNlID0gbnVsbDsKICAgICAgICBpZiAobnVtYmVyc1NlZW4gPiAwKSB7CiAgICAgICAgICBpZiAoY2hhcigpID09ICcuJyAmJiBudW1iZXJzU2VlbiA8IDQpIHBvaW50ZXIrKzsKICAgICAgICAgIGVsc2UgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIURJR0lULnRlc3QoY2hhcigpKSkgcmV0dXJuOwogICAgICAgIHdoaWxlIChESUdJVC50ZXN0KGNoYXIoKSkpIHsKICAgICAgICAgIG51bWJlciA9IHBhcnNlSW50KGNoYXIoKSwgMTApOwogICAgICAgICAgaWYgKGlwdjRQaWVjZSA9PT0gbnVsbCkgaXB2NFBpZWNlID0gbnVtYmVyOwogICAgICAgICAgZWxzZSBpZiAoaXB2NFBpZWNlID09IDApIHJldHVybjsKICAgICAgICAgIGVsc2UgaXB2NFBpZWNlID0gaXB2NFBpZWNlICogMTAgKyBudW1iZXI7CiAgICAgICAgICBpZiAoaXB2NFBpZWNlID4gMjU1KSByZXR1cm47CiAgICAgICAgICBwb2ludGVyKys7CiAgICAgICAgfQogICAgICAgIGFkZHJlc3NbcGllY2VJbmRleF0gPSBhZGRyZXNzW3BpZWNlSW5kZXhdICogMjU2ICsgaXB2NFBpZWNlOwogICAgICAgIG51bWJlcnNTZWVuKys7CiAgICAgICAgaWYgKG51bWJlcnNTZWVuID09IDIgfHwgbnVtYmVyc1NlZW4gPT0gNCkgcGllY2VJbmRleCsrOwogICAgICB9CiAgICAgIGlmIChudW1iZXJzU2VlbiAhPSA0KSByZXR1cm47CiAgICAgIGJyZWFrOwogICAgfSBlbHNlIGlmIChjaGFyKCkgPT0gJzonKSB7CiAgICAgIHBvaW50ZXIrKzsKICAgICAgaWYgKCFjaGFyKCkpIHJldHVybjsKICAgIH0gZWxzZSBpZiAoY2hhcigpKSByZXR1cm47CiAgICBhZGRyZXNzW3BpZWNlSW5kZXgrK10gPSB2YWx1ZTsKICB9CiAgaWYgKGNvbXByZXNzICE9PSBudWxsKSB7CiAgICBzd2FwcyA9IHBpZWNlSW5kZXggLSBjb21wcmVzczsKICAgIHBpZWNlSW5kZXggPSA3OwogICAgd2hpbGUgKHBpZWNlSW5kZXggIT0gMCAmJiBzd2FwcyA+IDApIHsKICAgICAgc3dhcCA9IGFkZHJlc3NbcGllY2VJbmRleF07CiAgICAgIGFkZHJlc3NbcGllY2VJbmRleC0tXSA9IGFkZHJlc3NbY29tcHJlc3MgKyBzd2FwcyAtIDFdOwogICAgICBhZGRyZXNzW2NvbXByZXNzICsgLS1zd2Fwc10gPSBzd2FwOwogICAgfQogIH0gZWxzZSBpZiAocGllY2VJbmRleCAhPSA4KSByZXR1cm47CiAgcmV0dXJuIGFkZHJlc3M7Cn07Cgp2YXIgZmluZExvbmdlc3RaZXJvU2VxdWVuY2UgPSBmdW5jdGlvbiAoaXB2NikgewogIHZhciBtYXhJbmRleCA9IG51bGw7CiAgdmFyIG1heExlbmd0aCA9IDE7CiAgdmFyIGN1cnJTdGFydCA9IG51bGw7CiAgdmFyIGN1cnJMZW5ndGggPSAwOwogIHZhciBpbmRleCA9IDA7CiAgZm9yICg7IGluZGV4IDwgODsgaW5kZXgrKykgewogICAgaWYgKGlwdjZbaW5kZXhdICE9PSAwKSB7CiAgICAgIGlmIChjdXJyTGVuZ3RoID4gbWF4TGVuZ3RoKSB7CiAgICAgICAgbWF4SW5kZXggPSBjdXJyU3RhcnQ7CiAgICAgICAgbWF4TGVuZ3RoID0gY3Vyckxlbmd0aDsKICAgICAgfQogICAgICBjdXJyU3RhcnQgPSBudWxsOwogICAgICBjdXJyTGVuZ3RoID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChjdXJyU3RhcnQgPT09IG51bGwpIGN1cnJTdGFydCA9IGluZGV4OwogICAgICArK2N1cnJMZW5ndGg7CiAgICB9CiAgfQogIGlmIChjdXJyTGVuZ3RoID4gbWF4TGVuZ3RoKSB7CiAgICBtYXhJbmRleCA9IGN1cnJTdGFydDsKICAgIG1heExlbmd0aCA9IGN1cnJMZW5ndGg7CiAgfQogIHJldHVybiBtYXhJbmRleDsKfTsKCnZhciBzZXJpYWxpemVIb3N0ID0gZnVuY3Rpb24gKGhvc3QpIHsKICB2YXIgcmVzdWx0LCBpbmRleCwgY29tcHJlc3MsIGlnbm9yZTA7CiAgLy8gaXB2NAogIGlmICh0eXBlb2YgaG9zdCA9PSAnbnVtYmVyJykgewogICAgcmVzdWx0ID0gW107CiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA0OyBpbmRleCsrKSB7CiAgICAgIHJlc3VsdC51bnNoaWZ0KGhvc3QgJSAyNTYpOwogICAgICBob3N0ID0gZmxvb3IoaG9zdCAvIDI1Nik7CiAgICB9IHJldHVybiByZXN1bHQuam9pbignLicpOwogIC8vIGlwdjYKICB9IGVsc2UgaWYgKHR5cGVvZiBob3N0ID09ICdvYmplY3QnKSB7CiAgICByZXN1bHQgPSAnJzsKICAgIGNvbXByZXNzID0gZmluZExvbmdlc3RaZXJvU2VxdWVuY2UoaG9zdCk7CiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSB7CiAgICAgIGlmIChpZ25vcmUwICYmIGhvc3RbaW5kZXhdID09PSAwKSBjb250aW51ZTsKICAgICAgaWYgKGlnbm9yZTApIGlnbm9yZTAgPSBmYWxzZTsKICAgICAgaWYgKGNvbXByZXNzID09PSBpbmRleCkgewogICAgICAgIHJlc3VsdCArPSBpbmRleCA/ICc6JyA6ICc6Oic7CiAgICAgICAgaWdub3JlMCA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0ICs9IGhvc3RbaW5kZXhdLnRvU3RyaW5nKDE2KTsKICAgICAgICBpZiAoaW5kZXggPCA3KSByZXN1bHQgKz0gJzonOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gJ1snICsgcmVzdWx0ICsgJ10nOwogIH0gcmV0dXJuIGhvc3Q7Cn07Cgp2YXIgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCA9IHt9Owp2YXIgZnJhZ21lbnRQZXJjZW50RW5jb2RlU2V0ID0gYXNzaWduKHt9LCBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0LCB7CiAgJyAnOiAxLCAnIic6IDEsICc8JzogMSwgJz4nOiAxLCAnYCc6IDEKfSk7CnZhciBwYXRoUGVyY2VudEVuY29kZVNldCA9IGFzc2lnbih7fSwgZnJhZ21lbnRQZXJjZW50RW5jb2RlU2V0LCB7CiAgJyMnOiAxLCAnPyc6IDEsICd7JzogMSwgJ30nOiAxCn0pOwp2YXIgdXNlcmluZm9QZXJjZW50RW5jb2RlU2V0ID0gYXNzaWduKHt9LCBwYXRoUGVyY2VudEVuY29kZVNldCwgewogICcvJzogMSwgJzonOiAxLCAnOyc6IDEsICc9JzogMSwgJ0AnOiAxLCAnWyc6IDEsICdcXCc6IDEsICddJzogMSwgJ14nOiAxLCAnfCc6IDEKfSk7Cgp2YXIgcGVyY2VudEVuY29kZSA9IGZ1bmN0aW9uIChjaGFyLCBzZXQpIHsKICB2YXIgY29kZSA9IGNvZGVBdChjaGFyLCAwKTsKICByZXR1cm4gY29kZSA+IDB4MjAgJiYgY29kZSA8IDB4N0YgJiYgIWhhcyhzZXQsIGNoYXIpID8gY2hhciA6IGVuY29kZVVSSUNvbXBvbmVudChjaGFyKTsKfTsKCnZhciBzcGVjaWFsU2NoZW1lcyA9IHsKICBmdHA6IDIxLAogIGZpbGU6IG51bGwsCiAgaHR0cDogODAsCiAgaHR0cHM6IDQ0MywKICB3czogODAsCiAgd3NzOiA0NDMKfTsKCnZhciBpc1NwZWNpYWwgPSBmdW5jdGlvbiAodXJsKSB7CiAgcmV0dXJuIGhhcyhzcGVjaWFsU2NoZW1lcywgdXJsLnNjaGVtZSk7Cn07Cgp2YXIgaW5jbHVkZXNDcmVkZW50aWFscyA9IGZ1bmN0aW9uICh1cmwpIHsKICByZXR1cm4gdXJsLnVzZXJuYW1lICE9ICcnIHx8IHVybC5wYXNzd29yZCAhPSAnJzsKfTsKCnZhciBjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQgPSBmdW5jdGlvbiAodXJsKSB7CiAgcmV0dXJuICF1cmwuaG9zdCB8fCB1cmwuY2Fubm90QmVBQmFzZVVSTCB8fCB1cmwuc2NoZW1lID09ICdmaWxlJzsKfTsKCnZhciBpc1dpbmRvd3NEcml2ZUxldHRlciA9IGZ1bmN0aW9uIChzdHJpbmcsIG5vcm1hbGl6ZWQpIHsKICB2YXIgc2Vjb25kOwogIHJldHVybiBzdHJpbmcubGVuZ3RoID09IDIgJiYgQUxQSEEudGVzdChzdHJpbmcuY2hhckF0KDApKQogICAgJiYgKChzZWNvbmQgPSBzdHJpbmcuY2hhckF0KDEpKSA9PSAnOicgfHwgKCFub3JtYWxpemVkICYmIHNlY29uZCA9PSAnfCcpKTsKfTsKCnZhciBzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyID0gZnVuY3Rpb24gKHN0cmluZykgewogIHZhciB0aGlyZDsKICByZXR1cm4gc3RyaW5nLmxlbmd0aCA+IDEgJiYgaXNXaW5kb3dzRHJpdmVMZXR0ZXIoc3RyaW5nLnNsaWNlKDAsIDIpKSAmJiAoCiAgICBzdHJpbmcubGVuZ3RoID09IDIgfHwKICAgICgodGhpcmQgPSBzdHJpbmcuY2hhckF0KDIpKSA9PT0gJy8nIHx8IHRoaXJkID09PSAnXFwnIHx8IHRoaXJkID09PSAnPycgfHwgdGhpcmQgPT09ICcjJykKICApOwp9OwoKdmFyIHNob3J0ZW5VUkxzUGF0aCA9IGZ1bmN0aW9uICh1cmwpIHsKICB2YXIgcGF0aCA9IHVybC5wYXRoOwogIHZhciBwYXRoU2l6ZSA9IHBhdGgubGVuZ3RoOwogIGlmIChwYXRoU2l6ZSAmJiAodXJsLnNjaGVtZSAhPSAnZmlsZScgfHwgcGF0aFNpemUgIT0gMSB8fCAhaXNXaW5kb3dzRHJpdmVMZXR0ZXIocGF0aFswXSwgdHJ1ZSkpKSB7CiAgICBwYXRoLnBvcCgpOwogIH0KfTsKCnZhciBpc1NpbmdsZURvdCA9IGZ1bmN0aW9uIChzZWdtZW50KSB7CiAgcmV0dXJuIHNlZ21lbnQgPT09ICcuJyB8fCBzZWdtZW50LnRvTG93ZXJDYXNlKCkgPT09ICclMmUnOwp9OwoKdmFyIGlzRG91YmxlRG90ID0gZnVuY3Rpb24gKHNlZ21lbnQpIHsKICBzZWdtZW50ID0gc2VnbWVudC50b0xvd2VyQ2FzZSgpOwogIHJldHVybiBzZWdtZW50ID09PSAnLi4nIHx8IHNlZ21lbnQgPT09ICclMmUuJyB8fCBzZWdtZW50ID09PSAnLiUyZScgfHwgc2VnbWVudCA9PT0gJyUyZSUyZSc7Cn07CgovLyBTdGF0ZXM6CnZhciBTQ0hFTUVfU1RBUlQgPSB7fTsKdmFyIFNDSEVNRSA9IHt9Owp2YXIgTk9fU0NIRU1FID0ge307CnZhciBTUEVDSUFMX1JFTEFUSVZFX09SX0FVVEhPUklUWSA9IHt9Owp2YXIgUEFUSF9PUl9BVVRIT1JJVFkgPSB7fTsKdmFyIFJFTEFUSVZFID0ge307CnZhciBSRUxBVElWRV9TTEFTSCA9IHt9Owp2YXIgU1BFQ0lBTF9BVVRIT1JJVFlfU0xBU0hFUyA9IHt9Owp2YXIgU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVMgPSB7fTsKdmFyIEFVVEhPUklUWSA9IHt9Owp2YXIgSE9TVCA9IHt9Owp2YXIgSE9TVE5BTUUgPSB7fTsKdmFyIFBPUlQgPSB7fTsKdmFyIEZJTEUgPSB7fTsKdmFyIEZJTEVfU0xBU0ggPSB7fTsKdmFyIEZJTEVfSE9TVCA9IHt9Owp2YXIgUEFUSF9TVEFSVCA9IHt9Owp2YXIgUEFUSCA9IHt9Owp2YXIgQ0FOTk9UX0JFX0FfQkFTRV9VUkxfUEFUSCA9IHt9Owp2YXIgUVVFUlkgPSB7fTsKdmFyIEZSQUdNRU5UID0ge307CgovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHMKdmFyIHBhcnNlVVJMID0gZnVuY3Rpb24gKHVybCwgaW5wdXQsIHN0YXRlT3ZlcnJpZGUsIGJhc2UpIHsKICB2YXIgc3RhdGUgPSBzdGF0ZU92ZXJyaWRlIHx8IFNDSEVNRV9TVEFSVDsKICB2YXIgcG9pbnRlciA9IDA7CiAgdmFyIGJ1ZmZlciA9ICcnOwogIHZhciBzZWVuQXQgPSBmYWxzZTsKICB2YXIgc2VlbkJyYWNrZXQgPSBmYWxzZTsKICB2YXIgc2VlblBhc3N3b3JkVG9rZW4gPSBmYWxzZTsKICB2YXIgY29kZVBvaW50cywgY2hhciwgYnVmZmVyQ29kZVBvaW50cywgZmFpbHVyZTsKCiAgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7CiAgICB1cmwuc2NoZW1lID0gJyc7CiAgICB1cmwudXNlcm5hbWUgPSAnJzsKICAgIHVybC5wYXNzd29yZCA9ICcnOwogICAgdXJsLmhvc3QgPSBudWxsOwogICAgdXJsLnBvcnQgPSBudWxsOwogICAgdXJsLnBhdGggPSBbXTsKICAgIHVybC5xdWVyeSA9IG51bGw7CiAgICB1cmwuZnJhZ21lbnQgPSBudWxsOwogICAgdXJsLmNhbm5vdEJlQUJhc2VVUkwgPSBmYWxzZTsKICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZShMRUFESU5HX0FORF9UUkFJTElOR19DMF9DT05UUk9MX09SX1NQQUNFLCAnJyk7CiAgfQoKICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoVEFCX0FORF9ORVdfTElORSwgJycpOwoKICBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKGlucHV0KTsKCiAgd2hpbGUgKHBvaW50ZXIgPD0gY29kZVBvaW50cy5sZW5ndGgpIHsKICAgIGNoYXIgPSBjb2RlUG9pbnRzW3BvaW50ZXJdOwogICAgc3dpdGNoIChzdGF0ZSkgewogICAgICBjYXNlIFNDSEVNRV9TVEFSVDoKICAgICAgICBpZiAoY2hhciAmJiBBTFBIQS50ZXN0KGNoYXIpKSB7CiAgICAgICAgICBidWZmZXIgKz0gY2hhci50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgc3RhdGUgPSBTQ0hFTUU7CiAgICAgICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSkgewogICAgICAgICAgc3RhdGUgPSBOT19TQ0hFTUU7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgcmV0dXJuIElOVkFMSURfU0NIRU1FOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBTQ0hFTUU6CiAgICAgICAgaWYgKGNoYXIgJiYgKEFMUEhBTlVNRVJJQy50ZXN0KGNoYXIpIHx8IGNoYXIgPT0gJysnIHx8IGNoYXIgPT0gJy0nIHx8IGNoYXIgPT0gJy4nKSkgewogICAgICAgICAgYnVmZmVyICs9IGNoYXIudG9Mb3dlckNhc2UoKTsKICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJzonKSB7CiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSAmJiAoCiAgICAgICAgICAgIChpc1NwZWNpYWwodXJsKSAhPSBoYXMoc3BlY2lhbFNjaGVtZXMsIGJ1ZmZlcikpIHx8CiAgICAgICAgICAgIChidWZmZXIgPT0gJ2ZpbGUnICYmIChpbmNsdWRlc0NyZWRlbnRpYWxzKHVybCkgfHwgdXJsLnBvcnQgIT09IG51bGwpKSB8fAogICAgICAgICAgICAodXJsLnNjaGVtZSA9PSAnZmlsZScgJiYgIXVybC5ob3N0KQogICAgICAgICAgKSkgcmV0dXJuOwogICAgICAgICAgdXJsLnNjaGVtZSA9IGJ1ZmZlcjsKICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlKSB7CiAgICAgICAgICAgIGlmIChpc1NwZWNpYWwodXJsKSAmJiBzcGVjaWFsU2NoZW1lc1t1cmwuc2NoZW1lXSA9PSB1cmwucG9ydCkgdXJsLnBvcnQgPSBudWxsOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBidWZmZXIgPSAnJzsKICAgICAgICAgIGlmICh1cmwuc2NoZW1lID09ICdmaWxlJykgewogICAgICAgICAgICBzdGF0ZSA9IEZJTEU7CiAgICAgICAgICB9IGVsc2UgaWYgKGlzU3BlY2lhbCh1cmwpICYmIGJhc2UgJiYgYmFzZS5zY2hlbWUgPT0gdXJsLnNjaGVtZSkgewogICAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfUkVMQVRJVkVfT1JfQVVUSE9SSVRZOwogICAgICAgICAgfSBlbHNlIGlmIChpc1NwZWNpYWwodXJsKSkgewogICAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX1NMQVNIRVM7CiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGVQb2ludHNbcG9pbnRlciArIDFdID09ICcvJykgewogICAgICAgICAgICBzdGF0ZSA9IFBBVEhfT1JfQVVUSE9SSVRZOwogICAgICAgICAgICBwb2ludGVyKys7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1cmwuY2Fubm90QmVBQmFzZVVSTCA9IHRydWU7CiAgICAgICAgICAgIHVybC5wYXRoLnB1c2goJycpOwogICAgICAgICAgICBzdGF0ZSA9IENBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEg7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSkgewogICAgICAgICAgYnVmZmVyID0gJyc7CiAgICAgICAgICBzdGF0ZSA9IE5PX1NDSEVNRTsKICAgICAgICAgIHBvaW50ZXIgPSAwOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfSBlbHNlIHJldHVybiBJTlZBTElEX1NDSEVNRTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgTk9fU0NIRU1FOgogICAgICAgIGlmICghYmFzZSB8fCAoYmFzZS5jYW5ub3RCZUFCYXNlVVJMICYmIGNoYXIgIT0gJyMnKSkgcmV0dXJuIElOVkFMSURfU0NIRU1FOwogICAgICAgIGlmIChiYXNlLmNhbm5vdEJlQUJhc2VVUkwgJiYgY2hhciA9PSAnIycpIHsKICAgICAgICAgIHVybC5zY2hlbWUgPSBiYXNlLnNjaGVtZTsKICAgICAgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7CiAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5OwogICAgICAgICAgdXJsLmZyYWdtZW50ID0gJyc7CiAgICAgICAgICB1cmwuY2Fubm90QmVBQmFzZVVSTCA9IHRydWU7CiAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHN0YXRlID0gYmFzZS5zY2hlbWUgPT0gJ2ZpbGUnID8gRklMRSA6IFJFTEFUSVZFOwogICAgICAgIGNvbnRpbnVlOwoKICAgICAgY2FzZSBTUEVDSUFMX1JFTEFUSVZFX09SX0FVVEhPUklUWToKICAgICAgICBpZiAoY2hhciA9PSAnLycgJiYgY29kZVBvaW50c1twb2ludGVyICsgMV0gPT0gJy8nKSB7CiAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTOwogICAgICAgICAgcG9pbnRlcisrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdGF0ZSA9IFJFTEFUSVZFOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfSBicmVhazsKCiAgICAgIGNhc2UgUEFUSF9PUl9BVVRIT1JJVFk6CiAgICAgICAgaWYgKGNoYXIgPT0gJy8nKSB7CiAgICAgICAgICBzdGF0ZSA9IEFVVEhPUklUWTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdGF0ZSA9IFBBVEg7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICBjYXNlIFJFTEFUSVZFOgogICAgICAgIHVybC5zY2hlbWUgPSBiYXNlLnNjaGVtZTsKICAgICAgICBpZiAoY2hhciA9PSBFT0YpIHsKICAgICAgICAgIHVybC51c2VybmFtZSA9IGJhc2UudXNlcm5hbWU7CiAgICAgICAgICB1cmwucGFzc3dvcmQgPSBiYXNlLnBhc3N3b3JkOwogICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7CiAgICAgICAgICB1cmwucG9ydCA9IGJhc2UucG9ydDsKICAgICAgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7CiAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5OwogICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnLycgfHwgKGNoYXIgPT0gJ1xcJyAmJiBpc1NwZWNpYWwodXJsKSkpIHsKICAgICAgICAgIHN0YXRlID0gUkVMQVRJVkVfU0xBU0g7CiAgICAgICAgfSBlbHNlIGlmIChjaGFyID09ICc/JykgewogICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTsKICAgICAgICAgIHVybC5wYXNzd29yZCA9IGJhc2UucGFzc3dvcmQ7CiAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDsKICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0OwogICAgICAgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTsKICAgICAgICAgIHVybC5xdWVyeSA9ICcnOwogICAgICAgICAgc3RhdGUgPSBRVUVSWTsKICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7CiAgICAgICAgICB1cmwudXNlcm5hbWUgPSBiYXNlLnVzZXJuYW1lOwogICAgICAgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDsKICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0OwogICAgICAgICAgdXJsLnBvcnQgPSBiYXNlLnBvcnQ7CiAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpOwogICAgICAgICAgdXJsLnF1ZXJ5ID0gYmFzZS5xdWVyeTsKICAgICAgICAgIHVybC5mcmFnbWVudCA9ICcnOwogICAgICAgICAgc3RhdGUgPSBGUkFHTUVOVDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTsKICAgICAgICAgIHVybC5wYXNzd29yZCA9IGJhc2UucGFzc3dvcmQ7CiAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDsKICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0OwogICAgICAgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTsKICAgICAgICAgIHVybC5wYXRoLnBvcCgpOwogICAgICAgICAgc3RhdGUgPSBQQVRIOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfSBicmVhazsKCiAgICAgIGNhc2UgUkVMQVRJVkVfU0xBU0g6CiAgICAgICAgaWYgKGlzU3BlY2lhbCh1cmwpICYmIChjaGFyID09ICcvJyB8fCBjaGFyID09ICdcXCcpKSB7CiAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTOwogICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnLycpIHsKICAgICAgICAgIHN0YXRlID0gQVVUSE9SSVRZOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1cmwudXNlcm5hbWUgPSBiYXNlLnVzZXJuYW1lOwogICAgICAgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDsKICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0OwogICAgICAgICAgdXJsLnBvcnQgPSBiYXNlLnBvcnQ7CiAgICAgICAgICBzdGF0ZSA9IFBBVEg7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGJyZWFrOwoKICAgICAgY2FzZSBTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTOgogICAgICAgIHN0YXRlID0gU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVM7CiAgICAgICAgaWYgKGNoYXIgIT0gJy8nIHx8IGJ1ZmZlci5jaGFyQXQocG9pbnRlciArIDEpICE9ICcvJykgY29udGludWU7CiAgICAgICAgcG9pbnRlcisrOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBTUEVDSUFMX0FVVEhPUklUWV9JR05PUkVfU0xBU0hFUzoKICAgICAgICBpZiAoY2hhciAhPSAnLycgJiYgY2hhciAhPSAnXFwnKSB7CiAgICAgICAgICBzdGF0ZSA9IEFVVEhPUklUWTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0gYnJlYWs7CgogICAgICBjYXNlIEFVVEhPUklUWToKICAgICAgICBpZiAoY2hhciA9PSAnQCcpIHsKICAgICAgICAgIGlmIChzZWVuQXQpIGJ1ZmZlciA9ICclNDAnICsgYnVmZmVyOwogICAgICAgICAgc2VlbkF0ID0gdHJ1ZTsKICAgICAgICAgIGJ1ZmZlckNvZGVQb2ludHMgPSBhcnJheUZyb20oYnVmZmVyKTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmZmVyQ29kZVBvaW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgY29kZVBvaW50ID0gYnVmZmVyQ29kZVBvaW50c1tpXTsKICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA9PSAnOicgJiYgIXNlZW5QYXNzd29yZFRva2VuKSB7CiAgICAgICAgICAgICAgc2VlblBhc3N3b3JkVG9rZW4gPSB0cnVlOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBlbmNvZGVkQ29kZVBvaW50cyA9IHBlcmNlbnRFbmNvZGUoY29kZVBvaW50LCB1c2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQpOwogICAgICAgICAgICBpZiAoc2VlblBhc3N3b3JkVG9rZW4pIHVybC5wYXNzd29yZCArPSBlbmNvZGVkQ29kZVBvaW50czsKICAgICAgICAgICAgZWxzZSB1cmwudXNlcm5hbWUgKz0gZW5jb2RlZENvZGVQb2ludHM7CiAgICAgICAgICB9CiAgICAgICAgICBidWZmZXIgPSAnJzsKICAgICAgICB9IGVsc2UgaWYgKAogICAgICAgICAgY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycgfHwKICAgICAgICAgIChjaGFyID09ICdcXCcgJiYgaXNTcGVjaWFsKHVybCkpCiAgICAgICAgKSB7CiAgICAgICAgICBpZiAoc2VlbkF0ICYmIGJ1ZmZlciA9PSAnJykgcmV0dXJuIElOVkFMSURfQVVUSE9SSVRZOwogICAgICAgICAgcG9pbnRlciAtPSBhcnJheUZyb20oYnVmZmVyKS5sZW5ndGggKyAxOwogICAgICAgICAgYnVmZmVyID0gJyc7CiAgICAgICAgICBzdGF0ZSA9IEhPU1Q7CiAgICAgICAgfSBlbHNlIGJ1ZmZlciArPSBjaGFyOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBIT1NUOgogICAgICBjYXNlIEhPU1ROQU1FOgogICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIHVybC5zY2hlbWUgPT0gJ2ZpbGUnKSB7CiAgICAgICAgICBzdGF0ZSA9IEZJTEVfSE9TVDsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnOicgJiYgIXNlZW5CcmFja2V0KSB7CiAgICAgICAgICBpZiAoYnVmZmVyID09ICcnKSByZXR1cm4gSU5WQUxJRF9IT1NUOwogICAgICAgICAgZmFpbHVyZSA9IHBhcnNlSG9zdCh1cmwsIGJ1ZmZlcik7CiAgICAgICAgICBpZiAoZmFpbHVyZSkgcmV0dXJuIGZhaWx1cmU7CiAgICAgICAgICBidWZmZXIgPSAnJzsKICAgICAgICAgIHN0YXRlID0gUE9SVDsKICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlID09IEhPU1ROQU1FKSByZXR1cm47CiAgICAgICAgfSBlbHNlIGlmICgKICAgICAgICAgIGNoYXIgPT0gRU9GIHx8IGNoYXIgPT0gJy8nIHx8IGNoYXIgPT0gJz8nIHx8IGNoYXIgPT0gJyMnIHx8CiAgICAgICAgICAoY2hhciA9PSAnXFwnICYmIGlzU3BlY2lhbCh1cmwpKQogICAgICAgICkgewogICAgICAgICAgaWYgKGlzU3BlY2lhbCh1cmwpICYmIGJ1ZmZlciA9PSAnJykgcmV0dXJuIElOVkFMSURfSE9TVDsKICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIGJ1ZmZlciA9PSAnJyAmJiAoaW5jbHVkZXNDcmVkZW50aWFscyh1cmwpIHx8IHVybC5wb3J0ICE9PSBudWxsKSkgcmV0dXJuOwogICAgICAgICAgZmFpbHVyZSA9IHBhcnNlSG9zdCh1cmwsIGJ1ZmZlcik7CiAgICAgICAgICBpZiAoZmFpbHVyZSkgcmV0dXJuIGZhaWx1cmU7CiAgICAgICAgICBidWZmZXIgPSAnJzsKICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDsKICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlKSByZXR1cm47CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGNoYXIgPT0gJ1snKSBzZWVuQnJhY2tldCA9IHRydWU7CiAgICAgICAgICBlbHNlIGlmIChjaGFyID09ICddJykgc2VlbkJyYWNrZXQgPSBmYWxzZTsKICAgICAgICAgIGJ1ZmZlciArPSBjaGFyOwogICAgICAgIH0gYnJlYWs7CgogICAgICBjYXNlIFBPUlQ6CiAgICAgICAgaWYgKERJR0lULnRlc3QoY2hhcikpIHsKICAgICAgICAgIGJ1ZmZlciArPSBjaGFyOwogICAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgICBjaGFyID09IEVPRiB8fCBjaGFyID09ICcvJyB8fCBjaGFyID09ICc/JyB8fCBjaGFyID09ICcjJyB8fAogICAgICAgICAgKGNoYXIgPT0gJ1xcJyAmJiBpc1NwZWNpYWwodXJsKSkgfHwKICAgICAgICAgIHN0YXRlT3ZlcnJpZGUKICAgICAgICApIHsKICAgICAgICAgIGlmIChidWZmZXIgIT0gJycpIHsKICAgICAgICAgICAgdmFyIHBvcnQgPSBwYXJzZUludChidWZmZXIsIDEwKTsKICAgICAgICAgICAgaWYgKHBvcnQgPiAweEZGRkYpIHJldHVybiBJTlZBTElEX1BPUlQ7CiAgICAgICAgICAgIHVybC5wb3J0ID0gKGlzU3BlY2lhbCh1cmwpICYmIHBvcnQgPT09IHNwZWNpYWxTY2hlbWVzW3VybC5zY2hlbWVdKSA/IG51bGwgOiBwb3J0OwogICAgICAgICAgICBidWZmZXIgPSAnJzsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlKSByZXR1cm47CiAgICAgICAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgcmV0dXJuIElOVkFMSURfUE9SVDsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgRklMRToKICAgICAgICB1cmwuc2NoZW1lID0gJ2ZpbGUnOwogICAgICAgIGlmIChjaGFyID09ICcvJyB8fCBjaGFyID09ICdcXCcpIHN0YXRlID0gRklMRV9TTEFTSDsKICAgICAgICBlbHNlIGlmIChiYXNlICYmIGJhc2Uuc2NoZW1lID09ICdmaWxlJykgewogICAgICAgICAgaWYgKGNoYXIgPT0gRU9GKSB7CiAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0OwogICAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpOwogICAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5OwogICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09ICc/JykgewogICAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDsKICAgICAgICAgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTsKICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gJyc7CiAgICAgICAgICAgIHN0YXRlID0gUVVFUlk7CiAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7CiAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0OwogICAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpOwogICAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5OwogICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJzsKICAgICAgICAgICAgc3RhdGUgPSBGUkFHTUVOVDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghc3RhcnRzV2l0aFdpbmRvd3NEcml2ZUxldHRlcihjb2RlUG9pbnRzLnNsaWNlKHBvaW50ZXIpLmpvaW4oJycpKSkgewogICAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0OwogICAgICAgICAgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7CiAgICAgICAgICAgICAgc2hvcnRlblVSTHNQYXRoKHVybCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUgPSBQQVRIOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUgPSBQQVRIOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfSBicmVhazsKCiAgICAgIGNhc2UgRklMRV9TTEFTSDoKICAgICAgICBpZiAoY2hhciA9PSAnLycgfHwgY2hhciA9PSAnXFwnKSB7CiAgICAgICAgICBzdGF0ZSA9IEZJTEVfSE9TVDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoYmFzZSAmJiBiYXNlLnNjaGVtZSA9PSAnZmlsZScgJiYgIXN0YXJ0c1dpdGhXaW5kb3dzRHJpdmVMZXR0ZXIoY29kZVBvaW50cy5zbGljZShwb2ludGVyKS5qb2luKCcnKSkpIHsKICAgICAgICAgIGlmIChpc1dpbmRvd3NEcml2ZUxldHRlcihiYXNlLnBhdGhbMF0sIHRydWUpKSB1cmwucGF0aC5wdXNoKGJhc2UucGF0aFswXSk7CiAgICAgICAgICBlbHNlIHVybC5ob3N0ID0gYmFzZS5ob3N0OwogICAgICAgIH0KICAgICAgICBzdGF0ZSA9IFBBVEg7CiAgICAgICAgY29udGludWU7CgogICAgICBjYXNlIEZJTEVfSE9TVDoKICAgICAgICBpZiAoY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnXFwnIHx8IGNoYXIgPT0gJz8nIHx8IGNoYXIgPT0gJyMnKSB7CiAgICAgICAgICBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgaXNXaW5kb3dzRHJpdmVMZXR0ZXIoYnVmZmVyKSkgewogICAgICAgICAgICBzdGF0ZSA9IFBBVEg7CiAgICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlciA9PSAnJykgewogICAgICAgICAgICB1cmwuaG9zdCA9ICcnOwogICAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkgcmV0dXJuOwogICAgICAgICAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmYWlsdXJlID0gcGFyc2VIb3N0KHVybCwgYnVmZmVyKTsKICAgICAgICAgICAgaWYgKGZhaWx1cmUpIHJldHVybiBmYWlsdXJlOwogICAgICAgICAgICBpZiAodXJsLmhvc3QgPT0gJ2xvY2FsaG9zdCcpIHVybC5ob3N0ID0gJyc7CiAgICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlKSByZXR1cm47CiAgICAgICAgICAgIGJ1ZmZlciA9ICcnOwogICAgICAgICAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7CiAgICAgICAgICB9IGNvbnRpbnVlOwogICAgICAgIH0gZWxzZSBidWZmZXIgKz0gY2hhcjsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgUEFUSF9TVEFSVDoKICAgICAgICBpZiAoaXNTcGVjaWFsKHVybCkpIHsKICAgICAgICAgIHN0YXRlID0gUEFUSDsKICAgICAgICAgIGlmIChjaGFyICE9ICcvJyAmJiBjaGFyICE9ICdcXCcpIGNvbnRpbnVlOwogICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgY2hhciA9PSAnPycpIHsKICAgICAgICAgIHVybC5xdWVyeSA9ICcnOwogICAgICAgICAgc3RhdGUgPSBRVUVSWTsKICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZU92ZXJyaWRlICYmIGNoYXIgPT0gJyMnKSB7CiAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJzsKICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7CiAgICAgICAgfSBlbHNlIGlmIChjaGFyICE9IEVPRikgewogICAgICAgICAgc3RhdGUgPSBQQVRIOwogICAgICAgICAgaWYgKGNoYXIgIT0gJy8nKSBjb250aW51ZTsKICAgICAgICB9IGJyZWFrOwoKICAgICAgY2FzZSBQQVRIOgogICAgICAgIGlmICgKICAgICAgICAgIGNoYXIgPT0gRU9GIHx8IGNoYXIgPT0gJy8nIHx8CiAgICAgICAgICAoY2hhciA9PSAnXFwnICYmIGlzU3BlY2lhbCh1cmwpKSB8fAogICAgICAgICAgKCFzdGF0ZU92ZXJyaWRlICYmIChjaGFyID09ICc/JyB8fCBjaGFyID09ICcjJykpCiAgICAgICAgKSB7CiAgICAgICAgICBpZiAoaXNEb3VibGVEb3QoYnVmZmVyKSkgewogICAgICAgICAgICBzaG9ydGVuVVJMc1BhdGgodXJsKTsKICAgICAgICAgICAgaWYgKGNoYXIgIT0gJy8nICYmICEoY2hhciA9PSAnXFwnICYmIGlzU3BlY2lhbCh1cmwpKSkgewogICAgICAgICAgICAgIHVybC5wYXRoLnB1c2goJycpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGlzU2luZ2xlRG90KGJ1ZmZlcikpIHsKICAgICAgICAgICAgaWYgKGNoYXIgIT0gJy8nICYmICEoY2hhciA9PSAnXFwnICYmIGlzU3BlY2lhbCh1cmwpKSkgewogICAgICAgICAgICAgIHVybC5wYXRoLnB1c2goJycpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAodXJsLnNjaGVtZSA9PSAnZmlsZScgJiYgIXVybC5wYXRoLmxlbmd0aCAmJiBpc1dpbmRvd3NEcml2ZUxldHRlcihidWZmZXIpKSB7CiAgICAgICAgICAgICAgaWYgKHVybC5ob3N0KSB1cmwuaG9zdCA9ICcnOwogICAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5jaGFyQXQoMCkgKyAnOic7IC8vIG5vcm1hbGl6ZSB3aW5kb3dzIGRyaXZlIGxldHRlcgogICAgICAgICAgICB9CiAgICAgICAgICAgIHVybC5wYXRoLnB1c2goYnVmZmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIGJ1ZmZlciA9ICcnOwogICAgICAgICAgaWYgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmIChjaGFyID09IEVPRiB8fCBjaGFyID09ICc/JyB8fCBjaGFyID09ICcjJykpIHsKICAgICAgICAgICAgd2hpbGUgKHVybC5wYXRoLmxlbmd0aCA+IDEgJiYgdXJsLnBhdGhbMF0gPT09ICcnKSB7CiAgICAgICAgICAgICAgdXJsLnBhdGguc2hpZnQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGNoYXIgPT0gJz8nKSB7CiAgICAgICAgICAgIHVybC5xdWVyeSA9ICcnOwogICAgICAgICAgICBzdGF0ZSA9IFFVRVJZOwogICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09ICcjJykgewogICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJzsKICAgICAgICAgICAgc3RhdGUgPSBGUkFHTUVOVDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnVmZmVyICs9IHBlcmNlbnRFbmNvZGUoY2hhciwgcGF0aFBlcmNlbnRFbmNvZGVTZXQpOwogICAgICAgIH0gYnJlYWs7CgogICAgICBjYXNlIENBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEg6CiAgICAgICAgaWYgKGNoYXIgPT0gJz8nKSB7CiAgICAgICAgICB1cmwucXVlcnkgPSAnJzsKICAgICAgICAgIHN0YXRlID0gUVVFUlk7CiAgICAgICAgfSBlbHNlIGlmIChjaGFyID09ICcjJykgewogICAgICAgICAgdXJsLmZyYWdtZW50ID0gJyc7CiAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UOwogICAgICAgIH0gZWxzZSBpZiAoY2hhciAhPSBFT0YpIHsKICAgICAgICAgIHVybC5wYXRoWzBdICs9IHBlcmNlbnRFbmNvZGUoY2hhciwgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCk7CiAgICAgICAgfSBicmVhazsKCiAgICAgIGNhc2UgUVVFUlk6CiAgICAgICAgaWYgKCFzdGF0ZU92ZXJyaWRlICYmIGNoYXIgPT0gJyMnKSB7CiAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJzsKICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7CiAgICAgICAgfSBlbHNlIGlmIChjaGFyICE9IEVPRikgewogICAgICAgICAgaWYgKGNoYXIgPT0gIiciICYmIGlzU3BlY2lhbCh1cmwpKSB1cmwucXVlcnkgKz0gJyUyNyc7CiAgICAgICAgICBlbHNlIGlmIChjaGFyID09ICcjJykgdXJsLnF1ZXJ5ICs9ICclMjMnOwogICAgICAgICAgZWxzZSB1cmwucXVlcnkgKz0gcGVyY2VudEVuY29kZShjaGFyLCBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0KTsKICAgICAgICB9IGJyZWFrOwoKICAgICAgY2FzZSBGUkFHTUVOVDoKICAgICAgICBpZiAoY2hhciAhPSBFT0YpIHVybC5mcmFnbWVudCArPSBwZXJjZW50RW5jb2RlKGNoYXIsIGZyYWdtZW50UGVyY2VudEVuY29kZVNldCk7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcG9pbnRlcisrOwogIH0KfTsKCi8vIGBVUkxgIGNvbnN0cnVjdG9yCi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsLWNsYXNzCnZhciBVUkxDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIFVSTCh1cmwgLyogLCBiYXNlICovKSB7CiAgdmFyIHRoYXQgPSBhbkluc3RhbmNlKHRoaXMsIFVSTENvbnN0cnVjdG9yLCAnVVJMJyk7CiAgdmFyIGJhc2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDsKICB2YXIgdXJsU3RyaW5nID0gU3RyaW5nKHVybCk7CiAgdmFyIHN0YXRlID0gc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7IHR5cGU6ICdVUkwnIH0pOwogIHZhciBiYXNlU3RhdGUsIGZhaWx1cmU7CiAgaWYgKGJhc2UgIT09IHVuZGVmaW5lZCkgewogICAgaWYgKGJhc2UgaW5zdGFuY2VvZiBVUkxDb25zdHJ1Y3RvcikgYmFzZVN0YXRlID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZShiYXNlKTsKICAgIGVsc2UgewogICAgICBmYWlsdXJlID0gcGFyc2VVUkwoYmFzZVN0YXRlID0ge30sIFN0cmluZyhiYXNlKSk7CiAgICAgIGlmIChmYWlsdXJlKSB0aHJvdyBUeXBlRXJyb3IoZmFpbHVyZSk7CiAgICB9CiAgfQogIGZhaWx1cmUgPSBwYXJzZVVSTChzdGF0ZSwgdXJsU3RyaW5nLCBudWxsLCBiYXNlU3RhdGUpOwogIGlmIChmYWlsdXJlKSB0aHJvdyBUeXBlRXJyb3IoZmFpbHVyZSk7CiAgdmFyIHNlYXJjaFBhcmFtcyA9IHN0YXRlLnNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTsKICB2YXIgc2VhcmNoUGFyYW1zU3RhdGUgPSBnZXRJbnRlcm5hbFNlYXJjaFBhcmFtc1N0YXRlKHNlYXJjaFBhcmFtcyk7CiAgc2VhcmNoUGFyYW1zU3RhdGUudXBkYXRlU2VhcmNoUGFyYW1zKHN0YXRlLnF1ZXJ5KTsKICBzZWFyY2hQYXJhbXNTdGF0ZS51cGRhdGVVUkwgPSBmdW5jdGlvbiAoKSB7CiAgICBzdGF0ZS5xdWVyeSA9IFN0cmluZyhzZWFyY2hQYXJhbXMpIHx8IG51bGw7CiAgfTsKICBpZiAoIURFU0NSSVBUT1JTKSB7CiAgICB0aGF0LmhyZWYgPSBzZXJpYWxpemVVUkwuY2FsbCh0aGF0KTsKICAgIHRoYXQub3JpZ2luID0gZ2V0T3JpZ2luLmNhbGwodGhhdCk7CiAgICB0aGF0LnByb3RvY29sID0gZ2V0UHJvdG9jb2wuY2FsbCh0aGF0KTsKICAgIHRoYXQudXNlcm5hbWUgPSBnZXRVc2VybmFtZS5jYWxsKHRoYXQpOwogICAgdGhhdC5wYXNzd29yZCA9IGdldFBhc3N3b3JkLmNhbGwodGhhdCk7CiAgICB0aGF0Lmhvc3QgPSBnZXRIb3N0LmNhbGwodGhhdCk7CiAgICB0aGF0Lmhvc3RuYW1lID0gZ2V0SG9zdG5hbWUuY2FsbCh0aGF0KTsKICAgIHRoYXQucG9ydCA9IGdldFBvcnQuY2FsbCh0aGF0KTsKICAgIHRoYXQucGF0aG5hbWUgPSBnZXRQYXRobmFtZS5jYWxsKHRoYXQpOwogICAgdGhhdC5zZWFyY2ggPSBnZXRTZWFyY2guY2FsbCh0aGF0KTsKICAgIHRoYXQuc2VhcmNoUGFyYW1zID0gZ2V0U2VhcmNoUGFyYW1zLmNhbGwodGhhdCk7CiAgICB0aGF0Lmhhc2ggPSBnZXRIYXNoLmNhbGwodGhhdCk7CiAgfQp9OwoKdmFyIFVSTFByb3RvdHlwZSA9IFVSTENvbnN0cnVjdG9yLnByb3RvdHlwZTsKCnZhciBzZXJpYWxpemVVUkwgPSBmdW5jdGlvbiAoKSB7CiAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CiAgdmFyIHNjaGVtZSA9IHVybC5zY2hlbWU7CiAgdmFyIHVzZXJuYW1lID0gdXJsLnVzZXJuYW1lOwogIHZhciBwYXNzd29yZCA9IHVybC5wYXNzd29yZDsKICB2YXIgaG9zdCA9IHVybC5ob3N0OwogIHZhciBwb3J0ID0gdXJsLnBvcnQ7CiAgdmFyIHBhdGggPSB1cmwucGF0aDsKICB2YXIgcXVlcnkgPSB1cmwucXVlcnk7CiAgdmFyIGZyYWdtZW50ID0gdXJsLmZyYWdtZW50OwogIHZhciBvdXRwdXQgPSBzY2hlbWUgKyAnOic7CiAgaWYgKGhvc3QgIT09IG51bGwpIHsKICAgIG91dHB1dCArPSAnLy8nOwogICAgaWYgKGluY2x1ZGVzQ3JlZGVudGlhbHModXJsKSkgewogICAgICBvdXRwdXQgKz0gdXNlcm5hbWUgKyAocGFzc3dvcmQgPyAnOicgKyBwYXNzd29yZCA6ICcnKSArICdAJzsKICAgIH0KICAgIG91dHB1dCArPSBzZXJpYWxpemVIb3N0KGhvc3QpOwogICAgaWYgKHBvcnQgIT09IG51bGwpIG91dHB1dCArPSAnOicgKyBwb3J0OwogIH0gZWxzZSBpZiAoc2NoZW1lID09ICdmaWxlJykgb3V0cHV0ICs9ICcvLyc7CiAgb3V0cHV0ICs9IHVybC5jYW5ub3RCZUFCYXNlVVJMID8gcGF0aFswXSA6IHBhdGgubGVuZ3RoID8gJy8nICsgcGF0aC5qb2luKCcvJykgOiAnJzsKICBpZiAocXVlcnkgIT09IG51bGwpIG91dHB1dCArPSAnPycgKyBxdWVyeTsKICBpZiAoZnJhZ21lbnQgIT09IG51bGwpIG91dHB1dCArPSAnIycgKyBmcmFnbWVudDsKICByZXR1cm4gb3V0cHV0Owp9OwoKdmFyIGdldE9yaWdpbiA9IGZ1bmN0aW9uICgpIHsKICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTsKICB2YXIgc2NoZW1lID0gdXJsLnNjaGVtZTsKICB2YXIgcG9ydCA9IHVybC5wb3J0OwogIGlmIChzY2hlbWUgPT0gJ2Jsb2InKSB0cnkgewogICAgcmV0dXJuIG5ldyBVUkwoc2NoZW1lLnBhdGhbMF0pLm9yaWdpbjsKICB9IGNhdGNoIChlcnJvcikgewogICAgcmV0dXJuICdudWxsJzsKICB9CiAgaWYgKHNjaGVtZSA9PSAnZmlsZScgfHwgIWlzU3BlY2lhbCh1cmwpKSByZXR1cm4gJ251bGwnOwogIHJldHVybiBzY2hlbWUgKyAnOi8vJyArIHNlcmlhbGl6ZUhvc3QodXJsLmhvc3QpICsgKHBvcnQgIT09IG51bGwgPyAnOicgKyBwb3J0IDogJycpOwp9OwoKdmFyIGdldFByb3RvY29sID0gZnVuY3Rpb24gKCkgewogIHJldHVybiBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLnNjaGVtZSArICc6JzsKfTsKCnZhciBnZXRVc2VybmFtZSA9IGZ1bmN0aW9uICgpIHsKICByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS51c2VybmFtZTsKfTsKCnZhciBnZXRQYXNzd29yZCA9IGZ1bmN0aW9uICgpIHsKICByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5wYXNzd29yZDsKfTsKCnZhciBnZXRIb3N0ID0gZnVuY3Rpb24gKCkgewogIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpOwogIHZhciBob3N0ID0gdXJsLmhvc3Q7CiAgdmFyIHBvcnQgPSB1cmwucG9ydDsKICByZXR1cm4gaG9zdCA9PT0gbnVsbCA/ICcnCiAgICA6IHBvcnQgPT09IG51bGwgPyBzZXJpYWxpemVIb3N0KGhvc3QpCiAgICA6IHNlcmlhbGl6ZUhvc3QoaG9zdCkgKyAnOicgKyBwb3J0Owp9OwoKdmFyIGdldEhvc3RuYW1lID0gZnVuY3Rpb24gKCkgewogIHZhciBob3N0ID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5ob3N0OwogIHJldHVybiBob3N0ID09PSBudWxsID8gJycgOiBzZXJpYWxpemVIb3N0KGhvc3QpOwp9OwoKdmFyIGdldFBvcnQgPSBmdW5jdGlvbiAoKSB7CiAgdmFyIHBvcnQgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLnBvcnQ7CiAgcmV0dXJuIHBvcnQgPT09IG51bGwgPyAnJyA6IFN0cmluZyhwb3J0KTsKfTsKCnZhciBnZXRQYXRobmFtZSA9IGZ1bmN0aW9uICgpIHsKICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTsKICB2YXIgcGF0aCA9IHVybC5wYXRoOwogIHJldHVybiB1cmwuY2Fubm90QmVBQmFzZVVSTCA/IHBhdGhbMF0gOiBwYXRoLmxlbmd0aCA/ICcvJyArIHBhdGguam9pbignLycpIDogJyc7Cn07Cgp2YXIgZ2V0U2VhcmNoID0gZnVuY3Rpb24gKCkgewogIHZhciBxdWVyeSA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcykucXVlcnk7CiAgcmV0dXJuIHF1ZXJ5ID8gJz8nICsgcXVlcnkgOiAnJzsKfTsKCnZhciBnZXRTZWFyY2hQYXJhbXMgPSBmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIGdldEludGVybmFsVVJMU3RhdGUodGhpcykuc2VhcmNoUGFyYW1zOwp9OwoKdmFyIGdldEhhc2ggPSBmdW5jdGlvbiAoKSB7CiAgdmFyIGZyYWdtZW50ID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5mcmFnbWVudDsKICByZXR1cm4gZnJhZ21lbnQgPyAnIycgKyBmcmFnbWVudCA6ICcnOwp9OwoKdmFyIGFjY2Vzc29yRGVzY3JpcHRvciA9IGZ1bmN0aW9uIChnZXR0ZXIsIHNldHRlcikgewogIHJldHVybiB7IGdldDogZ2V0dGVyLCBzZXQ6IHNldHRlciwgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlIH07Cn07CgppZiAoREVTQ1JJUFRPUlMpIHsKICBkZWZpbmVQcm9wZXJ0aWVzKFVSTFByb3RvdHlwZSwgewogICAgLy8gYFVSTC5wcm90b3R5cGUuaHJlZmAgYWNjZXNzb3JzIHBhaXIKICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1ocmVmCiAgICBocmVmOiBhY2Nlc3NvckRlc2NyaXB0b3Ioc2VyaWFsaXplVVJMLCBmdW5jdGlvbiAoaHJlZikgewogICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTsKICAgICAgdmFyIHVybFN0cmluZyA9IFN0cmluZyhocmVmKTsKICAgICAgdmFyIGZhaWx1cmUgPSBwYXJzZVVSTCh1cmwsIHVybFN0cmluZyk7CiAgICAgIGlmIChmYWlsdXJlKSB0aHJvdyBUeXBlRXJyb3IoZmFpbHVyZSk7CiAgICAgIGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUodXJsLnNlYXJjaFBhcmFtcykudXBkYXRlU2VhcmNoUGFyYW1zKHVybC5xdWVyeSk7CiAgICB9KSwKICAgIC8vIGBVUkwucHJvdG90eXBlLm9yaWdpbmAgZ2V0dGVyCiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtb3JpZ2luCiAgICBvcmlnaW46IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRPcmlnaW4pLAogICAgLy8gYFVSTC5wcm90b3R5cGUucHJvdG9jb2xgIGFjY2Vzc29ycyBwYWlyCiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcHJvdG9jb2wKICAgIHByb3RvY29sOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UHJvdG9jb2wsIGZ1bmN0aW9uIChwcm90b2NvbCkgewogICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTsKICAgICAgcGFyc2VVUkwodXJsLCBTdHJpbmcocHJvdG9jb2wpICsgJzonLCBTQ0hFTUVfU1RBUlQpOwogICAgfSksCiAgICAvLyBgVVJMLnByb3RvdHlwZS51c2VybmFtZWAgYWNjZXNzb3JzIHBhaXIKICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC11c2VybmFtZQogICAgdXNlcm5hbWU6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRVc2VybmFtZSwgZnVuY3Rpb24gKHVzZXJuYW1lKSB7CiAgICAgIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpOwogICAgICB2YXIgY29kZVBvaW50cyA9IGFycmF5RnJvbShTdHJpbmcodXNlcm5hbWUpKTsKICAgICAgaWYgKGNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCh1cmwpKSByZXR1cm47CiAgICAgIHVybC51c2VybmFtZSA9ICcnOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVQb2ludHMubGVuZ3RoOyBpKyspIHsKICAgICAgICB1cmwudXNlcm5hbWUgKz0gcGVyY2VudEVuY29kZShjb2RlUG9pbnRzW2ldLCB1c2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQpOwogICAgICB9CiAgICB9KSwKICAgIC8vIGBVUkwucHJvdG90eXBlLnBhc3N3b3JkYCBhY2Nlc3NvcnMgcGFpcgogICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXBhc3N3b3JkCiAgICBwYXNzd29yZDogYWNjZXNzb3JEZXNjcmlwdG9yKGdldFBhc3N3b3JkLCBmdW5jdGlvbiAocGFzc3dvcmQpIHsKICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CiAgICAgIHZhciBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKFN0cmluZyhwYXNzd29yZCkpOwogICAgICBpZiAoY2Fubm90SGF2ZVVzZXJuYW1lUGFzc3dvcmRQb3J0KHVybCkpIHJldHVybjsKICAgICAgdXJsLnBhc3N3b3JkID0gJyc7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZVBvaW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIHVybC5wYXNzd29yZCArPSBwZXJjZW50RW5jb2RlKGNvZGVQb2ludHNbaV0sIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCk7CiAgICAgIH0KICAgIH0pLAogICAgLy8gYFVSTC5wcm90b3R5cGUuaG9zdGAgYWNjZXNzb3JzIHBhaXIKICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1ob3N0CiAgICBob3N0OiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0SG9zdCwgZnVuY3Rpb24gKGhvc3QpIHsKICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CiAgICAgIGlmICh1cmwuY2Fubm90QmVBQmFzZVVSTCkgcmV0dXJuOwogICAgICBwYXJzZVVSTCh1cmwsIFN0cmluZyhob3N0KSwgSE9TVCk7CiAgICB9KSwKICAgIC8vIGBVUkwucHJvdG90eXBlLmhvc3RuYW1lYCBhY2Nlc3NvcnMgcGFpcgogICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLWhvc3RuYW1lCiAgICBob3N0bmFtZTogYWNjZXNzb3JEZXNjcmlwdG9yKGdldEhvc3RuYW1lLCBmdW5jdGlvbiAoaG9zdG5hbWUpIHsKICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CiAgICAgIGlmICh1cmwuY2Fubm90QmVBQmFzZVVSTCkgcmV0dXJuOwogICAgICBwYXJzZVVSTCh1cmwsIFN0cmluZyhob3N0bmFtZSksIEhPU1ROQU1FKTsKICAgIH0pLAogICAgLy8gYFVSTC5wcm90b3R5cGUucG9ydGAgYWNjZXNzb3JzIHBhaXIKICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1wb3J0CiAgICBwb3J0OiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UG9ydCwgZnVuY3Rpb24gKHBvcnQpIHsKICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CiAgICAgIGlmIChjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQodXJsKSkgcmV0dXJuOwogICAgICBwb3J0ID0gU3RyaW5nKHBvcnQpOwogICAgICBpZiAocG9ydCA9PSAnJykgdXJsLnBvcnQgPSBudWxsOwogICAgICBlbHNlIHBhcnNlVVJMKHVybCwgcG9ydCwgUE9SVCk7CiAgICB9KSwKICAgIC8vIGBVUkwucHJvdG90eXBlLnBhdGhuYW1lYCBhY2Nlc3NvcnMgcGFpcgogICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXBhdGhuYW1lCiAgICBwYXRobmFtZTogYWNjZXNzb3JEZXNjcmlwdG9yKGdldFBhdGhuYW1lLCBmdW5jdGlvbiAocGF0aG5hbWUpIHsKICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CiAgICAgIGlmICh1cmwuY2Fubm90QmVBQmFzZVVSTCkgcmV0dXJuOwogICAgICB1cmwucGF0aCA9IFtdOwogICAgICBwYXJzZVVSTCh1cmwsIHBhdGhuYW1lICsgJycsIFBBVEhfU1RBUlQpOwogICAgfSksCiAgICAvLyBgVVJMLnByb3RvdHlwZS5zZWFyY2hgIGFjY2Vzc29ycyBwYWlyCiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtc2VhcmNoCiAgICBzZWFyY2g6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRTZWFyY2gsIGZ1bmN0aW9uIChzZWFyY2gpIHsKICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CiAgICAgIHNlYXJjaCA9IFN0cmluZyhzZWFyY2gpOwogICAgICBpZiAoc2VhcmNoID09ICcnKSB7CiAgICAgICAgdXJsLnF1ZXJ5ID0gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoJz8nID09IHNlYXJjaC5jaGFyQXQoMCkpIHNlYXJjaCA9IHNlYXJjaC5zbGljZSgxKTsKICAgICAgICB1cmwucXVlcnkgPSAnJzsKICAgICAgICBwYXJzZVVSTCh1cmwsIHNlYXJjaCwgUVVFUlkpOwogICAgICB9CiAgICAgIGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUodXJsLnNlYXJjaFBhcmFtcykudXBkYXRlU2VhcmNoUGFyYW1zKHVybC5xdWVyeSk7CiAgICB9KSwKICAgIC8vIGBVUkwucHJvdG90eXBlLnNlYXJjaFBhcmFtc2AgZ2V0dGVyCiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtc2VhcmNocGFyYW1zCiAgICBzZWFyY2hQYXJhbXM6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRTZWFyY2hQYXJhbXMpLAogICAgLy8gYFVSTC5wcm90b3R5cGUuaGFzaGAgYWNjZXNzb3JzIHBhaXIKICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1oYXNoCiAgICBoYXNoOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0SGFzaCwgZnVuY3Rpb24gKGhhc2gpIHsKICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7CiAgICAgIGhhc2ggPSBTdHJpbmcoaGFzaCk7CiAgICAgIGlmIChoYXNoID09ICcnKSB7CiAgICAgICAgdXJsLmZyYWdtZW50ID0gbnVsbDsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCcjJyA9PSBoYXNoLmNoYXJBdCgwKSkgaGFzaCA9IGhhc2guc2xpY2UoMSk7CiAgICAgIHVybC5mcmFnbWVudCA9ICcnOwogICAgICBwYXJzZVVSTCh1cmwsIGhhc2gsIEZSQUdNRU5UKTsKICAgIH0pCiAgfSk7Cn0KCi8vIGBVUkwucHJvdG90eXBlLnRvSlNPTmAgbWV0aG9kCi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC10b2pzb24KcmVkZWZpbmUoVVJMUHJvdG90eXBlLCAndG9KU09OJywgZnVuY3Rpb24gdG9KU09OKCkgewogIHJldHVybiBzZXJpYWxpemVVUkwuY2FsbCh0aGlzKTsKfSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pOwoKLy8gYFVSTC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZAovLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI1VSTC1zdHJpbmdpZmljYXRpb24tYmVoYXZpb3IKcmVkZWZpbmUoVVJMUHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHsKICByZXR1cm4gc2VyaWFsaXplVVJMLmNhbGwodGhpcyk7Cn0sIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTsKCmlmIChOYXRpdmVVUkwpIHsKICB2YXIgbmF0aXZlQ3JlYXRlT2JqZWN0VVJMID0gTmF0aXZlVVJMLmNyZWF0ZU9iamVjdFVSTDsKICB2YXIgbmF0aXZlUmV2b2tlT2JqZWN0VVJMID0gTmF0aXZlVVJMLnJldm9rZU9iamVjdFVSTDsKICAvLyBgVVJMLmNyZWF0ZU9iamVjdFVSTGAgbWV0aG9kCiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1VSTC9jcmVhdGVPYmplY3RVUkwKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMKICBpZiAobmF0aXZlQ3JlYXRlT2JqZWN0VVJMKSByZWRlZmluZShVUkxDb25zdHJ1Y3RvciwgJ2NyZWF0ZU9iamVjdFVSTCcsIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTChibG9iKSB7CiAgICByZXR1cm4gbmF0aXZlQ3JlYXRlT2JqZWN0VVJMLmFwcGx5KE5hdGl2ZVVSTCwgYXJndW1lbnRzKTsKICB9KTsKICAvLyBgVVJMLnJldm9rZU9iamVjdFVSTGAgbWV0aG9kCiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1VSTC9yZXZva2VPYmplY3RVUkwKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMKICBpZiAobmF0aXZlUmV2b2tlT2JqZWN0VVJMKSByZWRlZmluZShVUkxDb25zdHJ1Y3RvciwgJ3Jldm9rZU9iamVjdFVSTCcsIGZ1bmN0aW9uIHJldm9rZU9iamVjdFVSTCh1cmwpIHsKICAgIHJldHVybiBuYXRpdmVSZXZva2VPYmplY3RVUkwuYXBwbHkoTmF0aXZlVVJMLCBhcmd1bWVudHMpOwogIH0pOwp9CgpzZXRUb1N0cmluZ1RhZyhVUkxDb25zdHJ1Y3RvciwgJ1VSTCcpOwoKJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiAhVVNFX05BVElWRV9VUkwsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7CiAgVVJMOiBVUkxDb25zdHJ1Y3Rvcgp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC50by1qc29uLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC50by1qc29uLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKInVzZSBzdHJpY3QiOwoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiKTsKCi8vIGBVUkwucHJvdG90eXBlLnRvSlNPTmAgbWV0aG9kCi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC10b2pzb24KJCh7IHRhcmdldDogJ1VSTCcsIHByb3RvOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlIH0sIHsKICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTigpIHsKICAgIHJldHVybiBVUkwucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcyk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9hcnJheS1pcy10ZW1wbGF0ZS1vYmplY3QuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvYXJyYXktaXMtdGVtcGxhdGUtb2JqZWN0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5hcnJheS5pcy10ZW1wbGF0ZS1vYmplY3QgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXJyYXkuaXMtdGVtcGxhdGUtb2JqZWN0LmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvYXJyYXktbGFzdC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvYXJyYXktbGFzdC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LmFycmF5Lmxhc3QtaW5kZXggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXJyYXkubGFzdC1pbmRleC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5hcnJheS5sYXN0LWl0ZW0gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXJyYXkubGFzdC1pdGVtLmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvY29sbGVjdGlvbi1tZXRob2RzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2NvbGxlY3Rpb24tbWV0aG9kcy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWFwLmdyb3VwLWJ5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5ncm91cC1ieS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXAua2V5LWJ5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5rZXktYnkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWFwLmRlbGV0ZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmRlbGV0ZS1hbGwuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWFwLmV2ZXJ5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5ldmVyeS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXAuZmlsdGVyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5maWx0ZXIuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWFwLmZpbmQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmZpbmQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWFwLmZpbmQta2V5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5maW5kLWtleS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXAuaW5jbHVkZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmluY2x1ZGVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hcC5rZXktb2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmtleS1vZi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXAubWFwLWtleXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLm1hcC1rZXlzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hcC5tYXAtdmFsdWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5tYXAtdmFsdWVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hcC5tZXJnZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAubWVyZ2UuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWFwLnJlZHVjZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAucmVkdWNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hcC5zb21lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5zb21lLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hcC51cGRhdGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLnVwZGF0ZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQuYWRkLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuYWRkLWFsbC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQuZGVsZXRlLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZGVsZXRlLWFsbC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQuZXZlcnkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmV2ZXJ5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnNldC5maWx0ZXIgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmZpbHRlci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQuZmluZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZmluZC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQuam9pbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuam9pbi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQubWFwICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5tYXAuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuc2V0LnJlZHVjZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQucmVkdWNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnNldC5zb21lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5zb21lLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LndlYWstbWFwLmRlbGV0ZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1tYXAuZGVsZXRlLWFsbC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC53ZWFrLXNldC5hZGQtYWxsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LndlYWstc2V0LmFkZC1hbGwuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQud2Vhay1zZXQuZGVsZXRlLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLXNldC5kZWxldGUtYWxsLmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvY29sbGVjdGlvbi1vZi1mcm9tLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2NvbGxlY3Rpb24tb2YtZnJvbS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWFwLmZyb20gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmZyb20uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWFwLm9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5vZi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQuZnJvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZnJvbS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQub2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0Lm9mLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LndlYWstbWFwLmZyb20gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1tYXAuZnJvbS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC5vZiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC5vZi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC53ZWFrLXNldC5mcm9tICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LndlYWstc2V0LmZyb20uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQud2Vhay1zZXQub2YgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1zZXQub2YuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9lZmZpY2llbnQtNjQtYml0LWFyaXRobWV0aWMuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvZWZmaWNpZW50LTY0LWJpdC1hcml0aG1ldGljLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXRoLmlhZGRoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguaWFkZGguanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWF0aC5pc3ViaCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmlzdWJoLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hdGguaW11bGggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5pbXVsaC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXRoLnVtdWxoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGgudW11bGguanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9nbG9iYWwtdGhpcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2dsb2JhbC10aGlzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5nbG9iYWwtdGhpcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5nbG9iYWwtdGhpcy5qcyIpOwp2YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IGdsb2JhbDsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9pbmRleC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2luZGV4LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3N0YWdlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3N0YWdlL2luZGV4LmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvaXRlcmF0b3ItaGVscGVycy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvaXRlcmF0b3ItaGVscGVycy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmNvbnN0cnVjdG9yLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmFzLWluZGV4ZWQtcGFpcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuYXMtaW5kZXhlZC1wYWlycy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5kcm9wICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmRyb3AuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZXZlcnkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZXZlcnkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZmlsdGVyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmZpbHRlci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5maW5kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmZpbmQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZmxhdC1tYXAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZmxhdC1tYXAuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZm9yLWVhY2ggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZm9yLWVhY2guanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZnJvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5mcm9tLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLm1hcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5tYXAuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IucmVkdWNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLnJlZHVjZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5zb21lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLnNvbWUuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IudGFrZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci50YWtlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLnRvLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLnRvLWFycmF5LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmNvbnN0cnVjdG9yICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmNvbnN0cnVjdG9yLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmFzLWluZGV4ZWQtcGFpcnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuYXMtaW5kZXhlZC1wYWlycy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5kcm9wICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmRyb3AuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZXZlcnkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZXZlcnkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmlsdGVyICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZpbHRlci5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5maW5kICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZpbmQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmxhdC1tYXAgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmxhdC1tYXAuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZm9yLWVhY2ggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZm9yLWVhY2guanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZnJvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5mcm9tLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLm1hcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5tYXAuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuaXRlcmF0b3IucmVkdWNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLnJlZHVjZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5zb21lICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLnNvbWUuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuaXRlcmF0b3IudGFrZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci50YWtlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLnRvLWFycmF5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLnRvLWFycmF5LmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMva2V5cy1jb21wb3NpdGlvbi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMva2V5cy1jb21wb3NpdGlvbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LmNvbXBvc2l0ZS1rZXkgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuY29tcG9zaXRlLWtleS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5jb21wb3NpdGUtc3ltYm9sICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmNvbXBvc2l0ZS1zeW1ib2wuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9tYXAtdXBzZXJ0LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9tYXAtdXBzZXJ0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RodW1ic3VwZXAvcHJvcG9zYWwtdXBzZXJ0Ci8vIFRPRE86IHJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hcC51cGRhdGUtb3ItaW5zZXJ0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC51cGRhdGUtb3ItaW5zZXJ0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hcC51cHNlcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLnVwc2VydC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC51cHNlcnQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1tYXAudXBzZXJ0LmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvbWF0aC1leHRlbnNpb25zLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL21hdGgtZXh0ZW5zaW9ucy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQubWF0aC5jbGFtcCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmNsYW1wLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hdGguZGVnLXBlci1yYWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5kZWctcGVyLXJhZC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXRoLmRlZ3JlZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5kZWdyZWVzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hdGguZnNjYWxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguZnNjYWxlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hdGgucmFkLXBlci1kZWcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5yYWQtcGVyLWRlZy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXRoLnJhZGlhbnMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5yYWRpYW5zLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hdGguc2NhbGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5zY2FsZS5qcyIpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL21hdGgtc2lnbmJpdC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9tYXRoLXNpZ25iaXQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm1hdGguc2lnbmJpdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLnNpZ25iaXQuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9udW1iZXItZnJvbS1zdHJpbmcuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvbnVtYmVyLWZyb20tc3RyaW5nLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5udW1iZXIuZnJvbS1zdHJpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubnVtYmVyLmZyb20tc3RyaW5nLmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvb2JqZWN0LWl0ZXJhdGlvbi5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvb2JqZWN0LWl0ZXJhdGlvbi5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0Lm9iamVjdC5pdGVyYXRlLWVudHJpZXMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQub2JqZWN0Lml0ZXJhdGUtZW50cmllcy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5vYmplY3QuaXRlcmF0ZS1rZXlzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm9iamVjdC5pdGVyYXRlLWtleXMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQub2JqZWN0Lml0ZXJhdGUtdmFsdWVzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm9iamVjdC5pdGVyYXRlLXZhbHVlcy5qcyIpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL29ic2VydmFibGUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL29ic2VydmFibGUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5vYnNlcnZhYmxlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm9ic2VydmFibGUuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLm9ic2VydmFibGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3ltYm9sLm9ic2VydmFibGUuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9wYXR0ZXJuLW1hdGNoaW5nLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9wYXR0ZXJuLW1hdGNoaW5nLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLnBhdHRlcm4tbWF0Y2ggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3ltYm9sLnBhdHRlcm4tbWF0Y2guanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9wcm9taXNlLWFsbC1zZXR0bGVkLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9wcm9taXNlLWFsbC1zZXR0bGVkLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGAKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQucHJvbWlzZS5hbGwtc2V0dGxlZCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvcHJvbWlzZS1hbnkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9wcm9taXNlLWFueS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5hZ2dyZWdhdGUtZXJyb3IgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYWdncmVnYXRlLWVycm9yLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnByb21pc2UuYW55ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnByb21pc2UuYW55LmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvcHJvbWlzZS10cnkuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9wcm9taXNlLXRyeS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLnRyeSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLnRyeS5qcyIpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3JlZmxlY3QtbWV0YWRhdGEuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3JlZmxlY3QtbWV0YWRhdGEuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmRlZmluZS1tZXRhZGF0YSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmRlZmluZS1tZXRhZGF0YS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmRlbGV0ZS1tZXRhZGF0YSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmRlbGV0ZS1tZXRhZGF0YS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1tZXRhZGF0YSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1tZXRhZGF0YS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1tZXRhZGF0YS1rZXlzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLWtleXMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEta2V5cyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEta2V5cy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0Lmhhcy1tZXRhZGF0YSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0Lmhhcy1tZXRhZGF0YS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0Lmhhcy1vd24tbWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5oYXMtb3duLW1ldGFkYXRhLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QubWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5tZXRhZGF0YS5qcyIpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3NlZWRlZC1yYW5kb20uanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3NlZWRlZC1yYW5kb20uanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5tYXRoLnNlZWRlZC1wcm5nICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguc2VlZGVkLXBybmcuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9zZXQtbWV0aG9kcy5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3NldC1tZXRob2RzLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnNldC5kaWZmZXJlbmNlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5kaWZmZXJlbmNlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnNldC5pbnRlcnNlY3Rpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmludGVyc2VjdGlvbi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQuaXMtZGlzam9pbnQtZnJvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuaXMtZGlzam9pbnQtZnJvbS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQuaXMtc3Vic2V0LW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5pcy1zdWJzZXQtb2YuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuc2V0LmlzLXN1cGVyc2V0LW9mICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5pcy1zdXBlcnNldC1vZi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zZXQudW5pb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LnVuaW9uLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnNldC5zeW1tZXRyaWMtZGlmZmVyZW5jZSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuc3ltbWV0cmljLWRpZmZlcmVuY2UuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9zdHJpbmctYXQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvc3RyaW5nLWF0LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zdHJpbmcuYXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3RyaW5nLmF0LmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvc3RyaW5nLWNvZGUtcG9pbnRzLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3N0cmluZy1jb2RlLXBvaW50cy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lc25leHQuc3RyaW5nLmNvZGUtcG9pbnRzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN0cmluZy5jb2RlLXBvaW50cy5qcyIpOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3N0cmluZy1tYXRjaC1hbGwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3N0cmluZy1tYXRjaC1hbGwuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgovLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YApfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zdHJpbmcubWF0Y2gtYWxsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN0cmluZy5tYXRjaC1hbGwuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9zdHJpbmctcmVwbGFjZS1hbGwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvc3RyaW5nLXJlcGxhY2UtYWxsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzbmV4dC5zdHJpbmcucmVwbGFjZS1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3RyaW5nLnJlcGxhY2UtYWxsLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5yZXBsYWNlLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zeW1ib2wucmVwbGFjZS1hbGwuanMiKTsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy91cmwuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvdXJsLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL3dlYi51cmwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvd2ViLnVybC50by1qc29uICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC50by1qc29uLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvdXNpbmctc3RhdGVtZW50LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3VzaW5nLXN0YXRlbWVudC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtdXNpbmctc3RhdGVtZW50Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5hc3luYy1kaXNwb3NlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5hc3luYy1kaXNwb3NlLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5kaXNwb3NlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5kaXNwb3NlLmpzIik7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS8wLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvMC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9lZmZpY2llbnQtNjQtYml0LWFyaXRobWV0aWMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2VmZmljaWVudC02NC1iaXQtYXJpdGhtZXRpYy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9wcm9wb3NhbHMvc3RyaW5nLWF0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9zdHJpbmctYXQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL3VybCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvdXJsLmpzIik7CnZhciBwYXJlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLzEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvMS5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS8xLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvMS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9hcnJheS1sYXN0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9hcnJheS1sYXN0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9jb2xsZWN0aW9uLW1ldGhvZHMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2NvbGxlY3Rpb24tbWV0aG9kcy5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9wcm9wb3NhbHMvY29sbGVjdGlvbi1vZi1mcm9tICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9jb2xsZWN0aW9uLW9mLWZyb20uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL2tleXMtY29tcG9zaXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2tleXMtY29tcG9zaXRpb24uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL21hdGgtZXh0ZW5zaW9ucyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvbWF0aC1leHRlbnNpb25zLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9tYXRoLXNpZ25iaXQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL21hdGgtc2lnbmJpdC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9wcm9wb3NhbHMvbnVtYmVyLWZyb20tc3RyaW5nICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9udW1iZXItZnJvbS1zdHJpbmcuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL29iamVjdC1pdGVyYXRpb24gKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL29iamVjdC1pdGVyYXRpb24uanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL29ic2VydmFibGUgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL29ic2VydmFibGUuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL3BhdHRlcm4tbWF0Y2hpbmcgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3BhdHRlcm4tbWF0Y2hpbmcuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL3Byb21pc2UtdHJ5ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9wcm9taXNlLXRyeS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9wcm9wb3NhbHMvc2VlZGVkLXJhbmRvbSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvc2VlZGVkLXJhbmRvbS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9wcm9wb3NhbHMvc3RyaW5nLWNvZGUtcG9pbnRzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9zdHJpbmctY29kZS1wb2ludHMuanMiKTsKdmFyIHBhcmVudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vMiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS8yLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IHBhcmVudDsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3N0YWdlLzIuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS8yLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL2FycmF5LWlzLXRlbXBsYXRlLW9iamVjdCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvYXJyYXktaXMtdGVtcGxhdGUtb2JqZWN0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9pdGVyYXRvci1oZWxwZXJzICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9pdGVyYXRvci1oZWxwZXJzLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9tYXAtdXBzZXJ0ICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9tYXAtdXBzZXJ0LmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9zZXQtbWV0aG9kcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvc2V0LW1ldGhvZHMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL3VzaW5nLXN0YXRlbWVudCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvdXNpbmctc3RhdGVtZW50LmpzIik7CnZhciBwYXJlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLzMgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvMy5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS8zLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvMy5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9wcm9taXNlLWFueSAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvcHJvbWlzZS1hbnkuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL3N0cmluZy1yZXBsYWNlLWFsbCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvc3RyaW5nLXJlcGxhY2UtYWxsLmpzIik7CnZhciBwYXJlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLzQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvNC5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS80LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvNC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL3Byb3Bvc2Fscy9nbG9iYWwtdGhpcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvZ2xvYmFsLXRoaXMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL3Byb21pc2UtYWxsLXNldHRsZWQgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3Byb21pc2UtYWxsLXNldHRsZWQuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL3N0cmluZy1tYXRjaC1hbGwgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3N0cmluZy1tYXRjaC1hbGwuanMiKTsKdmFyIHBhdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGF0aCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBwYXRoOwoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvaW5kZXguanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvaW5kZXguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKdmFyIHByb3Bvc2FscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcHJlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3N0YWdlL3ByZS5qcyIpOwoKbW9kdWxlLmV4cG9ydHMgPSBwcm9wb3NhbHM7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS9wcmUuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3N0YWdlL3ByZS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewoKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vcHJvcG9zYWxzL3JlZmxlY3QtbWV0YWRhdGEgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3JlZmxlY3QtbWV0YWRhdGEuanMiKTsKdmFyIHBhcmVudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vMCAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS8wLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IHBhcmVudDsKCgovKioqLyB9KSwKCi8qKiovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL3dlYi9pbmRleC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvd2ViL2luZGV4LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2ggKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvciAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy93ZWIuaW1tZWRpYXRlICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmltbWVkaWF0ZS5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL3dlYi5xdWV1ZS1taWNyb3Rhc2sgKi8gIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIucXVldWUtbWljcm90YXNrLmpzIik7Cl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvd2ViLnRpbWVycyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi50aW1lcnMuanMiKTsKX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy93ZWIudXJsICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL3dlYi51cmwudG8tanNvbiAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwudG8tanNvbi5qcyIpOwpfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5qcyIpOwp2YXIgcGF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wYXRoICovICIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wYXRoLmpzIik7Cgptb2R1bGUuZXhwb3J0cyA9IHBhdGg7CgoKLyoqKi8gfSksCgovKioqLyAiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7CgoidXNlIHN0cmljdCI7CgoKLyoKICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogIEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmEKKi8KLy8gY3NzIGJhc2UgY29kZSwgaW5qZWN0ZWQgYnkgdGhlIGNzcy1sb2FkZXIKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXMKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodXNlU291cmNlTWFwKSB7CiAgdmFyIGxpc3QgPSBbXTsgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZwoKICBsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgdmFyIGNvbnRlbnQgPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0sIHVzZVNvdXJjZU1hcCk7CgogICAgICBpZiAoaXRlbVsyXSkgewogICAgICAgIHJldHVybiAiQG1lZGlhICIuY29uY2F0KGl0ZW1bMl0sICIgeyIpLmNvbmNhdChjb250ZW50LCAifSIpOwogICAgICB9CgogICAgICByZXR1cm4gY29udGVudDsKICAgIH0pLmpvaW4oJycpOwogIH07IC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXMKCgogIGxpc3QuaSA9IGZ1bmN0aW9uIChtb2R1bGVzLCBtZWRpYVF1ZXJ5KSB7CiAgICBpZiAodHlwZW9mIG1vZHVsZXMgPT09ICdzdHJpbmcnKSB7CiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnbgogICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCAnJ11dOwogICAgfQoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW2ldKTsKCiAgICAgIGlmIChtZWRpYVF1ZXJ5KSB7CiAgICAgICAgaWYgKCFpdGVtWzJdKSB7CiAgICAgICAgICBpdGVtWzJdID0gbWVkaWFRdWVyeTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaXRlbVsyXSA9ICIiLmNvbmNhdChtZWRpYVF1ZXJ5LCAiIGFuZCAiKS5jb25jYXQoaXRlbVsyXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBsaXN0LnB1c2goaXRlbSk7CiAgICB9CiAgfTsKCiAgcmV0dXJuIGxpc3Q7Cn07CgpmdW5jdGlvbiBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0sIHVzZVNvdXJjZU1hcCkgewogIHZhciBjb250ZW50ID0gaXRlbVsxXSB8fCAnJzsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nCgogIHZhciBjc3NNYXBwaW5nID0gaXRlbVszXTsKCiAgaWYgKCFjc3NNYXBwaW5nKSB7CiAgICByZXR1cm4gY29udGVudDsKICB9CgogIGlmICh1c2VTb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgPT09ICdmdW5jdGlvbicpIHsKICAgIHZhciBzb3VyY2VNYXBwaW5nID0gdG9Db21tZW50KGNzc01hcHBpbmcpOwogICAgdmFyIHNvdXJjZVVSTHMgPSBjc3NNYXBwaW5nLnNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHsKICAgICAgcmV0dXJuICIvKiMgc291cmNlVVJMPSIuY29uY2F0KGNzc01hcHBpbmcuc291cmNlUm9vdCkuY29uY2F0KHNvdXJjZSwgIiAqLyIpOwogICAgfSk7CiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChzb3VyY2VVUkxzKS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKCdcbicpOwogIH0KCiAgcmV0dXJuIFtjb250ZW50XS5qb2luKCdcbicpOwp9IC8vIEFkYXB0ZWQgZnJvbSBjb252ZXJ0LXNvdXJjZS1tYXAgKE1JVCkKCgpmdW5jdGlvbiB0b0NvbW1lbnQoc291cmNlTWFwKSB7CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmCiAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSk7CiAgdmFyIGRhdGEgPSAic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsIi5jb25jYXQoYmFzZTY0KTsKICByZXR1cm4gIi8qIyAiLmNvbmNhdChkYXRhLCAiICovIik7Cn0KCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL2h5cGVyYXBwL3NyYy9pbmRleC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9oeXBlcmFwcC9zcmMvaW5kZXguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHsKLyogaGFybW9ueSBleHBvcnQgKi8gICAiaCI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBoOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJhcHAiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gYXBwOyB9Ci8qIGhhcm1vbnkgZXhwb3J0ICovIH0pOwpmdW5jdGlvbiBoKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICB2YXIgcmVzdCA9IFtdCiAgdmFyIGNoaWxkcmVuID0gW10KICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aAoKICB3aGlsZSAobGVuZ3RoLS0gPiAyKSByZXN0LnB1c2goYXJndW1lbnRzW2xlbmd0aF0pCgogIHdoaWxlIChyZXN0Lmxlbmd0aCkgewogICAgdmFyIG5vZGUgPSByZXN0LnBvcCgpCiAgICBpZiAobm9kZSAmJiBub2RlLnBvcCkgewogICAgICBmb3IgKGxlbmd0aCA9IG5vZGUubGVuZ3RoOyBsZW5ndGgtLTsgKSB7CiAgICAgICAgcmVzdC5wdXNoKG5vZGVbbGVuZ3RoXSkKICAgICAgfQogICAgfSBlbHNlIGlmIChub2RlICE9IG51bGwgJiYgbm9kZSAhPT0gdHJ1ZSAmJiBub2RlICE9PSBmYWxzZSkgewogICAgICBjaGlsZHJlbi5wdXNoKG5vZGUpCiAgICB9CiAgfQoKICByZXR1cm4gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIKICAgID8gbmFtZShhdHRyaWJ1dGVzIHx8IHt9LCBjaGlsZHJlbikKICAgIDogewogICAgICAgIG5vZGVOYW1lOiBuYW1lLAogICAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXMgfHwge30sCiAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLAogICAgICAgIGtleTogYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmtleQogICAgICB9Cn0KCmZ1bmN0aW9uIGFwcChzdGF0ZSwgYWN0aW9ucywgdmlldywgY29udGFpbmVyKSB7CiAgdmFyIG1hcCA9IFtdLm1hcAogIHZhciByb290RWxlbWVudCA9IChjb250YWluZXIgJiYgY29udGFpbmVyLmNoaWxkcmVuWzBdKSB8fCBudWxsCiAgdmFyIG9sZE5vZGUgPSByb290RWxlbWVudCAmJiByZWN5Y2xlRWxlbWVudChyb290RWxlbWVudCkKICB2YXIgbGlmZWN5Y2xlID0gW10KICB2YXIgc2tpcFJlbmRlcgogIHZhciBpc1JlY3ljbGluZyA9IHRydWUKICB2YXIgZ2xvYmFsU3RhdGUgPSBjbG9uZShzdGF0ZSkKICB2YXIgd2lyZWRBY3Rpb25zID0gd2lyZVN0YXRlVG9BY3Rpb25zKFtdLCBnbG9iYWxTdGF0ZSwgY2xvbmUoYWN0aW9ucykpCgogIHNjaGVkdWxlUmVuZGVyKCkKCiAgcmV0dXJuIHdpcmVkQWN0aW9ucwoKICBmdW5jdGlvbiByZWN5Y2xlRWxlbWVudChlbGVtZW50KSB7CiAgICByZXR1cm4gewogICAgICBub2RlTmFtZTogZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLAogICAgICBhdHRyaWJ1dGVzOiB7fSwKICAgICAgY2hpbGRyZW46IG1hcC5jYWxsKGVsZW1lbnQuY2hpbGROb2RlcywgZnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgIHJldHVybiBlbGVtZW50Lm5vZGVUeXBlID09PSAzIC8vIE5vZGUuVEVYVF9OT0RFCiAgICAgICAgICA/IGVsZW1lbnQubm9kZVZhbHVlCiAgICAgICAgICA6IHJlY3ljbGVFbGVtZW50KGVsZW1lbnQpCiAgICAgIH0pCiAgICB9CiAgfQoKICBmdW5jdGlvbiByZXNvbHZlTm9kZShub2RlKSB7CiAgICByZXR1cm4gdHlwZW9mIG5vZGUgPT09ICJmdW5jdGlvbiIKICAgICAgPyByZXNvbHZlTm9kZShub2RlKGdsb2JhbFN0YXRlLCB3aXJlZEFjdGlvbnMpKQogICAgICA6IG5vZGUgIT0gbnVsbAogICAgICAgID8gbm9kZQogICAgICAgIDogIiIKICB9CgogIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgIHNraXBSZW5kZXIgPSAhc2tpcFJlbmRlcgoKICAgIHZhciBub2RlID0gcmVzb2x2ZU5vZGUodmlldykKCiAgICBpZiAoY29udGFpbmVyICYmICFza2lwUmVuZGVyKSB7CiAgICAgIHJvb3RFbGVtZW50ID0gcGF0Y2goY29udGFpbmVyLCByb290RWxlbWVudCwgb2xkTm9kZSwgKG9sZE5vZGUgPSBub2RlKSkKICAgIH0KCiAgICBpc1JlY3ljbGluZyA9IGZhbHNlCgogICAgd2hpbGUgKGxpZmVjeWNsZS5sZW5ndGgpIGxpZmVjeWNsZS5wb3AoKSgpCiAgfQoKICBmdW5jdGlvbiBzY2hlZHVsZVJlbmRlcigpIHsKICAgIGlmICghc2tpcFJlbmRlcikgewogICAgICBza2lwUmVuZGVyID0gdHJ1ZQogICAgICBzZXRUaW1lb3V0KHJlbmRlcikKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNsb25lKHRhcmdldCwgc291cmNlKSB7CiAgICB2YXIgb3V0ID0ge30KCiAgICBmb3IgKHZhciBpIGluIHRhcmdldCkgb3V0W2ldID0gdGFyZ2V0W2ldCiAgICBmb3IgKHZhciBpIGluIHNvdXJjZSkgb3V0W2ldID0gc291cmNlW2ldCgogICAgcmV0dXJuIG91dAogIH0KCiAgZnVuY3Rpb24gc2V0UGFydGlhbFN0YXRlKHBhdGgsIHZhbHVlLCBzb3VyY2UpIHsKICAgIHZhciB0YXJnZXQgPSB7fQogICAgaWYgKHBhdGgubGVuZ3RoKSB7CiAgICAgIHRhcmdldFtwYXRoWzBdXSA9CiAgICAgICAgcGF0aC5sZW5ndGggPiAxCiAgICAgICAgICA/IHNldFBhcnRpYWxTdGF0ZShwYXRoLnNsaWNlKDEpLCB2YWx1ZSwgc291cmNlW3BhdGhbMF1dKQogICAgICAgICAgOiB2YWx1ZQogICAgICByZXR1cm4gY2xvbmUoc291cmNlLCB0YXJnZXQpCiAgICB9CiAgICByZXR1cm4gdmFsdWUKICB9CgogIGZ1bmN0aW9uIGdldFBhcnRpYWxTdGF0ZShwYXRoLCBzb3VyY2UpIHsKICAgIHZhciBpID0gMAogICAgd2hpbGUgKGkgPCBwYXRoLmxlbmd0aCkgewogICAgICBzb3VyY2UgPSBzb3VyY2VbcGF0aFtpKytdXQogICAgfQogICAgcmV0dXJuIHNvdXJjZQogIH0KCiAgZnVuY3Rpb24gd2lyZVN0YXRlVG9BY3Rpb25zKHBhdGgsIHN0YXRlLCBhY3Rpb25zKSB7CiAgICBmb3IgKHZhciBrZXkgaW4gYWN0aW9ucykgewogICAgICB0eXBlb2YgYWN0aW9uc1trZXldID09PSAiZnVuY3Rpb24iCiAgICAgICAgPyAoZnVuY3Rpb24oa2V5LCBhY3Rpb24pIHsKICAgICAgICAgICAgYWN0aW9uc1trZXldID0gZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhY3Rpb24oZGF0YSkKCiAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdChnZXRQYXJ0aWFsU3RhdGUocGF0aCwgZ2xvYmFsU3RhdGUpLCBhY3Rpb25zKQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgcmVzdWx0ICYmCiAgICAgICAgICAgICAgICByZXN1bHQgIT09IChzdGF0ZSA9IGdldFBhcnRpYWxTdGF0ZShwYXRoLCBnbG9iYWxTdGF0ZSkpICYmCiAgICAgICAgICAgICAgICAhcmVzdWx0LnRoZW4gLy8gIWlzUHJvbWlzZQogICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgc2NoZWR1bGVSZW5kZXIoCiAgICAgICAgICAgICAgICAgIChnbG9iYWxTdGF0ZSA9IHNldFBhcnRpYWxTdGF0ZSgKICAgICAgICAgICAgICAgICAgICBwYXRoLAogICAgICAgICAgICAgICAgICAgIGNsb25lKHN0YXRlLCByZXN1bHQpLAogICAgICAgICAgICAgICAgICAgIGdsb2JhbFN0YXRlCiAgICAgICAgICAgICAgICAgICkpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pKGtleSwgYWN0aW9uc1trZXldKQogICAgICAgIDogd2lyZVN0YXRlVG9BY3Rpb25zKAogICAgICAgICAgICBwYXRoLmNvbmNhdChrZXkpLAogICAgICAgICAgICAoc3RhdGVba2V5XSA9IGNsb25lKHN0YXRlW2tleV0pKSwKICAgICAgICAgICAgKGFjdGlvbnNba2V5XSA9IGNsb25lKGFjdGlvbnNba2V5XSkpCiAgICAgICAgICApCiAgICB9CgogICAgcmV0dXJuIGFjdGlvbnMKICB9CgogIGZ1bmN0aW9uIGdldEtleShub2RlKSB7CiAgICByZXR1cm4gbm9kZSA/IG5vZGUua2V5IDogbnVsbAogIH0KCiAgZnVuY3Rpb24gZXZlbnRMaXN0ZW5lcihldmVudCkgewogICAgcmV0dXJuIGV2ZW50LmN1cnJlbnRUYXJnZXQuZXZlbnRzW2V2ZW50LnR5cGVdKGV2ZW50KQogIH0KCiAgZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlKGVsZW1lbnQsIG5hbWUsIHZhbHVlLCBvbGRWYWx1ZSwgaXNTdmcpIHsKICAgIGlmIChuYW1lID09PSAia2V5IikgewogICAgfSBlbHNlIGlmIChuYW1lID09PSAic3R5bGUiKSB7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgZWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gdmFsdWUKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAodHlwZW9mIG9sZFZhbHVlID09PSAic3RyaW5nIikgb2xkVmFsdWUgPSBlbGVtZW50LnN0eWxlLmNzc1RleHQgPSAiIgogICAgICAgIGZvciAodmFyIGkgaW4gY2xvbmUob2xkVmFsdWUsIHZhbHVlKSkgewogICAgICAgICAgdmFyIHN0eWxlID0gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZVtpXSA9PSBudWxsID8gIiIgOiB2YWx1ZVtpXQogICAgICAgICAgaWYgKGlbMF0gPT09ICItIikgewogICAgICAgICAgICBlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KGksIHN0eWxlKQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtpXSA9IHN0eWxlCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAobmFtZVswXSA9PT0gIm8iICYmIG5hbWVbMV0gPT09ICJuIikgewogICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDIpCgogICAgICAgIGlmIChlbGVtZW50LmV2ZW50cykgewogICAgICAgICAgaWYgKCFvbGRWYWx1ZSkgb2xkVmFsdWUgPSBlbGVtZW50LmV2ZW50c1tuYW1lXQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbGVtZW50LmV2ZW50cyA9IHt9CiAgICAgICAgfQoKICAgICAgICBlbGVtZW50LmV2ZW50c1tuYW1lXSA9IHZhbHVlCgogICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgaWYgKCFvbGRWYWx1ZSkgewogICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZXZlbnRMaXN0ZW5lcikKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGV2ZW50TGlzdGVuZXIpCiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKAogICAgICAgIG5hbWUgaW4gZWxlbWVudCAmJgogICAgICAgIG5hbWUgIT09ICJsaXN0IiAmJgogICAgICAgIG5hbWUgIT09ICJ0eXBlIiAmJgogICAgICAgIG5hbWUgIT09ICJkcmFnZ2FibGUiICYmCiAgICAgICAgbmFtZSAhPT0gInNwZWxsY2hlY2siICYmCiAgICAgICAgbmFtZSAhPT0gInRyYW5zbGF0ZSIgJiYKICAgICAgICAhaXNTdmcKICAgICAgKSB7CiAgICAgICAgZWxlbWVudFtuYW1lXSA9IHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlCiAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gZmFsc2UpIHsKICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkKICAgICAgfQoKICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09IGZhbHNlKSB7CiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSkKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudChub2RlLCBpc1N2ZykgewogICAgdmFyIGVsZW1lbnQgPQogICAgICB0eXBlb2Ygbm9kZSA9PT0gInN0cmluZyIgfHwgdHlwZW9mIG5vZGUgPT09ICJudW1iZXIiCiAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShub2RlKQogICAgICAgIDogKGlzU3ZnID0gaXNTdmcgfHwgbm9kZS5ub2RlTmFtZSA9PT0gInN2ZyIpCiAgICAgICAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygKICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLAogICAgICAgICAgICAgIG5vZGUubm9kZU5hbWUKICAgICAgICAgICAgKQogICAgICAgICAgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5vZGUubm9kZU5hbWUpCgogICAgdmFyIGF0dHJpYnV0ZXMgPSBub2RlLmF0dHJpYnV0ZXMKICAgIGlmIChhdHRyaWJ1dGVzKSB7CiAgICAgIGlmIChhdHRyaWJ1dGVzLm9uY3JlYXRlKSB7CiAgICAgICAgbGlmZWN5Y2xlLnB1c2goZnVuY3Rpb24oKSB7CiAgICAgICAgICBhdHRyaWJ1dGVzLm9uY3JlYXRlKGVsZW1lbnQpCiAgICAgICAgfSkKICAgICAgfQoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCgKICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgIChub2RlLmNoaWxkcmVuW2ldID0gcmVzb2x2ZU5vZGUobm9kZS5jaGlsZHJlbltpXSkpLAogICAgICAgICAgICBpc1N2ZwogICAgICAgICAgKQogICAgICAgICkKICAgICAgfQoKICAgICAgZm9yICh2YXIgbmFtZSBpbiBhdHRyaWJ1dGVzKSB7CiAgICAgICAgdXBkYXRlQXR0cmlidXRlKGVsZW1lbnQsIG5hbWUsIGF0dHJpYnV0ZXNbbmFtZV0sIG51bGwsIGlzU3ZnKQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGVsZW1lbnQKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUVsZW1lbnQoZWxlbWVudCwgb2xkQXR0cmlidXRlcywgYXR0cmlidXRlcywgaXNTdmcpIHsKICAgIGZvciAodmFyIG5hbWUgaW4gY2xvbmUob2xkQXR0cmlidXRlcywgYXR0cmlidXRlcykpIHsKICAgICAgaWYgKAogICAgICAgIGF0dHJpYnV0ZXNbbmFtZV0gIT09CiAgICAgICAgKG5hbWUgPT09ICJ2YWx1ZSIgfHwgbmFtZSA9PT0gImNoZWNrZWQiCiAgICAgICAgICA/IGVsZW1lbnRbbmFtZV0KICAgICAgICAgIDogb2xkQXR0cmlidXRlc1tuYW1lXSkKICAgICAgKSB7CiAgICAgICAgdXBkYXRlQXR0cmlidXRlKAogICAgICAgICAgZWxlbWVudCwKICAgICAgICAgIG5hbWUsCiAgICAgICAgICBhdHRyaWJ1dGVzW25hbWVdLAogICAgICAgICAgb2xkQXR0cmlidXRlc1tuYW1lXSwKICAgICAgICAgIGlzU3ZnCiAgICAgICAgKQogICAgICB9CiAgICB9CgogICAgdmFyIGNiID0gaXNSZWN5Y2xpbmcgPyBhdHRyaWJ1dGVzLm9uY3JlYXRlIDogYXR0cmlidXRlcy5vbnVwZGF0ZQogICAgaWYgKGNiKSB7CiAgICAgIGxpZmVjeWNsZS5wdXNoKGZ1bmN0aW9uKCkgewogICAgICAgIGNiKGVsZW1lbnQsIG9sZEF0dHJpYnV0ZXMpCiAgICAgIH0pCiAgICB9CiAgfQoKICBmdW5jdGlvbiByZW1vdmVDaGlsZHJlbihlbGVtZW50LCBub2RlKSB7CiAgICB2YXIgYXR0cmlidXRlcyA9IG5vZGUuYXR0cmlidXRlcwogICAgaWYgKGF0dHJpYnV0ZXMpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcmVtb3ZlQ2hpbGRyZW4oZWxlbWVudC5jaGlsZE5vZGVzW2ldLCBub2RlLmNoaWxkcmVuW2ldKQogICAgICB9CgogICAgICBpZiAoYXR0cmlidXRlcy5vbmRlc3Ryb3kpIHsKICAgICAgICBhdHRyaWJ1dGVzLm9uZGVzdHJveShlbGVtZW50KQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZWxlbWVudAogIH0KCiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChwYXJlbnQsIGVsZW1lbnQsIG5vZGUpIHsKICAgIGZ1bmN0aW9uIGRvbmUoKSB7CiAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChyZW1vdmVDaGlsZHJlbihlbGVtZW50LCBub2RlKSkKICAgIH0KCiAgICB2YXIgY2IgPSBub2RlLmF0dHJpYnV0ZXMgJiYgbm9kZS5hdHRyaWJ1dGVzLm9ucmVtb3ZlCiAgICBpZiAoY2IpIHsKICAgICAgY2IoZWxlbWVudCwgZG9uZSkKICAgIH0gZWxzZSB7CiAgICAgIGRvbmUoKQogICAgfQogIH0KCiAgZnVuY3Rpb24gcGF0Y2gocGFyZW50LCBlbGVtZW50LCBvbGROb2RlLCBub2RlLCBpc1N2ZykgewogICAgaWYgKG5vZGUgPT09IG9sZE5vZGUpIHsKICAgIH0gZWxzZSBpZiAob2xkTm9kZSA9PSBudWxsIHx8IG9sZE5vZGUubm9kZU5hbWUgIT09IG5vZGUubm9kZU5hbWUpIHsKICAgICAgdmFyIG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KG5vZGUsIGlzU3ZnKQogICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld0VsZW1lbnQsIGVsZW1lbnQpCgogICAgICBpZiAob2xkTm9kZSAhPSBudWxsKSB7CiAgICAgICAgcmVtb3ZlRWxlbWVudChwYXJlbnQsIGVsZW1lbnQsIG9sZE5vZGUpCiAgICAgIH0KCiAgICAgIGVsZW1lbnQgPSBuZXdFbGVtZW50CiAgICB9IGVsc2UgaWYgKG9sZE5vZGUubm9kZU5hbWUgPT0gbnVsbCkgewogICAgICBlbGVtZW50Lm5vZGVWYWx1ZSA9IG5vZGUKICAgIH0gZWxzZSB7CiAgICAgIHVwZGF0ZUVsZW1lbnQoCiAgICAgICAgZWxlbWVudCwKICAgICAgICBvbGROb2RlLmF0dHJpYnV0ZXMsCiAgICAgICAgbm9kZS5hdHRyaWJ1dGVzLAogICAgICAgIChpc1N2ZyA9IGlzU3ZnIHx8IG5vZGUubm9kZU5hbWUgPT09ICJzdmciKQogICAgICApCgogICAgICB2YXIgb2xkS2V5ZWQgPSB7fQogICAgICB2YXIgbmV3S2V5ZWQgPSB7fQogICAgICB2YXIgb2xkRWxlbWVudHMgPSBbXQogICAgICB2YXIgb2xkQ2hpbGRyZW4gPSBvbGROb2RlLmNoaWxkcmVuCiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4KCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2xkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBvbGRFbGVtZW50c1tpXSA9IGVsZW1lbnQuY2hpbGROb2Rlc1tpXQoKICAgICAgICB2YXIgb2xkS2V5ID0gZ2V0S2V5KG9sZENoaWxkcmVuW2ldKQogICAgICAgIGlmIChvbGRLZXkgIT0gbnVsbCkgewogICAgICAgICAgb2xkS2V5ZWRbb2xkS2V5XSA9IFtvbGRFbGVtZW50c1tpXSwgb2xkQ2hpbGRyZW5baV1dCiAgICAgICAgfQogICAgICB9CgogICAgICB2YXIgaSA9IDAKICAgICAgdmFyIGsgPSAwCgogICAgICB3aGlsZSAoayA8IGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgIHZhciBvbGRLZXkgPSBnZXRLZXkob2xkQ2hpbGRyZW5baV0pCiAgICAgICAgdmFyIG5ld0tleSA9IGdldEtleSgoY2hpbGRyZW5ba10gPSByZXNvbHZlTm9kZShjaGlsZHJlbltrXSkpKQoKICAgICAgICBpZiAobmV3S2V5ZWRbb2xkS2V5XSkgewogICAgICAgICAgaSsrCiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgaWYgKG5ld0tleSAhPSBudWxsICYmIG5ld0tleSA9PT0gZ2V0S2V5KG9sZENoaWxkcmVuW2kgKyAxXSkpIHsKICAgICAgICAgIGlmIChvbGRLZXkgPT0gbnVsbCkgewogICAgICAgICAgICByZW1vdmVFbGVtZW50KGVsZW1lbnQsIG9sZEVsZW1lbnRzW2ldLCBvbGRDaGlsZHJlbltpXSkKICAgICAgICAgIH0KICAgICAgICAgIGkrKwogICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgIGlmIChuZXdLZXkgPT0gbnVsbCB8fCBpc1JlY3ljbGluZykgewogICAgICAgICAgaWYgKG9sZEtleSA9PSBudWxsKSB7CiAgICAgICAgICAgIHBhdGNoKGVsZW1lbnQsIG9sZEVsZW1lbnRzW2ldLCBvbGRDaGlsZHJlbltpXSwgY2hpbGRyZW5ba10sIGlzU3ZnKQogICAgICAgICAgICBrKysKICAgICAgICAgIH0KICAgICAgICAgIGkrKwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIga2V5ZWROb2RlID0gb2xkS2V5ZWRbbmV3S2V5XSB8fCBbXQoKICAgICAgICAgIGlmIChvbGRLZXkgPT09IG5ld0tleSkgewogICAgICAgICAgICBwYXRjaChlbGVtZW50LCBrZXllZE5vZGVbMF0sIGtleWVkTm9kZVsxXSwgY2hpbGRyZW5ba10sIGlzU3ZnKQogICAgICAgICAgICBpKysKICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ZWROb2RlWzBdKSB7CiAgICAgICAgICAgIHBhdGNoKAogICAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICAgZWxlbWVudC5pbnNlcnRCZWZvcmUoa2V5ZWROb2RlWzBdLCBvbGRFbGVtZW50c1tpXSksCiAgICAgICAgICAgICAga2V5ZWROb2RlWzFdLAogICAgICAgICAgICAgIGNoaWxkcmVuW2tdLAogICAgICAgICAgICAgIGlzU3ZnCiAgICAgICAgICAgICkKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHBhdGNoKGVsZW1lbnQsIG9sZEVsZW1lbnRzW2ldLCBudWxsLCBjaGlsZHJlbltrXSwgaXNTdmcpCiAgICAgICAgICB9CgogICAgICAgICAgbmV3S2V5ZWRbbmV3S2V5XSA9IGNoaWxkcmVuW2tdCiAgICAgICAgICBrKysKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHdoaWxlIChpIDwgb2xkQ2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgaWYgKGdldEtleShvbGRDaGlsZHJlbltpXSkgPT0gbnVsbCkgewogICAgICAgICAgcmVtb3ZlRWxlbWVudChlbGVtZW50LCBvbGRFbGVtZW50c1tpXSwgb2xkQ2hpbGRyZW5baV0pCiAgICAgICAgfQogICAgICAgIGkrKwogICAgICB9CgogICAgICBmb3IgKHZhciBpIGluIG9sZEtleWVkKSB7CiAgICAgICAgaWYgKCFuZXdLZXllZFtpXSkgewogICAgICAgICAgcmVtb3ZlRWxlbWVudChlbGVtZW50LCBvbGRLZXllZFtpXVswXSwgb2xkS2V5ZWRbaV1bMV0pCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZWxlbWVudAogIH0KfQoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkgewoKLyoqCiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKi8KCnZhciBydW50aW1lID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7CiAgInVzZSBzdHJpY3QiOwoKICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlOwogIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTsKICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC4KICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgPyBTeW1ib2wgOiB7fTsKICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8ICJAQGl0ZXJhdG9yIjsKICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCAiQEBhc3luY0l0ZXJhdG9yIjsKICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8ICJAQHRvU3RyaW5nVGFnIjsKCiAgZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkgewogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7CiAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICB3cml0YWJsZTogdHJ1ZQogICAgfSk7CiAgICByZXR1cm4gb2JqW2tleV07CiAgfQogIHRyeSB7CiAgICAvLyBJRSA4IGhhcyBhIGJyb2tlbiBPYmplY3QuZGVmaW5lUHJvcGVydHkgdGhhdCBvbmx5IHdvcmtzIG9uIERPTSBvYmplY3RzLgogICAgZGVmaW5lKHt9LCAiIik7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICBkZWZpbmUgPSBmdW5jdGlvbihvYmosIGtleSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkgewogICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuCiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjsKICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7CiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTsKCiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsCiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuCiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7CgogICAgcmV0dXJuIGdlbmVyYXRvcjsKICB9CiAgZXhwb3J0cy53cmFwID0gd3JhcDsKCiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uCiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkCiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlCiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZQogIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWQKICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nCiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWUKICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGUKICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoCiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLgogIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIHsgdHlwZTogIm5vcm1hbCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICByZXR1cm4geyB0eXBlOiAidGhyb3ciLCBhcmc6IGVyciB9OwogICAgfQogIH0KCiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSAic3VzcGVuZGVkU3RhcnQiOwogIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gInN1c3BlbmRlZFlpZWxkIjsKICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSAiZXhlY3V0aW5nIjsKICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSAiY29tcGxldGVkIjsKCiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhcwogIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC4KICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9OwoKICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmQKICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3IKICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91cgogIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuCiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge30KICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9CiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fQoKICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0CiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC4KICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTsKICBkZWZpbmUoSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gdGhpczsKICB9KTsKCiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mOwogIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTsKICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiYKICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmCiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHsKICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkCiAgICAvLyBvZiB0aGUgcG9seWZpbGwuCiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlOwogIH0KCiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0KICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTsKICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTsKICBkZWZpbmUoR3AsICJjb25zdHJ1Y3RvciIsIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTsKICBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsICJjb25zdHJ1Y3RvciIsIEdlbmVyYXRvckZ1bmN0aW9uKTsKICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRlZmluZSgKICAgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLAogICAgdG9TdHJpbmdUYWdTeW1ib2wsCiAgICAiR2VuZXJhdG9yRnVuY3Rpb24iCiAgKTsKCiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGUKICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLgogIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHsKICAgIFsibmV4dCIsICJ0aHJvdyIsICJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkgewogICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uKGFyZykgewogICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7CiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09ICJmdW5jdGlvbiIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yOwogICAgcmV0dXJuIGN0b3IKICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fAogICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW4KICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuCiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gIkdlbmVyYXRvckZ1bmN0aW9uIgogICAgICA6IGZhbHNlOwogIH07CgogIGV4cG9ydHMubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikgewogICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikgewogICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7CiAgICB9IGVsc2UgewogICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7CiAgICAgIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCAiR2VuZXJhdG9yRnVuY3Rpb24iKTsKICAgIH0KICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTsKICAgIHJldHVybiBnZW5GdW47CiAgfTsKCiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvCiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3QKICAvLyBgaGFzT3duLmNhbGwodmFsdWUsICJfX2F3YWl0IilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpcwogIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuCiAgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uKGFyZykgewogICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07CiAgfTsKCiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7CiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTsKICAgICAgaWYgKHJlY29yZC50eXBlID09PSAidGhyb3ciKSB7CiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnOwogICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTsKICAgICAgICBpZiAodmFsdWUgJiYKICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAib2JqZWN0IiAmJgogICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgIl9fYXdhaXQiKSkgewogICAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICBpbnZva2UoIm5leHQiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICBpbnZva2UoInRocm93IiwgZXJyLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHsKICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzCiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGUKICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLgogICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkOwogICAgICAgICAgcmVzb2x2ZShyZXN1bHQpOwogICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7CiAgICAgICAgICAvLyBJZiBhIHJlamVjdGVkIFByb21pc2Ugd2FzIHlpZWxkZWQsIHRocm93IHRoZSByZWplY3Rpb24gYmFjawogICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLgogICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQoKICAgIHZhciBwcmV2aW91c1Byb21pc2U7CgogICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykgewogICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgIH0pOwogICAgICB9CgogICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID0KICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsCiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsCiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZgogICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvCiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsCiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG8KICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5CiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHMKICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseQogICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlCiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHkKICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuCiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oCiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZywKICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyCiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuCiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZwogICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOwogICAgfQoKICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsCiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS4KICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7CiAgfQoKICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpOwogIGRlZmluZShBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSwgYXN5bmNJdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSk7CiAgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjsKCiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZgogIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZgogIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLgogIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHsKICAgIGlmIChQcm9taXNlSW1wbCA9PT0gdm9pZCAwKSBQcm9taXNlSW1wbCA9IFByb21pc2U7CgogICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcigKICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksCiAgICAgIFByb21pc2VJbXBsCiAgICApOwoKICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbikKICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci4KICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7CiAgICAgICAgfSk7CiAgfTsKCiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7CiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0OwoKICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHsKICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpOwogICAgICB9CgogICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7CiAgICAgICAgaWYgKG1ldGhvZCA9PT0gInRocm93IikgewogICAgICAgICAgdGhyb3cgYXJnOwogICAgICAgIH0KCiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzoKICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lCiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTsKICAgICAgfQoKICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7CiAgICAgIGNvbnRleHQuYXJnID0gYXJnOwoKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlOwogICAgICAgIGlmIChkZWxlZ2F0ZSkgewogICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7CiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHsKICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTsKICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0OwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSAibmV4dCIpIHsKICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwncwogICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZzsKCiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gInRocm93IikgewogICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7CiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7CiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnOwogICAgICAgICAgfQoKICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpOwoKICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSAicmV0dXJuIikgewogICAgICAgICAgY29udGV4dC5hYnJ1cHQoInJldHVybiIsIGNvbnRleHQuYXJnKTsKICAgICAgICB9CgogICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7CgogICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTsKICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09ICJub3JtYWwiKSB7CiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09CiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uCiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZQogICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkCiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDsKCiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZywKICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lCiAgICAgICAgICB9OwoKICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSAidGhyb3ciKSB7CiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkOwogICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZQogICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS4KICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gInRocm93IjsKICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZzsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfQoKICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGUKICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlCiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsCiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuCiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkgewogICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTsKICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkgewogICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3cKICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC4KICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7CgogICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09ICJ0aHJvdyIpIHsKICAgICAgICAvLyBOb3RlOiBbInJldHVybiJdIG11c3QgYmUgdXNlZCBmb3IgRVMzIHBhcnNpbmcgY29tcGF0aWJpbGl0eS4KICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3JbInJldHVybiJdKSB7CiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhCiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuCiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJyZXR1cm4iOwogICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7CiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTsKCiAgICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09ICJ0aHJvdyIpIHsKICAgICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb20KICAgICAgICAgICAgLy8gInJldHVybiIgdG8gInRocm93IiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy4KICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyI7CiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKAogICAgICAgICAgIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2QiKTsKICAgICAgfQoKICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7CiAgICB9CgogICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTsKCiAgICBpZiAocmVjb3JkLnR5cGUgPT09ICJ0aHJvdyIpIHsKICAgICAgY29udGV4dC5tZXRob2QgPSAidGhyb3ciOwogICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7CiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsOwogICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKICAgIH0KCiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7CgogICAgaWYgKCEgaW5mbykgewogICAgICBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyI7CiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKTsKICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7CiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOwogICAgfQoKICAgIGlmIChpbmZvLmRvbmUpIHsKICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnkKICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS4KICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7CgogICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuCiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7CgogICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgInRocm93IiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlCiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWYKICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzICJuZXh0IiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuCiAgICAgIC8vICJjb25zdW1lZCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXMKICAgICAgLy8gInJldHVybiIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlCiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci4KICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSAicmV0dXJuIikgewogICAgICAgIGNvbnRleHQubWV0aG9kID0gIm5leHQiOwogICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkOwogICAgICB9CgogICAgfSBlbHNlIHsKICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLgogICAgICByZXR1cm4gaW5mbzsKICAgIH0KCiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aAogICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci4KICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsOwogICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7CiAgfQoKICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZQogIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC4KICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApOwoKICBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCAiR2VuZXJhdG9yIik7CgogIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlCiAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGUKICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvcgogIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLgogIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLgogIGRlZmluZShHcCwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSk7CgogIGRlZmluZShHcCwgInRvU3RyaW5nIiwgZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gIltvYmplY3QgR2VuZXJhdG9yXSI7CiAgfSk7CgogIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7CiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9OwoKICAgIGlmICgxIGluIGxvY3MpIHsKICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdOwogICAgfQoKICAgIGlmICgyIGluIGxvY3MpIHsKICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07CiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTsKICAgIH0KCiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7CiAgfQoKICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7CiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTsKICAgIHJlY29yZC50eXBlID0gIm5vcm1hbCI7CiAgICBkZWxldGUgcmVjb3JkLmFyZzsKICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7CiAgfQoKICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7CiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2gKICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb20KICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC4KICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogInJvb3QiIH1dOwogICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpOwogICAgdGhpcy5yZXNldCh0cnVlKTsKICB9CgogIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkgewogICAgdmFyIGtleXMgPSBbXTsKICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHsKICAgICAga2V5cy5wdXNoKGtleSk7CiAgICB9CiAgICBrZXlzLnJldmVyc2UoKTsKCiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcAogICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi4KICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkgewogICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHsKICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTsKICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkgewogICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTsKICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWUKICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXMKICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uCiAgICAgIG5leHQuZG9uZSA9IHRydWU7CiAgICAgIHJldHVybiBuZXh0OwogICAgfTsKICB9OwoKICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHsKICAgIGlmIChpdGVyYWJsZSkgewogICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07CiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkgewogICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTsKICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlOwogICAgICB9CgogICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHsKICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHsKICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHsKICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkgewogICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTsKICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTsKICAgICAgICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7CiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlOwoKICAgICAgICAgIHJldHVybiBuZXh0OwogICAgICAgIH07CgogICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0OwogICAgICB9CiAgICB9CgogICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLgogICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9OwogIH0KICBleHBvcnRzLnZhbHVlcyA9IHZhbHVlczsKCiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHsKICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTsKICB9CgogIENvbnRleHQucHJvdG90eXBlID0gewogICAgY29uc3RydWN0b3I6IENvbnRleHQsCgogICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHsKICAgICAgdGhpcy5wcmV2ID0gMDsKICAgICAgdGhpcy5uZXh0ID0gMDsKICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3MKICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi4KICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDsKICAgICAgdGhpcy5kb25lID0gZmFsc2U7CiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsOwoKICAgICAgdGhpcy5tZXRob2QgPSAibmV4dCI7CiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkOwoKICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7CgogICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHsKICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHsKICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6CiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09ICJ0IiAmJgogICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmCiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkgewogICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICBzdG9wOiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5kb25lID0gdHJ1ZTsKCiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07CiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247CiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09ICJ0aHJvdyIpIHsKICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZzsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXMucnZhbDsKICAgIH0sCgogICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikgewogICAgICBpZiAodGhpcy5kb25lKSB7CiAgICAgICAgdGhyb3cgZXhjZXB0aW9uOwogICAgICB9CgogICAgICB2YXIgY29udGV4dCA9IHRoaXM7CiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkgewogICAgICAgIHJlY29yZC50eXBlID0gInRocm93IjsKICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uOwogICAgICAgIGNvbnRleHQubmV4dCA9IGxvYzsKCiAgICAgICAgaWYgKGNhdWdodCkgewogICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jaywKICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuCiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJuZXh0IjsKICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICEhIGNhdWdodDsKICAgICAgfQoKICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjsKCiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gInJvb3QiKSB7CiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZQogICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvCiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLgogICAgICAgICAgcmV0dXJuIGhhbmRsZSgiZW5kIik7CiAgICAgICAgfQoKICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikgewogICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksICJjYXRjaExvYyIpOwogICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKTsKCiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkgewogICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHsKICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsKICAgICAgICAgICAgfQoKICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHsKICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHsKICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHsKICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpOwogICAgICAgICAgICB9CgogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykgewogICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldOwogICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmCiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCAiZmluYWxseUxvYyIpICYmCiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHsKICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJgogICAgICAgICAgKHR5cGUgPT09ICJicmVhayIgfHwKICAgICAgICAgICB0eXBlID09PSAiY29udGludWUiKSAmJgogICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiYKICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykgewogICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGEKICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suCiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDsKICAgICAgfQoKICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307CiAgICAgIHJlY29yZC50eXBlID0gdHlwZTsKICAgICAgcmVjb3JkLmFyZyA9IGFyZzsKCiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHsKICAgICAgICB0aGlzLm1ldGhvZCA9ICJuZXh0IjsKICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYzsKICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTsKICAgIH0sCgogICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHsKICAgICAgaWYgKHJlY29yZC50eXBlID09PSAidGhyb3ciKSB7CiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZzsKICAgICAgfQoKICAgICAgaWYgKHJlY29yZC50eXBlID09PSAiYnJlYWsiIHx8CiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gImNvbnRpbnVlIikgewogICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7CiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09ICJyZXR1cm4iKSB7CiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnOwogICAgICAgIHRoaXMubWV0aG9kID0gInJldHVybiI7CiAgICAgICAgdGhpcy5uZXh0ID0gImVuZCI7CiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09ICJub3JtYWwiICYmIGFmdGVyTG9jKSB7CiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7CiAgICAgIH0KCiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOwogICAgfSwKCiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHsKICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykgewogICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7CiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTsKICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICAiY2F0Y2giOiBmdW5jdGlvbih0cnlMb2MpIHsKICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHsKICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uOwogICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSAidGhyb3ciKSB7CiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnOwogICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aHJvd247CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb24KICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLgogICAgICB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpOwogICAgfSwKCiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykgewogICAgICB0aGlzLmRlbGVnYXRlID0gewogICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLAogICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsCiAgICAgICAgbmV4dExvYzogbmV4dExvYwogICAgICB9OwoKICAgICAgaWYgKHRoaXMubWV0aG9kID09PSAibmV4dCIpIHsKICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndAogICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS4KICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDsKICAgICAgfQoKICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7CiAgICB9CiAgfTsKCiAgLy8gUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZQogIC8vIG9yIG5vdCwgcmV0dXJuIHRoZSBydW50aW1lIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBkZWNsYXJlIHRoZSB2YXJpYWJsZQogIC8vIHJlZ2VuZXJhdG9yUnVudGltZSBpbiB0aGUgb3V0ZXIgc2NvcGUsIHdoaWNoIGFsbG93cyB0aGlzIG1vZHVsZSB0byBiZQogIC8vIGluamVjdGVkIGVhc2lseSBieSBgYmluL3JlZ2VuZXJhdG9yIC0taW5jbHVkZS1ydW50aW1lIHNjcmlwdC5qc2AuCiAgcmV0dXJuIGV4cG9ydHM7Cgp9KAogIC8vIElmIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZSwgdXNlIG1vZHVsZS5leHBvcnRzCiAgLy8gYXMgdGhlIHJlZ2VuZXJhdG9yUnVudGltZSBuYW1lc3BhY2UuIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgZW1wdHkKICAvLyBvYmplY3QuIEVpdGhlciB3YXksIHRoZSByZXN1bHRpbmcgb2JqZWN0IHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplCiAgLy8gdGhlIHJlZ2VuZXJhdG9yUnVudGltZSB2YXJpYWJsZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KICAgdHJ1ZSA/IG1vZHVsZS5leHBvcnRzIDogMAopKTsKCnRyeSB7CiAgcmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTsKfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAvLyBUaGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUsIHNvIHRoZSBhYm92ZQogIC8vIGFzc2lnbm1lbnQgc2hvdWxkIGFsd2F5cyB3b3JrIHVubGVzcyBzb21ldGhpbmcgaXMgbWlzY29uZmlndXJlZC4gSnVzdAogIC8vIGluIGNhc2UgcnVudGltZS5qcyBhY2NpZGVudGFsbHkgcnVucyBpbiBzdHJpY3QgbW9kZSwgaW4gbW9kZXJuIGVuZ2luZXMKICAvLyB3ZSBjYW4gZXhwbGljaXRseSBhY2Nlc3MgZ2xvYmFsVGhpcy4gSW4gb2xkZXIgZW5naW5lcyB3ZSBjYW4gZXNjYXBlCiAgLy8gc3RyaWN0IG1vZGUgdXNpbmcgYSBnbG9iYWwgRnVuY3Rpb24gY2FsbC4gVGhpcyBjb3VsZCBjb25jZWl2YWJseSBmYWlsCiAgLy8gaWYgYSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBmb3JiaWRzIHVzaW5nIEZ1bmN0aW9uLCBidXQgaW4gdGhhdCBjYXNlCiAgLy8gdGhlIHByb3BlciBzb2x1dGlvbiBpcyB0byBmaXggdGhlIGFjY2lkZW50YWwgc3RyaWN0IG1vZGUgcHJvYmxlbS4gSWYKICAvLyB5b3UndmUgbWlzY29uZmlndXJlZCB5b3VyIGJ1bmRsZXIgdG8gZm9yY2Ugc3RyaWN0IG1vZGUgYW5kIGFwcGxpZWQgYQogIC8vIENTUCB0byBmb3JiaWQgRnVuY3Rpb24sIGFuZCB5b3UncmUgbm90IHdpbGxpbmcgdG8gZml4IGVpdGhlciBvZiB0aG9zZQogIC8vIHByb2JsZW1zLCBwbGVhc2UgZGV0YWlsIHlvdXIgdW5pcXVlIHByZWRpY2FtZW50IGluIGEgR2l0SHViIGlzc3VlLgogIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgIGdsb2JhbFRoaXMucmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTsKICB9IGVsc2UgewogICAgRnVuY3Rpb24oInIiLCAicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHJ1bnRpbWUpOwogIH0KfQoKCi8qKiovIH0pLAoKLyoqKi8gIi4vbm9kZV9tb2R1bGVzL3doYXR3Zy1mZXRjaC9mZXRjaC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL25vZGVfbW9kdWxlcy93aGF0d2ctZmV0Y2gvZmV0Y2guanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBleHBvcnQgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHsKLyogaGFybW9ueSBleHBvcnQgKi8gICAiSGVhZGVycyI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBIZWFkZXJzOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJSZXF1ZXN0IjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIFJlcXVlc3Q7IH0sCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgIlJlc3BvbnNlIjogZnVuY3Rpb24oKSB7IHJldHVybiAvKiBiaW5kaW5nICovIFJlc3BvbnNlOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJET01FeGNlcHRpb24iOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8gRE9NRXhjZXB0aW9uOyB9LAovKiBoYXJtb255IGV4cG9ydCAqLyAgICJmZXRjaCI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gLyogYmluZGluZyAqLyBmZXRjaDsgfQovKiBoYXJtb255IGV4cG9ydCAqLyB9KTsKdmFyIHN1cHBvcnQgPSB7CiAgc2VhcmNoUGFyYW1zOiAnVVJMU2VhcmNoUGFyYW1zJyBpbiBzZWxmLAogIGl0ZXJhYmxlOiAnU3ltYm9sJyBpbiBzZWxmICYmICdpdGVyYXRvcicgaW4gU3ltYm9sLAogIGJsb2I6CiAgICAnRmlsZVJlYWRlcicgaW4gc2VsZiAmJgogICAgJ0Jsb2InIGluIHNlbGYgJiYKICAgIChmdW5jdGlvbigpIHsKICAgICAgdHJ5IHsKICAgICAgICBuZXcgQmxvYigpCiAgICAgICAgcmV0dXJuIHRydWUKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiBmYWxzZQogICAgICB9CiAgICB9KSgpLAogIGZvcm1EYXRhOiAnRm9ybURhdGEnIGluIHNlbGYsCiAgYXJyYXlCdWZmZXI6ICdBcnJheUJ1ZmZlcicgaW4gc2VsZgp9CgpmdW5jdGlvbiBpc0RhdGFWaWV3KG9iaikgewogIHJldHVybiBvYmogJiYgRGF0YVZpZXcucHJvdG90eXBlLmlzUHJvdG90eXBlT2Yob2JqKQp9CgppZiAoc3VwcG9ydC5hcnJheUJ1ZmZlcikgewogIHZhciB2aWV3Q2xhc3NlcyA9IFsKICAgICdbb2JqZWN0IEludDhBcnJheV0nLAogICAgJ1tvYmplY3QgVWludDhBcnJheV0nLAogICAgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJywKICAgICdbb2JqZWN0IEludDE2QXJyYXldJywKICAgICdbb2JqZWN0IFVpbnQxNkFycmF5XScsCiAgICAnW29iamVjdCBJbnQzMkFycmF5XScsCiAgICAnW29iamVjdCBVaW50MzJBcnJheV0nLAogICAgJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsCiAgICAnW29iamVjdCBGbG9hdDY0QXJyYXldJwogIF0KCiAgdmFyIGlzQXJyYXlCdWZmZXJWaWV3ID0KICAgIEFycmF5QnVmZmVyLmlzVmlldyB8fAogICAgZnVuY3Rpb24ob2JqKSB7CiAgICAgIHJldHVybiBvYmogJiYgdmlld0NsYXNzZXMuaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSkgPiAtMQogICAgfQp9CgpmdW5jdGlvbiBub3JtYWxpemVOYW1lKG5hbWUpIHsKICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7CiAgICBuYW1lID0gU3RyaW5nKG5hbWUpCiAgfQogIGlmICgvW15hLXowLTlcLSMkJSYnKisuXl9gfH5dL2kudGVzdChuYW1lKSkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWUnKQogIH0KICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpCn0KCmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHsKICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKQogIH0KICByZXR1cm4gdmFsdWUKfQoKLy8gQnVpbGQgYSBkZXN0cnVjdGl2ZSBpdGVyYXRvciBmb3IgdGhlIHZhbHVlIGxpc3QKZnVuY3Rpb24gaXRlcmF0b3JGb3IoaXRlbXMpIHsKICB2YXIgaXRlcmF0b3IgPSB7CiAgICBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHZhbHVlID0gaXRlbXMuc2hpZnQoKQogICAgICByZXR1cm4ge2RvbmU6IHZhbHVlID09PSB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZX0KICAgIH0KICB9CgogIGlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7CiAgICBpdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBpdGVyYXRvcgogICAgfQogIH0KCiAgcmV0dXJuIGl0ZXJhdG9yCn0KCmZ1bmN0aW9uIEhlYWRlcnMoaGVhZGVycykgewogIHRoaXMubWFwID0ge30KCiAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7CiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHsKICAgICAgdGhpcy5hcHBlbmQobmFtZSwgdmFsdWUpCiAgICB9LCB0aGlzKQogIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkgewogICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKGhlYWRlcikgewogICAgICB0aGlzLmFwcGVuZChoZWFkZXJbMF0sIGhlYWRlclsxXSkKICAgIH0sIHRoaXMpCiAgfSBlbHNlIGlmIChoZWFkZXJzKSB7CiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgdGhpcy5hcHBlbmQobmFtZSwgaGVhZGVyc1tuYW1lXSkKICAgIH0sIHRoaXMpCiAgfQp9CgpIZWFkZXJzLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewogIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpCiAgdmFsdWUgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSkKICB2YXIgb2xkVmFsdWUgPSB0aGlzLm1hcFtuYW1lXQogIHRoaXMubWFwW25hbWVdID0gb2xkVmFsdWUgPyBvbGRWYWx1ZSArICcsICcgKyB2YWx1ZSA6IHZhbHVlCn0KCkhlYWRlcnMucHJvdG90eXBlWydkZWxldGUnXSA9IGZ1bmN0aW9uKG5hbWUpIHsKICBkZWxldGUgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV0KfQoKSGVhZGVycy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24obmFtZSkgewogIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpCiAgcmV0dXJuIHRoaXMuaGFzKG5hbWUpID8gdGhpcy5tYXBbbmFtZV0gOiBudWxsCn0KCkhlYWRlcnMucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKG5hbWUpIHsKICByZXR1cm4gdGhpcy5tYXAuaGFzT3duUHJvcGVydHkobm9ybWFsaXplTmFtZShuYW1lKSkKfQoKSGVhZGVycy5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKQp9CgpIZWFkZXJzLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oY2FsbGJhY2ssIHRoaXNBcmcpIHsKICBmb3IgKHZhciBuYW1lIGluIHRoaXMubWFwKSB7CiAgICBpZiAodGhpcy5tYXAuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB0aGlzLm1hcFtuYW1lXSwgbmFtZSwgdGhpcykKICAgIH0KICB9Cn0KCkhlYWRlcnMucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbigpIHsKICB2YXIgaXRlbXMgPSBbXQogIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkgewogICAgaXRlbXMucHVzaChuYW1lKQogIH0pCiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKQp9CgpIZWFkZXJzLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHsKICB2YXIgaXRlbXMgPSBbXQogIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkgewogICAgaXRlbXMucHVzaCh2YWx1ZSkKICB9KQogIHJldHVybiBpdGVyYXRvckZvcihpdGVtcykKfQoKSGVhZGVycy5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uKCkgewogIHZhciBpdGVtcyA9IFtdCiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7CiAgICBpdGVtcy5wdXNoKFtuYW1lLCB2YWx1ZV0pCiAgfSkKICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpCn0KCmlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7CiAgSGVhZGVycy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IEhlYWRlcnMucHJvdG90eXBlLmVudHJpZXMKfQoKZnVuY3Rpb24gY29uc3VtZWQoYm9keSkgewogIGlmIChib2R5LmJvZHlVc2VkKSB7CiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJykpCiAgfQogIGJvZHkuYm9keVVzZWQgPSB0cnVlCn0KCmZ1bmN0aW9uIGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpIHsKICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oKSB7CiAgICAgIHJlc29sdmUocmVhZGVyLnJlc3VsdCkKICAgIH0KICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oKSB7CiAgICAgIHJlamVjdChyZWFkZXIuZXJyb3IpCiAgICB9CiAgfSkKfQoKZnVuY3Rpb24gcmVhZEJsb2JBc0FycmF5QnVmZmVyKGJsb2IpIHsKICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKQogIHZhciBwcm9taXNlID0gZmlsZVJlYWRlclJlYWR5KHJlYWRlcikKICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYikKICByZXR1cm4gcHJvbWlzZQp9CgpmdW5jdGlvbiByZWFkQmxvYkFzVGV4dChibG9iKSB7CiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCkKICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpCiAgcmVhZGVyLnJlYWRBc1RleHQoYmxvYikKICByZXR1cm4gcHJvbWlzZQp9CgpmdW5jdGlvbiByZWFkQXJyYXlCdWZmZXJBc1RleHQoYnVmKSB7CiAgdmFyIHZpZXcgPSBuZXcgVWludDhBcnJheShidWYpCiAgdmFyIGNoYXJzID0gbmV3IEFycmF5KHZpZXcubGVuZ3RoKQoKICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcubGVuZ3RoOyBpKyspIHsKICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZSh2aWV3W2ldKQogIH0KICByZXR1cm4gY2hhcnMuam9pbignJykKfQoKZnVuY3Rpb24gYnVmZmVyQ2xvbmUoYnVmKSB7CiAgaWYgKGJ1Zi5zbGljZSkgewogICAgcmV0dXJuIGJ1Zi5zbGljZSgwKQogIH0gZWxzZSB7CiAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zi5ieXRlTGVuZ3RoKQogICAgdmlldy5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmKSkKICAgIHJldHVybiB2aWV3LmJ1ZmZlcgogIH0KfQoKZnVuY3Rpb24gQm9keSgpIHsKICB0aGlzLmJvZHlVc2VkID0gZmFsc2UKCiAgdGhpcy5faW5pdEJvZHkgPSBmdW5jdGlvbihib2R5KSB7CiAgICB0aGlzLl9ib2R5SW5pdCA9IGJvZHkKICAgIGlmICghYm9keSkgewogICAgICB0aGlzLl9ib2R5VGV4dCA9ICcnCiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykgewogICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkKICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5ibG9iICYmIEJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHsKICAgICAgdGhpcy5fYm9keUJsb2IgPSBib2R5CiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuZm9ybURhdGEgJiYgRm9ybURhdGEucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHsKICAgICAgdGhpcy5fYm9keUZvcm1EYXRhID0gYm9keQogICAgfSBlbHNlIGlmIChzdXBwb3J0LnNlYXJjaFBhcmFtcyAmJiBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHsKICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5LnRvU3RyaW5nKCkKICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiBzdXBwb3J0LmJsb2IgJiYgaXNEYXRhVmlldyhib2R5KSkgewogICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIgPSBidWZmZXJDbG9uZShib2R5LmJ1ZmZlcikKICAgICAgLy8gSUUgMTAtMTEgY2FuJ3QgaGFuZGxlIGEgRGF0YVZpZXcgYm9keS4KICAgICAgdGhpcy5fYm9keUluaXQgPSBuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSkKICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiAoQXJyYXlCdWZmZXIucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkgfHwgaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkpKSB7CiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkpCiAgICB9IGVsc2UgewogICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYm9keSkKICAgIH0KCiAgICBpZiAoIXRoaXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpKSB7CiAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHsKICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAndGV4dC9wbGFpbjtjaGFyc2V0PVVURi04JykKICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QmxvYiAmJiB0aGlzLl9ib2R5QmxvYi50eXBlKSB7CiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgdGhpcy5fYm9keUJsb2IudHlwZSkKICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LnNlYXJjaFBhcmFtcyAmJiBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHsKICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnKQogICAgICB9CiAgICB9CiAgfQoKICBpZiAoc3VwcG9ydC5ibG9iKSB7CiAgICB0aGlzLmJsb2IgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcykKICAgICAgaWYgKHJlamVjdGVkKSB7CiAgICAgICAgcmV0dXJuIHJlamVjdGVkCiAgICAgIH0KCiAgICAgIGlmICh0aGlzLl9ib2R5QmxvYikgewogICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUJsb2IpCiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSkpCiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIGJsb2InKQogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlUZXh0XSkpCiAgICAgIH0KICAgIH0KCiAgICB0aGlzLmFycmF5QnVmZmVyID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHsKICAgICAgICByZXR1cm4gY29uc3VtZWQodGhpcykgfHwgUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpcy5ibG9iKCkudGhlbihyZWFkQmxvYkFzQXJyYXlCdWZmZXIpCiAgICAgIH0KICAgIH0KICB9CgogIHRoaXMudGV4dCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcykKICAgIGlmIChyZWplY3RlZCkgewogICAgICByZXR1cm4gcmVqZWN0ZWQKICAgIH0KCiAgICBpZiAodGhpcy5fYm9keUJsb2IpIHsKICAgICAgcmV0dXJuIHJlYWRCbG9iQXNUZXh0KHRoaXMuX2JvZHlCbG9iKQogICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZWFkQXJyYXlCdWZmZXJBc1RleHQodGhpcy5fYm9keUFycmF5QnVmZmVyKSkKICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyB0ZXh0JykKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpCiAgICB9CiAgfQoKICBpZiAoc3VwcG9ydC5mb3JtRGF0YSkgewogICAgdGhpcy5mb3JtRGF0YSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihkZWNvZGUpCiAgICB9CiAgfQoKICB0aGlzLmpzb24gPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKEpTT04ucGFyc2UpCiAgfQoKICByZXR1cm4gdGhpcwp9CgovLyBIVFRQIG1ldGhvZHMgd2hvc2UgY2FwaXRhbGl6YXRpb24gc2hvdWxkIGJlIG5vcm1hbGl6ZWQKdmFyIG1ldGhvZHMgPSBbJ0RFTEVURScsICdHRVQnLCAnSEVBRCcsICdPUFRJT05TJywgJ1BPU1QnLCAnUFVUJ10KCmZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZChtZXRob2QpIHsKICB2YXIgdXBjYXNlZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpCiAgcmV0dXJuIG1ldGhvZHMuaW5kZXhPZih1cGNhc2VkKSA+IC0xID8gdXBjYXNlZCA6IG1ldGhvZAp9CgpmdW5jdGlvbiBSZXF1ZXN0KGlucHV0LCBvcHRpb25zKSB7CiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge30KICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keQoKICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7CiAgICBpZiAoaW5wdXQuYm9keVVzZWQpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJykKICAgIH0KICAgIHRoaXMudXJsID0gaW5wdXQudXJsCiAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5wdXQuY3JlZGVudGlhbHMKICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7CiAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKGlucHV0LmhlYWRlcnMpCiAgICB9CiAgICB0aGlzLm1ldGhvZCA9IGlucHV0Lm1ldGhvZAogICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZQogICAgdGhpcy5zaWduYWwgPSBpbnB1dC5zaWduYWwKICAgIGlmICghYm9keSAmJiBpbnB1dC5fYm9keUluaXQgIT0gbnVsbCkgewogICAgICBib2R5ID0gaW5wdXQuX2JvZHlJbml0CiAgICAgIGlucHV0LmJvZHlVc2VkID0gdHJ1ZQogICAgfQogIH0gZWxzZSB7CiAgICB0aGlzLnVybCA9IFN0cmluZyhpbnB1dCkKICB9CgogIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzIHx8IHRoaXMuY3JlZGVudGlhbHMgfHwgJ3NhbWUtb3JpZ2luJwogIGlmIChvcHRpb25zLmhlYWRlcnMgfHwgIXRoaXMuaGVhZGVycykgewogICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKQogIH0KICB0aGlzLm1ldGhvZCA9IG5vcm1hbGl6ZU1ldGhvZChvcHRpb25zLm1ldGhvZCB8fCB0aGlzLm1ldGhvZCB8fCAnR0VUJykKICB0aGlzLm1vZGUgPSBvcHRpb25zLm1vZGUgfHwgdGhpcy5tb2RlIHx8IG51bGwKICB0aGlzLnNpZ25hbCA9IG9wdGlvbnMuc2lnbmFsIHx8IHRoaXMuc2lnbmFsCiAgdGhpcy5yZWZlcnJlciA9IG51bGwKCiAgaWYgKCh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykgJiYgYm9keSkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9keSBub3QgYWxsb3dlZCBmb3IgR0VUIG9yIEhFQUQgcmVxdWVzdHMnKQogIH0KICB0aGlzLl9pbml0Qm9keShib2R5KQp9CgpSZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBuZXcgUmVxdWVzdCh0aGlzLCB7Ym9keTogdGhpcy5fYm9keUluaXR9KQp9CgpmdW5jdGlvbiBkZWNvZGUoYm9keSkgewogIHZhciBmb3JtID0gbmV3IEZvcm1EYXRhKCkKICBib2R5CiAgICAudHJpbSgpCiAgICAuc3BsaXQoJyYnKQogICAgLmZvckVhY2goZnVuY3Rpb24oYnl0ZXMpIHsKICAgICAgaWYgKGJ5dGVzKSB7CiAgICAgICAgdmFyIHNwbGl0ID0gYnl0ZXMuc3BsaXQoJz0nKQogICAgICAgIHZhciBuYW1lID0gc3BsaXQuc2hpZnQoKS5yZXBsYWNlKC9cKy9nLCAnICcpCiAgICAgICAgdmFyIHZhbHVlID0gc3BsaXQuam9pbignPScpLnJlcGxhY2UoL1wrL2csICcgJykKICAgICAgICBmb3JtLmFwcGVuZChkZWNvZGVVUklDb21wb25lbnQobmFtZSksIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpCiAgICAgIH0KICAgIH0pCiAgcmV0dXJuIGZvcm0KfQoKZnVuY3Rpb24gcGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpIHsKICB2YXIgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCkKICAvLyBSZXBsYWNlIGluc3RhbmNlcyBvZiBcclxuIGFuZCBcbiBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUgc3BhY2Ugb3IgaG9yaXpvbnRhbCB0YWIgd2l0aCBhIHNwYWNlCiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjIKICB2YXIgcHJlUHJvY2Vzc2VkSGVhZGVycyA9IHJhd0hlYWRlcnMucmVwbGFjZSgvXHI/XG5bXHQgXSsvZywgJyAnKQogIHByZVByb2Nlc3NlZEhlYWRlcnMuc3BsaXQoL1xyP1xuLykuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7CiAgICB2YXIgcGFydHMgPSBsaW5lLnNwbGl0KCc6JykKICAgIHZhciBrZXkgPSBwYXJ0cy5zaGlmdCgpLnRyaW0oKQogICAgaWYgKGtleSkgewogICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5qb2luKCc6JykudHJpbSgpCiAgICAgIGhlYWRlcnMuYXBwZW5kKGtleSwgdmFsdWUpCiAgICB9CiAgfSkKICByZXR1cm4gaGVhZGVycwp9CgpCb2R5LmNhbGwoUmVxdWVzdC5wcm90b3R5cGUpCgpmdW5jdGlvbiBSZXNwb25zZShib2R5SW5pdCwgb3B0aW9ucykgewogIGlmICghb3B0aW9ucykgewogICAgb3B0aW9ucyA9IHt9CiAgfQoKICB0aGlzLnR5cGUgPSAnZGVmYXVsdCcKICB0aGlzLnN0YXR1cyA9IG9wdGlvbnMuc3RhdHVzID09PSB1bmRlZmluZWQgPyAyMDAgOiBvcHRpb25zLnN0YXR1cwogIHRoaXMub2sgPSB0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCAzMDAKICB0aGlzLnN0YXR1c1RleHQgPSAnc3RhdHVzVGV4dCcgaW4gb3B0aW9ucyA/IG9wdGlvbnMuc3RhdHVzVGV4dCA6ICdPSycKICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpCiAgdGhpcy51cmwgPSBvcHRpb25zLnVybCB8fCAnJwogIHRoaXMuX2luaXRCb2R5KGJvZHlJbml0KQp9CgpCb2R5LmNhbGwoUmVzcG9uc2UucHJvdG90eXBlKQoKUmVzcG9uc2UucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLl9ib2R5SW5pdCwgewogICAgc3RhdHVzOiB0aGlzLnN0YXR1cywKICAgIHN0YXR1c1RleHQ6IHRoaXMuc3RhdHVzVGV4dCwKICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHRoaXMuaGVhZGVycyksCiAgICB1cmw6IHRoaXMudXJsCiAgfSkKfQoKUmVzcG9uc2UuZXJyb3IgPSBmdW5jdGlvbigpIHsKICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UobnVsbCwge3N0YXR1czogMCwgc3RhdHVzVGV4dDogJyd9KQogIHJlc3BvbnNlLnR5cGUgPSAnZXJyb3InCiAgcmV0dXJuIHJlc3BvbnNlCn0KCnZhciByZWRpcmVjdFN0YXR1c2VzID0gWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XQoKUmVzcG9uc2UucmVkaXJlY3QgPSBmdW5jdGlvbih1cmwsIHN0YXR1cykgewogIGlmIChyZWRpcmVjdFN0YXR1c2VzLmluZGV4T2Yoc3RhdHVzKSA9PT0gLTEpIHsKICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0YXR1cyBjb2RlJykKICB9CgogIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwge3N0YXR1czogc3RhdHVzLCBoZWFkZXJzOiB7bG9jYXRpb246IHVybH19KQp9Cgp2YXIgRE9NRXhjZXB0aW9uID0gc2VsZi5ET01FeGNlcHRpb24KdHJ5IHsKICBuZXcgRE9NRXhjZXB0aW9uKCkKfSBjYXRjaCAoZXJyKSB7CiAgRE9NRXhjZXB0aW9uID0gZnVuY3Rpb24obWVzc2FnZSwgbmFtZSkgewogICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZQogICAgdGhpcy5uYW1lID0gbmFtZQogICAgdmFyIGVycm9yID0gRXJyb3IobWVzc2FnZSkKICAgIHRoaXMuc3RhY2sgPSBlcnJvci5zdGFjawogIH0KICBET01FeGNlcHRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpCiAgRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERPTUV4Y2VwdGlvbgp9CgpmdW5jdGlvbiBmZXRjaChpbnB1dCwgaW5pdCkgewogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgIHZhciByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpCgogICAgaWYgKHJlcXVlc3Quc2lnbmFsICYmIHJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHsKICAgICAgcmV0dXJuIHJlamVjdChuZXcgRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSkKICAgIH0KCiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCkKCiAgICBmdW5jdGlvbiBhYm9ydFhocigpIHsKICAgICAgeGhyLmFib3J0KCkKICAgIH0KCiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBvcHRpb25zID0gewogICAgICAgIHN0YXR1czogeGhyLnN0YXR1cywKICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCwKICAgICAgICBoZWFkZXJzOiBwYXJzZUhlYWRlcnMoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpIHx8ICcnKQogICAgICB9CiAgICAgIG9wdGlvbnMudXJsID0gJ3Jlc3BvbnNlVVJMJyBpbiB4aHIgPyB4aHIucmVzcG9uc2VVUkwgOiBvcHRpb25zLmhlYWRlcnMuZ2V0KCdYLVJlcXVlc3QtVVJMJykKICAgICAgdmFyIGJvZHkgPSAncmVzcG9uc2UnIGluIHhociA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHQKICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYm9keSwgb3B0aW9ucykpCiAgICB9CgogICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHsKICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSkKICAgIH0KCiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJykpCiAgICB9CgogICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHsKICAgICAgcmVqZWN0KG5ldyBET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKQogICAgfQoKICAgIHhoci5vcGVuKHJlcXVlc3QubWV0aG9kLCByZXF1ZXN0LnVybCwgdHJ1ZSkKCiAgICBpZiAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ2luY2x1ZGUnKSB7CiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlCiAgICB9IGVsc2UgaWYgKHJlcXVlc3QuY3JlZGVudGlhbHMgPT09ICdvbWl0JykgewogICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gZmFsc2UKICAgIH0KCiAgICBpZiAoJ3Jlc3BvbnNlVHlwZScgaW4geGhyICYmIHN1cHBvcnQuYmxvYikgewogICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2Jsb2InCiAgICB9CgogICAgcmVxdWVzdC5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHsKICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpCiAgICB9KQoKICAgIGlmIChyZXF1ZXN0LnNpZ25hbCkgewogICAgICByZXF1ZXN0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKQoKICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIERPTkUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSkKICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHsKICAgICAgICAgIHJlcXVlc3Quc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRYaHIpCiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgeGhyLnNlbmQodHlwZW9mIHJlcXVlc3QuX2JvZHlJbml0ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiByZXF1ZXN0Ll9ib2R5SW5pdCkKICB9KQp9CgpmZXRjaC5wb2x5ZmlsbCA9IHRydWUKCmlmICghc2VsZi5mZXRjaCkgewogIHNlbGYuZmV0Y2ggPSBmZXRjaAogIHNlbGYuSGVhZGVycyA9IEhlYWRlcnMKICBzZWxmLlJlcXVlc3QgPSBSZXF1ZXN0CiAgc2VsZi5SZXNwb25zZSA9IFJlc3BvbnNlCn0KCgovKioqLyB9KQoKLyoqKioqKi8gCX0pOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqLyAJLy8gVGhlIG1vZHVsZSBjYWNoZQovKioqKioqLyAJdmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9OwovKioqKioqLyAJCi8qKioqKiovIAkvLyBUaGUgcmVxdWlyZSBmdW5jdGlvbgovKioqKioqLyAJZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkgewovKioqKioqLyAJCS8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZQovKioqKioqLyAJCXZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdOwovKioqKioqLyAJCWlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkgewovKioqKioqLyAJCQlyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7Ci8qKioqKiovIAkJfQovKioqKioqLyAJCS8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpCi8qKioqKiovIAkJdmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7Ci8qKioqKiovIAkJCWlkOiBtb2R1bGVJZCwKLyoqKioqKi8gCQkJLy8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWQKLyoqKioqKi8gCQkJZXhwb3J0czoge30KLyoqKioqKi8gCQl9OwovKioqKioqLyAJCi8qKioqKiovIAkJLy8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uCi8qKioqKiovIAkJX193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7Ci8qKioqKiovIAkKLyoqKioqKi8gCQkvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZQovKioqKioqLyAJCXJldHVybiBtb2R1bGUuZXhwb3J0czsKLyoqKioqKi8gCX0KLyoqKioqKi8gCQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqLyAJLyogd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQgKi8KLyoqKioqKi8gCSFmdW5jdGlvbigpIHsKLyoqKioqKi8gCQkvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlcwovKioqKioqLyAJCV9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkgewovKioqKioqLyAJCQl2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID8KLyoqKioqKi8gCQkJCWZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOgovKioqKioqLyAJCQkJZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGU7IH07Ci8qKioqKiovIAkJCV9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pOwovKioqKioqLyAJCQlyZXR1cm4gZ2V0dGVyOwovKioqKioqLyAJCX07Ci8qKioqKiovIAl9KCk7Ci8qKioqKiovIAkKLyoqKioqKi8gCS8qIHdlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyAqLwovKioqKioqLyAJIWZ1bmN0aW9uKCkgewovKioqKioqLyAJCS8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHMKLyoqKioqKi8gCQlfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBkZWZpbml0aW9uKSB7Ci8qKioqKiovIAkJCWZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHsKLyoqKioqKi8gCQkJCWlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkgewovKioqKioqLyAJCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7Ci8qKioqKiovIAkJCQl9Ci8qKioqKiovIAkJCX0KLyoqKioqKi8gCQl9OwovKioqKioqLyAJfSgpOwovKioqKioqLyAJCi8qKioqKiovIAkvKiB3ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsICovCi8qKioqKiovIAkhZnVuY3Rpb24oKSB7Ci8qKioqKiovIAkJX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkgewovKioqKioqLyAJCQlpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpczsKLyoqKioqKi8gCQkJdHJ5IHsKLyoqKioqKi8gCQkJCXJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpOwovKioqKioqLyAJCQl9IGNhdGNoIChlKSB7Ci8qKioqKiovIAkJCQlpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7Ci8qKioqKiovIAkJCX0KLyoqKioqKi8gCQl9KSgpOwovKioqKioqLyAJfSgpOwovKioqKioqLyAJCi8qKioqKiovIAkvKiB3ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kICovCi8qKioqKiovIAkhZnVuY3Rpb24oKSB7Ci8qKioqKiovIAkJX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqLCBwcm9wKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTsgfQovKioqKioqLyAJfSgpOwovKioqKioqLyAJCi8qKioqKiovIAkvKiB3ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0ICovCi8qKioqKiovIAkhZnVuY3Rpb24oKSB7Ci8qKioqKiovIAkJLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0cwovKioqKioqLyAJCV9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHsKLyoqKioqKi8gCQkJaWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7Ci8qKioqKiovIAkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTsKLyoqKioqKi8gCQkJfQovKioqKioqLyAJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOwovKioqKioqLyAJCX07Ci8qKioqKiovIAl9KCk7Ci8qKioqKiovIAkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdmFyIF9fd2VicGFja19leHBvcnRzX18gPSB7fTsKLy8gVGhpcyBlbnRyeSBuZWVkIHRvIGJlIHdyYXBwZWQgaW4gYW4gSUlGRSBiZWNhdXNlIGl0IG5lZWQgdG8gYmUgaW4gc3RyaWN0IG1vZGUuCiFmdW5jdGlvbigpIHsKInVzZSBzdHJpY3QiOwovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4vc3JjL3ZpZXcvaW5kZXguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKiovCl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkgKi8gIi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfYmFiZWxfcnVudGltZV9oZWxwZXJzX2RlZmluZVByb3BlcnR5X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcyAqLyAiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciByZWdlbmVyYXRvcl9ydW50aW1lX3J1bnRpbWVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIHJlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZSAqLyAiLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciByZWdlbmVyYXRvcl9ydW50aW1lX3J1bnRpbWVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihyZWdlbmVyYXRvcl9ydW50aW1lX3J1bnRpbWVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciB3aGF0d2dfZmV0Y2hfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIHdoYXR3Zy1mZXRjaCAqLyAiLi9ub2RlX21vZHVsZXMvd2hhdHdnLWZldGNoL2ZldGNoLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBoeXBlcmFwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgaHlwZXJhcHAgKi8gIi4vbm9kZV9tb2R1bGVzL2h5cGVyYXBwL3NyYy9pbmRleC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfQXBwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvQXBwICovICIuL3NyYy92aWV3L0FwcC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfc3R5bGVzX2luZGV4X2Nzc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQC92aWV3L3N0eWxlcy9pbmRleC5jc3MgKi8gIi4vc3JjL3ZpZXcvc3R5bGVzL2luZGV4LmNzcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ZpZXdfc3R5bGVzX2luZGV4X2Nzc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKF92aWV3X3N0eWxlc19pbmRleF9jc3NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXyk7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfdmlld19zdG9yZV9hY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvc3RvcmUvYWN0aW9ucyAqLyAiLi9zcmMvdmlldy9zdG9yZS9hY3Rpb25zLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfdmlld19zdG9yZV9zdGF0ZV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgQC92aWV3L3N0b3JlL3N0YXRlICovICIuL3NyYy92aWV3L3N0b3JlL3N0YXRlLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfdmlld191dGlsX2dldFVzZXJNZXRhX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBAL3ZpZXcvdXRpbC9nZXRVc2VyTWV0YSAqLyAiLi9zcmMvdmlldy91dGlsL2dldFVzZXJNZXRhLmpzIik7Ci8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2hhcmVkX3Rvb2xfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9zaGFyZWQvdG9vbCAqLyAiLi9zcmMvc2hhcmVkL3Rvb2wuanMiKTsKLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zaGFyZWRfc2hvdWxkRGlyZWN0RW1iZWRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzExX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9zaGFyZWQvc2hvdWxkRGlyZWN0RW1iZWQgKi8gIi4vc3JjL3NoYXJlZC9zaG91bGREaXJlY3RFbWJlZC5qcyIpOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3NoYXJlZF91bEV2ZW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIEAvc2hhcmVkL3VsRXZlbnRzICovICIuL3NyYy9zaGFyZWQvdWxFdmVudHMuanMiKTsKCgovKiBnbG9iYWxzIGRvY3VtZW50IHdpbmRvdyovCi8vIFBvbHlmaWxscwoKCgoKCgoKCgoKCiAvLyBDb25zdW1lIGJvb3RzdHJhcHBlZCBjb25maWcKCnZhciBfd2luZG93JF9fY2ZnID0gd2luZG93Ll9fY2ZnLAogICAgZnJhbWUgPSBfd2luZG93JF9fY2ZnLmZyYW1lLAogICAgZW52SWQgPSBfd2luZG93JF9fY2ZnLmVudklkLAogICAgc3VydmV5SWQgPSBfd2luZG93JF9fY2ZnLnN1cnZleUlkLAogICAgdXNlcklkID0gX3dpbmRvdyRfX2NmZy51c2VySWQsCiAgICBjYXJkcyA9IF93aW5kb3ckX19jZmcuY2FyZHMsCiAgICBtb2RlID0gX3dpbmRvdyRfX2NmZy5tb2RlLAogICAgX3dpbmRvdyRfX2NmZyRib3JkZXIgPSBfd2luZG93JF9fY2ZnLmJvcmRlciwKICAgIGJvcmRlciA9IF93aW5kb3ckX19jZmckYm9yZGVyID09PSB2b2lkIDAgPyAnIzY2NjRmNycgOiBfd2luZG93JF9fY2ZnJGJvcmRlciwKICAgIGNvbnRleHQgPSBfd2luZG93JF9fY2ZnLmNvbnRleHQsCiAgICBsb2NhbGUgPSBfd2luZG93JF9fY2ZnLmxvY2FsZSwKICAgIGZvbnRGYW1pbHkgPSBfd2luZG93JF9fY2ZnLmZvbnRGYW1pbHksCiAgICBmb250RmFtaWx5VVJMID0gX3dpbmRvdyRfX2NmZy5mb250RmFtaWx5VVJMLAogICAgYXBpVVJMID0gX3dpbmRvdyRfX2NmZy5hcGlVUkwsCiAgICBzaG93U3VydmV5QnJhbmQgPSBfd2luZG93JF9fY2ZnLnNob3dTdXJ2ZXlCcmFuZCwKICAgIG1hcmtldGluZ1VybCA9IF93aW5kb3ckX19jZmcubWFya2V0aW5nVXJsLAogICAgc2x1Z05hbWUgPSBfd2luZG93JF9fY2ZnLnNsdWdOYW1lLAogICAgcmVzcG9uc2VHcm91cFVpZCA9IF93aW5kb3ckX19jZmcucmVzcG9uc2VHcm91cFVpZCwKICAgIGhlYWRlcnMgPSBfd2luZG93JF9fY2ZnLmhlYWRlcnMsCiAgICBlbmRDYXJkID0gX3dpbmRvdyRfX2NmZy5lbmRDYXJkLAogICAgY3VzdG9tU3R5bGVzID0gX3dpbmRvdyRfX2NmZy5jdXN0b21TdHlsZXMsCiAgICBjb25maWd1cmVFeGl0T25PdmVybGF5Q2xpY2sgPSBfd2luZG93JF9fY2ZnLmNvbmZpZ3VyZUV4aXRPbk92ZXJsYXlDbGljaywKICAgIGlzUHJldmlldyA9IF93aW5kb3ckX19jZmcuaXNQcmV2aWV3LAogICAgYW5zd2VycyA9IF93aW5kb3ckX19jZmcuYW5zd2VycywKICAgIGN1c3RvbU1ldGFkYXRhID0gX3dpbmRvdyRfX2NmZy5jdXN0b21NZXRhZGF0YSwKICAgIGV4cGVyaW1lbnRGbGFncyA9IF93aW5kb3ckX19jZmcuZXhwZXJpbWVudEZsYWdzLAogICAgdXNlTW9iaWxlU3R5bGluZyA9IF93aW5kb3ckX19jZmcudXNlTW9iaWxlU3R5bGluZywKICAgIG1vYmlsZVBsYXRmb3JtID0gX3dpbmRvdyRfX2NmZy5tb2JpbGVQbGF0Zm9ybSwKICAgIGV2ZW50RW1pdHRlciA9IF93aW5kb3ckX19jZmcuZXZlbnRFbWl0dGVyOwp2YXIgX2RvY3VtZW50ID0gZG9jdW1lbnQsCiAgICBoZWFkID0gX2RvY3VtZW50LmhlYWQ7CnZhciB2aWV3U2RrVmVyc2lvbiA9ICcyLjE0LjQnOyAvLyBidWlsZC5qcyBsbjc0IHdpbGwgc3RyaW5nIHJlcGxhY2UuIERvIG5vdCBtb2RpZnksIGluc3RlYWQgY2hhbmdlIHRoZSB2ZXJzaW9uIG51bWJlciBpbiBwYWNrYWdlLmpzb24KCnZhciBiYWNrd2FyZENvbXBhdGlibGVFdmVudEVtaXR0ZXIgPSBldmVudEVtaXR0ZXIgfHwgZnJhbWUuZXZlbnRFbWl0dGVyOwpiYWNrd2FyZENvbXBhdGlibGVFdmVudEVtaXR0ZXIgJiYgYmFja3dhcmRDb21wYXRpYmxlRXZlbnRFbWl0dGVyLmVtaXQoX3NoYXJlZF91bEV2ZW50c19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTJfXy5pbnRlcm5hbEV2ZW50cy5uYW1lLlZFUklGWV9WSUVXX1ZFUlNJT04sIF9iYWJlbF9ydW50aW1lX2hlbHBlcnNfZGVmaW5lUHJvcGVydHlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0KCkoe30sIF9zaGFyZWRfdWxFdmVudHNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEyX18uaW50ZXJuYWxFdmVudHMuZGF0YS5WSUVXX1ZFUlNJT04sIHZpZXdTZGtWZXJzaW9uKSk7IC8vIEluamVjdCBzdHlsZXNoZWV0Cgp2YXIgc3R5bGVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKc3R5bGVzLnR5cGUgPSAndGV4dC9jc3MnOwpzdHlsZXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoKF92aWV3X3N0eWxlc19pbmRleF9jc3NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfX19kZWZhdWx0KCkpKSk7CmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVzKTsKY3VzdG9tU3R5bGVzICYmICgwLF9zaGFyZWRfdG9vbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTBfXy5vdmVycmlkZVN0eWxlcykoZG9jdW1lbnQsIGN1c3RvbVN0eWxlcyk7IC8vIEluamVjdCBicmFuZCBmb250cwovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYKCmlmIChmb250RmFtaWx5ICYmIGZvbnRGYW1pbHlVUkwgJiYgcGFyZW50KSB7CiAgLy8gcGFyZW50IGNvbWVzIGZyb20gdGhlIERPTQogIHZhciBsaW5rcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTsKICBsaW5rcy5yZWwgPSAnc3R5bGVzaGVldCc7CiAgbGlua3MuaHJlZiA9IGZvbnRGYW1pbHlVUkw7CiAgaGVhZC5hcHBlbmRDaGlsZChsaW5rcyk7Cn0KCnZhciBjb250YWluZXIgPSAoMCxfc2hhcmVkX3Nob3VsZERpcmVjdEVtYmVkX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fWyJkZWZhdWx0Il0pKGhlYWRlcnMpID8gd2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZyYW1lKSA6IGRvY3VtZW50LmJvZHk7CnZhciBtYWluID0gKDAsaHlwZXJhcHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXy5hcHApKF92aWV3X3N0b3JlX3N0YXRlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X19bImRlZmF1bHQiXSwgX3ZpZXdfc3RvcmVfYWN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19fWyJkZWZhdWx0Il0sIF92aWV3X0FwcF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fWyJkZWZhdWx0Il0sIGNvbnRhaW5lcik7Cm1haW4uaW5pdCh7CiAgc3VydmV5SWQ6IHN1cnZleUlkLAogIGZyYW1lOiBmcmFtZSwKICBlbnZJZDogZW52SWQsCiAgdXNlcklkOiB1c2VySWQsCiAgY2FyZHM6IGNhcmRzLAogIG1vZGU6IG1vZGUsCiAgbWV0YTogKDAsX3ZpZXdfdXRpbF9nZXRVc2VyTWV0YV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOV9fWyJkZWZhdWx0Il0pKHsKICAgIG1vZGU6IG1vZGUsCiAgICBkaXJlY3RFbWJlZDogKDAsX3NoYXJlZF9zaG91bGREaXJlY3RFbWJlZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTFfX1siZGVmYXVsdCJdKShoZWFkZXJzKQogIH0pLAogIGJvcmRlcjogYm9yZGVyLAogIGZvbnRGYW1pbHk6IGZvbnRGYW1pbHksCiAgY29udGV4dDogY29udGV4dCwKICBsb2NhbGU6IGxvY2FsZSwKICBhcGlVUkw6IGFwaVVSTCwKICBzaG93U3VydmV5QnJhbmQ6IHNob3dTdXJ2ZXlCcmFuZCwKICBtYXJrZXRpbmdVcmw6IG1hcmtldGluZ1VybCwKICBzbHVnTmFtZTogc2x1Z05hbWUsCiAgcmVzcG9uc2VHcm91cFVpZDogcmVzcG9uc2VHcm91cFVpZCwKICBoZWFkZXJzOiBoZWFkZXJzLAogIGVuZENhcmQ6IGVuZENhcmQsCiAgY29uZmlndXJlRXhpdE9uT3ZlcmxheUNsaWNrOiBjb25maWd1cmVFeGl0T25PdmVybGF5Q2xpY2ssCiAgaXNQcmV2aWV3OiBpc1ByZXZpZXcsCiAgYW5zd2VyczogYW5zd2VycywKICBjdXN0b21NZXRhZGF0YTogY3VzdG9tTWV0YWRhdGEsCiAgZXhwZXJpbWVudEZsYWdzOiBleHBlcmltZW50RmxhZ3MsCiAgdXNlTW9iaWxlU3R5bGluZzogdXNlTW9iaWxlU3R5bGluZywKICBtb2JpbGVQbGF0Zm9ybTogbW9iaWxlUGxhdGZvcm0sCiAgZXZlbnRFbWl0dGVyOiBldmVudEVtaXR0ZXIKfSk7Cn0oKTsKLyoqKioqKi8gfSkoKQo7";
2
- export default _default;
3
- //# sourceMappingURL=encodedViewJs.d.ts.map