{"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\\EipHotTable.vue?vue&type=script&lang=js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\eipControl\\EipHotTable.vue","mtime":1733309211891},{"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},{"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:aW1wb3J0IF9yZWFkT25seUVycm9yIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2RhdGFTaGFyZS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9yZWFkT25seUVycm9yLmpzIjsKaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAiRDovamVua2lucy93b3Jrc3BhY2UvZGF0YVNoYXJlLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDIuanMiOwppbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2RhdGFTaGFyZS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheS5qcyI7CmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSAiRDovamVua2lucy93b3Jrc3BhY2UvZGF0YVNoYXJlLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuam9pbi5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnB1c2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5uYW1lLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5mb3ItZWFjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWludC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci50by1maXhlZC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5rZXlzLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRlc3QuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuYm9sZC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMiOwovLwovLwovLwovLwovLwovLwoKaW1wb3J0IHV0aWxzIGZyb20gIkAvdXRpbHMuanMiOwppbXBvcnQgRm9ybU1hdGggZnJvbSAiQC9tYXRoLmpzIjsKaW1wb3J0IHsgSG90VGFibGUgfSBmcm9tICJAaGFuZHNvbnRhYmxlL3Z1ZSI7CmltcG9ydCBTdWJEYXRhRGV0YWlsIGZyb20gIkAvY29tcG9uZW50cy9mbG93L1N1YkRhdGFEZXRhaWwudnVlIjsKaW1wb3J0ICJoYW5kc29udGFibGUvZGlzdC9oYW5kc29udGFibGUuZnVsbC5jc3MiOwppbXBvcnQgSGFuZHNvbnRhYmxlIGZyb20gImhhbmRzb250YWJsZSI7CmltcG9ydCAiaGFuZHNvbnRhYmxlL2xhbmd1YWdlcy96aC1DTiI7CmV4cG9ydCBkZWZhdWx0IHsKICBuYW1lOiAiZWlwLWhvdC10YWJsZSIsCiAgcHJvcHM6IHsKICAgIG9wdGlvbnM6IFN0cmluZywKICAgIGluaXRjb25mOiBTdHJpbmcsCiAgICBwZXJtaXNzaW9uOiBPYmplY3QsCiAgICBpc0luaXRUZW1wbGF0ZURhdGE6IFN0cmluZywKICAgIGluaXRGaWxsRGF0YVR5cGU6IFN0cmluZywKICAgIGFkZEluaXRUZW1wbGF0ZURhdGE6IFN0cmluZywKICAgIC8v5YWB6K645re75Yqg5Yid5aeL5YyW5pWw5o2uCiAgICBpbml0U3VtUm93OiBTdHJpbmcsCiAgICAvL+WIneWni+WMlue7n+iuoeihjAogICAgbmFtZTogU3RyaW5nCiAgfSwKICBjb21wb25lbnRzOiB7CiAgICBIb3RUYWJsZTogSG90VGFibGUsCiAgICBTdWJEYXRhRGV0YWlsOiBTdWJEYXRhRGV0YWlsCiAgfSwKICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkgewogICAgcmV0dXJuIHsKICAgICAgcm9vdDogJ2hvdC10YWJsZScsCiAgICAgIG15UmVuZGVyZXI6IHRoaXMucmVuZGVyZXJNZSwKICAgICAgc3ViVGFibGVQYXRoOiAnJywKICAgICAgZm9ybUZpZWxkczogW10sCiAgICAgIGZvcm1JZDogJycsCiAgICAgIGhvdFNldHRpbmdzOiBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHsKICAgICAgICBkYXRhOiBbCiAgICAgICAgLy/mlbDmja7lj6/ku6XmmK/kuoznu7TmlbDnu4TvvIzkuZ/lj6/ku6XmmK/mlbDnu4Tlr7nosaEKICAgICAgICBbXV0sCiAgICAgICAgY2xhc3NOYW1lOiAiaHRDZW50ZXIgaHRNaWRkbGUiLAogICAgICAgIC8v5Y2V5YWD5qC85paH5a2X5a+56b2Q5pa55byPKGh0TGVmdCxodFJpZ2h0LGh0Q2VudGVyKQogICAgICAgIGN1cnJlbnRSb3dDbGFzc05hbWU6ICJteS1zZWxlY3RSb3ciLAogICAgICAgIC8v57uZ6YCJ5Lit6KGM5re75Yqg6Ieq5a6a5LmJY2xhc3PnsbvlkI0KICAgICAgICBjdXJyZW50Q29sQ2xhc3NOYW1lOiAibXktc2VsZWN0Q29sIiwKICAgICAgICAvL+e7memAieS4reWIl+a3u+WKoOiHquWumuS5iWNsYXNz57G75ZCNCiAgICAgICAgYXV0b1dyYXBSb3c6IHRydWUsCiAgICAgICAgLy/mloflrZfmmK/lkKboh6rliqjmjaLooYwo5b2T5rKh5pyJ6K6+572uY29sV2lkdGhz5pe255Sf5pWIKQogICAgICAgIGZpeGVkQ29sdW1uc0xlZnQ6IDEsCiAgICAgICAgLy/lm7rlrprlt6bovrnliJfmlbAKICAgICAgICBmaXhlZFJvd3NUb3A6IDAsCiAgICAgICAgLy/lm7rlrprkuIrovrnliJfmlbAKICAgICAgICAvLyBmaWxsSGFuZGxlOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+aLluaLveWkjeWItuaTjeS9nCh0cnVlLGZhbHNlLCdob3Jpem9udGFsJ+awtOW5s+WkjeWItiwndmVydGljYWwn5Z6C55u05aSN5Yi2KQogICAgICAgIGF1dG9Sb3dTaXplOiBmYWxzZSwKICAgICAgICBhdXRvQ29sdW1uU2l6ZTogdHJ1ZSwKICAgICAgICAvLyBoaWdobGlnaHRlZFJvd3M6W10sCiAgICAgICAgLy8gcmVhZE9ubHk6dHJ1ZSwKICAgICAgICAvLyBjb21tZW50czogdHJ1ZSwKICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgIGhlaWdodDogIjgwdmgiLAogICAgICAgIHN0cmV0Y2hIOiAnYWxsJywKICAgICAgICBsYW5ndWFnZTogInpoLUNOIiwKICAgICAgICBjb2xIZWFkZXJzOiB0cnVlLAogICAgICAgIC8vWydBJywgJ0InLCAnQyddLCAvL+aYr+WQpuWxleekuuWIl+ihqOWktCzpu5jorqTmmK9BLEIsQ+etieWtl+avjSzlj6/ku6VbJ+WIlzEnLCfliJcyJ13ov5vooYzoh6rlrprkuYnlsZXnpLoKICAgICAgICByb3dIZWFkZXJzOiB0cnVlLAogICAgICAgIC8v5piv5ZCm5bGV56S66KGM6KGo5aS0LOm7mOiupOaYrzEsMiwz562J5pWw5o2uLOWPr+S7pVsn6KGMMScsJ+ihjDInXei/m+ihjOiHquWumuS5ieWxleekugogICAgICAgIGNvbnRleHRNZW51OiB7CiAgICAgICAgICBpdGVtczoge30KICAgICAgICB9LAogICAgICAgIGxpY2Vuc2VLZXk6ICJub24tY29tbWVyY2lhbC1hbmQtZXZhbHVhdGlvbiIsCiAgICAgICAgbWVyZ2VDZWxsczogdHJ1ZSwKICAgICAgICAvL2NvbnRleHRNZW51OiB0cnVlLAogICAgICAgIHdvcmRXcmFwOiB0cnVlLAogICAgICAgIC8v6Ieq5Yqo5o2i6KGMCiAgICAgICAgLy8gbWVyZ2VDZWxsczogdHJ1ZSwKICAgICAgICAvLyBtYW51YWxDb2x1bW5GcmVlemU6IHRydWUsIC8v5omL5Yqo5Zu65a6a5YiXICA/CiAgICAgICAgLy8gbWFudWFsQ29sdW1uTW92ZTogdHJ1ZSwgLy/miYvliqjnp7vliqjliJcKICAgICAgICAvLyBtYW51YWxSb3dNb3ZlOiB0cnVlLCAgIC8v5omL5Yqo56e75Yqo6KGMCiAgICAgICAgbWFudWFsQ29sdW1uUmVzaXplOiB0cnVlLAogICAgICAgIC8v5omL5bel5pu05pS55YiX6LedCiAgICAgICAgbWFudWFsUm93UmVzaXplOiB0cnVlLAogICAgICAgIC8v5omL5Yqo5pu05pS56KGM6LedCiAgICAgICAgLy8gY29tbWVudHM6IHRydWUsIC8v5re75Yqg5rOo6YeKICAKICAgICAgICAvLyBjdXN0b21Cb3JkZXJzOltdLC8v5re75Yqg6L655qGGCiAgICAgICAgY29sdW1uU29ydGluZzogZmFsc2UsCiAgICAgICAgLy8gc3RyZXRjaEg6ICdhbGwnLC8v5qC55o2u5a695bqm5qiq5ZCR5omp5bGV77yMbGFzdDrlj6rmianlsZXmnIDlkI7kuIDliJfvvIxub25l77ya6buY6K6k5LiN5omp5bGVCiAgICAgICAgLy8gZmlsbEhhbmRsZTogdHJ1ZSwgLy/pgInkuK3mi5bmi73lpI3liLYgcG9zc2libGUgdmFsdWVzOiB0cnVlLCBmYWxzZSwgImhvcml6b250YWwiLCAidmVydGljYWwiCiAgICAgICAgLy8gZml4ZWRDb2x1bW5zTGVmdDogMSwvL+WbuuWumuW3pui+ueWIl+aVsAogICAgICAgIC8vIGZpeGVkUm93c1RvcDogMCwvL+WbuuWumuS4iui+ueWIl+aVsAogICAgICAgIC8vIGJlZm9yZVJlbW92ZVJvdzogdGhpcy5iZWZvcmVSZW1vdmVSb3dNZSwKICAgICAgICBhZnRlckNyZWF0ZVJvdzogdGhpcy5hZnRlckNyZWF0ZVJvd01lLAogICAgICAgIGFmdGVyQ2hhbmdlOiB0aGlzLmFmdGVyQ2hhbmdlTWUsCiAgICAgICAgYWZ0ZXJTZWxlY3Rpb25FbmQ6IHRoaXMuYWZ0ZXJTZWxlY3Rpb25FbmRNZSwKICAgICAgICByZW5kZXJlcjogdGhpcy5yZW5kZXJlck1lLAogICAgICAgIGNlbGxzOiB0aGlzLmNlbGxzTWUsCiAgICAgICAgYWZ0ZXJMb2FkRGF0YTogdGhpcy5hZnRlckxvYWREYXRhTWUKICAgICAgfSwgIm1lcmdlQ2VsbHMiLCBbLy/lkIjlubYKICAgICAgICAvLyB7cm93OiAxLCBjb2w6IDEsIHJvd3NwYW46IDMsIGNvbHNwYW46IDN9LCAgLy/mjIflrprlkIjlubbvvIzku47vvIgxLDHvvInlvIDlp4vooYwz5YiXM+WQiOW5tuaIkOS4gOagvAogICAgICAgIC8vIHtyb3c6IDMsIGNvbDogNCwgcm93c3BhbjogMiwgY29sc3BhbjogMn0KICAgICAgXSksICJjb2x1bW5zIiwgW10pLCAiaGlkZGVuQ29sdW1ucyIsIHsKICAgICAgICBjb3B5UGFzdGVFbmFibGVkOiB0cnVlLAogICAgICAgIGluZGljYXRvcnM6IHRydWUsCiAgICAgICAgY29sdW1uczogW10KICAgICAgfSksICJuZXN0ZWRIZWFkZXJzIiwgbnVsbCksICJmb3JtdWxhcyIsIGZhbHNlKSwKICAgICAgbWF0aEV4cE1hcDoge30sCiAgICAgIHJvd01hdGhFeHBNYXA6IHt9LAogICAgICBtYXRoRXhwSXRlbU1hcDoge30sCiAgICAgIGluaXRDdXN0RGlhbG9nQ29uZjoge30sCiAgICAgIGN1c3RvbURpYWxvZzoge30sCiAgICAgIGZpbGxPcmc6IHt9LAogICAgICByZWFkT25seUNvbHVtbk1hcDoge30sCiAgICAgIGNlbGxTdHlsZU1hcDoge30sCiAgICAgIC8v5YiX5qC35byPCiAgICAgIG1hdGhSb3dDZWxsTWFwOiB7fSwKICAgICAgLy/orqHnrpfljZXlhYPmoLwKICAgICAgYWxsTWF0aEV4cExpc3Q6IHt9LAogICAgICAvL+aJgOacieS4juiuoeeul+ebuOWFs+eahOWIlwogICAgICBjcm9zc01hcHBpbmdzOiB7fSwKICAgICAgLy/ot6jooajlj5bmlbDorr7nva4KICAgICAgY3Jvc3NNYXBwaW5nU3ViVGFibGVzOiBbXSwKICAgICAgLy/ooqvlj5bmlbDnmoTlrZDooagKICAgICAgbWFpbkZpZWxkTWF0aE1hcDoge30sCiAgICAgIC8v5raJ5Y+K5Li76KGo6K6h566X5YWs5byPCiAgICAgIGluaXRSb3dEYXRhOiB7fSwKICAgICAgYWxsUm93TWF0aE1hcDoge30sCiAgICAgIC8v6Leo6KGM6L+Q566X5YWs5byPCiAgICAgIGZpcnN0U3VtTWFwOiB7fSwKICAgICAgLy/pppbooYzmsYfmgLsKICAgICAgaW5zdElkOiAnJywKICAgICAgLy/mtYHnqIvlrp7kvotJRAogICAgICBkZWZJZDogJycsCiAgICAgIC8v5rWB56iL5a6a5LmJSUQKICAgICAgaW5pdERhdGFCYWNrOiBbXSwKICAgICAgLy/liJ3lp4vljJbmlbDmja7lpIfku70KICAgICAgaW5pdFN1bVJvd0ZpZWxkOiAnJywKICAgICAgLy/nu5/orqHooYzmoIfnrb7lrZfmrrUKICAgICAgaW5pdFN1bVJvd1ZhbHVlOiAnJywKICAgICAgLy/nu5/orqHooYzmoIfnrb7lrZfmrrXlgLwKICAgICAgY3Jvc3NNYXBwaW5nRmllbGRzOiB7fSwKICAgICAgLy/ot6jooajlj5bmlbDljZXlhYPmoLwKICAgICAgbWVyZ2VDZWxsRmllbGQ6ICcnLAogICAgICAvL+WQiOW5tuWNleWFg+agvOWIlwogICAgICByZWFkT25seVJvd3NNYXA6IHt9LAogICAgICAvL+WNleWFg+agvOWPquivu+iuvue9rgogICAgICBjZWxsQ2FsY3M6IFtdLAogICAgICAvL+WNleWFg+agvOiuoeeul+WFrOW8jwogICAgICByZXF1aXJlZFJvd3NNYXA6IHt9LAogICAgICAvL+W/heWhq+iuvue9ru+8jOaPkOS6pOaXtuagoemqjAogICAgICBmaWVsZE5hbWVNYXA6IHt9CiAgICB9OwogIH0sCiAgY29tcHV0ZWQ6IHsKICAgIGhvdEluc3RhbmNlOiBmdW5jdGlvbiBob3RJbnN0YW5jZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuJHJlZnMuaG90dGFibGUuaG90SW5zdGFuY2U7CiAgICB9CiAgfSwKICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkgewogICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICB2YXIgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7CiAgICBpZiAoZm9ybUluc3QgJiYgZm9ybUluc3QuJHBhcmVudCkgewogICAgICB2YXIgY29sdW1uU29ydCA9IHRydWU7CiAgICAgIGlmIChmb3JtSW5zdC4kcGFyZW50Lmluc3RJZCkgewogICAgICAgIHRoaXMuaW5zdElkID0gZm9ybUluc3QuJHBhcmVudC5pbnN0SWQ7CiAgICAgICAgY29sdW1uU29ydCA9IGZhbHNlOwogICAgICB9CiAgICAgIGlmIChmb3JtSW5zdC4kcGFyZW50LmRlZklkKSB7CiAgICAgICAgdGhpcy5kZWZJZCA9IGZvcm1JbnN0LiRwYXJlbnQuZGVmSWQ7CiAgICAgICAgY29sdW1uU29ydCA9IGZhbHNlOwogICAgICB9CiAgICAgIC8v5rWB56iL5Lit5LiN5YWB6K645o6S5bqP77yM5Zyo5Z+656GA5pWw5o2u57u05oqk5Lit5YWB6K645o6S5bqPCiAgICAgIHRoaXMuaG90U2V0dGluZ3MuY29sdW1uU29ydGluZyA9IGNvbHVtblNvcnQ7CiAgICB9CiAgICBpZiAodGhpcy5vcHRpb25zKSB7CiAgICAgIHZhciBvcHRpb25zSm9uID0gSlNPTi5wYXJzZSh0aGlzLm9wdGlvbnMpOwogICAgICB0aGlzLnN1YlRhYmxlUGF0aCA9IG9wdGlvbnNKb24uc3ViVGFibGVQYXRoOwogICAgICB2YXIgcmVsYXRpb25zID0gb3B0aW9uc0pvbi5jb2xIZWFkZXJzUmVsYXRpb25zOwogICAgICB2YXIgaXNNYXRoRXhwID0gZmFsc2U7IC8v5piv5ZCm5YyF5ZCr6K6h566X5YWs5byPCiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIGlmIChvcHRpb25zSm9uLmluaXRTdW1Sb3dGaWVsZCkgewogICAgICAgIHRoaXMuaW5pdFN1bVJvd0ZpZWxkID0gb3B0aW9uc0pvbi5pbml0U3VtUm93RmllbGQ7CiAgICAgIH0KICAgICAgaWYgKG9wdGlvbnNKb24uaW5pdFN1bVJvd1ZhbHVlKSB7CiAgICAgICAgdGhpcy5pbml0U3VtUm93VmFsdWUgPSBvcHRpb25zSm9uLmluaXRTdW1Sb3dWYWx1ZTsKICAgICAgfQogICAgICAvL+iuvue9ruaOp+S7tumrmOW6pgogICAgICBpZiAob3B0aW9uc0pvbi5oZWlnaHQpIHsKICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmhlaWdodCA9IG9wdGlvbnNKb24uaGVpZ2h0ICsgJ3ZoJzsKICAgICAgfQogICAgICAvL+aUtumbhuWNleWFg+agvOiuoeeul+WFrOW8jwogICAgICBpZiAob3B0aW9uc0pvbi5jZWxsQ2FsY3MgJiYgb3B0aW9uc0pvbi5jZWxsQ2FsY3MubGVuZ3RoID4gMCkgewogICAgICAgIHRoaXMuY2VsbENhbGNzID0gX3RvQ29uc3VtYWJsZUFycmF5KG9wdGlvbnNKb24uY2VsbENhbGNzKTsKICAgICAgICAvL+iuoeeul+WNleWFg+agvOWPquivuwogICAgICAgIHRoaXMuY2VsbENhbGNzLmZvckVhY2goZnVuY3Rpb24gKGNlbGxDYWxjKSB7CiAgICAgICAgICB2YXIgZmllbGROYW1lID0gY2VsbENhbGMuY2VsbEZpZWxkLnNwbGl0KCcuJylbMl07CiAgICAgICAgICBfdGhpcy5yZWFkT25seVJvd3NNYXBbZmllbGROYW1lICsgJ18nICsgKGNlbGxDYWxjLnJvd0luZGV4IC0gMSldID0gdHJ1ZTsKICAgICAgICB9KTsKICAgICAgfQogICAgICAvL+aUtumbhuihqOWktOOAgeWIl+WQiOW5tuWNleWFg+agvOOAgeiuoeeul+WFrOW8j+OAgeWtl+auteadg+mZkOetiQogICAgICBpZiAocmVsYXRpb25zICYmIHJlbGF0aW9ucy5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIGhvdEZpZWxkUGVybWlzc2lvbiA9IHRoaXMucGVybWlzc2lvbiA/IHRoaXMucGVybWlzc2lvblsnZmllbGRzJ11bb3B0aW9uc0pvbi5ib1N1YkVudGl0eV0gOiBbXTsKICAgICAgICB2YXIgaGVhZGVycyA9IFtdOwogICAgICAgIHZhciBjb2x1bW5zID0gW107CiAgICAgICAgdmFyIGRhdGFMaXN0ID0gW1tdXTsKICAgICAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCgpIHsKICAgICAgICAgIHZhciByZWxhdGlvbiA9IHJlbGF0aW9uc1tpbmRleF07CiAgICAgICAgICBfdGhpczIuZmllbGROYW1lTWFwW3JlbGF0aW9uLm5hbWVdID0gcmVsYXRpb24uZGVzYzsKICAgICAgICAgIGhlYWRlcnMucHVzaChyZWxhdGlvbi5kZXNjKTsKICAgICAgICAgIF90aGlzLmluaXRSb3dEYXRhW3JlbGF0aW9uLm5hbWVdID0gJyc7CiAgICAgICAgICB2YXIgY29sdW1uID0gcmVsYXRpb24uY29sdW1uOwogICAgICAgICAgY29sdW1uLmNsYXNzTmFtZSA9ICdodExlZnQnOwogICAgICAgICAgaWYgKGNvbHVtbi50eXBlID09ICdkcm9wZG93bicgJiYgQXJyYXkuaXNBcnJheShjb2x1bW4uc291cmNlKSAmJiBjb2x1bW4uc291cmNlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgdmFyIHNvdXJjZUFycmF5ID0gW107CiAgICAgICAgICAgIGNvbHVtbi5zb3VyY2UuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgIGlmIChpdGVtLnZhbHVlICE9ICcnICYmIGl0ZW0udmFsdWUgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgIHNvdXJjZUFycmF5LnB1c2goaXRlbS52YWx1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29sdW1uLnNvdXJjZSA9IHNvdXJjZUFycmF5OwogICAgICAgICAgfQogICAgICAgICAgLy/mlLbpm4borqHnrpflhazlvI8KICAgICAgICAgIGlmIChjb2x1bW4ubWF0aEV4cCkgewogICAgICAgICAgICBfdGhpczIuaW5pdE1hdGhNYXAoY29sdW1uKTsKICAgICAgICAgICAgaXNNYXRoRXhwID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjb2x1bW4ucm93TWF0aEV4cCAmJiBBcnJheS5pc0FycmF5KGNvbHVtbi5yb3dNYXRoRXhwKSAmJiBjb2x1bW4ucm93TWF0aEV4cC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIF90aGlzMi5pbml0Um93TWF0aE1hcChjb2x1bW4pOwogICAgICAgICAgICBpc01hdGhFeHAgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgLy/mlLbpm4blkIjlubbliJcKICAgICAgICAgIGlmIChjb2x1bW4ubWVyZ2VDZWxsID09PSB0cnVlKSB7CiAgICAgICAgICAgIHZhciBjZWxsRmllbGQgPSB7CiAgICAgICAgICAgICAgZmllbGQ6IGNvbHVtbi5kYXRhLAogICAgICAgICAgICAgIGluZGV4OiBpbmRleAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIV90aGlzMi5tZXJnZUNlbGxGaWVsZCkgewogICAgICAgICAgICAgIF90aGlzMi5tZXJnZUNlbGxGaWVsZCA9IF9vYmplY3RTcHJlYWQoe30sIGNlbGxGaWVsZCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX3RoaXMyLmFkZENlbGxGaWVsZENoaWxkcmVuKF90aGlzMi5tZXJnZUNlbGxGaWVsZCwgY2VsbEZpZWxkKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgLy/lupTnlKjmtYHnqIvooajljZXmnYPpmZAKICAgICAgICAgIGlmIChob3RGaWVsZFBlcm1pc3Npb25bY29sdW1uLmRhdGFdID09ICdyJykgewogICAgICAgICAgICBjb2x1bW4ucmVhZE9ubHkgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIGlmIChob3RGaWVsZFBlcm1pc3Npb25bY29sdW1uLmRhdGFdID09ICduJykgewogICAgICAgICAgICBfdGhpczIuaG90U2V0dGluZ3MuaGlkZGVuQ29sdW1ucy5jb2x1bW5zLnB1c2goaW5kZXgpOwogICAgICAgICAgfSBlbHNlIGlmIChob3RGaWVsZFBlcm1pc3Npb25bY29sdW1uLmRhdGFdID09ICdiJykgewogICAgICAgICAgICBjb2x1bW4ucmVxdWlyZWQgPSB0cnVlOwogICAgICAgICAgICBfdGhpczIucmVxdWlyZWRSb3dzTWFwW2NvbHVtbi5kYXRhXSA9IHRydWU7CiAgICAgICAgICB9CgogICAgICAgICAgLy/mlLbpm4blj6ror7sKICAgICAgICAgIGlmIChjb2x1bW4ucmVhZE9ubHkpIHsKICAgICAgICAgICAgX3RoaXMyLnJlYWRPbmx5Q29sdW1uTWFwW2luZGV4XSA9IHsKICAgICAgICAgICAgICBmaWVsZDogY29sdW1uLmRhdGEsCiAgICAgICAgICAgICAgZGVzYzogcmVsYXRpb24uZGVzYwogICAgICAgICAgICB9OwogICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4ucmVhZE9ubHlSb3dzKSB7CiAgICAgICAgICAgIC8v5Y2V5YWD5qC85Y+q6K+7CiAgICAgICAgICAgIHZhciByZWFkT25seVJvd3MgPSBjb2x1bW4ucmVhZE9ubHlSb3dzLnNwbGl0KCcsJyk7CiAgICAgICAgICAgIHJlYWRPbmx5Um93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3dJbmRleCkgewogICAgICAgICAgICAgIF90aGlzLnJlYWRPbmx5Um93c01hcFtjb2x1bW4uZGF0YSArICdfJyArIChyb3dJbmRleCAtIDEpXSA9IHRydWU7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQoKICAgICAgICAgIC8v5pS26ZuG5b+F5aGrCiAgICAgICAgICBpZiAoY29sdW1uLnJlcXVpcmVkKSB7CiAgICAgICAgICAgIF90aGlzMi5yZXF1aXJlZFJvd3NNYXBbY29sdW1uLmRhdGFdID0gewogICAgICAgICAgICAgIGFsbDogdHJ1ZQogICAgICAgICAgICB9OwogICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4ucmVxdWlyZWRSb3dzKSB7CiAgICAgICAgICAgIC8v5Y2V5YWD5qC85b+F5aGrCiAgICAgICAgICAgIHZhciByZXF1aXJlZFJvd3MgPSBjb2x1bW4ucmVxdWlyZWRSb3dzLnNwbGl0KCcsJyk7CiAgICAgICAgICAgIF90aGlzLnJlcXVpcmVkUm93c01hcFtjb2x1bW4uZGF0YV0gPSB7CiAgICAgICAgICAgICAgYWxsOiBmYWxzZSwKICAgICAgICAgICAgICByb3dzOiByZXF1aXJlZFJvd3MKICAgICAgICAgICAgfTsKICAgICAgICAgIH0KCiAgICAgICAgICAvL+aUtumbhuWIl+agt+W8jwogICAgICAgICAgX3RoaXMyLmhhbmRDZWxsU3R5bGUoY29sdW1uKTsKCiAgICAgICAgICAvL+aUtumbhummluihjOaxh+aAuwogICAgICAgICAgaWYgKHJlbGF0aW9uLmlzU3VtID09IHRydWUpIHsKICAgICAgICAgICAgX3RoaXMyLmZpcnN0U3VtTWFwW3JlbGF0aW9uLm5hbWVdID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW4pOwogICAgICAgIH07CiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHJlbGF0aW9ucy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgIF9sb29wKCk7CiAgICAgICAgfQogICAgICAgIC8v5pS26ZuG6Leo6KGo5Y+W5pWw6K6+572uCiAgICAgICAgdmFyIGNyb3NzTWFwcGluZyA9IG9wdGlvbnNKb24uY3Jvc3NNYXBwaW5nOwogICAgICAgIGlmIChjcm9zc01hcHBpbmcgJiYgQXJyYXkuaXNBcnJheShjcm9zc01hcHBpbmcpICYmIGNyb3NzTWFwcGluZy5sZW5ndGggPiAwKSB7CiAgICAgICAgICB2YXIgc3ViVGFibGVNYXAgPSB7fTsKICAgICAgICAgIGNyb3NzTWFwcGluZy5mb3JFYWNoKGZ1bmN0aW9uIChjcm9zc01hcCkgewogICAgICAgICAgICB2YXIgY2Zyb21GaWVsZHMgPSBjcm9zc01hcC5mcm9tRmllbGRzOwogICAgICAgICAgICBpZiAoY3Jvc3NNYXAudG9GaWVsZCAmJiBjZnJvbUZpZWxkcyAmJiBBcnJheS5pc0FycmF5KGNmcm9tRmllbGRzKSAmJiBjZnJvbUZpZWxkcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgLy/mlLbpm4bot6jooajlj5bmlbDlrZfmrrXlj4rkvY3nva7vvIjorr7nva7lj6ror7vvvIkKICAgICAgICAgICAgICB2YXIgY3Jvc3NGaWVsZCA9IGNyb3NzTWFwLnRvRmllbGQuc3BsaXQoJy4nKVsyXTsKICAgICAgICAgICAgICBpZiAoIV90aGlzLmNyb3NzTWFwcGluZ0ZpZWxkc1tjcm9zc0ZpZWxkXSkgewogICAgICAgICAgICAgICAgX3RoaXMuY3Jvc3NNYXBwaW5nRmllbGRzW2Nyb3NzRmllbGRdID0ge307CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF90aGlzLmNyb3NzTWFwcGluZ0ZpZWxkc1tjcm9zc0ZpZWxkXVtjcm9zc01hcC50b0luZGV4IC0gMV0gPSB0cnVlOwogICAgICAgICAgICAgIHZhciBzdWJUYWJsZU5hbWUgPSAnJzsKICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGNmcm9tRmllbGRzLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICB2YXIgbWZyb21GaWVsZHMgPSBjZnJvbUZpZWxkc1trXS5mcm9tRmllbGQuc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgIHZhciBzdWJQYXRoID0gbWZyb21GaWVsZHNbMF0gKyAnLicgKyBtZnJvbUZpZWxkc1sxXTsKICAgICAgICAgICAgICAgIGlmICghX3RoaXMuY3Jvc3NNYXBwaW5nc1ttZnJvbUZpZWxkc1sxXV0pIHsKICAgICAgICAgICAgICAgICAgX3RoaXMuY3Jvc3NNYXBwaW5nc1ttZnJvbUZpZWxkc1sxXV0gPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc3ViVGFibGVNYXBbc3ViUGF0aF0pIHsKICAgICAgICAgICAgICAgICAgX3RoaXMuY3Jvc3NNYXBwaW5nU3ViVGFibGVzLnB1c2goc3ViUGF0aCk7CiAgICAgICAgICAgICAgICAgIHN1YlRhYmxlTWFwW3N1YlBhdGhdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN1YlRhYmxlTmFtZSA9IG1mcm9tRmllbGRzWzFdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBfdGhpcy5jcm9zc01hcHBpbmdzW3N1YlRhYmxlTmFtZV0ucHVzaChjcm9zc01hcCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvL+aUtumbhuS4u+ihqOiuoeeul+iuvue9rgogICAgICAgIHRoaXMuaW5pdE1haW5NYXRoTWFwKG9wdGlvbnNKb24ubWFpblRhYmxlQ2FsY3MpOwoKICAgICAgICAvL+aUtumbhuaJgOacieiuoeeul+WFrOW8j+ebuOWFs+WNleWFg+agvOS/oeaBrwogICAgICAgIHRoaXMuaW5pdEFsbE1hdGhGaWVsZCgpOwogICAgICAgIC8v5Yid5aeL5YyW5bWM5aWX6KGo5aS0CiAgICAgICAgdGhpcy5pbml0TmVzdGVkSGVhZGVycyhvcHRpb25zSm9uLCByZWxhdGlvbnMpOwogICAgICAgIHRoaXMuaG90U2V0dGluZ3MuY29sSGVhZGVycyA9IGhlYWRlcnM7CiAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5jb2x1bW5zID0gY29sdW1uczsKICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGEgPSBkYXRhTGlzdDsKICAgICAgICB0aGlzLmhvdFNldHRpbmdzLm1lcmdlQ2VsbHMgPSB0aGlzLmJ1aWxkTWVyZ2VDZWxsKGRhdGFMaXN0KTsKICAgICAgfQogICAgICAvL+WkhOeQhuaWsOWinuWSjOWIoOmZpOadg+mZkAogICAgICB0aGlzLmhhbmRsZXJNZW51KG9wdGlvbnNKb24sIGlzTWF0aEV4cCk7CiAgICAgIC8v6I635Y+W5a2Q6KGo5a2X5q615bGe5oCnCiAgICAgIC8vIHRoaXMuaW5pdEZvcm1GaWVsZHMoKTsKICAgIH0KICAgIGlmICh0aGlzLmluaXRjb25mKSB7CiAgICAgIHZhciBpbml0Q29uZkpzb24gPSBKU09OLnBhcnNlKHRoaXMuaW5pdGNvbmYpOwogICAgICBpZiAoaW5pdENvbmZKc29uKSB7CiAgICAgICAgdGhpcy5pbml0Q3VzdERpYWxvZ0NvbmYgPSBpbml0Q29uZkpzb247CiAgICAgICAgaWYgKGluaXRDb25mSnNvbi5vcmdDb25maWcgJiYgKGluaXRDb25mSnNvbi5vcmdDb25maWcuaWQgfHwgaW5pdENvbmZKc29uLm9yZ0NvbmZpZy5uYW1lIHx8IGluaXRDb25mSnNvbi5vcmdDb25maWcuY29kZSB8fCBpbml0Q29uZkpzb24ub3JnQ29uZmlnLmluc3RJZCkpIHsKICAgICAgICAgIC8v5Yid5aeL5YyW6YOo6Zeo5aGr5Yi25Y2V5L2NCiAgICAgICAgICB0aGlzLmluaXRGaWxsT3JnKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSwKICBtZXRob2RzOiB7CiAgICBhZGRDZWxsRmllbGRDaGlsZHJlbjogZnVuY3Rpb24gYWRkQ2VsbEZpZWxkQ2hpbGRyZW4oZmllbGQsIGNoaWxkcmVuKSB7CiAgICAgIGlmIChmaWVsZC5jaGlsZHJlbikgewogICAgICAgIHJldHVybiB0aGlzLmFkZENlbGxGaWVsZENoaWxkcmVuKGZpZWxkLmNoaWxkcmVuLCBjaGlsZHJlbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmllbGQuY2hpbGRyZW4gPSBjaGlsZHJlbjsKICAgICAgfQogICAgfSwKICAgIGluaXRGaWxsT3JnOiBmdW5jdGlvbiBpbml0RmlsbE9yZygpIHsKICAgICAgdmFyIGN1c3REaWFsb2cgPSB0aGlzLmluaXRDdXN0RGlhbG9nQ29uZjsKICAgICAgdmFyIGN1cnJlbnRVc2VyID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCJjdXJyZW50VXNlciIpKTsKICAgICAgaWYgKGN1c3REaWFsb2cgJiYgY3VzdERpYWxvZy5vcmdDb25maWcgJiYgKGN1c3REaWFsb2cub3JnQ29uZmlnLmlkIHx8IGN1c3REaWFsb2cub3JnQ29uZmlnLm5hbWUgfHwgY3VzdERpYWxvZy5vcmdDb25maWcuY29kZSB8fCBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQpICYmICF0aGlzLmZpbGxPcmcuaWQpIHsKICAgICAgICBpZiAoIWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJjdXJGaWxsT3JnXyIgKyBjdXJyZW50VXNlci5hY2NvdW50KSkgewogICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgIF90aGlzLiRodHRwLmdldCgnJHt1Y30vYXBpL29yZy92MS9vcmcvZ2V0RmlsbE9yZycpLnRoZW4oZnVuY3Rpb24gKHJlc3ApIHsKICAgICAgICAgICAgdmFyIHJlcCA9IHJlc3AuZGF0YTsKICAgICAgICAgICAgaWYgKHJlcC5zdGF0ZSkgewogICAgICAgICAgICAgIF90aGlzLmZpbGxPcmcgPSByZXAudmFsdWU7CiAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImN1ckZpbGxPcmdfIiArIGN1cnJlbnRVc2VyLmFjY291bnQsIEpTT04uc3RyaW5naWZ5KHJlcC52YWx1ZSkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIF90aGlzLiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHJlcC5tZXNzYWdlLAogICAgICAgICAgICAgICAgdHlwZTogIndhcm5pbmciCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICBfdGhpcy5jbG9zZUxvYWRpbmcobG9hZGluZyk7CiAgICAgICAgICAgIF90aGlzLiRtZXNzYWdlKHsKICAgICAgICAgICAgICBtZXNzYWdlOiAi6I635Y+W5b2T5YmN55So5oi35aGr5Yi25Y2V5L2N5aSx6LSl77yBIiwKICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5maWxsT3JnID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiY3VyRmlsbE9yZ18iICsgY3VycmVudFVzZXIuYWNjb3VudCkpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGluaXRNYXRoTWFwOiBmdW5jdGlvbiBpbml0TWF0aE1hcChjb2x1bW4pIHsKICAgICAgLy/mlLbpm4booYzlhoXorqHnrpflhazlvI8KICAgICAgaWYgKGNvbHVtbi5tYXRoRXhwKSB7CiAgICAgICAgLy/mlLbpm4borqHnrpfljZXlhYPmoLwKICAgICAgICB0aGlzLm1hdGhSb3dDZWxsTWFwW2NvbHVtbi5kYXRhXSA9IHt9OwogICAgICAgIHRoaXMubWF0aFJvd0NlbGxNYXBbY29sdW1uLmRhdGFdWy0xXSA9IHRydWU7CiAgICAgICAgdGhpcy5tYXRoRXhwTWFwW2NvbHVtbi5kYXRhXSA9IGNvbHVtbi5tYXRoRXhwOwogICAgICAgIHRoaXMubWF0aEV4cEl0ZW1NYXBbY29sdW1uLmRhdGFdID0ge307CiAgICAgICAgdGhpcy5tYXRoRXhwSXRlbU1hcFtjb2x1bW4uZGF0YV1bY29sdW1uLmRhdGFdID0gY29sdW1uLm1hdGhFeHA7CiAgICAgICAgdmFyIGZpZWxkcyA9IHRoaXMucGFyc2VGdW5jZXhwRmllbGQoY29sdW1uLm1hdGhFeHApOwogICAgICAgIGlmIChmaWVsZHMpIHsKICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHsKICAgICAgICAgICAgdmFyIGZpZWxkQXJyYXkgPSBmaWVsZC5zcGxpdCgnLicpOwogICAgICAgICAgICB2YXIgbmEgPSBmaWVsZEFycmF5WzFdOwogICAgICAgICAgICB2YXIgc2EgPSBmaWVsZEFycmF5WzNdOwogICAgICAgICAgICBpZiAoIV90aGlzLm1hdGhFeHBJdGVtTWFwW25hXSkgewogICAgICAgICAgICAgIF90aGlzLm1hdGhFeHBJdGVtTWFwW25hXSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIF90aGlzLm1hdGhFeHBJdGVtTWFwW25hXVtjb2x1bW4uZGF0YV0gPSBjb2x1bW4ubWF0aEV4cDsKICAgICAgICAgICAgaWYgKCFfdGhpcy5tYXRoRXhwSXRlbU1hcFtzYV0pIHsKICAgICAgICAgICAgICBfdGhpcy5tYXRoRXhwSXRlbU1hcFtzYV0gPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfdGhpcy5tYXRoRXhwSXRlbU1hcFtzYV1bY29sdW1uLmRhdGFdID0gY29sdW1uLm1hdGhFeHA7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBpbml0Um93TWF0aE1hcDogZnVuY3Rpb24gaW5pdFJvd01hdGhNYXAoY29sdW1uKSB7CiAgICAgIC8v5pS26ZuG6Leo6KGM6K6h566X5YWs5byPCiAgICAgIGlmIChjb2x1bW4ucm93TWF0aEV4cCkgewogICAgICAgIHZhciByb3dNYXRoRXhwID0gY29sdW1uLnJvd01hdGhFeHA7CiAgICAgICAgdGhpcy5hbGxSb3dNYXRoTWFwW2NvbHVtbi5kYXRhXSA9IHJvd01hdGhFeHA7CiAgICAgICAgaWYgKCF0aGlzLm1hdGhSb3dDZWxsTWFwW2NvbHVtbi5kYXRhXSkgewogICAgICAgICAgdGhpcy5tYXRoUm93Q2VsbE1hcFtjb2x1bW4uZGF0YV0gPSB7fTsKICAgICAgICB9CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICByb3dNYXRoRXhwLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgIC8v5pS26ZuG6K6h566X5Y2V5YWD5qC8CiAgICAgICAgICBfdGhpcy5tYXRoUm93Q2VsbE1hcFtjb2x1bW4uZGF0YV1baXRlbS5zbiAtIDFdID0gdHJ1ZTsKICAgICAgICAgIHZhciBzdGF0RnVuID0gaXRlbS5tYXRoRXhwOwogICAgICAgICAgdmFyIG15cmVnZXhwID0gL1xbKC4qPylcXS9nOwogICAgICAgICAgdmFyIG1hdGNoID0gbXlyZWdleHAuZXhlYyhzdGF0RnVuKTsKICAgICAgICAgIHZhciBhcnJzID0gW107CiAgICAgICAgICB3aGlsZSAobWF0Y2ggIT0gbnVsbCkgewogICAgICAgICAgICB2YXIgaWR4ID0gbWF0Y2hbMV07CiAgICAgICAgICAgIHZhciBpZGV4VmFsID0gaWR4LmluZGV4T2YoJzonKSA9PSAtMSA/IF90aGlzLnRvTnVtYmVyKGlkeCkgOiBpZHg7CiAgICAgICAgICAgIHZhciBoYXMgPSBmYWxzZTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIHY7IHYgPSBhcnJzW2krK107KSB7CiAgICAgICAgICAgICAgaWYgKHYgPT0gaWRleFZhbCkgaGFzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWhhcykgewogICAgICAgICAgICAgIGFycnMucHVzaChpZGV4VmFsKTsKICAgICAgICAgICAgICBpZiAoIV90aGlzLnJvd01hdGhFeHBNYXBbY29sdW1uLmRhdGFdKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5yb3dNYXRoRXhwTWFwW2NvbHVtbi5kYXRhXSA9IHt9OwogICAgICAgICAgICAgICAgX3RoaXMucm93TWF0aEV4cE1hcFtjb2x1bW4uZGF0YV1baWRleFZhbF0gPSBbXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKCFfdGhpcy5yb3dNYXRoRXhwTWFwW2NvbHVtbi5kYXRhXVtpZGV4VmFsXSkgewogICAgICAgICAgICAgICAgX3RoaXMucm93TWF0aEV4cE1hcFtjb2x1bW4uZGF0YV1baWRleFZhbF0gPSBbXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgX3RoaXMucm93TWF0aEV4cE1hcFtjb2x1bW4uZGF0YV1baWRleFZhbF0ucHVzaChpdGVtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBtYXRjaCA9IG15cmVnZXhwLmV4ZWMoc3RhdEZ1bik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCiAgICBpbml0TWFpbk1hdGhNYXA6IGZ1bmN0aW9uIGluaXRNYWluTWF0aE1hcChtYWluVGFibGVDYWxjcykgewogICAgICAvL+aUtumbhuS4u+ihqOiuoeeul+WFrOW8jwogICAgICBpZiAobWFpblRhYmxlQ2FsY3MgJiYgQXJyYXkuaXNBcnJheShtYWluVGFibGVDYWxjcykgJiYgbWFpblRhYmxlQ2FsY3MubGVuZ3RoID4gMCkgewogICAgICAgIHZhciBtYWluRmllbGRNYXRoTWFwID0ge307CiAgICAgICAgbWFpblRhYmxlQ2FsY3MuZm9yRWFjaChmdW5jdGlvbiAoY2FsYykgewogICAgICAgICAgaWYgKGNhbGMuc3VtRmllbGQgJiYgY2FsYy5tYWluRmllbGQpIHsKICAgICAgICAgICAgdmFyIHN1bUZpZWxkUGF0aCA9IGNhbGMuc3VtRmllbGQuc3BsaXQoIi4iKTsKICAgICAgICAgICAgbWFpbkZpZWxkTWF0aE1hcFtzdW1GaWVsZFBhdGhbMl1dID0gY2FsYzsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICB0aGlzLm1haW5GaWVsZE1hdGhNYXAgPSBtYWluRmllbGRNYXRoTWFwOwogICAgICB9CiAgICB9LAogICAgaW5pdEFsbE1hdGhGaWVsZDogZnVuY3Rpb24gaW5pdEFsbE1hdGhGaWVsZCgpIHsKICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgdmFyIHJvd01hdGhNYXAgPSBfdGhpcy5yb3dNYXRoRXhwTWFwOwogICAgICB2YXIgbWF0aE1hcCA9IF90aGlzLm1hdGhFeHBNYXA7CiAgICAgIHZhciBtYXRoRXhwSXRlbU1hcCA9IF90aGlzLm1hdGhFeHBJdGVtTWFwOwogICAgICB2YXIgcm93RXhlY0FycmF5ID0gW107CiAgICAgIGlmIChyb3dNYXRoTWFwKSB7CiAgICAgICAgZm9yICh2YXIga2V5IGluIHJvd01hdGhNYXApIHsKICAgICAgICAgIGlmIChyb3dNYXRoTWFwLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgdmFyIHJvd01hdGggPSByb3dNYXRoTWFwW2tleV07CiAgICAgICAgICAgIHZhciByb3dJdGVtID0gewogICAgICAgICAgICAgIG5hbWU6IGtleSwKICAgICAgICAgICAgICBpc0FsbDogZmFsc2UsCiAgICAgICAgICAgICAgaW5kZXg6IFtdCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvciAodmFyIGlkeCBpbiByb3dNYXRoKSB7CiAgICAgICAgICAgICAgaWYgKHJvd01hdGguaGFzT3duUHJvcGVydHkoaWR4KSkgewogICAgICAgICAgICAgICAgaWYgKGlkeC5pbmRleE9mKCc6JykgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgdmFyIGZBcnJheSA9IGlkeC5zcGxpdCgiOiIpOwogICAgICAgICAgICAgICAgICBpZiAoZkFycmF5Lmxlbmd0aCA9PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBfdGhpcy50b051bWJlcihmQXJyYXlbMF0pOwogICAgICAgICAgICAgICAgICAgIHZhciBiID0gX3RoaXMudG9OdW1iZXIoZkFycmF5WzFdKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gYTsgaSA8PSBiOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgIHJvd0l0ZW0uaW5kZXgucHVzaChpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHJvd0l0ZW0uaW5kZXgucHVzaChfdGhpcy50b051bWJlcihfdGhpcy50b051bWJlcihpZHgpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvd0V4ZWNBcnJheS5wdXNoKHJvd0l0ZW0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobWF0aE1hcCkgewogICAgICAgIGZvciAodmFyIG1hIGluIG1hdGhNYXApIHsKICAgICAgICAgIGlmIChtYXRoTWFwLmhhc093blByb3BlcnR5KG1hKSkgewogICAgICAgICAgICByb3dFeGVjQXJyYXkucHVzaCh7CiAgICAgICAgICAgICAgbmFtZTogbWEsCiAgICAgICAgICAgICAgaXNBbGw6IHRydWUKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChyb3dFeGVjQXJyYXkgJiYgcm93RXhlY0FycmF5Lmxlbmd0aCA+IDApIHsKICAgICAgICBfdGhpcy5hbGxNYXRoRXhwTGlzdCA9IHJvd0V4ZWNBcnJheTsKICAgICAgfQogICAgfSwKICAgIC8v5Yid5aeL5YyW5bWM5aWX6KGo5aS0CiAgICBpbml0TmVzdGVkSGVhZGVyczogZnVuY3Rpb24gaW5pdE5lc3RlZEhlYWRlcnMob3B0aW9ucywgaGVhZGVycykgewogICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICB2YXIgZ2V0Um93TGFibGUgPSBmdW5jdGlvbiBnZXRSb3dMYWJsZShjZWxsKSB7CiAgICAgICAgdmFyIHN0YXJ0ID0gY2VsbC5zdGFydEZpZWxkOwogICAgICAgIHZhciBlbmQgPSBjZWxsLmVuZEZpZWxkOwogICAgICAgIHZhciBjb2xzcGFuID0gMDsKICAgICAgICB2YXIgaXNFbmQgPSBmYWxzZTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmICghaXNFbmQpIHsKICAgICAgICAgICAgaWYgKHN0YXJ0ID09IGhlYWRlcnNbaV0ubmFtZSkgewogICAgICAgICAgICAgIGNvbHNwYW4rKzsKICAgICAgICAgICAgfSBlbHNlIGlmIChlbmQgPT0gaGVhZGVyc1tpXS5uYW1lKSB7CiAgICAgICAgICAgICAgY29sc3BhbisrOwogICAgICAgICAgICAgIGlzRW5kID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjb2xzcGFuID4gMCkgewogICAgICAgICAgICAgIGNvbHNwYW4rKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgbGFiZWw6IGNlbGwubmFtZSwKICAgICAgICAgIGNvbHNwYW46IGNvbHNwYW4KICAgICAgICB9OwogICAgICB9OwogICAgICB2YXIgZ2V0SXNJbk5lc3RlZCA9IGZ1bmN0aW9uIGdldElzSW5OZXN0ZWQobmFtZSwgaXRlbUhlYWRlcnMpIHsKICAgICAgICB2YXIgcm93TGFibGUgPSBudWxsOwogICAgICAgIGl0ZW1IZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGNlbGwpIHsKICAgICAgICAgIGlmICghcm93TGFibGUgJiYgbmFtZSA9PSBjZWxsLnN0YXJ0RmllbGQpIHsKICAgICAgICAgICAgcm93TGFibGUgPSBnZXRSb3dMYWJsZShjZWxsKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcm93TGFibGU7CiAgICAgIH07CiAgICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLm5lc3RlZEhlYWRlcnMgIT0gJ3VuZGVmaW5lZCcgJiYgb3B0aW9ucy5uZXN0ZWRIZWFkZXJzKSB7CiAgICAgICAgdmFyIG15TmVzdGVkSGVhZGVycyA9IFtdOwogICAgICAgIG9wdGlvbnMubmVzdGVkSGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICAgIHZhciBuZXN0ZWRIZWFkZXIgPSBbXTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgcm93TGFibGUgPSBnZXRJc0luTmVzdGVkKGhlYWRlcnNbaV0ubmFtZSwgcm93LmhlYWRlcnMpOwogICAgICAgICAgICBpZiAoIXJvd0xhYmxlKSB7CiAgICAgICAgICAgICAgbmVzdGVkSGVhZGVyLnB1c2goaGVhZGVyc1tpXS5kZXNjKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBuZXN0ZWRIZWFkZXIucHVzaChyb3dMYWJsZSk7CiAgICAgICAgICAgICAgaSA9IGkgKyByb3dMYWJsZS5jb2xzcGFuIC0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG5lc3RlZEhlYWRlcikgIT09IEpTT04uc3RyaW5naWZ5KGhlYWRlcnMpKSB7CiAgICAgICAgICAgIG15TmVzdGVkSGVhZGVycy5wdXNoKG5lc3RlZEhlYWRlcik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKG15TmVzdGVkSGVhZGVycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICB2YXIgaGVhZGVyQXJyYXkgPSBbXTsKICAgICAgICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAobXlIZWFkZXIpIHsKICAgICAgICAgICAgaGVhZGVyQXJyYXkucHVzaChteUhlYWRlci5kZXNjKTsKICAgICAgICAgIH0pOwogICAgICAgICAgbXlOZXN0ZWRIZWFkZXJzLnB1c2goaGVhZGVyQXJyYXkpOwogICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5uZXN0ZWRIZWFkZXJzID0gbXlOZXN0ZWRIZWFkZXJzOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGluaXRGb3JtRmllbGRzOiBmdW5jdGlvbiBpbml0Rm9ybUZpZWxkcygpIHsKICAgICAgdmFyIGZvcm1JbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMpOwogICAgICB0aGlzLmZvcm1JZCA9IGZvcm1JbnN0LiRyZWZzWyJvbmxpbmVGb3JtIl0uJHBhcmVudC4kcGFyZW50LmZvcm1JZDsKICAgICAgaWYgKHRoaXMuZm9ybUlkICYmIHR5cGVvZiB0aGlzLmZvcm1JZCAhPSAndW5kZWZpbmVkJykgewogICAgICAgIHZhciBwYXRocyA9IHRoaXMuc3ViVGFibGVQYXRoLnNwbGl0KCcuJyk7CiAgICAgICAgdmFyIGVudE5hbWUgPSBwYXRoc1sxXS5zcGxpdCgnc3ViXycpWzFdOwogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdGhpcy4kaHR0cC5nZXQoJyR7Zm9ybX0vZm9ybS9mb3JtL3YxL2dldEZvcm1GaWVsZHM/Zm9ybUlkPScgKyB0aGlzLmZvcm1JZCArICcmZW50TmFtZT0nICsgZW50TmFtZSkudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgaWYgKHJlc3AuZGF0YSkgewogICAgICAgICAgICBfdGhpcy5mb3JtRmllbGRzID0gcmVzcC5kYXRhOwogICAgICAgICAgfQogICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge30pOwogICAgICB9CiAgICB9LAogICAgaGFuZGxlck1lbnU6IGZ1bmN0aW9uIGhhbmRsZXJNZW51KG9wdGlvbnNKb24sIGlzTWF0aEV4cCkgewogICAgICBpZiAodGhpcy5wZXJtaXNzaW9uICYmIHRoaXMucGVybWlzc2lvblsndGFibGUnXSkgewogICAgICAgIHZhciB0YWJQZXJtaXNzaW9uID0gdGhpcy5wZXJtaXNzaW9uWyd0YWJsZSddW29wdGlvbnNKb24uYm9TdWJFbnRpdHldOwogICAgICAgIHZhciBfX3RoaXMgPSB0aGlzOwogICAgICAgIC8vIHRoaXMuaG90U2V0dGluZ3MuY29udGV4dE1lbnUuaXRlbXNbInJvd19kZXRhaWwiXSA9IHtuYW1lOifmmI7nu4YnLGNhbGxiYWNrOmZ1bmN0aW9uKCl7CiAgICAgICAgLy8gICAgICAgbGV0IGNlbGwgPSB0aGlzLmdldFNlbGVjdGVkKClbMF07CiAgICAgICAgLy8gICAgICAgY29uc3QgaW5kZXggPSBjZWxsWzBdOwogICAgICAgIC8vICAgICAgIGNvbnN0IGN1ckRhdGEgPSBfX3RoaXMuZ2V0SG90VGFibGVEYXRhKCk7CiAgICAgICAgLy8gICAgICAgX190aGlzLiRyZWZzWydzdWJEYXRhRGV0YWlsJ10uaGFuZGxlT3BlbihjdXJEYXRhW2luZGV4XSxfX3RoaXMuZm9ybUZpZWxkcyk7CiAgICAgICAgLy8gICAgIH0sCiAgICAgICAgLy8gfTsKICAgICAgICBpZiAodGFiUGVybWlzc2lvbiAmJiB0YWJQZXJtaXNzaW9uLmFkZCA9PSB0cnVlKSB7CiAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmNvbnRleHRNZW51Lml0ZW1zWyJyb3dfYWJvdmUiXSA9IHsKICAgICAgICAgICAgbmFtZTogJ+S4iuaWueaPkuWFpeS4gOihjCcKICAgICAgICAgIH07CiAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmNvbnRleHRNZW51Lml0ZW1zWyJyb3dfYmVsb3ciXSA9IHsKICAgICAgICAgICAgbmFtZTogJ+S4i+aWueaPkuWFpeS4gOihjCcKICAgICAgICAgIH07CiAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmNvbnRleHRNZW51Lml0ZW1zWyJyb3dfdXAiXSA9IHsKICAgICAgICAgICAgbmFtZTogJ+S4iuenuycsCiAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjaygpIHsKICAgICAgICAgICAgICB2YXIgY2VsbCA9IHRoaXMuZ2V0U2VsZWN0ZWQoKVswXTsKICAgICAgICAgICAgICB2YXIgaW5kZXggPSBjZWxsWzBdOwogICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkgewogICAgICAgICAgICAgICAgX190aGlzLiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIuW3sue7j+aYr+WIl+ihqOS4reesrOS4gOS9jSIsCiAgICAgICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBkYXRhTGlzdCA9IF9fdGhpcy5ob3RTZXR0aW5ncy5kYXRhOwogICAgICAgICAgICAgICAgdmFyIHQgPSBkYXRhTGlzdFtpbmRleCAtIDFdOwogICAgICAgICAgICAgICAgZGF0YUxpc3RbaW5kZXggLSAxXSA9IGRhdGFMaXN0W2luZGV4XTsKICAgICAgICAgICAgICAgIGRhdGFMaXN0W2luZGV4XSA9IHQ7CiAgICAgICAgICAgICAgICBfX3RoaXMuaG90U2V0dGluZ3MuZGF0YSA9IFtdOwogICAgICAgICAgICAgICAgX190aGlzLmhvdFNldHRpbmdzLmRhdGEgPSBkYXRhTGlzdDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmNvbnRleHRNZW51Lml0ZW1zWyJyb3dfZG93biJdID0gewogICAgICAgICAgICBuYW1lOiAn5LiL56e7JywKICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKCkgewogICAgICAgICAgICAgIHZhciBjZWxsID0gdGhpcy5nZXRTZWxlY3RlZCgpWzBdOwogICAgICAgICAgICAgIHZhciBpbmRleCA9IGNlbGxbMF07CiAgICAgICAgICAgICAgdmFyIGRhdGFMaXN0ID0gX190aGlzLmhvdFNldHRpbmdzLmRhdGE7CiAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSBkYXRhTGlzdC5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgICBfX3RoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgICBtZXNzYWdlOiAi5bey57uP5piv5YiX6KGo5Lit5pyA5ZCO5LiA5L2NIiwKICAgICAgICAgICAgICAgICAgdHlwZTogIndhcm5pbmciCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHQgPSBkYXRhTGlzdFtpbmRleCArIDFdOwogICAgICAgICAgICAgICAgZGF0YUxpc3RbaW5kZXggKyAxXSA9IGRhdGFMaXN0W2luZGV4XTsKICAgICAgICAgICAgICAgIGRhdGFMaXN0W2luZGV4XSA9IHQ7CiAgICAgICAgICAgICAgICBfX3RoaXMuaG90U2V0dGluZ3MuZGF0YSA9IFtdOwogICAgICAgICAgICAgICAgX190aGlzLmhvdFNldHRpbmdzLmRhdGEgPSBkYXRhTGlzdDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICBpZiAodGFiUGVybWlzc2lvbiAmJiB0YWJQZXJtaXNzaW9uLmRlbCA9PSB0cnVlKSB7CiAgICAgICAgICAgIHRoaXMuaG90U2V0dGluZ3MuY29udGV4dE1lbnUuaXRlbXNbInJlbW92ZV9yb3ciXSA9IHsKICAgICAgICAgICAgICBuYW1lOiAn5Yig6Zmk6KGMJwogICAgICAgICAgICB9OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGhhbmRDZWxsU3R5bGU6IGZ1bmN0aW9uIGhhbmRDZWxsU3R5bGUoY29sdW1uKSB7CiAgICAgIGlmIChjb2x1bW4uc3R5bGUpIHsKICAgICAgICB2YXIgY3N0eWxlID0gJyc7CiAgICAgICAgaWYgKGNvbHVtbi5zdHlsZS5kaXlTdHlsZSkgewogICAgICAgICAgY3N0eWxlID0gY29sdW1uLnN0eWxlLmRpeVN0eWxlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoY29sdW1uLnN0eWxlLmJhY2tncm91bmQpIHsKICAgICAgICAgICAgY3N0eWxlID0gJ2JhY2tncm91bmQtY29sb3I6JyArIGNvbHVtbi5zdHlsZS5iYWNrZ3JvdW5kICsgJzsnOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGNvbHVtbi5zdHlsZS5ib2xkKSB7CiAgICAgICAgICAgIGNzdHlsZSA9IGNzdHlsZSArICdmb250LXdlaWdodDogYm9sZDsnOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGNvbHVtbi5zdHlsZS5zaXplKSB7CiAgICAgICAgICAgIGNzdHlsZSA9IGNzdHlsZSArICdmb250LXNpemU6JyArIGNvbHVtbi5zdHlsZS5zaXplICsgJ3B4Oyc7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY29sdW1uLnN0eWxlLmNvbG9yKSB7CiAgICAgICAgICAgIGNzdHlsZSA9IGNzdHlsZSArICdjb2xvcjonICsgY29sdW1uLnN0eWxlLmNvbG9yICsgJzsnOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY3N0eWxlKSB7CiAgICAgICAgICB0aGlzLmNlbGxTdHlsZU1hcFtjb2x1bW4uZGF0YV0gPSBjc3R5bGU7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY2VsbHNNZTogZnVuY3Rpb24gY2VsbHNNZShyb3csIGNvbCwgcHJvcCkgewogICAgICB2YXIgY2VsbFByb3BlcnRpZXMgPSB7CiAgICAgICAgcmVuZGVyZXI6IHRoaXMucmVuZGVyZXJNZQogICAgICB9OwogICAgICAvL+iuoeeul+WFrOW8j+WNleWFg+agvOiuvue9ruWPquivuwogICAgICBpZiAodGhpcy5tYXRoUm93Q2VsbE1hcFtwcm9wXSAmJiAodGhpcy5tYXRoUm93Q2VsbE1hcFtwcm9wXVstMV0gPT09IHRydWUgfHwgdGhpcy5tYXRoUm93Q2VsbE1hcFtwcm9wXVtyb3ddID09PSB0cnVlKSkgewogICAgICAgIGNlbGxQcm9wZXJ0aWVzWydyZWFkT25seSddID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmICh0aGlzLmNyb3NzTWFwcGluZ0ZpZWxkc1twcm9wXSAmJiB0aGlzLmNyb3NzTWFwcGluZ0ZpZWxkc1twcm9wXVtyb3ddID09PSB0cnVlKSB7CiAgICAgICAgY2VsbFByb3BlcnRpZXNbJ3JlYWRPbmx5J10gPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKHRoaXMuZmlyc3RTdW1NYXBbcHJvcF0gJiYgcm93ID09IDApIHsKICAgICAgICBjZWxsUHJvcGVydGllc1sncmVhZE9ubHknXSA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5yZWFkT25seVJvd3NNYXBbcHJvcCArICdfJyArIHJvd10gPT09IHRydWUpIHsKICAgICAgICBjZWxsUHJvcGVydGllc1sncmVhZE9ubHknXSA9IHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGNlbGxQcm9wZXJ0aWVzOwogICAgfSwKICAgIGFmdGVyTG9hZERhdGFNZTogZnVuY3Rpb24gYWZ0ZXJMb2FkRGF0YU1lKCkgewogICAgICAvLyBpZih0aGlzLmlzSW5pdFRlbXBsYXRlRGF0YSE9PSd0cnVlJyAmJiB0aGlzLmhvdFNldHRpbmdzLmRhdGEgJiYgdGhpcy5ob3RTZXR0aW5ncy5kYXRhLmxlbmd0aD09MSAmJiAKICAgICAgLy8gICBBcnJheS5pc0FycmF5KHRoaXMuaG90U2V0dGluZ3MuZGF0YVswXSkpewogICAgICAvLyAgIHRoaXMuaG90U2V0dGluZ3MuZGF0YVswXSA9IHsuLi50aGlzLmluaXRSb3dEYXRhfTsKICAgICAgLy8gfQogICAgICAvL3RoaXMuaG90SW5zdGFuY2UucmVuZGVyKCk7CiAgICB9LAogICAgcmVuZGVyZXJNZTogZnVuY3Rpb24gcmVuZGVyZXJNZShpbnN0YW5jZSwgdGQsIHJvdywgY29sLCBwcm9wLCB2YWx1ZSwgY2VsbFByb3BlcnRpZXMpIHsKICAgICAgSGFuZHNvbnRhYmxlLnJlbmRlcmVycy5UZXh0UmVuZGVyZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgaWYgKHRoaXMuY2VsbFN0eWxlTWFwW3Byb3BdKSB7CiAgICAgICAgdGQuc3R5bGUgPSB0aGlzLmNlbGxTdHlsZU1hcFtwcm9wXTsKICAgICAgfQogICAgICB0ZC5zdHlsZS5saW5lSGVpZ2h0ID0gJzIycHgnOwogICAgICBpZiAodGhpcy5tYXRoUm93Q2VsbE1hcFtwcm9wXSAmJiAodGhpcy5tYXRoUm93Q2VsbE1hcFtwcm9wXVstMV0gPT09IHRydWUgfHwgdGhpcy5tYXRoUm93Q2VsbE1hcFtwcm9wXVtyb3ddID09PSB0cnVlKSkgewogICAgICAgIGNlbGxQcm9wZXJ0aWVzWydyZWFkT25seSddID0gdHJ1ZTsKICAgICAgICB0ZC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNGNUY3RkEnOwogICAgICB9IGVsc2UgaWYgKHRoaXMuY3Jvc3NNYXBwaW5nRmllbGRzW3Byb3BdICYmIHRoaXMuY3Jvc3NNYXBwaW5nRmllbGRzW3Byb3BdW3Jvd10gPT09IHRydWUpIHsKICAgICAgICBjZWxsUHJvcGVydGllc1sncmVhZE9ubHknXSA9IHRydWU7CiAgICAgICAgdGQuc3R5bGUuYmFja2dyb3VuZCA9ICcjRjVGN0ZBJzsKICAgICAgfSBlbHNlIGlmICh0aGlzLmZpcnN0U3VtTWFwW3Byb3BdICYmIHJvdyA9PSAwKSB7CiAgICAgICAgY2VsbFByb3BlcnRpZXNbJ3JlYWRPbmx5J10gPSB0cnVlOwogICAgICAgIHRkLnN0eWxlLmJhY2tncm91bmQgPSAnI0Y1RjdGQSc7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5yZWFkT25seVJvd3NNYXBbcHJvcCArICdfJyArIHJvd10gPT09IHRydWUpIHsKICAgICAgICBjZWxsUHJvcGVydGllc1sncmVhZE9ubHknXSA9IHRydWU7CiAgICAgICAgdGQuc3R5bGUuYmFja2dyb3VuZCA9ICcjRjVGN0ZBJzsKICAgICAgfQogICAgfSwKICAgIGJ1aWxkTWVyZ2VDZWxsOiBmdW5jdGlvbiBidWlsZE1lcmdlQ2VsbChkYXRhTGlzdCkgewogICAgICBpZiAoIWRhdGFMaXN0KSB7CiAgICAgICAgZGF0YUxpc3QgPSB0aGlzLmdldEhvdFRhYmxlRGF0YSgpOwogICAgICB9CiAgICAgIGlmIChkYXRhTGlzdCAmJiBkYXRhTGlzdC5sZW5ndGggPT0gMSAmJiBPYmplY3Qua2V5cyhkYXRhTGlzdFswXSkubGVuZ3RoID09IDApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIG1lcmdlQ2VsbHMgPSBbXTsKICAgICAgdmFyIG1lcmdlZiA9IHsKICAgICAgICByb3c6IDAsCiAgICAgICAgY29sOiAwLAogICAgICAgIHJvd3NwYW46IGRhdGFMaXN0Lmxlbmd0aCwKICAgICAgICBjb2xzcGFuOiAxCiAgICAgIH07CiAgICAgIHRoaXMuZ2V0Q2hpbGRyZW5NZXJnZUNlbGwobWVyZ2VDZWxscywgZGF0YUxpc3QsIG1lcmdlZiwgdGhpcy5tZXJnZUNlbGxGaWVsZCk7CiAgICAgIHRoaXMubWVyZ2VDZWxscyA9IG1lcmdlQ2VsbHM7CiAgICAgIHJldHVybiBtZXJnZUNlbGxzOwogICAgfSwKICAgIGdldENoaWxkcmVuTWVyZ2VDZWxsOiBmdW5jdGlvbiBnZXRDaGlsZHJlbk1lcmdlQ2VsbChtZXJnZUNlbGxzLCBkYXRhTGlzdCwgbWVyZ2UsIGZpZWxkKSB7CiAgICAgIHZhciBtZmllbGQgPSBmaWVsZDsKICAgICAgdmFyIG1lcmdlTWFwID0ge307CiAgICAgIHZhciBpbmRleE1hcCA9IHt9OwogICAgICBmb3IgKHZhciBpID0gbWVyZ2Uucm93OyBpIDwgbWVyZ2Uucm93ICsgbWVyZ2Uucm93c3BhbjsgaSsrKSB7CiAgICAgICAgdmFyIGl0ZW0gPSBkYXRhTGlzdFtpXTsKICAgICAgICBpbmRleE1hcFttZmllbGQuZmllbGRdID0gbWZpZWxkLmluZGV4OwogICAgICAgIGlmICghbWVyZ2VNYXBbbWZpZWxkLmZpZWxkXSkgewogICAgICAgICAgbWVyZ2VNYXBbbWZpZWxkLmZpZWxkXSA9IHsKICAgICAgICAgICAgdmFsdWU6IGl0ZW1bbWZpZWxkLmZpZWxkXSwKICAgICAgICAgICAgc2l6ZTogMSwKICAgICAgICAgICAgc3RhcnRSb3c6IGkKICAgICAgICAgIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBvbWZpZWxkID0gbWVyZ2VNYXBbbWZpZWxkLmZpZWxkXTsKICAgICAgICAgIGlmIChvbWZpZWxkLnZhbHVlID09IG51bGwgfHwgb21maWVsZC52YWx1ZSA9PSAnbnVsbCcgfHwgb21maWVsZC52YWx1ZSA9PSAndW5kZWZpbmVkJyB8fCBvbWZpZWxkLnZhbHVlID09PSAnJyB8fCBvbWZpZWxkLnZhbHVlICE9IGl0ZW1bbWZpZWxkLmZpZWxkXSkgewogICAgICAgICAgICBpZiAob21maWVsZC5zaXplID4gMSkgewogICAgICAgICAgICAgIHZhciBtZXJnZWYgPSB7CiAgICAgICAgICAgICAgICByb3c6IG9tZmllbGQuc3RhcnRSb3csCiAgICAgICAgICAgICAgICBjb2w6IG1maWVsZC5pbmRleCwKICAgICAgICAgICAgICAgIHJvd3NwYW46IG9tZmllbGQuc2l6ZSwKICAgICAgICAgICAgICAgIGNvbHNwYW46IDEKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIG1lcmdlQ2VsbHMucHVzaChfb2JqZWN0U3ByZWFkKHt9LCBtZXJnZWYpKTsKICAgICAgICAgICAgICBpZiAobWZpZWxkLmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICB0aGlzLmdldENoaWxkcmVuTWVyZ2VDZWxsKG1lcmdlQ2VsbHMsIGRhdGFMaXN0LCBtZXJnZWYsIG1maWVsZC5jaGlsZHJlbik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlbGV0ZSBtZXJnZU1hcFttZmllbGQuZmllbGRdOwogICAgICAgICAgICBtZXJnZU1hcFttZmllbGQuZmllbGRdID0gewogICAgICAgICAgICAgIHZhbHVlOiBpdGVtW21maWVsZC5maWVsZF0sCiAgICAgICAgICAgICAgc2l6ZTogMSwKICAgICAgICAgICAgICBzdGFydFJvdzogaQogICAgICAgICAgICB9OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb21maWVsZC5zaXplKys7CiAgICAgICAgICAgIG1lcmdlTWFwW21maWVsZC5maWVsZF0gPSBvbWZpZWxkOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKHZhciBrZXkgaW4gbWVyZ2VNYXApIHsKICAgICAgICBpZiAobWVyZ2VNYXAuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgdmFyIF9tZXJnZSA9IG1lcmdlTWFwW2tleV07CiAgICAgICAgICBpZiAoX21lcmdlLnNpemUgPiAxKSB7CiAgICAgICAgICAgIHZhciBfbWVyZ2VmID0gewogICAgICAgICAgICAgIHJvdzogX21lcmdlLnN0YXJ0Um93LAogICAgICAgICAgICAgIGNvbDogaW5kZXhNYXBba2V5XSwKICAgICAgICAgICAgICByb3dzcGFuOiBfbWVyZ2Uuc2l6ZSwKICAgICAgICAgICAgICBjb2xzcGFuOiAxCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIG1lcmdlQ2VsbHMucHVzaChfb2JqZWN0U3ByZWFkKHt9LCBfbWVyZ2VmKSk7CiAgICAgICAgICAgIGlmIChtZmllbGQuY2hpbGRyZW4pIHsKICAgICAgICAgICAgICB0aGlzLmdldENoaWxkcmVuTWVyZ2VDZWxsKG1lcmdlQ2VsbHMsIGRhdGFMaXN0LCBfbWVyZ2VmLCBtZmllbGQuY2hpbGRyZW4pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgYmVmb3JlUmVtb3ZlUm93TWU6IGZ1bmN0aW9uIGJlZm9yZVJlbW92ZVJvd01lKGNoYW5nZXMsIHNvdXJjZSkgey8vIOaVsOaNruaUueWPmOaXtuinpuWPkeatpOaWueazlQogICAgfSwKICAgIC8vIOa3u+WKoOihjAogICAgYWZ0ZXJDcmVhdGVSb3dNZTogZnVuY3Rpb24gYWZ0ZXJDcmVhdGVSb3dNZShjaGFuZ2VzKSB7CiAgICAgIHRoaXMuaG90U2V0dGluZ3MuZGF0YVtjaGFuZ2VzXSA9IF9vYmplY3RTcHJlYWQoe30sIHRoaXMuaW5pdFJvd0RhdGEpOwogICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmhvdFNldHRpbmdzLmRhdGFbMF0pKSB7CiAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5kYXRhWzBdID0gX29iamVjdFNwcmVhZCh7fSwgdGhpcy5pbml0Um93RGF0YSk7CiAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5kYXRhWzBdID0gdGhpcy5maWxsT3JnRGF0YUZpZWxkKHRoaXMuaG90U2V0dGluZ3MuZGF0YVswXSk7CiAgICAgIH0KICAgICAgdGhpcy5ob3RTZXR0aW5ncy5kYXRhW2NoYW5nZXNdID0gdGhpcy5maWxsT3JnRGF0YUZpZWxkKHRoaXMuaG90U2V0dGluZ3MuZGF0YVtjaGFuZ2VzXSk7CiAgICB9LAogICAgLy8g5paw5aKe6KGM5pe277yM5Yqo5oCB5pS55Y+Y5YC8CiAgICBhZnRlckNoYW5nZU1lOiBmdW5jdGlvbiBhZnRlckNoYW5nZU1lKGNoYW5nZXMsIHNvdXJjZSkgewogICAgICBpZiAoc291cmNlID09ICdlZGl0JyB8fCBzb3VyY2UgPT0gJ0F1dG9maWxsLmZpbGwnKSB7CiAgICAgICAgLy/miafooYzorqHnrpflhazlvI8KICAgICAgICAvL3RoaXMuZXhlY01hdGhFeHBTaW5nbGUoY2hhbmdlcyk7CiAgICAgICAgLy90aGlzLmV4ZWNNYXRoRXhwQWxsKGNoYW5nZXMpOwogICAgICAgIHRoaXMuZXhlY0luQ2VsbE1hdGhFeHAobnVsbCwgY2hhbmdlcyk7CiAgICAgIH0gZWxzZSBpZiAoc291cmNlID09ICdDb3B5UGFzdGUucGFzdGUnICYmIGNoYW5nZXMgJiYgY2hhbmdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIGhvdERhdGEgPSB0aGlzLmdldEJhY2tNZXJnZURhdGEoKTsKICAgICAgICB2YXIgaXNDaGFuZ2UgPSBmYWxzZTsKICAgICAgICBpZiAoaG90RGF0YSkgewogICAgICAgICAgY2hhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGFuZ2UpIHsKICAgICAgICAgICAgdmFyIGNoYW5nZUluZGV4ID0gY2hhbmdlWzBdOwogICAgICAgICAgICB2YXIgY2hhbmdlRmllbGQgPSBjaGFuZ2VbMV07CiAgICAgICAgICAgIHZhciBjaGFuZ2VWYWx1ZSA9IGNoYW5nZVszXTsKICAgICAgICAgICAgaWYgKGNoYW5nZVZhbHVlID09PSAn44CAJykgewogICAgICAgICAgICAgIGhvdERhdGFbY2hhbmdlSW5kZXhdW2NoYW5nZUZpZWxkXSA9ICcnOwogICAgICAgICAgICAgIGlzQ2hhbmdlID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoaXNDaGFuZ2UpIHsKICAgICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5kYXRhID0gW107CiAgICAgICAgICAgIHRoaXMuaG90U2V0dGluZ3MuZGF0YSA9IGhvdERhdGE7CiAgICAgICAgICB9CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLmV4ZWNDcm9zc01hcHBpbmcoKTsgLy/miafooYzot6jooajlj5bmlbAKICAgICAgICAgICAgdGhpcy5leGVjQ2VsbE1hdGhFeHAoaG90RGF0YSk7IC8v5omn6KGM6K6h566X5YWs5byPIAogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGV4ZWNNYXRoRXhwQWxsOiBmdW5jdGlvbiBleGVjTWF0aEV4cEFsbChjaGFuZ2VzKSB7CiAgICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMubGVuZ3RoID4gMCkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIGlzQ2hhbmdlID0gZmFsc2U7CiAgICAgICAgdmFyIGhvdERhdGEgPSB0aGlzLmdldEJhY2tNZXJnZURhdGEoKTsKICAgICAgICB2YXIgZnN1bU1hcCA9IHRoaXMuZmlyc3RTdW1NYXA7CiAgICAgICAgdmFyIGNoYW5nZUZpZWxkcyA9IHt9OwogICAgICAgIGNoYW5nZXMuZm9yRWFjaChmdW5jdGlvbiAoY2hhbmdlKSB7CiAgICAgICAgICAvL+aJp+ihjOi3qOihjOiuoeeul+WFrOW8jwogICAgICAgICAgdmFyIGNoYW5nZUluZGV4ID0gY2hhbmdlWzBdOwogICAgICAgICAgdmFyIGNoYW5nZUZpZWxkID0gY2hhbmdlWzFdOwogICAgICAgICAgY2hhbmdlRmllbGRzW2NoYW5nZUZpZWxkXSA9IHRydWU7CiAgICAgICAgICAvL+aJp+ihjOihjOWGheiuoeeul+WFrOW8jwogICAgICAgICAgdmFyIGV4ZU1hdGhSZXN1bHQgPSBfdGhpcy5leGVBbGxNYXRoRXhwKGhvdERhdGEsIF90aGlzLCBjaGFuZ2VJbmRleCwgaXNDaGFuZ2UpOwogICAgICAgICAgaG90RGF0YSA9IGV4ZU1hdGhSZXN1bHQuZGF0YTsKICAgICAgICAgIGlmIChleGVNYXRoUmVzdWx0LmlzQ2hhbmdlKSB7CiAgICAgICAgICAgIGlzQ2hhbmdlID0gZXhlTWF0aFJlc3VsdC5pc0NoYW5nZTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy/miafooYzot6jooYzorqHnrpflhazlvI8KICAgICAgICB2YXIgZXhlUm93UmVzdWx0ID0gX3RoaXMuZXhlQWxsUm93TWF0aEV4cChob3REYXRhLCBfdGhpcywgaXNDaGFuZ2UpOwogICAgICAgIGhvdERhdGEgPSBleGVSb3dSZXN1bHQuZGF0YTsKICAgICAgICBpZiAoZXhlUm93UmVzdWx0LmlzQ2hhbmdlKSB7CiAgICAgICAgICBpc0NoYW5nZSA9IGV4ZVJvd1Jlc3VsdC5pc0NoYW5nZTsKICAgICAgICB9CgogICAgICAgIC8v5omn6KGM5Y2V5YWD5qC86K6h566X5YWs5byPCiAgICAgICAgdmFyIGV4ZUNlbGxSZXN1bHQgPSBfdGhpcy5leGVDZWxsTWF0aEV4cChob3REYXRhLCBfdGhpcywgaXNDaGFuZ2UpOwogICAgICAgIGhvdERhdGEgPSBleGVDZWxsUmVzdWx0LmRhdGE7CiAgICAgICAgaWYgKGV4ZUNlbGxSZXN1bHQuaXNDaGFuZ2UpIHsKICAgICAgICAgIGlzQ2hhbmdlID0gZXhlQ2VsbFJlc3VsdC5pc0NoYW5nZTsKICAgICAgICB9CgogICAgICAgIC8v5omn6KGM6aaW6KGM5rGH5oC7CiAgICAgICAgaWYgKCd7fScgIT0gSlNPTi5zdHJpbmdpZnkoZnN1bU1hcCkpIHsKICAgICAgICAgIGZvciAodmFyIHN1bUtleSBpbiBmc3VtTWFwKSB7CiAgICAgICAgICAgIGlmIChmc3VtTWFwLmhhc093blByb3BlcnR5KHN1bUtleSkpIHsKICAgICAgICAgICAgICB2YXIgdGVtcFJlc3VsdCA9IF90aGlzLmV4ZUZpcnN0Um93U3VtKGhvdERhdGEsIHN1bUtleSwgX3RoaXMsIGlzQ2hhbmdlLCBmc3VtTWFwKTsKICAgICAgICAgICAgICBob3REYXRhID0gdGVtcFJlc3VsdC5kYXRhOwogICAgICAgICAgICAgIGlmICh0ZW1wUmVzdWx0LmlzQ2hhbmdlKSB7CiAgICAgICAgICAgICAgICBpc0NoYW5nZSA9IHRlbXBSZXN1bHQuaXNDaGFuZ2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvL+aJp+ihjOS4u+ihqOe7n+iuoeWFrOW8jwogICAgICAgIGZvciAodmFyIGNGaWVsZCBpbiBjaGFuZ2VGaWVsZHMpIHsKICAgICAgICAgIGlmIChjaGFuZ2VGaWVsZHMuaGFzT3duUHJvcGVydHkoY0ZpZWxkKSkgewogICAgICAgICAgICBfdGhpcy5leGVNYWluRmllbGRNYXRoRXhwKGhvdERhdGEsIGNGaWVsZCwgX3RoaXMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaXNDaGFuZ2UpIHsKICAgICAgICAgIHRoaXMuaG90U2V0dGluZ3MuZGF0YSA9IFtdOwogICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5kYXRhID0gaG90RGF0YTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMubWVyZ2VDZWxscyAmJiB0aGlzLm1lcmdlQ2VsbHMubGVuZ3RoID4gMCkgewogICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5tZXJnZUNlbGxzID0gdGhpcy5idWlsZE1lcmdlQ2VsbChob3REYXRhKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBleGVBbGxNYXRoRXhwOiBmdW5jdGlvbiBleGVBbGxNYXRoRXhwKGhvdERhdGEsIF90aGlzLCBmaWVsZEluZGV4LCBpc0NoYW5nZSkgewogICAgICAvL+aJp+ihjOaJgOacieihjOWGhei/kOeulwogICAgICBpZiAoX3RoaXMubWF0aEV4cE1hcCkgewogICAgICAgIGZvciAodmFyIGZpZWxkTmFtZSBpbiBfdGhpcy5tYXRoRXhwTWFwKSB7CiAgICAgICAgICAvL+WmguaenOihjOWGhei/kOeul+WvueW6lOWNleWFg+agvOWMheWQq+i3qOihjOi/kOeul++8jOWImeS7pei3qOihjOi/kOeul+S4uuS4u++8jOS4jei/m+ihjOihjOWGhei/kOeulwogICAgICAgICAgaWYgKF90aGlzLm1hdGhFeHBNYXAuaGFzT3duUHJvcGVydHkoZmllbGROYW1lKSAmJiAhdGhpcy5pc0luUm93TWF0aChmaWVsZE5hbWUsIGZpZWxkSW5kZXgpKSB7CiAgICAgICAgICAgIHZhciBjdXJleHAgPSBfdGhpcy5tYXRoRXhwTWFwW2ZpZWxkTmFtZV07CiAgICAgICAgICAgIHZhciBjdXJ2YWx1ZSA9IHRoaXMuY2FsY0V4cFZhbHVlKGN1cmV4cCwgaG90RGF0YSwgZmllbGRJbmRleCk7CiAgICAgICAgICAgIGlmIChob3REYXRhW2ZpZWxkSW5kZXhdKSB7CiAgICAgICAgICAgICAgaG90RGF0YVtmaWVsZEluZGV4XVtmaWVsZE5hbWVdID0gY3VydmFsdWU7CiAgICAgICAgICAgICAgaXNDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICBkYXRhOiBob3REYXRhLAogICAgICAgICAgaXNDaGFuZ2U6IGlzQ2hhbmdlCiAgICAgICAgfTsKICAgICAgfQogICAgfSwKICAgIC8v5Yik5pat6KGM5YaF6L+Q566X55qE5Y2V5YWD5qC85piv5ZCm5YyF5ZCr6Leo6KGM6L+Q566XCiAgICBpc0luUm93TWF0aDogZnVuY3Rpb24gaXNJblJvd01hdGgoZmllbGQsIGZpZWxkSW5kZXgpIHsKICAgICAgdmFyIGlzSW4gPSBmYWxzZTsKICAgICAgaWYgKHRoaXMuYWxsUm93TWF0aE1hcCAmJiB0aGlzLmFsbFJvd01hdGhNYXBbZmllbGRdKSB7CiAgICAgICAgdmFyIHJvd01hdGhzID0gdGhpcy5hbGxSb3dNYXRoTWFwW2ZpZWxkXTsKICAgICAgICBpZiAocm93TWF0aHMgJiYgcm93TWF0aHMubGVuZ3RoID4gMCkgewogICAgICAgICAgcm93TWF0aHMuZm9yRWFjaChmdW5jdGlvbiAobWF0aEl0ZW0pIHsKICAgICAgICAgICAgaWYgKG1hdGhJdGVtLnNuIC0gMSA9PSBmaWVsZEluZGV4KSB7CiAgICAgICAgICAgICAgaXNJbiA9IHRydWU7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gaXNJbjsKICAgIH0sCiAgICBleGVBbGxSb3dNYXRoRXhwOiBmdW5jdGlvbiBleGVBbGxSb3dNYXRoRXhwKGhvdERhdGEsIF90aGlzLCBpc0NoYW5nZSkgewogICAgICAvL+aJp+ihjOaJgOaciei3qOihjOi/kOeulwogICAgICBpZiAoX3RoaXMuYWxsUm93TWF0aE1hcCkgewogICAgICAgIHZhciBfbG9vcDIgPSBmdW5jdGlvbiBfbG9vcDIoZmllbGROYW1lKSB7CiAgICAgICAgICBpZiAoX3RoaXMuYWxsUm93TWF0aE1hcC5oYXNPd25Qcm9wZXJ0eShmaWVsZE5hbWUpKSB7CiAgICAgICAgICAgIHZhciBmcm93TWF0aHMgPSBfdGhpcy5hbGxSb3dNYXRoTWFwW2ZpZWxkTmFtZV07CiAgICAgICAgICAgIGlmIChmcm93TWF0aHMgJiYgZnJvd01hdGhzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICBmcm93TWF0aHMuZm9yRWFjaChmdW5jdGlvbiAobWF0aEl0ZW0pIHsKICAgICAgICAgICAgICAgIGlmIChob3REYXRhW21hdGhJdGVtLnNuIC0gMV0pIHsKICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gX3RoaXMuY2FsY1Jvd3NFeHBWYWx1ZShtYXRoSXRlbS5tYXRoRXhwLCBob3REYXRhLCBmaWVsZE5hbWUpOwogICAgICAgICAgICAgICAgICBob3REYXRhW21hdGhJdGVtLnNuIC0gMV1bZmllbGROYW1lXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICBpc0NoYW5nZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGZvciAodmFyIGZpZWxkTmFtZSBpbiBfdGhpcy5hbGxSb3dNYXRoTWFwKSB7CiAgICAgICAgICBfbG9vcDIoZmllbGROYW1lKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICBkYXRhOiBob3REYXRhLAogICAgICAgIGlzQ2hhbmdlOiBpc0NoYW5nZQogICAgICB9OwogICAgfSwKICAgIGV4ZUNlbGxNYXRoRXhwOiBmdW5jdGlvbiBleGVDZWxsTWF0aEV4cChob3REYXRhLCBfdGhpcywgaXNDaGFuZ2UpIHsKICAgICAgLy/miafooYzmiYDmnInljZXlhYPmoLzorqHnrpflhazlvI8KICAgICAgaWYgKF90aGlzLmNlbGxDYWxjcyAmJiBfdGhpcy5jZWxsQ2FsY3MubGVuZ3RoID4gMCkgewogICAgICAgIHZhciBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsKICAgICAgICBfdGhpcy5jZWxsQ2FsY3MuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgdmFyIGZpZWxkTmFtZSA9IGl0ZW0uY2VsbEZpZWxkLnNwbGl0KCcuJylbMl07CiAgICAgICAgICBpZiAoaG90RGF0YVtpdGVtLnJvd0luZGV4IC0gMV0pIHsKICAgICAgICAgICAgdmFyIHZhbHVlID0gX3RoaXMuY2FsY0NlbGxFeHBWYWx1ZShpdGVtLm1hdGhFeHAsIGhvdERhdGEsIGZvcm1JbnN0KTsKICAgICAgICAgICAgaG90RGF0YVtpdGVtLnJvd0luZGV4IC0gMV1bZmllbGROYW1lXSA9IHZhbHVlOwogICAgICAgICAgICBpc0NoYW5nZSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICBkYXRhOiBob3REYXRhLAogICAgICAgIGlzQ2hhbmdlOiBpc0NoYW5nZQogICAgICB9OwogICAgfSwKICAgIGV4ZUZpcnN0Um93U3VtOiBmdW5jdGlvbiBleGVGaXJzdFJvd1N1bShob3REYXRhLCBmaWVsZE5hbWUsIF90aGlzLCBpc0NoYW5nZSwgZnN1bU1hcCkgewogICAgICBpZiAoaG90RGF0YSAmJiBob3REYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICBpZiAoZnN1bU1hcFtmaWVsZE5hbWVdID09PSB0cnVlKSB7CiAgICAgICAgICB2YXIgZXhlVmFsdWUgPSBfdGhpcy5zdW1Db2woaG90RGF0YSwgZmllbGROYW1lLCB0cnVlLCBfdGhpcyk7CiAgICAgICAgICBob3REYXRhWzBdW2ZpZWxkTmFtZV0gPSB0aGlzLnRvZml4ZWQoZXhlVmFsdWUsIDIpOwogICAgICAgICAgaXNDaGFuZ2UgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIGRhdGE6IGhvdERhdGEsCiAgICAgICAgaXNDaGFuZ2U6IGlzQ2hhbmdlCiAgICAgIH07CiAgICB9LAogICAgc3VtQ29sOiBmdW5jdGlvbiBzdW1Db2woZGF0YSwgZmllbGQsIG91dEZpcnN0LCBfdGhpcykgewogICAgICAvL+axh+aAu+afkOWIl+aVsOaNru+8jAogICAgICB2YXIgc3VtID0gMDsKICAgICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGRhdGEubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICBpZiAoIShvdXRGaXJzdCAmJiBpbmRleCA9PSAwKSkgewogICAgICAgICAgICB2YXIgZWwgPSBkYXRhW2luZGV4XTsKICAgICAgICAgICAgc3VtICs9IF90aGlzLnRvTnVtYmVyKGVsW2ZpZWxkXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBzdW07CiAgICB9LAogICAgLy/miafooYzot6jooYzorqHnrpflhazlvI8KICAgIGV4ZVJvd01hdGhFeHA6IGZ1bmN0aW9uIGV4ZVJvd01hdGhFeHAoaG90RGF0YSwgZmllbGRJbmRleCwgZmllbGROYW1lLCBfdGhpcywgaXNDaGFuZ2UsIGlzUmVwZWF0KSB7CiAgICAgIC8vY29uc3QgZmllbGRJbmRleCA9IGZmaWVsZEluZGV4KzE7Ly9fdGhpcy5yb3dNYXRoRXhwTWFwW2NvbHVtbi5kYXRhXQogICAgICAvL+aJp+ihjOW9k+WJjeWtl+autea2ieWPiueahOiuoeeul+WFrOW8j++8iOS4uuS6huS/neivgeaJp+ihjOmhuuW6j++8jOWFiOaJp+ihjOW9k+WJjee8lui+keWtl+auteebuOWFs+iuoeeul+WFrOW8j++8iQogICAgICBmb3IgKHZhciBybWUgaW4gX3RoaXMucm93TWF0aEV4cE1hcCkgewogICAgICAgIGlmIChfdGhpcy5yb3dNYXRoRXhwTWFwLmhhc093blByb3BlcnR5KHJtZSkpIHsKICAgICAgICAgIHZhciBmcm93TWF0aHMgPSBfdGhpcy5yb3dNYXRoRXhwTWFwW3JtZV07CiAgICAgICAgICB2YXIgZXhwQXJyYXkgPSBbXTsKICAgICAgICAgIGlmIChmcm93TWF0aHMpIHsKICAgICAgICAgICAgaWYgKGZyb3dNYXRoc1tmaWVsZEluZGV4XSkgewogICAgICAgICAgICAgIGV4cEFycmF5LnB1c2goZmllbGRJbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgZm0gaW4gZnJvd01hdGhzKSB7CiAgICAgICAgICAgICAgaWYgKGZyb3dNYXRocy5oYXNPd25Qcm9wZXJ0eShmbSkpIHsKICAgICAgICAgICAgICAgIGlmIChmbS5pbmRleE9mKCI6IikgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgdmFyIGZBcnJheSA9IGZtLnNwbGl0KCI6Iik7CiAgICAgICAgICAgICAgICAgIGlmIChmQXJyYXkubGVuZ3RoID09IDIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IF90aGlzLnRvTnVtYmVyKGZBcnJheVswXSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBfdGhpcy50b051bWJlcihmQXJyYXlbMV0pOwogICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZEluZGV4ID49IGEgJiYgZmllbGRJbmRleCA8PSBiKSB7CiAgICAgICAgICAgICAgICAgICAgICBleHBBcnJheS5wdXNoKGZtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChleHBBcnJheS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIC8v5YWI5omn6KGM55u05o6l5YWz6IGU55qE5Y2V5YWD5qC86K6h566XCiAgICAgICAgICAgIGV4cEFycmF5LmZvckVhY2goZnVuY3Rpb24gKGV4cEtleSkgewogICAgICAgICAgICAgIHZhciBleHBJdGVtcyA9IF90aGlzLnJvd01hdGhFeHBNYXBbZmllbGROYW1lXVtleHBLZXldOwogICAgICAgICAgICAgIGV4cEl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGVJdGVtKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBfdGhpcy5jYWxjUm93c0V4cFZhbHVlKGVJdGVtLm1hdGhFeHAsIGhvdERhdGEsIGZpZWxkTmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoaG90RGF0YVtlSXRlbS5zbiAtIDFdKSB7CiAgICAgICAgICAgICAgICAgIGhvdERhdGFbZUl0ZW0uc24gLSAxXVtmaWVsZE5hbWVdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgIGlzQ2hhbmdlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgZGF0YTogaG90RGF0YSwKICAgICAgICBpc0NoYW5nZTogaXNDaGFuZ2UKICAgICAgfTsKICAgIH0sCiAgICAvL+aJp+ihjOihjOWGheiuoeeul+WFrOW8jwogICAgZXhlTWF0aEV4cDogZnVuY3Rpb24gZXhlTWF0aEV4cChob3REYXRhLCBmaWVsZEluZGV4LCBmaWVsZE5hbWUsIF90aGlzLCBpc0NoYW5nZSwgaXNSZXBlYXQpIHsKICAgICAgLy/miafooYzlvZPliY3lrZfmrrXmtonlj4rnmoTorqHnrpflhazlvI/vvIjkuLrkuobkv53or4HmiafooYzpobrluo/vvIzlhYjmiafooYzlvZPliY3nvJbovpHlrZfmrrXnm7jlhbPorqHnrpflhazlvI/vvIkKICAgICAgdmFyIGN1ckV4cE1hcCA9IF90aGlzLm1hdGhFeHBJdGVtTWFwW2ZpZWxkTmFtZV07CiAgICAgIGlmIChjdXJFeHBNYXApIHsKICAgICAgICBmb3IgKHZhciBjdXJrZXkgaW4gY3VyRXhwTWFwKSB7CiAgICAgICAgICBpZiAoY3VyRXhwTWFwLmhhc093blByb3BlcnR5KGN1cmtleSkpIHsKICAgICAgICAgICAgdmFyIGN1cmV4cCA9IGN1ckV4cE1hcFtjdXJrZXldOwogICAgICAgICAgICB2YXIgY3VydmFsdWUgPSB0aGlzLmNhbGNFeHBWYWx1ZShjdXJleHAsIGhvdERhdGEsIGZpZWxkSW5kZXgpOwogICAgICAgICAgICBpZiAoaG90RGF0YVtmaWVsZEluZGV4XSkgewogICAgICAgICAgICAgIGhvdERhdGFbZmllbGRJbmRleF1bY3Vya2V5XSA9IGN1cnZhbHVlOwogICAgICAgICAgICAgIGlzQ2hhbmdlID0gdHJ1ZTsKICAgICAgICAgICAgICAvL+aJp+ihjOS4u+ihqOe7n+iuoeWFrOW8jwogICAgICAgICAgICAgIF90aGlzLmV4ZU1haW5GaWVsZE1hdGhFeHAoaG90RGF0YSwgY3Vya2V5LCBfdGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy/miafooYzlhbbku5blrZfmrrXmtonlj4rnmoTorqHnrpflhazlvI/vvIjpmLLmraLmnInlhbPogZTorqHnrpfvvIkKICAgICAgICBmb3IgKHZhciBpdGVtS2V5IGluIF90aGlzLm1hdGhFeHBJdGVtTWFwKSB7CiAgICAgICAgICBpZiAoX3RoaXMubWF0aEV4cEl0ZW1NYXAuaGFzT3duUHJvcGVydHkoaXRlbUtleSkgJiYgZmllbGROYW1lICE9IGl0ZW1LZXkpIHsKICAgICAgICAgICAgdmFyIGV4cE1hcCA9IF90aGlzLm1hdGhFeHBJdGVtTWFwW2l0ZW1LZXldOwogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZXhwTWFwKSB7CiAgICAgICAgICAgICAgaWYgKGV4cE1hcC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICB2YXIgZXhwID0gZXhwTWFwW2tleV07CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmNhbGNFeHBWYWx1ZShleHAsIGhvdERhdGEsIGZpZWxkSW5kZXgpOwogICAgICAgICAgICAgICAgaWYgKGhvdERhdGFbZmllbGRJbmRleF0pIHsKICAgICAgICAgICAgICAgICAgaG90RGF0YVtmaWVsZEluZGV4XVtrZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgIGlzQ2hhbmdlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgLy/miafooYzkuLvooajnu5/orqHlhazlvI8KICAgICAgICAgICAgICAgICAgX3RoaXMuZXhlTWFpbkZpZWxkTWF0aEV4cChob3REYXRhLCBrZXksIF90aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGlzUmVwZWF0KSB7CiAgICAgICAgcmV0dXJuIF90aGlzLmV4ZU1hdGhFeHAoaG90RGF0YSwgZmllbGRJbmRleCwgZmllbGROYW1lLCBfdGhpcywgaXNDaGFuZ2UsIGZhbHNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgZGF0YTogaG90RGF0YSwKICAgICAgICAgIGlzQ2hhbmdlOiBpc0NoYW5nZQogICAgICAgIH07CiAgICAgIH0KICAgIH0sCiAgICAvL+aJp+ihjOS4u+ihqOWtl+autee7n+iuoeWFrOW8jwogICAgZXhlTWFpbkZpZWxkTWF0aEV4cDogZnVuY3Rpb24gZXhlTWFpbkZpZWxkTWF0aEV4cChob3REYXRhLCBmaWVsZE5hbWUsIF90aGlzKSB7CiAgICAgIHZhciBjYWxjID0gdGhpcy5tYWluRmllbGRNYXRoTWFwW2ZpZWxkTmFtZV07CiAgICAgIGlmIChjYWxjKSB7CiAgICAgICAgdmFyIHN1bVZhbHVlID0gMDsKICAgICAgICB2YXIgX3RoaXMzID0gdGhpczsKICAgICAgICBpZiAoY2FsYy5tYWluRmllbGQgJiYgaG90RGF0YSAmJiBob3REYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGhvdERhdGEuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICBzdW1WYWx1ZSArPSBfdGhpczMudG9OdW1iZXIoaXRlbVtmaWVsZE5hbWVdKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICB2YXIgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7CiAgICAgICAgaWYgKGZvcm1JbnN0ICYmIGZvcm1JbnN0WydkYXRhJ10pIHsKICAgICAgICAgIHZhciBtYWluRmllbGRQYXRoID0gY2FsYy5tYWluRmllbGQuc3BsaXQoIi4iKTsKICAgICAgICAgIGZvcm1JbnN0WydkYXRhJ11bbWFpbkZpZWxkUGF0aFswXV1bbWFpbkZpZWxkUGF0aFsxXV0gPSBzdW1WYWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAvL+WNleWFg+agvOiiq+mAieS4re+8jOWmguaenOaYr+WPquivu++8jOaPkOekuuadg+mZkOS/oeaBrwogICAgYWZ0ZXJTZWxlY3Rpb25FbmRNZTogZnVuY3Rpb24gYWZ0ZXJTZWxlY3Rpb25FbmRNZShyLCBjLCByMiwgYzIpIHsKICAgICAgdmFyIHJlYWRPbmx5RmllbGQgPSB0aGlzLnJlYWRPbmx5Q29sdW1uTWFwW2NdOwogICAgICBpZiAociA9PSByMiAmJiBjID09IGMyICYmIHJlYWRPbmx5RmllbGQpIHsKICAgICAgICB0aGlzLiRtZXNzYWdlKHsKICAgICAgICAgIG1lc3NhZ2U6ICLlrZfmrrXjgJAiICsgcmVhZE9ubHlGaWVsZFsnZGVzYyddICsgIuOAkeS4jeWPr+Whq+WGme+8gSIsCiAgICAgICAgICB0eXBlOiAid2FybmluZyIKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmICh0aGlzLmhvdFNldHRpbmdzLmNvbHVtbnNbY10pIHsKICAgICAgICB2YXIgZmllbGROYW1lID0gdGhpcy5ob3RTZXR0aW5ncy5jb2x1bW5zW2NdWydkYXRhJ107CiAgICAgICAgaWYgKGZpZWxkTmFtZSAmJiB0aGlzLnJlYWRPbmx5Um93c01hcFtmaWVsZE5hbWUgKyAnXycgKyByXSA9PT0gdHJ1ZSkgewogICAgICAgICAgdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgIG1lc3NhZ2U6ICLlvZPliY3ljZXlhYPmoLzkuI3lj6/loavlhpnvvIEiLAogICAgICAgICAgICB0eXBlOiAid2FybmluZyIKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAoZmllbGROYW1lICYmIHRoaXMubWF0aFJvd0NlbGxNYXBbZmllbGROYW1lXSAmJiAodGhpcy5tYXRoUm93Q2VsbE1hcFtmaWVsZE5hbWVdWy0xXSA9PT0gdHJ1ZSB8fCB0aGlzLm1hdGhSb3dDZWxsTWFwW2ZpZWxkTmFtZV1bcl0gPT09IHRydWUpKSB7CiAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsKICAgICAgICAgICAgbWVzc2FnZTogIuW9k+WJjeS4uuiuoeeul+WNleWFg+agvO+8jOS4jeWPr+Whq+WGme+8gSIsCiAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIgogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNyb3NzTWFwcGluZ0ZpZWxkc1tmaWVsZE5hbWVdICYmIHRoaXMuY3Jvc3NNYXBwaW5nRmllbGRzW2ZpZWxkTmFtZV1bcl0gPT09IHRydWUpIHsKICAgICAgICAgIHRoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICBtZXNzYWdlOiAi5b2T5YmN5Li66Leo6KGo5Y+W5pWw5Y2V5YWD5qC877yM5LiN5Y+v5aGr5YaZ77yBIiwKICAgICAgICAgICAgdHlwZTogIndhcm5pbmciCiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmlyc3RTdW1NYXBbZmllbGROYW1lXSAmJiByID09IDApIHsKICAgICAgICAgIHRoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICBtZXNzYWdlOiAi5b2T5YmN5Li65rGH5oC75Y2V5YWD5qC877yM5LiN5Y+v5aGr5YaZ77yBIiwKICAgICAgICAgICAgdHlwZTogIndhcm5pbmciCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICB0b051bWJlcjogZnVuY3Rpb24gdG9OdW1iZXIoeCkgewogICAgICBpZiAodHlwZW9mIHggPT0gJ3VuZGVmaW5lZCcgfHwgeCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQgfHwgeCA9PT0gJycpIHJldHVybiAwOwogICAgICBpZiAodHlwZW9mIHggPT0gInN0cmluZyIpIHsKICAgICAgICB4ID0geC5yZXBsYWNlKC8sL2csICIiKTsKICAgICAgfQogICAgICB2YXIgbWF0Y2ggPSB4LnRvU3RyaW5nKCkubWF0Y2goLyhbJHzvv6VdKVxkK1wuP1xkKi8pOwogICAgICBpZiAobWF0Y2gpIHsKICAgICAgICB4ID0geC5yZXBsYWNlKG1hdGNoWzFdLCAnJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIE51bWJlcih4KTsKICAgIH0sCiAgICBjYWxjRXhwVmFsdWU6IGZ1bmN0aW9uIGNhbGNFeHBWYWx1ZShleHAsIHNjb3BlLCBzdWJJbmRleCkgewogICAgICBpZiAoIWV4cCkgcmV0dXJuIDA7CiAgICAgIHZhciByZWcgPSAvKFtcW3xce10pLio/XCgoLio/KVwpW1x9fFxdXS9nOwogICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICBleHAgPSBleHAucmVwbGFjZShyZWcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgc3ltYm9sID0gYXJndW1lbnRzWzFdLAogICAgICAgICAgbmFtZSA9IGFyZ3VtZW50c1syXSwKICAgICAgICAgIHZhbHVlID0gMDsKICAgICAgICBpZiAoc2NvcGUpIHsKICAgICAgICAgIC8v5a2Q6KGo57uf6K6h6K6h566X5oOF5Ya177yM5aSa6KGM5pWw5o2uCiAgICAgICAgICBpZiAoc3ltYm9sID09ICdbJykgewogICAgICAgICAgICB2YXIgdmFsQXJyYXkgPSBbXTsKICAgICAgICAgICAgdmFyIHN1Yk1zZyA9IG5hbWUuc3BsaXQoIi4iKTsKICAgICAgICAgICAgaWYgKHN1Yk1zZy5sZW5ndGggPCAxKSB7CiAgICAgICAgICAgICAgdGhyb3cgIlx1NUI1MFx1ODg2OFx1N0VERlx1OEJBMVx1NzY4NFx1ODg2OFx1OEZCRVx1NUYwRiIuY29uY2F0KG5hbWUsICJcdTk1MTlcdThCRUYiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc3ViTXNnU2l6ZSA9IHN1Yk1zZy5sZW5ndGg7CiAgICAgICAgICAgIHZhciBmaWVsZE5hbWUgPSBzdWJNc2dbc3ViTXNnU2l6ZSAtIDFdOwogICAgICAgICAgICB2YXIgZnZhbHVlID0gMDsKICAgICAgICAgICAgaWYgKHNjb3BlW3N1YkluZGV4XSAmJiBzY29wZVtzdWJJbmRleF1bZmllbGROYW1lXSkgewogICAgICAgICAgICAgIGZ2YWx1ZSA9IF90aGlzLnRvTnVtYmVyKHNjb3BlW3N1YkluZGV4XVtmaWVsZE5hbWVdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YWxBcnJheS5wdXNoKGZ2YWx1ZSk7CiAgICAgICAgICAgIHZhbHVlID0gIlsiLmNvbmNhdCh2YWxBcnJheS5qb2luKCcsJykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIHN1Yk1zZyA9IG5hbWUuc3BsaXQoIi4iKTsKICAgICAgICAgICAgdmFyIGZpZWxkTmFtZSA9IHN1Yk1zZ1tzdWJNc2cubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIHZhciB2YWwgPSBzY29wZVtzdWJJbmRleF0gPyBfdGhpcy50b051bWJlcihzY29wZVtzdWJJbmRleF1bZmllbGROYW1lXSkgOiAwOwogICAgICAgICAgICB2YWwgPSBfdGhpcy50b051bWJlcih2YWwpOwogICAgICAgICAgICBpZiAoIWlzTmFOKHZhbCkgJiYgIiIgIT0gdmFsKSB2YWx1ZSA9IHZhbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgdmFsdWUgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUgPCAwKSB7CiAgICAgICAgICB2YWx1ZSA9ICcoJyArIHZhbHVlICsgJyknOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0pOwogICAgICBleHAgPSBleHAucmVwbGFjZSgvW3xcW3xcXV0vZywgIiIpOwogICAgICBpZiAoZXhwLnN1YnN0cmluZygwLCAxNikgIT0gIkZvcm1NYXRoLnRvZml4ZWQiKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWx1ZSh0aGlzLnRvZml4ZWQoZXZhbCgiKCIuY29uY2F0KGV4cCwgIikiKSksIDApKTsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIHJldHVybiB0aGlzLmlzVmFsdWUoZXZhbCgiKCIuY29uY2F0KGV4cCwgIikiKSkpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIF90aGlzLiRtZXNzYWdlKHsKICAgICAgICAgIG1lc3NhZ2U6ICLorqHnrpflhazlvI/miafooYzlpLHotKXvvJoiICsgZXJyb3IsCiAgICAgICAgICB0eXBlOiAiZXJyb3IiCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgIH0sCiAgICBjYWxjUm93c0V4cFZhbHVlOiBmdW5jdGlvbiBjYWxjUm93c0V4cFZhbHVlKGV4cCwgc2NvcGUsIGZOYW1lKSB7CiAgICAgIGlmICghZXhwKSByZXR1cm4gMDsKICAgICAgdmFyIHJlZyA9IC9cWyguKj8pXF0vZzsKICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgZXhwID0gZXhwLnJlcGxhY2UocmVnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHN5bWJvbCA9IGFyZ3VtZW50c1sxXSwKICAgICAgICAgIGNpbmRleCA9IGFyZ3VtZW50c1syXSwKICAgICAgICAgIGV4cFN0ciA9IGFyZ3VtZW50c1szXSwKICAgICAgICAgIHZhbHVlID0gMDsKICAgICAgICBpZiAoc2NvcGUpIHsKICAgICAgICAgIGlmIChzeW1ib2wuaW5kZXhPZignOicpID4gLTEpIHsKICAgICAgICAgICAgdmFyIHN1bVN0ciA9IGV4cFN0ci5zdWJzdHJpbmcoY2luZGV4IC0gMTMsIGNpbmRleCAtIDEpOwogICAgICAgICAgICBpZiAoc3VtU3RyID09PSAnRm9ybU1hdGguc3VtJykgewogICAgICAgICAgICAgIHZhciBpZHhBcnJheSA9IHN5bWJvbC5zcGxpdCgnOicpOwogICAgICAgICAgICAgIHZhciBhID0gX3RoaXMudG9OdW1iZXIoaWR4QXJyYXlbMF0pOwogICAgICAgICAgICAgIHZhciBiID0gX3RoaXMudG9OdW1iZXIoaWR4QXJyYXlbMV0pOwogICAgICAgICAgICAgIHZhciB0ZW1wVmFsdWUgPSBbXTsKICAgICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IGE7IGluZGV4IDw9IGI7IGluZGV4KyspIHsKICAgICAgICAgICAgICAgIHZhciByb3dJbmRleCA9IGluZGV4IC0gMTsKICAgICAgICAgICAgICAgIGlmIChzY29wZVtyb3dJbmRleF0pIHsKICAgICAgICAgICAgICAgICAgdGVtcFZhbHVlLnB1c2goX3RoaXMudG9OdW1iZXIoc2NvcGVbcm93SW5kZXhdW2ZOYW1lXSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB2YWx1ZSA9ICJbIiArIHRlbXBWYWx1ZSArICJdIjsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIHZhbCA9IDA7CiAgICAgICAgICAgIHZhciByb3dJbmRleCA9IF90aGlzLnRvTnVtYmVyKHN5bWJvbCkgLSAxOwogICAgICAgICAgICBpZiAoc2NvcGVbcm93SW5kZXhdKSB7CiAgICAgICAgICAgICAgdmFsID0gX3RoaXMudG9OdW1iZXIoc2NvcGVbcm93SW5kZXhdW2ZOYW1lXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFsID0gX3RoaXMudG9OdW1iZXIodmFsKTsKICAgICAgICAgICAgaWYgKCFpc05hTih2YWwpICYmICIiICE9IHZhbCkgdmFsdWUgPSB2YWw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgIHZhbHVlID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlIDwgMCkgewogICAgICAgICAgdmFsdWUgPSAnKCcgKyB2YWx1ZSArICcpJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9KTsKICAgICAgaWYgKGV4cC5zdWJzdHJpbmcoMCwgMTYpICE9ICJGb3JtTWF0aC50b2ZpeGVkIikgewogICAgICAgIHJldHVybiB0aGlzLmlzVmFsdWUodGhpcy50b2ZpeGVkKGV2YWwoIigiLmNvbmNhdChleHAsICIpIikpLCAwKSk7CiAgICAgIH0KICAgICAgdmFyIHJlc3VsdFZhbHVlID0gMDsKICAgICAgdHJ5IHsKICAgICAgICByZXN1bHRWYWx1ZSA9IHRoaXMuaXNWYWx1ZShldmFsKCIoIi5jb25jYXQoZXhwLCAiKSIpKSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgX3RoaXMuJG1lc3NhZ2UoewogICAgICAgICAgbWVzc2FnZTogIuiuoeeul+WFrOW8j+aJp+ihjOWksei0pe+8miIgKyBlcnJvciwKICAgICAgICAgIHR5cGU6ICJlcnJvciIKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0VmFsdWU7CiAgICB9LAogICAgY2FsY0NlbGxFeHBWYWx1ZTogZnVuY3Rpb24gY2FsY0NlbGxFeHBWYWx1ZShleHAsIHNjb3BlLCBmb3JtSW5zdCkgewogICAgICBpZiAoIWV4cCkgcmV0dXJuIDA7CiAgICAgIHZhciByZWcgPSAvKFtcW3xce10pLio/XCgoLio/KVwpW1x9fFxdXS9nOwogICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICB2YXIgc3ViRGF0YU1hcCA9IHt9OwogICAgICBzdWJEYXRhTWFwW190aGlzLnN1YlRhYmxlUGF0aF0gPSBzY29wZTsKICAgICAgZXhwID0gZXhwLnJlcGxhY2UocmVnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHN5bWJvbCA9IGFyZ3VtZW50c1sxXSwKICAgICAgICAgIG5hbWUgPSBhcmd1bWVudHNbMl0sCiAgICAgICAgICB2YWx1ZSA9IDA7CiAgICAgICAgaWYgKHNjb3BlKSB7CiAgICAgICAgICAvL+WtkOihqOe7n+iuoeiuoeeul+aDheWGte+8jOWkmuihjOaVsOaNrgogICAgICAgICAgaWYgKHN5bWJvbCA9PSAnWycpIHsKICAgICAgICAgICAgdmFyIHZhbEFycmF5ID0gW107CiAgICAgICAgICAgIHZhciBzdWJNc2cgPSBuYW1lLnNwbGl0KCIuIik7CiAgICAgICAgICAgIGlmIChzdWJNc2cubGVuZ3RoIDwgMSkgewogICAgICAgICAgICAgIHRocm93ICJcdTVCNTBcdTg4NjhcdTdFREZcdThCQTFcdTc2ODRcdTg4NjhcdThGQkVcdTVGMEYiLmNvbmNhdChuYW1lLCAiXHU5NTE5XHU4QkVGIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHN1Yk1zZ1NpemUgPSBzdWJNc2cubGVuZ3RoOwogICAgICAgICAgICB2YXIgZnZhbHVlID0gMDsKICAgICAgICAgICAgaWYgKHN1Yk1zZ1NpemUgPiAzKSB7CiAgICAgICAgICAgICAgdmFyIGZpZWxkTmFtZVN0ciA9IHN1Yk1zZ1tzdWJNc2dTaXplIC0gMV07CiAgICAgICAgICAgICAgdmFyIGluZGV4U3RyID0gZmllbGROYW1lU3RyLm1hdGNoKC9cWyguKz8pXF0vZyk7CiAgICAgICAgICAgICAgdmFyIHN1YkluZGV4ID0gX3RoaXMudG9OdW1iZXIoaW5kZXhTdHJbMF0ucmVwbGFjZSgvXFsoLis/KVxdL2csICckMScpKSAtIDE7CiAgICAgICAgICAgICAgdmFyIGZOYW1lID0gZmllbGROYW1lU3RyLnJlcGxhY2UoaW5kZXhTdHJbMF0sICcnKTsKICAgICAgICAgICAgICB2YXIgc3ViUGF0aCA9IHN1Yk1zZ1sxXSArICcuJyArIHN1Yk1zZ1syXTsKICAgICAgICAgICAgICBpZiAoIXN1YkRhdGFNYXBbc3ViUGF0aF0gJiYgX3RoaXMuc3ViVGFibGVQYXRoICE9IHN1YlBhdGgpIHsKICAgICAgICAgICAgICAgIHZhciBob3RUYWJsZVJlZiA9ICdob3R0YWJsZS4nICsgc3ViUGF0aDsKICAgICAgICAgICAgICAgIHZhciBob3RUYWJsZU9iaiA9IGZvcm1JbnN0LiRyZWZzWyJvbmxpbmVGb3JtIl0uJHJlZnNbaG90VGFibGVSZWZdOwogICAgICAgICAgICAgICAgaWYgKGhvdFRhYmxlT2JqKSB7CiAgICAgICAgICAgICAgICAgIHN1YkRhdGFNYXBbc3ViUGF0aF0gPSBmb3JtSW5zdC4kcmVmc1sib25saW5lRm9ybSJdLiRyZWZzW2hvdFRhYmxlUmVmXS5nZXRIb3RUYWJsZURhdGEoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHZhciBwYXRocyA9IHN1YlBhdGguc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgICAgaWYgKGZvcm1JbnN0LmRhdGFbcGF0aHNbMF1dICYmIGZvcm1JbnN0LmRhdGFbcGF0aHNbMF1dW3BhdGhzWzFdXSkgewogICAgICAgICAgICAgICAgICAgIHN1YkRhdGFNYXBbc3ViUGF0aF0gPSBmb3JtSW5zdC5kYXRhW3BhdGhzWzBdXVtwYXRoc1sxXV07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHN1YkRhdGFNYXBbc3ViUGF0aF0pIHsKICAgICAgICAgICAgICAgIHZhciBzdWJEYXRhID0gX3RvQ29uc3VtYWJsZUFycmF5KHN1YkRhdGFNYXBbc3ViUGF0aF0pOwogICAgICAgICAgICAgICAgaWYgKHN1YkRhdGFbc3ViSW5kZXhdICYmIHN1YkRhdGFbc3ViSW5kZXhdW2ZOYW1lXSkgewogICAgICAgICAgICAgICAgICBmdmFsdWUgPSBfdGhpcy50b051bWJlcihzdWJEYXRhW3N1YkluZGV4XVtmTmFtZV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtSW5zdC5kYXRhW3N1Yk1zZ1sxXV0gJiYgZm9ybUluc3QuZGF0YVtzdWJNc2dbMV1dW3N1Yk1zZ1syXV0pIHsKICAgICAgICAgICAgICBmdmFsdWUgPSBfdGhpcy50b051bWJlcihmb3JtSW5zdC5kYXRhW3N1Yk1zZ1sxXV1bc3ViTXNnWzJdXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFsQXJyYXkucHVzaChmdmFsdWUpOwogICAgICAgICAgICB2YWx1ZSA9ICJbIi5jb25jYXQodmFsQXJyYXkuam9pbignLCcpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciBzdWJNc2cgPSBuYW1lLnNwbGl0KCIuIik7CiAgICAgICAgICAgIHZhciBmaWVsZE5hbWUgPSBzdWJNc2dbc3ViTXNnLmxlbmd0aCAtIDFdOwogICAgICAgICAgICB2YXIgdmFsID0gMDsKICAgICAgICAgICAgaWYgKGZvcm1JbnN0LmRhdGFbc3ViTXNnWzFdXSAmJiBmb3JtSW5zdC5kYXRhW3N1Yk1zZ1sxXV1bc3ViTXNnWzJdXSkgewogICAgICAgICAgICAgIHZhbCA9IF90aGlzLnRvTnVtYmVyKGZvcm1JbnN0LmRhdGFbc3ViTXNnWzFdXVtzdWJNc2dbMl1dKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWlzTmFOKHZhbCkgJiYgIiIgIT0gdmFsKSB2YWx1ZSA9IHZhbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgdmFsdWUgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUgPCAwKSB7CiAgICAgICAgICB2YWx1ZSA9ICcoJyArIHZhbHVlICsgJyknOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0pOwogICAgICBleHAgPSBleHAucmVwbGFjZSgvW3xcW3xcXV0vZywgIiIpOwogICAgICBpZiAoZXhwLnN1YnN0cmluZygwLCAxNikgIT0gIkZvcm1NYXRoLnRvZml4ZWQiKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWx1ZSh0aGlzLnRvZml4ZWQoZXZhbCgiKCIuY29uY2F0KGV4cCwgIikiKSksIDApKTsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIHJldHVybiB0aGlzLmlzVmFsdWUoZXZhbCgiKCIuY29uY2F0KGV4cCwgIikiKSkpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIF90aGlzLiRtZXNzYWdlKHsKICAgICAgICAgIG1lc3NhZ2U6ICLorqHnrpflhazlvI/miafooYzlpLHotKXvvJoiICsgZXJyb3IsCiAgICAgICAgICB0eXBlOiAiZXJyb3IiCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgIH0sCiAgICBnZXRWYWx1ZUJ5UGF0aDogZnVuY3Rpb24gZ2V0VmFsdWVCeVBhdGgocGF0aCwgc3ViSW5kZXgpIHsKICAgICAgdmFyIG9iaiA9IHRoaXMuaG90U2V0dGluZ3MuZGF0YTsKICAgICAgaWYgKCFvYmogfHwgIXBhdGggfHwgcGF0aC5jb25zdHJ1Y3RvciAhPSBTdHJpbmcpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAoIS9eXHc/LipbXHd8XF1dJC8udGVzdChwYXRoKSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHZhciBwYXRoQXJ5ID0gcGF0aC5zcGxpdCgiLiIpOwogICAgICBpZiAocGF0aEFyeS5sZW5ndGggPT0gMSkgewogICAgICAgIHJldHVybiBvYmpbcGF0aF07CiAgICAgIH0gZWxzZSBpZiAocGF0aEFyeS5sZW5ndGggPiAxKSB7CiAgICAgICAgdmFyIHJldCA9IG9iajsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmIChyZXQgPT09IG51bGwgfHwgcmV0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIga2V5ID0gcGF0aEFyeVtpXTsKICAgICAgICAgIHZhciBtYXRjaCA9IC9eKFx3KylcWyhcZCspXF0kLy5leGVjKGtleSk7CiAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgcmV0ID0gcmV0W21hdGNoWzFdXVttYXRjaFsyXV07CiAgICAgICAgICB9IGVsc2UgaWYgKHJldCAmJiByZXQuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgIHZhciBpbmRleCA9IDA7CiAgICAgICAgICAgIGlmIChzdWJJbmRleCAhPSBudWxsICYmIHN1YkluZGV4ICE9IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgIHZhciBwcmVJbmRleCA9IE51bWJlci5wYXJzZUludChzdWJJbmRleCk7CiAgICAgICAgICAgICAgaWYgKCFpc05hTihwcmVJbmRleCkpIHsKICAgICAgICAgICAgICAgIGluZGV4ID0gcHJlSW5kZXg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldCA9IHJldFtpbmRleF1ba2V5XTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldCA9IHJldFtrZXldOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfSwKICAgIGlzVmFsdWU6IGZ1bmN0aW9uIGlzVmFsdWUodmFsdWUpIHsKICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgIHJldHVybiAiIjsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiSW5maW5pdHkiKSB7CiAgICAgICAgcmV0dXJuICIiOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfQogICAgfSwKICAgIHRvZml4ZWQ6IGZ1bmN0aW9uIHRvZml4ZWQoeCwgYikgewogICAgICB2YXIgdG1wID0gdGhpcy50b051bWJlcih4KTsKICAgICAgYiA9IHRoaXMudG9OdW1iZXIoYik7CiAgICAgIGlmIChpc05hTih0bXApIHx8IHRtcCA9PT0gIiIgfHwgaXNOYU4oYikpIHJldHVybiB4OwogICAgICByZXR1cm4gdG1wLnRvRml4ZWQoYik7CiAgICB9LAogICAgcGFyc2VGdW5jZXhwRmllbGQ6IGZ1bmN0aW9uIHBhcnNlRnVuY2V4cEZpZWxkKHN0YXRGdW4pIHsKICAgICAgdmFyIG15cmVnZXhwID0gL1t7fFtdLio/XCgoLio/KVwpW318XF1dL2c7CiAgICAgIHZhciBtYXRjaCA9IG15cmVnZXhwLmV4ZWMoc3RhdEZ1bik7CiAgICAgIHZhciBhcnJzID0gW107CiAgICAgIHdoaWxlIChtYXRjaCAhPSBudWxsKSB7CiAgICAgICAgdmFyIHN0ciA9IG1hdGNoWzFdOwogICAgICAgIHZhciBoYXMgPSBmYWxzZTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgdjsgdiA9IGFycnNbaSsrXTspIHsKICAgICAgICAgIGlmICh2ID09IHN0cikgaGFzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFoYXMpIGFycnMucHVzaChzdHIpOwogICAgICAgIG1hdGNoID0gbXlyZWdleHAuZXhlYyhzdGF0RnVuKTsKICAgICAgfQogICAgICByZXR1cm4gYXJyczsKICAgIH0sCiAgICBmaWxsYmFja0hvdFRhYmxlRGF0YTogZnVuY3Rpb24gZmlsbGJhY2tIb3RUYWJsZURhdGEoc3ViRGF0YSwgbmVlZEV4ZWNDcm9zcykgewogICAgICBpZiAoc3ViRGF0YSAmJiBzdWJEYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHN1YkRhdGEpKTsKICAgICAgICB2YXIgbWVyZ2VDZWxscyA9IHRoaXMuYnVpbGRNZXJnZUNlbGwoc3ViRGF0YSk7CiAgICAgICAgaWYgKG1lcmdlQ2VsbHMgJiYgdHlwZW9mIG1lcmdlQ2VsbHMgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgIHRoaXMuaG90U2V0dGluZ3MubWVyZ2VDZWxscyA9IG1lcmdlQ2VsbHM7CiAgICAgICAgfQogICAgICAgIGlmIChuZWVkRXhlY0Nyb3NzICE9PSBmYWxzZSkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy90aGlzLmV4ZWNDcm9zc01hcHBpbmcoKTsvL+aJp+ihjOi3qOihqOWPluaVsAogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9CiAgICAgICAgfQogICAgICAgIHRoaXMuZXhlY0luQ2VsbE1hdGhFeHAoc3ViRGF0YSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5kYXRhID0gW1tdXTsKICAgICAgfQogICAgfSwKICAgIG1lcmdlQ2VsbFJlZnJlc2g6IGZ1bmN0aW9uIG1lcmdlQ2VsbFJlZnJlc2goKSB7CiAgICAgIC8v5omn6KGM5ZCI5bm25Y2V5YWD5qC8CiAgICAgIHZhciBkYXRhID0gdGhpcy5nZXRCYWNrTWVyZ2VEYXRhKCk7CiAgICAgIHRoaXMuaG90U2V0dGluZ3MubWVyZ2VDZWxscyA9IHRoaXMuYnVpbGRNZXJnZUNlbGwoZGF0YSk7CiAgICB9LAogICAgZXhlY0NlbGxNYXRoRXhwOiBmdW5jdGlvbiBleGVjQ2VsbE1hdGhFeHAoZGF0YSkgewogICAgICAvL+i/memHjOaJp+ihjDPpgY0g6Ziy5q2i5YyF5ZCr6KGM5YaF6K6h566X5ZKM6Leo6KGM6K6h566X5YWI5ZCO6aG65bqP6YO95pyJ55qE5oOF5Ya1CiAgICAgIHRoaXMuZXhlY0luQ2VsbE1hdGhFeHAoZGF0YSk7CiAgICAgIHRoaXMuZXhlY0luQ2VsbE1hdGhFeHAoKTsKICAgICAgdGhpcy5leGVjSW5DZWxsTWF0aEV4cCgpOwogICAgfSwKICAgIGV4ZWNJbkNlbGxNYXRoRXhwOiBmdW5jdGlvbiBleGVjSW5DZWxsTWF0aEV4cChkYXRhLCBjaGFuZ2VzKSB7CiAgICAgIC8v5omn6KGM6K6h566X5YWs5byPCiAgICAgIGlmICghZGF0YSkgewogICAgICAgIGRhdGEgPSB0aGlzLmdldEJhY2tNZXJnZURhdGEoKTsKICAgICAgfQogICAgICB2YXIgaXNuZWVkRnN1bSA9IGZhbHNlOwogICAgICBpZiAoIWNoYW5nZXMpIHsKICAgICAgICBjaGFuZ2VzID0gW107CiAgICAgIH0KICAgICAgaWYgKGNoYW5nZXMubGVuZ3RoID4gMCB8fCB0aGlzLmFsbE1hdGhFeHBMaXN0ICYmIHRoaXMuYWxsTWF0aEV4cExpc3QubGVuZ3RoID4gMCAmJiBkYXRhICYmIGRhdGEubGVuZ3RoID4gMCB8fCB0aGlzLmNlbGxDYWxjcyB8fCB0aGlzLmNlbGxDYWxjcy5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIGl0ZW1zID0gdGhpcy5hbGxNYXRoRXhwTGlzdDsKICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoID4gMCkgewogICAgICAgICAgdmFyIGRhdGFTaXplID0gZGF0YS5sZW5ndGg7CiAgICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgIGlmIChpdGVtLmlzQWxsKSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhU2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICAgICBjaGFuZ2VzLnB1c2goewogICAgICAgICAgICAgICAgICAwOiBpLAogICAgICAgICAgICAgICAgICAxOiBpdGVtWyduYW1lJ10KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoaXRlbS5pbmRleCAmJiBpdGVtLmluZGV4Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBpdGVtLmluZGV4Lmxlbmd0aDsgX2krKykgewogICAgICAgICAgICAgICAgICBjaGFuZ2VzLnB1c2goewogICAgICAgICAgICAgICAgICAgIDA6IGl0ZW0uaW5kZXhbX2ldLAogICAgICAgICAgICAgICAgICAgIDE6IGl0ZW1bJ25hbWUnXQogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICB2YXIgY2VsbENhbGNzID0gdGhpcy5jZWxsQ2FsY3M7CiAgICAgICAgaWYgKGNlbGxDYWxjcyAmJiBjZWxsQ2FsY3MubGVuZ3RoID4gMCkgewogICAgICAgICAgdmFyIGNlbGxDYWxjID0gY2VsbENhbGNzWzBdOwogICAgICAgICAgY2hhbmdlcy5wdXNoKHsKICAgICAgICAgICAgMDogY2VsbENhbGMucm93SW5kZXgsCiAgICAgICAgICAgIDE6IGNlbGxDYWxjLmNlbGxGaWVsZC5zcGxpdCgnLicpWzJdCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAvL3RoaXMuZXhlY01hdGhFeHBTaW5nbGUoY2hhbmdlcyk7CiAgICAgICAgICB0aGlzLmV4ZWNNYXRoRXhwQWxsKGNoYW5nZXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpc25lZWRGc3VtID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaXNuZWVkRnN1bSA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKGlzbmVlZEZzdW0pIHsKICAgICAgICAvL+aJp+ihjOmmluihjOaxh+aAuwogICAgICAgIHZhciBmc3VtTWFwID0gdGhpcy5maXJzdFN1bU1hcDsKICAgICAgICBpZiAoJ3t9JyAhPSBKU09OLnN0cmluZ2lmeShmc3VtTWFwKSkgewogICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgIHZhciBpc0NoYW5nZSA9IGZhbHNlOwogICAgICAgICAgdmFyIGhvdERhdGEgPSB0aGlzLmdldEhvdFRhYmxlRGF0YSgpOwogICAgICAgICAgZm9yICh2YXIgc3VtS2V5IGluIGZzdW1NYXApIHsKICAgICAgICAgICAgaWYgKGZzdW1NYXAuaGFzT3duUHJvcGVydHkoc3VtS2V5KSkgewogICAgICAgICAgICAgIHZhciB0ZW1wUmVzdWx0ID0gX3RoaXMuZXhlRmlyc3RSb3dTdW0oaG90RGF0YSwgc3VtS2V5LCBfdGhpcywgaXNDaGFuZ2UsIGZzdW1NYXApOwogICAgICAgICAgICAgIGhvdERhdGEgPSB0ZW1wUmVzdWx0LmRhdGE7CiAgICAgICAgICAgICAgaWYgKHRlbXBSZXN1bHQuaXNDaGFuZ2UpIHsKICAgICAgICAgICAgICAgIGlzQ2hhbmdlID0gdGVtcFJlc3VsdC5pc0NoYW5nZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc0NoYW5nZSkgewogICAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGEgPSBbXTsKICAgICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5kYXRhID0gaG90RGF0YTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLm1lcmdlQ2VsbHMgJiYgdGhpcy5tZXJnZUNlbGxzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5tZXJnZUNlbGxzID0gdGhpcy5idWlsZE1lcmdlQ2VsbChob3REYXRhKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBleGVjQ3Jvc3NNYXBwaW5nOiBmdW5jdGlvbiBleGVjQ3Jvc3NNYXBwaW5nKCkgewogICAgICBpZiAodGhpcy5jcm9zc01hcHBpbmdzICYmIHRoaXMuY3Jvc3NNYXBwaW5nU3ViVGFibGVzLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgc3ViRGF0YSA9IHt9OwogICAgICAgIHZhciBjdXJEYXRhID0gdGhpcy5nZXRIb3RUYWJsZURhdGEoKTsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHZhciBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsKICAgICAgICB0aGlzLmNyb3NzTWFwcGluZ1N1YlRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uIChzdWIpIHsKICAgICAgICAgIHZhciBob3RUYWJsZVJlZiA9ICdob3R0YWJsZS4nICsgc3ViOwogICAgICAgICAgdmFyIGhvdFRhYmxlT2JqID0gZm9ybUluc3QuJHJlZnNbIm9ubGluZUZvcm0iXS4kcmVmc1tob3RUYWJsZVJlZl07CiAgICAgICAgICBpZiAoaG90VGFibGVPYmopIHsKICAgICAgICAgICAgc3ViRGF0YVtzdWJdID0gZm9ybUluc3QuJHJlZnNbIm9ubGluZUZvcm0iXS4kcmVmc1tob3RUYWJsZVJlZl0uZ2V0SG90VGFibGVEYXRhKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgcGF0aHMgPSBzdWIuc3BsaXQoJy4nKTsKICAgICAgICAgICAgaWYgKGZvcm1JbnN0LmRhdGFbcGF0aHNbMF1dICYmIGZvcm1JbnN0LmRhdGFbcGF0aHNbMF1dW3BhdGhzWzFdXSkgewogICAgICAgICAgICAgIHN1YkRhdGFbc3ViXSA9IGZvcm1JbnN0LmRhdGFbcGF0aHNbMF1dW3BhdGhzWzFdXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHZhciBpc0NoYW5nZSA9IGZhbHNlOwogICAgICAgIGZvciAodmFyIHN1YlRhYmxlUGF0aCBpbiBfdGhpcy5jcm9zc01hcHBpbmdzKSB7CiAgICAgICAgICBpZiAoX3RoaXMuY3Jvc3NNYXBwaW5ncy5oYXNPd25Qcm9wZXJ0eShzdWJUYWJsZVBhdGgpKSB7CiAgICAgICAgICAgIHZhciB0b0ZMaXN0ID0gX3RoaXMuY3Jvc3NNYXBwaW5nc1tzdWJUYWJsZVBhdGhdOwogICAgICAgICAgICB0b0ZMaXN0LmZvckVhY2goZnVuY3Rpb24gKG1hcCkgewogICAgICAgICAgICAgIHZhciBmcm9tRmllbGRzID0gbWFwWydmcm9tRmllbGRzJ107CiAgICAgICAgICAgICAgdmFyIHRvSW5kZXggPSBfdGhpcy50b051bWJlcihtYXBbJ3RvSW5kZXgnXSkgLSAxOwogICAgICAgICAgICAgIHZhciB0b0ZpZWxkUGF0aCA9IG1hcFsndG9GaWVsZCddLnNwbGl0KCcuJyk7CiAgICAgICAgICAgICAgaWYgKGZyb21GaWVsZHMgJiYgZnJvbUZpZWxkcy5sZW5ndGggPiAwICYmIGN1ckRhdGFbdG9JbmRleF0pIHsKICAgICAgICAgICAgICAgIHZhciBzdW1WYWx1ZSA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZyb21GaWVsZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZnJvbUZpZWxkc1tpXTsKICAgICAgICAgICAgICAgICAgdmFyIGZyb21GaWVsZFBhdGggPSBmaWVsZC5mcm9tRmllbGQuc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgICAgdmFyIGZyb21JbmRleCA9IF90aGlzLnRvTnVtYmVyKGZpZWxkWydmcm9tSW5kZXgnXSkgLSAxOwogICAgICAgICAgICAgICAgICB2YXIgc3ViUGF0aCA9IGZyb21GaWVsZFBhdGhbMF0gKyAnLicgKyBmcm9tRmllbGRQYXRoWzFdOwogICAgICAgICAgICAgICAgICBpZiAoc3ViRGF0YVtzdWJQYXRoXSAmJiBzdWJEYXRhW3N1YlBhdGhdW2Zyb21JbmRleF0gJiYgY3VyRGF0YVt0b0luZGV4XSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3ViRGF0YVtzdWJQYXRoXVtmcm9tSW5kZXhdW2Zyb21GaWVsZFBhdGhbMl1dICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcFZhbHVlID0gc3ViRGF0YVtzdWJQYXRoXVtmcm9tSW5kZXhdW2Zyb21GaWVsZFBhdGhbMl1dOwogICAgICAgICAgICAgICAgICAgICAgc3VtVmFsdWUgKz0gX3RoaXMudG9OdW1iZXIodGVtcFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGN1ckRhdGFbdG9JbmRleF1bdG9GaWVsZFBhdGhbMl1dID0gc3VtVmFsdWU7CiAgICAgICAgICAgICAgICBpc0NoYW5nZSA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGlzQ2hhbmdlKSB7CiAgICAgICAgICB0aGlzLmZpbGxiYWNrSG90VGFibGVEYXRhKGN1ckRhdGEsIGZhbHNlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBnZXRCYWNrTWVyZ2VEYXRhOiBmdW5jdGlvbiBnZXRCYWNrTWVyZ2VEYXRhKGV4ZU1hdGgpIHsKICAgICAgLy/ojrflj5bmgaLlpI3lkIjlubbljZXlhYPmoLzlkI7nmoTmlbDmja4KICAgICAgLy/lj5bmlbDliY3lhYjmiafooYzot6jooajlj5bmlbDlkozorqHnrpflhazlvI8KICAgICAgaWYgKGV4ZU1hdGggPT09IHRydWUpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdGhpcy5leGVjQ3Jvc3NNYXBwaW5nKCk7IC8v5omn6KGM6Leo6KGo5Y+W5pWwCiAgICAgICAgICB0aGlzLmV4ZWNDZWxsTWF0aEV4cCgpOyAvL+aJp+ihjOiuoeeul+WFrOW8jyAKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpOwogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgZGF0YSA9IHRoaXMuaG90U2V0dGluZ3MuZGF0YTsKICAgICAgdmFyIHJvdyA9IHRoaXMuaW5pdFJvd0RhdGE7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIC8v5aSE55CG5Yid5aeL5YyW5pe255qE56ys5LiA6KGM5pWw5o2u57G75Z6L5Li65pWw57uE6L2sanNvbuS4uuepuumXrumimAogICAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDAgJiYgQXJyYXkuaXNBcnJheShkYXRhWzBdKSAmJiByb3cgJiYgSlNPTi5zdHJpbmdpZnkocm93KSAhPSAne30nKSB7CiAgICAgICAgdmFyIG5ld1JvdyA9IHt9OwogICAgICAgIHZhciBvbGRSb3cgPSB0aGlzLmhvdFNldHRpbmdzLmRhdGFbMF07CiAgICAgICAgZm9yICh2YXIga2V5IGluIHJvdykgewogICAgICAgICAgaWYgKHJvdy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgIG5ld1Jvd1trZXldID0gdHlwZW9mIG9sZFJvd1trZXldID09ICd1bmRlZmluZWQnID8gJycgOiBvbGRSb3dba2V5XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZGF0YVswXSA9IG5ld1JvdzsKICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGFbMF0gPSBuZXdSb3c7CiAgICAgIH0KICAgICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPT0gMSAmJiBKU09OLnN0cmluZ2lmeShkYXRhWzBdKSA9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmluaXRSb3dEYXRhKSkgewogICAgICAgIHJldHVybiBbXTsKICAgICAgfQogICAgICB2YXIgbWVyZ2VDZWxscyA9IHRoaXMubWVyZ2VDZWxsczsKICAgICAgaWYgKG1lcmdlQ2VsbHMgJiYgbWVyZ2VDZWxscy5sZW5ndGggPiAwICYmIGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIGNvbHVtbnMgPSB0aGlzLmhvdFNldHRpbmdzLmNvbHVtbnM7CiAgICAgICAgbWVyZ2VDZWxscy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICB2YXIgcm93SW5kZXggPSBpdGVtLnJvdzsKICAgICAgICAgIGlmIChkYXRhW3Jvd0luZGV4XSkgewogICAgICAgICAgICB2YXIgcm93c3BhbiA9IGl0ZW0ucm93c3BhbjsKICAgICAgICAgICAgdmFyIGZpZWxkID0gY29sdW1uc1tpdGVtWydjb2wnXV1bJ2RhdGEnXTsKICAgICAgICAgICAgdmFyIGJhc2VWYWx1ZSA9IGRhdGFbcm93SW5kZXhdW2ZpZWxkXTsKICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSByb3dJbmRleDsgaW5kZXggPCByb3dJbmRleCArIHJvd3NwYW47IGluZGV4KyspIHsKICAgICAgICAgICAgICBpZiAoZGF0YVtpbmRleF0pIHsKICAgICAgICAgICAgICAgIGRhdGFbaW5kZXhdW2ZpZWxkXSA9IGJhc2VWYWx1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICAvL+WkhOeQhuWhq+WItuWNleS9je+8iOWkjeWItueahOaXtuWAme+8iQogICAgICB2YXIgY3VzdERpYWxvZyA9IHRoaXMuaW5pdEN1c3REaWFsb2dDb25mOwogICAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDAgJiYgY3VzdERpYWxvZyAmJiBjdXN0RGlhbG9nLm9yZ0NvbmZpZyAmJiAoY3VzdERpYWxvZy5vcmdDb25maWcubmFtZSAmJiB0aGlzLmZpbGxPcmcuaWQgfHwgY3VzdERpYWxvZy5vcmdDb25maWcuaW5zdElkKSkgewogICAgICAgIHZhciBmaWxsRmlsbE9iaiA9IHRoaXMuZ2V0T3JnRmlsbEZpZWxkT2JqKGN1c3REaWFsb2cpOwogICAgICAgIGlmIChmaWxsRmlsbE9iai5vcmdOYW1lRmllbGQgfHwgZmlsbEZpbGxPYmoub3JnSWRGaWVsZCB8fCBmaWxsRmlsbE9iai5vcmdDb2RlRmllbGQgfHwgZmlsbEZpbGxPYmouaW5zdElkRmllbGQpIHsKICAgICAgICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICBpZiAoZmlsbEZpbGxPYmoub3JnTmFtZUZpZWxkICYmICFpdGVtW2ZpbGxGaWxsT2JqLm9yZ05hbWVGaWVsZF0pIHsKICAgICAgICAgICAgICBpdGVtW2ZpbGxGaWxsT2JqLm9yZ05hbWVGaWVsZF0gPSBfdGhpcy5maWxsT3JnLm5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZpbGxGaWxsT2JqLm9yZ0lkRmllbGQgJiYgIWl0ZW1bZmlsbEZpbGxPYmoub3JnSWRGaWVsZF0pIHsKICAgICAgICAgICAgICBpdGVtW2ZpbGxGaWxsT2JqLm9yZ0lkRmllbGRdID0gX3RoaXMuZmlsbE9yZy5pZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZmlsbEZpbGxPYmoub3JnQ29kZUZpZWxkICYmICFpdGVtW2ZpbGxGaWxsT2JqLm9yZ0NvZGVGaWVsZF0pIHsKICAgICAgICAgICAgICBpdGVtW2ZpbGxGaWxsT2JqLm9yZ0NvZGVGaWVsZF0gPSBfdGhpcy5maWxsT3JnLmNvZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZpbGxGaWxsT2JqLmluc3RJZEZpZWxkICYmICFpdGVtW2ZpbGxGaWxsT2JqLmluc3RJZEZpZWxkXSkgewogICAgICAgICAgICAgIGl0ZW1bZmlsbEZpbGxPYmouaW5zdElkRmllbGRdID0gX3RoaXMuaW5zdElkOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGRhdGE7CiAgICB9LAogICAgZ2V0T3JnRmlsbEZpZWxkT2JqOiBmdW5jdGlvbiBnZXRPcmdGaWxsRmllbGRPYmooY3VzdERpYWxvZykgewogICAgICB2YXIgb3JnRmlsbEZpZWxkT2JqID0gewogICAgICAgIG9yZ05hbWVGaWVsZDogJycsCiAgICAgICAgb3JnSWRGaWVsZDogJycsCiAgICAgICAgb3JnQ29kZUZpZWxkOiAnJywKICAgICAgICBpbnN0SWRGaWVsZDogJycKICAgICAgfTsKICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnLm5hbWUpIHsKICAgICAgICB2YXIgbmFtZVBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lLnNwbGl0KCcuJyk7CiAgICAgICAgb3JnRmlsbEZpZWxkT2JqLm9yZ05hbWVGaWVsZCA9IG5hbWVQYXRoW25hbWVQYXRoLmxlbmd0aCAtIDFdOwogICAgICB9CiAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pZCkgewogICAgICAgIHZhciBpZFBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pZC5zcGxpdCgnLicpOwogICAgICAgIG9yZ0ZpbGxGaWVsZE9iai5vcmdJZEZpZWxkID0gaWRQYXRoW2lkUGF0aC5sZW5ndGggLSAxXTsKICAgICAgfQogICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcuY29kZSkgewogICAgICAgIHZhciBjb2RlUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmNvZGUuc3BsaXQoJy4nKTsKICAgICAgICBvcmdGaWxsRmllbGRPYmoub3JnQ29kZUZpZWxkID0gY29kZVBhdGhbY29kZVBhdGgubGVuZ3RoIC0gMV07CiAgICAgIH0KICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZCkgewogICAgICAgIHZhciBpbnN0SWRQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuaW5zdElkLnNwbGl0KCcuJyk7CiAgICAgICAgb3JnRmlsbEZpZWxkT2JqLmluc3RJZEZpZWxkID0gaW5zdElkUGF0aFtpbnN0SWRQYXRoLmxlbmd0aCAtIDFdOwogICAgICB9CiAgICAgIHJldHVybiBvcmdGaWxsRmllbGRPYmo7CiAgICB9LAogICAgZ2V0SG90VGFibGVEYXRhOiBmdW5jdGlvbiBnZXRIb3RUYWJsZURhdGEoZXhlTWF0aCkgewogICAgICAvL+WmguaenOaYr+S/neWtmOaIluaPkOS6pOaXtumcgOi/m+ihjOW/heWhq+agoemqjAogICAgICB2YXIgZGF0YSA9IHRoaXMuZ2V0QmFja01lcmdlRGF0YShleGVNYXRoKTsKICAgICAgaWYgKGV4ZU1hdGggPT09IHRydWUpIHsKICAgICAgICBpZiAoIXRoaXMudmFsaWRhdGVDZWxscyhkYXRhKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZGF0YTsKICAgIH0sCiAgICB2YWxpZGF0ZUNlbGxzOiBmdW5jdGlvbiB2YWxpZGF0ZUNlbGxzKGRhdGEpIHsKICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgdmFyIGlzVHJ1ZSA9IHRydWU7CiAgICAgIHZhciByZXF1aXJlZHMgPSB0aGlzLnJlcXVpcmVkUm93c01hcDsKICAgICAgaWYgKHJlcXVpcmVkcyAmJiAne30nICE9PSBKU09OLnN0cmluZ2lmeShyZXF1aXJlZHMpKSB7CiAgICAgICAgaWYgKCFkYXRhIHx8IGRhdGEubGVuZ3RoIDwgMSkgewogICAgICAgICAgX3RoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICBtZXNzYWdlOiAi5a2Q6KGo44CQIiArIF90aGlzLm5hbWUgKyAi44CR5a2Y5Zyo5b+F5aGr6aG55pyq5aGr5YaZ77yBIiwKICAgICAgICAgICAgdHlwZTogImVycm9yIgogICAgICAgICAgfSk7CiAgICAgICAgICBpc1RydWUgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdmFyIF9sb29wMyA9IGZ1bmN0aW9uIF9sb29wMyhmaWVsZCkgewogICAgICAgICAgICBpZiAocmVxdWlyZWRzLmhhc093blByb3BlcnR5KGZpZWxkKSkgewogICAgICAgICAgICAgIHZhciByZXF1aXJlZCA9IHJlcXVpcmVkc1tmaWVsZF07CiAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkLmFsbCA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgIGlmICghZGF0YVtpXVtmaWVsZF0gJiYgZGF0YVtpXVtmaWVsZF0gIT09IDAgJiYgZGF0YVtpXVtmaWVsZF0gIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIuWtkOihqOOAkCIgKyBfdGhpcy5uYW1lICsgIuOAkeS4reesrOOAkCIgKyAoaSArIDEpICsgIuOAkeihjOOAkCIgKyBfdGhpcy5maWVsZE5hbWVNYXBbZmllbGRdICsgIuOAkeW/heWhq++8gSIsCiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAiZXJyb3IiCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgaXNUcnVlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgIHY6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWlyZWQucm93cyAmJiByZXF1aXJlZC5yb3dzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHJlcXVpcmVkLnJvd3MuZm9yRWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhW2luZGV4IC0gMV0gfHwgIWRhdGFbaW5kZXggLSAxXVtmaWVsZF0gJiYgZGF0YVtpbmRleCAtIDFdW2ZpZWxkXSAhPT0gMCAmJiBkYXRhW2luZGV4IC0gMV1bZmllbGRdICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICLlrZDooajjgJAiICsgX3RoaXMubmFtZSArICLjgJHkuK3nrKzjgJAiICsgaW5kZXggKyAi44CR6KGM44CQIiArIF90aGlzLmZpZWxkTmFtZU1hcFtmaWVsZF0gKyAi44CR5b+F5aGr77yBIiwKICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJlcnJvciIKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBpc1RydWUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIF9yZXQ7CiAgICAgICAgZm9yICh2YXIgZmllbGQgaW4gcmVxdWlyZWRzKSB7CiAgICAgICAgICBfcmV0ID0gX2xvb3AzKGZpZWxkKTsKICAgICAgICAgIGlmIChfcmV0KSByZXR1cm4gX3JldC52OwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gaXNUcnVlOwogICAgfSwKICAgIGluaXRUZW1wbGF0ZURhdGE6IGZ1bmN0aW9uIGluaXRUZW1wbGF0ZURhdGEoKSB7CiAgICAgIGlmICh0aGlzLmlzSW5pdFRlbXBsYXRlRGF0YSAhPT0gJ3RydWUnKSB7CiAgICAgICAgLy/liJ3lp4vljJbnu5/orqHooYwKICAgICAgICB0aGlzLnRvQWRkSW5pdFN1bVJvdygpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAvL+WmguaenOW3suacieaVsOaNruWImeS4jemcgOimgeWGjeasoeWIneWni+WMlgogICAgICB2YXIgY3VyRGF0YSA9IHRoaXMuZ2V0SG90VGFibGVEYXRhKCk7CiAgICAgIHZhciBpbml0VHlwZSA9IHRoaXMuaW5pdEZpbGxEYXRhVHlwZTsKICAgICAgdmFyIGZvcm1JbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKF90aGlzKTsKICAgICAgaWYgKCFpbml0VHlwZSB8fCBpbml0VHlwZSA9PSAnZW1wdHknKSB7CiAgICAgICAgaWYgKGN1ckRhdGEubGVuZ3RoID09IDAgfHwgY3VyRGF0YS5sZW5ndGggPT0gMSAmJiAoQXJyYXkuaXNBcnJheShjdXJEYXRhWzBdKSB8fCBKU09OLnN0cmluZ2lmeShjdXJEYXRhWzBdKSA9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmluaXRSb3dEYXRhKSkpIHsKICAgICAgICAgIHRoaXMuaG90U2V0dGluZ3MuZGF0YSA9IFtbXV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8v5Yid5aeL5YyW57uf6K6h6KGMCiAgICAgICAgICB0aGlzLnRvQWRkSW5pdFN1bVJvdygpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpbml0VHlwZSA9PSAnY292ZXInKSB7CiAgICAgICAgdmFyIHBhdGhzID0gdGhpcy5zdWJUYWJsZVBhdGguc3BsaXQoJy4nKTsKICAgICAgICBmb3JtSW5zdFsnZGF0YSddW3BhdGhzWzBdXVtwYXRoc1sxXV0gPSBbXTsKICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGEgPSBbW11dOwogICAgICB9CiAgICAgIGlmICghdGhpcy5pbml0Q3VzdERpYWxvZ0NvbmYgfHwgIXRoaXMuaW5pdEN1c3REaWFsb2dDb25mLmN1c3REaWFsb2cgfHwgIXRoaXMuaW5pdEN1c3REaWFsb2dDb25mLmN1c3REaWFsb2cuYWxpYXMpIHsKICAgICAgICAvL+WIneWni+WMlue7n+iuoeihjAogICAgICAgIHRoaXMudG9BZGRJbml0U3VtUm93KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBsb2FkaW5nID0gdGhpcy4kbG9hZGluZyh7CiAgICAgICAgbG9jazogdHJ1ZSwKICAgICAgICB0ZXh0OiAn5q2j5Zyo5Yid5aeL5YyW5aGr5oql5qih5p2/Li4uJywKICAgICAgICBzcGlubmVyOiAnZWwtaWNvbi1sb2FkaW5nJywKICAgICAgICBiYWNrZ3JvdW5kOiAncmdiYSgwLCAwLCAwLCAwLjcpJwogICAgICB9KTsKICAgICAgdGhpcy4kaHR0cC5nZXQoJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0QnlBbGlhcz9hbGlhcz0nICsgdGhpcy5pbml0Q3VzdERpYWxvZ0NvbmYuY3VzdERpYWxvZy5hbGlhcykudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgIF90aGlzLmN1c3RvbURpYWxvZyA9IHJlc3AuZGF0YTsKICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgX3RoaXMuY2xvc2VMb2FkaW5nKGxvYWRpbmcpOwogICAgICAgIF90aGlzLiRtZXNzYWdlKHsKICAgICAgICAgIG1lc3NhZ2U6ICLojrflj5boh6rlrprkuYnlr7nor53moYblpLHotKXvvIEiLAogICAgICAgICAgdHlwZTogImVycm9yIgogICAgICAgIH0pOwogICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgY3VzdGRpYWxvZyA9IF90aGlzLmluaXRDdXN0RGlhbG9nQ29uZjsKICAgICAgICB2YXIgY3VycmVudFVzZXIgPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oImN1cnJlbnRVc2VyIikpOwogICAgICAgIGlmICghY3VzdGRpYWxvZy5vcmdDb25maWcuY29kZSAmJiAhY3VzdGRpYWxvZy5vcmdDb25maWcubmFtZSAmJiAhY3VzdGRpYWxvZy5vcmdDb25maWcuaWQpIHsKICAgICAgICAgIF90aGlzLmNsb3NlTG9hZGluZyhsb2FkaW5nKTsKICAgICAgICAgIF90aGlzLnRvRmlsbEluaXREYXRhKF90aGlzKTsKICAgICAgICB9IGVsc2UgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJjdXJGaWxsT3JnXyIgKyBjdXJyZW50VXNlci5hY2NvdW50KSkgewogICAgICAgICAgX3RoaXMuY2xvc2VMb2FkaW5nKGxvYWRpbmcpOwogICAgICAgICAgX3RoaXMuZmlsbE9yZyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oImN1ckZpbGxPcmdfIiArIGN1cnJlbnRVc2VyLmFjY291bnQpKTsKICAgICAgICAgIF90aGlzLnRvRmlsbEluaXREYXRhKF90aGlzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX3RoaXMuJGh0dHAuZ2V0KCcke3VjfS9hcGkvb3JnL3YxL29yZy9nZXRGaWxsT3JnJykudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgICBfdGhpcy5jbG9zZUxvYWRpbmcobG9hZGluZyk7CiAgICAgICAgICAgIHZhciByZXAgPSByZXNwLmRhdGE7CiAgICAgICAgICAgIGlmIChyZXAuc3RhdGUpIHsKICAgICAgICAgICAgICBfdGhpcy5maWxsT3JnID0gcmVwLnZhbHVlOwogICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjdXJGaWxsT3JnXyIgKyBjdXJyZW50VXNlci5hY2NvdW50LCBKU09OLnN0cmluZ2lmeShyZXAudmFsdWUpKTsKICAgICAgICAgICAgICBfdGhpcy50b0ZpbGxJbml0RGF0YShfdGhpcyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX3RoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgbWVzc2FnZTogcmVwLm1lc3NhZ2UsCiAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgIF90aGlzLmNsb3NlTG9hZGluZyhsb2FkaW5nKTsKICAgICAgICAgICAgX3RoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICAgIG1lc3NhZ2U6ICLojrflj5blvZPliY3nlKjmiLfloavliLbljZXkvY3lpLHotKXvvIEiLAogICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9LAogICAgY2xvc2VMb2FkaW5nOiBmdW5jdGlvbiBjbG9zZUxvYWRpbmcobG9hZGluZykgewogICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICBsb2FkaW5nLmNsb3NlKCk7CiAgICAgIH0sIDIwMDApOwogICAgfSwKICAgIHRvRmlsbEluaXREYXRhOiBmdW5jdGlvbiB0b0ZpbGxJbml0RGF0YShfdGhpcykgewogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICBfdGhpcy5maWxsSW5pdERhdGEoX3RoaXMpOwogICAgICB9LCAxMDAwKTsKICAgIH0sCiAgICBmaWxsSW5pdERhdGE6IGZ1bmN0aW9uIGZpbGxJbml0RGF0YShfdGhpcykgewogICAgICB2YXIgY3VzdERpYWxvZyA9IF90aGlzLmluaXRDdXN0RGlhbG9nQ29uZi5jdXN0RGlhbG9nOwogICAgICB2YXIgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UoX3RoaXMpOwogICAgICB2YXIgY3VyRGF0YSA9IGZvcm1JbnN0WydkYXRhJ107CiAgICAgIC8v5aSE55CG5a+56K+d5qGG55qE5Y+C5pWw5Lyg5YWlCiAgICAgIHZhciBwYXJhbXMgPSBbXTsKICAgICAgaWYgKGN1c3REaWFsb2cuY29uZGl0aW9ucykgewogICAgICAgIC8v5a+56K+d5qGG5oyJ6KGo5Y2V5a2X5q615p+l6K+i77yI5Y+C5pWw5Lyg5YWl55qE77yJCiAgICAgICAgdmFyIGJpbmRMaXN0ID0gY3VzdERpYWxvZy5jb25kaXRpb25zOwogICAgICAgIGlmIChiaW5kTGlzdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICBiaW5kTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHsKICAgICAgICAgICAgLy/nu5HlrprooajljZXlrZfmrrUKICAgICAgICAgICAgaWYgKGVsZS5kZWZhdWx0VHlwZSA9PSAiMyIgJiYgZWxlLmJpbmQpIHsKICAgICAgICAgICAgICB2YXIgb2JqID0ge307CiAgICAgICAgICAgICAgb2JqLmZpZWxkID0gZWxlLmZpZWxkOwogICAgICAgICAgICAgIHZhciBiaW5kQXJyYXkgPSBlbGUuYmluZC5zcGxpdCgnLicpOwogICAgICAgICAgICAgIGlmIChiaW5kQXJyYXkubGVuZ3RoID09IDMpIHsKICAgICAgICAgICAgICAgIG9iai5iaW5kID0gY3VyRGF0YVtiaW5kQXJyYXlbMV1dW2JpbmRBcnJheVsyXV07CiAgICAgICAgICAgICAgICBwYXJhbXMucHVzaChvYmopOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciB1cmwgPSAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRMaXN0RGF0YT9hbGlhcz0nICsgY3VzdERpYWxvZy5hbGlhczsKICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIHBhU3RyID0gJyc7CiAgICAgICAgcGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhKSB7CiAgICAgICAgICBpZiAocGFTdHIpIHsKICAgICAgICAgICAgcGFTdHIgKz0gJywnOwogICAgICAgICAgfQogICAgICAgICAgcGFTdHIgPSBwYVN0ciArICciJyArIHBhLmZpZWxkICsgJyI6IicgKyBwYS5iaW5kICsgJyInOwogICAgICAgIH0pOwogICAgICAgIHVybCA9IHVybCArICcmbWFwUGFyYW09JyArIHBhU3RyOwogICAgICB9IGVsc2UgewogICAgICAgIHVybCA9IHVybCArICcmbWFwUGFyYW09JzsKICAgICAgfQogICAgICB2YXIgcGFyYW0gPSB7CiAgICAgICAgcGFnZUJlYW46IHsKICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICBwYWdlU2l6ZTogMTAwMCwKICAgICAgICAgIHNob3dUb3RhbDogdHJ1ZQogICAgICAgIH0KICAgICAgfTsKICAgICAgX3RoaXMuJGh0dHAucG9zdCh1cmwsIHBhcmFtKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlID0gcmVzcC5kYXRhOwogICAgICAgIGlmIChyZXNwb25zZS5yb3dzKSB7CiAgICAgICAgICBfdGhpcy5zeW5jSW5pdFRhYmxlVmFsdWUocmVzcG9uc2Uucm93cyk7CiAgICAgICAgICBpZiAocmVzcG9uc2Uucm93cy5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAvL+WIneWni+WMlue7n+iuoeihjAogICAgICAgICAgICBfdGhpcy50b0FkZEluaXRTdW1Sb3coKTsKICAgICAgICAgICAgX3RoaXMuaG90U2V0dGluZ3MuZGF0YVswXSA9IF90aGlzLmZpbGxPcmdEYXRhRmllbGQoX3RoaXMuaG90U2V0dGluZ3MuZGF0YVswXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICBfdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICBtZXNzYWdlOiAi6I635Y+W5Yid5aeL5YyW5pWw5o2u5aSx6LSl77yBIiwKICAgICAgICAgIHR5cGU6ICJlcnJvciIKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9LAogICAgZ2V0RmlsbE9yZ09iajogZnVuY3Rpb24gZ2V0RmlsbE9yZ09iaihjdXN0RGlhbG9nKSB7CiAgICAgIC8v6I635Y+W5aGr5Yi25Y2V5L2N44CB5a6e5L6L5L+h5oGvCiAgICAgIHZhciBmaWxsT3JnID0gbnVsbDsKICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnICYmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pZCB8fCBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lIHx8IGN1c3REaWFsb2cub3JnQ29uZmlnLmNvZGUgfHwgY3VzdERpYWxvZy5vcmdDb25maWcuaW5zdElkKSAmJiB0aGlzLmZpbGxPcmcuaWQpIHsKICAgICAgICBmaWxsT3JnID0ge307CiAgICAgICAgdmFyIG5hbWVQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcubmFtZS5zcGxpdCgnLicpOwogICAgICAgIHZhciBvcmdOYW1lRmllbGQgPSBuYW1lUGF0aFtuYW1lUGF0aC5sZW5ndGggLSAxXTsKICAgICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcubmFtZSAmJiBvcmdOYW1lRmllbGQpIHsKICAgICAgICAgIGZpbGxPcmdbb3JnTmFtZUZpZWxkXSA9IHRoaXMuZmlsbE9yZy5uYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcuaWQpIHsKICAgICAgICAgIHZhciBpZFBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pZC5zcGxpdCgnLicpOwogICAgICAgICAgdmFyIG9yZ0lkRmllbGQgPSBpZFBhdGhbaWRQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgICAgZmlsbE9yZ1tvcmdJZEZpZWxkXSA9IHRoaXMuZmlsbE9yZy5pZDsKICAgICAgICB9CiAgICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnLmNvZGUpIHsKICAgICAgICAgIHZhciBjb2RlUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmNvZGUuc3BsaXQoJy4nKTsKICAgICAgICAgIHZhciBvcmdDb2RlRmllbGQgPSBjb2RlUGF0aFtjb2RlUGF0aC5sZW5ndGggLSAxXTsKICAgICAgICAgIGZpbGxPcmdbb3JnQ29kZUZpZWxkXSA9IHRoaXMuZmlsbE9yZy5jb2RlOwogICAgICAgIH0KICAgICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcuaW5zdElkKSB7CiAgICAgICAgICB2YXIgaW5zdElkUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZC5zcGxpdCgnLicpOwogICAgICAgICAgdmFyIGluc3RJZEZpZWxkID0gaW5zdElkUGF0aFtpbnN0SWRQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgICAgZmlsbE9yZ1tpbnN0SWRGaWVsZF0gPSB0aGlzLmluc3RJZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZpbGxPcmc7CiAgICB9LAogICAgLy8g5ZCM5q2l5Yid5aeL5YyW5pWw5o2u57uT5p6cCiAgICBzeW5jSW5pdFRhYmxlVmFsdWU6IGZ1bmN0aW9uIHN5bmNJbml0VGFibGVWYWx1ZShzKSB7CiAgICAgIHZhciBjdXN0RGlhbG9nID0gdGhpcy5pbml0Q3VzdERpYWxvZ0NvbmY7CiAgICAgIHZhciByZXR1cm5TdHIgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLnJlc3VsdGZpZWxkKTsKICAgICAgLy/mi7/liLDov5Tlm57nmoTlrZfmrrUKICAgICAgdmFyIGZpZWxkID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBjb21tZW50ID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBzdHIgPSBbXTsKICAgICAgdmFyIGlkcyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJldHVyblN0ci5sZW5ndGg7IGkrKykgewogICAgICAgIGZpZWxkW2ldID0gdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICJkYXRhU291cmNlIiA/IHJldHVyblN0cltpXS5maWVsZC50b1VwcGVyQ2FzZSgpIDogcmV0dXJuU3RyW2ldLmZpZWxkOwogICAgICAgIGNvbW1lbnRbaV0gPSB0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gImRhdGFTb3VyY2UiID8gcmV0dXJuU3RyW2ldLmNvbW1lbnQudG9VcHBlckNhc2UoKSA6IHJldHVyblN0cltpXS5jb21tZW50OwogICAgICB9CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICB2YXIgdGVtcCA9ICIiOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIHZhID0gc1swXVtmaWVsZFtpXV07CiAgICAgICAgICB0eXBlb2YgdmEgPT0gJ3VuZGVmaW5lZCcgPyAnJyA6IHZhLCBfcmVhZE9ubHlFcnJvcigidmEiKTsKICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgdmEgKyAnIiwnOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcCAhPSAiIikgewogICAgICAgICAgdGVtcCA9ICJ7IiArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAifSI7CiAgICAgICAgfQogICAgICAgIHN0ci5wdXNoKEpTT04ucGFyc2UodGVtcCkpOwogICAgICAgIGlkcy5wdXNoKHNbMF0uaWQpOwogICAgICB9IGVsc2UgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIHRlbXAgPSAiIjsKICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tbWVudC5sZW5ndGg7IGorKykgewogICAgICAgICAgICB2YXIgX3ZhID0gc1tpXVtmaWVsZFtqXV07CiAgICAgICAgICAgIHR5cGVvZiBfdmEgPT0gJ3VuZGVmaW5lZCcgPyAnJyA6IF92YSwgX3JlYWRPbmx5RXJyb3IoInZhIik7CiAgICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtqXSArICciOiInICsgX3ZhICsgJyIsJzsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0ZW1wICE9ICIiKSB7CiAgICAgICAgICAgIHRlbXAgPSAieyIgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgIn0iOwogICAgICAgICAgfQogICAgICAgICAgc3RyLnB1c2goSlNPTi5wYXJzZSh0ZW1wKSk7CiAgICAgICAgICBpZHMucHVzaChzW2ldLmlkKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy/lpITnkIbloavliLbpg6jpl6gKICAgICAgdmFyIGZpbGxPcmcgPSB0aGlzLmdldEZpbGxPcmdPYmooY3VzdERpYWxvZyk7CgogICAgICAvL+WkhOeQhuWunuS+i2lk5Zue5aGrCiAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZyAmJiBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQgJiYgdGhpcy5pbnN0SWQpIHsKICAgICAgICBpZiAoZmlsbE9yZyA9PSBudWxsKSB7CiAgICAgICAgICBmaWxsT3JnID0ge307CiAgICAgICAgfQogICAgICAgIHZhciBpbnN0SWRQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuaW5zdElkLnNwbGl0KCcuJyk7CiAgICAgICAgdmFyIGluc3RJZEZpZWxkID0gaW5zdElkUGF0aFtpbnN0SWRQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgIGZpbGxPcmdbaW5zdElkRmllbGRdID0gdGhpcy5pbnN0SWQ7CiAgICAgIH0KICAgICAgdmFyIHJldHVybkRhdGEgPSBzdHI7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIHZhciBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsKICAgICAgdmFyIGZpbGxkYXRhID0gdGhpcy5ob3RTZXR0aW5ncy5kYXRhOwogICAgICBpZiAoZmlsbGRhdGEgJiYgZmlsbGRhdGEubGVuZ3RoID09IDEpIHsKICAgICAgICBmaWxsZGF0YSA9IFtdOwogICAgICAgIC8vaWYoT2JqZWN0LmtleXModGhpcy5ob3RTZXR0aW5ncy5kYXRhWzBdKS5sZW5ndGg9PTAgfHwgSlNPTi5zdHJpbmdpZnkodGhpcy5pbml0Um93RGF0YSkgPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5ob3RTZXR0aW5ncy5kYXRhWzBdKSl7CiAgICAgICAgdmFyIGluaXRTdW1Sb3cgPSB0aGlzLmdldEluaXRTdW1Sb3coKTsKICAgICAgICBpZiAoaW5pdFN1bVJvdykgewogICAgICAgICAgZmlsbGRhdGEucHVzaChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGluaXRTdW1Sb3cpLCBmaWxsT3JnKSk7CiAgICAgICAgfQogICAgICAgIC8vfQogICAgICB9CiAgICAgIHZhciBmaWxsSW5pdERhdGEgPSBbXTsKICAgICAgcmV0dXJuRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICB2YXIgdGFyZ2V0QXJyYXkgPSBudWxsOwogICAgICAgIHZhciBzdWJMaW5lRGF0YSA9IF90aGlzLmluaXRSb3dEYXRhID8gX3RoaXMuaW5pdFJvd0RhdGEgOiB7fTsKICAgICAgICBjdXN0RGlhbG9nLmN1c3REaWFsb2cubWFwcGluZ0NvbmYuZm9yRWFjaChmdW5jdGlvbiAoY29uKSB7CiAgICAgICAgICBpZiAoY29uLnRhcmdldFswXSkgewogICAgICAgICAgICB0YXJnZXRBcnJheSA9IGNvbi50YXJnZXRbMF0uc3BsaXQoIi4iKTsKICAgICAgICAgICAgdmFyIGZyb20gPSAiIjsKICAgICAgICAgICAgaWYgKF90aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gInJlc3RmdWwiKSB7CiAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN1YkxpbmVEYXRhW3RhcmdldEFycmF5W3RhcmdldEFycmF5Lmxlbmd0aCAtIDFdXSA9IHJvd1tmcm9tXTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBpZiAoZmlsbE9yZyAhPSBudWxsKSB7CiAgICAgICAgICBzdWJMaW5lRGF0YSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3ViTGluZURhdGEpLCBmaWxsT3JnKTsKICAgICAgICB9CiAgICAgICAgZmlsbEluaXREYXRhLnB1c2goX29iamVjdFNwcmVhZCh7fSwgc3ViTGluZURhdGEpKTsKICAgICAgfSk7CiAgICAgIGlmICh0aGlzLmFkZEluaXRUZW1wbGF0ZURhdGEgPT09ICd0cnVlJykgewogICAgICAgIHRoaXMuaW5pdERhdGFCYWNrID0gZmlsbEluaXREYXRhOwogICAgICB9CiAgICAgIGZpbGxkYXRhID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShmaWxsZGF0YSksIGZpbGxJbml0RGF0YSk7CiAgICAgIHRoaXMuZmlsbGJhY2tIb3RUYWJsZURhdGEoZmlsbGRhdGEsIGZhbHNlKTsKICAgIH0sCiAgICBmaWxsT3JnRGF0YUZpZWxkOiBmdW5jdGlvbiBmaWxsT3JnRGF0YUZpZWxkKHJvdykgewogICAgICB2YXIgY3VzdERpYWxvZyA9IHRoaXMuaW5pdEN1c3REaWFsb2dDb25mOwogICAgICBpZiAoY3VzdERpYWxvZyAmJiBjdXN0RGlhbG9nLm9yZ0NvbmZpZykgewogICAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lICYmIHRoaXMuZmlsbE9yZy5pZCkgewogICAgICAgICAgdmFyIG5hbWVQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcubmFtZS5zcGxpdCgnLicpOwogICAgICAgICAgdmFyIG9yZ05hbWVGaWVsZCA9IG5hbWVQYXRoW25hbWVQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgICAgcm93W29yZ05hbWVGaWVsZF0gPSB0aGlzLmZpbGxPcmcubmFtZTsKICAgICAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pZCkgewogICAgICAgICAgICB2YXIgaWRQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuaWQuc3BsaXQoJy4nKTsKICAgICAgICAgICAgdmFyIG9yZ0lkRmllbGQgPSBpZFBhdGhbaWRQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgICAgICByb3dbb3JnSWRGaWVsZF0gPSB0aGlzLmZpbGxPcmcuaWQ7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcuY29kZSkgewogICAgICAgICAgICB2YXIgY29kZVBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5jb2RlLnNwbGl0KCcuJyk7CiAgICAgICAgICAgIHZhciBvcmdDb2RlRmllbGQgPSBjb2RlUGF0aFtjb2RlUGF0aC5sZW5ndGggLSAxXTsKICAgICAgICAgICAgcm93W29yZ0NvZGVGaWVsZF0gPSB0aGlzLmZpbGxPcmcuY29kZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZCAmJiB0aGlzLmluc3RJZCkgewogICAgICAgICAgdmFyIGluc3RJZFBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQuc3BsaXQoJy4nKTsKICAgICAgICAgIHZhciBpbnN0SWRGaWVsZCA9IGluc3RJZFBhdGhbaW5zdElkUGF0aC5sZW5ndGggLSAxXTsKICAgICAgICAgIHJvd1tpbnN0SWRGaWVsZF0gPSB0aGlzLmluc3RJZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJvdzsKICAgIH0sCiAgICB0b0FkZEluaXRTdW1Sb3c6IGZ1bmN0aW9uIHRvQWRkSW5pdFN1bVJvdygpIHsKICAgICAgdmFyIGRhdGEgPSB0aGlzLmdldEhvdFRhYmxlRGF0YSgpOwogICAgICBpZiAoIWRhdGEgfHwgZGF0YS5sZW5ndGggPCAxIHx8IGRhdGEubGVuZ3RoID09IDEgJiYgSlNPTi5zdHJpbmdpZnkoZGF0YVswXSkgPT09IEpTT04uc3RyaW5naWZ5KHRoaXMuaW5pdFJvd0RhdGEpKSB7CiAgICAgICAgdmFyIGluaXRTdW1Sb3cgPSB0aGlzLmdldEluaXRTdW1Sb3coKTsKICAgICAgICBpZiAoaW5pdFN1bVJvdykgewogICAgICAgICAgdmFyIHJvd3MgPSBbXTsKICAgICAgICAgIHJvd3MucHVzaChfb2JqZWN0U3ByZWFkKHt9LCBpbml0U3VtUm93KSk7CiAgICAgICAgICB0aGlzLmZpbGxiYWNrSG90VGFibGVEYXRhKHJvd3MpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGdldEluaXRTdW1Sb3c6IGZ1bmN0aW9uIGdldEluaXRTdW1Sb3coKSB7CiAgICAgIGlmICh0aGlzLmluaXRTdW1Sb3cgPT09ICd0cnVlJykgewogICAgICAgIHZhciBuZXdSb3cgPSBfb2JqZWN0U3ByZWFkKHt9LCB0aGlzLmluaXRSb3dEYXRhKTsKICAgICAgICBpZiAodGhpcy5pbml0U3VtUm93RmllbGQgJiYgdGhpcy5pbml0U3VtUm93VmFsdWUpIHsKICAgICAgICAgIG5ld1Jvd1t0aGlzLmluaXRTdW1Sb3dGaWVsZF0gPSB0aGlzLmluaXRTdW1Sb3dWYWx1ZTsKICAgICAgICB9CiAgICAgICAgdmFyIGZpbGxPcmcgPSB0aGlzLmdldEZpbGxPcmdPYmoodGhpcy5pbml0Q3VzdERpYWxvZ0NvbmYpOwogICAgICAgIGlmIChmaWxsT3JnID09IG51bGwpIHsKICAgICAgICAgIGZpbGxPcmcgPSB7fTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgbmV3Um93KSwgZmlsbE9yZyk7CiAgICAgIH0KICAgICAgcmV0dXJuICcnOwogICAgfSwKICAgIHRvQWRkSW5pdFRlbXBsYXRlRGF0YTogZnVuY3Rpb24gdG9BZGRJbml0VGVtcGxhdGVEYXRhKCkgewogICAgICBpZiAodGhpcy5hZGRJbml0VGVtcGxhdGVEYXRhID09PSAndHJ1ZScgJiYgdGhpcy5pbml0RGF0YUJhY2sgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmluaXREYXRhQmFjaykgJiYgdGhpcy5pbml0RGF0YUJhY2subGVuZ3RoID4gMCkgewogICAgICAgIHZhciBjdXJEYXRhID0gdGhpcy5nZXRCYWNrTWVyZ2VEYXRhKCk7CiAgICAgICAgaWYgKCEoY3VyRGF0YSAmJiBBcnJheS5pc0FycmF5KHRoaXMuaW5pdERhdGFCYWNrKSkpIHsKICAgICAgICAgIGN1ckRhdGEgPSBbW11dOwogICAgICAgIH0KICAgICAgICBjdXJEYXRhID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShjdXJEYXRhKSwgX3RvQ29uc3VtYWJsZUFycmF5KHRoaXMuaW5pdERhdGFCYWNrKSk7CiAgICAgICAgdGhpcy5maWxsYmFja0hvdFRhYmxlRGF0YShjdXJEYXRhKTsKICAgICAgfSBlbHNlIGlmICghdGhpcy5pbml0RGF0YUJhY2sgfHwgdGhpcy5pbml0RGF0YUJhY2subGVuZ3RoIDwgMSkgewogICAgICAgIHRoaXMuJG1lc3NhZ2UoewogICAgICAgICAgbWVzc2FnZTogIuWIneWni+WMluaVsOaNruS4uuepuuOAgiIsCiAgICAgICAgICB0eXBlOiAid2FybmluZyIKICAgICAgICB9KTsKICAgICAgfQogICAgfSwKICAgIGdldFRhYmxlSGVhZGVyczogZnVuY3Rpb24gZ2V0VGFibGVIZWFkZXJzKCkgewogICAgICB2YXIgb3B0aW9uc0pvbiA9IEpTT04ucGFyc2UodGhpcy5vcHRpb25zKTsKICAgICAgdmFyIHJlbGF0aW9ucyA9IG9wdGlvbnNKb24uY29sSGVhZGVyc1JlbGF0aW9uczsKICAgICAgdmFyIGhlYWRlcnMgPSB7CiAgICAgICAgbmVzdGVkOiB0aGlzLmhvdFNldHRpbmdzLm5lc3RlZEhlYWRlcnMgPyB0cnVlIDogZmFsc2UsCiAgICAgICAgaGVhZGVyOiBbXQogICAgICB9OwogICAgICByZWxhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgIGhlYWRlcnMuaGVhZGVyLnB1c2goewogICAgICAgICAgbmFtZTogaXRlbS5uYW1lLAogICAgICAgICAgZGVzYzogaXRlbS5kZXNjCiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gaGVhZGVyczsKICAgIH0KICB9LAogIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7fQp9Ow=="},null]}