{"remainingRequest":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js??ref--0-0!D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\ljzc-fvue\\src\\components\\eipControl\\EipSubDialog.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\src\\components\\eipControl\\EipSubDialog.vue","mtime":1705040076727},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\babel.config.js","mtime":1701311296006},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF9yZWFkT25seUVycm9yIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2xqemMtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcmVhZE9ubHlFcnJvci5qcyI7CmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSAiRDovamVua2lucy93b3Jrc3BhY2UvbGp6Yy1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheS5qcyI7CmltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2xqemMtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMi5qcyI7CmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9sanpjLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FzeW5jVG9HZW5lcmF0b3IuanMiOwppbXBvcnQgInJlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnB1c2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWUuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zZWFyY2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5lcnJvci5jYXVzZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5jb25zdHJ1Y3Rvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5kb3QtYWxsLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnN0aWNreS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiOwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwoKaW1wb3J0IHsgbWFwU3RhdGUgfSBmcm9tICJ2dWV4IjsKaW1wb3J0IHV0aWxzIGZyb20gIkAvdXRpbHMuanMiOwppbXBvcnQgaG90ZW50VWlVdGlscyBmcm9tICJAL2hvdGVudC11aS11dGlsLmpzIjsKaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gImVsZW1lbnQtdWkiOwppbXBvcnQgcmVxIGZyb20gIkAvcmVxdWVzdC5qcyI7CmltcG9ydCBzdWJfcGlvX21peGluIGZyb20gIkAvc3ViLXBlcm1pc3Npb24tbWl4aW4uanMiOwppbXBvcnQgRWlwVGFnIGZyb20gIkAvY29tcG9uZW50cy9laXBDb250cm9sL0VpcFRhZy52dWUiOwppbXBvcnQgRWlwU2VsZWN0RGlhIGZyb20gIkAvY29tcG9uZW50cy9laXBDb250cm9sL0VpcFNlbGVjdERpYS52dWUiOwpleHBvcnQgZGVmYXVsdCB7CiAgY29tcG9uZW50czogewogICAgRWlwVGFnOiBFaXBUYWcsCiAgICBFaXBTZWxlY3REaWE6IEVpcFNlbGVjdERpYQogIH0sCiAgbmFtZTogImVpcC1kaWFsb2ciLAogIHByb3BzOiBbInZhbGlkYXRlIiwgInZhbHVlIiwgIm5hbWUiLCAicGVybWlzc2lvbiIsICJhdHRlciIsICJzaW5nbGUiLCAic2VsZWN0b3Jjb25maWciLCAiY3VzdGRpYWxvZyIsICJwbGFjZWhvbGRlciIsICJ0b29sdGlwcGxhY2VtZW50IiwgJ2luaXRGaWxsRGF0YScsICdpbml0RmlsbERhdGFUeXBlJywgJ3JlbGF0aW9uJywgJ21heFJvdyddLAogIG1peGluczogW3N1Yl9waW9fbWl4aW5dLAogIC8v5re35YWl5pa55byP5byV5YWl6KGo5Y2V57uE5Lu25Lit5YWs5YWx5bGe5oCn77yM5aSE55CG5a2Q6KGo44CB5a2Z6KGo6KGM5YaF6IGU5Yqo77yI5YiH6Z2i5L+u5pS5cGVybWlzc2lvbl9zdWLvvIkKICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkgewogICAgcmV0dXJuIHsKICAgICAgZGF0YTogewogICAgICAgIHF4ZGQ6IHt9CiAgICAgIH0sCiAgICAgIGlucHV0U3VmZml4V2lkdGg6IDAsCiAgICAgIHBsYWNlaG9sZGVyQm86ICIiLAogICAgICBxdWlja1NlYXJjaDogIiIsCiAgICAgIC8v5aGr5YaZ5o+Q56S6CiAgICAgIGNvbmRpdGlvbkJpbmQ6IFtdLAogICAgICAvL+WPguaVsOafpeivouWtl+autQogICAgICBub2RlS2V5OiAiSURfIiwKICAgICAgLy/moJHlvaLmlbDmja7niLZJZAogICAgICBjdXN0b21EaWFsb2dTaG93TGlzdDogZmFsc2UsCiAgICAgIGN1c3RvbURpYWxvZ1Nob3dUcmVlOiBmYWxzZSwKICAgICAgc2VsZWN0T3JnUHJvcHM6IHsKICAgICAgICBsYWJlbDogIm5hbWUiCiAgICAgIH0sCiAgICAgIHN0eWxlOiAiIiwKICAgICAgLy/lr7nor53moYblrr3pq5gKICAgICAgc2VsZWN0T3JnczogbnVsbCwKICAgICAgaW5wdXRTdWZmaXhIZWlnaHQ6IDMzLAogICAgICBjb25maWc6IG51bGwsCiAgICAgIHVwZGF0aW5nOiBmYWxzZSwKICAgICAgZGlzcGxheWZpZWxkOiBbXSwKICAgICAgLy/mmL7npLrlrZfmrrUKICAgICAgY3VzdG9tRGlhbG9nOiB7fSwKICAgICAgcXVlcnlQYXJhbTogIiIsCiAgICAgIC8v5p+l6K+i5p2h5Lu26L6T5YWl55qE5YC8CiAgICAgIHByb3BzMTogW10sCiAgICAgIHNob3dEYXRhOiBbXSwKICAgICAgY2hlY2tCb3hEYXRhQWxsOiBbXSwKICAgICAgLy/pgInkuK3lr7nosaHnmoTpm4blkIgKICAgICAgZGVmYXVsdFByb3BzOiB7CiAgICAgICAgY2hpbGRyZW46ICJjaGlsZHJlbiIsCiAgICAgICAgbGFiZWw6ICJsYWJlbCIKICAgICAgfSwKICAgICAgcHJvcHNEYXRhOiBbXSwKICAgICAgcXVlcnlzU2hvdzogZmFsc2UsCiAgICAgIC8v5piv5ZCm5pi+56S65pCc57Si5qGGCiAgICAgIHVuZGVmaW5lZGE6ICIiLAogICAgICBpc0N1cnJlbnRDaGFuZ2U6IGZhbHNlLAogICAgICAvL+aYr+WQpuS4jeaJp+ihjCBvcmdUYWJsZVNlbGVjdGlvbuaWueazlQogICAgICBwYWdpbmF0aW9uOiB7CiAgICAgICAgcGFnZTogMSwKICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgdG90YWw6IDAKICAgICAgfSwKICAgICAgcGFyYW06IFtdLAogICAgICAvL+e7keWumueahOihqOWNleWtl+autQogICAgICB0cmVlTGlzdDogW10sCiAgICAgIGRpc3BsYXlGaWVsZDoge30sCiAgICAgIHF1ZXJ5UGFyYW1zOiBbXSwKICAgICAgcGxhY2Vob2xkZXJzOiBbXSwKICAgICAgb2xkc2VsZWN0T3JnczogW10sCiAgICAgIGNvbWJpbmF0aW9uVHJlZURhdGE6IFtdLAogICAgICBjb21iaVRyZWVEaXNwbGF5RmllbGQ6IFtdLAogICAgICBjb21iaW5hdGlvblRyZWVRdWVyeXM6IFtdLAogICAgICBjb21iaW5hdGlvblJ1bGU6IHt9LAogICAgICB0b2dnbGVCdG46ICJlbC1pY29uLWFycm93LWxlZnQiLAogICAgICB0cmVlU2hvdzogdHJ1ZSwKICAgICAgdHJhbnN0aW9uV2lkdGg6ICIyNSUiLAogICAgICBsZWZ0VHJlZVRpdGxlOiAiIiwKICAgICAgd3JpdGVhYmxlOiB0cnVlLAogICAgICBpc1Nob3c6IHRydWUKICAgIH07CiAgfSwKICB3YXRjaDogewogICAgcHJvcHMxOiBmdW5jdGlvbiBwcm9wczEobmV3VmFsLCBvbGRWYWwpIHsKICAgICAgLy/moJHlvaIKICAgICAgaWYgKHRoaXMuc2hvd0RhdGEgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgewogICAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgICAgdmFyIGRhdGEgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2hvd0RhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGRhdGEucHVzaCh0aGlzLnNob3dEYXRhW2ldKTsKICAgICAgICB9CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZGF0YS5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5zZXRDaGVja2VkKGRhdGFbX2ldLCB0cnVlKTsKICAgICAgICAgICAgdGhpc18uY2hlY2tOb2RlKGRhdGFbX2ldLCB0aGlzXyk7CiAgICAgICAgICB9CiAgICAgICAgfSwgMjAwKTsKICAgICAgfQogICAgfQogIH0sCiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHsKICAgIHZhciByZXF1ZXN0VHlwZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCc/JylbMF0uc3BsaXQoJy8nKTsKICAgIHZhciBpc0RvbmVMaXN0ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJy8nKTsKICAgIGlmIChyZXF1ZXN0VHlwZVtyZXF1ZXN0VHlwZS5sZW5ndGggLSAxXSA9PSAnZ2V0JyB8fCByZXF1ZXN0VHlwZVtyZXF1ZXN0VHlwZS5sZW5ndGggLSAyXSA9PSAnZ2V0JyB8fCBpc0RvbmVMaXN0W2lzRG9uZUxpc3QubGVuZ3RoIC0gMV0gPT0gJ2RvbmVMaXN0JykgewogICAgICB0aGlzLmlzU2hvdyA9IGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgaWYgKHRoaXMuaW5pdEZpbGxEYXRhID09ICd0cnVlJykgewogICAgICAgIHRoaXMuaW5pdFRlbXBsYXRlRGF0YSgpOwogICAgICB9CiAgICB9CiAgfSwKICBjb21wdXRlZDogbWFwU3RhdGUoewogICAgdG90YWw6IGZ1bmN0aW9uIHRvdGFsKHN0YXRlKSB7CiAgICAgIHJldHVybiBzdGF0ZS5kaWFsb2cudG90YWw7CiAgICB9LAogICAgZGlhbG9nRGF0YTogZnVuY3Rpb24gZGlhbG9nRGF0YShzdGF0ZSkgewogICAgICByZXR1cm4gc3RhdGUuZGlhbG9nLnJvd3M7CiAgICB9LAogICAgaW5wdXRWYWw6IGZ1bmN0aW9uIGlucHV0VmFsKCkgewogICAgICBpZiAoIXRoaXMudmFsdWUgfHwgdGhpcy52YWx1ZSA9PSAifHxbXSIpIHsKICAgICAgICB0aGlzLmNoZWNrQm94RGF0YUFsbCA9IFtdOwogICAgICAgIC8vIHRoaXMuc2hvd0RhdGEgPSBbXTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgbmFtZUFyeSA9IHRoaXMudmFsdWUuc3BsaXQoIiwiKTsKICAgICAgICBpZiAodGhpcy52YWx1ZS5pbmRleE9mKCJ8fCIpID4gMCkgewogICAgICAgICAgbmFtZUFyeSA9IHRoaXMudmFsdWUuc3BsaXQoInx8IilbMF0uc3BsaXQoIiwiKTsKICAgICAgICAgIC8vIHRoaXMuc2hvd0RhdGE9SlNPTi5wYXJzZSh0aGlzLnZhbHVlLnNwbGl0KCJ8fCIpWzFdKTsKICAgICAgICB9CiAgICAgICAgLy8gIHRoaXMuc2hvd0RhdGEgPXRoaXMuc2VsZWN0T3JnczsKICAgICAgICB2YXIgaWRBcnkgPSBudWxsOwogICAgICAgIHZhciBhY2NvdW50QXJ5ID0gbnVsbDsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgbmFtZUFyeS5mb3JFYWNoKGZ1bmN0aW9uIChtLCBpKSB7CiAgICAgICAgICB2YXIgbiA9IHsKICAgICAgICAgICAgdmFsdWU6IG0KICAgICAgICAgIH07CiAgICAgICAgICByZXN1bHQucHVzaChuKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9LAogICAgaW5wdXRXcml0ZWFibGU6IGZ1bmN0aW9uIGlucHV0V3JpdGVhYmxlKCkgewogICAgICByZXR1cm4gdGhpcy53cml0ZWFibGUgPyB1dGlscy5nZXRXcml0ZWFibGUodGhpcy5wZXJtaXNzaW9uX3N1YikgOiB0aGlzLndyaXRlYWJsZTsKICAgIH0sCiAgICBpbnB1dFZhbGlkYXRlOiBmdW5jdGlvbiBpbnB1dFZhbGlkYXRlKCkgewogICAgICB2YXIgdmFsaWRhdGVPYmogPSB0aGlzLiRzdG9yZS5zdGF0ZS5pbmRleC52YWxpZGF0ZTsKICAgICAgcmV0dXJuIHV0aWxzLmFkZFJlcXVpcmVkT3JOb3QodGhpcy5wZXJtaXNzaW9uX3N1YiwgdGhpcy52YWxpZGF0ZSwgdmFsaWRhdGVPYmosIHRoaXMpOwogICAgfSwKICAgIGlucHV0TmFtZTogZnVuY3Rpb24gaW5wdXROYW1lKCkgewogICAgICB2YXIgbGFiZWxkZXNjID0gIiI7CiAgICAgIGlmICh0aGlzLiRzbG90cyAmJiB0aGlzLiRzbG90cy5sYWJlbGRlc2MgJiYgdGhpcy4kc2xvdHMubGFiZWxkZXNjWzBdLmNoaWxkcmVuICYmIHRoaXMuJHNsb3RzLmxhYmVsZGVzY1swXS5jaGlsZHJlblswXS50ZXh0KSB7CiAgICAgICAgbGFiZWxkZXNjID0gdGhpcy4kc2xvdHMubGFiZWxkZXNjWzBdLmNoaWxkcmVuWzBdLnRleHQ7CiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSA/IHRoaXMubmFtZSA6IHV0aWxzLmdldE5hbWUoKSArICItIiArIGxhYmVsZGVzYzsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpcy5uYW1lID8gdGhpcy5uYW1lIDogdXRpbHMuZ2V0TmFtZSgpOwogICAgICB9CiAgICB9LAogICAgLy8g5piv5ZCm5pyJ5Zue5aGr6K6+572uCiAgICBiaW5kU2V0OiBmdW5jdGlvbiBiaW5kU2V0KCkgewogICAgICByZXR1cm4gdGhpcy5zZWxlY3RvcmNvbmZpZyA/IHRoaXMuc2VsZWN0b3Jjb25maWcuYmluZCA6IG51bGw7CiAgICB9CiAgfSksCiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHsKICAgIGlmICghdGhpcy5wbGFjZWhvbGRlcikgewogICAgICB0aGlzLnBsYWNlaG9sZGVyQm8gPSAi6K+36YCJ5oup5YaF5a65IjsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMucGxhY2Vob2xkZXJCbyA9IHRoaXMucGxhY2Vob2xkZXI7CiAgICB9CiAgICB0aGlzLiR2YWxpZGF0b3IgPSB0aGlzLiRyb290LiR2YWxpZGF0b3I7CiAgfSwKICBtZXRob2RzOiB7CiAgICBzZWxlY3RBbGw6IGZ1bmN0aW9uIHNlbGVjdEFsbChzZWxlY3Rpb24pIHsKICAgICAgaWYgKHRoaXMub2xkc2VsZWN0T3JncyAhPSBudWxsICYmIHNlbGVjdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBzZWxlY3Rpb24ubGVuZ3RoOyB4KyspIHsKICAgICAgICAgIGlmICh0aGlzLmluZGV4QXJyYXkodGhpcy5vbGRzZWxlY3RPcmdzLCBzZWxlY3Rpb25beF0pID09PSAtMSkgewogICAgICAgICAgICB0aGlzLm9sZHNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25beF0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBfLmNsb25lRGVlcCh0aGlzLm9sZHNlbGVjdE9yZ3MpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IF8uY2xvbmVEZWVwKHNlbGVjdGlvbik7CiAgICAgIH0KICAgIH0sCiAgICBjaGVja05vZGU6IGZ1bmN0aW9uIGNoZWNrTm9kZShkYXRhLCB0aGlzXywgcG5vZGUpIHsKICAgICAgaWYgKGRhdGEuUGlkKSB7CiAgICAgICAgdmFyIG5vZGUgPSB0aGlzXy4kcmVmcy50cmVlLmdldE5vZGUoZGF0YS5QaWQpOwogICAgICAgIG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWU7CiAgICAgICAgaWYgKG5vZGUuZGF0YS5QaWQpIHsKICAgICAgICAgIHRoaXNfLiRyZWZzLnRyZWUuZ2V0Tm9kZShub2RlLmRhdGEuUGlkKS5pbmRldGVybWluYXRlID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuY2hlY2tOb2RlKHRoaXNfLiRyZWZzLnRyZWUuZ2V0Tm9kZShub2RlLmRhdGEuUGlkKS5kYXRhLCB0aGlzXywgdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFub2RlLmluZGV0ZXJtaW5hdGUpIHsKICAgICAgICAgIG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHBub2RlICYmICFwbm9kZS5pbmRldGVybWluYXRlKSB7CiAgICAgICAgcG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWU7CiAgICAgIH0KICAgIH0sCiAgICAvL+Wbnui9puafpeivogogICAgc2VhcmNoRW50ZXJGdW46IGZ1bmN0aW9uIHNlYXJjaEVudGVyRnVuKGUpIHsKICAgICAgdmFyIGtleUNvZGUgPSB3aW5kb3cuZXZlbnQgPyBlLmtleUNvZGUgOiBlLndoaWNoOwogICAgICBpZiAoa2V5Q29kZSA9PSAxMykgewogICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgIH0KICAgIH0sCiAgICBoYW5kbGVTaXplQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVTaXplQ2hhbmdlKHNpemUpIHsKICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAvL+avj+mhteS4i+aLieaYvuekuuaVsOaNrgogICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUgPSBzaXplOwogICAgICB0aGlzLnNlYXJjaCgpOwogICAgfSwKICAgIGhhbmRsZUN1cnJlbnRDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZUN1cnJlbnRDaGFuZ2UoY3VycmVudFBhZ2UpIHsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgaWYgKHRoaXMuc2VsZWN0T3JncyAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLnNlbGVjdE9yZ3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7CiAgICAgICAgICB2YXIgcmVzID0gdGhpc18uaW5kZXhBcnJheSh0aGlzXy5jaGVja0JveERhdGFBbGwsIHJvdyk7CiAgICAgICAgICBpZiAocmVzID09IC0xKSB7CiAgICAgICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5wdXNoKHJvdyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAvL+eCueWHu+esrOWHoOmhtQogICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSA9IGN1cnJlbnRQYWdlOwogICAgICB0aGlzLnNlYXJjaCgpOwogICAgfSwKICAgIGNoZWNrTGlzdDogZnVuY3Rpb24gY2hlY2tMaXN0KCkgewogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAvL+WIl+ihqAogICAgICAgIGlmICh0aGlzXy5jaGVja0JveERhdGFBbGwgIT0gdW5kZWZpbmVkICYmIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5sZW5ndGggPiAwKSB7CiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7CiAgICAgICAgICAgIHZhciByZXMgPSB0aGlzXy5pbmRleEFycmF5KHRoaXNfLmRpYWxvZ0RhdGEsIHJvdyk7CiAgICAgICAgICAgIHRoaXNfLnVuZGVmaW5lZGEgPSByZXM7CiAgICAgICAgICAgIGlmIChyZXMgIT0gLTEpIHsKICAgICAgICAgICAgICB0aGlzXy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgICAgIHRoaXNfLnRvZ2dsZVJvd1NlbGVjdGlvbihyZXMsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sIDMwMCk7CiAgICB9LAogICAgdG9nZ2xlUm93U2VsZWN0aW9uOiBmdW5jdGlvbiB0b2dnbGVSb3dTZWxlY3Rpb24ocmVzLCB2YWwpIHsKICAgICAgdGhpcy4kcmVmcy5vcmdUYWJsZS50b2dnbGVSb3dTZWxlY3Rpb24odGhpcy5kaWFsb2dEYXRhW3Jlc10sIHZhbCk7CiAgICB9LAogICAgc2hvd0RpYWxvZzogZnVuY3Rpb24gc2hvd0RpYWxvZyhpdGVtKSB7CiAgICAgIHZhciBfdGhpczIgPSB0aGlzOwogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICAvL+esrOS6jOasoeeCueWHu+WtkOihqOWbnuWhq+WvueivneahhiDnrKzkuIDmrKHpgInkuK3nmoTmlbDmja7kuI3mmK/pgInkuK3nirbmgIEKICAgICAgaWYgKHRoaXNfLnNlbGVjdE9yZ3MpIHsKICAgICAgICB0aGlzXy5zZWxlY3RPcmdzLmVtcHR5KCk7CiAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLmVtcHR5KCk7CiAgICAgIH0KICAgICAgdmFyIGFsaWFzID0gdGhpcy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cuYWxpYXM7CiAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdmb3JtL2dldEJ5QWxpYXMnLCBhbGlhcykudGhlbihmdW5jdGlvbiAoY3VzdG9tRGlhbG9nKSB7CiAgICAgICAgaWYgKCFjdXN0b21EaWFsb2cgfHwgIWN1c3RvbURpYWxvZy5hbGlhcykgewogICAgICAgICAgTWVzc2FnZS5lcnJvcign5a+56K+d5qGG5Yir5ZCN44CQJyArIGFsaWFzICsgJ+OAkeS4jeWtmOWcqO+8gScpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoY3VzdG9tRGlhbG9nLnN0eWxlID09IDEpIHsKICAgICAgICAgIHZhciBkaXNwbGF5bGlzdCA9IEpTT04ucGFyc2UoY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCk7CiAgICAgICAgICB0aGlzXy5ub2RlS2V5ID0gZGlzcGxheWxpc3QuaWQ7CiAgICAgICAgfQogICAgICAgIC8v5a+56K+d5qGG5oyJ6KGo5Y2V5a2X5q615p+l6K+i77yI5Y+C5pWw5Lyg5YWl55qE77yJCiAgICAgICAgdmFyIGJpbmRMaXN0ID0gdGhpc18uY3VzdGRpYWxvZy5jdXN0RGlhbG9nLmNvbmRpdGlvbnM7CiAgICAgICAgdGhpc18ucGFyYW0gPSBbXTsgLy/nu5HlrprnmoTooajljZXlrZfmrrUKICAgICAgICBpZiAoYmluZExpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgYmluZExpc3QuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7CiAgICAgICAgICAgIC8v57uR5a6a6KGo5Y2V5a2X5q61CiAgICAgICAgICAgIGlmIChlbGUuZGVmYXVsdFR5cGUgPT0gJzMnICYmIGVsZS5iaW5kKSB7CiAgICAgICAgICAgICAgdmFyIG9iaiA9IHt9OwogICAgICAgICAgICAgIG9iai5maWVsZCA9IGVsZS5maWVsZDsKICAgICAgICAgICAgICBvYmouYmluZCA9IGVsZS5iaW5kOwogICAgICAgICAgICAgIHRoaXNfLnBhcmFtLnB1c2gob2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8v5Yik5pat5a+56K+d5qGG5p+l6K+i5piv5ZCm5pyJ5p2h5Lu2CiAgICAgICAgdmFyIHVzZXJJbnB1dExpc3QgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCk7CiAgICAgICAgdGhpc18ucXVpY2tTZWFyY2ggPSAnJzsgLy/loavlhpnmj5DnpLogcGxhY2Vob2xkZXIKICAgICAgICB0aGlzXy5jb25kaXRpb25CaW5kID0gW107CiAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gW107CiAgICAgICAgdmFyIHBsYWNlaG9sZGVycyA9IFtdOwogICAgICAgIGlmICh1c2VySW5wdXRMaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIHVzZXJJbnB1dExpc3QuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7CiAgICAgICAgICAgIHZhciBvYmogPSB7fTsKICAgICAgICAgICAgLy/mnaHku7bmn6Xor6Llj4LmlbDvvIjnlKjmiLfovpPlhaXnmoTvvIkg5paH5pys5qGG6L6T5YWlCiAgICAgICAgICAgIGlmIChlbGUuZGVmYXVsdFR5cGUgPT0gJzEnKSB7CiAgICAgICAgICAgICAgb2JqW2VsZS5maWVsZF0gPSAnJzsKICAgICAgICAgICAgICBxdWVyeVBhcmFtcy5wdXNoKG9iaik7CiAgICAgICAgICAgICAgdGhpc18uY29uZGl0aW9uQmluZC5wdXNoKGVsZSk7CiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJzLnB1c2goJ+ivt+i+k+WFpScgKyBlbGUuY29tbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgX3RoaXMyLiRzZXQoX3RoaXMyLCAncXVlcnlQYXJhbXMnLCBxdWVyeVBhcmFtcyk7CiAgICAgICAgICBfdGhpczIuJHNldChfdGhpczIsICdwbGFjZWhvbGRlcnMnLCBwbGFjZWhvbGRlcnMpOwogICAgICAgIH0KICAgICAgICAvL+WIpOaWreaYr+WQpuaYvuekuuadoeS7tuafpeivoui+k+WFpeahhgogICAgICAgIGlmICh0aGlzXy5xdWlja1NlYXJjaCAhPSAnJykgewogICAgICAgICAgdGhpc18ucXVlcnlzU2hvdyA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXNfLnF1ZXJ5c1Nob3cgPSB0cnVlOwogICAgICAgIH0KICAgICAgICB0aGlzXy5xdWlja1NlYXJjaCA9ICfor7fovpPlhaUnICsgX3RoaXMyLnF1aWNrU2VhcmNoICsgJ+afpeivoic7CiAgICAgICAgdGhpc18uc3R5bGUgPSAnaGVpZ2h0OicgKyBjdXN0b21EaWFsb2cuaGVpZ2h0ICsgJ3B4JzsKICAgICAgICBpZiAod2luZG93LnNjcmVlbi5oZWlnaHQgJiYgd2luZG93LnNjcmVlbi5oZWlnaHQgPD0gOTAwKSB7CiAgICAgICAgICBfdGhpczIuc3R5bGUgPSAnaGVpZ2h0OjQ0MHB4JzsKICAgICAgICB9CiAgICAgICAgaWYgKGN1c3RvbURpYWxvZy5zdHlsZSA9PSAwIHx8IGN1c3RvbURpYWxvZy5zdHlsZSA9PSAyKSB7CiAgICAgICAgICAvL+WIl+ihqAogICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nU2hvdyh7CiAgICAgICAgICAgIGFsaWFzOiBhbGlhcywKICAgICAgICAgICAgY3VzdG9tRGlhbG9nOiBjdXN0b21EaWFsb2cKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAoY3VzdG9tRGlhbG9nLnN0eWxlID09IDEpIHsKICAgICAgICAgIC8v5qCR5b2iCiAgICAgICAgICB0aGlzXy5wYWdlUGFyYW0gPSB7CiAgICAgICAgICAgIGFsaWFzOiBhbGlhcywKICAgICAgICAgICAgY3VzdG9tRGlhbG9nOiBjdXN0b21EaWFsb2cKICAgICAgICAgIH07CiAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2cgPSBjdXN0b21EaWFsb2c7CiAgICAgICAgICB2YXIgcGFyYW0gPSB7fTsKICAgICAgICAgIHRoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZSA9IFtdOwogICAgICAgICAgLy/liKTmlq3mmK/lkKblrZjlnKjmnaHku7YKICAgICAgICAgIGlmIChjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpIHsKICAgICAgICAgICAgdGhpc18uY29uZGl0aW9uZmllbGRUcmVlID0gSlNPTi5wYXJzZShjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpOwogICAgICAgICAgICBpZiAodGhpc18uY29uZGl0aW9uZmllbGRUcmVlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpc18uY29uZGl0aW9uZmllbGRUcmVlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgICAvL+WIpOaWreadoeS7tuWtl+auteaYr+WQpuaYr+WKqOaAgeS8oOWFpe+8iGRlZmF1bHRUeXBl77yaNO+8muWKqOaAgeS8oOWFpe+8jDLvvJrlm7rlrprlgLwg77yJCiAgICAgICAgICAgICAgICBpZiAodGhpc18uY29uZGl0aW9uZmllbGRUcmVlW2ldLmRlZmF1bHRUeXBlID09ICI0IikgewogICAgICAgICAgICAgICAgICBwYXJhbVt0aGlzXy5jb25kaXRpb25maWVsZFRyZWVbaV0uZmllbGRdID0gdGhpc18uY29uZGl0aW9uZmllbGRUcmVlW2ldLmNvbW1lbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICAvL+acieWKqOaAgeS8oOWFpeeahOWtl+autQogICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHBhcmFtKSAhPSAie30iKSB7CiAgICAgICAgICAgIHRoaXNfLmRpYWxvZ1Zpc2libGUgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy/ml6DliqjmgIHkvKDlhaXnmoTlrZfmrrUKICAgICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nVHJlZVNob3codGhpc18ucGFnZVBhcmFtKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfSwKICAgIC8v5Yik5pat5pWw5o2u5piv5ZCm5YyF5ZCr5p+Q5Liq5a+56LGh77yM5bm26L+U5Zue5pWw5o2u5YyF5ZCr5a+56LGh55qE5LiL5qCHCiAgICBpbmRleEFycmF5OiBmdW5jdGlvbiBpbmRleEFycmF5KGFycmF5LCBpdGVtKSB7CiAgICAgIGlmIChhcnJheS5sZW5ndGggPT0gMCkgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGFycmF5W2ldKSA9PSBKU09OLnN0cmluZ2lmeShpdGVtKSkgewogICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0sCiAgICAvL+eCueWHu+WIl+ihqOafkOS4gOS4quWkjemAieahhuaXtuinpuWPkQogICAgb25UYWJsZVNlbGVjdDogZnVuY3Rpb24gb25UYWJsZVNlbGVjdChyb3dzLCByb3cpIHsKICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSBmYWxzZTsKICAgICAgLy/liKTmlq3ngrnlh7vliJfooajmlbDmja7ml7blpI3pgInmoYbmmK/lkKbli77pgIkgIHNlbGVjdGVk77yadHJ1ZeS4jeWLvumAie+8jGZhbHNl5Yu+6YCJCiAgICAgIHZhciBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0T3JncyAmJiB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID4gMCAmJiB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpICE9PSAtMTsKICAgICAgaWYgKHNlbGVjdGVkKSB7CiAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAgIHZhciByZXMgPSB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpOwogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKTsKICAgICAgfQogICAgfSwKICAgIC8v54K55Ye75YiX6KGo5p+Q5LiA5p2h5pWw5o2u5pe26Kem5Y+RCiAgICBvcmdSb3dDbGljazogZnVuY3Rpb24gb3JnUm93Q2xpY2socm93LCBjb2x1bW4sIGV2ZW50KSB7CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0pLnRyaWdnZXIoImNsaWNrIik7CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW107CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2gocm93KTsKICAgICAgfSBlbHNlIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gIT0gMSkgewogICAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gZmFsc2U7CiAgICAgICAgLy/liKTmlq3ngrnlh7vliJfooajmlbDmja7ml7blpI3pgInmoYbmmK/lkKbli77pgIkgIHNlbGVjdGVk77yadHJ1ZeS4jeWLvumAie+8jGZhbHNl5Yu+6YCJCiAgICAgICAgdmFyIHNlbGVjdGVkID0gdGhpcy5zZWxlY3RPcmdzICYmIHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPiAwICYmIHRoaXMuaW5kZXhBcnJheSh0aGlzLnNlbGVjdE9yZ3MsIHJvdykgIT09IC0xOwogICAgICAgIGlmIChzZWxlY3RlZCkgewogICAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgdmFyIHJlcyA9IHRoaXMuaW5kZXhBcnJheSh0aGlzLnNlbGVjdE9yZ3MsIHJvdyk7CiAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKHJlcywgMSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuJHJlZnMub3JnVGFibGUudG9nZ2xlUm93U2VsZWN0aW9uKHJvdyk7CiAgICAgIH0KICAgIH0sCiAgICAvL+WIl+ihqOWkjemAieahhuacieaUueWPmOaXtuinpuWPkQogICAgb3JnVGFibGVTZWxlY3Rpb246IGZ1bmN0aW9uIG9yZ1RhYmxlU2VsZWN0aW9uKHNlbGVjdGlvbikgewogICAgICAvL+WFqOmAieeahOaDheWGteeJueauiuWkhOeQhijkuLrkuobkuI7ljp/mnKzlip/og73pgLvovpHkuI3lhrLnqoEs5YWI5aSN5Yi25LiA5Lu95pen55qE6YCJ5Lit5pWw5o2uLueEtuWQjuaLv+WIsOWFqOmAieS6i+S7tuS4reWOu+iuoeeulykKICAgICAgdGhpcy5vbGRzZWxlY3RPcmdzID0gXy5jbG9uZURlZXAodGhpcy5zZWxlY3RPcmdzKTsKICAgICAgLy/lpJrpgIkKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSAhPSAxICYmICF0aGlzLmlzQ3VycmVudENoYW5nZSkgewogICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoID09IDEgJiYgKCF0aGlzLnNlbGVjdE9yZ3MgfHwgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA9PSAwKSkgewogICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBzZWxlY3Rpb247CiAgICAgICAgICB9IGVsc2UgaWYgKCghdGhpcy5zZWxlY3RPcmdzIHx8IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPT0gMCkgJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdE9yZ3MpIHsKICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gc2VsZWN0aW9uLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2goc2VsZWN0aW9uW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ3VycmVudENoYW5nZSAmJiBzZWxlY3Rpb24ubGVuZ3RoID49IDEwKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RPcmdzKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW107CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgdSA9IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggLSAxOyB1ID49IDA7IHUtLSkgewogICAgICAgICAgICAgICAgdmFyIHJlcyA9IHRoaXMuaW5kZXhBcnJheShzZWxlY3Rpb24sIHRoaXMuc2VsZWN0T3Jnc1t1XSk7CiAgICAgICAgICAgICAgICBpZiAocmVzICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgc2VsZWN0aW9uLmxlbmd0aDsgX2kyKyspIHsKICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25bX2kyXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAodmFyIF9pMyA9IHNlbGVjdGlvbi5sZW5ndGggLSAxOyBfaTMgPj0gMDsgX2kzLS0pIHsKICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25bX2kzXSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBkaWFsb2dDb25maXJtOiBmdW5jdGlvbiBkaWFsb2dDb25maXJtKCkgewogICAgICBpZiAoIXRoaXMuc2VsZWN0T3JncyB8fCB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID09IDApIHsKICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCLor7fpgInmi6nmlbDmja7lm57loasiKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5xdWVyeVBhcmFtID0gIiI7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSBmYWxzZTsKICAgICAgdGhpcy5jYWxhY0lucHV0U3VmZml4SGVpZ2h0KCk7CiAgICAgIHRoaXMuc3luY0lucHV0VmFsdWUoKTsKICAgIH0sCiAgICAvL+mHjee9rgogICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KCkgewogICAgICB2YXIgX3RoaXMzID0gdGhpczsKICAgICAgdGhpcy5xdWVyeVBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbU9iaikgewogICAgICAgIGZvciAodmFyIGtleSBpbiBwYXJhbU9iaikgewogICAgICAgICAgX3RoaXMzLnF1ZXJ5UGFyYW1zW2tleV0gPSAiIjsKICAgICAgICB9CiAgICAgIH0pOwogICAgICAvL+e7hOWQiOagkemHjee9rgogICAgICBpZiAodGhpcy4kcmVmcy5jb21iaW5hdGlvblRyZWUpIHsKICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLiRyZWZzLmNvbWJpbmF0aW9uVHJlZS5zdG9yZS5ub2Rlc01hcDsKICAgICAgICBmb3IgKHZhciBrZXkgaW4gbm9kZXMpIHsKICAgICAgICAgIG5vZGVzW2tleV0uZXhwYW5kZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMuc3BsaWNlKDApOwogICAgICB0aGlzLnNlYXJjaCh0cnVlKTsKICAgIH0sCiAgICAvL+afpeivogogICAgc2VhcmNoOiBmdW5jdGlvbiBzZWFyY2gocmVzZXRQYWdpbnRpb24pIHsKICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CiAgICAgIHZhciBxdWVyeXMgPSBbXTsgLy/mn6Xor6LmnaHku7YKICAgICAgdmFyIHF1ZXJ5RmlsdGVyID0ge307CiAgICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLnBhZ2luYXRpb24pID09ICJ7fSIpIHsKICAgICAgICB0aGlzLnBhZ2luYXRpb24gPSB7CiAgICAgICAgICBwYWdlOiAxLAogICAgICAgICAgcGFnZVNpemU6IDIwLAogICAgICAgICAgc2hvd1RvdGFsOiAidHJ1ZSIKICAgICAgICB9OwogICAgICB9CiAgICAgIHZhciBwYWdlQmVhbiA9IHsKICAgICAgICBwYWdlQmVhbjogdGhpcy5wYWdpbmF0aW9uCiAgICAgIH07CiAgICAgIGlmIChyZXNldFBhZ2ludGlvbikgewogICAgICAgIHBhZ2VCZWFuLnBhZ2VCZWFuID0gewogICAgICAgICAgcGFnZTogMSwKICAgICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICAgIHNob3dUb3RhbDogInRydWUiCiAgICAgICAgfTsKICAgICAgfQogICAgICAvL+eUqOaIt+i+k+WFpeeahAogICAgICBpZiAodGhpcy5xdWVyeVBhcmFtcy5sZW5ndGggIT0gMCAmJiB0aGlzLnF1ZXJ5UGFyYW1zWzBdICE9ICIiKSB7CiAgICAgICAgdGhpcy5jb25kaXRpb25CaW5kLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7CiAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgIHByb3BlcnR5OiBpdGVtLmZpZWxkLAogICAgICAgICAgICB2YWx1ZTogX3RoaXM0LnF1ZXJ5UGFyYW1zW2l0ZW0uZmllbGRdLAogICAgICAgICAgICBncm91cDogIm1haW4iLAogICAgICAgICAgICBvcGVyYXRpb246ICJMSUtFIiwKICAgICAgICAgICAgcmVsYXRpb246ICJBTkQiCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICAvL+WPguaVsOS8oOWFpeeahOafpeivouaLvOaOpQogICAgICBpZiAodGhpcy5wYXJhbSkgewogICAgICAgIHZhciBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsKICAgICAgICB0aGlzLnBhcmFtLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGQsCiAgICAgICAgICAgIHZhbHVlOiB1dGlscy5nZXRWYWx1ZUJ5UGF0aChwSW5zdCwgaXRlbS5iaW5kKSwKICAgICAgICAgICAgZ3JvdXA6ICJtYWluIiwKICAgICAgICAgICAgb3BlcmF0aW9uOiAiTElLRSIsCiAgICAgICAgICAgIHJlbGF0aW9uOiAiQU5EIgogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLy/mnaXoh6rnu4TlkIjlr7nor53moYbnmoQKICAgICAgaWYgKHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzICYmIHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLmxlbmd0aCAhPSAwKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgcXVlcnlzLnB1c2godGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXNbaV0pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAocXVlcnlzLmxlbmd0aCA+IDApIHsKICAgICAgICBxdWVyeUZpbHRlciA9IHsKICAgICAgICAgIHBhZ2VCZWFuOiBwYWdlQmVhbi5wYWdlQmVhbiwKICAgICAgICAgIHF1ZXJ5czogcXVlcnlzCiAgICAgICAgfTsKICAgICAgICB0aGlzLmN1c3RvbURpYWxvZy5wYWdlQmVhbiA9IHF1ZXJ5RmlsdGVyOwogICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCJkaWFsb2cvZ2V0bGlzdEpzb24iLCB0aGlzLmN1c3RvbURpYWxvZykudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICBfdGhpczQuY2hlY2tMaXN0KCk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cucGFnZUJlYW4gPSBwYWdlQmVhbjsKICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgiZGlhbG9nL2dldGxpc3RKc29uIiwgdGhpcy5jdXN0b21EaWFsb2cpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgX3RoaXM0LmNoZWNrTGlzdCgpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9LAogICAgZG9RdWVyeTogZnVuY3Rpb24gZG9RdWVyeShwYXJhbSkgewogICAgICB2YXIgX3RoaXM1ID0gdGhpczsKICAgICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKICAgICAgICB2YXIgcGFyYW1Mb2FkRGF0YSwgcEluc3QsIGksIGJpbmRWYWwsIG9iaiwgcXVlcnlVcmwsIHJlcXVlc3RNZXRob2Q7CiAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgcGFyYW1Mb2FkRGF0YSA9IFtdOwogICAgICAgICAgICAgIHBJbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKF90aGlzNSk7IC8v6I635Y+W5YWz6IGU5p+l6K+i57uR5a6a55qE6KGo5Y2V5Y+C5pWwCiAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtLmNvbmRpdGlvbmZpZWxkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAocGFyYW0uY29uZGl0aW9uZmllbGRbaV0uZmllbGRQYXRoICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgIGJpbmRWYWwgPSB1dGlscy5nZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0uY29uZGl0aW9uZmllbGRbaV0uZmllbGRQYXRoLCBudWxsKTsKICAgICAgICAgICAgICAgICAgb2JqID0gewogICAgICAgICAgICAgICAgICAgIGtleTogcGFyYW0uY29uZGl0aW9uZmllbGRbaV0uZmllbGQsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGJpbmRWYWwKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgcGFyYW1Mb2FkRGF0YS5wdXNoKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHF1ZXJ5VXJsID0gcGFyYW0uZHNUeXBlID09ICJkYXRhU291cmNlIiA/ICIke2Zvcm19L2Zvcm0vY3VzdG9tUXVlcnkvdjEvZG9RdWVyeT9hbGlhcz0iICsgcGFyYW0uYWxpYXMgKyAiJnBhZ2U9MSIgOiBwYXJhbS51cmw7CiAgICAgICAgICAgICAgcmVxdWVzdE1ldGhvZCA9ICJQT1NUIjsgLy/lpoLmnpzlhbPogZTmlbDmja7liJfooajmn6Xor6LmlbDmja7kuI3mmK/mlbDmja7mupDliJnor7fmsYLmlrnms5XkuLpyZXN0ZnVs6YWN572u55qE6K+35rGC5pa55byPCiAgICAgICAgICAgICAgaWYgKHBhcmFtLmRzVHlwZSAhPSAiZGF0YVNvdXJjZSIpIHsKICAgICAgICAgICAgICAgIHJlcXVlc3RNZXRob2QgPSBwYXJhbS5yZXF1ZXN0VHlwZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy/mn6Xor6LmlbDmja4KICAgICAgICAgICAgICByZXEucmVxdWVzdCh7CiAgICAgICAgICAgICAgICB1cmw6IHF1ZXJ5VXJsLAogICAgICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0TWV0aG9kLAogICAgICAgICAgICAgICAgZGF0YTogcGFyYW1Mb2FkRGF0YQogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgICAgICAgLy/liKTmlq3mmK/lkKbmnInlhbPogZTmn6Xor6LmlbDmja7ov5Tlm54KICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgLy/ojrflj5blhbPogZTmn6Xor6Lov5Tlm57nmoTooajljZXlj4LmlbAKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW8gPSAwOyBpbyA8IHBhcmFtLnJlc3VsdGZpZWxkLmxlbmd0aDsgaW8rKykgewogICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJlcy5kYXRhLnJvd3MubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhLnJvd3Nbal1bcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbCArIHJlcy5kYXRhLnJvd3Nbal1bcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkXSArICIsIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsLnN1YnN0cmluZygwLCB2YWwubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aEFyciA9IHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGguc3BsaXQoIi4iKTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoQXJyLmxlbmd0aCA9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5Li76KGoCiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLCB2YWwsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoQXJyLmxlbmd0aCA9PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGoCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJEYXRhID0gcEluc3QuZGF0YVtwYXRoQXJyWzFdXVtwYXRoQXJyWzJdXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkRhdGEubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WtkOihqOayoeaVsOaNrueahOaDheWGtQogICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJUYWJOYW1lID0gcGF0aEFyclsyXS5yZXBsYWNlKCJzdWJfIiwgIiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5b6X5Yiw5a2Q6KGo55qE5omA5pyJ5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkluaXREYXRhID0gcEluc3QuZGF0YVtwYXRoQXJyWzFdXS5pbml0RGF0YVtzdWJUYWJOYW1lXSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+aKiuaVsOe7hOmHjOmdoueahOWAvOS4uiBudWxsIOi9rOaNouS4uuepuuWtl+espuS4sgogICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSBKU09OLnN0cmluZ2lmeShzdWJJbml0RGF0YSkucmVwbGFjZSgvbnVsbC9nLCAnIiInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3N1YkRhdGEgPSBKU09OLnBhcnNlKHN0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIF9zdWJEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+eCuea3u+WKoOaXtuWIpOaWreimgeaWsOWinuWtkOihqOiusOW9leS4reeahOWtmeihqOaYr+WQpuacieWAvAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKCJzdWJfIikgPT0gMCAmJiBfc3ViRGF0YVtrZXldLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N1YkRhdGFba2V5XSA9IFtdOyAvL+acieWImea4heepugogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/ngrnmt7vliqDml7bliKTmlq3opoHmlrDlop7lrZDooajorrDlvZXkuK3nmoTlrZfmrrXmmK/lkKbmnInlgLwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfc3ViRGF0YVtrZXldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdWJEYXRhW2tleV0gPSAiIjsgLy/mnInliJnmuIXnqboKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/mlrDlop7kuIDmnaHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdC5kYXRhW3BhdGhBcnJbMV1dW3BhdGhBcnJbMl1dLnB1c2goX3N1YkRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGgsIHZhbCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lrZDooajmnInmlbDmja7nmoTmg4XlhrUKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBwID0gMDsgcCA8IHN1YkRhdGEubGVuZ3RoOyBwKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkUGF0aCwgdmFsLCBwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIC8v5rKh5pyJ6L+U5Zue55qE5YC85YiZ5riF56m6CiAgICAgICAgICAgICAgICAgIC8v6I635Y+W5YWz6IGU5p+l6K+i6L+U5Zue55qE6KGo5Y2V5Y+C5pWwCiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlvcCA9IDA7IGlvcCA8IHBhcmFtLnJlc3VsdGZpZWxkLmxlbmd0aDsgaW9wKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGggIT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGF0aEFyciA9IHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLnNwbGl0KCIuIik7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoX3BhdGhBcnIubGVuZ3RoID09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy/kuLvooagKICAgICAgICAgICAgICAgICAgICAgICAgLy/otYvlgLznu5nnu5HlrprnmoTlrZfmrrUKICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLCAiIiwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9wYXRoQXJyLmxlbmd0aCA9PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGoCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfc3ViRGF0YTIgPSBwSW5zdC5kYXRhW19wYXRoQXJyWzFdXVtfcGF0aEFyclsyXV07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9wID0gMDsgX3AgPCBfc3ViRGF0YTIubGVuZ3RoOyBfcCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lr7nor53moYblhbPogZTmn6Xor6Lov5Tlm57nmoTlgLzotYvlgLznu5nnu5HlrprnmoTlrZfmrrUKICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGgsICIiLCBfcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgX2NhbGxlZSk7CiAgICAgIH0pKSgpOwogICAgfSwKICAgIC8vIOWQjOatpemAieaLqee7k+aenAogICAgc3luY0lucHV0VmFsdWU6IGZ1bmN0aW9uIHN5bmNJbnB1dFZhbHVlKCkgewogICAgICB2YXIgX3RoaXM2ID0gdGhpczsKICAgICAgdmFyIHJldHVyblN0ciA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cucmVzdWx0ZmllbGQpOwogICAgICAvL+aLv+WIsOi/lOWbnueahOWtl+autQogICAgICB2YXIgZmllbGQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKTsKICAgICAgdmFyIGNvbW1lbnQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKTsKICAgICAgdmFyIHN0ciA9IFtdOwogICAgICB2YXIgaWRzID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0dXJuU3RyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZmllbGRbaV0gPSB0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnID8gcmV0dXJuU3RyW2ldLmZpZWxkLnRvTG93ZXJDYXNlKCkgOiByZXR1cm5TdHJbaV0uZmllbGQ7CiAgICAgICAgY29tbWVudFtpXSA9IHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScgPyByZXR1cm5TdHJbaV0uY29tbWVudC50b0xvd2VyQ2FzZSgpIDogcmV0dXJuU3RyW2ldLmNvbW1lbnQ7CiAgICAgIH0KICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgdGhpcy5zZWxlY3RPcmdzLmZvckVhY2goZnVuY3Rpb24gKHJvdykgewogICAgICAgIGlmICh0aGlzXy5jaGVja0JveERhdGFBbGwgfHwgdGhpc18uY2hlY2tCb3hEYXRhQWxsLmxlbmd0aCA8IDEpIHsKICAgICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5wdXNoKHJvdyk7CiAgICAgICAgfSBlbHNlIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzXy5pbmRleEFycmF5KS5pbmRleE9mKEpTT04uc3RyaW5naWZ5KHJvdykpID09IC0xKSB7CiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwucHVzaChyb3cpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHZhciBzID0gdGhpcy5zZWxlY3RPcmdzOwogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdmFyIHRlbXAgPSAnJzsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBlbmNvZGVTdHIgPSBlbmNvZGVVUklDb21wb25lbnQoc1swXVtmaWVsZFtpXV0pOwogICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBlbmNvZGVTdHIgKyAnIiwnOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcCAhPSAnJykgewogICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfSc7CiAgICAgICAgfQogICAgICAgIHN0ci5wdXNoKHV0aWxzLnBhcnNlVG9Kc29uKHRlbXApKTsKICAgICAgICBpZHMucHVzaChzWzBdLmlkKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciB0ZW1wID0gJyc7CiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbW1lbnQubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgdmFyIF9lbmNvZGVTdHIgPSBlbmNvZGVVUklDb21wb25lbnQoc1tpXVtmaWVsZFtqXV0pOwogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbal0gKyAnIjoiJyArIF9lbmNvZGVTdHIgKyAnIiwnOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsKICAgICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfSc7CiAgICAgICAgICB9CiAgICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSk7CiAgICAgICAgICBpZHMucHVzaChzW2ldLmlkKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIHJldHVybkRhdGEgPSBzdHI7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIHZhciBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsKICAgICAgLy/lpITnkIboh6rliqjlm57loavphY3nva4KICAgICAgdGhpcy5pbnN0SWQgPSBmb3JtSW5zdC4kcGFyZW50Lmluc3RJZDsKICAgICAgdmFyIGN1c3REaWFsb2cgPSB0aGlzLmN1c3RkaWFsb2c7CiAgICAgIHZhciBmaWxsT3JnID0ge307CiAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZyAmJiBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lICYmIHRoaXMuZmlsbE9yZy5pZCkgewogICAgICAgIHZhciBuYW1lUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLm5hbWUuc3BsaXQoJy4nKTsKICAgICAgICB2YXIgb3JnTmFtZUZpZWxkID0gbmFtZVBhdGhbbmFtZVBhdGgubGVuZ3RoIC0gMV07CiAgICAgICAgZmlsbE9yZ1tvcmdOYW1lRmllbGRdID0gdGhpcy5maWxsT3JnLm5hbWU7CiAgICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnLmlkKSB7CiAgICAgICAgICB2YXIgaWRQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuaWQuc3BsaXQoJy4nKTsKICAgICAgICAgIHZhciBvcmdJZEZpZWxkID0gaWRQYXRoW2lkUGF0aC5sZW5ndGggLSAxXTsKICAgICAgICAgIGZpbGxPcmdbb3JnSWRGaWVsZF0gPSB0aGlzLmZpbGxPcmcuaWQ7CiAgICAgICAgfQogICAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5jb2RlKSB7CiAgICAgICAgICB2YXIgY29kZVBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5jb2RlLnNwbGl0KCcuJyk7CiAgICAgICAgICB2YXIgb3JnQ29kZUZpZWxkID0gY29kZVBhdGhbY29kZVBhdGgubGVuZ3RoIC0gMV07CiAgICAgICAgICBmaWxsT3JnW29yZ0NvZGVGaWVsZF0gPSB0aGlzLmZpbGxPcmcuY29kZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZCkgewogICAgICAgIHZhciBpbnN0SWRQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuaW5zdElkLnNwbGl0KCcuJyk7CiAgICAgICAgdmFyIGluc3RJZEZpZWxkID0gaW5zdElkUGF0aFtpbnN0SWRQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgIGZpbGxPcmdbaW5zdElkRmllbGRdID0gdGhpcy5pbnN0SWQ7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICB2YXIgcmV0dXJuU2l6ZSA9IHJldHVybkRhdGEubGVuZ3RoOwogICAgICAgIC8v5Yik5pat5piv5ZCm5piv5LiA5a+55LiA5a2Q6KGoCiAgICAgICAgaWYgKF90aGlzLnJlbGF0aW9uICYmIF90aGlzLnJlbGF0aW9uID09ICdvbmV0b29uZScpIHsKICAgICAgICAgIGlmIChyZXR1cm5TaXplID4gMSkgewogICAgICAgICAgICB0aGlzXy4kbWVzc2FnZS5lcnJvcigi5LiA5a+55LiA5a2Q6KGo5Y+q6IO96YCJ5oup5LiA5p2h5pWw5o2uIik7CiAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm5EYXRhLmZvckVhY2goZnVuY3Rpb24gKHJvdykgewogICAgICAgICAgdmFyIHRhcmdldEFycmF5ID0gbnVsbDsKICAgICAgICAgIHZhciBzdWJMaW5lRGF0YSA9IHt9OwogICAgICAgICAgX3RoaXM2LmN1c3RkaWFsb2cuY3VzdERpYWxvZy5tYXBwaW5nQ29uZi5mb3JFYWNoKGZ1bmN0aW9uIChjb24pIHsKICAgICAgICAgICAgaWYgKGNvbi50YXJnZXRbMF0pIHsKICAgICAgICAgICAgICB0YXJnZXRBcnJheSA9IGNvbi50YXJnZXRbMF0uc3BsaXQoJy4nKTsKICAgICAgICAgICAgICB2YXIgZnJvbSA9ICcnOwogICAgICAgICAgICAgIGlmIChfdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdyZXN0ZnVsJykgewogICAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmcm9tID0gY29uLmZyb20udG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHJvd1tmcm9tXSA9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGZyb20gPSBmcm9tLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN1YkxpbmVEYXRhW3RhcmdldEFycmF5W3RhcmdldEFycmF5Lmxlbmd0aCAtIDFdXSA9IGRlY29kZVVSSUNvbXBvbmVudChyb3dbZnJvbV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIGlmICh0YXJnZXRBcnJheSkgewogICAgICAgICAgICB2YXIgc3ViQm8gPSBmb3JtSW5zdFsnZGF0YSddW3RhcmdldEFycmF5WzBdXVt0YXJnZXRBcnJheVsxXV07CiAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm5aSn5LqO5a2Q6KGo5pWw5o2u5pyA5aSn6KGM5pWwCiAgICAgICAgICAgIGlmICh0aGlzXy5tYXhSb3cgIT0gMCAmJiBzdWJCby5sZW5ndGggKyByZXR1cm5TaXplID4gdGhpc18ubWF4Um93KSB7CiAgICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoIuWtkOihqOaVsOaNruW3sui2hei/h+acgOWkp+ihjOaVsOOAkCIgKyB0aGlzXy5tYXhSb3cgKyAi44CRIik7CiAgICAgICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSB0cnVlOwogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRW5kSXRlcmF0aXZlIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8v5a2Q6KGo5Lit55qE5a2Z6KGo5a6e5L2T77yI5Y+v6IO95a2Y5Zyo5aSa5Liq77yJCiAgICAgICAgICAgIHZhciBzdW5Cb3MgPSB1dGlscy5nZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQoX3RoaXMuJGVsLCAnc3VuQm9zJyk7CiAgICAgICAgICAgIC8v5aaC5p6c5a2Y5Zyo5a2Z6KGo5a6e5L2T5YiZ5omL5Yqo5re75Yqg56m65a2Z6KGo5pWw57uE5a+56LGhCiAgICAgICAgICAgIGlmIChzdW5Cb3MpIHsKICAgICAgICAgICAgICB2YXIgYXJyYXlCbyA9IHN1bkJvcy5zcGxpdCgnLCcpOwogICAgICAgICAgICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IGFycmF5Qm8ubGVuZ3RoOyBfaTQrKykgewogICAgICAgICAgICAgICAgdmFyIGtleSA9ICdzdWJfJyArIGFycmF5Qm9bX2k0XTsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG5ldyBBcnJheSgpOwogICAgICAgICAgICAgICAgc3ViTGluZURhdGFba2V5XSA9IHZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+S4gOWvueS4gOWtkOihqAogICAgICAgICAgICBpZiAoX3RoaXMucmVsYXRpb24gJiYgX3RoaXMucmVsYXRpb24gPT0gJ29uZXRvb25lJykgewogICAgICAgICAgICAgIHN1YkJvLmVtcHR5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZpbGxPcmcgJiYgSlNPTi5zdHJpbmdpZnkoZmlsbE9yZykgIT0gJ3t9JykgewogICAgICAgICAgICAgIHN1YkxpbmVEYXRhID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdWJMaW5lRGF0YSksIGZpbGxPcmcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN1YkJvLnB1c2goc3ViTGluZURhdGEpOwogICAgICAgICAgICByZXR1cm5TaXplLS07CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBpZiAoZS5tZXNzYWdlICE9ICJFbmRJdGVyYXRpdmUiKSB0aHJvdyBlOwogICAgICB9CiAgICAgIDsKICAgIH0sCiAgICAvL+WPlua2iOaMiemSrgogICAgZGlhbG9nQ2FuY2VsOiBmdW5jdGlvbiBkaWFsb2dDYW5jZWwoKSB7CiAgICAgIHZhciBfdGhpczcgPSB0aGlzOwogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICB0aGlzXy5xdWVyeVBhcmFtID0gIiI7CiAgICAgIHRoaXNfLiRzdG9yZS5kaXNwYXRjaCgiZGlhbG9nL3NldERpYWxvZ0RhdGEiLCBbXSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSBmYWxzZTsKICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+eCueWHu+S6huehruiupOWGjeeCueWHu+WPlua2iOeahCAgaW5wdXRWYWzmsqHmnInlgLzliJnooajnpLrnm7TmjqXngrnlh7vnmoTlj5bmtogKICAgICAgICBpZiAoIXRoaXNfLmlucHV0VmFsKSB7CiAgICAgICAgICB0aGlzXy5zZWxlY3RPcmdzID0gW107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXNfLnNlbGVjdE9yZ3MgPSBfdG9Db25zdW1hYmxlQXJyYXkodGhpc18uc2hvd0RhdGEpOwogICAgICAgICAgX3RoaXM3LmNoZWNrQm94RGF0YUFsbCA9IF90b0NvbnN1bWFibGVBcnJheSh0aGlzXy5zZWxlY3RPcmdzKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSwKICAgIGRpYWxvZ1RyZWVDb25maXJtOiBmdW5jdGlvbiBkaWFsb2dUcmVlQ29uZmlybSgpIHsKICAgICAgdmFyIF90aGlzOCA9IHRoaXM7CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIGlmICh0aGlzXy5wcm9wc0RhdGEubGVuZ3RoID09IDApIHsKICAgICAgICB0aGlzXy4kbWVzc2FnZS5lcnJvcigi6K+36YCJ5oup5pWw5o2u5Zue5aGrIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdkaWFsb2cvc2V0RGlhbG9nRGF0YScsIFtdKTsKICAgICAgdmFyIHJldHVyblN0ciA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cucmVzdWx0ZmllbGQpOwogICAgICB2YXIgZmllbGQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKTsKICAgICAgdmFyIGNvbW1lbnQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKTsKICAgICAgdmFyIHN0ciA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJldHVyblN0ci5sZW5ndGg7IGkrKykgewogICAgICAgIGZpZWxkW2ldID0gcmV0dXJuU3RyW2ldLmZpZWxkOwogICAgICAgIGNvbW1lbnRbaV0gPSByZXR1cm5TdHJbaV0uY29tbWVudDsKICAgICAgfQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdmFyIG5vZGVzID0gdGhpcy5wcm9wc0RhdGFbMF07CiAgICAgICAgdmFyIHRlbXAgPSAnJzsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgbm9kZXNbZmllbGRbaV1dICsgJyIsJzsKICAgICAgICB9CiAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsKICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nOwogICAgICAgIH0KICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG5vZGVzID0gdGhpcy5wcm9wc0RhdGE7CiAgICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaykgewogICAgICAgICAgdmFyIHRlbXAgPSAnJzsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIG5vZGVzW2ZpZWxkW2ldXSArICciLCc7CiAgICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgbm9kZXNba11bZmllbGRbaV1dICsgJyIsJzsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0ZW1wICE9ICcnKSB7CiAgICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nOwogICAgICAgICAgfQogICAgICAgICAgc3RyLnB1c2godXRpbHMucGFyc2VUb0pzb24odGVtcCkpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHZhciByZXR1cm5EYXRhID0gc3RyOwogICAgICB2YXIgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHJldHVyblNpemUgPSByZXR1cm5EYXRhLmxlbmd0aDsKICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+S4gOWvueS4gOWtkOihqAogICAgICAgIGlmICh0aGlzXy5yZWxhdGlvbiAmJiB0aGlzXy5yZWxhdGlvbiA9PSAnb25ldG9vbmUnKSB7CiAgICAgICAgICBpZiAocmV0dXJuU2l6ZSA+IDEpIHsKICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoIuS4gOWvueS4gOWtkOihqOWPquiDvemAieaLqeS4gOadoeaVsOaNriIpOwogICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IHRydWU7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICAgIHZhciB0YXJnZXRBcnJheSA9IG51bGw7CiAgICAgICAgICB2YXIgc3ViTGluZURhdGEgPSB7fTsKICAgICAgICAgIF90aGlzOC5jdXN0ZGlhbG9nLmN1c3REaWFsb2cubWFwcGluZ0NvbmYuZm9yRWFjaChmdW5jdGlvbiAoY29uKSB7CiAgICAgICAgICAgIGlmIChjb24udGFyZ2V0WzBdKSB7CiAgICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBjb24udGFyZ2V0WzBdLnNwbGl0KCcuJyk7CiAgICAgICAgICAgICAgdmFyIGZyb20gPSAnJzsKICAgICAgICAgICAgICBpZiAodGhpc18uY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAncmVzdGZ1bCcpIHsKICAgICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChyb3dbZnJvbV0gPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBmcm9tID0gZnJvbS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdWJMaW5lRGF0YVt0YXJnZXRBcnJheVt0YXJnZXRBcnJheS5sZW5ndGggLSAxXV0gPSBkZWNvZGVVUklDb21wb25lbnQocm93W2Zyb21dKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAodGFyZ2V0QXJyYXkpIHsKICAgICAgICAgICAgdmFyIHN1YkJvID0gZm9ybUluc3RbJ2RhdGEnXVt0YXJnZXRBcnJheVswXV1bdGFyZ2V0QXJyYXlbMV1dOwogICAgICAgICAgICAvL+WIpOaWreaYr+WQpuWkp+S6juWtkOihqOaVsOaNruacgOWkp+ihjOaVsAogICAgICAgICAgICBpZiAodGhpc18ubWF4Um93ICE9IDAgJiYgc3ViQm8ubGVuZ3RoICsgcmV0dXJuU2l6ZSA+IHRoaXNfLm1heFJvdykgewogICAgICAgICAgICAgIHRoaXNfLiRtZXNzYWdlLmVycm9yKCLlrZDooajmlbDmja7lt7LotoXov4fmnIDlpKfooYzmlbDjgJAiICsgdGhpc18ubWF4Um93ICsgIuOAkSIpOwogICAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gdHJ1ZTsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVuZEl0ZXJhdGl2ZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL+WtkOihqOS4reeahOWtmeihqOWunuS9k++8iOWPr+iDveWtmOWcqOWkmuS4qu+8iQogICAgICAgICAgICB2YXIgc3VuQm9zID0gdXRpbHMuZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50KHRoaXNfLiRlbCwgJ3N1bkJvcycpOwogICAgICAgICAgICAvL+WmguaenOWtmOWcqOWtmeihqOWunuS9k+WImeaJi+WKqOa3u+WKoOepuuWtmeihqOaVsOe7hOWvueixoQogICAgICAgICAgICBpZiAoc3VuQm9zKSB7CiAgICAgICAgICAgICAgdmFyIGFycmF5Qm8gPSBzdW5Cb3Muc3BsaXQoJywnKTsKICAgICAgICAgICAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBhcnJheUJvLmxlbmd0aDsgX2k1KyspIHsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSAnc3ViXycgKyBhcnJheUJvW19pNV07CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBuZXcgQXJyYXkoKTsKICAgICAgICAgICAgICAgIHN1YkxpbmVEYXRhW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy/liKTmlq3mmK/lkKbmmK/kuIDlr7nkuIDlrZDooagKICAgICAgICAgICAgaWYgKHRoaXNfLnJlbGF0aW9uICYmIHRoaXNfLnJlbGF0aW9uID09ICdvbmV0b29uZScpIHsKICAgICAgICAgICAgICBzdWJCby5lbXB0eSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN1YkJvLnB1c2goc3ViTGluZURhdGEpOwogICAgICAgICAgICByZXR1cm5TaXplLS07CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IGZhbHNlOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKGUubWVzc2FnZSAhPSAiRW5kSXRlcmF0aXZlIikgdGhyb3cgZTsKICAgICAgfQogICAgICA7CiAgICB9LAogICAgZGlhbG9nQ2FuY2VsVHJlZTogZnVuY3Rpb24gZGlhbG9nQ2FuY2VsVHJlZSgpIHsKICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goImRpYWxvZy9zZXREaWFsb2dEYXRhIiwgW10pOwogICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gZmFsc2U7CiAgICB9LAogICAgZ2V0Q2hlY2tlZDogZnVuY3Rpb24gZ2V0Q2hlY2tlZChkYXRhLCBjaGVja2VkLCBpbmRldGVybWluYXRlKSB7CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICB0aGlzLnByb3BzRGF0YSA9IFtdOwogICAgICAgIHRoaXMucHJvcHNEYXRhLnB1c2goZGF0YSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5wcm9wc0RhdGEgPSB0aGlzLiRyZWZzLnRyZWUuZ2V0Q2hlY2tlZE5vZGVzKCk7CiAgICAgIH0KICAgIH0sCiAgICB0cmVlQ2xpY2s6IGZ1bmN0aW9uIHRyZWVDbGljayhkYXRhLCBuLCBpKSB7CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICB0aGlzLnByb3BzRGF0YSA9IFtdOwogICAgICAgIHRoaXMucHJvcHNEYXRhLnB1c2goZGF0YSk7CiAgICAgIH0KICAgIH0sCiAgICBjbGVhckFsbFNlbGVjdE9yZ3M6IGZ1bmN0aW9uIGNsZWFyQWxsU2VsZWN0T3JncygpIHsKICAgICAgdGhpcy5zZWxlY3RPcmdzID0gbnVsbDsKICAgICAgdGhpcy4kcmVmcy5vcmdUYWJsZS5jbGVhclNlbGVjdGlvbigpOwogICAgfSwKICAgIHJlbW92ZVNlbGVjdE9yZzogZnVuY3Rpb24gcmVtb3ZlU2VsZWN0T3JnKGl0ZW0pIHsKICAgICAgdmFyIF90aGlzOSA9IHRoaXM7CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICB0aGlzLiRlbWl0KCJpbnB1dCIsICIiKTsKICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKGl0ZW0sIDEpOwogICAgICAgIHRoaXMuc2hvd0RhdGEuc3BsaWNlKGl0ZW0sIDEpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuaW5wdXRWYWwuc3BsaWNlKGl0ZW0sIDEpOwogICAgICAgIC8vIGxldCByZW1vdmVJZCA9IHRoaXMuc2hvd0RhdGFbaXRlbV07CiAgICAgICAgLy/moJHlvaIKICAgICAgICBpZiAodGhpcy5wcm9wc0RhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgdGhpcy5wcm9wc0RhdGEuc3BsaWNlKGl0ZW0sIDEpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5zaG93RGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgICB0aGlzLnNob3dEYXRhLnNwbGljZShpdGVtLCAxKTsKICAgICAgICB9CiAgICAgICAgLy/liJfooagKICAgICAgICBpZiAodGhpcy5zZWxlY3RPcmdzICE9IG51bGwpIHsKICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UoaXRlbSwgMSk7CiAgICAgICAgICB0aGlzLmNoZWNrQm94RGF0YUFsbC5zcGxpY2UoaXRlbSwgMSk7CiAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7CiAgICAgICAgICAgIC8vIGlmKGl0ZW0uaWQgPT1yZW1vdmVJZCApewogICAgICAgICAgICBfdGhpczkuaXNDdXJyZW50Q2hhbmdlID0gdHJ1ZTsKICAgICAgICAgICAgX3RoaXM5LnRvZ2dsZVJvd1NlbGVjdGlvbihyb3csIGZhbHNlKTsKICAgICAgICAgICAgLy8gfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpOwogICAgICAgIHZhciB2YWx1ZSA9ICIiOwogICAgICAgIHRoaXMuaW5wdXRWYWwuZm9yRWFjaChmdW5jdGlvbiAodmFsKSB7CiAgICAgICAgICB2YWx1ZSArPSB2YWwudmFsdWUgKyAiLCI7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmxlbmd0aCAtIDEpOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUgIT0gIiIpIHsKICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyAifHwiICsgSlNPTi5zdHJpbmdpZnkodGhpcy5zaG93RGF0YSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuJGVtaXQoImlucHV0IiwgdmFsdWUpOwogICAgICB9CiAgICAgIHRoaXMuc3luY0lucHV0VmFsdWUoKTsKICAgIH0sCiAgICBjYWxhY0lucHV0U3VmZml4SGVpZ2h0OiBmdW5jdGlvbiBjYWxhY0lucHV0U3VmZml4SGVpZ2h0KCkgewogICAgICB2YXIgX3RoaXMxMCA9IHRoaXM7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghX3RoaXMxMC4kcmVmcy50YWdTcGFucykgcmV0dXJuOwogICAgICAgIGlmIChfdGhpczEwLiRyZWZzLnRhZ1NwYW5zLm9mZnNldEhlaWdodCkgewogICAgICAgICAgX3RoaXMxMC5pbnB1dFN1ZmZpeEhlaWdodCA9IF90aGlzMTAuJHJlZnMudGFnU3BhbnMub2Zmc2V0SGVpZ2h0ICsgNTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX3RoaXMxMC5pbnB1dFN1ZmZpeEhlaWdodCA9IDMwOwogICAgICAgIH0KICAgICAgICAvLyDop6blj5Hpqozor4EKICAgICAgICBfdGhpczEwLiR2YWxpZGF0b3IudmFsaWRhdGUoKTsKICAgICAgfSwgMCk7CiAgICB9LAogICAgY3VzdG9tRGlhbG9nU2hvdzogZnVuY3Rpb24gY3VzdG9tRGlhbG9nU2hvdyhwYWdlUGFyYW0pIHsKICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IHRydWU7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nID0gcGFnZVBhcmFtLmN1c3RvbURpYWxvZzsKICAgICAgdGhpcy5jdXN0b21EaWFsb2cucXVlcnlVcmwgPSB0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gImRhdGFTb3VyY2UiID8gIiR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0TGlzdERhdGE/YWxpYXM9IiArIHRoaXMuY3VzdG9tRGlhbG9nLmFsaWFzICsgIiZtYXBQYXJhbT0iICsgKHRoaXMuY3VzdG9tRGlhbG9nLm1hcFBhcmFtID8gdGhpcy5jdXN0b21EaWFsb2cubWFwUGFyYW0gOiAiIikgOiB0aGlzLmN1c3RvbURpYWxvZy51cmw7CiAgICAgIGlmICh0aGlzLmRpYWxvZ0RhdGEubGVuZ3RoIDwgMSkgewogICAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHsKICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgICBzaG93VG90YWw6ICJ0cnVlIgogICAgICAgIH07CiAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZCA9IEpTT04ucGFyc2UocGFnZVBhcmFtLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gImRhdGFTb3VyY2UiKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlzcGxheWZpZWxkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkID0gdGhpcy5kaXNwbGF5ZmllbGRbaV0uZmllbGQudG9Mb3dlckNhc2UoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaWFsb2dEYXRhLmxlbmd0aCA+IDEpIHsKICAgICAgICB0aGlzLnNlYXJjaCgpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmRpYWxvZ0RhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGggPT0gMCkgewogICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHBhZ2VQYXJhbS5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICJkYXRhU291cmNlIikgewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZFtpXS5maWVsZCA9IHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY3VzdG9tRGlhbG9nVHJlZVNob3c6IGZ1bmN0aW9uIGN1c3RvbURpYWxvZ1RyZWVTaG93KHBhZ2VQYXJhbSkgewogICAgICB0aGlzLmN1c3RvbURpYWxvZyA9IHBhZ2VQYXJhbS5jdXN0b21EaWFsb2c7CiAgICAgIHZhciBjdXN0b21EaWFsb2cgPSB0aGlzLmN1c3RvbURpYWxvZzsKICAgICAgdmFyIG1hcFBhcmFtID0gIiI7CiAgICAgIGlmIChwYWdlUGFyYW0ucGFyYW0gIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgbWFwUGFyYW0gPSBKU09OLnN0cmluZ2lmeShwYWdlUGFyYW0ucGFyYW0pOwogICAgICAgIG1hcFBhcmFtID0gbWFwUGFyYW0uc3Vic3RyaW5nKDEsIG1hcFBhcmFtLmxlbmd0aCAtIDEpOwogICAgICB9CiAgICAgIHZhciByZXF1ZXN0VHlwZSA9IGN1c3RvbURpYWxvZy5kc1R5cGUgPT0gImRhdGFTb3VyY2UiID8gIkdFVCIgOiBjdXN0b21EaWFsb2cucmVxdWVzdFR5cGUgPyBjdXN0b21EaWFsb2cucmVxdWVzdFR5cGUgOiAiUE9TVCI7CiAgICAgIHZhciB1cmwgPSAiJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0iICsgcGFnZVBhcmFtLmFsaWFzICsgIiZtYXBQYXJhbT0iICsgbWFwUGFyYW07CiAgICAgIHZhciBwYXJhbXNPYmogPSB7fTsKICAgICAgaWYgKGN1c3RvbURpYWxvZy5kc1R5cGUgIT0gImRhdGFTb3VyY2UiKSB7CiAgICAgICAgdXJsID0gY3VzdG9tRGlhbG9nLnVybDsKICAgICAgICB2YXIgdGVtcGxhdGVQYSA9IGN1c3RvbURpYWxvZy5kYXRhUGFyYW07CiAgICAgICAgaWYgKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCkgewogICAgICAgICAgdmFyIGNvbmRpdGlvbnMgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCk7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmRpdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGNvbiA9IGNvbmRpdGlvbnNbaV07CiAgICAgICAgICAgIGlmIChyZXF1ZXN0VHlwZSA9PSAiUE9TVCIpIHsKICAgICAgICAgICAgICBpZiAodGVtcGxhdGVQYSkgewogICAgICAgICAgICAgICAgdGVtcGxhdGVQYSA9IHRlbXBsYXRlUGEucmVwbGFjZShuZXcgUmVnRXhwKCJcXHsiICsgY29uLmZpZWxkICsgIlxcfSIsICJnIiksIGNvbi5kZWZhdWx0VmFsdWUpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbXNPYmpbY29uLmZpZWxkXSA9IGNvbi5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhciBsakNoYXIgPSB1cmwuaW5kZXhPZigiPyIpID09IC0xID8gIj8iIDogIiYiOwogICAgICAgICAgICAgIHVybCA9IHVybCArIGxqQ2hhciArIGNvbi5maWVsZCArICI9IiArIGNvbi5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7CiAgICAgICAgICAgIHBhcmFtc09iaiA9IEpTT04ucGFyc2UodGVtcGxhdGVQYSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciByZXF1ZXN0UGFyYW1zID0ge307CiAgICAgIHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPSByZXF1ZXN0VHlwZTsKICAgICAgcmVxdWVzdFBhcmFtcy51cmwgPSB1cmw7CiAgICAgIHJlcXVlc3RQYXJhbXMucGFyYW1zT2JqID0gcGFyYW1zT2JqOwogICAgICB0aGlzLnNlYXJjaFRyZWUocmVxdWVzdFBhcmFtcyk7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSB0cnVlOwogICAgfSwKICAgIC8v5qCR5b2i5p+l6K+iCiAgICBzZWFyY2hUcmVlOiBmdW5jdGlvbiBzZWFyY2hUcmVlKHJlcXVlc3RQYXJhbXMpIHsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgdmFyIHF1ZXJ5ID0gcmVxdWVzdFBhcmFtcy5yZXF1ZXN0VHlwZSA9PSAiUE9TVCIgPyByZXEucG9zdChyZXF1ZXN0UGFyYW1zLnVybCwgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmopIDogcmVxLmdldChyZXF1ZXN0UGFyYW1zLnVybCk7CiAgICAgIHF1ZXJ5LnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgLy/mmL7npLrlrZfmrrXphY3nva4KICAgICAgICB2YXIgZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZSh0aGlzXy5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICB0aGlzXy5kaXNwbGF5RmllbGQgPSBkaXNwbGF5ZmllbGQ7CiAgICAgICAgLy/miorlr7nor53moYbphY3nva7nmoTmmL7npLrlrZfmrrXmmL7npLrlkI3np7DotYvlgLznu5nmoJHlvaLnmoTmmL7npLrlgLwKICAgICAgICB0aGlzXy5kZWZhdWx0UHJvcHMubGFiZWwgPSBkaXNwbGF5ZmllbGQuZGlzcGxheU5hbWU7CiAgICAgICAgdGhpc18udHJlZUxpc3QgPSByZXNwb25zZS5kYXRhOwogICAgICAgIC8v5b6X5Yiw6KaB5Yqg6L295qCR55qE5L+h5oGvCiAgICAgICAgdGhpc18ucHJvcHMxID0gdGhpc18udG9UcmVlRGF0YShyZXNwb25zZS5kYXRhLCBkaXNwbGF5ZmllbGQuaWQsIGRpc3BsYXlmaWVsZC5waWQsIGRpc3BsYXlmaWVsZC5kaXNwbGF5TmFtZSwgZGlzcGxheWZpZWxkLnB2YWx1ZSA/IGRpc3BsYXlmaWVsZC5wdmFsdWUgOiAwKTsKICAgICAgfSk7CiAgICB9LAogICAgLy/liqDovb3moJHnmoTkv6Hmga8KICAgIHRvVHJlZURhdGE6IGZ1bmN0aW9uIHRvVHJlZURhdGEoZGF0YSwgaWQsIHBpZCwgbmFtZSwgcHZhbHVlKSB7CiAgICAgIC8vIOW7uueri+S4quagkeW9oue7k+aehCzpnIDopoHlrprkuYnkuKrmnIDpobblsYLnmoTniLboioLngrnvvIxwdmFsdWXmmK8wCiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZURhdGFUb1RyZWUoZGF0YSwgcGlkLCBpZCwgbmFtZSwgcHZhbHVlKTsKICAgIH0sCiAgICB0cmFuc2xhdGVEYXRhVG9UcmVlOiBmdW5jdGlvbiB0cmFuc2xhdGVEYXRhVG9UcmVlKGRhdGEsIHBpZCwgaWQsIG5hbWUsIHB2YWx1ZSkgewogICAgICAvL+aKiuagkeaVsOaNruacieWtkOiKgueCueeahOaVsOaNruWFqOmDqOi/h+a7pOaOie+8iOWPqueVmeeItuiKgueCueeahOaVsOaNru+8iQogICAgICB2YXIgcGFyZW50cyA9IGRhdGEuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZVtpZF0gPT0gdmFsdWVbcGlkXSB8fCB2YWx1ZVtwaWRdID09IG51bGwgfHwgdmFsdWVbcGlkXSA9PSBwdmFsdWU7CiAgICAgIH0pOwogICAgICBpZiAoIXBhcmVudHMpIHsKICAgICAgICBwYXJlbnRzID0gZGF0YS5maWx0ZXIoZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWVbcGlkXSAhPT0gInVuZGVmaW5lZCIgJiYgdmFsdWVbcGlkXSAhPSBudWxsICYmIHZhbHVlW2lkXSAhPSB2YWx1ZVtwaWRdOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBwYXJlbnRzOwogICAgfSwKICAgIGxvYWRUcmVlOiBmdW5jdGlvbiBsb2FkVHJlZShub2RlLCByZXNvbHZlKSB7CiAgICAgIHZhciBfdGhpczExID0gdGhpczsKICAgICAgaWYgKG5vZGUpIHsKICAgICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICAgIHZhciBkaXNwbGF5RmllbGQgPSB0aGlzXy5jdXN0b21EaWFsb2cuc3R5bGUgPT0gMiA/IHRoaXNfLmNvbWJpVHJlZURpc3BsYXlGaWVsZCA6IHRoaXNfLmRpc3BsYXlGaWVsZDsKICAgICAgICByZXNvbHZlKHRoaXMudHJlZUxpc3QuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlW2Rpc3BsYXlGaWVsZC5waWRdID09PSBub2RlLmRhdGFbZGlzcGxheUZpZWxkLmlkXTsKICAgICAgICB9KSk7CiAgICAgICAgaWYgKHRoaXMuc2hvd0RhdGEgJiYgdGhpcy5zaG93RGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3RoaXMxMS5zaG93RGF0YS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgaWYgKHYuUGlkID09IG5vZGUua2V5KSB7CiAgICAgICAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLnNldENoZWNrZWQodiwgdHJ1ZSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXNfLmNoZWNrTm9kZSh2LCB0aGlzXyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sIDQwMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgYWZ0ZXJPcGVuOiBmdW5jdGlvbiBhZnRlck9wZW4oKSB7CiAgICAgIC8v5omT5byA5a+56K+d5qGG5LmL5ZCO5Yqg6L295qCRCiAgICAgIHRoaXMubG9hZENvbWJpbmF0aW9uVHJlZSgpOwogICAgfSwKICAgIGxvYWRDb21iaW5hdGlvblRyZWU6IGZ1bmN0aW9uIGxvYWRDb21iaW5hdGlvblRyZWUoKSB7CiAgICAgIHZhciBfdGhpczEyID0gdGhpczsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnN0eWxlICE9IDIpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIGNvbWJpbmF0aW9uUnVsZSA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cuY29tYmluYXRpb25SdWxlKTsKICAgICAgdGhpcy5jb21iaW5hdGlvblJ1bGUgPSBjb21iaW5hdGlvblJ1bGU7CiAgICAgIHZhciB0cmVlQWxpYXMgPSBjb21iaW5hdGlvblJ1bGUubGVmdFRyZWU7CiAgICAgIC8v6I635Y+W5a+56K+d5qGG5pWw5o2uCiAgICAgIHJlcS5nZXQoIiR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0QnlBbGlhcz9hbGlhcz0iICsgdHJlZUFsaWFzKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgdmFyIHRyZWVEaWFsb2cgPSByZXNwLmRhdGE7CiAgICAgICAgX3RoaXMxMi5sZWZ0VHJlZVRpdGxlID0gdHJlZURpYWxvZy5uYW1lOwogICAgICAgIHZhciByZXFQYXJhbSA9IHt9OwogICAgICAgIHZhciByZXF1ZXN0VHlwZSA9IHRyZWVEaWFsb2cuZHNUeXBlID09ICJkYXRhU291cmNlIiA/ICJHRVQiIDogdHJlZURpYWxvZy5yZXF1ZXN0VHlwZSA/IHRyZWVEaWFsb2cucmVxdWVzdFR5cGUgOiAiUE9TVCI7CiAgICAgICAgdmFyIHVybCA9ICIke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldFRyZWVEYXRhP2FsaWFzPSIgKyB0cmVlQWxpYXMgKyAiJm1hcFBhcmFtPSI7CiAgICAgICAgdmFyIHBhcmFtc09iaiA9IHt9OwogICAgICAgIGlmICh0cmVlRGlhbG9nLmRzVHlwZSAhPSAiZGF0YVNvdXJjZSIpIHsKICAgICAgICAgIHVybCA9IHRyZWVEaWFsb2cudXJsOwogICAgICAgICAgdmFyIHRlbXBsYXRlUGEgPSB0cmVlRGlhbG9nLmRhdGFQYXJhbTsKICAgICAgICAgIGlmICh0cmVlRGlhbG9nLmNvbmRpdGlvbmZpZWxkKSB7CiAgICAgICAgICAgIHZhciBjb25kaXRpb25zID0gSlNPTi5wYXJzZSh0cmVlRGlhbG9nLmNvbmRpdGlvbmZpZWxkKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgdmFyIGNvbiA9IGNvbmRpdGlvbnNbaV07CiAgICAgICAgICAgICAgaWYgKHJlcXVlc3RUeXBlID09ICJQT1NUIikgewogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYSA9IHRlbXBsYXRlUGEucmVwbGFjZShuZXcgUmVnRXhwKCJcXHsiICsgY29uLmZpZWxkICsgIlxcfSIsICJnIiksIGNvbi5kZWZhdWx0VmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgcGFyYW1zT2JqW2Nvbi5maWVsZF0gPSBjb24uZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgbGpDaGFyID0gdXJsLmluZGV4T2YoIj8iKSA9PSAtMSA/ICI/IiA6ICImIjsKICAgICAgICAgICAgICAgIHVybCA9IHVybCArIGxqQ2hhciArIGNvbi5maWVsZCArICI9IiArIGNvbi5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7CiAgICAgICAgICAgICAgcGFyYW1zT2JqID0gSlNPTi5wYXJzZSh0ZW1wbGF0ZVBhKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVxdWVzdFBhcmFtcyA9IHt9OwogICAgICAgIHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPSByZXF1ZXN0VHlwZTsKICAgICAgICByZXF1ZXN0UGFyYW1zLnVybCA9IHVybDsKICAgICAgICByZXF1ZXN0UGFyYW1zLnBhcmFtc09iaiA9IHBhcmFtc09iajsKICAgICAgICBfdGhpczEyLiRzdG9yZS5kaXNwYXRjaCgiZGlhbG9nL2dldFRyZWVEYXRhIiwgcmVxdWVzdFBhcmFtcykudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgaWYgKHRyZWVEaWFsb2cuZGlzcGxheWZpZWxkICYmIHRyZWVEaWFsb2cucmVzdWx0ZmllbGQpIHsKICAgICAgICAgICAgdmFyIGRpc3BsYXlGaWVsZCA9IEpTT04ucGFyc2UodHJlZURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgICAgICB2YXIgcmVzdWx0ZmllbGQgPSBKU09OLnBhcnNlKHRyZWVEaWFsb2cucmVzdWx0ZmllbGQpOwogICAgICAgICAgICBfdGhpczEyLmRlZmF1bHRQcm9wcy5sYWJlbCA9IGRpc3BsYXlGaWVsZC5kaXNwbGF5TmFtZTsKICAgICAgICAgICAgX3RoaXMxMi50cmVlTGlzdCA9IHJlc3A7CiAgICAgICAgICAgIF90aGlzMTIuY29tYmlUcmVlRGlzcGxheUZpZWxkID0gZGlzcGxheUZpZWxkOwogICAgICAgICAgICBfdGhpczEyLmNvbWJpbmF0aW9uVHJlZURhdGEgPSBfdGhpczEyLnRvVHJlZURhdGEocmVzcCwgZGlzcGxheUZpZWxkLmlkLCBkaXNwbGF5RmllbGQucGlkLCBkaXNwbGF5RmllbGQuZGlzcGxheU5hbWUsIGRpc3BsYXlGaWVsZC5wdmFsdWUgPyBkaXNwbGF5RmllbGQucHZhbHVlIDogIjAiLCByZXN1bHRmaWVsZCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSwKICAgIGNvbWJpVHJlZUNsaWNrOiBmdW5jdGlvbiBjb21iaVRyZWVDbGljayhwYXJhbU9iaiwgbm9kZSwgbm9kZUNvbXBvbmVudCkgewogICAgICAvL+e7hOWQiOWvueivneahhueCueWHu+W3puagkQogICAgICAvL+a4heepuuaXp+eahAogICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5zcGxpY2UoMCk7CiAgICAgIHZhciBjb21iaW5hdGlvblJ1bGUgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLmNvbWJpbmF0aW9uUnVsZSk7CiAgICAgIGlmICghY29tYmluYXRpb25SdWxlLnJ1bGVzIHx8IGNvbWJpbmF0aW9uUnVsZS5ydWxlcy5sZW5ndGggPT0gMCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgcnVsZXMgPSBjb21iaW5hdGlvblJ1bGUucnVsZXM7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgdmFsdWUgPSBwYXJhbU9ialtydWxlc1tpXS50cmVlRmllbGRdOwogICAgICAgIHZhciBwcm9wZXJ0eSA9IHJ1bGVzW2ldLmxpc3RGaWVsZDsKICAgICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5wdXNoKHsKICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eSwKICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICAgIGdyb3VwOiAidHJlZUdyb3VwIiwKICAgICAgICAgIG9wZXJhdGlvbjogdGhpcy5nZXRPcGVyYXRpb24ocnVsZXNbaV0uY29uZGl0aW9uKSwKICAgICAgICAgIHJlbGF0aW9uOiAiQU5EIgogICAgICAgIH0pOwogICAgICB9CiAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICB9LAogICAgLy/ojrflj5bov5DnrpfnrKblj7cKICAgIGdldE9wZXJhdGlvbjogZnVuY3Rpb24gZ2V0T3BlcmF0aW9uKG9sZCkgewogICAgICBpZiAoIW9sZCkgewogICAgICAgIHJldHVybiAiIjsKICAgICAgfQogICAgICBpZiAob2xkID09ICJFUSIpIHsKICAgICAgICByZXR1cm4gIkVRVUFMIjsKICAgICAgfQogICAgICBpZiAob2xkID09ICJMSyIpIHsKICAgICAgICByZXR1cm4gIkxJS0UiOwogICAgICB9CiAgICAgIGlmIChvbGQgPT0gIkxGSyIpIHsKICAgICAgICByZXR1cm4gIkxJS0UiOwogICAgICB9CiAgICAgIGlmIChvbGQgPT0gIklOIikgewogICAgICAgIHJldHVybiAiSU4iOwogICAgICB9CiAgICB9LAogICAgdG9nZ2xlVHJlZTogZnVuY3Rpb24gdG9nZ2xlVHJlZSgpIHsKICAgICAgaWYgKHRoaXMudHJlZVNob3cpIHsKICAgICAgICB0aGlzLnRyZWVTaG93ID0gZmFsc2U7CiAgICAgICAgdGhpcy50cmFuc3Rpb25XaWR0aCA9ICIwJSI7CiAgICAgICAgdGhpcy50b2dnbGVCdG4gPSAiZWwtaWNvbi1hcnJvdy1yaWdodCI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy50cmVlU2hvdyA9IHRydWU7CiAgICAgICAgdGhpcy50cmFuc3Rpb25XaWR0aCA9ICIyNSUiOwogICAgICAgIHRoaXMudG9nZ2xlQnRuID0gImVsLWljb24tYXJyb3ctbGVmdCI7CiAgICAgIH0KICAgIH0sCiAgICBpbml0VGVtcGxhdGVEYXRhOiBmdW5jdGlvbiBpbml0VGVtcGxhdGVEYXRhKCkgewogICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICB2YXIgY3VzdGRpYWxvZyA9IHRoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nOwogICAgICBpZiAoIWN1c3RkaWFsb2cgfHwgIWN1c3RkaWFsb2cubWFwcGluZ0NvbmYgfHwgY3VzdGRpYWxvZy5tYXBwaW5nQ29uZi5sZW5ndGggPCAxKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciB0YXJnZXRQYXRoID0gdGhpcy5nZXRUYXJnZXRQYXRoKGN1c3RkaWFsb2cubWFwcGluZ0NvbmYpOwogICAgICB2YXIgcGF0aHMgPSB0YXJnZXRQYXRoLnNwbGl0KCcuJyk7CiAgICAgIHZhciBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsKICAgICAgaWYgKCFmb3JtSW5zdC5pbml0RmlsbERhdGEpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy/lpoLmnpzlt7LmnInmlbDmja7liJnkuI3pnIDopoHlho3mrKHliJ3lp4vljJYKICAgICAgdmFyIGN1ckRhdGEgPSBmb3JtSW5zdFsnZGF0YSddW3BhdGhzWzBdXVtwYXRoc1sxXV07CiAgICAgIHZhciBpbml0VHlwZSA9IHRoaXMuaW5pdEZpbGxEYXRhVHlwZTsKICAgICAgaWYgKCghaW5pdFR5cGUgfHwgaW5pdFR5cGUgPT0gJ2VtcHR5JykgJiYgY3VyRGF0YS5sZW5ndGggPiAwICYmICEoY3VyRGF0YS5sZW5ndGggPT0gMSAmJiBKU09OLnN0cmluZ2lmeShjdXJEYXRhWzBdKSA9PSAnW10nKSkgewogICAgICAgIHJldHVybjsKICAgICAgfSBlbHNlIGlmIChpbml0VHlwZSA9PSAnY292ZXInKSB7CiAgICAgICAgZm9ybUluc3RbJ2RhdGEnXVtwYXRoc1swXV1bcGF0aHNbMV1dID0gW107CiAgICAgIH0KICAgICAgdmFyIGxvYWRpbmcgPSB0aGlzLiRsb2FkaW5nKHsKICAgICAgICBsb2NrOiB0cnVlLAogICAgICAgIHRleHQ6ICfmraPlnKjliJ3lp4vljJbloavmiqXmqKHmnb8uLi4nLAogICAgICAgIHNwaW5uZXI6ICdlbC1pY29uLWxvYWRpbmcnLAogICAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsIDAsIDAsIDAuNyknCiAgICAgIH0pOwogICAgICB2YXIgbXlDdXN0b21EaWFsb2cgPSBudWxsOwogICAgICB0aGlzLiRodHRwLmdldCgnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRCeUFsaWFzP2FsaWFzPScgKyBjdXN0ZGlhbG9nLmFsaWFzKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgbXlDdXN0b21EaWFsb2cgPSByZXNwLmRhdGE7CiAgICAgICAgX3RoaXMuY3VzdG9tRGlhbG9nID0gcmVzcC5kYXRhOwogICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICBfdGhpcy5jbG9zZUxvYWRpbmcobG9hZGluZyk7CiAgICAgICAgX3RoaXMuJG1lc3NhZ2UoewogICAgICAgICAgbWVzc2FnZTogIuiOt+WPluiHquWumuS5ieWvueivneahhuWksei0pe+8gSIsCiAgICAgICAgICB0eXBlOiAiZXJyb3IiCiAgICAgICAgfSk7CiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBjdXJyZW50VXNlciA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiY3VycmVudFVzZXIiKSk7CiAgICAgICAgaWYgKCFfdGhpcy5jdXN0ZGlhbG9nLm9yZ0NvbmZpZy5jb2RlICYmICFfdGhpcy5jdXN0ZGlhbG9nLm9yZ0NvbmZpZy5uYW1lICYmICFfdGhpcy5jdXN0ZGlhbG9nLm9yZ0NvbmZpZy5pZCkgewogICAgICAgICAgX3RoaXMuY2xvc2VMb2FkaW5nKGxvYWRpbmcpOwogICAgICAgICAgX3RoaXMudG9GaWxsSW5pdERhdGEoX3RoaXMsIG15Q3VzdG9tRGlhbG9nLmRzVHlwZSwgZm9ybUluc3RbJ2RhdGEnXSk7CiAgICAgICAgfSBlbHNlIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiY3VyRmlsbE9yZ18iICsgY3VycmVudFVzZXIuYWNjb3VudCkpIHsKICAgICAgICAgIF90aGlzLmNsb3NlTG9hZGluZyhsb2FkaW5nKTsKICAgICAgICAgIF90aGlzLmZpbGxPcmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJjdXJGaWxsT3JnXyIgKyBjdXJyZW50VXNlci5hY2NvdW50KSk7CiAgICAgICAgICBfdGhpcy50b0ZpbGxJbml0RGF0YShfdGhpcywgbXlDdXN0b21EaWFsb2cuZHNUeXBlLCBmb3JtSW5zdFsnZGF0YSddKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX3RoaXMuJGh0dHAuZ2V0KCcke3VjfS9hcGkvb3JnL3YxL29yZy9nZXRGaWxsT3JnJykudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgICBfdGhpcy5jbG9zZUxvYWRpbmcobG9hZGluZyk7CiAgICAgICAgICAgIHZhciByZXAgPSByZXNwLmRhdGE7CiAgICAgICAgICAgIGlmIChyZXAuc3RhdGUpIHsKICAgICAgICAgICAgICBfdGhpcy5maWxsT3JnID0gcmVwLnZhbHVlOwogICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjdXJGaWxsT3JnXyIgKyBjdXJyZW50VXNlci5hY2NvdW50LCBKU09OLnN0cmluZ2lmeShyZXAudmFsdWUpKTsKICAgICAgICAgICAgICBfdGhpcy50b0ZpbGxJbml0RGF0YShfdGhpcywgbXlDdXN0b21EaWFsb2cuZHNUeXBlLCBmb3JtSW5zdFsnZGF0YSddKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBfdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICBtZXNzYWdlOiByZXAubWVzc2FnZSwKICAgICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIgogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgX3RoaXMuY2xvc2VMb2FkaW5nKGxvYWRpbmcpOwogICAgICAgICAgICBfdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgbWVzc2FnZTogIuiOt+WPluW9k+WJjeeUqOaIt+Whq+WItuWNleS9jeWksei0pe+8gSIsCiAgICAgICAgICAgICAgdHlwZTogIndhcm5pbmciCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0sCiAgICBjbG9zZUxvYWRpbmc6IGZ1bmN0aW9uIGNsb3NlTG9hZGluZyhsb2FkaW5nKSB7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIGxvYWRpbmcuY2xvc2UoKTsKICAgICAgfSwgMjAwMCk7CiAgICB9LAogICAgZ2V0VGFyZ2V0UGF0aDogZnVuY3Rpb24gZ2V0VGFyZ2V0UGF0aChtYXBwaW5nQ29uZikgewogICAgICB2YXIgdGFyZ2V0ID0gJyc7CiAgICAgIGlmIChtYXBwaW5nQ29uZiAmJiBtYXBwaW5nQ29uZi5sZW5ndGggPiAwKSB7CiAgICAgICAgbWFwcGluZ0NvbmYuZm9yRWFjaChmdW5jdGlvbiAobWFwKSB7CiAgICAgICAgICBpZiAobWFwWyd0YXJnZXQnXSAmJiBtYXBbJ3RhcmdldCddLmxlbmd0aCA9PSAxICYmIG1hcFsndGFyZ2V0J11bMF0pIHsKICAgICAgICAgICAgdGFyZ2V0ID0gbWFwWyd0YXJnZXQnXVswXTsKICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfSwKICAgIHRvRmlsbEluaXREYXRhOiBmdW5jdGlvbiB0b0ZpbGxJbml0RGF0YShfdGhpcywgZHNUeXBlLCBjdXJEYXRhKSB7CiAgICAgIHZhciBjdXN0ZGlhbG9nID0gdGhpcy5jdXN0ZGlhbG9nLmN1c3REaWFsb2c7CiAgICAgIHZhciBwYXJhbXMgPSBbXTsgLy/nu5HlrprnmoTooajljZXlrZfmrrUKICAgICAgaWYgKGN1c3RkaWFsb2cuY29uZGl0aW9ucykgewogICAgICAgIC8v5a+56K+d5qGG5oyJ6KGo5Y2V5a2X5q615p+l6K+i77yI5Y+C5pWw5Lyg5YWl55qE77yJCiAgICAgICAgdmFyIGJpbmRMaXN0ID0gY3VzdGRpYWxvZy5jb25kaXRpb25zOwogICAgICAgIGlmIChiaW5kTGlzdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICBiaW5kTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHsKICAgICAgICAgICAgLy/nu5HlrprooajljZXlrZfmrrUKICAgICAgICAgICAgaWYgKGVsZS5kZWZhdWx0VHlwZSA9PSAiMyIgJiYgZWxlLmJpbmQpIHsKICAgICAgICAgICAgICB2YXIgb2JqID0ge307CiAgICAgICAgICAgICAgb2JqLmZpZWxkID0gZWxlLmZpZWxkOwogICAgICAgICAgICAgIHZhciBiaW5kQXJyYXkgPSBlbGUuYmluZC5zcGxpdCgnLicpOwogICAgICAgICAgICAgIGlmIChiaW5kQXJyYXkubGVuZ3RoID09IDMpIHsKICAgICAgICAgICAgICAgIG9iai5iaW5kID0gY3VyRGF0YVtiaW5kQXJyYXlbMV1dW2JpbmRBcnJheVsyXV07CiAgICAgICAgICAgICAgICBwYXJhbXMucHVzaChvYmopOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciB1cmwgPSAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRMaXN0RGF0YT9hbGlhcz0nICsgY3VzdGRpYWxvZy5hbGlhczsKICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIHBhU3RyID0gJyc7CiAgICAgICAgcGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhKSB7CiAgICAgICAgICBpZiAocGFTdHIpIHsKICAgICAgICAgICAgcGFTdHIgKz0gJywnOwogICAgICAgICAgfQogICAgICAgICAgcGFTdHIgPSBwYVN0ciArICciJyArIHBhLmZpZWxkICsgJyI6IicgKyBwYS5iaW5kICsgJyInOwogICAgICAgIH0pOwogICAgICAgIHVybCA9IHVybCArICcmbWFwUGFyYW09JyArIHBhU3RyOwogICAgICB9IGVsc2UgewogICAgICAgIHVybCA9IHVybCArICcmbWFwUGFyYW09JzsKICAgICAgfQogICAgICB2YXIgcGFyYW0gPSB7CiAgICAgICAgcGFnZUJlYW46IHsKICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICBwYWdlU2l6ZTogMTAwMCwKICAgICAgICAgIHNob3dUb3RhbDogdHJ1ZQogICAgICAgIH0KICAgICAgfTsKICAgICAgX3RoaXMuJGh0dHAucG9zdCh1cmwsIHBhcmFtKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlID0gcmVzcC5kYXRhOwogICAgICAgIGlmIChyZXNwb25zZS5yb3dzKSB7CiAgICAgICAgICBfdGhpcy5zeW5jSW5pdFRhYmxlVmFsdWUocmVzcG9uc2Uucm93cywgZHNUeXBlKTsKICAgICAgICB9CiAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgIF90aGlzLiRtZXNzYWdlKHsKICAgICAgICAgIG1lc3NhZ2U6ICLojrflj5bliJ3lp4vljJbmlbDmja7lpLHotKXvvIEiLAogICAgICAgICAgdHlwZTogImVycm9yIgogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0sCiAgICBzeW5jSW5pdFRhYmxlVmFsdWU6IGZ1bmN0aW9uIHN5bmNJbml0VGFibGVWYWx1ZShzLCBkc1R5cGUpIHsKICAgICAgdmFyIGN1c3REaWFsb2cgPSB0aGlzLmN1c3RkaWFsb2c7CiAgICAgIHZhciByZXR1cm5TdHIgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLnJlc3VsdGZpZWxkKTsKICAgICAgLy/mi7/liLDov5Tlm57nmoTlrZfmrrUKICAgICAgdmFyIGZpZWxkID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBjb21tZW50ID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBzdHIgPSBbXTsKICAgICAgdmFyIGlkcyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJldHVyblN0ci5sZW5ndGg7IGkrKykgewogICAgICAgIGZpZWxkW2ldID0gZHNUeXBlID09ICJkYXRhU291cmNlIiA/IHJldHVyblN0cltpXS5maWVsZC50b0xvd2VyQ2FzZSgpIDogcmV0dXJuU3RyW2ldLmZpZWxkOwogICAgICAgIGNvbW1lbnRbaV0gPSBkc1R5cGUgPT0gImRhdGFTb3VyY2UiID8gcmV0dXJuU3RyW2ldLmNvbW1lbnQudG9Mb3dlckNhc2UoKSA6IHJldHVyblN0cltpXS5jb21tZW50OwogICAgICB9CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICB2YXIgdGVtcCA9ICIiOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIHZhID0gc1swXVtmaWVsZFtpXV07CiAgICAgICAgICB0eXBlb2YgdmEgPT0gJ3VuZGVmaW5lZCcgPyAnJyA6IHZhLCBfcmVhZE9ubHlFcnJvcigidmEiKTsKICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgdmEgKyAnIiwnOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcCAhPSAiIikgewogICAgICAgICAgdGVtcCA9ICJ7IiArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAifSI7CiAgICAgICAgfQogICAgICAgIHN0ci5wdXNoKHV0aWxzLnBhcnNlVG9Kc29uKHRlbXApKTsKICAgICAgICBpZHMucHVzaChzWzBdLmlkKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciB0ZW1wID0gIiI7CiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbW1lbnQubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgdmFyIF92YSA9IHNbaV1bZmllbGRbal1dOwogICAgICAgICAgICB0eXBlb2YgX3ZhID09ICd1bmRlZmluZWQnID8gJycgOiBfdmEsIF9yZWFkT25seUVycm9yKCJ2YSIpOwogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbal0gKyAnIjoiJyArIF92YSArICciLCc7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGVtcCAhPSAiIikgewogICAgICAgICAgICB0ZW1wID0gInsiICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICJ9IjsKICAgICAgICAgIH0KICAgICAgICAgIHN0ci5wdXNoKHV0aWxzLnBhcnNlVG9Kc29uKHRlbXApKTsKICAgICAgICAgIGlkcy5wdXNoKHNbaV0uaWQpOwogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7CiAgICAgIHRoaXMuaW5zdElkID0gZm9ybUluc3QuJHBhcmVudC5pbnN0SWQ7CiAgICAgIC8v5aSE55CG5aGr5Yi26YOo6ZeoCiAgICAgIHZhciBmaWxsT3JnID0ge307CiAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZyAmJiBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lICYmIHRoaXMuZmlsbE9yZy5pZCkgewogICAgICAgIHZhciBuYW1lUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLm5hbWUuc3BsaXQoJy4nKTsKICAgICAgICB2YXIgb3JnTmFtZUZpZWxkID0gbmFtZVBhdGhbbmFtZVBhdGgubGVuZ3RoIC0gMV07CiAgICAgICAgZmlsbE9yZ1tvcmdOYW1lRmllbGRdID0gdGhpcy5maWxsT3JnLm5hbWU7CiAgICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnLmlkKSB7CiAgICAgICAgICB2YXIgaWRQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuaWQuc3BsaXQoJy4nKTsKICAgICAgICAgIHZhciBvcmdJZEZpZWxkID0gaWRQYXRoW2lkUGF0aC5sZW5ndGggLSAxXTsKICAgICAgICAgIGZpbGxPcmdbb3JnSWRGaWVsZF0gPSB0aGlzLmZpbGxPcmcuaWQ7CiAgICAgICAgfQogICAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5jb2RlKSB7CiAgICAgICAgICB2YXIgY29kZVBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5jb2RlLnNwbGl0KCcuJyk7CiAgICAgICAgICB2YXIgb3JnQ29kZUZpZWxkID0gY29kZVBhdGhbY29kZVBhdGgubGVuZ3RoIC0gMV07CiAgICAgICAgICBmaWxsT3JnW29yZ0NvZGVGaWVsZF0gPSB0aGlzLmZpbGxPcmcuY29kZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZCkgewogICAgICAgIHZhciBpbnN0SWRQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuaW5zdElkLnNwbGl0KCcuJyk7CiAgICAgICAgdmFyIGluc3RJZEZpZWxkID0gaW5zdElkUGF0aFtpbnN0SWRQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgIGZpbGxPcmdbaW5zdElkRmllbGRdID0gdGhpcy5pbnN0SWQ7CiAgICAgIH0KICAgICAgdmFyIHJldHVybkRhdGEgPSBzdHI7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIHJldHVybkRhdGEuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7CiAgICAgICAgdmFyIHN1YkxpbmVEYXRhID0ge307CiAgICAgICAgdmFyIHRhcmdldEFycmF5ID0gbnVsbDsKICAgICAgICBjdXN0RGlhbG9nLmN1c3REaWFsb2cubWFwcGluZ0NvbmYuZm9yRWFjaChmdW5jdGlvbiAoY29uKSB7CiAgICAgICAgICBpZiAoY29uLnRhcmdldFswXSkgewogICAgICAgICAgICB0YXJnZXRBcnJheSA9IGNvbi50YXJnZXRbMF0uc3BsaXQoIi4iKTsKICAgICAgICAgICAgdmFyIGZyb20gPSAiIjsKICAgICAgICAgICAgaWYgKF90aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gInJlc3RmdWwiKSB7CiAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN1YkxpbmVEYXRhW3RhcmdldEFycmF5W3RhcmdldEFycmF5Lmxlbmd0aCAtIDFdXSA9IHJvd1tmcm9tXTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBpZiAoZmlsbE9yZyAmJiBKU09OLnN0cmluZ2lmeShmaWxsT3JnKSAhPSAne30nKSB7CiAgICAgICAgICBzdWJMaW5lRGF0YSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3ViTGluZURhdGEpLCBmaWxsT3JnKTsKICAgICAgICB9CiAgICAgICAgZm9ybUluc3RbJ2RhdGEnXVt0YXJnZXRBcnJheVswXV1bdGFyZ2V0QXJyYXlbMV1dLnB1c2goc3ViTGluZURhdGEpOwogICAgICB9KTsKICAgIH0KICB9Cn07"},null]}