├── .gitignore ├── babel.config.json ├── murple_logo.png ├── src ├── assets │ └── img │ │ ├── home.png │ │ ├── user.png │ │ ├── comment.png │ │ ├── reservation.png │ │ ├── icons8-multiply-24.png │ │ └── icons8-menu-rounded-24.png ├── modules │ ├── apiUrls.js │ ├── itemCounter.js │ ├── commentCounter.js │ ├── reservationCounter.js │ ├── domSelector.js │ ├── displayItems.js │ ├── popupComment.js │ └── popupReservation.js ├── index.js ├── Test │ ├── test_item_count.test.js │ ├── test_comments.test.js │ └── test_reservations.test.js ├── index.html └── style.css ├── dist ├── assets │ └── img │ │ ├── user.png │ │ ├── icons8-multiply-24.png │ │ └── icons8-menu-rounded-24.png ├── index.bundle.js.LICENSE.txt ├── index.html ├── runtime.bundle.js ├── index.css └── index.bundle.js ├── .babelrc ├── .hintrc ├── .eslintrc.json ├── .stylelintrc.json ├── LICENSE ├── webpack.config.js ├── package.json ├── .github └── workflows │ └── linters.yml └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | coverage/ -------------------------------------------------------------------------------- /babel.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/preset-env" 4 | ] 5 | } -------------------------------------------------------------------------------- /murple_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/HEAD/murple_logo.png -------------------------------------------------------------------------------- /src/assets/img/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/HEAD/src/assets/img/home.png -------------------------------------------------------------------------------- /src/assets/img/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/HEAD/src/assets/img/user.png -------------------------------------------------------------------------------- /dist/assets/img/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/HEAD/dist/assets/img/user.png -------------------------------------------------------------------------------- /src/assets/img/comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/HEAD/src/assets/img/comment.png -------------------------------------------------------------------------------- /src/assets/img/reservation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/HEAD/src/assets/img/reservation.png -------------------------------------------------------------------------------- /dist/assets/img/icons8-multiply-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/HEAD/dist/assets/img/icons8-multiply-24.png -------------------------------------------------------------------------------- /src/assets/img/icons8-multiply-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/HEAD/src/assets/img/icons8-multiply-24.png -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "test": { 4 | "plugins": ["@babel/plugin-transform-modules-commonjs"] 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /dist/assets/img/icons8-menu-rounded-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/HEAD/dist/assets/img/icons8-menu-rounded-24.png -------------------------------------------------------------------------------- /src/assets/img/icons8-menu-rounded-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raihan2bd/js-capstone/HEAD/src/assets/img/icons8-menu-rounded-24.png -------------------------------------------------------------------------------- /dist/index.bundle.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ 2 | -------------------------------------------------------------------------------- /src/modules/apiUrls.js: -------------------------------------------------------------------------------- 1 | export const BASE_URL = 'https://us-central1-involvement-api.cloudfunctions.net/capstoneApi/apps/Y1Ocl2k5LoJdVEhHia5O'; 2 | export const MOVIE_API = 'https://api.tvmaze.com/seasons/1/episodes'; 3 | -------------------------------------------------------------------------------- /src/modules/itemCounter.js: -------------------------------------------------------------------------------- 1 | const itemCounter = (countContainer, itemContainer) => { 2 | const count = itemContainer.childElementCount; 3 | countContainer.innerText = `(${count})`; 4 | return count; 5 | }; 6 | 7 | export default itemCounter; 8 | -------------------------------------------------------------------------------- /src/modules/commentCounter.js: -------------------------------------------------------------------------------- 1 | const commentCounter = (countContainer, commentContainer) => { 2 | const count = commentContainer.childElementCount; 3 | countContainer.innerText = `(${count})`; 4 | return count; 5 | }; 6 | 7 | export default commentCounter; 8 | -------------------------------------------------------------------------------- /src/modules/reservationCounter.js: -------------------------------------------------------------------------------- 1 | const reservationCounter = (countContainer, reservationContainer) => { 2 | const count = reservationContainer.childElementCount; 3 | countContainer.innerText = `(${count})`; 4 | return count; 5 | }; 6 | 7 | export default reservationCounter; 8 | -------------------------------------------------------------------------------- /.hintrc: -------------------------------------------------------------------------------- 1 | { 2 | "connector": { 3 | "name": "local", 4 | "options": { 5 | "pattern": ["**", "!.git/**", "!node_modules/**"] 6 | } 7 | }, 8 | "extends": ["development"], 9 | "formatters": ["stylish"], 10 | "hints": [ 11 | "button-type", 12 | "disown-opener", 13 | "html-checker", 14 | "meta-charset-utf-8", 15 | "meta-viewport", 16 | "no-inline-styles:error" 17 | ] 18 | } -------------------------------------------------------------------------------- /src/modules/domSelector.js: -------------------------------------------------------------------------------- 1 | export const menuBtn = document.getElementById('mobile-menu'); 2 | export const closeBtn = document.getElementById('cross-menu'); 3 | export const mobileNavlinks = document.querySelectorAll( 4 | '.mobile-nav-group .nav-link', 5 | ); 6 | export const mobNavGroup = document.querySelector('.mobile-nav-group'); 7 | export const modalContainer = document.querySelector('.popup-modal'); 8 | export const listItemsContainer = document.querySelector('.show-group'); 9 | export const itemCountContainer = document.getElementById('count_item'); 10 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es6": true, 5 | "jest": true 6 | }, 7 | "parser": "babel-eslint", 8 | "parserOptions": { 9 | "ecmaVersion": 2018, 10 | "sourceType": "module" 11 | }, 12 | "extends": ["airbnb-base"], 13 | "rules": { 14 | "no-shadow": "off", 15 | "no-param-reassign": "off", 16 | "eol-last": "off", 17 | "import/extensions": [ 1, { 18 | "js": "always", "json": "always" 19 | }] 20 | }, 21 | "ignorePatterns": [ 22 | "dist/", 23 | "build/" 24 | ] 25 | } -------------------------------------------------------------------------------- /.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["stylelint-config-standard"], 3 | "plugins": ["stylelint-scss", "stylelint-csstree-validator"], 4 | "rules": { 5 | "at-rule-no-unknown": [ 6 | true, 7 | { 8 | "ignoreAtRules": ["tailwind", "apply", "variants", "responsive", "screen"] 9 | } 10 | ], 11 | "scss/at-rule-no-unknown": [ 12 | true, 13 | { 14 | "ignoreAtRules": ["tailwind", "apply", "variants", "responsive", "screen"] 15 | } 16 | ], 17 | "csstree/validator": true 18 | }, 19 | "ignoreFiles": ["build/**", "dist/**", "**/reset*.css", "**/bootstrap*.css", "**/*.js", "**/*.jsx"] 20 | } -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | // import static files 2 | import './style.css'; 3 | import './assets/img/icons8-menu-rounded-24.png'; 4 | import './assets/img/icons8-multiply-24.png'; 5 | import './assets/img/user.png'; 6 | 7 | import fetchTvShow from './modules/displayItems.js'; 8 | import { 9 | closeBtn, 10 | menuBtn, 11 | mobNavGroup, 12 | mobileNavlinks, 13 | } from './modules/domSelector.js'; 14 | 15 | // toggle the menu 16 | menuBtn.addEventListener('click', () => { 17 | mobNavGroup.classList.toggle('display-flex'); 18 | }); 19 | 20 | closeBtn.addEventListener('click', () => { 21 | mobNavGroup.classList.remove('display-flex'); 22 | }); 23 | 24 | mobileNavlinks.forEach((item) => { 25 | item.addEventListener('click', () => { 26 | mobNavGroup.classList.remove('display-flex'); 27 | }); 28 | }); 29 | 30 | // load the item list on the fly. 31 | window.onload = () => { 32 | fetchTvShow(); 33 | }; 34 | -------------------------------------------------------------------------------- /src/Test/test_item_count.test.js: -------------------------------------------------------------------------------- 1 | import itemCounter from '../modules/itemCounter.js'; 2 | 3 | describe('Test Display Item counter', () => { 4 | document.body.innerHTML = ` 5 |
6 |
74 |
75 |
(back to top)
81 |
82 |
83 | ## 💻 Getting Started
84 |
85 | >Please follow the instructions to clone the repo
86 | To get a local copy, follow these simple example steps.
87 | Clone this repository or download the Zip folder:
88 |
89 | ### Prerequisites
90 |
91 | >In order to check the linters errors make sure you have installed the [nodejs](https://nodejs.org)
92 |
93 |
94 | ### Setup
95 |
96 | >Clone this repository to your desired folder: cd [folder] to navigate and run the below comand to clone the project
97 |
98 | ```sh
99 | git clone https://github.com/raihan2bd/js-capstone.git
100 | ```
101 |
102 |
103 | ### Install
104 |
105 | Install this project with:
106 |
107 | download npm the packages
108 | ```sh
109 | npm install --save-dev
110 | ```
111 |
112 | ### Usage
113 |
114 | > To see the project in your local browser first of all, go to the dist folder then open the index.html file.
115 |
116 |
117 |
118 |
119 |
120 |
121 | ## 👥 Author
122 |
123 |
124 |
125 | 👤 **Abu Raihan**
126 |
127 | - GitHub: [@githubhandle](https://github.com/githubhandle)
128 | - Twitter: [@twitterhandle](https://twitter.com/raihan2bd)
129 | - LinkedIn: [LinkedIn](https://linkedin.com/in/raihan2bd)
130 |
131 | 👤 **Salwa Ballouti**
132 |
133 | - GitHub: [@githubhandle](https://github.com/Salwa99)
134 | - Twitter: [@twitterhandle](https://twitter.com/salwa-ballouti)
135 | - LinkedIn: [LinkedIn](https://linkedin.com/in/salwa-ballouti)
136 |
137 | 👤 **Lugard Agu**
138 |
139 | - GitHub: [@githubhandle](https://github.com/lugard1)
140 | - Twitter: [@twitterhandle](https://twitter.com/Dsn3kings)
141 | - LinkedIn: [LinkedIn](https://www.linkedin.com/in/lugard-agu-45bb05b6/)
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 | ## How to access the database?
150 |
151 | - It's not available for now I'm still working on it, once it's available I'll update this answer.
152 |
153 |
154 |
155 | ## 🤝 Contributing
156 |
157 | Contributions, issues, and feature requests are welcome!
158 |
159 | Feel free to check the [issues page](../../issues/).
160 |
161 |
162 |
163 |
164 | ## ⭐️ Show your support
165 |
166 | > Give a ⭐️ if you like this project!
167 |
168 |
169 |
170 |
171 |
172 | ## 🙏 Acknowledgments
173 |
174 | > Without Microverse Help this project not compleated at all so thanks a lot Microverse for giving us this kind of opertunity.
175 |
176 |
177 |
178 |
179 |
180 |
181 | ## 📝 License
182 |
183 | This project is [MIT](./LICENSE) licensed.
184 |
185 |
186 |
--------------------------------------------------------------------------------
/src/modules/displayItems.js:
--------------------------------------------------------------------------------
1 | import { itemCountContainer, listItemsContainer } from './domSelector.js';
2 | import fetchSingleShowComment from './popupComment.js';
3 | import fetchSingleShow from './popupReservation.js';
4 | import { BASE_URL, MOVIE_API } from './apiUrls.js';
5 | import itemCounter from './itemCounter.js';
6 |
7 | // createNew like
8 | const createNewLike = async (id, likeCount, btnLike) => {
9 | btnLike.setAttribute('disabled', '');
10 | const response = await fetch(`${BASE_URL}/likes`, {
11 | method: 'POST',
12 | headers: {
13 | 'Content-Type': 'application/json',
14 | },
15 | body: JSON.stringify({ item_id: id }),
16 | });
17 |
18 | if (!response.ok && response.status !== 201) {
19 | return;
20 | }
21 |
22 | const responseLikes = await fetch(`${BASE_URL}/likes`);
23 | const result = await responseLikes.json();
24 | const likeData = result.find((item) => item.item_id === id);
25 | if (likeData) {
26 | likeCount.innerText = likeData.likes > 1 ? `${likeData.likes} likes` : `${likeData.likes} like`;
27 | btnLike.innerHTML = `
28 |
29 | `;
36 | }
37 | };
38 |
39 | // render the item list
40 | const render = (data) => {
41 | if (data.length > 0) {
42 | listItemsContainer.innerHTML = '';
43 |
44 | data.forEach((i) => {
45 | const item = document.createElement('li');
46 | item.id = i.id;
47 | item.className = 'show-item';
48 |
49 | // create sho Img element
50 | const showImg = document.createElement('div');
51 | showImg.className = 'show-item-img';
52 | showImg.innerHTML = `No Data Found
'; 128 | } 129 | }; 130 | 131 | const fetchTvShows = async () => { 132 | const response = await fetch(MOVIE_API); 133 | const result = await response.json(); 134 | 135 | // call the Involment api to get likes 136 | const responseInvolvement = await fetch(`${BASE_URL}/likes/`); 137 | const likesResult = await responseInvolvement.json(); 138 | 139 | // Distribute likes with correct array. 140 | let joinArr = []; 141 | if (!(likesResult.length <= 0)) { 142 | joinArr = result.map((movieItem) => { 143 | let likes = 0; 144 | const findLikes = likesResult.find((likeItem) => likeItem.item_id === movieItem.id); 145 | if (findLikes) { 146 | likes = findLikes.likes; 147 | } 148 | return { ...movieItem, likes }; 149 | }); 150 | } 151 | 152 | // call render function to display the item list 153 | render(joinArr); 154 | }; 155 | 156 | export default fetchTvShows; 157 | -------------------------------------------------------------------------------- /src/modules/popupComment.js: -------------------------------------------------------------------------------- 1 | import { BASE_URL } from './apiUrls.js'; 2 | import commentCounter from './commentCounter.js'; 3 | import { modalContainer } from './domSelector.js'; 4 | 5 | const createNewComment = async (url, data, commentsContainer, Form) => { 6 | const response = await fetch(url, { 7 | method: 'POST', 8 | headers: { 9 | 'Content-Type': 'application/json', 10 | }, 11 | body: JSON.stringify(data), 12 | }); 13 | 14 | if (!response.ok && response.status !== 201) { 15 | return; 16 | } 17 | 18 | const fetchComUrl = `${BASE_URL}/comments?item_id=${data.item_id}`; 19 | 20 | const commentResponse = await fetch(fetchComUrl); 21 | 22 | const result = await commentResponse.json(); 23 | 24 | // manupulate the dom 25 | const commentTite = document.createElement('div'); 26 | commentTite.className = 'comment-title'; 27 | const commentHeader = document.createElement('h3'); 28 | commentHeader.className = 'comment-header'; 29 | commentHeader.innerHTML = 'Comments'; 30 | const commentCount = document.createElement('p'); 31 | commentCount.id = 'show_comment_count'; 32 | commentCount.innerText = 0; 33 | 34 | commentTite.append(commentHeader, commentCount); 35 | 36 | const commentGroup = document.createElement('ul'); 37 | commentGroup.className = 'comment-goup'; 38 | 39 | let commentItems = ''; 40 | 41 | if (result.length > 0) { 42 | result.forEach((item) => { 43 | commentItems += `${item.comment}
52 |${item.comment}
139 |").concat(t.comment,"
\n").concat(t.comment,"
\nNo Data Found
';case 21:case"end":return t.stop()}var p,m,h}),t)})));return function(){return t.apply(this,arguments)}}();r.addEventListener("click",(function(){a.classList.toggle("display-flex")})),o.addEventListener("click",(function(){a.classList.remove("display-flex")})),i.forEach((function(t){t.addEventListener("click",(function(){a.classList.remove("display-flex")}))})),window.onload=function(){Y()}}},t=>{t(t.s=963)}]); 3 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,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aUJBQWlCLFNBQVMsV0FDakN2RCxFQUFZd0QsVUFBVUMsT0FBTyxlQUMvQixJQUVBM0QsRUFBZTRDLFNBQVEsU0FBQ0MsR0FDdEJBLEVBQUtZLGlCQUFpQixTQUFTLFdBQzdCdkQsRUFBWXdELFVBQVVDLE9BQU8sZUFDL0IsR0FDRixJQUdBK0UsT0FBT0MsT0FBUyxXQUNkQyxHQUNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vanMtY2Fwc3RvbmUvLi9zcmMvbW9kdWxlcy9kb21TZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9qcy1jYXBzdG9uZS8uL3NyYy9tb2R1bGVzL2FwaVVybHMuanMiLCJ3ZWJwYWNrOi8vanMtY2Fwc3RvbmUvLi9zcmMvbW9kdWxlcy9jb21tZW50Q291bnRlci5qcyIsIndlYnBhY2s6Ly9qcy1jYXBzdG9uZS8uL3NyYy9tb2R1bGVzL3BvcHVwQ29tbWVudC5qcyIsIndlYnBhY2s6Ly9qcy1jYXBzdG9uZS8uL3NyYy9tb2R1bGVzL3Jlc2VydmF0aW9uQ291bnRlci5qcyIsIndlYnBhY2s6Ly9qcy1jYXBzdG9uZS8uL3NyYy9tb2R1bGVzL3BvcHVwUmVzZXJ2YXRpb24uanMiLCJ3ZWJwYWNrOi8vanMtY2Fwc3RvbmUvLi9zcmMvbW9kdWxlcy9kaXNwbGF5SXRlbXMuanMiLCJ3ZWJwYWNrOi8vanMtY2Fwc3RvbmUvLi9zcmMvbW9kdWxlcy9pdGVtQ291bnRlci5qcyIsIndlYnBhY2s6Ly9qcy1jYXBzdG9uZS8uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgbWVudUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2JpbGUtbWVudScpO1xuZXhwb3J0IGNvbnN0IGNsb3NlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nyb3NzLW1lbnUnKTtcbmV4cG9ydCBjb25zdCBtb2JpbGVOYXZsaW5rcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICcubW9iaWxlLW5hdi1ncm91cCAubmF2LWxpbmsnLFxuKTtcbmV4cG9ydCBjb25zdCBtb2JOYXZHcm91cCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tb2JpbGUtbmF2LWdyb3VwJyk7XG5leHBvcnQgY29uc3QgbW9kYWxDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucG9wdXAtbW9kYWwnKTtcbmV4cG9ydCBjb25zdCBsaXN0SXRlbXNDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2hvdy1ncm91cCcpO1xuZXhwb3J0IGNvbnN0IGl0ZW1Db3VudENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb3VudF9pdGVtJyk7XG4iLCJleHBvcnQgY29uc3QgQkFTRV9VUkwgPSAnaHR0cHM6Ly91cy1jZW50cmFsMS1pbnZvbHZlbWVudC1hcGkuY2xvdWRmdW5jdGlvbnMubmV0L2NhcHN0b25lQXBpL2FwcHMvWTFPY2wyazVMb0pkVkVoSGlhNU8nO1xuZXhwb3J0IGNvbnN0IE1PVklFX0FQSSA9ICdodHRwczovL2FwaS50dm1hemUuY29tL3NlYXNvbnMvMS9lcGlzb2Rlcyc7XG4iLCJjb25zdCBjb21tZW50Q291bnRlciA9IChjb3VudENvbnRhaW5lciwgY29tbWVudENvbnRhaW5lcikgPT4ge1xuICBjb25zdCBjb3VudCA9IGNvbW1lbnRDb250YWluZXIuY2hpbGRFbGVtZW50Q291bnQ7XG4gIGNvdW50Q29udGFpbmVyLmlubmVyVGV4dCA9IGAoJHtjb3VudH0pYDtcbiAgcmV0dXJuIGNvdW50O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWVudENvdW50ZXI7XG4iLCJpbXBvcnQgeyBCQVNFX1VSTCB9IGZyb20gJy4vYXBpVXJscy5qcyc7XG5pbXBvcnQgY29tbWVudENvdW50ZXIgZnJvbSAnLi9jb21tZW50Q291bnRlci5qcyc7XG5pbXBvcnQgeyBtb2RhbENvbnRhaW5lciB9IGZyb20gJy4vZG9tU2VsZWN0b3IuanMnO1xuXG5jb25zdCBjcmVhdGVOZXdDb21tZW50ID0gYXN5bmMgKHVybCwgZGF0YSwgY29tbWVudHNDb250YWluZXIsIEZvcm0pID0+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2sgJiYgcmVzcG9uc2Uuc3RhdHVzICE9PSAyMDEpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBmZXRjaENvbVVybCA9IGAke0JBU0VfVVJMfS9jb21tZW50cz9pdGVtX2lkPSR7ZGF0YS5pdGVtX2lkfWA7XG5cbiAgY29uc3QgY29tbWVudFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZmV0Y2hDb21VcmwpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbW1lbnRSZXNwb25zZS5qc29uKCk7XG5cbiAgLy8gbWFudXB1bGF0ZSB0aGUgZG9tXG4gIGNvbnN0IGNvbW1lbnRUaXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbW1lbnRUaXRlLmNsYXNzTmFtZSA9ICdjb21tZW50LXRpdGxlJztcbiAgY29uc3QgY29tbWVudEhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2gzJyk7XG4gIGNvbW1lbnRIZWFkZXIuY2xhc3NOYW1lID0gJ2NvbW1lbnQtaGVhZGVyJztcbiAgY29tbWVudEhlYWRlci5pbm5lckhUTUwgPSAnQ29tbWVudHMnO1xuICBjb25zdCBjb21tZW50Q291bnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gIGNvbW1lbnRDb3VudC5pZCA9ICdzaG93X2NvbW1lbnRfY291bnQnO1xuICBjb21tZW50Q291bnQuaW5uZXJUZXh0ID0gMDtcblxuICBjb21tZW50VGl0ZS5hcHBlbmQoY29tbWVudEhlYWRlciwgY29tbWVudENvdW50KTtcblxuICBjb25zdCBjb21tZW50R3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICBjb21tZW50R3JvdXAuY2xhc3NOYW1lID0gJ2NvbW1lbnQtZ291cCc7XG5cbiAgbGV0IGNvbW1lbnRJdGVtcyA9ICcnO1xuXG4gIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgIHJlc3VsdC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb21tZW50SXRlbXMgKz0gYDxsaSBjbGFzcz0nY29tbWVudC1pdGVtJz5cbiAgICAgIDxkaXYgY2xhc3M9J3VzZXItaW5mbyc+XG4gICAgICAgIDxkaXYgY2xhc3M9J3VzZXItYXZhdGFyJz5cbiAgICAgICAgICA8aW1nIHNyYz0nLi9hc3NldHMvaW1nL3VzZXIucG5nJyBhbHQ9JyR7aXRlbS51c2VybmFtZX0nLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxoNCBjbGFzcz0ndXNlci1uYW1lJz4ke2l0ZW0udXNlcm5hbWV9PC9oND5cbiAgICAgICAgPHNwYW4gY2xhc3M9J3N1Ym1pdC1kYXRlJz4ke2l0ZW0uY3JlYXRpb25fZGF0ZX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIGNsYXNzPSd1c2VyLWRhdGEnPiR7aXRlbS5jb21tZW50fTwvcD5cbiAgICA8L2xpPmA7XG4gICAgfSk7XG4gIH1cblxuICBjb21tZW50R3JvdXAuaW5uZXJIVE1MID0gY29tbWVudEl0ZW1zOyAvLyBhcHBlbmQgY29tbWVudCBsaXN0XG4gIGNvbW1lbnRzQ29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gIGNvbW1lbnRDb3VudGVyKGNvbW1lbnRDb3VudCwgY29tbWVudEdyb3VwKTtcblxuICBjb21tZW50c0NvbnRhaW5lci5hcHBlbmQoY29tbWVudFRpdGUsIGNvbW1lbnRHcm91cCk7XG5cbiAgRm9ybS5lbGVtZW50cy5uYW1lLnZhbHVlID0gJyc7XG4gIEZvcm0uZWxlbWVudHMuaW5zaWdodC52YWx1ZSA9ICcnO1xufTtcblxuY29uc3QgcmVuZGVyID0gKGRhdGEpID0+IHtcbiAgLy8gbW9kYWwgY2FyZFxuICBjb25zdCBtb2RhbENhcmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbW9kYWxDYXJkLmNsYXNzTmFtZSA9ICdtb2RhbC1jYXJkJztcblxuICAvLyBidXR0b25cbiAgY29uc3QgYnRuQ3Jvc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgYnRuQ3Jvc3MuY2xhc3NOYW1lID0gJ2J0bi1jcm9zcyc7XG4gIGJ0bkNyb3NzLmlubmVySFRNTCA9ICc8aW1nIHNyYz1cIi4vYXNzZXRzL2ltZy9pY29uczgtbXVsdGlwbHktMjQucG5nXCIgYWx0PVwiWFwiIC8+JztcbiAgYnRuQ3Jvc3MuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWxDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICB9KTtcblxuICAvLyBjYXJkIGltZ1xuICBjb25zdCBjYXJkSW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNhcmRJbWcuY2xhc3NOYW1lID0gJ2NhcmQtaW1nJztcbiAgY2FyZEltZy5pbm5lckhUTUwgPSBgPGltZ1xuICBzcmM9XCIke2RhdGEuaW1hZ2Uub3JpZ2luYWx9XCJcbiAgYWx0PVwiJHtkYXRhLm5hbWV9XCJcbi8+YDtcblxuICAvLyBjYXJkIHRpdGxlXG4gIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDInKTtcbiAgdGl0bGUuY2xhc3NOYW1lID0gJ2NhcmQtdGl0bGUnO1xuICB0aXRsZS5pbm5lclRleHQgPSBkYXRhLm5hbWU7XG4gIC8vIGNhcmQgZGVzXG4gIGNvbnN0IGRlcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBkZXMuY2xhc3NOYW1lID0gJ2NhcmQtZGVzJztcbiAgZGVzLmlubmVySFRNTCA9IGRhdGEuc3VtbWFyeTtcblxuICAvLyBjYXJkIHNwZWMgZ3JvdXBcbiAgY29uc3QgY2FyZFNwZWMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgY2FyZFNwZWMuY2xhc3NOYW1lID0gJ2NhcmQtc3BlYy1ncm91cCc7XG4gIGNhcmRTcGVjLmlubmVySFRNTCA9IGA8dWwgY2xhc3M9XCJjYXJkLXNwZWNcIj5cbiAgPGxpIGNsYXNzPVwic3BlYy1pdGVtXCI+U2Vhc29uOiAke2RhdGEuc2Vhc29ufTwvbGk+XG4gIDxsaSBjbGFzcz1cInNwZWMtaXRlbVwiPkR1cmF0aW9uOiAke2RhdGEucnVudGltZX08L2xpPlxuPC91bD5cbjx1bCBjbGFzcz1cImNhcmQtc3BlY1wiPlxuICA8bGkgY2xhc3M9XCJzcGVjLWl0ZW1cIj5haXJkYXRlOiAke2RhdGEuYWlyZGF0ZX08L2xpPlxuICA8bGkgY2xhc3M9XCJzcGVjLWl0ZW1cIj5SYXRpbmc6ICR7ZGF0YS5yYXRpbmcuYXZlcmFnZX08L2xpPlxuPC91bD5gO1xuXG4gIGNvbnN0IGNvbW1lbnRTZWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbW1lbnRTZWN0aW9uLmNsYXNzTmFtZSA9ICdjb21tZW50LXNlY3Rpb24nO1xuXG4gIGNvbnN0IGNvbW1lbnRUaXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbW1lbnRUaXRlLmNsYXNzTmFtZSA9ICdjb21tZW50LXRpdGxlJztcbiAgY29uc3QgY29tbWVudEhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2gzJyk7XG4gIGNvbW1lbnRIZWFkZXIuY2xhc3NOYW1lID0gJ2NvbW1lbnQtaGVhZGVyJztcbiAgY29tbWVudEhlYWRlci5pbm5lckhUTUwgPSAnQ29tbWVudHMnO1xuICBjb25zdCBjb21tZW50Q291bnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gIGNvbW1lbnRDb3VudC5pZCA9ICdzaG93X2NvbW1lbnRfY291bnQnO1xuICBjb21tZW50Q291bnQuaW5uZXJUZXh0ID0gMDtcblxuICBjb21tZW50VGl0ZS5hcHBlbmQoY29tbWVudEhlYWRlciwgY29tbWVudENvdW50KTtcblxuICBjb25zdCBjb21tZW50R3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICBjb21tZW50R3JvdXAuY2xhc3NOYW1lID0gJ2NvbW1lbnQtZ291cCc7XG5cbiAgbGV0IGNvbW1lbnRJdGVtcyA9ICcnO1xuXG4gIGlmIChkYXRhLmNvbW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICBkYXRhLmNvbW1lbnRzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbW1lbnRJdGVtcyArPSBgPGxpIGNsYXNzPSdjb21tZW50LWl0ZW0nPlxuICAgICAgICA8ZGl2IGNsYXNzPSd1c2VyLWluZm8nPlxuICAgICAgICAgIDxkaXYgY2xhc3M9J3VzZXItYXZhdGFyJz5cbiAgICAgICAgICAgIDxpbWcgc3JjPScuL2Fzc2V0cy9pbWcvdXNlci5wbmcnIGFsdD0nJHtpdGVtLnVzZXJuYW1lfScvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxoNCBjbGFzcz0ndXNlci1uYW1lJz4ke2l0ZW0udXNlcm5hbWV9PC9oND5cbiAgICAgICAgICA8c3BhbiBjbGFzcz0nc3VibWl0LWRhdGUnPiR7aXRlbS5jcmVhdGlvbl9kYXRlfTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwIGNsYXNzPSd1c2VyLWRhdGEnPiR7aXRlbS5jb21tZW50fTwvcD5cbiAgICAgIDwvbGk+YDtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbW1lbnRHcm91cC5pbm5lckhUTUwgPSBjb21tZW50SXRlbXM7IC8vIGFwcGVuZCBjb21tZW50IGxpc3RcblxuICBjb21tZW50Q291bnRlcihjb21tZW50Q291bnQsIGNvbW1lbnRHcm91cCk7XG5cbiAgY29tbWVudFNlY3Rpb24uYXBwZW5kKGNvbW1lbnRUaXRlLCBjb21tZW50R3JvdXApO1xuXG4gIC8vIEFkZCBjb21tZW50XG4gIGNvbnN0IGNvbW1lbnRGb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNvbW1lbnRGb3JtLmNsYXNzTmFtZSA9ICdjb21tZW50LWZvcm0nO1xuICBjb25zdCBhZGRDb21tZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTtcbiAgYWRkQ29tbWVudC5jbGFzc05hbWUgPSAnY29tbWVudC10aXRsZSc7XG4gIGFkZENvbW1lbnQuaW5uZXJUZXh0ID0gJ0FkZCBhIGNvbW1lbnQnO1xuICBjb25zdCBGb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpO1xuICBGb3JtLmlubmVySFRNTCA9IGBcbjxpbnB1dCB0eXBlPVwidGV4dFwiICBuYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiIHBsYWNlaG9sZGVyPVwiWW91ciBuYW1lXCIgbWF4bGVuZ3RoPVwiMTBcIiByZXF1aXJlZD5cbjx0ZXh0YXJlYSBpZD1cImluc2lnaHRcIiBuYW1lPVwiaW5zaWdodFwiIHBsYWNlaG9sZGVyPVwiWW91ciBpbnNpZ2h0c1wiPjwvdGV4dGFyZWE+XG48YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBpZD1cInN1Ym1pdEJ0blwiPlN1Ym1pdDwvYnV0dG9uPmA7XG5cbiAgY29tbWVudEZvcm0uYXBwZW5kKGFkZENvbW1lbnQsIEZvcm0pO1xuXG4gIEZvcm0uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgYXN5bmMgKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgbmFtZSA9IEZvcm0uZWxlbWVudHMubmFtZS52YWx1ZTtcbiAgICBjb25zdCBpbnNpZ2h0ID0gRm9ybS5lbGVtZW50cy5pbnNpZ2h0LnZhbHVlO1xuICAgIGNvbnN0IGNvbW1lbnREYXRhID0ge1xuICAgICAgaXRlbV9pZDogZGF0YS5pZCxcbiAgICAgIHVzZXJuYW1lOiBuYW1lLFxuICAgICAgY29tbWVudDogaW5zaWdodCxcbiAgICB9O1xuICAgIGNvbnN0IHVybCA9IGAke0JBU0VfVVJMfS9jb21tZW50c2A7XG4gICAgY3JlYXRlTmV3Q29tbWVudCh1cmwsIGNvbW1lbnREYXRhLCBjb21tZW50U2VjdGlvbiwgRm9ybSk7XG4gIH0pO1xuICAvLyBhcHBlbmQgY2hpbGQgZWxlbWVudHMgaW4gY2FyZE1vZGFsXG4gIG1vZGFsQ2FyZC5hcHBlbmQoXG4gICAgYnRuQ3Jvc3MsXG4gICAgY2FyZEltZyxcbiAgICB0aXRsZSxcbiAgICBkZXMsXG4gICAgY2FyZFNwZWMsXG4gICAgY29tbWVudFNlY3Rpb24sXG4gICAgY29tbWVudEZvcm0sXG4gICk7XG5cbiAgbW9kYWxDb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gIG1vZGFsQ29udGFpbmVyLmFwcGVuZChtb2RhbENhcmQpOyAvLyBhcHBlbmQgY2FyZE1vZGFsXG59O1xuXG5jb25zdCBmZXRjaFNpbmdsZVNob3dDb21tZW50ID0gYXN5bmMgKGUpID0+IHtcbiAgbW9kYWxDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICBjb25zdCB7IGlkIH0gPSBlLnRhcmdldC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIGNvbnN0IHVybCA9IGBodHRwczovL2FwaS50dm1hemUuY29tL2VwaXNvZGVzLyR7aWR9YDtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgY29uc3QgY29tbWVudFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7QkFTRV9VUkx9L2NvbW1lbnRzP2l0ZW1faWQ9JHtpZH1gKTtcblxuICBsZXQgZmlsdGVyUmVzdWx0ID0geyAuLi5yZXN1bHQgfTtcblxuICBjb25zdCBjb21tZW50UmVzdWx0ID0gYXdhaXQgY29tbWVudFJlc3BvbnNlLmpzb24oKTtcbiAgaWYgKGNvbW1lbnRSZXN1bHQgJiYgIWNvbW1lbnRSZXN1bHQuZXJyb3IpIHtcbiAgICBmaWx0ZXJSZXN1bHQgPSB7IC4uLmZpbHRlclJlc3VsdCwgY29tbWVudHM6IGNvbW1lbnRSZXN1bHQgfTtcbiAgfSBlbHNlIHtcbiAgICBmaWx0ZXJSZXN1bHQgPSB7IC4uLmZpbHRlclJlc3VsdCwgY29tbWVudHM6IFtdIH07XG4gIH1cblxuICByZW5kZXIoZmlsdGVyUmVzdWx0KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZldGNoU2luZ2xlU2hvd0NvbW1lbnQ7XG4iLCJjb25zdCByZXNlcnZhdGlvbkNvdW50ZXIgPSAoY291bnRDb250YWluZXIsIHJlc2VydmF0aW9uQ29udGFpbmVyKSA9PiB7XG4gIGNvbnN0IGNvdW50ID0gcmVzZXJ2YXRpb25Db250YWluZXIuY2hpbGRFbGVtZW50Q291bnQ7XG4gIGNvdW50Q29udGFpbmVyLmlubmVyVGV4dCA9IGAoJHtjb3VudH0pYDtcbiAgcmV0dXJuIGNvdW50O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVzZXJ2YXRpb25Db3VudGVyO1xuIiwiaW1wb3J0IHsgQkFTRV9VUkwgfSBmcm9tICcuL2FwaVVybHMuanMnO1xuaW1wb3J0IHsgbW9kYWxDb250YWluZXIgfSBmcm9tICcuL2RvbVNlbGVjdG9yLmpzJztcbmltcG9ydCByZXNlcnZhdGlvbkNvdW50ZXIgZnJvbSAnLi9yZXNlcnZhdGlvbkNvdW50ZXIuanMnO1xuXG5jb25zdCBjcmVhdGVOZXdSZXNlcnZhdGlvbiA9IGFzeW5jICh1cmwsIGRhdGEsIHJlc2VydmF0aW9uQ29udGFpbmVyLCBGb3JtKSA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczoge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICB9KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rICYmIHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAxKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZmV0Y2hDb21VcmwgPSBgJHtCQVNFX1VSTH0vcmVzZXJ2YXRpb25zP2l0ZW1faWQ9JHtkYXRhLml0ZW1faWR9YDtcblxuICBjb25zdCByZXNlcnZhdGlvblJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZmV0Y2hDb21VcmwpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc2VydmF0aW9uUmVzcG9uc2UuanNvbigpO1xuXG4gIC8vIG1hbnVwdWxhdGUgdGhlIGRvbVxuICBjb25zdCByZXNlcnZhdGlvbkhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2gzJyk7XG4gIHJlc2VydmF0aW9uSGVhZGVyLmNsYXNzTmFtZSA9ICdyZXNlcnZhdGlvbi10aXRsZSc7XG4gIHJlc2VydmF0aW9uSGVhZGVyLmlubmVySFRNTCA9IFwiUmVzZXJ2YXRpb25zIDxzcGFuIGlkPSdzaG93X2NvbW1lbnRfY291bnQnPigwKTwvc3Bhbj5cIjtcblxuICBjb25zdCByZXNlcnZhdGlvbkdyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTtcbiAgcmVzZXJ2YXRpb25Hcm91cC5jbGFzc05hbWUgPSAncmVzZXJ2YXRpb24tZ3JvdXAnO1xuXG4gIGxldCByZXNlcnZhdGlvbkl0ZW1zID0gJyc7XG5cbiAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgcmVzdWx0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHJlc2VydmF0aW9uSXRlbXMgKz0gYDxsaSBjbGFzcz0ncmVzZXJ2YXRpb24taXRlbSc+XG4gICAgICA8ZGl2IGNsYXNzPSd1c2VyLWluZm8nPlxuICAgICAgICA8ZGl2IGNsYXNzPSd1c2VyLWF2YXRhcic+XG4gICAgICAgICAgPGltZyBzcmM9Jy4vYXNzZXRzL2ltZy91c2VyLnBuZycgYWx0PScke2l0ZW0udXNlcm5hbWV9Jy8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aDQgY2xhc3M9J3VzZXItbmFtZSc+JHtpdGVtLnVzZXJuYW1lfTwvaDQ+XG4gICAgICAgIDxzcGFuIGNsYXNzPSdzdWJtaXQtZGF0ZSc+JHtpdGVtLmRhdGVfc3RhcnR9IC0gJHtpdGVtLmRhdGVfZW5kfTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbGk+YDtcbiAgICB9KTtcbiAgfVxuXG4gIHJlc2VydmF0aW9uR3JvdXAuaW5uZXJIVE1MID0gcmVzZXJ2YXRpb25JdGVtczsgLy8gYXBwZW5kIHJlc2VydmF0aW9uIGxpc3RcbiAgcmVzZXJ2YXRpb25Db250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgcmVzZXJ2YXRpb25Db3VudGVyKHJlc2VydmF0aW9uSGVhZGVyLmNoaWxkcmVuWzBdLCByZXNlcnZhdGlvbkdyb3VwKTtcblxuICByZXNlcnZhdGlvbkNvbnRhaW5lci5hcHBlbmQocmVzZXJ2YXRpb25IZWFkZXIsIHJlc2VydmF0aW9uR3JvdXApO1xuXG4gIEZvcm0uZWxlbWVudHMubmFtZS52YWx1ZSA9ICcnO1xuICBGb3JtLmVsZW1lbnRzLnN0YXJ0X2RhdGUudmFsdWUgPSAnJztcbiAgRm9ybS5lbGVtZW50cy5lbmRfZGF0ZS52YWx1ZSA9ICcnO1xufTtcblxuY29uc3QgcmVuZGVyID0gKGRhdGEpID0+IHtcbiAgLy8gbW9kYWwgY2FyZFxuICBjb25zdCBtb2RhbENhcmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbW9kYWxDYXJkLmNsYXNzTmFtZSA9ICdtb2RhbC1jYXJkJztcblxuICAvLyBidXR0b25cbiAgY29uc3QgYnRuQ3Jvc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgYnRuQ3Jvc3MuY2xhc3NOYW1lID0gJ2J0bi1jcm9zcyc7XG4gIGJ0bkNyb3NzLmlubmVySFRNTCA9ICc8aW1nIHNyYz1cIi4vYXNzZXRzL2ltZy9pY29uczgtbXVsdGlwbHktMjQucG5nXCIgYWx0PVwiWFwiIC8+JztcbiAgYnRuQ3Jvc3MuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWxDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICB9KTtcblxuICAvLyBjYXJkIGltZ1xuICBjb25zdCBjYXJkSW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGNhcmRJbWcuY2xhc3NOYW1lID0gJ2NhcmQtaW1nJztcbiAgY2FyZEltZy5pbm5lckhUTUwgPSBgPGltZ1xuICBzcmM9XCIke2RhdGEuaW1hZ2Uub3JpZ2luYWx9XCJcbiAgYWx0PVwiJHtkYXRhLm5hbWV9XCJcbi8+YDtcblxuICAvLyBjYXJkIHRpdGxlXG4gIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDInKTtcbiAgdGl0bGUuY2xhc3NOYW1lID0gJ2NhcmQtdGl0bGUnO1xuICB0aXRsZS5pbm5lclRleHQgPSBkYXRhLm5hbWU7XG5cbiAgLy8gY2FyZCBkZXNcbiAgY29uc3QgZGVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGRlcy5jbGFzc05hbWUgPSAnY2FyZC1kZXMnO1xuICBkZXMuaW5uZXJIVE1MID0gZGF0YS5zdW1tYXJ5O1xuXG4gIC8vIGNhcmQgc3BlYyBncm91cFxuICBjb25zdCBjYXJkU3BlYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBjYXJkU3BlYy5jbGFzc05hbWUgPSAnY2FyZC1zcGVjLWdyb3VwJztcbiAgY2FyZFNwZWMuaW5uZXJIVE1MID0gYDx1bCBjbGFzcz1cImNhcmQtc3BlY1wiPlxuICA8bGkgY2xhc3M9XCJzcGVjLWl0ZW1cIj5TZWFzb246ICR7ZGF0YS5zZWFzb259PC9saT5cbiAgPGxpIGNsYXNzPVwic3BlYy1pdGVtXCI+RHVyYXRpb246ICR7ZGF0YS5ydW50aW1lfTwvbGk+XG48L3VsPlxuPHVsIGNsYXNzPVwiY2FyZC1zcGVjXCI+XG4gIDxsaSBjbGFzcz1cInNwZWMtaXRlbVwiPmFpcmRhdGU6ICR7ZGF0YS5haXJkYXRlfTwvbGk+XG4gIDxsaSBjbGFzcz1cInNwZWMtaXRlbVwiPlJhdGluZzogJHtkYXRhLnJhdGluZy5hdmVyYWdlfTwvbGk+XG48L3VsPmA7XG5cbiAgY29uc3QgcmVzZXJ2YXRpb25TZWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHJlc2VydmF0aW9uU2VjdGlvbi5jbGFzc05hbWUgPSAncmVzZXJ2YXRpb24tc2VjdGlvbic7XG5cbiAgY29uc3QgcmVzZXJ2YXRpb25IZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoMycpO1xuICByZXNlcnZhdGlvbkhlYWRlci5jbGFzc05hbWUgPSAncmVzZXJ2YXRpb24tdGl0bGUnO1xuICByZXNlcnZhdGlvbkhlYWRlci5pbm5lckhUTUwgPSBcIlJlc2VydmF0aW9ucyA8c3BhbiBpZD0nc2hvd19jb21tZW50X2NvdW50Jz4oMCk8L3NwYW4+XCI7XG5cbiAgY29uc3QgcmVzZXJ2YXRpb25Hcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XG4gIHJlc2VydmF0aW9uR3JvdXAuY2xhc3NOYW1lID0gJ3Jlc2VydmF0aW9uLWdyb3VwJztcblxuICBsZXQgcmVzZXJ2YXRpb25JdGVtcyA9ICcnO1xuXG4gIGlmIChkYXRhLnJlc2VydmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgZGF0YS5yZXNlcnZhdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgcmVzZXJ2YXRpb25JdGVtcyArPSBgPGxpIGNsYXNzPSdyZXNlcnZhdGlvbi1pdGVtJz5cbiAgICAgIDxkaXYgY2xhc3M9J3VzZXItaW5mbyc+XG4gICAgICAgIDxkaXYgY2xhc3M9J3VzZXItYXZhdGFyJz5cbiAgICAgICAgICA8aW1nIHNyYz0nLi9hc3NldHMvaW1nL3VzZXIucG5nJyBhbHQ9JyR7aXRlbS51c2VybmFtZX0nLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxoNCBjbGFzcz0ndXNlci1uYW1lJz4ke2l0ZW0udXNlcm5hbWV9PC9oND5cbiAgICAgICAgPHNwYW4gY2xhc3M9J3N1Ym1pdC1kYXRlJz4ke2l0ZW0uZGF0ZV9zdGFydH0gLSAke2l0ZW0uZGF0ZV9lbmR9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9saT5gO1xuICAgIH0pO1xuICB9XG5cbiAgcmVzZXJ2YXRpb25Hcm91cC5pbm5lckhUTUwgPSByZXNlcnZhdGlvbkl0ZW1zOyAvLyBhcHBlbmQgcmVzZXJ2YXRpb24gbGlzdFxuXG4gIHJlc2VydmF0aW9uQ291bnRlcihyZXNlcnZhdGlvbkhlYWRlci5jaGlsZHJlblswXSwgcmVzZXJ2YXRpb25Hcm91cCk7XG5cbiAgcmVzZXJ2YXRpb25TZWN0aW9uLmFwcGVuZChyZXNlcnZhdGlvbkhlYWRlciwgcmVzZXJ2YXRpb25Hcm91cCk7XG5cbiAgLy8gQWRkIGNvbW1lbnRcbiAgY29uc3QgcmVzZXJ2YXRpb25Gb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHJlc2VydmF0aW9uRm9ybS5jbGFzc05hbWUgPSAncmVzZXJ2YXRpb24tZm9ybSc7XG4gIGNvbnN0IGFkZFJlc2VydmF0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTtcbiAgYWRkUmVzZXJ2YXRpb24uY2xhc3NOYW1lID0gJ3Jlc2VydmF0aW9uLXRpdGxlJztcbiAgYWRkUmVzZXJ2YXRpb24uaW5uZXJUZXh0ID0gJ0FkZCBhIFJlc2VydmF0aW9uJztcbiAgY29uc3QgRm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcbiAgRm9ybS5pbm5lckhUTUwgPSBgXG4gIDxpbnB1dCB0eXBlPVwidGV4dFwiICBuYW1lPVwibmFtZVwiIGlkPVwibmFtZVwiIHBsYWNlaG9sZGVyPVwiWW91ciBuYW1lXCIgbWF4bGVuZ3RoPVwiMTBcIiByZXF1aXJlZD5cbiAgPGxhYmVsIGZvcj0nc3RhcnRfZGF0ZSc+QWRkIHlvdXIgc3RhcnQgZGF0ZSBiZWxvdzwvbGFiZWw+XG4gIDxpbnB1dCB0eXBlPVwiZGF0ZVwiICBuYW1lPVwic3RhcnRfZGF0ZVwiIGlkPVwic3RhcnRfZGF0ZVwiIHBsYWNlaG9sZGVyPVwiQWRkIHlvdXIgc3RhcnQgZGF0ZSBoZXJlLlwiIHJlcXVpcmVkPlxuICA8bGFiZWwgZm9yPSdlbmRfZGF0ZSc+QWRkIHlvdXIgZW5kIGRhdGUgYmVsb3c8L2xhYmVsPlxuICA8aW5wdXQgdHlwZT1cImRhdGVcIiAgbmFtZT1cImVuZF9kYXRlXCIgaWQ9XCJlbmRfZGF0ZVwiIHBsYWNlaG9sZGVyPVwiQWRkIHlvdXIgZW5kIGRhdGUgaGVyZS5cIiByZXF1aXJlZD5cbiAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgaWQ9XCJzdWJtaXRCdG5cIj5SZXNlcnZlPC9idXR0b24+YDtcblxuICByZXNlcnZhdGlvbkZvcm0uYXBwZW5kKGFkZFJlc2VydmF0aW9uLCBGb3JtKTtcblxuICBGb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIGFzeW5jIChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IG5hbWUgPSBGb3JtLmVsZW1lbnRzLm5hbWUudmFsdWU7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gRm9ybS5lbGVtZW50cy5zdGFydF9kYXRlLnZhbHVlO1xuICAgIGNvbnN0IGVuZERhdGUgPSBGb3JtLmVsZW1lbnRzLmVuZF9kYXRlLnZhbHVlO1xuICAgIGNvbnN0IHJlc2VydmVEYXRhID0ge1xuICAgICAgaXRlbV9pZDogZGF0YS5pZCxcbiAgICAgIHVzZXJuYW1lOiBuYW1lLFxuICAgICAgZGF0ZV9zdGFydDogc3RhcnREYXRlLFxuICAgICAgZGF0ZV9lbmQ6IGVuZERhdGUsXG4gICAgfTtcbiAgICBjb25zdCB1cmwgPSBgJHtCQVNFX1VSTH0vcmVzZXJ2YXRpb25zL2A7XG4gICAgY3JlYXRlTmV3UmVzZXJ2YXRpb24odXJsLCByZXNlcnZlRGF0YSwgcmVzZXJ2YXRpb25TZWN0aW9uLCBGb3JtKTtcbiAgfSk7XG5cbiAgLy8gYXBwZW5kIGNoaWxkIGVsZW1lbnRzIGluIGNhcmRNb2RhbFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICBtb2RhbENhcmQuYXBwZW5kKFxuICAgIGJ0bkNyb3NzLFxuICAgIGNhcmRJbWcsXG4gICAgdGl0bGUsXG4gICAgZGVzLFxuICAgIGNhcmRTcGVjLFxuICAgIHJlc2VydmF0aW9uU2VjdGlvbixcbiAgICByZXNlcnZhdGlvbkZvcm0sXG4gICk7XG5cbiAgbW9kYWxDb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gIG1vZGFsQ29udGFpbmVyLmFwcGVuZChtb2RhbENhcmQpOyAvLyBhcHBlbmQgY2FyZE1vZGFsXG59O1xuXG5jb25zdCBmZXRjaFNpbmdsZVNob3cgPSBhc3luYyAoZSkgPT4ge1xuICBtb2RhbENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIGNvbnN0IHsgaWQgfSA9IGUudGFyZ2V0LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgY29uc3QgdXJsID0gYGh0dHBzOi8vYXBpLnR2bWF6ZS5jb20vZXBpc29kZXMvJHtpZH1gO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICBjb25zdCByZXNlcnZhdGlvblJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgYCR7QkFTRV9VUkx9L3Jlc2VydmF0aW9ucz9pdGVtX2lkPSR7aWR9YCxcbiAgKTtcblxuICBsZXQgZmlsdGVyUmVzdWx0ID0geyAuLi5yZXN1bHQgfTtcblxuICBjb25zdCByZXNlcnZhdGlvblJlc3VsdCA9IGF3YWl0IHJlc2VydmF0aW9uUmVzcG9uc2UuanNvbigpO1xuICBpZiAocmVzZXJ2YXRpb25SZXN1bHQgJiYgIXJlc2VydmF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgZmlsdGVyUmVzdWx0ID0geyAuLi5maWx0ZXJSZXN1bHQsIHJlc2VydmF0aW9uczogcmVzZXJ2YXRpb25SZXN1bHQgfTtcbiAgfSBlbHNlIHtcbiAgICBmaWx0ZXJSZXN1bHQgPSB7IC4uLmZpbHRlclJlc3VsdCwgcmVzZXJ2YXRpb25zOiBbXSB9O1xuICB9XG5cbiAgcmVuZGVyKGZpbHRlclJlc3VsdCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmZXRjaFNpbmdsZVNob3c7XG4iLCJpbXBvcnQgeyBpdGVtQ291bnRDb250YWluZXIsIGxpc3RJdGVtc0NvbnRhaW5lciB9IGZyb20gJy4vZG9tU2VsZWN0b3IuanMnO1xuaW1wb3J0IGZldGNoU2luZ2xlU2hvd0NvbW1lbnQgZnJvbSAnLi9wb3B1cENvbW1lbnQuanMnO1xuaW1wb3J0IGZldGNoU2luZ2xlU2hvdyBmcm9tICcuL3BvcHVwUmVzZXJ2YXRpb24uanMnO1xuaW1wb3J0IHsgQkFTRV9VUkwsIE1PVklFX0FQSSB9IGZyb20gJy4vYXBpVXJscy5qcyc7XG5pbXBvcnQgaXRlbUNvdW50ZXIgZnJvbSAnLi9pdGVtQ291bnRlci5qcyc7XG5cbi8vIGNyZWF0ZU5ldyBsaWtlXG5jb25zdCBjcmVhdGVOZXdMaWtlID0gYXN5bmMgKGlkLCBsaWtlQ291bnQsIGJ0bkxpa2UpID0+IHtcbiAgYnRuTGlrZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke0JBU0VfVVJMfS9saWtlc2AsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBpdGVtX2lkOiBpZCB9KSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vayAmJiByZXNwb25zZS5zdGF0dXMgIT09IDIwMSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlTGlrZXMgPSBhd2FpdCBmZXRjaChgJHtCQVNFX1VSTH0vbGlrZXNgKTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2VMaWtlcy5qc29uKCk7XG4gIGNvbnN0IGxpa2VEYXRhID0gcmVzdWx0LmZpbmQoKGl0ZW0pID0+IGl0ZW0uaXRlbV9pZCA9PT0gaWQpO1xuICBpZiAobGlrZURhdGEpIHtcbiAgICBsaWtlQ291bnQuaW5uZXJUZXh0ID0gbGlrZURhdGEubGlrZXMgPiAxID8gYCR7bGlrZURhdGEubGlrZXN9IGxpa2VzYCA6IGAke2xpa2VEYXRhLmxpa2VzfSBsaWtlYDtcbiAgICBidG5MaWtlLmlubmVySFRNTCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJpc28tODg1OS0xXCI/PlxuICAgIDwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIEdlbmVyYXRvcjogU1ZHIFJlcG8gTWl4ZXIgVG9vbHMgLS0+XG4gICAgPHN2ZyBmaWxsPVwiI2ZmN2IwMFwiIGhlaWdodD1cIjIycHhcIiB3aWR0aD1cIjIycHhcIiB2ZXJzaW9uPVwiMS4xXCIgaWQ9XCJMYXllcl8xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIFxuICAgICAgIHZpZXdCb3g9XCIwIDAgNDU1IDQ1NVwiIHhtbDpzcGFjZT1cInByZXNlcnZlXCI+XG4gICAgPHBhdGggZD1cIk0zMjYuNjMyLDEwLjM0NmMtMzguNzMzLDAtNzQuOTkxLDE3LjUzNy05OS4xMzIsNDYuOTJjLTI0LjE0MS0yOS4zODMtNjAuMzk5LTQ2LjkyLTk5LjEzMi00Ni45MlxuICAgICAgQzU3LjU4NiwxMC4zNDYsMCw2Ny45MzEsMCwxMzguNzE0YzAsNTUuNDI2LDMzLjA0OSwxMTkuNTM1LDk4LjIzLDE5MC41NDZjNTAuMTYyLDU0LjY0OSwxMDQuNzI5LDk2Ljk2LDEyMC4yNTcsMTA4LjYyNmw5LjAxLDYuNzY5XG4gICAgICBsOS4wMDktNi43NjhjMTUuNTMtMTEuNjY3LDcwLjA5OS01My45NzksMTIwLjI2LTEwOC42MjVDNDIxLjk1LDI1OC4yNTEsNDU1LDE5NC4xNDEsNDU1LDEzOC43MTRcbiAgICAgIEM0NTUsNjcuOTMxLDM5Ny40MTQsMTAuMzQ2LDMyNi42MzIsMTAuMzQ2elwiLz5cbiAgICA8L3N2Zz5gO1xuICB9XG59O1xuXG4vLyByZW5kZXIgdGhlIGl0ZW0gbGlzdFxuY29uc3QgcmVuZGVyID0gKGRhdGEpID0+IHtcbiAgaWYgKGRhdGEubGVuZ3RoID4gMCkge1xuICAgIGxpc3RJdGVtc0NvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgIGRhdGEuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gICAgICBpdGVtLmlkID0gaS5pZDtcbiAgICAgIGl0ZW0uY2xhc3NOYW1lID0gJ3Nob3ctaXRlbSc7XG5cbiAgICAgIC8vIGNyZWF0ZSBzaG8gSW1nIGVsZW1lbnRcbiAgICAgIGNvbnN0IHNob3dJbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHNob3dJbWcuY2xhc3NOYW1lID0gJ3Nob3ctaXRlbS1pbWcnO1xuICAgICAgc2hvd0ltZy5pbm5lckhUTUwgPSBgPGltZyBzcmM9JyR7aS5pbWFnZS5vcmlnaW5hbH0nPmA7XG5cbiAgICAgIC8vIGNyZWF0ZSBzaG93IGluZm9cbiAgICAgIGNvbnN0IHNob3dJbmZvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzaG93SW5mby5jbGFzc05hbWUgPSAnc2hvdy1pbmZvJztcblxuICAgICAgLy8gY3JlYXRlIHRpbGUgZm9yIHNob3cgaW5mb1xuICAgICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoMycpO1xuICAgICAgdGl0bGUuY2xhc3NOYW1lID0gJ3Nob3ctdGl0bGUnO1xuICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gaS5uYW1lO1xuXG4gICAgICAvLyBsaWtlIGFjdGlvblxuICAgICAgY29uc3Qgc2hvd0xpa2VBY3Rpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHNob3dMaWtlQWN0aW9uLmNsYXNzTmFtZSA9ICdzaHdvLWxpa2UtYWN0aW9uJztcblxuICAgICAgLy8gbGlrZSBidXR0b25cbiAgICAgIGNvbnN0IGJ0bkxpa2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgIGJ0bkxpa2UuY2xhc3NOYW1lID0gJ2J0bi1saWtlJztcbiAgICAgIGJ0bkxpa2UuaW5uZXJIVE1MID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cImlzby04ODU5LTFcIj8+XG4gICAgICA8IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPlxuICAgICAgPHN2ZyBmaWxsPVwiI2ZmN2IwMFwiIGhlaWdodD1cIjIycHhcIiB3aWR0aD1cIjIycHhcIiB2ZXJzaW9uPVwiMS4xXCIgaWQ9XCJMYXllcl8xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIFxuICAgICAgICAgdmlld0JveD1cIjAgMCA0NTUgNDU1XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIj5cbiAgICAgIDxwYXRoIGQ9XCJNMzI2LjYzMiwxMC4zNDZjLTM4LjczMywwLTc0Ljk5MSwxNy41MzctOTkuMTMyLDQ2LjkyYy0yNC4xNDEtMjkuMzg0LTYwLjM5OC00Ni45Mi05OS4xMzItNDYuOTJcbiAgICAgICAgQzU3LjU4NiwxMC4zNDYsMCw2Ny45MzEsMCwxMzguNzE0YzAsNTUuNDI2LDMzLjA1LDExOS41MzUsOTguMjMsMTkwLjU0NmM1MC4xNjEsNTQuNjQ3LDEwNC43MjgsOTYuOTU5LDEyMC4yNTcsMTA4LjYyNmw5LjAxLDYuNzY5XG4gICAgICAgIGw5LjAxLTYuNzY4YzE1LjUyOS0xMS42NjcsNzAuMDk4LTUzLjk3OCwxMjAuMjYtMTA4LjYyNUM0MjEuOTQ5LDI1OC4yNTEsNDU1LDE5NC4xNDEsNDU1LDEzOC43MTRcbiAgICAgICAgQzQ1NSw2Ny45MzEsMzk3LjQxNCwxMC4zNDYsMzI2LjYzMiwxMC4zNDZ6IE0zMzQuNjY2LDMwOC45NzRjLTQxLjI1OSw0NC45NDgtODUuNjQ4LDgxLjI4My0xMDcuMTY5LDk4LjAyOVxuICAgICAgICBjLTIxLjUyLTE2Ljc0Ni02NS45MDctNTMuMDgyLTEwNy4xNjYtOTguMDNDNjEuMjM2LDI0NC41OTIsMzAsMTg1LjcxNywzMCwxMzguNzE0YzAtNTQuMjQsNDQuMTI4LTk4LjM2OCw5OC4zNjgtOTguMzY4XG4gICAgICAgIGMzNS42OTQsMCw2OC42NTIsMTkuNDU0LDg2LjAxMyw1MC43NzFsMTMuMTE5LDIzLjY2NmwxMy4xMTktMjMuNjY2YzE3LjM2LTMxLjMxNiw1MC4zMTgtNTAuNzcxLDg2LjAxMy01MC43NzFcbiAgICAgICAgYzU0LjI0LDAsOTguMzY4LDQ0LjEyNyw5OC4zNjgsOTguMzY4QzQyNSwxODUuNzE5LDM5My43NjMsMjQ0LjU5NCwzMzQuNjY2LDMwOC45NzR6XCIvPlxuICAgICAgPC9zdmc+YDtcblxuICAgICAgLy8gbGlrZSBjb3VudFxuICAgICAgY29uc3QgbGlrZUNvdW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgaWYgKGkubGlrZXMgPiAxKSB7XG4gICAgICAgIGxpa2VDb3VudC5pbm5lclRleHQgPSBgJHtpLmxpa2VzfSBsaWtlc2A7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaWtlQ291bnQuaW5uZXJIVE1MID0gYCR7aS5saWtlc30gbGlrZWA7XG4gICAgICB9XG5cbiAgICAgIC8vIGJ0biBsaWtlIGV2ZW50IHRvIGNyZWF0ZSBuZXcgbGlrZVxuICAgICAgYnRuTGlrZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgY3JlYXRlTmV3TGlrZShpLmlkLCBsaWtlQ291bnQsIGJ0bkxpa2UpO1xuICAgICAgfSk7XG5cbiAgICAgIHNob3dMaWtlQWN0aW9uLmFwcGVuZChidG5MaWtlLCBsaWtlQ291bnQpOyAvLyBhcHBlbmQgbGlrZSBhY3Rpb25zIGNoaWxkIGVsZW1lbnQuXG5cbiAgICAgIHNob3dJbmZvLmFwcGVuZCh0aXRsZSwgc2hvd0xpa2VBY3Rpb24pOyAvLyBhcHBlbmQgaW4gc2hvd0luZm9cblxuICAgICAgLy8gc2hvdyBhY3Rpb25cbiAgICAgIGNvbnN0IHNob3dBY3Rpb25zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzaG93QWN0aW9ucy5jbGFzc05hbWUgPSAnc2hvdy1hY3Rpb25zJztcblxuICAgICAgLy8gY3JlYXRlIGNoaWxkIGJ0blxuICAgICAgY29uc3QgY29tbWVudEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgY29tbWVudEJ0bi5jbGFzc05hbWUgPSAnYnRuLWFjdGlvbiBidG4tY29tbWVudCc7XG4gICAgICBjb21tZW50QnRuLmlubmVyVGV4dCA9ICdDb21tZW50cyc7XG4gICAgICBjb21tZW50QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgZmV0Y2hTaW5nbGVTaG93Q29tbWVudChlKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXNlcnZhdGlvbkJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgcmVzZXJ2YXRpb25CdG4uY2xhc3NOYW1lID0gJ2J0bi1hY3Rpb24gYnRuLXJlc2VydmF0aW9uJztcbiAgICAgIHJlc2VydmF0aW9uQnRuLmlubmVyVGV4dCA9ICdSZXNlcnZhdGlvbnMnO1xuICAgICAgcmVzZXJ2YXRpb25CdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICBmZXRjaFNpbmdsZVNob3coZSk7XG4gICAgICB9KTtcblxuICAgICAgc2hvd0FjdGlvbnMuYXBwZW5kKGNvbW1lbnRCdG4sIHJlc2VydmF0aW9uQnRuKTsgLy8gYXBwZW5kIGNoaWxkIGFjdGlvbiBidXR0b25zIGluIHNob3dBY3Rpb25zXG5cbiAgICAgIGl0ZW0uYXBwZW5kKHNob3dJbWcsIHNob3dJbmZvLCBzaG93QWN0aW9ucyk7IC8vIGFwcGVuZCBjbGlsZCBhbGwgdGhlIGVsZW1lbnRzIGluIGl0ZW0uXG5cbiAgICAgIGxpc3RJdGVtc0NvbnRhaW5lci5hcHBlbmRDaGlsZChpdGVtKTtcbiAgICB9KTtcbiAgICBpdGVtQ291bnRlcihpdGVtQ291bnRDb250YWluZXIsIGxpc3RJdGVtc0NvbnRhaW5lcik7XG4gIH0gZWxzZSB7XG4gICAgbGlzdEl0ZW1zQ29udGFpbmVyLmlubmVySFRNTCA9ICc8cCBjbGFzcz1cIm5vLWRhdGFcIj5ObyBEYXRhIEZvdW5kPC9wPic7XG4gIH1cbn07XG5cbmNvbnN0IGZldGNoVHZTaG93cyA9IGFzeW5jICgpID0+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChNT1ZJRV9BUEkpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgLy8gY2FsbCB0aGUgSW52b2xtZW50IGFwaSB0byBnZXQgbGlrZXNcbiAgY29uc3QgcmVzcG9uc2VJbnZvbHZlbWVudCA9IGF3YWl0IGZldGNoKGAke0JBU0VfVVJMfS9saWtlcy9gKTtcbiAgY29uc3QgbGlrZXNSZXN1bHQgPSBhd2FpdCByZXNwb25zZUludm9sdmVtZW50Lmpzb24oKTtcblxuICAvLyBmaWx0ZXIgQXJyYXkgdGhhdHMgaGF2ZSBMaWtlc1xuICBjb25zdCBmaWx0ZXJBcnJXaXRoTGlrZXMgPSBbXTtcbiAgcmVzdWx0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBsaWtlc1Jlc3VsdC5mb3JFYWNoKChsaWtlSXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0uaWQgPT09IGxpa2VJdGVtLml0ZW1faWQpIHtcbiAgICAgICAgZmlsdGVyQXJyV2l0aExpa2VzLnB1c2goeyAuLi5pdGVtLCBsaWtlczogbGlrZUl0ZW0ubGlrZXMgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIGZpbHRlciBBcnJheSB0aGF0cyBoYXZlIG5vdCBsaWtlc1xuICBsZXQgZmlsdGVyV2l0aG91dExpa2VzID0gW107XG4gIGZpbHRlcldpdGhvdXRMaWtlcyA9IHJlc3VsdC5maWx0ZXIoXG4gICAgKGVsKSA9PiAhZmlsdGVyQXJyV2l0aExpa2VzLmZpbmQoKGVsZW1lbnQpID0+IGVsZW1lbnQuaWQgPT09IGVsLmlkKSxcbiAgKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgLy8gbW9kaWZ5IHRoZSBmaWx0ZXJXaXRob3V0IGFycmF5IGxpa2VzIGNvdW50IDA7XG4gIGNvbnN0IG1vZGlmaXlGaWx0ZXJXaXRob3V0TGlrZXMgPSBbXTtcbiAgZmlsdGVyV2l0aG91dExpa2VzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBtb2RpZml5RmlsdGVyV2l0aG91dExpa2VzLnB1c2goeyAuLi5pdGVtLCBsaWtlczogMCB9KTtcbiAgfSk7XG5cbiAgLy8gam9pbiBhbmQgc29ydCB0aGUgYXJyYXlzXG4gIGNvbnN0IGpvaW5BcnIgPSBtb2RpZml5RmlsdGVyV2l0aG91dExpa2VzLmNvbmNhdChmaWx0ZXJBcnJXaXRoTGlrZXMpO1xuICBqb2luQXJyLnNvcnQoKGEsIGIpID0+IGEuaWQgLSBiLmlkKTtcblxuICAvLyBjYWxsIHJlbmRlciBmdW5jdGlvbiB0byBkaXNwbGF5IHRoZSBpdGVtIGxpc3RcbiAgcmVuZGVyKGpvaW5BcnIpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZmV0Y2hUdlNob3dzO1xuIiwiY29uc3QgaXRlbUNvdW50ZXIgPSAoY291bnRDb250YWluZXIsIGl0ZW1Db250YWluZXIpID0+IHtcbiAgY29uc3QgY291bnQgPSBpdGVtQ29udGFpbmVyLmNoaWxkRWxlbWVudENvdW50O1xuICBjb3VudENvbnRhaW5lci5pbm5lclRleHQgPSBgKCR7Y291bnR9KWA7XG4gIHJldHVybiBjb3VudDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGl0ZW1Db3VudGVyO1xuIiwiLy8gaW1wb3J0IHN0YXRpYyBmaWxlc1xuaW1wb3J0ICcuL3N0eWxlLmNzcyc7XG5pbXBvcnQgJy4vYXNzZXRzL2ltZy9pY29uczgtbWVudS1yb3VuZGVkLTI0LnBuZyc7XG5pbXBvcnQgJy4vYXNzZXRzL2ltZy9pY29uczgtbXVsdGlwbHktMjQucG5nJztcbmltcG9ydCAnLi9hc3NldHMvaW1nL3VzZXIucG5nJztcblxuaW1wb3J0IGZldGNoVHZTaG93IGZyb20gJy4vbW9kdWxlcy9kaXNwbGF5SXRlbXMuanMnO1xuaW1wb3J0IHtcbiAgY2xvc2VCdG4sXG4gIG1lbnVCdG4sXG4gIG1vYk5hdkdyb3VwLFxuICBtb2JpbGVOYXZsaW5rcyxcbn0gZnJvbSAnLi9tb2R1bGVzL2RvbVNlbGVjdG9yLmpzJztcblxuLy8gdG9nZ2xlIHRoZSBtZW51XG5tZW51QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICBtb2JOYXZHcm91cC5jbGFzc0xpc3QudG9nZ2xlKCdkaXNwbGF5LWZsZXgnKTtcbn0pO1xuXG5jbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgbW9iTmF2R3JvdXAuY2xhc3NMaXN0LnJlbW92ZSgnZGlzcGxheS1mbGV4Jyk7XG59KTtcblxubW9iaWxlTmF2bGlua3MuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vYk5hdkdyb3VwLmNsYXNzTGlzdC5yZW1vdmUoJ2Rpc3BsYXktZmxleCcpO1xuICB9KTtcbn0pO1xuXG4vLyBsb2FkIHRoZSBpdGVtIGxpc3Qgb24gdGhlIGZseS5cbndpbmRvdy5vbmxvYWQgPSAoKSA9PiB7XG4gIGZldGNoVHZTaG93KCk7XG59O1xuIl0sIm5hbWVzIjpbIm1lbnVCdG4iLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiY2xvc2VCdG4iLCJtb2JpbGVOYXZsaW5rcyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJtb2JOYXZHcm91cCIsInF1ZXJ5U2VsZWN0b3IiLCJtb2RhbENvbnRhaW5lciIsImxpc3RJdGVtc0NvbnRhaW5lciIsIml0ZW1Db3VudENvbnRhaW5lciIsIkJBU0VfVVJMIiwiY291bnRDb250YWluZXIiLCJjb21tZW50Q29udGFpbmVyIiwiY291bnQiLCJjaGlsZEVsZW1lbnRDb3VudCIsImlubmVyVGV4dCIsImkiLCJjcmVhdGVOZXdDb21tZW50IiwidXJsIiwiZGF0YSIsImNvbW1lbnRzQ29udGFpbmVyIiwiRm9ybSIsImZldGNoIiwibWV0aG9kIiwiaGVhZGVycyIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwicmVzcG9uc2UiLCJvayIsInN0YXR1cyIsImZldGNoQ29tVXJsIiwiaXRlbV9pZCIsImNvbW1lbnRSZXNwb25zZSIsImpzb24iLCJyZXN1bHQiLCJjb21tZW50VGl0ZSIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJjb21tZW50SGVhZGVyIiwiaW5uZXJIVE1MIiwiY29tbWVudENvdW50IiwiaWQiLCJhcHBlbmQiLCJjb21tZW50R3JvdXAiLCJjb21tZW50SXRlbXMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiaXRlbSIsInVzZXJuYW1lIiwiY3JlYXRpb25fZGF0ZSIsImNvbW1lbnQiLCJjb21tZW50Q291bnRlciIsImVsZW1lbnRzIiwibmFtZSIsInZhbHVlIiwiaW5zaWdodCIsInJlbmRlciIsIm1vZGFsQ2FyZCIsImJ0bkNyb3NzIiwiYWRkRXZlbnRMaXN0ZW5lciIsImNsYXNzTGlzdCIsInJlbW92ZSIsImNhcmRJbWciLCJpbWFnZSIsIm9yaWdpbmFsIiwidGl0bGUiLCJkZXMiLCJzdW1tYXJ5IiwiY2FyZFNwZWMiLCJzZWFzb24iLCJydW50aW1lIiwiYWlyZGF0ZSIsInJhdGluZyIsImF2ZXJhZ2UiLCJjb21tZW50U2VjdGlvbiIsImNvbW1lbnRzIiwiY29tbWVudEZvcm0iLCJhZGRDb21tZW50IiwiZSIsInByZXZlbnREZWZhdWx0IiwiY29tbWVudERhdGEiLCJhZGQiLCJ0YXJnZXQiLCJwYXJlbnRFbGVtZW50IiwiZmlsdGVyUmVzdWx0IiwiY29tbWVudFJlc3VsdCIsImVycm9yIiwicmVzZXJ2YXRpb25Db250YWluZXIiLCJjcmVhdGVOZXdSZXNlcnZhdGlvbiIsInJlc2VydmF0aW9uUmVzcG9uc2UiLCJyZXNlcnZhdGlvbkhlYWRlciIsInJlc2VydmF0aW9uR3JvdXAiLCJyZXNlcnZhdGlvbkl0ZW1zIiwiZGF0ZV9zdGFydCIsImRhdGVfZW5kIiwicmVzZXJ2YXRpb25Db3VudGVyIiwiY2hpbGRyZW4iLCJzdGFydF9kYXRlIiwiZW5kX2RhdGUiLCJyZXNlcnZhdGlvblNlY3Rpb24iLCJyZXNlcnZhdGlvbnMiLCJyZXNlcnZhdGlvbkZvcm0iLCJhZGRSZXNlcnZhdGlvbiIsInN0YXJ0RGF0ZSIsImVuZERhdGUiLCJyZXNlcnZlRGF0YSIsInJlc2VydmF0aW9uUmVzdWx0IiwiY3JlYXRlTmV3TGlrZSIsImxpa2VDb3VudCIsImJ0bkxpa2UiLCJzZXRBdHRyaWJ1dGUiLCJyZXNwb25zZUxpa2VzIiwibGlrZURhdGEiLCJmaW5kIiwibGlrZXMiLCJyZXNwb25zZUludm9sdmVtZW50IiwibGlrZXNSZXN1bHQiLCJmaWx0ZXJBcnJXaXRoTGlrZXMiLCJsaWtlSXRlbSIsInB1c2giLCJmaWx0ZXJXaXRob3V0TGlrZXMiLCJmaWx0ZXIiLCJlbCIsImVsZW1lbnQiLCJtb2RpZml5RmlsdGVyV2l0aG91dExpa2VzIiwiam9pbkFyciIsImNvbmNhdCIsInNvcnQiLCJhIiwiYiIsInNob3dJbWciLCJzaG93SW5mbyIsInNob3dMaWtlQWN0aW9uIiwic2hvd0FjdGlvbnMiLCJjb21tZW50QnRuIiwiZmV0Y2hTaW5nbGVTaG93Q29tbWVudCIsInJlc2VydmF0aW9uQnRuIiwiZmV0Y2hTaW5nbGVTaG93IiwiYXBwZW5kQ2hpbGQiLCJ0b2dnbGUiLCJ3aW5kb3ciLCJvbmxvYWQiLCJmZXRjaFR2U2hvdyJdLCJzb3VyY2VSb290IjoiIn0= --------------------------------------------------------------------------------