{"remainingRequest":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js??ref--0-0!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\eipControl\\EipDialog.vue?vue&type=script&lang=js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\eipControl\\EipDialog.vue","mtime":1733309211876},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\babel.config.js","mtime":1733906004399},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXkuanMiOwppbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcmVnZW5lcmF0b3JSdW50aW1lLmpzIjsKaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2RhdGFTaGFyZS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmlsdGVyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucHVzaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNwbGljZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWUuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5rZXlzLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5jb25zdHJ1Y3Rvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5kb3QtYWxsLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuc3RpY2t5LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRvLXN0cmluZy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNlYXJjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5jb25zdHJ1Y3Rvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5maWx0ZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZm9yLWVhY2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIjsKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KCmltcG9ydCB7IG1hcFN0YXRlIH0gZnJvbSAndnVleCc7CmltcG9ydCB1dGlscyBmcm9tICdAL3V0aWxzLmpzJzsKaW1wb3J0IGhvdGVudFVpVXRpbHMgZnJvbSAnQC9ob3RlbnQtdWktdXRpbC5qcyc7CmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICdlbGVtZW50LXVpJzsKaW1wb3J0IHJlcSBmcm9tICdAL3JlcXVlc3QuanMnOwppbXBvcnQgc3ViX3Bpb19taXhpbiBmcm9tICJAL3N1Yi1wZXJtaXNzaW9uLW1peGluLmpzIjsKaW1wb3J0IEVpcFRhZyBmcm9tICdAL2NvbXBvbmVudHMvZWlwQ29udHJvbC9FaXBUYWcudnVlJzsKaW1wb3J0IEVpcFNlbGVjdERpYSBmcm9tICdAL2NvbXBvbmVudHMvZWlwQ29udHJvbC9FaXBTZWxlY3REaWEudnVlJzsKZXhwb3J0IGRlZmF1bHQgewogIGNvbXBvbmVudHM6IHsKICAgIEVpcFRhZzogRWlwVGFnLAogICAgRWlwU2VsZWN0RGlhOiBFaXBTZWxlY3REaWEKICB9LAogIG5hbWU6ICdlaXAtZGlhbG9nJywKICBwcm9wczogWyd2YWxpZGF0ZScsICd2YWx1ZScsICduYW1lJywgJ3Blcm1pc3Npb24nLCAnYXR0ZXInLCAnc2luZ2xlJywgJ3NlbGVjdG9yY29uZmlnJywgJ2N1c3RkaWFsb2cnLCAncGxhY2Vob2xkZXInLCAndG9vbHRpcHBsYWNlbWVudCddLAogIG1peGluczogW3N1Yl9waW9fbWl4aW5dLAogIC8v5re35YWl5pa55byP5byV5YWl6KGo5Y2V57uE5Lu25Lit5YWs5YWx5bGe5oCn77yM5aSE55CG5a2Q6KGo44CB5a2Z6KGo6KGM5YaF6IGU5Yqo77yI5YiH6Z2i5L+u5pS5cGVybWlzc2lvbl9zdWLvvIkKICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkgewogICAgcmV0dXJuIHsKICAgICAgZGlhbG9nVmlzaWJsZTogZmFsc2UsCiAgICAgIC8v5omT5byA5qCR5b2i6L6T5YWl5Yqo5oCB5Y+C5pWw5YC855qE5a+56K+d5qGGCiAgICAgIHBhZ2VQYXJhbToge30sCiAgICAgIC8v5qCR5b2i5a+56K+d5qGG5Y+C5pWwCiAgICAgIGNvbmRpdGlvbmZpZWxkVHJlZTogW10sCiAgICAgIC8v5qCR5b2i5a+56K+d5qGG5p2h5Lu25a2X5q61CiAgICAgIGRhdGE6IHsKICAgICAgICBxeGRkOiB7fQogICAgICB9LAogICAgICBpbnB1dFN1ZmZpeFdpZHRoOiAwLAogICAgICBwbGFjZWhvbGRlckJvOiAnJywKICAgICAgcXVpY2tTZWFyY2g6ICcnLAogICAgICAvL+Whq+WGmeaPkOekugogICAgICBjb25kaXRpb25CaW5kOiBbXSwKICAgICAgLy/lj4LmlbDmn6Xor6LlrZfmrrUKICAgICAgbm9kZUtleTogJ0lEXycsCiAgICAgIC8v5qCR5b2i5pWw5o2u54i2SWQKICAgICAgY3VzdG9tRGlhbG9nU2hvd0xpc3Q6IGZhbHNlLAogICAgICBjdXN0b21EaWFsb2dTaG93VHJlZTogZmFsc2UsCiAgICAgIHNlbGVjdE9yZ1Byb3BzOiB7CiAgICAgICAgbGFiZWw6ICduYW1lJwogICAgICB9LAogICAgICBzdHlsZTogJycsCiAgICAgIC8v5a+56K+d5qGG5a696auYCiAgICAgIHNlbGVjdE9yZ3M6IG51bGwsCiAgICAgIGlucHV0U3VmZml4SGVpZ2h0OiAzMywKICAgICAgY29uZmlnOiBudWxsLAogICAgICB1cGRhdGluZzogZmFsc2UsCiAgICAgIGRpc3BsYXlmaWVsZDogW10sCiAgICAgIC8v5pi+56S65a2X5q61CiAgICAgIGN1c3RvbURpYWxvZzoge30sCiAgICAgIHF1ZXJ5UGFyYW06ICcnLAogICAgICAvL+afpeivouadoeS7tui+k+WFpeeahOWAvAogICAgICBwcm9wczE6IFtdLAogICAgICBzaG93RGF0YTogW10sCiAgICAgIGNoZWNrQm94RGF0YUFsbDogW10sCiAgICAgIC8v6YCJ5Lit5a+56LGh55qE6ZuG5ZCICiAgICAgIGRlZmF1bHRQcm9wczogewogICAgICAgIGNoaWxkcmVuOiAnY2hpbGRyZW4nLAogICAgICAgIGxhYmVsOiAnbGFiZWwnLAogICAgICAgIGlzTGVhZjogImlzTGVhZiIKICAgICAgfSwKICAgICAgcHJvcHNEYXRhOiBbXSwKICAgICAgcXVlcnlzU2hvdzogZmFsc2UsCiAgICAgIC8v5piv5ZCm5pi+56S65pCc57Si5qGGCiAgICAgIHVuZGVmaW5lZGE6ICcnLAogICAgICBpc0N1cnJlbnRDaGFuZ2U6IGZhbHNlLAogICAgICAvL+aYr+WQpuS4jeaJp+ihjCBvcmdUYWJsZVNlbGVjdGlvbuaWueazlQogICAgICBwYWdpbmF0aW9uOiB7CiAgICAgICAgcGFnZTogMSwKICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgdG90YWw6IDAKICAgICAgfSwKICAgICAgcGFyYW06IFtdLAogICAgICAvL+e7keWumueahOihqOWNleWtl+autQogICAgICB0cmVlTGlzdDogW10sCiAgICAgIGRpc3BsYXlGaWVsZDoge30sCiAgICAgIHF1ZXJ5UGFyYW1zOiBbXSwKICAgICAgcGxhY2Vob2xkZXJzOiBbXSwKICAgICAgb2xkc2VsZWN0T3JnczogW10sCiAgICAgIGNvbWJpbmF0aW9uVHJlZURhdGE6IFtdLAogICAgICBjb21iaVRyZWVEaXNwbGF5RmllbGQ6IFtdLAogICAgICBjb21iaW5hdGlvblRyZWVRdWVyeXM6IFtdLAogICAgICBjb21iaW5hdGlvblJ1bGU6IHt9LAogICAgICB0b2dnbGVCdG46ICJlbC1pY29uLWFycm93LWxlZnQiLAogICAgICB0cmVlU2hvdzogdHJ1ZSwKICAgICAgdHJhbnN0aW9uV2lkdGg6ICIyNSUiLAogICAgICBsZWZ0VHJlZVRpdGxlOiAiIiwKICAgICAgd3JpdGVhYmxlOiB0cnVlCiAgICB9OwogIH0sCiAgd2F0Y2g6IHsKICAgIHByb3BzMTogZnVuY3Rpb24gcHJvcHMxKG5ld1ZhbCwgb2xkVmFsKSB7CiAgICAgIC8v5qCR5b2iCiAgICAgIGlmICh0aGlzLnNob3dEYXRhICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNob3dEYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICAgIHZhciBkYXRhID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNob3dEYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBkYXRhLnB1c2godGhpcy5zaG93RGF0YVtpXSk7CiAgICAgICAgfQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGRhdGEubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgIHRoaXNfLiRyZWZzLnRyZWUuc2V0Q2hlY2tlZChkYXRhW19pXSwgdHJ1ZSk7CiAgICAgICAgICAgIHRoaXNfLmNoZWNrTm9kZShkYXRhW19pXSwgdGhpc18pOwogICAgICAgICAgfQogICAgICAgIH0sIDIwMCk7CiAgICAgIH0KICAgIH0KICB9LAogIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7CiAgICB2YXIgX2hvdGVudFVpVXRpbHMkZ2V0U3ViID0gaG90ZW50VWlVdGlscy5nZXRTdWJTY29wZUVsQW5kSW5kZXgodGhpcy4kZWwpLAogICAgICBzdWJTY29wZUVsID0gX2hvdGVudFVpVXRpbHMkZ2V0U3ViLnN1YlNjb3BlRWwsCiAgICAgIGluZGV4ID0gX2hvdGVudFVpVXRpbHMkZ2V0U3ViLmluZGV4OwogICAgaWYgKHN1YlNjb3BlRWwgJiYgKHN1YlNjb3BlRWwuZ2V0QXR0cmlidXRlKCJyb3dfcmVhZG9ubHkiKSA9PSAndHJ1ZScgfHwgc3ViU2NvcGVFbC5nZXRBdHRyaWJ1dGUoInJvd19yZWFkb25seSIpID09PSB0cnVlKSkgewogICAgICB0aGlzLndyaXRlYWJsZSA9IGZhbHNlOwogICAgfQogICAgLy/ojrflj5blr7nor53moYbmjInpkq7lkI3np7Dlrr3luqYKICAgIGlmICh0aGlzLiRyZWZzLmlucHV0U3VmZml4KSB7CiAgICAgIHRoaXMuaW5wdXRTdWZmaXhXaWR0aCA9IHRoaXMuJHJlZnMuaW5wdXRTdWZmaXgub2Zmc2V0V2lkdGggKyAxOwogICAgfQogIH0sCiAgY29tcHV0ZWQ6IG1hcFN0YXRlKHsKICAgIC8vIHBhZ2luYXRpb246IHN0YXRlID0+IHN0YXRlLmRpYWxvZy5wYWdpbmF0aW9uLAogICAgdG90YWw6IGZ1bmN0aW9uIHRvdGFsKHN0YXRlKSB7CiAgICAgIHJldHVybiBzdGF0ZS5kaWFsb2cudG90YWw7CiAgICB9LAogICAgZGlhbG9nRGF0YTogZnVuY3Rpb24gZGlhbG9nRGF0YShzdGF0ZSkgewogICAgICByZXR1cm4gc3RhdGUuZGlhbG9nLnJvd3M7CiAgICB9LAogICAgaW5wdXRWYWw6IGZ1bmN0aW9uIGlucHV0VmFsKCkgewogICAgICBpZiAoIXRoaXMudmFsdWUgfHwgdGhpcy52YWx1ZSA9PSAnfHxbXScpIHsKICAgICAgICB0aGlzLmNoZWNrQm94RGF0YUFsbCA9IFtdOwogICAgICAgIC8vIHRoaXMuc2hvd0RhdGEgPSBbXTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgbmFtZUFyeSA9IHRoaXMudmFsdWUuc3BsaXQoJywnKTsKICAgICAgICBpZiAodGhpcy52YWx1ZS5pbmRleE9mKCd8fCcpID4gMCkgewogICAgICAgICAgbmFtZUFyeSA9IHRoaXMudmFsdWUuc3BsaXQoJ3x8JylbMF0uc3BsaXQoJywnKTsKICAgICAgICAgIC8vIHRoaXMuc2hvd0RhdGE9SlNPTi5wYXJzZSh0aGlzLnZhbHVlLnNwbGl0KCJ8fCIpWzFdKTsKICAgICAgICB9CiAgICAgICAgLy8gIHRoaXMuc2hvd0RhdGEgPXRoaXMuc2VsZWN0T3JnczsKICAgICAgICB2YXIgaWRBcnkgPSBudWxsOwogICAgICAgIHZhciBhY2NvdW50QXJ5ID0gbnVsbDsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgbmFtZUFyeS5mb3JFYWNoKGZ1bmN0aW9uIChtLCBpKSB7CiAgICAgICAgICB2YXIgbiA9IHsKICAgICAgICAgICAgdmFsdWU6IG0KICAgICAgICAgIH07CiAgICAgICAgICByZXN1bHQucHVzaChuKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9LAogICAgaW5wdXRXcml0ZWFibGU6IGZ1bmN0aW9uIGlucHV0V3JpdGVhYmxlKCkgewogICAgICByZXR1cm4gdGhpcy53cml0ZWFibGUgPyB1dGlscy5nZXRXcml0ZWFibGUodGhpcy5wZXJtaXNzaW9uX3N1YikgOiB0aGlzLndyaXRlYWJsZTsKICAgIH0sCiAgICBpbnB1dFZhbGlkYXRlOiBmdW5jdGlvbiBpbnB1dFZhbGlkYXRlKCkgewogICAgICB2YXIgdmFsaWRhdGVPYmogPSB0aGlzLiRzdG9yZS5zdGF0ZS5pbmRleC52YWxpZGF0ZTsKICAgICAgcmV0dXJuIHV0aWxzLmFkZFJlcXVpcmVkT3JOb3QodGhpcy5wZXJtaXNzaW9uX3N1YiwgdGhpcy52YWxpZGF0ZSwgdmFsaWRhdGVPYmosIHRoaXMpOwogICAgfSwKICAgIGlucHV0TmFtZTogZnVuY3Rpb24gaW5wdXROYW1lKCkgewogICAgICB2YXIgbGFiZWxkZXNjID0gJyc7CiAgICAgIGlmICh0aGlzLiRzbG90cyAmJiB0aGlzLiRzbG90cy5sYWJlbGRlc2MgJiYgdGhpcy4kc2xvdHMubGFiZWxkZXNjWzBdLmNoaWxkcmVuICYmIHRoaXMuJHNsb3RzLmxhYmVsZGVzY1swXS5jaGlsZHJlblswXS50ZXh0KSB7CiAgICAgICAgbGFiZWxkZXNjID0gdGhpcy4kc2xvdHMubGFiZWxkZXNjWzBdLmNoaWxkcmVuWzBdLnRleHQ7CiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSA/IHRoaXMubmFtZSA6IHV0aWxzLmdldE5hbWUoKSArICctJyArIGxhYmVsZGVzYzsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpcy5uYW1lID8gdGhpcy5uYW1lIDogdXRpbHMuZ2V0TmFtZSgpOwogICAgICB9CiAgICB9LAogICAgLy8g5piv5ZCm5pyJ5Zue5aGr6K6+572uCiAgICBiaW5kU2V0OiBmdW5jdGlvbiBiaW5kU2V0KCkgewogICAgICByZXR1cm4gdGhpcy5zZWxlY3RvcmNvbmZpZyA/IHRoaXMuc2VsZWN0b3Jjb25maWcuYmluZCA6IG51bGw7CiAgICB9CiAgfSksCiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHsKICAgIGlmICghdGhpcy5wbGFjZWhvbGRlcikgewogICAgICB0aGlzLnBsYWNlaG9sZGVyQm8gPSAn6K+36YCJ5oup5YaF5a65JzsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMucGxhY2Vob2xkZXJCbyA9IHRoaXMucGxhY2Vob2xkZXI7CiAgICB9CiAgICB0aGlzLiR2YWxpZGF0b3IgPSB0aGlzLiRyb290LiR2YWxpZGF0b3I7CiAgfSwKICBtZXRob2RzOiB7CiAgICBzZWxlY3RBbGw6IGZ1bmN0aW9uIHNlbGVjdEFsbChzZWxlY3Rpb24pIHsKICAgICAgaWYgKHRoaXMub2xkc2VsZWN0T3JncyAhPSBudWxsICYmIHNlbGVjdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBzZWxlY3Rpb24ubGVuZ3RoOyB4KyspIHsKICAgICAgICAgIGlmICh0aGlzLmluZGV4QXJyYXkodGhpcy5vbGRzZWxlY3RPcmdzLCBzZWxlY3Rpb25beF0pID09PSAtMSkgewogICAgICAgICAgICB0aGlzLm9sZHNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25beF0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBfLmNsb25lRGVlcCh0aGlzLm9sZHNlbGVjdE9yZ3MpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IF8uY2xvbmVEZWVwKHNlbGVjdGlvbik7CiAgICAgIH0KICAgIH0sCiAgICBjaGVja05vZGU6IGZ1bmN0aW9uIGNoZWNrTm9kZShkYXRhLCB0aGlzXywgcG5vZGUpIHsKICAgICAgaWYgKGRhdGEuUGlkKSB7CiAgICAgICAgdmFyIG5vZGUgPSB0aGlzXy4kcmVmcy50cmVlLmdldE5vZGUoZGF0YS5QaWQpOwogICAgICAgIG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWU7CiAgICAgICAgaWYgKG5vZGUuZGF0YS5QaWQpIHsKICAgICAgICAgIHRoaXNfLiRyZWZzLnRyZWUuZ2V0Tm9kZShub2RlLmRhdGEuUGlkKS5pbmRldGVybWluYXRlID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuY2hlY2tOb2RlKHRoaXNfLiRyZWZzLnRyZWUuZ2V0Tm9kZShub2RlLmRhdGEuUGlkKS5kYXRhLCB0aGlzXywgdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFub2RlLmluZGV0ZXJtaW5hdGUpIHsKICAgICAgICAgIG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHBub2RlICYmICFwbm9kZS5pbmRldGVybWluYXRlKSB7CiAgICAgICAgcG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWU7CiAgICAgIH0KICAgIH0sCiAgICAvL+Wbnui9puafpeivogogICAgc2VhcmNoRW50ZXJGdW46IGZ1bmN0aW9uIHNlYXJjaEVudGVyRnVuKGUpIHsKICAgICAgdmFyIGtleUNvZGUgPSB3aW5kb3cuZXZlbnQgPyBlLmtleUNvZGUgOiBlLndoaWNoOwogICAgICBpZiAoa2V5Q29kZSA9PSAxMykgewogICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgIH0KICAgIH0sCiAgICBoYW5kbGVTaXplQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVTaXplQ2hhbmdlKHNpemUpIHsKICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAvL+avj+mhteS4i+aLieaYvuekuuaVsOaNrgogICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUgPSBzaXplOwogICAgICB0aGlzLnNlYXJjaCgpOwogICAgfSwKICAgIGhhbmRsZUN1cnJlbnRDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZUN1cnJlbnRDaGFuZ2UoY3VycmVudFBhZ2UpIHsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgaWYgKHRoaXMuc2VsZWN0T3JncyAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLnNlbGVjdE9yZ3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7CiAgICAgICAgICB2YXIgcmVzID0gdGhpc18uaW5kZXhBcnJheSh0aGlzXy5jaGVja0JveERhdGFBbGwsIHJvdyk7CiAgICAgICAgICBpZiAocmVzID09IC0xKSB7CiAgICAgICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5wdXNoKHJvdyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAvL+eCueWHu+esrOWHoOmhtQogICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSA9IGN1cnJlbnRQYWdlOwogICAgICB0aGlzLnNlYXJjaCgpOwogICAgfSwKICAgIGNoZWNrTGlzdDogZnVuY3Rpb24gY2hlY2tMaXN0KCkgewogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAvL+WIl+ihqAogICAgICAgIGlmICh0aGlzXy5jaGVja0JveERhdGFBbGwgIT0gdW5kZWZpbmVkICYmIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5sZW5ndGggPiAwKSB7CiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7CiAgICAgICAgICAgIHZhciByZXMgPSB0aGlzXy5pbmRleEFycmF5KHRoaXNfLmRpYWxvZ0RhdGEsIHJvdyk7CiAgICAgICAgICAgIHRoaXNfLnVuZGVmaW5lZGEgPSByZXM7CiAgICAgICAgICAgIGlmIChyZXMgIT0gLTEpIHsKICAgICAgICAgICAgICB0aGlzXy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgICAgIHRoaXNfLnRvZ2dsZVJvd1NlbGVjdGlvbihyZXMsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0sIDMwMCk7CiAgICB9LAogICAgdG9nZ2xlUm93U2VsZWN0aW9uOiBmdW5jdGlvbiB0b2dnbGVSb3dTZWxlY3Rpb24ocmVzLCB2YWwpIHsKICAgICAgdGhpcy4kcmVmcy5vcmdUYWJsZS50b2dnbGVSb3dTZWxlY3Rpb24odGhpcy5kaWFsb2dEYXRhW3Jlc10sIHZhbCk7CiAgICB9LAogICAgc2hvd0RpYWxvZzogZnVuY3Rpb24gc2hvd0RpYWxvZyhpdGVtKSB7CiAgICAgIHZhciBfdGhpczIgPSB0aGlzOwogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICB2YXIgYWxpYXMgPSB0aGlzLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5hbGlhczsKICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vZ2V0QnlBbGlhcycsIGFsaWFzKS50aGVuKGZ1bmN0aW9uIChjdXN0b21EaWFsb2cpIHsKICAgICAgICBpZiAoIWN1c3RvbURpYWxvZyB8fCAhY3VzdG9tRGlhbG9nLmFsaWFzKSB7CiAgICAgICAgICBNZXNzYWdlLmVycm9yKCflr7nor53moYbliKvlkI3jgJAnICsgYWxpYXMgKyAn44CR5LiN5a2Y5Zyo77yBJyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChjdXN0b21EaWFsb2cuc3R5bGUgPT0gMSkgewogICAgICAgICAgdmFyIGRpc3BsYXlsaXN0ID0gSlNPTi5wYXJzZShjdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICAgIHRoaXNfLm5vZGVLZXkgPSBkaXNwbGF5bGlzdC5pZDsKICAgICAgICB9CiAgICAgICAgLy/lr7nor53moYbmjInooajljZXlrZfmrrXmn6Xor6LvvIjlj4LmlbDkvKDlhaXnmoTvvIkKICAgICAgICB2YXIgYmluZExpc3QgPSB0aGlzXy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cuY29uZGl0aW9uczsKICAgICAgICB0aGlzXy5wYXJhbSA9IFtdOyAvL+e7keWumueahOihqOWNleWtl+autQogICAgICAgIGlmIChiaW5kTGlzdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICBiaW5kTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHsKICAgICAgICAgICAgLy/nu5HlrprooajljZXlrZfmrrUKICAgICAgICAgICAgaWYgKGVsZS5kZWZhdWx0VHlwZSA9PSAnMycgJiYgZWxlLmJpbmQpIHsKICAgICAgICAgICAgICB2YXIgb2JqID0ge307CiAgICAgICAgICAgICAgb2JqLmZpZWxkID0gZWxlLmZpZWxkOwogICAgICAgICAgICAgIG9iai5iaW5kID0gZWxlLmJpbmQ7CiAgICAgICAgICAgICAgdGhpc18ucGFyYW0ucHVzaChvYmopOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLy/liKTmlq3lr7nor53moYbmn6Xor6LmmK/lkKbmnInmnaHku7YKICAgICAgICB2YXIgdXNlcklucHV0TGlzdCA9IEpTT04ucGFyc2UoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKTsKICAgICAgICB0aGlzXy5xdWlja1NlYXJjaCA9ICcnOyAvL+Whq+WGmeaPkOekuiBwbGFjZWhvbGRlcgogICAgICAgIHRoaXNfLmNvbmRpdGlvbkJpbmQgPSBbXTsKICAgICAgICB2YXIgcXVlcnlQYXJhbXMgPSBbXTsKICAgICAgICB2YXIgcGxhY2Vob2xkZXJzID0gW107CiAgICAgICAgaWYgKHVzZXJJbnB1dExpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgdXNlcklucHV0TGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHsKICAgICAgICAgICAgdmFyIG9iaiA9IHt9OwogICAgICAgICAgICAvL+adoeS7tuafpeivouWPguaVsO+8iOeUqOaIt+i+k+WFpeeahO+8iSDmlofmnKzmoYbovpPlhaUKICAgICAgICAgICAgaWYgKGVsZS5kZWZhdWx0VHlwZSA9PSAnMScpIHsKICAgICAgICAgICAgICBvYmpbZWxlLmZpZWxkXSA9ICcnOwogICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2gob2JqKTsKICAgICAgICAgICAgICB0aGlzXy5jb25kaXRpb25CaW5kLnB1c2goZWxlKTsKICAgICAgICAgICAgICBwbGFjZWhvbGRlcnMucHVzaCgn6K+36L6T5YWlJyArIGVsZS5jb21tZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBfdGhpczIuJHNldChfdGhpczIsICdxdWVyeVBhcmFtcycsIHF1ZXJ5UGFyYW1zKTsKICAgICAgICAgIF90aGlzMi4kc2V0KF90aGlzMiwgJ3BsYWNlaG9sZGVycycsIHBsYWNlaG9sZGVycyk7CiAgICAgICAgfQogICAgICAgIC8v5Yik5pat5piv5ZCm5pi+56S65p2h5Lu25p+l6K+i6L6T5YWl5qGGCiAgICAgICAgaWYgKHRoaXNfLnF1aWNrU2VhcmNoICE9ICcnKSB7CiAgICAgICAgICB0aGlzXy5xdWVyeXNTaG93ID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpc18ucXVlcnlzU2hvdyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHRoaXNfLnF1aWNrU2VhcmNoID0gJ+ivt+i+k+WFpScgKyBfdGhpczIucXVpY2tTZWFyY2ggKyAn5p+l6K+iJzsKICAgICAgICB0aGlzXy5zdHlsZSA9ICdoZWlnaHQ6JyArIGN1c3RvbURpYWxvZy5oZWlnaHQgKyAncHgnOwogICAgICAgIGlmICh3aW5kb3cuc2NyZWVuLmhlaWdodCAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA8PSA5MDApIHsKICAgICAgICAgIF90aGlzMi5zdHlsZSA9ICdoZWlnaHQ6NDQwcHgnOwogICAgICAgIH0KICAgICAgICBpZiAoY3VzdG9tRGlhbG9nLnN0eWxlID09IDAgfHwgY3VzdG9tRGlhbG9nLnN0eWxlID09IDIpIHsKICAgICAgICAgIC8v5YiX6KGoCiAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93KHsKICAgICAgICAgICAgYWxpYXM6IGFsaWFzLAogICAgICAgICAgICBjdXN0b21EaWFsb2c6IGN1c3RvbURpYWxvZwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIGlmIChjdXN0b21EaWFsb2cuc3R5bGUgPT0gMSkgewogICAgICAgICAgLy/moJHlvaIKICAgICAgICAgIHRoaXNfLnBhZ2VQYXJhbSA9IHsKICAgICAgICAgICAgYWxpYXM6IGFsaWFzLAogICAgICAgICAgICBjdXN0b21EaWFsb2c6IGN1c3RvbURpYWxvZwogICAgICAgICAgfTsKICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZyA9IGN1c3RvbURpYWxvZzsKICAgICAgICAgIHZhciBwYXJhbSA9IHt9OwogICAgICAgICAgdGhpc18uY29uZGl0aW9uZmllbGRUcmVlID0gW107CiAgICAgICAgICAvL+WIpOaWreaYr+WQpuWtmOWcqOadoeS7tgogICAgICAgICAgaWYgKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCkgewogICAgICAgICAgICB0aGlzXy5jb25kaXRpb25maWVsZFRyZWUgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCk7CiAgICAgICAgICAgIGlmICh0aGlzXy5jb25kaXRpb25maWVsZFRyZWUubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzXy5jb25kaXRpb25maWVsZFRyZWUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgIC8v5Yik5pat5p2h5Lu25a2X5q615piv5ZCm5piv5Yqo5oCB5Lyg5YWl77yIZGVmYXVsdFR5cGXvvJo077ya5Yqo5oCB5Lyg5YWl77yMMu+8muWbuuWumuWAvCDvvIkKICAgICAgICAgICAgICAgIGlmICh0aGlzXy5jb25kaXRpb25maWVsZFRyZWVbaV0uZGVmYXVsdFR5cGUgPT0gIjQiKSB7CiAgICAgICAgICAgICAgICAgIHBhcmFtW3RoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZVtpXS5maWVsZF0gPSB0aGlzXy5jb25kaXRpb25maWVsZFRyZWVbaV0uY29tbWVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8v5pyJ5Yqo5oCB5Lyg5YWl55qE5a2X5q61CiAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkocGFyYW0pICE9ICJ7fSIpIHsKICAgICAgICAgICAgdGhpc18uZGlhbG9nVmlzaWJsZSA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvL+aXoOWKqOaAgeS8oOWFpeeahOWtl+autQogICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dUcmVlU2hvdyh0aGlzXy5wYWdlUGFyYW0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9LAogICAgLy/miZPlvIDmoJHlvaLliqjmgIHlj4LmlbDovpPlhaXlgLznmoTlr7nor53moYYKICAgIGhhbmRsZVNhdmU6IGZ1bmN0aW9uIGhhbmRsZVNhdmUoKSB7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nVHJlZVNob3codGhpcy5wYWdlUGFyYW0pOwogICAgICB0aGlzLmRpYWxvZ1Zpc2libGUgPSBmYWxzZTsKICAgIH0sCiAgICAvL+WFs+mXreagkeW9ouWKqOaAgeWPguaVsOi+k+WFpeWAvOeahOWvueivneahhgogICAgaGFuZGxlQ2xvc2U6IGZ1bmN0aW9uIGhhbmRsZUNsb3NlKCkgewogICAgICB0aGlzLmRpYWxvZ1Zpc2libGUgPSBmYWxzZTsKICAgIH0sCiAgICAvL+WIpOaWreaVsOaNruaYr+WQpuWMheWQq+afkOS4quWvueixoe+8jOW5tui/lOWbnuaVsOaNruWMheWQq+WvueixoeeahOS4i+aghwogICAgaW5kZXhBcnJheTogZnVuY3Rpb24gaW5kZXhBcnJheShhcnJheSwgaXRlbSkgewogICAgICBpZiAoYXJyYXkubGVuZ3RoID09IDApIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShhcnJheVtpXSkgPT0gSlNPTi5zdHJpbmdpZnkoaXRlbSkpIHsKICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gLTE7CiAgICB9LAogICAgLy/ngrnlh7vliJfooajmn5DkuIDkuKrlpI3pgInmoYbml7bop6blj5EKICAgIG9uVGFibGVTZWxlY3Q6IGZ1bmN0aW9uIG9uVGFibGVTZWxlY3Qocm93cywgcm93KSB7CiAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gZmFsc2U7CiAgICAgIC8v5Yik5pat54K55Ye75YiX6KGo5pWw5o2u5pe25aSN6YCJ5qGG5piv5ZCm5Yu+6YCJICBzZWxlY3RlZO+8mnRydWXkuI3li77pgInvvIxmYWxzZeWLvumAiQogICAgICB2YXIgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdE9yZ3MgJiYgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA+IDAgJiYgdGhpcy5pbmRleEFycmF5KHRoaXMuc2VsZWN0T3Jncywgcm93KSAhPT0gLTE7CiAgICAgIGlmIChzZWxlY3RlZCkgewogICAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gdHJ1ZTsKICAgICAgICB2YXIgcmVzID0gdGhpcy5pbmRleEFycmF5KHRoaXMuc2VsZWN0T3Jncywgcm93KTsKICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKHJlcywgMSk7CiAgICAgIH0KICAgIH0sCiAgICAvL+eCueWHu+WIl+ihqOafkOS4gOadoeaVsOaNruaXtuinpuWPkQogICAgb3JnUm93Q2xpY2s6IGZ1bmN0aW9uIG9yZ1Jvd0NsaWNrKHJvdywgY29sdW1uLCBldmVudCkgewogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgJChldmVudC5jdXJyZW50VGFyZ2V0LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdKS50cmlnZ2VyKCdjbGljaycpOwogICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IFtdOwogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5wdXNoKHJvdyk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtICE9IDEpIHsKICAgICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IGZhbHNlOwogICAgICAgIC8v5Yik5pat54K55Ye75YiX6KGo5pWw5o2u5pe25aSN6YCJ5qGG5piv5ZCm5Yu+6YCJICBzZWxlY3RlZO+8mnRydWXkuI3li77pgInvvIxmYWxzZeWLvumAiQogICAgICAgIHZhciBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0T3JncyAmJiB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID4gMCAmJiB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpICE9PSAtMTsKICAgICAgICBpZiAoc2VsZWN0ZWQpIHsKICAgICAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gdHJ1ZTsKICAgICAgICAgIHZhciByZXMgPSB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpOwogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShyZXMsIDEpOwogICAgICAgIH0KICAgICAgICB0aGlzLiRyZWZzLm9yZ1RhYmxlLnRvZ2dsZVJvd1NlbGVjdGlvbihyb3cpOwogICAgICB9CiAgICB9LAogICAgLy/liJfooajlpI3pgInmoYbmnInmlLnlj5jml7bop6blj5EKICAgIG9yZ1RhYmxlU2VsZWN0aW9uOiBmdW5jdGlvbiBvcmdUYWJsZVNlbGVjdGlvbihzZWxlY3Rpb24pIHsKICAgICAgLy/lhajpgInnmoTmg4XlhrXnibnmrorlpITnkIYo5Li65LqG5LiO5Y6f5pys5Yqf6IO96YC76L6R5LiN5Yay56qBLOWFiOWkjeWItuS4gOS7veaXp+eahOmAieS4reaVsOaNri7nhLblkI7mi7/liLDlhajpgInkuovku7bkuK3ljrvorqHnrpcpCiAgICAgIHRoaXMub2xkc2VsZWN0T3JncyA9IF8uY2xvbmVEZWVwKHRoaXMuc2VsZWN0T3Jncyk7CiAgICAgIC8v5aSa6YCJCiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gIT0gMSAmJiAhdGhpcy5pc0N1cnJlbnRDaGFuZ2UpIHsKICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICBpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAxICYmICghdGhpcy5zZWxlY3RPcmdzIHx8IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPT0gMCkpIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gc2VsZWN0aW9uOwogICAgICAgICAgfSBlbHNlIGlmICgoIXRoaXMuc2VsZWN0T3JncyB8fCB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID09IDApICYmIHNlbGVjdGlvbi5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RPcmdzKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IHNlbGVjdGlvbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvbltpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0N1cnJlbnRDaGFuZ2UgJiYgc2VsZWN0aW9uLmxlbmd0aCA+PSAxMCkgewogICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0T3JncykgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IFtdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGZvciAodmFyIHUgPSB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoIC0gMTsgdSA+PSAwOyB1LS0pIHsKICAgICAgICAgICAgICAgIHZhciByZXMgPSB0aGlzLmluZGV4QXJyYXkoc2VsZWN0aW9uLCB0aGlzLnNlbGVjdE9yZ3NbdV0pOwogICAgICAgICAgICAgICAgaWYgKHJlcyAhPSAtMSkgewogICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKHJlcywgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHNlbGVjdGlvbi5sZW5ndGg7IF9pMisrKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2goc2VsZWN0aW9uW19pMl0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKHZhciBfaTMgPSBzZWxlY3Rpb24ubGVuZ3RoIC0gMTsgX2kzID49IDA7IF9pMy0tKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2goc2VsZWN0aW9uW19pM10pOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgZGlhbG9nQ29uZmlybTogZnVuY3Rpb24gZGlhbG9nQ29uZmlybSgpIHsKICAgICAgdGhpcy5xdWVyeVBhcmFtID0gJyc7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSBmYWxzZTsKICAgICAgdGhpcy5jYWxhY0lucHV0U3VmZml4SGVpZ2h0KCk7CiAgICAgIHRoaXMuc3luY0lucHV0VmFsdWUoKTsKICAgICAgLy8gdGhpcy4kc3RvcmUuZGlzcGF0Y2goImRpYWxvZy9zZXREaWFsb2dEYXRhIiwgW10pOwogICAgfSwKICAgIC8v6YeN572uCiAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7CiAgICAgIHZhciBfdGhpczMgPSB0aGlzOwogICAgICB0aGlzLnF1ZXJ5UGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtT2JqKSB7CiAgICAgICAgZm9yICh2YXIga2V5IGluIHBhcmFtT2JqKSB7CiAgICAgICAgICBfdGhpczMucXVlcnlQYXJhbXNba2V5XSA9ICcnOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIC8v57uE5ZCI5qCR6YeN572uCiAgICAgIHZhciBub2RlcyA9IHRoaXMuJHJlZnMuY29tYmluYXRpb25UcmVlLnN0b3JlLm5vZGVzTWFwOwogICAgICBmb3IgKHZhciBrZXkgaW4gbm9kZXMpIHsKICAgICAgICBub2Rlc1trZXldLmV4cGFuZGVkID0gZmFsc2U7CiAgICAgIH0KICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMuc3BsaWNlKDApOwogICAgICB0aGlzLnNlYXJjaCh0cnVlKTsKICAgIH0sCiAgICAvL+afpeivogogICAgc2VhcmNoOiBmdW5jdGlvbiBzZWFyY2gocmVzZXRQYWdpbnRpb24pIHsKICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CiAgICAgIHZhciBxdWVyeXMgPSBbXTsgLy/mn6Xor6LmnaHku7YKICAgICAgdmFyIHF1ZXJ5RmlsdGVyID0ge307CiAgICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLnBhZ2luYXRpb24pID09ICd7fScpIHsKICAgICAgICB0aGlzLnBhZ2luYXRpb24gPSB7CiAgICAgICAgICBwYWdlOiAnMScsCiAgICAgICAgICBwYWdlU2l6ZTogJzEwJywKICAgICAgICAgIHNob3dUb3RhbDogJ3RydWUnCiAgICAgICAgfTsKICAgICAgfQogICAgICB2YXIgcGFnZUJlYW4gPSB7CiAgICAgICAgcGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbgogICAgICB9OwogICAgICBpZiAocmVzZXRQYWdpbnRpb24pIHsKICAgICAgICBwYWdlQmVhbi5wYWdlQmVhbiA9IHsKICAgICAgICAgIHBhZ2U6ICcxJywKICAgICAgICAgIHBhZ2VTaXplOiAnMTAnLAogICAgICAgICAgc2hvd1RvdGFsOiAndHJ1ZScKICAgICAgICB9OwogICAgICB9CiAgICAgIC8v55So5oi36L6T5YWl55qECiAgICAgIGlmICh0aGlzLnF1ZXJ5UGFyYW1zLmxlbmd0aCAhPSAwICYmIHRoaXMucXVlcnlQYXJhbXNbMF0gIT0gJycpIHsKICAgICAgICB0aGlzLmNvbmRpdGlvbkJpbmQuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHsKICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGQsCiAgICAgICAgICAgIHZhbHVlOiBfdGhpczQucXVlcnlQYXJhbXNbaXRlbS5maWVsZF0sCiAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsCiAgICAgICAgICAgIG9wZXJhdGlvbjogJ0xJS0UnLAogICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIC8v5Y+C5pWw5Lyg5YWl55qE5p+l6K+i5ou85o6lCiAgICAgIGlmICh0aGlzLnBhcmFtKSB7CiAgICAgICAgdmFyIHBJbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMpOwogICAgICAgIHRoaXMucGFyYW0uZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgcXVlcnlzLnB1c2goewogICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5maWVsZCwKICAgICAgICAgICAgdmFsdWU6IHV0aWxzLmdldFZhbHVlQnlQYXRoKHBJbnN0LCBpdGVtLmJpbmQpLAogICAgICAgICAgICBncm91cDogJ21haW4nLAogICAgICAgICAgICBvcGVyYXRpb246ICdMSUtFJywKICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICAvL+adpeiHque7hOWQiOWvueivneahhueahAogICAgICBpZiAodGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMgJiYgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMubGVuZ3RoICE9IDApIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBxdWVyeXMucHVzaCh0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5c1tpXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChxdWVyeXMubGVuZ3RoID4gMCkgewogICAgICAgIHF1ZXJ5RmlsdGVyID0gdGhpcy5oYW5kbGVQb3N0RGF0YSh7CiAgICAgICAgICBwYWdlQmVhbjogcGFnZUJlYW4ucGFnZUJlYW4sCiAgICAgICAgICBxdWVyeXM6IHF1ZXJ5cwogICAgICAgIH0pOwogICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLnBhZ2VCZWFuID0gcXVlcnlGaWx0ZXI7CiAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9nZXRsaXN0SnNvbicsIHRoaXMuY3VzdG9tRGlhbG9nKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIF90aGlzNC5jaGVja0xpc3QoKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmN1c3RvbURpYWxvZy5wYWdlQmVhbiA9IHBhZ2VCZWFuOwogICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdkaWFsb2cvZ2V0bGlzdEpzb24nLCB0aGlzLmN1c3RvbURpYWxvZykudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICBfdGhpczQuY2hlY2tMaXN0KCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCiAgICAvLyDlpITnkIZQT1NU6K+35rGC5pe255qE5Y+C5pWwCiAgICBoYW5kbGVQb3N0RGF0YTogZnVuY3Rpb24gaGFuZGxlUG9zdERhdGEocXVlcnlGaWx0ZXIpIHsKICAgICAgaWYgKCF0aGlzLmN1c3RvbURpYWxvZy5kYXRhUGFyYW0gfHwgdGhpcy5jdXN0b21EaWFsb2cuZGF0YVBhcmFtLmNvbnN0cnVjdG9yICE9IFN0cmluZykgewogICAgICAgIHJldHVybiBxdWVyeUZpbHRlcjsKICAgICAgfQogICAgICAvLyDmnoTlu7rkuIrkuIvmlofmlbDmja7lr7nosaEKICAgICAgdmFyIGN0eCA9IHt9OwogICAgICBxdWVyeUZpbHRlciAmJiBxdWVyeUZpbHRlci5xdWVyeXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkgewogICAgICAgIGN0eFtlbGVtZW50LnByb3BlcnR5XSA9IGVsZW1lbnQudmFsdWU7CiAgICAgIH0pOwogICAgICB2YXIgZXhwID0gaG90ZW50VWlVdGlscy5wYXJzZUV4cCh0aGlzLmN1c3RvbURpYWxvZy5kYXRhUGFyYW0sIGN0eCk7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZXhwKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIEN1c3RvbVF1ZXJ5Ll90aHJvd0V4Y2VwdGlvbigiUE9TVFx1NTNDMlx1NjU3MFx1NEUwRFx1NjYyRlx1NjcwOVx1NjU0OFx1NzY4NEpTT05cdTY4M0NcdTVGMEYiLmNvbmNhdChxdWVyeS5kYXRhUGFyYW0pKTsKICAgICAgfQogICAgfSwKICAgIGRvUXVlcnk6IGZ1bmN0aW9uIGRvUXVlcnkocGFyYW0pIHsKICAgICAgdmFyIF90aGlzNSA9IHRoaXM7CiAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcigvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKICAgICAgICB2YXIgcGFyYW1Mb2FkRGF0YSwgcEluc3QsIGksIGJpbmRWYWwsIG9iaiwgcXVlcnlVcmwsIHJlcXVlc3RNZXRob2Q7CiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgcGFyYW1Mb2FkRGF0YSA9IFtdOwogICAgICAgICAgICAgIHBJbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKF90aGlzNSk7IC8v6I635Y+W5YWz6IGU5p+l6K+i57uR5a6a55qE6KGo5Y2V5Y+C5pWwCiAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtLmNvbmRpdGlvbmZpZWxkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAocGFyYW0uY29uZGl0aW9uZmllbGRbaV0uZmllbGRQYXRoICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgIGJpbmRWYWwgPSB1dGlscy5nZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0uY29uZGl0aW9uZmllbGRbaV0uZmllbGRQYXRoLCBudWxsKTsKICAgICAgICAgICAgICAgICAgb2JqID0gewogICAgICAgICAgICAgICAgICAgIGtleTogcGFyYW0uY29uZGl0aW9uZmllbGRbaV0uZmllbGQsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGJpbmRWYWwKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgcGFyYW1Mb2FkRGF0YS5wdXNoKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHF1ZXJ5VXJsID0gcGFyYW0uZHNUeXBlID09ICdkYXRhU291cmNlJyA/ICcke2Zvcm19L2Zvcm0vY3VzdG9tUXVlcnkvdjEvZG9RdWVyeT9hbGlhcz0nICsgcGFyYW0uYWxpYXMgKyAnJnBhZ2U9MScgOiBwYXJhbS51cmw7CiAgICAgICAgICAgICAgcmVxdWVzdE1ldGhvZCA9ICdQT1NUJzsgLy/lpoLmnpzlhbPogZTmlbDmja7liJfooajmn6Xor6LmlbDmja7kuI3mmK/mlbDmja7mupDliJnor7fmsYLmlrnms5XkuLpyZXN0ZnVs6YWN572u55qE6K+35rGC5pa55byPCiAgICAgICAgICAgICAgaWYgKHBhcmFtLmRzVHlwZSAhPSAnZGF0YVNvdXJjZScpIHsKICAgICAgICAgICAgICAgIHJlcXVlc3RNZXRob2QgPSBwYXJhbS5yZXF1ZXN0VHlwZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy/mn6Xor6LmlbDmja4KICAgICAgICAgICAgICByZXEucmVxdWVzdCh7CiAgICAgICAgICAgICAgICB1cmw6IHF1ZXJ5VXJsLAogICAgICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0TWV0aG9kLAogICAgICAgICAgICAgICAgZGF0YTogcGFyYW1Mb2FkRGF0YQogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgICAgICAgLy/liKTmlq3mmK/lkKbmnInlhbPogZTmn6Xor6LmlbDmja7ov5Tlm54KICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgLy/ojrflj5blhbPogZTmn6Xor6Lov5Tlm57nmoTooajljZXlj4LmlbAKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW8gPSAwOyBpbyA8IHBhcmFtLnJlc3VsdGZpZWxkLmxlbmd0aDsgaW8rKykgewogICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJlcy5kYXRhLnJvd3MubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhLnJvd3Nbal1bcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbCArIHJlcy5kYXRhLnJvd3Nbal1bcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkXSArICcsJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsLnN1YnN0cmluZygwLCB2YWwubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aEFyciA9IHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGguc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoQXJyLmxlbmd0aCA9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5Li76KGoCiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLCB2YWwsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoQXJyLmxlbmd0aCA9PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGoCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJEYXRhID0gcEluc3QuZGF0YVtwYXRoQXJyWzFdXVtwYXRoQXJyWzJdXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkRhdGEubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WtkOihqOayoeaVsOaNrueahOaDheWGtQogICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJUYWJOYW1lID0gcGF0aEFyclsyXS5yZXBsYWNlKCdzdWJfJywgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5b6X5Yiw5a2Q6KGo55qE5omA5pyJ5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkluaXREYXRhID0gcEluc3QuZGF0YVtwYXRoQXJyWzFdXS5pbml0RGF0YVtzdWJUYWJOYW1lXSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+aKiuaVsOe7hOmHjOmdoueahOWAvOS4uiBudWxsIOi9rOaNouS4uuepuuWtl+espuS4sgogICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSBKU09OLnN0cmluZ2lmeShzdWJJbml0RGF0YSkucmVwbGFjZSgvbnVsbC9nLCAnIiInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3N1YkRhdGEgPSBKU09OLnBhcnNlKHN0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIF9zdWJEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+eCuea3u+WKoOaXtuWIpOaWreimgeaWsOWinuWtkOihqOiusOW9leS4reeahOWtmeihqOaYr+WQpuacieWAvAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKCdzdWJfJykgPT0gMCAmJiBfc3ViRGF0YVtrZXldLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N1YkRhdGFba2V5XSA9IFtdOyAvL+acieWImea4heepugogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/ngrnmt7vliqDml7bliKTmlq3opoHmlrDlop7lrZDooajorrDlvZXkuK3nmoTlrZfmrrXmmK/lkKbmnInlgLwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfc3ViRGF0YVtrZXldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdWJEYXRhW2tleV0gPSAnJzsgLy/mnInliJnmuIXnqboKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/mlrDlop7kuIDmnaHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdC5kYXRhW3BhdGhBcnJbMV1dW3BhdGhBcnJbMl1dLnB1c2goX3N1YkRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGgsIHZhbCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lrZDooajmnInmlbDmja7nmoTmg4XlhrUKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBwID0gMDsgcCA8IHN1YkRhdGEubGVuZ3RoOyBwKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkUGF0aCwgdmFsLCBwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIC8v5rKh5pyJ6L+U5Zue55qE5YC85YiZ5riF56m6CiAgICAgICAgICAgICAgICAgIC8v6I635Y+W5YWz6IGU5p+l6K+i6L+U5Zue55qE6KGo5Y2V5Y+C5pWwCiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlvcCA9IDA7IGlvcCA8IHBhcmFtLnJlc3VsdGZpZWxkLmxlbmd0aDsgaW9wKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGggIT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGF0aEFyciA9IHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLnNwbGl0KCcuJyk7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoX3BhdGhBcnIubGVuZ3RoID09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy/kuLvooagKICAgICAgICAgICAgICAgICAgICAgICAgLy/otYvlgLznu5nnu5HlrprnmoTlrZfmrrUKICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLCAnJywgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9wYXRoQXJyLmxlbmd0aCA9PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGoCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfc3ViRGF0YTIgPSBwSW5zdC5kYXRhW19wYXRoQXJyWzFdXVtfcGF0aEFyclsyXV07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9wID0gMDsgX3AgPCBfc3ViRGF0YTIubGVuZ3RoOyBfcCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lr7nor53moYblhbPogZTmn6Xor6Lov5Tlm57nmoTlgLzotYvlgLznu5nnu5HlrprnmoTlrZfmrrUKICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGgsICcnLCBfcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgX2NhbGxlZSk7CiAgICAgIH0pKSgpOwogICAgfSwKICAgIC8vIOWQjOatpemAieaLqee7k+aenAogICAgc3luY0lucHV0VmFsdWU6IGZ1bmN0aW9uIHN5bmNJbnB1dFZhbHVlKCkgewogICAgICB2YXIgX3RoaXM2ID0gdGhpczsKICAgICAgdmFyIHRoaXNJbmRleCA9IG51bGw7IC8v5b2T5YmN5pWw5o2u5omA5Zyo5LiL5qCHCiAgICAgIHZhciBwYXJlbnRJbmRleCA9IG51bGw7IC8v54i26IqC54K55omA5Zyo5LiL5qCHCiAgICAgIGlmICh0aGlzLiRlbCkgewogICAgICAgIHRoaXNJbmRleCA9IHV0aWxzLmdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudCh0aGlzLiRlbCwgJ2RhdGEtaW5kZXgnKTsKICAgICAgICBwYXJlbnRJbmRleCA9IHV0aWxzLmdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudCh0aGlzLiRwYXJlbnQuJGVsLCAnZGF0YS1pbmRleCcpOwogICAgICB9CiAgICAgIHZhciByZXR1cm5TdHIgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLnJlc3VsdGZpZWxkKTsKICAgICAgLy/mi7/liLDov5Tlm57nmoTlrZfmrrUKICAgICAgdmFyIGZpZWxkID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBjb21tZW50ID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBzdHIgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXR1cm5TdHIubGVuZ3RoOyBpKyspIHsKICAgICAgICBmaWVsZFtpXSA9IHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScgPyByZXR1cm5TdHJbaV0uZmllbGQudG9Mb3dlckNhc2UoKSA6IHJldHVyblN0cltpXS5maWVsZDsKICAgICAgICBjb21tZW50W2ldID0gdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJyA/IHJldHVyblN0cltpXS5jb21tZW50LnRvTG93ZXJDYXNlKCkgOiByZXR1cm5TdHJbaV0uY29tbWVudDsKICAgICAgfQogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICB2YXIgcyA9IHRoaXMuc2VsZWN0T3JnczsKICAgICAgdGhpcy5zaG93RGF0YSA9IF90b0NvbnN1bWFibGVBcnJheSh0aGlzLnNlbGVjdE9yZ3MpOwogICAgICB0aGlzLmNoZWNrQm94RGF0YUFsbCA9IF90b0NvbnN1bWFibGVBcnJheSh0aGlzLnNlbGVjdE9yZ3MpOwogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgcyA9IHRoaXMuc2VsZWN0T3JnczsKICAgICAgfQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdmFyIHRlbXAgPSAnJzsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBzRmllbGQgPSBzWzBdW2ZpZWxkW2ldXSA9PT0gdW5kZWZpbmVkID8gJycgOiBzWzBdW2ZpZWxkW2ldXTsKICAgICAgICAgIHZhciBlbmNvZGVTdHIgPSBlbmNvZGVVUklDb21wb25lbnQoc0ZpZWxkKTsKICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgZW5jb2RlU3RyICsgJyIsJzsKICAgICAgICB9CiAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsKICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nOwogICAgICAgIH0KICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgdGVtcCA9ICcnOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21tZW50Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHZhciBfZW5jb2RlU3RyID0gZW5jb2RlVVJJQ29tcG9uZW50KHNbaV1bZmllbGRbal1dKTsKICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2pdICsgJyI6IicgKyBfZW5jb2RlU3RyICsgJyIsJzsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0ZW1wICE9ICcnKSB7CiAgICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nOwogICAgICAgICAgfQogICAgICAgICAgc3RyLnB1c2godXRpbHMucGFyc2VUb0pzb24odGVtcCkpOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyB0aGlzLiRlbWl0KCJpbnB1dCIsIEpTT04uc3RyaW5naWZ5KHN0cikpOwogICAgICB2YXIgcEluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIHRoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nLm1hcHBpbmdDb25mLmZvckVhY2goZnVuY3Rpb24gKGNvbikgewogICAgICAgIHZhciB2YWwgPSAnJzsKICAgICAgICB2YXIgZnJvbSA9ICcnOwogICAgICAgIGlmIChfdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdyZXN0ZnVsJykgewogICAgICAgICAgZnJvbSA9IGNvbi5mcm9tOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmcm9tID0gY29uLmZyb20udG9Mb3dlckNhc2UoKTsKICAgICAgICB9CiAgICAgICAgc3RyLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgIHZhbCArPSBkZWNvZGVVUklDb21wb25lbnQoaXRlbVtmcm9tXSkgKyAnLCc7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKF90aGlzNi5hdHRlciA9PSAnZGF0YS4nICsgY29uWyd0YXJnZXQnXVswXSkgewogICAgICAgICAgdmFsID0gdmFsLnN1YnN0cmluZygwLCB2YWwubGVuZ3RoIC0gMSk7CiAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgJ2RhdGEuJyArIGNvblsndGFyZ2V0J11bMF0sIHZhbCwgdGhpc0luZGV4KTsKICAgICAgICB9IGVsc2UgaWYgKF90aGlzNi5hdHRlciA9PSAnc2VhcmNoRm9ybS4nICsgY29uWyd0YXJnZXQnXVswXSkgewogICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdzZWFyY2hGb3JtLicgKyBjb25bJ3RhcmdldCddWzBdLCB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKSwgdGhpc0luZGV4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGNvbmZpZ0F0dHIgPSBjb25bJ3RhcmdldCddWzBdLnNwbGl0KCIuIik7CiAgICAgICAgICB2YXIgcGF0aCA9IGNvblsndGFyZ2V0J11bMF07CiAgICAgICAgICBpZiAoY29uZmlnQXR0ci5sZW5ndGggPT0gNCAmJiBwYXJlbnRJbmRleCA+PSAwKSB7CiAgICAgICAgICAgIC8v5a2Z6KGo5pWw5o2u6LWL5YC8CiAgICAgICAgICAgIHBhdGggPSBjb25maWdBdHRyWzBdICsgIi4iICsgY29uZmlnQXR0clsxXSArICJbIiArIHBhcmVudEluZGV4ICsgIl0uIiArIGNvbmZpZ0F0dHJbMl0gKyAiLiIgKyBjb25maWdBdHRyWzNdOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHBJbnN0LmRhdGEpIHsKICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdkYXRhLicgKyBwYXRoLCB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKSwgdGhpc0luZGV4KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCAnbW9kZWwuJyArIHBhdGgsIHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpLCB0aGlzSW5kZXgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIC8v5Yik5pat5a+56K+d5qGG5piv5ZCm57uR5a6a5LqG5YWz6IGU5p+l6K+iCiAgICAgIHZhciBjdXN0UXVlcnlKc29uID0gdGhpcy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cuY3VzdFF1ZXJ5SnNvbjsKICAgICAgaWYgKGN1c3RRdWVyeUpzb24ubGVuZ3RoID4gMCkgewogICAgICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IGN1c3RRdWVyeUpzb24ubGVuZ3RoOyBfaTQrKykgewogICAgICAgICAgaWYgKGN1c3RRdWVyeUpzb25bX2k0XS5jb25kaXRpb25maWVsZC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHRoaXMuZG9RdWVyeShjdXN0UXVlcnlKc29uW19pNF0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcignWycgKyBjdXN0UXVlcnlKc29uW19pNF0uY29tbWVudCArICdd5YWz6IGU5p+l6K+i5Y+W5YC85Y+C5pWw5pyq57uR5a6a6KGo5Y2V5a2X5q61Jyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgLy/lj5bmtojmjInpkq4KICAgIGRpYWxvZ0NhbmNlbDogZnVuY3Rpb24gZGlhbG9nQ2FuY2VsKCkgewogICAgICB2YXIgX3RoaXM3ID0gdGhpczsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgdGhpc18ucXVlcnlQYXJhbSA9ICcnOwogICAgICB0aGlzXy4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9zZXREaWFsb2dEYXRhJywgW10pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gZmFsc2U7CiAgICAgICAgLy/liKTmlq3mmK/lkKbmmK/ngrnlh7vkuobnoa7orqTlho3ngrnlh7vlj5bmtojnmoQgIGlucHV0VmFs5rKh5pyJ5YC85YiZ6KGo56S655u05o6l54K55Ye755qE5Y+W5raICiAgICAgICAgaWYgKCF0aGlzXy5pbnB1dFZhbCkgewogICAgICAgICAgdGhpc18uc2VsZWN0T3JncyA9IFtdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzXy5zZWxlY3RPcmdzID0gX3RvQ29uc3VtYWJsZUFycmF5KHRoaXNfLnNob3dEYXRhKTsKICAgICAgICAgIF90aGlzNy5jaGVja0JveERhdGFBbGwgPSBfdG9Db25zdW1hYmxlQXJyYXkodGhpc18uc2VsZWN0T3Jncyk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0sCiAgICBkaWFsb2dUcmVlQ29uZmlybTogZnVuY3Rpb24gZGlhbG9nVHJlZUNvbmZpcm0oKSB7CiAgICAgIHZhciBfdGhpczggPSB0aGlzOwogICAgICB0aGlzLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKTsKICAgICAgdmFyIHRoaXNJbmRleCA9IG51bGw7IC8v5b2T5YmN5pWw5o2u5omA5Zyo5LiL5qCHCiAgICAgIHZhciBwYXJlbnRJbmRleCA9IG51bGw7IC8v54i26IqC54K55omA5Zyo5LiL5qCHCiAgICAgIGlmICh0aGlzLiRlbCkgewogICAgICAgIHRoaXNJbmRleCA9IHV0aWxzLmdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudCh0aGlzLiRlbCwgJ2RhdGEtaW5kZXgnKTsKICAgICAgICBwYXJlbnRJbmRleCA9IHV0aWxzLmdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudCh0aGlzLiRwYXJlbnQuJGVsLCAnZGF0YS1pbmRleCcpOwogICAgICB9CiAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdkaWFsb2cvc2V0RGlhbG9nRGF0YScsIFtdKTsKICAgICAgdmFyIHJldHVyblN0ciA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cucmVzdWx0ZmllbGQpOwogICAgICB2YXIgZmllbGQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKTsKICAgICAgdmFyIGNvbW1lbnQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKTsKICAgICAgdmFyIHN0ciA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJldHVyblN0ci5sZW5ndGg7IGkrKykgewogICAgICAgIGZpZWxkW2ldID0gcmV0dXJuU3RyW2ldLmZpZWxkOwogICAgICAgIGNvbW1lbnRbaV0gPSByZXR1cm5TdHJbaV0uY29tbWVudDsKICAgICAgfQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdmFyIG5vZGVzID0gdGhpcy5wcm9wc0RhdGFbMF07CiAgICAgICAgdmFyIHRlbXAgPSAnJzsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgbm9kZXNbZmllbGRbaV1dICsgJyIsJzsKICAgICAgICB9CiAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsKICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nOwogICAgICAgIH0KICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG5vZGVzID0gdGhpcy5wcm9wc0RhdGE7CiAgICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaykgewogICAgICAgICAgdmFyIHRlbXAgPSAnJzsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIG5vZGVzW2ZpZWxkW2ldXSArICciLCc7CiAgICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgbm9kZXNba11bZmllbGRbaV1dICsgJyIsJzsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0ZW1wICE9ICcnKSB7CiAgICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nOwogICAgICAgICAgfQogICAgICAgICAgc3RyLnB1c2godXRpbHMucGFyc2VUb0pzb24odGVtcCkpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHZhciBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsKICAgICAgdGhpcy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cubWFwcGluZ0NvbmYuZm9yRWFjaChmdW5jdGlvbiAoY29uKSB7CiAgICAgICAgdmFyIHZhbCA9ICcnOwogICAgICAgIHN0ci5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICB2YWwgKz0gaXRlbVtjb24uZnJvbV0gKyAnLCc7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKF90aGlzOC5hdHRlciA9PSAnZGF0YS4nICsgY29uWyd0YXJnZXQnXVswXSkgewogICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdkYXRhLicgKyBjb25bJ3RhcmdldCddWzBdLCB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKSwgdGhpc0luZGV4KTsKICAgICAgICB9IGVsc2UgaWYgKF90aGlzOC5hdHRlciA9PSAnc2VhcmNoRm9ybS4nICsgY29uWyd0YXJnZXQnXVswXSkgewogICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdzZWFyY2hGb3JtLicgKyBjb25bJ3RhcmdldCddWzBdLCB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKSwgdGhpc0luZGV4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGNvbmZpZ0F0dHIgPSBjb25bJ3RhcmdldCddWzBdLnNwbGl0KCIuIik7CiAgICAgICAgICB2YXIgcGF0aCA9IGNvblsndGFyZ2V0J11bMF07CiAgICAgICAgICBpZiAoY29uZmlnQXR0ci5sZW5ndGggPT0gNCAmJiBwYXJlbnRJbmRleCA+PSAwKSB7CiAgICAgICAgICAgIC8v5a2Z6KGo5pWw5o2u6LWL5YC8CiAgICAgICAgICAgIHBhdGggPSBjb25maWdBdHRyWzBdICsgIi4iICsgY29uZmlnQXR0clsxXSArICJbIiArIHBhcmVudEluZGV4ICsgIl0uIiArIGNvbmZpZ0F0dHJbMl0gKyAiLiIgKyBjb25maWdBdHRyWzNdOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHBJbnN0LmRhdGEpIHsKICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdkYXRhLicgKyBwYXRoLCB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKSwgdGhpc0luZGV4KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCAnbW9kZWwuJyArIHBhdGgsIHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpLCB0aGlzSW5kZXgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIC8vdGhpcy4kZW1pdCgiaW5wdXQiLCBKU09OLnN0cmluZ2lmeShzdHIpKTsKICAgICAgdGhpcy5zaG93RGF0YSA9IF90b0NvbnN1bWFibGVBcnJheSh0aGlzLnByb3BzRGF0YSk7IC8v5Zue5pi+55qE5YC8CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSBmYWxzZTsKICAgIH0sCiAgICBkaWFsb2dDYW5jZWxUcmVlOiBmdW5jdGlvbiBkaWFsb2dDYW5jZWxUcmVlKCkgewogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL3NldERpYWxvZ0RhdGEnLCBbXSk7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSBmYWxzZTsKICAgIH0sCiAgICBnZXRDaGVja2VkOiBmdW5jdGlvbiBnZXRDaGVja2VkKGRhdGEsIGNoZWNrZWQsIGluZGV0ZXJtaW5hdGUpIHsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgewogICAgICAgIHRoaXMucHJvcHNEYXRhID0gW107CiAgICAgICAgdGhpcy5wcm9wc0RhdGEucHVzaChkYXRhKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnByb3BzRGF0YSA9IHRoaXMuJHJlZnMudHJlZS5nZXRDaGVja2VkTm9kZXMoKTsKICAgICAgfQogICAgfSwKICAgIHRyZWVDbGljazogZnVuY3Rpb24gdHJlZUNsaWNrKGRhdGEsIG4sIGkpIHsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgewogICAgICAgIHRoaXMucHJvcHNEYXRhID0gW107CiAgICAgICAgdGhpcy5wcm9wc0RhdGEucHVzaChkYXRhKTsKICAgICAgfQogICAgfSwKICAgIGNsZWFyQWxsU2VsZWN0T3JnczogZnVuY3Rpb24gY2xlYXJBbGxTZWxlY3RPcmdzKCkgewogICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBudWxsOwogICAgICB0aGlzLiRyZWZzLm9yZ1RhYmxlLmNsZWFyU2VsZWN0aW9uKCk7CiAgICB9LAogICAgcmVtb3ZlU2VsZWN0T3JnOiBmdW5jdGlvbiByZW1vdmVTZWxlY3RPcmcoaXRlbSkgewogICAgICB2YXIgX3RoaXM5ID0gdGhpczsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgewogICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgJycpOwogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UoaXRlbSwgMSk7CiAgICAgICAgdGhpcy5zaG93RGF0YS5zcGxpY2UoaXRlbSwgMSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5pbnB1dFZhbC5zcGxpY2UoaXRlbSwgMSk7CiAgICAgICAgLy8gbGV0IHJlbW92ZUlkID0gdGhpcy5zaG93RGF0YVtpdGVtXTsKICAgICAgICAvL+agkeW9ogogICAgICAgIGlmICh0aGlzLnByb3BzRGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgICB0aGlzLnByb3BzRGF0YS5zcGxpY2UoaXRlbSwgMSk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnNob3dEYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMuc2hvd0RhdGEuc3BsaWNlKGl0ZW0sIDEpOwogICAgICAgIH0KICAgICAgICAvL+WIl+ihqAogICAgICAgIGlmICh0aGlzLnNlbGVjdE9yZ3MgIT0gbnVsbCkgewogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShpdGVtLCAxKTsKICAgICAgICAgIHRoaXMuY2hlY2tCb3hEYXRhQWxsLnNwbGljZShpdGVtLCAxKTsKICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICAgICAgLy8gaWYoaXRlbS5pZCA9PXJlbW92ZUlkICl7CiAgICAgICAgICAgIF90aGlzOS5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgICBfdGhpczkudG9nZ2xlUm93U2VsZWN0aW9uKHJvdywgZmFsc2UpOwogICAgICAgICAgICAvLyB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5jYWxhY0lucHV0U3VmZml4SGVpZ2h0KCk7CiAgICAgICAgdmFyIHZhbHVlID0gJyc7CiAgICAgICAgdGhpcy5pbnB1dFZhbC5mb3JFYWNoKGZ1bmN0aW9uICh2YWwpIHsKICAgICAgICAgIHZhbHVlICs9IHZhbC52YWx1ZSArICcsJzsKICAgICAgICB9KTsKICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgewogICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGVuZ3RoIC0gMSk7CiAgICAgICAgfQogICAgICAgIGlmICh2YWx1ZSAhPSAnJykgewogICAgICAgICAgdmFsdWUgPSB2YWx1ZSArICd8fCcgKyBKU09OLnN0cmluZ2lmeSh0aGlzLnNob3dEYXRhKTsKICAgICAgICB9CiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSk7CiAgICAgIH0KICAgICAgdGhpcy5zeW5jSW5wdXRWYWx1ZSgpOwogICAgfSwKICAgIGNhbGFjSW5wdXRTdWZmaXhIZWlnaHQ6IGZ1bmN0aW9uIGNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKSB7CiAgICAgIHZhciBfdGhpczEwID0gdGhpczsKICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFfdGhpczEwLiRyZWZzLnRhZ1NwYW5zKSByZXR1cm47CiAgICAgICAgaWYgKF90aGlzMTAuJHJlZnMudGFnU3BhbnMub2Zmc2V0SGVpZ2h0KSB7CiAgICAgICAgICBfdGhpczEwLmlucHV0U3VmZml4SGVpZ2h0ID0gX3RoaXMxMC4kcmVmcy50YWdTcGFucy5vZmZzZXRIZWlnaHQgKyA1OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfdGhpczEwLmlucHV0U3VmZml4SGVpZ2h0ID0gMzA7CiAgICAgICAgfQogICAgICAgIC8vIOinpuWPkemqjOivgQogICAgICAgIF90aGlzMTAuJHZhbGlkYXRvci52YWxpZGF0ZSgpOwogICAgICB9LCAwKTsKICAgIH0sCiAgICBjdXN0b21EaWFsb2dTaG93OiBmdW5jdGlvbiBjdXN0b21EaWFsb2dTaG93KHBhZ2VQYXJhbSkgewogICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gdHJ1ZTsKICAgICAgdGhpcy5jdXN0b21EaWFsb2cgPSBwYWdlUGFyYW0uY3VzdG9tRGlhbG9nOwogICAgICB0aGlzLmN1c3RvbURpYWxvZy5xdWVyeVVybCA9IHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScgPyAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRMaXN0RGF0YT9hbGlhcz0nICsgdGhpcy5jdXN0b21EaWFsb2cuYWxpYXMgKyAnJm1hcFBhcmFtPScgKyAodGhpcy5jdXN0b21EaWFsb2cubWFwUGFyYW0gPyB0aGlzLmN1c3RvbURpYWxvZy5tYXBQYXJhbSA6ICcnKSA6IHRoaXMuY3VzdG9tRGlhbG9nLnVybDsKICAgICAgaWYgKHRoaXMuZGlhbG9nRGF0YS5sZW5ndGggPCAxKSB7CiAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZCA9IEpTT04ucGFyc2UocGFnZVBhcmFtLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlzcGxheWZpZWxkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkID0gdGhpcy5kaXNwbGF5ZmllbGRbaV0uZmllbGQudG9Mb3dlckNhc2UoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaWFsb2dEYXRhLmxlbmd0aCA+IDEpIHsKICAgICAgICB0aGlzLnNlYXJjaCgpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmRpYWxvZ0RhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGggPT0gMCkgewogICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHBhZ2VQYXJhbS5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJykgewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZFtpXS5maWVsZCA9IHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY3VzdG9tRGlhbG9nVHJlZVNob3c6IGZ1bmN0aW9uIGN1c3RvbURpYWxvZ1RyZWVTaG93KHBhZ2VQYXJhbSkgewogICAgICB2YXIgY3VzdG9tRGlhbG9nID0gdGhpcy5jdXN0b21EaWFsb2c7CiAgICAgIHZhciBtYXBQYXJhbU9iaiA9IHt9OyAvL+aVsOaNruadpea6kOaYr+aVsOaNrua6kO+8jOS4lOacieWKqOaAgeWPguaVsOS8oOWFpeaXtuiwg+eUqAogICAgICB2YXIgbWFwUGFyYW0gPSAiIjsKICAgICAgdmFyIGRlZmF1bHRQVmFsdWUgPSAiIjsgLy/niLZJROWAvAogICAgICBpZiAodGhpcy5jb25kaXRpb25maWVsZFRyZWUubGVuZ3RoID4gMCkgewogICAgICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IHRoaXMuY29uZGl0aW9uZmllbGRUcmVlLmxlbmd0aDsgX2k1KyspIHsKICAgICAgICAgIGlmICh0aGlzLmNvbmRpdGlvbmZpZWxkVHJlZVtfaTVdLmRlZmF1bHRUeXBlID09ICI0IikgewogICAgICAgICAgICAvL+WKqOaAgeS8oOWFpQogICAgICAgICAgICAvL+W+l+WIsOi+k+WFpeeahOadoeS7tuWtl+auteWAvAogICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5jb25kaXRpb25maWVsZFRyZWVbX2k1XS5wYXJhbVZhbDsKICAgICAgICAgICAgaWYgKCF2YWwpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL+W+l+WIsOadoeS7tuWtl+autUtFWQogICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5jb25kaXRpb25maWVsZFRyZWVbX2k1XS5maWVsZDsKICAgICAgICAgICAgbWFwUGFyYW1PYmpba2V5XSA9IHZhbDsKICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25kaXRpb25maWVsZFRyZWVbX2k1XS5kZWZhdWx0VHlwZSA9PSAiMiIpIHsKICAgICAgICAgICAgLy/lm7rlrprlgLwKICAgICAgICAgICAgLy/lvpfliLDovpPlhaXnmoTmnaHku7blrZfmrrXlgLwKICAgICAgICAgICAgdmFyIF92YWwgPSB0aGlzLmNvbmRpdGlvbmZpZWxkVHJlZVtfaTVdLmRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgaWYgKCFfdmFsKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy/lvpfliLDmnaHku7blrZfmrrVLRVkKICAgICAgICAgICAgdmFyIF9rZXkgPSB0aGlzLmNvbmRpdGlvbmZpZWxkVHJlZVtfaTVdLmZpZWxkOwogICAgICAgICAgICBtYXBQYXJhbU9ialtfa2V5XSA9IF92YWw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShtYXBQYXJhbU9iaikgIT0gInt9IikgewogICAgICAgICAgLy/ojrflj5blr7nor53moYbphY3nva7nmoTniLZJROWtl+autQogICAgICAgICAgdmFyIHBpZCA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKS5waWQ7CiAgICAgICAgICBmb3IgKHZhciBtIGluIG1hcFBhcmFtT2JqKSB7CiAgICAgICAgICAgIGlmIChwaWQgPT0gbSkgewogICAgICAgICAgICAgIGRlZmF1bHRQVmFsdWUgPSBtYXBQYXJhbU9ialttXTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbWFwUGFyYW0gPSBKU09OLnN0cmluZ2lmeShtYXBQYXJhbU9iaik7CiAgICAgICAgICBtYXBQYXJhbSA9IG1hcFBhcmFtLnN1YnN0cmluZygxLCBtYXBQYXJhbS5sZW5ndGggLSAxKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIHJlcXVlc3RUeXBlID0gY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScgPyAnR0VUJyA6IGN1c3RvbURpYWxvZy5yZXF1ZXN0VHlwZSA/IGN1c3RvbURpYWxvZy5yZXF1ZXN0VHlwZSA6ICdQT1NUJzsKICAgICAgdmFyIHVybCA9ICcke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldFRyZWVEYXRhP2FsaWFzPScgKyBwYWdlUGFyYW0uYWxpYXMgKyAnJm1hcFBhcmFtPScgKyBtYXBQYXJhbTsKICAgICAgdmFyIHBhcmFtc09iaiA9IHt9OwogICAgICBpZiAoY3VzdG9tRGlhbG9nLmRzVHlwZSAhPSAnZGF0YVNvdXJjZScpIHsKICAgICAgICB1cmwgPSBjdXN0b21EaWFsb2cudXJsOwogICAgICAgIHZhciB0ZW1wbGF0ZVBhID0gY3VzdG9tRGlhbG9nLmRhdGFQYXJhbTsKICAgICAgICBpZiAoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKSB7CiAgICAgICAgICB2YXIgY29uZGl0aW9ucyA9IEpTT04ucGFyc2UoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZGl0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgY29uID0gY29uZGl0aW9uc1tpXTsKICAgICAgICAgICAgaWYgKHJlcXVlc3RUeXBlID09ICdQT1NUJykgewogICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhID0gdGVtcGxhdGVQYS5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xceycgKyBjb24uZmllbGQgKyAnXFx9JywgJ2cnKSwgY29uLmRlZmF1bHRWYWx1ZSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHBhcmFtc09ialtjb24uZmllbGRdID0gY29uLmRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdmFyIGxqQ2hhciA9IHVybC5pbmRleE9mKCc/JykgPT0gLTEgPyAnPycgOiAnJic7CiAgICAgICAgICAgICAgdXJsID0gdXJsICsgbGpDaGFyICsgY29uLmZpZWxkICsgJz0nICsgY29uLmRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsKICAgICAgICAgICAgcGFyYW1zT2JqID0gSlNPTi5wYXJzZSh0ZW1wbGF0ZVBhKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIHJlcXVlc3RQYXJhbXMgPSB7fTsKICAgICAgcmVxdWVzdFBhcmFtcy5yZXF1ZXN0VHlwZSA9IHJlcXVlc3RUeXBlOwogICAgICByZXF1ZXN0UGFyYW1zLnVybCA9IHVybDsKICAgICAgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmogPSBwYXJhbXNPYmo7CiAgICAgIHRoaXMuc2VhcmNoVHJlZShyZXF1ZXN0UGFyYW1zLCBkZWZhdWx0UFZhbHVlKTsKICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IHRydWU7CiAgICB9LAogICAgLy/moJHlvaLmn6Xor6IKICAgIHNlYXJjaFRyZWU6IGZ1bmN0aW9uIHNlYXJjaFRyZWUocmVxdWVzdFBhcmFtcywgZGVmYXVsdFBWYWx1ZSkgewogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICB2YXIgcXVlcnkgPSByZXF1ZXN0UGFyYW1zLnJlcXVlc3RUeXBlID09ICdQT1NUJyA/IHJlcS5wb3N0KHJlcXVlc3RQYXJhbXMudXJsLCByZXF1ZXN0UGFyYW1zLnBhcmFtc09iaikgOiByZXEuZ2V0KHJlcXVlc3RQYXJhbXMudXJsKTsKICAgICAgcXVlcnkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAvL+aYvuekuuWtl+autemFjee9rgogICAgICAgIHZhciBkaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHRoaXNfLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgIHRoaXNfLmRpc3BsYXlGaWVsZCA9IGRpc3BsYXlmaWVsZDsKICAgICAgICAvL+aKiuWvueivneahhumFjee9rueahOaYvuekuuWtl+auteaYvuekuuWQjeensOi1i+WAvOe7meagkeW9oueahOaYvuekuuWAvAogICAgICAgIHRoaXNfLmRlZmF1bHRQcm9wcy5sYWJlbCA9IGRpc3BsYXlmaWVsZC5kaXNwbGF5TmFtZTsKICAgICAgICB0aGlzXy50cmVlTGlzdCA9IHJlc3BvbnNlLmRhdGE7CiAgICAgICAgLy/lvpfliLDopoHliqDovb3moJHnmoTkv6Hmga8KICAgICAgICBpZiAoZGVmYXVsdFBWYWx1ZSkgewogICAgICAgICAgZGlzcGxheWZpZWxkLnB2YWx1ZSA9IGRlZmF1bHRQVmFsdWU7CiAgICAgICAgfQogICAgICAgIHRoaXNfLnByb3BzMSA9IHRoaXNfLnRvVHJlZURhdGEocmVzcG9uc2UuZGF0YSwgZGlzcGxheWZpZWxkLmlkLCBkaXNwbGF5ZmllbGQucGlkLCBkaXNwbGF5ZmllbGQuZGlzcGxheU5hbWUsIGRpc3BsYXlmaWVsZC5wdmFsdWUgPyBkaXNwbGF5ZmllbGQucHZhbHVlIDogMCk7CiAgICAgIH0pOwogICAgfSwKICAgIC8v5Yqg6L295qCR55qE5L+h5oGvCiAgICB0b1RyZWVEYXRhOiBmdW5jdGlvbiB0b1RyZWVEYXRhKGRhdGEsIGlkLCBwaWQsIG5hbWUsIHB2YWx1ZSkgewogICAgICAvLyDlu7rnq4vkuKrmoJHlvaLnu5PmnoQs6ZyA6KaB5a6a5LmJ5Liq5pyA6aG25bGC55qE54i26IqC54K577yMcHZhbHVl5pivMAogICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVEYXRhVG9UcmVlKGRhdGEsIHBpZCwgaWQsIG5hbWUsIHB2YWx1ZSk7CiAgICB9LAogICAgdHJhbnNsYXRlRGF0YVRvVHJlZTogZnVuY3Rpb24gdHJhbnNsYXRlRGF0YVRvVHJlZShkYXRhLCBwaWQsIGlkLCBuYW1lLCBwdmFsdWUpIHsKICAgICAgLy/miormoJHmlbDmja7mnInlrZDoioLngrnnmoTmlbDmja7lhajpg6jov4fmu6TmjonvvIjlj6rnlZnniLboioLngrnnmoTmlbDmja7vvIkKICAgICAgdmFyIHBhcmVudHMgPSBkYXRhLmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWVbaWRdID09IHZhbHVlW3BpZF0gfHwgdmFsdWVbcGlkXSA9PSBudWxsIHx8IHZhbHVlW3BpZF0gPT0gcHZhbHVlOwogICAgICB9KTsKICAgICAgaWYgKCFwYXJlbnRzKSB7CiAgICAgICAgcGFyZW50cyA9IGRhdGEuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlW3BpZF0gIT09ICd1bmRlZmluZWQnICYmIHZhbHVlW3BpZF0gIT0gbnVsbCAmJiB2YWx1ZVtpZF0gIT0gdmFsdWVbcGlkXTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gcGFyZW50czsKICAgIH0sCiAgICBsb2FkVHJlZTogZnVuY3Rpb24gbG9hZFRyZWUobm9kZSwgcmVzb2x2ZSkgewogICAgICB2YXIgX3RoaXMxMSA9IHRoaXM7CiAgICAgIGlmIChub2RlKSB7CiAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICB2YXIgZGlzcGxheUZpZWxkID0gdGhpc18uY3VzdG9tRGlhbG9nLnN0eWxlID09IDIgPyB0aGlzXy5jb21iaVRyZWVEaXNwbGF5RmllbGQgOiB0aGlzXy5kaXNwbGF5RmllbGQ7CiAgICAgICAgcmVzb2x2ZSh0aGlzLnRyZWVMaXN0LmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgIHJldHVybiB2YWx1ZVtkaXNwbGF5RmllbGQucGlkXSA9PT0gbm9kZS5kYXRhW2Rpc3BsYXlGaWVsZC5pZF07CiAgICAgICAgfSkpOwogICAgICAgIGlmICh0aGlzLnNob3dEYXRhICYmIHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF90aGlzMTEuc2hvd0RhdGEuZm9yRWFjaChmdW5jdGlvbiAodikgewogICAgICAgICAgICAgIGlmICh2LlBpZCA9PSBub2RlLmtleSkgewogICAgICAgICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5zZXRDaGVja2VkKHYsIHRydWUpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzXy5jaGVja05vZGUodiwgdGhpc18pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LCA0MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGFmdGVyT3BlbjogZnVuY3Rpb24gYWZ0ZXJPcGVuKCkgewogICAgICAvL+aJk+W8gOWvueivneahhuS5i+WQjuWKoOi9veagkQogICAgICB0aGlzLmxvYWRDb21iaW5hdGlvblRyZWUoKTsKICAgIH0sCiAgICBsb2FkQ29tYmluYXRpb25UcmVlOiBmdW5jdGlvbiBsb2FkQ29tYmluYXRpb25UcmVlKCkgewogICAgICB2YXIgX3RoaXMxMiA9IHRoaXM7CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zdHlsZSAhPSAyKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBjb21iaW5hdGlvblJ1bGUgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLmNvbWJpbmF0aW9uUnVsZSk7CiAgICAgIHRoaXMuY29tYmluYXRpb25SdWxlID0gY29tYmluYXRpb25SdWxlOwogICAgICB2YXIgdHJlZUFsaWFzID0gY29tYmluYXRpb25SdWxlLmxlZnRUcmVlOwogICAgICAvL+iOt+WPluWvueivneahhuaVsOaNrgogICAgICByZXEuZ2V0KCcke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldEJ5QWxpYXM/YWxpYXM9JyArIHRyZWVBbGlhcykudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgIHZhciB0cmVlRGlhbG9nID0gcmVzcC5kYXRhOwogICAgICAgIF90aGlzMTIubGVmdFRyZWVUaXRsZSA9IHRyZWVEaWFsb2cubmFtZTsKICAgICAgICB2YXIgcmVxUGFyYW0gPSB7fTsKICAgICAgICB2YXIgcmVxdWVzdFR5cGUgPSB0cmVlRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScgPyAnR0VUJyA6IHRyZWVEaWFsb2cucmVxdWVzdFR5cGUgPyB0cmVlRGlhbG9nLnJlcXVlc3RUeXBlIDogJ1BPU1QnOwogICAgICAgIHZhciB1cmwgPSAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0nICsgdHJlZUFsaWFzICsgIiZtYXBQYXJhbT0iOwogICAgICAgIHZhciBwYXJhbXNPYmogPSB7fTsKICAgICAgICBpZiAodHJlZURpYWxvZy5kc1R5cGUgIT0gJ2RhdGFTb3VyY2UnKSB7CiAgICAgICAgICB1cmwgPSB0cmVlRGlhbG9nLnVybDsKICAgICAgICAgIHZhciB0ZW1wbGF0ZVBhID0gdHJlZURpYWxvZy5kYXRhUGFyYW07CiAgICAgICAgICBpZiAodHJlZURpYWxvZy5jb25kaXRpb25maWVsZCkgewogICAgICAgICAgICB2YXIgY29uZGl0aW9ucyA9IEpTT04ucGFyc2UodHJlZURpYWxvZy5jb25kaXRpb25maWVsZCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZGl0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIHZhciBjb24gPSBjb25kaXRpb25zW2ldOwogICAgICAgICAgICAgIGlmIChyZXF1ZXN0VHlwZSA9PSAnUE9TVCcpIHsKICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7CiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGEgPSB0ZW1wbGF0ZVBhLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFx7JyArIGNvbi5maWVsZCArICdcXH0nLCAnZycpLCBjb24uZGVmYXVsdFZhbHVlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHBhcmFtc09ialtjb24uZmllbGRdID0gY29uLmRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGxqQ2hhciA9IHVybC5pbmRleE9mKCc/JykgPT0gLTEgPyAnPycgOiAnJic7CiAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyBsakNoYXIgKyBjb24uZmllbGQgKyAnPScgKyBjb24uZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGVtcGxhdGVQYSkgewogICAgICAgICAgICAgIHBhcmFtc09iaiA9IEpTT04ucGFyc2UodGVtcGxhdGVQYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIHJlcXVlc3RQYXJhbXMgPSB7fTsKICAgICAgICByZXF1ZXN0UGFyYW1zLnJlcXVlc3RUeXBlID0gcmVxdWVzdFR5cGU7CiAgICAgICAgcmVxdWVzdFBhcmFtcy51cmwgPSB1cmw7CiAgICAgICAgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmogPSBwYXJhbXNPYmo7CiAgICAgICAgX3RoaXMxMi4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9nZXRUcmVlRGF0YScsIHJlcXVlc3RQYXJhbXMpLnRoZW4oZnVuY3Rpb24gKHJlc3ApIHsKICAgICAgICAgIGlmICh0cmVlRGlhbG9nLmRpc3BsYXlmaWVsZCAmJiB0cmVlRGlhbG9nLnJlc3VsdGZpZWxkKSB7CiAgICAgICAgICAgIHZhciBkaXNwbGF5RmllbGQgPSBKU09OLnBhcnNlKHRyZWVEaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICAgICAgdmFyIHJlc3VsdGZpZWxkID0gSlNPTi5wYXJzZSh0cmVlRGlhbG9nLnJlc3VsdGZpZWxkKTsKICAgICAgICAgICAgX3RoaXMxMi5kZWZhdWx0UHJvcHMubGFiZWwgPSBkaXNwbGF5RmllbGQuZGlzcGxheU5hbWU7CiAgICAgICAgICAgIF90aGlzMTIudHJlZUxpc3QgPSByZXNwOwogICAgICAgICAgICBfdGhpczEyLmNvbWJpVHJlZURpc3BsYXlGaWVsZCA9IGRpc3BsYXlGaWVsZDsKICAgICAgICAgICAgX3RoaXMxMi5jb21iaW5hdGlvblRyZWVEYXRhID0gX3RoaXMxMi50b1RyZWVEYXRhKHJlc3AsIGRpc3BsYXlGaWVsZC5pZCwgZGlzcGxheUZpZWxkLnBpZCwgZGlzcGxheUZpZWxkLmRpc3BsYXlOYW1lLCBkaXNwbGF5RmllbGQucHZhbHVlID8gZGlzcGxheUZpZWxkLnB2YWx1ZSA6ICcwJywgcmVzdWx0ZmllbGQpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0sCiAgICBjb21iaVRyZWVDbGljazogZnVuY3Rpb24gY29tYmlUcmVlQ2xpY2socGFyYW1PYmosIG5vZGUsIG5vZGVDb21wb25lbnQpIHsKICAgICAgLy/nu4TlkIjlr7nor53moYbngrnlh7vlt6bmoJEKICAgICAgLy/muIXnqbrml6fnmoQKICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMuc3BsaWNlKDApOwogICAgICB2YXIgY29tYmluYXRpb25SdWxlID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5jb21iaW5hdGlvblJ1bGUpOwogICAgICBpZiAoIWNvbWJpbmF0aW9uUnVsZS5ydWxlcyB8fCBjb21iaW5hdGlvblJ1bGUucnVsZXMubGVuZ3RoID09IDApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIHJ1bGVzID0gY29tYmluYXRpb25SdWxlLnJ1bGVzOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHZhbHVlID0gcGFyYW1PYmpbcnVsZXNbaV0udHJlZUZpZWxkXTsKICAgICAgICB2YXIgcHJvcGVydHkgPSBydWxlc1tpXS5saXN0RmllbGQ7CiAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMucHVzaCh7CiAgICAgICAgICBwcm9wZXJ0eTogcHJvcGVydHksCiAgICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgICBncm91cDogInRyZWVHcm91cCIsCiAgICAgICAgICBvcGVyYXRpb246IHRoaXMuZ2V0T3BlcmF0aW9uKHJ1bGVzW2ldLmNvbmRpdGlvbiksCiAgICAgICAgICByZWxhdGlvbjogIkFORCIKICAgICAgICB9KTsKICAgICAgfQogICAgICB0aGlzLnNlYXJjaCgpOwogICAgfSwKICAgIC8v6I635Y+W6L+Q566X56ym5Y+3CiAgICBnZXRPcGVyYXRpb246IGZ1bmN0aW9uIGdldE9wZXJhdGlvbihvbGQpIHsKICAgICAgaWYgKCFvbGQpIHsKICAgICAgICByZXR1cm4gIiI7CiAgICAgIH0KICAgICAgaWYgKG9sZCA9PSAiRVEiKSB7CiAgICAgICAgcmV0dXJuICJFUVVBTCI7CiAgICAgIH0KICAgICAgaWYgKG9sZCA9PSAiTEsiKSB7CiAgICAgICAgcmV0dXJuICJMSUtFIjsKICAgICAgfQogICAgICBpZiAob2xkID09ICJMRksiKSB7CiAgICAgICAgcmV0dXJuICJMSUtFIjsKICAgICAgfQogICAgICBpZiAob2xkID09ICJJTiIpIHsKICAgICAgICByZXR1cm4gIklOIjsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZVRyZWU6IGZ1bmN0aW9uIHRvZ2dsZVRyZWUoKSB7CiAgICAgIGlmICh0aGlzLnRyZWVTaG93KSB7CiAgICAgICAgdGhpcy50cmVlU2hvdyA9IGZhbHNlOwogICAgICAgIHRoaXMudHJhbnN0aW9uV2lkdGggPSAiMCUiOwogICAgICAgIHRoaXMudG9nZ2xlQnRuID0gImVsLWljb24tYXJyb3ctcmlnaHQiOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMudHJlZVNob3cgPSB0cnVlOwogICAgICAgIHRoaXMudHJhbnN0aW9uV2lkdGggPSAiMjUlIjsKICAgICAgICB0aGlzLnRvZ2dsZUJ0biA9ICJlbC1pY29uLWFycm93LWxlZnQiOwogICAgICB9CiAgICB9CiAgfQp9Ow=="},null]}