HFM Youth
Connecting students with Jesus and engaging them in developing a life-long faith.
How we do it…
[click on each line for more info]
Wednesday Night Youth Group –
6:30PM – 8:00PM (while school is in session)
Wednesday nights focus on teaching students how the Bible applies to their lives. We focus on a variety of scripture and topics that help students face life head-on. This is done in a very fun and caring environment. During this night students experience a time of worship, prayer, games, funny videos, friendly competition, testimonies, teaching, and breakout groups with our incredible youth leaders. This is a great night for students to invite friends who may be new to church.
Sunday Night Discipleship –
6:00PM – 8:00PM During the school year.
(AKA, SNYG) Sunday night youth group takes students deeper in their faith through more in-depth Bible, worldview, or book studies.
Bible Quizzing –
Bible Quizzing helps students grow by giving them an outlet to memorize God’s Word in a fun/competitive environment. Each month, our teams travel throughout the region to compete against other churches with the things they are learning. In June, our quiz teams participate in a national competition with churches from all over the country.
Sunday Morning Worship –
8:30 and 10:50AM
It’s important for families who are growing in their faith to participate in worship together and with other believers. Our church offers two worship services on Sundays; the key difference being the worship style. Our 8:30 service features traditional worship music and our 10:50 service features contemporary music with a live band. We have an amazing pastor (Dave Turner) who does a great job in communicating the truths of the Bible. Pastor Dave’s messages are very relevant and help get you excited about what the Bible has to say.
Sunday School –
9:50AM
Sunday School meets in the youth room, and is a time of teaching on various biblical topics and concepts.
Trips –
Throughout the year we facilitate a variety of trips students can participate in that challenge them spiritually and help them grow in unique ways. These trips include an annual winter retreat, mission trips, conferences, adventure trips and more! Details about our trips are given out during youth group and via email (which you can sign up for at the bottom of this page).
Events –
Throughout the year, our youth ministry coordinates various events that serve various purposes. Some events are service oriented and others are just for fun and fellowship. Some of these events include “Water Wars”, Dunes Day, concerts etc. Details about our events are given out during youth group and via email (which you can sign up for at the bottom of this page).
Youth Ministry Staff
We have an incredible team of caring adults that work with the teens here at HFM. Each of our staff love teens and go out of their way to help them grow closer to the God of the Universe.
Calendar, Events, and Other Links
See our calendar here: 2026-27 Wednesday Night Youth Group Schedule
Fill out our current consent form here: General Consent Form
Want to know more about how we operate? Check out the handbook: Ministry Handbook
See our current & past E-news HERE
[/cmsmasters_text][/cmsmasters_column][/cmsmasters_row][cmsmasters_row data_width=”boxed” data_padding_left=”3″ data_padding_right=”3″ data_top_style=”default” data_bot_style=”default” data_color=”default” data_bg_position=”top center” data_bg_repeat=”no-repeat” data_bg_attachment=”scroll” data_bg_size=”cover” data_bg_parallax_ratio=”0.5″ data_padding_top=”0″ data_padding_bottom=”50″ data_shortcode_id=”1hs5xpvj9n”][cmsmasters_column data_width=”1/1″ data_animation_delay=”0″ data_shortcode_id=”6jse14hf3h”][cmsmasters_html]PGRpdiBpZD0ibWNfZW1iZWRfc2hlbGwiPgogICAgICA8bGluayBocmVmPSIvL2Nkbi1pbWFnZXMubWFpbGNoaW1wLmNvbS9lbWJlZGNvZGUvY2xhc3NpYy0wNjE1MjMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAgICNtY19lbWJlZF9zaWdudXB7YmFja2dyb3VuZDojZmZmOyBmYWxzZTtjbGVhcjpsZWZ0OyBmb250OjE0cHggSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7IHdpZHRoOiA2MDBweDt9CiAgICAgICAgLyogQWRkIHlvdXIgb3duIE1haWxjaGltcCBmb3JtIHN0eWxlIG92ZXJyaWRlcyBpbiB5b3VyIHNpdGUgc3R5bGVzaGVldCBvciBpbiB0aGlzIHN0eWxlIGJsb2NrLgogICAgICAgICAgIFdlIHJlY29tbWVuZCBtb3ZpbmcgdGhpcyBibG9jayBhbmQgdGhlIHByZWNlZGluZyBDU1MgbGluayB0byB0aGUgSEVBRCBvZiB5b3VyIEhUTUwgZmlsZS4gKi8KPC9zdHlsZT4KPGRpdiBpZD0ibWNfZW1iZWRfc2lnbnVwIj4KICAgIDxmb3JtIGFjdGlvbj0iaHR0cHM6Ly9oaWxsc2RhbGVmbWMudXMxNC5saXN0LW1hbmFnZS5jb20vc3Vic2NyaWJlL3Bvc3Q/dT01ZmQ0NjNlZWU4ZGRlN2FjYzk5N2ExZDVjJmFtcDtpZD03OTFjZjQxNGQyJmFtcDtmX2lkPTAwNzBiOGU1ZjAiIG1ldGhvZD0icG9zdCIgaWQ9Im1jLWVtYmVkZGVkLXN1YnNjcmliZS1mb3JtIiBuYW1lPSJtYy1lbWJlZGRlZC1zdWJzY3JpYmUtZm9ybSIgY2xhc3M9InZhbGlkYXRlIiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgPGRpdiBpZD0ibWNfZW1iZWRfc2lnbnVwX3Njcm9sbCI+PGgyPlN1YnNjcmliZSB0byB0aGUgSEZNIFlvdXRoIE5ld3NsZXR0ZXI8L2gyPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmRpY2F0ZXMtcmVxdWlyZWQiPjxzcGFuIGNsYXNzPSJhc3RlcmlzayI+Kjwvc3Bhbj4gaW5kaWNhdGVzIHJlcXVpcmVkPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1jLWZpZWxkLWdyb3VwIj48bGFiZWwgZm9yPSJtY2UtRU1BSUwiPkVtYWlsIEFkZHJlc3MgPHNwYW4gY2xhc3M9ImFzdGVyaXNrIj4qPC9zcGFuPjwvbGFiZWw+PGlucHV0IHR5cGU9ImVtYWlsIiBuYW1lPSJFTUFJTCIgY2xhc3M9InJlcXVpcmVkIGVtYWlsIiBpZD0ibWNlLUVNQUlMIiByZXF1aXJlZD0iIiB2YWx1ZT0iIj48L2Rpdj48ZGl2IGNsYXNzPSJtYy1maWVsZC1ncm91cCI+PGxhYmVsIGZvcj0ibWNlLUZOQU1FIj5GaXJzdCBOYW1lIDxzcGFuIGNsYXNzPSJhc3RlcmlzayI+Kjwvc3Bhbj48L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJGTkFNRSIgY2xhc3M9InJlcXVpcmVkIHRleHQiIGlkPSJtY2UtRk5BTUUiIHJlcXVpcmVkPSIiIHZhbHVlPSIiPjwvZGl2PjxkaXYgY2xhc3M9Im1jLWZpZWxkLWdyb3VwIj48bGFiZWwgZm9yPSJtY2UtTE5BTUUiPkxhc3QgTmFtZSA8c3BhbiBjbGFzcz0iYXN0ZXJpc2siPio8L3NwYW4+PC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTE5BTUUiIGNsYXNzPSJyZXF1aXJlZCB0ZXh0IiBpZD0ibWNlLUxOQU1FIiByZXF1aXJlZD0iIiB2YWx1ZT0iIj48L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJtY2UtcmVzcG9uc2VzIiBjbGFzcz0iY2xlYXIgZm9vdCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJlc3BvbnNlIiBpZD0ibWNlLWVycm9yLXJlc3BvbnNlIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXNwb25zZSIgaWQ9Im1jZS1zdWNjZXNzLXJlc3BvbnNlIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPGRpdiBhcmlhLWhpZGRlbj0idHJ1ZSIgc3R5bGU9InBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogLTUwMDBweDsiPgogICAgICAgIC8qIHJlYWwgcGVvcGxlIHNob3VsZCBub3QgZmlsbCB0aGlzIGluIGFuZCBleHBlY3QgZ29vZCB0aGluZ3MgLSBkbyBub3QgcmVtb3ZlIHRoaXMgb3IgcmlzayBmb3JtIGJvdCBzaWdudXBzICovCiAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJfNWZkNDYzZWVlOGRkZTdhY2M5OTdhMWQ1Y183OTFjZjQxNGQyIiB0YWJpbmRleD0iLTEiIHZhbHVlPSIiPgogICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ib3B0aW9uYWxQYXJlbnQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjbGVhciBmb290Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1YnNjcmliZSIgaWQ9Im1jLWVtYmVkZGVkLXN1YnNjcmliZSIgY2xhc3M9ImJ1dHRvbiIgdmFsdWU9IlN1YnNjcmliZSI+CiAgICAgICAgICAgICAgICA8cCBzdHlsZT0ibWFyZ2luOiAwcHggYXV0bzsiPjxhIGhyZWY9Imh0dHA6Ly9lZXB1cmwuY29tL2lPUFdRRSIgdGl0bGU9Ik1haWxjaGltcCAtIGVtYWlsIG1hcmtldGluZyBtYWRlIGVhc3kgYW5kIGZ1biI+PHNwYW4gc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IGJvcmRlci1yYWRpdXM6IDRweDsiPjxpbWcgY2xhc3M9InJlZmZlcmFsX2JhZGdlIiBzcmM9Imh0dHBzOi8vZGlnaXRhbGFzc2V0LmludHVpdC5jb20vcmVuZGVyL2NvbnRlbnQvZGFtL2ludHVpdC9tYy1mZS9lbl91cy9pbWFnZXMvaW50dWl0LW1jLXJld2FyZHMtdGV4dC1kYXJrLnN2ZyIgYWx0PSJJbnR1aXQgTWFpbGNoaW1wIiBzdHlsZT0id2lkdGg6IDIyMHB4OyBoZWlnaHQ6IDQwcHg7IGRpc3BsYXk6IGZsZXg7IHBhZGRpbmc6IDJweCAwcHg7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBhbGlnbi1pdGVtczogY2VudGVyOyI+PC9zcGFuPjwvYT48L3A+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZm9ybT4KPC9kaXY+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii8vczMuYW1hem9uYXdzLmNvbS9kb3dubG9hZHMubWFpbGNoaW1wLmNvbS9qcy9tYy12YWxpZGF0ZS5qcyI+PC9zY3JpcHQ+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPihmdW5jdGlvbigkKSB7d2luZG93LmZuYW1lcyA9IG5ldyBBcnJheSgpOyB3aW5kb3cuZnR5cGVzID0gbmV3IEFycmF5KCk7Zm5hbWVzWzBdPSdFTUFJTCc7ZnR5cGVzWzBdPSdlbWFpbCc7Zm5hbWVzWzFdPSdGTkFNRSc7ZnR5cGVzWzFdPSd0ZXh0JztmbmFtZXNbMl09J0xOQU1FJztmdHlwZXNbMl09J3RleHQnO30oalF1ZXJ5KSk7dmFyICRtY2ogPSBqUXVlcnkubm9Db25mbGljdCh0cnVlKTsKICAgIC8vIFNNUyBQaG9uZSBNdWx0aS1Db3VudHJ5IEZ1bmN0aW9uYWxpdHkKICAgIGlmKCF3aW5kb3cuTUMpIHsKICAgICAgd2luZG93Lk1DID0ge307CiAgICB9CiAgICB3aW5kb3cuTUMuc21zUGhvbmVEYXRhID0gewogICAgICBkZWZhdWx0Q291bnRyeUNvZGU6ICdVUycsCiAgICAgIHByb2dyYW1zOiBbXSwKICAgICAgc21zUHJvZ3JhbURhdGFDb3VudHJ5TmFtZXM6IFtdCiAgICB9OwoKICAgIGZ1bmN0aW9uIGdldENvdW50cnlVbmljb2RlRmxhZyhjb3VudHJ5Q29kZSkgewogICAgICAgcmV0dXJuIGNvdW50cnlDb2RlLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvLi9nLCAoY2hhcikgPT4gU3RyaW5nLmZyb21Db2RlUG9pbnQoY2hhci5jaGFyQ29kZUF0KDApICsgMTI3Mzk3KSkKICAgIH07CgogICAgLy8gSFRNTCBzYW5pdGl6YXRpb24gZnVuY3Rpb24gdG8gcHJldmVudCBYU1MKICAgIGZ1bmN0aW9uIHNhbml0aXplSHRtbChzdHIpIHsKICAgICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSByZXR1cm4gJyc7CiAgICAgIHJldHVybiBzdHIKICAgICAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKQogICAgICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JykKICAgICAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpCiAgICAgICAgLnJlcGxhY2UoLyIvZywgJyZxdW90OycpCiAgICAgICAgLnJlcGxhY2UoLycvZywgJyYjeDI3OycpCiAgICAgICAgLnJlcGxhY2UoL1wvL2csICcmI3gyRjsnKTsKICAgIH0KCiAgICAvLyBVUkwgc2FuaXRpemF0aW9uIGZ1bmN0aW9uIHRvIHByZXZlbnQgamF2YXNjcmlwdDogYW5kIGRhdGE6IFVSTHMKICAgIGZ1bmN0aW9uIHNhbml0aXplVXJsKHVybCkgewogICAgICBpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHJldHVybiAnJzsKICAgICAgY29uc3QgdHJpbW1lZFVybCA9IHVybC50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgICAgaWYgKHRyaW1tZWRVcmwuc3RhcnRzV2l0aCgnamF2YXNjcmlwdDonKSB8fCB0cmltbWVkVXJsLnN0YXJ0c1dpdGgoJ2RhdGE6JykgfHwgdHJpbW1lZFVybC5zdGFydHNXaXRoKCd2YnNjcmlwdDonKSkgewogICAgICAgIHJldHVybiAnIyc7CiAgICAgIH0KICAgICAgcmV0dXJuIHVybDsKICAgIH0KCiAgICBjb25zdCBnZXRCcm93c2VyTGFuZ3VhZ2UgPSAoKSA9PiB7CiAgICAgIGlmICghd2luZG93Py5uYXZpZ2F0b3I/Lmxhbmd1YWdlPy5zcGxpdCgnLScpWzFdKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdz8ubmF2aWdhdG9yPy5sYW5ndWFnZT8udG9VcHBlckNhc2UoKTsKICAgICAgfQogICAgICByZXR1cm4gd2luZG93Py5uYXZpZ2F0b3I/Lmxhbmd1YWdlPy5zcGxpdCgnLScpWzFdOwogICAgfTsKCiAgICAKICAgIGZ1bmN0aW9uIGdldERlZmF1bHRDb3VudHJ5UHJvZ3JhbShkZWZhdWx0Q291bnRyeUNvZGUsIHNtc1Byb2dyYW1EYXRhKSB7CiAgICAgIGlmICghc21zUHJvZ3JhbURhdGEgfHwgc21zUHJvZ3JhbURhdGEubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIGNvbnN0IGJyb3dzZXJMYW5ndWFnZSA9IGdldEJyb3dzZXJMYW5ndWFnZSgpOwoKICAgICAgaWYgKGJyb3dzZXJMYW5ndWFnZSkgewogICAgICAgIGNvbnN0IGZvdW5kUHJvZ3JhbSA9IHNtc1Byb2dyYW1EYXRhLmZpbmQoCiAgICAgICAgICAocHJvZ3JhbSkgPT4gcHJvZ3JhbT8uY291bnRyeUNvZGUgPT09IGJyb3dzZXJMYW5ndWFnZSwKICAgICAgICApOwogICAgICAgIGlmIChmb3VuZFByb2dyYW0pIHsKICAgICAgICAgIHJldHVybiBmb3VuZFByb2dyYW07CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoZGVmYXVsdENvdW50cnlDb2RlKSB7CiAgICAgICAgY29uc3QgZm91bmRQcm9ncmFtID0gc21zUHJvZ3JhbURhdGEuZmluZCgKICAgICAgICAgIChwcm9ncmFtKSA9PiBwcm9ncmFtPy5jb3VudHJ5Q29kZSA9PT0gZGVmYXVsdENvdW50cnlDb2RlLAogICAgICAgICk7CiAgICAgICAgaWYgKGZvdW5kUHJvZ3JhbSkgewogICAgICAgICAgcmV0dXJuIGZvdW5kUHJvZ3JhbTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBzbXNQcm9ncmFtRGF0YVswXTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVTbXNMZWdhbFRleHQoY291bnRyeUNvZGUsIGZpZWxkTmFtZSkgewogICAgICBpZiAoIWNvdW50cnlDb2RlIHx8ICFmaWVsZE5hbWUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgCiAgICAgIGNvbnN0IHByb2dyYW1zID0gd2luZG93Py5NQz8uc21zUGhvbmVEYXRhPy5wcm9ncmFtczsKICAgICAgaWYgKCFwcm9ncmFtcyB8fCAhQXJyYXkuaXNBcnJheShwcm9ncmFtcykpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgCiAgICAgIGNvbnN0IHByb2dyYW0gPSBwcm9ncmFtcy5maW5kKHByb2dyYW0gPT4gcHJvZ3JhbT8uY291bnRyeUNvZGUgPT09IGNvdW50cnlDb2RlKTsKICAgICAgaWYgKCFwcm9ncmFtIHx8ICFwcm9ncmFtLnJlcXVpcmVkVGVtcGxhdGUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIAogICAgICAKICAgICAgdmFyIHNtc0NvbnNlbnRIdG1sUmVuZGVyaW5nRml4RW5hYmxlZCA9IHRydWU7CiAgICAgIAogICAgICBjb25zdCBsZWdhbFRleHRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2xlZ2FsLXRleHQtJyArIGZpZWxkTmFtZSk7CiAgICAgIGlmICghbGVnYWxUZXh0RWxlbWVudCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAKICAgICAgY29uc3QgZGl2UmVnZXggPSBuZXcgUmVnRXhwKCc8Lz9bZGl2XVtePl0qPicsICdnaScpOwogICAgICBjb25zdCBibG9ja1dyYXBwZXJSZWdleCA9IG5ldyBSZWdFeHAoJzwvPyg/OmRpdnxwKVtePl0qPicsICdnaScpOwogICAgICBjb25zdCBmdWxsQW5jaG9yUmVnZXggPSBuZXcgUmVnRXhwKCc8YS4qPzwvYT4nLCAnZycpOwogICAgICBjb25zdCBhbmNob3JSZWdleCA9IG5ldyBSZWdFeHAoJzxhIGhyZWY9IiguKj8pIiB0YXJnZXQ9IiguKj8pIj4oLio/KTwvYT4nKTsKICAgICAgCiAgICAgIGNvbnN0IHRlbXBsYXRlID0gc21zQ29uc2VudEh0bWxSZW5kZXJpbmdGaXhFbmFibGVkCiAgICAgICAgPyBwcm9ncmFtLnJlcXVpcmVkVGVtcGxhdGUKICAgICAgICAgICAgLnJlcGxhY2UoLzxcL3A+XHMqPHBbXj5dKj4vZ2ksICcgJykKICAgICAgICAgICAgLnJlcGxhY2UoYmxvY2tXcmFwcGVyUmVnZXgsICcnKQogICAgICAgIDogcHJvZ3JhbS5yZXF1aXJlZFRlbXBsYXRlLnJlcGxhY2UoZGl2UmVnZXgsICcnKTsKICAgICAgCiAgICAgIAoKICAgICAgbGVnYWxUZXh0RWxlbWVudC50ZXh0Q29udGVudCA9ICcnOwogICAgICBjb25zdCBwYXJ0cyA9IHRlbXBsYXRlLnNwbGl0KC8oPGEgaHJlZj0iLio/IiB0YXJnZXQ9Ii4qPyI+Lio/PFwvYT4pL2cpOwogICAgICBwYXJ0cy5mb3JFYWNoKGZ1bmN0aW9uKHBhcnQpIHsKICAgICAgICBpZiAoIXBhcnQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgYW5jaG9yTWF0Y2ggPSBwYXJ0Lm1hdGNoKC88YSBocmVmPSIoLio/KSIgdGFyZ2V0PSIoLio/KSI+KC4qPyk8XC9hPi8pOwogICAgICAgIGlmIChhbmNob3JNYXRjaCkgewogICAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gc2FuaXRpemVVcmwoYW5jaG9yTWF0Y2hbMV0pOwogICAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gc2FuaXRpemVIdG1sKGFuY2hvck1hdGNoWzJdKTsKICAgICAgICAgIGxpbmtFbGVtZW50LnRleHRDb250ZW50ID0gc2FuaXRpemVIdG1sKGFuY2hvck1hdGNoWzNdKTsKICAgICAgICAgIGxlZ2FsVGV4dEVsZW1lbnQuYXBwZW5kQ2hpbGQobGlua0VsZW1lbnQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsZWdhbFRleHRFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBhcnQpKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICAgICAgCiAgICB9CgogICAgZnVuY3Rpb24gZ2VuZXJhdGVEcm9wZG93bk9wdGlvbnMoc21zUHJvZ3JhbURhdGEpIHsKICAgICAgaWYgKCFzbXNQcm9ncmFtRGF0YSB8fCBzbXNQcm9ncmFtRGF0YS5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gJyc7CiAgICAgIH0KCiAgICAgIHZhciBwcm9ncmFtcyA9IGZhbHNlCiAgICAgICAgPyBzbXNQcm9ncmFtRGF0YS5maWx0ZXIoZnVuY3Rpb24ocCwgaSwgYXJyKSB7CiAgICAgICAgICAgIHJldHVybiBhcnIuZmluZEluZGV4KGZ1bmN0aW9uKHEpIHsgcmV0dXJuIHEuY291bnRyeUNvZGUgPT09IHAuY291bnRyeUNvZGU7IH0pID09PSBpOwogICAgICAgICAgfSkKICAgICAgICA6IHNtc1Byb2dyYW1EYXRhOwogICAgICAKICAgICAgcmV0dXJuIHByb2dyYW1zLm1hcChwcm9ncmFtID0+IHsKICAgICAgICBjb25zdCBmbGFnID0gZ2V0Q291bnRyeVVuaWNvZGVGbGFnKHByb2dyYW0uY291bnRyeUNvZGUpOwogICAgICAgIGNvbnN0IGNvdW50cnlOYW1lID0gZ2V0Q291bnRyeU5hbWUocHJvZ3JhbS5jb3VudHJ5Q29kZSk7CiAgICAgICAgY29uc3QgY2FsbGluZ0NvZGUgPSBwcm9ncmFtLmNvdW50cnlDYWxsaW5nQ29kZSB8fCAnJzsKICAgICAgICAvLyBTYW5pdGl6ZSBhbGwgdmFsdWVzIHRvIHByZXZlbnQgWFNTCiAgICAgICAgY29uc3Qgc2FuaXRpemVkQ291bnRyeUNvZGUgPSBzYW5pdGl6ZUh0bWwocHJvZ3JhbS5jb3VudHJ5Q29kZSB8fCAnJyk7CiAgICAgICAgY29uc3Qgc2FuaXRpemVkQ291bnRyeU5hbWUgPSBzYW5pdGl6ZUh0bWwoY291bnRyeU5hbWUgfHwgJycpOwogICAgICAgIGNvbnN0IHNhbml0aXplZENhbGxpbmdDb2RlID0gc2FuaXRpemVIdG1sKGNhbGxpbmdDb2RlIHx8ICcnKTsKICAgICAgICByZXR1cm4gJzxvcHRpb24gdmFsdWU9IicgKyBzYW5pdGl6ZWRDb3VudHJ5Q29kZSArICciPicgKyBzYW5pdGl6ZWRDb3VudHJ5TmFtZSArICcgJyArIHNhbml0aXplZENhbGxpbmdDb2RlICsgJzwvb3B0aW9uPic7CiAgICAgIH0pLmpvaW4oJycpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldENvdW50cnlOYW1lKGNvdW50cnlDb2RlKSB7CiAgICAgIGlmICh3aW5kb3cuTUM/LnNtc1Bob25lRGF0YT8uc21zUHJvZ3JhbURhdGFDb3VudHJ5TmFtZXMgJiYgQXJyYXkuaXNBcnJheSh3aW5kb3cuTUMuc21zUGhvbmVEYXRhLnNtc1Byb2dyYW1EYXRhQ291bnRyeU5hbWVzKSkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2luZG93Lk1DLnNtc1Bob25lRGF0YS5zbXNQcm9ncmFtRGF0YUNvdW50cnlOYW1lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKHdpbmRvdy5NQy5zbXNQaG9uZURhdGEuc21zUHJvZ3JhbURhdGFDb3VudHJ5TmFtZXNbaV0uY29kZSA9PT0gY291bnRyeUNvZGUpIHsKICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5NQy5zbXNQaG9uZURhdGEuc21zUHJvZ3JhbURhdGFDb3VudHJ5TmFtZXNbaV0ubmFtZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGNvdW50cnlDb2RlOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldERlZmF1bHRQbGFjZWhvbGRlcihjb3VudHJ5Q29kZSkgewogICAgICBpZiAoIWNvdW50cnlDb2RlIHx8IHR5cGVvZiBjb3VudHJ5Q29kZSAhPT0gJ3N0cmluZycpIHsKICAgICAgICByZXR1cm4gJysxIDAwMCAwMDAgMDAwMCc7IC8vIERlZmF1bHQgVVMgcGxhY2Vob2xkZXIKICAgICAgfQogICAgICAKICAgICAgICAgICAgdmFyIG1vY2tQbGFjZWhvbGRlcnMgPSBbCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdVUycsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJysxIDAwMCAwMDAgMDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0luY2x1ZGUgdGhlIFVTIGNvdW50cnkgY29kZSArMSBiZWZvcmUgdGhlIHBob25lIG51bWJlcicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0dCJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzQ0IDAwMDAgMDAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnSW5jbHVkZSB0aGUgR0IgY291bnRyeSBjb2RlICs0NCBiZWZvcmUgdGhlIHBob25lIG51bWJlcicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0NBJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzEgMDAwIDAwMCAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnSW5jbHVkZSB0aGUgQ0EgY291bnRyeSBjb2RlICsxIGJlZm9yZSB0aGUgcGhvbmUgbnVtYmVyJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnQVUnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrNjEgMDAwIDAwMCAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdWRlIHRoZSBBVSBjb3VudHJ5IGNvZGUgKzYxIGJlZm9yZSB0aGUgcGhvbmUgbnVtYmVyJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnREUnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrNDkgMDAwIDAwMDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdGw7xnZW4gU2llIHZvciBkZXIgVGVsZWZvbm51bW1lciBkaWUgREUtTMOkbmRlcnZvcndhaGwgKzQ5IGVpbicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0ZSJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzMzIDAgMDAgMDAgMDAgMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdWV6IGxlIGNvZGUgcGF5cyBGUiArMzMgYXZhbnQgbGUgbnVtw6lybyBkZSB0w6lsw6lwaG9uZScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0VTJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzM0IDAwMCAwMDAgMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnSW5jbHV5YSBlbCBjw7NkaWdvIGRlIHBhw61zIEVTICszNCBhbnRlcyBkZWwgbsO6bWVybyBkZSB0ZWzDqWZvbm8nLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdOTCcsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJyszMSAwIDAwMDAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnVm9lZyBkZSBOTC1sYW5kY29kZSArMzEgdG9lIHbDs8OzciBoZXQgdGVsZWZvb25udW1tZXInLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdCRScsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJyszMiAwMDAgMDAgMDAgMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdWV6IGxlIGNvZGUgcGF5cyBCRSArMzIgYXZhbnQgbGUgbnVtw6lybyBkZSB0w6lsw6lwaG9uZScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0NIJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzQxIDAwIDAwMCAwMCAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0bDvGdlbiBTaWUgdm9yIGRlciBUZWxlZm9ubnVtbWVyIGRpZSBDSC1Mw6RuZGVydm9yd2FobCArNDEgZWluJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnQVQnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrNDMgMDAwIDAwMCAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnRsO8Z2VuIFNpZSB2b3IgZGVyIFRlbGVmb25udW1tZXIgZGllIEFULUzDpG5kZXJ2b3J3YWhsICs0MyBlaW4nLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdJRScsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJyszNTMgMDAgMDAwIDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdWRlIHRoZSBJRSBjb3VudHJ5IGNvZGUgKzM1MyBiZWZvcmUgdGhlIHBob25lIG51bWJlcicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0lUJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzM5IDAwMCAwMDAgMDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0luY2x1ZGVyZSBpbCBwcmVmaXNzbyBpbnRlcm5hemlvbmFsZSBJVCArMzkgcHJpbWEgZGVsIG51bWVybyBkaSB0ZWxlZm9ubycsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ05PJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzQ3IDAwMCAwMCAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmtsdWRlciBOTyBsYW5kc2tvZGUgKzQ3IGbDuHIgdGVsZWZvbm51bW1lcmV0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnU0UnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrNDYgMDAgMDAwIDAwIDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnSW5rbHVkZXJhIFNFIGxhbmRza29kICs0NiBmw7ZyZSB0ZWxlZm9ubnVtcmV0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnREsnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrNDUgMDAgMDAgMDAgMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmtsdWRlciBESyBsYW5kZWtvZGUgKzQ1IGbDuHIgdGVsZWZvbm51bW1lcmV0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnRkknLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzU4IDAwIDAwMCAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnU2lzw6RsbHl0w6QgRkktbWFha29vZGkgKzM1OCBlbm5lbiBwdWhlbGlubnVtZXJvYScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0VFJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzM3MiAwMDAwIDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdMaXNhZ2UgRUUgcmlpZ2lrb29kICszNzIgdGVsZWZvbmludW1icmkgZXR0ZScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ1BMJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzQ4IDAwMCAwMDAgMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnUG9kYWogbnVtZXIga2llcnVua293eSBQTCArNDggcHJ6ZWQgbnVtZXJlbSB0ZWxlZm9udScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ1NLJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzQyMSAwMDAgMDAwIDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ1ByZWQgdGVsZWbDs25uZSDEjcOtc2xvIHV2ZcSPdGUga8OzZCBrcmFqaW55IFNLICs0MjEnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdMVicsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJyszNzEgMDAwMCAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnSWVrxLxhdWppZXQgTFYgdmFsc3RzIGtvZHUgKzM3MSBwaXJtcyB0xIFscnXFhmEgbnVtdXJhJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnTFQnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzcwIDAwMDAgMDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ8SudHJhdWtpdGUgTFQgxaFhbGllcyBrb2TEhSArMzcwIHByaWXFoSB0ZWxlZm9ubyBudW1lcsSvJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnR1InLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzAgMDAwIDAwMCAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnzqPPhc68z4DOtc+BzrnOu86szrLOtc+EzrUgz4TOv869IM66z4nOtM65zrrPjCDPh8+Oz4HOsc+CIEdSICszMCDPgM+BzrnOvSDOsc+Az4wgz4TOv869IM6xz4HOuc64zrzPjCDPhM63zrvOtc+Gz47Ovc6/z4UnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdQVCcsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJyszNTEgMDAwIDAwMCAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdWEgbyBjw7NkaWdvIGRlIHBhw61zIFBUICszNTEgYW50ZXMgZG8gbsO6bWVybyBkZSB0ZWxlZm9uZScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0hSJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzM4NSAwMCAwMDAgMDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ1VrbGp1xI1pdGUgSFIgcG96aXZuaSBicm9qIGRyxb5hdmUgKzM4NSBwcmlqZSB0ZWxlZm9uc2tvZyBicm9qYScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ1NJJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzM4NiAwMCAwMDAgMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnVmtsanXEjWl0ZSBTSSBrb2RvIGRyxb5hdmUgKzM4NiBwcmVkIHRlbGVmb25za28gxaF0ZXZpbGtvJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnSVMnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzU0IDAwMCAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnTMOhdHR1IElTIGxhbmRzbsO6bWVyICszNTQgZnlsZ2phIMOhIHVuZGFuIHPDrW1hbsO6bWVyaW51JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnTFUnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzUyIDAwMCAwMDAgMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnSW5jbHVleiBsZSBjb2RlIHBheXMgTFUgKzM1MiBhdmFudCBsZSBudW3DqXJvIGRlIHTDqWzDqXBob25lJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnTUMnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzc3IDAwIDAwIDAwIDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnSW5jbHVleiBsZSBjb2RlIHBheXMgTUMgKzM3NyBhdmFudCBsZSBudW3DqXJvIGRlIHTDqWzDqXBob25lJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnQUQnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzc2IDAwMCAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsb2V1IGVsIGNvZGkgZGUgcGHDrXMgQUQgKzM3NiBhYmFucyBkZWwgbsO6bWVybyBkZSB0ZWzDqGZvbicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0pFJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzQ0IDAwMDAgMDAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnSW5jbHVkZSB0aGUgSkUgY291bnRyeSBjb2RlICs0NCBiZWZvcmUgdGhlIHBob25lIG51bWJlcicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0lNJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzQ0IDAwMDAgMDAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnSW5jbHVkZSB0aGUgSU0gY291bnRyeSBjb2RlICs0NCBiZWZvcmUgdGhlIHBob25lIG51bWJlcicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0dHJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzQ0IDAwMDAgMDAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnSW5jbHVkZSB0aGUgR0cgY291bnRyeSBjb2RlICs0NCBiZWZvcmUgdGhlIHBob25lIG51bWJlcicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0FMJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzM1NSAwMCAwMDAgMDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ1DDq3Jmc2hpbmkga29kaW4gZSB2ZW5kaXQgQUwgKzM1NSBwYXJhIG51bXJpdCB0w6sgdGVsZWZvbml0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnU00nLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzc4IDAwMDAgMDAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnSW5jbHVkZXJlIGlsIHByZWZpc3NvIGludGVybmF6aW9uYWxlIFNNICszNzggcHJpbWEgZGVsIG51bWVybyBkaSB0ZWxlZm9ubycsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0ZPJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzI5OCAwMDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmtsdWRlciBGTyBsYW5kZWtvZGUgKzI5OCBmw7hyIHRlbGVmb25udW1tZXJldCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ01UJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzM1NiAwMDAwIDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdWRlIHRoZSBNVCBjb3VudHJ5IGNvZGUgKzM1NiBiZWZvcmUgdGhlIHBob25lIG51bWJlcicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0xJJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzQyMyAwMDAgMDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0bDvGdlbiBTaWUgdm9yIGRlciBUZWxlZm9ubnVtbWVyIGRpZSBMSS1Mw6RuZGVydm9yd2FobCArNDIzIGVpbicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0dJJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzM1MCAwMDAgMDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdWRlIHRoZSBHSSBjb3VudHJ5IGNvZGUgKzM1MCBiZWZvcmUgdGhlIHBob25lIG51bWJlcicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ01EJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzM3MyAwMCAwMDAgMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnSW5jbHVkZcibaSBjb2R1bCBkZSDIm2FyxIMgTUQgKzM3MyDDrm5haW50ZWEgbnVtxINydWx1aSBkZSB0ZWxlZm9uJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnSFUnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzYgMDAgMDAwIDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdBIHRlbGVmb25zesOhbSBlbMWRdHQgYWRqYSBtZWcgYSBIVSBvcnN6w6Fna8OzZG90ICszNicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ05aJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzY0IDAwIDAwMCAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnSW5jbHVkZSB0aGUgTlogY291bnRyeSBjb2RlICs2NCBiZWZvcmUgdGhlIHBob25lIG51bWJlcicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ01FJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzM4MiAwMCAwMDAgMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnVWtsanXEjWl0ZSBNRSBwb3ppdm5pIGJyb2ogZHLFvmF2ZSArMzgyIHByaWplIHRlbGVmb25za29nIGJyb2phJywKICAgICAgICB9LAogICAgICBdOwoKICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZWhvbGRlciA9IG1vY2tQbGFjZWhvbGRlcnMuZmluZChmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgcmV0dXJuIGl0ZW0gJiYgaXRlbS5jb3VudHJ5Q29kZSA9PT0gY291bnRyeUNvZGU7CiAgICAgIH0pOwogICAgICAKICAgICAgcmV0dXJuIHNlbGVjdGVkUGxhY2Vob2xkZXIgPyBzZWxlY3RlZFBsYWNlaG9sZGVyLnBsYWNlaG9sZGVyIDogbW9ja1BsYWNlaG9sZGVyc1swXS5wbGFjZWhvbGRlcjsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVQbGFjZWhvbGRlcihjb3VudHJ5Q29kZSwgZmllbGROYW1lKSB7CiAgICAgIGlmICghY291bnRyeUNvZGUgfHwgIWZpZWxkTmFtZSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAKICAgICAgY29uc3QgcGhvbmVJbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtY2UtJyArIGZpZWxkTmFtZSk7CiAgICAgIGlmICghcGhvbmVJbnB1dCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAKICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBnZXREZWZhdWx0UGxhY2Vob2xkZXIoY291bnRyeUNvZGUpOwogICAgICBpZiAocGxhY2Vob2xkZXIpIHsKICAgICAgICBwaG9uZUlucHV0LnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVDb3VudHJ5Q29kZUluc3RydWN0aW9uKGNvdW50cnlDb2RlLCBmaWVsZE5hbWUpIHsKICAgICAgdXBkYXRlUGxhY2Vob2xkZXIoY291bnRyeUNvZGUsIGZpZWxkTmFtZSk7CiAgICAgIAogICAgfQoKICAgIGZ1bmN0aW9uIGdldERlZmF1bHRIZWxwVGV4dChjb3VudHJ5Q29kZSkgewogICAgICB2YXIgbW9ja1BsYWNlaG9sZGVycyA9IFsKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ1VTJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzEgMDAwIDAwMCAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnSW5jbHVkZSB0aGUgVVMgY291bnRyeSBjb2RlICsxIGJlZm9yZSB0aGUgcGhvbmUgbnVtYmVyJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnR0InLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrNDQgMDAwMCAwMDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdWRlIHRoZSBHQiBjb3VudHJ5IGNvZGUgKzQ0IGJlZm9yZSB0aGUgcGhvbmUgbnVtYmVyJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnQ0EnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMSAwMDAgMDAwIDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdWRlIHRoZSBDQSBjb3VudHJ5IGNvZGUgKzEgYmVmb3JlIHRoZSBwaG9uZSBudW1iZXInLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdBVScsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJys2MSAwMDAgMDAwIDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0luY2x1ZGUgdGhlIEFVIGNvdW50cnkgY29kZSArNjEgYmVmb3JlIHRoZSBwaG9uZSBudW1iZXInLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdERScsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJys0OSAwMDAgMDAwMDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0bDvGdlbiBTaWUgdm9yIGRlciBUZWxlZm9ubnVtbWVyIGRpZSBERS1Mw6RuZGVydm9yd2FobCArNDkgZWluJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnRlInLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzMgMCAwMCAwMCAwMCAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0luY2x1ZXogbGUgY29kZSBwYXlzIEZSICszMyBhdmFudCBsZSBudW3DqXJvIGRlIHTDqWzDqXBob25lJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnRVMnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzQgMDAwIDAwMCAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdXlhIGVsIGPDs2RpZ28gZGUgcGHDrXMgRVMgKzM0IGFudGVzIGRlbCBuw7ptZXJvIGRlIHRlbMOpZm9ubycsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ05MJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzMxIDAgMDAwMDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdWb2VnIGRlIE5MLWxhbmRjb2RlICszMSB0b2UgdsOzw7NyIGhldCB0ZWxlZm9vbm51bW1lcicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0JFJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzMyIDAwMCAwMCAwMCAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0luY2x1ZXogbGUgY29kZSBwYXlzIEJFICszMiBhdmFudCBsZSBudW3DqXJvIGRlIHTDqWzDqXBob25lJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnQ0gnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrNDEgMDAgMDAwIDAwIDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnRsO8Z2VuIFNpZSB2b3IgZGVyIFRlbGVmb25udW1tZXIgZGllIENILUzDpG5kZXJ2b3J3YWhsICs0MSBlaW4nLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdBVCcsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJys0MyAwMDAgMDAwIDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdGw7xnZW4gU2llIHZvciBkZXIgVGVsZWZvbm51bW1lciBkaWUgQVQtTMOkbmRlcnZvcndhaGwgKzQzIGVpbicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0lFJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzM1MyAwMCAwMDAgMDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0luY2x1ZGUgdGhlIElFIGNvdW50cnkgY29kZSArMzUzIGJlZm9yZSB0aGUgcGhvbmUgbnVtYmVyJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnSVQnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzkgMDAwIDAwMCAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnSW5jbHVkZXJlIGlsIHByZWZpc3NvIGludGVybmF6aW9uYWxlIElUICszOSBwcmltYSBkZWwgbnVtZXJvIGRpIHRlbGVmb25vJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnTk8nLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrNDcgMDAwIDAwIDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0lua2x1ZGVyIE5PIGxhbmRza29kZSArNDcgZsO4ciB0ZWxlZm9ubnVtbWVyZXQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdTRScsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJys0NiAwMCAwMDAgMDAgMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmtsdWRlcmEgU0UgbGFuZHNrb2QgKzQ2IGbDtnJlIHRlbGVmb25udW1yZXQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdESycsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJys0NSAwMCAwMCAwMCAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0lua2x1ZGVyIERLIGxhbmRla29kZSArNDUgZsO4ciB0ZWxlZm9ubnVtbWVyZXQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdGSScsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJyszNTggMDAgMDAwIDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdTaXPDpGxseXTDpCBGSS1tYWFrb29kaSArMzU4IGVubmVuIHB1aGVsaW5udW1lcm9hJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnRUUnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzcyIDAwMDAgMDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0xpc2FnZSBFRSByaWlnaWtvb2QgKzM3MiB0ZWxlZm9uaW51bWJyaSBldHRlJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnUEwnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrNDggMDAwIDAwMCAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdQb2RhaiBudW1lciBraWVydW5rb3d5IFBMICs0OCBwcnplZCBudW1lcmVtIHRlbGVmb251JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnU0snLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrNDIxIDAwMCAwMDAgMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnUHJlZCB0ZWxlZsOzbm5lIMSNw61zbG8gdXZlxI90ZSBrw7NkIGtyYWppbnkgU0sgKzQyMScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ0xWJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzM3MSAwMDAwIDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJZWvEvGF1amlldCBMViB2YWxzdHMga29kdSArMzcxIHBpcm1zIHTEgWxydcWGYSBudW11cmEnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdMVCcsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJyszNzAgMDAwMCAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnxK50cmF1a2l0ZSBMVCDFoWFsaWVzIGtvZMSFICszNzAgcHJpZcWhIHRlbGVmb25vIG51bWVyxK8nLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdHUicsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJyszMCAwMDAgMDAwIDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICfOo8+FzrzPgM61z4HOuc67zqzOss61z4TOtSDPhM6/zr0gzrrPic60zrnOus+MIM+Hz47Pgc6xz4IgR1IgKzMwIM+Az4HOuc69IM6xz4DPjCDPhM6/zr0gzrHPgc65zrjOvM+MIM+EzrfOu861z4bPjs69zr/PhScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBjb3VudHJ5Q29kZTogJ1BUJywKICAgICAgICAgIHBsYWNlaG9sZGVyOiAnKzM1MSAwMDAgMDAwIDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0luY2x1YSBvIGPDs2RpZ28gZGUgcGHDrXMgUFQgKzM1MSBhbnRlcyBkbyBuw7ptZXJvIGRlIHRlbGVmb25lJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnSFInLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzg1IDAwIDAwMCAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnVWtsanXEjWl0ZSBIUiBwb3ppdm5pIGJyb2ogZHLFvmF2ZSArMzg1IHByaWplIHRlbGVmb25za29nIGJyb2phJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnU0knLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzg2IDAwIDAwMCAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdWa2xqdcSNaXRlIFNJIGtvZG8gZHLFvmF2ZSArMzg2IHByZWQgdGVsZWZvbnNrbyDFoXRldmlsa28nLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdJUycsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJyszNTQgMDAwIDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdMw6F0dHUgSVMgbGFuZHNuw7ptZXIgKzM1NCBmeWxnamEgw6EgdW5kYW4gc8OtbWFuw7ptZXJpbnUnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdMVScsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJyszNTIgMDAwIDAwMCAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdWV6IGxlIGNvZGUgcGF5cyBMVSArMzUyIGF2YW50IGxlIG51bcOpcm8gZGUgdMOpbMOpcGhvbmUnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdNQycsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJyszNzcgMDAgMDAgMDAgMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdWV6IGxlIGNvZGUgcGF5cyBNQyArMzc3IGF2YW50IGxlIG51bcOpcm8gZGUgdMOpbMOpcGhvbmUnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdBRCcsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJyszNzYgMDAwIDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0luY2xvZXUgZWwgY29kaSBkZSBwYcOtcyBBRCArMzc2IGFiYW5zIGRlbCBuw7ptZXJvIGRlIHRlbMOoZm9uJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnSkUnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrNDQgMDAwMCAwMDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdWRlIHRoZSBKRSBjb3VudHJ5IGNvZGUgKzQ0IGJlZm9yZSB0aGUgcGhvbmUgbnVtYmVyJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnSU0nLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrNDQgMDAwMCAwMDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdWRlIHRoZSBJTSBjb3VudHJ5IGNvZGUgKzQ0IGJlZm9yZSB0aGUgcGhvbmUgbnVtYmVyJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnR0cnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrNDQgMDAwMCAwMDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdWRlIHRoZSBHRyBjb3VudHJ5IGNvZGUgKzQ0IGJlZm9yZSB0aGUgcGhvbmUgbnVtYmVyJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnQUwnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzU1IDAwIDAwMCAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnUMOrcmZzaGluaSBrb2RpbiBlIHZlbmRpdCBBTCArMzU1IHBhcmEgbnVtcml0IHTDqyB0ZWxlZm9uaXQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdTTScsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJyszNzggMDAwMCAwMDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdWRlcmUgaWwgcHJlZmlzc28gaW50ZXJuYXppb25hbGUgU00gKzM3OCBwcmltYSBkZWwgbnVtZXJvIGRpIHRlbGVmb25vJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnRk8nLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMjk4IDAwMDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0lua2x1ZGVyIEZPIGxhbmRla29kZSArMjk4IGbDuHIgdGVsZWZvbm51bW1lcmV0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnTVQnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzU2IDAwMDAgMDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0luY2x1ZGUgdGhlIE1UIGNvdW50cnkgY29kZSArMzU2IGJlZm9yZSB0aGUgcGhvbmUgbnVtYmVyJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnTEknLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrNDIzIDAwMCAwMDAwJywKICAgICAgICAgIGhlbHBUZXh0OiAnRsO8Z2VuIFNpZSB2b3IgZGVyIFRlbGVmb25udW1tZXIgZGllIExJLUzDpG5kZXJ2b3J3YWhsICs0MjMgZWluJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnR0knLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzUwIDAwMCAwMDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0luY2x1ZGUgdGhlIEdJIGNvdW50cnkgY29kZSArMzUwIGJlZm9yZSB0aGUgcGhvbmUgbnVtYmVyJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnTUQnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzczIDAwIDAwMCAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdWRlyJtpIGNvZHVsIGRlIMibYXLEgyBNRCArMzczIMOubmFpbnRlYSBudW3Eg3J1bHVpIGRlIHRlbGVmb24nLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgY291bnRyeUNvZGU6ICdIVScsCiAgICAgICAgICBwbGFjZWhvbGRlcjogJyszNiAwMCAwMDAgMDAwMCcsCiAgICAgICAgICBoZWxwVGV4dDogJ0EgdGVsZWZvbnN6w6FtIGVsxZF0dCBhZGphIG1lZyBhIEhVIG9yc3rDoWdrw7Nkb3QgKzM2JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnTlonLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrNjQgMDAgMDAwIDAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdJbmNsdWRlIHRoZSBOWiBjb3VudHJ5IGNvZGUgKzY0IGJlZm9yZSB0aGUgcGhvbmUgbnVtYmVyJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGNvdW50cnlDb2RlOiAnTUUnLAogICAgICAgICAgcGxhY2Vob2xkZXI6ICcrMzgyIDAwIDAwMCAwMDAnLAogICAgICAgICAgaGVscFRleHQ6ICdVa2xqdcSNaXRlIE1FIHBveml2bmkgYnJvaiBkcsW+YXZlICszODIgcHJpamUgdGVsZWZvbnNrb2cgYnJvamEnLAogICAgICAgIH0sCiAgICAgIF07CiAgICAgIAogICAgICBpZiAoIWNvdW50cnlDb2RlIHx8IHR5cGVvZiBjb3VudHJ5Q29kZSAhPT0gJ3N0cmluZycpIHsKICAgICAgICByZXR1cm4gbW9ja1BsYWNlaG9sZGVyc1swXS5oZWxwVGV4dDsKICAgICAgfQogICAgICAKICAgICAgY29uc3Qgc2VsZWN0ZWRIZWxwVGV4dCA9IG1vY2tQbGFjZWhvbGRlcnMuZmluZChmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICByZXR1cm4gaXRlbSAmJiBpdGVtLmNvdW50cnlDb2RlID09PSBjb3VudHJ5Q29kZTsKICAgICAgICB9KTsKICAgICAgICAKICAgICAgICByZXR1cm4gc2VsZWN0ZWRIZWxwVGV4dCA/IHNlbGVjdGVkSGVscFRleHQuaGVscFRleHQgOiBtb2NrUGxhY2Vob2xkZXJzWzBdLmhlbHBUZXh0OwogICAgfQoKICAgIGZ1bmN0aW9uIHNldERlZmF1bHRIZWxwVGV4dChjb3VudHJ5Q29kZSkgewogICAgICBjb25zdCBoZWxwVGV4dFNwYW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaGVscC10ZXh0Jyk7CiAgICAgIGlmICghaGVscFRleHRTcGFuKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICAgIAogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUhlbHBUZXh0Q291bnRyeUNvZGUoY291bnRyeUNvZGUsIGZpZWxkTmFtZSkgewogICAgICBpZiAoIWNvdW50cnlDb2RlIHx8ICFmaWVsZE5hbWUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgCiAgICAgIHNldERlZmF1bHRIZWxwVGV4dChjb3VudHJ5Q29kZSk7CiAgICB9CgogICAgZnVuY3Rpb24gaW5pdGlhbGl6ZVNtc1Bob25lRHJvcGRvd24oZmllbGROYW1lKSB7CiAgICAgIGlmICghZmllbGROYW1lIHx8IHR5cGVvZiBmaWVsZE5hbWUgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIAogICAgICBjb25zdCBkcm9wZG93biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb3VudHJ5LXNlbGVjdC0nICsgZmllbGROYW1lKTsKICAgICAgY29uc3QgZGlzcGxheUZsYWcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZmxhZy1kaXNwbGF5LScgKyBmaWVsZE5hbWUpOwogICAgICAKICAgICAgaWYgKCFkcm9wZG93biB8fCAhZGlzcGxheUZsYWcpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGNvbnN0IHNtc1Bob25lRGF0YSA9IHdpbmRvdy5NQz8uc21zUGhvbmVEYXRhOwogICAgICBpZiAoc21zUGhvbmVEYXRhICYmIHNtc1Bob25lRGF0YS5wcm9ncmFtcyAmJiBBcnJheS5pc0FycmF5KHNtc1Bob25lRGF0YS5wcm9ncmFtcykpIHsKICAgICAgICBkcm9wZG93bi5pbm5lckhUTUwgPSBnZW5lcmF0ZURyb3Bkb3duT3B0aW9ucyhzbXNQaG9uZURhdGEucHJvZ3JhbXMpOwogICAgICB9CgogICAgICBjb25zdCBkZWZhdWx0UHJvZ3JhbSA9IGdldERlZmF1bHRDb3VudHJ5UHJvZ3JhbShzbXNQaG9uZURhdGE/LmRlZmF1bHRDb3VudHJ5Q29kZSwgc21zUGhvbmVEYXRhPy5wcm9ncmFtcyk7CiAgICAgIGlmIChkZWZhdWx0UHJvZ3JhbSAmJiBkZWZhdWx0UHJvZ3JhbS5jb3VudHJ5Q29kZSkgewogICAgICAgIGRyb3Bkb3duLnZhbHVlID0gZGVmYXVsdFByb2dyYW0uY291bnRyeUNvZGU7CiAgICAgICAgCiAgICAgICAgY29uc3QgZmxhZ1NwYW4gPSBkaXNwbGF5RmxhZz8ucXVlcnlTZWxlY3RvcignI2ZsYWctZW1vamktJyArIGZpZWxkTmFtZSk7CiAgICAgICAgaWYgKGZsYWdTcGFuKSB7CiAgICAgICAgICBmbGFnU3Bhbi50ZXh0Q29udGVudCA9IGdldENvdW50cnlVbmljb2RlRmxhZyhkZWZhdWx0UHJvZ3JhbS5jb3VudHJ5Q29kZSk7CiAgICAgICAgICBmbGFnU3Bhbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBzYW5pdGl6ZUh0bWwoZGVmYXVsdFByb2dyYW0uY291bnRyeUNvZGUpICsgJyBmbGFnJyk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHVwZGF0ZVNtc0xlZ2FsVGV4dChkZWZhdWx0UHJvZ3JhbS5jb3VudHJ5Q29kZSwgZmllbGROYW1lKTsKICAgICAgICB1cGRhdGVQbGFjZWhvbGRlcihkZWZhdWx0UHJvZ3JhbS5jb3VudHJ5Q29kZSwgZmllbGROYW1lKTsKICAgICAgICB1cGRhdGVDb3VudHJ5Q29kZUluc3RydWN0aW9uKGRlZmF1bHRQcm9ncmFtLmNvdW50cnlDb2RlLCBmaWVsZE5hbWUpOwogICAgICB9CgogICAgIAogICAgICB2YXIgc21zTm90UmVxdWlyZWRSZW1vdmVDb3VudHJ5Q29kZUVuYWJsZWQgPSB0cnVlOwogICAgICB2YXIgc21zRmllbGQgPSBPYmplY3QudmFsdWVzKHsiRU1BSUwiOnsibmFtZSI6IkVNQUlMIiwibGFiZWwiOiJFbWFpbCBBZGRyZXNzIiwiaGVscGVyX3RleHQiOiIiLCJtZXJnZV9pZCI6MCwidHlwZSI6ImVtYWlsIiwicmVxdWlyZWQiOnRydWUsImF1ZGllbmNlX2ZpZWxkX25hbWUiOiJFbWFpbCBBZGRyZXNzIiwiZmllbGRfdHlwZSI6Im1lcmdlIiwiZW5hYmxlZCI6dHJ1ZSwib3JkZXIiOjB9LCJGTkFNRSI6eyJuYW1lIjoiRk5BTUUiLCJsYWJlbCI6IkZpcnN0IE5hbWUiLCJoZWxwZXJfdGV4dCI6IiIsInR5cGUiOiJ0ZXh0IiwicmVxdWlyZWQiOnRydWUsImF1ZGllbmNlX2ZpZWxkX25hbWUiOiJGaXJzdCBOYW1lIiwiZW5hYmxlZCI6dHJ1ZSwib3JkZXIiOjEsImZpZWxkX3R5cGUiOiJtZXJnZSIsIm1lcmdlX2lkIjoxfSwiTE5BTUUiOnsibmFtZSI6IkxOQU1FIiwibGFiZWwiOiJMYXN0IE5hbWUiLCJoZWxwZXJfdGV4dCI6IiIsInR5cGUiOiJ0ZXh0IiwicmVxdWlyZWQiOnRydWUsImF1ZGllbmNlX2ZpZWxkX25hbWUiOiJMYXN0IE5hbWUiLCJlbmFibGVkIjp0cnVlLCJvcmRlciI6MiwiZmllbGRfdHlwZSI6Im1lcmdlIiwibWVyZ2VfaWQiOjJ9fSkuZmluZChmdW5jdGlvbihmKSB7IHJldHVybiBmLm5hbWUgPT09IGZpZWxkTmFtZSAmJiBmLnR5cGUgPT09ICdzbXNwaG9uZSc7IH0pOwogICAgICB2YXIgaXNSZXF1aXJlZCA9IHNtc0ZpZWxkID8gc21zRmllbGQucmVxdWlyZWQgOiBmYWxzZTsKICAgICAgdmFyIHNob3VsZEFwcGVuZENvdW50cnlDb2RlID0gc21zTm90UmVxdWlyZWRSZW1vdmVDb3VudHJ5Q29kZUVuYWJsZWQgPyBpc1JlcXVpcmVkIDogdHJ1ZTsKICAgICAgCiAgICAgIHZhciBwaG9uZUlucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21jZS0nICsgZmllbGROYW1lKTsKICAgICAgaWYgKHBob25lSW5wdXQgJiYgZGVmYXVsdFByb2dyYW0uY291bnRyeUNhbGxpbmdDb2RlICYmIHNob3VsZEFwcGVuZENvdW50cnlDb2RlKSB7CiAgICAgICAgcGhvbmVJbnB1dC52YWx1ZSA9IGRlZmF1bHRQcm9ncmFtLmNvdW50cnlDYWxsaW5nQ29kZTsKICAgICAgfQogICAgICAKCgogICAgICBkaXNwbGF5RmxhZz8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgZHJvcGRvd24uZm9jdXMoKTsKICAgICAgfSk7CgoKICAgICAgZHJvcGRvd24/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uKCkgewogICAgICAgIGNvbnN0IHNlbGVjdGVkQ291bnRyeSA9IHRoaXMudmFsdWU7CiAgICAgICAgCiAgICAgICAgaWYgKCFzZWxlY3RlZENvdW50cnkgfHwgdHlwZW9mIHNlbGVjdGVkQ291bnRyeSAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgZmxhZ1NwYW4gPSBkaXNwbGF5RmxhZz8ucXVlcnlTZWxlY3RvcignI2ZsYWctZW1vamktJyArIGZpZWxkTmFtZSk7CiAgICAgICAgaWYgKGZsYWdTcGFuKSB7CiAgICAgICAgICBmbGFnU3Bhbi50ZXh0Q29udGVudCA9IGdldENvdW50cnlVbmljb2RlRmxhZyhzZWxlY3RlZENvdW50cnkpOwogICAgICAgICAgZmxhZ1NwYW4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgc2FuaXRpemVIdG1sKHNlbGVjdGVkQ291bnRyeSkgKyAnIGZsYWcnKTsKICAgICAgICB9CgogICAgICAgICAKICAgICAgICBjb25zdCBzZWxlY3RlZFByb2dyYW0gPSB3aW5kb3cuTUM/LnNtc1Bob25lRGF0YT8ucHJvZ3JhbXMuZmluZChmdW5jdGlvbihwcm9ncmFtKSB7CiAgICAgICAgICByZXR1cm4gcHJvZ3JhbSAmJiBwcm9ncmFtLmNvdW50cnlDb2RlID09PSBzZWxlY3RlZENvdW50cnk7CiAgICAgICAgfSk7CgogICAgICAgIHZhciBzbXNOb3RSZXF1aXJlZFJlbW92ZUNvdW50cnlDb2RlRW5hYmxlZCA9IHRydWU7CiAgICAgICAgdmFyIHNtc0ZpZWxkID0gT2JqZWN0LnZhbHVlcyh7IkVNQUlMIjp7Im5hbWUiOiJFTUFJTCIsImxhYmVsIjoiRW1haWwgQWRkcmVzcyIsImhlbHBlcl90ZXh0IjoiIiwibWVyZ2VfaWQiOjAsInR5cGUiOiJlbWFpbCIsInJlcXVpcmVkIjp0cnVlLCJhdWRpZW5jZV9maWVsZF9uYW1lIjoiRW1haWwgQWRkcmVzcyIsImZpZWxkX3R5cGUiOiJtZXJnZSIsImVuYWJsZWQiOnRydWUsIm9yZGVyIjowfSwiRk5BTUUiOnsibmFtZSI6IkZOQU1FIiwibGFiZWwiOiJGaXJzdCBOYW1lIiwiaGVscGVyX3RleHQiOiIiLCJ0eXBlIjoidGV4dCIsInJlcXVpcmVkIjp0cnVlLCJhdWRpZW5jZV9maWVsZF9uYW1lIjoiRmlyc3QgTmFtZSIsImVuYWJsZWQiOnRydWUsIm9yZGVyIjoxLCJmaWVsZF90eXBlIjoibWVyZ2UiLCJtZXJnZV9pZCI6MX0sIkxOQU1FIjp7Im5hbWUiOiJMTkFNRSIsImxhYmVsIjoiTGFzdCBOYW1lIiwiaGVscGVyX3RleHQiOiIiLCJ0eXBlIjoidGV4dCIsInJlcXVpcmVkIjp0cnVlLCJhdWRpZW5jZV9maWVsZF9uYW1lIjoiTGFzdCBOYW1lIiwiZW5hYmxlZCI6dHJ1ZSwib3JkZXIiOjIsImZpZWxkX3R5cGUiOiJtZXJnZSIsIm1lcmdlX2lkIjoyfX0pLmZpbmQoZnVuY3Rpb24oZikgeyByZXR1cm4gZi5uYW1lID09PSBmaWVsZE5hbWUgJiYgZi50eXBlID09PSAnc21zcGhvbmUnOyB9KTsKICAgICAgICB2YXIgaXNSZXF1aXJlZCA9IHNtc0ZpZWxkID8gc21zRmllbGQucmVxdWlyZWQgOiBmYWxzZTsKICAgICAgICB2YXIgc2hvdWxkQXBwZW5kQ291bnRyeUNvZGUgPSBzbXNOb3RSZXF1aXJlZFJlbW92ZUNvdW50cnlDb2RlRW5hYmxlZCA/IGlzUmVxdWlyZWQgOiB0cnVlOwogICAgICAgIAogICAgICAgIHZhciBwaG9uZUlucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21jZS0nICsgZmllbGROYW1lKTsKICAgICAgICBpZiAocGhvbmVJbnB1dCAmJiBzZWxlY3RlZFByb2dyYW0uY291bnRyeUNhbGxpbmdDb2RlICYmIHNob3VsZEFwcGVuZENvdW50cnlDb2RlKSB7CiAgICAgICAgICBwaG9uZUlucHV0LnZhbHVlID0gc2VsZWN0ZWRQcm9ncmFtLmNvdW50cnlDYWxsaW5nQ29kZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgdXBkYXRlU21zTGVnYWxUZXh0KHNlbGVjdGVkQ291bnRyeSwgZmllbGROYW1lKTsKICAgICAgICB1cGRhdGVQbGFjZWhvbGRlcihzZWxlY3RlZENvdW50cnksIGZpZWxkTmFtZSk7CiAgICAgICAgdXBkYXRlQ291bnRyeUNvZGVJbnN0cnVjdGlvbihzZWxlY3RlZENvdW50cnksIGZpZWxkTmFtZSk7CiAgICAgIH0pOwogICAgfQoKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHsKICAgICAgY29uc3Qgc21zUGhvbmVGaWVsZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRePSJjb3VudHJ5LXNlbGVjdC0iXScpOwogICAgICAKICAgICAgc21zUGhvbmVGaWVsZHMuZm9yRWFjaChmdW5jdGlvbihkcm9wZG93bikgewogICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGRyb3Bkb3duPy5pZC5yZXBsYWNlKCdjb3VudHJ5LXNlbGVjdC0nLCAnJyk7CiAgICAgICAgaW5pdGlhbGl6ZVNtc1Bob25lRHJvcGRvd24oZmllbGROYW1lKTsKICAgICAgfSk7CiAgICB9KTsKICAgIDwvc2NyaXB0PjwvZGl2Pgo=[/cmsmasters_html][/cmsmasters_column][/cmsmasters_row]