{"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\\dataTemplate\\TemplateDynamicView.vue?vue&type=script&lang=js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\dataTemplate\\TemplateDynamicView.vue","mtime":1733309211704},{"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:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXkuanMiOwppbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcmVnZW5lcmF0b3JSdW50aW1lLmpzIjsKaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2RhdGFTaGFyZS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yLmpzIjsKaW1wb3J0IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2RhdGFTaGFyZS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyLmpzIjsKaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAiRDovamVua2lucy93b3Jrc3BhY2UvZGF0YVNoYXJlLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmpvaW4uanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmVkdWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc29ydC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWUuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5jb25zdHJ1Y3Rvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLmZpbHRlci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLmZvci1lYWNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IubWFwLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IucmVkdWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tZml4ZWQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNlYXJjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLnNlbGYuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIudXJsLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLnVybC50by1qc29uLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmRlbGV0ZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5oYXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuc2l6ZS5qcyI7Ci8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCgppbXBvcnQgeyBMb2FkaW5nIH0gZnJvbSAnZWxlbWVudC11aSc7CmltcG9ydCBIdENoZWNrYm94IGZyb20gJ0AvY29tcG9uZW50cy9jb250cm9sL0h0Q2hlY2tib3gudnVlJzsKaW1wb3J0IEh0RGlhbG9nIGZyb20gJ0AvY29tcG9uZW50cy9jb250cm9sL0h0RGlhbG9nLnZ1ZSc7CmltcG9ydCBIdERpYWxvZ0J0biBmcm9tICdAL2NvbXBvbmVudHMvY29udHJvbC9odERpYWxvZ0J0bi52dWUnOwppbXBvcnQgRWlwU2VsZWN0IGZyb20gJ0AvY29tcG9uZW50cy9laXBDb250cm9sL0VpcFNlbGVjdC52dWUnOwppbXBvcnQgVlJ1bnRpbWVUZW1wbGF0ZSBmcm9tICd2LXJ1bnRpbWUtdGVtcGxhdGUnOwppbXBvcnQgdXRpbHMgZnJvbSAnQC91dGlscy5qcyc7CmltcG9ydCB7IEJhc2U2NCB9IGZyb20gJ2pzLWJhc2U2NCc7CmltcG9ydCBWdWUgZnJvbSAndnVlJzsKaW1wb3J0IFFSQ29kZSBmcm9tICdxcmNvZGUnOwppbXBvcnQgcmVxIGZyb20gJ0AvcmVxdWVzdC5qcyc7CmltcG9ydCBmb3JtIGZyb20gJ0AvYXBpL2Zvcm0uanMnOwppbXBvcnQgZGlhbG9nIGZyb20gJ0AvYXBpL2RpYWxvZ0FwaS5qcyc7CnZhciBUZW1wbGF0ZUJhdGNoVXBkYXRlRGlhbG9nID0gZnVuY3Rpb24gVGVtcGxhdGVCYXRjaFVwZGF0ZURpYWxvZygpIHsKICByZXR1cm4gaW1wb3J0KCdAL2NvbXBvbmVudHMvZGlhbG9nL1RlbXBsYXRlQmF0Y2hVcGRhdGVEaWFsb2cudnVlJyk7Cn07CmV4cG9ydCBkZWZhdWx0IHsKICBuYW1lOiAndGVtcGxhdGUtZHluYW1pYy12aWV3JywKICBwcm9wczogewogICAgdGVtcGxhdGVLZXk6IFN0cmluZywKICAgIGh0bWw6IFN0cmluZywKICAgIHRlbXBsYXRlSW5mbzogT2JqZWN0LAogICAgcGFyYW1ldGVycVF1ZXJ5czogU3RyaW5nLAogICAgc2luZ2xlOiB7CiAgICAgIGRlZmF1bHQ6ICd0cnVlJwogICAgfSwKICAgIGRlZktleTogU3RyaW5nLAogICAgdGFza1R5cGU6IHsKICAgICAgZGVmYXVsdDogJycKICAgIH0sCiAgICBkYXRhVmlldzogT2JqZWN0LAogICAgaXNKb2luRmxvdzogewogICAgICBkZWZhdWx0OiBmYWxzZQogICAgfQogIH0sCiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHsKICAgIHJldHVybiB7CiAgICAgIHJlZnJlc2hUaW1lOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgc2hvd0RhdGVWaWV3OiB0cnVlCiAgICB9OwogIH0sCiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHsKICAgIHRoaXMuaW5pdCgpOwogIH0sCiAgd2F0Y2g6IHsKICAgIGh0bWw6IGZ1bmN0aW9uIGh0bWwobmV3VmFsKSB7CiAgICAgIGlmIChuZXdWYWwpIHsKICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgfQogICAgfQogIH0sCiAgbWV0aG9kczogewogICAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHsKICAgICAgVnVlLmNvbXBvbmVudCgnaHQtZGF0YXZpZXctcnVudGltZS10ZW1wbGF0ZScsIHsKICAgICAgICB0ZW1wbGF0ZTogdGhpcy5odG1sLAogICAgICAgIHByb3BzOiB7CiAgICAgICAgICB0ZW1wbGF0ZUtleTogU3RyaW5nLAogICAgICAgICAgdGVtcGxhdGVJbmZvOiBPYmplY3QsCiAgICAgICAgICBzaW5nbGU6IFN0cmluZywKICAgICAgICAgIGRlZktleTogU3RyaW5nLAogICAgICAgICAgdGFza1R5cGU6IHsKICAgICAgICAgICAgZGVmYXVsdDogJycKICAgICAgICAgIH0sCiAgICAgICAgICBkYXRhVmlldzogT2JqZWN0LAogICAgICAgICAgaXNKb2luRmxvdzogewogICAgICAgICAgICBkZWZhdWx0OiBmYWxzZQogICAgICAgICAgfSwKICAgICAgICAgIHBhcmFtZXRlcnFRdWVyeXM6IFN0cmluZwogICAgICAgIH0sCiAgICAgICAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRyZWVRdWVyeXM6IFtdLAogICAgICAgICAgICBhbGlhc19uZXc6ICdzdGF0ZW1lbnQnLAogICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSwKICAgICAgICAgICAgUVJDb2RldXJsOiAnJywKICAgICAgICAgICAgUVJDb2RlRGlhbG9nOiBmYWxzZSwKICAgICAgICAgICAgaHRtbDogJycsCiAgICAgICAgICAgIHRhYmxlRGF0YTogewogICAgICAgICAgICAgIHNlbGVjdFJvd3M6IFtdLAogICAgICAgICAgICAgIHF1ZXJ5czogJycKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGlhbG9nRXhwb3J0VmlzaWJsZTogZmFsc2UsCiAgICAgICAgICAgIGV4cG9ydERhdGE6IHsKICAgICAgICAgICAgICBnZXRUeXBlOiAnYWxsJywKICAgICAgICAgICAgICBleHBGaWVsZDogW10KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGlzcGxheUZpZWxkczogW10sCiAgICAgICAgICAgIGV4cG9ydFNlbGxlY3Rpb246IFtdLAogICAgICAgICAgICBzZWFyY2hGb3JtOiB7CiAgICAgICAgICAgICAgRl94YjogJycsCiAgICAgICAgICAgICAgRl94bTogJycKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcXVlcnlGb3JtOiB7CiAgICAgICAgICAgICAgcXVlcnlEYXRhOiAnJwogICAgICAgICAgICB9LAogICAgICAgICAgICBmb3JtVHlwZTogZmFsc2UsCiAgICAgICAgICAgIGxhYmVsUG9zaXRpb246ICdsZWZ0JywKICAgICAgICAgICAgaW5jb25zOiAnZWwtaWNvbi1hcnJvdy1kb3duJywKICAgICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAgIGZ1bGxzY3JlZW46IHRydWUsCiAgICAgICAgICAgICAgbG9jazogdHJ1ZQogICAgICAgICAgICB9LAogICAgICAgICAgICByb3dUZW1wbGF0ZUlkOiBudWxsLAogICAgICAgICAgICByb3dJZDogbnVsbCwKICAgICAgICAgICAgUVJDb2RlU2hvdzogdHJ1ZSwKICAgICAgICAgICAgUVJDb2RlRGVzYzogW10sCiAgICAgICAgICAgIHRyZWU6IFtdLAogICAgICAgICAgICBjdXN0b21EaWFsb2c6IFtdLAogICAgICAgICAgICB0YWJsZUhlaWdodDogMC42ODUgKiB3aW5kb3cuaW5uZXJIZWlnaHQsCiAgICAgICAgICAgIGRpYWxvZ1N1YlZpc2libGU6IGZhbHNlLAogICAgICAgICAgICB0YWJzOiBbXSwKICAgICAgICAgICAgZW50czogW10sCiAgICAgICAgICAgIG1vZGlmeVJlY29yZDogewogICAgICAgICAgICAgIHBhZ2luYXRpb246IHsKICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiB7CiAgICAgICAgICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICAgICAgICAgICAgdG90YWw6IDAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlY29yZExpc3Q6IFtdLAogICAgICAgICAgICByZWNvcmRSZWZJZDogJycsCiAgICAgICAgICAgIGRpYWxvZ1JlY29yZFZpc2libGU6IGZhbHNlLAogICAgICAgICAgICByZWNvcmRUYWJsZUxvYWRpbmc6IGZhbHNlLAogICAgICAgICAgICBtb2RpZnlEZXRhaWxEaWFsb2dWaXNpYmxlOiBmYWxzZSwKICAgICAgICAgICAgY3VycmVudE1vZGlmeToge30sCiAgICAgICAgICAgIHJlZklkOiAnJywKICAgICAgICAgICAgcXVlcnlTdWJWYWx1ZTogJycsCiAgICAgICAgICAgIHN1YlRhYmxlTG9hZGluZzogZmFsc2UsCiAgICAgICAgICAgIGN1cnJlbnRUYWJOYW1lOiAnJywKICAgICAgICAgICAgY3VycmVudFRhYjoge30sCiAgICAgICAgICAgIGV4cG9ydFR5cGU6ICdtYWluJywKICAgICAgICAgICAgc3ViRGlzcGxheUZpZWxkczogW10sCiAgICAgICAgICAgIHN1YkRpc3BsYXlGaWVsZHNMaXN0OiBbXSwKICAgICAgICAgICAgbm90UHJpbnQ6IGZhbHNlLAogICAgICAgICAgICBkaXNwbGF5RmllbGQ6IHt9LAogICAgICAgICAgICB0cmVlTGlzdDogW10sCiAgICAgICAgICAgIHJvd3M6IFtdLAogICAgICAgICAgICBwYWdpbmF0aW9uOiB7CiAgICAgICAgICAgICAgcGFnZTogMSwKICAgICAgICAgICAgICBwYWdlU2l6ZTogMTAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcGFnaW5hdGlvbkxheW91dDogJ3RvdGFsLCBzaXplcywgcHJldiwgcGFnZXIsIG5leHQsIGp1bXBlcicsCiAgICAgICAgICAgIHRvdGFsOiAwLAogICAgICAgICAgICBwZXJtaXNzaW9uOiB7CiAgICAgICAgICAgICAgcHJpbnQ6IHRydWUsCiAgICAgICAgICAgICAgYWRkOiB0cnVlLAogICAgICAgICAgICAgIGRlbDogdHJ1ZSwKICAgICAgICAgICAgICBleHBvcnQ6IHRydWUsCiAgICAgICAgICAgICAgZWRpdDogdHJ1ZSwKICAgICAgICAgICAgICBoaWRkZW46IGZhbHNlCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNob3dSaWdodE1lbnU6IHRydWUsCiAgICAgICAgICAgIGxpc3RTZWxlY3RhYmxlOiB0cnVlLAogICAgICAgICAgICBmaWx0ZXJzOiB7fSwKICAgICAgICAgICAgc29ydGVyOiBudWxsLAogICAgICAgICAgICBkaWFsb2dTdW5WaXNpYmxlOiBmYWxzZSwKICAgICAgICAgICAgLy/lrZnooajlr7nor53moYYKICAgICAgICAgICAgc3VuVGFiczogW10sCiAgICAgICAgICAgIC8v5a2Z6KGo5pWw5o2uCiAgICAgICAgICAgIHF1ZXJ5U3VuVmFsdWU6ICcnLAogICAgICAgICAgICBvcGVyYXRlQ29sV2lkdGg6ICcyNDAnLAogICAgICAgICAgICBzdW1tYXJ5RmllbGRzOiBbXSwKICAgICAgICAgICAgZGlhbG9nVmlzaWJsZTogZmFsc2UsCiAgICAgICAgICAgIHBhZ2VSZXN1bHQ6IHsKICAgICAgICAgICAgICBwYWdlOiAxLAogICAgICAgICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICAgICAgICB0b3RhbDogMAogICAgICAgICAgICB9LAogICAgICAgICAgICBsb2dEYXRhOiBbXSwKICAgICAgICAgICAgbm90U29ydGFibGVGaWVsZHM6IFsnYnBtX3N0YXR1c18nLCAnYnBtX3Byb2NfaW5zdF9pZF8nLCAnYnBtX3N1YmplY3RfJywgJ2JwbV9wcm9jX2RlZl9uYW1lXycsICdicG1fY3JlYXRlX3RpbWVfJywgJ2JwbV9lbmRfdGltZV8nLCAnYnBtX2lzX2ZvcmJpZGRlbl8nLCAnYnBtX2NyZWF0b3JfJ10sCiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZUxpc3Q6IFtdLAogICAgICAgICAgICAvL+aJuemHj+abtOaWsOaVsOaNrgogICAgICAgICAgICBpZ25vcmVkQWxpYXM6IFsnYXBwQ2VudGVyRnJvbnQnXSwKICAgICAgICAgICAgUVJDb2RlUGF0dGVybjogdHJ1ZSwKICAgICAgICAgICAgUVJDb2RlVHlwZTogJycsCiAgICAgICAgICAgIGlzTW9iaWxlOiBmYWxzZSwKICAgICAgICAgICAgYWN0aXZlTmFtZXM6IFsnMSddLAogICAgICAgICAgICBzd2l0Y2hNYXA6IHt9LAogICAgICAgICAgICBmaWx0ZXJNYXA6IHt9CiAgICAgICAgICB9OwogICAgICAgIH0sCiAgICAgICAgY29tcG9uZW50czogewogICAgICAgICAgVlJ1bnRpbWVUZW1wbGF0ZTogVlJ1bnRpbWVUZW1wbGF0ZSwKICAgICAgICAgIEh0Q2hlY2tib3g6IEh0Q2hlY2tib3gsCiAgICAgICAgICBIdERpYWxvZzogSHREaWFsb2csCiAgICAgICAgICBIdERpYWxvZ0J0bjogSHREaWFsb2dCdG4sCiAgICAgICAgICBUZW1wbGF0ZUJhdGNoVXBkYXRlRGlhbG9nOiBUZW1wbGF0ZUJhdGNoVXBkYXRlRGlhbG9nLAogICAgICAgICAgRWlwU2VsZWN0OiBFaXBTZWxlY3QKICAgICAgICB9LAogICAgICAgIHdhdGNoOiB7CiAgICAgICAgICBlbnRzOiB7CiAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIobmV3VmFsLCBvbGRWYWx1ZSkgewogICAgICAgICAgICAgIGlmIChuZXdWYWwgJiYgbmV3VmFsLmxlbmd0aCA+PSAxICYmIG5ld1ZhbCAhPSBvbGRWYWx1ZSkgewogICAgICAgICAgICAgICAgdGhpcy5nZXRTdWJEYXRhKHRoaXMsIHRoaXMucmVmSWQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGVlcDogdHJ1ZSwKICAgICAgICAgICAgaW1tZWRpYXRlOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgdGVtcGxhdGVJbmZvOiB7CiAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIobmV3VmFsLCBvbGRWYWwpIHsKICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAgIGlmIChuZXdWYWwgJiYgbmV3VmFsLmlkKSB7CiAgICAgICAgICAgICAgICB2YXIgbG9hZGluZyA9IHRoaXMuJGxvYWRpbmcodGhpcy5vcHRpb25zKTsKICAgICAgICAgICAgICAgIHZhciBfbWUgPSB0aGlzOwogICAgICAgICAgICAgICAgX21lLnRlbXBsYXRlSW5mbyA9IG5ld1ZhbDsKICAgICAgICAgICAgICAgIGlmIChfbWUudGVtcGxhdGVJbmZvLmRpc3BsYXlGaWVsZCkgewogICAgICAgICAgICAgICAgICB2YXIgZGlzcGxheUZpZWxkID0gdXRpbHMucGFyc2VUb0pzb24oX21lLnRlbXBsYXRlSW5mby5kaXNwbGF5RmllbGQpOwogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BsYXlGaWVsZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5RmllbGRbaV0udHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGRzLnB1c2goZGlzcGxheUZpZWxkW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChfbWUudGVtcGxhdGVJbmZvLmNvbmRpdGlvbkZpZWxkKSB7CiAgICAgICAgICAgICAgICAgIHZhciBjb25kaXRpb25GaWVsZCA9IHV0aWxzLnBhcnNlVG9Kc29uKF9tZS50ZW1wbGF0ZUluZm8uY29uZGl0aW9uRmllbGQpOwogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmRpdGlvbkZpZWxkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkTmFtZSA9ICdGXycgKyBjb25kaXRpb25GaWVsZFtpXS5uYW1lOwogICAgICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLnNlYXJjaEZvcm0sIGZpZWxkTmFtZSwgJycpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0gewogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUlkOiBfbWUudGVtcGxhdGVJbmZvLmlkCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIHBhZ2VCZWFuID0gewogICAgICAgICAgICAgICAgICBwYWdlQmVhbjogewogICAgICAgICAgICAgICAgICAgIHBhZ2U6ICcxJywKICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogbmV3VmFsLnBhZ2VTaXplLAogICAgICAgICAgICAgICAgICAgIHNob3dUb3RhbDogJ3RydWUnCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07IC8v5Yid5qyh5Yqg6L296buY6K6kcGFnZUJlYW4KICAgICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uID0gcGFnZUJlYW47CiAgICAgICAgICAgICAgICBpZiAoX21lLmlzSm9pbkZsb3cpIHsKICAgICAgICAgICAgICAgICAgcGFyYW1zLmlzSm9pbkZsb3cgPSB0cnVlOwogICAgICAgICAgICAgICAgICBwYXJhbXMudGFza1R5cGUgPSBfbWUudGFza1R5cGU7CiAgICAgICAgICAgICAgICAgIHBhcmFtcy5kZWZLZXkgPSBfbWUuZGVmS2V5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKF9tZS5kYXRhVmlldykgewogICAgICAgICAgICAgICAgICBfbWUuaGFuZGVsQmluZEZpbGVkVmFsdWEoKTsKICAgICAgICAgICAgICAgICAgLy/lhbPogZTmn6Xor6LlrZfmrrUKICAgICAgICAgICAgICAgICAgaWYgKF9tZS5kYXRhVmlldy5zZWxlY3RMaXN0ICYmIF9tZS5kYXRhVmlldy5zZWxlY3RMaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBwYXJhbXMuc2VsZWN0TGlzdCA9IF9tZS5kYXRhVmlldy5zZWxlY3RMaXN0OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHBhcmFtcy5yZWZJZFZhbHVlID0gX21lLmRhdGFWaWV3LnJlZklkVmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJhbWV0ZXJxUXVlcnlzKSB7CiAgICAgICAgICAgICAgICAgIHZhciBxdWVyeXMgPSBKU09OLnBhcnNlKEJhc2U2NC5kZWNvZGUoZGVjb2RlVVJJQ29tcG9uZW50KHRoaXMucGFyYW1ldGVycVF1ZXJ5cykpKTsKICAgICAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzID0gcXVlcnlzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGRlZmF1bHRRdWVyeSA9IHRoaXMuYnVpbGREZWZhdWx0UXVlcnlzKCk7CiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFF1ZXJ5Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cykgewogICAgICAgICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cy5jb25jYXQoZGVmYXVsdFF1ZXJ5KTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPSBkZWZhdWx0UXVlcnk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8v5aaC5p6c5pyJ6K6+572u6buY6K6k5o6S5bqPLOS8mOWFiOS9v+eUqOm7mOiupOaOkuW6jwogICAgICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvLnNvcnRGaWVsZCkgewogICAgICAgICAgICAgICAgICB2YXIgc29ydEZpZWxkID0gSlNPTi5wYXJzZSh0aGlzLnRlbXBsYXRlSW5mby5zb3J0RmllbGQpOwogICAgICAgICAgICAgICAgICB2YXIgc29ydGVyID0gW107CiAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgc29ydEZpZWxkLmxlbmd0aDsgeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgc29ydGVyLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHNvcnRGaWVsZFt4XS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBzb3J0RmllbGRbeF0uc29ydAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnNvcnRlciA9IHNvcnRlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vZ2V0QnBtVGVtcGxhdGVCeVBhZ2luYXRpb24nLCBwYXJhbXMpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc18ucm93cyA9IHJlc3BvbnNlLmRhdGEucm93czsKICAgICAgICAgICAgICAgICAgICB0aGlzXy50b3RhbCA9IHJlc3BvbnNlLmRhdGEudG90YWw7CiAgICAgICAgICAgICAgICAgICAgdGhpc18ucGFnaW5hdGlvbi5wYWdlID0gcmVzcG9uc2UuZGF0YS5wYWdlOwogICAgICAgICAgICAgICAgICAgIHRoaXNfLnBhZ2luYXRpb24ucGFnZVNpemUgPSByZXNwb25zZS5kYXRhLnBhZ2VTaXplOwogICAgICAgICAgICAgICAgICAgIGxvYWRpbmcuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzXy5pbml0U3dpdGNoU3RhdHVzKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNfLiRlbCAmJiB0aGlzXy4kZWwucXVlcnlTZWxlY3RvcikgewogICAgICAgICAgICAgICAgICAgICAgdmFyIHRvcEJ0bkRvbSA9IHRoaXNfLiRlbC5xdWVyeVNlbGVjdG9yKCdkaXYudG9wX2J0bl9jb2wnKTsKICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9wQnRuRG9tIHx8ICF0b3BCdG5Eb20ucXVlcnlTZWxlY3RvcignaS5lbC1pY29uLWRlbGV0ZScpICYmICF0b3BCdG5Eb20ucXVlcnlTZWxlY3RvcignaS5lbC1pY29uLWVkaXQnKSAmJiAhdG9wQnRuRG9tLnF1ZXJ5U2VsZWN0b3IoJ2kuZWwtaWNvbi1zLWdyaWQnKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5saXN0U2VsZWN0YWJsZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZERvbSA9IHRoaXNfLiRlbC5xdWVyeVNlbGVjdG9yKCd0ZC5yaWdodF9tZW51Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGREb20gfHwgIXRkRG9tLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpICYmIHRkRG9tLnF1ZXJ5U2VsZWN0b3IoJ3N3aXRjaCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18uc2hvd1JpZ2h0TWVudSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBsb2FkaW5nLmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobmV3VmFsLnRyZWVGaWVsZCAmJiBuZXdWYWwudHJlZUZpZWxkICE9PSAne30nKSB7CiAgICAgICAgICAgICAgICAgIHZhciB0cmVlRmllbGQgPSBKU09OLnBhcnNlKG5ld1ZhbC50cmVlRmllbGQpOwogICAgICAgICAgICAgICAgICB0aGlzLmluaXRUcmVlKHRyZWVGaWVsZCk7CiAgICAgICAgICAgICAgICAgIGZvcm0uZ2V0U3ViRW50c0J5Rm9ybUtleSh0aGlzLnRlbXBsYXRlSW5mby5mb3JtS2V5LCBmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgICAgICAgICAgIHJlc3AuZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRGlzcGxheUZpZWxkcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgaXRlbS5hdHRyaWJ1dGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3ViRGlzcGxheUZpZWxkcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBhdHRyLmNvbW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYXR0ci5maWVsZE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogYXR0ci5jb2x1bW5UeXBlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zdWJEaXNwbGF5RmllbGRzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHM6IHN1YkRpc3BsYXlGaWVsZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudDogaXRlbS5jb21tZW50CiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobmV3VmFsLnN1bW1hcnlGaWVsZCkgewogICAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlGaWVsZHMgPSBKU09OLnBhcnNlKG5ld1ZhbC5zdW1tYXJ5RmllbGQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGVlcDogdHJ1ZSwKICAgICAgICAgICAgaW1tZWRpYXRlOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgY3VycmVudFRhYk5hbWU6IGZ1bmN0aW9uIGN1cnJlbnRUYWJOYW1lKG5ld1ZhbCkgewogICAgICAgICAgICBpZiAobmV3VmFsKSB7CiAgICAgICAgICAgICAgdGhpcy5xdWVyeVN1YlZhbHVlID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGNvbXB1dGVkOiB7CiAgICAgICAgICBzaG93RHJhZnRMaXN0OiBmdW5jdGlvbiBzaG93RHJhZnRMaXN0KCkgewogICAgICAgICAgICAvL+WmguaenOW9k+WJjemhtemdouiiq+W1jOWFpWlmcmFtZemHjOmdouS4jeaYvuekuuiNieeovwogICAgICAgICAgICByZXR1cm4gd2luZG93LnNlbGYgPT09IHdpbmRvdy50b3A7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkgewogICAgICAgICAgdGhpcy5oYW5kZWxCaW5kRmlsZWRWYWx1YSgpOwogICAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICAgIHRoaXMuJHJvb3QuJG9uKCdmb3JtLXJlbG9hZC1zdWNjZXNzJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzXy5oYW5kZWxCaW5kRmlsZWRWYWx1YSgpOwogICAgICAgICAgfSk7CiAgICAgICAgICB0aGlzLiRlbWl0KCdhZnRlck1vdW50ZWQnKTsKICAgICAgICB9LAogICAgICAgIG1ldGhvZHM6IHsKICAgICAgICAgIGxvYWREYXRhOiBmdW5jdGlvbiBsb2FkRGF0YShwYXJhbSwgY2IpIHsKICAgICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICAgICAgICAgIHZhciBxdWVyeXMgPSBwYXJhbS5xdWVyeXMgfHwgW107CiAgICAgICAgICAgIHZhciBoYXNEZWZhdWx0UXVlcnkgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5oYW5kZWxCaW5kRmlsZWRWYWx1YSgpOwogICAgICAgICAgICB2YXIgcElEID0gdGhpcy5kYXRhVmlldy5yZWZJZFZhbHVlOwogICAgICAgICAgICBxdWVyeXMuZm9yRWFjaChmdW5jdGlvbiAocSkgewogICAgICAgICAgICAgIGlmIChxLnByb3BlcnR5ID09ICdQSWQnKSB7CiAgICAgICAgICAgICAgICBoYXNEZWZhdWx0UXVlcnkgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmICghaGFzRGVmYXVsdFF1ZXJ5KSB7CiAgICAgICAgICAgICAgcXVlcnlzLnB1c2goewogICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLAogICAgICAgICAgICAgICAgZ3JvdXA6ICdkZWZhbHV0JywKICAgICAgICAgICAgICAgIHByb3BlcnR5OiAnUElkJywKICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJywKICAgICAgICAgICAgICAgIHZhbHVlOiBwSUQKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsCiAgICAgICAgICAgICAgICBncm91cDogJ2RlZmFsdXQnLAogICAgICAgICAgICAgICAgcHJvcGVydHk6ICdib0FsaWFzJywKICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJywKICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGFyYW0ucXVlcnlzID0gcXVlcnlzOwogICAgICAgICAgICByZXEucG9zdCh3aW5kb3cuY29udGV4dC5mb3JtICsgJy9mb3JtL2Zvcm1EYXRhSW1wb3J0TG9nL3YxL2xpc3RKc29uJywgcGFyYW0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBkYXRhLmRhdGE7CiAgICAgICAgICAgICAgX3RoaXMyLmxvZ0RhdGEgPSByZXNwb25zZS5yb3dzOwogICAgICAgICAgICAgIF90aGlzMi5wYWdlUmVzdWx0ID0gewogICAgICAgICAgICAgICAgcGFnZTogcmVzcG9uc2UucGFnZSwKICAgICAgICAgICAgICAgIHBhZ2VTaXplOiByZXNwb25zZS5wYWdlU2l6ZSwKICAgICAgICAgICAgICAgIHRvdGFsOiByZXNwb25zZS50b3RhbAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pLmZpbmFsbHkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHJldHVybiBjYigpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBoYW5kZWxCaW5kRmlsZWRWYWx1YTogZnVuY3Rpb24gaGFuZGVsQmluZEZpbGVkVmFsdWEoKSB7CiAgICAgICAgICAgIC8v5pWw5o2u6KeG5Zu+5o6n5Lu2CiAgICAgICAgICAgIHZhciBfbWUgPSB0aGlzOwogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgewogICAgICAgICAgICAgIHZhciBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzLiRwYXJlbnQuJHBhcmVudC4kcGFyZW50LiRwYXJlbnQpOwogICAgICAgICAgICAgIGlmICghcEluc3RbdGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzXSkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzID0gT2JqZWN0LmtleXMocEluc3QuZGF0YSlbMF07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciByZWZJZFZhbHVlID0gdXRpbHMuZ2V0VmFsdWVCeVBhdGgocEluc3QsICdkYXRhLicgKyB0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgKyAnLmlkXycpOwogICAgICAgICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdmb3JtSW1wb3J0VGVtcFJlZklkJykgJiYgIXJlZklkVmFsdWUpIHsKICAgICAgICAgICAgICAgIHJlZklkVmFsdWUgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdmb3JtSW1wb3J0VGVtcFJlZklkJyk7CiAgICAgICAgICAgICAgfSBlbHNlIGlmICghcmVmSWRWYWx1ZSkgewogICAgICAgICAgICAgICAgLy/lr7zlhaXnmoTml7blgJnmsqHmnInlhbPplK7nmoTlpJbplK7vvIzliJnkuLrlhbboh6rliqjmt7vliqAKICAgICAgICAgICAgICAgIHJlZklkVmFsdWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2Zvcm1JbXBvcnRUZW1wUmVmSWQnLCByZWZJZFZhbHVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgX21lLmRhdGFWaWV3LnJlZklkVmFsdWUgPSByZWZJZFZhbHVlOwogICAgICAgICAgICAgIGlmIChwSW5zdC5wZXJtaXNzaW9uICYmIHBJbnN0LnBlcm1pc3Npb24udGFibGUgJiYgcEluc3QucGVybWlzc2lvbi50YWJsZVt0aGlzLnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzXSkgewogICAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uID0gcEluc3QucGVybWlzc2lvbi50YWJsZVt0aGlzLnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHRoaXMucGVybWlzc2lvbi5oaWRkZW4pIHsKICAgICAgICAgICAgICAgIHRoaXMuJHBhcmVudC5zaG93RGF0ZVZpZXcgPSBmYWxzZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy/lhbPogZTmn6Xor6LlrZfmrrUKICAgICAgICAgICAgICB2YXIgc2VsZWN0TGlzdCA9IHRoaXMuZGF0YVZpZXcuc2VsZWN0TGlzdDsKICAgICAgICAgICAgICBpZiAoc2VsZWN0TGlzdCAmJiBzZWxlY3RMaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0TGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0TGlzdFtpXS5zZWxlY3RGaWVsZCkgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXRoID0gJ2RhdGEuJyArIHRoaXMuZGF0YVZpZXcuYm9EZWZBbGlhcyArICcuJyArIHNlbGVjdExpc3RbaV0uc2VsZWN0RmllbGQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdXRpbHMuZ2V0VmFsdWVCeVBhdGgocEluc3QsIHBhdGgpOwogICAgICAgICAgICAgICAgICAgIHNlbGVjdExpc3RbaV0uc2VsZWN0VmFsdWUgPSB2YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgLy/mt7vliqDnm5HlkKwKICAgICAgICAgICAgICAgICAgICBwSW5zdC4kd2F0Y2gocGF0aCwgZnVuY3Rpb24gKG5ld1ZhbCwgb2xkVmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnm5HlkKzkuK3kvb/nlKjpl7TpmpTor7fmsYLvvIzlh4/lsJHor7fmsYLmrKHmlbAKICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpOwogICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWwgIT09IG9sZFZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIC8vX21lLnNldERhdGFWaWV3VmFsdWUoX21lLmRhdGFWaWV3KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBfbWUuc2VhcmNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy/lhbPogZTloavlhYXlrZfmrrUKICAgICAgICAgICAgICB2YXIgYmluZExpc3QgPSB0aGlzLmRhdGFWaWV3LmJpbmRMaXN0OwogICAgICAgICAgICAgIGlmIChiaW5kTGlzdCAmJiBiaW5kTGlzdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJpbmRMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgIGlmIChiaW5kTGlzdFtpXS5maWxsRmllbGQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX3BhdGggPSAnZGF0YS4nICsgdGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzICsgJy4nICsgYmluZExpc3RbaV0uZmlsbEZpZWxkOwogICAgICAgICAgICAgICAgICAgIHZhciBfdmFsdWUgPSB1dGlscy5nZXRWYWx1ZUJ5UGF0aChwSW5zdCwgX3BhdGgpOwogICAgICAgICAgICAgICAgICAgIGJpbmRMaXN0W2ldLmZpbGxWYWx1ZSA9IF92YWx1ZTsKICAgICAgICAgICAgICAgICAgICBwSW5zdC4kd2F0Y2goX3BhdGgsIGZ1bmN0aW9uIChuZXdWYWwsIG9sZFZhbCkgewogICAgICAgICAgICAgICAgICAgICAgLy8g55uR5ZCs5Lit5L2/55So6Ze06ZqU6K+35rGC77yM5YeP5bCR6K+35rGC5qyh5pWwCiAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTsKICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsICE9PSBvbGRWYWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL19tZS5zZXREYXRhVmlld1ZhbHVlKF9tZS5kYXRhVmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX21lLnNlYXJjaCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9LCA1MDApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgcHJpbnRMaXN0OiBmdW5jdGlvbiBwcmludExpc3QoKSB7CiAgICAgICAgICAgIHZhciBfdGhpczMgPSB0aGlzOwogICAgICAgICAgICB0aGlzLm5vdFByaW50ID0gdHJ1ZTsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpbnREYXRhJykuaW5uZXJIVE1MOwogICAgICAgICAgICAgIHdpbmRvdy5wcmludCgpOwogICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBfdGhpczMubm90UHJpbnQgPSBmYWxzZTsKICAgICAgICAgICAgfSwgMjAwKTsKICAgICAgICAgIH0sCiAgICAgICAgICBwcmludERldGFpbDogZnVuY3Rpb24gcHJpbnREZXRhaWwodGVtcGxhdGVJZCwgaWQsIGFjdGlvbikgewogICAgICAgICAgICAvL+aVsOaNrumaj+acuua3u+WKoOWIsOWFtuS7luiPnOWNleS4i+mdouaXtuiOt+WPluW9k+WJjeiPnOWNleeahOWIq+WQjQogICAgICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcykgewogICAgICAgICAgICAgIHRoaXMuYWxpYXNfbmV3ID0gc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhczsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdXJsID0gJy8nICsgdGhpcy5hbGlhc19uZXcgKyAnL3RlbXBsYXRlL2Zvcm0vJyArIHRoaXMudGVtcGxhdGVLZXkgKyAnLycgKyBhY3Rpb24gKyAnL3RydWUnOwogICAgICAgICAgICBpZiAoaWQpIHsKICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAnP2lkPScgKyBpZCArICcmJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB1cmwgKz0gJz8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGFydEZsb3dTdHIgPSAnc3RhcnRGbG93PWZhbHNlJzsKICAgICAgICAgICAgdmFyIHBhdGggPSB1cmwgKyBzdGFydEZsb3dTdHI7CiAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YoJ290aGVybWVudScpICE9IC0xKSB7CiAgICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgnL290aGVybWVudScsICcvc3RhdGVtZW50Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goewogICAgICAgICAgICAgIHBhdGg6IHBhdGgsCiAgICAgICAgICAgICAgcXVlcnk6IHsKICAgICAgICAgICAgICAgIGlzUHJpbnQ6IHRydWUKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZShyb3csIHRhc2tUeXBlKSB7CiAgICAgICAgICAgIHZhciBfdGhpczQgPSB0aGlzOwogICAgICAgICAgICBpZiAodGFza1R5cGUgPT0gJ3RvZG8nKSB7CiAgICAgICAgICAgICAgdmFyIHVybCA9IHdpbmRvdy5jb250ZXh0LmJwbVJ1blRpbWUgKyAnL3J1bnRpbWUvdGFzay92MS9nZXRCcG1UYXNrQnlJbnN0SWQ/aW5zdElkPScgKyByb3cuYnBtX3Byb2NfaW5zdF9pZF87CiAgICAgICAgICAgICAgcmVxLmdldCh1cmwpLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgIF90aGlzNC4kbWVzc2FnZS5lcnJvcign5q2k5Lu75Yqh5bey6KKr5aSE55CG5oiW5LiN5a2Y5Zyo77yBJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5kYXRhLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgIF90aGlzNC4kcm91dGVyLnB1c2goJy9yZXBvcnRNb2R1bGVJbnN0LycgKyByZXMuZGF0YVswXS5pZCArICcvMCcgKyAnLycgKyBfdGhpczQuZGVmS2V5ICsgJy90cnVlLycgKyBfdGhpczQudGVtcGxhdGVLZXkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgX3RoaXM0LiRtZXNzYWdlLmVycm9yKCfmmoLkuI3mlK/mjIHvvIEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0YXNrVHlwZSA9PSAnZG9uZScpIHsKICAgICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCgnL3JlcG9ydE1vZHVsZUluc3REb25lLycgKyByb3cuYnBtX3Byb2NfaW5zdF9pZF8gKyAnL2RvbmVMaXN0LycgKyB0aGlzLmRlZktleSArICcvJyArIHRoaXMudGVtcGxhdGVLZXkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRhc2tUeXBlID09ICdyZXF1ZXN0JykgewogICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKCcvcmVwb3J0TW9kdWxlSW5zdERvbmUvJyArIHJvdy5icG1fcHJvY19pbnN0X2lkXyArICcvcmVxdWVzdC8nICsgdGhpcy5kZWZLZXkgKyAnLycgKyB0aGlzLnRlbXBsYXRlS2V5KTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0YXNrVHlwZSA9PSAndG9kb1JlYWQnKSB7CiAgICAgICAgICAgICAgdmFyIHBhZ2VCZWFuID0gewogICAgICAgICAgICAgICAgcGFnZTogMSwKICAgICAgICAgICAgICAgIHBhZ2VTaXplOiAxMCwKICAgICAgICAgICAgICAgIHNob3dUb3RhbDogJ3RydWUnCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB2YXIgc3RhdHVzID0gcm93LmJwbV9zdGF0dXNfOwogICAgICAgICAgICAgIHJlcS5wb3N0KCcke2JwbVJ1blRpbWV9L3J1bnRpbWUvdGFzay92MS9nZXROb3RpY2VUb2RvUmVhZExpc3QnLCB7CiAgICAgICAgICAgICAgICBwYWdlQmVhbjogcGFnZUJlYW4sCiAgICAgICAgICAgICAgICBxdWVyeXM6IFt7CiAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiAncHJvY19pbnN0X2lkXycsCiAgICAgICAgICAgICAgICAgIHZhbHVlOiByb3cuYnBtX3Byb2NfaW5zdF9pZF8sCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywKICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnCiAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5yb3dzICYmIHJlc3BvbnNlLmRhdGEucm93cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHJlc3BvbnNlLmRhdGEucm93c1swXS5pZDsKICAgICAgICAgICAgICAgICAgdmFyIF91cmwgPSAnJzsKICAgICAgICAgICAgICAgICAgNzsKICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAnRk9MTE9XJykgewogICAgICAgICAgICAgICAgICAgIF91cmwgPSAnL3JlcG9ydE1vZHVsZUluc3RUYXNrUmVhZC8nICsgaWQgKyAnL0ZPTExPVy8nICsgX3RoaXM0LmRlZktleSArICcvJyArIF90aGlzNC50ZW1wbGF0ZUtleTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gJ0NPTU1VJykgewogICAgICAgICAgICAgICAgICAgIF91cmwgPSAnL3JlcG9ydE1vZHVsZUluc3QvJyArIGlkICsgJy8wLycgKyBfdGhpczQuZGVmS2V5ICsgJy90cnVlLycgKyBfdGhpczQudGVtcGxhdGVLZXk7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgX3VybCA9ICcvcmVwb3J0TW9kdWxlSW5zdFJlYWQvJyArIHJvdy5icG1fcHJvY19pbnN0X2lkXyArICcvcmVhZC8nICsgaWQgKyAnLycgKyBfdGhpczQuZGVmS2V5ICsgJy8nICsgX3RoaXM0LnRlbXBsYXRlS2V5OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIF90aGlzNC4kcm91dGVyLnB1c2goX3VybCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFza1R5cGUgPT0gJ2RvbmVSZWFkJykgewogICAgICAgICAgICAgIHZhciBfcGFnZUJlYW4gPSB7CiAgICAgICAgICAgICAgICBwYWdlOiAxLAogICAgICAgICAgICAgICAgcGFnZVNpemU6IDEwLAogICAgICAgICAgICAgICAgc2hvd1RvdGFsOiAndHJ1ZScKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHJlcS5wb3N0KCcke2JwbVJ1blRpbWV9L3J1bnRpbWUvdGFzay92MS9nZXROb3RpY2VEb25lUmVhZExpc3QnLCB7CiAgICAgICAgICAgICAgICBwYWdlQmVhbjogX3BhZ2VCZWFuLAogICAgICAgICAgICAgICAgcXVlcnlzOiBbewogICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ3Byb2NfaW5zdF9pZF8nLAogICAgICAgICAgICAgICAgICB2YWx1ZTogcm93LmJwbV9wcm9jX2luc3RfaWRfLAogICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsCiAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEucm93cyAmJiByZXNwb25zZS5kYXRhLnJvd3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICB2YXIgaWQgPSByZXNwb25zZS5kYXRhLnJvd3NbMF0uaWQ7CiAgICAgICAgICAgICAgICAgIF90aGlzNC4kcm91dGVyLnB1c2goJy9yZXBvcnRNb2R1bGVJbnN0RG9uZS8nICsgcm93LmJwbV9wcm9jX2luc3RfaWRfICsgJy9yZWFkL2RvbmUvJyArIGlkICsgJy8nICsgX3RoaXM0LmRlZktleSArICcvJyArIF90aGlzNC50ZW1wbGF0ZUtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFza1R5cGUgPT0gJ215UmVhZCcpIHsKICAgICAgICAgICAgICB2YXIgX3BhZ2VCZWFuMiA9IHsKICAgICAgICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICAgICAgICBwYWdlU2l6ZTogMTAsCiAgICAgICAgICAgICAgICBzaG93VG90YWw6ICd0cnVlJwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgcmVxLnBvc3QoJyR7YnBtUnVuVGltZX0vcnVudGltZS90YXNrL3YxL2dldE15Tm90aWNlUmVhZExpc3QnLCB7CiAgICAgICAgICAgICAgICBwYWdlQmVhbjogX3BhZ2VCZWFuMiwKICAgICAgICAgICAgICAgIHF1ZXJ5czogW3sKICAgICAgICAgICAgICAgICAgcHJvcGVydHk6ICdwcm9jX2luc3RfaWRfJywKICAgICAgICAgICAgICAgICAgdmFsdWU6IHJvdy5icG1fcHJvY19pbnN0X2lkXywKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLAogICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnJvd3MgJiYgcmVzcG9uc2UuZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgdmFyIGlkID0gcmVzcG9uc2UuZGF0YS5yb3dzWzBdLmlkOwogICAgICAgICAgICAgICAgICBfdGhpczQuJHJvdXRlci5wdXNoKCcvcmVwb3J0TW9kdWxlSW5zdE15UmVhZC8nICsgcm93LmJwbV9wcm9jX2luc3RfaWRfICsgJy8nICsgaWQgKyAnL215UmVhZC8nICsgX3RoaXM0LmRlZktleSArICcvJyArIF90aGlzNC50ZW1wbGF0ZUtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFza1R5cGUgPT0gJ215RGVsZWdhdGUnKSB7CiAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goJy9yZXBvcnRNb2R1bGVJbnN0UmVhZC8nICsgcm93LmJwbV9wcm9jX2luc3RfaWRfICsgJy9kZWxlZ2F0ZS8nICsgdGhpcy5kZWZLZXkgKyAnLycgKyB0aGlzLnRlbXBsYXRlS2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIC8v5LiL6L295YWo6YOo6YCJ5Lit55qE5LqM57u056CBCiAgICAgICAgICBkb3dubG9hZEFsbFFSQ29kZTogZnVuY3Rpb24gZG93bmxvYWRBbGxRUkNvZGUodGVtcGxhdGVJZCwgbW9iaWxlRm9ybUFsaWFzLCBkaXNwbGF5LCBwa0ZpZWxkLCBRUkNvZGVQYXR0ZXJuKSB7CiAgICAgICAgICAgIHZhciBfdGhpczUgPSB0aGlzOwogICAgICAgICAgICB0aGlzLlFSQ29kZVBhdHRlcm4gPSBRUkNvZGVQYXR0ZXJuOwogICAgICAgICAgICB2YXIgX3NlbGVjdERhdGEgPSB0aGlzLiRyZWZzLm11bHRpcGxlVGVtcGxhdGVUYWJsZS5zZWxlY3Rpb247CiAgICAgICAgICAgIGlmIChfc2VsZWN0RGF0YS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCfor7foh7PlsJHpgInkuK3kuIDmnaHmlbDmja4hJyk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7CiAgICAgICAgICAgIHZhciBhY2NvdW50ID0gQmFzZTY0LmVuY29kZSh0aGlzLiRzdG9yZS5zdGF0ZS5sb2dpbi5jdXJyZW50VXNlci5hY2NvdW50KTsKICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy4kc3RvcmUuc3RhdGUubG9naW4uY3VycmVudFVzZXIudG9rZW47CiAgICAgICAgICAgIHZhciBtb2JpbGUgPSB3aW5kb3cuY29udGV4dC5tb2JpbGU7CiAgICAgICAgICAgIHZhciBRUkNvZGV1cmwgPSAnJzsKICAgICAgICAgICAgdmFyIHppcCA9IG5ldyBKU1ppcCgpOwogICAgICAgICAgICAvLyDliJvlu7rkuIDkuKrlkI3kuLppbWFnZXPnmoTmlrDnmoTmlofku7bnm67lvZUKICAgICAgICAgICAgdmFyIGltZyA9IHppcC5mb2xkZXIoJ2ltYWdlcycpOwogICAgICAgICAgICB2YXIgcGxpc3QgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBfc2VsZWN0RGF0YS5sZW5ndGg7IHgrKykgewogICAgICAgICAgICAgIGlmICh0aGlzLlFSQ29kZVBhdHRlcm4pIHsKICAgICAgICAgICAgICAgIFFSQ29kZXVybCA9IG1vYmlsZSArICcvUVJDb2RlRm9ybS8nICsgdGhpcy50ZW1wbGF0ZUtleSArICcvZ2V0JyArICc/aWQ9JyArIF9zZWxlY3REYXRhW3hdW3BrRmllbGRdICsgJyZ0b2tlbj0nICsgdG9rZW47CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIFFSQ29kZXVybCA9IG1vYmlsZSArICcvUVJDb2RlRm9ybS8nICsgdGhpcy50ZW1wbGF0ZUtleSArICcvZWRpdCcgKyAnP2lkPScgKyBfc2VsZWN0RGF0YVt4XVtwa0ZpZWxkXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIG1zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOwogICAgICAgICAgICAgIFFSQ29kZS50b0NhbnZhcyhtc2csIFFSQ29kZXVybCwgZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgdmFyIF9jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICBfY2FudmFzLnNldEF0dHJpYnV0ZSgnaWQnLCAnUVJDb2RlQW5kRGVzY0FsbCcgKyB4KTsKICAgICAgICAgICAgICBfY2FudmFzLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAndGV4dC1hbGlnbjpjZW50ZXI7d2lkdGg6JyArIG1zZy53aWR0aCArICdweDsnKTsKICAgICAgICAgICAgICBfY2FudmFzLmFwcGVuZENoaWxkKG1zZyk7CiAgICAgICAgICAgICAgLy/liJvlu7rlupXpg6jnmoTmj4/ov7Dkv6Hmga8KICAgICAgICAgICAgICBmb3IgKHZhciBZID0gMDsgWSA8IGRpc3BsYXkubGVuZ3RoOyBZKyspIHsKICAgICAgICAgICAgICAgIHZhciBpdGVtID0gSlNPTi5wYXJzZShkaXNwbGF5W1ldKTsKICAgICAgICAgICAgICAgIGlmIChfc2VsZWN0RGF0YVt4XVtpdGVtLm5hbWVdKSB7CiAgICAgICAgICAgICAgICAgIHZhciBkZXNjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICAgIGRlc2MuaW5uZXJIVE1MID0gaXRlbS5kZXNjICsgJzonICsgX3NlbGVjdERhdGFbeF1baXRlbS5uYW1lXTsKICAgICAgICAgICAgICAgICAgX2NhbnZhcy5hcHBlbmRDaGlsZChkZXNjKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ1FSQ29kZUFuZERlc2NBbGwnKS5hcHBlbmRDaGlsZChfY2FudmFzKTsKICAgICAgICAgICAgICBwbGlzdC5wdXNoKHRoaXMuZG93bmxvYWRRUkNvZGVBbmREZXNjKCcjUVJDb2RlQW5kRGVzY0FsbCcgKyB4LCBfY2FudmFzKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgUHJvbWlzZS5hbGwocGxpc3QpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdRUkNvZGVBbmREZXNjQWxsJykuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgICAgICAgZm9yICh2YXIgX3ggPSAwOyBfeCA8IHJlc3VsdC5sZW5ndGg7IF94KyspIHsKICAgICAgICAgICAgICAgIHZhciBjYW52YXMgPSByZXN1bHRbX3hdOwogICAgICAgICAgICAgICAgdmFyIGltYWdlID0gY2FudmFzLnRvRGF0YVVSTCgpLnNwbGl0KCc7YmFzZTY0LCcpWzFdOwogICAgICAgICAgICAgICAgLy8g6L+Z5LiqaW1hZ2Vz5paH5Lu255uu5b2V5Lit5Yib5bu65LiA5LiqYmFzZTY05pWw5o2u5Li6aW1nRGF0YeeahOWbvuWDj++8jOWbvuWDj+WQjeaYr3NtaWxlLmdpZgogICAgICAgICAgICAgICAgaW1nLmZpbGUoX3ggKyAnLnBuZycsIGltYWdlLCB7CiAgICAgICAgICAgICAgICAgIGJhc2U2NDogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8vIOaKiuaJk+WMheWGheWuueW8guatpei9rOaIkGJsb2Lkuozov5vliLbmoLzlvI8KICAgICAgICAgICAgICB6aXAuZ2VuZXJhdGVBc3luYyh7CiAgICAgICAgICAgICAgICB0eXBlOiAnYmxvYicKICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChjb250ZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgZWxlTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgICAgICAgIGVsZUxpbmsuZG93bmxvYWQgPSAn5LqM57u056CBLnppcCc7CiAgICAgICAgICAgICAgICBlbGVMaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICAvLyDkuIvovb3lhoXlrrnovazlj5jmiJBibG9i5Zyw5Z2ACiAgICAgICAgICAgICAgICBlbGVMaW5rLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGNvbnRlbnQpOwogICAgICAgICAgICAgICAgLy8g6Kem5Y+R54K55Ye7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsZUxpbmspOwogICAgICAgICAgICAgICAgZWxlTGluay5jbGljaygpOwogICAgICAgICAgICAgICAgLy8g54S25ZCO56e76ZmkCiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsZUxpbmspOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIF90aGlzNS5sb2FkaW5nID0gZmFsc2U7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIG9uQ29weTogZnVuY3Rpb24gb25Db3B5KGUpIHsKICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKCflhoXlrrnlt7LlpI3liLbliLDliarliIfmnb/vvIEnKTsKICAgICAgICAgIH0sCiAgICAgICAgICAvLyDlpI3liLblpLHotKXml7bnmoTlm57osIPlh73mlbAKICAgICAgICAgIG9uRXJyb3I6IGZ1bmN0aW9uIG9uRXJyb3IoZSkgewogICAgICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCfmirHmrYnvvIzlpI3liLblpLHotKXvvIEnKTsKICAgICAgICAgIH0sCiAgICAgICAgICBkb3dubG9hZFFSQ29kZTogZnVuY3Rpb24gZG93bmxvYWRRUkNvZGUoKSB7CiAgICAgICAgICAgIHZhciBwbGlzdCA9IFtdOwogICAgICAgICAgICB2YXIgX2NhbnZhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNRUkNvZGVBbmREZXNjJyk7CiAgICAgICAgICAgIHBsaXN0LnB1c2godGhpcy5kb3dubG9hZFFSQ29kZUFuZERlc2MoJyNRUkNvZGVBbmREZXNjJywgX2NhbnZhcykpOwogICAgICAgICAgICBQcm9taXNlLmFsbChwbGlzdCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgdmFyIGNhbnZhcyA9IHJlc3VsdFswXTsKICAgICAgICAgICAgICB2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgICAgICBsaW5rLmhyZWYgPSBjYW52YXMudG9EYXRhVVJMKCk7IC8v5LiL6L296ZO+5o6lCiAgICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgJ+S6jOe7tOeggS5qcGcnKTsKICAgICAgICAgICAgICBsaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IC8vYeagh+etvumakOiXjwogICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7CiAgICAgICAgICAgICAgbGluay5jbGljaygpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+aKiuS6jOe7tOeggeS4juS6jOe7tOeggeivtOaYjuS4gOi1t+S4i+i9veaIkOWbvueJhwogICAgICAgICAgZG93bmxvYWRRUkNvZGVBbmREZXNjOiBmdW5jdGlvbiBkb3dubG9hZFFSQ29kZUFuZERlc2MoY2xhc3NzLCBfY2FudmFzKSB7CiAgICAgICAgICAgIHZhciBwMiA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICB2YXIgY2FudmFzMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOwogICAgICAgICAgICAgIHZhciB3ID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoX2NhbnZhcykud2lkdGgpOwogICAgICAgICAgICAgIHZhciBoID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoX2NhbnZhcykuaGVpZ2h0KTsKICAgICAgICAgICAgICAvL+WwhmNhbnZhc+eUu+W4g+aUvuWkp+iLpeW5suWAje+8jOeEtuWQjuebm+aUvuWcqOi+g+Wwj+eahOWuueWZqOWGhe+8jOWwseaYvuW+l+S4jeaooeeziuS6hgogICAgICAgICAgICAgIGNhbnZhczIud2lkdGggPSB3ICogMjsKICAgICAgICAgICAgICBjYW52YXMyLmhlaWdodCA9IGggKiAyOwogICAgICAgICAgICAgIGNhbnZhczIuc3R5bGUud2lkdGggPSB3ICsgJ3B4JzsKICAgICAgICAgICAgICBjYW52YXMyLnN0eWxlLmhlaWdodCA9IGggKyAncHgnOwogICAgICAgICAgICAgIC8v5Y+v5Lul5oyJ54Wn6Ieq5bex55qE6ZyA5rGC77yM5a+5Y29udGV4dOeahOWPguaVsOS/ruaUuSx0cmFuc2xhdGXmjIfnmoTmmK/lgY/np7vph48KICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNhbnZhczIuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICAgICAgICBjb250ZXh0LnNjYWxlKDIsIDIpOwogICAgICAgICAgICAgIHJldHVybiBodG1sMmNhbnZhcyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNsYXNzcyksIHsKICAgICAgICAgICAgICAgIGNhbnZhczogY2FudmFzMgogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGNhbnZhcykgewogICAgICAgICAgICAgICAgcmVzb2x2ZShjYW52YXMpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHAyOwogICAgICAgICAgfSwKICAgICAgICAgIFFSQ29kZURpYWxvZ0Nsb3NlOiBmdW5jdGlvbiBRUkNvZGVEaWFsb2dDbG9zZSgpIHsKICAgICAgICAgICAgdGhpcy5RUkNvZGVUeXBlID0gJyc7CiAgICAgICAgICAgIHRoaXMuUVJDb2RlRGlhbG9nID0gZmFsc2U7CiAgICAgICAgICB9LAogICAgICAgICAgZm91bmRRUkNvZGU6IGZ1bmN0aW9uIGZvdW5kUVJDb2RlKCkgewogICAgICAgICAgICAvKnRoaXMuUVJDb2RldXJsID0NCiAgICAgICAgICAgICAgd2luZG93LmNvbnRleHQuZnJvbnQgKw0KICAgICAgICAgICAgICAiL1FSQ29kZUZvcm0vIiArDQogICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVLZXkgKw0KICAgICAgICAgICAgICAiL2dldCIgKw0KICAgICAgICAgICAgICAiP2lkPSIgKw0KICAgICAgICAgICAgICB0aGlzLnJvd0lkICsNCiAgICAgICAgICAgICAgIiZ0b2tlbj0iICsNCiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUuc3RhdGUubG9naW4uY3VycmVudFVzZXIudG9rZW47Ki8KICAgICAgICAgICAgaWYgKHRoaXMuUVJDb2RlVHlwZSA9PSAnYWRkJykgewogICAgICAgICAgICAgIHZhciBpc1N0YXJ0RmxvdyA9IHRoaXMudGVtcGxhdGVJbmZvLmRlZklkID8gJ3RydWUnIDogJ2ZhbHNlJzsKICAgICAgICAgICAgICB0aGlzLlFSQ29kZXVybCA9IHJlcS5nZXRDb250ZXh0KCkubW9iaWxlICsgJy90ZW1wbGF0ZS9mb3JtLycgKyB0aGlzLnRlbXBsYXRlS2V5ICsgJy9hZGQvP3N0YXJ0Rmxvdz0nICsgaXNTdGFydEZsb3c7CiAgICAgICAgICAgICAgaWYgKHRoaXMuUVJDb2RlUGF0dGVybikgewogICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy4kc3RvcmUuc3RhdGUubG9naW4uY3VycmVudFVzZXIudG9rZW47CiAgICAgICAgICAgICAgICB0aGlzLlFSQ29kZXVybCArPSAnJnRva2VuPScgKyB0b2tlbjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy/kuI3orrrpnIDkuI3pnIDopoHnmbvlvZXvvIzorr/pl67nmoTpg73mmK/mmI7nu4bpobXpnaIKICAgICAgICAgICAgICBpZiAodGhpcy5RUkNvZGVQYXR0ZXJuKSB7CiAgICAgICAgICAgICAgICAvL+WFjeeZu+W9lQogICAgICAgICAgICAgICAgdGhpcy5RUkNvZGV1cmwgPSByZXEuZ2V0Q29udGV4dCgpLm1vYmlsZSArICcvUVJDb2RlRm9ybS8nICsgdGhpcy50ZW1wbGF0ZUtleSArICcvZ2V0P2lkPScgKyB0aGlzLnJvd0lkICsgJyZ0b2tlbj0nICsgdGhpcy4kc3RvcmUuc3RhdGUubG9naW4uY3VycmVudFVzZXIudG9rZW47CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8v6ZyA6KaB55m75b2VCiAgICAgICAgICAgICAgICB0aGlzLlFSQ29kZXVybCA9IHJlcS5nZXRDb250ZXh0KCkubW9iaWxlICsgJy9RUkNvZGVGb3JtLycgKyB0aGlzLnRlbXBsYXRlS2V5ICsgJy9nZXQ/aWQ9JyArIHRoaXMucm93SWQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEJhc2U2NC5lbmNvZGUodGhpcy4kc3RvcmUuc3RhdGUubG9naW4uY3VycmVudFVzZXIuYWNjb3VudCk7CiAgICAgICAgICAgIHZhciBtc2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnUVJDb2RlJyk7CiAgICAgICAgICAgIFFSQ29kZS50b0NhbnZhcyhtc2csIHRoaXMuUVJDb2RldXJsLCBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLlFSQ29kZVNob3cgPSB0cnVlOwogICAgICAgICAgfSwKICAgICAgICAgIGdldFFSQ29kZTogZnVuY3Rpb24gZ2V0UVJDb2RlKHRlbXBsYXRlSWQsIGlkLCBtb2JpbGVGb3JtQWxpYXMsIGRpc3BsYXksIGluZGV4LCBRUkNvZGVQYXR0ZXJuKSB7CiAgICAgICAgICAgIHRoaXMuUVJDb2RlUGF0dGVybiA9IFFSQ29kZVBhdHRlcm47CiAgICAgICAgICAgIHRoaXMuUVJDb2RlRGVzYyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IGRpc3BsYXkubGVuZ3RoOyB4KyspIHsKICAgICAgICAgICAgICB2YXIgaXRlbSA9IEpTT04ucGFyc2UoZGlzcGxheVt4XSk7CiAgICAgICAgICAgICAgaWYgKHRoaXMucm93c1tpbmRleF1baXRlbS5uYW1lXSkgewogICAgICAgICAgICAgICAgdGhpcy5RUkNvZGVEZXNjLnB1c2goaXRlbS5kZXNjICsgJzonICsgdGhpcy5yb3dzW2luZGV4XVtpdGVtLm5hbWVdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5tb2JpbGVGb3JtQWxpYXMgPSBtb2JpbGVGb3JtQWxpYXM7CiAgICAgICAgICAgIHRoaXMuUVJDb2RlU2hvdyA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLlFSQ29kZURpYWxvZyA9IHRydWU7CiAgICAgICAgICAgIHRoaXMucm93VGVtcGxhdGVJZCA9IHRlbXBsYXRlSWQ7CiAgICAgICAgICAgIHRoaXMucm93SWQgPSBpZDsKICAgICAgICAgIH0sCiAgICAgICAgICBoYW5kbGVTaXplQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVTaXplQ2hhbmdlKHNpemUpIHsKICAgICAgICAgICAgLy/mr4/pobXkuIvmi4nmmL7npLrmlbDmja4KICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gc2l6ZTsKICAgICAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgICAgIH0sCiAgICAgICAgICBoYW5kbGVDdXJyZW50Q2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVDdXJyZW50Q2hhbmdlKGN1cnJlbnRQYWdlKSB7CiAgICAgICAgICAgIC8v54K55Ye756ys5Yeg6aG1CiAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlID0gY3VycmVudFBhZ2U7CiAgICAgICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0UGFyYW06IGZ1bmN0aW9uIGdldFBhcmFtKCkgewogICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgIGlmIChzdHIgPT0gJ2ZpbmQnKSB7CiAgICAgICAgICAgICAgLy8gdGhpcy4kc3RvcmUuZGlzcGF0Y2goImZvcm0vc2V0QnBtVGVtcGxhdGVQYWdpbmF0aW9uUGFnZU51bSIsIDEpOwogICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy/liKTmlq3kuLrlkIjlubbmn6Xor6Lov5jmmK/liIblvIDmn6Xor6IKICAgICAgICAgICAgaWYgKHRoaXMuZm9ybVR5cGUpIHsKICAgICAgICAgICAgICBwYXJhbXMgPSB0aGlzLmdldFF1ZXJ5RmlsdGVyKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy/liKTmlq3mmK/lkKbphY3nva7kuoblkIjlubbmn6Xor6IKICAgICAgICAgICAgICBpZiAoJCgnLnNlYXJjaC1xdWVyeScpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHBhcmFtcyA9IHRoaXMuZ2V0Q29uZGl0aW9uUXVlcnkoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcGFyYW1zID0gdGhpcy5nZXRRdWVyeUZpbHRlcigpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocGFyYW1zLnBhZ2luYXRpb24gJiYgcGFyYW1zLnBhZ2luYXRpb24gJiYgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzKSB7CiAgICAgICAgICAgICAgdmFyIHRlbXBRdWVyeVMgPSBbXTsKICAgICAgICAgICAgICB2YXIgYmV0d2VlbkNvbmRpdGlvbnMgPSB7fTsKICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMuZm9yRWFjaChmdW5jdGlvbiAocSkgewogICAgICAgICAgICAgICAgaWYgKHEudmFsdWUgJiYgKHEub3BlcmF0aW9uICE9ICdCRVRXRUVOJyB8fCBxLnZhbHVlLmNvbnN0cnVjdG9yID09IEFycmF5KSkgewogICAgICAgICAgICAgICAgICB0ZW1wUXVlcnlTLnB1c2gocSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHEudmFsdWUpIHsKICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpdGlvbnMgPSBxOwogICAgICAgICAgICAgICAgICBpZiAoYmV0d2VlbkNvbmRpdGlvbnNbcS5wcm9wZXJ0eV0pIHsKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zID0gYmV0d2VlbkNvbmRpdGlvbnNbcS5wcm9wZXJ0eV07CiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucy52YWx1ZSA9IFtjb25kaXRpb25zLnZhbHVlXTsKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zLnZhbHVlLnB1c2gocS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYmV0d2VlbkNvbmRpdGlvbnNbcS5wcm9wZXJ0eV0gPSBjb25kaXRpb25zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBiZXR3ZWVuQ29uZGl0aW9ucykgewogICAgICAgICAgICAgICAgdGVtcFF1ZXJ5Uy5wdXNoKGJldHdlZW5Db25kaXRpb25zW2tleV0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPSB0ZW1wUXVlcnlTOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXJhbXM7CiAgICAgICAgICB9LAogICAgICAgICAgc2VhcmNoOiBmdW5jdGlvbiBzZWFyY2goc3RyKSB7CiAgICAgICAgICAgIHZhciBsb2FkaW5nID0gdGhpcy4kbG9hZGluZyh0aGlzLm9wdGlvbnMpOwogICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAgICAgICAgIGlmIChzdHIgPT0gJ2ZpbmQnKSB7CiAgICAgICAgICAgICAgLy8gdGhpcy4kc3RvcmUuZGlzcGF0Y2goImZvcm0vc2V0QnBtVGVtcGxhdGVQYWdpbmF0aW9uUGFnZU51bSIsIDEpOwogICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL+WIpOaWreS4uuWQiOW5tuafpeivoui/mOaYr+WIhuW8gOafpeivogogICAgICAgICAgICBpZiAodGhpcy5mb3JtVHlwZSkgewogICAgICAgICAgICAgIHBhcmFtcyA9IHRoaXMuZ2V0UXVlcnlGaWx0ZXIoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvL+WIpOaWreaYr+WQpumFjee9ruS6huWQiOW5tuafpeivogogICAgICAgICAgICAgIGlmICgkKCcuc2VhcmNoLXF1ZXJ5JykubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgcGFyYW1zID0gdGhpcy5nZXRDb25kaXRpb25RdWVyeSgpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbXMgPSB0aGlzLmdldFF1ZXJ5RmlsdGVyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwYXJhbXMucGFnaW5hdGlvbiAmJiBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMpIHsKICAgICAgICAgICAgICB2YXIgdGVtcFF1ZXJ5UyA9IFtdOwogICAgICAgICAgICAgIHZhciBiZXR3ZWVuQ29uZGl0aW9ucyA9IHt9OwogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cy5mb3JFYWNoKGZ1bmN0aW9uIChxKSB7CiAgICAgICAgICAgICAgICBpZiAocS52YWx1ZSAmJiAocS5vcGVyYXRpb24gIT0gJ0JFVFdFRU4nIHx8IHEudmFsdWUuY29uc3RydWN0b3IgPT0gQXJyYXkpKSB7CiAgICAgICAgICAgICAgICAgIHRlbXBRdWVyeVMucHVzaChxKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocS52YWx1ZSkgewogICAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9ucyA9IHE7CiAgICAgICAgICAgICAgICAgIGlmIChiZXR3ZWVuQ29uZGl0aW9uc1txLnByb3BlcnR5XSkgewogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMgPSBiZXR3ZWVuQ29uZGl0aW9uc1txLnByb3BlcnR5XTsKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zLnZhbHVlID0gW2NvbmRpdGlvbnMudmFsdWVdOwogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMudmFsdWUucHVzaChxLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBiZXR3ZWVuQ29uZGl0aW9uc1txLnByb3BlcnR5XSA9IGNvbmRpdGlvbnM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGJldHdlZW5Db25kaXRpb25zKSB7CiAgICAgICAgICAgICAgICB0ZW1wUXVlcnlTLnB1c2goYmV0d2VlbkNvbmRpdGlvbnNba2V5XSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cyA9IHRlbXBRdWVyeVM7CiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzID0gcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzID8gcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzLmNvbmNhdCh0aGlzLnRyZWVRdWVyeXMpIDogdGhpcy50cmVlUXVlcnlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8v5oqK6L+H5ruk5qCR55qE5p2h5Lu25Lmf5ou85o6l6L+b5Y67CiAgICAgICAgICAgIGlmICh0aGlzLnRyZWVRdWVyeXMgJiYgdGhpcy50cmVlUXVlcnlzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPSBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPyBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMuY29uY2F0KHRoaXMudHJlZVF1ZXJ5cykgOiB0aGlzLnRyZWVRdWVyeXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8v5pWw5o2u6KeG5Zu+5o6n5Lu2CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3KSB7CiAgICAgICAgICAgICAgdGhpcy5oYW5kZWxCaW5kRmlsZWRWYWx1YSgpOwogICAgICAgICAgICAgIHBhcmFtcy5yZWZJZFZhbHVlID0gdGhpcy5kYXRhVmlldy5yZWZJZFZhbHVlOwogICAgICAgICAgICAgIC8v5YWz6IGU5p+l6K+i5a2X5q61CiAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuc2VsZWN0TGlzdCAmJiB0aGlzLmRhdGFWaWV3LnNlbGVjdExpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgcGFyYW1zLnNlbGVjdExpc3QgPSB0aGlzLmRhdGFWaWV3LnNlbGVjdExpc3Q7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgICAgICAgIGlmICh0aGlzXy5pc0pvaW5GbG93KSB7CiAgICAgICAgICAgICAgcGFyYW1zLmlzSm9pbkZsb3cgPSB0cnVlOwogICAgICAgICAgICAgIHBhcmFtcy50YXNrVHlwZSA9IHRoaXNfLnRhc2tUeXBlOwogICAgICAgICAgICAgIHBhcmFtcy5kZWZLZXkgPSB0aGlzXy5kZWZLZXk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQuaXNFbXB0eU9iamVjdCh0aGlzLnNlYXJjaEZvcm0pKSB7CiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vZ2V0QnBtVGVtcGxhdGVCeVBhZ2luYXRpb24nLCBwYXJhbXMpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICB0aGlzXy5yb3dzID0gcmVzcG9uc2UuZGF0YS5yb3dzOwogICAgICAgICAgICAgICAgdGhpc18udG90YWwgPSByZXNwb25zZS5kYXRhLnRvdGFsOwogICAgICAgICAgICAgICAgdGhpc18ucGFnaW5hdGlvbi5wYWdlID0gcmVzcG9uc2UuZGF0YS5wYWdlOwogICAgICAgICAgICAgICAgdGhpc18ucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHJlc3BvbnNlLmRhdGEucGFnZVNpemU7CiAgICAgICAgICAgICAgICBsb2FkaW5nLmNsb3NlKCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vZ2V0QnBtVGVtcGxhdGVCeVBhZ2luYXRpb24nLCBwYXJhbXMpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICB0aGlzXy5yb3dzID0gcmVzcG9uc2UuZGF0YS5yb3dzOwogICAgICAgICAgICAgICAgdGhpc18udG90YWwgPSByZXNwb25zZS5kYXRhLnRvdGFsOwogICAgICAgICAgICAgICAgdGhpc18ucGFnaW5hdGlvbi5wYWdlID0gcmVzcG9uc2UuZGF0YS5wYWdlOwogICAgICAgICAgICAgICAgdGhpc18ucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHJlc3BvbnNlLmRhdGEucGFnZVNpemU7CiAgICAgICAgICAgICAgICBsb2FkaW5nLmNsb3NlKCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBnZXRRdWVyeUZpbHRlcjogZnVuY3Rpb24gZ2V0UXVlcnlGaWx0ZXIoKSB7CiAgICAgICAgICAgIHZhciBfdGhpczYgPSB0aGlzOwogICAgICAgICAgICB2YXIgb3BlcmF0aW9uTWFwID0gdGhpcy5nZXRTZWFyY2hJdGVtcygpOwogICAgICAgICAgICB2YXIgZmllbGRUeXBlTWFwID0gdGhpcy5nZXRGaWVsZFR5cGUoKTsKICAgICAgICAgICAgdmFyIHNwZWNpYWxNYXAgPSB0aGlzLmdldFNwZWNpYWxNYXAoKTsKICAgICAgICAgICAgdmFyIHF1ZXJ5cyA9IFtdOyAvL+afpeivouadoeS7tgogICAgICAgICAgICB2YXIgcXVlcnlGaWx0ZXIgPSB7fTsKICAgICAgICAgICAgdmFyIHBhZ2VCZWFuID0gewogICAgICAgICAgICAgIHBhZ2VCZWFuOiB0aGlzLnBhZ2luYXRpb24KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHsKICAgICAgICAgICAgICB0ZW1wbGF0ZUlkOiB0aGlzLnRlbXBsYXRlSW5mby5pZAogICAgICAgICAgICB9OwogICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbiA9IHBhZ2VCZWFuOwogICAgICAgICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KHRoaXMuc2VhcmNoRm9ybSkpIHsKICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGtleSkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBfdGhpczYuc2VhcmNoRm9ybVtrZXldICE9ICd1bmRlZmluZWQnICYmIF90aGlzNi5zZWFyY2hGb3JtW2tleV0gIT0gJycgJiYgX3RoaXM2LnNlYXJjaEZvcm1ba2V5XSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIGlmIChfdGhpczYuc2VhcmNoRm9ybVtrZXldIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF90aGlzNi5zZWFyY2hGb3JtW2tleV0ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IF90aGlzNi5zZWFyY2hGb3JtW2tleV1baV0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uTWFwW2tleV0sCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF90aGlzNi5zZWFyY2hGb3JtW2tleV0uaW5jbHVkZXMoJywnKSAmJiAhc3BlY2lhbE1hcFtrZXldKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyciA9IF90aGlzNi5zZWFyY2hGb3JtW2tleV0uc3BsaXQoJywnKTsKICAgICAgICAgICAgICAgICAgICBhcnIuZm9yRWFjaChmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eToga2V5LAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdiwKICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywKICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb25NYXBba2V5XSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnCiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBfdGhpczYuc2VhcmNoRm9ybVtrZXldOwogICAgICAgICAgICAgICAgICAgIC8v5pW05pWw57G75Z6LCiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkVHlwZU1hcFtrZXldICYmIGZpZWxkVHlwZU1hcFtrZXldID09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQoX3RoaXM2LnNlYXJjaEZvcm1ba2V5XSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBrZXksCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLAogICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb25NYXBba2V5XSwKICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5zZWFyY2hGb3JtKSB7CiAgICAgICAgICAgICAgICBfbG9vcChrZXkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLmNsZWFyUXVlcnlCeUdyb3VwTmFtZShxdWVyeXMsICdmaWx0ZXInKTsKICAgICAgICAgICAgICAvLyDlsIbov4fmu6TmnaHku7bmt7vliqDmn6Xor6Llj4LmlbDmlbDnu4TkuK0KICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzICYmIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgdmFyIHByZWZpeCA9IHRoaXMudGVtcGxhdGVJbmZvLmlzRXh0ZXJuYWwgPT09IDEgPyAnJyA6ICdGXyc7CiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICAgICAgICAgICAgdmFyIGZpbHRlciA9IF90aGlzNi5maWx0ZXJzW2tdOwogICAgICAgICAgICAgICAgICB2YXIgcXVlcnkgPSB7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHByZWZpeCArIGssCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlclswXSwKICAgICAgICAgICAgICAgICAgICBncm91cDogJ2ZpbHRlcicsCiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBxdWVyeS5vcGVyYXRpb24gPSAnRVFVQUwnOwogICAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHF1ZXJ5KTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXIubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgIHF1ZXJ5Lm9wZXJhdGlvbiA9ICdJTic7CiAgICAgICAgICAgICAgICAgICAgcXVlcnkudmFsdWUgPSBmaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2gocXVlcnkpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcXVlcnlGaWx0ZXIgPSB7CiAgICAgICAgICAgICAgICBwYWdlQmVhbjogdGhpcy5wYWdpbmF0aW9uLAogICAgICAgICAgICAgICAgcXVlcnlzOiBxdWVyeXMKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIC8v5aaC5p6c5pyJ6K6+572u6buY6K6k5o6S5bqPLOS8mOWFiOS9v+eUqOm7mOiupOaOkuW6jwogICAgICAgICAgICAgIGlmICh0aGlzLnRlbXBsYXRlSW5mby5zb3J0RmllbGQpIHsKICAgICAgICAgICAgICAgIHZhciBzb3J0RmllbGQgPSBKU09OLnBhcnNlKHRoaXMudGVtcGxhdGVJbmZvLnNvcnRGaWVsZCk7CiAgICAgICAgICAgICAgICB2YXIgc29ydGVyID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHNvcnRGaWVsZC5sZW5ndGg7IHgrKykgewogICAgICAgICAgICAgICAgICBzb3J0ZXIucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHNvcnRGaWVsZFt4XS5uYW1lLAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogc29ydEZpZWxkW3hdLnNvcnQKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBxdWVyeUZpbHRlci5zb3J0ZXIgPSBzb3J0ZXI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICh0aGlzLnNvcnRlciAmJiB0aGlzLnNvcnRlci5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBxdWVyeUZpbHRlci5zb3J0ZXIgPSB0aGlzLnNvcnRlcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24gPSBxdWVyeUZpbHRlcjsKICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgLy8g6YCa6L+H5YiG57uE5ZCN56ew5riF6Zmk5a+55bqU5p+l6K+i5p2h5Lu2CiAgICAgICAgICBjbGVhclF1ZXJ5QnlHcm91cE5hbWU6IGZ1bmN0aW9uIGNsZWFyUXVlcnlCeUdyb3VwTmFtZShxdWVyeXMsIGdyb3VwTmFtZSkgewogICAgICAgICAgICAvLyDlvoXliKDpmaTnmoTmn6Xor6LmnaHku7YKICAgICAgICAgICAgdmFyIHRvRGVsZXRlID0gW107CiAgICAgICAgICAgIHF1ZXJ5cyAmJiBxdWVyeXMuZm9yRWFjaChmdW5jdGlvbiAocXVlcnkpIHsKICAgICAgICAgICAgICBpZiAocXVlcnkuZ3JvdXAgPT0gZ3JvdXBOYW1lKSB7CiAgICAgICAgICAgICAgICB0b0RlbGV0ZS5wdXNoKHF1ZXJ5KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0b0RlbGV0ZS5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgcXVlcnlzLnJlbW92ZShkKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgaGFuZGxlU29ydENoYW5nZTogZnVuY3Rpb24gaGFuZGxlU29ydENoYW5nZShjb2x1bW4pIHsKICAgICAgICAgICAgaWYgKCFjb2x1bW4ub3JkZXIpIHsKICAgICAgICAgICAgICB0aGlzLnNvcnRlciA9IG51bGw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5zb3J0ZXIgPSBbewogICAgICAgICAgICAgICAgcHJvcGVydHk6IGNvbHVtbi5wcm9wLAogICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBjb2x1bW4ub3JkZXIgPT0gJ2FzY2VuZGluZycgPyAnQVNDJyA6ICdERVNDJwogICAgICAgICAgICAgIH1dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgICAgICB9LAogICAgICAgICAgaGFuZGxlRmlsdGVyQ2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVGaWx0ZXJDaGFuZ2UobSkgewogICAgICAgICAgICB2YXIgX3RoaXM3ID0gdGhpczsKICAgICAgICAgICAgdGhpcy5maWx0ZXJzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0aGlzLmZpbHRlcnMpLCBtKTsKICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgICAgaWYgKCFfdGhpczcuZmlsdGVyc1trXSB8fCBfdGhpczcuZmlsdGVyc1trXS5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgZGVsZXRlIF90aGlzNy5maWx0ZXJzW2tdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0U2VhcmNoSXRlbXM6IGZ1bmN0aW9uIGdldFNlYXJjaEl0ZW1zKCkgewogICAgICAgICAgICB2YXIgc2VhcmNoSXRlbXMgPSAkKCcuc2VhcmNoLWl0ZW0nKTsKICAgICAgICAgICAgdmFyIG9wZXJhdGlvbk1hcCA9IHt9OwogICAgICAgICAgICB2YXIgb3BlcmF0aW9uVHlwZSA9IHsKICAgICAgICAgICAgICBsaWtlOiAnTElLRScsCiAgICAgICAgICAgICAgZXF1YWw6ICdFUVVBTCcsCiAgICAgICAgICAgICAgYmV0d2VlbjogJ0JFVFdFRU4nLAogICAgICAgICAgICAgIGxlZnRfbGlrZTogJ0xFRlRfTElLRScsCiAgICAgICAgICAgICAgcmlnaHRfbGlrZTogJ1JJR0hUX0xJS0UnCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChzZWFyY2hJdGVtcykgewogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VhcmNoSXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBvcGVyYXRpb24gPSAnPSc7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mICQoc2VhcmNoSXRlbXNbaV0pLmF0dHIoJ2h0LXF1ZXJ5JykgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gJChzZWFyY2hJdGVtc1tpXSkuYXR0cignb3BlcmF0aW9uJyk7CiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk1hcFskKHNlYXJjaEl0ZW1zW2ldKS5hdHRyKCdodC1xdWVyeScpXSA9IHR5cGVvZiBvcGVyYXRpb25UeXBlW29wZXJhdGlvbl0gIT0gJ3VuZGVmaW5lZCcgPyBvcGVyYXRpb25UeXBlW29wZXJhdGlvbl0gOiBvcGVyYXRpb247CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAkKHNlYXJjaEl0ZW1zW2ldKS5jaGlsZHJlbigpLmF0dHIoJ2h0LXF1ZXJ5JykgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gJChzZWFyY2hJdGVtc1tpXSkuY2hpbGRyZW4oKS5hdHRyKCdvcGVyYXRpb24nKTsKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTWFwWyQoc2VhcmNoSXRlbXNbaV0pLmNoaWxkcmVuKCkuYXR0cignaHQtcXVlcnknKV0gPSB0eXBlb2Ygb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dICE9ICd1bmRlZmluZWQnID8gb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dIDogb3BlcmF0aW9uOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uTWFwOwogICAgICAgICAgfSwKICAgICAgICAgIGdldEZpZWxkVHlwZTogZnVuY3Rpb24gZ2V0RmllbGRUeXBlKCkgewogICAgICAgICAgICB2YXIgc2VhcmNoSXRlbXMgPSAkKCcuc2VhcmNoLWl0ZW0nKTsKICAgICAgICAgICAgdmFyIG9wZXJhdGlvbk1hcCA9IHt9OwogICAgICAgICAgICB2YXIgb3BlcmF0aW9uVHlwZSA9IHsKICAgICAgICAgICAgICBudW1iZXI6ICdudW1iZXInLAogICAgICAgICAgICAgIHRleHQ6ICd0ZXh0JwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoc2VhcmNoSXRlbXMpIHsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlYXJjaEl0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgb3BlcmF0aW9uID0gJz0nOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAkKHNlYXJjaEl0ZW1zW2ldKS5hdHRyKCdodC1xdWVyeScpICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICQoc2VhcmNoSXRlbXNbaV0pLmF0dHIoJ3R5cGUnKTsKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTWFwWyQoc2VhcmNoSXRlbXNbaV0pLmF0dHIoJ2h0LXF1ZXJ5JyldID0gdHlwZW9mIG9wZXJhdGlvblR5cGVbb3BlcmF0aW9uXSAhPSAndW5kZWZpbmVkJyA/IG9wZXJhdGlvblR5cGVbb3BlcmF0aW9uXSA6IG9wZXJhdGlvbjsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mICQoc2VhcmNoSXRlbXNbaV0pLmNoaWxkcmVuKCkuYXR0cignaHQtcXVlcnknKSAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAkKHNlYXJjaEl0ZW1zW2ldKS5jaGlsZHJlbigpLmF0dHIoJ3R5cGUnKTsKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTWFwWyQoc2VhcmNoSXRlbXNbaV0pLmNoaWxkcmVuKCkuYXR0cignaHQtcXVlcnknKV0gPSB0eXBlb2Ygb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dICE9ICd1bmRlZmluZWQnID8gb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dIDogb3BlcmF0aW9uOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uTWFwOwogICAgICAgICAgfSwKICAgICAgICAgIC8v6I635Y+W54m55q6K5p+l6K+i5oOF5Ya177yI6Ieq5a6a5LmJ5a+56K+d5qGG77yJCiAgICAgICAgICBnZXRTcGVjaWFsTWFwOiBmdW5jdGlvbiBnZXRTcGVjaWFsTWFwKCkgewogICAgICAgICAgICB2YXIgc2VhcmNoSXRlbXMgPSAkKCcuc2VhcmNoLWl0ZW0nKTsKICAgICAgICAgICAgdmFyIGZpZWxkUXVlcnlNYXAgPSB7fTsgLy/mn6Xor6LmnaHku7blrZfmrrUKCiAgICAgICAgICAgIGlmIChzZWFyY2hJdGVtcykgewogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VhcmNoSXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuYXR0cignaHQtcXVlcnknKSAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAvL+afpeivouadoeS7tuWtl+autQogICAgICAgICAgICAgICAgICBmaWVsZFF1ZXJ5TWFwWyQoc2VhcmNoSXRlbXNbaV0pLmF0dHIoJ2h0LXF1ZXJ5JyldID0gdHlwZW9mICQoc2VhcmNoSXRlbXNbaV0pLmF0dHIoJ3NwZWNpYWwtcXVlcnknKSAhPSAndW5kZWZpbmVkJyA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mICQoc2VhcmNoSXRlbXNbaV0pLmNoaWxkcmVuKCkuYXR0cignaHQtcXVlcnknKSAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAvL+afpeivouadoeS7tuWtl+autQogICAgICAgICAgICAgICAgICBmaWVsZFF1ZXJ5TWFwWyQoc2VhcmNoSXRlbXNbaV0pLmNoaWxkcmVuKCkuYXR0cignaHQtcXVlcnknKV0gPSB0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuY2hpbGRyZW4oKS5hdHRyKCdzcGVjaWFsLXF1ZXJ5JykgIT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmaWVsZFF1ZXJ5TWFwOwogICAgICAgICAgfSwKICAgICAgICAgIGdldENvbmRpdGlvblF1ZXJ5OiBmdW5jdGlvbiBnZXRDb25kaXRpb25RdWVyeSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzOCA9IHRoaXM7CiAgICAgICAgICAgIHZhciBzZWFyY2hBbGwgPSAkKCcuc2VhcmNoLXF1ZXJ5Jyk7CiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSAnJzsKICAgICAgICAgICAgdmFyIHF1ZXJ5cyA9IFtdOyAvL+afpeivouadoeS7tgogICAgICAgICAgICB2YXIgcXVlcnlGaWx0ZXIgPSB7fTsKICAgICAgICAgICAgdmFyIHBhZ2VCZWFuID0gewogICAgICAgICAgICAgIHBhZ2VCZWFuOiB0aGlzLnBhZ2luYXRpb24KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHsKICAgICAgICAgICAgICB0ZW1wbGF0ZUlkOiB0aGlzLnRlbXBsYXRlSW5mby5pZAogICAgICAgICAgICB9OwogICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbiA9IHBhZ2VCZWFuOwoKICAgICAgICAgICAgLy8g5bCG6L+H5ruk5p2h5Lu25re75Yqg5p+l6K+i5Y+C5pWw5pWw57uE5LitCiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnMgJiYgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgdmFyIHByZWZpeCA9IHRoaXMudGVtcGxhdGVJbmZvLmlzRXh0ZXJuYWwgPT09IDEgPyAnJyA6ICdGXyc7CiAgICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgICAgICB2YXIgZmlsdGVyID0gX3RoaXM4LmZpbHRlcnNba107CiAgICAgICAgICAgICAgICB2YXIgcXVlcnkgPSB7CiAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBwcmVmaXggKyBrLAogICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyWzBdLAogICAgICAgICAgICAgICAgICBncm91cDogJ2ZpbHRlcicsCiAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgcXVlcnkub3BlcmF0aW9uID0gJ0VRVUFMJzsKICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2gocXVlcnkpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXIubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICBxdWVyeS5vcGVyYXRpb24gPSAnSU4nOwogICAgICAgICAgICAgICAgICBxdWVyeS52YWx1ZSA9IGZpbHRlcjsKICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2gocXVlcnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5Rm9ybS5xdWVyeURhdGEgPT0gJycpIHsKICAgICAgICAgICAgICBxdWVyeUZpbHRlciA9IHsKICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiB0aGlzLnBhZ2luYXRpb24sCiAgICAgICAgICAgICAgICBxdWVyeXM6IHF1ZXJ5cwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24gPSBxdWVyeUZpbHRlcjsKICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmICh0eXBlb2YgJCgkKHNlYXJjaEFsbFswXSkuY2hpbGRyZW4oKVswXSkuYXR0cignaHQtcXVpY2stc2VhcmNoJykgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgIHZhbHVlcyA9ICQoJChzZWFyY2hBbGxbMF0pLmNoaWxkcmVuKClbMF0pLmF0dHIoJ2h0LXF1aWNrLXNlYXJjaCcpOwogICAgICAgICAgICAgICAgdmFyIGFyciA9IHZhbHVlcy5zcGxpdCgnLCcpOwogICAgICAgICAgICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGFyciksCiAgICAgICAgICAgICAgICAgIF9zdGVwOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBfc3RlcC52YWx1ZTsKICAgICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5xdWVyeUZvcm0ucXVlcnlEYXRhLAogICAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywKICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0xJS0UnLAogICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdPUicKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgIF9pdGVyYXRvci5lKGVycik7CiAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICBfaXRlcmF0b3IuZigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBxdWVyeUZpbHRlciA9IHsKICAgICAgICAgICAgICBwYWdlQmVhbjogdGhpcy5wYWdpbmF0aW9uLAogICAgICAgICAgICAgIHF1ZXJ5czogcXVlcnlzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uID0gcXVlcnlGaWx0ZXI7CiAgICAgICAgICAgIHJldHVybiBwYXJhbXM7CiAgICAgICAgICB9LAogICAgICAgICAgLy/miZPlvIDpq5jnuqfmo4DntKIKICAgICAgICAgIGFkdmFuY2VkOiBmdW5jdGlvbiBhZHZhbmNlZCgpIHsKICAgICAgICAgICAgdGhpcy5mb3JtVHlwZSA9ICF0aGlzLmZvcm1UeXBlOwogICAgICAgICAgICBpZiAodGhpcy5mb3JtVHlwZSkgewogICAgICAgICAgICAgIHRoaXMuaW5jb25zID0gJ2VsLWljb24tYXJyb3ctdXAnOwogICAgICAgICAgICAgIHRoaXMucXVlcnlGb3JtLnF1ZXJ5RGF0YSA9ICcnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuaW5jb25zID0gJ2VsLWljb24tYXJyb3ctZG93bic7CiAgICAgICAgICAgICAgdGhpcy5zZWFyY2hGb3JtID0ge307CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAvL+Wbnui9puafpeivogogICAgICAgICAgc2VhcmNoRW50ZXJGdW46IGZ1bmN0aW9uIHNlYXJjaEVudGVyRnVuKGUpIHsKICAgICAgICAgICAgdmFyIGtleUNvZGUgPSB3aW5kb3cuZXZlbnQgPyBlLmtleUNvZGUgOiBlLndoaWNoOwogICAgICAgICAgICBpZiAoa2V5Q29kZSA9PSAxMykgewogICAgICAgICAgICAgIHRoaXMuc2VhcmNoKCdmaW5kJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoZmxhZykgewogICAgICAgICAgICB0aGlzLnF1ZXJ5Rm9ybS5xdWVyeURhdGEgPSAnJzsKICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvLmNvbmRpdGlvbkZpZWxkKSB7CiAgICAgICAgICAgICAgdmFyIGNvbmRpdGlvbkZpZWxkID0gdXRpbHMucGFyc2VUb0pzb24odGhpcy50ZW1wbGF0ZUluZm8uY29uZGl0aW9uRmllbGQpOwogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZGl0aW9uRmllbGQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZE5hbWUgPSAnRl8nICsgY29uZGl0aW9uRmllbGRbaV0ubmFtZTsKICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLnNlYXJjaEZvcm0sIGZpZWxkTmFtZSwgJycpOwogICAgICAgICAgICAgICAgdGhpcy4kc2V0KHRoaXMuc2VhcmNoRm9ybSwgY29uZGl0aW9uRmllbGRbaV0ubmFtZSwgJycpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSB7fTsKICAgICAgICAgICAgdGhpcy4kcmVmcy5tdWx0aXBsZVRlbXBsYXRlVGFibGUuY2xlYXJGaWx0ZXIoKTsKICAgICAgICAgICAgaWYgKCFmbGFnKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWFyY2goJ2ZpbmQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGhhbmRsZVNlbGVjdGlvbkNoYW5nZTogZnVuY3Rpb24gaGFuZGxlU2VsZWN0aW9uQ2hhbmdlKHZhbCkgewogICAgICAgICAgICB0aGlzLnRhYmxlRGF0YS5zZWxlY3RSb3dzID0gdmFsOwogICAgICAgICAgfSwKICAgICAgICAgIGRlbGV0ZWQ6IGZ1bmN0aW9uIGRlbGV0ZWQoKSB7CiAgICAgICAgICAgIHZhciBfdGhpczkgPSB0aGlzOwogICAgICAgICAgICBpZiAodGhpcy50YWJsZURhdGEuc2VsZWN0Um93cyA9PSBudWxsIHx8IHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3MubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoJ+ivt+mAieaLqeaWh+S7tuWIoOmZpCEnKTsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy4kY29uZmlybSgn5q2k5pON5L2c5bCG5Yig6Zmk6K+l5paH5Lu2LCDmmK/lkKbnu6fnu60/JywgJ+aPkOekuicsIHsKICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsCiAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsCiAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnCiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHZhciBzID0gW107CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfdGhpczkudGFibGVEYXRhLnNlbGVjdFJvd3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHMucHVzaChfdGhpczkudGFibGVEYXRhLnNlbGVjdFJvd3NbaV1bX3RoaXM5LnRlbXBsYXRlSW5mby5wa0ZpZWxkXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICAgICAgaWRzOiBzLmpvaW4oJywnKSwKICAgICAgICAgICAgICAgIGJvQWxpYXM6IF90aGlzOS50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhcwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgX3RoaXM5LiRzdG9yZS5kaXNwYXRjaCgnZm9ybS9kZWxldGVUZW1wbGF0ZURhdGFCeUlkJywgZGF0YSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfdGhpczkucGFnaW5hdGlvbi5wYWdlID0gMTsKICAgICAgICAgICAgICAgIF90aGlzOS5zZWFyY2goKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIF90aGlzOS4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5bey5Y+W5raI5Yig6ZmkJwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBkZWw6IGZ1bmN0aW9uIGRlbChpZCkgewogICAgICAgICAgICB2YXIgX3RoaXMxMCA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMuJGNvbmZpcm0oJ+atpOaTjeS9nOWwhuWIoOmZpOivpeaVsOaNriwg5piv5ZCm57un57utPycsICfmj5DnpLonLCB7CiAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfnoa7lrponLAogICAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICflj5bmtognLAogICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJwogICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgZGF0YSA9IHsKICAgICAgICAgICAgICAgIGlkczogaWQsCiAgICAgICAgICAgICAgICBib0FsaWFzOiBfdGhpczEwLnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBfdGhpczEwLiRzdG9yZS5kaXNwYXRjaCgnZm9ybS9kZWxldGVUZW1wbGF0ZURhdGFCeUlkJywgZGF0YSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfdGhpczEwLnBhZ2luYXRpb24ucGFnZSA9IDE7CiAgICAgICAgICAgICAgICBfdGhpczEwLnNlYXJjaCgpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgX3RoaXMxMC4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5bey5Y+W5raI5Yig6ZmkJwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBvcGVyYXRpbmc6IGZ1bmN0aW9uIG9wZXJhdGluZyh0ZW1wbGF0ZUlkLCBpZCwgYWN0aW9uLCBkZWZJZCwgaXNTdGFydEZsb3csIG9wZW5UeXBlKSB7CiAgICAgICAgICAgIC8vaXNTdGFydEZsb3cg77yIZmFsc2XvvJrlj6/ku6Xlj5HotbfmtYHnqIvvvIx0cnVl77ya5LiN5Y+v5Lul5Y+R6LW35rWB56iL77yJCiAgICAgICAgICAgIGlmICh0aGlzLnRlbXBsYXRlSW5mby5tYW5hZ2VGaWVsZCAmJiAhaXNTdGFydEZsb3cpIHsKICAgICAgICAgICAgICAvL+WFiOmFjee9ruS4jeiDveWPkei1t+a1geeoiwogICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gJ2FkZCcgJiYgaXNTdGFydEZsb3cgPT0gJycpIHsKICAgICAgICAgICAgICAgIGlzU3RhcnRGbG93ID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSAnZWRpdCcgJiYgaXNTdGFydEZsb3cgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBpc1N0YXJ0RmxvdyA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8v5YaN5Yik5pat5piv5ZCm5Y+v5Lul5Y+R6LW35rWB56iLCiAgICAgICAgICAgICAgdmFyIG1hbmFnZUZpZWxkID0gSlNPTi5wYXJzZSh0aGlzLnRlbXBsYXRlSW5mby5tYW5hZ2VGaWVsZCk7CiAgICAgICAgICAgICAgLy/liKTmlq3mmK/lkKbphY3nva7kuoblj5HotbfmtYHnqIvmjInpkq4KICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IG1hbmFnZUZpZWxkLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09ICdhZGQnICYmIG1hbmFnZUZpZWxkW2tdLm5hbWUgPT0gJ3N0YXJ0RmxvdycpIHsKICAgICAgICAgICAgICAgICAgaXNTdGFydEZsb3cgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSAnZWRpdCcgJiYgbWFuYWdlRmllbGRba10ubmFtZSA9PSAnc3RhcnRGbG93JykgewogICAgICAgICAgICAgICAgICBpc1N0YXJ0RmxvdyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgdGVtcGxhdGVJZCA9IHRoaXMudGVtcGxhdGVJbmZvLmlkOwogICAgICAgICAgICAgIGFjdGlvbiA9IGFjdGlvbiA9PSAnc2VsZWN0JyA/ICdnZXQnIDogJ2FkZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy/mlbDmja7op4blm77pmo/mnLrmt7vliqDliLDlhbbku5boj5zljZXkuIvpnaLml7bojrflj5blvZPliY3oj5zljZXnmoTliKvlkI0gIOW5tuS4lOW9k+WJjeaVsOaNruinhuWbvuS4jeaYr+ihqOWNlemHjOeahOaVsOaNruinhuWbviAgZGF0YVZpZXcKICAgICAgICAgICAgaWYgKHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXMgJiYgIXRoaXMuZGF0YVZpZXcgJiYgIXRoaXMuaWdub3JlZEFsaWFzLmluY2x1ZGVzKHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXMpKSB7CiAgICAgICAgICAgICAgdGhpcy5hbGlhc19uZXcgPSBzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB1cmwgPSAnLycgKyB0aGlzLmFsaWFzX25ldyArICcvdGVtcGxhdGUvZm9ybS8nICsgdGhpcy50ZW1wbGF0ZUtleSArICcvJyArIGFjdGlvbjsKICAgICAgICAgICAgaWYgKHRoaXMuaXNKb2luRmxvdykgewogICAgICAgICAgICAgIHRoaXMuYWxpYXNfbmV3ID0gJ3N0YXRlbWVudCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuc2luZ2xlID09ICd0cnVlJykgewogICAgICAgICAgICAgIHVybCA9ICcvJyArIHRoaXMuYWxpYXNfbmV3ICsgJy90ZW1wbGF0ZS9mb3JtLycgKyB0aGlzLnRlbXBsYXRlS2V5ICsgJy8nICsgYWN0aW9uICsgJy90cnVlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL+WIpOaWreaVsOaNruinhuWbvuaOp+S7tgogICAgICAgICAgICB2YXIgaXNEYXRhVmlldyA9IGZhbHNlOwogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgewogICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgJiYgdGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzICE9ICcnKSB7CiAgICAgICAgICAgICAgICBpc0RhdGFWaWV3ID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG9wZW5UeXBlID09ICduZXcnIHx8IHRoaXMuaXNKb2luRmxvdyB8fCBpc0RhdGFWaWV3KSB7CiAgICAgICAgICAgICAgdXJsICs9ICcvbmV3JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaWQpIHsKICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAnP2lkPScgKyBpZCArICcmJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB1cmwgKz0gJz8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGFydEZsb3dTdHIgPSAnc3RhcnRGbG93PWZhbHNlJzsKICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSAnYWRkJyAmJiBkZWZJZCAmJiBpc1N0YXJ0RmxvdyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICBzdGFydEZsb3dTdHIgPSAnc3RhcnRGbG93PXRydWUnOwogICAgICAgICAgICB9IGVsc2UgaWYgKGlkICYmIGlzU3RhcnRGbG93ID09PSBmYWxzZSAmJiBkZWZJZCkgewogICAgICAgICAgICAgIHN0YXJ0Rmxvd1N0ciA9ICdzdGFydEZsb3c9dHJ1ZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGRhdGFVcmwgPSAnJzsKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcpIHsKICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldy5iaW5kTGlzdCAmJiB0aGlzLmRhdGFWaWV3LmJpbmRMaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHZhciBiaW5kTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGFWaWV3LmJpbmRMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gewogICAgICAgICAgICAgICAgICAgIGtleTogdGhpcy5kYXRhVmlldy5iaW5kTGlzdFtpXS5iaW5kRmlsbGQsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZGF0YVZpZXcuYmluZExpc3RbaV0uZmlsbFZhbHVlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIGJpbmRMaXN0LnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkYXRhVXJsID0gJyZiaW5kTGlzdD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KEJhc2U2NC5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoYmluZExpc3QpKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwYXRoID0gdXJsICsgc3RhcnRGbG93U3RyOwogICAgICAgICAgICBpZiAoZGF0YVVybCAhPSAnJykgewogICAgICAgICAgICAgIHBhdGggPSB1cmwgKyBzdGFydEZsb3dTdHIgKyBkYXRhVXJsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlYnVnZ2VyOwogICAgICAgICAgICAvL1RPRE8g5aaC5p6c5piv5qih5Z2X5byA5Y+RIOWFqOmDqOW3suaWsOeql+WPo+aJk+W8gAogICAgICAgICAgICBpZiAob3BlblR5cGUgPT0gJ25ldycgfHwgdGhpcy5pc0pvaW5GbG93IHx8IGlzRGF0YVZpZXcpIHsKICAgICAgICAgICAgICB3aW5kb3cub3Blbih0aGlzLiRyb3V0ZXIucmVzb2x2ZShwYXRoLnJlcGxhY2UodGhpcy5hbGlhc19uZXcsICdzdGF0ZW1lbnQnKSArICcmaXNOZXdQYWdlPXRydWUnKS5ocmVmLCAnX2JsYW5rJyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWYgKHBhdGguaW5kZXhPZignb3RoZXJtZW51JykgIT0gLTEpIHsKICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoJy9vdGhlcm1lbnUnLCAnL3N0YXRlbWVudCcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaChwYXRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIG9wZW5Vcmw6IGZ1bmN0aW9uIG9wZW5VcmwodXJsLCB0eXBlLCByb3csIGZpZWxkTmFtZSkgewogICAgICAgICAgICBpZiAocm93ICYmIGZpZWxkTmFtZSkgewogICAgICAgICAgICAgIHVybCA9IHRoaXMuaGFuZGxlZFVybFBhcmFtcyh1cmwsIHJvdywgZmllbGROYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZSA9PSAnbmV3JykgewogICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgaGFuZGxlZFVybFBhcmFtczogZnVuY3Rpb24gaGFuZGxlZFVybFBhcmFtcyh1cmwsIHJvdywgZmllbGROYW1lKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnRlbXBsYXRlSW5mby5kaXNwbGF5RmllbGQpIHsKICAgICAgICAgICAgICB2YXIgZGlzcGxheUZpZWxkcyA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8uZGlzcGxheUZpZWxkKTsKICAgICAgICAgICAgICBkaXNwbGF5RmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGRpc3BsYXkpIHsKICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5Lm5hbWUgPT0gZmllbGROYW1lKSB7CiAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5LnVybFBhcmFtcyAmJiBkaXNwbGF5LnVybFBhcmFtcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVybFBhcmFtcyA9IGRpc3BsYXkudXJsUGFyYW1zOwogICAgICAgICAgICAgICAgICAgIHZhciBzdWZmaXggPSAnJzsKICAgICAgICAgICAgICAgICAgICB1cmxQYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHsKICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWZmaXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ICs9ICcmJzsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHN1ZmZpeCArIHBhcmFtLm5hbWUgKyAnPScgKyByb3dbcGFyYW0uZmllbGRdOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGlmIChzdWZmaXgpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZignPycpICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHVybCArICcmJyArIHN1ZmZpeDsKICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHVybCArICc/JyArIHN1ZmZpeDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHJldHVybiB1cmw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHVybDsKICAgICAgICAgIH0sCiAgICAgICAgICB2aWV3UmVwb3J0OiBmdW5jdGlvbiB2aWV3UmVwb3J0KGRhdGEsIGpzb25TdHIsIG9wZW5UeXBlKSB7CiAgICAgICAgICAgIHZhciBpdGVtID0gSlNPTi5wYXJzZShCYXNlNjQuZGVjb2RlKGpzb25TdHIpKTsKICAgICAgICAgICAgdmFyIGNvbmRpdGlvbkZpZWxkID0gaXRlbS5jb25kaXRpb25GaWVsZDsKICAgICAgICAgICAgdmFyIHF1ZXJ5cyA9IFtdOwogICAgICAgICAgICBpZiAoY29uZGl0aW9uRmllbGQgJiYgY29uZGl0aW9uRmllbGQubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIGNvbmRpdGlvbkZpZWxkLmZvckVhY2goZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICAgICAgaWYgKG9iai5wYXJhbWV0ZXIpIHsKICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2goewogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBvYmoua2V5LAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhW29iai5wYXJhbWV0ZXJdLAogICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsCiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBvYmoucXQsCiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnCiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8v5pWw5o2u6ZqP5py65re75Yqg5Yiw5YW25LuW6I+c5Y2V5LiL6Z2i5pe26I635Y+W5b2T5YmN6I+c5Y2V55qE5Yir5ZCNCiAgICAgICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzKSB7CiAgICAgICAgICAgICAgdGhpcy5hbGlhc19uZXcgPSBzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB1cmwgPSAnLycgKyB0aGlzLmFsaWFzX25ldyArICcvdGVtcGxhdGUvcHJldmlldy8nICsgaXRlbS5hbGlhcyArICcvZmFsc2UvJyArIGVuY29kZVVSSUNvbXBvbmVudChCYXNlNjQuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHF1ZXJ5cykpKTsKICAgICAgICAgICAgLy91cmwg6L2s56CB6Ziy5q2i5pyJ5pac5p2gIOWvvOiHtOi3r+eUsei3s+i9rOS4jeWvuQogICAgICAgICAgICBpZiAob3BlblR5cGUgPT0gJ25ldycpIHsKICAgICAgICAgICAgICB3aW5kb3cub3Blbih0aGlzLiRyb3V0ZXIucmVzb2x2ZSh1cmwpLmhyZWYsICdfYmxhbmsnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCh1cmwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgc3RhcnRGbG93OiBmdW5jdGlvbiBzdGFydEZsb3coaWQpIHsKICAgICAgICAgICAgdmFyIF90aGlzMTEgPSB0aGlzOwogICAgICAgICAgICB2YXIgZGF0YSA9IHsKICAgICAgICAgICAgICBkZWZLZXk6IHRoaXMudGVtcGxhdGVJbmZvLmRlZklkLAogICAgICAgICAgICAgIGJ1c2luZXNzS2V5OiBpZCwKICAgICAgICAgICAgICBib0FsaWFzOiB0aGlzLnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBsb2FkaW5nSW5zdGFuY2UgPSBMb2FkaW5nLnNlcnZpY2UoewogICAgICAgICAgICAgIGZ1bGxzY3JlZW46IHRydWUKICAgICAgICAgICAgfSk7IC8v5byA5aeLCiAgICAgICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdzdG9yZVByb2Nlc3Mvc3RhcnRGb3JtJywgZGF0YSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgbG9hZGluZ0luc3RhbmNlLmNsb3NlKCk7IC8vIOe7k+adnwogICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdGUpIHsKICAgICAgICAgICAgICAgIF90aGlzMTEuJG1lc3NhZ2Uuc3VjY2VzcyhyZXN1bHQubWVzc2FnZSk7CiAgICAgICAgICAgICAgICBfdGhpczExLnNlYXJjaCgpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBfdGhpczExLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBfdGhpczExLiRtZXNzYWdlLmVycm9yKHJlc3VsdC5tZXNzYWdlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIC8v54K55Ye75a+85Ye65oyJ6ZKuCiAgICAgICAgICBleHBvcnRzOiBmdW5jdGlvbiBleHBvcnRzKGV4cG9ydFNldHRpbmdGaWVsZHMpIHsKICAgICAgICAgICAgdmFyIF90aGlzMTIgPSB0aGlzOwogICAgICAgICAgICB2YXIgZGlzcGxheUZpZWxkcyA9IFtdOwogICAgICAgICAgICBpZiAoZXhwb3J0U2V0dGluZ0ZpZWxkcykgewogICAgICAgICAgICAgIGRpc3BsYXlGaWVsZHMgPSBKU09OLnBhcnNlKEJhc2U2NC5kZWNvZGUoZXhwb3J0U2V0dGluZ0ZpZWxkcykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkaXNwbGF5RmllbGRzLmxlbmd0aCA9PSAwICYmIHRoaXMudGVtcGxhdGVJbmZvLmRpc3BsYXlGaWVsZCkgewogICAgICAgICAgICAgIGRpc3BsYXlGaWVsZHMgPSBKU09OLnBhcnNlKHRoaXMudGVtcGxhdGVJbmZvLmRpc3BsYXlGaWVsZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5leHBvcnRUeXBlID0gJ21haW4nOwogICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZHMgPSBbXTsKICAgICAgICAgICAgZGlzcGxheUZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSkgewogICAgICAgICAgICAgICAgX3RoaXMxMi5kaXNwbGF5RmllbGRzLnB1c2goaXRlbSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5kaWFsb2dFeHBvcnRWaXNpYmxlID0gdHJ1ZTsKICAgICAgICAgIH0sCiAgICAgICAgICBpbXBvcnRDb21tYW5kOiBmdW5jdGlvbiBpbXBvcnRDb21tYW5kKHBhcmFtcykgewogICAgICAgICAgICBzd2l0Y2ggKHBhcmFtcy5jb21tYW5kKSB7CiAgICAgICAgICAgICAgY2FzZSAnZG93bmxvYWRUZW1wRmlsZSc6CiAgICAgICAgICAgICAgICB0aGlzLmRvd25sb2FkTWFpblRlbXBGaWxlKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICdpbXBvcnRNYWluJzoKICAgICAgICAgICAgICAgIHRoaXMuaW1wb3J0TWFpbigpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAnbG9nJzoKICAgICAgICAgICAgICAgIHRoaXMub3BlbkxvZygpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgb3BlbkxvZzogZnVuY3Rpb24gb3BlbkxvZygpIHsKICAgICAgICAgICAgdGhpcy5kaWFsb2dWaXNpYmxlID0gdHJ1ZTsKICAgICAgICAgIH0sCiAgICAgICAgICBkb3dubG9hZE1haW5UZW1wRmlsZTogZnVuY3Rpb24gZG93bmxvYWRNYWluVGVtcEZpbGUoKSB7CiAgICAgICAgICAgIHZhciBjdXN0b21UZW1wbGF0ZUlkID0gJyc7CiAgICAgICAgICAgIGlmICh0aGlzLnRlbXBsYXRlSW5mbyAmJiB0aGlzLnRlbXBsYXRlSW5mby5tYW5hZ2VGaWVsZCkgewogICAgICAgICAgICAgIHZhciBtYW5hZ2VGaWVsZExpc3QgPSBKU09OLnBhcnNlKHRoaXMudGVtcGxhdGVJbmZvLm1hbmFnZUZpZWxkKTsKICAgICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbWFuYWdlRmllbGRMaXN0Lmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgICAgICAgICAgdmFyIG1hbmFnZSA9IG1hbmFnZUZpZWxkTGlzdFtpbmRleF07CiAgICAgICAgICAgICAgICBpZiAobWFuYWdlLm5hbWUgPT0gJ2ltcG9ydCcpIHsKICAgICAgICAgICAgICAgICAgaWYgKG1hbmFnZS5pbXBvcnRUZW1wbGF0ZSAmJiBtYW5hZ2UuaW1wb3J0VGVtcGxhdGUubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIGN1c3RvbVRlbXBsYXRlSWQgPSBtYW5hZ2UuaW1wb3J0VGVtcGxhdGVbMF0uaWQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjdXN0b21UZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ21lbnUvZG93bmxvYWRGaWxlJywgY3VzdG9tVGVtcGxhdGVJZCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdmFyIGxvYWRpbmdJbnN0YW5jZSA9IExvYWRpbmcuc2VydmljZSh7CiAgICAgICAgICAgICAgICBmdWxsc2NyZWVuOiB0cnVlCiAgICAgICAgICAgICAgfSk7IC8v5byA5aeLCiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vZG93bmxvYWRNYWluVGVtcEZpbGUnLCB0aGlzLnRlbXBsYXRlSW5mby5hbGlhcykudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBsb2FkaW5nSW5zdGFuY2UuY2xvc2UoKTsgLy8g57uT5p2fCiAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgICAgIGxvYWRpbmdJbnN0YW5jZS5jbG9zZSgpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgaW1wb3J0TWFpbjogZnVuY3Rpb24gaW1wb3J0TWFpbihwYXJhbSkgewogICAgICAgICAgICB2YXIgX3RoaXMxMyA9IHRoaXM7CiAgICAgICAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwogICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBwYXJhbS5maWxlKTsKICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHsKICAgICAgICAgICAgICBkYXRhOiBmb3JtRGF0YSwKICAgICAgICAgICAgICBhbGlhczogdGhpcy50ZW1wbGF0ZUluZm8uYWxpYXMKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcpIHsKICAgICAgICAgICAgICB0aGlzLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCk7CiAgICAgICAgICAgICAgcGFyYW1zLmJpbmRGaWxsZCA9IHRoaXMuZGF0YVZpZXcuYmluZEZpbGxkIHx8ICcnOwogICAgICAgICAgICAgIHBhcmFtcy5maWxsVmFsdWUgPSB0aGlzLmRhdGFWaWV3LmZpbGxWYWx1ZSB8fCAnJzsKICAgICAgICAgICAgICBwYXJhbXMucmVmSWRWYWx1ZSA9IHRoaXMuZGF0YVZpZXcucmVmSWRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbG9hZGluZ0luc3RhbmNlID0gTG9hZGluZy5zZXJ2aWNlKHsKICAgICAgICAgICAgICBmdWxsc2NyZWVuOiB0cnVlCiAgICAgICAgICAgIH0pOyAvL+W8gOWniwogICAgICAgICAgICBmb3JtLm1haW5JbXBvcnQocGFyYW1zLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgIGxvYWRpbmdJbnN0YW5jZS5jbG9zZSgpOyAvLyDnu5PmnZ8KICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0ZSkgewogICAgICAgICAgICAgICAgLy/lr7zlhaXmiJDlip/kuYvlkI7ph43mlrDmuLLmn5PlvZPliY3nu4Tku7YKICAgICAgICAgICAgICAgIF90aGlzMTMuJHBhcmVudC5yZWZyZXNoVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgX3RoaXMxMy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHBhcmFtLm9uU3VjY2VzcygpOwogICAgICAgICAgICAgICAgaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2Zvcm1JbXBvcnRUZW1wUmVmSWQnKSkgewogICAgICAgICAgICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2UoZGF0YS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgIGpzb24uYm9BbGlhcyA9IF90aGlzMTMuZGF0YVZpZXcuYm9EZWZBbGlhczsKICAgICAgICAgICAgICAgICAgdmFyIG9sZENvbmYgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdmb3JtSW1wb3J0VGVtcEpzb24nKTsKICAgICAgICAgICAgICAgICAgaWYgKCFvbGRDb25mKSB7CiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZm9ybUltcG9ydFRlbXBKc29uJywgSlNPTi5zdHJpbmdpZnkoW2pzb25dKSk7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9sZEpvc24gPSBKU09OLnBhcnNlKG9sZENvbmYpOwogICAgICAgICAgICAgICAgICAgIHZhciBpc0luT2xkSm9zbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBvbGRKb3NuLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgICAgICAgICAgICAgICAgdmFyIG9sZCA9IG9sZEpvc25baW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZC50YWJOYW1lID09IGpzb24udGFiTmFtZSAmJiBvbGQuYmluZEZpbGxkID09IGpzb24uYmluZEZpbGxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5PbGRKb3NuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghaXNJbk9sZEpvc24pIHsKICAgICAgICAgICAgICAgICAgICAgIG9sZEpvc24ucHVzaChqc29uKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZm9ybUltcG9ydFRlbXBKc29uJywgSlNPTi5zdHJpbmdpZnkob2xkSm9zbikpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfdGhpczEzLnNlYXJjaCgpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbS5vbkVycm9yKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+aYvuekuuWtkOihqOWvueivneahhgogICAgICAgICAgc2hvd1N1Ykxpc3Q6IGZ1bmN0aW9uIHNob3dTdWJMaXN0KHJlZklkKSB7CiAgICAgICAgICAgIHRoaXMucmVmSWQgPSByZWZJZDsKICAgICAgICAgICAgdGhpcy5nZXRTdWJFbnRzQnlGb3JtS2V5KHJlZklkKTsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+aYvuekuuS/ruaUueiusOW9lQogICAgICAgICAgb3BlblJlY29yZExpc3Q6IGZ1bmN0aW9uIG9wZW5SZWNvcmRMaXN0KHJlZklkKSB7CiAgICAgICAgICAgIHZhciBfdGhpczE0ID0gdGhpczsKICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWNvcmRWaXNpYmxlID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5yZWNvcmRSZWZJZCA9IHJlZklkOwogICAgICAgICAgICB2YXIgcGFyYW0gPSB7CiAgICAgICAgICAgICAgcGFnZUJlYW46IHsKICAgICAgICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgICAgICAgICBzaG93VG90YWw6IHRydWUKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHNvcnRlcjogW3sKICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogJ0FTQycsCiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ21vZGlmeVRpbWUnCiAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgcXVlcnlzOiBbewogICAgICAgICAgICAgICAgcHJvcGVydHk6ICdyZWZfaWRfJywKICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnJlY29yZFJlZklkLAogICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywKICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywKICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgICAgICAgIH1dCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMucmVjb3JkVGFibGVMb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgdmFyIHVybCA9ICcke2JwbVJ1blRpbWV9L2JwbS9ib0RhdGFNb2RpZnlSZWNvcmQvdjEvbGlzdEpzb24nOwogICAgICAgICAgICByZXEucG9zdCh1cmwsIHBhcmFtKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgICAgICAgX3RoaXMxNC5yZWNvcmRUYWJsZUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICBfdGhpczE0LnJlY29yZExpc3QgPSByZXNwLmRhdGEucm93czsKICAgICAgICAgICAgICBfdGhpczE0Lm1vZGlmeVJlY29yZC5wYWdpbmF0aW9uLnBhZ2VCZWFuID0gewogICAgICAgICAgICAgICAgcGFnZVNpemU6IHJlc3AuZGF0YS5wYWdlU2l6ZSwKICAgICAgICAgICAgICAgIHBhZ2U6IHJlc3AuZGF0YS5wYWdlLAogICAgICAgICAgICAgICAgdG90YWw6IHJlc3AuZGF0YS50b3RhbAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGhhbmRsZVJlY29yZEN1cnJlbnRDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZVJlY29yZEN1cnJlbnRDaGFuZ2UoaW5kZXgsIG1vZGlmeVJlY29yZCkgewogICAgICAgICAgICB2YXIgX3RoaXMxNSA9IHRoaXM7CiAgICAgICAgICAgIG1vZGlmeVJlY29yZC5wYWdpbmF0aW9uLnBhZ2VCZWFuLnBhZ2UgPSBpbmRleDsKICAgICAgICAgICAgdmFyIHBhcmFtID0gewogICAgICAgICAgICAgIHBhZ2VCZWFuOiBtb2RpZnlSZWNvcmQucGFnaW5hdGlvbi5wYWdlQmVhbiwKICAgICAgICAgICAgICBzb3J0ZXI6IFt7CiAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdBU0MnLAogICAgICAgICAgICAgICAgcHJvcGVydHk6ICdtb2RpZnlUaW1lJwogICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgIHF1ZXJ5czogW3sKICAgICAgICAgICAgICAgIHByb3BlcnR5OiAncmVmX2lkXycsCiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5yZWNvcmRSZWZJZCwKICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsCiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsCiAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgICAgICB9XQogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLnJlY29yZFRhYmxlTG9hZGluZyA9IHRydWU7CiAgICAgICAgICAgIHZhciB1cmwgPSAnJHticG1SdW5UaW1lfS9icG0vYm9EYXRhTW9kaWZ5UmVjb3JkL3YxL2xpc3RKc29uJzsKICAgICAgICAgICAgcmVxLnBvc3QodXJsLCBwYXJhbSkudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgICAgIF90aGlzMTUucmVjb3JkVGFibGVMb2FkaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgX3RoaXMxNS5yZWNvcmRMaXN0ID0gcmVzcC5kYXRhLnJvd3M7CiAgICAgICAgICAgICAgX3RoaXMxNS5tb2RpZnlSZWNvcmQucGFnaW5hdGlvbi5wYWdlQmVhbiA9IHsKICAgICAgICAgICAgICAgIHBhZ2VTaXplOiByZXNwLmRhdGEucGFnZVNpemUsCiAgICAgICAgICAgICAgICBwYWdlOiByZXNwLmRhdGEucGFnZSwKICAgICAgICAgICAgICAgIHRvdGFsOiByZXNwLmRhdGEudG90YWwKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+WPlua2iOS/ruaUueiusOW9leWvueivneahhgogICAgICAgICAgcmVjb3JkQ2FuY2VsOiBmdW5jdGlvbiByZWNvcmRDYW5jZWwoKSB7CiAgICAgICAgICAgIHRoaXMuZGlhbG9nUmVjb3JkVmlzaWJsZSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLnJlY29yZExpc3QgPSBbXTsKICAgICAgICAgICAgdGhpcy5yZWNvcmRSZWZJZCA9ICcnOwogICAgICAgICAgICB0aGlzLm1vZGlmeVJlY29yZCA9IHsKICAgICAgICAgICAgICBwYWdpbmF0aW9uOiB7CiAgICAgICAgICAgICAgICBwYWdlQmVhbjogewogICAgICAgICAgICAgICAgICBwYWdlOiAxLAogICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgICAgICAgICAgIHRvdGFsOiAwCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgfSwKICAgICAgICAgIC8vCiAgICAgICAgICBvcGVuTW9kaWZ5RGV0YWlsOiBmdW5jdGlvbiBvcGVuTW9kaWZ5RGV0YWlsKHJvdykgewogICAgICAgICAgICB0aGlzLmN1cnJlbnRNb2RpZnkgPSByb3c7CiAgICAgICAgICAgIHRoaXMubW9kaWZ5RGV0YWlsRGlhbG9nVmlzaWJsZSA9IHRydWU7CiAgICAgICAgICB9LAogICAgICAgICAgLy/mn6XnnIvkv67mlLnorrDlvZXor6bmg4UKICAgICAgICAgIHNob3dNb2RpZnlSZWNvcmQ6IGZ1bmN0aW9uIHNob3dNb2RpZnlSZWNvcmQoaWQsIHJlZklkKSB7CiAgICAgICAgICAgIHZhciB1cmwgPSAnL3N0YXRlbWVudC90ZW1wbGF0ZS9mb3JtLycgKyB0aGlzLnRlbXBsYXRlS2V5ICsgJy9nZXQvdHJ1ZScgKyAnP2lkPScgKyByZWZJZCArICcmc3RhcnRGbG93PWZhbHNlJnJlY29yZElkPScgKyBpZCArICcmaXNOZXdQYWdlPXRydWUnOwogICAgICAgICAgICB3aW5kb3cub3Blbih0aGlzLiRyb3V0ZXIucmVzb2x2ZSh1cmwpLmhyZWYsICdfYmxhbmsnKTsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+ehruWumuWvvOWHugogICAgICAgICAgc3VibWl0RXhwb3J0OiBmdW5jdGlvbiBzdWJtaXRFeHBvcnQoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5leHBvcnREYXRhIHx8IHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZC5sZW5ndGggPCAxKSB7CiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiAn6K+36YCJ5oup6KaB5a+85Ye655qE5a2X5q6177yBJwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5leHBvcnRUeXBlID09PSAnbWFpbicpIHRoaXMuZXhwb3J0TWFpbigpO2Vsc2UgdGhpcy5leHBvcnRTdWJEYXRhKHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZCwgdGhpcy5yZWZJZCwgdGhpcy5jdXJyZW50VGFiLmVudE5hbWUpOwogICAgICAgICAgfSwKICAgICAgICAgIGV4cG9ydE1haW46IGZ1bmN0aW9uIGV4cG9ydE1haW4oKSB7CiAgICAgICAgICAgIHZhciBfdGhpczE2ID0gdGhpczsKICAgICAgICAgICAgdmFyIGV4cEZpZWxkID0gJyc7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7CiAgICAgICAgICAgICAgICBleHBGaWVsZCArPSAnLCc7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGV4cEZpZWxkICs9IHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZFtpXS5uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGV4cEZpZWxkID0gQmFzZTY0LmVuY29kZShleHBGaWVsZCk7CiAgICAgICAgICAgIHZhciBkYXRhID0gewogICAgICAgICAgICAgIGJvQWxpYXM6IHRoaXMudGVtcGxhdGVJbmZvLmFsaWFzLAogICAgICAgICAgICAgIGdldFR5cGU6IHRoaXMuZXhwb3J0RGF0YS5nZXRUeXBlLAogICAgICAgICAgICAgIGV4cEZpZWxkOiBleHBGaWVsZCwKICAgICAgICAgICAgICBmaWx0ZXJLZXk6ICcnCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGRhdGEucXVlcnkgPSB0aGlzLmdldFF1ZXJ5RmlsdGVyKCkucGFnaW5hdGlvbjsKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcgJiYgdGhpcy5kYXRhVmlldy5iaW5kU2VsZWN0ZCkgewogICAgICAgICAgICAgIGRhdGEucXVlcnkucXVlcnlzLnB1c2goewogICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZGF0YVZpZXcuc2VsZWN0VmFsdWUsCiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsCiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ0ZfJyArIHRoaXMuZGF0YVZpZXcuYmluZFNlbGVjdGQKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbG9hZGluZ0luc3RhbmNlID0gTG9hZGluZy5zZXJ2aWNlKHsKICAgICAgICAgICAgICBmdWxsc2NyZWVuOiB0cnVlCiAgICAgICAgICAgIH0pOyAvL+W8gOWniwogICAgICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZm9ybS90ZW1wbGF0ZUV4cG9ydCcsIGRhdGEpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIGxvYWRpbmdJbnN0YW5jZS5jbG9zZSgpOyAvLyDnu5PmnZ8KICAgICAgICAgICAgICBfdGhpczE2LmRpYWxvZ0V4cG9ydFZpc2libGUgPSBmYWxzZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCB0aGlzLnN1YkRpc3BsYXlGaWVsZHNMaXN0Lmxlbmd0aDsgX2krKykgewogICAgICAgICAgICAgIHRoaXMuZXhwb3J0U3ViRGF0YSh0aGlzLiRyZWZzWydzdWJFeHBvcnRUYWJsZSddW19pXS5zZWxlY3Rpb24sICcnLCB0aGlzLnN1YkRpc3BsYXlGaWVsZHNMaXN0W19pXS5uYW1lKTsKICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy4kcmVmc1snc3ViRXhwb3J0VGFibGUnXVtfaV0sICdzZWxlY3Rpb24nLCBbXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBleHBvcnRTdWJEYXRhOiBmdW5jdGlvbiBleHBvcnRTdWJEYXRhKGV4cEZpZWxkcywgcmVmSWQsIGFsaWFzKSB7CiAgICAgICAgICAgIHZhciBfdGhpczE3ID0gdGhpczsKICAgICAgICAgICAgdmFyIGV4cEZpZWxkID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwRmllbGRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgZXhwRmllbGQucHVzaCh7CiAgICAgICAgICAgICAgICBrZXk6IGV4cEZpZWxkc1tpXS5uYW1lLAogICAgICAgICAgICAgICAgdmFsdWU6IGV4cEZpZWxkc1tpXS5kZXNjCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGRhdGEgPSB7CiAgICAgICAgICAgICAgYWxpYXM6IGFsaWFzLAogICAgICAgICAgICAgIHJlZklkOiByZWZJZCwKICAgICAgICAgICAgICB0eXBlOiB0aGlzLmV4cG9ydERhdGEuZ2V0VHlwZSwKICAgICAgICAgICAgICBleHBGaWVsZDogSlNPTi5zdHJpbmdpZnkoZXhwRmllbGQpLAogICAgICAgICAgICAgIGZpbHRlcktleTogJycKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZGF0YS5xdWVyeUZpbHRlciA9IHRoaXMuY3VycmVudFRhYi5wYWdpbmF0aW9uOwogICAgICAgICAgICB2YXIgbG9hZGluZ0luc3RhbmNlID0gTG9hZGluZy5zZXJ2aWNlKHsKICAgICAgICAgICAgICBmdWxsc2NyZWVuOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBmb3JtLnN1YkV4cG9ydChkYXRhLCBmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgICAgIGxvYWRpbmdJbnN0YW5jZS5jbG9zZSgpOwogICAgICAgICAgICAgIF90aGlzMTcuZGlhbG9nRXhwb3J0VmlzaWJsZSA9IGZhbHNlOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+WPlua2iOWvvOWHugogICAgICAgICAgZXhwb3J0Q2FuY2VsOiBmdW5jdGlvbiBleHBvcnRDYW5jZWwoKSB7CiAgICAgICAgICAgIHRoaXMuZGlhbG9nRXhwb3J0VmlzaWJsZSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmV4cG9ydERhdGEuZXhwRmllbGQgPSBbXTsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+WPlua2iOWtkOihqOWvueivneahhgogICAgICAgICAgc3ViQ2FuY2VsOiBmdW5jdGlvbiBzdWJDYW5jZWwoKSB7CiAgICAgICAgICAgIHRoaXMuZGlhbG9nU3ViVmlzaWJsZSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLnRhYnMgPSBbXTsKICAgICAgICAgICAgdGhpcy5lbnRzID0gW107CiAgICAgICAgICB9LAogICAgICAgICAgc3VuQ2FuY2VsOiBmdW5jdGlvbiBzdW5DYW5jZWwoKSB7CiAgICAgICAgICAgIHRoaXMuZGlhbG9nU3VuVmlzaWJsZSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLnN1blRhYnMgPSBbXTsKICAgICAgICAgIH0sCiAgICAgICAgICBoYW5kbGVFeHBvcnRTZWxlY3Rpb25DaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZUV4cG9ydFNlbGVjdGlvbkNoYW5nZSh2YWwpIHsKICAgICAgICAgICAgdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkID0gW107CiAgICAgICAgICAgIGlmICh2YWwpIHsKICAgICAgICAgICAgICB0aGlzLmV4cG9ydERhdGEuZXhwRmllbGQgPSB2YWw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAvL+WFqOmAiQogICAgICAgICAgaGFuZGxlRXhwb3J0U2VsZWN0QWxsOiBmdW5jdGlvbiBoYW5kbGVFeHBvcnRTZWxlY3RBbGwoKSB7CiAgICAgICAgICAgIHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZCA9IHRoaXMuZGlzcGxheUZpZWxkczsKICAgICAgICAgIH0sCiAgICAgICAgICAvL+aOkuW6jwogICAgICAgICAgc29ydDogZnVuY3Rpb24gc29ydChpbmRleCwgdHlwZSkgewogICAgICAgICAgICBpZiAoJ3VwJyA9PSB0eXBlKSB7CiAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ+W3sue7j+aYr+WIl+ihqOS4reesrOS4gOS9jScsCiAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciB0ZW1wID0gdGhpcy5kaXNwbGF5RmllbGRzW2luZGV4IC0gMV07CiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5kaXNwbGF5RmllbGRzLCBpbmRleCAtIDEsIHRoaXMuZGlzcGxheUZpZWxkc1tpbmRleF0pOwogICAgICAgICAgICAgICAgdGhpcy4kc2V0KHRoaXMuZGlzcGxheUZpZWxkcywgaW5kZXgsIHRlbXApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuZGlzcGxheUZpZWxkcy5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ+W3sue7j+aYr+WIl+ihqOS4reacgOWQjuS4gOS9jScsCiAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuaXNUcmFuc2l0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5kaXNwbGF5RmllbGRzW2luZGV4ICsgMV07CiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5kaXNwbGF5RmllbGRzLCBpbmRleCArIDEsIHRoaXMuZGlzcGxheUZpZWxkc1tpbmRleF0pOwogICAgICAgICAgICAgICAgdGhpcy4kc2V0KHRoaXMuZGlzcGxheUZpZWxkcywgaW5kZXgsIGkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGdldFN1bkRhdGE6IGZ1bmN0aW9uIGdldFN1bkRhdGEodGFiLCByb3cpIHsKICAgICAgICAgICAgdmFyIF90aGlzMTggPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7CiAgICAgICAgICAgICAgdmFyIGVudHMsIHBrLCByZWZJZCwgaSwgX3RhYjsKICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKICAgICAgICAgICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICBlbnRzID0gdGFiLmNoaWxkRW50czsKICAgICAgICAgICAgICAgICAgICBwayA9IHRhYi5wa0tleTsKICAgICAgICAgICAgICAgICAgICByZWZJZCA9ICcnOwogICAgICAgICAgICAgICAgICAgIGlmIChyb3dbcGsudG9Mb2NhbGVMb3dlckNhc2UoKV0pIHsKICAgICAgICAgICAgICAgICAgICAgIHJlZklkID0gcm93W3BrLnRvTG9jYWxlTG93ZXJDYXNlKCldOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICByZWZJZCA9IHJvd1tway50b1VwcGVyQ2FzZSgpXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX3RoaXMxOC5zdWJUYWJsZUxvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGlmICghKGVudHMgJiYgZW50cy5sZW5ndGggPiAwKSkgewogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE1OwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGkgPSAwOwogICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoaSA8IGVudHMubGVuZ3RoKSkgewogICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE1OwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMxOC5nZXRCb0RhdGEoZW50c1tpXSwgcmVmSWQpOwogICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgIF90YWIgPSBfY29udGV4dC5zZW50OwogICAgICAgICAgICAgICAgICAgIF90aGlzMTguc3VuVGFicy5wdXNoKF90YWIpOwogICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICBfdGhpczE4LnN1YlRhYmxlTG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIF90aGlzMTguZGlhbG9nU3VuVmlzaWJsZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LCBfY2FsbGVlKTsKICAgICAgICAgICAgfSkpKCk7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0Qm9EYXRhOiBmdW5jdGlvbiBnZXRCb0RhdGEoZW50LCByZWZJZCkgewogICAgICAgICAgICB2YXIgX3RoaXMxOSA9IHRoaXM7CiAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVMaXN0ID0gZW50LmF0dHJpYnV0ZUxpc3Q7CiAgICAgICAgICAgIHZhciB0YWIgPSB7CiAgICAgICAgICAgICAgcmVmSWQ6IHJlZklkLAogICAgICAgICAgICAgIHBrS2V5OiBlbnQucGtLZXksCiAgICAgICAgICAgICAgbmFtZTogZW50LnRhYmxlTmFtZSwKICAgICAgICAgICAgICBlbnROYW1lOiBlbnQubmFtZSwKICAgICAgICAgICAgICB0aXRsZTogZW50LmNvbW1lbnQsCiAgICAgICAgICAgICAgYXR0cmlidXRlTGlzdDogYXR0cmlidXRlTGlzdCwKICAgICAgICAgICAgICBjb21tZW50OiBlbnQuY29tbWVudCwKICAgICAgICAgICAgICBwYWdpbmF0aW9uOiB7CiAgICAgICAgICAgICAgICBwYWdlQmVhbjogewogICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICAgICAgICAgIHRvdGFsOiAwCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB0YWIuY2hpbGRFbnRzID0gW107CiAgICAgICAgICAgIGlmIChlbnQuY2hpbGRFbnRzICYmIGVudC5jaGlsZEVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIHRhYi5jaGlsZEVudHMgPSBlbnQuY2hpbGRFbnRzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgX3RoaXMxOS4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vZ2V0U3ViRGF0YVBhZ2luYXRpb24nLCB7CiAgICAgICAgICAgICAgICBwYWdpbmF0aW9uOiB0YWIucGFnaW5hdGlvbiwKICAgICAgICAgICAgICAgIG5hbWU6IGVudC5uYW1lLAogICAgICAgICAgICAgICAgcmVmSWQ6IHJlZklkCiAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgdGFiLmRhdGFMaXN0ID0gZGF0YS5yb3dzOwogICAgICAgICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbi5wYWdlU2l6ZSA9IGRhdGEucGFnZVNpemU7CiAgICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuLnBhZ2UgPSBkYXRhLnBhZ2U7CiAgICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuLnRvdGFsID0gZGF0YS50b3RhbDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHRhYi5kYXRhTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbi5wYWdlU2l6ZSA9IDE7CiAgICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuLnBhZ2UgPSAxOwogICAgICAgICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbi50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXNvbHZlKHRhYik7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGdldFN1YkVudHNCeUZvcm1LZXk6IGZ1bmN0aW9uIGdldFN1YkVudHNCeUZvcm1LZXkocmVmSWQpIHsKICAgICAgICAgICAgLyppZiAoIXRoaXMuZW50cyB8fCB0aGlzLmVudHMubGVuZ3RoIDwgMSkgew0KICAgICAgICAgICAgICBmb3JtLmdldFN1YkVudHNCeUZvcm1LZXkodGhpcy50ZW1wbGF0ZUluZm8uZm9ybUtleSwgKHJlc3ApID0+IHsNCiAgICAgICAgICAgICAgICAvLyDlrZDooajkuI7lrZnooajlrZfmrrXlkI3orr7nva7lsI/lhpkNCiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3AuZGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgcmVzcC5kYXRhW2ldLmF0dHJpYnV0ZUxpc3QuZm9yRWFjaChhdHRyaWJ1dGUgPT4gew0KICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZmllbGROYW1lID0gYXR0cmlidXRlLmZpZWxkTmFtZS50b0xvd2VyQ2FzZSgpOw0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgIHJlc3AuZGF0YVtpXS5jaGlsZEVudHMuZm9yRWFjaChzaG93Q2hpbGRFbnQgPT4gew0KICAgICAgICAgICAgICAgICAgICBzaG93Q2hpbGRFbnQuYXR0cmlidXRlTGlzdC5mb3JFYWNoKGF0dHJpYnV0ZSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmZpZWxkTmFtZSA9IGF0dHJpYnV0ZS5maWVsZE5hbWUudG9Mb3dlckNhc2UoKTsNCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoaXMuZW50cyA9IHJlc3AuZGF0YTsNCiAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9IGVsc2UgeyovCiAgICAgICAgICAgIHRoaXMuZ2V0U3ViRGF0YSh0aGlzLCByZWZJZCk7CiAgICAgICAgICAgIC8qIH0qLwogICAgICAgICAgfSwKICAgICAgICAgIGdldFN1YkRhdGE6IGZ1bmN0aW9uIGdldFN1YkRhdGEoX21lLCByZWZJZCkgewogICAgICAgICAgICB2YXIgX3RoaXMyMCA9IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcigvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoKSB7CiAgICAgICAgICAgICAgdmFyIGVudHMsIGksIHRhYjsKICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZSgpLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkgewogICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgLy9sZXQgZW50cyA9IHRoaXMuZW50czsKICAgICAgICAgICAgICAgICAgICBlbnRzID0gSlNPTi5wYXJzZShfbWUudGVtcGxhdGVJbmZvLnN1YkZpZWxkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIShlbnRzICYmIGVudHMubGVuZ3RoID4gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTM7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICBpZiAoIShpIDwgZW50cy5sZW5ndGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEzOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudHNbaV0uYXR0cmlidXRlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICBhdHRyLmZpZWxkTmFtZSA9IGF0dHIuZmllbGROYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgZW50c1tpXS5jaGlsZEVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2hvd0NoaWxkRW50KSB7CiAgICAgICAgICAgICAgICAgICAgICBzaG93Q2hpbGRFbnQuYXR0cmlidXRlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmZpZWxkTmFtZSA9IGF0dHJpYnV0ZS5maWVsZE5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gODsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyMC5nZXRCb0RhdGEoZW50c1tpXSwgcmVmSWQpOwogICAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgdGFiID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMyMC50YWJzLnB1c2godGFiKTsKICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAzOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgICAgIF90aGlzMjAuZGlhbG9nU3ViVmlzaWJsZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwgX2NhbGxlZTIpOwogICAgICAgICAgICB9KSkoKTsKICAgICAgICAgIH0sCiAgICAgICAgICBub2RlQ2xpY2s6IGZ1bmN0aW9uIG5vZGVDbGljayhub2RlKSB7CiAgICAgICAgICAgIHZhciBsb2FkaW5nID0gdGhpcy4kbG9hZGluZyh0aGlzLm9wdGlvbnMpOwogICAgICAgICAgICAvLyB0aGlzLiRzdG9yZS5kaXNwYXRjaCgiZm9ybS9zZXRCcG1UZW1wbGF0ZVBhZ2luYXRpb25QYWdlTnVtIiwgMSk7CiAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlID0gMTsKICAgICAgICAgICAgLy/mr4/mrKHngrnlh7vov4fmu6TmoJEs5bqU6K+l5oqK5Y+z6L6555qEdGFibGUg5LiO5YiG6aG15YWo6YOo6YeN572u5Li65Yid5aeLCgogICAgICAgICAgICB2YXIgcGFnZUJlYW4gPSB7CiAgICAgICAgICAgICAgcGFnZUJlYW46IHsKICAgICAgICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICAgICAgICBwYWdlU2l6ZTogdGhpcy5wYWdpbmF0aW9uLnBhZ2VTaXplCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwYWdlQmVhbi5xdWVyeXMgPSBbXTsKICAgICAgICAgICAgaWYgKCFub2RlLmlkIHx8IG5vZGUuaWQgIT0gLTEpIHsKICAgICAgICAgICAgICB2YXIgdHJlZUZpZWxkID0gSlNPTi5wYXJzZSh0aGlzLnRlbXBsYXRlSW5mby50cmVlRmllbGQpOwogICAgICAgICAgICAgIHRyZWVGaWVsZC5xdWVyeXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgICAgaWYgKGl0ZW0ua2V5XyAmJiBpdGVtLnZhbHVlXykgewogICAgICAgICAgICAgICAgICBwYWdlQmVhbi5xdWVyeXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6ICckVFJFRSQnICsgaXRlbS5rZXlfLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBub2RlW2l0ZW0udmFsdWVfXSwKICAgICAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLAogICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywKICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy/miorov4fmu6TmoJHnmoTmn6Xor6LmnaHku7blrZjkuIDku73otbfmnaUs5Y+z6L6555qE5pCc57Si5LiO5YiG6aG15omN6IO95ZCM5pe25L2/55SoCiAgICAgICAgICAgIHRoaXMudHJlZVF1ZXJ5cyA9IHBhZ2VCZWFuLnF1ZXJ5czsKICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHsKICAgICAgICAgICAgICB0ZW1wbGF0ZUlkOiB0aGlzLnRlbXBsYXRlSW5mby5pZCwKICAgICAgICAgICAgICBwYWdpbmF0aW9uOiBwYWdlQmVhbgogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLnJlc2V0KHRydWUpOwogICAgICAgICAgICAvL+aVsOaNruinhuWbvuaOp+S7tgogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgewogICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LnNlbGVjdExpc3QgJiYgdGhpcy5kYXRhVmlldy5zZWxlY3RMaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHBhcmFtcy5zZWxlY3RMaXN0ID0gdGhpcy5kYXRhVmlldy5zZWxlY3RMaXN0OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICAgICAgICBpZiAodGhpc18uaXNKb2luRmxvdykgewogICAgICAgICAgICAgIHBhcmFtcy5pc0pvaW5GbG93ID0gdHJ1ZTsKICAgICAgICAgICAgICBwYXJhbXMudGFza1R5cGUgPSB0aGlzXy50YXNrVHlwZTsKICAgICAgICAgICAgICBwYXJhbXMuZGVmS2V5ID0gdGhpc18uZGVmS2V5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdmb3JtL2dldEJwbVRlbXBsYXRlQnlQYWdpbmF0aW9uJywgcGFyYW1zKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgIHRoaXNfLnJvd3MgPSByZXNwb25zZS5kYXRhLnJvd3M7CiAgICAgICAgICAgICAgdGhpc18udG90YWwgPSByZXNwb25zZS5kYXRhLnRvdGFsOwogICAgICAgICAgICAgIHRoaXNfLnBhZ2luYXRpb24ucGFnZSA9IHJlc3BvbnNlLmRhdGEucGFnZTsKICAgICAgICAgICAgICB0aGlzXy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gcmVzcG9uc2UuZGF0YS5wYWdlU2l6ZTsKICAgICAgICAgICAgICBsb2FkaW5nLmNsb3NlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIC8v5Yqg6L295qCR55qE5L+h5oGvCiAgICAgICAgICB0b1RyZWVEYXRhOiBmdW5jdGlvbiB0b1RyZWVEYXRhKGRhdGEsIGlkLCBwaWQsIG5hbWUsIHB2YWx1ZSkgewogICAgICAgICAgICAvLyDlu7rnq4vkuKrmoJHlvaLnu5PmnoQs6ZyA6KaB5a6a5LmJ5Liq5pyA6aG25bGC55qE54i26IqC54K577yMcHZhbHVl5pivMAogICAgICAgICAgICB2YXIgcGFyZW50cyA9IGRhdGEuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgIHJldHVybiB2YWx1ZVtpZF0gPT0gdmFsdWVbcGlkXSB8fCB2YWx1ZVtwaWRdID09IG51bGwgfHwgdmFsdWVbcGlkXSA9PSBwdmFsdWU7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAoIXBhcmVudHMpIHsKICAgICAgICAgICAgICBwYXJlbnRzID0gZGF0YS5maWx0ZXIoZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbcGlkXSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWVbcGlkXSAhPSBudWxsICYmIHZhbHVlW2lkXSAhPSB2YWx1ZVtwaWRdOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXJlbnRzOwogICAgICAgICAgfSwKICAgICAgICAgIC8v5Yid5aeL5YyW5qCRCiAgICAgICAgICBpbml0VHJlZTogZnVuY3Rpb24gaW5pdFRyZWUodHJlZUZpZWxkKSB7CiAgICAgICAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgICAgICAgIGZvcm0uZ2V0QnlBbGlhcyh0cmVlRmllbGQuYWxpYXMsIGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2cgPSByZXM7CiAgICAgICAgICAgICAgZGlhbG9nLmdldFRyZWVEYXRhKHsKICAgICAgICAgICAgICAgIHJlcXVlc3RUeXBlOiAnR0VUJywKICAgICAgICAgICAgICAgIHVybDogJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0VHJlZURhdGE/YWxpYXM9JyArIHRyZWVGaWVsZC5hbGlhcyArICcmbWFwUGFyYW09JwogICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpc18uY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCkgewogICAgICAgICAgICAgICAgICB2YXIgZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZSh0aGlzXy5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICAgICAgICAgICAgdGhpc18uZGlzcGxheUZpZWxkID0gZGlzcGxheWZpZWxkOwogICAgICAgICAgICAgICAgICB0aGlzXy50cmVlTGlzdCA9IHJlc3AuZGF0YTsKICAgICAgICAgICAgICAgICAgdmFyIGhlYWQgPSB7fTsKICAgICAgICAgICAgICAgICAgaGVhZFtkaXNwbGF5ZmllbGQuZGlzcGxheU5hbWVdID0gJ+WFqOmDqCc7CiAgICAgICAgICAgICAgICAgIGhlYWQuaWQgPSAtMTsKICAgICAgICAgICAgICAgICAgdGhpc18udHJlZS5wdXNoKGhlYWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb2FkVHJlZTogZnVuY3Rpb24gbG9hZFRyZWUobm9kZSwgcmVzb2x2ZSkgewogICAgICAgICAgICB2YXIgX3RoaXMyMSA9IHRoaXM7CiAgICAgICAgICAgIGlmIChub2RlKSB7CiAgICAgICAgICAgICAgaWYgKG5vZGUuZGF0YS5pZCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIHZhciB0cmVlID0gdGhpcy50b1RyZWVEYXRhKHRoaXMudHJlZUxpc3QsIHRoaXMuZGlzcGxheUZpZWxkLmlkLCB0aGlzLmRpc3BsYXlGaWVsZC5waWQsIHRoaXMuZGlzcGxheUZpZWxkLmRpc3BsYXlOYW1lLCB0aGlzLmRpc3BsYXlGaWVsZC5wdmFsdWUgPyB0aGlzLmRpc3BsYXlGaWVsZC5wdmFsdWUgOiAnMCcpOwogICAgICAgICAgICAgICAgcmVzb2x2ZSh0cmVlKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnRyZWVMaXN0LmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlW190aGlzMjEuZGlzcGxheUZpZWxkLnBpZF0gPT09IG5vZGUuZGF0YVtfdGhpczIxLmRpc3BsYXlGaWVsZC5pZF07CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlc29sdmUoW10pOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgaGFuZGxlU3ViQ3VycmVudENoYW5nZTogZnVuY3Rpb24gaGFuZGxlU3ViQ3VycmVudENoYW5nZShpbmRleCwgdGFiKSB7CiAgICAgICAgICAgIHZhciBfdGhpczIyID0gdGhpczsKICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4ucGFnZSA9IGluZGV4OwogICAgICAgICAgICB0aGlzLnN1YlRhYmxlTG9hZGluZyA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdmb3JtL2dldFN1YkRhdGFQYWdpbmF0aW9uJywgewogICAgICAgICAgICAgIHBhZ2luYXRpb246IHRhYi5wYWdpbmF0aW9uLAogICAgICAgICAgICAgIG5hbWU6IHRhYi5lbnROYW1lLAogICAgICAgICAgICAgIHJlZklkOiB0YWIucmVmSWQgPyB0YWIucmVmSWQgOiB0aGlzLnJlZklkCiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3ApIHsKICAgICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbiA9IHsKICAgICAgICAgICAgICAgIHBhZ2VTaXplOiByZXNwLnBhZ2VTaXplLAogICAgICAgICAgICAgICAgcGFnZTogcmVzcC5wYWdlLAogICAgICAgICAgICAgICAgdG90YWw6IHJlc3AudG90YWwKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHRhYi5kYXRhTGlzdCA9IHJlc3Aucm93czsKICAgICAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgX3RoaXMyMi5zdWJUYWJsZUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgcXVlcnlTdWJUYWJsZTogZnVuY3Rpb24gcXVlcnlTdWJUYWJsZSh0YWIpIHsKICAgICAgICAgICAgdmFyIF90aGlzMjMgPSB0aGlzOwogICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5xdWVyeXMgPSBbXTsKICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlTdWJWYWx1ZSkgewogICAgICAgICAgICAgIHRhYi5hdHRyaWJ1dGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgIC8vcGdTcWzkvb/nlKjmqKHns4rmn6Xor6LvvIznsbvlnovkuI3ljLnphY3ml7bkvJrmiqXplJnvvIzmraTlpITlj6rkv53nlZl2YXJjaGFy57G75Z6LCiAgICAgICAgICAgICAgICAvLyBpZiAoaXRlbS5kYXRhVHlwZSA9PSAndmFyY2hhcicpIHsKICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGROYW1lLAogICAgICAgICAgICAgICAgICB2YWx1ZTogX3RoaXMyMy5xdWVyeVN1YlZhbHVlLAogICAgICAgICAgICAgICAgICBncm91cDogJ290aGVyJywKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnTElLRScsCiAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnT1InCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnF1ZXJ5U3VuVmFsdWUpIHsKICAgICAgICAgICAgICB0YWIuYXR0cmlidXRlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAvLyBpZiAoaXRlbS5kYXRhVHlwZSA9PSAndmFyY2hhcicpIHsKICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGROYW1lLAogICAgICAgICAgICAgICAgICB2YWx1ZTogX3RoaXMyMy5xdWVyeVN1blZhbHVlLAogICAgICAgICAgICAgICAgICBncm91cDogJ290aGVyJywKICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnTElLRScsCiAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnT1InCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmhhbmRsZVN1YkN1cnJlbnRDaGFuZ2UoMSwgdGFiKTsKICAgICAgICAgIH0sCiAgICAgICAgICBpbXBvcnRTdWI6IGZ1bmN0aW9uIGltcG9ydFN1YihwYXJhbSkgewogICAgICAgICAgICB2YXIgX3RoaXMyNCA9IHRoaXM7CiAgICAgICAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwogICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBwYXJhbS5maWxlKTsKICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHsKICAgICAgICAgICAgICBkYXRhOiBmb3JtRGF0YSwKICAgICAgICAgICAgICBhbGlhczogdGhpcy5jdXJyZW50VGFiLmVudE5hbWUsCiAgICAgICAgICAgICAgcmVmSWQ6IHRoaXMucmVmSWQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZm9ybS5zdWJJbXBvcnQocGFyYW1zLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgIGlmIChkYXRhLnN0YXRlKSB7CiAgICAgICAgICAgICAgICBfdGhpczI0LiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLAogICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkYXRhLm1lc3NhZ2UKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcGFyYW0ub25TdWNjZXNzKCk7CiAgICAgICAgICAgICAgICBfdGhpczI0LmhhbmRsZVN1YkN1cnJlbnRDaGFuZ2UoMSwgX3RoaXMyNC5jdXJyZW50VGFiKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgX3RoaXMyNC4kbWVzc2FnZS5lcnJvcihkYXRhLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgcGFyYW0ub25FcnJvcigpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgZXhwb3J0U3ViOiBmdW5jdGlvbiBleHBvcnRTdWIodGFiKSB7CiAgICAgICAgICAgIHZhciBfdGhpczI1ID0gdGhpczsKICAgICAgICAgICAgdGhpcy5leHBvcnRUeXBlID0gJ3N1Yic7CiAgICAgICAgICAgIHRoaXMuY3VycmVudFRhYiA9IHRhYjsKICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGRzID0gW107CiAgICAgICAgICAgIHRoaXMuc3ViRGlzcGxheUZpZWxkc0xpc3QgPSBbXTsKICAgICAgICAgICAgdGFiLmF0dHJpYnV0ZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgIF90aGlzMjUuZGlzcGxheUZpZWxkcy5wdXNoKHsKICAgICAgICAgICAgICAgIGRlc2M6IGl0ZW0uY29tbWVudCwKICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0uZmllbGROYW1lLAogICAgICAgICAgICAgICAgdHlwZTogaXRlbS5jb2x1bW5UeXBlCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLmRpYWxvZ0V4cG9ydFZpc2libGUgPSB0cnVlOwogICAgICAgICAgfSwKICAgICAgICAgIGltcG9ydEJ1dHRvbjogZnVuY3Rpb24gaW1wb3J0QnV0dG9uKHRhYikgewogICAgICAgICAgICB0aGlzLmN1cnJlbnRUYWIgPSB0YWI7CiAgICAgICAgICB9LAogICAgICAgICAgbXlEcmFmdExpc3Q6IGZ1bmN0aW9uIG15RHJhZnRMaXN0KCkgewogICAgICAgICAgICAvL+aVsOaNruinhuWbvumaj+acuua3u+WKoOWIsOWFtuS7luiPnOWNleS4i+mdouaXtuiOt+WPluW9k+WJjeiPnOWNleeahOWIq+WQjSAg5bm25LiU5b2T5YmN5pWw5o2u6KeG5Zu+5LiN5piv6KGo5Y2V6YeM55qE5pWw5o2u6KeG5Zu+ICBkYXRhVmlldwogICAgICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcyAmJiAhdGhpcy5kYXRhVmlldyAmJiAhdGhpcy5pZ25vcmVkQWxpYXMuaW5jbHVkZXMoc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcykpIHsKICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyA9IHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGRhdGFWaWV3RmxhZyA9IGZhbHNlOwogICAgICAgICAgICAvL+WIpOaWreW9k+WJjeaVsOaNruinhuWbvuaYr+S4jeaYr+ihqOWNlemHjOeahOaVsOaNruinhuWbvgogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgewogICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgJiYgdGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzICE9ICcnKSB7CiAgICAgICAgICAgICAgICBkYXRhVmlld0ZsYWcgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcGF0aCA9ICcvJyArIHRoaXMuYWxpYXNfbmV3ICsgJy9kcmFmdExpc3QvJyArIHRoaXMudGVtcGxhdGVJbmZvLmFsaWFzICsgJy8nICsgZGF0YVZpZXdGbGFnOwogICAgICAgICAgICBpZiAodGhpcy5vcGVuVHlwZSA9PSAnbmV3JyB8fCBkYXRhVmlld0ZsYWcpIHsKICAgICAgICAgICAgICBwYXRoICs9ICc/aXNOZXc9dHJ1ZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGFWaWV3RmxhZykgewogICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHBhdGgsICdfYmxhbmsnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaChwYXRoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gbGV0IHVybCA9CiAgICAgICAgICAgIC8vICAgIi9zdGF0ZW1lbnQvZHJhZnRMaXN0P3RlbXBBbGlhcz0iICsgOwogICAgICAgICAgICAvLyBjb25zdCB7IGhyZWYgfSA9IHRoaXMuJHJvdXRlci5wdXNoKHsKICAgICAgICAgICAgLy8gICBwYXRoOiB1cmwsCiAgICAgICAgICAgIC8vIH0pOwogICAgICAgICAgICAvLyB3aW5kb3cub3BlbihocmVmLCAiX2JsYW5rIik7CiAgICAgICAgICB9LAogICAgICAgICAgaW5pdFN3aXRjaFN0YXR1czogZnVuY3Rpb24gaW5pdFN3aXRjaFN0YXR1cygpIHsKICAgICAgICAgICAgLy/liJ3lp4vljJblvIDlhbPnirbmgIEKICAgICAgICAgICAgdmFyIG1hbmFnZXMgPSB1dGlscy5wYXJzZVRvSnNvbih0aGlzLnRlbXBsYXRlSW5mby5tYW5hZ2VGaWVsZCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFuYWdlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGlmIChtYW5hZ2VzW2ldLm5hbWUgPT09ICdzd2l0Y2gnKSB7CiAgICAgICAgICAgICAgICB2YXIgZmllbGROYW1lID0gbWFuYWdlc1tpXS5iaW5kOwogICAgICAgICAgICAgICAgdGhpcy4kc2V0KHRoaXMuc3dpdGNoTWFwLCBmaWVsZE5hbWUsIHt9KTsKICAgICAgICAgICAgICAgIHRoaXMuc3dpdGNoTWFwW2ZpZWxkTmFtZV0ub24gPSBtYW5hZ2VzW2ldLnN3aXRjaE9uOwogICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hNYXBbZmllbGROYW1lXS5vZmYgPSBtYW5hZ2VzW2ldLnN3aXRjaE9mZjsKICAgICAgICAgICAgICAgIHRoaXMuc3dpdGNoTWFwW2ZpZWxkTmFtZV0ub25MYWJlbCA9IG1hbmFnZXNbaV0uc3dpdGNoT25MYWJlbDsKICAgICAgICAgICAgICAgIHRoaXMuc3dpdGNoTWFwW2ZpZWxkTmFtZV0ub2ZmTGFiZWwgPSBtYW5hZ2VzW2ldLnN3aXRjaE9mZkxhYmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIHN3aXRjaENoYW5nZTogZnVuY3Rpb24gc3dpdGNoQ2hhbmdlKHBrVmFsLCBvbiwgb2ZmLCBmaWVsZE5hbWUsIHJvdywgZGVmYXVsdFRydWUpIHsKICAgICAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICAgICAgdmFyIHZhbCA9IHJvd1tmaWVsZE5hbWVdOwogICAgICAgICAgICBpZiAodmFsICE9IG9uICYmIHZhbCAhPSBvZmYpIHsKICAgICAgICAgICAgICBpZiAoZGVmYXVsdFRydWUgPT0gJ3RydWUnKSB7CiAgICAgICAgICAgICAgICB0aGlzLiRzZXQocm93LCBmaWVsZE5hbWUsIG9mZik7CiAgICAgICAgICAgICAgICB2YWwgPSBvZmY7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuJHNldChyb3csIGZpZWxkTmFtZSwgb24pOwogICAgICAgICAgICAgICAgdmFsID0gb247CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXNfLiRjb25maXJtKCflsIbkvJrkv67mlLnor6XmlbDmja7vvIzmmK/lkKbnu6fnu60/JywgewogICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywKICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJywKICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycKICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgdmFyIGZvcm0gPSB3aW5kb3cuY29udGV4dC5mb3JtOwogICAgICAgICAgICAgIHZhciBmb3JtQWxpYXMgPSB0aGlzXy50ZW1wbGF0ZUluZm8uZm9ybUtleTsgLy/ooajljZXliKvlkI0KICAgICAgICAgICAgICB2YXIgZGF0YURlZkFsaWFzID0gdGhpc18udGVtcGxhdGVJbmZvLmJvRGVmQWxpYXM7IC8v5pWw5o2u5bu65qih5Yir5ZCNCiAgICAgICAgICAgICAgcmVxLmdldChmb3JtICsgJy9mb3JtL2RhdGFUZW1wbGF0ZS92MS9nZXRGb3JtLycgKyBmb3JtQWxpYXMgKyAnLycgKyBkYXRhRGVmQWxpYXMgKyAnP2lkPScgKyBwa1ZhbCArICcmYWN0aW9uPWdldCZyZWNvcmRJZD0nKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgICAgICAgICB2YXIgYm9EYXRhID0gcmVzcC5kYXRhLmRhdGE7CiAgICAgICAgICAgICAgICBib0RhdGFbZGF0YURlZkFsaWFzXVtmaWVsZE5hbWVdID0gdmFsOwogICAgICAgICAgICAgICAgdmFyIHNhdmVEYXRhID0gewogICAgICAgICAgICAgICAgICBib0FsaWFzOiB0aGlzXy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhcywKICAgICAgICAgICAgICAgICAgYm9EYXRhOiByZXNwLmRhdGEuZGF0YQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHRoaXNfLiRzdG9yZS5kaXNwYXRjaCgnZm9ybS9ib1NhdmUnLCBzYXZlRGF0YSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzXy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5L+d5a2Y5oiQ5YqfJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXNfLiRtZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5L+d5a2Y5aSx6LSlJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHZhciBmb3JtID0gd2luZG93LmNvbnRleHQuZm9ybTsKICAgICAgICAgICAgICB2YXIgZm9ybUFsaWFzID0gdGhpc18udGVtcGxhdGVJbmZvLmZvcm1LZXk7IC8v6KGo5Y2V5Yir5ZCNCiAgICAgICAgICAgICAgdmFyIGRhdGFEZWZBbGlhcyA9IHRoaXNfLnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzOyAvL+aVsOaNruW7uuaooeWIq+WQjQogICAgICAgICAgICAgIHJlcS5nZXQoZm9ybSArICcvZm9ybS9kYXRhVGVtcGxhdGUvdjEvZ2V0Rm9ybS8nICsgZm9ybUFsaWFzICsgJy8nICsgZGF0YURlZkFsaWFzICsgJz9pZD0nICsgcGtWYWwgKyAnJmFjdGlvbj1nZXQmcmVjb3JkSWQ9JykudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgICAgICAgdGhpc18uJHNldChyb3csIGZpZWxkTmFtZSwgcmVzcC5kYXRhLmRhdGFbZGF0YURlZkFsaWFzXVtmaWVsZE5hbWVdKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgZGlzcGxheTogZnVuY3Rpb24gZGlzcGxheShtcERpc3BsYXkpIHsKICAgICAgICAgICAgLy9wY+err+eahOaVsOaNruaKpeihqOS4jemcgOimgeWBmuacrOaWueazleeahOWkhOeQhu+8jOebtOaOpei/lOWbnnRydWXljbPlj6/jgIIKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0Rml4ZWQ6IGZ1bmN0aW9uIGdldEZpeGVkKGZpeGVkKSB7CiAgICAgICAgICAgIHJldHVybiBmaXhlZDsKICAgICAgICAgIH0sCiAgICAgICAgICBzdW1tYXJ5OiBmdW5jdGlvbiBzdW1tYXJ5KG1ldGhvZCwgZmllbGQsIGRlY2ltYWwpIHsKICAgICAgICAgICAgdmFyIGxpc3QgPSB0aGlzLnJvd3MuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bZmllbGRdICE9PSB1bmRlZmluZWQgJiYgaXRlbVtmaWVsZF0gIT09ICcnOwogICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICByZXR1cm4gbmV3IE51bWJlcihpdGVtW2ZpZWxkXSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAoIWxpc3QgfHwgbGlzdC5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobWV0aG9kID09PSAnY291bnQnKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGxpc3QubGVuZ3RoOwogICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ3N1bScpIHsKICAgICAgICAgICAgICByZXR1cm4gbGlzdC5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhICsgYjsKICAgICAgICAgICAgICB9KS50b0ZpeGVkKGRlY2ltYWwpOwogICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ21pbicpIHsKICAgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4uYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KGxpc3QpKS50b0ZpeGVkKGRlY2ltYWwpOwogICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ21heCcpIHsKICAgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXguYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KGxpc3QpKS50b0ZpeGVkKGRlY2ltYWwpOwogICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ2F2ZycpIHsKICAgICAgICAgICAgICByZXR1cm4gKGxpc3QucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYSArIGI7CiAgICAgICAgICAgICAgfSkgLyBsaXN0Lmxlbmd0aCkudG9GaXhlZChkZWNpbWFsKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGdldENvbG9yOiBmdW5jdGlvbiBnZXRDb2xvcihkYXRhLCByb3cpIHsKICAgICAgICAgICAgdmFyIHJlc3VDb2xvciA9ICdjb2xvcjpibGFjayc7CiAgICAgICAgICAgIHZhciBkZWNvZGUgPSBCYXNlNjQuZGVjb2RlKGRhdGEpOwogICAgICAgICAgICB2YXIgY29sb3JSdWxlID0gSlNPTi5wYXJzZShkZWNvZGUpOwogICAgICAgICAgICBpZiAoY29sb3JSdWxlICYmIGNvbG9yUnVsZSBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgICAgICAgICAgY29sb3JSdWxlLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUpIHsKICAgICAgICAgICAgICAgIHZhciBGbiA9IEZ1bmN0aW9uKCdkYXRhJywgcnVsZS5wcm9SdWxlKTsKICAgICAgICAgICAgICAgIGlmIChGbihyb3cpKSB7CiAgICAgICAgICAgICAgICAgIHJlc3VDb2xvciA9ICdjb2xvcjonICsgcnVsZS5wcm9Db2xvcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdUNvbG9yOwogICAgICAgICAgfSwKICAgICAgICAgIGdldFByb1ZhbHVlOiBmdW5jdGlvbiBnZXRQcm9WYWx1ZSh2YWx1ZSwgcnVsZSkgewogICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAvIHJ1bGUgKiAxMDAwMCkgLyAxMDA7IC8vIOWwj+aVsOeCueWQjuS4pOS9jeeZvuWIhuavlAogICAgICAgICAgfSwKICAgICAgICAgIGdldFByb0NvbG9yOiBmdW5jdGlvbiBnZXRQcm9Db2xvcihkYXRhLCByb3cpIHsKICAgICAgICAgICAgdmFyIHJlc3VDb2xvciA9ICcjNDA5ZWZmJzsKICAgICAgICAgICAgdmFyIGRlY29kZSA9IEJhc2U2NC5kZWNvZGUoZGF0YSk7CiAgICAgICAgICAgIC8qZGVjb2RlPWRlY29kZS5yZXBsYWNlKC9ccyohL2csIiIpOyovCiAgICAgICAgICAgIHZhciBjb2xvclJ1bGUgPSBKU09OLnBhcnNlKGRlY29kZSk7CiAgICAgICAgICAgIGlmIChjb2xvclJ1bGUgJiYgY29sb3JSdWxlIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICBjb2xvclJ1bGUuZm9yRWFjaChmdW5jdGlvbiAocnVsZSkgewogICAgICAgICAgICAgICAgdmFyIEZuID0gRnVuY3Rpb24oJ2RhdGEnLCBydWxlLnByb1J1bGUpOwogICAgICAgICAgICAgICAgaWYgKEZuKHJvdykpIHsKICAgICAgICAgICAgICAgICAgcmVzdUNvbG9yID0gcnVsZS5wcm9Db2xvcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdUNvbG9yOwogICAgICAgICAgfSwKICAgICAgICAgIGlzU29ydGFibGU6IGZ1bmN0aW9uIGlzU29ydGFibGUoZmllbGQpIHsKICAgICAgICAgICAgdmFyIGlzQ2xvYiA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgIGlmIChpdGVtLm5hbWUgPT09IGZpZWxkICYmIGl0ZW0udHlwZSA9PT0gJ2Nsb2InKSB7CiAgICAgICAgICAgICAgICBpc0Nsb2IgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5ub3RTb3J0YWJsZUZpZWxkcy5pbmNsdWRlcyhmaWVsZCkgJiYgIWlzQ2xvYjsKICAgICAgICAgIH0sCiAgICAgICAgICBjdXN0b21FdmlsSlM6IGZ1bmN0aW9uIGN1c3RvbUV2aWxKUyhyb3csIGh0U2NyaXB0KSB7CiAgICAgICAgICAgIHZhciBGbiA9IEZ1bmN0aW9uKCdfcmVxJywgJ3JvdycsICdfdGhpcycsIEJhc2U2NC5kZWNvZGUoaHRTY3JpcHQpKTsgLy/kuIDkuKrlj5jph4/mjIflkJFGdW5jdGlvbu+8jOmYsuatouacieS6m+WJjeerr+e8luivkeW3peWFt+aKpemUmQogICAgICAgICAgICB2YXIgcmVzdWx0ID0gRm4ocmVxLCByb3csIHRoaXMpOwogICAgICAgICAgfSwKICAgICAgICAgIGJhdGNoVXBkYXRlOiBmdW5jdGlvbiBiYXRjaFVwZGF0ZSh0aXRsZSwgYmFzZTY0SnNvbiwgYmFzZTY0RmlsZWRzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnRhYmxlRGF0YS5zZWxlY3RSb3dzID09IG51bGwgfHwgdGhpcy50YWJsZURhdGEuc2VsZWN0Um93cy5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn6K+36YCJ5oup5pWw5o2uJyk7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBkZWZhdWx0VmFsdWVMaXN0ID0gW107CiAgICAgICAgICAgIHZhciBvdXRGb3JtID0gW107CiAgICAgICAgICAgIGlmIChiYXNlNjRKc29uKSB7CiAgICAgICAgICAgICAgLy/mmK/lkKbmnInnlKjmiLfoh6rlt7HovpPlhaXnmoTlrZfmrrUKICAgICAgICAgICAgICB2YXIgcmVzID0gdHJ1ZTsKICAgICAgICAgICAgICB2YXIgYmF0Y2hVcGRhdGVEYXRhID0gSlNPTi5wYXJzZShCYXNlNjQuZGVjb2RlKGJhc2U2NEpzb24pKTsKICAgICAgICAgICAgICB2YXIgZmlsZWRzT2JqID0gSlNPTi5wYXJzZShCYXNlNjQuZGVjb2RlKGJhc2U2NEZpbGVkcykpOwogICAgICAgICAgICAgIGJhdGNoVXBkYXRlRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICBpZiAoaXRlbS52YWx1ZVR5cGUgPT0gMSkgewogICAgICAgICAgICAgICAgICB2YXIgaXNSZXF1aXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pc1JlcXVpcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgaXNSZXF1aXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgZGVzYzogZmlsZWRzT2JqW2l0ZW0ubmFtZV0sCiAgICAgICAgICAgICAgICAgICAgb3V0VHlwZTogaXRlbS5vdXRWYWx1ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgc2luZ2xlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RDdXJyZW50OiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBpc1JlcXVpcmVkOiBpc1JlcXVpcmVkCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIGlmIChpdGVtLm91dFZhbHVlVHlwZSA9PSAnc2VsZWN0JykgewogICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RDb25maWcgPSBKU09OLnBhcnNlKGl0ZW0ub3V0Q29uZmlnKTsKICAgICAgICAgICAgICAgICAgICBvYmouZ2FuZ2VkID0gewogICAgICAgICAgICAgICAgICAgICAgYWxpYXM6ICcnLAogICAgICAgICAgICAgICAgICAgICAgdmFsdWVCaW5kOiAnJywKICAgICAgICAgICAgICAgICAgICAgIG5vSW5pdDogJycsCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbEJpbmQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgYmluZDoge30KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RDb25maWcuY3VzdG9tUXVlcnkpIHsKICAgICAgICAgICAgICAgICAgICAgIHZhciBnYW5nZWQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzOiBzZWxlY3RDb25maWcuY3VzdG9tUXVlcnkuYWxpYXMsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQmluZDogc2VsZWN0Q29uZmlnLmN1c3RvbVF1ZXJ5LnZhbHVlQmluZCwKICAgICAgICAgICAgICAgICAgICAgICAgbm9Jbml0OiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxCaW5kOiBzZWxlY3RDb25maWcuY3VzdG9tUXVlcnkubGFiZWxCaW5kLAogICAgICAgICAgICAgICAgICAgICAgICBiaW5kOiB7fQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgIG9iai5nYW5nZWQgPSBnYW5nZWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9iai5zZWxlY3REYXRhID0gc2VsZWN0Q29uZmlnLnNlbGVjdERhdGE7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5vdXRWYWx1ZVR5cGUgPT0gJ2RpYWxvZycpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX3NlbGVjdENvbmZpZyA9IEpTT04ucGFyc2UoaXRlbS5vdXRDb25maWcpOwogICAgICAgICAgICAgICAgICAgIHZhciBkaWFsb2dDb25maWcgPSBfc2VsZWN0Q29uZmlnLmRpYWxvZ0NvbmZpZzsKICAgICAgICAgICAgICAgICAgICB2YXIgbWFwcGluZ0NvbmYgPSBbXTsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1ldGVyID0gX3NlbGVjdENvbmZpZy5wYXJhbWV0ZXI7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHBhcmFtZXRlcikgewogICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcGFyYW1ldGVyW2tleV0gfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nQ29uZi5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgZnJvbToga2V5LAogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFt2YWx1ZV0sCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFN1YjogW3ZhbHVlXQogICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBjdXN0ZGlhbG9nID0gewogICAgICAgICAgICAgICAgICAgICAgc2VsZWN0TnVtOiBkaWFsb2dDb25maWcuc2VsZWN0TnVtLAogICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nQ29uZjogbWFwcGluZ0NvbmYsCiAgICAgICAgICAgICAgICAgICAgICBjdXN0UXVlcnlKc29uOiBbXSwKICAgICAgICAgICAgICAgICAgICAgIGFsaWFzOiBkaWFsb2dDb25maWcuYWxpYXMsCiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBkaWFsb2dDb25maWcuY3VzdERpYWxvZwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgb2JqLmN1c3RkaWFsb2cgPSB7CiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAn6K+36YCJ5oupJywKICAgICAgICAgICAgICAgICAgICAgIGN1c3REaWFsb2c6IGN1c3RkaWFsb2csCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRGaWVsZDogZGlhbG9nQ29uZmlnLnJlc3VsdEZpZWxkCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLm91dENvbmZpZyAmJiAoaXRlbS5vdXRWYWx1ZVR5cGUgIT0gJ2lucHV0JyB8fCBpdGVtLm91dFZhbHVlVHlwZSAhPSAnZGF0YScgfHwgaXRlbS5vdXRWYWx1ZVR5cGUgIT0gJ251bWJlcicpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG91dENvbmZpZyA9IEpTT04ucGFyc2UoaXRlbS5vdXRDb25maWcpOwogICAgICAgICAgICAgICAgICAgIHZhciBfcGFyYW1ldGVyID0gb3V0Q29uZmlnLnBhcmFtZXRlcjsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gX3BhcmFtZXRlcikgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFfcGFyYW1ldGVyW2tleV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIF9wYXJhbWV0ZXJba2V5XTsKICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJhbWV0ZXJba2V5XSA9ICdkYXRhLicgKyBfcGFyYW1ldGVyW2tleV07CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvdXRDb25maWcuc2VsZWN0Q3VycmVudCkgewogICAgICAgICAgICAgICAgICAgICAgb2JqLnNlbGVjdEN1cnJlbnQgPSBvdXRDb25maWcuc2VsZWN0Q3VycmVudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG91dENvbmZpZy5pc1NpbmdsZSkgewogICAgICAgICAgICAgICAgICAgICAgb2JqLnNpbmdsZSA9IG91dENvbmZpZy5pc1NpbmdsZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb2JqLmJpbmRDb25maWcgPSBfcGFyYW1ldGVyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIG91dEZvcm0ucHVzaChvYmopOwogICAgICAgICAgICAgICAgICByZXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZUxpc3QucHVzaCh7CiAgICAgICAgICAgICAgICAgICAga2V5OiBpdGVtLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGl0ZW0uZGVmYXVsdFZhbHVlCiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGlmIChyZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQm8oZGVmYXVsdFZhbHVlTGlzdCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlTGlzdCA9IGRlZmF1bHRWYWx1ZUxpc3Q7CiAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLnRlbXBsYXRlQmF0Y2hVcGRhdGVEaWFsb2cuc2hvd0RpYWxvZyh0aXRsZSwgb3V0Rm9ybSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgdHlwZTogJ2luZm8nLAogICAgICAgICAgICAgICAgbWVzc2FnZTogJ+acquiuvue9ruabtOaWsOWGheWuuScKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIG9uQ29uZmlybTogZnVuY3Rpb24gb25Db25maXJtKGRhdGEpIHsKICAgICAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZUxpc3QgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgICAgICBkZWZhdWx0VmFsdWVMaXN0LnB1c2goewogICAgICAgICAgICAgICAga2V5OiBrZXksCiAgICAgICAgICAgICAgICB2YWx1ZTogZGF0YVtrZXldCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGJvRGF0YSA9IHRoaXMuZGVmYXVsdFZhbHVlTGlzdCA/IHRoaXMuZGVmYXVsdFZhbHVlTGlzdC5jb25jYXQoZGVmYXVsdFZhbHVlTGlzdCkgOiB0aGlzLmRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgdGhpcy51cGRhdGVCbyhib0RhdGEpOwogICAgICAgICAgfSwKICAgICAgICAgIHVwZGF0ZUJvOiBmdW5jdGlvbiB1cGRhdGVCbyhkZWZhdWx0VmFsdWVMaXN0KSB7CiAgICAgICAgICAgIHZhciBfdGhpczI2ID0gdGhpczsKICAgICAgICAgICAgdGhpcy4kY29uZmlybSgn5q2k5pON5L2c5bCG5om56YeP5pu05paw5pWw5o2uLCDmmK/lkKbnu6fnu60/JywgJ+aPkOekuicsIHsKICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsCiAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsCiAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnCiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHZhciBzZWxlY3RSb3dzID0gX3RoaXMyNi50YWJsZURhdGEuc2VsZWN0Um93czsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdFJvd3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHNlbGVjdFJvd3NbaV0uZm9ybUtleSA9IF90aGlzMjYudGVtcGxhdGVJbmZvLmZvcm1LZXk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRlZmF1bHRWYWx1ZUxpc3QubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgc2VsZWN0Um93c1tpXVtkZWZhdWx0VmFsdWVMaXN0W2pdLmtleV0gPSBkZWZhdWx0VmFsdWVMaXN0W2pdLnZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB2YXIgZGF0YSA9IHsKICAgICAgICAgICAgICAgIGJvRGF0YTogc2VsZWN0Um93cywKICAgICAgICAgICAgICAgIGJvQWxpYXM6IF90aGlzMjYudGVtcGxhdGVJbmZvLmJvRGVmQWxpYXMKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIF90aGlzMjYuJHN0b3JlLmRpc3BhdGNoKCdmb3JtL2JhdGNoVXBkYXRlVGVtcGxhdGVEYXRhJywgZGF0YSkudGhlbihmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGEuc3RhdGUpIHsKICAgICAgICAgICAgICAgICAgX3RoaXMyNi4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRhdGEubWVzc2FnZQogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgX3RoaXMyNi5zZWFyY2goKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIF90aGlzMjYuJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgdHlwZTogJ2luZm8nLAogICAgICAgICAgICAgICAgbWVzc2FnZTogJ+W3suWPlua2iOabtOaWsCcKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgYWRkQ29tbWFuZDogZnVuY3Rpb24gYWRkQ29tbWFuZChjb21tYW5kKSB7CiAgICAgICAgICAgIGlmIChjb21tYW5kID09ICdub3RMb2dpbicgfHwgY29tbWFuZCA9PSAnbG9naW4nKSB7CiAgICAgICAgICAgICAgdGhpcy5nZXRBZGRRUkNvZGUoY29tbWFuZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBnZXRBZGRRUkNvZGU6IGZ1bmN0aW9uIGdldEFkZFFSQ29kZShjb21tYW5kKSB7CiAgICAgICAgICAgIHRoaXMuUVJDb2RlUGF0dGVybiA9IGNvbW1hbmQgPT0gJ25vdExvZ2luJyA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgdGhpcy5RUkNvZGVEZXNjID0gW107CiAgICAgICAgICAgIHRoaXMuUVJDb2RlVHlwZSA9ICdhZGQnOwogICAgICAgICAgICB0aGlzLlFSQ29kZVNob3cgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5RUkNvZGVEaWFsb2cgPSB0cnVlOwogICAgICAgICAgfSwKICAgICAgICAgIHNob3dTZWFyY2hQYW5lOiBmdW5jdGlvbiBzaG93U2VhcmNoUGFuZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9LAogICAgICAgICAgYnVpbGREZWZhdWx0UXVlcnlzOiBmdW5jdGlvbiBidWlsZERlZmF1bHRRdWVyeXMoKSB7CiAgICAgICAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgICAgICAgIHZhciBxdWVyeXMgPSBbXTsKICAgICAgICAgICAgdmFyIGNvbmRpdGlvbnMgPSBKU09OLnBhcnNlKHRoaXNfLnRlbXBsYXRlSW5mby5jb25kaXRpb25GaWVsZCk7CiAgICAgICAgICAgIHZhciBwcmVmaXggPSB0aGlzLnRlbXBsYXRlSW5mby5pc0V4dGVybmFsID09IDEgPyAnJyA6ICdGXyc7CiAgICAgICAgICAgIC8v5p2h5Lu25a2X5q616buY6K6k5YC85Yik5patCiAgICAgICAgICAgIGNvbmRpdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbi5kZWZhdWx0VmFsdWUpIHsKICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IGNvbmRpdGlvbi5jb2xQcmVmaXggKyBjb25kaXRpb24ubmE7CiAgICAgICAgICAgICAgICB0aGlzXy4kc2V0KHRoaXNfLnNlYXJjaEZvcm0sIGZpZWxkLCBjb25kaXRpb24uZGVmYXVsdFZhbHVlKTsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbmRpdGlvbi5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uLnR5ID09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBmaWVsZCwKICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLAogICAgICAgICAgICAgICAgICBvcGVyYXRpb246IGNvbmRpdGlvbi5xdC50b1VwcGVyQ2FzZSgpLAogICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8v562b6YCJ5a2X5q616buY6K6k5YC85Yik5patCgogICAgICAgICAgICB2YXIgZmlsdGVycyA9IEpTT04ucGFyc2UodGhpc18udGVtcGxhdGVJbmZvLmZpbHRlcmluZ0ZpZWxkKTsKICAgICAgICAgICAgZmlsdGVycy5mb3JFYWNoKGZ1bmN0aW9uIChmaWx0ZXIpIHsKICAgICAgICAgICAgICBpZiAoZmlsdGVyLmRlZmF1bHRWYWx1ZSAmJiBmaWx0ZXIuZGVmYXVsdFZhbHVlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHRoaXNfLmZpbHRlck1hcFtmaWx0ZXIubmFtZV0gPSBmaWx0ZXIuZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgICAgZmlsdGVyLmRlZmF1bHRWYWx1ZS5mb3JFYWNoKGZ1bmN0aW9uICh2YWwpIHsKICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2goewogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBwcmVmaXggKyBmaWx0ZXIubmFtZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsLAogICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnZGVmVmFsXycgKyBmaWx0ZXIubmFtZSwKICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsCiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdPUicKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzXy4kb24oJ2FmdGVyTW91bnRlZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgaGVhZGVyQ29sdW1ucyA9IHRoaXNfLiRyZWZzLm11bHRpcGxlVGVtcGxhdGVUYWJsZS4kcmVmcy50YWJsZUhlYWRlci5jb2x1bW5zOwogICAgICAgICAgICAgIGhlYWRlckNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpc18uZmlsdGVyTWFwLmhhc093blByb3BlcnR5KGNvbHVtbi5wcm9wZXJ0eSkpIHsKICAgICAgICAgICAgICAgICAgdGhpc18uZmlsdGVyTWFwW2NvbHVtbi5wcm9wZXJ0eV0uZm9yRWFjaChmdW5jdGlvbiAodmFsKSB7CiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmZpbHRlcmVkVmFsdWUucHVzaCh2YWwpOwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBxdWVyeXM7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9Cn07"},null]}