mosaico 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/Gemfile +7 -0
- data/LICENSE +680 -0
- data/README.md +179 -0
- data/Rakefile +5 -0
- data/app/assets/images/mosaico/logo_transparent.png +0 -0
- data/app/assets/javascripts/mosaico/application.js.erb +51 -0
- data/app/assets/javascripts/mosaico/plugins/debug.js.erb +10 -0
- data/app/assets/javascripts/mosaico/plugins/logo.js.erb +10 -0
- data/app/assets/javascripts/mosaico/plugins/preview.js +85 -0
- data/app/assets/javascripts/mosaico/plugins/save.js.erb +72 -0
- data/app/assets/javascripts/mosaico/plugins/template_path.js.erb +22 -0
- data/app/assets/javascripts/mosaico/plugins/translations.js +10 -0
- data/app/assets/javascripts/mosaico/utilities.js +25 -0
- data/app/assets/stylesheets/mosaico/application.css +6 -0
- data/app/controllers/mosaico/application_controller.rb +17 -0
- data/app/controllers/mosaico/images_controller.rb +142 -0
- data/app/controllers/mosaico/projects_controller.rb +31 -0
- data/app/controllers/mosaico/templates_controller.rb +8 -0
- data/app/helpers/mosaico/application_helper.rb +7 -0
- data/app/models/mosaico/image.rb +9 -0
- data/app/models/mosaico/placeholder_image.rb +9 -0
- data/app/models/mosaico/project.rb +13 -0
- data/app/models/mosaico/uploaded_image.rb +26 -0
- data/app/views/layouts/mosaico/application.html.erb +13 -0
- data/app/views/mosaico/projects/new.html.erb +1 -0
- data/app/views/mosaico/projects/show.html.erb +1 -0
- data/app/views/mosaico/shared/_metadata.html.erb +12 -0
- data/config/routes.rb +12 -0
- data/db/migrate/20170817202255_add_images.rb +14 -0
- data/db/migrate/20170824233755_add_projects.rb +11 -0
- data/lib/mosaico.rb +100 -0
- data/lib/mosaico/engine.rb +72 -0
- data/lib/mosaico/local_backend.rb +23 -0
- data/lib/mosaico/local_image_backend.rb +7 -0
- data/lib/mosaico/local_placeholder_backend.rb +7 -0
- data/lib/mosaico/placeholder.png +0 -0
- data/lib/mosaico/template.rb +89 -0
- data/lib/mosaico/versafix_template.rb +43 -0
- data/lib/mosaico/version.rb +4 -0
- data/lib/tasks/makeThumbs.js.erb +57 -0
- data/lib/tasks/thumbs.rake +35 -0
- data/mosaico.gemspec +22 -0
- data/screenshot.png +0 -0
- data/vendor/assets/fonts/LiberationSans-Regular.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/.jsbeautifyrc +6 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/.jshintrc +8 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/.travis.yml +6 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/CONTRIBUTING.md +37 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/Dockerfile +21 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/Gruntfile.js +241 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/LICENSE +680 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/NOTICE.txt +87 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/README.md +73 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/backend/README.txt +23 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/backend/main.js +162 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/bower.json +76 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/build/mosaico-material.css +7425 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/build/mosaico.css +7133 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/build/mosaico.debug.js +1517 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/build/mosaico.js +12828 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/build/templates.js +15 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/fa/fonts/fontawesome-webfont.eot +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/fa/fonts/fontawesome-webfont.svg +685 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/fa/fonts/fontawesome-webfont.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/fa/fonts/fontawesome-webfont.woff +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/fa/fonts/fontawesome-webfont.woff2 +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/img/byvoxmail.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/img/mosaico-badge.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/img/mosaico-v.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/img/mosaico32.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/img/mosaicologo.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/img/screenshot-orig.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/img/screenshot.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/lang/README.md +26 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/lang/mosaico-de.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/lang/mosaico-en.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/lang/mosaico-es.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/lang/mosaico-fr.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/lang/mosaico-it.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/lang/mosaico-nl.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/lang/mosaico-sv.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/mosaico-material.min.css +5 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/mosaico-material.min.css.map +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/mosaico.min.css +5 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/mosaico.min.css.map +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/mosaico.min.js +1517 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/mosaico.min.js.map +147 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/canvas-to-blob.min.js +2 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery-ui.min.css +7 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery-ui.min.js +13 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery.fileupload-image.js +324 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery.fileupload-process.js +175 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery.fileupload-validate.js +122 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery.fileupload.js +1482 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery.iframe-transport.js +217 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery.min.js +5 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery.min.map +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/jquery.ui.touch-punch.min.js +11 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/knockout-jqueryui.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/knockout.js +123 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/load-image.all.min.js +2 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/notoregular/NotoSans-Regular-webfont.eot +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/notoregular/NotoSans-Regular-webfont.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/notoregular/NotoSans-Regular-webfont.woff +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/notoregular/stylesheet.css +9 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/advlist/plugin.js +101 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/advlist/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/anchor/plugin.js +55 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/anchor/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/autolink/plugin.js +204 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/autolink/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/autoresize/plugin.js +162 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/autoresize/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/autosave/plugin.js +165 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/autosave/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/bbcode/plugin.js +123 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/bbcode/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/charmap/plugin.js +462 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/charmap/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/code/plugin.js +60 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/code/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/codesample/css/prism.css +138 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/codesample/plugin.js +1319 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/codesample/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/colorpicker/plugin.js +112 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/colorpicker/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/contextmenu/plugin.js +100 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/contextmenu/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/directionality/plugin.js +64 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/directionality/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-cool.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-cry.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-embarassed.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-foot-in-mouth.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-frown.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-innocent.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-kiss.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-laughing.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-money-mouth.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-sealed.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-smile.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-surprised.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-tongue-out.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-undecided.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-wink.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/img/smiley-yell.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/plugin.js +65 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/emoticons/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/fullpage/plugin.js +490 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/fullpage/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/fullscreen/plugin.js +154 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/fullscreen/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/hr/plugin.js +30 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/hr/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/image/plugin.js +630 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/image/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/imagetools/plugin.js +2944 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/imagetools/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/importcss/plugin.js +273 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/importcss/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/insertdatetime/plugin.js +121 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/insertdatetime/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/layer/plugin.js +225 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/layer/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/legacyoutput/plugin.js +208 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/legacyoutput/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/link/plugin.js +403 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/link/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/lists/plugin.js +965 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/lists/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/media/moxieplayer.swf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/media/plugin.js +879 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/media/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/nonbreaking/plugin.js +53 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/nonbreaking/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/noneditable/plugin.js +101 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/noneditable/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/pagebreak/plugin.js +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/pagebreak/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/paste/plugin.js +1844 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/paste/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/preview/plugin.js +101 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/preview/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/print/plugin.js +32 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/print/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/save/plugin.js +98 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/save/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/searchreplace/plugin.js +609 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/searchreplace/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/spellchecker/plugin.js +1031 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/spellchecker/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/tabfocus/plugin.js +120 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/tabfocus/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/table/plugin.js +4400 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/table/plugin.min.js +2 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/template/plugin.js +276 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/template/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/textcolor/plugin.js +297 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/textcolor/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/textpattern/plugin.js +268 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/textpattern/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/visualblocks/css/visualblocks.css +135 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/visualblocks/plugin.js +86 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/visualblocks/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/visualchars/plugin.js +123 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/visualchars/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/wordcount/plugin.js +69 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/plugins/wordcount/plugin.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/Variables.less +196 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/content.inline.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/content.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/readme.md +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce-small.eot +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce-small.json +1277 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce-small.svg +63 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce-small.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce-small.woff +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce.eot +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce.json +1972 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce.svg +98 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/fonts/tinymce.woff +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/img/anchor.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/img/loader.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/img/object.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/img/trans.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/skin.ie7.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/skin.json +79 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/gray-flat/skin.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/content.inline.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/content.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/fonts/tinymce-small.eot +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/fonts/tinymce-small.svg +63 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/fonts/tinymce-small.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/fonts/tinymce-small.woff +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/fonts/tinymce.eot +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/fonts/tinymce.svg +129 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/fonts/tinymce.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/fonts/tinymce.woff +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/img/anchor.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/img/loader.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/img/object.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/img/trans.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/skin.ie7.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/skins/lightgray/skin.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/themes/inlite/theme.js +1828 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/themes/inlite/theme.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/themes/modern/theme.js +934 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/themes/modern/theme.min.js +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/dist/vendor/tinymce.min.js +14 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/editor.html +63 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/favicon.ico +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/index.html +368 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/package.json +92 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/img/byvoxmail.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/img/mosaico-badge.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/img/mosaico-v.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/img/mosaico32.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/img/mosaicologo.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/img/screenshot-orig.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/img/screenshot.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/lang/README.md +26 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/lang/mosaico-de.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/lang/mosaico-en.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/lang/mosaico-es.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/lang/mosaico-fr.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/lang/mosaico-it.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/lang/mosaico-nl.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/lang/mosaico-sv.json +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/Variables.less +196 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/content.inline.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/content.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/readme.md +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce-small.eot +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce-small.json +1277 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce-small.svg +63 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce-small.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce-small.woff +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce.eot +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce.json +1972 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce.svg +98 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce.ttf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/fonts/tinymce.woff +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/img/anchor.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/img/loader.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/img/object.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/img/trans.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/skin.ie7.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/skin.json +79 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/res/vendor/skins/gray-flat/skin.min.css +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/server-config.js +12 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/spec/converter-spec.js +115 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/spec/data/template-versafix-1.model.json +137 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/spec/declarations-spec.js +282 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/spec/mensch-spec.js +114 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/spec/model-spec.js +88 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/spec/stylesheet-spec.js +177 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/app_standalone.less +7 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/app_standalone_material.less +350 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/safarihack.css +17 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_elements.less +497 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_elements_jquery.less +344 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_elements_mixins.less +406 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_elements_moxie.less +130 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_mosaico.less +529 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_mosaico_content.less +391 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_mosaico_tools.less +1043 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_reset.less +45 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/css/style_variables.less +156 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/app.js +167 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/bind-iframe.js +64 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/blocks.js +118 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/choose-template.js +7 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/colorpicker.js +58 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/csstext.js +16 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/droppable.js +87 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/eventable.js +33 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/extender-pagination.js +60 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/extsortables.js +103 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/fileupload.js +373 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/if-subs.js +110 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/jqueryui-spinner.js +31 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/jqueryui-tabs.js +17 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/script-template.js +30 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/scrollfix.js +48 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/scrollintoview.js +83 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/string-template.js +76 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/tooltips.js +36 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/validated-value.js +40 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/virtuals.js +102 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/bindings/wysiwygs.js +304 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/checkmodel.js +114 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/declarations.js +279 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/domutils.js +93 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/editor.js +411 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/main.js +42 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/model.js +536 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/parser.js +485 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/stylesheet.js +205 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/utils.js +156 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/converter/wrapper.js +308 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/ext/color.js +53 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/ext/inliner.js +35 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/ext/localstorage.js +100 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/ko-bindings.js +22 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/template-loader.js +446 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/timed-call.js +31 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/undomanager/undomain.js +49 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/undomanager/undoserializer.js +120 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/js/viewmodel.js +595 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/array.tmpl.html +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/block-show.tmpl.html +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/block-wysiwyg.tmpl.html +18 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/blocks-show.tmpl.html +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/blocks-wysiwyg.tmpl.html +2 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/customstyle.tmpl.html +3 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/empty.tmpl.html +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/error.tmpl.html +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/gallery-images.tmpl.html +16 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/img-wysiwyg.tmpl.html +43 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/main.tmpl.html +102 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/src/tmpl/toolbox.tmpl.html +111 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/tasks/combineKOTemplates.js +24 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/tasks/lib/phantom-thumbnailer-editor.js +168 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/tasks/makeThumbs.js +79 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/README.md +1 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/edres/_full.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/edres/footerBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/edres/headerBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/edres/heroBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/edres/socialBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/edres/threetwoBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/edres/twoColumnBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tedc15/template-tedc15.html +567 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/edres/HeaderAndText.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/edres/_full.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/edres/fixedlist.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/mosaico-tutorial.md +335 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/mosaico-tutorial.pdf +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/screenshot_384.jpg +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/screenshot_385.jpg +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/screenshot_386.jpg +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/screenshot_387.jpg +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/screenshot_407.jpg +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/screenshot_408.jpg +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/tutorial/template-tutorial.html +68 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/_full.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/buttonBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/doubleArticleBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/doubleImageBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/hrBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/imageBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/logoBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/sideArticleBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/singleArticleBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/socialBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/spacerBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/textBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/titleBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/tripleArticleBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/edres/tripleImageBlock.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/facebook_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/facebook_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/flickr_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/flickr_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/google+_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/google+_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/instagram_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/instagram_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/linkedin_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/linkedin_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/twitter_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/twitter_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/vimeo_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/vimeo_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/web_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/web_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/youtube_bw_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/social_def/youtube_ok.png +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/img/sponsor.gif +0 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/templates/versafix-1/template-versafix-1.html +1531 -0
- data/vendor/assets/mosaico-0.16.0/mosaico/uploads/README.md +1 -0
- metadata +536 -0
@@ -0,0 +1,1517 @@
|
|
1
|
+
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Mosaico = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
2
|
+
(function (global){
|
3
|
+
function log(){}function info(){console.log.apply(console,arguments)}function warn(){console.log.apply(console,arguments)}function error(){console.warn.apply(console,arguments)}function time(e){times[e]=Date.now()}function timeEnd(e){var t=times[e];if(!t)throw new Error("No such label: "+e);var o=Date.now()-t;console.log(e+": "+o+"ms")}function trace(){var e=new Error;e.name="Trace",e.message=util.format.apply(null,arguments),console.error(e.stack)}function dir(e){console.log(util.inspect(e)+"\n")}function assert(e){if(!e){var t=slice.call(arguments,1);assert.ok(!1,util.format.apply(null,t))}}var util=require("util"),assert=require("assert"),slice=Array.prototype.slice,console,times={};console="undefined"!=typeof global&&global.console?global.console:"undefined"!=typeof window&&window.console?window.console:{};for(var functions=[[log,"log"],[info,"info"],[warn,"warn"],[error,"error"],[time,"time"],[timeEnd,"timeEnd"],[trace,"trace"],[dir,"dir"],[assert,"assert"]],i=0;i<functions.length;i++){var tuple=functions[i],f=tuple[0],name=tuple[1];console[name]||(console[name]=f)}module.exports=console;
|
4
|
+
|
5
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
6
|
+
|
7
|
+
},{"assert":21,"util":26}],2:[function(require,module,exports){
|
8
|
+
!function(e){var t=0,o=window.navigator.userAgent,n=o.indexOf("MSIE ")>0,i=n?"-ie":"",a=n?!1:/mozilla/.test(o.toLowerCase())&&!/webkit/.test(o.toLowerCase()),r=[],l=["ffffff","000000","eeece1","1f497d","4f81bd","c0504d","9bbb59","8064a2","4bacc6","f79646"],s=["f2f2f2","7f7f7f","ddd9c3","c6d9f0","dbe5f1","f2dcdb","ebf1dd","e5e0ec","dbeef3","fdeada","d8d8d8","595959","c4bd97","8db3e2","b8cce4","e5b9b7","d7e3bc","ccc1d9","b7dde8","fbd5b5","bfbfbf","3f3f3f","938953","548dd4","95b3d7","d99694","c3d69b","b2a2c7","92cddc","fac08f","a5a5a5","262626","494429","17365d","366092","953734","76923c","5f497a","31859b","e36c09","7f7f7f","0c0c0c","1d1b10","0f243e","244061","632423","4f6128","3f3151","205867","974806"],d=["c00000","ff0000","ffc000","ffff00","92d050","00b050","00b0f0","0070c0","002060","7030a0"],u=[["003366","336699","3366cc","003399","000099","0000cc","000066"],["006666","006699","0099cc","0066cc","0033cc","0000ff","3333ff","333399"],["669999","009999","33cccc","00ccff","0099ff","0066ff","3366ff","3333cc","666699"],["339966","00cc99","00ffcc","00ffff","33ccff","3399ff","6699ff","6666ff","6600ff","6600cc"],["339933","00cc66","00ff99","66ffcc","66ffff","66ccff","99ccff","9999ff","9966ff","9933ff","9900ff"],["006600","00cc00","00ff00","66ff99","99ffcc","ccffff","ccccff","cc99ff","cc66ff","cc33ff","cc00ff","9900cc"],["003300","009933","33cc33","66ff66","99ff99","ccffcc","ffffff","ffccff","ff99ff","ff66ff","ff00ff","cc00cc","660066"],["333300","009900","66ff33","99ff66","ccff99","ffffcc","ffcccc","ff99cc","ff66cc","ff33cc","cc0099","993399"],["336600","669900","99ff33","ccff66","ffff99","ffcc99","ff9999","ff6699","ff3399","cc3399","990099"],["666633","99cc00","ccff33","ffff66","ffcc66","ff9966","ff6666","ff0066","d60094","993366"],["a58800","cccc00","ffff00","ffcc00","ff9933","ff6600","ff0033","cc0066","660033"],["996633","cc9900","ff9900","cc6600","ff3300","ff0000","cc0000","990033"],["663300","996600","cc3300","993300","990000","800000","993333"]],c="#0000ffff",f=function(e){var t=e.toString(16);return 1==t.length&&(t="0"+t),t},p=function(e){return f(Number(e))},b=function(e){var t=f(e);return t+t+t},m=function(e){if(e.length>10){var t=1+e.indexOf("("),o=e.indexOf(")"),n=e.substring(t,o).split(",");return["#",p(n[0]),p(n[1]),p(n[2])].join("")}return e};e.widget("evol.colorpicker",{version:"3.2.1",options:{color:null,showOn:"both",hideButton:!1,displayIndicator:!0,transparentColor:!1,history:!0,defaultPalette:"theme",strings:"Theme Colors,Standard Colors,Web Colors,Theme Colors,Back to Palette,History,No history yet."},_active:!1,_create:function(){var o=this;switch(this._paletteIdx="theme"==this.options.defaultPalette?1:2,this._id="evo-cp"+t++,this._enabled=!0,this.options.showOn=this.options.hideButton?"focus":this.options.showOn,this.element.get(0).tagName){case"INPUT":var r=this.options.color,l=this.element,s=("focus"===this.options.showOn?"":"evo-pointer ")+"evo-colorind"+(a?"-ff":i)+(this.options.hideButton?" evo-hidden-button":""),d="";if(this._isPopup=!0,this._palette=null,null!==r)l.val(r);else{var u=l.val();""!==u&&(r=this.options.color=u)}r===c?s+=" evo-transparent":d=null!==r?"background-color:"+r:"",l.addClass("colorPicker "+this._id).wrap('<div style="width:'+(this.options.hideButton?this.element.width():this.element.width()+32)+"px;"+(n?"margin-bottom:-21px;":"")+(a?"padding:1px 0;":"")+'"></div>').after('<div class="'+s+'" style="'+d+'"></div>').on("keyup onpaste",function(){var t=e(this).val();t!=o.options.color&&o._setValue(t,!0)});var f=this.options.showOn;("both"===f||"focus"===f)&&l.on("focus",function(){o.showPalette()}),("both"===f||"button"===f)&&l.next().on("click",function(e){return e.stopPropagation(),o.showPalette(),!1});break;default:this._isPopup=!1,this._palette=this.element.html(this._paletteHTML()).attr("aria-haspopup","true"),this._bindColors()}if(this.options.history&&(r&&this._add2History(r),this.options.initialHistory)){var p=this.options.initialHistory;for(var b in p)this._add2History(p[b])}},_paletteHTML:function(){var e=this._paletteIdx=Math.abs(this._paletteIdx),t=this.options,o=t.strings.split(","),n='<div class="evo-pop'+i+' ui-widget ui-widget-content ui-corner-all"'+(this._isPopup?' style="position:absolute"':"")+"><span>"+this["_paletteHTML"+e]()+'</span><div class="evo-more"><a href="javascript:void(0)">'+o[1+e]+"</a>";return t.history&&(n+='<a href="javascript:void(0)" class="evo-hist">'+o[5]+"</a>"),n+="</div>",t.displayIndicator&&(n+=this._colorIndHTML(this.options.color)+this._colorIndHTML("")),n+="</div>"},_colorIndHTML:function(e){var t=n?"evo-colorbox-ie ":"",o="";return e?e===c?t+="evo-transparent":o="background-color:"+e:o="display:none",'<div class="evo-color" style="float:left"><div style="'+o+'" class="'+t+'"></div><span>'+(e?e:"")+"</span></div>"},_paletteHTML1:function(){for(var e=this.options,t=e.strings.split(","),o='<td style="background-color:#',a=n?'"><div style="width:2px;"></div></td>':'"><span/></td>',r='<tr><th colspan="10" class="ui-widget-content">',u='<table class="evo-palette'+i+'">'+r+t[0]+"</th></tr><tr>",c=0;10>c;c++)u+=o+l[c]+a;for(u+="</tr>",n||(u+='<tr><th colspan="10"></th></tr>'),u+='<tr class="top">',c=0;10>c;c++)u+=o+s[c]+a;for(var f=1;4>f;f++)for(u+='</tr><tr class="in">',c=0;10>c;c++)u+=o+s[10*f+c]+a;for(u+='</tr><tr class="bottom">',c=40;50>c;c++)u+=o+s[c]+a;for(u+="</tr>"+r,e.transparentColor&&(u+='<div class="evo-transparent evo-tr-box"></div>'),u+=t[1]+"</th></tr><tr>",c=0;10>c;c++)u+=o+d[c]+a;return u+="</tr></table>"},_paletteHTML2:function(){for(var e,t,o='<td style="background-color:#',a=n?'"><div style="width:5px;"></div></td>':'"><span/></td>',r='<table class="evo-palette2'+i+'"><tr>',l="</tr></table>",s='<div class="evo-palcenter">',d=0,c=u.length;c>d;d++){s+=r;var f=u[d];for(e=0,t=f.length;t>e;e++)s+=o+f[e]+a;s+=l}s+='<div class="evo-sep"/>';var p="";for(s+=r,e=255;e>10;e-=10)s+=o+b(e)+a,e-=10,p+=o+b(e)+a;return s+=l+r+p+l+"</div>"},_switchPalette:function(t){if(this._enabled){var o,n,i,a=this.options.strings.split(",");if(e(t).hasClass("evo-hist")){var l=['<table class="evo-palette"><tr><th class="ui-widget-content">',a[5],"</th></tr></tr></table>",'<div class="evo-cHist">'];if(0===r.length)l.push("<p> ",a[6],"</p>");else for(var s=r.length-1;s>-1;s--)9===r[s].length?l.push('<div class="evo-transparent"></div>'):l.push('<div style="background-color:',r[s],'"></div>');l.push("</div>"),o=-this._paletteIdx,n=l.join(""),i=a[4]}else this._paletteIdx<0?(o=-this._paletteIdx,this._palette.find(".evo-hist").show()):o=2==this._paletteIdx?1:2,n=this["_paletteHTML"+o](),i=a[o+1],this._paletteIdx=o;this._paletteIdx=o;var d=this._palette.find(".evo-more").prev().html(n).end().children().eq(0).html(i);0>o&&d.next().hide()}},_downOrUpPositioning:function(){for(var e=this.element,t=0;null!==e&&100>t;){if("visible"!=e.css("overflow")){var o=this._palette.offset().top+this._palette.height(),n=e.offset().top+e.height(),i=this._palette.offset().top-this._palette.height()-this.element.outerHeight(),a=e.offset().top,r=o>n&&i>a;r?this._palette.css({bottom:this.element.outerHeight()+"px"}):this._palette.css({bottom:"auto"});break}if("HTML"==e[0].tagName)break;e=e.offsetParent(),t++}},showPalette:function(){if(this._enabled&&(this._active=!0,e(".colorPicker").not("."+this._id).colorpicker("hidePalette"),null===this._palette)){this._palette=this.element.next().after(this._paletteHTML()).next().on("click",function(e){return e.stopPropagation(),!1}),this._bindColors();var t=this;this._isPopup&&(this._downOrUpPositioning(),e(document.body).on("click."+t._id,function(e){e.target!=t.element.get(0)&&t.hidePalette()}).on("keyup."+t._id,function(e){27===e.keyCode&&t.hidePalette()}))}return this},hidePalette:function(){if(this._isPopup&&this._palette){e(document.body).off("click."+this._id);var t=this;this._palette.off("mouseover click","td,.evo-transparent").fadeOut(function(){t._palette.remove(),t._palette=t._cTxt=null}).find(".evo-more a").off("click")}return this},_bindColors:function(){var t=this,o=this.options,n=this._palette.find("div.evo-color"),i=o.history?"td,.evo-cHist>div":"td";o.transparentColor&&(i+=",.evo-transparent"),this._cTxt1=n.eq(0).children().eq(0),this._cTxt2=n.eq(1).children().eq(0),this._palette.on("click",i,function(){if(t._enabled){var o=e(this);t._setValue(o.hasClass("evo-transparent")?c:m(o.attr("style").substring(17))),t._active=!1}}).on("mouseover",i,function(){if(t._enabled){var o=e(this),n=o.hasClass("evo-transparent")?c:m(o.attr("style").substring(17));t.options.displayIndicator&&t._setColorInd(n,2),t._active&&t.element.trigger("mouseover.color",n)}}).find(".evo-more a").on("click",function(){t._switchPalette(this)})},val:function(e){return"undefined"==typeof e?this.options.color:(this._setValue(e),this)},_setValue:function(e,t){e=e.replace(/ /g,""),this.options.color=e,this._isPopup?(t||this.hidePalette(),this._setBoxColor(this.element.val(e).next(),e)):this._setColorInd(e,1),this.options.history&&this._paletteIdx>0&&this._add2History(e),this.element.trigger("change.color",e)},_setColorInd:function(e,t){var o=this["_cTxt"+t];this._setBoxColor(o,e),o.next().html(e)},_setBoxColor:function(e,t){t===c?e.addClass("evo-transparent").removeAttr("style"):e.removeClass("evo-transparent").attr("style","background-color:"+t)},_setOption:function(e,t){"color"==e?this._setValue(t,!0):this.options[e]=t},_add2History:function(e){for(var t=r.length,o=0;t>o;o++)if(e==r[o])return;t>27&&r.shift(),r.push(e)},clear:function(){this.hidePalette().val("")},enable:function(){var e=this.element;return this._isPopup?e.removeAttr("disabled"):e.css({opacity:"1","pointer-events":"auto"}),"focus"!==this.options.showOn&&this.element.next().addClass("evo-pointer"),e.removeAttr("aria-disabled"),this._enabled=!0,this},disable:function(){var e=this.element;return this._isPopup?e.attr("disabled","disabled"):(this.hidePalette(),e.css({opacity:"0.3","pointer-events":"none"})),"focus"!==this.options.showOn&&this.element.next().removeClass("evo-pointer"),e.attr("aria-disabled","true"),this._enabled=!1,this},isDisabled:function(){return!this._enabled},destroy:function(){e(document.body).off("click."+this._id),this._palette&&(this._palette.off("mouseover click","td,.evo-cHist>div,.evo-transparent").find(".evo-more a").off("click"),this._isPopup&&this._palette.remove(),this._palette=this._cTxt=null),this._isPopup&&this.element.next().off("click").remove().end().off("focus").unwrap(),this.element.removeClass("colorPicker "+this.id).empty(),e.Widget.prototype.destroy.call(this)}})}(jQuery);
|
9
|
+
|
10
|
+
},{}],3:[function(require,module,exports){
|
11
|
+
!function(e){"use strict";var t="Compound",o="Identifier",n="MemberExpression",r="Literal",i="ThisExpression",a="CallExpression",l="UnaryExpression",s="BinaryExpression",d="LogicalExpression",u="ConditionalExpression",c="ArrayExpression",f=46,p=44,b=39,m=34,g=40,h=41,v=91,y=93,k=63,w=59,x=58,_=function(e,t){var o=new Error(e+" at character "+t);throw o.index=t,o.description=e,o},S=!0,O={"-":S,"!":S,"~":S,"+":S},C={"||":1,"&&":2,"|":3,"^":4,"&":5,"==":6,"!=":6,"===":6,"!==":6,"<":7,">":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10},$=function(e){var t,o=0;for(var n in e)(t=n.length)>o&&e.hasOwnProperty(n)&&(o=t);return o},T=$(O),E=$(C),A={"true":!0,"false":!1,"null":null},D="this",M=function(e){return C[e]||0},j=function(e,t,o){var n="||"===e||"&&"===e?d:s;return{type:n,operator:e,left:t,right:o}},P=function(e){return e>=48&&57>=e},B=function(e){return 36===e||95===e||e>=65&&90>=e||e>=97&&122>=e||e>=128&&!C[String.fromCharCode(e)]},H=function(e){return 36===e||95===e||e>=65&&90>=e||e>=97&&122>=e||e>=48&&57>=e||e>=128&&!C[String.fromCharCode(e)]},q=function(e){for(var s,d,S=0,$=e.charAt,q=e.charCodeAt,I=function(t){return $.call(e,t)},R=function(t){return q.call(e,t)},U=e.length,N=function(){for(var e=R(S);32===e||9===e||10===e||13===e;)e=R(++S)},L=function(){var e,t,o=V();return N(),R(S)!==k?o:(S++,e=L(),e||_("Expected expression",S),N(),R(S)===x?(S++,t=L(),t||_("Expected expression",S),{type:u,test:o,consequent:e,alternate:t}):(_("Expected :",S),void 0))},F=function(){N();for(var t=e.substr(S,E),o=t.length;o>0;){if(C.hasOwnProperty(t))return S+=o,t;t=t.substr(0,--o)}return!1},V=function(){var e,t,o,n,r,i,a,l;if(i=z(),t=F(),!t)return i;for(r={value:t,prec:M(t)},a=z(),a||_("Expected expression after "+t,S),n=[i,r,a];(t=F())&&(o=M(t),0!==o);){for(r={value:t,prec:o};n.length>2&&o<=n[n.length-2].prec;)a=n.pop(),t=n.pop().value,i=n.pop(),e=j(t,i,a),n.push(e);e=z(),e||_("Expected expression after "+t,S),n.push(r,e)}for(l=n.length-1,e=n[l];l>1;)e=j(n[l-1].value,n[l-2],e),l-=2;return e},z=function(){var t,o,n;if(N(),t=R(S),P(t)||t===f)return G();if(t===b||t===m)return W();if(B(t)||t===g)return Z();if(t===v)return Q();for(o=e.substr(S,T),n=o.length;n>0;){if(O.hasOwnProperty(o))return S+=n,{type:l,operator:o,argument:z(),prefix:!0};o=o.substr(0,--n)}return!1},G=function(){for(var e,t,o="";P(R(S));)o+=I(S++);if(R(S)===f)for(o+=I(S++);P(R(S));)o+=I(S++);if(e=I(S),"e"===e||"E"===e){for(o+=I(S++),e=I(S),("+"===e||"-"===e)&&(o+=I(S++));P(R(S));)o+=I(S++);P(R(S-1))||_("Expected exponent ("+o+I(S)+")",S)}return t=R(S),B(t)?_("Variable names cannot start with a number ("+o+I(S)+")",S):t===f&&_("Unexpected period",S),{type:r,value:parseFloat(o),raw:o}},W=function(){for(var e,t="",o=I(S++),n=!1;U>S;){if(e=I(S++),e===o){n=!0;break}if("\\"===e)switch(e=I(S++)){case"n":t+="\n";break;case"r":t+="\r";break;case"t":t+=" ";break;case"b":t+="\b";break;case"f":t+="\f";break;case"v":t+="";break;default:t+="\\"+e}else t+=e}return n||_('Unclosed quote after "'+t+'"',S),{type:r,value:t,raw:o+t+o}},J=function(){var t,n=R(S),a=S;for(B(n)?S++:_("Unexpected "+I(S),S);U>S&&(n=R(S),H(n));)S++;return t=e.slice(a,S),A.hasOwnProperty(t)?{type:r,value:A[t],raw:t}:t===D?{type:i}:{type:o,name:t}},Y=function(e){for(var o,n,r=[],i=!1;U>S;){if(N(),o=R(S),o===e){i=!0,S++;break}o===p?S++:(n=L(),n&&n.type!==t||_("Expected comma",S),r.push(n))}return i||_("Expected "+String.fromCharCode(e),S),r},Z=function(){var e,t;for(e=R(S),t=e===g?X():J(),N(),e=R(S);e===f||e===v||e===g;)S++,e===f?(N(),t={type:n,computed:!1,object:t,property:J()}):e===v?(t={type:n,computed:!0,object:t,property:L()},N(),e=R(S),e!==y&&_("Unclosed [",S),S++):e===g&&(t={type:a,arguments:Y(h),callee:t}),N(),e=R(S);return t},X=function(){S++;var e=L();return N(),R(S)===h?(S++,e):(_("Unclosed (",S),void 0)},Q=function(){return S++,{type:c,elements:Y(y)}},K=[];U>S;)s=R(S),s===w||s===p?S++:(d=L())?K.push(d):U>S&&_('Unexpected "'+I(S)+'"',S);return 1===K.length?K[0]:{type:t,body:K}};if(q.version="<%= version %>",q.toString=function(){return"JavaScript Expression Parser (JSEP) v"+q.version},q.addUnaryOp=function(e){return T=Math.max(e.length,T),O[e]=S,this},q.addBinaryOp=function(e,t){return E=Math.max(e.length,E),C[e]=t,this},q.addLiteral=function(e,t){return A[e]=t,this},q.removeUnaryOp=function(e){return delete O[e],e.length===T&&(T=$(O)),this},q.removeAllUnaryOps=function(){return O={},T=0,this},q.removeBinaryOp=function(e){return delete C[e],e.length===E&&(E=$(C)),this},q.removeAllBinaryOps=function(){return C={},E=0,this},q.removeLiteral=function(e){return delete A[e],this},q.removeAllLiterals=function(){return A={},this},"undefined"==typeof exports){var I=e.jsep;e.jsep=q,q.noConflict=function(){return e.jsep===q&&(e.jsep=I),q}}else"undefined"!=typeof module&&module.exports?exports=module.exports=q:exports.parse=q}(this);
|
12
|
+
|
13
|
+
},{}],4:[function(require,module,exports){
|
14
|
+
"use strict";var utils=require("./utils");module.exports=function(e){function t(t,i,r){function l(o){for(var i=o[0],l=o[1],s=new utils.Selector(i),d=s.parsed(),c=n(d),u=0;u<d.length;++u){var p=d[u];if(p.pseudos)for(var m=0;m<p.pseudos.length;++m){var g=p.pseudos[m];if(e.ignoredPseudos.indexOf(g.name)>=0)return}}if(c){var h=d[d.length-1],v=h.pseudos;h.pseudos=a(h.pseudos),i=d.toString(),h.pseudos=v}var y;try{y=t(i)}catch(k){return}y.each(function(){function o(t,o){for(var i=0,a=t.length;a>i;i++)if("property"==t[i].type){var l=t[i].name,s=t[i].value,d=null!==t[i].value.match(/!important$/);d&&!r.preserveImportant&&(s=s.replace(/\s*!important$/,""));var c=[t[i].position.start.line,t[i].position.start.col],u=new utils.Property(l,s,o,d?2:0,c),p=n.styleProps[l];e.excludedProperties.indexOf(l)<0&&(p&&p.compare(u)===u||!p)&&(p&&p.selector!==o?delete n.styleProps[l]:p&&(u.nextProp=p),n.styleProps[l]=u)}}var n=this;if(!(n.name&&e.nonVisualElements.indexOf(n.name.toUpperCase())>=0)){if(c){var i="pseudo"+c,a=n[i];a||(a=n[i]=t("<span />").get(0),a.pseudoElementType=c,a.pseudoElementParent=n,n[i]=a),n=a}if(!n.styleProps){if(n.styleProps={},t(n).attr(b)){var d="* { "+t(n).attr(b)+" } ";o(utils.parseCSS(d)[0][1],new utils.Selector("<style>",!0))}f.push(n)}o(l,s)}})}function s(e){Object.keys(e.styleProps).length;var o=[];Object.keys(e.styleProps).forEach(function(t){for(var n=e.styleProps[t];"undefined"!=typeof n;)o.push(n),n=n.nextProp}),o.sort(function(e,t){return e.compareFunc(t)});var n=o.filter(function(e){return"content"!==e.prop}).map(function(e){return e.prop+": "+e.value.replace(/["]/g,"'")+";"}).join(" ");n&&t(e).attr(b,n)}function d(e){if(e.pseudoElementType&&e.styleProps.content){var n=o(e.styleProps.content.value);n.img?(e.name="img",t(e).attr("src",n.img)):t(e).text(n);var i=e.pseudoElementParent;"before"===e.pseudoElementType?t(i).prepend(e):t(i).append(e)}}function c(o,n){if(o.name){var i=o.name.toUpperCase();if(e[n+"Elements"].indexOf(i)>-1)for(var a in o.styleProps)if(o.styleProps[a].prop===n){if(o.styleProps[a].value.match(/px/)){var r=o.styleProps[a].value.replace("px","");return t(o).attr(n,r),void 0}if(e.tableElements.indexOf(i)>-1&&o.styleProps[a].value.match(/\%/))return t(o).attr(n,o.styleProps[a].value),void 0}}}function u(o){if(o.name){var n=o.name.toUpperCase(),i=Object.keys(e.styleToAttribute);if(e.tableElements.indexOf(n)>-1)for(var a in o.styleProps)i.indexOf(o.styleProps[a].prop)>-1&&t(o).attr(e.styleToAttribute[o.styleProps[a].prop],o.styleProps[a].value)}}r=r||{};var p=utils.parseCSS(i),f=[],b="style";if(r.styleAttributeName&&(b=r.styleAttributeName),p.forEach(l),f.forEach(s),r.inlinePseudoElements&&f.forEach(d),r.applyWidthAttributes&&f.forEach(function(e){c(e,"width")}),r.applyHeightAttributes&&f.forEach(function(e){c(e,"height")}),r.applyAttributesTableElements&&f.forEach(u),r.insertPreservedExtraCss&&r.extraCss){var m=utils.getPreservedText(r.extraCss,{mediaQueries:r.preserveMediaQueries,fontFaces:r.preserveFontFaces});if(m){var g=null;r.insertPreservedExtraCss!==!0?g=t(r.insertPreservedExtraCss):(g=t("head"),g.length||(g=t("body")),g.length||(g=t.root())),g.first().append("<style>"+m+"</style>")}}}function o(e){if("none"===e||"normal"===e)return"";var t=e.match(/^\s*url\s*\(\s*(.*?)\s*\)\s*$/i);if(t){var o=t[1].replace(/^['"]|['"]$/g,"");return{img:o}}return e=e.slice(1,e.length-1),e=e.replace(/\\/g,"")}function n(e){if(0!==e.length){var t=e[e.length-1].pseudos;if(t)for(var o=0;o<t.length;o++)if(i(t[o]))return t[o].name}}function i(e){return"before"===e.name||"after"===e.name}function a(e){return e.filter(function(e){return!i(e)})}function r(e,o){o=utils.getDefaultOptions(o);var n=s(e,o);return n+="\n"+o.extraCss,t(e,n,o),e}function l(e,t){var o,n,i,a=[],r=e("style");return r.each(function(){if(i=this,o=i.childNodes,1===o.length){if(n=o[0].data,t.applyStyleTags&&void 0===e(i).attr("data-embed")&&a.push(n),t.removeStyleTags&&void 0===e(i).attr("data-embed")){var r=utils.getPreservedText(i.childNodes[0].nodeValue,{mediaQueries:t.preserveMediaQueries,fontFaces:t.preserveFontFaces});r?i.childNodes[0].nodeValue=r:e(i).remove()}e(i).removeAttr("data-embed")}}),a}function s(e,t){var o=l(e,t),n=o.join("\n");return n}return e.ignoredPseudos=["hover","active","focus","visited","link"],e.widthElements=["TABLE","TD","IMG"],e.heightElements=["TABLE","TD","IMG"],e.tableElements=["TABLE","TD","TH","TR","TD","CAPTION","COLGROUP","COL","THEAD","TBODY","TFOOT"],e.nonVisualElements=["HEAD","TITLE","BASE","LINK","STYLE","META","SCRIPT","NOSCRIPT"],e.styleToAttribute={"background-color":"bgcolor","background-image":"background","text-align":"align","vertical-align":"valign"},e.excludedProperties=[],e.juiceDocument=r,e.inlineDocument=t,e};
|
15
|
+
|
16
|
+
},{"./utils":7}],5:[function(require,module,exports){
|
17
|
+
"use strict";function Property(e,t,o,n,i){this.prop=e,this.value=t,this.selector=o,this.priority=n||0,this.additionalPriority=i||[]}module.exports=exports=Property;var utils=require("./utils");Property.prototype.compareFunc=function(e){var t=[];t.push.apply(t,this.selector.specificity()),t.push.apply(t,this.additionalPriority),t[0]+=this.priority;var o=[];return o.push.apply(o,e.selector.specificity()),o.push.apply(o,e.additionalPriority),o[0]+=e.priority,utils.compareFunc(t,o)},Property.prototype.compare=function(e){var t=this.compareFunc(e);return 1===t?this:e},Property.prototype.toString=function(){return this.prop+": "+this.value.replace(/['"]+/g,"")+";"};
|
18
|
+
|
19
|
+
},{"./utils":7}],6:[function(require,module,exports){
|
20
|
+
"use strict";function Selector(e,t){this.text=e,this.spec=void 0,this.styleAttribute=t||!1}function parse(e){try{return parser(e)[0]}catch(t){return[]}}var parser=require("./../../slick/parser");module.exports=exports=Selector,Selector.prototype.parsed=function(){return this.tokens||(this.tokens=parse(this.text)),this.tokens},Selector.prototype.specificity=function(){function e(o,n){for(var i=n||parse(o),r=[t?1:0,0,0,0],a=[],l=0;l<i.length;l++){var s=i[l],d=s.pseudos;if(s.id&&r[1]++,s.attributes&&(r[2]+=s.attributes.length),s.classList&&(r[2]+=s.classList.length),s.tag&&"*"!==s.tag&&r[3]++,d){r[3]+=d.length;for(var u=0;u<d.length;u++)"not"===d[u].name&&(a.push(d[u].value),r[3]--)}}for(var c=a.length;c--;)for(var f=e(a[c]),p=4;p--;)r[p]+=f[p];return r}var t=this.styleAttribute;return this.spec||(this.spec=e(this.text,this.parsed())),this.spec};
|
21
|
+
|
22
|
+
},{"./../../slick/parser":17}],7:[function(require,module,exports){
|
23
|
+
"use strict";var mensch=require("./../../mensch/index.js"),own={}.hasOwnProperty,os=require("os"),Selector=require("./selector"),Property=require("./property");exports.Selector=Selector,exports.Property=Property,exports.extract=function(e){for(var t=0,o=[],n="",i=0,r=e.length;r>i;i++){var a=e.charAt(i);t?(("]"===a||")"===a)&&t--,n+=a):","===a?(o.push(n),n=""):(("["===a||"("===a)&&t++,(n.length||","!==a&&"\n"!==a&&" "!==a)&&(n+=a))}return n.length&&o.push(n),o},exports.parseCSS=function(e){for(var t=mensch.parse(e,{position:!0,comments:!0}),o="undefined"!=typeof t.stylesheet&&t.stylesheet.rules?t.stylesheet.rules:[],n=[],i=0,r=o.length;r>i;i++)if("rule"==o[i].type)for(var a=o[i],l=a.selectors,s=0,d=l.length;d>s;s++)n.push([l[s],a.declarations]);return n},exports.getPreservedText=function(e,t){for(var o=mensch.parse(e,{position:!0,comments:!0}),n="undefined"!=typeof o.stylesheet&&o.stylesheet.rules?o.stylesheet.rules:[],i=[],r=null,a=n.length-1;a>=0;a--)(t.fontFaces&&"font-face"===n[a].type||t.mediaQueries&&"media"===n[a].type)&&i.push(mensch.stringify({stylesheet:{rules:[n[a]]}},{comments:!1,indentation:" "})),r=n[a].position.start;return 0===i.length?!1:os.EOL+i.join(os.EOL)+os.EOL},exports.normalizeLineEndings=function(e){return e.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n")},exports.compareFunc=function(e,t){for(var o=Math.min(e.length,t.length),n=0;o>n;n++)if(e[n]!==t[n])return e[n]>t[n]?1:-1;return e.length-t.length},exports.compare=function(e,t){return 1==exports.compareFunc(e,t)?e:t},exports.extend=function(e,t){for(var o in t)own.call(t,o)&&(e[o]=t[o]);return e},exports.getDefaultOptions=function(e){var t=exports.extend({extraCss:"",insertPreservedExtraCss:!0,applyStyleTags:!0,removeStyleTags:!0,preserveMediaQueries:!0,preserveFontFaces:!0,applyWidthAttributes:!0,applyHeightAttributes:!0,applyAttributesTableElements:!0,url:""},e);return t.webResources=t.webResources||{},t};
|
24
|
+
|
25
|
+
},{"./../../mensch/index.js":12,"./property":5,"./selector":6,"os":22}],8:[function(require,module,exports){
|
26
|
+
(function (global){
|
27
|
+
!function(e){if("function"==typeof define&&define.amd)define(["knockout","jquery","jquery-ui/sortable","jquery-ui/draggable"],e);else if("function"==typeof require&&"object"==typeof exports&&"object"==typeof module){var t=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),o=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null);(typeof window !== "undefined" ? window['jQuery']['ui']['sortable'] : typeof global !== "undefined" ? global['jQuery']['ui']['sortable'] : null),(typeof window !== "undefined" ? window['jQuery']['ui']['draggable'] : typeof global !== "undefined" ? global['jQuery']['ui']['draggable'] : null),e(t,o)}else e(window.ko,window.jQuery)}(function(e,t){var o="ko_sortItem",a="ko_sourceIndex",i="ko_sortList",n="ko_parentList",l="ko_dragItem",r=e.utils.unwrapObservable,d=e.utils.domData.get,s=e.utils.domData.set,c=t.ui&&t.ui.version,u=c&&c.indexOf("1.6.")&&c.indexOf("1.7.")&&(c.indexOf("1.8.")||"1.8.24"===c),p=function(t,a){e.utils.arrayForEach(t,function(e){1===e.nodeType&&(s(e,o,a),s(e,n,d(e.parentNode,i)))})},m=function(t,o){var a,i={},n=r(t())||{};return n.data?(i[o]=n.data,i.name=n.template):i[o]=t(),e.utils.arrayForEach(["afterAdd","afterRender","as","beforeRemove","includeDestroyed","templateEngine","templateOptions","nodes"],function(t){n.hasOwnProperty(t)?i[t]=n[t]:e.bindingHandlers.sortable.hasOwnProperty(t)&&(i[t]=e.bindingHandlers.sortable[t])}),"foreach"===o&&(i.afterRender?(a=i.afterRender,i.afterRender=function(e,t){p.call(t,e,t),a.call(t,e,t)}):i.afterRender=p),i},b=function(e,t){var o=r(t);if(o)for(var a=0;e>a;a++)o[a]&&r(o[a]._destroy)&&e++;return e},f=function(o,a){var i,n;a?(n=document.getElementById(a),n&&(i=new e.templateSources.domElement(n),i.text(t.trim(i.text())))):t(o).contents().each(function(){this&&1!==this.nodeType&&o.removeChild(this)})};e.bindingHandlers.sortable={init:function(c,p,g,h,v){var k,y,w=t(c),$=r(p())||{},x=m(p,"foreach"),S={};f(c,x.name),t.extend(!0,S,e.bindingHandlers.sortable),$.options&&S.options&&(e.utils.extend(S.options,$.options),delete $.options),e.utils.extend(S,$),S.connectClass&&(e.isObservable(S.allowDrop)||"function"==typeof S.allowDrop)?e.computed({read:function(){var t=r(S.allowDrop),o="function"==typeof t?t.call(this,x.foreach):t;e.utils.toggleDomNodeCssClass(c,S.connectClass,o)},disposeWhenNodeIsRemoved:c},this):e.utils.toggleDomNodeCssClass(c,S.connectClass,S.allowDrop),e.bindingHandlers.template.init(c,function(){return x},g,h,v),k=S.options.start,y=S.options.update,S.options.helper||(S.options.helper=function(e,o){return o.is("tr")&&o.children().each(function(){t(this).width(t(this).width())}),o});var C=setTimeout(function(){var p,m=S.options.receive;w.sortable(e.utils.extend(S.options,{start:function(t,o){var i=o.item[0];s(i,a,e.utils.arrayIndexOf(o.item.parent().children(),i)),o.item.find("input:focus").change(),k&&k.apply(this,arguments)},receive:function(e,t){"function"==typeof m&&m.call(this,e,t),p=d(t.item[0],l),p&&(p.clone&&(p=p.clone()),S.dragged&&(p=S.dragged.call(this,p,e,t)||p))},update:function(l,c){var m,f,g,h,v,k=c.item[0],w=c.item.parent()[0],$=d(k,o)||p;if($||t(k).remove(),p=null,$&&this===w||!u&&t.contains(this,w)){if(m=d(k,n),g=d(k,a),f=d(k.parentNode,i),h=e.utils.arrayIndexOf(c.item.parent().children(),k),x.includeDestroyed||(g=b(g,m),h=b(h,f)),(S.beforeMove||S.afterMove)&&(v={item:$,sourceParent:m,sourceParentNode:m&&c.sender||k.parentNode,sourceIndex:g,targetParent:f,targetIndex:h,cancelDrop:!1},S.beforeMove&&S.beforeMove.call(this,v,l,c)),m?t(m===f?this:c.sender||this).sortable("cancel"):t(k).remove(),v&&v.cancelDrop)return;if(S.hasOwnProperty("strategyMove")&&S.strategyMove!==!1){if(h>=0)if(m)if(m!==f)m.splice(g,1),f.splice(h,0,$),s(k,o,null),c.item.remove();else{var C=r(m);m.valueWillMutate&&m.valueWillMutate(),C.splice(g,1),C.splice(h,0,$),m.valueHasMutated&&m.valueHasMutated()}else f.splice(h,0,$),s(k,o,null),c.item.remove()}else h>=0&&(m&&(m.splice(g,1),e.processAllDeferredBindingUpdates&&e.processAllDeferredBindingUpdates(),e.options&&e.options.deferUpdates&&e.tasks.runEarly()),f.splice(h,0,$)),s(k,o,null);e.processAllDeferredBindingUpdates&&e.processAllDeferredBindingUpdates(),S.afterMove&&S.afterMove.call(this,v,l,c)}y&&y.apply(this,arguments)},connectWith:S.connectClass?"."+S.connectClass:!1})),void 0!==S.isEnabled&&e.computed({read:function(){w.sortable(r(S.isEnabled)?"enable":"disable")},disposeWhenNodeIsRemoved:c})},0);return e.utils.domNodeDisposal.addDisposeCallback(c,function(){(w.data("ui-sortable")||w.data("sortable"))&&w.sortable("destroy"),e.utils.toggleDomNodeCssClass(c,S.connectClass,!1),clearTimeout(C)}),{controlsDescendantBindings:!0}},update:function(t,o,a,n,l){var r=m(o,"foreach");s(t,i,r.foreach),e.bindingHandlers.template.update(t,function(){return r},a,n,l)},connectClass:"ko_container",allowDrop:!0,afterMove:null,beforeMove:null,options:{}},e.bindingHandlers.draggable={init:function(o,a,i,n,d){var c=r(a())||{},u=c.options||{},p=e.utils.extend({},e.bindingHandlers.draggable.options),b=m(a,"data"),f=c.connectClass||e.bindingHandlers.draggable.connectClass,g=void 0!==c.isEnabled?c.isEnabled:e.bindingHandlers.draggable.isEnabled;return c="data"in c?c.data:c,s(o,l,c),e.utils.extend(p,u),p.connectToSortable=f?"."+f:!1,t(o).draggable(p),void 0!==g&&e.computed({read:function(){t(o).draggable(r(g)?"enable":"disable")},disposeWhenNodeIsRemoved:o}),e.utils.domNodeDisposal.addDisposeCallback(o,function(){t(o).draggable("destroy")}),e.bindingHandlers.template.init(o,function(){return b},i,n,d)},update:function(t,o,a,i,n){var l=m(o,"data");return e.bindingHandlers.template.update(t,function(){return l},a,i,n)},connectClass:e.bindingHandlers.sortable.connectClass,options:{helper:"clone"}}});
|
28
|
+
|
29
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
30
|
+
|
31
|
+
},{}],9:[function(require,module,exports){
|
32
|
+
(function (global){
|
33
|
+
!function(e){"function"==typeof require&&"object"==typeof exports&&"object"==typeof module?module.exports=e((typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),require("./../knockoutjs-reactor/src/knockout.reactor.js")):"function"==typeof define&&define.amd?define(["knockout","knockoutjs-reactor","exports"],e):e(ko,ko.watch)}(function(e,t){var o=function(o,n){var i,a=e.observableArray(),r=e.observableArray(),l=0,s=1,d=2,c=l,u=0,p=1,f=2,b=3,g=u,m={levels:100,undoLabel:"undo (#COUNT#)",redoLabel:"redo (#COUNT#)"};n="object"==typeof n?e.utils.extend(m,n):m;var h=function(e){c==s?k(e,r):c==d?k(e,a):c==l&&(k(e,a),r.removeAll())},v=function(e,t){return"undefined"!=typeof e.mergedAction?e.mergedAction(t):null},k=function(e,t){if(t().length>0){var o=v(t()[t().length-1],e);if(null!==o)return t()[t().length-1]=o,void 0}t().length>=n.levels&&t.shift(),i=t,t.push(e)},y=function(t,o,n){return{name:e.computed(function(){return e.utils.unwrapObservable(t).replace(/#COUNT#/,n().length)}),enabled:e.computed(function(){return 0!==n().length}),execute:function(){var e=n.pop();if(e){var t=c;c=o;var a=g;g=b,e(),w(i),g=a,c=t}return!0}}},w=function(e){if("undefined"==typeof e)throw"Unexpected operation: stack cleaner called with undefined stack";e().length>0&&"undefined"!=typeof e()[e().length-1].mergedAction&&delete e()[e().length-1].mergedAction},x=function(e,t){var o=function(e,t){e(),t()}.bind(void 0,e,t);return"undefined"!=typeof e.mergedAction&&(o.mergedAction=e.mergedAction),o},$=function(e,t,o){if("undefined"!=typeof t)e(t);else{if(!o)throw"Unexpected condition: no item and no child.oldValues!";if("deleted"==o.status)e.splice(o.index,0,o.value);else{if("added"!=o.status)throw"Unsupproted item.status: "+o.status;e.splice(o.index,1)}}},_=function(e,t,o,n,i){return e.bind(void 0,o,n,i)},S=_,C=function(e,t,o){var n="undefined"!=typeof t.oldValues?t.oldValues[0]:void 0,i=S($,e,t,n,o);g!=p&&(g==b?"undefined"!=typeof i&&(i.mergedAction=function(e){return"undefined"!=typeof e.mergeMe&&e.mergeMe?x(e,this):null},i.mergeMe=!0):"undefined"!=typeof i&&(t.oldValues&&g==f&&(i.mergedAction=function(e,t,o){return"object"==typeof o.mergeableAction&&e==o.mergeableAction.child?this:null}.bind(i,t,o),i.mergeableAction={child:t,item:o}),o&&"deleted"==o.status&&(i.mergedAction=function(e,t,o){return"object"==typeof o.mergeableMove&&t.value==o.mergeableMove.item.value?x(o,this):(console.log("UR","not mergeable",typeof o.mergeableMove),null)}.bind(i,t,o)),o&&"added"==o.status&&(i.mergeableMove={child:t,item:o})),"undefined"!=typeof i&&h(i))},H={depth:-1,oldValues:1,mutable:!0,tagFields:!0},M={},q="function"==typeof t?t:e.watch,O=q(o,H,C,M);return{push:h,undoCommand:y(n.undoLabel,s,a),redoCommand:y(n.redoLabel,d,r),reset:function(){a.removeAll(),r.removeAll()},setModeOnce:function(){g=f,w(a)},setModeMerge:function(){g=b,w(a)},setModeNormal:function(){g=u,w(a)},setModeIgnore:function(){g=p,w(a)},setUndoActionMaker:function(e){S=e},dispose:function(){O.dispose()}}};return o});
|
34
|
+
|
35
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
36
|
+
|
37
|
+
},{"./../knockoutjs-reactor/src/knockout.reactor.js":11}],10:[function(require,module,exports){
|
38
|
+
(function (global){
|
39
|
+
!function(e){"function"==typeof require&&"object"==typeof exports&&"object"==typeof module?e((typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),exports):"function"==typeof define&&define.amd?define(["knockout","exports"],e):e(ko,ko.wrap={})}(function(e,t){function o(e){var t=typeof e;return"object"===t&&(e?e.constructor==Date?t="date":"[object Array]"==Object.prototype.toString.call(e)&&(t="array"):t="null"),t}function n(t){var o={};for(var n in t){var i=t[n];e.isComputed(i)||(o[n]=r(i))}return o}function i(e){var t=[];if(!e||0==e.length)return t;for(var o=0,n=e.length;n>o;++o)t.push(r(e[o]));return t}function r(t){var a=e.isObservable(t);if(a){var l=t();return r(l)}return"array"==o(t)?i(t):"object"==o(t)?n(t):t}function a(){f=[{obj:null,wrapped:null,lvl:""}]}function l(t,o,n){for(var i=0;i<f.length;++i)if(f[i].obj===t)return f[i].wrapped;var r={};for(var a in t){var l=t[a];f.push({obj:t,wrapped:r,lvl:d()+"/"+a}),r[a]=u(l,o,n),f.pop()}return o&&o[d()]&&(r=o[d()](r)),c()&&e.track(r),n?e.observable(r):r}function s(t,o,n){var i=e.observableArray();if(!t||0==t.length)return i;for(var r=0,a=t.length;a>r;++r)i.push(u(t[r],o,n));return i}function d(){return f[f.length-1].lvl}function u(t,n,i){if("array"==o(t))return s(t,n,i);if("object"==o(t))return l(t,n,i);if(c()||"function"==typeof t)return t;var r=e.observable();return r(t),r}function c(){return null!=e.track}t.fromJS=function(e,t,o){return a(),u(e,t,o)},t.updateFromJS=function(t,o,n,i){return a(),t(e.utils.unwrapObservable(u(o,n,i)))},t.fromJSON=function(o,n,i){var r=e.utils.parseJson(o);return arguments[0]=r,t.fromJS.apply(this,n,i)},t.toJS=function(e){return r(e)},t.toJSON=function(o){var n=t.toJS(o);return e.utils.stringifyJson(n)};var f});
|
40
|
+
|
41
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
42
|
+
|
43
|
+
},{}],11:[function(require,module,exports){
|
44
|
+
(function (global){
|
45
|
+
!function(e){"function"==typeof require&&"object"==typeof exports&&"object"==typeof module?e((typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null)):"function"==typeof define&&define.amd?define(["knockout"],e):e(window.ko)}(function(e){e.subscribable.fn.watch=function(t,o,n,i){var a=typeof t;return"boolean"===a||"undefined"===a?e.watch(this,{enabled:t!==!1}):"function"!==a||e.isSubscribable(t)?e.watch(t,o,n,i||this):e.watch(this,o||{},t,i||this),this},e.watch=function(t,o,n,i){function a(s,d,c,u,f,p){if(s&&0!==o.depth&&(-1===o.depth||c.length<(o.depth||1))){if(o.watchedOnly&&!s.watchable&&s!=t)return;if((o.enabled===!1||o.enabled===!0)&&(s.watchable=o.enabled),s.watchable===!1)return;o.seal===!0&&(s.watchable=!1);var b=typeof s;if("object"===b||"function"===b){if(s._watcher===i)return;if(o.hide&&e.utils.arrayIndexOf(o.hide,s)>-1)return;var m=[].concat(c,d&&d!==t?d:[]);if("function"!==b){if("[object Object]"===Object.prototype.toString.call(s))e.utils.objectForEach(s,function(t,n){if(n=o.getter?o.getter.call(i,m,s,t):n){if(o.wrap){var r=Object.prototype.toString.call(n);"[object Function]"!==r&&"[object Object]"!==r&&(o.beforeWrap&&o.beforeWrap.call(i,m,s,n)===!1||(n=s[t]="[object Array]"===r?e.observableArray(n):e.observable(n)))}o.unloop&&(n._watcher=u?void 0:i);var l=a(n,f?null:s,m,u,null,t);o.tagFields&&void 0===n._fieldName&&(l||"parentsOnly"!==o.tagFields&&"function"==typeof n||"object"==typeof n)&&(n._fieldName=t)}});else if(o.hideArrays!==!0)for(var g=0;g<s.length;g++)a(s[g],f?null:s,m,u);return!0}if("function"==typeof s.notifySubscribers&&n){if(o.enabled===!0&&s.watchable===!1)return;if(u||!o.beforeWatch||o.beforeWatch.call(i,m,s,p)!==!1){var h="function"==typeof s.pop;if(u?r(s):l(s,h,m,f),h)return a(s(),f?null:s,m,u,!0),!0;if(o.hideWrappedValues!==!0)return a(s(),f?null:s,m,u,!0)}}}}}function r(e){var t=e[s];if(!t)throw"Subscriptions field (."+s+") not defined for observable child "+(e._fieldName||"");if(t.change)for(var n=t.change.length-1;n>=0;n--)t.change[n]._watcher===i&&t.change[n].dispose();if(t.beforeChange&&(o.mutable||o.oldValues>0))for(var n=t.beforeChange.length-1;n>=0;n--)t.beforeChange[n]._watcher===i&&t.beforeChange[n].dispose();if(t.arrayChange)for(var n=t.arrayChange.length-1;n>=0;n--)t.arrayChange[n]._watcher===i&&t.arrayChange[n].dispose()}function l(t,r,l,s){r?t.subscribe(function(o){e.utils.arrayForEach(o,function(e){var o=n.call(i,l,t,e);void 0!==o&&i(o),e.moved||setTimeout(function(){a(e.value,s?null:t,l,"deleted"===e.status)},0)})},void 0,"arrayChange")._watcher=i:(t.subscribe(function(){if(t.watchable!==!1){var e=n.call(i,l,t);void 0!==e&&i(e),o.mutable&&"object"==typeof t()&&a(t(),s?null:t,l)}},null,"change")._watcher=i,(o.oldValues>0||o.mutable)&&(t.subscribe(function(e){if(o.oldValues>0){var n=t.oldValues?t.oldValues:t.oldValues=[];for(n.unshift(e);n.length>o.oldValues;)n.pop()}o.mutable&&"object"==typeof e&&a(e,s?null:t,l,!1,!0)},null,"beforeChange")._watcher=i))}"function"==typeof o&&(i=i||n,n=o,o={}),i=i||this;var s;switch("function"==typeof e.subscription||e.version){case!0:s="_subscriptions";break;case"3.0.0":s="F";break;case"3.1.0":s="H";break;case"3.2.0":s="M";break;case"3.3.0":s="G";break;case"3.4.0":s="K";break;case"3.4.1":s="K";break;default:throw"Unsupported Knockout version. Only v3.0.0 to v3.4.1 are supported when minified. Current version is "+e.version}return"function"!=typeof t||e.isSubscribable(t)?(a(t,null,[]),{dispose:function(){a(t,null,[],!0)}}):e.computed(t,n,o)}});
|
46
|
+
|
47
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
48
|
+
|
49
|
+
},{}],12:[function(require,module,exports){
|
50
|
+
module.exports={lex:require("./lib/lexer"),parse:require("./lib/parser"),stringify:require("./lib/stringify")};
|
51
|
+
|
52
|
+
},{"./lib/lexer":14,"./lib/parser":15,"./lib/stringify":16}],13:[function(require,module,exports){
|
53
|
+
(function (process){
|
54
|
+
function debug(e){return _debug.bind(null,e)}function _debug(e){var t=[].slice.call(arguments,1);t.unshift("["+e+"]"),process.stderr.write(t.join(" ")+"\n")}exports=module.exports=debug;
|
55
|
+
|
56
|
+
}).call(this,require('_process'))
|
57
|
+
|
58
|
+
},{"_process":23}],14:[function(require,module,exports){
|
59
|
+
function lex(e){function t(){return u(),e[h]}function o(e){return e?w[w.length-1-e]:k}function n(t){var o=h+1;return t===e.slice(o,o+t.length)}function i(t){var o=e.slice(h).indexOf(t);return o>0?o:!1}function r(e){return e===a(1)}function a(t){return e[h+(t||1)]}function l(){var e=w.pop();return k=w[w.length-1],e}function s(e){return k=e,w.push(k),w.length}function d(e){var t=k;return w[w.length-1]=k=e,t}function u(t){if(1==(t||1))"\n"==e[h]?(y++,g=1):g++,h++;else{var o=e.slice(h,h+t).split("\n");o.length>1&&(y+=o.length-1,g=1),g+=o[o.length-1].length,h+=t}}function c(){x.end={line:y,col:g},DEBUG&&debug("addToken:",JSON.stringify(x,null,2)),_.push(x),m="",x={}}function f(e){x={type:e,start:{line:y,col:g}}}var p,b,m="",g=0,h=-1,v=0,y=1,k="before-selector",w=[k],x={},_=[],S=["media","keyframes",{name:"-webkit-keyframes",type:"keyframes",prefix:"-webkit-"},{name:"-moz-keyframes",type:"keyframes",prefix:"-moz-"},{name:"-ms-keyframes",type:"keyframes",prefix:"-ms-"},{name:"-o-keyframes",type:"keyframes",prefix:"-o-"},"font-face",{name:"import",state:"before-at-value"},{name:"charset",state:"before-at-value"},"supports","viewport",{name:"namespace",state:"before-at-value"},"document",{name:"-moz-document",type:"document",prefix:"-moz-"},"page"];for(TIMER&&(p=Date.now());b=t();)switch(DEBUG&&debug(b,o()),b){case" ":switch(o()){case"selector":case"value":case"value-paren":case"at-group":case"at-value":case"comment":case"double-string":case"single-string":m+=b}break;case"\n":case" ":case"\r":case"\f":switch(o()){case"value":case"value-paren":case"at-group":case"comment":case"single-string":case"double-string":case"selector":m+=b;break;case"at-value":"\n"===b&&(x.value=m.trim(),c(),l())}break;case":":switch(o()){case"name":x.name=m.trim(),m="",d("before-value");break;case"before-selector":m+=b,f("selector"),s("selector");break;case"before-value":d("value"),m+=b;break;default:m+=b}break;case";":switch(o()){case"name":case"before-value":case"value":m.trim().length>0&&(x.value=m.trim(),c()),d("before-name");break;case"value-paren":m+=b;break;case"at-value":x.value=m.trim(),c(),l();break;case"before-name":break;default:m+=b}break;case"{":switch(o()){case"selector":if("\\"===a(-1)){m+=b;break}x.text=m.trim(),c(),d("before-name"),v+=1;break;case"at-group":switch(x.name=m.trim(),x.type){case"font-face":case"viewport":case"page":s("before-name");break;default:s("before-selector")}c(),v+=1;break;case"name":case"at-rule":x.name=m.trim(),c(),s("before-name"),v+=1;break;case"comment":case"double-string":case"single-string":m+=b;break;case"before-value":d("value"),m+=b}break;case"}":switch(o()){case"before-name":case"name":case"before-value":case"value":m&&(x.value=m.trim()),x.name&&x.value&&c(),f("end"),c(),l(),"at-group"===o()&&(f("at-group-end"),c(),l()),v>0&&(v-=1);break;case"at-group":case"before-selector":case"selector":if("\\"===a(-1)){m+=b;break}v>0&&"at-group"===o(1)&&(f("at-group-end"),c()),v>1&&l(),v>0&&(v-=1);break;case"double-string":case"single-string":case"comment":m+=b}break;case'"':case"'":switch(o()){case"double-string":'"'===b&&"\\"!==a(-1)&&l();break;case"single-string":"'"===b&&"\\"!==a(-1)&&l();break;case"before-at-value":d("at-value"),s('"'===b?"double-string":"single-string");break;case"before-value":d("value"),s('"'===b?"double-string":"single-string");break;case"comment":break;default:"\\"!==a(-1)&&s('"'===b?"double-string":"single-string")}m+=b;break;case"/":switch(o()){case"comment":case"double-string":case"single-string":m+=b;break;case"before-value":case"selector":case"name":case"value":if(r("*")){var O=i("*/");O&&u(O+1)}else"before-value"==o()&&d("value"),m+=b;break;default:r("*")?(f("comment"),s("comment"),u()):m+=b}break;case"*":switch(o()){case"comment":r("/")?(x.text=m,u(),c(),l()):m+=b;break;case"before-selector":m+=b,f("selector"),s("selector");break;case"before-value":d("value"),m+=b;break;default:m+=b}break;case"@":switch(o()){case"comment":case"double-string":case"single-string":m+=b;break;case"before-value":d("value"),m+=b;break;default:for(var C,$,T=!1,A=0,E=S.length;!T&&E>A;++A)$=S[A],C=$.name||$,n(C)&&(T=!0,f(C),s($.state||"at-group"),u(C.length),$.prefix&&(x.prefix=$.prefix),$.type&&(x.type=$.type));T||(m+=b)}break;case"(":switch(o()){case"value":s("value-paren");break;case"before-value":d("value")}m+=b;break;case")":switch(o()){case"value-paren":l();break;case"before-value":d("value")}m+=b;break;default:switch(o()){case"before-selector":f("selector"),s("selector");break;case"before-name":f("property"),d("name");break;case"before-value":d("value");break;case"before-at-value":d("at-value")}m+=b}return TIMER&&debug("ran in",Date.now()-p+"ms"),_}var DEBUG=!1,TIMER=!1,debug=require("./debug")("lex");exports=module.exports=lex;
|
60
|
+
|
61
|
+
},{"./debug":13}],15:[function(require,module,exports){
|
62
|
+
function parse(e,t){var o;t||(t={}),_comments=!!t.comments,_position=!!t.position,_depth=0,_tokens=Array.isArray(e)?e.slice():lex(e);var n,r,i=[];for(TIMER&&(o=Date.now());r=next();)n=parseToken(r),n&&i.push(n);return TIMER&&debug("ran in",Date.now()-o+"ms"),{type:"stylesheet",stylesheet:{rules:i}}}function astNode(e,t){t||(t={});for(var o,n=["type","name","value"],r={},i=0;i<n.length;++i)o=n[i],e[o]&&(r[o]=t[o]||e[o]);for(n=Object.keys(t),i=0;i<n.length;++i)o=n[i],r[o]||(r[o]=t[o]);return _position&&(r.position={start:e.start,end:e.end}),DEBUG&&debug("astNode:",JSON.stringify(r,null,2)),r}function next(){var e=_tokens.shift();return DEBUG&&debug("next:",JSON.stringify(e,null,2)),e}function parseAtGroup(e){_depth+=1;var t={};switch(e.type){case"font-face":case"viewport":t.declarations=parseDeclarations();break;case"page":t.prefix=e.prefix,t.declarations=parseDeclarations();break;default:t.prefix=e.prefix,t.rules=parseRules()}return astNode(e,t)}function parseAtImport(e){return astNode(e)}function parseCharset(e){return astNode(e)}function parseComment(e){return astNode(e,{text:e.text})}function parseNamespace(e){return astNode(e)}function parseProperty(e){return astNode(e)}function parseSelector(e){function t(e){return e.trim()}return astNode(e,{type:"rule",selectors:e.text.split(",").map(t),declarations:parseDeclarations(e)})}function parseToken(e){switch(e.type){case"property":return parseProperty(e);case"selector":return parseSelector(e);case"at-group-end":return _depth-=1,void 0;case"media":case"keyframes":return parseAtGroup(e);case"comment":if(_comments)return parseComment(e);break;case"charset":return parseCharset(e);case"import":return parseAtImport(e);case"namespace":return parseNamespace(e);case"font-face":case"supports":case"viewport":case"document":case"page":return parseAtGroup(e)}DEBUG&&debug("parseToken: unexpected token:",JSON.stringify(e))}function parseTokensWhile(e){for(var t,o,n=[];(o=next())&&e&&e(o);)t=parseToken(o),t&&n.push(t);return o&&"end"!==o.type&&_tokens.unshift(o),n}function parseDeclarations(){return parseTokensWhile(function(e){return"property"===e.type||"comment"===e.type})}function parseRules(){return parseTokensWhile(function(){return _depth})}var DEBUG=!1,TIMER=!1,debug=require("./debug")("parse"),lex=require("./lexer");exports=module.exports=parse;var _comments,_depth,_position,_tokens;
|
63
|
+
|
64
|
+
},{"./debug":13,"./lexer":14}],16:[function(require,module,exports){
|
65
|
+
function stringify(e,t){var o;t||(t={}),_indentation=t.indentation||"",_compress=!!t.compress,_comments=!!t.comments,_compress?_n=_s="":(_n="\n",_s=" "),TIMER&&(o=Date.now());var n=reduce(e.stylesheet.rules,stringifyNode).join("\n").trim();return TIMER&&debug("ran in",Date.now()-o+"ms"),n}function indent(e){return this.level||(this.level=1),e?(this.level+=e,void 0):_compress?"":Array(this.level).join(_indentation||"")}function stringifyAtRule(e){return"@"+e.type+" "+e.value+";"+_n}function stringifyAtGroup(e){var t="",o=e.prefix||"";e.name&&(t=" "+e.name);var n="page"!==e.type;return"@"+o+e.type+t+_s+stringifyBlock(e,n)+_n}function stringifyComment(e){return _comments?"/*"+(e.text||"")+"*/"+_n:""}function stringifyRule(e){var t;return e.selectors?t=e.selectors.join(","+_n):(t="@"+e.type,t+=e.name?" "+e.name:""),indent()+t+_s+stringifyBlock(e)+_n}function reduce(e,t){return e.reduce(function(e,o){var n="comment"===o.type?stringifyComment(o):t(o);return n&&e.push(n),e},[])}function stringifyBlock(e,t){var o=e.declarations,n=stringifyDeclaration;return e.rules&&(o=e.rules,n=stringifyRule),o=stringifyChildren(o,n),o&&(o=_n+o+(t?"":_n)),"{"+o+indent()+"}"}function stringifyChildren(e,t){if(!e)return"";indent(1);var o=reduce(e,t);return indent(-1),o.length?o.join(_n):""}function stringifyDeclaration(e){return"property"===e.type?stringifyProperty(e):(DEBUG&&debug("stringifyDeclaration: unexpected node:",JSON.stringify(e)),void 0)}function stringifyNode(e){switch(e.type){case"rule":return stringifyRule(e);case"media":case"keyframes":return stringifyAtGroup(e);case"comment":return stringifyComment(e);case"import":case"charset":case"namespace":return stringifyAtRule(e);case"font-face":case"supports":case"viewport":case"document":case"page":return stringifyAtGroup(e)}DEBUG&&debug("stringifyNode: unexpected node: "+JSON.stringify(e))}function stringifyProperty(e){var t=e.name?e.name+":"+_s:"";return indent()+t+e.value+";"}var DEBUG=!1,TIMER=!1,debug=require("./debug")("stringify"),_comments,_compress,_indentation,_n,_s;exports=module.exports=stringify;
|
66
|
+
|
67
|
+
},{"./debug":13}],17:[function(require,module,exports){
|
68
|
+
"use strict";var escapeRe=/([-.*+?^${}()|[\]\/\\])/g,unescapeRe=/\\/g,escape=function(e){return(e+"").replace(escapeRe,"\\$1")},unescape=function(e){return(e+"").replace(unescapeRe,"")},slickRe=RegExp("^(?:\\s*(,)\\s*|\\s*(<combinator>+)\\s*|(\\s+)|(<unicode>+|\\*)|\\#(<unicode>+)|\\.(<unicode>+)|\\[\\s*(<unicode1>+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(<unicode>+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)".replace(/<combinator>/,"["+escape(">+~`!@$%^&={}\\;</")+"]").replace(/<unicode>/g,"(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])").replace(/<unicode1>/g,"(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])")),Part=function(e){this.combinator=e||" ",this.tag="*"};Part.prototype.toString=function(){if(!this.raw){var e,t,o="";if(o+=this.tag||"*",this.id&&(o+="#"+this.id),this.classes&&(o+="."+this.classList.join(".")),this.attributes)for(e=0;t=this.attributes[e++];)o+="["+t.name+(t.operator?t.operator+'"'+t.value+'"':"")+"]";if(this.pseudos)for(e=0;t=this.pseudos[e++];)o+=":"+t.name,t.value&&(o+="("+t.value+")");this.raw=o}return this.raw};var Expression=function(){this.length=0};Expression.prototype.toString=function(){if(!this.raw){for(var e,t="",o=0;e=this[o++];)1!==o&&(t+=" ")," "!==e.combinator&&(t+=e.combinator+" "),t+=e;this.raw=t}return this.raw};var replacer=function(e,t,o,n,r,i,a,l,s,d,u,c,f,p,m,b){var g,h;if((t||!this.length)&&(g=this[this.length++]=new Expression,t))return"";if(g||(g=this[this.length-1]),(o||n||!g.length)&&(h=g[g.length++]=new Part(o)),h||(h=g[g.length-1]),r)h.tag=unescape(r);else if(i)h.id=unescape(i);else if(a){var v=unescape(a),y=h.classes||(h.classes={});if(!y[v]){y[v]=escape(a);var k=h.classList||(h.classList=[]);k.push(v),k.sort()}}else f?(b=b||m,(h.pseudos||(h.pseudos=[])).push({type:1==c.length?"class":"element",name:unescape(f),escapedName:escape(f),value:b?unescape(b):null,escapedValue:b?escape(b):null})):l&&(u=u?escape(u):null,(h.attributes||(h.attributes=[])).push({operator:s,name:unescape(l),escapedName:escape(l),value:u?unescape(u):null,escapedValue:u?escape(u):null}));return""},Expressions=function(e){this.length=0;for(var t,o=this,n=e;e;){if(t=e.replace(slickRe,function(){return replacer.apply(o,arguments)}),t===e)throw new Error(n+" is an invalid expression");e=t}};Expressions.prototype.toString=function(){if(!this.raw){for(var e,t=[],o=0;e=this[o++];)t.push(e);this.raw=t.join(", ")}return this.raw};var cache={},parse=function(e){return null==e?null:(e=(""+e).replace(/^\s+|\s+$/g,""),cache[e]||(cache[e]=new Expressions(e)))};module.exports=parse;
|
69
|
+
|
70
|
+
},{}],18:[function(require,module,exports){
|
71
|
+
!function(e){function t(e,i){if(e=e?e:"",i=i||{},e instanceof t)return e;if(!(this instanceof t))return new t(e,i);var n=o(e);this._originalInput=e,this._r=n.r,this._g=n.g,this._b=n.b,this._a=n.a,this._roundA=R(100*this._a)/100,this._format=i.format||n.format,this._gradientType=i.gradientType,this._r<1&&(this._r=R(this._r)),this._g<1&&(this._g=R(this._g)),this._b<1&&(this._b=R(this._b)),this._ok=n.ok,this._tc_id=L++}function o(e){var t={r:0,g:0,b:0},o=1,n=null,r=null,s=null,d=!1,c=!1;return"string"==typeof e&&(e=D(e)),"object"==typeof e&&(A(e.r)&&A(e.g)&&A(e.b)?(t=i(e.r,e.g,e.b),d=!0,c="%"===String(e.r).substr(-1)?"prgb":"rgb"):A(e.h)&&A(e.s)&&A(e.v)?(n=E(e.s),r=E(e.v),t=l(e.h,n,r),d=!0,c="hsv"):A(e.h)&&A(e.s)&&A(e.l)&&(n=E(e.s),s=E(e.l),t=a(e.h,n,s),d=!0,c="hsl"),e.hasOwnProperty("a")&&(o=e.a)),o=S(o),{ok:d,format:e.format||c,r:N(255,z(t.r,0)),g:N(255,z(t.g,0)),b:N(255,z(t.b,0)),a:o}}function i(e,t,o){return{r:255*C(e,255),g:255*C(t,255),b:255*C(o,255)}}function n(e,t,o){e=C(e,255),t=C(t,255),o=C(o,255);var i,n,a=z(e,t,o),r=N(e,t,o),l=(a+r)/2;if(a==r)i=n=0;else{var s=a-r;switch(n=l>.5?s/(2-a-r):s/(a+r),a){case e:i=(t-o)/s+(o>t?6:0);break;case t:i=(o-e)/s+2;break;case o:i=(e-t)/s+4}i/=6}return{h:i,s:n,l:l}}function a(e,t,o){function i(e,t,o){return 0>o&&(o+=1),o>1&&(o-=1),1/6>o?e+6*(t-e)*o:.5>o?t:2/3>o?e+6*(t-e)*(2/3-o):e}var n,a,r;if(e=C(e,360),t=C(t,100),o=C(o,100),0===t)n=a=r=o;else{var l=.5>o?o*(1+t):o+t-o*t,s=2*o-l;n=i(s,l,e+1/3),a=i(s,l,e),r=i(s,l,e-1/3)}return{r:255*n,g:255*a,b:255*r}}function r(e,t,o){e=C(e,255),t=C(t,255),o=C(o,255);var i,n,a=z(e,t,o),r=N(e,t,o),l=a,s=a-r;if(n=0===a?0:s/a,a==r)i=0;else{switch(a){case e:i=(t-o)/s+(o>t?6:0);break;case t:i=(o-e)/s+2;break;case o:i=(e-t)/s+4}i/=6}return{h:i,s:n,v:l}}function l(t,o,i){t=6*C(t,360),o=C(o,100),i=C(i,100);var n=e.floor(t),a=t-n,r=i*(1-o),l=i*(1-a*o),s=i*(1-(1-a)*o),d=n%6,c=[i,l,r,r,s,i][d],u=[s,i,i,l,r,r][d],p=[r,r,s,i,i,l][d];return{r:255*c,g:255*u,b:255*p}}function s(e,t,o,i){var n=[M(R(e).toString(16)),M(R(t).toString(16)),M(R(o).toString(16))];return i&&n[0].charAt(0)==n[0].charAt(1)&&n[1].charAt(0)==n[1].charAt(1)&&n[2].charAt(0)==n[2].charAt(1)?n[0].charAt(0)+n[1].charAt(0)+n[2].charAt(0):n.join("")}function d(e,t,o,i,n){var a=[M(R(e).toString(16)),M(R(t).toString(16)),M(R(o).toString(16)),M(I(i))];return n&&a[0].charAt(0)==a[0].charAt(1)&&a[1].charAt(0)==a[1].charAt(1)&&a[2].charAt(0)==a[2].charAt(1)&&a[3].charAt(0)==a[3].charAt(1)?a[0].charAt(0)+a[1].charAt(0)+a[2].charAt(0)+a[3].charAt(0):a.join("")}function c(e,t,o,i){var n=[M(I(i)),M(R(e).toString(16)),M(R(t).toString(16)),M(R(o).toString(16))];return n.join("")}function u(e,o){o=0===o?0:o||10;var i=t(e).toHsl();return i.s-=o/100,i.s=H(i.s),t(i)}function p(e,o){o=0===o?0:o||10;var i=t(e).toHsl();return i.s+=o/100,i.s=H(i.s),t(i)}function f(e){return t(e).desaturate(100)}function b(e,o){o=0===o?0:o||10;var i=t(e).toHsl();return i.l+=o/100,i.l=H(i.l),t(i)}function g(e,o){o=0===o?0:o||10;var i=t(e).toRgb();return i.r=z(0,N(255,i.r-R(255*-(o/100)))),i.g=z(0,N(255,i.g-R(255*-(o/100)))),i.b=z(0,N(255,i.b-R(255*-(o/100)))),t(i)}function m(e,o){o=0===o?0:o||10;var i=t(e).toHsl();return i.l-=o/100,i.l=H(i.l),t(i)}function h(e,o){var i=t(e).toHsl(),n=(i.h+o)%360;return i.h=0>n?360+n:n,t(i)}function v(e){var o=t(e).toHsl();return o.h=(o.h+180)%360,t(o)}function k(e){var o=t(e).toHsl(),i=o.h;return[t(e),t({h:(i+120)%360,s:o.s,l:o.l}),t({h:(i+240)%360,s:o.s,l:o.l})]}function y(e){var o=t(e).toHsl(),i=o.h;return[t(e),t({h:(i+90)%360,s:o.s,l:o.l}),t({h:(i+180)%360,s:o.s,l:o.l}),t({h:(i+270)%360,s:o.s,l:o.l})]}function w(e){var o=t(e).toHsl(),i=o.h;return[t(e),t({h:(i+72)%360,s:o.s,l:o.l}),t({h:(i+216)%360,s:o.s,l:o.l})]}function x(e,o,i){o=o||6,i=i||30;var n=t(e).toHsl(),a=360/i,r=[t(e)];for(n.h=(n.h-(a*o>>1)+720)%360;--o;)n.h=(n.h+a)%360,r.push(t(n));return r}function $(e,o){o=o||6;for(var i=t(e).toHsv(),n=i.h,a=i.s,r=i.v,l=[],s=1/o;o--;)l.push(t({h:n,s:a,v:r})),r=(r+s)%1;return l}function _(e){var t={};for(var o in e)e.hasOwnProperty(o)&&(t[e[o]]=o);return t}function S(e){return e=parseFloat(e),(isNaN(e)||0>e||e>1)&&(e=1),e}function C(t,o){O(t)&&(t="100%");var i=T(t);return t=N(o,z(0,parseFloat(t))),i&&(t=parseInt(t*o,10)/100),e.abs(t-o)<1e-6?1:t%o/parseFloat(o)}function H(e){return N(1,z(0,e))}function q(e){return parseInt(e,16)}function O(e){return"string"==typeof e&&-1!=e.indexOf(".")&&1===parseFloat(e)}function T(e){return"string"==typeof e&&-1!=e.indexOf("%")}function M(e){return 1==e.length?"0"+e:""+e}function E(e){return 1>=e&&(e=100*e+"%"),e}function I(t){return e.round(255*parseFloat(t)).toString(16)}function B(e){return q(e)/255}function A(e){return!!J.CSS_UNIT.exec(e)}function D(e){e=e.replace(P,"").replace(F,"").toLowerCase();var t=!1;if(V[e])e=V[e],t=!0;else if("transparent"==e)return{r:0,g:0,b:0,a:0,format:"name"};var o;return(o=J.rgb.exec(e))?{r:o[1],g:o[2],b:o[3]}:(o=J.rgba.exec(e))?{r:o[1],g:o[2],b:o[3],a:o[4]}:(o=J.hsl.exec(e))?{h:o[1],s:o[2],l:o[3]}:(o=J.hsla.exec(e))?{h:o[1],s:o[2],l:o[3],a:o[4]}:(o=J.hsv.exec(e))?{h:o[1],s:o[2],v:o[3]}:(o=J.hsva.exec(e))?{h:o[1],s:o[2],v:o[3],a:o[4]}:(o=J.hex8.exec(e))?{r:q(o[1]),g:q(o[2]),b:q(o[3]),a:B(o[4]),format:t?"name":"hex8"}:(o=J.hex6.exec(e))?{r:q(o[1]),g:q(o[2]),b:q(o[3]),format:t?"name":"hex"}:(o=J.hex4.exec(e))?{r:q(o[1]+""+o[1]),g:q(o[2]+""+o[2]),b:q(o[3]+""+o[3]),a:B(o[4]+""+o[4]),format:t?"name":"hex8"}:(o=J.hex3.exec(e))?{r:q(o[1]+""+o[1]),g:q(o[2]+""+o[2]),b:q(o[3]+""+o[3]),format:t?"name":"hex"}:!1}function j(e){var t,o;return e=e||{level:"AA",size:"small"},t=(e.level||"AA").toUpperCase(),o=(e.size||"small").toLowerCase(),"AA"!==t&&"AAA"!==t&&(t="AA"),"small"!==o&&"large"!==o&&(o="small"),{level:t,size:o}}var P=/^\s+/,F=/\s+$/,L=0,R=e.round,N=e.min,z=e.max,U=e.random;t.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var e=this.toRgb();return(299*e.r+587*e.g+114*e.b)/1e3},getLuminance:function(){var t,o,i,n,a,r,l=this.toRgb();return t=l.r/255,o=l.g/255,i=l.b/255,n=.03928>=t?t/12.92:e.pow((t+.055)/1.055,2.4),a=.03928>=o?o/12.92:e.pow((o+.055)/1.055,2.4),r=.03928>=i?i/12.92:e.pow((i+.055)/1.055,2.4),.2126*n+.7152*a+.0722*r},setAlpha:function(e){return this._a=S(e),this._roundA=R(100*this._a)/100,this},toHsv:function(){var e=r(this._r,this._g,this._b);return{h:360*e.h,s:e.s,v:e.v,a:this._a}},toHsvString:function(){var e=r(this._r,this._g,this._b),t=R(360*e.h),o=R(100*e.s),i=R(100*e.v);return 1==this._a?"hsv("+t+", "+o+"%, "+i+"%)":"hsva("+t+", "+o+"%, "+i+"%, "+this._roundA+")"},toHsl:function(){var e=n(this._r,this._g,this._b);return{h:360*e.h,s:e.s,l:e.l,a:this._a}},toHslString:function(){var e=n(this._r,this._g,this._b),t=R(360*e.h),o=R(100*e.s),i=R(100*e.l);return 1==this._a?"hsl("+t+", "+o+"%, "+i+"%)":"hsla("+t+", "+o+"%, "+i+"%, "+this._roundA+")"},toHex:function(e){return s(this._r,this._g,this._b,e)},toHexString:function(e){return"#"+this.toHex(e)},toHex8:function(e){return d(this._r,this._g,this._b,this._a,e)},toHex8String:function(e){return"#"+this.toHex8(e)},toRgb:function(){return{r:R(this._r),g:R(this._g),b:R(this._b),a:this._a}},toRgbString:function(){return 1==this._a?"rgb("+R(this._r)+", "+R(this._g)+", "+R(this._b)+")":"rgba("+R(this._r)+", "+R(this._g)+", "+R(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:R(100*C(this._r,255))+"%",g:R(100*C(this._g,255))+"%",b:R(100*C(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1==this._a?"rgb("+R(100*C(this._r,255))+"%, "+R(100*C(this._g,255))+"%, "+R(100*C(this._b,255))+"%)":"rgba("+R(100*C(this._r,255))+"%, "+R(100*C(this._g,255))+"%, "+R(100*C(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":this._a<1?!1:W[s(this._r,this._g,this._b,!0)]||!1},toFilter:function(e){var o="#"+c(this._r,this._g,this._b,this._a),i=o,n=this._gradientType?"GradientType = 1, ":"";if(e){var a=t(e);i="#"+c(a._r,a._g,a._b,a._a)}return"progid:DXImageTransform.Microsoft.gradient("+n+"startColorstr="+o+",endColorstr="+i+")"},toString:function(e){var t=!!e;e=e||this._format;var o=!1,i=this._a<1&&this._a>=0,n=!t&&i&&("hex"===e||"hex6"===e||"hex3"===e||"hex4"===e||"hex8"===e||"name"===e);return n?"name"===e&&0===this._a?this.toName():this.toRgbString():("rgb"===e&&(o=this.toRgbString()),"prgb"===e&&(o=this.toPercentageRgbString()),("hex"===e||"hex6"===e)&&(o=this.toHexString()),"hex3"===e&&(o=this.toHexString(!0)),"hex4"===e&&(o=this.toHex8String(!0)),"hex8"===e&&(o=this.toHex8String()),"name"===e&&(o=this.toName()),"hsl"===e&&(o=this.toHslString()),"hsv"===e&&(o=this.toHsvString()),o||this.toHexString())},clone:function(){return t(this.toString())},_applyModification:function(e,t){var o=e.apply(null,[this].concat([].slice.call(t)));return this._r=o._r,this._g=o._g,this._b=o._b,this.setAlpha(o._a),this},lighten:function(){return this._applyModification(b,arguments)},brighten:function(){return this._applyModification(g,arguments)},darken:function(){return this._applyModification(m,arguments)},desaturate:function(){return this._applyModification(u,arguments)},saturate:function(){return this._applyModification(p,arguments)},greyscale:function(){return this._applyModification(f,arguments)},spin:function(){return this._applyModification(h,arguments)},_applyCombination:function(e,t){return e.apply(null,[this].concat([].slice.call(t)))},analogous:function(){return this._applyCombination(x,arguments)},complement:function(){return this._applyCombination(v,arguments)},monochromatic:function(){return this._applyCombination($,arguments)},splitcomplement:function(){return this._applyCombination(w,arguments)},triad:function(){return this._applyCombination(k,arguments)},tetrad:function(){return this._applyCombination(y,arguments)}},t.fromRatio=function(e,o){if("object"==typeof e){var i={};for(var n in e)e.hasOwnProperty(n)&&(i[n]="a"===n?e[n]:E(e[n]));e=i}return t(e,o)},t.equals=function(e,o){return e&&o?t(e).toRgbString()==t(o).toRgbString():!1},t.random=function(){return t.fromRatio({r:U(),g:U(),b:U()})},t.mix=function(e,o,i){i=0===i?0:i||50;var n=t(e).toRgb(),a=t(o).toRgb(),r=i/100,l={r:(a.r-n.r)*r+n.r,g:(a.g-n.g)*r+n.g,b:(a.b-n.b)*r+n.b,a:(a.a-n.a)*r+n.a};return t(l)},t.readability=function(o,i){var n=t(o),a=t(i);return(e.max(n.getLuminance(),a.getLuminance())+.05)/(e.min(n.getLuminance(),a.getLuminance())+.05)},t.isReadable=function(e,o,i){var n,a,r=t.readability(e,o);switch(a=!1,n=j(i),n.level+n.size){case"AAsmall":case"AAAlarge":a=r>=4.5;break;case"AAlarge":a=r>=3;break;case"AAAsmall":a=r>=7}return a},t.mostReadable=function(e,o,i){var n,a,r,l,s=null,d=0;i=i||{},a=i.includeFallbackColors,r=i.level,l=i.size;for(var c=0;c<o.length;c++)n=t.readability(e,o[c]),n>d&&(d=n,s=t(o[c]));return t.isReadable(e,s,{level:r,size:l})||!a?s:(i.includeFallbackColors=!1,t.mostReadable(e,["#fff","#000"],i))};var V=t.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},W=t.hexNames=_(V),J=function(){var e="[-\\+]?\\d+%?",t="[-\\+]?\\d*\\.\\d+%?",o="(?:"+t+")|(?:"+e+")",i="[\\s|\\(]+("+o+")[,|\\s]+("+o+")[,|\\s]+("+o+")\\s*\\)?",n="[\\s|\\(]+("+o+")[,|\\s]+("+o+")[,|\\s]+("+o+")[,|\\s]+("+o+")\\s*\\)?";return{CSS_UNIT:new RegExp(o),rgb:new RegExp("rgb"+i),rgba:new RegExp("rgba"+n),hsl:new RegExp("hsl"+i),hsla:new RegExp("hsla"+n),hsv:new RegExp("hsv"+i),hsva:new RegExp("hsva"+n),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/}}();"undefined"!=typeof module&&module.exports?module.exports=t:"function"==typeof define&&define.amd?define(function(){return t}):window.tinycolor=t}(Math);
|
72
|
+
|
73
|
+
},{}],19:[function(require,module,exports){
|
74
|
+
(function (global){
|
75
|
+
!function(e){e(["jquery"],function(e){return function(){function t(e,t,o){return b({type:w.error,iconClass:m().iconClasses.error,message:e,optionsOverride:o,title:t})}function o(t,o){return t||(t=m()),h=e("#"+t.containerId),h.length?h:(o&&(h=u(t)),h)}function n(e,t,o){return b({type:w.info,iconClass:m().iconClasses.info,message:e,optionsOverride:o,title:t})}function i(e){v=e}function a(e,t,o){return b({type:w.success,iconClass:m().iconClasses.success,message:e,optionsOverride:o,title:t})}function r(e,t,o){return b({type:w.warning,iconClass:m().iconClasses.warning,message:e,optionsOverride:o,title:t})}function l(e,t){var n=m();h||o(n),c(e,n,t)||d(n)}function s(t){var n=m();return h||o(n),t&&0===e(":focus",t).length?(g(t),void 0):(h.children().length&&h.remove(),void 0)}function d(t){for(var o=h.children(),n=o.length-1;n>=0;n--)c(e(o[n]),t)}function c(t,o,n){var i=n&&n.force?n.force:!1;return t&&(i||0===e(":focus",t).length)?(t[o.hideMethod]({duration:o.hideDuration,easing:o.hideEasing,complete:function(){g(t)}}),!0):!1}function u(t){return h=e("<div/>").attr("id",t.containerId).addClass(t.positionClass),h.appendTo(e(t.target)),h}function p(){return{tapToDismiss:!0,toastClass:"toast",containerId:"toast-container",debug:!1,showMethod:"fadeIn",showDuration:300,showEasing:"swing",onShown:void 0,hideMethod:"fadeOut",hideDuration:1e3,hideEasing:"swing",onHidden:void 0,closeMethod:!1,closeDuration:!1,closeEasing:!1,closeOnHover:!0,extendedTimeOut:1e3,iconClasses:{error:"toast-error",info:"toast-info",success:"toast-success",warning:"toast-warning"},iconClass:"toast-info",positionClass:"toast-top-right",timeOut:5e3,titleClass:"toast-title",messageClass:"toast-message",escapeHtml:!1,target:"body",closeHtml:'<button type="button">×</button>',closeClass:"toast-close-button",newestOnTop:!0,preventDuplicates:!1,progressBar:!1,progressClass:"toast-progress",rtl:!1}}function f(e){v&&v(e)}function b(t){function n(e){return null==e&&(e=""),e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}function i(){s(),c(),u(),p(),b(),v(),d(),a()}function a(){var e="";switch(t.iconClass){case"toast-success":case"toast-info":e="polite";break;default:e="assertive"}E.attr("aria-live",e)}function r(){S.closeOnHover&&E.hover(_,$),!S.onclick&&S.tapToDismiss&&E.click(x),S.closeButton&&A&&A.click(function(e){e.stopPropagation?e.stopPropagation():void 0!==e.cancelBubble&&e.cancelBubble!==!0&&(e.cancelBubble=!0),S.onCloseClick&&S.onCloseClick(e),x(!0)}),S.onclick&&E.click(function(e){S.onclick(e),x()})}function l(){E.hide(),E[S.showMethod]({duration:S.showDuration,easing:S.showEasing,complete:S.onShown}),S.timeOut>0&&(O=setTimeout(x,S.timeOut),D.maxHideTime=parseFloat(S.timeOut),D.hideEta=(new Date).getTime()+D.maxHideTime,S.progressBar&&(D.intervalId=setInterval(C,10)))}function s(){t.iconClass&&E.addClass(S.toastClass).addClass(T)}function d(){S.newestOnTop?h.prepend(E):h.append(E)}function c(){if(t.title){var e=t.title;S.escapeHtml&&(e=n(t.title)),H.append(e).addClass(S.titleClass),E.append(H)}}function u(){if(t.message){var e=t.message;S.escapeHtml&&(e=n(t.message)),M.append(e).addClass(S.messageClass),E.append(M)}}function p(){S.closeButton&&(A.addClass(S.closeClass).attr("role","button"),E.prepend(A))}function b(){S.progressBar&&(q.addClass(S.progressClass),E.prepend(q))}function v(){S.rtl&&E.addClass("rtl")}function w(e,t){if(e.preventDuplicates){if(t.message===y)return!0;y=t.message}return!1}function x(t){var o=t&&S.closeMethod!==!1?S.closeMethod:S.hideMethod,n=t&&S.closeDuration!==!1?S.closeDuration:S.hideDuration,i=t&&S.closeEasing!==!1?S.closeEasing:S.hideEasing;return!e(":focus",E).length||t?(clearTimeout(D.intervalId),E[o]({duration:n,easing:i,complete:function(){g(E),clearTimeout(O),S.onHidden&&"hidden"!==I.state&&S.onHidden(),I.state="hidden",I.endTime=new Date,f(I)}})):void 0}function $(){(S.timeOut>0||S.extendedTimeOut>0)&&(O=setTimeout(x,S.extendedTimeOut),D.maxHideTime=parseFloat(S.extendedTimeOut),D.hideEta=(new Date).getTime()+D.maxHideTime)}function _(){clearTimeout(O),D.hideEta=0,E.stop(!0,!0)[S.showMethod]({duration:S.showDuration,easing:S.showEasing})}function C(){var e=100*((D.hideEta-(new Date).getTime())/D.maxHideTime);q.width(e+"%")}var S=m(),T=t.iconClass||S.iconClass;if("undefined"!=typeof t.optionsOverride&&(S=e.extend(S,t.optionsOverride),T=t.optionsOverride.iconClass||T),!w(S,t)){k++,h=o(S,!0);var O=null,E=e("<div/>"),H=e("<div/>"),M=e("<div/>"),q=e("<div/>"),A=e(S.closeHtml),D={intervalId:null,hideEta:null,maxHideTime:null},I={toastId:k,state:"visible",startTime:new Date,options:S,map:t};return i(),l(),r(),f(I),S.debug&&console&&console.log(I),E}}function m(){return e.extend({},p(),x.options)}function g(e){h||(h=o()),e.is(":visible")||(e.remove(),e=null,0===h.children().length&&(h.remove(),y=void 0))}var h,v,y,k=0,w={error:"error",info:"info",success:"success",warning:"warning"},x={clear:l,remove:s,error:t,getContainer:o,info:n,options:{},subscribe:i,success:a,version:"2.1.3",warning:r};return x}()})}("function"==typeof define&&define.amd?define:function(e,t){"undefined"!=typeof module&&module.exports?module.exports=t((typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null)):window.toastr=t(window.jQuery)});
|
76
|
+
|
77
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
78
|
+
|
79
|
+
},{}],20:[function(require,module,exports){
|
80
|
+
var templateSystem=require("../src/js/bindings/choose-template.js");document.addEventListener("DOMContentLoaded",function(){templateSystem.addTemplate("array","<!-- ko foreach: $data --><!-- ko block: $data --><!-- /ko --><!-- /ko -->"),templateSystem.addTemplate("block-show","<!-- ko block: $data, scrollIntoView: $root.selectedBlock() === $data --><!-- /ko -->"),templateSystem.addTemplate("block-wysiwyg",'<div class="editable block" data-drop-content="Drop here" data-bind="attr: { \'data-drop-content\': $root.t(\'Drop here\') }, click: function(obj, evt) { $root.selectBlock(obj); return true }, clickBubble: false, css: { selected: $root.selectedBlock() === $data }, scrollIntoView: $root.selectedBlock() === $data"> <div class="mo-blockselectionhelper"></div> <div class="tools" data-bind="tooltips: {}"> <!-- ko if: typeof $index != \'undefined\' --> <div title="Drag this handle to move the block" data-bind="attr: { title: $root.t(\'Drag this handle to move the block\') }" class="tool handle"><i class="fa fa-fw fa-sort"></i></div> <!-- ko if: $index() > 0 --> <div title="Move this block upside" data-bind="attr: { title: $root.t(\'Move this block upside\') }" class="tool moveup"><i class="fa fa-fw fa-sort-asc" data-bind=\'click: $root.moveBlock.bind($element, $index, $parent, true)\'></i></div> <!-- /ko --> <!-- ko if: $index() < $parent.blocks().length -1 --> <div title="Move this block downside" data-bind="attr: { title: $root.t(\'Move this block downside\') }" class="tool movedown"><i class="fa fa-fw fa-sort-desc" data-bind=\'click: $root.moveBlock.bind($element, $index, $parent, false)\'></i></div> <!-- /ko --> <div title="Delete block" class="tool delete" data-bind="attr: { title: $root.t(\'Delete block\') }, click: $root.removeBlock.bind($element, $rawData, $parent)"><i class="fa fa-fw fa-trash-o"></i></div> <div title="Duplicate block" class="tool clone" data-bind="attr: { title: $root.t(\'Duplicate block\') }, click: $root.duplicateBlock.bind($element, $index, $parent)"><i class="fa fa-fw fa-files-o"></i></div> <!-- /ko --> <!-- ko if: typeof $data._nextVariant != \'undefined\' --><div title="Switch block variant" class="tool variant" data-bind="attr: { title: $root.t(\'Switch block variant\') }, click: $data._nextVariant"><i class="fa fa-fw fa-magic"></i></div><!-- /ko --> </div> <!-- ko block: $data --><!-- /ko --></div>'),templateSystem.addTemplate("blocks-show","<!-- ko template: { name: 'block-show', foreach: blocks } --><!-- /ko -->"),templateSystem.addTemplate("blocks-wysiwyg","<div class=\"sortable-blocks-edit\" data-drop-content=\"Drop here\" data-empty-content=\"Drop here blocks from the Blocks tab\" data-bind=\"attr: { 'data-drop-content': $root.t('Drop here'), 'data-empty-content': $root.t('Drop here blocks from the "Blocks" tab') }, css: { 'empty': ko.utils.unwrapObservable(blocks).length == 0 }, extsortable: { connectClass: 'sortable-blocks-edit', template: 'block-wysiwyg', data: blocks, dragging: $root.dragging, beforeMove: $root.startMultiple, afterMove: $root.stopMultiple, options: { handle: '.handle', placeholder: $root.placeholderHelper } }\"></div>"),templateSystem.addTemplate("customstyle",'<div class="customStyleHelp" data-bind="html: $root.t(\'Customized block.<ul><li>In this status changes to properties will be specific to the current block (instead of being global to all blocks in the same section)</li><li>A <span class="customStyled"><span>"small cube" </span></span> icon beside the property will mark the customization. By clicking this icon the property value will be reverted to the value defined for the section.</li></ul>\')">Customized block.<ul><li>In this status changes to properties will be specific to the current block (instead of being global to all blocks in the same section)</li><li>A <span class="customStyled"><span>"small cube" </span></span> icon beside the property will mark the customization. By clicking this icon the property value will be reverted to the value defined for the section.</li></ul></div>'),templateSystem.addTemplate("empty",""),templateSystem.addTemplate("error",'[<div style="background-color: #fff0f0" data-bind="text: ko.toJS($data)"></div>]'),templateSystem.addTemplate("gallery-images",'<div data-bind="foreach: items.currentPageData"> <div class="draggable-item" data-bind="if: typeof thumbnailUrl != \'undefined\'"> <div class="draggable image" data-bind="click: $root.addImage, extdraggable: { data: $data, dropContainer: \'#main-wysiwyg-area\', dragging: $root.draggingImage, \'options\': { \'appendTo\': \'#page\' } }, style: { backgroundImage: \'url(\\\'\' + thumbnailUrl + \'\\\')\' }"> <img title="Drag this image and drop it on any template image placeholder" style="display: block;" data-bind="tooltips: {}, attr: { src: thumbnailUrl, \'title\': $root.t(\'Drag this image and drop it on any template image placeholder\') }"/> </div> </div></div><!-- ko if: items.pageCount() > 1 --><div class="galleryPager" data-bind="buttonset: {}"> <a href="javascript:void(0)" data-bind="click: items.moveFirst, button: { disabled: items.currentPage() == 1, icons: { primary: \'fa fa-fast-backward\' }, text: false }">First</a> <a href="javascript:void(0)" data-bind="click: items.movePrevious, button: { disabled: items.currentPage() == 1, icons: { primary: \'fa fa-backward\' }, text: false }">Previous</a> <span data-bind="button: { disabled: true, text: true, label: \' \'+items.currentPage()+\' di \'+items.pageCount()+\' \' }"> X di Y </span> <a href="javascript:void(0)" data-bind="click: items.moveNext, button: { disabled: items.currentPage() == items.pageCount(), icons: { primary: \'fa fa-forward\' }, text: false }">Next</a> <a href="javascript:void(0)" data-bind="click: items.moveLast, button: { disabled: items.currentPage() == items.pageCount(), icons: { primary: \'fa fa-fast-forward\' }, text: false }">Last</a></div><!-- /ko -->'),templateSystem.addTemplate("img-wysiwyg",'<table tabfocus="0" cellspacing="0" cellpadding="0" data-drop-content="Drop here" data-bind="style: _stylebind, click: function(obj, evt) { $root.selectItem(_item, _data); return true; }, clickBubble: false, fudroppable: { activeClass: \'ui-state-highlight\', hoverClass: \'ui-state-draghover\' }, droppable: { options: { accept: \'.image\', activeClass: \'ui-state-highlight\', hoverClass: \'ui-state-draghover\' }, data: _src, dragged: $root.fileToImage }, css: { selecteditem: $root.isSelectedItem(_item) }, scrollIntoView: $root.isSelectedItem(_item), attr: { \'data-drop-content\': $root.t(\'Drop here\'), width: _width, height: _height, align: _align }" class="img-wysiwyg selectable-img" style="display: table;"><tr><td class="uploadzone"> <div class="mo-imgselectionhelper"></div> <div class="mo-uploadzone"></div> <div class="img-size" data-bind="text: _size">size</div> <div class="midtools" data-bind="tooltips: {}"> <!-- ko if: _src() != \'\' --> <div title="Remove image" class="tool delete" data-bind="attr: { title: $root.t(\'Remove image\') }, click: _src.bind(_src, \'\'), clickBubble: false"><i class="fa fa-fw fa-trash-o"></i></div> <!-- ko if: typeof $root.editImage !== \'undefined\' --> <div title="Open the image editing tool" class="tool edit" data-bind="attr: { title: $root.t(\'Open the image editing tool\') }, click: $root.editImage.bind($element, _src), clickBubble: false"><i class="fa fa-fw fa-pencil"></i></div> <!-- /ko --> <!-- /ko --> <!-- ko if: _src() == \'\' --> <div title="Upload a new image" data-bind="attr: { title: $root.t(\'Upload a new image\') }" class="tool upload" style="position: relative; overflow: hidden;"><i class="fa fa-fw fa-upload"></i> <input class="fileupload nofile" type="file" name="files[]" data-bind="fileupload: { data: _src, onerror: $root.notifier.error, onfile: $root.loadImage, canvasPreview: true }" style="z-index: 20; position: absolute; top: 0; left: 0; right: 0; bottom: 0; min-width: 100%; min-height: 100%; font-size: 999px; text-align: right; filter: alpha(opacity=0); opacity: 0; outline: none; cursor: inherit; display: block"> </div> <!-- /ko --> </div> <!-- ko template: _template --><!-- /ko --> <!-- ko if: _src() == \'\' --> <!-- <img style="display: block;" class="imgplaceholder" width="200" src="" alt="Insert an image here" data-bind="wysiwygSrc: { src: _src.preloaded, placeholder: _placeholdersrc, width: _width, height: _height, method: _method }" /> --> <span class="fileuploadtext" style="text-align: center; display: -ms-flexbox; display: flex; align-items: center; flex-align: center; justify-content: center; padding: 1em; position: absolute; top: 0; left: 0; right: 0; bottom: 0;"><span class="textMiddle" style=" text-shadow: 1px 1px 0 #FFFFFF, 0 0 10px #FFFFFF; font-weight: bold;" data-bind="text: $root.t(\'Drop an image here\')">Drop an image here</span></span> <!-- /ko --> <!-- ko if: _src() != \'\' --> <!-- <img style="display: block;" width="200" src="" data-bind="preloader: _src, wysiwygSrc: { src: _src.preloaded, placeholder: _placeholdersrc, width: _width, height: _height, method: _method }" /> --> <!-- /ko --> <!-- pulsante per la cancellazione --> <div title="Drop an image here or click the upload button" data-bind="attr: { title: $root.t(\'Drop an image here or click the upload button\') }, tooltips: {}" class="workzone" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; overflow: hidden;"> <!-- ko if: _src.preloaded && _src() != _src.preloaded() -->PRELOADING....<!-- /ko --> <!-- ko if: _src() != \'\' --> <input class="fileupload withfile" type="file" name="files[]" data-bind="fileupload: { data: _src, onerror: $root.notifier.error, onfile: $root.galleryRecent.unshift.bind($root.galleryRecent), canvasPreview: true }" style="z-index: -20; position: absolute; top: 0; left: 0; right: 0; bottom: 0; min-width: 100%; min-height: 100%; font-zie: 999px; text-align: right; filter: alpha(opacity=0); opacity: 0; outline: none; cursor: inherit; display: block"> <!-- /ko --> <div class="progress" style="opacity: .5; width: 80%; margin-left: 10%; position: absolute; bottom: 30%; height: 20px; border: 2px solid black;"> <div class="progress-bar progress-bar-success" style="height: 20px; background-color: black; "></div> </div> </div></table>'),templateSystem.addTemplate("main",'<div id="page" style="display: none;" data-bind="visible: true, css: { withToolbox: $root.showToolbox, withPreviewFrame: showPreviewFrame }"> <div id="main-edit-area" data-bind="click: function(obj, evt) { $root.selectBlock(null); return true; }, clickBubble: false"> <!-- ko withProperties: { templateMode: \'wysiwyg\', templateModeFallback: \'show\' } --> <div id="main-wysiwyg-area" data-bind="wysiwygScrollfix: true, scrollable: true, fudroppable: { active: draggingImage }, css: { isdragging: dragging, isdraggingimg: draggingImage }, block: content"></div> <!-- /ko --> </div> <div id="toolbar" class="mo" data-bind="tooltips: {}"> <!-- ko if: typeof $root.undo != \'undefined\' --> <span data-bind="buttonset: { }" class="leftButtons"> <a title="Undo last operation" href="javascript:void(0)" data-bind="attr: { title: $root.t(\'Undo last operation\') }, click: $root.undo.execute, clickBubble: false, button: { disabled: !$root.undo.enabled(), icons: { primary: \'fa fa-reply\' }, label: $root.undo.name, text: true }">UNDO</a> <a title="Redo last operation" href="javascript:void(0)" data-bind="attr: { title: $root.t(\'Redo last operation\') }, click: $root.redo.execute, clickBubble: false, button: { disabled: !$root.redo.enabled(), icons: { primary: \'fa fa-share\' }, label: $root.redo.name, text: true }">REDO</a> </span> <!-- ko if: $root.debug --> <a href="javascript:void(0)" data-bind="click: $root.undoReset, clickBubble: false, button: { disabled: !$root.undo.enabled() && !$root.redo.enabled(), label: \'reset\', text: true }">RESET</a> <!-- /ko --> <!-- /ko --> <span> <input id="showGallery" type="checkbox" data-bind="checked: $root.showGallery, button: { refreshOn: $root.showGallery, icons: { primary: \'fa fa-fw fa-picture-o\', secondary: null }, text: true, label: $root.t(\'Gallery\') }"><label title="Show image gallery" for="showGallery" data-bind="attr: { title: $root.t(\'Show image gallery\') }">show gallery</label></input> </span> <input id="previewFrameToggle" type="checkbox" data-bind="checked: $root.showPreviewFrame, button: { refreshOn: $root.showPreviewFrame, icons: { primary: \'fa fa-fw fa-tablet\', secondary: null }, text: false, label: $root.t(\'Preview\') }"><label title="Show live preview" for="previewFrameToggle" data-bind="attr: { title: $root.t(\'Show live preview\') }">PREVIEW</label></input> <!-- ko if: $root.debug --> <a href="javascript:void(0)" data-bind="click: $root.export, clickBubble: false, button: { label: \'export\', text: true }">EXPORT</a> <input type="checkbox" data-bind="checked: $root.debug" /> debug <a href="javascript:void(0)" data-bind="click: $root.loadDefaultBlocks, clickBubble: false, button: { icons: { primary: \'fa fa-fw fa-upload\' }, label: \'Default\', text: true }">LOAD BLOCKS</a> [<a id="subscriptionsCount" href="javascript:viewModel.loopSubscriptionsCount()">subs</a>] <!-- /ko --> <span data-bind="visible: false"> <input type="checkbox" data-bind="checked: $root.showToolbox" /> toolbox </span> <div class="rightButtons"> <!-- ko if: typeof $root.save !== \'undefined\' --> <a title="Save template" href="javascript:void(0)" data-bind="attr: { title: $root.t(\'Save template\') }, click: $root.save.execute, clickBubble: false, button: { disabled: !$root.save.enabled(), icons: { primary: \'fa fa-fw fa-cloud-upload\' }, label: $root.t($root.save.name), text: true }">SALVA</a> <!-- /ko --> <!-- ko if: typeof $root.test !== \'undefined\' --> <a title="Show preview and send test" href="javascript:void(0)" data-bind="attr: { title: $root.t(\'Show preview and send test\') }, click: $root.test.execute, clickBubble: false, button: { disabled: !$root.test.enabled(), icons: { primary: \'fa fa-fw fa-paper-plane\' }, label: $root.t($root.test.name), text: true }">TEST</a> <!-- /ko --> <!-- ko if: typeof $root.download !== \'undefined\' --> <form id="downloadForm" action="#" method="POST"> <input type="hidden" name="action" value="download" /> <input type="hidden" name="filename" value="email.html" /> <input type="hidden" name="html" id="downloadHtmlTextarea" /> <a title="Download template" href="javascript:void(0)" data-bind="attr: { title: $root.t(\'Download template\') }, click: $root.download.execute, clickBubble: false, button: { disabled: !$root.download.enabled(), icons: { primary: \'fa fa-fw fa-download\' }, label: $root.t($root.download.name), text: true }">DOWNLOAD</a> </form> <!-- /ko --> </div> </div> <!-- ko if: $root.showToolbox --> <div id="main-toolbox" class="mo" data-bind="scrollable: true, withProperties: { templateMode: \'edit\' }"> <div data-bind="template: { name: \'toolbox\' }"></div> </div> <!-- /ko --> <div id="main-preview" class="mo" data-bind="scrollable: true, if: $root.showPreviewFrame"> <div id="preview-toolbar"> <div data-bind="visible: $root.showPreviewFrame, buttonset: { }" style="display: inline-block"> <input id="previewLarge" type="radio" name="previewMode" value="large" data-bind="checked: $root.previewMode, button: { text: false, label: \'large\', icons: { primary: \'fa fa-fw fa-desktop\' } }" /> <label for="previewLarge" title="Large screen" data-bind="attr: { title: $root.t(\'Large screen\') }">Large screen</label> <input id="previewDesktop" type="radio" name="previewMode" value="desktop" data-bind="checked: $root.previewMode, button: { text: false, label: \'desktop\', icons: { primary: \'fa fa-fw fa-tablet\' } }" /> <label for="previewDesktop" title="Tablet" data-bind="attr: { title: $root.t(\'Tablet\') }">Tablet</label> <input id="previewMobile" type="radio" name="previewMode" value="mobile" data-bind="checked: $root.previewMode, button: { text: false, label: \'mobile\', icons: { primary: \'fa fa-fw fa-mobile\' } }" /> <label for="previewMobile" title="Smartphone" data-bind="attr: { title: $root.t(\'Smartphone\') }">Smartphone</label> </div> </div> <div id="frame-container" data-bind="css: { desktop: $root.previewMode() == \'desktop\', mobile: $root.previewMode() == \'mobile\', large: $root.previewMode() == \'large\' }"> <iframe data-bind="bindIframe: $data"></iframe> </div> </div> <div class="mo" id="mo-body"></div> <!-- TODO REMOVE ME <div id="incompatible-browser" title="Unsupported browser" style="display: none" data-bind="attr: { title: $root.t(\'Usupported browser\') }, html: \'<p>Your browser is not supported.</p><p>Use a different browser or try updaring your browser.</p><p>Supported browsers: <ul><li>Internet Explorer >= 10</li><li>Google Chrome >= 30</li><li>Apple Safari >= 5</li><li>Mozilla Firefix >= 20</li></ul></p>\'"> Unsupported browser </div> --> <div id="incompatible-template" title="Saved model is obsolete" style="display: none" data-bind="attr: { title: $root.t(\'Saved model is obsolete\') }, html: $root.t(\'<p>The saved model has been created with a previous, non completely compatible version, of the template</p><p>Some content or style in the model <b>COULD BE LOST</b> if you will <b>save</b></p><p>Contact us for more informations!</p>\')"> Incompatible template </div> <div id="fake-image-editor" title="Fake image editor" style="display: none" data-bind="attr: { title: $root.t(\'Fake image editor\') }, html: $root.t(\'<p>Fake image editor</p>\')"> <p>Fake image editor</p> </div></div><!-- ko if: $root.logoPath --><div id="loading" class="loading" style="display: block; width: 300px; text-align: center; height: 32px; position: absolute; top:0; bottom: 0; left: 0; right: 0; margin: auto;" data-bind="attr: { style: \'position: absolute; top: 5px; left: 6px; z-index: 150;\'}, css: { loading: false }"> <a href="/" data-bind="attr: { href: $root.logoUrl, alt: $root.logoAlt }"><img data-bind="attr: { src: $root.logoPath }" width="32" height="32" alt="mosaico" border="0" /></a> <div style="opacity: 0" data-bind="visible: false">Oppps... !!</div></div><!-- /ko -->'),templateSystem.addTemplate("toolbox",'<div id="tooltabs" class="tabs_horizontal button_color" data-bind="tabs: { active: $root.selectedTool }"> <ul> <li data-bind="tooltips: {}"><a title="Blocks ready to be added to the template" data-local="true" href="#toolblocks" data-bind="attr: { title: $root.t(\'Blocks ready to be added to the template\') }"><i class="fa fa-fw fa-cubes"></i> <span data-bind="html: $root.t(\'Blocks\')">Blocks</span></a></li> <li data-bind="tooltips: {}"><a title="Edit content options" href="#toolcontents" data-local="true" data-bind="attr: { title: $root.t(\'Edit content options\') }"><i class="fa fa-fw fa-pencil"></i> <span data-bind="html: $root.t(\'Content\')">Content</span></a></li> <li data-bind="tooltips: {}"><a title="Edit style options" href="#toolstyles" data-local="true" data-bind="attr: { title: $root.t(\'Edit style options\') }"><i class="fa fa-fw fa-paint-brush"></i> <span data-bind="html: $root.t(\'Style\')">Style</span></a></li> </ul> <div id="toolblocks" data-bind="scrollable: true"> <div class="block-list" data-bind="foreach: blockDefs" style="text-align: center"> <div class="draggable-item" data-bind="withProperties: { templateMode: \'show\' }"> <div class="block" data-bind="extdraggable: { connectClass: \'sortable-blocks-edit\', data: $data, dropContainer: \'#main-wysiwyg-area\', dragging: $root.dragging, \'options\': { handle: \'.handle\', distance: 10, \'appendTo\': \'#page\' } }, click: $root.addBlock" style="position: relative;"> <div title="Click or drag to add this block to the template" class="handle" data-bind="attr: { title: $root.t(\'Click or drag to add this block to the template\') }, tooltips: {}"></div> <img data-bind="attr: { alt: $root.t(\'Block __name__\', { name: ko.utils.unwrapObservable(type) }), src: $root.templatePath(\'edres/\'+ko.utils.unwrapObservable(type)+\'.png\') }" alt="Block __name__" /> </div> <a href="javascript:void(0)" class="addblockbutton" data-bind="click: $root.addBlock, button: { label: $root.t(\'Add\') }">Add</a> </div> </div> </div> <div id="toolcontents" data-bind="scrollable: true"> <!-- ko if: $root.selectedBlock() !== null --> <div data-bind="block: $root.selectedBlock"></div> <!-- /ko --> <!-- ko if: $root.selectedBlock() == null --> <div class="noSelectedBlock" data-bind="text: $root.t(\'By clicking on message parts you will select a block and content options, if any, will show here\')">By clicking on message parts you will select a block and content options, if any, will show here</div> <!-- /ko --> <!-- ko block: content --><!-- /ko --> </div> <div id="toolstyles" data-bind="scrollable: true, withProperties: { templateMode: \'styler\' }"> <!-- ko if: typeof $root.content().theme === \'undefined\' || typeof $root.content().theme().scheme === \'undefined\' || $root.content().theme().scheme() === \'custom\' --> <!-- ko if: $root.selectedBlock() !== null --> <div data-bind="block: $root.selectedBlock, css: { workLocal: $root.selectedBlock().customStyle, workGlobal: typeof $root.selectedBlock().customStyle === \'undefined\' || !$root.selectedBlock().customStyle() }"></div> <!-- /ko --> <!-- ko if: $root.selectedBlock() == null --> <div class="noSelectedBlock" data-bind="text: $root.t(\'By clicking on message parts you will select a block and style options, if available, will show here\')">By clicking on message parts you will select a block and style options, if available, will show here</div> <!-- /ko --> <div class="workGlobalContent"> <!-- ko block: content --><!-- /ko --> </div> <!-- /ko --> </div></div> <div id="toolimages" class="slidebar" data-bind="scrollable: true, css: { hidden: $root.showGallery() === false }"> <div class="close" data-bind="click: $root.showGallery.bind($element, false);">X</div> <span class="pane-title" data-bind="text: $root.t(\'Gallery:\')">Gallery:</span> <div data-drop-content="Drop here" class="img-dropzone pane uploadzone" data-bind="attr: { \'data-drop-content\': $root.t(\'Drop here\') }, fudroppable: { activeClass: \'ui-state-highlight\', hoverClass: \'ui-state-draghover\' }"> <div class="mo-uploadzone" style="position: relative; padding: 2em; border: 2px dotted #808080"> <input class="fileupload" type="file" multiple name="files[]" data-bind="fileupload: { onerror: $root.notifier.error, onfile: $root.loadImage }" style="z-index: 10; position: absolute; top: 0; left: 0; right: 0; bottom: 0; min-width: 100%; min-height: 100%; font-zie: 999px; text-align: right; filter: alpha(opacity=0); opacity: 0; outline: none; cursor: inherit; display: block"> <span data-bind="text: $root.t(\'Click or drag files here\')">Click or drag files here</span> <div class="workzone" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; overflow: hidden;"> <div class="progress" style="opacity: .5; width: 80%; margin-left: 10%; position: absolute; bottom: 30%; height: 20px; border: 2px solid black;"> <div class="progress-bar progress-bar-success" style="height: 20px; background-color: black; "></div> </div> </div> </div> </div> <!-- ko if: $root.showGallery() --> <div id="toolimagestab" class="tabs_horizontal" data-bind="tabs: { active: $root.selectedImageTab }"> <ul> <li data-bind="tooltips: {}"><a title="Session images" data-local="true" href="#toolimagesrecent" data-bind="attr: { title: $root.t(\'Session images\') }, text: $root.t(\'Recents\')">Recents</a></li> <li data-bind="tooltips: {}"><a title="Remote gallery" data-local="true" href="#toolimagesgallery" data-bind="attr: { title: $root.t(\'Remote gallery\') }, text: $root.t(\'Gallery\')">Gallery</a></li> </ul> <div id="toolimagesrecent"> <!-- ko if: galleryRecent().length == 0 --><div class="galleryEmpty" data-bind="text: $root.t(\'No images uploaded, yet\')">No images uploaded, yet</div><!-- /ko --> <!-- ko template: {name: \'gallery-images\', data: { items: galleryRecent } } --># recent gallery #<!-- /ko --> </div> <div id="toolimagesgallery" style="text-align: center"> <!-- ko if: $root.galleryLoaded() === false --><a class="loadbutton" title="Show images from the gallery" href="javascript:void(0)" data-bind="attr: { title: $root.t(\'Show images from the gallery\') }, click: $root.loadGallery, button: { disabled: $root.galleryLoaded, icons: { primary: \'fa fa-fw fa-picture-o\' }, label: $root.galleryLoaded() == \'loading\' ? $root.t(\'Loading...\') : $root.t(\'Load gallery\'), text: true }"># load gally #</a><!-- /ko --> <!-- ko if: $root.galleryLoaded() === \'loading\' --><div class="galleryEmpty" data-bind="text: $root.t(\'Loading gallery...\')">Loading gallery...</div><!-- /ko --> <!-- ko if: $root.galleryLoaded() === 0 --><div class="galleryEmpty" data-bind="text: $root.t(\'The gallery is empty\')">The gallery is empty</div><!-- /ko --> <!-- ko template: {name: \'gallery-images\', data: { items: galleryRemote } } --># remote gallery #<!-- /ko --> </div> </div> <!-- /ko --></div><div id="tooldebug" class="slidebar" data-bind="css: { hidden: $root.debug() === false }"> <div class="close" data-bind="click: $root.debug.bind($element, false);">X</div> <!-- ko if: $root.debug --> Content: <pre data-bind=\'text: ko.toJSON(content, null, 2)\' style="overflow: auto; height: 20%"></pre> BlockDefs: <pre data-bind=\'text: ko.toJSON(blockDefs, null, 2)\' style="overflow: auto; height: 20%"></pre> <!-- /ko --> <a href="javascript:void(0)" data-bind="click: $root.exportHTMLtoTextarea.bind($element, \'#outputhtml\'); clickBubble: false, button: { text: true, label:\'Generate\' }">Output</a> <a href="javascript:void(0)" data-bind="click: $root.exportJSONtoTextarea.bind($element, \'#outputhtml\'); clickBubble: false, button: { text: true, label:\'Export\' }">Export</a> <a href="javascript:void(0)" data-bind="click: $root.importJSONfromTextarea.bind($element, \'#outputhtml\'); clickBubble: false, button: { text: true, label:\'Import\' }">Import</a> <textarea id="outputhtml" rows="10" style="width: 100%;"></textarea></div><div id="tooltheme" class="ui-widget slidebar" data-bind="css: { hidden: $root.showTheme() === false }"> <div class="close" data-bind="click: $root.showTheme.bind($element, false);">X</div> <!-- ko withProperties: { templateMode: \'styler\' } --> <!-- ko if: $root.showTheme --> <!-- ko block: $root.content().theme --><!-- /ko --> <!-- /ko --> <!-- /ko --></div>')});
|
81
|
+
|
82
|
+
},{"../src/js/bindings/choose-template.js":30}],21:[function(require,module,exports){
|
83
|
+
// http://wiki.commonjs.org/wiki/Unit_Testing/1.0
|
84
|
+
//
|
85
|
+
// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
|
86
|
+
//
|
87
|
+
// Originally from narwhal.js (http://narwhaljs.org)
|
88
|
+
// Copyright (c) 2009 Thomas Robinson <280north.com>
|
89
|
+
//
|
90
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
91
|
+
// of this software and associated documentation files (the 'Software'), to
|
92
|
+
// deal in the Software without restriction, including without limitation the
|
93
|
+
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
94
|
+
// sell copies of the Software, and to permit persons to whom the Software is
|
95
|
+
// furnished to do so, subject to the following conditions:
|
96
|
+
//
|
97
|
+
// The above copyright notice and this permission notice shall be included in
|
98
|
+
// all copies or substantial portions of the Software.
|
99
|
+
//
|
100
|
+
// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
101
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
102
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
103
|
+
// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
104
|
+
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
105
|
+
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
106
|
+
|
107
|
+
// when used in node, this will actually load the util module we depend on
|
108
|
+
// versus loading the builtin util module as happens otherwise
|
109
|
+
// this is a bug in node module loading as far as I am concerned
|
110
|
+
var util = require('util/');
|
111
|
+
|
112
|
+
var pSlice = Array.prototype.slice;
|
113
|
+
var hasOwn = Object.prototype.hasOwnProperty;
|
114
|
+
|
115
|
+
// 1. The assert module provides functions that throw
|
116
|
+
// AssertionError's when particular conditions are not met. The
|
117
|
+
// assert module must conform to the following interface.
|
118
|
+
|
119
|
+
var assert = module.exports = ok;
|
120
|
+
|
121
|
+
// 2. The AssertionError is defined in assert.
|
122
|
+
// new assert.AssertionError({ message: message,
|
123
|
+
// actual: actual,
|
124
|
+
// expected: expected })
|
125
|
+
|
126
|
+
assert.AssertionError = function AssertionError(options) {
|
127
|
+
this.name = 'AssertionError';
|
128
|
+
this.actual = options.actual;
|
129
|
+
this.expected = options.expected;
|
130
|
+
this.operator = options.operator;
|
131
|
+
if (options.message) {
|
132
|
+
this.message = options.message;
|
133
|
+
this.generatedMessage = false;
|
134
|
+
} else {
|
135
|
+
this.message = getMessage(this);
|
136
|
+
this.generatedMessage = true;
|
137
|
+
}
|
138
|
+
var stackStartFunction = options.stackStartFunction || fail;
|
139
|
+
|
140
|
+
if (Error.captureStackTrace) {
|
141
|
+
Error.captureStackTrace(this, stackStartFunction);
|
142
|
+
}
|
143
|
+
else {
|
144
|
+
// non v8 browsers so we can have a stacktrace
|
145
|
+
var err = new Error();
|
146
|
+
if (err.stack) {
|
147
|
+
var out = err.stack;
|
148
|
+
|
149
|
+
// try to strip useless frames
|
150
|
+
var fn_name = stackStartFunction.name;
|
151
|
+
var idx = out.indexOf('\n' + fn_name);
|
152
|
+
if (idx >= 0) {
|
153
|
+
// once we have located the function frame
|
154
|
+
// we need to strip out everything before it (and its line)
|
155
|
+
var next_line = out.indexOf('\n', idx + 1);
|
156
|
+
out = out.substring(next_line + 1);
|
157
|
+
}
|
158
|
+
|
159
|
+
this.stack = out;
|
160
|
+
}
|
161
|
+
}
|
162
|
+
};
|
163
|
+
|
164
|
+
// assert.AssertionError instanceof Error
|
165
|
+
util.inherits(assert.AssertionError, Error);
|
166
|
+
|
167
|
+
function replacer(key, value) {
|
168
|
+
if (util.isUndefined(value)) {
|
169
|
+
return '' + value;
|
170
|
+
}
|
171
|
+
if (util.isNumber(value) && !isFinite(value)) {
|
172
|
+
return value.toString();
|
173
|
+
}
|
174
|
+
if (util.isFunction(value) || util.isRegExp(value)) {
|
175
|
+
return value.toString();
|
176
|
+
}
|
177
|
+
return value;
|
178
|
+
}
|
179
|
+
|
180
|
+
function truncate(s, n) {
|
181
|
+
if (util.isString(s)) {
|
182
|
+
return s.length < n ? s : s.slice(0, n);
|
183
|
+
} else {
|
184
|
+
return s;
|
185
|
+
}
|
186
|
+
}
|
187
|
+
|
188
|
+
function getMessage(self) {
|
189
|
+
return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' +
|
190
|
+
self.operator + ' ' +
|
191
|
+
truncate(JSON.stringify(self.expected, replacer), 128);
|
192
|
+
}
|
193
|
+
|
194
|
+
// At present only the three keys mentioned above are used and
|
195
|
+
// understood by the spec. Implementations or sub modules can pass
|
196
|
+
// other keys to the AssertionError's constructor - they will be
|
197
|
+
// ignored.
|
198
|
+
|
199
|
+
// 3. All of the following functions must throw an AssertionError
|
200
|
+
// when a corresponding condition is not met, with a message that
|
201
|
+
// may be undefined if not provided. All assertion methods provide
|
202
|
+
// both the actual and expected values to the assertion error for
|
203
|
+
// display purposes.
|
204
|
+
|
205
|
+
function fail(actual, expected, message, operator, stackStartFunction) {
|
206
|
+
throw new assert.AssertionError({
|
207
|
+
message: message,
|
208
|
+
actual: actual,
|
209
|
+
expected: expected,
|
210
|
+
operator: operator,
|
211
|
+
stackStartFunction: stackStartFunction
|
212
|
+
});
|
213
|
+
}
|
214
|
+
|
215
|
+
// EXTENSION! allows for well behaved errors defined elsewhere.
|
216
|
+
assert.fail = fail;
|
217
|
+
|
218
|
+
// 4. Pure assertion tests whether a value is truthy, as determined
|
219
|
+
// by !!guard.
|
220
|
+
// assert.ok(guard, message_opt);
|
221
|
+
// This statement is equivalent to assert.equal(true, !!guard,
|
222
|
+
// message_opt);. To test strictly for the value true, use
|
223
|
+
// assert.strictEqual(true, guard, message_opt);.
|
224
|
+
|
225
|
+
function ok(value, message) {
|
226
|
+
if (!value) fail(value, true, message, '==', assert.ok);
|
227
|
+
}
|
228
|
+
assert.ok = ok;
|
229
|
+
|
230
|
+
// 5. The equality assertion tests shallow, coercive equality with
|
231
|
+
// ==.
|
232
|
+
// assert.equal(actual, expected, message_opt);
|
233
|
+
|
234
|
+
assert.equal = function equal(actual, expected, message) {
|
235
|
+
if (actual != expected) fail(actual, expected, message, '==', assert.equal);
|
236
|
+
};
|
237
|
+
|
238
|
+
// 6. The non-equality assertion tests for whether two objects are not equal
|
239
|
+
// with != assert.notEqual(actual, expected, message_opt);
|
240
|
+
|
241
|
+
assert.notEqual = function notEqual(actual, expected, message) {
|
242
|
+
if (actual == expected) {
|
243
|
+
fail(actual, expected, message, '!=', assert.notEqual);
|
244
|
+
}
|
245
|
+
};
|
246
|
+
|
247
|
+
// 7. The equivalence assertion tests a deep equality relation.
|
248
|
+
// assert.deepEqual(actual, expected, message_opt);
|
249
|
+
|
250
|
+
assert.deepEqual = function deepEqual(actual, expected, message) {
|
251
|
+
if (!_deepEqual(actual, expected)) {
|
252
|
+
fail(actual, expected, message, 'deepEqual', assert.deepEqual);
|
253
|
+
}
|
254
|
+
};
|
255
|
+
|
256
|
+
function _deepEqual(actual, expected) {
|
257
|
+
// 7.1. All identical values are equivalent, as determined by ===.
|
258
|
+
if (actual === expected) {
|
259
|
+
return true;
|
260
|
+
|
261
|
+
} else if (util.isBuffer(actual) && util.isBuffer(expected)) {
|
262
|
+
if (actual.length != expected.length) return false;
|
263
|
+
|
264
|
+
for (var i = 0; i < actual.length; i++) {
|
265
|
+
if (actual[i] !== expected[i]) return false;
|
266
|
+
}
|
267
|
+
|
268
|
+
return true;
|
269
|
+
|
270
|
+
// 7.2. If the expected value is a Date object, the actual value is
|
271
|
+
// equivalent if it is also a Date object that refers to the same time.
|
272
|
+
} else if (util.isDate(actual) && util.isDate(expected)) {
|
273
|
+
return actual.getTime() === expected.getTime();
|
274
|
+
|
275
|
+
// 7.3 If the expected value is a RegExp object, the actual value is
|
276
|
+
// equivalent if it is also a RegExp object with the same source and
|
277
|
+
// properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
|
278
|
+
} else if (util.isRegExp(actual) && util.isRegExp(expected)) {
|
279
|
+
return actual.source === expected.source &&
|
280
|
+
actual.global === expected.global &&
|
281
|
+
actual.multiline === expected.multiline &&
|
282
|
+
actual.lastIndex === expected.lastIndex &&
|
283
|
+
actual.ignoreCase === expected.ignoreCase;
|
284
|
+
|
285
|
+
// 7.4. Other pairs that do not both pass typeof value == 'object',
|
286
|
+
// equivalence is determined by ==.
|
287
|
+
} else if (!util.isObject(actual) && !util.isObject(expected)) {
|
288
|
+
return actual == expected;
|
289
|
+
|
290
|
+
// 7.5 For all other Object pairs, including Array objects, equivalence is
|
291
|
+
// determined by having the same number of owned properties (as verified
|
292
|
+
// with Object.prototype.hasOwnProperty.call), the same set of keys
|
293
|
+
// (although not necessarily the same order), equivalent values for every
|
294
|
+
// corresponding key, and an identical 'prototype' property. Note: this
|
295
|
+
// accounts for both named and indexed properties on Arrays.
|
296
|
+
} else {
|
297
|
+
return objEquiv(actual, expected);
|
298
|
+
}
|
299
|
+
}
|
300
|
+
|
301
|
+
function isArguments(object) {
|
302
|
+
return Object.prototype.toString.call(object) == '[object Arguments]';
|
303
|
+
}
|
304
|
+
|
305
|
+
function objEquiv(a, b) {
|
306
|
+
if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b))
|
307
|
+
return false;
|
308
|
+
// an identical 'prototype' property.
|
309
|
+
if (a.prototype !== b.prototype) return false;
|
310
|
+
// if one is a primitive, the other must be same
|
311
|
+
if (util.isPrimitive(a) || util.isPrimitive(b)) {
|
312
|
+
return a === b;
|
313
|
+
}
|
314
|
+
var aIsArgs = isArguments(a),
|
315
|
+
bIsArgs = isArguments(b);
|
316
|
+
if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
|
317
|
+
return false;
|
318
|
+
if (aIsArgs) {
|
319
|
+
a = pSlice.call(a);
|
320
|
+
b = pSlice.call(b);
|
321
|
+
return _deepEqual(a, b);
|
322
|
+
}
|
323
|
+
var ka = objectKeys(a),
|
324
|
+
kb = objectKeys(b),
|
325
|
+
key, i;
|
326
|
+
// having the same number of owned properties (keys incorporates
|
327
|
+
// hasOwnProperty)
|
328
|
+
if (ka.length != kb.length)
|
329
|
+
return false;
|
330
|
+
//the same set of keys (although not necessarily the same order),
|
331
|
+
ka.sort();
|
332
|
+
kb.sort();
|
333
|
+
//~~~cheap key test
|
334
|
+
for (i = ka.length - 1; i >= 0; i--) {
|
335
|
+
if (ka[i] != kb[i])
|
336
|
+
return false;
|
337
|
+
}
|
338
|
+
//equivalent values for every corresponding key, and
|
339
|
+
//~~~possibly expensive deep test
|
340
|
+
for (i = ka.length - 1; i >= 0; i--) {
|
341
|
+
key = ka[i];
|
342
|
+
if (!_deepEqual(a[key], b[key])) return false;
|
343
|
+
}
|
344
|
+
return true;
|
345
|
+
}
|
346
|
+
|
347
|
+
// 8. The non-equivalence assertion tests for any deep inequality.
|
348
|
+
// assert.notDeepEqual(actual, expected, message_opt);
|
349
|
+
|
350
|
+
assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
|
351
|
+
if (_deepEqual(actual, expected)) {
|
352
|
+
fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
|
353
|
+
}
|
354
|
+
};
|
355
|
+
|
356
|
+
// 9. The strict equality assertion tests strict equality, as determined by ===.
|
357
|
+
// assert.strictEqual(actual, expected, message_opt);
|
358
|
+
|
359
|
+
assert.strictEqual = function strictEqual(actual, expected, message) {
|
360
|
+
if (actual !== expected) {
|
361
|
+
fail(actual, expected, message, '===', assert.strictEqual);
|
362
|
+
}
|
363
|
+
};
|
364
|
+
|
365
|
+
// 10. The strict non-equality assertion tests for strict inequality, as
|
366
|
+
// determined by !==. assert.notStrictEqual(actual, expected, message_opt);
|
367
|
+
|
368
|
+
assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
|
369
|
+
if (actual === expected) {
|
370
|
+
fail(actual, expected, message, '!==', assert.notStrictEqual);
|
371
|
+
}
|
372
|
+
};
|
373
|
+
|
374
|
+
function expectedException(actual, expected) {
|
375
|
+
if (!actual || !expected) {
|
376
|
+
return false;
|
377
|
+
}
|
378
|
+
|
379
|
+
if (Object.prototype.toString.call(expected) == '[object RegExp]') {
|
380
|
+
return expected.test(actual);
|
381
|
+
} else if (actual instanceof expected) {
|
382
|
+
return true;
|
383
|
+
} else if (expected.call({}, actual) === true) {
|
384
|
+
return true;
|
385
|
+
}
|
386
|
+
|
387
|
+
return false;
|
388
|
+
}
|
389
|
+
|
390
|
+
function _throws(shouldThrow, block, expected, message) {
|
391
|
+
var actual;
|
392
|
+
|
393
|
+
if (util.isString(expected)) {
|
394
|
+
message = expected;
|
395
|
+
expected = null;
|
396
|
+
}
|
397
|
+
|
398
|
+
try {
|
399
|
+
block();
|
400
|
+
} catch (e) {
|
401
|
+
actual = e;
|
402
|
+
}
|
403
|
+
|
404
|
+
message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
|
405
|
+
(message ? ' ' + message : '.');
|
406
|
+
|
407
|
+
if (shouldThrow && !actual) {
|
408
|
+
fail(actual, expected, 'Missing expected exception' + message);
|
409
|
+
}
|
410
|
+
|
411
|
+
if (!shouldThrow && expectedException(actual, expected)) {
|
412
|
+
fail(actual, expected, 'Got unwanted exception' + message);
|
413
|
+
}
|
414
|
+
|
415
|
+
if ((shouldThrow && actual && expected &&
|
416
|
+
!expectedException(actual, expected)) || (!shouldThrow && actual)) {
|
417
|
+
throw actual;
|
418
|
+
}
|
419
|
+
}
|
420
|
+
|
421
|
+
// 11. Expected to throw an error:
|
422
|
+
// assert.throws(block, Error_opt, message_opt);
|
423
|
+
|
424
|
+
assert.throws = function(block, /*optional*/error, /*optional*/message) {
|
425
|
+
_throws.apply(this, [true].concat(pSlice.call(arguments)));
|
426
|
+
};
|
427
|
+
|
428
|
+
// EXTENSION! This is annoying to write outside this module.
|
429
|
+
assert.doesNotThrow = function(block, /*optional*/message) {
|
430
|
+
_throws.apply(this, [false].concat(pSlice.call(arguments)));
|
431
|
+
};
|
432
|
+
|
433
|
+
assert.ifError = function(err) { if (err) {throw err;}};
|
434
|
+
|
435
|
+
var objectKeys = Object.keys || function (obj) {
|
436
|
+
var keys = [];
|
437
|
+
for (var key in obj) {
|
438
|
+
if (hasOwn.call(obj, key)) keys.push(key);
|
439
|
+
}
|
440
|
+
return keys;
|
441
|
+
};
|
442
|
+
|
443
|
+
},{"util/":26}],22:[function(require,module,exports){
|
444
|
+
exports.endianness = function () { return 'LE' };
|
445
|
+
|
446
|
+
exports.hostname = function () {
|
447
|
+
if (typeof location !== 'undefined') {
|
448
|
+
return location.hostname
|
449
|
+
}
|
450
|
+
else return '';
|
451
|
+
};
|
452
|
+
|
453
|
+
exports.loadavg = function () { return [] };
|
454
|
+
|
455
|
+
exports.uptime = function () { return 0 };
|
456
|
+
|
457
|
+
exports.freemem = function () {
|
458
|
+
return Number.MAX_VALUE;
|
459
|
+
};
|
460
|
+
|
461
|
+
exports.totalmem = function () {
|
462
|
+
return Number.MAX_VALUE;
|
463
|
+
};
|
464
|
+
|
465
|
+
exports.cpus = function () { return [] };
|
466
|
+
|
467
|
+
exports.type = function () { return 'Browser' };
|
468
|
+
|
469
|
+
exports.release = function () {
|
470
|
+
if (typeof navigator !== 'undefined') {
|
471
|
+
return navigator.appVersion;
|
472
|
+
}
|
473
|
+
return '';
|
474
|
+
};
|
475
|
+
|
476
|
+
exports.networkInterfaces
|
477
|
+
= exports.getNetworkInterfaces
|
478
|
+
= function () { return {} };
|
479
|
+
|
480
|
+
exports.arch = function () { return 'javascript' };
|
481
|
+
|
482
|
+
exports.platform = function () { return 'browser' };
|
483
|
+
|
484
|
+
exports.tmpdir = exports.tmpDir = function () {
|
485
|
+
return '/tmp';
|
486
|
+
};
|
487
|
+
|
488
|
+
exports.EOL = '\n';
|
489
|
+
|
490
|
+
},{}],23:[function(require,module,exports){
|
491
|
+
// shim for using process in browser
|
492
|
+
var process = module.exports = {};
|
493
|
+
|
494
|
+
// cached from whatever global is present so that test runners that stub it
|
495
|
+
// don't break things. But we need to wrap it in a try catch in case it is
|
496
|
+
// wrapped in strict mode code which doesn't define any globals. It's inside a
|
497
|
+
// function because try/catches deoptimize in certain engines.
|
498
|
+
|
499
|
+
var cachedSetTimeout;
|
500
|
+
var cachedClearTimeout;
|
501
|
+
|
502
|
+
function defaultSetTimout() {
|
503
|
+
throw new Error('setTimeout has not been defined');
|
504
|
+
}
|
505
|
+
function defaultClearTimeout () {
|
506
|
+
throw new Error('clearTimeout has not been defined');
|
507
|
+
}
|
508
|
+
(function () {
|
509
|
+
try {
|
510
|
+
if (typeof setTimeout === 'function') {
|
511
|
+
cachedSetTimeout = setTimeout;
|
512
|
+
} else {
|
513
|
+
cachedSetTimeout = defaultSetTimout;
|
514
|
+
}
|
515
|
+
} catch (e) {
|
516
|
+
cachedSetTimeout = defaultSetTimout;
|
517
|
+
}
|
518
|
+
try {
|
519
|
+
if (typeof clearTimeout === 'function') {
|
520
|
+
cachedClearTimeout = clearTimeout;
|
521
|
+
} else {
|
522
|
+
cachedClearTimeout = defaultClearTimeout;
|
523
|
+
}
|
524
|
+
} catch (e) {
|
525
|
+
cachedClearTimeout = defaultClearTimeout;
|
526
|
+
}
|
527
|
+
} ())
|
528
|
+
function runTimeout(fun) {
|
529
|
+
if (cachedSetTimeout === setTimeout) {
|
530
|
+
//normal enviroments in sane situations
|
531
|
+
return setTimeout(fun, 0);
|
532
|
+
}
|
533
|
+
// if setTimeout wasn't available but was latter defined
|
534
|
+
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
|
535
|
+
cachedSetTimeout = setTimeout;
|
536
|
+
return setTimeout(fun, 0);
|
537
|
+
}
|
538
|
+
try {
|
539
|
+
// when when somebody has screwed with setTimeout but no I.E. maddness
|
540
|
+
return cachedSetTimeout(fun, 0);
|
541
|
+
} catch(e){
|
542
|
+
try {
|
543
|
+
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
544
|
+
return cachedSetTimeout.call(null, fun, 0);
|
545
|
+
} catch(e){
|
546
|
+
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
|
547
|
+
return cachedSetTimeout.call(this, fun, 0);
|
548
|
+
}
|
549
|
+
}
|
550
|
+
|
551
|
+
|
552
|
+
}
|
553
|
+
function runClearTimeout(marker) {
|
554
|
+
if (cachedClearTimeout === clearTimeout) {
|
555
|
+
//normal enviroments in sane situations
|
556
|
+
return clearTimeout(marker);
|
557
|
+
}
|
558
|
+
// if clearTimeout wasn't available but was latter defined
|
559
|
+
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
|
560
|
+
cachedClearTimeout = clearTimeout;
|
561
|
+
return clearTimeout(marker);
|
562
|
+
}
|
563
|
+
try {
|
564
|
+
// when when somebody has screwed with setTimeout but no I.E. maddness
|
565
|
+
return cachedClearTimeout(marker);
|
566
|
+
} catch (e){
|
567
|
+
try {
|
568
|
+
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
569
|
+
return cachedClearTimeout.call(null, marker);
|
570
|
+
} catch (e){
|
571
|
+
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
|
572
|
+
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
|
573
|
+
return cachedClearTimeout.call(this, marker);
|
574
|
+
}
|
575
|
+
}
|
576
|
+
|
577
|
+
|
578
|
+
|
579
|
+
}
|
580
|
+
var queue = [];
|
581
|
+
var draining = false;
|
582
|
+
var currentQueue;
|
583
|
+
var queueIndex = -1;
|
584
|
+
|
585
|
+
function cleanUpNextTick() {
|
586
|
+
if (!draining || !currentQueue) {
|
587
|
+
return;
|
588
|
+
}
|
589
|
+
draining = false;
|
590
|
+
if (currentQueue.length) {
|
591
|
+
queue = currentQueue.concat(queue);
|
592
|
+
} else {
|
593
|
+
queueIndex = -1;
|
594
|
+
}
|
595
|
+
if (queue.length) {
|
596
|
+
drainQueue();
|
597
|
+
}
|
598
|
+
}
|
599
|
+
|
600
|
+
function drainQueue() {
|
601
|
+
if (draining) {
|
602
|
+
return;
|
603
|
+
}
|
604
|
+
var timeout = runTimeout(cleanUpNextTick);
|
605
|
+
draining = true;
|
606
|
+
|
607
|
+
var len = queue.length;
|
608
|
+
while(len) {
|
609
|
+
currentQueue = queue;
|
610
|
+
queue = [];
|
611
|
+
while (++queueIndex < len) {
|
612
|
+
if (currentQueue) {
|
613
|
+
currentQueue[queueIndex].run();
|
614
|
+
}
|
615
|
+
}
|
616
|
+
queueIndex = -1;
|
617
|
+
len = queue.length;
|
618
|
+
}
|
619
|
+
currentQueue = null;
|
620
|
+
draining = false;
|
621
|
+
runClearTimeout(timeout);
|
622
|
+
}
|
623
|
+
|
624
|
+
process.nextTick = function (fun) {
|
625
|
+
var args = new Array(arguments.length - 1);
|
626
|
+
if (arguments.length > 1) {
|
627
|
+
for (var i = 1; i < arguments.length; i++) {
|
628
|
+
args[i - 1] = arguments[i];
|
629
|
+
}
|
630
|
+
}
|
631
|
+
queue.push(new Item(fun, args));
|
632
|
+
if (queue.length === 1 && !draining) {
|
633
|
+
runTimeout(drainQueue);
|
634
|
+
}
|
635
|
+
};
|
636
|
+
|
637
|
+
// v8 likes predictible objects
|
638
|
+
function Item(fun, array) {
|
639
|
+
this.fun = fun;
|
640
|
+
this.array = array;
|
641
|
+
}
|
642
|
+
Item.prototype.run = function () {
|
643
|
+
this.fun.apply(null, this.array);
|
644
|
+
};
|
645
|
+
process.title = 'browser';
|
646
|
+
process.browser = true;
|
647
|
+
process.env = {};
|
648
|
+
process.argv = [];
|
649
|
+
process.version = ''; // empty string to avoid regexp issues
|
650
|
+
process.versions = {};
|
651
|
+
|
652
|
+
function noop() {}
|
653
|
+
|
654
|
+
process.on = noop;
|
655
|
+
process.addListener = noop;
|
656
|
+
process.once = noop;
|
657
|
+
process.off = noop;
|
658
|
+
process.removeListener = noop;
|
659
|
+
process.removeAllListeners = noop;
|
660
|
+
process.emit = noop;
|
661
|
+
process.prependListener = noop;
|
662
|
+
process.prependOnceListener = noop;
|
663
|
+
|
664
|
+
process.listeners = function (name) { return [] }
|
665
|
+
|
666
|
+
process.binding = function (name) {
|
667
|
+
throw new Error('process.binding is not supported');
|
668
|
+
};
|
669
|
+
|
670
|
+
process.cwd = function () { return '/' };
|
671
|
+
process.chdir = function (dir) {
|
672
|
+
throw new Error('process.chdir is not supported');
|
673
|
+
};
|
674
|
+
process.umask = function() { return 0; };
|
675
|
+
|
676
|
+
},{}],24:[function(require,module,exports){
|
677
|
+
if (typeof Object.create === 'function') {
|
678
|
+
// implementation from standard node.js 'util' module
|
679
|
+
module.exports = function inherits(ctor, superCtor) {
|
680
|
+
ctor.super_ = superCtor
|
681
|
+
ctor.prototype = Object.create(superCtor.prototype, {
|
682
|
+
constructor: {
|
683
|
+
value: ctor,
|
684
|
+
enumerable: false,
|
685
|
+
writable: true,
|
686
|
+
configurable: true
|
687
|
+
}
|
688
|
+
});
|
689
|
+
};
|
690
|
+
} else {
|
691
|
+
// old school shim for old browsers
|
692
|
+
module.exports = function inherits(ctor, superCtor) {
|
693
|
+
ctor.super_ = superCtor
|
694
|
+
var TempCtor = function () {}
|
695
|
+
TempCtor.prototype = superCtor.prototype
|
696
|
+
ctor.prototype = new TempCtor()
|
697
|
+
ctor.prototype.constructor = ctor
|
698
|
+
}
|
699
|
+
}
|
700
|
+
|
701
|
+
},{}],25:[function(require,module,exports){
|
702
|
+
module.exports = function isBuffer(arg) {
|
703
|
+
return arg && typeof arg === 'object'
|
704
|
+
&& typeof arg.copy === 'function'
|
705
|
+
&& typeof arg.fill === 'function'
|
706
|
+
&& typeof arg.readUInt8 === 'function';
|
707
|
+
}
|
708
|
+
},{}],26:[function(require,module,exports){
|
709
|
+
(function (process,global){
|
710
|
+
// Copyright Joyent, Inc. and other Node contributors.
|
711
|
+
//
|
712
|
+
// Permission is hereby granted, free of charge, to any person obtaining a
|
713
|
+
// copy of this software and associated documentation files (the
|
714
|
+
// "Software"), to deal in the Software without restriction, including
|
715
|
+
// without limitation the rights to use, copy, modify, merge, publish,
|
716
|
+
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
717
|
+
// persons to whom the Software is furnished to do so, subject to the
|
718
|
+
// following conditions:
|
719
|
+
//
|
720
|
+
// The above copyright notice and this permission notice shall be included
|
721
|
+
// in all copies or substantial portions of the Software.
|
722
|
+
//
|
723
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
724
|
+
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
725
|
+
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
726
|
+
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
727
|
+
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
728
|
+
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
729
|
+
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
730
|
+
|
731
|
+
var formatRegExp = /%[sdj%]/g;
|
732
|
+
exports.format = function(f) {
|
733
|
+
if (!isString(f)) {
|
734
|
+
var objects = [];
|
735
|
+
for (var i = 0; i < arguments.length; i++) {
|
736
|
+
objects.push(inspect(arguments[i]));
|
737
|
+
}
|
738
|
+
return objects.join(' ');
|
739
|
+
}
|
740
|
+
|
741
|
+
var i = 1;
|
742
|
+
var args = arguments;
|
743
|
+
var len = args.length;
|
744
|
+
var str = String(f).replace(formatRegExp, function(x) {
|
745
|
+
if (x === '%%') return '%';
|
746
|
+
if (i >= len) return x;
|
747
|
+
switch (x) {
|
748
|
+
case '%s': return String(args[i++]);
|
749
|
+
case '%d': return Number(args[i++]);
|
750
|
+
case '%j':
|
751
|
+
try {
|
752
|
+
return JSON.stringify(args[i++]);
|
753
|
+
} catch (_) {
|
754
|
+
return '[Circular]';
|
755
|
+
}
|
756
|
+
default:
|
757
|
+
return x;
|
758
|
+
}
|
759
|
+
});
|
760
|
+
for (var x = args[i]; i < len; x = args[++i]) {
|
761
|
+
if (isNull(x) || !isObject(x)) {
|
762
|
+
str += ' ' + x;
|
763
|
+
} else {
|
764
|
+
str += ' ' + inspect(x);
|
765
|
+
}
|
766
|
+
}
|
767
|
+
return str;
|
768
|
+
};
|
769
|
+
|
770
|
+
|
771
|
+
// Mark that a method should not be used.
|
772
|
+
// Returns a modified function which warns once by default.
|
773
|
+
// If --no-deprecation is set, then it is a no-op.
|
774
|
+
exports.deprecate = function(fn, msg) {
|
775
|
+
// Allow for deprecating things in the process of starting up.
|
776
|
+
if (isUndefined(global.process)) {
|
777
|
+
return function() {
|
778
|
+
return exports.deprecate(fn, msg).apply(this, arguments);
|
779
|
+
};
|
780
|
+
}
|
781
|
+
|
782
|
+
if (process.noDeprecation === true) {
|
783
|
+
return fn;
|
784
|
+
}
|
785
|
+
|
786
|
+
var warned = false;
|
787
|
+
function deprecated() {
|
788
|
+
if (!warned) {
|
789
|
+
if (process.throwDeprecation) {
|
790
|
+
throw new Error(msg);
|
791
|
+
} else if (process.traceDeprecation) {
|
792
|
+
console.trace(msg);
|
793
|
+
} else {
|
794
|
+
console.error(msg);
|
795
|
+
}
|
796
|
+
warned = true;
|
797
|
+
}
|
798
|
+
return fn.apply(this, arguments);
|
799
|
+
}
|
800
|
+
|
801
|
+
return deprecated;
|
802
|
+
};
|
803
|
+
|
804
|
+
|
805
|
+
var debugs = {};
|
806
|
+
var debugEnviron;
|
807
|
+
exports.debuglog = function(set) {
|
808
|
+
if (isUndefined(debugEnviron))
|
809
|
+
debugEnviron = process.env.NODE_DEBUG || '';
|
810
|
+
set = set.toUpperCase();
|
811
|
+
if (!debugs[set]) {
|
812
|
+
if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
|
813
|
+
var pid = process.pid;
|
814
|
+
debugs[set] = function() {
|
815
|
+
var msg = exports.format.apply(exports, arguments);
|
816
|
+
console.error('%s %d: %s', set, pid, msg);
|
817
|
+
};
|
818
|
+
} else {
|
819
|
+
debugs[set] = function() {};
|
820
|
+
}
|
821
|
+
}
|
822
|
+
return debugs[set];
|
823
|
+
};
|
824
|
+
|
825
|
+
|
826
|
+
/**
|
827
|
+
* Echos the value of a value. Trys to print the value out
|
828
|
+
* in the best way possible given the different types.
|
829
|
+
*
|
830
|
+
* @param {Object} obj The object to print out.
|
831
|
+
* @param {Object} opts Optional options object that alters the output.
|
832
|
+
*/
|
833
|
+
/* legacy: obj, showHidden, depth, colors*/
|
834
|
+
function inspect(obj, opts) {
|
835
|
+
// default options
|
836
|
+
var ctx = {
|
837
|
+
seen: [],
|
838
|
+
stylize: stylizeNoColor
|
839
|
+
};
|
840
|
+
// legacy...
|
841
|
+
if (arguments.length >= 3) ctx.depth = arguments[2];
|
842
|
+
if (arguments.length >= 4) ctx.colors = arguments[3];
|
843
|
+
if (isBoolean(opts)) {
|
844
|
+
// legacy...
|
845
|
+
ctx.showHidden = opts;
|
846
|
+
} else if (opts) {
|
847
|
+
// got an "options" object
|
848
|
+
exports._extend(ctx, opts);
|
849
|
+
}
|
850
|
+
// set default options
|
851
|
+
if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
|
852
|
+
if (isUndefined(ctx.depth)) ctx.depth = 2;
|
853
|
+
if (isUndefined(ctx.colors)) ctx.colors = false;
|
854
|
+
if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
|
855
|
+
if (ctx.colors) ctx.stylize = stylizeWithColor;
|
856
|
+
return formatValue(ctx, obj, ctx.depth);
|
857
|
+
}
|
858
|
+
exports.inspect = inspect;
|
859
|
+
|
860
|
+
|
861
|
+
// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
|
862
|
+
inspect.colors = {
|
863
|
+
'bold' : [1, 22],
|
864
|
+
'italic' : [3, 23],
|
865
|
+
'underline' : [4, 24],
|
866
|
+
'inverse' : [7, 27],
|
867
|
+
'white' : [37, 39],
|
868
|
+
'grey' : [90, 39],
|
869
|
+
'black' : [30, 39],
|
870
|
+
'blue' : [34, 39],
|
871
|
+
'cyan' : [36, 39],
|
872
|
+
'green' : [32, 39],
|
873
|
+
'magenta' : [35, 39],
|
874
|
+
'red' : [31, 39],
|
875
|
+
'yellow' : [33, 39]
|
876
|
+
};
|
877
|
+
|
878
|
+
// Don't use 'blue' not visible on cmd.exe
|
879
|
+
inspect.styles = {
|
880
|
+
'special': 'cyan',
|
881
|
+
'number': 'yellow',
|
882
|
+
'boolean': 'yellow',
|
883
|
+
'undefined': 'grey',
|
884
|
+
'null': 'bold',
|
885
|
+
'string': 'green',
|
886
|
+
'date': 'magenta',
|
887
|
+
// "name": intentionally not styling
|
888
|
+
'regexp': 'red'
|
889
|
+
};
|
890
|
+
|
891
|
+
|
892
|
+
function stylizeWithColor(str, styleType) {
|
893
|
+
var style = inspect.styles[styleType];
|
894
|
+
|
895
|
+
if (style) {
|
896
|
+
return '\u001b[' + inspect.colors[style][0] + 'm' + str +
|
897
|
+
'\u001b[' + inspect.colors[style][1] + 'm';
|
898
|
+
} else {
|
899
|
+
return str;
|
900
|
+
}
|
901
|
+
}
|
902
|
+
|
903
|
+
|
904
|
+
function stylizeNoColor(str, styleType) {
|
905
|
+
return str;
|
906
|
+
}
|
907
|
+
|
908
|
+
|
909
|
+
function arrayToHash(array) {
|
910
|
+
var hash = {};
|
911
|
+
|
912
|
+
array.forEach(function(val, idx) {
|
913
|
+
hash[val] = true;
|
914
|
+
});
|
915
|
+
|
916
|
+
return hash;
|
917
|
+
}
|
918
|
+
|
919
|
+
|
920
|
+
function formatValue(ctx, value, recurseTimes) {
|
921
|
+
// Provide a hook for user-specified inspect functions.
|
922
|
+
// Check that value is an object with an inspect function on it
|
923
|
+
if (ctx.customInspect &&
|
924
|
+
value &&
|
925
|
+
isFunction(value.inspect) &&
|
926
|
+
// Filter out the util module, it's inspect function is special
|
927
|
+
value.inspect !== exports.inspect &&
|
928
|
+
// Also filter out any prototype objects using the circular check.
|
929
|
+
!(value.constructor && value.constructor.prototype === value)) {
|
930
|
+
var ret = value.inspect(recurseTimes, ctx);
|
931
|
+
if (!isString(ret)) {
|
932
|
+
ret = formatValue(ctx, ret, recurseTimes);
|
933
|
+
}
|
934
|
+
return ret;
|
935
|
+
}
|
936
|
+
|
937
|
+
// Primitive types cannot have properties
|
938
|
+
var primitive = formatPrimitive(ctx, value);
|
939
|
+
if (primitive) {
|
940
|
+
return primitive;
|
941
|
+
}
|
942
|
+
|
943
|
+
// Look up the keys of the object.
|
944
|
+
var keys = Object.keys(value);
|
945
|
+
var visibleKeys = arrayToHash(keys);
|
946
|
+
|
947
|
+
if (ctx.showHidden) {
|
948
|
+
keys = Object.getOwnPropertyNames(value);
|
949
|
+
}
|
950
|
+
|
951
|
+
// IE doesn't make error fields non-enumerable
|
952
|
+
// http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
|
953
|
+
if (isError(value)
|
954
|
+
&& (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
|
955
|
+
return formatError(value);
|
956
|
+
}
|
957
|
+
|
958
|
+
// Some type of object without properties can be shortcutted.
|
959
|
+
if (keys.length === 0) {
|
960
|
+
if (isFunction(value)) {
|
961
|
+
var name = value.name ? ': ' + value.name : '';
|
962
|
+
return ctx.stylize('[Function' + name + ']', 'special');
|
963
|
+
}
|
964
|
+
if (isRegExp(value)) {
|
965
|
+
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
966
|
+
}
|
967
|
+
if (isDate(value)) {
|
968
|
+
return ctx.stylize(Date.prototype.toString.call(value), 'date');
|
969
|
+
}
|
970
|
+
if (isError(value)) {
|
971
|
+
return formatError(value);
|
972
|
+
}
|
973
|
+
}
|
974
|
+
|
975
|
+
var base = '', array = false, braces = ['{', '}'];
|
976
|
+
|
977
|
+
// Make Array say that they are Array
|
978
|
+
if (isArray(value)) {
|
979
|
+
array = true;
|
980
|
+
braces = ['[', ']'];
|
981
|
+
}
|
982
|
+
|
983
|
+
// Make functions say that they are functions
|
984
|
+
if (isFunction(value)) {
|
985
|
+
var n = value.name ? ': ' + value.name : '';
|
986
|
+
base = ' [Function' + n + ']';
|
987
|
+
}
|
988
|
+
|
989
|
+
// Make RegExps say that they are RegExps
|
990
|
+
if (isRegExp(value)) {
|
991
|
+
base = ' ' + RegExp.prototype.toString.call(value);
|
992
|
+
}
|
993
|
+
|
994
|
+
// Make dates with properties first say the date
|
995
|
+
if (isDate(value)) {
|
996
|
+
base = ' ' + Date.prototype.toUTCString.call(value);
|
997
|
+
}
|
998
|
+
|
999
|
+
// Make error with message first say the error
|
1000
|
+
if (isError(value)) {
|
1001
|
+
base = ' ' + formatError(value);
|
1002
|
+
}
|
1003
|
+
|
1004
|
+
if (keys.length === 0 && (!array || value.length == 0)) {
|
1005
|
+
return braces[0] + base + braces[1];
|
1006
|
+
}
|
1007
|
+
|
1008
|
+
if (recurseTimes < 0) {
|
1009
|
+
if (isRegExp(value)) {
|
1010
|
+
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
1011
|
+
} else {
|
1012
|
+
return ctx.stylize('[Object]', 'special');
|
1013
|
+
}
|
1014
|
+
}
|
1015
|
+
|
1016
|
+
ctx.seen.push(value);
|
1017
|
+
|
1018
|
+
var output;
|
1019
|
+
if (array) {
|
1020
|
+
output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
|
1021
|
+
} else {
|
1022
|
+
output = keys.map(function(key) {
|
1023
|
+
return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
|
1024
|
+
});
|
1025
|
+
}
|
1026
|
+
|
1027
|
+
ctx.seen.pop();
|
1028
|
+
|
1029
|
+
return reduceToSingleString(output, base, braces);
|
1030
|
+
}
|
1031
|
+
|
1032
|
+
|
1033
|
+
function formatPrimitive(ctx, value) {
|
1034
|
+
if (isUndefined(value))
|
1035
|
+
return ctx.stylize('undefined', 'undefined');
|
1036
|
+
if (isString(value)) {
|
1037
|
+
var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
|
1038
|
+
.replace(/'/g, "\\'")
|
1039
|
+
.replace(/\\"/g, '"') + '\'';
|
1040
|
+
return ctx.stylize(simple, 'string');
|
1041
|
+
}
|
1042
|
+
if (isNumber(value))
|
1043
|
+
return ctx.stylize('' + value, 'number');
|
1044
|
+
if (isBoolean(value))
|
1045
|
+
return ctx.stylize('' + value, 'boolean');
|
1046
|
+
// For some reason typeof null is "object", so special case here.
|
1047
|
+
if (isNull(value))
|
1048
|
+
return ctx.stylize('null', 'null');
|
1049
|
+
}
|
1050
|
+
|
1051
|
+
|
1052
|
+
function formatError(value) {
|
1053
|
+
return '[' + Error.prototype.toString.call(value) + ']';
|
1054
|
+
}
|
1055
|
+
|
1056
|
+
|
1057
|
+
function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
|
1058
|
+
var output = [];
|
1059
|
+
for (var i = 0, l = value.length; i < l; ++i) {
|
1060
|
+
if (hasOwnProperty(value, String(i))) {
|
1061
|
+
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
|
1062
|
+
String(i), true));
|
1063
|
+
} else {
|
1064
|
+
output.push('');
|
1065
|
+
}
|
1066
|
+
}
|
1067
|
+
keys.forEach(function(key) {
|
1068
|
+
if (!key.match(/^\d+$/)) {
|
1069
|
+
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
|
1070
|
+
key, true));
|
1071
|
+
}
|
1072
|
+
});
|
1073
|
+
return output;
|
1074
|
+
}
|
1075
|
+
|
1076
|
+
|
1077
|
+
function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
|
1078
|
+
var name, str, desc;
|
1079
|
+
desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
|
1080
|
+
if (desc.get) {
|
1081
|
+
if (desc.set) {
|
1082
|
+
str = ctx.stylize('[Getter/Setter]', 'special');
|
1083
|
+
} else {
|
1084
|
+
str = ctx.stylize('[Getter]', 'special');
|
1085
|
+
}
|
1086
|
+
} else {
|
1087
|
+
if (desc.set) {
|
1088
|
+
str = ctx.stylize('[Setter]', 'special');
|
1089
|
+
}
|
1090
|
+
}
|
1091
|
+
if (!hasOwnProperty(visibleKeys, key)) {
|
1092
|
+
name = '[' + key + ']';
|
1093
|
+
}
|
1094
|
+
if (!str) {
|
1095
|
+
if (ctx.seen.indexOf(desc.value) < 0) {
|
1096
|
+
if (isNull(recurseTimes)) {
|
1097
|
+
str = formatValue(ctx, desc.value, null);
|
1098
|
+
} else {
|
1099
|
+
str = formatValue(ctx, desc.value, recurseTimes - 1);
|
1100
|
+
}
|
1101
|
+
if (str.indexOf('\n') > -1) {
|
1102
|
+
if (array) {
|
1103
|
+
str = str.split('\n').map(function(line) {
|
1104
|
+
return ' ' + line;
|
1105
|
+
}).join('\n').substr(2);
|
1106
|
+
} else {
|
1107
|
+
str = '\n' + str.split('\n').map(function(line) {
|
1108
|
+
return ' ' + line;
|
1109
|
+
}).join('\n');
|
1110
|
+
}
|
1111
|
+
}
|
1112
|
+
} else {
|
1113
|
+
str = ctx.stylize('[Circular]', 'special');
|
1114
|
+
}
|
1115
|
+
}
|
1116
|
+
if (isUndefined(name)) {
|
1117
|
+
if (array && key.match(/^\d+$/)) {
|
1118
|
+
return str;
|
1119
|
+
}
|
1120
|
+
name = JSON.stringify('' + key);
|
1121
|
+
if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
|
1122
|
+
name = name.substr(1, name.length - 2);
|
1123
|
+
name = ctx.stylize(name, 'name');
|
1124
|
+
} else {
|
1125
|
+
name = name.replace(/'/g, "\\'")
|
1126
|
+
.replace(/\\"/g, '"')
|
1127
|
+
.replace(/(^"|"$)/g, "'");
|
1128
|
+
name = ctx.stylize(name, 'string');
|
1129
|
+
}
|
1130
|
+
}
|
1131
|
+
|
1132
|
+
return name + ': ' + str;
|
1133
|
+
}
|
1134
|
+
|
1135
|
+
|
1136
|
+
function reduceToSingleString(output, base, braces) {
|
1137
|
+
var numLinesEst = 0;
|
1138
|
+
var length = output.reduce(function(prev, cur) {
|
1139
|
+
numLinesEst++;
|
1140
|
+
if (cur.indexOf('\n') >= 0) numLinesEst++;
|
1141
|
+
return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
|
1142
|
+
}, 0);
|
1143
|
+
|
1144
|
+
if (length > 60) {
|
1145
|
+
return braces[0] +
|
1146
|
+
(base === '' ? '' : base + '\n ') +
|
1147
|
+
' ' +
|
1148
|
+
output.join(',\n ') +
|
1149
|
+
' ' +
|
1150
|
+
braces[1];
|
1151
|
+
}
|
1152
|
+
|
1153
|
+
return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
|
1154
|
+
}
|
1155
|
+
|
1156
|
+
|
1157
|
+
// NOTE: These type checking functions intentionally don't use `instanceof`
|
1158
|
+
// because it is fragile and can be easily faked with `Object.create()`.
|
1159
|
+
function isArray(ar) {
|
1160
|
+
return Array.isArray(ar);
|
1161
|
+
}
|
1162
|
+
exports.isArray = isArray;
|
1163
|
+
|
1164
|
+
function isBoolean(arg) {
|
1165
|
+
return typeof arg === 'boolean';
|
1166
|
+
}
|
1167
|
+
exports.isBoolean = isBoolean;
|
1168
|
+
|
1169
|
+
function isNull(arg) {
|
1170
|
+
return arg === null;
|
1171
|
+
}
|
1172
|
+
exports.isNull = isNull;
|
1173
|
+
|
1174
|
+
function isNullOrUndefined(arg) {
|
1175
|
+
return arg == null;
|
1176
|
+
}
|
1177
|
+
exports.isNullOrUndefined = isNullOrUndefined;
|
1178
|
+
|
1179
|
+
function isNumber(arg) {
|
1180
|
+
return typeof arg === 'number';
|
1181
|
+
}
|
1182
|
+
exports.isNumber = isNumber;
|
1183
|
+
|
1184
|
+
function isString(arg) {
|
1185
|
+
return typeof arg === 'string';
|
1186
|
+
}
|
1187
|
+
exports.isString = isString;
|
1188
|
+
|
1189
|
+
function isSymbol(arg) {
|
1190
|
+
return typeof arg === 'symbol';
|
1191
|
+
}
|
1192
|
+
exports.isSymbol = isSymbol;
|
1193
|
+
|
1194
|
+
function isUndefined(arg) {
|
1195
|
+
return arg === void 0;
|
1196
|
+
}
|
1197
|
+
exports.isUndefined = isUndefined;
|
1198
|
+
|
1199
|
+
function isRegExp(re) {
|
1200
|
+
return isObject(re) && objectToString(re) === '[object RegExp]';
|
1201
|
+
}
|
1202
|
+
exports.isRegExp = isRegExp;
|
1203
|
+
|
1204
|
+
function isObject(arg) {
|
1205
|
+
return typeof arg === 'object' && arg !== null;
|
1206
|
+
}
|
1207
|
+
exports.isObject = isObject;
|
1208
|
+
|
1209
|
+
function isDate(d) {
|
1210
|
+
return isObject(d) && objectToString(d) === '[object Date]';
|
1211
|
+
}
|
1212
|
+
exports.isDate = isDate;
|
1213
|
+
|
1214
|
+
function isError(e) {
|
1215
|
+
return isObject(e) &&
|
1216
|
+
(objectToString(e) === '[object Error]' || e instanceof Error);
|
1217
|
+
}
|
1218
|
+
exports.isError = isError;
|
1219
|
+
|
1220
|
+
function isFunction(arg) {
|
1221
|
+
return typeof arg === 'function';
|
1222
|
+
}
|
1223
|
+
exports.isFunction = isFunction;
|
1224
|
+
|
1225
|
+
function isPrimitive(arg) {
|
1226
|
+
return arg === null ||
|
1227
|
+
typeof arg === 'boolean' ||
|
1228
|
+
typeof arg === 'number' ||
|
1229
|
+
typeof arg === 'string' ||
|
1230
|
+
typeof arg === 'symbol' || // ES6 symbol
|
1231
|
+
typeof arg === 'undefined';
|
1232
|
+
}
|
1233
|
+
exports.isPrimitive = isPrimitive;
|
1234
|
+
|
1235
|
+
exports.isBuffer = require('./support/isBuffer');
|
1236
|
+
|
1237
|
+
function objectToString(o) {
|
1238
|
+
return Object.prototype.toString.call(o);
|
1239
|
+
}
|
1240
|
+
|
1241
|
+
|
1242
|
+
function pad(n) {
|
1243
|
+
return n < 10 ? '0' + n.toString(10) : n.toString(10);
|
1244
|
+
}
|
1245
|
+
|
1246
|
+
|
1247
|
+
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
|
1248
|
+
'Oct', 'Nov', 'Dec'];
|
1249
|
+
|
1250
|
+
// 26 Feb 16:19:34
|
1251
|
+
function timestamp() {
|
1252
|
+
var d = new Date();
|
1253
|
+
var time = [pad(d.getHours()),
|
1254
|
+
pad(d.getMinutes()),
|
1255
|
+
pad(d.getSeconds())].join(':');
|
1256
|
+
return [d.getDate(), months[d.getMonth()], time].join(' ');
|
1257
|
+
}
|
1258
|
+
|
1259
|
+
|
1260
|
+
// log is just a thin wrapper to console.log that prepends a timestamp
|
1261
|
+
exports.log = function() {
|
1262
|
+
console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
|
1263
|
+
};
|
1264
|
+
|
1265
|
+
|
1266
|
+
/**
|
1267
|
+
* Inherit the prototype methods from one constructor into another.
|
1268
|
+
*
|
1269
|
+
* The Function.prototype.inherits from lang.js rewritten as a standalone
|
1270
|
+
* function (not on Function.prototype). NOTE: If this file is to be loaded
|
1271
|
+
* during bootstrapping this function needs to be rewritten using some native
|
1272
|
+
* functions as prototype setup using normal JavaScript does not work as
|
1273
|
+
* expected during bootstrapping (see mirror.js in r114903).
|
1274
|
+
*
|
1275
|
+
* @param {function} ctor Constructor function which needs to inherit the
|
1276
|
+
* prototype.
|
1277
|
+
* @param {function} superCtor Constructor function to inherit prototype from.
|
1278
|
+
*/
|
1279
|
+
exports.inherits = require('inherits');
|
1280
|
+
|
1281
|
+
exports._extend = function(origin, add) {
|
1282
|
+
// Don't do anything if add isn't an object
|
1283
|
+
if (!add || !isObject(add)) return origin;
|
1284
|
+
|
1285
|
+
var keys = Object.keys(add);
|
1286
|
+
var i = keys.length;
|
1287
|
+
while (i--) {
|
1288
|
+
origin[keys[i]] = add[keys[i]];
|
1289
|
+
}
|
1290
|
+
return origin;
|
1291
|
+
};
|
1292
|
+
|
1293
|
+
function hasOwnProperty(obj, prop) {
|
1294
|
+
return Object.prototype.hasOwnProperty.call(obj, prop);
|
1295
|
+
}
|
1296
|
+
|
1297
|
+
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1298
|
+
|
1299
|
+
},{"./support/isBuffer":25,"_process":23,"inherits":24}],27:[function(require,module,exports){
|
1300
|
+
(function (global){
|
1301
|
+
"use strict";function _canonicalize(e){var t=global.document.createElement("div");return t.innerHTML="<a></a>",t.firstChild.href=e,t.innerHTML=t.innerHTML,t.firstChild.href}var templateLoader=require("./template-loader.js"),console=require("./../../bower_components/console-browserify/index.js"),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),$=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null);require("./ko-bindings.js");var performanceAwareCaller=require("./timed-call.js").timedCall,addUndoStackExtensionMaker=require("./undomanager/undomain.js"),colorPlugin=require("./ext/color.js"),inlinerPlugin=require("./ext/inliner.js"),localStorageLoader=require("./ext/localstorage.js");if("undefined"==typeof ko)throw"Cannot find knockout.js library!";if("undefined"==typeof $)throw"Cannot find jquery library!";var applyBindingOptions=function(e,t){t.bindingHandlers.wysiwygSrc.convertedUrl=function(t,o,a,i){var l=e.imgProcessorBackend?e.imgProcessorBackend:"./upload",d=l.match(/^(https?:\/\/[^\/]*\/).*$/),r=t.match(/^(https?:\/\/[^\/]*\/).*$/);if(null===d||null!==r&&d[1]==r[1]){var s=-1==l.indexOf("?")?"?":"&";return l+s+"src="+encodeURIComponent(t)+"&method="+encodeURIComponent(o)+"¶ms="+encodeURIComponent(a+","+i)}return console.log("Cannot apply backend image resizing to non-local resources ",t,o,a,i,d,r),t+"?method="+o+"&width="+a+(null!==i?"&height="+i:"")},t.bindingHandlers.wysiwygSrc.placeholderUrl=function(t,o){return e.imgProcessorBackend+"?method="+"placeholder"+"¶ms="+t+encodeURIComponent(",")+o},e&&e.tinymceConfig&&(t.bindingHandlers.wysiwyg.standardOptions=e.tinymceConfig),e&&e.tinymceConfigFull&&(t.bindingHandlers.wysiwyg.fullOptions=e.tinymceConfigFull)},start=function(e,t,o,a,i){templateLoader.fixPageEvents();var l=function(t){var o={messages:{unknownError:t.t("Unknown error"),uploadedBytes:t.t("Uploaded bytes exceed file size"),maxNumberOfFiles:t.t("Maximum number of files exceeded"),acceptFileTypes:t.t("File type not allowed"),maxFileSize:t.t("File is too large"),minFileSize:t.t("File is too small"),post_max_size:t.t("The uploaded file exceeds the post_max_size directive in php.ini"),max_file_size:t.t("File is too big"),min_file_size:t.t("File is too small"),accept_file_types:t.t("Filetype not allowed"),max_number_of_files:t.t("Maximum number of files exceeded"),max_width:t.t("Image exceeds maximum width"),min_width:t.t("Image requires a minimum width"),max_height:t.t("Image exceeds maximum height"),min_height:t.t("Image requires a minimum height"),abort:t.t("File upload aborted"),image_resize:t.t("Failed to resize image"),generic:t.t("Unexpected upload error")}};e&&e.fileuploadConfig&&(o=$.extend(!0,o,e.fileuploadConfig)),ko.bindingHandlers.fileupload.extendOptions=o},d=function(t){e&&e.strings&&(t.t=function(o,a){var i=e.strings[o];return"undefined"==typeof i&&(console.warn("Missing translation string for",o,": using default string"),i=o),t.tt(i,a)})},r=[d,addUndoStackExtensionMaker(performanceAwareCaller),colorPlugin,inlinerPlugin];if("undefined"!=typeof i)for(var s=0;s<i.length;s++)r.push(i[s]);r.push(l);var n=e.fileuploadConfig?e.fileuploadConfig.url:"/upload/";applyBindingOptions(e,ko),$("<!-- ko template: 'main' --><!-- /ko -->").appendTo(global.document.body),"undefined"==typeof t&&"undefined"!=typeof o&&(t=o.template),templateLoader.load(performanceAwareCaller,t,o,a,r,n)},initFromLocalStorage=function(e,t,o){try{var a=localStorageLoader(t,e.emailProcessorBackend),i="undefined"!=typeof o?o:[];i.push(a.extension);var l=_canonicalize(a.metadata.template);start(e,l,a.metadata,a.model,i)}catch(d){console.error("TODO not found ",t,d)}},init=function(e,t){var o=global.location.hash?global.location.href.split("#")[1]:void 0;if(e&&(e.template||e.data))if(e.data){var a=JSON.parse(e.data);start(e,void 0,a.metadata,a.content,t)}else start(e,e.template,void 0,void 0,t);else if(o&&7==o.length)initFromLocalStorage(e,o,t);else{if(!o)return!1;start(e,_canonicalize(o),void 0,void 0,t)}return!0};module.exports={isCompatible:templateLoader.isCompatible,init:init,start:start};
|
1302
|
+
|
1303
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1304
|
+
|
1305
|
+
},{"./../../bower_components/console-browserify/index.js":1,"./ext/color.js":59,"./ext/inliner.js":60,"./ext/localstorage.js":61,"./ko-bindings.js":62,"./template-loader.js":63,"./timed-call.js":64,"./undomanager/undomain.js":65}],28:[function(require,module,exports){
|
1306
|
+
(function (global){
|
1307
|
+
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require("./../../../bower_components/console-browserify/index.js"),addScriptTemplate=function(e,t,o){var a=e.createElement("script");return a.setAttribute("type","text/html"),a.setAttribute("id",t),a.text=o,e.body.appendChild(a),a};ko.bindingHandlers.bindIframe={tpl:'<!DOCTYPE html>\r\n<html>\r\n<head>\r\n</head>\r\n<body><div data-bind="block: content"></div></body>\r\n</html>\r\n',init:function(e,t){function o(o){try{var a=e.contentDocument;a.open(),a.write(ko.bindingHandlers.bindIframe.tpl),a.close();try{var i=a.body;if(i){for(var n=e.contentWindow.parent.document.getElementsByTagName("script"),l=0;l<n.length;l++)"text/html"==n[l].getAttribute("type")&&n[l].getAttribute("id")&&addScriptTemplate(a,n[l].getAttribute("id"),n[l].innerHTML);var r=a.getElementsByTagName("HTML");ko.utils.domNodeDisposal.addDisposeCallback(e,function(){ko.cleanNode(r[0]||i)}),ko.applyBindings(t(),r[0]||i)}else console.log("no iframedoc",o)}catch(d){throw console.log("error reading iframe.body",d,o),d}}catch(d){throw console.log("error reading iframe contentDocument",d,o),d}}o("first call")}};
|
1308
|
+
|
1309
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1310
|
+
|
1311
|
+
},{"./../../../bower_components/console-browserify/index.js":1}],29:[function(require,module,exports){
|
1312
|
+
(function (global){
|
1313
|
+
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require("./../../../bower_components/console-browserify/index.js");ko.bindingHandlers.withProperties={init:function(e,t,o,a,i){var n=i.createChildContext(i.$rawData,null,function(e){ko.utils.extend(e,t())});return ko.applyBindingsToDescendants(n,e),{controlsDescendantBindings:!0}}},ko.virtualElements.allowedBindings.withProperties=!0,ko.bindingHandlers.log={init:function(e,t){console.log("log",t())}},ko.bindingHandlers.block={templateExists:function(e){var t=global.document.getElementById(e);return t?!0:!1},_chooseTemplate:function(e,t,o,a){var i=t+"-"+o;if(ko.bindingHandlers.block.templateExists(i))return i;if("undefined"!=typeof a&&null!==a)return ko.bindingHandlers.block._chooseTemplate(e,t,a);var n=e?"array":"object-"+o;if(ko.bindingHandlers.block.templateExists(n))return n;throw"cannot find template for "+i+"/"+n},_displayMode:function(e,t){var o="undefined"!=typeof e.type?ko.utils.unwrapObservable(e.type):"notablock-"+typeof e,a="undefined"!=typeof e.splice,i=t.templateMode?t.templateMode:"show";return ko.bindingHandlers.block._chooseTemplate(a,o,i,t.templateModeFallback)},_makeTemplateValueAccessor:function(e,t){return function(){var o,a,i=e(),n=ko.utils.peekObservable(i);if(!n||"object"!=typeof n.data&&"function"!=typeof n.data)o=i;else if(o=n.data,"undefined"!=typeof n.template){var l=ko.utils.unwrapObservable(n.template),r=t.templateMode?t.templateMode:"show";a=ko.bindingHandlers.block._chooseTemplate(!1,l,r,t.templateModeFallback)}var d=ko.utils.unwrapObservable(o);if(ko.isObservable(d)&&console.log("doubleObservable",d),"undefined"==typeof a)if(void 0===o)a="empty";else try{a=ko.bindingHandlers.block._displayMode(d,t)}catch(s){throw console.log(s,d,t.$data,t.templateMode),s}return{name:a,data:o,templateEngine:ko.nativeTemplateEngine.instance}}},init:function(e,t,o,a,i){"undefined"==typeof t()&&console.log("found a null block: check ending commas in arrays defs in IE");var n=ko.bindingHandlers.block._makeTemplateValueAccessor(t,i);return ko.bindingHandlers.template.init(e,n)},update:function(e,t,o,a,i){var n=ko.bindingHandlers.block._makeTemplateValueAccessor(t,i);return ko.bindingHandlers.template.update(e,n,o,a,i)}},ko.expressionRewriting.bindingRewriteValidators.block=!1,ko.virtualElements.allowedBindings.block=!0;
|
1314
|
+
|
1315
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1316
|
+
|
1317
|
+
},{"./../../../bower_components/console-browserify/index.js":1}],30:[function(require,module,exports){
|
1318
|
+
"use strict";module.exports=require("./string-template.js");
|
1319
|
+
|
1320
|
+
},{"./string-template.js":44}],31:[function(require,module,exports){
|
1321
|
+
(function (global){
|
1322
|
+
"use strict";require("./../../../bower_components/evol-colorpicker/js/evol.colorpicker.min.js");var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),kojqui=(typeof window !== "undefined" ? window['kojqui'] : typeof global !== "undefined" ? global['kojqui'] : null),ColorPicker=function(){kojqui.BindingHandler.call(this,"colorpicker")};ColorPicker.prototype=kojqui.utils.createObject(kojqui.BindingHandler.prototype),ColorPicker.prototype.constructor=ColorPicker,ColorPicker.prototype.init=function(e,t,o){var a=t(),i=a.color,n=ko.computed({read:i,write:i,disposeWhenNodeIsRemoved:e}),l=function(){return n};ko.bindingHandlers.value.init(e,l,o);var r=function(e,t){"undefined"!=typeof t&&n(t)};$(e).on("change.color",r),ko.computed({read:function(){var t={color:ko.utils.unwrapObservable(n),showOn:"button"};for(var o in a)"color"!==o&&a.hasOwnProperty(o)&&(t[o]=ko.utils.unwrapObservable(a[o]));$(e).colorpicker(t)},disposeWhenNodeIsRemoved:e}),ko.utils.domNodeDisposal.addDisposeCallback(e,function(){$(e).off("change.color",r),$(e).colorpicker("destroy")})},kojqui.utils.register(ColorPicker);
|
1323
|
+
|
1324
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1325
|
+
|
1326
|
+
},{"./../../../bower_components/evol-colorpicker/js/evol.colorpicker.min.js":2}],32:[function(require,module,exports){
|
1327
|
+
(function (global){
|
1328
|
+
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null);ko.bindingHandlers.cssText={update:function(e,t){var o=ko.utils.unwrapObservable(t());try{e.innerText=o}catch(a){e.styleSheet||(e.innerHTML="a{}"),e.styleSheet.cssText=o}}};
|
1329
|
+
|
1330
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1331
|
+
|
1332
|
+
},{}],33:[function(require,module,exports){
|
1333
|
+
(function (global){
|
1334
|
+
"use strict";var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null);!function(e){e(ko,$)}(function(e,t){var o="ko_sortItem",a="ko_dragItem",i=(e.utils.unwrapObservable,e.utils.domData.get);e.utils.domData.set,e.bindingHandlers.droppable={init:function(n,l){var r,d=t(n),s=e.utils.unwrapObservable(l())||{},c={};t.extend(!0,c,e.bindingHandlers.droppable),s.data?(s.options&&c.options&&(e.utils.extend(c.options,s.options),delete s.options),e.utils.extend(c,s)):c.data=s,r=c.options.drop,d.droppable(e.utils.extend(c.options,{drop:function(e,t){var n=t.draggable[0],l=i(n,o)||i(n,a);l&&(l.clone&&(l=l.clone()),c.dragged&&(l=c.dragged.call(this,l,e,t)||l),c.data&&c.data(l)),r&&r.apply(this,arguments)}})),void 0!==c.isEnabled&&e.computed({read:function(){d.droppable(e.utils.unwrapObservable(c.isEnabled)?"enable":"disable")},disposeWhenNodeIsRemoved:n})},update:function(){},targetIndex:null,afterMove:null,beforeMove:null,options:{}}});
|
1335
|
+
|
1336
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1337
|
+
|
1338
|
+
},{}],34:[function(require,module,exports){
|
1339
|
+
(function (global){
|
1340
|
+
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),$=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),console=require("./../../../bower_components/console-browserify/index.js");ko.bindingHandlers.focusable={focus:function(){},blur:function(){},init:function(e){ko.utils.domNodeDisposal.addDisposeCallback(e,function(){$(e).off("focusin",ko.bindingHandlers.focusable.focus),$(e).off("focusout",ko.bindingHandlers.focusable.blur)}),$(e).on("focusin",ko.bindingHandlers.focusable.focus),$(e).on("focusout",ko.bindingHandlers.focusable.blur)}},ko.bindingHandlers.scrollable={scroll:function(){},init:function(e){ko.utils.domNodeDisposal.addDisposeCallback(e,function(){$(e).off("scroll",ko.bindingHandlers.scrollable.scroll)}),$(e).on("scroll",ko.bindingHandlers.scrollable.scroll)}};
|
1341
|
+
|
1342
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1343
|
+
|
1344
|
+
},{"./../../../bower_components/console-browserify/index.js":1}],35:[function(require,module,exports){
|
1345
|
+
(function (global){
|
1346
|
+
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null);ko.extenders.paging=function(e,t){var o=ko.observable(t||10),i=ko.observable(1);return e.pageSize=ko.computed({read:o,write:function(e){e>0?o(e):o(10)}}),e.currentPage=ko.computed({read:i,write:function(t){t>e.pageCount()?i(e.pageCount()):0>=t?i(1):i(t)}}),e.pageCount=ko.computed(function(){return Math.ceil(e().length/e.pageSize())||1}),e.currentPageData=ko.computed(function(){var t=o(),n=i(),a=t*(n-1),r=t*n;return e().slice(a,r)}),e.moveFirst=function(){e.currentPage(1)},e.movePrevious=function(){e.currentPage(e.currentPage()-1)},e.moveNext=function(){e.currentPage(e.currentPage()+1)},e.moveLast=function(){e.currentPage(e.pageCount())},e};
|
1347
|
+
|
1348
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1349
|
+
|
1350
|
+
},{}],36:[function(require,module,exports){
|
1351
|
+
(function (global){
|
1352
|
+
"use strict";var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),sortable=(typeof window !== "undefined" ? window['jQuery']['ui']['sortable'] : typeof global !== "undefined" ? global['jQuery']['ui']['sortable'] : null),draggable=(typeof window !== "undefined" ? window['jQuery']['ui']['draggable'] : typeof global !== "undefined" ? global['jQuery']['ui']['draggable'] : null),console=require("./../../../bower_components/console-browserify/index.js");if(require("./../../../bower_components/knockout-sortable/build/knockout-sortable.min.js"),"undefined"==typeof sortable)throw"Cannot find jquery-ui sortable widget dependency!";if("undefined"==typeof draggable)throw"Cannot find jquery-ui sortable widget dependency!";var isDraggingHelper=function(e,t){e()?t.type==e()+"stop"&&e(!1):("dragstart"==t.type||"sortstart"==t.type)&&e(t.type.substring(0,4))},makeExtendedValueAccessor=function(e){return function(){var t=e();ko.utils.peekObservable(t),ko.utils.unwrapObservable(t),"undefined"==t.options&&(t.options={});var o=t.options.start;t.options.start=function(e,i){return"undefined"!=typeof t.dragging&&ko.isWritableObservable(t.dragging)&&isDraggingHelper(t.dragging,e),"undefined"!=typeof t.dropContainer&&(t.scrollInterval=global.setInterval(function(){var e=$(t.dropContainer).scrollTop();$(t.dropContainer).scrollTop(e+t.adding)},20)),"undefined"!=typeof o?o(e,i):void 0};var i=t.options.stop;t.options.stop=function(e,o){return"undefined"!=typeof t.dragging&&ko.isWritableObservable(t.dragging)&&isDraggingHelper(t.dragging,e),"undefined"!=typeof t.dropContainer&&global.clearInterval(t.scrollInterval),"undefined"!=typeof i?i(e,o):void 0};var n=t.options.drag;return t.options.drag=function(e,o){if("undefined"!=typeof t.dropContainer){var i=e.pageY-$(t.dropContainer).offset().top,a=i-$(t.dropContainer).height();t.adding=-20>i?-20:0>i?-10:10>i?-5:a>20?20:a>0?10:a>-10?5:0}return"undefined"!=typeof n?n(e,o):void 0},t}};ko.bindingHandlers.extsortable={init:function(e,t,o,i,n){return ko.bindingHandlers.sortable.init(e,makeExtendedValueAccessor(t),o,i,n)},update:function(e,t,o,i,n){return ko.bindingHandlers.sortable.update(e,makeExtendedValueAccessor(t),o,i,n)}},ko.bindingHandlers.extdraggable={init:function(e,t,o,i,n){return ko.bindingHandlers.draggable.init(e,makeExtendedValueAccessor(t),o,i,n)},update:function(e,t,o,i,n){return ko.bindingHandlers.draggable.update(e,makeExtendedValueAccessor(t),o,i,n)}};
|
1353
|
+
|
1354
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1355
|
+
|
1356
|
+
},{"./../../../bower_components/console-browserify/index.js":1,"./../../../bower_components/knockout-sortable/build/knockout-sortable.min.js":8}],37:[function(require,module,exports){
|
1357
|
+
(function (global){
|
1358
|
+
"use strict";var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require("./../../../bower_components/console-browserify/index.js");ko.bindingHandlers.preloader={init:function(e,t){var o=t();if("undefined"==typeof o.preloaded){o.preloaded=ko.observable("");var a=function(e){if(e!=o.preloaded())if(""!==e){var t=new Image;t.onload=function(){o.preloaded(e)},t.onerror=function(){o.preloaded(e)},t.src=e}else o.preloaded(e)};o.subscribe(a),a(o())}}},ko.bindingHandlers.advattr={init:function(e,t){var o=ko.utils.unwrapObservable(t()||{});ko.utils.objectForEach(o,function(t,o){var a=e.getAttribute(t);if(ko.isWriteableObservable(o)){var i=o();i!=a&&(o(a),null!==i&&console.log("AdvAttr found a value different from the default",t,i,a))}})},update:function(e,t){var o=ko.utils.unwrapObservable(t())||{};ko.utils.objectForEach(o,function(t,o){o=ko.utils.unwrapObservable(o);var a=o===!1||null===o||void 0===o;a?e.removeAttribute(t):e.setAttribute(t,o.toString())})}},ko.bindingHandlers.advstyle={init:function(e,t){var o=ko.utils.unwrapObservable(t()||{});ko.utils.objectForEach(o,function(t,o){var a;if(t.match(/Px$/)?(t=t.substr(0,t.length-2),a=e.style[t],a.match(/px$/)?a=a.replace(/px$/,""):console.log("AdvStyle binding found an unexpected default value",t,a,e)):a=e.style[t],ko.isWriteableObservable(o)){var i=o();i!=a&&(o(a),null!==i&&console.log("AdvStyle found a value different from the default",t,i,a))}})},update:function(e,t){var o=ko.utils.unwrapObservable(t()||{});ko.utils.objectForEach(o,function(t,o){o=ko.utils.unwrapObservable(o),(null===o||"undefined"==typeof o||o===!1)&&(o=""),t.match(/Px$/)&&(t=t.substr(0,t.length-2),o+="px"),e.style[t]=o})}},ko.bindingHandlers.domlog={init:function(e){console.log("initialized",e),ko.utils.domNodeDisposal.addDisposeCallback(e,function(){console.log("disposed",e)})}},ko.bindingHandlers.fudroppable={init:function(e,t){var o=t()||{},a={},i=function(e,t,o,a,i,n){e[t]?global.clearTimeout(e[t]):("undefined"!=typeof a&&o.classList.add(a),ko.isWriteableObservable(i)&&!i()&&i(!0));var l=function(){e[t]=null,"undefined"!=typeof a&&o.classList.remove(a),ko.isWriteableObservable(i)&&i()&&i(!1)};"dragleave"==n.type?l():e[t]=global.setTimeout(l,500)};(o.active||o.activeClass)&&ko.utils.registerEventHandler(global,"dragover",i.bind(void 0,a,"activeTimeout",e,o.activeClass,o.active)),o.hoverClass&&ko.utils.registerEventHandler(e,"dragover dragenter dragleave",i.bind(void 0,a,"hoverTimeout",e,o.hoverClass,void 0))}},ko.bindingHandlers.fileupload={extendOptions:{},remoteFilePreprocessor:function(e){return e},init:function(e){ko.utils.domNodeDisposal.addDisposeCallback(e,function(){$(e).fileupload("destroy")}),global.webkitURL?$(e).attr("title"," "):$(e).attr("title","")},update:function(e,t){var o=t()||{},a=$(e),i=a.parents(".uploadzone"),n=o.data;o.data=void 0;var l=o.canvasPreview;ko.utils.extend(o,{url:"/upload/",dataType:"json",dropZone:i.find(".mo-uploadzone")[0],autoUpload:!0,acceptFileTypes:/(\.|\/)(gif|jpe?g|png)$/i,maxFileSize:1048576,disableImageResize:/Android(?!.*Chrome)|Opera/.test(global.navigator.userAgent),previewMaxWidth:200,previewMaxHeight:200,previewCrop:!1,replaceFileInput:!1,messages:{unknownError:"Unknown error",uploadedBytes:"Uploaded bytes exceed file size",maxNumberOfFiles:"Maximum number of files exceeded",acceptFileTypes:"File type not allowed",maxFileSize:"File is too large",minFileSize:"File is too small",post_max_size:"The uploaded file exceeds the post_max_size directive in php.ini",max_file_size:"File is too big",min_file_size:"File is too small",accept_file_types:"Filetype not allowed",max_number_of_files:"Maximum number of files exceeded",max_width:"Image exceeds maximum width",min_width:"Image requires a minimum width",max_height:"Image exceeds maximum height",min_height:"Image requires a minimum height",abort:"File upload aborted",image_resize:"Failed to resize image",generic:"Unexpected upload error"}}),ko.utils.extend(o,ko.bindingHandlers.fileupload.extendOptions);var r=0,d="",s=function(){0===--r&&(n&&n(d),d="",l&&(i.find("img").show(),i.find("canvas").remove()),i.removeClass("uploading"),i.find(".progress-bar").css("width",0))},c=function(e){if("object"==typeof o.messages&&null!==o.messages){var t=e.match(/^([^ ]+)(.*)$/);if(t&&"undefined"!=typeof o.messages[t[1]])return o.messages[t[1]]+t[2]}return e};a.fileupload(o);for(var u=["fileuploadadd","fileuploadprocessalways","fileuploadprogressall","fileuploaddone","fileuploadfail"],p=function(e,t){if("fileuploadadd"==e.type&&r++,"fileuploadfail"==e.type&&(console.log("fileuploadfail",e,t),o.onerror&&(""===t.errorThrown&&"error"==t.textStatus?o.onerror(c("generic")):o.onerror(c("generic ("+t.errorThrown+")"))),s()),"fileuploaddone"==e.type)if("undefined"!=typeof t.result.files[0].url){if(o.onfile)for(var a=0;a<t.result.files.length;a++)t.result.files[a]=ko.bindingHandlers.fileupload.remoteFilePreprocessor(t.result.files[a]),o.onfile(t.result.files[a]);if(""===d&&(d=t.result.files[0].url),l){var n=new Image;n.onload=s,n.onerror=s,n.src=t.result.files[0].url}else s()}else"undefined"!=typeof t.result.files[0].error?(console.log("remote error",e,t),o.onerror&&o.onerror(c(t.result.files[0].error)),s()):(console.log("unexpected error",e,t),o.onerror&&o.onerror(c("generic (Unexpected Error retrieving uploaded file)")),s());if("fileuploadprocessalways"==e.type){var u=t.index,p=t.files[u];if(p.preview&&0===u&&0===i.find("canvas").length){if(l){var b=$(p.preview).css("width","100%");i.find("img").hide(),i.prepend(b)}i.addClass("uploading"),i.find(".progress-bar").css("width",0)}p.error&&(o.onerror&&o.onerror(c(p.error)),s())}if("fileuploadprogressall"==e.type){var f=parseInt(100*(t.loaded/t.total),10);i.find(".progress-bar").css("width",f+"%")}},b=u.length-1;b>=0;b--){var f=u[b];a.on(f,p)}$.support.fileInput||a.prop("disabled",!0).parent().addClass("disabled")}};
|
1359
|
+
|
1360
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1361
|
+
|
1362
|
+
},{"./../../../bower_components/console-browserify/index.js":1}],38:[function(require,module,exports){
|
1363
|
+
(function (global){
|
1364
|
+
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require("./../../../bower_components/console-browserify/index.js");ko.bindingHandlers.ifSubs={cloneNodes:function(e,t){for(var o=0,i=e.length,n=[];i>o;o++){var a=e[o].cloneNode(!0);n.push(t?ko.cleanNode(a):a)}return n},init:function(e,t,o,i,n){var a,r,l=t();return"undefined"==typeof l.data.subsCount&&ko.extenders.subscriptionsCount(l.data),ko.computed(function(){var o,i,d,s=ko.utils.unwrapObservable(t().data.subsCount),c=!r;d=-("undefined"!=typeof t().gutter?t().gutter:1),o=s+(a?d:0)>=ko.utils.unwrapObservable(l.threshold),"undefined"!=typeof t().not&&t().not&&(o=!o),i=c||o!==a,i&&(c&&ko.computedContext.getDependenciesCount()&&(r=ko.bindingHandlers.ifSubs.cloneNodes(ko.virtualElements.childNodes(e),!0)),o?(c||ko.virtualElements.setDomNodeChildren(e,ko.bindingHandlers.ifSubs.cloneNodes(r)),ko.applyBindingsToDescendants(n,e)):ko.virtualElements.emptyNode(e),a=o)},null,{disposeWhenNodeIsRemoved:e}),{controlsDescendantBindings:!0}}},ko.virtualElements.allowedBindings.ifSubs=!0;var beforeSubscriptionProp,afterSubscriptionProp;if("function"==typeof ko.subscription&&"undefined"!=typeof ko.isWritableObservable)beforeSubscriptionProp="beforeSubscriptionAdd",afterSubscriptionProp="afterSubscriptionRemove";else if("3.2.0"==ko.version)beforeSubscriptionProp="va",afterSubscriptionProp="nb";else if("3.3.0"==ko.version)beforeSubscriptionProp="ja",afterSubscriptionProp="ua";else if("3.4.0"==ko.version)beforeSubscriptionProp="sa",afterSubscriptionProp="Ia";else{if("3.4.1"!=ko.version)throw"Unsupported minimized Knockout version "+ko.version+" (supported DEBUG or minimized 3.2.0 ... 3.4.1)";beforeSubscriptionProp="sa",afterSubscriptionProp="Ia"}ko.extenders.subscriptionsCount=function(e,t,o){if("undefined"==typeof e.subsCount){e.subsCount=ko.observable(e.getSubscriptionsCount()).extend({notify:"always"});var i=e[beforeSubscriptionProp],n=e[afterSubscriptionProp];e[beforeSubscriptionProp]=function(n){i&&i.call(e,n);var a=e.getSubscriptionsCount()+1;("undefined"==typeof t||a==t||"undefined"==typeof o||a==o)&&e.subsCount(a)},e[afterSubscriptionProp]=function(i){n&&n.call(e,i);var a=e.getSubscriptionsCount();("undefined"==typeof t||a==t||"undefined"==typeof o||a==o)&&e.subsCount(a)}}else console.log("already applied subscriptionCount to observable");return null};
|
1365
|
+
|
1366
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1367
|
+
|
1368
|
+
},{"./../../../bower_components/console-browserify/index.js":1}],39:[function(require,module,exports){
|
1369
|
+
(function (global){
|
1370
|
+
"use strict";var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),spinner=(typeof window !== "undefined" ? window['jQuery']['ui']['spinner'] : typeof global !== "undefined" ? global['jQuery']['ui']['spinner'] : null),console=require("./../../../bower_components/console-browserify/index.js");if("undefined"==typeof spinner)throw"Cannot find jquery-ui spinner widget dependency!";$.widget("ui.spinner",spinner,{_adjustValue:function(e){this._super(e);var t=this.options;return e=parseFloat(e.toFixed(this._precision())),null!==t.max&&e>t.max?t.max:null!==t.min&&e<t.min?t.min:e}});
|
1371
|
+
|
1372
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1373
|
+
|
1374
|
+
},{"./../../../bower_components/console-browserify/index.js":1}],40:[function(require,module,exports){
|
1375
|
+
(function (global){
|
1376
|
+
"use strict";var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),console=require("./../../../bower_components/console-browserify/index.js"),tabs=(typeof window !== "undefined" ? window['jQuery']['ui']['tabs'] : typeof global !== "undefined" ? global['jQuery']['ui']['tabs'] : null);if("undefined"==typeof tabs)throw"Cannot find jquery-ui tabs widget dependency!";$.widget("ui.tabs",tabs,{_isLocal:function(e){return"true"==e.getAttribute("data-local")?!0:this._superApply(arguments)}});
|
1377
|
+
|
1378
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1379
|
+
|
1380
|
+
},{"./../../../bower_components/console-browserify/index.js":1}],41:[function(require,module,exports){
|
1381
|
+
(function (global){
|
1382
|
+
"use strict";function pushTemplate(e,t){var o=global.document.createElement("script");o.setAttribute("type","text/html"),o.setAttribute("id",e),o.text=t,global.document.body.appendChild(o)}function removeTemplate(e){var t=global.document.getElementById(e);t&&t.parentNode.removeChild(t)}function init(){}function getTemplateContent(e){var t=global.document.getElementById(e);return t?t.innerHTML:void 0}module.exports={init:init,addTemplate:pushTemplate,removeTemplate:removeTemplate,getTemplateContent:getTemplateContent};
|
1383
|
+
|
1384
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1385
|
+
|
1386
|
+
},{}],42:[function(require,module,exports){
|
1387
|
+
(function (global){
|
1388
|
+
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),$=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),console=require("./../../../bower_components/console-browserify/index.js"),tinymce=(typeof window !== "undefined" ? window['tinymce'] : typeof global !== "undefined" ? global['tinymce'] : null),timeout,render=function(){timeout=void 0,"undefined"!=typeof tinymce.activeEditor&&null!==tinymce.activeEditor&&"undefined"!=typeof tinymce.activeEditor.theme&&null!==tinymce.activeEditor.theme&&"undefined"!=typeof tinymce.activeEditor.theme.panel&&null!==tinymce.activeEditor.theme.panel&&"undefined"!=typeof tinymce.activeEditor.theme.panel.visible&&(("undefined"!=typeof tinymce.activeEditor.theme.panel._visible&&tinymce.activeEditor.theme.panel._visible&&tinymce.activeEditor.theme.panel._fixed||"undefined"!=typeof tinymce.activeEditor.theme.panel.state&&tinymce.activeEditor.theme.panel.state.get("visible")&&tinymce.activeEditor.theme.panel.state.get("fixed"))&&tinymce.activeEditor.theme.panel.fixed(!1),tinymce.activeEditor.nodeChanged(),tinymce.activeEditor.theme.panel.visible(!0),tinymce.activeEditor.theme.panel.layoutRect().y<=40&&tinymce.activeEditor.theme.panel.moveBy(0,40-tinymce.activeEditor.theme.panel.layoutRect().y))};ko.bindingHandlers.wysiwygScrollfix={scroll:function(){timeout&&global.clearTimeout(timeout),timeout=global.setTimeout(render,50)},init:function(e){ko.utils.domNodeDisposal.addDisposeCallback(e,function(){$(e).off("scroll",ko.bindingHandlers.wysiwygScrollfix.scroll)}),$(e).on("scroll",ko.bindingHandlers.wysiwygScrollfix.scroll)}};
|
1389
|
+
|
1390
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1391
|
+
|
1392
|
+
},{"./../../../bower_components/console-browserify/index.js":1}],43:[function(require,module,exports){
|
1393
|
+
(function (global){
|
1394
|
+
"use strict";var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require("./../../../bower_components/console-browserify/index.js"),_scrollIntoView=function(e,t,o,i){var n=o.scrollTop(),a=n-i-(t?20:-20),r="undefined"!=typeof o[0].nodeType;if(r){var l={scrollTop:""+Math.round(a)+"px"},s=Math.round(Math.abs(a-n));o.stop().animate(l,s)}else o.scrollTop(a)};ko.bindingHandlers.scrollIntoView={update:function(e,t){var o=ko.utils.unwrapObservable(t());if(o)try{for(;8===e.nodeType;)e=e.nextSibling;if(8!==e.nodeType){var i,n=$(e).scrollParent(),a=!1;9==n[0].nodeType?(n=$(n[0].defaultView),i=0,a=!0):i=n.offset().top;var r=n.height(),l=n.scrollTop(),s=i+r,d=$(e),c=d.offset().top;a&&(c-=l);var u=d.height(),p=c+u;c>i&&s>c+u||(r>u?(i>c&&_scrollIntoView(e,!0,n,i-c),p>s&&_scrollIntoView(e,!1,n,s-p)):(i>c&&s>p&&_scrollIntoView(e,!1,n,s-p),c>i&&p>s&&_scrollIntoView(e,!0,n,i-c)))}}catch(f){console.log("TODO exception scrolling into view",f)}}},ko.virtualElements.allowedBindings.scrollIntoView=!0;
|
1395
|
+
|
1396
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1397
|
+
|
1398
|
+
},{"./../../../bower_components/console-browserify/index.js":1}],44:[function(require,module,exports){
|
1399
|
+
(function (global){
|
1400
|
+
"use strict";function createStringTemplateEngine(e){var t=e.makeTemplateSource;return e.makeTemplateSource=function(e){return"undefined"!=typeof templates[e]?new ko.templateSources.stringTemplate(e,templates[e]):t(e)},e}function pushTemplate(e,t){templates[e]=t}function removeTemplate(e){"undefined"!=typeof templates[e]?templates[e]=void 0:origTemplateSystem.removeTemplate(e)}function init(){ko.setTemplateEngine(createStringTemplateEngine(new ko.nativeTemplateEngine))}function getTemplateContent(e){return"undefined"!=typeof templates[e]?templates[e]:origTemplateSystem.getTemplateContent(e)}var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),origTemplateSystem=require("./script-template.js"),templates={};ko.templateSources.stringTemplate=function(e,t){this.templateName=e,this.template=t,this._data={}},ko.utils.extend(ko.templateSources.stringTemplate.prototype,{data:function(e,t){return 1===arguments.length?this._data[e]:(this._data[e]=t,void 0)},text:function(e){return 0===arguments.length?this.template:(this.template=e,void 0)}}),module.exports={init:init,addTemplate:pushTemplate,removeTemplate:removeTemplate,getTemplateContent:getTemplateContent};
|
1401
|
+
|
1402
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1403
|
+
|
1404
|
+
},{"./script-template.js":41}],45:[function(require,module,exports){
|
1405
|
+
(function (global){
|
1406
|
+
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),$=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),kojqui=(typeof window !== "undefined" ? window['kojqui'] : typeof global !== "undefined" ? global['kojqui'] : null),console=require("./../../../bower_components/console-browserify/index.js"),extendValueAccessor=function(e,t){return function(){return ko.utils.extend(t,e()),t}},options={show:{delay:500},track:!0,items:'[title][title!=""][title!=" "]'};ko.bindingHandlers.tooltips={init:function(e,t,o,i,n){return"undefined"!=typeof $.fn.tooltip&&"undefined"!=typeof ko.bindingHandlers.tooltip?ko.bindingHandlers.tooltip.init(e,extendValueAccessor(t,options),o,i,n):void 0},update:function(e,t,o,i,n){return"undefined"!=typeof $.fn.tooltip&&"undefined"!=typeof ko.bindingHandlers.tooltip?ko.bindingHandlers.tooltip.update(e,extendValueAccessor(t,options),o,i,n):void 0}};
|
1407
|
+
|
1408
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1409
|
+
|
1410
|
+
},{"./../../../bower_components/console-browserify/index.js":1}],46:[function(require,module,exports){
|
1411
|
+
(function (global){
|
1412
|
+
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require("./../../../bower_components/console-browserify/index.js");ko.bindingHandlers.validatedValue={init:function(e,t,o){var i=t;if("undefined"!=typeof e.pattern){var n=new RegExp("^(?:"+e.pattern+")$"),a=ko.computed({read:function(){var o=ko.utils.unwrapObservable(t()),i=null===o||""===o||n.test(o);return i?e.classList.remove("invalid"):e.classList.add("invalid"),o},write:ko.isWriteableObservable(t())&&function(o){ko.selectExtensions.writeValue(e,o);var i=ko.selectExtensions.readValue(e);t()(i)},disposeWhenNodeIsRemoved:e});i=function(){return a}}ko.bindingHandlers.value.init(e,i,o)}},ko.expressionRewriting._twoWayBindings.validatedValue=!0;
|
1413
|
+
|
1414
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1415
|
+
|
1416
|
+
},{"./../../../bower_components/console-browserify/index.js":1}],47:[function(require,module,exports){
|
1417
|
+
(function (global){
|
1418
|
+
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require("./../../../bower_components/console-browserify/index.js");ko.bindingHandlers.uniqueId={currentIndex:0,init:function(e,t){var o=ko.utils.unwrapObservable(t())||{};if(""===o.id()){var a,i,n;n="ko_"+("undefined"!=typeof o.type?ko.utils.unwrapObservable(o.type):"block");do a=n+"_"+ ++ko.bindingHandlers.uniqueId.currentIndex,i=global.document.getElementById(a);while(i);o.id(a)}}},ko.virtualElements.allowedBindings.uniqueId=!0,ko.bindingHandlers.virtualAttr={update:function(e,t){8!==e.nodeType&&ko.bindingHandlers.attr.update(e,t)}},ko.virtualElements.allowedBindings.virtualAttr=!0,ko.bindingHandlers.virtualAttrStyle={update:function(e,t,o,a,i){if(8!==e.nodeType){var n="undefined"==typeof i.templateMode||"wysiwyg"!=i.templateMode,l=["style"];n&&l.push("replacedstyle");for(var r=ko.utils.unwrapObservable(t()),d=0;d<l.length;d++){var s=l[d],c=r===!1||null===r||void 0===r;c?e.removeAttribute(s):e.setAttribute(s,r.toString())}}}},ko.virtualElements.allowedBindings.virtualAttrStyle=!0,ko.bindingHandlers.virtualStyle={update:function(e,t){8!==e.nodeType&&ko.bindingHandlers.style.update(e,t)}},ko.virtualElements.allowedBindings.virtualStyle=!0,ko.bindingHandlers.virtualHtml={init:ko.bindingHandlers.html.init,update:function(e,t){if(8===e.nodeType){var o=ko.utils.unwrapObservable(t());if(ko.virtualElements.emptyNode(e),null!==o&&void 0!==o){"string"!=typeof o&&(o=o.toString());var a=ko.utils.parseHtmlFragment(o);if(a)for(var i=e.nextSibling,n=0,l=a.length;l>n;n++)i.parentNode.insertBefore(a[n],i)}}else ko.bindingHandlers.html.update(e,t);return{controlsDescendantBindings:!0}}},ko.virtualElements.allowedBindings.virtualHtml=!0;
|
1419
|
+
|
1420
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1421
|
+
|
1422
|
+
},{"./../../../bower_components/console-browserify/index.js":1}],48:[function(require,module,exports){
|
1423
|
+
(function (global){
|
1424
|
+
"use strict";var tinymce=(typeof window !== "undefined" ? window['tinymce'] : typeof global !== "undefined" ? global['tinymce'] : null),$=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require("./../../../bower_components/console-browserify/index.js");require("./eventable.js"),ko.bindingHandlers.wysiwygOrHtml={init:function(e,t,o,i,a){var n="undefined"==typeof a.templateMode||"wysiwyg"!=a.templateMode;return n?ko.bindingHandlers.virtualHtml.init():ko.bindingHandlers.wysiwyg.init(e,t,o,i,a)},update:function(e,t,o,i,a){var n="undefined"==typeof a.templateMode||"wysiwyg"!=a.templateMode;return n?ko.bindingHandlers.virtualHtml.update(e,t,o,i,a):void 0}},ko.virtualElements.allowedBindings.wysiwygOrHtml=!0,ko.bindingHandlers.wysiwygHref={init:function(e,t,o,i,a){if(8!==e.nodeType){t();var n="undefined"==typeof a.templateMode||"wysiwyg"!=a.templateMode;if(n)e.setAttribute("target","_new");else{var l=o();"undefined"!=typeof l.wysiwygOrHtml?e.setAttribute("href","javascript:void(0)"):(e.removeAttribute("href"),e.setAttribute("disabledhref","#"))}}},update:function(e,t,o,i,a){if(8!==e.nodeType){var n="undefined"==typeof a.templateMode||"wysiwyg"!=a.templateMode,l=ko.utils.unwrapObservable(t());n&&(l===!1||null===l||void 0===l?e.removeAttribute("href"):e.setAttribute("href",l.toString()))}}},ko.virtualElements.allowedBindings.wysiwygHref=!0,ko.bindingHandlers.wysiwygSrc={convertedUrl:function(e,t,o,i){var a=e+"?method="+t+"&width="+o+(null!==i?"&height="+i:"");return console.log("basic converterUrl",a),a},placeholderUrl:function(e,t,o){},update:function(e,t){var o=ko.utils.unwrapObservable(t()),i=ko.utils.unwrapObservable(o.src),a=ko.utils.unwrapObservable(o.placeholder),n=ko.utils.unwrapObservable(o.width),l=ko.utils.unwrapObservable(o.height);if(i===!1||null===i||void 0===i||""===i)"object"==typeof a&&null!==a?e.setAttribute("src",ko.bindingHandlers.wysiwygSrc.placeholderUrl(a.width,a.height,a.text)):e.removeAttribute("src");else{var r=ko.utils.unwrapObservable(o.method);r||(r=n>0&&l>0?"cover":"resize");var d=ko.bindingHandlers.wysiwygSrc.convertedUrl(i.toString(),r,n,l);e.setAttribute("src",d)}"undefined"!=typeof n&&null!==n?e.setAttribute("width",n):e.removeAttribute("width"),"undefined"!=typeof l&&null!==l?e.setAttribute("height",l):e.removeAttribute("height")}},ko.bindingHandlers.wysiwygId={init:function(e,t,o,i,a){var n="undefined"==typeof a.templateMode||"wysiwyg"!=a.templateMode;n||e.setAttribute("id",ko.utils.unwrapObservable(t()))},update:function(e,t,o,i,a){var n="undefined"==typeof a.templateMode||"wysiwyg"!=a.templateMode;n||e.setAttribute("id",ko.utils.unwrapObservable(t()))}},ko.virtualElements.allowedBindings.wysiwygId=!0,ko.bindingHandlers.wysiwygClick={init:function(e,t,o,i,a){var n="undefined"==typeof a.templateMode||"wysiwyg"!=a.templateMode;n||ko.bindingHandlers.click.init(e,t,o,i,a)}},ko.virtualElements.allowedBindings.wysiwygClick=!0,ko.bindingHandlers.wysiwygCss={update:function(e,t,o,i,a){var n="undefined"==typeof a.templateMode||"wysiwyg"!=a.templateMode;n||ko.bindingHandlers.css.update(e,t,o,i,a)}},ko.virtualElements.allowedBindings.wysiwygCss=!0,ko.bindingHandlers.wysiwygImg={makeTemplateValueAccessor:function(e,t){return function(){var o="undefined"!=typeof t.templateMode&&"wysiwyg"==t.templateMode,i=e(),a=ko.utils.peekObservable(i);return ko.utils.unwrapObservable(i),{name:o?a._editTemplate:a._template,templateEngine:ko.nativeTemplateEngine.instance}}},init:function(e,t,o,i,a){return ko.bindingHandlers.template.init(e,ko.bindingHandlers.wysiwygImg.makeTemplateValueAccessor(t,a))},update:function(e,t,o,i,a){return a=a.extend(t()),ko.bindingHandlers.template.update(e,ko.bindingHandlers.wysiwygImg.makeTemplateValueAccessor(t,a),o,i,a)}},ko.virtualElements.allowedBindings.wysiwygImg=!0,ko.bindingHandlers.wysiwyg={currentIndex:0,standardOptions:{},fullOptions:{toolbar1:"bold italic forecolor backcolor hr styleselect removeformat | link unlink | pastetext code",plugins:["link hr paste lists textcolor code"]},init:function(e,t){ko.bindingHandlers.focusable.init(e),ko.utils.domNodeDisposal.addDisposeCallback(e,function(){tinymce.remove("#"+e.getAttribute("id"))});var o=t();if(!ko.isObservable(o))throw"Wysiwyg binding called with non observable";if(8===e.nodeType)throw"Wysiwyg binding called on virtual node, ignoring...."+e.innerHTML;var i=e.getAttribute("id");i||(i="wysiwyg_"+ ++ko.bindingHandlers.wysiwyg.currentIndex,e.setAttribute("id",i));var a,n="DIV"==e.tagName||"TD"==e.tagName,l=!1,r=!1,d={selector:"#"+i,inline:!0,hidden_input:!1,plugins:["paste"],toolbar1:"bold italic",toolbar2:"",preview_styles:!1,paste_as_text:!0,language:"en",schema:"html5",extended_valid_elements:"strong/b,em/i,*[*]",menubar:!1,skin:"gray-flat",setup:function(e){e.on("change redo undo",function(){l||(r=!0,o(e.getContent({format:"raw"})),r=!1)}),e.on("focus",function(){e.nodeChanged(),e.getElement().click()}),e.on("BeforeSetContent",function(e){e.initial&&(e.format="raw")}),a=e}};return ko.utils.extend(d,ko.bindingHandlers.wysiwyg.standardOptions),n&&ko.utils.extend(d,ko.bindingHandlers.wysiwyg.fullOptions),global.setTimeout(function(){tinymce.init(d)}),ko.computed(function(){var o=ko.utils.unwrapObservable(t());if(!r){try{l=!0,"undefined"!=typeof a?a.setContent(o,{format:"raw"}):ko.utils.setHtml(e,o)}catch(i){console.log("TODO exception setting content to editable element",typeof a,i)}l=!1}},null,{disposeWhenNodeIsRemoved:e}),{controlsDescendantBindings:!0}}};
|
1425
|
+
|
1426
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1427
|
+
|
1428
|
+
},{"./../../../bower_components/console-browserify/index.js":1,"./eventable.js":34}],49:[function(require,module,exports){
|
1429
|
+
"use strict";var console=require("./../../../bower_components/console-browserify/index.js"),checkModel=function(e,t,o,n,i){var a,r,l,s=0;if("undefined"==typeof i&&(i=!1),"undefined"!=typeof t&&"function"==typeof t.splice)for(a={},r=0;r<t.length;r++)a[t[r].type]=t[r];else a=t;for(var d in e)if(e.hasOwnProperty(d))if(l="undefined"!=typeof n?n+"."+d:d,o.hasOwnProperty(d))if(typeof o[d]!=typeof e[d])null!==o[d]&&null!==e[d]&&("string"==typeof o[d]?String(e[d])!=e[d]&&(console.log("TODO Different type 1 ",l,typeof o[d],typeof e[d],o[d],e[d]),s=Math.max(s,2)):"number"==typeof o[d]?Number(e[d])!=e[d]&&(console.log("TODO Different type 2 ",l,typeof o[d],typeof e[d],o[d],e[d]),s=Math.max(s,2)):(console.log("TODO Different type 3 ",l,typeof o[d],typeof e[d],o[d],e[d]),s=Math.max(s,2)));else if("object"==typeof e[d])if(null!==e[d])if("undefined"!=typeof e[d].splice){if(e[d].length>0)if(o[d].length>0){var u=0;for(r=0;r<o[d].length;r++)if("string"==typeof o[d][r].type){for(;u<e[d].length&&e[d][u].type!==o[d][r].type;)console.log("ignoring ",l,e[d][u].type," block type in reference not found in model"),u++;if(u>=e[d].length){console.log("WARN cannot find ",l,o[d][r].type," block in reference"),s=Math.max(s,2);break}s=Math.max(s,checkModel(e[d][u],void 0,o[d][r],l+"["+r+"."+o[d][r].type+"]"))}}else for(r=0;r<e[d].length;r++)"string"!=typeof e[d][r].type?(console.log("TODO found an object with no type",l,e[d][r]),s=Math.max(s,2)):a.hasOwnProperty(e[d][r].type)?s=Math.max(s,checkModel(a[e[d][r].type],a,e[d][r],l+"["+r+"."+e[d][r].type+"]")):(console.warn("TODO the model uses a block type not defined by the template. REMOVING IT!!",l,e[d][r]),e[d].splice(r,1),r--,s=Math.max(s,2))}else null===o[d]?i?(console.log("WARN Null object in model ",l,"instead of",e[d],"deleting it"),s=Math.max(s,2),delete e[d]):(console.log("INFO Null object in model ",l,"instead of",e[d],"cloning it from the reference"),s=Math.max(s,1),o[d]=e[d]):s=Math.max(s,checkModel(e[d],a,o[d],l,i));else null!==o[d]&&(console.log("TODO Null in reference but not null in model",l,o[d]),s=Math.max(s,2));else"string"!=typeof e[d]&&"boolean"!=typeof e[d]&&"number"!=typeof e[d]&&(console.log("TODO unsupported type",l,typeof e[d]),s=Math.max(s,2));else i?(console.warn("WARN Property ",l,"found in model is not defined by template: removing it!"),s=Math.max(s,2),delete e[d]):(console.log("INFO Property ",l,"missing in model, cloning from reference!"),s=Math.max(s,1),o[d]=e[d]);return i||(s=Math.max(s,checkModel(o,t,e,"undefined"!=typeof n?n+"!R":"!R",!0))),s};module.exports=checkModel;
|
1430
|
+
|
1431
|
+
},{"./../../../bower_components/console-browserify/index.js":1}],50:[function(require,module,exports){
|
1432
|
+
"use strict";var converterUtils=require("./utils.js"),cssParse=require("./../../../bower_components/mensch/lib/parser.js"),console=require("./../../../bower_components/console-browserify/index.js"),domutils=require("./domutils.js"),_declarationValueLookup=function(e,t,o){for(var n=e.length-1;n>=0;n--)if("property"==e[n].type&&e[n].name==t)return _declarationValueUrlPrefixer(e[n].value,o);return null},_propToCamelCase=function(e){return e.replace(/-([a-z])/g,function(e,t){return t.toUpperCase()})},_declarationValueUrlPrefixer=function(e,t){if(e.match(/url\(.*\)/)){var o=e.replace(/(url\()([^\)]*)(\))/g,function(e,o,n,i){var r=n.trim(),a=n.trim().charAt(0);"'"==a||'"'==a?r=r.substr(1,r.length-2):a="";var l=t(r);return null!==l?o+a+l+a+i:e});return o}return e},elaborateDeclarations=function(e,t,o,n,i,r,a){var l="object"==typeof r&&null!==r?r:{},s=null,d=0;if("undefined"==typeof t){var u=cssParse("#{\n"+e+"}",{comments:!0,position:!0});t=u.stylesheet.rules[0].declarations,d=1}for(var c=t.length-1;c>=0;c--)if("property"==t[c].type)if(a===!0&&"display"==t[c].name&&"none"==t[c].value)null===s&&(s=e),s=converterUtils.removeStyle(s,t[c].position.start,t[c].position.end,d,0,0,"");else{var f=t[c].name.match(/^-ko-(bind-|attr-)?([a-z0-9-]*?)(-if|-ifnot)?$/);if(null!==f){null===s&&"undefined"!=typeof e&&(s=e);var p,b,m,g="attr-"==f[1],h="bind-"==f[1],v=f[2],y="-if"==f[3]||"-ifnot"==f[3];if(y){p=t[c].name.substr(0,t[c].name.length-f[3].length);var k=_declarationValueLookup(t,p,o);if(null===k)throw"Unable to find declaration "+p+" for "+t[c].name}else{if((g||h)&&"undefined"==typeof i&&"undefined"!=typeof e)throw"Attributes and bind declarations are only allowed in inline styles!";var w,_=!0;if(g?(m=domutils.getAttribute(i,v),_=!1,w="virtualAttr"):h?(w=null,"text"==v?"undefined"!=typeof i?m=domutils.getInnerText(i):_=!1:"html"==v?"undefined"!=typeof i?m=domutils.getInnerHtml(i):_=!1:_=!1):(_="undefined"!=typeof e,_&&(m=_declarationValueLookup(t,v,o)),w="virtualStyle"),_&&null===m)throw console.error("Cannot find default value for",t[c].name,t),"Cannot find default value for "+t[c].name+": "+t[c].value+" in "+i+" ("+typeof e+"/"+v+")";var x=m,O=_propToCamelCase(v);try{b=converterUtils.expressionBinding(t[c].value,n,x)}catch(S){throw console.error("Model ensure path failed",S.stack,"name",t[c].name,"value",t[c].value,"default",m,"element",i),S}null!==w&&"undefined"==typeof l[w]&&(l[w]={}),"virtualAttr"==w&&"href"==O&&(w=null,O="wysiwygHref","undefined"!=typeof i&&null!==i&&domutils.removeAttribute(i,"href"));var C=_declarationValueLookup(t,t[c].name+"-if",o),$=!1;if(null===C)C=_declarationValueLookup(t,t[c].name+"-ifnot",o),$=!0;else if(null!==_declarationValueLookup(t,t[c].name+"-ifnot",o))throw"Unexpected error: cannot use both -if and -ifnot property conditions";if(null!==C)try{var T=converterUtils.conditionBinding(C,n);b=($?"!":"")+"("+T+") ? "+b+" : null"}catch(S){throw console.error("Unable to deal with -ko style binding condition",C,t[c].name),S}null!==w?l[w][O]=b:l[O]=b}if(null!==s)try{if("undefined"!=typeof i&&null!==i)s=converterUtils.removeStyle(s,t[c].position.start,t[c].position.end,d,0,0,"");else{var A="";y||(A=v+": <!-- ko text: "+b+" -->"+m+"<!-- /ko -->"),s=converterUtils.removeStyle(s,t[c].position.start,t[c].position.end,d,0,0,A)}}catch(S){throw console.warn("Remove style failed",S,"name",t[c]),S}}else{var E=_declarationValueUrlPrefixer(t[c].value,o);if(E!=t[c].value&&(null===s&&"undefined"!=typeof e&&(s=e),null!==s))try{s=converterUtils.removeStyle(s,t[c].position.start,t[c].position.end,d,0,0,t[c].name+": "+E)}catch(S){throw console.log("Remove style failed replacing url",S,"name",t[c]),S}var M=_propToCamelCase(t[c].name),D="virtualAttrStyle",j="undefined"!=typeof l.virtualStyle?l.virtualStyle[M]:void 0,P=" ";"undefined"==typeof l[D]&&(l[D]="''",P=""),"undefined"!=typeof j?(l[D]="'"+t[c].name+": '+("+j+")+';"+P+"'+"+l[D],delete l.virtualStyle[M]):l[D]="'"+t[c].name+": "+converterUtils.addSlashes(E)+";"+P+"'+"+l[D]}}if("undefined"!=typeof i&&null!==i){for(var H in l.virtualStyle)if(l.virtualStyle.hasOwnProperty(H))throw console.log("Unexpected virtualStyle binding after conversion to virtualAttr.style",H,l.virtualStyle[H],e),"Unexpected virtualStyle binding after conversion to virtualAttr.style for "+H;delete l.virtualStyle;var B=domutils.getAttribute(i,"data-bind"),I=(null!==B?B+", ":"")+_bindingSerializer(l);domutils.setAttribute(i,"data-bind",I)}if("undefined"==typeof e){var q=!1;for(var R in l.virtualStyle)if(l.virtualStyle.hasOwnProperty(R)){q=!0;break}if(q){if("undefined"!=typeof l.virtualAttrStyle){var U=l.virtualAttrStyle;delete l.virtualAttrStyle,l.virtualAttrStyle=U}}else delete l.virtualStyle;return _bindingSerializer(l)}return s},_bindingSerializer=function(e){var t=[];for(var o in e)e.hasOwnProperty(o)&&("object"==typeof e[o]?t.push(o+": "+"{ "+_bindingSerializer(e[o])+" }"):t.push(o+": "+e[o]));return t.reverse().join(", ")};module.exports=elaborateDeclarations;
|
1433
|
+
|
1434
|
+
},{"./../../../bower_components/console-browserify/index.js":1,"./../../../bower_components/mensch/lib/parser.js":15,"./domutils.js":51,"./utils.js":57}],51:[function(require,module,exports){
|
1435
|
+
(function (global){
|
1436
|
+
"use strict";function _extend(e,t){if(t)for(var o in t)t.hasOwnProperty(o)&&(e[o]=t[o]);return e}var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),objExtend=function(e,t){return"function"==typeof $.extend?$.extend(!0,e,t):_extend(e,JSON.parse(JSON.stringify(t)))},getAttribute=function(e,t){var o=$(e).attr(t);return"undefined"==typeof o&&(o=null),o},setAttribute=function(e,t,o){$(e).attr(t,o)},removeAttribute=function(e,t){$(e).removeAttr(t)},getInnerText=function(e){return $(e).text()},getInnerHtml=function(e){return $(e).html()},getLowerTagName=function(e){return""===e.tagName&&"string"==typeof e.name?e.name.toLowerCase():""!==e.tagName?e.tagName.toLowerCase():$(e).prop("tagName").toLowerCase()},setContent=function(e,t){$(e).html(t)},replaceHtml=function(e,t){$(e).replaceWith(t)},removeElements=function(e,t){t&&"undefined"!=typeof e.detach&&e.detach(),e.remove()};module.exports={getAttribute:getAttribute,setAttribute:setAttribute,removeAttribute:removeAttribute,getInnerText:getInnerText,getInnerHtml:getInnerHtml,getLowerTagName:getLowerTagName,setContent:setContent,replaceHtml:replaceHtml,removeElements:removeElements,objExtend:objExtend};
|
1437
|
+
|
1438
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1439
|
+
|
1440
|
+
},{}],52:[function(require,module,exports){
|
1441
|
+
"use strict";var console=require("./../../../bower_components/console-browserify/index.js"),elaborateDeclarations=require("./declarations.js"),utils=require("./utils.js"),modelDef=require("./model.js"),_getOptionsObject=function(e){for(var t=e.split("|"),o={},n=0;n<t.length;n++){var i=t[n].split("=");o[i[0]]=i.length>1?i[1]:i[0]}return o},_filterProps=function(e,t,o){var n=[];for(var i in e)if(!i.match(/^customStyle$/)&&!i.match(/^_/)&&e.hasOwnProperty(i)){var a=null!==e[i]&&"undefined"!=typeof e[i]._category&&"style"==e[i]._category;if("id"==i||"type"==i||i.match(/Blocks$/));else if("styler"==t)(a||o>0)&&n.push(i);else if("edit"==t){var r=null!==e[i]&&"undefined"!=typeof e[i]._category&&"content"==e[i]._category&&("undefined"==typeof e[i]._context||"block"!=e[i]._context);r&&n.push(i)}else"undefined"==typeof t&&n.push(i)}return n},_propInput=function(e,t,o,n,i){var a,r="";if(null!==e&&"undefined"!=typeof e._widget&&(a=e._widget),"undefined"==typeof a)throw"Unknown data type for "+t;var l="focusable: true";if("edit"==n&&(l+=", event: { focus: function(ui, event) { $($element).click(); } } "),r+='<label class="data-'+a+'"'+("boolean"==a?" data-bind=\"event: { mousedown: function(ui, evt) { if (evt.button == 0) { var input = $($element).find('input'); var ch = input.prop('checked'); setTimeout(function() { input.click(); input.prop('checked', !ch); input.trigger('change'); }, 0); } } }, click: function(ui, evt) { evt.preventDefault(); }, clickBubble: false\"":"")+">","undefined"!=typeof i&&"undefined"!=typeof i[a]){var s=i[a],d={};if("undefined"!=typeof s.parameters)for(var u in s.parameters)s.parameters.hasOwnProperty(u)&&"undefined"!=typeof e["_"+u]&&(d[u]=e["_"+u]);r+=s.html(o,l,d)}else if("boolean"==a)r+='<input type="checkbox" value="nothing" data-bind="checked: '+o+", "+l+'" />',r+='<span class="checkbox-replacer" ></span>';else if("color"==a)r+='<input size="7" type="text" data-bind="colorpicker: { color: '+o+", strings: $root.t('Theme Colors,Standard Colors,Web Colors,Theme Colors,Back to Palette,History,No history yet.') }, "+", "+l+'" />';else if("select"==a){if("undefined"!=typeof e._options){var c=_getOptionsObject(e._options);r+='<select data-bind="value: '+o+", "+l+'">';for(var p in c)c.hasOwnProperty(p)&&(r+='<option value="'+p+"\" data-bind=\"text: $root.ut('template', '"+utils.addSlashes(c[p])+"')\">"+c[p]+"</option>");r+="</select>"}}else if("font"==a)r+='<select type="text" data-bind="value: '+o+", "+l+'">',r+='<optgroup label="Sans-Serif Fonts">',r+='<option value="Arial,Helvetica,sans-serif">Arial</option>',r+="<option value=\"'Comic Sans MS',cursive,sans-serif\">Comic Sans MS</option>",r+='<option value="Impact,Charcoal,sans-serif">Impact</option>',r+="<option value=\"'Trebuchet MS',Helvetica,sans-serif\">Trebuchet MS</option>",r+='<option value="Verdana,Geneva,sans-serif">Verdana</option>',r+="</optgroup>",r+='<optgroup label="Serif Fonts">',r+='<option value="Georgia,serif">Georgia</option>',r+="<option value=\"'Times New Roman',Times,serif\">Times New Roman</option>",r+="</optgroup>",r+='<optgroup label="Monospace Fonts">',r+="<option value=\"'Courier New',Courier,monospace\">Courier New</option>",r+="</optgroup>",r+="</select>";else if("url"==a)r+='<div class="ui-textbutton">',r+='<input class="ui-textbutton-input" size="7" type="url" pattern="(mailto:.+@.+|https?://.+\\..+|\\[.*\\].*)" value="nothing" data-bind="css: { withButton: typeof $root.linkDialog !== \'undefined\' }, validatedValue: '+o+", "+l+'" />',r+="<a class=\"ui-textbutton-button\" data-bind=\"visible: typeof $root.linkDialog !== 'undefined', click: typeof $root.linkDialog !== 'undefined' ? $root.linkDialog.bind($element.previousSibling) : false, button: { icons: { primary: 'fa fa-fw fa-ellipsis-h' }, label: 'Opzioni', text: false }\">Opzioni</a>",r+="</div>";else if("integer"==a){var f=0,b=1e3;null!==e&&"undefined"!=typeof e._max&&(b=e._max),null!==e&&"undefined"!=typeof e._min&&(f=e._min);var m=b-f>=100?10:1,g=5*m;r+='<input class="number-spinner" size="7" step="'+m+'" type="number" value="-1" data-bind="spinner: { min: '+f+", max: "+b+", page: "+g+", value: "+o+" }, valueUpdate: ['change', 'spin']"+", "+l+'" />'}else r+='<input size="7" type="text" value="nothing" data-bind="value: '+o+", "+l+'" />';return r+="</label>"},_getGlobalStyleProp=function(e,t,o,n){var i;return("object"!=typeof t||null===t||"undefined"!=typeof t._widget)&&"undefined"!=typeof o&&"undefined"!=typeof n&&n.length>0&&"object"==typeof e&&"undefined"!=typeof e[n]&&(i=e[n]),i},_propEditor=function(e,t,o,n,i,a,r,l,s,d,u,c,p,f,b){if("undefined"==typeof s&&(s=0),"undefined"!=typeof r&&"object"==typeof n&&null!==n&&"undefined"==typeof n._usecount)return console.log("TODO EDITOR ignoring",a,"property because it is not used by the template","prop:",r,"type:",l,"level:",s,e._templateName),"";var m,g="undefined"!=typeof c?r+"._defaultComputed":r,h="",v=g,y=1,k=1;if("object"==typeof n&&null!==n&&"undefined"==typeof n._widget||"undefined"==typeof c&&(y+=1),"undefined"==typeof c&&"undefined"!=typeof d&&(k+=d),"undefined"!=typeof r&&p&&(h+="<!-- ko ifSubs: { data: "+v+", threshold: "+k+", gutter: "+y+" } -->"),"undefined"==typeof r||null!==n&&"undefined"!=typeof n._name||console.log("TODO WARN Missing label for property ",r),"undefined"==typeof r&&null!==n&&"undefined"==typeof n._name&&console.log("TODO WARN Missing label for object ",n.type),"object"==typeof n&&null!==n&&"undefined"==typeof n._widget){var w=_filterProps(n,l,s),x="styler"==l&&null!==n&&"undefined"!=typeof n.customStyle&&"undefined"!=typeof c,_="",$="";"undefined"!=typeof r&&"edit"==l&&(_=", click: function(obj, evt) { $root.selectItem("+r+", $data); return false }, clickBubble: false, css: { selecteditem: $root.isSelectedItem("+r+") }, scrollIntoView: $root.isSelectedItem("+r+"), ",$+=" selectable"),x&&($+=" supportsCustomStyles"),h+='<div class="objEdit level'+s+$+'" data-bind="tooltips: {}'+_+'">';var S=null!==n&&"undefined"!=typeof n._name?n._name:"undefined"!=typeof r?"["+r+"]":"";if(x){var C="Stile";"undefined"!=typeof i&&null!==i&&"undefined"!=typeof i._name?C=i._name:console.log("TODO missing label for theme section ",r,null!==n?n.type:"-"),S="<span class=\"blockSelectionMethod\" data-bind=\"text: customStyle() ? $root.ut('template', '"+utils.addSlashes(S)+"') : $root.ut('template', '"+utils.addSlashes(C)+"')\">Block</span>"}else S="<span data-bind=\"text: $root.ut('template', '"+utils.addSlashes(S)+"')\">"+S+"</span>";if(m=null!==n&&"undefined"!=typeof n._help?' title="'+utils.addSlashes(n._help)+"\" data-bind=\"attr: { title: $root.ut('template', '"+utils.addSlashes(n._help)+"') }\"":"",h+="<span"+m+' class="objLabel level'+s+'">'+S+"</span>","edit"==l&&"undefined"!=typeof n._blockDescription&&(h+="<div class=\"blockDescription\" data-bind=\"html: $root.ut('template', '"+utils.addSlashes(n._blockDescription)+"')\">"+n._blockDescription+"</div>"),x&&(h+='<label class="data-boolean blockCheck" data-bind="tooltips: { }">',h+='<input type="checkbox" value="nothing" data-bind="focusable: true, checked: customStyle" />',h+='<span title="Switch between global and block level styles editing" data-bind="attr: { title: $root.t(\'Switch between global and block level styles editing\') }" class="checkbox-replacer checkbox-replacer-onoff"></span>',h+="</label>",h+="<!-- ko template: { name: 'customstyle', if: customStyle } --><!-- /ko -->"),"undefined"!=typeof r&&(h+="<!-- ko with: "+r+" -->",1==s&&"undefined"!=typeof r&&"undefined"!=typeof n._previewBindings&&"undefined"!=typeof e)){"undefined"!=typeof f&&(h+='<!-- ko with: $root.content() --><div class="objPreview" data-bind="'+f+'"></div><!-- /ko -->'),"undefined"!=typeof b&&(h+='<!-- ko with: $parent --><div class="objPreview" data-bind="'+b+'"></div><!-- /ko -->');var O=elaborateDeclarations(void 0,n._previewBindings,o,e.bind(this,a+"."));h+='<div class="objPreview"><div class="objPreviewInner" data-bind="'+O+'"></div></div>'}var T;0===s&&"undefined"!=typeof n._previewBindings&&(T=elaborateDeclarations(void 0,n._previewBindings,o,e.bind(this,a.length>0?a+".":"")));var A,E,H,D,M=h.length;for(A=0;A<w.length;A++)E=a.length>0?a+"."+w[A]:w[A],("object"!=typeof n[w[A]]||null===n[w[A]]||"undefined"!=typeof n[w[A]]._widget)&&(D=void 0,0===s&&"theme"==w[A]?h+=_propEditor(e,t,o,n[w[A]],H,E,w[A],l,0,d,void 0,void 0,p,f):(D=_getGlobalStyleProp(u,n[w[A]],w[A],E),h+=_propEditor(e,t,o,n[w[A]],H,E,w[A],l,s+1,d,u,D,p,f,T)));for(A=0;A<w.length;A++)E=a.length>0?a+"."+w[A]:w[A],"object"==typeof n[w[A]]&&null!==n[w[A]]&&"undefined"==typeof n[w[A]]._widget&&(D=void 0,0===s&&"theme"==w[A]?h+=_propEditor(e,t,o,n[w[A]],H,E,w[A],l,0,d,void 0,void 0,p,f):(D=_getGlobalStyleProp(u,n[w[A]],w[A],E),h+=_propEditor(e,t,o,n[w[A]],H,E,w[A],l,s+1,d,u,D,p,f,T)));var q=h.length-M;if(0===q){if("object"==typeof n&&null!==n&&"template"==n._context)return"";h+='<div class="objEmpty" data-bind="html: $root.t(\'Selected element has no editable properties\')">Selected element has no editable properties</div>'}"undefined"!=typeof r&&(h+="<!-- /ko -->"),h+="</div>"}else{var B=!0;if("undefined"==typeof u&&(B=!1),null===n||"object"!=typeof n||"undefined"!=typeof n._widget){var I=[];"undefined"!=typeof c&&I.push("css: { notnull: "+r+"() !== null }"),m=null!==n&&"undefined"!=typeof n._help?' title="'+utils.addSlashes(n._help)+"\" data-bind=\"attr: { title: $root.ut('template', '"+utils.addSlashes(n._help)+"') }\"":"",m.length>0&&I.push("tooltips: {}");var j=I.length>0?'data-bind="'+utils.addSlashes(I.join())+'"':"";h+='<div class="propEditor '+(B?"checkboxes":"")+'"'+j+">";var P=null!==n&&"undefined"!=typeof n._name?n._name:"undefined"!=typeof r?"["+r+"]":"";P="<span data-bind=\"text: $root.ut('template', '"+utils.addSlashes(P)+"')\">"+P+"</span>",h+="<span"+m+' class="propLabel">'+P+"</span>",h+='<div class="propInput '+("undefined"!=typeof u?"local":"")+'" data-bind="css: { default: '+r+'() === null }">',h+=_propInput(n,r,g,l,t),h+="</div>","undefined"!=typeof c&&(h+='<div class="propInput global" data-bind="css: { overridden: '+r+'() !== null }">',h+=_propInput(n,r,c,l,t),h+="</div>",B&&(h+='<div class="propCheck"><label data-bind="tooltips: {}"><input type="checkbox" data-bind="focusable: true, click: function(evt, obj) { $root.localGlobalSwitch('+r+", "+c+"); return true; }, checked: "+r+'() !== null">',h+='<span class="checkbox-replacer" data-bind="css: { checked: '+r+"() !== null }, attr: { title: $root.t('This style is specific for this block: click here to remove the custom style and revert to the theme value') }\"></span>",h+="</label></div>")),h+="</div>"}else h+=null===n||"object"!=typeof n?'<div class="propEditor unknown">[A|'+r+"|"+typeof n+"]</div>":'<div class="propEditor unknown">[B|'+r+"|"+typeof n+"]</div>"}return"undefined"!=typeof r&&p&&(h+="<!-- /ko -->",h+="<!-- ko ifSubs: { not: true, data: "+v+", threshold: "+k+", gutter: 0 } -->",h+='<span class="label notused">('+r+")</span>",h+="<!-- /ko -->"),h},createBlockEditor=function(e,t,o,n,i,a,r,l,s,d,u,c){"undefined"==typeof u&&(u=!0);var p,f=modelDef.getDef(e,a),b=modelDef.getDef(e,i);"undefined"!=typeof b._previewBindings&&"thaeme"!=a&&"styler"==r&&(p=elaborateDeclarations(void 0,b._previewBindings,n,modelDef.getBindValue.bind(void 0,e,o,i,i,"")));var m,g="undefined"!=typeof d&&d?e[a]._globalStyles:void 0,h="undefined"!=typeof d&&d?e[a]._globalStyle:void 0;if("undefined"!=typeof h){var v=modelDef.getDef(e,"theme");m=v[h.replace(/^(\$theme|_theme_)\./,"")]}var y=modelDef.getBindValue.bind(void 0,e,o,i,a);y._templateName=a;var k='<div class="editor">';k+='<div class="blockType'+("undefined"!=typeof g?" withdefaults":"")+'">'+f.type+"</div>";var w=_propEditor(y,t,n,f,m,"",void 0,r,c,s,g,h,u,p);w.length>0&&(k+=w),k+="</div>",l(k,a,r)},createBlockEditors=function(e,t,o,n,i,a,r,l){createBlockEditor(e,t,o,n,i,a,"edit",r,l),createBlockEditor(e,t,o,n,i,a,"styler",r,l,!0)},generateEditors=function(e,t,o,n,i){var a,r=e._defs,l=e.templateName,s=e._blocks,d=[];for(a=0;a<s.length;a++)"undefined"!=typeof s[a].container&&d.push(modelDef.generateModel(r,s[a].block)),createBlockEditors(r,t,void 0,o,s[a].root,s[a].block,n,i);return"undefined"!=typeof r.theme&&createBlockEditor(r,t,void 0,o,l,"theme","styler",n,void 0,!1,!1,-1),d};module.exports=generateEditors;
|
1442
|
+
|
1443
|
+
},{"./../../../bower_components/console-browserify/index.js":1,"./declarations.js":50,"./model.js":54,"./utils.js":57}],53:[function(require,module,exports){
|
1444
|
+
"use strict";var modelDef=require("./model.js"),wrappedResultModel=function(e){var t=e._defs,o=e.templateName,a=modelDef.getDef(t,o),i=modelDef.generateResultModel(e),l=require("./wrapper.js"),n=l(i,a,t);return n},translateTemplate=function(){var e=require("./parser.js");return e.apply(e,arguments)},generateEditors=function(){var e=require("./editor.js");return e.apply(e,arguments)},checkModel=function(){var e=require("./checkmodel.js");return e.apply(e,arguments)};module.exports={translateTemplate:translateTemplate,wrappedResultModel:wrappedResultModel,generateResultModel:modelDef.generateResultModel,generateEditors:generateEditors,checkModel:checkModel};
|
1445
|
+
|
1446
|
+
},{"./checkmodel.js":49,"./editor.js":52,"./model.js":54,"./parser.js":55,"./wrapper.js":58}],54:[function(require,module,exports){
|
1447
|
+
"use strict";var objExtend=require("./domutils.js").objExtend,console=require("./../../../bower_components/console-browserify/index.js"),_valueSet=function(e,t,o,n){var i=o.indexOf(".");if(-1==i)if("undefined"==typeof t[o])console.log("Undefined prop "+o+" while setting value "+n+" in model._valueSet");else if(null===t[o])"object"==typeof n&&null!==n&&"undefined"==typeof n.push&&console.log("nullpropobjectvalue",o,n),t[o]=n;else if("object"==typeof t[o]&&"function"==typeof t[o].push){var a;if("string"==typeof n){var r=n.match(/^\[(.*)\]$/);if(null===r)throw"Unexpected default value for array property "+o+": "+n;a=r[1].split(",")}else{if("object"!=typeof n||"undefined"==typeof n.push)throw"Unexpected default value for array property "+o+": "+n+" typeof "+typeof n;a=n}for(var l=[],s=0;s<a.length;s++)"@"==a[s].substr(0,1)?l.push(_generateModel(e,a[s].substr(1))):a[s].length>0&&l.push(a[s]);t[o]=l}else"string"==typeof t[o]||"boolean"==typeof t[o]?t[o]=n:"object"==typeof t[o]&&null!==t[o]&&"undefined"!=typeof t[o]._widget?("object"==typeof n&&null!==n&&console.log("objectvalue",o,t[o]._widget,n),t[o]=n):console.log("setting",typeof t[o],t[o],o,n);else{var d=o.substr(0,i);_valueSet(e,t[d],o.substr(i+1),n)}},_modelCreateOrUpdateBlockDef=function(e,t,o,n){if("undefined"!=typeof e[t]&&e[t]._initialized&&!e[t]._writeable)throw console.log("_modelCreateOrUpdateBlockDef",e,t,o,n),"Trying to alter non writeable model: "+t+" / "+o;if("undefined"==typeof e[t]&&(e[t]={_writeable:!0},"undefined"==typeof n&&(n={}),"undefined"==typeof n.category&&"undefined"==typeof e[t]._category&&(n.category=t.match(/(^t|.T)heme$/)||t.match(/(^s|.S)tyle$/)||t.match(/(^c|.C)olor$/)||t.match(/(^r|.R)adius$/)?"style":"content")),"undefined"!=typeof n){if("undefined"!=typeof n.name&&(e[t]._name=n.name),"undefined"!=typeof n.themeOverride&&(e[t]._themeOverride=n.themeOverride),"undefined"!=typeof n.globalStyle){e[t]._globalStyle=n.globalStyle;var i=n.globalStyle.replace(/^(\$theme|_theme_)\./,""),a=i.indexOf("."),r=-1!=a?i.substr(0,a):i;_modelCreateOrUpdateBlockDef(e,"theme",r),("undefined"==typeof e[t]._themeOverride||e[t]._themeOverride)&&_modelCreateOrUpdateBlockDef(e,t,"customStyle=false")}"undefined"!=typeof n.contextName&&(e[t]._context=n.contextName,"block"==n.contextName&&"undefined"==typeof e[t]._globalStyle&&(e[t]._globalStyle="_theme_.bodyTheme",_modelCreateOrUpdateBlockDef(e,"theme","bodyTheme"),("undefined"==typeof e[t]._themeOverride||e[t]._themeOverride)&&_modelCreateOrUpdateBlockDef(e,t,"customStyle=false"))),"undefined"!=typeof n.extend&&(e[t].type=n.extend)}for(var l in n)n.hasOwnProperty(l)&&"undefined"!=typeof n[l]&&-1==["name","extend","contextName","globalStyle","themeOverride"].indexOf(l)&&(e[t]["_"+l]=n[l]);"undefined"!=typeof o&&o.length>0&&(e[t]._props="undefined"!=typeof e[t]._props&&e[t]._props.length>0?e[t]._props+" "+o:o)},_removePrefix=function(e){var t=e.match(/^[^A-Z]+([A-Z])(.*)$/);return null!==t?t[1].toLowerCase()+t[2]:null},_generateModelFromDef=function(e,t){var o={};for(var n in e)if(!n.match(/^_.*/)&&e.hasOwnProperty(n)){var i=e[n];if("object"==typeof i&&null!==i&&"undefined"!=typeof i._complex&&i._complex)o[n]=_generateModelFromDef(i,t);else if("type"==n)o[n]=i;else{if("object"!=typeof i)throw console.error("Unexpected model def",n,i,e),"Unexpected model def ["+n+"]="+i;o[n]=null}}if("undefined"!=typeof e._defaultValues){var a=e._defaultValues;for(var r in a)a.hasOwnProperty(r)&&_valueSet(t,o,r,a[r])}return o},_generateModel=function(e,t){var o=_getModelDef(e,t,!1,!0);return _generateModelFromDef(o,e)},_getDef=function(e,t){return _getModelDef(e,t,!1,!0)},_getModelDef=function(e,t,o,n){if("undefined"==typeof e[t]){if(-1!=t.indexOf(" "))return null;var i=_removePrefix(t);return null!==i?_getModelDef(e,i,o,n):null}var a=e[t];if("object"!=typeof a)throw"Block definition must be an object: found "+a+" for "+t;if("undefined"==typeof a._initialized){if("undefined"==typeof a.type&&(a.type=-1==t.indexOf(" ")?t:t.substr(t.indexOf(" ")+1)),a.type!=t&&"undefined"==typeof a._widget){var r=_getModelDef(e,a.type,!0),l=objExtend(r,a);a=l,e[t]=a}else"undefined"==typeof a._widget&&"undefined"==typeof a._props&&"undefined"==typeof a._complex;a._writeable=!0,a._initialized=!0}if("undefined"!=typeof a._props){var s=a._props;if(s=s.split(" "),s.length>0&&"undefined"==typeof a._writeable)throw console.error("Altering a non writable object ",t,s,a),"Altering a non writable object: "+t+" def: "+s;"undefined"==typeof a._processedDefs&&(a._processedDefs={}),"undefined"==typeof a._globalStyles&&(a._globalStyles={}),"undefined"==typeof a._defaultValues&&(a._defaultValues={});for(var d=0;d<s.length;d++){var u=s[d];if(0!==u.length){var c=u,p=null,f=u.match(/^([^=\[\]]+)(\[\])?(=?)(.*)$/);if(null!==f&&(u=f[1],"[]"==f[2]&&("undefined"==typeof a[u]&&(a[u]=[]),p=[]),"="==f[3]&&(p=u.match(/(^v|V)isible$/)?"true"==String(f[4]).toLowerCase():u.match(/^customStyle$/)?"true"==String(f[4]).toLowerCase():f[4])),null!==p&&"undefined"==typeof a._defaultValues[u]&&(a._defaultValues[u]=p),"undefined"==typeof a[u]){var b=_getModelDef(e,t+" "+u,!0);null===b&&(b=_getModelDef(e,u,!0)),a[u]=b}a._processedDefs[u]=c,a._complex=!0}}delete a._props}if(o){a._writeable=!1;var m=objExtend({},a);return m}if(n)return a._writeable=!1,a;if("undefined"==typeof a._writeable||a._writeable===!1)throw"Retrieving non writeable object definition: "+t;return a},_increaseUseCount=function(e,t){if(e){if("undefined"==typeof t._usecount)throw console.error("ERROR trying to bind an unused property while readonly",t),"ERROR trying to bind an unused property"}else"undefined"==typeof t._usecount&&(t._usecount=0),t._usecount++},ensureGlobalStyle=function(e,t,o,n,i,a,r,l){var s=o(a,r,l);if("undefined"==typeof e[n]._globalStyles[i]){if(t)throw"Cannot find _globalStyle for "+i+" in "+n+"!";(-1!=i.indexOf(".")||"object"==typeof e[n][i]&&"undefined"!=typeof e[n][i]._widget)&&(e[n]._globalStyles[i]=s)}else if(e[n]._globalStyles[i]!=s)throw"Unexpected conflicting globalStyle [2] for "+n+"/"+i+": old="+e[n]._globalStyles[i]+" new="+s},modelEnsurePathAndGetBindValue=function(e,t,o,n,i,a,r,l,s,d){var u,c,p;if("$"==r.substr(0,1)){console.warn("DEPRECATED $ in bindingProvider: ",r,i);var f=r.indexOf(".");if(-1==f)throw"Unexpected fullPath: "+r+"/"+a+"/"+i+"/"+l+"/"+s;if(u=r.substr(1,f-1),p=r.substr(f+1),"theme"!=u)throw"Unexpected $ sequence: "+u+" in "+r;var b=p.indexOf(".");u=p.substr(0,b),p=p.substr(b+1),c="$root.content().theme()."+u+"()."+p.replace(new RegExp("\\.","g"),"().")}else if("#"==r.substr(0,1))console.warn("DEPRECATED # in bindingProvider: ",r,i),u=n,p=r.substr(1),c="$root.content()."+p.replace(new RegExp("\\.","g"),"().");else if("_theme_."==r.substr(0,8)){var m=r.indexOf(".",8);u=r.substr(8,m-8),p=r.substr(m+1),c="$root.content().theme()."+u+"()."+p.replace(new RegExp("\\.","g"),"().")}else"_root_."==r.substr(0,7)?(u=n,p=r.substr(7),c="$root.content()."+p.replace(new RegExp("\\.","g"),"().")):(u=i,p=a+r,c=r.replace(new RegExp("\\.","g"),"()."));if("undefined"==typeof t[u])throw"Cannot find model def for ["+u+"]";var g=p.indexOf("."),h=-1==g?p:p.substr(0,g);if(-1!=u.indexOf("-"))throw console.error("ERROR cannot use - for block names",u),"ERROR unexpected char in block name: "+u;if(-1!=h.indexOf("-"))throw console.error("ERROR cannot use - for property names",h),"ERROR unexpected char in property name: "+u;if(e)return"undefined"!=typeof t[u]._globalStyle&&"undefined"!=typeof t[u][h]&&"style"==t[u][h]._category&&(c+="._defaultComputed"),c;var v;if(e){if("undefined"!=typeof l)throw"Cannot use defaultValue in readonly mode!";if(s)throw"Cannot use overrideDefault in readonly mode for "+u+"/"+p+"/"+s+"!";if("undefined"!=typeof d)throw"Cannot set category for "+u+"/"+p+"/"+d+" in readonly mode!";v=_getModelDef(t,u,!1,!0)}else t[u]._writeable===!1&&console.log("TODO debug use cases for this condition",u,p),v=_getModelDef(t,u,t[u]._writeable===!1);if(null===v)throw"Unexpected model for ["+u+"]";if("undefined"==typeof v[h]){if(e)throw"Cannot find path "+h+" for "+u+"!";_modelCreateOrUpdateBlockDef(t,u,h),v=_getModelDef(t,u,!1)}"undefined"!=typeof t[u]._globalStyle&&"undefined"!=typeof t[u][h]&&null!==t[u][h]&&"style"==t[u][h]._category&&(c+="._defaultComputed");var y=v;try{if(_increaseUseCount(e,y),-1!=g){var k=p;do{var w=k.substr(0,g);if("undefined"==typeof y[w])throw"Found an unexpected prop "+w+" for model "+u+" for "+p;y=y[w],_increaseUseCount(e,y),k=k.substr(g+1),g=k.indexOf(".")}while(-1!=g);if("undefined"==typeof y[k]||null===y[k])throw"Found an unexpected path termination "+k+" for model "+u+" for "+p;y=y[k]}else y=y[p];if("undefined"==typeof y||null===y)throw"Unexpected null model for "+u+"/"+a+"/"+r;"undefined"!=typeof d&&(y._category=d),_increaseUseCount(e,y)}catch(_){throw console.error("TODO ERROR Property lookup exception",_,u,p,i,r,t),_}if("undefined"!=typeof t[u]._globalStyle&&"object"==typeof t[u][h]&&null!==t[u][h]&&"undefined"!=typeof t[u][h]._category&&"style"==t[u][h]._category){var x=modelEnsurePathAndGetBindValue.bind(void 0,e,t,o,n,i,""),$=-1!=p.indexOf(".")?p.substr(p.indexOf(".")):"";if(-1!=$.indexOf(".",1))throw"TODO unsupported object nesting! "+p;var S=t[u]._globalStyle+"."+h;"object"==typeof t[u][h]&&null!==t[u][h]&&"undefined"!=typeof t[u][h]._globalStyle&&(S=t[u][h]._globalStyle),ensureGlobalStyle(t,e,x,u,h,S,void 0,!1);var O=S+$;if("undefined"==typeof l&&null!==t[u]._defaultValues[p]&&(l=t[u]._defaultValues[p]),ensureGlobalStyle(t,e,x,u,p,O,l,s),"undefined"!=typeof l){if(e)throw console.error("Cannot set a new theme default value",O.substr(7),l,"while in readonly mode"),"Cannot set a new theme default value ("+l+") for "+O.substr(7)+" while in readonly mode!";o("default",O.substr(7),l)}l=null}if("undefined"!=typeof l)if("undefined"==typeof t[u]._defaultValues[p]||"undefined"!=typeof s&&s){if(e)throw"Cannot set new _defaultValues [1] for "+p+" in "+u+"!";t[u]._defaultValues[p]=l}else if(null===l){if(e&&null!==t[u]._defaultValues[p])throw"Cannot set new _defaultValues [2] for "+p+" in "+u+"!";t[u]._defaultValues[p]=null}else if(t[u]._defaultValues[p]!=l)throw console.error("TODO error!!! Trying to set a new default value for "+u+" "+p+" while it already exists (current: "+t[u]._defaultValues[p]+", new: "+l+")"),"Trying to set a new default value for "+u+" "+p+" while it already exists (current: "+t[u].defaultValues[p]+", new: "+l+")";return c},generateResultModel=function(e){var t=e._defs,o=e.templateName,n=_generateModel(t,o);return"undefined"!=typeof t.theme&&(n.theme=_generateModel(t,"theme")),n};module.exports={ensurePathAndGetBindValue:modelEnsurePathAndGetBindValue.bind(void 0,!1),getBindValue:modelEnsurePathAndGetBindValue.bind(void 0,!0),generateModel:_generateModel,generateResultModel:generateResultModel,getDef:_getDef,createOrUpdateBlockDef:_modelCreateOrUpdateBlockDef};
|
1448
|
+
|
1449
|
+
},{"./../../../bower_components/console-browserify/index.js":1,"./domutils.js":51}],55:[function(require,module,exports){
|
1450
|
+
(function (global){
|
1451
|
+
"use strict";function conditional_replace(e){return e.replace(/<!--\[if ([^\]]*)\]>((?:(?!--)[\s\S])*?)<!\[endif\]-->/g,function(e,t,o){var n="<!-- cc:start -->";n+=o.replace(/<([A-Za-z:]+)/g,"<!-- cc:bo:$1 --><cc").replace(/<\/([A-Za-z:]+)>/g,"<!-- cc:bc:$1 --></cc><!-- cc:ac:$1 -->").replace(/\/>/g,"/><!-- cc:sc -->"),n+="<!-- cc:end -->";var i='<replacedcc condition="'+t+'" style="display: none">';return i+=$("<div>").append($(n)).html().replace(/^<!-- cc:start -->/,"").replace(/<!-- cc:end -->$/,""),i+="</replacedcc>"})}var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),console=require("./../../../bower_components/console-browserify/index.js"),converterUtils=require("./utils.js"),elaborateDeclarations=require("./declarations.js"),processStylesheetRules=require("./stylesheet.js"),modelDef=require("./model.js"),domutils=require("./domutils.js"),wrapElementWithCondition=function(e,t,o){var n=domutils.getAttribute(t,e);try{var i=converterUtils.conditionBinding(n,o);$(t).before("<!-- ko if: "+i+" -->"),$(t).after("<!-- /ko -->"),domutils.removeAttribute(t,e)}catch(a){throw console.warn("Model ensure path failed in if/variant",t,n,e),a}},replacedAttributes=function(e,t){domutils.setAttribute(e,t,domutils.getAttribute(e,"replaced"+t))},processStyle=function(e,t,o,n){var i,a=domutils.getAttribute(e,"replacedstyle"),r=null;n&&(i={uniqueId:"$data",attr:{id:"id"}});var l=null!==domutils.getAttribute(e,"data-ko-display");r=elaborateDeclarations(a,void 0,t,o,e,i,l),null===r?r=a:domutils.removeAttribute(e,"replacedstyle"),null!==r&&(r.trim().length>0?domutils.setAttribute(e,"style",r):domutils.removeAttribute(e,"style"))},_fixRelativePath=function(e,t,o,n){var i=domutils.getAttribute(n,e),a=t(i);null!==a&&domutils.setAttribute(n,e,a)},processBlock=function(e,t,o,n,i,a,r,l,s,d){try{var u;if("block"==a)u=domutils.getAttribute(e,"data-ko-block"),domutils.removeAttribute(e,"data-ko-block");else{if("template"!=a)throw"Unexpected context name while processing block: "+a;u=r}$("[data-ko-remove]",e).remove();for(var c=$("[data-ko-block]",e).replaceWith("<replacedblock>"),p=["href","src","data-ko-placeholder-src","background"],f=0;f<p.length;f++){var b=_fixRelativePath.bind(void 0,p[f],i);$("["+p[f]+"]",e).each(b)}var m=domutils.getAttribute(e,"data-ko-properties");null===m&&(m=""),$("[data-ko-properties]",e).each(function(e,t){m.length>0&&(m+=" "),m+=domutils.getAttribute(t,"data-ko-properties"),domutils.removeAttribute(t,"data-ko-properties")}),modelDef.createOrUpdateBlockDef(t,u,m,{contextName:a});var g=modelDef.ensurePathAndGetBindValue.bind(void 0,t,o,r,u,"");"block"==a&&g("id",""),$("style",e).each(function(e,n){var a=domutils.getInnerHtml(n),l=modelDef.createOrUpdateBlockDef.bind(void 0,t),s=modelDef.ensurePathAndGetBindValue.bind(void 0,t,o,r),c=processStylesheetRules(a,void 0,s,l,o,i,r,u);if(c!=a)if(""!==c.trim()){var p=d(c);domutils.setAttribute(n,"data-bind","template: { name: '"+p+"' }"),domutils.setContent(n,"")}else domutils.removeElements($(n))}),processStyle(e,i,g,s);for(var h=["data-ko-display","data-ko-editable","data-ko-wrap","href"],v=0;v<h.length;v++){var k=domutils.getAttribute(e,h[v]);if(k)throw console.warn("ERROR: Unsupported "+h[v]+" used together with data-ko-block",e),"ERROR: Unsupported "+h[v]+" used together with data-ko-block"}return $("[data-ko-link]",e).each(function(e,t){var o=domutils.getAttribute(t,"data-ko-link"),n=domutils.getAttribute(t,"replacedstyle");("undefined"==typeof n||null===n)&&(n=""),n=""!==n?"-ko-attr-href: @"+o+"; "+n:"-ko-attr-href: @"+o,domutils.setAttribute(t,"replacedstyle",n),domutils.setAttribute(t,"data-ko-wrap",o),domutils.removeAttribute(t,"data-ko-link")}),$("[replacedstyle]",e).each(function(e,t){processStyle(t,i,g,!1)}),$("[replacedhttp-equiv]",e).each(function(e,t){replacedAttributes(t,"http-equiv")}),$("[data-ko-display]",e).each(function(e,t){wrapElementWithCondition("data-ko-display",t,g)}),$("[data-ko-editable]",e).each(function(e,t){var o,n,i,a,r,l,s=domutils.getAttribute(t,"data-ko-editable");if(s.lastIndexOf(".")>0){var u=s.substr(0,s.lastIndexOf("."));r=g(u)}else r=g(s);if(l="wysiwygClick: function(obj, evt) { $root.selectItem("+r+", $data); return false }, clickBubble: false, wysiwygCss: { selecteditem: $root.isSelectedItem("+r+") }, scrollIntoView: $root.isSelectedItem("+r+")","img"!=domutils.getLowerTagName(t)){n=domutils.getInnerHtml(t);var c=g(s,n,!0,"wysiwyg");if(o="",domutils.getAttribute(t,"id")||(o+="wysiwygId: id()+'_"+s.replace(".","_")+"', "),"undefined"!=typeof l&&(o+=l+", "),o+="wysiwygOrHtml: "+c,"td"==domutils.getLowerTagName(t)){var p=$('<div data-ko-wrap="false" style="width: 100%; height: 100%"></div>')[0];domutils.setAttribute(p,"data-bind",o);var f=domutils.getInnerHtml($("<div></div>").append(p));domutils.setContent(t,f)}else i=domutils.getAttribute(t,"data-bind"),a=(null!==i?i+", ":"")+o,domutils.setAttribute(t,"data-bind",a),domutils.setContent(t,"");domutils.removeAttribute(t,"data-ko-editable")}else{var b=domutils.getAttribute(t,"width");if(""===b&&(b=null),null===b)throw console.error("ERROR: data-ko-editable images must declare a WIDTH attribute!",t),"ERROR: data-ko-editable images must declare a WIDTH attribute!";var m=domutils.getAttribute(t,"height");""===m&&(m=null);var h=domutils.getAttribute(t,"align");i=domutils.getAttribute(t,"data-bind");var v=i&&i.match(/virtualAttr: {[^}]* height: ([^,}]*)[,}]/);v&&(m=v[1]);var k=i&&i.match(/virtualAttr: {[^}]* width: ([^,}]*)[,}]/);k&&(b=k[1]);var y;n=domutils.getAttribute(t,"data-ko-placeholder-src");var w="";n?w=domutils.getAttribute(t,"src"):n=domutils.getAttribute(t,"src");var x;b&&m?x=b+"+'x'+"+m:m?b||(x="'h'+"+m+"+''"):x="'w'+"+b+"+''";var _,C=m||domutils.getAttribute(t,"data-ko-placeholder-height"),O=b||domutils.getAttribute(t,"data-ko-placeholder-width");if(domutils.removeAttribute(t,"src"),domutils.removeAttribute(t,"data-ko-editable"),domutils.removeAttribute(t,"data-ko-placeholder-height"),domutils.removeAttribute(t,"data-ko-placeholder-width"),domutils.removeAttribute(t,"data-ko-placeholder-src"),n&&(_="{ width: "+O+", height: "+C+", text: "+x+"}"),!O||!C)throw console.error("IMG data-ko-editable must declare width and height attributes, or their placeholder counterparts data-ko-placeholder-width/data-ko-placeholder-height",t),"ERROR: IMG data-ko-editable MUST declare width and height attributes, or their placeholder counterparts data-ko-placeholder-width/data-ko-placeholder-height";var S=g(s,w,!1,"wysiwyg");o="wysiwygSrc: { width: "+b+", height: "+m+", src: "+S+", placeholder: "+_+" }",a=(null!==i?i+", ":"")+o,domutils.setAttribute(t,"data-bind",a);var T=d(t),A="{ width: "+b;"left"==h?A+=", float: 'left'":"right"==h?A+=", float: 'right'":"center"==h?console.log("non so cosa fa align=center su una img e quindi non so come simularne l'editing"):"top"==h?A+=", verticalAlign: 'top'":"middle"==h?A+=", verticalAlign: 'middle'":"bottom"==h&&(A+=", verticalAlign: 'bottom'"),A+="}",$(t).before("<!-- ko wysiwygImg: { _data: $data, _item: "+r+", _template: '"+T+"', _editTemplate: 'img-wysiwyg', _src: "+S+", _width: "+b+", _height: "+m+", _align: "+(null===h?void 0:"'"+h+"'")+", _size: "+x+", _method: "+y+", _placeholdersrc: "+_+", _stylebind: "+A+" } -->"),$(t).after("<!-- /ko -->")}}),$("[href]",e).each(function(e,t){var o=domutils.getAttribute(t,"href"),n="wysiwygHref: '"+converterUtils.addSlashes(o)+"'",i=domutils.getAttribute(t,"data-bind"),a=(null!==i?i+", ":"")+n;domutils.setAttribute(t,"data-bind",a)}),$("replacedblock",e).each(function(e,a){var s=c[e],p=processBlock(s,t,o,n,i,"block",u,l,!0,d),f=modelDef.ensurePathAndGetBindValue(t,o,r,u,"",p);$(a).before("<!-- ko block: { data: "+converterUtils.addSlashes(f)+", template: 'block' } -->"),$(a).after("<!-- /ko -->"),$(a).remove()}),$($("[data-ko-wrap]",e).get().reverse(),e).each(function(e,t){var o=domutils.getAttribute(t,"data-ko-wrap");if("undefined"==typeof o||""===o||"true"===o)throw"Unsupported empty value for data-ko-wrap: use false value if you want to always remove the tag";var n,i,a=converterUtils.conditionBinding(o,g),r=domutils.getAttribute(t,"data-bind");if(""!==r&&null!==r&&r.match(/(block|wysiwygOrHtml):/)){var l="<!-- ko "+r+" -->"+domutils.getInnerHtml(t)+"<!-- /ko -->";n=d(l),domutils.removeAttribute(t,"data-ko-wrap"),i=d(t),domutils.replaceHtml(t,"<!-- ko template: /* special */ (typeof templateMode != 'undefined' && templateMode == 'wysiwyg') || "+a+" ? '"+i+"' : '"+n+"' --><!-- /ko -->")}else n=d(domutils.getInnerHtml(t)),domutils.removeAttribute(t,"data-ko-wrap"),domutils.setContent(t,"<!-- ko template: '"+n+"' --><!-- /ko -->"),i=d(t),domutils.replaceHtml(t,"<!-- ko template: (typeof templateMode != 'undefined' && templateMode == 'wysiwyg') || "+a+" ? '"+i+"' : '"+n+"' --><!-- /ko -->")}),d(e,u,"show"),n(r,u,a,l),u}catch(y){throw console.error("Exception while parsing the template",y,e),y}},translateTemplate=function(e,t,o,n){var i={},a=conditional_replace(t.replace(/(<[^>]+\s)(style|http-equiv)(="[^"]*"[^>]*>)/gi,function(e,t,o,n){return t+"replaced"+o+n})),r=$(a),l=r[0],s=[],d=function(e,t,o,n){s.push({root:e,block:t,context:o,container:n})},u=function(e,t,o){if("undefined"==typeof i.themes&&(i.themes={}),"undefined"==typeof i.themes[e]&&(i.themes[e]={}),"undefined"==typeof i.themes[e][t]||null===i.themes[e][t])i.themes[e][t]=o;else if("undefined"!=typeof o&&null!==o){var n=i.themes[e][t];n!=o&&console.log("Error setting a new default for property "+t+" in theme "+e+". old:"+n+" new:"+o+"!")}},c=$("[data-ko-container]",r),p={};c.each(function(e,t){var o=domutils.getAttribute(t,"data-ko-container")+"Blocks";domutils.removeAttribute(t,"data-ko-container"),domutils.setAttribute(t,"data-bind","block: "+o);var n=$("> [data-ko-block]",t);domutils.removeElements(n,!0),p[o]=n}),modelDef.createOrUpdateBlockDef(i,"id"),modelDef.createOrUpdateBlockDef(i,"bodyTheme"),modelDef.createOrUpdateBlockDef(i,"blocks","blocks[]"),modelDef.createOrUpdateBlockDef(i,"text"),processBlock(l,i,u,d,o,"template",e,void 0,!1,n);var f=function(t,a,r){processBlock(r,i,u,d,o,"block",e,t,!0,n)};for(var b in p)if(p.hasOwnProperty(b)){var m=p[b],g=b;modelDef.ensurePathAndGetBindValue(i,u,e,e,"",g+".blocks","[]"),m.each(f.bind(void 0,g))}var h={_defs:i,templateName:e,_blocks:s};return"undefined"!=typeof i[e]._version&&(h.version=i[e]._version),h};module.exports=translateTemplate;
|
1452
|
+
|
1453
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1454
|
+
|
1455
|
+
},{"./../../../bower_components/console-browserify/index.js":1,"./declarations.js":50,"./domutils.js":51,"./model.js":54,"./stylesheet.js":56,"./utils.js":57}],56:[function(require,module,exports){
|
1456
|
+
"use strict";var cssParse=require("./../../../bower_components/mensch/lib/parser.js"),console=require("./../../../bower_components/console-browserify/index.js"),converterUtils=require("./utils.js"),elaborateDeclarations=require("./declarations.js"),_processStyleSheetRules_processBlockDef=function(e,t){for(var o,n,i,r=0;r<t.length;r++)if("rule"==t[r].type){for(var a=t[r].selectors,l=!1,s=!1,d=0;d<a.length;d++)a[d].match(/:preview$/)?s=!0:l=!0;if(s&&l)throw console.log("cannot mix selectors type (:preview and declarations) in @supports -ko-blockdefs ",a),"Cannot mix selectors type (:preview and declarations) in @supports -ko-blockdefs";if(!s&&!l)throw console.log("cannot find known selectors in @supports -ko-blockdefs ",a),"Cannot find known selectors in @supports -ko-blockdefs";if(l){o="",n={},i=t[r].declarations;for(var u=0;u<i.length;u++)"property"==i[u].type&&("label"==i[u].name?n.name=i[u].value:"context"==i[u].name?n.contextName=i[u].value:"properties"==i[u].name?o=i[u].value:"theme"==i[u].name?n.globalStyle="_theme_."+i[u].value:"themeOverride"==i[u].name?n.themeOverride="true"==String(i[u].value).toLowerCase():n[i[u].name]=i[u].value);for(var c=0;c<a.length;c++)e(a[c],o,n)}if(s)for(var f=0;f<a.length;f++){var p=a[f].substr(0,a[f].indexOf(":")),b=t[r].declarations;e(p,void 0,{previewBindings:b})}}},processStylesheetRules=function(e,t,o,n,i,r,a,l){var s=e,d=null;if("undefined"==typeof t){var u=cssParse(e,{comments:!0,position:!0});if("stylesheet"!=u.type||"undefined"==typeof u.stylesheet)throw console.log("unable to process styleSheet",u),"Unable to parse stylesheet";t=u.stylesheet.rules}for(var c,f=t.length-1;f>=0;f--){if("supports"==t[f].type&&"-ko-blockdefs"==t[f].name)_processStyleSheetRules_processBlockDef(n,t[f].rules),s=converterUtils.removeStyle(s,t[f].position.start,d,0,0,0,"");else if("media"==t[f].type||"supports"==t[f].type)s=processStylesheetRules(s,t[f].rules,o,n,i,r,a,l);else if("comment"==t[f].type);else if("rule"==t[f].type){for(var p=t[f].selectors,b="",m=null,g=0;g<p.length;g++){b.length>0&&(b+=", ");var h=p[g].match(/\[data-ko-block=([^ ]*)\]/);if(null!==h){if(null!==m&&m!=h[1])throw"Found multiple block-match attribute selectors: cannot translate it ("+m+" vs "+h[1]+")";m=h[1]}b+="<!-- ko text: templateMode =='wysiwyg' ? '#main-wysiwyg-area ' : '' --><!-- /ko -->"+p[g]}if(m){var v="<!-- ko foreach: $root.findObjectsOfType($data, '"+m+"') -->",y="<!-- /ko -->",k=d,w=" ";t[f].declarations.length>0&&(t[f].declarations[0].position.start.line!=t[f].position.end.line&&(w="\n"+new Array(t[f].position.start.col).join(" ")),k=t[f].declarations[t[f].declarations.length-1].position.end),null===k?s+=w+y:s=k==d?converterUtils.removeStyle(s,k,d,0,0,0,w+y):converterUtils.removeStyle(s,k,d,0,0,0,w+"}"+w+y),b=v+w+b.replace(new RegExp("\\[data-ko-block="+m+"\\]","g"),"<!-- ko text: '#'+id() -->"+m+"<!-- /ko -->"),n(m,"",{contextName:"block"})}var _=m?m:l;c=o.bind(this,_,"");var x=elaborateDeclarations(s,t[f].declarations,r,c);null!==x&&(s=x),s=converterUtils.removeStyle(s,t[f].position.start,t[f].position.end,0,0,0,b)}else console.log("Unknown rule type",t[f].type,"while parsing <style> rules");d=t[f].position.start}return s};module.exports=processStylesheetRules;
|
1457
|
+
|
1458
|
+
},{"./../../../bower_components/console-browserify/index.js":1,"./../../../bower_components/mensch/lib/parser.js":15,"./declarations.js":50,"./utils.js":57}],57:[function(require,module,exports){
|
1459
|
+
"use strict";var console=require("./../../../bower_components/console-browserify/index.js"),jsep=require("./../../../bower_components/jsep/src/jsep.js");jsep.addBinaryOp("or",1),jsep.addBinaryOp("and",2),jsep.addBinaryOp("eq",6),jsep.addBinaryOp("neq",6),jsep.addBinaryOp("lt",7),jsep.addBinaryOp("lte",7),jsep.addBinaryOp("gt",7),jsep.addBinaryOp("gte",7);var addSlashes=function(e){return e.replace(/[\\"']/g,"\\$&").replace(/\u0000/g,"\\0")},removeStyle=function(e,t,o,n,i,r,a){for(var l=e.split("\n"),s=i,d=r,u=1+n;u<t.line;u++)s+=l[u-1-n].length+1;if(s+=t.col,null!==o){for(var c=1+n;c<o.line;c++)d+=l[c-1-n].length+1;d+=o.col}else d+=e.length+1;var f=e.substr(0,s-1)+a+e.substr(d-1);return f},expressionGenerator=function(e,t,o){function n(e){switch(e){case"or":return"||";case"and":return"&&";case"lt":return"<";case"lte":return"<=";case"gt":return">";case"gte":return">=";case"eq":return"==";case"neq":return"!=";default:return e}}function i(e,t,o,r){if("undefined"==typeof o&&(o=!0),"undefined"!=typeof r&&"Identifier"!==e.type&&"MemberExpression"!==e.type&&console.log("Cannot apply default value to variable when using expressions"),"BinaryExpression"===e.type||"LogicalExpression"===e.type)return"("+i(e.left,t,o)+" "+n(e.operator)+" "+i(e.right,t,o)+")";if("CallExpression"===e.type){var a=e.arguments.map(function(e){return i(e,t,o)});return i(e.callee,t,o)+"("+a.join(", ")+")"}if("UnaryExpression"===e.type)return e.operator+i(e.argument,t,o);if("MemberExpression"==e.type&&e.computed)throw"Unexpected computed member expression";if("MemberExpression"!=e.type||e.computed){if("Literal"===e.type)return e.raw;if("Identifier"===e.type){var l=e.name;return o?t(l,r)+"()":l}if("ConditionalExpression"===e.type)return"("+i(e.test,t,o)+" ? "+i(e.consequent,t,o)+" : "+i(e.alternate,t,o)+")";throw"Compound"===e.type?"Syntax error in expression: operator expected after "+i(e.body[0],t,!1):"Found an unsupported expression type: "+e.type}var s=i(e.object,t,!1)+"."+i(e.property,t,!1);return o&&"Math"!==e.object.name&&"Color"!==e.object.name?t(s,r)+"()":s}return i(e,t,void 0,o)},expressionBinding=function(e,t,o){var n;if("undefined"!=typeof o&&null!==o){var i=e.trim().replace(/@\[([^\]]+)\]|@([a-zA-Z0-9\._]+)\b/g,"###var###");if(i=i.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),"###var###"==i)n=[null,o];else if(i="^"+i.replace(/###var###/g,"(.+)")+"$",n=o.trim().match(new RegExp(i)),!n)throw console.log("Cannot find matches",n,"for",o,e,i,e),"Cannot find default value for "+e+" in "+o}try{var r=0,a="'"+e.replace(/@\[([^\]]+)\]|@([a-zA-Z0-9\._]+)\b|(')/g,function(e,o,i,a){if(a)return"\\"+a;r++;var l,s=o||i;if(n&&("undefined"!=typeof n[r]?l=n[r].trim():console.log("ABZZZ Cannot find default value for",s,"in",n,"as",r)),o){var d=jsep(o),u=expressionGenerator(d,t,l);return"'+"+u+"+'"}return"'+"+t(s,l)+"()+'"})+"'";return a=a.replace(/(^|[^\\])''\+/g,"$1").replace(/\+''/g,""),0===r&&"false"!==a&&"true"!==a&&console.error("Unexpected expression with no valid @variable references",e),a}catch(l){throw"Exception parsing expression "+e+" "+l}},conditionBinding=function(e,t){var o=jsep(e),n=expressionGenerator(o,t);return n};module.exports={addSlashes:addSlashes,removeStyle:removeStyle,conditionBinding:conditionBinding,expressionBinding:expressionBinding};
|
1460
|
+
|
1461
|
+
},{"./../../../bower_components/console-browserify/index.js":1,"./../../../bower_components/jsep/src/jsep.js":3}],58:[function(require,module,exports){
|
1462
|
+
(function (global){
|
1463
|
+
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),kowrap=require("./../../../bower_components/knockout.wrap/knockout.wrap.js"),console=require("./../../../bower_components/console-browserify/index.js"),_getOptionsObject=function(e){for(var t=e.split("|"),o={},n=0;n<t.length;n++){var i=t[n].split("=");o[i[0]]=i.length>1?i[1]:i[0]}return o},_makeComputed=function(e,t,o,n,i,r){var a=ko.computed({read:function(){var o=e();if(null===o){var a=ko.utils.unwrapObservable(n);return"undefined"==typeof a||"custom"==a?ko.utils.unwrapObservable(t):r[a][i]}return o},write:function(a){var l,s=ko.utils.unwrapObservable(n);if(l="undefined"==typeof s||"custom"==s?ko.utils.peekObservable(t):r[s][i],o)a==l?e(null):e(a);else{var d=ko.utils.peekObservable(e);(a!=l||null!==d)&&e(a)}}});return a},_nextVariantFunction=function(e,t,o){for(var n,i=e.utils.unwrapObservable(t),r=0;r<o.length&&(n=e.utils.peekObservable(o[r]),n!=i);r++);r==o.length&&(console.warn("Didn't find a variant!",t,i,o),r=o.length-1);var a=r+1;a==o.length&&(a=0);var l=e.utils.peekObservable(o[a]);t(l)},_getVariants=function(e){var t,o=e._variant;if("object"!=typeof e[o]||"undefined"==typeof e[o]._widget||"string"!=typeof e[o]._options&&"boolean"!==e[o]._widget)throw console.error("Unexpected variant declaration",o,e[o]),"Unexpected variant declaration: cannot find property "+o+" or its _options string and it is not a boolean";return t="string"==typeof e[o]._options?Object.keys(_getOptionsObject(e[o]._options)):[!0,!1]},_makeComputedFunction=function(e,t,o,n,i,r,a){if("undefined"==typeof e){if("undefined"==typeof n.utils.unwrapObservable(a).type)throw console.log("TODO ERROR Found a non-typed def ",e,a),"Found a non-typed def "+e;var l=n.utils.unwrapObservable(n.utils.unwrapObservable(a).type);e=t[l],"object"!=typeof e&&console.log("TODO ERROR Found a non-object def ",e,"for",l)}"undefined"==typeof i&&"undefined"!=typeof r&&r&&(i=a);var s="$root.content().",d=e._globalStyles;if("undefined"!=typeof d)for(var u in d)if(d.hasOwnProperty(u)){var c,p,f,b="$root.content().theme().scheme";if(d[u].substr(0,s.length)!=s)throw"UNEXPECTED globalStyle path ("+d[u]+") outside selfPath ("+s+")";f=d[u].substr(s.length),p=i,b.substr(0,s.length)==s?c=b.substr(s.length):(console.log("IS THIS CORRECT?",b,s),c=b);for(var m=p,g=f.split("()."),h="",v=!0,k=0;k<g.length;k++)p=n.utils.unwrapObservable(p)[g[k]],v?"theme"==g[k]&&(v=!1):(h.length>0&&(h+="."),h+=g[k]);for(var y=c.split("()."),w=0;w<y.length;w++)m=n.utils.unwrapObservable(m)[y[w]];for(var x=!0,_=u.split("."),$=a,C=0;C<_.length;C++)$=n.utils.unwrapObservable($)[_[C]];if(!n.isObservable($))throw"Unexpected non observable target "+u+"/"+h;$._defaultComputed=_makeComputed($,p,x,m,h,o)}if("undefined"!=typeof e._variant){for(var O=e._variant.split("."),S=a,T=n.utils.unwrapObservable(a),E=0;E<O.length;E++)S=n.utils.unwrapObservable(S)[O[E]];if("undefined"!=typeof S._defaultComputed&&(console.log("Found variant on a style property: beware variants should be only used on content properties because they don't match the theme fallback behaviour",e._variant),S=S._defaultComputed),"undefined"==typeof S)throw console.log("ERROR looking for variant target",e._variant,a),"ERROR looking for variant target "+e._variant;T._nextVariant=_nextVariantFunction.bind(S,n,S,_getVariants(e))}for(var H in e)if(e.hasOwnProperty(H)){var M=e[H];if("object"==typeof M&&null!==M&&"undefined"!=typeof M._context&&"block"==M._context){var q=i[H](),A=_makeComputedFunction(t[H],t,o,n,i,r,q);a[H](A)}else if("object"==typeof M&&null!==M&&"blocks"==M.type){for(var D,I,P,B=i[H](),j=B.blocks(),F=0;F<j.length;F++)D=n.utils.unwrapObservable(j[F]),I=n.utils.unwrapObservable(D.type),P=_makeComputedFunction(t[I],t,o,n,i,r,D),j[F](P);var R=B.blocks;_augmentBlocksObservable(R,_blockInstrumentFunction.bind(B,void 0,t,o,n,void 0,i,r)),i[H]._wrap=_makeBlocksWrap.bind(i[H],R._instrumentBlock),i[H]._unwrap=_unwrap.bind(i[H])}}return a},_augmentBlocksObservable=function(e,t){e._instrumentBlock=t,"undefined"==typeof e.origPush&&(e.origPush=e.push,e.push=_makePush.bind(e),e.origSplice=e.splice,e.splice=_makeSplice.bind(e))},_makeBlocksWrap=function(e,t){var o=ko.toJS(t),n=o.blocks;o.blocks=[];var i=kowrap.fromJS(o,void 0,!0)();_augmentBlocksObservable(i.blocks,e);for(var r=0;r<n.length;r++){var a=ko.toJS(n[r]);a.id="block_"+r,i.blocks.push(a)}this(i)},_makePush=function(){if(arguments.length>1)throw"Array push with multiple arguments not implemented";if(arguments.length>0&&ko.isObservable(arguments[0])&&("function"==typeof arguments[0]._unwrap?arguments[0]=arguments[0]._unwrap():console.log("WARN: pushing observable with no _unwrap function (TODO remove me, expected condition)")),ko.isObservable(arguments[0]))return this.origPush.apply(this,arguments);var e=this._instrumentBlock(arguments[0]);return this.origPush.apply(this,[e])},_makeSplice=function(){if(arguments.length>3)throw"Array splice with multiple objects not implemented";if(arguments.length>2&&ko.isObservable(arguments[2])&&("function"==typeof arguments[2]._unwrap?arguments[2]=arguments[2]._unwrap():console.log("WARN: splicing observable with no _unwrap function (TODO remove me, expected condition)")),arguments.length>2&&!ko.isObservable(arguments[2])){var e=this._instrumentBlock(arguments[2]);return this.origSplice.apply(this,[arguments[0],arguments[1],e])}return this.origSplice.apply(this,arguments)},_blockInstrumentFunction=function(e,t,o,n,i,r,a,l){"undefined"==typeof i&&(i=l);var s;s={"":_makeComputedFunction.bind(i,e,t,o,n,r,a)};var d=kowrap.fromJS(i,s,!0);return d._unwrap=_unwrap.bind(d),d},_wrap=function(e,t){var o=ko.utils.unwrapObservable(e(ko,t,void 0,!0));this(o)},_unwrap=function(){return ko.toJS(this)},_modelInstrument=function(e,t,o){var n=_blockInstrumentFunction.bind(void 0,t,o,o.themes),i=n(ko,e,void 0,!0);return i._wrap=_wrap.bind(i,n),i._unwrap=_unwrap.bind(i),i};module.exports=_modelInstrument;
|
1464
|
+
|
1465
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1466
|
+
|
1467
|
+
},{"./../../../bower_components/console-browserify/index.js":1,"./../../../bower_components/knockout.wrap/knockout.wrap.js":10}],59:[function(require,module,exports){
|
1468
|
+
(function (global){
|
1469
|
+
function Color(e){this.getBrightness=function(t){return e(t).getBrightness()},this.isLight=function(t){return e(t).isLight()},this.isDark=function(t){return e(t).isDark()},this.getLuminance=function(t){return e(t).getLuminance()},this.lighten=function(t,o){return e(t).lighten(o).toHexString()},this.brighten=function(t,o){return e(t).brighten(o).toHexString()},this.darken=function(t,o){return e(t).darken(o).toHexString()},this.desaturate=function(t,o){return e(t).desaturate(o).toHexString()},this.saturate=function(t,o){return e(t).saturate(o).toHexString()},this.greyscale=function(t){return e(t).greyscale().toHexString()},this.spin=function(t,o){return e(t).spin(o).toHexString()},this.complement=function(t){return e(t).complement().toHexString()},this.mix=e.mix,this.readability=e.readability,this.isReadable=e.isReadable,this.mostReadable=e.mostReadable}var tinycolor=require("./../../../bower_components/tinycolor/tinycolor.js"),colorPlugin=function(){global.Color=new Color(tinycolor)};module.exports=colorPlugin;
|
1470
|
+
|
1471
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1472
|
+
|
1473
|
+
},{"./../../../bower_components/tinycolor/tinycolor.js":18}],60:[function(require,module,exports){
|
1474
|
+
(function (global){
|
1475
|
+
"use strict";var console=require("./../../../bower_components/console-browserify/index.js"),$=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),inlineDocument=require("./../../../bower_components/juice/lib/inline")({}).inlineDocument,inlinerPlugin=function(e){e.inline=function(e){$("[style]:not([replacedstyle])",e).each(function(e,t){var o=$(t);o.attr("replacedstyle",o.attr("style"))});var t=[];$('style[data-inline="true"]',e).each(function(e,o){var a=$(o).html();a=a.replace(/<!-- ko ((?!--).)*? -->/g,""),a=a.replace(/<!-- \/ko -->/g,""),t.push(a),$(o).removeAttr("data-inline")});var o=t.join("\n"),a=function(t,o){return"undefined"==typeof o&&(o=e),$(t,o)};a.root=function(){return $(":root",e)},inlineDocument(a,o,{styleAttributeName:"replacedstyle"})}};module.exports=inlinerPlugin;
|
1476
|
+
|
1477
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1478
|
+
|
1479
|
+
},{"./../../../bower_components/console-browserify/index.js":1,"./../../../bower_components/juice/lib/inline":4}],61:[function(require,module,exports){
|
1480
|
+
(function (global){
|
1481
|
+
"use strict";var console=require("./../../../bower_components/console-browserify/index.js"),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),$=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),lsLoader=function(e,t){var o=global.localStorage.getItem("metadata-"+e);if(null!==o){var a,i=global.localStorage.getItem("template-"+e);null!==i&&(a=JSON.parse(i));var l=JSON.parse(o);return{metadata:l,model:a,extension:lsCommandPluginFactory(l,t)}}throw"Cannot find stored data for "+e},lsCommandPluginFactory=function(e,t){var o=function(e,o,a){var i={name:"Save",enabled:ko.observable(!0)};i.execute=function(){i.enabled(!1),a.metadata.changed=Date.now(),"undefined"==typeof a.metadata.key&&(console.warn("Unable to find ket in metadata object...",a.metadata),a.metadata.key=e),global.localStorage.setItem("metadata-"+e,a.exportMetadata()),global.localStorage.setItem("template-"+e,a.exportJSON()),i.enabled(!0)};var l={name:"Test",enabled:ko.observable(!0)},n={name:"Download",enabled:ko.observable(!0)};l.execute=function(){l.enabled(!1);var i=global.localStorage.getItem("testemail");if((null===i||"null"==i)&&(i=a.t("Insert here the recipient email address")),i=global.prompt(a.t("Test email address"),i),i.match(/@/)){global.localStorage.setItem("testemail",i),console.log("TODO testing...",i);var n=t?t:"/dl/",r=$.post(n,{action:"email",rcpt:i,subject:"[test] "+e+" - "+o,html:a.exportHTML()},null,"html");r.fail(function(){console.log("fail",arguments),a.notifier.error(a.t("Unexpected error talking to server: contact us!"))}),r.success(function(){console.log("success",arguments),a.notifier.success(a.t("Test email sent..."))}),r.always(function(){l.enabled(!0)})}else global.alert(a.t("Invalid email address")),l.enabled(!0)},n.execute=function(){n.enabled(!1),a.notifier.info(a.t("Downloading...")),a.exportHTMLtoTextarea("#downloadHtmlTextarea");var e=t?t:"/dl/";global.document.getElementById("downloadForm").setAttribute("action",e),global.document.getElementById("downloadForm").submit(),n.enabled(!0)},a.save=i,a.test=l,a.download=n}.bind(void 0,e.key,e.name);return o};module.exports=lsLoader;
|
1482
|
+
|
1483
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1484
|
+
|
1485
|
+
},{"./../../../bower_components/console-browserify/index.js":1}],62:[function(require,module,exports){
|
1486
|
+
"use strict";require("./../../bower_components/knockout-sortable/build/knockout-sortable.min.js"),require("./bindings/jqueryui-spinner.js"),require("./bindings/jqueryui-tabs.js"),require("./bindings/colorpicker.js"),require("./bindings/blocks.js"),require("./bindings/csstext.js"),require("./bindings/bind-iframe.js"),require("./bindings/droppable.js"),require("./bindings/fileupload.js"),require("./bindings/virtuals.js"),require("./bindings/wysiwygs.js"),require("./bindings/scrollfix.js"),require("./bindings/if-subs.js"),require("./bindings/extsortables.js"),require("./bindings/eventable.js"),require("./bindings/tooltips.js"),require("./bindings/extender-pagination.js"),require("./bindings/validated-value.js"),require("./bindings/scrollintoview.js");
|
1487
|
+
|
1488
|
+
},{"./../../bower_components/knockout-sortable/build/knockout-sortable.min.js":8,"./bindings/bind-iframe.js":28,"./bindings/blocks.js":29,"./bindings/colorpicker.js":31,"./bindings/csstext.js":32,"./bindings/droppable.js":33,"./bindings/eventable.js":34,"./bindings/extender-pagination.js":35,"./bindings/extsortables.js":36,"./bindings/fileupload.js":37,"./bindings/if-subs.js":38,"./bindings/jqueryui-spinner.js":39,"./bindings/jqueryui-tabs.js":40,"./bindings/scrollfix.js":42,"./bindings/scrollintoview.js":43,"./bindings/tooltips.js":45,"./bindings/validated-value.js":46,"./bindings/virtuals.js":47,"./bindings/wysiwygs.js":48}],63:[function(require,module,exports){
|
1489
|
+
(function (global){
|
1490
|
+
"use strict";function _viewModelPluginInstance(e){var t;return{viewModel:function(o){t=e(o)},init:function(){"undefined"!=typeof t&&"undefined"!=typeof t.init&&t.init()},dispose:function(){"undefined"!=typeof t&&"undefined"!=typeof t.dispose&&t.dispose()}}}var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),kojqui=(typeof window !== "undefined" ? window['kojqui'] : typeof global !== "undefined" ? global['kojqui'] : null),templateConverter=require("./converter/main.js"),console=require("./../../bower_components/console-browserify/index.js"),initializeViewmodel=require("./viewmodel.js"),templateSystem=require("./bindings/choose-template.js"),pluginsCall=function(e,t,o,a){var i,l,d,r,n;n=[],"undefined"!=typeof a&&a?(i=e.length-1,l=0,d=-1):(i=0,l=e.length-1,d=1);for(var s=i;s!=l+d;s+=d)"undefined"!=typeof e[s][t]&&(r=e[s][t].apply(e[s],o),"undefined"!=typeof r&&n.push(r));return n},origDisposeCallback=ko.utils.domNodeDisposal.addDisposeCallback;ko.utils.domNodeDisposal.addDisposeCallback=function(e,t){var o=function(e){try{t(e)}catch(o){console.warn("Caught unexpected dispose callback exception",o)}};origDisposeCallback(e,o)};var bindingPluginMaker=function(e){return{viewModel:function(t){try{e("applyBindings",ko.applyBindings.bind(void 0,t))}catch(o){throw console.warn(o,o.stack),o}},dispose:function(){try{e("unapplyBindings",ko.cleanNode.bind(this,global.document.body))}catch(t){throw console.warn(t,t.stack),t}}}},templateCreator=function(e,t,o,a){var i=o;for("undefined"!=typeof o&&"undefined"!=typeof a&&("object"!=typeof t||"replacedhtml"!=t.tagName.toLowerCase())&&(i+="-"+a);"undefined"==typeof i||null===i||e.exists(i);)i="anonymous-"+Math.floor(1e5*Math.random()+1);if("object"==typeof t&&"replacedhtml"==t.tagName.toLowerCase()){var l=$(t),d=$("replacedhead",l),r=$("replacedbody",l);e.adder(i+"-head",d.html()||""),e.adder(i+"-show",r.html()||""),e.adder(i+"-preview",l.html()),e.adder(i+"-wysiwyg",l.html()),d.children().detach(),d.html("<!-- ko block: content --><!-- /ko -->"),d.before("<!-- ko withProperties: { templateMode: 'head' } -->"),d.after("<!-- /ko -->"),r.html("<!-- ko block: content --><!-- /ko -->"),e.adder(i+"-iframe",l[0].outerHTML)}else"object"==typeof t?e.adder(i,t.outerHTML):e.adder(i,t);return i},_templateUrlConverter=function(e,t){return t.match(/^[^\/]*:/)||t.match(/^\//)||t.match(/^\[/)||t.match(/^#?$/)?null:e+t},templateLoader=function(e,t,o,a,i,l){var d="string"==typeof t?t:o.template,r="./",n=d.lastIndexOf("/");-1!=n&&(r=d.substr(0,n+1));var s,c=_templateUrlConverter.bind(void 0,r);s="undefined"==typeof o?{template:d,name:"No name",created:Date.now()}:o,$.get(d,function(t){var o=templateCompiler(e,c,"template",t,a,s,i,l);o.init()})},templateCompiler=function(e,t,o,a,i,l,d,r){var n=a.match(/^([\S\s]*)([<]html[^>]*>[\S\s]*<\/html>)([\S\s]*)$/i);if(null===n)throw"Unable to find <html> opening and closing tags in the template";var s=n[1],c={"<html":0,"<head":0,"<body":0,"</html":0,"</body":0,"</head":0},p=n[2].replace(/(<\/?)(html|head|body)([^>]*>)/gi,function(e,t,o,a){return c[(t+o).toLowerCase()]+=1,t+"replaced"+o+a});for(var m in c)if(c.hasOwnProperty(m)&&1!=c[m]){if(0===c[m])throw"ERROR: missing mandatory element "+m+">";if(c[m]>1)throw"ERROR: multiple element "+m+"> occourences are not supported (found "+c[m]+" occourences)"}var b=n[3],u=[],f="+$root.contentListeners()",h=[];if("undefined"!=typeof d)for(var g=0;g<d.length;g++)"function"==typeof d[g]?h.push(_viewModelPluginInstance(d[g])):h.push(d[g]);var v=[],y={adder:function(e,t){if("string"!=typeof t)throw"Template system: cannot create new template "+e;var o=t.match(/(data)?-ko-[^ =:]*/g);o&&console.error("ERROR: found unexpected -ko- attribute in compiled template",e,", you probably mispelled it:",o),templateSystem.addTemplate(e,t),v.push(e)},exists:function(e){var t=templateSystem.getTemplateContent(e);return"undefined"!=typeof t?!0:!1},dispose:function(){for(var e=v.length-1;e>=0;e--)templateSystem.removeTemplate(v[e])}};ko.bindingHandlers.block.templateExists=y.exists;for(var k=templateCreator.bind(void 0,y),w=e("translateTemplate",templateConverter.translateTemplate.bind(void 0,o,p,t,k)),x=e("generateModel",templateConverter.wrappedResultModel.bind(void 0,w)),S={},C=pluginsCall(h,"widget",[$,ko,kojqui]),B=0;B<C.length;B++)S[C[B].widget]=C[B];u.push.apply(u,e("generateEditors",templateConverter.generateEditors.bind(void 0,w,S,t,k,f)));var _=!1;if("undefined"!=typeof i&&null!==i){var T;T="string"==typeof i?ko.utils.parseJson(i):i;var M=e("checkModel",templateConverter.checkModel.bind(void 0,x._unwrap(),u,T));2==M&&(console.error("Trying to compile an incompatible template version!",x._unwrap(),u,T),_=!0);try{x._wrap(T)}catch(D){console.error("Unable to inject model content!",D),_=!0}}var L=s+templateSystem.getTemplateContent(o+"-iframe").replace(/(<\/?)replaced(html|head|body)([^>]*>)/gi,function(e,t,o,a){return t+o+a})+b,F=ko.bindingHandlers.bindIframe.tpl;ko.bindingHandlers.bindIframe.tpl=L;var P={dispose:function(){ko.bindingHandlers.bindIframe.tpl=F}};h.push(P),h.push(y);var E=e("initializeViewmodel",initializeViewmodel.bind(this,x,u,t,r));E.metadata=l;var I="0.16.0";return"undefined"!=typeof E.metadata.editorversion&&E.metadata.editorversion!==I&&console.warn("The model being loaded has been created with an older editor version",E.metadata.editorversion,"vs",I),E.metadata.editorversion=I,"undefined"!=typeof w.version&&("undefined"!=typeof E.metadata.templateversion&&E.metadata.templateversion!==w.version&&console.error("The model being loaded has been created with a different template version",w.version,"vs",E.metadata.templateversion),E.metadata.templateversion=w.version),templateSystem.init(),h.push(bindingPluginMaker(e)),pluginsCall(h,"viewModel",[E]),_&&$("#incompatible-template").dialog({modal:!0,appendTo:"#mo-body",buttons:{Ok:function(){$(this).dialog("close")}}}),{model:E,init:function(){pluginsCall(h,"init",void 0,!0)},dispose:function(){pluginsCall(h,"dispose",void 0,!0)}}},checkFeature=function(e,t){if(!t())throw console.warn("Missing feature",e),"Missing feature "+e},isCompatible=function(){try{return checkFeature("matchMedia",function(){return"undefined"!=typeof global.matchMedia}),checkFeature("XMLHttpRequest 2",function(){return"XMLHttpRequest"in global&&"withCredentials"in new global.XMLHttpRequest}),checkFeature("ES5 strict",function(){return function(){return"undefined"==typeof this}()}),checkFeature("CSS borderRadius",function(){return"undefined"!=typeof global.document.body.style.borderRadius}),checkFeature("CSS boxShadow",function(){return"undefined"!=typeof global.document.body.style.boxShadow}),checkFeature("CSS boxSizing",function(){return"undefined"!=typeof global.document.body.style.boxSizing}),checkFeature("CSS backgroundSize",function(){return"undefined"!=typeof global.document.body.style.backgroundSize}),checkFeature("CSS backgroundOrigin",function(){return"undefined"!=typeof global.document.body.style.backgroundOrigin}),checkBadBrowserExtensions(),!0}catch(e){return!1}},checkBadBrowserExtensions=function(){var e="checkbadbrowsersframe",t=ko.bindingHandlers.bindIframe.tpl;ko.bindingHandlers.bindIframe.tpl='<!DOCTYPE html>\r\n<html>\r\n<head><title>A</title>\r\n</head>\r\n<body><p style="color: blue" align="right" data-bind="style: { color: \'red\' }">B</p><div data-bind="text: content"></div></body>\r\n</html>\r\n',$("body").append('<iframe id="'+e+'" data-bind="bindIframe: $data"></iframe>');var o=global.document.getElementById(e);ko.applyBindings({content:"dummy content"},o);var a=o.contentWindow.document.doctype,i="<!DOCTYPE "+a.name+(a.publicId?' PUBLIC "'+a.publicId+'"':"")+(!a.publicId&&a.systemId?" SYSTEM":"")+(a.systemId?' "'+a.systemId+'"':"")+">",l=i+"\n"+o.contentWindow.document.documentElement.outerHTML;ko.cleanNode(o),ko.removeNode(o),ko.bindingHandlers.bindIframe.tpl=t;var d='<!DOCTYPE html>\n<html><head><title>A</title>\n</head>\n<body><p align="right" style="color: red;" data-bind="style: { color: \'red\' }">B</p><div data-bind="text: content">dummy content</div>\n\n</body></html>',r='<!DOCTYPE html>\n<html><head><title>A</title>\n</head>\n<body><p style="color: red;" data-bind="style: { color: \'red\' }" align="right">B</p><div data-bind="text: content">dummy content</div>\n\n</body></html>',n='<!DOCTYPE html>\n<html><head><title>A</title>\n</head>\n<body><p style="color: red;" align="right" data-bind="style: { color: \'red\' }">B</p><div data-bind="text: content">dummy content</div>\n\n</body></html>';if(d!==l&&r!==l&&n!==l)throw console.info("BadBrowser.FrameContentCheck",l.length,d.length,r.length,n.length,l==d,l==r,l==n),console.info(l),"Unexpected frame content. Misbehaving browser: "+l.length+"/"+d.length+"/"+r.length+"/"+n.length},fixPageEvents=function(){global.addEventListener&&(global.addEventListener("drag",function(e){e=e||global.event,e.preventDefault()},!1),global.addEventListener("dragstart",function(e){e=e||global.event,e.preventDefault()},!1),global.addEventListener("dragover",function(e){e=e||global.event,e.preventDefault()},!1),global.addEventListener("drop",function(e){e=e||global.event,e.preventDefault()},!1),global.document.body.addEventListener("drop",function(e){e.preventDefault()},!1)),global.document.ondragstart&&(global.document.ondragstart=function(){return!1})};module.exports={compile:templateCompiler,load:templateLoader,isCompatible:isCompatible,fixPageEvents:fixPageEvents};
|
1491
|
+
|
1492
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1493
|
+
|
1494
|
+
},{"./../../bower_components/console-browserify/index.js":1,"./bindings/choose-template.js":30,"./converter/main.js":53,"./viewmodel.js":67}],64:[function(require,module,exports){
|
1495
|
+
"use strict";var console=require("./../../bower_components/console-browserify/index.js"),_call=function(e){return e()},logs=[],_timedCall=function(e,t){var o,a=(new Date).getTime();"object"==typeof console&&console.time&&console.time(e),o=_call(t),"object"==typeof console&&console.time&&console.timeEnd(e);var i=(new Date).getTime()-a;return"object"!=typeof console||console.time||console.log(e,"took",i,"ms"),logs.push({name:e,time:i}),logs.length>100&&logs.unshift(),o};module.exports={timedCall:_timedCall,logs:logs};
|
1496
|
+
|
1497
|
+
},{"./../../bower_components/console-browserify/index.js":1}],65:[function(require,module,exports){
|
1498
|
+
(function (global){
|
1499
|
+
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),undoManager=require("./../../../bower_components/knockout-undomanager/knockout-undomanager.js"),undoserializer=require("./undoserializer.js"),addUndoStackExtensionMaker=function(e){return function(t){t.contentListeners(t.contentListeners()+2);var o=undoManager(t.content,{levels:100,undoLabel:ko.computed(function(){return t.t("Undo (#COUNT#)")}),redoLabel:ko.computed(function(){return t.t("Redo")})});return t.undo=o.undoCommand,t.undo.execute=e.bind(t,"undo",t.undo.execute),t.redo=o.redoCommand,t.redo.execute=e.bind(t,"redo",t.redo.execute),t.undoReset=e.bind(t,"undoReset",o.reset),t.setUndoModeMerge=o.setModeMerge,t.setUndoModeOnce=o.setModeOnce,o.setModeIgnore(),o.setUndoActionMaker(undoserializer.makeUndoAction.bind(void 0,t.content)),undoserializer.watchEnabled(!0),{pause:function(){o.setModeIgnore()},run:function(){o.setModeOnce()},init:function(){o.setModeOnce()},dispose:function(){t.contentListeners(t.contentListeners()-2),undoserializer.watchEnabled(!1),o.dispose()}}}};module.exports=addUndoStackExtensionMaker;
|
1500
|
+
|
1501
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1502
|
+
|
1503
|
+
},{"./../../../bower_components/knockout-undomanager/knockout-undomanager.js":9,"./undoserializer.js":66}],66:[function(require,module,exports){
|
1504
|
+
(function (global){
|
1505
|
+
"use strict";var ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require("./../../../bower_components/console-browserify/index.js"),_reference=function(e,t){for(var o,n,i=0,a=e;i<t.length;)switch(t.charAt(i)){case"(":")"==t.charAt(i+1)&&(a=a()),i+=2;break;case"[":n=t.indexOf("]",i),a=a[t.substring(i+1,n)],i=n+1;break;case".":o=t.indexOf("(",i),-1==o&&(o=t.length),n=t.indexOf("[",i),-1==n&&(n=t.length),n=Math.min(o,n),a=a[t.substring(i+1,n)],i=n}return a},_getPath=function(e,t){for(var o,n="",i=0;i<=e.length;i++)if(o=i<e.length?e[i]:t,ko.isObservable(o)&&(n+="()"),"undefined"!=typeof o._fieldName)n+="."+o._fieldName;else{if(!(i>0&&"function"==typeof e[i-1].pop))throw console.error("Unexpected parent with no _fieldName and no parent array",i,e),"Unexpected parent with no _fieldName and no parent array";var a=ko.isObservable(e[i-1])?ko.utils.peekObservable(e[i-1]):e[i-1],r=ko.utils.arrayIndexOf(a,o);if(-1==r)throw console.error("Unexpected object not found in parent array",a,o,i,e.length,ko.toJS(a),ko.utils.unwrapObservable(o)),"Unexpected object not found in parent array";n+="["+r+"]"}return n},makeDereferencedUndoAction=function(e,t,o,n,i){var a=_reference(t,o);e(a,n,i)},listener,_setListener=function(e){listener=e},makeUndoActionDereferenced=function(e,t,o,n,i,a){try{var r=_getPath(o,n);if(("object"==typeof i||"function"==typeof i)&&(i=ko.toJS(i)),"undefined"!=typeof a&&("object"==typeof a.value||"function"==typeof a.value)){var l=ko.toJS(a);a=l}if("undefined"!=typeof listener)try{listener(r,n,i,a)}catch(s){console.log("Undoserializer ignoring exception in listener callback")}return makeDereferencedUndoAction.bind(void 0,t,e,r,i,a)}catch(s){console.error("Exception processing undo",s,o,n,a)}},watchEnabled,_watchEnabled=function(e){return"undefined"==typeof e?watchEnabled:(watchEnabled=e,void 0)};module.exports={dereference:_getPath,reference:_reference,makeUndoAction:makeUndoActionDereferenced,setListener:_setListener,watchEnabled:_watchEnabled};
|
1506
|
+
|
1507
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1508
|
+
|
1509
|
+
},{"./../../../bower_components/console-browserify/index.js":1}],67:[function(require,module,exports){
|
1510
|
+
(function (global){
|
1511
|
+
"use strict";function initializeEditor(e,t,o,a){function i(e){return e.replace(/<replacedcc[^>]* condition="([^"]*)"[^>]*>([\s\S]*?)<\/replacedcc>/g,function(e,t,o){var a="<!--[if "+t.replace(/&/,"&")+"]>";return a+=o.replace(/<!-- cc:bc:([A-Za-z:]*) -->(<\/cc>)?<!-- cc:ac:\1 -->/g,"</$1>").replace(/><\/cc><!-- cc:sc -->/g,"/>").replace(/<!-- cc:bo:([A-Za-z:]*) --><cc/g,"<$1").replace(/^.*<!-- cc:start -->/,"").replace(/<!-- cc:end -->.*$/,""),a+="<![endif]-->"})}var l={galleryRecent:ko.observableArray([]).extend({paging:16}),galleryRemote:ko.observableArray([]).extend({paging:16}),selectedBlock:ko.observable(null),selectedItem:ko.observable(null),selectedTool:ko.observable(0),selectedImageTab:ko.observable(0),dragging:ko.observable(!1),draggingImage:ko.observable(!1),galleryLoaded:ko.observable(!1),showPreviewFrame:ko.observable(!1),previewMode:ko.observable("mobile"),showToolbox:ko.observable(!0),showTheme:ko.observable(!1),showGallery:ko.observable(!1),debug:ko.observable(!1),contentListeners:ko.observable(0),logoPath:"dist/img/mosaico32.png",logoUrl:".",logoAlt:"mosaico"};return l.content=e,l.blockDefs=t,l.notifier=toastr,l.tt=function(e,t){if("undefined"!=typeof t)for(var o in t)t.hasOwnProperty(o)&&(e=e.replace(new RegExp("__"+o+"__","g"),t[o]));return e},l.t=l.tt,l.ut=function(e,t){return t},l.templatePath=o,l.remoteUrlProcessor=function(e){return e},l.remoteFileProcessor=function(e){return"undefined"!=typeof e.url&&(e.url=l.remoteUrlProcessor(e.url)),"undefined"!=typeof e.thumbnailUrl&&(e.thumbnailUrl=l.remoteUrlProcessor(e.thumbnailUrl)),e},l.loadGallery=function(){l.galleryLoaded("loading");var e=a?a:"/upload/";$.getJSON(e,function(e){for(var t=0;t<e.files.length;t++)e.files[t]=l.remoteFileProcessor(e.files[t]);l.galleryLoaded(e.files.length),l.galleryRemote(e.files.reverse())}).fail(function(){l.galleryLoaded(!1),l.notifier.error(l.t("Unexpected error listing files"))})},l.fileToImage=function(e){return e.url},l.removeBlock=function(e,t){ko.utils.unwrapObservable(l.selectedBlock)==ko.utils.unwrapObservable(e)&&l.selectBlock(null,!0);var o=t.blocks.remove(e);return l.notifier.info(l.t("Block removed: use undo button to restore it...")),o},l.duplicateBlock=function(e,t){var o=ko.utils.unwrapObservable(e),a=ko.toJS(ko.utils.unwrapObservable(t.blocks)[o]);"undefined"!=typeof a.id&&(a.id=""),t.blocks.splice(o+1,0,a)},l.moveBlock=function(e,t,o){var a=ko.utils.unwrapObservable(e),i=ko.utils.unwrapObservable(t.blocks);if(o&&a>0||!o&&a<i.length-1){var n=a+(o?-1:1),r=i[n];l.startMultiple(),t.blocks.splice(n,1),t.blocks.splice(a,0,r),l.stopMultiple()}},l.loadDefaultBlocks=function(){var e=ko.toJS(l.content().mainBlocks);e.blocks=[];for(var t=ko.utils.unwrapObservable(l.blockDefs),o=0;o<t.length;o++){var a=ko.toJS(t[o]);a.id="block_"+o,e.blocks.push(a)}performanceAwareCaller("setMainBlocks",l.content().mainBlocks._wrap.bind(l.content().mainBlocks,e))},l.addImage=function(e){var t=$("#main-wysiwyg-area .selectable-img.selecteditem");return 1==t.length&&"object"==typeof e&&"undefined"!=typeof e.url?(ko.contextFor(t[0])._src(e.url),!0):!1},l.addBlock=function(e){var t,o=l.selectedBlock();if(null!==o)for(var a=l.content().mainBlocks().blocks().length-1;a>=0;a--)if(l.content().mainBlocks().blocks()[a]()==o){t=a;break}var i;"undefined"!=typeof t?(i=t+1,l.content().mainBlocks().blocks.splice(i,0,e),l.notifier.info(l.t("New block added after the selected one (__pos__)",{pos:i}))):(l.content().mainBlocks().blocks.push(e),i=l.content().mainBlocks().blocks().length-1,l.notifier.info(l.t("New block added at the model bottom (__pos__)",{pos:i})));var n=l.content().mainBlocks().blocks()[i]();return l.selectBlock(n,!0),!1},l.findObjectsOfType=function(e,t){var o=[],a=ko.utils.unwrapObservable(e);for(var i in a)if(a.hasOwnProperty(i)){var l=ko.utils.unwrapObservable(a[i]);if(i.match(/Blocks$/))for(var n=ko.utils.unwrapObservable(l.blocks),r=0;r<n.length;r++){var d=ko.utils.unwrapObservable(n[r]);(null===t||ko.utils.unwrapObservable(d.type)==t)&&o.push(d)}else"object"==typeof l&&null!==l&&(null===t||ko.utils.unwrapObservable(l.type)==t)&&o.push(l)}return o},l.placeholderHelper={element:function(e){return $(e[0].outerHTML).removeClass("ui-draggable").addClass("sortable-placeholder").css("display","block").css("position","relative").css("width","100%").css("height","auto").css("opacity",".8")[0]},update:function(){}},l.startMultiple=function(){"undefined"!=typeof l.setUndoModeMerge&&l.setUndoModeMerge()},l.stopMultiple=function(){"undefined"!=typeof l.setUndoModeOnce&&l.setUndoModeOnce()},l.localGlobalSwitch=function(e,t){var o=e();return null===o?e(t()):e(null),!1},l.selectItem=function(e,t,o){var a=ko.utils.peekObservable(e);return"undefined"!=typeof o&&l.selectBlock(o,!1,!0),a!=t&&(e(t),null!==t&&0===l.selectedTool()&&l.selectedTool(1)),!1}.bind(l,l.selectedItem),l.isSelectedItem=function(e){return l.selectedItem()==e},l.selectBlock=function(e,t,o,a){var i=ko.utils.peekObservable(e);a||l.selectItem(null),i!=t&&(e(t),l.showGallery(!1),null===t||o||0!==l.selectedTool()||l.selectedTool(1))}.bind(l,l.selectedBlock),l.countSubscriptions=function(e,t){var o=0;for(var a in e)if(e.hasOwnProperty(a)){var i=e[a];if(ko.isObservable(i)&&("undefined"!=typeof i._defaultComputed&&("undefined"!=typeof t&&console.log(t+"/"+a+"/_",i._defaultComputed.getSubscriptionsCount()),o+=i._defaultComputed.getSubscriptionsCount()),"undefined"!=typeof t&&console.log(t+"/"+a+"/-",i.getSubscriptionsCount()),o+=i.getSubscriptionsCount(),i=ko.utils.unwrapObservable(i)),"object"==typeof i&&null!==i){var n=l.countSubscriptions(i,"undefined"!=typeof t?t+"/"+a+"@":void 0);"undefined"!=typeof t&&console.log(t+"/"+a+"@",n),o+=n}}return o},l.loopSubscriptionsCount=function(){var e=l.countSubscriptions(l.content());global.document.getElementById("subscriptionsCount").innerHTML=e,global.setTimeout(l.loopSubscriptionsCount,1e3)},l.export=function(){var e=performanceAwareCaller("exportHTML",l.exportHTML);return e},l.exportHTML=function(){var e="exportframe";$("body").append('<iframe id="'+e+'" data-bind="bindIframe: $data"></iframe>');var t=global.document.getElementById(e);ko.applyBindings(l,t),ko.cleanNode(t),l.inline&&l.inline(t.contentWindow.document);var o=t.contentWindow.document.doctype,a="<!DOCTYPE "+o.name+(o.publicId?' PUBLIC "'+o.publicId+'"':"")+(!o.publicId&&o.systemId?" SYSTEM":"")+(o.systemId?' "'+o.systemId+'"':"")+">",n=a+"\n"+t.contentWindow.document.documentElement.outerHTML;ko.removeNode(t),n=n.replace(/<script ([^>]* )?type="text\/html"[^>]*>[\s\S]*?<\/script>/gm,""),n=n.replace(/<!-- ko ((?!--).)*? -->/g,""),n=n.replace(/<!-- \/ko -->/g,""),n=n.replace(/ data-bind="[^"]*"/gm,""),n=n.replace(/ data-mce-(href|src|style)="[^"]*"/gm,""),n=n.replace(/ style="[^"]*"([^>]*) replaced(style="[^"]*")/gm,"$1 $2"),n=n.replace(/ replaced(style="[^"]*")([^>]*) style="[^"]*"/gm," $1$2"),n=n.replace(/ replaced(style="[^"]*")/gm," $1"),n=n.replace(/ http-equiv="[^"]*"([^>]*) replaced(http-equiv="[^"]*")/gm,"$1 $2"),n=n.replace(/ replaced(http-equiv="[^"]*")([^>]*) http-equiv="[^"]*"/gm," $1$2"),n=n.replace(/ replaced(http-equiv="[^"]*")/gm," $1"),n=i(n);var r=n.match(/ data-[^ =]+(="[^"]+")? /)||n.match(/ replaced([^= ]*=)/);return r&&console.warn("Output HTML contains unexpected data- attributes or replaced attributes",r),n},l.exportHTMLtoTextarea=function(e){$(e).val(l.exportHTML())},l.exportJSONtoTextarea=function(e){$(e).val(l.exportJSON())},l.importJSONfromTextarea=function(e){l.importJSON($(e).val())},l.exportMetadata=function(){var e=ko.toJSON(l.metadata);return e},l.exportJSON=function(){var e=ko.toJSON(l.content);return e},l.exportJS=function(){return ko.toJS(l.content)},l.importJSON=function(e){var t=ko.utils.parseJson(e);l.content._wrap(t)},l.exportTheme=function(){var e={},t=l.content().theme(),o=function(e,t,a){for(var i in a)if(a.hasOwnProperty(i)){var l=ko.utils.unwrapObservable(a[i]);null!==l&&"object"==typeof l?o(i+".",t,l):t[e+i]=l}};o("",e,t);var a="";for(var i in e)e.hasOwnProperty(i)&&"type"!=i&&(a+=i+": "+e[i]+";"+"\n");return a},l.loadImage=function(e){l.galleryRecent.unshift(e),l.selectedImageTab(0)},l.dialog=function(e,t){$(e).dialog(t)},l.log=function(){},l.selectedImageTab.subscribe(function(e){1==e&&l.galleryLoaded()===!1&&l.loadGallery()},l,"change"),l}var $=(typeof window !== "undefined" ? window['jQuery'] : typeof global !== "undefined" ? global['jQuery'] : null),ko=(typeof window !== "undefined" ? window['ko'] : typeof global !== "undefined" ? global['ko'] : null),console=require("./../../bower_components/console-browserify/index.js"),performanceAwareCaller=require("./timed-call.js").timedCall,toastr=require("./../../bower_components/toastr/toastr.js");toastr.options={closeButton:!1,debug:!1,positionClass:"toast-bottom-full-width",target:"#mo-body",onclick:null,showDuration:"300",hideDuration:"1000",timeOut:"5000",extendedTimeOut:"1000",showEasing:"swing",hideEasing:"linear",showMethod:"fadeIn",hideMethod:"fadeOut"},module.exports=initializeEditor;
|
1512
|
+
|
1513
|
+
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
1514
|
+
|
1515
|
+
},{"./../../bower_components/console-browserify/index.js":1,"./../../bower_components/toastr/toastr.js":19,"./timed-call.js":64}]},{},[27,20])(27)
|
1516
|
+
});
|
1517
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJib3dlcl9jb21wb25lbnRzL2NvbnNvbGUtYnJvd3NlcmlmeS9pbmRleC5qcyIsImJvd2VyX2NvbXBvbmVudHMvZXZvbC1jb2xvcnBpY2tlci9qcy9ldm9sLmNvbG9ycGlja2VyLm1pbi5qcyIsImJvd2VyX2NvbXBvbmVudHMvanNlcC9zcmMvanNlcC5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVpY2UvbGliL2lubGluZS5qcyIsImJvd2VyX2NvbXBvbmVudHMvanVpY2UvbGliL3Byb3BlcnR5LmpzIiwiYm93ZXJfY29tcG9uZW50cy9qdWljZS9saWIvc2VsZWN0b3IuanMiLCJib3dlcl9jb21wb25lbnRzL2p1aWNlL2xpYi91dGlscy5qcyIsImJvd2VyX2NvbXBvbmVudHMva25vY2tvdXQtc29ydGFibGUvYnVpbGQva25vY2tvdXQtc29ydGFibGUubWluLmpzIiwiYm93ZXJfY29tcG9uZW50cy9rbm9ja291dC11bmRvbWFuYWdlci9rbm9ja291dC11bmRvbWFuYWdlci5qcyIsImJvd2VyX2NvbXBvbmVudHMva25vY2tvdXQud3JhcC9rbm9ja291dC53cmFwLmpzIiwiYm93ZXJfY29tcG9uZW50cy9rbm9ja291dGpzLXJlYWN0b3Ivc3JjL2tub2Nrb3V0LnJlYWN0b3IuanMiLCJib3dlcl9jb21wb25lbnRzL21lbnNjaC9pbmRleC5qcyIsImJvd2VyX2NvbXBvbmVudHMvbWVuc2NoL2xpYi9kZWJ1Zy5qcyIsImJvd2VyX2NvbXBvbmVudHMvbWVuc2NoL2xpYi9sZXhlci5qcyIsImJvd2VyX2NvbXBvbmVudHMvbWVuc2NoL2xpYi9wYXJzZXIuanMiLCJib3dlcl9jb21wb25lbnRzL21lbnNjaC9saWIvc3RyaW5naWZ5LmpzIiwiYm93ZXJfY29tcG9uZW50cy9zbGljay9wYXJzZXIuanMiLCJib3dlcl9jb21wb25lbnRzL3Rpbnljb2xvci90aW55Y29sb3IuanMiLCJib3dlcl9jb21wb25lbnRzL3RvYXN0ci90b2FzdHIuanMiLCJidWlsZC90ZW1wbGF0ZXMuanMiLCJub2RlX21vZHVsZXMvYXNzZXJ0L2Fzc2VydC5qcyIsIm5vZGVfbW9kdWxlcy9vcy1icm93c2VyaWZ5L2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwvbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvdXRpbC9zdXBwb3J0L2lzQnVmZmVyQnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiLCJzcmMvanMvYXBwLmpzIiwic3JjL2pzL2JpbmRpbmdzL2JpbmQtaWZyYW1lLmpzIiwic3JjL2pzL2JpbmRpbmdzL2Jsb2Nrcy5qcyIsInNyYy9qcy9iaW5kaW5ncy9jaG9vc2UtdGVtcGxhdGUuanMiLCJzcmMvanMvYmluZGluZ3MvY29sb3JwaWNrZXIuanMiLCJzcmMvanMvYmluZGluZ3MvY3NzdGV4dC5qcyIsInNyYy9qcy9iaW5kaW5ncy9kcm9wcGFibGUuanMiLCJzcmMvanMvYmluZGluZ3MvZXZlbnRhYmxlLmpzIiwic3JjL2pzL2JpbmRpbmdzL2V4dGVuZGVyLXBhZ2luYXRpb24uanMiLCJzcmMvanMvYmluZGluZ3MvZXh0c29ydGFibGVzLmpzIiwic3JjL2pzL2JpbmRpbmdzL2ZpbGV1cGxvYWQuanMiLCJzcmMvanMvYmluZGluZ3MvaWYtc3Vicy5qcyIsInNyYy9qcy9iaW5kaW5ncy9qcXVlcnl1aS1zcGlubmVyLmpzIiwic3JjL2pzL2JpbmRpbmdzL2pxdWVyeXVpLXRhYnMuanMiLCJzcmMvanMvYmluZGluZ3Mvc2NyaXB0LXRlbXBsYXRlLmpzIiwic3JjL2pzL2JpbmRpbmdzL3Njcm9sbGZpeC5qcyIsInNyYy9qcy9iaW5kaW5ncy9zY3JvbGxpbnRvdmlldy5qcyIsInNyYy9qcy9iaW5kaW5ncy9zdHJpbmctdGVtcGxhdGUuanMiLCJzcmMvanMvYmluZGluZ3MvdG9vbHRpcHMuanMiLCJzcmMvanMvYmluZGluZ3MvdmFsaWRhdGVkLXZhbHVlLmpzIiwic3JjL2pzL2JpbmRpbmdzL3ZpcnR1YWxzLmpzIiwic3JjL2pzL2JpbmRpbmdzL3d5c2l3eWdzLmpzIiwic3JjL2pzL2NvbnZlcnRlci9jaGVja21vZGVsLmpzIiwic3JjL2pzL2NvbnZlcnRlci9kZWNsYXJhdGlvbnMuanMiLCJzcmMvanMvY29udmVydGVyL2RvbXV0aWxzLmpzIiwic3JjL2pzL2NvbnZlcnRlci9lZGl0b3IuanMiLCJzcmMvanMvY29udmVydGVyL21haW4uanMiLCJzcmMvanMvY29udmVydGVyL21vZGVsLmpzIiwic3JjL2pzL2NvbnZlcnRlci9wYXJzZXIuanMiLCJzcmMvanMvY29udmVydGVyL3N0eWxlc2hlZXQuanMiLCJzcmMvanMvY29udmVydGVyL3V0aWxzLmpzIiwic3JjL2pzL2NvbnZlcnRlci93cmFwcGVyLmpzIiwic3JjL2pzL2V4dC9jb2xvci5qcyIsInNyYy9qcy9leHQvaW5saW5lci5qcyIsInNyYy9qcy9leHQvbG9jYWxzdG9yYWdlLmpzIiwic3JjL2pzL2tvLWJpbmRpbmdzLmpzIiwic3JjL2pzL3RlbXBsYXRlLWxvYWRlci5qcyIsInNyYy9qcy90aW1lZC1jYWxsLmpzIiwic3JjL2pzL3VuZG9tYW5hZ2VyL3VuZG9tYWluLmpzIiwic3JjL2pzL3VuZG9tYW5hZ2VyL3VuZG9zZXJpYWxpemVyLmpzIiwic3JjL2pzL3ZpZXdtb2RlbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUN3Q0EsUUFBUyxRQUVULFFBQVMsUUFDTCxRQUFRLElBQUksTUFBTSxRQUFTLFdBRy9CLFFBQVMsUUFDTCxRQUFRLElBQUksTUFBTSxRQUFTLFdBRy9CLFFBQVMsU0FDTCxRQUFRLEtBQUssTUFBTSxRQUFTLFdBR2hDLFFBQVMsTUFBSyxHQUNWLE1BQU0sR0FBUyxLQUFLLE1BR3hCLFFBQVMsU0FBUSxHQUNiLEdBQUksR0FBTyxNQUFNLEVBQ2pCLEtBQUssRUFDRCxLQUFNLElBQUksT0FBTSxrQkFBb0IsRUFHeEMsSUFBSSxHQUFXLEtBQUssTUFBUSxDQUM1QixTQUFRLElBQUksRUFBUSxLQUFPLEVBQVcsTUFHMUMsUUFBUyxTQUNMLEdBQUksR0FBTSxHQUFJLE1BQ2QsR0FBSSxLQUFPLFFBQ1gsRUFBSSxRQUFVLEtBQUssT0FBTyxNQUFNLEtBQU0sV0FDdEMsUUFBUSxNQUFNLEVBQUksT0FHdEIsUUFBUyxLQUFJLEdBQ1QsUUFBUSxJQUFJLEtBQUssUUFBUSxHQUFVLE1BR3ZDLFFBQVMsUUFBTyxHQUNaLElBQUssRUFBWSxDQUNiLEdBQUksR0FBTSxNQUFNLEtBQUssVUFBVyxFQUNoQyxRQUFPLElBQUcsRUFBTyxLQUFLLE9BQU8sTUFBTSxLQUFNLEtBakZqRCxHQUFJLE1BQU8sUUFBUSxRQUNmLE9BQVMsUUFBUSxVQUVqQixNQUFRLE1BQU0sVUFBVSxNQUN4QixRQUNBLFFBR0EsU0FEa0IsbUJBQVgsU0FBMEIsT0FBTyxRQUM5QixPQUFPLFFBQ1EsbUJBQVgsU0FBMEIsT0FBTyxRQUNyQyxPQUFPLFVBaUJyQixLQUFLLEdBWkQsYUFDQyxJQUFLLFFBQ0gsS0FBTSxTQUNOLEtBQU0sU0FDTixNQUFPLFVBQ1AsS0FBTSxTQUNOLFFBQVMsWUFDVCxNQUFPLFVBQ1AsSUFBSyxRQUNMLE9BQVEsV0FHTixFQUFJLEVBQUcsRUFBSSxVQUFVLE9BQVEsSUFBSyxDQUN2QyxHQUFJLE9BQVEsVUFBVSxHQUNsQixFQUFJLE1BQU0sR0FDVixLQUFPLE1BQU0sRUFFWixTQUFRLFFBQ1QsUUFBUSxNQUFRLEdBSXhCLE9BQU8sUUFBVTs7Ozs7Q0NqQ2hCLFNBQVMsR0FBSyxHQUFJLEdBQUUsRUFBRSxFQUFFLE9BQU8sVUFBVSxVQUFVLEVBQUUsRUFBRSxRQUFRLFNBQVMsRUFBRSxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsR0FBRSxFQUFHLFVBQVUsS0FBSyxFQUFFLGlCQUFpQixTQUFTLEtBQUssRUFBRSxlQUFlLEtBQUssR0FBRyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxVQUFVLEdBQUcsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxVQUFVLEdBQUcsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsVUFBVSxJQUFJLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFdBQVcsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxXQUFXLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxXQUFXLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFdBQVcsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxXQUFXLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxXQUFXLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFdBQVcsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFdBQVcsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxXQUFXLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFdBQVcsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFdBQVcsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxXQUFXLFNBQVMsU0FBUyxTQUFTLFNBQVMsU0FBUyxTQUFTLFdBQVcsRUFBRSxZQUFZLEVBQUUsU0FBUyxHQUFHLEdBQUksR0FBRSxFQUFFLFNBQVMsR0FBSSxPQUFPLElBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxTQUFTLEdBQUcsTUFBTyxHQUFFLE9BQU8sS0FBSyxFQUFFLFNBQVMsR0FBRyxHQUFJLEdBQUUsRUFBRSxFQUFHLE9BQU8sR0FBRSxFQUFFLEdBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRyxFQUFFLE9BQU8sR0FBRyxDQUFDLEdBQUksR0FBRSxFQUFFLEVBQUUsUUFBUSxLQUFLLEVBQUUsRUFBRSxRQUFRLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sSUFBSyxRQUFPLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssS0FBSyxJQUFJLE1BQU8sR0FBRyxHQUFFLE9BQU8sb0JBQW9CLFFBQVEsUUFBUSxTQUFTLE1BQU0sS0FBSyxPQUFPLE9BQU8sWUFBVyxFQUFHLGtCQUFpQixFQUFHLGtCQUFpQixFQUFHLFNBQVEsRUFBRyxlQUFlLFFBQVEsUUFBUSxnR0FBZ0csU0FBUSxFQUFHLFFBQVEsV0FBVyxHQUFJLEdBQUUsSUFBSyxRQUFPLEtBQUssWUFBWSxTQUFTLEtBQUssUUFBUSxlQUFlLEVBQUUsRUFBRSxLQUFLLElBQUksU0FBUyxJQUFJLEtBQUssVUFBUyxFQUFHLEtBQUssUUFBUSxPQUFPLEtBQUssUUFBUSxXQUFXLFFBQVEsS0FBSyxRQUFRLE9BQU8sS0FBSyxRQUFRLElBQUksR0FBRyxTQUFTLElBQUksUUFBUSxHQUFJLEdBQUUsS0FBSyxRQUFRLE1BQU0sRUFBRSxLQUFLLFFBQVEsR0FBRyxVQUFVLEtBQUssUUFBUSxPQUFPLEdBQUcsZ0JBQWdCLGdCQUFnQixFQUFFLE1BQU0sSUFBSSxLQUFLLFFBQVEsV0FBVyxxQkFBcUIsSUFBSSxFQUFFLEVBQUcsSUFBRyxLQUFL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QUFZLEtBQUssU0FBUyxLQUFLLGFBQWEsUUFBUSxFQUFFLEdBQUcsS0FBSyxZQUFZLEVBQUUsRUFBRSxFQUFFLEtBQUssZUFBZSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsS0FBSyxZQUFZLENBQUUsTUFBSyxZQUFZLENBQUUsSUFBSSxHQUFFLEtBQUssU0FBUyxLQUFLLGFBQWEsT0FBTyxLQUFLLEdBQUcsTUFBTSxXQUFXLEdBQUcsR0FBRyxLQUFLLEVBQUcsR0FBRSxHQUFHLEVBQUUsT0FBTyxTQUFTLHFCQUFxQixXQUFXLElBQUksR0FBSSxHQUFFLEtBQUssUUFBUSxFQUFFLEVBQUUsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsV0FBVyxFQUFFLElBQUksWUFBWSxDQUFDLEdBQUksR0FBRSxLQUFLLFNBQVMsU0FBUyxJQUFJLEtBQUssU0FBUyxTQUFTLEVBQUUsRUFBRSxTQUFTLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxTQUFTLFNBQVMsSUFBSSxLQUFLLFNBQVMsU0FBUyxLQUFLLFFBQVEsY0FBYyxFQUFFLEVBQUUsU0FBUyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBRSxHQUFFLEtBQUssU0FBUyxLQUFLLE9BQU8sS0FBSyxRQUFRLGNBQWMsT0FBTyxLQUFLLFNBQVMsS0FBSyxPQUFPLFFBQVMsT0FBTSxHQUFHLFFBQVEsRUFBRSxHQUFHLFFBQVEsS0FBTSxHQUFFLEVBQUUsZUFBZSxNQUFNLFlBQVksV0FBVyxHQUFHLEtBQUssV0FBVyxLQUFLLFNBQVEsRUFBRyxFQUFFLGdCQUFnQixJQUFJLElBQUksS0FBSyxLQUFLLFlBQVksZUFBZSxPQUFPLEtBQUssVUFBVSxDQUFDLEtBQUssU0FBUyxLQUFLLFFBQVEsT0FBTyxNQUFNLEtBQUssZ0JBQWdCLE9BQU8sR0FBRyxRQUFRLFNBQVMsR0FBRyxNQUFPLEdBQUUsbUJBQWtCLElBQUssS0FBSyxhQUFjLElBQUksR0FBRSxJQUFLLE1BQUssV0FBVyxLQUFLLHVCQUF1QixFQUFFLFNBQVMsTUFBTSxHQUFHLFNBQVMsRUFBRSxJ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LFFBQVEsU0FBUyxFQUFFLFFBQVEsT0FBTyxTQUFTLEVBQUUsR0FBRyxNQUFPLEdBQUUsR0FBRyxPQUFPLEVBQUUsV0FBVyxLQUFLLFdBQVcsRUFBRSxNQUFNLE1BQU0sRUFBRSxNQUFNLFdBQVcsR0FBSSxJQUFJLEdBQUUsV0FBVyxXQUFXLEdBQUksR0FBRSxFQUFFLEVBQUUsUUFBUSxPQUFRLEdBQUUsU0FBUyxFQUFFLE1BQU0sT0FBTyxFQUFFLFNBQVMsTUFBTSxTQUFTLEVBQUUsR0FBRyxHQUFJLEdBQUUsRUFBRSxLQUFLLEVBQUcsR0FBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLGFBQWEsRUFBRSxLQUFLLFNBQVMsV0FBVyxJQUFJLEVBQUUsS0FBSyxLQUFLLGVBQWUsU0FBUyxHQUFHLEVBQUUsTUFBTSxLQUFLLFlBQVksUUFBUSxTQUFTLEVBQUUsR0FBRyxrQkFBbUIsSUFBRyxFQUFFLEtBQUssS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFBRSxRQUFRLEtBQUssS0FBSyxFQUFFLEVBQUUsSUFBSSxLQUFLLE9BQU8sU0FBUyxFQUFFLEdBQUcsR0FBSSxHQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLEVBQUUsS0FBSyxTQUFTLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFFLElBQUcsR0FBRyxFQUFFLEdBQUcsU0FBUyxFQUFFLEtBQUssR0FBRyxPQUFPLElBQUksR0FBRyxFQUFFLFNBQVMsS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsV0FBVyxHQUFHLEVBQUUsRUFBRSxNQUFNLGFBQWEsRUFBRSxLQUFLLFNBQVMsV0FBVyxHQUFHLEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVks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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2V0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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SSxNQUNBLEVBQU0sRUFBVSxVQUFVLFFBRTFCLEVBQVUsU0FBUyxFQUFRLEVBQU0sR0FDbkMsSUFBSyxHQUFJLEtBQVEsR0FDZixHQUFJLEVBQUksZUFBZSxHQUFPLENBQzVCLEdBQUksR0FBSSxHQUFHLE1BQU0saUJBQWlCLEVBQUksR0FDNUIsUUFBTixHQUEwQixnQkFBTCxHQUN2QixFQUFRLEVBQU8sSUFBSyxFQUFNLEdBRTFCLEVBQUssRUFBUyxHQUFRLEdBSzlCLEdBQVEsR0FBSSxFQUFNLEVBRWxCLElBQUksR0FBUyxFQUNiLEtBQUssR0FBSSxLQUFRLEdBQ1gsRUFBSyxlQUFlLElBQWlCLFFBQVIsSUFDL0IsR0FBVSxFQUFPLEtBQU8sRUFBSyxHQUFRLElBQU0sS0FHL0MsT0FBTyxJQVFULEVBQVUsVUFBWSxTQUFTLEdBRTdCLEVBQVUsY0FBYyxRQUFRLEdBRWhDLEVBQVUsaUJBQWlCLElBRzdCLEVBQVUsT0FBUyxTQUFTLEVBQVUsR0FDcEMsRUFBRSxHQUFVLE9BQU8sSUFJckIsRUFBVSxJQUFNLGFBS2hCLEVBQVUsaUJBQWlCLFVBQVUsU0FBUyxHQUM1QixHQUFaLEdBQWlCLEVBQVUsbUJBQW9CLEdBQ2pELEVBQVUsZUFFWCxFQUFXLFVBRVAsRUEza0JULEdBQUksR0FBSSxRQUFRLFVBQ1osR0FBSyxRQUFRLFlBQ2IsUUFBVSxRQUFRLFdBQ2xCLHVCQUF5QixRQUFRLG1CQUFtQixVQUVwRCxPQUFTLFFBQVEsU0FDckIsUUFBTyxTQUNMLGFBQWUsRUFDZixPQUFTLEVBQ1QsY0FBaUIsMEJBQ2pCLE9BQVUsV0FDVixRQUFXLEtBQ1gsYUFBZ0IsTUFDaEIsYUFBZ0IsT0FDaEIsUUFBVyxPQUNYLGdCQUFtQixPQUNuQixXQUFjLFFBQ2QsV0FBYyxTQUNkLFdBQWMsU0FDZCxXQUFjLFdBNGpCaEIsT0FBTyxRQUFVIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8qZ2xvYmFsIHdpbmRvdywgZ2xvYmFsKi9cbnZhciB1dGlsID0gcmVxdWlyZShcInV0aWxcIilcbnZhciBhc3NlcnQgPSByZXF1aXJlKFwiYXNzZXJ0XCIpXG5cbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZVxudmFyIGNvbnNvbGVcbnZhciB0aW1lcyA9IHt9XG5cbmlmICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5jb25zb2xlKSB7XG4gICAgY29uc29sZSA9IGdsb2JhbC5jb25zb2xlXG59IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LmNvbnNvbGUpIHtcbiAgICBjb25zb2xlID0gd2luZG93LmNvbnNvbGVcbn0gZWxzZSB7XG4gICAgY29uc29sZSA9IHt9XG59XG5cbnZhciBmdW5jdGlvbnMgPSBbXG4gICAgW2xvZywgXCJsb2dcIl1cbiAgICAsIFtpbmZvLCBcImluZm9cIl1cbiAgICAsIFt3YXJuLCBcIndhcm5cIl1cbiAgICAsIFtlcnJvciwgXCJlcnJvclwiXVxuICAgICwgW3RpbWUsIFwidGltZVwiXVxuICAgICwgW3RpbWVFbmQsIFwidGltZUVuZFwiXVxuICAgICwgW3RyYWNlLCBcInRyYWNlXCJdXG4gICAgLCBbZGlyLCBcImRpclwiXVxuICAgICwgW2Fzc2VydCwgXCJhc3NlcnRcIl1cbl1cblxuZm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdHVwbGUgPSBmdW5jdGlvbnNbaV1cbiAgICB2YXIgZiA9IHR1cGxlWzBdXG4gICAgdmFyIG5hbWUgPSB0dXBsZVsxXVxuXG4gICAgaWYgKCFjb25zb2xlW25hbWVdKSB7XG4gICAgICAgIGNvbnNvbGVbbmFtZV0gPSBmXG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnNvbGVcblxuZnVuY3Rpb24gbG9nKCkge31cblxuZnVuY3Rpb24gaW5mbygpIHtcbiAgICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpXG59XG5cbmZ1bmN0aW9uIHdhcm4oKSB7XG4gICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKVxufVxuXG5mdW5jdGlvbiBlcnJvcigpIHtcbiAgICBjb25zb2xlLndhcm4uYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKVxufVxuXG5mdW5jdGlvbiB0aW1lKGxhYmVsKSB7XG4gICAgdGltZXNbbGFiZWxdID0gRGF0ZS5ub3coKVxufVxuXG5mdW5jdGlvbiB0aW1lRW5kKGxhYmVsKSB7XG4gICAgdmFyIHRpbWUgPSB0aW1lc1tsYWJlbF1cbiAgICBpZiAoIXRpbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gc3VjaCBsYWJlbDogXCIgKyBsYWJlbClcbiAgICB9XG5cbiAgICB2YXIgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gdGltZVxuICAgIGNvbnNvbGUubG9nKGxhYmVsICsgXCI6IFwiICsgZHVyYXRpb24gKyBcIm1zXCIpXG59XG5cbmZ1bmN0aW9uIHRyYWNlKCkge1xuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKVxuICAgIGVyci5uYW1lID0gXCJUcmFjZVwiXG4gICAgZXJyLm1lc3NhZ2UgPSB1dGlsLmZvcm1hdC5hcHBseShudWxsLCBhcmd1bWVudHMpXG4gICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spXG59XG5cbmZ1bmN0aW9uIGRpcihvYmplY3QpIHtcbiAgICBjb25zb2xlLmxvZyh1dGlsLmluc3BlY3Qob2JqZWN0KSArIFwiXFxuXCIpXG59XG5cbmZ1bmN0aW9uIGFzc2VydChleHByZXNzaW9uKSB7XG4gICAgaWYgKCFleHByZXNzaW9uKSB7XG4gICAgICAgIHZhciBhcnIgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSlcbiAgICAgICAgYXNzZXJ0Lm9rKGZhbHNlLCB1dGlsLmZvcm1hdC5hcHBseShudWxsLCBhcnIpKVxuICAgIH1cbn1cbiIsIi8qXG4gICBldm9sLmNvbG9ycGlja2VyIDMuMi4yXG4gICAoYykgMjAxNSBPbGl2aWVyIEdpdWxpZXJpXG4gICBodHRwOi8vZXZvbHV0ZXVyLmdpdGh1Yi5pby9jb2xvcnBpY2tlci9cbiovXG4hZnVuY3Rpb24oYSxiKXt2YXIgYz0wLGQ9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQsZT1kLmluZGV4T2YoXCJNU0lFIFwiKT4wLGY9ZT9cIi1pZVwiOlwiXCIsZz1lPyExOi9tb3ppbGxhLy50ZXN0KGQudG9Mb3dlckNhc2UoKSkmJiEvd2Via2l0Ly50ZXN0KGQudG9Mb3dlckNhc2UoKSksaD1bXSxpPVtcImZmZmZmZlwiLFwiMDAwMDAwXCIsXCJlZWVjZTFcIixcIjFmNDk3ZFwiLFwiNGY4MWJkXCIsXCJjMDUwNGRcIixcIjliYmI1OVwiLFwiODA2NGEyXCIsXCI0YmFjYzZcIixcImY3OTY0NlwiXSxqPVtcImYyZjJmMlwiLFwiN2Y3ZjdmXCIsXCJkZGQ5YzNcIixcImM2ZDlmMFwiLFwiZGJlNWYxXCIsXCJmMmRjZGJcIixcImViZjFkZFwiLFwiZTVlMGVjXCIsXCJkYmVlZjNcIixcImZkZWFkYVwiLFwiZDhkOGQ4XCIsXCI1OTU5NTlcIixcImM0YmQ5N1wiLFwiOGRiM2UyXCIsXCJiOGNjZTRcIixcImU1YjliN1wiLFwiZDdlM2JjXCIsXCJjY2MxZDlcIixcImI3ZGRlOFwiLFwiZmJkNWI1XCIsXCJiZmJmYmZcIixcIjNmM2YzZlwiLFwiOTM4OTUzXCIsXCI1NDhkZDRcIixcIjk1YjNkN1wiLFwiZDk5Njk0XCIsXCJjM2Q2OWJcIixcImIyYTJjN1wiLFwiOTJjZGRjXCIsXCJmYWMwOGZcIixcImE1YTVhNVwiLFwiMjYyNjI2XCIsXCI0OTQ0MjlcIixcIjE3MzY1ZFwiLFwiMzY2MDkyXCIsXCI5NTM3MzRcIixcIjc2OTIzY1wiLFwiNWY0OTdhXCIsXCIzMTg1OWJcIixcImUzNmMwOVwiLFwiN2Y3ZjdmXCIsXCIwYzBjMGNcIixcIjFkMWIxMFwiLFwiMGYyNDNlXCIsXCIyNDQwNjFcIixcIjYzMjQyM1wiLFwiNGY2MTI4XCIsXCIzZjMxNTFcIixcIjIwNTg2N1wiLFwiOTc0ODA2XCJdLGs9W1wiYzAwMDAwXCIsXCJmZjAwMDBcIixcImZmYzAwMFwiLFwiZmZmZjAwXCIsXCI5MmQwNTBcIixcIjAwYjA1MFwiLFwiMDBiMGYwXCIsXCIwMDcwYzBcIixcIjAwMjA2MFwiLFwiNzAzMGEwXCJdLGw9W1tcIjAwMzM2NlwiLFwiMzM2Njk5XCIsXCIzMzY2Y2NcIixcIjAwMzM5OVwiLFwiMDAwMDk5XCIsXCIwMDAwY2NcIixcIjAwMDA2NlwiXSxbXCIwMDY2NjZcIixcIjAwNjY5OVwiLFwiMDA5OWNjXCIsXCIwMDY2Y2NcIixcIjAwMzNjY1wiLFwiMDAwMGZmXCIsXCIzMzMzZmZcIixcIjMzMzM5OVwiXSxbXCI2Njk5OTlcIixcIjAwOTk5OVwiLFwiMzNjY2NjXCIsXCIwMGNjZmZcIixcIjAwOTlmZlwiLFwiMDA2NmZmXCIsXCIzMzY2ZmZcIixcIjMzMzNjY1wiLFwiNjY2Njk5XCJdLFtcIjMzOTk2NlwiLFwiMDBjYzk5XCIsXCIwMGZmY2NcIixcIjAwZmZmZlwiLFwiMzNjY2ZmXCIsXCIzMzk5ZmZcIixcIjY2OTlmZlwiLFwiNjY2NmZmXCIsXCI2NjAwZmZcIixcIjY2MDBjY1wiXSxbXCIzMzk5MzNcIixcIjAwY2M2NlwiLFwiMDBmZjk5XCIsXCI2NmZmY2NcIixcIjY2ZmZmZlwiLFwiNjZjY2ZmXCIsXCI5OWNjZmZcIixcIjk5OTlmZlwiLFwiOTk2NmZmXCIsXCI5OTMzZmZcIixcIjk5MDBmZlwiXSxbXCIwMDY2MDBcIixcIjAwY2MwMFwiLFwiMDBmZjAwXCIsXCI2NmZmOTlcIixcIjk5ZmZjY1wiLFwiY2NmZmZmXCIsXCJjY2NjZmZcIixcImNjOTlmZlwiLFwiY2M2NmZmXCIsXCJjYzMzZmZcIixcImNjMDBmZlwiLFwiOTkwMGNjXCJdLFtcIjAwMzMwMFwiLFwiMDA5OTMzXCIsXCIzM2NjMzNcIixcIjY2ZmY2NlwiLFwiOTlmZjk5XCIsXCJjY2ZmY2NcIixcImZmZmZmZlwiLFwiZmZjY2ZmXCIsXCJmZjk5ZmZcIixcImZmNjZmZlwiLFwiZmYwMGZmXCIsXCJjYzAwY2NcIixcIjY2MDA2NlwiXSxbXCIzMzMzMDBcIixcIjAwOTkwMFwiLFwiNjZmZjMzXCIsXCI5OWZmNjZcIixcImNjZmY5OVwiLFwiZmZmZmNjXCIsXCJmZmNjY2NcIixcImZmOTljY1wiLFwiZmY2NmNjXCIsXCJmZjMzY2NcIixcImNjMDA5OVwiLFwiOTkzMzk5XCJdLFtcIjMzNjYwMFwiLFwiNjY5OTAwXCIsXCI5OWZmMzNcIixcImNjZmY2NlwiLFwiZmZmZjk5XCIsXCJmZmNjOTlcIixcImZmOTk5OVwiLFwiZmY2Njk5XCIsXCJmZjMzOTlcIixcImNjMzM5OVwiLFwiOTkwMDk5XCJdLFtcIjY2NjYzM1wiLFwiOTljYzAwXCIsXCJjY2ZmMzNcIixcImZmZmY2NlwiLFwiZmZjYzY2XCIsXCJmZjk5NjZcIixcImZmNjY2NlwiLFwiZmYwMDY2XCIsXCJkNjAwOTRcIixcIjk5MzM2NlwiXSxbXCJhNTg4MDBcIixcImNjY2MwMFwiLFwiZmZmZjAwXCIsXCJmZmNjMDBcIixcImZmOTkzM1wiLFwiZmY2NjAwXCIsXCJmZjAwMzNcIixcImNjMDA2NlwiLFwiNjYwMDMzXCJdLFtcIjk5NjYzM1wiLFwiY2M5OTAwXCIsXCJmZjk5MDBcIixcImNjNjYwMFwiLFwiZmYzMzAwXCIsXCJmZjAwMDBcIixcImNjMDAwMFwiLFwiOTkwMDMzXCJdLFtcIjY2MzMwMFwiLFwiOTk2NjAwXCIsXCJjYzMzMDBcIixcIjk5MzMwMFwiLFwiOTkwMDAwXCIsXCI4MDAwMDBcIixcIjk5MzMzM1wiXV0sbT1cIiMwMDAwZmZmZlwiLG49ZnVuY3Rpb24oYSl7dmFyIGI9YS50b1N0cmluZygxNik7cmV0dXJuIDE9PWIubGVuZ3RoJiYoYj1cIjBcIitiKSxifSxvPWZ1bmN0aW9uKGEpe3JldHVybiBuKE51bWJlcihhKSl9LHA9ZnVuY3Rpb24oYSl7dmFyIGI9bihhKTtyZXR1cm4gYitiK2J9LHE9ZnVuY3Rpb24oYSl7aWYoYS5sZW5ndGg+MTApe3ZhciBiPTErYS5pbmRleE9mKFwiKFwiKSxjPWEuaW5kZXhPZihcIilcIiksZD1hLnN1YnN0cmluZyhiLGMpLnNwbGl0KFwiLFwiKTtyZXR1cm5bXCIjXCIsbyhkWzBdKSxvKGRbMV0pLG8oZFsyXSldLmpvaW4oXCJcIil9cmV0dXJuIGF9O2Eud2lkZ2V0KFwiZXZvbC5jb2xvcnBpY2tlclwiLHt2ZXJzaW9uOlwiMy4yLjFcIixvcHRpb25zOntjb2xvcjpudWxsLHNob3dPbjpcImJvdGhcIixoaWRlQnV0dG9uOiExLGRpc3BsYXlJbmRpY2F0b3I6ITAsdHJhbnNwYXJlbnRDb2xvcjohMSxoaXN0b3J5OiEwLGRlZmF1bHRQYWxldHRlOlwidGhlbWVcIixzdHJpbmdzOlwiVGhlbWUgQ29sb3JzLFN0YW5kYXJkIENvbG9ycyxXZWIgQ29sb3JzLFRoZW1lIENvbG9ycyxCYWNrIHRvIFBhbGV0dGUsSGlzdG9yeSxObyBoaXN0b3J5IHlldC5cIn0sX2FjdGl2ZTohMSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcztzd2l0Y2godGhpcy5fcGFsZXR0ZUlkeD1cInRoZW1lXCI9PXRoaXMub3B0aW9ucy5kZWZhdWx0UGFsZXR0ZT8xOjIsdGhpcy5faWQ9XCJldm8tY3BcIitjKyssdGhpcy5fZW5hYmxlZD0hMCx0aGlzLm9wdGlvbnMuc2hvd09uPXRoaXMub3B0aW9ucy5oaWRlQnV0dG9uP1wiZm9jdXNcIjp0aGlzLm9wdGlvbnMuc2hvd09uLHRoaXMuZWxlbWVudC5nZXQoMCkudGFnTmFtZSl7Y2FzZVwiSU5QVVRcIjp2YXIgZD10aGlzLm9wdGlvbnMuY29sb3IsaD10aGlzLmVsZW1lbnQsaT0oXCJmb2N1c1wiPT09dGhpcy5vcHRpb25zLnNob3dPbj9cIlwiOlwiZXZvLXBvaW50ZXIgXCIpK1wiZXZvLWNvbG9yaW5kXCIrKGc/XCItZmZcIjpmKSsodGhpcy5vcHRpb25zLmhpZGVCdXR0b24/XCIgZXZvLWhpZGRlbi1idXR0b25cIjpcIlwiKSxqPVwiXCI7aWYodGhpcy5faXNQb3B1cD0hMCx0aGlzLl9wYWxldHRlPW51bGwsbnVsbCE9PWQpaC52YWwoZCk7ZWxzZXt2YXIgaz1oLnZhbCgpO1wiXCIhPT1rJiYoZD10aGlzLm9wdGlvbnMuY29sb3I9ayl9ZD09PW0/aSs9XCIgZXZvLXRyYW5zcGFyZW50XCI6aj1udWxsIT09ZD9cImJhY2tncm91bmQtY29sb3I6XCIrZDpcIlwiLGguYWRkQ2xhc3MoXCJjb2xvclBpY2tlciBcIit0aGlzLl9pZCkud3JhcCgnPGRpdiBzdHlsZT1cIndpZHRoOicrKHRoaXMub3B0aW9ucy5oaWRlQnV0dG9uP3RoaXMuZWxlbWVudC53aWR0aCgpOnRoaXMuZWxlbWVudC53aWR0aCgpKzMyKStcInB4O1wiKyhlP1wibWFyZ2luLWJvdHRvbTotMjFweDtcIjpcIlwiKSsoZz9cInBhZGRpbmc6MXB4IDA7XCI6XCJcIikrJ1wiPjwvZGl2PicpLmFmdGVyKCc8ZGl2IGNsYXNzPVwiJytpKydcIiBzdHlsZT1cIicraisnXCI+PC9kaXY+Jykub24oXCJrZXl1cCBvbnBhc3RlXCIsZnVuY3Rpb24oYyl7dmFyIGQ9YSh0aGlzKS52YWwoKTtkIT1iLm9wdGlvbnMuY29sb3ImJmIuX3NldFZhbHVlKGQsITApfSk7dmFyIGw9dGhpcy5vcHRpb25zLnNob3dPbjsoXCJib3RoXCI9PT1sfHxcImZvY3VzXCI9PT1sKSYmaC5vbihcImZvY3VzXCIsZnVuY3Rpb24oKXtiLnNob3dQYWxldHRlKCl9KSwoXCJib3RoXCI9PT1sfHxcImJ1dHRvblwiPT09bCkmJmgubmV4dCgpLm9uKFwiY2xpY2tcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5zdG9wUHJvcGFnYXRpb24oKSxiLnNob3dQYWxldHRlKCksITF9KTticmVhaztkZWZhdWx0OnRoaXMuX2lzUG9wdXA9ITEsdGhpcy5fcGFsZXR0ZT10aGlzLmVsZW1lbnQuaHRtbCh0aGlzLl9wYWxldHRlSFRNTCgpKS5hdHRyKFwiYXJpYS1oYXNwb3B1cFwiLFwidHJ1ZVwiKSx0aGlzLl9iaW5kQ29sb3JzKCl9aWYodGhpcy5vcHRpb25zLmhpc3RvcnkmJihkJiZ0aGlzLl9hZGQySGlzdG9yeShkKSx0aGlzLm9wdGlvbnMuaW5pdGlhbEhpc3RvcnkpKXt2YXIgbj10aGlzLm9wdGlvbnMuaW5pdGlhbEhpc3Rvcnk7Zm9yKHZhciBvIGluIG4pdGhpcy5fYWRkMkhpc3RvcnkobltvXSl9fSxfcGFsZXR0ZUhUTUw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9wYWxldHRlSWR4PU1hdGguYWJzKHRoaXMuX3BhbGV0dGVJZHgpLGI9dGhpcy5vcHRpb25zLGM9Yi5zdHJpbmdzLnNwbGl0KFwiLFwiKSxkPSc8ZGl2IGNsYXNzPVwiZXZvLXBvcCcrZisnIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsXCInKyh0aGlzLl9pc1BvcHVwPycgc3R5bGU9XCJwb3NpdGlvbjphYnNvbHV0ZVwiJzpcIlwiKStcIj48c3Bhbj5cIit0aGlzW1wiX3BhbGV0dGVIVE1MXCIrYV0oKSsnPC9zcGFuPjxkaXYgY2xhc3M9XCJldm8tbW9yZVwiPjxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIj4nK2NbMSthXStcIjwvYT5cIjtyZXR1cm4gYi5oaXN0b3J5JiYoZCs9JzxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiBjbGFzcz1cImV2by1oaXN0XCI+JytjWzVdK1wiPC9hPlwiKSxkKz1cIjwvZGl2PlwiLGIuZGlzcGxheUluZGljYXRvciYmKGQrPXRoaXMuX2NvbG9ySW5kSFRNTCh0aGlzLm9wdGlvbnMuY29sb3IpK3RoaXMuX2NvbG9ySW5kSFRNTChcIlwiKSksZCs9XCI8L2Rpdj5cIn0sX2NvbG9ySW5kSFRNTDpmdW5jdGlvbihhKXt2YXIgYj1lP1wiZXZvLWNvbG9yYm94LWllIFwiOlwiXCIsYz1cIlwiO3JldHVybiBhP2E9PT1tP2IrPVwiZXZvLXRyYW5zcGFyZW50XCI6Yz1cImJhY2tncm91bmQtY29sb3I6XCIrYTpjPVwiZGlzcGxheTpub25lXCIsJzxkaXYgY2xhc3M9XCJldm8tY29sb3JcIiBzdHlsZT1cImZsb2F0OmxlZnRcIj48ZGl2IHN0eWxlPVwiJytjKydcIiBjbGFzcz1cIicrYisnXCI+PC9kaXY+PHNwYW4+JysoYT9hOlwiXCIpK1wiPC9zcGFuPjwvZGl2PlwifSxfcGFsZXR0ZUhUTUwxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMub3B0aW9ucyxiPWEuc3RyaW5ncy5zcGxpdChcIixcIiksYz0nPHRkIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojJyxkPWU/J1wiPjxkaXYgc3R5bGU9XCJ3aWR0aDoycHg7XCI+PC9kaXY+PC90ZD4nOidcIj48c3Bhbi8+PC90ZD4nLGc9Jzx0cj48dGggY29sc3Bhbj1cIjEwXCIgY2xhc3M9XCJ1aS13aWRnZXQtY29udGVudFwiPicsaD0nPHRhYmxlIGNsYXNzPVwiZXZvLXBhbGV0dGUnK2YrJ1wiPicrZytiWzBdK1wiPC90aD48L3RyPjx0cj5cIixsPTA7MTA+bDtsKyspaCs9YytpW2xdK2Q7Zm9yKGgrPVwiPC90cj5cIixlfHwoaCs9Jzx0cj48dGggY29sc3Bhbj1cIjEwXCI+PC90aD48L3RyPicpLGgrPSc8dHIgY2xhc3M9XCJ0b3BcIj4nLGw9MDsxMD5sO2wrKyloKz1jK2pbbF0rZDtmb3IodmFyIG09MTs0Pm07bSsrKWZvcihoKz0nPC90cj48dHIgY2xhc3M9XCJpblwiPicsbD0wOzEwPmw7bCsrKWgrPWMralsxMCptK2xdK2Q7Zm9yKGgrPSc8L3RyPjx0ciBjbGFzcz1cImJvdHRvbVwiPicsbD00MDs1MD5sO2wrKyloKz1jK2pbbF0rZDtmb3IoaCs9XCI8L3RyPlwiK2csYS50cmFuc3BhcmVudENvbG9yJiYoaCs9JzxkaXYgY2xhc3M9XCJldm8tdHJhbnNwYXJlbnQgZXZvLXRyLWJveFwiPjwvZGl2PicpLGgrPWJbMV0rXCI8L3RoPjwvdHI+PHRyPlwiLGw9MDsxMD5sO2wrKyloKz1jK2tbbF0rZDtyZXR1cm4gaCs9XCI8L3RyPjwvdGFibGU+XCJ9LF9wYWxldHRlSFRNTDI6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYixjPSc8dGQgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiMnLGQ9ZT8nXCI+PGRpdiBzdHlsZT1cIndpZHRoOjVweDtcIj48L2Rpdj48L3RkPic6J1wiPjxzcGFuLz48L3RkPicsZz0nPHRhYmxlIGNsYXNzPVwiZXZvLXBhbGV0dGUyJytmKydcIj48dHI+JyxoPVwiPC90cj48L3RhYmxlPlwiLGk9JzxkaXYgY2xhc3M9XCJldm8tcGFsY2VudGVyXCI+JyxqPTAsaz1sLmxlbmd0aDtrPmo7aisrKXtpKz1nO3ZhciBtPWxbal07Zm9yKGE9MCxiPW0ubGVuZ3RoO2I+YTthKyspaSs9YyttW2FdK2Q7aSs9aH1pKz0nPGRpdiBjbGFzcz1cImV2by1zZXBcIi8+Jzt2YXIgbj1cIlwiO2ZvcihpKz1nLGE9MjU1O2E+MTA7YS09MTApaSs9YytwKGEpK2QsYS09MTAsbis9YytwKGEpK2Q7cmV0dXJuIGkrPWgrZytuK2grXCI8L2Rpdj5cIn0sX3N3aXRjaFBhbGV0dGU6ZnVuY3Rpb24oYil7aWYodGhpcy5fZW5hYmxlZCl7dmFyIGMsZCxlLGY9dGhpcy5vcHRpb25zLnN0cmluZ3Muc3BsaXQoXCIsXCIpO2lmKGEoYikuaGFzQ2xhc3MoXCJldm8taGlzdFwiKSl7dmFyIGc9Wyc8dGFibGUgY2xhc3M9XCJldm8tcGFsZXR0ZVwiPjx0cj48dGggY2xhc3M9XCJ1aS13aWRnZXQtY29udGVudFwiPicsZls1XSxcIjwvdGg+PC90cj48L3RyPjwvdGFibGU+XCIsJzxkaXYgY2xhc3M9XCJldm8tY0hpc3RcIj4nXTtpZigwPT09aC5sZW5ndGgpZy5wdXNoKFwiPHA+Jm5ic3A7XCIsZls2XSxcIjwvcD5cIik7ZWxzZSBmb3IodmFyIGk9aC5sZW5ndGgtMTtpPi0xO2ktLSk5PT09aFtpXS5sZW5ndGg/Zy5wdXNoKCc8ZGl2IGNsYXNzPVwiZXZvLXRyYW5zcGFyZW50XCI+PC9kaXY+Jyk6Zy5wdXNoKCc8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjonLGhbaV0sJ1wiPjwvZGl2PicpO2cucHVzaChcIjwvZGl2PlwiKSxjPS10aGlzLl9wYWxldHRlSWR4LGQ9Zy5qb2luKFwiXCIpLGU9Zls0XX1lbHNlIHRoaXMuX3BhbGV0dGVJZHg8MD8oYz0tdGhpcy5fcGFsZXR0ZUlkeCx0aGlzLl9wYWxldHRlLmZpbmQoXCIuZXZvLWhpc3RcIikuc2hvdygpKTpjPTI9PXRoaXMuX3BhbGV0dGVJZHg/MToyLGQ9dGhpc1tcIl9wYWxldHRlSFRNTFwiK2NdKCksZT1mW2MrMV0sdGhpcy5fcGFsZXR0ZUlkeD1jO3RoaXMuX3BhbGV0dGVJZHg9Yzt2YXIgaj10aGlzLl9wYWxldHRlLmZpbmQoXCIuZXZvLW1vcmVcIikucHJldigpLmh0bWwoZCkuZW5kKCkuY2hpbGRyZW4oKS5lcSgwKS5odG1sKGUpOzA+YyYmai5uZXh0KCkuaGlkZSgpfX0sX2Rvd25PclVwUG9zaXRpb25pbmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5lbGVtZW50LGI9MDtudWxsIT09YSYmMTAwPmI7KXtpZihcInZpc2libGVcIiE9YS5jc3MoXCJvdmVyZmxvd1wiKSl7dmFyIGM9dGhpcy5fcGFsZXR0ZS5vZmZzZXQoKS50b3ArdGhpcy5fcGFsZXR0ZS5oZWlnaHQoKSxkPWEub2Zmc2V0KCkudG9wK2EuaGVpZ2h0KCksZT10aGlzLl9wYWxldHRlLm9mZnNldCgpLnRvcC10aGlzLl9wYWxldHRlLmhlaWdodCgpLXRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpLGY9YS5vZmZzZXQoKS50b3AsZz1jPmQmJmU+ZjtnP3RoaXMuX3BhbGV0dGUuY3NzKHtib3R0b206dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCkrXCJweFwifSk6dGhpcy5fcGFsZXR0ZS5jc3Moe2JvdHRvbTpcImF1dG9cIn0pO2JyZWFrfWlmKFwiSFRNTFwiPT1hWzBdLnRhZ05hbWUpYnJlYWs7YT1hLm9mZnNldFBhcmVudCgpLGIrK319LHNob3dQYWxldHRlOmZ1bmN0aW9uKCl7aWYodGhpcy5fZW5hYmxlZCYmKHRoaXMuX2FjdGl2ZT0hMCxhKFwiLmNvbG9yUGlja2VyXCIpLm5vdChcIi5cIit0aGlzLl9pZCkuY29sb3JwaWNrZXIoXCJoaWRlUGFsZXR0ZVwiKSxudWxsPT09dGhpcy5fcGFsZXR0ZSkpe3RoaXMuX3BhbGV0dGU9dGhpcy5lbGVtZW50Lm5leHQoKS5hZnRlcih0aGlzLl9wYWxldHRlSFRNTCgpKS5uZXh0KCkub24oXCJjbGlja1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnN0b3BQcm9wYWdhdGlvbigpLCExfSksdGhpcy5fYmluZENvbG9ycygpO3ZhciBiPXRoaXM7dGhpcy5faXNQb3B1cCYmKHRoaXMuX2Rvd25PclVwUG9zaXRpb25pbmcoKSxhKGRvY3VtZW50LmJvZHkpLm9uKFwiY2xpY2suXCIrYi5faWQsZnVuY3Rpb24oYSl7YS50YXJnZXQhPWIuZWxlbWVudC5nZXQoMCkmJmIuaGlkZVBhbGV0dGUoKX0pLm9uKFwia2V5dXAuXCIrYi5faWQsZnVuY3Rpb24oYSl7Mjc9PT1hLmtleUNvZGUmJmIuaGlkZVBhbGV0dGUoKX0pKX1yZXR1cm4gdGhpc30saGlkZVBhbGV0dGU6ZnVuY3Rpb24oKXtpZih0aGlzLl9pc1BvcHVwJiZ0aGlzLl9wYWxldHRlKXthKGRvY3VtZW50LmJvZHkpLm9mZihcImNsaWNrLlwiK3RoaXMuX2lkKTt2YXIgYj10aGlzO3RoaXMuX3BhbGV0dGUub2ZmKFwibW91c2VvdmVyIGNsaWNrXCIsXCJ0ZCwuZXZvLXRyYW5zcGFyZW50XCIpLmZhZGVPdXQoZnVuY3Rpb24oKXtiLl9wYWxldHRlLnJlbW92ZSgpLGIuX3BhbGV0dGU9Yi5fY1R4dD1udWxsfSkuZmluZChcIi5ldm8tbW9yZSBhXCIpLm9mZihcImNsaWNrXCIpfXJldHVybiB0aGlzfSxfYmluZENvbG9yczpmdW5jdGlvbigpe3ZhciBiPXRoaXMsYz10aGlzLm9wdGlvbnMsZD10aGlzLl9wYWxldHRlLmZpbmQoXCJkaXYuZXZvLWNvbG9yXCIpLGU9Yy5oaXN0b3J5P1widGQsLmV2by1jSGlzdD5kaXZcIjpcInRkXCI7Yy50cmFuc3BhcmVudENvbG9yJiYoZSs9XCIsLmV2by10cmFuc3BhcmVudFwiKSx0aGlzLl9jVHh0MT1kLmVxKDApLmNoaWxkcmVuKCkuZXEoMCksdGhpcy5fY1R4dDI9ZC5lcSgxKS5jaGlsZHJlbigpLmVxKDApLHRoaXMuX3BhbGV0dGUub24oXCJjbGlja1wiLGUsZnVuY3Rpb24oYyl7aWYoYi5fZW5hYmxlZCl7dmFyIGQ9YSh0aGlzKTtiLl9zZXRWYWx1ZShkLmhhc0NsYXNzKFwiZXZvLXRyYW5zcGFyZW50XCIpP206cShkLmF0dHIoXCJzdHlsZVwiKS5zdWJzdHJpbmcoMTcpKSksYi5fYWN0aXZlPSExfX0pLm9uKFwibW91c2VvdmVyXCIsZSxmdW5jdGlvbihjKXtpZihiLl9lbmFibGVkKXt2YXIgZD1hKHRoaXMpLGU9ZC5oYXNDbGFzcyhcImV2by10cmFuc3BhcmVudFwiKT9tOnEoZC5hdHRyKFwic3R5bGVcIikuc3Vic3RyaW5nKDE3KSk7Yi5vcHRpb25zLmRpc3BsYXlJbmRpY2F0b3ImJmIuX3NldENvbG9ySW5kKGUsMiksYi5fYWN0aXZlJiZiLmVsZW1lbnQudHJpZ2dlcihcIm1vdXNlb3Zlci5jb2xvclwiLGUpfX0pLmZpbmQoXCIuZXZvLW1vcmUgYVwiKS5vbihcImNsaWNrXCIsZnVuY3Rpb24oKXtiLl9zd2l0Y2hQYWxldHRlKHRoaXMpfSl9LHZhbDpmdW5jdGlvbihhKXtyZXR1cm5cInVuZGVmaW5lZFwiPT10eXBlb2YgYT90aGlzLm9wdGlvbnMuY29sb3I6KHRoaXMuX3NldFZhbHVlKGEpLHRoaXMpfSxfc2V0VmFsdWU6ZnVuY3Rpb24oYSxiKXthPWEucmVwbGFjZSgvIC9nLFwiXCIpLHRoaXMub3B0aW9ucy5jb2xvcj1hLHRoaXMuX2lzUG9wdXA/KGJ8fHRoaXMuaGlkZVBhbGV0dGUoKSx0aGlzLl9zZXRCb3hDb2xvcih0aGlzLmVsZW1lbnQudmFsKGEpLm5leHQoKSxhKSk6dGhpcy5fc2V0Q29sb3JJbmQoYSwxKSx0aGlzLm9wdGlvbnMuaGlzdG9yeSYmdGhpcy5fcGFsZXR0ZUlkeD4wJiZ0aGlzLl9hZGQySGlzdG9yeShhKSx0aGlzLmVsZW1lbnQudHJpZ2dlcihcImNoYW5nZS5jb2xvclwiLGEpfSxfc2V0Q29sb3JJbmQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzW1wiX2NUeHRcIitiXTt0aGlzLl9zZXRCb3hDb2xvcihjLGEpLGMubmV4dCgpLmh0bWwoYSl9LF9zZXRCb3hDb2xvcjpmdW5jdGlvbihhLGIpe2I9PT1tP2EuYWRkQ2xhc3MoXCJldm8tdHJhbnNwYXJlbnRcIikucmVtb3ZlQXR0cihcInN0eWxlXCIpOmEucmVtb3ZlQ2xhc3MoXCJldm8tdHJhbnNwYXJlbnRcIikuYXR0cihcInN0eWxlXCIsXCJiYWNrZ3JvdW5kLWNvbG9yOlwiK2IpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGEsYil7XCJjb2xvclwiPT1hP3RoaXMuX3NldFZhbHVlKGIsITApOnRoaXMub3B0aW9uc1thXT1ifSxfYWRkMkhpc3Rvcnk6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPWgubGVuZ3RoLGM9MDtiPmM7YysrKWlmKGE9PWhbY10pcmV0dXJuO2I+MjcmJmguc2hpZnQoKSxoLnB1c2goYSl9LGNsZWFyOmZ1bmN0aW9uKCl7dGhpcy5oaWRlUGFsZXR0ZSgpLnZhbChcIlwiKX0sZW5hYmxlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50O3JldHVybiB0aGlzLl9pc1BvcHVwP2EucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpOmEuY3NzKHtvcGFjaXR5OlwiMVwiLFwicG9pbnRlci1ldmVudHNcIjpcImF1dG9cIn0pLFwiZm9jdXNcIiE9PXRoaXMub3B0aW9ucy5zaG93T24mJnRoaXMuZWxlbWVudC5uZXh0KCkuYWRkQ2xhc3MoXCJldm8tcG9pbnRlclwiKSxhLnJlbW92ZUF0dHIoXCJhcmlhLWRpc2FibGVkXCIpLHRoaXMuX2VuYWJsZWQ9ITAsdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWxlbWVudDtyZXR1cm4gdGhpcy5faXNQb3B1cD9hLmF0dHIoXCJkaXNhYmxlZFwiLFwiZGlzYWJsZWRcIik6KHRoaXMuaGlkZVBhbGV0dGUoKSxhLmNzcyh7b3BhY2l0eTpcIjAuM1wiLFwicG9pbnRlci1ldmVudHNcIjpcIm5vbmVcIn0pKSxcImZvY3VzXCIhPT10aGlzLm9wdGlvbnMuc2hvd09uJiZ0aGlzLmVsZW1lbnQubmV4dCgpLnJlbW92ZUNsYXNzKFwiZXZvLXBvaW50ZXJcIiksYS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSx0aGlzLl9lbmFibGVkPSExLHRoaXN9LGlzRGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5fZW5hYmxlZH0sZGVzdHJveTpmdW5jdGlvbigpe2EoZG9jdW1lbnQuYm9keSkub2ZmKFwiY2xpY2suXCIrdGhpcy5faWQpLHRoaXMuX3BhbGV0dGUmJih0aGlzLl9wYWxldHRlLm9mZihcIm1vdXNlb3ZlciBjbGlja1wiLFwidGQsLmV2by1jSGlzdD5kaXYsLmV2by10cmFuc3BhcmVudFwiKS5maW5kKFwiLmV2by1tb3JlIGFcIikub2ZmKFwiY2xpY2tcIiksdGhpcy5faXNQb3B1cCYmdGhpcy5fcGFsZXR0ZS5yZW1vdmUoKSx0aGlzLl9wYWxldHRlPXRoaXMuX2NUeHQ9bnVsbCksdGhpcy5faXNQb3B1cCYmdGhpcy5lbGVtZW50Lm5leHQoKS5vZmYoXCJjbGlja1wiKS5yZW1vdmUoKS5lbmQoKS5vZmYoXCJmb2N1c1wiKS51bndyYXAoKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJjb2xvclBpY2tlciBcIit0aGlzLmlkKS5lbXB0eSgpLGEuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9fSl9KGpRdWVyeSk7IiwiLy8gICAgIEphdmFTY3JpcHQgRXhwcmVzc2lvbiBQYXJzZXIgKEpTRVApIDwlPSB2ZXJzaW9uICU+XG4vLyAgICAgSlNFUCBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuLy8gICAgIGh0dHA6Ly9qc2VwLmZyb20uc28vXG5cbi8qZ2xvYmFsIG1vZHVsZTogdHJ1ZSwgZXhwb3J0czogdHJ1ZSwgY29uc29sZTogdHJ1ZSAqL1xuKGZ1bmN0aW9uIChyb290KSB7XG5cdCd1c2Ugc3RyaWN0Jztcblx0Ly8gTm9kZSBUeXBlc1xuXHQvLyAtLS0tLS0tLS0tXG5cblx0Ly8gVGhpcyBpcyB0aGUgZnVsbCBzZXQgb2YgdHlwZXMgdGhhdCBhbnkgSlNFUCBub2RlIGNhbiBiZS5cblx0Ly8gU3RvcmUgdGhlbSBoZXJlIHRvIHNhdmUgc3BhY2Ugd2hlbiBtaW5pZmllZFxuXHR2YXIgQ09NUE9VTkQgPSAnQ29tcG91bmQnLFxuXHRcdElERU5USUZJRVIgPSAnSWRlbnRpZmllcicsXG5cdFx0TUVNQkVSX0VYUCA9ICdNZW1iZXJFeHByZXNzaW9uJyxcblx0XHRMSVRFUkFMID0gJ0xpdGVyYWwnLFxuXHRcdFRISVNfRVhQID0gJ1RoaXNFeHByZXNzaW9uJyxcblx0XHRDQUxMX0VYUCA9ICdDYWxsRXhwcmVzc2lvbicsXG5cdFx0VU5BUllfRVhQID0gJ1VuYXJ5RXhwcmVzc2lvbicsXG5cdFx0QklOQVJZX0VYUCA9ICdCaW5hcnlFeHByZXNzaW9uJyxcblx0XHRMT0dJQ0FMX0VYUCA9ICdMb2dpY2FsRXhwcmVzc2lvbicsXG5cdFx0Q09ORElUSU9OQUxfRVhQID0gJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbicsXG5cdFx0QVJSQVlfRVhQID0gJ0FycmF5RXhwcmVzc2lvbicsXG5cblx0XHRQRVJJT0RfQ09ERSA9IDQ2LCAvLyAnLidcblx0XHRDT01NQV9DT0RFICA9IDQ0LCAvLyAnLCdcblx0XHRTUVVPVEVfQ09ERSA9IDM5LCAvLyBzaW5nbGUgcXVvdGVcblx0XHREUVVPVEVfQ09ERSA9IDM0LCAvLyBkb3VibGUgcXVvdGVzXG5cdFx0T1BBUkVOX0NPREUgPSA0MCwgLy8gKFxuXHRcdENQQVJFTl9DT0RFID0gNDEsIC8vIClcblx0XHRPQlJBQ0tfQ09ERSA9IDkxLCAvLyBbXG5cdFx0Q0JSQUNLX0NPREUgPSA5MywgLy8gXVxuXHRcdFFVTUFSS19DT0RFID0gNjMsIC8vID9cblx0XHRTRU1DT0xfQ09ERSA9IDU5LCAvLyA7XG5cdFx0Q09MT05fQ09ERSAgPSA1OCwgLy8gOlxuXG5cdFx0dGhyb3dFcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIGluZGV4KSB7XG5cdFx0XHR2YXIgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSArICcgYXQgY2hhcmFjdGVyICcgKyBpbmRleCk7XG5cdFx0XHRlcnJvci5pbmRleCA9IGluZGV4O1xuXHRcdFx0ZXJyb3IuZGVzY3JpcHRpb24gPSBtZXNzYWdlO1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fSxcblxuXHQvLyBPcGVyYXRpb25zXG5cdC8vIC0tLS0tLS0tLS1cblxuXHQvLyBTZXQgYHRgIHRvIGB0cnVlYCB0byBzYXZlIHNwYWNlICh3aGVuIG1pbmlmaWVkLCBub3QgZ3ppcHBlZClcblx0XHR0ID0gdHJ1ZSxcblx0Ly8gVXNlIGEgcXVpY2tseS1hY2Nlc3NpYmxlIG1hcCB0byBzdG9yZSBhbGwgb2YgdGhlIHVuYXJ5IG9wZXJhdG9yc1xuXHQvLyBWYWx1ZXMgYXJlIHNldCB0byBgdHJ1ZWAgKGl0IHJlYWxseSBkb2Vzbid0IG1hdHRlcilcblx0XHR1bmFyeV9vcHMgPSB7Jy0nOiB0LCAnISc6IHQsICd+JzogdCwgJysnOiB0fSxcblx0Ly8gQWxzbyB1c2UgYSBtYXAgZm9yIHRoZSBiaW5hcnkgb3BlcmF0aW9ucyBidXQgc2V0IHRoZWlyIHZhbHVlcyB0byB0aGVpclxuXHQvLyBiaW5hcnkgcHJlY2VkZW5jZSBmb3IgcXVpY2sgcmVmZXJlbmNlOlxuXHQvLyBzZWUgW09yZGVyIG9mIG9wZXJhdGlvbnNdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT3JkZXJfb2Zfb3BlcmF0aW9ucyNQcm9ncmFtbWluZ19sYW5ndWFnZSlcblx0XHRiaW5hcnlfb3BzID0ge1xuXHRcdFx0J3x8JzogMSwgJyYmJzogMiwgJ3wnOiAzLCAgJ14nOiA0LCAgJyYnOiA1LFxuXHRcdFx0Jz09JzogNiwgJyE9JzogNiwgJz09PSc6IDYsICchPT0nOiA2LFxuXHRcdFx0JzwnOiA3LCAgJz4nOiA3LCAgJzw9JzogNywgICc+PSc6IDcsXG5cdFx0XHQnPDwnOjgsICAnPj4nOiA4LCAnPj4+JzogOCxcblx0XHRcdCcrJzogOSwgJy0nOiA5LFxuXHRcdFx0JyonOiAxMCwgJy8nOiAxMCwgJyUnOiAxMFxuXHRcdH0sXG5cdC8vIEdldCByZXR1cm4gdGhlIGxvbmdlc3Qga2V5IGxlbmd0aCBvZiBhbnkgb2JqZWN0XG5cdFx0Z2V0TWF4S2V5TGVuID0gZnVuY3Rpb24ob2JqKSB7XG5cdFx0XHR2YXIgbWF4X2xlbiA9IDAsIGxlbjtcblx0XHRcdGZvcih2YXIga2V5IGluIG9iaikge1xuXHRcdFx0XHRpZigobGVuID0ga2V5Lmxlbmd0aCkgPiBtYXhfbGVuICYmIG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRcdFx0bWF4X2xlbiA9IGxlbjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1heF9sZW47XG5cdFx0fSxcblx0XHRtYXhfdW5vcF9sZW4gPSBnZXRNYXhLZXlMZW4odW5hcnlfb3BzKSxcblx0XHRtYXhfYmlub3BfbGVuID0gZ2V0TWF4S2V5TGVuKGJpbmFyeV9vcHMpLFxuXHQvLyBMaXRlcmFsc1xuXHQvLyAtLS0tLS0tLS0tXG5cdC8vIFN0b3JlIHRoZSB2YWx1ZXMgdG8gcmV0dXJuIGZvciB0aGUgdmFyaW91cyBsaXRlcmFscyB3ZSBtYXkgZW5jb3VudGVyXG5cdFx0bGl0ZXJhbHMgPSB7XG5cdFx0XHQndHJ1ZSc6IHRydWUsXG5cdFx0XHQnZmFsc2UnOiBmYWxzZSxcblx0XHRcdCdudWxsJzogbnVsbFxuXHRcdH0sXG5cdC8vIEV4Y2VwdCBmb3IgYHRoaXNgLCB3aGljaCBpcyBzcGVjaWFsLiBUaGlzIGNvdWxkIGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIGxpa2UgYCdzZWxmJ2AgYXMgd2VsbFxuXHRcdHRoaXNfc3RyID0gJ3RoaXMnLFxuXHQvLyBSZXR1cm5zIHRoZSBwcmVjZWRlbmNlIG9mIGEgYmluYXJ5IG9wZXJhdG9yIG9yIGAwYCBpZiBpdCBpc24ndCBhIGJpbmFyeSBvcGVyYXRvclxuXHRcdGJpbmFyeVByZWNlZGVuY2UgPSBmdW5jdGlvbihvcF92YWwpIHtcblx0XHRcdHJldHVybiBiaW5hcnlfb3BzW29wX3ZhbF0gfHwgMDtcblx0XHR9LFxuXHQvLyBVdGlsaXR5IGZ1bmN0aW9uIChnZXRzIGNhbGxlZCBmcm9tIG11bHRpcGxlIHBsYWNlcylcblx0Ly8gQWxzbyBub3RlIHRoYXQgYGEgJiYgYmAgYW5kIGBhIHx8IGJgIGFyZSAqbG9naWNhbCogZXhwcmVzc2lvbnMsIG5vdCBiaW5hcnkgZXhwcmVzc2lvbnNcblx0XHRjcmVhdGVCaW5hcnlFeHByZXNzaW9uID0gZnVuY3Rpb24gKG9wZXJhdG9yLCBsZWZ0LCByaWdodCkge1xuXHRcdFx0dmFyIHR5cGUgPSAob3BlcmF0b3IgPT09ICd8fCcgfHwgb3BlcmF0b3IgPT09ICcmJicpID8gTE9HSUNBTF9FWFAgOiBCSU5BUllfRVhQO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0b3BlcmF0b3I6IG9wZXJhdG9yLFxuXHRcdFx0XHRsZWZ0OiBsZWZ0LFxuXHRcdFx0XHRyaWdodDogcmlnaHRcblx0XHRcdH07XG5cdFx0fSxcblx0XHQvLyBgY2hgIGlzIGEgY2hhcmFjdGVyIGNvZGUgaW4gdGhlIG5leHQgdGhyZWUgZnVuY3Rpb25zXG5cdFx0aXNEZWNpbWFsRGlnaXQgPSBmdW5jdGlvbihjaCkge1xuXHRcdFx0cmV0dXJuIChjaCA+PSA0OCAmJiBjaCA8PSA1Nyk7IC8vIDAuLi45XG5cdFx0fSxcblx0XHRpc0lkZW50aWZpZXJTdGFydCA9IGZ1bmN0aW9uKGNoKSB7XG5cdFx0XHRyZXR1cm4gKGNoID09PSAzNikgfHwgKGNoID09PSA5NSkgfHwgLy8gYCRgIGFuZCBgX2Bcblx0XHRcdFx0XHQoY2ggPj0gNjUgJiYgY2ggPD0gOTApIHx8IC8vIEEuLi5aXG5cdFx0XHRcdFx0KGNoID49IDk3ICYmIGNoIDw9IDEyMikgfHwgLy8gYS4uLnpcbiAgICAgICAgICAgICAgICAgICAgKGNoID49IDEyOCAmJiAhYmluYXJ5X29wc1tTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKV0pOyAvLyBhbnkgbm9uLUFTQ0lJIHRoYXQgaXMgbm90IGFuIG9wZXJhdG9yXG5cdFx0fSxcblx0XHRpc0lkZW50aWZpZXJQYXJ0ID0gZnVuY3Rpb24oY2gpIHtcblx0XHRcdHJldHVybiAoY2ggPT09IDM2KSB8fCAoY2ggPT09IDk1KSB8fCAvLyBgJGAgYW5kIGBfYFxuXHRcdFx0XHRcdChjaCA+PSA2NSAmJiBjaCA8PSA5MCkgfHwgLy8gQS4uLlpcblx0XHRcdFx0XHQoY2ggPj0gOTcgJiYgY2ggPD0gMTIyKSB8fCAvLyBhLi4uelxuXHRcdFx0XHRcdChjaCA+PSA0OCAmJiBjaCA8PSA1NykgfHwgLy8gMC4uLjlcbiAgICAgICAgICAgICAgICAgICAgKGNoID49IDEyOCAmJiAhYmluYXJ5X29wc1tTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKV0pOyAvLyBhbnkgbm9uLUFTQ0lJIHRoYXQgaXMgbm90IGFuIG9wZXJhdG9yXG5cdFx0fSxcblxuXHRcdC8vIFBhcnNpbmdcblx0XHQvLyAtLS0tLS0tXG5cdFx0Ly8gYGV4cHJgIGlzIGEgc3RyaW5nIHdpdGggdGhlIHBhc3NlZCBpbiBleHByZXNzaW9uXG5cdFx0anNlcCA9IGZ1bmN0aW9uKGV4cHIpIHtcblx0XHRcdC8vIGBpbmRleGAgc3RvcmVzIHRoZSBjaGFyYWN0ZXIgbnVtYmVyIHdlIGFyZSBjdXJyZW50bHkgYXQgd2hpbGUgYGxlbmd0aGAgaXMgYSBjb25zdGFudFxuXHRcdFx0Ly8gQWxsIG9mIHRoZSBnb2JibGVzIGJlbG93IHdpbGwgbW9kaWZ5IGBpbmRleGAgYXMgd2UgbW92ZSBhbG9uZ1xuXHRcdFx0dmFyIGluZGV4ID0gMCxcblx0XHRcdFx0Y2hhckF0RnVuYyA9IGV4cHIuY2hhckF0LFxuXHRcdFx0XHRjaGFyQ29kZUF0RnVuYyA9IGV4cHIuY2hhckNvZGVBdCxcblx0XHRcdFx0ZXhwckkgPSBmdW5jdGlvbihpKSB7IHJldHVybiBjaGFyQXRGdW5jLmNhbGwoZXhwciwgaSk7IH0sXG5cdFx0XHRcdGV4cHJJQ29kZSA9IGZ1bmN0aW9uKGkpIHsgcmV0dXJuIGNoYXJDb2RlQXRGdW5jLmNhbGwoZXhwciwgaSk7IH0sXG5cdFx0XHRcdGxlbmd0aCA9IGV4cHIubGVuZ3RoLFxuXG5cdFx0XHRcdC8vIFB1c2ggYGluZGV4YCB1cCB0byB0aGUgbmV4dCBub24tc3BhY2UgY2hhcmFjdGVyXG5cdFx0XHRcdGdvYmJsZVNwYWNlcyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHZhciBjaCA9IGV4cHJJQ29kZShpbmRleCk7XG5cdFx0XHRcdFx0Ly8gc3BhY2Ugb3IgdGFiXG5cdFx0XHRcdFx0d2hpbGUoY2ggPT09IDMyIHx8IGNoID09PSA5IHx8IGNoID09PSAxMCB8fCBjaCA9PT0gMTMpIHtcblx0XHRcdFx0XHRcdGNoID0gZXhwcklDb2RlKCsraW5kZXgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBUaGUgbWFpbiBwYXJzaW5nIGZ1bmN0aW9uLiBNdWNoIG9mIHRoaXMgY29kZSBpcyBkZWRpY2F0ZWQgdG8gdGVybmFyeSBleHByZXNzaW9uc1xuXHRcdFx0XHRnb2JibGVFeHByZXNzaW9uID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0dmFyIHRlc3QgPSBnb2JibGVCaW5hcnlFeHByZXNzaW9uKCksXG5cdFx0XHRcdFx0XHRjb25zZXF1ZW50LCBhbHRlcm5hdGU7XG5cdFx0XHRcdFx0Z29iYmxlU3BhY2VzKCk7XG5cdFx0XHRcdFx0aWYoZXhwcklDb2RlKGluZGV4KSA9PT0gUVVNQVJLX0NPREUpIHtcblx0XHRcdFx0XHRcdC8vIFRlcm5hcnkgZXhwcmVzc2lvbjogdGVzdCA/IGNvbnNlcXVlbnQgOiBhbHRlcm5hdGVcblx0XHRcdFx0XHRcdGluZGV4Kys7XG5cdFx0XHRcdFx0XHRjb25zZXF1ZW50ID0gZ29iYmxlRXhwcmVzc2lvbigpO1xuXHRcdFx0XHRcdFx0aWYoIWNvbnNlcXVlbnQpIHtcblx0XHRcdFx0XHRcdFx0dGhyb3dFcnJvcignRXhwZWN0ZWQgZXhwcmVzc2lvbicsIGluZGV4KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGdvYmJsZVNwYWNlcygpO1xuXHRcdFx0XHRcdFx0aWYoZXhwcklDb2RlKGluZGV4KSA9PT0gQ09MT05fQ09ERSkge1xuXHRcdFx0XHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHRcdFx0XHRhbHRlcm5hdGUgPSBnb2JibGVFeHByZXNzaW9uKCk7XG5cdFx0XHRcdFx0XHRcdGlmKCFhbHRlcm5hdGUpIHtcblx0XHRcdFx0XHRcdFx0XHR0aHJvd0Vycm9yKCdFeHBlY3RlZCBleHByZXNzaW9uJywgaW5kZXgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogQ09ORElUSU9OQUxfRVhQLFxuXHRcdFx0XHRcdFx0XHRcdHRlc3Q6IHRlc3QsXG5cdFx0XHRcdFx0XHRcdFx0Y29uc2VxdWVudDogY29uc2VxdWVudCxcblx0XHRcdFx0XHRcdFx0XHRhbHRlcm5hdGU6IGFsdGVybmF0ZVxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dGhyb3dFcnJvcignRXhwZWN0ZWQgOicsIGluZGV4KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRlc3Q7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFNlYXJjaCBmb3IgdGhlIG9wZXJhdGlvbiBwb3J0aW9uIG9mIHRoZSBzdHJpbmcgKGUuZy4gYCtgLCBgPT09YClcblx0XHRcdFx0Ly8gU3RhcnQgYnkgdGFraW5nIHRoZSBsb25nZXN0IHBvc3NpYmxlIGJpbmFyeSBvcGVyYXRpb25zICgzIGNoYXJhY3RlcnM6IGA9PT1gLCBgIT09YCwgYD4+PmApXG5cdFx0XHRcdC8vIGFuZCBtb3ZlIGRvd24gZnJvbSAzIHRvIDIgdG8gMSBjaGFyYWN0ZXIgdW50aWwgYSBtYXRjaGluZyBiaW5hcnkgb3BlcmF0aW9uIGlzIGZvdW5kXG5cdFx0XHRcdC8vIHRoZW4sIHJldHVybiB0aGF0IGJpbmFyeSBvcGVyYXRpb25cblx0XHRcdFx0Z29iYmxlQmluYXJ5T3AgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRnb2JibGVTcGFjZXMoKTtcblx0XHRcdFx0XHR2YXIgYmlvcCwgdG9fY2hlY2sgPSBleHByLnN1YnN0cihpbmRleCwgbWF4X2Jpbm9wX2xlbiksIHRjX2xlbiA9IHRvX2NoZWNrLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSh0Y19sZW4gPiAwKSB7XG5cdFx0XHRcdFx0XHRpZihiaW5hcnlfb3BzLmhhc093blByb3BlcnR5KHRvX2NoZWNrKSkge1xuXHRcdFx0XHRcdFx0XHRpbmRleCArPSB0Y19sZW47XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0b19jaGVjaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRvX2NoZWNrID0gdG9fY2hlY2suc3Vic3RyKDAsIC0tdGNfbGVuKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdvYmJsaW5nIGFuIGluZGl2aWR1YWwgZXhwcmVzc2lvbixcblx0XHRcdFx0Ly8gZS5nLiBgMWAsIGAxKzJgLCBgYSsoYioyKS1NYXRoLnNxcnQoMilgXG5cdFx0XHRcdGdvYmJsZUJpbmFyeUV4cHJlc3Npb24gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHR2YXIgY2hfaSwgbm9kZSwgYmlvcCwgcHJlYywgc3RhY2ssIGJpb3BfaW5mbywgbGVmdCwgcmlnaHQsIGk7XG5cblx0XHRcdFx0XHQvLyBGaXJzdCwgdHJ5IHRvIGdldCB0aGUgbGVmdG1vc3QgdGhpbmdcblx0XHRcdFx0XHQvLyBUaGVuLCBjaGVjayB0byBzZWUgaWYgdGhlcmUncyBhIGJpbmFyeSBvcGVyYXRvciBvcGVyYXRpbmcgb24gdGhhdCBsZWZ0bW9zdCB0aGluZ1xuXHRcdFx0XHRcdGxlZnQgPSBnb2JibGVUb2tlbigpO1xuXHRcdFx0XHRcdGJpb3AgPSBnb2JibGVCaW5hcnlPcCgpO1xuXG5cdFx0XHRcdFx0Ly8gSWYgdGhlcmUgd2Fzbid0IGEgYmluYXJ5IG9wZXJhdG9yLCBqdXN0IHJldHVybiB0aGUgbGVmdG1vc3Qgbm9kZVxuXHRcdFx0XHRcdGlmKCFiaW9wKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbGVmdDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIHdlIG5lZWQgdG8gc3RhcnQgYSBzdGFjayB0byBwcm9wZXJseSBwbGFjZSB0aGUgYmluYXJ5IG9wZXJhdGlvbnMgaW4gdGhlaXJcblx0XHRcdFx0XHQvLyBwcmVjZWRlbmNlIHN0cnVjdHVyZVxuXHRcdFx0XHRcdGJpb3BfaW5mbyA9IHsgdmFsdWU6IGJpb3AsIHByZWM6IGJpbmFyeVByZWNlZGVuY2UoYmlvcCl9O1xuXG5cdFx0XHRcdFx0cmlnaHQgPSBnb2JibGVUb2tlbigpO1xuXHRcdFx0XHRcdGlmKCFyaWdodCkge1xuXHRcdFx0XHRcdFx0dGhyb3dFcnJvcihcIkV4cGVjdGVkIGV4cHJlc3Npb24gYWZ0ZXIgXCIgKyBiaW9wLCBpbmRleCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHN0YWNrID0gW2xlZnQsIGJpb3BfaW5mbywgcmlnaHRdO1xuXG5cdFx0XHRcdFx0Ly8gUHJvcGVybHkgZGVhbCB3aXRoIHByZWNlZGVuY2UgdXNpbmcgW3JlY3Vyc2l2ZSBkZXNjZW50XShodHRwOi8vd3d3LmVuZ3IubXVuLmNhL350aGVvL01pc2MvZXhwX3BhcnNpbmcuaHRtKVxuXHRcdFx0XHRcdHdoaWxlKChiaW9wID0gZ29iYmxlQmluYXJ5T3AoKSkpIHtcblx0XHRcdFx0XHRcdHByZWMgPSBiaW5hcnlQcmVjZWRlbmNlKGJpb3ApO1xuXG5cdFx0XHRcdFx0XHRpZihwcmVjID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YmlvcF9pbmZvID0geyB2YWx1ZTogYmlvcCwgcHJlYzogcHJlYyB9O1xuXG5cdFx0XHRcdFx0XHQvLyBSZWR1Y2U6IG1ha2UgYSBiaW5hcnkgZXhwcmVzc2lvbiBmcm9tIHRoZSB0aHJlZSB0b3Btb3N0IGVudHJpZXMuXG5cdFx0XHRcdFx0XHR3aGlsZSAoKHN0YWNrLmxlbmd0aCA+IDIpICYmIChwcmVjIDw9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDJdLnByZWMpKSB7XG5cdFx0XHRcdFx0XHRcdHJpZ2h0ID0gc3RhY2sucG9wKCk7XG5cdFx0XHRcdFx0XHRcdGJpb3AgPSBzdGFjay5wb3AoKS52YWx1ZTtcblx0XHRcdFx0XHRcdFx0bGVmdCA9IHN0YWNrLnBvcCgpO1xuXHRcdFx0XHRcdFx0XHRub2RlID0gY3JlYXRlQmluYXJ5RXhwcmVzc2lvbihiaW9wLCBsZWZ0LCByaWdodCk7XG5cdFx0XHRcdFx0XHRcdHN0YWNrLnB1c2gobm9kZSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdG5vZGUgPSBnb2JibGVUb2tlbigpO1xuXHRcdFx0XHRcdFx0aWYoIW5vZGUpIHtcblx0XHRcdFx0XHRcdFx0dGhyb3dFcnJvcihcIkV4cGVjdGVkIGV4cHJlc3Npb24gYWZ0ZXIgXCIgKyBiaW9wLCBpbmRleCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRzdGFjay5wdXNoKGJpb3BfaW5mbywgbm9kZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aSA9IHN0YWNrLmxlbmd0aCAtIDE7XG5cdFx0XHRcdFx0bm9kZSA9IHN0YWNrW2ldO1xuXHRcdFx0XHRcdHdoaWxlKGkgPiAxKSB7XG5cdFx0XHRcdFx0XHRub2RlID0gY3JlYXRlQmluYXJ5RXhwcmVzc2lvbihzdGFja1tpIC0gMV0udmFsdWUsIHN0YWNrW2kgLSAyXSwgbm9kZSk7XG5cdFx0XHRcdFx0XHRpIC09IDI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBub2RlO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIEFuIGluZGl2aWR1YWwgcGFydCBvZiBhIGJpbmFyeSBleHByZXNzaW9uOlxuXHRcdFx0XHQvLyBlLmcuIGBmb28uYmFyKGJheilgLCBgMWAsIGBcImFiY1wiYCwgYChhICUgMilgIChiZWNhdXNlIGl0J3MgaW4gcGFyZW50aGVzaXMpXG5cdFx0XHRcdGdvYmJsZVRva2VuID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0dmFyIGNoLCB0b19jaGVjaywgdGNfbGVuO1xuXG5cdFx0XHRcdFx0Z29iYmxlU3BhY2VzKCk7XG5cdFx0XHRcdFx0Y2ggPSBleHBySUNvZGUoaW5kZXgpO1xuXG5cdFx0XHRcdFx0aWYoaXNEZWNpbWFsRGlnaXQoY2gpIHx8IGNoID09PSBQRVJJT0RfQ09ERSkge1xuXHRcdFx0XHRcdFx0Ly8gQ2hhciBjb2RlIDQ2IGlzIGEgZG90IGAuYCB3aGljaCBjYW4gc3RhcnQgb2ZmIGEgbnVtZXJpYyBsaXRlcmFsXG5cdFx0XHRcdFx0XHRyZXR1cm4gZ29iYmxlTnVtZXJpY0xpdGVyYWwoKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYoY2ggPT09IFNRVU9URV9DT0RFIHx8IGNoID09PSBEUVVPVEVfQ09ERSkge1xuXHRcdFx0XHRcdFx0Ly8gU2luZ2xlIG9yIGRvdWJsZSBxdW90ZXNcblx0XHRcdFx0XHRcdHJldHVybiBnb2JibGVTdHJpbmdMaXRlcmFsKCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmKGlzSWRlbnRpZmllclN0YXJ0KGNoKSB8fCBjaCA9PT0gT1BBUkVOX0NPREUpIHsgLy8gb3BlbiBwYXJlbnRoZXNpc1xuXHRcdFx0XHRcdFx0Ly8gYGZvb2AsIGBiYXIuYmF6YFxuXHRcdFx0XHRcdFx0cmV0dXJuIGdvYmJsZVZhcmlhYmxlKCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChjaCA9PT0gT0JSQUNLX0NPREUpIHtcblx0XHRcdFx0XHRcdHJldHVybiBnb2JibGVBcnJheSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0b19jaGVjayA9IGV4cHIuc3Vic3RyKGluZGV4LCBtYXhfdW5vcF9sZW4pO1xuXHRcdFx0XHRcdFx0dGNfbGVuID0gdG9fY2hlY2subGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUodGNfbGVuID4gMCkge1xuXHRcdFx0XHRcdFx0XHRpZih1bmFyeV9vcHMuaGFzT3duUHJvcGVydHkodG9fY2hlY2spKSB7XG5cdFx0XHRcdFx0XHRcdFx0aW5kZXggKz0gdGNfbGVuO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBVTkFSWV9FWFAsXG5cdFx0XHRcdFx0XHRcdFx0XHRvcGVyYXRvcjogdG9fY2hlY2ssXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmd1bWVudDogZ29iYmxlVG9rZW4oKSxcblx0XHRcdFx0XHRcdFx0XHRcdHByZWZpeDogdHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dG9fY2hlY2sgPSB0b19jaGVjay5zdWJzdHIoMCwgLS10Y19sZW4pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyBQYXJzZSBzaW1wbGUgbnVtZXJpYyBsaXRlcmFsczogYDEyYCwgYDMuNGAsIGAuNWAuIERvIHRoaXMgYnkgdXNpbmcgYSBzdHJpbmcgdG9cblx0XHRcdFx0Ly8ga2VlcCB0cmFjayBvZiBldmVyeXRoaW5nIGluIHRoZSBudW1lcmljIGxpdGVyYWwgYW5kIHRoZW4gY2FsbGluZyBgcGFyc2VGbG9hdGAgb24gdGhhdCBzdHJpbmdcblx0XHRcdFx0Z29iYmxlTnVtZXJpY0xpdGVyYWwgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHR2YXIgbnVtYmVyID0gJycsIGNoLCBjaENvZGU7XG5cdFx0XHRcdFx0d2hpbGUoaXNEZWNpbWFsRGlnaXQoZXhwcklDb2RlKGluZGV4KSkpIHtcblx0XHRcdFx0XHRcdG51bWJlciArPSBleHBySShpbmRleCsrKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZihleHBySUNvZGUoaW5kZXgpID09PSBQRVJJT0RfQ09ERSkgeyAvLyBjYW4gc3RhcnQgd2l0aCBhIGRlY2ltYWwgbWFya2VyXG5cdFx0XHRcdFx0XHRudW1iZXIgKz0gZXhwckkoaW5kZXgrKyk7XG5cblx0XHRcdFx0XHRcdHdoaWxlKGlzRGVjaW1hbERpZ2l0KGV4cHJJQ29kZShpbmRleCkpKSB7XG5cdFx0XHRcdFx0XHRcdG51bWJlciArPSBleHBySShpbmRleCsrKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjaCA9IGV4cHJJKGluZGV4KTtcblx0XHRcdFx0XHRpZihjaCA9PT0gJ2UnIHx8IGNoID09PSAnRScpIHsgLy8gZXhwb25lbnQgbWFya2VyXG5cdFx0XHRcdFx0XHRudW1iZXIgKz0gZXhwckkoaW5kZXgrKyk7XG5cdFx0XHRcdFx0XHRjaCA9IGV4cHJJKGluZGV4KTtcblx0XHRcdFx0XHRcdGlmKGNoID09PSAnKycgfHwgY2ggPT09ICctJykgeyAvLyBleHBvbmVudCBzaWduXG5cdFx0XHRcdFx0XHRcdG51bWJlciArPSBleHBySShpbmRleCsrKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHdoaWxlKGlzRGVjaW1hbERpZ2l0KGV4cHJJQ29kZShpbmRleCkpKSB7IC8vZXhwb25lbnQgaXRzZWxmXG5cdFx0XHRcdFx0XHRcdG51bWJlciArPSBleHBySShpbmRleCsrKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmKCFpc0RlY2ltYWxEaWdpdChleHBySUNvZGUoaW5kZXgtMSkpICkge1xuXHRcdFx0XHRcdFx0XHR0aHJvd0Vycm9yKCdFeHBlY3RlZCBleHBvbmVudCAoJyArIG51bWJlciArIGV4cHJJKGluZGV4KSArICcpJywgaW5kZXgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdFx0Y2hDb2RlID0gZXhwcklDb2RlKGluZGV4KTtcblx0XHRcdFx0XHQvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhpcyBpc24ndCBhIHZhcmlhYmxlIG5hbWUgdGhhdCBzdGFydCB3aXRoIGEgbnVtYmVyICgxMjNhYmMpXG5cdFx0XHRcdFx0aWYoaXNJZGVudGlmaWVyU3RhcnQoY2hDb2RlKSkge1xuXHRcdFx0XHRcdFx0dGhyb3dFcnJvcignVmFyaWFibGUgbmFtZXMgY2Fubm90IHN0YXJ0IHdpdGggYSBudW1iZXIgKCcgK1xuXHRcdFx0XHRcdFx0XHRcdFx0bnVtYmVyICsgZXhwckkoaW5kZXgpICsgJyknLCBpbmRleCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmKGNoQ29kZSA9PT0gUEVSSU9EX0NPREUpIHtcblx0XHRcdFx0XHRcdHRocm93RXJyb3IoJ1VuZXhwZWN0ZWQgcGVyaW9kJywgaW5kZXgpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHR0eXBlOiBMSVRFUkFMLFxuXHRcdFx0XHRcdFx0dmFsdWU6IHBhcnNlRmxvYXQobnVtYmVyKSxcblx0XHRcdFx0XHRcdHJhdzogbnVtYmVyXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBQYXJzZXMgYSBzdHJpbmcgbGl0ZXJhbCwgc3RhcmluZyB3aXRoIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzIHdpdGggYmFzaWMgc3VwcG9ydCBmb3IgZXNjYXBlIGNvZGVzXG5cdFx0XHRcdC8vIGUuZy4gYFwiaGVsbG8gd29ybGRcImAsIGAndGhpcyBpc1xcbkpTRVAnYFxuXHRcdFx0XHRnb2JibGVTdHJpbmdMaXRlcmFsID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0dmFyIHN0ciA9ICcnLCBxdW90ZSA9IGV4cHJJKGluZGV4KyspLCBjbG9zZWQgPSBmYWxzZSwgY2g7XG5cblx0XHRcdFx0XHR3aGlsZShpbmRleCA8IGxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Y2ggPSBleHBySShpbmRleCsrKTtcblx0XHRcdFx0XHRcdGlmKGNoID09PSBxdW90ZSkge1xuXHRcdFx0XHRcdFx0XHRjbG9zZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH0gZWxzZSBpZihjaCA9PT0gJ1xcXFwnKSB7XG5cdFx0XHRcdFx0XHRcdC8vIENoZWNrIGZvciBhbGwgb2YgdGhlIGNvbW1vbiBlc2NhcGUgY29kZXNcblx0XHRcdFx0XHRcdFx0Y2ggPSBleHBySShpbmRleCsrKTtcblx0XHRcdFx0XHRcdFx0c3dpdGNoKGNoKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSAnbic6IHN0ciArPSAnXFxuJzsgYnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSAncic6IHN0ciArPSAnXFxyJzsgYnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSAndCc6IHN0ciArPSAnXFx0JzsgYnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSAnYic6IHN0ciArPSAnXFxiJzsgYnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSAnZic6IHN0ciArPSAnXFxmJzsgYnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSAndic6IHN0ciArPSAnXFx4MEInOyBicmVhaztcblx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0IDogc3RyICs9ICdcXFxcJyArIGNoO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzdHIgKz0gY2g7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYoIWNsb3NlZCkge1xuXHRcdFx0XHRcdFx0dGhyb3dFcnJvcignVW5jbG9zZWQgcXVvdGUgYWZ0ZXIgXCInK3N0cisnXCInLCBpbmRleCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdHR5cGU6IExJVEVSQUwsXG5cdFx0XHRcdFx0XHR2YWx1ZTogc3RyLFxuXHRcdFx0XHRcdFx0cmF3OiBxdW90ZSArIHN0ciArIHF1b3RlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBHb2JibGVzIG9ubHkgaWRlbnRpZmllcnNcblx0XHRcdFx0Ly8gZS5nLjogYGZvb2AsIGBfdmFsdWVgLCBgJHgxYFxuXHRcdFx0XHQvLyBBbHNvLCB0aGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGF0IGlkZW50aWZpZXIgaXMgYSBsaXRlcmFsOlxuXHRcdFx0XHQvLyAoZS5nLiBgdHJ1ZWAsIGBmYWxzZWAsIGBudWxsYCkgb3IgYHRoaXNgXG5cdFx0XHRcdGdvYmJsZUlkZW50aWZpZXIgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHR2YXIgY2ggPSBleHBySUNvZGUoaW5kZXgpLCBzdGFydCA9IGluZGV4LCBpZGVudGlmaWVyO1xuXG5cdFx0XHRcdFx0aWYoaXNJZGVudGlmaWVyU3RhcnQoY2gpKSB7XG5cdFx0XHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0aHJvd0Vycm9yKCdVbmV4cGVjdGVkICcgKyBleHBySShpbmRleCksIGluZGV4KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR3aGlsZShpbmRleCA8IGxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Y2ggPSBleHBySUNvZGUoaW5kZXgpO1xuXHRcdFx0XHRcdFx0aWYoaXNJZGVudGlmaWVyUGFydChjaCkpIHtcblx0XHRcdFx0XHRcdFx0aW5kZXgrKztcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZGVudGlmaWVyID0gZXhwci5zbGljZShzdGFydCwgaW5kZXgpO1xuXG5cdFx0XHRcdFx0aWYobGl0ZXJhbHMuaGFzT3duUHJvcGVydHkoaWRlbnRpZmllcikpIHtcblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IExJVEVSQUwsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiBsaXRlcmFsc1tpZGVudGlmaWVyXSxcblx0XHRcdFx0XHRcdFx0cmF3OiBpZGVudGlmaWVyXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH0gZWxzZSBpZihpZGVudGlmaWVyID09PSB0aGlzX3N0cikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHsgdHlwZTogVEhJU19FWFAgfTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0dHlwZTogSURFTlRJRklFUixcblx0XHRcdFx0XHRcdFx0bmFtZTogaWRlbnRpZmllclxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gR29iYmxlcyBhIGxpc3Qgb2YgYXJndW1lbnRzIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhIGZ1bmN0aW9uIGNhbGxcblx0XHRcdFx0Ly8gb3IgYXJyYXkgbGl0ZXJhbC4gVGhpcyBmdW5jdGlvbiBhbHNvIGFzc3VtZXMgdGhhdCB0aGUgb3BlbmluZyBjaGFyYWN0ZXJcblx0XHRcdFx0Ly8gYChgIG9yIGBbYCBoYXMgYWxyZWFkeSBiZWVuIGdvYmJsZWQsIGFuZCBnb2JibGVzIGV4cHJlc3Npb25zIGFuZCBjb21tYXNcblx0XHRcdFx0Ly8gdW50aWwgdGhlIHRlcm1pbmF0b3IgY2hhcmFjdGVyIGApYCBvciBgXWAgaXMgZW5jb3VudGVyZWQuXG5cdFx0XHRcdC8vIGUuZy4gYGZvbyhiYXIsIGJheilgLCBgbXlfZnVuYygpYCwgb3IgYFtiYXIsIGJhel1gXG5cdFx0XHRcdGdvYmJsZUFyZ3VtZW50cyA9IGZ1bmN0aW9uKHRlcm1pbmF0aW9uKSB7XG5cdFx0XHRcdFx0dmFyIGNoX2ksIGFyZ3MgPSBbXSwgbm9kZSwgY2xvc2VkID0gZmFsc2U7XG5cdFx0XHRcdFx0d2hpbGUoaW5kZXggPCBsZW5ndGgpIHtcblx0XHRcdFx0XHRcdGdvYmJsZVNwYWNlcygpO1xuXHRcdFx0XHRcdFx0Y2hfaSA9IGV4cHJJQ29kZShpbmRleCk7XG5cdFx0XHRcdFx0XHRpZihjaF9pID09PSB0ZXJtaW5hdGlvbikgeyAvLyBkb25lIHBhcnNpbmdcblx0XHRcdFx0XHRcdFx0Y2xvc2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0aW5kZXgrKztcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGNoX2kgPT09IENPTU1BX0NPREUpIHsgLy8gYmV0d2VlbiBleHByZXNzaW9uc1xuXHRcdFx0XHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0bm9kZSA9IGdvYmJsZUV4cHJlc3Npb24oKTtcblx0XHRcdFx0XHRcdFx0aWYoIW5vZGUgfHwgbm9kZS50eXBlID09PSBDT01QT1VORCkge1xuXHRcdFx0XHRcdFx0XHRcdHRocm93RXJyb3IoJ0V4cGVjdGVkIGNvbW1hJywgaW5kZXgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGFyZ3MucHVzaChub2RlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFjbG9zZWQpIHtcblx0XHRcdFx0XHRcdHRocm93RXJyb3IoJ0V4cGVjdGVkICcgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKHRlcm1pbmF0aW9uKSwgaW5kZXgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gYXJncztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBHb2JibGUgYSBub24tbGl0ZXJhbCB2YXJpYWJsZSBuYW1lLiBUaGlzIHZhcmlhYmxlIG5hbWUgbWF5IGluY2x1ZGUgcHJvcGVydGllc1xuXHRcdFx0XHQvLyBlLmcuIGBmb29gLCBgYmFyLmJhemAsIGBmb29bJ2JhciddLmJhemBcblx0XHRcdFx0Ly8gSXQgYWxzbyBnb2JibGVzIGZ1bmN0aW9uIGNhbGxzOlxuXHRcdFx0XHQvLyBlLmcuIGBNYXRoLmFjb3Mob2JqLmFuZ2xlKWBcblx0XHRcdFx0Z29iYmxlVmFyaWFibGUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHR2YXIgY2hfaSwgbm9kZTtcblx0XHRcdFx0XHRjaF9pID0gZXhwcklDb2RlKGluZGV4KTtcblxuXHRcdFx0XHRcdGlmKGNoX2kgPT09IE9QQVJFTl9DT0RFKSB7XG5cdFx0XHRcdFx0XHRub2RlID0gZ29iYmxlR3JvdXAoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bm9kZSA9IGdvYmJsZUlkZW50aWZpZXIoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Z29iYmxlU3BhY2VzKCk7XG5cdFx0XHRcdFx0Y2hfaSA9IGV4cHJJQ29kZShpbmRleCk7XG5cdFx0XHRcdFx0d2hpbGUoY2hfaSA9PT0gUEVSSU9EX0NPREUgfHwgY2hfaSA9PT0gT0JSQUNLX0NPREUgfHwgY2hfaSA9PT0gT1BBUkVOX0NPREUpIHtcblx0XHRcdFx0XHRcdGluZGV4Kys7XG5cdFx0XHRcdFx0XHRpZihjaF9pID09PSBQRVJJT0RfQ09ERSkge1xuXHRcdFx0XHRcdFx0XHRnb2JibGVTcGFjZXMoKTtcblx0XHRcdFx0XHRcdFx0bm9kZSA9IHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBNRU1CRVJfRVhQLFxuXHRcdFx0XHRcdFx0XHRcdGNvbXB1dGVkOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRvYmplY3Q6IG5vZGUsXG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk6IGdvYmJsZUlkZW50aWZpZXIoKVxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmKGNoX2kgPT09IE9CUkFDS19DT0RFKSB7XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSB7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogTUVNQkVSX0VYUCxcblx0XHRcdFx0XHRcdFx0XHRjb21wdXRlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRvYmplY3Q6IG5vZGUsXG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk6IGdvYmJsZUV4cHJlc3Npb24oKVxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRnb2JibGVTcGFjZXMoKTtcblx0XHRcdFx0XHRcdFx0Y2hfaSA9IGV4cHJJQ29kZShpbmRleCk7XG5cdFx0XHRcdFx0XHRcdGlmKGNoX2kgIT09IENCUkFDS19DT0RFKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhyb3dFcnJvcignVW5jbG9zZWQgWycsIGluZGV4KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmKGNoX2kgPT09IE9QQVJFTl9DT0RFKSB7XG5cdFx0XHRcdFx0XHRcdC8vIEEgZnVuY3Rpb24gY2FsbCBpcyBiZWluZyBtYWRlOyBnb2JibGUgYWxsIHRoZSBhcmd1bWVudHNcblx0XHRcdFx0XHRcdFx0bm9kZSA9IHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBDQUxMX0VYUCxcblx0XHRcdFx0XHRcdFx0XHQnYXJndW1lbnRzJzogZ29iYmxlQXJndW1lbnRzKENQQVJFTl9DT0RFKSxcblx0XHRcdFx0XHRcdFx0XHRjYWxsZWU6IG5vZGVcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGdvYmJsZVNwYWNlcygpO1xuXHRcdFx0XHRcdFx0Y2hfaSA9IGV4cHJJQ29kZShpbmRleCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBub2RlO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIGEgZ3JvdXAgb2YgdGhpbmdzIHdpdGhpbiBwYXJlbnRoZXNlcyBgKClgXG5cdFx0XHRcdC8vIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGl0IG5lZWRzIHRvIGdvYmJsZSB0aGUgb3BlbmluZyBwYXJlbnRoZXNpc1xuXHRcdFx0XHQvLyBhbmQgdGhlbiB0cmllcyB0byBnb2JibGUgZXZlcnl0aGluZyB3aXRoaW4gdGhhdCBwYXJlbnRoZXNpcywgYXNzdW1pbmdcblx0XHRcdFx0Ly8gdGhhdCB0aGUgbmV4dCB0aGluZyBpdCBzaG91bGQgc2VlIGlzIHRoZSBjbG9zZSBwYXJlbnRoZXNpcy4gSWYgbm90LFxuXHRcdFx0XHQvLyB0aGVuIHRoZSBleHByZXNzaW9uIHByb2JhYmx5IGRvZXNuJ3QgaGF2ZSBhIGApYFxuXHRcdFx0XHRnb2JibGVHcm91cCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGluZGV4Kys7XG5cdFx0XHRcdFx0dmFyIG5vZGUgPSBnb2JibGVFeHByZXNzaW9uKCk7XG5cdFx0XHRcdFx0Z29iYmxlU3BhY2VzKCk7XG5cdFx0XHRcdFx0aWYoZXhwcklDb2RlKGluZGV4KSA9PT0gQ1BBUkVOX0NPREUpIHtcblx0XHRcdFx0XHRcdGluZGV4Kys7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbm9kZTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGhyb3dFcnJvcignVW5jbG9zZWQgKCcsIGluZGV4KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gUmVzcG9uc2libGUgZm9yIHBhcnNpbmcgQXJyYXkgbGl0ZXJhbHMgYFsxLCAyLCAzXWBcblx0XHRcdFx0Ly8gVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgaXQgbmVlZHMgdG8gZ29iYmxlIHRoZSBvcGVuaW5nIGJyYWNrZXRcblx0XHRcdFx0Ly8gYW5kIHRoZW4gdHJpZXMgdG8gZ29iYmxlIHRoZSBleHByZXNzaW9ucyBhcyBhcmd1bWVudHMuXG5cdFx0XHRcdGdvYmJsZUFycmF5ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aW5kZXgrKztcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0dHlwZTogQVJSQVlfRVhQLFxuXHRcdFx0XHRcdFx0ZWxlbWVudHM6IGdvYmJsZUFyZ3VtZW50cyhDQlJBQ0tfQ09ERSlcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdG5vZGVzID0gW10sIGNoX2ksIG5vZGU7XG5cblx0XHRcdHdoaWxlKGluZGV4IDwgbGVuZ3RoKSB7XG5cdFx0XHRcdGNoX2kgPSBleHBySUNvZGUoaW5kZXgpO1xuXG5cdFx0XHRcdC8vIEV4cHJlc3Npb25zIGNhbiBiZSBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucywgY29tbWFzLCBvciBqdXN0IGluZmVycmVkIHdpdGhvdXQgYW55XG5cdFx0XHRcdC8vIHNlcGFyYXRvcnNcblx0XHRcdFx0aWYoY2hfaSA9PT0gU0VNQ09MX0NPREUgfHwgY2hfaSA9PT0gQ09NTUFfQ09ERSkge1xuXHRcdFx0XHRcdGluZGV4Kys7IC8vIGlnbm9yZSBzZXBhcmF0b3JzXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gVHJ5IHRvIGdvYmJsZSBlYWNoIGV4cHJlc3Npb24gaW5kaXZpZHVhbGx5XG5cdFx0XHRcdFx0aWYoKG5vZGUgPSBnb2JibGVFeHByZXNzaW9uKCkpKSB7XG5cdFx0XHRcdFx0XHRub2Rlcy5wdXNoKG5vZGUpO1xuXHRcdFx0XHRcdC8vIElmIHdlIHdlcmVuJ3QgYWJsZSB0byBmaW5kIGEgYmluYXJ5IGV4cHJlc3Npb24gYW5kIGFyZSBvdXQgb2Ygcm9vbSwgdGhlblxuXHRcdFx0XHRcdC8vIHRoZSBleHByZXNzaW9uIHBhc3NlZCBpbiBwcm9iYWJseSBoYXMgdG9vIG11Y2hcblx0XHRcdFx0XHR9IGVsc2UgaWYoaW5kZXggPCBsZW5ndGgpIHtcblx0XHRcdFx0XHRcdHRocm93RXJyb3IoJ1VuZXhwZWN0ZWQgXCInICsgZXhwckkoaW5kZXgpICsgJ1wiJywgaW5kZXgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGVyZSdzIG9ubHkgb25lIGV4cHJlc3Npb24ganVzdCB0cnkgcmV0dXJuaW5nIHRoZSBleHByZXNzaW9uXG5cdFx0XHRpZihub2Rlcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0cmV0dXJuIG5vZGVzWzBdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHR0eXBlOiBDT01QT1VORCxcblx0XHRcdFx0XHRib2R5OiBub2Rlc1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH07XG5cblx0Ly8gVG8gYmUgZmlsbGVkIGluIGJ5IHRoZSB0ZW1wbGF0ZVxuXHRqc2VwLnZlcnNpb24gPSAnPCU9IHZlcnNpb24gJT4nO1xuXHRqc2VwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAnSmF2YVNjcmlwdCBFeHByZXNzaW9uIFBhcnNlciAoSlNFUCkgdicgKyBqc2VwLnZlcnNpb247IH07XG5cblx0LyoqXG5cdCAqIEBtZXRob2QganNlcC5hZGRVbmFyeU9wXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvcF9uYW1lIFRoZSBuYW1lIG9mIHRoZSB1bmFyeSBvcCB0byBhZGRcblx0ICogQHJldHVybiBqc2VwXG5cdCAqL1xuXHRqc2VwLmFkZFVuYXJ5T3AgPSBmdW5jdGlvbihvcF9uYW1lKSB7XG5cdFx0bWF4X3Vub3BfbGVuID0gTWF0aC5tYXgob3BfbmFtZS5sZW5ndGgsIG1heF91bm9wX2xlbik7XG5cdFx0dW5hcnlfb3BzW29wX25hbWVdID0gdDsgcmV0dXJuIHRoaXM7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBtZXRob2QganNlcC5hZGRCaW5hcnlPcFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gb3BfbmFtZSBUaGUgbmFtZSBvZiB0aGUgYmluYXJ5IG9wIHRvIGFkZFxuXHQgKiBAcGFyYW0ge251bWJlcn0gcHJlY2VkZW5jZSBUaGUgcHJlY2VkZW5jZSBvZiB0aGUgYmluYXJ5IG9wIChjYW4gYmUgYSBmbG9hdClcblx0ICogQHJldHVybiBqc2VwXG5cdCAqL1xuXHRqc2VwLmFkZEJpbmFyeU9wID0gZnVuY3Rpb24ob3BfbmFtZSwgcHJlY2VkZW5jZSkge1xuXHRcdG1heF9iaW5vcF9sZW4gPSBNYXRoLm1heChvcF9uYW1lLmxlbmd0aCwgbWF4X2Jpbm9wX2xlbik7XG5cdFx0YmluYXJ5X29wc1tvcF9uYW1lXSA9IHByZWNlZGVuY2U7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBtZXRob2QganNlcC5hZGRMaXRlcmFsXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsaXRlcmFsX25hbWUgVGhlIG5hbWUgb2YgdGhlIGxpdGVyYWwgdG8gYWRkXG5cdCAqIEBwYXJhbSB7Kn0gbGl0ZXJhbF92YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGxpdGVyYWxcblx0ICogQHJldHVybiBqc2VwXG5cdCAqL1xuXHRqc2VwLmFkZExpdGVyYWwgPSBmdW5jdGlvbihsaXRlcmFsX25hbWUsIGxpdGVyYWxfdmFsdWUpIHtcblx0XHRsaXRlcmFsc1tsaXRlcmFsX25hbWVdID0gbGl0ZXJhbF92YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHQvKipcblx0ICogQG1ldGhvZCBqc2VwLnJlbW92ZVVuYXJ5T3Bcblx0ICogQHBhcmFtIHtzdHJpbmd9IG9wX25hbWUgVGhlIG5hbWUgb2YgdGhlIHVuYXJ5IG9wIHRvIHJlbW92ZVxuXHQgKiBAcmV0dXJuIGpzZXBcblx0ICovXG5cdGpzZXAucmVtb3ZlVW5hcnlPcCA9IGZ1bmN0aW9uKG9wX25hbWUpIHtcblx0XHRkZWxldGUgdW5hcnlfb3BzW29wX25hbWVdO1xuXHRcdGlmKG9wX25hbWUubGVuZ3RoID09PSBtYXhfdW5vcF9sZW4pIHtcblx0XHRcdG1heF91bm9wX2xlbiA9IGdldE1heEtleUxlbih1bmFyeV9vcHMpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHQvKipcblx0ICogQG1ldGhvZCBqc2VwLnJlbW92ZUFsbFVuYXJ5T3BzXG5cdCAqIEByZXR1cm4ganNlcFxuXHQgKi9cblx0anNlcC5yZW1vdmVBbGxVbmFyeU9wcyA9IGZ1bmN0aW9uKCkge1xuXHRcdHVuYXJ5X29wcyA9IHt9O1xuXHRcdG1heF91bm9wX2xlbiA9IDA7XG5cdFx0XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBtZXRob2QganNlcC5yZW1vdmVCaW5hcnlPcFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gb3BfbmFtZSBUaGUgbmFtZSBvZiB0aGUgYmluYXJ5IG9wIHRvIHJlbW92ZVxuXHQgKiBAcmV0dXJuIGpzZXBcblx0ICovXG5cdGpzZXAucmVtb3ZlQmluYXJ5T3AgPSBmdW5jdGlvbihvcF9uYW1lKSB7XG5cdFx0ZGVsZXRlIGJpbmFyeV9vcHNbb3BfbmFtZV07XG5cdFx0aWYob3BfbmFtZS5sZW5ndGggPT09IG1heF9iaW5vcF9sZW4pIHtcblx0XHRcdG1heF9iaW5vcF9sZW4gPSBnZXRNYXhLZXlMZW4oYmluYXJ5X29wcyk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAbWV0aG9kIGpzZXAucmVtb3ZlQWxsQmluYXJ5T3BzXG5cdCAqIEByZXR1cm4ganNlcFxuXHQgKi9cblx0anNlcC5yZW1vdmVBbGxCaW5hcnlPcHMgPSBmdW5jdGlvbigpIHtcblx0XHRiaW5hcnlfb3BzID0ge307XG5cdFx0bWF4X2Jpbm9wX2xlbiA9IDA7XG5cdFx0XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBtZXRob2QganNlcC5yZW1vdmVMaXRlcmFsXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsaXRlcmFsX25hbWUgVGhlIG5hbWUgb2YgdGhlIGxpdGVyYWwgdG8gcmVtb3ZlXG5cdCAqIEByZXR1cm4ganNlcFxuXHQgKi9cblx0anNlcC5yZW1vdmVMaXRlcmFsID0gZnVuY3Rpb24obGl0ZXJhbF9uYW1lKSB7XG5cdFx0ZGVsZXRlIGxpdGVyYWxzW2xpdGVyYWxfbmFtZV07XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBtZXRob2QganNlcC5yZW1vdmVBbGxMaXRlcmFsc1xuXHQgKiBAcmV0dXJuIGpzZXBcblx0ICovXG5cdGpzZXAucmVtb3ZlQWxsTGl0ZXJhbHMgPSBmdW5jdGlvbigpIHtcblx0XHRsaXRlcmFscyA9IHt9O1xuXHRcdFxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdC8vIEluIGRlc2t0b3AgZW52aXJvbm1lbnRzLCBoYXZlIGEgd2F5IHRvIHJlc3RvcmUgdGhlIG9sZCB2YWx1ZSBmb3IgYGpzZXBgXG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR2YXIgb2xkX2pzZXAgPSByb290LmpzZXA7XG5cdFx0Ly8gVGhlIHN0YXIgb2YgdGhlIHNob3chIEl0J3MgYSBmdW5jdGlvbiFcblx0XHRyb290LmpzZXAgPSBqc2VwO1xuXHRcdC8vIEFuZCBhIGNvdXJ0ZW91cyBmdW5jdGlvbiB3aWxsaW5nIHRvIG1vdmUgb3V0IG9mIHRoZSB3YXkgZm9yIG90aGVyIHNpbWlsYXJseS1uYW1lZCBvYmplY3RzIVxuXHRcdGpzZXAubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYocm9vdC5qc2VwID09PSBqc2VwKSB7XG5cdFx0XHRcdHJvb3QuanNlcCA9IG9sZF9qc2VwO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGpzZXA7XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHQvLyBJbiBOb2RlLkpTIGVudmlyb25tZW50c1xuXHRcdGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuXHRcdFx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0ganNlcDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5wYXJzZSA9IGpzZXA7XG5cdFx0fVxuXHR9XG59KHRoaXMpKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG1ha2VKdWljZUNsaWVudChqdWljZUNsaWVudCkge1xuXG5qdWljZUNsaWVudC5pZ25vcmVkUHNldWRvcyA9IFsnaG92ZXInLCAnYWN0aXZlJywgJ2ZvY3VzJywgJ3Zpc2l0ZWQnLCAnbGluayddO1xuanVpY2VDbGllbnQud2lkdGhFbGVtZW50cyA9IFsnVEFCTEUnLCAnVEQnLCAnSU1HJ107XG5qdWljZUNsaWVudC5oZWlnaHRFbGVtZW50cyA9IFsnVEFCTEUnLCAnVEQnLCAnSU1HJ107XG5qdWljZUNsaWVudC50YWJsZUVsZW1lbnRzID0gWydUQUJMRScsICdURCcsICdUSCcsICdUUicsICdURCcsICdDQVBUSU9OJywgJ0NPTEdST1VQJywgJ0NPTCcsICdUSEVBRCcsICdUQk9EWScsICdURk9PVCddO1xuanVpY2VDbGllbnQubm9uVmlzdWFsRWxlbWVudHMgPSBbICdIRUFEJywgJ1RJVExFJywgJ0JBU0UnLCAnTElOSycsICdTVFlMRScsICdNRVRBJywgJ1NDUklQVCcsICdOT1NDUklQVCcgXTtcbmp1aWNlQ2xpZW50LnN0eWxlVG9BdHRyaWJ1dGUgPSB7XG4gICdiYWNrZ3JvdW5kLWNvbG9yJzogJ2JnY29sb3InLFxuICAnYmFja2dyb3VuZC1pbWFnZSc6ICdiYWNrZ3JvdW5kJyxcbiAgJ3RleHQtYWxpZ24nOiAnYWxpZ24nLFxuICAndmVydGljYWwtYWxpZ24nOiAndmFsaWduJ1xufTtcbmp1aWNlQ2xpZW50LmV4Y2x1ZGVkUHJvcGVydGllcyA9IFtdO1xuXG5qdWljZUNsaWVudC5qdWljZURvY3VtZW50ID0ganVpY2VEb2N1bWVudDtcbmp1aWNlQ2xpZW50LmlubGluZURvY3VtZW50ID0gaW5saW5lRG9jdW1lbnQ7XG5cbmZ1bmN0aW9uIGlubGluZURvY3VtZW50KCQsIGNzcywgb3B0aW9ucykge1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcnVsZXMgPSB1dGlscy5wYXJzZUNTUyhjc3MpO1xuICB2YXIgZWRpdGVkRWxlbWVudHMgPSBbXTtcbiAgdmFyIHN0eWxlQXR0cmlidXRlTmFtZSA9ICdzdHlsZSc7XG4gIFxuICBpZiAob3B0aW9ucy5zdHlsZUF0dHJpYnV0ZU5hbWUpIHtcbiAgICBzdHlsZUF0dHJpYnV0ZU5hbWUgPSBvcHRpb25zLnN0eWxlQXR0cmlidXRlTmFtZTtcbiAgfVxuXG4gIHJ1bGVzLmZvckVhY2goaGFuZGxlUnVsZSk7XG4gIGVkaXRlZEVsZW1lbnRzLmZvckVhY2goc2V0U3R5bGVBdHRycyk7XG5cbiAgaWYgKG9wdGlvbnMuaW5saW5lUHNldWRvRWxlbWVudHMpIHtcbiAgICBlZGl0ZWRFbGVtZW50cy5mb3JFYWNoKGlubGluZVBzZXVkb0VsZW1lbnRzKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmFwcGx5V2lkdGhBdHRyaWJ1dGVzKSB7XG4gICAgZWRpdGVkRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbCkge1xuICAgICAgc2V0RGltZW5zaW9uQXR0cnMoZWwsICd3aWR0aCcpO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuYXBwbHlIZWlnaHRBdHRyaWJ1dGVzKSB7XG4gICAgZWRpdGVkRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbCkge1xuICAgICAgc2V0RGltZW5zaW9uQXR0cnMoZWwsICdoZWlnaHQnKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmFwcGx5QXR0cmlidXRlc1RhYmxlRWxlbWVudHMpIHtcbiAgICBlZGl0ZWRFbGVtZW50cy5mb3JFYWNoKHNldEF0dHJpYnV0ZXNPblRhYmxlRWxlbWVudHMpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuaW5zZXJ0UHJlc2VydmVkRXh0cmFDc3MgJiYgb3B0aW9ucy5leHRyYUNzcykge1xuICAgIHZhciBwcmVzZXJ2ZWRUZXh0ID0gdXRpbHMuZ2V0UHJlc2VydmVkVGV4dChvcHRpb25zLmV4dHJhQ3NzLCB7XG4gICAgICBtZWRpYVF1ZXJpZXM6IG9wdGlvbnMucHJlc2VydmVNZWRpYVF1ZXJpZXMsXG4gICAgICBmb250RmFjZXM6IG9wdGlvbnMucHJlc2VydmVGb250RmFjZXNcbiAgICB9KTtcbiAgICBpZiAocHJlc2VydmVkVGV4dCkge1xuICAgICAgdmFyICRhcHBlbmRUbyA9IG51bGw7XG4gICAgICBpZiAob3B0aW9ucy5pbnNlcnRQcmVzZXJ2ZWRFeHRyYUNzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAkYXBwZW5kVG8gPSAkKG9wdGlvbnMuaW5zZXJ0UHJlc2VydmVkRXh0cmFDc3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJGFwcGVuZFRvID0gJCgnaGVhZCcpO1xuICAgICAgICBpZiAoISRhcHBlbmRUby5sZW5ndGgpIHsgJGFwcGVuZFRvID0gJCgnYm9keScpOyB9XG4gICAgICAgIGlmICghJGFwcGVuZFRvLmxlbmd0aCkgeyAkYXBwZW5kVG8gPSAkLnJvb3QoKTsgfVxuICAgICAgfVxuXG4gICAgICAkYXBwZW5kVG8uZmlyc3QoKS5hcHBlbmQoJzxzdHlsZT4nICsgcHJlc2VydmVkVGV4dCArICc8L3N0eWxlPicpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZVJ1bGUocnVsZSkge1xuICAgIHZhciBzZWwgPSBydWxlWzBdO1xuICAgIHZhciBzdHlsZSA9IHJ1bGVbMV07XG4gICAgdmFyIHNlbGVjdG9yID0gbmV3IHV0aWxzLlNlbGVjdG9yKHNlbCk7XG4gICAgdmFyIHBhcnNlZFNlbGVjdG9yID0gc2VsZWN0b3IucGFyc2VkKCk7XG4gICAgdmFyIHBzZXVkb0VsZW1lbnRUeXBlID0gZ2V0UHNldWRvRWxlbWVudFR5cGUocGFyc2VkU2VsZWN0b3IpO1xuXG4gICAgLy8gc2tpcCBydWxlIGlmIHRoZSBzZWxlY3RvciBoYXMgYW55IHBzZXVkb3Mgd2hpY2ggYXJlIGlnbm9yZWRcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnNlZFNlbGVjdG9yLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgc3ViU2VsID0gcGFyc2VkU2VsZWN0b3JbaV07XG4gICAgICBpZiAoc3ViU2VsLnBzZXVkb3MpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzdWJTZWwucHNldWRvcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgIHZhciBzdWJTZWxQc2V1ZG8gPSBzdWJTZWwucHNldWRvc1tqXTtcbiAgICAgICAgICBpZiAoanVpY2VDbGllbnQuaWdub3JlZFBzZXVkb3MuaW5kZXhPZihzdWJTZWxQc2V1ZG8ubmFtZSkgPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwc2V1ZG9FbGVtZW50VHlwZSkge1xuICAgICAgdmFyIGxhc3QgPSBwYXJzZWRTZWxlY3RvcltwYXJzZWRTZWxlY3Rvci5sZW5ndGggLSAxXTtcbiAgICAgIHZhciBwc2V1ZG9zID0gbGFzdC5wc2V1ZG9zO1xuICAgICAgbGFzdC5wc2V1ZG9zID0gZmlsdGVyRWxlbWVudFBzZXVkb3MobGFzdC5wc2V1ZG9zKTtcbiAgICAgIHNlbCA9IHBhcnNlZFNlbGVjdG9yLnRvU3RyaW5nKCk7XG4gICAgICBsYXN0LnBzZXVkb3MgPSBwc2V1ZG9zO1xuICAgIH1cblxuICAgIHZhciBlbHM7XG4gICAgdHJ5IHtcbiAgICAgIGVscyA9ICQoc2VsKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIHNraXAgaW52YWxpZCBzZWxlY3RvclxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVscy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGVsID0gdGhpcztcblxuICAgICAgaWYgKGVsLm5hbWUgJiYganVpY2VDbGllbnQubm9uVmlzdWFsRWxlbWVudHMuaW5kZXhPZihlbC5uYW1lLnRvVXBwZXJDYXNlKCkpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocHNldWRvRWxlbWVudFR5cGUpIHtcbiAgICAgICAgdmFyIHBzZXVkb0VsUHJvcE5hbWUgPSAncHNldWRvJyArIHBzZXVkb0VsZW1lbnRUeXBlO1xuICAgICAgICB2YXIgcHNldWRvRWwgPSBlbFtwc2V1ZG9FbFByb3BOYW1lXTtcbiAgICAgICAgaWYgKCFwc2V1ZG9FbCkge1xuICAgICAgICAgIHBzZXVkb0VsID0gZWxbcHNldWRvRWxQcm9wTmFtZV0gPSAkKCc8c3BhbiAvPicpLmdldCgwKTtcbiAgICAgICAgICBwc2V1ZG9FbC5wc2V1ZG9FbGVtZW50VHlwZSA9IHBzZXVkb0VsZW1lbnRUeXBlO1xuICAgICAgICAgIHBzZXVkb0VsLnBzZXVkb0VsZW1lbnRQYXJlbnQgPSBlbDtcbiAgICAgICAgICBlbFtwc2V1ZG9FbFByb3BOYW1lXSA9IHBzZXVkb0VsO1xuICAgICAgICB9XG4gICAgICAgIGVsID0gcHNldWRvRWw7XG4gICAgICB9XG5cbiAgICAgIGlmICghZWwuc3R5bGVQcm9wcykge1xuICAgICAgICBlbC5zdHlsZVByb3BzID0ge307XG5cbiAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgaGFzIGlubGluZSBzdHlsZXMsIGZha2Ugc2VsZWN0b3Igd2l0aCB0b3Btb3N0IHNwZWNpZmljaXR5XG4gICAgICAgIGlmICgkKGVsKS5hdHRyKHN0eWxlQXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgICB2YXIgY3NzVGV4dCA9ICcqIHsgJyArICQoZWwpLmF0dHIoc3R5bGVBdHRyaWJ1dGVOYW1lKSArICcgfSAnO1xuICAgICAgICAgIGFkZFByb3BzKHV0aWxzLnBhcnNlQ1NTKGNzc1RleHQpWzBdWzFdLCBuZXcgdXRpbHMuU2VsZWN0b3IoJzxzdHlsZT4nLCB0cnVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gYW4gZWxlbWVudCB3ZSBuZWVkIHRvIGNvbXBpbGUgc3R5bGU9XCJcIiBhdHRyIGZvclxuICAgICAgICBlZGl0ZWRFbGVtZW50cy5wdXNoKGVsKTtcbiAgICAgIH1cblxuICAgICAgLy8gZ28gdGhyb3VnaCB0aGUgcHJvcGVydGllc1xuICAgICAgZnVuY3Rpb24gYWRkUHJvcHMoc3R5bGUsIHNlbGVjdG9yKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gc3R5bGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgaWYgKHN0eWxlW2ldLnR5cGUgPT0gJ3Byb3BlcnR5Jykge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSBzdHlsZVtpXS5uYW1lO1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gc3R5bGVbaV0udmFsdWU7XG4gICAgICAgICAgICB2YXIgaW1wb3J0YW50ID0gc3R5bGVbaV0udmFsdWUubWF0Y2goLyFpbXBvcnRhbnQkLykgIT09IG51bGw7XG4gICAgICAgICAgICBpZiAoaW1wb3J0YW50ICYmICFvcHRpb25zLnByZXNlcnZlSW1wb3J0YW50KSB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xccyohaW1wb3J0YW50JC8sICcnKTtcbiAgICAgICAgICAgIC8vIGFkZHMgbGluZSBudW1iZXIgYW5kIGNvbHVtbiBudW1iZXIgZm9yIHRoZSBwcm9wZXJ0aWVzIGFzIFwiYWRkaXRpb25hbFByaW9yaXR5XCIgdG8gdGhlIFxuICAgICAgICAgICAgLy8gcHJvcGVydGllcyBiZWNhdXNlIGluIENTUyB0aGUgcG9zaXRpb24gZGlyZWN0bHkgYWZmZWN0IHRoZSBwcmlvcml0eS5cbiAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsUHJpb3JpdHkgPSBbc3R5bGVbaV0ucG9zaXRpb24uc3RhcnQubGluZSwgc3R5bGVbaV0ucG9zaXRpb24uc3RhcnQuY29sXTtcbiAgICAgICAgICAgIHZhciBwcm9wID0gbmV3IHV0aWxzLlByb3BlcnR5KG5hbWUsIHZhbHVlLCBzZWxlY3RvciwgaW1wb3J0YW50ID8gMiA6IDAsIGFkZGl0aW9uYWxQcmlvcml0eSk7XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSBlbC5zdHlsZVByb3BzW25hbWVdO1xuXG4gICAgICAgICAgICAvLyBpZiBwcm9wZXJ0eSBuYW1lIGlzIG5vdCBpbiB0aGUgZXhjbHVkZWQgcHJvcGVydGllcyBhcnJheVxuICAgICAgICAgICAgaWYgKGp1aWNlQ2xpZW50LmV4Y2x1ZGVkUHJvcGVydGllcy5pbmRleE9mKG5hbWUpIDwgMCkge1xuICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmcuY29tcGFyZShwcm9wKSA9PT0gcHJvcCB8fCAhZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICAvLyBkZWxldGluZyBhIHByb3BlcnR5IGxldCB1cyBjaGFuZ2UgdGhlIG9yZGVyIChtb3ZlIGl0IHRvIHRoZSBlbmQgaW4gdGhlIHNldFN0eWxlQXR0cnMgbG9vcClcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3Rpbmcuc2VsZWN0b3IgIT09IHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgZWwuc3R5bGVQcm9wc1tuYW1lXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAvLyBtYWtlIFwicHJvcFwiIGEgc3BlY2lhbCBjb21wb3NlZCBwcm9wZXJ0eS5cbiAgICAgICAgICAgICAgICAgIHByb3AubmV4dFByb3AgPSBleGlzdGluZztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlbC5zdHlsZVByb3BzW25hbWVdID0gcHJvcDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhZGRQcm9wcyhzdHlsZSwgc2VsZWN0b3IpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0U3R5bGVBdHRycyhlbCkge1xuICAgIHZhciBsID0gT2JqZWN0LmtleXMoZWwuc3R5bGVQcm9wcykubGVuZ3RoO1xuICAgIHZhciBwcm9wcyA9IFtdO1xuICAgIC8vIEhlcmUgd2UgbG9vcCBlYWNoIHByb3BlcnR5IGFuZCBtYWtlIHN1cmUgdG8gXCJleHBhbmRcIlxuICAgIC8vIGxpbmtlZCBcIm5leHRQcm9wXCIgcHJvcGVydGllcyBoYXBwZW5pbmcgd2hlbiB0aGUgc2FtZSBwcm9wZXJ0eVxuICAgIC8vIGlzIGRlY2xhcmVkIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIHNlbGVjdG9yLlxuICAgIE9iamVjdC5rZXlzKGVsLnN0eWxlUHJvcHMpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICB2YXIgbnAgPSBlbC5zdHlsZVByb3BzW2tleV07XG4gICAgICB3aGlsZSAodHlwZW9mIG5wICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBwcm9wcy5wdXNoKG5wKTtcbiAgICAgICAgbnAgPSBucC5uZXh0UHJvcDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBzb3J0IHByb3BlcnRpZXMgYnkgdGhlaXIgb3JpZ2luYXRpbmcgc2VsZWN0b3IncyBzcGVjaWZpY2l0eSBzbyB0aGF0XG4gICAgLy8gcHJvcHMgbGlrZSBcInBhZGRpbmdcIiBhbmQgXCJwYWRkaW5nLWJvdHRvbVwiIGFyZSByZXNvbHZlZCBhcyBleHBlY3RlZC5cbiAgICBwcm9wcy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLmNvbXBhcmVGdW5jKGIpO1xuICAgIH0pO1xuICAgIHZhciBzdHJpbmcgPSBwcm9wc1xuICAgICAgLmZpbHRlcihmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIC8vIENvbnRlbnQgYmVjb21lcyB0aGUgaW5uZXJIVE1MIG9mIHBzZXVkbyBlbGVtZW50cywgbm90IHVzZWQgYXMgYVxuICAgICAgICAvLyBzdHlsZSBwcm9wZXJ0eVxuICAgICAgICByZXR1cm4gcHJvcC5wcm9wICE9PSAnY29udGVudCc7XG4gICAgICB9KVxuICAgICAgLm1hcChmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIHJldHVybiBwcm9wLnByb3AgKyAnOiAnICsgcHJvcC52YWx1ZS5yZXBsYWNlKC9bXCJdL2csICdcXCcnKSArICc7JztcbiAgICAgIH0pXG4gICAgICAuam9pbignICcpO1xuICAgIGlmIChzdHJpbmcpIHtcbiAgICAgICQoZWwpLmF0dHIoc3R5bGVBdHRyaWJ1dGVOYW1lLCBzdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlubGluZVBzZXVkb0VsZW1lbnRzKGVsKSB7XG4gICAgaWYgKGVsLnBzZXVkb0VsZW1lbnRUeXBlICYmIGVsLnN0eWxlUHJvcHMuY29udGVudCkge1xuICAgICAgdmFyIHBhcnNlZCA9IHBhcnNlQ29udGVudChlbC5zdHlsZVByb3BzLmNvbnRlbnQudmFsdWUpO1xuICAgICAgaWYgKHBhcnNlZC5pbWcpIHtcbiAgICAgICAgZWwubmFtZSA9ICdpbWcnO1xuICAgICAgICAkKGVsKS5hdHRyKCdzcmMnLCBwYXJzZWQuaW1nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQoZWwpLnRleHQocGFyc2VkKTtcbiAgICAgIH1cbiAgICAgIHZhciBwYXJlbnQgPSBlbC5wc2V1ZG9FbGVtZW50UGFyZW50O1xuICAgICAgaWYgKGVsLnBzZXVkb0VsZW1lbnRUeXBlID09PSAnYmVmb3JlJykge1xuICAgICAgICAkKHBhcmVudCkucHJlcGVuZChlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkKHBhcmVudCkuYXBwZW5kKGVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXREaW1lbnNpb25BdHRycyhlbCwgZGltZW5zaW9uKSB7XG4gICAgaWYgKCFlbC5uYW1lKSB7IHJldHVybjsgfVxuICAgIHZhciBlbE5hbWUgPSBlbC5uYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKGp1aWNlQ2xpZW50W2RpbWVuc2lvbiArICdFbGVtZW50cyddLmluZGV4T2YoZWxOYW1lKSA+IC0xKSB7XG4gICAgICBmb3IgKHZhciBpIGluIGVsLnN0eWxlUHJvcHMpIHtcbiAgICAgICAgaWYgKGVsLnN0eWxlUHJvcHNbaV0ucHJvcCA9PT0gZGltZW5zaW9uKSB7XG4gICAgICAgICAgaWYgKGVsLnN0eWxlUHJvcHNbaV0udmFsdWUubWF0Y2goL3B4LykpIHtcbiAgICAgICAgICAgIHZhciBweFNpemUgPSBlbC5zdHlsZVByb3BzW2ldLnZhbHVlLnJlcGxhY2UoJ3B4JywgJycpO1xuICAgICAgICAgICAgJChlbCkuYXR0cihkaW1lbnNpb24sIHB4U2l6ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChqdWljZUNsaWVudC50YWJsZUVsZW1lbnRzLmluZGV4T2YoZWxOYW1lKSA+IC0xICYmIGVsLnN0eWxlUHJvcHNbaV0udmFsdWUubWF0Y2goL1xcJS8pKSB7XG4gICAgICAgICAgICAkKGVsKS5hdHRyKGRpbWVuc2lvbiwgZWwuc3R5bGVQcm9wc1tpXS52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2V0QXR0cmlidXRlc09uVGFibGVFbGVtZW50cyhlbCkge1xuICAgIGlmICghZWwubmFtZSkgeyByZXR1cm47IH1cbiAgICB2YXIgZWxOYW1lID0gZWwubmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgIHZhciBzdHlsZVByb3BzID0gT2JqZWN0LmtleXMoanVpY2VDbGllbnQuc3R5bGVUb0F0dHJpYnV0ZSk7XG5cbiAgICBpZiAoanVpY2VDbGllbnQudGFibGVFbGVtZW50cy5pbmRleE9mKGVsTmFtZSkgPiAtMSkge1xuICAgICAgZm9yICh2YXIgaSBpbiBlbC5zdHlsZVByb3BzKSB7XG4gICAgICAgIGlmIChzdHlsZVByb3BzLmluZGV4T2YoZWwuc3R5bGVQcm9wc1tpXS5wcm9wKSA+IC0xKSB7XG4gICAgICAgICAgJChlbCkuYXR0cihqdWljZUNsaWVudC5zdHlsZVRvQXR0cmlidXRlW2VsLnN0eWxlUHJvcHNbaV0ucHJvcF0sIGVsLnN0eWxlUHJvcHNbaV0udmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ29udGVudChjb250ZW50KSB7XG4gIGlmIChjb250ZW50ID09PSAnbm9uZScgfHwgY29udGVudCA9PT0gJ25vcm1hbCcpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB2YXIgaW1hZ2VVcmxNYXRjaCA9IGNvbnRlbnQubWF0Y2goL15cXHMqdXJsXFxzKlxcKFxccyooLio/KVxccypcXClcXHMqJC9pKTtcbiAgaWYgKGltYWdlVXJsTWF0Y2gpIHtcbiAgICB2YXIgdXJsID0gaW1hZ2VVcmxNYXRjaFsxXS5yZXBsYWNlKC9eWydcIl18WydcIl0kL2csICcnKTtcbiAgICByZXR1cm4geyBpbWc6IHVybCB9O1xuICB9XG5cbiAgLy8gTmFpdmUgcGFyc2luZywgYXNzdW1lIHdlbGwtZm9ybWVkIHZhbHVlXG4gIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEsIGNvbnRlbnQubGVuZ3RoIC0gMSk7XG4gIC8vIE5haXZlIHVuZXNjYXBlLCBhc3N1bWUgbm8gdW5pY29kZSBjaGFyIGNvZGVzXG4gIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL1xcXFwvZywgJycpO1xuICByZXR1cm4gY29udGVudDtcbn1cblxuLy8gUmV0dXJuIFwiYmVmb3JlXCIgb3IgXCJhZnRlclwiIGlmIHRoZSBnaXZlbiBzZWxlY3RvciBpcyBhIHBzZXVkbyBlbGVtZW50IChlLmcuLFxuLy8gYTo6YWZ0ZXIpLlxuZnVuY3Rpb24gZ2V0UHNldWRvRWxlbWVudFR5cGUoc2VsZWN0b3IpIHtcbiAgaWYgKHNlbGVjdG9yLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwc2V1ZG9zID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV0ucHNldWRvcztcbiAgaWYgKCFwc2V1ZG9zKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwc2V1ZG9zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGlzUHNldWRvRWxlbWVudE5hbWUocHNldWRvc1tpXSkpIHtcbiAgICAgIHJldHVybiBwc2V1ZG9zW2ldLm5hbWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzUHNldWRvRWxlbWVudE5hbWUocHNldWRvKSB7XG4gIHJldHVybiBwc2V1ZG8ubmFtZSA9PT0gJ2JlZm9yZScgfHwgcHNldWRvLm5hbWUgPT09ICdhZnRlcic7XG59XG5cbmZ1bmN0aW9uIGZpbHRlckVsZW1lbnRQc2V1ZG9zKHBzZXVkb3MpIHtcbiAgcmV0dXJuIHBzZXVkb3MuZmlsdGVyKGZ1bmN0aW9uKHBzZXVkbykge1xuICAgIHJldHVybiAhaXNQc2V1ZG9FbGVtZW50TmFtZShwc2V1ZG8pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24ganVpY2VEb2N1bWVudCgkLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSB1dGlscy5nZXREZWZhdWx0T3B0aW9ucyhvcHRpb25zKTtcbiAgdmFyIGNzcyA9IGV4dHJhY3RDc3NGcm9tRG9jdW1lbnQoJCwgb3B0aW9ucyk7XG4gIGNzcyArPSAnXFxuJyArIG9wdGlvbnMuZXh0cmFDc3M7XG4gIGlubGluZURvY3VtZW50KCQsIGNzcywgb3B0aW9ucyk7XG4gIHJldHVybiAkO1xufVxuXG5mdW5jdGlvbiBnZXRTdHlsZXNEYXRhKCQsIG9wdGlvbnMpIHtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgdmFyIHN0eWxlc0xpc3QgPSAkKCdzdHlsZScpO1xuICB2YXIgc3R5bGVEYXRhTGlzdCwgc3R5bGVEYXRhLCBzdHlsZUVsZW1lbnQ7XG4gIHN0eWxlc0xpc3QuZWFjaChmdW5jdGlvbigpIHtcbiAgICBzdHlsZUVsZW1lbnQgPSB0aGlzO1xuICAgIHN0eWxlRGF0YUxpc3QgPSBzdHlsZUVsZW1lbnQuY2hpbGROb2RlcztcbiAgICBpZiAoc3R5bGVEYXRhTGlzdC5sZW5ndGggIT09IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3R5bGVEYXRhID0gc3R5bGVEYXRhTGlzdFswXS5kYXRhO1xuICAgIGlmIChvcHRpb25zLmFwcGx5U3R5bGVUYWdzICYmICQoc3R5bGVFbGVtZW50KS5hdHRyKCdkYXRhLWVtYmVkJykgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHN0eWxlRGF0YSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnJlbW92ZVN0eWxlVGFncyAmJiAkKHN0eWxlRWxlbWVudCkuYXR0cignZGF0YS1lbWJlZCcpID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBwcmVzZXJ2ZWRUZXh0ID0gdXRpbHMuZ2V0UHJlc2VydmVkVGV4dChzdHlsZUVsZW1lbnQuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWUsIHtcbiAgICAgICAgbWVkaWFRdWVyaWVzOiBvcHRpb25zLnByZXNlcnZlTWVkaWFRdWVyaWVzLFxuICAgICAgICBmb250RmFjZXM6IG9wdGlvbnMucHJlc2VydmVGb250RmFjZXNcbiAgICAgIH0pO1xuICAgICAgaWYgKHByZXNlcnZlZFRleHQpIHtcbiAgICAgICAgc3R5bGVFbGVtZW50LmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlID0gcHJlc2VydmVkVGV4dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQoc3R5bGVFbGVtZW50KS5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgJChzdHlsZUVsZW1lbnQpLnJlbW92ZUF0dHIoJ2RhdGEtZW1iZWQnKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0Q3NzRnJvbURvY3VtZW50KCQsIG9wdGlvbnMpIHtcbiAgdmFyIHJlc3VsdHMgPSBnZXRTdHlsZXNEYXRhKCQsIG9wdGlvbnMpO1xuICB2YXIgY3NzID0gcmVzdWx0cy5qb2luKCdcXG4nKTtcbiAgcmV0dXJuIGNzcztcbn1cblxucmV0dXJuIGp1aWNlQ2xpZW50O1xuXG59OyIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gUHJvcGVydHk7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbi8qKlxuICogQ1NTIHByb3BlcnR5IGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge1NlbGVjdG9yfSBzZWxlY3RvciB0aGUgcHJvcGVydHkgb3JpZ2luYXRlcyBmcm9tXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHByaW9yaXR5IDAgZm9yIG5vcm1hbCBwcm9wZXJ0aWVzLCAyIGZvciAhaW1wb3J0YW50IHByb3BlcnRpZXMuXG4gKiBAcGFyYW0ge0FycmF5fSBhZGRpdGlvbmFsIGFycmF5IG9mIGludGVnZXJzIHJlcHJlc2VudGluZyBtb3JlIGRldGFpbGVkIHByaW9yaXRpZXMgKHNvcnRpbmcpXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFByb3BlcnR5KHByb3AsIHZhbHVlLCBzZWxlY3RvciwgcHJpb3JpdHksIGFkZGl0aW9uYWxQcmlvcml0eSkge1xuICB0aGlzLnByb3AgPSBwcm9wO1xuICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG4gIHRoaXMuYWRkaXRpb25hbFByaW9yaXR5ID0gYWRkaXRpb25hbFByaW9yaXR5IHx8IFtdO1xufVxuXG4vKipcbiAqIENvbXBhcmVzIHdpdGggYW5vdGhlciBQcm9wZXJ0eSBiYXNlZCBvbiBTZWxlY3RvciNzcGVjaWZpY2l0eS5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblByb3BlcnR5LnByb3RvdHlwZS5jb21wYXJlRnVuYyA9IGZ1bmN0aW9uKHByb3BlcnR5KSB7XG4gIHZhciBhID0gW107XG4gIGEucHVzaC5hcHBseShhLCB0aGlzLnNlbGVjdG9yLnNwZWNpZmljaXR5KCkpO1xuICBhLnB1c2guYXBwbHkoYSwgdGhpcy5hZGRpdGlvbmFsUHJpb3JpdHkpO1xuICBhWzBdICs9IHRoaXMucHJpb3JpdHk7XG4gIHZhciBiID0gW107XG4gIGIucHVzaC5hcHBseShiLCBwcm9wZXJ0eS5zZWxlY3Rvci5zcGVjaWZpY2l0eSgpKTtcbiAgYi5wdXNoLmFwcGx5KGIsIHByb3BlcnR5LmFkZGl0aW9uYWxQcmlvcml0eSk7XG4gIGJbMF0gKz0gcHJvcGVydHkucHJpb3JpdHk7XG4gIHJldHVybiB1dGlscy5jb21wYXJlRnVuYyhhLCBiKTtcbn07XG5cblByb3BlcnR5LnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgdmFyIHdpbm5lciA9IHRoaXMuY29tcGFyZUZ1bmMocHJvcGVydHkpO1xuICBpZiAod2lubmVyID09PSAxKSByZXR1cm4gdGhpcztcbiAgcmV0dXJuIHByb3BlcnR5O1xufTtcblxuXG4vKipcbiAqIFJldHVybnMgQ1NTIHByb3BlcnR5XG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Qcm9wZXJ0eS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMucHJvcCArICc6ICcgKyB0aGlzLnZhbHVlLnJlcGxhY2UoL1snXCJdKy9nLCAnJykgKyAnOyc7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcGFyc2VyID0gcmVxdWlyZSgnc2xpY2svcGFyc2VyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IFNlbGVjdG9yO1xuXG4vKipcbiAqIENTUyBzZWxlY3RvciBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3IgdGV4dFxuICogQHBhcmFtIHtBcnJheX0gb3B0aW9uYWxseSwgcHJlY2FsY3VsYXRlZCBzcGVjaWZpY2l0eVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBTZWxlY3Rvcih0ZXh0LCBzdHlsZUF0dHJpYnV0ZSkge1xuICB0aGlzLnRleHQgPSB0ZXh0O1xuICB0aGlzLnNwZWMgPSB1bmRlZmluZWQ7XG4gIHRoaXMuc3R5bGVBdHRyaWJ1dGUgPSBzdHlsZUF0dHJpYnV0ZSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBHZXQgcGFyc2VkIHNlbGVjdG9yLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuU2VsZWN0b3IucHJvdG90eXBlLnBhcnNlZCA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMudG9rZW5zKSB7IHRoaXMudG9rZW5zID0gcGFyc2UodGhpcy50ZXh0KTsgfVxuICByZXR1cm4gdGhpcy50b2tlbnM7XG59O1xuXG4vKipcbiAqIExhenkgc3BlY2lmaWNpdHkgZ2V0dGVyXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5TZWxlY3Rvci5wcm90b3R5cGUuc3BlY2lmaWNpdHkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0eWxlQXR0cmlidXRlID0gdGhpcy5zdHlsZUF0dHJpYnV0ZTtcbiAgaWYgKCF0aGlzLnNwZWMpIHsgdGhpcy5zcGVjID0gc3BlY2lmaWNpdHkodGhpcy50ZXh0LCB0aGlzLnBhcnNlZCgpKTsgfVxuICByZXR1cm4gdGhpcy5zcGVjO1xuXG4gIGZ1bmN0aW9uIHNwZWNpZmljaXR5KHRleHQsIHBhcnNlZCkge1xuICAgIHZhciBleHByZXNzaW9ucyA9IHBhcnNlZCB8fCBwYXJzZSh0ZXh0KTtcbiAgICB2YXIgc3BlYyA9IFtzdHlsZUF0dHJpYnV0ZSA/IDEgOiAwLCAwLCAwLCAwXTtcbiAgICB2YXIgbm90cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByZXNzaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGV4cHJlc3Npb24gPSBleHByZXNzaW9uc1tpXTtcbiAgICAgIHZhciBwc2V1ZG9zID0gZXhwcmVzc2lvbi5wc2V1ZG9zO1xuXG4gICAgICAvLyBpZCBhd2FyZHMgYSBwb2ludCBpbiB0aGUgc2Vjb25kIGNvbHVtblxuICAgICAgaWYgKGV4cHJlc3Npb24uaWQpIHsgc3BlY1sxXSsrOyB9XG5cbiAgICAgIC8vIGNsYXNzZXMgYW5kIGF0dHJpYnV0ZXMgYXdhcmQgYSBwb2ludCBlYWNoIGluIHRoZSB0aGlyZCBjb2x1bW5cbiAgICAgIGlmIChleHByZXNzaW9uLmF0dHJpYnV0ZXMpIHsgc3BlY1syXSArPSBleHByZXNzaW9uLmF0dHJpYnV0ZXMubGVuZ3RoOyB9XG4gICAgICBpZiAoZXhwcmVzc2lvbi5jbGFzc0xpc3QpIHsgc3BlY1syXSArPSBleHByZXNzaW9uLmNsYXNzTGlzdC5sZW5ndGg7IH1cblxuICAgICAgLy8gdGFnIGF3YXJkcyBhIHBvaW50IGluIHRoZSBmb3VydGggY29sdW1uXG4gICAgICBpZiAoZXhwcmVzc2lvbi50YWcgJiYgZXhwcmVzc2lvbi50YWcgIT09ICcqJykgeyBzcGVjWzNdKys7IH1cblxuICAgICAgLy8gcHNldWRvcyBhd2FyZCBhIHBvaW50IGVhY2ggaW4gdGhlIGZvdXJ0aCBjb2x1bW5cbiAgICAgIGlmIChwc2V1ZG9zKSB7XG4gICAgICAgIHNwZWNbM10gKz0gcHNldWRvcy5sZW5ndGg7XG5cbiAgICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBwc2V1ZG9zLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgaWYgKHBzZXVkb3NbcF0ubmFtZSA9PT0gJ25vdCcpIHtcbiAgICAgICAgICAgIG5vdHMucHVzaChwc2V1ZG9zW3BdLnZhbHVlKTtcbiAgICAgICAgICAgIHNwZWNbM10tLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBpaSA9IG5vdHMubGVuZ3RoOyBpaS0tOykge1xuICAgICAgdmFyIG5vdCA9IHNwZWNpZmljaXR5KG5vdHNbaWldKTtcbiAgICAgIGZvciAodmFyIGpqID0gNDsgamotLTspIHsgc3BlY1tqal0gKz0gbm90W2pqXTsgfVxuICAgIH1cblxuICAgIHJldHVybiBzcGVjO1xuICB9XG59O1xuXG4vKipcbiAqIFBhcnNlcyBhIHNlbGVjdG9yIGFuZCByZXR1cm5zIHRoZSB0b2tlbnMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yXG4gKiBAYXBpIHByaXZhdGUuXG4gKi9cblxuZnVuY3Rpb24gcGFyc2UodGV4dCkge1xuICB0cnkge1xuICAgIHJldHVybiBwYXJzZXIodGV4dClbMF07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBtZW5zY2ggPSByZXF1aXJlKCdtZW5zY2gnKTtcbnZhciBvd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBvcyA9IHJlcXVpcmUoJ29zJyk7XG52YXIgU2VsZWN0b3IgPSByZXF1aXJlKCcuL3NlbGVjdG9yJyk7XG52YXIgUHJvcGVydHkgPSByZXF1aXJlKCcuL3Byb3BlcnR5Jyk7XG5cbmV4cG9ydHMuU2VsZWN0b3IgPSBTZWxlY3RvcjtcbmV4cG9ydHMuUHJvcGVydHkgPSBQcm9wZXJ0eTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBzZWxlY3RvcnMuXG4gKlxuICogQGxpY2Vuc2UgU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgLSBNSVRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvclRleHQgZnJvbSBtZW5zY2hcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5leHRyYWN0ID0gZnVuY3Rpb24gZXh0cmFjdChzZWxlY3RvclRleHQpIHtcbiAgdmFyIGF0dHIgPSAwO1xuICB2YXIgc2VscyA9IFtdO1xuICB2YXIgc2VsID0gJyc7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBzZWxlY3RvclRleHQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGMgPSBzZWxlY3RvclRleHQuY2hhckF0KGkpO1xuXG4gICAgaWYgKGF0dHIpIHtcbiAgICAgIGlmICgnXScgPT09IGMgfHwgJyknID09PSBjKSB7IGF0dHItLTsgfVxuICAgICAgc2VsICs9IGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgnLCcgPT09IGMpIHtcbiAgICAgICAgc2Vscy5wdXNoKHNlbCk7XG4gICAgICAgIHNlbCA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCdbJyA9PT0gYyB8fCAnKCcgPT09IGMpIHsgYXR0cisrOyB9XG4gICAgICAgIGlmIChzZWwubGVuZ3RoIHx8IChjICE9PSAnLCcgJiYgYyAhPT0gJ1xcbicgJiYgYyAhPT0gJyAnKSkgeyBzZWwgKz0gYzsgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzZWwubGVuZ3RoKSB7XG4gICAgc2Vscy5wdXNoKHNlbCk7XG4gIH1cblxuICByZXR1cm4gc2Vscztcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHBhcnNlIHRyZWUgZm9yIGEgQ1NTIHNvdXJjZS5cbiAqIElmIGl0IGVuY291bnRlcnMgbXVsdGlwbGUgc2VsZWN0b3JzIHNlcGFyYXRlZCBieSBhIGNvbW1hLCBpdCBzcGxpdHMgdGhlXG4gKiB0cmVlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBjc3Mgc291cmNlXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMucGFyc2VDU1MgPSBmdW5jdGlvbihjc3MpIHtcbiAgdmFyIHBhcnNlZCA9IG1lbnNjaC5wYXJzZShjc3MsIHtwb3NpdGlvbjogdHJ1ZSwgY29tbWVudHM6IHRydWV9KTtcbiAgdmFyIHJ1bGVzID0gdHlwZW9mIHBhcnNlZC5zdHlsZXNoZWV0ICE9ICd1bmRlZmluZWQnICYmIHBhcnNlZC5zdHlsZXNoZWV0LnJ1bGVzID8gcGFyc2VkLnN0eWxlc2hlZXQucnVsZXMgOiBbXTtcbiAgdmFyIHJldCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gcnVsZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHJ1bGVzW2ldLnR5cGUgPT0gJ3J1bGUnKSB7XG4gICAgICB2YXIgcnVsZSA9IHJ1bGVzW2ldO1xuICAgICAgdmFyIHNlbGVjdG9ycyA9IHJ1bGUuc2VsZWN0b3JzO1xuXG4gICAgICBmb3IgKHZhciBpaSA9IDAsIGxsID0gc2VsZWN0b3JzLmxlbmd0aDsgaWkgPCBsbDsgaWkrKykge1xuICAgICAgICByZXQucHVzaChbc2VsZWN0b3JzW2lpXSwgcnVsZS5kZWNsYXJhdGlvbnNdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHByZXNlcnZlZCB0ZXh0IGZvciBhIENTUyBzb3VyY2UuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGNzcyBzb3VyY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMuZ2V0UHJlc2VydmVkVGV4dCA9IGZ1bmN0aW9uKGNzcywgb3B0aW9ucykge1xuICB2YXIgcGFyc2VkID0gbWVuc2NoLnBhcnNlKGNzcywge3Bvc2l0aW9uOiB0cnVlLCBjb21tZW50czogdHJ1ZX0pO1xuICB2YXIgcnVsZXMgPSB0eXBlb2YgcGFyc2VkLnN0eWxlc2hlZXQgIT0gJ3VuZGVmaW5lZCcgJiYgcGFyc2VkLnN0eWxlc2hlZXQucnVsZXMgPyBwYXJzZWQuc3R5bGVzaGVldC5ydWxlcyA6IFtdO1xuICB2YXIgcHJlc2VydmVkID0gW107XG4gIHZhciBsYXN0U3RhcnQgPSBudWxsO1xuXG4gIGZvciAodmFyIGkgPSBydWxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmICgob3B0aW9ucy5mb250RmFjZXMgJiYgcnVsZXNbaV0udHlwZSA9PT0gJ2ZvbnQtZmFjZScpIHx8XG4gICAgICAgIChvcHRpb25zLm1lZGlhUXVlcmllcyAmJiBydWxlc1tpXS50eXBlID09PSAnbWVkaWEnKSkge1xuICAgICAgcHJlc2VydmVkLnB1c2goXG4gICAgICAgIG1lbnNjaC5zdHJpbmdpZnkoXG4gICAgICAgICAgeyBzdHlsZXNoZWV0OiB7IHJ1bGVzOiBbIHJ1bGVzW2ldIF0gfX0sXG4gICAgICAgICAgeyBjb21tZW50czogZmFsc2UsIGluZGVudGF0aW9uOiAnICAnIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgbGFzdFN0YXJ0ID0gcnVsZXNbaV0ucG9zaXRpb24uc3RhcnQ7XG4gIH1cblxuICBpZiAocHJlc2VydmVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gb3MuRU9MK3ByZXNlcnZlZC5qb2luKG9zLkVPTCkrb3MuRU9MO1xufTtcblxuZXhwb3J0cy5ub3JtYWxpemVMaW5lRW5kaW5ncyA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFxyXFxuL2csICdcXG4nKS5yZXBsYWNlKC9cXG4vZywgJ1xcclxcbicpO1xufTtcblxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBzcGVjaWZpY2l0eSB2ZWN0b3JzLCByZXR1cm5pbmcgdGhlIHdpbm5pbmcgb25lLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHZlY3RvciBhXG4gKiBAcGFyYW0ge0FycmF5fSB2ZWN0b3IgYlxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMuY29tcGFyZUZ1bmMgPSBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBtaW4gPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1pbjsgaSsrKSB7XG4gICAgaWYgKGFbaV0gPT09IGJbaV0pIHsgY29udGludWU7IH1cbiAgICBpZiAoYVtpXSA+IGJbaV0pIHsgcmV0dXJuIDE7IH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICByZXR1cm4gYS5sZW5ndGgtYi5sZW5ndGg7XG59O1xuXG5leHBvcnRzLmNvbXBhcmUgPSBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiBleHBvcnRzLmNvbXBhcmVGdW5jKGEsIGIpID09IDEgPyBhIDogYjtcbn07XG5cbmV4cG9ydHMuZXh0ZW5kID0gZnVuY3Rpb24ob2JqLCBzcmMpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgIGlmIChvd24uY2FsbChzcmMsIGtleSkpIHtcbiAgICAgIG9ialtrZXldID0gc3JjW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59O1xuXG5leHBvcnRzLmdldERlZmF1bHRPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICB2YXIgcmVzdWx0ID0gZXhwb3J0cy5leHRlbmQoe1xuICAgIGV4dHJhQ3NzOiAnJyxcbiAgICBpbnNlcnRQcmVzZXJ2ZWRFeHRyYUNzczogdHJ1ZSxcbiAgICBhcHBseVN0eWxlVGFnczogdHJ1ZSxcbiAgICByZW1vdmVTdHlsZVRhZ3M6IHRydWUsXG4gICAgcHJlc2VydmVNZWRpYVF1ZXJpZXM6IHRydWUsXG4gICAgcHJlc2VydmVGb250RmFjZXM6IHRydWUsXG4gICAgYXBwbHlXaWR0aEF0dHJpYnV0ZXM6IHRydWUsXG4gICAgYXBwbHlIZWlnaHRBdHRyaWJ1dGVzOiB0cnVlLFxuICAgIGFwcGx5QXR0cmlidXRlc1RhYmxlRWxlbWVudHM6IHRydWUsXG4gICAgdXJsOiAnJ1xuICB9LCBvcHRpb25zKTtcblxuICByZXN1bHQud2ViUmVzb3VyY2VzID0gcmVzdWx0LndlYlJlc291cmNlcyB8fCB7fTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8vIGtub2Nrb3V0LXNvcnRhYmxlIDAuMTUuMCB8IChjKSAyMDE2IFJ5YW4gTmllbWV5ZXIgfCAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuIWZ1bmN0aW9uKGEpe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW1wia25vY2tvdXRcIixcImpxdWVyeVwiLFwianF1ZXJ5LXVpL3NvcnRhYmxlXCIsXCJqcXVlcnktdWkvZHJhZ2dhYmxlXCJdLGEpO2Vsc2UgaWYoXCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUpe3ZhciBiPXJlcXVpcmUoXCJrbm9ja291dFwiKSxjPXJlcXVpcmUoXCJqcXVlcnlcIik7cmVxdWlyZShcImpxdWVyeS11aS9zb3J0YWJsZVwiKSxyZXF1aXJlKFwianF1ZXJ5LXVpL2RyYWdnYWJsZVwiKSxhKGIsYyl9ZWxzZSBhKHdpbmRvdy5rbyx3aW5kb3cualF1ZXJ5KX0oZnVuY3Rpb24oYSxiKXt2YXIgYz1cImtvX3NvcnRJdGVtXCIsZD1cImtvX3NvdXJjZUluZGV4XCIsZT1cImtvX3NvcnRMaXN0XCIsZj1cImtvX3BhcmVudExpc3RcIixnPVwia29fZHJhZ0l0ZW1cIixoPWEudXRpbHMudW53cmFwT2JzZXJ2YWJsZSxpPWEudXRpbHMuZG9tRGF0YS5nZXQsaj1hLnV0aWxzLmRvbURhdGEuc2V0LGs9Yi51aSYmYi51aS52ZXJzaW9uLGw9ayYmay5pbmRleE9mKFwiMS42LlwiKSYmay5pbmRleE9mKFwiMS43LlwiKSYmKGsuaW5kZXhPZihcIjEuOC5cIil8fFwiMS44LjI0XCI9PT1rKSxtPWZ1bmN0aW9uKGIsZCl7YS51dGlscy5hcnJheUZvckVhY2goYixmdW5jdGlvbihhKXsxPT09YS5ub2RlVHlwZSYmKGooYSxjLGQpLGooYSxmLGkoYS5wYXJlbnROb2RlLGUpKSl9KX0sbj1mdW5jdGlvbihiLGMpe3ZhciBkLGU9e30sZj1oKGIoKSl8fHt9O3JldHVybiBmLmRhdGE/KGVbY109Zi5kYXRhLGUubmFtZT1mLnRlbXBsYXRlKTplW2NdPWIoKSxhLnV0aWxzLmFycmF5Rm9yRWFjaChbXCJhZnRlckFkZFwiLFwiYWZ0ZXJSZW5kZXJcIixcImFzXCIsXCJiZWZvcmVSZW1vdmVcIixcImluY2x1ZGVEZXN0cm95ZWRcIixcInRlbXBsYXRlRW5naW5lXCIsXCJ0ZW1wbGF0ZU9wdGlvbnNcIixcIm5vZGVzXCJdLGZ1bmN0aW9uKGIpe2YuaGFzT3duUHJvcGVydHkoYik/ZVtiXT1mW2JdOmEuYmluZGluZ0hhbmRsZXJzLnNvcnRhYmxlLmhhc093blByb3BlcnR5KGIpJiYoZVtiXT1hLmJpbmRpbmdIYW5kbGVycy5zb3J0YWJsZVtiXSl9KSxcImZvcmVhY2hcIj09PWMmJihlLmFmdGVyUmVuZGVyPyhkPWUuYWZ0ZXJSZW5kZXIsZS5hZnRlclJlbmRlcj1mdW5jdGlvbihhLGIpe20uY2FsbChiLGEsYiksZC5jYWxsKGIsYSxiKX0pOmUuYWZ0ZXJSZW5kZXI9bSksZX0sbz1mdW5jdGlvbihhLGIpe3ZhciBjPWgoYik7aWYoYylmb3IodmFyIGQ9MDthPmQ7ZCsrKWNbZF0mJmgoY1tkXS5fZGVzdHJveSkmJmErKztyZXR1cm4gYX0scD1mdW5jdGlvbihjLGQpe3ZhciBlLGY7ZD8oZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKSxmJiYoZT1uZXcgYS50ZW1wbGF0ZVNvdXJjZXMuZG9tRWxlbWVudChmKSxlLnRleHQoYi50cmltKGUudGV4dCgpKSkpKTpiKGMpLmNvbnRlbnRzKCkuZWFjaChmdW5jdGlvbigpe3RoaXMmJjEhPT10aGlzLm5vZGVUeXBlJiZjLnJlbW92ZUNoaWxkKHRoaXMpfSl9O2EuYmluZGluZ0hhbmRsZXJzLnNvcnRhYmxlPXtpbml0OmZ1bmN0aW9uKGssbSxxLHIscyl7dmFyIHQsdSx2PWIoayksdz1oKG0oKSl8fHt9LHg9bihtLFwiZm9yZWFjaFwiKSx5PXt9O3Aoayx4Lm5hbWUpLGIuZXh0ZW5kKCEwLHksYS5iaW5kaW5nSGFuZGxlcnMuc29ydGFibGUpLHcub3B0aW9ucyYmeS5vcHRpb25zJiYoYS51dGlscy5leHRlbmQoeS5vcHRpb25zLHcub3B0aW9ucyksZGVsZXRlIHcub3B0aW9ucyksYS51dGlscy5leHRlbmQoeSx3KSx5LmNvbm5lY3RDbGFzcyYmKGEuaXNPYnNlcnZhYmxlKHkuYWxsb3dEcm9wKXx8XCJmdW5jdGlvblwiPT10eXBlb2YgeS5hbGxvd0Ryb3ApP2EuY29tcHV0ZWQoe3JlYWQ6ZnVuY3Rpb24oKXt2YXIgYj1oKHkuYWxsb3dEcm9wKSxjPVwiZnVuY3Rpb25cIj09dHlwZW9mIGI/Yi5jYWxsKHRoaXMseC5mb3JlYWNoKTpiO2EudXRpbHMudG9nZ2xlRG9tTm9kZUNzc0NsYXNzKGsseS5jb25uZWN0Q2xhc3MsYyl9LGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDprfSx0aGlzKTphLnV0aWxzLnRvZ2dsZURvbU5vZGVDc3NDbGFzcyhrLHkuY29ubmVjdENsYXNzLHkuYWxsb3dEcm9wKSxhLmJpbmRpbmdIYW5kbGVycy50ZW1wbGF0ZS5pbml0KGssZnVuY3Rpb24oKXtyZXR1cm4geH0scSxyLHMpLHQ9eS5vcHRpb25zLnN0YXJ0LHU9eS5vcHRpb25zLnVwZGF0ZSx5Lm9wdGlvbnMuaGVscGVyfHwoeS5vcHRpb25zLmhlbHBlcj1mdW5jdGlvbihhLGMpe3JldHVybiBjLmlzKFwidHJcIikmJmMuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCl7Yih0aGlzKS53aWR0aChiKHRoaXMpLndpZHRoKCkpfSksY30pO3ZhciB6PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgbSxuPXkub3B0aW9ucy5yZWNlaXZlO3Yuc29ydGFibGUoYS51dGlscy5leHRlbmQoeS5vcHRpb25zLHtzdGFydDpmdW5jdGlvbihiLGMpe3ZhciBlPWMuaXRlbVswXTtqKGUsZCxhLnV0aWxzLmFycmF5SW5kZXhPZihjLml0ZW0ucGFyZW50KCkuY2hpbGRyZW4oKSxlKSksYy5pdGVtLmZpbmQoXCJpbnB1dDpmb2N1c1wiKS5jaGFuZ2UoKSx0JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scmVjZWl2ZTpmdW5jdGlvbihhLGIpe1wiZnVuY3Rpb25cIj09dHlwZW9mIG4mJm4uY2FsbCh0aGlzLGEsYiksbT1pKGIuaXRlbVswXSxnKSxtJiYobS5jbG9uZSYmKG09bS5jbG9uZSgpKSx5LmRyYWdnZWQmJihtPXkuZHJhZ2dlZC5jYWxsKHRoaXMsbSxhLGIpfHxtKSl9LHVwZGF0ZTpmdW5jdGlvbihnLGspe3ZhciBuLHAscSxyLHMsdD1rLml0ZW1bMF0sdj1rLml0ZW0ucGFyZW50KClbMF0sdz1pKHQsYyl8fG07aWYod3x8Yih0KS5yZW1vdmUoKSxtPW51bGwsdyYmdGhpcz09PXZ8fCFsJiZiLmNvbnRhaW5zKHRoaXMsdikpe2lmKG49aSh0LGYpLHE9aSh0LGQpLHA9aSh0LnBhcmVudE5vZGUsZSkscj1hLnV0aWxzLmFycmF5SW5kZXhPZihrLml0ZW0ucGFyZW50KCkuY2hpbGRyZW4oKSx0KSx4LmluY2x1ZGVEZXN0cm95ZWR8fChxPW8ocSxuKSxyPW8ocixwKSksKHkuYmVmb3JlTW92ZXx8eS5hZnRlck1vdmUpJiYocz17aXRlbTp3LHNvdXJjZVBhcmVudDpuLHNvdXJjZVBhcmVudE5vZGU6biYmay5zZW5kZXJ8fHQucGFyZW50Tm9kZSxzb3VyY2VJbmRleDpxLHRhcmdldFBhcmVudDpwLHRhcmdldEluZGV4OnIsY2FuY2VsRHJvcDohMX0seS5iZWZvcmVNb3ZlJiZ5LmJlZm9yZU1vdmUuY2FsbCh0aGlzLHMsZyxrKSksbj9iKG49PT1wP3RoaXM6ay5zZW5kZXJ8fHRoaXMpLnNvcnRhYmxlKFwiY2FuY2VsXCIpOmIodCkucmVtb3ZlKCkscyYmcy5jYW5jZWxEcm9wKXJldHVybjtpZih5Lmhhc093blByb3BlcnR5KFwic3RyYXRlZ3lNb3ZlXCIpJiZ5LnN0cmF0ZWd5TW92ZSE9PSExKXtpZihyPj0wKWlmKG4paWYobiE9PXApbi5zcGxpY2UocSwxKSxwLnNwbGljZShyLDAsdyksaih0LGMsbnVsbCksay5pdGVtLnJlbW92ZSgpO2Vsc2V7dmFyIHo9aChuKTtuLnZhbHVlV2lsbE11dGF0ZSYmbi52YWx1ZVdpbGxNdXRhdGUoKSx6LnNwbGljZShxLDEpLHouc3BsaWNlKHIsMCx3KSxuLnZhbHVlSGFzTXV0YXRlZCYmbi52YWx1ZUhhc011dGF0ZWQoKX1lbHNlIHAuc3BsaWNlKHIsMCx3KSxqKHQsYyxudWxsKSxrLml0ZW0ucmVtb3ZlKCl9ZWxzZSByPj0wJiYobiYmKG4uc3BsaWNlKHEsMSksYS5wcm9jZXNzQWxsRGVmZXJyZWRCaW5kaW5nVXBkYXRlcyYmYS5wcm9jZXNzQWxsRGVmZXJyZWRCaW5kaW5nVXBkYXRlcygpLGEub3B0aW9ucyYmYS5vcHRpb25zLmRlZmVyVXBkYXRlcyYmYS50YXNrcy5ydW5FYXJseSgpKSxwLnNwbGljZShyLDAsdykpLGoodCxjLG51bGwpO2EucHJvY2Vzc0FsbERlZmVycmVkQmluZGluZ1VwZGF0ZXMmJmEucHJvY2Vzc0FsbERlZmVycmVkQmluZGluZ1VwZGF0ZXMoKSx5LmFmdGVyTW92ZSYmeS5hZnRlck1vdmUuY2FsbCh0aGlzLHMsZyxrKX11JiZ1LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sY29ubmVjdFdpdGg6eS5jb25uZWN0Q2xhc3M/XCIuXCIreS5jb25uZWN0Q2xhc3M6ITF9KSksdm9pZCAwIT09eS5pc0VuYWJsZWQmJmEuY29tcHV0ZWQoe3JlYWQ6ZnVuY3Rpb24oKXt2LnNvcnRhYmxlKGgoeS5pc0VuYWJsZWQpP1wiZW5hYmxlXCI6XCJkaXNhYmxlXCIpfSxkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6a30pfSwwKTtyZXR1cm4gYS51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGssZnVuY3Rpb24oKXsodi5kYXRhKFwidWktc29ydGFibGVcIil8fHYuZGF0YShcInNvcnRhYmxlXCIpKSYmdi5zb3J0YWJsZShcImRlc3Ryb3lcIiksYS51dGlscy50b2dnbGVEb21Ob2RlQ3NzQ2xhc3Moayx5LmNvbm5lY3RDbGFzcywhMSksY2xlYXJUaW1lb3V0KHopfSkse2NvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzOiEwfX0sdXBkYXRlOmZ1bmN0aW9uKGIsYyxkLGYsZyl7dmFyIGg9bihjLFwiZm9yZWFjaFwiKTtqKGIsZSxoLmZvcmVhY2gpLGEuYmluZGluZ0hhbmRsZXJzLnRlbXBsYXRlLnVwZGF0ZShiLGZ1bmN0aW9uKCl7cmV0dXJuIGh9LGQsZixnKX0sY29ubmVjdENsYXNzOlwia29fY29udGFpbmVyXCIsYWxsb3dEcm9wOiEwLGFmdGVyTW92ZTpudWxsLGJlZm9yZU1vdmU6bnVsbCxvcHRpb25zOnt9fSxhLmJpbmRpbmdIYW5kbGVycy5kcmFnZ2FibGU9e2luaXQ6ZnVuY3Rpb24oYyxkLGUsZixpKXt2YXIgaz1oKGQoKSl8fHt9LGw9ay5vcHRpb25zfHx7fSxtPWEudXRpbHMuZXh0ZW5kKHt9LGEuYmluZGluZ0hhbmRsZXJzLmRyYWdnYWJsZS5vcHRpb25zKSxvPW4oZCxcImRhdGFcIikscD1rLmNvbm5lY3RDbGFzc3x8YS5iaW5kaW5nSGFuZGxlcnMuZHJhZ2dhYmxlLmNvbm5lY3RDbGFzcyxxPXZvaWQgMCE9PWsuaXNFbmFibGVkP2suaXNFbmFibGVkOmEuYmluZGluZ0hhbmRsZXJzLmRyYWdnYWJsZS5pc0VuYWJsZWQ7cmV0dXJuIGs9XCJkYXRhXCJpbiBrP2suZGF0YTprLGooYyxnLGspLGEudXRpbHMuZXh0ZW5kKG0sbCksbS5jb25uZWN0VG9Tb3J0YWJsZT1wP1wiLlwiK3A6ITEsYihjKS5kcmFnZ2FibGUobSksdm9pZCAwIT09cSYmYS5jb21wdXRlZCh7cmVhZDpmdW5jdGlvbigpe2IoYykuZHJhZ2dhYmxlKGgocSk/XCJlbmFibGVcIjpcImRpc2FibGVcIil9LGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDpjfSksYS51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGMsZnVuY3Rpb24oKXtiKGMpLmRyYWdnYWJsZShcImRlc3Ryb3lcIil9KSxhLmJpbmRpbmdIYW5kbGVycy50ZW1wbGF0ZS5pbml0KGMsZnVuY3Rpb24oKXtyZXR1cm4gb30sZSxmLGkpfSx1cGRhdGU6ZnVuY3Rpb24oYixjLGQsZSxmKXt2YXIgZz1uKGMsXCJkYXRhXCIpO3JldHVybiBhLmJpbmRpbmdIYW5kbGVycy50ZW1wbGF0ZS51cGRhdGUoYixmdW5jdGlvbigpe3JldHVybiBnfSxkLGUsZil9LGNvbm5lY3RDbGFzczphLmJpbmRpbmdIYW5kbGVycy5zb3J0YWJsZS5jb25uZWN0Q2xhc3Msb3B0aW9uczp7aGVscGVyOlwiY2xvbmVcIn19fSk7IiwiLy8gS25vY2tvdXQgVW5kb01hbmFnZXIgdjAuMiB8IChjKSAyMDE1IFN0ZWZhbm8gQmFnbmFyYVxuLy8gTGljZW5zZTogTUlUIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlKSBcbi8vIHJlcXVpcmVzIFwia28ud2F0Y2hcIiBtZXRob2QgZnJvbSBrbm9ja291dC5yZWFjdG9yXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgLy8gTW9kdWxlIHN5c3RlbXMgbWFnaWMgZGFuY2UuXG4gIGlmICh0eXBlb2YgcmVxdWlyZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAvLyBDb21tb25KUyBvciBOb2RlOiBoYXJkLWNvZGVkIGRlcGVuZGVuY3kgb24gXCJrbm9ja291dFwiXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJrbm9ja291dFwiKSwgcmVxdWlyZShcImtub2Nrb3V0anMtcmVhY3RvclwiKSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZVtcImFtZFwiXSkge1xuICAgIC8vIEFNRCBhbm9ueW1vdXMgbW9kdWxlIHdpdGggaGFyZC1jb2RlZCBkZXBlbmRlbmN5IG9uIFwia25vY2tvdXRcIlxuICAgIGRlZmluZShbXCJrbm9ja291dFwiLCBcImtub2Nrb3V0anMtcmVhY3RvclwiLCBcImV4cG9ydHNcIl0sIGZhY3RvcnkpO1xuICB9IGVsc2Uge1xuICAgIC8vIDxzY3JpcHQ+IHRhZzogdXNlIHRoZSBnbG9iYWwgYGtvYCBvYmplY3RcbiAgICBmYWN0b3J5KGtvLCBrby53YXRjaCk7XG4gIH1cbn0oZnVuY3Rpb24gKGtvLCByZWFjdG9yKSB7IFxuXG4gIC8vLyA8c3VtbWFyeT5cbiAgLy8vICAgICBUcmFjayBsYXN0IFwibGV2ZWxzXCIgY2hhbmdlcyB3aXRoaW4gdGhlIGNoYWluZWQgb2JzZXJ2YWJsZSBkb3duIHRvIGFueSBnaXZlbiBsZXZlbCBhbmRcbiAgLy8vICAgICBzdXBwb3J0cyB1bmRvaW5nL3JlZG9pbmcgdGhlIGNoYW5nZXMuXG4gIC8vLyA8L3N1bW1hcnk+XG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9wdGlvbnNcIiB0eXBlPVwib2JqZWN0XCI+XG4gIC8vLyAgICAgeyBsZXZlbHM6IDIgfSAtPiBSZW1lbWJlciBvbmx5IGxhc3QgXCJsZXZlbHNcIiBjaGFuZ2VzPGJyLz5cbiAgLy8vICAgICB7IHVuZG9MYWJlbDogXCJVbmRvIGl0ICgjQ09VTlQpIVwiIH0gLT4gRGVmaW5lIGEgbGFiZWwgZm9yIHRoZSB1bmRvIGNvbW1hbmQuIFwiI0NPVU5UI1wiIHNlcXVlbmNlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgc3RhY2sgbGVuZ3RoLjxici8+XG4gIC8vLyAgICAgeyByZWRvTGFiZWw6IFwiUmVkbyBpdCAoI0NPVU5UKSFcIiB9IC0+IERlZmluZSBhIGxhYmVsIGZvciB0aGUgcmVkbyBjb21tYW5kLiBcIiNDT1VOVCNcIiBzZXF1ZW5jZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHN0YWNrIGxlbmd0aC48YnIvPlxuICAvLy8gPC9wYXJhbT5cbiAgdmFyIHVuZG9NYW5hZ2VyID0gZnVuY3Rpb24gKG1vZGVsLCBvcHRpb25zKSB7XG4gICAgdmFyIHVuZG9TdGFjayA9IGtvLm9ic2VydmFibGVBcnJheSgpO1xuICAgIHZhciByZWRvU3RhY2sgPSBrby5vYnNlcnZhYmxlQXJyYXkoKTtcbiAgICB2YXIgbGFzdFB1c2hlZFN0YWNrO1xuICAgIHZhciBTVEFURV9ET0lORyA9IDA7XG4gICAgdmFyIFNUQVRFX1VORE9JTkcgPSAxO1xuICAgIHZhciBTVEFURV9SRURPSU5HID0gMjtcbiAgICB2YXIgc3RhdGUgPSBTVEFURV9ET0lORztcblxuICAgIHZhciBNT0RFX05PUk1BTCA9IDA7IC8vIGFkZCB0byBzdGFjayBldmVyeSBjaGFuZ2VcbiAgICB2YXIgTU9ERV9JR05PUkUgPSAxOyAvLyBkbyBub3QgYWRkIGFueXRoaW5nIHRvIHRoZSBzdGFja1xuICAgIHZhciBNT0RFX09OQ0UgPSAyOyAvLyBvbmx5IG9uZSBzZXF1ZW50aWFsIGNoYW5nZSBmb3IgZWFjaCBwcm9wZXJ0eSBpcyBhZGRlZCB0byB0aGUgc3RhY2tcbiAgICB2YXIgTU9ERV9NRVJHRSA9IDM7IC8vIG1lcmdlIG5leHQgY2hhbmdlIHdpdGggdGhlIGxhc3Qgb25lXG4gICAgdmFyIG1vZGUgPSBNT0RFX05PUk1BTDtcblxuICAgIHZhciBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAgIGxldmVsczogMTAwLFxuICAgICAgdW5kb0xhYmVsOiBcInVuZG8gKCNDT1VOVCMpXCIsXG4gICAgICByZWRvTGFiZWw6IFwicmVkbyAoI0NPVU5UIylcIlxuICAgIH07XG4gICAgXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09ICdvYmplY3QnKSB7XG4gICAgICBvcHRpb25zID0ga28udXRpbHMuZXh0ZW5kKGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICAgIH1cbiAgXG4gICAgdmFyIF9wdXNoID0gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgLy8gZHVyYW50ZSBVTkRPL1JFRE8gbGF2b3JpYW1vIHNlbXByZSBpbiBub3JtYWxlXG4gICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfVU5ET0lORykge1xuICAgICAgICBfcHVzaEludChhY3Rpb24sIHJlZG9TdGFjayk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFNUQVRFX1JFRE9JTkcpIHtcbiAgICAgICAgX3B1c2hJbnQoYWN0aW9uLCB1bmRvU3RhY2spO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBTVEFURV9ET0lORykge1xuICAgICAgICBfcHVzaEludChhY3Rpb24sIHVuZG9TdGFjayk7XG4gICAgICAgIHJlZG9TdGFjay5yZW1vdmVBbGwoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIHZhciBfdHJ5TWVyZ2UgPSBmdW5jdGlvbiAocHJldiwgbmV3QWN0aW9uKSB7XG4gICAgICBpZiAodHlwZW9mIHByZXYubWVyZ2VkQWN0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gcHJldi5tZXJnZWRBY3Rpb24obmV3QWN0aW9uKTtcbiAgICAgIH0gZWxzZSByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgdmFyIF9wdXNoSW50ID0gZnVuY3Rpb24gKGFjdGlvbiwgbXlTdGFjaykge1xuICAgICAgLyogZ2VzdGlvbmUgZGVsIG1lcmdlIGRpIGF6aW9uaTogc2UgbCd1bHRpbWEgYXppb25lIG5lbGxvIHN0YWNrIGhhIHVuIG1ldG9kbyBcIm1lcmdlZEFjdGlvblwiXG4gICAgICAgICBwcm92aWFtbyBhZCBpbnZvY2FybG8gZSBzZSBjaSByZXN0aXR1aXNjZSB1bmEgZnVuemlvbmUgbGEgdXNpYW1vIGFsIHBvc3RvIGRpIGVudHJhbWJlICovXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIlVSXCIsIFwiX3B1c2hJbnRcIiwgbXlTdGFjaygpLmxlbmd0aCA+IDAgPyB0eXBlb2YgbXlTdGFjaygpW215U3RhY2soKS5sZW5ndGggLSAxXS5tZXJnZWRBY3Rpb24gOiBcIkVNUFRZXCIpO1xuICAgICAgaWYgKG15U3RhY2soKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBtZXJnZWQgPSBfdHJ5TWVyZ2UobXlTdGFjaygpW215U3RhY2soKS5sZW5ndGggLSAxXSwgYWN0aW9uKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJVUlwiLCBcIl9wdXNoSW50Lm1lcmdlZFwiLCBtZXJnZWQsIFwiTVZcIiwgdHlwZW9mIGFjdGlvbi5tZXJnZWFibGVNb3ZlLCBcIk1BXCIsIHR5cGVvZiBhY3Rpb24ubWVyZ2VhYmxlQWN0aW9uLCBcIk1NXCIsIHR5cGVvZiBhY3Rpb24ubWVyZ2VNZSk7XG4gICAgICAgIGlmIChtZXJnZWQgIT09IG51bGwpIHtcbiAgICAgICAgICBteVN0YWNrKClbbXlTdGFjaygpLmxlbmd0aCAtIDFdID0gbWVyZ2VkO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG15U3RhY2soKS5sZW5ndGggPj0gb3B0aW9ucy5sZXZlbHMpIG15U3RhY2suc2hpZnQoKTtcbiAgICAgIGxhc3RQdXNoZWRTdGFjayA9IG15U3RhY2s7XG4gICAgICBteVN0YWNrLnB1c2goYWN0aW9uKTtcbiAgICB9O1xuICAgIFxuICAgIHZhciBfeGRvQ29tbWFuZCA9IGZ1bmN0aW9uKGxhYmVsLCB3b3JrU3RhdGUsIHN0YWNrKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBrby5jb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShsYWJlbCkucmVwbGFjZSgvI0NPVU5UIy8sIHN0YWNrKCkubGVuZ3RoKTtcbiAgICAgICAgfSksXG4gICAgICAgIGVuYWJsZWQ6IGtvLmNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBzdGFjaygpLmxlbmd0aCAhPT0gMDtcbiAgICAgICAgfSksXG4gICAgICAgIGV4ZWN1dGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhY3Rpb24gPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICBpZiAoYWN0aW9uKSB7XG4gICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gc3RhdGU7XG4gICAgICAgICAgICBzdGF0ZSA9IHdvcmtTdGF0ZTtcbiAgICAgICAgICAgIHZhciBvbGRNb2RlID0gbW9kZTtcbiAgICAgICAgICAgIG1vZGUgPSBNT0RFX01FUkdFO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJYRE9cIiwgXCJiZWZvcmVcIiwgbGFiZWwpO1xuICAgICAgICAgICAgYWN0aW9uKCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlhET1wiLCBcImFmdGVyXCIsIGxhYmVsKTtcbiAgICAgICAgICAgIF9yZW1vdmVNZXJnZWRBY3Rpb24obGFzdFB1c2hlZFN0YWNrKTtcbiAgICAgICAgICAgIG1vZGUgPSBvbGRNb2RlO1xuICAgICAgICAgICAgc3RhdGUgPSBwcmV2U3RhdGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICB2YXIgX3JlbW92ZU1lcmdlZEFjdGlvbiA9IGZ1bmN0aW9uKG15U3RhY2spIHtcbiAgICAgIGlmICh0eXBlb2YgbXlTdGFjayA9PSAndW5kZWZpbmVkJykgdGhyb3cgXCJVbmV4cGVjdGVkIG9wZXJhdGlvbjogc3RhY2sgY2xlYW5lciBjYWxsZWQgd2l0aCB1bmRlZmluZWQgc3RhY2tcIjtcbiAgICAgIFxuICAgICAgaWYgKG15U3RhY2soKS5sZW5ndGggPiAwICYmIHR5cGVvZiBteVN0YWNrKClbbXlTdGFjaygpLmxlbmd0aCAtIDFdLm1lcmdlZEFjdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJSZW1vdmluZyBtZXJnZWRBY3Rpb24gZnJvbSBzdGFja1wiKTtcbiAgICAgICAgZGVsZXRlIG15U3RhY2soKVtteVN0YWNrKCkubGVuZ3RoIC0gMV0ubWVyZ2VkQWN0aW9uO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgX2NvbWJpbmVkRnVuY3Rpb24gPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKSB7XG4gICAgICB2YXIgcmVzID0gKGZ1bmN0aW9uKGYxLCBmMikge1xuICAgICAgICBmMSgpO1xuICAgICAgICBmMigpO1xuICAgICAgfSkuYmluZCh1bmRlZmluZWQsIGZpcnN0LCBzZWNvbmQpO1xuICAgICAgaWYgKHR5cGVvZiBmaXJzdC5tZXJnZWRBY3Rpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJlcy5tZXJnZWRBY3Rpb24gPSBmaXJzdC5tZXJnZWRBY3Rpb247XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG5cbiAgICB2YXIgZXhlY3V0ZVVuZG9BY3Rpb24gPSBmdW5jdGlvbihjaGlsZCwgdmFsdWUsIGl0ZW0pIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXhlY3V0ZVVuZG9BY3Rpb25cIiwgY2hpbGQsIHZhbHVlLCBpdGVtKTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNoaWxkKHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbSkge1xuICAgICAgICBpZiAoaXRlbS5zdGF0dXMgPT0gJ2RlbGV0ZWQnKSB7XG4gICAgICAgICAgY2hpbGQuc3BsaWNlKGl0ZW0uaW5kZXgsIDAsIGl0ZW0udmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uc3RhdHVzID09ICdhZGRlZCcpIHtcbiAgICAgICAgICBjaGlsZC5zcGxpY2UoaXRlbS5pbmRleCwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgXCJVbnN1cHByb3RlZCBpdGVtLnN0YXR1czogXCIraXRlbS5zdGF0dXM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IFwiVW5leHBlY3RlZCBjb25kaXRpb246IG5vIGl0ZW0gYW5kIG5vIGNoaWxkLm9sZFZhbHVlcyFcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIG1ha2VVbmRvQWN0aW9uRGVmYXVsdCA9IGZ1bmN0aW9uKHVuZG9GdW5jLCBwYXJlbnRzLCBjaGlsZCwgb2xkVmFsLCBpdGVtKSB7XG4gICAgICByZXR1cm4gdW5kb0Z1bmMuYmluZCh1bmRlZmluZWQsIGNoaWxkLCBvbGRWYWwsIGl0ZW0pO1xuICAgIH07XG5cbiAgICB2YXIgbWFrZVVuZG9BY3Rpb24gPSBtYWtlVW5kb0FjdGlvbkRlZmF1bHQ7XG5cbiAgICB2YXIgY2hhbmdlUHVzaGVyID0gZnVuY3Rpb24ocGFyZW50cywgY2hpbGQsIGl0ZW0pIHtcbiAgICAgIHZhciBvbGRWYWwgPSB0eXBlb2YgY2hpbGQub2xkVmFsdWVzICE9ICd1bmRlZmluZWQnID8gY2hpbGQub2xkVmFsdWVzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgdmFyIGFjdCA9IG1ha2VVbmRvQWN0aW9uKGV4ZWN1dGVVbmRvQWN0aW9uLCBwYXJlbnRzLCBjaGlsZCwgb2xkVmFsLCBpdGVtKTtcblxuICAgICAgaWYgKG1vZGUgPT0gTU9ERV9JR05PUkUpIHJldHVybjtcblxuICAgICAgaWYgKG1vZGUgPT0gTU9ERV9NRVJHRSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlVSXCIsIFwibWVyZ2Vtb2RlXCIpO1xuICAgICAgICBpZiAodHlwZW9mIGFjdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBhY3QubWVyZ2VkQWN0aW9uID0gZnVuY3Rpb24obmV3QWN0aW9uKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5ld0FjdGlvbi5tZXJnZU1lICE9PSAndW5kZWZpbmVkJyAmJiBuZXdBY3Rpb24ubWVyZ2VNZSkge1xuICAgICAgICAgICAgICByZXR1cm4gX2NvbWJpbmVkRnVuY3Rpb24obmV3QWN0aW9uLCB0aGlzKTtcbiAgICAgICAgICAgIH0gZWxzZSByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGFjdC5tZXJnZU1lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaWYgKGNoaWxkLm9sZFZhbHVlcyAmJiBtb2RlID09IE1PREVfT05DRSkge1xuICAgICAgICAgICAgYWN0Lm1lcmdlZEFjdGlvbiA9IGZ1bmN0aW9uKG9sZENoaWxkLCBvbGRJdGVtLCBuZXdBY3Rpb24pIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdBY3Rpb24ubWVyZ2VhYmxlQWN0aW9uID09ICdvYmplY3QnICYmIG9sZENoaWxkID09IG5ld0FjdGlvbi5tZXJnZWFibGVBY3Rpb24uY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlVSXCIsIFwiaWdub3JlIHVwZGF0ZSBmb3IgcHJvcGVydHkgaW4gTU9ERV9PTkNFXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICB9IGVsc2UgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LmJpbmQoYWN0LCBjaGlsZCwgaXRlbSk7XG4gICAgICAgICAgICBhY3QubWVyZ2VhYmxlQWN0aW9uID0geyBjaGlsZDogY2hpbGQsIGl0ZW06IGl0ZW0gfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJVUlwiLCBcIml0ZW0uc3RhdHVzXCIsIGl0ZW0uc3RhdHVzKTtcbiAgICAgICAgICAvLyBcIml0ZW1cIiBpcyB2YWx1ZWQgd2hlbiBhbiBpdGVtIGlzIGFkZGVkL3JlbW92ZWQvcmV0ZWluZWQgaW4gYW4gYXJyYXlcbiAgICAgICAgICAvLyBzb21ldGltZXMgS08gZGV0ZWN0IFwibW92ZXNcIiBhbmQgYWRkIGEgXCJtb3ZlZFwiIHByb3BlcnR5IHdpdGggdGhlIGluZGV4IGJ1dFxuICAgICAgICAgIC8vIHRoaXMgZG9lc24ndCBoYXBwZW4gZm9yIGV4YW1wbGUgdXNpbmcga25vY2tvdXQtc29ydGFibGUgb3Igd2hlbiBtb3Zpbmcgb2JqZWN0c1xuICAgICAgICAgIC8vIGJldHdlZW4gYXJyYXlzLlxuICAgICAgICAgIC8vIFNvIHRoaXMgZW5kcyB1cCBoYW5kbGluZyB0aGlzIHdpdGggXCJtZXJnZWFibGVNb3ZlXCIgYW5kIFwibWVyZ2VkQWN0aW9uXCI6IFxuICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0uc3RhdHVzID09ICdkZWxldGVkJykge1xuICAgICAgICAgICAgLy8gVE9ETyBzZSBzb25vIGluIE1PREUgPSBNRVJHRSBkZXZvIG1ldHRlZXIgdW5hIGZ1bnppb25lIGRpIG1lcmdlIGNoZSBhY2NldHRhIHR1dHRvLlxuICAgICAgICAgICAgLy8gYWx0cmltZW50aSBsYXNjaW8gcXVlc3RhLlxuICAgICAgICAgICAgYWN0Lm1lcmdlZEFjdGlvbiA9IGZ1bmN0aW9uKG9sZENoaWxkLCBvbGRJdGVtLCBuZXdBY3Rpb24pIHtcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJVUlwiLCBcImFjdC5tZXJnZWRBY3Rpb25cIiwgdHlwZW9mIG5ld0FjdGlvbi5tZXJnZWFibGVNb3ZlKTtcbiAgICAgICAgICAgICAgLy8gYSBkZWxldGVkIGFjdGlvbiBpcyBhYmxlIHRvIG1lcmdlIHdpdGggYSBhZGRlZCBhY3Rpb24gaWYgdGhleSBhcHBseSB0byB0aGUgc2FtZVxuICAgICAgICAgICAgICAvLyBvYmplY3QuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgbmV3QWN0aW9uLm1lcmdlYWJsZU1vdmUgPT0gJ29iamVjdCcgJiYgb2xkSXRlbS52YWx1ZSA9PSBuZXdBY3Rpb24ubWVyZ2VhYmxlTW92ZS5pdGVtLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlIEkgc2ltcGx5IHJldHVybiBhIHNpbmdsZSBhY3Rpb24gcnVubmluZyBib3RoIGFjdGlvbnMgaW4gc2VxdWVuY2UsXG4gICAgICAgICAgICAgICAgLy8gdGhpcyB3YXkgdGhlIFwidW5kb1wiIHdpbGwgbmVlZCB0byB1bmRvIG9ubHkgb25jZSBmb3IgYSBcIm1vdmVcIiBvcGVyYXRpb24uXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb21iaW5lZEZ1bmN0aW9uKG5ld0FjdGlvbiwgdGhpcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJVUlwiLCBcIm5vdCBtZXJnZWFibGVcIiwgdHlwZW9mIG5ld0FjdGlvbi5tZXJnZWFibGVNb3ZlKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfS5iaW5kKGFjdCwgY2hpbGQsIGl0ZW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnN0YXR1cyA9PSAnYWRkZWQnKSB7XG4gICAgICAgICAgICAvLyBhZGQgYSBtZXJnZWFibGVNb3ZlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBuZXh0IGFjdGlvbiBcIm1lcmdlZEFjdGlvblwiIHRvIHNlZSBpZiB0aGlzIGFjdGlvblxuICAgICAgICAgICAgLy8gY2FuIGJlIG1lcmdlZC5cbiAgICAgICAgICAgIGFjdC5tZXJnZWFibGVNb3ZlID0geyBjaGlsZDogY2hpbGQsIGl0ZW06IGl0ZW0gfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgYWN0ICE9PSAndW5kZWZpbmVkJykgX3B1c2goYWN0KTtcbiAgICB9O1xuXG4gICAgdmFyIHJlYWN0b3JPcHRpb25zID0geyBkZXB0aDogLTEsIG9sZFZhbHVlczogMSwgbXV0YWJsZTogdHJ1ZSwgLyogdGFnUGFyZW50c1dpdGhOYW1lOiB0cnVlICovIHRhZ0ZpZWxkczogdHJ1ZSB9O1xuXG4gICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICB2YXIgcmVhY3QgPSB0eXBlb2YgcmVhY3RvciA9PSAnZnVuY3Rpb24nID8gcmVhY3RvciA6IGtvLndhdGNoO1xuICAgIHZhciByZXMgPSByZWFjdChtb2RlbCwgcmVhY3Rvck9wdGlvbnMsIGNoYW5nZVB1c2hlciwgY29udGV4dCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHVzaDogX3B1c2gsIFxuICAgICAgdW5kb0NvbW1hbmQ6IF94ZG9Db21tYW5kKG9wdGlvbnMudW5kb0xhYmVsLCBTVEFURV9VTkRPSU5HLCB1bmRvU3RhY2spLFxuICAgICAgcmVkb0NvbW1hbmQ6IF94ZG9Db21tYW5kKG9wdGlvbnMucmVkb0xhYmVsLCBTVEFURV9SRURPSU5HLCByZWRvU3RhY2spLFxuICAgICAgcmVzZXQ6IGZ1bmN0aW9uKCkgeyB1bmRvU3RhY2sucmVtb3ZlQWxsKCk7IHJlZG9TdGFjay5yZW1vdmVBbGwoKTsgfSxcbiAgICAgIC8vIHNldE1vZGU6IGZ1bmN0aW9uKG5ld01vZGUpIHsgbW9kZSA9IG5ld01vZGU7IF9yZW1vdmVNZXJnZWRBY3Rpb24odW5kb1N0YWNrKTsgfSxcbiAgICAgIHNldE1vZGVPbmNlOiBmdW5jdGlvbigpIHsgbW9kZSA9IE1PREVfT05DRTsgX3JlbW92ZU1lcmdlZEFjdGlvbih1bmRvU3RhY2spOyB9LFxuICAgICAgc2V0TW9kZU1lcmdlOiBmdW5jdGlvbigpIHsgbW9kZSA9IE1PREVfTUVSR0U7IF9yZW1vdmVNZXJnZWRBY3Rpb24odW5kb1N0YWNrKTsgfSxcbiAgICAgIHNldE1vZGVOb3JtYWw6IGZ1bmN0aW9uKCkgeyBtb2RlID0gTU9ERV9OT1JNQUw7IF9yZW1vdmVNZXJnZWRBY3Rpb24odW5kb1N0YWNrKTsgfSxcbiAgICAgIHNldE1vZGVJZ25vcmU6IGZ1bmN0aW9uKCkgeyBtb2RlID0gTU9ERV9JR05PUkU7IF9yZW1vdmVNZXJnZWRBY3Rpb24odW5kb1N0YWNrKTsgfSxcbiAgICAgIHNldFVuZG9BY3Rpb25NYWtlcjogZnVuY3Rpb24obWFrZXIpIHsgbWFrZVVuZG9BY3Rpb24gPSBtYWtlcjsgfSxcbiAgICAgIGRpc3Bvc2U6IGZ1bmN0aW9uKCkgeyAvKiBrby51bndhdGNoKG1vZGVsLCByZWFjdG9yT3B0aW9ucywgY2hhbmdlUHVzaGVyKTsgKi8gcmVzLmRpc3Bvc2UoKTsgfVxuICAgIH07XG4gIH07XG5cbiAgcmV0dXJuIHVuZG9NYW5hZ2VyO1xuICBcbn0pKTsiLCIvLyBLbm9ja291dCBGYXN0IE1hcHBpbmcgdjAuMVxuLy8gTGljZW5zZTogTUlUIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocClcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG5cdC8vIE1vZHVsZSBzeXN0ZW1zIG1hZ2ljIGRhbmNlLlxuXG5cdGlmICh0eXBlb2YgcmVxdWlyZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KUyBvciBOb2RlOiBoYXJkLWNvZGVkIGRlcGVuZGVuY3kgb24gXCJrbm9ja291dFwiXG5cdFx0ZmFjdG9yeShyZXF1aXJlKFwia25vY2tvdXRcIiksIGV4cG9ydHMpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmVbXCJhbWRcIl0pIHtcblx0XHQvLyBBTUQgYW5vbnltb3VzIG1vZHVsZSB3aXRoIGhhcmQtY29kZWQgZGVwZW5kZW5jeSBvbiBcImtub2Nrb3V0XCJcblx0XHRkZWZpbmUoW1wia25vY2tvdXRcIiwgXCJleHBvcnRzXCJdLCBmYWN0b3J5KTtcblx0fSBlbHNlIHtcblx0XHQvLyA8c2NyaXB0PiB0YWc6IHVzZSB0aGUgZ2xvYmFsIGBrb2Agb2JqZWN0LCBhdHRhY2hpbmcgYSBgd3JhcGAgcHJvcGVydHlcblx0XHRmYWN0b3J5KGtvLCBrby53cmFwID0ge30pO1xuXHR9XG59KGZ1bmN0aW9uIChrbywgZXhwb3J0cykge1xuICAgIFxuICAgIC8vIHRoaXMgZnVuY3Rpb24gbWltaWNzIGtvLm1hcHBpbmdcbiAgICBleHBvcnRzLmZyb21KUyA9IGZ1bmN0aW9uKGpzT2JqZWN0LCBjb21wdXRlZEZ1bmN0aW9ucywgb2JzZXJ2YWJsZU9iamVjdHMpXG4gICAge1xuICAgICAgICByZXNldCgpO1xuXHRyZXR1cm4gd3JhcChqc09iamVjdCwgY29tcHV0ZWRGdW5jdGlvbnMsIG9ic2VydmFibGVPYmplY3RzKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGZ1bmN0aW9uIHVud3JhcHMgdGhlIG91dGVyIGZvciBhc3NpZ25pbmcgdGhlIHJlc3VsdCB0byBhbiBvYnNlcnZhYmxlXG4gICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9TdGV2ZVNhbmRlcnNvbi9rbm9ja291dC9pc3N1ZXMvNTE3XG4gICAgZXhwb3J0cy51cGRhdGVGcm9tSlMgPSBmdW5jdGlvbihvYnNlcnZhYmxlLCBqc09iamVjdCwgY29tcHV0ZWRGdW5jdGlvbnMsIG9ic2VydmFibGVPYmplY3RzKVxuICAgIHtcbiAgICAgICAgcmVzZXQoKTtcblx0cmV0dXJuIG9ic2VydmFibGUoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh3cmFwKGpzT2JqZWN0LCBjb21wdXRlZEZ1bmN0aW9ucywgb2JzZXJ2YWJsZU9iamVjdHMpKSk7XG4gICAgfVxuXG4gICAgZXhwb3J0cy5mcm9tSlNPTiA9IGZ1bmN0aW9uIChqc29uU3RyaW5nLCBjb21wdXRlZEZ1bmN0aW9ucywgb2JzZXJ2YWJsZU9iamVjdHMpIHtcblx0dmFyIHBhcnNlZCA9IGtvLnV0aWxzLnBhcnNlSnNvbihqc29uU3RyaW5nKTtcblx0YXJndW1lbnRzWzBdID0gcGFyc2VkO1xuXHRyZXR1cm4gZXhwb3J0cy5mcm9tSlMuYXBwbHkodGhpcywgY29tcHV0ZWRGdW5jdGlvbnMsIG9ic2VydmFibGVPYmplY3RzKTtcbiAgICB9O1xuICAgIFxuICAgIGV4cG9ydHMudG9KUyA9IGZ1bmN0aW9uIChvYnNlcnZhYmxlKSB7XG5cdHJldHVybiB1bndyYXAob2JzZXJ2YWJsZSk7XG4gICAgfVxuXG4gICAgZXhwb3J0cy50b0pTT04gPSBmdW5jdGlvbiAob2JzZXJ2YWJsZSkge1xuXHR2YXIgcGxhaW5KYXZhU2NyaXB0T2JqZWN0ID0gZXhwb3J0cy50b0pTKG9ic2VydmFibGUpO1xuXHRyZXR1cm4ga28udXRpbHMuc3RyaW5naWZ5SnNvbihwbGFpbkphdmFTY3JpcHRPYmplY3QpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiB0eXBlT2YodmFsdWUpIHtcblx0dmFyIHMgPSB0eXBlb2YgdmFsdWU7XG5cdGlmIChzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09IERhdGUpXG4gICAgICAgICAgICAgICAgICAgIHMgPSAnZGF0ZSc7XG5cdFx0ZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PSAnW29iamVjdCBBcnJheV0nKVxuICAgICAgICAgICAgICAgICAgICBzID0gJ2FycmF5JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG5cdFx0cyA9ICdudWxsJztcbiAgICAgICAgICAgIH1cblx0fVxuXHRyZXR1cm4gcztcbiAgICB9XG5cbiAgICAvLyB1bndyYXBwaW5nXG4gICAgZnVuY3Rpb24gdW53cmFwT2JqZWN0KG8pXG4gICAge1xuXHR2YXIgdCA9IHt9O1xuXG5cdGZvciAodmFyIGsgaW4gbylcblx0e1xuXHQgICAgdmFyIHYgPSBvW2tdO1xuXG5cdCAgICBpZiAoa28uaXNDb21wdXRlZCh2KSlcblx0XHRjb250aW51ZTtcblxuXHQgICAgdFtrXSA9IHVud3JhcCh2KTtcblx0fVxuXG5cdHJldHVybiB0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVud3JhcEFycmF5KGEpXG4gICAge1xuXHR2YXIgciA9IFtdO1xuXG5cdGlmICghYSB8fCBhLmxlbmd0aCA9PSAwKVxuXHQgICAgcmV0dXJuIHI7XG5cdFxuXHRmb3IgKHZhciBpID0gMCwgbCA9IGEubGVuZ3RoOyBpIDwgbDsgKytpKVxuXHQgICAgci5wdXNoKHVud3JhcChhW2ldKSk7XG5cblx0cmV0dXJuIHI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW53cmFwKHYpXG4gICAge1xuXHR2YXIgaXNPYnNlcnZhYmxlID0ga28uaXNPYnNlcnZhYmxlKHYpO1xuXG5cdGlmIChpc09ic2VydmFibGUpXG5cdHtcblx0ICAgIHZhciB2YWwgPSB2KCk7XG5cblx0ICAgIHJldHVybiB1bndyYXAodmFsKTtcblx0fVxuXHRlbHNlXG5cdHtcblx0ICAgIGlmICh0eXBlT2YodikgPT0gXCJhcnJheVwiKVxuXHQgICAge1xuXHRcdHJldHVybiB1bndyYXBBcnJheSh2KTtcblx0ICAgIH1cblx0ICAgIGVsc2UgaWYgKHR5cGVPZih2KSA9PSBcIm9iamVjdFwiKVxuXHQgICAge1xuXHRcdHJldHVybiB1bndyYXBPYmplY3Qodik7XG5cdCAgICB9XG5cdCAgICBlbHNlXG5cdCAgICB7XG5cdFx0cmV0dXJuIHY7XG5cdCAgICB9XG5cdH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNldCgpXG4gICAge1xuICAgICAgICBwYXJlbnRzID0gW3tvYmo6IG51bGwsIHdyYXBwZWQ6IG51bGwsIGx2bDogXCJcIn1dO1xuICAgIH0gICAgXG4gICAgXG4gICAgLy8gd3JhcHBpbmdcblxuICAgIGZ1bmN0aW9uIHdyYXBPYmplY3QobywgY29tcHV0ZWRGdW5jdGlvbnMsIG9ic2VydmFibGVPYmplY3RzKVxuICAgIHtcbiAgICAgICAgLy8gY2hlY2sgZm9yIGluZmluaXRlIHJlY3Vyc2lvblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnRzW2ldLm9iaiA9PT0gbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRzW2ldLndyYXBwZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuXHR2YXIgdCA9IHt9O1xuXG5cdGZvciAodmFyIGsgaW4gbylcblx0e1xuXHQgICAgdmFyIHYgPSBvW2tdO1xuXG4gICAgICAgICAgICBwYXJlbnRzLnB1c2goe29iajogbywgd3JhcHBlZDogdCwgbHZsOiBjdXJyZW50THZsKCkgKyBcIi9cIiArIGt9KTtcblxuXHQgICAgdFtrXSA9IHdyYXAodiwgY29tcHV0ZWRGdW5jdGlvbnMsIG9ic2VydmFibGVPYmplY3RzKTtcblxuICAgICAgICAgICAgcGFyZW50cy5wb3AoKTtcblx0fVxuXG5cdGlmIChjb21wdXRlZEZ1bmN0aW9ucyAmJiBjb21wdXRlZEZ1bmN0aW9uc1tjdXJyZW50THZsKCldKVxuXHQgICAgdCA9IGNvbXB1dGVkRnVuY3Rpb25zW2N1cnJlbnRMdmwoKV0odCk7XG5cbiAgICAgICAgaWYgKGhhc0VTNVBsdWdpbigpKVxuICAgICAgICAgICAga28udHJhY2sodCk7XG5cblx0aWYgKG9ic2VydmFibGVPYmplY3RzKSByZXR1cm4ga28ub2JzZXJ2YWJsZSh0KTtcblx0cmV0dXJuIHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd3JhcEFycmF5KGEsIGNvbXB1dGVkRnVuY3Rpb25zLCBvYnNlcnZhYmxlT2JqZWN0cylcbiAgICB7XG5cdHZhciByID0ga28ub2JzZXJ2YWJsZUFycmF5KCk7XG5cblx0aWYgKCFhIHx8IGEubGVuZ3RoID09IDApXG5cdCAgICByZXR1cm4gcjtcblxuXHRmb3IgKHZhciBpID0gMCwgbCA9IGEubGVuZ3RoOyBpIDwgbDsgKytpKVxuXHQgICAgci5wdXNoKHdyYXAoYVtpXSwgY29tcHV0ZWRGdW5jdGlvbnMsIG9ic2VydmFibGVPYmplY3RzKSk7XG5cblx0cmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gYSBzdGFjaywgdXNlZCBmb3IgdHdvIHB1cnBvc2VzOlxuICAgIC8vICAtIGNpcmN1bGFyIHJlZmVyZW5jZSBjaGVja2luZ1xuICAgIC8vICAtIGNvbXB1dGVkIGZ1bmN0aW9uc1xuICAgIHZhciBwYXJlbnRzO1xuXG4gICAgZnVuY3Rpb24gY3VycmVudEx2bCgpXG4gICAge1xuXHRyZXR1cm4gcGFyZW50c1twYXJlbnRzLmxlbmd0aC0xXS5sdmw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd3JhcCh2LCBjb21wdXRlZEZ1bmN0aW9ucywgb2JzZXJ2YWJsZU9iamVjdHMpXG4gICAge1xuXHRpZiAodHlwZU9mKHYpID09IFwiYXJyYXlcIilcblx0e1xuXHQgICAgcmV0dXJuIHdyYXBBcnJheSh2LCBjb21wdXRlZEZ1bmN0aW9ucywgb2JzZXJ2YWJsZU9iamVjdHMpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVPZih2KSA9PSBcIm9iamVjdFwiKVxuXHR7XG5cdCAgICByZXR1cm4gd3JhcE9iamVjdCh2LCBjb21wdXRlZEZ1bmN0aW9ucywgb2JzZXJ2YWJsZU9iamVjdHMpO1xuXHR9XG5cdGVsc2Vcblx0e1xuICAgICAgICAgICAgaWYgKCFoYXNFUzVQbHVnaW4oKSAmJiB0eXBlb2YgdiAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIHtcblx0ICAgICAgICB2YXIgdCA9IGtvLm9ic2VydmFibGUoKTtcblx0ICAgICAgICB0KHYpO1xuXHQgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHY7XG5cdH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNFUzVQbHVnaW4oKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIGtvLnRyYWNrICE9IG51bGw7XG4gICAgfVxufSkpO1xuIiwiLy8gRGVlcCBvYnNlcnZlciBwbHVnaW4gZm9yIEtub2Nrb3V0IGh0dHA6Ly9rbm9ja291dGpzLmNvbS9cclxuLy8gKGMpIFppYWQgSmVlcm9idXJraGFuXHJcbi8vIExpY2Vuc2U6IE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApXHJcbi8vIFZlcnNpb24gMS4zLjhcclxuOyAoZnVuY3Rpb24gKGZhY3RvcnkpIHtcclxuICAgIC8vIENvbW1vbkpTXHJcbiAgICBpZiAodHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgZmFjdG9yeShyZXF1aXJlKCdrbm9ja291dCcpKTtcclxuICAgICAgICAvLyBBTURcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XHJcbiAgICAgICAgZGVmaW5lKFsna25vY2tvdXQnXSwgZmFjdG9yeSk7XHJcbiAgICAgICAgLy8gTm9ybWFsIHNjcmlwdCB0YWdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZmFjdG9yeSh3aW5kb3cua28pO1xyXG4gICAgfVxyXG59KGZ1bmN0aW9uIChrbykge1xyXG5rby5zdWJzY3JpYmFibGUuZm5bJ3dhdGNoJ10gPSBmdW5jdGlvbiAodGFyZ2V0T3JDYWxsYmFjaywgb3B0aW9ucywgZXZhbHVhdG9yQ2FsbGJhY2ssIGNvbnRleHQpIHtcclxuICAgIC8vLyA8c3VtbWFyeT5cclxuICAgIC8vLyAgICAgVHJhY2sgYW5kIG1hbmFnZSBjaGFuZ2VzIHdpdGhpbiB0aGUgY2hhaW5lZCBvYnNlcnZhYmxlIGRvd24gdG8gYW55IGdpdmVuIGxldmVsLiBcclxuICAgIC8vLyA8L3N1bW1hcnk+XHJcbiAgICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXJnZXRPckNhbGxiYWNrXCI+XHJcbiAgICAvLy8gICAgICBUaGUgc3Vic2NyaXB0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdWJzY3JpYmFibGVzIHRvIGJlIHdhdGNoZWQuXHJcbiAgICAvLy8gPC9wYXJhbT5cclxuICAgIC8vLyA8cGFyYW0gbmFtZT1cIm9wdGlvbnNcIiB0eXBlPVwib2JqZWN0XCI+XHJcbiAgICAvLy8gICAgIGZhbHNlIC0+IERpc2FibGVzIHRyYWNraW5nIG9uIHRoZSBjaGFpbmVkIG9ic2VydmFibGUuXHJcbiAgICAvLy8gICAgIHsgZGVwdGg6IDIgfSAtPiBUcmFjayBhbGwgbmVzdGVkIHN1YnNjcmliYWJsZXMgZG93biB0byB0aGUgMm5kIGxldmVsKGRlZmF1bHQgaXMgMSkuPGJyLz5cclxuICAgIC8vLyAgICAgeyBkZXB0aDogLTEgfSAtPiBUcmFjayBhbGwgbmVzdGVkIHN1YnNjcmliYWJsZXMuPGJyLz5cclxuICAgIC8vLyAgICAgeyBoaWRlOiBbLi4uXSB9IC0+IFByb3BlcnR5IG9yIGFycmF5IG9mIHByb3BlcnRpZXMgdG8gYmUgaWdub3JlZC48YnIvPlxyXG4gICAgLy8vICAgICB7IGhpZGVBcnJheXM6IHRydWUgfSAtPiBJZ25vcmUgYWxsIG5lc3RlZCBhcnJheXMuPGJyLz5cclxuICAgIC8vLyAgICAgeyBoaWRlV3JhcHBlZFZhbHVlczogdHJ1ZSB9IC0+IElnbm9yZSBvYnNlcnZhYmxlcyB3cmFwcGVkIHVuZGVyIHlldCBhbm90aGVyIHBhcmVudCBvYnNlcnZhYmxlLjxici8+XHJcbiAgICAvLy8gICAgIHsgbXV0YWJsZTogdHJ1ZSB9IC0+IER5bmFtaWNhbGx5IGFkYXB0IHRvIGNoYW5nZXMgbWFkZSB0byB0aGUgdGFyZ2V0IHN0cnVjdHVyZSB0aHJvdWdoIGFueSBzdWJzY3JpYmFibGUuPGJyLz5cclxuICAgIC8vLyAgICAgeyB3YXRjaGVkT25seTogdHJ1ZSB9IC0+IFdhdGNoIG9ubHkgc3Vic2NyaWJhYmxlcyB0YWdnZWQgd2l0aCAud2F0Y2goKS48YnIvPlxyXG4gICAgLy8vICAgICB7IGJlZm9yZVdhdGNoOiBmdW5jdGlvbihwYXJlbnRzLCBjaGlsZCkgey4uLn0gfSAtPiBGdW5jdGlvbiBjYWxsZWQgcHJpb3IgdG8gY3JlYXRpbmcgYSBzdWJzY3JpcHRpb24uIFJldHVybmluZyBmYWxzZSBhYm9ydHMgdGhlIG9wZXJhdGlvbiBhbmQgaWdub3JlcyBpdHMgY2hpbGRyZW4uPGJyLz5cclxuICAgIC8vLyAgICAgeyB3cmFwOiB0cnVlIH0gLT4gV3JhcCBhbGwgZmllbGRzIGludG8gb2JzZXJ2YWJsZXMuIFRoaXMgaGFwcGVucyBvbiB0aGUgZmx5IGZvciBuZXcgYXJyYXkgaXRlbXMob3IgY2hpbGQgb2JqZWN0cyB3aGVuIG11dGFibGUgaXMgc2V0IHRvIHRydWUpLjxici8+XHJcbiAgICAvLy8gICAgIHsgYmVmb3JlV3JhcDogZnVuY3Rpb24ocGFyZW50cywgZmllbGQsIHZhbHVlKSB7Li4ufSB9IC0+IEZ1bmN0aW9uIGNhbGxlZCBwcmlvciB0byB3cmFwcGluZyBhIHZhbHVlIGludG8gYW4gb2JzZXJ2YWJsZS4gUmV0dXJuaW5nIGZhbHNlIGxlYXZlcyBpdCBhcyBpdCBpcy48YnIvPlxyXG4gICAgLy8vICAgICB7IHRhZ0ZpZWxkczogdHJ1ZSB9IC0+IEFkZCB0aGUgcHJvcGVydHkgJ19maWVsZE5hbWUnIHVuZGVyIGVhY2ggcHJvcGVydHkgZm9yIHRleHR1YWwgaWRlbnRpZmljYXRpb24uPGJyLz5cclxuICAgIC8vLyAgICAgeyB0YWdGaWVsZHM6ICdwYXJlbnRzT25seScgfSAtPiBTYW1lIGFzIGFib3ZlIGV4Y2VwdCB0aGF0IGl0IGlzIGxpbWl0ZWQgdG8gcGFyZW50IHByb3BlcnRpZXMgb25seS48YnIvPlxyXG4gICAgLy8vICAgICB7IG9sZFZhbHVlczogMyB9IC0+IEtlZXAgdGhlIGxhc3QgdGhyZWUgdmFsdWVzIGZvciBlYWNoIHN1YnNjcmliYWJsZSB1bmRlciB0aGUgcHJvcGVydHkgJ29sZFZhbHVlcycuPGJyLz5cclxuICAgIC8vLyAgICAgeyBzZWFsOiB0cnVlIH0gLT4gUHJldmVudCBhbnkgc3Vic2VxdWVudCB3YXRjaGVyIGZyb20gd2F0Y2hpbmcgdGhlIHRhcmdldCBhZ2Fpbi48YnIvPlxyXG4gICAgLy8vICAgICB7IHVubG9vcDogdHJ1ZSB9IC0+IEF2b2lkIGNpcmN1bGFyIHBhdGhzIHRocm91Z2ggdGhlIHVzZSBvZiBhIGJyZWFkY3J1bWIgcHJvcGVydHkgJ193YXRjaGVyJyBzZXQgYXQgZWFjaCBub2RlIGxldmVsLjxici8+XHJcbiAgICAvLy8gPC9wYXJhbT5cclxuICAgIC8vLyA8cGFyYW0gbmFtZT1cImV2YWx1YXRvckNhbGxiYWNrXCIgdHlwZT1cImZ1bmN0aW9uXCI+XHJcbiAgICAvLy8gICAgIFRoZSAgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGR1cmluZyBjaGFuZ2VzLiBBbnkgcmV0dXJuIHZhbHVlIGlzIGFzc2lnbmVkIHRvIHRoZSBjaGFpbmVkIG9ic2VydmFibGUuXHJcbiAgICAvLy8gPC9wYXJhbT5cclxuXHJcbiAgICB2YXIgdGFyZ2V0VHlwZSA9IHR5cGVvZiB0YXJnZXRPckNhbGxiYWNrO1xyXG5cclxuICAgIGlmICh0YXJnZXRUeXBlID09PSAnYm9vbGVhbicgfHwgdGFyZ2V0VHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvLyBUdXJuIG9uIG9yIG9mZiB0aGUgd2F0Y2hlciBmb3IgdGhlIHNwZWNpZmllZCB0YXJnZXQgYWxvbmcgd2l0aCBhbnkgb2YgaXRzIGNoaWxkcmVuLlxyXG4gICAgICAgIGtvLndhdGNoKHRoaXMsIHsgZW5hYmxlZDogdGFyZ2V0T3JDYWxsYmFjayAhPT0gZmFsc2UgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHRhcmdldFR5cGUgPT09ICdmdW5jdGlvbicgJiYgIWtvLmlzU3Vic2NyaWJhYmxlKHRhcmdldE9yQ2FsbGJhY2spKSB7XHJcbiAgICAgICAgLy8gVGFyZ2V0IHRoZSBjaGFpbmVkIHN1YnNjcmliYWJsZSBpdHNlbGYgaWYgbm8gdGFyZ2V0IHN1YnNjcmliYWJsZSBvciBvYmplY3Qgd2FzIHBhc3NlZC5cclxuICAgICAgICBrby53YXRjaCh0aGlzLCBvcHRpb25zIHx8IHt9LCB0YXJnZXRPckNhbGxiYWNrLCBjb250ZXh0IHx8IHRoaXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBrby53YXRjaCh0YXJnZXRPckNhbGxiYWNrLCBvcHRpb25zLCBldmFsdWF0b3JDYWxsYmFjaywgY29udGV4dCB8fCB0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxufTtcclxuXHJcbmtvWyd3YXRjaCddID0gZnVuY3Rpb24gKHRhcmdldCwgb3B0aW9ucywgZXZhbHVhdG9yQ2FsbGJhY2ssIGNvbnRleHQpIHtcclxuICAgIC8vLyA8c3VtbWFyeT5cclxuICAgIC8vLyAgICAgVHJhY2sgYW5kIG1hbmFnZSBjaGFuZ2VzIHdpdGhpbiBhIHNwZWNpZmljIHRhcmdldCBvYmplY3QgZG93biB0byBhbnkgZ2l2ZW4gbGV2ZWwuXHJcbiAgICAvLy8gPC9zdW1tYXJ5PlxyXG4gICAgLy8vIDxwYXJhbSBuYW1lPVwidGFyZ2V0XCI+XHJcbiAgICAvLy8gICAgIEFuIG9iamVjdCBvciBmdW5jdGlvbiBjb250YWluaW5nIHRoZSB0YXJnZXRlZCBzdWJzY3JpYmFibGUocykuXHJcbiAgICAvLy8gPC9wYXJhbT5cclxuICAgIC8vLyA8cGFyYW0gbmFtZT1cIm9wdGlvbnNcIiB0eXBlPVwib2JqZWN0XCI+XHJcbiAgICAvLy8gICAgIHsgZGVwdGg6IDIgfSAtPiBUcmFjayBhbGwgbmVzdGVkIHN1YnNjcmliYWJsZXMgZG93biB0byB0aGUgMm5kIGxldmVsKGRlZmF1bHQgaXMgMSkuPGJyLz5cclxuICAgIC8vLyAgICAgeyBkZXB0aDogLTEgfSAtPiBUcmFjayBhbGwgbmVzdGVkIHN1YnNjcmliYWJsZXMuPGJyLz5cclxuICAgIC8vLyAgICAgeyBoaWRlOiBbLi4uXSB9IC0+IFByb3BlcnR5IG9yIGFycmF5IG9mIHByb3BlcnRpZXMgdG8gYmUgaWdub3JlZC48YnIvPlxyXG4gICAgLy8vICAgICB7IGhpZGVBcnJheXM6IHRydWUgfSAtPiBJZ25vcmUgYWxsIG5lc3RlZCBhcnJheXMuPGJyLz5cclxuICAgIC8vLyAgICAgeyBoaWRlV3JhcHBlZFZhbHVlczogdHJ1ZSB9IC0+IElnbm9yZSBvYnNlcnZhYmxlcyB3cmFwcGVkIHVuZGVyIHlldCBhbm90aGVyIHBhcmVudCBvYnNlcnZhYmxlLjxici8+XHJcbiAgICAvLy8gICAgIHsgbXV0YWJsZTogdHJ1ZSB9IC0+IER5bmFtaWNhbGx5IGFkYXB0IHRvIGNoYW5nZXMgbWFkZSB0byB0aGUgdGFyZ2V0IHN0cnVjdHVyZSB0aHJvdWdoIGFueSBzdWJzY3JpYmFibGUuPGJyLz5cclxuICAgIC8vLyAgICAgeyB3YXRjaGVkT25seTogdHJ1ZSB9IC0+IFdhdGNoIG9ubHkgc3Vic2NyaWJhYmxlcyB0YWdnZWQgd2l0aCAud2F0Y2goKS48YnIvPlxyXG4gICAgLy8vICAgICB7IGJlZm9yZVdhdGNoOiBmdW5jdGlvbihwYXJlbnRzLCBjaGlsZCkgey4uLn0gfSAtPiBGdW5jdGlvbiBjYWxsZWQgcHJpb3IgdG8gY3JlYXRpbmcgYSBzdWJzY3JpcHRpb24uIFJldHVybmluZyBmYWxzZSBhYm9ydHMgdGhlIG9wZXJhdGlvbiBhbmQgaWdub3JlcyBpdHMgY2hpbGRyZW4uPGJyLz5cclxuICAgIC8vLyAgICAgeyB3cmFwOiB0cnVlIH0gLT4gV3JhcCBhbGwgZmllbGRzIGludG8gb2JzZXJ2YWJsZXMuIFRoaXMgaGFwcGVucyBvbiB0aGUgZmx5IGZvciBuZXcgYXJyYXkgaXRlbXMob3IgY2hpbGQgb2JqZWN0cyB3aGVuIG11dGFibGUgaXMgc2V0IHRvIHRydWUpLjxici8+XHJcbiAgICAvLy8gICAgIHsgYmVmb3JlV3JhcDogZnVuY3Rpb24ocGFyZW50cywgZmllbGQsIHZhbHVlKSB7Li4ufSB9IC0+IEZ1bmN0aW9uIGNhbGxlZCBwcmlvciB0byB3cmFwcGluZyBhIHZhbHVlIGludG8gYW4gb2JzZXJ2YWJsZS4gUmV0dXJuaW5nIGZhbHNlIGxlYXZlcyBpdCBhcyBpdCBpcy48YnIvPlxyXG4gICAgLy8vICAgICB7IHRhZ0ZpZWxkczogdHJ1ZSB9IC0+IEFkZCB0aGUgcHJvcGVydHkgJ19maWVsZE5hbWUnIHVuZGVyIGVhY2ggcHJvcGVydHkgZm9yIHRleHR1YWwgaWRlbnRpZmljYXRpb24uPGJyLz5cclxuICAgIC8vLyAgICAgeyB0YWdGaWVsZHM6ICdwYXJlbnRzT25seScgfSAtPiBTYW1lIGFzIGFib3ZlIGV4Y2VwdCB0aGF0IGl0IGlzIGxpbWl0ZWQgdG8gcGFyZW50IHByb3BlcnRpZXMgb25seS48YnIvPlxyXG4gICAgLy8vICAgICB7IG9sZFZhbHVlczogMyB9IC0+IEtlZXAgdGhlIGxhc3QgdGhyZWUgdmFsdWVzIGZvciBlYWNoIHN1YnNjcmliYWJsZSB1bmRlciB0aGUgcHJvcGVydHkgJ29sZFZhbHVlcycuPGJyLz5cclxuICAgIC8vLyAgICAgeyBzZWFsOiB0cnVlIH0gLT4gUHJldmVudCBhbnkgc3Vic2VxdWVudCB3YXRjaGVyIGZyb20gd2F0Y2hpbmcgdGhlIHRhcmdldCBhZ2Fpbi48YnIvPlxyXG4gICAgLy8vICAgICB7IHVubG9vcDogdHJ1ZSB9IC0+IEF2b2lkIGNpcmN1bGFyIHBhdGhzIHRocm91Z2ggdGhlIHVzZSBvZiBhIGJyZWFkY3J1bWIgcHJvcGVydHkgJ193YXRjaGVyJyBzZXQgYXQgZWFjaCBub2RlIGxldmVsLjxici8+XHJcbiAgICAvLy8gICAgIHsgZ2V0dGVyOiBmdW5jdGlvbihwYXJlbnRzLCBjaGlsZCwgcHJvcGVydHkpIHsuLi59IH0gLT4gRnVuY3Rpb24gdXNlZCB0byByZXRyaWV2ZSB0aGUgcHJvcGVydHkgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gY2hpbGQuIEZhbHNlIGNhbiBiZSByZXR1cm5lZCB0byBpZ25vcmUgdGhlIHByb3BlcnR5Ljxici8+XHJcbiAgICAvLy8gPC9wYXJhbT5cclxuICAgIC8vLyA8cGFyYW0gbmFtZT1cImV2YWx1YXRvckNhbGxiYWNrXCIgdHlwZT1cImZ1bmN0aW9uXCI+XHJcbiAgICAvLy8gICAgIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgZHVyaW5nIGNoYW5nZXMuXHJcbiAgICAvLy8gPC9wYXJhbT5cclxuXHJcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICBjb250ZXh0ID0gY29udGV4dCB8fCBldmFsdWF0b3JDYWxsYmFjaztcclxuICAgICAgICBldmFsdWF0b3JDYWxsYmFjayA9IG9wdGlvbnM7XHJcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXM7XHJcblxyXG4gICAgZnVuY3Rpb24gd2F0Y2hDaGlsZHJlbihjaGlsZCwgcGFyZW50LCBncmFuZFBhcmVudHMsIHVud2F0Y2gsIGtlZXBPZmZQYXJlbnRMaXN0LCBmaWVsZE5hbWUpIHtcclxuICAgICAgICBpZiAoY2hpbGQgJiYgb3B0aW9ucy5kZXB0aCAhPT0gMCAmJiAob3B0aW9ucy5kZXB0aCA9PT0gLTEgfHwgZ3JhbmRQYXJlbnRzLmxlbmd0aCA8IChvcHRpb25zLmRlcHRoIHx8IDEpKSkge1xyXG5cclxuICAgICAgICAgICAgLy8gUHJvY2VlZCBvbiB3YXRjaGVkIGNoaWxkcmVuIG9ubHkgd2hlbiBpbiB3YXRjaGVkLW9ubHkgbW9kZS5cclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMud2F0Y2hlZE9ubHkgJiYgIWNoaWxkLndhdGNoYWJsZSAmJiBjaGlsZCAhPSB0YXJnZXQpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAvLyBTZXR0aW5nIHRoZSB0YXJnZXQgYXMgZmFsc2UgcHJldmVudHMgaXQgZnJvbSBiZWluZyB3YXRjaGVkIGxhdGVyIG9uLlxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5lbmFibGVkID09PSBmYWxzZSB8fCBvcHRpb25zLmVuYWJsZWQgPT09IHRydWUpXHJcbiAgICAgICAgICAgICAgICBjaGlsZC53YXRjaGFibGUgPSBvcHRpb25zLmVuYWJsZWQ7XHJcblxyXG4gICAgICAgICAgICAvLyBJZ25vcmUgd2F0Y2gtZGlzYWJsZWQgb2JqZWN0cy5cclxuICAgICAgICAgICAgaWYgKGNoaWxkLndhdGNoYWJsZSA9PT0gZmFsc2UpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAvLyBQcmV2ZW50IHN1YnNlcXVlbnQgd2F0Y2hlcnMgZnJvbSB3YXRjaGluZyB0aGUgdGFyZ2V0IHdoZW4gc2VhbGVkLlxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zZWFsID09PSB0cnVlKVxyXG4gICAgICAgICAgICAgICAgY2hpbGQud2F0Y2hhYmxlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZiBjaGlsZDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBCeXBhc3MgY2lyY3VsYXIgcmVmZXJlbmNlcy5cclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5fd2F0Y2hlciA9PT0gY29udGV4dClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIGhpZGRlbiBvYmplY3RzLiBBbHNvIGFwcGxpZXMgdG8gYW55IG9mIHRoZWlyIGNoaWxkcmVuLlxyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGlkZSlcclxuICAgICAgICAgICAgICAgICAgICBpZiAoa28udXRpbHMuYXJyYXlJbmRleE9mKG9wdGlvbnMuaGlkZSwgY2hpbGQpID4gLTEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBNZXJnZSBwYXJlbnRzLiBVc2luZyBhIGZyZXNoIGFycmF5IHNvIGl0IGlzIG5vdCByZWZlcmVuY2VkIGluIHRoZSBuZXh0IHJlY3Vyc2lvbiBpZiBhbnkuXHJcbiAgICAgICAgICAgICAgICB2YXIgcGFyZW50cyA9IFtdLmNvbmNhdChncmFuZFBhcmVudHMsIHBhcmVudCAmJiBwYXJlbnQgIT09IHRhcmdldCA/IHBhcmVudCA6IFtdKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGRbJ25vdGlmeVN1YnNjcmliZXJzJ10gPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUYXJnZXQgaXMgYSBzdWJzY3JpYmFibGUuIFdhdGNoIGl0LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZhbHVhdG9yQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmVuYWJsZWQgPT09IHRydWUgJiYgY2hpbGQud2F0Y2hhYmxlID09PSBmYWxzZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHdha2luZyB1cCBhbiBleGlzdGluZyB3YXRjaGVyLiBMZXQncyBub3QgYWRkIGFub3RoZXIuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bndhdGNoIHx8ICFvcHRpb25zLmJlZm9yZVdhdGNoIHx8IG9wdGlvbnMuYmVmb3JlV2F0Y2guY2FsbChjb250ZXh0LCBwYXJlbnRzLCBjaGlsZCwgZmllbGROYW1lKSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNBcnJheSA9IHR5cGVvZiBjaGlsZC5wb3AgPT09ICdmdW5jdGlvbic7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bndhdGNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bvc2VXYXRjaGVyKGNoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25XYXRjaGVyKGNoaWxkLCBpc0FycmF5LCBwYXJlbnRzLCBrZWVwT2ZmUGFyZW50TGlzdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaENoaWxkcmVuKGNoaWxkKCksIGtlZXBPZmZQYXJlbnRMaXN0ID8gbnVsbCA6IGNoaWxkLCBwYXJlbnRzLCB1bndhdGNoLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGlkZVdyYXBwZWRWYWx1ZXMgIT09IHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2F0Y2hDaGlsZHJlbihjaGlsZCgpLCBrZWVwT2ZmUGFyZW50TGlzdCA/IG51bGwgOiBjaGlsZCwgcGFyZW50cywgdW53YXRjaCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGNoaWxkKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAga28udXRpbHMub2JqZWN0Rm9yRWFjaChjaGlsZCwgZnVuY3Rpb24gKHByb3BlcnR5LCBzdWIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IG9wdGlvbnMuZ2V0dGVyID8gb3B0aW9ucy5nZXR0ZXIuY2FsbChjb250ZXh0LCBwYXJlbnRzLCBjaGlsZCwgcHJvcGVydHkpIDogc3ViO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Yikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLndyYXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcCBzaW1wbGUgb2JqZWN0cyBhbmQgYXJyYXlzIGludG8gb2JzZXJ2YWJsZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN1Yik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSAnW29iamVjdCBGdW5jdGlvbl0nICYmIHR5cGUgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuYmVmb3JlV3JhcCB8fCBvcHRpb25zLmJlZm9yZVdyYXAuY2FsbChjb250ZXh0LCBwYXJlbnRzLCBjaGlsZCwgc3ViKSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBjaGlsZFtwcm9wZXJ0eV0gPSB0eXBlID09PSAnW29iamVjdCBBcnJheV0nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ga28ub2JzZXJ2YWJsZUFycmF5KHN1YilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrby5vYnNlcnZhYmxlKHN1Yik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVubG9vcClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLl93YXRjaGVyID0gdW53YXRjaCA/IHVuZGVmaW5lZCA6IGNvbnRleHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoYXNDaGlsZHJlbiA9IHdhdGNoQ2hpbGRyZW4oc3ViLCBrZWVwT2ZmUGFyZW50TGlzdCA/IG51bGwgOiBjaGlsZCwgcGFyZW50cywgdW53YXRjaCwgbnVsbCwgcHJvcGVydHkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50YWdGaWVsZHMgJiYgc3ViLl9maWVsZE5hbWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0NoaWxkcmVuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAob3B0aW9ucy50YWdGaWVsZHMgIT09ICdwYXJlbnRzT25seScgJiYgdHlwZW9mIHN1YiA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2Ygc3ViID09PSAnb2JqZWN0JykpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIuX2ZpZWxkTmFtZSA9IHByb3BlcnR5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyAnW29iamVjdCBBcnJheV0nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmhpZGVBcnJheXMgIT09IHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoQ2hpbGRyZW4oY2hpbGRbaV0sIGtlZXBPZmZQYXJlbnRMaXN0ID8gbnVsbCA6IGNoaWxkLCBwYXJlbnRzLCB1bndhdGNoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFN1YnNjcmlwdGlvbnMgYXJlIHN0b3JlZCB1bmRlciBlaXRoZXIgdGhlIF9zdWJzY3JpcHRpb25zIGZpZWxkIGZvciB0aGUgZGVidWcgdmVyc2lvblxyXG4gICAgLy8gb3IgdGhlIEYsIEggb3IgTSBmaWVsZHMgd2hlbiBtaW5pZmllZCBkZXBlbmRpbmcgb24gdGhlIHZlcnNpb24gdXNlZC5cclxuICAgIC8vIE5PVEU6IHdlIHVzZWQgdG8gdXNlIGtvLkRFQlVHIHRvIGRldGVjdCB0aGUgZGVidWcgdmVyc2lvbmJ1dCBpdCB3YXMgcmVtb3ZlZCBpbiAzLjQuMCssXHJcbiAgICAvLyAgICAgICBzbyB3ZSBub3cgY2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiBhIFwic3Vic2NyaXB0aW9uXCIgZnVuY3Rpb24uXHJcbiAgICB2YXIgc3Vic2NyaXB0aW9uc0ZpZWxkO1xyXG4gICAgc3dpdGNoICh0eXBlb2Yga28uc3Vic2NyaXB0aW9uID09ICdmdW5jdGlvbicgfHwga28udmVyc2lvbikge1xyXG4gICAgICAgIGNhc2UgdHJ1ZTogc3Vic2NyaXB0aW9uc0ZpZWxkID0gJ19zdWJzY3JpcHRpb25zJzsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIjMuMC4wXCI6IHN1YnNjcmlwdGlvbnNGaWVsZCA9ICdGJzsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIjMuMS4wXCI6IHN1YnNjcmlwdGlvbnNGaWVsZCA9ICdIJzsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIjMuMi4wXCI6IHN1YnNjcmlwdGlvbnNGaWVsZCA9ICdNJzsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIjMuMy4wXCI6IHN1YnNjcmlwdGlvbnNGaWVsZCA9ICdHJzsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIjMuNC4wXCI6IHN1YnNjcmlwdGlvbnNGaWVsZCA9ICdLJzsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIjMuNC4xXCI6IHN1YnNjcmlwdGlvbnNGaWVsZCA9ICdLJzsgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDogdGhyb3cgXCJVbnN1cHBvcnRlZCBLbm9ja291dCB2ZXJzaW9uLiBPbmx5IHYzLjAuMCB0byB2My40LjEgYXJlIHN1cHBvcnRlZCB3aGVuIG1pbmlmaWVkLiBDdXJyZW50IHZlcnNpb24gaXMgXCIgKyBrby52ZXJzaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRpc3Bvc2VXYXRjaGVyKGNoaWxkKSB7XHJcbiAgICAgICAgdmFyIHN1YnNjID0gY2hpbGRbc3Vic2NyaXB0aW9uc0ZpZWxkXTtcclxuXHJcbiAgICAgICAgaWYgKHN1YnNjKSB7XHJcbiAgICAgICAgICAgIGlmIChzdWJzYy5jaGFuZ2UpXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gc3Vic2MuY2hhbmdlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWJzYy5jaGFuZ2VbaV0uX3dhdGNoZXIgPT09IGNvbnRleHQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjLmNoYW5nZVtpXS5kaXNwb3NlKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3Vic2MuYmVmb3JlQ2hhbmdlICYmIChvcHRpb25zLm11dGFibGUgfHwgb3B0aW9ucy5vbGRWYWx1ZXMgPiAwKSlcclxuICAgICAgICAgICAgICAgIC8vIEFsc28gY2xlYW4gdXAgYW55IGJlZm9yZS1jaGFuZ2Ugc3Vic2NyaXB0aW9ucyB1c2VkIGZvciB0cmFja2luZyBvbGQgdmFsdWVzLlxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHN1YnNjLmJlZm9yZUNoYW5nZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3Vic2MuYmVmb3JlQ2hhbmdlW2ldLl93YXRjaGVyID09PSBjb250ZXh0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJzYy5iZWZvcmVDaGFuZ2VbaV0uZGlzcG9zZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN1YnNjLmFycmF5Q2hhbmdlKVxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHN1YnNjLmFycmF5Q2hhbmdlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWJzYy5hcnJheUNoYW5nZVtpXS5fd2F0Y2hlciA9PT0gY29udGV4dClcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2MuYXJyYXlDaGFuZ2VbaV0uZGlzcG9zZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IFwiU3Vic2NyaXB0aW9ucyBmaWVsZCAoLlwiICsgc3Vic2NyaXB0aW9uc0ZpZWxkICsgXCIpIG5vdCBkZWZpbmVkIGZvciBvYnNlcnZhYmxlIGNoaWxkIFwiICsgKGNoaWxkLl9maWVsZE5hbWUgfHwgXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGFzc2lnbldhdGNoZXIoY2hpbGQsIGlzQXJyYXksIHBhcmVudHMsIGtlZXBPZmZQYXJlbnRMaXN0KSB7XHJcbiAgICAgICAgaWYgKGlzQXJyYXkpIHtcclxuICAgICAgICAgICAgLy8gQ2hpbGQgaXMgYW4gb2JzZXJ2YWJsZSBhcnJheS4gV2F0Y2ggYWxsIGNoYW5nZXMgd2l0aGluIGl0LlxyXG4gICAgICAgICAgICBjaGlsZC5zdWJzY3JpYmUoZnVuY3Rpb24gKGNoYW5nZXMpIHtcclxuICAgICAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5Rm9yRWFjaChjaGFuZ2VzLCBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IGV2YWx1YXRvckNhbGxiYWNrLmNhbGwoY29udGV4dCwgcGFyZW50cywgY2hpbGQsIGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5WYWx1ZSAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KHJldHVyblZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLm1vdmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlbGV0ZWQgb3IgYnJhbmQgbmV3IGl0ZW0uIFVud2F0Y2ggb3Igd2F0Y2ggaXQgYWNjb3JkaW5nbHkuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hDaGlsZHJlbihpdGVtLnZhbHVlLCAoa2VlcE9mZlBhcmVudExpc3QgPyBudWxsIDogY2hpbGQpLCBwYXJlbnRzLCBpdGVtLnN0YXR1cyA9PT0gJ2RlbGV0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0sIHVuZGVmaW5lZCwgJ2FycmF5Q2hhbmdlJykuX3dhdGNoZXIgPSBjb250ZXh0O1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjaGlsZC5zdWJzY3JpYmUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLndhdGNoYWJsZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuVmFsdWUgPSBldmFsdWF0b3JDYWxsYmFjay5jYWxsKGNvbnRleHQsIHBhcmVudHMsIGNoaWxkKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbHVlICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQocmV0dXJuVmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5tdXRhYmxlICYmIHR5cGVvZiBjaGlsZCgpID09PSAnb2JqZWN0JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2F0Y2ggdGhlIG5ldyBjb21lci5cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hDaGlsZHJlbihjaGlsZCgpLCAoa2VlcE9mZlBhcmVudExpc3QgPyBudWxsIDogY2hpbGQpLCBwYXJlbnRzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0sIG51bGwsICdjaGFuZ2UnKS5fd2F0Y2hlciA9IGNvbnRleHQ7XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5vbGRWYWx1ZXMgPiAwIHx8IG9wdGlvbnMubXV0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY2hpbGQuc3Vic2NyaWJlKGZ1bmN0aW9uIChvbGRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm9sZFZhbHVlcyA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG9sZCB2YWx1ZSB0byBoaXN0b3J5IGxpc3QgYmVmb3JlIGV2ZXJ5IHVwZGF0ZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IChjaGlsZFsnb2xkVmFsdWVzJ11cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2hpbGRbJ29sZFZhbHVlcyddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNoaWxkWydvbGRWYWx1ZXMnXSA9IFtdKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy51bnNoaWZ0KG9sZFZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh2YWx1ZXMubGVuZ3RoID4gb3B0aW9ucy5vbGRWYWx1ZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5tdXRhYmxlICYmIHR5cGVvZiBvbGRWYWx1ZSA9PT0gJ29iamVjdCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwIGFsbCBzdWJzY3JpcHRpb25zIGZvciB0aGUgb2xkIGNoaWxkIG9iamVjdC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hDaGlsZHJlbihvbGRWYWx1ZSwgKGtlZXBPZmZQYXJlbnRMaXN0ID8gbnVsbCA6IGNoaWxkKSwgcGFyZW50cywgZmFsc2UsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgIH0sIG51bGwsICdiZWZvcmVDaGFuZ2UnKS5fd2F0Y2hlciA9IGNvbnRleHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXNlIGEgY29tcHV0ZWQgd2hlbiB0YXJnZXRpbmcgYSBub24td2F0Y2hhYmxlIGZ1bmN0aW9uLlxyXG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICdmdW5jdGlvbicgJiYgIWtvLmlzU3Vic2NyaWJhYmxlKHRhcmdldCkpXHJcbiAgICAgICAgcmV0dXJuIGtvLmNvbXB1dGVkKHRhcmdldCwgZXZhbHVhdG9yQ2FsbGJhY2ssIG9wdGlvbnMpO1xyXG5cclxuICAgIHdhdGNoQ2hpbGRyZW4odGFyZ2V0LCBudWxsLCBbXSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHdhdGNoQ2hpbGRyZW4odGFyZ2V0LCBudWxsLCBbXSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufTtcclxuXHJcbn0pKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBsZXggIDogcmVxdWlyZSgnLi9saWIvbGV4ZXInKSxcbiAgICBwYXJzZTogcmVxdWlyZSgnLi9saWIvcGFyc2VyJyksXG4gICAgc3RyaW5naWZ5OiByZXF1aXJlKCcuL2xpYi9zdHJpbmdpZnknKVxufTtcbiIsImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGRlYnVnO1xuXG5mdW5jdGlvbiBkZWJ1ZyhsYWJlbCkge1xuICByZXR1cm4gX2RlYnVnLmJpbmQobnVsbCwgbGFiZWwpO1xufVxuXG5mdW5jdGlvbiBfZGVidWcobGFiZWwpIHtcbiAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIGFyZ3MudW5zaGlmdCgnWycgKyBsYWJlbCArICddJyk7XG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlKGFyZ3Muam9pbignICcpICsgJ1xcbicpO1xufSIsInZhciBERUJVRyA9IGZhbHNlOyAvLyBgdHJ1ZWAgdG8gcHJpbnQgZGVidWdnaW5nIGluZm8uXG52YXIgVElNRVIgPSBmYWxzZTsgLy8gYHRydWVgIHRvIHRpbWUgY2FsbHMgdG8gYGxleCgpYCBhbmQgcHJpbnQgdGhlIHJlc3VsdHMuXG5cbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJy4vZGVidWcnKSgnbGV4Jyk7XG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGxleDtcblxuLyoqXG4gKiBDb252ZXJ0IGEgQ1NTIHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIGxleGljYWwgdG9rZW5zLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBjc3MgQ1NTXG4gKiBAcmV0dXJucyB7QXJyYXl9IGxleGljYWwgdG9rZW5zXG4gKi9cbmZ1bmN0aW9uIGxleChjc3MpIHtcbiAgdmFyIHN0YXJ0OyAvLyBEZWJ1ZyB0aW1lciBzdGFydC5cblxuICB2YXIgYnVmZmVyID0gJyc7ICAgICAgLy8gQ2hhcmFjdGVyIGFjY3VtdWxhdG9yXG4gIHZhciBjaDsgICAgICAgICAgICAgICAvLyBDdXJyZW50IGNoYXJhY3RlclxuICB2YXIgY29sdW1uID0gMDsgICAgICAgLy8gQ3VycmVudCBzb3VyY2UgY29sdW1uIG51bWJlclxuICB2YXIgY3Vyc29yID0gLTE7ICAgICAgLy8gQ3VycmVudCBzb3VyY2UgY3Vyc29yIHBvc2l0aW9uXG4gIHZhciBkZXB0aCA9IDA7ICAgICAgICAvLyBDdXJyZW50IG5lc3RpbmcgZGVwdGhcbiAgdmFyIGxpbmUgPSAxOyAgICAgICAgIC8vIEN1cnJlbnQgc291cmNlIGxpbmUgbnVtYmVyXG4gIHZhciBzdGF0ZSA9ICdiZWZvcmUtc2VsZWN0b3InOyAvLyBDdXJyZW50IHN0YXRlXG4gIHZhciBzdGFjayA9IFtzdGF0ZV07ICAvLyBTdGF0ZSBzdGFja1xuICB2YXIgdG9rZW4gPSB7fTsgICAgICAgLy8gQ3VycmVudCB0b2tlblxuICB2YXIgdG9rZW5zID0gW107ICAgICAgLy8gVG9rZW4gYWNjdW11bGF0b3JcblxuICAvLyBTdXBwb3J0ZWQgQC1ydWxlcywgaW4gcm91Z2hseSBkZXNjZW5kaW5nIG9yZGVyIG9mIHVzYWdlIHByb2JhYmlsaXR5LlxuICB2YXIgYXRSdWxlcyA9IFtcbiAgICAnbWVkaWEnLFxuICAgICdrZXlmcmFtZXMnLFxuICAgIHsgbmFtZTogJy13ZWJraXQta2V5ZnJhbWVzJywgdHlwZTogJ2tleWZyYW1lcycsIHByZWZpeDogJy13ZWJraXQtJyB9LFxuICAgIHsgbmFtZTogJy1tb3ota2V5ZnJhbWVzJywgdHlwZTogJ2tleWZyYW1lcycsIHByZWZpeDogJy1tb3otJyB9LFxuICAgIHsgbmFtZTogJy1tcy1rZXlmcmFtZXMnLCB0eXBlOiAna2V5ZnJhbWVzJywgcHJlZml4OiAnLW1zLScgfSxcbiAgICB7IG5hbWU6ICctby1rZXlmcmFtZXMnLCB0eXBlOiAna2V5ZnJhbWVzJywgcHJlZml4OiAnLW8tJyB9LFxuICAgICdmb250LWZhY2UnLFxuICAgIHsgbmFtZTogJ2ltcG9ydCcsIHN0YXRlOiAnYmVmb3JlLWF0LXZhbHVlJyB9LFxuICAgIHsgbmFtZTogJ2NoYXJzZXQnLCBzdGF0ZTogJ2JlZm9yZS1hdC12YWx1ZScgfSxcbiAgICAnc3VwcG9ydHMnLFxuICAgICd2aWV3cG9ydCcsXG4gICAgeyBuYW1lOiAnbmFtZXNwYWNlJywgc3RhdGU6ICdiZWZvcmUtYXQtdmFsdWUnIH0sXG4gICAgJ2RvY3VtZW50JyxcbiAgICB7IG5hbWU6ICctbW96LWRvY3VtZW50JywgdHlwZTogJ2RvY3VtZW50JywgcHJlZml4OiAnLW1vei0nIH0sXG4gICAgJ3BhZ2UnXG4gIF07XG5cbiAgLy8gLS0gRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBBZHZhbmNlIHRoZSBjaGFyYWN0ZXIgY3Vyc29yIGFuZCByZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgbmV4dCBjaGFyYWN0ZXIuXG4gICAqL1xuICBmdW5jdGlvbiBnZXRDaCgpIHtcbiAgICBza2lwKCk7XG4gICAgcmV0dXJuIGNzc1tjdXJzb3JdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgc3RhdGUgYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoZSBzdGFjay5cbiAgICogVGhlIHN0YWNrIGlzIExJRk8gc28gaW5kZXhpbmcgaXMgZnJvbSB0aGUgcmlnaHQuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbaW5kZXg9MF0gSW5kZXggdG8gcmV0dXJuLlxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBzdGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhdGUoaW5kZXgpIHtcbiAgICByZXR1cm4gaW5kZXggPyBzdGFja1tzdGFjay5sZW5ndGggLSAxIC0gaW5kZXhdIDogc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogTG9vayBhaGVhZCBmb3IgYSBzdHJpbmcgYmVnaW5uaW5nIGZyb20gdGhlIG5leHQgcG9zaXRpb24uIFRoZSBzdHJpbmdcbiAgICogYmVpbmcgbG9va2VkIGZvciBtdXN0IHN0YXJ0IGF0IHRoZSBuZXh0IHBvc2l0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gbG9vayBmb3IuXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBXaGV0aGVyIHRoZSBzdHJpbmcgd2FzIGZvdW5kLlxuICAgKi9cbiAgZnVuY3Rpb24gaXNOZXh0U3RyaW5nKHN0cikge1xuICAgIHZhciBzdGFydCA9IGN1cnNvciArIDE7XG4gICAgcmV0dXJuIChzdHIgPT09IGNzcy5zbGljZShzdGFydCwgc3RhcnQgKyBzdHIubGVuZ3RoKSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgc3RhcnQgcG9zaXRpb24gb2YgYSBzdWJzdHJpbmcgYmVnaW5uaW5nIGZyb20gdGhlIG5leHRcbiAgICogcG9zaXRpb24uIFRoZSBzdHJpbmcgYmVpbmcgbG9va2VkIGZvciBtYXkgYmVnaW4gYW55d2hlcmUuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN1YnN0cmluZyB0byBsb29rIGZvci5cbiAgICogQHJldHVybnMge051bWJlcnxmYWxzZX0gVGhlIHBvc2l0aW9uLCBvciBgZmFsc2VgIGlmIG5vdCBmb3VuZC5cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoc3RyKSB7XG4gICAgdmFyIHBvcyA9IGNzcy5zbGljZShjdXJzb3IpLmluZGV4T2Yoc3RyKTtcblxuICAgIHJldHVybiBwb3MgPiAwID8gcG9zIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjaGFyYWN0ZXIgaXMgbmV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoIENoYXJhY3Rlci5cbiAgICogQHJldHVybnMge0Jvb2xlYW59IFdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBuZXh0LlxuICAgKi9cbiAgZnVuY3Rpb24gaXNOZXh0Q2hhcihjaCkge1xuICAgIHJldHVybiBjaCA9PT0gcGVlaygxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGNoYXJhY3RlciBhdCB0aGUgZ2l2ZW4gY3Vyc29yIG9mZnNldC4gVGhlIG9mZnNldCBpcyByZWxhdGl2ZVxuICAgKiB0byB0aGUgY3Vyc29yLCBzbyBuZWdhdGl2ZSB2YWx1ZXMgbW92ZSBiYWNrd2FyZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb2Zmc2V0PTFdIEN1cnNvciBvZmZzZXQuXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IENoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIHBlZWsob2Zmc2V0KSB7XG4gICAgcmV0dXJuIGNzc1tjdXJzb3IgKyAob2Zmc2V0IHx8IDEpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGN1cnJlbnQgc3RhdGUgZnJvbSB0aGUgc3RhY2sgYW5kIHNldCB0aGUgbmV3IGN1cnJlbnQgc3RhdGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZW1vdmVkIHN0YXRlLlxuICAgKi9cbiAgZnVuY3Rpb24gcG9wU3RhdGUoKSB7XG4gICAgdmFyIHJlbW92ZWQgPSBzdGFjay5wb3AoKTtcbiAgICBzdGF0ZSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuXG4gICAgcmV0dXJuIHJlbW92ZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjdXJyZW50IHN0YXRlIGFuZCBhZGQgaXQgdG8gdGhlIHN0YWNrLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmV3U3RhdGUgVGhlIG5ldyBzdGF0ZS5cbiAgICogQHJldHVybnMge051bWJlcn0gVGhlIG5ldyBzdGFjayBsZW5ndGguXG4gICAqL1xuICBmdW5jdGlvbiBwdXNoU3RhdGUobmV3U3RhdGUpIHtcbiAgICBzdGF0ZSA9IG5ld1N0YXRlO1xuICAgIHN0YWNrLnB1c2goc3RhdGUpO1xuXG4gICAgcmV0dXJuIHN0YWNrLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSBjdXJyZW50IHN0YXRlIHdpdGggYSBuZXcgc3RhdGUuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuZXdTdGF0ZSBUaGUgbmV3IHN0YXRlLlxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVwbGFjZWQgc3RhdGUuXG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlU3RhdGUobmV3U3RhdGUpIHtcbiAgICB2YXIgcHJldmlvdXNTdGF0ZSA9IHN0YXRlO1xuICAgIHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID0gc3RhdGUgPSBuZXdTdGF0ZTtcblxuICAgIHJldHVybiBwcmV2aW91c1N0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgdGhlIGNoYXJhY3RlciBjdXJzb3IuIFBvc2l0aXZlIG51bWJlcnMgbW92ZSB0aGUgY3Vyc29yIGZvcndhcmQuXG4gICAqIE5lZ2F0aXZlIG51bWJlcnMgYXJlIG5vdCBzdXBwb3J0ZWQhXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbj0xXSBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lwLlxuICAgKi9cbiAgZnVuY3Rpb24gc2tpcChuKSB7XG4gICAgaWYgKChuIHx8IDEpID09IDEpIHtcbiAgICAgIGlmIChjc3NbY3Vyc29yXSA9PSAnXFxuJykge1xuICAgICAgICBsaW5lKys7XG4gICAgICAgIGNvbHVtbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2x1bW4rKztcbiAgICAgIH1cbiAgICAgIGN1cnNvcisrO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc2tpcFN0ciA9IGNzcy5zbGljZShjdXJzb3IsIGN1cnNvciArIG4pLnNwbGl0KCdcXG4nKTtcbiAgICAgIGlmIChza2lwU3RyLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGluZSArPSBza2lwU3RyLmxlbmd0aCAtIDE7XG4gICAgICAgIGNvbHVtbiA9IDE7XG4gICAgICB9XG4gICAgICBjb2x1bW4gKz0gc2tpcFN0cltza2lwU3RyLmxlbmd0aCAtIDFdLmxlbmd0aDtcbiAgICAgIGN1cnNvciA9IGN1cnNvciArIG47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgY3VycmVudCB0b2tlbiB0byB0aGUgcGlsZSBhbmQgcmVzZXQgdGhlIGJ1ZmZlci5cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRva2VuKCkge1xuICAgIHRva2VuLmVuZCA9IHtcbiAgICAgIGxpbmU6IGxpbmUsXG4gICAgICBjb2w6IGNvbHVtblxuICAgIH07XG5cbiAgICBERUJVRyAmJiBkZWJ1ZygnYWRkVG9rZW46JywgSlNPTi5zdHJpbmdpZnkodG9rZW4sIG51bGwsIDIpKTtcblxuICAgIHRva2Vucy5wdXNoKHRva2VuKTtcblxuICAgIGJ1ZmZlciA9ICcnO1xuICAgIHRva2VuID0ge307XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjdXJyZW50IHRva2VuLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUb2tlbiB0eXBlLlxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZVRva2VuKHR5cGUpIHtcbiAgICB0b2tlbiA9IHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBzdGFydDoge1xuICAgICAgICBsaW5lOiBsaW5lLFxuICAgICAgICBjb2wgOiBjb2x1bW5cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gLS0gTWFpbiBMb29wIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qXG4gIFRoZSBtYWluIGxvb3AgaXMgYSBzdGF0ZSBtYWNoaW5lIHRoYXQgcmVhZHMgaW4gb25lIGNoYXJhY3RlciBhdCBhIHRpbWUsXG4gIGFuZCBkZXRlcm1pbmVzIHdoYXQgdG8gZG8gYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUgYW5kIGNoYXJhY3Rlci5cbiAgVGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNlcmllcyBvZiBuZXN0ZWQgYHN3aXRjaGAgc3RhdGVtZW50cyBhbmQgdGhlXG4gIGNhc2Ugb3JkZXJzIGhhdmUgYmVlbiBtaWxkbHkgb3B0aW1pemVkIGJhc2VkIG9uIHJvdWdoIHByb2JhYmlsaXRpZXNcbiAgY2FsY3VsYXRlZCBieSBwcm9jZXNzaW5nIGEgc21hbGwgc2FtcGxlIG9mIHJlYWwtd29ybGQgQ1NTLlxuXG4gIEZ1cnRoZXIgb3B0aW1pemF0aW9uIChzdWNoIGFzIGEgZGlzcGF0Y2ggdGFibGUpIHNob3VsZG4ndCBiZSBuZWNlc3NhcnlcbiAgc2luY2UgdGhlIHRvdGFsIG51bWJlciBvZiBjYXNlcyBpcyB2ZXJ5IGxvdy5cbiAgKi9cblxuICBUSU1FUiAmJiAoc3RhcnQgPSBEYXRlLm5vdygpKTtcblxuICB3aGlsZSAoY2ggPSBnZXRDaCgpKSB7XG4gICAgREVCVUcgJiYgZGVidWcoY2gsIGdldFN0YXRlKCkpO1xuXG4gICAgLy8gY29sdW1uICs9IDE7XG5cbiAgICBzd2l0Y2ggKGNoKSB7XG4gICAgLy8gU3BhY2VcbiAgICBjYXNlICcgJzpcbiAgICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkge1xuICAgICAgY2FzZSAnc2VsZWN0b3InOlxuICAgICAgY2FzZSAndmFsdWUnOlxuICAgICAgY2FzZSAndmFsdWUtcGFyZW4nOlxuICAgICAgY2FzZSAnYXQtZ3JvdXAnOlxuICAgICAgY2FzZSAnYXQtdmFsdWUnOlxuICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICBjYXNlICdkb3VibGUtc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3NpbmdsZS1zdHJpbmcnOlxuICAgICAgICBidWZmZXIgKz0gY2g7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICAvLyBOZXdsaW5lIG9yIHRhYlxuICAgIGNhc2UgJ1xcbic6XG4gICAgY2FzZSAnXFx0JzpcbiAgICBjYXNlICdcXHInOlxuICAgIGNhc2UgJ1xcZic6XG4gICAgICBzd2l0Y2ggKGdldFN0YXRlKCkpIHtcbiAgICAgIGNhc2UgJ3ZhbHVlJzpcbiAgICAgIGNhc2UgJ3ZhbHVlLXBhcmVuJzpcbiAgICAgIGNhc2UgJ2F0LWdyb3VwJzpcbiAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgY2FzZSAnc2luZ2xlLXN0cmluZyc6XG4gICAgICBjYXNlICdkb3VibGUtc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3NlbGVjdG9yJzpcbiAgICAgICAgYnVmZmVyICs9IGNoO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYXQtdmFsdWUnOlxuICAgICAgICAvLyBUb2tlbml6ZSBhbiBALXJ1bGUgaWYgYSBzZW1pLWNvbG9uIHdhcyBvbWl0dGVkLlxuICAgICAgICBpZiAoJ1xcbicgPT09IGNoKSB7XG4gICAgICAgICAgdG9rZW4udmFsdWUgPSBidWZmZXIudHJpbSgpO1xuICAgICAgICAgIGFkZFRva2VuKCk7XG4gICAgICAgICAgcG9wU3RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gaWYgKCdcXG4nID09PSBjaCkge1xuICAgICAgLy8gICBjb2x1bW4gPSAwO1xuICAgICAgLy8gICBsaW5lICs9IDE7XG4gICAgICAvLyB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJzonOlxuICAgICAgc3dpdGNoIChnZXRTdGF0ZSgpKSB7XG4gICAgICBjYXNlICduYW1lJzpcbiAgICAgICAgdG9rZW4ubmFtZSA9IGJ1ZmZlci50cmltKCk7XG4gICAgICAgIGJ1ZmZlciA9ICcnO1xuXG4gICAgICAgIHJlcGxhY2VTdGF0ZSgnYmVmb3JlLXZhbHVlJyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdiZWZvcmUtc2VsZWN0b3InOlxuICAgICAgICBidWZmZXIgKz0gY2g7XG5cbiAgICAgICAgaW5pdGlhbGl6ZVRva2VuKCdzZWxlY3RvcicpO1xuICAgICAgICBwdXNoU3RhdGUoJ3NlbGVjdG9yJyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdiZWZvcmUtdmFsdWUnOlxuICAgICAgICByZXBsYWNlU3RhdGUoJ3ZhbHVlJyk7XG4gICAgICAgIGJ1ZmZlciArPSBjaDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJ1ZmZlciArPSBjaDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJzsnOlxuICAgICAgc3dpdGNoIChnZXRTdGF0ZSgpKSB7XG4gICAgICBjYXNlICduYW1lJzpcbiAgICAgIGNhc2UgJ2JlZm9yZS12YWx1ZSc6XG4gICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgIC8vIFRva2VuaXplIGEgZGVjbGFyYXRpb25cbiAgICAgICAgLy8gaWYgdmFsdWUgaXMgZW1wdHkgc2tpcCB0aGUgZGVjbGFyYXRpb25cbiAgICAgICAgaWYgKGJ1ZmZlci50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRva2VuLnZhbHVlID0gYnVmZmVyLnRyaW0oKSxcbiAgICAgICAgICBhZGRUb2tlbigpO1xuICAgICAgICB9XG4gICAgICAgIHJlcGxhY2VTdGF0ZSgnYmVmb3JlLW5hbWUnKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3ZhbHVlLXBhcmVuJzpcbiAgICAgICAgLy8gSW5zaWduaWZpY2FudCBzZW1pLWNvbG9uXG4gICAgICAgIGJ1ZmZlciArPSBjaDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2F0LXZhbHVlJzpcbiAgICAgICAgLy8gVG9rZW5pemUgYW4gQC1ydWxlXG4gICAgICAgIHRva2VuLnZhbHVlID0gYnVmZmVyLnRyaW0oKTtcbiAgICAgICAgYWRkVG9rZW4oKTtcbiAgICAgICAgcG9wU3RhdGUoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2JlZm9yZS1uYW1lJzpcbiAgICAgICAgLy8gRXh0cmFuZW91cyBzZW1pLWNvbG9uXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBidWZmZXIgKz0gY2g7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd7JzpcbiAgICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkge1xuICAgICAgY2FzZSAnc2VsZWN0b3InOlxuICAgICAgICAvLyBJZiB0aGUgc2VxdWVuY2UgaXMgYFxce2AgdGhlbiBhc3N1bWUgdGhhdCB0aGUgYnJhY2Ugc2hvdWxkIGJlIGVzY2FwZWQuXG4gICAgICAgIGlmIChwZWVrKC0xKSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBidWZmZXIgKz0gY2g7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRva2VuaXplIGEgc2VsZWN0b3JcbiAgICAgICAgdG9rZW4udGV4dCA9IGJ1ZmZlci50cmltKCk7XG4gICAgICAgIGFkZFRva2VuKCk7XG4gICAgICAgIHJlcGxhY2VTdGF0ZSgnYmVmb3JlLW5hbWUnKTtcbiAgICAgICAgZGVwdGggPSBkZXB0aCArIDE7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhdC1ncm91cCc6XG4gICAgICAgIC8vIFRva2VuaXplIGFuIEAtZ3JvdXBcbiAgICAgICAgdG9rZW4ubmFtZSA9IGJ1ZmZlci50cmltKCk7XG5cbiAgICAgICAgLy8gWFhYOiBALXJ1bGVzIGFyZSBzdGFydGluZyB0byBnZXQgaGFpcnlcbiAgICAgICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2ZvbnQtZmFjZSc6XG4gICAgICAgIGNhc2UgJ3ZpZXdwb3J0JyA6XG4gICAgICAgIGNhc2UgJ3BhZ2UnICAgICA6XG4gICAgICAgICAgcHVzaFN0YXRlKCdiZWZvcmUtbmFtZScpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcHVzaFN0YXRlKCdiZWZvcmUtc2VsZWN0b3InKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFRva2VuKCk7XG4gICAgICAgIGRlcHRoID0gZGVwdGggKyAxO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICBjYXNlICdhdC1ydWxlJzpcbiAgICAgICAgLy8gVG9rZW5pemUgYSBkZWNsYXJhdGlvbiBvciBhbiBALXJ1bGVcbiAgICAgICAgdG9rZW4ubmFtZSA9IGJ1ZmZlci50cmltKCk7XG4gICAgICAgIGFkZFRva2VuKCk7XG4gICAgICAgIHB1c2hTdGF0ZSgnYmVmb3JlLW5hbWUnKTtcbiAgICAgICAgZGVwdGggPSBkZXB0aCArIDE7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgIGNhc2UgJ2RvdWJsZS1zdHJpbmcnOlxuICAgICAgY2FzZSAnc2luZ2xlLXN0cmluZyc6XG4gICAgICAgIC8vIElnbm9yZSBicmFjZXMgaW4gY29tbWVudHMgYW5kIHN0cmluZ3NcbiAgICAgICAgYnVmZmVyICs9IGNoO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JlZm9yZS12YWx1ZSc6XG4gICAgICAgIHJlcGxhY2VTdGF0ZSgndmFsdWUnKTtcbiAgICAgICAgYnVmZmVyICs9IGNoO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd9JzpcbiAgICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkge1xuICAgICAgY2FzZSAnYmVmb3JlLW5hbWUnOlxuICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICBjYXNlICdiZWZvcmUtdmFsdWUnOlxuICAgICAgY2FzZSAndmFsdWUnOlxuICAgICAgICAvLyBJZiB0aGUgYnVmZmVyIGNvbnRhaW5zIGFueXRoaW5nLCBpdCBpcyBhIHZhbHVlXG4gICAgICAgIGlmIChidWZmZXIpIHtcbiAgICAgICAgICB0b2tlbi52YWx1ZSA9IGJ1ZmZlci50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgY3VycmVudCB0b2tlbiBoYXMgYSBuYW1lIGFuZCBhIHZhbHVlIGl0IHNob3VsZCBiZSB0b2tlbml6ZWQuXG4gICAgICAgIGlmICh0b2tlbi5uYW1lICYmIHRva2VuLnZhbHVlKSB7XG4gICAgICAgICAgYWRkVG9rZW4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExlYXZlIHRoZSBibG9ja1xuICAgICAgICBpbml0aWFsaXplVG9rZW4oJ2VuZCcpO1xuICAgICAgICBhZGRUb2tlbigpO1xuICAgICAgICBwb3BTdGF0ZSgpO1xuXG4gICAgICAgIC8vIFdlIG1pZ2h0IG5lZWQgdG8gbGVhdmUgYWdhaW4uXG4gICAgICAgIC8vIFhYWDogV2hhdCBhYm91dCAzIGxldmVscyBkZWVwP1xuICAgICAgICBpZiAoJ2F0LWdyb3VwJyA9PT0gZ2V0U3RhdGUoKSkge1xuICAgICAgICAgIGluaXRpYWxpemVUb2tlbignYXQtZ3JvdXAtZW5kJyk7XG4gICAgICAgICAgYWRkVG9rZW4oKTtcbiAgICAgICAgICBwb3BTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoZGVwdGggPiAwKSB7XG4gICAgICAgICAgZGVwdGggPSBkZXB0aCAtIDE7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYXQtZ3JvdXAnOlxuICAgICAgY2FzZSAnYmVmb3JlLXNlbGVjdG9yJzpcbiAgICAgIGNhc2UgJ3NlbGVjdG9yJzpcbiAgICAgICAgLy8gSWYgdGhlIHNlcXVlbmNlIGlzIGBcXH1gIHRoZW4gYXNzdW1lIHRoYXQgdGhlIGJyYWNlIHNob3VsZCBiZSBlc2NhcGVkLlxuICAgICAgICBpZiAocGVlaygtMSkgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgYnVmZmVyICs9IGNoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVwdGggPiAwKSB7XG4gICAgICAgICAgLy8gTGVhdmUgYmxvY2sgaWYgaW4gYW4gYXQtZ3JvdXBcbiAgICAgICAgICBpZiAoJ2F0LWdyb3VwJyA9PT0gZ2V0U3RhdGUoMSkpIHtcbiAgICAgICAgICAgIGluaXRpYWxpemVUb2tlbignYXQtZ3JvdXAtZW5kJyk7XG4gICAgICAgICAgICBhZGRUb2tlbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZXB0aCA+IDEpIHtcbiAgICAgICAgICBwb3BTdGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlcHRoID4gMCkge1xuICAgICAgICAgIGRlcHRoID0gZGVwdGggLSAxO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdkb3VibGUtc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3NpbmdsZS1zdHJpbmcnOlxuICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgIC8vIElnbm9yZSBicmFjZXMgaW4gY29tbWVudHMgYW5kIHN0cmluZ3MuXG4gICAgICAgIGJ1ZmZlciArPSBjaDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgLy8gU3RyaW5nc1xuICAgIGNhc2UgJ1wiJzpcbiAgICBjYXNlIFwiJ1wiOlxuICAgICAgc3dpdGNoIChnZXRTdGF0ZSgpKSB7XG4gICAgICBjYXNlICdkb3VibGUtc3RyaW5nJzpcbiAgICAgICAgaWYgKCdcIicgPT09IGNoICYmICdcXFxcJyAhPT0gcGVlaygtMSkpIHtcbiAgICAgICAgICBwb3BTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzaW5nbGUtc3RyaW5nJzpcbiAgICAgICAgaWYgKFwiJ1wiID09PSBjaCAmJiAnXFxcXCcgIT09IHBlZWsoLTEpKSB7XG4gICAgICAgICAgcG9wU3RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYmVmb3JlLWF0LXZhbHVlJzpcbiAgICAgICAgcmVwbGFjZVN0YXRlKCdhdC12YWx1ZScpO1xuICAgICAgICBwdXNoU3RhdGUoJ1wiJyA9PT0gY2ggPyAnZG91YmxlLXN0cmluZycgOiAnc2luZ2xlLXN0cmluZycpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYmVmb3JlLXZhbHVlJzpcbiAgICAgICAgcmVwbGFjZVN0YXRlKCd2YWx1ZScpO1xuICAgICAgICBwdXNoU3RhdGUoJ1wiJyA9PT0gY2ggPyAnZG91YmxlLXN0cmluZycgOiAnc2luZ2xlLXN0cmluZycpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgIC8vIElnbm9yZSBzdHJpbmdzIHdpdGhpbiBjb21tZW50cy5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmICgnXFxcXCcgIT09IHBlZWsoLTEpKSB7XG4gICAgICAgICAgcHVzaFN0YXRlKCdcIicgPT09IGNoID8gJ2RvdWJsZS1zdHJpbmcnIDogJ3NpbmdsZS1zdHJpbmcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBidWZmZXIgKz0gY2g7XG4gICAgICBicmVhaztcblxuICAgIC8vIENvbW1lbnRzXG4gICAgY2FzZSAnLyc6XG4gICAgICBzd2l0Y2ggKGdldFN0YXRlKCkpIHtcbiAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgY2FzZSAnZG91YmxlLXN0cmluZyc6XG4gICAgICBjYXNlICdzaW5nbGUtc3RyaW5nJzpcbiAgICAgICAgLy8gSWdub3JlXG4gICAgICAgIGJ1ZmZlciArPSBjaDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2JlZm9yZS12YWx1ZSc6XG4gICAgICBjYXNlICdzZWxlY3Rvcic6XG4gICAgICBjYXNlICduYW1lJzpcbiAgICAgIGNhc2UgJ3ZhbHVlJzpcbiAgICAgICAgaWYgKGlzTmV4dENoYXIoJyonKSkge1xuICAgICAgICAgIC8vIElnbm9yZSBjb21tZW50cyBpbiBzZWxlY3RvcnMsIHByb3BlcnRpZXMgYW5kIHZhbHVlcy4gVGhleSBhcmVcbiAgICAgICAgICAvLyBkaWZmaWN1bHQgdG8gcmVwcmVzZW50IGluIHRoZSBBU1QuXG4gICAgICAgICAgdmFyIHBvcyA9IGZpbmQoJyovJyk7XG5cbiAgICAgICAgICBpZiAocG9zKSB7XG4gICAgICAgICAgICBza2lwKHBvcyArIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZ2V0U3RhdGUoKSA9PSAnYmVmb3JlLXZhbHVlJykgcmVwbGFjZVN0YXRlKCd2YWx1ZScpO1xuICAgICAgICAgIGJ1ZmZlciArPSBjaDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGlzTmV4dENoYXIoJyonKSkge1xuICAgICAgICAgIC8vIENyZWF0ZSBhIGNvbW1lbnQgdG9rZW5cbiAgICAgICAgICBpbml0aWFsaXplVG9rZW4oJ2NvbW1lbnQnKTtcbiAgICAgICAgICBwdXNoU3RhdGUoJ2NvbW1lbnQnKTtcbiAgICAgICAgICBza2lwKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgYnVmZmVyICs9IGNoO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICAvLyBDb21tZW50IGVuZCBvciB1bml2ZXJzYWwgc2VsZWN0b3JcbiAgICBjYXNlICcqJzpcbiAgICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkge1xuICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgIGlmIChpc05leHRDaGFyKCcvJykpIHtcbiAgICAgICAgICAvLyBUb2tlbml6ZSBhIGNvbW1lbnRcbiAgICAgICAgICB0b2tlbi50ZXh0ID0gYnVmZmVyOyAvLyBEb24ndCB0cmltKCkhXG4gICAgICAgICAgc2tpcCgpO1xuICAgICAgICAgIGFkZFRva2VuKCk7XG4gICAgICAgICAgcG9wU3RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBidWZmZXIgKz0gY2g7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2JlZm9yZS1zZWxlY3Rvcic6XG4gICAgICAgIGJ1ZmZlciArPSBjaDtcbiAgICAgICAgaW5pdGlhbGl6ZVRva2VuKCdzZWxlY3RvcicpO1xuICAgICAgICBwdXNoU3RhdGUoJ3NlbGVjdG9yJyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdiZWZvcmUtdmFsdWUnOlxuICAgICAgICByZXBsYWNlU3RhdGUoJ3ZhbHVlJyk7XG4gICAgICAgIGJ1ZmZlciArPSBjaDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJ1ZmZlciArPSBjaDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgLy8gQC1ydWxlc1xuICAgIGNhc2UgJ0AnOlxuICAgICAgc3dpdGNoIChnZXRTdGF0ZSgpKSB7XG4gICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgIGNhc2UgJ2RvdWJsZS1zdHJpbmcnOlxuICAgICAgY2FzZSAnc2luZ2xlLXN0cmluZyc6XG4gICAgICAgIGJ1ZmZlciArPSBjaDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdiZWZvcmUtdmFsdWUnOlxuICAgICAgICByZXBsYWNlU3RhdGUoJ3ZhbHVlJyk7XG4gICAgICAgIGJ1ZmZlciArPSBjaDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgc3VwcG9ydGVkIEAtcnVsZXMgYW5kIGF0dGVtcHQgdG8gdG9rZW5pemUgb25lLlxuICAgICAgICB2YXIgdG9rZW5pemVkID0gZmFsc2U7XG4gICAgICAgIHZhciBuYW1lO1xuICAgICAgICB2YXIgcnVsZTtcblxuICAgICAgICBmb3IgKHZhciBqID0gMCwgbGVuID0gYXRSdWxlcy5sZW5ndGg7ICF0b2tlbml6ZWQgJiYgaiA8IGxlbjsgKytqKSB7XG4gICAgICAgICAgcnVsZSA9IGF0UnVsZXNbal07XG4gICAgICAgICAgbmFtZSA9IHJ1bGUubmFtZSB8fCBydWxlO1xuXG4gICAgICAgICAgaWYgKCFpc05leHRTdHJpbmcobmFtZSkpIHsgY29udGludWU7IH1cblxuICAgICAgICAgIHRva2VuaXplZCA9IHRydWU7XG5cbiAgICAgICAgICBpbml0aWFsaXplVG9rZW4obmFtZSk7XG4gICAgICAgICAgcHVzaFN0YXRlKHJ1bGUuc3RhdGUgfHwgJ2F0LWdyb3VwJyk7XG4gICAgICAgICAgc2tpcChuYW1lLmxlbmd0aCk7XG5cbiAgICAgICAgICBpZiAocnVsZS5wcmVmaXgpIHtcbiAgICAgICAgICAgIHRva2VuLnByZWZpeCA9IHJ1bGUucHJlZml4O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChydWxlLnR5cGUpIHtcbiAgICAgICAgICAgIHRva2VuLnR5cGUgPSBydWxlLnR5cGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0b2tlbml6ZWQpIHtcbiAgICAgICAgICAvLyBLZWVwIG9uIHRydWNraW4nIEFtZXJpY2EhXG4gICAgICAgICAgYnVmZmVyICs9IGNoO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICAvLyBQYXJlbnRoZXNlcyBhcmUgdHJhY2tlZCB0byBkaXNhbWJpZ3VhdGUgc2VtaS1jb2xvbnMsIHN1Y2ggYXMgd2l0aGluIGFcbiAgICAvLyBkYXRhIFVSSS5cbiAgICBjYXNlICcoJzpcbiAgICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkge1xuICAgICAgY2FzZSAndmFsdWUnOlxuICAgICAgICBwdXNoU3RhdGUoJ3ZhbHVlLXBhcmVuJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYmVmb3JlLXZhbHVlJzpcbiAgICAgICAgcmVwbGFjZVN0YXRlKCd2YWx1ZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgYnVmZmVyICs9IGNoO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICcpJzpcbiAgICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkge1xuICAgICAgY2FzZSAndmFsdWUtcGFyZW4nOlxuICAgICAgICBwb3BTdGF0ZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JlZm9yZS12YWx1ZSc6XG4gICAgICAgIHJlcGxhY2VTdGF0ZSgndmFsdWUnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGJ1ZmZlciArPSBjaDtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkge1xuICAgICAgY2FzZSAnYmVmb3JlLXNlbGVjdG9yJzpcbiAgICAgICAgaW5pdGlhbGl6ZVRva2VuKCdzZWxlY3RvcicpO1xuICAgICAgICBwdXNoU3RhdGUoJ3NlbGVjdG9yJyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdiZWZvcmUtbmFtZSc6XG4gICAgICAgIGluaXRpYWxpemVUb2tlbigncHJvcGVydHknKTtcbiAgICAgICAgcmVwbGFjZVN0YXRlKCduYW1lJyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdiZWZvcmUtdmFsdWUnOlxuICAgICAgICByZXBsYWNlU3RhdGUoJ3ZhbHVlJyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdiZWZvcmUtYXQtdmFsdWUnOlxuICAgICAgICByZXBsYWNlU3RhdGUoJ2F0LXZhbHVlJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBidWZmZXIgKz0gY2g7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBUSU1FUiAmJiBkZWJ1ZygncmFuIGluJywgKERhdGUubm93KCkgLSBzdGFydCkgKyAnbXMnKTtcblxuICByZXR1cm4gdG9rZW5zO1xufVxuIiwidmFyIERFQlVHID0gZmFsc2U7IC8vIGB0cnVlYCB0byBwcmludCBkZWJ1Z2dpbmcgaW5mby5cbnZhciBUSU1FUiA9IGZhbHNlOyAvLyBgdHJ1ZWAgdG8gdGltZSBjYWxscyB0byBgcGFyc2UoKWAgYW5kIHByaW50IHRoZSByZXN1bHRzLlxuXG52YXIgZGVidWcgPSByZXF1aXJlKCcuL2RlYnVnJykoJ3BhcnNlJyk7XG52YXIgbGV4ID0gcmVxdWlyZSgnLi9sZXhlcicpO1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBwYXJzZTtcblxudmFyIF9jb21tZW50czsgICAvLyBXaGV0aGVyIGNvbW1lbnRzIGFyZSBhbGxvd2VkLlxudmFyIF9kZXB0aDsgICAgICAvLyBDdXJyZW50IGJsb2NrIG5lc3RpbmcgZGVwdGguXG52YXIgX3Bvc2l0aW9uOyAgIC8vIFdoZXRoZXIgdG8gaW5jbHVkZSBsaW5lL2NvbHVtbiBwb3NpdGlvbi5cbnZhciBfdG9rZW5zOyAgICAgLy8gQXJyYXkgb2YgbGV4aWNhbCB0b2tlbnMuXG5cbi8qKlxuICogQ29udmVydCBhIENTUyBzdHJpbmcgb3IgYXJyYXkgb2YgbGV4aWNhbCB0b2tlbnMgaW50byBhIGBzdHJpbmdpZnlgLWFibGUgQVNULlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBjc3MgQ1NTIHN0cmluZyBvciBhcnJheSBvZiBsZXhpY2FsIHRva2VuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmNvbW1lbnRzPWZhbHNlXSBhbGxvdyBjb21tZW50IG5vZGVzIGluIHRoZSBBU1RcbiAqIEByZXR1cm5zIHtPYmplY3R9IGBzdHJpbmdpZnlgLWFibGUgQVNUXG4gKi9cbmZ1bmN0aW9uIHBhcnNlKGNzcywgb3B0aW9ucykge1xuICB2YXIgc3RhcnQ7IC8vIERlYnVnIHRpbWVyIHN0YXJ0LlxuXG4gIG9wdGlvbnMgfHwgKG9wdGlvbnMgPSB7fSk7XG4gIF9jb21tZW50cyA9ICEhb3B0aW9ucy5jb21tZW50cztcbiAgX3Bvc2l0aW9uID0gISFvcHRpb25zLnBvc2l0aW9uO1xuXG4gIF9kZXB0aCA9IDA7XG5cbiAgLy8gT3BlcmF0ZSBvbiBhIGNvcHkgb2YgdGhlIGdpdmVuIHRva2Vucywgb3IgdGhlIGxleCgpJ2QgQ1NTIHN0cmluZy5cbiAgX3Rva2VucyA9IEFycmF5LmlzQXJyYXkoY3NzKSA/IGNzcy5zbGljZSgpIDogbGV4KGNzcyk7XG5cbiAgdmFyIHJ1bGU7XG4gIHZhciBydWxlcyA9IFtdO1xuICB2YXIgdG9rZW47XG5cbiAgVElNRVIgJiYgKHN0YXJ0ID0gRGF0ZS5ub3coKSk7XG5cbiAgd2hpbGUgKCh0b2tlbiA9IG5leHQoKSkpIHtcbiAgICBydWxlID0gcGFyc2VUb2tlbih0b2tlbik7XG4gICAgcnVsZSAmJiBydWxlcy5wdXNoKHJ1bGUpO1xuICB9XG5cbiAgVElNRVIgJiYgZGVidWcoJ3JhbiBpbicsIChEYXRlLm5vdygpIC0gc3RhcnQpICsgJ21zJyk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcInN0eWxlc2hlZXRcIixcbiAgICBzdHlsZXNoZWV0OiB7XG4gICAgICBydWxlczogcnVsZXNcbiAgICB9XG4gIH07XG59XG5cbi8vIC0tIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEJ1aWxkIGFuIEFTVCBub2RlIGZyb20gYSBsZXhpY2FsIHRva2VuLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB0b2tlbiBsZXhpY2FsIHRva2VuXG4gKiBAcGFyYW0ge09iamVjdH0gW292ZXJyaWRlXSBvYmplY3QgaGFzaCBvZiBwcm9wZXJ0aWVzIHRoYXQgb3ZlcnJpZGUgdGhvc2VcbiAqICAgYWxyZWFkeSBpbiB0aGUgdG9rZW4sIG9yIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgdG9rZW4uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBBU1Qgbm9kZVxuICovXG5mdW5jdGlvbiBhc3ROb2RlKHRva2VuLCBvdmVycmlkZSkge1xuICBvdmVycmlkZSB8fCAob3ZlcnJpZGUgPSB7fSk7XG5cbiAgdmFyIGtleTtcbiAgdmFyIGtleXMgPSBbJ3R5cGUnLCAnbmFtZScsICd2YWx1ZSddO1xuICB2YXIgbm9kZSA9IHt9O1xuXG4gIC8vIEF2b2lkaW5nIFtdLmZvckVhY2ggZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgIGtleSA9IGtleXNbaV07XG5cbiAgICBpZiAodG9rZW5ba2V5XSkge1xuICAgICAgbm9kZVtrZXldID0gb3ZlcnJpZGVba2V5XSB8fCB0b2tlbltrZXldO1xuICAgIH1cbiAgfVxuXG4gIGtleXMgPSBPYmplY3Qua2V5cyhvdmVycmlkZSk7XG5cbiAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICBrZXkgPSBrZXlzW2ldO1xuXG4gICAgaWYgKCFub2RlW2tleV0pIHtcbiAgICAgIG5vZGVba2V5XSA9IG92ZXJyaWRlW2tleV07XG4gICAgfVxuICB9XG5cbiAgaWYgKF9wb3NpdGlvbikge1xuICAgIG5vZGUucG9zaXRpb24gPSB7XG4gICAgICBzdGFydDogdG9rZW4uc3RhcnQsXG4gICAgICBlbmQ6IHRva2VuLmVuZFxuICAgIH07XG4gIH1cblxuICBERUJVRyAmJiBkZWJ1ZygnYXN0Tm9kZTonLCBKU09OLnN0cmluZ2lmeShub2RlLCBudWxsLCAyKSk7XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbi8qKlxuICogUmVtb3ZlIGEgbGV4aWNhbCB0b2tlbiBmcm9tIHRoZSBzdGFjayBhbmQgcmV0dXJuIHRoZSByZW1vdmVkIHRva2VuLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IGxleGljYWwgdG9rZW5cbiAqL1xuZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHRva2VuID0gX3Rva2Vucy5zaGlmdCgpO1xuICBERUJVRyAmJiBkZWJ1ZygnbmV4dDonLCBKU09OLnN0cmluZ2lmeSh0b2tlbiwgbnVsbCwgMikpO1xuICByZXR1cm4gdG9rZW47XG59XG5cbi8vIC0tIFBhcnNlKiBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29udmVydCBhbiBALWdyb3VwIGxleGljYWwgdG9rZW4gdG8gYW4gQVNUIG5vZGUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHRva2VuIEAtZ3JvdXAgbGV4aWNhbCB0b2tlblxuICogQHJldHVybnMge09iamVjdH0gQC1ncm91cCBBU1Qgbm9kZVxuICovXG5mdW5jdGlvbiBwYXJzZUF0R3JvdXAodG9rZW4pIHtcbiAgX2RlcHRoID0gX2RlcHRoICsgMTtcblxuICAvLyBBcyB0aGUgQC1ncm91cCB0b2tlbiBpcyBhc3NlbWJsZWQsIHJlbGV2YW50IHRva2VuIHZhbHVlcyBhcmUgY2FwdHVyZWQgaGVyZVxuICAvLyB0ZW1wb3JhcmlseS4gVGhleSB3aWxsIGxhdGVyIGJlIHVzZWQgYXMgYHRva2VuaXplKClgIG92ZXJyaWRlcy5cbiAgdmFyIG92ZXJyaWRlcyA9IHt9O1xuXG4gIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICBjYXNlICdmb250LWZhY2UnOlxuICBjYXNlICd2aWV3cG9ydCcgOlxuICAgIG92ZXJyaWRlcy5kZWNsYXJhdGlvbnMgPSBwYXJzZURlY2xhcmF0aW9ucygpO1xuICAgIGJyZWFrO1xuXG4gIGNhc2UgJ3BhZ2UnOlxuICAgIG92ZXJyaWRlcy5wcmVmaXggPSB0b2tlbi5wcmVmaXg7XG4gICAgb3ZlcnJpZGVzLmRlY2xhcmF0aW9ucyA9IHBhcnNlRGVjbGFyYXRpb25zKCk7XG4gICAgYnJlYWs7XG5cbiAgZGVmYXVsdDpcbiAgICBvdmVycmlkZXMucHJlZml4ID0gdG9rZW4ucHJlZml4O1xuICAgIG92ZXJyaWRlcy5ydWxlcyA9IHBhcnNlUnVsZXMoKTtcbiAgfVxuXG4gIHJldHVybiBhc3ROb2RlKHRva2VuLCBvdmVycmlkZXMpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYW4gQGltcG9ydCBsZXhpY2FsIHRva2VuIHRvIGFuIEFTVCBub2RlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB0b2tlbiBAaW1wb3J0IGxleGljYWwgdG9rZW5cbiAqIEByZXR1cm5zIHtPYmplY3R9IEBpbXBvcnQgQVNUIG5vZGVcbiAqL1xuZnVuY3Rpb24gcGFyc2VBdEltcG9ydCh0b2tlbikge1xuICByZXR1cm4gYXN0Tm9kZSh0b2tlbik7XG59XG5cbi8qKlxuICogQ29udmVydCBhbiBAY2hhcnNldCB0b2tlbiB0byBhbiBBU1Qgbm9kZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdG9rZW4gQGNoYXJzZXQgbGV4aWNhbCB0b2tlblxuICogQHJldHVybnMge09iamVjdH0gQGNoYXJzZXQgbm9kZVxuICovXG5mdW5jdGlvbiBwYXJzZUNoYXJzZXQodG9rZW4pIHtcbiAgcmV0dXJuIGFzdE5vZGUodG9rZW4pO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBjb21tZW50IHRva2VuIHRvIGFuIEFTVCBOb2RlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB0b2tlbiBjb21tZW50IGxleGljYWwgdG9rZW5cbiAqIEByZXR1cm5zIHtPYmplY3R9IGNvbW1lbnQgbm9kZVxuICovXG5mdW5jdGlvbiBwYXJzZUNvbW1lbnQodG9rZW4pIHtcbiAgcmV0dXJuIGFzdE5vZGUodG9rZW4sIHt0ZXh0OiB0b2tlbi50ZXh0fSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTmFtZXNwYWNlKHRva2VuKSB7XG4gIHJldHVybiBhc3ROb2RlKHRva2VuKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgcHJvcGVydHkgbGV4aWNhbCB0b2tlbiB0byBhIHByb3BlcnR5IEFTVCBub2RlLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IHByb3BlcnR5IG5vZGVcbiAqL1xuZnVuY3Rpb24gcGFyc2VQcm9wZXJ0eSh0b2tlbikge1xuICByZXR1cm4gYXN0Tm9kZSh0b2tlbik7XG59XG5cbi8qKlxuICogQ29udmVydCBhIHNlbGVjdG9yIGxleGljYWwgdG9rZW4gdG8gYSBzZWxlY3RvciBBU1Qgbm9kZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdG9rZW4gc2VsZWN0b3IgbGV4aWNhbCB0b2tlblxuICogQHJldHVybnMge09iamVjdH0gc2VsZWN0b3Igbm9kZVxuICovXG5mdW5jdGlvbiBwYXJzZVNlbGVjdG9yKHRva2VuKSB7XG4gIGZ1bmN0aW9uIHRyaW0oc3RyKSB7XG4gICAgcmV0dXJuIHN0ci50cmltKCk7XG4gIH1cblxuICByZXR1cm4gYXN0Tm9kZSh0b2tlbiwge1xuICAgIHR5cGU6ICdydWxlJyxcbiAgICBzZWxlY3RvcnM6IHRva2VuLnRleHQuc3BsaXQoJywnKS5tYXAodHJpbSksXG4gICAgZGVjbGFyYXRpb25zOiBwYXJzZURlY2xhcmF0aW9ucyh0b2tlbilcbiAgfSk7XG59XG5cbi8qKlxuICogQ29udmVydCBhIGxleGljYWwgdG9rZW4gdG8gYW4gQVNUIG5vZGUuXG4gKlxuICogQHJldHVybnMge09iamVjdHx1bmRlZmluZWR9IEFTVCBub2RlXG4gKi9cbmZ1bmN0aW9uIHBhcnNlVG9rZW4odG9rZW4pIHtcbiAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gIC8vIENhc2VzIGFyZSBsaXN0ZWQgaW4gcm91Z2hseSBkZXNjZW5kaW5nIG9yZGVyIG9mIHByb2JhYmlsaXR5LlxuICBjYXNlICdwcm9wZXJ0eSc6IHJldHVybiBwYXJzZVByb3BlcnR5KHRva2VuKTtcblxuICBjYXNlICdzZWxlY3Rvcic6IHJldHVybiBwYXJzZVNlbGVjdG9yKHRva2VuKTtcblxuICBjYXNlICdhdC1ncm91cC1lbmQnOiBfZGVwdGggPSBfZGVwdGggLSAxOyByZXR1cm47XG5cbiAgY2FzZSAnbWVkaWEnICAgICA6XG4gIGNhc2UgJ2tleWZyYW1lcycgOnJldHVybiBwYXJzZUF0R3JvdXAodG9rZW4pO1xuXG4gIGNhc2UgJ2NvbW1lbnQnOiBpZiAoX2NvbW1lbnRzKSB7IHJldHVybiBwYXJzZUNvbW1lbnQodG9rZW4pOyB9IGJyZWFrO1xuXG4gIGNhc2UgJ2NoYXJzZXQnOiByZXR1cm4gcGFyc2VDaGFyc2V0KHRva2VuKTtcbiAgY2FzZSAnaW1wb3J0JzogcmV0dXJuIHBhcnNlQXRJbXBvcnQodG9rZW4pO1xuXG4gIGNhc2UgJ25hbWVzcGFjZSc6IHJldHVybiBwYXJzZU5hbWVzcGFjZSh0b2tlbik7XG5cbiAgY2FzZSAnZm9udC1mYWNlJzpcbiAgY2FzZSAnc3VwcG9ydHMnIDpcbiAgY2FzZSAndmlld3BvcnQnIDpcbiAgY2FzZSAnZG9jdW1lbnQnIDpcbiAgY2FzZSAncGFnZScgICAgIDogcmV0dXJuIHBhcnNlQXRHcm91cCh0b2tlbik7XG4gIH1cblxuICBERUJVRyAmJiBkZWJ1ZygncGFyc2VUb2tlbjogdW5leHBlY3RlZCB0b2tlbjonLCBKU09OLnN0cmluZ2lmeSh0b2tlbikpO1xufVxuXG4vLyAtLSBQYXJzZSBIZWxwZXIgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEl0ZXJhdGl2ZWx5IHBhcnNlcyBsZXhpY2FsIHRva2VucyBmcm9tIHRoZSBzdGFjayBpbnRvIEFTVCBub2RlcyB1bnRpbCBhXG4gKiBjb25kaXRpb25hbCBmdW5jdGlvbiByZXR1cm5zIGBmYWxzZWAsIGF0IHdoaWNoIHBvaW50IGl0ZXJhdGlvbiB0ZXJtaW5hdGVzXG4gKiBhbmQgYW55IEFTVCBub2RlcyBjb2xsZWN0ZWQgYXJlIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbmRpdGlvbkZuXG4gKiAgIEBwYXJhbSB7T2JqZWN0fSB0b2tlbiB0aGUgbGV4aWNhbCB0b2tlbiBiZWluZyBwYXJzZWRcbiAqICAgQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdG9rZW4gc2hvdWxkIGJlIHBhcnNlZCwgYGZhbHNlYCBvdGhlcndpc2VcbiAqIEByZXR1cm4ge0FycmF5fSBBU1Qgbm9kZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VUb2tlbnNXaGlsZShjb25kaXRpb25Gbikge1xuICB2YXIgbm9kZTtcbiAgdmFyIG5vZGVzID0gW107XG4gIHZhciB0b2tlbjtcblxuICB3aGlsZSAoKHRva2VuID0gbmV4dCgpKSAmJiAoY29uZGl0aW9uRm4gJiYgY29uZGl0aW9uRm4odG9rZW4pKSkge1xuICAgIG5vZGUgPSBwYXJzZVRva2VuKHRva2VuKTtcbiAgICBub2RlICYmIG5vZGVzLnB1c2gobm9kZSk7XG4gIH1cblxuICAvLyBQbGFjZSBhbiB1bnVzZWQgbm9uLWBlbmRgIGxleGljYWwgdG9rZW4gYmFjayBvbnRvIHRoZSBzdGFjay5cbiAgaWYgKHRva2VuICYmIHRva2VuLnR5cGUgIT09ICdlbmQnKSB7XG4gICAgX3Rva2Vucy51bnNoaWZ0KHRva2VuKTtcbiAgfVxuXG4gIHJldHVybiBub2Rlcztcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgc2VyaWVzIG9mIHRva2VucyBpbnRvIGEgc2VxdWVuY2Ugb2YgZGVjbGFyYXRpb24gQVNUIG5vZGVzLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheX0gZGVjbGFyYXRpb24gbm9kZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VEZWNsYXJhdGlvbnMoKSB7XG4gIHJldHVybiBwYXJzZVRva2Vuc1doaWxlKGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHJldHVybiAodG9rZW4udHlwZSA9PT0gJ3Byb3BlcnR5JyB8fCB0b2tlbi50eXBlID09PSAnY29tbWVudCcpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgc2VyaWVzIG9mIHRva2VucyBpbnRvIGEgc2VxdWVuY2Ugb2YgcnVsZSBub2Rlcy5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXl9IHJ1bGUgbm9kZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VSdWxlcygpIHtcbiAgcmV0dXJuIHBhcnNlVG9rZW5zV2hpbGUoZnVuY3Rpb24gKCkgeyByZXR1cm4gX2RlcHRoOyB9KTtcbn1cbiIsInZhciBERUJVRyA9IGZhbHNlOyAvLyBgdHJ1ZWAgdG8gcHJpbnQgZGVidWdnaW5nIGluZm8uXG52YXIgVElNRVIgPSBmYWxzZTsgLy8gYHRydWVgIHRvIHRpbWUgY2FsbHMgdG8gYHN0cmluZ2lmeSgpYCBhbmQgcHJpbnQgdGhlIHJlc3VsdHMuXG5cbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJy4vZGVidWcnKSgnc3RyaW5naWZ5Jyk7XG5cbnZhciBfY29tbWVudHM7ICAgICAgLy8gV2hldGhlciBjb21tZW50cyBhcmUgYWxsb3dlZCBpbiB0aGUgc3RyaW5naWZpZWQgQ1NTLlxudmFyIF9jb21wcmVzczsgICAgICAvLyBXaGV0aGVyIHRoZSBzdHJpbmdpZmllZCBDU1Mgc2hvdWxkIGJlIGNvbXByZXNzZWQuXG52YXIgX2luZGVudGF0aW9uOyAgIC8vIEluZGVudGF0aW9uIG9wdGlvbiB2YWx1ZS5cbnZhciBfbjsgICAgICAgICAgICAgLy8gQ29tcHJlc3Npb24tYXdhcmUgbmV3bGluZSBjaGFyYWN0ZXIuXG52YXIgX3M7ICAgICAgICAgICAgIC8vIENvbXByZXNzaW9uLWF3YXJlIHNwYWNlIGNoYXJhY3Rlci5cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gc3RyaW5naWZ5O1xuXG4vKipcbiAqIENvbnZlcnQgYSBgc3RyaW5naWZ5YC1hYmxlIEFTVCBpbnRvIGEgQ1NTIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYHN0cmluZ2lmeWAtYWJsZSBBU1RcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY29tbWVudHM9ZmFsc2VdIGFsbG93IGNvbW1lbnRzIGluIHRoZSBDU1NcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY29tcHJlc3M9ZmFsc2VdIGNvbXByZXNzIHdoaXRlc3BhY2VcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5pbmRlbnRhdGlvbj0nJ10gaW5kZW50YXRpb24gc2VxdWVuY2VcbiAqIEByZXR1cm5zIHtTdHJpbmd9IENTU1xuICovXG5mdW5jdGlvbiBzdHJpbmdpZnkoYXN0LCBvcHRpb25zKSB7XG4gIHZhciBzdGFydDsgLy8gRGVidWcgdGltZXIgc3RhcnQuXG5cbiAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgX2luZGVudGF0aW9uID0gb3B0aW9ucy5pbmRlbnRhdGlvbiB8fCAnJztcbiAgX2NvbXByZXNzID0gISFvcHRpb25zLmNvbXByZXNzO1xuICBfY29tbWVudHMgPSAhIW9wdGlvbnMuY29tbWVudHM7XG5cbiAgaWYgKF9jb21wcmVzcykge1xuICAgIF9uID0gX3MgPSAnJztcbiAgfSBlbHNlIHtcbiAgICBfbiA9ICdcXG4nO1xuICAgIF9zID0gJyAnO1xuICB9XG5cbiAgVElNRVIgJiYgKHN0YXJ0ID0gRGF0ZS5ub3coKSk7XG5cbiAgdmFyIGNzcyA9IHJlZHVjZShhc3Quc3R5bGVzaGVldC5ydWxlcywgc3RyaW5naWZ5Tm9kZSkuam9pbignXFxuJykudHJpbSgpO1xuXG4gIFRJTUVSICYmIGRlYnVnKCdyYW4gaW4nLCAoRGF0ZS5ub3coKSAtIHN0YXJ0KSArICdtcycpO1xuXG4gIHJldHVybiBjc3M7XG59XG5cbi8vIC0tIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIE1vZGlmeSB0aGUgaW5kZW50YXRpb24gbGV2ZWwsIG9yIHJldHVybiBhIGNvbXByZXNzaW9uLWF3YXJlIHNlcXVlbmNlIG9mXG4gKiBzcGFjZXMgZXF1YWwgdG8gdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gbGV2ZWwuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IFtsZXZlbD11bmRlZmluZWRdIGluZGVudGF0aW9uIGxldmVsIG1vZGlmaWVyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzZXF1ZW5jZSBvZiBzcGFjZXNcbiAqL1xuZnVuY3Rpb24gaW5kZW50KGxldmVsKSB7XG4gIHRoaXMubGV2ZWwgfHwgKHRoaXMubGV2ZWwgPSAxKTtcblxuICBpZiAobGV2ZWwpIHtcbiAgICB0aGlzLmxldmVsICs9IGxldmVsO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChfY29tcHJlc3MpIHsgcmV0dXJuICcnOyB9XG5cbiAgcmV0dXJuIEFycmF5KHRoaXMubGV2ZWwpLmpvaW4oX2luZGVudGF0aW9uIHx8ICcnKTtcbn1cblxuLy8gLS0gU3RyaW5naWZ5IEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBTdHJpbmdpZnkgYW4gQC1ydWxlIEFTVCBub2RlLlxuICpcbiAqIFVzZSBgc3RyaW5naWZ5QXRHcm91cCgpYCB3aGVuIGRlYWxpbmcgd2l0aCBALWdyb3VwcyB0aGF0IG1heSBjb250YWluIGJsb2Nrc1xuICogc3VjaCBhcyBAbWVkaWEuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgQC1ydWxlIHR5cGUuIEUuZy4sIGltcG9ydCwgY2hhcnNldFxuICogQHJldHVybnMge1N0cmluZ30gU3RyaW5naWZpZWQgQC1ydWxlXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeUF0UnVsZShub2RlKSB7XG4gIHJldHVybiAnQCcgKyBub2RlLnR5cGUgKyAnICcgKyBub2RlLnZhbHVlICsgJzsnICsgX247XG59XG5cbi8qKlxuICogU3RyaW5naWZ5IGFuIEAtZ3JvdXAgQVNUIG5vZGUuXG4gKlxuICogVXNlIGBzdHJpbmdpZnlBdFJ1bGUoKWAgd2hlbiBkZWFsaW5nIHdpdGggQC1ydWxlcyB0aGF0IG1heSBub3QgY29udGFpbiBibG9ja3NcbiAqIHN1Y2ggYXMgQGltcG9ydC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbm9kZSBALWdyb3VwIEFTVCBub2RlXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlBdEdyb3VwKG5vZGUpIHtcbiAgdmFyIGxhYmVsID0gJyc7XG4gIHZhciBwcmVmaXggPSBub2RlLnByZWZpeCB8fCAnJztcblxuICBpZiAobm9kZS5uYW1lKSB7XG4gICAgbGFiZWwgPSAnICcgKyBub2RlLm5hbWU7XG4gIH1cblxuICAvLyBGSVhNRTogQC1ydWxlIGNvbmRpdGlvbmFsIGxvZ2ljIGlzIGxlYWtpbmcgZXZlcnl3aGVyZS5cbiAgdmFyIGNob21wID0gbm9kZS50eXBlICE9PSAncGFnZSc7XG5cbiAgcmV0dXJuICdAJyArIHByZWZpeCArIG5vZGUudHlwZSArIGxhYmVsICsgX3MgKyBzdHJpbmdpZnlCbG9jayhub2RlLCBjaG9tcCkgKyBfbjtcbn1cblxuLyoqXG4gKiBTdHJpbmdpZnkgYSBjb21tZW50IEFTVCBub2RlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIGNvbW1lbnQgQVNUIG5vZGVcbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeUNvbW1lbnQobm9kZSkge1xuICBpZiAoIV9jb21tZW50cykgeyByZXR1cm4gJyc7IH1cblxuICByZXR1cm4gJy8qJyArIChub2RlLnRleHQgfHwgJycpICsgJyovJyArIF9uO1xufVxuXG4vKipcbiAqIFN0cmluZ2lmeSBhIHJ1bGUgQVNUIG5vZGUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGUgcnVsZSBBU1Qgbm9kZVxuICogQHJldHVybnMge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5UnVsZShub2RlKSB7XG4gIHZhciBsYWJlbDtcblxuICBpZiAobm9kZS5zZWxlY3RvcnMpIHtcbiAgICBsYWJlbCA9IG5vZGUuc2VsZWN0b3JzLmpvaW4oJywnICsgX24pO1xuICB9IGVsc2Uge1xuICAgIGxhYmVsID0gJ0AnICsgbm9kZS50eXBlO1xuICAgIGxhYmVsICs9IG5vZGUubmFtZSA/ICcgJyArIG5vZGUubmFtZSA6ICcnO1xuICB9XG5cbiAgcmV0dXJuIGluZGVudCgpICsgbGFiZWwgKyBfcyArIHN0cmluZ2lmeUJsb2NrKG5vZGUpICsgX247XG59XG5cblxuLy8gLS0gU3RyaW5naWZ5IEhlbHBlciBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZWR1Y2UgYW4gYXJyYXkgYnkgYXBwbHlpbmcgYSBmdW5jdGlvbiB0byBlYWNoIGl0ZW0gYW5kIHJldGFpbmluZyB0aGUgdHJ1dGh5XG4gKiByZXN1bHRzLlxuICpcbiAqIFdoZW4gYGl0ZW0udHlwZWAgaXMgYCdjb21tZW50J2AgYHN0cmluZ2lmeUNvbW1lbnRgIHdpbGwgYmUgYXBwbGllZCBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGl0ZW1zIGFycmF5IHRvIHJlZHVjZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpdGVtIGluIHRoZSBhcnJheVxuICogICBAcmV0dXJucyB7TWl4ZWR9IFRydXRoeSB2YWx1ZXMgd2lsbCBiZSByZXRhaW5lZCwgZmFsc3kgdmFsdWVzIG9taXR0ZWRcbiAqIEByZXR1cm5zIHtBcnJheX0gcmV0YWluZWQgcmVzdWx0c1xuICovXG5mdW5jdGlvbiByZWR1Y2UoaXRlbXMsIGZuKSB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoZnVuY3Rpb24gKHJlc3VsdHMsIGl0ZW0pIHtcbiAgICB2YXIgcmVzdWx0ID0gKGl0ZW0udHlwZSA9PT0gJ2NvbW1lbnQnKSA/IHN0cmluZ2lmeUNvbW1lbnQoaXRlbSkgOiBmbihpdGVtKTtcbiAgICByZXN1bHQgJiYgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH0sIFtdKTtcbn1cblxuLyoqXG4gKiBTdHJpbmdpZnkgYW4gQVNUIG5vZGUgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0IHJlcHJlc2VudHMgYSBibG9jayBvZlxuICogZGVjbGFyYXRpb25zIG9yIG90aGVyIEAtZ3JvdXAgY29udGVudHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGUgQVNUIG5vZGVcbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKi9cbi8vIEZJWE1FOiBjaG9tcCBzaG91bGQgbm90IGJlIGEgbWFnaWMgYm9vbGVhbiBwYXJhbWV0ZXJcbmZ1bmN0aW9uIHN0cmluZ2lmeUJsb2NrKG5vZGUsIGNob21wKSB7XG4gIHZhciBjaGlsZHJlbiA9IG5vZGUuZGVjbGFyYXRpb25zO1xuICB2YXIgZm4gPSBzdHJpbmdpZnlEZWNsYXJhdGlvbjtcblxuICBpZiAobm9kZS5ydWxlcykge1xuICAgIGNoaWxkcmVuID0gbm9kZS5ydWxlcztcbiAgICBmbiA9IHN0cmluZ2lmeVJ1bGU7XG4gIH1cblxuICBjaGlsZHJlbiA9IHN0cmluZ2lmeUNoaWxkcmVuKGNoaWxkcmVuLCBmbik7XG4gIGNoaWxkcmVuICYmIChjaGlsZHJlbiA9IF9uICsgY2hpbGRyZW4gKyAoY2hvbXAgPyAnJyA6IF9uKSk7XG5cbiAgcmV0dXJuICd7JyArIGNoaWxkcmVuICsgaW5kZW50KCkgKyAnfSc7XG59XG5cbi8qKlxuICogU3RyaW5naWZ5IGFuIGFycmF5IG9mIGNoaWxkIEFTVCBub2RlcyBieSBjYWxsaW5nIHRoZSBnaXZlbiBzdHJpbmdpZnkgZnVuY3Rpb25cbiAqIG9uY2UgZm9yIGVhY2ggY2hpbGQsIGFuZCBjb25jYXRlbmF0aW5nIHRoZSByZXN1bHRzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGNoaWxkcmVuIGBub2RlLnJ1bGVzYCBvciBgbm9kZS5kZWNsYXJhdGlvbnNgXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBzdHJpbmdpZnkgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeUNoaWxkcmVuKGNoaWxkcmVuLCBmbikge1xuICBpZiAoIWNoaWxkcmVuKSB7IHJldHVybiAnJzsgfVxuXG4gIGluZGVudCgxKTtcbiAgdmFyIHJlc3VsdHMgPSByZWR1Y2UoY2hpbGRyZW4sIGZuKTtcbiAgaW5kZW50KC0xKTtcblxuICBpZiAoIXJlc3VsdHMubGVuZ3RoKSB7IHJldHVybiAnJzsgfVxuXG4gIHJldHVybiByZXN1bHRzLmpvaW4oX24pO1xufVxuXG4vKipcbiAqIFN0cmluZ2lmeSBhIGRlY2xhcmF0aW9uIEFTVCBub2RlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIGRlY2xhcmF0aW9uIEFTVCBub2RlXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlEZWNsYXJhdGlvbihub2RlKSB7XG4gIGlmIChub2RlLnR5cGUgPT09ICdwcm9wZXJ0eScpIHtcbiAgICByZXR1cm4gc3RyaW5naWZ5UHJvcGVydHkobm9kZSk7XG4gIH1cblxuICBERUJVRyAmJiBkZWJ1Zygnc3RyaW5naWZ5RGVjbGFyYXRpb246IHVuZXhwZWN0ZWQgbm9kZTonLCBKU09OLnN0cmluZ2lmeShub2RlKSk7XG59XG5cbi8qKlxuICogU3RyaW5naWZ5IGFuIEFTVCBub2RlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIEFTVCBub2RlXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlOb2RlKG5vZGUpIHtcbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgLy8gQ2FzZXMgYXJlIGxpc3RlZCBpbiByb3VnaGx5IGRlc2NlbmRpbmcgb3JkZXIgb2YgcHJvYmFiaWxpdHkuXG4gIGNhc2UgJ3J1bGUnOiByZXR1cm4gc3RyaW5naWZ5UnVsZShub2RlKTtcblxuICBjYXNlICdtZWRpYScgICAgOlxuICBjYXNlICdrZXlmcmFtZXMnOiByZXR1cm4gc3RyaW5naWZ5QXRHcm91cChub2RlKTtcblxuICBjYXNlICdjb21tZW50JzogcmV0dXJuIHN0cmluZ2lmeUNvbW1lbnQobm9kZSk7XG5cbiAgY2FzZSAnaW1wb3J0JyAgIDpcbiAgY2FzZSAnY2hhcnNldCcgIDpcbiAgY2FzZSAnbmFtZXNwYWNlJzogcmV0dXJuIHN0cmluZ2lmeUF0UnVsZShub2RlKTtcblxuICBjYXNlICdmb250LWZhY2UnOlxuICBjYXNlICdzdXBwb3J0cycgOlxuICBjYXNlICd2aWV3cG9ydCcgOlxuICBjYXNlICdkb2N1bWVudCcgOlxuICBjYXNlICdwYWdlJyAgICAgOiByZXR1cm4gc3RyaW5naWZ5QXRHcm91cChub2RlKTtcbiAgfVxuXG4gIERFQlVHICYmIGRlYnVnKCdzdHJpbmdpZnlOb2RlOiB1bmV4cGVjdGVkIG5vZGU6ICcgKyBKU09OLnN0cmluZ2lmeShub2RlKSk7XG59XG5cbi8qKlxuICogU3RyaW5naWZ5IGFuIEFTVCBwcm9wZXJ0eSBub2RlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIEFTVCBwcm9wZXJ0eSBub2RlXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlQcm9wZXJ0eShub2RlKSB7XG4gIHZhciBuYW1lID0gbm9kZS5uYW1lID8gbm9kZS5uYW1lICsgJzonICsgX3MgOiAnJztcblxuICByZXR1cm4gaW5kZW50KCkgKyBuYW1lICsgbm9kZS52YWx1ZSArICc7Jztcbn1cbiIsIi8qXG5TbGljayBQYXJzZXJcbiAtIG9yaWdpbmFsbHkgY3JlYXRlZCBieSB0aGUgYWxtaWdodHkgVGhvbWFzIEF5bG90dCA8QHN1YnRsZWdyYWRpZW50PiAoaHR0cDovL3N1YnRsZWdyYWRpZW50LmNvbSlcbiovXCJ1c2Ugc3RyaWN0XCJcblxuLy8gTm90YWJsZSBjaGFuZ2VzIGZyb20gU2xpY2suUGFyc2VyIDEuMC54XG5cbi8vIFRoZSBwYXJzZXIgbm93IHVzZXMgMiBjbGFzc2VzOiBFeHByZXNzaW9ucyBhbmQgRXhwcmVzc2lvblxuLy8gYG5ldyBFeHByZXNzaW9uc2AgcHJvZHVjZXMgYW4gYXJyYXktbGlrZSBvYmplY3QgY29udGFpbmluZyBhIGxpc3Qgb2YgRXhwcmVzc2lvbiBvYmplY3RzXG4vLyAtIEV4cHJlc3Npb25zOjp0b1N0cmluZygpIHByb2R1Y2VzIGEgY2xlYW5lZCB1cCBleHByZXNzaW9ucyBzdHJpbmdcbi8vIGBuZXcgRXhwcmVzc2lvbmAgcHJvZHVjZXMgYW4gYXJyYXktbGlrZSBvYmplY3Rcbi8vIC0gRXhwcmVzc2lvbjo6dG9TdHJpbmcoKSBwcm9kdWNlcyBhIGNsZWFuZWQgdXAgZXhwcmVzc2lvbiBzdHJpbmdcbi8vIFRoZSBvbmx5IGV4cG9zZWQgbWV0aG9kIGlzIHBhcnNlLCB3aGljaCBwcm9kdWNlcyBhIChjYWNoZWQpIGBuZXcgRXhwcmVzc2lvbnNgIGluc3RhbmNlXG4vLyBwYXJzZWQucmF3IGlzIG5vIGxvbmdlciBwcmVzZW50LCB1c2UgLnRvU3RyaW5nKClcbi8vIHBhcnNlZC5leHByZXNzaW9uIGlzIG5vdyB1c2VsZXNzLCBqdXN0IHVzZSB0aGUgaW5kaWNlc1xuLy8gcGFyc2VkLnJldmVyc2UoKSBoYXMgYmVlbiByZW1vdmVkIGZvciBub3csIGR1ZSB0byBpdHMgYXBwYXJlbnQgdXNlbGVzc25lc3Ncbi8vIE90aGVyIGNoYW5nZXMgaW4gdGhlIEV4cHJlc3Npb25zIG9iamVjdDpcbi8vIC0gY2xhc3NOYW1lcyBhcmUgbm93IHVuaXF1ZSwgYW5kIHNhdmUgYm90aCBlc2NhcGVkIGFuZCB1bmVzY2FwZWQgdmFsdWVzXG4vLyAtIGF0dHJpYnV0ZXMgbm93IHNhdmUgYm90aCBlc2NhcGVkIGFuZCB1bmVzY2FwZWQgdmFsdWVzXG4vLyAtIHBzZXVkb3Mgbm93IHNhdmUgYm90aCBlc2NhcGVkIGFuZCB1bmVzY2FwZWQgdmFsdWVzXG5cbnZhciBlc2NhcGVSZSAgID0gLyhbLS4qKz9eJHt9KCl8W1xcXVxcL1xcXFxdKS9nLFxuICAgIHVuZXNjYXBlUmUgPSAvXFxcXC9nXG5cbnZhciBlc2NhcGUgPSBmdW5jdGlvbihzdHJpbmcpe1xuICAgIC8vIFhSZWdFeHAgdjIuMC4wLWJldGEtM1xuICAgIC8vIMKrIGh0dHBzOi8vZ2l0aHViLmNvbS9zbGV2aXRoYW4vWFJlZ0V4cC9ibG9iL21hc3Rlci9zcmMveHJlZ2V4cC5qc1xuICAgIHJldHVybiAoc3RyaW5nICsgXCJcIikucmVwbGFjZShlc2NhcGVSZSwgJ1xcXFwkMScpXG59XG5cbnZhciB1bmVzY2FwZSA9IGZ1bmN0aW9uKHN0cmluZyl7XG4gICAgcmV0dXJuIChzdHJpbmcgKyBcIlwiKS5yZXBsYWNlKHVuZXNjYXBlUmUsICcnKVxufVxuXG52YXIgc2xpY2tSZSA9IFJlZ0V4cChcbi8qXG4jIS91c3IvYmluL2VudiBydWJ5XG5wdXRzIFwiXFx0XFx0XCIgKyBEQVRBLnJlYWQuZ3N1YigvXFwoXFw/eFxcKXxcXHMrIy4qJHxcXHMrfFxcXFwkfFxcXFxuLywnJylcbl9fRU5EX19cbiAgICBcIig/eCleKD86XFxcbiAgICAgIFxcXFxzKiAoICwgKSBcXFxccyogICAgICAgICAgICAgICAjIFNlcGFyYXRvciAgICAgICAgICBcXG5cXFxuICAgIHwgXFxcXHMqICggPGNvbWJpbmF0b3I+KyApIFxcXFxzKiAgICMgQ29tYmluYXRvciAgICAgICAgIFxcblxcXG4gICAgfCAgICAgICggXFxcXHMrICkgICAgICAgICAgICAgICAgICMgQ29tYmluYXRvckNoaWxkcmVuIFxcblxcXG4gICAgfCAgICAgICggPHVuaWNvZGU+KyB8IFxcXFwqICkgICAgICMgVGFnICAgICAgICAgICAgICAgIFxcblxcXG4gICAgfCBcXFxcIyAgKCA8dW5pY29kZT4rICAgICAgICkgICAgICMgSUQgICAgICAgICAgICAgICAgIFxcblxcXG4gICAgfCBcXFxcLiAgKCA8dW5pY29kZT4rICAgICAgICkgICAgICMgQ2xhc3NOYW1lICAgICAgICAgIFxcblxcXG4gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEF0dHJpYnV0ZSAgICAgICAgICBcXG5cXFxuICAgIFxcXFxbICBcXFxuICAgICAgICBcXFxccyogKDx1bmljb2RlMT4rKSAgKD86ICBcXFxuICAgICAgICAgICAgXFxcXHMqIChbKl4kIX58XT89KSAgKD86ICBcXFxuICAgICAgICAgICAgICAgIFxcXFxzKiAoPzpcXFxuICAgICAgICAgICAgICAgICAgICAoW1xcXCInXT8pKC4qPylcXFxcOSBcXFxuICAgICAgICAgICAgICAgIClcXFxuICAgICAgICAgICAgKSAgXFxcbiAgICAgICAgKT8gIFxcXFxzKiAgXFxcbiAgICBcXFxcXSg/IVxcXFxdKSBcXG5cXFxuICAgIHwgICA6KyAoIDx1bmljb2RlPisgKSg/OlxcXG4gICAgXFxcXCggKD86XFxcbiAgICAgICAgKD86KFtcXFwiJ10pKFteXFxcXDEyXSopXFxcXDEyKXwoKD86XFxcXChbXildK1xcXFwpfFteKCldKikrKVxcXG4gICAgKSBcXFxcKVxcXG4gICAgKT9cXFxuICAgIClcIlxuKi9cblwiXig/OlxcXFxzKigsKVxcXFxzKnxcXFxccyooPGNvbWJpbmF0b3I+KylcXFxccyp8KFxcXFxzKyl8KDx1bmljb2RlPit8XFxcXCopfFxcXFwjKDx1bmljb2RlPispfFxcXFwuKDx1bmljb2RlPispfFxcXFxbXFxcXHMqKDx1bmljb2RlMT4rKSg/OlxcXFxzKihbKl4kIX58XT89KSg/OlxcXFxzKig/OihbXFxcIiddPykoLio/KVxcXFw5KSkpP1xcXFxzKlxcXFxdKD8hXFxcXF0pfCg6KykoPHVuaWNvZGU+KykoPzpcXFxcKCg/Oig/OihbXFxcIiddKShbXlxcXFwxM10qKVxcXFwxMyl8KCg/OlxcXFwoW14pXStcXFxcKXxbXigpXSopKykpXFxcXCkpPylcIlxuICAgIC5yZXBsYWNlKC88Y29tYmluYXRvcj4vLCAnWycgKyBlc2NhcGUoXCI+K35gIUAkJV4mPXt9XFxcXDs8L1wiKSArICddJylcbiAgICAucmVwbGFjZSgvPHVuaWNvZGU+L2csICcoPzpbXFxcXHdcXFxcdTAwYTEtXFxcXHVGRkZGLV18XFxcXFxcXFxbXlxcXFxzMC05YS1mXSknKVxuICAgIC5yZXBsYWNlKC88dW5pY29kZTE+L2csICcoPzpbOlxcXFx3XFxcXHUwMGExLVxcXFx1RkZGRi1dfFxcXFxcXFxcW15cXFxcczAtOWEtZl0pJylcbilcblxuLy8gUGFydFxuXG52YXIgUGFydCA9IGZ1bmN0aW9uIFBhcnQoY29tYmluYXRvcil7XG4gICAgdGhpcy5jb21iaW5hdG9yID0gY29tYmluYXRvciB8fCBcIiBcIlxuICAgIHRoaXMudGFnID0gXCIqXCJcbn1cblxuUGFydC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpe1xuXG4gICAgaWYgKCF0aGlzLnJhdyl7XG5cbiAgICAgICAgdmFyIHhwciA9IFwiXCIsIGssIHBhcnRcblxuICAgICAgICB4cHIgKz0gdGhpcy50YWcgfHwgXCIqXCJcbiAgICAgICAgaWYgKHRoaXMuaWQpIHhwciArPSBcIiNcIiArIHRoaXMuaWRcbiAgICAgICAgaWYgKHRoaXMuY2xhc3NlcykgeHByICs9IFwiLlwiICsgdGhpcy5jbGFzc0xpc3Quam9pbihcIi5cIilcbiAgICAgICAgaWYgKHRoaXMuYXR0cmlidXRlcykgZm9yIChrID0gMDsgcGFydCA9IHRoaXMuYXR0cmlidXRlc1trKytdOyl7XG4gICAgICAgICAgICB4cHIgKz0gXCJbXCIgKyBwYXJ0Lm5hbWUgKyAocGFydC5vcGVyYXRvciA/IHBhcnQub3BlcmF0b3IgKyAnXCInICsgcGFydC52YWx1ZSArICdcIicgOiAnJykgKyBcIl1cIlxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBzZXVkb3MpIGZvciAoayA9IDA7IHBhcnQgPSB0aGlzLnBzZXVkb3NbaysrXTspe1xuICAgICAgICAgICAgeHByICs9IFwiOlwiICsgcGFydC5uYW1lXG4gICAgICAgICAgICBpZiAocGFydC52YWx1ZSkgeHByICs9IFwiKFwiICsgcGFydC52YWx1ZSArIFwiKVwiXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJhdyA9IHhwclxuXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmF3XG59XG5cbi8vIEV4cHJlc3Npb25cblxudmFyIEV4cHJlc3Npb24gPSBmdW5jdGlvbiBFeHByZXNzaW9uKCl7XG4gICAgdGhpcy5sZW5ndGggPSAwXG59XG5cbkV4cHJlc3Npb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKXtcblxuICAgIGlmICghdGhpcy5yYXcpe1xuXG4gICAgICAgIHZhciB4cHIgPSBcIlwiXG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDAsIGJpdDsgYml0ID0gdGhpc1tqKytdOyl7XG4gICAgICAgICAgICBpZiAoaiAhPT0gMSkgeHByICs9IFwiIFwiXG4gICAgICAgICAgICBpZiAoYml0LmNvbWJpbmF0b3IgIT09IFwiIFwiKSB4cHIgKz0gYml0LmNvbWJpbmF0b3IgKyBcIiBcIlxuICAgICAgICAgICAgeHByICs9IGJpdFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yYXcgPSB4cHJcblxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJhd1xufVxuXG52YXIgcmVwbGFjZXIgPSBmdW5jdGlvbihcbiAgICByYXdNYXRjaCxcblxuICAgIHNlcGFyYXRvcixcbiAgICBjb21iaW5hdG9yLFxuICAgIGNvbWJpbmF0b3JDaGlsZHJlbixcblxuICAgIHRhZ05hbWUsXG4gICAgaWQsXG4gICAgY2xhc3NOYW1lLFxuXG4gICAgYXR0cmlidXRlS2V5LFxuICAgIGF0dHJpYnV0ZU9wZXJhdG9yLFxuICAgIGF0dHJpYnV0ZVF1b3RlLFxuICAgIGF0dHJpYnV0ZVZhbHVlLFxuXG4gICAgcHNldWRvTWFya2VyLFxuICAgIHBzZXVkb0NsYXNzLFxuICAgIHBzZXVkb1F1b3RlLFxuICAgIHBzZXVkb0NsYXNzUXVvdGVkVmFsdWUsXG4gICAgcHNldWRvQ2xhc3NWYWx1ZVxuKXtcblxuICAgIHZhciBleHByZXNzaW9uLCBjdXJyZW50XG5cbiAgICBpZiAoc2VwYXJhdG9yIHx8ICF0aGlzLmxlbmd0aCl7XG4gICAgICAgIGV4cHJlc3Npb24gPSB0aGlzW3RoaXMubGVuZ3RoKytdID0gbmV3IEV4cHJlc3Npb25cbiAgICAgICAgaWYgKHNlcGFyYXRvcikgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgaWYgKCFleHByZXNzaW9uKSBleHByZXNzaW9uID0gdGhpc1t0aGlzLmxlbmd0aCAtIDFdXG5cbiAgICBpZiAoY29tYmluYXRvciB8fCBjb21iaW5hdG9yQ2hpbGRyZW4gfHwgIWV4cHJlc3Npb24ubGVuZ3RoKXtcbiAgICAgICAgY3VycmVudCA9IGV4cHJlc3Npb25bZXhwcmVzc2lvbi5sZW5ndGgrK10gPSBuZXcgUGFydChjb21iaW5hdG9yKVxuICAgIH1cblxuICAgIGlmICghY3VycmVudCkgY3VycmVudCA9IGV4cHJlc3Npb25bZXhwcmVzc2lvbi5sZW5ndGggLSAxXVxuXG4gICAgaWYgKHRhZ05hbWUpe1xuXG4gICAgICAgIGN1cnJlbnQudGFnID0gdW5lc2NhcGUodGFnTmFtZSlcblxuICAgIH0gZWxzZSBpZiAoaWQpe1xuXG4gICAgICAgIGN1cnJlbnQuaWQgPSB1bmVzY2FwZShpZClcblxuICAgIH0gZWxzZSBpZiAoY2xhc3NOYW1lKXtcblxuICAgICAgICB2YXIgdW5lc2NhcGVkID0gdW5lc2NhcGUoY2xhc3NOYW1lKVxuXG4gICAgICAgIHZhciBjbGFzc2VzID0gY3VycmVudC5jbGFzc2VzIHx8IChjdXJyZW50LmNsYXNzZXMgPSB7fSlcbiAgICAgICAgaWYgKCFjbGFzc2VzW3VuZXNjYXBlZF0pe1xuICAgICAgICAgICAgY2xhc3Nlc1t1bmVzY2FwZWRdID0gZXNjYXBlKGNsYXNzTmFtZSlcbiAgICAgICAgICAgIHZhciBjbGFzc0xpc3QgPSBjdXJyZW50LmNsYXNzTGlzdCB8fCAoY3VycmVudC5jbGFzc0xpc3QgPSBbXSlcbiAgICAgICAgICAgIGNsYXNzTGlzdC5wdXNoKHVuZXNjYXBlZClcbiAgICAgICAgICAgIGNsYXNzTGlzdC5zb3J0KClcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChwc2V1ZG9DbGFzcyl7XG5cbiAgICAgICAgcHNldWRvQ2xhc3NWYWx1ZSA9IHBzZXVkb0NsYXNzVmFsdWUgfHwgcHNldWRvQ2xhc3NRdW90ZWRWYWx1ZVxuXG4gICAgICAgIDsoY3VycmVudC5wc2V1ZG9zIHx8IChjdXJyZW50LnBzZXVkb3MgPSBbXSkpLnB1c2goe1xuICAgICAgICAgICAgdHlwZSAgICAgICAgIDogcHNldWRvTWFya2VyLmxlbmd0aCA9PSAxID8gJ2NsYXNzJyA6ICdlbGVtZW50JyxcbiAgICAgICAgICAgIG5hbWUgICAgICAgICA6IHVuZXNjYXBlKHBzZXVkb0NsYXNzKSxcbiAgICAgICAgICAgIGVzY2FwZWROYW1lICA6IGVzY2FwZShwc2V1ZG9DbGFzcyksXG4gICAgICAgICAgICB2YWx1ZSAgICAgICAgOiBwc2V1ZG9DbGFzc1ZhbHVlID8gdW5lc2NhcGUocHNldWRvQ2xhc3NWYWx1ZSkgOiBudWxsLFxuICAgICAgICAgICAgZXNjYXBlZFZhbHVlIDogcHNldWRvQ2xhc3NWYWx1ZSA/IGVzY2FwZShwc2V1ZG9DbGFzc1ZhbHVlKSA6IG51bGxcbiAgICAgICAgfSlcblxuICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlS2V5KXtcblxuICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVZhbHVlID8gZXNjYXBlKGF0dHJpYnV0ZVZhbHVlKSA6IG51bGxcblxuICAgICAgICA7KGN1cnJlbnQuYXR0cmlidXRlcyB8fCAoY3VycmVudC5hdHRyaWJ1dGVzID0gW10pKS5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdG9yICAgICA6IGF0dHJpYnV0ZU9wZXJhdG9yLFxuICAgICAgICAgICAgbmFtZSAgICAgICAgIDogdW5lc2NhcGUoYXR0cmlidXRlS2V5KSxcbiAgICAgICAgICAgIGVzY2FwZWROYW1lICA6IGVzY2FwZShhdHRyaWJ1dGVLZXkpLFxuICAgICAgICAgICAgdmFsdWUgICAgICAgIDogYXR0cmlidXRlVmFsdWUgPyB1bmVzY2FwZShhdHRyaWJ1dGVWYWx1ZSkgOiBudWxsLFxuICAgICAgICAgICAgZXNjYXBlZFZhbHVlIDogYXR0cmlidXRlVmFsdWUgPyBlc2NhcGUoYXR0cmlidXRlVmFsdWUpIDogbnVsbFxuICAgICAgICB9KVxuXG4gICAgfVxuXG4gICAgcmV0dXJuICcnXG5cbn1cblxuLy8gRXhwcmVzc2lvbnNcblxudmFyIEV4cHJlc3Npb25zID0gZnVuY3Rpb24gRXhwcmVzc2lvbnMoZXhwcmVzc2lvbil7XG4gICAgdGhpcy5sZW5ndGggPSAwXG5cbiAgICB2YXIgc2VsZiA9IHRoaXNcblxuICAgIHZhciBvcmlnaW5hbCA9IGV4cHJlc3Npb24sIHJlcGxhY2VkXG5cbiAgICB3aGlsZSAoZXhwcmVzc2lvbil7XG4gICAgICAgIHJlcGxhY2VkID0gZXhwcmVzc2lvbi5yZXBsYWNlKHNsaWNrUmUsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICByZXR1cm4gcmVwbGFjZXIuYXBwbHkoc2VsZiwgYXJndW1lbnRzKVxuICAgICAgICB9KVxuICAgICAgICBpZiAocmVwbGFjZWQgPT09IGV4cHJlc3Npb24pIHRocm93IG5ldyBFcnJvcihvcmlnaW5hbCArICcgaXMgYW4gaW52YWxpZCBleHByZXNzaW9uJylcbiAgICAgICAgZXhwcmVzc2lvbiA9IHJlcGxhY2VkXG4gICAgfVxufVxuXG5FeHByZXNzaW9ucy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpe1xuICAgIGlmICghdGhpcy5yYXcpe1xuICAgICAgICB2YXIgZXhwcmVzc2lvbnMgPSBbXVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgZXhwcmVzc2lvbjsgZXhwcmVzc2lvbiA9IHRoaXNbaSsrXTspIGV4cHJlc3Npb25zLnB1c2goZXhwcmVzc2lvbilcbiAgICAgICAgdGhpcy5yYXcgPSBleHByZXNzaW9ucy5qb2luKFwiLCBcIilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yYXdcbn1cblxudmFyIGNhY2hlID0ge31cblxudmFyIHBhcnNlID0gZnVuY3Rpb24oZXhwcmVzc2lvbil7XG4gICAgaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgcmV0dXJuIG51bGxcbiAgICBleHByZXNzaW9uID0gKCcnICsgZXhwcmVzc2lvbikucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG4gICAgcmV0dXJuIGNhY2hlW2V4cHJlc3Npb25dIHx8IChjYWNoZVtleHByZXNzaW9uXSA9IG5ldyBFeHByZXNzaW9ucyhleHByZXNzaW9uKSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZVxuIiwiLy8gVGlueUNvbG9yIHYxLjQuMVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Jncmlucy9UaW55Q29sb3Jcbi8vIEJyaWFuIEdyaW5zdGVhZCwgTUlUIExpY2Vuc2VcblxuKGZ1bmN0aW9uKE1hdGgpIHtcblxudmFyIHRyaW1MZWZ0ID0gL15cXHMrLyxcbiAgICB0cmltUmlnaHQgPSAvXFxzKyQvLFxuICAgIHRpbnlDb3VudGVyID0gMCxcbiAgICBtYXRoUm91bmQgPSBNYXRoLnJvdW5kLFxuICAgIG1hdGhNaW4gPSBNYXRoLm1pbixcbiAgICBtYXRoTWF4ID0gTWF0aC5tYXgsXG4gICAgbWF0aFJhbmRvbSA9IE1hdGgucmFuZG9tO1xuXG5mdW5jdGlvbiB0aW55Y29sb3IgKGNvbG9yLCBvcHRzKSB7XG5cbiAgICBjb2xvciA9IChjb2xvcikgPyBjb2xvciA6ICcnO1xuICAgIG9wdHMgPSBvcHRzIHx8IHsgfTtcblxuICAgIC8vIElmIGlucHV0IGlzIGFscmVhZHkgYSB0aW55Y29sb3IsIHJldHVybiBpdHNlbGZcbiAgICBpZiAoY29sb3IgaW5zdGFuY2VvZiB0aW55Y29sb3IpIHtcbiAgICAgICByZXR1cm4gY29sb3I7XG4gICAgfVxuICAgIC8vIElmIHdlIGFyZSBjYWxsZWQgYXMgYSBmdW5jdGlvbiwgY2FsbCB1c2luZyBuZXcgaW5zdGVhZFxuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiB0aW55Y29sb3IpKSB7XG4gICAgICAgIHJldHVybiBuZXcgdGlueWNvbG9yKGNvbG9yLCBvcHRzKTtcbiAgICB9XG5cbiAgICB2YXIgcmdiID0gaW5wdXRUb1JHQihjb2xvcik7XG4gICAgdGhpcy5fb3JpZ2luYWxJbnB1dCA9IGNvbG9yLFxuICAgIHRoaXMuX3IgPSByZ2IucixcbiAgICB0aGlzLl9nID0gcmdiLmcsXG4gICAgdGhpcy5fYiA9IHJnYi5iLFxuICAgIHRoaXMuX2EgPSByZ2IuYSxcbiAgICB0aGlzLl9yb3VuZEEgPSBtYXRoUm91bmQoMTAwKnRoaXMuX2EpIC8gMTAwLFxuICAgIHRoaXMuX2Zvcm1hdCA9IG9wdHMuZm9ybWF0IHx8IHJnYi5mb3JtYXQ7XG4gICAgdGhpcy5fZ3JhZGllbnRUeXBlID0gb3B0cy5ncmFkaWVudFR5cGU7XG5cbiAgICAvLyBEb24ndCBsZXQgdGhlIHJhbmdlIG9mIFswLDI1NV0gY29tZSBiYWNrIGluIFswLDFdLlxuICAgIC8vIFBvdGVudGlhbGx5IGxvc2UgYSBsaXR0bGUgYml0IG9mIHByZWNpc2lvbiBoZXJlLCBidXQgd2lsbCBmaXggaXNzdWVzIHdoZXJlXG4gICAgLy8gLjUgZ2V0cyBpbnRlcnByZXRlZCBhcyBoYWxmIG9mIHRoZSB0b3RhbCwgaW5zdGVhZCBvZiBoYWxmIG9mIDFcbiAgICAvLyBJZiBpdCB3YXMgc3VwcG9zZWQgdG8gYmUgMTI4LCB0aGlzIHdhcyBhbHJlYWR5IHRha2VuIGNhcmUgb2YgYnkgYGlucHV0VG9SZ2JgXG4gICAgaWYgKHRoaXMuX3IgPCAxKSB7IHRoaXMuX3IgPSBtYXRoUm91bmQodGhpcy5fcik7IH1cbiAgICBpZiAodGhpcy5fZyA8IDEpIHsgdGhpcy5fZyA9IG1hdGhSb3VuZCh0aGlzLl9nKTsgfVxuICAgIGlmICh0aGlzLl9iIDwgMSkgeyB0aGlzLl9iID0gbWF0aFJvdW5kKHRoaXMuX2IpOyB9XG5cbiAgICB0aGlzLl9vayA9IHJnYi5vaztcbiAgICB0aGlzLl90Y19pZCA9IHRpbnlDb3VudGVyKys7XG59XG5cbnRpbnljb2xvci5wcm90b3R5cGUgPSB7XG4gICAgaXNEYXJrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnJpZ2h0bmVzcygpIDwgMTI4O1xuICAgIH0sXG4gICAgaXNMaWdodDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0RhcmsoKTtcbiAgICB9LFxuICAgIGlzVmFsaWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb2s7XG4gICAgfSxcbiAgICBnZXRPcmlnaW5hbElucHV0OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vcmlnaW5hbElucHV0O1xuICAgIH0sXG4gICAgZ2V0Rm9ybWF0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdDtcbiAgICB9LFxuICAgIGdldEFscGhhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2E7XG4gICAgfSxcbiAgICBnZXRCcmlnaHRuZXNzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy9odHRwOi8vd3d3LnczLm9yZy9UUi9BRVJUI2NvbG9yLWNvbnRyYXN0XG4gICAgICAgIHZhciByZ2IgPSB0aGlzLnRvUmdiKCk7XG4gICAgICAgIHJldHVybiAocmdiLnIgKiAyOTkgKyByZ2IuZyAqIDU4NyArIHJnYi5iICogMTE0KSAvIDEwMDA7XG4gICAgfSxcbiAgICBnZXRMdW1pbmFuY2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvL2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDgvUkVDLVdDQUcyMC0yMDA4MTIxMS8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcbiAgICAgICAgdmFyIHJnYiA9IHRoaXMudG9SZ2IoKTtcbiAgICAgICAgdmFyIFJzUkdCLCBHc1JHQiwgQnNSR0IsIFIsIEcsIEI7XG4gICAgICAgIFJzUkdCID0gcmdiLnIvMjU1O1xuICAgICAgICBHc1JHQiA9IHJnYi5nLzI1NTtcbiAgICAgICAgQnNSR0IgPSByZ2IuYi8yNTU7XG5cbiAgICAgICAgaWYgKFJzUkdCIDw9IDAuMDM5MjgpIHtSID0gUnNSR0IgLyAxMi45Mjt9IGVsc2Uge1IgPSBNYXRoLnBvdygoKFJzUkdCICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpO31cbiAgICAgICAgaWYgKEdzUkdCIDw9IDAuMDM5MjgpIHtHID0gR3NSR0IgLyAxMi45Mjt9IGVsc2Uge0cgPSBNYXRoLnBvdygoKEdzUkdCICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpO31cbiAgICAgICAgaWYgKEJzUkdCIDw9IDAuMDM5MjgpIHtCID0gQnNSR0IgLyAxMi45Mjt9IGVsc2Uge0IgPSBNYXRoLnBvdygoKEJzUkdCICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpO31cbiAgICAgICAgcmV0dXJuICgwLjIxMjYgKiBSKSArICgwLjcxNTIgKiBHKSArICgwLjA3MjIgKiBCKTtcbiAgICB9LFxuICAgIHNldEFscGhhOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICB0aGlzLl9hID0gYm91bmRBbHBoYSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuX3JvdW5kQSA9IG1hdGhSb3VuZCgxMDAqdGhpcy5fYSkgLyAxMDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgdG9Ic3Y6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaHN2ID0gcmdiVG9Ic3YodGhpcy5fciwgdGhpcy5fZywgdGhpcy5fYik7XG4gICAgICAgIHJldHVybiB7IGg6IGhzdi5oICogMzYwLCBzOiBoc3YucywgdjogaHN2LnYsIGE6IHRoaXMuX2EgfTtcbiAgICB9LFxuICAgIHRvSHN2U3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGhzdiA9IHJnYlRvSHN2KHRoaXMuX3IsIHRoaXMuX2csIHRoaXMuX2IpO1xuICAgICAgICB2YXIgaCA9IG1hdGhSb3VuZChoc3YuaCAqIDM2MCksIHMgPSBtYXRoUm91bmQoaHN2LnMgKiAxMDApLCB2ID0gbWF0aFJvdW5kKGhzdi52ICogMTAwKTtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9hID09IDEpID9cbiAgICAgICAgICBcImhzdihcIiAgKyBoICsgXCIsIFwiICsgcyArIFwiJSwgXCIgKyB2ICsgXCIlKVwiIDpcbiAgICAgICAgICBcImhzdmEoXCIgKyBoICsgXCIsIFwiICsgcyArIFwiJSwgXCIgKyB2ICsgXCIlLCBcIisgdGhpcy5fcm91bmRBICsgXCIpXCI7XG4gICAgfSxcbiAgICB0b0hzbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBoc2wgPSByZ2JUb0hzbCh0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iKTtcbiAgICAgICAgcmV0dXJuIHsgaDogaHNsLmggKiAzNjAsIHM6IGhzbC5zLCBsOiBoc2wubCwgYTogdGhpcy5fYSB9O1xuICAgIH0sXG4gICAgdG9Ic2xTdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaHNsID0gcmdiVG9Ic2wodGhpcy5fciwgdGhpcy5fZywgdGhpcy5fYik7XG4gICAgICAgIHZhciBoID0gbWF0aFJvdW5kKGhzbC5oICogMzYwKSwgcyA9IG1hdGhSb3VuZChoc2wucyAqIDEwMCksIGwgPSBtYXRoUm91bmQoaHNsLmwgKiAxMDApO1xuICAgICAgICByZXR1cm4gKHRoaXMuX2EgPT0gMSkgP1xuICAgICAgICAgIFwiaHNsKFwiICArIGggKyBcIiwgXCIgKyBzICsgXCIlLCBcIiArIGwgKyBcIiUpXCIgOlxuICAgICAgICAgIFwiaHNsYShcIiArIGggKyBcIiwgXCIgKyBzICsgXCIlLCBcIiArIGwgKyBcIiUsIFwiKyB0aGlzLl9yb3VuZEEgKyBcIilcIjtcbiAgICB9LFxuICAgIHRvSGV4OiBmdW5jdGlvbihhbGxvdzNDaGFyKSB7XG4gICAgICAgIHJldHVybiByZ2JUb0hleCh0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iLCBhbGxvdzNDaGFyKTtcbiAgICB9LFxuICAgIHRvSGV4U3RyaW5nOiBmdW5jdGlvbihhbGxvdzNDaGFyKSB7XG4gICAgICAgIHJldHVybiAnIycgKyB0aGlzLnRvSGV4KGFsbG93M0NoYXIpO1xuICAgIH0sXG4gICAgdG9IZXg4OiBmdW5jdGlvbihhbGxvdzRDaGFyKSB7XG4gICAgICAgIHJldHVybiByZ2JhVG9IZXgodGhpcy5fciwgdGhpcy5fZywgdGhpcy5fYiwgdGhpcy5fYSwgYWxsb3c0Q2hhcik7XG4gICAgfSxcbiAgICB0b0hleDhTdHJpbmc6IGZ1bmN0aW9uKGFsbG93NENoYXIpIHtcbiAgICAgICAgcmV0dXJuICcjJyArIHRoaXMudG9IZXg4KGFsbG93NENoYXIpO1xuICAgIH0sXG4gICAgdG9SZ2I6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4geyByOiBtYXRoUm91bmQodGhpcy5fciksIGc6IG1hdGhSb3VuZCh0aGlzLl9nKSwgYjogbWF0aFJvdW5kKHRoaXMuX2IpLCBhOiB0aGlzLl9hIH07XG4gICAgfSxcbiAgICB0b1JnYlN0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5fYSA9PSAxKSA/XG4gICAgICAgICAgXCJyZ2IoXCIgICsgbWF0aFJvdW5kKHRoaXMuX3IpICsgXCIsIFwiICsgbWF0aFJvdW5kKHRoaXMuX2cpICsgXCIsIFwiICsgbWF0aFJvdW5kKHRoaXMuX2IpICsgXCIpXCIgOlxuICAgICAgICAgIFwicmdiYShcIiArIG1hdGhSb3VuZCh0aGlzLl9yKSArIFwiLCBcIiArIG1hdGhSb3VuZCh0aGlzLl9nKSArIFwiLCBcIiArIG1hdGhSb3VuZCh0aGlzLl9iKSArIFwiLCBcIiArIHRoaXMuX3JvdW5kQSArIFwiKVwiO1xuICAgIH0sXG4gICAgdG9QZXJjZW50YWdlUmdiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHsgcjogbWF0aFJvdW5kKGJvdW5kMDEodGhpcy5fciwgMjU1KSAqIDEwMCkgKyBcIiVcIiwgZzogbWF0aFJvdW5kKGJvdW5kMDEodGhpcy5fZywgMjU1KSAqIDEwMCkgKyBcIiVcIiwgYjogbWF0aFJvdW5kKGJvdW5kMDEodGhpcy5fYiwgMjU1KSAqIDEwMCkgKyBcIiVcIiwgYTogdGhpcy5fYSB9O1xuICAgIH0sXG4gICAgdG9QZXJjZW50YWdlUmdiU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9hID09IDEpID9cbiAgICAgICAgICBcInJnYihcIiAgKyBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9yLCAyNTUpICogMTAwKSArIFwiJSwgXCIgKyBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9nLCAyNTUpICogMTAwKSArIFwiJSwgXCIgKyBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9iLCAyNTUpICogMTAwKSArIFwiJSlcIiA6XG4gICAgICAgICAgXCJyZ2JhKFwiICsgbWF0aFJvdW5kKGJvdW5kMDEodGhpcy5fciwgMjU1KSAqIDEwMCkgKyBcIiUsIFwiICsgbWF0aFJvdW5kKGJvdW5kMDEodGhpcy5fZywgMjU1KSAqIDEwMCkgKyBcIiUsIFwiICsgbWF0aFJvdW5kKGJvdW5kMDEodGhpcy5fYiwgMjU1KSAqIDEwMCkgKyBcIiUsIFwiICsgdGhpcy5fcm91bmRBICsgXCIpXCI7XG4gICAgfSxcbiAgICB0b05hbWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5fYSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFwidHJhbnNwYXJlbnRcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9hIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhleE5hbWVzW3JnYlRvSGV4KHRoaXMuX3IsIHRoaXMuX2csIHRoaXMuX2IsIHRydWUpXSB8fCBmYWxzZTtcbiAgICB9LFxuICAgIHRvRmlsdGVyOiBmdW5jdGlvbihzZWNvbmRDb2xvcikge1xuICAgICAgICB2YXIgaGV4OFN0cmluZyA9ICcjJyArIHJnYmFUb0FyZ2JIZXgodGhpcy5fciwgdGhpcy5fZywgdGhpcy5fYiwgdGhpcy5fYSk7XG4gICAgICAgIHZhciBzZWNvbmRIZXg4U3RyaW5nID0gaGV4OFN0cmluZztcbiAgICAgICAgdmFyIGdyYWRpZW50VHlwZSA9IHRoaXMuX2dyYWRpZW50VHlwZSA/IFwiR3JhZGllbnRUeXBlID0gMSwgXCIgOiBcIlwiO1xuXG4gICAgICAgIGlmIChzZWNvbmRDb2xvcikge1xuICAgICAgICAgICAgdmFyIHMgPSB0aW55Y29sb3Ioc2Vjb25kQ29sb3IpO1xuICAgICAgICAgICAgc2Vjb25kSGV4OFN0cmluZyA9ICcjJyArIHJnYmFUb0FyZ2JIZXgocy5fciwgcy5fZywgcy5fYiwgcy5fYSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoXCIrZ3JhZGllbnRUeXBlK1wic3RhcnRDb2xvcnN0cj1cIitoZXg4U3RyaW5nK1wiLGVuZENvbG9yc3RyPVwiK3NlY29uZEhleDhTdHJpbmcrXCIpXCI7XG4gICAgfSxcbiAgICB0b1N0cmluZzogZnVuY3Rpb24oZm9ybWF0KSB7XG4gICAgICAgIHZhciBmb3JtYXRTZXQgPSAhIWZvcm1hdDtcbiAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8IHRoaXMuX2Zvcm1hdDtcblxuICAgICAgICB2YXIgZm9ybWF0dGVkU3RyaW5nID0gZmFsc2U7XG4gICAgICAgIHZhciBoYXNBbHBoYSA9IHRoaXMuX2EgPCAxICYmIHRoaXMuX2EgPj0gMDtcbiAgICAgICAgdmFyIG5lZWRzQWxwaGFGb3JtYXQgPSAhZm9ybWF0U2V0ICYmIGhhc0FscGhhICYmIChmb3JtYXQgPT09IFwiaGV4XCIgfHwgZm9ybWF0ID09PSBcImhleDZcIiB8fCBmb3JtYXQgPT09IFwiaGV4M1wiIHx8IGZvcm1hdCA9PT0gXCJoZXg0XCIgfHwgZm9ybWF0ID09PSBcImhleDhcIiB8fCBmb3JtYXQgPT09IFwibmFtZVwiKTtcblxuICAgICAgICBpZiAobmVlZHNBbHBoYUZvcm1hdCkge1xuICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBcInRyYW5zcGFyZW50XCIsIGFsbCBvdGhlciBub24tYWxwaGEgZm9ybWF0c1xuICAgICAgICAgICAgLy8gd2lsbCByZXR1cm4gcmdiYSB3aGVuIHRoZXJlIGlzIHRyYW5zcGFyZW5jeS5cbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09IFwibmFtZVwiICYmIHRoaXMuX2EgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b05hbWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvUmdiU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJyZ2JcIikge1xuICAgICAgICAgICAgZm9ybWF0dGVkU3RyaW5nID0gdGhpcy50b1JnYlN0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwicHJnYlwiKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvUGVyY2VudGFnZVJnYlN0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwiaGV4XCIgfHwgZm9ybWF0ID09PSBcImhleDZcIikge1xuICAgICAgICAgICAgZm9ybWF0dGVkU3RyaW5nID0gdGhpcy50b0hleFN0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwiaGV4M1wiKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSGV4U3RyaW5nKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwiaGV4NFwiKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSGV4OFN0cmluZyh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcImhleDhcIikge1xuICAgICAgICAgICAgZm9ybWF0dGVkU3RyaW5nID0gdGhpcy50b0hleDhTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcIm5hbWVcIikge1xuICAgICAgICAgICAgZm9ybWF0dGVkU3RyaW5nID0gdGhpcy50b05hbWUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcImhzbFwiKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSHNsU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJoc3ZcIikge1xuICAgICAgICAgICAgZm9ybWF0dGVkU3RyaW5nID0gdGhpcy50b0hzdlN0cmluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZFN0cmluZyB8fCB0aGlzLnRvSGV4U3RyaW5nKCk7XG4gICAgfSxcbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aW55Y29sb3IodGhpcy50b1N0cmluZygpKTtcbiAgICB9LFxuXG4gICAgX2FwcGx5TW9kaWZpY2F0aW9uOiBmdW5jdGlvbihmbiwgYXJncykge1xuICAgICAgICB2YXIgY29sb3IgPSBmbi5hcHBseShudWxsLCBbdGhpc10uY29uY2F0KFtdLnNsaWNlLmNhbGwoYXJncykpKTtcbiAgICAgICAgdGhpcy5fciA9IGNvbG9yLl9yO1xuICAgICAgICB0aGlzLl9nID0gY29sb3IuX2c7XG4gICAgICAgIHRoaXMuX2IgPSBjb2xvci5fYjtcbiAgICAgICAgdGhpcy5zZXRBbHBoYShjb2xvci5fYSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgbGlnaHRlbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihsaWdodGVuLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgYnJpZ2h0ZW46IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlNb2RpZmljYXRpb24oYnJpZ2h0ZW4sIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBkYXJrZW46IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlNb2RpZmljYXRpb24oZGFya2VuLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgZGVzYXR1cmF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihkZXNhdHVyYXRlLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgc2F0dXJhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlNb2RpZmljYXRpb24oc2F0dXJhdGUsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBncmV5c2NhbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlNb2RpZmljYXRpb24oZ3JleXNjYWxlLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgc3BpbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihzcGluLCBhcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICBfYXBwbHlDb21iaW5hdGlvbjogZnVuY3Rpb24oZm4sIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIFt0aGlzXS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmdzKSkpO1xuICAgIH0sXG4gICAgYW5hbG9nb3VzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5Q29tYmluYXRpb24oYW5hbG9nb3VzLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgY29tcGxlbWVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKGNvbXBsZW1lbnQsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBtb25vY2hyb21hdGljOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5Q29tYmluYXRpb24obW9ub2Nocm9tYXRpYywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHNwbGl0Y29tcGxlbWVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKHNwbGl0Y29tcGxlbWVudCwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHRyaWFkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5Q29tYmluYXRpb24odHJpYWQsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICB0ZXRyYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlDb21iaW5hdGlvbih0ZXRyYWQsIGFyZ3VtZW50cyk7XG4gICAgfVxufTtcblxuLy8gSWYgaW5wdXQgaXMgYW4gb2JqZWN0LCBmb3JjZSAxIGludG8gXCIxLjBcIiB0byBoYW5kbGUgcmF0aW9zIHByb3Blcmx5XG4vLyBTdHJpbmcgaW5wdXQgcmVxdWlyZXMgXCIxLjBcIiBhcyBpbnB1dCwgc28gMSB3aWxsIGJlIHRyZWF0ZWQgYXMgMVxudGlueWNvbG9yLmZyb21SYXRpbyA9IGZ1bmN0aW9uKGNvbG9yLCBvcHRzKSB7XG4gICAgaWYgKHR5cGVvZiBjb2xvciA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHZhciBuZXdDb2xvciA9IHt9O1xuICAgICAgICBmb3IgKHZhciBpIGluIGNvbG9yKSB7XG4gICAgICAgICAgICBpZiAoY29sb3IuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gXCJhXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29sb3JbaV0gPSBjb2xvcltpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbG9yW2ldID0gY29udmVydFRvUGVyY2VudGFnZShjb2xvcltpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbG9yID0gbmV3Q29sb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbnljb2xvcihjb2xvciwgb3B0cyk7XG59O1xuXG4vLyBHaXZlbiBhIHN0cmluZyBvciBvYmplY3QsIGNvbnZlcnQgdGhhdCBpbnB1dCB0byBSR0Jcbi8vIFBvc3NpYmxlIHN0cmluZyBpbnB1dHM6XG4vL1xuLy8gICAgIFwicmVkXCJcbi8vICAgICBcIiNmMDBcIiBvciBcImYwMFwiXG4vLyAgICAgXCIjZmYwMDAwXCIgb3IgXCJmZjAwMDBcIlxuLy8gICAgIFwiI2ZmMDAwMDAwXCIgb3IgXCJmZjAwMDAwMFwiXG4vLyAgICAgXCJyZ2IgMjU1IDAgMFwiIG9yIFwicmdiICgyNTUsIDAsIDApXCJcbi8vICAgICBcInJnYiAxLjAgMCAwXCIgb3IgXCJyZ2IgKDEsIDAsIDApXCJcbi8vICAgICBcInJnYmEgKDI1NSwgMCwgMCwgMSlcIiBvciBcInJnYmEgMjU1LCAwLCAwLCAxXCJcbi8vICAgICBcInJnYmEgKDEuMCwgMCwgMCwgMSlcIiBvciBcInJnYmEgMS4wLCAwLCAwLCAxXCJcbi8vICAgICBcImhzbCgwLCAxMDAlLCA1MCUpXCIgb3IgXCJoc2wgMCAxMDAlIDUwJVwiXG4vLyAgICAgXCJoc2xhKDAsIDEwMCUsIDUwJSwgMSlcIiBvciBcImhzbGEgMCAxMDAlIDUwJSwgMVwiXG4vLyAgICAgXCJoc3YoMCwgMTAwJSwgMTAwJSlcIiBvciBcImhzdiAwIDEwMCUgMTAwJVwiXG4vL1xuZnVuY3Rpb24gaW5wdXRUb1JHQihjb2xvcikge1xuXG4gICAgdmFyIHJnYiA9IHsgcjogMCwgZzogMCwgYjogMCB9O1xuICAgIHZhciBhID0gMTtcbiAgICB2YXIgcyA9IG51bGw7XG4gICAgdmFyIHYgPSBudWxsO1xuICAgIHZhciBsID0gbnVsbDtcbiAgICB2YXIgb2sgPSBmYWxzZTtcbiAgICB2YXIgZm9ybWF0ID0gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIGNvbG9yID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29sb3IgPSBzdHJpbmdJbnB1dFRvT2JqZWN0KGNvbG9yKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbG9yID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKGlzVmFsaWRDU1NVbml0KGNvbG9yLnIpICYmIGlzVmFsaWRDU1NVbml0KGNvbG9yLmcpICYmIGlzVmFsaWRDU1NVbml0KGNvbG9yLmIpKSB7XG4gICAgICAgICAgICByZ2IgPSByZ2JUb1JnYihjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iKTtcbiAgICAgICAgICAgIG9rID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvcm1hdCA9IFN0cmluZyhjb2xvci5yKS5zdWJzdHIoLTEpID09PSBcIiVcIiA/IFwicHJnYlwiIDogXCJyZ2JcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1ZhbGlkQ1NTVW5pdChjb2xvci5oKSAmJiBpc1ZhbGlkQ1NTVW5pdChjb2xvci5zKSAmJiBpc1ZhbGlkQ1NTVW5pdChjb2xvci52KSkge1xuICAgICAgICAgICAgcyA9IGNvbnZlcnRUb1BlcmNlbnRhZ2UoY29sb3Iucyk7XG4gICAgICAgICAgICB2ID0gY29udmVydFRvUGVyY2VudGFnZShjb2xvci52KTtcbiAgICAgICAgICAgIHJnYiA9IGhzdlRvUmdiKGNvbG9yLmgsIHMsIHYpO1xuICAgICAgICAgICAgb2sgPSB0cnVlO1xuICAgICAgICAgICAgZm9ybWF0ID0gXCJoc3ZcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1ZhbGlkQ1NTVW5pdChjb2xvci5oKSAmJiBpc1ZhbGlkQ1NTVW5pdChjb2xvci5zKSAmJiBpc1ZhbGlkQ1NTVW5pdChjb2xvci5sKSkge1xuICAgICAgICAgICAgcyA9IGNvbnZlcnRUb1BlcmNlbnRhZ2UoY29sb3Iucyk7XG4gICAgICAgICAgICBsID0gY29udmVydFRvUGVyY2VudGFnZShjb2xvci5sKTtcbiAgICAgICAgICAgIHJnYiA9IGhzbFRvUmdiKGNvbG9yLmgsIHMsIGwpO1xuICAgICAgICAgICAgb2sgPSB0cnVlO1xuICAgICAgICAgICAgZm9ybWF0ID0gXCJoc2xcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2xvci5oYXNPd25Qcm9wZXJ0eShcImFcIikpIHtcbiAgICAgICAgICAgIGEgPSBjb2xvci5hO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYSA9IGJvdW5kQWxwaGEoYSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBvazogb2ssXG4gICAgICAgIGZvcm1hdDogY29sb3IuZm9ybWF0IHx8IGZvcm1hdCxcbiAgICAgICAgcjogbWF0aE1pbigyNTUsIG1hdGhNYXgocmdiLnIsIDApKSxcbiAgICAgICAgZzogbWF0aE1pbigyNTUsIG1hdGhNYXgocmdiLmcsIDApKSxcbiAgICAgICAgYjogbWF0aE1pbigyNTUsIG1hdGhNYXgocmdiLmIsIDApKSxcbiAgICAgICAgYTogYVxuICAgIH07XG59XG5cblxuLy8gQ29udmVyc2lvbiBGdW5jdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIGByZ2JUb0hzbGAsIGByZ2JUb0hzdmAsIGBoc2xUb1JnYmAsIGBoc3ZUb1JnYmAgbW9kaWZpZWQgZnJvbTpcbi8vIDxodHRwOi8vbWppamFja3Nvbi5jb20vMjAwOC8wMi9yZ2ItdG8taHNsLWFuZC1yZ2ItdG8taHN2LWNvbG9yLW1vZGVsLWNvbnZlcnNpb24tYWxnb3JpdGhtcy1pbi1qYXZhc2NyaXB0PlxuXG4vLyBgcmdiVG9SZ2JgXG4vLyBIYW5kbGUgYm91bmRzIC8gcGVyY2VudGFnZSBjaGVja2luZyB0byBjb25mb3JtIHRvIENTUyBjb2xvciBzcGVjXG4vLyA8aHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1jb2xvci8+XG4vLyAqQXNzdW1lczoqIHIsIGcsIGIgaW4gWzAsIDI1NV0gb3IgWzAsIDFdXG4vLyAqUmV0dXJuczoqIHsgciwgZywgYiB9IGluIFswLCAyNTVdXG5mdW5jdGlvbiByZ2JUb1JnYihyLCBnLCBiKXtcbiAgICByZXR1cm4ge1xuICAgICAgICByOiBib3VuZDAxKHIsIDI1NSkgKiAyNTUsXG4gICAgICAgIGc6IGJvdW5kMDEoZywgMjU1KSAqIDI1NSxcbiAgICAgICAgYjogYm91bmQwMShiLCAyNTUpICogMjU1XG4gICAgfTtcbn1cblxuLy8gYHJnYlRvSHNsYFxuLy8gQ29udmVydHMgYW4gUkdCIGNvbG9yIHZhbHVlIHRvIEhTTC5cbi8vICpBc3N1bWVzOiogciwgZywgYW5kIGIgYXJlIGNvbnRhaW5lZCBpbiBbMCwgMjU1XSBvciBbMCwgMV1cbi8vICpSZXR1cm5zOiogeyBoLCBzLCBsIH0gaW4gWzAsMV1cbmZ1bmN0aW9uIHJnYlRvSHNsKHIsIGcsIGIpIHtcblxuICAgIHIgPSBib3VuZDAxKHIsIDI1NSk7XG4gICAgZyA9IGJvdW5kMDEoZywgMjU1KTtcbiAgICBiID0gYm91bmQwMShiLCAyNTUpO1xuXG4gICAgdmFyIG1heCA9IG1hdGhNYXgociwgZywgYiksIG1pbiA9IG1hdGhNaW4ociwgZywgYik7XG4gICAgdmFyIGgsIHMsIGwgPSAobWF4ICsgbWluKSAvIDI7XG5cbiAgICBpZihtYXggPT0gbWluKSB7XG4gICAgICAgIGggPSBzID0gMDsgLy8gYWNocm9tYXRpY1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGQgPSBtYXggLSBtaW47XG4gICAgICAgIHMgPSBsID4gMC41ID8gZCAvICgyIC0gbWF4IC0gbWluKSA6IGQgLyAobWF4ICsgbWluKTtcbiAgICAgICAgc3dpdGNoKG1heCkge1xuICAgICAgICAgICAgY2FzZSByOiBoID0gKGcgLSBiKSAvIGQgKyAoZyA8IGIgPyA2IDogMCk7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBnOiBoID0gKGIgLSByKSAvIGQgKyAyOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgYjogaCA9IChyIC0gZykgLyBkICsgNDsgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBoIC89IDY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgaDogaCwgczogcywgbDogbCB9O1xufVxuXG4vLyBgaHNsVG9SZ2JgXG4vLyBDb252ZXJ0cyBhbiBIU0wgY29sb3IgdmFsdWUgdG8gUkdCLlxuLy8gKkFzc3VtZXM6KiBoIGlzIGNvbnRhaW5lZCBpbiBbMCwgMV0gb3IgWzAsIDM2MF0gYW5kIHMgYW5kIGwgYXJlIGNvbnRhaW5lZCBbMCwgMV0gb3IgWzAsIDEwMF1cbi8vICpSZXR1cm5zOiogeyByLCBnLCBiIH0gaW4gdGhlIHNldCBbMCwgMjU1XVxuZnVuY3Rpb24gaHNsVG9SZ2IoaCwgcywgbCkge1xuICAgIHZhciByLCBnLCBiO1xuXG4gICAgaCA9IGJvdW5kMDEoaCwgMzYwKTtcbiAgICBzID0gYm91bmQwMShzLCAxMDApO1xuICAgIGwgPSBib3VuZDAxKGwsIDEwMCk7XG5cbiAgICBmdW5jdGlvbiBodWUycmdiKHAsIHEsIHQpIHtcbiAgICAgICAgaWYodCA8IDApIHQgKz0gMTtcbiAgICAgICAgaWYodCA+IDEpIHQgLT0gMTtcbiAgICAgICAgaWYodCA8IDEvNikgcmV0dXJuIHAgKyAocSAtIHApICogNiAqIHQ7XG4gICAgICAgIGlmKHQgPCAxLzIpIHJldHVybiBxO1xuICAgICAgICBpZih0IDwgMi8zKSByZXR1cm4gcCArIChxIC0gcCkgKiAoMi8zIC0gdCkgKiA2O1xuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG5cbiAgICBpZihzID09PSAwKSB7XG4gICAgICAgIHIgPSBnID0gYiA9IGw7IC8vIGFjaHJvbWF0aWNcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBxID0gbCA8IDAuNSA/IGwgKiAoMSArIHMpIDogbCArIHMgLSBsICogcztcbiAgICAgICAgdmFyIHAgPSAyICogbCAtIHE7XG4gICAgICAgIHIgPSBodWUycmdiKHAsIHEsIGggKyAxLzMpO1xuICAgICAgICBnID0gaHVlMnJnYihwLCBxLCBoKTtcbiAgICAgICAgYiA9IGh1ZTJyZ2IocCwgcSwgaCAtIDEvMyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcjogciAqIDI1NSwgZzogZyAqIDI1NSwgYjogYiAqIDI1NSB9O1xufVxuXG4vLyBgcmdiVG9Ic3ZgXG4vLyBDb252ZXJ0cyBhbiBSR0IgY29sb3IgdmFsdWUgdG8gSFNWXG4vLyAqQXNzdW1lczoqIHIsIGcsIGFuZCBiIGFyZSBjb250YWluZWQgaW4gdGhlIHNldCBbMCwgMjU1XSBvciBbMCwgMV1cbi8vICpSZXR1cm5zOiogeyBoLCBzLCB2IH0gaW4gWzAsMV1cbmZ1bmN0aW9uIHJnYlRvSHN2KHIsIGcsIGIpIHtcblxuICAgIHIgPSBib3VuZDAxKHIsIDI1NSk7XG4gICAgZyA9IGJvdW5kMDEoZywgMjU1KTtcbiAgICBiID0gYm91bmQwMShiLCAyNTUpO1xuXG4gICAgdmFyIG1heCA9IG1hdGhNYXgociwgZywgYiksIG1pbiA9IG1hdGhNaW4ociwgZywgYik7XG4gICAgdmFyIGgsIHMsIHYgPSBtYXg7XG5cbiAgICB2YXIgZCA9IG1heCAtIG1pbjtcbiAgICBzID0gbWF4ID09PSAwID8gMCA6IGQgLyBtYXg7XG5cbiAgICBpZihtYXggPT0gbWluKSB7XG4gICAgICAgIGggPSAwOyAvLyBhY2hyb21hdGljXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzd2l0Y2gobWF4KSB7XG4gICAgICAgICAgICBjYXNlIHI6IGggPSAoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGc6IGggPSAoYiAtIHIpIC8gZCArIDI7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBiOiBoID0gKHIgLSBnKSAvIGQgKyA0OyBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBoIC89IDY7XG4gICAgfVxuICAgIHJldHVybiB7IGg6IGgsIHM6IHMsIHY6IHYgfTtcbn1cblxuLy8gYGhzdlRvUmdiYFxuLy8gQ29udmVydHMgYW4gSFNWIGNvbG9yIHZhbHVlIHRvIFJHQi5cbi8vICpBc3N1bWVzOiogaCBpcyBjb250YWluZWQgaW4gWzAsIDFdIG9yIFswLCAzNjBdIGFuZCBzIGFuZCB2IGFyZSBjb250YWluZWQgaW4gWzAsIDFdIG9yIFswLCAxMDBdXG4vLyAqUmV0dXJuczoqIHsgciwgZywgYiB9IGluIHRoZSBzZXQgWzAsIDI1NV1cbiBmdW5jdGlvbiBoc3ZUb1JnYihoLCBzLCB2KSB7XG5cbiAgICBoID0gYm91bmQwMShoLCAzNjApICogNjtcbiAgICBzID0gYm91bmQwMShzLCAxMDApO1xuICAgIHYgPSBib3VuZDAxKHYsIDEwMCk7XG5cbiAgICB2YXIgaSA9IE1hdGguZmxvb3IoaCksXG4gICAgICAgIGYgPSBoIC0gaSxcbiAgICAgICAgcCA9IHYgKiAoMSAtIHMpLFxuICAgICAgICBxID0gdiAqICgxIC0gZiAqIHMpLFxuICAgICAgICB0ID0gdiAqICgxIC0gKDEgLSBmKSAqIHMpLFxuICAgICAgICBtb2QgPSBpICUgNixcbiAgICAgICAgciA9IFt2LCBxLCBwLCBwLCB0LCB2XVttb2RdLFxuICAgICAgICBnID0gW3QsIHYsIHYsIHEsIHAsIHBdW21vZF0sXG4gICAgICAgIGIgPSBbcCwgcCwgdCwgdiwgdiwgcV1bbW9kXTtcblxuICAgIHJldHVybiB7IHI6IHIgKiAyNTUsIGc6IGcgKiAyNTUsIGI6IGIgKiAyNTUgfTtcbn1cblxuLy8gYHJnYlRvSGV4YFxuLy8gQ29udmVydHMgYW4gUkdCIGNvbG9yIHRvIGhleFxuLy8gQXNzdW1lcyByLCBnLCBhbmQgYiBhcmUgY29udGFpbmVkIGluIHRoZSBzZXQgWzAsIDI1NV1cbi8vIFJldHVybnMgYSAzIG9yIDYgY2hhcmFjdGVyIGhleFxuZnVuY3Rpb24gcmdiVG9IZXgociwgZywgYiwgYWxsb3czQ2hhcikge1xuXG4gICAgdmFyIGhleCA9IFtcbiAgICAgICAgcGFkMihtYXRoUm91bmQocikudG9TdHJpbmcoMTYpKSxcbiAgICAgICAgcGFkMihtYXRoUm91bmQoZykudG9TdHJpbmcoMTYpKSxcbiAgICAgICAgcGFkMihtYXRoUm91bmQoYikudG9TdHJpbmcoMTYpKVxuICAgIF07XG5cbiAgICAvLyBSZXR1cm4gYSAzIGNoYXJhY3RlciBoZXggaWYgcG9zc2libGVcbiAgICBpZiAoYWxsb3czQ2hhciAmJiBoZXhbMF0uY2hhckF0KDApID09IGhleFswXS5jaGFyQXQoMSkgJiYgaGV4WzFdLmNoYXJBdCgwKSA9PSBoZXhbMV0uY2hhckF0KDEpICYmIGhleFsyXS5jaGFyQXQoMCkgPT0gaGV4WzJdLmNoYXJBdCgxKSkge1xuICAgICAgICByZXR1cm4gaGV4WzBdLmNoYXJBdCgwKSArIGhleFsxXS5jaGFyQXQoMCkgKyBoZXhbMl0uY2hhckF0KDApO1xuICAgIH1cblxuICAgIHJldHVybiBoZXguam9pbihcIlwiKTtcbn1cblxuLy8gYHJnYmFUb0hleGBcbi8vIENvbnZlcnRzIGFuIFJHQkEgY29sb3IgcGx1cyBhbHBoYSB0cmFuc3BhcmVuY3kgdG8gaGV4XG4vLyBBc3N1bWVzIHIsIGcsIGIgYXJlIGNvbnRhaW5lZCBpbiB0aGUgc2V0IFswLCAyNTVdIGFuZFxuLy8gYSBpbiBbMCwgMV0uIFJldHVybnMgYSA0IG9yIDggY2hhcmFjdGVyIHJnYmEgaGV4XG5mdW5jdGlvbiByZ2JhVG9IZXgociwgZywgYiwgYSwgYWxsb3c0Q2hhcikge1xuXG4gICAgdmFyIGhleCA9IFtcbiAgICAgICAgcGFkMihtYXRoUm91bmQocikudG9TdHJpbmcoMTYpKSxcbiAgICAgICAgcGFkMihtYXRoUm91bmQoZykudG9TdHJpbmcoMTYpKSxcbiAgICAgICAgcGFkMihtYXRoUm91bmQoYikudG9TdHJpbmcoMTYpKSxcbiAgICAgICAgcGFkMihjb252ZXJ0RGVjaW1hbFRvSGV4KGEpKVxuICAgIF07XG5cbiAgICAvLyBSZXR1cm4gYSA0IGNoYXJhY3RlciBoZXggaWYgcG9zc2libGVcbiAgICBpZiAoYWxsb3c0Q2hhciAmJiBoZXhbMF0uY2hhckF0KDApID09IGhleFswXS5jaGFyQXQoMSkgJiYgaGV4WzFdLmNoYXJBdCgwKSA9PSBoZXhbMV0uY2hhckF0KDEpICYmIGhleFsyXS5jaGFyQXQoMCkgPT0gaGV4WzJdLmNoYXJBdCgxKSAmJiBoZXhbM10uY2hhckF0KDApID09IGhleFszXS5jaGFyQXQoMSkpIHtcbiAgICAgICAgcmV0dXJuIGhleFswXS5jaGFyQXQoMCkgKyBoZXhbMV0uY2hhckF0KDApICsgaGV4WzJdLmNoYXJBdCgwKSArIGhleFszXS5jaGFyQXQoMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhleC5qb2luKFwiXCIpO1xufVxuXG4vLyBgcmdiYVRvQXJnYkhleGBcbi8vIENvbnZlcnRzIGFuIFJHQkEgY29sb3IgdG8gYW4gQVJHQiBIZXg4IHN0cmluZ1xuLy8gUmFyZWx5IHVzZWQsIGJ1dCByZXF1aXJlZCBmb3IgXCJ0b0ZpbHRlcigpXCJcbmZ1bmN0aW9uIHJnYmFUb0FyZ2JIZXgociwgZywgYiwgYSkge1xuXG4gICAgdmFyIGhleCA9IFtcbiAgICAgICAgcGFkMihjb252ZXJ0RGVjaW1hbFRvSGV4KGEpKSxcbiAgICAgICAgcGFkMihtYXRoUm91bmQocikudG9TdHJpbmcoMTYpKSxcbiAgICAgICAgcGFkMihtYXRoUm91bmQoZykudG9TdHJpbmcoMTYpKSxcbiAgICAgICAgcGFkMihtYXRoUm91bmQoYikudG9TdHJpbmcoMTYpKVxuICAgIF07XG5cbiAgICByZXR1cm4gaGV4LmpvaW4oXCJcIik7XG59XG5cbi8vIGBlcXVhbHNgXG4vLyBDYW4gYmUgY2FsbGVkIHdpdGggYW55IHRpbnljb2xvciBpbnB1dFxudGlueWNvbG9yLmVxdWFscyA9IGZ1bmN0aW9uIChjb2xvcjEsIGNvbG9yMikge1xuICAgIGlmICghY29sb3IxIHx8ICFjb2xvcjIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgcmV0dXJuIHRpbnljb2xvcihjb2xvcjEpLnRvUmdiU3RyaW5nKCkgPT0gdGlueWNvbG9yKGNvbG9yMikudG9SZ2JTdHJpbmcoKTtcbn07XG5cbnRpbnljb2xvci5yYW5kb20gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGlueWNvbG9yLmZyb21SYXRpbyh7XG4gICAgICAgIHI6IG1hdGhSYW5kb20oKSxcbiAgICAgICAgZzogbWF0aFJhbmRvbSgpLFxuICAgICAgICBiOiBtYXRoUmFuZG9tKClcbiAgICB9KTtcbn07XG5cblxuLy8gTW9kaWZpY2F0aW9uIEZ1bmN0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGhhbmtzIHRvIGxlc3MuanMgZm9yIHNvbWUgb2YgdGhlIGJhc2ljcyBoZXJlXG4vLyA8aHR0cHM6Ly9naXRodWIuY29tL2Nsb3VkaGVhZC9sZXNzLmpzL2Jsb2IvbWFzdGVyL2xpYi9sZXNzL2Z1bmN0aW9ucy5qcz5cblxuZnVuY3Rpb24gZGVzYXR1cmF0ZShjb2xvciwgYW1vdW50KSB7XG4gICAgYW1vdW50ID0gKGFtb3VudCA9PT0gMCkgPyAwIDogKGFtb3VudCB8fCAxMCk7XG4gICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTtcbiAgICBoc2wucyAtPSBhbW91bnQgLyAxMDA7XG4gICAgaHNsLnMgPSBjbGFtcDAxKGhzbC5zKTtcbiAgICByZXR1cm4gdGlueWNvbG9yKGhzbCk7XG59XG5cbmZ1bmN0aW9uIHNhdHVyYXRlKGNvbG9yLCBhbW91bnQpIHtcbiAgICBhbW91bnQgPSAoYW1vdW50ID09PSAwKSA/IDAgOiAoYW1vdW50IHx8IDEwKTtcbiAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpO1xuICAgIGhzbC5zICs9IGFtb3VudCAvIDEwMDtcbiAgICBoc2wucyA9IGNsYW1wMDEoaHNsLnMpO1xuICAgIHJldHVybiB0aW55Y29sb3IoaHNsKTtcbn1cblxuZnVuY3Rpb24gZ3JleXNjYWxlKGNvbG9yKSB7XG4gICAgcmV0dXJuIHRpbnljb2xvcihjb2xvcikuZGVzYXR1cmF0ZSgxMDApO1xufVxuXG5mdW5jdGlvbiBsaWdodGVuIChjb2xvciwgYW1vdW50KSB7XG4gICAgYW1vdW50ID0gKGFtb3VudCA9PT0gMCkgPyAwIDogKGFtb3VudCB8fCAxMCk7XG4gICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTtcbiAgICBoc2wubCArPSBhbW91bnQgLyAxMDA7XG4gICAgaHNsLmwgPSBjbGFtcDAxKGhzbC5sKTtcbiAgICByZXR1cm4gdGlueWNvbG9yKGhzbCk7XG59XG5cbmZ1bmN0aW9uIGJyaWdodGVuKGNvbG9yLCBhbW91bnQpIHtcbiAgICBhbW91bnQgPSAoYW1vdW50ID09PSAwKSA/IDAgOiAoYW1vdW50IHx8IDEwKTtcbiAgICB2YXIgcmdiID0gdGlueWNvbG9yKGNvbG9yKS50b1JnYigpO1xuICAgIHJnYi5yID0gbWF0aE1heCgwLCBtYXRoTWluKDI1NSwgcmdiLnIgLSBtYXRoUm91bmQoMjU1ICogLSAoYW1vdW50IC8gMTAwKSkpKTtcbiAgICByZ2IuZyA9IG1hdGhNYXgoMCwgbWF0aE1pbigyNTUsIHJnYi5nIC0gbWF0aFJvdW5kKDI1NSAqIC0gKGFtb3VudCAvIDEwMCkpKSk7XG4gICAgcmdiLmIgPSBtYXRoTWF4KDAsIG1hdGhNaW4oMjU1LCByZ2IuYiAtIG1hdGhSb3VuZCgyNTUgKiAtIChhbW91bnQgLyAxMDApKSkpO1xuICAgIHJldHVybiB0aW55Y29sb3IocmdiKTtcbn1cblxuZnVuY3Rpb24gZGFya2VuIChjb2xvciwgYW1vdW50KSB7XG4gICAgYW1vdW50ID0gKGFtb3VudCA9PT0gMCkgPyAwIDogKGFtb3VudCB8fCAxMCk7XG4gICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTtcbiAgICBoc2wubCAtPSBhbW91bnQgLyAxMDA7XG4gICAgaHNsLmwgPSBjbGFtcDAxKGhzbC5sKTtcbiAgICByZXR1cm4gdGlueWNvbG9yKGhzbCk7XG59XG5cbi8vIFNwaW4gdGFrZXMgYSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBhbW91bnQgd2l0aGluIFstMzYwLCAzNjBdIGluZGljYXRpbmcgdGhlIGNoYW5nZSBvZiBodWUuXG4vLyBWYWx1ZXMgb3V0c2lkZSBvZiB0aGlzIHJhbmdlIHdpbGwgYmUgd3JhcHBlZCBpbnRvIHRoaXMgcmFuZ2UuXG5mdW5jdGlvbiBzcGluKGNvbG9yLCBhbW91bnQpIHtcbiAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpO1xuICAgIHZhciBodWUgPSAoaHNsLmggKyBhbW91bnQpICUgMzYwO1xuICAgIGhzbC5oID0gaHVlIDwgMCA/IDM2MCArIGh1ZSA6IGh1ZTtcbiAgICByZXR1cm4gdGlueWNvbG9yKGhzbCk7XG59XG5cbi8vIENvbWJpbmF0aW9uIEZ1bmN0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaGFua3MgdG8galF1ZXJ5IHhDb2xvciBmb3Igc29tZSBvZiB0aGUgaWRlYXMgYmVoaW5kIHRoZXNlXG4vLyA8aHR0cHM6Ly9naXRodWIuY29tL2luZnVzaW9uL2pRdWVyeS14Y29sb3IvYmxvYi9tYXN0ZXIvanF1ZXJ5Lnhjb2xvci5qcz5cblxuZnVuY3Rpb24gY29tcGxlbWVudChjb2xvcikge1xuICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7XG4gICAgaHNsLmggPSAoaHNsLmggKyAxODApICUgMzYwO1xuICAgIHJldHVybiB0aW55Y29sb3IoaHNsKTtcbn1cblxuZnVuY3Rpb24gdHJpYWQoY29sb3IpIHtcbiAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpO1xuICAgIHZhciBoID0gaHNsLmg7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgdGlueWNvbG9yKGNvbG9yKSxcbiAgICAgICAgdGlueWNvbG9yKHsgaDogKGggKyAxMjApICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmwgfSksXG4gICAgICAgIHRpbnljb2xvcih7IGg6IChoICsgMjQwKSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sIH0pXG4gICAgXTtcbn1cblxuZnVuY3Rpb24gdGV0cmFkKGNvbG9yKSB7XG4gICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTtcbiAgICB2YXIgaCA9IGhzbC5oO1xuICAgIHJldHVybiBbXG4gICAgICAgIHRpbnljb2xvcihjb2xvciksXG4gICAgICAgIHRpbnljb2xvcih7IGg6IChoICsgOTApICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmwgfSksXG4gICAgICAgIHRpbnljb2xvcih7IGg6IChoICsgMTgwKSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sIH0pLFxuICAgICAgICB0aW55Y29sb3IoeyBoOiAoaCArIDI3MCkgJSAzNjAsIHM6IGhzbC5zLCBsOiBoc2wubCB9KVxuICAgIF07XG59XG5cbmZ1bmN0aW9uIHNwbGl0Y29tcGxlbWVudChjb2xvcikge1xuICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7XG4gICAgdmFyIGggPSBoc2wuaDtcbiAgICByZXR1cm4gW1xuICAgICAgICB0aW55Y29sb3IoY29sb3IpLFxuICAgICAgICB0aW55Y29sb3IoeyBoOiAoaCArIDcyKSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sfSksXG4gICAgICAgIHRpbnljb2xvcih7IGg6IChoICsgMjE2KSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sfSlcbiAgICBdO1xufVxuXG5mdW5jdGlvbiBhbmFsb2dvdXMoY29sb3IsIHJlc3VsdHMsIHNsaWNlcykge1xuICAgIHJlc3VsdHMgPSByZXN1bHRzIHx8IDY7XG4gICAgc2xpY2VzID0gc2xpY2VzIHx8IDMwO1xuXG4gICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTtcbiAgICB2YXIgcGFydCA9IDM2MCAvIHNsaWNlcztcbiAgICB2YXIgcmV0ID0gW3Rpbnljb2xvcihjb2xvcildO1xuXG4gICAgZm9yIChoc2wuaCA9ICgoaHNsLmggLSAocGFydCAqIHJlc3VsdHMgPj4gMSkpICsgNzIwKSAlIDM2MDsgLS1yZXN1bHRzOyApIHtcbiAgICAgICAgaHNsLmggPSAoaHNsLmggKyBwYXJ0KSAlIDM2MDtcbiAgICAgICAgcmV0LnB1c2godGlueWNvbG9yKGhzbCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBtb25vY2hyb21hdGljKGNvbG9yLCByZXN1bHRzKSB7XG4gICAgcmVzdWx0cyA9IHJlc3VsdHMgfHwgNjtcbiAgICB2YXIgaHN2ID0gdGlueWNvbG9yKGNvbG9yKS50b0hzdigpO1xuICAgIHZhciBoID0gaHN2LmgsIHMgPSBoc3YucywgdiA9IGhzdi52O1xuICAgIHZhciByZXQgPSBbXTtcbiAgICB2YXIgbW9kaWZpY2F0aW9uID0gMSAvIHJlc3VsdHM7XG5cbiAgICB3aGlsZSAocmVzdWx0cy0tKSB7XG4gICAgICAgIHJldC5wdXNoKHRpbnljb2xvcih7IGg6IGgsIHM6IHMsIHY6IHZ9KSk7XG4gICAgICAgIHYgPSAodiArIG1vZGlmaWNhdGlvbikgJSAxO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG59XG5cbi8vIFV0aWxpdHkgRnVuY3Rpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudGlueWNvbG9yLm1peCA9IGZ1bmN0aW9uKGNvbG9yMSwgY29sb3IyLCBhbW91bnQpIHtcbiAgICBhbW91bnQgPSAoYW1vdW50ID09PSAwKSA/IDAgOiAoYW1vdW50IHx8IDUwKTtcblxuICAgIHZhciByZ2IxID0gdGlueWNvbG9yKGNvbG9yMSkudG9SZ2IoKTtcbiAgICB2YXIgcmdiMiA9IHRpbnljb2xvcihjb2xvcjIpLnRvUmdiKCk7XG5cbiAgICB2YXIgcCA9IGFtb3VudCAvIDEwMDtcblxuICAgIHZhciByZ2JhID0ge1xuICAgICAgICByOiAoKHJnYjIuciAtIHJnYjEucikgKiBwKSArIHJnYjEucixcbiAgICAgICAgZzogKChyZ2IyLmcgLSByZ2IxLmcpICogcCkgKyByZ2IxLmcsXG4gICAgICAgIGI6ICgocmdiMi5iIC0gcmdiMS5iKSAqIHApICsgcmdiMS5iLFxuICAgICAgICBhOiAoKHJnYjIuYSAtIHJnYjEuYSkgKiBwKSArIHJnYjEuYVxuICAgIH07XG5cbiAgICByZXR1cm4gdGlueWNvbG9yKHJnYmEpO1xufTtcblxuXG4vLyBSZWFkYWJpbGl0eSBGdW5jdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gPGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDgvUkVDLVdDQUcyMC0yMDA4MTIxMS8jY29udHJhc3QtcmF0aW9kZWYgKFdDQUcgVmVyc2lvbiAyKVxuXG4vLyBgY29udHJhc3RgXG4vLyBBbmFseXplIHRoZSAyIGNvbG9ycyBhbmQgcmV0dXJucyB0aGUgY29sb3IgY29udHJhc3QgZGVmaW5lZCBieSAoV0NBRyBWZXJzaW9uIDIpXG50aW55Y29sb3IucmVhZGFiaWxpdHkgPSBmdW5jdGlvbihjb2xvcjEsIGNvbG9yMikge1xuICAgIHZhciBjMSA9IHRpbnljb2xvcihjb2xvcjEpO1xuICAgIHZhciBjMiA9IHRpbnljb2xvcihjb2xvcjIpO1xuICAgIHJldHVybiAoTWF0aC5tYXgoYzEuZ2V0THVtaW5hbmNlKCksYzIuZ2V0THVtaW5hbmNlKCkpKzAuMDUpIC8gKE1hdGgubWluKGMxLmdldEx1bWluYW5jZSgpLGMyLmdldEx1bWluYW5jZSgpKSswLjA1KTtcbn07XG5cbi8vIGBpc1JlYWRhYmxlYFxuLy8gRW5zdXJlIHRoYXQgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvciBjb21iaW5hdGlvbnMgbWVldCBXQ0FHMiBndWlkZWxpbmVzLlxuLy8gVGhlIHRoaXJkIGFyZ3VtZW50IGlzIGFuIG9wdGlvbmFsIE9iamVjdC5cbi8vICAgICAgdGhlICdsZXZlbCcgcHJvcGVydHkgc3RhdGVzICdBQScgb3IgJ0FBQScgLSBpZiBtaXNzaW5nIG9yIGludmFsaWQsIGl0IGRlZmF1bHRzIHRvICdBQSc7XG4vLyAgICAgIHRoZSAnc2l6ZScgcHJvcGVydHkgc3RhdGVzICdsYXJnZScgb3IgJ3NtYWxsJyAtIGlmIG1pc3Npbmcgb3IgaW52YWxpZCwgaXQgZGVmYXVsdHMgdG8gJ3NtYWxsJy5cbi8vIElmIHRoZSBlbnRpcmUgb2JqZWN0IGlzIGFic2VudCwgaXNSZWFkYWJsZSBkZWZhdWx0cyB0byB7bGV2ZWw6XCJBQVwiLHNpemU6XCJzbWFsbFwifS5cblxuLy8gKkV4YW1wbGUqXG4vLyAgICB0aW55Y29sb3IuaXNSZWFkYWJsZShcIiMwMDBcIiwgXCIjMTExXCIpID0+IGZhbHNlXG4vLyAgICB0aW55Y29sb3IuaXNSZWFkYWJsZShcIiMwMDBcIiwgXCIjMTExXCIse2xldmVsOlwiQUFcIixzaXplOlwibGFyZ2VcIn0pID0+IGZhbHNlXG50aW55Y29sb3IuaXNSZWFkYWJsZSA9IGZ1bmN0aW9uKGNvbG9yMSwgY29sb3IyLCB3Y2FnMikge1xuICAgIHZhciByZWFkYWJpbGl0eSA9IHRpbnljb2xvci5yZWFkYWJpbGl0eShjb2xvcjEsIGNvbG9yMik7XG4gICAgdmFyIHdjYWcyUGFybXMsIG91dDtcblxuICAgIG91dCA9IGZhbHNlO1xuXG4gICAgd2NhZzJQYXJtcyA9IHZhbGlkYXRlV0NBRzJQYXJtcyh3Y2FnMik7XG4gICAgc3dpdGNoICh3Y2FnMlBhcm1zLmxldmVsICsgd2NhZzJQYXJtcy5zaXplKSB7XG4gICAgICAgIGNhc2UgXCJBQXNtYWxsXCI6XG4gICAgICAgIGNhc2UgXCJBQUFsYXJnZVwiOlxuICAgICAgICAgICAgb3V0ID0gcmVhZGFiaWxpdHkgPj0gNC41O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJBQWxhcmdlXCI6XG4gICAgICAgICAgICBvdXQgPSByZWFkYWJpbGl0eSA+PSAzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJBQUFzbWFsbFwiOlxuICAgICAgICAgICAgb3V0ID0gcmVhZGFiaWxpdHkgPj0gNztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuXG59O1xuXG4vLyBgbW9zdFJlYWRhYmxlYFxuLy8gR2l2ZW4gYSBiYXNlIGNvbG9yIGFuZCBhIGxpc3Qgb2YgcG9zc2libGUgZm9yZWdyb3VuZCBvciBiYWNrZ3JvdW5kXG4vLyBjb2xvcnMgZm9yIHRoYXQgYmFzZSwgcmV0dXJucyB0aGUgbW9zdCByZWFkYWJsZSBjb2xvci5cbi8vIE9wdGlvbmFsbHkgcmV0dXJucyBCbGFjayBvciBXaGl0ZSBpZiB0aGUgbW9zdCByZWFkYWJsZSBjb2xvciBpcyB1bnJlYWRhYmxlLlxuLy8gKkV4YW1wbGUqXG4vLyAgICB0aW55Y29sb3IubW9zdFJlYWRhYmxlKHRpbnljb2xvci5tb3N0UmVhZGFibGUoXCIjMTIzXCIsIFtcIiMxMjRcIiwgXCIjMTI1XCJdLHtpbmNsdWRlRmFsbGJhY2tDb2xvcnM6ZmFsc2V9KS50b0hleFN0cmluZygpOyAvLyBcIiMxMTIyNTVcIlxuLy8gICAgdGlueWNvbG9yLm1vc3RSZWFkYWJsZSh0aW55Y29sb3IubW9zdFJlYWRhYmxlKFwiIzEyM1wiLCBbXCIjMTI0XCIsIFwiIzEyNVwiXSx7aW5jbHVkZUZhbGxiYWNrQ29sb3JzOnRydWV9KS50b0hleFN0cmluZygpOyAgLy8gXCIjZmZmZmZmXCJcbi8vICAgIHRpbnljb2xvci5tb3N0UmVhZGFibGUoXCIjYTgwMTVhXCIsIFtcIiNmYWYzZjNcIl0se2luY2x1ZGVGYWxsYmFja0NvbG9yczp0cnVlLGxldmVsOlwiQUFBXCIsc2l6ZTpcImxhcmdlXCJ9KS50b0hleFN0cmluZygpOyAvLyBcIiNmYWYzZjNcIlxuLy8gICAgdGlueWNvbG9yLm1vc3RSZWFkYWJsZShcIiNhODAxNWFcIiwgW1wiI2ZhZjNmM1wiXSx7aW5jbHVkZUZhbGxiYWNrQ29sb3JzOnRydWUsbGV2ZWw6XCJBQUFcIixzaXplOlwic21hbGxcIn0pLnRvSGV4U3RyaW5nKCk7IC8vIFwiI2ZmZmZmZlwiXG50aW55Y29sb3IubW9zdFJlYWRhYmxlID0gZnVuY3Rpb24oYmFzZUNvbG9yLCBjb2xvckxpc3QsIGFyZ3MpIHtcbiAgICB2YXIgYmVzdENvbG9yID0gbnVsbDtcbiAgICB2YXIgYmVzdFNjb3JlID0gMDtcbiAgICB2YXIgcmVhZGFiaWxpdHk7XG4gICAgdmFyIGluY2x1ZGVGYWxsYmFja0NvbG9ycywgbGV2ZWwsIHNpemUgO1xuICAgIGFyZ3MgPSBhcmdzIHx8IHt9O1xuICAgIGluY2x1ZGVGYWxsYmFja0NvbG9ycyA9IGFyZ3MuaW5jbHVkZUZhbGxiYWNrQ29sb3JzIDtcbiAgICBsZXZlbCA9IGFyZ3MubGV2ZWw7XG4gICAgc2l6ZSA9IGFyZ3Muc2l6ZTtcblxuICAgIGZvciAodmFyIGk9IDA7IGkgPCBjb2xvckxpc3QubGVuZ3RoIDsgaSsrKSB7XG4gICAgICAgIHJlYWRhYmlsaXR5ID0gdGlueWNvbG9yLnJlYWRhYmlsaXR5KGJhc2VDb2xvciwgY29sb3JMaXN0W2ldKTtcbiAgICAgICAgaWYgKHJlYWRhYmlsaXR5ID4gYmVzdFNjb3JlKSB7XG4gICAgICAgICAgICBiZXN0U2NvcmUgPSByZWFkYWJpbGl0eTtcbiAgICAgICAgICAgIGJlc3RDb2xvciA9IHRpbnljb2xvcihjb2xvckxpc3RbaV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRpbnljb2xvci5pc1JlYWRhYmxlKGJhc2VDb2xvciwgYmVzdENvbG9yLCB7XCJsZXZlbFwiOmxldmVsLFwic2l6ZVwiOnNpemV9KSB8fCAhaW5jbHVkZUZhbGxiYWNrQ29sb3JzKSB7XG4gICAgICAgIHJldHVybiBiZXN0Q29sb3I7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhcmdzLmluY2x1ZGVGYWxsYmFja0NvbG9ycz1mYWxzZTtcbiAgICAgICAgcmV0dXJuIHRpbnljb2xvci5tb3N0UmVhZGFibGUoYmFzZUNvbG9yLFtcIiNmZmZcIiwgXCIjMDAwXCJdLGFyZ3MpO1xuICAgIH1cbn07XG5cblxuLy8gQmlnIExpc3Qgb2YgQ29sb3JzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS1cbi8vIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yLyNzdmctY29sb3I+XG52YXIgbmFtZXMgPSB0aW55Y29sb3IubmFtZXMgPSB7XG4gICAgYWxpY2VibHVlOiBcImYwZjhmZlwiLFxuICAgIGFudGlxdWV3aGl0ZTogXCJmYWViZDdcIixcbiAgICBhcXVhOiBcIjBmZlwiLFxuICAgIGFxdWFtYXJpbmU6IFwiN2ZmZmQ0XCIsXG4gICAgYXp1cmU6IFwiZjBmZmZmXCIsXG4gICAgYmVpZ2U6IFwiZjVmNWRjXCIsXG4gICAgYmlzcXVlOiBcImZmZTRjNFwiLFxuICAgIGJsYWNrOiBcIjAwMFwiLFxuICAgIGJsYW5jaGVkYWxtb25kOiBcImZmZWJjZFwiLFxuICAgIGJsdWU6IFwiMDBmXCIsXG4gICAgYmx1ZXZpb2xldDogXCI4YTJiZTJcIixcbiAgICBicm93bjogXCJhNTJhMmFcIixcbiAgICBidXJseXdvb2Q6IFwiZGViODg3XCIsXG4gICAgYnVybnRzaWVubmE6IFwiZWE3ZTVkXCIsXG4gICAgY2FkZXRibHVlOiBcIjVmOWVhMFwiLFxuICAgIGNoYXJ0cmV1c2U6IFwiN2ZmZjAwXCIsXG4gICAgY2hvY29sYXRlOiBcImQyNjkxZVwiLFxuICAgIGNvcmFsOiBcImZmN2Y1MFwiLFxuICAgIGNvcm5mbG93ZXJibHVlOiBcIjY0OTVlZFwiLFxuICAgIGNvcm5zaWxrOiBcImZmZjhkY1wiLFxuICAgIGNyaW1zb246IFwiZGMxNDNjXCIsXG4gICAgY3lhbjogXCIwZmZcIixcbiAgICBkYXJrYmx1ZTogXCIwMDAwOGJcIixcbiAgICBkYXJrY3lhbjogXCIwMDhiOGJcIixcbiAgICBkYXJrZ29sZGVucm9kOiBcImI4ODYwYlwiLFxuICAgIGRhcmtncmF5OiBcImE5YTlhOVwiLFxuICAgIGRhcmtncmVlbjogXCIwMDY0MDBcIixcbiAgICBkYXJrZ3JleTogXCJhOWE5YTlcIixcbiAgICBkYXJra2hha2k6IFwiYmRiNzZiXCIsXG4gICAgZGFya21hZ2VudGE6IFwiOGIwMDhiXCIsXG4gICAgZGFya29saXZlZ3JlZW46IFwiNTU2YjJmXCIsXG4gICAgZGFya29yYW5nZTogXCJmZjhjMDBcIixcbiAgICBkYXJrb3JjaGlkOiBcIjk5MzJjY1wiLFxuICAgIGRhcmtyZWQ6IFwiOGIwMDAwXCIsXG4gICAgZGFya3NhbG1vbjogXCJlOTk2N2FcIixcbiAgICBkYXJrc2VhZ3JlZW46IFwiOGZiYzhmXCIsXG4gICAgZGFya3NsYXRlYmx1ZTogXCI0ODNkOGJcIixcbiAgICBkYXJrc2xhdGVncmF5OiBcIjJmNGY0ZlwiLFxuICAgIGRhcmtzbGF0ZWdyZXk6IFwiMmY0ZjRmXCIsXG4gICAgZGFya3R1cnF1b2lzZTogXCIwMGNlZDFcIixcbiAgICBkYXJrdmlvbGV0OiBcIjk0MDBkM1wiLFxuICAgIGRlZXBwaW5rOiBcImZmMTQ5M1wiLFxuICAgIGRlZXBza3libHVlOiBcIjAwYmZmZlwiLFxuICAgIGRpbWdyYXk6IFwiNjk2OTY5XCIsXG4gICAgZGltZ3JleTogXCI2OTY5NjlcIixcbiAgICBkb2RnZXJibHVlOiBcIjFlOTBmZlwiLFxuICAgIGZpcmVicmljazogXCJiMjIyMjJcIixcbiAgICBmbG9yYWx3aGl0ZTogXCJmZmZhZjBcIixcbiAgICBmb3Jlc3RncmVlbjogXCIyMjhiMjJcIixcbiAgICBmdWNoc2lhOiBcImYwZlwiLFxuICAgIGdhaW5zYm9ybzogXCJkY2RjZGNcIixcbiAgICBnaG9zdHdoaXRlOiBcImY4ZjhmZlwiLFxuICAgIGdvbGQ6IFwiZmZkNzAwXCIsXG4gICAgZ29sZGVucm9kOiBcImRhYTUyMFwiLFxuICAgIGdyYXk6IFwiODA4MDgwXCIsXG4gICAgZ3JlZW46IFwiMDA4MDAwXCIsXG4gICAgZ3JlZW55ZWxsb3c6IFwiYWRmZjJmXCIsXG4gICAgZ3JleTogXCI4MDgwODBcIixcbiAgICBob25leWRldzogXCJmMGZmZjBcIixcbiAgICBob3RwaW5rOiBcImZmNjliNFwiLFxuICAgIGluZGlhbnJlZDogXCJjZDVjNWNcIixcbiAgICBpbmRpZ286IFwiNGIwMDgyXCIsXG4gICAgaXZvcnk6IFwiZmZmZmYwXCIsXG4gICAga2hha2k6IFwiZjBlNjhjXCIsXG4gICAgbGF2ZW5kZXI6IFwiZTZlNmZhXCIsXG4gICAgbGF2ZW5kZXJibHVzaDogXCJmZmYwZjVcIixcbiAgICBsYXduZ3JlZW46IFwiN2NmYzAwXCIsXG4gICAgbGVtb25jaGlmZm9uOiBcImZmZmFjZFwiLFxuICAgIGxpZ2h0Ymx1ZTogXCJhZGQ4ZTZcIixcbiAgICBsaWdodGNvcmFsOiBcImYwODA4MFwiLFxuICAgIGxpZ2h0Y3lhbjogXCJlMGZmZmZcIixcbiAgICBsaWdodGdvbGRlbnJvZHllbGxvdzogXCJmYWZhZDJcIixcbiAgICBsaWdodGdyYXk6IFwiZDNkM2QzXCIsXG4gICAgbGlnaHRncmVlbjogXCI5MGVlOTBcIixcbiAgICBsaWdodGdyZXk6IFwiZDNkM2QzXCIsXG4gICAgbGlnaHRwaW5rOiBcImZmYjZjMVwiLFxuICAgIGxpZ2h0c2FsbW9uOiBcImZmYTA3YVwiLFxuICAgIGxpZ2h0c2VhZ3JlZW46IFwiMjBiMmFhXCIsXG4gICAgbGlnaHRza3libHVlOiBcIjg3Y2VmYVwiLFxuICAgIGxpZ2h0c2xhdGVncmF5OiBcIjc4OVwiLFxuICAgIGxpZ2h0c2xhdGVncmV5OiBcIjc4OVwiLFxuICAgIGxpZ2h0c3RlZWxibHVlOiBcImIwYzRkZVwiLFxuICAgIGxpZ2h0eWVsbG93OiBcImZmZmZlMFwiLFxuICAgIGxpbWU6IFwiMGYwXCIsXG4gICAgbGltZWdyZWVuOiBcIjMyY2QzMlwiLFxuICAgIGxpbmVuOiBcImZhZjBlNlwiLFxuICAgIG1hZ2VudGE6IFwiZjBmXCIsXG4gICAgbWFyb29uOiBcIjgwMDAwMFwiLFxuICAgIG1lZGl1bWFxdWFtYXJpbmU6IFwiNjZjZGFhXCIsXG4gICAgbWVkaXVtYmx1ZTogXCIwMDAwY2RcIixcbiAgICBtZWRpdW1vcmNoaWQ6IFwiYmE1NWQzXCIsXG4gICAgbWVkaXVtcHVycGxlOiBcIjkzNzBkYlwiLFxuICAgIG1lZGl1bXNlYWdyZWVuOiBcIjNjYjM3MVwiLFxuICAgIG1lZGl1bXNsYXRlYmx1ZTogXCI3YjY4ZWVcIixcbiAgICBtZWRpdW1zcHJpbmdncmVlbjogXCIwMGZhOWFcIixcbiAgICBtZWRpdW10dXJxdW9pc2U6IFwiNDhkMWNjXCIsXG4gICAgbWVkaXVtdmlvbGV0cmVkOiBcImM3MTU4NVwiLFxuICAgIG1pZG5pZ2h0Ymx1ZTogXCIxOTE5NzBcIixcbiAgICBtaW50Y3JlYW06IFwiZjVmZmZhXCIsXG4gICAgbWlzdHlyb3NlOiBcImZmZTRlMVwiLFxuICAgIG1vY2Nhc2luOiBcImZmZTRiNVwiLFxuICAgIG5hdmFqb3doaXRlOiBcImZmZGVhZFwiLFxuICAgIG5hdnk6IFwiMDAwMDgwXCIsXG4gICAgb2xkbGFjZTogXCJmZGY1ZTZcIixcbiAgICBvbGl2ZTogXCI4MDgwMDBcIixcbiAgICBvbGl2ZWRyYWI6IFwiNmI4ZTIzXCIsXG4gICAgb3JhbmdlOiBcImZmYTUwMFwiLFxuICAgIG9yYW5nZXJlZDogXCJmZjQ1MDBcIixcbiAgICBvcmNoaWQ6IFwiZGE3MGQ2XCIsXG4gICAgcGFsZWdvbGRlbnJvZDogXCJlZWU4YWFcIixcbiAgICBwYWxlZ3JlZW46IFwiOThmYjk4XCIsXG4gICAgcGFsZXR1cnF1b2lzZTogXCJhZmVlZWVcIixcbiAgICBwYWxldmlvbGV0cmVkOiBcImRiNzA5M1wiLFxuICAgIHBhcGF5YXdoaXA6IFwiZmZlZmQ1XCIsXG4gICAgcGVhY2hwdWZmOiBcImZmZGFiOVwiLFxuICAgIHBlcnU6IFwiY2Q4NTNmXCIsXG4gICAgcGluazogXCJmZmMwY2JcIixcbiAgICBwbHVtOiBcImRkYTBkZFwiLFxuICAgIHBvd2RlcmJsdWU6IFwiYjBlMGU2XCIsXG4gICAgcHVycGxlOiBcIjgwMDA4MFwiLFxuICAgIHJlYmVjY2FwdXJwbGU6IFwiNjYzMzk5XCIsXG4gICAgcmVkOiBcImYwMFwiLFxuICAgIHJvc3licm93bjogXCJiYzhmOGZcIixcbiAgICByb3lhbGJsdWU6IFwiNDE2OWUxXCIsXG4gICAgc2FkZGxlYnJvd246IFwiOGI0NTEzXCIsXG4gICAgc2FsbW9uOiBcImZhODA3MlwiLFxuICAgIHNhbmR5YnJvd246IFwiZjRhNDYwXCIsXG4gICAgc2VhZ3JlZW46IFwiMmU4YjU3XCIsXG4gICAgc2Vhc2hlbGw6IFwiZmZmNWVlXCIsXG4gICAgc2llbm5hOiBcImEwNTIyZFwiLFxuICAgIHNpbHZlcjogXCJjMGMwYzBcIixcbiAgICBza3libHVlOiBcIjg3Y2VlYlwiLFxuICAgIHNsYXRlYmx1ZTogXCI2YTVhY2RcIixcbiAgICBzbGF0ZWdyYXk6IFwiNzA4MDkwXCIsXG4gICAgc2xhdGVncmV5OiBcIjcwODA5MFwiLFxuICAgIHNub3c6IFwiZmZmYWZhXCIsXG4gICAgc3ByaW5nZ3JlZW46IFwiMDBmZjdmXCIsXG4gICAgc3RlZWxibHVlOiBcIjQ2ODJiNFwiLFxuICAgIHRhbjogXCJkMmI0OGNcIixcbiAgICB0ZWFsOiBcIjAwODA4MFwiLFxuICAgIHRoaXN0bGU6IFwiZDhiZmQ4XCIsXG4gICAgdG9tYXRvOiBcImZmNjM0N1wiLFxuICAgIHR1cnF1b2lzZTogXCI0MGUwZDBcIixcbiAgICB2aW9sZXQ6IFwiZWU4MmVlXCIsXG4gICAgd2hlYXQ6IFwiZjVkZWIzXCIsXG4gICAgd2hpdGU6IFwiZmZmXCIsXG4gICAgd2hpdGVzbW9rZTogXCJmNWY1ZjVcIixcbiAgICB5ZWxsb3c6IFwiZmYwXCIsXG4gICAgeWVsbG93Z3JlZW46IFwiOWFjZDMyXCJcbn07XG5cbi8vIE1ha2UgaXQgZWFzeSB0byBhY2Nlc3MgY29sb3JzIHZpYSBgaGV4TmFtZXNbaGV4XWBcbnZhciBoZXhOYW1lcyA9IHRpbnljb2xvci5oZXhOYW1lcyA9IGZsaXAobmFtZXMpO1xuXG5cbi8vIFV0aWxpdGllc1xuLy8gLS0tLS0tLS0tXG5cbi8vIGB7ICduYW1lMSc6ICd2YWwxJyB9YCBiZWNvbWVzIGB7ICd2YWwxJzogJ25hbWUxJyB9YFxuZnVuY3Rpb24gZmxpcChvKSB7XG4gICAgdmFyIGZsaXBwZWQgPSB7IH07XG4gICAgZm9yICh2YXIgaSBpbiBvKSB7XG4gICAgICAgIGlmIChvLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICBmbGlwcGVkW29baV1dID0gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmxpcHBlZDtcbn1cblxuLy8gUmV0dXJuIGEgdmFsaWQgYWxwaGEgdmFsdWUgWzAsMV0gd2l0aCBhbGwgaW52YWxpZCB2YWx1ZXMgYmVpbmcgc2V0IHRvIDFcbmZ1bmN0aW9uIGJvdW5kQWxwaGEoYSkge1xuICAgIGEgPSBwYXJzZUZsb2F0KGEpO1xuXG4gICAgaWYgKGlzTmFOKGEpIHx8IGEgPCAwIHx8IGEgPiAxKSB7XG4gICAgICAgIGEgPSAxO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xufVxuXG4vLyBUYWtlIGlucHV0IGZyb20gWzAsIG5dIGFuZCByZXR1cm4gaXQgYXMgWzAsIDFdXG5mdW5jdGlvbiBib3VuZDAxKG4sIG1heCkge1xuICAgIGlmIChpc09uZVBvaW50WmVybyhuKSkgeyBuID0gXCIxMDAlXCI7IH1cblxuICAgIHZhciBwcm9jZXNzUGVyY2VudCA9IGlzUGVyY2VudGFnZShuKTtcbiAgICBuID0gbWF0aE1pbihtYXgsIG1hdGhNYXgoMCwgcGFyc2VGbG9hdChuKSkpO1xuXG4gICAgLy8gQXV0b21hdGljYWxseSBjb252ZXJ0IHBlcmNlbnRhZ2UgaW50byBudW1iZXJcbiAgICBpZiAocHJvY2Vzc1BlcmNlbnQpIHtcbiAgICAgICAgbiA9IHBhcnNlSW50KG4gKiBtYXgsIDEwKSAvIDEwMDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3JzXG4gICAgaWYgKChNYXRoLmFicyhuIC0gbWF4KSA8IDAuMDAwMDAxKSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IGludG8gWzAsIDFdIHJhbmdlIGlmIGl0IGlzbid0IGFscmVhZHlcbiAgICByZXR1cm4gKG4gJSBtYXgpIC8gcGFyc2VGbG9hdChtYXgpO1xufVxuXG4vLyBGb3JjZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDFcbmZ1bmN0aW9uIGNsYW1wMDEodmFsKSB7XG4gICAgcmV0dXJuIG1hdGhNaW4oMSwgbWF0aE1heCgwLCB2YWwpKTtcbn1cblxuLy8gUGFyc2UgYSBiYXNlLTE2IGhleCB2YWx1ZSBpbnRvIGEgYmFzZS0xMCBpbnRlZ2VyXG5mdW5jdGlvbiBwYXJzZUludEZyb21IZXgodmFsKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHZhbCwgMTYpO1xufVxuXG4vLyBOZWVkIHRvIGhhbmRsZSAxLjAgYXMgMTAwJSwgc2luY2Ugb25jZSBpdCBpcyBhIG51bWJlciwgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIGl0IGFuZCAxXG4vLyA8aHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83NDIyMDcyL2phdmFzY3JpcHQtaG93LXRvLWRldGVjdC1udW1iZXItYXMtYS1kZWNpbWFsLWluY2x1ZGluZy0xLTA+XG5mdW5jdGlvbiBpc09uZVBvaW50WmVybyhuKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBuID09IFwic3RyaW5nXCIgJiYgbi5pbmRleE9mKCcuJykgIT0gLTEgJiYgcGFyc2VGbG9hdChuKSA9PT0gMTtcbn1cblxuLy8gQ2hlY2sgdG8gc2VlIGlmIHN0cmluZyBwYXNzZWQgaW4gaXMgYSBwZXJjZW50YWdlXG5mdW5jdGlvbiBpc1BlcmNlbnRhZ2Uobikge1xuICAgIHJldHVybiB0eXBlb2YgbiA9PT0gXCJzdHJpbmdcIiAmJiBuLmluZGV4T2YoJyUnKSAhPSAtMTtcbn1cblxuLy8gRm9yY2UgYSBoZXggdmFsdWUgdG8gaGF2ZSAyIGNoYXJhY3RlcnNcbmZ1bmN0aW9uIHBhZDIoYykge1xuICAgIHJldHVybiBjLmxlbmd0aCA9PSAxID8gJzAnICsgYyA6ICcnICsgYztcbn1cblxuLy8gUmVwbGFjZSBhIGRlY2ltYWwgd2l0aCBpdCdzIHBlcmNlbnRhZ2UgdmFsdWVcbmZ1bmN0aW9uIGNvbnZlcnRUb1BlcmNlbnRhZ2Uobikge1xuICAgIGlmIChuIDw9IDEpIHtcbiAgICAgICAgbiA9IChuICogMTAwKSArIFwiJVwiO1xuICAgIH1cblxuICAgIHJldHVybiBuO1xufVxuXG4vLyBDb252ZXJ0cyBhIGRlY2ltYWwgdG8gYSBoZXggdmFsdWVcbmZ1bmN0aW9uIGNvbnZlcnREZWNpbWFsVG9IZXgoZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZCkgKiAyNTUpLnRvU3RyaW5nKDE2KTtcbn1cbi8vIENvbnZlcnRzIGEgaGV4IHZhbHVlIHRvIGEgZGVjaW1hbFxuZnVuY3Rpb24gY29udmVydEhleFRvRGVjaW1hbChoKSB7XG4gICAgcmV0dXJuIChwYXJzZUludEZyb21IZXgoaCkgLyAyNTUpO1xufVxuXG52YXIgbWF0Y2hlcnMgPSAoZnVuY3Rpb24oKSB7XG5cbiAgICAvLyA8aHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy12YWx1ZXMvI2ludGVnZXJzPlxuICAgIHZhciBDU1NfSU5URUdFUiA9IFwiWy1cXFxcK10/XFxcXGQrJT9cIjtcblxuICAgIC8vIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXZhbHVlcy8jbnVtYmVyLXZhbHVlPlxuICAgIHZhciBDU1NfTlVNQkVSID0gXCJbLVxcXFwrXT9cXFxcZCpcXFxcLlxcXFxkKyU/XCI7XG5cbiAgICAvLyBBbGxvdyBwb3NpdGl2ZS9uZWdhdGl2ZSBpbnRlZ2VyL251bWJlci4gIERvbid0IGNhcHR1cmUgdGhlIGVpdGhlci9vciwganVzdCB0aGUgZW50aXJlIG91dGNvbWUuXG4gICAgdmFyIENTU19VTklUID0gXCIoPzpcIiArIENTU19OVU1CRVIgKyBcIil8KD86XCIgKyBDU1NfSU5URUdFUiArIFwiKVwiO1xuXG4gICAgLy8gQWN0dWFsIG1hdGNoaW5nLlxuICAgIC8vIFBhcmVudGhlc2VzIGFuZCBjb21tYXMgYXJlIG9wdGlvbmFsLCBidXQgbm90IHJlcXVpcmVkLlxuICAgIC8vIFdoaXRlc3BhY2UgY2FuIHRha2UgdGhlIHBsYWNlIG9mIGNvbW1hcyBvciBvcGVuaW5nIHBhcmVuXG4gICAgdmFyIFBFUk1JU1NJVkVfTUFUQ0gzID0gXCJbXFxcXHN8XFxcXChdKyhcIiArIENTU19VTklUICsgXCIpWyx8XFxcXHNdKyhcIiArIENTU19VTklUICsgXCIpWyx8XFxcXHNdKyhcIiArIENTU19VTklUICsgXCIpXFxcXHMqXFxcXCk/XCI7XG4gICAgdmFyIFBFUk1JU1NJVkVfTUFUQ0g0ID0gXCJbXFxcXHN8XFxcXChdKyhcIiArIENTU19VTklUICsgXCIpWyx8XFxcXHNdKyhcIiArIENTU19VTklUICsgXCIpWyx8XFxcXHNdKyhcIiArIENTU19VTklUICsgXCIpWyx8XFxcXHNdKyhcIiArIENTU19VTklUICsgXCIpXFxcXHMqXFxcXCk/XCI7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBDU1NfVU5JVDogbmV3IFJlZ0V4cChDU1NfVU5JVCksXG4gICAgICAgIHJnYjogbmV3IFJlZ0V4cChcInJnYlwiICsgUEVSTUlTU0lWRV9NQVRDSDMpLFxuICAgICAgICByZ2JhOiBuZXcgUmVnRXhwKFwicmdiYVwiICsgUEVSTUlTU0lWRV9NQVRDSDQpLFxuICAgICAgICBoc2w6IG5ldyBSZWdFeHAoXCJoc2xcIiArIFBFUk1JU1NJVkVfTUFUQ0gzKSxcbiAgICAgICAgaHNsYTogbmV3IFJlZ0V4cChcImhzbGFcIiArIFBFUk1JU1NJVkVfTUFUQ0g0KSxcbiAgICAgICAgaHN2OiBuZXcgUmVnRXhwKFwiaHN2XCIgKyBQRVJNSVNTSVZFX01BVENIMyksXG4gICAgICAgIGhzdmE6IG5ldyBSZWdFeHAoXCJoc3ZhXCIgKyBQRVJNSVNTSVZFX01BVENINCksXG4gICAgICAgIGhleDM6IC9eIz8oWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkkLyxcbiAgICAgICAgaGV4NjogL14jPyhbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KSQvLFxuICAgICAgICBoZXg0OiAvXiM/KFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KSQvLFxuICAgICAgICBoZXg4OiAvXiM/KFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KSQvXG4gICAgfTtcbn0pKCk7XG5cbi8vIGBpc1ZhbGlkQ1NTVW5pdGBcbi8vIFRha2UgaW4gYSBzaW5nbGUgc3RyaW5nIC8gbnVtYmVyIGFuZCBjaGVjayB0byBzZWUgaWYgaXQgbG9va3MgbGlrZSBhIENTUyB1bml0XG4vLyAoc2VlIGBtYXRjaGVyc2AgYWJvdmUgZm9yIGRlZmluaXRpb24pLlxuZnVuY3Rpb24gaXNWYWxpZENTU1VuaXQoY29sb3IpIHtcbiAgICByZXR1cm4gISFtYXRjaGVycy5DU1NfVU5JVC5leGVjKGNvbG9yKTtcbn1cblxuLy8gYHN0cmluZ0lucHV0VG9PYmplY3RgXG4vLyBQZXJtaXNzaXZlIHN0cmluZyBwYXJzaW5nLiAgVGFrZSBpbiBhIG51bWJlciBvZiBmb3JtYXRzLCBhbmQgb3V0cHV0IGFuIG9iamVjdFxuLy8gYmFzZWQgb24gZGV0ZWN0ZWQgZm9ybWF0LiAgUmV0dXJucyBgeyByLCBnLCBiIH1gIG9yIGB7IGgsIHMsIGwgfWAgb3IgYHsgaCwgcywgdn1gXG5mdW5jdGlvbiBzdHJpbmdJbnB1dFRvT2JqZWN0KGNvbG9yKSB7XG5cbiAgICBjb2xvciA9IGNvbG9yLnJlcGxhY2UodHJpbUxlZnQsJycpLnJlcGxhY2UodHJpbVJpZ2h0LCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgbmFtZWQgPSBmYWxzZTtcbiAgICBpZiAobmFtZXNbY29sb3JdKSB7XG4gICAgICAgIGNvbG9yID0gbmFtZXNbY29sb3JdO1xuICAgICAgICBuYW1lZCA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvbG9yID09ICd0cmFuc3BhcmVudCcpIHtcbiAgICAgICAgcmV0dXJuIHsgcjogMCwgZzogMCwgYjogMCwgYTogMCwgZm9ybWF0OiBcIm5hbWVcIiB9O1xuICAgIH1cblxuICAgIC8vIFRyeSB0byBtYXRjaCBzdHJpbmcgaW5wdXQgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucy5cbiAgICAvLyBLZWVwIG1vc3Qgb2YgdGhlIG51bWJlciBib3VuZGluZyBvdXQgb2YgdGhpcyBmdW5jdGlvbiAtIGRvbid0IHdvcnJ5IGFib3V0IFswLDFdIG9yIFswLDEwMF0gb3IgWzAsMzYwXVxuICAgIC8vIEp1c3QgcmV0dXJuIGFuIG9iamVjdCBhbmQgbGV0IHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBoYW5kbGUgdGhhdC5cbiAgICAvLyBUaGlzIHdheSB0aGUgcmVzdWx0IHdpbGwgYmUgdGhlIHNhbWUgd2hldGhlciB0aGUgdGlueWNvbG9yIGlzIGluaXRpYWxpemVkIHdpdGggc3RyaW5nIG9yIG9iamVjdC5cbiAgICB2YXIgbWF0Y2g7XG4gICAgaWYgKChtYXRjaCA9IG1hdGNoZXJzLnJnYi5leGVjKGNvbG9yKSkpIHtcbiAgICAgICAgcmV0dXJuIHsgcjogbWF0Y2hbMV0sIGc6IG1hdGNoWzJdLCBiOiBtYXRjaFszXSB9O1xuICAgIH1cbiAgICBpZiAoKG1hdGNoID0gbWF0Y2hlcnMucmdiYS5leGVjKGNvbG9yKSkpIHtcbiAgICAgICAgcmV0dXJuIHsgcjogbWF0Y2hbMV0sIGc6IG1hdGNoWzJdLCBiOiBtYXRjaFszXSwgYTogbWF0Y2hbNF0gfTtcbiAgICB9XG4gICAgaWYgKChtYXRjaCA9IG1hdGNoZXJzLmhzbC5leGVjKGNvbG9yKSkpIHtcbiAgICAgICAgcmV0dXJuIHsgaDogbWF0Y2hbMV0sIHM6IG1hdGNoWzJdLCBsOiBtYXRjaFszXSB9O1xuICAgIH1cbiAgICBpZiAoKG1hdGNoID0gbWF0Y2hlcnMuaHNsYS5leGVjKGNvbG9yKSkpIHtcbiAgICAgICAgcmV0dXJuIHsgaDogbWF0Y2hbMV0sIHM6IG1hdGNoWzJdLCBsOiBtYXRjaFszXSwgYTogbWF0Y2hbNF0gfTtcbiAgICB9XG4gICAgaWYgKChtYXRjaCA9IG1hdGNoZXJzLmhzdi5leGVjKGNvbG9yKSkpIHtcbiAgICAgICAgcmV0dXJuIHsgaDogbWF0Y2hbMV0sIHM6IG1hdGNoWzJdLCB2OiBtYXRjaFszXSB9O1xuICAgIH1cbiAgICBpZiAoKG1hdGNoID0gbWF0Y2hlcnMuaHN2YS5leGVjKGNvbG9yKSkpIHtcbiAgICAgICAgcmV0dXJuIHsgaDogbWF0Y2hbMV0sIHM6IG1hdGNoWzJdLCB2OiBtYXRjaFszXSwgYTogbWF0Y2hbNF0gfTtcbiAgICB9XG4gICAgaWYgKChtYXRjaCA9IG1hdGNoZXJzLmhleDguZXhlYyhjb2xvcikpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMV0pLFxuICAgICAgICAgICAgZzogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzJdKSxcbiAgICAgICAgICAgIGI6IHBhcnNlSW50RnJvbUhleChtYXRjaFszXSksXG4gICAgICAgICAgICBhOiBjb252ZXJ0SGV4VG9EZWNpbWFsKG1hdGNoWzRdKSxcbiAgICAgICAgICAgIGZvcm1hdDogbmFtZWQgPyBcIm5hbWVcIiA6IFwiaGV4OFwiXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oZXg2LmV4ZWMoY29sb3IpKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzFdKSxcbiAgICAgICAgICAgIGc6IHBhcnNlSW50RnJvbUhleChtYXRjaFsyXSksXG4gICAgICAgICAgICBiOiBwYXJzZUludEZyb21IZXgobWF0Y2hbM10pLFxuICAgICAgICAgICAgZm9ybWF0OiBuYW1lZCA/IFwibmFtZVwiIDogXCJoZXhcIlxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoKG1hdGNoID0gbWF0Y2hlcnMuaGV4NC5leGVjKGNvbG9yKSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHI6IHBhcnNlSW50RnJvbUhleChtYXRjaFsxXSArICcnICsgbWF0Y2hbMV0pLFxuICAgICAgICAgICAgZzogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzJdICsgJycgKyBtYXRjaFsyXSksXG4gICAgICAgICAgICBiOiBwYXJzZUludEZyb21IZXgobWF0Y2hbM10gKyAnJyArIG1hdGNoWzNdKSxcbiAgICAgICAgICAgIGE6IGNvbnZlcnRIZXhUb0RlY2ltYWwobWF0Y2hbNF0gKyAnJyArIG1hdGNoWzRdKSxcbiAgICAgICAgICAgIGZvcm1hdDogbmFtZWQgPyBcIm5hbWVcIiA6IFwiaGV4OFwiXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oZXgzLmV4ZWMoY29sb3IpKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzFdICsgJycgKyBtYXRjaFsxXSksXG4gICAgICAgICAgICBnOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMl0gKyAnJyArIG1hdGNoWzJdKSxcbiAgICAgICAgICAgIGI6IHBhcnNlSW50RnJvbUhleChtYXRjaFszXSArICcnICsgbWF0Y2hbM10pLFxuICAgICAgICAgICAgZm9ybWF0OiBuYW1lZCA/IFwibmFtZVwiIDogXCJoZXhcIlxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVXQ0FHMlBhcm1zKHBhcm1zKSB7XG4gICAgLy8gcmV0dXJuIHZhbGlkIFdDQUcyIHBhcm1zIGZvciBpc1JlYWRhYmxlLlxuICAgIC8vIElmIGlucHV0IHBhcm1zIGFyZSBpbnZhbGlkLCByZXR1cm4ge1wibGV2ZWxcIjpcIkFBXCIsIFwic2l6ZVwiOlwic21hbGxcIn1cbiAgICB2YXIgbGV2ZWwsIHNpemU7XG4gICAgcGFybXMgPSBwYXJtcyB8fCB7XCJsZXZlbFwiOlwiQUFcIiwgXCJzaXplXCI6XCJzbWFsbFwifTtcbiAgICBsZXZlbCA9IChwYXJtcy5sZXZlbCB8fCBcIkFBXCIpLnRvVXBwZXJDYXNlKCk7XG4gICAgc2l6ZSA9IChwYXJtcy5zaXplIHx8IFwic21hbGxcIikudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobGV2ZWwgIT09IFwiQUFcIiAmJiBsZXZlbCAhPT0gXCJBQUFcIikge1xuICAgICAgICBsZXZlbCA9IFwiQUFcIjtcbiAgICB9XG4gICAgaWYgKHNpemUgIT09IFwic21hbGxcIiAmJiBzaXplICE9PSBcImxhcmdlXCIpIHtcbiAgICAgICAgc2l6ZSA9IFwic21hbGxcIjtcbiAgICB9XG4gICAgcmV0dXJuIHtcImxldmVsXCI6bGV2ZWwsIFwic2l6ZVwiOnNpemV9O1xufVxuXG4vLyBOb2RlOiBFeHBvcnQgZnVuY3Rpb25cbmlmICh0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSB0aW55Y29sb3I7XG59XG4vLyBBTUQvcmVxdWlyZWpzOiBEZWZpbmUgdGhlIG1vZHVsZVxuZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKGZ1bmN0aW9uICgpIHtyZXR1cm4gdGlueWNvbG9yO30pO1xufVxuLy8gQnJvd3NlcjogRXhwb3NlIHRvIHdpbmRvd1xuZWxzZSB7XG4gICAgd2luZG93LnRpbnljb2xvciA9IHRpbnljb2xvcjtcbn1cblxufSkoTWF0aCk7XG4iLCIvKlxuICogVG9hc3RyXG4gKiBDb3B5cmlnaHQgMjAxMi0yMDE1XG4gKiBBdXRob3JzOiBKb2huIFBhcGEsIEhhbnMgRmrDpGxsZW1hcmssIGFuZCBUaW0gRmVycmVsbC5cbiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBVc2UsIHJlcHJvZHVjdGlvbiwgZGlzdHJpYnV0aW9uLCBhbmQgbW9kaWZpY2F0aW9uIG9mIHRoaXMgY29kZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgdGhlIE1JVCBsaWNlbnNlLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAqXG4gKiBBUklBIFN1cHBvcnQ6IEdyZXRhIEtyYWZzaWdcbiAqXG4gKiBQcm9qZWN0OiBodHRwczovL2dpdGh1Yi5jb20vQ29kZVNldmVuL3RvYXN0clxuICovXG4vKiBnbG9iYWwgZGVmaW5lICovXG4oZnVuY3Rpb24gKGRlZmluZSkge1xuICAgIGRlZmluZShbJ2pxdWVyeSddLCBmdW5jdGlvbiAoJCkge1xuICAgICAgICByZXR1cm4gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciAkY29udGFpbmVyO1xuICAgICAgICAgICAgdmFyIGxpc3RlbmVyO1xuICAgICAgICAgICAgdmFyIHRvYXN0SWQgPSAwO1xuICAgICAgICAgICAgdmFyIHRvYXN0VHlwZSA9IHtcbiAgICAgICAgICAgICAgICBlcnJvcjogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBpbmZvOiAnaW5mbycsXG4gICAgICAgICAgICAgICAgc3VjY2VzczogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgIHdhcm5pbmc6ICd3YXJuaW5nJ1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdmFyIHRvYXN0ciA9IHtcbiAgICAgICAgICAgICAgICBjbGVhcjogY2xlYXIsXG4gICAgICAgICAgICAgICAgcmVtb3ZlOiByZW1vdmUsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgICAgIGdldENvbnRhaW5lcjogZ2V0Q29udGFpbmVyLFxuICAgICAgICAgICAgICAgIGluZm86IGluZm8sXG4gICAgICAgICAgICAgICAgb3B0aW9uczoge30sXG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlOiBzdWJzY3JpYmUsXG4gICAgICAgICAgICAgICAgc3VjY2Vzczogc3VjY2VzcyxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMi4xLjMnLFxuICAgICAgICAgICAgICAgIHdhcm5pbmc6IHdhcm5pbmdcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHZhciBwcmV2aW91c1RvYXN0O1xuXG4gICAgICAgICAgICByZXR1cm4gdG9hc3RyO1xuXG4gICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGVycm9yKG1lc3NhZ2UsIHRpdGxlLCBvcHRpb25zT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm90aWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogdG9hc3RUeXBlLmVycm9yLFxuICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3M6IGdldE9wdGlvbnMoKS5pY29uQ2xhc3Nlcy5lcnJvcixcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc092ZXJyaWRlOiBvcHRpb25zT3ZlcnJpZGUsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRDb250YWluZXIob3B0aW9ucywgY3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7IG9wdGlvbnMgPSBnZXRPcHRpb25zKCk7IH1cbiAgICAgICAgICAgICAgICAkY29udGFpbmVyID0gJCgnIycgKyBvcHRpb25zLmNvbnRhaW5lcklkKTtcbiAgICAgICAgICAgICAgICBpZiAoJGNvbnRhaW5lci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRjb250YWluZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjcmVhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgJGNvbnRhaW5lciA9IGNyZWF0ZUNvbnRhaW5lcihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICRjb250YWluZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGluZm8obWVzc2FnZSwgdGl0bGUsIG9wdGlvbnNPdmVycmlkZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub3RpZnkoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiB0b2FzdFR5cGUuaW5mbyxcbiAgICAgICAgICAgICAgICAgICAgaWNvbkNsYXNzOiBnZXRPcHRpb25zKCkuaWNvbkNsYXNzZXMuaW5mbyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc092ZXJyaWRlOiBvcHRpb25zT3ZlcnJpZGUsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBzdWJzY3JpYmUoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBzdWNjZXNzKG1lc3NhZ2UsIHRpdGxlLCBvcHRpb25zT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm90aWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogdG9hc3RUeXBlLnN1Y2Nlc3MsXG4gICAgICAgICAgICAgICAgICAgIGljb25DbGFzczogZ2V0T3B0aW9ucygpLmljb25DbGFzc2VzLnN1Y2Nlc3MsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNPdmVycmlkZTogb3B0aW9uc092ZXJyaWRlLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gd2FybmluZyhtZXNzYWdlLCB0aXRsZSwgb3B0aW9uc092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vdGlmeSh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHRvYXN0VHlwZS53YXJuaW5nLFxuICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3M6IGdldE9wdGlvbnMoKS5pY29uQ2xhc3Nlcy53YXJuaW5nLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zT3ZlcnJpZGU6IG9wdGlvbnNPdmVycmlkZSxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGNsZWFyKCR0b2FzdEVsZW1lbnQsIGNsZWFyT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gZ2V0T3B0aW9ucygpO1xuICAgICAgICAgICAgICAgIGlmICghJGNvbnRhaW5lcikgeyBnZXRDb250YWluZXIob3B0aW9ucyk7IH1cbiAgICAgICAgICAgICAgICBpZiAoIWNsZWFyVG9hc3QoJHRvYXN0RWxlbWVudCwgb3B0aW9ucywgY2xlYXJPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckNvbnRhaW5lcihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlbW92ZSgkdG9hc3RFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBnZXRPcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgaWYgKCEkY29udGFpbmVyKSB7IGdldENvbnRhaW5lcihvcHRpb25zKTsgfVxuICAgICAgICAgICAgICAgIGlmICgkdG9hc3RFbGVtZW50ICYmICQoJzpmb2N1cycsICR0b2FzdEVsZW1lbnQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVUb2FzdCgkdG9hc3RFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoJGNvbnRhaW5lci5jaGlsZHJlbigpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAkY29udGFpbmVyLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW50ZXJuYWwgZnVuY3Rpb25zXG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGNsZWFyQ29udGFpbmVyIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvYXN0c1RvQ2xlYXIgPSAkY29udGFpbmVyLmNoaWxkcmVuKCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRvYXN0c1RvQ2xlYXIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUb2FzdCgkKHRvYXN0c1RvQ2xlYXJbaV0pLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGNsZWFyVG9hc3QgKCR0b2FzdEVsZW1lbnQsIG9wdGlvbnMsIGNsZWFyT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHZhciBmb3JjZSA9IGNsZWFyT3B0aW9ucyAmJiBjbGVhck9wdGlvbnMuZm9yY2UgPyBjbGVhck9wdGlvbnMuZm9yY2UgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoJHRvYXN0RWxlbWVudCAmJiAoZm9yY2UgfHwgJCgnOmZvY3VzJywgJHRvYXN0RWxlbWVudCkubGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgICAgICAgICAkdG9hc3RFbGVtZW50W29wdGlvbnMuaGlkZU1ldGhvZF0oe1xuICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IG9wdGlvbnMuaGlkZUR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWFzaW5nOiBvcHRpb25zLmhpZGVFYXNpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkgeyByZW1vdmVUb2FzdCgkdG9hc3RFbGVtZW50KTsgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gY3JlYXRlQ29udGFpbmVyKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAkY29udGFpbmVyID0gJCgnPGRpdi8+JylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgb3B0aW9ucy5jb250YWluZXJJZClcbiAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKG9wdGlvbnMucG9zaXRpb25DbGFzcyk7XG5cbiAgICAgICAgICAgICAgICAkY29udGFpbmVyLmFwcGVuZFRvKCQob3B0aW9ucy50YXJnZXQpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJGNvbnRhaW5lcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RGVmYXVsdHMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdGFwVG9EaXNtaXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0b2FzdENsYXNzOiAndG9hc3QnLFxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJJZDogJ3RvYXN0LWNvbnRhaW5lcicsXG4gICAgICAgICAgICAgICAgICAgIGRlYnVnOiBmYWxzZSxcblxuICAgICAgICAgICAgICAgICAgICBzaG93TWV0aG9kOiAnZmFkZUluJywgLy9mYWRlSW4sIHNsaWRlRG93biwgYW5kIHNob3cgYXJlIGJ1aWx0IGludG8galF1ZXJ5XG4gICAgICAgICAgICAgICAgICAgIHNob3dEdXJhdGlvbjogMzAwLFxuICAgICAgICAgICAgICAgICAgICBzaG93RWFzaW5nOiAnc3dpbmcnLCAvL3N3aW5nIGFuZCBsaW5lYXIgYXJlIGJ1aWx0IGludG8galF1ZXJ5XG4gICAgICAgICAgICAgICAgICAgIG9uU2hvd246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgaGlkZU1ldGhvZDogJ2ZhZGVPdXQnLFxuICAgICAgICAgICAgICAgICAgICBoaWRlRHVyYXRpb246IDEwMDAsXG4gICAgICAgICAgICAgICAgICAgIGhpZGVFYXNpbmc6ICdzd2luZycsXG4gICAgICAgICAgICAgICAgICAgIG9uSGlkZGVuOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlTWV0aG9kOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VEdXJhdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlRWFzaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VPbkhvdmVyOiB0cnVlLFxuXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkVGltZU91dDogMTAwMCxcbiAgICAgICAgICAgICAgICAgICAgaWNvbkNsYXNzZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAndG9hc3QtZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5mbzogJ3RvYXN0LWluZm8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogJ3RvYXN0LXN1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZzogJ3RvYXN0LXdhcm5pbmcnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGljb25DbGFzczogJ3RvYXN0LWluZm8nLFxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkNsYXNzOiAndG9hc3QtdG9wLXJpZ2h0JyxcbiAgICAgICAgICAgICAgICAgICAgdGltZU91dDogNTAwMCwgLy8gU2V0IHRpbWVPdXQgYW5kIGV4dGVuZGVkVGltZU91dCB0byAwIHRvIG1ha2UgaXQgc3RpY2t5XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlQ2xhc3M6ICd0b2FzdC10aXRsZScsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDbGFzczogJ3RvYXN0LW1lc3NhZ2UnLFxuICAgICAgICAgICAgICAgICAgICBlc2NhcGVIdG1sOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnYm9keScsXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlSHRtbDogJzxidXR0b24gdHlwZT1cImJ1dHRvblwiPiZ0aW1lczs8L2J1dHRvbj4nLFxuICAgICAgICAgICAgICAgICAgICBjbG9zZUNsYXNzOiAndG9hc3QtY2xvc2UtYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgICAgbmV3ZXN0T25Ub3A6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHByZXZlbnREdXBsaWNhdGVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0NsYXNzOiAndG9hc3QtcHJvZ3Jlc3MnLFxuICAgICAgICAgICAgICAgICAgICBydGw6IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gcHVibGlzaChhcmdzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFsaXN0ZW5lcikgeyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICBsaXN0ZW5lcihhcmdzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gbm90aWZ5KG1hcCkge1xuICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gZ2V0T3B0aW9ucygpO1xuICAgICAgICAgICAgICAgIHZhciBpY29uQ2xhc3MgPSBtYXAuaWNvbkNsYXNzIHx8IG9wdGlvbnMuaWNvbkNsYXNzO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAobWFwLm9wdGlvbnNPdmVycmlkZSkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSAkLmV4dGVuZChvcHRpb25zLCBtYXAub3B0aW9uc092ZXJyaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWNvbkNsYXNzID0gbWFwLm9wdGlvbnNPdmVycmlkZS5pY29uQ2xhc3MgfHwgaWNvbkNsYXNzO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRFeGl0KG9wdGlvbnMsIG1hcCkpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgICAgICB0b2FzdElkKys7XG5cbiAgICAgICAgICAgICAgICAkY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKG9wdGlvbnMsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgdmFyIGludGVydmFsSWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHZhciAkdG9hc3RFbGVtZW50ID0gJCgnPGRpdi8+Jyk7XG4gICAgICAgICAgICAgICAgdmFyICR0aXRsZUVsZW1lbnQgPSAkKCc8ZGl2Lz4nKTtcbiAgICAgICAgICAgICAgICB2YXIgJG1lc3NhZ2VFbGVtZW50ID0gJCgnPGRpdi8+Jyk7XG4gICAgICAgICAgICAgICAgdmFyICRwcm9ncmVzc0VsZW1lbnQgPSAkKCc8ZGl2Lz4nKTtcbiAgICAgICAgICAgICAgICB2YXIgJGNsb3NlRWxlbWVudCA9ICQob3B0aW9ucy5jbG9zZUh0bWwpO1xuICAgICAgICAgICAgICAgIHZhciBwcm9ncmVzc0JhciA9IHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWxJZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgaGlkZUV0YTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbWF4SGlkZVRpbWU6IG51bGxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdG9hc3RJZDogdG9hc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6ICd2aXNpYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBwZXJzb25hbGl6ZVRvYXN0KCk7XG5cbiAgICAgICAgICAgICAgICBkaXNwbGF5VG9hc3QoKTtcblxuICAgICAgICAgICAgICAgIGhhbmRsZUV2ZW50cygpO1xuXG4gICAgICAgICAgICAgICAgcHVibGlzaChyZXNwb25zZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5kZWJ1ZyAmJiBjb25zb2xlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gJHRvYXN0RWxlbWVudDtcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVzY2FwZUh0bWwoc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgJyYjMzk7JylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gcGVyc29uYWxpemVUb2FzdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0SWNvbigpO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaXRsZSgpO1xuICAgICAgICAgICAgICAgICAgICBzZXRNZXNzYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgIHNldENsb3NlQnV0dG9uKCk7XG4gICAgICAgICAgICAgICAgICAgIHNldFByb2dyZXNzQmFyKCk7XG4gICAgICAgICAgICAgICAgICAgIHNldFJUTCgpO1xuICAgICAgICAgICAgICAgICAgICBzZXRTZXF1ZW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBzZXRBcmlhKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gc2V0QXJpYSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyaWFWYWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1hcC5pY29uQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RvYXN0LXN1Y2Nlc3MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndG9hc3QtaW5mbyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYVZhbHVlID0gICdwb2xpdGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhVmFsdWUgPSAnYXNzZXJ0aXZlJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAkdG9hc3RFbGVtZW50LmF0dHIoJ2FyaWEtbGl2ZScsIGFyaWFWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gaGFuZGxlRXZlbnRzKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jbG9zZU9uSG92ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICR0b2FzdEVsZW1lbnQuaG92ZXIoc3RpY2tBcm91bmQsIGRlbGF5ZWRIaWRlVG9hc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLm9uY2xpY2sgJiYgb3B0aW9ucy50YXBUb0Rpc21pc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICR0b2FzdEVsZW1lbnQuY2xpY2soaGlkZVRvYXN0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNsb3NlQnV0dG9uICYmICRjbG9zZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICRjbG9zZUVsZW1lbnQuY2xpY2soZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmNhbmNlbEJ1YmJsZSAhPT0gdW5kZWZpbmVkICYmIGV2ZW50LmNhbmNlbEJ1YmJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm9uQ2xvc2VDbGljaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uQ2xvc2VDbGljayhldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZVRvYXN0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5vbmNsaWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkdG9hc3RFbGVtZW50LmNsaWNrKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25jbGljayhldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZVRvYXN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRpc3BsYXlUb2FzdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgJHRvYXN0RWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgJHRvYXN0RWxlbWVudFtvcHRpb25zLnNob3dNZXRob2RdKFxuICAgICAgICAgICAgICAgICAgICAgICAge2R1cmF0aW9uOiBvcHRpb25zLnNob3dEdXJhdGlvbiwgZWFzaW5nOiBvcHRpb25zLnNob3dFYXNpbmcsIGNvbXBsZXRlOiBvcHRpb25zLm9uU2hvd259XG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudGltZU91dCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsSWQgPSBzZXRUaW1lb3V0KGhpZGVUb2FzdCwgb3B0aW9ucy50aW1lT3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyLm1heEhpZGVUaW1lID0gcGFyc2VGbG9hdChvcHRpb25zLnRpbWVPdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXIuaGlkZUV0YSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgcHJvZ3Jlc3NCYXIubWF4SGlkZVRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wcm9ncmVzc0Jhcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyLmludGVydmFsSWQgPSBzZXRJbnRlcnZhbCh1cGRhdGVQcm9ncmVzcywgMTApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gc2V0SWNvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5pY29uQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICR0b2FzdEVsZW1lbnQuYWRkQ2xhc3Mob3B0aW9ucy50b2FzdENsYXNzKS5hZGRDbGFzcyhpY29uQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gc2V0U2VxdWVuY2UoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm5ld2VzdE9uVG9wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkY29udGFpbmVyLnByZXBlbmQoJHRvYXN0RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkY29udGFpbmVyLmFwcGVuZCgkdG9hc3RFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNldFRpdGxlKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWFwLnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3VmZml4ID0gbWFwLnRpdGxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZXNjYXBlSHRtbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IGVzY2FwZUh0bWwobWFwLnRpdGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICR0aXRsZUVsZW1lbnQuYXBwZW5kKHN1ZmZpeCkuYWRkQ2xhc3Mob3B0aW9ucy50aXRsZUNsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICR0b2FzdEVsZW1lbnQuYXBwZW5kKCR0aXRsZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gc2V0TWVzc2FnZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3VmZml4ID0gbWFwLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5lc2NhcGVIdG1sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gZXNjYXBlSHRtbChtYXAubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZUVsZW1lbnQuYXBwZW5kKHN1ZmZpeCkuYWRkQ2xhc3Mob3B0aW9ucy5tZXNzYWdlQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgJHRvYXN0RWxlbWVudC5hcHBlbmQoJG1lc3NhZ2VFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNldENsb3NlQnV0dG9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jbG9zZUJ1dHRvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGNsb3NlRWxlbWVudC5hZGRDbGFzcyhvcHRpb25zLmNsb3NlQ2xhc3MpLmF0dHIoJ3JvbGUnLCAnYnV0dG9uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkdG9hc3RFbGVtZW50LnByZXBlbmQoJGNsb3NlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzZXRQcm9ncmVzc0JhcigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucHJvZ3Jlc3NCYXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICRwcm9ncmVzc0VsZW1lbnQuYWRkQ2xhc3Mob3B0aW9ucy5wcm9ncmVzc0NsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICR0b2FzdEVsZW1lbnQucHJlcGVuZCgkcHJvZ3Jlc3NFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNldFJUTCgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucnRsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkdG9hc3RFbGVtZW50LmFkZENsYXNzKCdydGwnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNob3VsZEV4aXQob3B0aW9ucywgbWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnByZXZlbnREdXBsaWNhdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwLm1lc3NhZ2UgPT09IHByZXZpb3VzVG9hc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNUb2FzdCA9IG1hcC5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBoaWRlVG9hc3Qob3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9IG92ZXJyaWRlICYmIG9wdGlvbnMuY2xvc2VNZXRob2QgIT09IGZhbHNlID8gb3B0aW9ucy5jbG9zZU1ldGhvZCA6IG9wdGlvbnMuaGlkZU1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gb3ZlcnJpZGUgJiYgb3B0aW9ucy5jbG9zZUR1cmF0aW9uICE9PSBmYWxzZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNsb3NlRHVyYXRpb24gOiBvcHRpb25zLmhpZGVEdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVhc2luZyA9IG92ZXJyaWRlICYmIG9wdGlvbnMuY2xvc2VFYXNpbmcgIT09IGZhbHNlID8gb3B0aW9ucy5jbG9zZUVhc2luZyA6IG9wdGlvbnMuaGlkZUVhc2luZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCQoJzpmb2N1cycsICR0b2FzdEVsZW1lbnQpLmxlbmd0aCAmJiAhb3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocHJvZ3Jlc3NCYXIuaW50ZXJ2YWxJZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkdG9hc3RFbGVtZW50W21ldGhvZF0oe1xuICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWFzaW5nOiBlYXNpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVRvYXN0KCR0b2FzdEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChpbnRlcnZhbElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5vbkhpZGRlbiAmJiByZXNwb25zZS5zdGF0ZSAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkhpZGRlbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zdGF0ZSA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVuZFRpbWUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2gocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkZWxheWVkSGlkZVRvYXN0KCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50aW1lT3V0ID4gMCB8fCBvcHRpb25zLmV4dGVuZGVkVGltZU91dCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsSWQgPSBzZXRUaW1lb3V0KGhpZGVUb2FzdCwgb3B0aW9ucy5leHRlbmRlZFRpbWVPdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXIubWF4SGlkZVRpbWUgPSBwYXJzZUZsb2F0KG9wdGlvbnMuZXh0ZW5kZWRUaW1lT3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyLmhpZGVFdGEgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHByb2dyZXNzQmFyLm1heEhpZGVUaW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gc3RpY2tBcm91bmQoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChpbnRlcnZhbElkKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXIuaGlkZUV0YSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICR0b2FzdEVsZW1lbnQuc3RvcCh0cnVlLCB0cnVlKVtvcHRpb25zLnNob3dNZXRob2RdKFxuICAgICAgICAgICAgICAgICAgICAgICAge2R1cmF0aW9uOiBvcHRpb25zLnNob3dEdXJhdGlvbiwgZWFzaW5nOiBvcHRpb25zLnNob3dFYXNpbmd9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlUHJvZ3Jlc3MoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwZXJjZW50YWdlID0gKChwcm9ncmVzc0Jhci5oaWRlRXRhIC0gKG5ldyBEYXRlKCkuZ2V0VGltZSgpKSkgLyBwcm9ncmVzc0Jhci5tYXhIaWRlVGltZSkgKiAxMDA7XG4gICAgICAgICAgICAgICAgICAgICRwcm9ncmVzc0VsZW1lbnQud2lkdGgocGVyY2VudGFnZSArICclJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRPcHRpb25zKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAkLmV4dGVuZCh7fSwgZ2V0RGVmYXVsdHMoKSwgdG9hc3RyLm9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiByZW1vdmVUb2FzdCgkdG9hc3RFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKCEkY29udGFpbmVyKSB7ICRjb250YWluZXIgPSBnZXRDb250YWluZXIoKTsgfVxuICAgICAgICAgICAgICAgIGlmICgkdG9hc3RFbGVtZW50LmlzKCc6dmlzaWJsZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJHRvYXN0RWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAkdG9hc3RFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoJGNvbnRhaW5lci5jaGlsZHJlbigpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAkY29udGFpbmVyLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1RvYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KSgpO1xuICAgIH0pO1xufSh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUgOiBmdW5jdGlvbiAoZGVwcywgZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgeyAvL05vZGVcbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoJ2pxdWVyeScpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cudG9hc3RyID0gZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTtcbiAgICB9XG59KSk7XG4iLCJ2YXIgdGVtcGxhdGVTeXN0ZW0gPSByZXF1aXJlKCcuLi9zcmMvanMvYmluZGluZ3MvY2hvb3NlLXRlbXBsYXRlLmpzJyk7XG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oZXZlbnQpIHtcbnRlbXBsYXRlU3lzdGVtLmFkZFRlbXBsYXRlKFwiYXJyYXlcIiwgXCI8IS0tIGtvIGZvcmVhY2g6ICRkYXRhIC0tPjwhLS0ga28gYmxvY2s6ICRkYXRhIC0tPjwhLS0gL2tvIC0tPjwhLS0gL2tvIC0tPlwiKTtcbnRlbXBsYXRlU3lzdGVtLmFkZFRlbXBsYXRlKFwiYmxvY2stc2hvd1wiLCBcIjwhLS0ga28gYmxvY2s6ICRkYXRhLCBzY3JvbGxJbnRvVmlldzogJHJvb3Quc2VsZWN0ZWRCbG9jaygpID09PSAkZGF0YSAtLT48IS0tIC9rbyAtLT5cIik7XG50ZW1wbGF0ZVN5c3RlbS5hZGRUZW1wbGF0ZShcImJsb2NrLXd5c2l3eWdcIiwgXCI8ZGl2IGNsYXNzPVxceDIyZWRpdGFibGUgYmxvY2tcXHgyMiBkYXRhLWRyb3AtY29udGVudD1cXHgyMkRyb3AgaGVyZVxceDIyIGRhdGEtYmluZD1cXHgyMmF0dHI6IHsgJ2RhdGEtZHJvcC1jb250ZW50JzogJHJvb3QudCgnRHJvcCBoZXJlJykgfSwgY2xpY2s6IGZ1bmN0aW9uKG9iaiwgZXZ0KSB7ICRyb290LnNlbGVjdEJsb2NrKG9iaik7IHJldHVybiB0cnVlIH0sIGNsaWNrQnViYmxlOiBmYWxzZSwgY3NzOiB7IHNlbGVjdGVkOiAkcm9vdC5zZWxlY3RlZEJsb2NrKCkgPT09ICRkYXRhIH0sIHNjcm9sbEludG9WaWV3OiAkcm9vdC5zZWxlY3RlZEJsb2NrKCkgPT09ICRkYXRhXFx4MjI+ICA8ZGl2IGNsYXNzPVxceDIybW8tYmxvY2tzZWxlY3Rpb25oZWxwZXJcXHgyMj48L2Rpdj4gIDxkaXYgY2xhc3M9XFx4MjJ0b29sc1xceDIyIGRhdGEtYmluZD1cXHgyMnRvb2x0aXBzOiB7fVxceDIyPiAgICA8IS0tIGtvIGlmOiB0eXBlb2YgJGluZGV4ICE9ICd1bmRlZmluZWQnIC0tPiAgICA8ZGl2IHRpdGxlPVxceDIyRHJhZyB0aGlzIGhhbmRsZSB0byBtb3ZlIHRoZSBibG9ja1xceDIyIGRhdGEtYmluZD1cXHgyMmF0dHI6IHsgdGl0bGU6ICRyb290LnQoJ0RyYWcgdGhpcyBoYW5kbGUgdG8gbW92ZSB0aGUgYmxvY2snKSB9XFx4MjIgY2xhc3M9XFx4MjJ0b29sIGhhbmRsZVxceDIyPjxpIGNsYXNzPVxceDIyZmEgZmEtZncgZmEtc29ydFxceDIyPjwvaT48L2Rpdj4gICAgPCEtLSBrbyBpZjogJGluZGV4KCkgPiAwIC0tPiAgICA8ZGl2IHRpdGxlPVxceDIyTW92ZSB0aGlzIGJsb2NrIHVwc2lkZVxceDIyIGRhdGEtYmluZD1cXHgyMmF0dHI6IHsgdGl0bGU6ICRyb290LnQoJ01vdmUgdGhpcyBibG9jayB1cHNpZGUnKSB9XFx4MjIgY2xhc3M9XFx4MjJ0b29sIG1vdmV1cFxceDIyPjxpIGNsYXNzPVxceDIyZmEgZmEtZncgZmEtc29ydC1hc2NcXHgyMiBkYXRhLWJpbmQ9J2NsaWNrOiAkcm9vdC5tb3ZlQmxvY2suYmluZCgkZWxlbWVudCwgJGluZGV4LCAkcGFyZW50LCB0cnVlKSc+PC9pPjwvZGl2PiAgICA8IS0tIC9rbyAtLT4gICAgPCEtLSBrbyBpZjogJGluZGV4KCkgPCAkcGFyZW50LmJsb2NrcygpLmxlbmd0aCAtMSAtLT4gICAgPGRpdiB0aXRsZT1cXHgyMk1vdmUgdGhpcyBibG9jayBkb3duc2lkZVxceDIyIGRhdGEtYmluZD1cXHgyMmF0dHI6IHsgdGl0bGU6ICRyb290LnQoJ01vdmUgdGhpcyBibG9jayBkb3duc2lkZScpIH1cXHgyMiBjbGFzcz1cXHgyMnRvb2wgbW92ZWRvd25cXHgyMj48aSBjbGFzcz1cXHgyMmZhIGZhLWZ3IGZhLXNvcnQtZGVzY1xceDIyIGRhdGEtYmluZD0nY2xpY2s6ICRyb290Lm1vdmVCbG9jay5iaW5kKCRlbGVtZW50LCAkaW5kZXgsICRwYXJlbnQsIGZhbHNlKSc+PC9pPjwvZGl2PiAgICA8IS0tIC9rbyAtLT4gICAgPGRpdiB0aXRsZT1cXHgyMkRlbGV0ZSBibG9ja1xceDIyIGNsYXNzPVxceDIydG9vbCBkZWxldGVcXHgyMiBkYXRhLWJpbmQ9XFx4MjJhdHRyOiB7IHRpdGxlOiAkcm9vdC50KCdEZWxldGUgYmxvY2snKSB9LCBjbGljazogJHJvb3QucmVtb3ZlQmxvY2suYmluZCgkZWxlbWVudCwgJHJhd0RhdGEsICRwYXJlbnQpXFx4MjI+PGkgY2xhc3M9XFx4MjJmYSBmYS1mdyBmYS10cmFzaC1vXFx4MjI+PC9pPjwvZGl2PiAgICA8ZGl2IHRpdGxlPVxceDIyRHVwbGljYXRlIGJsb2NrXFx4MjIgY2xhc3M9XFx4MjJ0b29sIGNsb25lXFx4MjIgZGF0YS1iaW5kPVxceDIyYXR0cjogeyB0aXRsZTogJHJvb3QudCgnRHVwbGljYXRlIGJsb2NrJykgfSwgY2xpY2s6ICRyb290LmR1cGxpY2F0ZUJsb2NrLmJpbmQoJGVsZW1lbnQsICRpbmRleCwgJHBhcmVudClcXHgyMj48aSBjbGFzcz1cXHgyMmZhIGZhLWZ3IGZhLWZpbGVzLW9cXHgyMj48L2k+PC9kaXY+ICAgIDwhLS0gL2tvIC0tPiAgICA8IS0tIGtvIGlmOiB0eXBlb2YgJGRhdGEuX25leHRWYXJpYW50ICE9ICd1bmRlZmluZWQnIC0tPjxkaXYgdGl0bGU9XFx4MjJTd2l0Y2ggYmxvY2sgdmFyaWFudFxceDIyIGNsYXNzPVxceDIydG9vbCB2YXJpYW50XFx4MjIgZGF0YS1iaW5kPVxceDIyYXR0cjogeyB0aXRsZTogJHJvb3QudCgnU3dpdGNoIGJsb2NrIHZhcmlhbnQnKSB9LCBjbGljazogJGRhdGEuX25leHRWYXJpYW50XFx4MjI+PGkgY2xhc3M9XFx4MjJmYSBmYS1mdyBmYS1tYWdpY1xceDIyPjwvaT48L2Rpdj48IS0tIC9rbyAtLT4gIDwvZGl2PiAgPCEtLSBrbyBibG9jazogJGRhdGEgLS0+PCEtLSAva28gLS0+PC9kaXY+XCIpO1xudGVtcGxhdGVTeXN0ZW0uYWRkVGVtcGxhdGUoXCJibG9ja3Mtc2hvd1wiLCBcIjwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ2Jsb2NrLXNob3cnLCBmb3JlYWNoOiBibG9ja3MgfSAtLT48IS0tIC9rbyAtLT5cIik7XG50ZW1wbGF0ZVN5c3RlbS5hZGRUZW1wbGF0ZShcImJsb2Nrcy13eXNpd3lnXCIsIFwiPGRpdiBjbGFzcz1cXHgyMnNvcnRhYmxlLWJsb2Nrcy1lZGl0XFx4MjIgZGF0YS1kcm9wLWNvbnRlbnQ9XFx4MjJEcm9wIGhlcmVcXHgyMiBkYXRhLWVtcHR5LWNvbnRlbnQ9XFx4MjJEcm9wIGhlcmUgYmxvY2tzIGZyb20gdGhlIEJsb2NrcyB0YWJcXHgyMiBkYXRhLWJpbmQ9XFx4MjJhdHRyOiB7ICdkYXRhLWRyb3AtY29udGVudCc6ICRyb290LnQoJ0Ryb3AgaGVyZScpLCAnZGF0YS1lbXB0eS1jb250ZW50JzogJHJvb3QudCgnRHJvcCBoZXJlIGJsb2NrcyBmcm9tIHRoZSAmcXVvdDtCbG9ja3MmcXVvdDsgdGFiJykgfSwgY3NzOiB7ICdlbXB0eSc6IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoYmxvY2tzKS5sZW5ndGggPT0gMCB9LCBleHRzb3J0YWJsZTogeyBjb25uZWN0Q2xhc3M6ICdzb3J0YWJsZS1ibG9ja3MtZWRpdCcsIHRlbXBsYXRlOiAnYmxvY2std3lzaXd5ZycsIGRhdGE6IGJsb2NrcywgZHJhZ2dpbmc6ICRyb290LmRyYWdnaW5nLCBiZWZvcmVNb3ZlOiAkcm9vdC5zdGFydE11bHRpcGxlLCBhZnRlck1vdmU6ICRyb290LnN0b3BNdWx0aXBsZSwgb3B0aW9uczogeyBoYW5kbGU6ICcuaGFuZGxlJywgcGxhY2Vob2xkZXI6ICRyb290LnBsYWNlaG9sZGVySGVscGVyIH0gfVxceDIyPjwvZGl2PlwiKTtcbnRlbXBsYXRlU3lzdGVtLmFkZFRlbXBsYXRlKFwiY3VzdG9tc3R5bGVcIiwgXCI8ZGl2IGNsYXNzPVxceDIyY3VzdG9tU3R5bGVIZWxwXFx4MjIgZGF0YS1iaW5kPVxceDIyaHRtbDogJHJvb3QudCgnQ3VzdG9taXplZCBibG9jay48dWw+PGxpPkluIHRoaXMgc3RhdHVzIGNoYW5nZXMgdG8gcHJvcGVydGllcyB3aWxsIGJlIHNwZWNpZmljIHRvIHRoZSBjdXJyZW50IGJsb2NrIChpbnN0ZWFkIG9mIGJlaW5nIGdsb2JhbCB0byBhbGwgYmxvY2tzIGluIHRoZSBzYW1lIHNlY3Rpb24pPC9saT48bGk+QSA8c3BhbiBjbGFzcz0mcXVvdDtjdXN0b21TdHlsZWQmcXVvdDs+PHNwYW4+JnF1b3Q7c21hbGwgY3ViZSZxdW90OyA8L3NwYW4+PC9zcGFuPiBpY29uIGJlc2lkZSB0aGUgcHJvcGVydHkgd2lsbCBtYXJrIHRoZSBjdXN0b21pemF0aW9uLiBCeSBjbGlja2luZyB0aGlzIGljb24gdGhlIHByb3BlcnR5IHZhbHVlIHdpbGwgYmUgcmV2ZXJ0ZWQgdG8gdGhlIHZhbHVlIGRlZmluZWQgZm9yIHRoZSBzZWN0aW9uLjwvbGk+PC91bD4nKVxceDIyPkN1c3RvbWl6ZWQgYmxvY2suPHVsPjxsaT5JbiB0aGlzIHN0YXR1cyBjaGFuZ2VzIHRvIHByb3BlcnRpZXMgd2lsbCBiZSBzcGVjaWZpYyB0byB0aGUgY3VycmVudCBibG9jayAoaW5zdGVhZCBvZiBiZWluZyBnbG9iYWwgdG8gYWxsIGJsb2NrcyBpbiB0aGUgc2FtZSBzZWN0aW9uKTwvbGk+PGxpPkEgPHNwYW4gY2xhc3M9XFx4MjJjdXN0b21TdHlsZWRcXHgyMj48c3Bhbj5cXHgyMnNtYWxsIGN1YmVcXHgyMiA8L3NwYW4+PC9zcGFuPiBpY29uIGJlc2lkZSB0aGUgcHJvcGVydHkgd2lsbCBtYXJrIHRoZSBjdXN0b21pemF0aW9uLiBCeSBjbGlja2luZyB0aGlzIGljb24gdGhlIHByb3BlcnR5IHZhbHVlIHdpbGwgYmUgcmV2ZXJ0ZWQgdG8gdGhlIHZhbHVlIGRlZmluZWQgZm9yIHRoZSBzZWN0aW9uLjwvbGk+PC91bD48L2Rpdj5cIik7XG50ZW1wbGF0ZVN5c3RlbS5hZGRUZW1wbGF0ZShcImVtcHR5XCIsIFwiXCIpO1xudGVtcGxhdGVTeXN0ZW0uYWRkVGVtcGxhdGUoXCJlcnJvclwiLCBcIls8ZGl2IHN0eWxlPVxceDIyYmFja2dyb3VuZC1jb2xvcjogI2ZmZjBmMFxceDIyIGRhdGEtYmluZD1cXHgyMnRleHQ6IGtvLnRvSlMoJGRhdGEpXFx4MjI+PC9kaXY+XVwiKTtcbnRlbXBsYXRlU3lzdGVtLmFkZFRlbXBsYXRlKFwiZ2FsbGVyeS1pbWFnZXNcIiwgXCI8ZGl2IGRhdGEtYmluZD1cXHgyMmZvcmVhY2g6IGl0ZW1zLmN1cnJlbnRQYWdlRGF0YVxceDIyPiAgPGRpdiBjbGFzcz1cXHgyMmRyYWdnYWJsZS1pdGVtXFx4MjIgZGF0YS1iaW5kPVxceDIyaWY6IHR5cGVvZiB0aHVtYm5haWxVcmwgIT0gJ3VuZGVmaW5lZCdcXHgyMj4gICAgPGRpdiBjbGFzcz1cXHgyMmRyYWdnYWJsZSBpbWFnZVxceDIyIGRhdGEtYmluZD1cXHgyMmNsaWNrOiAkcm9vdC5hZGRJbWFnZSwgZXh0ZHJhZ2dhYmxlOiB7IGRhdGE6ICRkYXRhLCBkcm9wQ29udGFpbmVyOiAnI21haW4td3lzaXd5Zy1hcmVhJywgZHJhZ2dpbmc6ICRyb290LmRyYWdnaW5nSW1hZ2UsICdvcHRpb25zJzogeyAnYXBwZW5kVG8nOiAnI3BhZ2UnIH0gfSwgc3R5bGU6IHsgYmFja2dyb3VuZEltYWdlOiAndXJsKFxcXFwnJyArIHRodW1ibmFpbFVybCArICdcXFxcJyknIH1cXHgyMj4gICAgICA8aW1nIHRpdGxlPVxceDIyRHJhZyB0aGlzIGltYWdlIGFuZCBkcm9wIGl0IG9uIGFueSB0ZW1wbGF0ZSBpbWFnZSBwbGFjZWhvbGRlclxceDIyIHN0eWxlPVxceDIyZGlzcGxheTogYmxvY2s7XFx4MjIgZGF0YS1iaW5kPVxceDIydG9vbHRpcHM6IHt9LCBhdHRyOiB7IHNyYzogdGh1bWJuYWlsVXJsLCAndGl0bGUnOiAkcm9vdC50KCdEcmFnIHRoaXMgaW1hZ2UgYW5kIGRyb3AgaXQgb24gYW55IHRlbXBsYXRlIGltYWdlIHBsYWNlaG9sZGVyJykgfVxceDIyLz4gICAgPC9kaXY+ICA8L2Rpdj48L2Rpdj48IS0tIGtvIGlmOiBpdGVtcy5wYWdlQ291bnQoKSA+IDEgLS0+PGRpdiBjbGFzcz1cXHgyMmdhbGxlcnlQYWdlclxceDIyIGRhdGEtYmluZD1cXHgyMmJ1dHRvbnNldDoge31cXHgyMj4gIDxhIGhyZWY9XFx4MjJqYXZhc2NyaXB0OnZvaWQoMClcXHgyMiBkYXRhLWJpbmQ9XFx4MjJjbGljazogaXRlbXMubW92ZUZpcnN0LCBidXR0b246IHsgZGlzYWJsZWQ6IGl0ZW1zLmN1cnJlbnRQYWdlKCkgPT0gMSwgaWNvbnM6IHsgcHJpbWFyeTogJ2ZhIGZhLWZhc3QtYmFja3dhcmQnIH0sIHRleHQ6IGZhbHNlIH1cXHgyMj5GaXJzdDwvYT4gIDxhIGhyZWY9XFx4MjJqYXZhc2NyaXB0OnZvaWQoMClcXHgyMiBkYXRhLWJpbmQ9XFx4MjJjbGljazogaXRlbXMubW92ZVByZXZpb3VzLCBidXR0b246IHsgZGlzYWJsZWQ6IGl0ZW1zLmN1cnJlbnRQYWdlKCkgPT0gMSwgaWNvbnM6IHsgcHJpbWFyeTogJ2ZhIGZhLWJhY2t3YXJkJyB9LCB0ZXh0OiBmYWxzZSB9XFx4MjI+UHJldmlvdXM8L2E+ICA8c3BhbiBkYXRhLWJpbmQ9XFx4MjJidXR0b246IHsgZGlzYWJsZWQ6IHRydWUsIHRleHQ6IHRydWUsIGxhYmVsOiAnICcraXRlbXMuY3VycmVudFBhZ2UoKSsnIGRpICcraXRlbXMucGFnZUNvdW50KCkrJyAnIH1cXHgyMj4gWCBkaSBZIDwvc3Bhbj4gIDxhIGhyZWY9XFx4MjJqYXZhc2NyaXB0OnZvaWQoMClcXHgyMiBkYXRhLWJpbmQ9XFx4MjJjbGljazogaXRlbXMubW92ZU5leHQsIGJ1dHRvbjogeyBkaXNhYmxlZDogaXRlbXMuY3VycmVudFBhZ2UoKSA9PSBpdGVtcy5wYWdlQ291bnQoKSwgaWNvbnM6IHsgcHJpbWFyeTogJ2ZhIGZhLWZvcndhcmQnIH0sIHRleHQ6IGZhbHNlIH1cXHgyMj5OZXh0PC9hPiAgPGEgaHJlZj1cXHgyMmphdmFzY3JpcHQ6dm9pZCgwKVxceDIyIGRhdGEtYmluZD1cXHgyMmNsaWNrOiBpdGVtcy5tb3ZlTGFzdCwgYnV0dG9uOiB7IGRpc2FibGVkOiBpdGVtcy5jdXJyZW50UGFnZSgpID09IGl0ZW1zLnBhZ2VDb3VudCgpLCBpY29uczogeyBwcmltYXJ5OiAnZmEgZmEtZmFzdC1mb3J3YXJkJyB9LCB0ZXh0OiBmYWxzZSB9XFx4MjI+TGFzdDwvYT48L2Rpdj48IS0tIC9rbyAtLT5cIik7XG50ZW1wbGF0ZVN5c3RlbS5hZGRUZW1wbGF0ZShcImltZy13eXNpd3lnXCIsIFwiPHRhYmxlIHRhYmZvY3VzPVxceDIyMFxceDIyIGNlbGxzcGFjaW5nPVxceDIyMFxceDIyIGNlbGxwYWRkaW5nPVxceDIyMFxceDIyIGRhdGEtZHJvcC1jb250ZW50PVxceDIyRHJvcCBoZXJlXFx4MjIgZGF0YS1iaW5kPVxceDIyc3R5bGU6IF9zdHlsZWJpbmQsIGNsaWNrOiBmdW5jdGlvbihvYmosIGV2dCkgeyAkcm9vdC5zZWxlY3RJdGVtKF9pdGVtLCBfZGF0YSk7IHJldHVybiB0cnVlOyB9LCBjbGlja0J1YmJsZTogZmFsc2UsIGZ1ZHJvcHBhYmxlOiB7IGFjdGl2ZUNsYXNzOiAndWktc3RhdGUtaGlnaGxpZ2h0JywgaG92ZXJDbGFzczogJ3VpLXN0YXRlLWRyYWdob3ZlcicgfSwgZHJvcHBhYmxlOiB7IG9wdGlvbnM6IHsgYWNjZXB0OiAnLmltYWdlJywgYWN0aXZlQ2xhc3M6ICd1aS1zdGF0ZS1oaWdobGlnaHQnLCBob3ZlckNsYXNzOiAndWktc3RhdGUtZHJhZ2hvdmVyJyB9LCBkYXRhOiBfc3JjLCBkcmFnZ2VkOiAkcm9vdC5maWxlVG9JbWFnZSB9LCBjc3M6IHsgc2VsZWN0ZWRpdGVtOiAkcm9vdC5pc1NlbGVjdGVkSXRlbShfaXRlbSkgfSwgc2Nyb2xsSW50b1ZpZXc6ICRyb290LmlzU2VsZWN0ZWRJdGVtKF9pdGVtKSwgYXR0cjogeyAnZGF0YS1kcm9wLWNvbnRlbnQnOiAkcm9vdC50KCdEcm9wIGhlcmUnKSwgd2lkdGg6IF93aWR0aCwgaGVpZ2h0OiBfaGVpZ2h0LCBhbGlnbjogX2FsaWduIH1cXHgyMiAgY2xhc3M9XFx4MjJpbWctd3lzaXd5ZyBzZWxlY3RhYmxlLWltZ1xceDIyIHN0eWxlPVxceDIyZGlzcGxheTogdGFibGU7XFx4MjI+PHRyPjx0ZCBjbGFzcz1cXHgyMnVwbG9hZHpvbmVcXHgyMj4gIDxkaXYgY2xhc3M9XFx4MjJtby1pbWdzZWxlY3Rpb25oZWxwZXJcXHgyMj48L2Rpdj4gIDxkaXYgY2xhc3M9XFx4MjJtby11cGxvYWR6b25lXFx4MjI+PC9kaXY+ICA8ZGl2IGNsYXNzPVxceDIyaW1nLXNpemVcXHgyMiBkYXRhLWJpbmQ9XFx4MjJ0ZXh0OiBfc2l6ZVxceDIyPnNpemU8L2Rpdj4gIDxkaXYgY2xhc3M9XFx4MjJtaWR0b29sc1xceDIyIGRhdGEtYmluZD1cXHgyMnRvb2x0aXBzOiB7fVxceDIyPiAgICA8IS0tIGtvIGlmOiBfc3JjKCkgIT0gJycgLS0+ICAgIDxkaXYgdGl0bGU9XFx4MjJSZW1vdmUgaW1hZ2VcXHgyMiBjbGFzcz1cXHgyMnRvb2wgZGVsZXRlXFx4MjIgZGF0YS1iaW5kPVxceDIyYXR0cjogeyB0aXRsZTogJHJvb3QudCgnUmVtb3ZlIGltYWdlJykgfSwgY2xpY2s6IF9zcmMuYmluZChfc3JjLCAnJyksIGNsaWNrQnViYmxlOiBmYWxzZVxceDIyPjxpIGNsYXNzPVxceDIyZmEgZmEtZncgZmEtdHJhc2gtb1xceDIyPjwvaT48L2Rpdj4gICAgPCEtLSBrbyBpZjogdHlwZW9mICRyb290LmVkaXRJbWFnZSAhPT0gJ3VuZGVmaW5lZCcgLS0+ICAgIDxkaXYgdGl0bGU9XFx4MjJPcGVuIHRoZSBpbWFnZSBlZGl0aW5nIHRvb2xcXHgyMiBjbGFzcz1cXHgyMnRvb2wgZWRpdFxceDIyIGRhdGEtYmluZD1cXHgyMmF0dHI6IHsgdGl0bGU6ICRyb290LnQoJ09wZW4gdGhlIGltYWdlIGVkaXRpbmcgdG9vbCcpIH0sIGNsaWNrOiAkcm9vdC5lZGl0SW1hZ2UuYmluZCgkZWxlbWVudCwgX3NyYyksIGNsaWNrQnViYmxlOiBmYWxzZVxceDIyPjxpIGNsYXNzPVxceDIyZmEgZmEtZncgZmEtcGVuY2lsXFx4MjI+PC9pPjwvZGl2PiAgICA8IS0tIC9rbyAtLT4gICAgPCEtLSAva28gLS0+ICAgIDwhLS0ga28gaWY6IF9zcmMoKSA9PSAnJyAtLT4gICAgPGRpdiB0aXRsZT1cXHgyMlVwbG9hZCBhIG5ldyBpbWFnZVxceDIyIGRhdGEtYmluZD1cXHgyMmF0dHI6IHsgdGl0bGU6ICRyb290LnQoJ1VwbG9hZCBhIG5ldyBpbWFnZScpIH1cXHgyMiBjbGFzcz1cXHgyMnRvb2wgdXBsb2FkXFx4MjIgc3R5bGU9XFx4MjJwb3NpdGlvbjogcmVsYXRpdmU7IG92ZXJmbG93OiBoaWRkZW47XFx4MjI+PGkgY2xhc3M9XFx4MjJmYSBmYS1mdyBmYS11cGxvYWRcXHgyMj48L2k+ICAgICAgPGlucHV0IGNsYXNzPVxceDIyZmlsZXVwbG9hZCBub2ZpbGVcXHgyMiB0eXBlPVxceDIyZmlsZVxceDIyIG5hbWU9XFx4MjJmaWxlc1tdXFx4MjIgZGF0YS1iaW5kPVxceDIyZmlsZXVwbG9hZDogeyBkYXRhOiBfc3JjLCBvbmVycm9yOiAkcm9vdC5ub3RpZmllci5lcnJvciwgb25maWxlOiAkcm9vdC5sb2FkSW1hZ2UsIGNhbnZhc1ByZXZpZXc6IHRydWUgfVxceDIyIHN0eWxlPVxceDIyei1pbmRleDogMjA7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyByaWdodDogMDsgYm90dG9tOiAwOyBtaW4td2lkdGg6IDEwMCU7IG1pbi1oZWlnaHQ6IDEwMCU7IGZvbnQtc2l6ZTogOTk5cHg7IHRleHQtYWxpZ246IHJpZ2h0OyBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7IG9wYWNpdHk6IDA7IG91dGxpbmU6IG5vbmU7IGN1cnNvcjogaW5oZXJpdDsgZGlzcGxheTogYmxvY2tcXHgyMj4gICAgPC9kaXY+ICAgIDwhLS0gL2tvIC0tPiAgPC9kaXY+ICA8IS0tIGtvIHRlbXBsYXRlOiBfdGVtcGxhdGUgLS0+PCEtLSAva28gLS0+ICA8IS0tIGtvIGlmOiBfc3JjKCkgPT0gJycgLS0+ICAgIDwhLS0gICAgPGltZyBzdHlsZT1cXHgyMmRpc3BsYXk6IGJsb2NrO1xceDIyIGNsYXNzPVxceDIyaW1ncGxhY2Vob2xkZXJcXHgyMiB3aWR0aD1cXHgyMjIwMFxceDIyIHNyYz1cXHgyMlxceDIyIGFsdD1cXHgyMkluc2VydCBhbiBpbWFnZSBoZXJlXFx4MjIgZGF0YS1iaW5kPVxceDIyd3lzaXd5Z1NyYzogeyBzcmM6IF9zcmMucHJlbG9hZGVkLCBwbGFjZWhvbGRlcjogX3BsYWNlaG9sZGVyc3JjLCB3aWR0aDogX3dpZHRoLCBoZWlnaHQ6IF9oZWlnaHQsIG1ldGhvZDogX21ldGhvZCB9XFx4MjIgLz4gICAgLS0+ICAgIDxzcGFuIGNsYXNzPVxceDIyZmlsZXVwbG9hZHRleHRcXHgyMiBzdHlsZT1cXHgyMnRleHQtYWxpZ246IGNlbnRlcjsgZGlzcGxheTogLW1zLWZsZXhib3g7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGZsZXgtYWxpZ246IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IHBhZGRpbmc6IDFlbTsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IGxlZnQ6IDA7IHJpZ2h0OiAwOyBib3R0b206IDA7XFx4MjI+PHNwYW4gY2xhc3M9XFx4MjJ0ZXh0TWlkZGxlXFx4MjIgc3R5bGU9XFx4MjIgdGV4dC1zaGFkb3c6IDFweCAxcHggMCAjRkZGRkZGLCAwIDAgMTBweCAjRkZGRkZGOyBmb250LXdlaWdodDogYm9sZDtcXHgyMiBkYXRhLWJpbmQ9XFx4MjJ0ZXh0OiAkcm9vdC50KCdEcm9wIGFuIGltYWdlIGhlcmUnKVxceDIyPkRyb3AgYW4gaW1hZ2UgaGVyZTwvc3Bhbj48L3NwYW4+ICA8IS0tIC9rbyAtLT4gIDwhLS0ga28gaWY6IF9zcmMoKSAhPSAnJyAtLT4gIDwhLS0gICAgPGltZyBzdHlsZT1cXHgyMmRpc3BsYXk6IGJsb2NrO1xceDIyIHdpZHRoPVxceDIyMjAwXFx4MjIgc3JjPVxceDIyXFx4MjIgZGF0YS1iaW5kPVxceDIycHJlbG9hZGVyOiBfc3JjLCB3eXNpd3lnU3JjOiB7IHNyYzogX3NyYy5wcmVsb2FkZWQsIHBsYWNlaG9sZGVyOiBfcGxhY2Vob2xkZXJzcmMsIHdpZHRoOiBfd2lkdGgsIGhlaWdodDogX2hlaWdodCwgbWV0aG9kOiBfbWV0aG9kIH1cXHgyMiAvPiAgICAtLT4gIDwhLS0gL2tvIC0tPiAgPCEtLSBwdWxzYW50ZSBwZXIgbGEgY2FuY2VsbGF6aW9uZSAtLT4gIDxkaXYgdGl0bGU9XFx4MjJEcm9wIGFuIGltYWdlIGhlcmUgb3IgY2xpY2sgdGhlIHVwbG9hZCBidXR0b25cXHgyMiBkYXRhLWJpbmQ9XFx4MjJhdHRyOiB7IHRpdGxlOiAkcm9vdC50KCdEcm9wIGFuIGltYWdlIGhlcmUgb3IgY2xpY2sgdGhlIHVwbG9hZCBidXR0b24nKSB9LCB0b29sdGlwczoge31cXHgyMiBjbGFzcz1cXHgyMndvcmt6b25lXFx4MjIgc3R5bGU9XFx4MjJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgcmlnaHQ6IDA7IGJvdHRvbTogMDsgb3ZlcmZsb3c6IGhpZGRlbjtcXHgyMj4gICAgPCEtLSBrbyBpZjogX3NyYy5wcmVsb2FkZWQgJiYgX3NyYygpICE9IF9zcmMucHJlbG9hZGVkKCkgLS0+UFJFTE9BRElORy4uLi48IS0tIC9rbyAtLT4gICAgPCEtLSBrbyBpZjogX3NyYygpICE9ICcnIC0tPiAgICAgIDxpbnB1dCBjbGFzcz1cXHgyMmZpbGV1cGxvYWQgd2l0aGZpbGVcXHgyMiB0eXBlPVxceDIyZmlsZVxceDIyIG5hbWU9XFx4MjJmaWxlc1tdXFx4MjIgZGF0YS1iaW5kPVxceDIyZmlsZXVwbG9hZDogeyBkYXRhOiBfc3JjLCBvbmVycm9yOiAkcm9vdC5ub3RpZmllci5lcnJvciwgb25maWxlOiAkcm9vdC5nYWxsZXJ5UmVjZW50LnVuc2hpZnQuYmluZCgkcm9vdC5nYWxsZXJ5UmVjZW50KSwgY2FudmFzUHJldmlldzogdHJ1ZSB9XFx4MjIgc3R5bGU9XFx4MjJ6LWluZGV4OiAtMjA7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyByaWdodDogMDsgYm90dG9tOiAwOyBtaW4td2lkdGg6IDEwMCU7IG1pbi1oZWlnaHQ6IDEwMCU7IGZvbnQtemllOiA5OTlweDsgdGV4dC1hbGlnbjogcmlnaHQ7IGZpbHRlcjogYWxwaGEob3BhY2l0eT0wKTsgb3BhY2l0eTogMDsgb3V0bGluZTogbm9uZTsgY3Vyc29yOiBpbmhlcml0OyBkaXNwbGF5OiBibG9ja1xceDIyPiAgICA8IS0tIC9rbyAtLT4gICAgPGRpdiBjbGFzcz1cXHgyMnByb2dyZXNzXFx4MjIgc3R5bGU9XFx4MjJvcGFjaXR5OiAuNTsgd2lkdGg6IDgwJTsgbWFyZ2luLWxlZnQ6IDEwJTsgcG9zaXRpb246IGFic29sdXRlOyBib3R0b206IDMwJTsgaGVpZ2h0OiAyMHB4OyBib3JkZXI6IDJweCBzb2xpZCBibGFjaztcXHgyMj4gICAgICA8ZGl2IGNsYXNzPVxceDIycHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1zdWNjZXNzXFx4MjIgc3R5bGU9XFx4MjJoZWlnaHQ6IDIwcHg7IGJhY2tncm91bmQtY29sb3I6IGJsYWNrOyBcXHgyMj48L2Rpdj4gICAgPC9kaXY+ICA8L2Rpdj48L3RhYmxlPlwiKTtcbnRlbXBsYXRlU3lzdGVtLmFkZFRlbXBsYXRlKFwibWFpblwiLCBcIjxkaXYgaWQ9XFx4MjJwYWdlXFx4MjIgc3R5bGU9XFx4MjJkaXNwbGF5OiBub25lO1xceDIyIGRhdGEtYmluZD1cXHgyMnZpc2libGU6IHRydWUsIGNzczogeyB3aXRoVG9vbGJveDogJHJvb3Quc2hvd1Rvb2xib3gsIHdpdGhQcmV2aWV3RnJhbWU6IHNob3dQcmV2aWV3RnJhbWUgfVxceDIyPiAgPGRpdiBpZD1cXHgyMm1haW4tZWRpdC1hcmVhXFx4MjIgZGF0YS1iaW5kPVxceDIyY2xpY2s6IGZ1bmN0aW9uKG9iaiwgZXZ0KSB7ICRyb290LnNlbGVjdEJsb2NrKG51bGwpOyByZXR1cm4gdHJ1ZTsgfSwgY2xpY2tCdWJibGU6IGZhbHNlXFx4MjI+ICAgIDwhLS0ga28gd2l0aFByb3BlcnRpZXM6IHsgdGVtcGxhdGVNb2RlOiAnd3lzaXd5ZycsIHRlbXBsYXRlTW9kZUZhbGxiYWNrOiAnc2hvdycgfSAtLT4gICAgPGRpdiBpZD1cXHgyMm1haW4td3lzaXd5Zy1hcmVhXFx4MjIgZGF0YS1iaW5kPVxceDIyd3lzaXd5Z1Njcm9sbGZpeDogdHJ1ZSwgc2Nyb2xsYWJsZTogdHJ1ZSwgZnVkcm9wcGFibGU6IHsgYWN0aXZlOiBkcmFnZ2luZ0ltYWdlIH0sIGNzczogeyBpc2RyYWdnaW5nOiBkcmFnZ2luZywgaXNkcmFnZ2luZ2ltZzogZHJhZ2dpbmdJbWFnZSB9LCBibG9jazogY29udGVudFxceDIyPjwvZGl2PiAgICA8IS0tIC9rbyAtLT4gIDwvZGl2PiAgPGRpdiBpZD1cXHgyMnRvb2xiYXJcXHgyMiBjbGFzcz1cXHgyMm1vXFx4MjIgZGF0YS1iaW5kPVxceDIydG9vbHRpcHM6IHt9XFx4MjI+ICAgIDwhLS0ga28gaWY6IHR5cGVvZiAkcm9vdC51bmRvICE9ICd1bmRlZmluZWQnIC0tPiAgICA8c3BhbiBkYXRhLWJpbmQ9XFx4MjJidXR0b25zZXQ6IHsgfVxceDIyIGNsYXNzPVxceDIybGVmdEJ1dHRvbnNcXHgyMj4gICAgPGEgdGl0bGU9XFx4MjJVbmRvIGxhc3Qgb3BlcmF0aW9uXFx4MjIgaHJlZj1cXHgyMmphdmFzY3JpcHQ6dm9pZCgwKVxceDIyIGRhdGEtYmluZD1cXHgyMmF0dHI6IHsgdGl0bGU6ICRyb290LnQoJ1VuZG8gbGFzdCBvcGVyYXRpb24nKSB9LCBjbGljazogJHJvb3QudW5kby5leGVjdXRlLCBjbGlja0J1YmJsZTogZmFsc2UsIGJ1dHRvbjogeyBkaXNhYmxlZDogISRyb290LnVuZG8uZW5hYmxlZCgpLCBpY29uczogeyBwcmltYXJ5OiAnZmEgZmEtcmVwbHknIH0sIGxhYmVsOiAkcm9vdC51bmRvLm5hbWUsIHRleHQ6IHRydWUgfVxceDIyPlVORE88L2E+ICAgIDxhIHRpdGxlPVxceDIyUmVkbyBsYXN0IG9wZXJhdGlvblxceDIyIGhyZWY9XFx4MjJqYXZhc2NyaXB0OnZvaWQoMClcXHgyMiBkYXRhLWJpbmQ9XFx4MjJhdHRyOiB7IHRpdGxlOiAkcm9vdC50KCdSZWRvIGxhc3Qgb3BlcmF0aW9uJykgfSwgY2xpY2s6ICRyb290LnJlZG8uZXhlY3V0ZSwgY2xpY2tCdWJibGU6IGZhbHNlLCBidXR0b246IHsgZGlzYWJsZWQ6ICEkcm9vdC5yZWRvLmVuYWJsZWQoKSwgaWNvbnM6IHsgcHJpbWFyeTogJ2ZhIGZhLXNoYXJlJyB9LCBsYWJlbDogJHJvb3QucmVkby5uYW1lLCB0ZXh0OiB0cnVlIH1cXHgyMj5SRURPPC9hPiAgICA8L3NwYW4+ICAgIDwhLS0ga28gaWY6ICRyb290LmRlYnVnIC0tPiAgICA8YSBocmVmPVxceDIyamF2YXNjcmlwdDp2b2lkKDApXFx4MjIgZGF0YS1iaW5kPVxceDIyY2xpY2s6ICRyb290LnVuZG9SZXNldCwgY2xpY2tCdWJibGU6IGZhbHNlLCBidXR0b246IHsgZGlzYWJsZWQ6ICEkcm9vdC51bmRvLmVuYWJsZWQoKSAmJiAhJHJvb3QucmVkby5lbmFibGVkKCksIGxhYmVsOiAncmVzZXQnLCB0ZXh0OiB0cnVlIH1cXHgyMj5SRVNFVDwvYT4gICAgPCEtLSAva28gLS0+ICAgIDwhLS0gL2tvIC0tPiAgICA8c3Bhbj4gICAgPGlucHV0IGlkPVxceDIyc2hvd0dhbGxlcnlcXHgyMiB0eXBlPVxceDIyY2hlY2tib3hcXHgyMiBkYXRhLWJpbmQ9XFx4MjJjaGVja2VkOiAkcm9vdC5zaG93R2FsbGVyeSwgYnV0dG9uOiB7IHJlZnJlc2hPbjogJHJvb3Quc2hvd0dhbGxlcnksICAgICBpY29uczogeyBwcmltYXJ5OiAnZmEgZmEtZncgZmEtcGljdHVyZS1vJywgc2Vjb25kYXJ5OiBudWxsIH0sIHRleHQ6IHRydWUsIGxhYmVsOiAkcm9vdC50KCdHYWxsZXJ5JykgfVxceDIyPjxsYWJlbCB0aXRsZT1cXHgyMlNob3cgaW1hZ2UgZ2FsbGVyeVxceDIyIGZvcj1cXHgyMnNob3dHYWxsZXJ5XFx4MjIgZGF0YS1iaW5kPVxceDIyYXR0cjogeyB0aXRsZTogJHJvb3QudCgnU2hvdyBpbWFnZSBnYWxsZXJ5JykgfVxceDIyPnNob3cgZ2FsbGVyeTwvbGFiZWw+PC9pbnB1dD4gICAgPC9zcGFuPiAgICA8aW5wdXQgaWQ9XFx4MjJwcmV2aWV3RnJhbWVUb2dnbGVcXHgyMiB0eXBlPVxceDIyY2hlY2tib3hcXHgyMiBkYXRhLWJpbmQ9XFx4MjJjaGVja2VkOiAkcm9vdC5zaG93UHJldmlld0ZyYW1lLCBidXR0b246IHsgcmVmcmVzaE9uOiAkcm9vdC5zaG93UHJldmlld0ZyYW1lLCBpY29uczogeyBwcmltYXJ5OiAnZmEgZmEtZncgZmEtdGFibGV0Jywgc2Vjb25kYXJ5OiBudWxsIH0sIHRleHQ6IGZhbHNlLCBsYWJlbDogJHJvb3QudCgnUHJldmlldycpIH1cXHgyMj48bGFiZWwgdGl0bGU9XFx4MjJTaG93IGxpdmUgcHJldmlld1xceDIyIGZvcj1cXHgyMnByZXZpZXdGcmFtZVRvZ2dsZVxceDIyIGRhdGEtYmluZD1cXHgyMmF0dHI6IHsgdGl0bGU6ICRyb290LnQoJ1Nob3cgbGl2ZSBwcmV2aWV3JykgfVxceDIyPlBSRVZJRVc8L2xhYmVsPjwvaW5wdXQ+ICAgIDwhLS0ga28gaWY6ICRyb290LmRlYnVnIC0tPiAgICA8YSBocmVmPVxceDIyamF2YXNjcmlwdDp2b2lkKDApXFx4MjIgZGF0YS1iaW5kPVxceDIyY2xpY2s6ICRyb290LmV4cG9ydCwgY2xpY2tCdWJibGU6IGZhbHNlLCBidXR0b246IHsgbGFiZWw6ICdleHBvcnQnLCB0ZXh0OiB0cnVlIH1cXHgyMj5FWFBPUlQ8L2E+ICAgIDxpbnB1dCB0eXBlPVxceDIyY2hlY2tib3hcXHgyMiBkYXRhLWJpbmQ9XFx4MjJjaGVja2VkOiAkcm9vdC5kZWJ1Z1xceDIyIC8+IGRlYnVnICAgIDxhIGhyZWY9XFx4MjJqYXZhc2NyaXB0OnZvaWQoMClcXHgyMiBkYXRhLWJpbmQ9XFx4MjJjbGljazogJHJvb3QubG9hZERlZmF1bHRCbG9ja3MsIGNsaWNrQnViYmxlOiBmYWxzZSwgYnV0dG9uOiB7IGljb25zOiB7IHByaW1hcnk6ICdmYSBmYS1mdyBmYS11cGxvYWQnIH0sIGxhYmVsOiAnRGVmYXVsdCcsIHRleHQ6IHRydWUgfVxceDIyPkxPQUQgQkxPQ0tTPC9hPiAgICBbPGEgaWQ9XFx4MjJzdWJzY3JpcHRpb25zQ291bnRcXHgyMiBocmVmPVxceDIyamF2YXNjcmlwdDp2aWV3TW9kZWwubG9vcFN1YnNjcmlwdGlvbnNDb3VudCgpXFx4MjI+c3ViczwvYT5dICAgIDwhLS0gL2tvIC0tPiAgICA8c3BhbiBkYXRhLWJpbmQ9XFx4MjJ2aXNpYmxlOiBmYWxzZVxceDIyPiAgICA8aW5wdXQgdHlwZT1cXHgyMmNoZWNrYm94XFx4MjIgZGF0YS1iaW5kPVxceDIyY2hlY2tlZDogJHJvb3Quc2hvd1Rvb2xib3hcXHgyMiAvPiB0b29sYm94ICAgIDwvc3Bhbj4gICAgPGRpdiBjbGFzcz1cXHgyMnJpZ2h0QnV0dG9uc1xceDIyPiAgICA8IS0tIGtvIGlmOiB0eXBlb2YgJHJvb3Quc2F2ZSAhPT0gJ3VuZGVmaW5lZCcgLS0+ICAgIDxhIHRpdGxlPVxceDIyU2F2ZSB0ZW1wbGF0ZVxceDIyIGhyZWY9XFx4MjJqYXZhc2NyaXB0OnZvaWQoMClcXHgyMiBkYXRhLWJpbmQ9XFx4MjJhdHRyOiB7IHRpdGxlOiAkcm9vdC50KCdTYXZlIHRlbXBsYXRlJykgfSwgY2xpY2s6ICRyb290LnNhdmUuZXhlY3V0ZSwgY2xpY2tCdWJibGU6IGZhbHNlLCBidXR0b246IHsgZGlzYWJsZWQ6ICEkcm9vdC5zYXZlLmVuYWJsZWQoKSwgaWNvbnM6IHsgcHJpbWFyeTogJ2ZhIGZhLWZ3IGZhLWNsb3VkLXVwbG9hZCcgfSwgbGFiZWw6ICRyb290LnQoJHJvb3Quc2F2ZS5uYW1lKSwgdGV4dDogdHJ1ZSB9XFx4MjI+U0FMVkE8L2E+ICAgIDwhLS0gL2tvIC0tPiAgICA8IS0tIGtvIGlmOiB0eXBlb2YgJHJvb3QudGVzdCAhPT0gJ3VuZGVmaW5lZCcgLS0+ICAgIDxhIHRpdGxlPVxceDIyU2hvdyBwcmV2aWV3IGFuZCBzZW5kIHRlc3RcXHgyMiBocmVmPVxceDIyamF2YXNjcmlwdDp2b2lkKDApXFx4MjIgZGF0YS1iaW5kPVxceDIyYXR0cjogeyB0aXRsZTogJHJvb3QudCgnU2hvdyBwcmV2aWV3IGFuZCBzZW5kIHRlc3QnKSB9LCBjbGljazogJHJvb3QudGVzdC5leGVjdXRlLCBjbGlja0J1YmJsZTogZmFsc2UsIGJ1dHRvbjogeyBkaXNhYmxlZDogISRyb290LnRlc3QuZW5hYmxlZCgpLCBpY29uczogeyBwcmltYXJ5OiAnZmEgZmEtZncgZmEtcGFwZXItcGxhbmUnIH0sIGxhYmVsOiAkcm9vdC50KCRyb290LnRlc3QubmFtZSksIHRleHQ6IHRydWUgfVxceDIyPlRFU1Q8L2E+ICAgIDwhLS0gL2tvIC0tPiAgICA8IS0tIGtvIGlmOiB0eXBlb2YgJHJvb3QuZG93bmxvYWQgIT09ICd1bmRlZmluZWQnIC0tPiAgICA8Zm9ybSBpZD1cXHgyMmRvd25sb2FkRm9ybVxceDIyIGFjdGlvbj1cXHgyMiNcXHgyMiBtZXRob2Q9XFx4MjJQT1NUXFx4MjI+ICAgIDxpbnB1dCB0eXBlPVxceDIyaGlkZGVuXFx4MjIgbmFtZT1cXHgyMmFjdGlvblxceDIyIHZhbHVlPVxceDIyZG93bmxvYWRcXHgyMiAvPiAgICA8aW5wdXQgdHlwZT1cXHgyMmhpZGRlblxceDIyIG5hbWU9XFx4MjJmaWxlbmFtZVxceDIyIHZhbHVlPVxceDIyZW1haWwuaHRtbFxceDIyIC8+ICAgIDxpbnB1dCB0eXBlPVxceDIyaGlkZGVuXFx4MjIgbmFtZT1cXHgyMmh0bWxcXHgyMiBpZD1cXHgyMmRvd25sb2FkSHRtbFRleHRhcmVhXFx4MjIgLz4gICAgPGEgdGl0bGU9XFx4MjJEb3dubG9hZCB0ZW1wbGF0ZVxceDIyIGhyZWY9XFx4MjJqYXZhc2NyaXB0OnZvaWQoMClcXHgyMiBkYXRhLWJpbmQ9XFx4MjJhdHRyOiB7IHRpdGxlOiAkcm9vdC50KCdEb3dubG9hZCB0ZW1wbGF0ZScpIH0sIGNsaWNrOiAkcm9vdC5kb3dubG9hZC5leGVjdXRlLCBjbGlja0J1YmJsZTogZmFsc2UsIGJ1dHRvbjogeyBkaXNhYmxlZDogISRyb290LmRvd25sb2FkLmVuYWJsZWQoKSwgaWNvbnM6IHsgcHJpbWFyeTogJ2ZhIGZhLWZ3IGZhLWRvd25sb2FkJyB9LCBsYWJlbDogJHJvb3QudCgkcm9vdC5kb3dubG9hZC5uYW1lKSwgdGV4dDogdHJ1ZSB9XFx4MjI+RE9XTkxPQUQ8L2E+ICAgIDwvZm9ybT4gICAgPCEtLSAva28gLS0+ICAgIDwvZGl2PiAgPC9kaXY+ICA8IS0tIGtvIGlmOiAkcm9vdC5zaG93VG9vbGJveCAtLT4gIDxkaXYgaWQ9XFx4MjJtYWluLXRvb2xib3hcXHgyMiBjbGFzcz1cXHgyMm1vXFx4MjIgZGF0YS1iaW5kPVxceDIyc2Nyb2xsYWJsZTogdHJ1ZSwgd2l0aFByb3BlcnRpZXM6IHsgdGVtcGxhdGVNb2RlOiAnZWRpdCcgfVxceDIyPiAgICA8ZGl2IGRhdGEtYmluZD1cXHgyMnRlbXBsYXRlOiB7IG5hbWU6ICd0b29sYm94JyB9XFx4MjI+PC9kaXY+ICA8L2Rpdj4gIDwhLS0gL2tvIC0tPiAgICA8ZGl2IGlkPVxceDIybWFpbi1wcmV2aWV3XFx4MjIgY2xhc3M9XFx4MjJtb1xceDIyIGRhdGEtYmluZD1cXHgyMnNjcm9sbGFibGU6IHRydWUsIGlmOiAkcm9vdC5zaG93UHJldmlld0ZyYW1lXFx4MjI+ICAgIDxkaXYgaWQ9XFx4MjJwcmV2aWV3LXRvb2xiYXJcXHgyMj4gICAgICA8ZGl2IGRhdGEtYmluZD1cXHgyMnZpc2libGU6ICRyb290LnNob3dQcmV2aWV3RnJhbWUsIGJ1dHRvbnNldDogeyB9XFx4MjIgc3R5bGU9XFx4MjJkaXNwbGF5OiBpbmxpbmUtYmxvY2tcXHgyMj4gICAgICAgIDxpbnB1dCBpZD1cXHgyMnByZXZpZXdMYXJnZVxceDIyIHR5cGU9XFx4MjJyYWRpb1xceDIyIG5hbWU9XFx4MjJwcmV2aWV3TW9kZVxceDIyIHZhbHVlPVxceDIybGFyZ2VcXHgyMiBkYXRhLWJpbmQ9XFx4MjJjaGVja2VkOiAkcm9vdC5wcmV2aWV3TW9kZSwgYnV0dG9uOiB7IHRleHQ6IGZhbHNlLCBsYWJlbDogJ2xhcmdlJywgaWNvbnM6IHsgcHJpbWFyeTogJ2ZhIGZhLWZ3IGZhLWRlc2t0b3AnIH0gfVxceDIyIC8+ICAgICAgICA8bGFiZWwgZm9yPVxceDIycHJldmlld0xhcmdlXFx4MjIgdGl0bGU9XFx4MjJMYXJnZSBzY3JlZW5cXHgyMiBkYXRhLWJpbmQ9XFx4MjJhdHRyOiB7IHRpdGxlOiAkcm9vdC50KCdMYXJnZSBzY3JlZW4nKSB9XFx4MjI+TGFyZ2Ugc2NyZWVuPC9sYWJlbD4gICAgICAgIDxpbnB1dCBpZD1cXHgyMnByZXZpZXdEZXNrdG9wXFx4MjIgdHlwZT1cXHgyMnJhZGlvXFx4MjIgbmFtZT1cXHgyMnByZXZpZXdNb2RlXFx4MjIgdmFsdWU9XFx4MjJkZXNrdG9wXFx4MjIgZGF0YS1iaW5kPVxceDIyY2hlY2tlZDogJHJvb3QucHJldmlld01vZGUsIGJ1dHRvbjogeyB0ZXh0OiBmYWxzZSwgbGFiZWw6ICdkZXNrdG9wJywgaWNvbnM6IHsgcHJpbWFyeTogJ2ZhIGZhLWZ3IGZhLXRhYmxldCcgfSB9XFx4MjIgLz4gICAgICAgIDxsYWJlbCBmb3I9XFx4MjJwcmV2aWV3RGVza3RvcFxceDIyIHRpdGxlPVxceDIyVGFibGV0XFx4MjIgZGF0YS1iaW5kPVxceDIyYXR0cjogeyB0aXRsZTogJHJvb3QudCgnVGFibGV0JykgfVxceDIyPlRhYmxldDwvbGFiZWw+ICAgICAgICA8aW5wdXQgaWQ9XFx4MjJwcmV2aWV3TW9iaWxlXFx4MjIgdHlwZT1cXHgyMnJhZGlvXFx4MjIgbmFtZT1cXHgyMnByZXZpZXdNb2RlXFx4MjIgdmFsdWU9XFx4MjJtb2JpbGVcXHgyMiBkYXRhLWJpbmQ9XFx4MjJjaGVja2VkOiAkcm9vdC5wcmV2aWV3TW9kZSwgYnV0dG9uOiB7IHRleHQ6IGZhbHNlLCBsYWJlbDogJ21vYmlsZScsIGljb25zOiB7IHByaW1hcnk6ICdmYSBmYS1mdyBmYS1tb2JpbGUnIH0gfVxceDIyIC8+ICAgICAgICA8bGFiZWwgZm9yPVxceDIycHJldmlld01vYmlsZVxceDIyIHRpdGxlPVxceDIyU21hcnRwaG9uZVxceDIyIGRhdGEtYmluZD1cXHgyMmF0dHI6IHsgdGl0bGU6ICRyb290LnQoJ1NtYXJ0cGhvbmUnKSB9XFx4MjI+U21hcnRwaG9uZTwvbGFiZWw+ICAgICAgPC9kaXY+ICAgIDwvZGl2PiAgICA8ZGl2IGlkPVxceDIyZnJhbWUtY29udGFpbmVyXFx4MjIgZGF0YS1iaW5kPVxceDIyY3NzOiB7IGRlc2t0b3A6ICRyb290LnByZXZpZXdNb2RlKCkgPT0gJ2Rlc2t0b3AnLCBtb2JpbGU6ICRyb290LnByZXZpZXdNb2RlKCkgPT0gJ21vYmlsZScsIGxhcmdlOiAkcm9vdC5wcmV2aWV3TW9kZSgpID09ICdsYXJnZScgfVxceDIyPiAgICAgIDxpZnJhbWUgZGF0YS1iaW5kPVxceDIyYmluZElmcmFtZTogJGRhdGFcXHgyMj48L2lmcmFtZT4gICAgPC9kaXY+ICA8L2Rpdj4gIDxkaXYgY2xhc3M9XFx4MjJtb1xceDIyIGlkPVxceDIybW8tYm9keVxceDIyPjwvZGl2PiAgPCEtLSBUT0RPIFJFTU9WRSBNRSAgPGRpdiBpZD1cXHgyMmluY29tcGF0aWJsZS1icm93c2VyXFx4MjIgdGl0bGU9XFx4MjJVbnN1cHBvcnRlZCBicm93c2VyXFx4MjIgc3R5bGU9XFx4MjJkaXNwbGF5OiBub25lXFx4MjIgZGF0YS1iaW5kPVxceDIyYXR0cjogeyB0aXRsZTogJHJvb3QudCgnVXN1cHBvcnRlZCBicm93c2VyJykgfSwgaHRtbDogJzxwPllvdXIgYnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkLjwvcD48cD5Vc2UgYSBkaWZmZXJlbnQgYnJvd3NlciBvciB0cnkgdXBkYXJpbmcgeW91ciBicm93c2VyLjwvcD48cD5TdXBwb3J0ZWQgYnJvd3NlcnM6IDx1bD48bGk+SW50ZXJuZXQgRXhwbG9yZXIgJmd0Oz0gMTA8L2xpPjxsaT5Hb29nbGUgQ2hyb21lICZndDs9IDMwPC9saT48bGk+QXBwbGUgU2FmYXJpICZndDs9IDU8L2xpPjxsaT5Nb3ppbGxhIEZpcmVmaXggJmd0Oz0gMjA8L2xpPjwvdWw+PC9wPidcXHgyMj4gICAgVW5zdXBwb3J0ZWQgYnJvd3NlciAgPC9kaXY+ICAtLT4gIDxkaXYgaWQ9XFx4MjJpbmNvbXBhdGlibGUtdGVtcGxhdGVcXHgyMiB0aXRsZT1cXHgyMlNhdmVkIG1vZGVsIGlzIG9ic29sZXRlXFx4MjIgc3R5bGU9XFx4MjJkaXNwbGF5OiBub25lXFx4MjIgZGF0YS1iaW5kPVxceDIyYXR0cjogeyB0aXRsZTogJHJvb3QudCgnU2F2ZWQgbW9kZWwgaXMgb2Jzb2xldGUnKSB9LCBodG1sOiAkcm9vdC50KCc8cD5UaGUgc2F2ZWQgbW9kZWwgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIGEgcHJldmlvdXMsIG5vbiBjb21wbGV0ZWx5IGNvbXBhdGlibGUgdmVyc2lvbiwgb2YgdGhlIHRlbXBsYXRlPC9wPjxwPlNvbWUgY29udGVudCBvciBzdHlsZSBpbiB0aGUgbW9kZWwgPGI+Q09VTEQgQkUgTE9TVDwvYj4gaWYgeW91IHdpbGwgPGI+c2F2ZTwvYj48L3A+PHA+Q29udGFjdCB1cyBmb3IgbW9yZSBpbmZvcm1hdGlvbnMhPC9wPicpXFx4MjI+ICAgIEluY29tcGF0aWJsZSB0ZW1wbGF0ZSAgPC9kaXY+ICA8ZGl2IGlkPVxceDIyZmFrZS1pbWFnZS1lZGl0b3JcXHgyMiB0aXRsZT1cXHgyMkZha2UgaW1hZ2UgZWRpdG9yXFx4MjIgc3R5bGU9XFx4MjJkaXNwbGF5OiBub25lXFx4MjIgZGF0YS1iaW5kPVxceDIyYXR0cjogeyB0aXRsZTogJHJvb3QudCgnRmFrZSBpbWFnZSBlZGl0b3InKSB9LCBodG1sOiAkcm9vdC50KCc8cD5GYWtlIGltYWdlIGVkaXRvcjwvcD4nKVxceDIyPiAgICA8cD5GYWtlIGltYWdlIGVkaXRvcjwvcD4gIDwvZGl2PjwvZGl2PjwhLS0ga28gaWY6ICRyb290LmxvZ29QYXRoIC0tPjxkaXYgaWQ9XFx4MjJsb2FkaW5nXFx4MjIgY2xhc3M9XFx4MjJsb2FkaW5nXFx4MjIgc3R5bGU9XFx4MjJkaXNwbGF5OiBibG9jazsgd2lkdGg6IDMwMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGhlaWdodDogMzJweDsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6MDsgYm90dG9tOiAwOyBsZWZ0OiAwOyByaWdodDogMDsgIG1hcmdpbjogYXV0bztcXHgyMiBkYXRhLWJpbmQ9XFx4MjJhdHRyOiB7IHN0eWxlOiAncG9zaXRpb246IGFic29sdXRlOyB0b3A6IDVweDsgbGVmdDogNnB4OyB6LWluZGV4OiAxNTA7J30sIGNzczogeyBsb2FkaW5nOiBmYWxzZSB9XFx4MjI+ICA8YSBocmVmPVxceDIyL1xceDIyIGRhdGEtYmluZD1cXHgyMmF0dHI6IHsgaHJlZjogJHJvb3QubG9nb1VybCwgYWx0OiAkcm9vdC5sb2dvQWx0IH1cXHgyMj48aW1nIGRhdGEtYmluZD1cXHgyMmF0dHI6IHsgc3JjOiAkcm9vdC5sb2dvUGF0aCB9XFx4MjIgd2lkdGg9XFx4MjIzMlxceDIyIGhlaWdodD1cXHgyMjMyXFx4MjIgYWx0PVxceDIybW9zYWljb1xceDIyIGJvcmRlcj1cXHgyMjBcXHgyMiAvPjwvYT4gIDxkaXYgc3R5bGU9XFx4MjJvcGFjaXR5OiAwXFx4MjIgZGF0YS1iaW5kPVxceDIydmlzaWJsZTogZmFsc2VcXHgyMj5PcHBwcy4uLiAhITwvZGl2PjwvZGl2PjwhLS0gL2tvIC0tPlwiKTtcbnRlbXBsYXRlU3lzdGVtLmFkZFRlbXBsYXRlKFwidG9vbGJveFwiLCBcIjxkaXYgaWQ9XFx4MjJ0b29sdGFic1xceDIyIGNsYXNzPVxceDIydGFic19ob3Jpem9udGFsIGJ1dHRvbl9jb2xvclxceDIyIGRhdGEtYmluZD1cXHgyMnRhYnM6IHsgYWN0aXZlOiAkcm9vdC5zZWxlY3RlZFRvb2wgfVxceDIyPiAgPHVsPiAgICA8bGkgZGF0YS1iaW5kPVxceDIydG9vbHRpcHM6IHt9XFx4MjI+PGEgdGl0bGU9XFx4MjJCbG9ja3MgcmVhZHkgdG8gYmUgYWRkZWQgdG8gdGhlIHRlbXBsYXRlXFx4MjIgZGF0YS1sb2NhbD1cXHgyMnRydWVcXHgyMiBocmVmPVxceDIyI3Rvb2xibG9ja3NcXHgyMiBkYXRhLWJpbmQ9XFx4MjJhdHRyOiB7IHRpdGxlOiAkcm9vdC50KCdCbG9ja3MgcmVhZHkgdG8gYmUgYWRkZWQgdG8gdGhlIHRlbXBsYXRlJykgfVxceDIyPjxpIGNsYXNzPVxceDIyZmEgZmEtZncgZmEtY3ViZXNcXHgyMj48L2k+IDxzcGFuIGRhdGEtYmluZD1cXHgyMmh0bWw6ICRyb290LnQoJ0Jsb2NrcycpXFx4MjI+QmxvY2tzPC9zcGFuPjwvYT48L2xpPiAgICA8bGkgZGF0YS1iaW5kPVxceDIydG9vbHRpcHM6IHt9XFx4MjI+PGEgdGl0bGU9XFx4MjJFZGl0IGNvbnRlbnQgb3B0aW9uc1xceDIyIGhyZWY9XFx4MjIjdG9vbGNvbnRlbnRzXFx4MjIgZGF0YS1sb2NhbD1cXHgyMnRydWVcXHgyMiBkYXRhLWJpbmQ9XFx4MjJhdHRyOiB7IHRpdGxlOiAkcm9vdC50KCdFZGl0IGNvbnRlbnQgb3B0aW9ucycpIH1cXHgyMj48aSBjbGFzcz1cXHgyMmZhIGZhLWZ3IGZhLXBlbmNpbFxceDIyPjwvaT4gPHNwYW4gZGF0YS1iaW5kPVxceDIyaHRtbDogJHJvb3QudCgnQ29udGVudCcpXFx4MjI+Q29udGVudDwvc3Bhbj48L2E+PC9saT4gICAgPGxpIGRhdGEtYmluZD1cXHgyMnRvb2x0aXBzOiB7fVxceDIyPjxhIHRpdGxlPVxceDIyRWRpdCBzdHlsZSBvcHRpb25zXFx4MjIgaHJlZj1cXHgyMiN0b29sc3R5bGVzXFx4MjIgZGF0YS1sb2NhbD1cXHgyMnRydWVcXHgyMiBkYXRhLWJpbmQ9XFx4MjJhdHRyOiB7IHRpdGxlOiAkcm9vdC50KCdFZGl0IHN0eWxlIG9wdGlvbnMnKSB9XFx4MjI+PGkgY2xhc3M9XFx4MjJmYSBmYS1mdyBmYS1wYWludC1icnVzaFxceDIyPjwvaT4gPHNwYW4gZGF0YS1iaW5kPVxceDIyaHRtbDogJHJvb3QudCgnU3R5bGUnKVxceDIyPlN0eWxlPC9zcGFuPjwvYT48L2xpPiAgPC91bD4gIDxkaXYgaWQ9XFx4MjJ0b29sYmxvY2tzXFx4MjIgZGF0YS1iaW5kPVxceDIyc2Nyb2xsYWJsZTogdHJ1ZVxceDIyPiAgICA8ZGl2IGNsYXNzPVxceDIyYmxvY2stbGlzdFxceDIyIGRhdGEtYmluZD1cXHgyMmZvcmVhY2g6IGJsb2NrRGVmc1xceDIyIHN0eWxlPVxceDIydGV4dC1hbGlnbjogY2VudGVyXFx4MjI+ICAgICAgPGRpdiBjbGFzcz1cXHgyMmRyYWdnYWJsZS1pdGVtXFx4MjIgZGF0YS1iaW5kPVxceDIyd2l0aFByb3BlcnRpZXM6IHsgdGVtcGxhdGVNb2RlOiAnc2hvdycgfVxceDIyPiAgICAgICAgPGRpdiBjbGFzcz1cXHgyMmJsb2NrXFx4MjIgZGF0YS1iaW5kPVxceDIyZXh0ZHJhZ2dhYmxlOiB7IGNvbm5lY3RDbGFzczogJ3NvcnRhYmxlLWJsb2Nrcy1lZGl0JywgZGF0YTogJGRhdGEsIGRyb3BDb250YWluZXI6ICcjbWFpbi13eXNpd3lnLWFyZWEnLCBkcmFnZ2luZzogJHJvb3QuZHJhZ2dpbmcsICdvcHRpb25zJzogeyBoYW5kbGU6ICcuaGFuZGxlJywgZGlzdGFuY2U6IDEwLCAnYXBwZW5kVG8nOiAnI3BhZ2UnIH0gfSwgY2xpY2s6ICRyb290LmFkZEJsb2NrXFx4MjIgc3R5bGU9XFx4MjJwb3NpdGlvbjogcmVsYXRpdmU7XFx4MjI+ICAgICAgICAgIDxkaXYgdGl0bGU9XFx4MjJDbGljayBvciBkcmFnIHRvIGFkZCB0aGlzIGJsb2NrIHRvIHRoZSB0ZW1wbGF0ZVxceDIyIGNsYXNzPVxceDIyaGFuZGxlXFx4MjIgZGF0YS1iaW5kPVxceDIyYXR0cjogeyB0aXRsZTogJHJvb3QudCgnQ2xpY2sgb3IgZHJhZyB0byBhZGQgdGhpcyBibG9jayB0byB0aGUgdGVtcGxhdGUnKSB9LCB0b29sdGlwczoge31cXHgyMj48L2Rpdj4gICAgICAgICAgPGltZyBkYXRhLWJpbmQ9XFx4MjJhdHRyOiB7IGFsdDogJHJvb3QudCgnQmxvY2sgX19uYW1lX18nLCB7IG5hbWU6IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodHlwZSkgfSksIHNyYzogJHJvb3QudGVtcGxhdGVQYXRoKCdlZHJlcy8nK2tvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodHlwZSkrJy5wbmcnKSB9XFx4MjIgYWx0PVxceDIyQmxvY2sgX19uYW1lX19cXHgyMiAvPiAgICAgICAgPC9kaXY+ICAgICAgICA8YSBocmVmPVxceDIyamF2YXNjcmlwdDp2b2lkKDApXFx4MjIgY2xhc3M9XFx4MjJhZGRibG9ja2J1dHRvblxceDIyIGRhdGEtYmluZD1cXHgyMmNsaWNrOiAkcm9vdC5hZGRCbG9jaywgYnV0dG9uOiB7IGxhYmVsOiAkcm9vdC50KCdBZGQnKSB9XFx4MjI+QWRkPC9hPiAgICAgIDwvZGl2PiAgICA8L2Rpdj4gIDwvZGl2PiAgPGRpdiBpZD1cXHgyMnRvb2xjb250ZW50c1xceDIyIGRhdGEtYmluZD1cXHgyMnNjcm9sbGFibGU6IHRydWVcXHgyMj4gICAgPCEtLSBrbyBpZjogJHJvb3Quc2VsZWN0ZWRCbG9jaygpICE9PSBudWxsIC0tPiAgICA8ZGl2IGRhdGEtYmluZD1cXHgyMmJsb2NrOiAkcm9vdC5zZWxlY3RlZEJsb2NrXFx4MjI+PC9kaXY+ICAgIDwhLS0gL2tvIC0tPiAgICA8IS0tIGtvIGlmOiAkcm9vdC5zZWxlY3RlZEJsb2NrKCkgPT0gbnVsbCAtLT4gICAgPGRpdiBjbGFzcz1cXHgyMm5vU2VsZWN0ZWRCbG9ja1xceDIyIGRhdGEtYmluZD1cXHgyMnRleHQ6ICRyb290LnQoJ0J5IGNsaWNraW5nIG9uIG1lc3NhZ2UgcGFydHMgeW91IHdpbGwgc2VsZWN0IGEgYmxvY2sgYW5kIGNvbnRlbnQgb3B0aW9ucywgaWYgYW55LCB3aWxsIHNob3cgaGVyZScpXFx4MjI+QnkgY2xpY2tpbmcgb24gbWVzc2FnZSBwYXJ0cyB5b3Ugd2lsbCBzZWxlY3QgYSBibG9jayBhbmQgY29udGVudCBvcHRpb25zLCBpZiBhbnksIHdpbGwgc2hvdyBoZXJlPC9kaXY+ICAgIDwhLS0gL2tvIC0tPiAgICA8IS0tIGtvIGJsb2NrOiBjb250ZW50IC0tPjwhLS0gL2tvIC0tPiAgPC9kaXY+ICAgIDxkaXYgaWQ9XFx4MjJ0b29sc3R5bGVzXFx4MjIgZGF0YS1iaW5kPVxceDIyc2Nyb2xsYWJsZTogdHJ1ZSwgd2l0aFByb3BlcnRpZXM6IHsgdGVtcGxhdGVNb2RlOiAnc3R5bGVyJyB9XFx4MjI+ICAgIDwhLS0ga28gaWY6IHR5cGVvZiAkcm9vdC5jb250ZW50KCkudGhlbWUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiAkcm9vdC5jb250ZW50KCkudGhlbWUoKS5zY2hlbWUgPT09ICd1bmRlZmluZWQnIHx8ICRyb290LmNvbnRlbnQoKS50aGVtZSgpLnNjaGVtZSgpID09PSAnY3VzdG9tJyAtLT4gICAgICA8IS0tIGtvIGlmOiAkcm9vdC5zZWxlY3RlZEJsb2NrKCkgIT09IG51bGwgLS0+ICAgICAgPGRpdiBkYXRhLWJpbmQ9XFx4MjJibG9jazogJHJvb3Quc2VsZWN0ZWRCbG9jaywgY3NzOiB7IHdvcmtMb2NhbDogJHJvb3Quc2VsZWN0ZWRCbG9jaygpLmN1c3RvbVN0eWxlLCB3b3JrR2xvYmFsOiB0eXBlb2YgJHJvb3Quc2VsZWN0ZWRCbG9jaygpLmN1c3RvbVN0eWxlID09PSAndW5kZWZpbmVkJyB8fCAhJHJvb3Quc2VsZWN0ZWRCbG9jaygpLmN1c3RvbVN0eWxlKCkgfVxceDIyPjwvZGl2PiAgICAgIDwhLS0gL2tvIC0tPiAgICAgIDwhLS0ga28gaWY6ICRyb290LnNlbGVjdGVkQmxvY2soKSA9PSBudWxsIC0tPiAgICAgIDxkaXYgY2xhc3M9XFx4MjJub1NlbGVjdGVkQmxvY2tcXHgyMiBkYXRhLWJpbmQ9XFx4MjJ0ZXh0OiAkcm9vdC50KCdCeSBjbGlja2luZyBvbiBtZXNzYWdlIHBhcnRzIHlvdSB3aWxsIHNlbGVjdCBhIGJsb2NrIGFuZCBzdHlsZSBvcHRpb25zLCBpZiBhdmFpbGFibGUsIHdpbGwgc2hvdyBoZXJlJylcXHgyMj5CeSBjbGlja2luZyBvbiBtZXNzYWdlIHBhcnRzIHlvdSB3aWxsIHNlbGVjdCBhIGJsb2NrIGFuZCBzdHlsZSBvcHRpb25zLCBpZiBhdmFpbGFibGUsIHdpbGwgc2hvdyBoZXJlPC9kaXY+ICAgICAgPCEtLSAva28gLS0+ICAgICAgPGRpdiBjbGFzcz1cXHgyMndvcmtHbG9iYWxDb250ZW50XFx4MjI+ICAgICAgPCEtLSBrbyBibG9jazogY29udGVudCAtLT48IS0tIC9rbyAtLT4gICAgICA8L2Rpdj4gICAgPCEtLSAva28gLS0+ICA8L2Rpdj48L2Rpdj4gICAgICAgIDxkaXYgaWQ9XFx4MjJ0b29saW1hZ2VzXFx4MjIgY2xhc3M9XFx4MjJzbGlkZWJhclxceDIyIGRhdGEtYmluZD1cXHgyMnNjcm9sbGFibGU6IHRydWUsIGNzczogeyBoaWRkZW46ICRyb290LnNob3dHYWxsZXJ5KCkgPT09IGZhbHNlIH1cXHgyMj4gIDxkaXYgY2xhc3M9XFx4MjJjbG9zZVxceDIyIGRhdGEtYmluZD1cXHgyMmNsaWNrOiAkcm9vdC5zaG93R2FsbGVyeS5iaW5kKCRlbGVtZW50LCBmYWxzZSk7XFx4MjI+WDwvZGl2PiAgPHNwYW4gY2xhc3M9XFx4MjJwYW5lLXRpdGxlXFx4MjIgZGF0YS1iaW5kPVxceDIydGV4dDogJHJvb3QudCgnR2FsbGVyeTonKVxceDIyPkdhbGxlcnk6PC9zcGFuPiAgPGRpdiBkYXRhLWRyb3AtY29udGVudD1cXHgyMkRyb3AgaGVyZVxceDIyIGNsYXNzPVxceDIyaW1nLWRyb3B6b25lIHBhbmUgdXBsb2Fkem9uZVxceDIyIGRhdGEtYmluZD1cXHgyMmF0dHI6IHsgJ2RhdGEtZHJvcC1jb250ZW50JzogJHJvb3QudCgnRHJvcCBoZXJlJykgfSwgZnVkcm9wcGFibGU6IHsgYWN0aXZlQ2xhc3M6ICd1aS1zdGF0ZS1oaWdobGlnaHQnLCBob3ZlckNsYXNzOiAndWktc3RhdGUtZHJhZ2hvdmVyJyB9XFx4MjI+ICA8ZGl2IGNsYXNzPVxceDIybW8tdXBsb2Fkem9uZVxceDIyIHN0eWxlPVxceDIycG9zaXRpb246IHJlbGF0aXZlOyBwYWRkaW5nOiAyZW07IGJvcmRlcjogMnB4IGRvdHRlZCAjODA4MDgwXFx4MjI+ICAgICA8aW5wdXQgY2xhc3M9XFx4MjJmaWxldXBsb2FkXFx4MjIgdHlwZT1cXHgyMmZpbGVcXHgyMiBtdWx0aXBsZSBuYW1lPVxceDIyZmlsZXNbXVxceDIyIGRhdGEtYmluZD1cXHgyMmZpbGV1cGxvYWQ6IHsgb25lcnJvcjogJHJvb3Qubm90aWZpZXIuZXJyb3IsIG9uZmlsZTogJHJvb3QubG9hZEltYWdlIH1cXHgyMiBzdHlsZT1cXHgyMnotaW5kZXg6IDEwOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgcmlnaHQ6IDA7IGJvdHRvbTogMDsgbWluLXdpZHRoOiAxMDAlOyBtaW4taGVpZ2h0OiAxMDAlOyBmb250LXppZTogOTk5cHg7IHRleHQtYWxpZ246IHJpZ2h0OyBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MCk7IG9wYWNpdHk6IDA7IG91dGxpbmU6IG5vbmU7IGN1cnNvcjogaW5oZXJpdDsgZGlzcGxheTogYmxvY2tcXHgyMj4gICAgIDxzcGFuIGRhdGEtYmluZD1cXHgyMnRleHQ6ICRyb290LnQoJ0NsaWNrIG9yIGRyYWcgZmlsZXMgaGVyZScpXFx4MjI+Q2xpY2sgb3IgZHJhZyBmaWxlcyBoZXJlPC9zcGFuPiAgICAgPGRpdiBjbGFzcz1cXHgyMndvcmt6b25lXFx4MjIgc3R5bGU9XFx4MjJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgcmlnaHQ6IDA7IGJvdHRvbTogMDsgb3ZlcmZsb3c6IGhpZGRlbjtcXHgyMj4gICAgICAgPGRpdiBjbGFzcz1cXHgyMnByb2dyZXNzXFx4MjIgc3R5bGU9XFx4MjJvcGFjaXR5OiAuNTsgd2lkdGg6IDgwJTsgbWFyZ2luLWxlZnQ6IDEwJTsgcG9zaXRpb246IGFic29sdXRlOyBib3R0b206IDMwJTsgaGVpZ2h0OiAyMHB4OyBib3JkZXI6IDJweCBzb2xpZCBibGFjaztcXHgyMj4gICAgICAgICA8ZGl2IGNsYXNzPVxceDIycHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1zdWNjZXNzXFx4MjIgc3R5bGU9XFx4MjJoZWlnaHQ6IDIwcHg7IGJhY2tncm91bmQtY29sb3I6IGJsYWNrOyBcXHgyMj48L2Rpdj4gICAgICAgPC9kaXY+ICAgICA8L2Rpdj4gIDwvZGl2PiAgPC9kaXY+ICA8IS0tIGtvIGlmOiAkcm9vdC5zaG93R2FsbGVyeSgpIC0tPiAgPGRpdiBpZD1cXHgyMnRvb2xpbWFnZXN0YWJcXHgyMiBjbGFzcz1cXHgyMnRhYnNfaG9yaXpvbnRhbFxceDIyIGRhdGEtYmluZD1cXHgyMnRhYnM6IHsgYWN0aXZlOiAkcm9vdC5zZWxlY3RlZEltYWdlVGFiIH1cXHgyMj4gICAgPHVsPiAgICAgIDxsaSBkYXRhLWJpbmQ9XFx4MjJ0b29sdGlwczoge31cXHgyMj48YSB0aXRsZT1cXHgyMlNlc3Npb24gaW1hZ2VzXFx4MjIgZGF0YS1sb2NhbD1cXHgyMnRydWVcXHgyMiBocmVmPVxceDIyI3Rvb2xpbWFnZXNyZWNlbnRcXHgyMiBkYXRhLWJpbmQ9XFx4MjJhdHRyOiB7IHRpdGxlOiAkcm9vdC50KCdTZXNzaW9uIGltYWdlcycpIH0sIHRleHQ6ICRyb290LnQoJ1JlY2VudHMnKVxceDIyPlJlY2VudHM8L2E+PC9saT4gICAgICA8bGkgZGF0YS1iaW5kPVxceDIydG9vbHRpcHM6IHt9XFx4MjI+PGEgdGl0bGU9XFx4MjJSZW1vdGUgZ2FsbGVyeVxceDIyIGRhdGEtbG9jYWw9XFx4MjJ0cnVlXFx4MjIgaHJlZj1cXHgyMiN0b29saW1hZ2VzZ2FsbGVyeVxceDIyIGRhdGEtYmluZD1cXHgyMmF0dHI6IHsgdGl0bGU6ICRyb290LnQoJ1JlbW90ZSBnYWxsZXJ5JykgfSwgdGV4dDogJHJvb3QudCgnR2FsbGVyeScpXFx4MjI+R2FsbGVyeTwvYT48L2xpPiAgICA8L3VsPiAgICA8ZGl2IGlkPVxceDIydG9vbGltYWdlc3JlY2VudFxceDIyPiAgICAgIDwhLS0ga28gaWY6IGdhbGxlcnlSZWNlbnQoKS5sZW5ndGggPT0gMCAtLT48ZGl2IGNsYXNzPVxceDIyZ2FsbGVyeUVtcHR5XFx4MjIgZGF0YS1iaW5kPVxceDIydGV4dDogJHJvb3QudCgnTm8gaW1hZ2VzIHVwbG9hZGVkLCB5ZXQnKVxceDIyPk5vIGltYWdlcyB1cGxvYWRlZCwgeWV0PC9kaXY+PCEtLSAva28gLS0+ICAgICAgPCEtLSBrbyB0ZW1wbGF0ZToge25hbWU6ICdnYWxsZXJ5LWltYWdlcycsIGRhdGE6IHsgaXRlbXM6IGdhbGxlcnlSZWNlbnQgfSB9IC0tPiMgcmVjZW50IGdhbGxlcnkgIzwhLS0gL2tvIC0tPiAgICA8L2Rpdj4gICAgPGRpdiBpZD1cXHgyMnRvb2xpbWFnZXNnYWxsZXJ5XFx4MjIgc3R5bGU9XFx4MjJ0ZXh0LWFsaWduOiBjZW50ZXJcXHgyMj4gICAgPCEtLSBrbyBpZjogJHJvb3QuZ2FsbGVyeUxvYWRlZCgpID09PSBmYWxzZSAtLT48YSBjbGFzcz1cXHgyMmxvYWRidXR0b25cXHgyMiB0aXRsZT1cXHgyMlNob3cgaW1hZ2VzIGZyb20gdGhlIGdhbGxlcnlcXHgyMiBocmVmPVxceDIyamF2YXNjcmlwdDp2b2lkKDApXFx4MjIgZGF0YS1iaW5kPVxceDIyYXR0cjogeyB0aXRsZTogJHJvb3QudCgnU2hvdyBpbWFnZXMgZnJvbSB0aGUgZ2FsbGVyeScpIH0sIGNsaWNrOiAkcm9vdC5sb2FkR2FsbGVyeSwgYnV0dG9uOiB7IGRpc2FibGVkOiAkcm9vdC5nYWxsZXJ5TG9hZGVkLCBpY29uczogeyBwcmltYXJ5OiAnZmEgZmEtZncgZmEtcGljdHVyZS1vJyB9LCBsYWJlbDogJHJvb3QuZ2FsbGVyeUxvYWRlZCgpID09ICdsb2FkaW5nJyA/ICRyb290LnQoJ0xvYWRpbmcuLi4nKSA6ICRyb290LnQoJ0xvYWQgZ2FsbGVyeScpLCB0ZXh0OiB0cnVlIH1cXHgyMj4jIGxvYWQgZ2FsbHkgIzwvYT48IS0tIC9rbyAtLT4gICAgPCEtLSBrbyBpZjogJHJvb3QuZ2FsbGVyeUxvYWRlZCgpID09PSAnbG9hZGluZycgLS0+PGRpdiBjbGFzcz1cXHgyMmdhbGxlcnlFbXB0eVxceDIyIGRhdGEtYmluZD1cXHgyMnRleHQ6ICRyb290LnQoJ0xvYWRpbmcgZ2FsbGVyeS4uLicpXFx4MjI+TG9hZGluZyBnYWxsZXJ5Li4uPC9kaXY+PCEtLSAva28gLS0+ICAgIDwhLS0ga28gaWY6ICRyb290LmdhbGxlcnlMb2FkZWQoKSA9PT0gMCAtLT48ZGl2IGNsYXNzPVxceDIyZ2FsbGVyeUVtcHR5XFx4MjIgZGF0YS1iaW5kPVxceDIydGV4dDogJHJvb3QudCgnVGhlIGdhbGxlcnkgaXMgZW1wdHknKVxceDIyPlRoZSBnYWxsZXJ5IGlzIGVtcHR5PC9kaXY+PCEtLSAva28gLS0+ICAgIDwhLS0ga28gdGVtcGxhdGU6IHtuYW1lOiAnZ2FsbGVyeS1pbWFnZXMnLCBkYXRhOiB7IGl0ZW1zOiBnYWxsZXJ5UmVtb3RlIH0gfSAtLT4jIHJlbW90ZSBnYWxsZXJ5ICM8IS0tIC9rbyAtLT4gICAgPC9kaXY+ICA8L2Rpdj4gIDwhLS0gL2tvIC0tPjwvZGl2PjxkaXYgaWQ9XFx4MjJ0b29sZGVidWdcXHgyMiBjbGFzcz1cXHgyMnNsaWRlYmFyXFx4MjIgZGF0YS1iaW5kPVxceDIyY3NzOiB7IGhpZGRlbjogJHJvb3QuZGVidWcoKSA9PT0gZmFsc2UgfVxceDIyPiAgPGRpdiBjbGFzcz1cXHgyMmNsb3NlXFx4MjIgZGF0YS1iaW5kPVxceDIyY2xpY2s6ICRyb290LmRlYnVnLmJpbmQoJGVsZW1lbnQsIGZhbHNlKTtcXHgyMj5YPC9kaXY+ICAgIDwhLS0ga28gaWY6ICRyb290LmRlYnVnIC0tPiAgQ29udGVudDogIDxwcmUgZGF0YS1iaW5kPSd0ZXh0OiBrby50b0pTT04oY29udGVudCwgbnVsbCwgMiknIHN0eWxlPVxceDIyb3ZlcmZsb3c6IGF1dG87IGhlaWdodDogMjAlXFx4MjI+PC9wcmU+ICBCbG9ja0RlZnM6ICA8cHJlIGRhdGEtYmluZD0ndGV4dDoga28udG9KU09OKGJsb2NrRGVmcywgbnVsbCwgMiknIHN0eWxlPVxceDIyb3ZlcmZsb3c6IGF1dG87IGhlaWdodDogMjAlXFx4MjI+PC9wcmU+ICA8IS0tIC9rbyAtLT4gIDxhIGhyZWY9XFx4MjJqYXZhc2NyaXB0OnZvaWQoMClcXHgyMiBkYXRhLWJpbmQ9XFx4MjJjbGljazogJHJvb3QuZXhwb3J0SFRNTHRvVGV4dGFyZWEuYmluZCgkZWxlbWVudCwgJyNvdXRwdXRodG1sJyk7IGNsaWNrQnViYmxlOiBmYWxzZSwgYnV0dG9uOiB7IHRleHQ6IHRydWUsIGxhYmVsOidHZW5lcmF0ZScgfVxceDIyPk91dHB1dDwvYT4gIDxhIGhyZWY9XFx4MjJqYXZhc2NyaXB0OnZvaWQoMClcXHgyMiBkYXRhLWJpbmQ9XFx4MjJjbGljazogJHJvb3QuZXhwb3J0SlNPTnRvVGV4dGFyZWEuYmluZCgkZWxlbWVudCwgJyNvdXRwdXRodG1sJyk7IGNsaWNrQnViYmxlOiBmYWxzZSwgYnV0dG9uOiB7IHRleHQ6IHRydWUsIGxhYmVsOidFeHBvcnQnIH1cXHgyMj5FeHBvcnQ8L2E+ICA8YSBocmVmPVxceDIyamF2YXNjcmlwdDp2b2lkKDApXFx4MjIgZGF0YS1iaW5kPVxceDIyY2xpY2s6ICRyb290LmltcG9ydEpTT05mcm9tVGV4dGFyZWEuYmluZCgkZWxlbWVudCwgJyNvdXRwdXRodG1sJyk7IGNsaWNrQnViYmxlOiBmYWxzZSwgYnV0dG9uOiB7IHRleHQ6IHRydWUsIGxhYmVsOidJbXBvcnQnIH1cXHgyMj5JbXBvcnQ8L2E+ICA8dGV4dGFyZWEgaWQ9XFx4MjJvdXRwdXRodG1sXFx4MjIgcm93cz1cXHgyMjEwXFx4MjIgc3R5bGU9XFx4MjJ3aWR0aDogMTAwJTtcXHgyMj48L3RleHRhcmVhPjwvZGl2PjxkaXYgaWQ9XFx4MjJ0b29sdGhlbWVcXHgyMiBjbGFzcz1cXHgyMnVpLXdpZGdldCBzbGlkZWJhclxceDIyIGRhdGEtYmluZD1cXHgyMmNzczogeyBoaWRkZW46ICRyb290LnNob3dUaGVtZSgpID09PSBmYWxzZSB9XFx4MjI+ICA8ZGl2IGNsYXNzPVxceDIyY2xvc2VcXHgyMiBkYXRhLWJpbmQ9XFx4MjJjbGljazogJHJvb3Quc2hvd1RoZW1lLmJpbmQoJGVsZW1lbnQsIGZhbHNlKTtcXHgyMj5YPC9kaXY+ICAgIDwhLS0ga28gd2l0aFByb3BlcnRpZXM6IHsgdGVtcGxhdGVNb2RlOiAnc3R5bGVyJyB9IC0tPiAgICA8IS0tIGtvIGlmOiAkcm9vdC5zaG93VGhlbWUgLS0+ICAgICAgPCEtLSBrbyBibG9jazogJHJvb3QuY29udGVudCgpLnRoZW1lIC0tPjwhLS0gL2tvIC0tPiAgICA8IS0tIC9rbyAtLT4gIDwhLS0gL2tvIC0tPjwvZGl2PlwiKTtcbn0pO1xuIiwiLy8gaHR0cDovL3dpa2kuY29tbW9uanMub3JnL3dpa2kvVW5pdF9UZXN0aW5nLzEuMFxuLy9cbi8vIFRISVMgSVMgTk9UIFRFU1RFRCBOT1IgTElLRUxZIFRPIFdPUksgT1VUU0lERSBWOCFcbi8vXG4vLyBPcmlnaW5hbGx5IGZyb20gbmFyd2hhbC5qcyAoaHR0cDovL25hcndoYWxqcy5vcmcpXG4vLyBDb3B5cmlnaHQgKGMpIDIwMDkgVGhvbWFzIFJvYmluc29uIDwyODBub3J0aC5jb20+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgJ1NvZnR3YXJlJyksIHRvXG4vLyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTlxuLy8gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTlxuLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIHdoZW4gdXNlZCBpbiBub2RlLCB0aGlzIHdpbGwgYWN0dWFsbHkgbG9hZCB0aGUgdXRpbCBtb2R1bGUgd2UgZGVwZW5kIG9uXG4vLyB2ZXJzdXMgbG9hZGluZyB0aGUgYnVpbHRpbiB1dGlsIG1vZHVsZSBhcyBoYXBwZW5zIG90aGVyd2lzZVxuLy8gdGhpcyBpcyBhIGJ1ZyBpbiBub2RlIG1vZHVsZSBsb2FkaW5nIGFzIGZhciBhcyBJIGFtIGNvbmNlcm5lZFxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsLycpO1xuXG52YXIgcFNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8vIDEuIFRoZSBhc3NlcnQgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0aGF0IHRocm93XG4vLyBBc3NlcnRpb25FcnJvcidzIHdoZW4gcGFydGljdWxhciBjb25kaXRpb25zIGFyZSBub3QgbWV0LiBUaGVcbi8vIGFzc2VydCBtb2R1bGUgbXVzdCBjb25mb3JtIHRvIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlLlxuXG52YXIgYXNzZXJ0ID0gbW9kdWxlLmV4cG9ydHMgPSBvaztcblxuLy8gMi4gVGhlIEFzc2VydGlvbkVycm9yIGlzIGRlZmluZWQgaW4gYXNzZXJ0LlxuLy8gbmV3IGFzc2VydC5Bc3NlcnRpb25FcnJvcih7IG1lc3NhZ2U6IG1lc3NhZ2UsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsOiBhY3R1YWwsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkIH0pXG5cbmFzc2VydC5Bc3NlcnRpb25FcnJvciA9IGZ1bmN0aW9uIEFzc2VydGlvbkVycm9yKG9wdGlvbnMpIHtcbiAgdGhpcy5uYW1lID0gJ0Fzc2VydGlvbkVycm9yJztcbiAgdGhpcy5hY3R1YWwgPSBvcHRpb25zLmFjdHVhbDtcbiAgdGhpcy5leHBlY3RlZCA9IG9wdGlvbnMuZXhwZWN0ZWQ7XG4gIHRoaXMub3BlcmF0b3IgPSBvcHRpb25zLm9wZXJhdG9yO1xuICBpZiAob3B0aW9ucy5tZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlO1xuICAgIHRoaXMuZ2VuZXJhdGVkTWVzc2FnZSA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubWVzc2FnZSA9IGdldE1lc3NhZ2UodGhpcyk7XG4gICAgdGhpcy5nZW5lcmF0ZWRNZXNzYWdlID0gdHJ1ZTtcbiAgfVxuICB2YXIgc3RhY2tTdGFydEZ1bmN0aW9uID0gb3B0aW9ucy5zdGFja1N0YXJ0RnVuY3Rpb24gfHwgZmFpbDtcblxuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBzdGFja1N0YXJ0RnVuY3Rpb24pO1xuICB9XG4gIGVsc2Uge1xuICAgIC8vIG5vbiB2OCBicm93c2VycyBzbyB3ZSBjYW4gaGF2ZSBhIHN0YWNrdHJhY2VcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCk7XG4gICAgaWYgKGVyci5zdGFjaykge1xuICAgICAgdmFyIG91dCA9IGVyci5zdGFjaztcblxuICAgICAgLy8gdHJ5IHRvIHN0cmlwIHVzZWxlc3MgZnJhbWVzXG4gICAgICB2YXIgZm5fbmFtZSA9IHN0YWNrU3RhcnRGdW5jdGlvbi5uYW1lO1xuICAgICAgdmFyIGlkeCA9IG91dC5pbmRleE9mKCdcXG4nICsgZm5fbmFtZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgLy8gb25jZSB3ZSBoYXZlIGxvY2F0ZWQgdGhlIGZ1bmN0aW9uIGZyYW1lXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gc3RyaXAgb3V0IGV2ZXJ5dGhpbmcgYmVmb3JlIGl0IChhbmQgaXRzIGxpbmUpXG4gICAgICAgIHZhciBuZXh0X2xpbmUgPSBvdXQuaW5kZXhPZignXFxuJywgaWR4ICsgMSk7XG4gICAgICAgIG91dCA9IG91dC5zdWJzdHJpbmcobmV4dF9saW5lICsgMSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhY2sgPSBvdXQ7XG4gICAgfVxuICB9XG59O1xuXG4vLyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3IgaW5zdGFuY2VvZiBFcnJvclxudXRpbC5pbmhlcml0cyhhc3NlcnQuQXNzZXJ0aW9uRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gcmVwbGFjZXIoa2V5LCB2YWx1ZSkge1xuICBpZiAodXRpbC5pc1VuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gJycgKyB2YWx1ZTtcbiAgfVxuICBpZiAodXRpbC5pc051bWJlcih2YWx1ZSkgJiYgIWlzRmluaXRlKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICB9XG4gIGlmICh1dGlsLmlzRnVuY3Rpb24odmFsdWUpIHx8IHV0aWwuaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiB0cnVuY2F0ZShzLCBuKSB7XG4gIGlmICh1dGlsLmlzU3RyaW5nKHMpKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoIDwgbiA/IHMgOiBzLnNsaWNlKDAsIG4pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1lc3NhZ2Uoc2VsZikge1xuICByZXR1cm4gdHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoc2VsZi5hY3R1YWwsIHJlcGxhY2VyKSwgMTI4KSArICcgJyArXG4gICAgICAgICBzZWxmLm9wZXJhdG9yICsgJyAnICtcbiAgICAgICAgIHRydW5jYXRlKEpTT04uc3RyaW5naWZ5KHNlbGYuZXhwZWN0ZWQsIHJlcGxhY2VyKSwgMTI4KTtcbn1cblxuLy8gQXQgcHJlc2VudCBvbmx5IHRoZSB0aHJlZSBrZXlzIG1lbnRpb25lZCBhYm92ZSBhcmUgdXNlZCBhbmRcbi8vIHVuZGVyc3Rvb2QgYnkgdGhlIHNwZWMuIEltcGxlbWVudGF0aW9ucyBvciBzdWIgbW9kdWxlcyBjYW4gcGFzc1xuLy8gb3RoZXIga2V5cyB0byB0aGUgQXNzZXJ0aW9uRXJyb3IncyBjb25zdHJ1Y3RvciAtIHRoZXkgd2lsbCBiZVxuLy8gaWdub3JlZC5cblxuLy8gMy4gQWxsIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG11c3QgdGhyb3cgYW4gQXNzZXJ0aW9uRXJyb3Jcbi8vIHdoZW4gYSBjb3JyZXNwb25kaW5nIGNvbmRpdGlvbiBpcyBub3QgbWV0LCB3aXRoIGEgbWVzc2FnZSB0aGF0XG4vLyBtYXkgYmUgdW5kZWZpbmVkIGlmIG5vdCBwcm92aWRlZC4gIEFsbCBhc3NlcnRpb24gbWV0aG9kcyBwcm92aWRlXG4vLyBib3RoIHRoZSBhY3R1YWwgYW5kIGV4cGVjdGVkIHZhbHVlcyB0byB0aGUgYXNzZXJ0aW9uIGVycm9yIGZvclxuLy8gZGlzcGxheSBwdXJwb3Nlcy5cblxuZnVuY3Rpb24gZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCBvcGVyYXRvciwgc3RhY2tTdGFydEZ1bmN0aW9uKSB7XG4gIHRocm93IG5ldyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3Ioe1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgYWN0dWFsOiBhY3R1YWwsXG4gICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuICAgIG9wZXJhdG9yOiBvcGVyYXRvcixcbiAgICBzdGFja1N0YXJ0RnVuY3Rpb246IHN0YWNrU3RhcnRGdW5jdGlvblxuICB9KTtcbn1cblxuLy8gRVhURU5TSU9OISBhbGxvd3MgZm9yIHdlbGwgYmVoYXZlZCBlcnJvcnMgZGVmaW5lZCBlbHNld2hlcmUuXG5hc3NlcnQuZmFpbCA9IGZhaWw7XG5cbi8vIDQuIFB1cmUgYXNzZXJ0aW9uIHRlc3RzIHdoZXRoZXIgYSB2YWx1ZSBpcyB0cnV0aHksIGFzIGRldGVybWluZWRcbi8vIGJ5ICEhZ3VhcmQuXG4vLyBhc3NlcnQub2soZ3VhcmQsIG1lc3NhZ2Vfb3B0KTtcbi8vIFRoaXMgc3RhdGVtZW50IGlzIGVxdWl2YWxlbnQgdG8gYXNzZXJ0LmVxdWFsKHRydWUsICEhZ3VhcmQsXG4vLyBtZXNzYWdlX29wdCk7LiBUbyB0ZXN0IHN0cmljdGx5IGZvciB0aGUgdmFsdWUgdHJ1ZSwgdXNlXG4vLyBhc3NlcnQuc3RyaWN0RXF1YWwodHJ1ZSwgZ3VhcmQsIG1lc3NhZ2Vfb3B0KTsuXG5cbmZ1bmN0aW9uIG9rKHZhbHVlLCBtZXNzYWdlKSB7XG4gIGlmICghdmFsdWUpIGZhaWwodmFsdWUsIHRydWUsIG1lc3NhZ2UsICc9PScsIGFzc2VydC5vayk7XG59XG5hc3NlcnQub2sgPSBvaztcblxuLy8gNS4gVGhlIGVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBzaGFsbG93LCBjb2VyY2l2ZSBlcXVhbGl0eSB3aXRoXG4vLyA9PS5cbi8vIGFzc2VydC5lcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5lcXVhbCA9IGZ1bmN0aW9uIGVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCAhPSBleHBlY3RlZCkgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnPT0nLCBhc3NlcnQuZXF1YWwpO1xufTtcblxuLy8gNi4gVGhlIG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHdoZXRoZXIgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbFxuLy8gd2l0aCAhPSBhc3NlcnQubm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90RXF1YWwgPSBmdW5jdGlvbiBub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgPT0gZXhwZWN0ZWQpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICchPScsIGFzc2VydC5ub3RFcXVhbCk7XG4gIH1cbn07XG5cbi8vIDcuIFRoZSBlcXVpdmFsZW5jZSBhc3NlcnRpb24gdGVzdHMgYSBkZWVwIGVxdWFsaXR5IHJlbGF0aW9uLlxuLy8gYXNzZXJ0LmRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5kZWVwRXF1YWwgPSBmdW5jdGlvbiBkZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoIV9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdkZWVwRXF1YWwnLCBhc3NlcnQuZGVlcEVxdWFsKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkKSB7XG4gIC8vIDcuMS4gQWxsIGlkZW50aWNhbCB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGFzIGRldGVybWluZWQgYnkgPT09LlxuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIHJldHVybiB0cnVlO1xuXG4gIH0gZWxzZSBpZiAodXRpbC5pc0J1ZmZlcihhY3R1YWwpICYmIHV0aWwuaXNCdWZmZXIoZXhwZWN0ZWQpKSB7XG4gICAgaWYgKGFjdHVhbC5sZW5ndGggIT0gZXhwZWN0ZWQubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFjdHVhbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFjdHVhbFtpXSAhPT0gZXhwZWN0ZWRbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcblxuICAvLyA3LjIuIElmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBhIERhdGUgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIERhdGUgb2JqZWN0IHRoYXQgcmVmZXJzIHRvIHRoZSBzYW1lIHRpbWUuXG4gIH0gZWxzZSBpZiAodXRpbC5pc0RhdGUoYWN0dWFsKSAmJiB1dGlsLmlzRGF0ZShleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gYWN0dWFsLmdldFRpbWUoKSA9PT0gZXhwZWN0ZWQuZ2V0VGltZSgpO1xuXG4gIC8vIDcuMyBJZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIFJlZ0V4cCBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzb3VyY2UgYW5kXG4gIC8vIHByb3BlcnRpZXMgKGBnbG9iYWxgLCBgbXVsdGlsaW5lYCwgYGxhc3RJbmRleGAsIGBpZ25vcmVDYXNlYCkuXG4gIH0gZWxzZSBpZiAodXRpbC5pc1JlZ0V4cChhY3R1YWwpICYmIHV0aWwuaXNSZWdFeHAoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGFjdHVhbC5zb3VyY2UgPT09IGV4cGVjdGVkLnNvdXJjZSAmJlxuICAgICAgICAgICBhY3R1YWwuZ2xvYmFsID09PSBleHBlY3RlZC5nbG9iYWwgJiZcbiAgICAgICAgICAgYWN0dWFsLm11bHRpbGluZSA9PT0gZXhwZWN0ZWQubXVsdGlsaW5lICYmXG4gICAgICAgICAgIGFjdHVhbC5sYXN0SW5kZXggPT09IGV4cGVjdGVkLmxhc3RJbmRleCAmJlxuICAgICAgICAgICBhY3R1YWwuaWdub3JlQ2FzZSA9PT0gZXhwZWN0ZWQuaWdub3JlQ2FzZTtcblxuICAvLyA3LjQuIE90aGVyIHBhaXJzIHRoYXQgZG8gbm90IGJvdGggcGFzcyB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcsXG4gIC8vIGVxdWl2YWxlbmNlIGlzIGRldGVybWluZWQgYnkgPT0uXG4gIH0gZWxzZSBpZiAoIXV0aWwuaXNPYmplY3QoYWN0dWFsKSAmJiAhdXRpbC5pc09iamVjdChleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gYWN0dWFsID09IGV4cGVjdGVkO1xuXG4gIC8vIDcuNSBGb3IgYWxsIG90aGVyIE9iamVjdCBwYWlycywgaW5jbHVkaW5nIEFycmF5IG9iamVjdHMsIGVxdWl2YWxlbmNlIGlzXG4gIC8vIGRldGVybWluZWQgYnkgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChhcyB2ZXJpZmllZFxuICAvLyB3aXRoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCksIHRoZSBzYW1lIHNldCBvZiBrZXlzXG4gIC8vIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLCBlcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnlcbiAgLy8gY29ycmVzcG9uZGluZyBrZXksIGFuZCBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuIE5vdGU6IHRoaXNcbiAgLy8gYWNjb3VudHMgZm9yIGJvdGggbmFtZWQgYW5kIGluZGV4ZWQgcHJvcGVydGllcyBvbiBBcnJheXMuXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG9iakVxdWl2KGFjdHVhbCwgZXhwZWN0ZWQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQXJndW1lbnRzKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG59XG5cbmZ1bmN0aW9uIG9iakVxdWl2KGEsIGIpIHtcbiAgaWYgKHV0aWwuaXNOdWxsT3JVbmRlZmluZWQoYSkgfHwgdXRpbC5pc051bGxPclVuZGVmaW5lZChiKSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIC8vIGFuIGlkZW50aWNhbCAncHJvdG90eXBlJyBwcm9wZXJ0eS5cbiAgaWYgKGEucHJvdG90eXBlICE9PSBiLnByb3RvdHlwZSkgcmV0dXJuIGZhbHNlO1xuICAvLyBpZiBvbmUgaXMgYSBwcmltaXRpdmUsIHRoZSBvdGhlciBtdXN0IGJlIHNhbWVcbiAgaWYgKHV0aWwuaXNQcmltaXRpdmUoYSkgfHwgdXRpbC5pc1ByaW1pdGl2ZShiKSkge1xuICAgIHJldHVybiBhID09PSBiO1xuICB9XG4gIHZhciBhSXNBcmdzID0gaXNBcmd1bWVudHMoYSksXG4gICAgICBiSXNBcmdzID0gaXNBcmd1bWVudHMoYik7XG4gIGlmICgoYUlzQXJncyAmJiAhYklzQXJncykgfHwgKCFhSXNBcmdzICYmIGJJc0FyZ3MpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKGFJc0FyZ3MpIHtcbiAgICBhID0gcFNsaWNlLmNhbGwoYSk7XG4gICAgYiA9IHBTbGljZS5jYWxsKGIpO1xuICAgIHJldHVybiBfZGVlcEVxdWFsKGEsIGIpO1xuICB9XG4gIHZhciBrYSA9IG9iamVjdEtleXMoYSksXG4gICAgICBrYiA9IG9iamVjdEtleXMoYiksXG4gICAgICBrZXksIGk7XG4gIC8vIGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoa2V5cyBpbmNvcnBvcmF0ZXNcbiAgLy8gaGFzT3duUHJvcGVydHkpXG4gIGlmIChrYS5sZW5ndGggIT0ga2IubGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZTtcbiAgLy90aGUgc2FtZSBzZXQgb2Yga2V5cyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSxcbiAga2Euc29ydCgpO1xuICBrYi5zb3J0KCk7XG4gIC8vfn5+Y2hlYXAga2V5IHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoa2FbaV0gIT0ga2JbaV0pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy9lcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnkgY29ycmVzcG9uZGluZyBrZXksIGFuZFxuICAvL35+fnBvc3NpYmx5IGV4cGVuc2l2ZSBkZWVwIHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBrZXkgPSBrYVtpXTtcbiAgICBpZiAoIV9kZWVwRXF1YWwoYVtrZXldLCBiW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIDguIFRoZSBub24tZXF1aXZhbGVuY2UgYXNzZXJ0aW9uIHRlc3RzIGZvciBhbnkgZGVlcCBpbmVxdWFsaXR5LlxuLy8gYXNzZXJ0Lm5vdERlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3REZWVwRXF1YWwgPSBmdW5jdGlvbiBub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ25vdERlZXBFcXVhbCcsIGFzc2VydC5ub3REZWVwRXF1YWwpO1xuICB9XG59O1xuXG4vLyA5LiBUaGUgc3RyaWN0IGVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBzdHJpY3QgZXF1YWxpdHksIGFzIGRldGVybWluZWQgYnkgPT09LlxuLy8gYXNzZXJ0LnN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LnN0cmljdEVxdWFsID0gZnVuY3Rpb24gc3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJz09PScsIGFzc2VydC5zdHJpY3RFcXVhbCk7XG4gIH1cbn07XG5cbi8vIDEwLiBUaGUgc3RyaWN0IG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHN0cmljdCBpbmVxdWFsaXR5LCBhc1xuLy8gZGV0ZXJtaW5lZCBieSAhPT0uICBhc3NlcnQubm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90U3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnIT09JywgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkge1xuICBpZiAoIWFjdHVhbCB8fCAhZXhwZWN0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGV4cGVjdGVkKSA9PSAnW29iamVjdCBSZWdFeHBdJykge1xuICAgIHJldHVybiBleHBlY3RlZC50ZXN0KGFjdHVhbCk7XG4gIH0gZWxzZSBpZiAoYWN0dWFsIGluc3RhbmNlb2YgZXhwZWN0ZWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChleHBlY3RlZC5jYWxsKHt9LCBhY3R1YWwpID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIF90aHJvd3Moc2hvdWxkVGhyb3csIGJsb2NrLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICB2YXIgYWN0dWFsO1xuXG4gIGlmICh1dGlsLmlzU3RyaW5nKGV4cGVjdGVkKSkge1xuICAgIG1lc3NhZ2UgPSBleHBlY3RlZDtcbiAgICBleHBlY3RlZCA9IG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGJsb2NrKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBhY3R1YWwgPSBlO1xuICB9XG5cbiAgbWVzc2FnZSA9IChleHBlY3RlZCAmJiBleHBlY3RlZC5uYW1lID8gJyAoJyArIGV4cGVjdGVkLm5hbWUgKyAnKS4nIDogJy4nKSArXG4gICAgICAgICAgICAobWVzc2FnZSA/ICcgJyArIG1lc3NhZ2UgOiAnLicpO1xuXG4gIGlmIChzaG91bGRUaHJvdyAmJiAhYWN0dWFsKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnTWlzc2luZyBleHBlY3RlZCBleGNlcHRpb24nICsgbWVzc2FnZSk7XG4gIH1cblxuICBpZiAoIXNob3VsZFRocm93ICYmIGV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnR290IHVud2FudGVkIGV4Y2VwdGlvbicgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIGlmICgoc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmIGV4cGVjdGVkICYmXG4gICAgICAhZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkpIHx8ICghc2hvdWxkVGhyb3cgJiYgYWN0dWFsKSkge1xuICAgIHRocm93IGFjdHVhbDtcbiAgfVxufVxuXG4vLyAxMS4gRXhwZWN0ZWQgdG8gdGhyb3cgYW4gZXJyb3I6XG4vLyBhc3NlcnQudGhyb3dzKGJsb2NrLCBFcnJvcl9vcHQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LnRocm93cyA9IGZ1bmN0aW9uKGJsb2NrLCAvKm9wdGlvbmFsKi9lcnJvciwgLypvcHRpb25hbCovbWVzc2FnZSkge1xuICBfdGhyb3dzLmFwcGx5KHRoaXMsIFt0cnVlXS5jb25jYXQocFNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xufTtcblxuLy8gRVhURU5TSU9OISBUaGlzIGlzIGFubm95aW5nIHRvIHdyaXRlIG91dHNpZGUgdGhpcyBtb2R1bGUuXG5hc3NlcnQuZG9lc05vdFRocm93ID0gZnVuY3Rpb24oYmxvY2ssIC8qb3B0aW9uYWwqL21lc3NhZ2UpIHtcbiAgX3Rocm93cy5hcHBseSh0aGlzLCBbZmFsc2VdLmNvbmNhdChwU2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG59O1xuXG5hc3NlcnQuaWZFcnJvciA9IGZ1bmN0aW9uKGVycikgeyBpZiAoZXJyKSB7dGhyb3cgZXJyO319O1xuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChoYXNPd24uY2FsbChvYmosIGtleSkpIGtleXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBrZXlzO1xufTtcbiIsImV4cG9ydHMuZW5kaWFubmVzcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdMRScgfTtcblxuZXhwb3J0cy5ob3N0bmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIGxvY2F0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gbG9jYXRpb24uaG9zdG5hbWVcbiAgICB9XG4gICAgZWxzZSByZXR1cm4gJyc7XG59O1xuXG5leHBvcnRzLmxvYWRhdmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXSB9O1xuXG5leHBvcnRzLnVwdGltZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDAgfTtcblxuZXhwb3J0cy5mcmVlbWVtID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBOdW1iZXIuTUFYX1ZBTFVFO1xufTtcblxuZXhwb3J0cy50b3RhbG1lbSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gTnVtYmVyLk1BWF9WQUxVRTtcbn07XG5cbmV4cG9ydHMuY3B1cyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdIH07XG5cbmV4cG9ydHMudHlwZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdCcm93c2VyJyB9O1xuXG5leHBvcnRzLnJlbGVhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IuYXBwVmVyc2lvbjtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufTtcblxuZXhwb3J0cy5uZXR3b3JrSW50ZXJmYWNlc1xuPSBleHBvcnRzLmdldE5ldHdvcmtJbnRlcmZhY2VzXG49IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHt9IH07XG5cbmV4cG9ydHMuYXJjaCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdqYXZhc2NyaXB0JyB9O1xuXG5leHBvcnRzLnBsYXRmb3JtID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJ2Jyb3dzZXInIH07XG5cbmV4cG9ydHMudG1wZGlyID0gZXhwb3J0cy50bXBEaXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICcvdG1wJztcbn07XG5cbmV4cG9ydHMuRU9MID0gJ1xcbic7XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xuZXhwb3J0cy5mb3JtYXQgPSBmdW5jdGlvbihmKSB7XG4gIGlmICghaXNTdHJpbmcoZikpIHtcbiAgICB2YXIgb2JqZWN0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzLnB1c2goaW5zcGVjdChhcmd1bWVudHNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdHMuam9pbignICcpO1xuICB9XG5cbiAgdmFyIGkgPSAxO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICB2YXIgc3RyID0gU3RyaW5nKGYpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHggPT09ICclJScpIHJldHVybiAnJSc7XG4gICAgaWYgKGkgPj0gbGVuKSByZXR1cm4geDtcbiAgICBzd2l0Y2ggKHgpIHtcbiAgICAgIGNhc2UgJyVzJzogcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWQnOiByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclaic6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xuICBmb3IgKHZhciB4ID0gYXJnc1tpXTsgaSA8IGxlbjsgeCA9IGFyZ3NbKytpXSkge1xuICAgIGlmIChpc051bGwoeCkgfHwgIWlzT2JqZWN0KHgpKSB7XG4gICAgICBzdHIgKz0gJyAnICsgeDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyICs9ICcgJyArIGluc3BlY3QoeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHI7XG59O1xuXG5cbi8vIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4vLyBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuLy8gSWYgLS1uby1kZXByZWNhdGlvbiBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbmV4cG9ydHMuZGVwcmVjYXRlID0gZnVuY3Rpb24oZm4sIG1zZykge1xuICAvLyBBbGxvdyBmb3IgZGVwcmVjYXRpbmcgdGhpbmdzIGluIHRoZSBwcm9jZXNzIG9mIHN0YXJ0aW5nIHVwLlxuICBpZiAoaXNVbmRlZmluZWQoZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLm5vRGVwcmVjYXRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufTtcblxuXG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZpcm9uO1xuZXhwb3J0cy5kZWJ1Z2xvZyA9IGZ1bmN0aW9uKHNldCkge1xuICBpZiAoaXNVbmRlZmluZWQoZGVidWdFbnZpcm9uKSlcbiAgICBkZWJ1Z0Vudmlyb24gPSBwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnO1xuICBzZXQgPSBzZXQudG9VcHBlckNhc2UoKTtcbiAgaWYgKCFkZWJ1Z3Nbc2V0XSkge1xuICAgIGlmIChuZXcgUmVnRXhwKCdcXFxcYicgKyBzZXQgKyAnXFxcXGInLCAnaScpLnRlc3QoZGVidWdFbnZpcm9uKSkge1xuICAgICAgdmFyIHBpZCA9IHByb2Nlc3MucGlkO1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG1zZyA9IGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyVzICVkOiAlcycsIHNldCwgcGlkLCBtc2cpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHt9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVidWdzW3NldF07XG59O1xuXG5cbi8qKlxuICogRWNob3MgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyeXMgdG8gcHJpbnQgdGhlIHZhbHVlIG91dFxuICogaW4gdGhlIGJlc3Qgd2F5IHBvc3NpYmxlIGdpdmVuIHRoZSBkaWZmZXJlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHByaW50IG91dC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSBvdXRwdXQuXG4gKi9cbi8qIGxlZ2FjeTogb2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKi9cbmZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRzKSB7XG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xuICB2YXIgY3R4ID0ge1xuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IHN0eWxpemVOb0NvbG9yXG4gIH07XG4gIC8vIGxlZ2FjeS4uLlxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSBjdHguZGVwdGggPSBhcmd1bWVudHNbMl07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIGN0eC5jb2xvcnMgPSBhcmd1bWVudHNbM107XG4gIGlmIChpc0Jvb2xlYW4ob3B0cykpIHtcbiAgICAvLyBsZWdhY3kuLi5cbiAgICBjdHguc2hvd0hpZGRlbiA9IG9wdHM7XG4gIH0gZWxzZSBpZiAob3B0cykge1xuICAgIC8vIGdvdCBhbiBcIm9wdGlvbnNcIiBvYmplY3RcbiAgICBleHBvcnRzLl9leHRlbmQoY3R4LCBvcHRzKTtcbiAgfVxuICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gIGlmIChpc1VuZGVmaW5lZChjdHguc2hvd0hpZGRlbikpIGN0eC5zaG93SGlkZGVuID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguZGVwdGgpKSBjdHguZGVwdGggPSAyO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmNvbG9ycykpIGN0eC5jb2xvcnMgPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jdXN0b21JbnNwZWN0KSkgY3R4LmN1c3RvbUluc3BlY3QgPSB0cnVlO1xuICBpZiAoY3R4LmNvbG9ycykgY3R4LnN0eWxpemUgPSBzdHlsaXplV2l0aENvbG9yO1xuICByZXR1cm4gZm9ybWF0VmFsdWUoY3R4LCBvYmosIGN0eC5kZXB0aCk7XG59XG5leHBvcnRzLmluc3BlY3QgPSBpbnNwZWN0O1xuXG5cbi8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZSNncmFwaGljc1xuaW5zcGVjdC5jb2xvcnMgPSB7XG4gICdib2xkJyA6IFsxLCAyMl0sXG4gICdpdGFsaWMnIDogWzMsIDIzXSxcbiAgJ3VuZGVybGluZScgOiBbNCwgMjRdLFxuICAnaW52ZXJzZScgOiBbNywgMjddLFxuICAnd2hpdGUnIDogWzM3LCAzOV0sXG4gICdncmV5JyA6IFs5MCwgMzldLFxuICAnYmxhY2snIDogWzMwLCAzOV0sXG4gICdibHVlJyA6IFszNCwgMzldLFxuICAnY3lhbicgOiBbMzYsIDM5XSxcbiAgJ2dyZWVuJyA6IFszMiwgMzldLFxuICAnbWFnZW50YScgOiBbMzUsIDM5XSxcbiAgJ3JlZCcgOiBbMzEsIDM5XSxcbiAgJ3llbGxvdycgOiBbMzMsIDM5XVxufTtcblxuLy8gRG9uJ3QgdXNlICdibHVlJyBub3QgdmlzaWJsZSBvbiBjbWQuZXhlXG5pbnNwZWN0LnN0eWxlcyA9IHtcbiAgJ3NwZWNpYWwnOiAnY3lhbicsXG4gICdudW1iZXInOiAneWVsbG93JyxcbiAgJ2Jvb2xlYW4nOiAneWVsbG93JyxcbiAgJ3VuZGVmaW5lZCc6ICdncmV5JyxcbiAgJ251bGwnOiAnYm9sZCcsXG4gICdzdHJpbmcnOiAnZ3JlZW4nLFxuICAnZGF0ZSc6ICdtYWdlbnRhJyxcbiAgLy8gXCJuYW1lXCI6IGludGVudGlvbmFsbHkgbm90IHN0eWxpbmdcbiAgJ3JlZ2V4cCc6ICdyZWQnXG59O1xuXG5cbmZ1bmN0aW9uIHN0eWxpemVXaXRoQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgdmFyIHN0eWxlID0gaW5zcGVjdC5zdHlsZXNbc3R5bGVUeXBlXTtcblxuICBpZiAoc3R5bGUpIHtcbiAgICByZXR1cm4gJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVswXSArICdtJyArIHN0ciArXG4gICAgICAgICAgICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMV0gKyAnbSc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHN0eWxpemVOb0NvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHJldHVybiBzdHI7XG59XG5cblxuZnVuY3Rpb24gYXJyYXlUb0hhc2goYXJyYXkpIHtcbiAgdmFyIGhhc2ggPSB7fTtcblxuICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uKHZhbCwgaWR4KSB7XG4gICAgaGFzaFt2YWxdID0gdHJ1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGhhc2g7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzKSB7XG4gIC8vIFByb3ZpZGUgYSBob29rIGZvciB1c2VyLXNwZWNpZmllZCBpbnNwZWN0IGZ1bmN0aW9ucy5cbiAgLy8gQ2hlY2sgdGhhdCB2YWx1ZSBpcyBhbiBvYmplY3Qgd2l0aCBhbiBpbnNwZWN0IGZ1bmN0aW9uIG9uIGl0XG4gIGlmIChjdHguY3VzdG9tSW5zcGVjdCAmJlxuICAgICAgdmFsdWUgJiZcbiAgICAgIGlzRnVuY3Rpb24odmFsdWUuaW5zcGVjdCkgJiZcbiAgICAgIC8vIEZpbHRlciBvdXQgdGhlIHV0aWwgbW9kdWxlLCBpdCdzIGluc3BlY3QgZnVuY3Rpb24gaXMgc3BlY2lhbFxuICAgICAgdmFsdWUuaW5zcGVjdCAhPT0gZXhwb3J0cy5pbnNwZWN0ICYmXG4gICAgICAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cbiAgICAgICEodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlID09PSB2YWx1ZSkpIHtcbiAgICB2YXIgcmV0ID0gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMsIGN0eCk7XG4gICAgaWYgKCFpc1N0cmluZyhyZXQpKSB7XG4gICAgICByZXQgPSBmb3JtYXRWYWx1ZShjdHgsIHJldCwgcmVjdXJzZVRpbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG4gIHZhciBwcmltaXRpdmUgPSBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSk7XG4gIGlmIChwcmltaXRpdmUpIHtcbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG5cbiAgLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgdmFyIHZpc2libGVLZXlzID0gYXJyYXlUb0hhc2goa2V5cyk7XG5cbiAgaWYgKGN0eC5zaG93SGlkZGVuKSB7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgfVxuXG4gIC8vIElFIGRvZXNuJ3QgbWFrZSBlcnJvciBmaWVsZHMgbm9uLWVudW1lcmFibGVcbiAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2R3dzUyc2J0KHY9dnMuOTQpLmFzcHhcbiAgaWYgKGlzRXJyb3IodmFsdWUpXG4gICAgICAmJiAoa2V5cy5pbmRleE9mKCdtZXNzYWdlJykgPj0gMCB8fCBrZXlzLmluZGV4T2YoJ2Rlc2NyaXB0aW9uJykgPj0gMCkpIHtcbiAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJywgYXJyYXkgPSBmYWxzZSwgYnJhY2VzID0gWyd7JywgJ30nXTtcblxuICAvLyBNYWtlIEFycmF5IHNheSB0aGF0IHRoZXkgYXJlIEFycmF5XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGFycmF5ID0gdHJ1ZTtcbiAgICBicmFjZXMgPSBbJ1snLCAnXSddO1xuICB9XG5cbiAgLy8gTWFrZSBmdW5jdGlvbnMgc2F5IHRoYXQgdGhleSBhcmUgZnVuY3Rpb25zXG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHZhciBuID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG4gKyAnXSc7XG4gIH1cblxuICAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcbiAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGVycm9yIHdpdGggbWVzc2FnZSBmaXJzdCBzYXkgdGhlIGVycm9yXG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgJiYgKCFhcnJheSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIGlmIChyZWN1cnNlVGltZXMgPCAwKSB7XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG5cbiAgdmFyIG91dHB1dDtcbiAgaWYgKGFycmF5KSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSk7XG4gICAgfSk7XG4gIH1cblxuICBjdHguc2Vlbi5wb3AoKTtcblxuICByZXR1cm4gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKSB7XG4gIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YXIgc2ltcGxlID0gJ1xcJycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkucmVwbGFjZSgvXlwifFwiJC9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykgKyAnXFwnJztcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoc2ltcGxlLCAnc3RyaW5nJyk7XG4gIH1cbiAgaWYgKGlzTnVtYmVyKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ251bWJlcicpO1xuICBpZiAoaXNCb29sZWFuKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ2Jvb2xlYW4nKTtcbiAgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGVvZiBudWxsIGlzIFwib2JqZWN0XCIsIHNvIHNwZWNpYWwgY2FzZSBoZXJlLlxuICBpZiAoaXNOdWxsKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ251bGwnLCAnbnVsbCcpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEVycm9yKHZhbHVlKSB7XG4gIHJldHVybiAnWycgKyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgKyAnXSc7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KHZhbHVlLCBTdHJpbmcoaSkpKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIFN0cmluZyhpKSwgdHJ1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuICB9XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoIWtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAga2V5LCB0cnVlKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lLCBzdHIsIGRlc2M7XG4gIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpIHx8IHsgdmFsdWU6IHZhbHVlW2tleV0gfTtcbiAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlci9TZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoIWhhc093blByb3BlcnR5KHZpc2libGVLZXlzLCBrZXkpKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpIDwgMCkge1xuICAgICAgaWYgKGlzTnVsbChyZWN1cnNlVGltZXMpKSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIHJlY3Vyc2VUaW1lcyAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS5zdWJzdHIoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSwgbmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnbmFtZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xufVxuXG5cbmZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKSB7XG4gIHZhciBudW1MaW5lc0VzdCA9IDA7XG4gIHZhciBsZW5ndGggPSBvdXRwdXQucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGN1cikge1xuICAgIG51bUxpbmVzRXN0Kys7XG4gICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSBudW1MaW5lc0VzdCsrO1xuICAgIHJldHVybiBwcmV2ICsgY3VyLnJlcGxhY2UoL1xcdTAwMWJcXFtcXGRcXGQ/bS9nLCAnJykubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArXG4gICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBvdXRwdXQuam9pbignLFxcbiAgJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufVxuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5mdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiBpc09iamVjdChlKSAmJlxuICAgICAgKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gcmVxdWlyZSgnLi9zdXBwb3J0L2lzQnVmZmVyJyk7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cblxuXG5mdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gbiA8IDEwID8gJzAnICsgbi50b1N0cmluZygxMCkgOiBuLnRvU3RyaW5nKDEwKTtcbn1cblxuXG52YXIgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsXG4gICAgICAgICAgICAgICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG4vLyAyNiBGZWIgMTY6MTk6MzRcbmZ1bmN0aW9uIHRpbWVzdGFtcCgpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgdGltZSA9IFtwYWQoZC5nZXRIb3VycygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0TWludXRlcygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO1xuICByZXR1cm4gW2QuZ2V0RGF0ZSgpLCBtb250aHNbZC5nZXRNb250aCgpXSwgdGltZV0uam9pbignICcpO1xufVxuXG5cbi8vIGxvZyBpcyBqdXN0IGEgdGhpbiB3cmFwcGVyIHRvIGNvbnNvbGUubG9nIHRoYXQgcHJlcGVuZHMgYSB0aW1lc3RhbXBcbmV4cG9ydHMubG9nID0gZnVuY3Rpb24oKSB7XG4gIGNvbnNvbGUubG9nKCclcyAtICVzJywgdGltZXN0YW1wKCksIGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cykpO1xufTtcblxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlci5cbiAqXG4gKiBUaGUgRnVuY3Rpb24ucHJvdG90eXBlLmluaGVyaXRzIGZyb20gbGFuZy5qcyByZXdyaXR0ZW4gYXMgYSBzdGFuZGFsb25lXG4gKiBmdW5jdGlvbiAobm90IG9uIEZ1bmN0aW9uLnByb3RvdHlwZSkuIE5PVEU6IElmIHRoaXMgZmlsZSBpcyB0byBiZSBsb2FkZWRcbiAqIGR1cmluZyBib290c3RyYXBwaW5nIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmV3cml0dGVuIHVzaW5nIHNvbWUgbmF0aXZlXG4gKiBmdW5jdGlvbnMgYXMgcHJvdG90eXBlIHNldHVwIHVzaW5nIG5vcm1hbCBKYXZhU2NyaXB0IGRvZXMgbm90IHdvcmsgYXNcbiAqIGV4cGVjdGVkIGR1cmluZyBib290c3RyYXBwaW5nIChzZWUgbWlycm9yLmpzIGluIHIxMTQ5MDMpLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gd2hpY2ggbmVlZHMgdG8gaW5oZXJpdCB0aGVcbiAqICAgICBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gdG8gaW5oZXJpdCBwcm90b3R5cGUgZnJvbS5cbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuX2V4dGVuZCA9IGZ1bmN0aW9uKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG4gIHJldHVybiBvcmlnaW47XG59O1xuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKiBnbG9iYWwgZ2xvYmFsOiBmYWxzZSAqL1xuLyogZ2xvYmFsIFhNTEh0dHBSZXF1ZXN0OiBmYWxzZSAqL1xuXG52YXIgdGVtcGxhdGVMb2FkZXIgPSByZXF1aXJlKCcuL3RlbXBsYXRlLWxvYWRlci5qcycpO1xudmFyIGNvbnNvbGUgPSByZXF1aXJlKFwiY29uc29sZVwiKTtcbnZhciBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcbnZhciAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbnJlcXVpcmUoXCIuL2tvLWJpbmRpbmdzLmpzXCIpO1xudmFyIHBlcmZvcm1hbmNlQXdhcmVDYWxsZXIgPSByZXF1aXJlKFwiLi90aW1lZC1jYWxsLmpzXCIpLnRpbWVkQ2FsbDtcblxudmFyIGFkZFVuZG9TdGFja0V4dGVuc2lvbk1ha2VyID0gcmVxdWlyZShcIi4vdW5kb21hbmFnZXIvdW5kb21haW4uanNcIik7XG52YXIgY29sb3JQbHVnaW4gPSByZXF1aXJlKFwiLi9leHQvY29sb3IuanNcIik7XG52YXIgaW5saW5lclBsdWdpbiA9IHJlcXVpcmUoXCIuL2V4dC9pbmxpbmVyLmpzXCIpO1xuXG52YXIgbG9jYWxTdG9yYWdlTG9hZGVyID0gcmVxdWlyZShcIi4vZXh0L2xvY2Fsc3RvcmFnZS5qc1wiKTtcblxuaWYgKHR5cGVvZiBrbyA9PSAndW5kZWZpbmVkJykgdGhyb3cgXCJDYW5ub3QgZmluZCBrbm9ja291dC5qcyBsaWJyYXJ5IVwiO1xuaWYgKHR5cGVvZiAkID09ICd1bmRlZmluZWQnKSB0aHJvdyBcIkNhbm5vdCBmaW5kIGpxdWVyeSBsaWJyYXJ5IVwiO1xuXG5mdW5jdGlvbiBfY2Fub25pY2FsaXplKHVybCkge1xuICB2YXIgZGl2ID0gZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBkaXYuaW5uZXJIVE1MID0gXCI8YT48L2E+XCI7XG4gIGRpdi5maXJzdENoaWxkLmhyZWYgPSB1cmw7IC8vIEVuc3VyZXMgdGhhdCB0aGUgaHJlZiBpcyBwcm9wZXJseSBlc2NhcGVkXG4gIGRpdi5pbm5lckhUTUwgPSBkaXYuaW5uZXJIVE1MOyAvLyBSdW4gdGhlIGN1cnJlbnQgaW5uZXJIVE1MIGJhY2sgdGhyb3VnaCB0aGUgcGFyc2VyXG4gIHJldHVybiBkaXYuZmlyc3RDaGlsZC5ocmVmO1xufVxuXG52YXIgYXBwbHlCaW5kaW5nT3B0aW9ucyA9IGZ1bmN0aW9uKG9wdGlvbnMsIGtvKSB7XG4gIC8vIHB1c2ggXCJjb252ZXJ0ZWRVcmxcIiBtZXRob2QgdG8gdGhlIHd5c2l3eWdTcmMgYmluZGluZ1xuICBrby5iaW5kaW5nSGFuZGxlcnMud3lzaXd5Z1NyYy5jb252ZXJ0ZWRVcmwgPSBmdW5jdGlvbihzcmMsIG1ldGhvZCwgd2lkdGgsIGhlaWdodCkge1xuICAgIHZhciBpbWdQcm9jZXNzb3JCYWNrZW5kID0gb3B0aW9ucy5pbWdQcm9jZXNzb3JCYWNrZW5kID8gb3B0aW9ucy5pbWdQcm9jZXNzb3JCYWNrZW5kIDogJy4vdXBsb2FkJztcbiAgICB2YXIgYmFja0VuZE1hdGNoID0gaW1nUHJvY2Vzc29yQmFja2VuZC5tYXRjaCgvXihodHRwcz86XFwvXFwvW15cXC9dKlxcLykuKiQvKTtcbiAgICB2YXIgc3JjTWF0Y2ggPSBzcmMubWF0Y2goL14oaHR0cHM/OlxcL1xcL1teXFwvXSpcXC8pLiokLyk7XG4gICAgaWYgKGJhY2tFbmRNYXRjaCA9PT0gbnVsbCB8fCAoc3JjTWF0Y2ggIT09IG51bGwgJiYgYmFja0VuZE1hdGNoWzFdID09IHNyY01hdGNoWzFdKSkge1xuICAgICAgdmFyIHF1ZXJ5UGFyYW1TZXBhcmF0b3IgPSBpbWdQcm9jZXNzb3JCYWNrZW5kLmluZGV4T2YoJz8nKSA9PSAtMSA/ICc/JyA6ICcmJztcbiAgICAgIHJldHVybiBpbWdQcm9jZXNzb3JCYWNrZW5kICsgcXVlcnlQYXJhbVNlcGFyYXRvciArIFwic3JjPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHNyYykgKyBcIiZtZXRob2Q9XCIgKyBlbmNvZGVVUklDb21wb25lbnQobWV0aG9kKSArIFwiJnBhcmFtcz1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh3aWR0aCArIFwiLFwiICsgaGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coXCJDYW5ub3QgYXBwbHkgYmFja2VuZCBpbWFnZSByZXNpemluZyB0byBub24tbG9jYWwgcmVzb3VyY2VzIFwiLCBzcmMsIG1ldGhvZCwgd2lkdGgsIGhlaWdodCwgYmFja0VuZE1hdGNoLCBzcmNNYXRjaCk7XG4gICAgICByZXR1cm4gc3JjICsgXCI/bWV0aG9kPVwiICsgbWV0aG9kICsgXCImd2lkdGg9XCIgKyB3aWR0aCArIChoZWlnaHQgIT09IG51bGwgPyBcIiZoZWlnaHQ9XCIgKyBoZWlnaHQgOiAnJyk7XG4gICAgfVxuICB9O1xuXG4gIGtvLmJpbmRpbmdIYW5kbGVycy53eXNpd3lnU3JjLnBsYWNlaG9sZGVyVXJsID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCwgdGV4dCkge1xuICAgIHJldHVybiBvcHRpb25zLmltZ1Byb2Nlc3NvckJhY2tlbmQgKyBcIj9tZXRob2Q9XCIgKyAncGxhY2Vob2xkZXInICsgXCImcGFyYW1zPVwiICsgd2lkdGggKyBlbmNvZGVVUklDb21wb25lbnQoXCIsXCIpICsgaGVpZ2h0O1xuICB9O1xuXG4gIC8vIHB1c2hlcyBjdXN0b20gdGlueW1jZSBjb25maWd1cmF0aW9ucyBmcm9tIG9wdGlvbnMgdG8gdGhlIGJpbmRpbmdcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy50aW55bWNlQ29uZmlnKVxuICAgIGtvLmJpbmRpbmdIYW5kbGVycy53eXNpd3lnLnN0YW5kYXJkT3B0aW9ucyA9IG9wdGlvbnMudGlueW1jZUNvbmZpZztcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy50aW55bWNlQ29uZmlnRnVsbClcbiAgICBrby5iaW5kaW5nSGFuZGxlcnMud3lzaXd5Zy5mdWxsT3B0aW9ucyA9IG9wdGlvbnMudGlueW1jZUNvbmZpZ0Z1bGw7XG59O1xuXG52YXIgc3RhcnQgPSBmdW5jdGlvbihvcHRpb25zLCB0ZW1wbGF0ZUZpbGUsIHRlbXBsYXRlTWV0YWRhdGEsIGpzb3Jqc29uLCBjdXN0b21FeHRlbnNpb25zKSB7XG5cblxuXG4gIHRlbXBsYXRlTG9hZGVyLmZpeFBhZ2VFdmVudHMoKTtcblxuICB2YXIgZmlsZVVwbG9hZE1lc3NhZ2VzRXh0ZW5zaW9uID0gZnVuY3Rpb24odm0pIHtcbiAgICB2YXIgZmlsZXVwbG9hZENvbmZpZyA9IHtcbiAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIHVua25vd25FcnJvcjogdm0udCgnVW5rbm93biBlcnJvcicpLFxuICAgICAgICB1cGxvYWRlZEJ5dGVzOiB2bS50KCdVcGxvYWRlZCBieXRlcyBleGNlZWQgZmlsZSBzaXplJyksXG4gICAgICAgIG1heE51bWJlck9mRmlsZXM6IHZtLnQoJ01heGltdW0gbnVtYmVyIG9mIGZpbGVzIGV4Y2VlZGVkJyksXG4gICAgICAgIGFjY2VwdEZpbGVUeXBlczogdm0udCgnRmlsZSB0eXBlIG5vdCBhbGxvd2VkJyksXG4gICAgICAgIG1heEZpbGVTaXplOiB2bS50KCdGaWxlIGlzIHRvbyBsYXJnZScpLFxuICAgICAgICBtaW5GaWxlU2l6ZTogdm0udCgnRmlsZSBpcyB0b28gc21hbGwnKSxcbiAgICAgICAgcG9zdF9tYXhfc2l6ZTogdm0udCgnVGhlIHVwbG9hZGVkIGZpbGUgZXhjZWVkcyB0aGUgcG9zdF9tYXhfc2l6ZSBkaXJlY3RpdmUgaW4gcGhwLmluaScpLFxuICAgICAgICBtYXhfZmlsZV9zaXplOiB2bS50KCdGaWxlIGlzIHRvbyBiaWcnKSxcbiAgICAgICAgbWluX2ZpbGVfc2l6ZTogdm0udCgnRmlsZSBpcyB0b28gc21hbGwnKSxcbiAgICAgICAgYWNjZXB0X2ZpbGVfdHlwZXM6IHZtLnQoJ0ZpbGV0eXBlIG5vdCBhbGxvd2VkJyksXG4gICAgICAgIG1heF9udW1iZXJfb2ZfZmlsZXM6IHZtLnQoJ01heGltdW0gbnVtYmVyIG9mIGZpbGVzIGV4Y2VlZGVkJyksXG4gICAgICAgIG1heF93aWR0aDogdm0udCgnSW1hZ2UgZXhjZWVkcyBtYXhpbXVtIHdpZHRoJyksXG4gICAgICAgIG1pbl93aWR0aDogdm0udCgnSW1hZ2UgcmVxdWlyZXMgYSBtaW5pbXVtIHdpZHRoJyksXG4gICAgICAgIG1heF9oZWlnaHQ6IHZtLnQoJ0ltYWdlIGV4Y2VlZHMgbWF4aW11bSBoZWlnaHQnKSxcbiAgICAgICAgbWluX2hlaWdodDogdm0udCgnSW1hZ2UgcmVxdWlyZXMgYSBtaW5pbXVtIGhlaWdodCcpLFxuICAgICAgICBhYm9ydDogdm0udCgnRmlsZSB1cGxvYWQgYWJvcnRlZCcpLFxuICAgICAgICBpbWFnZV9yZXNpemU6IHZtLnQoJ0ZhaWxlZCB0byByZXNpemUgaW1hZ2UnKSxcbiAgICAgICAgZ2VuZXJpYzogdm0udCgnVW5leHBlY3RlZCB1cGxvYWQgZXJyb3InKVxuICAgICAgfVxuICAgIH07XG4gICAgLy8gZmlsZVVwbG9hZCBvcHRpb25zLlxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZmlsZXVwbG9hZENvbmZpZylcbiAgICAgIGZpbGV1cGxvYWRDb25maWcgPSAkLmV4dGVuZCh0cnVlLCBmaWxldXBsb2FkQ29uZmlnLCBvcHRpb25zLmZpbGV1cGxvYWRDb25maWcpO1xuXG4gICAga28uYmluZGluZ0hhbmRsZXJzWydmaWxldXBsb2FkJ10uZXh0ZW5kT3B0aW9ucyA9IGZpbGV1cGxvYWRDb25maWc7XG5cbiAgfTtcblxuICB2YXIgc2ltcGxlVHJhbnNsYXRpb25QbHVnaW4gPSBmdW5jdGlvbih2bSkge1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc3RyaW5ncykge1xuICAgICAgdm0udCA9IGZ1bmN0aW9uKGtleSwgb2JqUGFyYW0pIHtcbiAgICAgICAgdmFyIHJlcyA9IG9wdGlvbnMuc3RyaW5nc1trZXldO1xuICAgICAgICBpZiAodHlwZW9mIHJlcyA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIk1pc3NpbmcgdHJhbnNsYXRpb24gc3RyaW5nIGZvclwiLGtleSxcIjogdXNpbmcgZGVmYXVsdCBzdHJpbmdcIik7XG4gICAgICAgICAgcmVzID0ga2V5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2bS50dChyZXMsIG9ialBhcmFtKTtcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIC8vIHNpbXBsZVRyYW5zbGF0aW9uUGx1Z2luIG11c3QgYmUgYmVmb3JlIHRoZSB1bmRvU3RhY2sgdG8gdHJhbnNsYXRlIHVuZG8vcmVkbyBsYWJlbHNcbiAgdmFyIGV4dGVuc2lvbnMgPSBbc2ltcGxlVHJhbnNsYXRpb25QbHVnaW4sIGFkZFVuZG9TdGFja0V4dGVuc2lvbk1ha2VyKHBlcmZvcm1hbmNlQXdhcmVDYWxsZXIpLCBjb2xvclBsdWdpbiwgaW5saW5lclBsdWdpbl07XG4gIGlmICh0eXBlb2YgY3VzdG9tRXh0ZW5zaW9ucyAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBjdXN0b21FeHRlbnNpb25zLmxlbmd0aDsgaysrKSBleHRlbnNpb25zLnB1c2goY3VzdG9tRXh0ZW5zaW9uc1trXSk7XG4gIGV4dGVuc2lvbnMucHVzaChmaWxlVXBsb2FkTWVzc2FnZXNFeHRlbnNpb24pO1xuXG4gIHZhciBnYWxsZXJ5VXJsID0gb3B0aW9ucy5maWxldXBsb2FkQ29uZmlnID8gb3B0aW9ucy5maWxldXBsb2FkQ29uZmlnLnVybCA6ICcvdXBsb2FkLyc7XG4gIGFwcGx5QmluZGluZ09wdGlvbnMob3B0aW9ucywga28pO1xuXG4gIC8vIFRPRE8gd2hhdCBhYm91dCBhcHBlbmRpbmcgdG8gYW5vdGhlciBlbGVtZW50P1xuICAkKFwiPCEtLSBrbyB0ZW1wbGF0ZTogJ21haW4nIC0tPjwhLS0gL2tvIC0tPlwiKS5hcHBlbmRUbyhnbG9iYWwuZG9jdW1lbnQuYm9keSk7XG5cbiAgLy8gdGVtcGxhdGVGaWxlIG1heSBvdmVycmlkZSB0aGUgdGVtcGxhdGUgcGF0aCBpbiB0ZW1wbGF0ZU1ldGFkYXRhXG4gIGlmICh0eXBlb2YgdGVtcGxhdGVGaWxlID09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB0ZW1wbGF0ZU1ldGFkYXRhICE9ICd1bmRlZmluZWQnKSB7XG4gICAgdGVtcGxhdGVGaWxlID0gdGVtcGxhdGVNZXRhZGF0YS50ZW1wbGF0ZTtcbiAgfVxuICAvLyBUT0RPIGNhbm9uaWNhbGl6ZSB0ZW1wbGF0ZUZpbGUgdG8gYWJzb2x1dGUgb3IgcmVsYXRpdmUgZGVwZW5kaW5nIG9uIFwicmVsYXRpdmVVcmxzRXhjZXB0aW9uXCIgcGx1Z2luXG5cbiAgdGVtcGxhdGVMb2FkZXIubG9hZChwZXJmb3JtYW5jZUF3YXJlQ2FsbGVyLCB0ZW1wbGF0ZUZpbGUsIHRlbXBsYXRlTWV0YWRhdGEsIGpzb3Jqc29uLCBleHRlbnNpb25zLCBnYWxsZXJ5VXJsKTtcblxufTtcblxudmFyIGluaXRGcm9tTG9jYWxTdG9yYWdlID0gZnVuY3Rpb24ob3B0aW9ucywgaGFzaF9rZXksIGN1c3RvbUV4dGVuc2lvbnMpIHtcbiAgdHJ5IHtcbiAgICB2YXIgbHNEYXRhID0gbG9jYWxTdG9yYWdlTG9hZGVyKGhhc2hfa2V5LCBvcHRpb25zLmVtYWlsUHJvY2Vzc29yQmFja2VuZCk7XG4gICAgdmFyIGV4dGVuc2lvbnMgPSB0eXBlb2YgY3VzdG9tRXh0ZW5zaW9ucyAhPT0gJ3VuZGVmaW5lZCcgPyBjdXN0b21FeHRlbnNpb25zIDogW107XG4gICAgZXh0ZW5zaW9ucy5wdXNoKGxzRGF0YS5leHRlbnNpb24pO1xuICAgIHZhciB0ZW1wbGF0ZSA9IF9jYW5vbmljYWxpemUobHNEYXRhLm1ldGFkYXRhLnRlbXBsYXRlKTtcbiAgICBzdGFydChvcHRpb25zLCB0ZW1wbGF0ZSwgbHNEYXRhLm1ldGFkYXRhLCBsc0RhdGEubW9kZWwsIGV4dGVuc2lvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihcIlRPRE8gbm90IGZvdW5kIFwiLCBoYXNoX2tleSwgZSk7XG4gIH1cbn07XG5cbnZhciBpbml0ID0gZnVuY3Rpb24ob3B0aW9ucywgY3VzdG9tRXh0ZW5zaW9ucykge1xuXG4gIHZhciBoYXNoID0gZ2xvYmFsLmxvY2F0aW9uLmhhc2ggPyBnbG9iYWwubG9jYXRpb24uaHJlZi5zcGxpdChcIiNcIilbMV0gOiB1bmRlZmluZWQ7XG5cbiAgLy8gTG9hZGluZyBmcm9tIGNvbmZpZ3VyZWQgdGVtcGxhdGUgb3IgY29uZmlndXJlZCBtZXRhZGF0YVxuICBpZiAob3B0aW9ucyAmJiAob3B0aW9ucy50ZW1wbGF0ZSB8fCBvcHRpb25zLmRhdGEpKSB7XG4gICAgaWYgKG9wdGlvbnMuZGF0YSkge1xuICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKG9wdGlvbnMuZGF0YSk7XG4gICAgICBzdGFydChvcHRpb25zLCB1bmRlZmluZWQsIGRhdGEubWV0YWRhdGEsIGRhdGEuY29udGVudCwgY3VzdG9tRXh0ZW5zaW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0KG9wdGlvbnMsIG9wdGlvbnMudGVtcGxhdGUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjdXN0b21FeHRlbnNpb25zKTtcbiAgICB9XG4gICAgLy8gTG9hZGluZyBmcm9tIExvY2FsU3RvcmFnZSAoaWYgdXJsIGhhc2ggaGFzIGEgN2NoYXJzIGtleSlcbiAgfSBlbHNlIGlmIChoYXNoICYmIGhhc2gubGVuZ3RoID09IDcpIHtcbiAgICBpbml0RnJvbUxvY2FsU3RvcmFnZShvcHRpb25zLCBoYXNoLCBjdXN0b21FeHRlbnNpb25zKTtcbiAgICAvLyBMb2FkaW5nIGZyb20gdGVtcGxhdGUgdXJsIGFzIGhhc2ggKGlmIGhhc2ggaXMgbm90IGEgdmFsaWQgbG9jYWxzdG9yYWdlIGtleSlcbiAgfSBlbHNlIGlmIChoYXNoKSB7XG4gICAgc3RhcnQob3B0aW9ucywgX2Nhbm9uaWNhbGl6ZShoYXNoKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGN1c3RvbUV4dGVuc2lvbnMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0NvbXBhdGlibGU6IHRlbXBsYXRlTG9hZGVyLmlzQ29tcGF0aWJsZSxcbiAgaW5pdDogaW5pdCxcbiAgc3RhcnQ6IHN0YXJ0XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XG52YXIgY29uc29sZSA9IHJlcXVpcmUoXCJjb25zb2xlXCIpO1xuXG4vLyBAc2VlIGFsc28gc2NyaXB0LXRlbXBsYXRlLmpzIHB1c2hUZW1wbGF0ZVxudmFyIGFkZFNjcmlwdFRlbXBsYXRlID0gZnVuY3Rpb24oZG9jLCB0ZW1wbGF0ZU5hbWUsIHRlbXBsYXRlTWFya3VwKSB7XG4gIHZhciBzY3JpcHRUYWcgPSBkb2MuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gIHNjcmlwdFRhZy5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9odG1sJyk7XG4gIHNjcmlwdFRhZy5zZXRBdHRyaWJ1dGUoJ2lkJywgdGVtcGxhdGVOYW1lKTtcbiAgc2NyaXB0VGFnLnRleHQgPSB0ZW1wbGF0ZU1hcmt1cDtcbiAgZG9jLmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0VGFnKTtcbiAgcmV0dXJuIHNjcmlwdFRhZztcbiAgLy8gJCgnPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCI+PC9zYycgKyAncmlwdD4nKS50ZXh0KHRlbXBsYXRlTWFya3VwKS5hdHRyKCdpZCcsIHRlbXBsYXRlTmFtZSkuYXBwZW5kVG8oJCgnYm9keScpKTtcbn07XG5cbi8vIHVzZWQgZm9yIGxpdmUgcHJldmlldyBpbiBpZnJhbWUuXG5rby5iaW5kaW5nSGFuZGxlcnMuYmluZElmcmFtZSA9IHtcbiAgLy8gdHBsIHdpbGwgYmUgb3ZlcnJpZGVuIHdpdGggdGhlIHN0cnVjdHVyZSBwYXJzZWQgYnkgdGhlIGlucHV0IHRlbXBsYXRlLlxuICB0cGw6IFwiPCFET0NUWVBFIGh0bWw+XFxyXFxuPGh0bWw+XFxyXFxuPGhlYWQ+XFxyXFxuPC9oZWFkPlxcclxcbjxib2R5PjxkaXYgZGF0YS1iaW5kPVxcXCJibG9jazogY29udGVudFxcXCI+PC9kaXY+PC9ib2R5PlxcclxcbjwvaHRtbD5cXHJcXG5cIixcbiAgaW5pdDogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xuICAgIGZ1bmN0aW9uIGJpbmRJZnJhbWUobG9jYWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBpZnJhbWUgPSBlbGVtZW50LmNvbnRlbnREb2N1bWVudDtcbiAgICAgICAgaWZyYW1lLm9wZW4oKTtcbiAgICAgICAgaWZyYW1lLndyaXRlKGtvLmJpbmRpbmdIYW5kbGVycy5iaW5kSWZyYW1lLnRwbCk7XG4gICAgICAgIGlmcmFtZS5jbG9zZSgpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIGlmcmFtZWRvYyA9IGlmcmFtZS5ib2R5O1xuICAgICAgICAgIGlmIChpZnJhbWVkb2MpIHtcbiAgICAgICAgICAgIC8vIHNjcmlwdHMgaGF2ZSB0byBiZSBkdXBsaWNhdGVkIChtYXliZSB0aGlzIGlzIG5vdCBuZWVkZWQgYW55bW9yZSBzaW5jZSB1c2luZyBzdHJpbmctdGVtcGxhdGVzKVxuICAgICAgICAgICAgdmFyIHRlbXBsYXRlcyA9IGVsZW1lbnQuY29udGVudFdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlc1tpXS5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSA9PSAndGV4dC9odG1sJyAmJiB0ZW1wbGF0ZXNbaV0uZ2V0QXR0cmlidXRlKCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgYWRkU2NyaXB0VGVtcGxhdGUoaWZyYW1lLCB0ZW1wbGF0ZXNbaV0uZ2V0QXR0cmlidXRlKCdpZCcpLCB0ZW1wbGF0ZXNbaV0uaW5uZXJIVE1MKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgaHRtbCA9IGlmcmFtZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcIkhUTUxcIik7XG5cbiAgICAgICAgICAgIGtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbC5hZGREaXNwb3NlQ2FsbGJhY2soZWxlbWVudCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGtvLmNsZWFuTm9kZShodG1sWzBdIHx8IGlmcmFtZWRvYyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAga28uYXBwbHlCaW5kaW5ncyh2YWx1ZUFjY2Vzc29yKCksIGh0bWxbMF0gfHwgaWZyYW1lZG9jKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJubyBpZnJhbWVkb2NcIiwgbG9jYWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3IgcmVhZGluZyBpZnJhbWUuYm9keVwiLCBlLCBsb2NhbCk7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIHJlYWRpbmcgaWZyYW1lIGNvbnRlbnREb2N1bWVudFwiLCBlLCBsb2NhbCk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICAgIC8vIGlnbm9yZWRcbiAgICAgIH1cbiAgICB9XG4gICAgYmluZElmcmFtZShcImZpcnN0IGNhbGxcIik7XG4gICAgLy8gb2xkZXIgYnJvd3NlcnMgbmVlZGVkIHRoaXNcbiAgICAvLyBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCAnbG9hZCcsIGJpbmRJZnJhbWUpO1xuICB9XG59OyIsIlwidXNlIHN0cmljdFwiO1xuLyogZ2xvYmFscyBnbG9iYWw6ZmFsc2UgKi9cblxudmFyIGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xudmFyIGNvbnNvbGUgPSByZXF1aXJlKFwiY29uc29sZVwiKTtcblxuXG5rby5iaW5kaW5nSGFuZGxlcnNbJ3dpdGhQcm9wZXJ0aWVzJ10gPSB7XG4gIGluaXQ6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgLy8gTWFrZSBhIG1vZGlmaWVkIGJpbmRpbmcgY29udGV4dCwgd2l0aCBhIGV4dHJhIHByb3BlcnRpZXMsIGFuZCBhcHBseSBpdCB0byBkZXNjZW5kYW50IGVsZW1lbnRzXG4gICAgdmFyIGNoaWxkQmluZGluZ0NvbnRleHQgPSBiaW5kaW5nQ29udGV4dC5jcmVhdGVDaGlsZENvbnRleHQoXG4gICAgICBiaW5kaW5nQ29udGV4dC4kcmF3RGF0YSxcbiAgICAgIG51bGwsIC8vIE9wdGlvbmFsbHksIHBhc3MgYSBzdHJpbmcgaGVyZSBhcyBhbiBhbGlhcyBmb3IgdGhlIGRhdGEgaXRlbSBpbiBkZXNjZW5kYW50IGNvbnRleHRzXG4gICAgICBmdW5jdGlvbihjb250ZXh0KSB7XG4gICAgICAgIGtvLnV0aWxzLmV4dGVuZChjb250ZXh0LCB2YWx1ZUFjY2Vzc29yKCkpO1xuICAgICAgfVxuICAgICk7XG4gICAga28uYXBwbHlCaW5kaW5nc1RvRGVzY2VuZGFudHMoY2hpbGRCaW5kaW5nQ29udGV4dCwgZWxlbWVudCk7XG5cbiAgICAvLyBBbHNvIHRlbGwgS08gKm5vdCogdG8gYmluZCB0aGUgZGVzY2VuZGFudHMgaXRzZWxmLCBvdGhlcndpc2UgdGhleSB3aWxsIGJlIGJvdW5kIHR3aWNlXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzOiB0cnVlXG4gICAgfTtcbiAgfVxufTtcbmtvLnZpcnR1YWxFbGVtZW50cy5hbGxvd2VkQmluZGluZ3NbJ3dpdGhQcm9wZXJ0aWVzJ10gPSB0cnVlO1xuXG5rby5iaW5kaW5nSGFuZGxlcnNbJ2xvZyddID0ge1xuICBpbml0OiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xuICAgIGNvbnNvbGUubG9nKFwibG9nXCIsIHZhbHVlQWNjZXNzb3IoKSk7XG4gIH1cbn07XG5cblxua28uYmluZGluZ0hhbmRsZXJzWydibG9jayddID0ge1xuXG4gIHRlbXBsYXRlRXhpc3RzOiBmdW5jdGlvbihpZCkge1xuICAgIHZhciBlbCA9IGdsb2JhbC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKGVsKSByZXR1cm4gdHJ1ZTtcbiAgICBlbHNlIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICBfY2hvb3NlVGVtcGxhdGU6IGZ1bmN0aW9uKGlzQXJyYXksIHByZWZpeCwgYWN0aW9uLCBmYWxsYmFjaykge1xuICAgIHZhciBpZCA9IHByZWZpeCArICctJyArIGFjdGlvbjtcbiAgICBpZiAoa28uYmluZGluZ0hhbmRsZXJzWydibG9jayddLnRlbXBsYXRlRXhpc3RzKGlkKSkgcmV0dXJuIGlkO1xuICAgIGlmICh0eXBlb2YgZmFsbGJhY2sgIT0gJ3VuZGVmaW5lZCcgJiYgZmFsbGJhY2sgIT09IG51bGwpIHJldHVybiBrby5iaW5kaW5nSGFuZGxlcnNbJ2Jsb2NrJ10uX2Nob29zZVRlbXBsYXRlKGlzQXJyYXksIHByZWZpeCwgZmFsbGJhY2spO1xuICAgIGVsc2Uge1xuICAgICAgdmFyIGZhbGxCYWNrSWQgPSBpc0FycmF5ID8gJ2FycmF5JyA6ICdvYmplY3QtJyArIGFjdGlvbjtcbiAgICAgIGlmIChrby5iaW5kaW5nSGFuZGxlcnNbJ2Jsb2NrJ10udGVtcGxhdGVFeGlzdHMoZmFsbEJhY2tJZCkpIHJldHVybiBmYWxsQmFja0lkO1xuICAgICAgZWxzZSB0aHJvdyBcImNhbm5vdCBmaW5kIHRlbXBsYXRlIGZvciBcIiArIGlkICsgXCIvXCIgKyBmYWxsQmFja0lkO1xuICAgIH1cbiAgfSxcblxuICAvLyBjb21wdXRlIGRpc3BsYXlNb2RlIGRlcGVuZGluZyBvbiB0ZW1wbGF0ZU1vZGUgc2V0IHVzaW5nIFwid2l0aFByb3BlcnRpZXNcIiBiaW5kaW5nLlxuICBfZGlzcGxheU1vZGU6IGZ1bmN0aW9uKHVud3JhcHBlZCwgYmluZGluZ0NvbnRleHQpIHtcbiAgICB2YXIgcHJlZml4ID0gdHlwZW9mIHVud3JhcHBlZC50eXBlICE9ICd1bmRlZmluZWQnID8ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh1bndyYXBwZWQudHlwZSkgOiAnbm90YWJsb2NrLScgKyB0eXBlb2YodW53cmFwcGVkKTtcbiAgICB2YXIgaXNBcnJheSA9IHR5cGVvZiB1bndyYXBwZWQuc3BsaWNlICE9PSAndW5kZWZpbmVkJztcbiAgICB2YXIgdGVtcGxhdGVNb2RlID0gYmluZGluZ0NvbnRleHQudGVtcGxhdGVNb2RlID8gYmluZGluZ0NvbnRleHQudGVtcGxhdGVNb2RlIDogJ3Nob3cnO1xuICAgIHJldHVybiBrby5iaW5kaW5nSGFuZGxlcnNbJ2Jsb2NrJ10uX2Nob29zZVRlbXBsYXRlKGlzQXJyYXksIHByZWZpeCwgdGVtcGxhdGVNb2RlLCBiaW5kaW5nQ29udGV4dC50ZW1wbGF0ZU1vZGVGYWxsYmFjayk7XG4gIH0sXG5cbiAgX21ha2VUZW1wbGF0ZVZhbHVlQWNjZXNzb3I6IGZ1bmN0aW9uKHZhbHVlQWNjZXNzb3IsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZhbHVlID0gdmFsdWVBY2Nlc3NvcigpLFxuICAgICAgICB1bndyYXBwZWRWYWx1ZSA9IGtvLnV0aWxzLnBlZWtPYnNlcnZhYmxlKHZhbHVlKTsgLy8gVW53cmFwIHdpdGhvdXQgc2V0dGluZyBhIGRlcGVuZGVuY3kgaGVyZVxuXG4gICAgICAvLyBJZiB1bndyYXBwZWRWYWx1ZS5kYXRhIGlzIHRoZSBhcnJheSwgcHJlc2VydmUgYWxsIHJlbGV2YW50IG9wdGlvbnMgYW5kIHVud3JhcCBhZ2FpbiB2YWx1ZSBzbyB3ZSBnZXQgdXBkYXRlc1xuICAgICAgdmFyIG1vZGVsVmFsdWU7XG4gICAgICB2YXIgdGVtcGxhdGU7XG5cbiAgICAgIGlmICgoIXVud3JhcHBlZFZhbHVlKSB8fCAodHlwZW9mIHVud3JhcHBlZFZhbHVlLmRhdGEgIT0gJ29iamVjdCcgJiYgdHlwZW9mIHVud3JhcHBlZFZhbHVlLmRhdGEgIT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgbW9kZWxWYWx1ZSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW9kZWxWYWx1ZSA9IHVud3JhcHBlZFZhbHVlLmRhdGE7XG4gICAgICAgIGlmICh0eXBlb2YgdW53cmFwcGVkVmFsdWUudGVtcGxhdGUgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB2YXIgdGVtcGxhdGVQYXJhbSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodW53cmFwcGVkVmFsdWUudGVtcGxhdGUpO1xuICAgICAgICAgIHZhciB0ZW1wbGF0ZU1vZGUgPSBiaW5kaW5nQ29udGV4dC50ZW1wbGF0ZU1vZGUgPyBiaW5kaW5nQ29udGV4dC50ZW1wbGF0ZU1vZGUgOiAnc2hvdyc7XG4gICAgICAgICAgdGVtcGxhdGUgPSBrby5iaW5kaW5nSGFuZGxlcnNbJ2Jsb2NrJ10uX2Nob29zZVRlbXBsYXRlKGZhbHNlLCB0ZW1wbGF0ZVBhcmFtLCB0ZW1wbGF0ZU1vZGUsIGJpbmRpbmdDb250ZXh0LnRlbXBsYXRlTW9kZUZhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgdW53cmFwcGVkTW9kZWxWYWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUobW9kZWxWYWx1ZSk7XG4gICAgICBpZiAoa28uaXNPYnNlcnZhYmxlKHVud3JhcHBlZE1vZGVsVmFsdWUpKSBjb25zb2xlLmxvZyhcImRvdWJsZU9ic2VydmFibGVcIiwgdW53cmFwcGVkTW9kZWxWYWx1ZSk7XG5cbiAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gTk9URSBJRTggdXNlZCB0byBicmVhayBoZXJlLCBidXQgd2UgZG9uJ3Qgc3VwcG9ydCBpdCBhbnltb3JlLCBzbyBtYXliZSB0aGlzIGlzIG5vdCBuZWVkZWQuXG4gICAgICAgIGlmIChtb2RlbFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0ZW1wbGF0ZSA9ICdlbXB0eSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRlbXBsYXRlID0ga28uYmluZGluZ0hhbmRsZXJzWydibG9jayddLl9kaXNwbGF5TW9kZSh1bndyYXBwZWRNb2RlbFZhbHVlLCBiaW5kaW5nQ29udGV4dCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZSwgdW53cmFwcGVkTW9kZWxWYWx1ZSwgYmluZGluZ0NvbnRleHRbJyRkYXRhJ10sIGJpbmRpbmdDb250ZXh0LnRlbXBsYXRlTW9kZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAnbmFtZSc6IHRlbXBsYXRlLFxuICAgICAgICAnZGF0YSc6IG1vZGVsVmFsdWUsXG4gICAgICAgICd0ZW1wbGF0ZUVuZ2luZSc6IGtvLm5hdGl2ZVRlbXBsYXRlRW5naW5lLmluc3RhbmNlXG4gICAgICB9O1xuICAgIH07XG4gIH0sXG5cbiAgJ2luaXQnOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWVBY2Nlc3NvcigpID09PSAndW5kZWZpbmVkJykgY29uc29sZS5sb2coXCJmb3VuZCBhIG51bGwgYmxvY2s6IGNoZWNrIGVuZGluZyBjb21tYXMgaW4gYXJyYXlzIGRlZnMgaW4gSUVcIik7XG4gICAgdmFyIG5ld1ZhbHVlQWNjZXNzb3IgPSBrby5iaW5kaW5nSGFuZGxlcnNbJ2Jsb2NrJ10uX21ha2VUZW1wbGF0ZVZhbHVlQWNjZXNzb3IodmFsdWVBY2Nlc3NvciwgYmluZGluZ0NvbnRleHQpO1xuICAgIHJldHVybiBrby5iaW5kaW5nSGFuZGxlcnNbJ3RlbXBsYXRlJ11bJ2luaXQnXShlbGVtZW50LCBuZXdWYWx1ZUFjY2Vzc29yKTtcbiAgfSxcbiAgJ3VwZGF0ZSc6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgdmFyIG5ld1ZhbHVlQWNjZXNzb3IgPSBrby5iaW5kaW5nSGFuZGxlcnNbJ2Jsb2NrJ10uX21ha2VUZW1wbGF0ZVZhbHVlQWNjZXNzb3IodmFsdWVBY2Nlc3NvciwgYmluZGluZ0NvbnRleHQpO1xuICAgIHJldHVybiBrby5iaW5kaW5nSGFuZGxlcnNbJ3RlbXBsYXRlJ11bJ3VwZGF0ZSddKGVsZW1lbnQsIG5ld1ZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KTtcbiAgfVxufTtcbmtvLmV4cHJlc3Npb25SZXdyaXRpbmcuYmluZGluZ1Jld3JpdGVWYWxpZGF0b3JzWydibG9jayddID0gZmFsc2U7IC8vIENhbid0IHJld3JpdGUgY29udHJvbCBmbG93IGJpbmRpbmdzXG5rby52aXJ0dWFsRWxlbWVudHMuYWxsb3dlZEJpbmRpbmdzWydibG9jayddID0gdHJ1ZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gc2NyaXB0IHRlbXBsYXRlIGlzIHRoZSBvbmUgcHJvdmlkZWQgYnkgS08gYW5kIGRlYWxzIHdpdGggdGVtcGFsdGVzIGRlZmluZWQgYXMgPHNjcmlwdCB0eXBlPXRleHQvaHRtbC5cbi8vIHN0cmluZyB0ZW1wbGF0ZSBkZWZpbmVzIHRoZW0gaW4gbWVtb3J5IGFuZCBhdm9pZHMgcG9sbHV0aW5nIHRoZSBIVE1MOiBzZWVtcyB0byB3b3JrIGJldHRlciBpbiBNb3NhaWNvLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vc3RyaW5nLXRlbXBsYXRlLmpzJyk7XG4vLyBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vc2NyaXB0LXRlbXBsYXRlLmpzJyk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKiBnbG9iYWwgZ2xvYmFsOiBmYWxzZSAqL1xuXG5yZXF1aXJlKFwiZXZvbC1jb2xvcnBpY2tlclwiKTtcblxudmFyICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xudmFyIGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xudmFyIGtvanF1aSA9IHJlcXVpcmUoXCJrbm9ja291dC1qcXVlcnl1aVwiKTtcblxuXG52YXIgQ29sb3JQaWNrZXIgPSBmdW5jdGlvbigpIHtcbiAga29qcXVpLkJpbmRpbmdIYW5kbGVyLmNhbGwodGhpcywgJ2NvbG9ycGlja2VyJyk7XG59O1xuQ29sb3JQaWNrZXIucHJvdG90eXBlID0ga29qcXVpLnV0aWxzLmNyZWF0ZU9iamVjdChrb2pxdWkuQmluZGluZ0hhbmRsZXIucHJvdG90eXBlKTtcbkNvbG9yUGlja2VyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbG9yUGlja2VyO1xuXG5Db2xvclBpY2tlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzKSB7XG4gIHZhciB2YSA9IHZhbHVlQWNjZXNzb3IoKTtcbiAgdmFyIHZhbHVlID0gdmEuY29sb3I7XG5cbiAgLy8gSW4gb3JkZXIgdG8gaGF2ZSBhIGNvcnJlY3QgZGVwZW5kZW5jeSB0cmFja2luZyBpbiBcImlmU3Vic1wiIHdlIGhhdmUgdG8gZW5zdXJlIHdlIHVzZSBhIHNpbmdsZSBjb21wdXRlciBmb3IgZWFjaCBlZGl0YWJsZVxuICAvLyBwcm9wZXJ0eS4gR2l2ZW4gdGhpcyBiaW5kaW5nIG5lZWRzIDIgb2YgdGhlbSwgd2UgY3JlYXRlIGEgY29tcHV0ZWQgc28gdG8gXCJwcm94eVwiIHRoZSBkZXBlbmRlbmNpZXMuXG4gIHZhciBuZXdETyA9IGtvLmNvbXB1dGVkKHtcbiAgICByZWFkOiB2YWx1ZSxcbiAgICB3cml0ZTogdmFsdWUsXG4gICAgZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkOiBlbGVtZW50XG4gIH0pO1xuICB2YXIgbmV3VkEgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3RE87XG4gIH07XG5cbiAga28uYmluZGluZ0hhbmRsZXJzLnZhbHVlLmluaXQoZWxlbWVudCwgbmV3VkEsIGFsbEJpbmRpbmdzKTtcblxuICB2YXIgY2hhbmdlUHJvcGFnYXRvciA9IGZ1bmN0aW9uKGV2ZW50LCBjb2xvcikge1xuICAgIGlmICh0eXBlb2YgY29sb3IgIT09ICd1bmRlZmluZWQnKSBuZXdETyhjb2xvcik7XG4gIH07XG4gICQoZWxlbWVudCkub24oJ2NoYW5nZS5jb2xvcicsIGNoYW5nZVByb3BhZ2F0b3IpO1xuXG4gIGtvLmNvbXB1dGVkKHtcbiAgICByZWFkOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvcHQgPSB7XG4gICAgICAgIGNvbG9yOiBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKG5ld0RPKSxcbiAgICAgICAgc2hvd09uOiAnYnV0dG9uJ1xuICAgICAgfTtcbiAgICAgIGZvciAodmFyIHByb3AgaW4gdmEpXG4gICAgICAgIGlmIChwcm9wICE9PSAnY29sb3InICYmIHZhLmhhc093blByb3BlcnR5KHByb3ApKSBvcHRbcHJvcF0gPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhW3Byb3BdKTtcbiAgICAgICQoZWxlbWVudCkuY29sb3JwaWNrZXIob3B0KTtcbiAgICB9LFxuICAgIGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogZWxlbWVudFxuICB9KTtcblxuICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGVsZW1lbnQsIGZ1bmN0aW9uKCkge1xuICAgICQoZWxlbWVudCkub2ZmKCdjaGFuZ2UuY29sb3InLCBjaGFuZ2VQcm9wYWdhdG9yKTtcbiAgICAkKGVsZW1lbnQpLmNvbG9ycGlja2VyKCdkZXN0cm95Jyk7XG4gIH0pO1xuXG59O1xua29qcXVpLnV0aWxzLnJlZ2lzdGVyKENvbG9yUGlja2VyKTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xuXG4vKiBodHRwczovL2dpdGh1Yi5jb20va25vY2tvdXQva25vY2tvdXQvaXNzdWVzLzExNzEgKi9cbmtvLmJpbmRpbmdIYW5kbGVycy5jc3NUZXh0ID0ge1xuICAndXBkYXRlJzogZnVuY3Rpb24obm9kZSwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MpIHtcbiAgICB2YXIgdGV4dCA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKTtcbiAgICB0cnkge1xuICAgICAgbm9kZS5pbm5lclRleHQgPSB0ZXh0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghbm9kZS5zdHlsZVNoZWV0KSBub2RlLmlubmVySFRNTCA9IFwiYXt9XCI7XG4gICAgICBub2RlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IHRleHQ7XG4gICAgfVxuICB9XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG52YXIga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XG5cbi8qIGtub2Nrb3V0IGRyb3BwYWJsZSwgd2l0aCBzaW1wbGlmaWVkIFVNRCAqL1xuOyhmdW5jdGlvbihmYWN0b3J5KSB7XG4gIGZhY3Rvcnkoa28sICQpO1xufSkoZnVuY3Rpb24oa28sICQpIHtcbiAgdmFyIElURU1LRVkgPSBcImtvX3NvcnRJdGVtXCIsXG4gICAgSU5ERVhLRVkgPSBcImtvX3NvdXJjZUluZGV4XCIsXG4gICAgTElTVEtFWSA9IFwia29fc29ydExpc3RcIixcbiAgICBQQVJFTlRLRVkgPSBcImtvX3BhcmVudExpc3RcIixcbiAgICBEUkFHS0VZID0gXCJrb19kcmFnSXRlbVwiLFxuICAgIHVud3JhcCA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUsXG4gICAgZGF0YUdldCA9IGtvLnV0aWxzLmRvbURhdGEuZ2V0LFxuICAgIGRhdGFTZXQgPSBrby51dGlscy5kb21EYXRhLnNldDtcblxuICBrby5iaW5kaW5nSGFuZGxlcnMuZHJvcHBhYmxlID0ge1xuICAgIGluaXQ6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIGRhdGEsIGNvbnRleHQpIHtcbiAgICAgIHZhciAkZWxlbWVudCA9ICQoZWxlbWVudCksXG4gICAgICAgIHZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpIHx8IHt9LFxuICAgICAgICBkcm9wcGFibGUgPSB7fSxcbiAgICAgICAgZHJvcEFjdHVhbDtcblxuICAgICAgJC5leHRlbmQodHJ1ZSwgZHJvcHBhYmxlLCBrby5iaW5kaW5nSGFuZGxlcnMuZHJvcHBhYmxlKTtcbiAgICAgIGlmICh2YWx1ZS5kYXRhKSB7XG4gICAgICAgIGlmICh2YWx1ZS5vcHRpb25zICYmIGRyb3BwYWJsZS5vcHRpb25zKSB7XG4gICAgICAgICAga28udXRpbHMuZXh0ZW5kKGRyb3BwYWJsZS5vcHRpb25zLCB2YWx1ZS5vcHRpb25zKTtcbiAgICAgICAgICBkZWxldGUgdmFsdWUub3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBrby51dGlscy5leHRlbmQoZHJvcHBhYmxlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcm9wcGFibGUuZGF0YSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICBkcm9wQWN0dWFsID0gZHJvcHBhYmxlLm9wdGlvbnMuZHJvcDtcblxuICAgICAgJGVsZW1lbnQuZHJvcHBhYmxlKGtvLnV0aWxzLmV4dGVuZChkcm9wcGFibGUub3B0aW9ucywge1xuICAgICAgICBkcm9wOiBmdW5jdGlvbihldmVudCwgdWkpIHtcblxuICAgICAgICAgIHZhciBlbCA9IHVpLmRyYWdnYWJsZVswXSxcbiAgICAgICAgICAgIGl0ZW0gPSBkYXRhR2V0KGVsLCBJVEVNS0VZKSB8fCBkYXRhR2V0KGVsLCBEUkFHS0VZKTtcblxuICAgICAgICAgIGlmIChpdGVtKSB7XG5cbiAgICAgICAgICAgIGlmIChpdGVtLmNsb25lKSB7XG4gICAgICAgICAgICAgIGl0ZW0gPSBpdGVtLmNsb25lKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkcm9wcGFibGUuZHJhZ2dlZCkge1xuICAgICAgICAgICAgICBpdGVtID0gZHJvcHBhYmxlLmRyYWdnZWQuY2FsbCh0aGlzLCBpdGVtLCBldmVudCwgdWkpIHx8IGl0ZW07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkcm9wcGFibGUuZGF0YSkge1xuICAgICAgICAgICAgICBkcm9wcGFibGUuZGF0YShpdGVtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkcm9wQWN0dWFsKSB7XG4gICAgICAgICAgICBkcm9wQWN0dWFsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgICAgLy9oYW5kbGUgZW5hYmxpbmcvZGlzYWJsaW5nXG4gICAgICBpZiAoZHJvcHBhYmxlLmlzRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtvLmNvbXB1dGVkKHtcbiAgICAgICAgICByZWFkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICRlbGVtZW50LmRyb3BwYWJsZShrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGRyb3BwYWJsZS5pc0VuYWJsZWQpID8gXCJlbmFibGVcIiA6IFwiZGlzYWJsZVwiKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogZWxlbWVudFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgIH0sXG4gICAgdXBkYXRlOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5nc0FjY2Vzc29yLCBkYXRhLCBjb250ZXh0KSB7XG5cbiAgICB9LFxuICAgIHRhcmdldEluZGV4OiBudWxsLFxuICAgIGFmdGVyTW92ZTogbnVsbCxcbiAgICBiZWZvcmVNb3ZlOiBudWxsLFxuICAgIG9wdGlvbnM6IHt9XG4gIH07XG59KTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xudmFyICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xudmFyIGNvbnNvbGUgPSByZXF1aXJlKFwiY29uc29sZVwiKTtcblxuLyogdXRpbGl0eSBmb3IgdG9nZXRoZXJqcyAqL1xua28uYmluZGluZ0hhbmRsZXJzLmZvY3VzYWJsZSA9IHtcbiAgJ2ZvY3VzJzogZnVuY3Rpb24oKSB7fSxcbiAgJ2JsdXInOiBmdW5jdGlvbigpIHt9LFxuICAnaW5pdCc6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGVsZW1lbnQsIGZ1bmN0aW9uKCkge1xuICAgICAgJChlbGVtZW50KS5vZmYoXCJmb2N1c2luXCIsIGtvLmJpbmRpbmdIYW5kbGVycy5mb2N1c2FibGUuZm9jdXMpO1xuICAgICAgJChlbGVtZW50KS5vZmYoXCJmb2N1c291dFwiLCBrby5iaW5kaW5nSGFuZGxlcnMuZm9jdXNhYmxlLmJsdXIpO1xuICAgIH0pO1xuXG4gICAgJChlbGVtZW50KS5vbihcImZvY3VzaW5cIiwga28uYmluZGluZ0hhbmRsZXJzLmZvY3VzYWJsZS5mb2N1cyk7XG4gICAgJChlbGVtZW50KS5vbihcImZvY3Vzb3V0XCIsIGtvLmJpbmRpbmdIYW5kbGVycy5mb2N1c2FibGUuYmx1cik7XG5cbiAgfVxufTtcblxua28uYmluZGluZ0hhbmRsZXJzLnNjcm9sbGFibGUgPSB7XG4gICdzY3JvbGwnOiBmdW5jdGlvbigpIHt9LFxuICAnaW5pdCc6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGVsZW1lbnQsIGZ1bmN0aW9uKCkge1xuICAgICAgJChlbGVtZW50KS5vZmYoXCJzY3JvbGxcIiwga28uYmluZGluZ0hhbmRsZXJzLnNjcm9sbGFibGUuc2Nyb2xsKTtcbiAgICB9KTtcblxuICAgICQoZWxlbWVudCkub24oXCJzY3JvbGxcIiwga28uYmluZGluZ0hhbmRsZXJzLnNjcm9sbGFibGUuc2Nyb2xsKTtcblxuICB9XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XG5cbmtvLmV4dGVuZGVycy5wYWdpbmcgPSBmdW5jdGlvbih0YXJnZXQsIHBhZ2VTaXplKSB7XG4gIHZhciBfcGFnZVNpemUgPSBrby5vYnNlcnZhYmxlKHBhZ2VTaXplIHx8IDEwKSxcbiAgICAvLyBkZWZhdWx0IHBhZ2VTaXplIHRvIDEwXG4gICAgX2N1cnJlbnRQYWdlID0ga28ub2JzZXJ2YWJsZSgxKTsgLy8gZGVmYXVsdCBjdXJyZW50IHBhZ2UgdG8gMVxuICB0YXJnZXQucGFnZVNpemUgPSBrby5jb21wdXRlZCh7XG4gICAgcmVhZDogX3BhZ2VTaXplLFxuICAgIHdyaXRlOiBmdW5jdGlvbihuZXdWYWx1ZSkge1xuICAgICAgaWYgKG5ld1ZhbHVlID4gMCkge1xuICAgICAgICBfcGFnZVNpemUobmV3VmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3BhZ2VTaXplKDEwKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHRhcmdldC5jdXJyZW50UGFnZSA9IGtvLmNvbXB1dGVkKHtcbiAgICByZWFkOiBfY3VycmVudFBhZ2UsXG4gICAgd3JpdGU6IGZ1bmN0aW9uKG5ld1ZhbHVlKSB7XG4gICAgICBpZiAobmV3VmFsdWUgPiB0YXJnZXQucGFnZUNvdW50KCkpIHtcbiAgICAgICAgX2N1cnJlbnRQYWdlKHRhcmdldC5wYWdlQ291bnQoKSk7XG4gICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlIDw9IDApIHtcbiAgICAgICAgX2N1cnJlbnRQYWdlKDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2N1cnJlbnRQYWdlKG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHRhcmdldC5wYWdlQ291bnQgPSBrby5jb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gTWF0aC5jZWlsKHRhcmdldCgpLmxlbmd0aCAvIHRhcmdldC5wYWdlU2l6ZSgpKSB8fCAxO1xuICB9KTtcblxuICB0YXJnZXQuY3VycmVudFBhZ2VEYXRhID0ga28uY29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBhZ2VTaXplID0gX3BhZ2VTaXplKCksXG4gICAgICBwYWdlSW5kZXggPSBfY3VycmVudFBhZ2UoKSxcbiAgICAgIHN0YXJ0SW5kZXggPSBwYWdlU2l6ZSAqIChwYWdlSW5kZXggLSAxKSxcbiAgICAgIGVuZEluZGV4ID0gcGFnZVNpemUgKiBwYWdlSW5kZXg7XG5cbiAgICByZXR1cm4gdGFyZ2V0KCkuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICB9KTtcblxuICB0YXJnZXQubW92ZUZpcnN0ID0gZnVuY3Rpb24oKSB7XG4gICAgdGFyZ2V0LmN1cnJlbnRQYWdlKDEpO1xuICB9O1xuICB0YXJnZXQubW92ZVByZXZpb3VzID0gZnVuY3Rpb24oKSB7XG4gICAgdGFyZ2V0LmN1cnJlbnRQYWdlKHRhcmdldC5jdXJyZW50UGFnZSgpIC0gMSk7XG4gIH07XG4gIHRhcmdldC5tb3ZlTmV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHRhcmdldC5jdXJyZW50UGFnZSh0YXJnZXQuY3VycmVudFBhZ2UoKSArIDEpO1xuICB9O1xuICB0YXJnZXQubW92ZUxhc3QgPSBmdW5jdGlvbigpIHtcbiAgICB0YXJnZXQuY3VycmVudFBhZ2UodGFyZ2V0LnBhZ2VDb3VudCgpKTtcbiAgfTtcblxuICByZXR1cm4gdGFyZ2V0O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcbi8qIGdsb2JhbHMgZ2xvYmFsOiB0cnVlICovXG5cbnZhciAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbnZhciBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcbnZhciBzb3J0YWJsZSA9IHJlcXVpcmUoXCJqcXVlcnktdWkvc29ydGFibGVcIik7XG52YXIgZHJhZ2dhYmxlID0gcmVxdWlyZShcImpxdWVyeS11aS9kcmFnZ2FibGVcIik7XG52YXIgY29uc29sZSA9IHJlcXVpcmUoXCJjb25zb2xlXCIpO1xucmVxdWlyZShcImtub2Nrb3V0LXNvcnRhYmxlXCIpO1xuXG5pZiAodHlwZW9mIHNvcnRhYmxlID09ICd1bmRlZmluZWQnKSB0aHJvdyBcIkNhbm5vdCBmaW5kIGpxdWVyeS11aSBzb3J0YWJsZSB3aWRnZXQgZGVwZW5kZW5jeSFcIjtcbmlmICh0eXBlb2YgZHJhZ2dhYmxlID09ICd1bmRlZmluZWQnKSB0aHJvdyBcIkNhbm5vdCBmaW5kIGpxdWVyeS11aSBzb3J0YWJsZSB3aWRnZXQgZGVwZW5kZW5jeSFcIjtcblxudmFyIGlzRHJhZ2dpbmdIZWxwZXIgPSBmdW5jdGlvbih3cml0YWJsZSwgZSkge1xuICBpZiAod3JpdGFibGUoKSkge1xuICAgIGlmIChlLnR5cGUgPT0gd3JpdGFibGUoKSArICdzdG9wJykgd3JpdGFibGUoZmFsc2UpO1xuICB9IGVsc2Uge1xuICAgIGlmIChlLnR5cGUgPT0gJ2RyYWdzdGFydCcgfHwgZS50eXBlID09ICdzb3J0c3RhcnQnKSB3cml0YWJsZShlLnR5cGUuc3Vic3RyaW5nKDAsIDQpKTtcbiAgfVxufTtcblxudmFyIG1ha2VFeHRlbmRlZFZhbHVlQWNjZXNzb3IgPSBmdW5jdGlvbih2YWx1ZUFjY2Vzc29yKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbW9kZWxWYWx1ZSA9IHZhbHVlQWNjZXNzb3IoKSxcbiAgICAgIHVud3JhcHBlZFZhbHVlID0ga28udXRpbHMucGVla09ic2VydmFibGUobW9kZWxWYWx1ZSk7IC8vIFVud3JhcCB3aXRob3V0IHNldHRpbmcgYSBkZXBlbmRlbmN5IGhlcmVcblxuICAgIGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUobW9kZWxWYWx1ZSk7XG5cbiAgICBpZiAobW9kZWxWYWx1ZS5vcHRpb25zID09ICd1bmRlZmluZWQnKSB7XG4gICAgICBtb2RlbFZhbHVlLm9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgb3JpZ1N0YXJ0ID0gbW9kZWxWYWx1ZS5vcHRpb25zLnN0YXJ0O1xuICAgIG1vZGVsVmFsdWUub3B0aW9ucy5zdGFydCA9IGZ1bmN0aW9uKGUsIHVpKSB7XG4gICAgICBpZiAodHlwZW9mIG1vZGVsVmFsdWUuZHJhZ2dpbmcgIT0gJ3VuZGVmaW5lZCcgJiYga28uaXNXcml0YWJsZU9ic2VydmFibGUobW9kZWxWYWx1ZS5kcmFnZ2luZykpIGlzRHJhZ2dpbmdIZWxwZXIobW9kZWxWYWx1ZS5kcmFnZ2luZywgZSk7XG4gICAgICBpZiAodHlwZW9mIG1vZGVsVmFsdWUuZHJvcENvbnRhaW5lciAhPSAndW5kZWZpbmVkJykge1xuICAgICAgICBtb2RlbFZhbHVlLnNjcm9sbEludGVydmFsID0gZ2xvYmFsLnNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBmb28gPSAkKG1vZGVsVmFsdWUuZHJvcENvbnRhaW5lcikuc2Nyb2xsVG9wKCk7XG4gICAgICAgICAgJChtb2RlbFZhbHVlLmRyb3BDb250YWluZXIpLnNjcm9sbFRvcChmb28gKyBtb2RlbFZhbHVlLmFkZGluZyk7XG4gICAgICAgIH0sIDIwKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb3JpZ1N0YXJ0ICE9ICd1bmRlZmluZWQnKSByZXR1cm4gb3JpZ1N0YXJ0KGUsIHVpKTtcbiAgICB9O1xuICAgIHZhciBvcmlnU3RvcCA9IG1vZGVsVmFsdWUub3B0aW9ucy5zdG9wO1xuICAgIG1vZGVsVmFsdWUub3B0aW9ucy5zdG9wID0gZnVuY3Rpb24oZSwgdWkpIHtcbiAgICAgIGlmICh0eXBlb2YgbW9kZWxWYWx1ZS5kcmFnZ2luZyAhPSAndW5kZWZpbmVkJyAmJiBrby5pc1dyaXRhYmxlT2JzZXJ2YWJsZShtb2RlbFZhbHVlLmRyYWdnaW5nKSkgaXNEcmFnZ2luZ0hlbHBlcihtb2RlbFZhbHVlLmRyYWdnaW5nLCBlKTtcbiAgICAgIGlmICh0eXBlb2YgbW9kZWxWYWx1ZS5kcm9wQ29udGFpbmVyICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGdsb2JhbC5jbGVhckludGVydmFsKG1vZGVsVmFsdWUuc2Nyb2xsSW50ZXJ2YWwpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvcmlnU3RvcCAhPSAndW5kZWZpbmVkJykgcmV0dXJuIG9yaWdTdG9wKGUsIHVpKTtcbiAgICB9O1xuICAgIHZhciBvcmlnRHJhZyA9IG1vZGVsVmFsdWUub3B0aW9ucy5kcmFnO1xuICAgIG1vZGVsVmFsdWUub3B0aW9ucy5kcmFnID0gZnVuY3Rpb24oZSwgdWkpIHtcbiAgICAgIGlmICh0eXBlb2YgbW9kZWxWYWx1ZS5kcm9wQ29udGFpbmVyICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciB0b3AgPSBlLnBhZ2VZIC0gJChtb2RlbFZhbHVlLmRyb3BDb250YWluZXIpLm9mZnNldCgpLnRvcDtcbiAgICAgICAgdmFyIGJvdHRvbSA9IHRvcCAtICQobW9kZWxWYWx1ZS5kcm9wQ29udGFpbmVyKS5oZWlnaHQoKTtcbiAgICAgICAgLy8gSGFuZGxlIHNjcm9sbGluZyBzcGVlZCBkZXBlbmRpbmcgb24gZGlzdGFuY2UgZnJvbSBib3JkZXIuXG4gICAgICAgIGlmICh0b3AgPCAtMjApIHtcbiAgICAgICAgICBtb2RlbFZhbHVlLmFkZGluZyA9IC0yMDtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjw8PFwiKTtcbiAgICAgICAgfSBlbHNlIGlmICh0b3AgPCAwKSB7XG4gICAgICAgICAgbW9kZWxWYWx1ZS5hZGRpbmcgPSAtMTA7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCI8PFwiKTtcbiAgICAgICAgfSBlbHNlIGlmICh0b3AgPCAxMCkge1xuICAgICAgICAgIG1vZGVsVmFsdWUuYWRkaW5nID0gLTU7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCI8XCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGJvdHRvbSA+IDIwKSB7XG4gICAgICAgICAgbW9kZWxWYWx1ZS5hZGRpbmcgPSAyMDtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIj4+PlwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChib3R0b20gPiAwKSB7XG4gICAgICAgICAgbW9kZWxWYWx1ZS5hZGRpbmcgPSAxMDtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIj4+XCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGJvdHRvbSA+IC0xMCkge1xuICAgICAgICAgIG1vZGVsVmFsdWUuYWRkaW5nID0gNTtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIj5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbW9kZWxWYWx1ZS5hZGRpbmcgPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9yaWdEcmFnICE9ICd1bmRlZmluZWQnKSByZXR1cm4gb3JpZ0RyYWcoZSwgdWkpO1xuICAgIH07XG5cbiAgICByZXR1cm4gbW9kZWxWYWx1ZTtcbiAgfTtcbn07XG5cbmtvLmJpbmRpbmdIYW5kbGVycy5leHRzb3J0YWJsZSA9IHtcbiAgaW5pdDogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3NBY2Nlc3NvciwgZGF0YSwgY29udGV4dCkge1xuICAgIHJldHVybiBrby5iaW5kaW5nSGFuZGxlcnMuc29ydGFibGUuaW5pdChlbGVtZW50LCBtYWtlRXh0ZW5kZWRWYWx1ZUFjY2Vzc29yKHZhbHVlQWNjZXNzb3IpLCBhbGxCaW5kaW5nc0FjY2Vzc29yLCBkYXRhLCBjb250ZXh0KTtcbiAgfSxcbiAgdXBkYXRlOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5nc0FjY2Vzc29yLCBkYXRhLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGtvLmJpbmRpbmdIYW5kbGVycy5zb3J0YWJsZS51cGRhdGUoZWxlbWVudCwgbWFrZUV4dGVuZGVkVmFsdWVBY2Nlc3Nvcih2YWx1ZUFjY2Vzc29yKSwgYWxsQmluZGluZ3NBY2Nlc3NvciwgZGF0YSwgY29udGV4dCk7XG4gIH1cbn07XG5cbmtvLmJpbmRpbmdIYW5kbGVycy5leHRkcmFnZ2FibGUgPSB7XG4gIGluaXQ6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIGRhdGEsIGNvbnRleHQpIHtcbiAgICByZXR1cm4ga28uYmluZGluZ0hhbmRsZXJzLmRyYWdnYWJsZS5pbml0KGVsZW1lbnQsIG1ha2VFeHRlbmRlZFZhbHVlQWNjZXNzb3IodmFsdWVBY2Nlc3NvciksIGFsbEJpbmRpbmdzQWNjZXNzb3IsIGRhdGEsIGNvbnRleHQpO1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIGRhdGEsIGNvbnRleHQpIHtcbiAgICByZXR1cm4ga28uYmluZGluZ0hhbmRsZXJzLmRyYWdnYWJsZS51cGRhdGUoZWxlbWVudCwgbWFrZUV4dGVuZGVkVmFsdWVBY2Nlc3Nvcih2YWx1ZUFjY2Vzc29yKSwgYWxsQmluZGluZ3NBY2Nlc3NvciwgZGF0YSwgY29udGV4dCk7XG4gIH1cbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKiBnbG9iYWwgZ2xvYmFsOiBmYWxzZSwgSW1hZ2U6IGZhbHNlICovXG5cbi8vIFRoaXMgbW9kdWxlIGRlcGVuZHMgb24gdGhvc2UgZmlsZXMsIGJ1dCBpdCBkb2Vzbid0IGhhdmUgYSBkaXJlY3QgZGVwZW5kZW5jeSwgc28gd2UgZG9uJ3QgcmVxdWlyZSB0aGVtIGhlcmUuXG5cbi8vcmVxdWlyZShcImJsdWVpbXAtY2FudmFzLXRvLWJsb2JcIik7XG4vL3JlcXVpcmUoXCJqcXVlcnktZmlsZS11cGxvYWQvanMvanF1ZXJ5LmlmcmFtZS10cmFuc3BvcnQuanNcIik7XG4vL3JlcXVpcmUoXCJqcXVlcnktZmlsZS11cGxvYWQvanMvanF1ZXJ5LmZpbGV1cGxvYWQuanNcIik7XG4vL3JlcXVpcmUoXCJqcXVlcnktZmlsZS11cGxvYWQvanMvanF1ZXJ5LmZpbGV1cGxvYWQtcHJvY2Vzcy5qc1wiKTtcbi8vcmVxdWlyZShcImpxdWVyeS1maWxlLXVwbG9hZC9qcy9qcXVlcnkuZmlsZXVwbG9hZC1pbWFnZS5qc1wiKTtcbi8vcmVxdWlyZShcImpxdWVyeS1maWxlLXVwbG9hZC9qcy9qcXVlcnkuZmlsZXVwbG9hZC12YWxpZGF0ZS5qc1wiKTtcblxudmFyICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xudmFyIGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xudmFyIGNvbnNvbGUgPSByZXF1aXJlKFwiY29uc29sZVwiKTtcblxuLy8gZXhwZXJpbWVudGFsIGltYWdlIHByZWxvYWRpbmcuXG5rby5iaW5kaW5nSGFuZGxlcnNbJ3ByZWxvYWRlciddID0ge1xuICBpbml0OiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XG4gICAgdmFyIHZhbHVlID0gdmFsdWVBY2Nlc3NvcigpO1xuICAgIGlmICh0eXBlb2YgdmFsdWUucHJlbG9hZGVkID09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YWx1ZS5wcmVsb2FkZWQgPSBrby5vYnNlcnZhYmxlKFwiXCIpO1xuXG4gICAgICB2YXIgcHJlbG9hZGVyID0gZnVuY3Rpb24obmV3VmFsdWUpIHtcbiAgICAgICAgaWYgKG5ld1ZhbHVlICE9IHZhbHVlLnByZWxvYWRlZCgpKSB7XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB2YWx1ZS5wcmVsb2FkZWQobmV3VmFsdWUpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHZhbHVlLnByZWxvYWRlZChuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1nLnNyYyA9IG5ld1ZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZS5wcmVsb2FkZWQobmV3VmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdmFsdWUuc3Vic2NyaWJlKHByZWxvYWRlcik7XG4gICAgICBwcmVsb2FkZXIodmFsdWUoKSk7XG4gICAgfVxuICB9XG59O1xuXG4vLyBUT0RPIHdlIGRvbid0IHVzZSBhZHZhdHRyIGFuZCBhZHZzdHlsZSwgbWF5YmUgd2Ugc2hvdWxkIHNpbXBseSByZW1vdmUgdGhpcyBjb2RlLlxua28uYmluZGluZ0hhbmRsZXJzWydhZHZhdHRyJ10gPSB7XG4gICdpbml0JzogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcbiAgICB2YXIgdmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSB8fCB7fSk7XG4gICAga28udXRpbHMub2JqZWN0Rm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24oYXR0ck5hbWUsIGF0dHJWYWx1ZUFjY2Vzc29yKSB7XG4gICAgICB2YXIgYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuXG4gICAgICBpZiAoa28uaXNXcml0ZWFibGVPYnNlcnZhYmxlKGF0dHJWYWx1ZUFjY2Vzc29yKSkge1xuICAgICAgICB2YXIgb2xkVmFsdWUgPSBhdHRyVmFsdWVBY2Nlc3NvcigpO1xuICAgICAgICBpZiAob2xkVmFsdWUgIT0gYXR0clZhbHVlKSB7XG4gICAgICAgICAgYXR0clZhbHVlQWNjZXNzb3IoYXR0clZhbHVlKTtcbiAgICAgICAgICBpZiAob2xkVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWR2QXR0ciBmb3VuZCBhIHZhbHVlIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0XCIsIGF0dHJOYW1lLCBvbGRWYWx1ZSwgYXR0clZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgJ3VwZGF0ZSc6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzKSB7XG4gICAgdmFyIHZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpIHx8IHt9O1xuICAgIGtvLnV0aWxzLm9iamVjdEZvckVhY2godmFsdWUsIGZ1bmN0aW9uKGF0dHJOYW1lLCBhdHRyVmFsdWUpIHtcbiAgICAgIGF0dHJWYWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoYXR0clZhbHVlKTtcbiAgICAgIC8vIFRvIGNvdmVyIGNhc2VzIGxpa2UgXCJhdHRyOiB7IGNoZWNrZWQ6c29tZVByb3AgfVwiLCB3ZSB3YW50IHRvIHJlbW92ZSB0aGUgYXR0cmlidXRlIGVudGlyZWx5XG4gICAgICAvLyB3aGVuIHNvbWVQcm9wIGlzIGEgXCJubyB2YWx1ZVwiLWxpa2UgdmFsdWUgKHN0cmljdGx5IG51bGwsIGZhbHNlLCBvciB1bmRlZmluZWQpXG4gICAgICAvLyAoYmVjYXVzZSB0aGUgYWJzZW5jZSBvZiB0aGUgXCJjaGVja2VkXCIgYXR0ciBpcyBob3cgdG8gbWFyayBhbiBlbGVtZW50IGFzIG5vdCBjaGVja2VkLCBldGMuKVxuICAgICAgdmFyIHRvUmVtb3ZlID0gKGF0dHJWYWx1ZSA9PT0gZmFsc2UpIHx8IChhdHRyVmFsdWUgPT09IG51bGwpIHx8IChhdHRyVmFsdWUgPT09IHVuZGVmaW5lZCk7XG4gICAgICBpZiAodG9SZW1vdmUpIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgIGVsc2UgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJWYWx1ZS50b1N0cmluZygpKTtcbiAgICB9KTtcbiAgfVxufTtcbmtvLmJpbmRpbmdIYW5kbGVyc1snYWR2c3R5bGUnXSA9IHtcbiAgJ2luaXQnOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xuICAgIHZhciB2YWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpIHx8IHt9KTtcbiAgICBrby51dGlscy5vYmplY3RGb3JFYWNoKHZhbHVlLCBmdW5jdGlvbihzdHlsZU5hbWUsIHN0eWxlVmFsdWVBY2Nlc3Nvcikge1xuICAgICAgdmFyIHN0eWxlVmFsdWU7XG4gICAgICBpZiAoc3R5bGVOYW1lLm1hdGNoKC9QeCQvKSkge1xuICAgICAgICBzdHlsZU5hbWUgPSBzdHlsZU5hbWUuc3Vic3RyKDAsIHN0eWxlTmFtZS5sZW5ndGggLSAyKTtcbiAgICAgICAgc3R5bGVWYWx1ZSA9IGVsZW1lbnQuc3R5bGVbc3R5bGVOYW1lXTtcbiAgICAgICAgaWYgKHN0eWxlVmFsdWUubWF0Y2goL3B4JC8pKSB7XG4gICAgICAgICAgc3R5bGVWYWx1ZSA9IHN0eWxlVmFsdWUucmVwbGFjZSgvcHgkLywgJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWR2U3R5bGUgYmluZGluZyBmb3VuZCBhbiB1bmV4cGVjdGVkIGRlZmF1bHQgdmFsdWVcIiwgc3R5bGVOYW1lLCBzdHlsZVZhbHVlLCBlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGVWYWx1ZSA9IGVsZW1lbnQuc3R5bGVbc3R5bGVOYW1lXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGtvLmlzV3JpdGVhYmxlT2JzZXJ2YWJsZShzdHlsZVZhbHVlQWNjZXNzb3IpKSB7XG4gICAgICAgIHZhciBvbGRWYWx1ZSA9IHN0eWxlVmFsdWVBY2Nlc3NvcigpO1xuICAgICAgICBpZiAob2xkVmFsdWUgIT0gc3R5bGVWYWx1ZSkge1xuICAgICAgICAgIHN0eWxlVmFsdWVBY2Nlc3NvcihzdHlsZVZhbHVlKTtcbiAgICAgICAgICBpZiAob2xkVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWR2U3R5bGUgZm91bmQgYSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdFwiLCBzdHlsZU5hbWUsIG9sZFZhbHVlLCBzdHlsZVZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgJ3VwZGF0ZSc6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcbiAgICB2YXIgdmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSB8fCB7fSk7XG4gICAga28udXRpbHMub2JqZWN0Rm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24oc3R5bGVOYW1lLCBzdHlsZVZhbHVlKSB7XG4gICAgICBzdHlsZVZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShzdHlsZVZhbHVlKTtcblxuICAgICAgaWYgKHN0eWxlVmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHN0eWxlVmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHN0eWxlVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIHN0eWxlVmFsdWUgPSBcIlwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3R5bGVOYW1lLm1hdGNoKC9QeCQvKSkge1xuICAgICAgICBzdHlsZU5hbWUgPSBzdHlsZU5hbWUuc3Vic3RyKDAsIHN0eWxlTmFtZS5sZW5ndGggLSAyKTtcbiAgICAgICAgc3R5bGVWYWx1ZSA9IHN0eWxlVmFsdWUgKyBcInB4XCI7XG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnQuc3R5bGVbc3R5bGVOYW1lXSA9IHN0eWxlVmFsdWU7XG4gICAgfSk7XG4gIH1cbn07XG5cbi8vIFV0aWxpdHkgdG8gbG9nIGluaXppYWxpemF0aW9uIGFuZCBkaXNwb3NhbCBvZiBET00gZWxlbWVudHMuXG5rby5iaW5kaW5nSGFuZGxlcnNbJ2RvbWxvZyddID0ge1xuICBpbml0OiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XG4gICAgY29uc29sZS5sb2coXCJpbml0aWFsaXplZFwiLCBlbGVtZW50KTtcbiAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGVsZW1lbnQsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc29sZS5sb2coXCJkaXNwb3NlZFwiLCBlbGVtZW50KTtcbiAgICB9KTtcbiAgfVxufTtcblxua28uYmluZGluZ0hhbmRsZXJzWydmdWRyb3BwYWJsZSddID0ge1xuICBpbml0OiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XG4gICAgdmFyIG9wdCA9IHZhbHVlQWNjZXNzb3IoKSB8fCB7fTtcbiAgICB2YXIgdGltZW91dHNPYmogPSB7fTtcblxuICAgIHZhciBvdmVyID0gZnVuY3Rpb24odGltZW91dHMsIGRyb3Bab25lVGltZW91dCwgZWxlbWVudCwgY2xhc3NOYW1lLCBvYnNlcnZhYmxlLCBldmVudCkge1xuXG4gICAgICBpZiAoIXRpbWVvdXRzW2Ryb3Bab25lVGltZW91dF0pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGFzc05hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtvLmlzV3JpdGVhYmxlT2JzZXJ2YWJsZShvYnNlcnZhYmxlKSAmJiAhb2JzZXJ2YWJsZSgpKSB7XG4gICAgICAgICAgb2JzZXJ2YWJsZSh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2xvYmFsLmNsZWFyVGltZW91dCh0aW1lb3V0c1tkcm9wWm9uZVRpbWVvdXRdKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0b3AgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdGltZW91dHNbZHJvcFpvbmVUaW1lb3V0XSA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrby5pc1dyaXRlYWJsZU9ic2VydmFibGUob2JzZXJ2YWJsZSkgJiYgb2JzZXJ2YWJsZSgpKSB7XG4gICAgICAgICAgb2JzZXJ2YWJsZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChldmVudC50eXBlID09ICdkcmFnbGVhdmUnKSBzdG9wKCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgLy8gVXNpbmcgMTAwIGl0IGRvZW5zJ3Qgd29yayBmaW5lIG9uIExpbnV4IChjaG9tZS9maXJlZm94KSwgdXNpbmcgMjAwIHN0aWxsIHNob3dzIGlzc3VlcyBvbiBzbG93IExpbnV4IGJveGVzXG4gICAgICAgIHRpbWVvdXRzW2Ryb3Bab25lVGltZW91dF0gPSBnbG9iYWwuc2V0VGltZW91dChzdG9wLCA1MDApO1xuICAgICAgfVxuXG4gICAgfTtcblxuICAgIGlmIChvcHQuYWN0aXZlIHx8IG9wdC5hY3RpdmVDbGFzcykge1xuICAgICAga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIoZ2xvYmFsLCAnZHJhZ292ZXInLCBvdmVyLmJpbmQodW5kZWZpbmVkLCB0aW1lb3V0c09iaiwgJ2FjdGl2ZVRpbWVvdXQnLCBlbGVtZW50LCBvcHQuYWN0aXZlQ2xhc3MsIG9wdC5hY3RpdmUpKTtcbiAgICB9XG4gICAgaWYgKG9wdC5ob3ZlckNsYXNzKSB7XG4gICAgICAvLyBkcmFnZW50ZXIgYW5kIGRyYWdsZWF2ZSBhcmUgbm90IHJlcXVpcmVkIGJ1dCB0aGV5IHNwZWVkdXAgZmVlZGJhY2sgd2hlbiB1c2VkLlxuICAgICAga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIoZWxlbWVudCwgJ2RyYWdvdmVyIGRyYWdlbnRlciBkcmFnbGVhdmUnLCBvdmVyLmJpbmQodW5kZWZpbmVkLCB0aW1lb3V0c09iaiwgJ2hvdmVyVGltZW91dCcsIGVsZW1lbnQsIG9wdC5ob3ZlckNsYXNzLCB1bmRlZmluZWQpKTtcbiAgICB9XG4gIH1cbn07XG5cbmtvLmJpbmRpbmdIYW5kbGVyc1snZmlsZXVwbG9hZCddID0ge1xuICBleHRlbmRPcHRpb25zOiB7fSxcbiAgcmVtb3RlRmlsZVByZXByb2Nlc3NvcjogZnVuY3Rpb24odXJsKSB7IHJldHVybiB1cmw7IH0sXG4gIGluaXQ6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcbiAgICAvLyBUT0RPIGRvbW5vZGVkaXNwb3NhbCBkb2Vzbid0IHdvcmsgd2hlbiB0aGUgdXBsb2FkIGlzIGRvbmUgYnkgXCJjbGlja2luZ1wiXG4gICAgLy8gUHJvYmFibHkganF1ZXJ5LWZpbGV1cGxvYWQgbW92ZXMgdGhlIERPTSBzb21ld2hlcmUgZWxzZSBzbyB0aGF0IEtPIGRvZXNuJ3QgXG4gICAgLy8gZGV0ZWN0IHRoZSByZW1vdmFsIGFueW1vcmUuXG4gICAga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFjayhlbGVtZW50LCBmdW5jdGlvbigpIHtcbiAgICAgICQoZWxlbWVudCkuZmlsZXVwbG9hZCgnZGVzdHJveScpO1xuICAgIH0pO1xuXG4gICAgLy8gaWYgd2UgbGVhdmUgdGhlIHRpdGxlIHRoZSBuYXRpdmUgY29udHJvbCB3aWxsIHNob3cgdXMgYSB0b29sdGlwIHdlIGRvbid0IHdhbnQuXG4gICAgLy8gSW4gV2ViS2l0IHRoZSByaWdodCB3YXkgdG8gcmVtb3ZlIGl0IGlzIGxlYXZpbmcgYSBcIndoaXRlc3BhY2VcIi5cbiAgICAvLyBJbiBHZWNrbyB3ZSBoYXZlIHRvIHNldCBpdCBlbXB0eS5cbiAgICBpZiAoZ2xvYmFsLndlYmtpdFVSTClcbiAgICAgICQoZWxlbWVudCkuYXR0cigndGl0bGUnLCAnICcpO1xuICAgIGVsc2VcbiAgICAgICQoZWxlbWVudCkuYXR0cigndGl0bGUnLCAnJyk7XG4gIH0sXG5cbiAgdXBkYXRlOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB2YWx1ZUFjY2Vzc29yKCkgfHwge307XG5cbiAgICB2YXIgJGZ1ID0gJChlbGVtZW50KTtcbiAgICB2YXIgJHBhcmVudCA9ICRmdS5wYXJlbnRzKCcudXBsb2Fkem9uZScpO1xuXG4gICAgdmFyIGRhdGFWYWx1ZSA9IG9wdGlvbnMuZGF0YTtcbiAgICBvcHRpb25zLmRhdGEgPSB1bmRlZmluZWQ7XG5cbiAgICB2YXIgY2FudmFzUHJldmlldyA9IG9wdGlvbnMuY2FudmFzUHJldmlldztcblxuICAgIC8vIFRPRE8gcmVtb3ZlIGhhcmRjb2RlZCB1cmxcbiAgICBrby51dGlscy5leHRlbmQob3B0aW9ucywge1xuICAgICAgdXJsOiAnL3VwbG9hZC8nLFxuICAgICAgZGF0YVR5cGU6ICdqc29uJyxcbiAgICAgIGRyb3Bab25lOiAkcGFyZW50LmZpbmQoJy5tby11cGxvYWR6b25lJylbMF0sXG4gICAgICBhdXRvVXBsb2FkOiB0cnVlLFxuICAgICAgYWNjZXB0RmlsZVR5cGVzOiAvKFxcLnxcXC8pKGdpZnxqcGU/Z3xwbmcpJC9pLFxuICAgICAgbWF4RmlsZVNpemU6IDEwMjQgKiAxMDI0LFxuICAgICAgLy8gRW5hYmxlIGltYWdlIHJlc2l6aW5nLCBleGNlcHQgZm9yIEFuZHJvaWQgYW5kIE9wZXJhLFxuICAgICAgLy8gd2hpY2ggYWN0dWFsbHkgc3VwcG9ydCBpbWFnZSByZXNpemluZywgYnV0IGZhaWwgdG9cbiAgICAgIC8vIHNlbmQgQmxvYiBvYmplY3RzIHZpYSBYSFIgcmVxdWVzdHM6XG4gICAgICBkaXNhYmxlSW1hZ2VSZXNpemU6IC9BbmRyb2lkKD8hLipDaHJvbWUpfE9wZXJhLy50ZXN0KGdsb2JhbC5uYXZpZ2F0b3IudXNlckFnZW50KSxcbiAgICAgIHByZXZpZXdNYXhXaWR0aDogMjAwLFxuICAgICAgcHJldmlld01heEhlaWdodDogMjAwLFxuICAgICAgcHJldmlld0Nyb3A6IGZhbHNlLFxuICAgICAgcmVwbGFjZUZpbGVJbnB1dDogZmFsc2UsIC8vIHJlcGxhY2VGaWxlSW5wdXQgdHJ1ZSBicmVha3MgYWZ0ZXIgdXBsb2FkaW5nIHVzaW5nIFwiaW5wdXRcIiAodXNpbmcgbW91c2UgY2xpYyBpbnN0ZWFkIG9mIGRyb3BwaW5nKVxuXG4gICAgICBtZXNzYWdlczoge1xuICAgICAgICAvLyBjbGllbnQgc2lkZVxuICAgICAgICB1bmtub3duRXJyb3I6ICdVbmtub3duIGVycm9yJyxcbiAgICAgICAgdXBsb2FkZWRCeXRlczogJ1VwbG9hZGVkIGJ5dGVzIGV4Y2VlZCBmaWxlIHNpemUnLFxuICAgICAgICBtYXhOdW1iZXJPZkZpbGVzOiAnTWF4aW11bSBudW1iZXIgb2YgZmlsZXMgZXhjZWVkZWQnLFxuICAgICAgICBhY2NlcHRGaWxlVHlwZXM6ICdGaWxlIHR5cGUgbm90IGFsbG93ZWQnLFxuICAgICAgICBtYXhGaWxlU2l6ZTogJ0ZpbGUgaXMgdG9vIGxhcmdlJyxcbiAgICAgICAgbWluRmlsZVNpemU6ICdGaWxlIGlzIHRvbyBzbWFsbCcsXG4gICAgICAgIC8vIHNlcnZlciBzaWRlXG4gICAgICAgIHBvc3RfbWF4X3NpemU6ICdUaGUgdXBsb2FkZWQgZmlsZSBleGNlZWRzIHRoZSBwb3N0X21heF9zaXplIGRpcmVjdGl2ZSBpbiBwaHAuaW5pJyxcbiAgICAgICAgbWF4X2ZpbGVfc2l6ZTogJ0ZpbGUgaXMgdG9vIGJpZycsXG4gICAgICAgIG1pbl9maWxlX3NpemU6ICdGaWxlIGlzIHRvbyBzbWFsbCcsXG4gICAgICAgIGFjY2VwdF9maWxlX3R5cGVzOiAnRmlsZXR5cGUgbm90IGFsbG93ZWQnLFxuICAgICAgICBtYXhfbnVtYmVyX29mX2ZpbGVzOiAnTWF4aW11bSBudW1iZXIgb2YgZmlsZXMgZXhjZWVkZWQnLFxuICAgICAgICBtYXhfd2lkdGg6ICdJbWFnZSBleGNlZWRzIG1heGltdW0gd2lkdGgnLFxuICAgICAgICBtaW5fd2lkdGg6ICdJbWFnZSByZXF1aXJlcyBhIG1pbmltdW0gd2lkdGgnLFxuICAgICAgICBtYXhfaGVpZ2h0OiAnSW1hZ2UgZXhjZWVkcyBtYXhpbXVtIGhlaWdodCcsXG4gICAgICAgIG1pbl9oZWlnaHQ6ICdJbWFnZSByZXF1aXJlcyBhIG1pbmltdW0gaGVpZ2h0JyxcbiAgICAgICAgYWJvcnQ6ICdGaWxlIHVwbG9hZCBhYm9ydGVkJyxcbiAgICAgICAgaW1hZ2VfcmVzaXplOiAnRmFpbGVkIHRvIHJlc2l6ZSBpbWFnZScsXG4gICAgICAgIGdlbmVyaWM6ICdVbmV4cGVjdGVkIHVwbG9hZCBlcnJvcidcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGtvLnV0aWxzLmV4dGVuZChvcHRpb25zLCBrby5iaW5kaW5nSGFuZGxlcnNbJ2ZpbGV1cGxvYWQnXS5leHRlbmRPcHRpb25zKTtcblxuICAgIHZhciB3b3JraW5nID0gMDtcbiAgICB2YXIgZmlyc3RXb3JrZWQgPSAnJztcblxuICAgIHZhciBjbGVhbnVwID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoLS13b3JraW5nID09PSAwKSB7XG4gICAgICAgIGlmIChkYXRhVmFsdWUpIHtcbiAgICAgICAgICBkYXRhVmFsdWUoZmlyc3RXb3JrZWQpO1xuICAgICAgICB9XG4gICAgICAgIGZpcnN0V29ya2VkID0gJyc7XG4gICAgICAgIGlmIChjYW52YXNQcmV2aWV3KSB7XG4gICAgICAgICAgJHBhcmVudC5maW5kKCdpbWcnKS5zaG93KCk7XG4gICAgICAgICAgJHBhcmVudC5maW5kKCdjYW52YXMnKS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICAkcGFyZW50LnJlbW92ZUNsYXNzKFwidXBsb2FkaW5nXCIpO1xuICAgICAgICAkcGFyZW50LmZpbmQoJy5wcm9ncmVzcy1iYXInKS5jc3MoJ3dpZHRoJywgMCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciB0cmFuc2xhdGVkTWVzc2FnZSA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5tZXNzYWdlcyA9PSAnb2JqZWN0JyAmJiBvcHRpb25zLm1lc3NhZ2VzICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHRleHQubWF0Y2goL14oW14gXSspKC4qKSQvKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm1lc3NhZ2VzW21hdGNoWzFdXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLm1lc3NhZ2VzW21hdGNoWzFdXSArIG1hdGNoWzJdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfTtcblxuICAgICRmdS5maWxldXBsb2FkKG9wdGlvbnMpO1xuXG4gICAgdmFyIGV2ZW50cyA9IFsnZmlsZXVwbG9hZGFkZCcsICdmaWxldXBsb2FkcHJvY2Vzc2Fsd2F5cycsICdmaWxldXBsb2FkcHJvZ3Jlc3NhbGwnLCAnZmlsZXVwbG9hZGRvbmUnLCAnZmlsZXVwbG9hZGZhaWwnXTtcbiAgICB2YXIgZXZlbnRIYW5kbGVyID0gZnVuY3Rpb24oZSwgZGF0YSkge1xuICAgICAgaWYgKGUudHlwZSA9PSAnZmlsZXVwbG9hZGFkZCcpIHtcbiAgICAgICAgd29ya2luZysrO1xuICAgICAgfVxuICAgICAgaWYgKGUudHlwZSA9PSAnZmlsZXVwbG9hZGZhaWwnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiZmlsZXVwbG9hZGZhaWxcIiwgZSwgZGF0YSk7XG4gICAgICAgIGlmIChvcHRpb25zLm9uZXJyb3IpIHtcbiAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93biA9PT0gJycgJiYgZGF0YS50ZXh0U3RhdHVzID09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25lcnJvcih0cmFuc2xhdGVkTWVzc2FnZSgnZ2VuZXJpYycpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucy5vbmVycm9yKHRyYW5zbGF0ZWRNZXNzYWdlKCdnZW5lcmljICgnICsgZGF0YS5lcnJvclRocm93biArICcpJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICB9XG4gICAgICBpZiAoZS50eXBlID09ICdmaWxldXBsb2FkZG9uZScpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhLnJlc3VsdC5maWxlc1swXS51cmwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMub25maWxlKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEucmVzdWx0LmZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGRhdGEucmVzdWx0LmZpbGVzW2ldID0ga28uYmluZGluZ0hhbmRsZXJzWydmaWxldXBsb2FkJ10ucmVtb3RlRmlsZVByZXByb2Nlc3NvcihkYXRhLnJlc3VsdC5maWxlc1tpXSk7XG4gICAgICAgICAgICAgIG9wdGlvbnMub25maWxlKGRhdGEucmVzdWx0LmZpbGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZmlyc3RXb3JrZWQgPT09ICcnKSBmaXJzdFdvcmtlZCA9IGRhdGEucmVzdWx0LmZpbGVzWzBdLnVybDtcblxuICAgICAgICAgIGlmIChjYW52YXNQcmV2aWV3KSB7XG4gICAgICAgICAgICB2YXIgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICBpbWcub25sb2FkID0gY2xlYW51cDtcbiAgICAgICAgICAgIGltZy5vbmVycm9yID0gY2xlYW51cDtcbiAgICAgICAgICAgIGltZy5zcmMgPSBkYXRhLnJlc3VsdC5maWxlc1swXS51cmw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEucmVzdWx0LmZpbGVzWzBdLmVycm9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwicmVtb3RlIGVycm9yXCIsIGUsIGRhdGEpO1xuICAgICAgICAgIGlmIChvcHRpb25zLm9uZXJyb3IpIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25lcnJvcih0cmFuc2xhdGVkTWVzc2FnZShkYXRhLnJlc3VsdC5maWxlc1swXS5lcnJvcikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJ1bmV4cGVjdGVkIGVycm9yXCIsIGUsIGRhdGEpO1xuICAgICAgICAgIGlmIChvcHRpb25zLm9uZXJyb3IpIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25lcnJvcih0cmFuc2xhdGVkTWVzc2FnZSgnZ2VuZXJpYyAoVW5leHBlY3RlZCBFcnJvciByZXRyaWV2aW5nIHVwbG9hZGVkIGZpbGUpJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlLnR5cGUgPT0gJ2ZpbGV1cGxvYWRwcm9jZXNzYWx3YXlzJykge1xuICAgICAgICB2YXIgaW5kZXggPSBkYXRhLmluZGV4LFxuICAgICAgICAgIGZpbGUgPSBkYXRhLmZpbGVzW2luZGV4XTtcbiAgICAgICAgaWYgKGZpbGUucHJldmlldyAmJiBpbmRleCA9PT0gMCkge1xuICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBjYW52YXMgd2UgaGFkIG11bHRpcGxlIHVwbG9hZGVkIGZpbGVzXG4gICAgICAgICAgaWYgKCRwYXJlbnQuZmluZCgnY2FudmFzJykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoY2FudmFzUHJldmlldykge1xuICAgICAgICAgICAgICB2YXIgZWwgPSAkKGZpbGUucHJldmlldykuY3NzKCd3aWR0aCcsICcxMDAlJyk7IC8vIC5jc3MoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJykuY3NzKCdsZWZ0JywgJzAnKTtcbiAgICAgICAgICAgICAgJHBhcmVudC5maW5kKCdpbWcnKS5oaWRlKCk7XG4gICAgICAgICAgICAgICRwYXJlbnQucHJlcGVuZChlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkcGFyZW50LmFkZENsYXNzKFwidXBsb2FkaW5nXCIpO1xuICAgICAgICAgICAgJHBhcmVudC5maW5kKCcucHJvZ3Jlc3MtYmFyJykuY3NzKCd3aWR0aCcsIDApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZS5lcnJvcikge1xuICAgICAgICAgIC8vIEZpbGUgdHlwZSBub3QgYWxsb3dlZFxuICAgICAgICAgIC8vIEZpbGUgaXMgdG9vIGxhcmdlXG4gICAgICAgICAgaWYgKG9wdGlvbnMub25lcnJvcikge1xuICAgICAgICAgICAgb3B0aW9ucy5vbmVycm9yKHRyYW5zbGF0ZWRNZXNzYWdlKGZpbGUuZXJyb3IpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZS50eXBlID09ICdmaWxldXBsb2FkcHJvZ3Jlc3NhbGwnKSB7XG4gICAgICAgIHZhciBwcm9ncmVzcyA9IHBhcnNlSW50KGRhdGEubG9hZGVkIC8gZGF0YS50b3RhbCAqIDEwMCwgMTApO1xuICAgICAgICAkcGFyZW50LmZpbmQoJy5wcm9ncmVzcy1iYXInKS5jc3MoJ3dpZHRoJywgcHJvZ3Jlc3MgKyAnJScpO1xuICAgICAgfVxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IGV2ZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGV2ZW50TmFtZSA9IGV2ZW50c1tpXTtcbiAgICAgICRmdS5vbihldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gICAgfVxuICAgIGlmICghJC5zdXBwb3J0LmZpbGVJbnB1dCkge1xuICAgICAgJGZ1LnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkucGFyZW50KCkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XG4gICAgfVxuICB9XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XG52YXIgY29uc29sZSA9IHJlcXVpcmUoXCJjb25zb2xlXCIpO1xuXG5rby5iaW5kaW5nSGFuZGxlcnNbJ2lmU3VicyddID0ge1xuICAvLyBjbG9uZU5vZGVzIGZyb20ga28udXRpbHMuY2xvbmVOb2RlcyAobWlzc2luZyBpbiBtaW5pbWl6ZWQgS08pXG4gIGNsb25lTm9kZXM6IGZ1bmN0aW9uKG5vZGVzQXJyYXksIHNob3VsZENsZWFuTm9kZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgaiA9IG5vZGVzQXJyYXkubGVuZ3RoLCBuZXdOb2Rlc0FycmF5ID0gW107IGkgPCBqOyBpKyspIHtcbiAgICAgIHZhciBjbG9uZWROb2RlID0gbm9kZXNBcnJheVtpXS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICBuZXdOb2Rlc0FycmF5LnB1c2goc2hvdWxkQ2xlYW5Ob2RlcyA/IGtvLmNsZWFuTm9kZShjbG9uZWROb2RlKSA6IGNsb25lZE5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3Tm9kZXNBcnJheTtcbiAgfSxcbiAgJ2luaXQnOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xuICAgIHZhciBkaWREaXNwbGF5T25MYXN0VXBkYXRlLFxuICAgICAgc2F2ZWROb2RlcyxcbiAgICAgIHZhbHVlQWNjID0gdmFsdWVBY2Nlc3NvcigpO1xuICAgIGlmICh0eXBlb2YgdmFsdWVBY2MuZGF0YS5zdWJzQ291bnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBrby5leHRlbmRlcnNbJ3N1YnNjcmlwdGlvbnNDb3VudCddKHZhbHVlQWNjLmRhdGEpO1xuICAgICAgLy8gTk9URSBJIGNhbid0IHNpbXBseSBsaXN0ZW4gb24gXCJ0aHJlc2hvbGRzXCIgYmVjYXVzZSBtdWx0aXBsZSBiaW5kaW5ncyB0byB0aGUgc2FtZSBvYnNlcnZhYmxlIGNvdWxkIHVzZSBkaWZmZXJlbnQgdGhyZXNob2xkcy5cbiAgICB9XG4gICAga28uY29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZGF0YVZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkuZGF0YS5zdWJzQ291bnQpLFxuICAgICAgICBpc0ZpcnN0UmVuZGVyID0gIXNhdmVkTm9kZXMsXG4gICAgICAgIHNob3VsZERpc3BsYXksIG5lZWRzUmVmcmVzaCwgZ3V0dGVyO1xuXG4gICAgICBndXR0ZXIgPSAtKHR5cGVvZiB2YWx1ZUFjY2Vzc29yKCkuZ3V0dGVyICE9PSAndW5kZWZpbmVkJyA/IHZhbHVlQWNjZXNzb3IoKS5ndXR0ZXIgOiAxKTtcbiAgICAgIHNob3VsZERpc3BsYXkgPSBkYXRhVmFsdWUgKyAoZGlkRGlzcGxheU9uTGFzdFVwZGF0ZSA/IGd1dHRlciA6IDApID49IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2MudGhyZXNob2xkKTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWVBY2Nlc3NvcigpLm5vdCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWVBY2Nlc3NvcigpLm5vdCkge1xuICAgICAgICBzaG91bGREaXNwbGF5ID0gIXNob3VsZERpc3BsYXk7XG4gICAgICB9XG4gICAgICBuZWVkc1JlZnJlc2ggPSBpc0ZpcnN0UmVuZGVyIHx8IChzaG91bGREaXNwbGF5ICE9PSBkaWREaXNwbGF5T25MYXN0VXBkYXRlKTtcblxuICAgICAgaWYgKG5lZWRzUmVmcmVzaCkge1xuICAgICAgICAvLyBTYXZlIGEgY29weSBvZiB0aGUgaW5uZXIgbm9kZXMgb24gdGhlIGluaXRpYWwgdXBkYXRlLCBidXQgb25seSBpZiB3ZSBoYXZlIGRlcGVuZGVuY2llcy5cbiAgICAgICAgaWYgKGlzRmlyc3RSZW5kZXIgJiYga28uY29tcHV0ZWRDb250ZXh0LmdldERlcGVuZGVuY2llc0NvdW50KCkpIHtcbiAgICAgICAgICBzYXZlZE5vZGVzID0ga28uYmluZGluZ0hhbmRsZXJzWydpZlN1YnMnXS5jbG9uZU5vZGVzKGtvLnZpcnR1YWxFbGVtZW50cy5jaGlsZE5vZGVzKGVsZW1lbnQpLCB0cnVlIC8qIHNob3VsZENsZWFuTm9kZXMgKi8gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaG91bGREaXNwbGF5KSB7XG4gICAgICAgICAgaWYgKCFpc0ZpcnN0UmVuZGVyKSB7XG4gICAgICAgICAgICBrby52aXJ0dWFsRWxlbWVudHMuc2V0RG9tTm9kZUNoaWxkcmVuKGVsZW1lbnQsIGtvLmJpbmRpbmdIYW5kbGVyc1snaWZTdWJzJ10uY2xvbmVOb2RlcyhzYXZlZE5vZGVzKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGtvLmFwcGx5QmluZGluZ3NUb0Rlc2NlbmRhbnRzKGJpbmRpbmdDb250ZXh0LCBlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBrby52aXJ0dWFsRWxlbWVudHMuZW1wdHlOb2RlKGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkRGlzcGxheU9uTGFzdFVwZGF0ZSA9IHNob3VsZERpc3BsYXk7XG4gICAgICB9XG4gICAgfSwgbnVsbCwge1xuICAgICAgZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkOiBlbGVtZW50XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICdjb250cm9sc0Rlc2NlbmRhbnRCaW5kaW5ncyc6IHRydWVcbiAgICB9O1xuICB9XG59O1xua28udmlydHVhbEVsZW1lbnRzLmFsbG93ZWRCaW5kaW5nc1snaWZTdWJzJ10gPSB0cnVlO1xuXG4vLyBrby5pc1dyaXRhYmxlT2JzZXJ2YWJsZSAod2l0aG91dCBcImVcIikgaGFzIGJlZW4gaW50cm9kdWNlZCBpbiAzLjIuMCwgdGhhdCBpcyBhbHNvIG91ciBtaW4gcmVxdWlyZW1lbnQuXG4vLyBtaW5pbWl6ZWQga25vY2tvdXQgXCJvYmZ1c2NhdGVcIiB0aGUgYmVmb3JlU3Vic2NyaXB0aW9uQWRkIGFuZCBhZnRlclN1YnNjcmlwdGlvblJlbW92ZSBtZXRob2RzIHRoYXQgd2UgaGFjayBoZXJlLlxuLy8gc28gd2UgaGF2ZSB0byBleHBsaWNpdGx5IGtub3cgdGhhdC5cbi8vIE5vdGU6IHdlIHVzZWQgdG8gdXNlIGtvLkRFQlVHIHRvIGRldGVjdCB0aGUgZGVidWcgdmVyc2lvbiBvZiBLTywgYnV0IHRoaXMgd2FzIHJlbW92ZWQgaW4gS08gMy40LjArLCBcbi8vICAgICAgIHNvIHdlIHN3aXRjaGVkIHRvIGtvLnN1YnNjcmlwdGlvbiBmdW5jdGlvbiB0aGF0IG9ubHkgZXhpc3RzIGluIERFQlVHIHZlcnNpb25zLlxudmFyIGJlZm9yZVN1YnNjcmlwdGlvblByb3A7XG52YXIgYWZ0ZXJTdWJzY3JpcHRpb25Qcm9wO1xuaWYgKHR5cGVvZiBrby5zdWJzY3JpcHRpb24gPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Yga28uaXNXcml0YWJsZU9ic2VydmFibGUgIT09ICd1bmRlZmluZWQnKSB7XG4gIGJlZm9yZVN1YnNjcmlwdGlvblByb3AgPSAnYmVmb3JlU3Vic2NyaXB0aW9uQWRkJztcbiAgYWZ0ZXJTdWJzY3JpcHRpb25Qcm9wID0gJ2FmdGVyU3Vic2NyaXB0aW9uUmVtb3ZlJztcbn0gZWxzZSBpZiAoa28udmVyc2lvbiA9PSBcIjMuMi4wXCIpIHtcbiAgYmVmb3JlU3Vic2NyaXB0aW9uUHJvcCA9ICd2YSc7XG4gIGFmdGVyU3Vic2NyaXB0aW9uUHJvcCA9ICduYic7XG59IGVsc2UgaWYgKGtvLnZlcnNpb24gPT0gXCIzLjMuMFwiKSB7XG4gIGJlZm9yZVN1YnNjcmlwdGlvblByb3AgPSAnamEnO1xuICBhZnRlclN1YnNjcmlwdGlvblByb3AgPSAndWEnO1xufSBlbHNlIGlmIChrby52ZXJzaW9uID09IFwiMy40LjBcIikge1xuICBiZWZvcmVTdWJzY3JpcHRpb25Qcm9wID0gJ3NhJztcbiAgYWZ0ZXJTdWJzY3JpcHRpb25Qcm9wID0gJ0lhJztcbn0gZWxzZSBpZiAoa28udmVyc2lvbiA9PSBcIjMuNC4xXCIpIHtcbiAgYmVmb3JlU3Vic2NyaXB0aW9uUHJvcCA9ICdzYSc7XG4gIGFmdGVyU3Vic2NyaXB0aW9uUHJvcCA9ICdJYSc7XG59XG5lbHNlIHRocm93IFwiVW5zdXBwb3J0ZWQgbWluaW1pemVkIEtub2Nrb3V0IHZlcnNpb24gXCIgKyBrby52ZXJzaW9uICsgXCIgKHN1cHBvcnRlZCBERUJVRyBvciBtaW5pbWl6ZWQgMy4yLjAgLi4uIDMuNC4xKVwiO1xuXG4vLyBpbnRlcm5hbGx5IHVzZWQgYnkgaWZzdWJzIGJpbmRpbmcuXG4vLyBXQVJOSU5HIHRoaXMgYnJlYWsgd2hlbiB1c2VkIHdpdGggcHVyZUNvbXB1dGVkIG9yIGRlZmVycmVkRXZhbHVhdGVkXG5rby5leHRlbmRlcnNbJ3N1YnNjcmlwdGlvbnNDb3VudCddID0gZnVuY3Rpb24odGFyZ2V0LCBsMSwgbDIpIHtcbiAgaWYgKHR5cGVvZiB0YXJnZXQuc3Vic0NvdW50ID09PSAndW5kZWZpbmVkJykge1xuICAgIHRhcmdldC5zdWJzQ291bnQgPSBrby5vYnNlcnZhYmxlKHRhcmdldC5nZXRTdWJzY3JpcHRpb25zQ291bnQoKSkuZXh0ZW5kKHtcbiAgICAgIG5vdGlmeTogJ2Fsd2F5cydcbiAgICB9KTtcbiAgICB2YXIgdW5kZXJseWluZ0JlZm9yZVN1YnNjcmlwdGlvbkFkZEZ1bmN0aW9uID0gdGFyZ2V0W2JlZm9yZVN1YnNjcmlwdGlvblByb3BdO1xuICAgIHZhciB1bmRlcmx5aW5nQWZ0ZXJTdWJzY3JpcHRpb25SZW1vdmVGdW5jdGlvbiA9IHRhcmdldFthZnRlclN1YnNjcmlwdGlvblByb3BdO1xuICAgIHRhcmdldFtiZWZvcmVTdWJzY3JpcHRpb25Qcm9wXSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAodW5kZXJseWluZ0JlZm9yZVN1YnNjcmlwdGlvbkFkZEZ1bmN0aW9uKSB1bmRlcmx5aW5nQmVmb3JlU3Vic2NyaXB0aW9uQWRkRnVuY3Rpb24uY2FsbCh0YXJnZXQsIGV2ZW50KTtcbiAgICAgIHZhciBjID0gdGFyZ2V0LmdldFN1YnNjcmlwdGlvbnNDb3VudCgpICsgMTtcbiAgICAgIGlmICh0eXBlb2YgbDEgPT09ICd1bmRlZmluZWQnIHx8IGMgPT0gbDEgfHwgdHlwZW9mIGwyID09PSAndW5kZWZpbmVkJyB8fCBjID09IGwyKSB0YXJnZXQuc3Vic0NvdW50KGMpO1xuICAgIH07XG4gICAgdGFyZ2V0W2FmdGVyU3Vic2NyaXB0aW9uUHJvcF0gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKHVuZGVybHlpbmdBZnRlclN1YnNjcmlwdGlvblJlbW92ZUZ1bmN0aW9uKSB1bmRlcmx5aW5nQWZ0ZXJTdWJzY3JpcHRpb25SZW1vdmVGdW5jdGlvbi5jYWxsKHRhcmdldCwgZXZlbnQpO1xuICAgICAgdmFyIGMgPSB0YXJnZXQuZ2V0U3Vic2NyaXB0aW9uc0NvdW50KCk7XG4gICAgICBpZiAodHlwZW9mIGwxID09PSAndW5kZWZpbmVkJyB8fCBjID09IGwxIHx8IHR5cGVvZiBsMiA9PT0gJ3VuZGVmaW5lZCcgfHwgYyA9PSBsMikgdGFyZ2V0LnN1YnNDb3VudChjKTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKFwiYWxyZWFkeSBhcHBsaWVkIHN1YnNjcmlwdGlvbkNvdW50IHRvIG9ic2VydmFibGVcIik7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIE92ZXJyaWRlcyBuYXRpdmUgalF1ZXJ5IHNwaW5uZXIgdG8gYXZvaWQgdmFsaWRhdGlvbiBvZiB0aGUgXCJzdGVwXCIuXG4vLyBXZSB3YW50cyB0byB1c2UgdGhlIHN0ZXAgYnV0IGFsc28gd2FudHMgdG8gbGVhdmUgdGhlIHVzZXIgdGhlIGFiaWxpdHkgdG8gc2VsZWN0IHNwZWNpZmljIHZhbHVlcy5cblxudmFyICQgPSByZXF1aXJlKCdqcXVlcnknKTtcbnZhciBzcGlubmVyID0gcmVxdWlyZShcImpxdWVyeS11aS9zcGlubmVyXCIpO1xudmFyIGNvbnNvbGUgPSByZXF1aXJlKCdjb25zb2xlJyk7XG5cbmlmICh0eXBlb2Ygc3Bpbm5lciA9PSAndW5kZWZpbmVkJykgdGhyb3cgXCJDYW5ub3QgZmluZCBqcXVlcnktdWkgc3Bpbm5lciB3aWRnZXQgZGVwZW5kZW5jeSFcIjtcblxuJC53aWRnZXQoXCJ1aS5zcGlubmVyXCIsIHNwaW5uZXIsIHtcbiAgX2FkanVzdFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciBhZGogPSB0aGlzLl9zdXBlcih2YWx1ZSk7XG5cbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgIC8vIGZpeCBwcmVjaXNpb24gZnJvbSBiYWQgSlMgZmxvYXRpbmcgcG9pbnQgbWF0aFxuICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZS50b0ZpeGVkKHRoaXMuX3ByZWNpc2lvbigpKSk7XG5cbiAgICAvLyBjbGFtcCB0aGUgdmFsdWVcbiAgICBpZiAob3B0aW9ucy5tYXggIT09IG51bGwgJiYgdmFsdWUgPiBvcHRpb25zLm1heCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMubWF4O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5taW4gIT09IG51bGwgJiYgdmFsdWUgPCBvcHRpb25zLm1pbikge1xuICAgICAgcmV0dXJuIG9wdGlvbnMubWluO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gT3ZlcnJpZGVzIG5hdGl2ZSBqUXVlcnkgdGFicyB0byBtYWtlIHRhYnMgd29ya2luZyBhbHNvIHdoZW4gdXNpbmcgYSBiYXNlIHRhZ1xuLy8gaW4gb3JkZXIgdG8gYXZvaWQgY29uZmxpY3RzIHlvdSBoYXZlIHRvIGFkZCBhIGRhdGEtbG9jYWw9XCJ0cnVlXCIgYXR0cmlidXRlIHRvIHlvdXIgdGFiIGxpbmtzLlxuXG52YXIgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xudmFyIGNvbnNvbGUgPSByZXF1aXJlKCdjb25zb2xlJyk7XG52YXIgdGFicyA9IHJlcXVpcmUoXCJqcXVlcnktdWkvdGFic1wiKTtcblxuaWYgKHR5cGVvZiB0YWJzID09ICd1bmRlZmluZWQnKSB0aHJvdyBcIkNhbm5vdCBmaW5kIGpxdWVyeS11aSB0YWJzIHdpZGdldCBkZXBlbmRlbmN5IVwiO1xuXG4kLndpZGdldChcInVpLnRhYnNcIiwgdGFicywge1xuICBfaXNMb2NhbDogZnVuY3Rpb24oIGFuY2hvciApIHtcbiAgICBpZiAoYW5jaG9yLmdldEF0dHJpYnV0ZSgnZGF0YS1sb2NhbCcpID09IFwidHJ1ZVwiKSByZXR1cm4gdHJ1ZTtcbiAgICBlbHNlIHJldHVybiB0aGlzLl9zdXBlckFwcGx5KCBhcmd1bWVudHMgKTtcbiAgfVxufSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKiBnbG9iYWxzIGdsb2JhbDogZmFsc2UgKi9cblxuZnVuY3Rpb24gcHVzaFRlbXBsYXRlKHRlbXBsYXRlTmFtZSwgdGVtcGxhdGVUZXh0KSB7XG4gIHZhciBzY3JpcHRUYWcgPSBnbG9iYWwuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gIHNjcmlwdFRhZy5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9odG1sJyk7XG4gIHNjcmlwdFRhZy5zZXRBdHRyaWJ1dGUoJ2lkJywgdGVtcGxhdGVOYW1lKTtcbiAgc2NyaXB0VGFnLnRleHQgPSB0ZW1wbGF0ZVRleHQ7XG4gIGdsb2JhbC5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdFRhZyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVRlbXBsYXRlKHRlbXBsYXRlTmFtZSkge1xuICB2YXIgZWwgPSBnbG9iYWwuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGVtcGxhdGVOYW1lKTtcbiAgaWYgKGVsKSBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbn1cblxuZnVuY3Rpb24gaW5pdCgpIHt9XG5cbmZ1bmN0aW9uIGdldFRlbXBsYXRlQ29udGVudChpZCkge1xuICB2YXIgZWwgPSBnbG9iYWwuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICBpZiAoZWwpIHJldHVybiBlbC5pbm5lckhUTUw7XG4gIGVsc2UgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGluaXQ6IGluaXQsXG4gIGFkZFRlbXBsYXRlOiBwdXNoVGVtcGxhdGUsXG4gIHJlbW92ZVRlbXBsYXRlOiByZW1vdmVUZW1wbGF0ZSxcbiAgZ2V0VGVtcGxhdGVDb250ZW50OiBnZXRUZW1wbGF0ZUNvbnRlbnRcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKiBnbG9iYWwgZ2xvYmFsOiBmYWxzZSAqL1xuXG52YXIga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XG52YXIgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG52YXIgY29uc29sZSA9IHJlcXVpcmUoXCJjb25zb2xlXCIpO1xudmFyIHRpbnltY2UgPSByZXF1aXJlKFwidGlueW1jZVwiKTtcblxudmFyIHRpbWVvdXQ7XG5cbnZhciByZW5kZXIgPSBmdW5jdGlvbigpIHtcblxuICB0aW1lb3V0ID0gdW5kZWZpbmVkO1xuXG4gIGlmICh0eXBlb2YgdGlueW1jZS5hY3RpdmVFZGl0b3IgIT09ICd1bmRlZmluZWQnICYmIHRpbnltY2UuYWN0aXZlRWRpdG9yICE9PSBudWxsICYmXG4gICAgICB0eXBlb2YgdGlueW1jZS5hY3RpdmVFZGl0b3IudGhlbWUgIT09ICd1bmRlZmluZWQnICYmIHRpbnltY2UuYWN0aXZlRWRpdG9yLnRoZW1lICE9PSBudWxsICYmIFxuICAgICAgdHlwZW9mIHRpbnltY2UuYWN0aXZlRWRpdG9yLnRoZW1lLnBhbmVsICE9PSAndW5kZWZpbmVkJyAmJiB0aW55bWNlLmFjdGl2ZUVkaXRvci50aGVtZS5wYW5lbCAhPT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHRpbnltY2UuYWN0aXZlRWRpdG9yLnRoZW1lLnBhbmVsLnZpc2libGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gQHNlZSBGbG9hdFBhbmVsLmpzIGZ1bmN0aW9uIHJlcG9zaXRpb25QYW5lbChwYW5lbClcbiAgICAvLyBGaXJzdCBjb25kaXRpb24gZ3JvdXAgaXMgZm9yIFRpbnltY2UgNC4wLzQuMVxuICAgIC8vIFNlY29uZCBjb25kaXRpb24gZ3JvdXAgaXMgZm9yIFRpbnltY2UgNC4yLzQuMyB3aGVyZSBcIi5fcHJvcGVydHlcIiBhcmUgbm93IGF2YWlsYWJsZSBhcyBcIi5zdGF0ZS5nZXQoJ3Byb3BlcnR5JylcIi5cbiAgICBpZiAoKHR5cGVvZiB0aW55bWNlLmFjdGl2ZUVkaXRvci50aGVtZS5wYW5lbC5fdmlzaWJsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGlueW1jZS5hY3RpdmVFZGl0b3IudGhlbWUucGFuZWwuX3Zpc2libGUgJiYgdGlueW1jZS5hY3RpdmVFZGl0b3IudGhlbWUucGFuZWwuX2ZpeGVkKSB8fCBcbiAgICAgICAgKHR5cGVvZiB0aW55bWNlLmFjdGl2ZUVkaXRvci50aGVtZS5wYW5lbC5zdGF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGlueW1jZS5hY3RpdmVFZGl0b3IudGhlbWUucGFuZWwuc3RhdGUuZ2V0KCd2aXNpYmxlJykgJiYgdGlueW1jZS5hY3RpdmVFZGl0b3IudGhlbWUucGFuZWwuc3RhdGUuZ2V0KCdmaXhlZCcpKSkge1xuICAgICAgdGlueW1jZS5hY3RpdmVFZGl0b3IudGhlbWUucGFuZWwuZml4ZWQoZmFsc2UpO1xuICAgIH1cblxuICAgIHRpbnltY2UuYWN0aXZlRWRpdG9yLm5vZGVDaGFuZ2VkKCk7XG4gICAgdGlueW1jZS5hY3RpdmVFZGl0b3IudGhlbWUucGFuZWwudmlzaWJsZSh0cnVlKTtcbiAgICBpZiAodGlueW1jZS5hY3RpdmVFZGl0b3IudGhlbWUucGFuZWwubGF5b3V0UmVjdCgpLnkgPD0gNDApXG4gICAgICB0aW55bWNlLmFjdGl2ZUVkaXRvci50aGVtZS5wYW5lbC5tb3ZlQnkoMCwgNDAgLSB0aW55bWNlLmFjdGl2ZUVkaXRvci50aGVtZS5wYW5lbC5sYXlvdXRSZWN0KCkueSk7XG5cbiAgfVxufTtcblxua28uYmluZGluZ0hhbmRsZXJzLnd5c2l3eWdTY3JvbGxmaXggPSB7XG4gICdzY3JvbGwnOiBmdW5jdGlvbihldmVudCkge1xuICAgIGlmICh0aW1lb3V0KSBnbG9iYWwuY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIHRpbWVvdXQgPSBnbG9iYWwuc2V0VGltZW91dChyZW5kZXIsIDUwKTtcbiAgfSxcbiAgJ2luaXQnOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFjayhlbGVtZW50LCBmdW5jdGlvbigpIHtcbiAgICAgICQoZWxlbWVudCkub2ZmKFwic2Nyb2xsXCIsIGtvLmJpbmRpbmdIYW5kbGVycy53eXNpd3lnU2Nyb2xsZml4LnNjcm9sbCk7XG4gICAgfSk7XG5cbiAgICAkKGVsZW1lbnQpLm9uKFwic2Nyb2xsXCIsIGtvLmJpbmRpbmdIYW5kbGVycy53eXNpd3lnU2Nyb2xsZml4LnNjcm9sbCk7XG5cbiAgfVxufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xudmFyIGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xudmFyIGNvbnNvbGUgPSByZXF1aXJlKFwiY29uc29sZVwiKTtcblxudmFyIF9zY3JvbGxJbnRvVmlldyA9IGZ1bmN0aW9uKCRlbGVtZW50LCBhbGlnblRvcCwgc2Nyb2xsUGFyZW50LCBtb3ZlQnkpIHtcbiAgdmFyIGN1cnJlbnRTY3JvbGxUb3AgPSBzY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCk7XG4gIHZhciBuZXdTY3JvbGxUb3AgPSBjdXJyZW50U2Nyb2xsVG9wIC0gbW92ZUJ5IC0gKGFsaWduVG9wID8gMjAgOiAtMjApO1xuICAvLyBpZnJhbWUgc2Nyb2xscyB0aGUgd2luZG93IGFuZCBhbmltYXRpb24gaXMgbm90IHN1cHBvcnRlZFxuICB2YXIgYW5pbWF0ZSA9IHR5cGVvZiBzY3JvbGxQYXJlbnRbMF0ubm9kZVR5cGUgIT09ICd1bmRlZmluZWQnO1xuICBpZiAoYW5pbWF0ZSkge1xuICAgIHZhciBhY3Rpb24gPSB7XG4gICAgICAnc2Nyb2xsVG9wJzogXCJcIiArIE1hdGgucm91bmQobmV3U2Nyb2xsVG9wKSArIFwicHhcIlxuICAgIH07XG4gICAgdmFyIHRpbWUgPSBNYXRoLnJvdW5kKE1hdGguYWJzKG5ld1Njcm9sbFRvcCAtIGN1cnJlbnRTY3JvbGxUb3ApKTtcbiAgICBzY3JvbGxQYXJlbnQuc3RvcCgpLmFuaW1hdGUoYWN0aW9uLCB0aW1lKTtcbiAgfSBlbHNlIHtcbiAgICBzY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKG5ld1Njcm9sbFRvcCk7XG4gIH1cbiAgLy8gbmF0aXZlIHNjcm9sbEludG9WaWV3IGlzIG5vdCB3ZWxsIHN1cHBvcnRlZCBhbmQgZG9lc24ndCB3b3JrIGZpbmUuXG4gIC8vIGVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoYWxpZ25Ub3ApO1xufTtcblxua28uYmluZGluZ0hhbmRsZXJzLnNjcm9sbEludG9WaWV3ID0ge1xuICB1cGRhdGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcbiAgICB2YXIgc2VsZWN0ZWQgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSk7XG4gICAgaWYgKCFzZWxlY3RlZCkgcmV0dXJuO1xuICAgIHRyeSB7XG5cbiAgICAgIHdoaWxlIChlbGVtZW50Lm5vZGVUeXBlID09PSA4KSB7XG4gICAgICAgIC8vIGVsZW1lbnQgaXMgYSBjb21tZW50LCBtb3ZlIHRvIHRoZSBuZXh0IHNpYmxpbmcuLi5cbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQubmV4dFNpYmxpbmc7XG4gICAgICB9XG4gICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSAhPT0gOCkge1xuICAgICAgICB2YXIgc2Nyb2xsUGFyZW50ID0gJChlbGVtZW50KS5zY3JvbGxQYXJlbnQoKTtcblxuICAgICAgICB2YXIgcGFyZW50VG9wO1xuICAgICAgICB2YXIgcmVsYXRpdmVPZmZzZXQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHNjcm9sbFBhcmVudFswXS5ub2RlVHlwZSA9PSA5KSB7XG4gICAgICAgICAgLy8gc2Nyb2xscGFyZW50IGlzIGRvY3VtZW50LCByZXBsYWNpbmcgd2l0aCBib2R5Li4uXG4gICAgICAgICAgc2Nyb2xsUGFyZW50ID0gJChzY3JvbGxQYXJlbnRbMF0uZGVmYXVsdFZpZXcpO1xuICAgICAgICAgIHBhcmVudFRvcCA9IDA7XG4gICAgICAgICAgcmVsYXRpdmVPZmZzZXQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmVudFRvcCA9IHNjcm9sbFBhcmVudC5vZmZzZXQoKS50b3A7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGFyZW50SGVpZ2h0ID0gc2Nyb2xsUGFyZW50LmhlaWdodCgpO1xuICAgICAgICB2YXIgcGFyZW50U2Nyb2xsID0gc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpO1xuICAgICAgICB2YXIgcGFyZW50Qm90dG9tID0gcGFyZW50VG9wICsgcGFyZW50SGVpZ2h0O1xuXG4gICAgICAgIC8vIHNjcm9sbFBhcmVudCBpcyB0aGUgZG9jdW1lbnQuXG4gICAgICAgIHZhciAkZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICAgIHZhciBlbFRvcCA9ICRlbGVtZW50Lm9mZnNldCgpLnRvcDtcbiAgICAgICAgLy8gd2hlbiB3ZSBhcmUgaW4gXCJpZnJhbWVcIiB3aXRoIHNjcm9sbGJhciBldmVyeXRoaWpuZyBjaGFuZ2VzLlxuICAgICAgICBpZiAocmVsYXRpdmVPZmZzZXQpIGVsVG9wID0gZWxUb3AgLSBwYXJlbnRTY3JvbGw7XG4gICAgICAgIHZhciBlbEhlaWdodCA9ICRlbGVtZW50LmhlaWdodCgpO1xuICAgICAgICB2YXIgZWxCb3R0b20gPSBlbFRvcCArIGVsSGVpZ2h0O1xuICAgICAgICBpZiAoZWxUb3AgPiBwYXJlbnRUb3AgJiYgZWxUb3AgKyBlbEhlaWdodCA8IHBhcmVudEJvdHRvbSkge1xuICAgICAgICAgIC8vIGJvdGggYm9yZGVycyBhcmUgdmlzaWJsZSA9PiBkb24ndCBkbyBhbnl0aGluZy5cbiAgICAgICAgfSBlbHNlIGlmIChlbEhlaWdodCA8IHBhcmVudEhlaWdodCkge1xuICAgICAgICAgIC8vIGlmIHRoZSBibG9jayBpcyBzbWFsbGVyIHRoYW4gdGhlIHZpZXdQb3J0XG4gICAgICAgICAgaWYgKGVsVG9wIDwgcGFyZW50VG9wKSBfc2Nyb2xsSW50b1ZpZXcoZWxlbWVudCwgdHJ1ZSwgc2Nyb2xsUGFyZW50LCBwYXJlbnRUb3AgLSBlbFRvcCk7XG4gICAgICAgICAgLy8gLT4gaWYgdGhlIHVwcGVyIGJvcmRlciBpcyBoaWdoZXIgdGhhbiB0aGUgdG9wLCB0aGVuIEkgbW92ZSBpdCB0byB0aGUgdG9wLlxuICAgICAgICAgIGlmIChlbEJvdHRvbSA+IHBhcmVudEJvdHRvbSkgX3Njcm9sbEludG9WaWV3KGVsZW1lbnQsIGZhbHNlLCBzY3JvbGxQYXJlbnQsIHBhcmVudEJvdHRvbSAtIGVsQm90dG9tKTtcbiAgICAgICAgICAvLyAtPiBpZiB0aGUgYm90dG9tIGJvcmRlciBpcyBsb3dlciB0aGFuIHRoZSBib3R0b20gdGhlbiBJIG1vdmUgaXQgdG8gdGhlIGJvdHRvbS5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZiB0aGUgYmxvY2sgaXMgbGFyZ2VyIHRoYW4gdGhlIHZpZXdQb3J0IHdlIGRvIHRoZSBvcHBvc2l0ZSFcbiAgICAgICAgICAvLyAtPiBpZiB0aGUgdXBwZXIgYm9yZGVyIGlzIGhpZ2hlciB0aGFuIHRoZSB0b3AgYW5kIHRoZSBsb3dlciBpcyBoaWdoZXIgdGhhbiB0aGUgYm90dG9tIEkgbW92ZSB0aGUgbG93ZXIgaXQgdG8gdGhlIGJvdHRvbS5cbiAgICAgICAgICBpZiAoZWxUb3AgPCBwYXJlbnRUb3AgJiYgZWxCb3R0b20gPCBwYXJlbnRCb3R0b20pIF9zY3JvbGxJbnRvVmlldyhlbGVtZW50LCBmYWxzZSwgc2Nyb2xsUGFyZW50LCBwYXJlbnRCb3R0b20gLSBlbEJvdHRvbSk7XG4gICAgICAgICAgLy8gLT4gaWYgdGhlIGJvdHRvbSBib3JkZXIgaWwgbG93ZXIgdGhhbiBib3R0b20gYW5kIHRoZSB1cHBlciBpcyBsb3dlciB0aGFuIHRoZSB0b3AgSSBtb3ZlIHRoZSB1cHBlciBib3JkZXIgdG8gdGhlIHZpZXdwb3J0IHRvcFxuICAgICAgICAgIGlmIChlbFRvcCA+IHBhcmVudFRvcCAmJiBlbEJvdHRvbSA+IHBhcmVudEJvdHRvbSkgX3Njcm9sbEludG9WaWV3KGVsZW1lbnQsIHRydWUsIHNjcm9sbFBhcmVudCwgcGFyZW50VG9wIC0gZWxUb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZWxlbWVudC5zY3JvbGxJbnRvVmlldyh0cnVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIlRPRE8gZXhjZXB0aW9uIHNjcm9sbGluZyBpbnRvIHZpZXdcIiwgZSk7XG4gICAgfVxuICB9XG59O1xua28udmlydHVhbEVsZW1lbnRzLmFsbG93ZWRCaW5kaW5nc1snc2Nyb2xsSW50b1ZpZXcnXSA9IHRydWU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcbnZhciBvcmlnVGVtcGxhdGVTeXN0ZW0gPSByZXF1aXJlKFwiLi9zY3JpcHQtdGVtcGxhdGUuanNcIik7XG5cbnZhciB0ZW1wbGF0ZXMgPSB7fTtcblxuLy9kZWZpbmUgYSB0ZW1wbGF0ZSBzb3VyY2UgdGhhdCBzaW1wbHkgdHJlYXRzIHRoZSB0ZW1wbGF0ZSBuYW1lIGFzIGl0cyBjb250ZW50XG5rby50ZW1wbGF0ZVNvdXJjZXMuc3RyaW5nVGVtcGxhdGUgPSBmdW5jdGlvbih0ZW1wbGF0ZU5hbWUsIHRlbXBsYXRlKSB7XG4gIHRoaXMudGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lO1xuICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7XG4gIHRoaXMuX2RhdGEgPSB7fTtcbn07XG5cbmtvLnV0aWxzLmV4dGVuZChrby50ZW1wbGF0ZVNvdXJjZXMuc3RyaW5nVGVtcGxhdGUucHJvdG90eXBlLCB7XG4gIGRhdGE6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcImRhdGFcIiwga2V5LCB2YWx1ZSwgdGhpcy50ZW1wbGF0ZU5hbWUpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGF0YVtrZXldO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGFba2V5XSA9IHZhbHVlO1xuICB9LFxuICB0ZXh0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIC8vIGNvbnNvbGUubG9nKFwidGV4dFwiLCB2YWx1ZSwgdGhpcy50ZW1wbGF0ZU5hbWUpXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlO1xuICAgIH1cbiAgICB0aGlzLnRlbXBsYXRlID0gdmFsdWU7XG4gIH1cbn0pO1xuXG5cbi8vbW9kaWZ5IGFuIGV4aXN0aW5nIHRlbXBsYXRlRW5naW5lIHRvIHdvcmsgd2l0aCBzdHJpbmcgdGVtcGxhdGVzXG5mdW5jdGlvbiBjcmVhdGVTdHJpbmdUZW1wbGF0ZUVuZ2luZSh0ZW1wbGF0ZUVuZ2luZSkge1xuICB2YXIgb3JpZyA9IHRlbXBsYXRlRW5naW5lLm1ha2VUZW1wbGF0ZVNvdXJjZTtcbiAgdGVtcGxhdGVFbmdpbmUubWFrZVRlbXBsYXRlU291cmNlID0gZnVuY3Rpb24odGVtcGxhdGVOYW1lKSB7XG4gICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZXNbdGVtcGxhdGVOYW1lXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBuZXcga28udGVtcGxhdGVTb3VyY2VzLnN0cmluZ1RlbXBsYXRlKHRlbXBsYXRlTmFtZSwgdGVtcGxhdGVzW3RlbXBsYXRlTmFtZV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3JpZyh0ZW1wbGF0ZU5hbWUpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHRlbXBsYXRlRW5naW5lO1xufVxuXG5mdW5jdGlvbiBwdXNoVGVtcGxhdGUodGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZVRleHQpIHtcbiAgdGVtcGxhdGVzW3RlbXBsYXRlTmFtZV0gPSB0ZW1wbGF0ZVRleHQ7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVRlbXBsYXRlKHRlbXBsYXRlTmFtZSkge1xuICBpZiAodHlwZW9mIHRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIG9yaWdUZW1wbGF0ZVN5c3RlbS5yZW1vdmVUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQoKSB7XG4gIGtvLnNldFRlbXBsYXRlRW5naW5lKGNyZWF0ZVN0cmluZ1RlbXBsYXRlRW5naW5lKG5ldyBrby5uYXRpdmVUZW1wbGF0ZUVuZ2luZSgpKSk7XG59XG5cbmZ1bmN0aW9uIGdldFRlbXBsYXRlQ29udGVudChpZCkge1xuICBpZiAodHlwZW9mIHRlbXBsYXRlc1tpZF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlc1tpZF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG9yaWdUZW1wbGF0ZVN5c3RlbS5nZXRUZW1wbGF0ZUNvbnRlbnQoaWQpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpbml0OiBpbml0LFxuICBhZGRUZW1wbGF0ZTogcHVzaFRlbXBsYXRlLFxuICByZW1vdmVUZW1wbGF0ZTogcmVtb3ZlVGVtcGxhdGUsXG4gIGdldFRlbXBsYXRlQ29udGVudDogZ2V0VGVtcGxhdGVDb250ZW50XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XG52YXIgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG52YXIga29qcXVpID0gcmVxdWlyZShcImtub2Nrb3V0LWpxdWVyeXVpXCIpO1xudmFyIGNvbnNvbGUgPSByZXF1aXJlKFwiY29uc29sZVwiKTtcblxudmFyIGV4dGVuZFZhbHVlQWNjZXNzb3IgPSBmdW5jdGlvbih2YWx1ZUFjY2Vzc29yLCBvYmopIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGtvLnV0aWxzLmV4dGVuZChvYmosIHZhbHVlQWNjZXNzb3IoKSk7XG4gICAgcmV0dXJuIG9iajtcbiAgfTtcbn07XG5cbnZhciBvcHRpb25zID0ge1xuICBzaG93OiB7XG4gICAgZGVsYXk6IDUwMFxuICB9LFxuICB0cmFjazogdHJ1ZSxcbiAgaXRlbXM6ICdbdGl0bGVdW3RpdGxlIT1cIlwiXVt0aXRsZSE9XCIgXCJdJ1xufTtcblxua28uYmluZGluZ0hhbmRsZXJzLnRvb2x0aXBzID0ge1xuICBpbml0OiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5nc0FjY2Vzc29yLCBkYXRhLCBjb250ZXh0KSB7XG4gICAgaWYgKHR5cGVvZiAkLmZuLnRvb2x0aXAgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBrby5iaW5kaW5nSGFuZGxlcnMudG9vbHRpcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIHBvc2l0aW9uOiB7IG15OiBcImxlZnQrMTUgdG9wKzE1XCIsIGF0OiBcImNlbnRlciszMCBjZW50ZXIrMzBcIiB9XG4gICAgICAvLyBOT1RFIHRpdGxlIHdpdGggXCJcIiBhbmQgXCIgXCIgaXMgbmVlZGVkIHRvIGF2b2lkIGRlZmF1bHQgdG9vbHRpcHMgaW4gbmF0aXZlIGZpbGUgdXBsb2FkIGNvbnRyb2xzXG4gICAgICByZXR1cm4ga28uYmluZGluZ0hhbmRsZXJzLnRvb2x0aXAuaW5pdChlbGVtZW50LCBleHRlbmRWYWx1ZUFjY2Vzc29yKHZhbHVlQWNjZXNzb3IsIG9wdGlvbnMpLCBhbGxCaW5kaW5nc0FjY2Vzc29yLCBkYXRhLCBjb250ZXh0KTtcbiAgICB9XG4gIH0sXG4gIHVwZGF0ZTogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3NBY2Nlc3NvciwgZGF0YSwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgJC5mbi50b29sdGlwICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Yga28uYmluZGluZ0hhbmRsZXJzLnRvb2x0aXAgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4ga28uYmluZGluZ0hhbmRsZXJzLnRvb2x0aXAudXBkYXRlKGVsZW1lbnQsIGV4dGVuZFZhbHVlQWNjZXNzb3IodmFsdWVBY2Nlc3Nvciwgb3B0aW9ucyksIGFsbEJpbmRpbmdzQWNjZXNzb3IsIGRhdGEsIGNvbnRleHQpO1xuICAgIH1cbiAgfSxcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBrbyA9IHJlcXVpcmUoJ2tub2Nrb3V0Jyk7XG52YXIgY29uc29sZSA9IHJlcXVpcmUoJ2NvbnNvbGUnKTtcblxuLy8gZXF1YWxzIHRvIFwidmFsdWVcIiBiaW5kaW5nIGJ1dCBhcHBseSBcImludmFsaWRcIiBjbGFzcyBpZiBcInBhdHRlcm5cIiBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBhbmQgdmFsdWUgbWF0Y2hlcyB0aGUgcnVsZVxua28uYmluZGluZ0hhbmRsZXJzWyd2YWxpZGF0ZWRWYWx1ZSddID0ge1xuXHRpbml0OiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncykge1xuXHRcdHZhciBuZXdWYWx1ZUFjY2Vzc29yID0gdmFsdWVBY2Nlc3Nvcjtcblx0XHRpZiAodHlwZW9mIGVsZW1lbnQucGF0dGVybiAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHZhciByZSA9IG5ldyBSZWdFeHAoJ14oPzonICsgZWxlbWVudC5wYXR0ZXJuICsgJykkJyk7XG5cdFx0XHR2YXIgY29tcHV0ZWQgPSBrby5jb21wdXRlZCh7XG5cdFx0XHRcdHJlYWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHZhciByZXMgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSk7XG5cdFx0XHRcdFx0Ly8gVE9ETyBzdXBwb3J0IGZvciBlbGVtZW50LnJlcXVpcmVkID9cblx0XHRcdFx0XHR2YXIgdmFsaWQgPSByZXMgPT09IG51bGwgfHwgcmVzID09PSAnJyB8fCByZS50ZXN0KHJlcyk7XG5cdFx0XHRcdFx0Ly8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgY2xhc3NMaXN0LnRvZ2dsZSgnaW52YWxpZCcsIHN0YXRlKVxuXHRcdFx0XHRcdGlmICh2YWxpZCkge1xuXHRcdFx0XHRcdFx0ZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdpbnZhbGlkJyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaW52YWxpZCcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gcmVzO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR3cml0ZToga28uaXNXcml0ZWFibGVPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSkgJiYgZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdFx0XHQvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92b2lkbGFicy9tb3NhaWNvL2lzc3Vlcy8xMDNcblx0XHRcdFx0XHRrby5zZWxlY3RFeHRlbnNpb25zLndyaXRlVmFsdWUoZWxlbWVudCwgdmFsdWUpO1xuXHRcdFx0XHRcdHZhciB1cGRWYWx1ZSA9IGtvLnNlbGVjdEV4dGVuc2lvbnMucmVhZFZhbHVlKGVsZW1lbnQpO1xuXHRcdFx0XHRcdHZhbHVlQWNjZXNzb3IoKSh1cGRWYWx1ZSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogZWxlbWVudFxuXHRcdFx0fSk7XG5cdFx0XHRuZXdWYWx1ZUFjY2Vzc29yID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBjb21wdXRlZDtcblx0XHRcdH07XG5cdFx0fVxuXHRcdGtvLmJpbmRpbmdIYW5kbGVyc1sndmFsdWUnXS5pbml0KGVsZW1lbnQsIG5ld1ZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzKTtcblx0fVxufTtcbmtvLmV4cHJlc3Npb25SZXdyaXRpbmcuX3R3b1dheUJpbmRpbmdzWyd2YWxpZGF0ZWRWYWx1ZSddID0gdHJ1ZTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLyogZ2xvYmFscyBnbG9iYWw6ZmFsc2UgKi9cblxudmFyIGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xudmFyIGNvbnNvbGUgPSByZXF1aXJlKFwiY29uc29sZVwiKTtcblxua28uYmluZGluZ0hhbmRsZXJzWyd1bmlxdWVJZCddID0ge1xuICBjdXJyZW50SW5kZXg6IDAsXG4gICdpbml0JzogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xuICAgIHZhciBkYXRhID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpIHx8IHt9O1xuICAgIGlmIChkYXRhLmlkKCkgPT09ICcnKSB7XG4gICAgICB2YXIgaWQsIGVsLCBwcmVmaXg7XG4gICAgICAvLyBUT0RPIHdlIG5lZWQgYSBiZXR0ZXIgcHJlZml4XG4gICAgICBwcmVmaXggPSAna29fJyArICh0eXBlb2YgZGF0YS50eXBlICE9PSAndW5kZWZpbmVkJyA/IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoZGF0YS50eXBlKSA6ICdibG9jaycpO1xuICAgICAgLy8gd2hlbiBsb2FkaW5nIGFuIGV4aXNpbmcgbW9kZWwsIElEcyBjb3VsZCBiZSBhbHJlYWR5IGFzc2lnbmVkLlxuICAgICAgZG8ge1xuICAgICAgICBpZCA9IHByZWZpeCArICdfJyArICgrK2tvLmJpbmRpbmdIYW5kbGVyc1sndW5pcXVlSWQnXS5jdXJyZW50SW5kZXgpO1xuICAgICAgICBlbCA9IGdsb2JhbC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICAgIGlmIChlbCkge1xuICAgICAgICAgIC8vIHdoZW4gbG9hZGluZyBhbiBleGlzdGluZyBtb2RlbCBteSBcImN1cnJlbnRJbmRleFwiIGlzIGVtcHR5LlxuICAgICAgICAgIC8vIGJ1dCB3ZSBoYXZlIGV4aXN0aW5nIGJsb2Nrcywgc28gSSBtdXN0IGJlIHN1cmUgSSBkb24ndCByZXVzZSB0aGVpciBJRHMuXG4gICAgICAgICAgLy8gV2UgdXNlIGRpZmZlcmVudCBwcmVmaXhlcyAocGVyIGJsb2NrIHR5cGUpIHNvIHRoYXQgYSBoaWRkZW4gYmxvY2sgXG4gICAgICAgICAgLy8gKGZvciB3aGljaCB3ZSBoYXZlIG5vIGlkIGluIHRoZSBwYWdlLCBlLmc6IHByZWhlYWRlciBpbiB2ZXJzYWZpeC0xKVxuICAgICAgICAgIC8vIHdpbGwgYnJlYWsgZXZlcnRoaW5nIG9uY2Ugd2UgcmV1c2UgaXRzIG5hbWUuXG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKGVsKTtcbiAgICAgIGRhdGEuaWQoaWQpO1xuICAgIH1cbiAgfVxufTtcbmtvLnZpcnR1YWxFbGVtZW50cy5hbGxvd2VkQmluZGluZ3NbJ3VuaXF1ZUlkJ10gPSB0cnVlO1xuXG5rby5iaW5kaW5nSGFuZGxlcnNbJ3ZpcnR1YWxBdHRyJ10gPSB7XG4gIHVwZGF0ZTogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xuICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9PSA4KSB7XG4gICAgICBrby5iaW5kaW5nSGFuZGxlcnNbJ2F0dHInXS51cGRhdGUoZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcik7XG4gICAgfVxuICB9XG59O1xua28udmlydHVhbEVsZW1lbnRzLmFsbG93ZWRCaW5kaW5nc1sndmlydHVhbEF0dHInXSA9IHRydWU7XG5cbmtvLmJpbmRpbmdIYW5kbGVyc1sndmlydHVhbEF0dHJTdHlsZSddID0ge1xuICB1cGRhdGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcbiAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSAhPT0gOCkge1xuICAgICAgLy8gSW4gXCJwcmV2aWV3XCIgd2UgYWxzbyBzZXQgXCJyZXBsYWNlZHN0eWxlXCIgc28gdG8gaGF2ZSBhbiBhdHRyaWJ1dGUgdG8gYmUgdXNlZCBieSBJRSAoSUUgYnJlYWtzIHRoZSBTVFlMRSkgdG8gZG8gdGhlIGV4cG9ydC5cbiAgICAgIHZhciBpc05vdFd5c2l3eWdNb2RlID0gKHR5cGVvZiBiaW5kaW5nQ29udGV4dC50ZW1wbGF0ZU1vZGUgPT0gJ3VuZGVmaW5lZCcgfHwgYmluZGluZ0NvbnRleHQudGVtcGxhdGVNb2RlICE9ICd3eXNpd3lnJyk7XG4gICAgICB2YXIgYXR0cnMgPSBbXCJzdHlsZVwiXTtcbiAgICAgIGlmIChpc05vdFd5c2l3eWdNb2RlKSBhdHRycy5wdXNoKFwicmVwbGFjZWRzdHlsZVwiKTtcbiAgICAgIHZhciBhdHRyVmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBhdHRyTmFtZSA9IGF0dHJzW2ldO1xuICAgICAgICB2YXIgdG9SZW1vdmUgPSAoYXR0clZhbHVlID09PSBmYWxzZSkgfHwgKGF0dHJWYWx1ZSA9PT0gbnVsbCkgfHwgKGF0dHJWYWx1ZSA9PT0gdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHRvUmVtb3ZlKVxuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xua28udmlydHVhbEVsZW1lbnRzLmFsbG93ZWRCaW5kaW5nc1sndmlydHVhbEF0dHJTdHlsZSddID0gdHJ1ZTtcblxua28uYmluZGluZ0hhbmRsZXJzWyd2aXJ0dWFsU3R5bGUnXSA9IHtcbiAgdXBkYXRlOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XG4gICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgIT09IDgpIHtcbiAgICAgIGtvLmJpbmRpbmdIYW5kbGVyc1snc3R5bGUnXS51cGRhdGUoZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcik7XG4gICAgfVxuICB9XG59O1xua28udmlydHVhbEVsZW1lbnRzLmFsbG93ZWRCaW5kaW5nc1sndmlydHVhbFN0eWxlJ10gPSB0cnVlO1xuXG5cbmtvLmJpbmRpbmdIYW5kbGVyc1sndmlydHVhbEh0bWwnXSA9IHtcbiAgaW5pdDoga28uYmluZGluZ0hhbmRsZXJzWydodG1sJ10uaW5pdCxcbiAgdXBkYXRlOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XG4gICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IDgpIHtcbiAgICAgIHZhciBodG1sID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpO1xuXG4gICAgICBrby52aXJ0dWFsRWxlbWVudHMuZW1wdHlOb2RlKGVsZW1lbnQpO1xuICAgICAgaWYgKChodG1sICE9PSBudWxsKSAmJiAoaHRtbCAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBpZiAodHlwZW9mIGh0bWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaHRtbCA9IGh0bWwudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwYXJzZWROb2RlcyA9IGtvLnV0aWxzLnBhcnNlSHRtbEZyYWdtZW50KGh0bWwpO1xuICAgICAgICBpZiAocGFyc2VkTm9kZXMpIHtcbiAgICAgICAgICB2YXIgZW5kQ29tbWVudE5vZGUgPSBlbGVtZW50Lm5leHRTaWJsaW5nO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gcGFyc2VkTm9kZXMubGVuZ3RoOyBpIDwgajsgaSsrKVxuICAgICAgICAgICAgZW5kQ29tbWVudE5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocGFyc2VkTm9kZXNbaV0sIGVuZENvbW1lbnROb2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIHBsYWluIG5vZGVcbiAgICAgIGtvLmJpbmRpbmdIYW5kbGVyc1snaHRtbCddLnVwZGF0ZShlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKTtcbiAgICB9XG5cbiAgICAvLyBDb250ZW50IGZvciB2aXJ0dWFsSFRNTCBtdXN0IG5vdCBiZSBwYXJzZWQgYnkgS08sIGl0IGlzIHNpbXBsZSBjb250ZW50LlxuICAgIHJldHVybiB7XG4gICAgICBjb250cm9sc0Rlc2NlbmRhbnRCaW5kaW5nczogdHJ1ZVxuICAgIH07XG4gIH1cbn07XG5rby52aXJ0dWFsRWxlbWVudHMuYWxsb3dlZEJpbmRpbmdzWyd2aXJ0dWFsSHRtbCddID0gdHJ1ZTsiLCJcInVzZSBzdHJpY3RcIjtcbi8qIGdsb2JhbCBnbG9iYWw6IGZhbHNlICovXG5cbnZhciB0aW55bWNlID0gcmVxdWlyZShcInRpbnltY2VcIik7XG52YXIgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG52YXIga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XG52YXIgY29uc29sZSA9IHJlcXVpcmUoXCJjb25zb2xlXCIpO1xucmVxdWlyZShcIi4vZXZlbnRhYmxlLmpzXCIpO1xuXG5rby5iaW5kaW5nSGFuZGxlcnMud3lzaXd5Z09ySHRtbCA9IHtcbiAgaW5pdDogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3NBY2Nlc3Nvciwgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xuICAgIHZhciBpc05vdFd5c2l3eWdNb2RlID0gKHR5cGVvZiBiaW5kaW5nQ29udGV4dC50ZW1wbGF0ZU1vZGUgPT0gJ3VuZGVmaW5lZCcgfHwgYmluZGluZ0NvbnRleHQudGVtcGxhdGVNb2RlICE9ICd3eXNpd3lnJyk7XG5cbiAgICBpZiAoaXNOb3RXeXNpd3lnTW9kZSlcbiAgICAgIHJldHVybiBrby5iaW5kaW5nSGFuZGxlcnNbJ3ZpcnR1YWxIdG1sJ10uaW5pdCgpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBrby5iaW5kaW5nSGFuZGxlcnMud3lzaXd5Zy5pbml0KGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpO1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcbiAgICB2YXIgaXNOb3RXeXNpd3lnTW9kZSA9ICh0eXBlb2YgYmluZGluZ0NvbnRleHQudGVtcGxhdGVNb2RlID09ICd1bmRlZmluZWQnIHx8IGJpbmRpbmdDb250ZXh0LnRlbXBsYXRlTW9kZSAhPSAnd3lzaXd5ZycpO1xuICAgIGlmIChpc05vdFd5c2l3eWdNb2RlKVxuICAgICAgcmV0dXJuIGtvLmJpbmRpbmdIYW5kbGVyc1sndmlydHVhbEh0bWwnXS51cGRhdGUoZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3NBY2Nlc3Nvciwgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCk7XG4gICAgLy9lbHNlIFxuICAgIC8vICByZXR1cm4ga28uYmluZGluZ0hhbmRsZXJzLnd5c2l3eWcudXBkYXRlKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpO1xuICB9XG59O1xua28udmlydHVhbEVsZW1lbnRzLmFsbG93ZWRCaW5kaW5nc1snd3lzaXd5Z09ySHRtbCddID0gdHJ1ZTtcblxua28uYmluZGluZ0hhbmRsZXJzLnd5c2l3eWdIcmVmID0ge1xuICBpbml0OiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5nc0FjY2Vzc29yLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgIT09IDgpIHtcbiAgICAgIHZhciB2ID0gdmFsdWVBY2Nlc3NvcigpO1xuXG4gICAgICB2YXIgaXNOb3RXeXNpd3lnTW9kZSA9ICh0eXBlb2YgYmluZGluZ0NvbnRleHQudGVtcGxhdGVNb2RlID09ICd1bmRlZmluZWQnIHx8IGJpbmRpbmdDb250ZXh0LnRlbXBsYXRlTW9kZSAhPSAnd3lzaXd5ZycpO1xuICAgICAgLy8gY29uc29sZS5sb2coXCJYWFhcIiwgYmluZGluZ0NvbnRleHQudGVtcGxhdGVNb2RlLCBpc05vdFd5c2l3eWdNb2RlLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImhyZWZcIikpO1xuICAgICAgaWYgKGlzTm90V3lzaXd5Z01vZGUpIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsICdfbmV3Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKmpzaGludCBzY3JpcHR1cmw6dHJ1ZSovXG4gICAgICAgIC8vIDIwMTUwMjI2OiByZW1vdmVkIGhyZWYgdG8gd29yayBhcm91bmQgRkYgaXNzdWVzIHdpdGggPGEgaHJlZj1cIlwiPjxkaXYgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiPi4uPC9kaXY+PC9hPlxuICAgICAgICAvLyBlbGVtZW50LnNldEF0dHJpYnV0ZSgnaHJlZicsICdqYXZhc2NyaXB0OnZvaWQoMCknKTtcbiAgICAgICAgLy8gMjAxNTAzMDk6IG9uIElFLCBhbiBlZGl0YWJsZSA8YSBocmVmPVwiXCIgZGF0YS1lZGl0YWJsZT1cIlwiPiBwcmV2ZW50IHRpbnltY2UgdG9vbGJhciB0byBiZSBzaG93bi5cbiAgICAgICAgLy8gICAgICAgICAgIHNvIEkgY2hhbmdlIGJlaGF2aW91ciBiYXNlZCBvbiB0aGUgdXNlIG9mIFwid3lzaXd5Z09ySHRtbFwiXG4gICAgICAgIC8vIEBzZWU6IGh0dHA6Ly93d3cudGlueW1jZS5jb20vZGV2ZWxvcC9idWd0cmFja2VyX3ZpZXcucGhwP2lkPTc0MzJcbiAgICAgICAgdmFyIGFsbGJpbmRpbmdzID0gYWxsQmluZGluZ3NBY2Nlc3NvcigpO1xuICAgICAgICBpZiAodHlwZW9mIGFsbGJpbmRpbmdzLnd5c2l3eWdPckh0bWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnamF2YXNjcmlwdDp2b2lkKDApJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWRocmVmJywgJyMnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgdXBkYXRlOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5nc0FjY2Vzc29yLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgIT09IDgpIHtcbiAgICAgIHZhciBpc05vdFd5c2l3eWdNb2RlID0gKHR5cGVvZiBiaW5kaW5nQ29udGV4dC50ZW1wbGF0ZU1vZGUgPT0gJ3VuZGVmaW5lZCcgfHwgYmluZGluZ0NvbnRleHQudGVtcGxhdGVNb2RlICE9ICd3eXNpd3lnJyk7XG4gICAgICAvLyBOT1RFIHRoaXMgdW53cmFwIGlzIG5lZWRlZCBhbHNvIGluIFwid3lzaXd5Z1wiIG1vZGUsIG90aGVyd2lzZSBkZXBlbmRlbmN5IHRyYWNraW5nIGRpZXMuXG4gICAgICB2YXIgYXR0clZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpO1xuICAgICAgaWYgKGlzTm90V3lzaXd5Z01vZGUpIHtcbiAgICAgICAgaWYgKChhdHRyVmFsdWUgPT09IGZhbHNlKSB8fCAoYXR0clZhbHVlID09PSBudWxsKSB8fCAoYXR0clZhbHVlID09PSB1bmRlZmluZWQpKVxuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdocmVmJyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnaHJlZicsIGF0dHJWYWx1ZS50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5rby52aXJ0dWFsRWxlbWVudHMuYWxsb3dlZEJpbmRpbmdzWyd3eXNpd3lnSHJlZiddID0gdHJ1ZTtcblxua28uYmluZGluZ0hhbmRsZXJzLnd5c2l3eWdTcmMgPSB7XG4gIGNvbnZlcnRlZFVybDogZnVuY3Rpb24oc3JjLCBtZXRob2QsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICB2YXIgcmVzID0gc3JjICsgXCI/bWV0aG9kPVwiICsgbWV0aG9kICsgXCImd2lkdGg9XCIgKyB3aWR0aCArIChoZWlnaHQgIT09IG51bGwgPyBcIiZoZWlnaHQ9XCIgKyBoZWlnaHQgOiAnJyk7XG4gICAgY29uc29sZS5sb2coXCJiYXNpYyBjb252ZXJ0ZXJVcmxcIiwgcmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9LFxuICBwbGFjZWhvbGRlclVybDogZnVuY3Rpb24ocGx3aWR0aCwgcGxoZWlnaHQsIHBsdGV4dCkge1xuICAgIHZhciBwbGFjZWhvbGRlcnNyYyA9IFwiJ2h0dHA6Ly9sb3JlbXBpeGVsLmNvbS9nLycrXCIgKyBwbHdpZHRoICsgXCIrJy8nK1wiICsgcGxoZWlnaHQgKyBcIisnL2Fic3RyYWN0LycrZW5jb2RlVVJJQ29tcG9uZW50KFwiICsgcGx0ZXh0ICsgXCIpXCI7XG4gICAgLy8gaHR0cDovL3BsYWNlaG9sZC5pdC8yMDB4MTUwLnBuZy9jY2NjY2MvMzMzMzMzJnRleHQ9cGxhY2Vob2xkLml0I3N0aGFzaC5uQTNyMjZ2Ui5kcHVmXG4gICAgLy8gcGxhY2Vob2xkZXJzcmMgPSBcIidodHRwOi8vcGxhY2Vob2xkLml0LycrXCIrd2lkdGgrXCIrJ3gnK1wiK2hlaWdodCtcIisnLnBuZy9jY2NjY2MvMzMzMzMzJnRleHQ9JytcIitzaXplO1xuICAgIC8vIHBsYWNlaG9sZGVyc3JjID0gXCInXCIrY29udmVydGVyVXRpbHMuYWRkU2xhc2hlcyhkZWZhdWx0VmFsdWUpK1wiJ1wiO1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcbiAgICB2YXIgdmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSk7XG4gICAgdmFyIGF0dHJWYWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWUuc3JjKTtcbiAgICB2YXIgcGxhY2Vob2xkZXJWYWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWUucGxhY2Vob2xkZXIpO1xuICAgIHZhciB3aWR0aCA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWUud2lkdGgpO1xuICAgIHZhciBoZWlnaHQgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlLmhlaWdodCk7XG4gICAgaWYgKChhdHRyVmFsdWUgPT09IGZhbHNlKSB8fCAoYXR0clZhbHVlID09PSBudWxsKSB8fCAoYXR0clZhbHVlID09PSB1bmRlZmluZWQpIHx8IChhdHRyVmFsdWUgPT09ICcnKSkge1xuICAgICAgaWYgKHR5cGVvZiBwbGFjZWhvbGRlclZhbHVlID09ICdvYmplY3QnICYmIHBsYWNlaG9sZGVyVmFsdWUgIT09IG51bGwpIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzcmMnLCBrby5iaW5kaW5nSGFuZGxlcnMud3lzaXd5Z1NyYy5wbGFjZWhvbGRlclVybChwbGFjZWhvbGRlclZhbHVlLndpZHRoLCBwbGFjZWhvbGRlclZhbHVlLmhlaWdodCwgcGxhY2Vob2xkZXJWYWx1ZS50ZXh0KSk7XG4gICAgICBlbHNlIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG1ldGhvZCA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWUubWV0aG9kKTtcbiAgICAgIGlmICghbWV0aG9kKSBtZXRob2QgPSB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCA/ICdjb3ZlcicgOiAncmVzaXplJztcbiAgICAgIHZhciBzcmMgPSBrby5iaW5kaW5nSGFuZGxlcnMud3lzaXd5Z1NyYy5jb252ZXJ0ZWRVcmwoYXR0clZhbHVlLnRvU3RyaW5nKCksIG1ldGhvZCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnc3JjJywgc3JjKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aWR0aCAhPT0gJ3VuZGVmaW5lZCcgJiYgd2lkdGggIT09IG51bGwpIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgd2lkdGgpO1xuICAgIGVsc2UgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJ3aWR0aFwiKTtcbiAgICBpZiAodHlwZW9mIGhlaWdodCAhPT0gJ3VuZGVmaW5lZCcgJiYgaGVpZ2h0ICE9PSBudWxsKSBlbGVtZW50LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBoZWlnaHQpO1xuICAgIGVsc2UgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJoZWlnaHRcIik7XG4gIH1cbn07XG5cbmtvLmJpbmRpbmdIYW5kbGVycy53eXNpd3lnSWQgPSB7XG4gIGluaXQ6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcbiAgICB2YXIgaXNOb3RXeXNpd3lnTW9kZSA9ICh0eXBlb2YgYmluZGluZ0NvbnRleHQudGVtcGxhdGVNb2RlID09ICd1bmRlZmluZWQnIHx8IGJpbmRpbmdDb250ZXh0LnRlbXBsYXRlTW9kZSAhPSAnd3lzaXd5ZycpO1xuICAgIGlmICghaXNOb3RXeXNpd3lnTW9kZSlcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdpZCcsIGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKSk7XG4gIH0sXG4gIHVwZGF0ZTogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3NBY2Nlc3Nvciwgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xuICAgIHZhciBpc05vdFd5c2l3eWdNb2RlID0gKHR5cGVvZiBiaW5kaW5nQ29udGV4dC50ZW1wbGF0ZU1vZGUgPT0gJ3VuZGVmaW5lZCcgfHwgYmluZGluZ0NvbnRleHQudGVtcGxhdGVNb2RlICE9ICd3eXNpd3lnJyk7XG4gICAgaWYgKCFpc05vdFd5c2l3eWdNb2RlKVxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpKTtcbiAgfVxufTtcbmtvLnZpcnR1YWxFbGVtZW50cy5hbGxvd2VkQmluZGluZ3NbJ3d5c2l3eWdJZCddID0gdHJ1ZTtcblxuLy8gdXNlZCBvbiBlZGl0YWJsZSBcIml0ZW1cIiBzbyB0byBiaW5kIGNsaWNrcyBvbmx5IGluIHd5c2l3eWcgbW9kZS5cbmtvLmJpbmRpbmdIYW5kbGVycy53eXNpd3lnQ2xpY2sgPSB7XG4gIGluaXQ6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcbiAgICB2YXIgaXNOb3RXeXNpd3lnTW9kZSA9ICh0eXBlb2YgYmluZGluZ0NvbnRleHQudGVtcGxhdGVNb2RlID09ICd1bmRlZmluZWQnIHx8IGJpbmRpbmdDb250ZXh0LnRlbXBsYXRlTW9kZSAhPSAnd3lzaXd5ZycpO1xuICAgIGlmICghaXNOb3RXeXNpd3lnTW9kZSlcbiAgICAgIGtvLmJpbmRpbmdIYW5kbGVycy5jbGljay5pbml0KGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpO1xuICB9XG59O1xua28udmlydHVhbEVsZW1lbnRzLmFsbG93ZWRCaW5kaW5nc1snd3lzaXd5Z0NsaWNrJ10gPSB0cnVlO1xuXG4vLyB1c2VkIG9uIGVkaXRhYmxlIFwiaXRlbVwiIHNvIHRvIGJpbmQgY3NzIG9ubHkgaW4gd3lzaXd5ZyBtb2RlLlxua28uYmluZGluZ0hhbmRsZXJzLnd5c2l3eWdDc3MgPSB7XG4gIHVwZGF0ZTogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3NBY2Nlc3Nvciwgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xuICAgIHZhciBpc05vdFd5c2l3eWdNb2RlID0gKHR5cGVvZiBiaW5kaW5nQ29udGV4dC50ZW1wbGF0ZU1vZGUgPT0gJ3VuZGVmaW5lZCcgfHwgYmluZGluZ0NvbnRleHQudGVtcGxhdGVNb2RlICE9ICd3eXNpd3lnJyk7XG4gICAgaWYgKCFpc05vdFd5c2l3eWdNb2RlKVxuICAgICAga28uYmluZGluZ0hhbmRsZXJzLmNzcy51cGRhdGUoZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3NBY2Nlc3Nvciwgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCk7XG4gIH1cbn07XG5rby52aXJ0dWFsRWxlbWVudHMuYWxsb3dlZEJpbmRpbmdzWyd3eXNpd3lnQ3NzJ10gPSB0cnVlO1xuXG5rby5iaW5kaW5nSGFuZGxlcnMud3lzaXd5Z0ltZyA9IHtcbiAgbWFrZVRlbXBsYXRlVmFsdWVBY2Nlc3NvcjogZnVuY3Rpb24odmFsdWVBY2Nlc3NvciwgYmluZGluZ0NvbnRleHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaXNXeXNpd3lnTW9kZSA9ICh0eXBlb2YgYmluZGluZ0NvbnRleHQudGVtcGxhdGVNb2RlICE9ICd1bmRlZmluZWQnICYmIGJpbmRpbmdDb250ZXh0LnRlbXBsYXRlTW9kZSA9PSAnd3lzaXd5ZycpO1xuXG4gICAgICB2YXIgbW9kZWxWYWx1ZSA9IHZhbHVlQWNjZXNzb3IoKSxcbiAgICAgICAgdW53cmFwcGVkVmFsdWUgPSBrby51dGlscy5wZWVrT2JzZXJ2YWJsZShtb2RlbFZhbHVlKTsgLy8gVW53cmFwIHdpdGhvdXQgc2V0dGluZyBhIGRlcGVuZGVuY3kgaGVyZVxuXG4gICAgICAvLyBJZiB1bndyYXBwZWRWYWx1ZS5kYXRhIGlzIHRoZSBhcnJheSwgcHJlc2VydmUgYWxsIHJlbGV2YW50IG9wdGlvbnMgYW5kIHVud3JhcCBhZ2FpbiB2YWx1ZSBzbyB3ZSBnZXQgdXBkYXRlc1xuICAgICAga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShtb2RlbFZhbHVlKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ25hbWUnOiBpc1d5c2l3eWdNb2RlID8gdW53cmFwcGVkVmFsdWVbJ19lZGl0VGVtcGxhdGUnXSA6IHVud3JhcHBlZFZhbHVlWydfdGVtcGxhdGUnXSxcbiAgICAgICAgJ3RlbXBsYXRlRW5naW5lJzoga28ubmF0aXZlVGVtcGxhdGVFbmdpbmUuaW5zdGFuY2VcbiAgICAgIH07XG4gICAgfTtcbiAgfSxcbiAgJ2luaXQnOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xuICAgIHJldHVybiBrby5iaW5kaW5nSGFuZGxlcnNbJ3RlbXBsYXRlJ11bJ2luaXQnXShlbGVtZW50LCBrby5iaW5kaW5nSGFuZGxlcnNbJ3d5c2l3eWdJbWcnXS5tYWtlVGVtcGxhdGVWYWx1ZUFjY2Vzc29yKHZhbHVlQWNjZXNzb3IsIGJpbmRpbmdDb250ZXh0KSk7XG4gIH0sXG4gICd1cGRhdGUnOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xuICAgIGJpbmRpbmdDb250ZXh0ID0gYmluZGluZ0NvbnRleHRbJ2V4dGVuZCddKHZhbHVlQWNjZXNzb3IoKSk7XG4gICAgcmV0dXJuIGtvLmJpbmRpbmdIYW5kbGVyc1sndGVtcGxhdGUnXVsndXBkYXRlJ10oZWxlbWVudCwga28uYmluZGluZ0hhbmRsZXJzWyd3eXNpd3lnSW1nJ10ubWFrZVRlbXBsYXRlVmFsdWVBY2Nlc3Nvcih2YWx1ZUFjY2Vzc29yLCBiaW5kaW5nQ29udGV4dCksIGFsbEJpbmRpbmdzLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KTtcbiAgfVxufTtcbmtvLnZpcnR1YWxFbGVtZW50cy5hbGxvd2VkQmluZGluZ3NbJ3d5c2l3eWdJbWcnXSA9IHRydWU7XG5cbi8vIE5PVEU6IHRoZXJlIGFyZSBpc3N1ZXMgd2l0aCB0aGUgXCJyYXdcIiBmb3JtYXQgYW5kIHRyYXNoIGxlZnQgYXJvdW5kIGJ5IHRpbnltY2Ugd29ya2Fyb3VuZHMgZm9yIGNvbnRlbnRlZGl0YWJsZSBpc3N1ZXMuXG4vLyBzZXR0aW5nIFwiZm9yY2VkX3Jvb3RfYmxvY2s6IGZhbHNlXCIgZGlzYWJsZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2YgYWRkaW5nIGEgd3JhcHBlciA8cD4gd2hlbiBuZWVkZWQgYW5kIHRoaXMgc2VlbXMgdG8gZml4IG1hbnkgaXNzdWVzIGluIElFLlxuLy8gYWxzbywgbWF5YmUgd2Ugc2hvdWxkIHVzZSB0aGUgXCJyYXdcIiBvbmx5IGZvciB0aGUgXCJiZWZvcmUgU2V0Q29udGVudFwiIGFuZCBpbnN0ZWFkIHJlYWQgdGhlIFwibm9uLXJhd1wiIGNvbnRlbnQgKHRoZSByYXcgY29udGVudCBzb21ldGltZXMgaGF2ZSBkYXRhLSBhdHRyaWJ1dGVzIGFuZCB0b28gbWFueSBlbmRpbmcgPGJyPiBpbiB0aGUgY29kZSlcbmtvLmJpbmRpbmdIYW5kbGVycy53eXNpd3lnID0ge1xuICBjdXJyZW50SW5kZXg6IDAsXG4gIHN0YW5kYXJkT3B0aW9uczoge30sXG4gIGZ1bGxPcHRpb25zOiB7XG4gICAgdG9vbGJhcjE6ICdib2xkIGl0YWxpYyBmb3JlY29sb3IgYmFja2NvbG9yIGhyIHN0eWxlc2VsZWN0IHJlbW92ZWZvcm1hdCB8IGxpbmsgdW5saW5rIHwgcGFzdGV0ZXh0IGNvZGUnLFxuICAgIC8vdG9vbGJhcjE6IFwiYm9sZCBpdGFsaWMgfCBmb3JlY29sb3IgYmFja2NvbG9yIHwgbGluayB1bmxpbmsgfCBociB8IHBhc3RldGV4dCBjb2RlXCIsIC8vIHwgbmV3c2xldHRlcl9wcm9maWxlIG5ld3NsZXR0ZXJfb3B0bGluayBuZXdzbGV0dGVyX3Vuc3Vic2NyaWJlIG5ld3NsZXR0ZXJfc2hvd2xpbmtcIjtcbiAgICAvL3Rvb2xiYXIyOiBcImZvcm1hdHNlbGVjdCBmb250c2VsZWN0IGZvbnRzaXplc2VsZWN0IHwgYWxpZ25sZWZ0IGFsaWduY2VudGVyIGFsaWducmlnaHQgYWxpZ25qdXN0aWZ5IHwgYnVsbGlzdCBudW1saXN0XCIsXG4gICAgcGx1Z2luczogW1wibGluayBociBwYXN0ZSBsaXN0cyB0ZXh0Y29sb3IgY29kZVwiXSxcbiAgICAvLyB2YWxpZF9lbGVtZW50czogJ3N0cm9uZy9iLGVtL2ksKlsqXScsXG4gICAgLy8gZXh0ZW5kZWRfdmFsaWRfZWxlbWVudHM6ICdzdHJvbmcvYixlbS9pLCpbKl0nLFxuICAgIC8vIFJlbW92ZWQ6IGltYWdlIGZ1bGxzY3JlZW4gY29udGV4dG1lbnUgXG4gICAgLy8gZG93bmxvYWQgY3VzdG9tOlxuICAgIC8vIGpxdWVyeSB2ZXJzaW9uIGNvbiBsZWdhY3lvdXRwdXQsIGFuY2hvciwgY29kZSwgaW1wb3J0Y3NzLCBsaW5rLCBwYXN0ZSwgdGV4dGNvbG9yLCBociwgbGlzdHNcbiAgfSxcbiAgaW5pdDogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3NBY2Nlc3Nvciwgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xuICAgIC8vIFRPRE8gdWdseSwgYnV0IHdvcmtzLi4uXG4gICAga28uYmluZGluZ0hhbmRsZXJzLmZvY3VzYWJsZS5pbml0KGVsZW1lbnQpO1xuXG4gICAga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFjayhlbGVtZW50LCBmdW5jdGlvbigpIHtcbiAgICAgIHRpbnltY2UucmVtb3ZlKCcjJyArIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZCcpKTtcbiAgICB9KTtcblxuICAgIHZhciB2YWx1ZSA9IHZhbHVlQWNjZXNzb3IoKTtcblxuICAgIGlmICgha28uaXNPYnNlcnZhYmxlKHZhbHVlKSkgdGhyb3cgXCJXeXNpd3lnIGJpbmRpbmcgY2FsbGVkIHdpdGggbm9uIG9ic2VydmFibGVcIjtcbiAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gOCkgdGhyb3cgXCJXeXNpd3lnIGJpbmRpbmcgY2FsbGVkIG9uIHZpcnR1YWwgbm9kZSwgaWdub3JpbmcuLi4uXCIgKyBlbGVtZW50LmlubmVySFRNTDtcblxuICAgIHZhciBzZWxlY3RvcklkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG4gICAgaWYgKCFzZWxlY3RvcklkKSB7XG4gICAgICBzZWxlY3RvcklkID0gJ3d5c2l3eWdfJyArICgrK2tvLmJpbmRpbmdIYW5kbGVyc1snd3lzaXd5ZyddLmN1cnJlbnRJbmRleCk7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnaWQnLCBzZWxlY3RvcklkKTtcbiAgICB9XG5cbiAgICB2YXIgZnVsbEVkaXRvciA9IGVsZW1lbnQudGFnTmFtZSA9PSAnRElWJyB8fCBlbGVtZW50LnRhZ05hbWUgPT0gJ1REJztcbiAgICB2YXIgaXNTdWJzY3JpYmVyQ2hhbmdlID0gZmFsc2U7XG4gICAgdmFyIHRoaXNFZGl0b3I7XG4gICAgdmFyIGlzRWRpdG9yQ2hhbmdlID0gZmFsc2U7XG5cbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHNlbGVjdG9yOiAnIycgKyBzZWxlY3RvcklkLFxuICAgICAgaW5saW5lOiB0cnVlLFxuICAgICAgLy8gbWF5YmUgbm90IG5lZWRlZCwgYnV0IHdvbid0IGh1cnQuXG4gICAgICBoaWRkZW5faW5wdXQ6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW1wicGFzdGVcIl0sXG4gICAgICB0b29sYmFyMTogXCJib2xkIGl0YWxpY1wiLFxuICAgICAgdG9vbGJhcjI6IFwiXCIsXG4gICAgICAvLyB3ZSBoYXZlIHRvIGRpc2FibGUgcHJldmlld19zdHlsZXMgb3RoZXJ3aXNlIHRpbnltY2UgcHVzaCBpbmxpbmUgZXZlcnkgc3R5bGUgaGUgdGhpbmdzIHdpbGwgYmUgYXBwbGllZCBhbmQgdGhpcyBtYWtlcyB0aGUgc3R5bGUgbWVudSB0byBpbmhlcml0IGNvbG9yL2ZvbnQtZmFtaWx5IGFuZCBtb3JlLlxuICAgICAgcHJldmlld19zdHlsZXM6IGZhbHNlLFxuICAgICAgcGFzdGVfYXNfdGV4dDogdHJ1ZSxcbiAgICAgIGxhbmd1YWdlOiAnZW4nLFxuICAgICAgc2NoZW1hOiBcImh0bWw1XCIsXG4gICAgICBleHRlbmRlZF92YWxpZF9lbGVtZW50czogJ3N0cm9uZy9iLGVtL2ksKlsqXScsXG4gICAgICBtZW51YmFyOiBmYWxzZSxcbiAgICAgIHNraW46ICdncmF5LWZsYXQnLFxuICAgICAgc2V0dXA6IGZ1bmN0aW9uKGVkaXRvcikge1xuICAgICAgICAvLyBUT0RPIGNoYW5nZSBzb21ldGltZXMgZG9lc24ndCB0cmlnZ2VyICh3ZSBoYXZlIHRvIGRvY3VtZW50IHdoZW4pXG4gICAgICAgIC8vIGxpc3RlbmluZyBvbiBrZXl1cCB3b3VsZCBpbmNyZWFzZSBjb3JyZWN0bmVzcyBidXQgd2Ugd291bGQgbmVlZCBhIHJhdGVMaW1pdCB0byBhdm9pZCBmbG9vZGluZy5cbiAgICAgICAgZWRpdG9yLm9uKCdjaGFuZ2UgcmVkbyB1bmRvJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKCFpc1N1YnNjcmliZXJDaGFuZ2UpIHtcbiAgICAgICAgICAgIGlzRWRpdG9yQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIHdlIGZhaWxlZCB3aXRoIG90aGVyIHdheXMgdG8gZG8gdGhpczpcbiAgICAgICAgICAgIC8vIHZhbHVlKCQoZWxlbWVudCkuaHRtbCgpKTtcbiAgICAgICAgICAgIC8vIHZhbHVlKGVsZW1lbnQuaW5uZXJIVE1MKTtcbiAgICAgICAgICAgIHZhbHVlKGVkaXRvci5nZXRDb250ZW50KHtcbiAgICAgICAgICAgICAgZm9ybWF0OiAncmF3J1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgaXNFZGl0b3JDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBDbGlja2luZyBvbiB0aGUgZWxlbWVudCBvbiBmb2N1cyBjaGFuZ2UgYWxsb3cgdGhlIFwiY2xpY1wiIGNvZGUgdG8gYmUgdHJpZ2dlcmVkIGFuZCBwcm9wYWdhdGUgdGhlIHNlbGVjdGlvbi5cbiAgICAgICAgLy8gTm90IGVsZWdhbnQsIG1heWJlIHdlIGhhdmUgYmV0dGVyIG9wdGlvbnMuXG4gICAgICAgIGVkaXRvci5vbignZm9jdXMnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBVc2VkIGJ5IHNjcm9sbGZpeC5qcyAobWF5YmUgdGhpcyBpcyBub3QgbmVlZGVkIGJ5IG5ldyBzY3JvbGxmaXguanMpXG4gICAgICAgICAgZWRpdG9yLm5vZGVDaGFuZ2VkKCk7XG4gICAgICAgICAgZWRpdG9yLmdldEVsZW1lbnQoKS5jbGljaygpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBOT1RFOiB0aGlzIGZpeGVzIGlzc3VlIHdpdGggXCJsZWFkaW5nIHNwYWNlc1wiIGluIGRlZmF1bHQgY29udGVudCB0aGF0IHdlcmUgbG9zdCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gICAgICAgIGVkaXRvci5vbignQmVmb3JlU2V0Q29udGVudCcsIGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgICBpZiAoYXJncy5pbml0aWFsKSBhcmdzLmZvcm1hdCA9ICdyYXcnO1xuICAgICAgICB9KTtcblxuICAgICAgICAvKiBOT1RFOiBkaXNhYmxpbmcgXCJFTlRFUlwiIGluIHRpbnkgZWRpdG9yLCBub3QgYSBnb29kIHRoaW5nIGJ1dCBtYXkgYmUgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGNvbnRlbnRlZGl0YWJsZSBpc3N1ZXNcbiAgICAgICAgaWYgKCFmdWxsRWRpdG9yKSB7XG4gICAgICAgICAgLy8gc2Ugbm9uIGFiYmlhbW8gaWwgXCJmdWxsIEVkaXRvclwiLCBkaXNhYmlsaXRpYW1vIGwnaW52aW8uICh2YXJpIGJ1ZylcbiAgICAgICAgICBlZGl0b3Iub24oJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09IDEzKSB7IGUucHJldmVudERlZmF1bHQoKTsgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgICovXG5cbiAgICAgICAgdGhpc0VkaXRvciA9IGVkaXRvcjtcblxuICAgICAgfVxuICAgIH07XG5cbiAgICBrby51dGlscy5leHRlbmQob3B0aW9ucywga28uYmluZGluZ0hhbmRsZXJzLnd5c2l3eWcuc3RhbmRhcmRPcHRpb25zKTtcbiAgICBpZiAoZnVsbEVkaXRvcikga28udXRpbHMuZXh0ZW5kKG9wdGlvbnMsIGtvLmJpbmRpbmdIYW5kbGVycy53eXNpd3lnLmZ1bGxPcHRpb25zKTtcblxuICAgIC8vIHdlIGhhdmUgdG8gcHV0IGluaXRpYWxpemF0aW9uIGluIGEgc2V0dGltZW91dCwgb3RoZXJ3aXNlIHN3aXRjaGluZyBmcm9tIFwiMVwiIHRvIFwiMlwiIGNvbHVtbnMgYmxvY2tzXG4gICAgLy8gd2lsbCBzdGFydCB0aGUgbmV3IGVkaXRvcnMgYmVmb3JlIGRpc3Bvc2luZyB0aGUgb2xkIG9uZXMgYW5kIElEcyBnZXQgdGVtcG9yYXJpbHkgZHVwbGljYXRlZC5cbiAgICAvLyB1c2luZyBzZXRUaW1lb3V0IHRoZSBkaXNwb3NlL2NyZWF0ZSBvcmRlciBpcyBjb3JyZWN0IG9uIGV2ZXJ5IGJyb3dzZXIgdGVzdGVkLlxuICAgIGdsb2JhbC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdGlueW1jZS5pbml0KG9wdGlvbnMpO1xuICAgIH0pO1xuXG4gICAga28uY29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY29udGVudCA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKTtcbiAgICAgIGlmICghaXNFZGl0b3JDaGFuZ2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpc1N1YnNjcmliZXJDaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgIC8vIHdlIGZhaWxlZCBzZXR0aW5nIGNvbnRlbnRzIGluIG90aGVyIHdheXMuLi5cbiAgICAgICAgICAvLyAkKGVsZW1lbnQpLmh0bWwoY29udGVudCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0aGlzRWRpdG9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpc0VkaXRvci5zZXRDb250ZW50KGNvbnRlbnQsIHtcbiAgICAgICAgICAgICAgZm9ybWF0OiAncmF3J1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGtvLnV0aWxzLnNldEh0bWwoZWxlbWVudCwgY29udGVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJUT0RPIGV4Y2VwdGlvbiBzZXR0aW5nIGNvbnRlbnQgdG8gZWRpdGFibGUgZWxlbWVudFwiLCB0eXBlb2YgdGhpc0VkaXRvciwgZSk7XG4gICAgICAgIH1cbiAgICAgICAgaXNTdWJzY3JpYmVyQ2hhbmdlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSwgbnVsbCwge1xuICAgICAgZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkOiBlbGVtZW50XG4gICAgfSk7XG5cbiAgICAvLyBkbyBub3QgcGFyc2UgaHRtbCBjb250ZW50IGZvciBLTyBiaW5kaW5ncyEhXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzOiB0cnVlXG4gICAgfTtcblxuICB9XG59OyIsIlwidXNlIHN0cmljdFwiO1xudmFyIGNvbnNvbGUgPSByZXF1aXJlKFwiY29uc29sZVwiKTtcblxuLy8gcmV0dXJucyAwIGlmIGVxdWFsICgwLjAueCByZWxlYXNlKSwgMSB3aXRoIGJhY2t3YXJkIGNvbXBhdGlibGUgYWRkaXRpb25zICgwLnguMCByZWxlYXNlKSwgMiBvbiBsb3N0IGRhdGEgb3IgaW5jb21wYXRpYmxlIGRhdGEgKHguMC4wIHJlbGVhc2UpXG52YXIgY2hlY2tNb2RlbCA9IGZ1bmN0aW9uKHJlZmVyZW5jZSwgYmxvY2tEZWZzLCBtb2RlbCwgb3JpZ1ByZWZpeCwgcmV2ZXJzZSkge1xuICB2YXIgYmxvY2tEZWZzT2JqLCBpLCBwcmVmaXg7XG4gIHZhciB2YWxpZCA9IDA7XG4gIGlmICh0eXBlb2YgcmV2ZXJzZSA9PSAndW5kZWZpbmVkJykgcmV2ZXJzZSA9IGZhbHNlO1xuICBpZiAodHlwZW9mIGJsb2NrRGVmcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGJsb2NrRGVmcy5zcGxpY2UgPT0gJ2Z1bmN0aW9uJykge1xuICAgIGJsb2NrRGVmc09iaiA9IHt9O1xuICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja0RlZnMubGVuZ3RoOyBpKyspIGJsb2NrRGVmc09ialtibG9ja0RlZnNbaV0udHlwZV0gPSBibG9ja0RlZnNbaV07XG4gIH0gZWxzZSB7XG4gICAgYmxvY2tEZWZzT2JqID0gYmxvY2tEZWZzO1xuICB9XG4gIGZvciAodmFyIHByb3AgaW4gcmVmZXJlbmNlKVxuICAgIGlmIChyZWZlcmVuY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgIHByZWZpeCA9IHR5cGVvZiBvcmlnUHJlZml4ICE9PSAndW5kZWZpbmVkJyA/IG9yaWdQcmVmaXggKyBcIi5cIiArIHByb3AgOiBwcm9wO1xuICAgICAgaWYgKCFtb2RlbC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIldBUk4gUHJvcGVydHkgXCIsIHByZWZpeCwgXCJmb3VuZCBpbiBtb2RlbCBpcyBub3QgZGVmaW5lZCBieSB0ZW1wbGF0ZTogcmVtb3ZpbmcgaXQhXCIpO1xuICAgICAgICAgIHZhbGlkID0gTWF0aC5tYXgodmFsaWQsIDIpO1xuICAgICAgICAgIGRlbGV0ZSByZWZlcmVuY2VbcHJvcF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJJTkZPIFByb3BlcnR5IFwiLCBwcmVmaXgsIFwibWlzc2luZyBpbiBtb2RlbCwgY2xvbmluZyBmcm9tIHJlZmVyZW5jZSFcIik7XG4gICAgICAgICAgdmFsaWQgPSBNYXRoLm1heCh2YWxpZCwgMSk7XG4gICAgICAgICAgbW9kZWxbcHJvcF0gPSByZWZlcmVuY2VbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZGVsW3Byb3BdICE9IHR5cGVvZiByZWZlcmVuY2VbcHJvcF0pIHtcbiAgICAgICAgLy8gc2Ugc29ubyBkaSB0aXBvIGRpdmVyc28gYWxsb3JhIHByb3ZvIGEgdmVkZXJlIHNlIGwnYWx0cm8sIGNvbnZlcnRpdG8gZGkgdGlwbyBtYW50aWVuZSB1biB2YWxvcmUgZXF1aXZhbGVudGUuXG4gICAgICAgIGlmIChtb2RlbFtwcm9wXSAhPT0gbnVsbCAmJiByZWZlcmVuY2VbcHJvcF0gIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG1vZGVsW3Byb3BdID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoU3RyaW5nKHJlZmVyZW5jZVtwcm9wXSkgIT0gcmVmZXJlbmNlW3Byb3BdKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVE9ETyBEaWZmZXJlbnQgdHlwZSAxIFwiLCBwcmVmaXgsIHR5cGVvZiBtb2RlbFtwcm9wXSwgdHlwZW9mIHJlZmVyZW5jZVtwcm9wXSwgbW9kZWxbcHJvcF0sIHJlZmVyZW5jZVtwcm9wXSk7XG4gICAgICAgICAgICAgIHZhbGlkID0gTWF0aC5tYXgodmFsaWQsIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZGVsW3Byb3BdID09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBpZiAoTnVtYmVyKHJlZmVyZW5jZVtwcm9wXSkgIT0gcmVmZXJlbmNlW3Byb3BdKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVE9ETyBEaWZmZXJlbnQgdHlwZSAyIFwiLCBwcmVmaXgsIHR5cGVvZiBtb2RlbFtwcm9wXSwgdHlwZW9mIHJlZmVyZW5jZVtwcm9wXSwgbW9kZWxbcHJvcF0sIHJlZmVyZW5jZVtwcm9wXSk7XG4gICAgICAgICAgICAgIHZhbGlkID0gTWF0aC5tYXgodmFsaWQsIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRPRE8gRGlmZmVyZW50IHR5cGUgMyBcIiwgcHJlZml4LCB0eXBlb2YgbW9kZWxbcHJvcF0sIHR5cGVvZiByZWZlcmVuY2VbcHJvcF0sIG1vZGVsW3Byb3BdLCByZWZlcmVuY2VbcHJvcF0pO1xuICAgICAgICAgICAgdmFsaWQgPSBNYXRoLm1heCh2YWxpZCwgMik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZWZlcmVuY2VbcHJvcF0gPT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKHJlZmVyZW5jZVtwcm9wXSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVmZXJlbmNlW3Byb3BdLnNwbGljZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChyZWZlcmVuY2VbcHJvcF0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBpZiAobW9kZWxbcHJvcF0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gbmVlZHMgc29ydGluZz9cbiAgICAgICAgICAgICAgICB2YXIgaiA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vZGVsW3Byb3BdLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1vZGVsW3Byb3BdW2ldLnR5cGUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPCByZWZlcmVuY2VbcHJvcF0ubGVuZ3RoICYmIHJlZmVyZW5jZVtwcm9wXVtqXS50eXBlICE9PSBtb2RlbFtwcm9wXVtpXS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJpZ25vcmluZyBcIiwgcHJlZml4LCByZWZlcmVuY2VbcHJvcF1bal0udHlwZSwgXCIgYmxvY2sgdHlwZSBpbiByZWZlcmVuY2Ugbm90IGZvdW5kIGluIG1vZGVsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaiA+PSByZWZlcmVuY2VbcHJvcF0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJXQVJOIGNhbm5vdCBmaW5kIFwiLCBwcmVmaXgsIG1vZGVsW3Byb3BdW2ldLnR5cGUsIFwiIGJsb2NrIGluIHJlZmVyZW5jZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IE1hdGgubWF4KHZhbGlkLCAyKTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyByZXZlcnNlIGNvbmRpdGlvbiBzbyB0byBza2lwIFwiZGVlcCB0cmF2ZXJzaW5nXCIgb24gZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBNYXRoLm1heCh2YWxpZCwgY2hlY2tNb2RlbChyZWZlcmVuY2VbcHJvcF1bal0sIHVuZGVmaW5lZCwgbW9kZWxbcHJvcF1baV0sIHByZWZpeCArIFwiW1wiICsgaSArIFwiLlwiICsgbW9kZWxbcHJvcF1baV0udHlwZSArIFwiXVwiKSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIGRpZmZlcmVudCBhcnJheSB3ZSBjaGVjayBibG9ja0RlZnNcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVmZXJlbmNlW3Byb3BdLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlZmVyZW5jZVtwcm9wXVtpXS50eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRPRE8gZm91bmQgYW4gb2JqZWN0IHdpdGggbm8gdHlwZVwiLCBwcmVmaXgsIHJlZmVyZW5jZVtwcm9wXVtpXSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkID0gTWF0aC5tYXgodmFsaWQsIDIpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYmxvY2tEZWZzT2JqLmhhc093blByb3BlcnR5KHJlZmVyZW5jZVtwcm9wXVtpXS50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJUT0RPIHRoZSBtb2RlbCB1c2VzIGEgYmxvY2sgdHlwZSBub3QgZGVmaW5lZCBieSB0aGUgdGVtcGxhdGUuIFJFTU9WSU5HIElUISFcIiwgcHJlZml4LCByZWZlcmVuY2VbcHJvcF1baV0pO1xuICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VbcHJvcF0uc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkID0gTWF0aC5tYXgodmFsaWQsIDIpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBNYXRoLm1heCh2YWxpZCwgY2hlY2tNb2RlbChibG9ja0RlZnNPYmpbcmVmZXJlbmNlW3Byb3BdW2ldLnR5cGVdLCBibG9ja0RlZnNPYmosIHJlZmVyZW5jZVtwcm9wXVtpXSwgcHJlZml4ICsgXCJbXCIgKyBpICsgXCIuXCIgKyByZWZlcmVuY2VbcHJvcF1baV0udHlwZSArIFwiXVwiKSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChtb2RlbFtwcm9wXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiV0FSTiBOdWxsIG9iamVjdCBpbiBtb2RlbCBcIiwgcHJlZml4LCBcImluc3RlYWQgb2ZcIiwgcmVmZXJlbmNlW3Byb3BdLCBcImRlbGV0aW5nIGl0XCIpO1xuICAgICAgICAgICAgICAgIHZhbGlkID0gTWF0aC5tYXgodmFsaWQsIDIpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSByZWZlcmVuY2VbcHJvcF07XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJJTkZPIE51bGwgb2JqZWN0IGluIG1vZGVsIFwiLCBwcmVmaXgsIFwiaW5zdGVhZCBvZlwiLCByZWZlcmVuY2VbcHJvcF0sIFwiY2xvbmluZyBpdCBmcm9tIHRoZSByZWZlcmVuY2VcIik7XG4gICAgICAgICAgICAgICAgdmFsaWQgPSBNYXRoLm1heCh2YWxpZCwgMSk7XG4gICAgICAgICAgICAgICAgbW9kZWxbcHJvcF0gPSByZWZlcmVuY2VbcHJvcF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbGlkID0gTWF0aC5tYXgodmFsaWQsIGNoZWNrTW9kZWwocmVmZXJlbmNlW3Byb3BdLCBibG9ja0RlZnNPYmosIG1vZGVsW3Byb3BdLCBwcmVmaXgsIHJldmVyc2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWxbcHJvcF0gIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlRPRE8gTnVsbCBpbiByZWZlcmVuY2UgYnV0IG5vdCBudWxsIGluIG1vZGVsXCIsIHByZWZpeCwgbW9kZWxbcHJvcF0pO1xuICAgICAgICAgIHZhbGlkID0gTWF0aC5tYXgodmFsaWQsIDIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZWZlcmVuY2VbcHJvcF0gIT09ICdzdHJpbmcnICYmIHR5cGVvZiByZWZlcmVuY2VbcHJvcF0gIT09ICdib29sZWFuJyAmJiB0eXBlb2YgcmVmZXJlbmNlW3Byb3BdICE9PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zb2xlLmxvZyhcIlRPRE8gdW5zdXBwb3J0ZWQgdHlwZVwiLCBwcmVmaXgsIHR5cGVvZiByZWZlcmVuY2VbcHJvcF0pO1xuICAgICAgICB2YWxpZCA9IE1hdGgubWF4KHZhbGlkLCAyKTtcbiAgICAgIH1cblxuICAgIH1cbiAgaWYgKCFyZXZlcnNlKSB2YWxpZCA9IE1hdGgubWF4KHZhbGlkLCBjaGVja01vZGVsKG1vZGVsLCBibG9ja0RlZnMsIHJlZmVyZW5jZSwgdHlwZW9mIG9yaWdQcmVmaXggIT09ICd1bmRlZmluZWQnID8gb3JpZ1ByZWZpeCArIFwiIVJcIiA6IFwiIVJcIiwgdHJ1ZSkpO1xuICByZXR1cm4gdmFsaWQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNoZWNrTW9kZWw7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIFBhcnNlcyBDU1MgZGVjbGFyYXRpb25zIGFuZCBzdXBwb3J0cyB0aGUgcHJvcGVydHkgbGFuZ3VhZ2UgKC1rby0qKSBmb3VuZCBiZXR3ZWVuIHRoZW0uXG4vLyBDcmVhdGUgS08gYmluZGluZ3MgYnV0IGRvZXNuJ3QgZGVwZW5kIG9uIEtPLlxuLy8gTmVlZHMgYSBiaW5kaW5nUHJvdmlkZXIuXG5cbnZhciBjb252ZXJ0ZXJVdGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzLmpzXCIpO1xudmFyIGNzc1BhcnNlID0gcmVxdWlyZShcIm1lbnNjaC9saWIvcGFyc2VyLmpzXCIpO1xudmFyIGNvbnNvbGUgPSByZXF1aXJlKFwiY29uc29sZVwiKTtcbnZhciBkb211dGlscyA9IHJlcXVpcmUoXCIuL2RvbXV0aWxzLmpzXCIpO1xuXG52YXIgX2RlY2xhcmF0aW9uVmFsdWVMb29rdXAgPSBmdW5jdGlvbihkZWNsYXJhdGlvbnMsIHByb3BlcnR5bmFtZSwgdGVtcGxhdGVVcmxDb252ZXJ0ZXIpIHtcbiAgZm9yICh2YXIgaSA9IGRlY2xhcmF0aW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChkZWNsYXJhdGlvbnNbaV0udHlwZSA9PSAncHJvcGVydHknICYmIGRlY2xhcmF0aW9uc1tpXS5uYW1lID09IHByb3BlcnR5bmFtZSkge1xuICAgICAgcmV0dXJuIF9kZWNsYXJhdGlvblZhbHVlVXJsUHJlZml4ZXIoZGVjbGFyYXRpb25zW2ldLnZhbHVlLCB0ZW1wbGF0ZVVybENvbnZlcnRlcik7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxudmFyIF9wcm9wVG9DYW1lbENhc2UgPSBmdW5jdGlvbihwcm9wTmFtZSkge1xuICByZXR1cm4gcHJvcE5hbWUucmVwbGFjZSgvLShbYS16XSkvZywgZnVuY3Rpb24obWF0Y2gsIGNvbnRlbnRzLCBvZmZzZXQsIHMpIHtcbiAgICByZXR1cm4gY29udGVudHMudG9VcHBlckNhc2UoKTtcbiAgfSk7XG59O1xuXG52YXIgX2RlY2xhcmF0aW9uVmFsdWVVcmxQcmVmaXhlciA9IGZ1bmN0aW9uKHZhbHVlLCB0ZW1wbGF0ZVVybENvbnZlcnRlcikge1xuICBpZiAodmFsdWUubWF0Y2goL3VybFxcKC4qXFwpLykpIHtcbiAgICB2YXIgcmVwbGFjZWQgPSB2YWx1ZS5yZXBsYWNlKC8odXJsXFwoKShbXlxcKV0qKShcXCkpL2csIGZ1bmN0aW9uKG1hdGNoZWQsIHByZWZpeCwgdXJsLCBwb3N0Zml4KSB7XG4gICAgICB2YXIgdHJpbW1lZCA9IHVybC50cmltKCk7XG4gICAgICB2YXIgYXBpY2UgPSB1cmwudHJpbSgpLmNoYXJBdCgwKTtcbiAgICAgIGlmIChhcGljZSA9PSAnXFwnJyB8fCBhcGljZSA9PSAnXCInKSB7XG4gICAgICAgIHRyaW1tZWQgPSB0cmltbWVkLnN1YnN0cigxLCB0cmltbWVkLmxlbmd0aCAtIDIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBpY2UgPSAnJztcbiAgICAgIH1cbiAgICAgIHZhciBuZXdVcmwgPSB0ZW1wbGF0ZVVybENvbnZlcnRlcih0cmltbWVkKTtcbiAgICAgIGlmIChuZXdVcmwgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeCArIGFwaWNlICsgbmV3VXJsICsgYXBpY2UgKyBwb3N0Zml4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcGxhY2VkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufTtcblxudmFyIGVsYWJvcmF0ZURlY2xhcmF0aW9ucyA9IGZ1bmN0aW9uKHN0eWxlLCBkZWNsYXJhdGlvbnMsIHRlbXBsYXRlVXJsQ29udmVydGVyLCBiaW5kaW5nUHJvdmlkZXIsIGVsZW1lbnQsIGJhc2ljQmluZGluZ3MsIHJlbW92ZURpc3BsYXlOb25lKSB7XG4gIHZhciBuZXdCaW5kaW5ncyA9IHR5cGVvZiBiYXNpY0JpbmRpbmdzID09ICdvYmplY3QnICYmIGJhc2ljQmluZGluZ3MgIT09IG51bGwgPyBiYXNpY0JpbmRpbmdzIDoge307XG4gIHZhciBuZXdTdHlsZSA9IG51bGw7XG4gIHZhciBza2lwTGluZXMgPSAwO1xuICBpZiAodHlwZW9mIGRlY2xhcmF0aW9ucyA9PSAndW5kZWZpbmVkJykge1xuICAgIHZhciBzdHlsZVNoZWV0ID0gY3NzUGFyc2UoXCIje1xcblwiICsgc3R5bGUgKyBcIn1cIiwge1xuICAgICAgY29tbWVudHM6IHRydWUsXG4gICAgICBwb3NpdGlvbjogdHJ1ZVxuICAgIH0pO1xuICAgIGRlY2xhcmF0aW9ucyA9IHN0eWxlU2hlZXQuc3R5bGVzaGVldC5ydWxlc1swXS5kZWNsYXJhdGlvbnM7XG4gICAgc2tpcExpbmVzID0gMTtcbiAgfVxuICBmb3IgKHZhciBpID0gZGVjbGFyYXRpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgIGlmIChkZWNsYXJhdGlvbnNbaV0udHlwZSA9PSAncHJvcGVydHknKSB7XG4gICAgICBpZiAocmVtb3ZlRGlzcGxheU5vbmUgPT09IHRydWUgJiYgZGVjbGFyYXRpb25zW2ldLm5hbWUgPT0gJ2Rpc3BsYXknICYmIGRlY2xhcmF0aW9uc1tpXS52YWx1ZSA9PSAnbm9uZScpIHtcbiAgICAgICAgaWYgKG5ld1N0eWxlID09PSBudWxsKSBuZXdTdHlsZSA9IHN0eWxlO1xuICAgICAgICBuZXdTdHlsZSA9IGNvbnZlcnRlclV0aWxzLnJlbW92ZVN0eWxlKG5ld1N0eWxlLCBkZWNsYXJhdGlvbnNbaV0ucG9zaXRpb24uc3RhcnQsIGRlY2xhcmF0aW9uc1tpXS5wb3NpdGlvbi5lbmQsIHNraXBMaW5lcywgMCwgMCwgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGRlY2wgPSBkZWNsYXJhdGlvbnNbaV0ubmFtZS5tYXRjaCgvXi1rby0oYmluZC18YXR0ci0pPyhbYS16MC05LV0qPykoLWlmfC1pZm5vdCk/JC8pO1xuICAgICAgICBpZiAoZGVjbCAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIHJpbW96aW9uZSBkZWxsbyBzdGlsZSAta28tIGRhbGwnYXR0cmlidXRvIHN0eWxlLlxuICAgICAgICAgIGlmIChuZXdTdHlsZSA9PT0gbnVsbCAmJiB0eXBlb2Ygc3R5bGUgIT0gJ3VuZGVmaW5lZCcpIG5ld1N0eWxlID0gc3R5bGU7XG5cbiAgICAgICAgICB2YXIgaXNBdHRyID0gZGVjbFsxXSA9PSAnYXR0ci0nO1xuICAgICAgICAgIHZhciBpc0JpbmQgPSBkZWNsWzFdID09ICdiaW5kLSc7XG4gICAgICAgICAgdmFyIHByb3BOYW1lID0gZGVjbFsyXTtcblxuICAgICAgICAgIHZhciBpc0lmID0gZGVjbFszXSA9PSAnLWlmJyB8fCBkZWNsWzNdID09ICctaWZub3QnO1xuICAgICAgICAgIHZhciBjb25kRGVjbDtcbiAgICAgICAgICB2YXIgYmluZFZhbHVlO1xuICAgICAgICAgIHZhciBwcm9wRGVmYXVsdFZhbHVlO1xuXG4gICAgICAgICAgaWYgKGlzSWYpIHtcbiAgICAgICAgICAgIGNvbmREZWNsID0gZGVjbGFyYXRpb25zW2ldLm5hbWUuc3Vic3RyKDAsIGRlY2xhcmF0aW9uc1tpXS5uYW1lLmxlbmd0aCAtIGRlY2xbM10ubGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciBjb25kaXRpb25lZERlY2xhcmF0aW9uID0gX2RlY2xhcmF0aW9uVmFsdWVMb29rdXAoZGVjbGFyYXRpb25zLCBjb25kRGVjbCwgdGVtcGxhdGVVcmxDb252ZXJ0ZXIpO1xuICAgICAgICAgICAgaWYgKGNvbmRpdGlvbmVkRGVjbGFyYXRpb24gPT09IG51bGwpIHRocm93IFwiVW5hYmxlIHRvIGZpbmQgZGVjbGFyYXRpb24gXCIgKyBjb25kRGVjbCArIFwiIGZvciBcIiArIGRlY2xhcmF0aW9uc1tpXS5uYW1lO1xuICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgIGlmICgoaXNBdHRyIHx8IGlzQmluZCkgJiYgKHR5cGVvZiBlbGVtZW50ID09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBzdHlsZSAhPSAndW5kZWZpbmVkJykpIHRocm93IFwiQXR0cmlidXRlcyBhbmQgYmluZCBkZWNsYXJhdGlvbnMgYXJlIG9ubHkgYWxsb3dlZCBpbiBpbmxpbmUgc3R5bGVzIVwiO1xuXG4gICAgICAgICAgICB2YXIgbmVlZERlZmF1bHRWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICB2YXIgYmluZFR5cGU7XG4gICAgICAgICAgICBpZiAoaXNBdHRyKSB7XG4gICAgICAgICAgICAgIHByb3BEZWZhdWx0VmFsdWUgPSBkb211dGlscy5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgcHJvcE5hbWUpO1xuICAgICAgICAgICAgICBuZWVkRGVmYXVsdFZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgIGJpbmRUeXBlID0gJ3ZpcnR1YWxBdHRyJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzQmluZCkge1xuICAgICAgICAgICAgICBuZWVkRGVmYXVsdFZhbHVlID0gdHlwZW9mIHN0eWxlICE9PSAndW5kZWZpbmVkJztcbiAgICAgICAgICAgICAgaWYgKG5lZWREZWZhdWx0VmFsdWUpIHByb3BEZWZhdWx0VmFsdWUgPSBfZGVjbGFyYXRpb25WYWx1ZUxvb2t1cChkZWNsYXJhdGlvbnMsIHByb3BOYW1lLCB0ZW1wbGF0ZVVybENvbnZlcnRlcik7XG4gICAgICAgICAgICAgIGJpbmRUeXBlID0gJ3ZpcnR1YWxTdHlsZSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBiaW5kVHlwZSA9IG51bGw7XG4gICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICBwcm9wRGVmYXVsdFZhbHVlID0gZG9tdXRpbHMuZ2V0SW5uZXJUZXh0KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBuZWVkRGVmYXVsdFZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lID09ICdodG1sJykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgIHByb3BEZWZhdWx0VmFsdWUgPSBkb211dGlscy5nZXRJbm5lckh0bWwoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG5lZWREZWZhdWx0VmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmVlZERlZmF1bHRWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZWVkRGVmYXVsdFZhbHVlICYmIHByb3BEZWZhdWx0VmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkNhbm5vdCBmaW5kIGRlZmF1bHQgdmFsdWUgZm9yXCIsIGRlY2xhcmF0aW9uc1tpXS5uYW1lLCBkZWNsYXJhdGlvbnMpO1xuICAgICAgICAgICAgICB0aHJvdyBcIkNhbm5vdCBmaW5kIGRlZmF1bHQgdmFsdWUgZm9yIFwiICsgZGVjbGFyYXRpb25zW2ldLm5hbWUgKyBcIjogXCIgKyBkZWNsYXJhdGlvbnNbaV0udmFsdWUgKyBcIiBpbiBcIiArIGVsZW1lbnQgKyBcIiAoXCIgKyB0eXBlb2Ygc3R5bGUgKyBcIi9cIiArIHByb3BOYW1lICsgXCIpXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYmluZERlZmF1bHRWYWx1ZSA9IHByb3BEZWZhdWx0VmFsdWU7XG5cbiAgICAgICAgICAgIHZhciBiaW5kTmFtZSA9IF9wcm9wVG9DYW1lbENhc2UocHJvcE5hbWUpO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBiaW5kVmFsdWUgPSBjb252ZXJ0ZXJVdGlscy5leHByZXNzaW9uQmluZGluZyhkZWNsYXJhdGlvbnNbaV0udmFsdWUsIGJpbmRpbmdQcm92aWRlciwgYmluZERlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJNb2RlbCBlbnN1cmUgcGF0aCBmYWlsZWRcIiwgZS5zdGFjaywgXCJuYW1lXCIsIGRlY2xhcmF0aW9uc1tpXS5uYW1lLCBcInZhbHVlXCIsIGRlY2xhcmF0aW9uc1tpXS52YWx1ZSwgXCJkZWZhdWx0XCIsIHByb3BEZWZhdWx0VmFsdWUsIFwiZWxlbWVudFwiLCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGJpbmRUeXBlICE9PSBudWxsICYmIHR5cGVvZiBuZXdCaW5kaW5nc1tiaW5kVHlwZV0gPT0gJ3VuZGVmaW5lZCcpIG5ld0JpbmRpbmdzW2JpbmRUeXBlXSA9IHt9O1xuXG5cbiAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIEhSRUZzXG4gICAgICAgICAgICBpZiAoYmluZFR5cGUgPT0gJ3ZpcnR1YWxBdHRyJyAmJiBiaW5kTmFtZSA9PSAnaHJlZicpIHtcbiAgICAgICAgICAgICAgYmluZFR5cGUgPSBudWxsO1xuICAgICAgICAgICAgICBiaW5kTmFtZSA9ICd3eXNpd3lnSHJlZic7XG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gcmVtb3ZlIGl0LCBvdGhlcndpc2Ugd2UgZW5kcyB1cCB3aXRoIDIgcnVsZXMgd3JpdGluZyBpdC5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ICE9ICd1bmRlZmluZWQnICYmIGVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkb211dGlscy5yZW1vdmVBdHRyaWJ1dGUoZWxlbWVudCwgXCJocmVmXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRPRE8gZXZhbHVhdGUgdGhlIHVzZSBvZiBcIi10aGVuXCIgKGFuZCAtZWxzZSkgcG9zdGZpeGVzIHRvIGNvbXBsZXRlIHRoZSAtaWYgaW5zdGVhZCBvZiByZWxheWluZ1xuICAgICAgICAgICAgLy8gb24gdGhlIHNhbWUgYmFzaWMgc2ludGF4IChvciBtYXliZSBpdCBpcyBiZXR0ZXIgdG8gc3VwcG9ydCB0ZXJuYXJ5IG9wZXJhdG9yIENPTkQgPyBUSEVOIDogRUxTRSkuXG4gICAgICAgICAgICB2YXIgZGVjbGFyYXRpb25Db25kaXRpb24gPSBfZGVjbGFyYXRpb25WYWx1ZUxvb2t1cChkZWNsYXJhdGlvbnMsIGRlY2xhcmF0aW9uc1tpXS5uYW1lICsgJy1pZicsIHRlbXBsYXRlVXJsQ29udmVydGVyKTtcbiAgICAgICAgICAgIHZhciBub3QgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbkNvbmRpdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBkZWNsYXJhdGlvbkNvbmRpdGlvbiA9IF9kZWNsYXJhdGlvblZhbHVlTG9va3VwKGRlY2xhcmF0aW9ucywgZGVjbGFyYXRpb25zW2ldLm5hbWUgKyAnLWlmbm90JywgdGVtcGxhdGVVcmxDb252ZXJ0ZXIpO1xuICAgICAgICAgICAgICBub3QgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKF9kZWNsYXJhdGlvblZhbHVlTG9va3VwKGRlY2xhcmF0aW9ucywgZGVjbGFyYXRpb25zW2ldLm5hbWUgKyAnLWlmbm90JywgdGVtcGxhdGVVcmxDb252ZXJ0ZXIpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgXCJVbmV4cGVjdGVkIGVycm9yOiBjYW5ub3QgdXNlIGJvdGggLWlmIGFuZCAtaWZub3QgcHJvcGVydHkgY29uZGl0aW9uc1wiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb25Db25kaXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgYmluZGluZ0NvbmQgPSBjb252ZXJ0ZXJVdGlscy5jb25kaXRpb25CaW5kaW5nKGRlY2xhcmF0aW9uQ29uZGl0aW9uLCBiaW5kaW5nUHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIGJpbmRWYWx1ZSA9IChub3QgPyAnIScgOiAnJykgKyBcIihcIiArIGJpbmRpbmdDb25kICsgXCIpID8gXCIgKyBiaW5kVmFsdWUgKyBcIiA6IG51bGxcIjtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmFibGUgdG8gZGVhbCB3aXRoIC1rbyBzdHlsZSBiaW5kaW5nIGNvbmRpdGlvblwiLCBkZWNsYXJhdGlvbkNvbmRpdGlvbiwgZGVjbGFyYXRpb25zW2ldLm5hbWUpO1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGJpbmRUeXBlICE9PSBudWxsKSBuZXdCaW5kaW5nc1tiaW5kVHlwZV1bYmluZE5hbWVdID0gYmluZFZhbHVlO1xuICAgICAgICAgICAgZWxzZSBuZXdCaW5kaW5nc1tiaW5kTmFtZV0gPSBiaW5kVmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gcGFyc2luZyBAc3VwcG9ydHMgOnByZXZpZXdcbiAgICAgICAgICBpZiAobmV3U3R5bGUgIT09IG51bGwpIHtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgLy8gaWYgXCJlbGVtZW50XCIgaXMgZGVmaW5lZCB0aGVuIHdlIGFyZSBwYXJzaW5nIGFuIFwiaW5saW5lXCIgc3R5bGUgYW5kIHdlIHdhbnQgdG8gcmVtb3ZlIGl0LlxuICAgICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQgIT0gJ3VuZGVmaW5lZCcgJiYgZWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5ld1N0eWxlID0gY29udmVydGVyVXRpbHMucmVtb3ZlU3R5bGUobmV3U3R5bGUsIGRlY2xhcmF0aW9uc1tpXS5wb3NpdGlvbi5zdGFydCwgZGVjbGFyYXRpb25zW2ldLnBvc2l0aW9uLmVuZCwgc2tpcExpbmVzLCAwLCAwLCAnJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIGFyZSBwYXJzaW5nIGEgZnVsbCBzdHlsZXNoZWV0Li4gbGV0J3MgcmV3cml0ZSB0aGUgZnVsbCBcInByb3A6IHZhbHVlXCIgd2l0aG91dCBjYXJpbmcgYWJvdXQgdGhlIG9yaWdpbmFsIHN5bnRheC5cbiAgICAgICAgICAgICAgICB2YXIgcmVwbGFjZWRXaXRoID0gJyc7XG4gICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgYW4gXCJpZlwiIHdlIHNpbXBseSBoYXZlIHRvIHJlbW92ZSBpdCwgb3RoZXJ3aXNlIHdlIHJlcGxhY2UgdGhlIGlucHV0IGNvZGUgd2l0aCBcInByb3A6IHZhbHVlXCIgZ2VuZXJhdGluZyBleHByZXNzaW9uLlxuICAgICAgICAgICAgICAgIGlmICghaXNJZikgcmVwbGFjZWRXaXRoID0gcHJvcE5hbWUgKyAnOiA8IS0tIGtvIHRleHQ6ICcgKyBiaW5kVmFsdWUgKyAnIC0tPicgKyBwcm9wRGVmYXVsdFZhbHVlICsgJzwhLS0gL2tvIC0tPic7XG4gICAgICAgICAgICAgICAgbmV3U3R5bGUgPSBjb252ZXJ0ZXJVdGlscy5yZW1vdmVTdHlsZShuZXdTdHlsZSwgZGVjbGFyYXRpb25zW2ldLnBvc2l0aW9uLnN0YXJ0LCBkZWNsYXJhdGlvbnNbaV0ucG9zaXRpb24uZW5kLCBza2lwTGluZXMsIDAsIDAsIHJlcGxhY2VkV2l0aCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiUmVtb3ZlIHN0eWxlIGZhaWxlZFwiLCBlLCBcIm5hbWVcIiwgZGVjbGFyYXRpb25zW2ldKTtcbiAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHByZWZpeGluZyB1cmxzXG4gICAgICAgICAgdmFyIHJlcGxhY2VkVmFsdWUgPSBfZGVjbGFyYXRpb25WYWx1ZVVybFByZWZpeGVyKGRlY2xhcmF0aW9uc1tpXS52YWx1ZSwgdGVtcGxhdGVVcmxDb252ZXJ0ZXIpO1xuICAgICAgICAgIGlmIChyZXBsYWNlZFZhbHVlICE9IGRlY2xhcmF0aW9uc1tpXS52YWx1ZSkge1xuICAgICAgICAgICAgaWYgKG5ld1N0eWxlID09PSBudWxsICYmIHR5cGVvZiBzdHlsZSAhPT0gJ3VuZGVmaW5lZCcpIG5ld1N0eWxlID0gc3R5bGU7XG4gICAgICAgICAgICBpZiAobmV3U3R5bGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBuZXdTdHlsZSA9IGNvbnZlcnRlclV0aWxzLnJlbW92ZVN0eWxlKG5ld1N0eWxlLCBkZWNsYXJhdGlvbnNbaV0ucG9zaXRpb24uc3RhcnQsIGRlY2xhcmF0aW9uc1tpXS5wb3NpdGlvbi5lbmQsIHNraXBMaW5lcywgMCwgMCwgZGVjbGFyYXRpb25zW2ldLm5hbWUgKyBcIjogXCIgKyByZXBsYWNlZFZhbHVlKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUmVtb3ZlIHN0eWxlIGZhaWxlZCByZXBsYWNpbmcgdXJsXCIsIGUsIFwibmFtZVwiLCBkZWNsYXJhdGlvbnNbaV0pO1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdHlsZSBoYW5kbGluZyBieSBjb25jYXRlbmF0ZWQgXCJzdHlsZSBhdHRyaWJ1dGVcIiAod29yc2UgcGVyZm9ybWFuY2UgYnV0IG1vcmUgc3RhYmxlIHRoYW4gZGlyZWN0IHN0eWxlIGhhbmRsaW5nKVxuICAgICAgICAgIHZhciBiaW5kTmFtZTIgPSBfcHJvcFRvQ2FtZWxDYXNlKGRlY2xhcmF0aW9uc1tpXS5uYW1lKTtcbiAgICAgICAgICB2YXIgYmluZCA9ICd2aXJ0dWFsQXR0clN0eWxlJztcbiAgICAgICAgICB2YXIgYmluZFZhbDIgPSB0eXBlb2YgbmV3QmluZGluZ3NbJ3ZpcnR1YWxTdHlsZSddICE9PSAndW5kZWZpbmVkJyA/IG5ld0JpbmRpbmdzWyd2aXJ0dWFsU3R5bGUnXVtiaW5kTmFtZTJdIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgdmFyIGRpc3QgPSAnICc7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXdCaW5kaW5nc1tiaW5kXSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbmV3QmluZGluZ3NbYmluZF0gPSBcIicnXCI7XG4gICAgICAgICAgICBkaXN0ID0gJyc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBiaW5kVmFsMiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG5ld0JpbmRpbmdzW2JpbmRdID0gXCInXCIgKyBkZWNsYXJhdGlvbnNbaV0ubmFtZSArIFwiOiAnKyhcIiArIGJpbmRWYWwyICsgXCIpKyc7XCIgKyBkaXN0ICsgXCInK1wiICsgbmV3QmluZGluZ3NbYmluZF07XG4gICAgICAgICAgICBkZWxldGUgbmV3QmluZGluZ3NbJ3ZpcnR1YWxTdHlsZSddW2JpbmROYW1lMl07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0JpbmRpbmdzW2JpbmRdID0gXCInXCIgKyBkZWNsYXJhdGlvbnNbaV0ubmFtZSArIFwiOiBcIiArIGNvbnZlcnRlclV0aWxzLmFkZFNsYXNoZXMocmVwbGFjZWRWYWx1ZSkgKyBcIjtcIiArIGRpc3QgKyBcIicrXCIgKyBuZXdCaW5kaW5nc1tiaW5kXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICBpZiAodHlwZW9mIGVsZW1lbnQgIT0gJ3VuZGVmaW5lZCcgJiYgZWxlbWVudCAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIHByb3AgaW4gbmV3QmluZGluZ3NbJ3ZpcnR1YWxTdHlsZSddKVxuICAgICAgaWYgKG5ld0JpbmRpbmdzWyd2aXJ0dWFsU3R5bGUnXS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIlVuZXhwZWN0ZWQgdmlydHVhbFN0eWxlIGJpbmRpbmcgYWZ0ZXIgY29udmVyc2lvbiB0byB2aXJ0dWFsQXR0ci5zdHlsZVwiLCBwcm9wLCBuZXdCaW5kaW5nc1sndmlydHVhbFN0eWxlJ11bcHJvcF0sIHN0eWxlKTtcbiAgICAgICAgdGhyb3cgXCJVbmV4cGVjdGVkIHZpcnR1YWxTdHlsZSBiaW5kaW5nIGFmdGVyIGNvbnZlcnNpb24gdG8gdmlydHVhbEF0dHIuc3R5bGUgZm9yIFwiICsgcHJvcDtcbiAgICAgIH1cbiAgICBkZWxldGUgbmV3QmluZGluZ3NbJ3ZpcnR1YWxTdHlsZSddO1xuXG4gICAgdmFyIGN1cnJlbnRCaW5kaW5ncyA9IGRvbXV0aWxzLmdldEF0dHJpYnV0ZShlbGVtZW50LCAnZGF0YS1iaW5kJyk7XG4gICAgdmFyIGRhdGFCaW5kID0gKGN1cnJlbnRCaW5kaW5ncyAhPT0gbnVsbCA/IGN1cnJlbnRCaW5kaW5ncyArIFwiLCBcIiA6IFwiXCIpICsgX2JpbmRpbmdTZXJpYWxpemVyKG5ld0JpbmRpbmdzKTtcbiAgICBkb211dGlscy5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ2RhdGEtYmluZCcsIGRhdGFCaW5kKTtcbiAgfVxuXG4gIC8vIFRPRE8gYSBmdW5jdGlvbiB3aG9zZSByZXR1cm4gdHlwZSBkZXBlbmRzIG9uIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGlzIHZlcnkgdWdseS4uIHBsZWFzZSBGSVggTUUuXG4gIGlmICh0eXBlb2Ygc3R5bGUgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBjbGVhbiB2aXJ0dWFsU3R5bGUgaWYgZW1wdHlcbiAgICB2YXIgaGFzVmlydHVhbFN0eWxlID0gZmFsc2U7XG4gICAgZm9yICh2YXIgcHJvcDEgaW4gbmV3QmluZGluZ3NbJ3ZpcnR1YWxTdHlsZSddKVxuICAgICAgaWYgKG5ld0JpbmRpbmdzWyd2aXJ0dWFsU3R5bGUnXS5oYXNPd25Qcm9wZXJ0eShwcm9wMSkpIHtcbiAgICAgICAgaGFzVmlydHVhbFN0eWxlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgaWYgKCFoYXNWaXJ0dWFsU3R5bGUpIGRlbGV0ZSBuZXdCaW5kaW5nc1sndmlydHVhbFN0eWxlJ107XG4gICAgZWxzZSB7XG4gICAgICAvLyByZW1vdmUgYW5kIGFkZCBiYWNrIHZpcnR1YWxBdHRyU3R5bGUgc28gaXQgZ2V0cyBhcHBlbmRlZCBCRUZPUkUgdmlydHVhbEF0dHJTdHlsZSAoX2JpbmRpbmdTZXJpYWxpemVyIHJldmVyc2UgdGhlbS4uLilcbiAgICAgIGlmICh0eXBlb2YgbmV3QmluZGluZ3NbJ3ZpcnR1YWxBdHRyU3R5bGUnXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIHZzID0gbmV3QmluZGluZ3NbJ3ZpcnR1YWxBdHRyU3R5bGUnXTtcbiAgICAgICAgZGVsZXRlIG5ld0JpbmRpbmdzWyd2aXJ0dWFsQXR0clN0eWxlJ107XG4gICAgICAgIG5ld0JpbmRpbmdzWyd2aXJ0dWFsQXR0clN0eWxlJ10gPSB2cztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gcmV0dXJucyBuZXcgc2VyaWFsaXplZCBiaW5kaW5nc1xuICAgIHJldHVybiBfYmluZGluZ1NlcmlhbGl6ZXIobmV3QmluZGluZ3MpO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0eWxlO1xufTtcblxudmFyIF9iaW5kaW5nU2VyaWFsaXplciA9IGZ1bmN0aW9uKHZhbCkge1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIHByb3AgaW4gdmFsKVxuICAgIGlmICh2YWwuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsW3Byb3BdID09ICdvYmplY3QnKSByZXMucHVzaChwcm9wICsgXCI6IFwiICsgXCJ7IFwiICsgX2JpbmRpbmdTZXJpYWxpemVyKHZhbFtwcm9wXSkgKyBcIiB9XCIpO1xuICAgICAgZWxzZSByZXMucHVzaChwcm9wICsgXCI6IFwiICsgdmFsW3Byb3BdKTtcbiAgICB9XG4gIHJldHVybiByZXMucmV2ZXJzZSgpLmpvaW4oJywgJyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVsYWJvcmF0ZURlY2xhcmF0aW9uczsiLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gVGhpcyBkZWFscyB3aXRoIENoZWVyaW8valF1ZXJ5IGlzc3Vlcy5cbi8vIE1vc3Qgb2YgdGhpcyBjb3VsZCBiZSBkb25lIHdpdGhvdXQgalF1ZXJ5LCB0b28sIGJ1dCBqUXVlcnkgaXMgZWFzaWVyIHRvIGJlIG1vY2tlZCB3aXRoIENoZWVyaW9cbi8vIE90aGVyd2lzZSB3ZSB3b3VsZCBuZWVkIGpzRG9tIHRvIHJ1biB0aGUgY29tcGlsZXIgaW4gdGhlIHNlcnZlciAod2l0aG91dCBhIHJlYWwgYnJvd3NlcilcblxudmFyICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuXG5mdW5jdGlvbiBfZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7XG4gIGlmIChzb3VyY2UpIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIHNvdXJjZSkge1xuICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbnZhciBvYmpFeHRlbmQgPSBmdW5jdGlvbihvYmosIGV4dGVuZGVyKSB7XG4gIGlmICh0eXBlb2YgJC5leHRlbmQgPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiAkLmV4dGVuZCh0cnVlLCBvYmosIGV4dGVuZGVyKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gX2V4dGVuZChvYmosIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXh0ZW5kZXIpKSk7XG4gIH1cbn07XG5cbnZhciBnZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1dGUpIHtcbiAgdmFyIHJlcyA9ICQoZWxlbWVudCkuYXR0cihhdHRyaWJ1dGUpO1xuICBpZiAodHlwZW9mIHJlcyA9PSAndW5kZWZpbmVkJykgcmVzID0gbnVsbDtcbiAgcmV0dXJuIHJlcztcbiAgLy8gcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7XG59O1xuXG52YXIgc2V0QXR0cmlidXRlID0gZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSkge1xuICAkKGVsZW1lbnQpLmF0dHIoYXR0cmlidXRlLCB2YWx1ZSk7XG4gIC8vIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpO1xufTtcblxudmFyIHJlbW92ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkge1xuICAkKGVsZW1lbnQpLnJlbW92ZUF0dHIoYXR0cmlidXRlKTtcbiAgLy8gZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbn07XG5cbnZhciBnZXRJbm5lclRleHQgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gIHJldHVybiAkKGVsZW1lbnQpLnRleHQoKTtcbiAgLy8gaWYgKHR5cGVvZiBlbGVtZW50LmlubmVyVGV4dCAhPSAndW5kZWZpbmVkJykgcmV0dXJuIGVsZW1lbnQuaW5uZXJUZXh0O1xuICAvLyBlbHNlIHJldHVybiBlbGVtZW50LnRleHRDb250ZW50O1xufTtcblxudmFyIGdldElubmVySHRtbCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgcmV0dXJuICQoZWxlbWVudCkuaHRtbCgpO1xuICAvLyByZXR1cm4gZWxlbWVudC5pbm5lckhUTUw7XG59O1xuXG52YXIgZ2V0TG93ZXJUYWdOYW1lID0gZnVuY3Rpb24oZWxlbWVudCkge1xuICAvLyBzb21ldGltZXMgY2hlZXJpbyBkb2Vzbid0IGhhdmUgdGFnTmFtZSBidXQgXCJuYW1lXCIuXG4gIC8vIEJyb3dzZXJzIGhhdmUgXCJuYW1lXCIgd2l0aCBlbXB0eSBzdHJpbmdcbiAgLy8gU29tZXRpbWVzIGNoZWVyaW8gaGFzIHRhZ05hbWUgYnV0IG5vIHByb3AgZnVuY3Rpb24uXG4gIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICcnICYmIHR5cGVvZiBlbGVtZW50Lm5hbWUgPT0gJ3N0cmluZycpIHJldHVybiBlbGVtZW50Lm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGVsZW1lbnQudGFnTmFtZSAhPT0gJycpIHJldHVybiBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuICQoZWxlbWVudCkucHJvcChcInRhZ05hbWVcIikudG9Mb3dlckNhc2UoKTtcbiAgLy8gcmV0dXJuIGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIHNldENvbnRlbnQgPSBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7XG4gICQoZWxlbWVudCkuaHRtbChjb250ZW50KTtcbiAgLy8gZWxlbWVudC5pbm5lckhUTUwgPSBjb250ZW50O1xufTtcblxudmFyIHJlcGxhY2VIdG1sID0gZnVuY3Rpb24oZWxlbWVudCwgaHRtbCkge1xuICAkKGVsZW1lbnQpLnJlcGxhY2VXaXRoKGh0bWwpO1xuICAvLyBlbGVtZW50Lm91dGVySFRNTCA9IGh0bWw7XG59O1xuXG52YXIgcmVtb3ZlRWxlbWVudHMgPSBmdW5jdGlvbigkZWxlbWVudHMsIHRyeURldGFjaCkge1xuICBpZiAodHJ5RGV0YWNoICYmIHR5cGVvZiAkZWxlbWVudHMuZGV0YWNoICE9PSAndW5kZWZpbmVkJykgJGVsZW1lbnRzLmRldGFjaCgpO1xuICAvLyBOT1RFOiB3ZSBkb24ndCBuZWVkIGFuIGVsc2UsIGFzIGRldGFjaCBpcyBzaW1wbHkgYW4gb3B0aW1pemF0aW9uXG4gICRlbGVtZW50cy5yZW1vdmUoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRBdHRyaWJ1dGU6IGdldEF0dHJpYnV0ZSxcbiAgc2V0QXR0cmlidXRlOiBzZXRBdHRyaWJ1dGUsXG4gIHJlbW92ZUF0dHJpYnV0ZTogcmVtb3ZlQXR0cmlidXRlLFxuICBnZXRJbm5lclRleHQ6IGdldElubmVyVGV4dCxcbiAgZ2V0SW5uZXJIdG1sOiBnZXRJbm5lckh0bWwsXG4gIGdldExvd2VyVGFnTmFtZTogZ2V0TG93ZXJUYWdOYW1lLFxuICBzZXRDb250ZW50OiBzZXRDb250ZW50LFxuICByZXBsYWNlSHRtbDogcmVwbGFjZUh0bWwsXG4gIHJlbW92ZUVsZW1lbnRzOiByZW1vdmVFbGVtZW50cyxcbiAgb2JqRXh0ZW5kOiBvYmpFeHRlbmRcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBjb25zb2xlID0gcmVxdWlyZShcImNvbnNvbGVcIik7XG52YXIgZWxhYm9yYXRlRGVjbGFyYXRpb25zID0gcmVxdWlyZShcIi4vZGVjbGFyYXRpb25zLmpzXCIpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscy5qcycpO1xudmFyIG1vZGVsRGVmID0gcmVxdWlyZSgnLi9tb2RlbC5qcycpO1xuXG52YXIgX2dldE9wdGlvbnNPYmplY3QgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHZhciBvcHRpb25zQ291cGxlcyA9IG9wdGlvbnMuc3BsaXQoJ3wnKTtcbiAgdmFyIG9wdHMgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb25zQ291cGxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBvcHQgPSBvcHRpb25zQ291cGxlc1tpXS5zcGxpdCgnPScpO1xuICAgIG9wdHNbb3B0WzBdXSA9IG9wdC5sZW5ndGggPiAxID8gb3B0WzFdIDogb3B0WzBdO1xuICB9XG4gIHJldHVybiBvcHRzO1xufTtcblxuLy8gVE9ETyB0aGlzIHNob3VsZCBub3QgaGF2ZSBoYXJkY29kZWQgcnVsZXMgKHdlIG5vdyBoYXZlIGEgd2F5IHRvIGRlY2xhcmUgdGhlbSBpbiB0aGUgdGVtcGxhdGUgZGVmaW5pdGlvbilcbi8vIENhdGVnb3J5IFwic3R5bGVcIiBpcyB1c2VkIGJ5IGVkaXRUeXBlIFwic3R5bGVyXCJcbi8vIENhdGVvZ3J5IFwiY29udGVudFwiIGlzIHVzZWQgYnkgZWRpdFR5cGUgXCJlZGl0XCJcbi8vIFRPRE8gbWF5YmUgd2Ugc2hvdWxkIHVzZSBhIGNvbW1vbiBzdHJpbmcgaGVyZSwgYW5kIHJlbHkgb25seSBvbiB0aGUgb3JpZ2luYWwgY2F0ZWdvcnkuXG52YXIgX2ZpbHRlclByb3BzID0gZnVuY3Rpb24obW9kZWwsIGVkaXRUeXBlLCBsZXZlbCkge1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIHByb3AgaW4gbW9kZWwpXG4gICAgaWYgKCFwcm9wLm1hdGNoKC9eY3VzdG9tU3R5bGUkLykgJiYgIXByb3AubWF0Y2goL15fLykgJiYgbW9kZWwuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgIHZhciBpc1N0eWxlUHJvcCA9IG1vZGVsW3Byb3BdICE9PSBudWxsICYmIHR5cGVvZiBtb2RlbFtwcm9wXS5fY2F0ZWdvcnkgIT0gJ3VuZGVmaW5lZCcgJiYgbW9kZWxbcHJvcF0uX2NhdGVnb3J5ID09ICdzdHlsZSc7XG4gICAgICBpZiAocHJvcCA9PSAnaWQnIHx8IHByb3AgPT0gJ3R5cGUnIHx8IHByb3AubWF0Y2goL0Jsb2NrcyQvKSkge30gZWxzZSBpZiAoZWRpdFR5cGUgPT0gJ3N0eWxlcicpIHtcbiAgICAgICAgaWYgKGlzU3R5bGVQcm9wIHx8IGxldmVsID4gMCkgcmVzLnB1c2gocHJvcCk7XG4gICAgICB9IGVsc2UgaWYgKGVkaXRUeXBlID09ICdlZGl0Jykge1xuICAgICAgICAvLyBFZGl0aW5nIGZvciBwcm9wZXJ0aWVzIGluIHRoZSBcImNvbnRlbnRcIiBjYXRlZ29yeSBidXQgbm90IGRlZmluZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBibG9ja1xuICAgICAgICB2YXIgaXNDb250ZW50UHJvcCA9IG1vZGVsW3Byb3BdICE9PSBudWxsICYmIHR5cGVvZiBtb2RlbFtwcm9wXS5fY2F0ZWdvcnkgIT0gJ3VuZGVmaW5lZCcgJiYgbW9kZWxbcHJvcF0uX2NhdGVnb3J5ID09ICdjb250ZW50JyAmJlxuICAgICAgICAgICh0eXBlb2YgbW9kZWxbcHJvcF0uX2NvbnRleHQgPT0gJ3VuZGVmaW5lZCcgfHwgbW9kZWxbcHJvcF0uX2NvbnRleHQgIT0gJ2Jsb2NrJyk7XG4gICAgICAgIGlmIChpc0NvbnRlbnRQcm9wKSByZXMucHVzaChwcm9wKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVkaXRUeXBlID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJlcy5wdXNoKHByb3ApO1xuICAgICAgfVxuICAgIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cbnZhciBfcHJvcElucHV0ID0gZnVuY3Rpb24obW9kZWwsIHByb3AsIHByb3BBY2Nlc3NvciwgZWRpdFR5cGUsIHdpZGdldHMpIHtcbiAgdmFyIGh0bWwgPSBcIlwiO1xuICB2YXIgd2lkZ2V0O1xuICBpZiAobW9kZWwgIT09IG51bGwgJiYgdHlwZW9mIG1vZGVsLl93aWRnZXQgIT0gJ3VuZGVmaW5lZCcpIHdpZGdldCA9IG1vZGVsLl93aWRnZXQ7XG5cbiAgaWYgKHR5cGVvZiB3aWRnZXQgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0aHJvdyBcIlVua25vd24gZGF0YSB0eXBlIGZvciBcIiArIHByb3A7XG4gIH1cblxuICAvLyBGb3IgY29udGVudCBlZGl0b3JzIHdlIGRlYWwgd2l0aCBmb2N1c2luZyAoY2xpY2tpbmcgaXMgaGFuZGxlZCBieSB0aGUgY29udGFpbmVyIERJVikuXG4gIHZhciBvbmZvY3VzYmluZGluZyA9ICdmb2N1c2FibGU6IHRydWUnO1xuICBpZiAoZWRpdFR5cGUgPT0gJ2VkaXQnKSB7XG4gICAgb25mb2N1c2JpbmRpbmcgKz0gJywgZXZlbnQ6IHsgZm9jdXM6IGZ1bmN0aW9uKHVpLCBldmVudCkgeyAkKCRlbGVtZW50KS5jbGljaygpOyB9IH0gJztcbiAgfVxuXG4gIGh0bWwgKz0gJzxsYWJlbCBjbGFzcz1cImRhdGEtJyArIHdpZGdldCArICdcIicgKyAod2lkZ2V0ID09ICdib29sZWFuJyA/ICcgZGF0YS1iaW5kPVwiZXZlbnQ6IHsgbW91c2Vkb3duOiBmdW5jdGlvbih1aSwgZXZ0KSB7IGlmIChldnQuYnV0dG9uID09IDApIHsgdmFyIGlucHV0ID0gJCgkZWxlbWVudCkuZmluZChcXCdpbnB1dFxcJyk7IHZhciBjaCA9IGlucHV0LnByb3AoXFwnY2hlY2tlZFxcJyk7IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGlucHV0LmNsaWNrKCk7IGlucHV0LnByb3AoXFwnY2hlY2tlZFxcJywgIWNoKTsgaW5wdXQudHJpZ2dlcihcXCdjaGFuZ2VcXCcpOyB9LCAwKTsgfSB9IH0sIGNsaWNrOiBmdW5jdGlvbih1aSwgZXZ0KSB7IGV2dC5wcmV2ZW50RGVmYXVsdCgpOyB9LCBjbGlja0J1YmJsZTogZmFsc2VcIicgOiAnJykgKyAnPic7XG5cbiAgaWYgKHR5cGVvZiB3aWRnZXRzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2lkZ2V0c1t3aWRnZXRdICE9PSAndW5kZWZpbmVkJykge1xuICAgIHZhciB3ID0gd2lkZ2V0c1t3aWRnZXRdO1xuICAgIHZhciBwYXJhbWV0ZXJzID0ge307XG4gICAgaWYgKHR5cGVvZiB3LnBhcmFtZXRlcnMgIT09ICd1bmRlZmluZWQnKVxuICAgICAgZm9yICh2YXIgcCBpbiB3LnBhcmFtZXRlcnMpXG4gICAgICAgIGlmICh3LnBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkocCkgJiYgdHlwZW9mIG1vZGVsWydfJytwXSAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgcGFyYW1ldGVyc1twXSA9IG1vZGVsWydfJytwXTtcbiAgICBodG1sICs9IHcuaHRtbChwcm9wQWNjZXNzb3IsIG9uZm9jdXNiaW5kaW5nLCBwYXJhbWV0ZXJzKTtcbiAgfSBlbHNlIGlmICh3aWRnZXQgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgaHRtbCArPSAnPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwibm90aGluZ1wiIGRhdGEtYmluZD1cImNoZWNrZWQ6ICcgKyBwcm9wQWNjZXNzb3IgKyAnLCAnICsgb25mb2N1c2JpbmRpbmcgKyAnXCIgLz4nO1xuICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPVwiY2hlY2tib3gtcmVwbGFjZXJcIiA+PC9zcGFuPic7IC8qIGRhdGEtYmluZD1cImNzczogeyBjaGVja2VkOiAnK3Byb3BBY2Nlc3NvcisnIH1cIiAqL1xuICB9IGVsc2UgaWYgKHdpZGdldCA9PSAnY29sb3InKSB7XG4gICAgaHRtbCArPSAnPGlucHV0IHNpemU9XCI3XCIgdHlwZT1cInRleHRcIiBkYXRhLWJpbmQ9XCJjb2xvcnBpY2tlcjogeyBjb2xvcjogJyArIHByb3BBY2Nlc3NvciArICcsIHN0cmluZ3M6ICRyb290LnQoXFwnVGhlbWUgQ29sb3JzLFN0YW5kYXJkIENvbG9ycyxXZWIgQ29sb3JzLFRoZW1lIENvbG9ycyxCYWNrIHRvIFBhbGV0dGUsSGlzdG9yeSxObyBoaXN0b3J5IHlldC5cXCcpIH0sICcgKyAnLCAnICsgb25mb2N1c2JpbmRpbmcgKyAnXCIgLz4nO1xuICB9IGVsc2UgaWYgKHdpZGdldCA9PSAnc2VsZWN0Jykge1xuICAgIGlmICh0eXBlb2YgbW9kZWwuX29wdGlvbnMgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBvcHRzID0gX2dldE9wdGlvbnNPYmplY3QobW9kZWwuX29wdGlvbnMpO1xuICAgICAgLy8gdmFyIG9wdHMgPSBtb2RlbC5fb3B0aW9ucztcbiAgICAgIGh0bWwgKz0gJzxzZWxlY3QgZGF0YS1iaW5kPVwidmFsdWU6ICcgKyBwcm9wQWNjZXNzb3IgKyAnLCAnICsgb25mb2N1c2JpbmRpbmcgKyAnXCI+JztcbiAgICAgIGZvciAodmFyIG9wdCBpbiBvcHRzKVxuICAgICAgICBpZiAob3B0cy5oYXNPd25Qcm9wZXJ0eShvcHQpKSB7XG4gICAgICAgICAgaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyBvcHQgKyAnXCIgZGF0YS1iaW5kPVwidGV4dDogJHJvb3QudXQoXFwndGVtcGxhdGVcXCcsIFxcJycgKyB1dGlscy5hZGRTbGFzaGVzKG9wdHNbb3B0XSkgKyAnXFwnKVwiPicgKyBvcHRzW29wdF0gKyAnPC9vcHRpb24+JztcbiAgICAgICAgfVxuICAgICAgaHRtbCArPSAnPC9zZWxlY3Q+JztcbiAgICB9XG4gIH0gZWxzZSBpZiAod2lkZ2V0ID09ICdmb250Jykge1xuICAgIGh0bWwgKz0gJzxzZWxlY3QgdHlwZT1cInRleHRcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogJyArIHByb3BBY2Nlc3NvciArICcsICcgKyBvbmZvY3VzYmluZGluZyArICdcIj4nO1xuICAgIGh0bWwgKz0gJzxvcHRncm91cCBsYWJlbD1cIlNhbnMtU2VyaWYgRm9udHNcIj4nO1xuICAgIGh0bWwgKz0gJzxvcHRpb24gdmFsdWU9XCJBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZlwiPkFyaWFsPC9vcHRpb24+JztcbiAgICBodG1sICs9ICc8b3B0aW9uIHZhbHVlPVwiXFwnQ29taWMgU2FucyBNU1xcJyxjdXJzaXZlLHNhbnMtc2VyaWZcIj5Db21pYyBTYW5zIE1TPC9vcHRpb24+JztcbiAgICBodG1sICs9ICc8b3B0aW9uIHZhbHVlPVwiSW1wYWN0LENoYXJjb2FsLHNhbnMtc2VyaWZcIj5JbXBhY3Q8L29wdGlvbj4nO1xuICAgIGh0bWwgKz0gJzxvcHRpb24gdmFsdWU9XCJcXCdUcmVidWNoZXQgTVNcXCcsSGVsdmV0aWNhLHNhbnMtc2VyaWZcIj5UcmVidWNoZXQgTVM8L29wdGlvbj4nO1xuICAgIGh0bWwgKz0gJzxvcHRpb24gdmFsdWU9XCJWZXJkYW5hLEdlbmV2YSxzYW5zLXNlcmlmXCI+VmVyZGFuYTwvb3B0aW9uPic7XG4gICAgaHRtbCArPSAnPC9vcHRncm91cD4nO1xuICAgIGh0bWwgKz0gJzxvcHRncm91cCBsYWJlbD1cIlNlcmlmIEZvbnRzXCI+JztcbiAgICBodG1sICs9ICc8b3B0aW9uIHZhbHVlPVwiR2VvcmdpYSxzZXJpZlwiPkdlb3JnaWE8L29wdGlvbj4nO1xuICAgIGh0bWwgKz0gJzxvcHRpb24gdmFsdWU9XCJcXCdUaW1lcyBOZXcgUm9tYW5cXCcsVGltZXMsc2VyaWZcIj5UaW1lcyBOZXcgUm9tYW48L29wdGlvbj4nO1xuICAgIGh0bWwgKz0gJzwvb3B0Z3JvdXA+JztcbiAgICBodG1sICs9ICc8b3B0Z3JvdXAgbGFiZWw9XCJNb25vc3BhY2UgRm9udHNcIj4nO1xuICAgIGh0bWwgKz0gJzxvcHRpb24gdmFsdWU9XCJcXCdDb3VyaWVyIE5ld1xcJyxDb3VyaWVyLG1vbm9zcGFjZVwiPkNvdXJpZXIgTmV3PC9vcHRpb24+JztcbiAgICBodG1sICs9ICc8L29wdGdyb3VwPic7XG4gICAgaHRtbCArPSAnPC9zZWxlY3Q+JztcbiAgfSBlbHNlIGlmICh3aWRnZXQgPT0gJ3VybCcpIHtcbiAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwidWktdGV4dGJ1dHRvblwiPic7XG4gICAgLy8gPGEgY2xhc3M9XCJ1aS1zcGlubmVyLWJ1dHRvbiB1aS1zcGlubmVyLWRvd24gdWktY29ybmVyLWJyIHVpLWJ1dHRvbiB1aS13aWRnZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1idXR0b24tdGV4dC1vbmx5XCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJidXR0b25cIj48c3BhbiBjbGFzcz1cInVpLWJ1dHRvbi10ZXh0XCI+PHNwYW4gY2xhc3M9XCJ1aS1pY29uIGZhIGZhLWZ3IGNhcmV0LWRvd25cIj7ilrw8L3NwYW4+PC9zcGFuPjwvYT5cbiAgICBodG1sICs9ICc8aW5wdXQgY2xhc3M9XCJ1aS10ZXh0YnV0dG9uLWlucHV0XCIgc2l6ZT1cIjdcIiB0eXBlPVwidXJsXCIgcGF0dGVybj1cIihtYWlsdG86LitALit8aHR0cHM/Oi8vLitcXFxcLi4rfFxcXFxbLipcXFxcXS4qKVwiIHZhbHVlPVwibm90aGluZ1wiIGRhdGEtYmluZD1cImNzczogeyB3aXRoQnV0dG9uOiB0eXBlb2YgJHJvb3QubGlua0RpYWxvZyAhPT0gXFwndW5kZWZpbmVkXFwnIH0sIHZhbGlkYXRlZFZhbHVlOiAnICsgcHJvcEFjY2Vzc29yICsgJywgJyArIG9uZm9jdXNiaW5kaW5nICsgJ1wiIC8+JztcbiAgICBodG1sICs9ICc8YSBjbGFzcz1cInVpLXRleHRidXR0b24tYnV0dG9uXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogdHlwZW9mICRyb290LmxpbmtEaWFsb2cgIT09IFxcJ3VuZGVmaW5lZFxcJywgY2xpY2s6IHR5cGVvZiAkcm9vdC5saW5rRGlhbG9nICE9PSBcXCd1bmRlZmluZWRcXCcgPyAkcm9vdC5saW5rRGlhbG9nLmJpbmQoJGVsZW1lbnQucHJldmlvdXNTaWJsaW5nKSA6IGZhbHNlLCBidXR0b246IHsgaWNvbnM6IHsgcHJpbWFyeTogXFwnZmEgZmEtZncgZmEtZWxsaXBzaXMtaFxcJyB9LCBsYWJlbDogXFwnT3B6aW9uaVxcJywgdGV4dDogZmFsc2UgfVwiPk9wemlvbmk8L2E+JztcbiAgICBodG1sICs9ICc8L2Rpdj4nO1xuICB9IGVsc2UgaWYgKHdpZGdldCA9PSAnaW50ZWdlcicpIHtcbiAgICAvLyBhdCB0aGlzIHRpbWUgdGhlIFwic3RlcFwiIGRlcGVuZHMgb24gbWF4IGJlaW5nIGdyZWF0ZXIgdGhhbiAxMDAuXG4gICAgLy8gbWF5YmUgd2Ugc2hvdWxkIGV4cG9zZSBcInN0ZXBcIiBhcyBhIGNvbmZpZ3VyYXRpb24sIHRvb1xuICAgIHZhciBtaW4gPSAwO1xuICAgIHZhciBtYXggPSAxMDAwO1xuICAgIGlmIChtb2RlbCAhPT0gbnVsbCAmJiB0eXBlb2YgbW9kZWwuX21heCAhPT0gJ3VuZGVmaW5lZCcpIG1heCA9IG1vZGVsLl9tYXg7XG4gICAgaWYgKG1vZGVsICE9PSBudWxsICYmIHR5cGVvZiBtb2RlbC5fbWluICE9PSAndW5kZWZpbmVkJykgbWluID0gbW9kZWwuX21pbjtcbiAgICB2YXIgc3RlcCA9IChtYXggLSBtaW4pID49IDEwMCA/IDEwIDogMTtcbiAgICB2YXIgcGFnZSA9IHN0ZXAgKiA1O1xuICAgIGh0bWwgKz0gJzxpbnB1dCBjbGFzcz1cIm51bWJlci1zcGlubmVyXCIgc2l6ZT1cIjdcIiBzdGVwPVwiJyArIHN0ZXAgKyAnXCIgdHlwZT1cIm51bWJlclwiIHZhbHVlPVwiLTFcIiBkYXRhLWJpbmQ9XCJzcGlubmVyOiB7IG1pbjogJyArIG1pbiArICcsIG1heDogJyArIG1heCArICcsIHBhZ2U6ICcgKyBwYWdlICsgJywgdmFsdWU6ICcgKyBwcm9wQWNjZXNzb3IgKyAnIH0sIHZhbHVlVXBkYXRlOiBbXFwnY2hhbmdlXFwnLCBcXCdzcGluXFwnXScgKyAnLCAnICsgb25mb2N1c2JpbmRpbmcgKyAnXCIgLz4nO1xuICB9IGVsc2Uge1xuICAgIGh0bWwgKz0gJzxpbnB1dCBzaXplPVwiN1wiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCJub3RoaW5nXCIgZGF0YS1iaW5kPVwidmFsdWU6ICcgKyBwcm9wQWNjZXNzb3IgKyAnLCAnICsgb25mb2N1c2JpbmRpbmcgKyAnXCIgLz4nO1xuICB9XG5cbiAgaHRtbCArPSAnPC9sYWJlbD4nO1xuXG4gIHJldHVybiBodG1sO1xufTtcblxudmFyIF9nZXRHbG9iYWxTdHlsZVByb3AgPSBmdW5jdGlvbihnbG9iYWxTdHlsZXMsIG1vZGVsLCBwcm9wLCBwYXRoKSB7XG4gIHZhciBnbG9iYWxTdHlsZVByb3A7XG4gIGlmICh0eXBlb2YgbW9kZWwgIT09ICdvYmplY3QnIHx8IG1vZGVsID09PSBudWxsIHx8IHR5cGVvZiBtb2RlbC5fd2lkZ2V0ICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHBhdGggIT09ICd1bmRlZmluZWQnICYmIHBhdGgubGVuZ3RoID4gMCAmJiB0eXBlb2YgZ2xvYmFsU3R5bGVzID09ICdvYmplY3QnICYmIHR5cGVvZiBnbG9iYWxTdHlsZXNbcGF0aF0gIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGdsb2JhbFN0eWxlUHJvcCA9IGdsb2JhbFN0eWxlc1twYXRoXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdsb2JhbFN0eWxlUHJvcDtcbn07XG5cbnZhciBfcHJvcEVkaXRvciA9IGZ1bmN0aW9uKHdpdGhCaW5kaW5nUHJvdmlkZXIsIHdpZGdldHMsIHRlbXBsYXRlVXJsQ29udmVydGVyLCBtb2RlbCwgdGhlbWVNb2RlbCwgcGF0aCwgcHJvcCwgZWRpdFR5cGUsIGxldmVsLCBiYXNlVGhyZXNob2xkLCBnbG9iYWxTdHlsZXMsIGdsb2JhbFN0eWxlUHJvcCwgdHJhY2tVc2FnZSwgcm9vdFByZXZpZXdCaW5kaW5nLCBwcmV2aWV3QmFja2dyb3VuZCkge1xuICBpZiAodHlwZW9mIGxldmVsID09ICd1bmRlZmluZWQnKSBsZXZlbCA9IDA7XG5cbiAgaWYgKHR5cGVvZiBwcm9wICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbW9kZWwgPT0gJ29iamVjdCcgJiYgbW9kZWwgIT09IG51bGwgJiYgdHlwZW9mIG1vZGVsLl91c2Vjb3VudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb25zb2xlLmxvZyhcIlRPRE8gRURJVE9SIGlnbm9yaW5nXCIsIHBhdGgsIFwicHJvcGVydHkgYmVjYXVzZSBpdCBpcyBub3QgdXNlZCBieSB0aGUgdGVtcGxhdGVcIiwgXCJwcm9wOlwiLCBwcm9wLCBcInR5cGU6XCIsIGVkaXRUeXBlLCBcImxldmVsOlwiLCBsZXZlbCwgd2l0aEJpbmRpbmdQcm92aWRlci5fdGVtcGxhdGVOYW1lKTtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIHZhciBwcm9wQWNjZXNzb3IgPSB0eXBlb2YgZ2xvYmFsU3R5bGVQcm9wICE9ICd1bmRlZmluZWQnID8gcHJvcCArICcuX2RlZmF1bHRDb21wdXRlZCcgOiBwcm9wO1xuXG4gIHZhciBodG1sID0gXCJcIjtcbiAgdmFyIHRpdGxlO1xuICB2YXIgaWZTdWJzUHJvcCA9IHByb3BBY2Nlc3NvcjtcbiAgdmFyIGlmU3Vic0d1dHRlciA9IDE7XG4gIC8vIHR5cGVvZiBnbG9iYWxTdHlsZVByb3AgIT0gJ3VuZGVmaW5lZCcgPyAxIDogMjtcbiAgdmFyIGlmU3Vic1RocmVzaG9sZCA9IDE7XG5cbiAgLy8gVGhlIHZpc2liaWxpdHkgaGFuZGxpbmcgaXMgYSBQSVRBXG4gIC8vIFxuICAvLyBIZXJlIGFyZSBzb21lIFwiZWRnZSBjYXNlc1wiIHRvIHRlc3Qgd2hlbmV2ZXIgd2UgY2hhbmdlIHNvbWV0aGluZyBoZXJlOlxuICAvLyBMTSBzb2NpYWwgZm9vdGVyOiByZW1vdmluZyBzaGFyZVZpc2liaWxlIG11c3QgYmUgcmVmbGVjdGVkIGluIHRoZSBib29sZWFucyBzdWItY2hlY2tzXG4gIC8vIEZMVUlEIHNvY2lhbCBibG9jazogbXVsdGlwbGUgY2xpY2tzIG9uIHRoZSBcIndhbmRcIiBzaG91bGQgbm90IG1ha2UgdGhlIGVkaXRvciBpbnZpc2libGVcbiAgLy8gQklTIGhlcm9NZW51IC0gQnkgY2hhbmdpbmcgdGhlIG1lbnUgdmlzaWJpbGl0eSBpdCBzaG91bGQgYmUgcmVmbGVjdGVkIGluIHN0eWxlIGVkaXRvcnMgZm9yIHRoZSBtZW51IGxpbmtzXG4gIC8vIEZMVUlEIGFsbW9zdCBldmVyeSBibG9jayB3aXRoIGEgY29sb3IgdmFyaWFudCBzb21ldGltZXMga2VlcHMgc2hvd2luZyBzdHlsZSBlZGl0b3IgZm9yIHRoZSBoaWRkZW4gdmFyaWFudC5cbiAgaWYgKHR5cGVvZiBtb2RlbCA9PSAnb2JqZWN0JyAmJiBtb2RlbCAhPT0gbnVsbCAmJiB0eXBlb2YgbW9kZWwuX3dpZGdldCA9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIERvIG5vdGhpbmcgaGVyZVxuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsU3R5bGVQcm9wID09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZlN1YnNHdXR0ZXIgKz0gMTtcbiAgICB9XG4gIH1cblxuICAvLyBOT1RFIGJhc2VUaHJlc2hvbGQgaXMgYWRkZWQgb25seSB3aGVuIGdsb2JhbFN0eWxlIGlzIG5vdCBkZWZpbmVkIGJlY2F1c2Ugd2hlbiB3ZSBoYXZlIGdsb2JhbFN0eWxlXG4gIC8vIHdlJ3JlIGdvaW5nIHRvIGJpbmQgdGhlIGNvbXB1dGVkIHZhbHVlcyBhbmQgbm90IHRoZSBvcmlnaW5hbCBhbmQgdGhpcyB3YXkgd2UgZG9uJ3QgYWRkIG91cnNlcmYgdG8gdGhlIGRlcGVuZGVuY3kgXG4gIC8vIHRyYWNraW5nIChzdWJzY3JpcHRpb25Db3VudClcbiAgLy8gTk9URSBiYXNlVGhyZXNob2xkIGlzIGFuIFwiZXhwcmVzc2lvblwiIGFuZCBub3QgYSBmaXhlZCBudW1iZXIsIHNvIHRoaXMgaXMgYSBjb25jYXRlbmF0aW9uXG4gIGlmICh0eXBlb2YgZ2xvYmFsU3R5bGVQcm9wID09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBiYXNlVGhyZXNob2xkICE9PSAndW5kZWZpbmVkJykgaWZTdWJzVGhyZXNob2xkICs9IGJhc2VUaHJlc2hvbGQ7XG5cbiAgaWYgKHR5cGVvZiBwcm9wICE9ICd1bmRlZmluZWQnICYmICEhdHJhY2tVc2FnZSkge1xuICAgIGh0bWwgKz0gJzwhLS0ga28gaWZTdWJzOiB7IGRhdGE6ICcgKyBpZlN1YnNQcm9wICsgJywgdGhyZXNob2xkOiAnICsgaWZTdWJzVGhyZXNob2xkICsgJywgZ3V0dGVyOiAnICsgaWZTdWJzR3V0dGVyICsgJyB9IC0tPic7XG4gIH1cblxuICBpZiAodHlwZW9mIHByb3AgIT0gJ3VuZGVmaW5lZCcgJiYgKG1vZGVsID09PSBudWxsIHx8IHR5cGVvZiBtb2RlbC5fbmFtZSA9PSAndW5kZWZpbmVkJykpIHtcbiAgICAvLyBUT0RPIHRocm93IGV4Y2VwdGlvbj9cbiAgICBjb25zb2xlLmxvZyhcIlRPRE8gV0FSTiBNaXNzaW5nIGxhYmVsIGZvciBwcm9wZXJ0eSBcIiwgcHJvcCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcm9wID09ICd1bmRlZmluZWQnICYmIG1vZGVsICE9PSBudWxsICYmIHR5cGVvZiBtb2RlbC5fbmFtZSA9PSAndW5kZWZpbmVkJykge1xuICAgIGNvbnNvbGUubG9nKFwiVE9ETyBXQVJOIE1pc3NpbmcgbGFiZWwgZm9yIG9iamVjdCBcIiwgbW9kZWwudHlwZSAvKiwgbW9kZWwgKi8gKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbW9kZWwgPT0gJ29iamVjdCcgJiYgbW9kZWwgIT09IG51bGwgJiYgdHlwZW9mIG1vZGVsLl93aWRnZXQgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB2YXIgcHJvcHMgPSBfZmlsdGVyUHJvcHMobW9kZWwsIGVkaXRUeXBlLCBsZXZlbCk7XG5cbiAgICB2YXIgaGFzQ3VzdG9tU3R5bGUgPSBlZGl0VHlwZSA9PSAnc3R5bGVyJyAmJiBtb2RlbCAhPT0gbnVsbCAmJiB0eXBlb2YgbW9kZWwuY3VzdG9tU3R5bGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBnbG9iYWxTdHlsZVByb3AgIT09ICd1bmRlZmluZWQnO1xuICAgIHZhciBzZWxlY3RlZEl0ZW1CaW5kaW5nID0gJyc7XG4gICAgdmFyIGFkZGl0aW9uYWxDbGFzc2VzID0gJyc7XG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0VHlwZSA9PSAnZWRpdCcpIHtcbiAgICAgIHNlbGVjdGVkSXRlbUJpbmRpbmcgPSAnLCBjbGljazogZnVuY3Rpb24ob2JqLCBldnQpIHsgJHJvb3Quc2VsZWN0SXRlbSgnICsgcHJvcCArICcsICRkYXRhKTsgcmV0dXJuIGZhbHNlIH0sIGNsaWNrQnViYmxlOiBmYWxzZSwgY3NzOiB7IHNlbGVjdGVkaXRlbTogJHJvb3QuaXNTZWxlY3RlZEl0ZW0oJyArIHByb3AgKyAnKSB9LCBzY3JvbGxJbnRvVmlldzogJHJvb3QuaXNTZWxlY3RlZEl0ZW0oJyArIHByb3AgKyAnKSwgJztcbiAgICAgIGFkZGl0aW9uYWxDbGFzc2VzICs9ICcgc2VsZWN0YWJsZSc7XG4gICAgfVxuICAgIGlmIChoYXNDdXN0b21TdHlsZSkge1xuICAgICAgYWRkaXRpb25hbENsYXNzZXMgKz0gJyBzdXBwb3J0c0N1c3RvbVN0eWxlcyc7XG4gICAgfVxuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJvYmpFZGl0IGxldmVsJyArIGxldmVsICsgYWRkaXRpb25hbENsYXNzZXMgKyAnXCIgZGF0YS1iaW5kPVwidG9vbHRpcHM6IHt9JyArIHNlbGVjdGVkSXRlbUJpbmRpbmcgKyAnXCI+JztcbiAgICB2YXIgbW9kZWxOYW1lID0gKG1vZGVsICE9PSBudWxsICYmIHR5cGVvZiBtb2RlbC5fbmFtZSAhPSAndW5kZWZpbmVkJyA/IG1vZGVsLl9uYW1lIDogKHR5cGVvZiBwcm9wICE9PSAndW5kZWZpbmVkJyA/ICdbJyArIHByb3AgKyAnXScgOiAnJykpO1xuICAgIGlmIChoYXNDdXN0b21TdHlsZSkge1xuICAgICAgdmFyIHRoZW1lU2VjdGlvbk5hbWUgPSAnU3RpbGUnO1xuICAgICAgaWYgKHR5cGVvZiB0aGVtZU1vZGVsICE9PSAndW5kZWZpbmVkJyAmJiB0aGVtZU1vZGVsICE9PSBudWxsICYmIHR5cGVvZiB0aGVtZU1vZGVsLl9uYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aGVtZVNlY3Rpb25OYW1lID0gdGhlbWVNb2RlbC5fbmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiVE9ETyBtaXNzaW5nIGxhYmVsIGZvciB0aGVtZSBzZWN0aW9uIFwiLCBwcm9wLCBtb2RlbCAhPT0gbnVsbCA/IG1vZGVsLnR5cGUgOiAnLScpO1xuICAgICAgfVxuXG4gICAgICBtb2RlbE5hbWUgPSAnPHNwYW4gY2xhc3M9XCJibG9ja1NlbGVjdGlvbk1ldGhvZFwiIGRhdGEtYmluZD1cInRleHQ6IGN1c3RvbVN0eWxlKCkgPyAkcm9vdC51dChcXCd0ZW1wbGF0ZVxcJywgXFwnJyArIHV0aWxzLmFkZFNsYXNoZXMobW9kZWxOYW1lKSArICdcXCcpIDogJHJvb3QudXQoXFwndGVtcGxhdGVcXCcsIFxcJycgKyB1dGlscy5hZGRTbGFzaGVzKHRoZW1lU2VjdGlvbk5hbWUpICsgJ1xcJylcIj5CbG9jazwvc3Bhbj4nO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb2RlbE5hbWUgPSAnPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogJHJvb3QudXQoXFwndGVtcGxhdGVcXCcsIFxcJycgKyB1dGlscy5hZGRTbGFzaGVzKG1vZGVsTmFtZSkgKyAnXFwnKVwiPicgKyBtb2RlbE5hbWUgKyAnPC9zcGFuPic7XG4gICAgfVxuICAgIHRpdGxlID0gbW9kZWwgIT09IG51bGwgJiYgdHlwZW9mIG1vZGVsLl9oZWxwICE9PSAndW5kZWZpbmVkJyA/ICcgdGl0bGU9XCInICsgdXRpbHMuYWRkU2xhc2hlcyhtb2RlbC5faGVscCkgKyAnXCIgZGF0YS1iaW5kPVwiYXR0cjogeyB0aXRsZTogJHJvb3QudXQoXFwndGVtcGxhdGVcXCcsIFxcJycgKyB1dGlscy5hZGRTbGFzaGVzKG1vZGVsLl9oZWxwKSArICdcXCcpIH1cIicgOiAnJztcbiAgICBodG1sICs9ICc8c3BhbicgKyB0aXRsZSArICcgY2xhc3M9XCJvYmpMYWJlbCBsZXZlbCcgKyBsZXZlbCArICdcIj4nICsgbW9kZWxOYW1lICsgJzwvc3Bhbj4nO1xuXG4gICAgaWYgKGVkaXRUeXBlID09ICdlZGl0JyAmJiB0eXBlb2YgbW9kZWwuX2Jsb2NrRGVzY3JpcHRpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYmxvY2tEZXNjcmlwdGlvblwiIGRhdGEtYmluZD1cImh0bWw6ICRyb290LnV0KFxcJ3RlbXBsYXRlXFwnLCBcXCcnICsgdXRpbHMuYWRkU2xhc2hlcyhtb2RlbC5fYmxvY2tEZXNjcmlwdGlvbikgKyAnXFwnKVwiPicgKyBtb2RlbC5fYmxvY2tEZXNjcmlwdGlvbiArICc8L2Rpdj4nO1xuICAgIH1cblxuICAgIC8qIENVU1RPTSBTVFlMRSAqL1xuICAgIGlmIChoYXNDdXN0b21TdHlsZSkge1xuICAgICAgaHRtbCArPSAnPGxhYmVsIGNsYXNzPVwiZGF0YS1ib29sZWFuIGJsb2NrQ2hlY2tcIiBkYXRhLWJpbmQ9XCJ0b29sdGlwczogeyB9XCI+JztcbiAgICAgIGh0bWwgKz0gJzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiB2YWx1ZT1cIm5vdGhpbmdcIiBkYXRhLWJpbmQ9XCJmb2N1c2FibGU6IHRydWUsIGNoZWNrZWQ6IGN1c3RvbVN0eWxlXCIgLz4nO1xuICAgICAgaHRtbCArPSAnPHNwYW4gdGl0bGU9XCJTd2l0Y2ggYmV0d2VlbiBnbG9iYWwgYW5kIGJsb2NrIGxldmVsIHN0eWxlcyBlZGl0aW5nXCIgZGF0YS1iaW5kPVwiYXR0cjogeyB0aXRsZTogJHJvb3QudChcXCdTd2l0Y2ggYmV0d2VlbiBnbG9iYWwgYW5kIGJsb2NrIGxldmVsIHN0eWxlcyBlZGl0aW5nXFwnKSB9XCIgY2xhc3M9XCJjaGVja2JveC1yZXBsYWNlciBjaGVja2JveC1yZXBsYWNlci1vbm9mZlwiPjwvc3Bhbj4nOyAvLyAgZGF0YS1iaW5kPVwidG9vbHRpcDogeyBjb250ZW50OiBcXCdwZXJzb25hbGl6emEgdHV0dGlcXCcgfVwiXG4gICAgICBodG1sICs9ICc8L2xhYmVsPic7XG4gICAgICBodG1sICs9ICc8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6IFxcJ2N1c3RvbXN0eWxlXFwnLCBpZjogY3VzdG9tU3R5bGUgfSAtLT48IS0tIC9rbyAtLT4nO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJvcCAhPSAndW5kZWZpbmVkJykge1xuICAgICAgaHRtbCArPSAnPCEtLSBrbyB3aXRoOiAnICsgcHJvcCArICcgLS0+JztcblxuICAgICAgLyogUFJFVklFVyAqL1xuICAgICAgaWYgKGxldmVsID09IDEgJiYgdHlwZW9mIHByb3AgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtb2RlbC5fcHJldmlld0JpbmRpbmdzICE9ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aXRoQmluZGluZ1Byb3ZpZGVyICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByb290UHJldmlld0JpbmRpbmcgIT0gJ3VuZGVmaW5lZCcpIGh0bWwgKz0gJzwhLS0ga28gd2l0aDogJHJvb3QuY29udGVudCgpIC0tPjxkaXYgY2xhc3M9XCJvYmpQcmV2aWV3XCIgZGF0YS1iaW5kPVwiJyArIHJvb3RQcmV2aWV3QmluZGluZyArICdcIj48L2Rpdj48IS0tIC9rbyAtLT4nO1xuICAgICAgICAgIGlmICh0eXBlb2YgcHJldmlld0JhY2tncm91bmQgIT0gJ3VuZGVmaW5lZCcpIGh0bWwgKz0gJzwhLS0ga28gd2l0aDogJHBhcmVudCAtLT48ZGl2IGNsYXNzPVwib2JqUHJldmlld1wiIGRhdGEtYmluZD1cIicgKyBwcmV2aWV3QmFja2dyb3VuZCArICdcIj48L2Rpdj48IS0tIC9rbyAtLT4nO1xuICAgICAgICAgIHZhciBwcmV2aWV3QmluZGluZ3MgPSBlbGFib3JhdGVEZWNsYXJhdGlvbnModW5kZWZpbmVkLCBtb2RlbC5fcHJldmlld0JpbmRpbmdzLCB0ZW1wbGF0ZVVybENvbnZlcnRlciwgd2l0aEJpbmRpbmdQcm92aWRlci5iaW5kKHRoaXMsIHBhdGggKyAnLicpKTtcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwib2JqUHJldmlld1wiPjxkaXYgY2xhc3M9XCJvYmpQcmV2aWV3SW5uZXJcIiBkYXRhLWJpbmQ9XCInICsgcHJldmlld0JpbmRpbmdzICsgJ1wiPjwvZGl2PjwvZGl2Pic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBQUkVWSUVXICovXG4gICAgdmFyIHByZXZpZXdCRztcbiAgICBpZiAobGV2ZWwgPT09IDApIHtcbiAgICAgIGlmICh0eXBlb2YgbW9kZWwuX3ByZXZpZXdCaW5kaW5ncyAhPSAndW5kZWZpbmVkJykge1xuICAgICAgICBwcmV2aWV3QkcgPSBlbGFib3JhdGVEZWNsYXJhdGlvbnModW5kZWZpbmVkLCBtb2RlbC5fcHJldmlld0JpbmRpbmdzLCB0ZW1wbGF0ZVVybENvbnZlcnRlciwgd2l0aEJpbmRpbmdQcm92aWRlci5iaW5kKHRoaXMsIHBhdGgubGVuZ3RoID4gMCA/IHBhdGggKyAnLicgOiAnJykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBpLCBuZXdQYXRoO1xuXG4gICAgdmFyIGJlZm9yZSA9IGh0bWwubGVuZ3RoO1xuXG4gICAgdmFyIG5ld1RoZW1lTW9kZWw7XG4gICAgdmFyIG5ld0dsb2JhbFN0eWxlUHJvcDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgbmV3UGF0aCA9IHBhdGgubGVuZ3RoID4gMCA/IHBhdGggKyBcIi5cIiArIHByb3BzW2ldIDogcHJvcHNbaV07XG4gICAgICBpZiAodHlwZW9mIG1vZGVsW3Byb3BzW2ldXSAhPSAnb2JqZWN0JyB8fCBtb2RlbFtwcm9wc1tpXV0gPT09IG51bGwgfHwgdHlwZW9mIG1vZGVsW3Byb3BzW2ldXS5fd2lkZ2V0ICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG5ld0dsb2JhbFN0eWxlUHJvcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGxldmVsID09PSAwICYmIHByb3BzW2ldID09ICd0aGVtZScpXG4gICAgICAgICAgaHRtbCArPSBfcHJvcEVkaXRvcih3aXRoQmluZGluZ1Byb3ZpZGVyLCB3aWRnZXRzLCB0ZW1wbGF0ZVVybENvbnZlcnRlciwgbW9kZWxbcHJvcHNbaV1dLCBuZXdUaGVtZU1vZGVsLCBuZXdQYXRoLCBwcm9wc1tpXSwgZWRpdFR5cGUsIDAsIGJhc2VUaHJlc2hvbGQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cmFja1VzYWdlLCByb290UHJldmlld0JpbmRpbmcpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBuZXdHbG9iYWxTdHlsZVByb3AgPSBfZ2V0R2xvYmFsU3R5bGVQcm9wKGdsb2JhbFN0eWxlcywgbW9kZWxbcHJvcHNbaV1dLCBwcm9wc1tpXSwgbmV3UGF0aCk7XG4gICAgICAgICAgaHRtbCArPSBfcHJvcEVkaXRvcih3aXRoQmluZGluZ1Byb3ZpZGVyLCB3aWRnZXRzLCB0ZW1wbGF0ZVVybENvbnZlcnRlciwgbW9kZWxbcHJvcHNbaV1dLCBuZXdUaGVtZU1vZGVsLCBuZXdQYXRoLCBwcm9wc1tpXSwgZWRpdFR5cGUsIGxldmVsICsgMSwgYmFzZVRocmVzaG9sZCwgZ2xvYmFsU3R5bGVzLCBuZXdHbG9iYWxTdHlsZVByb3AsIHRyYWNrVXNhZ2UsIHJvb3RQcmV2aWV3QmluZGluZywgcHJldmlld0JHKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5ld1BhdGggPSBwYXRoLmxlbmd0aCA+IDAgPyBwYXRoICsgXCIuXCIgKyBwcm9wc1tpXSA6IHByb3BzW2ldO1xuICAgICAgaWYgKCEodHlwZW9mIG1vZGVsW3Byb3BzW2ldXSAhPSAnb2JqZWN0JyB8fCBtb2RlbFtwcm9wc1tpXV0gPT09IG51bGwgfHwgdHlwZW9mIG1vZGVsW3Byb3BzW2ldXS5fd2lkZ2V0ICE9ICd1bmRlZmluZWQnKSkge1xuICAgICAgICBuZXdHbG9iYWxTdHlsZVByb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChsZXZlbCA9PT0gMCAmJiBwcm9wc1tpXSA9PSAndGhlbWUnKVxuICAgICAgICAgIGh0bWwgKz0gX3Byb3BFZGl0b3Iod2l0aEJpbmRpbmdQcm92aWRlciwgd2lkZ2V0cywgdGVtcGxhdGVVcmxDb252ZXJ0ZXIsIG1vZGVsW3Byb3BzW2ldXSwgbmV3VGhlbWVNb2RlbCwgbmV3UGF0aCwgcHJvcHNbaV0sIGVkaXRUeXBlLCAwLCBiYXNlVGhyZXNob2xkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJhY2tVc2FnZSwgcm9vdFByZXZpZXdCaW5kaW5nKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgbmV3R2xvYmFsU3R5bGVQcm9wID0gX2dldEdsb2JhbFN0eWxlUHJvcChnbG9iYWxTdHlsZXMsIG1vZGVsW3Byb3BzW2ldXSwgcHJvcHNbaV0sIG5ld1BhdGgpO1xuICAgICAgICAgIGh0bWwgKz0gX3Byb3BFZGl0b3Iod2l0aEJpbmRpbmdQcm92aWRlciwgd2lkZ2V0cywgdGVtcGxhdGVVcmxDb252ZXJ0ZXIsIG1vZGVsW3Byb3BzW2ldXSwgbmV3VGhlbWVNb2RlbCwgbmV3UGF0aCwgcHJvcHNbaV0sIGVkaXRUeXBlLCBsZXZlbCArIDEsIGJhc2VUaHJlc2hvbGQsIGdsb2JhbFN0eWxlcywgbmV3R2xvYmFsU3R5bGVQcm9wLCB0cmFja1VzYWdlLCByb290UHJldmlld0JpbmRpbmcsIHByZXZpZXdCRyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYWRkZWQgPSBodG1sLmxlbmd0aCAtIGJlZm9yZTtcbiAgICBpZiAoYWRkZWQgPT09IDApIHtcbiAgICAgIC8vIE5vIGVkaXRhYmxlIGNvbnRlbnQ6IGlmIHRoaXMgaXMgaW4gY29udGV4dCBcInRlbXBsYXRlXCIgd2UgbGVhdmUgaXQgZW1wdHksIG90aGVyd2lzZSB3ZSBzaG93IGFuIGhlbHAuXG4gICAgICBpZiAodHlwZW9mIG1vZGVsID09ICdvYmplY3QnICYmIG1vZGVsICE9PSBudWxsICYmIG1vZGVsLl9jb250ZXh0ID09ICd0ZW1wbGF0ZScpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETyBtb3ZlIG1lIHRvIGEgdG1wbD9cbiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cIm9iakVtcHR5XCIgZGF0YS1iaW5kPVwiaHRtbDogJHJvb3QudChcXCdTZWxlY3RlZCBlbGVtZW50IGhhcyBubyBlZGl0YWJsZSBwcm9wZXJ0aWVzXFwnKVwiPlNlbGVjdGVkIGVsZW1lbnQgaGFzIG5vIGVkaXRhYmxlIHByb3BlcnRpZXM8L2Rpdj4nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJvcCAhPSAndW5kZWZpbmVkJykge1xuICAgICAgaHRtbCArPSAnPCEtLSAva28gLS0+JztcbiAgICB9XG4gICAgaHRtbCArPSAnPC9kaXY+JztcblxuICB9IGVsc2Uge1xuICAgIHZhciBjaGVja2JveGVzID0gdHJ1ZTtcblxuICAgIGlmICh0eXBlb2YgZ2xvYmFsU3R5bGVzID09ICd1bmRlZmluZWQnKSBjaGVja2JveGVzID0gZmFsc2U7XG5cbiAgICBpZiAobW9kZWwgPT09IG51bGwgfHwgdHlwZW9mIG1vZGVsICE9ICdvYmplY3QnIHx8IHR5cGVvZiBtb2RlbC5fd2lkZ2V0ICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgYmluZGluZ3MgPSBbXTtcblxuICAgICAgaWYgKHR5cGVvZiBnbG9iYWxTdHlsZVByb3AgIT0gJ3VuZGVmaW5lZCcpIGJpbmRpbmdzLnB1c2goJ2NzczogeyBub3RudWxsOiAnICsgcHJvcCArICcoKSAhPT0gbnVsbCB9Jyk7XG4gICAgICB0aXRsZSA9IG1vZGVsICE9PSBudWxsICYmIHR5cGVvZiBtb2RlbC5faGVscCAhPT0gJ3VuZGVmaW5lZCcgPyAnIHRpdGxlPVwiJyArIHV0aWxzLmFkZFNsYXNoZXMobW9kZWwuX2hlbHApICsgJ1wiIGRhdGEtYmluZD1cImF0dHI6IHsgdGl0bGU6ICRyb290LnV0KFxcJ3RlbXBsYXRlXFwnLCBcXCcnICsgdXRpbHMuYWRkU2xhc2hlcyhtb2RlbC5faGVscCkgKyAnXFwnKSB9XCInIDogJyc7XG4gICAgICBpZiAodGl0bGUubGVuZ3RoID4gMCkgYmluZGluZ3MucHVzaCgndG9vbHRpcHM6IHt9Jyk7XG4gICAgICB2YXIgYmluZCA9IGJpbmRpbmdzLmxlbmd0aCA+IDAgPyAnZGF0YS1iaW5kPVwiJyArIHV0aWxzLmFkZFNsYXNoZXMoYmluZGluZ3Muam9pbigpKSArICdcIicgOiAnJztcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJwcm9wRWRpdG9yICcgKyAoY2hlY2tib3hlcyA/ICdjaGVja2JveGVzJyA6ICcnKSArICdcIicgKyBiaW5kICsgJz4nO1xuXG4gICAgICB2YXIgbW9kZWxOYW1lMiA9IChtb2RlbCAhPT0gbnVsbCAmJiB0eXBlb2YgbW9kZWwuX25hbWUgIT0gJ3VuZGVmaW5lZCcgPyBtb2RlbC5fbmFtZSA6ICh0eXBlb2YgcHJvcCAhPT0gJ3VuZGVmaW5lZCcgPyAnWycgKyBwcm9wICsgJ10nIDogJycpKTtcbiAgICAgIG1vZGVsTmFtZTIgPSAnPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogJHJvb3QudXQoXFwndGVtcGxhdGVcXCcsIFxcJycgKyB1dGlscy5hZGRTbGFzaGVzKG1vZGVsTmFtZTIpICsgJ1xcJylcIj4nICsgbW9kZWxOYW1lMiArICc8L3NwYW4+JztcbiAgICAgIGh0bWwgKz0gJzxzcGFuJyArIHRpdGxlICsgJyBjbGFzcz1cInByb3BMYWJlbFwiPicgKyBtb2RlbE5hbWUyICsgJzwvc3Bhbj4nO1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInByb3BJbnB1dCAnICsgKHR5cGVvZiBnbG9iYWxTdHlsZXMgIT0gJ3VuZGVmaW5lZCcgPyAnbG9jYWwnIDogJycpICsgJ1wiIGRhdGEtYmluZD1cImNzczogeyBkZWZhdWx0OiAnICsgcHJvcCArICcoKSA9PT0gbnVsbCB9XCI+JztcbiAgICAgIGh0bWwgKz0gX3Byb3BJbnB1dChtb2RlbCwgcHJvcCwgcHJvcEFjY2Vzc29yLCBlZGl0VHlwZSwgd2lkZ2V0cyk7XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgaWYgKHR5cGVvZiBnbG9iYWxTdHlsZVByb3AgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInByb3BJbnB1dCBnbG9iYWxcIiBkYXRhLWJpbmQ9XCJjc3M6IHsgb3ZlcnJpZGRlbjogJyArIHByb3AgKyAnKCkgIT09IG51bGwgfVwiPic7XG4gICAgICAgIGh0bWwgKz0gX3Byb3BJbnB1dChtb2RlbCwgcHJvcCwgZ2xvYmFsU3R5bGVQcm9wLCBlZGl0VHlwZSwgd2lkZ2V0cyk7XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgICAgICAgaWYgKGNoZWNrYm94ZXMpIHtcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwicHJvcENoZWNrXCI+PGxhYmVsIGRhdGEtYmluZD1cInRvb2x0aXBzOiB7fVwiPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJmb2N1c2FibGU6IHRydWUsIGNsaWNrOiBmdW5jdGlvbihldnQsIG9iaikgeyAkcm9vdC5sb2NhbEdsb2JhbFN3aXRjaCgnICsgcHJvcCArICcsICcgKyBnbG9iYWxTdHlsZVByb3AgKyAnKTsgcmV0dXJuIHRydWU7IH0sIGNoZWNrZWQ6ICcgKyBwcm9wICsgJygpICE9PSBudWxsXCI+JztcbiAgICAgICAgICBodG1sICs9ICc8c3BhbiBjbGFzcz1cImNoZWNrYm94LXJlcGxhY2VyXCIgZGF0YS1iaW5kPVwiY3NzOiB7IGNoZWNrZWQ6ICcgKyBwcm9wICsgJygpICE9PSBudWxsIH0sIGF0dHI6IHsgdGl0bGU6ICRyb290LnQoXFwnVGhpcyBzdHlsZSBpcyBzcGVjaWZpYyBmb3IgdGhpcyBibG9jazogY2xpY2sgaGVyZSB0byByZW1vdmUgdGhlIGN1c3RvbSBzdHlsZSBhbmQgcmV2ZXJ0IHRvIHRoZSB0aGVtZSB2YWx1ZVxcJykgfVwiPjwvc3Bhbj4nO1xuICAgICAgICAgIGh0bWwgKz0gJzwvbGFiZWw+PC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICB9IGVsc2UgaWYgKG1vZGVsID09PSBudWxsIHx8IHR5cGVvZiBtb2RlbCAhPSAnb2JqZWN0Jykge1xuICAgICAgLy8gVE9ETyByZW1vdmUgZGVidWcgb3V0cHV0XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwicHJvcEVkaXRvciB1bmtub3duXCI+W0F8JyArIHByb3AgKyBcInxcIiArIHR5cGVvZiBtb2RlbCArICddPC9kaXY+JztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyByZW1vdmUgZGVidWcgb3V0cHV0XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwicHJvcEVkaXRvciB1bmtub3duXCI+W0J8JyArIHByb3AgKyBcInxcIiArIHR5cGVvZiBtb2RlbCArICddPC9kaXY+JztcbiAgICB9XG5cblxuICB9XG5cbiAgaWYgKHR5cGVvZiBwcm9wICE9ICd1bmRlZmluZWQnICYmICEhdHJhY2tVc2FnZSkge1xuICAgIGh0bWwgKz0gJzwhLS0gL2tvIC0tPic7XG4gICAgaHRtbCArPSAnPCEtLSBrbyBpZlN1YnM6IHsgbm90OiB0cnVlLCBkYXRhOiAnICsgaWZTdWJzUHJvcCArICcsIHRocmVzaG9sZDogJyArIGlmU3Vic1RocmVzaG9sZCArICcsIGd1dHRlcjogMCB9IC0tPic7XG4gICAgaHRtbCArPSAnPHNwYW4gY2xhc3M9XCJsYWJlbCBub3R1c2VkXCI+KCcgKyBwcm9wICsgJyk8L3NwYW4+JztcbiAgICBodG1sICs9ICc8IS0tIC9rbyAtLT4nO1xuICB9XG5cbiAgcmV0dXJuIGh0bWw7XG59O1xuXG5cbnZhciBjcmVhdGVCbG9ja0VkaXRvciA9IGZ1bmN0aW9uKGRlZnMsIHdpZGdldHMsIHRoZW1lVXBkYXRlciwgdGVtcGxhdGVVcmxDb252ZXJ0ZXIsIHJvb3RNb2RlbE5hbWUsIHRlbXBsYXRlTmFtZSwgZWRpdFR5cGUsIHRlbXBsYXRlQ3JlYXRvciwgYmFzZVRocmVzaG9sZCwgdHJhY2tHbG9iYWxTdHlsZXMsIHRyYWNrVXNhZ2UsIGZyb21MZXZlbCkge1xuICBpZiAodHlwZW9mIHRyYWNrVXNhZ2UgPT0gJ3VuZGVmaW5lZCcpIHRyYWNrVXNhZ2UgPSB0cnVlO1xuICB2YXIgbW9kZWwgPSBtb2RlbERlZi5nZXREZWYoZGVmcywgdGVtcGxhdGVOYW1lKTtcblxuICB2YXIgcm9vdE1vZGVsID0gbW9kZWxEZWYuZ2V0RGVmKGRlZnMsIHJvb3RNb2RlbE5hbWUpO1xuICB2YXIgcm9vdFByZXZpZXdCaW5kaW5ncztcbiAgaWYgKHR5cGVvZiByb290TW9kZWwuX3ByZXZpZXdCaW5kaW5ncyAhPSAndW5kZWZpbmVkJyAmJiB0ZW1wbGF0ZU5hbWUgIT0gJ3RoYWVtZScgJiYgZWRpdFR5cGUgPT0gJ3N0eWxlcicpIHtcbiAgICByb290UHJldmlld0JpbmRpbmdzID0gZWxhYm9yYXRlRGVjbGFyYXRpb25zKHVuZGVmaW5lZCwgcm9vdE1vZGVsLl9wcmV2aWV3QmluZGluZ3MsIHRlbXBsYXRlVXJsQ29udmVydGVyLCBtb2RlbERlZi5nZXRCaW5kVmFsdWUuYmluZCh1bmRlZmluZWQsIGRlZnMsIHRoZW1lVXBkYXRlciwgcm9vdE1vZGVsTmFtZSwgcm9vdE1vZGVsTmFtZSwgJycpKTtcbiAgfVxuXG4gIHZhciBnbG9iYWxTdHlsZXMgPSB0eXBlb2YgdHJhY2tHbG9iYWxTdHlsZXMgIT0gJ3VuZGVmaW5lZCcgJiYgdHJhY2tHbG9iYWxTdHlsZXMgPyBkZWZzW3RlbXBsYXRlTmFtZV0uX2dsb2JhbFN0eWxlcyA6IHVuZGVmaW5lZDtcbiAgdmFyIGdsb2JhbFN0eWxlUHJvcCA9IHR5cGVvZiB0cmFja0dsb2JhbFN0eWxlcyAhPSAndW5kZWZpbmVkJyAmJiB0cmFja0dsb2JhbFN0eWxlcyA/IGRlZnNbdGVtcGxhdGVOYW1lXS5fZ2xvYmFsU3R5bGUgOiB1bmRlZmluZWQ7XG5cblxuICB2YXIgdGhlbWVNb2RlbDtcbiAgaWYgKHR5cGVvZiBnbG9iYWxTdHlsZVByb3AgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIG1tID0gbW9kZWxEZWYuZ2V0RGVmKGRlZnMsICd0aGVtZScpO1xuICAgIC8vIFRPRE8gcmVtb3ZlIGRlcHJlY2F0ZWQgJHRoZW1lXG4gICAgdGhlbWVNb2RlbCA9IG1tW2dsb2JhbFN0eWxlUHJvcC5yZXBsYWNlKC9eKFxcJHRoZW1lfF90aGVtZV8pXFwuLywgJycpXTtcbiAgfVxuXG5cbiAgdmFyIHdpdGhCaW5kaW5nUHJvdmlkZXIgPSBtb2RlbERlZi5nZXRCaW5kVmFsdWUuYmluZCh1bmRlZmluZWQsIGRlZnMsIHRoZW1lVXBkYXRlciwgcm9vdE1vZGVsTmFtZSwgdGVtcGxhdGVOYW1lKTtcbiAgd2l0aEJpbmRpbmdQcm92aWRlci5fdGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lO1xuXG4gIHZhciBodG1sID0gJzxkaXYgY2xhc3M9XCJlZGl0b3JcIj4nO1xuICBodG1sICs9IFwiPGRpdiBjbGFzcz1cXFwiYmxvY2tUeXBlXCIgKyAodHlwZW9mIGdsb2JhbFN0eWxlcyAhPSAndW5kZWZpbmVkJyA/IFwiIHdpdGhkZWZhdWx0c1wiIDogXCJcIikgKyBcIlxcXCI+XCIgKyBtb2RlbC50eXBlICsgXCI8L2Rpdj5cIjtcblxuICB2YXIgZWRpdG9yQ29udGVudCA9IF9wcm9wRWRpdG9yKHdpdGhCaW5kaW5nUHJvdmlkZXIsIHdpZGdldHMsIHRlbXBsYXRlVXJsQ29udmVydGVyLCBtb2RlbCwgdGhlbWVNb2RlbCwgXCJcIiwgdW5kZWZpbmVkLCBlZGl0VHlwZSwgZnJvbUxldmVsLCBiYXNlVGhyZXNob2xkLCBnbG9iYWxTdHlsZXMsIGdsb2JhbFN0eWxlUHJvcCwgdHJhY2tVc2FnZSwgcm9vdFByZXZpZXdCaW5kaW5ncyk7XG4gIGlmIChlZGl0b3JDb250ZW50Lmxlbmd0aCA+IDApIHtcbiAgICBodG1sICs9IGVkaXRvckNvbnRlbnQ7XG4gIH1cblxuICBodG1sICs9ICc8L2Rpdj4nO1xuXG4gIHRlbXBsYXRlQ3JlYXRvcihodG1sLCB0ZW1wbGF0ZU5hbWUsIGVkaXRUeXBlKTtcbn07XG5cbnZhciBjcmVhdGVCbG9ja0VkaXRvcnMgPSBmdW5jdGlvbihkZWZzLCB3aWRnZXRzLCB0aGVtZVVwZGF0ZXIsIHRlbXBsYXRlVXJsQ29udmVydGVyLCByb290TW9kZWxOYW1lLCB0ZW1wbGF0ZU5hbWUsIHRlbXBsYXRlQ3JlYXRvciwgYmFzZVRocmVzaG9sZCkge1xuICBjcmVhdGVCbG9ja0VkaXRvcihkZWZzLCB3aWRnZXRzLCB0aGVtZVVwZGF0ZXIsIHRlbXBsYXRlVXJsQ29udmVydGVyLCByb290TW9kZWxOYW1lLCB0ZW1wbGF0ZU5hbWUsICdlZGl0JywgdGVtcGxhdGVDcmVhdG9yLCBiYXNlVGhyZXNob2xkKTtcbiAgY3JlYXRlQmxvY2tFZGl0b3IoZGVmcywgd2lkZ2V0cywgdGhlbWVVcGRhdGVyLCB0ZW1wbGF0ZVVybENvbnZlcnRlciwgcm9vdE1vZGVsTmFtZSwgdGVtcGxhdGVOYW1lLCAnc3R5bGVyJywgdGVtcGxhdGVDcmVhdG9yLCBiYXNlVGhyZXNob2xkLCB0cnVlKTtcbn07XG5cbnZhciBnZW5lcmF0ZUVkaXRvcnMgPSBmdW5jdGlvbih0ZW1wbGF0ZURlZiwgd2lkZ2V0cywgdGVtcGxhdGVVcmxDb252ZXJ0ZXIsIHRlbXBsYXRlQ3JlYXRvciwgYmFzZVRocmVzaG9sZCkge1xuICB2YXIgZGVmcyA9IHRlbXBsYXRlRGVmLl9kZWZzO1xuICB2YXIgdGVtcGxhdGVOYW1lID0gdGVtcGxhdGVEZWYudGVtcGxhdGVOYW1lO1xuICB2YXIgYmxvY2tzID0gdGVtcGxhdGVEZWYuX2Jsb2NrcztcbiAgdmFyIGlkeDtcbiAgdmFyIGJsb2NrRGVmcyA9IFtdO1xuICBmb3IgKGlkeCA9IDA7IGlkeCA8IGJsb2Nrcy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgaWYgKHR5cGVvZiBibG9ja3NbaWR4XS5jb250YWluZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBibG9ja0RlZnMucHVzaChtb2RlbERlZi5nZW5lcmF0ZU1vZGVsKGRlZnMsIGJsb2Nrc1tpZHhdLmJsb2NrKSk7XG4gICAgfVxuICAgIGNyZWF0ZUJsb2NrRWRpdG9ycyhkZWZzLCB3aWRnZXRzLCB1bmRlZmluZWQsIHRlbXBsYXRlVXJsQ29udmVydGVyLCBibG9ja3NbaWR4XS5yb290LCBibG9ja3NbaWR4XS5ibG9jaywgdGVtcGxhdGVDcmVhdG9yLCBiYXNlVGhyZXNob2xkKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZGVmc1sndGhlbWUnXSAhPSAndW5kZWZpbmVkJykgY3JlYXRlQmxvY2tFZGl0b3IoZGVmcywgd2lkZ2V0cywgdW5kZWZpbmVkLCB0ZW1wbGF0ZVVybENvbnZlcnRlciwgdGVtcGxhdGVOYW1lLCAndGhlbWUnLCAnc3R5bGVyJywgdGVtcGxhdGVDcmVhdG9yLCB1bmRlZmluZWQsIGZhbHNlLCBmYWxzZSwgLTEpO1xuICByZXR1cm4gYmxvY2tEZWZzO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZW5lcmF0ZUVkaXRvcnM7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qIGdsb2JhbCBnbG9iYWw6IGZhbHNlICovXG5cbnZhciBtb2RlbERlZiA9IHJlcXVpcmUoXCIuL21vZGVsLmpzXCIpO1xuXG52YXIgd3JhcHBlZFJlc3VsdE1vZGVsID0gZnVuY3Rpb24odGVtcGxhdGVEZWYpIHtcbiAgdmFyIGRlZnMgPSB0ZW1wbGF0ZURlZi5fZGVmcztcbiAgdmFyIHRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlRGVmLnRlbXBsYXRlTmFtZTtcbiAgdmFyIGZpbmFsTW9kZWxDb250ZW50RGVmID0gbW9kZWxEZWYuZ2V0RGVmKGRlZnMsIHRlbXBsYXRlTmFtZSk7XG5cbiAgdmFyIGZpbmFsTW9kZWxDb250ZW50ID0gbW9kZWxEZWYuZ2VuZXJhdGVSZXN1bHRNb2RlbCh0ZW1wbGF0ZURlZik7XG5cbiAgdmFyIHdyYXBwZXIgPSByZXF1aXJlKFwiLi93cmFwcGVyLmpzXCIpO1xuICB2YXIgcmVzID0gd3JhcHBlcihmaW5hbE1vZGVsQ29udGVudCwgZmluYWxNb2RlbENvbnRlbnREZWYsIGRlZnMpO1xuXG4gIHJldHVybiByZXM7XG59O1xuXG4vLyByZXF1aXJlcyBvbmx5IHdoZW4gaW1wb3J0ZWRcbnZhciB0cmFuc2xhdGVUZW1wbGF0ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgdHQgPSByZXF1aXJlKCcuL3BhcnNlci5qcycpO1xuICByZXR1cm4gdHQuYXBwbHkodHQsIGFyZ3VtZW50cyk7XG59O1xuXG4vLyByZXF1aXJlcyBvbmx5IHdoZW4gaW1wb3J0ZWRcbnZhciBnZW5lcmF0ZUVkaXRvcnMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGdlID0gcmVxdWlyZSgnLi9lZGl0b3IuanMnKTtcbiAgcmV0dXJuIGdlLmFwcGx5KGdlLCBhcmd1bWVudHMpO1xufTtcblxudmFyIGNoZWNrTW9kZWwgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNtID0gcmVxdWlyZSgnLi9jaGVja21vZGVsLmpzJyk7XG4gIHJldHVybiBjbS5hcHBseShjbSwgYXJndW1lbnRzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB0cmFuc2xhdGVUZW1wbGF0ZTogdHJhbnNsYXRlVGVtcGxhdGUsXG4gIHdyYXBwZWRSZXN1bHRNb2RlbDogd3JhcHBlZFJlc3VsdE1vZGVsLFxuICBnZW5lcmF0ZVJlc3VsdE1vZGVsOiBtb2RlbERlZi5nZW5lcmF0ZVJlc3VsdE1vZGVsLFxuICBnZW5lcmF0ZUVkaXRvcnM6IGdlbmVyYXRlRWRpdG9ycyxcbiAgY2hlY2tNb2RlbDogY2hlY2tNb2RlbFxufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIG9iakV4dGVuZCA9IHJlcXVpcmUoXCIuL2RvbXV0aWxzLmpzXCIpLm9iakV4dGVuZDtcbnZhciBjb25zb2xlID0gcmVxdWlyZShcImNvbnNvbGVcIik7XG5cbnZhciBfdmFsdWVTZXQgPSBmdW5jdGlvbihkZWZzLCBtb2RlbCwgcHJvcCwgdmFsdWUpIHtcbiAgdmFyIGRvdFBvcyA9IHByb3AuaW5kZXhPZignLicpO1xuICBpZiAoZG90UG9zID09IC0xKSB7XG4gICAgaWYgKHR5cGVvZiBtb2RlbFtwcm9wXSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5sb2coXCJVbmRlZmluZWQgcHJvcCBcIiArIHByb3AgKyBcIiB3aGlsZSBzZXR0aW5nIHZhbHVlIFwiICsgdmFsdWUgKyBcIiBpbiBtb2RlbC5fdmFsdWVTZXRcIik7XG4gICAgfSBlbHNlIGlmIChtb2RlbFtwcm9wXSA9PT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUucHVzaCA9PSAndW5kZWZpbmVkJykgY29uc29sZS5sb2coXCJudWxscHJvcG9iamVjdHZhbHVlXCIsIHByb3AsIHZhbHVlKTtcbiAgICAgIG1vZGVsW3Byb3BdID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kZWxbcHJvcF0gPT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZGVsW3Byb3BdLnB1c2ggPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHZhbHVlcztcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhciB2YWx1ZXNTdHJpbmcgPSB2YWx1ZS5tYXRjaCgvXlxcWyguKilcXF0kLyk7XG4gICAgICAgIGlmICh2YWx1ZXNTdHJpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXNTdHJpbmdbMV0uc3BsaXQoJywnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBcIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSBmb3IgYXJyYXkgcHJvcGVydHkgXCIgKyBwcm9wICsgXCI6IFwiICsgdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUucHVzaCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBcIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSBmb3IgYXJyYXkgcHJvcGVydHkgXCIgKyBwcm9wICsgXCI6IFwiICsgdmFsdWUgKyBcIiB0eXBlb2YgXCIgKyAodHlwZW9mIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHZhciByZXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh2YWx1ZXNbaV0uc3Vic3RyKDAsIDEpID09ICdAJykge1xuICAgICAgICAgIC8vIFRPRE8gcmVtb3ZlIHRoaXMgbGVnYWN5IHN1cHBvcnQgKEApLCBzbyB3ZSBjYW4gcmVtb3ZlIFwiZGVmc1wiIGZyb20gdGhpcyBmdW5jdGlvbiwgdG9vLlxuICAgICAgICAgIHJlcy5wdXNoKF9nZW5lcmF0ZU1vZGVsKGRlZnMsIHZhbHVlc1tpXS5zdWJzdHIoMSkpKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZXNbaV0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlcy5wdXNoKHZhbHVlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1vZGVsW3Byb3BdID0gcmVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZGVsW3Byb3BdID09ICdzdHJpbmcnIHx8IHR5cGVvZiBtb2RlbFtwcm9wXSA9PSAnYm9vbGVhbicpIHtcbiAgICAgIC8vIFRPRE8gZG9lcyB0aGlzIHN0aWxsIGhhcHBlbj8gRGVidWcvdGVzdCBtZS5cbiAgICAgIG1vZGVsW3Byb3BdID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kZWxbcHJvcF0gPT0gJ29iamVjdCcgJiYgbW9kZWxbcHJvcF0gIT09IG51bGwgJiYgdHlwZW9mIG1vZGVsW3Byb3BdLl93aWRnZXQgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIGNvbnNvbGUubG9nKFwib2JqZWN0dmFsdWVcIiwgcHJvcCwgbW9kZWxbcHJvcF0uX3dpZGdldCwgdmFsdWUpO1xuICAgICAgLy8gX2RhdGEgaXMgZGVmaW5lZCBmb3IgcHJpbWl0aXZlIHR5cGVzXG4gICAgICBtb2RlbFtwcm9wXSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcInNldHRpbmdcIiwgdHlwZW9mIG1vZGVsW3Byb3BdLCBtb2RlbFtwcm9wXSwgcHJvcCwgdmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgcHJvcE5hbWUgPSBwcm9wLnN1YnN0cigwLCBkb3RQb3MpO1xuICAgIF92YWx1ZVNldChkZWZzLCBtb2RlbFtwcm9wTmFtZV0sIHByb3Auc3Vic3RyKGRvdFBvcyArIDEpLCB2YWx1ZSk7XG4gIH1cbn07XG5cbnZhciBfbW9kZWxDcmVhdGVPclVwZGF0ZUJsb2NrRGVmID0gZnVuY3Rpb24oZGVmcywgdGVtcGxhdGVOYW1lLCBwcm9wZXJ0aWVzLCBuYW1lZFByb3BlcnRpZXMpIHtcbiAgaWYgKHR5cGVvZiBkZWZzW3RlbXBsYXRlTmFtZV0gIT09ICd1bmRlZmluZWQnICYmIGRlZnNbdGVtcGxhdGVOYW1lXS5faW5pdGlhbGl6ZWQgJiYgIWRlZnNbdGVtcGxhdGVOYW1lXS5fd3JpdGVhYmxlKSB7XG4gICAgY29uc29sZS5sb2coXCJfbW9kZWxDcmVhdGVPclVwZGF0ZUJsb2NrRGVmXCIsIGRlZnMsIHRlbXBsYXRlTmFtZSwgcHJvcGVydGllcywgbmFtZWRQcm9wZXJ0aWVzKTtcbiAgICB0aHJvdyBcIlRyeWluZyB0byBhbHRlciBub24gd3JpdGVhYmxlIG1vZGVsOiBcIiArIHRlbXBsYXRlTmFtZSArIFwiIC8gXCIgKyBwcm9wZXJ0aWVzO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBkZWZzW3RlbXBsYXRlTmFtZV0gPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBkZWZzW3RlbXBsYXRlTmFtZV0gPSB7XG4gICAgICBfd3JpdGVhYmxlOiB0cnVlXG4gICAgfTtcbiAgICAvLyBGYWxsYmFjayBjb21wdXRhdGlvbiBvZiBcImNhdGVnb3J5XCIgZGVwZW5kaW5nIG9uIHRoZSBwcm9wZXJ0eSBuYW1lXG4gICAgLy8gVE9ETyByZW1vdmUgbWU6IHRoaXMgc2hvdWxkIGJlIGFsd2F5cyBkZWZpbmVkIGluIHRoZSB0ZW1wbGF0ZSBkZWZpbml0aW9uLCBubyBuZWVkIHRvIGhhcmRjb2RlIHRoaXMgc3R1ZmYuXG4gICAgaWYgKHR5cGVvZiBuYW1lZFByb3BlcnRpZXMgPT0gJ3VuZGVmaW5lZCcpIG5hbWVkUHJvcGVydGllcyA9IHt9O1xuICAgIGlmICh0eXBlb2YgbmFtZWRQcm9wZXJ0aWVzLmNhdGVnb3J5ID09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkZWZzW3RlbXBsYXRlTmFtZV0uX2NhdGVnb3J5ID09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGVtcGxhdGVOYW1lLm1hdGNoKC8oXnR8LlQpaGVtZSQvKSB8fCB0ZW1wbGF0ZU5hbWUubWF0Y2goLyhec3wuUyl0eWxlJC8pIHx8IHRlbXBsYXRlTmFtZS5tYXRjaCgvKF5jfC5DKW9sb3IkLykgfHwgdGVtcGxhdGVOYW1lLm1hdGNoKC8oXnJ8LlIpYWRpdXMkLykpIHtcbiAgICAgICAgbmFtZWRQcm9wZXJ0aWVzLmNhdGVnb3J5ID0gJ3N0eWxlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5hbWVkUHJvcGVydGllcy5jYXRlZ29yeSA9ICdjb250ZW50JztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIGlmICh0eXBlb2YgbmFtZWRQcm9wZXJ0aWVzICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIFRPRE8gY2hlY2sgaWYgdGhpcyBpcyBuZWVkZWQgYmVmb3JlIHRoZSBlbmRpbmcgbmFtZWRQcm9wZXJ0eSBcImxvb3BcIiBvciBub3QuXG4gICAgaWYgKHR5cGVvZiBuYW1lZFByb3BlcnRpZXMubmFtZSAhPSAndW5kZWZpbmVkJykgZGVmc1t0ZW1wbGF0ZU5hbWVdLl9uYW1lID0gbmFtZWRQcm9wZXJ0aWVzLm5hbWU7XG5cbiAgICBpZiAodHlwZW9mIG5hbWVkUHJvcGVydGllcy50aGVtZU92ZXJyaWRlICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICBkZWZzW3RlbXBsYXRlTmFtZV0uX3RoZW1lT3ZlcnJpZGUgPSBuYW1lZFByb3BlcnRpZXMudGhlbWVPdmVycmlkZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuYW1lZFByb3BlcnRpZXMuZ2xvYmFsU3R5bGUgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGRlZnNbdGVtcGxhdGVOYW1lXS5fZ2xvYmFsU3R5bGUgPSBuYW1lZFByb3BlcnRpZXMuZ2xvYmFsU3R5bGU7XG4gICAgICAvLyBUT0RPIHJlbW92ZSBkZXByZWNhdGVkICR0aGVtZVxuICAgICAgdmFyIGdsb2JhbFN0eWxlU3ViID0gbmFtZWRQcm9wZXJ0aWVzLmdsb2JhbFN0eWxlLnJlcGxhY2UoL14oXFwkdGhlbWV8X3RoZW1lXylcXC4vLCAnJyk7XG4gICAgICB2YXIgcCA9IGdsb2JhbFN0eWxlU3ViLmluZGV4T2YoJy4nKTtcbiAgICAgIHZhciBncyA9IHAgIT0gLTEgPyBnbG9iYWxTdHlsZVN1Yi5zdWJzdHIoMCwgcCkgOiBnbG9iYWxTdHlsZVN1YjtcbiAgICAgIF9tb2RlbENyZWF0ZU9yVXBkYXRlQmxvY2tEZWYoZGVmcywgJ3RoZW1lJywgZ3MpO1xuXG4gICAgICBpZiAodHlwZW9mIGRlZnNbdGVtcGxhdGVOYW1lXS5fdGhlbWVPdmVycmlkZSA9PT0gJ3VuZGVmaW5lZCcgfHwgISFkZWZzW3RlbXBsYXRlTmFtZV0uX3RoZW1lT3ZlcnJpZGUpIHtcbiAgICAgICAgX21vZGVsQ3JlYXRlT3JVcGRhdGVCbG9ja0RlZihkZWZzLCB0ZW1wbGF0ZU5hbWUsIFwiY3VzdG9tU3R5bGU9ZmFsc2VcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbmFtZWRQcm9wZXJ0aWVzLmNvbnRleHROYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZGVmc1t0ZW1wbGF0ZU5hbWVdLl9jb250ZXh0ID0gbmFtZWRQcm9wZXJ0aWVzLmNvbnRleHROYW1lO1xuICAgICAgLy8gVE9ETyBpcyBpdCBjb3JyZWN0IHRvIGZhbGxiYWNrIHRvIFwiYm9keVRoZW1lXCIgZm9yIGJsb2NrcyBub3QgZGVjbGFyaW5nIGEgZGVmYXVsdCB0aGVtZT9cbiAgICAgIC8vIE1heWJlIGl0IHdvdWxkIGJlIGJldHRlciB0byBzaW1wbHkgZGVjbGFyZSBpdCBhcyBtYW5kYXRvcnkgYnV0IGxlYXZlIHRoZSBkZWZhdWx0IGNvbmZpZ3V0YXRpb25cbiAgICAgIC8vIHRvIHRoZSB0ZW1wbGF0ZSBkZWZpbml0aW9uLlxuICAgICAgaWYgKG5hbWVkUHJvcGVydGllcy5jb250ZXh0TmFtZSA9PSAnYmxvY2snICYmIHR5cGVvZiBkZWZzW3RlbXBsYXRlTmFtZV0uX2dsb2JhbFN0eWxlID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGRlZnNbdGVtcGxhdGVOYW1lXS5fZ2xvYmFsU3R5bGUgPSAnX3RoZW1lXy5ib2R5VGhlbWUnO1xuICAgICAgICBfbW9kZWxDcmVhdGVPclVwZGF0ZUJsb2NrRGVmKGRlZnMsICd0aGVtZScsICdib2R5VGhlbWUnKTtcblxuICAgICAgICBpZiAodHlwZW9mIGRlZnNbdGVtcGxhdGVOYW1lXS5fdGhlbWVPdmVycmlkZSA9PSAndW5kZWZpbmVkJyB8fCBkZWZzW3RlbXBsYXRlTmFtZV0uX3RoZW1lT3ZlcnJpZGUpIHtcbiAgICAgICAgICBfbW9kZWxDcmVhdGVPclVwZGF0ZUJsb2NrRGVmKGRlZnMsIHRlbXBsYXRlTmFtZSwgXCJjdXN0b21TdHlsZT1mYWxzZVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIG5hbWVkUHJvcGVydGllcy5leHRlbmQgIT0gJ3VuZGVmaW5lZCcpIGRlZnNbdGVtcGxhdGVOYW1lXS50eXBlID0gbmFtZWRQcm9wZXJ0aWVzLmV4dGVuZDtcbiAgfVxuXG4gIGZvciAodmFyIG5wIGluIG5hbWVkUHJvcGVydGllcykgaWYgKG5hbWVkUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShucCkgJiYgdHlwZW9mIG5hbWVkUHJvcGVydGllc1tucF0gIT09ICd1bmRlZmluZWQnICYmIFsnbmFtZScsICdleHRlbmQnLCAnY29udGV4dE5hbWUnLCAnZ2xvYmFsU3R5bGUnLCd0aGVtZU92ZXJyaWRlJ10uaW5kZXhPZihucCkgPT0gLTEpIHtcbiAgICBkZWZzW3RlbXBsYXRlTmFtZV1bJ18nK25wXSA9IG5hbWVkUHJvcGVydGllc1tucF07XG4gIH1cblxuICBpZiAodHlwZW9mIHByb3BlcnRpZXMgIT0gJ3VuZGVmaW5lZCcgJiYgcHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG4gICAgZGVmc1t0ZW1wbGF0ZU5hbWVdLl9wcm9wcyA9IHR5cGVvZiBkZWZzW3RlbXBsYXRlTmFtZV0uX3Byb3BzICE9ICd1bmRlZmluZWQnICYmIGRlZnNbdGVtcGxhdGVOYW1lXS5fcHJvcHMubGVuZ3RoID4gMCA/IGRlZnNbdGVtcGxhdGVOYW1lXS5fcHJvcHMgKyBcIiBcIiArIHByb3BlcnRpZXMgOiBwcm9wZXJ0aWVzO1xuICB9XG59O1xuXG4vLyByZW1vdmUgdGhlIGZpcnN0IFwic2VxdWVuY2VcIiBpbiBhIGNhbWVsY2FzZWQgd29yZCAoZS5nOiBteUNhbWVsQ2FzZSA9PiBjYW1lbENhc2UpLlxudmFyIF9yZW1vdmVQcmVmaXggPSBmdW5jdGlvbihzdHIpIHtcbiAgdmFyIHJlcyA9IHN0ci5tYXRjaCgvXlteQS1aXSsoW0EtWl0pKC4qKSQvKTtcbiAgcmV0dXJuIHJlcyAhPT0gbnVsbCA/IHJlc1sxXS50b0xvd2VyQ2FzZSgpICsgcmVzWzJdIDogbnVsbDtcbn07XG5cbi8vIFRPRE8gZGVmcyBpcyBuZWVkZWQgb25seSBiZWNhdXNlIF92YWx1ZVNldCBuZWVkcyBpdC4uIHdlIHNob3VsZCByZW1vdmUgaXQgZG93bnN0cmVhbS5cbnZhciBfZ2VuZXJhdGVNb2RlbEZyb21EZWYgPSBmdW5jdGlvbihtb2RlbERlZiwgZGVmcykge1xuICB2YXIgcmVzID0ge307XG5cbiAgZm9yICh2YXIgcHJvcCBpbiBtb2RlbERlZilcbiAgICBpZiAoIXByb3AubWF0Y2goL15fLiovKSAmJiBtb2RlbERlZi5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgdmFyIHZhbHVlID0gbW9kZWxEZWZbcHJvcF07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5fY29tcGxleCAhPSAndW5kZWZpbmVkJyAmJiB2YWx1ZS5fY29tcGxleCkge1xuICAgICAgICByZXNbcHJvcF0gPSBfZ2VuZXJhdGVNb2RlbEZyb21EZWYodmFsdWUsIGRlZnMpO1xuICAgICAgfSBlbHNlIGlmIChwcm9wID09ICd0eXBlJykge1xuICAgICAgICByZXNbcHJvcF0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIG1vc3QgdGltZXMgdGhpcyB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IF92YWx1ZVNldFxuICAgICAgICByZXNbcHJvcF0gPSBudWxsO1xuICAgICAgICAvLyBmb3IgY3VzdG9tU3R5bGUgdGhpcyBpcyBzZXQgdG8gbnVsbC5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmV4cGVjdGVkIG1vZGVsIGRlZlwiLCBwcm9wLCB2YWx1ZSwgbW9kZWxEZWYpO1xuICAgICAgICB0aHJvdyBcIlVuZXhwZWN0ZWQgbW9kZWwgZGVmIFtcIiArIHByb3AgKyBcIl09XCIgKyB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgaWYgKHR5cGVvZiBtb2RlbERlZi5fZGVmYXVsdFZhbHVlcyAhPSAndW5kZWZpbmVkJykge1xuICAgIHZhciBkZWZhdWx0cyA9IG1vZGVsRGVmLl9kZWZhdWx0VmFsdWVzO1xuICAgIGZvciAodmFyIHByb3AyIGluIGRlZmF1bHRzKVxuICAgICAgaWYgKGRlZmF1bHRzLmhhc093blByb3BlcnR5KHByb3AyKSkge1xuICAgICAgICBfdmFsdWVTZXQoZGVmcywgcmVzLCBwcm9wMiwgZGVmYXVsdHNbcHJvcDJdKTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuXG52YXIgX2dlbmVyYXRlTW9kZWwgPSBmdW5jdGlvbihkZWZzLCBuYW1lKSB7XG4gIHZhciBtb2RlbERlZiA9IF9nZXRNb2RlbERlZihkZWZzLCBuYW1lLCBmYWxzZSwgdHJ1ZSk7XG4gIHJldHVybiBfZ2VuZXJhdGVNb2RlbEZyb21EZWYobW9kZWxEZWYsIGRlZnMpO1xufTtcblxudmFyIF9nZXREZWYgPSBmdW5jdGlvbihkZWZzLCBuYW1lKSB7XG4gIHJldHVybiBfZ2V0TW9kZWxEZWYoZGVmcywgbmFtZSwgZmFsc2UsIHRydWUpO1xufTtcblxudmFyIF9nZXRNb2RlbERlZiA9IGZ1bmN0aW9uKGRlZnMsIG5hbWUsIHJldHVybkNsb25lLCByZWFkb25seSkge1xuICAvLyBsb29rdXAgXCJuYW1lXCIgaW4gdGhlIHRlbXBsYXRlIGRlZmluaXRpb25cbiAgaWYgKHR5cGVvZiBkZWZzW25hbWVdID09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gaWYgdGhlIG5hbWUgaGFzIGEgc3BhY2UgdGhlbiByZXR1cm5zLlxuICAgIGlmIChuYW1lLmluZGV4T2YoJyAnKSAhPSAtMSkgcmV0dXJuIG51bGw7XG4gICAgLy8gb3RoZXJ3aXNlIHRyeSBsb29raW5nIHVwIHVzaW5nIGEgZGVwcmVmaXhlZCBuYW1lLlxuICAgIHZhciByZXMgPSBfcmVtb3ZlUHJlZml4KG5hbWUpO1xuICAgIGlmIChyZXMgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE8gdGhlIGRlcHJlZml4aW5nIGlzIHBvd2VyZnVsLCBidXQgbWF5YmUgbm90IHJlYWxseSBuZWVkZWQuXG4gICAgICByZXR1cm4gX2dldE1vZGVsRGVmKGRlZnMsIHJlcywgcmV0dXJuQ2xvbmUsIHJlYWRvbmx5KTtcbiAgICB9XG4gICAgLy8gbm90IGEgcHJlZml4ZWQgbmFtZVxuICAgIC8vIFRPRE8gc2hvdWxkIHdlIHJhaXNlIGFuIGVycm9yP1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIC8vIHdoZW4gdGhlIG5hbWUgaXMgYWxyZWFkeSBkZWZpbmVkLi4uXG4gICAgdmFyIGRlZk9iaiA9IGRlZnNbbmFtZV07XG4gICAgaWYgKHR5cGVvZiBkZWZPYmogIT0gJ29iamVjdCcpIHRocm93IFwiQmxvY2sgZGVmaW5pdGlvbiBtdXN0IGJlIGFuIG9iamVjdDogZm91bmQgXCIgKyBkZWZPYmogKyBcIiBmb3IgXCIgKyBuYW1lO1xuXG4gICAgaWYgKHR5cGVvZiBkZWZPYmouX2luaXRpYWxpemVkID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBQb3B1bGF0ZSBcInR5cGVcIiBkZXBlbmRpbmcgb24gbmFtZVxuICAgICAgaWYgKHR5cGVvZiBkZWZPYmoudHlwZSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAobmFtZS5pbmRleE9mKCcgJykgPT0gLTEpIHtcbiAgICAgICAgICBkZWZPYmoudHlwZSA9IG5hbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVmT2JqLnR5cGUgPSBuYW1lLnN1YnN0cihuYW1lLmluZGV4T2YoJyAnKSArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0IGlzIG5vdCBhIFwiZGF0YVwiIHR5cGUgdGhlbiBsZXQncyBkZWFsIHdpdGggaW5oZXJpdGFuY2VcbiAgICAgIGlmIChkZWZPYmoudHlwZSAhPSBuYW1lICYmIHR5cGVvZiBkZWZPYmouX3dpZGdldCA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgdHlwZURlZiA9IF9nZXRNb2RlbERlZihkZWZzLCBkZWZPYmoudHlwZSwgdHJ1ZSk7XG4gICAgICAgIHZhciBleHRlbmRlZCA9IG9iakV4dGVuZCh0eXBlRGVmLCBkZWZPYmopO1xuICAgICAgICBkZWZPYmogPSBleHRlbmRlZDtcbiAgICAgICAgZGVmc1tuYW1lXSA9IGRlZk9iajtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlZk9iai5fd2lkZ2V0ID09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkZWZPYmouX3Byb3BzID09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkZWZPYmouX2NvbXBsZXggPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gVE9ETyBoZXJlIEkgdHJpZWQgdG8gZGVhbCB3aXRoIGluaGVyaXRhbmNlIGZvciBldmVyeSBvYmplY3Qgd2l0aG91dCBhIFwidHlwZVwiIGJ5IHVzaW5nIGEgc2ltcGxlIGRlcHJlZml4LlxuICAgICAgICAvLyBidXQgdGhpcyBicmVhayBvbiB0aGVtZSBjb250YWluaW5nIFwicGFnZVRoZW1lXCIgdGhhdCB3b3VsZCBpbmhlcml0IGZyb20gaXMgcGFyZW50LiAoY3JlYXRpbmcgYSBsb29wKVxuICAgICAgICAvKlxuICAgICAgICB2YXIgc3VwZXJUeXBlID0gX3JlbW92ZVByZWZpeChkZWZPYmoudHlwZSk7XG4gICAgICAgIGlmIChzdXBlclR5cGUgIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkV4dGVuZGluZ1wiLCB0eXBlRGVmLCBuYW1lLCBzdXBlclR5cGUsIGRlZk9iai50eXBlKTtcbiAgICAgICAgICB2YXIgdHlwZURlZiA9IF9nZXRNb2RlbERlZihkZWZzLCBzdXBlclR5cGUsIHRydWUpO1xuICAgICAgICAgIFxuICAgICAgICAgIHZhciBleHRlbmRlZCA9IGpRdWVyeS5leHRlbmQodHJ1ZSwgdHlwZURlZiwgZGVmT2JqKTtcbiAgICAgICAgICBkZWZPYmogPSBleHRlbmRlZDtcbiAgICAgICAgICBkZWZzW25hbWVdID0gZGVmT2JqO1xuICAgICAgICB9XG4gICAgICAgICovXG4gICAgICB9XG4gICAgICBkZWZPYmouX3dyaXRlYWJsZSA9IHRydWU7XG4gICAgICBkZWZPYmouX2luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRlZk9iai5fcHJvcHMgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBkZWYgPSBkZWZPYmouX3Byb3BzO1xuICAgICAgZGVmID0gZGVmLnNwbGl0KFwiIFwiKTtcblxuICAgICAgaWYgKGRlZi5sZW5ndGggPiAwICYmIHR5cGVvZiBkZWZPYmouX3dyaXRlYWJsZSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQWx0ZXJpbmcgYSBub24gd3JpdGFibGUgb2JqZWN0IFwiLCBuYW1lLCBkZWYsIGRlZk9iaik7XG4gICAgICAgIHRocm93IFwiQWx0ZXJpbmcgYSBub24gd3JpdGFibGUgb2JqZWN0OiBcIiArIG5hbWUgKyBcIiBkZWY6IFwiICsgZGVmO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRlZk9iai5fcHJvY2Vzc2VkRGVmcyA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBkZWZPYmouX3Byb2Nlc3NlZERlZnMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkZWZPYmouX2dsb2JhbFN0eWxlcyA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBkZWZPYmouX2dsb2JhbFN0eWxlcyA9IHt9O1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRlZk9iai5fZGVmYXVsdFZhbHVlcyA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBkZWZPYmouX2RlZmF1bHRWYWx1ZXMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWYubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHByb3AgPSBkZWZbaV07XG4gICAgICAgIGlmIChwcm9wLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgICAgIHZhciBvcmlnUHJvcCA9IHByb3A7XG4gICAgICAgIHZhciBkZWZWYWx1ZSA9IG51bGw7XG4gICAgICAgIC8vIHBhcnNlcyAgXCJwcm9wXCIgXCJwcm9wPXZhbHVlXCIgYW5kIFwicHJvcFtdXCIgZGVjbGFyYXRpb25zXG4gICAgICAgIHZhciBwcm9wRGVmID0gcHJvcC5tYXRjaCgvXihbXj1cXFtcXF1dKykoXFxbXFxdKT8oPT8pKC4qKSQvKTtcbiAgICAgICAgaWYgKHByb3BEZWYgIT09IG51bGwpIHtcbiAgICAgICAgICBwcm9wID0gcHJvcERlZlsxXTtcbiAgICAgICAgICAvLyBUT0RPIGFycmF5IGRlZmluaXRpb24gc2hvdWxkIGJlIGRvbmUgZGlmZmVyZW50bHlcbiAgICAgICAgICBpZiAocHJvcERlZlsyXSA9PSAnW10nKSB7XG4gICAgICAgICAgICAvLyBUT0RPIHR5cGUgc2hvdWxkIG5vdCBiZSBkZWZpbmVkIGluIHRoaXMgZnVuY3Rpb25cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGVmT2JqW3Byb3BdID09ICd1bmRlZmluZWQnKSBkZWZPYmpbcHJvcF0gPSBbXTtcbiAgICAgICAgICAgIGRlZlZhbHVlID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcm9wRGVmWzNdID09ICc9Jykge1xuICAgICAgICAgICAgLy8gVE9ETyByZW1vdmUgaGFyZGNvZGVkIFwidmlzaWJsZVwiIG1hdGNoaW5nICh0aGlzIHNob3VsZCBiZSBkZWZpbmVkIGluIHRoZSB0ZW1wbGF0ZSBkZWZpbml0aW9uKVxuICAgICAgICAgICAgaWYgKHByb3AubWF0Y2goLyhednxWKWlzaWJsZSQvKSkgZGVmVmFsdWUgPSBTdHJpbmcocHJvcERlZls0XSkudG9Mb3dlckNhc2UoKSA9PSAndHJ1ZSc7XG4gICAgICAgICAgICBlbHNlIGlmIChwcm9wLm1hdGNoKC9eY3VzdG9tU3R5bGUkLykpIHtcbiAgICAgICAgICAgICAgZGVmVmFsdWUgPSBTdHJpbmcocHJvcERlZls0XSkudG9Mb3dlckNhc2UoKSA9PSAndHJ1ZSc7XG4gICAgICAgICAgICB9IGVsc2UgZGVmVmFsdWUgPSBwcm9wRGVmWzRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBkZWZhdWx0IHZhbHVlcyBmb3VuZCBpbiBcInByb3BlcnRpZXNcIiBhcmUgbm90IGJlaW5nIHByb2Nlc3NlZCBieSBcIm1vZGVsRW5zdXJlVmFsdWVcIiBhbmQgYnkgY29uc2VxdWVuY2UgZG8gbm90IGNhbGwgXCJ0aGVtZVVwZGF0ZXJcIi5cbiAgICAgICAgLy8gVE9ETyBkb2N1bWVudCB3aHkgdGhpcyBpcyBuZWVkZWQsIG9yIHJlbW92ZS5cbiAgICAgICAgaWYgKGRlZlZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkZWZPYmouX2RlZmF1bHRWYWx1ZXNbcHJvcF0gPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIGlmIChwcm9wLm1hdGNoKC9eXy8pKSBjb25zb2xlLmxvZyhcImRlZlZhbHVlIGZvclwiLCBwcm9wLCBcImluXCIsIG5hbWUpO1xuICAgICAgICAgICAgZGVmT2JqLl9kZWZhdWx0VmFsdWVzW3Byb3BdID0gZGVmVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkZWZPYmpbcHJvcF0gPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB2YXIgdmFsID0gX2dldE1vZGVsRGVmKGRlZnMsIG5hbWUgKyAnICcgKyBwcm9wLCB0cnVlKTtcbiAgICAgICAgICBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICB2YWwgPSBfZ2V0TW9kZWxEZWYoZGVmcywgcHJvcCwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZk9ialtwcm9wXSA9IHZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZk9iai5fcHJvY2Vzc2VkRGVmc1twcm9wXSA9IG9yaWdQcm9wO1xuICAgICAgICBkZWZPYmouX2NvbXBsZXggPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBkZWxldGUgZGVmT2JqLl9wcm9wcztcbiAgICB9XG5cbiAgICBpZiAocmV0dXJuQ2xvbmUpIHtcbiAgICAgIGRlZk9iai5fd3JpdGVhYmxlID0gZmFsc2U7XG4gICAgICB2YXIgY2xvbmVkID0gb2JqRXh0ZW5kKHt9LCBkZWZPYmopO1xuICAgICAgcmV0dXJuIGNsb25lZDtcbiAgICB9IGVsc2UgaWYgKHJlYWRvbmx5KSB7XG4gICAgICBkZWZPYmouX3dyaXRlYWJsZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGRlZk9iajtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBkZWZPYmouX3dyaXRlYWJsZSA9PSAndW5kZWZpbmVkJyB8fCBkZWZPYmouX3dyaXRlYWJsZSA9PT0gZmFsc2UpIHRocm93IFwiUmV0cmlldmluZyBub24gd3JpdGVhYmxlIG9iamVjdCBkZWZpbml0aW9uOiBcIiArIG5hbWU7XG4gICAgICByZXR1cm4gZGVmT2JqO1xuICAgIH1cbiAgfVxufTtcblxudmFyIF9pbmNyZWFzZVVzZUNvdW50ID0gZnVuY3Rpb24ocmVhZG9ubHksIG1vZGVsKSB7XG4gIGlmICghcmVhZG9ubHkpIHtcbiAgICBpZiAodHlwZW9mIG1vZGVsLl91c2Vjb3VudCA9PSAndW5kZWZpbmVkJykgbW9kZWwuX3VzZWNvdW50ID0gMDtcbiAgICBtb2RlbC5fdXNlY291bnQrKztcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kZWwuX3VzZWNvdW50ID09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVSUk9SIHRyeWluZyB0byBiaW5kIGFuIHVudXNlZCBwcm9wZXJ0eSB3aGlsZSByZWFkb25seVwiLCBtb2RlbCk7XG4gICAgdGhyb3cgXCJFUlJPUiB0cnlpbmcgdG8gYmluZCBhbiB1bnVzZWQgcHJvcGVydHlcIjtcbiAgfVxufTtcblxudmFyIGVuc3VyZUdsb2JhbFN0eWxlID0gZnVuY3Rpb24oZGVmcywgcmVhZG9ubHksIGdzQmluZGluZ1Byb3ZpZGVyLCBtb2RlbE5hbWUsIHBhdGgsIGdzRnVsbFBhdGgsIGRlZmF1bHRWYWx1ZSwgb3ZlcnJpZGVEZWZhdWx0KSB7XG5cbiAgdmFyIGdsb2JhbFN0eWxlQmluZGluZ0JpbmRWYWx1ZSA9IGdzQmluZGluZ1Byb3ZpZGVyKGdzRnVsbFBhdGgsIGRlZmF1bHRWYWx1ZSwgb3ZlcnJpZGVEZWZhdWx0KTtcblxuICBpZiAodHlwZW9mIGRlZnNbbW9kZWxOYW1lXS5fZ2xvYmFsU3R5bGVzW3BhdGhdID09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHJlYWRvbmx5KSB0aHJvdyBcIkNhbm5vdCBmaW5kIF9nbG9iYWxTdHlsZSBmb3IgXCIgKyBwYXRoICsgXCIgaW4gXCIgKyBtb2RlbE5hbWUgKyBcIiFcIjtcbiAgICBpZiAocGF0aC5pbmRleE9mKCcuJykgIT0gLTEgfHwgKHR5cGVvZiBkZWZzW21vZGVsTmFtZV1bcGF0aF0gPT0gJ29iamVjdCcgJiYgdHlwZW9mIGRlZnNbbW9kZWxOYW1lXVtwYXRoXS5fd2lkZ2V0ICE9PSAndW5kZWZpbmVkJykpIHtcbiAgICAgIGRlZnNbbW9kZWxOYW1lXS5fZ2xvYmFsU3R5bGVzW3BhdGhdID0gZ2xvYmFsU3R5bGVCaW5kaW5nQmluZFZhbHVlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkZWZzW21vZGVsTmFtZV0uX2dsb2JhbFN0eWxlc1twYXRoXSAhPSBnbG9iYWxTdHlsZUJpbmRpbmdCaW5kVmFsdWUpIHRocm93IFwiVW5leHBlY3RlZCBjb25mbGljdGluZyBnbG9iYWxTdHlsZSBbMl0gZm9yIFwiICsgbW9kZWxOYW1lICsgXCIvXCIgKyBwYXRoICsgXCI6IG9sZD1cIiArIGRlZnNbbW9kZWxOYW1lXS5fZ2xvYmFsU3R5bGVzW3BhdGhdICsgXCIgbmV3PVwiICsgZ2xvYmFsU3R5bGVCaW5kaW5nQmluZFZhbHVlO1xufTtcblxuLy8gdGhlbWVVcGRhdGVyLCBkZWZhdWx0VmFsdWUsIG92ZXJyaWRlRGVmYXVsdCwgc2V0Y2F0ZWdvcnkgYXJlIG9ubHkgdXNlZCBpbiAhcmVhZG9ubHkgbW9kZVxudmFyIG1vZGVsRW5zdXJlUGF0aEFuZEdldEJpbmRWYWx1ZSA9IGZ1bmN0aW9uKHJlYWRvbmx5LCBkZWZzLCB0aGVtZVVwZGF0ZXIsIHJvb3RNb2RlbE5hbWUsIHRlbXBsYXRlTmFtZSwgd2l0aGluLCBmdWxsUGF0aCwgZGVmYXVsdFZhbHVlLCBvdmVycmlkZURlZmF1bHQsIHNldGNhdGVnb3J5KSB7XG4gIHZhciBtb2RlbE5hbWU7XG4gIHZhciByZXM7XG4gIHZhciBwYXRoO1xuICAvLyBUT0RPIHJlbW92ZSAnJCcgYW5kICcjJyBoYW5kaW5nXG4gIGlmIChmdWxsUGF0aC5zdWJzdHIoMCwgMSkgPT0gJyQnKSB7XG4gICAgY29uc29sZS53YXJuKFwiREVQUkVDQVRFRCAkIGluIGJpbmRpbmdQcm92aWRlcjogXCIsIGZ1bGxQYXRoLCB0ZW1wbGF0ZU5hbWUpO1xuICAgIHZhciBwID0gZnVsbFBhdGguaW5kZXhPZignLicpO1xuICAgIGlmIChwID09IC0xKSB7XG4gICAgICB0aHJvdyBcIlVuZXhwZWN0ZWQgZnVsbFBhdGg6IFwiICsgZnVsbFBhdGggKyBcIi9cIiArIHdpdGhpbiArIFwiL1wiICsgdGVtcGxhdGVOYW1lICsgXCIvXCIgKyBkZWZhdWx0VmFsdWUgKyBcIi9cIiArIG92ZXJyaWRlRGVmYXVsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kZWxOYW1lID0gZnVsbFBhdGguc3Vic3RyKDEsIHAgLSAxKTtcbiAgICAgIHBhdGggPSBmdWxsUGF0aC5zdWJzdHIocCArIDEpO1xuICAgICAgLy8gVE9ETyByZWZhY3RvciBtZSBwbGVhc2VcbiAgICAgIGlmIChtb2RlbE5hbWUgPT0gJ3RoZW1lJykge1xuICAgICAgICB2YXIgcDIgPSBwYXRoLmluZGV4T2YoJy4nKTtcbiAgICAgICAgbW9kZWxOYW1lID0gcGF0aC5zdWJzdHIoMCwgcDIpO1xuICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHIocDIgKyAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IFwiVW5leHBlY3RlZCAkIHNlcXVlbmNlOiBcIiArIG1vZGVsTmFtZSArIFwiIGluIFwiICsgZnVsbFBhdGg7XG4gICAgICB9XG4gICAgICByZXMgPSBcIiRyb290LmNvbnRlbnQoKS50aGVtZSgpLlwiICsgbW9kZWxOYW1lICsgXCIoKS5cIiArIHBhdGgucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcLicsICdnJyksICcoKS4nKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZnVsbFBhdGguc3Vic3RyKDAsIDEpID09ICcjJykge1xuICAgIGNvbnNvbGUud2FybihcIkRFUFJFQ0FURUQgIyBpbiBiaW5kaW5nUHJvdmlkZXI6IFwiLCBmdWxsUGF0aCwgdGVtcGxhdGVOYW1lKTtcbiAgICBtb2RlbE5hbWUgPSByb290TW9kZWxOYW1lO1xuICAgIHBhdGggPSBmdWxsUGF0aC5zdWJzdHIoMSk7XG4gICAgcmVzID0gXCIkcm9vdC5jb250ZW50KCkuXCIgKyBwYXRoLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxcXC4nLCAnZycpLCAnKCkuJyk7XG4gIH0gZWxzZSBpZiAoZnVsbFBhdGguc3Vic3RyKDAsIDgpID09ICdfdGhlbWVfLicpIHtcbiAgICB2YXIgcDMgPSBmdWxsUGF0aC5pbmRleE9mKCcuJywgOCk7XG4gICAgbW9kZWxOYW1lID0gZnVsbFBhdGguc3Vic3RyKDgsIHAzIC0gOCk7XG4gICAgcGF0aCA9IGZ1bGxQYXRoLnN1YnN0cihwMyArIDEpO1xuICAgIHJlcyA9IFwiJHJvb3QuY29udGVudCgpLnRoZW1lKCkuXCIgKyBtb2RlbE5hbWUgKyBcIigpLlwiICsgcGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFwuJywgJ2cnKSwgJygpLicpO1xuICB9IGVsc2UgaWYgKGZ1bGxQYXRoLnN1YnN0cigwLCA3KSA9PSAnX3Jvb3RfLicpIHtcbiAgICBtb2RlbE5hbWUgPSByb290TW9kZWxOYW1lO1xuICAgIHBhdGggPSBmdWxsUGF0aC5zdWJzdHIoNyk7XG4gICAgcmVzID0gXCIkcm9vdC5jb250ZW50KCkuXCIgKyBwYXRoLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxcXC4nLCAnZycpLCAnKCkuJyk7XG4gIH0gZWxzZSB7XG4gICAgbW9kZWxOYW1lID0gdGVtcGxhdGVOYW1lO1xuICAgIHBhdGggPSB3aXRoaW4gKyBmdWxsUGF0aDtcbiAgICByZXMgPSBmdWxsUGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFwuJywgJ2cnKSwgJygpLicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBkZWZzW21vZGVsTmFtZV0gPT09ICd1bmRlZmluZWQnKSB0aHJvdyBcIkNhbm5vdCBmaW5kIG1vZGVsIGRlZiBmb3IgW1wiICsgbW9kZWxOYW1lICsgXCJdXCI7XG5cbiAgdmFyIHByb3BQb3MgPSBwYXRoLmluZGV4T2YoJy4nKTtcbiAgdmFyIHByb3BOYW1lID0gcHJvcFBvcyA9PSAtMSA/IHBhdGggOiBwYXRoLnN1YnN0cigwLCBwcm9wUG9zKTtcblxuICBpZiAobW9kZWxOYW1lLmluZGV4T2YoJy0nKSAhPSAtMSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFUlJPUiBjYW5ub3QgdXNlIC0gZm9yIGJsb2NrIG5hbWVzXCIsIG1vZGVsTmFtZSk7XG4gICAgdGhyb3cgXCJFUlJPUiB1bmV4cGVjdGVkIGNoYXIgaW4gYmxvY2sgbmFtZTogXCIgKyBtb2RlbE5hbWU7XG4gIH1cbiAgaWYgKHByb3BOYW1lLmluZGV4T2YoJy0nKSAhPSAtMSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFUlJPUiBjYW5ub3QgdXNlIC0gZm9yIHByb3BlcnR5IG5hbWVzXCIsIHByb3BOYW1lKTtcbiAgICB0aHJvdyBcIkVSUk9SIHVuZXhwZWN0ZWQgY2hhciBpbiBwcm9wZXJ0eSBuYW1lOiBcIiArIG1vZGVsTmFtZTtcbiAgfVxuXG4gIC8vIEZhc3RwYXRoXG4gIGlmIChyZWFkb25seSkge1xuICAgIGlmICh0eXBlb2YgZGVmc1ttb2RlbE5hbWVdLl9nbG9iYWxTdHlsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRlZnNbbW9kZWxOYW1lXVtwcm9wTmFtZV0gIT09ICd1bmRlZmluZWQnICYmIGRlZnNbbW9kZWxOYW1lXVtwcm9wTmFtZV0uX2NhdGVnb3J5ID09ICdzdHlsZScpIHtcbiAgICAgIHJlcyArPSAnLl9kZWZhdWx0Q29tcHV0ZWQnO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLy8gZ2V0cyB0aGUgd3JpdGFibGUgbW9kZWwgd2hlbiBcIiFyZWFkb25seVwiIG9yIHRoZSByZWFkb25seSBtb2RlbCBvdGhlcndpc2VcbiAgdmFyIG1vZGVsO1xuICBpZiAocmVhZG9ubHkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmF1bHRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHRocm93IFwiQ2Fubm90IHVzZSBkZWZhdWx0VmFsdWUgaW4gcmVhZG9ubHkgbW9kZSFcIjtcbiAgICBpZiAob3ZlcnJpZGVEZWZhdWx0KSB0aHJvdyBcIkNhbm5vdCB1c2Ugb3ZlcnJpZGVEZWZhdWx0IGluIHJlYWRvbmx5IG1vZGUgZm9yIFwiICsgbW9kZWxOYW1lICsgXCIvXCIgKyBwYXRoICsgXCIvXCIgKyBvdmVycmlkZURlZmF1bHQgKyBcIiFcIjtcbiAgICBpZiAodHlwZW9mIHNldGNhdGVnb3J5ICE9PSAndW5kZWZpbmVkJykgdGhyb3cgXCJDYW5ub3Qgc2V0IGNhdGVnb3J5IGZvciBcIiArIG1vZGVsTmFtZSArIFwiL1wiICsgcGF0aCArIFwiL1wiICsgc2V0Y2F0ZWdvcnkgKyBcIiBpbiByZWFkb25seSBtb2RlIVwiO1xuICAgIG1vZGVsID0gX2dldE1vZGVsRGVmKGRlZnMsIG1vZGVsTmFtZSwgZmFsc2UsIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIGlmIChkZWZzW21vZGVsTmFtZV0uX3dyaXRlYWJsZSA9PT0gZmFsc2UpIGNvbnNvbGUubG9nKFwiVE9ETyBkZWJ1ZyB1c2UgY2FzZXMgZm9yIHRoaXMgY29uZGl0aW9uXCIsIG1vZGVsTmFtZSwgcGF0aCk7XG4gICAgbW9kZWwgPSBfZ2V0TW9kZWxEZWYoZGVmcywgbW9kZWxOYW1lLCBkZWZzW21vZGVsTmFtZV0uX3dyaXRlYWJsZSA9PT0gZmFsc2UpO1xuICB9XG5cbiAgaWYgKG1vZGVsID09PSBudWxsKSB0aHJvdyBcIlVuZXhwZWN0ZWQgbW9kZWwgZm9yIFtcIiArIG1vZGVsTmFtZSArIFwiXVwiO1xuXG4gIC8vIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdHMgd2UgaGF2ZSB0byBjcmVhdGUgaXQuXG4gIGlmICh0eXBlb2YgbW9kZWxbcHJvcE5hbWVdID09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gd2hlbiBpbiByZWFkb25seSBtb2RlIHRoaXMgY2Fubm90IGJlIGRvbmUhXG4gICAgaWYgKHJlYWRvbmx5KSB0aHJvdyBcIkNhbm5vdCBmaW5kIHBhdGggXCIgKyBwcm9wTmFtZSArIFwiIGZvciBcIiArIG1vZGVsTmFtZSArIFwiIVwiO1xuICAgIF9tb2RlbENyZWF0ZU9yVXBkYXRlQmxvY2tEZWYoZGVmcywgbW9kZWxOYW1lLCBwcm9wTmFtZSk7XG4gICAgbW9kZWwgPSBfZ2V0TW9kZWxEZWYoZGVmcywgbW9kZWxOYW1lLCBmYWxzZSk7XG4gIH1cblxuICAvLyBOZWVkcyB0byBkbyB0aGlzIGFnYWluLCBiZWNhdXNlIFwiX21vZGVsQ3JlYXRlT3JVcGRhdGVCbG9ja0RlZlwiIGNvdWxkIGhhdmUgYmVlbiBqdXN0IGNyZWF0ZWQgdGhlIHByb3BlcnR5IChlLmc6IGJhY2tncm91bmRDb2xvciBidXR0b25CbG9jayBub3QgZ2V0dGluZyBkZWZhdWx0Q29tcHV0ZWQgaW4gdGVtcGxhdGUtbG0pXG4gIGlmICh0eXBlb2YgZGVmc1ttb2RlbE5hbWVdLl9nbG9iYWxTdHlsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRlZnNbbW9kZWxOYW1lXVtwcm9wTmFtZV0gIT09ICd1bmRlZmluZWQnICYmIGRlZnNbbW9kZWxOYW1lXVtwcm9wTmFtZV0gIT09IG51bGwgJiYgZGVmc1ttb2RlbE5hbWVdW3Byb3BOYW1lXS5fY2F0ZWdvcnkgPT0gJ3N0eWxlJykge1xuICAgIHJlcyArPSAnLl9kZWZhdWx0Q29tcHV0ZWQnO1xuICB9XG5cbiAgdmFyIGNoaWxkTW9kZWwgPSBtb2RlbDtcbiAgdHJ5IHtcbiAgICBfaW5jcmVhc2VVc2VDb3VudChyZWFkb25seSwgY2hpbGRNb2RlbCk7XG4gICAgaWYgKHByb3BQb3MgIT0gLTEpIHtcbiAgICAgIHZhciBteXBhdGggPSBwYXRoO1xuICAgICAgZG8ge1xuICAgICAgICB2YXIgcHJvcCA9IG15cGF0aC5zdWJzdHIoMCwgcHJvcFBvcyk7XG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGRNb2RlbFtwcm9wXSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRocm93IFwiRm91bmQgYW4gdW5leHBlY3RlZCBwcm9wIFwiICsgcHJvcCArIFwiIGZvciBtb2RlbCBcIiArIG1vZGVsTmFtZSArIFwiIGZvciBcIiArIHBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZE1vZGVsID0gY2hpbGRNb2RlbFtwcm9wXTtcbiAgICAgICAgX2luY3JlYXNlVXNlQ291bnQocmVhZG9ubHksIGNoaWxkTW9kZWwpO1xuICAgICAgICBteXBhdGggPSBteXBhdGguc3Vic3RyKHByb3BQb3MgKyAxKTtcbiAgICAgICAgcHJvcFBvcyA9IG15cGF0aC5pbmRleE9mKCcuJyk7XG4gICAgICB9IHdoaWxlIChwcm9wUG9zICE9IC0xKTtcblxuICAgICAgaWYgKHR5cGVvZiBjaGlsZE1vZGVsW215cGF0aF0gPT0gJ3VuZGVmaW5lZCcgfHwgY2hpbGRNb2RlbFtteXBhdGhdID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IFwiRm91bmQgYW4gdW5leHBlY3RlZCBwYXRoIHRlcm1pbmF0aW9uIFwiICsgbXlwYXRoICsgXCIgZm9yIG1vZGVsIFwiICsgbW9kZWxOYW1lICsgXCIgZm9yIFwiICsgcGF0aDtcbiAgICAgIH1cbiAgICAgIGNoaWxkTW9kZWwgPSBjaGlsZE1vZGVsW215cGF0aF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoaWxkTW9kZWwgPSBjaGlsZE1vZGVsW3BhdGhdO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2hpbGRNb2RlbCA9PT0gJ3VuZGVmaW5lZCcgfHwgY2hpbGRNb2RlbCA9PT0gbnVsbCkgdGhyb3cgXCJVbmV4cGVjdGVkIG51bGwgbW9kZWwgZm9yIFwiICsgbW9kZWxOYW1lICsgXCIvXCIgKyB3aXRoaW4gKyBcIi9cIiArIGZ1bGxQYXRoO1xuXG4gICAgaWYgKHR5cGVvZiBzZXRjYXRlZ29yeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNoaWxkTW9kZWwuX2NhdGVnb3J5ID0gc2V0Y2F0ZWdvcnk7XG4gICAgfVxuXG4gICAgX2luY3JlYXNlVXNlQ291bnQocmVhZG9ubHksIGNoaWxkTW9kZWwpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihcIlRPRE8gRVJST1IgUHJvcGVydHkgbG9va3VwIGV4Y2VwdGlvblwiLCBlLCBtb2RlbE5hbWUsIHBhdGgsIHRlbXBsYXRlTmFtZSwgZnVsbFBhdGgsIGRlZnMpO1xuICAgIHRocm93IGU7XG4gIH1cblxuICBpZiAodHlwZW9mIGRlZnNbbW9kZWxOYW1lXS5fZ2xvYmFsU3R5bGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkZWZzW21vZGVsTmFtZV1bcHJvcE5hbWVdID09ICdvYmplY3QnICYmIGRlZnNbbW9kZWxOYW1lXVtwcm9wTmFtZV0gIT09IG51bGwgJiYgdHlwZW9mIGRlZnNbbW9kZWxOYW1lXVtwcm9wTmFtZV0uX2NhdGVnb3J5ICE9ICd1bmRlZmluZWQnICYmIGRlZnNbbW9kZWxOYW1lXVtwcm9wTmFtZV0uX2NhdGVnb3J5ID09ICdzdHlsZScpIHtcbiAgICAvLyBUT0RPIGNhbiBJIHJlc3RyaWN0IHRoaXMgY29kZSB0byAhcmVhZG9ubHkgbW9kZT9cbiAgICB2YXIgZ3NCaW5kaW5nUHJvdmlkZXIgPSBtb2RlbEVuc3VyZVBhdGhBbmRHZXRCaW5kVmFsdWUuYmluZCh1bmRlZmluZWQsIHJlYWRvbmx5LCBkZWZzLCB0aGVtZVVwZGF0ZXIsIHJvb3RNb2RlbE5hbWUsIHRlbXBsYXRlTmFtZSwgJycpO1xuXG4gICAgdmFyIHN1YlBhdGggPSBwYXRoLmluZGV4T2YoJy4nKSAhPSAtMSA/IHBhdGguc3Vic3RyKHBhdGguaW5kZXhPZignLicpKSA6ICcnO1xuXG4gICAgLy8gVGhlIG5leHQgY29kZSBzdXBwb3J0cyBvbmx5IHByb3BlcnRpZXMgd2l0aCBvbmUgZG90IChvYmplY3QucHJvcGVydHkpLlxuICAgIGlmIChzdWJQYXRoLmluZGV4T2YoJy4nLCAxKSAhPSAtMSkgdGhyb3cgXCJUT0RPIHVuc3VwcG9ydGVkIG9iamVjdCBuZXN0aW5nISBcIiArIHBhdGg7XG5cbiAgICB2YXIgZ3NQYXRoID0gZGVmc1ttb2RlbE5hbWVdLl9nbG9iYWxTdHlsZSArICcuJyArIHByb3BOYW1lO1xuICAgIGlmICh0eXBlb2YgZGVmc1ttb2RlbE5hbWVdW3Byb3BOYW1lXSA9PSAnb2JqZWN0JyAmJiBkZWZzW21vZGVsTmFtZV1bcHJvcE5hbWVdICE9PSBudWxsICYmIHR5cGVvZiBkZWZzW21vZGVsTmFtZV1bcHJvcE5hbWVdLl9nbG9iYWxTdHlsZSAhPSAndW5kZWZpbmVkJykge1xuICAgICAgZ3NQYXRoID0gZGVmc1ttb2RlbE5hbWVdW3Byb3BOYW1lXS5fZ2xvYmFsU3R5bGU7XG4gICAgfVxuXG4gICAgZW5zdXJlR2xvYmFsU3R5bGUoZGVmcywgcmVhZG9ubHksIGdzQmluZGluZ1Byb3ZpZGVyLCBtb2RlbE5hbWUsIHByb3BOYW1lLCBnc1BhdGgsIHVuZGVmaW5lZCwgZmFsc2UpO1xuXG4gICAgdmFyIGdzRnVsbFBhdGggPSBnc1BhdGggKyBzdWJQYXRoO1xuXG4gICAgaWYgKHR5cGVvZiBkZWZhdWx0VmFsdWUgPT0gJ3VuZGVmaW5lZCcgJiYgZGVmc1ttb2RlbE5hbWVdLl9kZWZhdWx0VmFsdWVzW3BhdGhdICE9PSBudWxsKSBkZWZhdWx0VmFsdWUgPSBkZWZzW21vZGVsTmFtZV0uX2RlZmF1bHRWYWx1ZXNbcGF0aF07XG5cbiAgICBlbnN1cmVHbG9iYWxTdHlsZShkZWZzLCByZWFkb25seSwgZ3NCaW5kaW5nUHJvdmlkZXIsIG1vZGVsTmFtZSwgcGF0aCwgZ3NGdWxsUGF0aCwgZGVmYXVsdFZhbHVlLCBvdmVycmlkZURlZmF1bHQpO1xuXG4gICAgaWYgKHR5cGVvZiBkZWZhdWx0VmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAocmVhZG9ubHkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkNhbm5vdCBzZXQgYSBuZXcgdGhlbWUgZGVmYXVsdCB2YWx1ZVwiLCBnc0Z1bGxQYXRoLnN1YnN0cig3KSwgZGVmYXVsdFZhbHVlLCBcIndoaWxlIGluIHJlYWRvbmx5IG1vZGVcIik7XG4gICAgICAgIHRocm93IFwiQ2Fubm90IHNldCBhIG5ldyB0aGVtZSBkZWZhdWx0IHZhbHVlIChcIiArIGRlZmF1bHRWYWx1ZSArIFwiKSBmb3IgXCIgKyBnc0Z1bGxQYXRoLnN1YnN0cig3KSArIFwiIHdoaWxlIGluIHJlYWRvbmx5IG1vZGUhXCI7XG4gICAgICB9XG4gICAgICB0aGVtZVVwZGF0ZXIoJ2RlZmF1bHQnLCBnc0Z1bGxQYXRoLnN1YnN0cig3KSwgZGVmYXVsdFZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPIGNvbXBsZXggc3R1ZmYuIElmIHRoZSB0aGVtZSB1c2VzIGluaGVyaXRhbmNlIHdlIGVuZm9yY2UgaXQgdXNpbmcgd2l0aCB0aGUgc2FtZSB2YWx1ZSwgYnV0IHRoaXMgaXMgYSBsaW1pdC5cbiAgICBkZWZhdWx0VmFsdWUgPSBudWxsO1xuXG4gIH1cblxuICBpZiAodHlwZW9mIGRlZmF1bHRWYWx1ZSAhPSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2YgZGVmc1ttb2RlbE5hbWVdLl9kZWZhdWx0VmFsdWVzW3BhdGhdID09ICd1bmRlZmluZWQnIHx8ICh0eXBlb2Ygb3ZlcnJpZGVEZWZhdWx0ICE9ICd1bmRlZmluZWQnICYmIG92ZXJyaWRlRGVmYXVsdCkpIHtcbiAgICAgIGlmIChyZWFkb25seSkgdGhyb3cgXCJDYW5ub3Qgc2V0IG5ldyBfZGVmYXVsdFZhbHVlcyBbMV0gZm9yIFwiICsgcGF0aCArIFwiIGluIFwiICsgbW9kZWxOYW1lICsgXCIhXCI7XG4gICAgICBkZWZzW21vZGVsTmFtZV0uX2RlZmF1bHRWYWx1ZXNbcGF0aF0gPSBkZWZhdWx0VmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkZWZhdWx0VmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKHJlYWRvbmx5ICYmIGRlZnNbbW9kZWxOYW1lXS5fZGVmYXVsdFZhbHVlc1twYXRoXSAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IFwiQ2Fubm90IHNldCBuZXcgX2RlZmF1bHRWYWx1ZXMgWzJdIGZvciBcIiArIHBhdGggKyBcIiBpbiBcIiArIG1vZGVsTmFtZSArIFwiIVwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoaXMgcmVtb3ZlIGRlZmF1bHQgdmFsdWUuIFVnbHkuIChOZWVkcyB0aGlzIGZvciBkZWZhdWx0cyBpbiB0ZW1wbGF0ZS1sbSBzb2NpYWxMaW5rc0ljb24pXG4gICAgICAgIGRlZnNbbW9kZWxOYW1lXS5fZGVmYXVsdFZhbHVlc1twYXRoXSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKGRlZnNbbW9kZWxOYW1lXS5fZGVmYXVsdFZhbHVlc1twYXRoXSAhPSBkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlRPRE8gZXJyb3IhISEgVHJ5aW5nIHRvIHNldCBhIG5ldyBkZWZhdWx0IHZhbHVlIGZvciBcIiArIG1vZGVsTmFtZSArIFwiIFwiICsgcGF0aCArIFwiIHdoaWxlIGl0IGFscmVhZHkgZXhpc3RzIChjdXJyZW50OiBcIiArIGRlZnNbbW9kZWxOYW1lXS5fZGVmYXVsdFZhbHVlc1twYXRoXSArIFwiLCBuZXc6IFwiICsgZGVmYXVsdFZhbHVlICsgXCIpXCIpO1xuICAgICAgICB0aHJvdyBcIlRyeWluZyB0byBzZXQgYSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgXCIgKyBtb2RlbE5hbWUgKyBcIiBcIiArIHBhdGggKyBcIiB3aGlsZSBpdCBhbHJlYWR5IGV4aXN0cyAoY3VycmVudDogXCIgKyBkZWZzW21vZGVsTmFtZV0uZGVmYXVsdFZhbHVlc1twYXRoXSArIFwiLCBuZXc6IFwiICsgZGVmYXVsdFZhbHVlICsgXCIpXCI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbnZhciBnZW5lcmF0ZVJlc3VsdE1vZGVsID0gZnVuY3Rpb24odGVtcGxhdGVEZWYpIHtcbiAgdmFyIGRlZnMgPSB0ZW1wbGF0ZURlZi5fZGVmcztcbiAgdmFyIHRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlRGVmLnRlbXBsYXRlTmFtZTtcblxuICB2YXIgZmluYWxNb2RlbENvbnRlbnQgPSBfZ2VuZXJhdGVNb2RlbChkZWZzLCB0ZW1wbGF0ZU5hbWUpO1xuXG4gIC8vIFRPRE8gdWdseSB0byBhZGQgdGhpcyBtYW51YWxseVxuICBpZiAodHlwZW9mIGRlZnNbJ3RoZW1lJ10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZmluYWxNb2RlbENvbnRlbnQudGhlbWUgPSBfZ2VuZXJhdGVNb2RlbChkZWZzLCAndGhlbWUnKTtcbiAgfVxuXG4gIHJldHVybiBmaW5hbE1vZGVsQ29udGVudDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyB1c2VkIHRvIGNvbXBpbGUgdGhlIHRlbXBsYXRlXG4gIGVuc3VyZVBhdGhBbmRHZXRCaW5kVmFsdWU6IG1vZGVsRW5zdXJlUGF0aEFuZEdldEJpbmRWYWx1ZS5iaW5kKHVuZGVmaW5lZCwgZmFsc2UpLFxuICAvLyB1c2VkIGluIHJ1bnRpbWUgdGhlIHRlbXBsYXRlXG4gIGdldEJpbmRWYWx1ZTogbW9kZWxFbnN1cmVQYXRoQW5kR2V0QmluZFZhbHVlLmJpbmQodW5kZWZpbmVkLCB0cnVlKSxcbiAgZ2VuZXJhdGVNb2RlbDogX2dlbmVyYXRlTW9kZWwsXG4gIGdlbmVyYXRlUmVzdWx0TW9kZWw6IGdlbmVyYXRlUmVzdWx0TW9kZWwsXG4gIGdldERlZjogX2dldERlZixcbiAgY3JlYXRlT3JVcGRhdGVCbG9ja0RlZjogX21vZGVsQ3JlYXRlT3JVcGRhdGVCbG9ja0RlZlxufTsiLCJcInVzZSBzdHJpY3RcIjtcbi8qIGdsb2JhbCBnbG9iYWw6IGZhbHNlICovXG5cbnZhciAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbnZhciBjb25zb2xlID0gcmVxdWlyZShcImNvbnNvbGVcIik7XG52YXIgY29udmVydGVyVXRpbHMgPSByZXF1aXJlKFwiLi91dGlscy5qc1wiKTtcbnZhciBlbGFib3JhdGVEZWNsYXJhdGlvbnMgPSByZXF1aXJlKFwiLi9kZWNsYXJhdGlvbnMuanNcIik7XG52YXIgcHJvY2Vzc1N0eWxlc2hlZXRSdWxlcyA9IHJlcXVpcmUoXCIuL3N0eWxlc2hlZXQuanNcIik7XG52YXIgbW9kZWxEZWYgPSByZXF1aXJlKFwiLi9tb2RlbC5qc1wiKTtcbnZhciBkb211dGlscyA9IHJlcXVpcmUoXCIuL2RvbXV0aWxzLmpzXCIpO1xuXG52YXIgd3JhcEVsZW1lbnRXaXRoQ29uZGl0aW9uID0gZnVuY3Rpb24oYXR0cmlidXRlLCBlbGVtZW50LCBiaW5kaW5nUHJvdmlkZXIpIHtcbiAgdmFyIGNvbmQgPSBkb211dGlscy5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlKTtcblxuICB0cnkge1xuICAgIHZhciBiaW5kaW5nID0gY29udmVydGVyVXRpbHMuY29uZGl0aW9uQmluZGluZyhjb25kLCBiaW5kaW5nUHJvdmlkZXIpO1xuICAgICQoZWxlbWVudCkuYmVmb3JlKCc8IS0tIGtvIGlmOiAnICsgYmluZGluZyArICcgLS0+Jyk7XG4gICAgJChlbGVtZW50KS5hZnRlcignPCEtLSAva28gLS0+Jyk7XG4gICAgZG9tdXRpbHMucmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLndhcm4oXCJNb2RlbCBlbnN1cmUgcGF0aCBmYWlsZWQgaW4gaWYvdmFyaWFudFwiLCBlbGVtZW50LCBjb25kLCBhdHRyaWJ1dGUpO1xuICAgIHRocm93IGU7XG4gIH1cblxufTtcblxudmFyIHJlcGxhY2VkQXR0cmlidXRlcyA9IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgZG9tdXRpbHMuc2V0QXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZU5hbWUsIGRvbXV0aWxzLmdldEF0dHJpYnV0ZShlbGVtZW50LCBcInJlcGxhY2VkXCIgKyBhdHRyaWJ1dGVOYW1lKSk7XG59O1xuXG52YXIgcHJvY2Vzc1N0eWxlID0gZnVuY3Rpb24oZWxlbWVudCwgdGVtcGxhdGVVcmxDb252ZXJ0ZXIsIGJpbmRpbmdQcm92aWRlciwgYWRkVW5pcXVlSWQpIHtcbiAgdmFyIHN0eWxlID0gZG9tdXRpbHMuZ2V0QXR0cmlidXRlKGVsZW1lbnQsICdyZXBsYWNlZHN0eWxlJyk7XG4gIHZhciBuZXdTdHlsZSA9IG51bGw7XG4gIHZhciBuZXdCaW5kaW5ncztcbiAgaWYgKGFkZFVuaXF1ZUlkKSBuZXdCaW5kaW5ncyA9IHtcbiAgICB1bmlxdWVJZDogJyRkYXRhJyxcbiAgICBhdHRyOiB7XG4gICAgICBpZDogJ2lkJ1xuICAgIH1cbiAgfTtcblxuICB2YXIgcmVtb3ZlRGlzcGxheU5vbmUgPSBkb211dGlscy5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ2RhdGEta28tZGlzcGxheScpICE9PSBudWxsO1xuXG4gIG5ld1N0eWxlID0gZWxhYm9yYXRlRGVjbGFyYXRpb25zKHN0eWxlLCB1bmRlZmluZWQsIHRlbXBsYXRlVXJsQ29udmVydGVyLCBiaW5kaW5nUHJvdmlkZXIsIGVsZW1lbnQsIG5ld0JpbmRpbmdzLCByZW1vdmVEaXNwbGF5Tm9uZSk7XG5cbiAgLy8gb25seSB3aGVuIHVzaW5nIFwicmVwbGFjZWRcIlxuICBpZiAobmV3U3R5bGUgPT09IG51bGwpIHtcbiAgICBuZXdTdHlsZSA9IHN0eWxlO1xuICB9IGVsc2Uge1xuICAgIC8vIGluIGNhc2UgdGhlcmUgYXJlIG5vIGJpbmRpbmdzIHdlIGtlZXAgcmVwbGFjZWRzdHlsZSB0byBiZSB1c2VkIGJ5IElFIGR1cmluZyBvdXRwdXRcbiAgICAvLyBvdGhlcndpc2UgSSByZW1vdmUgaXQgYmVjYXVzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHZpcnR1YWxBdHRyU3R5bGUgYmluZGluZy5cbiAgICAvLyBUT0RPIG1heWJlIHdlIGJldHRlciB1c2UgZGlmZmVyZW50IG5hbWVzIGZvciBcInJlcGxhY2VkXCIgdXNlZCBkdXJpbmcgdGVtcGxhdGUgY29udmVyc2lvblxuICAgIC8vIGFuZCB0aGUgb25lcyB1c2VkIHRvIGNyZWF0ZSB0aGUgb3V0cHV0LlxuICAgIGRvbXV0aWxzLnJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCAncmVwbGFjZWRzdHlsZScpO1xuICB9XG5cbiAgaWYgKG5ld1N0eWxlICE9PSBudWxsKSB7XG4gICAgaWYgKG5ld1N0eWxlLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICBkb211dGlscy5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ3N0eWxlJywgbmV3U3R5bGUpO1xuICAgIH0gZWxzZSBkb211dGlscy5yZW1vdmVBdHRyaWJ1dGUoZWxlbWVudCwgJ3N0eWxlJyk7XG4gIH1cbn07XG5cblxuLy8gVE9ETyBmaXhpbmcgVVJMcyBpcyBhbHNvIG5lZWRlZCB3aGVyZSBzdHlsZXMgdXNlcyBwYXRoIChlLmc6IGJhY2tncm91bmQtaW1hZ2UsIEBpbXBvcnQpXG52YXIgX2ZpeFJlbGF0aXZlUGF0aCA9IGZ1bmN0aW9uKGF0dHJpYnV0ZSwgdGVtcGxhdGVVcmxDb252ZXJ0ZXIsIGluZGV4LCBlbGVtZW50KSB7XG4gIHZhciB1cmwgPSBkb211dGlscy5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlKTtcbiAgdmFyIG5ld1VybCA9IHRlbXBsYXRlVXJsQ29udmVydGVyKHVybCk7XG4gIGlmIChuZXdVcmwgIT09IG51bGwpIHtcbiAgICBkb211dGlscy5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlLCBuZXdVcmwpO1xuICB9XG59O1xuXG5cbnZhciBwcm9jZXNzQmxvY2sgPSBmdW5jdGlvbihlbGVtZW50LCBkZWZzLCB0aGVtZVVwZGF0ZXIsIGJsb2NrUHVzaGVyLCB0ZW1wbGF0ZVVybENvbnZlcnRlciwgY29udGV4dE5hbWUsIHJvb3RNb2RlbE5hbWUsIGNvbnRhaW5lck5hbWUsIGdlbmVyYXRlVW5pcXVlSWQsIHRlbXBsYXRlQ3JlYXRvcikge1xuXG4gIHRyeSB7XG5cbiAgdmFyIHRlbXBsYXRlTmFtZTtcbiAgdmFyIHZhcmlhbnROYW1lID0gJycsXG4gICAgdmFyaWFudERlZiA9ICcnO1xuICBpZiAoY29udGV4dE5hbWUgPT0gJ2Jsb2NrJykge1xuICAgIHRlbXBsYXRlTmFtZSA9IGRvbXV0aWxzLmdldEF0dHJpYnV0ZShlbGVtZW50LCAnZGF0YS1rby1ibG9jaycpO1xuICAgIGRvbXV0aWxzLnJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCAnZGF0YS1rby1ibG9jaycpO1xuICB9IGVsc2UgaWYgKGNvbnRleHROYW1lID09ICd0ZW1wbGF0ZScpIHtcbiAgICB0ZW1wbGF0ZU5hbWUgPSByb290TW9kZWxOYW1lO1xuICB9IGVsc2Uge1xuICAgIHRocm93IFwiVW5leHBlY3RlZCBjb250ZXh0IG5hbWUgd2hpbGUgcHJvY2Vzc2luZyBibG9jazogXCIgKyBjb250ZXh0TmFtZTtcbiAgfVxuXG4gIC8vIGNvbnNvbGUubG9nKFwicHJvY2Vzc0Jsb2NrXCIsIGNvbnRleHROYW1lLCByb290TW9kZWxOYW1lLCBjb250YWluZXJOYW1lLCB0ZW1wbGF0ZU5hbWUpO1xuXG4gIC8vIFJlbW92ZSBlbGVtZW50XG4gICQoJ1tkYXRhLWtvLXJlbW92ZV0nLCBlbGVtZW50KS5yZW1vdmUoKTtcblxuICB2YXIgZml4ZWRCbG9ja3MgPSAkKCdbZGF0YS1rby1ibG9ja10nLCBlbGVtZW50KS5yZXBsYWNlV2l0aCgnPHJlcGxhY2VkYmxvY2s+Jyk7XG5cbiAgLy8gVXJscyBpbiB0aGVzZSBhdHRyaWJ1dGVzIG5lZWRzIFwicmVsYXRpdml6YXRpb25cIlxuICB2YXIgdXJsYXR0cnMgPSBbJ2hyZWYnLCAnc3JjJywgJ2RhdGEta28tcGxhY2Vob2xkZXItc3JjJywgJ2JhY2tncm91bmQnXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cmxhdHRycy5sZW5ndGg7IGkrKykge1xuICAgIC8vIGZhY2NpbyBpbCBiaW5kIHBlciBub24gZGVmaW5pcmUgZnVuemlvbmkgaW4gdW4gbG9vcCAoanNoaW50KVxuICAgIHZhciBmdW5jID0gX2ZpeFJlbGF0aXZlUGF0aC5iaW5kKHVuZGVmaW5lZCwgdXJsYXR0cnNbaV0sIHRlbXBsYXRlVXJsQ29udmVydGVyKTtcbiAgICAkKCdbJyArIHVybGF0dHJzW2ldICsgJ10nLCBlbGVtZW50KS5lYWNoKGZ1bmMpO1xuICB9XG5cbiAgdmFyIGRhdGFEZWZzID0gZG9tdXRpbHMuZ2V0QXR0cmlidXRlKGVsZW1lbnQsICdkYXRhLWtvLXByb3BlcnRpZXMnKTtcbiAgaWYgKGRhdGFEZWZzID09PSBudWxsKSBkYXRhRGVmcyA9IFwiXCI7XG4gICQoXCJbZGF0YS1rby1wcm9wZXJ0aWVzXVwiLCBlbGVtZW50KS5lYWNoKGZ1bmN0aW9uKGluZGV4LCBlbGVtZW50KSB7XG4gICAgaWYgKGRhdGFEZWZzLmxlbmd0aCA+IDApIGRhdGFEZWZzID0gZGF0YURlZnMgKyBcIiBcIjtcbiAgICBkYXRhRGVmcyA9IGRhdGFEZWZzICsgZG9tdXRpbHMuZ2V0QXR0cmlidXRlKGVsZW1lbnQsICdkYXRhLWtvLXByb3BlcnRpZXMnKTtcbiAgICBkb211dGlscy5yZW1vdmVBdHRyaWJ1dGUoZWxlbWVudCwgJ2RhdGEta28tcHJvcGVydGllcycpO1xuICB9KTtcblxuICBtb2RlbERlZi5jcmVhdGVPclVwZGF0ZUJsb2NrRGVmKGRlZnMsIHRlbXBsYXRlTmFtZSwgZGF0YURlZnMsIHsgY29udGV4dE5hbWU6IGNvbnRleHROYW1lIH0pO1xuXG4gIHZhciBiaW5kaW5nUHJvdmlkZXIgPSBtb2RlbERlZi5lbnN1cmVQYXRoQW5kR2V0QmluZFZhbHVlLmJpbmQodW5kZWZpbmVkLCBkZWZzLCB0aGVtZVVwZGF0ZXIsIHJvb3RNb2RlbE5hbWUsIHRlbXBsYXRlTmFtZSwgJycpO1xuICBpZiAoY29udGV4dE5hbWUgPT0gJ2Jsb2NrJykgYmluZGluZ1Byb3ZpZGVyKCdpZCcsICcnKTtcblxuICAkKCdzdHlsZScsIGVsZW1lbnQpLmVhY2goZnVuY3Rpb24oaW5kZXgsIGVsZW1lbnQpIHtcbiAgICB2YXIgc3R5bGUgPSBkb211dGlscy5nZXRJbm5lckh0bWwoZWxlbWVudCk7XG5cbiAgICB2YXIgYmxvY2tEZWZzVXBkYXRlciA9IG1vZGVsRGVmLmNyZWF0ZU9yVXBkYXRlQmxvY2tEZWYuYmluZCh1bmRlZmluZWQsIGRlZnMpO1xuICAgIHZhciBsb2NhbFdpdGhCaW5kaW5nUHJvdmlkZXIgPSBtb2RlbERlZi5lbnN1cmVQYXRoQW5kR2V0QmluZFZhbHVlLmJpbmQodW5kZWZpbmVkLCBkZWZzLCB0aGVtZVVwZGF0ZXIsIHJvb3RNb2RlbE5hbWUpO1xuICAgIHZhciBuZXdTdHlsZSA9IHByb2Nlc3NTdHlsZXNoZWV0UnVsZXMoc3R5bGUsIHVuZGVmaW5lZCwgbG9jYWxXaXRoQmluZGluZ1Byb3ZpZGVyLCBibG9ja0RlZnNVcGRhdGVyLCB0aGVtZVVwZGF0ZXIsIHRlbXBsYXRlVXJsQ29udmVydGVyLCByb290TW9kZWxOYW1lLCB0ZW1wbGF0ZU5hbWUpO1xuXG4gICAgaWYgKG5ld1N0eWxlICE9IHN0eWxlKSB7XG4gICAgICBpZiAobmV3U3R5bGUudHJpbSgpICE9PSAnJykge1xuICAgICAgICB2YXIgdG1wTmFtZSA9IHRlbXBsYXRlQ3JlYXRvcihuZXdTdHlsZSk7XG4gICAgICAgIGRvbXV0aWxzLnNldEF0dHJpYnV0ZShlbGVtZW50LCAnZGF0YS1iaW5kJywgJ3RlbXBsYXRlOiB7IG5hbWU6IFxcJycgKyB0bXBOYW1lICsgJ1xcJyB9Jyk7XG4gICAgICAgIC8vIGhvIGNyZWF0byBpbCB0ZW1wbGF0ZSBxdWluZGkgcG9zc28gc3Z1b3RhcmUgaWwgc29yZ2VudGUuXG4gICAgICAgIGRvbXV0aWxzLnNldENvbnRlbnQoZWxlbWVudCwgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGVtcHR5IHN0eWxlcyBibG9ja3NcbiAgICAgICAgZG9tdXRpbHMucmVtb3ZlRWxlbWVudHMoJChlbGVtZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBwcm9jZXNzU3R5bGUoZWxlbWVudCwgdGVtcGxhdGVVcmxDb252ZXJ0ZXIsIGJpbmRpbmdQcm92aWRlciwgZ2VuZXJhdGVVbmlxdWVJZCk7XG5cbiAgLy8gVE9ETyBocmVmIHNob3VsZCBiZSBzdXBwb3J0ZWQuIGRhdGEta28tZGlzcGxheSBhbmQgZGF0YS1rby13cmFwIHNob3VsZCBuZXZlciBoYXBwZW4gaW4gaGVyZS5cbiAgdmFyIG5vdHN1cHBvcnRlZCA9IFsnZGF0YS1rby1kaXNwbGF5JywgJ2RhdGEta28tZWRpdGFibGUnLCAnZGF0YS1rby13cmFwJywgJ2hyZWYnXTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCBub3RzdXBwb3J0ZWQubGVuZ3RoOyBqKyspIHtcbiAgICB2YXIgYXR0ciA9IGRvbXV0aWxzLmdldEF0dHJpYnV0ZShlbGVtZW50LCBub3RzdXBwb3J0ZWRbal0pO1xuICAgIGlmIChhdHRyKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJFUlJPUjogVW5zdXBwb3J0ZWQgXCIgKyBub3RzdXBwb3J0ZWRbal0gKyBcIiB1c2VkIHRvZ2V0aGVyIHdpdGggZGF0YS1rby1ibG9ja1wiLCBlbGVtZW50KTtcbiAgICAgIHRocm93IFwiRVJST1I6IFVuc3VwcG9ydGVkIFwiICsgbm90c3VwcG9ydGVkW2pdICsgXCIgdXNlZCB0b2dldGhlciB3aXRoIGRhdGEta28tYmxvY2tcIjtcbiAgICB9XG4gIH1cblxuICAvLyBzaW1wbHkgcHJlcHJvY2Vzc2VkIGFzIGRhdGEta28td3JhcCArIC1rby1hdHRyLWhyZWZcbiAgJChcIltkYXRhLWtvLWxpbmtdXCIsIGVsZW1lbnQpLmVhY2goZnVuY3Rpb24oaW5kZXgsIGVsZW1lbnQpIHtcbiAgICB2YXIgdXJsVmFyID0gZG9tdXRpbHMuZ2V0QXR0cmlidXRlKGVsZW1lbnQsICdkYXRhLWtvLWxpbmsnKTtcbiAgICB2YXIgcmVwU3R5bGUgPSBkb211dGlscy5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ3JlcGxhY2Vkc3R5bGUnKTtcbiAgICBpZiAodHlwZW9mIHJlcFN0eWxlID09ICd1bmRlZmluZWQnIHx8IHJlcFN0eWxlID09PSBudWxsKSByZXBTdHlsZSA9ICcnO1xuICAgIGlmIChyZXBTdHlsZSAhPT0gJycpIHJlcFN0eWxlID0gJy1rby1hdHRyLWhyZWY6IEAnICsgdXJsVmFyICsgXCI7IFwiICsgcmVwU3R5bGU7XG4gICAgZWxzZSByZXBTdHlsZSA9ICcta28tYXR0ci1ocmVmOiBAJyArIHVybFZhcjtcbiAgICBkb211dGlscy5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ3JlcGxhY2Vkc3R5bGUnLCByZXBTdHlsZSk7XG4gICAgZG9tdXRpbHMuc2V0QXR0cmlidXRlKGVsZW1lbnQsICdkYXRhLWtvLXdyYXAnLCB1cmxWYXIpO1xuICAgIGRvbXV0aWxzLnJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCAnZGF0YS1rby1saW5rJyk7XG4gIH0pO1xuXG4gICQoXCJbcmVwbGFjZWRzdHlsZV1cIiwgZWxlbWVudCkuZWFjaChmdW5jdGlvbihpbmRleCwgZWxlbWVudCkge1xuICAgIHByb2Nlc3NTdHlsZShlbGVtZW50LCB0ZW1wbGF0ZVVybENvbnZlcnRlciwgYmluZGluZ1Byb3ZpZGVyLCBmYWxzZSk7XG4gIH0pO1xuXG4gICQoXCJbcmVwbGFjZWRodHRwLWVxdWl2XVwiLCBlbGVtZW50KS5lYWNoKGZ1bmN0aW9uKGluZGV4LCBlbGVtZW50KSB7XG4gICAgcmVwbGFjZWRBdHRyaWJ1dGVzKGVsZW1lbnQsIFwiaHR0cC1lcXVpdlwiKTtcbiAgfSk7XG5cbiAgJChcIltkYXRhLWtvLWRpc3BsYXldXCIsIGVsZW1lbnQpLmVhY2goZnVuY3Rpb24oaW5kZXgsIGVsZW1lbnQpIHtcbiAgICB3cmFwRWxlbWVudFdpdGhDb25kaXRpb24oJ2RhdGEta28tZGlzcGxheScsIGVsZW1lbnQsIGJpbmRpbmdQcm92aWRlcik7XG4gIH0pO1xuXG4gICQoXCJbZGF0YS1rby1lZGl0YWJsZV1cIiwgZWxlbWVudCkuZWFjaChmdW5jdGlvbihpbmRleCwgZWxlbWVudCkge1xuICAgIHZhciBuZXdCaW5kaW5nLCBkZWZhdWx0VmFsdWUsIG1vZGVsLCBjdXJyZW50QmluZGluZ3MsIGRhdGFCaW5kO1xuXG5cbiAgICB2YXIgZGF0YUVkaXRhYmxlID0gZG9tdXRpbHMuZ2V0QXR0cmlidXRlKGVsZW1lbnQsIFwiZGF0YS1rby1lZGl0YWJsZVwiKTtcblxuICAgIC8vIFRPRE8gYWRkIHZhbGlkYXRpb24gb2YgdGhlIGVkaXRhYmxlXG5cbiAgICB2YXIgaXRlbUJpbmRWYWx1ZTtcbiAgICB2YXIgc2VsZWN0QmluZGluZztcbiAgICBpZiAoZGF0YUVkaXRhYmxlLmxhc3RJbmRleE9mKCcuJykgPiAwKSB7XG4gICAgICB2YXIgc3VicyA9IGRhdGFFZGl0YWJsZS5zdWJzdHIoMCwgZGF0YUVkaXRhYmxlLmxhc3RJbmRleE9mKCcuJykpO1xuICAgICAgaXRlbUJpbmRWYWx1ZSA9IGJpbmRpbmdQcm92aWRlcihzdWJzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbUJpbmRWYWx1ZSA9IGJpbmRpbmdQcm92aWRlcihkYXRhRWRpdGFibGUpO1xuICAgIH1cbiAgICBzZWxlY3RCaW5kaW5nID0gXCJ3eXNpd3lnQ2xpY2s6IGZ1bmN0aW9uKG9iaiwgZXZ0KSB7ICRyb290LnNlbGVjdEl0ZW0oXCIgKyBpdGVtQmluZFZhbHVlICsgXCIsICRkYXRhKTsgcmV0dXJuIGZhbHNlIH0sIGNsaWNrQnViYmxlOiBmYWxzZSwgd3lzaXd5Z0NzczogeyBzZWxlY3RlZGl0ZW06ICRyb290LmlzU2VsZWN0ZWRJdGVtKFwiICsgaXRlbUJpbmRWYWx1ZSArIFwiKSB9LCBzY3JvbGxJbnRvVmlldzogJHJvb3QuaXNTZWxlY3RlZEl0ZW0oXCIgKyBpdGVtQmluZFZhbHVlICsgXCIpXCI7XG5cbiAgICBpZiAoZG9tdXRpbHMuZ2V0TG93ZXJUYWdOYW1lKGVsZW1lbnQpICE9ICdpbWcnKSB7XG5cblxuICAgICAgZGVmYXVsdFZhbHVlID0gZG9tdXRpbHMuZ2V0SW5uZXJIdG1sKGVsZW1lbnQpO1xuICAgICAgdmFyIG1vZGVsQmluZFZhbHVlID0gYmluZGluZ1Byb3ZpZGVyKGRhdGFFZGl0YWJsZSwgZGVmYXVsdFZhbHVlLCB0cnVlLCAnd3lzaXd5ZycpO1xuICAgICAgbmV3QmluZGluZyA9IFwiXCI7XG5cbiAgICAgIGlmICghZG9tdXRpbHMuZ2V0QXR0cmlidXRlKGVsZW1lbnQsIFwiaWRcIikpIHtcbiAgICAgICAgbmV3QmluZGluZyArPSBcInd5c2l3eWdJZDogaWQoKSsnX1wiICsgZGF0YUVkaXRhYmxlLnJlcGxhY2UoJy4nLCAnXycpICsgXCInLCBcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzZWxlY3RCaW5kaW5nICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBuZXdCaW5kaW5nICs9IHNlbGVjdEJpbmRpbmcgKyBcIiwgXCI7XG4gICAgICB9XG5cbiAgICAgIG5ld0JpbmRpbmcgKz0gXCJ3eXNpd3lnT3JIdG1sOiBcIiArIG1vZGVsQmluZFZhbHVlO1xuXG4gICAgICBpZiAoZG9tdXRpbHMuZ2V0TG93ZXJUYWdOYW1lKGVsZW1lbnQpID09ICd0ZCcpIHtcbiAgICAgICAgdmFyIHdyYXBwaW5nRGl2ID0gJCgnPGRpdiBkYXRhLWtvLXdyYXA9XCJmYWxzZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJVwiPjwvZGl2PicpWzBdO1xuICAgICAgICBkb211dGlscy5zZXRBdHRyaWJ1dGUod3JhcHBpbmdEaXYsICdkYXRhLWJpbmQnLCBuZXdCaW5kaW5nKTtcbiAgICAgICAgdmFyIG5ld0NvbnRlbnQgPSBkb211dGlscy5nZXRJbm5lckh0bWwoJCgnPGRpdj48L2Rpdj4nKS5hcHBlbmQod3JhcHBpbmdEaXYpKTtcbiAgICAgICAgZG9tdXRpbHMuc2V0Q29udGVudChlbGVtZW50LCBuZXdDb250ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRCaW5kaW5ncyA9IGRvbXV0aWxzLmdldEF0dHJpYnV0ZShlbGVtZW50LCAnZGF0YS1iaW5kJyk7XG4gICAgICAgIGRhdGFCaW5kID0gKGN1cnJlbnRCaW5kaW5ncyAhPT0gbnVsbCA/IGN1cnJlbnRCaW5kaW5ncyArIFwiLCBcIiA6IFwiXCIpICsgbmV3QmluZGluZztcbiAgICAgICAgZG9tdXRpbHMuc2V0QXR0cmlidXRlKGVsZW1lbnQsICdkYXRhLWJpbmQnLCBkYXRhQmluZCk7XG4gICAgICAgIGRvbXV0aWxzLnNldENvbnRlbnQoZWxlbWVudCwgJycpO1xuICAgICAgfVxuICAgICAgZG9tdXRpbHMucmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsICdkYXRhLWtvLWVkaXRhYmxlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB3aWR0aCA9IGRvbXV0aWxzLmdldEF0dHJpYnV0ZShlbGVtZW50LCAnd2lkdGgnKTtcbiAgICAgIGlmICh3aWR0aCA9PT0gJycpIHdpZHRoID0gbnVsbDtcbiAgICAgIGlmICh3aWR0aCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRVJST1I6IGRhdGEta28tZWRpdGFibGUgaW1hZ2VzIG11c3QgZGVjbGFyZSBhIFdJRFRIIGF0dHJpYnV0ZSFcIiwgZWxlbWVudCk7XG4gICAgICAgIHRocm93IFwiRVJST1I6IGRhdGEta28tZWRpdGFibGUgaW1hZ2VzIG11c3QgZGVjbGFyZSBhIFdJRFRIIGF0dHJpYnV0ZSFcIjtcbiAgICAgIH1cbiAgICAgIHZhciBoZWlnaHQgPSBkb211dGlscy5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ2hlaWdodCcpO1xuICAgICAgaWYgKGhlaWdodCA9PT0gJycpIGhlaWdodCA9IG51bGw7XG5cbiAgICAgIHZhciBhbGlnbiA9IGRvbXV0aWxzLmdldEF0dHJpYnV0ZShlbGVtZW50LCAnYWxpZ24nKTtcblxuICAgICAgY3VycmVudEJpbmRpbmdzID0gZG9tdXRpbHMuZ2V0QXR0cmlidXRlKGVsZW1lbnQsICdkYXRhLWJpbmQnKTtcblxuICAgICAgLy8gVE9ETyB0aGlzIGlzIHVnbHkuLi4gbWF5YmUgYSBiZXR0ZXIgc3RyYXRlZ3kgaXMgdG8gcGFzcyB0aGlzIGFyb3VuZCB1c2luZyBcImRhdGEtXCIgYXR0cmlidXRlc1xuICAgICAgdmFyIGR5bkhlaWdodCA9IGN1cnJlbnRCaW5kaW5ncyAmJiBjdXJyZW50QmluZGluZ3MubWF0Y2goL3ZpcnR1YWxBdHRyOiB7W159XSogaGVpZ2h0OiAoW14sfV0qKVssfV0vKTtcbiAgICAgIGlmIChkeW5IZWlnaHQpIGhlaWdodCA9IGR5bkhlaWdodFsxXTtcbiAgICAgIHZhciBkeW5XaWR0aCA9IGN1cnJlbnRCaW5kaW5ncyAmJiBjdXJyZW50QmluZGluZ3MubWF0Y2goL3ZpcnR1YWxBdHRyOiB7W159XSogd2lkdGg6IChbXix9XSopWyx9XS8pO1xuICAgICAgaWYgKGR5bldpZHRoKSB3aWR0aCA9IGR5bldpZHRoWzFdO1xuXG4gICAgICB2YXIgbWV0aG9kO1xuXG4gICAgICBkZWZhdWx0VmFsdWUgPSBkb211dGlscy5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ2RhdGEta28tcGxhY2Vob2xkZXItc3JjJyk7XG4gICAgICAvLyBUT0RPIG1ha2Ugc3VyZSB0aGlzIGRlZmF1bHQgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBjaGVja2VkIGJ5IGltZy13eXNpd3lnIHRlbXBsYXRlLlxuICAgICAgdmFyIHZhbHVlID0gJyc7XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gZG9tdXRpbHMuZ2V0QXR0cmlidXRlKGVsZW1lbnQsICdzcmMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRvbXV0aWxzLmdldEF0dHJpYnV0ZShlbGVtZW50LCAnc3JjJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzaXplO1xuICAgICAgaWYgKHdpZHRoICYmIGhlaWdodCkge1xuICAgICAgICBzaXplID0gd2lkdGggKyBcIisneCcrXCIgKyBoZWlnaHQ7XG4gICAgICB9IGVsc2UgaWYgKCFoZWlnaHQpIHtcbiAgICAgICAgc2l6ZSA9IFwiJ3cnK1wiICsgd2lkdGggKyBcIisnJ1wiO1xuICAgICAgfSBlbHNlIGlmICghd2lkdGgpIHtcbiAgICAgICAgc2l6ZSA9IFwiJ2gnK1wiICsgaGVpZ2h0ICsgXCIrJydcIjtcbiAgICAgIH1cbiAgICAgIHZhciBwbGFjZWhvbGRlcnNyYztcbiAgICAgIHZhciBwbGhlaWdodCA9IGhlaWdodCB8fCBkb211dGlscy5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ2RhdGEta28tcGxhY2Vob2xkZXItaGVpZ2h0Jyk7XG4gICAgICB2YXIgcGx3aWR0aCA9IHdpZHRoIHx8IGRvbXV0aWxzLmdldEF0dHJpYnV0ZShlbGVtZW50LCAnZGF0YS1rby1wbGFjZWhvbGRlci13aWR0aCcpO1xuXG4gICAgICBkb211dGlscy5yZW1vdmVBdHRyaWJ1dGUoZWxlbWVudCwgJ3NyYycpO1xuICAgICAgZG9tdXRpbHMucmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsICdkYXRhLWtvLWVkaXRhYmxlJyk7XG4gICAgICBkb211dGlscy5yZW1vdmVBdHRyaWJ1dGUoZWxlbWVudCwgJ2RhdGEta28tcGxhY2Vob2xkZXItaGVpZ2h0Jyk7XG4gICAgICBkb211dGlscy5yZW1vdmVBdHRyaWJ1dGUoZWxlbWVudCwgJ2RhdGEta28tcGxhY2Vob2xkZXItd2lkdGgnKTtcbiAgICAgIGRvbXV0aWxzLnJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCAnZGF0YS1rby1wbGFjZWhvbGRlci1zcmMnKTtcblxuICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBwbGFjZWhvbGRlcnNyYyA9IFwieyB3aWR0aDogXCIgKyBwbHdpZHRoICsgXCIsIGhlaWdodDogXCIgKyBwbGhlaWdodCArIFwiLCB0ZXh0OiBcIiArIHNpemUgKyBcIn1cIjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwbHdpZHRoIHx8ICFwbGhlaWdodCkge1xuICAgICAgICAvLyBUT0RPIHJhaXNlIGFuIGV4Y2VwdGlvbj9cbiAgICAgICAgY29uc29sZS5lcnJvcihcIklNRyBkYXRhLWtvLWVkaXRhYmxlIG11c3QgZGVjbGFyZSB3aWR0aCBhbmQgaGVpZ2h0IGF0dHJpYnV0ZXMsIG9yIHRoZWlyIHBsYWNlaG9sZGVyIGNvdW50ZXJwYXJ0cyBkYXRhLWtvLXBsYWNlaG9sZGVyLXdpZHRoL2RhdGEta28tcGxhY2Vob2xkZXItaGVpZ2h0XCIsIGVsZW1lbnQpO1xuICAgICAgICB0aHJvdyBcIkVSUk9SOiBJTUcgZGF0YS1rby1lZGl0YWJsZSBNVVNUIGRlY2xhcmUgd2lkdGggYW5kIGhlaWdodCBhdHRyaWJ1dGVzLCBvciB0aGVpciBwbGFjZWhvbGRlciBjb3VudGVycGFydHMgZGF0YS1rby1wbGFjZWhvbGRlci13aWR0aC9kYXRhLWtvLXBsYWNlaG9sZGVyLWhlaWdodFwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgYmluZGluZ1ZhbHVlID0gYmluZGluZ1Byb3ZpZGVyKGRhdGFFZGl0YWJsZSwgdmFsdWUsIGZhbHNlLCAnd3lzaXd5ZycpO1xuICAgICAgbmV3QmluZGluZyA9IFwid3lzaXd5Z1NyYzogeyB3aWR0aDogXCIgKyB3aWR0aCArIFwiLCBoZWlnaHQ6IFwiICsgaGVpZ2h0ICsgXCIsIHNyYzogXCIgKyBiaW5kaW5nVmFsdWUgKyBcIiwgcGxhY2Vob2xkZXI6IFwiICsgcGxhY2Vob2xkZXJzcmMgKyBcIiB9XCI7XG4gICAgICBkYXRhQmluZCA9IChjdXJyZW50QmluZGluZ3MgIT09IG51bGwgPyBjdXJyZW50QmluZGluZ3MgKyBcIiwgXCIgOiBcIlwiKSArIG5ld0JpbmRpbmc7XG4gICAgICBkb211dGlscy5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ2RhdGEtYmluZCcsIGRhdGFCaW5kKTtcblxuICAgICAgdmFyIHRtcGxOYW1lID0gdGVtcGxhdGVDcmVhdG9yKGVsZW1lbnQpO1xuXG4gICAgICB2YXIgY29udGFpbmVyQmluZCA9ICd7IHdpZHRoOiAnICsgd2lkdGg7XG4gICAgICBpZiAoYWxpZ24gPT0gJ2xlZnQnKSBjb250YWluZXJCaW5kICs9ICcsIGZsb2F0OiBcXCdsZWZ0XFwnJztcbiAgICAgIGVsc2UgaWYgKGFsaWduID09ICdyaWdodCcpIGNvbnRhaW5lckJpbmQgKz0gJywgZmxvYXQ6IFxcJ3JpZ2h0XFwnJztcbiAgICAgIGVsc2UgaWYgKGFsaWduID09ICdjZW50ZXInKSBjb25zb2xlLmxvZygnbm9uIHNvIGNvc2EgZmEgYWxpZ249Y2VudGVyIHN1IHVuYSBpbWcgZSBxdWluZGkgbm9uIHNvIGNvbWUgc2ltdWxhcm5lIGxcXCdlZGl0aW5nJyk7XG4gICAgICBlbHNlIGlmIChhbGlnbiA9PSAndG9wJykgY29udGFpbmVyQmluZCArPSAnLCB2ZXJ0aWNhbEFsaWduOiBcXCd0b3BcXCcnO1xuICAgICAgZWxzZSBpZiAoYWxpZ24gPT0gJ21pZGRsZScpIGNvbnRhaW5lckJpbmQgKz0gJywgdmVydGljYWxBbGlnbjogXFwnbWlkZGxlXFwnJztcbiAgICAgIGVsc2UgaWYgKGFsaWduID09ICdib3R0b20nKSBjb250YWluZXJCaW5kICs9ICcsIHZlcnRpY2FsQWxpZ246IFxcJ2JvdHRvbVxcJyc7XG4gICAgICBjb250YWluZXJCaW5kICs9ICd9JztcblxuICAgICAgJChlbGVtZW50KS5iZWZvcmUoJzwhLS0ga28gd3lzaXd5Z0ltZzogeyBfZGF0YTogJGRhdGEsIF9pdGVtOiAnICsgaXRlbUJpbmRWYWx1ZSArICcsIF90ZW1wbGF0ZTogXFwnJyArIHRtcGxOYW1lICsgJ1xcJywgX2VkaXRUZW1wbGF0ZTogXFwnaW1nLXd5c2l3eWdcXCcsIF9zcmM6ICcgKyBiaW5kaW5nVmFsdWUgKyAnLCBfd2lkdGg6ICcgKyB3aWR0aCArICcsIF9oZWlnaHQ6ICcgKyBoZWlnaHQgKyAnLCBfYWxpZ246ICcgKyAoYWxpZ24gPT09IG51bGwgPyB1bmRlZmluZWQgOiAnXFwnJyArIGFsaWduICsgJ1xcJycpICsgJywgX3NpemU6ICcgKyBzaXplICsgJywgX21ldGhvZDogJyArIG1ldGhvZCArICcsIF9wbGFjZWhvbGRlcnNyYzogJyArIHBsYWNlaG9sZGVyc3JjICsgJywgX3N0eWxlYmluZDogJyArIGNvbnRhaW5lckJpbmQgKyAnIH0gLS0+Jyk7XG4gICAgICAkKGVsZW1lbnQpLmFmdGVyKCc8IS0tIC9rbyAtLT4nKTtcbiAgICB9XG5cbiAgfSk7XG5cbiAgLy8gQXBwbGllZCBhZnRlciB0aGUgZGF0YS1lZGl0YWJsZSBzbyB0byBhdm9pZCBwcm9jZXNzaW5nIGhyZWZzIGZvciBlZGl0YWJsZSBjb250ZW50XG4gICQoXCJbaHJlZl1cIiwgZWxlbWVudCkuZWFjaChmdW5jdGlvbihpbmRleCwgZWxlbWVudCkge1xuICAgIHZhciBhdHRyVmFsdWUgPSBkb211dGlscy5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ2hyZWYnKTtcbiAgICB2YXIgbmV3QmluZGluZyA9ICd3eXNpd3lnSHJlZjogXFwnJyArIGNvbnZlcnRlclV0aWxzLmFkZFNsYXNoZXMoYXR0clZhbHVlKSArICdcXCcnO1xuICAgIHZhciBjdXJyZW50QmluZGluZ3MgPSBkb211dGlscy5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ2RhdGEtYmluZCcpO1xuICAgIHZhciBkYXRhQmluZCA9IChjdXJyZW50QmluZGluZ3MgIT09IG51bGwgPyBjdXJyZW50QmluZGluZ3MgKyBcIiwgXCIgOiBcIlwiKSArIG5ld0JpbmRpbmc7XG4gICAgZG9tdXRpbHMuc2V0QXR0cmlidXRlKGVsZW1lbnQsICdkYXRhLWJpbmQnLCBkYXRhQmluZCk7XG4gIH0pO1xuXG4gICQoXCJyZXBsYWNlZGJsb2NrXCIsIGVsZW1lbnQpLmVhY2goZnVuY3Rpb24oaW5kZXgsIGVsZW1lbnQpIHtcbiAgICB2YXIgYmxvY2tFbGVtZW50ID0gZml4ZWRCbG9ja3NbaW5kZXhdO1xuXG4gICAgdmFyIGJsb2NrTmFtZSA9IHByb2Nlc3NCbG9jayhibG9ja0VsZW1lbnQsIGRlZnMsIHRoZW1lVXBkYXRlciwgYmxvY2tQdXNoZXIsIHRlbXBsYXRlVXJsQ29udmVydGVyLCAnYmxvY2snLCB0ZW1wbGF0ZU5hbWUsIGNvbnRhaW5lck5hbWUsIHRydWUsIHRlbXBsYXRlQ3JlYXRvcik7XG4gICAgLy8gcmVwbGFjZWQgYmxvY2tzIGFyZSBkZWZpbmVkIGluIHRoZSBtb2RlbCByb290XG4gICAgdmFyIG1vZGVsQmluZFZhbHVlID0gbW9kZWxEZWYuZW5zdXJlUGF0aEFuZEdldEJpbmRWYWx1ZShkZWZzLCB0aGVtZVVwZGF0ZXIsIHJvb3RNb2RlbE5hbWUsIHRlbXBsYXRlTmFtZSwgJycsIGJsb2NrTmFtZSk7XG5cbiAgICAvLyB0aGlzIHdheSB3ZSBjYWxsIGJsb2NrLXd5c2l3eWcgb3IgYmxvY2stc2hvdyBhbmQgbm90IGRpcmVjdGx5IHRoZSByaWdodCBibG9ja1xuICAgICQoZWxlbWVudCkuYmVmb3JlKCc8IS0tIGtvIGJsb2NrOiB7IGRhdGE6ICcgKyBjb252ZXJ0ZXJVdGlscy5hZGRTbGFzaGVzKG1vZGVsQmluZFZhbHVlKSArICcsIHRlbXBsYXRlOiBcXCdibG9ja1xcJyB9IC0tPicpO1xuICAgICQoZWxlbWVudCkuYWZ0ZXIoJzwhLS0gL2tvIC0tPicpO1xuICAgICQoZWxlbWVudCkucmVtb3ZlKCk7XG4gIH0pO1xuXG4gIC8vIFRPRE8gZG8gd2UgcmVhbGx5IG5lZWQgdG8gbG9vcCBpbiByZXZlcnNlIG9yZGVyP1xuICAvLyBkYXRhLWtvLXdyYXAgaGF2ZSB0byBiZSBwcm9jZXNzZWQgYXQgdGhlIGVuZCwgZXhwZWNpYWxseSBhZnRlciBcInJlcGxhY2VibG9ja3NcIlxuICAvLyBvdGhlcndpc2UgYSBkYXRhLWtvLXdyYXAgd3JhcHBpbmcgYSBkYXRhLWtvLWJsb2NrIHdvdWxkIGJyZWFrIGV2ZXJ5dGhpbmcuXG4gICQoJChcIltkYXRhLWtvLXdyYXBdXCIsIGVsZW1lbnQpLmdldCgpLnJldmVyc2UoKSwgZWxlbWVudCkuZWFjaChmdW5jdGlvbihpbmRleCwgZWxlbWVudCkge1xuICAgIHZhciBjb25kID0gZG9tdXRpbHMuZ2V0QXR0cmlidXRlKGVsZW1lbnQsICdkYXRhLWtvLXdyYXAnKTtcbiAgICBpZiAodHlwZW9mIGNvbmQgPT09ICd1bmRlZmluZWQnIHx8IGNvbmQgPT09ICcnIHx8IGNvbmQgPT09ICd0cnVlJykge1xuICAgICAgdGhyb3cgXCJVbnN1cHBvcnRlZCBlbXB0eSB2YWx1ZSBmb3IgZGF0YS1rby13cmFwOiB1c2UgZmFsc2UgdmFsdWUgaWYgeW91IHdhbnQgdG8gYWx3YXlzIHJlbW92ZSB0aGUgdGFnXCI7XG4gICAgfVxuXG4gICAgdmFyIGNvbmRCaW5kaW5nID0gY29udmVydGVyVXRpbHMuY29uZGl0aW9uQmluZGluZyhjb25kLCBiaW5kaW5nUHJvdmlkZXIpO1xuXG4gICAgLypcbiAgICAgICAgICB2YXIgY29uZEJpbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbmQgPT09ICd1bmRlZmluZWQnIHx8IGNvbmQgPT09ICcnKSB7XG4gICAgICAgICAgICB0aHJvdyBcIlVuc3VwcG9ydGVkIGVtcHR5IHZhbHVlIGZvciBkYXRhLWtvLXdyYXA6IHVzZSBmYWxzZSB2YWx1ZSBpZiB5b3Ugd2FudCB0byBhbHdheXMgcmVtb3ZlIHRoZSB0YWdcIjtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbmQgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgIGNvbmRCaW5kaW5nID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb25kID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgIHRocm93IFwiVW5zdXBwb3J0ZWQgdHJ1ZSB2YWx1ZSBmb3IgZGF0YS1rby13cmFwLiBUaGlzIG1ha2VzIG5vIHNlbnNlOiB1c2UgZmFsc2Ugb3IgYSB2YXJpYWJsZVwiO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25kQmluZGluZyA9IGJpbmRpbmdQcm92aWRlcihjb25kKSsnKCknO1xuICAgICAgICAgIH1cbiAgICAqL1xuXG4gICAgdmFyIGRhdGFCaW5kID0gZG9tdXRpbHMuZ2V0QXR0cmlidXRlKGVsZW1lbnQsICdkYXRhLWJpbmQnKTtcblxuICAgIHZhciBpbm5lclRtcGxOYW1lLCBvdXRlclRtcGxOYW1lO1xuICAgIC8vIFRPRE8gdWdseSBoYXJkY29kZWQgaGFuZGxpbmc6IGF0IHRoZSB2ZXJ5IGxlYXN0IHRoaXMgc2hvdWxkIGJlIGludm9rZWQgYnkgdGhlIGRhdGEtY29udGFpbmVyIGNhbGxlci5cbiAgICBpZiAoZGF0YUJpbmQgIT09ICcnICYmIGRhdGFCaW5kICE9PSBudWxsICYmIGRhdGFCaW5kLm1hdGNoKC8oYmxvY2t8d3lzaXd5Z09ySHRtbCk6LykpIHtcbiAgICAgIC8vIHdlIGNhbid0IHB1dCB0aGUgY29udGVudCBpbiBhIHRlbXBsYXRlIGJlY2F1c2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgYmluZGluZ1xuICAgICAgdmFyIGlubmVyVG1wbENvbnRlbnQgPSAnPCEtLSBrbyAnICsgZGF0YUJpbmQgKyAnIC0tPicgKyBkb211dGlscy5nZXRJbm5lckh0bWwoZWxlbWVudCkgKyAnPCEtLSAva28gLS0+JztcbiAgICAgIGlubmVyVG1wbE5hbWUgPSB0ZW1wbGF0ZUNyZWF0b3IoaW5uZXJUbXBsQ29udGVudCk7XG4gICAgICBkb211dGlscy5yZW1vdmVBdHRyaWJ1dGUoZWxlbWVudCwgJ2RhdGEta28td3JhcCcpO1xuICAgICAgb3V0ZXJUbXBsTmFtZSA9IHRlbXBsYXRlQ3JlYXRvcihlbGVtZW50KTtcbiAgICAgIGRvbXV0aWxzLnJlcGxhY2VIdG1sKGVsZW1lbnQsICc8IS0tIGtvIHRlbXBsYXRlOiAvKiBzcGVjaWFsICovICh0eXBlb2YgdGVtcGxhdGVNb2RlICE9IFxcJ3VuZGVmaW5lZFxcJyAmJiB0ZW1wbGF0ZU1vZGUgPT0gXFwnd3lzaXd5Z1xcJykgfHwgJyArIGNvbmRCaW5kaW5nICsgJyA/IFxcJycgKyBvdXRlclRtcGxOYW1lICsgJ1xcJyA6IFxcJycgKyBpbm5lclRtcGxOYW1lICsgJ1xcJyAtLT48IS0tIC9rbyAtLT4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gd2UgcHV0IHRoZSBjb250ZW50IGluIGEgdGVtcGxhdGUgYW5kIHRoZSBmcmFtZSBpbiBhbm90aGVyIHRlbXBsYXRlIGluY2x1ZGluZyB0aGlzIG9uZS5cbiAgICAgIGlubmVyVG1wbE5hbWUgPSB0ZW1wbGF0ZUNyZWF0b3IoZG9tdXRpbHMuZ2V0SW5uZXJIdG1sKGVsZW1lbnQpKTtcbiAgICAgIGRvbXV0aWxzLnJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCAnZGF0YS1rby13cmFwJyk7XG4gICAgICBkb211dGlscy5zZXRDb250ZW50KGVsZW1lbnQsICc8IS0tIGtvIHRlbXBsYXRlOiBcXCcnICsgaW5uZXJUbXBsTmFtZSArICdcXCcgLS0+PCEtLSAva28gLS0+Jyk7XG4gICAgICBvdXRlclRtcGxOYW1lID0gdGVtcGxhdGVDcmVhdG9yKGVsZW1lbnQpO1xuICAgICAgZG9tdXRpbHMucmVwbGFjZUh0bWwoZWxlbWVudCwgJzwhLS0ga28gdGVtcGxhdGU6ICh0eXBlb2YgdGVtcGxhdGVNb2RlICE9IFxcJ3VuZGVmaW5lZFxcJyAmJiB0ZW1wbGF0ZU1vZGUgPT0gXFwnd3lzaXd5Z1xcJykgfHwgJyArIGNvbmRCaW5kaW5nICsgJyA/IFxcJycgKyBvdXRlclRtcGxOYW1lICsgJ1xcJyA6IFxcJycgKyBpbm5lclRtcGxOYW1lICsgJ1xcJyAtLT48IS0tIC9rbyAtLT4nKTtcbiAgICB9XG5cbiAgfSk7XG5cbiAgdGVtcGxhdGVDcmVhdG9yKGVsZW1lbnQsIHRlbXBsYXRlTmFtZSwgJ3Nob3cnKTtcblxuICBibG9ja1B1c2hlcihyb290TW9kZWxOYW1lLCB0ZW1wbGF0ZU5hbWUsIGNvbnRleHROYW1lLCBjb250YWluZXJOYW1lKTtcblxuICByZXR1cm4gdGVtcGxhdGVOYW1lO1xuXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXhjZXB0aW9uIHdoaWxlIHBhcnNpbmcgdGhlIHRlbXBsYXRlXCIsIGUsIGVsZW1lbnQpO1xuICAgIHRocm93IGU7XG4gIH1cblxufTtcblxuZnVuY3Rpb24gY29uZGl0aW9uYWxfcmVwbGFjZShodG1sKSB7XG4gIHJldHVybiBodG1sLnJlcGxhY2UoLzwhLS1cXFtpZiAoW15cXF1dKilcXF0+KCg/Oig/IS0tKVtcXHNcXFNdKSo/KTwhXFxbZW5kaWZcXF0tLT4vZywgZnVuY3Rpb24obWF0Y2gsIGNvbmRpdGlvbiwgYm9keSkge1xuICAgIHZhciBkZCA9ICc8IS0tIGNjOnN0YXJ0IC0tPic7XG4gICAgZGQgKz0gYm9keS5yZXBsYWNlKC88KFtBLVphLXo6XSspL2csICc8IS0tIGNjOmJvOiQxIC0tPjxjYycpIC8vIGJlZm9yZSBvcGVuIHRhZ1xuICAgICAgICAgICAucmVwbGFjZSgvPFxcLyhbQS1aYS16Ol0rKT4vZywnPCEtLSBjYzpiYzokMSAtLT48L2NjPjwhLS0gY2M6YWM6JDEgLS0+JykgLy8gYmVmb3JlL2FmdGVyIGNsb3NlIHRhZ1xuICAgICAgICAgICAucmVwbGFjZSgvXFwvPi9nLCcvPjwhLS0gY2M6c2MgLS0+Jyk7IC8vIHNlbGYtY2xvc2UgdGFnXG4gICAgZGQgKz0gJzwhLS0gY2M6ZW5kIC0tPic7XG4gICAgdmFyIG91dHB1dCA9ICc8cmVwbGFjZWRjYyBjb25kaXRpb249XCInK2NvbmRpdGlvbisnXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lXCI+JztcbiAgICBvdXRwdXQgKz0gJCgnPGRpdj4nKS5hcHBlbmQoJChkZCkpLmh0bWwoKVxuICAgICAgLnJlcGxhY2UoL148IS0tIGNjOnN0YXJ0IC0tPi8sICcnKVxuICAgICAgLnJlcGxhY2UoLzwhLS0gY2M6ZW5kIC0tPiQvLCAnJyk7XG4gICAgb3V0cHV0ICs9ICc8L3JlcGxhY2VkY2M+JztcbiAgICByZXR1cm4gb3V0cHV0O1xuICB9KTtcbn1cblxuXG52YXIgdHJhbnNsYXRlVGVtcGxhdGUgPSBmdW5jdGlvbih0ZW1wbGF0ZU5hbWUsIGh0bWwsIHRlbXBsYXRlVXJsQ29udmVydGVyLCB0ZW1wbGF0ZUNyZWF0b3IpIHtcbiAgdmFyIGRlZnMgPSB7fTtcbiAgdmFyIHJlcGxhY2VkSHRtbCA9IGNvbmRpdGlvbmFsX3JlcGxhY2UoaHRtbC5yZXBsYWNlKC8oPFtePl0rXFxzKShzdHlsZXxodHRwLWVxdWl2KSg9XCJbXlwiXSpcIltePl0qPikvZ2ksIGZ1bmN0aW9uKG1hdGNoLCBwMSwgcDIsIHAzKSB7XG4gICAgcmV0dXJuIHAxICsgJ3JlcGxhY2VkJyArIHAyICsgcDM7XG4gIH0pKTtcbiAgdmFyIGNvbnRlbnQgPSAkKHJlcGxhY2VkSHRtbCk7XG4gIHZhciBlbGVtZW50ID0gY29udGVudFswXTtcblxuICB2YXIgYmxvY2tzID0gW107IC8vIHtyb290TmFtZSwgYmxvY2tOYW1lLCBjb250YWluZXJOYW1lfVxuICB2YXIgX2Jsb2NrUHVzaGVyID0gZnVuY3Rpb24ocm9vdE5hbWUsIGJsb2NrTmFtZSwgY29udGV4dE5hbWUsIGNvbnRhaW5lck5hbWUpIHtcbiAgICBibG9ja3MucHVzaCh7XG4gICAgICByb290OiByb290TmFtZSxcbiAgICAgIGJsb2NrOiBibG9ja05hbWUsXG4gICAgICBjb250ZXh0OiBjb250ZXh0TmFtZSxcbiAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyTmFtZVxuICAgIH0pO1xuICB9O1xuXG4gIC8vIFRPRE8gaGF2ZSB0byBhY2NlcHQgbnVsbHMgYXMgdW5kZWZpbmVkcyAoYmVjYXVzZSBvZiBtb2RlbC5qcyBiZWhhdmlvdXIpXG4gIHZhciB0aGVtZVVwZGF0ZXIgPSBmdW5jdGlvbihuYW1lLCBrZXksIHZhbCkge1xuICAgIGlmICh0eXBlb2YgZGVmc1sndGhlbWVzJ10gPT09ICd1bmRlZmluZWQnKSBkZWZzWyd0aGVtZXMnXSA9IHt9O1xuICAgIGlmICh0eXBlb2YgZGVmc1sndGhlbWVzJ11bbmFtZV0gPT09ICd1bmRlZmluZWQnKSBkZWZzWyd0aGVtZXMnXVtuYW1lXSA9IHt9O1xuICAgIGlmICh0eXBlb2YgZGVmc1sndGhlbWVzJ11bbmFtZV1ba2V5XSA9PT0gJ3VuZGVmaW5lZCcgfHwgZGVmc1sndGhlbWVzJ11bbmFtZV1ba2V5XSA9PT0gbnVsbCkgZGVmc1sndGhlbWVzJ11bbmFtZV1ba2V5XSA9IHZhbDtcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsICE9PSAndW5kZWZpbmVkJyAmJiB2YWwgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmVjVmFsID0gZGVmc1sndGhlbWVzJ11bbmFtZV1ba2V5XTtcbiAgICAgIGlmIChwcmVjVmFsICE9IHZhbCkgY29uc29sZS5sb2coXCJFcnJvciBzZXR0aW5nIGEgbmV3IGRlZmF1bHQgZm9yIHByb3BlcnR5IFwiICsga2V5ICsgXCIgaW4gdGhlbWUgXCIgKyBuYW1lICsgXCIuIG9sZDpcIiArIHByZWNWYWwgKyBcIiBuZXc6XCIgKyB2YWwgKyBcIiFcIik7XG4gICAgfVxuICB9O1xuXG4gIHZhciBjb250YWluZXJzID0gJChcIltkYXRhLWtvLWNvbnRhaW5lcl1cIiwgY29udGVudCk7XG4gIHZhciBjb250YWluZXJzRG9tID0ge307XG4gIGNvbnRhaW5lcnMuZWFjaChmdW5jdGlvbihpbmRleCwgZWxlbWVudCkge1xuICAgIHZhciBjb250YWluZXJOYW1lID0gZG9tdXRpbHMuZ2V0QXR0cmlidXRlKGVsZW1lbnQsICdkYXRhLWtvLWNvbnRhaW5lcicpICsgXCJCbG9ja3NcIjtcblxuICAgIGRvbXV0aWxzLnJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCAnZGF0YS1rby1jb250YWluZXInKTtcbiAgICBkb211dGlscy5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ2RhdGEtYmluZCcsICdibG9jazogJyArIGNvbnRhaW5lck5hbWUpO1xuXG4gICAgdmFyIGNvbnRhaW5lckJsb2NrcyA9ICQoXCI+IFtkYXRhLWtvLWJsb2NrXVwiLCBlbGVtZW50KTtcbiAgICBkb211dGlscy5yZW1vdmVFbGVtZW50cyhjb250YWluZXJCbG9ja3MsIHRydWUpO1xuXG4gICAgY29udGFpbmVyc0RvbVtjb250YWluZXJOYW1lXSA9IGNvbnRhaW5lckJsb2NrcztcbiAgfSk7XG5cbiAgLy8gVE9ETyByZW1vdmUgaGFyZGNvZGVkIHByb3BlcnRpZXM6IHdlIG5lZWQgdGhlbSBiZWNhdXNlIHdpdGhvdXQgdGhlc2UgbG9hZGluZyBhIGJhc2ljIHRlbXBsYXRlIGZhaWxzLlxuICAvLyBOZWVkZWQgaW4gb3JkZXIgdG8gdXNlIGRhdGEta28tYmxvY2tcbiAgbW9kZWxEZWYuY3JlYXRlT3JVcGRhdGVCbG9ja0RlZihkZWZzLCAnaWQnKTtcbiAgLy8gTmVlZGVkIGFsd2F5cyBhcyBpdCBpcyB0aGUgZGVmYXVsdCB0aGVtZSBzZWN0aW9uLlxuICBtb2RlbERlZi5jcmVhdGVPclVwZGF0ZUJsb2NrRGVmKGRlZnMsICdib2R5VGhlbWUnKTtcbiAgLy8gTmVlZGVkIGZvciBkYXRhLWtvLWNvbnRhaW5lclxuICBtb2RlbERlZi5jcmVhdGVPclVwZGF0ZUJsb2NrRGVmKGRlZnMsICdibG9ja3MnLCAnYmxvY2tzW10nKTtcblxuICAvLyBOZWVkZWQgaWYgeW91IHdhbnQgdG8gdXNlIGEgdGV4dCB2YXJpYWJsZT8gVE9ETyB0aGlzIHNob3VsZCBub3QgYmUgbmVlZGVkIVxuICBtb2RlbERlZi5jcmVhdGVPclVwZGF0ZUJsb2NrRGVmKGRlZnMsICd0ZXh0Jyk7XG5cbiAgcHJvY2Vzc0Jsb2NrKGVsZW1lbnQsIGRlZnMsIHRoZW1lVXBkYXRlciwgX2Jsb2NrUHVzaGVyLCB0ZW1wbGF0ZVVybENvbnZlcnRlciwgJ3RlbXBsYXRlJywgdGVtcGxhdGVOYW1lLCB1bmRlZmluZWQsIGZhbHNlLCB0ZW1wbGF0ZUNyZWF0b3IpO1xuXG4gIHZhciBibG9ja1Byb2Nlc3MgPSBmdW5jdGlvbihjb250YWluZXJOYW1lLCBpbmRleCwgZWxlbWVudCkge1xuICAgIHByb2Nlc3NCbG9jayhlbGVtZW50LCBkZWZzLCB0aGVtZVVwZGF0ZXIsIF9ibG9ja1B1c2hlciwgdGVtcGxhdGVVcmxDb252ZXJ0ZXIsICdibG9jaycsIHRlbXBsYXRlTmFtZSwgY29udGFpbmVyTmFtZSwgdHJ1ZSwgdGVtcGxhdGVDcmVhdG9yKTtcbiAgfTtcblxuICBmb3IgKHZhciBwcm9wIGluIGNvbnRhaW5lcnNEb20pXG4gICAgaWYgKGNvbnRhaW5lcnNEb20uaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgIHZhciBjb250YWluZXJCbG9ja3MgPSBjb250YWluZXJzRG9tW3Byb3BdO1xuICAgICAgdmFyIGNvbnRhaW5lck5hbWUgPSBwcm9wO1xuXG4gICAgICBtb2RlbERlZi5lbnN1cmVQYXRoQW5kR2V0QmluZFZhbHVlKGRlZnMsIHRoZW1lVXBkYXRlciwgdGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZU5hbWUsICcnLCBjb250YWluZXJOYW1lICsgXCIuYmxvY2tzXCIsIFwiW11cIik7XG5cbiAgICAgIGNvbnRhaW5lckJsb2Nrcy5lYWNoKGJsb2NrUHJvY2Vzcy5iaW5kKHVuZGVmaW5lZCwgY29udGFpbmVyTmFtZSkpO1xuICAgIH1cblxuICB2YXIgdGVtcGxhdGVEZWYgPSB7XG4gICAgX2RlZnM6IGRlZnMsXG4gICAgdGVtcGxhdGVOYW1lOiB0ZW1wbGF0ZU5hbWUsXG4gICAgX2Jsb2NrczogYmxvY2tzXG4gIH07XG5cbiAgaWYgKHR5cGVvZiBkZWZzW3RlbXBsYXRlTmFtZV0uX3ZlcnNpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGVtcGxhdGVEZWYudmVyc2lvbiA9IGRlZnNbdGVtcGxhdGVOYW1lXS5fdmVyc2lvbjtcbiAgfVxuXG4gIHJldHVybiB0ZW1wbGF0ZURlZjtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSB0cmFuc2xhdGVUZW1wbGF0ZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gUGFyc2VzIENTUy9zdHlsZXNoZWV0cyBkZWNsYXJhdGlvbnMgLWtvLWJsb2NrZGVmcy8ta28tdGhlbWVzXG4vLyBJdCByZXR1cm5zIEtPIGJpbmRpbmdzIGJ1dCBkb2Vzbid0IGRlcGVuZCBvbiBLT1xuLy8gTmVlZHMgYSBiaW5kaW5nUHJvdmlkZXJcbi8vIEFsc28gdXNlcyBhIGJsb2NrRGVmc1VwZGF0ZXIgdG8gdXBkYXRlIGRlZmluaXRpb25zIHdoaWxlIHBhcnNpbmcgdGhlIHN0eWxlc2hlZXQuXG5cbnZhciBjc3NQYXJzZSA9IHJlcXVpcmUoXCJtZW5zY2gvbGliL3BhcnNlci5qc1wiKTtcbnZhciBjb25zb2xlID0gcmVxdWlyZShcImNvbnNvbGVcIik7XG52YXIgY29udmVydGVyVXRpbHMgPSByZXF1aXJlKFwiLi91dGlscy5qc1wiKTtcbnZhciBlbGFib3JhdGVEZWNsYXJhdGlvbnMgPSByZXF1aXJlKFwiLi9kZWNsYXJhdGlvbnMuanNcIik7XG5cbi8qIFRlbXBvcmFyeSBleHBlcmltZW50YWwgY29kZSBub3QgdXNlZFxudmFyIF9wcm9jZXNzU3R5bGVTaGVldFJ1bGVzX3Byb2Nlc3NUaGVtZXMgPSBmdW5jdGlvbiAoYmluZGluZ1Byb3ZpZGVyLCB0aGVtZVVwZGF0ZXIsIHJ1bGVzKSB7XG4gIHZhciBzZWxzLCBkZWNscywgaSwgaiwgaztcbiAgZm9yKCBpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJ1bGVzW2ldLnR5cGUgPT0gJ3J1bGUnKSB7XG4gICAgICBzZWxzID0gcnVsZXNbaV0uc2VsZWN0b3JzO1xuICAgICAgZGVjbHMgPSBydWxlc1tpXS5kZWNsYXJhdGlvbnM7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgc2Vscy5sZW5ndGg7IGorKykge1xuICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZGVjbHMubGVuZ3RoOyBrKyspIGlmIChkZWNsc1trXS50eXBlID09ICdwcm9wZXJ0eScpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGJpbmRWYWwgPSBiaW5kaW5nUHJvdmlkZXIoJyQnK2RlY2xzW2tdLm5hbWUpO1xuICAgICAgICAgICAgdGhlbWVVcGRhdGVyKHNlbHNbal0sIGRlY2xzW2tdLm5hbWUsIGRlY2xzW2tdLnZhbHVlLCBiaW5kVmFsKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkV4Y2VwdGlvbiBzZXR0aW5nIHRoZW1lIGZvclwiLCBkZWNsc1trXS5uYW1lLCBkZWNsc1trXS52YWx1ZSwgZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuKi9cblxudmFyIF9wcm9jZXNzU3R5bGVTaGVldFJ1bGVzX3Byb2Nlc3NCbG9ja0RlZiA9IGZ1bmN0aW9uKGJsb2NrRGVmc1VwZGF0ZXIsIHJ1bGVzKSB7XG4gIHZhciBwcm9wZXJ0aWVzLCBuYW1lZFByb3BzLCBkZWNscztcbiAgLy8gbmFtZSwgY29udGV4dE5hbWUsIGdsb2JhbFN0eWxlLCB0aGVtZU92ZXJyaWRlLCBleHRlbmQsIG1pbiwgbWF4LCB3aWRnZXQsIG9wdGlvbnMsIGNhdGVnb3J5LCB2YXJpYW50LCBoZWxwLCBibG9ja0Rlc2NyaXB0aW9uLCB2ZXJzaW9uLCBcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChydWxlc1tpXS50eXBlID09ICdydWxlJykge1xuICAgICAgdmFyIHNlbHMgPSBydWxlc1tpXS5zZWxlY3RvcnM7XG4gICAgICB2YXIgaGFzRGVjbGFyYXRpb25zID0gZmFsc2U7XG4gICAgICB2YXIgaGFzUHJldmlld3MgPSBmYWxzZTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2Vscy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoc2Vsc1tqXS5tYXRjaCgvOnByZXZpZXckLykpIHtcbiAgICAgICAgICBoYXNQcmV2aWV3cyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFzRGVjbGFyYXRpb25zID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGhhc1ByZXZpZXdzICYmIGhhc0RlY2xhcmF0aW9ucykge1xuICAgICAgICBjb25zb2xlLmxvZyhcImNhbm5vdCBtaXggc2VsZWN0b3JzIHR5cGUgKDpwcmV2aWV3IGFuZCBkZWNsYXJhdGlvbnMpIGluIEBzdXBwb3J0cyAta28tYmxvY2tkZWZzIFwiLCBzZWxzKTtcbiAgICAgICAgdGhyb3cgXCJDYW5ub3QgbWl4IHNlbGVjdG9ycyB0eXBlICg6cHJldmlldyBhbmQgZGVjbGFyYXRpb25zKSBpbiBAc3VwcG9ydHMgLWtvLWJsb2NrZGVmc1wiO1xuICAgICAgfVxuICAgICAgaWYgKCFoYXNQcmV2aWV3cyAmJiAhaGFzRGVjbGFyYXRpb25zKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiY2Fubm90IGZpbmQga25vd24gc2VsZWN0b3JzIGluIEBzdXBwb3J0cyAta28tYmxvY2tkZWZzIFwiLCBzZWxzKTtcbiAgICAgICAgdGhyb3cgXCJDYW5ub3QgZmluZCBrbm93biBzZWxlY3RvcnMgaW4gQHN1cHBvcnRzIC1rby1ibG9ja2RlZnNcIjtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNEZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgcHJvcGVydGllcyA9ICcnO1xuICAgICAgICBuYW1lZFByb3BzID0ge307XG5cbi8qXG4gICAgICAgIG5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRleHROYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICBnbG9iYWxTdHlsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhlbWVPdmVycmlkZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgZXh0ZW5kID0gdW5kZWZpbmVkO1xuICAgICAgICBtYXggPSB1bmRlZmluZWQ7XG4gICAgICAgIG1pbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgd2lkZ2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICBvcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICBjYXRlZ29yeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyaWFudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaGVscCA9IHVuZGVmaW5lZDtcbiAgICAgICAgYmxvY2tEZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmVyc2lvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgKi9cbiAgICAgICAgZGVjbHMgPSBydWxlc1tpXS5kZWNsYXJhdGlvbnM7XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgZGVjbHMubGVuZ3RoOyBrKyspIGlmIChkZWNsc1trXS50eXBlID09ICdwcm9wZXJ0eScpIHtcbiAgICAgICAgICBpZiAoZGVjbHNba10ubmFtZSA9PSAnbGFiZWwnKSBuYW1lZFByb3BzLm5hbWUgPSBkZWNsc1trXS52YWx1ZTtcbiAgICAgICAgICBlbHNlIGlmIChkZWNsc1trXS5uYW1lID09ICdjb250ZXh0JykgbmFtZWRQcm9wcy5jb250ZXh0TmFtZSA9IGRlY2xzW2tdLnZhbHVlO1xuICAgICAgICAgIGVsc2UgaWYgKGRlY2xzW2tdLm5hbWUgPT0gJ3Byb3BlcnRpZXMnKSBwcm9wZXJ0aWVzID0gZGVjbHNba10udmFsdWU7XG4gICAgICAgICAgZWxzZSBpZiAoZGVjbHNba10ubmFtZSA9PSAndGhlbWUnKSBuYW1lZFByb3BzLmdsb2JhbFN0eWxlID0gJ190aGVtZV8uJyArIGRlY2xzW2tdLnZhbHVlO1xuICAgICAgICAgIGVsc2UgaWYgKGRlY2xzW2tdLm5hbWUgPT0gJ3RoZW1lT3ZlcnJpZGUnKSBuYW1lZFByb3BzLnRoZW1lT3ZlcnJpZGUgPSBTdHJpbmcoZGVjbHNba10udmFsdWUpLnRvTG93ZXJDYXNlKCkgPT0gJ3RydWUnO1xuICAgICAgICAgIC8vIGVsc2UgaWYgKGRlY2xzW2tdLm5hbWUgPT0gJ2V4dGVuZCcpIGV4dGVuZCA9IGRlY2xzW2tdLnZhbHVlO1xuXG4gICAgICAgICAgLy8gZWxzZSBpZiAoZGVjbHNba10ubmFtZSA9PSAnbWF4JykgbWF4ID0gZGVjbHNba10udmFsdWU7XG4gICAgICAgICAgLy8gZWxzZSBpZiAoZGVjbHNba10ubmFtZSA9PSAnbWluJykgbWluID0gZGVjbHNba10udmFsdWU7XG4gICAgICAgICAgLy8gZWxzZSBpZiAoZGVjbHNba10ubmFtZSA9PSAnb3B0aW9ucycpIG9wdGlvbnMgPSBkZWNsc1trXS52YWx1ZTtcblxuICAgICAgICAgIC8vIGVsc2UgaWYgKGRlY2xzW2tdLm5hbWUgPT0gJ3dpZGdldCcpIHdpZGdldCA9IGRlY2xzW2tdLnZhbHVlO1xuICAgICAgICAgIC8vIGVsc2UgaWYgKGRlY2xzW2tdLm5hbWUgPT0gJ2NhdGVnb3J5JykgY2F0ZWdvcnkgPSBkZWNsc1trXS52YWx1ZTtcbiAgICAgICAgICAvLyBlbHNlIGlmIChkZWNsc1trXS5uYW1lID09ICd2YXJpYW50JykgdmFyaWFudCA9IGRlY2xzW2tdLnZhbHVlO1xuICAgICAgICAgIC8vIGVsc2UgaWYgKGRlY2xzW2tdLm5hbWUgPT0gJ2hlbHAnKSBoZWxwID0gZGVjbHNba10udmFsdWU7XG4gICAgICAgICAgLy8gZWxzZSBpZiAoZGVjbHNba10ubmFtZSA9PSAnYmxvY2tEZXNjcmlwdGlvbicpIGJsb2NrRGVzY3JpcHRpb24gPSBkZWNsc1trXS52YWx1ZTtcbiAgICAgICAgICAvLyBlbHNlIGlmIChkZWNsc1trXS5uYW1lID09ICd2ZXJzaW9uJykgdmVyc2lvbiA9IGRlY2xzW2tdLnZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmFtZWRQcm9wc1tkZWNsc1trXS5uYW1lXSA9IGRlY2xzW2tdLnZhbHVlO1xuICAgICAgICAgICAgLy8gVE9ETyBpbiBwYXN0IHdlIGRldGVjdGVkIHVuc3VwcG9ydGVkIHByb3BlcnRpZXMsIHdoaWxlIG5vdyB3ZSBzaW1wbGUgcHVzaCBldmVyeSBkZWNsYXJhdGlvbiBpbiBhIG5hbWVkUHJvcGVydHkuXG4gICAgICAgICAgICAvLyBUaGlzIG1ha2UgaXQgaGFyZGVyIHRvIHNwb3QgZXJyb3JzIGluIGRlY2xhcmF0aW9ucy5cbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihcIlVua25vd24gcHJvcGVydHkgcHJvY2Vzc2luZyBAc3VwcG9ydHMgLWtvLWJsb2NrZGVmcyBcIiwgZGVjbHNba10sIHNlbHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IHNlbHMubGVuZ3RoOyBsKyspIHtcbiAgICAgICAgICBibG9ja0RlZnNVcGRhdGVyKHNlbHNbbF0sIHByb3BlcnRpZXMsIG5hbWVkUHJvcHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaGFzUHJldmlld3MpIHtcbiAgICAgICAgZm9yICh2YXIgbSA9IDA7IG0gPCBzZWxzLmxlbmd0aDsgbSsrKSB7XG4gICAgICAgICAgdmFyIGxvY2FsQmxvY2tOYW1lID0gc2Vsc1ttXS5zdWJzdHIoMCwgc2Vsc1ttXS5pbmRleE9mKCc6JykpO1xuICAgICAgICAgIHZhciBwcmV2aWV3QmluZGluZ3MgPSBydWxlc1tpXS5kZWNsYXJhdGlvbnM7XG4gICAgICAgICAgYmxvY2tEZWZzVXBkYXRlcihsb2NhbEJsb2NrTmFtZSwgdW5kZWZpbmVkLCB7IHByZXZpZXdCaW5kaW5nczogcHJldmlld0JpbmRpbmdzIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWdub3JpbmcgY29tbWVudHMgb3Igb3RoZXIgY29udGVudFxuICAgIH1cbiAgfVxufTtcblxudmFyIHByb2Nlc3NTdHlsZXNoZWV0UnVsZXMgPSBmdW5jdGlvbihzdHlsZSwgcnVsZXMsIGxvY2FsV2l0aEJpbmRpbmdQcm92aWRlciwgYmxvY2tEZWZzVXBkYXRlciwgdGhlbWVVcGRhdGVyLCB0ZW1wbGF0ZVVybENvbnZlcnRlciwgcm9vdE1vZGVsTmFtZSwgdGVtcGxhdGVOYW1lKSB7XG4gIHZhciBuZXdTdHlsZSA9IHN0eWxlO1xuICB2YXIgbGFzdFN0YXJ0ID0gbnVsbDtcblxuICBpZiAodHlwZW9mIHJ1bGVzID09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIHN0eWxlU2hlZXQgPSBjc3NQYXJzZShzdHlsZSwge1xuICAgICAgY29tbWVudHM6IHRydWUsXG4gICAgICBwb3NpdGlvbjogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChzdHlsZVNoZWV0LnR5cGUgIT0gJ3N0eWxlc2hlZXQnIHx8IHR5cGVvZiBzdHlsZVNoZWV0LnN0eWxlc2hlZXQgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwidW5hYmxlIHRvIHByb2Nlc3Mgc3R5bGVTaGVldFwiLCBzdHlsZVNoZWV0KTtcbiAgICAgIHRocm93IFwiVW5hYmxlIHRvIHBhcnNlIHN0eWxlc2hlZXRcIjtcbiAgICB9XG4gICAgcnVsZXMgPSBzdHlsZVNoZWV0LnN0eWxlc2hlZXQucnVsZXM7XG4gIH1cblxuICAvLyBXQVJOIGN1cnJlbmx0eSB0aGlzIHBhcnNlcyBydWxlcyBpbiByZXZlcnNlIG9yZGVyIHNvIHRoYXQgc3RyaW5nIHJlcGxhY2VtZW50cyB3b3JrcyB1c2luZyBpbnB1dCBcInBvc2l0aW9uc1wiXG4gIC8vIG90aGVyd2lzZSBpdCBzaG91bGQgY29tcHV0ZSBuZXcgb2Zmc2V0cyBvbiBldmVyeSByZXBsYWNlbWVudC5cbiAgLy8gQnV0IHRoaXMgY3JlYXRlIGlzc3VlcyBiZWNhdXNlIG9mIGRlZmluaXRpb25zIGJlaW5nIHBhcnNlZCBpbiByZXZlcnNlIG9yZGVyLCBzbyB0aGlzIGlzIG5vdCBhIGdvb2QgaWRlYS5cbiAgLy8gU29tZXRpbWVzLCB0byB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlcywgeW91IG5lZWQgdG8gY3JlYXRlIDIgZGlmZmVyZW50IDxzdHlsZT4gYmxvY2tzLlxuICB2YXIgYmluZGluZ1Byb3ZpZGVyO1xuXG4gIGZvciAodmFyIGkgPSBydWxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChydWxlc1tpXS50eXBlID09ICdzdXBwb3J0cycgJiYgcnVsZXNbaV0ubmFtZSA9PSAnLWtvLWJsb2NrZGVmcycpIHtcbiAgICAgIF9wcm9jZXNzU3R5bGVTaGVldFJ1bGVzX3Byb2Nlc3NCbG9ja0RlZihibG9ja0RlZnNVcGRhdGVyLCBydWxlc1tpXS5ydWxlcyk7XG4gICAgICBuZXdTdHlsZSA9IGNvbnZlcnRlclV0aWxzLnJlbW92ZVN0eWxlKG5ld1N0eWxlLCBydWxlc1tpXS5wb3NpdGlvbi5zdGFydCwgbGFzdFN0YXJ0LCAwLCAwLCAwLCAnJyk7XG4gICAgICAvKiB0ZW1wb3JhcnkgZXhwZXJpbWVudGFsIGNvZGUgbm90IHVzZWRcbiAgICAgIH0gZWxzZSBpZiAocnVsZXNbaV0udHlwZSA9PSAnc3VwcG9ydHMnICYmIHJ1bGVzW2ldLm5hbWUgPT0gJy1rby10aGVtZXMnKSB7XG4gICAgICAgIGJpbmRpbmdQcm92aWRlciA9IGxvY2FsV2l0aEJpbmRpbmdQcm92aWRlci5iaW5kKHRoaXMsICd0aGVtZScsICcnKTtcbiAgICAgICAgX3Byb2Nlc3NTdHlsZVNoZWV0UnVsZXNfcHJvY2Vzc1RoZW1lcyhiaW5kaW5nUHJvdmlkZXIsIHRoZW1lVXBkYXRlciwgcnVsZXNbaV0ucnVsZXMpO1xuICAgICAgICBuZXdTdHlsZSA9IGNvbnZlcnRlclV0aWxzLnJlbW92ZVN0eWxlKG5ld1N0eWxlLCBydWxlc1tpXS5wb3NpdGlvbi5zdGFydCwgbGFzdFN0YXJ0LCAwLCAwLCAwLCAnJyk7XG4gICAgICAqL1xuICAgIH0gZWxzZSBpZiAocnVsZXNbaV0udHlwZSA9PSAnbWVkaWEnIHx8IHJ1bGVzW2ldLnR5cGUgPT0gJ3N1cHBvcnRzJykge1xuICAgICAgbmV3U3R5bGUgPSBwcm9jZXNzU3R5bGVzaGVldFJ1bGVzKG5ld1N0eWxlLCBydWxlc1tpXS5ydWxlcywgbG9jYWxXaXRoQmluZGluZ1Byb3ZpZGVyLCBibG9ja0RlZnNVcGRhdGVyLCB0aGVtZVVwZGF0ZXIsIHRlbXBsYXRlVXJsQ29udmVydGVyLCByb290TW9kZWxOYW1lLCB0ZW1wbGF0ZU5hbWUpO1xuICAgIH0gZWxzZSBpZiAocnVsZXNbaV0udHlwZSA9PSAnY29tbWVudCcpIHtcbiAgICAgIC8vIGlnbm9yZSBjb21tZW50c1xuICAgIH0gZWxzZSBpZiAocnVsZXNbaV0udHlwZSA9PSAncnVsZScpIHtcbiAgICAgIHZhciBzZWxzID0gcnVsZXNbaV0uc2VsZWN0b3JzO1xuICAgICAgdmFyIG5ld1NlbCA9IFwiXCI7XG4gICAgICB2YXIgZm91bmRCbG9ja01hdGNoID0gbnVsbDtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2Vscy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAobmV3U2VsLmxlbmd0aCA+IDApIG5ld1NlbCArPSBcIiwgXCI7XG4gICAgICAgIHZhciBtYXRjaCA9IHNlbHNbal0ubWF0Y2goL1xcW2RhdGEta28tYmxvY2s9KFteIF0qKVxcXS8pO1xuICAgICAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoZm91bmRCbG9ja01hdGNoICE9PSBudWxsICYmIGZvdW5kQmxvY2tNYXRjaCAhPSBtYXRjaFsxXSkgdGhyb3cgXCJGb3VuZCBtdWx0aXBsZSBibG9jay1tYXRjaCBhdHRyaWJ1dGUgc2VsZWN0b3JzOiBjYW5ub3QgdHJhbnNsYXRlIGl0IChcIiArIGZvdW5kQmxvY2tNYXRjaCArIFwiIHZzIFwiICsgbWF0Y2hbMV0gKyBcIilcIjtcbiAgICAgICAgICBmb3VuZEJsb2NrTWF0Y2ggPSBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgICBuZXdTZWwgKz0gJzwhLS0ga28gdGV4dDogdGVtcGxhdGVNb2RlID09XFwnd3lzaXd5Z1xcJyA/IFxcJyNtYWluLXd5c2l3eWctYXJlYSBcXCcgOiBcXCdcXCcgLS0+PCEtLSAva28gLS0+JyArIHNlbHNbal07XG4gICAgICB9XG4gICAgICBpZiAoZm91bmRCbG9ja01hdGNoKSB7XG4gICAgICAgIHZhciBsb29wUHJlZml4ID0gJzwhLS0ga28gZm9yZWFjaDogJHJvb3QuZmluZE9iamVjdHNPZlR5cGUoJGRhdGEsIFxcJycgKyBmb3VuZEJsb2NrTWF0Y2ggKyAnXFwnKSAtLT4nO1xuICAgICAgICB2YXIgbG9vcFBvc3RmaXggPSAnPCEtLSAva28gLS0+JztcbiAgICAgICAgdmFyIGVuZCA9IGxhc3RTdGFydDtcbiAgICAgICAgdmFyIHNwYWNpbmcgPSBcIiBcIjtcbiAgICAgICAgaWYgKHJ1bGVzW2ldLmRlY2xhcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKHJ1bGVzW2ldLmRlY2xhcmF0aW9uc1swXS5wb3NpdGlvbi5zdGFydC5saW5lICE9IHJ1bGVzW2ldLnBvc2l0aW9uLmVuZC5saW5lKSB7XG4gICAgICAgICAgICBzcGFjaW5nID0gXCJcXG5cIiArIChuZXcgQXJyYXkocnVsZXNbaV0ucG9zaXRpb24uc3RhcnQuY29sKSkuam9pbihcIiBcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVuZCA9IHJ1bGVzW2ldLmRlY2xhcmF0aW9uc1tydWxlc1tpXS5kZWNsYXJhdGlvbnMubGVuZ3RoIC0gMV0ucG9zaXRpb24uZW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPT09IG51bGwpIG5ld1N0eWxlICs9IHNwYWNpbmcgKyBsb29wUG9zdGZpeDtcbiAgICAgICAgZWxzZSBpZiAoZW5kID09IGxhc3RTdGFydCkgbmV3U3R5bGUgPSBjb252ZXJ0ZXJVdGlscy5yZW1vdmVTdHlsZShuZXdTdHlsZSwgZW5kLCBsYXN0U3RhcnQsIDAsIDAsIDAsIHNwYWNpbmcgKyBsb29wUG9zdGZpeCk7XG4gICAgICAgIGVsc2UgbmV3U3R5bGUgPSBjb252ZXJ0ZXJVdGlscy5yZW1vdmVTdHlsZShuZXdTdHlsZSwgZW5kLCBsYXN0U3RhcnQsIDAsIDAsIDAsIHNwYWNpbmcgKyAnfScgKyBzcGFjaW5nICsgbG9vcFBvc3RmaXgpO1xuICAgICAgICBuZXdTZWwgPSBsb29wUHJlZml4ICsgc3BhY2luZyArIG5ld1NlbC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFxbZGF0YS1rby1ibG9jaz0nICsgZm91bmRCbG9ja01hdGNoICsgJ1xcXFxdJywgJ2cnKSwgJzwhLS0ga28gdGV4dDogXFwnI1xcJytpZCgpIC0tPicgKyBmb3VuZEJsb2NrTWF0Y2ggKyAnPCEtLSAva28gLS0+Jyk7XG5cbiAgICAgICAgYmxvY2tEZWZzVXBkYXRlcihmb3VuZEJsb2NrTWF0Y2gsICcnLCB7IGNvbnRleHROYW1lOiAnYmxvY2snIH0pO1xuICAgICAgfVxuICAgICAgLy8gVE9ETyBtZW5zY2ggdXBkYXRlICh1c2luZyBvcmlnaW5hbCBtZW5zY2ggbGlicmFyeSB3ZSBuZWVkZWQgdGhpcyBsaW5lLCB3aGlsZSB0aGUgcGF0Y2hlZCBvbmUgZG9lc24ndCBuZWVkIHRoaXMgY29kZSlcbiAgICAgIC8vIG5ld1NlbCArPSBcIiB7XCI7XG4gICAgICB2YXIgbG9jYWxCbG9ja05hbWUgPSBmb3VuZEJsb2NrTWF0Y2ggPyBmb3VuZEJsb2NrTWF0Y2ggOiB0ZW1wbGF0ZU5hbWU7XG4gICAgICBiaW5kaW5nUHJvdmlkZXIgPSBsb2NhbFdpdGhCaW5kaW5nUHJvdmlkZXIuYmluZCh0aGlzLCBsb2NhbEJsb2NrTmFtZSwgJycpO1xuICAgICAgdmFyIGVsYWJvcmF0ZWRTdHlsZSA9IGVsYWJvcmF0ZURlY2xhcmF0aW9ucyhuZXdTdHlsZSwgcnVsZXNbaV0uZGVjbGFyYXRpb25zLCB0ZW1wbGF0ZVVybENvbnZlcnRlciwgYmluZGluZ1Byb3ZpZGVyKTtcbiAgICAgIGlmIChlbGFib3JhdGVkU3R5bGUgIT09IG51bGwpIG5ld1N0eWxlID0gZWxhYm9yYXRlZFN0eWxlO1xuXG4gICAgICBuZXdTdHlsZSA9IGNvbnZlcnRlclV0aWxzLnJlbW92ZVN0eWxlKG5ld1N0eWxlLCBydWxlc1tpXS5wb3NpdGlvbi5zdGFydCwgcnVsZXNbaV0ucG9zaXRpb24uZW5kLCAwLCAwLCAwLCBuZXdTZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcIlVua25vd24gcnVsZSB0eXBlXCIsIHJ1bGVzW2ldLnR5cGUsIFwid2hpbGUgcGFyc2luZyA8c3R5bGU+IHJ1bGVzXCIpO1xuICAgIH1cbiAgICBsYXN0U3RhcnQgPSBydWxlc1tpXS5wb3NpdGlvbi5zdGFydDtcbiAgfVxuICByZXR1cm4gbmV3U3R5bGU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHByb2Nlc3NTdHlsZXNoZWV0UnVsZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgY29uc29sZSA9IHJlcXVpcmUoJ2NvbnNvbGUnKTtcbnZhciBqc2VwID0gcmVxdWlyZSgnanNlcCcpO1xuXG5qc2VwLmFkZEJpbmFyeU9wKFwib3JcIiwgMSk7XG5qc2VwLmFkZEJpbmFyeU9wKFwiYW5kXCIsIDIpO1xuanNlcC5hZGRCaW5hcnlPcChcImVxXCIsIDYpO1xuanNlcC5hZGRCaW5hcnlPcChcIm5lcVwiLCA2KTtcbmpzZXAuYWRkQmluYXJ5T3AoXCJsdFwiLCA3KTtcbmpzZXAuYWRkQmluYXJ5T3AoXCJsdGVcIiwgNyk7XG5qc2VwLmFkZEJpbmFyeU9wKFwiZ3RcIiwgNyk7XG5qc2VwLmFkZEJpbmFyeU9wKFwiZ3RlXCIsIDcpO1xuXG52YXIgYWRkU2xhc2hlcyA9IGZ1bmN0aW9uKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL1tcXFxcXCInXS9nLCAnXFxcXCQmJykucmVwbGFjZSgvXFx1MDAwMC9nLCAnXFxcXDAnKTtcbn07XG5cbnZhciByZW1vdmVTdHlsZSA9IGZ1bmN0aW9uKHN0eWxlLCBzdGFydFBvcywgZW5kUG9zLCBza2lwUm93cywgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCwgaW5zZXJ0KSB7XG4gIHZhciBzdHlsZVJvd3MgPSBzdHlsZS5zcGxpdChcIlxcblwiKTtcbiAgdmFyIHN0YXJ0ID0gc3RhcnRPZmZzZXQ7XG4gIHZhciBlbmQgPSBlbmRPZmZzZXQ7XG4gIGZvciAodmFyIHIgPSAxICsgc2tpcFJvd3M7IHIgPCBzdGFydFBvcy5saW5lOyByKyspIHN0YXJ0ICs9IHN0eWxlUm93c1tyIC0gMSAtIHNraXBSb3dzXS5sZW5ndGggKyAxO1xuICBzdGFydCArPSBzdGFydFBvcy5jb2w7XG4gIGlmIChlbmRQb3MgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciByMiA9IDEgKyBza2lwUm93czsgcjIgPCBlbmRQb3MubGluZTsgcjIrKykgZW5kICs9IHN0eWxlUm93c1tyMiAtIDEgLSBza2lwUm93c10ubGVuZ3RoICsgMTtcbiAgICBlbmQgKz0gZW5kUG9zLmNvbDtcbiAgfSBlbHNlIGVuZCArPSBzdHlsZS5sZW5ndGggKyAxO1xuICB2YXIgbmV3U3R5bGUgPSBzdHlsZS5zdWJzdHIoMCwgc3RhcnQgLSAxKSArIGluc2VydCArIHN0eWxlLnN1YnN0cihlbmQgLSAxKTtcbiAgcmV0dXJuIG5ld1N0eWxlO1xufTtcblxudmFyIGV4cHJlc3Npb25HZW5lcmF0b3IgPSBmdW5jdGlvbihub2RlLCBiaW5kaW5nUHJvdmlkZXIsIGRlZlZhbCkge1xuICBmdW5jdGlvbiBtYXBPcGVyYXRvcihvcCkge1xuICAgIHN3aXRjaCAob3ApIHtcbiAgICAgIGNhc2UgJ29yJzpcbiAgICAgICAgcmV0dXJuICd8fCc7XG4gICAgICBjYXNlICdhbmQnOlxuICAgICAgICByZXR1cm4gJyYmJztcbiAgICAgIGNhc2UgJ2x0JzpcbiAgICAgICAgcmV0dXJuICc8JztcbiAgICAgIGNhc2UgJ2x0ZSc6XG4gICAgICAgIHJldHVybiAnPD0nO1xuICAgICAgY2FzZSAnZ3QnOlxuICAgICAgICByZXR1cm4gJz4nO1xuICAgICAgY2FzZSAnZ3RlJzpcbiAgICAgICAgcmV0dXJuICc+PSc7XG4gICAgICBjYXNlICdlcSc6XG4gICAgICAgIHJldHVybiAnPT0nO1xuICAgICAgY2FzZSAnbmVxJzpcbiAgICAgICAgcmV0dXJuICchPSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gb3A7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2VuKG5vZGUsIGJpbmRpbmdQcm92aWRlciwgbG9va3VwbWVtYmVyLCBkZWZWYWwpIHtcbiAgICBpZiAodHlwZW9mIGxvb2t1cG1lbWJlciA9PSAndW5kZWZpbmVkJykgbG9va3VwbWVtYmVyID0gdHJ1ZTtcblxuICAgIGlmICh0eXBlb2YgZGVmVmFsICE9PSAndW5kZWZpbmVkJyAmJiBub2RlLnR5cGUgIT09IFwiSWRlbnRpZmllclwiICYmIG5vZGUudHlwZSAhPT0gXCJNZW1iZXJFeHByZXNzaW9uXCIpIGNvbnNvbGUubG9nKFwiQ2Fubm90IGFwcGx5IGRlZmF1bHQgdmFsdWUgdG8gdmFyaWFibGUgd2hlbiB1c2luZyBleHByZXNzaW9uc1wiKTtcblxuICAgIGlmIChub2RlLnR5cGUgPT09IFwiQmluYXJ5RXhwcmVzc2lvblwiIHx8IG5vZGUudHlwZSA9PT0gXCJMb2dpY2FsRXhwcmVzc2lvblwiKSB7XG4gICAgICByZXR1cm4gJygnICsgZ2VuKG5vZGUubGVmdCwgYmluZGluZ1Byb3ZpZGVyLCBsb29rdXBtZW1iZXIpICsgJyAnICsgbWFwT3BlcmF0b3Iobm9kZS5vcGVyYXRvcikgKyAnICcgKyBnZW4obm9kZS5yaWdodCwgYmluZGluZ1Byb3ZpZGVyLCBsb29rdXBtZW1iZXIpICsgJyknO1xuICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nKSB7XG4gICAgICB2YXIgYXJncyA9IG5vZGUuYXJndW1lbnRzLm1hcChmdW5jdGlvbihuKSB7XG4gICAgICAgIHJldHVybiBnZW4obiwgYmluZGluZ1Byb3ZpZGVyLCBsb29rdXBtZW1iZXIpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZ2VuKG5vZGUuY2FsbGVlLCBiaW5kaW5nUHJvdmlkZXIsIGxvb2t1cG1lbWJlcikgKyAnKCcgKyBhcmdzLmpvaW4oJywgJykgKyAnKSc7XG4gICAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT09IFwiVW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICAgIHJldHVybiBub2RlLm9wZXJhdG9yICsgZ2VuKG5vZGUuYXJndW1lbnQsIGJpbmRpbmdQcm92aWRlciwgbG9va3VwbWVtYmVyKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PSAnTWVtYmVyRXhwcmVzc2lvbicgJiYgbm9kZS5jb21wdXRlZCkge1xuICAgICAgdGhyb3cgXCJVbmV4cGVjdGVkIGNvbXB1dGVkIG1lbWJlciBleHByZXNzaW9uXCI7XG4gICAgICAvLyByZXR1cm4gZ2VuKG5vZGUub2JqZWN0KSArICdbJyArIGdlbihub2RlLnByb3BlcnR5KSArICddJztcbiAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PSAnTWVtYmVyRXhwcmVzc2lvbicgJiYgIW5vZGUuY29tcHV0ZWQpIHtcbiAgICAgIHZhciBtZSA9IGdlbihub2RlLm9iamVjdCwgYmluZGluZ1Byb3ZpZGVyLCBmYWxzZSkgKyAnLicgKyBnZW4obm9kZS5wcm9wZXJ0eSwgYmluZGluZ1Byb3ZpZGVyLCBmYWxzZSk7XG4gICAgICBpZiAobG9va3VwbWVtYmVyICYmIG5vZGUub2JqZWN0Lm5hbWUgIT09ICdNYXRoJyAmJiBub2RlLm9iamVjdC5uYW1lICE9PSAnQ29sb3InKSByZXR1cm4gYmluZGluZ1Byb3ZpZGVyKG1lLCBkZWZWYWwpICsgJygpJztcbiAgICAgIHJldHVybiBtZTtcbiAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gXCJMaXRlcmFsXCIpIHtcbiAgICAgIHJldHVybiBub2RlLnJhdztcbiAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0lkZW50aWZpZXInKSB7XG4gICAgICB2YXIgaWQgPSBub2RlLm5hbWU7XG4gICAgICBpZiAobG9va3VwbWVtYmVyKSByZXR1cm4gYmluZGluZ1Byb3ZpZGVyKGlkLCBkZWZWYWwpICsgJygpJztcbiAgICAgIGVsc2UgcmV0dXJuIGlkO1xuICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAnQ29uZGl0aW9uYWxFeHByZXNzaW9uJykge1xuICAgICAgcmV0dXJuICcoJyArIGdlbihub2RlLnRlc3QsIGJpbmRpbmdQcm92aWRlciwgbG9va3VwbWVtYmVyKSArICcgPyAnICsgZ2VuKG5vZGUuY29uc2VxdWVudCwgYmluZGluZ1Byb3ZpZGVyLCBsb29rdXBtZW1iZXIpICsgJyA6ICcgKyBnZW4obm9kZS5hbHRlcm5hdGUsIGJpbmRpbmdQcm92aWRlciwgbG9va3VwbWVtYmVyKSArICcpJztcbiAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0NvbXBvdW5kJykge1xuICAgICAgdGhyb3cgXCJTeW50YXggZXJyb3IgaW4gZXhwcmVzc2lvbjogb3BlcmF0b3IgZXhwZWN0ZWQgYWZ0ZXIgXCIgKyBnZW4obm9kZS5ib2R5WzBdLCBiaW5kaW5nUHJvdmlkZXIsIGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgXCJGb3VuZCBhbiB1bnN1cHBvcnRlZCBleHByZXNzaW9uIHR5cGU6IFwiICsgbm9kZS50eXBlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZW4obm9kZSwgYmluZGluZ1Byb3ZpZGVyLCB1bmRlZmluZWQsIGRlZlZhbCk7XG59O1xuXG52YXIgZXhwcmVzc2lvbkJpbmRpbmcgPSBmdW5jdGlvbihleHByZXNzaW9uLCBiaW5kaW5nUHJvdmlkZXIsIGRlZmF1bHRWYWx1ZSkge1xuICB2YXIgbWF0Y2hlcztcbiAgaWYgKHR5cGVvZiBkZWZhdWx0VmFsdWUgIT09ICd1bmRlZmluZWQnICYmIGRlZmF1bHRWYWx1ZSAhPT0gbnVsbCkge1xuICAgIHZhciBjaGVjayA9IGV4cHJlc3Npb24udHJpbSgpLnJlcGxhY2UoL0BcXFsoW15cXF1dKylcXF18QChbYS16QS1aMC05XFwuX10rKVxcYi9nLCAnIyMjdmFyIyMjJyk7XG4gICAgY2hlY2sgPSBjaGVjay5yZXBsYWNlKC9bXFwtXFxbXFxdXFwvXFx7XFx9XFwoXFwpXFwqXFwrXFw/XFwuXFxcXFxcXlxcJFxcfF0vZywgXCJcXFxcJCZcIik7XG4gICAgaWYgKGNoZWNrID09ICcjIyN2YXIjIyMnKSBtYXRjaGVzID0gW251bGwsIGRlZmF1bHRWYWx1ZV07XG4gICAgZWxzZSB7XG4gICAgICBjaGVjayA9ICdeJyArIGNoZWNrLnJlcGxhY2UoLyMjI3ZhciMjIy9nLCAnKC4rKScpICsgJyQnO1xuICAgICAgbWF0Y2hlcyA9IGRlZmF1bHRWYWx1ZS50cmltKCkubWF0Y2gobmV3IFJlZ0V4cChjaGVjaykpO1xuICAgICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICAgIC8vIFRPRE8gdGhyb3cgZXJyb3I/XG4gICAgICAgIGNvbnNvbGUubG9nKFwiQ2Fubm90IGZpbmQgbWF0Y2hlc1wiLCBtYXRjaGVzLCBcImZvclwiLCBkZWZhdWx0VmFsdWUsIGV4cHJlc3Npb24sIGNoZWNrLCBleHByZXNzaW9uKTtcbiAgICAgICAgdGhyb3cgXCJDYW5ub3QgZmluZCBkZWZhdWx0IHZhbHVlIGZvciBcIiArIGV4cHJlc3Npb24gKyBcIiBpbiBcIiArIGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdHJ5IHtcbiAgICB2YXIgdmFycyA9IDA7XG4gICAgdmFyIHJlc3VsdCA9IFwiJ1wiICsgZXhwcmVzc2lvbi5yZXBsYWNlKC9AXFxbKFteXFxdXSspXFxdfEAoW2EtekEtWjAtOVxcLl9dKylcXGJ8KCcpL2csIGZ1bmN0aW9uKG1hdGNoLCBwMSwgcDIsIHAzKSB7XG4gICAgICAvLyBlc2NhcGluZy4uXG4gICAgICBpZiAocDMpIHJldHVybiBcIlxcXFxcIiArIHAzO1xuICAgICAgdmFycysrO1xuICAgICAgdmFyIHZhck5hbWUgPSBwMSB8fCBwMjtcbiAgICAgIHZhciBkZWZWYWw7XG4gICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICBpZiAodHlwZW9mIG1hdGNoZXNbdmFyc10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgZGVmVmFsID0gbWF0Y2hlc1t2YXJzXS50cmltKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJBQlpaWiBDYW5ub3QgZmluZCBkZWZhdWx0IHZhbHVlIGZvclwiLCB2YXJOYW1lLCBcImluXCIsIG1hdGNoZXMsIFwiYXNcIiwgdmFycyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGluIGNhc2Ugd2UgZm91bmQgcDEgd2UgYXJlIGluIGEgQFtzZXF1ZW5jZV0gc28gd2Ugc3RhcnQgYW4gZXhwcmVzc2lvbiBwYXJzZXJcbiAgICAgIGlmIChwMSkge1xuICAgICAgICB2YXIgcGFyc2V0cmVlID0ganNlcChwMSk7XG4gICAgICAgIHZhciBnZW50cmVlID0gZXhwcmVzc2lvbkdlbmVyYXRvcihwYXJzZXRyZWUsIGJpbmRpbmdQcm92aWRlciwgZGVmVmFsKTtcbiAgICAgICAgcmV0dXJuIFwiJytcIiArIGdlbnRyZWUgKyBcIisnXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gXCInK1wiICsgYmluZGluZ1Byb3ZpZGVyKHZhck5hbWUsIGRlZlZhbCkgKyBcIigpKydcIjtcbiAgICB9KSArIFwiJ1wiO1xuICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8oXnxbXlxcXFxdKScnXFwrL2csICckMScpLnJlcGxhY2UoL1xcKycnL2csICcnKTtcblxuICAgIGlmICh2YXJzID09PSAwICYmIHJlc3VsdCAhPT0gJ2ZhbHNlJyAmJiByZXN1bHQgIT09ICd0cnVlJykge1xuICAgICAgY29uc29sZS5lcnJvcihcIlVuZXhwZWN0ZWQgZXhwcmVzc2lvbiB3aXRoIG5vIHZhbGlkIEB2YXJpYWJsZSByZWZlcmVuY2VzXCIsIGV4cHJlc3Npb24pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgXCJFeGNlcHRpb24gcGFyc2luZyBleHByZXNzaW9uIFwiICsgZXhwcmVzc2lvbiArIFwiIFwiICsgZTtcbiAgfVxufTtcblxudmFyIGNvbmRpdGlvbkJpbmRpbmcgPSBmdW5jdGlvbihjb25kaXRpb24sIGJpbmRpbmdQcm92aWRlcikge1xuICB2YXIgcGFyc2V0cmVlID0ganNlcChjb25kaXRpb24pO1xuICB2YXIgZ2VudHJlZSA9IGV4cHJlc3Npb25HZW5lcmF0b3IocGFyc2V0cmVlLCBiaW5kaW5nUHJvdmlkZXIpO1xuICByZXR1cm4gZ2VudHJlZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZGRTbGFzaGVzOiBhZGRTbGFzaGVzLFxuICByZW1vdmVTdHlsZTogcmVtb3ZlU3R5bGUsXG4gIGNvbmRpdGlvbkJpbmRpbmc6IGNvbmRpdGlvbkJpbmRpbmcsXG4gIGV4cHJlc3Npb25CaW5kaW5nOiBleHByZXNzaW9uQmluZGluZ1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gVGhpcyBpcyBjb21wbGV4IGNvZGUgdG8gaGFuZGxlIFwibGl2ZVwiIG1vZGVsIGluc3RydW1lbnRhdGlvbiBhbmQgZGVwZW5kZW5jeSB0cmFja2luZy5cbi8vIFRoaXMgYWRkcyBfd3JhcCBhbmQgX3Vud3JhcCBtZXRob2RzIHRvIHRoZSBtb2RlbCBhbmQgYWxzbyBpbnN0cnVtZW50IHRoZSBibG9jayBsaXN0IHNvIHRvIGF1dG9tYXRpY2FsbHlcbi8vIHdyYXAvdXB3cmFwIG9iamVjdHMgb24gc2ltcGxlIGFycmF5IG1ldGhvZHMgKHB1c2gsIHNwbGljZSlcblxudmFyIGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xudmFyIGtvd3JhcCA9IHJlcXVpcmUoXCJrbm9ja291dC53cmFwXCIpO1xudmFyIGNvbnNvbGUgPSByZXF1aXJlKFwiY29uc29sZVwiKTtcblxudmFyIF9nZXRPcHRpb25zT2JqZWN0ID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICB2YXIgb3B0aW9uc0NvdXBsZXMgPSBvcHRpb25zLnNwbGl0KCd8Jyk7XG4gIHZhciBvcHRzID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9uc0NvdXBsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgb3B0ID0gb3B0aW9uc0NvdXBsZXNbaV0uc3BsaXQoJz0nKTtcbiAgICBvcHRzW29wdFswXV0gPSBvcHQubGVuZ3RoID4gMSA/IG9wdFsxXSA6IG9wdFswXTtcbiAgfVxuICByZXR1cm4gb3B0cztcbn07XG5cbi8vIGdlbmVyYXRlIGEgY29tcHV0ZWQgdmFyaWFibGUgaGFuZGxpbmcgdGhlIGZhbGxiYWNrIHRvIHRoZW1lIHZhcmlhYmxlXG52YXIgX21ha2VDb21wdXRlZCA9IGZ1bmN0aW9uKHRhcmdldCwgZGVmLCBudWxsSWZFcXVhbCwgc2NoZW1lU2VsZWN0b3IsIHRoZW1lUGF0aCwgdGhlbWVzKSB7XG4gIHZhciByZXMgPSBrby5jb21wdXRlZCh7XG4gICAgJ3JlYWQnOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB2YWwgPSB0YXJnZXQoKTtcbiAgICAgIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICAgICAgdmFyIHNjaGVtZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoc2NoZW1lU2VsZWN0b3IpO1xuICAgICAgICBpZiAodHlwZW9mIHNjaGVtZSA9PSAndW5kZWZpbmVkJyB8fCBzY2hlbWUgPT0gJ2N1c3RvbScpIHtcbiAgICAgICAgICByZXR1cm4ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShkZWYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGVtZXNbc2NoZW1lXVt0aGVtZVBhdGhdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfVxuICAgIH0sXG4gICAgJ3dyaXRlJzogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBzY2hlbWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHNjaGVtZVNlbGVjdG9yKTtcbiAgICAgIHZhciBkZWZWYWw7XG4gICAgICBpZiAodHlwZW9mIHNjaGVtZSA9PSAndW5kZWZpbmVkJyB8fCBzY2hlbWUgPT0gJ2N1c3RvbScpIHtcbiAgICAgICAgZGVmVmFsID0ga28udXRpbHMucGVla09ic2VydmFibGUoZGVmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZlZhbCA9IHRoZW1lc1tzY2hlbWVdW3RoZW1lUGF0aF07XG4gICAgICB9XG5cbiAgICAgIGlmICghIW51bGxJZkVxdWFsKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBkZWZWYWwpIHRhcmdldChudWxsKTtcbiAgICAgICAgZWxzZSB0YXJnZXQodmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBrby51dGlscy5wZWVrT2JzZXJ2YWJsZSh0YXJnZXQpO1xuICAgICAgICBpZiAodmFsdWUgIT0gZGVmVmFsIHx8IGN1cnJlbnQgIT09IG51bGwpIHRhcmdldCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzO1xufTtcblxudmFyIF9uZXh0VmFyaWFudEZ1bmN0aW9uID0gZnVuY3Rpb24oa28sIHByb3AsIHZhcmlhbnRzKSB7XG4gIHZhciBjdXJyZW50VmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHByb3ApO1xuICB2YXIgdmFyaWFudFZhbHVlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFyaWFudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXJpYW50VmFsdWUgPSBrby51dGlscy5wZWVrT2JzZXJ2YWJsZSh2YXJpYW50c1tpXSk7XG4gICAgaWYgKHZhcmlhbnRWYWx1ZSA9PSBjdXJyZW50VmFsdWUpIGJyZWFrO1xuICB9XG5cbiAgaWYgKGkgPT0gdmFyaWFudHMubGVuZ3RoKSB7XG4gICAgY29uc29sZS53YXJuKFwiRGlkbid0IGZpbmQgYSB2YXJpYW50IVwiLCBwcm9wLCBjdXJyZW50VmFsdWUsIHZhcmlhbnRzKTtcbiAgICBpID0gdmFyaWFudHMubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIHZhciBuZXh0VmFyaWFudCA9IGkgKyAxO1xuICBpZiAobmV4dFZhcmlhbnQgPT0gdmFyaWFudHMubGVuZ3RoKSBuZXh0VmFyaWFudCA9IDA7XG4gIHZhciBuZXh0VmFsdWUgPSBrby51dGlscy5wZWVrT2JzZXJ2YWJsZSh2YXJpYW50c1tuZXh0VmFyaWFudF0pO1xuXG4gIHByb3AobmV4dFZhbHVlKTtcbn07XG5cbnZhciBfZ2V0VmFyaWFudHMgPSBmdW5jdGlvbihkZWYpIHtcbiAgdmFyIHZhcmlhbnRQcm9wID0gZGVmLl92YXJpYW50O1xuICB2YXIgdmFyaWFudE9wdGlvbnM7XG4gIGlmICh0eXBlb2YgZGVmW3ZhcmlhbnRQcm9wXSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIGRlZlt2YXJpYW50UHJvcF0uX3dpZGdldCA9PT0gJ3VuZGVmaW5lZCcgfHwgKHR5cGVvZiBkZWZbdmFyaWFudFByb3BdLl9vcHRpb25zICE9PSAnc3RyaW5nJyAmJiBkZWZbdmFyaWFudFByb3BdLl93aWRnZXQgIT09ICdib29sZWFuJykpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiVW5leHBlY3RlZCB2YXJpYW50IGRlY2xhcmF0aW9uXCIsIHZhcmlhbnRQcm9wLCBkZWZbdmFyaWFudFByb3BdKTtcbiAgICB0aHJvdyBcIlVuZXhwZWN0ZWQgdmFyaWFudCBkZWNsYXJhdGlvbjogY2Fubm90IGZpbmQgcHJvcGVydHkgXCIgKyB2YXJpYW50UHJvcCArIFwiIG9yIGl0cyBfb3B0aW9ucyBzdHJpbmcgYW5kIGl0IGlzIG5vdCBhIGJvb2xlYW5cIjtcbiAgfVxuICAvLyBUT0RPIEkgcmVhZCB0aGUgXCJrZXlzXCIgYnV0IHRoaXMgaXMgbm90IDEwMCUgY29ycmVjdCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBnYXJhbnRlZWQgdG8gYmUgc29ydGVkIGFzIGluIGRlY2xhcmF0aW9uXG4gIGlmICh0eXBlb2YgZGVmW3ZhcmlhbnRQcm9wXS5fb3B0aW9ucyA9PSAnc3RyaW5nJykge1xuICAgIHZhcmlhbnRPcHRpb25zID0gT2JqZWN0LmtleXMoX2dldE9wdGlvbnNPYmplY3QoZGVmW3ZhcmlhbnRQcm9wXS5fb3B0aW9ucykpO1xuICB9IGVsc2Uge1xuICAgIHZhcmlhbnRPcHRpb25zID0gW3RydWUsIGZhbHNlXTtcbiAgfVxuICByZXR1cm4gdmFyaWFudE9wdGlvbnM7XG59O1xuXG52YXIgX21ha2VDb21wdXRlZEZ1bmN0aW9uID0gZnVuY3Rpb24oZGVmLCBkZWZzLCB0aG1zLCBrbywgY29udGVudE1vZGVsLCBpc0NvbnRlbnQsIHQpIHtcbiAgaWYgKHR5cGVvZiBkZWYgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodCkudHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiVE9ETyBFUlJPUiBGb3VuZCBhIG5vbi10eXBlZCBkZWYgXCIsIGRlZiwgdCk7XG4gICAgICB0aHJvdyBcIkZvdW5kIGEgbm9uLXR5cGVkIGRlZiBcIiArIGRlZjtcbiAgICB9XG4gICAgdmFyIHR5cGUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodCkudHlwZSk7XG4gICAgZGVmID0gZGVmc1t0eXBlXTtcbiAgICBpZiAodHlwZW9mIGRlZiAhPT0gJ29iamVjdCcpIGNvbnNvbGUubG9nKFwiVE9ETyBFUlJPUiBGb3VuZCBhIG5vbi1vYmplY3QgZGVmIFwiLCBkZWYsIFwiZm9yXCIsIHR5cGUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBjb250ZW50TW9kZWwgPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGlzQ29udGVudCAhPSAndW5kZWZpbmVkJyAmJiBpc0NvbnRlbnQpIHtcbiAgICBjb250ZW50TW9kZWwgPSB0O1xuICB9XG5cbiAgdmFyIHNlbGZQYXRoID0gJyRyb290LmNvbnRlbnQoKS4nO1xuXG4gIHZhciBwcCA9IGRlZi5fZ2xvYmFsU3R5bGVzO1xuICBpZiAodHlwZW9mIHBwICE9ICd1bmRlZmluZWQnKVxuICAgIGZvciAodmFyIHAgaW4gcHApXG4gICAgICBpZiAocHAuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgdmFyIHNjaGVtZVBhdGhPcmlnID0gJyRyb290LmNvbnRlbnQoKS50aGVtZSgpLnNjaGVtZSc7XG4gICAgICAgIHZhciBzY2hlbWVQYXRoLCB2bSwgcGF0aDtcblxuICAgICAgICBpZiAocHBbcF0uc3Vic3RyKDAsIHNlbGZQYXRoLmxlbmd0aCkgPT0gc2VsZlBhdGgpIHtcbiAgICAgICAgICBwYXRoID0gcHBbcF0uc3Vic3RyKHNlbGZQYXRoLmxlbmd0aCk7XG4gICAgICAgICAgdm0gPSBjb250ZW50TW9kZWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgXCJVTkVYUEVDVEVEIGdsb2JhbFN0eWxlIHBhdGggKFwiICsgcHBbcF0gKyBcIikgb3V0c2lkZSBzZWxmUGF0aCAoXCIgKyBzZWxmUGF0aCArIFwiKVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWVQYXRoT3JpZy5zdWJzdHIoMCwgc2VsZlBhdGgubGVuZ3RoKSA9PSBzZWxmUGF0aCkge1xuICAgICAgICAgIHNjaGVtZVBhdGggPSBzY2hlbWVQYXRoT3JpZy5zdWJzdHIoc2VsZlBhdGgubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIklTIFRISVMgQ09SUkVDVD9cIiwgc2NoZW1lUGF0aE9yaWcsIHNlbGZQYXRoKTtcbiAgICAgICAgICBzY2hlbWVQYXRoID0gc2NoZW1lUGF0aE9yaWc7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2NoZW1lU2VsZWN0b3IgPSB2bTtcblxuICAgICAgICB2YXIgcGF0aFBhcnRzID0gcGF0aC5zcGxpdCgnKCkuJyk7XG4gICAgICAgIHZhciB0aGVtZVBhdGggPSAnJztcbiAgICAgICAgdmFyIHNraXAgPSB0cnVlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhQYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZtID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2bSlbcGF0aFBhcnRzW2ldXTtcbiAgICAgICAgICAvLyB1Z2x5IHRoaW5nIHRvIGZpbmQgdGhlIHBhdGggdG8gdGhlIHNjaGVtYSBjb2xvciBwcm9wZXJ0eSAoc29tZXRpbWVzIHdlIGhhdmUgdGhlbWUuYm9keVRoZW1lLCBzb21lIG90aGVyIHdlIGhhdmUgY29udGVudC50aGVtZS5ib2R5VGhlbWUuLi4pXG4gICAgICAgICAgaWYgKHNraXApIHtcbiAgICAgICAgICAgIGlmIChwYXRoUGFydHNbaV0gPT0gJ3RoZW1lJykgc2tpcCA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhlbWVQYXRoLmxlbmd0aCA+IDApIHRoZW1lUGF0aCArPSAnLic7XG4gICAgICAgICAgICB0aGVtZVBhdGggKz0gcGF0aFBhcnRzW2ldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzY2hlbWVQYXJ0cyA9IHNjaGVtZVBhdGguc3BsaXQoJygpLicpO1xuICAgICAgICBmb3IgKHZhciBpMyA9IDA7IGkzIDwgc2NoZW1lUGFydHMubGVuZ3RoOyBpMysrKSB7XG4gICAgICAgICAgc2NoZW1lU2VsZWN0b3IgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHNjaGVtZVNlbGVjdG9yKVtzY2hlbWVQYXJ0c1tpM11dO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG51bGxJZkVxdWFsID0gdHJ1ZTtcbiAgICAgICAgdmFyIHRQYXJ0cyA9IHAuc3BsaXQoJy4nKTtcbiAgICAgICAgdmFyIHRhcmdldCA9IHQ7XG4gICAgICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCB0UGFydHMubGVuZ3RoOyBpMisrKSB7XG4gICAgICAgICAgdGFyZ2V0ID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh0YXJnZXQpW3RQYXJ0c1tpMl1dO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFrby5pc09ic2VydmFibGUodGFyZ2V0KSkgdGhyb3cgXCJVbmV4cGVjdGVkIG5vbiBvYnNlcnZhYmxlIHRhcmdldCBcIiArIHAgKyBcIi9cIiArIHRoZW1lUGF0aDtcblxuICAgICAgICB0YXJnZXQuX2RlZmF1bHRDb21wdXRlZCA9IF9tYWtlQ29tcHV0ZWQodGFyZ2V0LCB2bSwgbnVsbElmRXF1YWwsIHNjaGVtZVNlbGVjdG9yLCB0aGVtZVBhdGgsIHRobXMpO1xuICAgICAgfVxuXG4gIGlmICh0eXBlb2YgZGVmLl92YXJpYW50ICE9ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIHBQYXJ0cyA9IGRlZi5fdmFyaWFudC5zcGxpdCgnLicpO1xuICAgIC8vIGxvb2tzIGluIHQgYW5kIG5vdCBjb250ZW50TW9kZWwgYmVjYXVzZSB2YXJpYW50cyBhcmUgZGVjbGFyZWQgb24gc2luZ2xlIGJsb2Nrcy5cbiAgICB2YXIgcFRhcmdldCA9IHQ7XG4gICAgdmFyIHBQYXJlbnQgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHQpO1xuICAgIGZvciAodmFyIGk0ID0gMDsgaTQgPCBwUGFydHMubGVuZ3RoOyBpNCsrKSB7XG4gICAgICBwVGFyZ2V0ID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShwVGFyZ2V0KVtwUGFydHNbaTRdXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwVGFyZ2V0Ll9kZWZhdWx0Q29tcHV0ZWQgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiRm91bmQgdmFyaWFudCBvbiBhIHN0eWxlIHByb3BlcnR5OiBiZXdhcmUgdmFyaWFudHMgc2hvdWxkIGJlIG9ubHkgdXNlZCBvbiBjb250ZW50IHByb3BlcnRpZXMgYmVjYXVzZSB0aGV5IGRvbid0IG1hdGNoIHRoZSB0aGVtZSBmYWxsYmFjayBiZWhhdmlvdXJcIiwgZGVmLl92YXJpYW50KTtcbiAgICAgIHBUYXJnZXQgPSBwVGFyZ2V0Ll9kZWZhdWx0Q29tcHV0ZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcFRhcmdldCA9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5sb2coXCJFUlJPUiBsb29raW5nIGZvciB2YXJpYW50IHRhcmdldFwiLCBkZWYuX3ZhcmlhbnQsIHQpO1xuICAgICAgdGhyb3cgXCJFUlJPUiBsb29raW5nIGZvciB2YXJpYW50IHRhcmdldCBcIiArIGRlZi5fdmFyaWFudDtcbiAgICB9XG4gICAgcFBhcmVudC5fbmV4dFZhcmlhbnQgPSBfbmV4dFZhcmlhbnRGdW5jdGlvbi5iaW5kKHBUYXJnZXQsIGtvLCBwVGFyZ2V0LCBfZ2V0VmFyaWFudHMoZGVmKSk7XG4gIH1cblxuICBmb3IgKHZhciBwcm9wMiBpbiBkZWYpXG4gICAgaWYgKGRlZi5oYXNPd25Qcm9wZXJ0eShwcm9wMikpIHtcbiAgICAgIHZhciB2YWwgPSBkZWZbcHJvcDJdO1xuICAgICAgaWYgKHR5cGVvZiB2YWwgPT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwuX2NvbnRleHQgIT0gJ3VuZGVmaW5lZCcgJiYgdmFsLl9jb250ZXh0ID09ICdibG9jaycpIHtcbiAgICAgICAgdmFyIHByb3BWbSA9IGNvbnRlbnRNb2RlbFtwcm9wMl0oKTtcbiAgICAgICAgdmFyIG5ld1ZtID0gX21ha2VDb21wdXRlZEZ1bmN0aW9uKGRlZnNbcHJvcDJdLCBkZWZzLCB0aG1zLCBrbywgY29udGVudE1vZGVsLCBpc0NvbnRlbnQsIHByb3BWbSk7XG4gICAgICAgIHRbcHJvcDJdKG5ld1ZtKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgdmFsLnR5cGUgPT0gJ2Jsb2NrcycpIHtcbiAgICAgICAgdmFyIG1haW5WbSA9IGNvbnRlbnRNb2RlbFtwcm9wMl0oKTtcbiAgICAgICAgdmFyIGJsb2Nrc1ZtID0gbWFpblZtLmJsb2NrcygpO1xuICAgICAgICB2YXIgb2xkQmxvY2ssIGJsb2NrVHlwZSwgbmV3QmxvY2s7XG4gICAgICAgIGZvciAodmFyIGliID0gMDsgaWIgPCBibG9ja3NWbS5sZW5ndGg7IGliKyspIHtcbiAgICAgICAgICBvbGRCbG9jayA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoYmxvY2tzVm1baWJdKTtcbiAgICAgICAgICBibG9ja1R5cGUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKG9sZEJsb2NrLnR5cGUpO1xuICAgICAgICAgIG5ld0Jsb2NrID0gX21ha2VDb21wdXRlZEZ1bmN0aW9uKGRlZnNbYmxvY2tUeXBlXSwgZGVmcywgdGhtcywga28sIGNvbnRlbnRNb2RlbCwgaXNDb250ZW50LCBvbGRCbG9jayk7XG4gICAgICAgICAgYmxvY2tzVm1baWJdKG5ld0Jsb2NrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBibG9ja3NPYnMgPSBtYWluVm0uYmxvY2tzO1xuXG4gICAgICAgIF9hdWdtZW50QmxvY2tzT2JzZXJ2YWJsZShibG9ja3NPYnMsIF9ibG9ja0luc3RydW1lbnRGdW5jdGlvbi5iaW5kKG1haW5WbSwgdW5kZWZpbmVkLCBkZWZzLCB0aG1zLCBrbywgdW5kZWZpbmVkLCBjb250ZW50TW9kZWwsIGlzQ29udGVudCkpO1xuXG4gICAgICAgIGNvbnRlbnRNb2RlbFtwcm9wMl0uX3dyYXAgPSBfbWFrZUJsb2Nrc1dyYXAuYmluZChjb250ZW50TW9kZWxbcHJvcDJdLCBibG9ja3NPYnMuX2luc3RydW1lbnRCbG9jayk7XG4gICAgICAgIGNvbnRlbnRNb2RlbFtwcm9wMl0uX3Vud3JhcCA9IF91bndyYXAuYmluZChjb250ZW50TW9kZWxbcHJvcDJdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgcmV0dXJuIHQ7XG59O1xuXG52YXIgX2F1Z21lbnRCbG9ja3NPYnNlcnZhYmxlID0gZnVuY3Rpb24oYmxvY2tzT2JzLCBpbnN0cnVtZW50KSB7XG4gIGJsb2Nrc09icy5faW5zdHJ1bWVudEJsb2NrID0gaW5zdHJ1bWVudDtcbiAgaWYgKHR5cGVvZiBibG9ja3NPYnMub3JpZ1B1c2ggPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBibG9ja3NPYnMub3JpZ1B1c2ggPSBibG9ja3NPYnMucHVzaDtcbiAgICBibG9ja3NPYnMucHVzaCA9IF9tYWtlUHVzaC5iaW5kKGJsb2Nrc09icyk7XG4gICAgYmxvY2tzT2JzLm9yaWdTcGxpY2UgPSBibG9ja3NPYnMuc3BsaWNlO1xuICAgIGJsb2Nrc09icy5zcGxpY2UgPSBfbWFrZVNwbGljZS5iaW5kKGJsb2Nrc09icyk7XG4gIH1cbn07XG5cbnZhciBfbWFrZUJsb2Nrc1dyYXAgPSBmdW5jdGlvbihpbnN0cnVtZW50LCBpbnB1dE1vZGVsKSB7XG4gIHZhciBtb2RlbCA9IGtvLnRvSlMoaW5wdXRNb2RlbCk7XG4gIHZhciBpbnB1dCA9IG1vZGVsLmJsb2NrcztcbiAgbW9kZWwuYmxvY2tzID0gW107XG4gIHZhciByZXMgPSBrb3dyYXAuZnJvbUpTKG1vZGVsLCB1bmRlZmluZWQsIHRydWUpKCk7XG4gIF9hdWdtZW50QmxvY2tzT2JzZXJ2YWJsZShyZXMuYmxvY2tzLCBpbnN0cnVtZW50KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBvYmogPSBrby50b0pTKGlucHV0W2ldKTtcbiAgICAvLyBjb25zb2xlLmxvZyhcIl9tYWtlQmxvY2tzV3JhcCBzZXQgYmxvY2tJZFwiLCBvYmouaWQsICdibG9ja18nK2kpO1xuICAgIG9iai5pZCA9ICdibG9ja18nICsgaTtcbiAgICByZXMuYmxvY2tzLnB1c2gob2JqKTtcbiAgfVxuICB0aGlzKHJlcyk7XG59O1xuXG52YXIgX21ha2VQdXNoID0gZnVuY3Rpb24oKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgdGhyb3cgXCJBcnJheSBwdXNoIHdpdGggbXVsdGlwbGUgYXJndW1lbnRzIG5vdCBpbXBsZW1lbnRlZFwiO1xuICAvLyB1bndyYXAgb2JzZXJ2YWJsZSBibG9ja3MsIG90aGVyd2lzZSB2aXNpYmlsaXR5IChkZXBlbmRlbmN5KSBoYW5kbGluZyBicmVha3NcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGtvLmlzT2JzZXJ2YWJsZShhcmd1bWVudHNbMF0pKSB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0uX3Vud3JhcCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhcmd1bWVudHNbMF0gPSBhcmd1bWVudHNbMF0uX3Vud3JhcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcIldBUk46IHB1c2hpbmcgb2JzZXJ2YWJsZSB3aXRoIG5vIF91bndyYXAgZnVuY3Rpb24gKFRPRE8gcmVtb3ZlIG1lLCBleHBlY3RlZCBjb25kaXRpb24pXCIpO1xuICAgIH1cbiAgfVxuICBpZiAoIWtvLmlzT2JzZXJ2YWJsZShhcmd1bWVudHNbMF0pKSB7XG4gICAgdmFyIGluc3RydW1lbnRlZCA9IHRoaXMuX2luc3RydW1lbnRCbG9jayhhcmd1bWVudHNbMF0pO1xuICAgIHJldHVybiB0aGlzLm9yaWdQdXNoLmFwcGx5KHRoaXMsIFtpbnN0cnVtZW50ZWRdKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5vcmlnUHVzaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG59O1xuXG52YXIgX21ha2VTcGxpY2UgPSBmdW5jdGlvbigpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAzKSB0aHJvdyBcIkFycmF5IHNwbGljZSB3aXRoIG11bHRpcGxlIG9iamVjdHMgbm90IGltcGxlbWVudGVkXCI7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBrby5pc09ic2VydmFibGUoYXJndW1lbnRzWzJdKSkge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzJdLl91bndyYXAgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYXJndW1lbnRzWzJdID0gYXJndW1lbnRzWzJdLl91bndyYXAoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coXCJXQVJOOiBzcGxpY2luZyBvYnNlcnZhYmxlIHdpdGggbm8gX3Vud3JhcCBmdW5jdGlvbiAoVE9ETyByZW1vdmUgbWUsIGV4cGVjdGVkIGNvbmRpdGlvbilcIik7XG4gICAgfVxuICB9XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMiAmJiAha28uaXNPYnNlcnZhYmxlKGFyZ3VtZW50c1syXSkpIHtcbiAgICB2YXIgaW5zdHJ1bWVudGVkID0gdGhpcy5faW5zdHJ1bWVudEJsb2NrKGFyZ3VtZW50c1syXSk7XG4gICAgcmV0dXJuIHRoaXMub3JpZ1NwbGljZS5hcHBseSh0aGlzLCBbYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0sIGluc3RydW1lbnRlZF0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLm9yaWdTcGxpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxufTtcblxuLy8gZGVmLCBkZWZzIGFuZCB0aGVtZXMgYXJlIGJvdW5kIGluIFwiX21vZGVsSW5zdHJ1bWVudFwiIHdoaWxlIHRoZSBuZXh0IHBhcmFtZXRlcnMgYXJlIGV4cG9zZWQgYnkgdGhpcyBtb2R1bGVcbnZhciBfYmxvY2tJbnN0cnVtZW50RnVuY3Rpb24gPSBmdW5jdGlvbihkZWYsIGRlZnMsIHRoZW1lcywga25vY2tvdXQsIHNlbGYsIG1vZGVsQ29udGVudCwgaXNDb250ZW50LCBzZWxmMikge1xuICAvLyB1Z2x5OiBzb21ldGltZXMgd2UgaGF2ZSB0byBiaW5kIGNvbnRlbnQgYnV0IG5vdCBzZWxmLCBzbyB3ZSByZXBlYXQgc2VsZiBhdCB0aGUgZW5kIGFzIFwic2VsZjJcIlxuICBpZiAodHlwZW9mIHNlbGYgPT0gJ3VuZGVmaW5lZCcpIHNlbGYgPSBzZWxmMjtcblxuICB2YXIgY29tcHV0ZWRGdW5jdGlvbnM7XG4gIGNvbXB1dGVkRnVuY3Rpb25zID0ge1xuICAgICcnOiBfbWFrZUNvbXB1dGVkRnVuY3Rpb24uYmluZChzZWxmLCBkZWYsIGRlZnMsIHRoZW1lcywga25vY2tvdXQsIG1vZGVsQ29udGVudCwgaXNDb250ZW50KVxuICB9O1xuXG4gIHZhciByZXMgPSBrb3dyYXAuZnJvbUpTKHNlbGYsIGNvbXB1dGVkRnVuY3Rpb25zLCB0cnVlKTtcbiAgcmVzLl91bndyYXAgPSBfdW53cmFwLmJpbmQocmVzKTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbnZhciBfd3JhcCA9IGZ1bmN0aW9uKGluc3RydW1lbnQsIHVud3JhcHBlZCkge1xuICB2YXIgbmV3Q29udGVudCA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoaW5zdHJ1bWVudChrbywgdW53cmFwcGVkLCB1bmRlZmluZWQsIHRydWUpKTtcbiAgdGhpcyhuZXdDb250ZW50KTtcbn07XG5cbnZhciBfdW53cmFwID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBrby50b0pTKHRoaXMpO1xufTtcblxudmFyIF9tb2RlbEluc3RydW1lbnQgPSBmdW5jdGlvbihtb2RlbCwgbW9kZWxEZWYsIGRlZnMpIHtcbiAgdmFyIF9pbnN0cnVtZW50ID0gX2Jsb2NrSW5zdHJ1bWVudEZ1bmN0aW9uLmJpbmQodW5kZWZpbmVkLCBtb2RlbERlZiwgZGVmcywgZGVmc1sndGhlbWVzJ10pO1xuICB2YXIgcmVzID0gX2luc3RydW1lbnQoa28sIG1vZGVsLCB1bmRlZmluZWQsIHRydWUpO1xuICAvLyByZXMuX2luc3RydW1lbnQgPSBfaW5zdHJ1bWVudDtcbiAgcmVzLl93cmFwID0gX3dyYXAuYmluZChyZXMsIF9pbnN0cnVtZW50KTtcbiAgcmVzLl91bndyYXAgPSBfdW53cmFwLmJpbmQocmVzKTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gX21vZGVsSW5zdHJ1bWVudDsiLCJ2YXIgdGlueWNvbG9yID0gcmVxdWlyZSgndGlueWNvbG9yJyk7XG5cbmZ1bmN0aW9uIENvbG9yKHRpbnljb2xvcikge1xuICB0aGlzLmdldEJyaWdodG5lc3MgPSBmdW5jdGlvbihjb2xvcikge1xuICAgIHJldHVybiB0aW55Y29sb3IoY29sb3IpLmdldEJyaWdodG5lc3MoKTtcbiAgfTtcbiAgdGhpcy5pc0xpZ2h0ID0gZnVuY3Rpb24oY29sb3IpIHtcbiAgICByZXR1cm4gdGlueWNvbG9yKGNvbG9yKS5pc0xpZ2h0KCk7XG4gIH07XG4gIHRoaXMuaXNEYXJrID0gZnVuY3Rpb24oY29sb3IpIHtcbiAgICByZXR1cm4gdGlueWNvbG9yKGNvbG9yKS5pc0RhcmsoKTtcbiAgfTtcbiAgdGhpcy5nZXRMdW1pbmFuY2UgPSBmdW5jdGlvbihjb2xvcikge1xuICAgIHJldHVybiB0aW55Y29sb3IoY29sb3IpLmdldEx1bWluYW5jZSgpO1xuICB9O1xuXG5cbiAgdGhpcy5saWdodGVuID0gZnVuY3Rpb24oY29sb3IsIGFtb3VudCkge1xuICAgIHJldHVybiB0aW55Y29sb3IoY29sb3IpLmxpZ2h0ZW4oYW1vdW50KS50b0hleFN0cmluZygpO1xuICB9O1xuICB0aGlzLmJyaWdodGVuID0gZnVuY3Rpb24oY29sb3IsIGFtb3VudCkge1xuICAgIHJldHVybiB0aW55Y29sb3IoY29sb3IpLmJyaWdodGVuKGFtb3VudCkudG9IZXhTdHJpbmcoKTtcbiAgfTtcbiAgdGhpcy5kYXJrZW4gPSBmdW5jdGlvbihjb2xvciwgYW1vdW50KSB7XG4gICAgcmV0dXJuIHRpbnljb2xvcihjb2xvcikuZGFya2VuKGFtb3VudCkudG9IZXhTdHJpbmcoKTtcbiAgfTtcbiAgdGhpcy5kZXNhdHVyYXRlID0gZnVuY3Rpb24oY29sb3IsIGFtb3VudCkge1xuICAgIHJldHVybiB0aW55Y29sb3IoY29sb3IpLmRlc2F0dXJhdGUoYW1vdW50KS50b0hleFN0cmluZygpO1xuICB9O1xuICB0aGlzLnNhdHVyYXRlID0gZnVuY3Rpb24oY29sb3IsIGFtb3VudCkge1xuICAgIHJldHVybiB0aW55Y29sb3IoY29sb3IpLnNhdHVyYXRlKGFtb3VudCkudG9IZXhTdHJpbmcoKTtcbiAgfTtcbiAgdGhpcy5ncmV5c2NhbGUgPSBmdW5jdGlvbihjb2xvcikge1xuICAgIHJldHVybiB0aW55Y29sb3IoY29sb3IpLmdyZXlzY2FsZSgpLnRvSGV4U3RyaW5nKCk7XG4gIH07XG4gIHRoaXMuc3BpbiA9IGZ1bmN0aW9uKGNvbG9yLCBhbW91bnQpIHtcbiAgICByZXR1cm4gdGlueWNvbG9yKGNvbG9yKS5zcGluKGFtb3VudCkudG9IZXhTdHJpbmcoKTtcbiAgfTtcbiAgdGhpcy5jb21wbGVtZW50ID0gZnVuY3Rpb24oY29sb3IpIHtcbiAgICByZXR1cm4gdGlueWNvbG9yKGNvbG9yKS5jb21wbGVtZW50KCkudG9IZXhTdHJpbmcoKTtcbiAgfTtcblxuICB0aGlzLm1peCA9IHRpbnljb2xvci5taXg7XG4gIHRoaXMucmVhZGFiaWxpdHkgPSB0aW55Y29sb3IucmVhZGFiaWxpdHk7XG4gIHRoaXMuaXNSZWFkYWJsZSA9IHRpbnljb2xvci5pc1JlYWRhYmxlO1xuICB0aGlzLm1vc3RSZWFkYWJsZSA9IHRpbnljb2xvci5tb3N0UmVhZGFibGU7XG59XG5cbnZhciBjb2xvclBsdWdpbiA9IGZ1bmN0aW9uKHZtKSB7XG4gIGdsb2JhbC5Db2xvciA9IG5ldyBDb2xvcih0aW55Y29sb3IpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb2xvclBsdWdpbjsiLCJcInVzZSBzdHJpY3RcIjtcbi8qIGdsb2JhbCBnbG9iYWw6IGZhbHNlICovXG52YXIgY29uc29sZSA9IHJlcXVpcmUoXCJjb25zb2xlXCIpO1xudmFyICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xudmFyIGlubGluZURvY3VtZW50ID0gcmVxdWlyZShcImp1aWNlL2xpYi9pbmxpbmVcIikoe30pLmlubGluZURvY3VtZW50O1xuXG52YXIgaW5saW5lclBsdWdpbiA9IGZ1bmN0aW9uKHZtKSB7XG4gIHZtLmlubGluZSA9IGZ1bmN0aW9uKGRvYykge1xuICAgIC8vIHRpbnltY2UgbWF5IGhhdmUgYWRkZWQgc3R5bGUgYXR0cmlidXRlcyB0byBlbGVtZW50cyB0aGF0IHdpbGwgYWxzbyBoYXZlIGdsb2JhbCBzdHlsZXMgdG8gYmUgaW5saW5lZFxuICAgICQoJ1tzdHlsZV06bm90KFtyZXBsYWNlZHN0eWxlXSknLCBkb2MpLmVhY2goZnVuY3Rpb24oaW5kZXgsIGVsKSB7XG4gICAgICB2YXIgJGVsID0gJChlbCk7XG4gICAgICAkZWwuYXR0cigncmVwbGFjZWRzdHlsZScsICRlbC5hdHRyKCdzdHlsZScpKTtcbiAgICB9KTtcblxuICAgIHZhciBzdHlsZSA9IFtdO1xuICAgICQoJ3N0eWxlW2RhdGEtaW5saW5lPVwidHJ1ZVwiXScsIGRvYykuZWFjaChmdW5jdGlvbihpbmRleCwgZWxlbWVudCkge1xuICAgICAgdmFyIGNvbnRlbnQgPSAkKGVsZW1lbnQpLmh0bWwoKTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLzwhLS0ga28gKCg/IS0tKS4pKj8gLS0+L2csICcnKTsgLy8gdGhpcyByZXBsYWNlcyB0aGUgYWJvdmUgd2l0aCBhIG1vcmUgZm9ybWFsIChidXQgc2xvd2VyKSBzb2x1dGlvblxuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvPCEtLSBcXC9rbyAtLT4vZywgJycpO1xuICAgICAgc3R5bGUucHVzaChjb250ZW50KTtcbiAgICAgICQoZWxlbWVudCkucmVtb3ZlQXR0cignZGF0YS1pbmxpbmUnKTtcbiAgICB9KTtcbiAgICB2YXIgc3R5bGVUZXh0ID0gc3R5bGUuam9pbihcIlxcblwiKTtcbiAgICB2YXIgJGNvbnRleHQgPSBmdW5jdGlvbihzZWxlY3RvciwgY29udGV4dCkge1xuICAgICAgaWYgKHR5cGVvZiBjb250ZXh0ID09ICd1bmRlZmluZWQnKSBjb250ZXh0ID0gZG9jO1xuICAgICAgcmV0dXJuICQoc2VsZWN0b3IsIGNvbnRleHQpO1xuICAgIH07XG4gICAgJGNvbnRleHQucm9vdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuICQoJzpyb290JywgZG9jKTtcbiAgICB9O1xuICAgIGlubGluZURvY3VtZW50KCRjb250ZXh0LCBzdHlsZVRleHQsIHsgc3R5bGVBdHRyaWJ1dGVOYW1lOiAncmVwbGFjZWRzdHlsZScgfSk7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlubGluZXJQbHVnaW47IiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKiBnbG9iYWwgZ2xvYmFsOiBmYWxzZSAqL1xudmFyIGNvbnNvbGUgPSByZXF1aXJlKFwiY29uc29sZVwiKTtcbnZhciBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcbnZhciAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcblxudmFyIGxzTG9hZGVyID0gZnVuY3Rpb24oaGFzaF9rZXksIGVtYWlsUHJvY2Vzc29yQmFja2VuZCkge1xuICB2YXIgbWRTdHIgPSBnbG9iYWwubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJtZXRhZGF0YS1cIiArIGhhc2hfa2V5KTtcbiAgaWYgKG1kU3RyICE9PSBudWxsKSB7XG4gICAgdmFyIG1vZGVsO1xuICAgIHZhciB0ZCA9IGdsb2JhbC5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInRlbXBsYXRlLVwiICsgaGFzaF9rZXkpO1xuICAgIGlmICh0ZCAhPT0gbnVsbCkgbW9kZWwgPSBKU09OLnBhcnNlKHRkKTtcbiAgICB2YXIgbWQgPSBKU09OLnBhcnNlKG1kU3RyKTtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0YWRhdGE6IG1kLFxuICAgICAgbW9kZWw6IG1vZGVsLFxuICAgICAgZXh0ZW5zaW9uOiBsc0NvbW1hbmRQbHVnaW5GYWN0b3J5KG1kLCBlbWFpbFByb2Nlc3NvckJhY2tlbmQpXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBcIkNhbm5vdCBmaW5kIHN0b3JlZCBkYXRhIGZvciBcIitoYXNoX2tleTtcbiAgfVxufTtcblxudmFyIGxzQ29tbWFuZFBsdWdpbkZhY3RvcnkgPSBmdW5jdGlvbihtZCwgZW1haWxQcm9jZXNzb3JCYWNrZW5kKSB7XG4gIHZhciBjb21tYW5kc1BsdWdpbiA9IGZ1bmN0aW9uKG1ka2V5LCBtZG5hbWUsIHZpZXdNb2RlbCkge1xuXG4gICAgLy8gY29uc29sZS5sb2coXCJsb2FkaW5nIGZyb20gbWV0YWRhdGFcIiwgbWQsIG1vZGVsKTtcbiAgICB2YXIgc2F2ZUNtZCA9IHtcbiAgICAgIG5hbWU6ICdTYXZlJywgLy8gbDEwbiBoYXBwZW5zIGluIHRoZSB0ZW1wbGF0ZVxuICAgICAgZW5hYmxlZDoga28ub2JzZXJ2YWJsZSh0cnVlKVxuICAgIH07XG4gICAgc2F2ZUNtZC5leGVjdXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICBzYXZlQ21kLmVuYWJsZWQoZmFsc2UpO1xuICAgICAgdmlld01vZGVsLm1ldGFkYXRhLmNoYW5nZWQgPSBEYXRlLm5vdygpO1xuICAgICAgaWYgKHR5cGVvZiB2aWV3TW9kZWwubWV0YWRhdGEua2V5ID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIlVuYWJsZSB0byBmaW5kIGtldCBpbiBtZXRhZGF0YSBvYmplY3QuLi5cIiwgdmlld01vZGVsLm1ldGFkYXRhKTtcbiAgICAgICAgdmlld01vZGVsLm1ldGFkYXRhLmtleSA9IG1ka2V5O1xuICAgICAgfVxuICAgICAgZ2xvYmFsLmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwibWV0YWRhdGEtXCIgKyBtZGtleSwgdmlld01vZGVsLmV4cG9ydE1ldGFkYXRhKCkpO1xuICAgICAgZ2xvYmFsLmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwidGVtcGxhdGUtXCIgKyBtZGtleSwgdmlld01vZGVsLmV4cG9ydEpTT04oKSk7XG4gICAgICBzYXZlQ21kLmVuYWJsZWQodHJ1ZSk7XG4gICAgfTtcbiAgICB2YXIgdGVzdENtZCA9IHtcbiAgICAgIG5hbWU6ICdUZXN0JywgLy8gbDEwbiBoYXBwZW5zIGluIHRoZSB0ZW1wbGF0ZVxuICAgICAgZW5hYmxlZDoga28ub2JzZXJ2YWJsZSh0cnVlKVxuICAgIH07XG4gICAgdmFyIGRvd25sb2FkQ21kID0ge1xuICAgICAgbmFtZTogJ0Rvd25sb2FkJywgLy8gbDEwbiBoYXBwZW5zIGluIHRoZSB0ZW1wbGF0ZVxuICAgICAgZW5hYmxlZDoga28ub2JzZXJ2YWJsZSh0cnVlKVxuICAgIH07XG4gICAgdGVzdENtZC5leGVjdXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICB0ZXN0Q21kLmVuYWJsZWQoZmFsc2UpO1xuICAgICAgdmFyIGVtYWlsID0gZ2xvYmFsLmxvY2FsU3RvcmFnZS5nZXRJdGVtKFwidGVzdGVtYWlsXCIpO1xuICAgICAgaWYgKGVtYWlsID09PSBudWxsIHx8IGVtYWlsID09ICdudWxsJykgZW1haWwgPSB2aWV3TW9kZWwudCgnSW5zZXJ0IGhlcmUgdGhlIHJlY2lwaWVudCBlbWFpbCBhZGRyZXNzJyk7XG4gICAgICBlbWFpbCA9IGdsb2JhbC5wcm9tcHQodmlld01vZGVsLnQoXCJUZXN0IGVtYWlsIGFkZHJlc3NcIiksIGVtYWlsKTtcbiAgICAgIGlmIChlbWFpbC5tYXRjaCgvQC8pKSB7XG4gICAgICAgIGdsb2JhbC5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInRlc3RlbWFpbFwiLCBlbWFpbCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiVE9ETyB0ZXN0aW5nLi4uXCIsIGVtYWlsKTtcbiAgICAgICAgdmFyIHBvc3RVcmwgPSBlbWFpbFByb2Nlc3NvckJhY2tlbmQgPyBlbWFpbFByb2Nlc3NvckJhY2tlbmQgOiAnL2RsLyc7XG4gICAgICAgIHZhciBwb3N0ID0gJC5wb3N0KHBvc3RVcmwsIHtcbiAgICAgICAgICBhY3Rpb246ICdlbWFpbCcsXG4gICAgICAgICAgcmNwdDogZW1haWwsXG4gICAgICAgICAgc3ViamVjdDogXCJbdGVzdF0gXCIgKyBtZGtleSArIFwiIC0gXCIgKyBtZG5hbWUsXG4gICAgICAgICAgaHRtbDogdmlld01vZGVsLmV4cG9ydEhUTUwoKVxuICAgICAgICB9LCBudWxsLCAnaHRtbCcpO1xuICAgICAgICBwb3N0LmZhaWwoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJmYWlsXCIsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgdmlld01vZGVsLm5vdGlmaWVyLmVycm9yKHZpZXdNb2RlbC50KCdVbmV4cGVjdGVkIGVycm9yIHRhbGtpbmcgdG8gc2VydmVyOiBjb250YWN0IHVzIScpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHBvc3Quc3VjY2VzcyhmdW5jdGlvbigpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInN1Y2Nlc3NcIiwgYXJndW1lbnRzKTtcbiAgICAgICAgICB2aWV3TW9kZWwubm90aWZpZXIuc3VjY2Vzcyh2aWV3TW9kZWwudChcIlRlc3QgZW1haWwgc2VudC4uLlwiKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBwb3N0LmFsd2F5cyhmdW5jdGlvbigpIHtcbiAgICAgICAgICB0ZXN0Q21kLmVuYWJsZWQodHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2xvYmFsLmFsZXJ0KHZpZXdNb2RlbC50KCdJbnZhbGlkIGVtYWlsIGFkZHJlc3MnKSk7XG4gICAgICAgIHRlc3RDbWQuZW5hYmxlZCh0cnVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGRvd25sb2FkQ21kLmV4ZWN1dGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGRvd25sb2FkQ21kLmVuYWJsZWQoZmFsc2UpO1xuICAgICAgdmlld01vZGVsLm5vdGlmaWVyLmluZm8odmlld01vZGVsLnQoXCJEb3dubG9hZGluZy4uLlwiKSk7XG4gICAgICB2aWV3TW9kZWwuZXhwb3J0SFRNTHRvVGV4dGFyZWEoJyNkb3dubG9hZEh0bWxUZXh0YXJlYScpO1xuICAgICAgdmFyIHBvc3RVcmwgPSBlbWFpbFByb2Nlc3NvckJhY2tlbmQgPyBlbWFpbFByb2Nlc3NvckJhY2tlbmQgOiAnL2RsLyc7XG4gICAgICBnbG9iYWwuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rvd25sb2FkRm9ybScpLnNldEF0dHJpYnV0ZShcImFjdGlvblwiLCBwb3N0VXJsKTtcbiAgICAgIGdsb2JhbC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG93bmxvYWRGb3JtJykuc3VibWl0KCk7XG4gICAgICBkb3dubG9hZENtZC5lbmFibGVkKHRydWUpO1xuICAgIH07XG5cbiAgICB2aWV3TW9kZWwuc2F2ZSA9IHNhdmVDbWQ7XG4gICAgdmlld01vZGVsLnRlc3QgPSB0ZXN0Q21kO1xuICAgIHZpZXdNb2RlbC5kb3dubG9hZCA9IGRvd25sb2FkQ21kO1xuICB9LmJpbmQodW5kZWZpbmVkLCBtZC5rZXksIG1kLm5hbWUpO1xuXG4gIHJldHVybiBjb21tYW5kc1BsdWdpbjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbHNMb2FkZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnJlcXVpcmUoXCJrbm9ja291dC1zb3J0YWJsZVwiKTtcblxucmVxdWlyZShcIi4vYmluZGluZ3MvanF1ZXJ5dWktc3Bpbm5lci5qc1wiKTtcbnJlcXVpcmUoXCIuL2JpbmRpbmdzL2pxdWVyeXVpLXRhYnMuanNcIik7XG5yZXF1aXJlKFwiLi9iaW5kaW5ncy9jb2xvcnBpY2tlci5qc1wiKTtcbnJlcXVpcmUoXCIuL2JpbmRpbmdzL2Jsb2Nrcy5qc1wiKTtcbnJlcXVpcmUoXCIuL2JpbmRpbmdzL2Nzc3RleHQuanNcIik7XG5yZXF1aXJlKFwiLi9iaW5kaW5ncy9iaW5kLWlmcmFtZS5qc1wiKTtcbnJlcXVpcmUoXCIuL2JpbmRpbmdzL2Ryb3BwYWJsZS5qc1wiKTtcbnJlcXVpcmUoXCIuL2JpbmRpbmdzL2ZpbGV1cGxvYWQuanNcIik7XG5yZXF1aXJlKFwiLi9iaW5kaW5ncy92aXJ0dWFscy5qc1wiKTtcbnJlcXVpcmUoXCIuL2JpbmRpbmdzL3d5c2l3eWdzLmpzXCIpO1xucmVxdWlyZShcIi4vYmluZGluZ3Mvc2Nyb2xsZml4LmpzXCIpO1xucmVxdWlyZShcIi4vYmluZGluZ3MvaWYtc3Vicy5qc1wiKTtcbnJlcXVpcmUoXCIuL2JpbmRpbmdzL2V4dHNvcnRhYmxlcy5qc1wiKTtcbnJlcXVpcmUoXCIuL2JpbmRpbmdzL2V2ZW50YWJsZS5qc1wiKTtcbnJlcXVpcmUoXCIuL2JpbmRpbmdzL3Rvb2x0aXBzLmpzXCIpO1xucmVxdWlyZShcIi4vYmluZGluZ3MvZXh0ZW5kZXItcGFnaW5hdGlvbi5qc1wiKTtcbnJlcXVpcmUoXCIuL2JpbmRpbmdzL3ZhbGlkYXRlZC12YWx1ZS5qc1wiKTtcbnJlcXVpcmUoXCIuL2JpbmRpbmdzL3Njcm9sbGludG92aWV3LmpzXCIpOyIsIlwidXNlIHN0cmljdFwiO1xuLyogZ2xvYmFsIGdsb2JhbDogZmFsc2UgKi9cblxudmFyICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xudmFyIGtvID0gcmVxdWlyZShcImtub2Nrb3V0XCIpO1xudmFyIGtvanF1aSA9IHJlcXVpcmUoXCJrbm9ja291dC1qcXVlcnl1aVwiKTsgLy8ganVzdCBmb3IgdGhlIHdpZGdldCBwbHVnaW5zXG52YXIgdGVtcGxhdGVDb252ZXJ0ZXIgPSByZXF1aXJlKFwiLi9jb252ZXJ0ZXIvbWFpbi5qc1wiKTtcbnZhciBjb25zb2xlID0gcmVxdWlyZShcImNvbnNvbGVcIik7XG52YXIgaW5pdGlhbGl6ZVZpZXdtb2RlbCA9IHJlcXVpcmUoXCIuL3ZpZXdtb2RlbC5qc1wiKTtcbnZhciB0ZW1wbGF0ZVN5c3RlbSA9IHJlcXVpcmUoJy4vYmluZGluZ3MvY2hvb3NlLXRlbXBsYXRlLmpzJyk7XG5cbi8vIGNhbGwgYSBnaXZlbiBtZXRob2Qgb24gZXZlcnkgcGx1Z2luIGltcGxlbWVudGluZyBpdC5cbi8vIHN1cHBvcnRzIGEgXCJyZXZlcnNlXCIgcGFyYW1ldGVyIHRvIGNhbGwgdGhlIG1ldGhvZHMgZnJvbSB0aGUgbGFzdCBvbmUgdG8gdGhlIGZpcnN0IG9uZS5cbnZhciBwbHVnaW5zQ2FsbCA9IGZ1bmN0aW9uKHBsdWdpbnMsIG1ldGhvZE5hbWUsIGFyZ3MsIHJldmVyc2UpIHtcbiAgdmFyIHN0YXJ0LCBlbmQsIGRpZmYsIHJlcywgcmVzdWx0cztcbiAgcmVzdWx0cyA9IFtdO1xuICBpZiAodHlwZW9mIHJldmVyc2UgIT09ICd1bmRlZmluZWQnICYmIHJldmVyc2UpIHtcbiAgICBzdGFydCA9IHBsdWdpbnMubGVuZ3RoIC0gMTtcbiAgICBlbmQgPSAwO1xuICAgIGRpZmYgPSAtMTtcbiAgfSBlbHNlIHtcbiAgICBzdGFydCA9IDA7XG4gICAgZW5kID0gcGx1Z2lucy5sZW5ndGggLSAxO1xuICAgIGRpZmYgPSAxO1xuICB9XG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSAhPSBlbmQgKyBkaWZmOyBpICs9IGRpZmYpIHtcbiAgICBpZiAodHlwZW9mIHBsdWdpbnNbaV1bbWV0aG9kTmFtZV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXMgPSBwbHVnaW5zW2ldW21ldGhvZE5hbWVdLmFwcGx5KHBsdWdpbnNbaV0sIGFyZ3MpO1xuICAgICAgaWYgKHR5cGVvZiByZXMgIT09ICd1bmRlZmluZWQnKSByZXN1bHRzLnB1c2gocmVzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vLyB3b3JrYXJvdW5kIGZvciBrbm9ja291dC1qcXVlcnl1aSdzIGJ1dHRvbnNldC9idXR0b24gZGlzcG9zYWw6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ3Zhcy9rbm9ja291dC1qcXVlcnl1aS9pc3N1ZXMvMjVcbnZhciBvcmlnRGlzcG9zZUNhbGxiYWNrID0ga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFjaztcbmtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbC5hZGREaXNwb3NlQ2FsbGJhY2sgPSBmdW5jdGlvbihub2RlLCBjYWxsYmFjaykge1xuICB2YXIgbmV3Q2FsbGJhY2sgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNhbGxiYWNrKG5vZGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhdWdodCB1bmV4cGVjdGVkIGRpc3Bvc2UgY2FsbGJhY2sgZXhjZXB0aW9uXCIsIGUpO1xuICAgIH1cbiAgfTtcbiAgb3JpZ0Rpc3Bvc2VDYWxsYmFjayhub2RlLCBuZXdDYWxsYmFjayk7XG59O1xuXG52YXIgYmluZGluZ1BsdWdpbk1ha2VyID0gZnVuY3Rpb24ocGVyZm9ybWFuY2VBd2FyZUNhbGxlcikge1xuICByZXR1cm4ge1xuICAgIHZpZXdNb2RlbDogZnVuY3Rpb24odmlld01vZGVsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwZXJmb3JtYW5jZUF3YXJlQ2FsbGVyKCdhcHBseUJpbmRpbmdzJywga28uYXBwbHlCaW5kaW5ncy5iaW5kKHVuZGVmaW5lZCwgdmlld01vZGVsKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGVyciwgZXJyLnN0YWNrKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGlzcG9zZTogZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwZXJmb3JtYW5jZUF3YXJlQ2FsbGVyKCd1bmFwcGx5QmluZGluZ3MnLCBrby5jbGVhbk5vZGUuYmluZCh0aGlzLCBnbG9iYWwuZG9jdW1lbnQuYm9keSkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihlcnIsIGVyci5zdGFjayk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuXG52YXIgdGVtcGxhdGVDcmVhdG9yID0gZnVuY3Rpb24odGVtcGxhdGVQbHVnaW4sIGh0bWxPckVsZW1lbnQsIG9wdGlvbmFsTmFtZSwgdGVtcGxhdGVNb2RlKSB7XG4gIHZhciB0bXBOYW1lID0gb3B0aW9uYWxOYW1lO1xuICBpZiAodHlwZW9mIG9wdGlvbmFsTmFtZSAhPSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdGVtcGxhdGVNb2RlICE9ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBodG1sT3JFbGVtZW50ICE9ICdvYmplY3QnIHx8IGh0bWxPckVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9ICdyZXBsYWNlZGh0bWwnKSB0bXBOYW1lICs9ICctJyArIHRlbXBsYXRlTW9kZTtcbiAgfVxuXG4gIHdoaWxlICh0eXBlb2YgdG1wTmFtZSA9PSAndW5kZWZpbmVkJyB8fCB0bXBOYW1lID09PSBudWxsIHx8IHRlbXBsYXRlUGx1Z2luLmV4aXN0cyh0bXBOYW1lKSkge1xuICAgIHRtcE5hbWUgPSAnYW5vbnltb3VzLScgKyBNYXRoLmZsb29yKChNYXRoLnJhbmRvbSgpICogMTAwMDAwKSArIDEpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBodG1sT3JFbGVtZW50ID09ICdvYmplY3QnICYmIGh0bWxPckVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICdyZXBsYWNlZGh0bWwnKSB7XG4gICAgdmFyICRlbCA9ICQoaHRtbE9yRWxlbWVudCk7XG4gICAgdmFyICRoZWFkID0gJCgncmVwbGFjZWRoZWFkJywgJGVsKTtcbiAgICB2YXIgJGJvZHkgPSAkKCdyZXBsYWNlZGJvZHknLCAkZWwpO1xuICAgIHRlbXBsYXRlUGx1Z2luLmFkZGVyKHRtcE5hbWUgKyAnLWhlYWQnLCAkaGVhZC5odG1sKCkgfHwgJycpO1xuICAgIHRlbXBsYXRlUGx1Z2luLmFkZGVyKHRtcE5hbWUgKyAnLXNob3cnLCAkYm9keS5odG1sKCkgfHwgJycpO1xuICAgIHRlbXBsYXRlUGx1Z2luLmFkZGVyKHRtcE5hbWUgKyAnLXByZXZpZXcnLCAkZWwuaHRtbCgpKTtcbiAgICB0ZW1wbGF0ZVBsdWdpbi5hZGRlcih0bXBOYW1lICsgJy13eXNpd3lnJywgJGVsLmh0bWwoKSk7XG5cbiAgICAvLyAkaGVhZC5hdHRyKCdkYXRhLWJpbmQnLCAnYmxvY2s6IGNvbnRlbnQnKTtcbiAgICAkaGVhZC5jaGlsZHJlbigpLmRldGFjaCgpO1xuICAgICRoZWFkLmh0bWwoXCI8IS0tIGtvIGJsb2NrOiBjb250ZW50IC0tPjwhLS0gL2tvIC0tPlwiKTtcbiAgICAkaGVhZC5iZWZvcmUoJzwhLS0ga28gd2l0aFByb3BlcnRpZXM6IHsgdGVtcGxhdGVNb2RlOiBcXCdoZWFkXFwnIH0gLS0+Jyk7XG4gICAgJGhlYWQuYWZ0ZXIoJzwhLS0gL2tvIC0tPicpO1xuICAgICRib2R5Lmh0bWwoXCI8IS0tIGtvIGJsb2NrOiBjb250ZW50IC0tPjwhLS0gL2tvIC0tPlwiKTtcblxuICAgIHRlbXBsYXRlUGx1Z2luLmFkZGVyKHRtcE5hbWUgKyAnLWlmcmFtZScsICRlbFswXS5vdXRlckhUTUwpO1xuXG4gIH0gZWxzZSBpZiAodHlwZW9mIGh0bWxPckVsZW1lbnQgPT0gJ29iamVjdCcpIHtcbiAgICB0ZW1wbGF0ZVBsdWdpbi5hZGRlcih0bXBOYW1lLCBodG1sT3JFbGVtZW50Lm91dGVySFRNTCk7XG4gIH0gZWxzZSB7XG4gICAgdGVtcGxhdGVQbHVnaW4uYWRkZXIodG1wTmFtZSwgaHRtbE9yRWxlbWVudCk7XG4gIH1cblxuICByZXR1cm4gdG1wTmFtZTtcbn07XG5cbi8vIEFkYXB0ZXIgdG8gdHJhbnNmb3JtIFwidmlld01vZGVsIHBsdWdpbnNcIiBpbnRvIG1vcmUgZ2VuZXJpYyBwbHVnaW5zLlxuZnVuY3Rpb24gX3ZpZXdNb2RlbFBsdWdpbkluc3RhbmNlKHBsdWdpbkZ1bmN0aW9uKSB7XG4gIHZhciBpbnN0YW5jZTtcbiAgcmV0dXJuIHtcbiAgICB2aWV3TW9kZWw6IGZ1bmN0aW9uKHZpZXdNb2RlbCkge1xuICAgICAgaW5zdGFuY2UgPSBwbHVnaW5GdW5jdGlvbih2aWV3TW9kZWwpO1xuICAgIH0sXG4gICAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgaW5zdGFuY2UuaW5pdCAhPT0gJ3VuZGVmaW5lZCcpIGluc3RhbmNlLmluaXQoKTtcbiAgICB9LFxuICAgIGRpc3Bvc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGluc3RhbmNlLmRpc3Bvc2UgIT09ICd1bmRlZmluZWQnKSBpbnN0YW5jZS5kaXNwb3NlKCk7XG4gICAgfVxuICB9O1xufVxuXG52YXIgX3RlbXBsYXRlVXJsQ29udmVydGVyID0gZnVuY3Rpb24oYmFzZVBhdGgsIHVybCkge1xuICBpZiAoIXVybC5tYXRjaCgvXlteXFwvXSo6LykgJiYgIXVybC5tYXRjaCgvXlxcLy8pICYmICF1cmwubWF0Y2goL15cXFsvKSAmJiAhdXJsLm1hdGNoKC9eIz8kLykpIHtcbiAgICAvLyBUT0RPIHRoaXMgY291bGQgYmUgc21hcnRlciBqb2luaW5nIHRoZSB1cmxzLi4uXG4gICAgcmV0dXJuIGJhc2VQYXRoICsgdXJsO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG52YXIgdGVtcGxhdGVMb2FkZXIgPSBmdW5jdGlvbihwZXJmb3JtYW5jZUF3YXJlQ2FsbGVyLCB0ZW1wbGF0ZUZpbGVOYW1lLCB0ZW1wbGF0ZU1ldGFkYXRhLCBqc29yanNvbiwgZXh0ZW5zaW9ucywgZ2FsbGVyeVVybCkge1xuICB2YXIgdGVtcGxhdGVGaWxlID0gdHlwZW9mIHRlbXBsYXRlRmlsZU5hbWUgPT0gJ3N0cmluZycgPyB0ZW1wbGF0ZUZpbGVOYW1lIDogdGVtcGxhdGVNZXRhZGF0YS50ZW1wbGF0ZTtcbiAgdmFyIHRlbXBsYXRlUGF0aCA9IFwiLi9cIjtcbiAgdmFyIHAgPSB0ZW1wbGF0ZUZpbGUubGFzdEluZGV4T2YoJy8nKTtcbiAgaWYgKHAgIT0gLTEpIHtcbiAgICB0ZW1wbGF0ZVBhdGggPSB0ZW1wbGF0ZUZpbGUuc3Vic3RyKDAsIHAgKyAxKTtcbiAgfVxuXG4gIHZhciB0ZW1wbGF0ZVVybENvbnZlcnRlciA9IF90ZW1wbGF0ZVVybENvbnZlcnRlci5iaW5kKHVuZGVmaW5lZCwgdGVtcGxhdGVQYXRoKTtcblxuICB2YXIgbWV0YWRhdGE7XG4gIGlmICh0eXBlb2YgdGVtcGxhdGVNZXRhZGF0YSA9PSAndW5kZWZpbmVkJykge1xuICAgIG1ldGFkYXRhID0ge1xuICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlRmlsZSxcbiAgICAgIC8vIFRPRE8gbDEwbj9cbiAgICAgIG5hbWU6ICdObyBuYW1lJyxcbiAgICAgIGNyZWF0ZWQ6IERhdGUubm93KClcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIG1ldGFkYXRhID0gdGVtcGxhdGVNZXRhZGF0YTtcbiAgfVxuXG4gICQuZ2V0KHRlbXBsYXRlRmlsZSwgZnVuY3Rpb24odGVtcGxhdGVjb2RlKSB7XG4gICAgdmFyIHJlcyA9IHRlbXBsYXRlQ29tcGlsZXIocGVyZm9ybWFuY2VBd2FyZUNhbGxlciwgdGVtcGxhdGVVcmxDb252ZXJ0ZXIsIFwidGVtcGxhdGVcIiwgdGVtcGxhdGVjb2RlLCBqc29yanNvbiwgbWV0YWRhdGEsIGV4dGVuc2lvbnMsIGdhbGxlcnlVcmwpO1xuICAgIHJlcy5pbml0KCk7XG4gIH0pO1xufTtcblxudmFyIHRlbXBsYXRlQ29tcGlsZXIgPSBmdW5jdGlvbihwZXJmb3JtYW5jZUF3YXJlQ2FsbGVyLCB0ZW1wbGF0ZVVybENvbnZlcnRlciwgdGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZWNvZGUsIGpzb3Jqc29uLCBtZXRhZGF0YSwgZXh0ZW5zaW9ucywgZ2FsbGVyeVVybCkge1xuICAvLyB3ZSBzdHJpcCBjb250ZW50IGJlZm9yZSA8aHRtbD4gdGFnIGFuZCBhZnRlciA8L2h0bWw+IGJlY2F1c2UganF1ZXJ5IGRvZXNuJ3QgcGFyc2UgaXQuXG4gIC8vIHdlJ2xsIGtlZXAgaXQgXCJyYXdcIiBhbmQgdXNlIGl0IGluIHRoZSBwcmV2aWV3L291dHB1dCBtZXRob2RzLlxuICB2YXIgcmVzID0gdGVtcGxhdGVjb2RlLm1hdGNoKC9eKFtcXFNcXHNdKikoWzxdaHRtbFtePl0qPltcXFNcXHNdKjxcXC9odG1sPikoW1xcU1xcc10qKSQvaSk7XG4gIGlmIChyZXMgPT09IG51bGwpIHRocm93IFwiVW5hYmxlIHRvIGZpbmQgPGh0bWw+IG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFncyBpbiB0aGUgdGVtcGxhdGVcIjtcbiAgdmFyIHByZWZpeCA9IHJlc1sxXTtcbiAgLy8gd2UgcGFyc2UgdGhlIGh0bWwgY29udGVudCBhZnRlciByZXBsYWNpbmcgdGhlIHRhZyBuYW1lIGZvciBodG1sL2hlYWQvYm9keSBzbyB0byBhdm9pZCBqcXVlcnkgaXNzdWVzIGluIHBhcnNpbmcuXG4gIHZhciBiYXNpY1N0cnVjdHVyZSA9IHsgJzxodG1sJzogMCwgJzxoZWFkJzogMCwgJzxib2R5JzogMCwgJzwvaHRtbCc6IDAsICc8L2JvZHknOiAwLCAnPC9oZWFkJzogMCB9O1xuICB2YXIgaHRtbCA9IHJlc1syXS5yZXBsYWNlKC8oPFxcLz8pKGh0bWx8aGVhZHxib2R5KShbXj5dKj4pL2dpLCBmdW5jdGlvbihtYXRjaCwgcDEsIHAyLCBwMykge1xuICAgIGJhc2ljU3RydWN0dXJlWyhwMStwMikudG9Mb3dlckNhc2UoKV0gKz0gMTtcbiAgICByZXR1cm4gcDEgKyAncmVwbGFjZWQnICsgcDIgKyBwMztcbiAgfSk7XG4gIGZvciAodmFyIGVsZSBpbiBiYXNpY1N0cnVjdHVyZSkgaWYgKGJhc2ljU3RydWN0dXJlLmhhc093blByb3BlcnR5KGVsZSkpIGlmIChiYXNpY1N0cnVjdHVyZVtlbGVdICE9IDEpIHtcbiAgICBpZiAoYmFzaWNTdHJ1Y3R1cmVbZWxlXSA9PT0gMCkgdGhyb3cgXCJFUlJPUjogbWlzc2luZyBtYW5kYXRvcnkgZWxlbWVudCBcIitlbGUrXCI+XCI7XG4gICAgaWYgKGJhc2ljU3RydWN0dXJlW2VsZV0gPiAxKSB0aHJvdyBcIkVSUk9SOiBtdWx0aXBsZSBlbGVtZW50IFwiK2VsZStcIj4gb2Njb3VyZW5jZXMgYXJlIG5vdCBzdXBwb3J0ZWQgKGZvdW5kIFwiK2Jhc2ljU3RydWN0dXJlW2VsZV0rXCIgb2Njb3VyZW5jZXMpXCI7XG4gIH1cbiAgdmFyIHBvc3RmaXggPSByZXNbM107XG4gIHZhciBibG9ja0RlZnMgPSBbXTtcbiAgdmFyIGVuYWJsZVVuZG8gPSB0cnVlO1xuICB2YXIgZW5hYmxlUmVjb3JkZXIgPSB0cnVlO1xuICB2YXIgYmFzZVRocmVzaG9sZCA9ICcrJHJvb3QuY29udGVudExpc3RlbmVycygpJztcblxuICB2YXIgcGx1Z2lucyA9IFtdO1xuXG4gIGlmICh0eXBlb2YgZXh0ZW5zaW9ucyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0eXBlb2YgZXh0ZW5zaW9uc1tpXSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBsdWdpbnMucHVzaChfdmlld01vZGVsUGx1Z2luSW5zdGFuY2UoZXh0ZW5zaW9uc1tpXSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGx1Z2lucy5wdXNoKGV4dGVuc2lvbnNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBjcmVhdGVkVGVtcGxhdGVzID0gW107XG4gIHZhciB0ZW1wbGF0ZXNQbHVnaW4gPSB7XG4gICAgYWRkZXI6IGZ1bmN0aW9uKGlkLCBodG1sKSB7XG4gICAgICBpZiAodHlwZW9mIGh0bWwgIT09ICdzdHJpbmcnKSB0aHJvdyBcIlRlbXBsYXRlIHN5c3RlbTogY2Fubm90IGNyZWF0ZSBuZXcgdGVtcGxhdGUgXCIgKyBpZDtcbiAgICAgIHZhciB0cmFzaCA9IGh0bWwubWF0Y2goLyhkYXRhKT8ta28tW14gPTpdKi9nKTtcbiAgICAgIGlmICh0cmFzaCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRVJST1I6IGZvdW5kIHVuZXhwZWN0ZWQgLWtvLSBhdHRyaWJ1dGUgaW4gY29tcGlsZWQgdGVtcGxhdGVcIiwgaWQsIFwiLCB5b3UgcHJvYmFibHkgbWlzcGVsbGVkIGl0OlwiLCB0cmFzaCk7XG4gICAgICB9XG4gICAgICB0ZW1wbGF0ZVN5c3RlbS5hZGRUZW1wbGF0ZShpZCwgaHRtbCk7XG4gICAgICBjcmVhdGVkVGVtcGxhdGVzLnB1c2goaWQpO1xuICAgIH0sXG4gICAgZXhpc3RzOiBmdW5jdGlvbihpZCkge1xuICAgICAgdmFyIGVsID0gdGVtcGxhdGVTeXN0ZW0uZ2V0VGVtcGxhdGVDb250ZW50KGlkKTtcbiAgICAgIGlmICh0eXBlb2YgZWwgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgZGlzcG9zZTogZnVuY3Rpb24oKSB7XG4gICAgICBmb3IgKHZhciBpID0gY3JlYXRlZFRlbXBsYXRlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB0ZW1wbGF0ZVN5c3RlbS5yZW1vdmVUZW1wbGF0ZShjcmVhdGVkVGVtcGxhdGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAga28uYmluZGluZ0hhbmRsZXJzWydibG9jayddLnRlbXBsYXRlRXhpc3RzID0gdGVtcGxhdGVzUGx1Z2luLmV4aXN0cztcblxuICAvLyB0ZW1wbGF0ZWNyZWF0b3IgdHJhY2tzIGNyZWF0ZWQgdGVtcGxhdGUgKHZpYSB0ZW1wbGF0ZUFkZGVyKSBzbyB0byBiZSBhYmxlIHRvIGRpc3Bvc2UgdGhlbSBsYXRlclxuICB2YXIgbXlUZW1wbGF0ZUNyZWF0b3IgPSB0ZW1wbGF0ZUNyZWF0b3IuYmluZCh1bmRlZmluZWQsIHRlbXBsYXRlc1BsdWdpbik7XG5cbiAgLy8gZmlyc3QgcGFzczogd2UgXCJjb21waWxlXCIgdGhlIHRlbXBsYXRlIGludG8gYSB0ZXJtcGxhdGVEZWYgb2JqZWN0XG4gIHZhciB0ZW1wbGF0ZURlZiA9IHBlcmZvcm1hbmNlQXdhcmVDYWxsZXIoJ3RyYW5zbGF0ZVRlbXBsYXRlJywgdGVtcGxhdGVDb252ZXJ0ZXIudHJhbnNsYXRlVGVtcGxhdGUuYmluZCh1bmRlZmluZWQsIHRlbXBsYXRlTmFtZSwgaHRtbCwgdGVtcGxhdGVVcmxDb252ZXJ0ZXIsIG15VGVtcGxhdGVDcmVhdG9yKSk7XG5cbiAgLy8gc2Vjb25kIHBhc3M6IGdpdmVuIHRoZSB0ZW1wbGF0ZURlZiB3ZSBjcmVhdGUgYSBiYXNlIGNvbnRlbnQgbW9kZWwgb2JqZWN0IGZvciB0aGlzIHRlbXBsYXRlLlxuICB2YXIgY29udGVudCA9IHBlcmZvcm1hbmNlQXdhcmVDYWxsZXIoJ2dlbmVyYXRlTW9kZWwnLCB0ZW1wbGF0ZUNvbnZlcnRlci53cmFwcGVkUmVzdWx0TW9kZWwuYmluZCh1bmRlZmluZWQsIHRlbXBsYXRlRGVmKSk7XG5cbiAgLy8gdGhpcmQgcGFzczogd2UgY3JlYXRlIFwic3R5bGUvY29udGVudCBlZGl0b3JzXCIgZm9yIGV2ZXJ5IGJsb2NrXG4gIHZhciB3aWRnZXRzID0ge307XG4gIHZhciB3aWRnZXRQbHVnaW5zID0gcGx1Z2luc0NhbGwocGx1Z2lucywgJ3dpZGdldCcsIFskLCBrbywga29qcXVpXSk7XG4gIGZvciAodmFyIHdpID0gMDsgd2kgPCB3aWRnZXRQbHVnaW5zLmxlbmd0aDsgd2krKykge1xuICAgIHdpZGdldHNbd2lkZ2V0UGx1Z2luc1t3aV0ud2lkZ2V0XSA9IHdpZGdldFBsdWdpbnNbd2ldO1xuICB9XG4gIGJsb2NrRGVmcy5wdXNoLmFwcGx5KGJsb2NrRGVmcywgcGVyZm9ybWFuY2VBd2FyZUNhbGxlcignZ2VuZXJhdGVFZGl0b3JzJywgdGVtcGxhdGVDb252ZXJ0ZXIuZ2VuZXJhdGVFZGl0b3JzLmJpbmQodW5kZWZpbmVkLCB0ZW1wbGF0ZURlZiwgd2lkZ2V0cywgdGVtcGxhdGVVcmxDb252ZXJ0ZXIsIG15VGVtcGxhdGVDcmVhdG9yLCBiYXNlVGhyZXNob2xkKSkpO1xuXG4gIHZhciBpbmNvbXBhdGlibGVUZW1wbGF0ZSA9IGZhbHNlO1xuICBpZiAodHlwZW9mIGpzb3Jqc29uICE9PSAndW5kZWZpbmVkJyAmJiBqc29yanNvbiAhPT0gbnVsbCkge1xuICAgIHZhciB1bndyYXBwZWQ7XG4gICAgaWYgKHR5cGVvZiBqc29yanNvbiA9PSAnc3RyaW5nJykge1xuICAgICAgdW53cmFwcGVkID0ga28udXRpbHMucGFyc2VKc29uKGpzb3Jqc29uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW53cmFwcGVkID0ganNvcmpzb247XG4gICAgfVxuXG4gICAgLy8gd2UgcnVuIGEgYmFzaWMgY29tcGF0aWJpbGl0eSBjaGVjayBiZXR3ZWVuIHRoZSBjb250ZW50LW1vZGVsIHdlIGV4cGVjdCBhbmQgdGhlIGluaXRpYWxpemF0aW9uIG1vZGVsXG4gICAgdmFyIGNoZWNrTW9kZWxSZXMgPSBwZXJmb3JtYW5jZUF3YXJlQ2FsbGVyKCdjaGVja01vZGVsJywgdGVtcGxhdGVDb252ZXJ0ZXIuY2hlY2tNb2RlbC5iaW5kKHVuZGVmaW5lZCwgY29udGVudC5fdW53cmFwKCksIGJsb2NrRGVmcywgdW53cmFwcGVkKSk7XG4gICAgLy8gaWYgY2hlY2tNb2RlbFJlcyBpcyAxIHRoZW4gdGhlIG1vZGVsIGlzIG5vdCBmdWxseSBjb21wYXRpYmxlIGJ1dCB3ZSBmaXhlZCBpdFxuICAgIGlmIChjaGVja01vZGVsUmVzID09IDIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJUcnlpbmcgdG8gY29tcGlsZSBhbiBpbmNvbXBhdGlibGUgdGVtcGxhdGUgdmVyc2lvbiFcIiwgY29udGVudC5fdW53cmFwKCksIGJsb2NrRGVmcywgdW53cmFwcGVkKTtcbiAgICAgIGluY29tcGF0aWJsZVRlbXBsYXRlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29udGVudC5fd3JhcCh1bndyYXBwZWQpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiVW5hYmxlIHRvIGluamVjdCBtb2RlbCBjb250ZW50IVwiLCBleCk7XG4gICAgICBpbmNvbXBhdGlibGVUZW1wbGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhpcyBidWlsZCB0aGUgdGVtcGxhdGUgZm9yIHRoZSBwcmV2aWV3L291dHB1dCwgYnV0IGNvbmNhdGVuYXRpbmcgcHJlZml4LCB0ZW1wbGF0ZSBhbmQgY29udGVudCBhbmQgc3RyaXBwaW5nIHRoZSBcInJlcGxhY2VkXCIgcHJlZml4IGFkZGVkIHRvIFwicHJvYmxlbWF0aWNcIiB0YWcgKGh0bWwvaGVhZC9ib2R5KVxuICB2YXIgaWZyYW1lVHBsID0gcHJlZml4ICsgdGVtcGxhdGVTeXN0ZW0uZ2V0VGVtcGxhdGVDb250ZW50KHRlbXBsYXRlTmFtZSArICctaWZyYW1lJykucmVwbGFjZSgvKDxcXC8/KXJlcGxhY2VkKGh0bWx8aGVhZHxib2R5KShbXj5dKj4pL2dpLCBmdW5jdGlvbihtYXRjaCwgcDEsIHAyLCBwMykge1xuICAgIHJldHVybiBwMSArIHAyICsgcDM7XG4gIH0pICsgcG9zdGZpeDtcblxuICAvLyBzdG9yZSB0aGlzIHNvIHRvIHJlc3RvcmUgaXQgb24gZGlzcG9zYWxlXG4gIHZhciBvcmlnaUZyYW1lVHBsID0ga28uYmluZGluZ0hhbmRsZXJzLmJpbmRJZnJhbWUudHBsO1xuICBrby5iaW5kaW5nSGFuZGxlcnMuYmluZElmcmFtZS50cGwgPSBpZnJhbWVUcGw7XG4gIHZhciBpRnJhbWVQbHVnaW4gPSB7XG4gICAgZGlzcG9zZTogZnVuY3Rpb24oKSB7XG4gICAgICBrby5iaW5kaW5nSGFuZGxlcnMuYmluZElmcmFtZS50cGwgPSBvcmlnaUZyYW1lVHBsO1xuICAgIH1cbiAgfTtcblxuICBwbHVnaW5zLnB1c2goaUZyYW1lUGx1Z2luKTtcbiAgcGx1Z2lucy5wdXNoKHRlbXBsYXRlc1BsdWdpbik7XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgdmlld01vZGVsIG9iamVjdCBiYXNlZCBvbiB0aGUgY29udGVudCBtb2RlbC5cbiAgdmFyIHZpZXdNb2RlbCA9IHBlcmZvcm1hbmNlQXdhcmVDYWxsZXIoJ2luaXRpYWxpemVWaWV3bW9kZWwnLCBpbml0aWFsaXplVmlld21vZGVsLmJpbmQodGhpcywgY29udGVudCwgYmxvY2tEZWZzLCB0ZW1wbGF0ZVVybENvbnZlcnRlciwgZ2FsbGVyeVVybCkpO1xuXG4gIHZpZXdNb2RlbC5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICAvLyBsZXQncyBydW4gc29tZSB2ZXJzaW9uIGNoZWNrIG9uIHRlbXBsYXRlIGFuZCBlZGl0b3IgdXNlZCB0byBidWlsZCB0aGUgbW9kZWwgYmVpbmcgbG9hZGVkLlxuICB2YXIgZWRpdHZlciA9ICcwLjE2LjAnO1xuICBpZiAodHlwZW9mIHZpZXdNb2RlbC5tZXRhZGF0YS5lZGl0b3J2ZXJzaW9uICE9PSAndW5kZWZpbmVkJyAmJiB2aWV3TW9kZWwubWV0YWRhdGEuZWRpdG9ydmVyc2lvbiAhPT0gZWRpdHZlcikge1xuICAgIGNvbnNvbGUud2FybihcIlRoZSBtb2RlbCBiZWluZyBsb2FkZWQgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIGFuIG9sZGVyIGVkaXRvciB2ZXJzaW9uXCIsIHZpZXdNb2RlbC5tZXRhZGF0YS5lZGl0b3J2ZXJzaW9uLCBcInZzXCIsIGVkaXR2ZXIpO1xuICB9XG4gIHZpZXdNb2RlbC5tZXRhZGF0YS5lZGl0b3J2ZXJzaW9uID0gZWRpdHZlcjtcblxuICBpZiAodHlwZW9mIHRlbXBsYXRlRGVmLnZlcnNpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHR5cGVvZiB2aWV3TW9kZWwubWV0YWRhdGEudGVtcGxhdGV2ZXJzaW9uICE9PSAndW5kZWZpbmVkJyAmJiB2aWV3TW9kZWwubWV0YWRhdGEudGVtcGxhdGV2ZXJzaW9uICE9PSB0ZW1wbGF0ZURlZi52ZXJzaW9uKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiVGhlIG1vZGVsIGJlaW5nIGxvYWRlZCBoYXMgYmVlbiBjcmVhdGVkIHdpdGggYSBkaWZmZXJlbnQgdGVtcGxhdGUgdmVyc2lvblwiLCB0ZW1wbGF0ZURlZi52ZXJzaW9uLCBcInZzXCIsIHZpZXdNb2RlbC5tZXRhZGF0YS50ZW1wbGF0ZXZlcnNpb24pO1xuICAgIH1cbiAgICB2aWV3TW9kZWwubWV0YWRhdGEudGVtcGxhdGV2ZXJzaW9uID0gdGVtcGxhdGVEZWYudmVyc2lvbjtcbiAgfVxuXG4gIHRlbXBsYXRlU3lzdGVtLmluaXQoKTtcblxuICAvLyBldmVyeXRoaW5nJ3MgcmVhZHksIHN0YXJ0IGtub2Nrb3V0IGJpbmRpbmdzLlxuICBwbHVnaW5zLnB1c2goYmluZGluZ1BsdWdpbk1ha2VyKHBlcmZvcm1hbmNlQXdhcmVDYWxsZXIpKTtcblxuICBwbHVnaW5zQ2FsbChwbHVnaW5zLCAndmlld01vZGVsJywgW3ZpZXdNb2RlbF0pO1xuXG4gIGlmIChpbmNvbXBhdGlibGVUZW1wbGF0ZSkge1xuICAgICQoJyNpbmNvbXBhdGlibGUtdGVtcGxhdGUnKS5kaWFsb2coe1xuICAgICAgbW9kYWw6IHRydWUsXG4gICAgICBhcHBlbmRUbzogJyNtby1ib2R5JyxcbiAgICAgIGJ1dHRvbnM6IHtcbiAgICAgICAgT2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICQodGhpcykuZGlhbG9nKFwiY2xvc2VcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbW9kZWw6IHZpZXdNb2RlbCxcbiAgICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICAgIHBsdWdpbnNDYWxsKHBsdWdpbnMsICdpbml0JywgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICB9LFxuICAgIGRpc3Bvc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgcGx1Z2luc0NhbGwocGx1Z2lucywgJ2Rpc3Bvc2UnLCB1bmRlZmluZWQsIHRydWUpO1xuICAgIH1cbiAgfTtcblxufTtcblxuXG52YXIgY2hlY2tGZWF0dXJlID0gZnVuY3Rpb24oZmVhdHVyZSwgZnVuYykge1xuICBpZiAoIWZ1bmMoKSkge1xuICAgIGNvbnNvbGUud2FybihcIk1pc3NpbmcgZmVhdHVyZVwiLCBmZWF0dXJlKTtcbiAgICB0aHJvdyBcIk1pc3NpbmcgZmVhdHVyZSBcIiArIGZlYXR1cmU7XG4gIH1cbn07XG5cbnZhciBpc0NvbXBhdGlibGUgPSBmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICAvLyB3aW5kb3cubXNNYXRjaE1lZGlhIHdvdWxkIG1hdGNoIGFsc28gSUU5XG4gICAgLy8gSUU5IHdvdWxkbid0IGJlIHNvIGhhcmQgdG8gc3VwcG9ydCwgYnV0IGl0IGRvZXNuJ3Qgd29ydGggaXQuIChwcmV2aWV3IGlmcmFtZSBhbmQgYXV0b21hdGljIHNjcm9sbCBhcmUgMiB0aGluZ3Mgbm90IHdvcmtpbmcgaW4gSUU5KVxuICAgIGNoZWNrRmVhdHVyZSgnbWF0Y2hNZWRpYScsIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBnbG9iYWwubWF0Y2hNZWRpYSAhPSAndW5kZWZpbmVkJztcbiAgICB9KTtcbiAgICBjaGVja0ZlYXR1cmUoJ1hNTEh0dHBSZXF1ZXN0IDInLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAnWE1MSHR0cFJlcXVlc3QnIGluIGdsb2JhbCAmJiAnd2l0aENyZWRlbnRpYWxzJyBpbiBuZXcgZ2xvYmFsLlhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgfSk7XG4gICAgY2hlY2tGZWF0dXJlKCdFUzUgc3RyaWN0JywgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7IC8qIFwidXNlIHN0cmljdFwiOyovXG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcyA9PSAndW5kZWZpbmVkJztcbiAgICAgIH0oKTtcbiAgICB9KTtcbiAgICBjaGVja0ZlYXR1cmUoJ0NTUyBib3JkZXJSYWRpdXMnLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgZ2xvYmFsLmRvY3VtZW50LmJvZHkuc3R5bGVbJ2JvcmRlclJhZGl1cyddICE9ICd1bmRlZmluZWQnO1xuICAgIH0pO1xuICAgIGNoZWNrRmVhdHVyZSgnQ1NTIGJveFNoYWRvdycsIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBnbG9iYWwuZG9jdW1lbnQuYm9keS5zdHlsZVsnYm94U2hhZG93J10gIT0gJ3VuZGVmaW5lZCc7XG4gICAgfSk7XG4gICAgY2hlY2tGZWF0dXJlKCdDU1MgYm94U2l6aW5nJywgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIGdsb2JhbC5kb2N1bWVudC5ib2R5LnN0eWxlWydib3hTaXppbmcnXSAhPSAndW5kZWZpbmVkJztcbiAgICB9KTtcbiAgICBjaGVja0ZlYXR1cmUoJ0NTUyBiYWNrZ3JvdW5kU2l6ZScsIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBnbG9iYWwuZG9jdW1lbnQuYm9keS5zdHlsZVsnYmFja2dyb3VuZFNpemUnXSAhPSAndW5kZWZpbmVkJztcbiAgICB9KTtcbiAgICBjaGVja0ZlYXR1cmUoJ0NTUyBiYWNrZ3JvdW5kT3JpZ2luJywgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIGdsb2JhbC5kb2N1bWVudC5ib2R5LnN0eWxlWydiYWNrZ3JvdW5kT3JpZ2luJ10gIT0gJ3VuZGVmaW5lZCc7XG4gICAgfSk7XG4gICAgY2hlY2tCYWRCcm93c2VyRXh0ZW5zaW9ucygpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbnZhciBjaGVja0JhZEJyb3dzZXJFeHRlbnNpb25zID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpZCA9ICdjaGVja2JhZGJyb3dzZXJzZnJhbWUnO1xuICB2YXIgb3JpZ1RwbCA9IGtvLmJpbmRpbmdIYW5kbGVycy5iaW5kSWZyYW1lLnRwbDtcbiAga28uYmluZGluZ0hhbmRsZXJzLmJpbmRJZnJhbWUudHBsID0gXCI8IURPQ1RZUEUgaHRtbD5cXHJcXG48aHRtbD5cXHJcXG48aGVhZD48dGl0bGU+QTwvdGl0bGU+XFxyXFxuPC9oZWFkPlxcclxcbjxib2R5PjxwIHN0eWxlPVxcXCJjb2xvcjogYmx1ZVxcXCIgYWxpZ249XFxcInJpZ2h0XFxcIiBkYXRhLWJpbmQ9XFxcInN0eWxlOiB7IGNvbG9yOiAncmVkJyB9XFxcIj5CPC9wPjxkaXYgZGF0YS1iaW5kPVxcXCJ0ZXh0OiBjb250ZW50XFxcIj48L2Rpdj48L2JvZHk+XFxyXFxuPC9odG1sPlxcclxcblwiO1xuICAkKCdib2R5JykuYXBwZW5kKCc8aWZyYW1lIGlkPVwiJyArIGlkICsgJ1wiIGRhdGEtYmluZD1cImJpbmRJZnJhbWU6ICRkYXRhXCI+PC9pZnJhbWU+Jyk7XG4gIHZhciBmcmFtZUVsID0gZ2xvYmFsLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAga28uYXBwbHlCaW5kaW5ncyh7IGNvbnRlbnQ6IFwiZHVtbXkgY29udGVudFwiIH0sIGZyYW1lRWwpO1xuICAvLyBPYnNvbGV0ZSBtZXRob2QgZGlkbid0IHdvcmsgb24gSUUxMSB3aGVuIHVzaW5nIFwiSFRNTDUgZG9jdHlwZVwiOlxuICAvLyB2YXIgZG9jVHlwZSA9IG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoZ2xvYmFsLmRvY3VtZW50LmRvY3R5cGUpO1xuICB2YXIgbm9kZSA9IGZyYW1lRWwuY29udGVudFdpbmRvdy5kb2N1bWVudC5kb2N0eXBlO1xuICB2YXIgZG9jVHlwZSA9IFwiPCFET0NUWVBFIFwiICsgbm9kZS5uYW1lICtcbiAgICAobm9kZS5wdWJsaWNJZCA/ICcgUFVCTElDIFwiJyArIG5vZGUucHVibGljSWQgKyAnXCInIDogJycpICtcbiAgICAoIW5vZGUucHVibGljSWQgJiYgbm9kZS5zeXN0ZW1JZCA/ICcgU1lTVEVNJyA6ICcnKSArXG4gICAgKG5vZGUuc3lzdGVtSWQgPyAnIFwiJyArIG5vZGUuc3lzdGVtSWQgKyAnXCInIDogJycpICsgJz4nO1xuICB2YXIgY29udGVudCA9IGRvY1R5cGUgKyBcIlxcblwiICsgZnJhbWVFbC5jb250ZW50V2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gIGtvLmNsZWFuTm9kZShmcmFtZUVsKTtcbiAga28ucmVtb3ZlTm9kZShmcmFtZUVsKTtcbiAga28uYmluZGluZ0hhbmRsZXJzLmJpbmRJZnJhbWUudHBsID0gb3JpZ1RwbDtcblxuICB2YXIgZXhwZWN0ZWQgPSBcIjwhRE9DVFlQRSBodG1sPlxcbjxodG1sPjxoZWFkPjx0aXRsZT5BPC90aXRsZT5cXG48L2hlYWQ+XFxuPGJvZHk+PHAgYWxpZ249XFxcInJpZ2h0XFxcIiBzdHlsZT1cXFwiY29sb3I6IHJlZDtcXFwiIGRhdGEtYmluZD1cXFwic3R5bGU6IHsgY29sb3I6ICdyZWQnIH1cXFwiPkI8L3A+PGRpdiBkYXRhLWJpbmQ9XFxcInRleHQ6IGNvbnRlbnRcXFwiPmR1bW15IGNvbnRlbnQ8L2Rpdj5cXG5cXG48L2JvZHk+PC9odG1sPlwiO1xuICB2YXIgZXhwZWN0ZWQyID0gXCI8IURPQ1RZUEUgaHRtbD5cXG48aHRtbD48aGVhZD48dGl0bGU+QTwvdGl0bGU+XFxuPC9oZWFkPlxcbjxib2R5PjxwIHN0eWxlPVxcXCJjb2xvcjogcmVkO1xcXCIgZGF0YS1iaW5kPVxcXCJzdHlsZTogeyBjb2xvcjogJ3JlZCcgfVxcXCIgYWxpZ249XFxcInJpZ2h0XFxcIj5CPC9wPjxkaXYgZGF0YS1iaW5kPVxcXCJ0ZXh0OiBjb250ZW50XFxcIj5kdW1teSBjb250ZW50PC9kaXY+XFxuXFxuPC9ib2R5PjwvaHRtbD5cIjtcbiAgdmFyIGV4cGVjdGVkMyA9IFwiPCFET0NUWVBFIGh0bWw+XFxuPGh0bWw+PGhlYWQ+PHRpdGxlPkE8L3RpdGxlPlxcbjwvaGVhZD5cXG48Ym9keT48cCBzdHlsZT1cXFwiY29sb3I6IHJlZDtcXFwiIGFsaWduPVxcXCJyaWdodFxcXCIgZGF0YS1iaW5kPVxcXCJzdHlsZTogeyBjb2xvcjogJ3JlZCcgfVxcXCI+QjwvcD48ZGl2IGRhdGEtYmluZD1cXFwidGV4dDogY29udGVudFxcXCI+ZHVtbXkgY29udGVudDwvZGl2PlxcblxcbjwvYm9keT48L2h0bWw+XCI7XG4gIGlmIChleHBlY3RlZCAhPT0gY29udGVudCAmJiBleHBlY3RlZDIgIT09IGNvbnRlbnQgJiYgZXhwZWN0ZWQzICE9PSBjb250ZW50KSB7XG4gICAgY29uc29sZS5pbmZvKFwiQmFkQnJvd3Nlci5GcmFtZUNvbnRlbnRDaGVja1wiLCBjb250ZW50Lmxlbmd0aCwgZXhwZWN0ZWQubGVuZ3RoLCBleHBlY3RlZDIubGVuZ3RoLCBleHBlY3RlZDMubGVuZ3RoLCBjb250ZW50ID09IGV4cGVjdGVkLCBjb250ZW50ID09IGV4cGVjdGVkMiwgY29udGVudCA9PSBleHBlY3RlZDMpO1xuICAgIGNvbnNvbGUuaW5mbyhjb250ZW50KTtcbiAgICB0aHJvdyBcIlVuZXhwZWN0ZWQgZnJhbWUgY29udGVudC4gTWlzYmVoYXZpbmcgYnJvd3NlcjogXCIrY29udGVudC5sZW5ndGgrXCIvXCIrZXhwZWN0ZWQubGVuZ3RoK1wiL1wiK2V4cGVjdGVkMi5sZW5ndGgrXCIvXCIrZXhwZWN0ZWQzLmxlbmd0aDtcbiAgfVxufTtcblxudmFyIGZpeFBhZ2VFdmVudHMgPSBmdW5jdGlvbigpIHtcbiAgLy8gVGhpcyBpcyBnbG9iYWwgY29kZSB0byBwcmV2ZW50IGRyYWdnaW5nL2Ryb3BwaW5nIGluIHRoZSBwYWdlIHdoZXJlIHdlIGRvbid0IGRlYWwgd2l0aCBpdC5cbiAgLy8gSUU4IGRvZXNuJ3QgaGF2ZSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciwgYnV0IGRvZXNuJ3Qgc3VwcG9ydCBkcmFnJmRyb3AgdG9vLlxuICBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAvLyBwcmV2ZW50IGdlbmVyaWMgZmlsZSBkcm9wcHBpbmcgaW4gdGhlIHBhZ2VcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdcIiwgZnVuY3Rpb24oZSkge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJicm93c2VyIGlzIHVzaW5nIGRyYWcgbGlzdGVuZXIgb24gd2luZG93XCIpO1xuICAgICAgZSA9IGUgfHwgZ2xvYmFsLmV2ZW50O1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0sIGZhbHNlKTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdzdGFydFwiLCBmdW5jdGlvbihlKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcImJyb3dzZXIgaXMgdXNpbmcgZHJhZ3N0YXJ0IGxpc3RlbmVyIG9uIHdpbmRvd1wiKTtcbiAgICAgIGUgPSBlIHx8IGdsb2JhbC5ldmVudDtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9LCBmYWxzZSk7XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnb3ZlclwiLCBmdW5jdGlvbihlKSB7XG4gICAgICAvLyB0aGlzIGlzIGNhbGxlZCBvbiBtb3VzZSBtb3ZlIG9uIGV2ZXJ5IHN1cHBvcnRlZCBicm93c2VyLlxuICAgICAgLy8gY29uc29sZS5sb2coXCJicm93c2VyIGlzIHVzaW5nIGRyYWdvdmVyIGxpc3RlbmVyIG9uIHdpbmRvd1wiKTtcbiAgICAgIGUgPSBlIHx8IGdsb2JhbC5ldmVudDtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9LCBmYWxzZSk7XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJkcm9wXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiYnJvd3NlciBpcyB1c2luZyBkcm9wIGxpc3RlbmVyIG9uIHdpbmRvd1wiKTtcbiAgICAgIGUgPSBlIHx8IGdsb2JhbC5ldmVudDtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9LCBmYWxzZSk7XG4gICAgZ2xvYmFsLmRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIC8vIEkgYnJvd3NlciBzdXBwb3J0YXRpIGVudHJhdG8gdHV0dGkgcXVpIHF1YW5kbyBzaSBkcm9wcGEgcXVhbGNvc2Egc3VsIGJvZHlcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiYnJvd3NlciBpcyB1c2luZyBkcm9wIGxpc3RlbmVyIG9uIGJvZHkgdGFnXCIpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0sIGZhbHNlKTtcbiAgfVxuICBpZiAoZ2xvYmFsLmRvY3VtZW50Lm9uZHJhZ3N0YXJ0KSB7XG4gICAgZ2xvYmFsLmRvY3VtZW50Lm9uZHJhZ3N0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcImJyb3dzZXIgY2FsbGVkIG9uZHJhZ3N0YXJ0LiByZXR1cm4gZmFsc2UhXCIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjb21waWxlOiB0ZW1wbGF0ZUNvbXBpbGVyLFxuICBsb2FkOiB0ZW1wbGF0ZUxvYWRlcixcbiAgaXNDb21wYXRpYmxlOiBpc0NvbXBhdGlibGUsXG4gIGZpeFBhZ2VFdmVudHM6IGZpeFBhZ2VFdmVudHNcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBjb25zb2xlID0gcmVxdWlyZShcImNvbnNvbGVcIik7XG5cbnZhciBfY2FsbCA9IGZ1bmN0aW9uKHdoYXRUb0NhbGwpIHtcbiAgcmV0dXJuIHdoYXRUb0NhbGwoKTtcbn07XG5cbnZhciBsb2dzID0gW107XG5cbnZhciBfdGltZWRDYWxsID0gZnVuY3Rpb24obmFtZSwgd2hhdFRvQ2FsbCkge1xuICB2YXIgcmVzO1xuICB2YXIgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgaWYgKHR5cGVvZiBjb25zb2xlID09ICdvYmplY3QnICYmIGNvbnNvbGUudGltZSkgY29uc29sZS50aW1lKG5hbWUpO1xuICByZXMgPSBfY2FsbCh3aGF0VG9DYWxsKTtcbiAgaWYgKHR5cGVvZiBjb25zb2xlID09ICdvYmplY3QnICYmIGNvbnNvbGUudGltZSkgY29uc29sZS50aW1lRW5kKG5hbWUpO1xuICB2YXIgZGlmZiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7XG4gIGlmICh0eXBlb2YgY29uc29sZSA9PSAnb2JqZWN0JyAmJiAhY29uc29sZS50aW1lKSBjb25zb2xlLmxvZyhuYW1lLCBcInRvb2tcIiwgZGlmZiwgXCJtc1wiKTtcbiAgbG9ncy5wdXNoKHtcbiAgICBuYW1lOiBuYW1lLFxuICAgIHRpbWU6IGRpZmZcbiAgfSk7XG4gIC8vIG1heCBsb2dzXG4gIGlmIChsb2dzLmxlbmd0aCA+IDEwMCkgbG9ncy51bnNoaWZ0KCk7XG4gIHJldHVybiByZXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdGltZWRDYWxsOiBfdGltZWRDYWxsLFxuICBsb2dzOiBsb2dzXG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XG52YXIgdW5kb01hbmFnZXIgPSByZXF1aXJlKCdrbm9ja291dC11bmRvbWFuYWdlcicpO1xudmFyIHVuZG9zZXJpYWxpemVyID0gcmVxdWlyZShcIi4vdW5kb3NlcmlhbGl6ZXIuanNcIik7XG5cbnZhciBhZGRVbmRvU3RhY2tFeHRlbnNpb25NYWtlciA9IGZ1bmN0aW9uKHBlcmZvcm1hbmNlQXdhcmVDYWxsZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZpZXdNb2RlbCkge1xuXG4gICAgdmlld01vZGVsLmNvbnRlbnRMaXN0ZW5lcnModmlld01vZGVsLmNvbnRlbnRMaXN0ZW5lcnMoKSArIDIpO1xuXG4gICAgLy8gVE9ETyB0aGUgbGFiZWxzIHNob3VsZCBiZSBjb21wdXRlZCBvYnNlcnZhYmxlcyAobmVlZHMgY2hhbmdlcyBpbiB1bmRvbWFuYWdlciBwcm9qZWN0cylcbiAgICB2YXIgdW5kb1JlZG9TdGFjayA9IHVuZG9NYW5hZ2VyKHZpZXdNb2RlbC5jb250ZW50LCB7XG4gICAgICBsZXZlbHM6IDEwMCxcbiAgICAgIHVuZG9MYWJlbDoga28uY29tcHV0ZWQoZnVuY3Rpb24oKSB7IHJldHVybiB2aWV3TW9kZWwudChcIlVuZG8gKCNDT1VOVCMpXCIpOyB9KSxcbiAgICAgIHJlZG9MYWJlbDoga28uY29tcHV0ZWQoZnVuY3Rpb24oKSB7IHJldHVybiB2aWV3TW9kZWwudChcIlJlZG9cIik7IH0pXG4gICAgfSk7XG4gICAgdmlld01vZGVsLnVuZG8gPSB1bmRvUmVkb1N0YWNrLnVuZG9Db21tYW5kO1xuICAgIHZpZXdNb2RlbC51bmRvLmV4ZWN1dGUgPSBwZXJmb3JtYW5jZUF3YXJlQ2FsbGVyLmJpbmQodmlld01vZGVsLCAndW5kbycsIHZpZXdNb2RlbC51bmRvLmV4ZWN1dGUpO1xuICAgIHZpZXdNb2RlbC5yZWRvID0gdW5kb1JlZG9TdGFjay5yZWRvQ29tbWFuZDtcbiAgICB2aWV3TW9kZWwucmVkby5leGVjdXRlID0gcGVyZm9ybWFuY2VBd2FyZUNhbGxlci5iaW5kKHZpZXdNb2RlbCwgJ3JlZG8nLCB2aWV3TW9kZWwucmVkby5leGVjdXRlKTtcbiAgICB2aWV3TW9kZWwudW5kb1Jlc2V0ID0gcGVyZm9ybWFuY2VBd2FyZUNhbGxlci5iaW5kKHZpZXdNb2RlbCwgJ3VuZG9SZXNldCcsIHVuZG9SZWRvU3RhY2sucmVzZXQpO1xuICAgIHZpZXdNb2RlbC5zZXRVbmRvTW9kZU1lcmdlID0gdW5kb1JlZG9TdGFjay5zZXRNb2RlTWVyZ2U7XG4gICAgdmlld01vZGVsLnNldFVuZG9Nb2RlT25jZSA9IHVuZG9SZWRvU3RhY2suc2V0TW9kZU9uY2U7XG4gICAgdW5kb1JlZG9TdGFjay5zZXRNb2RlSWdub3JlKCk7XG4gICAgdW5kb1JlZG9TdGFjay5zZXRVbmRvQWN0aW9uTWFrZXIodW5kb3NlcmlhbGl6ZXIubWFrZVVuZG9BY3Rpb24uYmluZCh1bmRlZmluZWQsIHZpZXdNb2RlbC5jb250ZW50KSk7XG4gICAgdW5kb3NlcmlhbGl6ZXIud2F0Y2hFbmFibGVkKHRydWUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdXNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdW5kb1JlZG9TdGFjay5zZXRNb2RlSWdub3JlKCk7XG4gICAgICB9LFxuICAgICAgcnVuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdW5kb1JlZG9TdGFjay5zZXRNb2RlT25jZSgpO1xuICAgICAgfSxcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB1bmRvUmVkb1N0YWNrLnNldE1vZGVPbmNlKCk7XG4gICAgICB9LFxuICAgICAgZGlzcG9zZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZpZXdNb2RlbC5jb250ZW50TGlzdGVuZXJzKHZpZXdNb2RlbC5jb250ZW50TGlzdGVuZXJzKCkgLSAyKTtcbiAgICAgICAgdW5kb3NlcmlhbGl6ZXIud2F0Y2hFbmFibGVkKGZhbHNlKTtcbiAgICAgICAgdW5kb1JlZG9TdGFjay5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBhZGRVbmRvU3RhY2tFeHRlbnNpb25NYWtlcjsiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBrbyA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcbnZhciBjb25zb2xlID0gcmVxdWlyZShcImNvbnNvbGVcIik7XG4vLyBUaGlzIG1vZHVsZSBkZWFscyB3aXRoIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIG9mIGEgXCJ0cmVlLXBhdGhcIiByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gcmVhY2ggdGhlIGdpdmVuIGxlYWYuXG4vLyBJbiBvcmRlciB0byBiZSBjb3JyZWN0bHkgc2VyaWFsaXplZCB3ZSBoYXZlIHRvIG1vdmUgZnJvbSBcInJlZmVyZW5jZVwiIHRvIFwic3RyaW5nXCIgYW5kIHZpY2V2ZXJzYS5cblxudmFyIF9yZWZlcmVuY2UgPSBmdW5jdGlvbihtb2RlbCwgcGF0aCkge1xuICB2YXIgcCA9IDA7XG4gIHZhciBwMSwgcDI7XG4gIHZhciBtID0gbW9kZWw7XG4gIHdoaWxlIChwIDwgcGF0aC5sZW5ndGgpIHtcbiAgICBzd2l0Y2ggKHBhdGguY2hhckF0KHApKSB7XG4gICAgICBjYXNlICcoJzpcbiAgICAgICAgaWYgKHBhdGguY2hhckF0KHAgKyAxKSA9PSAnKScpIHtcbiAgICAgICAgICBtID0gbSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRPRE8gZXJyb3JcbiAgICAgICAgfVxuICAgICAgICBwICs9IDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnWyc6XG4gICAgICAgIHAyID0gcGF0aC5pbmRleE9mKCddJywgcCk7XG4gICAgICAgIG0gPSBtW3BhdGguc3Vic3RyaW5nKHAgKyAxLCBwMildO1xuICAgICAgICBwID0gcDIgKyAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJy4nOlxuICAgICAgICBwMSA9IHBhdGguaW5kZXhPZignKCcsIHApO1xuICAgICAgICBpZiAocDEgPT0gLTEpIHAxID0gcGF0aC5sZW5ndGg7XG4gICAgICAgIHAyID0gcGF0aC5pbmRleE9mKCdbJywgcCk7XG4gICAgICAgIGlmIChwMiA9PSAtMSkgcDIgPSBwYXRoLmxlbmd0aDtcbiAgICAgICAgcDIgPSBNYXRoLm1pbihwMSwgcDIpO1xuICAgICAgICBtID0gbVtwYXRoLnN1YnN0cmluZyhwICsgMSwgcDIpXTtcbiAgICAgICAgcCA9IHAyO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIFRPRE8gZXJyb3JcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG07XG59O1xuXG52YXIgX2dldFBhdGggPSBmdW5jdGlvbihwYXJlbnRzLCBjaGlsZCkge1xuICB2YXIgcGF0aCA9IFwiXCI7XG4gIHZhciBwO1xuICBmb3IgKHZhciBrID0gMDsgayA8PSBwYXJlbnRzLmxlbmd0aDsgaysrKSB7XG4gICAgcCA9IGsgPCBwYXJlbnRzLmxlbmd0aCA/IHBhcmVudHNba10gOiBjaGlsZDtcbiAgICBpZiAoa28uaXNPYnNlcnZhYmxlKHApKSBwYXRoICs9ICcoKSc7XG4gICAgaWYgKHR5cGVvZiBwLl9maWVsZE5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwYXRoICs9IFwiLlwiICsgcC5fZmllbGROYW1lO1xuICAgIH0gZWxzZSBpZiAoayA+IDAgJiYgdHlwZW9mIHBhcmVudHNbayAtIDFdLnBvcCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgcGFyZW50QXJyYXkgPSBrby5pc09ic2VydmFibGUocGFyZW50c1trIC0gMV0pID8ga28udXRpbHMucGVla09ic2VydmFibGUocGFyZW50c1trIC0gMV0pIDogcGFyZW50c1trIC0gMV07XG4gICAgICB2YXIgcG9zID0ga28udXRpbHMuYXJyYXlJbmRleE9mKHBhcmVudEFycmF5LCBwKTtcbiAgICAgIGlmIChwb3MgIT0gLTEpIHtcbiAgICAgICAgcGF0aCArPSBcIltcIiArIHBvcyArIFwiXVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTk9URSB0aGlzIGhhcHBlbiwgc29tZXRpbWVzIHdoZW4gVGlueU1DRSBzZW5kcyB1cGRhdGVzIGZvciBvYmplY3RzIGFscmVhZHkgcmVtb3ZlZC5cbiAgICAgICAgY29uc29sZS5lcnJvcihcIlVuZXhwZWN0ZWQgb2JqZWN0IG5vdCBmb3VuZCBpbiBwYXJlbnQgYXJyYXlcIiwgcGFyZW50QXJyYXksIHAsIGssIHBhcmVudHMubGVuZ3RoLCBrby50b0pTKHBhcmVudEFycmF5KSwga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShwKSk7XG4gICAgICAgIHRocm93IFwiVW5leHBlY3RlZCBvYmplY3Qgbm90IGZvdW5kIGluIHBhcmVudCBhcnJheVwiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiVW5leHBlY3RlZCBwYXJlbnQgd2l0aCBubyBfZmllbGROYW1lIGFuZCBubyBwYXJlbnQgYXJyYXlcIiwgaywgcGFyZW50cyk7XG4gICAgICB0aHJvdyBcIlVuZXhwZWN0ZWQgcGFyZW50IHdpdGggbm8gX2ZpZWxkTmFtZSBhbmQgbm8gcGFyZW50IGFycmF5XCI7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYXRoO1xufTtcblxudmFyIG1ha2VEZXJlZmVyZW5jZWRVbmRvQWN0aW9uID0gZnVuY3Rpb24odW5kb0Z1bmMsIG1vZGVsLCBwYXRoLCB2YWx1ZSwgaXRlbSkge1xuICB2YXIgY2hpbGQgPSBfcmVmZXJlbmNlKG1vZGVsLCBwYXRoKTtcbiAgdW5kb0Z1bmMoY2hpbGQsIHZhbHVlLCBpdGVtKTtcbn07XG5cbnZhciBsaXN0ZW5lcjtcblxudmFyIF9zZXRMaXN0ZW5lciA9IGZ1bmN0aW9uKGxpc3RlbmZ1bmMpIHtcbiAgbGlzdGVuZXIgPSBsaXN0ZW5mdW5jO1xufTtcblxuLyogZGVyZWZlcmVuY2luZyBwYXRoIGFuZCBjaGFuZ2luZyB2YWx1ZSB3aXRoIFwidG9KU1wiICovXG52YXIgbWFrZVVuZG9BY3Rpb25EZXJlZmVyZW5jZWQgPSBmdW5jdGlvbihtb2RlbCwgdW5kb0Z1bmMsIHBhcmVudHMsIGNoaWxkLCBvbGRWYWwsIGl0ZW0pIHtcbiAgdHJ5IHtcbiAgICB2YXIgcGF0aCA9IF9nZXRQYXRoKHBhcmVudHMsIGNoaWxkKTtcblxuICAgIC8vIFRyYW5zZm9ybSBhY3Rpb25zIGluIHNpbXBsZSBKUyBvYmplY3RzLlxuICAgIGlmICh0eXBlb2Ygb2xkVmFsID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2xkVmFsID09PSAnZnVuY3Rpb24nKSBvbGRWYWwgPSBrby50b0pTKG9sZFZhbCk7XG4gICAgaWYgKHR5cGVvZiBpdGVtICE9PSAndW5kZWZpbmVkJyAmJiAodHlwZW9mIGl0ZW0udmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBpdGVtLnZhbHVlID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgdmFyIG5ld0l0ZW0gPSBrby50b0pTKGl0ZW0pO1xuICAgICAgaXRlbSA9IG5ld0l0ZW07XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxpc3RlbmVyKHBhdGgsIGNoaWxkLCBvbGRWYWwsIGl0ZW0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIlVuZG9zZXJpYWxpemVyIGlnbm9yaW5nIGV4Y2VwdGlvbiBpbiBsaXN0ZW5lciBjYWxsYmFja1wiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZURlcmVmZXJlbmNlZFVuZG9BY3Rpb24uYmluZCh1bmRlZmluZWQsIHVuZG9GdW5jLCBtb2RlbCwgcGF0aCwgb2xkVmFsLCBpdGVtKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIE5PVEUgdGhpcyBoYXBwZW5zLCBmcm9tIHRpbWUgdG8gdGltZSwgd2hlbiBUaW55TUNFIHNlbmRzIHVwZGF0ZXMgZm9yIGRlbGV0ZWQgY29udGVudC5cbiAgICBjb25zb2xlLmVycm9yKFwiRXhjZXB0aW9uIHByb2Nlc3NpbmcgdW5kb1wiLCBlLCBwYXJlbnRzLCBjaGlsZCwgaXRlbSk7XG4gIH1cbn07XG5cbnZhciB3YXRjaEVuYWJsZWQ7XG52YXIgX3dhdGNoRW5hYmxlZCA9IGZ1bmN0aW9uKG5ld1ZhbCkge1xuICBpZiAodHlwZW9mIG5ld1ZhbCAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgd2F0Y2hFbmFibGVkID0gbmV3VmFsO1xuICBlbHNlXG4gICAgcmV0dXJuIHdhdGNoRW5hYmxlZDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBkZXJlZmVyZW5jZTogX2dldFBhdGgsXG4gIHJlZmVyZW5jZTogX3JlZmVyZW5jZSxcbiAgbWFrZVVuZG9BY3Rpb246IG1ha2VVbmRvQWN0aW9uRGVyZWZlcmVuY2VkLFxuICBzZXRMaXN0ZW5lcjogX3NldExpc3RlbmVyLFxuICB3YXRjaEVuYWJsZWQ6IF93YXRjaEVuYWJsZWRcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKiBnbG9iYWwgZ2xvYmFsOiBmYWxzZSAqL1xuXG52YXIgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG52YXIga28gPSByZXF1aXJlKFwia25vY2tvdXRcIik7XG52YXIgY29uc29sZSA9IHJlcXVpcmUoXCJjb25zb2xlXCIpO1xudmFyIHBlcmZvcm1hbmNlQXdhcmVDYWxsZXIgPSByZXF1aXJlKFwiLi90aW1lZC1jYWxsLmpzXCIpLnRpbWVkQ2FsbDtcblxudmFyIHRvYXN0ciA9IHJlcXVpcmUoXCJ0b2FzdHJcIik7XG50b2FzdHIub3B0aW9ucyA9IHtcbiAgXCJjbG9zZUJ1dHRvblwiOiBmYWxzZSxcbiAgXCJkZWJ1Z1wiOiBmYWxzZSxcbiAgXCJwb3NpdGlvbkNsYXNzXCI6IFwidG9hc3QtYm90dG9tLWZ1bGwtd2lkdGhcIixcbiAgXCJ0YXJnZXRcIjogXCIjbW8tYm9keVwiLFxuICBcIm9uY2xpY2tcIjogbnVsbCxcbiAgXCJzaG93RHVyYXRpb25cIjogXCIzMDBcIixcbiAgXCJoaWRlRHVyYXRpb25cIjogXCIxMDAwXCIsXG4gIFwidGltZU91dFwiOiBcIjUwMDBcIixcbiAgXCJleHRlbmRlZFRpbWVPdXRcIjogXCIxMDAwXCIsXG4gIFwic2hvd0Vhc2luZ1wiOiBcInN3aW5nXCIsXG4gIFwiaGlkZUVhc2luZ1wiOiBcImxpbmVhclwiLFxuICBcInNob3dNZXRob2RcIjogXCJmYWRlSW5cIixcbiAgXCJoaWRlTWV0aG9kXCI6IFwiZmFkZU91dFwiXG59O1xuXG4vKiBOT1RFOiB0cmFuc2xhdGlvbnMgbW92ZWQgdG8gXCJwbHVnaW5cIlxudmFyIHN0cmluZ3MgPSB7XG4gICdzaG93IHByZXZpZXcgYW5kIHNlbmQgdGVzdCc6ICdWaXN1YWxpenphIHVuYSBhbnRlcHJpbWEgZSBmYWkgdW4gaW52aW8gZGkgdGVzdCcsXG4gIC8vIFN0cmluZ3MgZm9yIGFwcC5qc1xuICAnRG93bmxvYWQnOiAnRG93bmxvYWQnLFxuICAnVGVzdCc6ICdUZXN0JyxcbiAgJ1NhdmUnOiAnU2FsdmEnLFxuICAnRG93bmxvYWRpbmcuLi4nOiBcIkRvd25sb2FkIGluIGNvcnNvLi4uXCIsXG4gICdJbnZhbGlkIGVtYWlsIGFkZHJlc3MnOiBcIkluZGlyaXp6byBlbWFpbCBpbnZhbGlkb1wiLFxuICBcIlRlc3QgZW1haWwgc2VudC4uLlwiOiBcIkVtYWlsIGRpIHRlc3QgaW52aWF0YS4uLlwiLFxuICAnVW5leHBlY3RlZCBlcnJvciB0YWxraW5nIHRvIHNlcnZlcjogY29udGFjdCB1cyEnOiAnRXJyb3JlIGRpIGNvbXVuaWNhemlvbmUgY29uIGlsIHNlcnZlcjogY29udGF0dGFjaSEnLFxuICAnSW5zZXJ0IGhlcmUgdGhlIHJlY2lwaWVudCBlbWFpbCBhZGRyZXNzJzogJ0luc2VyaXNjaSBxdWkgbFxcJ2luZGlyaXp6byBlbWFpbCBhIGN1aSBzcGVkaXJlJyxcbiAgXCJUZXN0IGVtYWlsIGFkZHJlc3NcIjogXCJJbmRpcml6em8gZW1haWwgZGkgdGVzdFwiLFxuICAvLyB2aWV3TW9kZWxcbiAgJ0Jsb2NrIHJlbW92ZWQ6IHVzZSB1bmRvIGJ1dHRvbiB0byByZXN0b3JlIGl0Li4uJzogJ0Jsb2NjbyBlbGltaW5hdG86IHVzYSBpbCBwdWxzYW50ZSBhbm51bGxhIHBlciByZWN1cGVyYXJsby4uLicsXG4gICdOZXcgYmxvY2sgYWRkZWQgYWZ0ZXIgdGhlIHNlbGVjdGVkIG9uZSAoX19wb3NfXyknOiAnTnVvdm8gYmxvY2NvIGFnZ2l1bnRvIHNvdHRvIGEgcXVlbGxvIHNlbGV6aW9uYXRvIChfX3Bvc19fKScsXG4gICdOZXcgYmxvY2sgYWRkZWQgYXQgdGhlIG1vZGVsIGJvdHRvbSAoX19wb3NfXyknOiAnTnVvdm8gYmxvY2NvIGFnZ2l1bnRvIGluIGZvbmRvIGFsIG1vZGVsbG8gKF9fcG9zX18pJyxcbiAgLy8gdW5kb21haW4uanNcbiAgJ1VuZG8gKCNDT1VOVCMpJzogJ0FubnVsbGEgKCNDT1VOVCMpJyxcbiAgJ1JlZG8nOiAnUmlwcmlzdGluYScsXG4gIC8vIGVkaXRvci5qc1xuICAnU2VsZWN0ZWQgZWxlbWVudCBoYXMgbm8gZWRpdGFibGUgcHJvcGVydGllcyc6ICdMXFwnZWxlbWVudG8gc2VsZXppb25hdG8gbm9uIGZvcm5pc2NlIHByb3ByaWV0w6AgZWRpdGFiaWxpJyxcbiAgJ1RoaXMgc3R5bGUgaXMgc3BlY2lmaWMgZm9yIHRoaXMgYmxvY2s6IGNsaWNrIGhlcmUgdG8gcmVtb3ZlIHRoZSBjdXN0b20gc3R5bGUgYW5kIHJldmVydCB0byB0aGUgdGhlbWUgdmFsdWUnOiAnUXVlc3RvIHN0aWxlIMOoIHNwZWNpZmljbyBkaSBxdWVzdG8gYmxvY2NvOiBjbGljY2EgcXVpIHBlciBhbm51bGxhcmUgbG8gc3RpbGUgcGVyc29uYWxpenphdG8nLFxuICAnU3dpdGNoIGJldHdlZW4gZ2xvYmFsIGFuZCBibG9jayBsZXZlbCBzdHlsZXMgZWRpdGluZyc6ICdQZXJtZXR0ZSBkaSBzcGVjaWZpY2FyZSBzZSBzaSB2dW9sZSBtb2RpZmljYXJlIGxvIHN0aWxlIGdlbmVyYWxlIG8gc29sYW1lbnRlIHF1ZWxsbyBzcGVjaWZpY28gZGVsIGJsb2NjbyBzZWxlemlvbmF0bycsXG4gIC8vIG1haW4udHBsLmh0bWxcbiAgJ1VuZG8gbGFzdCBvcGVyYXRpb24nOiAnQW5udWxsYSB1bHRpbWEgb3BlcmF6aW9uZScsXG4gICdSZWRvIGxhc3Qgb3BlcmF0aW9uJzogJ1JpcGV0aSBvcGVyYXppb25lIGFubnVsbGF0YScsXG4gICdTaG93IGltYWdlIGdhbGxlcnknOiAnVmlzdWFsaXp6YSBnYWxsZXJpYSBpbW1hZ2luaScsXG4gICdHYWxsZXJ5JzogJ0dhbGxlcmlhJyxcbiAgJ1ByZXZpZXcnOiAnQW50ZXByaW1hJyxcbiAgJ1Nob3cgbGl2ZSBwcmV2aWV3JzogJ01vc3RyYSBhbnRlcHJpbWEgbGl2ZScsXG4gICdMYXJnZSBzY3JlZW4nOiAnU2NoZXJtbyBncmFuZGUnLFxuICAnVGFibGV0JzogJ1RhYmxldCcsXG4gICdTbWFydHBob25lJzogJ1NtYXJ0cGhvbmUnLFxuICAnU2hvdyBwcmV2aWV3IGFuZCBzZW5kIHRlc3QnOiAnVmlzdWFsaXp6YSB1bmEgYW50ZXByaW1hIGUgZmFpIHVuIGludmlvIGRpIHRlc3QnLFxuICAnRG93bmxvYWQgdGVtcGxhdGUnOiAnU2NhcmljYSBpbCB0ZW1wbGF0ZScsXG4gICdTYXZlIHRlbXBsYXRlJzogJ1NhbHZhIGlsIHRlbXBsYXRlJyxcbiAgJ1NhdmVkIG1vZGVsIGlzIG9ic29sZXRlJzogJ01vZGVsbG8gc2FsdmF0byBvYnNvbGV0bycsXG4gICc8cD5UaGUgc2F2ZWQgbW9kZWwgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIGEgcHJldmlvdXMsIG5vbiBjb21wbGV0ZWx5IGNvbXBhdGlibGUgdmVyc2lvbiwgb2YgdGhlIHRlbXBsYXRlPC9wPjxwPlNvbWUgY29udGVudCBvciBzdHlsZSBpbiB0aGUgbW9kZWwgPGI+Q09VTEQgQkUgTE9TVDwvYj4gaWYgeW91IHdpbGwgPGI+c2F2ZTwvYj48L3A+PHA+Q29udGFjdCB1cyBmb3IgbW9yZSBpbmZvcm1hdGlvbnMhPC9wPic6ICc8cD5JbCBtb2RlbGxvIHNhbHZhdG8gw6ggc3RhdG8gY3JlYXRvIGNvbiB1bmEgdmVyc2lvbmUgcHJlY2VkZW50ZSBkZWwgdGVtcGxhdGUgbm9uIGRlbCB0dXR0byBjb21wYXRpYmlsZTwvcD48cD5BbGN1bmkgY29udGVudXRpIG8gc3RpbGkgZGVsIG1vZGVsbG8gPGI+UE9UUkVCQkVSTyBFU1NFUkUgUEVSU0k8L2I+IHNlIHByb2NlZGVyYWkgZSBkZWNpZGVyYWkgZGkgPGI+c2FsdmFyZTwvYj48L3A+PHA+Q29udGF0dGFjaSBzZSBoYWkgZGVpIGR1YmJpITwvcD4nLFxuXG4gIC8vIFRPRE8gdGhpcyBjYW5ub3QgYmUgZG9uZSBpbiBrbm9ja291dCBhcyB3aXRoIHVuY29tcGF0aWJsZSBicm93c2VycyB3ZSBkb24ndCBpbml0aWFsaXplXG4gIC8vICdVc3VwcG9ydGVkIGJyb3dzZXInOiAnQnJvd3NlciBub24gY29tcGF0aWJpbGUnLCBcbiAgLy8gJzxwPllvdXIgYnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkLjwvcD48cD5Vc2UgYSBkaWZmZXJlbnQgYnJvd3NlciBvciB0cnkgdXBkYXJpbmcgeW91ciBicm93c2VyLjwvcD48cD5TdXBwb3J0ZWQgYnJvd3NlcnM6IDx1bD48bGk+SW50ZXJuZXQgRXhwbG9yZXIgJmd0Oz0gMTA8L2xpPjxsaT5Hb29nbGUgQ2hyb21lICZndDs9IDMwPC9saT48bGk+QXBwbGUgU2FmYXJpICZndDs9IDU8L2xpPjxsaT5Nb3ppbGxhIEZpcmVmaXggJmd0Oz0gMjA8L2xpPjwvdWw+PC9wPic6ICc8cD5JbCB0dW8gYnJvd3NlciBub24gw6ggc3VwcG9ydGF0by48L3A+PHA+QWNjZWRpIGNvbiB1biBicm93c2VyIGRpZmZlcmVudGUgbyBwcm92YSBhZCBhZ2dpb3JuYXJlIGlsIHR1byBicm93c2VyLjwvcD48cD5Ccm93c2VyIHN1cHBvcnRhdGk6IDx1bD48bGk+SW50ZXJuZXQgRXhwbG9yZXIgJmd0Oz0gMTA8L2xpPjxsaT5Hb29nbGUgQ2hyb21lICZndDs9IDMwPC9saT48bGk+QXBwbGUgU2FmYXJpICZndDs9IDU8L2xpPjxsaT5Nb3ppbGxhIEZpcmVmaXggJmd0Oz0gMjA8L2xpPjwvdWw+PC9wPicsXG5cbiAgLy8gdG9vbGJveFxuICAnQmxvY2tzJzogJ0Jsb2NjaGknLFxuICAnQmxvY2tzIHJlYWR5IHRvIGJlIGFkZGVkIHRvIHRoZSB0ZW1wbGF0ZSc6ICdFbGVuY28gY29udGVudXRpIGFnZ2l1bmdpYmlsaSBhbCBtZXNzYWdnaW8nLFxuICAnQ29udGVudCc6ICdDb250ZW51dG8nLFxuICAnRWRpdCBjb250ZW50IG9wdGlvbnMnOiAnTW9kaWZpY2Egb3B6aW9uaSBjb250ZW51dGknLFxuICAnU3R5bGUnOiAnU3RpbGUnLFxuICAnRWRpdCBzdHlsZSBvcHRpb25zJzogJ01vZGlmaWNhIG9wemlvbmkgZ3JhZmljaGUnLFxuICAnQmxvY2sgX19uYW1lX18nOiAnQmxvY2NvIF9fbmFtZV9fJyxcbiAgJ0NsaWNrIG9yIGRyYWcgdG8gYWRkIHRoaXMgYmxvY2sgdG8gdGhlIHRlbXBsYXRlJzogJ0NsaWNjYSBvIHRyYXNjaW5hIHBlciBhZ2dpdW5nZXJlIGFsIG1lc3NhZ2dpbycsXG4gICdBZGQnOiAnQWdnaXVuZ2knLFxuICAnQnkgY2xpY2tpbmcgb24gbWVzc2FnZSBwYXJ0cyB5b3Ugd2lsbCBzZWxlY3QgYSBibG9jayBhbmQgY29udGVudCBvcHRpb25zLCBpZiBhbnksIHdpbGwgc2hvdyBoZXJlJzogJ0NsaWNjYW5kbyBzdSBhbGN1bmUgcGFydGkgZGVsIG1lc3NhZ2dpbyBzZWxlemlvbmVyYWkgdW4gYmxvY2NvIGUgbGUgb3B6aW9uaSBjb250ZW51dGlzdGljaGUsIHNlIGRpc3BvbmliaWxpLCBjb21wYXJpcmFubm8gcXVpJyxcbiAgJ0J5IGNsaWNraW5nIG9uIG1lc3NhZ2UgcGFydHMgeW91IHdpbGwgc2VsZWN0IGEgYmxvY2sgYW5kIHN0eWxlIG9wdGlvbnMsIGlmIGF2YWlsYWJsZSwgd2lsbCBzaG93IGhlcmUnOiAnQ2xpY2NhbmRvIHN1IGFsY3VuZSBwYXJ0aSBkZWwgbWVzc2FnZ2lvIHNlbGV6aW9uZXJhaSB1biBibG9jY28gZSBsZSBvcHppb25pIGRpIHN0aWxlLCBzZSBkaXNwb25pYmlsaSwgY29tcGFyaXJhbm5vIHF1aScsXG4gICdDbGljayBvciBkcmFnIGZpbGVzIGhlcmUnOiAnQ2xpY2NhIG8gdHJhc2NpbmEgaSBmaWxlIHF1aSEnLFxuICAnTm8gaW1hZ2VzIHVwbG9hZGVkLCB5ZXQnOiAnTm9uIGhhaSBhbmNvcmEgY2FyaWNhdG8gaW1tYWdpbmknLFxuICAnU2hvdyBpbWFnZXMgZnJvbSB0aGUgZ2FsbGVyeSc6ICdWaXN1YWxpenphIGxlIGltbWFnaW5pIGNhcmljYXRlIG5lbGxhIHR1YSBhcmVhJyxcbiAgJ0xvYWRpbmcuLi4nOiAnQ2FyaWNhbWVudG8uLi4nLFxuICAnTG9hZCBnYWxsZXJ5JzogJ0NhcmljYSBnYWxsZXJpYScsXG4gICdMb2FkaW5nIGdhbGxlcnkuLi4nOiAnQ2FyaWNhbWVudG8gaW4gY29yc28uLi4nLFxuICAnVGhlIGdhbGxlcnkgaXMgZW1wdHknOiAnTmVzc3VuYSBpbW1hZ2luZSBuZWxsYSBnYWxsZXJpYScsXG4gIC8vIGltZy13eXNpd3lnLnRtbHBcbiAgJ1JlbW92ZSBpbWFnZSc6ICdSaW11b3ZpIGltbWFnaW5lJyxcbiAgJ09wZW4gdGhlIGltYWdlIGVkaXRpbmcgdG9vbCc6ICdBdnZpYSBzdHJ1bWVudG8gbW9kaWZpY2EgaW1tYWdpbmUnLFxuICAnVXBsb2FkIGEgbmV3IGltYWdlJzogJ0NhcmljYSB1bmEgbnVvdmEgaW1tYWdpbmUnLFxuICAnRHJvcCBhbiBpbWFnZSBoZXJlJzogJ1RyYXNjaW5hIHVuYSBpbW1hZ2luZSBxdWknLFxuICAnRHJvcCBhbiBpbWFnZSBoZXJlIG9yIGNsaWNrIHRoZSB1cGxvYWQgYnV0dG9uJzogJ1RyYXNjaW5hIHVuYSBpbW1hZ2luZSBxdWkgbyBjbGljY2Egc3VsIHB1bHNhbnRlIGRpIGNhcmljYW1lbnRvJyxcbiAgLy8gZ2FsbGVyeVxuICAnRHJhZyB0aGlzIGltYWdlIGFuZCBkcm9wIGl0IG9uIGFueSB0ZW1wbGF0ZSBpbWFnZSBwbGFjZWhvbGRlcic6ICdUcmFzY2luYSBxdWVzdGEgaW1tYWdpbmUgc3VsbGEgcG9zaXppb25lIGluIGN1aSB2dW9pIGluc2VyaXJsYScsXG4gICdHYWxsZXJ5Oic6ICdHYWxsZXJpYTonLFxuICAnU2Vzc2lvbiBpbWFnZXMnOiAnSW1tYWdpbmkgZGkgc2Vzc2lvbmUnLFxuICAnUmVjZW50cyc6ICdSZWNlbnRpJyxcbiAgJ1JlbW90ZSBnYWxsZXJ5JzogJ0dhbGxlcmlhIHJlbW90YScsXG5cbiAgLy8gY3VzdG9tc3R5bGVcbiAgJ0N1c3RvbWl6ZWQgYmxvY2suPHVsPjxsaT5JbiB0aGlzIHN0YXR1cyBjaGFuZ2VzIHRvIHByb3BlcnRpZXMgd2lsbCBiZSBzcGVjaWZpYyB0byB0aGUgY3VycmVudCBibG9jayAoaW5zdGVhZCBvZiBiZWluZyBnbG9iYWwgdG8gYWxsIGJsb2NrcyBpbiB0aGUgc2FtZSBzZWN0aW9uKTwvbGk+PGxpPkEgPHNwYW4gY2xhc3M9XCJjdXN0b21TdHlsZWRcIj48c3Bhbj5cInNtYWxsIGN1YmVcIiA8L3NwYW4+PC9zcGFuPiBpY29uIGJlc2lkZSB0aGUgcHJvcGVydHkgd2lsbCBtYXJrIHRoZSBjdXN0b21pemF0aW9uLiBCeSBjbGlja2luZyB0aGlzIGljb24gdGhlIHByb3BlcnR5IHZhbHVlIHdpbGwgYmUgcmV2ZXJ0ZWQgdG8gdGhlIHZhbHVlIGRlZmluZWQgZm9yIHRoZSBzZWN0aW9uLjwvbGk+PC91bD4nOiAnQmxvY2NvIHBlcnNvbmFsaXp6YXRvLjx1bD48bGk+SW4gcXVlc3RhIG1vZGFsaXTDoCBzZSBjYW1iaSB1bmEgcHJvcHJpZXTDoCB2ZXJyw6AgbW9kaWZpY2F0YSBzb2xhbWVudGUgcGVyIHF1ZXN0byBzcGVjaWZpY28gYmxvY2NvIChpbnZlY2UgY2hlIHBlciB0dXR0aSBpIGJsb2NjaGkgZGVsbGEgc3Rlc3NhIHNlemlvbmUpLjwvbGk+PGxpPlBlciBzZWduYWxhcmUgbGEgcGVyc29uYWxpenphemlvbmUgYXBwYXJpcsOgIGxcXCdpY29uYSA8c3BhbiBjbGFzcz1cImN1c3RvbVN0eWxlZFwiPjxzcGFuPiBkZWwgXCJjdWJldHRvXCI8L3NwYW4+PC9zcGFuPiBhIGZpYW5jbyBkZWxsZSBwcm9wcmlldMOgLiBDbGljY2FuZG8gcXVlc3RhIGljb25hIHRvcm5lcmFpIGFsIHZhbG9yZSBjb211bmUuPC9saT48L3VsPicsXG4gIC8vIGJsb2Nrcy13eXNpd3lnXG4gICdEcm9wIGhlcmUgYmxvY2tzIGZyb20gdGhlIFwiQmxvY2tzXCIgdGFiJzogJ1RyYXNjaW5hIHF1aSBpIGJsb2NjaGkgZGFsbGEgc2NoZWRhIFxcJ0Jsb2NjaGlcXCcnLFxuICAvLyBibG9jay13eXNpd3lnXG4gICdEcmFnIHRoaXMgaGFuZGxlIHRvIG1vdmUgdGhlIGJsb2NrJzogJ1RyYXNjaW5hIHBlciBzcG9zdGFyZSBpbCBibG9jY28gYWx0cm92ZScsXG4gICdNb3ZlIHRoaXMgYmxvY2sgdXBzaWRlJzogJ1Nwb3N0YSBpbCBibG9jY28gaW4gc3UnLFxuICAnTW92ZSB0aGlzIGJsb2NrIGRvd25zaWRlJzogJ1Nwb3N0YSBpbCBibG9jY28gaW4gZ2l1JyxcbiAgJ0RlbGV0ZSBibG9jayc6ICdFbGltaW5hIGJsb2NjbycsXG4gICdEdXBsaWNhdGUgYmxvY2snOiAnRHVwbGljYSBibG9jY28nLFxuICAnU3dpdGNoIGJsb2NrIHZhcmlhbnQnOiAnQ2FtYmlhIHZhcmlhbnRlIGJsb2NjbycsXG4gIC8vIGNvbG9ycGlja2VyXG4gICdUaGVtZSBDb2xvcnMsU3RhbmRhcmQgQ29sb3JzLFdlYiBDb2xvcnMsVGhlbWUgQ29sb3JzLEJhY2sgdG8gUGFsZXR0ZSxIaXN0b3J5LE5vIGhpc3RvcnkgeWV0Lic6ICdDb2xvcmkgVGVtYSxDb2xvcmkgU3RhbmRhcmQsQ29sb3JpIFdlYixDb2xvcmkgVGVtYSxUb3JuYSBhbGxhIHRhdm9sb3p6YSxTdG9yaWNvLHN0b3JpY28gY29sb3JpIHZ1b3RvJyxcblxuICAnRHJvcCBoZXJlJzogJ1JpbGFzY2lhIHF1aScsXG5cbn07XG4qL1xuXG5mdW5jdGlvbiBpbml0aWFsaXplRWRpdG9yKGNvbnRlbnQsIGJsb2NrRGVmcywgdGh1bWJQYXRoQ29udmVydGVyLCBnYWxsZXJ5VXJsKSB7XG5cbiAgdmFyIHZpZXdNb2RlbCA9IHtcbiAgICBnYWxsZXJ5UmVjZW50OiBrby5vYnNlcnZhYmxlQXJyYXkoW10pLmV4dGVuZCh7XG4gICAgICBwYWdpbmc6IDE2XG4gICAgfSksXG4gICAgZ2FsbGVyeVJlbW90ZToga28ub2JzZXJ2YWJsZUFycmF5KFtdKS5leHRlbmQoe1xuICAgICAgcGFnaW5nOiAxNlxuICAgIH0pLFxuICAgIHNlbGVjdGVkQmxvY2s6IGtvLm9ic2VydmFibGUobnVsbCksXG4gICAgc2VsZWN0ZWRJdGVtOiBrby5vYnNlcnZhYmxlKG51bGwpLFxuICAgIHNlbGVjdGVkVG9vbDoga28ub2JzZXJ2YWJsZSgwKSxcbiAgICBzZWxlY3RlZEltYWdlVGFiOiBrby5vYnNlcnZhYmxlKDApLFxuICAgIGRyYWdnaW5nOiBrby5vYnNlcnZhYmxlKGZhbHNlKSxcbiAgICBkcmFnZ2luZ0ltYWdlOiBrby5vYnNlcnZhYmxlKGZhbHNlKSxcbiAgICBnYWxsZXJ5TG9hZGVkOiBrby5vYnNlcnZhYmxlKGZhbHNlKSxcbiAgICBzaG93UHJldmlld0ZyYW1lOiBrby5vYnNlcnZhYmxlKGZhbHNlKSxcbiAgICBwcmV2aWV3TW9kZToga28ub2JzZXJ2YWJsZSgnbW9iaWxlJyksXG4gICAgc2hvd1Rvb2xib3g6IGtvLm9ic2VydmFibGUodHJ1ZSksXG4gICAgc2hvd1RoZW1lOiBrby5vYnNlcnZhYmxlKGZhbHNlKSxcbiAgICBzaG93R2FsbGVyeToga28ub2JzZXJ2YWJsZShmYWxzZSksXG4gICAgZGVidWc6IGtvLm9ic2VydmFibGUoZmFsc2UpLFxuICAgIGNvbnRlbnRMaXN0ZW5lcnM6IGtvLm9ic2VydmFibGUoMCksXG4gICAgXG4gICAgbG9nb1BhdGg6ICdkaXN0L2ltZy9tb3NhaWNvMzIucG5nJyxcbiAgICBsb2dvVXJsOiAnLicsXG4gICAgbG9nb0FsdDogJ21vc2FpY28nXG4gIH07XG5cbiAgLy8gdmlld01vZGVsLmNvbnRlbnQgPSBjb250ZW50Ll9pbnN0cnVtZW50KGtvLCBjb250ZW50LCB1bmRlZmluZWQsIHRydWUpO1xuICB2aWV3TW9kZWwuY29udGVudCA9IGNvbnRlbnQ7XG4gIHZpZXdNb2RlbC5ibG9ja0RlZnMgPSBibG9ja0RlZnM7XG5cbiAgdmlld01vZGVsLm5vdGlmaWVyID0gdG9hc3RyO1xuXG4gIC8vIERvZXMgdG9rZW4gc3Vic3RpdHV0aW9uIGluIGkxOG5leHQgc3R5bGVcbiAgdmlld01vZGVsLnR0ID0gZnVuY3Rpb24oa2V5LCBwYXJhbU9iaikge1xuICAgIGlmICh0eXBlb2YgcGFyYW1PYmogIT09ICd1bmRlZmluZWQnKVxuICAgICAgZm9yICh2YXIgcHJvcCBpbiBwYXJhbU9iailcbiAgICAgICAgaWYgKHBhcmFtT2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UobmV3IFJlZ0V4cCgnX18nICsgcHJvcCArICdfXycsICdnJyksIHBhcmFtT2JqW3Byb3BdKTtcbiAgICAgICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH07XG5cbiAgLy8gU2ltcGx5IG1hcHMgdG8gdHQ6IGxhbmd1YWdlIHBsdWdpbnMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGRlZmluZSB0aGVpciBvd24gbGFuZ3VhZ2VcbiAgLy8gaGFuZGxpbmcuXG4gIC8vIElmIHRoaXMgbWV0aG9kIGludm9rZXMgYW4gb2JzZXJ2YWJsZSAoZS5nOiB2aWV3TW9kZWwubGFuZygpKSB0aGVuIHRoZSBVSSBsYW5ndWFnZSB3aWxsIGF1dG9tYXRpY2FsbHlcbiAgLy8gdXBkYXRlIHdoZW4gdGhlIFwibGFuZ1wiIG9ic2VydmFibGUgY2hhbmdlcy5cbiAgdmlld01vZGVsLnQgPSB2aWV3TW9kZWwudHQ7XG5cbiAgLy8gY3VycmVudGx5IGNhbGxlZCBieSBlZGl0b3IuaHRtbCB0byB0cmFuc2xhdGUgdGVtcGxhdGUtZGVmaW5lZCBrZXlzIChsYWJlbCwgaGVscCwgZGVzY3JpcHRpb25zKVxuICAvLyB0aGUgZWRpdG9yIGFsd2F5cyB1c2VzIHRoZSBcInRlbXBsYXRlXCIgY2F0ZWdvcnkgZm9yIHRoYXQgc3RyaW5ncy5cbiAgLy8geW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyB5b3UgbGlrZSBpbiBvcmRlciB0byBwcm92aWRlIHRyYW5zbGF0aW9uIG9yIGNoYW5nZSB0aGUgc3RyaW5ncyBpbiBhbnkgd2F5LlxuICB2aWV3TW9kZWwudXQgPSBmdW5jdGlvbihjYXRlZ29yeSwga2V5KSB7XG4gICAgcmV0dXJuIGtleTtcbiAgfTtcblxuICB2aWV3TW9kZWwudGVtcGxhdGVQYXRoID0gdGh1bWJQYXRoQ29udmVydGVyO1xuXG4gIHZpZXdNb2RlbC5yZW1vdGVVcmxQcm9jZXNzb3IgPSBmdW5jdGlvbih1cmwpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9O1xuXG4gIHZpZXdNb2RlbC5yZW1vdGVGaWxlUHJvY2Vzc29yID0gZnVuY3Rpb24oZmlsZU9iaikge1xuICAgIGlmICh0eXBlb2YgZmlsZU9iai51cmwgIT09ICd1bmRlZmluZWQnKSBmaWxlT2JqLnVybCA9IHZpZXdNb2RlbC5yZW1vdGVVcmxQcm9jZXNzb3IoZmlsZU9iai51cmwpO1xuICAgIGlmICh0eXBlb2YgZmlsZU9iai50aHVtYm5haWxVcmwgIT09ICd1bmRlZmluZWQnKSBmaWxlT2JqLnRodW1ibmFpbFVybCA9IHZpZXdNb2RlbC5yZW1vdGVVcmxQcm9jZXNzb3IoZmlsZU9iai50aHVtYm5haWxVcmwpO1xuICAgIC8vIGRlbGV0ZVVybD9cbiAgICByZXR1cm4gZmlsZU9iajtcbiAgfTtcblxuICAvLyB0b29sYm94LnRtcGwuaHRtbFxuICB2aWV3TW9kZWwubG9hZEdhbGxlcnkgPSBmdW5jdGlvbigpIHtcbiAgICB2aWV3TW9kZWwuZ2FsbGVyeUxvYWRlZCgnbG9hZGluZycpO1xuICAgIHZhciB1cmwgPSBnYWxsZXJ5VXJsID8gZ2FsbGVyeVVybCA6ICcvdXBsb2FkLyc7XG4gICAgLy8gcmV0cmlldmUgdGhlIGZ1bGwgbGlzdCBvZiByZW1vdGUgZmlsZXNcbiAgICAkLmdldEpTT04odXJsLCBmdW5jdGlvbihkYXRhKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmlsZXMubGVuZ3RoOyBpKyspIGRhdGEuZmlsZXNbaV0gPSB2aWV3TW9kZWwucmVtb3RlRmlsZVByb2Nlc3NvcihkYXRhLmZpbGVzW2ldKTtcbiAgICAgIHZpZXdNb2RlbC5nYWxsZXJ5TG9hZGVkKGRhdGEuZmlsZXMubGVuZ3RoKTtcbiAgICAgIC8vIFRPRE8gZG8gSSB3YW50IHRoaXMgY2FsbCB0byByZXR1cm4gcmVsYXRpdmUgcGF0aHM/IE9yIGp1c3QgYWJzb2x1dGUgcGF0aHM/XG4gICAgICB2aWV3TW9kZWwuZ2FsbGVyeVJlbW90ZShkYXRhLmZpbGVzLnJldmVyc2UoKSk7XG4gICAgfSkuZmFpbChmdW5jdGlvbigpIHtcbiAgICAgIHZpZXdNb2RlbC5nYWxsZXJ5TG9hZGVkKGZhbHNlKTtcbiAgICAgIHZpZXdNb2RlbC5ub3RpZmllci5lcnJvcih2aWV3TW9kZWwudCgnVW5leHBlY3RlZCBlcnJvciBsaXN0aW5nIGZpbGVzJykpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIGltZy13eXNpd3lnLnRtcGwuaHRtbFxuICB2aWV3TW9kZWwuZmlsZVRvSW1hZ2UgPSBmdW5jdGlvbihvYmosIGV2ZW50LCB1aSkge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiZmlsZVRvSW1hZ2VcIiwgb2JqKTtcbiAgICByZXR1cm4gb2JqLnVybDtcbiAgfTtcblxuICAvLyBibG9jay13eXNpd3lnLnRtcGwuaHRtbFxuICB2aWV3TW9kZWwucmVtb3ZlQmxvY2sgPSBmdW5jdGlvbihkYXRhLCBwYXJlbnQpIHtcbiAgICAvLyBsZXQncyB1bnNlbGVjdCB0aGUgYmxvY2tcbiAgICBpZiAoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2aWV3TW9kZWwuc2VsZWN0ZWRCbG9jaykgPT0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShkYXRhKSkge1xuICAgICAgdmlld01vZGVsLnNlbGVjdEJsb2NrKG51bGwsIHRydWUpO1xuICAgIH1cbiAgICB2YXIgcmVzID0gcGFyZW50LmJsb2Nrcy5yZW1vdmUoZGF0YSk7XG4gICAgLy8gVE9ETyBUaGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gdW5kbyBwbHVnaW4gcHJlc2VuY2UuXG4gICAgdmlld01vZGVsLm5vdGlmaWVyLmluZm8odmlld01vZGVsLnQoJ0Jsb2NrIHJlbW92ZWQ6IHVzZSB1bmRvIGJ1dHRvbiB0byByZXN0b3JlIGl0Li4uJykpO1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gYmxvY2std3lzaXd5Zy50bXBsLmh0bWxcbiAgdmlld01vZGVsLmR1cGxpY2F0ZUJsb2NrID0gZnVuY3Rpb24oaW5kZXgsIHBhcmVudCkge1xuICAgIHZhciBpZHggPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGluZGV4KTtcbiAgICAvLyBEZWluc3RydW1lbnQvZGVvYnNlcnZlIHRoZSBvYmplY3RcbiAgICB2YXIgdW53cmFwcGVkID0ga28udG9KUyhrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHBhcmVudC5ibG9ja3MpW2lkeF0pO1xuICAgIC8vIFdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBpZCBzbyB0aGF0IGEgbmV3IG9uZSB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBjbG9uZVxuICAgIGlmICh0eXBlb2YgdW53cmFwcGVkLmlkICE9PSAndW5kZWZpbmVkJykgdW53cmFwcGVkLmlkID0gJyc7XG4gICAgLy8gaW5zZXJ0IHRoZSBjbG9uZWQgYmxvY2tcbiAgICBwYXJlbnQuYmxvY2tzLnNwbGljZShpZHggKyAxLCAwLCB1bndyYXBwZWQpO1xuICB9O1xuXG4gIC8vIGJsb2NrLXd5c2l3eWcudG1wbC5odG1sXG4gIHZpZXdNb2RlbC5tb3ZlQmxvY2sgPSBmdW5jdGlvbihpbmRleCwgcGFyZW50LCB1cCkge1xuICAgIHZhciBpZHggPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGluZGV4KTtcbiAgICB2YXIgcGFyZW50QmxvY2tzID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShwYXJlbnQuYmxvY2tzKTtcbiAgICBpZiAoKHVwICYmIGlkeCA+IDApIHx8ICghdXAgJiYgaWR4IDwgcGFyZW50QmxvY2tzLmxlbmd0aCAtIDEpKSB7XG4gICAgICB2YXIgZGVzdEluZGV4ID0gaWR4ICsgKHVwID8gLTEgOiAxKTtcbiAgICAgIHZhciBkZXN0QmxvY2sgPSBwYXJlbnRCbG9ja3NbZGVzdEluZGV4XTtcbiAgICAgIHZpZXdNb2RlbC5zdGFydE11bHRpcGxlKCk7XG4gICAgICBwYXJlbnQuYmxvY2tzLnNwbGljZShkZXN0SW5kZXgsIDEpO1xuICAgICAgcGFyZW50LmJsb2Nrcy5zcGxpY2UoaWR4LCAwLCBkZXN0QmxvY2spO1xuICAgICAgdmlld01vZGVsLnN0b3BNdWx0aXBsZSgpO1xuICAgIH1cbiAgfTtcblxuICAvLyB0ZXN0IG1ldGhvZCwgY29tbWFuZCBsaW5lIHVzZSBvbmx5XG4gIHZpZXdNb2RlbC5sb2FkRGVmYXVsdEJsb2NrcyA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIGNsb25pbmcgdGhlIHdob2xlIFwibWFpbkJsb2Nrc1wiIG9iamVjdCBzbyB0aGF0IHVuZG9tYW5hZ2VyIHdpbGxcbiAgICAvLyBzZWUgaXQgYXMgYSBzaW5nbGUgb3BlcmF0aW9uIChtYXliZSBJIGNvdWxkIHVzZSBcInN0YXJ0TXVsdGlwbGVcIi9cInN0b3BNdWx0aXBsZVwiLlxuICAgIHZhciByZXMgPSBrby50b0pTKHZpZXdNb2RlbC5jb250ZW50KCkubWFpbkJsb2Nrcyk7XG4gICAgcmVzLmJsb2NrcyA9IFtdO1xuICAgIHZhciBpbnB1dCA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmlld01vZGVsLmJsb2NrRGVmcyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG9iaiA9IGtvLnRvSlMoaW5wdXRbaV0pO1xuICAgICAgLy8gZ2VuZXJhdGluZyBpZHMgZm9yIGJsb2NrcywgbWF5YmUgdGhpcyB3b3VsZCB3b3JrIGFsc28gbGVhdmluZyBpdCBlbXB0eS5cbiAgICAgIG9iai5pZCA9ICdibG9ja18nICsgaTtcbiAgICAgIHJlcy5ibG9ja3MucHVzaChvYmopO1xuICAgIH1cbiAgICBwZXJmb3JtYW5jZUF3YXJlQ2FsbGVyKCdzZXRNYWluQmxvY2tzJywgdmlld01vZGVsLmNvbnRlbnQoKS5tYWluQmxvY2tzLl93cmFwLmJpbmQodmlld01vZGVsLmNvbnRlbnQoKS5tYWluQmxvY2tzLCByZXMpKTtcbiAgfTtcblxuICAvLyBnYWxsZXJ5LWltYWdlcy50bXBsLmh0bWxcbiAgdmlld01vZGVsLmFkZEltYWdlID0gZnVuY3Rpb24oaW1nKSB7XG4gICAgdmFyIHNlbGVjdGVkSW1nID0gJCgnI21haW4td3lzaXd5Zy1hcmVhIC5zZWxlY3RhYmxlLWltZy5zZWxlY3RlZGl0ZW0nKTtcbiAgICBpZiAoc2VsZWN0ZWRJbWcubGVuZ3RoID09IDEgJiYgdHlwZW9mIGltZyA9PSAnb2JqZWN0JyAmJiB0eXBlb2YgaW1nLnVybCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGtvLmNvbnRleHRGb3Ioc2VsZWN0ZWRJbWdbMF0pLl9zcmMoaW1nLnVybCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICAvLyB0b29sYm94LnRtcGwuaHRtbFxuICB2aWV3TW9kZWwuYWRkQmxvY2sgPSBmdW5jdGlvbihvYmosIGV2ZW50KSB7XG4gICAgLy8gaWYgdGhlcmUgaXMgYSBzZWxlY3RlZCBibG9jayB3ZSB0cnkgdG8gYWRkIHRoZSBibG9jayBqdXN0IGFmdGVyIHRoZSBzZWxlY3RlZCBvbmUuXG4gICAgdmFyIHNlbGVjdGVkID0gdmlld01vZGVsLnNlbGVjdGVkQmxvY2soKTtcbiAgICAvLyBzZWFyY2ggdGhlIHNlbGVjdGVkIGJsb2NrIHBvc2l0aW9uLlxuICAgIHZhciBmb3VuZDtcbiAgICBpZiAoc2VsZWN0ZWQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE8gXCJtYWluQmxvY2tzXCIgaXMgYW4gaGFyZGNvZGVkIHRoaW5nLlxuICAgICAgZm9yICh2YXIgaSA9IHZpZXdNb2RlbC5jb250ZW50KCkubWFpbkJsb2NrcygpLmJsb2NrcygpLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmICh2aWV3TW9kZWwuY29udGVudCgpLm1haW5CbG9ja3MoKS5ibG9ja3MoKVtpXSgpID09IHNlbGVjdGVkKSB7XG4gICAgICAgICAgZm91bmQgPSBpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBwb3M7XG4gICAgaWYgKHR5cGVvZiBmb3VuZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHBvcyA9IGZvdW5kICsgMTtcbiAgICAgIHZpZXdNb2RlbC5jb250ZW50KCkubWFpbkJsb2NrcygpLmJsb2Nrcy5zcGxpY2UocG9zLCAwLCBvYmopO1xuICAgICAgdmlld01vZGVsLm5vdGlmaWVyLmluZm8odmlld01vZGVsLnQoJ05ldyBibG9jayBhZGRlZCBhZnRlciB0aGUgc2VsZWN0ZWQgb25lIChfX3Bvc19fKScsIHtcbiAgICAgICAgcG9zOiBwb3NcbiAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmlld01vZGVsLmNvbnRlbnQoKS5tYWluQmxvY2tzKCkuYmxvY2tzLnB1c2gob2JqKTtcbiAgICAgIHBvcyA9IHZpZXdNb2RlbC5jb250ZW50KCkubWFpbkJsb2NrcygpLmJsb2NrcygpLmxlbmd0aCAtIDE7XG4gICAgICB2aWV3TW9kZWwubm90aWZpZXIuaW5mbyh2aWV3TW9kZWwudCgnTmV3IGJsb2NrIGFkZGVkIGF0IHRoZSBtb2RlbCBib3R0b20gKF9fcG9zX18pJywge1xuICAgICAgICBwb3M6IHBvc1xuICAgICAgfSkpO1xuICAgIH1cbiAgICAvLyBmaW5kIHRoZSBuZXdseSBhZGRlZCBibG9jayBhbmQgc2VsZWN0IGl0IVxuICAgIHZhciBhZGRlZCA9IHZpZXdNb2RlbC5jb250ZW50KCkubWFpbkJsb2NrcygpLmJsb2NrcygpW3Bvc10oKTtcbiAgICB2aWV3TW9kZWwuc2VsZWN0QmxvY2soYWRkZWQsIHRydWUpO1xuICAgIC8vIHByZXZlbnQgY2xpY2sgcHJvcGFnYXRpb24gKGxvc2luZyB1cmwgaGFzaCAtIHNlZSAjNDMpXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8vIFVzZWQgYnkgc3R5bGVzaGVldC5qcyB0byBjcmVhdGUgbXVsdGlwbGUgc3R5bGVzXG4gIHZpZXdNb2RlbC5maW5kT2JqZWN0c09mVHlwZSA9IGZ1bmN0aW9uKGRhdGEsIHR5cGUpIHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIG9iaiA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoZGF0YSk7XG4gICAgZm9yICh2YXIgcHJvcCBpbiBvYmopXG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgIHZhciB2YWwgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKG9ialtwcm9wXSk7XG4gICAgICAgIC8vIFRPRE8gdGhpcyBpcyBub3QgdGhlIHJpZ2h0IHdheSB0byBkZWFsIHdpdGggXCJibG9jayBsaXN0XCIgb2JqZWN0cy5cbiAgICAgICAgaWYgKHByb3AubWF0Y2goL0Jsb2NrcyQvKSkge1xuICAgICAgICAgIHZhciBjb250ZW50cyA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsLmJsb2Nrcyk7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGMgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGNvbnRlbnRzW2ldKTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBudWxsIHx8IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoYy50eXBlKSA9PSB0eXBlKSByZXMucHVzaChjKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVE9ETyBpbnZlc3RpZ2F0ZSB3aGljaCBjb25kaXRpb24gcHJvdmlkZSBhIG51bGwgdmFsdWUuXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAodHlwZSA9PT0gbnVsbCB8fCBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbC50eXBlKSA9PSB0eXBlKSByZXMucHVzaCh2YWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvKlxuICB2aWV3TW9kZWwucGxhY2Vob2xkZXJIZWxwZXIgPSAnc29ydGFibGUtcGxhY2Vob2xkZXInO1xuICBpZiAoZmFsc2UpIHtcbiAgICB2aWV3TW9kZWwucGxhY2Vob2xkZXJIZWxwZXIgPSB7XG4gICAgICBlbGVtZW50OiBmdW5jdGlvbihjdXJyZW50SXRlbSkge1xuICAgICAgICByZXR1cm4gJCgnPGRpdiAvPicpLnJlbW92ZUNsYXNzKCd1aS1kcmFnZ2FibGUnKS5hZGRDbGFzcygnc29ydGFibGUtcGxhY2Vob2xkZXInKS5jc3MoJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJykuY3NzKCd3aWR0aCcsICcxMDAlJykuY3NzKCdoZWlnaHQnLCBjdXJyZW50SXRlbS5jc3MoJ2hlaWdodCcpKS5jc3MoJ29wYWNpdHknLCAnLjgnKVswXTtcbiAgICAgIH0sXG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uKGNvbnRhaW5lciwgcCkge1xuICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gICovXG5cbiAgLy8gQXR0ZW1wdCB0byBpbnNlcnQgdGhlIGJsb2NrIGluIHRoZSBkZXN0aW5hdGlvbiBsYXlvdXQgZHVyaW5nIGRyYWdnaW5nXG4gIHZpZXdNb2RlbC5wbGFjZWhvbGRlckhlbHBlciA9IHtcbiAgICBlbGVtZW50OiBmdW5jdGlvbihjdXJyZW50SXRlbSkge1xuICAgICAgcmV0dXJuICQoY3VycmVudEl0ZW1bMF0ub3V0ZXJIVE1MKS5yZW1vdmVDbGFzcygndWktZHJhZ2dhYmxlJykuYWRkQ2xhc3MoJ3NvcnRhYmxlLXBsYWNlaG9sZGVyJykuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJykuY3NzKCdwb3NpdGlvbicsICdyZWxhdGl2ZScpLmNzcygnd2lkdGgnLCAnMTAwJScpLmNzcygnaGVpZ2h0JywgJ2F1dG8nKS5jc3MoJ29wYWNpdHknLCAnLjgnKVswXTtcbiAgICB9LFxuICAgIHVwZGF0ZTogZnVuY3Rpb24oY29udGFpbmVyLCBwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9O1xuXG4gIC8vIFRPRE8gdGhlIHVuZHVtYW5hZ2VyIHNob3VsZCBiZSBwbHVnZ2FibGUuXG4gIC8vIFVzZWQgYnkgXCJtb3ZlQmxvY2tcIiBhbmQgYmxvY2tzLXd5c2l3eWcudG1wbC5odG1sIHRvIFwibWVyZ2VcIiBkcmFnL2Ryb3Agb3BlcmF0aW9ucyBpbnRvIGEgc2luZ2xlIHVuZG8vcmVkbyBvcC5cbiAgdmlld01vZGVsLnN0YXJ0TXVsdGlwbGUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodHlwZW9mIHZpZXdNb2RlbC5zZXRVbmRvTW9kZU1lcmdlICE9PSAndW5kZWZpbmVkJykgdmlld01vZGVsLnNldFVuZG9Nb2RlTWVyZ2UoKTtcbiAgfTtcbiAgdmlld01vZGVsLnN0b3BNdWx0aXBsZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0eXBlb2Ygdmlld01vZGVsLnNldFVuZG9Nb2RlT25jZSAhPT0gJ3VuZGVmaW5lZCcpIHZpZXdNb2RlbC5zZXRVbmRvTW9kZU9uY2UoKTtcbiAgfTtcblxuICAvLyBVc2VkIGJ5IGNvZGUgZ2VuZXJhdGVkIGJ5IGVkaXRvci5qcyBcbiAgdmlld01vZGVsLmxvY2FsR2xvYmFsU3dpdGNoID0gZnVuY3Rpb24ocHJvcCwgZ2xvYmFsUHJvcCkge1xuICAgIHZhciBjdXJyZW50ID0gcHJvcCgpO1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsKSBwcm9wKGdsb2JhbFByb3AoKSk7XG4gICAgZWxzZSBwcm9wKG51bGwpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvLyBVc2VkIGJ5IGVkaXRvciBhbmQgbWFpbiBcImNvbnZlcnRlclwiIHRvIHN1cHBvcnQgaXRlbSBzZWxlY3Rpb25cbiAgdmlld01vZGVsLnNlbGVjdEl0ZW0gPSBmdW5jdGlvbih2YWx1ZUFjY2Vzc29yLCBpdGVtLCBibG9jaykge1xuICAgIHZhciB2YWwgPSBrby51dGlscy5wZWVrT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKTtcbiAgICBpZiAodHlwZW9mIGJsb2NrICE9PSAndW5kZWZpbmVkJykgdmlld01vZGVsLnNlbGVjdEJsb2NrKGJsb2NrLCBmYWxzZSwgdHJ1ZSk7XG4gICAgaWYgKHZhbCAhPSBpdGVtKSB7XG4gICAgICB2YWx1ZUFjY2Vzc29yKGl0ZW0pO1xuICAgICAgLy8gT24gc2VsZWN0SXRlbSBpZiB3ZSB3ZXJlIG9uIFwiQmxvY2tzXCIgdG9vbGJveCB0YWIgd2UgbW92ZSB0byBcIkNvbnRlbnRcIiB0b29sYm94IHRhYi5cbiAgICAgIGlmIChpdGVtICE9PSBudWxsICYmIHZpZXdNb2RlbC5zZWxlY3RlZFRvb2woKSA9PT0gMCkgdmlld01vZGVsLnNlbGVjdGVkVG9vbCgxKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LmJpbmQodmlld01vZGVsLCB2aWV3TW9kZWwuc2VsZWN0ZWRJdGVtKTtcblxuICB2aWV3TW9kZWwuaXNTZWxlY3RlZEl0ZW0gPSBmdW5jdGlvbihpdGVtKSB7XG4gICAgcmV0dXJuIHZpZXdNb2RlbC5zZWxlY3RlZEl0ZW0oKSA9PSBpdGVtO1xuICB9O1xuXG4gIHZpZXdNb2RlbC5zZWxlY3RCbG9jayA9IGZ1bmN0aW9uKHZhbHVlQWNjZXNzb3IsIGl0ZW0sIGRvTm90U2VsZWN0LCBkb05vdFVuc2VsZWN0SXRlbSkge1xuICAgIHZhciB2YWwgPSBrby51dGlscy5wZWVrT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKTtcbiAgICBpZiAoIWRvTm90VW5zZWxlY3RJdGVtKSB2aWV3TW9kZWwuc2VsZWN0SXRlbShudWxsKTtcbiAgICBpZiAodmFsICE9IGl0ZW0pIHtcbiAgICAgIHZhbHVlQWNjZXNzb3IoaXRlbSk7XG4gICAgICAvLyBoaWRlIGdhbGxlcnkgb24gYmxvY2sgc2VsZWN0aW9uXG4gICAgICB2aWV3TW9kZWwuc2hvd0dhbGxlcnkoZmFsc2UpO1xuICAgICAgaWYgKGl0ZW0gIT09IG51bGwgJiYgIWRvTm90U2VsZWN0ICYmIHZpZXdNb2RlbC5zZWxlY3RlZFRvb2woKSA9PT0gMCkgdmlld01vZGVsLnNlbGVjdGVkVG9vbCgxKTtcbiAgICB9XG4gIH0uYmluZCh2aWV3TW9kZWwsIHZpZXdNb2RlbC5zZWxlY3RlZEJsb2NrKTtcblxuICAvLyBERUJVR1xuICB2aWV3TW9kZWwuY291bnRTdWJzY3JpcHRpb25zID0gZnVuY3Rpb24obW9kZWwsIGRlYnVnKSB7XG4gICAgdmFyIHJlcyA9IDA7XG4gICAgZm9yICh2YXIgcHJvcCBpbiBtb2RlbClcbiAgICAgIGlmIChtb2RlbC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICB2YXIgcCA9IG1vZGVsW3Byb3BdO1xuICAgICAgICBpZiAoa28uaXNPYnNlcnZhYmxlKHApKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBwLl9kZWZhdWx0Q29tcHV0ZWQgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGVidWcgIT0gJ3VuZGVmaW5lZCcpIGNvbnNvbGUubG9nKGRlYnVnICsgXCIvXCIgKyBwcm9wICsgXCIvX1wiLCBwLl9kZWZhdWx0Q29tcHV0ZWQuZ2V0U3Vic2NyaXB0aW9uc0NvdW50KCkpO1xuICAgICAgICAgICAgcmVzICs9IHAuX2RlZmF1bHRDb21wdXRlZC5nZXRTdWJzY3JpcHRpb25zQ291bnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiBkZWJ1ZyAhPSAndW5kZWZpbmVkJykgY29uc29sZS5sb2coZGVidWcgKyBcIi9cIiArIHByb3AgKyBcIi8tXCIsIHAuZ2V0U3Vic2NyaXB0aW9uc0NvdW50KCkpO1xuICAgICAgICAgIHJlcyArPSBwLmdldFN1YnNjcmlwdGlvbnNDb3VudCgpO1xuICAgICAgICAgIHAgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcCA9PSAnb2JqZWN0JyAmJiBwICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIHRvdCA9IHZpZXdNb2RlbC5jb3VudFN1YnNjcmlwdGlvbnMocCwgdHlwZW9mIGRlYnVnICE9ICd1bmRlZmluZWQnID8gZGVidWcgKyAnLycgKyBwcm9wICsgXCJAXCIgOiB1bmRlZmluZWQpO1xuICAgICAgICAgIGlmICh0eXBlb2YgZGVidWcgIT0gJ3VuZGVmaW5lZCcpIGNvbnNvbGUubG9nKGRlYnVnICsgXCIvXCIgKyBwcm9wICsgXCJAXCIsIHRvdCk7XG4gICAgICAgICAgcmVzICs9IHRvdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gREVCVUdcbiAgdmlld01vZGVsLmxvb3BTdWJzY3JpcHRpb25zQ291bnQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgY291bnQgPSB2aWV3TW9kZWwuY291bnRTdWJzY3JpcHRpb25zKHZpZXdNb2RlbC5jb250ZW50KCkpO1xuICAgIGdsb2JhbC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3Vic2NyaXB0aW9uc0NvdW50JykuaW5uZXJIVE1MID0gY291bnQ7XG4gICAgZ2xvYmFsLnNldFRpbWVvdXQodmlld01vZGVsLmxvb3BTdWJzY3JpcHRpb25zQ291bnQsIDEwMDApO1xuICB9O1xuXG4gIHZpZXdNb2RlbC5leHBvcnQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgY29udGVudCA9IHBlcmZvcm1hbmNlQXdhcmVDYWxsZXIoXCJleHBvcnRIVE1MXCIsIHZpZXdNb2RlbC5leHBvcnRIVE1MKTtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfTtcblxuICBmdW5jdGlvbiBjb25kaXRpb25hbF9yZXN0b3JlKGh0bWwpIHtcbiAgICByZXR1cm4gaHRtbC5yZXBsYWNlKC88cmVwbGFjZWRjY1tePl0qIGNvbmRpdGlvbj1cIihbXlwiXSopXCJbXj5dKj4oW1xcc1xcU10qPyk8XFwvcmVwbGFjZWRjYz4vZywgZnVuY3Rpb24obWF0Y2gsIGNvbmRpdGlvbiwgYm9keSkge1xuICAgICAgdmFyIGRkID0gJzwhLS1baWYgJytjb25kaXRpb24ucmVwbGFjZSgvJmFtcDsvLCAnJicpKyddPic7XG4gICAgICBkZCArPSBib2R5LnJlcGxhY2UoLzwhLS0gY2M6YmM6KFtBLVphLXo6XSopIC0tPig8XFwvY2M+KT88IS0tIGNjOmFjOlxcMSAtLT4vZywgJzwvJDE+JykgLy8gcmVzdG9yZSBjbG9zaW5nIHRhZ3MgKGluY2x1ZGluZyBsb3N0IHRhZ3MpXG4gICAgICAgICAgICAucmVwbGFjZSgvPjxcXC9jYz48IS0tIGNjOnNjIC0tPi9nLCAnLz4nKSAvLyByZXN0b3JlIHNlbGZjbG9zaW5nIHRhZ3NcbiAgICAgICAgICAgIC5yZXBsYWNlKC88IS0tIGNjOmJvOihbQS1aYS16Ol0qKSAtLT48Y2MvZywgJzwkMScpIC8vIHJlc3RvcmUgb3BlbiB0YWdzXG4gICAgICAgICAgICAucmVwbGFjZSgvXi4qPCEtLSBjYzpzdGFydCAtLT4vLCcnKSAvLyByZW1vdmUgY29udGVudCBiZWZvcmUgc3RhcnRcbiAgICAgICAgICAgIC5yZXBsYWNlKC88IS0tIGNjOmVuZCAtLT4uKiQvLCcnKTsgLy8gcmVtb3ZlIGNvbnRlbnQgYWZ0ZXIgZW5kXG4gICAgICBkZCArPSAnPCFbZW5kaWZdLS0+JztcbiAgICAgIHJldHVybiBkZDtcbiAgICB9KTtcbiAgfVxuXG4gIHZpZXdNb2RlbC5leHBvcnRIVE1MID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGlkID0gJ2V4cG9ydGZyYW1lJztcbiAgICAkKCdib2R5JykuYXBwZW5kKCc8aWZyYW1lIGlkPVwiJyArIGlkICsgJ1wiIGRhdGEtYmluZD1cImJpbmRJZnJhbWU6ICRkYXRhXCI+PC9pZnJhbWU+Jyk7XG4gICAgdmFyIGZyYW1lRWwgPSBnbG9iYWwuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGtvLmFwcGx5QmluZGluZ3Modmlld01vZGVsLCBmcmFtZUVsKTtcblxuICAgIGtvLmNsZWFuTm9kZShmcmFtZUVsKTtcblxuICAgIGlmICh2aWV3TW9kZWwuaW5saW5lKSB2aWV3TW9kZWwuaW5saW5lKGZyYW1lRWwuY29udGVudFdpbmRvdy5kb2N1bWVudCk7XG5cbiAgICAvLyBPYnNvbGV0ZSBtZXRob2QgZGlkbid0IHdvcmsgb24gSUUxMSB3aGVuIHVzaW5nIFwiSFRNTDUgZG9jdHlwZVwiOlxuICAgIC8vIHZhciBkb2NUeXBlID0gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhnbG9iYWwuZG9jdW1lbnQuZG9jdHlwZSk7XG4gICAgdmFyIG5vZGUgPSBmcmFtZUVsLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuZG9jdHlwZTtcbiAgICB2YXIgZG9jVHlwZSA9IFwiPCFET0NUWVBFIFwiICsgbm9kZS5uYW1lICtcbiAgICAgIChub2RlLnB1YmxpY0lkID8gJyBQVUJMSUMgXCInICsgbm9kZS5wdWJsaWNJZCArICdcIicgOiAnJykgK1xuICAgICAgKCFub2RlLnB1YmxpY0lkICYmIG5vZGUuc3lzdGVtSWQgPyAnIFNZU1RFTScgOiAnJykgK1xuICAgICAgKG5vZGUuc3lzdGVtSWQgPyAnIFwiJyArIG5vZGUuc3lzdGVtSWQgKyAnXCInIDogJycpICsgJz4nO1xuICAgIHZhciBjb250ZW50ID0gZG9jVHlwZSArIFwiXFxuXCIgKyBmcmFtZUVsLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICBrby5yZW1vdmVOb2RlKGZyYW1lRWwpO1xuXG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvPHNjcmlwdCAoW14+XSogKT90eXBlPVwidGV4dFxcL2h0bWxcIltePl0qPltcXHNcXFNdKj88XFwvc2NyaXB0Pi9nbSwgJycpO1xuICAgIC8vIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLzwhLS0ga28gLio/IC0tPi9nLCAnJyk7IC8vIHNvbWV0aW1lcyB3ZSBoYXZlIGV4cHJlc3Npb25zIGxpa2UgKDwhLS0ga28gdmFyID4gMiAtLT4pXG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvPCEtLSBrbyAoKD8hLS0pLikqPyAtLT4vZywgJycpOyAvLyB0aGlzIHJlcGxhY2VzIHRoZSBhYm92ZSB3aXRoIGEgbW9yZSBmb3JtYWwgKGJ1dCBzbG93ZXIpIHNvbHV0aW9uXG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvPCEtLSBcXC9rbyAtLT4vZywgJycpO1xuICAgIC8vIFJlbW92ZSBkYXRhLWJpbmQvZGF0YS1ibG9jayBhdHRyaWJ1dGVzXG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvIGRhdGEtYmluZD1cIlteXCJdKlwiL2dtLCAnJyk7XG4gICAgLy8gUmVtb3ZlIHRyYXNoIGxlZnRvdmVyIGJ5IFRpbnlNQ0VcbiAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKC8gZGF0YS1tY2UtKGhyZWZ8c3JjfHN0eWxlKT1cIlteXCJdKlwiL2dtLCAnJyk7XG5cbiAgICAvLyBSZXBsYWNlIFwicmVwbGFjZWRzdHlsZVwiIHRvIFwic3R5bGVcIiBhdHRyaWJ1dGVzIChjaHJvbWUgcHV0cyByZXBsYWNlZHN0eWxlIGFmdGVyIHN0eWxlKVxuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLyBzdHlsZT1cIlteXCJdKlwiKFtePl0qKSByZXBsYWNlZChzdHlsZT1cIlteXCJdKlwiKS9nbSwgJyQxICQyJyk7XG4gICAgLy8gUmVwbGFjZSBcInJlcGxhY2Vkc3R5bGVcIiB0byBcInN0eWxlXCIgYXR0cmlidXRlcyAoaWUvZmYgaGF2ZSByZXZlcnNlIG9yZGVyKVxuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLyByZXBsYWNlZChzdHlsZT1cIlteXCJdKlwiKShbXj5dKikgc3R5bGU9XCJbXlwiXSpcIi9nbSwgJyAkMSQyJyk7XG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvIHJlcGxhY2VkKHN0eWxlPVwiW15cIl0qXCIpL2dtLCAnICQxJyk7XG5cbiAgICAvLyBzYW1lIGFzIHN0eWxlLCBidXQgZm9yIGh0dHAtZXF1aXYgKHNvbWUgYnJvd3NlciBicmVhayBpdCBpZiB3ZSBkb24ndCByZXBsYWNlLCBidXQgdGhlbiB3ZSBmaW5kIGl0IGR1cGxpY2F0ZWQpXG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvIGh0dHAtZXF1aXY9XCJbXlwiXSpcIihbXj5dKikgcmVwbGFjZWQoaHR0cC1lcXVpdj1cIlteXCJdKlwiKS9nbSwgJyQxICQyJyk7XG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvIHJlcGxhY2VkKGh0dHAtZXF1aXY9XCJbXlwiXSpcIikoW14+XSopIGh0dHAtZXF1aXY9XCJbXlwiXSpcIi9nbSwgJyAkMSQyJyk7XG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvIHJlcGxhY2VkKGh0dHAtZXF1aXY9XCJbXlwiXSpcIikvZ20sICcgJDEnKTtcblxuICAgIC8vIFdlIGFscmVhZHkgcmVwbGFjZSBzdHlsZSBhbmQgaHR0cC1lcXVpdiBhbmQgd2UgZG9uJ3QgbmVlZCB0aGlzLlxuICAgIC8vIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLyByZXBsYWNlZChbXj0gXSo9KS9nbSwgJyAkMScpO1xuICAgIC8vIFJlc3RvcmUgY29uZGl0aW9uYWwgY29tbWVudHNcbiAgICBjb250ZW50ID0gY29uZGl0aW9uYWxfcmVzdG9yZShjb250ZW50KTtcbiAgICB2YXIgdHJhc2ggPSBjb250ZW50Lm1hdGNoKC8gZGF0YS1bXiA9XSsoPVwiW15cIl0rXCIpPyAvKSB8fCBjb250ZW50Lm1hdGNoKC8gcmVwbGFjZWQoW149IF0qPSkvKTtcbiAgICBpZiAodHJhc2gpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIk91dHB1dCBIVE1MIGNvbnRhaW5zIHVuZXhwZWN0ZWQgZGF0YS0gYXR0cmlidXRlcyBvciByZXBsYWNlZCBhdHRyaWJ1dGVzXCIsIHRyYXNoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGVudDtcbiAgfTtcblxuICB2aWV3TW9kZWwuZXhwb3J0SFRNTHRvVGV4dGFyZWEgPSBmdW5jdGlvbih0ZXh0YXJlYWlkKSB7XG4gICAgJCh0ZXh0YXJlYWlkKS52YWwodmlld01vZGVsLmV4cG9ydEhUTUwoKSk7XG4gIH07XG5cbiAgdmlld01vZGVsLmV4cG9ydEpTT050b1RleHRhcmVhID0gZnVuY3Rpb24odGV4dGFyZWFpZCkge1xuICAgICQodGV4dGFyZWFpZCkudmFsKHZpZXdNb2RlbC5leHBvcnRKU09OKCkpO1xuICB9O1xuXG4gIHZpZXdNb2RlbC5pbXBvcnRKU09OZnJvbVRleHRhcmVhID0gZnVuY3Rpb24odGV4dGFyZWFpZCkge1xuICAgIHZpZXdNb2RlbC5pbXBvcnRKU09OKCQodGV4dGFyZWFpZCkudmFsKCkpO1xuICB9O1xuXG4gIHZpZXdNb2RlbC5leHBvcnRNZXRhZGF0YSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBqc29uID0ga28udG9KU09OKHZpZXdNb2RlbC5tZXRhZGF0YSk7XG4gICAgcmV0dXJuIGpzb247XG4gIH07XG5cbiAgdmlld01vZGVsLmV4cG9ydEpTT04gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIganNvbiA9IGtvLnRvSlNPTih2aWV3TW9kZWwuY29udGVudCk7XG4gICAgcmV0dXJuIGpzb247XG4gIH07XG5cbiAgdmlld01vZGVsLmV4cG9ydEpTID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGtvLnRvSlModmlld01vZGVsLmNvbnRlbnQpO1xuICB9O1xuXG4gIHZpZXdNb2RlbC5pbXBvcnRKU09OID0gZnVuY3Rpb24oanNvbikge1xuICAgIHZhciB1bndyYXBwZWQgPSBrby51dGlscy5wYXJzZUpzb24oanNvbik7XG4gICAgdmlld01vZGVsLmNvbnRlbnQuX3dyYXAodW53cmFwcGVkKTtcbiAgfTtcblxuICB2aWV3TW9kZWwuZXhwb3J0VGhlbWUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZmxhdCA9IHt9O1xuICAgIHZhciBtb2QgPSB2aWV3TW9kZWwuY29udGVudCgpLnRoZW1lKCk7XG5cbiAgICB2YXIgX2V4cG9ydCA9IGZ1bmN0aW9uKHByZWZpeCwgZmxhdCwgbW9kKSB7XG4gICAgICBmb3IgKHZhciBwcm9wIGluIG1vZClcbiAgICAgICAgaWYgKG1vZC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgIHZhciBhID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShtb2RbcHJvcF0pO1xuICAgICAgICAgIGlmIChhICE9PSBudWxsICYmIHR5cGVvZiBhID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBfZXhwb3J0KHByb3AgKyAnLicsIGZsYXQsIGEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmbGF0W3ByZWZpeCArIHByb3BdID0gYTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgX2V4cG9ydCgnJywgZmxhdCwgbW9kKTtcblxuICAgIHZhciBvdXRwdXQgPSAnJztcbiAgICBmb3IgKHZhciBwcm9wIGluIGZsYXQpXG4gICAgICBpZiAoZmxhdC5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiBwcm9wICE9ICd0eXBlJykge1xuICAgICAgICBvdXRwdXQgKz0gcHJvcCArIFwiOiBcIiArIGZsYXRbcHJvcF0gKyBcIjtcIiArIFwiXFxuXCI7XG4gICAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9O1xuXG4gIC8vIG1veGllbWFuYWdlciAob3IgZmlsZSBicm93c2VyL2ltYWdlZWRpdG9yKSBleHRlbnNpb24gcG9pbnRzLlxuICAvLyBKdXN0IGltcGxlbWVudCBlZGl0SW1hZ2Ugb3IgbGlua0RpYWxvZyBtZXRob2RzXG4gIC8vIHZpZXdNb2RlbC5lZGl0SW1hZ2UgPSBmdW5jdGlvbihzcmMsIGRvbmUpIHt9IDogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGVuYWJsZSBpbWFnZSBlZGl0aW5nIChzcmMgaXMgYSB3aXJ0YWJsZU9ic2VydmFibGUpLlxuICAvLyB2aWV3TW9kZWwubGlua0RpYWxvZyA9IGZ1bmN0aW9uKCkge306IGltcGxlbWVudCB0aGlzIG1ldGhvZCB1c2luZyBcInRoaXNcIiB0byBmaW5kIHRoZSBpbnB1dCBlbGVtZW50ICQodGhpcykudmFsIGlzIGEgd3JpdGFibGVPYnNlcnZhYmxlLlxuXG4gIHZpZXdNb2RlbC5sb2FkSW1hZ2UgPSBmdW5jdGlvbihpbWcpIHtcbiAgICAvLyBwdXNoIGltYWdlIGF0IHRvcCBvZiBcInJlY2VudFwiIGdhbGxlcnlcbiAgICB2aWV3TW9kZWwuZ2FsbGVyeVJlY2VudC51bnNoaWZ0KGltZyk7XG4gICAgLy8gc2VsZWN0IHJlY2VudCBnYWxsZXJ5IHRhYlxuICAgIHZpZXdNb2RlbC5zZWxlY3RlZEltYWdlVGFiKDApO1xuICB9O1xuXG4gIHZpZXdNb2RlbC5kaWFsb2cgPSBmdW5jdGlvbihzZWxlY3Rvciwgb3B0aW9ucykge1xuICAgICQoc2VsZWN0b3IpLmRpYWxvZyhvcHRpb25zKTtcbiAgfTtcblxuICAvLyBEdW1teSBsb2cgbWV0aG9kIG92ZXJyaWRkZW4gYnkgZXh0ZW5zaW9uc1xuICB2aWV3TW9kZWwubG9nID0gZnVuY3Rpb24oY2F0ZWdvcnksIG1zZykge1xuICAgIC8vIGNvbnNvbGUubG9nKFwidmlld01vZGVsLmxvZ1wiLCBjYXRlZ29yeSwgbXNnKTtcbiAgfTtcblxuICAvLyBhdXRvbWF0aWNhbGx5IGxvYWQgdGhlIGdhbGxlcnkgd2hlbiB0aGUgZ2FsbGVyeSB0YWIgaXMgc2VsZWN0ZWRcbiAgdmlld01vZGVsLnNlbGVjdGVkSW1hZ2VUYWIuc3Vic2NyaWJlKGZ1bmN0aW9uKG5ld1ZhbHVlKSB7XG4gICAgaWYgKG5ld1ZhbHVlID09IDEgJiYgdmlld01vZGVsLmdhbGxlcnlMb2FkZWQoKSA9PT0gZmFsc2UpIHtcbiAgICAgIHZpZXdNb2RlbC5sb2FkR2FsbGVyeSgpO1xuICAgIH1cbiAgfSwgdmlld01vZGVsLCAnY2hhbmdlJyk7XG5cbiAgcmV0dXJuIHZpZXdNb2RlbDtcblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRpYWxpemVFZGl0b3I7Il19
|