You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1 lines
77 KiB
1 lines
77 KiB
{"remainingRequest":"F:\\workspace\\gcy\\RK-html\\RK-project\\ruoyi-ui\\node_modules\\thread-loader\\dist\\cjs.js!F:\\workspace\\gcy\\RK-html\\RK-project\\ruoyi-ui\\node_modules\\babel-loader\\lib\\index.js!F:\\workspace\\gcy\\RK-html\\RK-project\\ruoyi-ui\\src\\views\\dashboard\\mixins\\echarts-wordcloud.js","dependencies":[{"path":"F:\\workspace\\gcy\\RK-html\\RK-project\\ruoyi-ui\\src\\views\\dashboard\\mixins\\echarts-wordcloud.js","mtime":1634007167328},{"path":"F:\\workspace\\gcy\\RK-html\\RK-project\\ruoyi-ui\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"F:\\workspace\\gcy\\RK-html\\RK-project\\ruoyi-ui\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"F:\\workspace\\gcy\\RK-html\\RK-project\\ruoyi-ui\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:dmFyIF90eXBlb2YgPSByZXF1aXJlKCJGOi93b3Jrc3BhY2UvZ2N5L1JLLWh0bWwvUkstcHJvamVjdC9ydW95aS11aS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YiKS5kZWZhdWx0OwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbGwuanMiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy93ZWIuaW1tZWRpYXRlLmpzIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanMiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnRvLWZpeGVkLmpzIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0LmpzIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc29ydC5qcyIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5qcyIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbi5qcyIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC50by1zdHJpbmctdGFnLmpzIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuanNvbi50by1zdHJpbmctdGFnLmpzIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMubWF0aC50by1zdHJpbmctdGFnLmpzIik7CgooZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkgewogIGlmICgodHlwZW9mIGV4cG9ydHMgPT09ICJ1bmRlZmluZWQiID8gInVuZGVmaW5lZCIgOiBfdHlwZW9mKGV4cG9ydHMpKSA9PT0gJ29iamVjdCcgJiYgKHR5cGVvZiBtb2R1bGUgPT09ICJ1bmRlZmluZWQiID8gInVuZGVmaW5lZCIgOiBfdHlwZW9mKG1vZHVsZSkpID09PSAnb2JqZWN0JykgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoImVjaGFydHMiKSk7ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSBkZWZpbmUoWyJlY2hhcnRzIl0sIGZhY3RvcnkpO2Vsc2UgaWYgKCh0eXBlb2YgZXhwb3J0cyA9PT0gInVuZGVmaW5lZCIgPyAidW5kZWZpbmVkIiA6IF90eXBlb2YoZXhwb3J0cykpID09PSAnb2JqZWN0JykgZXhwb3J0c1siZWNoYXJ0cy13b3JkY2xvdWQiXSA9IGZhY3RvcnkocmVxdWlyZSgiZWNoYXJ0cyIpKTtlbHNlIHJvb3RbImVjaGFydHMtd29yZGNsb3VkIl0gPSBmYWN0b3J5KHJvb3RbImVjaGFydHMiXSk7Cn0pKHNlbGYsIGZ1bmN0aW9uIChfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2VjaGFydHNfbGliX2VjaGFydHNfXykgewogIHJldHVybiAoCiAgICAvKioqKioqLwogICAgZnVuY3Rpb24gKCkgewogICAgICAvLyB3ZWJwYWNrQm9vdHN0cmFwCgogICAgICAvKioqKioqLwogICAgICAidXNlIHN0cmljdCI7CiAgICAgIC8qKioqKiovCgogICAgICB2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9IHsKICAgICAgICAvKioqLwogICAgICAgICIuL2luZGV4LmpzIjoKICAgICAgICAvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAgICAgICAgICEqKiogLi9pbmRleC5qcyArIDQgbW9kdWxlcyAqKiohCiAgICAgICAgICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgICAvKioqLwogICAgICAgIGZ1bmN0aW9uIGluZGV4SnMoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAgIC8vIEVTTSBDT01QQVQgRkxBRwogICAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOyAvLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlY2hhcnRzIgoKCiAgICAgICAgICB2YXIgZXh0ZXJuYWxfZWNoYXJ0c18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKCJlY2hhcnRzL2xpYi9lY2hhcnRzIik7IC8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL1dvcmRDbG91ZFNlcmllcy5qcwoKCiAgICAgICAgICBleHRlcm5hbF9lY2hhcnRzXy5leHRlbmRTZXJpZXNNb2RlbCh7CiAgICAgICAgICAgIHR5cGU6ICdzZXJpZXMud29yZENsb3VkJywKICAgICAgICAgICAgdmlzdWFsU3R5bGVBY2Nlc3NQYXRoOiAndGV4dFN0eWxlJywKICAgICAgICAgICAgdmlzdWFsU3R5bGVNYXBwZXI6IGZ1bmN0aW9uIHZpc3VhbFN0eWxlTWFwcGVyKG1vZGVsKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGZpbGw6IG1vZGVsLmdldCgnY29sb3InKQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHZpc3VhbERyYXdUeXBlOiAnZmlsbCcsCiAgICAgICAgICAgIG9wdGlvblVwZGF0ZWQ6IGZ1bmN0aW9uIG9wdGlvblVwZGF0ZWQoKSB7CiAgICAgICAgICAgICAgdmFyIG9wdGlvbiA9IHRoaXMub3B0aW9uOwogICAgICAgICAgICAgIG9wdGlvbi5ncmlkU2l6ZSA9IE1hdGgubWF4KE1hdGguZmxvb3Iob3B0aW9uLmdyaWRTaXplKSwgNCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGdldEluaXRpYWxEYXRhOiBmdW5jdGlvbiBnZXRJbml0aWFsRGF0YShvcHRpb24sIGVjTW9kZWwpIHsKICAgICAgICAgICAgICB2YXIgZGltZW5zaW9ucyA9IGV4dGVybmFsX2VjaGFydHNfLmhlbHBlci5jcmVhdGVEaW1lbnNpb25zKG9wdGlvbi5kYXRhLCB7CiAgICAgICAgICAgICAgICBjb29yZERpbWVuc2lvbnM6IFsndmFsdWUnXQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IGV4dGVybmFsX2VjaGFydHNfLkxpc3QoZGltZW5zaW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgbGlzdC5pbml0RGF0YShvcHRpb24uZGF0YSk7CiAgICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIE1vc3Qgb2Ygb3B0aW9ucyBhcmUgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vdGltZHJlYW0vd29yZGNsb3VkMi5qcy9ibG9iL2doLXBhZ2VzL0FQSS5tZAogICAgICAgICAgICBkZWZhdWx0T3B0aW9uOiB7CiAgICAgICAgICAgICAgbWFza0ltYWdlOiBudWxsLAogICAgICAgICAgICAgIC8vIFNoYXBlIGNhbiBiZSAnY2lyY2xlJywgJ2NhcmRpb2lkJywgJ2RpYW1vbmQnLCAndHJpYW5nbGUtZm9yd2FyZCcsICd0cmlhbmdsZScsICdwZW50YWdvbicsICdzdGFyJwogICAgICAgICAgICAgIHNoYXBlOiAnY2lyY2xlJywKICAgICAgICAgICAgICBsZWZ0OiAnY2VudGVyJywKICAgICAgICAgICAgICB0b3A6ICdjZW50ZXInLAogICAgICAgICAgICAgIHdpZHRoOiAnNzAlJywKICAgICAgICAgICAgICBoZWlnaHQ6ICc4MCUnLAogICAgICAgICAgICAgIHNpemVSYW5nZTogWzEyLCA2MF0sCiAgICAgICAgICAgICAgcm90YXRpb25SYW5nZTogWy05MCwgOTBdLAogICAgICAgICAgICAgIHJvdGF0aW9uU3RlcDogNDUsCiAgICAgICAgICAgICAgZ3JpZFNpemU6IDgsCiAgICAgICAgICAgICAgZHJhd091dE9mQm91bmQ6IGZhbHNlLAogICAgICAgICAgICAgIHRleHRTdHlsZTogewogICAgICAgICAgICAgICAgZm9udFdlaWdodDogJ25vcm1hbCcKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOyAvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9Xb3JkQ2xvdWRWaWV3LmpzCgogICAgICAgICAgZXh0ZXJuYWxfZWNoYXJ0c18uZXh0ZW5kQ2hhcnRWaWV3KHsKICAgICAgICAgICAgdHlwZTogJ3dvcmRDbG91ZCcsCiAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKHNlcmllc01vZGVsLCBlY01vZGVsLCBhcGkpIHsKICAgICAgICAgICAgICB2YXIgZ3JvdXAgPSB0aGlzLmdyb3VwOwogICAgICAgICAgICAgIGdyb3VwLnJlbW92ZUFsbCgpOwogICAgICAgICAgICAgIHZhciBkYXRhID0gc2VyaWVzTW9kZWwuZ2V0RGF0YSgpOwogICAgICAgICAgICAgIHZhciBncmlkU2l6ZSA9IHNlcmllc01vZGVsLmdldCgnZ3JpZFNpemUnKTsKCiAgICAgICAgICAgICAgc2VyaWVzTW9kZWwubGF5b3V0SW5zdGFuY2Uub25kcmF3ID0gZnVuY3Rpb24gKHRleHQsIHNpemUsIGRhdGFJZHgsIGRyYXduKSB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbU1vZGVsID0gZGF0YS5nZXRJdGVtTW9kZWwoZGF0YUlkeCk7CiAgICAgICAgICAgICAgICB2YXIgdGV4dFN0eWxlTW9kZWwgPSBpdGVtTW9kZWwuZ2V0TW9kZWwoJ3RleHRTdHlsZScpOwogICAgICAgICAgICAgICAgdmFyIHRleHRFbCA9IG5ldyBleHRlcm5hbF9lY2hhcnRzXy5ncmFwaGljLlRleHQoewogICAgICAgICAgICAgICAgICBzdHlsZTogZXh0ZXJuYWxfZWNoYXJ0c18uaGVscGVyLmNyZWF0ZVRleHRTdHlsZSh0ZXh0U3R5bGVNb2RlbCksCiAgICAgICAgICAgICAgICAgIHNjYWxlWDogMSAvIGRyYXduLmluZm8ubXUsCiAgICAgICAgICAgICAgICAgIHNjYWxlWTogMSAvIGRyYXduLmluZm8ubXUsCiAgICAgICAgICAgICAgICAgIHg6IChkcmF3bi5neCArIGRyYXduLmluZm8uZ3cgLyAyKSAqIGdyaWRTaXplLAogICAgICAgICAgICAgICAgICB5OiAoZHJhd24uZ3kgKyBkcmF3bi5pbmZvLmdoIC8gMikgKiBncmlkU2l6ZSwKICAgICAgICAgICAgICAgICAgcm90YXRpb246IGRyYXduLnJvdAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0ZXh0RWwuc2V0U3R5bGUoewogICAgICAgICAgICAgICAgICB4OiBkcmF3bi5pbmZvLmZpbGxUZXh0T2Zmc2V0WCwKICAgICAgICAgICAgICAgICAgeTogZHJhd24uaW5mby5maWxsVGV4dE9mZnNldFkgKyBzaXplICogMC41LAogICAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0LAogICAgICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJywKICAgICAgICAgICAgICAgICAgZmlsbDogZGF0YS5nZXRJdGVtVmlzdWFsKGRhdGFJZHgsICdzdHlsZScpLmZpbGwsCiAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBzaXplCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGdyb3VwLmFkZCh0ZXh0RWwpOwogICAgICAgICAgICAgICAgZGF0YS5zZXRJdGVtR3JhcGhpY0VsKGRhdGFJZHgsIHRleHRFbCk7CiAgICAgICAgICAgICAgICB0ZXh0RWwuZW5zdXJlU3RhdGUoJ2VtcGhhc2lzJykuc3R5bGUgPSBleHRlcm5hbF9lY2hhcnRzXy5oZWxwZXIuY3JlYXRlVGV4dFN0eWxlKGl0ZW1Nb2RlbC5nZXRNb2RlbChbJ2VtcGhhc2lzJywgJ3RleHRTdHlsZSddKSwgewogICAgICAgICAgICAgICAgICBzdGF0ZTogJ2VtcGhhc2lzJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0ZXh0RWwuZW5zdXJlU3RhdGUoJ2JsdXInKS5zdHlsZSA9IGV4dGVybmFsX2VjaGFydHNfLmhlbHBlci5jcmVhdGVUZXh0U3R5bGUoaXRlbU1vZGVsLmdldE1vZGVsKFsnYmx1cicsICd0ZXh0U3R5bGUnXSksIHsKICAgICAgICAgICAgICAgICAgc3RhdGU6ICdibHVyJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBleHRlcm5hbF9lY2hhcnRzXy5oZWxwZXIuZW5hYmxlSG92ZXJFbXBoYXNpcyh0ZXh0RWwsIGl0ZW1Nb2RlbC5nZXQoWydlbXBoYXNpcycsICdmb2N1cyddKSwgaXRlbU1vZGVsLmdldChbJ2VtcGhhc2lzJywgJ2JsdXJTY29wZSddKSk7CiAgICAgICAgICAgICAgICB0ZXh0RWwuc3RhdGVUcmFuc2l0aW9uID0gewogICAgICAgICAgICAgICAgICBkdXJhdGlvbjogc2VyaWVzTW9kZWwuZ2V0KCdhbmltYXRpb24nKSA/IHNlcmllc01vZGVsLmdldChbJ3N0YXRlQW5pbWF0aW9uJywgJ2R1cmF0aW9uJ10pIDogMCwKICAgICAgICAgICAgICAgICAgZWFzaW5nOiBzZXJpZXNNb2RlbC5nZXQoWydzdGF0ZUFuaW1hdGlvbicsICdlYXNpbmcnXSkKICAgICAgICAgICAgICAgIH07IC8vIFRPRE8KCiAgICAgICAgICAgICAgICB0ZXh0RWwuX19oaWdoRG93bkRpc3BhdGNoZXIgPSB0cnVlOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgIHRoaXMuX21vZGVsID0gc2VyaWVzTW9kZWw7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkgewogICAgICAgICAgICAgIHRoaXMuZ3JvdXAucmVtb3ZlQWxsKCk7CgogICAgICAgICAgICAgIHRoaXMuX21vZGVsLmxheW91dEluc3RhbmNlLmRpc3Bvc2UoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGlzcG9zZTogZnVuY3Rpb24gZGlzcG9zZSgpIHsKICAgICAgICAgICAgICB0aGlzLl9tb2RlbC5sYXlvdXRJbnN0YW5jZS5kaXNwb3NlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOyAvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9sYXlvdXQuanMKCiAgICAgICAgICAvKiEKICAgICAgICAgICAqIHdvcmRjbG91ZDIuanMKICAgICAgICAgICAqIGh0dHA6Ly90aW1kcmVhbS5vcmcvd29yZGNsb3VkMi5qcy8KICAgICAgICAgICAqCiAgICAgICAgICAgKiBDb3B5cmlnaHQgMjAxMSAtIDIwMTMgVGltIENoaWVuCiAgICAgICAgICAgKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKICAgICAgICAgICAqLwogICAgICAgICAgLy8gc2V0SW1tZWRpYXRlCgogICAgICAgICAgaWYgKCF3aW5kb3cuc2V0SW1tZWRpYXRlKSB7CiAgICAgICAgICAgIHdpbmRvdy5zZXRJbW1lZGlhdGUgPSBmdW5jdGlvbiBzZXR1cFNldEltbWVkaWF0ZSgpIHsKICAgICAgICAgICAgICByZXR1cm4gd2luZG93Lm1zU2V0SW1tZWRpYXRlIHx8IHdpbmRvdy53ZWJraXRTZXRJbW1lZGlhdGUgfHwgd2luZG93Lm1velNldEltbWVkaWF0ZSB8fCB3aW5kb3cub1NldEltbWVkaWF0ZSB8fCBmdW5jdGlvbiBzZXR1cFNldFplcm9UaW1lb3V0KCkgewogICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cucG9zdE1lc3NhZ2UgfHwgIXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBjYWxsYmFja3MgPSBbdW5kZWZpbmVkXTsKICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gJ3plcm8tdGltZW91dC1tZXNzYWdlJzsgLy8gTGlrZSBzZXRUaW1lb3V0LCBidXQgb25seSB0YWtlcyBhIGZ1bmN0aW9uIGFyZ3VtZW50LiAgVGhlcmUncwogICAgICAgICAgICAgICAgLy8gbm8gdGltZSBhcmd1bWVudCAoYWx3YXlzIHplcm8pIGFuZCBubyBhcmd1bWVudHMgKHlvdSBoYXZlIHRvCiAgICAgICAgICAgICAgICAvLyB1c2UgYSBjbG9zdXJlKS4KCiAgICAgICAgICAgICAgICB2YXIgc2V0WmVyb1RpbWVvdXQgPSBmdW5jdGlvbiBzZXRaZXJvVGltZW91dChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICB2YXIgaWQgPSBjYWxsYmFja3MubGVuZ3RoOwogICAgICAgICAgICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZShtZXNzYWdlICsgaWQudG9TdHJpbmcoMzYpLCAnKicpOwogICAgICAgICAgICAgICAgICByZXR1cm4gaWQ7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gc2V0WmVyb1RpbWVvdXRNZXNzYWdlKGV2dCkgewogICAgICAgICAgICAgICAgICAvLyBTa2lwcGluZyBjaGVja2luZyBldmVudCBzb3VyY2UsIHJldGFyZGVkIElFIGNvbmZ1c2VkIHRoaXMgd2luZG93CiAgICAgICAgICAgICAgICAgIC8vIG9iamVjdCB3aXRoIGFub3RoZXIgaW4gdGhlIHByZXNlbmNlIG9mIGlmcmFtZQogICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV2dC5kYXRhICE9PSAnc3RyaW5nJyB8fCBldnQuZGF0YS5zdWJzdHIoMCwgbWVzc2FnZS5sZW5ndGgpICE9PSBtZXNzYWdlCiAgICAgICAgICAgICAgICAgIC8qIHx8CiAgICAgICAgICAgICAgICAgIGV2dC5zb3VyY2UgIT09IHdpbmRvdyAqLwogICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgdmFyIGlkID0gcGFyc2VJbnQoZXZ0LmRhdGEuc3Vic3RyKG1lc3NhZ2UubGVuZ3RoKSwgMzYpOwoKICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsYmFja3NbaWRdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICBjYWxsYmFja3NbaWRdKCk7CiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrc1tpZF0gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9LCB0cnVlKTsKICAgICAgICAgICAgICAgIC8qIHNwZWNpZnkgY2xlYXJJbW1lZGlhdGUoKSBoZXJlIHNpbmNlIHdlIG5lZWQgdGhlIHNjb3BlICovCgogICAgICAgICAgICAgICAgd2luZG93LmNsZWFySW1tZWRpYXRlID0gZnVuY3Rpb24gY2xlYXJaZXJvVGltZW91dChpZCkgewogICAgICAgICAgICAgICAgICBpZiAoIWNhbGxiYWNrc1tpZF0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrc1tpZF0gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHJldHVybiBzZXRaZXJvVGltZW91dDsKICAgICAgICAgICAgICB9KCkgfHwgLy8gZmFsbGJhY2sKICAgICAgICAgICAgICBmdW5jdGlvbiBzZXRJbW1lZGlhdGVGYWxsYmFjayhmbikgewogICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZm4sIDApOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoIXdpbmRvdy5jbGVhckltbWVkaWF0ZSkgewogICAgICAgICAgICB3aW5kb3cuY2xlYXJJbW1lZGlhdGUgPSBmdW5jdGlvbiBzZXR1cENsZWFySW1tZWRpYXRlKCkgewogICAgICAgICAgICAgIHJldHVybiB3aW5kb3cubXNDbGVhckltbWVkaWF0ZSB8fCB3aW5kb3cud2Via2l0Q2xlYXJJbW1lZGlhdGUgfHwgd2luZG93Lm1vekNsZWFySW1tZWRpYXRlIHx8IHdpbmRvdy5vQ2xlYXJJbW1lZGlhdGUgfHwgLy8gImNsZWFyWmVyb1RpbWVvdXQiIGlzIGltcGxlbWVudCBvbiB0aGUgcHJldmlvdXMgYmxvY2sgfHwKICAgICAgICAgICAgICAvLyBmYWxsYmFjawogICAgICAgICAgICAgIGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlRmFsbGJhY2sodGltZXIpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXIpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0oKTsKICAgICAgICAgIH0gLy8gQ2hlY2sgaWYgV29yZENsb3VkIGNhbiBydW4gb24gdGhpcyBicm93c2VyCgoKICAgICAgICAgIHZhciBpc1N1cHBvcnRlZCA9IGZ1bmN0aW9uIGlzU3VwcG9ydGVkKCkgewogICAgICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7CgogICAgICAgICAgICBpZiAoIWNhbnZhcyB8fCAhY2FudmFzLmdldENvbnRleHQpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKCiAgICAgICAgICAgIGlmICghY3R4LmdldEltYWdlRGF0YSkgewogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFjdHguZmlsbFRleHQpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQXJyYXkucHJvdG90eXBlLnNvbWUpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQXJyYXkucHJvdG90eXBlLnB1c2gpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfSgpOyAvLyBGaW5kIG91dCBpZiB0aGUgYnJvd3NlciBpbXBvc2UgbWluaXVtIGZvbnQgc2l6ZSBieQogICAgICAgICAgLy8gZHJhd2luZyBzbWFsbCB0ZXh0cyBvbiBhIGNhbnZhcyBhbmQgbWVhc3VyZSBpdCdzIHdpZHRoLgoKCiAgICAgICAgICB2YXIgbWluRm9udFNpemUgPSBmdW5jdGlvbiBnZXRNaW5Gb250U2l6ZSgpIHsKICAgICAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGN0eCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJzJkJyk7IC8vIHN0YXJ0IGZyb20gMjAKCiAgICAgICAgICAgIHZhciBzaXplID0gMjA7IC8vIHR3byBzaXplcyB0byBtZWFzdXJlCgogICAgICAgICAgICB2YXIgaGFuV2lkdGgsIG1XaWR0aDsKCiAgICAgICAgICAgIHdoaWxlIChzaXplKSB7CiAgICAgICAgICAgICAgY3R4LmZvbnQgPSBzaXplLnRvU3RyaW5nKDEwKSArICdweCBzYW5zLXNlcmlmJzsKCiAgICAgICAgICAgICAgaWYgKGN0eC5tZWFzdXJlVGV4dCgiXHVGRjM3Iikud2lkdGggPT09IGhhbldpZHRoICYmIGN0eC5tZWFzdXJlVGV4dCgnbScpLndpZHRoID09PSBtV2lkdGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzaXplICsgMTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGhhbldpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KCJcdUZGMzciKS53aWR0aDsKICAgICAgICAgICAgICBtV2lkdGggPSBjdHgubWVhc3VyZVRleHQoJ20nKS53aWR0aDsKICAgICAgICAgICAgICBzaXplLS07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfSgpOyAvLyBCYXNlZCBvbiBodHRwOi8vanNmcm9taGVsbC5jb20vYXJyYXkvc2h1ZmZsZQoKCiAgICAgICAgICB2YXIgc2h1ZmZsZUFycmF5ID0gZnVuY3Rpb24gc2h1ZmZsZUFycmF5KGFycikgewogICAgICAgICAgICBmb3IgKHZhciBqLCB4LCBpID0gYXJyLmxlbmd0aDsgaTsgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGkpLCB4ID0gYXJyWy0taV0sIGFycltpXSA9IGFycltqXSwgYXJyW2pdID0geCkge30KCiAgICAgICAgICAgIHJldHVybiBhcnI7CiAgICAgICAgICB9OwoKICAgICAgICAgIHZhciBXb3JkQ2xvdWQgPSBmdW5jdGlvbiBXb3JkQ2xvdWQoZWxlbWVudHMsIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGVsZW1lbnRzKSkgewogICAgICAgICAgICAgIGVsZW1lbnRzID0gW2VsZW1lbnRzXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWwsIGkpIHsKICAgICAgICAgICAgICBpZiAodHlwZW9mIGVsID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgZWxlbWVudHNbaV0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbCk7CgogICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50c1tpXSkgewogICAgICAgICAgICAgICAgICB0aHJvdyAnVGhlIGVsZW1lbnQgaWQgc3BlY2lmaWVkIGlzIG5vdCBmb3VuZC4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWVsLnRhZ05hbWUgJiYgIWVsLmFwcGVuZENoaWxkKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAnWW91IG11c3QgcGFzcyB2YWxpZCBIVE1MIGVsZW1lbnRzLCBvciBJRCBvZiB0aGUgZWxlbWVudC4nOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8qIERlZmF1bHQgdmFsdWVzIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IG9wdGlvbnMgb2JqZWN0ICovCgogICAgICAgICAgICB2YXIgc2V0dGluZ3MgPSB7CiAgICAgICAgICAgICAgbGlzdDogW10sCiAgICAgICAgICAgICAgZm9udEZhbWlseTogJyJUcmVidWNoZXQgTVMiLCAiSGVpdGkgVEMiLCAi5b6u6Luf5q2j6buR6auUIiwgJyArICciQXJpYWwgVW5pY29kZSBNUyIsICJEcm9pZCBGYWxsYmFjayBTYW5zIiwgc2Fucy1zZXJpZicsCiAgICAgICAgICAgICAgZm9udFdlaWdodDogJ25vcm1hbCcsCiAgICAgICAgICAgICAgY29sb3I6ICdyYW5kb20tZGFyaycsCiAgICAgICAgICAgICAgbWluU2l6ZTogMCwKICAgICAgICAgICAgICAvLyAwIHRvIGRpc2FibGUKICAgICAgICAgICAgICB3ZWlnaHRGYWN0b3I6IDEsCiAgICAgICAgICAgICAgY2xlYXJDYW52YXM6IHRydWUsCiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2ZmZicsCiAgICAgICAgICAgICAgLy8gb3BhcXVlIHdoaXRlID0gcmdiYSgyNTUsIDI1NSwgMjU1LCAxKQogICAgICAgICAgICAgIGdyaWRTaXplOiA4LAogICAgICAgICAgICAgIGRyYXdPdXRPZkJvdW5kOiBmYWxzZSwKICAgICAgICAgICAgICBvcmlnaW46IG51bGwsCiAgICAgICAgICAgICAgZHJhd01hc2s6IGZhbHNlLAogICAgICAgICAgICAgIG1hc2tDb2xvcjogJ3JnYmEoMjU1LDAsMCwwLjMpJywKICAgICAgICAgICAgICBtYXNrR2FwV2lkdGg6IDAuMywKICAgICAgICAgICAgICBsYXlvdXRBbmltYXRpb246IHRydWUsCiAgICAgICAgICAgICAgd2FpdDogMCwKICAgICAgICAgICAgICBhYm9ydFRocmVzaG9sZDogMCwKICAgICAgICAgICAgICAvLyBkaXNhYmxlZAogICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiBub29wKCkge30sCiAgICAgICAgICAgICAgbWluUm90YXRpb246IC1NYXRoLlBJIC8gMiwKICAgICAgICAgICAgICBtYXhSb3RhdGlvbjogTWF0aC5QSSAvIDIsCiAgICAgICAgICAgICAgcm90YXRpb25TdGVwOiAwLjEsCiAgICAgICAgICAgICAgc2h1ZmZsZTogdHJ1ZSwKICAgICAgICAgICAgICByb3RhdGVSYXRpbzogMC4xLAogICAgICAgICAgICAgIHNoYXBlOiAnY2lyY2xlJywKICAgICAgICAgICAgICBlbGxpcHRpY2l0eTogMC42NSwKICAgICAgICAgICAgICBjbGFzc2VzOiBudWxsLAogICAgICAgICAgICAgIGhvdmVyOiBudWxsLAogICAgICAgICAgICAgIGNsaWNrOiBudWxsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAob3B0aW9ucykgewogICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBpZiAoa2V5IGluIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBvcHRpb25zW2tleV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIENvbnZlcnQgd2VpZ2h0RmFjdG9yIGludG8gYSBmdW5jdGlvbiAqLwoKCiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3Mud2VpZ2h0RmFjdG9yICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgdmFyIGZhY3RvciA9IHNldHRpbmdzLndlaWdodEZhY3RvcjsKCiAgICAgICAgICAgICAgc2V0dGluZ3Mud2VpZ2h0RmFjdG9yID0gZnVuY3Rpb24gd2VpZ2h0RmFjdG9yKHB0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHQgKiBmYWN0b3I7IC8vaW4gcHgKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIENvbnZlcnQgc2hhcGUgaW50byBhIGZ1bmN0aW9uICovCgoKICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXR0aW5ncy5zaGFwZSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgIHN3aXRjaCAoc2V0dGluZ3Muc2hhcGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2NpcmNsZSc6CiAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovCgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgLy8gJ2NpcmNsZScgaXMgdGhlIGRlZmF1bHQgYW5kIGEgc2hvcnRjdXQgaW4gdGhlIGNvZGUgbG9vcC4KICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2hhcGUgPSAnY2lyY2xlJzsKICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnY2FyZGlvaWQnOgogICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zaGFwZSA9IGZ1bmN0aW9uIHNoYXBlQ2FyZGlvaWQodGhldGEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAtIE1hdGguc2luKHRoZXRhKTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICBUbyB3b3JrIG91dCBhbiBYLWdvbiwgb25lIGhhcyB0byBjYWxjdWxhdGUgIm0iLAogICAgICAgICAgICAgICAgd2hlcmUgMS8oY29zKDIqUEkvWCkrbSpzaW4oMipQSS9YKSkgPSAxLyhjb3MoMCkrbSpzaW4oMCkpCiAgICAgICAgICAgICAgICBodHRwOi8vd3d3LndvbGZyYW1hbHBoYS5jb20vaW5wdXQvP2k9MSUyRiUyOGNvcyUyODIqUEklMkZYJTI5JTJCbSpzaW4lMjgKICAgICAgICAgICAgICAgIDIqUEklMkZYJTI5JTI5KyUzRCsxJTJGJTI4Y29zJTI4MCUyOSUyQm0qc2luJTI4MCUyOSUyOQogICAgICAgICAgICAgICAgQ29weSB0aGUgc29sdXRpb24gaW50byBwb2xhciBlcXVhdGlvbiByID0gMS8oY29zKHQnKSArIG0qc2luKHQnKSkKICAgICAgICAgICAgICAgIHdoZXJlIHQnIGVxdWFscyB0byBtb2QodCwgMlBJL1gpOwogICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICBjYXNlICdkaWFtb25kJzoKICAgICAgICAgICAgICAgIGNhc2UgJ3NxdWFyZSc6CiAgICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cud29sZnJhbWFscGhhLmNvbS9pbnB1dC8/aT1wbG90K3IrJTNEKzElMkYlMjhjb3MlMjhtb2QrCiAgICAgICAgICAgICAgICAgIC8vICUyOHQlMkMrUEklMkYyJTI5JTI5JTJCc2luJTI4bW9kKyUyOHQlMkMrUEklMkYyJTI5JTI5JTI5JTJDK3QrJTNECiAgICAgICAgICAgICAgICAgIC8vICswKy4uKzIqUEkKICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2hhcGUgPSBmdW5jdGlvbiBzaGFwZVNxdWFyZSh0aGV0YSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0aGV0YVByaW1lID0gdGhldGEgJSAoMiAqIE1hdGguUEkgLyA0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvIChNYXRoLmNvcyh0aGV0YVByaW1lKSArIE1hdGguc2luKHRoZXRhUHJpbWUpKTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJ3RyaWFuZ2xlLWZvcndhcmQnOgogICAgICAgICAgICAgICAgICAvLyBodHRwOi8vd3d3LndvbGZyYW1hbHBoYS5jb20vaW5wdXQvP2k9cGxvdCtyKyUzRCsxJTJGJTI4Y29zJTI4bW9kKwogICAgICAgICAgICAgICAgICAvLyAlMjh0JTJDKzIqUEklMkYzJTI5JTI5JTJCc3FydCUyODMlMjlzaW4lMjhtb2QrJTI4dCUyQysyKlBJJTJGMyUyOQogICAgICAgICAgICAgICAgICAvLyAlMjklMjklMkMrdCslM0QrMCsuLisyKlBJCiAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnNoYXBlID0gZnVuY3Rpb24gc2hhcGVUcmlhbmdsZSh0aGV0YSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0aGV0YVByaW1lID0gdGhldGEgJSAoMiAqIE1hdGguUEkgLyAzKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvIChNYXRoLmNvcyh0aGV0YVByaW1lKSArIE1hdGguc3FydCgzKSAqIE1hdGguc2luKHRoZXRhUHJpbWUpKTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJ3RyaWFuZ2xlJzoKICAgICAgICAgICAgICAgIGNhc2UgJ3RyaWFuZ2xlLXVwcmlnaHQnOgogICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zaGFwZSA9IGZ1bmN0aW9uIHNoYXBlVHJpYW5nbGUodGhldGEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGhldGFQcmltZSA9ICh0aGV0YSArIE1hdGguUEkgKiAzIC8gMikgJSAoMiAqIE1hdGguUEkgLyAzKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvIChNYXRoLmNvcyh0aGV0YVByaW1lKSArIE1hdGguc3FydCgzKSAqIE1hdGguc2luKHRoZXRhUHJpbWUpKTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJ3BlbnRhZ29uJzoKICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2hhcGUgPSBmdW5jdGlvbiBzaGFwZVBlbnRhZ29uKHRoZXRhKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRoZXRhUHJpbWUgPSAodGhldGEgKyAwLjk1NSkgJSAoMiAqIE1hdGguUEkgLyA1KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvIChNYXRoLmNvcyh0aGV0YVByaW1lKSArIDAuNzI2NTQzICogTWF0aC5zaW4odGhldGFQcmltZSkpOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnc3Rhcic6CiAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnNoYXBlID0gZnVuY3Rpb24gc2hhcGVTdGFyKHRoZXRhKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRoZXRhUHJpbWUgPSAodGhldGEgKyAwLjk1NSkgJSAoMiAqIE1hdGguUEkgLyAxMCk7CgogICAgICAgICAgICAgICAgICAgIGlmICgodGhldGEgKyAwLjk1NSkgJSAoMiAqIE1hdGguUEkgLyA1KSAtIDIgKiBNYXRoLlBJIC8gMTAgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyAoTWF0aC5jb3MoMiAqIE1hdGguUEkgLyAxMCAtIHRoZXRhUHJpbWUpICsgMy4wNzc2OCAqIE1hdGguc2luKDIgKiBNYXRoLlBJIC8gMTAgLSB0aGV0YVByaW1lKSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8gKE1hdGguY29zKHRoZXRhUHJpbWUpICsgMy4wNzc2OCAqIE1hdGguc2luKHRoZXRhUHJpbWUpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogTWFrZSBzdXJlIGdyaWRTaXplIGlzIGEgd2hvbGUgbnVtYmVyIGFuZCBpcyBub3Qgc21hbGxlciB0aGFuIDRweCAqLwoKCiAgICAgICAgICAgIHNldHRpbmdzLmdyaWRTaXplID0gTWF0aC5tYXgoTWF0aC5mbG9vcihzZXR0aW5ncy5ncmlkU2l6ZSksIDQpOwogICAgICAgICAgICAvKiBzaG9ydGhhbmQgKi8KCiAgICAgICAgICAgIHZhciBnID0gc2V0dGluZ3MuZ3JpZFNpemU7CiAgICAgICAgICAgIHZhciBtYXNrUmVjdFdpZHRoID0gZyAtIHNldHRpbmdzLm1hc2tHYXBXaWR0aDsKICAgICAgICAgICAgLyogbm9ybWFsaXplIHJvdGF0aW9uIHNldHRpbmdzICovCgogICAgICAgICAgICB2YXIgcm90YXRpb25SYW5nZSA9IE1hdGguYWJzKHNldHRpbmdzLm1heFJvdGF0aW9uIC0gc2V0dGluZ3MubWluUm90YXRpb24pOwogICAgICAgICAgICB2YXIgbWluUm90YXRpb24gPSBNYXRoLm1pbihzZXR0aW5ncy5tYXhSb3RhdGlvbiwgc2V0dGluZ3MubWluUm90YXRpb24pOwogICAgICAgICAgICB2YXIgcm90YXRpb25TdGVwID0gc2V0dGluZ3Mucm90YXRpb25TdGVwOwogICAgICAgICAgICAvKiBpbmZvcm1hdGlvbi9vYmplY3QgYXZhaWxhYmxlIHRvIGFsbCBmdW5jdGlvbnMsIHNldCB3aGVuIHN0YXJ0KCkgKi8KCiAgICAgICAgICAgIHZhciBncmlkLCAvLyAyZCBhcnJheSBjb250YWluaW5nIGZpbGxpbmcgaW5mb3JtYXRpb24KICAgICAgICAgICAgbmd4LCBuZ3ksIC8vIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGdyaWQKICAgICAgICAgICAgY2VudGVyLCAvLyBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBjbG91ZAogICAgICAgICAgICBtYXhSYWRpdXM7CiAgICAgICAgICAgIC8qIHRpbWVzdGFtcCBmb3IgbWVhc3VyaW5nIGVhY2ggcHV0V29yZCgpIGFjdGlvbiAqLwoKICAgICAgICAgICAgdmFyIGVzY2FwZVRpbWU7CiAgICAgICAgICAgIC8qIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSBjb2xvciBvZiB0aGUgdGV4dCAqLwoKICAgICAgICAgICAgdmFyIGdldFRleHRDb2xvcjsKCiAgICAgICAgICAgIGZ1bmN0aW9uIHJhbmRvbV9oc2xfY29sb3IobWluLCBtYXgpIHsKICAgICAgICAgICAgICByZXR1cm4gJ2hzbCgnICsgKE1hdGgucmFuZG9tKCkgKiAzNjApLnRvRml4ZWQoKSArICcsJyArIChNYXRoLnJhbmRvbSgpICogMzAgKyA3MCkudG9GaXhlZCgpICsgJyUsJyArIChNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikgKyBtaW4pLnRvRml4ZWQoKSArICclKSc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHN3aXRjaCAoc2V0dGluZ3MuY29sb3IpIHsKICAgICAgICAgICAgICBjYXNlICdyYW5kb20tZGFyayc6CiAgICAgICAgICAgICAgICBnZXRUZXh0Q29sb3IgPSBmdW5jdGlvbiBnZXRSYW5kb21EYXJrQ29sb3IoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiByYW5kb21faHNsX2NvbG9yKDEwLCA1MCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlICdyYW5kb20tbGlnaHQnOgogICAgICAgICAgICAgICAgZ2V0VGV4dENvbG9yID0gZnVuY3Rpb24gZ2V0UmFuZG9tTGlnaHRDb2xvcigpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhbmRvbV9oc2xfY29sb3IoNTAsIDkwKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzLmNvbG9yID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgIGdldFRleHRDb2xvciA9IHNldHRpbmdzLmNvbG9yOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSBjbGFzc2VzIG9mIHRoZSB0ZXh0ICovCgoKICAgICAgICAgICAgdmFyIGdldFRleHRDbGFzc2VzID0gbnVsbDsKCiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MuY2xhc3NlcyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgIGdldFRleHRDbGFzc2VzID0gc2V0dGluZ3MuY2xhc3NlczsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBJbnRlcmFjdGl2ZSAqLwoKCiAgICAgICAgICAgIHZhciBpbnRlcmFjdGl2ZSA9IGZhbHNlOwogICAgICAgICAgICB2YXIgaW5mb0dyaWQgPSBbXTsKICAgICAgICAgICAgdmFyIGhvdmVyZWQ7CgogICAgICAgICAgICB2YXIgZ2V0SW5mb0dyaWRGcm9tTW91c2VUb3VjaEV2ZW50ID0gZnVuY3Rpb24gZ2V0SW5mb0dyaWRGcm9tTW91c2VUb3VjaEV2ZW50KGV2dCkgewogICAgICAgICAgICAgIHZhciBjYW52YXMgPSBldnQuY3VycmVudFRhcmdldDsKICAgICAgICAgICAgICB2YXIgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgICB2YXIgY2xpZW50WDsKICAgICAgICAgICAgICB2YXIgY2xpZW50WTsKICAgICAgICAgICAgICAvKiogRGV0ZWN0IGlmIHRvdWNoZXMgYXJlIGF2YWlsYWJsZSAqLwoKICAgICAgICAgICAgICBpZiAoZXZ0LnRvdWNoZXMpIHsKICAgICAgICAgICAgICAgIGNsaWVudFggPSBldnQudG91Y2hlc1swXS5jbGllbnRYOwogICAgICAgICAgICAgICAgY2xpZW50WSA9IGV2dC50b3VjaGVzWzBdLmNsaWVudFk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNsaWVudFggPSBldnQuY2xpZW50WDsKICAgICAgICAgICAgICAgIGNsaWVudFkgPSBldnQuY2xpZW50WTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHZhciBldmVudFggPSBjbGllbnRYIC0gcmVjdC5sZWZ0OwogICAgICAgICAgICAgIHZhciBldmVudFkgPSBjbGllbnRZIC0gcmVjdC50b3A7CiAgICAgICAgICAgICAgdmFyIHggPSBNYXRoLmZsb29yKGV2ZW50WCAqIChjYW52YXMud2lkdGggLyByZWN0LndpZHRoIHx8IDEpIC8gZyk7CiAgICAgICAgICAgICAgdmFyIHkgPSBNYXRoLmZsb29yKGV2ZW50WSAqIChjYW52YXMuaGVpZ2h0IC8gcmVjdC5oZWlnaHQgfHwgMSkgLyBnKTsKICAgICAgICAgICAgICByZXR1cm4gaW5mb0dyaWRbeF1beV07CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgd29yZGNsb3VkaG92ZXIgPSBmdW5jdGlvbiB3b3JkY2xvdWRob3ZlcihldnQpIHsKICAgICAgICAgICAgICB2YXIgaW5mbyA9IGdldEluZm9HcmlkRnJvbU1vdXNlVG91Y2hFdmVudChldnQpOwoKICAgICAgICAgICAgICBpZiAoaG92ZXJlZCA9PT0gaW5mbykgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaG92ZXJlZCA9IGluZm87CgogICAgICAgICAgICAgIGlmICghaW5mbykgewogICAgICAgICAgICAgICAgc2V0dGluZ3MuaG92ZXIodW5kZWZpbmVkLCB1bmRlZmluZWQsIGV2dCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBzZXR0aW5ncy5ob3ZlcihpbmZvLml0ZW0sIGluZm8uZGltZW5zaW9uLCBldnQpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHdvcmRjbG91ZGNsaWNrID0gZnVuY3Rpb24gd29yZGNsb3VkY2xpY2soZXZ0KSB7CiAgICAgICAgICAgICAgdmFyIGluZm8gPSBnZXRJbmZvR3JpZEZyb21Nb3VzZVRvdWNoRXZlbnQoZXZ0KTsKCiAgICAgICAgICAgICAgaWYgKCFpbmZvKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBzZXR0aW5ncy5jbGljayhpbmZvLml0ZW0sIGluZm8uZGltZW5zaW9uLCBldnQpOwogICAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICAvKiBHZXQgcG9pbnRzIG9uIHRoZSBncmlkIGZvciBhIGdpdmVuIHJhZGl1cyBhd2F5IGZyb20gdGhlIGNlbnRlciAqLwoKCiAgICAgICAgICAgIHZhciBwb2ludHNBdFJhZGl1cyA9IFtdOwoKICAgICAgICAgICAgdmFyIGdldFBvaW50c0F0UmFkaXVzID0gZnVuY3Rpb24gZ2V0UG9pbnRzQXRSYWRpdXMocmFkaXVzKSB7CiAgICAgICAgICAgICAgaWYgKHBvaW50c0F0UmFkaXVzW3JhZGl1c10pIHsKICAgICAgICAgICAgICAgIHJldHVybiBwb2ludHNBdFJhZGl1c1tyYWRpdXNdOwogICAgICAgICAgICAgIH0gLy8gTG9vayBmb3IgdGhlc2UgbnVtYmVyIG9mIHBvaW50cyBvbiBlYWNoIHJhZGl1cwoKCiAgICAgICAgICAgICAgdmFyIFQgPSByYWRpdXMgKiA4OyAvLyBHZXR0aW5nIGFsbCB0aGUgcG9pbnRzIGF0IHRoaXMgcmFkaXVzCgogICAgICAgICAgICAgIHZhciB0ID0gVDsKICAgICAgICAgICAgICB2YXIgcG9pbnRzID0gW107CgogICAgICAgICAgICAgIGlmIChyYWRpdXMgPT09IDApIHsKICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKFtjZW50ZXJbMF0sIGNlbnRlclsxXSwgMF0pOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgd2hpbGUgKHQtLSkgewogICAgICAgICAgICAgICAgLy8gZGlzdG9ydCB0aGUgcmFkaXVzIHRvIHB1dCB0aGUgY2xvdWQgaW4gc2hhcGUKICAgICAgICAgICAgICAgIHZhciByeCA9IDE7CgogICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLnNoYXBlICE9PSAnY2lyY2xlJykgewogICAgICAgICAgICAgICAgICByeCA9IHNldHRpbmdzLnNoYXBlKHQgLyBUICogMiAqIE1hdGguUEkpOyAvLyAwIHRvIDEKICAgICAgICAgICAgICAgIH0gLy8gUHVzaCBbeCwgeSwgdF07IHQgaXMgdXNlZCBzb2xlbHkgZm9yIGdldFRleHRDb2xvcigpCgoKICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKFtjZW50ZXJbMF0gKyByYWRpdXMgKiByeCAqIE1hdGguY29zKC10IC8gVCAqIDIgKiBNYXRoLlBJKSwgY2VudGVyWzFdICsgcmFkaXVzICogcnggKiBNYXRoLnNpbigtdCAvIFQgKiAyICogTWF0aC5QSSkgKiBzZXR0aW5ncy5lbGxpcHRpY2l0eSwgdCAvIFQgKiAyICogTWF0aC5QSV0pOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgcG9pbnRzQXRSYWRpdXNbcmFkaXVzXSA9IHBvaW50czsKICAgICAgICAgICAgICByZXR1cm4gcG9pbnRzOwogICAgICAgICAgICB9OwogICAgICAgICAgICAvKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYWQgc3BlbnQgdG9vIG11Y2ggdGltZSAqLwoKCiAgICAgICAgICAgIHZhciBleGNlZWRUaW1lID0gZnVuY3Rpb24gZXhjZWVkVGltZSgpIHsKICAgICAgICAgICAgICByZXR1cm4gc2V0dGluZ3MuYWJvcnRUaHJlc2hvbGQgPiAwICYmIG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gZXNjYXBlVGltZSA+IHNldHRpbmdzLmFib3J0VGhyZXNob2xkOwogICAgICAgICAgICB9OwogICAgICAgICAgICAvKiBHZXQgdGhlIGRlZyBvZiByb3RhdGlvbiBhY2NvcmRpbmcgdG8gc2V0dGluZ3MsIGFuZCBsdWNrLiAqLwoKCiAgICAgICAgICAgIHZhciBnZXRSb3RhdGVEZWcgPSBmdW5jdGlvbiBnZXRSb3RhdGVEZWcoKSB7CiAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLnJvdGF0ZVJhdGlvID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmIChNYXRoLnJhbmRvbSgpID4gc2V0dGluZ3Mucm90YXRlUmF0aW8pIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKHJvdGF0aW9uUmFuZ2UgPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBtaW5Sb3RhdGlvbjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHJldHVybiBtaW5Sb3RhdGlvbiArIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIHJvdGF0aW9uUmFuZ2UgLyByb3RhdGlvblN0ZXApICogcm90YXRpb25TdGVwOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGdldFRleHRJbmZvID0gZnVuY3Rpb24gZ2V0VGV4dEluZm8od29yZCwgd2VpZ2h0LCByb3RhdGVEZWcpIHsKICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGFjdXRhbCBmb250IHNpemUKICAgICAgICAgICAgICAvLyBmb250U2l6ZSA9PT0gMCBtZWFucyB3ZWlnaHRGYWN0b3IgZnVuY3Rpb24gd2FudHMgdGhlIHRleHQgc2tpcHBlZCwKICAgICAgICAgICAgICAvLyBhbmQgc2l6ZSA8IG1pblNpemUgbWVhbnMgd2UgY2Fubm90IGRyYXcgdGhlIHRleHQuCiAgICAgICAgICAgICAgdmFyIGRlYnVnID0gZmFsc2U7CiAgICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gc2V0dGluZ3Mud2VpZ2h0RmFjdG9yKHdlaWdodCk7CgogICAgICAgICAgICAgIGlmIChmb250U2l6ZSA8PSBzZXR0aW5ncy5taW5TaXplKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgfSAvLyBTY2FsZSBmYWN0b3IgaGVyZSBpcyB0byBtYWtlIHN1cmUgZmlsbFRleHQgaXMgbm90IGxpbWl0ZWQgYnkKICAgICAgICAgICAgICAvLyB0aGUgbWluaXVtIGZvbnQgc2l6ZSBzZXQgYnkgYnJvd3Nlci4KICAgICAgICAgICAgICAvLyBJdCB3aWxsIGFsd2F5cyBiZSAxIG9yIDJuLgoKCiAgICAgICAgICAgICAgdmFyIG11ID0gMTsKCiAgICAgICAgICAgICAgaWYgKGZvbnRTaXplIDwgbWluRm9udFNpemUpIHsKICAgICAgICAgICAgICAgIG11ID0gZnVuY3Rpb24gY2FsY3VsYXRlU2NhbGVGYWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgIHZhciBtdSA9IDI7CgogICAgICAgICAgICAgICAgICB3aGlsZSAobXUgKiBmb250U2l6ZSA8IG1pbkZvbnRTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgbXUgKz0gMjsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgcmV0dXJuIG11OwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdmFyIGZjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgICAgICAgICAgICB2YXIgZmN0eCA9IGZjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7CiAgICAgICAgICAgICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBmY3R4LmZvbnQgPSBzZXR0aW5ncy5mb250V2VpZ2h0ICsgJyAnICsgKGZvbnRTaXplICogbXUpLnRvU3RyaW5nKDEwKSArICdweCAnICsgc2V0dGluZ3MuZm9udEZhbWlseTsgLy8gRXN0aW1hdGUgdGhlIGRpbWVuc2lvbiBvZiB0aGUgdGV4dCB3aXRoIG1lYXN1cmVUZXh0KCkuCgogICAgICAgICAgICAgIHZhciBmdyA9IGZjdHgubWVhc3VyZVRleHQod29yZCkud2lkdGggLyBtdTsKICAgICAgICAgICAgICB2YXIgZmggPSBNYXRoLm1heChmb250U2l6ZSAqIG11LCBmY3R4Lm1lYXN1cmVUZXh0KCdtJykud2lkdGgsIGZjdHgubWVhc3VyZVRleHQoIlx1RkYzNyIpLndpZHRoKSAvIG11OyAvLyBDcmVhdGUgYSBib3VuZGFyeSBib3ggdGhhdCBpcyBsYXJnZXIgdGhhbiBvdXIgZXN0aW1hdGVzLAogICAgICAgICAgICAgIC8vIHNvIHRleHQgZG9uJ3QgZ2V0IGN1dCBvZiAoaXQgc2lsbCBtaWdodCkKCiAgICAgICAgICAgICAgdmFyIGJveFdpZHRoID0gZncgKyBmaCAqIDI7CiAgICAgICAgICAgICAgdmFyIGJveEhlaWdodCA9IGZoICogMzsKICAgICAgICAgICAgICB2YXIgZmd3ID0gTWF0aC5jZWlsKGJveFdpZHRoIC8gZyk7CiAgICAgICAgICAgICAgdmFyIGZnaCA9IE1hdGguY2VpbChib3hIZWlnaHQgLyBnKTsKICAgICAgICAgICAgICBib3hXaWR0aCA9IGZndyAqIGc7CiAgICAgICAgICAgICAgYm94SGVpZ2h0ID0gZmdoICogZzsgLy8gQ2FsY3VsYXRlIHRoZSBwcm9wZXIgb2Zmc2V0cyB0byBtYWtlIHRoZSB0ZXh0IGNlbnRlcmVkIGF0CiAgICAgICAgICAgICAgLy8gdGhlIHByZWZlcnJlZCBwb3NpdGlvbi4KICAgICAgICAgICAgICAvLyBUaGlzIGlzIHNpbXBseSBoYWxmIG9mIHRoZSB3aWR0aC4KCiAgICAgICAgICAgICAgdmFyIGZpbGxUZXh0T2Zmc2V0WCA9IC1mdyAvIDI7IC8vIEluc3RlYWQgb2YgbW92aW5nIHRoZSBib3ggdG8gdGhlIGV4YWN0IG1pZGRsZSBvZiB0aGUgcHJlZmVycmVkCiAgICAgICAgICAgICAgLy8gcG9zaXRpb24sIGZvciBZLW9mZnNldCB3ZSBtb3ZlIDAuNCBpbnN0ZWFkLCBzbyBMYXRpbiBhbHBoYWJldHMgbG9vawogICAgICAgICAgICAgIC8vIHZlcnRpY2FsIGNlbnRlcmVkLgoKICAgICAgICAgICAgICB2YXIgZmlsbFRleHRPZmZzZXRZID0gLWZoICogMC40OyAvLyBDYWxjdWxhdGUgdGhlIGFjdHVhbCBkaW1lbnNpb24gb2YgdGhlIGNhbnZhcywgY29uc2lkZXJpbmcgdGhlIHJvdGF0aW9uLgoKICAgICAgICAgICAgICB2YXIgY2doID0gTWF0aC5jZWlsKChib3hXaWR0aCAqIE1hdGguYWJzKE1hdGguc2luKHJvdGF0ZURlZykpICsgYm94SGVpZ2h0ICogTWF0aC5hYnMoTWF0aC5jb3Mocm90YXRlRGVnKSkpIC8gZyk7CiAgICAgICAgICAgICAgdmFyIGNndyA9IE1hdGguY2VpbCgoYm94V2lkdGggKiBNYXRoLmFicyhNYXRoLmNvcyhyb3RhdGVEZWcpKSArIGJveEhlaWdodCAqIE1hdGguYWJzKE1hdGguc2luKHJvdGF0ZURlZykpKSAvIGcpOwogICAgICAgICAgICAgIHZhciB3aWR0aCA9IGNndyAqIGc7CiAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IGNnaCAqIGc7CiAgICAgICAgICAgICAgZmNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgd2lkdGgpOwogICAgICAgICAgICAgIGZjYW52YXMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBoZWlnaHQpOwoKICAgICAgICAgICAgICBpZiAoZGVidWcpIHsKICAgICAgICAgICAgICAgIC8vIEF0dGFjaCBmY2FudmFzIHRvIHRoZSBET00KICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZmNhbnZhcyk7IC8vIFNhdmUgaXQncyBzdGF0ZSBzbyB0aGF0IHdlIGNvdWxkIHJlc3RvcmUgYW5kIGRyYXcgdGhlIGdyaWQgY29ycmVjdGx5LgoKICAgICAgICAgICAgICAgIGZjdHguc2F2ZSgpOwogICAgICAgICAgICAgIH0gLy8gU2NhbGUgdGhlIGNhbnZhcyB3aXRoIHxtdXwuCgoKICAgICAgICAgICAgICBmY3R4LnNjYWxlKDEgLyBtdSwgMSAvIG11KTsKICAgICAgICAgICAgICBmY3R4LnRyYW5zbGF0ZSh3aWR0aCAqIG11IC8gMiwgaGVpZ2h0ICogbXUgLyAyKTsKICAgICAgICAgICAgICBmY3R4LnJvdGF0ZSgtcm90YXRlRGVnKTsgLy8gT25jZSB0aGUgd2lkdGgvaGVpZ2h0IGlzIHNldCwgY3R4IGluZm8gd2lsbCBiZSByZXNldC4KICAgICAgICAgICAgICAvLyBTZXQgaXQgYWdhaW4gaGVyZS4KCiAgICAgICAgICAgICAgZmN0eC5mb250ID0gc2V0dGluZ3MuZm9udFdlaWdodCArICcgJyArIChmb250U2l6ZSAqIG11KS50b1N0cmluZygxMCkgKyAncHggJyArIHNldHRpbmdzLmZvbnRGYW1pbHk7IC8vIEZpbGwgdGhlIHRleHQgaW50byB0aGUgZmNhbnZhcy4KICAgICAgICAgICAgICAvLyBYWFg6IFdlIGNhbm5vdCBiZWNhdXNlIHRleHRCYXNlbGluZSA9ICd0b3AnIGhlcmUgYmVjYXVzZQogICAgICAgICAgICAgIC8vIEZpcmVmb3ggYW5kIENocm9tZSB1c2VzIGRpZmZlcmVudCBkZWZhdWx0IGxpbmUtaGVpZ2h0IGZvciBjYW52YXMuCiAgICAgICAgICAgICAgLy8gUGxlYXNlIHJlYWQgaHR0cHM6Ly9idWd6aWwubGEvNzM3ODUyI2M2LgogICAgICAgICAgICAgIC8vIEhlcmUsIHdlIHVzZSB0ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJyBhbmQgZHJhdyB0aGUgdGV4dCBhdCBleGFjdGx5CiAgICAgICAgICAgICAgLy8gMC41ICogZm9udFNpemUgbG93ZXIuCgogICAgICAgICAgICAgIGZjdHguZmlsbFN0eWxlID0gJyMwMDAnOwogICAgICAgICAgICAgIGZjdHgudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7CiAgICAgICAgICAgICAgZmN0eC5maWxsVGV4dCh3b3JkLCBmaWxsVGV4dE9mZnNldFggKiBtdSwgKGZpbGxUZXh0T2Zmc2V0WSArIGZvbnRTaXplICogMC41KSAqIG11KTsgLy8gR2V0IHRoZSBwaXhlbHMgb2YgdGhlIHRleHQKCiAgICAgICAgICAgICAgdmFyIGltYWdlRGF0YSA9IGZjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpLmRhdGE7CgogICAgICAgICAgICAgIGlmIChleGNlZWRUaW1lKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmIChkZWJ1ZykgewogICAgICAgICAgICAgICAgLy8gRHJhdyB0aGUgYm94IG9mIHRoZSBvcmlnaW5hbCBlc3RpbWF0aW9uCiAgICAgICAgICAgICAgICBmY3R4LnN0cm9rZVJlY3QoZmlsbFRleHRPZmZzZXRYICogbXUsIGZpbGxUZXh0T2Zmc2V0WSwgZncgKiBtdSwgZmggKiBtdSk7CiAgICAgICAgICAgICAgICBmY3R4LnJlc3RvcmUoKTsKICAgICAgICAgICAgICB9IC8vIFJlYWQgdGhlIHBpeGVscyBhbmQgc2F2ZSB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIG9jY3VwaWVkIGFycmF5CgoKICAgICAgICAgICAgICB2YXIgb2NjdXBpZWQgPSBbXTsKICAgICAgICAgICAgICB2YXIgZ3ggPSBjZ3csCiAgICAgICAgICAgICAgICAgIGd5LAogICAgICAgICAgICAgICAgICB4LAogICAgICAgICAgICAgICAgICB5OwogICAgICAgICAgICAgIHZhciBib3VuZHMgPSBbY2doIC8gMiwgY2d3IC8gMiwgY2doIC8gMiwgY2d3IC8gMl07CgogICAgICAgICAgICAgIHdoaWxlIChneC0tKSB7CiAgICAgICAgICAgICAgICBneSA9IGNnaDsKCiAgICAgICAgICAgICAgICB3aGlsZSAoZ3ktLSkgewogICAgICAgICAgICAgICAgICB5ID0gZzsKCiAgICAgICAgICAgICAgICAgIHNpbmdsZUdyaWRMb29wOiB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHktLSkgewogICAgICAgICAgICAgICAgICAgICAgeCA9IGc7CgogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHgtLSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2VEYXRhWygoZ3kgKiBnICsgeSkgKiB3aWR0aCArIChneCAqIGcgKyB4KSkgKiA0ICsgM10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cGllZC5wdXNoKFtneCwgZ3ldKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGd4IDwgYm91bmRzWzNdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHNbM10gPSBneDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChneCA+IGJvdW5kc1sxXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzWzFdID0gZ3g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3kgPCBib3VuZHNbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kc1swXSA9IGd5OwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGd5ID4gYm91bmRzWzJdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHNbMl0gPSBneTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmN0eC5maWxsU3R5bGUgPSAncmdiYSgyNTUsIDAsIDAsIDAuNSknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmN0eC5maWxsUmVjdChneCAqIGcsIGd5ICogZywgZyAtIDAuNSwgZyAtIDAuNSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzaW5nbGVHcmlkTG9vcDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnKSB7CiAgICAgICAgICAgICAgICAgICAgICBmY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDAsIDAsIDI1NSwgMC41KSc7CiAgICAgICAgICAgICAgICAgICAgICBmY3R4LmZpbGxSZWN0KGd4ICogZywgZ3kgKiBnLCBnIC0gMC41LCBnIC0gMC41KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmIChkZWJ1ZykgewogICAgICAgICAgICAgICAgZmN0eC5maWxsU3R5bGUgPSAncmdiYSgwLCAyNTUsIDAsIDAuNSknOwogICAgICAgICAgICAgICAgZmN0eC5maWxsUmVjdChib3VuZHNbM10gKiBnLCBib3VuZHNbMF0gKiBnLCAoYm91bmRzWzFdIC0gYm91bmRzWzNdICsgMSkgKiBnLCAoYm91bmRzWzJdIC0gYm91bmRzWzBdICsgMSkgKiBnKTsKICAgICAgICAgICAgICB9IC8vIFJldHVybiBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gY3JlYXRlIHRoZSB0ZXh0IG9uIHRoZSByZWFsIGNhbnZhcwoKCiAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG11OiBtdSwKICAgICAgICAgICAgICAgIG9jY3VwaWVkOiBvY2N1cGllZCwKICAgICAgICAgICAgICAgIGJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgZ3c6IGNndywKICAgICAgICAgICAgICAgIGdoOiBjZ2gsCiAgICAgICAgICAgICAgICBmaWxsVGV4dE9mZnNldFg6IGZpbGxUZXh0T2Zmc2V0WCwKICAgICAgICAgICAgICAgIGZpbGxUZXh0T2Zmc2V0WTogZmlsbFRleHRPZmZzZXRZLAogICAgICAgICAgICAgICAgZmlsbFRleHRXaWR0aDogZncsCiAgICAgICAgICAgICAgICBmaWxsVGV4dEhlaWdodDogZmgsCiAgICAgICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICAvKiBEZXRlcm1pbmUgaWYgdGhlcmUgaXMgcm9vbSBhdmFpbGFibGUgaW4gdGhlIGdpdmVuIGRpbWVuc2lvbiAqLwoKCiAgICAgICAgICAgIHZhciBjYW5GaXRUZXh0ID0gZnVuY3Rpb24gY2FuRml0VGV4dChneCwgZ3ksIGd3LCBnaCwgb2NjdXBpZWQpIHsKICAgICAgICAgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBvY2N1cGllZCBwb2ludHMsCiAgICAgICAgICAgICAgLy8gcmV0dXJuIGZhbHNlIGlmIHRoZSBzcGFjZSBpcyBub3QgYXZhaWxhYmxlLgogICAgICAgICAgICAgIHZhciBpID0gb2NjdXBpZWQubGVuZ3RoOwoKICAgICAgICAgICAgICB3aGlsZSAoaS0tKSB7CiAgICAgICAgICAgICAgICB2YXIgcHggPSBneCArIG9jY3VwaWVkW2ldWzBdOwogICAgICAgICAgICAgICAgdmFyIHB5ID0gZ3kgKyBvY2N1cGllZFtpXVsxXTsKCiAgICAgICAgICAgICAgICBpZiAocHggPj0gbmd4IHx8IHB5ID49IG5neSB8fCBweCA8IDAgfHwgcHkgPCAwKSB7CiAgICAgICAgICAgICAgICAgIGlmICghc2V0dGluZ3MuZHJhd091dE9mQm91bmQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghZ3JpZFtweF1bcHldKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9OwogICAgICAgICAgICAvKiBBY3R1YWxseSBkcmF3IHRoZSB0ZXh0IG9uIHRoZSBncmlkICovCgoKICAgICAgICAgICAgdmFyIGRyYXdUZXh0ID0gZnVuY3Rpb24gZHJhd1RleHQoZ3gsIGd5LCBpbmZvLCB3b3JkLCB3ZWlnaHQsIGRpc3RhbmNlLCB0aGV0YSwgcm90YXRlRGVnLCBhdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gaW5mby5mb250U2l6ZTsKICAgICAgICAgICAgICB2YXIgY29sb3I7CgogICAgICAgICAgICAgIGlmIChnZXRUZXh0Q29sb3IpIHsKICAgICAgICAgICAgICAgIGNvbG9yID0gZ2V0VGV4dENvbG9yKHdvcmQsIHdlaWdodCwgZm9udFNpemUsIGRpc3RhbmNlLCB0aGV0YSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbG9yID0gc2V0dGluZ3MuY29sb3I7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB2YXIgY2xhc3NlczsKCiAgICAgICAgICAgICAgaWYgKGdldFRleHRDbGFzc2VzKSB7CiAgICAgICAgICAgICAgICBjbGFzc2VzID0gZ2V0VGV4dENsYXNzZXMod29yZCwgd2VpZ2h0LCBmb250U2l6ZSwgZGlzdGFuY2UsIHRoZXRhKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY2xhc3NlcyA9IHNldHRpbmdzLmNsYXNzZXM7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB2YXIgZGltZW5zaW9uOwogICAgICAgICAgICAgIHZhciBib3VuZHMgPSBpbmZvLmJvdW5kczsKICAgICAgICAgICAgICBkaW1lbnNpb24gPSB7CiAgICAgICAgICAgICAgICB4OiAoZ3ggKyBib3VuZHNbM10pICogZywKICAgICAgICAgICAgICAgIHk6IChneSArIGJvdW5kc1swXSkgKiBnLAogICAgICAgICAgICAgICAgdzogKGJvdW5kc1sxXSAtIGJvdW5kc1szXSArIDEpICogZywKICAgICAgICAgICAgICAgIGg6IChib3VuZHNbMl0gLSBib3VuZHNbMF0gKyAxKSAqIGcKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7CiAgICAgICAgICAgICAgICBpZiAoZWwuZ2V0Q29udGV4dCkgewogICAgICAgICAgICAgICAgICB2YXIgY3R4ID0gZWwuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICAgICAgICAgICAgdmFyIG11ID0gaW5mby5tdTsgLy8gU2F2ZSB0aGUgY3VycmVudCBzdGF0ZSBiZWZvcmUgbWVzc2luZyBpdAoKICAgICAgICAgICAgICAgICAgY3R4LnNhdmUoKTsKICAgICAgICAgICAgICAgICAgY3R4LnNjYWxlKDEgLyBtdSwgMSAvIG11KTsKICAgICAgICAgICAgICAgICAgY3R4LmZvbnQgPSBzZXR0aW5ncy5mb250V2VpZ2h0ICsgJyAnICsgKGZvbnRTaXplICogbXUpLnRvU3RyaW5nKDEwKSArICdweCAnICsgc2V0dGluZ3MuZm9udEZhbWlseTsKICAgICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yOyAvLyBUcmFuc2xhdGUgdGhlIGNhbnZhcyBwb3NpdGlvbiB0byB0aGUgb3JpZ2luIGNvb3JkaW5hdGUgb2Ygd2hlcmUKICAgICAgICAgICAgICAgICAgLy8gdGhlIHRleHQgc2hvdWxkIGJlIHB1dC4KCiAgICAgICAgICAgICAgICAgIGN0eC50cmFuc2xhdGUoKGd4ICsgaW5mby5ndyAvIDIpICogZyAqIG11LCAoZ3kgKyBpbmZvLmdoIC8gMikgKiBnICogbXUpOwoKICAgICAgICAgICAgICAgICAgaWYgKHJvdGF0ZURlZyAhPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGN0eC5yb3RhdGUoLXJvdGF0ZURlZyk7CiAgICAgICAgICAgICAgICAgIH0gLy8gRmluYWxseSwgZmlsbCB0aGUgdGV4dC4KICAgICAgICAgICAgICAgICAgLy8gWFhYOiBXZSBjYW5ub3QgYmVjYXVzZSB0ZXh0QmFzZWxpbmUgPSAndG9wJyBoZXJlIGJlY2F1c2UKICAgICAgICAgICAgICAgICAgLy8gRmlyZWZveCBhbmQgQ2hyb21lIHVzZXMgZGlmZmVyZW50IGRlZmF1bHQgbGluZS1oZWlnaHQgZm9yIGNhbnZhcy4KICAgICAgICAgICAgICAgICAgLy8gUGxlYXNlIHJlYWQgaHR0cHM6Ly9idWd6aWwubGEvNzM3ODUyI2M2LgogICAgICAgICAgICAgICAgICAvLyBIZXJlLCB3ZSB1c2UgdGV4dEJhc2VsaW5lID0gJ21pZGRsZScgYW5kIGRyYXcgdGhlIHRleHQgYXQgZXhhY3RseQogICAgICAgICAgICAgICAgICAvLyAwLjUgKiBmb250U2l6ZSBsb3dlci4KCgogICAgICAgICAgICAgICAgICBjdHgudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7CiAgICAgICAgICAgICAgICAgIGN0eC5maWxsVGV4dCh3b3JkLCBpbmZvLmZpbGxUZXh0T2Zmc2V0WCAqIG11LCAoaW5mby5maWxsVGV4dE9mZnNldFkgKyBmb250U2l6ZSAqIDAuNSkgKiBtdSk7IC8vIFRoZSBiZWxvdyBib3ggaXMgYWx3YXlzIG1hdGNoZXMgaG93IDxzcGFuPnMgYXJlIHBvc2l0aW9uZWQKCiAgICAgICAgICAgICAgICAgIC8qIGN0eC5zdHJva2VSZWN0KGluZm8uZmlsbFRleHRPZmZzZXRYLCBpbmZvLmZpbGxUZXh0T2Zmc2V0WSwKICAgICAgICAgICAgICAgICAgICBpbmZvLmZpbGxUZXh0V2lkdGgsIGluZm8uZmlsbFRleHRIZWlnaHQpOyAqLwogICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBzdGF0ZS4KCiAgICAgICAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAvLyBkcmF3VGV4dCBvbiBESVYgZWxlbWVudAogICAgICAgICAgICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICAgICAgICAgICAgdmFyIHRyYW5zZm9ybVJ1bGUgPSAnJzsKICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtUnVsZSA9ICdyb3RhdGUoJyArIC1yb3RhdGVEZWcgLyBNYXRoLlBJICogMTgwICsgJ2RlZykgJzsKCiAgICAgICAgICAgICAgICAgIGlmIChpbmZvLm11ICE9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtUnVsZSArPSAndHJhbnNsYXRlWCgtJyArIGluZm8uZmlsbFRleHRXaWR0aCAvIDQgKyAncHgpICcgKyAnc2NhbGUoJyArIDEgLyBpbmZvLm11ICsgJyknOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICB2YXIgc3R5bGVSdWxlcyA9IHsKICAgICAgICAgICAgICAgICAgICAncG9zaXRpb24nOiAnYWJzb2x1dGUnLAogICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JzogJ2Jsb2NrJywKICAgICAgICAgICAgICAgICAgICAnZm9udCc6IHNldHRpbmdzLmZvbnRXZWlnaHQgKyAnICcgKyBmb250U2l6ZSAqIGluZm8ubXUgKyAncHggJyArIHNldHRpbmdzLmZvbnRGYW1pbHksCiAgICAgICAgICAgICAgICAgICAgJ2xlZnQnOiAoZ3ggKyBpbmZvLmd3IC8gMikgKiBnICsgaW5mby5maWxsVGV4dE9mZnNldFggKyAncHgnLAogICAgICAgICAgICAgICAgICAgICd0b3AnOiAoZ3kgKyBpbmZvLmdoIC8gMikgKiBnICsgaW5mby5maWxsVGV4dE9mZnNldFkgKyAncHgnLAogICAgICAgICAgICAgICAgICAgICd3aWR0aCc6IGluZm8uZmlsbFRleHRXaWR0aCArICdweCcsCiAgICAgICAgICAgICAgICAgICAgJ2hlaWdodCc6IGluZm8uZmlsbFRleHRIZWlnaHQgKyAncHgnLAogICAgICAgICAgICAgICAgICAgICdsaW5lSGVpZ2h0JzogZm9udFNpemUgKyAncHgnLAogICAgICAgICAgICAgICAgICAgICd3aGl0ZVNwYWNlJzogJ25vd3JhcCcsCiAgICAgICAgICAgICAgICAgICAgJ3RyYW5zZm9ybSc6IHRyYW5zZm9ybVJ1bGUsCiAgICAgICAgICAgICAgICAgICAgJ3dlYmtpdFRyYW5zZm9ybSc6IHRyYW5zZm9ybVJ1bGUsCiAgICAgICAgICAgICAgICAgICAgJ21zVHJhbnNmb3JtJzogdHJhbnNmb3JtUnVsZSwKICAgICAgICAgICAgICAgICAgICAndHJhbnNmb3JtT3JpZ2luJzogJzUwJSA0MCUnLAogICAgICAgICAgICAgICAgICAgICd3ZWJraXRUcmFuc2Zvcm1PcmlnaW4nOiAnNTAlIDQwJScsCiAgICAgICAgICAgICAgICAgICAgJ21zVHJhbnNmb3JtT3JpZ2luJzogJzUwJSA0MCUnCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICBpZiAoY29sb3IpIHsKICAgICAgICAgICAgICAgICAgICBzdHlsZVJ1bGVzLmNvbG9yID0gY29sb3I7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB3b3JkOwoKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgY3NzUHJvcCBpbiBzdHlsZVJ1bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZVtjc3NQcm9wXSA9IHN0eWxlUnVsZXNbY3NzUHJvcF07CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYXR0cmlidXRlIGluIGF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgYXR0cmlidXRlc1thdHRyaWJ1dGVdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIGlmIChjbGFzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgc3Bhbi5jbGFzc05hbWUgKz0gY2xhc3NlczsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgZWwuYXBwZW5kQ2hpbGQoc3Bhbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIC8qIEhlbHAgZnVuY3Rpb24gdG8gdXBkYXRlR3JpZCAqLwoKCiAgICAgICAgICAgIHZhciBmaWxsR3JpZEF0ID0gZnVuY3Rpb24gZmlsbEdyaWRBdCh4LCB5LCBkcmF3TWFzaywgZGltZW5zaW9uLCBpdGVtKSB7CiAgICAgICAgICAgICAgaWYgKHggPj0gbmd4IHx8IHkgPj0gbmd5IHx8IHggPCAwIHx8IHkgPCAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBncmlkW3hdW3ldID0gZmFsc2U7CgogICAgICAgICAgICAgIGlmIChkcmF3TWFzaykgewogICAgICAgICAgICAgICAgdmFyIGN0eCA9IGVsZW1lbnRzWzBdLmdldENvbnRleHQoJzJkJyk7CiAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoeCAqIGcsIHkgKiBnLCBtYXNrUmVjdFdpZHRoLCBtYXNrUmVjdFdpZHRoKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmIChpbnRlcmFjdGl2ZSkgewogICAgICAgICAgICAgICAgaW5mb0dyaWRbeF1beV0gPSB7CiAgICAgICAgICAgICAgICAgIGl0ZW06IGl0ZW0sCiAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbjogZGltZW5zaW9uCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBmaWxsaW5nIGluZm9ybWF0aW9uIG9mIHRoZSBnaXZlbiBzcGFjZSB3aXRoIG9jY3VwaWVkIHBvaW50cy4KICAgICAgICAgICAgICAgRHJhdyB0aGUgbWFzayBvbiB0aGUgY2FudmFzIGlmIG5lY2Vzc2FyeS4gKi8KCgogICAgICAgICAgICB2YXIgdXBkYXRlR3JpZCA9IGZ1bmN0aW9uIHVwZGF0ZUdyaWQoZ3gsIGd5LCBndywgZ2gsIGluZm8sIGl0ZW0pIHsKICAgICAgICAgICAgICB2YXIgb2NjdXBpZWQgPSBpbmZvLm9jY3VwaWVkOwogICAgICAgICAgICAgIHZhciBkcmF3TWFzayA9IHNldHRpbmdzLmRyYXdNYXNrOwogICAgICAgICAgICAgIHZhciBjdHg7CgogICAgICAgICAgICAgIGlmIChkcmF3TWFzaykgewogICAgICAgICAgICAgICAgY3R4ID0gZWxlbWVudHNbMF0uZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICAgICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gc2V0dGluZ3MubWFza0NvbG9yOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdmFyIGRpbWVuc2lvbjsKCiAgICAgICAgICAgICAgaWYgKGludGVyYWN0aXZlKSB7CiAgICAgICAgICAgICAgICB2YXIgYm91bmRzID0gaW5mby5ib3VuZHM7CiAgICAgICAgICAgICAgICBkaW1lbnNpb24gPSB7CiAgICAgICAgICAgICAgICAgIHg6IChneCArIGJvdW5kc1szXSkgKiBnLAogICAgICAgICAgICAgICAgICB5OiAoZ3kgKyBib3VuZHNbMF0pICogZywKICAgICAgICAgICAgICAgICAgdzogKGJvdW5kc1sxXSAtIGJvdW5kc1szXSArIDEpICogZywKICAgICAgICAgICAgICAgICAgaDogKGJvdW5kc1syXSAtIGJvdW5kc1swXSArIDEpICogZwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHZhciBpID0gb2NjdXBpZWQubGVuZ3RoOwoKICAgICAgICAgICAgICB3aGlsZSAoaS0tKSB7CiAgICAgICAgICAgICAgICB2YXIgcHggPSBneCArIG9jY3VwaWVkW2ldWzBdOwogICAgICAgICAgICAgICAgdmFyIHB5ID0gZ3kgKyBvY2N1cGllZFtpXVsxXTsKCiAgICAgICAgICAgICAgICBpZiAocHggPj0gbmd4IHx8IHB5ID49IG5neSB8fCBweCA8IDAgfHwgcHkgPCAwKSB7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZpbGxHcmlkQXQocHgsIHB5LCBkcmF3TWFzaywgZGltZW5zaW9uLCBpdGVtKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmIChkcmF3TWFzaykgewogICAgICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIC8qIHB1dFdvcmQoKSBwcm9jZXNzZXMgZWFjaCBpdGVtIG9uIHRoZSBsaXN0LAogICAgICAgICAgICAgICBjYWxjdWxhdGUgaXQncyBzaXplIGFuZCBkZXRlcm1pbmUgaXQncyBwb3NpdGlvbiwgYW5kIGFjdHVhbGx5CiAgICAgICAgICAgICAgIHB1dCBpdCBvbiB0aGUgY2FudmFzLiAqLwoKCiAgICAgICAgICAgIHZhciBwdXRXb3JkID0gZnVuY3Rpb24gcHV0V29yZChpdGVtKSB7CiAgICAgICAgICAgICAgdmFyIHdvcmQsIHdlaWdodCwgYXR0cmlidXRlczsKCiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHsKICAgICAgICAgICAgICAgIHdvcmQgPSBpdGVtWzBdOwogICAgICAgICAgICAgICAgd2VpZ2h0ID0gaXRlbVsxXTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgd29yZCA9IGl0ZW0ud29yZDsKICAgICAgICAgICAgICAgIHdlaWdodCA9IGl0ZW0ud2VpZ2h0OwogICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IGl0ZW0uYXR0cmlidXRlczsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHZhciByb3RhdGVEZWcgPSBnZXRSb3RhdGVEZWcoKTsgLy8gZ2V0IGluZm8gbmVlZGVkIHRvIHB1dCB0aGUgdGV4dCBvbnRvIHRoZSBjYW52YXMKCiAgICAgICAgICAgICAgdmFyIGluZm8gPSBnZXRUZXh0SW5mbyh3b3JkLCB3ZWlnaHQsIHJvdGF0ZURlZyk7IC8vIG5vdCBnZXR0aW5nIHRoZSBpbmZvIG1lYW5zIHdlIHNob3VsZG4ndCBiZSBkcmF3aW5nIHRoaXMgb25lLgoKICAgICAgICAgICAgICBpZiAoIWluZm8pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmIChleGNlZWRUaW1lKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICB9IC8vIElmIGRyYXdPdXRPZkJvdW5kIGlzIHNldCB0byBmYWxzZSwKICAgICAgICAgICAgICAvLyBza2lwIHRoZSBsb29wIGlmIHdlIGhhdmUgYWxyZWFkeSBrbm93IHRoZSBib3VuZGluZyBib3ggb2YKICAgICAgICAgICAgICAvLyB3b3JkIGlzIGxhcmdlciB0aGFuIHRoZSBjYW52YXMuCgoKICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLmRyYXdPdXRPZkJvdW5kKSB7CiAgICAgICAgICAgICAgICB2YXIgYm91bmRzID0gaW5mby5ib3VuZHM7CgogICAgICAgICAgICAgICAgaWYgKGJvdW5kc1sxXSAtIGJvdW5kc1szXSArIDEgPiBuZ3ggfHwgYm91bmRzWzJdIC0gYm91bmRzWzBdICsgMSA+IG5neSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSAvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIHRvIHB1dCB0aGUgdGV4dCBieQogICAgICAgICAgICAgIC8vIHN0YXJ0IGxvb2tpbmcgZm9yIHRoZSBuZWFyZXN0IHBvaW50cwoKCiAgICAgICAgICAgICAgdmFyIHIgPSBtYXhSYWRpdXMgKyAxOwoKICAgICAgICAgICAgICB2YXIgdHJ5VG9QdXRXb3JkQXRQb2ludCA9IGZ1bmN0aW9uIHRyeVRvUHV0V29yZEF0UG9pbnQoZ3h5KSB7CiAgICAgICAgICAgICAgICB2YXIgZ3ggPSBNYXRoLmZsb29yKGd4eVswXSAtIGluZm8uZ3cgLyAyKTsKICAgICAgICAgICAgICAgIHZhciBneSA9IE1hdGguZmxvb3IoZ3h5WzFdIC0gaW5mby5naCAvIDIpOwogICAgICAgICAgICAgICAgdmFyIGd3ID0gaW5mby5ndzsKICAgICAgICAgICAgICAgIHZhciBnaCA9IGluZm8uZ2g7IC8vIElmIHdlIGNhbm5vdCBmaXQgdGhlIHRleHQgYXQgdGhpcyBwb3NpdGlvbiwgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgICAvLyBhbmQgZ28gdG8gdGhlIG5leHQgcG9zaXRpb24uCgogICAgICAgICAgICAgICAgaWYgKCFjYW5GaXRUZXh0KGd4LCBneSwgZ3csIGdoLCBpbmZvLm9jY3VwaWVkKSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9IC8vIEFjdHVhbGx5IHB1dCB0aGUgdGV4dCBvbiB0aGUgY2FudmFzCgoKICAgICAgICAgICAgICAgIGRyYXdUZXh0KGd4LCBneSwgaW5mbywgd29yZCwgd2VpZ2h0LCBtYXhSYWRpdXMgLSByLCBneHlbMl0sIHJvdGF0ZURlZywgYXR0cmlidXRlcyk7IC8vIE1hcmsgdGhlIHNwYWNlcyBvbiB0aGUgZ3JpZCBhcyBmaWxsZWQKCiAgICAgICAgICAgICAgICB1cGRhdGVHcmlkKGd4LCBneSwgZ3csIGdoLCBpbmZvLCBpdGVtKTsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgIGd4OiBneCwKICAgICAgICAgICAgICAgICAgZ3k6IGd5LAogICAgICAgICAgICAgICAgICByb3Q6IHJvdGF0ZURlZywKICAgICAgICAgICAgICAgICAgaW5mbzogaW5mbwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICB3aGlsZSAoci0tKSB7CiAgICAgICAgICAgICAgICB2YXIgcG9pbnRzID0gZ2V0UG9pbnRzQXRSYWRpdXMobWF4UmFkaXVzIC0gcik7CgogICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLnNodWZmbGUpIHsKICAgICAgICAgICAgICAgICAgcG9pbnRzID0gW10uY29uY2F0KHBvaW50cyk7CiAgICAgICAgICAgICAgICAgIHNodWZmbGVBcnJheShwb2ludHMpOwogICAgICAgICAgICAgICAgfSAvLyBUcnkgdG8gZml0IHRoZSB3b3JkcyBieSBsb29raW5nIGF0IGVhY2ggcG9pbnQuCiAgICAgICAgICAgICAgICAvLyBhcnJheS5zb21lKCkgd2lsbCBzdG9wIGFuZCByZXR1cm4gdHJ1ZQogICAgICAgICAgICAgICAgLy8gd2hlbiBwdXRXb3JkQXRQb2ludCgpIHJldHVybnMgdHJ1ZS4KCgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IHRyeVRvUHV0V29yZEF0UG9pbnQocG9pbnRzW2ldKTsKCiAgICAgICAgICAgICAgICAgIGlmIChyZXMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IC8vIHZhciBkcmF3biA9IHBvaW50cy5zb21lKHRyeVRvUHV0V29yZEF0UG9pbnQpOwogICAgICAgICAgICAgICAgLy8gaWYgKGRyYXduKSB7CiAgICAgICAgICAgICAgICAvLyAgIC8vIGxlYXZlIHB1dFdvcmQoKSBhbmQgcmV0dXJuIHRydWUKICAgICAgICAgICAgICAgIC8vICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAvLyB9CgogICAgICAgICAgICAgIH0gLy8gd2UgdHJpZWQgYWxsIGRpc3RhbmNlcyBidXQgdGV4dCB3b24ndCBmaXQsIHJldHVybiBudWxsCgoKICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgLyogU2VuZCBET00gZXZlbnQgdG8gYWxsIGVsZW1lbnRzLiBXaWxsIHN0b3Agc2VuZGluZyBldmVudCBhbmQgcmV0dXJuCiAgICAgICAgICAgICAgIGlmIHRoZSBwcmV2aW91cyBvbmUgaXMgY2FuY2VsZWQgKGZvciBjYW5jZWxhYmxlIGV2ZW50cykuICovCgoKICAgICAgICAgICAgdmFyIHNlbmRFdmVudCA9IGZ1bmN0aW9uIHNlbmRFdmVudCh0eXBlLCBjYW5jZWxhYmxlLCBkZXRhaWwpIHsKICAgICAgICAgICAgICBpZiAoY2FuY2VsYWJsZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICFlbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbCkgewogICAgICAgICAgICAgICAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7CiAgICAgICAgICAgICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQodHlwZSwgdHJ1ZSwgY2FuY2VsYWJsZSwgZGV0YWlsIHx8IHt9KTsKICAgICAgICAgICAgICAgICAgcmV0dXJuICFlbC5kaXNwYXRjaEV2ZW50KGV2dCk7CiAgICAgICAgICAgICAgICB9LCB0aGlzKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsKICAgICAgICAgICAgICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpOwogICAgICAgICAgICAgICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIHRydWUsIGNhbmNlbGFibGUsIGRldGFpbCB8fCB7fSk7CiAgICAgICAgICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQoZXZ0KTsKICAgICAgICAgICAgICAgIH0sIHRoaXMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgLyogU3RhcnQgZHJhd2luZyBvbiBhIGNhbnZhcyAqLwoKCiAgICAgICAgICAgIHZhciBzdGFydCA9IGZ1bmN0aW9uIHN0YXJ0KCkgewogICAgICAgICAgICAgIC8vIEZvciBkaW1lbnNpb25zLCBjbGVhckNhbnZhcyBldGMuLAogICAgICAgICAgICAgIC8vIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgZmlyc3QgZWxlbWVudC4KICAgICAgICAgICAgICB2YXIgY2FudmFzID0gZWxlbWVudHNbMF07CgogICAgICAgICAgICAgIGlmIChjYW52YXMuZ2V0Q29udGV4dCkgewogICAgICAgICAgICAgICAgbmd4ID0gTWF0aC5jZWlsKGNhbnZhcy53aWR0aCAvIGcpOwogICAgICAgICAgICAgICAgbmd5ID0gTWF0aC5jZWlsKGNhbnZhcy5oZWlnaHQgLyBnKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHJlY3QgPSBjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgICAgICBuZ3ggPSBNYXRoLmNlaWwocmVjdC53aWR0aCAvIGcpOwogICAgICAgICAgICAgICAgbmd5ID0gTWF0aC5jZWlsKHJlY3QuaGVpZ2h0IC8gZyk7CiAgICAgICAgICAgICAgfSAvLyBTZW5kaW5nIGEgd29yZGNsb3Vkc3RhcnQgZXZlbnQgd2hpY2ggY2F1c2UgdGhlIHByZXZpb3VzIGxvb3AgdG8gc3RvcC4KICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZSBldmVudCBpcyBjYW5jZWxlZC4KCgogICAgICAgICAgICAgIGlmICghc2VuZEV2ZW50KCd3b3JkY2xvdWRzdGFydCcsIHRydWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfSAvLyBEZXRlcm1pbmUgdGhlIGNlbnRlciBvZiB0aGUgd29yZCBjbG91ZAoKCiAgICAgICAgICAgICAgY2VudGVyID0gc2V0dGluZ3Mub3JpZ2luID8gW3NldHRpbmdzLm9yaWdpblswXSAvIGcsIHNldHRpbmdzLm9yaWdpblsxXSAvIGddIDogW25neCAvIDIsIG5neSAvIDJdOyAvLyBNYXhpdW0gcmFkaXVzIHRvIGxvb2sgZm9yIHNwYWNlCgogICAgICAgICAgICAgIG1heFJhZGl1cyA9IE1hdGguZmxvb3IoTWF0aC5zcXJ0KG5neCAqIG5neCArIG5neSAqIG5neSkpOwogICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBjYW52YXMgb25seSBpZiB0aGUgY2xlYXJDYW52YXMgaXMgc2V0LAogICAgICAgICAgICAgICAgIGlmIG5vdCwgdXBkYXRlIHRoZSBncmlkIHRvIHRoZSBjdXJyZW50IGNhbnZhcyBzdGF0ZSAqLwoKICAgICAgICAgICAgICBncmlkID0gW107CiAgICAgICAgICAgICAgdmFyIGd4LCBneSwgaTsKCiAgICAgICAgICAgICAgaWYgKCFjYW52YXMuZ2V0Q29udGV4dCB8fCBzZXR0aW5ncy5jbGVhckNhbnZhcykgewogICAgICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsKICAgICAgICAgICAgICAgICAgaWYgKGVsLmdldENvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY3R4ID0gZWwuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gc2V0dGluZ3MuYmFja2dyb3VuZENvbG9yOwogICAgICAgICAgICAgICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgbmd4ICogKGcgKyAxKSwgbmd5ICogKGcgKyAxKSk7CiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIG5neCAqIChnICsgMSksIG5neSAqIChnICsgMSkpOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gc2V0dGluZ3MuYmFja2dyb3VuZENvbG9yOwogICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBncmlkIHdpdGggZW1wdHkgc3RhdGUgKi8KCiAgICAgICAgICAgICAgICBneCA9IG5neDsKCiAgICAgICAgICAgICAgICB3aGlsZSAoZ3gtLSkgewogICAgICAgICAgICAgICAgICBncmlkW2d4XSA9IFtdOwogICAgICAgICAgICAgICAgICBneSA9IG5neTsKCiAgICAgICAgICAgICAgICAgIHdoaWxlIChneS0tKSB7CiAgICAgICAgICAgICAgICAgICAgZ3JpZFtneF1bZ3ldID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvKiBEZXRlcm1pbmUgYmdQaXhlbCBieSBjcmVhdGluZwogICAgICAgICAgICAgICAgICAgYW5vdGhlciBjYW52YXMgYW5kIGZpbGwgdGhlIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yLiAqLwogICAgICAgICAgICAgICAgdmFyIGJjdHggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KCcyZCcpOwogICAgICAgICAgICAgICAgYmN0eC5maWxsU3R5bGUgPSBzZXR0aW5ncy5iYWNrZ3JvdW5kQ29sb3I7CiAgICAgICAgICAgICAgICBiY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpOwogICAgICAgICAgICAgICAgdmFyIGJnUGl4ZWwgPSBiY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKS5kYXRhOwogICAgICAgICAgICAgICAgLyogUmVhZCBiYWNrIHRoZSBwaXhlbHMgb2YgdGhlIGNhbnZhcyB3ZSBnb3QgdG8gdGVsbCB3aGljaCBwYXJ0IG9mIHRoZQogICAgICAgICAgICAgICAgICAgY2FudmFzIGlzIGVtcHR5LgogICAgICAgICAgICAgICAgICAgKG5vIGNsZWFyQ2FudmFzIG9ubHkgd29ya3Mgd2l0aCBhIGNhbnZhcywgbm90IGRpdnMpICovCgogICAgICAgICAgICAgICAgdmFyIGltYWdlRGF0YSA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmdldEltYWdlRGF0YSgwLCAwLCBuZ3ggKiBnLCBuZ3kgKiBnKS5kYXRhOwogICAgICAgICAgICAgICAgZ3ggPSBuZ3g7CiAgICAgICAgICAgICAgICB2YXIgeCwgeTsKCiAgICAgICAgICAgICAgICB3aGlsZSAoZ3gtLSkgewogICAgICAgICAgICAgICAgICBncmlkW2d4XSA9IFtdOwogICAgICAgICAgICAgICAgICBneSA9IG5neTsKCiAgICAgICAgICAgICAgICAgIHdoaWxlIChneS0tKSB7CiAgICAgICAgICAgICAgICAgICAgeSA9IGc7CgogICAgICAgICAgICAgICAgICAgIHNpbmdsZUdyaWRMb29wOiB3aGlsZSAoeS0tKSB7CiAgICAgICAgICAgICAgICAgICAgICB4ID0gZzsKCiAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeC0tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSA0OwoKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGktLSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZURhdGFbKChneSAqIGcgKyB5KSAqIG5neCAqIGcgKyAoZ3ggKiBnICsgeCkpICogNCArIGldICE9PSBiZ1BpeGVsW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlkW2d4XVtneV0gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNpbmdsZUdyaWRMb29wOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGdyaWRbZ3hdW2d5XSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgIGdyaWRbZ3hdW2d5XSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaW1hZ2VEYXRhID0gYmN0eCA9IGJnUGl4ZWwgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgfSAvLyBmaWxsIHRoZSBpbmZvR3JpZCB3aXRoIGVtcHR5IHN0YXRlIGlmIHdlIG5lZWQgaXQKCgogICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5ob3ZlciB8fCBzZXR0aW5ncy5jbGljaykgewogICAgICAgICAgICAgICAgaW50ZXJhY3RpdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgZ3JpZCB3aXRoIGVtcHR5IHN0YXRlICovCgogICAgICAgICAgICAgICAgZ3ggPSBuZ3ggKyAxOwoKICAgICAgICAgICAgICAgIHdoaWxlIChneC0tKSB7CiAgICAgICAgICAgICAgICAgIGluZm9HcmlkW2d4XSA9IFtdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5ob3ZlcikgewogICAgICAgICAgICAgICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgd29yZGNsb3VkaG92ZXIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5jbGljaykgewogICAgICAgICAgICAgICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB3b3JkY2xvdWRjbGljayk7CiAgICAgICAgICAgICAgICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgd29yZGNsb3VkY2xpY2spOwogICAgICAgICAgICAgICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIGNhbnZhcy5zdHlsZS53ZWJraXRUYXBIaWdobGlnaHRDb2xvciA9ICdyZ2JhKDAsIDAsIDAsIDApJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignd29yZGNsb3Vkc3RhcnQnLCBmdW5jdGlvbiBzdG9wSW50ZXJhY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgIGNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCd3b3JkY2xvdWRzdGFydCcsIHN0b3BJbnRlcmFjdGlvbik7CiAgICAgICAgICAgICAgICAgIGNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB3b3JkY2xvdWRob3Zlcik7CiAgICAgICAgICAgICAgICAgIGNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHdvcmRjbG91ZGNsaWNrKTsKICAgICAgICAgICAgICAgICAgaG92ZXJlZCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgICAgdmFyIGxvb3BpbmdGdW5jdGlvbiwgc3RvcHBpbmdGdW5jdGlvbjsKICAgICAgICAgICAgICB2YXIgbGF5b3V0aW5nID0gdHJ1ZTsKCiAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5sYXlvdXRBbmltYXRpb24pIHsKICAgICAgICAgICAgICAgIGxvb3BpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uIGxvb3BpbmdGdW5jdGlvbihjYikgewogICAgICAgICAgICAgICAgICBjYigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBzdG9wcGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24gc3RvcHBpbmdGdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgbGF5b3V0aW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZ3Mud2FpdCAhPT0gMCkgewogICAgICAgICAgICAgICAgbG9vcGluZ0Z1bmN0aW9uID0gd2luZG93LnNldFRpbWVvdXQ7CiAgICAgICAgICAgICAgICBzdG9wcGluZ0Z1bmN0aW9uID0gd2luZG93LmNsZWFyVGltZW91dDsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbG9vcGluZ0Z1bmN0aW9uID0gd2luZG93LnNldEltbWVkaWF0ZTsKICAgICAgICAgICAgICAgIHN0b3BwaW5nRnVuY3Rpb24gPSB3aW5kb3cuY2xlYXJJbW1lZGlhdGU7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB2YXIgYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7CiAgICAgICAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpOwogICAgICAgICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgdmFyIHJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgewogICAgICAgICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIH0sIHRoaXMpOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgIHZhciBhbm90aGVyV29yZENsb3VkU3RhcnQgPSBmdW5jdGlvbiBhbm90aGVyV29yZENsb3VkU3RhcnQoKSB7CiAgICAgICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKCd3b3JkY2xvdWRzdGFydCcsIGFub3RoZXJXb3JkQ2xvdWRTdGFydCk7CiAgICAgICAgICAgICAgICBzdG9wcGluZ0Z1bmN0aW9uKHRpbWVyKTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyKCd3b3JkY2xvdWRzdGFydCcsIGFub3RoZXJXb3JkQ2xvdWRTdGFydCk7IC8vIEF0IGxlYXN0IHdhaXQgdGhlIGZvbGxvd2luZyBjb2RlIGJlZm9yZSBjYWxsIHRoZSBmaXJzdCBpdGVyYXRpb24uCgogICAgICAgICAgICAgIHZhciB0aW1lciA9IChzZXR0aW5ncy5sYXlvdXRBbmltYXRpb24gPyBsb29waW5nRnVuY3Rpb24gOiBzZXRUaW1lb3V0KShmdW5jdGlvbiBsb29wKCkgewogICAgICAgICAgICAgICAgaWYgKCFsYXlvdXRpbmcpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpID49IHNldHRpbmdzLmxpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgIHN0b3BwaW5nRnVuY3Rpb24odGltZXIpOwogICAgICAgICAgICAgICAgICBzZW5kRXZlbnQoJ3dvcmRjbG91ZHN0b3AnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dvcmRjbG91ZHN0YXJ0JywgYW5vdGhlcldvcmRDbG91ZFN0YXJ0KTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGVzY2FwZVRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgIHZhciBkcmF3biA9IHB1dFdvcmQoc2V0dGluZ3MubGlzdFtpXSk7CiAgICAgICAgICAgICAgICB2YXIgY2FuY2VsZWQgPSAhc2VuZEV2ZW50KCd3b3JkY2xvdWRkcmF3bicsIHRydWUsIHsKICAgICAgICAgICAgICAgICAgaXRlbTogc2V0dGluZ3MubGlzdFtpXSwKICAgICAgICAgICAgICAgICAgZHJhd246IGRyYXduCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBpZiAoZXhjZWVkVGltZSgpIHx8IGNhbmNlbGVkKSB7CiAgICAgICAgICAgICAgICAgIHN0b3BwaW5nRnVuY3Rpb24odGltZXIpOwogICAgICAgICAgICAgICAgICBzZXR0aW5ncy5hYm9ydCgpOwogICAgICAgICAgICAgICAgICBzZW5kRXZlbnQoJ3dvcmRjbG91ZGFib3J0JywgZmFsc2UpOwogICAgICAgICAgICAgICAgICBzZW5kRXZlbnQoJ3dvcmRjbG91ZHN0b3AnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dvcmRjbG91ZHN0YXJ0JywgYW5vdGhlcldvcmRDbG91ZFN0YXJ0KTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgIHRpbWVyID0gbG9vcGluZ0Z1bmN0aW9uKGxvb3AsIHNldHRpbmdzLndhaXQpOwogICAgICAgICAgICAgIH0sIHNldHRpbmdzLndhaXQpOwogICAgICAgICAgICB9OyAvLyBBbGwgc2V0LCBzdGFydCB0aGUgZHJhd2luZwoKCiAgICAgICAgICAgIHN0YXJ0KCk7CiAgICAgICAgICB9OwoKICAgICAgICAgIFdvcmRDbG91ZC5pc1N1cHBvcnRlZCA9IGlzU3VwcG9ydGVkOwogICAgICAgICAgV29yZENsb3VkLm1pbkZvbnRTaXplID0gbWluRm9udFNpemU7CiAgICAgICAgICAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovCgogICAgICAgICAgdmFyIGxheW91dCA9IFdvcmRDbG91ZDsgLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvd29yZENsb3VkLmpzCgogICAgICAgICAgaWYgKCFsYXlvdXQuaXNTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb3JyeSB5b3VyIGJyb3dzZXIgbm90IHN1cHBvcnQgd29yZENsb3VkJyk7CiAgICAgICAgICB9IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1kcmVhbS93b3JkY2xvdWQyLmpzL2Jsb2IvYzIzNmJlZTYwNDM2ZTA0ODk0OWY5YmVjYzRmMGY2N2JkODMyZGM1Yy9pbmRleC5qcyNMMjMzCgoKICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUNhbnZhc01hc2sobWFza0NhbnZhcykgewogICAgICAgICAgICB2YXIgY3R4ID0gbWFza0NhbnZhcy5nZXRDb250ZXh0KCcyZCcpOwogICAgICAgICAgICB2YXIgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBtYXNrQ2FudmFzLndpZHRoLCBtYXNrQ2FudmFzLmhlaWdodCk7CiAgICAgICAgICAgIHZhciBuZXdJbWFnZURhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKGltYWdlRGF0YSk7CiAgICAgICAgICAgIHZhciB0b25lU3VtID0gMDsKICAgICAgICAgICAgdmFyIHRvbmVDbnQgPSAwOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbWFnZURhdGEuZGF0YS5sZW5ndGg7IGkgKz0gNCkgewogICAgICAgICAgICAgIHZhciBhbHBoYSA9IGltYWdlRGF0YS5kYXRhW2kgKyAzXTsKCiAgICAgICAgICAgICAgaWYgKGFscGhhID4gMTI4KSB7CiAgICAgICAgICAgICAgICB2YXIgdG9uZSA9IGltYWdlRGF0YS5kYXRhW2ldICsgaW1hZ2VEYXRhLmRhdGFbaSArIDFdICsgaW1hZ2VEYXRhLmRhdGFbaSArIDJdOwogICAgICAgICAgICAgICAgdG9uZVN1bSArPSB0b25lOwogICAgICAgICAgICAgICAgKyt0b25lQ250OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHRocmVzaG9sZCA9IHRvbmVTdW0gLyB0b25lQ250OwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbWFnZURhdGEuZGF0YS5sZW5ndGg7IGkgKz0gNCkgewogICAgICAgICAgICAgIHZhciB0b25lID0gaW1hZ2VEYXRhLmRhdGFbaV0gKyBpbWFnZURhdGEuZGF0YVtpICsgMV0gKyBpbWFnZURhdGEuZGF0YVtpICsgMl07CiAgICAgICAgICAgICAgdmFyIGFscGhhID0gaW1hZ2VEYXRhLmRhdGFbaSArIDNdOwoKICAgICAgICAgICAgICBpZiAoYWxwaGEgPCAxMjggfHwgdG9uZSA+IHRocmVzaG9sZCkgewogICAgICAgICAgICAgICAgLy8gQXJlYSBub3QgdG8gZHJhdwogICAgICAgICAgICAgICAgbmV3SW1hZ2VEYXRhLmRhdGFbaV0gPSAwOwogICAgICAgICAgICAgICAgbmV3SW1hZ2VEYXRhLmRhdGFbaSArIDFdID0gMDsKICAgICAgICAgICAgICAgIG5ld0ltYWdlRGF0YS5kYXRhW2kgKyAyXSA9IDA7CiAgICAgICAgICAgICAgICBuZXdJbWFnZURhdGEuZGF0YVtpICsgM10gPSAwOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBBcmVhIHRvIGRyYXcKICAgICAgICAgICAgICAgIC8vIFRoZSBjb2xvciBtdXN0IGJlIHNhbWUgd2l0aCBiYWNrZ3JvdW5kQ29sb3IKICAgICAgICAgICAgICAgIG5ld0ltYWdlRGF0YS5kYXRhW2ldID0gMjU1OwogICAgICAgICAgICAgICAgbmV3SW1hZ2VEYXRhLmRhdGFbaSArIDFdID0gMjU1OwogICAgICAgICAgICAgICAgbmV3SW1hZ2VEYXRhLmRhdGFbaSArIDJdID0gMjU1OwogICAgICAgICAgICAgICAgbmV3SW1hZ2VEYXRhLmRhdGFbaSArIDNdID0gMjU1OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgY3R4LnB1dEltYWdlRGF0YShuZXdJbWFnZURhdGEsIDAsIDApOwogICAgICAgICAgfQoKICAgICAgICAgIGV4dGVybmFsX2VjaGFydHNfLnJlZ2lzdGVyTGF5b3V0KGZ1bmN0aW9uIChlY01vZGVsLCBhcGkpIHsKICAgICAgICAgICAgZWNNb2RlbC5lYWNoU2VyaWVzQnlUeXBlKCd3b3JkQ2xvdWQnLCBmdW5jdGlvbiAoc2VyaWVzTW9kZWwpIHsKICAgICAgICAgICAgICB2YXIgZ3JpZFJlY3QgPSBleHRlcm5hbF9lY2hhcnRzXy5oZWxwZXIuZ2V0TGF5b3V0UmVjdChzZXJpZXNNb2RlbC5nZXRCb3hMYXlvdXRQYXJhbXMoKSwgewogICAgICAgICAgICAgICAgd2lkdGg6IGFwaS5nZXRXaWR0aCgpLAogICAgICAgICAgICAgICAgaGVpZ2h0OiBhcGkuZ2V0SGVpZ2h0KCkKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB2YXIgZGF0YSA9IHNlcmllc01vZGVsLmdldERhdGEoKTsKICAgICAgICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7CiAgICAgICAgICAgICAgY2FudmFzLndpZHRoID0gZ3JpZFJlY3Qud2lkdGg7CiAgICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGdyaWRSZWN0LmhlaWdodDsKICAgICAgICAgICAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CiAgICAgICAgICAgICAgdmFyIG1hc2tJbWFnZSA9IHNlcmllc01vZGVsLmdldCgnbWFza0ltYWdlJyk7CgogICAgICAgICAgICAgIGlmIChtYXNrSW1hZ2UpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UobWFza0ltYWdlLCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpOwogICAgICAgICAgICAgICAgICB1cGRhdGVDYW52YXNNYXNrKGNhbnZhcyk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgbWFzayBpbWFnZScpOwogICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB2YXIgc2l6ZVJhbmdlID0gc2VyaWVzTW9kZWwuZ2V0KCdzaXplUmFuZ2UnKTsKICAgICAgICAgICAgICB2YXIgcm90YXRpb25SYW5nZSA9IHNlcmllc01vZGVsLmdldCgncm90YXRpb25SYW5nZScpOwogICAgICAgICAgICAgIHZhciB2YWx1ZUV4dGVudCA9IGRhdGEuZ2V0RGF0YUV4dGVudCgndmFsdWUnKTsKICAgICAgICAgICAgICB2YXIgREVHUkVFX1RPX1JBRCA9IE1hdGguUEkgLyAxODA7CiAgICAgICAgICAgICAgdmFyIGdyaWRTaXplID0gc2VyaWVzTW9kZWwuZ2V0KCdncmlkU2l6ZScpOwogICAgICAgICAgICAgIGxheW91dChjYW52YXMsIHsKICAgICAgICAgICAgICAgIGxpc3Q6IGRhdGEubWFwQXJyYXkoJ3ZhbHVlJywgZnVuY3Rpb24gKHZhbHVlLCBpZHgpIHsKICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1Nb2RlbCA9IGRhdGEuZ2V0SXRlbU1vZGVsKGlkeCk7CiAgICAgICAgICAgICAgICAgIHJldHVybiBbZGF0YS5nZXROYW1lKGlkeCksIGl0ZW1Nb2RlbC5nZXQoJ3RleHRTdHlsZS5mb250U2l6ZScsIHRydWUpIHx8IGV4dGVybmFsX2VjaGFydHNfLm51bWJlci5saW5lYXJNYXAodmFsdWUsIHZhbHVlRXh0ZW50LCBzaXplUmFuZ2UpLCBpZHhdOwogICAgICAgICAgICAgICAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAvLyBTb3J0IGZyb20gbGFyZ2UgdG8gc21hbGwgaW4gY2FzZSB0aGVyZSBpcyBubyBtb3JlIHJvb20gZm9yIG1vcmUgd29yZHMKICAgICAgICAgICAgICAgICAgcmV0dXJuIGJbMV0gLSBhWzFdOwogICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBzZXJpZXNNb2RlbC5nZXQoJ3RleHRTdHlsZS5mb250RmFtaWx5JykgfHwgc2VyaWVzTW9kZWwuZ2V0KCdlbXBoYXNpcy50ZXh0U3R5bGUuZm9udEZhbWlseScpIHx8IGVjTW9kZWwuZ2V0KCd0ZXh0U3R5bGUuZm9udEZhbWlseScpLAogICAgICAgICAgICAgICAgZm9udFdlaWdodDogc2VyaWVzTW9kZWwuZ2V0KCd0ZXh0U3R5bGUuZm9udFdlaWdodCcpIHx8IHNlcmllc01vZGVsLmdldCgnZW1waGFzaXMudGV4dFN0eWxlLmZvbnRXZWlnaHQnKSB8fCBlY01vZGVsLmdldCgndGV4dFN0eWxlLmZvbnRXZWlnaHQnKSwKICAgICAgICAgICAgICAgIGdyaWRTaXplOiBncmlkU2l6ZSwKICAgICAgICAgICAgICAgIGVsbGlwdGljaXR5OiBncmlkUmVjdC5oZWlnaHQgLyBncmlkUmVjdC53aWR0aCwKICAgICAgICAgICAgICAgIG1pblJvdGF0aW9uOiByb3RhdGlvblJhbmdlWzBdICogREVHUkVFX1RPX1JBRCwKICAgICAgICAgICAgICAgIG1heFJvdGF0aW9uOiByb3RhdGlvblJhbmdlWzFdICogREVHUkVFX1RPX1JBRCwKICAgICAgICAgICAgICAgIGNsZWFyQ2FudmFzOiAhbWFza0ltYWdlLAogICAgICAgICAgICAgICAgcm90YXRlUmF0aW86IDEsCiAgICAgICAgICAgICAgICByb3RhdGlvblN0ZXA6IHNlcmllc01vZGVsLmdldCgncm90YXRpb25TdGVwJykgKiBERUdSRUVfVE9fUkFELAogICAgICAgICAgICAgICAgZHJhd091dE9mQm91bmQ6IHNlcmllc01vZGVsLmdldCgnZHJhd091dE9mQm91bmQnKSwKICAgICAgICAgICAgICAgIGxheW91dEFuaW1hdGlvbjogc2VyaWVzTW9kZWwuZ2V0KCdsYXlvdXRBbmltYXRpb24nKSwKICAgICAgICAgICAgICAgIHNodWZmbGU6IGZhbHNlLAogICAgICAgICAgICAgICAgc2hhcGU6IHNlcmllc01vZGVsLmdldCgnc2hhcGUnKQogICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICBmdW5jdGlvbiBvbldvcmRDbG91ZERyYXduKGUpIHsKICAgICAgICAgICAgICAgIHZhciBpdGVtID0gZS5kZXRhaWwuaXRlbTsKCiAgICAgICAgICAgICAgICBpZiAoZS5kZXRhaWwuZHJhd24gJiYgc2VyaWVzTW9kZWwubGF5b3V0SW5zdGFuY2Uub25kcmF3KSB7CiAgICAgICAgICAgICAgICAgIGUuZGV0YWlsLmRyYXduLmd4ICs9IGdyaWRSZWN0LnggLyBncmlkU2l6ZTsKICAgICAgICAgICAgICAgICAgZS5kZXRhaWwuZHJhd24uZ3kgKz0gZ3JpZFJlY3QueSAvIGdyaWRTaXplOwogICAgICAgICAgICAgICAgICBzZXJpZXNNb2RlbC5sYXlvdXRJbnN0YW5jZS5vbmRyYXcoaXRlbVswXSwgaXRlbVsxXSwgaXRlbVsyXSwgZS5kZXRhaWwuZHJhd24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3dvcmRjbG91ZGRyYXduJywgb25Xb3JkQ2xvdWREcmF3bik7CgogICAgICAgICAgICAgIGlmIChzZXJpZXNNb2RlbC5sYXlvdXRJbnN0YW5jZSkgewogICAgICAgICAgICAgICAgLy8gRGlzcG9zZSBwcmV2aW91cwogICAgICAgICAgICAgICAgc2VyaWVzTW9kZWwubGF5b3V0SW5zdGFuY2UuZGlzcG9zZSgpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgc2VyaWVzTW9kZWwubGF5b3V0SW5zdGFuY2UgPSB7CiAgICAgICAgICAgICAgICBvbmRyYXc6IG51bGwsCiAgICAgICAgICAgICAgICBkaXNwb3NlOiBmdW5jdGlvbiBkaXNwb3NlKCkgewogICAgICAgICAgICAgICAgICBjYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignd29yZGNsb3VkZHJhd24nLCBvbldvcmRDbG91ZERyYXduKTsgLy8gQWJvcnQKCiAgICAgICAgICAgICAgICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3b3JkY2xvdWRkcmF3bicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCBkZWZhdWx0IHRvIGNhbmNsZSB0aGUgZXZlbnQgYW5kIHN0b3AgdGhlIGxvb3AKICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgICBleHRlcm5hbF9lY2hhcnRzXy5yZWdpc3RlclByZXByb2Nlc3NvcihmdW5jdGlvbiAob3B0aW9uKSB7CiAgICAgICAgICAgIHZhciBzZXJpZXMgPSAob3B0aW9uIHx8IHt9KS5zZXJpZXM7CiAgICAgICAgICAgICFleHRlcm5hbF9lY2hhcnRzXy51dGlsLmlzQXJyYXkoc2VyaWVzKSAmJiAoc2VyaWVzID0gc2VyaWVzID8gW3Nlcmllc10gOiBbXSk7CiAgICAgICAgICAgIHZhciBjb21wYXRzID0gWydzaGFkb3dDb2xvcicsICdzaGFkb3dCbHVyJywgJ3NoYWRvd09mZnNldFgnLCAnc2hhZG93T2Zmc2V0WSddOwogICAgICAgICAgICBleHRlcm5hbF9lY2hhcnRzXy51dGlsLmVhY2goc2VyaWVzLCBmdW5jdGlvbiAoc2VyaWVzSXRlbSkgewogICAgICAgICAgICAgIGlmIChzZXJpZXNJdGVtICYmIHNlcmllc0l0ZW0udHlwZSA9PT0gJ3dvcmRDbG91ZCcpIHsKICAgICAgICAgICAgICAgIHZhciB0ZXh0U3R5bGUgPSBzZXJpZXNJdGVtLnRleHRTdHlsZSB8fCB7fTsKICAgICAgICAgICAgICAgIGNvbXBhdFRleHRTdHlsZSh0ZXh0U3R5bGUubm9ybWFsKTsKICAgICAgICAgICAgICAgIGNvbXBhdFRleHRTdHlsZSh0ZXh0U3R5bGUuZW1waGFzaXMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBmdW5jdGlvbiBjb21wYXRUZXh0U3R5bGUodGV4dFN0eWxlKSB7CiAgICAgICAgICAgICAgdGV4dFN0eWxlICYmIGV4dGVybmFsX2VjaGFydHNfLnV0aWwuZWFjaChjb21wYXRzLCBmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICAgICAgICBpZiAodGV4dFN0eWxlLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgdGV4dFN0eWxlWyd0ZXh0JyArIGV4dGVybmFsX2VjaGFydHNfLmZvcm1hdC5jYXBpdGFsRmlyc3Qoa2V5KV0gPSB0ZXh0U3R5bGVba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7IC8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vaW5kZXguanMKCiAgICAgICAgICAvKioqLwogICAgICAgIH0sCgogICAgICAgIC8qKiovCiAgICAgICAgImVjaGFydHMvbGliL2VjaGFydHMiOgogICAgICAgIC8qISoqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgICAgICAgICAhKioqIGV4dGVybmFsICJlY2hhcnRzIiAqKiohCiAgICAgICAgICBcKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAgIC8qKiovCiAgICAgICAgZnVuY3Rpb24gZWNoYXJ0c0xpYkVjaGFydHMobW9kdWxlKSB7CiAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfZWNoYXJ0c19saWJfZWNoYXJ0c19fOwogICAgICAgICAgLyoqKi8KICAgICAgICB9CiAgICAgICAgLyoqKioqKi8KCiAgICAgIH07CiAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAvKioqKioqLwogICAgICAvLyBUaGUgbW9kdWxlIGNhY2hlCgogICAgICAvKioqKioqLwoKICAgICAgdmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9OwogICAgICAvKioqKioqLwoKICAgICAgLyoqKioqKi8KICAgICAgLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KCiAgICAgIC8qKioqKiovCgogICAgICBmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7CiAgICAgICAgLyoqKioqKi8KICAgICAgICAvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGUKCiAgICAgICAgLyoqKioqKi8KICAgICAgICBpZiAoX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSkgewogICAgICAgICAgLyoqKioqKi8KICAgICAgICAgIHJldHVybiBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdLmV4cG9ydHM7CiAgICAgICAgICAvKioqKioqLwogICAgICAgIH0KICAgICAgICAvKioqKioqLwogICAgICAgIC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpCgogICAgICAgIC8qKioqKiovCgoKICAgICAgICB2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHsKICAgICAgICAgIC8qKioqKiovCiAgICAgICAgICAvLyBubyBtb2R1bGUuaWQgbmVlZGVkCgogICAgICAgICAgLyoqKioqKi8KICAgICAgICAgIC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkCgogICAgICAgICAgLyoqKioqKi8KICAgICAgICAgIGV4cG9ydHM6IHt9CiAgICAgICAgICAvKioqKioqLwoKICAgICAgICB9OwogICAgICAgIC8qKioqKiovCgogICAgICAgIC8qKioqKiovCiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uCgogICAgICAgIC8qKioqKiovCgogICAgICAgIF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwogICAgICAgIC8qKioqKiovCgogICAgICAgIC8qKioqKiovCiAgICAgICAgLy8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGUKCiAgICAgICAgLyoqKioqKi8KCgogICAgICAgIHJldHVybiBtb2R1bGUuZXhwb3J0czsKICAgICAgICAvKioqKioqLwogICAgICB9CiAgICAgIC8qKioqKiovCgogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgLyoqKioqKi8KCiAgICAgIC8qIHdlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QgKi8KCiAgICAgIC8qKioqKiovCgoKICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAvKioqKioqLwogICAgICAgIC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHMKCiAgICAgICAgLyoqKioqKi8KICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbiAoZXhwb3J0cykgewogICAgICAgICAgLyoqKioqKi8KICAgICAgICAgIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHsKICAgICAgICAgICAgLyoqKioqKi8KICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgewogICAgICAgICAgICAgIHZhbHVlOiAnTW9kdWxlJwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLyoqKioqKi8KICAgICAgICAgIH0KICAgICAgICAgIC8qKioqKiovCgoKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsKICAgICAgICAgICAgdmFsdWU6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgICAgLyoqKioqKi8KICAgICAgICB9OwogICAgICAgIC8qKioqKiovCgogICAgICB9KSgpOwogICAgICAvKioqKioqLwoKICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICAgIC8qKioqKiovCiAgICAgIC8vIG1vZHVsZSBleHBvcnRzIG11c3QgYmUgcmV0dXJuZWQgZnJvbSBydW50aW1lIHNvIGVudHJ5IGlubGluaW5nIGlzIGRpc2FibGVkCgogICAgICAvKioqKioqLwogICAgICAvLyBzdGFydHVwCgogICAgICAvKioqKioqLwogICAgICAvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHMKCiAgICAgIC8qKioqKiovCgoKICAgICAgcmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4vaW5kZXguanMiKTsKICAgICAgLyoqKioqKi8KICAgIH0oKQogICk7Cn0pOw=="},null]} |