| 1 |
- {"remainingRequest":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/thread-loader/dist/cjs.js!/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/babel-loader/lib/index.js!/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/element-ui/lib/cascader-panel.js","dependencies":[{"path":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/element-ui/lib/cascader-panel.js","mtime":499162500000},{"path":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/cache-loader/dist/cjs.js","mtime":499162500000},{"path":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/thread-loader/dist/cjs.js","mtime":499162500000},{"path":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/babel-loader/lib/index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbCIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbiIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC50by1zdHJpbmctdGFnIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0Iik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZXZlcnkiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mb3ItZWFjaCIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluZGV4LW9mIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuam9pbiIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lm1hcCIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnJlZHVjZSIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNsaWNlIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc29tZSIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWUiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5qc29uLnRvLXN0cmluZy10YWciKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnRvLXN0cmluZy10YWciKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuY29uc3RydWN0b3IiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3BsaXQiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvciIpOwoKdmFyIF90eXBlb2YgPSByZXF1aXJlKCIvdXNyL2xvY2FsL2RldmVsb3AvcGhwL3d3dy93YWliYW8vcHJvamVjdC9OTjIwMjAwNjA4MDEvYWRkb25zL2FkbWluL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZiIpOwoKbW9kdWxlLmV4cG9ydHMgPQovKioqKioqLwpmdW5jdGlvbiAobW9kdWxlcykgewogIC8vIHdlYnBhY2tCb290c3RyYXAKCiAgLyoqKioqKi8KICAvLyBUaGUgbW9kdWxlIGNhY2hlCgogIC8qKioqKiovCiAgdmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTsKICAvKioqKioqLwoKICAvKioqKioqLwogIC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uCgogIC8qKioqKiovCgogIGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKICAgIC8qKioqKiovCgogICAgLyoqKioqKi8KICAgIC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZQoKICAgIC8qKioqKiovCiAgICBpZiAoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHsKICAgICAgLyoqKioqKi8KICAgICAgcmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7CiAgICAgIC8qKioqKiovCiAgICB9CiAgICAvKioqKioqLwogICAgLy8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSkKCiAgICAvKioqKioqLwoKCiAgICB2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7CiAgICAgIC8qKioqKiovCiAgICAgIGk6IG1vZHVsZUlkLAoKICAgICAgLyoqKioqKi8KICAgICAgbDogZmFsc2UsCgogICAgICAvKioqKioqLwogICAgICBleHBvcnRzOiB7fQogICAgICAvKioqKioqLwoKICAgIH07CiAgICAvKioqKioqLwoKICAgIC8qKioqKiovCiAgICAvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb24KCiAgICAvKioqKioqLwoKICAgIG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwogICAgLyoqKioqKi8KCiAgICAvKioqKioqLwogICAgLy8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZAoKICAgIC8qKioqKiovCgogICAgbW9kdWxlLmwgPSB0cnVlOwogICAgLyoqKioqKi8KCiAgICAvKioqKioqLwogICAgLy8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGUKCiAgICAvKioqKioqLwoKICAgIHJldHVybiBtb2R1bGUuZXhwb3J0czsKICAgIC8qKioqKiovCiAgfQogIC8qKioqKiovCgogIC8qKioqKiovCgogIC8qKioqKiovCiAgLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXykKCiAgLyoqKioqKi8KCgogIF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7CiAgLyoqKioqKi8KCiAgLyoqKioqKi8KICAvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZQoKICAvKioqKioqLwoKICBfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzOwogIC8qKioqKiovCgogIC8qKioqKiovCiAgLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzCgogIC8qKioqKiovCgogIF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uIChleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHsKICAgIC8qKioqKiovCiAgICBpZiAoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkgewogICAgICAvKioqKioqLwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgewogICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgZ2V0OiBnZXR0ZXIKICAgICAgfSk7CiAgICAgIC8qKioqKiovCiAgICB9CiAgICAvKioqKioqLwoKICB9OwogIC8qKioqKiovCgogIC8qKioqKiovCiAgLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0cwoKICAvKioqKioqLwoKCiAgX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24gKGV4cG9ydHMpIHsKICAgIC8qKioqKiovCiAgICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7CiAgICAgIC8qKioqKiovCiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsKICAgICAgICB2YWx1ZTogJ01vZHVsZScKICAgICAgfSk7CiAgICAgIC8qKioqKiovCiAgICB9CiAgICAvKioqKioqLwoKCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7CiAgICAgIHZhbHVlOiB0cnVlCiAgICB9KTsKICAgIC8qKioqKiovCiAgfTsKICAvKioqKioqLwoKICAvKioqKioqLwogIC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdAoKICAvKioqKioqLwogIC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdAoKICAvKioqKioqLwogIC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBucwoKICAvKioqKioqLwogIC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdAoKICAvKioqKioqLwogIC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmUKCiAgLyoqKioqKi8KCgogIF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uICh2YWx1ZSwgbW9kZSkgewogICAgLyoqKioqKi8KICAgIGlmIChtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTsKICAgIC8qKioqKiovCgogICAgaWYgKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7CiAgICAvKioqKioqLwoKICAgIGlmIChtb2RlICYgNCAmJiBfdHlwZW9mKHZhbHVlKSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlOwogICAgLyoqKioqKi8KCiAgICB2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgLyoqKioqKi8KCiAgICBfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpOwogICAgLyoqKioqKi8KCgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgdmFsdWU6IHZhbHVlCiAgICB9KTsKICAgIC8qKioqKiovCgogICAgaWYgKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7CiAgICAgIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgcmV0dXJuIHZhbHVlW2tleV07CiAgICAgIH0uYmluZChudWxsLCBrZXkpKTsKICAgIH0KICAgIC8qKioqKiovCgogICAgcmV0dXJuIG5zOwogICAgLyoqKioqKi8KICB9OwogIC8qKioqKiovCgogIC8qKioqKiovCiAgLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXMKCiAgLyoqKioqKi8KCgogIF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uIChtb2R1bGUpIHsKICAgIC8qKioqKiovCiAgICB2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID8KICAgIC8qKioqKiovCiAgICBmdW5jdGlvbiBnZXREZWZhdWx0KCkgewogICAgICByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107CiAgICB9IDoKICAgIC8qKioqKiovCiAgICBmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgewogICAgICByZXR1cm4gbW9kdWxlOwogICAgfTsKICAgIC8qKioqKiovCgogICAgX193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpOwogICAgLyoqKioqKi8KCgogICAgcmV0dXJuIGdldHRlcjsKICAgIC8qKioqKiovCiAgfTsKICAvKioqKioqLwoKICAvKioqKioqLwogIC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbAoKICAvKioqKioqLwoKCiAgX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHkpIHsKICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7CiAgfTsKICAvKioqKioqLwoKICAvKioqKioqLwogIC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fCgogIC8qKioqKiovCgoKICBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSAiL2Rpc3QvIjsKICAvKioqKioqLwoKICAvKioqKioqLwoKICAvKioqKioqLwogIC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0cwoKICAvKioqKioqLwoKICByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA1OSk7CiAgLyoqKioqKi8KfSgKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKiovCnsKICAvKioqLwogIDA6CiAgLyoqKi8KICBmdW5jdGlvbiBfKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgInVzZSBzdHJpY3QiOwogICAgLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovCgogICAgX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sICJhIiwgZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gbm9ybWFsaXplQ29tcG9uZW50OwogICAgfSk7CiAgICAvKiBnbG9iYWxzIF9fVlVFX1NTUl9DT05URVhUX18gKi8KICAgIC8vIElNUE9SVEFOVDogRG8gTk9UIHVzZSBFUzIwMTUgZmVhdHVyZXMgaW4gdGhpcyBmaWxlIChleGNlcHQgZm9yIG1vZHVsZXMpLgogICAgLy8gVGhpcyBtb2R1bGUgaXMgYSBydW50aW1lIHV0aWxpdHkgZm9yIGNsZWFuZXIgY29tcG9uZW50IG1vZHVsZSBvdXRwdXQgYW5kIHdpbGwKICAgIC8vIGJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCB3ZWJwYWNrIHVzZXIgYnVuZGxlLgoKCiAgICBmdW5jdGlvbiBub3JtYWxpemVDb21wb25lbnQoc2NyaXB0RXhwb3J0cywgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMsIGZ1bmN0aW9uYWxUZW1wbGF0ZSwgaW5qZWN0U3R5bGVzLCBzY29wZUlkLCBtb2R1bGVJZGVudGlmaWVyLAogICAgLyogc2VydmVyIG9ubHkgKi8KICAgIHNoYWRvd01vZGUKICAgIC8qIHZ1ZS1jbGkgb25seSAqLwogICAgKSB7CiAgICAgIC8vIFZ1ZS5leHRlbmQgY29uc3RydWN0b3IgZXhwb3J0IGludGVyb3AKICAgICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygc2NyaXB0RXhwb3J0cyA9PT0gJ2Z1bmN0aW9uJyA/IHNjcmlwdEV4cG9ydHMub3B0aW9ucyA6IHNjcmlwdEV4cG9ydHM7IC8vIHJlbmRlciBmdW5jdGlvbnMKCiAgICAgIGlmIChyZW5kZXIpIHsKICAgICAgICBvcHRpb25zLnJlbmRlciA9IHJlbmRlcjsKICAgICAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IHN0YXRpY1JlbmRlckZuczsKICAgICAgICBvcHRpb25zLl9jb21waWxlZCA9IHRydWU7CiAgICAgIH0gLy8gZnVuY3Rpb25hbCB0ZW1wbGF0ZQoKCiAgICAgIGlmIChmdW5jdGlvbmFsVGVtcGxhdGUpIHsKICAgICAgICBvcHRpb25zLmZ1bmN0aW9uYWwgPSB0cnVlOwogICAgICB9IC8vIHNjb3BlZElkCgoKICAgICAgaWYgKHNjb3BlSWQpIHsKICAgICAgICBvcHRpb25zLl9zY29wZUlkID0gJ2RhdGEtdi0nICsgc2NvcGVJZDsKICAgICAgfQoKICAgICAgdmFyIGhvb2s7CgogICAgICBpZiAobW9kdWxlSWRlbnRpZmllcikgewogICAgICAgIC8vIHNlcnZlciBidWlsZAogICAgICAgIGhvb2sgPSBmdW5jdGlvbiBob29rKGNvbnRleHQpIHsKICAgICAgICAgIC8vIDIuMyBpbmplY3Rpb24KICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IC8vIGNhY2hlZCBjYWxsCiAgICAgICAgICB0aGlzLiR2bm9kZSAmJiB0aGlzLiR2bm9kZS5zc3JDb250ZXh0IHx8IC8vIHN0YXRlZnVsCiAgICAgICAgICB0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC4kdm5vZGUgJiYgdGhpcy5wYXJlbnQuJHZub2RlLnNzckNvbnRleHQ7IC8vIGZ1bmN0aW9uYWwKICAgICAgICAgIC8vIDIuMiB3aXRoIHJ1bkluTmV3Q29udGV4dDogdHJ1ZQoKICAgICAgICAgIGlmICghY29udGV4dCAmJiB0eXBlb2YgX19WVUVfU1NSX0NPTlRFWFRfXyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgY29udGV4dCA9IF9fVlVFX1NTUl9DT05URVhUX187CiAgICAgICAgICB9IC8vIGluamVjdCBjb21wb25lbnQgc3R5bGVzCgoKICAgICAgICAgIGlmIChpbmplY3RTdHlsZXMpIHsKICAgICAgICAgICAgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgY29udGV4dCk7CiAgICAgICAgICB9IC8vIHJlZ2lzdGVyIGNvbXBvbmVudCBtb2R1bGUgaWRlbnRpZmllciBmb3IgYXN5bmMgY2h1bmsgaW5mZXJyZW5jZQoKCiAgICAgICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cykgewogICAgICAgICAgICBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cy5hZGQobW9kdWxlSWRlbnRpZmllcik7CiAgICAgICAgICB9CiAgICAgICAgfTsgLy8gdXNlZCBieSBzc3IgaW4gY2FzZSBjb21wb25lbnQgaXMgY2FjaGVkIGFuZCBiZWZvcmVDcmVhdGUKICAgICAgICAvLyBuZXZlciBnZXRzIGNhbGxlZAoKCiAgICAgICAgb3B0aW9ucy5fc3NyUmVnaXN0ZXIgPSBob29rOwogICAgICB9IGVsc2UgaWYgKGluamVjdFN0eWxlcykgewogICAgICAgIGhvb2sgPSBzaGFkb3dNb2RlID8gZnVuY3Rpb24gKCkgewogICAgICAgICAgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgdGhpcy4kcm9vdC4kb3B0aW9ucy5zaGFkb3dSb290KTsKICAgICAgICB9IDogaW5qZWN0U3R5bGVzOwogICAgICB9CgogICAgICBpZiAoaG9vaykgewogICAgICAgIGlmIChvcHRpb25zLmZ1bmN0aW9uYWwpIHsKICAgICAgICAgIC8vIGZvciB0ZW1wbGF0ZS1vbmx5IGhvdC1yZWxvYWQgYmVjYXVzZSBpbiB0aGF0IGNhc2UgdGhlIHJlbmRlciBmbiBkb2Vzbid0CiAgICAgICAgICAvLyBnbyB0aHJvdWdoIHRoZSBub3JtYWxpemVyCiAgICAgICAgICBvcHRpb25zLl9pbmplY3RTdHlsZXMgPSBob29rOyAvLyByZWdpc3RlciBmb3IgZnVuY3Rpb2FsIGNvbXBvbmVudCBpbiB2dWUgZmlsZQoKICAgICAgICAgIHZhciBvcmlnaW5hbFJlbmRlciA9IG9wdGlvbnMucmVuZGVyOwoKICAgICAgICAgIG9wdGlvbnMucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyV2l0aFN0eWxlSW5qZWN0aW9uKGgsIGNvbnRleHQpIHsKICAgICAgICAgICAgaG9vay5jYWxsKGNvbnRleHQpOwogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxSZW5kZXIoaCwgY29udGV4dCk7CiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBpbmplY3QgY29tcG9uZW50IHJlZ2lzdHJhdGlvbiBhcyBiZWZvcmVDcmVhdGUgaG9vawogICAgICAgICAgdmFyIGV4aXN0aW5nID0gb3B0aW9ucy5iZWZvcmVDcmVhdGU7CiAgICAgICAgICBvcHRpb25zLmJlZm9yZUNyZWF0ZSA9IGV4aXN0aW5nID8gW10uY29uY2F0KGV4aXN0aW5nLCBob29rKSA6IFtob29rXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiB7CiAgICAgICAgZXhwb3J0czogc2NyaXB0RXhwb3J0cywKICAgICAgICBvcHRpb25zOiBvcHRpb25zCiAgICAgIH07CiAgICB9CiAgICAvKioqLwoKICB9LAoKICAvKioqLwogIDE0OgogIC8qKiovCiAgZnVuY3Rpb24gXyhtb2R1bGUsIGV4cG9ydHMpIHsKICAgIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiZWxlbWVudC11aS9saWIvc2Nyb2xsYmFyIik7CiAgICAvKioqLwogIH0sCgogIC8qKiovCiAgMTg6CiAgLyoqKi8KICBmdW5jdGlvbiBfKG1vZHVsZSwgZXhwb3J0cykgewogICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJlbGVtZW50LXVpL2xpYi9jaGVja2JveCIpOwogICAgLyoqKi8KICB9LAoKICAvKioqLwogIDIxOgogIC8qKiovCiAgZnVuY3Rpb24gXyhtb2R1bGUsIGV4cG9ydHMpIHsKICAgIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiZWxlbWVudC11aS9saWIvdXRpbHMvc2hhcmVkIik7CiAgICAvKioqLwogIH0sCgogIC8qKiovCiAgMjY6CiAgLyoqKi8KICBmdW5jdGlvbiBfKG1vZHVsZSwgZXhwb3J0cykgewogICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJiYWJlbC1oZWxwZXItdnVlLWpzeC1tZXJnZS1wcm9wcyIpOwogICAgLyoqKi8KICB9LAoKICAvKioqLwogIDM6CiAgLyoqKi8KICBmdW5jdGlvbiBfKG1vZHVsZSwgZXhwb3J0cykgewogICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJlbGVtZW50LXVpL2xpYi91dGlscy91dGlsIik7CiAgICAvKioqLwogIH0sCgogIC8qKiovCiAgMzE6CiAgLyoqKi8KICBmdW5jdGlvbiBfKG1vZHVsZSwgZXhwb3J0cykgewogICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJlbGVtZW50LXVpL2xpYi91dGlscy9zY3JvbGwtaW50by12aWV3Iik7CiAgICAvKioqLwogIH0sCgogIC8qKiovCiAgMzI6CiAgLyoqKi8KICBmdW5jdGlvbiBfKG1vZHVsZSwgZXhwb3J0cykgewogICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJlbGVtZW50LXVpL2xpYi91dGlscy9hcmlhLXV0aWxzIik7CiAgICAvKioqLwogIH0sCgogIC8qKiovCiAgNTE6CiAgLyoqKi8KICBmdW5jdGlvbiBfKG1vZHVsZSwgZXhwb3J0cykgewogICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJlbGVtZW50LXVpL2xpYi9yYWRpbyIpOwogICAgLyoqKi8KICB9LAoKICAvKioqLwogIDU5OgogIC8qKiovCiAgZnVuY3Rpb24gXyhtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICJ1c2Ugc3RyaWN0IjsKCiAgICBfX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7IC8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvdGVtcGxhdGVMb2FkZXIuanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLXBhbmVsLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zNDkzMjM0NiYKCgogICAgdmFyIGNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfdGVtcGxhdGVfaWRfMzQ5MzIzNDZfcmVuZGVyID0gZnVuY3Rpb24gY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zNDkzMjM0Nl9yZW5kZXIoKSB7CiAgICAgIHZhciBfdm0gPSB0aGlzOwoKICAgICAgdmFyIF9oID0gX3ZtLiRjcmVhdGVFbGVtZW50OwoKICAgICAgdmFyIF9jID0gX3ZtLl9zZWxmLl9jIHx8IF9oOwoKICAgICAgcmV0dXJuIF9jKCJkaXYiLCB7CiAgICAgICAgY2xhc3M6IFsiZWwtY2FzY2FkZXItcGFuZWwiLCBfdm0uYm9yZGVyICYmICJpcy1ib3JkZXJlZCJdLAogICAgICAgIG9uOiB7CiAgICAgICAgICBrZXlkb3duOiBfdm0uaGFuZGxlS2V5RG93bgogICAgICAgIH0KICAgICAgfSwgX3ZtLl9sKF92bS5tZW51cywgZnVuY3Rpb24gKG1lbnUsIGluZGV4KSB7CiAgICAgICAgcmV0dXJuIF9jKCJjYXNjYWRlci1tZW51IiwgewogICAgICAgICAga2V5OiBpbmRleCwKICAgICAgICAgIHJlZjogIm1lbnUiLAogICAgICAgICAgcmVmSW5Gb3I6IHRydWUsCiAgICAgICAgICBhdHRyczogewogICAgICAgICAgICBpbmRleDogaW5kZXgsCiAgICAgICAgICAgIG5vZGVzOiBtZW51CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0pLCAxKTsKICAgIH07CgogICAgdmFyIHN0YXRpY1JlbmRlckZucyA9IFtdOwogICAgY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zNDkzMjM0Nl9yZW5kZXIuX3dpdGhTdHJpcHBlZCA9IHRydWU7IC8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLXBhbmVsLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0zNDkzMjM0NiYKICAgIC8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImJhYmVsLWhlbHBlci12dWUtanN4LW1lcmdlLXByb3BzIgoKICAgIHZhciBleHRlcm5hbF9iYWJlbF9oZWxwZXJfdnVlX2pzeF9tZXJnZV9wcm9wc18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KTsKCiAgICB2YXIgZXh0ZXJuYWxfYmFiZWxfaGVscGVyX3Z1ZV9qc3hfbWVyZ2VfcHJvcHNfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZXh0ZXJuYWxfYmFiZWxfaGVscGVyX3Z1ZV9qc3hfbWVyZ2VfcHJvcHNfKTsgLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAiZWxlbWVudC11aS9saWIvc2Nyb2xsYmFyIgoKCiAgICB2YXIgc2Nyb2xsYmFyXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpOwoKICAgIHZhciBzY3JvbGxiYXJfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oc2Nyb2xsYmFyXyk7IC8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL2NoZWNrYm94IgoKCiAgICB2YXIgY2hlY2tib3hfID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7CgogICAgdmFyIGNoZWNrYm94X2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNoZWNrYm94Xyk7IC8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL3JhZGlvIgoKCiAgICB2YXIgcmFkaW9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MSk7CgogICAgdmFyIHJhZGlvX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHJhZGlvXyk7IC8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL3V0aWxzL3V0aWwiCgoKICAgIHZhciB1dGlsXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7IC8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9jYXNjYWRlci1ub2RlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKCgogICAgdmFyIHN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uIHN0b3BQcm9wYWdhdGlvbihlKSB7CiAgICAgIHJldHVybiBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgfTsKICAgIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8KCgogICAgdmFyIGNhc2NhZGVyX25vZGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSB7CiAgICAgIGluamVjdDogWydwYW5lbCddLAogICAgICBjb21wb25lbnRzOiB7CiAgICAgICAgRWxDaGVja2JveDogY2hlY2tib3hfZGVmYXVsdC5hLAogICAgICAgIEVsUmFkaW86IHJhZGlvX2RlZmF1bHQuYQogICAgICB9LAogICAgICBwcm9wczogewogICAgICAgIG5vZGU6IHsKICAgICAgICAgIHJlcXVpcmVkOiB0cnVlCiAgICAgICAgfSwKICAgICAgICBub2RlSWQ6IFN0cmluZwogICAgICB9LAogICAgICBjb21wdXRlZDogewogICAgICAgIGNvbmZpZzogZnVuY3Rpb24gY29uZmlnKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMucGFuZWwuY29uZmlnOwogICAgICAgIH0sCiAgICAgICAgaXNMZWFmOiBmdW5jdGlvbiBpc0xlYWYoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLmlzTGVhZjsKICAgICAgICB9LAogICAgICAgIGlzRGlzYWJsZWQ6IGZ1bmN0aW9uIGlzRGlzYWJsZWQoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLmlzRGlzYWJsZWQ7CiAgICAgICAgfSwKICAgICAgICBjaGVja2VkVmFsdWU6IGZ1bmN0aW9uIGNoZWNrZWRWYWx1ZSgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnBhbmVsLmNoZWNrZWRWYWx1ZTsKICAgICAgICB9LAogICAgICAgIGlzQ2hlY2tlZDogZnVuY3Rpb24gaXNDaGVja2VkKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5pc1NhbWVOb2RlKHRoaXMuY2hlY2tlZFZhbHVlKTsKICAgICAgICB9LAogICAgICAgIGluQWN0aXZlUGF0aDogZnVuY3Rpb24gaW5BY3RpdmVQYXRoKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuaXNJblBhdGgodGhpcy5wYW5lbC5hY3RpdmVQYXRoKTsKICAgICAgICB9LAogICAgICAgIGluQ2hlY2tlZFBhdGg6IGZ1bmN0aW9uIGluQ2hlY2tlZFBhdGgoKSB7CiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICAgIGlmICghdGhpcy5jb25maWcuY2hlY2tTdHJpY3RseSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgcmV0dXJuIHRoaXMucGFuZWwuY2hlY2tlZE5vZGVQYXRocy5zb21lKGZ1bmN0aW9uIChjaGVja2VkUGF0aCkgewogICAgICAgICAgICByZXR1cm4gX3RoaXMuaXNJblBhdGgoY2hlY2tlZFBhdGgpOwogICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLmdldFZhbHVlQnlPcHRpb24oKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIG1ldGhvZHM6IHsKICAgICAgICBoYW5kbGVFeHBhbmQ6IGZ1bmN0aW9uIGhhbmRsZUV4cGFuZCgpIHsKICAgICAgICAgIHZhciBfdGhpczIgPSB0aGlzOwoKICAgICAgICAgIHZhciBwYW5lbCA9IHRoaXMucGFuZWwsCiAgICAgICAgICAgICAgbm9kZSA9IHRoaXMubm9kZSwKICAgICAgICAgICAgICBpc0Rpc2FibGVkID0gdGhpcy5pc0Rpc2FibGVkLAogICAgICAgICAgICAgIGNvbmZpZyA9IHRoaXMuY29uZmlnOwogICAgICAgICAgdmFyIG11bHRpcGxlID0gY29uZmlnLm11bHRpcGxlLAogICAgICAgICAgICAgIGNoZWNrU3RyaWN0bHkgPSBjb25maWcuY2hlY2tTdHJpY3RseTsKICAgICAgICAgIGlmICghY2hlY2tTdHJpY3RseSAmJiBpc0Rpc2FibGVkIHx8IG5vZGUubG9hZGluZykgcmV0dXJuOwoKICAgICAgICAgIGlmIChjb25maWcubGF6eSAmJiAhbm9kZS5sb2FkZWQpIHsKICAgICAgICAgICAgcGFuZWwubGF6eUxvYWQobm9kZSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIC8vIGRvIG5vdCB1c2UgY2FjaGVkIGxlYWYgdmFsdWUgaGVyZSwgaW52b2tlIHRoaXMuaXNMZWFmIHRvIGdldCBuZXcgdmFsdWUuCiAgICAgICAgICAgICAgdmFyIGlzTGVhZiA9IF90aGlzMi5pc0xlYWY7CiAgICAgICAgICAgICAgaWYgKCFpc0xlYWYpIF90aGlzMi5oYW5kbGVFeHBhbmQoKTsKCiAgICAgICAgICAgICAgaWYgKG11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICAvLyBpZiBsZWFmIHN5bmMgY2hlY2tlZCBzdGF0ZSwgZWxzZSBjbGVhciBjaGVja2VkIHN0YXRlCiAgICAgICAgICAgICAgICB2YXIgY2hlY2tlZCA9IGlzTGVhZiA/IG5vZGUuY2hlY2tlZCA6IGZhbHNlOwoKICAgICAgICAgICAgICAgIF90aGlzMi5oYW5kbGVNdWx0aUNoZWNrQ2hhbmdlKGNoZWNrZWQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwYW5lbC5oYW5kbGVFeHBhbmQobm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBoYW5kbGVDaGVja0NoYW5nZTogZnVuY3Rpb24gaGFuZGxlQ2hlY2tDaGFuZ2UoKSB7CiAgICAgICAgICB2YXIgcGFuZWwgPSB0aGlzLnBhbmVsLAogICAgICAgICAgICAgIHZhbHVlID0gdGhpcy52YWx1ZSwKICAgICAgICAgICAgICBub2RlID0gdGhpcy5ub2RlOwogICAgICAgICAgcGFuZWwuaGFuZGxlQ2hlY2tDaGFuZ2UodmFsdWUpOwogICAgICAgICAgcGFuZWwuaGFuZGxlRXhwYW5kKG5vZGUpOwogICAgICAgIH0sCiAgICAgICAgaGFuZGxlTXVsdGlDaGVja0NoYW5nZTogZnVuY3Rpb24gaGFuZGxlTXVsdGlDaGVja0NoYW5nZShjaGVja2VkKSB7CiAgICAgICAgICB0aGlzLm5vZGUuZG9DaGVjayhjaGVja2VkKTsKICAgICAgICAgIHRoaXMucGFuZWwuY2FsY3VsYXRlTXVsdGlDaGVja2VkVmFsdWUoKTsKICAgICAgICB9LAogICAgICAgIGlzSW5QYXRoOiBmdW5jdGlvbiBpc0luUGF0aChwYXRoTm9kZXMpIHsKICAgICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlOwogICAgICAgICAgdmFyIHNlbGVjdGVkUGF0aE5vZGUgPSBwYXRoTm9kZXNbbm9kZS5sZXZlbCAtIDFdIHx8IHt9OwogICAgICAgICAgcmV0dXJuIHNlbGVjdGVkUGF0aE5vZGUudWlkID09PSBub2RlLnVpZDsKICAgICAgICB9LAogICAgICAgIHJlbmRlclByZWZpeDogZnVuY3Rpb24gcmVuZGVyUHJlZml4KGgpIHsKICAgICAgICAgIHZhciBpc0xlYWYgPSB0aGlzLmlzTGVhZiwKICAgICAgICAgICAgICBpc0NoZWNrZWQgPSB0aGlzLmlzQ2hlY2tlZCwKICAgICAgICAgICAgICBjb25maWcgPSB0aGlzLmNvbmZpZzsKICAgICAgICAgIHZhciBjaGVja1N0cmljdGx5ID0gY29uZmlnLmNoZWNrU3RyaWN0bHksCiAgICAgICAgICAgICAgbXVsdGlwbGUgPSBjb25maWcubXVsdGlwbGU7CgogICAgICAgICAgaWYgKG11bHRpcGxlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNoZWNrYm94KGgpOwogICAgICAgICAgfSBlbHNlIGlmIChjaGVja1N0cmljdGx5KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlclJhZGlvKGgpOwogICAgICAgICAgfSBlbHNlIGlmIChpc0xlYWYgJiYgaXNDaGVja2VkKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNoZWNrSWNvbihoKTsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9LAogICAgICAgIHJlbmRlclBvc3RmaXg6IGZ1bmN0aW9uIHJlbmRlclBvc3RmaXgoaCkgewogICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUsCiAgICAgICAgICAgICAgaXNMZWFmID0gdGhpcy5pc0xlYWY7CgogICAgICAgICAgaWYgKG5vZGUubG9hZGluZykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJMb2FkaW5nSWNvbihoKTsKICAgICAgICAgIH0gZWxzZSBpZiAoIWlzTGVhZikgewogICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJFeHBhbmRJY29uKGgpOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0sCiAgICAgICAgcmVuZGVyQ2hlY2tib3g6IGZ1bmN0aW9uIHJlbmRlckNoZWNrYm94KGgpIHsKICAgICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlLAogICAgICAgICAgICAgIGNvbmZpZyA9IHRoaXMuY29uZmlnLAogICAgICAgICAgICAgIGlzRGlzYWJsZWQgPSB0aGlzLmlzRGlzYWJsZWQ7CiAgICAgICAgICB2YXIgZXZlbnRzID0gewogICAgICAgICAgICBvbjogewogICAgICAgICAgICAgIGNoYW5nZTogdGhpcy5oYW5kbGVNdWx0aUNoZWNrQ2hhbmdlCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG5hdGl2ZU9uOiB7fQogICAgICAgICAgfTsKCiAgICAgICAgICBpZiAoY29uZmlnLmNoZWNrU3RyaWN0bHkpIHsKICAgICAgICAgICAgLy8gd2hlbiBldmVyeSBub2RlIGlzIHNlbGVjdGFibGUsIGNsaWNrIGV2ZW50IHNob3VsZCBub3QgdHJpZ2dlciBleHBhbmQgZXZlbnQuCiAgICAgICAgICAgIGV2ZW50cy5uYXRpdmVPbi5jbGljayA9IHN0b3BQcm9wYWdhdGlvbjsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gaCgnZWwtY2hlY2tib3gnLCBleHRlcm5hbF9iYWJlbF9oZWxwZXJfdnVlX2pzeF9tZXJnZV9wcm9wc19kZWZhdWx0KCkoW3sKICAgICAgICAgICAgYXR0cnM6IHsKICAgICAgICAgICAgICB2YWx1ZTogbm9kZS5jaGVja2VkLAogICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGU6IG5vZGUuaW5kZXRlcm1pbmF0ZSwKICAgICAgICAgICAgICBkaXNhYmxlZDogaXNEaXNhYmxlZAogICAgICAgICAgICB9CiAgICAgICAgICB9LCBldmVudHNdKSk7CiAgICAgICAgfSwKICAgICAgICByZW5kZXJSYWRpbzogZnVuY3Rpb24gcmVuZGVyUmFkaW8oaCkgewogICAgICAgICAgdmFyIGNoZWNrZWRWYWx1ZSA9IHRoaXMuY2hlY2tlZFZhbHVlLAogICAgICAgICAgICAgIHZhbHVlID0gdGhpcy52YWx1ZSwKICAgICAgICAgICAgICBpc0Rpc2FibGVkID0gdGhpcy5pc0Rpc2FibGVkOyAvLyB0byBrZWVwIHNhbWUgcmVmZXJlbmNlIGlmIHZhbHVlIGNhdXNlIHJhZGlvJ3MgY2hlY2tlZCBzdGF0ZSBpcyBjYWxjdWxhdGVkIGJ5IHJlZmVyZW5jZSBjb21wYXJpc2lvbjsKCiAgICAgICAgICBpZiAoT2JqZWN0KHV0aWxfWyJpc0VxdWFsIl0pKHZhbHVlLCBjaGVja2VkVmFsdWUpKSB7CiAgICAgICAgICAgIHZhbHVlID0gY2hlY2tlZFZhbHVlOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiBoKCdlbC1yYWRpbycsIHsKICAgICAgICAgICAgYXR0cnM6IHsKICAgICAgICAgICAgICB2YWx1ZTogY2hlY2tlZFZhbHVlLAogICAgICAgICAgICAgIGxhYmVsOiB2YWx1ZSwKICAgICAgICAgICAgICBkaXNhYmxlZDogaXNEaXNhYmxlZAogICAgICAgICAgICB9LAogICAgICAgICAgICBvbjogewogICAgICAgICAgICAgICdjaGFuZ2UnOiB0aGlzLmhhbmRsZUNoZWNrQ2hhbmdlCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG5hdGl2ZU9uOiB7CiAgICAgICAgICAgICAgJ2NsaWNrJzogc3RvcFByb3BhZ2F0aW9uCiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIFtoKCdzcGFuJyldKTsKICAgICAgICB9LAogICAgICAgIHJlbmRlckNoZWNrSWNvbjogZnVuY3Rpb24gcmVuZGVyQ2hlY2tJY29uKGgpIHsKICAgICAgICAgIHJldHVybiBoKCdpJywgewogICAgICAgICAgICAnY2xhc3MnOiAnZWwtaWNvbi1jaGVjayBlbC1jYXNjYWRlci1ub2RlX19wcmVmaXgnCiAgICAgICAgICB9KTsKICAgICAgICB9LAogICAgICAgIHJlbmRlckxvYWRpbmdJY29uOiBmdW5jdGlvbiByZW5kZXJMb2FkaW5nSWNvbihoKSB7CiAgICAgICAgICByZXR1cm4gaCgnaScsIHsKICAgICAgICAgICAgJ2NsYXNzJzogJ2VsLWljb24tbG9hZGluZyBlbC1jYXNjYWRlci1ub2RlX19wb3N0Zml4JwogICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICByZW5kZXJFeHBhbmRJY29uOiBmdW5jdGlvbiByZW5kZXJFeHBhbmRJY29uKGgpIHsKICAgICAgICAgIHJldHVybiBoKCdpJywgewogICAgICAgICAgICAnY2xhc3MnOiAnZWwtaWNvbi1hcnJvdy1yaWdodCBlbC1jYXNjYWRlci1ub2RlX19wb3N0Zml4JwogICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICByZW5kZXJDb250ZW50OiBmdW5jdGlvbiByZW5kZXJDb250ZW50KGgpIHsKICAgICAgICAgIHZhciBwYW5lbCA9IHRoaXMucGFuZWwsCiAgICAgICAgICAgICAgbm9kZSA9IHRoaXMubm9kZTsKICAgICAgICAgIHZhciByZW5kZXIgPSBwYW5lbC5yZW5kZXJMYWJlbEZuOwogICAgICAgICAgdmFyIHZub2RlID0gcmVuZGVyID8gcmVuZGVyKHsKICAgICAgICAgICAgbm9kZTogbm9kZSwKICAgICAgICAgICAgZGF0YTogbm9kZS5kYXRhCiAgICAgICAgICB9KSA6IG51bGw7CiAgICAgICAgICByZXR1cm4gaCgnc3BhbicsIHsKICAgICAgICAgICAgJ2NsYXNzJzogJ2VsLWNhc2NhZGVyLW5vZGVfX2xhYmVsJwogICAgICAgICAgfSwgW3Zub2RlIHx8IG5vZGUubGFiZWxdKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKGgpIHsKICAgICAgICB2YXIgX3RoaXMzID0gdGhpczsKCiAgICAgICAgdmFyIGluQWN0aXZlUGF0aCA9IHRoaXMuaW5BY3RpdmVQYXRoLAogICAgICAgICAgICBpbkNoZWNrZWRQYXRoID0gdGhpcy5pbkNoZWNrZWRQYXRoLAogICAgICAgICAgICBpc0NoZWNrZWQgPSB0aGlzLmlzQ2hlY2tlZCwKICAgICAgICAgICAgaXNMZWFmID0gdGhpcy5pc0xlYWYsCiAgICAgICAgICAgIGlzRGlzYWJsZWQgPSB0aGlzLmlzRGlzYWJsZWQsCiAgICAgICAgICAgIGNvbmZpZyA9IHRoaXMuY29uZmlnLAogICAgICAgICAgICBub2RlSWQgPSB0aGlzLm5vZGVJZDsKICAgICAgICB2YXIgZXhwYW5kVHJpZ2dlciA9IGNvbmZpZy5leHBhbmRUcmlnZ2VyLAogICAgICAgICAgICBjaGVja1N0cmljdGx5ID0gY29uZmlnLmNoZWNrU3RyaWN0bHksCiAgICAgICAgICAgIG11bHRpcGxlID0gY29uZmlnLm11bHRpcGxlOwogICAgICAgIHZhciBkaXNhYmxlZCA9ICFjaGVja1N0cmljdGx5ICYmIGlzRGlzYWJsZWQ7CiAgICAgICAgdmFyIGV2ZW50cyA9IHsKICAgICAgICAgIG9uOiB7fQogICAgICAgIH07CgogICAgICAgIGlmIChleHBhbmRUcmlnZ2VyID09PSAnY2xpY2snKSB7CiAgICAgICAgICBldmVudHMub24uY2xpY2sgPSB0aGlzLmhhbmRsZUV4cGFuZDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZXZlbnRzLm9uLm1vdXNlZW50ZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBfdGhpczMuaGFuZGxlRXhwYW5kKCk7CgogICAgICAgICAgICBfdGhpczMuJGVtaXQoJ2V4cGFuZCcsIGUpOwogICAgICAgICAgfTsKCiAgICAgICAgICBldmVudHMub24uZm9jdXMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBfdGhpczMuaGFuZGxlRXhwYW5kKCk7CgogICAgICAgICAgICBfdGhpczMuJGVtaXQoJ2V4cGFuZCcsIGUpOwogICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGlmIChpc0xlYWYgJiYgIWlzRGlzYWJsZWQgJiYgIWNoZWNrU3RyaWN0bHkgJiYgIW11bHRpcGxlKSB7CiAgICAgICAgICBldmVudHMub24uY2xpY2sgPSB0aGlzLmhhbmRsZUNoZWNrQ2hhbmdlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGgoJ2xpJywgZXh0ZXJuYWxfYmFiZWxfaGVscGVyX3Z1ZV9qc3hfbWVyZ2VfcHJvcHNfZGVmYXVsdCgpKFt7CiAgICAgICAgICBhdHRyczogewogICAgICAgICAgICByb2xlOiAnbWVudWl0ZW0nLAogICAgICAgICAgICBpZDogbm9kZUlkLAogICAgICAgICAgICAnYXJpYS1leHBhbmRlZCc6IGluQWN0aXZlUGF0aCwKICAgICAgICAgICAgdGFiaW5kZXg6IGRpc2FibGVkID8gbnVsbCA6IC0xCiAgICAgICAgICB9LAogICAgICAgICAgJ2NsYXNzJzogewogICAgICAgICAgICAnZWwtY2FzY2FkZXItbm9kZSc6IHRydWUsCiAgICAgICAgICAgICdpcy1zZWxlY3RhYmxlJzogY2hlY2tTdHJpY3RseSwKICAgICAgICAgICAgJ2luLWFjdGl2ZS1wYXRoJzogaW5BY3RpdmVQYXRoLAogICAgICAgICAgICAnaW4tY2hlY2tlZC1wYXRoJzogaW5DaGVja2VkUGF0aCwKICAgICAgICAgICAgJ2lzLWFjdGl2ZSc6IGlzQ2hlY2tlZCwKICAgICAgICAgICAgJ2lzLWRpc2FibGVkJzogZGlzYWJsZWQKICAgICAgICAgIH0KICAgICAgICB9LCBldmVudHNdKSwgW3RoaXMucmVuZGVyUHJlZml4KGgpLCB0aGlzLnJlbmRlckNvbnRlbnQoaCksIHRoaXMucmVuZGVyUG9zdGZpeChoKV0pOwogICAgICB9CiAgICB9OyAvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9jYXNjYWRlci1ub2RlLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKCiAgICAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovCgogICAgdmFyIHNyY19jYXNjYWRlcl9ub2RldnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gY2FzY2FkZXJfbm9kZXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsgLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanMKCiAgICB2YXIgY29tcG9uZW50Tm9ybWFsaXplciA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7IC8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLW5vZGUudnVlCgoKICAgIHZhciBjYXNjYWRlcl9ub2RlX3JlbmRlciwgY2FzY2FkZXJfbm9kZV9zdGF0aWNSZW5kZXJGbnM7CiAgICAvKiBub3JtYWxpemUgY29tcG9uZW50ICovCgogICAgdmFyIGNvbXBvbmVudCA9IE9iamVjdChjb21wb25lbnROb3JtYWxpemVyWyJhIgogICAgLyogZGVmYXVsdCAqLwogICAgXSkoc3JjX2Nhc2NhZGVyX25vZGV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sIGNhc2NhZGVyX25vZGVfcmVuZGVyLCBjYXNjYWRlcl9ub2RlX3N0YXRpY1JlbmRlckZucywgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpOwogICAgLyogaG90IHJlbG9hZCAqLwoKICAgIGlmIChmYWxzZSkgewogICAgICB2YXIgYXBpOwogICAgfQoKICAgIGNvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9ICJwYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItbm9kZS52dWUiOwogICAgLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLwoKICAgIHZhciBjYXNjYWRlcl9ub2RlID0gY29tcG9uZW50LmV4cG9ydHM7IC8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL21peGlucy9sb2NhbGUiCgogICAgdmFyIGxvY2FsZV8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwoKICAgIHZhciBsb2NhbGVfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4obG9jYWxlXyk7IC8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9jYXNjYWRlci1tZW51LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKCiAgICAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovCgoKICAgIHZhciBjYXNjYWRlcl9tZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gewogICAgICBuYW1lOiAnRWxDYXNjYWRlck1lbnUnLAogICAgICBtaXhpbnM6IFtsb2NhbGVfZGVmYXVsdC5hXSwKICAgICAgaW5qZWN0OiBbJ3BhbmVsJ10sCiAgICAgIGNvbXBvbmVudHM6IHsKICAgICAgICBFbFNjcm9sbGJhcjogc2Nyb2xsYmFyX2RlZmF1bHQuYSwKICAgICAgICBDYXNjYWRlck5vZGU6IGNhc2NhZGVyX25vZGUKICAgICAgfSwKICAgICAgcHJvcHM6IHsKICAgICAgICBub2RlczogewogICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICByZXF1aXJlZDogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgaW5kZXg6IE51bWJlcgogICAgICB9LAogICAgICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBhY3RpdmVOb2RlOiBudWxsLAogICAgICAgICAgaG92ZXJUaW1lcjogbnVsbCwKICAgICAgICAgIGlkOiBPYmplY3QodXRpbF9bImdlbmVyYXRlSWQiXSkoKQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIGNvbXB1dGVkOiB7CiAgICAgICAgaXNFbXB0eTogZnVuY3Rpb24gaXNFbXB0eSgpIHsKICAgICAgICAgIHJldHVybiAhdGhpcy5ub2Rlcy5sZW5ndGg7CiAgICAgICAgfSwKICAgICAgICBtZW51SWQ6IGZ1bmN0aW9uIG1lbnVJZCgpIHsKICAgICAgICAgIHJldHVybiAnY2FzY2FkZXItbWVudS0nICsgdGhpcy5pZCArICctJyArIHRoaXMuaW5kZXg7CiAgICAgICAgfQogICAgICB9LAogICAgICBtZXRob2RzOiB7CiAgICAgICAgaGFuZGxlRXhwYW5kOiBmdW5jdGlvbiBoYW5kbGVFeHBhbmQoZSkgewogICAgICAgICAgdGhpcy5hY3RpdmVOb2RlID0gZS50YXJnZXQ7CiAgICAgICAgfSwKICAgICAgICBoYW5kbGVNb3VzZU1vdmU6IGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZShlKSB7CiAgICAgICAgICB2YXIgYWN0aXZlTm9kZSA9IHRoaXMuYWN0aXZlTm9kZSwKICAgICAgICAgICAgICBob3ZlclRpbWVyID0gdGhpcy5ob3ZlclRpbWVyOwogICAgICAgICAgdmFyIGhvdmVyWm9uZSA9IHRoaXMuJHJlZnMuaG92ZXJab25lOwogICAgICAgICAgaWYgKCFhY3RpdmVOb2RlIHx8ICFob3ZlclpvbmUpIHJldHVybjsKCiAgICAgICAgICBpZiAoYWN0aXZlTm9kZS5jb250YWlucyhlLnRhcmdldCkpIHsKICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpOwoKICAgICAgICAgICAgdmFyIF8kZWwkZ2V0Qm91bmRpbmdDbGllbiA9IHRoaXMuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAogICAgICAgICAgICAgICAgbGVmdCA9IF8kZWwkZ2V0Qm91bmRpbmdDbGllbi5sZWZ0OwoKICAgICAgICAgICAgdmFyIHN0YXJ0WCA9IGUuY2xpZW50WCAtIGxlZnQ7CiAgICAgICAgICAgIHZhciBfJGVsID0gdGhpcy4kZWwsCiAgICAgICAgICAgICAgICBvZmZzZXRXaWR0aCA9IF8kZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgICBvZmZzZXRIZWlnaHQgPSBfJGVsLm9mZnNldEhlaWdodDsKICAgICAgICAgICAgdmFyIHRvcCA9IGFjdGl2ZU5vZGUub2Zmc2V0VG9wOwogICAgICAgICAgICB2YXIgYm90dG9tID0gdG9wICsgYWN0aXZlTm9kZS5vZmZzZXRIZWlnaHQ7CiAgICAgICAgICAgIGhvdmVyWm9uZS5pbm5lckhUTUwgPSAnXG4gICAgICAgICAgPHBhdGggc3R5bGU9InBvaW50ZXItZXZlbnRzOiBhdXRvOyIgZmlsbD0idHJhbnNwYXJlbnQiIGQ9Ik0nICsgc3RhcnRYICsgJyAnICsgdG9wICsgJyBMJyArIG9mZnNldFdpZHRoICsgJyAwIFYnICsgdG9wICsgJyBaIiAvPlxuICAgICAgICAgIDxwYXRoIHN0eWxlPSJwb2ludGVyLWV2ZW50czogYXV0bzsiIGZpbGw9InRyYW5zcGFyZW50IiBkPSJNJyArIHN0YXJ0WCArICcgJyArIGJvdHRvbSArICcgTCcgKyBvZmZzZXRXaWR0aCArICcgJyArIG9mZnNldEhlaWdodCArICcgVicgKyBib3R0b20gKyAnIFoiIC8+XG4gICAgICAgICc7CiAgICAgICAgICB9IGVsc2UgaWYgKCFob3ZlclRpbWVyKSB7CiAgICAgICAgICAgIHRoaXMuaG92ZXJUaW1lciA9IHNldFRpbWVvdXQodGhpcy5jbGVhckhvdmVyWm9uZSwgdGhpcy5wYW5lbC5jb25maWcuaG92ZXJUaHJlc2hvbGQpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY2xlYXJIb3ZlclpvbmU6IGZ1bmN0aW9uIGNsZWFySG92ZXJab25lKCkgewogICAgICAgICAgdmFyIGhvdmVyWm9uZSA9IHRoaXMuJHJlZnMuaG92ZXJab25lOwogICAgICAgICAgaWYgKCFob3ZlclpvbmUpIHJldHVybjsKICAgICAgICAgIGhvdmVyWm9uZS5pbm5lckhUTUwgPSAnJzsKICAgICAgICB9LAogICAgICAgIHJlbmRlckVtcHR5VGV4dDogZnVuY3Rpb24gcmVuZGVyRW1wdHlUZXh0KGgpIHsKICAgICAgICAgIHJldHVybiBoKCdkaXYnLCB7CiAgICAgICAgICAgICdjbGFzcyc6ICdlbC1jYXNjYWRlci1tZW51X19lbXB0eS10ZXh0JwogICAgICAgICAgfSwgW3RoaXMudCgnZWwuY2FzY2FkZXIubm9EYXRhJyldKTsKICAgICAgICB9LAogICAgICAgIHJlbmRlck5vZGVMaXN0OiBmdW5jdGlvbiByZW5kZXJOb2RlTGlzdChoKSB7CiAgICAgICAgICB2YXIgbWVudUlkID0gdGhpcy5tZW51SWQ7CiAgICAgICAgICB2YXIgaXNIb3Zlck1lbnUgPSB0aGlzLnBhbmVsLmlzSG92ZXJNZW51OwogICAgICAgICAgdmFyIGV2ZW50cyA9IHsKICAgICAgICAgICAgb246IHt9CiAgICAgICAgICB9OwoKICAgICAgICAgIGlmIChpc0hvdmVyTWVudSkgewogICAgICAgICAgICBldmVudHMub24uZXhwYW5kID0gdGhpcy5oYW5kbGVFeHBhbmQ7CiAgICAgICAgICB9CgogICAgICAgICAgdmFyIG5vZGVzID0gdGhpcy5ub2Rlcy5tYXAoZnVuY3Rpb24gKG5vZGUsIGluZGV4KSB7CiAgICAgICAgICAgIHZhciBoYXNDaGlsZHJlbiA9IG5vZGUuaGFzQ2hpbGRyZW47CiAgICAgICAgICAgIHJldHVybiBoKCdjYXNjYWRlci1ub2RlJywgZXh0ZXJuYWxfYmFiZWxfaGVscGVyX3Z1ZV9qc3hfbWVyZ2VfcHJvcHNfZGVmYXVsdCgpKFt7CiAgICAgICAgICAgICAga2V5OiBub2RlLnVpZCwKICAgICAgICAgICAgICBhdHRyczogewogICAgICAgICAgICAgICAgbm9kZTogbm9kZSwKICAgICAgICAgICAgICAgICdub2RlLWlkJzogbWVudUlkICsgJy0nICsgaW5kZXgsCiAgICAgICAgICAgICAgICAnYXJpYS1oYXNwb3B1cCc6IGhhc0NoaWxkcmVuLAogICAgICAgICAgICAgICAgJ2FyaWEtb3ducyc6IGhhc0NoaWxkcmVuID8gbWVudUlkIDogbnVsbAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgZXZlbnRzXSkpOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gW10uY29uY2F0KG5vZGVzLCBbaXNIb3Zlck1lbnUgPyBoKCdzdmcnLCB7CiAgICAgICAgICAgIHJlZjogJ2hvdmVyWm9uZScsCiAgICAgICAgICAgICdjbGFzcyc6ICdlbC1jYXNjYWRlci1tZW51X19ob3Zlci16b25lJwogICAgICAgICAgfSkgOiBudWxsXSk7CiAgICAgICAgfQogICAgICB9LAogICAgICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihoKSB7CiAgICAgICAgdmFyIGlzRW1wdHkgPSB0aGlzLmlzRW1wdHksCiAgICAgICAgICAgIG1lbnVJZCA9IHRoaXMubWVudUlkOwogICAgICAgIHZhciBldmVudHMgPSB7CiAgICAgICAgICBuYXRpdmVPbjoge30KICAgICAgICB9OyAvLyBvcHRpbWl6ZSBob3ZlciB0byBleHBhbmQgZXhwZXJpZW5jZSAoIzgwMTApCgogICAgICAgIGlmICh0aGlzLnBhbmVsLmlzSG92ZXJNZW51KSB7CiAgICAgICAgICBldmVudHMubmF0aXZlT24ubW91c2Vtb3ZlID0gdGhpcy5oYW5kbGVNb3VzZU1vdmU7IC8vIGV2ZW50cy5uYXRpdmVPbi5tb3VzZWxlYXZlID0gdGhpcy5jbGVhckhvdmVyWm9uZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBoKCdlbC1zY3JvbGxiYXInLCBleHRlcm5hbF9iYWJlbF9oZWxwZXJfdnVlX2pzeF9tZXJnZV9wcm9wc19kZWZhdWx0KCkoW3sKICAgICAgICAgIGF0dHJzOiB7CiAgICAgICAgICAgIHRhZzogJ3VsJywKICAgICAgICAgICAgcm9sZTogJ21lbnUnLAogICAgICAgICAgICBpZDogbWVudUlkLAogICAgICAgICAgICAnd3JhcC1jbGFzcyc6ICdlbC1jYXNjYWRlci1tZW51X193cmFwJywKICAgICAgICAgICAgJ3ZpZXctY2xhc3MnOiB7CiAgICAgICAgICAgICAgJ2VsLWNhc2NhZGVyLW1lbnVfX2xpc3QnOiB0cnVlLAogICAgICAgICAgICAgICdpcy1lbXB0eSc6IGlzRW1wdHkKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICdjbGFzcyc6ICdlbC1jYXNjYWRlci1tZW51JwogICAgICAgIH0sIGV2ZW50c10pLCBbaXNFbXB0eSA/IHRoaXMucmVuZGVyRW1wdHlUZXh0KGgpIDogdGhpcy5yZW5kZXJOb2RlTGlzdChoKV0pOwogICAgICB9CiAgICB9OyAvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9jYXNjYWRlci1tZW51LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyYKCiAgICAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovCgogICAgdmFyIHNyY19jYXNjYWRlcl9tZW51dnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gY2FzY2FkZXJfbWVudXZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsgLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItbWVudS52dWUKCiAgICB2YXIgY2FzY2FkZXJfbWVudV9yZW5kZXIsIGNhc2NhZGVyX21lbnVfc3RhdGljUmVuZGVyRm5zOwogICAgLyogbm9ybWFsaXplIGNvbXBvbmVudCAqLwoKICAgIHZhciBjYXNjYWRlcl9tZW51X2NvbXBvbmVudCA9IE9iamVjdChjb21wb25lbnROb3JtYWxpemVyWyJhIgogICAgLyogZGVmYXVsdCAqLwogICAgXSkoc3JjX2Nhc2NhZGVyX21lbnV2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18sIGNhc2NhZGVyX21lbnVfcmVuZGVyLCBjYXNjYWRlcl9tZW51X3N0YXRpY1JlbmRlckZucywgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpOwogICAgLyogaG90IHJlbG9hZCAqLwoKICAgIGlmIChmYWxzZSkgewogICAgICB2YXIgY2FzY2FkZXJfbWVudV9hcGk7CiAgICB9CgogICAgY2FzY2FkZXJfbWVudV9jb21wb25lbnQub3B0aW9ucy5fX2ZpbGUgPSAicGFja2FnZXMvY2FzY2FkZXItcGFuZWwvc3JjL2Nhc2NhZGVyLW1lbnUudnVlIjsKICAgIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8KCiAgICB2YXIgY2FzY2FkZXJfbWVudSA9IGNhc2NhZGVyX21lbnVfY29tcG9uZW50LmV4cG9ydHM7IC8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgImVsZW1lbnQtdWkvbGliL3V0aWxzL3NoYXJlZCIKCiAgICB2YXIgc2hhcmVkXyA9IF9fd2VicGFja19yZXF1aXJlX18oMjEpOyAvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9ub2RlLmpzCgoKICAgIHZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07CiAgICAgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICAgICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7CiAgICAgICAgICBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7CiAgICAgICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsKICAgICAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsKICAgICAgICByZXR1cm4gQ29uc3RydWN0b3I7CiAgICAgIH07CiAgICB9KCk7CgogICAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgICB9CiAgICB9CgogICAgdmFyIHVpZCA9IDA7CgogICAgdmFyIG5vZGVfTm9kZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgZnVuY3Rpb24gTm9kZShkYXRhLCBjb25maWcsIHBhcmVudE5vZGUpIHsKICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTm9kZSk7CgogICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnROb2RlIHx8IG51bGw7CiAgICAgICAgdGhpcy5sZXZlbCA9ICF0aGlzLnBhcmVudCA/IDEgOiB0aGlzLnBhcmVudC5sZXZlbCArIDE7CiAgICAgICAgdGhpcy51aWQgPSB1aWQrKzsKICAgICAgICB0aGlzLmluaXRTdGF0ZSgpOwogICAgICAgIHRoaXMuaW5pdENoaWxkcmVuKCk7CiAgICAgIH0KCiAgICAgIE5vZGUucHJvdG90eXBlLmluaXRTdGF0ZSA9IGZ1bmN0aW9uIGluaXRTdGF0ZSgpIHsKICAgICAgICB2YXIgX2NvbmZpZyA9IHRoaXMuY29uZmlnLAogICAgICAgICAgICB2YWx1ZUtleSA9IF9jb25maWcudmFsdWUsCiAgICAgICAgICAgIGxhYmVsS2V5ID0gX2NvbmZpZy5sYWJlbDsKICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5kYXRhW3ZhbHVlS2V5XTsKICAgICAgICB0aGlzLmxhYmVsID0gdGhpcy5kYXRhW2xhYmVsS2V5XTsKICAgICAgICB0aGlzLnBhdGhOb2RlcyA9IHRoaXMuY2FsY3VsYXRlUGF0aE5vZGVzKCk7CiAgICAgICAgdGhpcy5wYXRoID0gdGhpcy5wYXRoTm9kZXMubWFwKGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICByZXR1cm4gbm9kZS52YWx1ZTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLnBhdGhMYWJlbHMgPSB0aGlzLnBhdGhOb2Rlcy5tYXAoZnVuY3Rpb24gKG5vZGUpIHsKICAgICAgICAgIHJldHVybiBub2RlLmxhYmVsOwogICAgICAgIH0pOyAvLyBsYXp5IGxvYWQKCiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTsKICAgICAgfTsKCiAgICAgIE5vZGUucHJvdG90eXBlLmluaXRDaGlsZHJlbiA9IGZ1bmN0aW9uIGluaXRDaGlsZHJlbigpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5jb25maWc7CiAgICAgICAgdmFyIGNoaWxkcmVuS2V5ID0gY29uZmlnLmNoaWxkcmVuOwogICAgICAgIHZhciBjaGlsZHJlbkRhdGEgPSB0aGlzLmRhdGFbY2hpbGRyZW5LZXldOwogICAgICAgIHRoaXMuaGFzQ2hpbGRyZW4gPSBBcnJheS5pc0FycmF5KGNoaWxkcmVuRGF0YSk7CiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IChjaGlsZHJlbkRhdGEgfHwgW10pLm1hcChmdW5jdGlvbiAoY2hpbGQpIHsKICAgICAgICAgIHJldHVybiBuZXcgTm9kZShjaGlsZCwgY29uZmlnLCBfdGhpcyk7CiAgICAgICAgfSk7CiAgICAgIH07CgogICAgICBOb2RlLnByb3RvdHlwZS5jYWxjdWxhdGVQYXRoTm9kZXMgPSBmdW5jdGlvbiBjYWxjdWxhdGVQYXRoTm9kZXMoKSB7CiAgICAgICAgdmFyIG5vZGVzID0gW3RoaXNdOwogICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDsKCiAgICAgICAgd2hpbGUgKHBhcmVudCkgewogICAgICAgICAgbm9kZXMudW5zaGlmdChwYXJlbnQpOwogICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBub2RlczsKICAgICAgfTsKCiAgICAgIE5vZGUucHJvdG90eXBlLmdldFBhdGggPSBmdW5jdGlvbiBnZXRQYXRoKCkgewogICAgICAgIHJldHVybiB0aGlzLnBhdGg7CiAgICAgIH07CgogICAgICBOb2RlLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uIGdldFZhbHVlKCkgewogICAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgICB9OwoKICAgICAgTm9kZS5wcm90b3R5cGUuZ2V0VmFsdWVCeU9wdGlvbiA9IGZ1bmN0aW9uIGdldFZhbHVlQnlPcHRpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmVtaXRQYXRoID8gdGhpcy5nZXRQYXRoKCkgOiB0aGlzLmdldFZhbHVlKCk7CiAgICAgIH07CgogICAgICBOb2RlLnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24gZ2V0VGV4dChhbGxMZXZlbHMsIHNlcGFyYXRvcikgewogICAgICAgIHJldHVybiBhbGxMZXZlbHMgPyB0aGlzLnBhdGhMYWJlbHMuam9pbihzZXBhcmF0b3IpIDogdGhpcy5sYWJlbDsKICAgICAgfTsKCiAgICAgIE5vZGUucHJvdG90eXBlLmlzU2FtZU5vZGUgPSBmdW5jdGlvbiBpc1NhbWVOb2RlKGNoZWNrZWRWYWx1ZSkgewogICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWVCeU9wdGlvbigpOwogICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5tdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KGNoZWNrZWRWYWx1ZSkgPyBjaGVja2VkVmFsdWUuc29tZShmdW5jdGlvbiAodmFsKSB7CiAgICAgICAgICByZXR1cm4gT2JqZWN0KHV0aWxfWyJpc0VxdWFsIl0pKHZhbCwgdmFsdWUpOwogICAgICAgIH0pIDogT2JqZWN0KHV0aWxfWyJpc0VxdWFsIl0pKGNoZWNrZWRWYWx1ZSwgdmFsdWUpOwogICAgICB9OwoKICAgICAgTm9kZS5wcm90b3R5cGUuYnJvYWRjYXN0ID0gZnVuY3Rpb24gYnJvYWRjYXN0KGV2ZW50KSB7CiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CiAgICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTsKICAgICAgICB9CgogICAgICAgIHZhciBoYW5kbGVyTmFtZSA9ICdvblBhcmVudCcgKyBPYmplY3QodXRpbF9bImNhcGl0YWxpemUiXSkoZXZlbnQpOwogICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHsKICAgICAgICAgIGlmIChjaGlsZCkgewogICAgICAgICAgICAvLyBib3R0b20gdXAKICAgICAgICAgICAgY2hpbGQuYnJvYWRjYXN0LmFwcGx5KGNoaWxkLCBbZXZlbnRdLmNvbmNhdChhcmdzKSk7CiAgICAgICAgICAgIGNoaWxkW2hhbmRsZXJOYW1lXSAmJiBjaGlsZFtoYW5kbGVyTmFtZV0uYXBwbHkoY2hpbGQsIGFyZ3MpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9OwoKICAgICAgTm9kZS5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQoZXZlbnQpIHsKICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7CiAgICAgICAgdmFyIGhhbmRsZXJOYW1lID0gJ29uQ2hpbGQnICsgT2JqZWN0KHV0aWxfWyJjYXBpdGFsaXplIl0pKGV2ZW50KTsKCiAgICAgICAgaWYgKHBhcmVudCkgewogICAgICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykgewogICAgICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdOwogICAgICAgICAgfQoKICAgICAgICAgIHBhcmVudFtoYW5kbGVyTmFtZV0gJiYgcGFyZW50W2hhbmRsZXJOYW1lXS5hcHBseShwYXJlbnQsIGFyZ3MpOwogICAgICAgICAgcGFyZW50LmVtaXQuYXBwbHkocGFyZW50LCBbZXZlbnRdLmNvbmNhdChhcmdzKSk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgTm9kZS5wcm90b3R5cGUub25QYXJlbnRDaGVjayA9IGZ1bmN0aW9uIG9uUGFyZW50Q2hlY2soY2hlY2tlZCkgewogICAgICAgIGlmICghdGhpcy5pc0Rpc2FibGVkKSB7CiAgICAgICAgICB0aGlzLnNldENoZWNrU3RhdGUoY2hlY2tlZCk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgTm9kZS5wcm90b3R5cGUub25DaGlsZENoZWNrID0gZnVuY3Rpb24gb25DaGlsZENoZWNrKCkgewogICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47CiAgICAgICAgdmFyIHZhbGlkQ2hpbGRyZW4gPSBjaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24gKGNoaWxkKSB7CiAgICAgICAgICByZXR1cm4gIWNoaWxkLmlzRGlzYWJsZWQ7CiAgICAgICAgfSk7CiAgICAgICAgdmFyIGNoZWNrZWQgPSB2YWxpZENoaWxkcmVuLmxlbmd0aCA/IHZhbGlkQ2hpbGRyZW4uZXZlcnkoZnVuY3Rpb24gKGNoaWxkKSB7CiAgICAgICAgICByZXR1cm4gY2hpbGQuY2hlY2tlZDsKICAgICAgICB9KSA6IGZhbHNlOwogICAgICAgIHRoaXMuc2V0Q2hlY2tTdGF0ZShjaGVja2VkKTsKICAgICAgfTsKCiAgICAgIE5vZGUucHJvdG90eXBlLnNldENoZWNrU3RhdGUgPSBmdW5jdGlvbiBzZXRDaGVja1N0YXRlKGNoZWNrZWQpIHsKICAgICAgICB2YXIgdG90YWxOdW0gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsKICAgICAgICB2YXIgY2hlY2tlZE51bSA9IHRoaXMuY2hpbGRyZW4ucmVkdWNlKGZ1bmN0aW9uIChjLCBwKSB7CiAgICAgICAgICB2YXIgbnVtID0gcC5jaGVja2VkID8gMSA6IHAuaW5kZXRlcm1pbmF0ZSA/IDAuNSA6IDA7CiAgICAgICAgICByZXR1cm4gYyArIG51bTsKICAgICAgICB9LCAwKTsKICAgICAgICB0aGlzLmNoZWNrZWQgPSBjaGVja2VkOwogICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZSA9IGNoZWNrZWROdW0gIT09IHRvdGFsTnVtICYmIGNoZWNrZWROdW0gPiAwOwogICAgICB9OwoKICAgICAgTm9kZS5wcm90b3R5cGUuc3luY0NoZWNrU3RhdGUgPSBmdW5jdGlvbiBzeW5jQ2hlY2tTdGF0ZShjaGVja2VkVmFsdWUpIHsKICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlQnlPcHRpb24oKTsKICAgICAgICB2YXIgY2hlY2tlZCA9IHRoaXMuaXNTYW1lTm9kZShjaGVja2VkVmFsdWUsIHZhbHVlKTsKICAgICAgICB0aGlzLmRvQ2hlY2soY2hlY2tlZCk7CiAgICAgIH07CgogICAgICBOb2RlLnByb3RvdHlwZS5kb0NoZWNrID0gZnVuY3Rpb24gZG9DaGVjayhjaGVja2VkKSB7CiAgICAgICAgaWYgKHRoaXMuY2hlY2tlZCAhPT0gY2hlY2tlZCkgewogICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmNoZWNrU3RyaWN0bHkpIHsKICAgICAgICAgICAgdGhpcy5jaGVja2VkID0gY2hlY2tlZDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGJvdHRvbSB1cCB0byB1bmlmeSB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGluZGV0ZXJtaW5hdGUgc3RhdGUKICAgICAgICAgICAgdGhpcy5icm9hZGNhc3QoJ2NoZWNrJywgY2hlY2tlZCk7CiAgICAgICAgICAgIHRoaXMuc2V0Q2hlY2tTdGF0ZShjaGVja2VkKTsKICAgICAgICAgICAgdGhpcy5lbWl0KCdjaGVjaycpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKCiAgICAgIF9jcmVhdGVDbGFzcyhOb2RlLCBbewogICAgICAgIGtleTogJ2lzRGlzYWJsZWQnLAogICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEsCiAgICAgICAgICAgICAgcGFyZW50ID0gdGhpcy5wYXJlbnQsCiAgICAgICAgICAgICAgY29uZmlnID0gdGhpcy5jb25maWc7CiAgICAgICAgICB2YXIgZGlzYWJsZWRLZXkgPSBjb25maWcuZGlzYWJsZWQ7CiAgICAgICAgICB2YXIgY2hlY2tTdHJpY3RseSA9IGNvbmZpZy5jaGVja1N0cmljdGx5OwogICAgICAgICAgcmV0dXJuIGRhdGFbZGlzYWJsZWRLZXldIHx8ICFjaGVja1N0cmljdGx5ICYmIHBhcmVudCAmJiBwYXJlbnQuaXNEaXNhYmxlZDsKICAgICAgICB9CiAgICAgIH0sIHsKICAgICAgICBrZXk6ICdpc0xlYWYnLAogICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEsCiAgICAgICAgICAgICAgbG9hZGVkID0gdGhpcy5sb2FkZWQsCiAgICAgICAgICAgICAgaGFzQ2hpbGRyZW4gPSB0aGlzLmhhc0NoaWxkcmVuLAogICAgICAgICAgICAgIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjsKICAgICAgICAgIHZhciBfY29uZmlnMiA9IHRoaXMuY29uZmlnLAogICAgICAgICAgICAgIGxhenkgPSBfY29uZmlnMi5sYXp5LAogICAgICAgICAgICAgIGxlYWZLZXkgPSBfY29uZmlnMi5sZWFmOwoKICAgICAgICAgIGlmIChsYXp5KSB7CiAgICAgICAgICAgIHZhciBpc0xlYWYgPSBPYmplY3Qoc2hhcmVkX1siaXNEZWYiXSkoZGF0YVtsZWFmS2V5XSkgPyBkYXRhW2xlYWZLZXldIDogbG9hZGVkID8gIWNoaWxkcmVuLmxlbmd0aCA6IGZhbHNlOwogICAgICAgICAgICB0aGlzLmhhc0NoaWxkcmVuID0gIWlzTGVhZjsKICAgICAgICAgICAgcmV0dXJuIGlzTGVhZjsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gIWhhc0NoaWxkcmVuOwogICAgICAgIH0KICAgICAgfV0pOwoKICAgICAgcmV0dXJuIE5vZGU7CiAgICB9KCk7CiAgICAvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovCgoKICAgIHZhciBzcmNfbm9kZSA9IG5vZGVfTm9kZTsgLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvc3RvcmUuanMKCiAgICBmdW5jdGlvbiBzdG9yZV9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsKICAgICAgfQogICAgfQoKICAgIHZhciBmbGF0Tm9kZXMgPSBmdW5jdGlvbiBmbGF0Tm9kZXMoZGF0YSwgbGVhZk9ubHkpIHsKICAgICAgcmV0dXJuIGRhdGEucmVkdWNlKGZ1bmN0aW9uIChyZXMsIG5vZGUpIHsKICAgICAgICBpZiAobm9kZS5pc0xlYWYpIHsKICAgICAgICAgIHJlcy5wdXNoKG5vZGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAhbGVhZk9ubHkgJiYgcmVzLnB1c2gobm9kZSk7CiAgICAgICAgICByZXMgPSByZXMuY29uY2F0KGZsYXROb2Rlcyhub2RlLmNoaWxkcmVuLCBsZWFmT25seSkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlczsKICAgICAgfSwgW10pOwogICAgfTsKCiAgICB2YXIgc3RvcmVfU3RvcmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgIGZ1bmN0aW9uIFN0b3JlKGRhdGEsIGNvbmZpZykgewogICAgICAgIHN0b3JlX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN0b3JlKTsKICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKICAgICAgICB0aGlzLmluaXROb2RlcyhkYXRhKTsKICAgICAgfQoKICAgICAgU3RvcmUucHJvdG90eXBlLmluaXROb2RlcyA9IGZ1bmN0aW9uIGluaXROb2RlcyhkYXRhKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgZGF0YSA9IE9iamVjdCh1dGlsX1siY29lcmNlVHJ1dGh5VmFsdWVUb0FycmF5Il0pKGRhdGEpOwogICAgICAgIHRoaXMubm9kZXMgPSBkYXRhLm1hcChmdW5jdGlvbiAobm9kZURhdGEpIHsKICAgICAgICAgIHJldHVybiBuZXcgc3JjX25vZGUobm9kZURhdGEsIF90aGlzLmNvbmZpZyk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5mbGF0dGVkTm9kZXMgPSB0aGlzLmdldEZsYXR0ZWROb2RlcyhmYWxzZSwgZmFsc2UpOwogICAgICAgIHRoaXMubGVhZk5vZGVzID0gdGhpcy5nZXRGbGF0dGVkTm9kZXModHJ1ZSwgZmFsc2UpOwogICAgICB9OwoKICAgICAgU3RvcmUucHJvdG90eXBlLmFwcGVuZE5vZGUgPSBmdW5jdGlvbiBhcHBlbmROb2RlKG5vZGVEYXRhLCBwYXJlbnROb2RlKSB7CiAgICAgICAgdmFyIG5vZGUgPSBuZXcgc3JjX25vZGUobm9kZURhdGEsIHRoaXMuY29uZmlnLCBwYXJlbnROb2RlKTsKICAgICAgICB2YXIgY2hpbGRyZW4gPSBwYXJlbnROb2RlID8gcGFyZW50Tm9kZS5jaGlsZHJlbiA6IHRoaXMubm9kZXM7CiAgICAgICAgY2hpbGRyZW4ucHVzaChub2RlKTsKICAgICAgfTsKCiAgICAgIFN0b3JlLnByb3RvdHlwZS5hcHBlbmROb2RlcyA9IGZ1bmN0aW9uIGFwcGVuZE5vZGVzKG5vZGVEYXRhTGlzdCwgcGFyZW50Tm9kZSkgewogICAgICAgIHZhciBfdGhpczIgPSB0aGlzOwoKICAgICAgICBub2RlRGF0YUxpc3QgPSBPYmplY3QodXRpbF9bImNvZXJjZVRydXRoeVZhbHVlVG9BcnJheSJdKShub2RlRGF0YUxpc3QpOwogICAgICAgIG5vZGVEYXRhTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRGF0YSkgewogICAgICAgICAgcmV0dXJuIF90aGlzMi5hcHBlbmROb2RlKG5vZGVEYXRhLCBwYXJlbnROb2RlKTsKICAgICAgICB9KTsKICAgICAgfTsKCiAgICAgIFN0b3JlLnByb3RvdHlwZS5nZXROb2RlcyA9IGZ1bmN0aW9uIGdldE5vZGVzKCkgewogICAgICAgIHJldHVybiB0aGlzLm5vZGVzOwogICAgICB9OwoKICAgICAgU3RvcmUucHJvdG90eXBlLmdldEZsYXR0ZWROb2RlcyA9IGZ1bmN0aW9uIGdldEZsYXR0ZWROb2RlcyhsZWFmT25seSkgewogICAgICAgIHZhciBjYWNoZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7CiAgICAgICAgdmFyIGNhY2hlZE5vZGVzID0gbGVhZk9ubHkgPyB0aGlzLmxlYWZOb2RlcyA6IHRoaXMuZmxhdHRlZE5vZGVzOwogICAgICAgIHJldHVybiBjYWNoZWQgPyBjYWNoZWROb2RlcyA6IGZsYXROb2Rlcyh0aGlzLm5vZGVzLCBsZWFmT25seSk7CiAgICAgIH07CgogICAgICBTdG9yZS5wcm90b3R5cGUuZ2V0Tm9kZUJ5VmFsdWUgPSBmdW5jdGlvbiBnZXROb2RlQnlWYWx1ZSh2YWx1ZSkgewogICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgdmFyIG5vZGVzID0gdGhpcy5nZXRGbGF0dGVkTm9kZXMoZmFsc2UsICF0aGlzLmNvbmZpZy5sYXp5KS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdCh1dGlsX1sidmFsdWVFcXVhbHMiXSkobm9kZS5wYXRoLCB2YWx1ZSkgfHwgbm9kZS52YWx1ZSA9PT0gdmFsdWU7CiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiBub2RlcyAmJiBub2Rlcy5sZW5ndGggPyBub2Rlc1swXSA6IG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfTsKCiAgICAgIHJldHVybiBTdG9yZTsKICAgIH0oKTsKICAgIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8KCgogICAgdmFyIHNyY19zdG9yZSA9IHN0b3JlX1N0b3JlOyAvLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi91dGlscy9tZXJnZSIKCiAgICB2YXIgbWVyZ2VfID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTsKCiAgICB2YXIgbWVyZ2VfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4obWVyZ2VfKTsgLy8gRVhURVJOQUwgTU9EVUxFOiBleHRlcm5hbCAiZWxlbWVudC11aS9saWIvdXRpbHMvYXJpYS11dGlscyIKCgogICAgdmFyIGFyaWFfdXRpbHNfID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMik7CgogICAgdmFyIGFyaWFfdXRpbHNfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oYXJpYV91dGlsc18pOyAvLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsICJlbGVtZW50LXVpL2xpYi91dGlscy9zY3JvbGwtaW50by12aWV3IgoKCiAgICB2YXIgc2Nyb2xsX2ludG9fdmlld18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMxKTsKCiAgICB2YXIgc2Nyb2xsX2ludG9fdmlld19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihzY3JvbGxfaW50b192aWV3Xyk7IC8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIhLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWI/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9jYXNjYWRlci1wYW5lbC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCgoKICAgIHZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgewogICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CgogICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsKICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7CiAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfTsgLy8KICAgIC8vCiAgICAvLwogICAgLy8KICAgIC8vCiAgICAvLwogICAgLy8KICAgIC8vCiAgICAvLwogICAgLy8KICAgIC8vCiAgICAvLwogICAgLy8KICAgIC8vCiAgICAvLwogICAgLy8KCgogICAgdmFyIEtleUNvZGUgPSBhcmlhX3V0aWxzX2RlZmF1bHQuYS5rZXlzOwogICAgdmFyIERlZmF1bHRQcm9wcyA9IHsKICAgICAgZXhwYW5kVHJpZ2dlcjogJ2NsaWNrJywKICAgICAgLy8gb3IgaG92ZXIKICAgICAgbXVsdGlwbGU6IGZhbHNlLAogICAgICBjaGVja1N0cmljdGx5OiBmYWxzZSwKICAgICAgLy8gd2hldGhlciBhbGwgbm9kZXMgY2FuIGJlIHNlbGVjdGVkCiAgICAgIGVtaXRQYXRoOiB0cnVlLAogICAgICAvLyB3ZXRoZXIgdG8gZW1pdCBhbiBhcnJheSBvZiBhbGwgbGV2ZWxzIHZhbHVlIGluIHdoaWNoIG5vZGUgaXMgbG9jYXRlZAogICAgICBsYXp5OiBmYWxzZSwKICAgICAgbGF6eUxvYWQ6IHV0aWxfWyJub29wIl0sCiAgICAgIHZhbHVlOiAndmFsdWUnLAogICAgICBsYWJlbDogJ2xhYmVsJywKICAgICAgY2hpbGRyZW46ICdjaGlsZHJlbicsCiAgICAgIGxlYWY6ICdsZWFmJywKICAgICAgZGlzYWJsZWQ6ICdkaXNhYmxlZCcsCiAgICAgIGhvdmVyVGhyZXNob2xkOiA1MDAKICAgIH07CgogICAgdmFyIGNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfaXNMZWFmID0gZnVuY3Rpb24gaXNMZWFmKGVsKSB7CiAgICAgIHJldHVybiAhZWwuZ2V0QXR0cmlidXRlKCdhcmlhLW93bnMnKTsKICAgIH07CgogICAgdmFyIGdldFNpYmxpbmcgPSBmdW5jdGlvbiBnZXRTaWJsaW5nKGVsLCBkaXN0YW5jZSkgewogICAgICB2YXIgcGFyZW50Tm9kZSA9IGVsLnBhcmVudE5vZGU7CgogICAgICBpZiAocGFyZW50Tm9kZSkgewogICAgICAgIHZhciBzaWJsaW5ncyA9IHBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgnLmVsLWNhc2NhZGVyLW5vZGVbdGFiaW5kZXg9Ii0xIl0nKTsKICAgICAgICB2YXIgaW5kZXggPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHNpYmxpbmdzLCBlbCk7CiAgICAgICAgcmV0dXJuIHNpYmxpbmdzW2luZGV4ICsgZGlzdGFuY2VdIHx8IG51bGw7CiAgICAgIH0KCiAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICB2YXIgZ2V0TWVudUluZGV4ID0gZnVuY3Rpb24gZ2V0TWVudUluZGV4KGVsLCBkaXN0YW5jZSkgewogICAgICBpZiAoIWVsKSByZXR1cm47CiAgICAgIHZhciBwaWVjZXMgPSBlbC5pZC5zcGxpdCgnLScpOwogICAgICByZXR1cm4gTnVtYmVyKHBpZWNlc1twaWVjZXMubGVuZ3RoIC0gMl0pOwogICAgfTsKCiAgICB2YXIgZm9jdXNOb2RlID0gZnVuY3Rpb24gZm9jdXNOb2RlKGVsKSB7CiAgICAgIGlmICghZWwpIHJldHVybjsKICAgICAgZWwuZm9jdXMoKTsKICAgICAgIWNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfaXNMZWFmKGVsKSAmJiBlbC5jbGljaygpOwogICAgfTsKCiAgICB2YXIgY2hlY2tOb2RlID0gZnVuY3Rpb24gY2hlY2tOb2RlKGVsKSB7CiAgICAgIGlmICghZWwpIHJldHVybjsKICAgICAgdmFyIGlucHV0ID0gZWwucXVlcnlTZWxlY3RvcignaW5wdXQnKTsKCiAgICAgIGlmIChpbnB1dCkgewogICAgICAgIGlucHV0LmNsaWNrKCk7CiAgICAgIH0gZWxzZSBpZiAoY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc19pc0xlYWYoZWwpKSB7CiAgICAgICAgZWwuY2xpY2soKTsKICAgICAgfQogICAgfTsKICAgIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8KCgogICAgdmFyIGNhc2NhZGVyX3BhbmVsdnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gewogICAgICBuYW1lOiAnRWxDYXNjYWRlclBhbmVsJywKICAgICAgY29tcG9uZW50czogewogICAgICAgIENhc2NhZGVyTWVudTogY2FzY2FkZXJfbWVudQogICAgICB9LAogICAgICBwcm9wczogewogICAgICAgIHZhbHVlOiB7fSwKICAgICAgICBvcHRpb25zOiBBcnJheSwKICAgICAgICBwcm9wczogT2JqZWN0LAogICAgICAgIGJvcmRlcjogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIGRlZmF1bHQ6IHRydWUKICAgICAgICB9LAogICAgICAgIHJlbmRlckxhYmVsOiBGdW5jdGlvbgogICAgICB9LAogICAgICBwcm92aWRlOiBmdW5jdGlvbiBwcm92aWRlKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBwYW5lbDogdGhpcwogICAgICAgIH07CiAgICAgIH0sCiAgICAgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGNoZWNrZWRWYWx1ZTogbnVsbCwKICAgICAgICAgIGNoZWNrZWROb2RlUGF0aHM6IFtdLAogICAgICAgICAgc3RvcmU6IFtdLAogICAgICAgICAgbWVudXM6IFtdLAogICAgICAgICAgYWN0aXZlUGF0aDogW10sCiAgICAgICAgICBsb2FkQ291bnQ6IDAKICAgICAgICB9OwogICAgICB9LAogICAgICBjb21wdXRlZDogewogICAgICAgIGNvbmZpZzogZnVuY3Rpb24gY29uZmlnKCkgewogICAgICAgICAgcmV0dXJuIG1lcmdlX2RlZmF1bHQoKShfZXh0ZW5kcyh7fSwgRGVmYXVsdFByb3BzKSwgdGhpcy5wcm9wcyB8fCB7fSk7CiAgICAgICAgfSwKICAgICAgICBtdWx0aXBsZTogZnVuY3Rpb24gbXVsdGlwbGUoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWcubXVsdGlwbGU7CiAgICAgICAgfSwKICAgICAgICBjaGVja1N0cmljdGx5OiBmdW5jdGlvbiBjaGVja1N0cmljdGx5KCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmNoZWNrU3RyaWN0bHk7CiAgICAgICAgfSwKICAgICAgICBsZWFmT25seTogZnVuY3Rpb24gbGVhZk9ubHkoKSB7CiAgICAgICAgICByZXR1cm4gIXRoaXMuY2hlY2tTdHJpY3RseTsKICAgICAgICB9LAogICAgICAgIGlzSG92ZXJNZW51OiBmdW5jdGlvbiBpc0hvdmVyTWVudSgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5leHBhbmRUcmlnZ2VyID09PSAnaG92ZXInOwogICAgICAgIH0sCiAgICAgICAgcmVuZGVyTGFiZWxGbjogZnVuY3Rpb24gcmVuZGVyTGFiZWxGbigpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckxhYmVsIHx8IHRoaXMuJHNjb3BlZFNsb3RzLmRlZmF1bHQ7CiAgICAgICAgfQogICAgICB9LAogICAgICB3YXRjaDogewogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoKSB7CiAgICAgICAgICAgIHRoaXMuaW5pdFN0b3JlKCk7CiAgICAgICAgICB9LAogICAgICAgICAgaW1tZWRpYXRlOiB0cnVlLAogICAgICAgICAgZGVlcDogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKCkgewogICAgICAgICAgdGhpcy5zeW5jQ2hlY2tlZFZhbHVlKCk7CiAgICAgICAgICB0aGlzLmNoZWNrU3RyaWN0bHkgJiYgdGhpcy5jYWxjdWxhdGVDaGVja2VkTm9kZVBhdGhzKCk7CiAgICAgICAgfSwKICAgICAgICBjaGVja2VkVmFsdWU6IGZ1bmN0aW9uIGNoZWNrZWRWYWx1ZSh2YWwpIHsKICAgICAgICAgIGlmICghT2JqZWN0KHV0aWxfWyJpc0VxdWFsIl0pKHZhbCwgdGhpcy52YWx1ZSkpIHsKICAgICAgICAgICAgdGhpcy5jaGVja1N0cmljdGx5ICYmIHRoaXMuY2FsY3VsYXRlQ2hlY2tlZE5vZGVQYXRocygpOwogICAgICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7CiAgICAgICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkgewogICAgICAgIGlmICghT2JqZWN0KHV0aWxfWyJpc0VtcHR5Il0pKHRoaXMudmFsdWUpKSB7CiAgICAgICAgICB0aGlzLnN5bmNDaGVja2VkVmFsdWUoKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIG1ldGhvZHM6IHsKICAgICAgICBpbml0U3RvcmU6IGZ1bmN0aW9uIGluaXRTdG9yZSgpIHsKICAgICAgICAgIHZhciBjb25maWcgPSB0aGlzLmNvbmZpZywKICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zOwoKICAgICAgICAgIGlmIChjb25maWcubGF6eSAmJiBPYmplY3QodXRpbF9bImlzRW1wdHkiXSkob3B0aW9ucykpIHsKICAgICAgICAgICAgdGhpcy5sYXp5TG9hZCgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IG5ldyBzcmNfc3RvcmUob3B0aW9ucywgY29uZmlnKTsKICAgICAgICAgICAgdGhpcy5tZW51cyA9IFt0aGlzLnN0b3JlLmdldE5vZGVzKCldOwogICAgICAgICAgICB0aGlzLnN5bmNNZW51U3RhdGUoKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHN5bmNDaGVja2VkVmFsdWU6IGZ1bmN0aW9uIHN5bmNDaGVja2VkVmFsdWUoKSB7CiAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlLAogICAgICAgICAgICAgIGNoZWNrZWRWYWx1ZSA9IHRoaXMuY2hlY2tlZFZhbHVlOwoKICAgICAgICAgIGlmICghT2JqZWN0KHV0aWxfWyJpc0VxdWFsIl0pKHZhbHVlLCBjaGVja2VkVmFsdWUpKSB7CiAgICAgICAgICAgIHRoaXMuY2hlY2tlZFZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIHRoaXMuc3luY01lbnVTdGF0ZSgpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgc3luY01lbnVTdGF0ZTogZnVuY3Rpb24gc3luY01lbnVTdGF0ZSgpIHsKICAgICAgICAgIHZhciBtdWx0aXBsZSA9IHRoaXMubXVsdGlwbGUsCiAgICAgICAgICAgICAgY2hlY2tTdHJpY3RseSA9IHRoaXMuY2hlY2tTdHJpY3RseTsKICAgICAgICAgIHRoaXMuc3luY0FjdGl2ZVBhdGgoKTsKICAgICAgICAgIG11bHRpcGxlICYmIHRoaXMuc3luY011bHRpQ2hlY2tTdGF0ZSgpOwogICAgICAgICAgY2hlY2tTdHJpY3RseSAmJiB0aGlzLmNhbGN1bGF0ZUNoZWNrZWROb2RlUGF0aHMoKTsKICAgICAgICAgIHRoaXMuJG5leHRUaWNrKHRoaXMuc2Nyb2xsSW50b1ZpZXcpOwogICAgICAgIH0sCiAgICAgICAgc3luY011bHRpQ2hlY2tTdGF0ZTogZnVuY3Rpb24gc3luY011bHRpQ2hlY2tTdGF0ZSgpIHsKICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgdmFyIG5vZGVzID0gdGhpcy5nZXRGbGF0dGVkTm9kZXModGhpcy5sZWFmT25seSk7CiAgICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIG5vZGUuc3luY0NoZWNrU3RhdGUoX3RoaXMuY2hlY2tlZFZhbHVlKTsKICAgICAgICAgIH0pOwogICAgICAgIH0sCiAgICAgICAgc3luY0FjdGl2ZVBhdGg6IGZ1bmN0aW9uIHN5bmNBY3RpdmVQYXRoKCkgewogICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CgogICAgICAgICAgdmFyIHN0b3JlID0gdGhpcy5zdG9yZSwKICAgICAgICAgICAgICBtdWx0aXBsZSA9IHRoaXMubXVsdGlwbGUsCiAgICAgICAgICAgICAgYWN0aXZlUGF0aCA9IHRoaXMuYWN0aXZlUGF0aCwKICAgICAgICAgICAgICBjaGVja2VkVmFsdWUgPSB0aGlzLmNoZWNrZWRWYWx1ZTsKCiAgICAgICAgICBpZiAoIU9iamVjdCh1dGlsX1siaXNFbXB0eSJdKShhY3RpdmVQYXRoKSkgewogICAgICAgICAgICB2YXIgbm9kZXMgPSBhY3RpdmVQYXRoLm1hcChmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICAgIHJldHVybiBfdGhpczIuZ2V0Tm9kZUJ5VmFsdWUobm9kZS5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuZXhwYW5kTm9kZXMobm9kZXMpOwogICAgICAgICAgfSBlbHNlIGlmICghT2JqZWN0KHV0aWxfWyJpc0VtcHR5Il0pKGNoZWNrZWRWYWx1ZSkpIHsKICAgICAgICAgICAgdmFyIHZhbHVlID0gbXVsdGlwbGUgPyBjaGVja2VkVmFsdWVbMF0gOiBjaGVja2VkVmFsdWU7CiAgICAgICAgICAgIHZhciBjaGVja2VkTm9kZSA9IHRoaXMuZ2V0Tm9kZUJ5VmFsdWUodmFsdWUpIHx8IHt9OwoKICAgICAgICAgICAgdmFyIF9ub2RlcyA9IChjaGVja2VkTm9kZS5wYXRoTm9kZXMgfHwgW10pLnNsaWNlKDAsIC0xKTsKCiAgICAgICAgICAgIHRoaXMuZXhwYW5kTm9kZXMoX25vZGVzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlUGF0aCA9IFtdOwogICAgICAgICAgICB0aGlzLm1lbnVzID0gW3N0b3JlLmdldE5vZGVzKCldOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZXhwYW5kTm9kZXM6IGZ1bmN0aW9uIGV4cGFuZE5vZGVzKG5vZGVzKSB7CiAgICAgICAgICB2YXIgX3RoaXMzID0gdGhpczsKCiAgICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHJldHVybiBfdGhpczMuaGFuZGxlRXhwYW5kKG5vZGUsIHRydWUKICAgICAgICAgICAgLyogc2lsZW50ICovCiAgICAgICAgICAgICk7CiAgICAgICAgICB9KTsKICAgICAgICB9LAogICAgICAgIGNhbGN1bGF0ZUNoZWNrZWROb2RlUGF0aHM6IGZ1bmN0aW9uIGNhbGN1bGF0ZUNoZWNrZWROb2RlUGF0aHMoKSB7CiAgICAgICAgICB2YXIgX3RoaXM0ID0gdGhpczsKCiAgICAgICAgICB2YXIgY2hlY2tlZFZhbHVlID0gdGhpcy5jaGVja2VkVmFsdWUsCiAgICAgICAgICAgICAgbXVsdGlwbGUgPSB0aGlzLm11bHRpcGxlOwogICAgICAgICAgdmFyIGNoZWNrZWRWYWx1ZXMgPSBtdWx0aXBsZSA/IE9iamVjdCh1dGlsX1siY29lcmNlVHJ1dGh5VmFsdWVUb0FycmF5Il0pKGNoZWNrZWRWYWx1ZSkgOiBbY2hlY2tlZFZhbHVlXTsKICAgICAgICAgIHRoaXMuY2hlY2tlZE5vZGVQYXRocyA9IGNoZWNrZWRWYWx1ZXMubWFwKGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgIHZhciBjaGVja2VkTm9kZSA9IF90aGlzNC5nZXROb2RlQnlWYWx1ZSh2KTsKCiAgICAgICAgICAgIHJldHVybiBjaGVja2VkTm9kZSA/IGNoZWNrZWROb2RlLnBhdGhOb2RlcyA6IFtdOwogICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICBoYW5kbGVLZXlEb3duOiBmdW5jdGlvbiBoYW5kbGVLZXlEb3duKGUpIHsKICAgICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldCwKICAgICAgICAgICAgICBrZXlDb2RlID0gZS5rZXlDb2RlOwoKICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgewogICAgICAgICAgICBjYXNlIEtleUNvZGUudXA6CiAgICAgICAgICAgICAgdmFyIHByZXYgPSBnZXRTaWJsaW5nKHRhcmdldCwgLTEpOwogICAgICAgICAgICAgIGZvY3VzTm9kZShwcmV2KTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5kb3duOgogICAgICAgICAgICAgIHZhciBuZXh0ID0gZ2V0U2libGluZyh0YXJnZXQsIDEpOwogICAgICAgICAgICAgIGZvY3VzTm9kZShuZXh0KTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5sZWZ0OgogICAgICAgICAgICAgIHZhciBwcmVNZW51ID0gdGhpcy4kcmVmcy5tZW51W2dldE1lbnVJbmRleCh0YXJnZXQpIC0gMV07CgogICAgICAgICAgICAgIGlmIChwcmVNZW51KSB7CiAgICAgICAgICAgICAgICB2YXIgZXhwYW5kZWROb2RlID0gcHJlTWVudS4kZWwucXVlcnlTZWxlY3RvcignLmVsLWNhc2NhZGVyLW5vZGVbYXJpYS1leHBhbmRlZD0idHJ1ZSJdJyk7CiAgICAgICAgICAgICAgICBmb2N1c05vZGUoZXhwYW5kZWROb2RlKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBLZXlDb2RlLnJpZ2h0OgogICAgICAgICAgICAgIHZhciBuZXh0TWVudSA9IHRoaXMuJHJlZnMubWVudVtnZXRNZW51SW5kZXgodGFyZ2V0KSArIDFdOwoKICAgICAgICAgICAgICBpZiAobmV4dE1lbnUpIHsKICAgICAgICAgICAgICAgIHZhciBmaXJzdE5vZGUgPSBuZXh0TWVudS4kZWwucXVlcnlTZWxlY3RvcignLmVsLWNhc2NhZGVyLW5vZGVbdGFiaW5kZXg9Ii0xIl0nKTsKICAgICAgICAgICAgICAgIGZvY3VzTm9kZShmaXJzdE5vZGUpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIEtleUNvZGUuZW50ZXI6CiAgICAgICAgICAgICAgY2hlY2tOb2RlKHRhcmdldCk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIEtleUNvZGUuZXNjOgogICAgICAgICAgICBjYXNlIEtleUNvZGUudGFiOgogICAgICAgICAgICAgIHRoaXMuJGVtaXQoJ2Nsb3NlJyk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGhhbmRsZUV4cGFuZDogZnVuY3Rpb24gaGFuZGxlRXhwYW5kKG5vZGUsIHNpbGVudCkgewogICAgICAgICAgdmFyIGFjdGl2ZVBhdGggPSB0aGlzLmFjdGl2ZVBhdGg7CiAgICAgICAgICB2YXIgbGV2ZWwgPSBub2RlLmxldmVsOwogICAgICAgICAgdmFyIHBhdGggPSBhY3RpdmVQYXRoLnNsaWNlKDAsIGxldmVsIC0gMSk7CiAgICAgICAgICB2YXIgbWVudXMgPSB0aGlzLm1lbnVzLnNsaWNlKDAsIGxldmVsKTsKCiAgICAgICAgICBpZiAoIW5vZGUuaXNMZWFmKSB7CiAgICAgICAgICAgIHBhdGgucHVzaChub2RlKTsKICAgICAgICAgICAgbWVudXMucHVzaChub2RlLmNoaWxkcmVuKTsKICAgICAgICAgIH0KCiAgICAgICAgICB0aGlzLmFjdGl2ZVBhdGggPSBwYXRoOwogICAgICAgICAgdGhpcy5tZW51cyA9IG1lbnVzOwoKICAgICAgICAgIGlmICghc2lsZW50KSB7CiAgICAgICAgICAgIHZhciBwYXRoVmFsdWVzID0gcGF0aC5tYXAoZnVuY3Rpb24gKG5vZGUpIHsKICAgICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRWYWx1ZSgpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIGFjdGl2ZVBhdGhWYWx1ZXMgPSBhY3RpdmVQYXRoLm1hcChmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICAgIHJldHVybiBub2RlLmdldFZhbHVlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKCFPYmplY3QodXRpbF9bInZhbHVlRXF1YWxzIl0pKHBhdGhWYWx1ZXMsIGFjdGl2ZVBhdGhWYWx1ZXMpKSB7CiAgICAgICAgICAgICAgdGhpcy4kZW1pdCgnYWN0aXZlLWl0ZW0tY2hhbmdlJywgcGF0aFZhbHVlcyk7IC8vIERlcHJlY2F0ZWQKCiAgICAgICAgICAgICAgdGhpcy4kZW1pdCgnZXhwYW5kLWNoYW5nZScsIHBhdGhWYWx1ZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBoYW5kbGVDaGVja0NoYW5nZTogZnVuY3Rpb24gaGFuZGxlQ2hlY2tDaGFuZ2UodmFsdWUpIHsKICAgICAgICAgIHRoaXMuY2hlY2tlZFZhbHVlID0gdmFsdWU7CiAgICAgICAgfSwKICAgICAgICBsYXp5TG9hZDogZnVuY3Rpb24gbGF6eUxvYWQobm9kZSwgb25GdWxsZmlsZWQpIHsKICAgICAgICAgIHZhciBfdGhpczUgPSB0aGlzOwoKICAgICAgICAgIHZhciBjb25maWcgPSB0aGlzLmNvbmZpZzsKCiAgICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgICAgbm9kZSA9IG5vZGUgfHwgewogICAgICAgICAgICAgIHJvb3Q6IHRydWUsCiAgICAgICAgICAgICAgbGV2ZWw6IDAKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IG5ldyBzcmNfc3RvcmUoW10sIGNvbmZpZyk7CiAgICAgICAgICAgIHRoaXMubWVudXMgPSBbdGhpcy5zdG9yZS5nZXROb2RlcygpXTsKICAgICAgICAgIH0KCiAgICAgICAgICBub2RlLmxvYWRpbmcgPSB0cnVlOwoKICAgICAgICAgIHZhciByZXNvbHZlID0gZnVuY3Rpb24gcmVzb2x2ZShkYXRhTGlzdCkgewogICAgICAgICAgICB2YXIgcGFyZW50ID0gbm9kZS5yb290ID8gbnVsbCA6IG5vZGU7CiAgICAgICAgICAgIGRhdGFMaXN0ICYmIGRhdGFMaXN0Lmxlbmd0aCAmJiBfdGhpczUuc3RvcmUuYXBwZW5kTm9kZXMoZGF0YUxpc3QsIHBhcmVudCk7CiAgICAgICAgICAgIG5vZGUubG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICBub2RlLmxvYWRlZCA9IHRydWU7IC8vIGRpc3Bvc2UgZGVmYXVsdCB2YWx1ZSBvbiBsYXp5IGxvYWQgbW9kZQoKICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoX3RoaXM1LmNoZWNrZWRWYWx1ZSkpIHsKICAgICAgICAgICAgICB2YXIgbm9kZVZhbHVlID0gX3RoaXM1LmNoZWNrZWRWYWx1ZVtfdGhpczUubG9hZENvdW50KytdOwogICAgICAgICAgICAgIHZhciB2YWx1ZUtleSA9IF90aGlzNS5jb25maWcudmFsdWU7CiAgICAgICAgICAgICAgdmFyIGxlYWZLZXkgPSBfdGhpczUuY29uZmlnLmxlYWY7CgogICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFMaXN0KSAmJiBkYXRhTGlzdC5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgIHJldHVybiBpdGVtW3ZhbHVlS2V5XSA9PT0gbm9kZVZhbHVlOwogICAgICAgICAgICAgIH0pLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHZhciBjaGVja2VkTm9kZSA9IF90aGlzNS5zdG9yZS5nZXROb2RlQnlWYWx1ZShub2RlVmFsdWUpOwoKICAgICAgICAgICAgICAgIGlmICghY2hlY2tlZE5vZGUuZGF0YVtsZWFmS2V5XSkgewogICAgICAgICAgICAgICAgICBfdGhpczUubGF6eUxvYWQoY2hlY2tlZE5vZGUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpczUuaGFuZGxlRXhwYW5kKGNoZWNrZWROb2RlKTsKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKF90aGlzNS5sb2FkQ291bnQgPT09IF90aGlzNS5jaGVja2VkVmFsdWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgIF90aGlzNS4kcGFyZW50LmNvbXB1dGVQcmVzZW50VGV4dCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgb25GdWxsZmlsZWQgJiYgb25GdWxsZmlsZWQoZGF0YUxpc3QpOwogICAgICAgICAgfTsKCiAgICAgICAgICBjb25maWcubGF6eUxvYWQobm9kZSwgcmVzb2x2ZSk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogcHVibGljIG1ldGhvZHMKICAgICAgICAqLwogICAgICAgIGNhbGN1bGF0ZU11bHRpQ2hlY2tlZFZhbHVlOiBmdW5jdGlvbiBjYWxjdWxhdGVNdWx0aUNoZWNrZWRWYWx1ZSgpIHsKICAgICAgICAgIHRoaXMuY2hlY2tlZFZhbHVlID0gdGhpcy5nZXRDaGVja2VkTm9kZXModGhpcy5sZWFmT25seSkubWFwKGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHJldHVybiBub2RlLmdldFZhbHVlQnlPcHRpb24oKTsKICAgICAgICAgIH0pOwogICAgICAgIH0sCiAgICAgICAgc2Nyb2xsSW50b1ZpZXc6IGZ1bmN0aW9uIHNjcm9sbEludG9WaWV3KCkgewogICAgICAgICAgaWYgKHRoaXMuJGlzU2VydmVyKSByZXR1cm47CiAgICAgICAgICB2YXIgbWVudXMgPSB0aGlzLiRyZWZzLm1lbnUgfHwgW107CiAgICAgICAgICBtZW51cy5mb3JFYWNoKGZ1bmN0aW9uIChtZW51KSB7CiAgICAgICAgICAgIHZhciBtZW51RWxlbWVudCA9IG1lbnUuJGVsOwoKICAgICAgICAgICAgaWYgKG1lbnVFbGVtZW50KSB7CiAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG1lbnVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lbC1zY3JvbGxiYXJfX3dyYXAnKTsKICAgICAgICAgICAgICB2YXIgYWN0aXZlTm9kZSA9IG1lbnVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lbC1jYXNjYWRlci1ub2RlLmlzLWFjdGl2ZScpIHx8IG1lbnVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lbC1jYXNjYWRlci1ub2RlLmluLWFjdGl2ZS1wYXRoJyk7CiAgICAgICAgICAgICAgc2Nyb2xsX2ludG9fdmlld19kZWZhdWx0KCkoY29udGFpbmVyLCBhY3RpdmVOb2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICBnZXROb2RlQnlWYWx1ZTogZnVuY3Rpb24gZ2V0Tm9kZUJ5VmFsdWUodmFsKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXROb2RlQnlWYWx1ZSh2YWwpOwogICAgICAgIH0sCiAgICAgICAgZ2V0RmxhdHRlZE5vZGVzOiBmdW5jdGlvbiBnZXRGbGF0dGVkTm9kZXMobGVhZk9ubHkpIHsKICAgICAgICAgIHZhciBjYWNoZWQgPSAhdGhpcy5jb25maWcubGF6eTsKICAgICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEZsYXR0ZWROb2RlcyhsZWFmT25seSwgY2FjaGVkKTsKICAgICAgICB9LAogICAgICAgIGdldENoZWNrZWROb2RlczogZnVuY3Rpb24gZ2V0Q2hlY2tlZE5vZGVzKGxlYWZPbmx5KSB7CiAgICAgICAgICB2YXIgY2hlY2tlZFZhbHVlID0gdGhpcy5jaGVja2VkVmFsdWUsCiAgICAgICAgICAgICAgbXVsdGlwbGUgPSB0aGlzLm11bHRpcGxlOwoKICAgICAgICAgIGlmIChtdWx0aXBsZSkgewogICAgICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLmdldEZsYXR0ZWROb2RlcyhsZWFmT25seSk7CiAgICAgICAgICAgIHJldHVybiBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHsKICAgICAgICAgICAgICByZXR1cm4gbm9kZS5jaGVja2VkOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBPYmplY3QodXRpbF9bImlzRW1wdHkiXSkoY2hlY2tlZFZhbHVlKSA/IFtdIDogW3RoaXMuZ2V0Tm9kZUJ5VmFsdWUoY2hlY2tlZFZhbHVlKV07CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBjbGVhckNoZWNrZWROb2RlczogZnVuY3Rpb24gY2xlYXJDaGVja2VkTm9kZXMoKSB7CiAgICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5jb25maWcsCiAgICAgICAgICAgICAgbGVhZk9ubHkgPSB0aGlzLmxlYWZPbmx5OwogICAgICAgICAgdmFyIG11bHRpcGxlID0gY29uZmlnLm11bHRpcGxlLAogICAgICAgICAgICAgIGVtaXRQYXRoID0gY29uZmlnLmVtaXRQYXRoOwoKICAgICAgICAgIGlmIChtdWx0aXBsZSkgewogICAgICAgICAgICB0aGlzLmdldENoZWNrZWROb2RlcyhsZWFmT25seSkuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgICAgcmV0dXJuICFub2RlLmlzRGlzYWJsZWQ7CiAgICAgICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHsKICAgICAgICAgICAgICByZXR1cm4gbm9kZS5kb0NoZWNrKGZhbHNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlTXVsdGlDaGVja2VkVmFsdWUoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuY2hlY2tlZFZhbHVlID0gZW1pdFBhdGggPyBbXSA6IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9OyAvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2Nhc2NhZGVyLXBhbmVsL3NyYy9jYXNjYWRlci1wYW5lbC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmCgogICAgLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLwoKICAgIHZhciBzcmNfY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSBjYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXzsgLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItcGFuZWwudnVlCgogICAgLyogbm9ybWFsaXplIGNvbXBvbmVudCAqLwoKICAgIHZhciBjYXNjYWRlcl9wYW5lbF9jb21wb25lbnQgPSBPYmplY3QoY29tcG9uZW50Tm9ybWFsaXplclsiYSIKICAgIC8qIGRlZmF1bHQgKi8KICAgIF0pKHNyY19jYXNjYWRlcl9wYW5lbHZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXywgY2FzY2FkZXJfcGFuZWx2dWVfdHlwZV90ZW1wbGF0ZV9pZF8zNDkzMjM0Nl9yZW5kZXIsIHN0YXRpY1JlbmRlckZucywgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpOwogICAgLyogaG90IHJlbG9hZCAqLwoKICAgIGlmIChmYWxzZSkgewogICAgICB2YXIgY2FzY2FkZXJfcGFuZWxfYXBpOwogICAgfQoKICAgIGNhc2NhZGVyX3BhbmVsX2NvbXBvbmVudC5vcHRpb25zLl9fZmlsZSA9ICJwYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9zcmMvY2FzY2FkZXItcGFuZWwudnVlIjsKICAgIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8KCiAgICB2YXIgY2FzY2FkZXJfcGFuZWwgPSBjYXNjYWRlcl9wYW5lbF9jb21wb25lbnQuZXhwb3J0czsgLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9wYWNrYWdlcy9jYXNjYWRlci1wYW5lbC9pbmRleC5qcwoKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCgogICAgY2FzY2FkZXJfcGFuZWwuaW5zdGFsbCA9IGZ1bmN0aW9uIChWdWUpIHsKICAgICAgVnVlLmNvbXBvbmVudChjYXNjYWRlcl9wYW5lbC5uYW1lLCBjYXNjYWRlcl9wYW5lbCk7CiAgICB9OwogICAgLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLwoKCiAgICB2YXIgcGFja2FnZXNfY2FzY2FkZXJfcGFuZWwgPSBfX3dlYnBhY2tfZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBjYXNjYWRlcl9wYW5lbDsKICAgIC8qKiovCiAgfSwKCiAgLyoqKi8KICA2OgogIC8qKiovCiAgZnVuY3Rpb24gXyhtb2R1bGUsIGV4cG9ydHMpIHsKICAgIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgiZWxlbWVudC11aS9saWIvbWl4aW5zL2xvY2FsZSIpOwogICAgLyoqKi8KICB9LAoKICAvKioqLwogIDk6CiAgLyoqKi8KICBmdW5jdGlvbiBfKG1vZHVsZSwgZXhwb3J0cykgewogICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCJlbGVtZW50LXVpL2xpYi91dGlscy9tZXJnZSIpOwogICAgLyoqKi8KICB9CiAgLyoqKioqKi8KCn0pOw=="},null]}
|