{"remainingRequest":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\bzzgj-fvue\\src\\components\\eipControl\\EipSunDialog.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\src\\components\\eipControl\\EipSunDialog.vue","mtime":1705895419251},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQge21hcFN0YXRlfSBmcm9tICd2dWV4Jw0KaW1wb3J0IHV0aWxzIGZyb20gJ0AvdXRpbHMuanMnDQppbXBvcnQgaG90ZW50VWlVdGlscyBmcm9tICdAL2hvdGVudC11aS11dGlsLmpzJw0KaW1wb3J0IHtNZXNzYWdlfSBmcm9tICdlbGVtZW50LXVpJw0KaW1wb3J0IHJlcSBmcm9tICdAL3JlcXVlc3QuanMnDQppbXBvcnQgc3ViX3Bpb19taXhpbiBmcm9tICdAL3N1Yi1wZXJtaXNzaW9uLW1peGluLmpzJw0KaW1wb3J0IEVpcFRhZyBmcm9tICdAL2NvbXBvbmVudHMvZWlwQ29udHJvbC9FaXBUYWcudnVlJw0KaW1wb3J0IEVpcFNlbGVjdERpYSBmcm9tICdAL2NvbXBvbmVudHMvZWlwQ29udHJvbC9FaXBTZWxlY3REaWEudnVlJw0KDQpleHBvcnQgZGVmYXVsdCB7DQogIGNvbXBvbmVudHM6IHtFaXBUYWcsIEVpcFNlbGVjdERpYX0sDQogIG5hbWU6ICdlaXAtZGlhbG9nJywNCiAgcHJvcHM6IFsNCiAgICAndmFsaWRhdGUnLA0KICAgICd2YWx1ZScsDQogICAgJ25hbWUnLA0KICAgICdwZXJtaXNzaW9uJywNCiAgICAnYXR0ZXInLA0KICAgICdzaW5nbGUnLA0KICAgICdzZWxlY3RvcmNvbmZpZycsDQogICAgJ2N1c3RkaWFsb2cnLA0KICAgICdwbGFjZWhvbGRlcicsDQogICAgJ3Rvb2x0aXBwbGFjZW1lbnQnLA0KICAgICdpbml0RmlsbERhdGEnLA0KICAgICdpbml0RmlsbERhdGFUeXBlJywNCiAgICAncmVsYXRpb24nLA0KICAgICdtYXhSb3cnDQogIF0sDQogIG1peGluczogW3N1Yl9waW9fbWl4aW5dLCAvL+a3t+WFpeaWueW8j+W8leWFpeihqOWNlee7hOS7tuS4reWFrOWFseWxnuaAp++8jOWkhOeQhuWtkOihqOOAgeWtmeihqOihjOWGheiBlOWKqO+8iOWIh+mdouS/ruaUuXBlcm1pc3Npb25fc3Vi77yJDQogIGRhdGEoKSB7DQogICAgcmV0dXJuIHsNCiAgICAgIGRhdGE6IHsNCiAgICAgICAgcXhkZDoge30NCiAgICAgIH0sDQogICAgICBpbnB1dFN1ZmZpeFdpZHRoOiAwLA0KICAgICAgcGxhY2Vob2xkZXJCbzogJycsDQogICAgICBxdWlja1NlYXJjaDogJycsIC8v5aGr5YaZ5o+Q56S6DQogICAgICBjb25kaXRpb25CaW5kOiBbXSwgLy/lj4LmlbDmn6Xor6LlrZfmrrUNCiAgICAgIG5vZGVLZXk6ICdJRF8nLCAvL+agkeW9ouaVsOaNrueItklkDQogICAgICBjdXN0b21EaWFsb2dTaG93TGlzdDogZmFsc2UsDQogICAgICBjdXN0b21EaWFsb2dTaG93VHJlZTogZmFsc2UsDQogICAgICBzZWxlY3RPcmdQcm9wczogew0KICAgICAgICBsYWJlbDogJ25hbWUnDQogICAgICB9LA0KICAgICAgc3R5bGU6ICcnLCAvL+WvueivneahhuWuvemrmA0KICAgICAgc2VsZWN0T3JnczogbnVsbCwNCiAgICAgIGlucHV0U3VmZml4SGVpZ2h0OiAzMywNCiAgICAgIGNvbmZpZzogbnVsbCwNCiAgICAgIHVwZGF0aW5nOiBmYWxzZSwNCiAgICAgIGRpc3BsYXlmaWVsZDogW10sIC8v5pi+56S65a2X5q61DQogICAgICBjdXN0b21EaWFsb2c6IHt9LA0KICAgICAgcXVlcnlQYXJhbTogJycsIC8v5p+l6K+i5p2h5Lu26L6T5YWl55qE5YC8DQogICAgICBwcm9wczE6IFtdLA0KICAgICAgc2hvd0RhdGE6IFtdLA0KICAgICAgY2hlY2tCb3hEYXRhQWxsOiBbXSwgLy/pgInkuK3lr7nosaHnmoTpm4blkIgNCiAgICAgIGRlZmF1bHRQcm9wczogew0KICAgICAgICBjaGlsZHJlbjogJ2NoaWxkcmVuJywNCiAgICAgICAgbGFiZWw6ICdsYWJlbCcNCiAgICAgIH0sDQogICAgICBwcm9wc0RhdGE6IFtdLA0KICAgICAgcXVlcnlzU2hvdzogZmFsc2UsIC8v5piv5ZCm5pi+56S65pCc57Si5qGGDQogICAgICB1bmRlZmluZWRhOiAnJywNCiAgICAgIGlzQ3VycmVudENoYW5nZTogZmFsc2UsIC8v5piv5ZCm5LiN5omn6KGMIG9yZ1RhYmxlU2VsZWN0aW9u5pa55rOVDQogICAgICBwYWdpbmF0aW9uOiB7DQogICAgICAgIHBhZ2U6IDEsDQogICAgICAgIHBhZ2VTaXplOiAyMCwNCiAgICAgICAgdG90YWw6IDANCiAgICAgIH0sDQogICAgICBwYXJhbTogW10sIC8v57uR5a6a55qE6KGo5Y2V5a2X5q61DQogICAgICB0cmVlTGlzdDogW10sDQogICAgICBkaXNwbGF5RmllbGQ6IHt9LA0KICAgICAgcXVlcnlQYXJhbXM6IFtdLA0KICAgICAgcGxhY2Vob2xkZXJzOiBbXSwNCiAgICAgIG9sZHNlbGVjdE9yZ3M6IFtdLA0KICAgICAgY29tYmluYXRpb25UcmVlRGF0YTogW10sDQogICAgICBjb21iaVRyZWVEaXNwbGF5RmllbGQ6IFtdLA0KICAgICAgY29tYmluYXRpb25UcmVlUXVlcnlzOiBbXSwNCiAgICAgIGNvbWJpbmF0aW9uUnVsZToge30sDQogICAgICB0b2dnbGVCdG46ICdlbC1pY29uLWFycm93LWxlZnQnLA0KICAgICAgdHJlZVNob3c6IHRydWUsDQogICAgICB0cmFuc3Rpb25XaWR0aDogJzI1JScsDQogICAgICBsZWZ0VHJlZVRpdGxlOiAnJywNCiAgICAgIHdyaXRlYWJsZTogdHJ1ZSwNCiAgICAgIGlzU2hvdzogdHJ1ZQ0KICAgIH0NCiAgfSwNCiAgd2F0Y2g6IHsNCiAgICBwcm9wczE6IGZ1bmN0aW9uKG5ld1ZhbCwgb2xkVmFsKSB7DQogICAgICAvL+agkeW9og0KICAgICAgaWYgKHRoaXMuc2hvd0RhdGEgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgew0KICAgICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgICAgbGV0IGRhdGEgPSBbXQ0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2hvd0RhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICBkYXRhLnB1c2godGhpcy5zaG93RGF0YVtpXSkNCiAgICAgICAgfQ0KICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHRoaXNfLiRyZWZzLnRyZWUuc2V0Q2hlY2tlZChkYXRhW2ldLCB0cnVlKQ0KICAgICAgICAgICAgdGhpc18uY2hlY2tOb2RlKGRhdGFbaV0sIHRoaXNfKQ0KICAgICAgICAgIH0NCiAgICAgICAgfSwgMjAwKQ0KICAgICAgfQ0KICAgIH0NCiAgfSwNCiAgbW91bnRlZCgpIHsNCiAgICBpZiAodGhpcy5pbml0RmlsbERhdGEpIHsNCiAgICAgIHRoaXMuaW5pdFRlbXBsYXRlRGF0YSgpDQogICAgfQ0KICAgIGxldCByZXF1ZXN0VHlwZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCc/JylbMF0uc3BsaXQoJy8nKQ0KICAgIGxldCBpc0RvbmVMaXN0ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJy8nKQ0KICAgIGlmICgNCiAgICAgIHJlcXVlc3RUeXBlW3JlcXVlc3RUeXBlLmxlbmd0aCAtIDFdID09ICdnZXQnIHx8DQogICAgICByZXF1ZXN0VHlwZVtyZXF1ZXN0VHlwZS5sZW5ndGggLSAyXSA9PSAnZ2V0JyB8fA0KICAgICAgaXNEb25lTGlzdFtpc0RvbmVMaXN0Lmxlbmd0aCAtIDFdID09ICdkb25lTGlzdCcNCiAgICApIHsNCiAgICAgIHRoaXMuaXNTaG93ID0gZmFsc2UNCiAgICB9DQogIH0sDQogIGNvbXB1dGVkOiBtYXBTdGF0ZSh7DQogICAgdG90YWw6IChzdGF0ZSkgPT4gc3RhdGUuZGlhbG9nLnRvdGFsLA0KICAgIGRpYWxvZ0RhdGE6IChzdGF0ZSkgPT4gew0KICAgICAgcmV0dXJuIHN0YXRlLmRpYWxvZy5yb3dzDQogICAgfSwNCiAgICBpbnB1dFZhbDogZnVuY3Rpb24oKSB7DQogICAgICBpZiAoIXRoaXMudmFsdWUgfHwgdGhpcy52YWx1ZSA9PSAnfHxbXScpIHsNCiAgICAgICAgdGhpcy5jaGVja0JveERhdGFBbGwgPSBbXQ0KICAgICAgICAvLyB0aGlzLnNob3dEYXRhID0gW107DQogICAgICAgIHJldHVybiBudWxsDQogICAgICB9IGVsc2Ugew0KICAgICAgICBsZXQgbmFtZUFyeSA9IHRoaXMudmFsdWUuc3BsaXQoJywnKQ0KICAgICAgICBpZiAodGhpcy52YWx1ZS5pbmRleE9mKCd8fCcpID4gMCkgew0KICAgICAgICAgIG5hbWVBcnkgPSB0aGlzLnZhbHVlLnNwbGl0KCd8fCcpWzBdLnNwbGl0KCcsJykNCiAgICAgICAgICAvLyB0aGlzLnNob3dEYXRhPUpTT04ucGFyc2UodGhpcy52YWx1ZS5zcGxpdCgifHwiKVsxXSk7DQogICAgICAgIH0NCiAgICAgICAgLy8gIHRoaXMuc2hvd0RhdGEgPXRoaXMuc2VsZWN0T3JnczsNCiAgICAgICAgbGV0IGlkQXJ5ID0gbnVsbA0KICAgICAgICBsZXQgYWNjb3VudEFyeSA9IG51bGwNCiAgICAgICAgbGV0IHJlc3VsdCA9IFtdDQogICAgICAgIG5hbWVBcnkuZm9yRWFjaCgobSwgaSkgPT4gew0KICAgICAgICAgIGxldCBuID0ge3ZhbHVlOiBtfQ0KICAgICAgICAgIHJlc3VsdC5wdXNoKG4pDQogICAgICAgIH0pDQogICAgICAgIHJldHVybiByZXN1bHQNCiAgICAgIH0NCiAgICB9LA0KICAgIGlucHV0V3JpdGVhYmxlOiBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiB0aGlzLndyaXRlYWJsZQ0KICAgICAgICA/IHV0aWxzLmdldFdyaXRlYWJsZSh0aGlzLnBlcm1pc3Npb25fc3ViKQ0KICAgICAgICA6IHRoaXMud3JpdGVhYmxlDQogICAgfSwNCiAgICBpbnB1dFZhbGlkYXRlOiBmdW5jdGlvbigpIHsNCiAgICAgIHZhciB2YWxpZGF0ZU9iaiA9IHRoaXMuJHN0b3JlLnN0YXRlLmluZGV4LnZhbGlkYXRlDQogICAgICByZXR1cm4gdXRpbHMuYWRkUmVxdWlyZWRPck5vdCgNCiAgICAgICAgdGhpcy5wZXJtaXNzaW9uX3N1YiwNCiAgICAgICAgdGhpcy52YWxpZGF0ZSwNCiAgICAgICAgdmFsaWRhdGVPYmosDQogICAgICAgIHRoaXMNCiAgICAgICkNCiAgICB9LA0KICAgIGlucHV0TmFtZTogZnVuY3Rpb24oKSB7DQogICAgICBsZXQgbGFiZWxkZXNjID0gJycNCiAgICAgIGlmICgNCiAgICAgICAgdGhpcy4kc2xvdHMgJiYNCiAgICAgICAgdGhpcy4kc2xvdHMubGFiZWxkZXNjICYmDQogICAgICAgIHRoaXMuJHNsb3RzLmxhYmVsZGVzY1swXS5jaGlsZHJlbiAmJg0KICAgICAgICB0aGlzLiRzbG90cy5sYWJlbGRlc2NbMF0uY2hpbGRyZW5bMF0udGV4dA0KICAgICAgKSB7DQogICAgICAgIGxhYmVsZGVzYyA9IHRoaXMuJHNsb3RzLmxhYmVsZGVzY1swXS5jaGlsZHJlblswXS50ZXh0DQogICAgICAgIHJldHVybiB0aGlzLm5hbWUgPyB0aGlzLm5hbWUgOiB1dGlscy5nZXROYW1lKCkgKyAnLScgKyBsYWJlbGRlc2MNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiB0aGlzLm5hbWUgPyB0aGlzLm5hbWUgOiB1dGlscy5nZXROYW1lKCkNCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOaYr+WQpuacieWbnuWhq+iuvue9rg0KICAgIGJpbmRTZXQ6IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0b3Jjb25maWcgPyB0aGlzLnNlbGVjdG9yY29uZmlnLmJpbmQgOiBudWxsDQogICAgfQ0KICB9KSwNCiAgY3JlYXRlZCgpIHsNCiAgICBpZiAoIXRoaXMucGxhY2Vob2xkZXIpIHsNCiAgICAgIHRoaXMucGxhY2Vob2xkZXJCbyA9ICfor7fpgInmi6nlhoXlrrknDQogICAgfSBlbHNlIHsNCiAgICAgIHRoaXMucGxhY2Vob2xkZXJCbyA9IHRoaXMucGxhY2Vob2xkZXINCiAgICB9DQogICAgdGhpcy4kdmFsaWRhdG9yID0gdGhpcy4kcm9vdC4kdmFsaWRhdG9yDQogIH0sDQogIG1ldGhvZHM6IHsNCiAgICBzZWxlY3RBbGwoc2VsZWN0aW9uKSB7DQogICAgICBpZiAodGhpcy5vbGRzZWxlY3RPcmdzICE9IG51bGwgJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsNCiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBzZWxlY3Rpb24ubGVuZ3RoOyB4KyspIHsNCiAgICAgICAgICBpZiAodGhpcy5pbmRleEFycmF5KHRoaXMub2xkc2VsZWN0T3Jncywgc2VsZWN0aW9uW3hdKSA9PT0gLTEpIHsNCiAgICAgICAgICAgIHRoaXMub2xkc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvblt4XSkNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gXy5jbG9uZURlZXAodGhpcy5vbGRzZWxlY3RPcmdzKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gXy5jbG9uZURlZXAoc2VsZWN0aW9uKQ0KICAgICAgfQ0KICAgIH0sDQogICAgY2hlY2tOb2RlKGRhdGEsIHRoaXNfLCBwbm9kZSkgew0KICAgICAgaWYgKGRhdGEuUGlkKSB7DQogICAgICAgIGxldCBub2RlID0gdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKGRhdGEuUGlkKQ0KICAgICAgICBub2RlLmluZGV0ZXJtaW5hdGUgPSB0cnVlDQogICAgICAgIGlmIChub2RlLmRhdGEuUGlkKSB7DQogICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpLmluZGV0ZXJtaW5hdGUgPSB0cnVlDQogICAgICAgICAgdGhpcy5jaGVja05vZGUoDQogICAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLmdldE5vZGUobm9kZS5kYXRhLlBpZCkuZGF0YSwNCiAgICAgICAgICAgIHRoaXNfLA0KICAgICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpDQogICAgICAgICAgKQ0KICAgICAgICB9DQogICAgICAgIGlmICghbm9kZS5pbmRldGVybWluYXRlKSB7DQogICAgICAgICAgbm9kZS5pbmRldGVybWluYXRlID0gdHJ1ZQ0KICAgICAgICB9DQogICAgICB9IGVsc2UgaWYgKHBub2RlICYmICFwbm9kZS5pbmRldGVybWluYXRlKSB7DQogICAgICAgIHBub2RlLmluZGV0ZXJtaW5hdGUgPSB0cnVlDQogICAgICB9DQogICAgfSwNCiAgICAvL+Wbnui9puafpeivog0KICAgIHNlYXJjaEVudGVyRnVuOiBmdW5jdGlvbihlKSB7DQogICAgICB2YXIga2V5Q29kZSA9IHdpbmRvdy5ldmVudCA/IGUua2V5Q29kZSA6IGUud2hpY2gNCiAgICAgIGlmIChrZXlDb2RlID09IDEzKSB7DQogICAgICAgIHRoaXMuc2VhcmNoKCkNCiAgICAgIH0NCiAgICB9LA0KICAgIGhhbmRsZVNpemVDaGFuZ2U6IGZ1bmN0aW9uKHNpemUpIHsNCiAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gdHJ1ZQ0KICAgICAgLy/mr4/pobXkuIvmi4nmmL7npLrmlbDmja4NCiAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHNpemUNCiAgICAgIHRoaXMuc2VhcmNoKCkNCiAgICB9LA0KICAgIGhhbmRsZUN1cnJlbnRDaGFuZ2U6IGZ1bmN0aW9uKGN1cnJlbnRQYWdlKSB7DQogICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgIGlmICh0aGlzLnNlbGVjdE9yZ3MgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPiAwKSB7DQogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5mb3JFYWNoKChyb3cpID0+IHsNCiAgICAgICAgICBsZXQgcmVzID0gdGhpc18uaW5kZXhBcnJheSh0aGlzXy5jaGVja0JveERhdGFBbGwsIHJvdykNCiAgICAgICAgICBpZiAocmVzID09IC0xKSB7DQogICAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwucHVzaChyb3cpDQogICAgICAgICAgfQ0KICAgICAgICB9KQ0KICAgICAgfQ0KICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlDQogICAgICAvL+eCueWHu+esrOWHoOmhtQ0KICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2UgPSBjdXJyZW50UGFnZQ0KICAgICAgdGhpcy5zZWFyY2goKQ0KICAgIH0sDQogICAgY2hlY2tMaXN0KCkgew0KICAgICAgY29uc3QgdGhpc18gPSB0aGlzDQogICAgICBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgLy/liJfooagNCiAgICAgICAgaWYgKA0KICAgICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbCAhPSB1bmRlZmluZWQgJiYNCiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwubGVuZ3RoID4gMA0KICAgICAgICApIHsNCiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwuZm9yRWFjaCgocm93KSA9PiB7DQogICAgICAgICAgICBsZXQgcmVzID0gdGhpc18uaW5kZXhBcnJheSh0aGlzXy5kaWFsb2dEYXRhLCByb3cpDQogICAgICAgICAgICB0aGlzXy51bmRlZmluZWRhID0gcmVzDQogICAgICAgICAgICBpZiAocmVzICE9IC0xKSB7DQogICAgICAgICAgICAgIHRoaXNfLmlzQ3VycmVudENoYW5nZSA9IHRydWUNCiAgICAgICAgICAgICAgdGhpc18udG9nZ2xlUm93U2VsZWN0aW9uKHJlcywgdHJ1ZSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KQ0KICAgICAgICB9DQogICAgICB9LCAzMDApDQogICAgfSwNCiAgICB0b2dnbGVSb3dTZWxlY3Rpb24ocmVzLCB2YWwpIHsNCiAgICAgIHRoaXMuJHJlZnMub3JnVGFibGUudG9nZ2xlUm93U2VsZWN0aW9uKHRoaXMuZGlhbG9nRGF0YVtyZXNdLCB2YWwpDQogICAgfSwNCiAgICBzaG93RGlhbG9nKGl0ZW0pIHsNCiAgICAgIGNvbnN0IHRoaXNfID0gdGhpcw0KICAgICAgLy/nrKzkuozmrKHngrnlh7vlrZDooajlm57loavlr7nor53moYYg56ys5LiA5qyh6YCJ5Lit55qE5pWw5o2u5LiN5piv6YCJ5Lit54q25oCBDQogICAgICBpZiAodGhpc18uc2VsZWN0T3Jncykgew0KICAgICAgICB0aGlzXy5zZWxlY3RPcmdzLmVtcHR5KCkNCiAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLmVtcHR5KCkNCiAgICAgIH0NCiAgICAgIHZhciBhbGlhcyA9IHRoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nLmFsaWFzDQogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZm9ybS9nZXRCeUFsaWFzJywgYWxpYXMpLnRoZW4oKGN1c3RvbURpYWxvZykgPT4gew0KICAgICAgICBpZiAoIWN1c3RvbURpYWxvZyB8fCAhY3VzdG9tRGlhbG9nLmFsaWFzKSB7DQogICAgICAgICAgTWVzc2FnZS5lcnJvcign5a+56K+d5qGG5Yir5ZCN44CQJyArIGFsaWFzICsgJ+OAkeS4jeWtmOWcqO+8gScpDQogICAgICAgICAgcmV0dXJuDQogICAgICAgIH0NCiAgICAgICAgaWYgKGN1c3RvbURpYWxvZy5zdHlsZSA9PSAxKSB7DQogICAgICAgICAgdmFyIGRpc3BsYXlsaXN0ID0gSlNPTi5wYXJzZShjdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKQ0KICAgICAgICAgIHRoaXNfLm5vZGVLZXkgPSBkaXNwbGF5bGlzdC5pZA0KICAgICAgICB9DQogICAgICAgIC8v5a+56K+d5qGG5oyJ6KGo5Y2V5a2X5q615p+l6K+i77yI5Y+C5pWw5Lyg5YWl55qE77yJDQogICAgICAgIGxldCBiaW5kTGlzdCA9IHRoaXNfLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5jb25kaXRpb25zDQogICAgICAgIHRoaXNfLnBhcmFtID0gW10gLy/nu5HlrprnmoTooajljZXlrZfmrrUNCiAgICAgICAgaWYgKGJpbmRMaXN0Lmxlbmd0aCA+IDApIHsNCiAgICAgICAgICBiaW5kTGlzdC5mb3JFYWNoKChlbGUpID0+IHsNCiAgICAgICAgICAgIC8v57uR5a6a6KGo5Y2V5a2X5q61DQogICAgICAgICAgICBpZiAoZWxlLmRlZmF1bHRUeXBlID09ICczJyAmJiBlbGUuYmluZCkgew0KICAgICAgICAgICAgICBsZXQgb2JqID0ge30NCiAgICAgICAgICAgICAgb2JqLmZpZWxkID0gZWxlLmZpZWxkDQogICAgICAgICAgICAgIG9iai5iaW5kID0gZWxlLmJpbmQNCiAgICAgICAgICAgICAgdGhpc18ucGFyYW0ucHVzaChvYmopDQogICAgICAgICAgICB9DQogICAgICAgICAgfSkNCiAgICAgICAgfQ0KICAgICAgICAvL+WIpOaWreWvueivneahhuafpeivouaYr+WQpuacieadoeS7tg0KICAgICAgICBsZXQgdXNlcklucHV0TGlzdCA9IEpTT04ucGFyc2UoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKQ0KICAgICAgICB0aGlzXy5xdWlja1NlYXJjaCA9ICcnIC8v5aGr5YaZ5o+Q56S6IHBsYWNlaG9sZGVyDQogICAgICAgIHRoaXNfLmNvbmRpdGlvbkJpbmQgPSBbXQ0KICAgICAgICBsZXQgcXVlcnlQYXJhbXMgPSBbXQ0KICAgICAgICBsZXQgcGxhY2Vob2xkZXJzID0gW10NCiAgICAgICAgaWYgKHVzZXJJbnB1dExpc3QubGVuZ3RoID4gMCkgew0KICAgICAgICAgIHVzZXJJbnB1dExpc3QuZm9yRWFjaCgoZWxlKSA9PiB7DQogICAgICAgICAgICB2YXIgb2JqID0ge30NCiAgICAgICAgICAgIC8v5p2h5Lu25p+l6K+i5Y+C5pWw77yI55So5oi36L6T5YWl55qE77yJIOaWh+acrOahhui+k+WFpQ0KICAgICAgICAgICAgaWYgKGVsZS5kZWZhdWx0VHlwZSA9PSAnMScpIHsNCiAgICAgICAgICAgICAgb2JqW2VsZS5maWVsZF0gPSAnJw0KICAgICAgICAgICAgICBxdWVyeVBhcmFtcy5wdXNoKG9iaikNCiAgICAgICAgICAgICAgdGhpc18uY29uZGl0aW9uQmluZC5wdXNoKGVsZSkNCiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJzLnB1c2goJ+ivt+i+k+WFpScgKyBlbGUuY29tbWVudCkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KQ0KICAgICAgICAgIHRoaXMuJHNldCh0aGlzLCAncXVlcnlQYXJhbXMnLCBxdWVyeVBhcmFtcykNCiAgICAgICAgICB0aGlzLiRzZXQodGhpcywgJ3BsYWNlaG9sZGVycycsIHBsYWNlaG9sZGVycykNCiAgICAgICAgfQ0KICAgICAgICAvL+WIpOaWreaYr+WQpuaYvuekuuadoeS7tuafpeivoui+k+WFpeahhg0KICAgICAgICBpZiAodGhpc18ucXVpY2tTZWFyY2ggIT0gJycpIHsNCiAgICAgICAgICB0aGlzXy5xdWVyeXNTaG93ID0gdHJ1ZQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHRoaXNfLnF1ZXJ5c1Nob3cgPSBmYWxzZQ0KICAgICAgICB9DQogICAgICAgIHRoaXNfLnF1aWNrU2VhcmNoID0gJ+ivt+i+k+WFpScgKyB0aGlzLnF1aWNrU2VhcmNoICsgJ+afpeivoicNCiAgICAgICAgdGhpc18uc3R5bGUgPSAnaGVpZ2h0OicgKyBjdXN0b21EaWFsb2cuaGVpZ2h0ICsgJ3B4Jw0KICAgICAgICBpZiAod2luZG93LnNjcmVlbi5oZWlnaHQgJiYgd2luZG93LnNjcmVlbi5oZWlnaHQgPD0gOTAwKSB7DQogICAgICAgICAgdGhpcy5zdHlsZSA9ICdoZWlnaHQ6NDQwcHgnDQogICAgICAgIH0NCiAgICAgICAgaWYgKGN1c3RvbURpYWxvZy5zdHlsZSA9PSAwIHx8IGN1c3RvbURpYWxvZy5zdHlsZSA9PSAyKSB7DQogICAgICAgICAgLy/liJfooagNCiAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93KHthbGlhczogYWxpYXMsIGN1c3RvbURpYWxvZzogY3VzdG9tRGlhbG9nfSkNCiAgICAgICAgfSBlbHNlIGlmIChjdXN0b21EaWFsb2cuc3R5bGUgPT0gMSkgew0KICAgICAgICAgIC8v5qCR5b2iDQogICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nVHJlZVNob3coew0KICAgICAgICAgICAgYWxpYXM6IGFsaWFzLA0KICAgICAgICAgICAgY3VzdG9tRGlhbG9nOiBjdXN0b21EaWFsb2cNCiAgICAgICAgICB9KQ0KICAgICAgICB9DQogICAgICB9KQ0KICAgIH0sDQogICAgLy/liKTmlq3mlbDmja7mmK/lkKbljIXlkKvmn5DkuKrlr7nosaHvvIzlubbov5Tlm57mlbDmja7ljIXlkKvlr7nosaHnmoTkuIvmoIcNCiAgICBpbmRleEFycmF5KGFycmF5LCBpdGVtKSB7DQogICAgICBpZiAoYXJyYXkubGVuZ3RoID09IDApIHsNCiAgICAgICAgcmV0dXJuIC0xDQogICAgICB9DQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShhcnJheVtpXSkgPT0gSlNPTi5zdHJpbmdpZnkoaXRlbSkpIHsNCiAgICAgICAgICByZXR1cm4gaQ0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gLTENCiAgICB9LA0KICAgIC8v54K55Ye75YiX6KGo5p+Q5LiA5Liq5aSN6YCJ5qGG5pe26Kem5Y+RDQogICAgb25UYWJsZVNlbGVjdChyb3dzLCByb3cpIHsNCiAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gZmFsc2UNCiAgICAgIC8v5Yik5pat54K55Ye75YiX6KGo5pWw5o2u5pe25aSN6YCJ5qGG5piv5ZCm5Yu+6YCJICBzZWxlY3RlZO+8mnRydWXkuI3li77pgInvvIxmYWxzZeWLvumAiQ0KICAgICAgbGV0IHNlbGVjdGVkID0NCiAgICAgICAgdGhpcy5zZWxlY3RPcmdzICYmDQogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPiAwICYmDQogICAgICAgIHRoaXMuaW5kZXhBcnJheSh0aGlzLnNlbGVjdE9yZ3MsIHJvdykgIT09IC0xDQogICAgICBpZiAoc2VsZWN0ZWQpIHsNCiAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlDQogICAgICAgIGxldCByZXMgPSB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpDQogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKQ0KICAgICAgfQ0KICAgIH0sDQogICAgLy/ngrnlh7vliJfooajmn5DkuIDmnaHmlbDmja7ml7bop6blj5ENCiAgICBvcmdSb3dDbGljayhyb3csIGNvbHVtbiwgZXZlbnQpIHsNCiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsNCiAgICAgICAgJChldmVudC5jdXJyZW50VGFyZ2V0LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdKS50cmlnZ2VyKA0KICAgICAgICAgICdjbGljaycNCiAgICAgICAgKQ0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBbXQ0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChyb3cpDQogICAgICB9IGVsc2UgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSAhPSAxKSB7DQogICAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gZmFsc2UNCiAgICAgICAgLy/liKTmlq3ngrnlh7vliJfooajmlbDmja7ml7blpI3pgInmoYbmmK/lkKbli77pgIkgIHNlbGVjdGVk77yadHJ1ZeS4jeWLvumAie+8jGZhbHNl5Yu+6YCJDQogICAgICAgIGxldCBzZWxlY3RlZCA9DQogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzICYmDQogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA+IDAgJiYNCiAgICAgICAgICB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpICE9PSAtMQ0KICAgICAgICBpZiAoc2VsZWN0ZWQpIHsNCiAgICAgICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWUNCiAgICAgICAgICBsZXQgcmVzID0gdGhpcy5pbmRleEFycmF5KHRoaXMuc2VsZWN0T3Jncywgcm93KQ0KICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuJHJlZnMub3JnVGFibGUudG9nZ2xlUm93U2VsZWN0aW9uKHJvdykNCiAgICAgIH0NCiAgICB9LA0KICAgIC8v5YiX6KGo5aSN6YCJ5qGG5pyJ5pS55Y+Y5pe26Kem5Y+RDQogICAgb3JnVGFibGVTZWxlY3Rpb24oc2VsZWN0aW9uKSB7DQogICAgICAvL+WFqOmAieeahOaDheWGteeJueauiuWkhOeQhijkuLrkuobkuI7ljp/mnKzlip/og73pgLvovpHkuI3lhrLnqoEs5YWI5aSN5Yi25LiA5Lu95pen55qE6YCJ5Lit5pWw5o2uLueEtuWQjuaLv+WIsOWFqOmAieS6i+S7tuS4reWOu+iuoeeulykNCiAgICAgIHRoaXMub2xkc2VsZWN0T3JncyA9IF8uY2xvbmVEZWVwKHRoaXMuc2VsZWN0T3JncykNCiAgICAgIC8v5aSa6YCJDQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtICE9IDEgJiYgIXRoaXMuaXNDdXJyZW50Q2hhbmdlKSB7DQogICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICBpZiAoDQogICAgICAgICAgICBzZWxlY3Rpb24ubGVuZ3RoID09IDEgJiYNCiAgICAgICAgICAgICghdGhpcy5zZWxlY3RPcmdzIHx8IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPT0gMCkNCiAgICAgICAgICApIHsNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IHNlbGVjdGlvbg0KICAgICAgICAgIH0gZWxzZSBpZiAoDQogICAgICAgICAgICAoIXRoaXMuc2VsZWN0T3JncyB8fCB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID09IDApICYmDQogICAgICAgICAgICBzZWxlY3Rpb24ubGVuZ3RoID4gMQ0KICAgICAgICAgICkgew0KICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdE9yZ3MpIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW10NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzZWxlY3Rpb24ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2goc2VsZWN0aW9uW2ldKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0N1cnJlbnRDaGFuZ2UgJiYgc2VsZWN0aW9uLmxlbmd0aCA+PSAxMCkgew0KICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdE9yZ3MpIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW10NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGZvciAobGV0IHUgPSB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoIC0gMTsgdSA+PSAwOyB1LS0pIHsNCiAgICAgICAgICAgICAgICBsZXQgcmVzID0gdGhpcy5pbmRleEFycmF5KHNlbGVjdGlvbiwgdGhpcy5zZWxlY3RPcmdzW3VdKQ0KICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2goc2VsZWN0aW9uW2ldKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBmb3IgKGxldCBpID0gc2VsZWN0aW9uLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvbltpXSkNCiAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIGRpYWxvZ0NvbmZpcm0oKSB7DQogICAgICBpZiAoIXRoaXMuc2VsZWN0T3JncyB8fCB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID09IDApIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcign6K+36YCJ5oup5pWw5o2u5Zue5aGrJykNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICB0aGlzLnF1ZXJ5UGFyYW0gPSAnJw0KICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IGZhbHNlDQogICAgICB0aGlzLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKQ0KICAgICAgdGhpcy5zeW5jSW5wdXRWYWx1ZSgpDQogICAgfSwNCiAgICAvL+mHjee9rg0KICAgIHJlc2V0KCkgew0KICAgICAgdGhpcy5xdWVyeVBhcmFtcy5mb3JFYWNoKChwYXJhbU9iaikgPT4gew0KICAgICAgICBmb3IgKGxldCBrZXkgaW4gcGFyYW1PYmopIHsNCiAgICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zW2tleV0gPSAnJw0KICAgICAgICB9DQogICAgICB9KQ0KICAgICAgLy/nu4TlkIjmoJHph43nva4NCiAgICAgIGlmICh0aGlzLiRyZWZzLmNvbWJpbmF0aW9uVHJlZSkgew0KICAgICAgICBsZXQgbm9kZXMgPSB0aGlzLiRyZWZzLmNvbWJpbmF0aW9uVHJlZS5zdG9yZS5ub2Rlc01hcA0KICAgICAgICBmb3IgKGxldCBrZXkgaW4gbm9kZXMpIHsNCiAgICAgICAgICBub2Rlc1trZXldLmV4cGFuZGVkID0gZmFsc2UNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMuc3BsaWNlKDApDQogICAgICB0aGlzLnNlYXJjaCh0cnVlKQ0KICAgIH0sDQogICAgLy/mn6Xor6INCiAgICBzZWFyY2gocmVzZXRQYWdpbnRpb24pIHsNCiAgICAgIGxldCBxdWVyeXMgPSBbXSAvL+afpeivouadoeS7tg0KICAgICAgbGV0IHF1ZXJ5RmlsdGVyID0ge30NCiAgICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLnBhZ2luYXRpb24pID09ICd7fScpIHsNCiAgICAgICAgdGhpcy5wYWdpbmF0aW9uID0ge3BhZ2U6IDEsIHBhZ2VTaXplOiAyMCwgc2hvd1RvdGFsOiAndHJ1ZSd9DQogICAgICB9DQogICAgICBsZXQgcGFnZUJlYW4gPSB7cGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbn0NCiAgICAgIGlmIChyZXNldFBhZ2ludGlvbikgew0KICAgICAgICBwYWdlQmVhbi5wYWdlQmVhbiA9IHtwYWdlOiAxLCBwYWdlU2l6ZTogMjAsIHNob3dUb3RhbDogJ3RydWUnfQ0KICAgICAgfQ0KICAgICAgLy/nlKjmiLfovpPlhaXnmoQNCiAgICAgIGlmICh0aGlzLnF1ZXJ5UGFyYW1zLmxlbmd0aCAhPSAwICYmIHRoaXMucXVlcnlQYXJhbXNbMF0gIT0gJycpIHsNCiAgICAgICAgdGhpcy5jb25kaXRpb25CaW5kLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7DQogICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGQsDQogICAgICAgICAgICB2YWx1ZTogdGhpcy5xdWVyeVBhcmFtc1tpdGVtLmZpZWxkXSwNCiAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsDQogICAgICAgICAgICBvcGVyYXRpb246ICdMSUtFJywNCiAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJw0KICAgICAgICAgIH0pDQogICAgICAgIH0pDQogICAgICB9DQogICAgICAvL+WPguaVsOS8oOWFpeeahOafpeivouaLvOaOpQ0KICAgICAgaWYgKHRoaXMucGFyYW0pIHsNCiAgICAgICAgY29uc3QgcEluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcykNCiAgICAgICAgdGhpcy5wYXJhbS5mb3JFYWNoKChpdGVtKSA9PiB7DQogICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGQsDQogICAgICAgICAgICB2YWx1ZTogdXRpbHMuZ2V0VmFsdWVCeVBhdGgocEluc3QsIGl0ZW0uYmluZCksDQogICAgICAgICAgICBncm91cDogJ21haW4nLA0KICAgICAgICAgICAgb3BlcmF0aW9uOiAnTElLRScsDQogICAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgICB9KQ0KICAgICAgICB9KQ0KICAgICAgfQ0KICAgICAgLy/mnaXoh6rnu4TlkIjlr7nor53moYbnmoQNCiAgICAgIGlmICgNCiAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMgJiYNCiAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMubGVuZ3RoICE9IDANCiAgICAgICkgew0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgcXVlcnlzLnB1c2godGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXNbaV0pDQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgaWYgKHF1ZXJ5cy5sZW5ndGggPiAwKSB7DQogICAgICAgIHF1ZXJ5RmlsdGVyID0ge3BhZ2VCZWFuOiBwYWdlQmVhbi5wYWdlQmVhbiwgcXVlcnlzfQ0KICAgICAgICB0aGlzLmN1c3RvbURpYWxvZy5wYWdlQmVhbiA9IHF1ZXJ5RmlsdGVyDQogICAgICAgIHRoaXMuJHN0b3JlDQogICAgICAgICAgLmRpc3BhdGNoKCdkaWFsb2cvZ2V0bGlzdEpzb24nLCB0aGlzLmN1c3RvbURpYWxvZykNCiAgICAgICAgICAudGhlbigoKSA9PiB7DQogICAgICAgICAgICB0aGlzLmNoZWNrTGlzdCgpDQogICAgICAgICAgfSkNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLnBhZ2VCZWFuID0gcGFnZUJlYW4NCiAgICAgICAgdGhpcy4kc3RvcmUNCiAgICAgICAgICAuZGlzcGF0Y2goJ2RpYWxvZy9nZXRsaXN0SnNvbicsIHRoaXMuY3VzdG9tRGlhbG9nKQ0KICAgICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICAgIHRoaXMuY2hlY2tMaXN0KCkNCiAgICAgICAgICB9KQ0KICAgICAgfQ0KICAgIH0sDQogICAgYXN5bmMgZG9RdWVyeShwYXJhbSkgew0KICAgICAgbGV0IHBhcmFtTG9hZERhdGEgPSBbXQ0KICAgICAgY29uc3QgcEluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcykNCiAgICAgIC8v6I635Y+W5YWz6IGU5p+l6K+i57uR5a6a55qE6KGo5Y2V5Y+C5pWwDQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtLmNvbmRpdGlvbmZpZWxkLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGlmIChwYXJhbS5jb25kaXRpb25maWVsZFtpXS5maWVsZFBhdGggIT0gJycpIHsNCiAgICAgICAgICBsZXQgYmluZFZhbCA9IHV0aWxzLmdldFZhbHVlQnlQYXRoKA0KICAgICAgICAgICAgcEluc3QsDQogICAgICAgICAgICBwYXJhbS5jb25kaXRpb25maWVsZFtpXS5maWVsZFBhdGgsDQogICAgICAgICAgICBudWxsDQogICAgICAgICAgKQ0KICAgICAgICAgIGxldCBvYmogPSB7a2V5OiBwYXJhbS5jb25kaXRpb25maWVsZFtpXS5maWVsZCwgdmFsdWU6IGJpbmRWYWx9DQogICAgICAgICAgcGFyYW1Mb2FkRGF0YS5wdXNoKG9iaikNCiAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICBsZXQgcXVlcnlVcmwgPQ0KICAgICAgICBwYXJhbS5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnDQogICAgICAgICAgPyAnJHtmb3JtfS9mb3JtL2N1c3RvbVF1ZXJ5L3YxL2RvUXVlcnk/YWxpYXM9JyArDQogICAgICAgICAgcGFyYW0uYWxpYXMgKw0KICAgICAgICAgICcmcGFnZT0xJw0KICAgICAgICAgIDogcGFyYW0udXJsDQogICAgICBsZXQgcmVxdWVzdE1ldGhvZCA9ICdQT1NUJw0KICAgICAgLy/lpoLmnpzlhbPogZTmlbDmja7liJfooajmn6Xor6LmlbDmja7kuI3mmK/mlbDmja7mupDliJnor7fmsYLmlrnms5XkuLpyZXN0ZnVs6YWN572u55qE6K+35rGC5pa55byPDQogICAgICBpZiAocGFyYW0uZHNUeXBlICE9ICdkYXRhU291cmNlJykgew0KICAgICAgICByZXF1ZXN0TWV0aG9kID0gcGFyYW0ucmVxdWVzdFR5cGUNCiAgICAgIH0NCiAgICAgIC8v5p+l6K+i5pWw5o2uDQogICAgICByZXENCiAgICAgICAgLnJlcXVlc3Qoe3VybDogcXVlcnlVcmwsIG1ldGhvZDogcmVxdWVzdE1ldGhvZCwgZGF0YTogcGFyYW1Mb2FkRGF0YX0pDQogICAgICAgIC50aGVuKChyZXMpID0+IHsNCiAgICAgICAgICAvL+WIpOaWreaYr+WQpuacieWFs+iBlOafpeivouaVsOaNrui/lOWbng0KICAgICAgICAgIGlmIChyZXMuZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgIC8v6I635Y+W5YWz6IGU5p+l6K+i6L+U5Zue55qE6KGo5Y2V5Y+C5pWwDQogICAgICAgICAgICBmb3IgKGxldCBpbyA9IDA7IGlvIDwgcGFyYW0ucmVzdWx0ZmllbGQubGVuZ3RoOyBpbysrKSB7DQogICAgICAgICAgICAgIGlmIChwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoICE9ICcnKSB7DQogICAgICAgICAgICAgICAgbGV0IHZhbCA9ICcnDQogICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZXMuZGF0YS5yb3dzLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICBpZiAocmVzLmRhdGEucm93c1tqXVtwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRdKSB7DQogICAgICAgICAgICAgICAgICAgIHZhbCA9DQogICAgICAgICAgICAgICAgICAgICAgdmFsICsgcmVzLmRhdGEucm93c1tqXVtwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRdICsgJywnDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpDQogICAgICAgICAgICAgICAgbGV0IHBhdGhBcnIgPSBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLnNwbGl0KCcuJykNCiAgICAgICAgICAgICAgICBpZiAocGF0aEFyci5sZW5ndGggPT0gMykgew0KICAgICAgICAgICAgICAgICAgLy/kuLvooagNCiAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKA0KICAgICAgICAgICAgICAgICAgICBwSW5zdCwNCiAgICAgICAgICAgICAgICAgICAgcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkUGF0aCwNCiAgICAgICAgICAgICAgICAgICAgdmFsLA0KICAgICAgICAgICAgICAgICAgICBudWxsDQogICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoQXJyLmxlbmd0aCA9PSA0KSB7DQogICAgICAgICAgICAgICAgICAvL+WtkOihqA0KICAgICAgICAgICAgICAgICAgbGV0IHN1YkRhdGEgPSBwSW5zdC5kYXRhW3BhdGhBcnJbMV1dW3BhdGhBcnJbMl1dDQogICAgICAgICAgICAgICAgICBpZiAoc3ViRGF0YS5sZW5ndGggPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAvL+WtkOihqOayoeaVsOaNrueahOaDheWGtQ0KICAgICAgICAgICAgICAgICAgICBsZXQgc3ViVGFiTmFtZSA9IHBhdGhBcnJbMl0ucmVwbGFjZSgnc3ViXycsICcnKQ0KICAgICAgICAgICAgICAgICAgICAvL+W+l+WIsOWtkOihqOeahOaJgOacieWtl+autQ0KICAgICAgICAgICAgICAgICAgICBsZXQgc3ViSW5pdERhdGEgPQ0KICAgICAgICAgICAgICAgICAgICAgIHBJbnN0LmRhdGFbcGF0aEFyclsxXV0uaW5pdERhdGFbc3ViVGFiTmFtZV0gfHwge30NCiAgICAgICAgICAgICAgICAgICAgLy/miormlbDnu4Tph4zpnaLnmoTlgLzkuLogbnVsbCDovazmjaLkuLrnqbrlrZfnrKbkuLINCiAgICAgICAgICAgICAgICAgICAgbGV0IHN0ciA9IEpTT04uc3RyaW5naWZ5KHN1YkluaXREYXRhKS5yZXBsYWNlKA0KICAgICAgICAgICAgICAgICAgICAgIC9udWxsL2csDQogICAgICAgICAgICAgICAgICAgICAgJyIiJw0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgIGxldCBzdWJEYXRhID0gSlNPTi5wYXJzZShzdHIpDQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzdWJEYXRhKSB7DQogICAgICAgICAgICAgICAgICAgICAgLy/ngrnmt7vliqDml7bliKTmlq3opoHmlrDlop7lrZDooajorrDlvZXkuK3nmoTlrZnooajmmK/lkKbmnInlgLwNCiAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ3N1Yl8nKSA9PSAwICYmIHN1YkRhdGFba2V5XS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBzdWJEYXRhW2tleV0gPSBbXSAvL+acieWImea4heepug0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAvL+eCuea3u+WKoOaXtuWIpOaWreimgeaWsOWinuWtkOihqOiusOW9leS4reeahOWtl+auteaYr+WQpuacieWAvA0KICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJEYXRhW2tleV0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN1YkRhdGFba2V5XSA9ICcnIC8v5pyJ5YiZ5riF56m6DQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIC8v5paw5aKe5LiA5p2h5pWw5o2uDQogICAgICAgICAgICAgICAgICAgIHBJbnN0LmRhdGFbcGF0aEFyclsxXV1bcGF0aEFyclsyXV0ucHVzaChzdWJEYXRhKQ0KICAgICAgICAgICAgICAgICAgICAvL+WvueivneahhuWFs+iBlOafpeivoui/lOWbnueahOWAvOi1i+WAvOe7mee7keWumueahOWtl+autQ0KICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aCgNCiAgICAgICAgICAgICAgICAgICAgICBwSW5zdCwNCiAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLA0KICAgICAgICAgICAgICAgICAgICAgIHZhbCwNCiAgICAgICAgICAgICAgICAgICAgICAwDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGo5pyJ5pWw5o2u55qE5oOF5Ya1DQogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgc3ViRGF0YS5sZW5ndGg7IHArKykgew0KICAgICAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61DQogICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgoDQogICAgICAgICAgICAgICAgICAgICAgICBwSW5zdCwNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGgsDQogICAgICAgICAgICAgICAgICAgICAgICB2YWwsDQogICAgICAgICAgICAgICAgICAgICAgICBwDQogICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIC8v5rKh5pyJ6L+U5Zue55qE5YC85YiZ5riF56m6DQogICAgICAgICAgICAvL+iOt+WPluWFs+iBlOafpeivoui/lOWbnueahOihqOWNleWPguaVsA0KICAgICAgICAgICAgZm9yIChsZXQgaW9wID0gMDsgaW9wIDwgcGFyYW0ucmVzdWx0ZmllbGQubGVuZ3RoOyBpb3ArKykgew0KICAgICAgICAgICAgICBpZiAocGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGggIT0gJycpIHsNCiAgICAgICAgICAgICAgICBsZXQgcGF0aEFyciA9IHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLnNwbGl0KCcuJykNCiAgICAgICAgICAgICAgICBpZiAocGF0aEFyci5sZW5ndGggPT0gMykgew0KICAgICAgICAgICAgICAgICAgLy/kuLvooagNCiAgICAgICAgICAgICAgICAgIC8v6LWL5YC857uZ57uR5a6a55qE5a2X5q61DQogICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aCgNCiAgICAgICAgICAgICAgICAgICAgcEluc3QsDQogICAgICAgICAgICAgICAgICAgIHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLA0KICAgICAgICAgICAgICAgICAgICAnJywNCiAgICAgICAgICAgICAgICAgICAgbnVsbA0KICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aEFyci5sZW5ndGggPT0gNCkgew0KICAgICAgICAgICAgICAgICAgLy/lrZDooagNCiAgICAgICAgICAgICAgICAgIGxldCBzdWJEYXRhID0gcEluc3QuZGF0YVtwYXRoQXJyWzFdXVtwYXRoQXJyWzJdXQ0KICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCBzdWJEYXRhLmxlbmd0aDsgcCsrKSB7DQogICAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61DQogICAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKA0KICAgICAgICAgICAgICAgICAgICAgIHBJbnN0LA0KICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLA0KICAgICAgICAgICAgICAgICAgICAgICcnLA0KICAgICAgICAgICAgICAgICAgICAgIHANCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfSkNCiAgICB9LA0KICAgIC8vIOWQjOatpemAieaLqee7k+aenA0KICAgIHN5bmNJbnB1dFZhbHVlKCkgew0KICAgICAgdmFyIHJldHVyblN0ciA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cucmVzdWx0ZmllbGQpDQogICAgICAvL+aLv+WIsOi/lOWbnueahOWtl+autQ0KICAgICAgdmFyIGZpZWxkID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSkNCiAgICAgIHZhciBjb21tZW50ID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSkNCiAgICAgIHZhciBzdHIgPSBbXQ0KICAgICAgdmFyIGlkcyA9IFtdDQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJldHVyblN0ci5sZW5ndGg7IGkrKykgew0KICAgICAgICBmaWVsZFtpXSA9DQogICAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJw0KICAgICAgICAgICAgPyByZXR1cm5TdHJbaV0uZmllbGQudG9Mb3dlckNhc2UoKQ0KICAgICAgICAgICAgOiByZXR1cm5TdHJbaV0uZmllbGQNCiAgICAgICAgY29tbWVudFtpXSA9DQogICAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJw0KICAgICAgICAgICAgPyByZXR1cm5TdHJbaV0uY29tbWVudC50b0xvd2VyQ2FzZSgpDQogICAgICAgICAgICA6IHJldHVyblN0cltpXS5jb21tZW50DQogICAgICB9DQogICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgIHRoaXMuc2VsZWN0T3Jncy5mb3JFYWNoKHJvdyA9PiB7DQogICAgICAgIGlmICh0aGlzXy5jaGVja0JveERhdGFBbGwgfHwgdGhpc18uY2hlY2tCb3hEYXRhQWxsLmxlbmd0aCA8IDEpIHsNCiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwucHVzaChyb3cpDQogICAgICAgIH0gZWxzZSBpZiAoDQogICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpc18uaW5kZXhBcnJheSkuaW5kZXhPZihKU09OLnN0cmluZ2lmeShyb3cpKSA9PSAtMQ0KICAgICAgICApIHsNCiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwucHVzaChyb3cpDQogICAgICAgIH0NCiAgICAgIH0pDQogICAgICB2YXIgcyA9IHRoaXMuc2VsZWN0T3Jncw0KDQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7DQogICAgICAgIHZhciB0ZW1wID0gJycNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgbGV0IGVuY29kZVN0ciA9IGVuY29kZVVSSUNvbXBvbmVudChzWzBdW2ZpZWxkW2ldXSkNCiAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIGVuY29kZVN0ciArICciLCcNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGVtcCAhPSAnJykgew0KICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nDQogICAgICAgIH0NCiAgICAgICAgc3RyLnB1c2goSlNPTi5wYXJzZSh0ZW1wKSkNCiAgICAgICAgaWRzLnB1c2goc1swXS5pZCkNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgIHZhciB0ZW1wID0gJycNCiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbW1lbnQubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgIGxldCBlbmNvZGVTdHIgPSBlbmNvZGVVUklDb21wb25lbnQoc1tpXVtmaWVsZFtqXV0pDQogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbal0gKyAnIjoiJyArIGVuY29kZVN0ciArICciLCcNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsNCiAgICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nDQogICAgICAgICAgfQ0KICAgICAgICAgIHN0ci5wdXNoKEpTT04ucGFyc2UodGVtcCkpDQogICAgICAgICAgaWRzLnB1c2goc1tpXS5pZCkNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgY29uc3QgcmV0dXJuRGF0YSA9IHN0cg0KICAgICAgY29uc3QgX3RoaXMgPSB0aGlzDQogICAgICBjb25zdCBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKQ0KICAgICAgdHJ5IHsNCiAgICAgICAgbGV0IHJldHVyblNpemUgPSByZXR1cm5EYXRhLmxlbmd0aA0KICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+S4gOWvueS4gOWtmeihqA0KICAgICAgICBpZiAoX3RoaXMucmVsYXRpb24gJiYgX3RoaXMucmVsYXRpb24gPT0gJ29uZXRvb25lJykgew0KICAgICAgICAgIGlmIChyZXR1cm5TaXplID4gMSkgew0KICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoJ+S4gOWvueS4gOWtmeihqOWPquiDvemAieaLqeS4gOadoeaVsOaNricpDQogICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IHRydWUNCiAgICAgICAgICAgIHJldHVybg0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm5EYXRhLmZvckVhY2gocm93ID0+IHsNCiAgICAgICAgICB2YXIgdGFyZ2V0QXJyYXkgPSBudWxsDQogICAgICAgICAgdmFyIHN1YkxpbmVEYXRhID0ge30NCiAgICAgICAgICBfdGhpcy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cubWFwcGluZ0NvbmYuZm9yRWFjaChjb24gPT4gew0KICAgICAgICAgICAgaWYgKGNvbi50YXJnZXRbMF0pIHsNCiAgICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBjb24udGFyZ2V0WzBdLnNwbGl0KCcuJykNCiAgICAgICAgICAgICAgdmFyIGZyb20gPSAnJw0KICAgICAgICAgICAgICBpZiAoX3RoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAncmVzdGZ1bCcpIHsNCiAgICAgICAgICAgICAgICBmcm9tID0gY29uLmZyb20NCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBmcm9tID0gY29uLmZyb20udG9Mb3dlckNhc2UoKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIHN1YkxpbmVEYXRhW3RhcmdldEFycmF5W3RhcmdldEFycmF5Lmxlbmd0aCAtIDFdXSA9IGRlY29kZVVSSUNvbXBvbmVudChyb3dbZnJvbV0pDQogICAgICAgICAgICB9DQogICAgICAgICAgfSkNCiAgICAgICAgICBpZiAodGFyZ2V0QXJyYXkpIHsNCiAgICAgICAgICAgIC8v5a2Q6KGo55qE5LiL5qCHDQogICAgICAgICAgICBsZXQgc3ViSW5kZXggPSB1dGlscy5nZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQoX3RoaXMuJGVsLCAnZGF0YS1pbmRleCcpDQogICAgICAgICAgICAvL+WIpOaWreWtmeihqOaYr+WQpuetieS6juepug0KICAgICAgICAgICAgaWYgKCFmb3JtSW5zdFsnZGF0YSddW3RhcmdldEFycmF5WzBdXVt0YXJnZXRBcnJheVsxXV1bc3ViSW5kZXhdW3RhcmdldEFycmF5WzJdXSkgew0KICAgICAgICAgICAgICAvL+WmguaenOetieS6juepuuWImeiuqeWug+etieS6juepuuaVsOe7hA0KICAgICAgICAgICAgICBmb3JtSW5zdFsnZGF0YSddW3RhcmdldEFycmF5WzBdXVt0YXJnZXRBcnJheVsxXV1bc3ViSW5kZXhdW3RhcmdldEFycmF5WzJdXSA9IG5ldyBBcnJheSgpDQogICAgICAgICAgICB9DQogICAgICAgICAgICBsZXQgc3ViQm8gPSBmb3JtSW5zdFsnZGF0YSddW3RhcmdldEFycmF5WzBdXVt0YXJnZXRBcnJheVsxXV1bc3ViSW5kZXhdW3RhcmdldEFycmF5WzJdXQ0KICAgICAgICAgICAgLy/liKTmlq3mmK/lkKblpKfkuo7lrZnooajmlbDmja7mnIDlpKfooYzmlbANCiAgICAgICAgICAgIGlmICh0aGlzXy5tYXhSb3cgIT0gMCAmJiAoc3ViQm8ubGVuZ3RoICsgcmV0dXJuU2l6ZSkgPiB0aGlzXy5tYXhSb3cpIHsNCiAgICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoJ+WtmeihqOaVsOaNruW3sui2hei/h+acgOWkp+ihjOaVsOOAkCcgKyB0aGlzXy5tYXhSb3cgKyAn44CRJykNCiAgICAgICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSB0cnVlDQogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRW5kSXRlcmF0aXZlJykNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm5piv5LiA5a+55LiA5a2Z6KGoDQogICAgICAgICAgICBpZiAoX3RoaXMucmVsYXRpb24gJiYgX3RoaXMucmVsYXRpb24gPT0gJ29uZXRvb25lJykgew0KICAgICAgICAgICAgICBzdWJCby5lbXB0eSgpDQogICAgICAgICAgICB9DQogICAgICAgICAgICBzdWJCby5wdXNoKHN1YkxpbmVEYXRhKQ0KICAgICAgICAgICAgcmV0dXJuU2l6ZS0tDQogICAgICAgICAgfQ0KICAgICAgICB9KQ0KICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICBpZiAoZS5tZXNzYWdlICE9ICdFbmRJdGVyYXRpdmUnKSB0aHJvdyBlDQogICAgICB9DQoNCiAgICB9LA0KICAgIC8v5Y+W5raI5oyJ6ZKuDQogICAgZGlhbG9nQ2FuY2VsKCkgew0KICAgICAgY29uc3QgdGhpc18gPSB0aGlzDQogICAgICB0aGlzXy5xdWVyeVBhcmFtID0gJycNCiAgICAgIHRoaXNfLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL3NldERpYWxvZ0RhdGEnLCBbXSkudGhlbigoKSA9PiB7DQogICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gZmFsc2UNCiAgICAgICAgLy/liKTmlq3mmK/lkKbmmK/ngrnlh7vkuobnoa7orqTlho3ngrnlh7vlj5bmtojnmoQgIGlucHV0VmFs5rKh5pyJ5YC85YiZ6KGo56S655u05o6l54K55Ye755qE5Y+W5raIDQogICAgICAgIGlmICghdGhpc18uaW5wdXRWYWwpIHsNCiAgICAgICAgICB0aGlzXy5zZWxlY3RPcmdzID0gW10NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0aGlzXy5zZWxlY3RPcmdzID0gWy4uLnRoaXNfLnNob3dEYXRhXQ0KICAgICAgICAgIHRoaXMuY2hlY2tCb3hEYXRhQWxsID0gWy4uLnRoaXNfLnNlbGVjdE9yZ3NdDQogICAgICAgIH0NCiAgICAgIH0pDQogICAgfSwNCiAgICBkaWFsb2dUcmVlQ29uZmlybSgpIHsNCiAgICAgIGNvbnN0IHRoaXNfID0gdGhpcw0KICAgICAgaWYgKHRoaXNfLnByb3BzRGF0YS5sZW5ndGggPT0gMCkgew0KICAgICAgICB0aGlzXy4kbWVzc2FnZS5lcnJvcign6K+36YCJ5oup5pWw5o2u5Zue5aGrJykNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL3NldERpYWxvZ0RhdGEnLCBbXSkNCiAgICAgIHZhciByZXR1cm5TdHIgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLnJlc3VsdGZpZWxkKQ0KICAgICAgdmFyIGZpZWxkID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSkNCiAgICAgIHZhciBjb21tZW50ID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSkNCiAgICAgIHZhciBzdHIgPSBbXQ0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXR1cm5TdHIubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgZmllbGRbaV0gPSByZXR1cm5TdHJbaV0uZmllbGQNCiAgICAgICAgY29tbWVudFtpXSA9IHJldHVyblN0cltpXS5jb21tZW50DQogICAgICB9DQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7DQogICAgICAgIHZhciBub2RlcyA9IHRoaXMucHJvcHNEYXRhWzBdDQogICAgICAgIHZhciB0ZW1wID0gJycNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1tmaWVsZFtpXV0gKyAnIiwnDQogICAgICAgIH0NCiAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsNCiAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9Jw0KICAgICAgICB9DQogICAgICAgIHN0ci5wdXNoKEpTT04ucGFyc2UodGVtcCkpDQogICAgICB9IGVsc2Ugew0KICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLnByb3BzRGF0YQ0KICAgICAgICBub2Rlcy5mb3JFYWNoKChpdGVtLCBrKSA9PiB7DQogICAgICAgICAgdmFyIHRlbXAgPSAnJw0KICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1tmaWVsZFtpXV0gKyAnIiwnDQogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIG5vZGVzW2tdW2ZpZWxkW2ldXSArICciLCcNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsNCiAgICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nDQogICAgICAgICAgfQ0KICAgICAgICAgIHN0ci5wdXNoKEpTT04ucGFyc2UodGVtcCkpDQogICAgICAgIH0pDQogICAgICB9DQogICAgICBjb25zdCByZXR1cm5EYXRhID0gc3RyDQogICAgICBjb25zdCBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKQ0KICAgICAgdHJ5IHsNCiAgICAgICAgbGV0IHJldHVyblNpemUgPSByZXR1cm5EYXRhLmxlbmd0aA0KICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+S4gOWvueS4gOWtmeihqA0KICAgICAgICBpZiAodGhpc18ucmVsYXRpb24gJiYgdGhpc18ucmVsYXRpb24gPT0gJ29uZXRvb25lJykgew0KICAgICAgICAgIGlmIChyZXR1cm5TaXplID4gMSkgew0KICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoJ+S4gOWvueS4gOWtmeihqOWPquiDvemAieaLqeS4gOadoeaVsOaNricpDQogICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IHRydWUNCiAgICAgICAgICAgIHJldHVybg0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm5EYXRhLmZvckVhY2gocm93ID0+IHsNCiAgICAgICAgICB2YXIgdGFyZ2V0QXJyYXkgPSBudWxsDQogICAgICAgICAgdmFyIHN1YkxpbmVEYXRhID0ge30NCiAgICAgICAgICB2YXIgcGF0aEFycmF5ID0gbnVsbA0KICAgICAgICAgIHRoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nLm1hcHBpbmdDb25mLmZvckVhY2goY29uID0+IHsNCiAgICAgICAgICAgIHRhcmdldEFycmF5ID0gbnVsbA0KICAgICAgICAgICAgaWYgKGNvbi50YXJnZXRbMF0pIHsNCiAgICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBjb24udGFyZ2V0WzBdLnNwbGl0KCcuJykNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChjb24udGFyZ2V0WzBdICYmICFwYXRoQXJyYXkpIHsNCiAgICAgICAgICAgICAgcGF0aEFycmF5ID0gY29uLnRhcmdldFswXS5zcGxpdCgnLicpDQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgZnJvbSA9ICcnDQogICAgICAgICAgICBpZiAodGhpc18uY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAncmVzdGZ1bCcpIHsNCiAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBmcm9tID0gY29uLmZyb20NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0YXJnZXRBcnJheSkgew0KICAgICAgICAgICAgICBzdWJMaW5lRGF0YVt0YXJnZXRBcnJheVt0YXJnZXRBcnJheS5sZW5ndGggLSAxXV0gPSByb3dbZnJvbV0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KQ0KICAgICAgICAgIGlmIChwYXRoQXJyYXkpIHsNCiAgICAgICAgICAgIC8v5a2Q6KGo55qE5LiL5qCHDQogICAgICAgICAgICBsZXQgc3ViSW5kZXggPSB1dGlscy5nZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQodGhpc18uJGVsLCAnZGF0YS1pbmRleCcpDQogICAgICAgICAgICAvL+WIpOaWreWtmeihqOaYr+WQpuetieS6juepug0KICAgICAgICAgICAgaWYgKCFmb3JtSW5zdFsnZGF0YSddW3BhdGhBcnJheVswXV1bcGF0aEFycmF5WzFdXVtzdWJJbmRleF1bcGF0aEFycmF5WzJdXSkgew0KICAgICAgICAgICAgICAvL+WmguaenOetieS6juepuuWImeiuqeWug+etieS6juepuuaVsOe7hA0KICAgICAgICAgICAgICBmb3JtSW5zdFsnZGF0YSddW3BhdGhBcnJheVswXV1bcGF0aEFycmF5WzFdXVtzdWJJbmRleF1bcGF0aEFycmF5WzJdXSA9IG5ldyBBcnJheSgpDQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgc3ViQm8gPSBmb3JtSW5zdFsnZGF0YSddW3BhdGhBcnJheVswXV1bcGF0aEFycmF5WzFdXVtzdWJJbmRleF1bcGF0aEFycmF5WzJdXQ0KICAgICAgICAgICAgLy/liKTmlq3mmK/lkKblpKfkuo7lrZnooajmlbDmja7mnIDlpKfooYzmlbANCiAgICAgICAgICAgIGlmICh0aGlzXy5tYXhSb3cgIT0gMCAmJiAoc3ViQm8ubGVuZ3RoICsgcmV0dXJuU2l6ZSkgPiB0aGlzXy5tYXhSb3cpIHsNCiAgICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoJ+WtmeihqOaVsOaNruW3sui2hei/h+acgOWkp+ihjOaVsOOAkCcgKyB0aGlzXy5tYXhSb3cgKyAn44CRJykNCiAgICAgICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSB0cnVlDQogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRW5kSXRlcmF0aXZlJykNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm5piv5LiA5a+55LiA5a2Z6KGoDQogICAgICAgICAgICBpZiAodGhpc18ucmVsYXRpb24gJiYgdGhpc18ucmVsYXRpb24gPT0gJ29uZXRvb25lJykgew0KICAgICAgICAgICAgICBzdWJCby5lbXB0eSgpDQogICAgICAgICAgICB9DQogICAgICAgICAgICBzdWJCby5wdXNoKHN1YkxpbmVEYXRhKQ0KICAgICAgICAgICAgcmV0dXJuU2l6ZS0tDQogICAgICAgICAgfQ0KICAgICAgICB9KQ0KICAgICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gZmFsc2UNCiAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgaWYgKGUubWVzc2FnZSAhPSAnRW5kSXRlcmF0aXZlJykgdGhyb3cgZQ0KICAgICAgfQ0KDQoNCiAgICB9LA0KICAgIGRpYWxvZ0NhbmNlbFRyZWUoKSB7DQogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL3NldERpYWxvZ0RhdGEnLCBbXSkNCiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSBmYWxzZQ0KICAgIH0sDQogICAgZ2V0Q2hlY2tlZChkYXRhLCBjaGVja2VkLCBpbmRldGVybWluYXRlKSB7DQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7DQogICAgICAgIHRoaXMucHJvcHNEYXRhID0gW10NCiAgICAgICAgdGhpcy5wcm9wc0RhdGEucHVzaChkYXRhKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5wcm9wc0RhdGEgPSB0aGlzLiRyZWZzLnRyZWUuZ2V0Q2hlY2tlZE5vZGVzKCkNCiAgICAgIH0NCiAgICB9LA0KICAgIHRyZWVDbGljayhkYXRhLCBuLCBpKSB7DQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7DQogICAgICAgIHRoaXMucHJvcHNEYXRhID0gW10NCiAgICAgICAgdGhpcy5wcm9wc0RhdGEucHVzaChkYXRhKQ0KICAgICAgfQ0KICAgIH0sDQogICAgY2xlYXJBbGxTZWxlY3RPcmdzKCkgew0KICAgICAgdGhpcy5zZWxlY3RPcmdzID0gbnVsbA0KICAgICAgdGhpcy4kcmVmcy5vcmdUYWJsZS5jbGVhclNlbGVjdGlvbigpDQogICAgfSwNCiAgICByZW1vdmVTZWxlY3RPcmcoaXRlbSkgew0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgew0KICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsICcnKQ0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKGl0ZW0sIDEpDQogICAgICAgIHRoaXMuc2hvd0RhdGEuc3BsaWNlKGl0ZW0sIDEpDQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLmlucHV0VmFsLnNwbGljZShpdGVtLCAxKQ0KICAgICAgICAvLyBsZXQgcmVtb3ZlSWQgPSB0aGlzLnNob3dEYXRhW2l0ZW1dOw0KICAgICAgICAvL+agkeW9og0KICAgICAgICBpZiAodGhpcy5wcm9wc0RhdGEubGVuZ3RoID4gMCkgew0KICAgICAgICAgIHRoaXMucHJvcHNEYXRhLnNwbGljZShpdGVtLCAxKQ0KICAgICAgICB9DQogICAgICAgIGlmICh0aGlzLnNob3dEYXRhLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICB0aGlzLnNob3dEYXRhLnNwbGljZShpdGVtLCAxKQ0KICAgICAgICB9DQogICAgICAgIC8v5YiX6KGoDQogICAgICAgIGlmICh0aGlzLnNlbGVjdE9yZ3MgIT0gbnVsbCkgew0KICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UoaXRlbSwgMSkNCiAgICAgICAgICB0aGlzLmNoZWNrQm94RGF0YUFsbC5zcGxpY2UoaXRlbSwgMSkNCiAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MuZm9yRWFjaCgocm93KSA9PiB7DQogICAgICAgICAgICAvLyBpZihpdGVtLmlkID09cmVtb3ZlSWQgKXsNCiAgICAgICAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gdHJ1ZQ0KICAgICAgICAgICAgdGhpcy50b2dnbGVSb3dTZWxlY3Rpb24ocm93LCBmYWxzZSkNCiAgICAgICAgICAgIC8vIH0NCiAgICAgICAgICB9KQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpDQogICAgICAgIGxldCB2YWx1ZSA9ICcnDQogICAgICAgIHRoaXMuaW5wdXRWYWwuZm9yRWFjaCgodmFsKSA9PiB7DQogICAgICAgICAgdmFsdWUgKz0gdmFsLnZhbHVlICsgJywnDQogICAgICAgIH0pDQogICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGVuZ3RoIC0gMSkNCiAgICAgICAgfQ0KICAgICAgICBpZiAodmFsdWUgIT0gJycpIHsNCiAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgJ3x8JyArIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hvd0RhdGEpDQogICAgICAgIH0NCiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSkNCiAgICAgIH0NCiAgICAgIHRoaXMuc3luY0lucHV0VmFsdWUoKQ0KICAgIH0sDQogICAgY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpIHsNCiAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICBpZiAoIXRoaXMuJHJlZnMudGFnU3BhbnMpIHJldHVybg0KICAgICAgICBpZiAodGhpcy4kcmVmcy50YWdTcGFucy5vZmZzZXRIZWlnaHQpIHsNCiAgICAgICAgICB0aGlzLmlucHV0U3VmZml4SGVpZ2h0ID0gdGhpcy4kcmVmcy50YWdTcGFucy5vZmZzZXRIZWlnaHQgKyA1DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdGhpcy5pbnB1dFN1ZmZpeEhlaWdodCA9IDMwDQogICAgICAgIH0NCiAgICAgICAgLy8g6Kem5Y+R6aqM6K+BDQogICAgICAgIHRoaXMuJHZhbGlkYXRvci52YWxpZGF0ZSgpDQogICAgICB9LCAwKQ0KICAgIH0sDQogICAgY3VzdG9tRGlhbG9nU2hvdyhwYWdlUGFyYW0pIHsNCiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSB0cnVlDQogICAgICB0aGlzLmN1c3RvbURpYWxvZyA9IHBhZ2VQYXJhbS5jdXN0b21EaWFsb2cNCiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLnF1ZXJ5VXJsID0NCiAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJw0KICAgICAgICAgID8gJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0TGlzdERhdGE/YWxpYXM9JyArDQogICAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cuYWxpYXMgKw0KICAgICAgICAgICcmbWFwUGFyYW09JyArDQogICAgICAgICAgKHRoaXMuY3VzdG9tRGlhbG9nLm1hcFBhcmFtID8gdGhpcy5jdXN0b21EaWFsb2cubWFwUGFyYW0gOiAnJykNCiAgICAgICAgICA6IHRoaXMuY3VzdG9tRGlhbG9nLnVybA0KICAgICAgaWYgKHRoaXMuZGlhbG9nRGF0YS5sZW5ndGggPCAxKSB7DQogICAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHtwYWdlOiAxLCBwYWdlU2l6ZTogMjAsIHNob3dUb3RhbDogJ3RydWUnfQ0KICAgICAgICB0aGlzLnNlYXJjaCgpDQogICAgICAgIHRoaXMuZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZShwYWdlUGFyYW0uY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCkNCiAgICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScpIHsNCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlzcGxheWZpZWxkLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZFtpXS5maWVsZCA9IHRoaXMuZGlzcGxheWZpZWxkWw0KICAgICAgICAgICAgICBpDQogICAgICAgICAgICAgIF0uZmllbGQudG9Mb3dlckNhc2UoKQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmICh0aGlzLmRpYWxvZ0RhdGEubGVuZ3RoID4gMSkgew0KICAgICAgICB0aGlzLnNlYXJjaCgpDQogICAgICB9DQogICAgICBpZiAodGhpcy5kaWFsb2dEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5kaXNwbGF5ZmllbGQubGVuZ3RoID09IDApIHsNCiAgICAgICAgdGhpcy5zZWFyY2goKQ0KICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZCA9IEpTT04ucGFyc2UocGFnZVBhcmFtLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpDQogICAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnKSB7DQogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGRbaV0uZmllbGQgPSB0aGlzLmRpc3BsYXlmaWVsZFsNCiAgICAgICAgICAgICAgaQ0KICAgICAgICAgICAgICBdLmZpZWxkLnRvTG93ZXJDYXNlKCkNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIGN1c3RvbURpYWxvZ1RyZWVTaG93KHBhZ2VQYXJhbSkgew0KICAgICAgdGhpcy5jdXN0b21EaWFsb2cgPSBwYWdlUGFyYW0uY3VzdG9tRGlhbG9nDQogICAgICB2YXIgY3VzdG9tRGlhbG9nID0gdGhpcy5jdXN0b21EaWFsb2cNCiAgICAgIHZhciBtYXBQYXJhbSA9ICcnDQogICAgICBpZiAocGFnZVBhcmFtLnBhcmFtICE9IHVuZGVmaW5lZCkgew0KICAgICAgICBtYXBQYXJhbSA9IEpTT04uc3RyaW5naWZ5KHBhZ2VQYXJhbS5wYXJhbSkNCiAgICAgICAgbWFwUGFyYW0gPSBtYXBQYXJhbS5zdWJzdHJpbmcoMSwgbWFwUGFyYW0ubGVuZ3RoIC0gMSkNCiAgICAgIH0NCiAgICAgIHZhciByZXF1ZXN0VHlwZSA9DQogICAgICAgIGN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnDQogICAgICAgICAgPyAnR0VUJw0KICAgICAgICAgIDogY3VzdG9tRGlhbG9nLnJlcXVlc3RUeXBlDQogICAgICAgICAgICA/IGN1c3RvbURpYWxvZy5yZXF1ZXN0VHlwZQ0KICAgICAgICAgICAgOiAnUE9TVCcNCiAgICAgIHZhciB1cmwgPQ0KICAgICAgICAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0nICsNCiAgICAgICAgcGFnZVBhcmFtLmFsaWFzICsNCiAgICAgICAgJyZtYXBQYXJhbT0nICsNCiAgICAgICAgbWFwUGFyYW0NCiAgICAgIHZhciBwYXJhbXNPYmogPSB7fQ0KICAgICAgaWYgKGN1c3RvbURpYWxvZy5kc1R5cGUgIT0gJ2RhdGFTb3VyY2UnKSB7DQogICAgICAgIHVybCA9IGN1c3RvbURpYWxvZy51cmwNCiAgICAgICAgdmFyIHRlbXBsYXRlUGEgPSBjdXN0b21EaWFsb2cuZGF0YVBhcmFtDQogICAgICAgIGlmIChjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpIHsNCiAgICAgICAgICB2YXIgY29uZGl0aW9ucyA9IEpTT04ucGFyc2UoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKQ0KICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZGl0aW9ucy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGNvbiA9IGNvbmRpdGlvbnNbaV0NCiAgICAgICAgICAgIGlmIChyZXF1ZXN0VHlwZSA9PSAnUE9TVCcpIHsNCiAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsNCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhID0gdGVtcGxhdGVQYS5yZXBsYWNlKA0KICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cCgnXFx7JyArIGNvbi5maWVsZCArICdcXH0nLCAnZycpLA0KICAgICAgICAgICAgICAgICAgY29uLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBwYXJhbXNPYmpbY29uLmZpZWxkXSA9IGNvbi5kZWZhdWx0VmFsdWUNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgdmFyIGxqQ2hhciA9IHVybC5pbmRleE9mKCc/JykgPT0gLTEgPyAnPycgOiAnJicNCiAgICAgICAgICAgICAgdXJsID0gdXJsICsgbGpDaGFyICsgY29uLmZpZWxkICsgJz0nICsgY29uLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAodGVtcGxhdGVQYSkgew0KICAgICAgICAgICAgcGFyYW1zT2JqID0gSlNPTi5wYXJzZSh0ZW1wbGF0ZVBhKQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgdmFyIHJlcXVlc3RQYXJhbXMgPSB7fQ0KICAgICAgcmVxdWVzdFBhcmFtcy5yZXF1ZXN0VHlwZSA9IHJlcXVlc3RUeXBlDQogICAgICByZXF1ZXN0UGFyYW1zLnVybCA9IHVybA0KICAgICAgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmogPSBwYXJhbXNPYmoNCiAgICAgIHRoaXMuc2VhcmNoVHJlZShyZXF1ZXN0UGFyYW1zKQ0KICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IHRydWUNCiAgICB9LA0KICAgIC8v5qCR5b2i5p+l6K+iDQogICAgc2VhcmNoVHJlZShyZXF1ZXN0UGFyYW1zKSB7DQogICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgIGxldCBxdWVyeSA9DQogICAgICAgIHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPT0gJ1BPU1QnDQogICAgICAgICAgPyByZXEucG9zdChyZXF1ZXN0UGFyYW1zLnVybCwgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmopDQogICAgICAgICAgOiByZXEuZ2V0KHJlcXVlc3RQYXJhbXMudXJsKQ0KICAgICAgcXVlcnkudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KICAgICAgICAvL+aYvuekuuWtl+autemFjee9rg0KICAgICAgICBsZXQgZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZSh0aGlzXy5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKQ0KICAgICAgICB0aGlzXy5kaXNwbGF5RmllbGQgPSBkaXNwbGF5ZmllbGQNCiAgICAgICAgLy/miorlr7nor53moYbphY3nva7nmoTmmL7npLrlrZfmrrXmmL7npLrlkI3np7DotYvlgLznu5nmoJHlvaLnmoTmmL7npLrlgLwNCiAgICAgICAgdGhpc18uZGVmYXVsdFByb3BzLmxhYmVsID0gZGlzcGxheWZpZWxkLmRpc3BsYXlOYW1lDQogICAgICAgIHRoaXNfLnRyZWVMaXN0ID0gcmVzcG9uc2UuZGF0YQ0KICAgICAgICAvL+W+l+WIsOimgeWKoOi9veagkeeahOS/oeaBrw0KICAgICAgICB0aGlzXy5wcm9wczEgPSB0aGlzXy50b1RyZWVEYXRhKA0KICAgICAgICAgIHJlc3BvbnNlLmRhdGEsDQogICAgICAgICAgZGlzcGxheWZpZWxkLmlkLA0KICAgICAgICAgIGRpc3BsYXlmaWVsZC5waWQsDQogICAgICAgICAgZGlzcGxheWZpZWxkLmRpc3BsYXlOYW1lLA0KICAgICAgICAgIGRpc3BsYXlmaWVsZC5wdmFsdWUgPyBkaXNwbGF5ZmllbGQucHZhbHVlIDogMA0KICAgICAgICApDQogICAgICB9KQ0KICAgIH0sDQogICAgLy/liqDovb3moJHnmoTkv6Hmga8NCiAgICB0b1RyZWVEYXRhKGRhdGEsIGlkLCBwaWQsIG5hbWUsIHB2YWx1ZSkgew0KICAgICAgLy8g5bu656uL5Liq5qCR5b2i57uT5p6ELOmcgOimgeWumuS5ieS4quacgOmhtuWxgueahOeItuiKgueCue+8jHB2YWx1ZeaYrzANCiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZURhdGFUb1RyZWUoZGF0YSwgcGlkLCBpZCwgbmFtZSwgcHZhbHVlKQ0KICAgIH0sDQogICAgdHJhbnNsYXRlRGF0YVRvVHJlZShkYXRhLCBwaWQsIGlkLCBuYW1lLCBwdmFsdWUpIHsNCiAgICAgIC8v5oqK5qCR5pWw5o2u5pyJ5a2Q6IqC54K555qE5pWw5o2u5YWo6YOo6L+H5ruk5o6J77yI5Y+q55WZ54i26IqC54K555qE5pWw5o2u77yJDQogICAgICBsZXQgcGFyZW50cyA9IGRhdGEuZmlsdGVyKA0KICAgICAgICAodmFsdWUpID0+DQogICAgICAgICAgdmFsdWVbaWRdID09IHZhbHVlW3BpZF0gfHwgdmFsdWVbcGlkXSA9PSBudWxsIHx8IHZhbHVlW3BpZF0gPT0gcHZhbHVlDQogICAgICApDQogICAgICBpZiAoIXBhcmVudHMpIHsNCiAgICAgICAgcGFyZW50cyA9IGRhdGEuZmlsdGVyKA0KICAgICAgICAgICh2YWx1ZSkgPT4NCiAgICAgICAgICAgIHZhbHVlW3BpZF0gIT09ICd1bmRlZmluZWQnICYmDQogICAgICAgICAgICB2YWx1ZVtwaWRdICE9IG51bGwgJiYNCiAgICAgICAgICAgIHZhbHVlW2lkXSAhPSB2YWx1ZVtwaWRdDQogICAgICAgICkNCiAgICAgIH0NCiAgICAgIHJldHVybiBwYXJlbnRzDQogICAgfSwNCiAgICBsb2FkVHJlZShub2RlLCByZXNvbHZlKSB7DQogICAgICBpZiAobm9kZSkgew0KICAgICAgICBsZXQgdGhpc18gPSB0aGlzDQogICAgICAgIGxldCBkaXNwbGF5RmllbGQgPQ0KICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZy5zdHlsZSA9PSAyDQogICAgICAgICAgICA/IHRoaXNfLmNvbWJpVHJlZURpc3BsYXlGaWVsZA0KICAgICAgICAgICAgOiB0aGlzXy5kaXNwbGF5RmllbGQNCiAgICAgICAgcmVzb2x2ZSgNCiAgICAgICAgICB0aGlzLnRyZWVMaXN0LmZpbHRlcigNCiAgICAgICAgICAgICh2YWx1ZSkgPT4gdmFsdWVbZGlzcGxheUZpZWxkLnBpZF0gPT09IG5vZGUuZGF0YVtkaXNwbGF5RmllbGQuaWRdDQogICAgICAgICAgKQ0KICAgICAgICApDQogICAgICAgIGlmICh0aGlzLnNob3dEYXRhICYmIHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgew0KICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAgICAgdGhpcy5zaG93RGF0YS5mb3JFYWNoKCh2KSA9PiB7DQogICAgICAgICAgICAgIGlmICh2LlBpZCA9PSBub2RlLmtleSkgew0KICAgICAgICAgICAgICAgIHRoaXNfLiRyZWZzLnRyZWUuc2V0Q2hlY2tlZCh2LCB0cnVlKQ0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHRoaXNfLmNoZWNrTm9kZSh2LCB0aGlzXykNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LCA0MDApDQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KDQogICAgYWZ0ZXJPcGVuKCkgew0KICAgICAgLy/miZPlvIDlr7nor53moYbkuYvlkI7liqDovb3moJENCiAgICAgIHRoaXMubG9hZENvbWJpbmF0aW9uVHJlZSgpDQogICAgfSwNCiAgICBsb2FkQ29tYmluYXRpb25UcmVlKCkgew0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnN0eWxlICE9IDIpIHsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBsZXQgY29tYmluYXRpb25SdWxlID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5jb21iaW5hdGlvblJ1bGUpDQogICAgICB0aGlzLmNvbWJpbmF0aW9uUnVsZSA9IGNvbWJpbmF0aW9uUnVsZQ0KICAgICAgbGV0IHRyZWVBbGlhcyA9IGNvbWJpbmF0aW9uUnVsZS5sZWZ0VHJlZQ0KICAgICAgLy/ojrflj5blr7nor53moYbmlbDmja4NCiAgICAgIHJlcQ0KICAgICAgICAuZ2V0KCcke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldEJ5QWxpYXM/YWxpYXM9JyArIHRyZWVBbGlhcykNCiAgICAgICAgLnRoZW4oKHJlc3ApID0+IHsNCiAgICAgICAgICBsZXQgdHJlZURpYWxvZyA9IHJlc3AuZGF0YQ0KICAgICAgICAgIHRoaXMubGVmdFRyZWVUaXRsZSA9IHRyZWVEaWFsb2cubmFtZQ0KICAgICAgICAgIGxldCByZXFQYXJhbSA9IHt9DQogICAgICAgICAgbGV0IHJlcXVlc3RUeXBlID0NCiAgICAgICAgICAgIHRyZWVEaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJw0KICAgICAgICAgICAgICA/ICdHRVQnDQogICAgICAgICAgICAgIDogdHJlZURpYWxvZy5yZXF1ZXN0VHlwZQ0KICAgICAgICAgICAgICAgID8gdHJlZURpYWxvZy5yZXF1ZXN0VHlwZQ0KICAgICAgICAgICAgICAgIDogJ1BPU1QnDQogICAgICAgICAgbGV0IHVybCA9DQogICAgICAgICAgICAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0nICsNCiAgICAgICAgICAgIHRyZWVBbGlhcyArDQogICAgICAgICAgICAnJm1hcFBhcmFtPScNCiAgICAgICAgICBsZXQgcGFyYW1zT2JqID0ge30NCiAgICAgICAgICBpZiAodHJlZURpYWxvZy5kc1R5cGUgIT0gJ2RhdGFTb3VyY2UnKSB7DQogICAgICAgICAgICB1cmwgPSB0cmVlRGlhbG9nLnVybA0KICAgICAgICAgICAgbGV0IHRlbXBsYXRlUGEgPSB0cmVlRGlhbG9nLmRhdGFQYXJhbQ0KICAgICAgICAgICAgaWYgKHRyZWVEaWFsb2cuY29uZGl0aW9uZmllbGQpIHsNCiAgICAgICAgICAgICAgbGV0IGNvbmRpdGlvbnMgPSBKU09OLnBhcnNlKHRyZWVEaWFsb2cuY29uZGl0aW9uZmllbGQpDQogICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uZGl0aW9ucy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGxldCBjb24gPSBjb25kaXRpb25zW2ldDQogICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RUeXBlID09ICdQT1NUJykgew0KICAgICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsNCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYSA9IHRlbXBsYXRlUGEucmVwbGFjZSgNCiAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKCdcXHsnICsgY29uLmZpZWxkICsgJ1xcfScsICdnJyksDQogICAgICAgICAgICAgICAgICAgICAgY29uLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBwYXJhbXNPYmpbY29uLmZpZWxkXSA9IGNvbi5kZWZhdWx0VmFsdWUNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgbGV0IGxqQ2hhciA9IHVybC5pbmRleE9mKCc/JykgPT0gLTEgPyAnPycgOiAnJicNCiAgICAgICAgICAgICAgICAgIHVybCA9IHVybCArIGxqQ2hhciArIGNvbi5maWVsZCArICc9JyArIGNvbi5kZWZhdWx0VmFsdWUNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsNCiAgICAgICAgICAgICAgICBwYXJhbXNPYmogPSBKU09OLnBhcnNlKHRlbXBsYXRlUGEpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgbGV0IHJlcXVlc3RQYXJhbXMgPSB7fQ0KICAgICAgICAgIHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPSByZXF1ZXN0VHlwZQ0KICAgICAgICAgIHJlcXVlc3RQYXJhbXMudXJsID0gdXJsDQogICAgICAgICAgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmogPSBwYXJhbXNPYmoNCiAgICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgICAgLmRpc3BhdGNoKCdkaWFsb2cvZ2V0VHJlZURhdGEnLCByZXF1ZXN0UGFyYW1zKQ0KICAgICAgICAgICAgLnRoZW4oKHJlc3ApID0+IHsNCiAgICAgICAgICAgICAgaWYgKHRyZWVEaWFsb2cuZGlzcGxheWZpZWxkICYmIHRyZWVEaWFsb2cucmVzdWx0ZmllbGQpIHsNCiAgICAgICAgICAgICAgICBsZXQgZGlzcGxheUZpZWxkID0gSlNPTi5wYXJzZSh0cmVlRGlhbG9nLmRpc3BsYXlmaWVsZCkNCiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ZmllbGQgPSBKU09OLnBhcnNlKHRyZWVEaWFsb2cucmVzdWx0ZmllbGQpDQogICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0UHJvcHMubGFiZWwgPSBkaXNwbGF5RmllbGQuZGlzcGxheU5hbWUNCiAgICAgICAgICAgICAgICB0aGlzLnRyZWVMaXN0ID0gcmVzcA0KICAgICAgICAgICAgICAgIHRoaXMuY29tYmlUcmVlRGlzcGxheUZpZWxkID0gZGlzcGxheUZpZWxkDQogICAgICAgICAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVEYXRhID0gdGhpcy50b1RyZWVEYXRhKA0KICAgICAgICAgICAgICAgICAgcmVzcCwNCiAgICAgICAgICAgICAgICAgIGRpc3BsYXlGaWVsZC5pZCwNCiAgICAgICAgICAgICAgICAgIGRpc3BsYXlGaWVsZC5waWQsDQogICAgICAgICAgICAgICAgICBkaXNwbGF5RmllbGQuZGlzcGxheU5hbWUsDQogICAgICAgICAgICAgICAgICBkaXNwbGF5RmllbGQucHZhbHVlID8gZGlzcGxheUZpZWxkLnB2YWx1ZSA6ICcwJywNCiAgICAgICAgICAgICAgICAgIHJlc3VsdGZpZWxkDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICB9KQ0KICAgIH0sDQogICAgY29tYmlUcmVlQ2xpY2socGFyYW1PYmosIG5vZGUsIG5vZGVDb21wb25lbnQpIHsNCiAgICAgIC8v57uE5ZCI5a+56K+d5qGG54K55Ye75bem5qCRDQogICAgICAvL+a4heepuuaXp+eahA0KICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMuc3BsaWNlKDApDQogICAgICBsZXQgY29tYmluYXRpb25SdWxlID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5jb21iaW5hdGlvblJ1bGUpDQogICAgICBpZiAoIWNvbWJpbmF0aW9uUnVsZS5ydWxlcyB8fCBjb21iaW5hdGlvblJ1bGUucnVsZXMubGVuZ3RoID09IDApIHsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBsZXQgcnVsZXMgPSBjb21iaW5hdGlvblJ1bGUucnVsZXMNCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgbGV0IHZhbHVlID0gcGFyYW1PYmpbcnVsZXNbaV0udHJlZUZpZWxkXQ0KICAgICAgICBsZXQgcHJvcGVydHkgPSBydWxlc1tpXS5saXN0RmllbGQNCiAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMucHVzaCh7DQogICAgICAgICAgcHJvcGVydHk6IHByb3BlcnR5LA0KICAgICAgICAgIHZhbHVlOiB2YWx1ZSwNCiAgICAgICAgICBncm91cDogJ3RyZWVHcm91cCcsDQogICAgICAgICAgb3BlcmF0aW9uOiB0aGlzLmdldE9wZXJhdGlvbihydWxlc1tpXS5jb25kaXRpb24pLA0KICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJw0KICAgICAgICB9KQ0KICAgICAgfQ0KICAgICAgdGhpcy5zZWFyY2goKQ0KICAgIH0sDQogICAgLy/ojrflj5bov5DnrpfnrKblj7cNCiAgICBnZXRPcGVyYXRpb24ob2xkKSB7DQogICAgICBpZiAoIW9sZCkgew0KICAgICAgICByZXR1cm4gJycNCiAgICAgIH0NCiAgICAgIGlmIChvbGQgPT0gJ0VRJykgew0KICAgICAgICByZXR1cm4gJ0VRVUFMJw0KICAgICAgfQ0KICAgICAgaWYgKG9sZCA9PSAnTEsnKSB7DQogICAgICAgIHJldHVybiAnTElLRScNCiAgICAgIH0NCiAgICAgIGlmIChvbGQgPT0gJ0xGSycpIHsNCiAgICAgICAgcmV0dXJuICdMSUtFJw0KICAgICAgfQ0KICAgICAgaWYgKG9sZCA9PSAnSU4nKSB7DQogICAgICAgIHJldHVybiAnSU4nDQogICAgICB9DQogICAgfSwNCiAgICB0b2dnbGVUcmVlKCkgew0KICAgICAgaWYgKHRoaXMudHJlZVNob3cpIHsNCiAgICAgICAgdGhpcy50cmVlU2hvdyA9IGZhbHNlDQogICAgICAgIHRoaXMudHJhbnN0aW9uV2lkdGggPSAnMCUnDQogICAgICAgIHRoaXMudG9nZ2xlQnRuID0gJ2VsLWljb24tYXJyb3ctcmlnaHQnDQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLnRyZWVTaG93ID0gdHJ1ZQ0KICAgICAgICB0aGlzLnRyYW5zdGlvbldpZHRoID0gJzI1JScNCiAgICAgICAgdGhpcy50b2dnbGVCdG4gPSAnZWwtaWNvbi1hcnJvdy1sZWZ0Jw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0K"},null]}