{"remainingRequest":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/vue-loader/lib/index.js??vue-loader-options!/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/src/ui/voip/conference/Conference.vue?vue&type=script&lang=js&","dependencies":[{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/src/ui/voip/conference/Conference.vue","mtime":1703127644290},{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/babel-loader/lib/index.js","mtime":1702017034360},{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/cache-loader/dist/cjs.js","mtime":1702017034107},{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/vue-loader/lib/index.js","mtime":1702017029242}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KCmltcG9ydCBhdmVuZ2luZWtpdCBmcm9tICIuLi8uLi8uLi93ZmMvYXYvaW50ZXJuYWwvZW5naW5lLm1pbiI7CmltcG9ydCBDYWxsU2Vzc2lvbkNhbGxiYWNrIGZyb20gIi4uLy4uLy4uL3dmYy9hdi9lbmdpbmUvY2FsbFNlc3Npb25DYWxsYmFjayI7CmltcG9ydCBDYWxsU3RhdGUgZnJvbSAiLi4vLi4vLi4vd2ZjL2F2L2VuZ2luZS9jYWxsU3RhdGUiOwppbXBvcnQgQ2xpY2tPdXRzaWRlIGZyb20gJ3Z1ZS1jbGljay1vdXRzaWRlJwppbXBvcnQgbG9jYWxTdG9yYWdlRW1pdHRlciBmcm9tICIuLi8uLi8uLi9pcGMvbG9jYWxTdG9yYWdlRW1pdHRlciI7CmltcG9ydCB7Y3VycmVudFdpbmRvdywgaXNFbGVjdHJvbn0gZnJvbSAiLi4vLi4vLi4vcGxhdGZvcm0iOwppbXBvcnQgU2NyZWVuT3JXaW5kb3dQaWNrZXIgZnJvbSAiLi4vU2NyZWVuT3JXaW5kb3dQaWNrZXIiOwppbXBvcnQgQ2FsbEVuZFJlYXNvbiBmcm9tICIuLi8uLi8uLi93ZmMvYXYvZW5naW5lL2NhbGxFbmRSZWFzb24iOwppbXBvcnQgU2NyZWVuU2hhcmVDb250cm9sVmlldyBmcm9tICIuLi9TY3JlZW5TaGFyZUNvbnRyb2xWaWV3IjsKaW1wb3J0IGF2ZW5naW5la2l0cHJveHkgZnJvbSAiLi4vLi4vLi4vd2ZjL2F2L2VuZ2luZS9hdmVuZ2luZWtpdHByb3h5IjsKaW1wb3J0IEVsZWN0cm9uV2luZG93c0NvbnRyb2xCdXR0b25WaWV3IGZyb20gIi4uLy4uL2NvbW1vbi9FbGVjdHJvbldpbmRvd3NDb250cm9sQnV0dG9uVmlldyI7CmltcG9ydCBzdG9yZSBmcm9tICIuLi8uLi8uLi9zdG9yZSI7CmltcG9ydCBWaWRlb1R5cGUgZnJvbSAiLi4vLi4vLi4vd2ZjL2F2L2VuZ2luZS92aWRlb1R5cGUiOwppbXBvcnQgSXBjRXZlbnRUeXBlIGZyb20gIi4uLy4uLy4uL2lwY0V2ZW50VHlwZSI7CmltcG9ydCBDb25mZXJlbmNlUGFydGljaXBhbnRWaWRlb1ZpZXcgZnJvbSAiLi9Db25mZXJlbmNlUGFydGljaXBhbnRWaWRlb1ZpZXciOwppbXBvcnQgQ29udmVyc2F0aW9uVmlldyBmcm9tICIuLi8uLi9tYWluL2NvbnZlcnNhdGlvbi9Db252ZXJzYXRpb25WaWV3IjsKaW1wb3J0IENvbmZlcmVuY2VTaW1wbGVJbmZvVmlldyBmcm9tICIuL0NvbmZlcmVuY2VTaW1wbGVJbmZvVmlldyI7CmltcG9ydCBDaG9vc2VDb25mZXJlbmNlTGF5b3V0VmlldyBmcm9tICIuL0Nob29zZUNvbmZlcmVuY2VMYXlvdXRWaWV3IjsKaW1wb3J0IENvbmZlcmVuY2VDb252ZXJzYXRpb25GbG9hdGluZ1ZpZXcgZnJvbSAiLi9Db25mZXJlbmNlQ29udmVyc2F0aW9uRmxvYXRpbmdWaWV3IjsKaW1wb3J0IGNvbmZlcmVuY2VNYW5hZ2VyIGZyb20gIi4vY29uZmVyZW5jZU1hbmFnZXIiOwppbXBvcnQgQ29uZmVyZW5jZU1hbmFnZVZpZXcgZnJvbSAiLi9Db25mZXJlbmNlTWFuYWdlVmlldyI7CmltcG9ydCB3ZmMgZnJvbSAiLi4vLi4vLi4vd2ZjL2NsaWVudC93ZmMiOwppbXBvcnQgTG9jYWxTdG9yYWdlSXBjRXZlbnRUeXBlIGZyb20gIi4uLy4uLy4uL2lwYy9sb2NhbFN0b3JhZ2VJcGNFdmVudFR5cGUiOwppbXBvcnQgVXNlckluZm8gZnJvbSAiLi4vLi4vLi4vd2ZjL21vZGVsL3VzZXJJbmZvIjsKaW1wb3J0IENvbnZlcnNhdGlvblR5cGUgZnJvbSAiLi4vLi4vLi4vd2ZjL21vZGVsL2NvbnZlcnNhdGlvblR5cGUiOwppbXBvcnQgQ29udmVyc2F0aW9uIGZyb20gIi4uLy4uLy4uL3dmYy9tb2RlbC9jb252ZXJzYXRpb24iOwppbXBvcnQgQ29udmVyc2F0aW9uSW5mbyBmcm9tICIuLi8uLi8uLi93ZmMvbW9kZWwvY29udmVyc2F0aW9uSW5mbyI7CmltcG9ydCBDaGFubmVsSW5mbyBmcm9tICIuLi8uLi8uLi93ZmMvbW9kZWwvY2hhbm5lbEluZm8iOwppbXBvcnQgQ2hhdFJvb21JbmZvIGZyb20gIi4uLy4uLy4uL3dmYy9tb2RlbC9jaGF0Um9vbUluZm8iOwoKZXhwb3J0IGRlZmF1bHQgewogICAgbmFtZTogJ0NvbmZlcmVuY2UnLAogICAgZGF0YSgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzZXNzaW9uOiBudWxsLAogICAgICAgICAgICBhdWRpb09ubHk6IGZhbHNlLAogICAgICAgICAgICBzdGF0dXM6IDEsCiAgICAgICAgICAgIHNlbGZVc2VySW5mbzogbnVsbCwKICAgICAgICAgICAgcGFydGljaXBhbnRVc2VySW5mb3M6IFtdLAoKICAgICAgICAgICAgc3RhcnRUaW1lc3RhbXA6IDAsCiAgICAgICAgICAgIGN1cnJlbnRUaW1lc3RhbXA6IDAsCgogICAgICAgICAgICBzaG93U2xpZGVyOiBmYWxzZSwKICAgICAgICAgICAgc2hvd0NvbmZlcmVuY2VNYW5hZ2VWaWV3OiBmYWxzZSwKICAgICAgICAgICAgc2hvd0NvbnZlcnNhdGlvblZpZXc6IGZhbHNlLAogICAgICAgICAgICBzaGFyZWRNaXNjU3RhdGU6IHN0b3JlLnN0YXRlLm1pc2MsCiAgICAgICAgICAgIHZpZGVvSW5wdXREZXZpY2VJbmRleDogMCwKCiAgICAgICAgICAgIHJlZnJlc2hVc2VySW5mb0ludGVybmFsOiAwLAoKICAgICAgICAgICAgZW5kUmVhc29uOiB1bmRlZmluZWQsCgogICAgICAgICAgICBjb25mZXJlbmNlTWFuYWdlcjogY29uZmVyZW5jZU1hbmFnZXIsCgogICAgICAgICAgICAvLyAtMe+8jOm7mOiupOW4g+WxgO+8jOS5n+WwseaYr+Wuq+agvOW4g+WxgO+8mzAsIOWuq+agvOinhuWbvu+8mzHvvIzmvJTorrLogIXop4blm74KICAgICAgICAgICAgY3VycmVudExheW91dDogLTEsCgogICAgICAgICAgICAvLyDlrqvmoLzop4blm74KICAgICAgICAgICAgY3VycmVudEdyaWRQYWdlSW5kZXg6IDAsCiAgICAgICAgICAgIHBhcnRpY2lwYW50Q291bnRQZXJHcmlkUGFnZTogOSwKCiAgICAgICAgICAgIC8vIOa8lOiusuiAheinhuWbvgogICAgICAgICAgICBzcGVha2luZ1ZpZGVvUGFydGljaXBhbnQ6IG51bGwsCiAgICAgICAgICAgIGhpZGVGb2N1c0xheW91dFBhcnRpY2lwYW50TGlzdFZpZGVvVmlldzogZmFsc2UsCgogICAgICAgICAgICBzaG93Q29uZmVyZW5jZVNpbXBsZUluZm9WaWV3OiBmYWxzZSwKICAgICAgICAgICAgc2hvd0Nob29zZUxheW91dFZpZXc6IGZhbHNlLAogICAgICAgIH0KICAgIH0sCiAgICBjb21wb25lbnRzOiB7CiAgICAgICAgQ29uZmVyZW5jZU1hbmFnZVZpZXcsCiAgICAgICAgQ29uZmVyZW5jZUNvbnZlcnNhdGlvbkZsb2F0aW5nVmlldywKICAgICAgICBDaG9vc2VDb25mZXJlbmNlTGF5b3V0VmlldywKICAgICAgICBDb25mZXJlbmNlU2ltcGxlSW5mb1ZpZXcsCiAgICAgICAgQ29uZmVyZW5jZVBhcnRpY2lwYW50VmlkZW9WaWV3LAogICAgICAgIFNjcmVlblNoYXJlQ29udHJvbFZpZXcsCiAgICAgICAgRWxlY3Ryb25XaW5kb3dzQ29udHJvbEJ1dHRvblZpZXcsCiAgICAgICAgQ29udmVyc2F0aW9uVmlldwogICAgfSwKICAgIG1ldGhvZHM6IHsKICAgICAgICAvLyDnlKjmnaXop6PlhrMgaU9TIOS4iu+8jOS4jeiDveiHquWKqOaSreaUvumXrumimAogICAgICAgIGF1dG9QbGF5KCkgewogICAgICAgICAgICBpZiAoaXNFbGVjdHJvbigpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc29sZS5sb2coJ2F1dG8gcGxheScpOwogICAgICAgICAgICBpZiAoIXRoaXMuYXV0b1BsYXlJbnRlcnZhbCkgewogICAgICAgICAgICAgICAgdGhpcy5hdXRvUGxheUludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8nKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFsbFBsYXlpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZpZGVvIG9mIHZpZGVvcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLnBhdXNlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbFBsYXlpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0aWNpcGFudFVzZXJJbmZvcyDkuI3ljIXlkKvoh6rlt7EKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbFBsYXlpbmcgJiYgdmlkZW9zLmxlbmd0aCA9PT0gdGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvcy5maWx0ZXIocCA9PiAhcC5faXNBdWRpZW5jZSkubGVuZ3RoICsgMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmF1dG9QbGF5SW50ZXJ2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRvUGxheUludGVydmFsID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdhdXRvIHBsYXksIGFsbFBsYXlpbmcnLCB2aWRlb3MubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2aWRlbyBvZiB2aWRlb3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby5wYXVzZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5wbGF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgc2V0dXBTZXNzaW9uQ2FsbGJhY2soKSB7CiAgICAgICAgICAgIGxldCBzZXNzaW9uQ2FsbGJhY2sgPSBuZXcgQ2FsbFNlc3Npb25DYWxsYmFjaygpOwoKICAgICAgICAgICAgc2Vzc2lvbkNhbGxiYWNrLmRpZENoYW5nZVN0YXRlID0gKHN0YXRlKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGlkQ2hhbmdlU3RhdGUnLCBzdGF0ZSkKICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdGU7CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09IENhbGxTdGF0ZS5TVEFUVVNfQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICAgICAgICAgLy8g5q+U5aaC5rKh5pyJ5pGE5YOP5aS077yM5L2G5Y+R6LW36KeG6aKR6YCa6K+d5pe277yM5Lya6Ieq5YqoIG11dGVWaWRlbwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZlVzZXJJbmZvLl9pc1ZpZGVvTXV0ZWQgPSB0aGlzLnNlc3Npb24udmlkZW9NdXRlZDsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGFydFRpbWVzdGFtcCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUaW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBDYWxsU3RhdGUuU1RBVFVTX0lETEUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50aW1lcikgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMudGltZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHNlc3Npb25DYWxsYmFjay5vbkluaXRpYWwgPSAoc2Vzc2lvbiwgc2VsZlVzZXJJbmZvLCBpbml0aWF0b3JVc2VySW5mbykgPT4gewogICAgICAgICAgICAgICAgLy90aGlzLnNlc3Npb24ucm90YXRlQW5nID0gOTA7CgogICAgICAgICAgICAgICAgc2VsZlVzZXJJbmZvLl9pc0hvc3QgPSBzZXNzaW9uLmhvc3QgPT09IHNlbGZVc2VySW5mby51aWQ7CiAgICAgICAgICAgICAgICBzZWxmVXNlckluZm8uX2lzQXVkaWVuY2UgPSBzZXNzaW9uLmF1ZGllbmNlOwogICAgICAgICAgICAgICAgc2VsZlVzZXJJbmZvLl9pc1ZpZGVvTXV0ZWQgPSBzZXNzaW9uLnZpZGVvTXV0ZWQ7CiAgICAgICAgICAgICAgICBzZWxmVXNlckluZm8uX2lzQXVkaW9NdXRlZCA9IHNlc3Npb24uYXVkaW9NdXRlZDsKICAgICAgICAgICAgICAgIHNlbGZVc2VySW5mby5fdm9sdW1lID0gMDsKICAgICAgICAgICAgICAgIC8vIOWFiOa3u+WKoOWxnuaAp++8jOWcqOi1i+WAvO+8jOaJjeiDvSByZWFjdGl2ZQogICAgICAgICAgICAgICAgdGhpcy5zZWxmVXNlckluZm8gPSBzZWxmVXNlckluZm87CiAgICAgICAgICAgICAgICB0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zID0gW3NlbGZVc2VySW5mb107CgogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ29uaW5pdGlhbCcsIHNlbGZVc2VySW5mby5faXNBdWRpZW5jZSkKICAgICAgICAgICAgICAgIC8vIHBscyByZWZlciB0bzogaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvcmVhY3Rpdml0eS5odG1sCiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5zZWxmVXNlckluZm8sICdfc3RyZWFtJywgbnVsbCk7CiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5zZWxmVXNlckluZm8sICdfc2NyZWVuU2hhcmVTdHJlYW0nLCBudWxsKTsKICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLnNlbGZVc2VySW5mbywgJ19pc1NjcmVlblNoYXJpbmcnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmZvckVhY2gocCA9PiB0aGlzLiRzZXQocCwgIl9zdHJlYW0iLCBudWxsKSkKCiAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOwogICAgICAgICAgICAgICAgZG9jdW1lbnQudGl0bGUgPSBzZXNzaW9uLnRpdGxlOwoKICAgICAgICAgICAgICAgIGNvbmZlcmVuY2VNYW5hZ2VyLmdldENvbmZlcmVuY2VJbmZvKHNlc3Npb24uY2FsbElkKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHNlc3Npb25DYWxsYmFjay5kaWRDcmVhdGVMb2NhbFZpZGVvVHJhY2sgPSAoc3RyZWFtLCBzY3JlZW5TaGFyZSkgPT4gewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RpZENyZWF0ZUxvY2FsVmlkZW9UcmFjaycsIHNjcmVlblNoYXJlKQogICAgICAgICAgICAgICAgaWYgKHNjcmVlblNoYXJlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxmVXNlckluZm8uX3NjcmVlblNoYXJlU3RyZWFtID0gc3RyZWFtOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGZVc2VySW5mby5fc3RyZWFtID0gc3RyZWFtOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZlVzZXJJbmZvLl9zY3JlZW5TaGFyZVN0cmVhbSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxmVXNlckluZm8uX2lzVmlkZW9NdXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5zZWxmVXNlckluZm8uX2lzU2NyZWVuU2hhcmluZyA9IHNjcmVlblNoYXJlOwogICAgICAgICAgICAgICAgdGhpcy5hdXRvUGxheSgpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc2Vzc2lvbkNhbGxiYWNrLmRpZFJvdGF0ZUxvY2FsVmlkZW9UcmFjayA9IChzdHJlYW0pID0+IHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdkaWRSb3RhdGVMb2NhbFZpZGVvVHJhY2snLCBzdHJlYW0uZ2V0QXVkaW9UcmFja3MoKSkKICAgICAgICAgICAgICAgIHRoaXMuc2VsZlVzZXJJbmZvLl9zdHJlYW0gPSBzdHJlYW07CiAgICAgICAgICAgICAgICB0aGlzLnNlbGZVc2VySW5mby5fc3RyZWFtLnRpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc2Vzc2lvbkNhbGxiYWNrLmRpZFNjcmVlblNoYXJlRW5kZWQgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGlkU2NyZWVuU2hhcmVFbmRlZCcsIHRoaXMuc2Vzc2lvbi52aWRlb011dGVkLCB0aGlzLnNlc3Npb24uYXVkaW9NdXRlZCk7CiAgICAgICAgICAgICAgICBpZiAoaXNFbGVjdHJvbigpKSB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudFdpbmRvdy5zZXRJZ25vcmVNb3VzZUV2ZW50cyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnNlbGZVc2VySW5mby5faXNTY3JlZW5TaGFyaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGZVc2VySW5mby5faXNWaWRlb011dGVkID0gdGhpcy5zZXNzaW9uLnZpZGVvTXV0ZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlc3Npb25DYWxsYmFjay5kaWRDcmVhdGVMb2NhbFZpZGVvVHJhY2tFcnJvciA9ICgpID0+IHsKICAgICAgICAgICAgICAgIC8vIFRPRE8KICAgICAgICAgICAgICAgIC8vIOayoeacieaRhOWDj+WktOaIluiAhem6puWFi+mjju+8jOWKoOWFpeS8muiuruaXtu+8jOS8muWbnuiwg+WIsOatpOWkhO+8jOiHquW3seaWreS8muaYvuekuuiHquW3seeahOWktOWDj++8jOWFtuS7luerr+S8muaYvuekuum7keWxjwogICAgICAgICAgICAgICAgLy8g5Y+v5Lul6L+b6KGM55u45YWz5o+Q56S6CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzZXNzaW9uQ2FsbGJhY2suZGlkUmVjZWl2ZVJlbW90ZVZpZGVvVHJhY2sgPSAodXNlcklkLCBzdHJlYW0sIHNjcmVlblNoYXJpbmcpID0+IHsKICAgICAgICAgICAgICAgIGxldCBwOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RpZFJlY2VpdmVSZW1vdGVWaWRlb1RyYWNrJywgdXNlcklkLCBzdHJlYW0sIHNjcmVlblNoYXJpbmcpOwogICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gLTE7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFydGljaXBhbnRVc2VySW5mb3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBwID0gdGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvc1tpXTsKICAgICAgICAgICAgICAgICAgICBpZiAocC51aWQgPT09IHVzZXJJZCAmJiBwLl9pc1NjcmVlblNoYXJpbmcgPT09IHNjcmVlblNoYXJpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwogICAgICAgICAgICAgICAgICAgICAgICBwLl9zdHJlYW0gPSBzdHJlYW07CiAgICAgICAgICAgICAgICAgICAgICAgIHAuX3N0cmVhbS50aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gaWYgKGluZGV4ID4gLTEpIHsKICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLiRzZXQodGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvcywgaW5kZXgsIHApOwogICAgICAgICAgICAgICAgLy8gfQogICAgICAgICAgICAgICAgdGhpcy5hdXRvUGxheSgpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc2Vzc2lvbkNhbGxiYWNrLmRpZFJlbW92ZVJlbW90ZVZpZGVvVHJhY2sgPSAodXNlcklkKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGlkUmVtb3ZlUmVtb3RlVmlkZW9UcmFjaycsIHVzZXJJZCkKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHNlc3Npb25DYWxsYmFjay5kaWRQYXJ0aWNpcGFudEpvaW5lZCA9ICh1c2VySWQsIHNjcmVlblNoYXJpbmcpID0+IHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdkaWRQYXJ0aWNpcGFudEpvaW5lZCcsIHVzZXJJZCwgc2NyZWVuU2hhcmluZykKICAgICAgICAgICAgICAgIGxldCB1c2VySW5mbyA9IHdmYy5nZXRVc2VySW5mbyh1c2VySWQpOwogICAgICAgICAgICAgICAgbGV0IHN1YnNjcmliZXIgPSB0aGlzLnNlc3Npb24uZ2V0U3Vic2NyaWJlcih1c2VySWQsIHNjcmVlblNoYXJpbmcpOwogICAgICAgICAgICAgICAgdXNlckluZm8uX3N0cmVhbSA9IHN1YnNjcmliZXIuc3RyZWFtOwogICAgICAgICAgICAgICAgdXNlckluZm8uX2lzQXVkaWVuY2UgPSBzdWJzY3JpYmVyLmF1ZGllbmNlOwogICAgICAgICAgICAgICAgdXNlckluZm8uX2lzSG9zdCA9IHRoaXMuc2Vzc2lvbi5ob3N0ID09PSB1c2VySWQ7CiAgICAgICAgICAgICAgICB1c2VySW5mby5faXNWaWRlb011dGVkID0gc3Vic2NyaWJlci52aWRlb011dGVkOwogICAgICAgICAgICAgICAgdXNlckluZm8uX2lzQXVkaW9NdXRlZCA9IHN1YnNjcmliZXIuYXVkaW9NdXRlZDsKICAgICAgICAgICAgICAgIHVzZXJJbmZvLl92b2x1bWUgPSAwOwogICAgICAgICAgICAgICAgdXNlckluZm8uX2lzU2NyZWVuU2hhcmluZyA9IHNjcmVlblNoYXJpbmc7CiAgICAgICAgICAgICAgICAvLyDliqjmgIHmt7vliqDnmoTlsZ7mgKfkuI3mmK8gcmVhY3RpdmUg55qE77yM5pWF55u05o6l5Yib5bu65Liq5paw55qE5a+56LGhCiAgICAgICAgICAgICAgICAvLyDlhbblrp7ov5nkuKrpl67popjlvojlpYfmgKrvvIzlj6rmnInlj5HotbfkvJrorq7vvIznrKzkuIDmrKHov5vlhaXor6XkvJrorq7nmoTml7blgJnvvIzlhbbku5bnq6/liqDlhaXvvIzlj4LkuI7ogIXliJfooajkvJrkuI3liLfmlrDvvJvph43mlrDov5vlhaXnrYnvvIzpg73kuIDliIfmraPluLgKICAgICAgICAgICAgICAgIHRoaXMucGFydGljaXBhbnRVc2VySW5mb3MucHVzaChPYmplY3QuYXNzaWduKG5ldyBVc2VySW5mbygpLCB1c2VySW5mbykpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2pvaW5lZCcsIHVzZXJJbmZvLCBzdWJzY3JpYmVyLmF1ZGllbmNlLCB0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmxlbmd0aCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlc3Npb25DYWxsYmFjay5kaWRQYXJ0aWNpcGFudExlZnQgPSAodXNlcklkLCBlbmRSZWFzb24sIHNjcmVlblNoYXJpbmcpID0+IHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdkaWRQYXJ0aWNpcGFudExlZnQnLCB1c2VySWQsIGVuZFJlYXNvbiwgc2NyZWVuU2hhcmluZywgSlNPTi5zdHJpbmdpZnkodGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvcyksIHRoaXMucGFydGljaXBhbnRVc2VySW5mb3MubGVuZ3RoKQogICAgICAgICAgICAgICAgLy90aGlzLnBhcnRpY2lwYW50VXNlckluZm9zID0gdGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvcy5maWx0ZXIocCA9PiBwLnVpZCAhPT0gdXNlcklkICYmIHAuX2lzU2NyZWVuU2hhcmluZyAhPT0gc2NyZWVuU2hhcmluZyk7CiAgICAgICAgICAgICAgICB0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zID0gdGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvcy5maWx0ZXIocCA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEocC51aWQgPT09IHVzZXJJZCAmJiBwLl9pc1NjcmVlblNoYXJpbmcgPT09IHNjcmVlblNoYXJpbmcpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvL2ZpeG1lIOS4iumdouWPr+iDveS8muayoeacieinpuWPkemHjeaWsOiuoeeulyBmb2N1c1ZpZGVvUGFydGljaXBhbnQKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdkaWRQYXJ0aWNpcGFudExlZnQgZCcsIHVzZXJJZCwgZW5kUmVhc29uLCBzY3JlZW5TaGFyaW5nLCB0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmxlbmd0aCkKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2Vzc2lvbkNhbGxiYWNrLmRpZENhbGxFbmRXaXRoUmVhc29uID0gKHJlYXNvbikgPT4gewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NhbGxFbmRXaXRoUmVhc29uJywgcmVhc29uKQogICAgICAgICAgICAgICAgY29uZmVyZW5jZU1hbmFnZXIuYWRkSGlzdG9yeShjb25mZXJlbmNlTWFuYWdlci5jb25mZXJlbmNlSW5mbywgbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBjb25mZXJlbmNlTWFuYWdlci5jb25mZXJlbmNlSW5mby5zdGFydFRpbWUgKiAxMDAwKQogICAgICAgICAgICAgICAgLy8g5Y+v5Lul5qC55o2ucmVhc29u77yM6L+b6KGM5LiA5Lqb5o+Q56S6CiAgICAgICAgICAgICAgICAvLyBhbGVydCgn5Lya6K6u5bey57uT5p2fJyk7CgogICAgICAgICAgICAgICAgdGhpcy5lbmRSZWFzb24gPSByZWFzb247CiAgICAgICAgICAgICAgICBpZiAocmVhc29uID09PSBDYWxsRW5kUmVhc29uLlJFQVNPTl9NZWRpYUVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHJlYXNvbiA9PT0gQ2FsbEVuZFJlYXNvbi5Sb29tTm90RXhpc3QpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnam9pbiBjb25mZXJlbmNlIGZhaWxlZCcsIHJlYXNvbiwgdGhpcy5zZXNzaW9uKQogICAgICAgICAgICAgICAgICAgIGxldCBvYmogPSB7cmVhc29uOiByZWFzb24sIHNlc3Npb246IHRoaXMuc2Vzc2lvbn07CiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlRW1pdHRlci5zZW5kKExvY2FsU3RvcmFnZUlwY0V2ZW50VHlwZS5qb2luQ29uZmVyZW5jZUZhaWxlZCwgb2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5jbG9zZVZvaXBXaW5kb3coKTsKICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbiA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlc3Npb25DYWxsYmFjay5vblJlcXVlc3RDaGFuZ2VNb2RlID0gKGF1ZGllbmNlKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnb25SZXF1ZXN0Q2hhbmdlTW9kZScsIGF1ZGllbmNlKQogICAgICAgICAgICAgICAgaWYgKGF1ZGllbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnN3aXRjaEF1ZGllbmNlKHRydWUpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy4kYWxlcnQoewogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfkuLvmjIHkurrpgoDor7fkvaDlj4LkuI7kupLliqgnLAogICAgICAgICAgICAgICAgICAgIGNhbmNlbENhbGxiYWNrOiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNvbmZpcm1DYWxsYmFjazogKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb24uc3dpdGNoQXVkaWVuY2UoZmFsc2UpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHNlc3Npb25DYWxsYmFjay5kaWRDaGFuZ2VUeXBlID0gKHVzZXJJZCwgYXVkaWVuY2UsIHNjcmVlblNoYXJpbmcpID0+IHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdkaWRDaGFuZ2VUeXBlJywgdXNlcklkLCBhdWRpZW5jZSwgc2NyZWVuU2hhcmluZyk7CiAgICAgICAgICAgICAgICB0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmZvckVhY2godSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHUudWlkID09PSB1c2VySWQgJiYgdS5faXNTY3JlZW5TaGFyaW5nID09PSBzY3JlZW5TaGFyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHUuX2lzQXVkaWVuY2UgPSBhdWRpZW5jZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGllbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ll9zdHJlYW0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNwZWFraW5nVmlkZW9QYXJ0aWNpcGFudCAmJiB0aGlzLnNwZWFraW5nVmlkZW9QYXJ0aWNpcGFudC51aWQgPT09IHUudWlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwZWFraW5nVmlkZW9QYXJ0aWNpcGFudCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc2Vzc2lvbkNhbGxiYWNrLmRpZFJlcG9ydEF1ZGlvVm9sdW1lID0gKHVzZXJJZCwgdm9sdW1lKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgdXNlckluZm87CiAgICAgICAgICAgICAgICBpZiAodXNlcklkID09PSB0aGlzLnNlbGZVc2VySW5mby51aWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGZVc2VySW5mby5fdm9sdW1lID0gdm9sdW1lOwogICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvID0gdGhpcy5zZWxmVXNlckluZm87CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFydGljaXBhbnRVc2VySW5mb3MuZm9yRWFjaCh1ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUudWlkID09PSB1c2VySWQgJiYgdS5faXNTY3JlZW5TaGFyaW5nID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5fdm9sdW1lID0gdm9sdW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm8gPSB1OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRMYXlvdXQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCF1c2VySW5mbykgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodXNlckluZm8uX2lzVmlkZW9NdXRlZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25mZXJlbmNlRm9jdXNVc2VyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmVyZW5jZUZvY3VzVXNlcjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3BlYWtpbmdWaWRlb1BhcnRpY2lwYW50KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVha2luZ1ZpZGVvUGFydGljaXBhbnQgPSB1c2VySW5mbzsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXNlckluZm8uX3ZvbHVtZSA+IHRoaXMuc3BlYWtpbmdWaWRlb1BhcnRpY2lwYW50Ll92b2x1bWUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNwZWFraW5nVmlkZW9QYXJ0aWNpcGFudCA9IHVzZXJJbmZvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc2Vzc2lvbkNhbGxiYWNrLmRpZE11dGVTdGF0ZUNoYW5nZWQgPSAocGFydGljaXBhbnRzKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29uZmVyZW5jZScsICdkaWRNdXRlU3RhdGVDaGFuZ2VkJywgcGFydGljaXBhbnRzKQogICAgICAgICAgICAgICAgcGFydGljaXBhbnRzLmZvckVhY2gocCA9PiB7CiAgICAgICAgICAgICAgICAgICAgLy8g6Ieq5bexCiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHRoaXMuc2VsZlVzZXJJbmZvLnVpZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29uZmVyZW5jZScsICdkaWRNdXRlU3RhdGVDaGFuZ2VkIHNlbGYnLCB0aGlzLnNlc3Npb24udmlkZW9NdXRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZlVzZXJJbmZvLl9pc1ZpZGVvTXV0ZWQgPSB0aGlzLnNlc3Npb24udmlkZW9NdXRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsZXQgcyA9IHRoaXMuc2Vzc2lvbi5nZXRTdWJzY3JpYmVyKHApOwogICAgICAgICAgICAgICAgICAgIGlmICghcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb25mZXJlbmNlJywgJ2RpZE11dGVTdGF0ZUNoYW5nZWQnLCBwLCBzLnZpZGVvTXV0ZWQsIHMuYXVkaW9NdXRlZCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvcy5mb3JFYWNoKHUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodS51aWQgPT09IHAgJiYgdS5faXNTY3JlZW5TaGFyaW5nID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1YnNjcmliZXIgPSB0aGlzLnNlc3Npb24uZ2V0U3Vic2NyaWJlcihwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUuX2lzVmlkZW9NdXRlZCA9IHN1YnNjcmliZXIudmlkZW9NdXRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUuX2lzQXVkaW9NdXRlZCA9IHN1YnNjcmliZXIuYXVkaW9NdXRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNwZWFraW5nVmlkZW9QYXJ0aWNpcGFudCAmJiB0aGlzLnNwZWFraW5nVmlkZW9QYXJ0aWNpcGFudC51aWQgPT09IHUudWlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVha2luZ1ZpZGVvUGFydGljaXBhbnQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgc2Vzc2lvbkNhbGxiYWNrLmRpZE1lZGlhTG9zdFBhY2tldCA9IChtZWRpYSwgbG9zdFBhY2tldCwgc2NyZWVuU2hhcmluZykgPT4gewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RpZE1lZGlhTG9zdFBhY2tldCcsIG1lZGlhLCBsb3N0UGFja2V0LCBzY3JlZW5TaGFyaW5nKTsKICAgICAgICAgICAgICAgIGlmIChsb3N0UGFja2V0ID4gNikgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmgqjnmoTnvZHnu5zkuI3lpb0nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHNlc3Npb25DYWxsYmFjay5kaWRVc2VyTWVkaWFMb3N0UGFja2V0ID0gKHVzZXJJZCwgbWVkaWEsIGxvc3RQYWNrZXQsIHVwbGluaywgc2NyZWVuU2hhcmluZykgPT4gewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RpZFVzZXJNZWRpYUxvc3RQYWNrZXQnLCB1c2VySWQsIG1lZGlhLCBsb3N0UGFja2V0LCB1cGxpbmssIHNjcmVlblNoYXJpbmcpOwogICAgICAgICAgICAgICAgLy/lpoLmnpx1cGxpbmsgdHVyZeWvueaWuee9kee7nOS4jeWlve+8jGZhbHNl5oKo55qE572R57uc5LiN5aW9CiAgICAgICAgICAgICAgICAvL+aOpeaUtuaWueS4ouWMhei2hei/hzEw5Li6572R57uc5LiN5aW9CiAgICAgICAgICAgICAgICBpZiAobG9zdFBhY2tldCA+IDEwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHVwbGluaykgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXNlckluZm9zID0gdGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvcy5maWx0ZXIodSA9PiB1LnVpZCA9PT0gdXNlcklkICYmIHUuX2lzU2NyZWVuU2hhcmluZyA9PT0gc2NyZWVuU2hhcmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VySW5mb3MgJiYgdXNlckluZm9zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHVzZXJJbmZvc1swXS5kaXNwbGF5TmFtZSwgIue9kee7nOS4jeWlvSIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+aCqOeahOe9kee7nOS4jeWlvScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChpc0VsZWN0cm9uKCkpIHsKICAgICAgICAgICAgICAgIGF2ZW5naW5la2l0LnNldHVwKHNlc3Npb25DYWxsYmFjayk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhdmVuZ2luZWtpdC5zZXNzaW9uQ2FsbGJhY2sgPSBzZXNzaW9uQ2FsbGJhY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKCiAgICAgICAgaGFuZ3VwKCkgewogICAgICAgICAgICB0aGlzLnNlc3Npb24ubGVhdmVDb25mZXJlbmNlKHRydWUpOy8v6YKA6K+35pa56K6+572udHJ1ZSx3ZWLnq6/nprvlvIDkvJrorq7vvIxhcHDkuZ/nprvlvIAtLeaguOW/gwogICAgICAgICAgICBjb25mZXJlbmNlTWFuYWdlci5hZGRIaXN0b3J5KGNvbmZlcmVuY2VNYW5hZ2VyLmNvbmZlcmVuY2VJbmZvLCBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGNvbmZlcmVuY2VNYW5hZ2VyLmNvbmZlcmVuY2VJbmZvLnN0YXJ0VGltZSAqIDEwMDApCiAgICAgICAgfSwKCiAgICAgICAgbXV0ZUF1ZGlvKCkgewogICAgICAgICAgICBsZXQgZW5hYmxlID0gdGhpcy5zZXNzaW9uLmF1ZGlvTXV0ZWQgPyB0cnVlIDogZmFsc2U7CiAgICAgICAgICAgIGlmIChlbmFibGUgJiYgdGhpcy5zZXNzaW9uLmF1ZGllbmNlICYmICFjb25mZXJlbmNlTWFuYWdlci5pc093bmVyKCkgJiYgIWNvbmZlcmVuY2VNYW5hZ2VyLmNvbmZlcmVuY2VJbmZvLmFsbG93U3dpdGNoTW9kZSkgewogICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0VW5tdXRlKHRydWUpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZW5hYmxlQXVkaW8oZW5hYmxlKTsKICAgICAgICB9LAoKICAgICAgICBhc3luYyBlbmFibGVBdWRpbyhlbmFibGUpIHsKICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2Vzc2lvbi5zZXRBdWRpb0VuYWJsZWQoZW5hYmxlKQogICAgICAgICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2VsZlVzZXJJbmZvLl9pc0F1ZGlvTXV0ZWQgPSAhZW5hYmxlOwoKICAgICAgICAgICAgY29uc29sZS5sb2coJ211dGVBdWRpbycsIHRoaXMuc2VsZlVzZXJJbmZvLl9pc0F1ZGlvTXV0ZWQsIHRoaXMuc2Vzc2lvbi5hdWRpZW5jZSkKICAgICAgICAgICAgaWYgKGVuYWJsZSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbi5hdWRpZW5jZSkgewogICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Vzc2lvbi5zd2l0Y2hBdWRpZW5jZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxmVXNlckluZm8uX2lzQXVkaWVuY2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlc3Npb24udmlkZW9NdXRlZCAmJiAhdGhpcy5zZXNzaW9uLmF1ZGllbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXNzaW9uLnN3aXRjaEF1ZGllbmNlKHRydWUpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZlVzZXJJbmZvLl9pc0F1ZGllbmNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgbXV0ZVZpZGVvKCkgewogICAgICAgICAgICBsZXQgZW5hYmxlID0gdGhpcy5zZXNzaW9uLnZpZGVvTXV0ZWQgPyB0cnVlIDogZmFsc2U7CiAgICAgICAgICAgIGlmIChlbmFibGUgJiYgdGhpcy5zZXNzaW9uLmF1ZGllbmNlICYmICFjb25mZXJlbmNlTWFuYWdlci5pc093bmVyKCkgJiYgIWNvbmZlcmVuY2VNYW5hZ2VyLmNvbmZlcmVuY2VJbmZvLmFsbG93U3dpdGNoTW9kZSkgewogICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0VW5tdXRlKGZhbHNlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmVuYWJsZVZpZGVvKGVuYWJsZSk7CiAgICAgICAgfSwKCiAgICAgICAgYXN5bmMgZW5hYmxlVmlkZW8oZW5hYmxlKSB7CiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlc3Npb24uc2V0VmlkZW9FbmFibGVkKGVuYWJsZSkKICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnNlbGZVc2VySW5mby5faXNWaWRlb011dGVkID0gIWVuYWJsZTsKCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdtdXRlVmlkZW8gcmVzdWx0JywgdGhpcy5zZWxmVXNlckluZm8uX2lzVmlkZW9NdXRlZCwgdGhpcy5zZXNzaW9uLmF1ZGllbmNlKQogICAgICAgICAgICBpZiAoZW5hYmxlKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXNzaW9uLmF1ZGllbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXNzaW9uLnN3aXRjaEF1ZGllbmNlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGZVc2VySW5mby5faXNBdWRpZW5jZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbi5hdWRpb011dGVkICYmICF0aGlzLnNlc3Npb24uYXVkaWVuY2UpIHsKICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlc3Npb24uc3dpdGNoQXVkaWVuY2UodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxmVXNlckluZm8uX2lzQXVkaWVuY2UgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVxdWVzdFVubXV0ZShhdWRpbykgewogICAgICAgICAgICBpZiAoYXVkaW8gJiYgY29uZmVyZW5jZU1hbmFnZXIuYWxsb3dVbm11dGVBdWRpbykgewogICAgICAgICAgICAgICAgdGhpcy5lbmFibGVBdWRpbyh0cnVlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFhdWRpbyAmJiBjb25mZXJlbmNlTWFuYWdlci5hbGxvd1VubXV0ZVZpZGVvKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZVZpZGVvKHRydWUpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLiRhbGVydCh7CiAgICAgICAgICAgICAgICBjb250ZW50OiBhdWRpbyA/ICfkuLvmjIHkurrkuI3lhYHorrjop6PpmaTpnZnpn7PvvIzmgqjlj6/ku6XlkJHkuLvmjIHkurrnlLPor7fop6PpmaTpnZnpn7MnIDogJ+S4u+aMgeS6uuS4jeWFgeiuuOaJk+W8gOaRhOWDj+WktO+8jOaCqOWPr+S7peWQkeS4u+aMgeS6uueUs+ivt+aJk+W8gOaRhOWDj+WktCcsCiAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogJ+eUs+ivtycsCiAgICAgICAgICAgICAgICBjYW5jZWxDYWxsYmFjazogKCkgPT4gewogICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBjb25maXJtQ2FsbGJhY2s6ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBjb25mZXJlbmNlTWFuYWdlci5hcHBseVVubXV0ZShhdWRpbywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KQogICAgICAgIH0sCgogICAgICAgIGRvd24ydm9pY2UoKSB7CiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5kb3duZ3JhZGUyVm9pY2UoKTsKICAgICAgICB9LAoKICAgICAgICBtZW1iZXJzKCkgewogICAgICAgICAgICB0aGlzLnNob3dDb25mZXJlbmNlTWFuYWdlVmlldyA9ICF0aGlzLnNob3dDb25mZXJlbmNlTWFuYWdlVmlldzsKICAgICAgICAgICAgdGhpcy50b2dnbGVTbGlkZXJWaWV3KCk7CiAgICAgICAgfSwKCiAgICAgICAgY2hhdCgpIHsKICAgICAgICAgICAgaWYgKGlzRWxlY3Ryb24oKSkgewogICAgICAgICAgICAgICAgdGhpcy5zaG93Q29udmVyc2F0aW9uVmlldyA9ICF0aGlzLnNob3dDb252ZXJzYXRpb25WaWV3OwogICAgICAgICAgICAgICAgdGhpcy50b2dnbGVTbGlkZXJWaWV3KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsZXQgY29udmVyc2F0aW9uID0gbmV3IENvbnZlcnNhdGlvbihDb252ZXJzYXRpb25UeXBlLkNoYXRSb29tLCB0aGlzLnNlc3Npb24uY2FsbElkLCAwKQogICAgICAgICAgICAgICAgbGV0IGNoYXRyb29tSW5mbyA9IG5ldyBDaGF0Um9vbUluZm8oKTsKICAgICAgICAgICAgICAgIGNoYXRyb29tSW5mby5jaGF0Um9vbUlkID0gdGhpcy5zZXNzaW9uLmNhbGxJZDsKICAgICAgICAgICAgICAgIGNoYXRyb29tSW5mby50aXRsZSA9IHRoaXMuc2Vzc2lvbi50aXRsZTsKICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbi5fdGFyZ2V0ID0gY2hhdHJvb21JbmZvOwogICAgICAgICAgICAgICAgY29udmVyc2F0aW9uLl90YXJnZXQuX2Rpc3BsYXlOYW1lID0gY2hhdHJvb21JbmZvLnRpdGxlOwogICAgICAgICAgICAgICAgbGV0IGNvbnZlcnNhdGlvbkluZm8gPSBuZXcgQ29udmVyc2F0aW9uSW5mbygpOwogICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSW5mby5jb252ZXJzYXRpb24gPSBjb252ZXJzYXRpb247CiAgICAgICAgICAgICAgICBzdG9yZS5zZXRDdXJyZW50Q29udmVyc2F0aW9uSW5mbyhjb252ZXJzYXRpb25JbmZvKTsKICAgICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5yZXBsYWNlKCcvaG9tZScpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgaGlkZVBhcnRpY2lwYW50TGlzdCgpIHsKICAgICAgICAgICAgdGhpcy5zaG93Q29uZmVyZW5jZU1hbmFnZVZpZXcgJiYgKHRoaXMuc2hvd0NvbmZlcmVuY2VNYW5hZ2VWaWV3ID0gZmFsc2UpOwogICAgICAgICAgICB0aGlzLnRvZ2dsZVNsaWRlclZpZXcoKTsKICAgICAgICB9LAoKICAgICAgICB0b2dnbGVTbGlkZXJWaWV3KCkgewogICAgICAgICAgICBpZiAoIXRoaXMuc2hvd1NsaWRlcikgewogICAgICAgICAgICAgICAgaWYgKGlzRWxlY3Ryb24oKSkgewogICAgICAgICAgICAgICAgICAgIGxldCBzaXplID0gY3VycmVudFdpbmRvdy5nZXRTaXplKCk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudFdpbmRvdy5zZXRTaXplKHNpemVbMF0gKyAzNTAsIHNpemVbMV0sIGZhbHNlKQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVzaXplVG8od2luZG93LmlubmVyV2lkdGggKyAzNjAsIHdpbmRvdy5vdXRlckhlaWdodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLnJvb3RDb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoJy0tc2xpZGVyLXdpZHRoJywgJzM1MHB4Jyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoaXNFbGVjdHJvbigpKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSBjdXJyZW50V2luZG93LmdldFNpemUoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLnJvb3RDb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoJy0tc2xpZGVyLXdpZHRoJywgJzBweCcpOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRXaW5kb3cuc2V0U2l6ZShzaXplWzBdIC0gMzUwLCBzaXplWzFdLCBmYWxzZSkKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy4kcmVmcy5yb290Q29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KCctLXNsaWRlci13aWR0aCcsICcwcHgnKTsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVzaXplVG8od2luZG93LmlubmVyV2lkdGggLSAzNTAsIHdpbmRvdy5vdXRlckhlaWdodCkKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLnNob3dDb25mZXJlbmNlTWFuYWdlVmlldyA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5zaG93Q29udmVyc2F0aW9uVmlldyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2hvd1NsaWRlciA9ICF0aGlzLnNob3dTbGlkZXI7CiAgICAgICAgfSwKCgogICAgICAgIGFzeW5jIHNjcmVlblNoYXJlKCkgewoKICAgICAgICAgICAgLy8gaWYgKHRydWUpIHsKICAgICAgICAgICAgLy8gICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oZGV2aWNlSW5mb3MgPT4gewogICAgICAgICAgICAvLyAgICAgICAgIC8vIHRlc3QgaW5wdXQKICAgICAgICAgICAgLy8gICAgICAgICBmb3IgKGNvbnN0IGRldmljZUluZm8gb2YgZGV2aWNlSW5mb3MpIHsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgaWYgKHRoaXMudGVzdENvdW50ICUgMiA9PT0gMCkgewogICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgLy/ku4Xku4XmmK/kuLrmtYvor5XkuobvvIznlJ/miJDkuI3og73ov5nkuYjlhpnmrbsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLmxhYmVsID09PSAi5aSW572u6bqm5YWL6aOOIChCdWlsdC1pbikiKSB7CiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2F1ZGlvSW5wdXQg5aSW572uJyk7CiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnNldEF1ZGlvSW5wdXREZXZpY2VJZChkZXZpY2VJbmZvLmRldmljZUlkKTsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLmxhYmVsID09PSAiTWFjQm9vayBQcm/puqblhYvpo44gKEJ1aWx0LWluKSIpIHsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnYXVkaW9JbnB1dCDlhoXnva4nKTsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb24uc2V0QXVkaW9JbnB1dERldmljZUlkKGRldmljZUluZm8uZGV2aWNlSWQpOwogICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAvLyAgICAgICAgICAgICB9CiAgICAgICAgICAgIC8vICAgICAgICAgfQogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyAgICAgICAgIC8vIHRlc3Qgb3V0cHV0CiAgICAgICAgICAgIC8vICAgICAgICAgLy8gZm9yIChjb25zdCBkZXZpY2VJbmZvIG9mIGRldmljZUluZm9zKSB7CiAgICAgICAgICAgIC8vICAgICAgICAgLy8gICAgIGlmICh0aGlzLnRlc3RDb3VudCAlIDIgPT09IDApIHsKICAgICAgICAgICAgLy8gICAgICAgICAvLyAgICAgICAgIGlmIChkZXZpY2VJbmZvLmxhYmVsID09PSAi5aSW572u6ICz5py6IChCdWlsdC1pbikiKSB7CiAgICAgICAgICAgIC8vICAgICAgICAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coJ2F1ZGlvT3V0IOWklue9ricpOwogICAgICAgICAgICAvLyAgICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuc2V0QXVkaW9PdXRwdXREZXZpY2VJZChkZXZpY2VJbmZvLmRldmljZUlkKQogICAgICAgICAgICAvLyAgICAgICAgIC8vICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvLyAgICAgICAgIC8vICAgICAgICAgfQogICAgICAgICAgICAvLyAgICAgICAgIC8vICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyAgICAgICAgIC8vICAgICAgICAgaWYgKGRldmljZUluZm8ubGFiZWwgPT09ICJNYWNCb29rIFByb+aJrOWjsOWZqCAoQnVpbHQtaW4pIikgewogICAgICAgICAgICAvLyAgICAgICAgIC8vICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdhdWRpb091dHB1dCDlhoXnva4nKTsKICAgICAgICAgICAgLy8gICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLnNldEF1ZGlvT3V0cHV0RGV2aWNlSWQoZGV2aWNlSW5mby5kZXZpY2VJZCkKICAgICAgICAgICAgLy8gICAgICAgICAvLyAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gICAgICAgICAvLyAgICAgICAgIH0KICAgICAgICAgICAgLy8gICAgICAgICAvLyAgICAgfQogICAgICAgICAgICAvLyAgICAgICAgIC8vIH0KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gICAgIH0pLmNhdGNoKGVyciA9PiB7CiAgICAgICAgICAgIC8vICAgICAgICAgY29uc29sZS5sb2coKQogICAgICAgICAgICAvLyAgICAgfSkKICAgICAgICAgICAgLy8gICAgIHRoaXMudGVzdENvdW50Kys7CiAgICAgICAgICAgIC8vICAgICByZXR1cm47CiAgICAgICAgICAgIC8vIH0KCiAgICAgICAgICAgIGlmICh0aGlzLnNlc3Npb24uc2NyZWVuU2hhcmluZykgewogICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnN0b3BTY3JlZW5TaGFyZSgpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3N0b3BTY3JlZW5TaGFyZScsIHRoaXMuc2Vzc2lvbi52aWRlb011dGVkLCB0aGlzLnNlc3Npb24uYXVkaW9NdXRlZCk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXNzaW9uLnZpZGVvTXV0ZWQgJiYgdGhpcy5zZXNzaW9uLmF1ZGlvTXV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb24uc3dpdGNoQXVkaWVuY2UodHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBjdXJyZW50V2luZG93LnNldElnbm9yZU1vdXNlRXZlbnRzKGZhbHNlKQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKGlzRWxlY3Ryb24oKSkgewogICAgICAgICAgICAgICAgICAgIGxldCBiZWZvcmVDbG9zZSA9IChldmVudCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGF0IGEgZ2FtYmxlLi4uIDUwJSBjaGFuY2UgdG8gY2FuY2VsIGNsb3NpbmcKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFldmVudC5wYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQucGFyYW1zLnNvdXJjZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZSA9IGV2ZW50LnBhcmFtcy5zb3VyY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVza3RvcFNoYXJlT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZDogc291cmNlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiAxMjgwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiAxMjgwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogNzIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogNzIwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbi5hdWRpZW5jZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5zd2l0Y2hBdWRpZW5jZShmYWxzZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnN0YXJ0U2NyZWVuU2hhcmUoZGVza3RvcFNoYXJlT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb24uc3RhcnRTY3JlZW5TaGFyZShkZXNrdG9wU2hhcmVPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZW5naW5la2l0cHJveHkuZW1pdFRvTWFpbihJcGNFdmVudFR5cGUuU1RBUlRfU0NSRUVOX1NIQVJFLCB7fSkKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWwuc2hvdygKICAgICAgICAgICAgICAgICAgICAgICAgU2NyZWVuT3JXaW5kb3dQaWNrZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIHt9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogODAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA2MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnc2NyZWVuLXdpbmRvdy1waWNrZXItbW9kYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tUb0Nsb3NlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ2JlZm9yZS1vcGVuJzogYmVmb3JlT3BlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZWZvcmUtY2xvc2UnOiBiZWZvcmVDbG9zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdjbG9zZWQnOiBjbG9zZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXNzaW9uLmF1ZGllbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Vzc2lvbi5zd2l0Y2hBdWRpZW5jZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5zdGFydFNjcmVlblNoYXJlKHsKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVSYXRlOiAzMAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLy8g6K6+572u6Z+z6aKR6L6T5Ye66K6+5aSHCiAgICAgICAgc2V0QXVkaW9PdXRwdXREZXZpY2VJZChkZXZpY2VJZCkgewogICAgICAgICAgICBsZXQgYXVkaW9FbHMgPSB0aGlzLiRlbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYXVkaW8nKTsKICAgICAgICAgICAgZm9yIChjb25zdCBhdWRpb0VsIG9mIGF1ZGlvRWxzKSB7CiAgICAgICAgICAgICAgICBhdWRpb0VsLnNldFNpbmtJZChkZXZpY2VJZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHZpZGVvRWxzID0gdGhpcy4kZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJyk7CiAgICAgICAgICAgIGZvciAoY29uc3QgdmlkZW9FbCBvZiB2aWRlb0VscykgewogICAgICAgICAgICAgICAgdmlkZW9FbC5zZXRTaW5rSWQoZGV2aWNlSWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgaGFuZHVwKCkgewogICAgICAgICAgICBjb25mZXJlbmNlTWFuYWdlci5oYW5kVXAoIWNvbmZlcmVuY2VNYW5hZ2VyLmlzSGFuZFVwKQogICAgICAgIH0sCgogICAgICAgIHVzZXJOYW1lKHVzZXIpIHsKICAgICAgICAgICAgbGV0IG5hbWUgPSAnJzsKICAgICAgICAgICAgaWYgKHVzZXIuZ3JvdXBBbGlhcykgewogICAgICAgICAgICAgICAgbmFtZSA9IHVzZXIuZ3JvdXBBbGlhczsKICAgICAgICAgICAgfSBlbHNlIGlmICh1c2VyLmZyaWVuZEFsaWFzKSB7CiAgICAgICAgICAgICAgICBuYW1lID0gdXNlci5mcmllbmRBbGlhczsKICAgICAgICAgICAgfSBlbHNlIGlmICh1c2VyLmRpc3BsYXlOYW1lKSB7CiAgICAgICAgICAgICAgICBuYW1lID0gdXNlci5kaXNwbGF5TmFtZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5hbWUgPSB1c2VyLm5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5hbWU7CiAgICAgICAgfSwKCiAgICAgICAgdGltZXN0YW1wRm9ybWF0KHRpbWVzdGFtcCkgewogICAgICAgICAgICB0aW1lc3RhbXAgPSB+fih0aW1lc3RhbXAgLyAxMDAwKTsKICAgICAgICAgICAgbGV0IHN0ciA9ICcnCiAgICAgICAgICAgIGxldCBob3VyID0gfn4odGltZXN0YW1wIC8gMzYwMCk7CiAgICAgICAgICAgIHN0ciA9IGhvdXIgPiAwID8gKChob3VyIDwgMTAgPyAiMCIgOiAiIikgKyBob3VyICsgJzonKSA6ICcnOwogICAgICAgICAgICBsZXQgbWluID0gfn4oKHRpbWVzdGFtcCAlIDM2MDApIC8gNjApOwogICAgICAgICAgICBzdHIgKz0gKG1pbiA8IDEwID8gIjAiIDogIiIpICsgbWluICsgJzonCiAgICAgICAgICAgIGxldCBzZWMgPSB+figodGltZXN0YW1wICUgNjApKTsKICAgICAgICAgICAgc3RyICs9IChzZWMgPCAxMCA/ICIwIiA6ICIiKSArIHNlYwogICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgIH0sCgogICAgICAgIC8vIFRPRE8g5Yig6Zmk77yM5Y+v5Lul55u05o6l55uR5ZCs55So5oi35L+h5oGv5Y+Y5YyW5LqGCiAgICAgICAgcmVmcmVzaFVzZXJJbmZvcygpIHsKICAgICAgICAgICAgbGV0IHRvUmVmcmVzaFVzZXJzID0gW107CiAgICAgICAgICAgIHRoaXMucGFydGljaXBhbnRVc2VySW5mb3MuZm9yRWFjaChwdSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIXB1LnVwZGF0ZUR0KSB7CiAgICAgICAgICAgICAgICAgICAgdG9SZWZyZXNoVXNlcnMucHVzaChwdS51aWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICh0b1JlZnJlc2hVc2Vycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndG8gcmVmcmVzaFVzZXJzJywgdG9SZWZyZXNoVXNlcnMpCiAgICAgICAgICAgICAgICBsZXQgdXNlckluZm9zID0gd2ZjLmdldFVzZXJJbmZvcyh0b1JlZnJlc2hVc2VycywgJycpOwogICAgICAgICAgICAgICAgdXNlckluZm9zLmZvckVhY2godSA9PiB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvcy5maW5kSW5kZXgocCA9PiBwLnVpZCA9PT0gdS51aWQpOwogICAgICAgICAgICAgICAgICAgIGlmICh1LnVwZGF0ZUR0ICYmIGluZGV4ID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG91ID0gdGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIHUuX3N0cmVhbSA9IG91Ll9zdHJlYW07CiAgICAgICAgICAgICAgICAgICAgICAgIHUuX2lzQXVkaWVuY2UgPSBvdS5faXNBdWRpZW5jZTsKICAgICAgICAgICAgICAgICAgICAgICAgdS5faXNIb3N0ID0gb3UuX2lzSG9zdDsKICAgICAgICAgICAgICAgICAgICAgICAgdS5faXNWaWRlb011dGVkID0gb3UuX2lzVmlkZW9NdXRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgdS5faXNBdWRpb011dGVkID0gb3UuX2lzQXVkaW9NdXRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgdS5fdm9sdW1lID0gb3UuX3ZvbHVtZTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRllJOiBodHRwczovL3YyLnZ1ZWpzLm9yZy92Mi9ndWlkZS9yZWFjdGl2aXR5I0NoYW5nZS1EZXRlY3Rpb24tQ2F2ZWF0cwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLnNwbGljZShpbmRleCwgMSwgdSkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgcmVqb2luQ29uZmVyZW5jZSgpIHsKICAgICAgICAgICAgYXZlbmdpbmVraXQuam9pbkNvbmZlcmVuY2UoewogICAgICAgICAgICAgICAgY2FsbElkOiB0aGlzLnNlc3Npb24uY2FsbElkLAogICAgICAgICAgICAgICAgcGluOiB0aGlzLnNlc3Npb24ucGluLAogICAgICAgICAgICAgICAgaG9zdDogdGhpcy5zZXNzaW9uLmhvc3QsCiAgICAgICAgICAgICAgICB0aWxlOiB0aGlzLnNlc3Npb24udGl0bGUsCiAgICAgICAgICAgICAgICBkZXNjOiB0aGlzLnNlc3Npb24uZGVzYywKICAgICAgICAgICAgICAgIGF1ZGlvT25seTogdGhpcy5zZXNzaW9uLmF1ZGlvT25seSwKICAgICAgICAgICAgICAgIGF1ZGllbmNlOiB0aGlzLnNlc3Npb24uYXVkaWVuY2UsCiAgICAgICAgICAgICAgICBhZHZhbmNlOiB0aGlzLnNlc3Npb24uYWR2YW5jZSwKICAgICAgICAgICAgICAgIG11dGVWaWRlbzogdGhpcy5zZXNzaW9uLnZpZGVvTXV0ZWQsCiAgICAgICAgICAgICAgICBtdXRlQXVkaW86IHRoaXMuc2Vzc2lvbi5hdWRpb011dGVkLAogICAgICAgICAgICAgICAgZXh0cmE6IHRoaXMuc2Vzc2lvbi5leHRyYSwKICAgICAgICAgICAgICAgIGNhbGxFeHRyYTogdGhpcy5zZXNzaW9uLmNhbGxFeHRyYSwKICAgICAgICAgICAgICAgIHNlbGZVc2VySW5mbzogdGhpcy5zZWxmVXNlckluZm8sCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLmVuZFJlYXNvbiA9IHVuZGVmaW5lZDsKICAgICAgICB9LAoKICAgICAgICBwcmVQYWdlKCkgewogICAgICAgICAgICB0aGlzLmN1cnJlbnRHcmlkUGFnZUluZGV4LS07CiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRHcmlkUGFnZUluZGV4IDwgMCkgewogICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50R3JpZFBhZ2VJbmRleCA9IE1hdGguY2VpbCh0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmxlbmd0aCAvIHRoaXMucGFydGljaXBhbnRDb3VudFBlckdyaWRQYWdlKSAtIDEKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgbmV4dFBhZ2UoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmxlbmd0aCAvIHRoaXMucGFydGljaXBhbnRDb3VudFBlckdyaWRQYWdlID4gKHRoaXMuY3VycmVudEdyaWRQYWdlSW5kZXggKyAxKSkgewogICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50R3JpZFBhZ2VJbmRleCsrOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50R3JpZFBhZ2VJbmRleCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICB1cGRhdGVDb3VudFBlclBhZ2UoY291bnQpIHsKICAgICAgICAgICAgdGhpcy5wYXJ0aWNpcGFudENvdW50UGVyR3JpZFBhZ2UgPSBjb3VudDsKICAgICAgICB9LAoKICAgICAgICBzZXRDdXJyZW50TGF5b3V0KGxheW91dCkgewogICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50TGF5b3V0ID09PSBsYXlvdXQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyDmvJTorrLogIXluIPlsYAKICAgICAgICAgICAgaWYgKGxheW91dCA9PT0gMSkgewogICAgICAgICAgICAgICAgLy8g5ryU6K6y6ICF5biD5bGA77yM5YiH5o2i5Li65bCP5rWB77yM54S25ZCO54Sm54K555So5oi35YiH5o2i5Li65aSn5rWBCiAgICAgICAgICAgICAgICB0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmZvckVhY2godSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHUudWlkICE9PSB0aGlzLnNlbGZVc2VySW5mby51aWQgJiYgIXUuX2lzQXVkaWVuY2UgJiYgIXUuX2lzVmlkZW9NdXRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb24uc2V0UGFydGljaXBhbnRWaWRlb1R5cGUodS51aWQsIHUuX2lzU2NyZWVuU2hhcmluZywgVmlkZW9UeXBlLlNNQUxMX1NUUkVBTSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8v5a6r5qC85biD5bGA77yMIOW9k+WJjemhteWIh+aNouS4uuWkp+a1ge+8jOacquaYvuekuueahO+8jOWPlua2iOiuoumYhe+8jOeUsSBjdXJyZW50UGFnZVBhcnRpY2lwYW50cyDlia/kvZznlKjop6blj5EKICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEdyaWRQYWdlSW5kZXggPSAwOwogICAgICAgICAgICAgICAgY29uZmVyZW5jZU1hbmFnZXIuY3VycmVudEZvY3VzVXNlciA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5jdXJyZW50TGF5b3V0ID0gbGF5b3V0OwogICAgICAgICAgICB0aGlzLnNob3dDaG9vc2VMYXlvdXRWaWV3ID0gZmFsc2U7CiAgICAgICAgfSwKICAgICAgICB0b2dnbGVQYXJ0aWNpcGFudExpc3RWaWRlb1ZpZXcoKSB7CiAgICAgICAgICAgIHRoaXMuaGlkZUZvY3VzTGF5b3V0UGFydGljaXBhbnRMaXN0VmlkZW9WaWV3ID0gIXRoaXMuaGlkZUZvY3VzTGF5b3V0UGFydGljaXBhbnRMaXN0VmlkZW9WaWV3OwogICAgICAgIH0sCgogICAgICAgIGhpZGVDb25mZXJlbmNlU2ltcGxlSW5mb1ZpZXcoZXZlbnQpIHsKICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5pZCA9PT0gJ2luZm8taWNvbicpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnNob3dDb25mZXJlbmNlU2ltcGxlSW5mb1ZpZXcgPSBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICBoaWRlQ2hvb3NlTGF5b3V0VmlldyhldmVudCkgewogICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LmlkID09PSAnZ3JpZC1pY29uJykgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2hvd0Nob29zZUxheW91dFZpZXcgPSBmYWxzZTsKICAgICAgICB9CiAgICB9LAoKICAgIGNvbXB1dGVkOiB7CiAgICAgICAgZHVyYXRpb24oKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRUaW1lc3RhbXAgPD0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcwMDowMCcKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgZXNjYXBlTWlsbGlzID0gdGhpcy5jdXJyZW50VGltZXN0YW1wIC0gdGhpcy5zdGFydFRpbWVzdGFtcDsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudGltZXN0YW1wRm9ybWF0KGVzY2FwZU1pbGxpcykKICAgICAgICB9LAoKICAgICAgICBzcGVha2luZ1VzZXJOYW1lKCkgewogICAgICAgICAgICBsZXQgbWF4Vm9sdW1lID0gdGhpcy5zZWxmVXNlckluZm8uX3ZvbHVtZTsKICAgICAgICAgICAgbGV0IHNwZWFraW5nVXNlckluZm8gPSB0aGlzLnNlbGZVc2VySW5mbzsKICAgICAgICAgICAgdGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvcy5mb3JFYWNoKHUgPT4gewogICAgICAgICAgICAgICAgaWYgKHUuX3ZvbHVtZSA+IG1heFZvbHVtZSkgewogICAgICAgICAgICAgICAgICAgIHNwZWFraW5nVXNlckluZm8gPSB1OwogICAgICAgICAgICAgICAgICAgIG1heFZvbHVtZSA9IHUuX3ZvbHVtZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICAgICAgaWYgKCFtYXhWb2x1bWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRoaXMudXNlck5hbWUoc3BlYWtpbmdVc2VySW5mbyk7CiAgICAgICAgfSwKCiAgICAgICAgY3VycmVudFBhZ2VQYXJ0aWNpcGFudHMoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRMYXlvdXQgPT09IDEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGV0IGZvY3VzVXNlciA9IHRoaXMuY29uZmVyZW5jZUZvY3VzVXNlcjsKICAgICAgICAgICAgLy8gc29ydCBub3QgaW4gcGxhY2XvvIzpgb/lhY3lia/kvZznlKgKICAgICAgICAgICAgbGV0IHNvcnRlZFBhcnRpY2lwYW50VXNlckluZm9zID0gWy4uLnRoaXMucGFydGljaXBhbnRVc2VySW5mb3NdLnNvcnQoKG8xLCBvMikgPT4gewogICAgICAgICAgICAgICAgaWYgKGZvY3VzVXNlcikgewogICAgICAgICAgICAgICAgICAgIGlmIChvMS51aWQgPT09IGZvY3VzVXNlci51aWQgJiYgbzEuX2lzU2NyZWVuU2hhcmluZyA9PT0gZm9jdXNVc2VyLl9pc1NjcmVlblNoYXJpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobzIudWlkID09PSBmb2N1c1VzZXIudWlkICYmIG8yLl9pc1NjcmVlblNoYXJpbmcgPT09IGZvY3VzVXNlci5faXNTY3JlZW5TaGFyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobzEuX2lzQXVkaWVuY2UgJiYgIW8yLl9pc0F1ZGllbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFvMS5faXNBdWRpZW5jZSAmJiBvMi5faXNBdWRpZW5jZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobzEuX2lzQXVkaWVuY2UgJiYgbzIuX2lzQXVkaWVuY2UpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzEudWlkLmxvY2FsZUNvbXBhcmUobzIudWlkKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG8xLl9pc1NjcmVlblNoYXJpbmcgJiYgIW8yLl9pc1NjcmVlblNoYXJpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIW8xLl9pc1NjcmVlblNoYXJpbmcgJiYgbzIuX2lzU2NyZWVuU2hhcmluZykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvMS5faXNWaWRlb011dGVkICYmIG8yLl9pc1ZpZGVvTXV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobzEuX2lzVmlkZW9NdXRlZCAmJiAhbzIuX2lzVmlkZW9NdXRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8xLnVpZC5sb2NhbGVDb21wYXJlKG8yLnVpZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCgogICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLmN1cnJlbnRHcmlkUGFnZUluZGV4ICogdGhpcy5wYXJ0aWNpcGFudENvdW50UGVyR3JpZFBhZ2U7CiAgICAgICAgICAgIGxldCBlbmQgPSBzdGFydCArIHRoaXMucGFydGljaXBhbnRDb3VudFBlckdyaWRQYWdlID4gc29ydGVkUGFydGljaXBhbnRVc2VySW5mb3MubGVuZ3RoID8gc29ydGVkUGFydGljaXBhbnRVc2VySW5mb3MubGVuZ3RoIDogKHN0YXJ0ICsgdGhpcy5wYXJ0aWNpcGFudENvdW50UGVyR3JpZFBhZ2UpOwogICAgICAgICAgICAvLyBzaWRlIGVmZmVjdAogICAgICAgICAgICAvLyBUT0RPIOS8mOWMlgogICAgICAgICAgICAvLyDnm7jpgrvpobXliIfmjaLml7bvvIzkuI3og73nkIbop6Plj5bmtojorqLpmIXvvIzlj6/og73ov5jliIfmjaLlm57ljrvvvIzpgqPmoLfnmoTor53vvIzlsLHkvJrmnInkuIDlsI/mrrXml7bpl7TvvIzkuI3mmL7npLrop4bpopHmtYEKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRQYXJ0aWNpcGFudFVzZXJJbmZvcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgbGV0IHUgPSBzb3J0ZWRQYXJ0aWNpcGFudFVzZXJJbmZvc1tpXTsKICAgICAgICAgICAgICAgIGlmICh1LnVpZCA9PT0gdGhpcy5zZWxmVXNlckluZm8udWlkIHx8IHUuX2lzQXVkaWVuY2UgfHwgdS5faXNWaWRlb011dGVkKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaSA+PSBzdGFydCAmJiBpIDwgZW5kKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3NldCB2aWRlbyB0eXBlIGJpZycsIHUudWlkKQogICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5zZXRQYXJ0aWNpcGFudFZpZGVvVHlwZSh1LnVpZCwgdS5faXNTY3JlZW5TaGFyaW5nLCBWaWRlb1R5cGUuQklHX1NUUkVBTSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzZXQgdmlkZW8gdHlwZSBub25lJywgdS51aWQpCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnNldFBhcnRpY2lwYW50VmlkZW9UeXBlKHUudWlkLCB1Ll9pc1NjcmVlblNoYXJpbmcsIFZpZGVvVHlwZS5OT05FKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBzaWRlIGVmZmVjdAogICAgICAgICAgICByZXR1cm4gc29ydGVkUGFydGljaXBhbnRVc2VySW5mb3Muc2xpY2Uoc3RhcnQsIGVuZCk7CiAgICAgICAgfSwKCiAgICAgICAgZ3JpZFBhZ2VDb3VudCgpIHsKICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmxlbmd0aCAvIHRoaXMucGFydGljaXBhbnRDb3VudFBlckdyaWRQYWdlKTsKICAgICAgICB9LAoKICAgICAgICBjb25mZXJlbmNlRm9jdXNVc2VyKCkgewogICAgICAgICAgICBsZXQgZm9jdXMgPSBjb25mZXJlbmNlTWFuYWdlci5jb25mZXJlbmNlSW5mby5mb2N1czsKICAgICAgICAgICAgaWYgKCFmb2N1cykgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGZvY3VzVXNlciA9IHRoaXMucGFydGljaXBhbnRVc2VySW5mb3MuZmluZCh1ID0+IHUudWlkID09PSBmb2N1cyAmJiB1Ll9pc1NjcmVlblNoYXJpbmcgPT09IHRydWUpOwogICAgICAgICAgICBpZiAoIWZvY3VzVXNlcikgewogICAgICAgICAgICAgICAgZm9jdXNVc2VyID0gdGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvcy5maW5kKHUgPT4gdS51aWQgPT09IGZvY3VzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZm9jdXNVc2VyOwogICAgICAgIH0sCiAgICAgICAgY29uZmVyZW5jZUxvY2FsRm9jdXNVc2VyKCkgewogICAgICAgICAgICByZXR1cm4gY29uZmVyZW5jZU1hbmFnZXIubG9jYWxGb2N1c1VzZXI7CiAgICAgICAgfSwKCiAgICAgICAgLy8g5Lul55So5oi35omL5Yqo6YCJ5oup55qE5Li65YeGCiAgICAgICAgY29tcHV0ZWRDdXJyZW50TGF5b3V0KCkgewogICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50TGF5b3V0ID09PSAtMSAmJiB0aGlzLmNvbmZlcmVuY2VGb2N1c1VzZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRMYXlvdXQ7CiAgICAgICAgfSwKCiAgICAgICAgLy8gVE9ETyDlj6/ku6XnvJPlrZjliLAgY29uZmVyZW5jZU1hbmFnZXIg6YeM6Z2iCiAgICAgICAgY29tcHV0ZWRGb2N1c1ZpZGVvUGFydGljaXBhbnQoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRMYXlvdXQgPT09IDApIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb21wdXRlZFNwZWFraW5nUGFydGljaXBhbnQgbnVsbCcpCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgc3A7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZlcmVuY2VGb2N1c1VzZXIgJiYgIXRoaXMuY29uZmVyZW5jZUZvY3VzVXNlci5faXNWaWRlb011dGVkKSB7CiAgICAgICAgICAgICAgICBzcCA9IHRoaXMuY29uZmVyZW5jZUZvY3VzVXNlcjsKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZlcmVuY2VMb2NhbEZvY3VzVXNlciAmJiAhdGhpcy5jb25mZXJlbmNlTG9jYWxGb2N1c1VzZXIuX2lzVmlkZW9NdXRlZCkgewogICAgICAgICAgICAgICAgc3AgPSB0aGlzLmNvbmZlcmVuY2VMb2NhbEZvY3VzVXNlcjsKICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNwZWFraW5nVmlkZW9QYXJ0aWNpcGFudCkgewogICAgICAgICAgICAgICAgc3AgPSB0aGlzLnNwZWFraW5nVmlkZW9QYXJ0aWNpcGFudDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNwID0gdGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvcy5maW5kKHUgPT4gIXUuX2lzQXVkaWVuY2UgJiYgIXUuX2lzVmlkZW9NdXRlZCAmJiB1Ll9pc1NjcmVlblNoYXJpbmcgPT09IHRydWUpOwogICAgICAgICAgICAgICAgaWYgKCFzcCkgewogICAgICAgICAgICAgICAgICAgIHNwID0gdGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvcy5maW5kKHUgPT4gIXUuX2lzQXVkaWVuY2UgJiYgIXUuX2lzVmlkZW9NdXRlZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChjb25mZXJlbmNlTWFuYWdlci5jdXJyZW50Rm9jdXNVc2VyKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb24uc2V0UGFydGljaXBhbnRWaWRlb1R5cGUoY29uZmVyZW5jZU1hbmFnZXIuY3VycmVudEZvY3VzVXNlci51aWQsIGNvbmZlcmVuY2VNYW5hZ2VyLmN1cnJlbnRGb2N1c1VzZXIuX2lzU2NyZWVuU2hhcmluZywgVmlkZW9UeXBlLlNNQUxMX1NUUkVBTSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNwKSB7CiAgICAgICAgICAgICAgICBjb25mZXJlbmNlTWFuYWdlci5jdXJyZW50Rm9jdXNVc2VyID0gc3A7CiAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb24uc2V0UGFydGljaXBhbnRWaWRlb1R5cGUoY29uZmVyZW5jZU1hbmFnZXIuY3VycmVudEZvY3VzVXNlci51aWQsIGNvbmZlcmVuY2VNYW5hZ2VyLmN1cnJlbnRGb2N1c1VzZXIuX2lzU2NyZWVuU2hhcmluZywgVmlkZW9UeXBlLkJJR19TVFJFQU0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbi5zY3JlZW5TaGFyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgc3AgPSB0aGlzLnNlbGZVc2VySW5mbzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zb2xlLmxvZygnY29tcHV0ZWRTcGVha2luZ1BhcnRpY2lwYW50Jywgc3ApCiAgICAgICAgICAgIHJldHVybiBzcDsKICAgICAgICB9CiAgICB9LAoKICAgIHdhdGNoOiB7CiAgICAgICAgcGFydGljaXBhbnRVc2VySW5mb3M6IHsKICAgICAgICAgICAgZGVlcDogdHJ1ZSwKICAgICAgICAgICAgaGFuZGxlcihpbmZvcykgewogICAgICAgICAgICAgICAgbGV0IGF1ZGlvT25seSA9IHRydWU7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygncGFydGljaXBhbnRVc2VySW5mb3MnLCB0aGlzLnNlc3Npb24uc2NyZWVuU2hhcmluZyk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXNzaW9uLnNjcmVlblNoYXJpbmcpIHsKICAgICAgICAgICAgICAgICAgICBhdWRpb09ubHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1ID0gdGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1Ll9pc0F1ZGllbmNlICYmICF1Ll9pc1ZpZGVvTXV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvT25seSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvT25seSA9IGF1ZGlvT25seTsKCiAgICAgICAgICAgICAgICAvLyBtdXRlIHNlbGYgYXVkaW8KICAgICAgICAgICAgICAgIGxldCByZWYgPSB0aGlzLiRyZWZzW3RoaXMuc2VsZlVzZXJJbmZvLnVpZCArICctYXVkaW8nXTsKICAgICAgICAgICAgICAgIGlmIChyZWYgJiYgcmVmLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzW3RoaXMuc2VsZlVzZXJJbmZvLnVpZCArICctYXVkaW8nXVswXS5tdXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdWRpb09ubHkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyDlrqvmoLzluIPlsYAKICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRMYXlvdXQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLmN1cnJlbnRHcmlkUGFnZUluZGV4ICogdGhpcy5wYXJ0aWNpcGFudENvdW50UGVyR3JpZFBhZ2U7CiAgICAgICAgICAgICAgICAgICAgbGV0IGVuZCA9IHN0YXJ0ICsgdGhpcy5wYXJ0aWNpcGFudENvdW50UGVyR3JpZFBhZ2UgPiB0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmxlbmd0aCA/IHRoaXMucGFydGljaXBhbnRVc2VySW5mb3MubGVuZ3RoIDogKHN0YXJ0ICsgdGhpcy5wYXJ0aWNpcGFudENvdW50UGVyR3JpZFBhZ2UpOwogICAgICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IGVuZCAtIHN0YXJ0OwogICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9ICcxMDAlJzsKICAgICAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gJzEwMCUnOwogICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gJzEwMCUnOwogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAnMTAwJSc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gJzUwJSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9ICc0NSUnOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPD0gOSkgewogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9ICczMyUnOwogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAnMzMlJwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heCAxNgogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9ICcyNSUnOwogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAnMjUlJwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kcmVmcy5yb290Q29udGFpbmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMucm9vdENvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1wYXJ0aWNpcGFudC12aWRlby1pdGVtLXdpZHRoJywgd2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLnJvb3RDb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoJy0tcGFydGljaXBhbnQtdmlkZW8taXRlbS1oZWlnaHQnLCBoZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY3VycmVudFBhZ2VQYXJ0aWNpcGFudHM6IHsKICAgICAgICAgICAgZGVlcDogdHJ1ZSwKICAgICAgICAgICAgaGFuZGxlcihpbmZvcykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuYXVkaW9Pbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudExheW91dCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IHRoaXMuY3VycmVudFBhZ2VQYXJ0aWNpcGFudHMubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9ICcxMDAlJzsKICAgICAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gJzEwMCUnOwogICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gJzEwMCUnOwogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAnMTAwJSc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gJzUwJSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9ICc0NSUnOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPD0gOSkgewogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9ICczMyUnOwogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAnMzMlJwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heCAxNgogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9ICcyNSUnOwogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAnMjUlJwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kcmVmcy5yb290Q29udGFpbmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMucm9vdENvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1wYXJ0aWNpcGFudC12aWRlby1pdGVtLXdpZHRoJywgd2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLnJvb3RDb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoJy0tcGFydGljaXBhbnQtdmlkZW8taXRlbS1oZWlnaHQnLCBoZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0sCgogICAgZGlyZWN0aXZlczogewogICAgICAgIENsaWNrT3V0c2lkZQogICAgfSwKCiAgICBjcmVhdGVkKCkgewogICAgICAgIGRvY3VtZW50LnRpdGxlID0gJ+WcqOe6v+S8muiuric7CiAgICAgICAgY29uZmVyZW5jZU1hbmFnZXIuc2V0VnVlSW5zdGFuY2UodGhpcyk7CiAgICAgICAgdGhpcy5yZWZyZXNoVXNlckluZm9JbnRlcm5hbCA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgICAgICAgdGhpcy5yZWZyZXNoVXNlckluZm9zKCk7CiAgICAgICAgfSwgMyAqIDEwMDApCgogICAgICAgIHRoaXMuJGV2ZW50QnVzLiRvbignbXV0ZVZpZGVvJywgKG11dGUpID0+IHsKICAgICAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbi52aWRlb011dGVkICE9PSBtdXRlKSB7CiAgICAgICAgICAgICAgICBsZXQgZW5hYmxlID0gdGhpcy5zZXNzaW9uLnZpZGVvTXV0ZWQgPyB0cnVlIDogZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZVZpZGVvKGVuYWJsZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIHRoaXMuJGV2ZW50QnVzLiRvbignbXV0ZUF1ZGlvJywgKG11dGUpID0+IHsKICAgICAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbi5hdWRpb011dGVkICE9PSBtdXRlKSB7CiAgICAgICAgICAgICAgICBsZXQgZW5hYmxlID0gdGhpcy5zZXNzaW9uLmF1ZGlvTXV0ZWQgPyB0cnVlIDogZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUF1ZGlvKGVuYWJsZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KQogICAgfSwKCiAgICBtb3VudGVkKCkgewogICAgICAgIHRoaXMuc2V0dXBTZXNzaW9uQ2FsbGJhY2soKTsKCiAgICAgICAgaWYgKGlzRWxlY3Ryb24oKSkgewogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyB0aGlzLiRvbignc3RvcC1zY3JlZW4tc2hhcmUnLCAoKSA9PiB7CiAgICAgICAgICAgIC8vICAgICB0aGlzLnNlc3Npb24uc3RvcFNjcmVlblNoYXJlKCk7CiAgICAgICAgICAgIC8vICAgICB0aGlzLiRmb3JjZVVwZGF0ZSgpOwogICAgICAgICAgICAvLyB9KQogICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwgKGV2ZW50KSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbiB8fCAhdGhpcy5zZXNzaW9uLnNjcmVlblNoYXJpbmcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LmlkID09PSAibWFpbi1jb250ZW50LWNvbnRhaW5lciIpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50V2luZG93LnNldElnbm9yZU1vdXNlRXZlbnRzKHRydWUsIHtmb3J3YXJkOiB0cnVlfSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRXaW5kb3cuc2V0SWdub3JlTW91c2VFdmVudHMoZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLCAoZXZlbnQpID0+IHsKICAgICAgICAgICAgICAgIGN1cnJlbnRXaW5kb3cuc2V0SWdub3JlTW91c2VFdmVudHMoZmFsc2UpOwogICAgICAgICAgICB9KQogICAgICAgICAgICB0aGlzLiRyZWZzLnJvb3RDb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoJy0tY29uZmVyZW5jZS1jb250YWluZXItbWFyZ2luLXRvcCcsICczMHB4Jyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy4kcmVmcy5yb290Q29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KCctLWNvbmZlcmVuY2UtY29udGFpbmVyLW1hcmdpbi10b3AnLCAnMHB4Jyk7CiAgICAgICAgfQogICAgfSwKCiAgICBkZXN0cm95ZWQoKSB7CiAgICAgICAgLy8gcmVzZXQKICAgICAgICB0aGlzLiRzZXQodGhpcy5zZWxmVXNlckluZm8sICdfc3RyZWFtJywgbnVsbCkKICAgICAgICB0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmZvckVhY2gobSA9PiB0aGlzLiRzZXQobSwgIl9zdHJlYW0iLCBudWxsKSkKICAgICAgICBjbGVhckludGVydmFsKHRoaXMucmVmcmVzaFVzZXJJbmZvSW50ZXJuYWwpOwogICAgICAgIHRoaXMuJGV2ZW50QnVzLiRvZmYoJ211dGVWaWRlbycpOwogICAgICAgIHRoaXMuJGV2ZW50QnVzLiRvZmYoJ211dGVBdWRpbycpOwogICAgICAgIHRoaXMuY29uZmVyZW5jZU1hbmFnZXIuZGVzdHJveSgpOwogICAgfQp9Cg=="},null]}