{"remainingRequest":"D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\cache-loader\\dist\\cjs.js??ref--0-0!D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\xcjy-fvue\\src\\views\\patrolAndRescue\\roadWatch\\InspectionPlan\\components\\EditAddPage\\index.vue?vue&type=script&lang=js","dependencies":[{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\src\\views\\patrolAndRescue\\roadWatch\\InspectionPlan\\components\\EditAddPage\\index.vue","mtime":1745479602286},{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\babel.config.js","mtime":1741314102158},{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL3hjanktZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheS5qcyI7CmltcG9ydCBfcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL3hjanktZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcmVnZW5lcmF0b3JSdW50aW1lLmpzIjsKaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAiRDovamVua2lucy93b3Jrc3BhY2UveGNqeS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyLmpzIjsKaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS94Y2p5LWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzLmpzIjsKaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL3hjanktZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXN5bmNUb0dlbmVyYXRvci5qcyI7CnZhciBfZXhjbHVkZWQgPSBbInJvYWRJZCIsICJmcmVxdWVuY3kiLCAicGxhblBhdHJvbERldGFpbHMiLCAicGxhblN0YXJ0RGF0ZSIsICJwbGFuRW5kRGF0ZSIsICJwbGFuSW50ZXJ2YWwiXSwKICBfZXhjbHVkZWQyID0gWyJzdGFydFBhdHJvbElkIiwgImVuZFBhdHJvbElkIiwgInJvYWRJZCIsICJzdGFydFBhdHJvbE5hbWUiLCAiZW5kUGF0cm9sTmFtZSIsICJwbGFuRGV0YWlscyIsICJwbGFuU3RhcnRFbmREYXRlIiwgInRpbWUiLCAicGxhbkludGVydmFsIl07CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmVycm9yLmNhdXNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmlsdGVyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXguanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mbGF0LW1hcC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lm1hcC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnVuc2NvcGFibGVzLmZsYXQtbWFwLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24ubmFtZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IuZmlsdGVyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IuZmluZC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLmZsYXQtbWFwLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IuZm9yLWVhY2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5zb21lLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmtleXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaC5qcyI7Ci8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCgppbXBvcnQgUHViU3ViIGZyb20gJ3B1YnN1Yi1qcyc7CmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JzsKaW1wb3J0ICdtb21lbnQtZHVyYXRpb24tZm9ybWF0JzsKaW1wb3J0IHsgcmVmaW5lUmVxdWVzdEJvZHkgfSBmcm9tICdAL3V0aWxzL3JlcXVlc3RXcmFwcGVycyc7CmltcG9ydCB7IGRpY3Rpb25hcnlFc2NhcGUsIGdldERpY3Rpb25hcnlCeUNvZGUgfSBmcm9tICdAL3V0aWxzL2RpY3Rpb25hcnknOwppbXBvcnQgeyB0YWJsZUFkZEVkaXQsIHRhYmxlRGV0YWlsIH0gZnJvbSAnQC9hcGkvcGF0cm9sQW5kUmVzY3VlL3JvYWRXYXRjaC9pbnNwZWN0aW9uUGxhbic7CmltcG9ydCB7IHRhYmxlRGF0YSBhcyBhbG9uZ1JvdXRlSW5mb0ludGVyIH0gZnJvbSAnQC9hcGkvcGF0cm9sQW5kUmVzY3VlL2luZm9NZ210UGF0cm9sc1Jlc2N1ZXMvYWxvbmdSb3V0ZUluZm8nOwppbXBvcnQgeyB0YWJsZURhdGEgYXMgdGVhbURhdGEgfSBmcm9tICdAL2FwaS9wYXRyb2xBbmRSZXNjdWUvaW5mb01nbXRQYXRyb2xzUmVzY3Vlcy9wYXRyb2xBbmRSZXNjdWVUZWFtc01nbXQnOwppbXBvcnQgeyBwb2ludFRyZWVEYXRhIH0gZnJvbSAnQC9hcGkvcGF0cm9sQW5kUmVzY3VlL2luZm9NZ210UGF0cm9sc1Jlc2N1ZXMvaW5zcGVjdGlvblBvaW50TWdtdCc7CmltcG9ydCB7IG9yZ1RyZWUgfSBmcm9tICdAL2FwaS9zeXN0ZW1JbnRlcmZhY2UnOwpleHBvcnQgZGVmYXVsdCB7CiAgbmFtZTogJ0VkaXRBZGRQYWdlJywKICBwcm9wczogewogICAgY29tcG9uZW50TmFtZTogewogICAgICBkZWZhdWx0OiAnVGFibGVQYWdlJywKICAgICAgdHlwZTogU3RyaW5nCiAgICB9CiAgfSwKICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkgewogICAgdmFyIF90aGlzID0gdGhpczsKICAgIHZhciB2YWxpZGF0ZVBsYW5EZXRhaWxzID0gZnVuY3Rpb24gdmFsaWRhdGVQbGFuRGV0YWlscyhfLCB2YWx1ZSwgY2FsbGJhY2spIHsKICAgICAgdmFyIF90aGlzJCRyZWZzJGFkZEVkaXRUcjsKICAgICAgdmFyIGFyciA9ICgoX3RoaXMkJHJlZnMkYWRkRWRpdFRyID0gX3RoaXMuJHJlZnMuYWRkRWRpdFRyZWUpID09PSBudWxsIHx8IF90aGlzJCRyZWZzJGFkZEVkaXRUciA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkJHJlZnMkYWRkRWRpdFRyLmdldENoZWNrZWRLZXlzKCkpIHx8IFtdOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShhcnIpICYmIGFyci5sZW5ndGgpIHsKICAgICAgICBjYWxsYmFjaygpOwogICAgICB9IGVsc2UgewogICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcign5beh5qOA5YaF5a655LiN6IO95Li656m6JykpOwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIHsKICAgICAgLy8gZGF5T3B0aW9uczogW10sIC8vIOWkqeaVsOmAiemhue+8iOesrOS4gOWkqeOAgeesrOS6jOWkqS4uLu+8iQogICAgICAvLyBzZWxlY3RlZERheTogJycsIC8vIOW9k+WJjemAieS4reeahOWkqeaVsAogICAgICAvLyBjdXJyZW50SW5zcGVjdGlvbkN5Y2xlOiAnJywgLy8g5b2T5YmN6YCJ5Lit55qE5beh5qOA5ZGo5pyfCiAgICAgIC8vIHBvaW50TGV2ZWw6ICcnLCAvLyDlvZPliY3pgInkuK3nmoTngrnkvY3nuqfliKsKICAgICAgYWRkRWRpdEZvcm06IHsKICAgICAgICB3b3JrY2xhc3M6ICcxJywKICAgICAgICBmcmVxdWVuY3k6ICcnLAogICAgICAgIHJvYWRJZDogJycsCiAgICAgICAgc3RhcnRQYXRyb2xJZDogJycsCiAgICAgICAgZW5kUGF0cm9sSWQ6ICcnLAogICAgICAgIHBsYW5EZXRhaWxzOiBbXSwKICAgICAgICBwbGFuVHlwZTogJzEnLAogICAgICAgIGluc3BlY3RUeXBlOiAnMScsCiAgICAgICAgcGxhbkNsYXNzOiAnY29tLmFydGZlc3MucmVzY3VlLnBhdHJvbC5qb2IuSW5zcGVjdGlvblBsYW5Kb2InLAogICAgICAgIHBsYW5JbnRlcnZhbDogJzAxOjAwOjAwJywKICAgICAgICB0aW1lOiBbXQogICAgICB9LAogICAgICBhZGRFZGl0UnVsZXM6IHsKICAgICAgICB3b3JrY2xhc3M6IFt7CiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgIG1lc3NhZ2U6ICfnj63mrKHkuI3og73kuLrnqbonLAogICAgICAgICAgdHJpZ2dlcjogJ2NoYW5nZScKICAgICAgICB9XSwKICAgICAgICBwbGFuVHlwZTogW3sKICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgbWVzc2FnZTogJ+W3oeajgOexu+Wei+S4jeiDveS4uuepuicsCiAgICAgICAgICB0cmlnZ2VyOiAnY2hhbmdlJwogICAgICAgIH1dLAogICAgICAgIGluc3BlY3RUeXBlOiBbewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtZXNzYWdlOiAn5b6A6L+U57G75Z6L5LiN6IO95Li656m6JywKICAgICAgICAgIHRyaWdnZXI6ICdjaGFuZ2UnCiAgICAgICAgfV0sCiAgICAgICAgcm9hZElkOiBbewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtZXNzYWdlOiAn5omA5bGe6Lev5q615LiN6IO95Li656m6JywKICAgICAgICAgIHRyaWdnZXI6ICdjaGFuZ2UnCiAgICAgICAgfV0sCiAgICAgICAgc3RhcnRQYXRyb2xJZDogW3sKICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgbWVzc2FnZTogJ+W8gOWni+W3oeajgOermeS4jeiDveS4uuepuicsCiAgICAgICAgICB0cmlnZ2VyOiAnY2hhbmdlJwogICAgICAgIH1dLAogICAgICAgIGVuZFBhdHJvbElkOiBbewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtZXNzYWdlOiAn57uT5p2f5beh5qOA56uZ5LiN6IO95Li656m6JywKICAgICAgICAgIHRyaWdnZXI6ICdjaGFuZ2UnCiAgICAgICAgfV0sCiAgICAgICAgdGVhbUlkOiBbewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtZXNzYWdlOiAn5beh5qOA6Zif5LyN5LiN6IO95Li656m6JywKICAgICAgICAgIHRyaWdnZXI6ICdjaGFuZ2UnCiAgICAgICAgfV0sCiAgICAgICAgcGxhbkRldGFpbHM6IFt7CiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgIHZhbGlkYXRvcjogdmFsaWRhdGVQbGFuRGV0YWlscywKICAgICAgICAgIHRyaWdnZXI6ICdjaGFuZ2UnCiAgICAgICAgfV0sCiAgICAgICAgZnJlcXVlbmN5OiBbewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtZXNzYWdlOiAn5Lu75Yqh6aKR546H5LiN6IO95Li656m6JywKICAgICAgICAgIHRyaWdnZXI6ICdjaGFuZ2UnCiAgICAgICAgfV0sCiAgICAgICAgcGxhblN0YXJ0RW5kRGF0ZTogW3sKICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgbWVzc2FnZTogJ+eUn+aIkOS7u+WKoeaXtumXtOauteS4jeiDveS4uuepuicsCiAgICAgICAgICB0cmlnZ2VyOiAnY2hhbmdlJwogICAgICAgIH1dLAogICAgICAgIHBsYW5DbGFzczogW3sKICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgbWVzc2FnZTogJ+WumuaXtuS7u+WKoeaJp+ihjOexu+S4jeiDveS4uuepuicsCiAgICAgICAgICB0cmlnZ2VyOiAnY2hhbmdlJwogICAgICAgIH1dCiAgICAgIH0sCiAgICAgIHBpY2tlck9wdGlvbnM6IHsKICAgICAgICAvLyDml7bpl7TpgInmi6nlmajml7bpl7TojIPlm7QKICAgICAgICBkaXNhYmxlZERhdGU6IGZ1bmN0aW9uIGRpc2FibGVkRGF0ZSh0aW1lKSB7CiAgICAgICAgICByZXR1cm4gbW9tZW50KHRpbWUpLmlzQmVmb3JlKG1vbWVudCgpLnN1YnRyYWN0KDEsICdkYXlzJykpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgc2F2ZUxvYWRpbmc6IGZhbHNlLAogICAgICAvLyDkuIrkvKBsb2FkaW5nCiAgICAgIGZvcm1Mb2FkaW5nOiB0cnVlLAogICAgICAvLyDkuIrkvKBsb2FkaW5nCiAgICAgIHJvYWRDaG9pY2VEaWFsb2c6IGZhbHNlLAogICAgICAvLyDmmK/lkKblsZXnpLrpgInmi6not6/mrrXlvLnlsYIKICAgICAgdHJlZURhdGE6IFtdLAogICAgICAvLyDnu4Tnu4fmoJEKICAgICAgcm9hZERhdGE6IFtdLAogICAgICAvLyDot6/mrrXmlbDmja4KICAgICAgYWxvbmdSb3V0ZUluZm9EYXRhOiBbXSwKICAgICAgLy8g5rK/57q/6K6+5aSH5pWw5o2uCiAgICAgIGluc3BlY3Rpb25Qb2ludHNEYXRhOiBbXSwKICAgICAgLy8g5beh5p+l5YaF5a6577yI5qCR5b2i54K55L2N77yJ5pWw5o2uCiAgICAgIGFkZEVkaXRUcmVlUHJvcHM6IHsKICAgICAgICBjaGlsZHJlbjogJ2NoaWxkcmVuJywKICAgICAgICBsYWJlbDogJ25hbWUnLAogICAgICAgIGRpc2FibGVkOiBmdW5jdGlvbiBkaXNhYmxlZChkYXRhKSB7CiAgICAgICAgICByZXR1cm4gZGF0YS5sZXZlbCAhPT0gJzQnOwogICAgICAgIH0KICAgICAgfSwKICAgICAgaWQ6ICcnLAogICAgICAvLyBpZOagh+ivhuespgogICAgICBwdWJTdWI6IG51bGwsCiAgICAgIHRyZWVMb2FkaW5nOiBmYWxzZQogICAgfTsKICB9LAogIHdhdGNoOiB7CiAgICAvLyDnm5HlkKzpopHnjoflj5jljJYKICAgIC8vICdhZGRFZGl0Rm9ybS5mcmVxdWVuY3knOiB7CiAgICAvLyAgIGhhbmRsZXIobmV3VmFsKSB7CiAgICAvLyAgICAgdGhpcy5jdXJyZW50SW5zcGVjdGlvbkN5Y2xlID0gbmV3VmFsCiAgICAvLyAgICAgLy8g5aaC5p6ccm9hZElk5a2Y5Zyo77yM5YiZ6YeN5paw6I635Y+W5beh5qOA54K55pWw5o2uCiAgICAvLyAgICAgaWYgKHRoaXMuYWRkRWRpdEZvcm0ucm9hZElkKSB7CiAgICAvLyAgICAgICB0aGlzLmdldEluc3BlY3Rpb25Qb2ludHNEYXRhKHRoaXMuYWRkRWRpdEZvcm0ucm9hZElkKQogICAgLy8gICAgIH0KICAgIC8vICAgICAvLyDph43nva7lpKnmlbDpgInmi6kKICAgIC8vICAgICAvLyB0aGlzLnNlbGVjdGVkRGF5ID0gJycKICAgIC8vICAgICAvLyB0aGlzLmRheU9wdGlvbnMgPSBbXQogICAgLy8gICB9LAogICAgLy8gICBpbW1lZGlhdGU6IHRydWUKICAgIC8vIH0sCiAgICAvL3BvaW50TGV2ZWznmoTnm5HlkKwKICAgIC8vIHBvaW50TGV2ZWwobmV3VmFsKSB7CiAgICAvLyAgIC8vIOWmguaenHJvYWRJZOWtmOWcqO+8jOWImemHjeaWsOiOt+WPluW3oeajgOeCueaVsOaNrgogICAgLy8gICBpZiAodGhpcy5hZGRFZGl0Rm9ybS5yb2FkSWQpIHsKICAgIC8vICAgICB0aGlzLmdldEluc3BlY3Rpb25Qb2ludHNEYXRhKHRoaXMuYWRkRWRpdEZvcm0ucm9hZElkKQogICAgLy8gICB9CiAgICAvLyB9LAogICAgY29tcG9uZW50TmFtZTogewogICAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKG5ld1ZhbCkgewogICAgICAgIGlmIChuZXdWYWwgPT09IHRoaXMuJG9wdGlvbnMubmFtZSkgewogICAgICAgICAgdGhpcy5vcGVuUGFnZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmNsb3NlUGFnZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHsKICAgIC8vIHRoaXMuZ2V0T3JnVHJlZURhdGEoKQogICAgLy8gdGhpcy5nZXRSb2FkRGF0YSgpCiAgfSwKICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkgewogICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICB0aGlzLnB1YlN1YiA9IFB1YlN1Yi5zdWJzY3JpYmUoJ0VkaXRBZGRQYWdlJywgZnVuY3Rpb24gKF8sIGRhdGEpIHsKICAgICAgaWYgKGRhdGEub3JnTmFtZSkgewogICAgICAgIF90aGlzMi5hZGRFZGl0Rm9ybS5yb2FkTmFtZSA9IGRhdGEub3JnTmFtZTsKICAgICAgICBfdGhpczIuYWRkRWRpdEZvcm0ucm9hZElkID0gZGF0YS5jYXRhbG9nSWQ7CiAgICAgICAgX3RoaXMyLmFkZEVkaXRGb3JtLnJvYWRDb2RlID0gZGF0YS5jb2RlOwogICAgICAgIF90aGlzMi5yb2FkQ2hhbmdlKGRhdGEuY2F0YWxvZ0lkKTsKICAgICAgfQogICAgICAvLyDmlrDlop7miJbkv67mlLkKICAgICAgaWYgKGRhdGEuaWQpIHsKICAgICAgICBfdGhpczIuaWQgPSBkYXRhLmlkOwogICAgICAgIF90aGlzMi5nZXREZXRhaWwoZGF0YS5pZCk7CiAgICAgIH0KICAgICAgLy8gdGhpcy5nZXRSb2FkRGF0YSgpCiAgICB9KTsKICB9LAogIG1ldGhvZHM6IHsKICAgIC8vIOeCueS9jee6p+WIq+WPmOWMluWkhOeQhgogICAgLy8gaGFuZGxlUG9pbnRMZXZlbENoYW5nZSh2YWx1ZSkgewogICAgLy8gICB0aGlzLnBvaW50TGV2ZWwgPSB2YWx1ZQogICAgLy8gICAvLyDmuIXnqbrlt7LpgInlhoXlrrkKICAgIC8vICAgdGhpcy5jbGVhclRyZWVTZWxlY3QoKQogICAgLy8gfSwKICAgIHRlYW1DaGFuZ2U6IGZ1bmN0aW9uIHRlYW1DaGFuZ2UodmFsdWUpIHsKICAgICAgdGhpcy5hZGRFZGl0Rm9ybS50ZWFtTmFtZSA9IHRoaXMudHJlZURhdGEuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgcmV0dXJuIGl0ZW0uaWQgPT09IHZhbHVlOwogICAgICB9KVswXS5uYW1lOwogICAgfSwKICAgIC8vIOiOt+WPluivpuaDhQogICAgZ2V0RGV0YWlsOiBmdW5jdGlvbiBnZXREZXRhaWwoaWQpIHsKICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CiAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcigvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKICAgICAgICB2YXIgX3lpZWxkJHRhYmxlRGV0YWlsLCBfeWllbGQkdGFibGVEZXRhaWwkcm8sIHJvYWRJZCwgX3lpZWxkJHRhYmxlRGV0YWlsJGZyLCBmcmVxdWVuY3ksIF95aWVsZCR0YWJsZURldGFpbCRwbCwgcGxhblBhdHJvbERldGFpbHMsIF95aWVsZCR0YWJsZURldGFpbCRwbDIsIHBsYW5TdGFydERhdGUsIF95aWVsZCR0YWJsZURldGFpbCRwbDMsIHBsYW5FbmREYXRlLCBfeWllbGQkdGFibGVEZXRhaWwkcGw0LCBwbGFuSW50ZXJ2YWwsIGFkZEVkaXRGb3JtLCBwbGFuSW50ZXJ2YWxBcnIsIHRpbWUsIHBsYW5EZXRhaWxzOwogICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAwOwogICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzOwogICAgICAgICAgICAgIHJldHVybiB0YWJsZURldGFpbChpZCk7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICBfeWllbGQkdGFibGVEZXRhaWwgPSBfY29udGV4dC5zZW50OwogICAgICAgICAgICAgIF95aWVsZCR0YWJsZURldGFpbCRybyA9IF95aWVsZCR0YWJsZURldGFpbC5yb2FkSWQ7CiAgICAgICAgICAgICAgcm9hZElkID0gX3lpZWxkJHRhYmxlRGV0YWlsJHJvID09PSB2b2lkIDAgPyAnJyA6IF95aWVsZCR0YWJsZURldGFpbCRybzsKICAgICAgICAgICAgICBfeWllbGQkdGFibGVEZXRhaWwkZnIgPSBfeWllbGQkdGFibGVEZXRhaWwuZnJlcXVlbmN5OwogICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IF95aWVsZCR0YWJsZURldGFpbCRmciA9PT0gdm9pZCAwID8gJycgOiBfeWllbGQkdGFibGVEZXRhaWwkZnI7CiAgICAgICAgICAgICAgX3lpZWxkJHRhYmxlRGV0YWlsJHBsID0gX3lpZWxkJHRhYmxlRGV0YWlsLnBsYW5QYXRyb2xEZXRhaWxzOwogICAgICAgICAgICAgIHBsYW5QYXRyb2xEZXRhaWxzID0gX3lpZWxkJHRhYmxlRGV0YWlsJHBsID09PSB2b2lkIDAgPyBbXSA6IF95aWVsZCR0YWJsZURldGFpbCRwbDsKICAgICAgICAgICAgICBfeWllbGQkdGFibGVEZXRhaWwkcGwyID0gX3lpZWxkJHRhYmxlRGV0YWlsLnBsYW5TdGFydERhdGU7CiAgICAgICAgICAgICAgcGxhblN0YXJ0RGF0ZSA9IF95aWVsZCR0YWJsZURldGFpbCRwbDIgPT09IHZvaWQgMCA/ICcnIDogX3lpZWxkJHRhYmxlRGV0YWlsJHBsMjsKICAgICAgICAgICAgICBfeWllbGQkdGFibGVEZXRhaWwkcGwzID0gX3lpZWxkJHRhYmxlRGV0YWlsLnBsYW5FbmREYXRlOwogICAgICAgICAgICAgIHBsYW5FbmREYXRlID0gX3lpZWxkJHRhYmxlRGV0YWlsJHBsMyA9PT0gdm9pZCAwID8gJycgOiBfeWllbGQkdGFibGVEZXRhaWwkcGwzOwogICAgICAgICAgICAgIF95aWVsZCR0YWJsZURldGFpbCRwbDQgPSBfeWllbGQkdGFibGVEZXRhaWwucGxhbkludGVydmFsOwogICAgICAgICAgICAgIHBsYW5JbnRlcnZhbCA9IF95aWVsZCR0YWJsZURldGFpbCRwbDQgPT09IHZvaWQgMCA/ICcnIDogX3lpZWxkJHRhYmxlRGV0YWlsJHBsNDsKICAgICAgICAgICAgICBhZGRFZGl0Rm9ybSA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfeWllbGQkdGFibGVEZXRhaWwsIF9leGNsdWRlZCk7CiAgICAgICAgICAgICAgcGxhbkludGVydmFsQXJyID0gcGxhbkludGVydmFsLnNwbGl0KCd8JykuZmlsdGVyKGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB0aW1lID0gJyc7CiAgICAgICAgICAgICAgcGxhbkRldGFpbHMgPSBwbGFuUGF0cm9sRGV0YWlscy5mbGF0TWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaS5pZCA/IGkuaWQgOiBbXTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICByb2FkSWQgPSByb2FkSWQgfHwgJyc7CiAgICAgICAgICAgICAgaWYgKHBsYW5JbnRlcnZhbEFyci5sZW5ndGggPT09IDIpIHsKICAgICAgICAgICAgICAgIGlmIChmcmVxdWVuY3kgPT09ICc1JykgewogICAgICAgICAgICAgICAgICB0aW1lID0gcGxhbkludGVydmFsQXJyWzBdLnNwbGl0KCcsJykgfHwgW107CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICB0aW1lID0gcGxhbkludGVydmFsQXJyWzBdIHx8ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBfdGhpczMuYWRkRWRpdEZvcm0gPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGFkZEVkaXRGb3JtKSwge30sIHsKICAgICAgICAgICAgICAgIHJvYWRJZDogcm9hZElkLAogICAgICAgICAgICAgICAgcGxhbkRldGFpbHM6IHBsYW5EZXRhaWxzLAogICAgICAgICAgICAgICAgcGxhblN0YXJ0RW5kRGF0ZTogcGxhblN0YXJ0RGF0ZSAmJiBwbGFuRW5kRGF0ZSA/IFtwbGFuU3RhcnREYXRlLCBwbGFuRW5kRGF0ZV0gOiBbXSwKICAgICAgICAgICAgICAgIHRpbWU6IHRpbWUsCiAgICAgICAgICAgICAgICBwbGFuSW50ZXJ2YWw6IHBsYW5JbnRlcnZhbEFycltwbGFuSW50ZXJ2YWxBcnIubGVuZ3RoIC0gMV0gfHwgJycsCiAgICAgICAgICAgICAgICBmcmVxdWVuY3k6IGZyZXF1ZW5jeQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIF90aGlzMy5yb2FkQ2hhbmdlKHJvYWRJZCk7CgogICAgICAgICAgICAgIC8vICDpgJrov4fot6/mrrXkv6Hmga/ojrflj5bmoJHlvaLngrnkvY3jgIHliJ3lp4vljJbmoJHli77pgIkKICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjY7CiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5nZXRJbnNwZWN0aW9uUG9pbnRzRGF0YShyb2FkSWQsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMzLmluaXRpYWxpemVUcmVlKHBsYW5EZXRhaWxzKTsKICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjYXNlIDI2OgogICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyNjsKICAgICAgICAgICAgICBfdGhpczMuZm9ybUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDI2KTsKICAgICAgICAgICAgY2FzZSAyOToKICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgICAgfQogICAgICAgIH0sIF9jYWxsZWUsIG51bGwsIFtbMCwsIDI2LCAyOV1dKTsKICAgICAgfSkpKCk7CiAgICB9LAogICAgLy8g5qC55o2u5bey5Yu+6YCJ55qE5pWw5o2u6L+b6KGM5YiG57uECiAgICAvLyAgICAgZ3JvdXBTZWxlY3RlZFBvaW50cyhzZWxlY3RlZENvZGVzKSB7CiAgICAvLyAgICAgICBjb25zdCBmcmVxdWVuY3kgPSBOdW1iZXIodGhpcy5hZGRFZGl0Rm9ybS5mcmVxdWVuY3kpIHx8IDEKICAgIC8vICAgICAgIGxldCBncm91cENvdW50ID0gZnJlcXVlbmN5CiAgICAvLwogICAgLy8gICAgICAgLy8g54m55q6K5aSE55CG5q+P5ZGo5ZKM5q+P5pyI55qE5oOF5Ya1CiAgICAvLyAgICAgICBpZiAodGhpcy5hZGRFZGl0Rm9ybS5mcmVxdWVuY3kgPT09ICc2JykgeyAvLyDmr4/lkajkuIDmrKEKICAgIC8vICAgICAgICAgZ3JvdXBDb3VudCA9IDcKICAgIC8vICAgICAgIH0gZWxzZSBpZiAodGhpcy5hZGRFZGl0Rm9ybS5mcmVxdWVuY3kgPT09ICc3JykgeyAvLyDmr4/mnIjkuIDmrKEKICAgIC8vICAgICAgICAgZ3JvdXBDb3VudCA9IDMwCiAgICAvLyAgICAgICB9CiAgICAvLwogICAgLy8gICAgICAgLy8g6YeN572u5YiG57uE5pWw5o2uCiAgICAvLyAgICAgICB0aGlzLmdyb3VwZWRJbnNwZWN0aW9uUG9pbnRzID0gW10KICAgIC8vICAgICAgIHRoaXMuZGF5T3B0aW9ucyA9IFtdCiAgICAvLwogICAgLy8gICAgICAgaWYgKGdyb3VwQ291bnQgPD0gMSkgewogICAgLy8gICAgICAgICAvLyDpopHnjofkuLox5aSp5oiW5LiN5YiG57uECiAgICAvLyAgICAgICAgIHRoaXMuZ3JvdXBlZEluc3BlY3Rpb25Qb2ludHMgPSBbc2VsZWN0ZWRDb2Rlc10gLy8g56Gu5L+d5Y2z5L2/5LiN5YiG57uE5Lmf5L+d55WZ5pWw5o2uCiAgICAvLyAgICAgICAgIHJldHVybgogICAgLy8gICAgICAgfQogICAgLy8KICAgIC8vICAgICAgIC8vIOWIm+W7uuWIhue7hAogICAgLy8gICAgICAgY29uc3QgZ3JvdXBTaXplID0gTWF0aC5jZWlsKHNlbGVjdGVkQ29kZXMubGVuZ3RoIC8gZ3JvdXBDb3VudCkKICAgIC8vCiAgICAvLyAgICAgICAvLyDlsIblt7Lli77pgInnmoToioLngrnliIbnu4QKICAgIC8vICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBDb3VudDsgaSsrKSB7CiAgICAvLyAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSAqIGdyb3VwU2l6ZQogICAgLy8gICAgICAgICBjb25zdCBlbmQgPSBzdGFydCArIGdyb3VwU2l6ZQogICAgLy8gICAgICAgICBjb25zdCBncm91cE5vZGVzID0gc2VsZWN0ZWRDb2Rlcy5zbGljZShzdGFydCwgZW5kKQogICAgLy8gICAgICAgICB0aGlzLmdyb3VwZWRJbnNwZWN0aW9uUG9pbnRzLnB1c2goZ3JvdXBOb2RlcykKICAgIC8vCiAgICAvLyAgICAgICAgIC8vIOa3u+WKoOWkqeaVsOmAiemhuQogICAgLy8gICAgICAgICB0aGlzLmRheU9wdGlvbnMucHVzaCh7CiAgICAvLyAgICAgICAgICAgdmFsdWU6IGkgKyAxLAogICAgLy8gICAgICAgICAgIGxhYmVsOiBg56ysJHtpICsgMX3lpKlgCiAgICAvLyAgICAgICAgIH0pCiAgICAvLyAgICAgICB9CiAgICAvLwogICAgLy8gICAgICAgLy8g6buY6K6k6YCJ5Lit56ys5LiA5aSpCiAgICAvLyAgICAgICB0aGlzLnNlbGVjdGVkRGF5ID0gdGhpcy5kYXlPcHRpb25zWzBdPy52YWx1ZSB8fCAnJwogICAgLy8gICAgIH0sCiAgICAvLyDojrflj5blhazlj7jmoJEKICAgIGdldE9yZ1RyZWVEYXRhOiBmdW5jdGlvbiBnZXRPcmdUcmVlRGF0YSgpIHsKICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CiAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcigvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoKSB7CiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHsKICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjsKICAgICAgICAgICAgICByZXR1cm4gb3JnVHJlZSgpOwogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgX3RoaXM0LnRyZWVEYXRhID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgIH0KICAgICAgICB9LCBfY2FsbGVlMik7CiAgICAgIH0pKSgpOwogICAgfSwKICAgIC8v6I635Y+W5omA5Zyo6Lev5q615YiX6KGo5pWw5o2uCiAgICAvLyBhc3luYyBnZXRSb2FkRGF0YSgpIHsKICAgIC8vICAgY29uc3QgeyByb3dzID0gW10gfSA9IGF3YWl0IHJvYWRTZWN0aW9uSW5mb0ludGVyKHsgcGFnZUJlYW46IHsgcGFnZVNpemU6IC0xIH0gfSkKICAgIC8vICAgdGhpcy5yb2FkRGF0YSA9IHJvd3MubWFwKGl0ZW0gPT4gewogICAgLy8gICAgIGl0ZW0ucm9hZE5hbWUgPSBpdGVtLm5hbWUgKyAnICcgKyBpdGVtLmNvZGUKICAgIC8vICAgICByZXR1cm4gaXRlbQogICAgLy8gICB9KQogICAgLy8gICBpZiAoIXRoaXMuaWQpIHsKICAgIC8vICAgICB0aGlzLmFkZEVkaXRGb3JtLnJvYWRJZCA9IHRoaXMucm9hZERhdGFbMF0uaWQKICAgIC8vICAgICB0aGlzLnJvYWRDaGFuZ2UodGhpcy5yb2FkRGF0YVswXS5pZCkKICAgIC8vICAgfQogICAgLy8gfSwKICAgIC8vIOiOt+WPlueCueS9jeagkeaVsOaNrgogICAgZ2V0SW5zcGVjdGlvblBvaW50c0RhdGE6IGZ1bmN0aW9uIGdldEluc3BlY3Rpb25Qb2ludHNEYXRhKCkgewogICAgICB2YXIgX2FyZ3VtZW50cyA9IGFyZ3VtZW50cywKICAgICAgICBfdGhpczUgPSB0aGlzOwogICAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKCkgewogICAgICAgIHZhciByb2FkSWQsIGNhbGxiYWNrLCBfeWllbGQkcG9pbnRUcmVlRGF0YSwgX3lpZWxkJHBvaW50VHJlZURhdGEkLCB2YWx1ZTsKICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0MykgewogICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgcm9hZElkID0gX2FyZ3VtZW50cy5sZW5ndGggPiAwICYmIF9hcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IF9hcmd1bWVudHNbMF0gOiAnJzsKICAgICAgICAgICAgICBjYWxsYmFjayA9IF9hcmd1bWVudHMubGVuZ3RoID4gMSA/IF9hcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgX2NvbnRleHQzLnByZXYgPSAyOwogICAgICAgICAgICAgIF90aGlzNS50cmVlTG9hZGluZyA9IHRydWU7CiAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA2OwogICAgICAgICAgICAgIHJldHVybiBwb2ludFRyZWVEYXRhKHsKICAgICAgICAgICAgICAgIHJvYWRJZDogcm9hZElkCiAgICAgICAgICAgICAgICAvLyBpbnNwZWN0aW9uQ3ljbGU6IHRoaXMuY3VycmVudEluc3BlY3Rpb25DeWNsZSwgLy8g5re75Yqg5beh5qOA5ZGo5pyf5Y+C5pWwCiAgICAgICAgICAgICAgICAvLyBwb2ludExldmVsOiB0aGlzLnBvaW50TGV2ZWwgLy8g54K55L2N57qn5Yir5Y+C5pWwCiAgICAgICAgICAgICAgfSwgJ2FkZEVkaXQnKTsKICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgIF95aWVsZCRwb2ludFRyZWVEYXRhID0gX2NvbnRleHQzLnNlbnQ7CiAgICAgICAgICAgICAgX3lpZWxkJHBvaW50VHJlZURhdGEkID0gX3lpZWxkJHBvaW50VHJlZURhdGEudmFsdWU7CiAgICAgICAgICAgICAgdmFsdWUgPSBfeWllbGQkcG9pbnRUcmVlRGF0YSQgPT09IHZvaWQgMCA/IFtdIDogX3lpZWxkJHBvaW50VHJlZURhdGEkOwogICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHZhbHVlKTsKICAgICAgICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZSwgJzk5OTk5OTg4ODg4OCcpOwogICAgICAgICAgICAgIF90aGlzNS5pbnNwZWN0aW9uUG9pbnRzRGF0YSA9IHZhbHVlOwogICAgICAgICAgICAgIC8vIOaVsOaNruWKoOi9veWujOaIkOWQjum7mOiupOmAieS4reaJgOaciWxldmVsPTTnmoToioLngrkKICAgICAgICAgICAgICBfdGhpczUuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgIHZhciBhbGxMZWFmTm9kZXMgPSBfdGhpczUuZ2V0QWxsTGVhZk5vZGVzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgX3RoaXM1LiRyZWZzLmFkZEVkaXRUcmVlLnNldENoZWNrZWRLZXlzKGFsbExlYWZOb2Rlcy5tYXAoZnVuY3Rpb24gKG5vZGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5jb2RlOwogICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgIF90aGlzNS5hZGRFZGl0Rm9ybS5wbGFuRGV0YWlscyA9IGFsbExlYWZOb2Rlcy5tYXAoZnVuY3Rpb24gKG5vZGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5jb2RlOwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDE4OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgIF9jb250ZXh0My5wcmV2ID0gMTU7CiAgICAgICAgICAgICAgX2NvbnRleHQzLnQwID0gX2NvbnRleHQzWyJjYXRjaCJdKDIpOwogICAgICAgICAgICAgIC8vIOS4jeS4uuivt+axgui/h+W/q+e7k+adn+eahOaDheWGteS4i++8jOmHjee9rgogICAgICAgICAgICAgIGlmIChfY29udGV4dDMudDAubWVzc2FnZSAhPT0gJ2NhbmNlbGVkJykgY2FsbGJhY2sgJiYgY2FsbGJhY2soW10pOwogICAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICAgIF9jb250ZXh0My5wcmV2ID0gMTg7CiAgICAgICAgICAgICAgX3RoaXM1LnRyZWVMb2FkaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5maW5pc2goMTgpOwogICAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpOwogICAgICAgICAgfQogICAgICAgIH0sIF9jYWxsZWUzLCBudWxsLCBbWzIsIDE1LCAxOCwgMjFdXSk7CiAgICAgIH0pKSgpOwogICAgfSwKICAgIC8vIOagueaNrumikeeOh+WIhue7hOW3oeajgOeCueaVsOaNrgogICAgLy8gZ3JvdXBJbnNwZWN0aW9uUG9pbnRzKGRhdGEpIHsKICAgIC8vICAgbGV0IGZyZXF1ZW5jeSA9IE51bWJlcih0aGlzLmFkZEVkaXRGb3JtLmZyZXF1ZW5jeSkgfHwgMQogICAgLy8gICAvLyDnibnmrorlpITnkIbmr4/lkajlkozmr4/mnIjnmoTmg4XlhrUKICAgIC8vICAgaWYgKHRoaXMuYWRkRWRpdEZvcm0uZnJlcXVlbmN5ID09PSAnNicpIHsgLy8g5q+P5ZGo5LiA5qyhCiAgICAvLyAgICAgZnJlcXVlbmN5ID0gNyAvLyDliIbmiJA357uECiAgICAvLyAgIH0gZWxzZSBpZiAodGhpcy5hZGRFZGl0Rm9ybS5mcmVxdWVuY3kgPT09ICc3JykgeyAvLyDmr4/mnIjkuIDmrKEKICAgIC8vICAgICBmcmVxdWVuY3kgPSAzMCAvLyDliIbmiJAzMOe7hAogICAgLy8gICB9CiAgICAvLyAgIC8vIOmHjee9ruWIhue7hOaVsOaNrgogICAgLy8gICB0aGlzLmdyb3VwZWRJbnNwZWN0aW9uUG9pbnRzID0gW10KICAgIC8vICAgdGhpcy5kYXlPcHRpb25zID0gW10KICAgIC8vCiAgICAvLyAgIGlmIChmcmVxdWVuY3kgPD0gMSkgewogICAgLy8gICAgIC8vIOmikeeOh+S4ujHlpKnmiJbkuI3liIbnu4QKICAgIC8vICAgICB0aGlzLmluc3BlY3Rpb25Qb2ludHNEYXRhID0gZGF0YQogICAgLy8gICAgIHJldHVybgogICAgLy8gICB9CiAgICAvLwogICAgLy8gICAvLyDliJvlu7rliIbnu4QKICAgIC8vICAgY29uc3QgbGVhZk5vZGVzID0gdGhpcy5nZXRBbGxMZWFmTm9kZXMoZGF0YSkKICAgIC8vICAgY29uc3QgZ3JvdXBTaXplID0gTWF0aC5jZWlsKGxlYWZOb2Rlcy5sZW5ndGggLyBmcmVxdWVuY3kpCiAgICAvLwogICAgLy8gICAvLyDlsIblj7blrZDoioLngrnliIbnu4QKICAgIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcmVxdWVuY3k7IGkrKykgewogICAgLy8gICAgIGNvbnN0IHN0YXJ0ID0gaSAqIGdyb3VwU2l6ZQogICAgLy8gICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgZ3JvdXBTaXplCiAgICAvLyAgICAgY29uc3QgZ3JvdXBOb2RlcyA9IGxlYWZOb2Rlcy5zbGljZShzdGFydCwgZW5kKQogICAgLy8gICAgIHRoaXMuZ3JvdXBlZEluc3BlY3Rpb25Qb2ludHMucHVzaChncm91cE5vZGVzLm1hcChub2RlID0+IG5vZGUuY29kZSkpCiAgICAvLwogICAgLy8gICAgIC8vIOa3u+WKoOWkqeaVsOmAiemhuQogICAgLy8gICAgIHRoaXMuZGF5T3B0aW9ucy5wdXNoKHsKICAgIC8vICAgICAgIHZhbHVlOiBpICsgMSwKICAgIC8vICAgICAgIGxhYmVsOiBg56ysJHtpICsgMX3lpKlgCiAgICAvLyAgICAgfSkKICAgIC8vICAgfQogICAgLy8KICAgIC8vICAgLy8g6buY6K6k6YCJ5Lit56ys5LiA5aSpCiAgICAvLyAgIHRoaXMuc2VsZWN0ZWREYXkgPSB0aGlzLmRheU9wdGlvbnNbMF0/LnZhbHVlIHx8ICcnCiAgICAvLyAgIHRoaXMuZmlsdGVySW5zcGVjdGlvblBvaW50c0J5RGF5KCkKICAgIC8vIH0sCiAgICAvLyDmoLnmja7pgInmi6nnmoTlpKnmlbDov4fmu6Tlt6Hmo4DngrkKICAgIC8vIGZpbHRlckluc3BlY3Rpb25Qb2ludHNCeURheSgpIHsKICAgIC8vICAgaWYgKCF0aGlzLnNlbGVjdGVkRGF5IHx8IHRoaXMuZ3JvdXBlZEluc3BlY3Rpb25Qb2ludHMubGVuZ3RoID09PSAwKSB7CiAgICAvLyAgICAgLy8g57yW6L6R5qih5byP5LiL5Y+q5pi+56S65bey5Yu+6YCJ55qE6IqC54K5CiAgICAvLyAgICAgaWYgKHRoaXMuaWQgJiYgdGhpcy5hZGRFZGl0Rm9ybS5wbGFuRGV0YWlscyAmJiB0aGlzLmFkZEVkaXRGb3JtLnBsYW5EZXRhaWxzLmxlbmd0aCA+IDApIHsKICAgIC8vICAgICAgIHRoaXMuZmlsdGVyT25seVNlbGVjdGVkTm9kZXMoKQogICAgLy8gICAgIH0gZWxzZSB7CiAgICAvLyAgICAgICB0aGlzLmluc3BlY3Rpb25Qb2ludHNEYXRhID0gdGhpcy5vcmlnaW5hbEluc3BlY3Rpb25Qb2ludHMKICAgIC8vICAgICB9CiAgICAvLyAgICAgcmV0dXJuCiAgICAvLyAgIH0KICAgIC8vCiAgICAvLyAgIGNvbnN0IGRheUluZGV4ID0gTnVtYmVyKHRoaXMuc2VsZWN0ZWREYXkpIC0gMQogICAgLy8gICBjb25zdCBjaGVja2VkQ29kZXMgPSB0aGlzLmdyb3VwZWRJbnNwZWN0aW9uUG9pbnRzW2RheUluZGV4XSB8fCBbXQogICAgLy8KICAgIC8vICAgLy8g57yW6L6R5qih5byP5LiL5Y+q5pi+56S65bey5Yu+6YCJ55qE6IqC54K5CiAgICAvLyAgIGlmICh0aGlzLmlkICYmIHRoaXMuYWRkRWRpdEZvcm0ucGxhbkRldGFpbHMgJiYgdGhpcy5hZGRFZGl0Rm9ybS5wbGFuRGV0YWlscy5sZW5ndGggPiAwKSB7CiAgICAvLyAgICAgdGhpcy5maWx0ZXJPbmx5U2VsZWN0ZWROb2RlcyhjaGVja2VkQ29kZXMpCiAgICAvLyAgIH0gZWxzZSB7CiAgICAvLyAgICAgLy8g5paw5aKe5qih5byP5LiL5oyJ5q2j5bi46YC76L6R6L+H5rukCiAgICAvLyAgICAgY29uc3QgZmlsdGVyZWREYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm9yaWdpbmFsSW5zcGVjdGlvblBvaW50cykpCiAgICAvLyAgICAgdGhpcy5tYXJrQW5kRmlsdGVyTm9kZXMoZmlsdGVyZWREYXRhLCBjaGVja2VkQ29kZXMpCiAgICAvLyAgICAgdGhpcy5pbnNwZWN0aW9uUG9pbnRzRGF0YSA9IHRoaXMuZmlsdGVyTm9kZXMoZmlsdGVyZWREYXRhKQogICAgLy8gICB9CiAgICAvLwogICAgLy8gICB0aGlzLnVwZGF0ZVRyZWVTZWxlY3Rpb24oY2hlY2tlZENvZGVzKQogICAgLy8gICAvLyDmt7HluqblpI3liLbljp/lp4vmlbDmja4KICAgIC8vICAgY29uc3QgZmlsdGVyZWREYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm9yaWdpbmFsSW5zcGVjdGlvblBvaW50cykpCiAgICAvLwogICAgLy8gICAvLyDmoIforrDlk6rkupvoioLngrnlupTor6XmmL7npLoKICAgIC8vICAgY29uc3QgbWFya1Zpc2libGVOb2RlcyA9IChub2RlcykgPT4gewogICAgLy8gICAgIG5vZGVzLmZvckVhY2gobm9kZSA9PiB7CiAgICAvLyAgICAgICBpZiAobm9kZS5sZXZlbCA9PT0gJzQnKSB7CiAgICAvLyAgICAgICAgIC8vIOWPtuWtkOiKgueCuSAtIOagueaNruaYr+WQpuWcqOmAieS4reWIhue7hOS4reWGs+WumuaYr+WQpuaYvuekugogICAgLy8gICAgICAgICBub2RlLnZpc2libGUgPSBjaGVja2VkQ29kZXMuaW5jbHVkZXMobm9kZS5jb2RlKQogICAgLy8gICAgICAgfSBlbHNlIHsKICAgIC8vICAgICAgICAgLy8g6Z2e5Y+25a2Q6IqC54K5IC0g6YCS5b2S5aSE55CG5a2Q6IqC54K5CiAgICAvLyAgICAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7CiAgICAvLyAgICAgICAgICAgbWFya1Zpc2libGVOb2Rlcyhub2RlLmNoaWxkcmVuKQogICAgLy8gICAgICAgICAgIC8vIOWmguaenOWtkOiKgueCueacieWPr+ingeeahO+8jOWImeW9k+WJjeiKgueCueS5n+WPr+ingQogICAgLy8gICAgICAgICAgIG5vZGUudmlzaWJsZSA9IG5vZGUuY2hpbGRyZW4uc29tZShjaGlsZCA9PiBjaGlsZC52aXNpYmxlKQogICAgLy8gICAgICAgICB9IGVsc2UgewogICAgLy8gICAgICAgICAgIG5vZGUudmlzaWJsZSA9IGZhbHNlCiAgICAvLyAgICAgICAgIH0KICAgIC8vICAgICAgIH0KICAgIC8vICAgICB9KQogICAgLy8gICB9CiAgICAvLwogICAgLy8gICBtYXJrVmlzaWJsZU5vZGVzKGZpbHRlcmVkRGF0YSkKICAgIC8vCiAgICAvLyAgIC8vIOi/h+a7pOaOieS4jeWPr+ingeeahOiKgueCuQogICAgLy8gICBjb25zdCBmaWx0ZXJOb2RlcyA9IChub2RlcykgPT4gewogICAgLy8gICAgIHJldHVybiBub2Rlcy5maWx0ZXIobm9kZSA9PiB7CiAgICAvLyAgICAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgLy8gICAgICAgICBub2RlLmNoaWxkcmVuID0gZmlsdGVyTm9kZXMobm9kZS5jaGlsZHJlbikKICAgIC8vICAgICAgICAgcmV0dXJuIG5vZGUudmlzaWJsZSAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDAKICAgIC8vICAgICAgIH0KICAgIC8vICAgICAgIHJldHVybiBub2RlLnZpc2libGUKICAgIC8vICAgICB9KQogICAgLy8gICB9CiAgICAvLwogICAgLy8gICB0aGlzLmluc3BlY3Rpb25Qb2ludHNEYXRhID0gZmlsdGVyTm9kZXMoZmlsdGVyZWREYXRhKQogICAgLy8KICAgIC8vICAgLy8g5pu05paw5qCR57uE5Lu2CiAgICAvLyAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHsKICAgIC8vICAgICBpZiAodGhpcy4kcmVmcy5hZGRFZGl0VHJlZSkgewogICAgLy8gICAgICAgLy8g6buY6K6k6YCJ5Lit5b2T5YmN5YiG57uE55qE6IqC54K5CiAgICAvLyAgICAgICB0aGlzLiRyZWZzLmFkZEVkaXRUcmVlLnNldENoZWNrZWRLZXlzKGNoZWNrZWRDb2RlcykKICAgIC8vICAgICAgIHRoaXMuYWRkRWRpdEZvcm0ucGxhbkRldGFpbHMgPSBjaGVja2VkQ29kZXMKICAgIC8vCiAgICAvLyAgICAgICAvLyDlsZXlvIDmiYDmnInlj6/op4HoioLngrkKICAgIC8vICAgICAgIGNvbnN0IGFsbE5vZGVzID0gdGhpcy4kcmVmcy5hZGRFZGl0VHJlZS5zdG9yZS5fZ2V0QWxsTm9kZXMoKQogICAgLy8gICAgICAgYWxsTm9kZXMuZm9yRWFjaChub2RlID0+IHsKICAgIC8vICAgICAgICAgaWYgKG5vZGUuZGF0YS52aXNpYmxlKSB7CiAgICAvLyAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IHRydWUKICAgIC8vICAgICAgICAgfQogICAgLy8gICAgICAgfSkKICAgIC8vICAgICB9CiAgICAvLyAgIH0pCiAgICAvLyB9LAogICAgLy8g5Y+q6L+H5ruk5bey6YCJ5Lit55qE6IqC54K5CiAgICAvLyBmaWx0ZXJPbmx5U2VsZWN0ZWROb2RlcyhjaGVja2VkQ29kZXMgPSBbXSkgewogICAgLy8gICBpZiAoIXRoaXMub3JpZ2luYWxJbnNwZWN0aW9uUG9pbnRzKSByZXR1cm4KICAgIC8vCiAgICAvLyAgIC8vIOa3seW6puWkjeWItuWOn+Wni+aVsOaNrgogICAgLy8gICBjb25zdCBmaWx0ZXJlZERhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMub3JpZ2luYWxJbnNwZWN0aW9uUG9pbnRzKSkKICAgIC8vCiAgICAvLyAgIC8vIOagh+iusOWTquS6m+iKgueCueW6lOivpeaYvuekuu+8iOWPquaYvuekuuW3suWLvumAieeahOiKgueCue+8iQogICAgLy8gICBjb25zdCBtYXJrVmlzaWJsZU5vZGVzID0gKG5vZGVzKSA9PiB7CiAgICAvLyAgICAgbm9kZXMuZm9yRWFjaChub2RlID0+IHsKICAgIC8vICAgICAgIGlmIChub2RlLmxldmVsID09PSAnNCcpIHsKICAgIC8vICAgICAgICAgLy8g5Y+25a2Q6IqC54K5IC0g5Y+q5pi+56S65ZyocGxhbkRldGFpbHPkuK3nmoToioLngrkKICAgIC8vICAgICAgICAgbm9kZS52aXNpYmxlID0gdGhpcy5hZGRFZGl0Rm9ybS5wbGFuRGV0YWlscy5pbmNsdWRlcyhub2RlLmNvZGUpICYmCiAgICAvLyAgICAgICAgICAgKGNoZWNrZWRDb2Rlcy5sZW5ndGggPT09IDAgfHwgY2hlY2tlZENvZGVzLmluY2x1ZGVzKG5vZGUuY29kZSkpCiAgICAvLyAgICAgICB9IGVsc2UgewogICAgLy8gICAgICAgICAvLyDpnZ7lj7blrZDoioLngrkgLSDpgJLlvZLlpITnkIblrZDoioLngrkKICAgIC8vICAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHsKICAgIC8vICAgICAgICAgICBtYXJrVmlzaWJsZU5vZGVzKG5vZGUuY2hpbGRyZW4pCiAgICAvLyAgICAgICAgICAgLy8g5aaC5p6c5a2Q6IqC54K55pyJ5Y+v6KeB55qE77yM5YiZ5b2T5YmN6IqC54K55Lmf5Y+v6KeBCiAgICAvLyAgICAgICAgICAgbm9kZS52aXNpYmxlID0gbm9kZS5jaGlsZHJlbi5zb21lKGNoaWxkID0+IGNoaWxkLnZpc2libGUpCiAgICAvLyAgICAgICAgIH0gZWxzZSB7CiAgICAvLyAgICAgICAgICAgbm9kZS52aXNpYmxlID0gZmFsc2UKICAgIC8vICAgICAgICAgfQogICAgLy8gICAgICAgfQogICAgLy8gICAgIH0pCiAgICAvLyAgIH0KICAgIC8vCiAgICAvLyAgIG1hcmtWaXNpYmxlTm9kZXMoZmlsdGVyZWREYXRhKQogICAgLy8gICB0aGlzLmluc3BlY3Rpb25Qb2ludHNEYXRhID0gdGhpcy5maWx0ZXJOb2RlcyhmaWx0ZXJlZERhdGEpCiAgICAvLyB9LAogICAgLy8g5qCH6K6w5ZKM6L+H5ruk6IqC54K5CiAgICAvLyAgICAgbWFya0FuZEZpbHRlck5vZGVzKGRhdGEsIGNoZWNrZWRDb2RlcykgewogICAgLy8gICAgICAgY29uc3QgbWFya1Zpc2libGVOb2RlcyA9IChub2RlcykgPT4gewogICAgLy8gICAgICAgICBub2Rlcy5mb3JFYWNoKG5vZGUgPT4gewogICAgLy8gICAgICAgICAgIGlmIChub2RlLmxldmVsID09PSAnNCcpIHsKICAgIC8vICAgICAgICAgICAgIG5vZGUudmlzaWJsZSA9IGNoZWNrZWRDb2Rlcy5pbmNsdWRlcyhub2RlLmNvZGUpCiAgICAvLyAgICAgICAgICAgfSBlbHNlIHsKICAgIC8vICAgICAgICAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7CiAgICAvLyAgICAgICAgICAgICAgIG1hcmtWaXNpYmxlTm9kZXMobm9kZS5jaGlsZHJlbikKICAgIC8vICAgICAgICAgICAgICAgbm9kZS52aXNpYmxlID0gbm9kZS5jaGlsZHJlbi5zb21lKGNoaWxkID0+IGNoaWxkLnZpc2libGUpCiAgICAvLyAgICAgICAgICAgICB9IGVsc2UgewogICAgLy8gICAgICAgICAgICAgICBub2RlLnZpc2libGUgPSBmYWxzZQogICAgLy8gICAgICAgICAgICAgfQogICAgLy8gICAgICAgICAgIH0KICAgIC8vICAgICAgICAgfSkKICAgIC8vICAgICAgIH0KICAgIC8vICAgICAgIG1hcmtWaXNpYmxlTm9kZXMoZGF0YSkKICAgIC8vICAgICB9LAogICAgLy8g6L+H5ruk6IqC54K5CiAgICAvLyAgICAgZmlsdGVyTm9kZXMobm9kZXMpIHsKICAgIC8vICAgICAgIHJldHVybiBub2Rlcy5maWx0ZXIobm9kZSA9PiB7CiAgICAvLyAgICAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7CiAgICAvLyAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IHRoaXMuZmlsdGVyTm9kZXMobm9kZS5jaGlsZHJlbikKICAgIC8vICAgICAgICAgICByZXR1cm4gbm9kZS52aXNpYmxlICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMAogICAgLy8gICAgICAgICB9CiAgICAvLyAgICAgICAgIHJldHVybiBub2RlLnZpc2libGUKICAgIC8vICAgICAgIH0pCiAgICAvLyAgICAgfSwKICAgIC8vIOabtOaWsOagkemAieaLqeeKtuaAgQogICAgLy8gICAgIHVwZGF0ZVRyZWVTZWxlY3Rpb24oY2hlY2tlZENvZGVzKSB7CiAgICAvLyAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7CiAgICAvLyAgICAgICAgIGlmICh0aGlzLiRyZWZzLmFkZEVkaXRUcmVlKSB7CiAgICAvLyAgICAgICAgICAgLy8g6K6+572u5Yu+6YCJ54q25oCBCiAgICAvLyAgICAgICAgICAgdGhpcy4kcmVmcy5hZGRFZGl0VHJlZS5zZXRDaGVja2VkS2V5cyhjaGVja2VkQ29kZXMpCiAgICAvLyAgICAgICAgICAgdGhpcy5hZGRFZGl0Rm9ybS5wbGFuRGV0YWlscyA9IGNoZWNrZWRDb2RlcwogICAgLy8KICAgIC8vICAgICAgICAgICAvLyDlsZXlvIDlj6/op4HoioLngrkKICAgIC8vICAgICAgICAgICBjb25zdCBhbGxOb2RlcyA9IHRoaXMuJHJlZnMuYWRkRWRpdFRyZWUuc3RvcmUuX2dldEFsbE5vZGVzKCkKICAgIC8vICAgICAgICAgICBhbGxOb2Rlcy5mb3JFYWNoKG5vZGUgPT4gewogICAgLy8gICAgICAgICAgICAgaWYgKG5vZGUuZGF0YS52aXNpYmxlKSB7CiAgICAvLyAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSB0cnVlCiAgICAvLyAgICAgICAgICAgICB9CiAgICAvLyAgICAgICAgICAgfSkKICAgIC8vICAgICAgICAgfQogICAgLy8gICAgICAgfSkKICAgIC8vICAgICB9LAogICAgLy8g6I635Y+W5omA5pyJbGV2ZWw9NOeahOWPtuWtkOiKgueCuS0tLem7mOiupOmAieS4rQogICAgLy8gZ2V0QWxsTGVhZk5vZGVzKHRyZWVEYXRhKSB7CiAgICAvLyAgIGNvbnN0IHJlc3VsdCA9IFtdCiAgICAvLyAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzKSA9PiB7CiAgICAvLyAgICAgbm9kZXMuZm9yRWFjaChub2RlID0+IHsKICAgIC8vICAgICAgIGlmIChub2RlLmxldmVsID09PSAnNCcpIHsKICAgIC8vICAgICAgICAgcmVzdWx0LnB1c2gobm9kZSkKICAgIC8vICAgICAgIH0KICAgIC8vICAgICAgIGlmIChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAvLyAgICAgICAgIHRyYXZlcnNlKG5vZGUuY2hpbGRyZW4pCiAgICAvLyAgICAgICB9CiAgICAvLyAgICAgfSkKICAgIC8vICAgfQogICAgLy8gICB0cmF2ZXJzZSh0cmVlRGF0YSkKICAgIC8vICAgcmV0dXJuIHJlc3VsdAogICAgLy8gfSwKICAgIC8vIOmAmui/h+i3r+auteS/oeaBr+iOt+WPluayv+e6v+iuvuWkh+S/oeaBrwogICAgZ2V0QWxvbmdSb3V0ZUluZm86IGZ1bmN0aW9uIGdldEFsb25nUm91dGVJbmZvKHZhbHVlLCBjYWxsYmFjaykgewogICAgICB2YXIgX3RoaXM2ID0gdGhpczsKICAgICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lKCkubWFyayhmdW5jdGlvbiBfY2FsbGVlNCgpIHsKICAgICAgICB2YXIgX3dpcGVEYXRhLCBfeWllbGQkYWxvbmdSb3V0ZUluZm8sIF95aWVsZCRhbG9uZ1JvdXRlSW5mbzIsIHJvd3M7CiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU0JChfY29udGV4dDQpIHsKICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgIF93aXBlRGF0YSA9IGZ1bmN0aW9uIF93aXBlRGF0YSgpIHsKICAgICAgICAgICAgICAgIF90aGlzNi5hbG9uZ1JvdXRlSW5mb0RhdGEgPSBbXTsKICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKF90aGlzNi5hbG9uZ1JvdXRlSW5mb0RhdGEpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgX2NvbnRleHQ0LnByZXYgPSAxOwogICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gNDsKICAgICAgICAgICAgICByZXR1cm4gYWxvbmdSb3V0ZUluZm9JbnRlcihyZWZpbmVSZXF1ZXN0Qm9keSh7CiAgICAgICAgICAgICAgICBxdWVyeXM6IFt7CiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0lOJywKICAgICAgICAgICAgICAgICAgcHJvcGVydHk6ICdyb2FkX3NlZ21lbnRfaWRfJywKICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlCiAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgIH0pLCAnYWRkRWRpdCcpOwogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgX3lpZWxkJGFsb25nUm91dGVJbmZvID0gX2NvbnRleHQ0LnNlbnQ7CiAgICAgICAgICAgICAgX3lpZWxkJGFsb25nUm91dGVJbmZvMiA9IF95aWVsZCRhbG9uZ1JvdXRlSW5mby5yb3dzOwogICAgICAgICAgICAgIHJvd3MgPSBfeWllbGQkYWxvbmdSb3V0ZUluZm8yID09PSB2b2lkIDAgPyBbXSA6IF95aWVsZCRhbG9uZ1JvdXRlSW5mbzI7CiAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2socm93cyk7CiAgICAgICAgICAgICAgX3RoaXM2LmFsb25nUm91dGVJbmZvRGF0YSA9IHJvd3M7CiAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAxNDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICBfY29udGV4dDQucHJldiA9IDExOwogICAgICAgICAgICAgIF9jb250ZXh0NC50MCA9IF9jb250ZXh0NFsiY2F0Y2giXSgxKTsKICAgICAgICAgICAgICAvLyDkuI3kuLror7fmsYLov4flv6vnu5PmnZ/nmoTmg4XlhrXkuIvvvIzph43nva4KICAgICAgICAgICAgICBpZiAoX2NvbnRleHQ0LnQwLm1lc3NhZ2UgIT09ICdjYW5jZWxlZCcpIF93aXBlRGF0YSgpOwogICAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQuc3RvcCgpOwogICAgICAgICAgfQogICAgICAgIH0sIF9jYWxsZWU0LCBudWxsLCBbWzEsIDExXV0pOwogICAgICB9KSkoKTsKICAgIH0sCiAgICAvLyDmiZPlvIDpobXpnaLmiafooYwKICAgIG9wZW5QYWdlOiBmdW5jdGlvbiBvcGVuUGFnZSgpIHt9LAogICAgLy8g5YWz6Zet6aG16Z2i5omn6KGMCiAgICBjbG9zZVBhZ2U6IGZ1bmN0aW9uIGNsb3NlUGFnZSgpIHsKICAgICAgdmFyIF90aGlzNyA9IHRoaXM7CiAgICAgIHZhciBhZGRFZGl0UnVsZXMgPSB0aGlzLmFkZEVkaXRSdWxlcywKICAgICAgICBwdWJTdWIgPSB0aGlzLnB1YlN1YiwKICAgICAgICB0cmVlRGF0YSA9IHRoaXMudHJlZURhdGEsCiAgICAgICAgcm9hZERhdGEgPSB0aGlzLnJvYWREYXRhOwogICAgICB0aGlzLnJlc2V0VHJlZSgpOwoKICAgICAgLy8g6YeN572u57uE5Lu25pWw5o2uCiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy4kZGF0YSwgdGhpcy4kb3B0aW9ucy5kYXRhLmNhbGwodGhpcyksIHsKICAgICAgICBhZGRFZGl0UnVsZXM6IGFkZEVkaXRSdWxlcywKICAgICAgICBwdWJTdWI6IHB1YlN1YiwKICAgICAgICB0cmVlRGF0YTogdHJlZURhdGEsCiAgICAgICAgcm9hZERhdGE6IHJvYWREYXRhCiAgICAgIH0pOwogICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoXykgewogICAgICAgIF90aGlzNy4kcmVmcy5hZGRFZGl0Rm9ybS4kZWwuc2Nyb2xsVG9wID0gMDsKICAgICAgICBfdGhpczcuJHJlZnMuYWRkRWRpdEZvcm0uY2xlYXJWYWxpZGF0ZSgpOwogICAgICB9KTsKICAgIH0sCiAgICAvLyDpgJrov4dKU09O5a+56LGh6I635Y+W5bGe5oCn5YC8CiAgICBnZXRWYWxCeUpzb246IGZ1bmN0aW9uIGdldFZhbEJ5SnNvbihqc29uLCBrZXkpIHsKICAgICAgdmFyIF9KU09OJHBhcnNlOwogICAgICByZXR1cm4gKF9KU09OJHBhcnNlID0gSlNPTi5wYXJzZShqc29uKSkgPT09IG51bGwgfHwgX0pTT04kcGFyc2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9KU09OJHBhcnNlW2tleV07CiAgICB9LAogICAgLy8g6Lev5q615pS55Y+Y5ZCO6Kem5Y+RCiAgICByb2FkQ2hhbmdlOiBmdW5jdGlvbiByb2FkQ2hhbmdlKHZhbHVlKSB7CiAgICAgIHZhciBfdGhpczggPSB0aGlzOwogICAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU1KCkgewogICAgICAgIHZhciBfZmluZEluZGV4OwogICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlNSQoX2NvbnRleHQ1KSB7CiAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDUucHJldiA9IF9jb250ZXh0NS5uZXh0KSB7CiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgLy8g5qC55o2uaWTmn6Xor6LmlbDmja7ntKLlvJUKICAgICAgICAgICAgICAgIF9maW5kSW5kZXggPSBmdW5jdGlvbiBfZmluZEluZGV4KCkgewogICAgICAgICAgICAgICAgICB2YXIgYXJyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTsKICAgICAgICAgICAgICAgICAgdmFyIGlkID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgIHJldHVybiBhcnIgPT09IG51bGwgfHwgYXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcnIuZmluZEluZGV4KGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uaWQgPT09IGlkOwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07IC8vIOabtOaWsOaOkuW6jwogICAgICAgICAgICAgICAgLy8gdmFsdWUuc29ydCgoYSwgYikgPT4gX2ZpbmRJbmRleCh0aGlzLnJvYWREYXRhLCBhKSAtIF9maW5kSW5kZXgodGhpcy5yb2FkRGF0YSwgYikpCiAgICAgICAgICAgICAgICAvLyDpgJrov4fot6/mrrXkv6Hmga/ojrflj5blt6Hmn6XpmJ/kvI3kv6Hmga8KICAgICAgICAgICAgICAgIF90aGlzOC5nZXRUZWFtRGF0YSh2YWx1ZSk7CgogICAgICAgICAgICAgICAgLy8g6YCa6L+H6Lev5q615L+h5oGv6I635Y+W5rK/57q/6K6+5aSH5L+h5oGvCiAgICAgICAgICAgICAgICBfdGhpczguZ2V0QWxvbmdSb3V0ZUluZm8odmFsdWUsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgIHZhciBfdGhpczgkYWRkRWRpdEZvcm0gPSBfdGhpczguYWRkRWRpdEZvcm0sCiAgICAgICAgICAgICAgICAgICAgc3RhcnRQYXRyb2xJZCA9IF90aGlzOCRhZGRFZGl0Rm9ybS5zdGFydFBhdHJvbElkLAogICAgICAgICAgICAgICAgICAgIGVuZFBhdHJvbElkID0gX3RoaXM4JGFkZEVkaXRGb3JtLmVuZFBhdHJvbElkOwoKICAgICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgICog5beh5qOA5byA5aeL77yM57uT5p2f56uZDQogICAgICAgICAgICAgICAgICAqICovCiAgICAgICAgICAgICAgICAgIGlmIChzdGFydFBhdHJvbElkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLnNvbWUoZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmlkID09PSBzdGFydFBhdHJvbElkOwogICAgICAgICAgICAgICAgICAgIH0pKSB7CiAgICAgICAgICAgICAgICAgICAgICBfdGhpczguYWRkRWRpdEZvcm0uc3RhcnRQYXRyb2xJZCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoXykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM4LiRtZXNzYWdlLndhcm5pbmcoJ+ivt+mHjeaWsOmAieaLqeW3oeajgOW8gOWni+ermS4uJyk7CiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGVuZFBhdHJvbElkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLnNvbWUoZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmlkID09PSBlbmRQYXRyb2xJZDsKICAgICAgICAgICAgICAgICAgICB9KSkgewogICAgICAgICAgICAgICAgICAgICAgX3RoaXM4LmFkZEVkaXRGb3JtLmVuZFBhdHJvbElkID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uIChfKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczguJG1lc3NhZ2Uud2FybmluZygn6K+36YeN5paw6YCJ5oup5beh5qOA57uT5p2f56uZLi4nKTsKICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8g6YCa6L+H6Lev5q615L+h5oGv6I635Y+W5beh5qOA5YaF5a6554K55L2NCiAgICAgICAgICAgICAgICBfdGhpczguZ2V0SW5zcGVjdGlvblBvaW50c0RhdGEodmFsdWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIF90aGlzOC5hZGRFZGl0Rm9ybS5wbGFuRGV0YWlscyA9IFtdOwogICAgICAgICAgICAgICAgICB2YXIgX3RoaXM4JGFkZEVkaXRGb3JtJHBsID0gX3RoaXM4LmFkZEVkaXRGb3JtLnBsYW5EZXRhaWxzLAogICAgICAgICAgICAgICAgICAgIHBsYW5EZXRhaWxzID0gX3RoaXM4JGFkZEVkaXRGb3JtJHBsID09PSB2b2lkIDAgPyBbXSA6IF90aGlzOCRhZGRFZGl0Rm9ybSRwbDsKCiAgICAgICAgICAgICAgICAgIC8vIOmBv+WFjeWIh+aNoui3r+auteWvvOiHtOeahOeCueS9jeaVsOaNruS4jeWQiOazlQogICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uIChfKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzOCQkcmVmcyRhZGRFZGl0VDsKICAgICAgICAgICAgICAgICAgICBfdGhpczguaW5pdGlhbGl6ZVRyZWUocGxhbkRldGFpbHMpOwogICAgICAgICAgICAgICAgICAgIHZhciBjaGVja05vZGUgPSAoKF90aGlzOCQkcmVmcyRhZGRFZGl0VCA9IF90aGlzOC4kcmVmcy5hZGRFZGl0VHJlZSkgPT09IG51bGwgfHwgX3RoaXM4JCRyZWZzJGFkZEVkaXRUID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpczgkJHJlZnMkYWRkRWRpdFQuZ2V0Q2hlY2tlZE5vZGVzKCkpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgIF90aGlzOC5hZGRFZGl0Rm9ybS5wbGFuRGV0YWlscyA9IHBsYW5EZXRhaWxzLmZpbHRlcihmdW5jdGlvbiAocGF0cm9sSWQpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGVja05vZGUuZmluZChmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5jb2RlID09PSBwYXRyb2xJZDsKICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICBfdGhpczguZm9ybUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ1LnN0b3AoKTsKICAgICAgICAgIH0KICAgICAgICB9LCBfY2FsbGVlNSk7CiAgICAgIH0pKSgpOwogICAgfSwKICAgIC8vIOmAmui/h+i3r+auteS/oeaBr+iOt+WPluW3oeafpemYn+S8jeS/oeaBrwogICAgZ2V0VGVhbURhdGE6IGZ1bmN0aW9uIGdldFRlYW1EYXRhKHZhbHVlKSB7CiAgICAgIHZhciBfdGhpczkgPSB0aGlzOwogICAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU2KCkgewogICAgICAgIHZhciBfeWllbGQkdGVhbURhdGEsIF95aWVsZCR0ZWFtRGF0YSRyb3dzLCByb3dzOwogICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlNiQoX2NvbnRleHQ2KSB7CiAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDYucHJldiA9IF9jb250ZXh0Ni5uZXh0KSB7CiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICBfY29udGV4dDYubmV4dCA9IDI7CiAgICAgICAgICAgICAgcmV0dXJuIHRlYW1EYXRhKHJlZmluZVJlcXVlc3RCb2R5KHsKICAgICAgICAgICAgICAgIHF1ZXJ5czogW3sKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnSU4nLAogICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ3IuaWRfJywKICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywKICAgICAgICAgICAgICAgICAgcHJvcGVydHk6ICd0LnR5cGVfJywKICAgICAgICAgICAgICAgICAgdmFsdWU6ICcxJwogICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICB9KSwgJ2FkZEVkaXQnKTsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgIF95aWVsZCR0ZWFtRGF0YSA9IF9jb250ZXh0Ni5zZW50OwogICAgICAgICAgICAgIF95aWVsZCR0ZWFtRGF0YSRyb3dzID0gX3lpZWxkJHRlYW1EYXRhLnJvd3M7CiAgICAgICAgICAgICAgcm93cyA9IF95aWVsZCR0ZWFtRGF0YSRyb3dzID09PSB2b2lkIDAgPyBbXSA6IF95aWVsZCR0ZWFtRGF0YSRyb3dzOwogICAgICAgICAgICAgIF90aGlzOS50cmVlRGF0YSA9IHJvd3M7CiAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LnN0b3AoKTsKICAgICAgICAgIH0KICAgICAgICB9LCBfY2FsbGVlNik7CiAgICAgIH0pKSgpOwogICAgfSwKICAgIC8vIOagkeiKgueCuemAieS4rQogICAgY2hlY2tDaGFuZ2U6IGZ1bmN0aW9uIGNoZWNrQ2hhbmdlKCkgewogICAgICB2YXIgX3RoaXMkJHJlZnMkYWRkRWRpdFRyMjsKICAgICAgdGhpcy5hZGRFZGl0Rm9ybS5wbGFuRGV0YWlscyA9ICgoX3RoaXMkJHJlZnMkYWRkRWRpdFRyMiA9IHRoaXMuJHJlZnMuYWRkRWRpdFRyZWUpID09PSBudWxsIHx8IF90aGlzJCRyZWZzJGFkZEVkaXRUcjIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJCRyZWZzJGFkZEVkaXRUcjIuZ2V0Q2hlY2tlZEtleXMoKSkgfHwgW107CiAgICB9LAogICAgLy8g5riF56m65qCR6YCJ5LitCiAgICBjbGVhclRyZWVTZWxlY3Q6IGZ1bmN0aW9uIGNsZWFyVHJlZVNlbGVjdCgpIHsKICAgICAgdGhpcy4kcmVmcy5hZGRFZGl0VHJlZS5zZXRDaGVja2VkS2V5cyhbXSk7CiAgICAgIHRoaXMuYWRkRWRpdEZvcm0ucGxhbkRldGFpbHMgPSBbXTsKICAgIH0sCiAgICAvLyDph43nva7moJHnirbmgIEKICAgIHJlc2V0VHJlZTogZnVuY3Rpb24gcmVzZXRUcmVlKCkgewogICAgICB0aGlzLmNsZWFyVHJlZVNlbGVjdCgpOwogICAgICB0aGlzLmNvbGxhcHNlQWxsTm9kZXMoZmFsc2UpOwogICAgfSwKICAgIC8vIOaUtui1t+aIluWxleW8gOagkeaJgOacieWxgue6pwogICAgY29sbGFwc2VBbGxOb2RlczogZnVuY3Rpb24gY29sbGFwc2VBbGxOb2RlcygpIHsKICAgICAgdmFyIHN0YXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlOwogICAgICB2YXIgbm9kZXMgPSB0aGlzLiRyZWZzLmFkZEVkaXRUcmVlLnN0b3JlLl9nZXRBbGxOb2RlcygpOwogICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgcmV0dXJuIGl0ZW0uZXhwYW5kZWQgPSBzdGF0ZTsKICAgICAgfSk7CiAgICB9LAogICAgLy8g5bGV5byA5Yu+6YCJ5bGC57qn54K55L2NCiAgICBpbml0aWFsaXplVHJlZTogZnVuY3Rpb24gaW5pdGlhbGl6ZVRyZWUoKSB7CiAgICAgIHZhciBzZWxlY3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdOwogICAgICBpZiAoIShBcnJheS5pc0FycmF5KHNlbGVjdCkgJiYgc2VsZWN0Lmxlbmd0aCkpIHJldHVybjsKICAgICAgdmFyIHRyZWUgPSB0aGlzLiRyZWZzLmFkZEVkaXRUcmVlOwogICAgICAvLyDorr7nva7li77pgInnmoToioLngrkKICAgICAgdHJlZS5zZXRDaGVja2VkS2V5cyhzZWxlY3QpOwoKICAgICAgLy8g6I635Y+W5omA5pyJ5Yu+6YCJ55qE6IqC54K55bm25bGV5byA5YW254i26IqC54K5CiAgICAgIHNlbGVjdC5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICB2YXIgbm9kZSA9IHRyZWUgPT09IG51bGwgfHwgdHJlZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdHJlZS5nZXROb2RlKGtleSk7CiAgICAgICAgaWYgKG5vZGUpIHsKICAgICAgICAgIHZhciBwYXJlbnQgPSBub2RlLnBhcmVudDsKICAgICAgICAgIHdoaWxlIChwYXJlbnQpIHsKICAgICAgICAgICAgcGFyZW50LmV4cGFuZCgpOwogICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9LAogICAgLy8g5Lu75Yqh57G75Z6L5YiH5o2iCiAgICBmcmVxdWVuY3lDaGFuZ2U6IGZ1bmN0aW9uIGZyZXF1ZW5jeUNoYW5nZSgpIHsKICAgICAgdmFyIF90aGlzMTAgPSB0aGlzOwogICAgICB0aGlzLmFkZEVkaXRGb3JtLnBsYW5JbnRlcnZhbCA9ICcnOwogICAgICB0aGlzLmFkZEVkaXRGb3JtLnRpbWUgPSBbXTsKICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24gKF8pIHsKICAgICAgICBfdGhpczEwLiRyZWZzLmFkZEVkaXRGb3JtLmNsZWFyVmFsaWRhdGUoWydwbGFuSW50ZXJ2YWwnLCAndGltZScsICd0YXNrVHlwZSddKTsKICAgICAgfSk7CiAgICB9LAogICAgLy8g5L+d5a2YCiAgICBoYW5kbGVTYXZlOiBmdW5jdGlvbiBoYW5kbGVTYXZlKCkgewogICAgICB2YXIgX3RoaXMxMSA9IHRoaXM7CiAgICAgIC8vIOiOt+WPluaJgOacieWIhue7hOeahOmAieS4reiKgueCuQogICAgICAvLyBsZXQgYWxsQ2hlY2tlZE5vZGVzID0gW10KICAgICAgLy8gbGV0IGdyb3VwZWREZXRhaWxzID0gW10KICAgICAgLy8KICAgICAgLy8gLy8g5aaC5p6c5piv5aSa5aSp5beh5qOA6aKR546H77yI5q+P5Lik5aSp44CB5q+P5ZGo44CB5q+P5pyI562J77yJCiAgICAgIC8vIGlmIChbJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3J10uaW5jbHVkZXModGhpcy5hZGRFZGl0Rm9ybS5mcmVxdWVuY3kpKSB7CiAgICAgIC8vICAgLy8g6YGN5Y6G5YiG57uE5pWw5o2u77yM5Li65q+P5Liq5YiG57uE5re75YqgcGF0cm9sQmF0Y2gKICAgICAgLy8gICB0aGlzLmdyb3VwZWRJbnNwZWN0aW9uUG9pbnRzLmZvckVhY2goKGdyb3VwLCBpbmRleCkgPT4gewogICAgICAvLyAgICAgZ3JvdXAuZm9yRWFjaChwYXRyb2xJZCA9PiB7CiAgICAgIC8vICAgICAgIGdyb3VwZWREZXRhaWxzLnB1c2goewogICAgICAvLyAgICAgICAgIHBhdHJvbElkLAogICAgICAvLyAgICAgICAgIHBhdHJvbEJhdGNoOiBpbmRleCArIDEgLy8g5om55qyh5LuOMeW8gOWniwogICAgICAvLyAgICAgICB9KQogICAgICAvLyAgICAgfSkKICAgICAgLy8gICB9KQogICAgICAvLyAgIGFsbENoZWNrZWROb2RlcyA9IGdyb3VwZWREZXRhaWxzLm1hcChpdGVtID0+IGl0ZW0ucGF0cm9sSWQpCiAgICAgIC8vIH0gZWxzZSB7CiAgICAgIC8vICAgLy8g5Y2V5aSp6aKR546H77yM5om55qyh5Li6MQogICAgICAvLyAgIGNvbnN0IGNoZWNrZWRLZXlzID0gdGhpcy4kcmVmcy5hZGRFZGl0VHJlZT8uZ2V0Q2hlY2tlZEtleXMoKSB8fCBbXQogICAgICAvLyAgIGdyb3VwZWREZXRhaWxzID0gY2hlY2tlZEtleXMubWFwKHBhdHJvbElkID0+ICh7CiAgICAgIC8vICAgICBwYXRyb2xJZCwKICAgICAgLy8gICAgIHBhdHJvbEJhdGNoOiAxCiAgICAgIC8vICAgfSkpCiAgICAgIC8vICAgYWxsQ2hlY2tlZE5vZGVzID0gY2hlY2tlZEtleXMKICAgICAgLy8gfQogICAgICAvLyAvLyDlpoLmnpzmmK/mr4/lkajmiJbmr4/mnIjvvIzpnIDopoHlkIjlubbmiYDmnInliIbnu4TnmoTpgInkuK3oioLngrkKICAgICAgLy8gLy8gaWYgKFsnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnXS5pbmNsdWRlcyh0aGlzLmFkZEVkaXRGb3JtLmZyZXF1ZW5jeSkpIHsKICAgICAgLy8gLy8gICBhbGxDaGVja2VkTm9kZXMgPSB0aGlzLmdyb3VwZWRJbnNwZWN0aW9uUG9pbnRzLmZsYXQoKQogICAgICAvLyAvLyB9IGVsc2UgewogICAgICAvLyAvLyAgIGFsbENoZWNrZWROb2RlcyA9IHRoaXMuJHJlZnMuYWRkRWRpdFRyZWU/LmdldENoZWNrZWRLZXlzKCkgfHwgW10KICAgICAgLy8gLy8gfQogICAgICAvLyAvLyDojrflj5bmiYDmnInliIbnu4TnmoTpgInkuK3oioLngrkKICAgICAgLy8gLy8gY29uc3QgYWxsQ2hlY2tlZE5vZGUgPSB0aGlzLmdyb3VwZWRJbnNwZWN0aW9uUG9pbnRzLmZsYXQoKSB8fCB0aGlzLiRyZWZzLmFkZEVkaXRUcmVlPy5nZXRDaGVja2VkS2V5cygpIHx8IFtdCiAgICAgIC8vCiAgICAgIC8vIC8vIOWcqOmqjOivgeWJjeabtOaWsHBsYW5EZXRhaWxzCiAgICAgIC8vIHRoaXMuYWRkRWRpdEZvcm0ucGxhbkRldGFpbHMgPSBhbGxDaGVja2VkTm9kZXMKICAgICAgdGhpcy4kcmVmcy5hZGRFZGl0Rm9ybS52YWxpZGF0ZSgvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU3KHZhbGlkLCBvYmplY3QpIHsKICAgICAgICAgIHZhciBfdGhpczExJGFkZEVkaXRGb3JtLCBfdGhpczExJGFkZEVkaXRGb3JtJHMsIHN0YXJ0UGF0cm9sSWQsIF90aGlzMTEkYWRkRWRpdEZvcm0kZSwgZW5kUGF0cm9sSWQsIF90aGlzMTEkYWRkRWRpdEZvcm0kciwgcm9hZElkLCBfdGhpczExJGFkZEVkaXRGb3JtJHMyLCBzdGFydFBhdHJvbE5hbWUsIF90aGlzMTEkYWRkRWRpdEZvcm0kZTIsIGVuZFBhdHJvbE5hbWUsIF90aGlzMTEkYWRkRWRpdEZvcm0kcCwgcGxhbkRldGFpbHMsIF90aGlzMTEkYWRkRWRpdEZvcm0kcDIsIF90aGlzMTEkYWRkRWRpdEZvcm0kcDMsIF90aGlzMTEkYWRkRWRpdEZvcm0kcDQsIF90aGlzMTEkYWRkRWRpdEZvcm0kcDUsIHBsYW5TdGFydERhdGUsIF90aGlzMTEkYWRkRWRpdEZvcm0kcDYsIHBsYW5FbmREYXRlLCBfdGhpczExJGFkZEVkaXRGb3JtJHQsIHRpbWUsIF90aGlzMTEkYWRkRWRpdEZvcm0kcDcsIHBsYW5JbnRlcnZhbCwgYWRkRWRpdEZvcm0sIHJvYWREYXRhLCBhbG9uZ1JvdXRlSW5mb0RhdGEsIF95aWVsZCR0YWJsZUFkZEVkaXQsIHN0YXRlLCBtZXNzYWdlOwogICAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU3JChfY29udGV4dDcpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQ3LnByZXYgPSBfY29udGV4dDcubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIGlmICh2YWxpZCkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDcubmV4dCA9IDQ7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgX3RoaXMxMS4kbWVzc2FnZS53YXJuaW5nKCJcdTY3MDkiLmNvbmNhdChPYmplY3Qua2V5cyhvYmplY3QpLmxlbmd0aCwgIlx1NEUyQVx1NUI1N1x1NkJCNVx1NjcyQVx1OTAxQVx1OEZDN1x1NjgyMVx1OUE4Q1x1RkYwQ1x1OEJGN1x1NkI2M1x1Nzg2RVx1NTg2Qlx1NTE5OVx1ODg2OFx1NTM1NVx1NTE4NVx1NUJCOVx1MzAwMiIpKTsKICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gMTc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBfdGhpczExLnNhdmVMb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgIF90aGlzMTEkYWRkRWRpdEZvcm0gPSBfdGhpczExLmFkZEVkaXRGb3JtLCBfdGhpczExJGFkZEVkaXRGb3JtJHMgPSBfdGhpczExJGFkZEVkaXRGb3JtLnN0YXJ0UGF0cm9sSWQsIHN0YXJ0UGF0cm9sSWQgPSBfdGhpczExJGFkZEVkaXRGb3JtJHMgPT09IHZvaWQgMCA/ICcnIDogX3RoaXMxMSRhZGRFZGl0Rm9ybSRzLCBfdGhpczExJGFkZEVkaXRGb3JtJGUgPSBfdGhpczExJGFkZEVkaXRGb3JtLmVuZFBhdHJvbElkLCBlbmRQYXRyb2xJZCA9IF90aGlzMTEkYWRkRWRpdEZvcm0kZSA9PT0gdm9pZCAwID8gJycgOiBfdGhpczExJGFkZEVkaXRGb3JtJGUsIF90aGlzMTEkYWRkRWRpdEZvcm0kciA9IF90aGlzMTEkYWRkRWRpdEZvcm0ucm9hZElkLCByb2FkSWQgPSBfdGhpczExJGFkZEVkaXRGb3JtJHIgPT09IHZvaWQgMCA/ICcnIDogX3RoaXMxMSRhZGRFZGl0Rm9ybSRyLCBfdGhpczExJGFkZEVkaXRGb3JtJHMyID0gX3RoaXMxMSRhZGRFZGl0Rm9ybS5zdGFydFBhdHJvbE5hbWUsIHN0YXJ0UGF0cm9sTmFtZSA9IF90aGlzMTEkYWRkRWRpdEZvcm0kczIgPT09IHZvaWQgMCA/ICcnIDogX3RoaXMxMSRhZGRFZGl0Rm9ybSRzMiwgX3RoaXMxMSRhZGRFZGl0Rm9ybSRlMiA9IF90aGlzMTEkYWRkRWRpdEZvcm0uZW5kUGF0cm9sTmFtZSwgZW5kUGF0cm9sTmFtZSA9IF90aGlzMTEkYWRkRWRpdEZvcm0kZTIgPT09IHZvaWQgMCA/ICcnIDogX3RoaXMxMSRhZGRFZGl0Rm9ybSRlMiwgX3RoaXMxMSRhZGRFZGl0Rm9ybSRwID0gX3RoaXMxMSRhZGRFZGl0Rm9ybS5wbGFuRGV0YWlscywgcGxhbkRldGFpbHMgPSBfdGhpczExJGFkZEVkaXRGb3JtJHAgPT09IHZvaWQgMCA/IFtdIDogX3RoaXMxMSRhZGRFZGl0Rm9ybSRwLCBfdGhpczExJGFkZEVkaXRGb3JtJHAyID0gX3RoaXMxMSRhZGRFZGl0Rm9ybS5wbGFuU3RhcnRFbmREYXRlLCBfdGhpczExJGFkZEVkaXRGb3JtJHAzID0gX3RoaXMxMSRhZGRFZGl0Rm9ybSRwMiA9PT0gdm9pZCAwID8gW10gOiBfdGhpczExJGFkZEVkaXRGb3JtJHAyLCBfdGhpczExJGFkZEVkaXRGb3JtJHA0ID0gX3NsaWNlZFRvQXJyYXkoX3RoaXMxMSRhZGRFZGl0Rm9ybSRwMywgMiksIF90aGlzMTEkYWRkRWRpdEZvcm0kcDUgPSBfdGhpczExJGFkZEVkaXRGb3JtJHA0WzBdLCBwbGFuU3RhcnREYXRlID0gX3RoaXMxMSRhZGRFZGl0Rm9ybSRwNSA9PT0gdm9pZCAwID8gJycgOiBfdGhpczExJGFkZEVkaXRGb3JtJHA1LCBfdGhpczExJGFkZEVkaXRGb3JtJHA2ID0gX3RoaXMxMSRhZGRFZGl0Rm9ybSRwNFsxXSwgcGxhbkVuZERhdGUgPSBfdGhpczExJGFkZEVkaXRGb3JtJHA2ID09PSB2b2lkIDAgPyAnJyA6IF90aGlzMTEkYWRkRWRpdEZvcm0kcDYsIF90aGlzMTEkYWRkRWRpdEZvcm0kdCA9IF90aGlzMTEkYWRkRWRpdEZvcm0udGltZSwgdGltZSA9IF90aGlzMTEkYWRkRWRpdEZvcm0kdCA9PT0gdm9pZCAwID8gW10gOiBfdGhpczExJGFkZEVkaXRGb3JtJHQsIF90aGlzMTEkYWRkRWRpdEZvcm0kcDcgPSBfdGhpczExJGFkZEVkaXRGb3JtLnBsYW5JbnRlcnZhbCwgcGxhbkludGVydmFsID0gX3RoaXMxMSRhZGRFZGl0Rm9ybSRwNyA9PT0gdm9pZCAwID8gJycgOiBfdGhpczExJGFkZEVkaXRGb3JtJHA3LCBhZGRFZGl0Rm9ybSA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpczExJGFkZEVkaXRGb3JtLCBfZXhjbHVkZWQyKTsgLy8g57uT5p6E5Ye66Lev5q615Y+K5rK/6Lev6K6+5pa95pWw5o2uCiAgICAgICAgICAgICAgICByb2FkRGF0YSA9IF90aGlzMTEucm9hZERhdGEsIGFsb25nUm91dGVJbmZvRGF0YSA9IF90aGlzMTEuYWxvbmdSb3V0ZUluZm9EYXRhOwogICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAqIOWkhOeQhuaVsOaNrg0KICAgICAgICAgICAgICAgICogZGljdGlvbmFyeUVzY2FwZeS4uui9rOS5ieWHveaVsA0KICAgICAgICAgICAgICAgICogKi8KICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5wcmV2ID0gNzsKICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5uZXh0ID0gMTA7CiAgICAgICAgICAgICAgICByZXR1cm4gdGFibGVBZGRFZGl0KF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYWRkRWRpdEZvcm0pLCB7fSwgewogICAgICAgICAgICAgICAgICBzdGFydFBhdHJvbElkOiBzdGFydFBhdHJvbElkLAogICAgICAgICAgICAgICAgICBlbmRQYXRyb2xJZDogZW5kUGF0cm9sSWQsCiAgICAgICAgICAgICAgICAgIHJvYWRJZDogcm9hZElkLAogICAgICAgICAgICAgICAgICAvLyByb2FkTmFtZTogcm9hZEluZm8ubmFtZSwKICAgICAgICAgICAgICAgICAgLy8gcm9hZENvZGU6IHJvYWRJbmZvLmNvZGUsCiAgICAgICAgICAgICAgICAgIHN0YXJ0UGF0cm9sTmFtZTogZGljdGlvbmFyeUVzY2FwZShhbG9uZ1JvdXRlSW5mb0RhdGEsIHN0YXJ0UGF0cm9sSWQsIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZUtleTogJ2lkJwogICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgZW5kUGF0cm9sTmFtZTogZGljdGlvbmFyeUVzY2FwZShhbG9uZ1JvdXRlSW5mb0RhdGEsIGVuZFBhdHJvbElkLCB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVLZXk6ICdpZCcKICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgIC8vIHRlYW1GdWxsSWQsCiAgICAgICAgICAgICAgICAgIC8vIHRlYW1OYW1lLAogICAgICAgICAgICAgICAgICAvLyBwbGFuRGV0YWlsczogcGxhbkRldGFpbHMubWFwKHBhdHJvbElkID0+ICh7cGF0cm9sSWR9KSksCiAgICAgICAgICAgICAgICAgIHBsYW5EZXRhaWxzOiBwbGFuRGV0YWlscy5tYXAoZnVuY3Rpb24gKHBhdHJvbElkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgIHBhdHJvbElkOiBwYXRyb2xJZAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICBwbGFuU3RhcnREYXRlOiBwbGFuU3RhcnREYXRlLAogICAgICAgICAgICAgICAgICBwbGFuRW5kRGF0ZTogcGxhbkVuZERhdGUsCiAgICAgICAgICAgICAgICAgIHBsYW5JbnRlcnZhbDogdGltZS5sZW5ndGggPyAiIi5jb25jYXQodGltZSwgInwiKS5jb25jYXQocGxhbkludGVydmFsKSA6IHBsYW5JbnRlcnZhbAogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICBfeWllbGQkdGFibGVBZGRFZGl0ID0gX2NvbnRleHQ3LnNlbnQ7CiAgICAgICAgICAgICAgICBzdGF0ZSA9IF95aWVsZCR0YWJsZUFkZEVkaXQuc3RhdGU7CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gX3lpZWxkJHRhYmxlQWRkRWRpdC5tZXNzYWdlOwogICAgICAgICAgICAgICAgaWYgKHN0YXRlKSB7CiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBfdGhpczExLmlkID8gJ+e8lui+kScgOiAn5paw5aKeJzsKICAgICAgICAgICAgICAgICAgX3RoaXMxMS4kbWVzc2FnZS5zdWNjZXNzKCJcdTVERTFcdTY4QzBcdThCQTFcdTUyMTIiLmNvbmNhdChtZXNzYWdlLCAiXHU2MjEwXHU1MjlGIikpOwogICAgICAgICAgICAgICAgICBfdGhpczExLmNoYW5nZVBhZ2UoJ1RhYmxlUGFnZScsIF90aGlzMTEuaWQgPyAnZWRpdCcgOiAnYWRkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgIF9jb250ZXh0Ny5wcmV2ID0gMTQ7CiAgICAgICAgICAgICAgICBfdGhpczExLnNhdmVMb2FkaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ3LmZpbmlzaCgxNCk7CiAgICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Ny5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWU3LCBudWxsLCBbWzcsLCAxNCwgMTddXSk7CiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gsIF94MikgewogICAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9OwogICAgICB9KCkpOwogICAgfSwKICAgIC8vIOWxleekuuW8ueWxggogICAgc2hvd0RpYWxvZzogZnVuY3Rpb24gc2hvd0RpYWxvZyhkaWFsb2dOYW1lKSB7CiAgICAgIGlmICghZGlhbG9nTmFtZSkgcmV0dXJuOwogICAgICB0aGlzW2RpYWxvZ05hbWUgKyAnRGlhbG9nJ10gPSB0cnVlOwogICAgfSwKICAgIC8vIOaUueWPmOmhtemdogogICAgY2hhbmdlUGFnZTogZnVuY3Rpb24gY2hhbmdlUGFnZSgpIHsKICAgICAgdmFyIHBhZ2VOYW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJzsKICAgICAgdmFyIHR5cGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICcnOwogICAgICBpZiAoIXBhZ2VOYW1lKSByZXR1cm47CiAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZVBhZ2UnLCBwYWdlTmFtZSwgZnVuY3Rpb24gKF8pIHsKICAgICAgICBQdWJTdWIucHVibGlzaChwYWdlTmFtZSwgewogICAgICAgICAgdHlwZTogdHlwZQogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0sCiAgICBtb21lbnQ6IG1vbWVudCwKICAgIGdldERpY3Rpb25hcnlCeUNvZGU6IGdldERpY3Rpb25hcnlCeUNvZGUKICB9LAogIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7CiAgICAvLyDlnKjnu4Tku7bplIDmr4HkuYvliY0g5riF6Zmk6K6i6ZiF5raI5oGvCiAgICBQdWJTdWIudW5zdWJzY3JpYmUodGhpcy5wdWJTdWIpOwogIH0KfTs="},null]}