PluginProbe
Booking Calendar / 11.9
Booking Calendar v11.9
11.9 11.8.4 11.8.3 11.8.2 11.8.1 11.8 11.7 11.6.1 11.6 11.5 11.4.3 11.4.2 11.4.1 11.4 11.3 11.2.1 11.2 11.1 11.0 10.15.7 10.15.6 10.1.3 10.10 10.10.1 10.10.2 All 205 releases
booking / includes / page-setup-wizard / step-date-time-formats / _out / step-date-time-formats.js

step-date-time-formats.js in Booking Calendar 11.9, at includes/page-setup-wizard/step-date-time-formats/_out/step-date-time-formats.js

333 lines 46.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 "use strict";
2
3 /**
4 * Coordinate the explicit Local translation action on Setup Wizard Step 3.
5 *
6 * Draft date/time controls remain owned by the shared shell. This adapter only
7 * runs after an explicit button click and sends no locale or package URL; the
8 * server derives the current site language and owns the installation target.
9 *
10 * @package Booking Calendar
11 */
12 (function ($, window, document) {
13 'use strict';
14
15 var module_config = window.wpbc_setup_wizard_date_time_formats || {
16 i18n: {}
17 };
18 var request_sequence = 0;
19
20 /**
21 * Extract a safe message from a failed WordPress AJAX response.
22 *
23 * @param {Object} xhr jQuery request object.
24 * @param {Object} adapter_config Module configuration.
25 * @return {string} Human-readable error message.
26 */
27 function get_error_message(xhr, adapter_config) {
28 if (xhr && xhr.responseJSON && xhr.responseJSON.data && xhr.responseJSON.data.message) {
29 return String(xhr.responseJSON.data.message);
30 }
31 return adapter_config.i18n.error || '';
32 }
33
34 /**
35 * Extract authorized operation-console records from an AJAX payload.
36 *
37 * @param {Object} payload WordPress AJAX response data.
38 * @return {Array} Safe console records.
39 */
40 function get_operation_logs(payload) {
41 if (!payload || !Array.isArray(payload.logs)) {
42 return [];
43 }
44 return payload.logs.filter(function (log_entry) {
45 return log_entry && 'string' === typeof log_entry.message;
46 });
47 }
48
49 /**
50 * Append one operation record using text-only DOM output.
51 *
52 * @param {HTMLElement} log_container Console list element.
53 * @param {string} level Authorized severity.
54 * @param {string} message Human-readable operation message.
55 * @return {void}
56 */
57 function append_operation_log(log_container, level, message) {
58 var allowed_levels = ['info', 'success', 'warning', 'error'];
59 var log_entry;
60 if (!log_container || !message) {
61 return;
62 }
63 level = -1 !== allowed_levels.indexOf(level) ? level : 'info';
64 log_entry = document.createElement('li');
65 log_entry.className = 'wpbc_setup_wizard__translation-console-entry is-' + level;
66 log_entry.textContent = String(message);
67 log_container.appendChild(log_entry);
68 }
69
70 /**
71 * Replace the console list with server-authorized operation records.
72 *
73 * @param {HTMLElement} log_container Console list element.
74 * @param {Array} operation_logs Authorized console records.
75 * @return {void}
76 */
77 function render_operation_logs(log_container, operation_logs) {
78 if (!log_container) {
79 return;
80 }
81 log_container.textContent = '';
82 operation_logs.forEach(function (log_entry) {
83 append_operation_log(log_container, String(log_entry.level || 'info'), String(log_entry.message || ''));
84 });
85 }
86
87 /**
88 * Refresh the server-authoritative language and translation-source display.
89 *
90 * @param {HTMLElement} editor Step editor root.
91 * @param {Object} language_context Authorized language response.
92 * @return {void}
93 */
94 function update_language_context(editor, language_context) {
95 var allowed_statuses = ['active', 'available', 'builtin', 'unavailable'];
96 var action_label = editor.querySelector('[data-wpbc-install-local-translation-label]');
97 var action_button = editor.querySelector('[data-wpbc-install-local-translation]');
98 var help = editor.querySelector('[data-wpbc-local-translation-help]');
99 var local_source_recommendation = editor.querySelector('[data-wpbc-local-source-recommendation]');
100 var source = editor.querySelector('[data-wpbc-local-translation-source]');
101 var source_label = editor.querySelector('[data-wpbc-local-translation-source-label]');
102 var status = editor.querySelector('[data-wpbc-local-translation-status]');
103 var updated = editor.querySelector('[data-wpbc-local-translation-updated]');
104 var recommendation = editor.querySelector('[data-wpbc-local-translation-recommendation]');
105 var status_key;
106 if (!language_context) {
107 return;
108 }
109 status_key = -1 !== allowed_statuses.indexOf(language_context.status) ? language_context.status : 'unavailable';
110 if (status) {
111 status.className = 'wpbc_setup_wizard__language-status wpbc_setup_wizard__language-status--' + status_key;
112 status.textContent = String(language_context.status_label || '');
113 }
114 if (help) {
115 help.textContent = String(language_context.help || '');
116 }
117 if (source) {
118 source.setAttribute('data-wpbc-local-translation-source', String(language_context.translation_source || ''));
119 }
120 if (source_label) {
121 source_label.textContent = String(language_context.translation_source_label || '');
122 }
123 if (action_label) {
124 action_label.textContent = String(language_context.action_label || action_label.textContent);
125 }
126 if (action_button) {
127 action_button.classList.toggle('wpbc_setup_wizard__translation-action--recommended', Boolean(language_context.is_local_source_recommended));
128 }
129 if (local_source_recommendation) {
130 local_source_recommendation.textContent = String(language_context.local_source_recommendation || '');
131 local_source_recommendation.hidden = !language_context.is_local_source_recommended || !language_context.local_source_recommendation;
132 }
133 if (updated) {
134 updated.textContent = String(language_context.updated_label || '');
135 updated.hidden = !language_context.updated_label;
136 }
137 if (recommendation) {
138 recommendation.textContent = String(language_context.update_recommendation || '');
139 recommendation.hidden = !language_context.is_update_recommended || !language_context.update_recommendation;
140 }
141 }
142
143 /**
144 * Create the shell adapter for the Step 3 explicit action.
145 *
146 * @param {Object} adapter_config Localized module configuration.
147 * @return {Object} Shared shell adapter.
148 */
149 function create_date_time_formats_adapter(adapter_config) {
150 var services = null;
151 var root = null;
152 var editor = null;
153 adapter_config = adapter_config || {
154 i18n: {}
155 };
156 adapter_config.i18n = adapter_config.i18n || {};
157 return {
158 /**
159 * Bind the Local translation action when it is authorized and rendered.
160 *
161 * @param {Object} shell_services Domain-neutral shell services.
162 * @return {void}
163 */
164 initialize: function (shell_services) {
165 services = shell_services;
166 root = shell_services.root;
167 editor = root.querySelector('[data-wpbc-date-time-formats-editor]');
168 if (!editor) {
169 return;
170 }
171 editor.addEventListener('click', function (event) {
172 var install_button = event.target.closest('[data-wpbc-install-local-translation]');
173 var feedback;
174 var operation_console;
175 var console_log;
176 var console_state;
177 var source;
178 var source_label;
179 var previous_source;
180 var previous_source_label;
181 var reload_pending = false;
182 var sequence;
183 var request_id;
184 var request;
185 if (!install_button) {
186 return;
187 }
188 event.preventDefault();
189 feedback = editor.querySelector('[data-wpbc-local-translation-feedback]');
190 operation_console = editor.querySelector('[data-wpbc-local-translation-console]');
191 console_log = editor.querySelector('[data-wpbc-local-translation-console-log]');
192 console_state = editor.querySelector('[data-wpbc-local-translation-console-state]');
193 source = editor.querySelector('[data-wpbc-local-translation-source]');
194 source_label = editor.querySelector('[data-wpbc-local-translation-source-label]');
195 previous_source = source ? source.getAttribute('data-wpbc-local-translation-source') : '';
196 previous_source_label = source_label ? source_label.textContent : '';
197 request_sequence += 1;
198 sequence = request_sequence;
199 request_id = 'translation_' + Date.now() + '_' + sequence;
200 if (feedback) {
201 feedback.classList.remove('is-error', 'is-success');
202 feedback.textContent = '';
203 }
204 if (operation_console) {
205 operation_console.hidden = false;
206 operation_console.setAttribute('aria-busy', 'true');
207 if ('function' === typeof operation_console.scrollIntoView) {
208 operation_console.scrollIntoView({
209 block: 'nearest'
210 });
211 }
212 }
213 if (console_state) {
214 console_state.textContent = adapter_config.i18n.working || '';
215 }
216 if (console_log) {
217 console_log.textContent = '';
218 append_operation_log(console_log, 'info', adapter_config.i18n.connecting || adapter_config.i18n.working || '');
219 append_operation_log(console_log, 'info', adapter_config.i18n.working || '');
220 }
221 if (source) {
222 source.setAttribute('data-wpbc-local-translation-source', 'wpbc');
223 }
224 if (source_label) {
225 source_label.textContent = adapter_config.i18n.local_source_label || previous_source_label;
226 }
227 install_button.disabled = true;
228 services.set_status(adapter_config.i18n.working || '');
229 request = $.ajax({
230 url: adapter_config.ajax_url,
231 method: 'POST',
232 dataType: 'json',
233 data: {
234 action: adapter_config.action,
235 nonce: adapter_config.nonce,
236 request_id: request_id
237 }
238 });
239 request.done(function (response) {
240 var operation_logs;
241 if (sequence !== request_sequence || !response || !response.success || !response.data || response.data.request_id !== request_id) {
242 return;
243 }
244 operation_logs = get_operation_logs(response.data);
245 render_operation_logs(console_log, operation_logs);
246 if (console_state) {
247 console_state.textContent = adapter_config.i18n.complete || '';
248 }
249 if (feedback) {
250 feedback.classList.add('is-success');
251 feedback.textContent = String(response.data.message || '');
252 }
253 update_language_context(editor, response.data.language);
254 services.set_status(String(response.data.message || ''));
255 if (true === response.data.reload_page) {
256 reload_pending = true;
257 if (console_state) {
258 console_state.textContent = adapter_config.i18n.reloading || adapter_config.i18n.complete || '';
259 }
260 window.setTimeout(function () {
261 window.location.reload();
262 }, 250);
263 }
264 });
265 request.fail(function (xhr) {
266 var message;
267 var response_data;
268 var operation_logs;
269 if (sequence !== request_sequence) {
270 return;
271 }
272 message = get_error_message(xhr, adapter_config);
273 response_data = xhr && xhr.responseJSON ? xhr.responseJSON.data : null;
274 operation_logs = get_operation_logs(response_data);
275 if (response_data && response_data.language) {
276 update_language_context(editor, response_data.language);
277 } else {
278 if (source) {
279 source.setAttribute('data-wpbc-local-translation-source', previous_source || '');
280 }
281 if (source_label) {
282 source_label.textContent = previous_source_label || '';
283 }
284 }
285 render_operation_logs(console_log, operation_logs);
286 if (0 === operation_logs.length) {
287 append_operation_log(console_log, 'error', message);
288 }
289 if (console_state) {
290 console_state.textContent = adapter_config.i18n.failed || '';
291 }
292 if (feedback) {
293 feedback.classList.add('is-error');
294 feedback.textContent = message;
295 }
296 services.set_status(message);
297 });
298 request.always(function () {
299 if (sequence === request_sequence && !reload_pending) {
300 install_button.disabled = false;
301 if (operation_console) {
302 operation_console.setAttribute('aria-busy', 'false');
303 }
304 }
305 });
306 });
307 },
308 /**
309 * Step 3 native controls need no draft synchronization.
310 *
311 * @return {void}
312 */
313 sync: function () {},
314 /**
315 * Server and native required-select validation remain authoritative.
316 *
317 * @return {null} No module-specific invalid control.
318 */
319 validate: function () {
320 return null;
321 }
322 };
323 }
324 window.wpbc_setup_editor_modules = window.wpbc_setup_editor_modules || {};
325 window.wpbc_setup_editor_modules.date_time_formats = {
326 create: create_date_time_formats_adapter
327 };
328 if (window.wpbc_setup_wizard_api && 'function' === typeof window.wpbc_setup_wizard_api.register_step_adapter) {
329 window.wpbc_setup_wizard_api.register_step_adapter(create_date_time_formats_adapter(module_config));
330 }
331 })(jQuery, window, document);
332 //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1zZXR1cC13aXphcmQvc3RlcC1kYXRlLXRpbWUtZm9ybWF0cy9fb3V0L3N0ZXAtZGF0ZS10aW1lLWZvcm1hdHMuanMiLCJuYW1lcyI6WyIkIiwid2luZG93IiwiZG9jdW1lbnQiLCJtb2R1bGVfY29uZmlnIiwid3BiY19zZXR1cF93aXphcmRfZGF0ZV90aW1lX2Zvcm1hdHMiLCJpMThuIiwicmVxdWVzdF9zZXF1ZW5jZSIsImdldF9lcnJvcl9tZXNzYWdlIiwieGhyIiwiYWRhcHRlcl9jb25maWciLCJyZXNwb25zZUpTT04iLCJkYXRhIiwibWVzc2FnZSIsIlN0cmluZyIsImVycm9yIiwiZ2V0X29wZXJhdGlvbl9sb2dzIiwicGF5bG9hZCIsIkFycmF5IiwiaXNBcnJheSIsImxvZ3MiLCJmaWx0ZXIiLCJsb2dfZW50cnkiLCJhcHBlbmRfb3BlcmF0aW9uX2xvZyIsImxvZ19jb250YWluZXIiLCJsZXZlbCIsImFsbG93ZWRfbGV2ZWxzIiwiaW5kZXhPZiIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJ0ZXh0Q29udGVudCIsImFwcGVuZENoaWxkIiwicmVuZGVyX29wZXJhdGlvbl9sb2dzIiwib3BlcmF0aW9uX2xvZ3MiLCJmb3JFYWNoIiwidXBkYXRlX2xhbmd1YWdlX2NvbnRleHQiLCJlZGl0b3IiLCJsYW5ndWFnZV9jb250ZXh0IiwiYWxsb3dlZF9zdGF0dXNlcyIsImFjdGlvbl9sYWJlbCIsInF1ZXJ5U2VsZWN0b3IiLCJhY3Rpb25fYnV0dG9uIiwiaGVscCIsImxvY2FsX3NvdXJjZV9yZWNvbW1lbmRhdGlvbiIsInNvdXJjZSIsInNvdXJjZV9sYWJlbCIsInN0YXR1cyIsInVwZGF0ZWQiLCJyZWNvbW1lbmRhdGlvbiIsInN0YXR1c19rZXkiLCJzdGF0dXNfbGFiZWwiLCJzZXRBdHRyaWJ1dGUiLCJ0cmFuc2xhdGlvbl9zb3VyY2UiLCJ0cmFuc2xhdGlvbl9zb3VyY2VfbGFiZWwiLCJjbGFzc0xpc3QiLCJ0b2dnbGUiLCJCb29sZWFuIiwiaXNfbG9jYWxfc291cmNlX3JlY29tbWVuZGVkIiwiaGlkZGVuIiwidXBkYXRlZF9sYWJlbCIsInVwZGF0ZV9yZWNvbW1lbmRhdGlvbiIsImlzX3VwZGF0ZV9yZWNvbW1lbmRlZCIsImNyZWF0ZV9kYXRlX3RpbWVfZm9ybWF0c19hZGFwdGVyIiwic2VydmljZXMiLCJyb290IiwiaW5pdGlhbGl6ZSIsInNoZWxsX3NlcnZpY2VzIiwiYWRkRXZlbnRMaXN0ZW5lciIsImV2ZW50IiwiaW5zdGFsbF9idXR0b24iLCJ0YXJnZXQiLCJjbG9zZXN0IiwiZmVlZGJhY2siLCJvcGVyYXRpb25fY29uc29sZSIsImNvbnNvbGVfbG9nIiwiY29uc29sZV9zdGF0ZSIsInByZXZpb3VzX3NvdXJjZSIsInByZXZpb3VzX3NvdXJjZV9sYWJlbCIsInJlbG9hZF9wZW5kaW5nIiwic2VxdWVuY2UiLCJyZXF1ZXN0X2lkIiwicmVxdWVzdCIsInByZXZlbnREZWZhdWx0IiwiZ2V0QXR0cmlidXRlIiwiRGF0ZSIsIm5vdyIsInJlbW92ZSIsInNjcm9sbEludG9WaWV3IiwiYmxvY2siLCJ3b3JraW5nIiwiY29ubmVjdGluZyIsImxvY2FsX3NvdXJjZV9sYWJlbCIsImRpc2FibGVkIiwic2V0X3N0YXR1cyIsImFqYXgiLCJ1cmwiLCJhamF4X3VybCIsIm1ldGhvZCIsImRhdGFUeXBlIiwiYWN0aW9uIiwibm9uY2UiLCJkb25lIiwicmVzcG9uc2UiLCJzdWNjZXNzIiwiY29tcGxldGUiLCJhZGQiLCJsYW5ndWFnZSIsInJlbG9hZF9wYWdlIiwicmVsb2FkaW5nIiwic2V0VGltZW91dCIsImxvY2F0aW9uIiwicmVsb2FkIiwiZmFpbCIsInJlc3BvbnNlX2RhdGEiLCJsZW5ndGgiLCJmYWlsZWQiLCJhbHdheXMiLCJzeW5jIiwidmFsaWRhdGUiLCJ3cGJjX3NldHVwX2VkaXRvcl9tb2R1bGVzIiwiZGF0ZV90aW1lX2Zvcm1hdHMiLCJjcmVhdGUiLCJ3cGJjX3NldHVwX3dpemFyZF9hcGkiLCJyZWdpc3Rlcl9zdGVwX2FkYXB0ZXIiLCJqUXVlcnkiXSwic291cmNlcyI6WyJpbmNsdWRlcy9wYWdlLXNldHVwLXdpemFyZC9zdGVwLWRhdGUtdGltZS1mb3JtYXRzL19zcmMvc3RlcC1kYXRlLXRpbWUtZm9ybWF0cy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvb3JkaW5hdGUgdGhlIGV4cGxpY2l0IExvY2FsIHRyYW5zbGF0aW9uIGFjdGlvbiBvbiBTZXR1cCBXaXphcmQgU3RlcCAzLlxuICpcbiAqIERyYWZ0IGRhdGUvdGltZSBjb250cm9scyByZW1haW4gb3duZWQgYnkgdGhlIHNoYXJlZCBzaGVsbC4gVGhpcyBhZGFwdGVyIG9ubHlcbiAqIHJ1bnMgYWZ0ZXIgYW4gZXhwbGljaXQgYnV0dG9uIGNsaWNrIGFuZCBzZW5kcyBubyBsb2NhbGUgb3IgcGFja2FnZSBVUkw7IHRoZVxuICogc2VydmVyIGRlcml2ZXMgdGhlIGN1cnJlbnQgc2l0ZSBsYW5ndWFnZSBhbmQgb3ducyB0aGUgaW5zdGFsbGF0aW9uIHRhcmdldC5cbiAqXG4gKiBAcGFja2FnZSBCb29raW5nIENhbGVuZGFyXG4gKi9cbiggZnVuY3Rpb24gKCAkLCB3aW5kb3csIGRvY3VtZW50ICkge1xuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIG1vZHVsZV9jb25maWcgPSB3aW5kb3cud3BiY19zZXR1cF93aXphcmRfZGF0ZV90aW1lX2Zvcm1hdHMgfHwgeyBpMThuOiB7fSB9O1xuXHR2YXIgcmVxdWVzdF9zZXF1ZW5jZSA9IDA7XG5cblx0LyoqXG5cdCAqIEV4dHJhY3QgYSBzYWZlIG1lc3NhZ2UgZnJvbSBhIGZhaWxlZCBXb3JkUHJlc3MgQUpBWCByZXNwb25zZS5cblx0ICpcblx0ICogQHBhcmFtIHtPYmplY3R9IHhociAgICAgICAgICAgIGpRdWVyeSByZXF1ZXN0IG9iamVjdC5cblx0ICogQHBhcmFtIHtPYmplY3R9IGFkYXB0ZXJfY29uZmlnIE1vZHVsZSBjb25maWd1cmF0aW9uLlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuXG5cdCAqL1xuXHRmdW5jdGlvbiBnZXRfZXJyb3JfbWVzc2FnZSggeGhyLCBhZGFwdGVyX2NvbmZpZyApIHtcblx0XHRpZiAoIHhociAmJiB4aHIucmVzcG9uc2VKU09OICYmIHhoci5yZXNwb25zZUpTT04uZGF0YSAmJiB4aHIucmVzcG9uc2VKU09OLmRhdGEubWVzc2FnZSApIHtcblx0XHRcdHJldHVybiBTdHJpbmcoIHhoci5yZXNwb25zZUpTT04uZGF0YS5tZXNzYWdlICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFkYXB0ZXJfY29uZmlnLmkxOG4uZXJyb3IgfHwgJyc7XG5cdH1cblxuXHQvKipcblx0ICogRXh0cmFjdCBhdXRob3JpemVkIG9wZXJhdGlvbi1jb25zb2xlIHJlY29yZHMgZnJvbSBhbiBBSkFYIHBheWxvYWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkIFdvcmRQcmVzcyBBSkFYIHJlc3BvbnNlIGRhdGEuXG5cdCAqIEByZXR1cm4ge0FycmF5fSBTYWZlIGNvbnNvbGUgcmVjb3Jkcy5cblx0ICovXG5cdGZ1bmN0aW9uIGdldF9vcGVyYXRpb25fbG9ncyggcGF5bG9hZCApIHtcblx0XHRpZiAoICEgcGF5bG9hZCB8fCAhIEFycmF5LmlzQXJyYXkoIHBheWxvYWQubG9ncyApICkge1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdHJldHVybiBwYXlsb2FkLmxvZ3MuZmlsdGVyKCBmdW5jdGlvbiAoIGxvZ19lbnRyeSApIHtcblx0XHRcdHJldHVybiBsb2dfZW50cnkgJiYgJ3N0cmluZycgPT09IHR5cGVvZiBsb2dfZW50cnkubWVzc2FnZTtcblx0XHR9ICk7XG5cdH1cblxuXHQvKipcblx0ICogQXBwZW5kIG9uZSBvcGVyYXRpb24gcmVjb3JkIHVzaW5nIHRleHQtb25seSBET00gb3V0cHV0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBsb2dfY29udGFpbmVyIENvbnNvbGUgbGlzdCBlbGVtZW50LlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gICAgICBsZXZlbCAgICAgICAgIEF1dGhvcml6ZWQgc2V2ZXJpdHkuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSAgICAgIG1lc3NhZ2UgICAgICAgSHVtYW4tcmVhZGFibGUgb3BlcmF0aW9uIG1lc3NhZ2UuXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRmdW5jdGlvbiBhcHBlbmRfb3BlcmF0aW9uX2xvZyggbG9nX2NvbnRhaW5lciwgbGV2ZWwsIG1lc3NhZ2UgKSB7XG5cdFx0dmFyIGFsbG93ZWRfbGV2ZWxzID0gWyAnaW5mbycsICdzdWNjZXNzJywgJ3dhcm5pbmcnLCAnZXJyb3InIF07XG5cdFx0dmFyIGxvZ19lbnRyeTtcblxuXHRcdGlmICggISBsb2dfY29udGFpbmVyIHx8ICEgbWVzc2FnZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRsZXZlbCA9IC0xICE9PSBhbGxvd2VkX2xldmVscy5pbmRleE9mKCBsZXZlbCApID8gbGV2ZWwgOiAnaW5mbyc7XG5cdFx0bG9nX2VudHJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2xpJyApO1xuXHRcdGxvZ19lbnRyeS5jbGFzc05hbWUgPSAnd3BiY19zZXR1cF93aXphcmRfX3RyYW5zbGF0aW9uLWNvbnNvbGUtZW50cnkgaXMtJyArIGxldmVsO1xuXHRcdGxvZ19lbnRyeS50ZXh0Q29udGVudCA9IFN0cmluZyggbWVzc2FnZSApO1xuXHRcdGxvZ19jb250YWluZXIuYXBwZW5kQ2hpbGQoIGxvZ19lbnRyeSApO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcGxhY2UgdGhlIGNvbnNvbGUgbGlzdCB3aXRoIHNlcnZlci1hdXRob3JpemVkIG9wZXJhdGlvbiByZWNvcmRzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBsb2dfY29udGFpbmVyIENvbnNvbGUgbGlzdCBlbGVtZW50LlxuXHQgKiBAcGFyYW0ge0FycmF5fSAgICAgICBvcGVyYXRpb25fbG9ncyBBdXRob3JpemVkIGNvbnNvbGUgcmVjb3Jkcy5cblx0ICogQHJldHVybiB7dm9pZH1cblx0ICovXG5cdGZ1bmN0aW9uIHJlbmRlcl9vcGVyYXRpb25fbG9ncyggbG9nX2NvbnRhaW5lciwgb3BlcmF0aW9uX2xvZ3MgKSB7XG5cdFx0aWYgKCAhIGxvZ19jb250YWluZXIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bG9nX2NvbnRhaW5lci50ZXh0Q29udGVudCA9ICcnO1xuXHRcdG9wZXJhdGlvbl9sb2dzLmZvckVhY2goIGZ1bmN0aW9uICggbG9nX2VudHJ5ICkge1xuXHRcdFx0YXBwZW5kX29wZXJhdGlvbl9sb2coIGxvZ19jb250YWluZXIsIFN0cmluZyggbG9nX2VudHJ5LmxldmVsIHx8ICdpbmZvJyApLCBTdHJpbmcoIGxvZ19lbnRyeS5tZXNzYWdlIHx8ICcnICkgKTtcblx0XHR9ICk7XG5cdH1cblxuXHQvKipcblx0ICogUmVmcmVzaCB0aGUgc2VydmVyLWF1dGhvcml0YXRpdmUgbGFuZ3VhZ2UgYW5kIHRyYW5zbGF0aW9uLXNvdXJjZSBkaXNwbGF5LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlZGl0b3IgICAgICAgICAgIFN0ZXAgZWRpdG9yIHJvb3QuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSAgICAgIGxhbmd1YWdlX2NvbnRleHQgQXV0aG9yaXplZCBsYW5ndWFnZSByZXNwb25zZS5cblx0ICogQHJldHVybiB7dm9pZH1cblx0ICovXG5cdGZ1bmN0aW9uIHVwZGF0ZV9sYW5ndWFnZV9jb250ZXh0KCBlZGl0b3IsIGxhbmd1YWdlX2NvbnRleHQgKSB7XG5cdFx0dmFyIGFsbG93ZWRfc3RhdHVzZXMgPSBbICdhY3RpdmUnLCAnYXZhaWxhYmxlJywgJ2J1aWx0aW4nLCAndW5hdmFpbGFibGUnIF07XG5cdFx0dmFyIGFjdGlvbl9sYWJlbCA9IGVkaXRvci5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtd3BiYy1pbnN0YWxsLWxvY2FsLXRyYW5zbGF0aW9uLWxhYmVsXScgKTtcblx0XHR2YXIgYWN0aW9uX2J1dHRvbiA9IGVkaXRvci5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtd3BiYy1pbnN0YWxsLWxvY2FsLXRyYW5zbGF0aW9uXScgKTtcblx0XHR2YXIgaGVscCA9IGVkaXRvci5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtd3BiYy1sb2NhbC10cmFuc2xhdGlvbi1oZWxwXScgKTtcblx0XHR2YXIgbG9jYWxfc291cmNlX3JlY29tbWVuZGF0aW9uID0gZWRpdG9yLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLWxvY2FsLXNvdXJjZS1yZWNvbW1lbmRhdGlvbl0nICk7XG5cdFx0dmFyIHNvdXJjZSA9IGVkaXRvci5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtd3BiYy1sb2NhbC10cmFuc2xhdGlvbi1zb3VyY2VdJyApO1xuXHRcdHZhciBzb3VyY2VfbGFiZWwgPSBlZGl0b3IucXVlcnlTZWxlY3RvciggJ1tkYXRhLXdwYmMtbG9jYWwtdHJhbnNsYXRpb24tc291cmNlLWxhYmVsXScgKTtcblx0XHR2YXIgc3RhdHVzID0gZWRpdG9yLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLWxvY2FsLXRyYW5zbGF0aW9uLXN0YXR1c10nICk7XG5cdFx0dmFyIHVwZGF0ZWQgPSBlZGl0b3IucXVlcnlTZWxlY3RvciggJ1tkYXRhLXdwYmMtbG9jYWwtdHJhbnNsYXRpb24tdXBkYXRlZF0nICk7XG5cdFx0dmFyIHJlY29tbWVuZGF0aW9uID0gZWRpdG9yLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLWxvY2FsLXRyYW5zbGF0aW9uLXJlY29tbWVuZGF0aW9uXScgKTtcblx0XHR2YXIgc3RhdHVzX2tleTtcblxuXHRcdGlmICggISBsYW5ndWFnZV9jb250ZXh0ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHN0YXR1c19rZXkgPSAtMSAhPT0gYWxsb3dlZF9zdGF0dXNlcy5pbmRleE9mKCBsYW5ndWFnZV9jb250ZXh0LnN0YXR1cyApID8gbGFuZ3VhZ2VfY29udGV4dC5zdGF0dXMgOiAndW5hdmFpbGFibGUnO1xuXHRcdGlmICggc3RhdHVzICkge1xuXHRcdFx0c3RhdHVzLmNsYXNzTmFtZSA9ICd3cGJjX3NldHVwX3dpemFyZF9fbGFuZ3VhZ2Utc3RhdHVzIHdwYmNfc2V0dXBfd2l6YXJkX19sYW5ndWFnZS1zdGF0dXMtLScgKyBzdGF0dXNfa2V5O1xuXHRcdFx0c3RhdHVzLnRleHRDb250ZW50ID0gU3RyaW5nKCBsYW5ndWFnZV9jb250ZXh0LnN0YXR1c19sYWJlbCB8fCAnJyApO1xuXHRcdH1cblx0XHRpZiAoIGhlbHAgKSB7XG5cdFx0XHRoZWxwLnRleHRDb250ZW50ID0gU3RyaW5nKCBsYW5ndWFnZV9jb250ZXh0LmhlbHAgfHwgJycgKTtcblx0XHR9XG5cdFx0aWYgKCBzb3VyY2UgKSB7XG5cdFx0XHRzb3VyY2Uuc2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWxvY2FsLXRyYW5zbGF0aW9uLXNvdXJjZScsIFN0cmluZyggbGFuZ3VhZ2VfY29udGV4dC50cmFuc2xhdGlvbl9zb3VyY2UgfHwgJycgKSApO1xuXHRcdH1cblx0XHRpZiAoIHNvdXJjZV9sYWJlbCApIHtcblx0XHRcdHNvdXJjZV9sYWJlbC50ZXh0Q29udGVudCA9IFN0cmluZyggbGFuZ3VhZ2VfY29udGV4dC50cmFuc2xhdGlvbl9zb3VyY2VfbGFiZWwgfHwgJycgKTtcblx0XHR9XG5cdFx0aWYgKCBhY3Rpb25fbGFiZWwgKSB7XG5cdFx0XHRhY3Rpb25fbGFiZWwudGV4dENvbnRlbnQgPSBTdHJpbmcoIGxhbmd1YWdlX2NvbnRleHQuYWN0aW9uX2xhYmVsIHx8IGFjdGlvbl9sYWJlbC50ZXh0Q29udGVudCApO1xuXHRcdH1cblx0XHRpZiAoIGFjdGlvbl9idXR0b24gKSB7XG5cdFx0XHRhY3Rpb25fYnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoICd3cGJjX3NldHVwX3dpemFyZF9fdHJhbnNsYXRpb24tYWN0aW9uLS1yZWNvbW1lbmRlZCcsIEJvb2xlYW4oIGxhbmd1YWdlX2NvbnRleHQuaXNfbG9jYWxfc291cmNlX3JlY29tbWVuZGVkICkgKTtcblx0XHR9XG5cdFx0aWYgKCBsb2NhbF9zb3VyY2VfcmVjb21tZW5kYXRpb24gKSB7XG5cdFx0XHRsb2NhbF9zb3VyY2VfcmVjb21tZW5kYXRpb24udGV4dENvbnRlbnQgPSBTdHJpbmcoIGxhbmd1YWdlX2NvbnRleHQubG9jYWxfc291cmNlX3JlY29tbWVuZGF0aW9uIHx8ICcnICk7XG5cdFx0XHRsb2NhbF9zb3VyY2VfcmVjb21tZW5kYXRpb24uaGlkZGVuID0gISBsYW5ndWFnZV9jb250ZXh0LmlzX2xvY2FsX3NvdXJjZV9yZWNvbW1lbmRlZCB8fCAhIGxhbmd1YWdlX2NvbnRleHQubG9jYWxfc291cmNlX3JlY29tbWVuZGF0aW9uO1xuXHRcdH1cblx0XHRpZiAoIHVwZGF0ZWQgKSB7XG5cdFx0XHR1cGRhdGVkLnRleHRDb250ZW50ID0gU3RyaW5nKCBsYW5ndWFnZV9jb250ZXh0LnVwZGF0ZWRfbGFiZWwgfHwgJycgKTtcblx0XHRcdHVwZGF0ZWQuaGlkZGVuID0gISBsYW5ndWFnZV9jb250ZXh0LnVwZGF0ZWRfbGFiZWw7XG5cdFx0fVxuXHRcdGlmICggcmVjb21tZW5kYXRpb24gKSB7XG5cdFx0XHRyZWNvbW1lbmRhdGlvbi50ZXh0Q29udGVudCA9IFN0cmluZyggbGFuZ3VhZ2VfY29udGV4dC51cGRhdGVfcmVjb21tZW5kYXRpb24gfHwgJycgKTtcblx0XHRcdHJlY29tbWVuZGF0aW9uLmhpZGRlbiA9ICEgbGFuZ3VhZ2VfY29udGV4dC5pc191cGRhdGVfcmVjb21tZW5kZWQgfHwgISBsYW5ndWFnZV9jb250ZXh0LnVwZGF0ZV9yZWNvbW1lbmRhdGlvbjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIHRoZSBzaGVsbCBhZGFwdGVyIGZvciB0aGUgU3RlcCAzIGV4cGxpY2l0IGFjdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHtPYmplY3R9IGFkYXB0ZXJfY29uZmlnIExvY2FsaXplZCBtb2R1bGUgY29uZmlndXJhdGlvbi5cblx0ICogQHJldHVybiB7T2JqZWN0fSBTaGFyZWQgc2hlbGwgYWRhcHRlci5cblx0ICovXG5cdGZ1bmN0aW9uIGNyZWF0ZV9kYXRlX3RpbWVfZm9ybWF0c19hZGFwdGVyKCBhZGFwdGVyX2NvbmZpZyApIHtcblx0XHR2YXIgc2VydmljZXMgPSBudWxsO1xuXHRcdHZhciByb290ID0gbnVsbDtcblx0XHR2YXIgZWRpdG9yID0gbnVsbDtcblx0XHRhZGFwdGVyX2NvbmZpZyA9IGFkYXB0ZXJfY29uZmlnIHx8IHsgaTE4bjoge30gfTtcblx0XHRhZGFwdGVyX2NvbmZpZy5pMThuID0gYWRhcHRlcl9jb25maWcuaTE4biB8fCB7fTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIEJpbmQgdGhlIExvY2FsIHRyYW5zbGF0aW9uIGFjdGlvbiB3aGVuIGl0IGlzIGF1dGhvcml6ZWQgYW5kIHJlbmRlcmVkLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBzaGVsbF9zZXJ2aWNlcyBEb21haW4tbmV1dHJhbCBzaGVsbCBzZXJ2aWNlcy5cblx0XHRcdCAqIEByZXR1cm4ge3ZvaWR9XG5cdFx0XHQgKi9cblx0XHRcdGluaXRpYWxpemU6IGZ1bmN0aW9uICggc2hlbGxfc2VydmljZXMgKSB7XG5cdFx0XHRcdHNlcnZpY2VzID0gc2hlbGxfc2VydmljZXM7XG5cdFx0XHRcdHJvb3QgPSBzaGVsbF9zZXJ2aWNlcy5yb290O1xuXHRcdFx0XHRlZGl0b3IgPSByb290LnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLWRhdGUtdGltZS1mb3JtYXRzLWVkaXRvcl0nICk7XG5cblx0XHRcdFx0aWYgKCAhIGVkaXRvciApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgZnVuY3Rpb24gKCBldmVudCApIHtcblx0XHRcdFx0XHR2YXIgaW5zdGFsbF9idXR0b24gPSBldmVudC50YXJnZXQuY2xvc2VzdCggJ1tkYXRhLXdwYmMtaW5zdGFsbC1sb2NhbC10cmFuc2xhdGlvbl0nICk7XG5cdFx0XHRcdFx0dmFyIGZlZWRiYWNrO1xuXHRcdFx0XHRcdHZhciBvcGVyYXRpb25fY29uc29sZTtcblx0XHRcdFx0XHR2YXIgY29uc29sZV9sb2c7XG5cdFx0XHRcdFx0dmFyIGNvbnNvbGVfc3RhdGU7XG5cdFx0XHRcdFx0dmFyIHNvdXJjZTtcblx0XHRcdFx0XHR2YXIgc291cmNlX2xhYmVsO1xuXHRcdFx0XHRcdHZhciBwcmV2aW91c19zb3VyY2U7XG5cdFx0XHRcdFx0dmFyIHByZXZpb3VzX3NvdXJjZV9sYWJlbDtcblx0XHRcdFx0XHR2YXIgcmVsb2FkX3BlbmRpbmcgPSBmYWxzZTtcblx0XHRcdFx0XHR2YXIgc2VxdWVuY2U7XG5cdFx0XHRcdFx0dmFyIHJlcXVlc3RfaWQ7XG5cdFx0XHRcdFx0dmFyIHJlcXVlc3Q7XG5cblx0XHRcdFx0XHRpZiAoICEgaW5zdGFsbF9idXR0b24gKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRmZWVkYmFjayA9IGVkaXRvci5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtd3BiYy1sb2NhbC10cmFuc2xhdGlvbi1mZWVkYmFja10nICk7XG5cdFx0XHRcdFx0b3BlcmF0aW9uX2NvbnNvbGUgPSBlZGl0b3IucXVlcnlTZWxlY3RvciggJ1tkYXRhLXdwYmMtbG9jYWwtdHJhbnNsYXRpb24tY29uc29sZV0nICk7XG5cdFx0XHRcdFx0Y29uc29sZV9sb2cgPSBlZGl0b3IucXVlcnlTZWxlY3RvciggJ1tkYXRhLXdwYmMtbG9jYWwtdHJhbnNsYXRpb24tY29uc29sZS1sb2ddJyApO1xuXHRcdFx0XHRcdGNvbnNvbGVfc3RhdGUgPSBlZGl0b3IucXVlcnlTZWxlY3RvciggJ1tkYXRhLXdwYmMtbG9jYWwtdHJhbnNsYXRpb24tY29uc29sZS1zdGF0ZV0nICk7XG5cdFx0XHRcdFx0c291cmNlID0gZWRpdG9yLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLWxvY2FsLXRyYW5zbGF0aW9uLXNvdXJjZV0nICk7XG5cdFx0XHRcdFx0c291cmNlX2xhYmVsID0gZWRpdG9yLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLWxvY2FsLXRyYW5zbGF0aW9uLXNvdXJjZS1sYWJlbF0nICk7XG5cdFx0XHRcdFx0cHJldmlvdXNfc291cmNlID0gc291cmNlID8gc291cmNlLmdldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1sb2NhbC10cmFuc2xhdGlvbi1zb3VyY2UnICkgOiAnJztcblx0XHRcdFx0XHRwcmV2aW91c19zb3VyY2VfbGFiZWwgPSBzb3VyY2VfbGFiZWwgPyBzb3VyY2VfbGFiZWwudGV4dENvbnRlbnQgOiAnJztcblx0XHRcdFx0XHRyZXF1ZXN0X3NlcXVlbmNlICs9IDE7XG5cdFx0XHRcdFx0c2VxdWVuY2UgPSByZXF1ZXN0X3NlcXVlbmNlO1xuXHRcdFx0XHRcdHJlcXVlc3RfaWQgPSAndHJhbnNsYXRpb25fJyArIERhdGUubm93KCkgKyAnXycgKyBzZXF1ZW5jZTtcblxuXHRcdFx0XHRcdGlmICggZmVlZGJhY2sgKSB7XG5cdFx0XHRcdFx0XHRmZWVkYmFjay5jbGFzc0xpc3QucmVtb3ZlKCAnaXMtZXJyb3InLCAnaXMtc3VjY2VzcycgKTtcblx0XHRcdFx0XHRcdGZlZWRiYWNrLnRleHRDb250ZW50ID0gJyc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggb3BlcmF0aW9uX2NvbnNvbGUgKSB7XG5cdFx0XHRcdFx0XHRvcGVyYXRpb25fY29uc29sZS5oaWRkZW4gPSBmYWxzZTtcblx0XHRcdFx0XHRcdG9wZXJhdGlvbl9jb25zb2xlLnNldEF0dHJpYnV0ZSggJ2FyaWEtYnVzeScsICd0cnVlJyApO1xuXHRcdFx0XHRcdFx0aWYgKCAnZnVuY3Rpb24nID09PSB0eXBlb2Ygb3BlcmF0aW9uX2NvbnNvbGUuc2Nyb2xsSW50b1ZpZXcgKSB7XG5cdFx0XHRcdFx0XHRcdG9wZXJhdGlvbl9jb25zb2xlLnNjcm9sbEludG9WaWV3KCB7IGJsb2NrOiAnbmVhcmVzdCcgfSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIGNvbnNvbGVfc3RhdGUgKSB7XG5cdFx0XHRcdFx0XHRjb25zb2xlX3N0YXRlLnRleHRDb250ZW50ID0gYWRhcHRlcl9jb25maWcuaTE4bi53b3JraW5nIHx8ICcnO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIGNvbnNvbGVfbG9nICkge1xuXHRcdFx0XHRcdFx0Y29uc29sZV9sb2cudGV4dENvbnRlbnQgPSAnJztcblx0XHRcdFx0XHRcdGFwcGVuZF9vcGVyYXRpb25fbG9nKCBjb25zb2xlX2xvZywgJ2luZm8nLCBhZGFwdGVyX2NvbmZpZy5pMThuLmNvbm5lY3RpbmcgfHwgYWRhcHRlcl9jb25maWcuaTE4bi53b3JraW5nIHx8ICcnICk7XG5cdFx0XHRcdFx0XHRhcHBlbmRfb3BlcmF0aW9uX2xvZyggY29uc29sZV9sb2csICdpbmZvJywgYWRhcHRlcl9jb25maWcuaTE4bi53b3JraW5nIHx8ICcnICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggc291cmNlICkge1xuXHRcdFx0XHRcdFx0c291cmNlLnNldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1sb2NhbC10cmFuc2xhdGlvbi1zb3VyY2UnLCAnd3BiYycgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBzb3VyY2VfbGFiZWwgKSB7XG5cdFx0XHRcdFx0XHRzb3VyY2VfbGFiZWwudGV4dENvbnRlbnQgPSBhZGFwdGVyX2NvbmZpZy5pMThuLmxvY2FsX3NvdXJjZV9sYWJlbCB8fCBwcmV2aW91c19zb3VyY2VfbGFiZWw7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aW5zdGFsbF9idXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHNlcnZpY2VzLnNldF9zdGF0dXMoIGFkYXB0ZXJfY29uZmlnLmkxOG4ud29ya2luZyB8fCAnJyApO1xuXHRcdFx0XHRcdHJlcXVlc3QgPSAkLmFqYXgoIHtcblx0XHRcdFx0XHRcdHVybDogYWRhcHRlcl9jb25maWcuYWpheF91cmwsXG5cdFx0XHRcdFx0XHRtZXRob2Q6ICdQT1NUJyxcblx0XHRcdFx0XHRcdGRhdGFUeXBlOiAnanNvbicsXG5cdFx0XHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0XHRcdGFjdGlvbjogYWRhcHRlcl9jb25maWcuYWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRub25jZTogYWRhcHRlcl9jb25maWcubm9uY2UsXG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RfaWQ6IHJlcXVlc3RfaWRcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0XHRyZXF1ZXN0LmRvbmUoIGZ1bmN0aW9uICggcmVzcG9uc2UgKSB7XG5cdFx0XHRcdFx0XHR2YXIgb3BlcmF0aW9uX2xvZ3M7XG5cblx0XHRcdFx0XHRcdGlmICggc2VxdWVuY2UgIT09IHJlcXVlc3Rfc2VxdWVuY2UgfHwgISByZXNwb25zZSB8fCAhIHJlc3BvbnNlLnN1Y2Nlc3MgfHwgISByZXNwb25zZS5kYXRhIHx8IHJlc3BvbnNlLmRhdGEucmVxdWVzdF9pZCAhPT0gcmVxdWVzdF9pZCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRvcGVyYXRpb25fbG9ncyA9IGdldF9vcGVyYXRpb25fbG9ncyggcmVzcG9uc2UuZGF0YSApO1xuXHRcdFx0XHRcdFx0cmVuZGVyX29wZXJhdGlvbl9sb2dzKCBjb25zb2xlX2xvZywgb3BlcmF0aW9uX2xvZ3MgKTtcblx0XHRcdFx0XHRcdGlmICggY29uc29sZV9zdGF0ZSApIHtcblx0XHRcdFx0XHRcdFx0Y29uc29sZV9zdGF0ZS50ZXh0Q29udGVudCA9IGFkYXB0ZXJfY29uZmlnLmkxOG4uY29tcGxldGUgfHwgJyc7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICggZmVlZGJhY2sgKSB7XG5cdFx0XHRcdFx0XHRcdGZlZWRiYWNrLmNsYXNzTGlzdC5hZGQoICdpcy1zdWNjZXNzJyApO1xuXHRcdFx0XHRcdFx0XHRmZWVkYmFjay50ZXh0Q29udGVudCA9IFN0cmluZyggcmVzcG9uc2UuZGF0YS5tZXNzYWdlIHx8ICcnICk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHVwZGF0ZV9sYW5ndWFnZV9jb250ZXh0KCBlZGl0b3IsIHJlc3BvbnNlLmRhdGEubGFuZ3VhZ2UgKTtcblxuXHRcdFx0XHRcdFx0c2VydmljZXMuc2V0X3N0YXR1cyggU3RyaW5nKCByZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJycgKSApO1xuXHRcdFx0XHRcdFx0aWYgKCB0cnVlID09PSByZXNwb25zZS5kYXRhLnJlbG9hZF9wYWdlICkge1xuXHRcdFx0XHRcdFx0XHRyZWxvYWRfcGVuZGluZyA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdGlmICggY29uc29sZV9zdGF0ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlX3N0YXRlLnRleHRDb250ZW50ID0gYWRhcHRlcl9jb25maWcuaTE4bi5yZWxvYWRpbmcgfHwgYWRhcHRlcl9jb25maWcuaTE4bi5jb21wbGV0ZSB8fCAnJztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcblx0XHRcdFx0XHRcdFx0fSwgMjUwICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdFx0cmVxdWVzdC5mYWlsKCBmdW5jdGlvbiAoIHhociApIHtcblx0XHRcdFx0XHRcdHZhciBtZXNzYWdlO1xuXHRcdFx0XHRcdFx0dmFyIHJlc3BvbnNlX2RhdGE7XG5cdFx0XHRcdFx0XHR2YXIgb3BlcmF0aW9uX2xvZ3M7XG5cblx0XHRcdFx0XHRcdGlmICggc2VxdWVuY2UgIT09IHJlcXVlc3Rfc2VxdWVuY2UgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0bWVzc2FnZSA9IGdldF9lcnJvcl9tZXNzYWdlKCB4aHIsIGFkYXB0ZXJfY29uZmlnICk7XG5cdFx0XHRcdFx0XHRyZXNwb25zZV9kYXRhID0geGhyICYmIHhoci5yZXNwb25zZUpTT04gPyB4aHIucmVzcG9uc2VKU09OLmRhdGEgOiBudWxsO1xuXHRcdFx0XHRcdFx0b3BlcmF0aW9uX2xvZ3MgPSBnZXRfb3BlcmF0aW9uX2xvZ3MoIHJlc3BvbnNlX2RhdGEgKTtcblx0XHRcdFx0XHRcdGlmICggcmVzcG9uc2VfZGF0YSAmJiByZXNwb25zZV9kYXRhLmxhbmd1YWdlICkge1xuXHRcdFx0XHRcdFx0XHR1cGRhdGVfbGFuZ3VhZ2VfY29udGV4dCggZWRpdG9yLCByZXNwb25zZV9kYXRhLmxhbmd1YWdlICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRpZiAoIHNvdXJjZSApIHtcblx0XHRcdFx0XHRcdFx0XHRzb3VyY2Uuc2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWxvY2FsLXRyYW5zbGF0aW9uLXNvdXJjZScsIHByZXZpb3VzX3NvdXJjZSB8fCAnJyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmICggc291cmNlX2xhYmVsICkge1xuXHRcdFx0XHRcdFx0XHRcdHNvdXJjZV9sYWJlbC50ZXh0Q29udGVudCA9IHByZXZpb3VzX3NvdXJjZV9sYWJlbCB8fCAnJztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmVuZGVyX29wZXJhdGlvbl9sb2dzKCBjb25zb2xlX2xvZywgb3BlcmF0aW9uX2xvZ3MgKTtcblx0XHRcdFx0XHRcdGlmICggMCA9PT0gb3BlcmF0aW9uX2xvZ3MubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0XHRhcHBlbmRfb3BlcmF0aW9uX2xvZyggY29uc29sZV9sb2csICdlcnJvcicsIG1lc3NhZ2UgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICggY29uc29sZV9zdGF0ZSApIHtcblx0XHRcdFx0XHRcdFx0Y29uc29sZV9zdGF0ZS50ZXh0Q29udGVudCA9IGFkYXB0ZXJfY29uZmlnLmkxOG4uZmFpbGVkIHx8ICcnO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKCBmZWVkYmFjayApIHtcblx0XHRcdFx0XHRcdFx0ZmVlZGJhY2suY2xhc3NMaXN0LmFkZCggJ2lzLWVycm9yJyApO1xuXHRcdFx0XHRcdFx0XHRmZWVkYmFjay50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRzZXJ2aWNlcy5zZXRfc3RhdHVzKCBtZXNzYWdlICk7XG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdFx0cmVxdWVzdC5hbHdheXMoIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGlmICggc2VxdWVuY2UgPT09IHJlcXVlc3Rfc2VxdWVuY2UgJiYgISByZWxvYWRfcGVuZGluZyApIHtcblx0XHRcdFx0XHRcdFx0aW5zdGFsbF9idXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0aWYgKCBvcGVyYXRpb25fY29uc29sZSApIHtcblx0XHRcdFx0XHRcdFx0XHRvcGVyYXRpb25fY29uc29sZS5zZXRBdHRyaWJ1dGUoICdhcmlhLWJ1c3knLCAnZmFsc2UnICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdH0gKTtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogU3RlcCAzIG5hdGl2ZSBjb250cm9scyBuZWVkIG5vIGRyYWZ0IHN5bmNocm9uaXphdGlvbi5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcmV0dXJuIHt2b2lkfVxuXHRcdFx0ICovXG5cdFx0XHRzeW5jOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBTZXJ2ZXIgYW5kIG5hdGl2ZSByZXF1aXJlZC1zZWxlY3QgdmFsaWRhdGlvbiByZW1haW4gYXV0aG9yaXRhdGl2ZS5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcmV0dXJuIHtudWxsfSBObyBtb2R1bGUtc3BlY2lmaWMgaW52YWxpZCBjb250cm9sLlxuXHRcdFx0ICovXG5cdFx0XHR2YWxpZGF0ZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0d2luZG93LndwYmNfc2V0dXBfZWRpdG9yX21vZHVsZXMgPSB3aW5kb3cud3BiY19zZXR1cF9lZGl0b3JfbW9kdWxlcyB8fCB7fTtcblx0d2luZG93LndwYmNfc2V0dXBfZWRpdG9yX21vZHVsZXMuZGF0ZV90aW1lX2Zvcm1hdHMgPSB7XG5cdFx0Y3JlYXRlOiBjcmVhdGVfZGF0ZV90aW1lX2Zvcm1hdHNfYWRhcHRlclxuXHR9O1xuXG5cdGlmICggd2luZG93LndwYmNfc2V0dXBfd2l6YXJkX2FwaSAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2Ygd2luZG93LndwYmNfc2V0dXBfd2l6YXJkX2FwaS5yZWdpc3Rlcl9zdGVwX2FkYXB0ZXIgKSB7XG5cdFx0d2luZG93LndwYmNfc2V0dXBfd2l6YXJkX2FwaS5yZWdpc3Rlcl9zdGVwX2FkYXB0ZXIoIGNyZWF0ZV9kYXRlX3RpbWVfZm9ybWF0c19hZGFwdGVyKCBtb2R1bGVfY29uZmlnICkgKTtcblx0fVxufSggalF1ZXJ5LCB3aW5kb3csIGRvY3VtZW50ICkgKTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRSxXQUFXQSxDQUFDLEVBQUVDLE1BQU0sRUFBRUMsUUFBUSxFQUFHO0VBQ2xDLFlBQVk7O0VBRVosSUFBSUMsYUFBYSxHQUFHRixNQUFNLENBQUNHLG1DQUFtQyxJQUFJO0lBQUVDLElBQUksRUFBRSxDQUFDO0VBQUUsQ0FBQztFQUM5RSxJQUFJQyxnQkFBZ0IsR0FBRyxDQUFDOztFQUV4QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNDLFNBQVNDLGlCQUFpQkEsQ0FBRUMsR0FBRyxFQUFF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O1lBQ0EsSUFBSzhELGFBQWEsRUFBRztjQUNwQkEsYUFBYSxDQUFDN0MsV0FBVyxHQUFHcEIsY0FBYyxDQUFDSixJQUFJLENBQUM2RyxNQUFNLElBQUksRUFBRTtZQUM3RDtZQUNBLElBQUszQyxRQUFRLEVBQUc7Y0FDZkEsUUFBUSxDQUFDbEIsU0FBUyxDQUFDbUQsR0FBRyxDQUFFLFVBQVcsQ0FBQztjQUNwQ2pDLFFBQVEsQ0FBQzFDLFdBQVcsR0FBR2pCLE9BQU87WUFDL0I7WUFDQWtELFFBQVEsQ0FBQzhCLFVBQVUsQ0FBRWhGLE9BQVEsQ0FBQztVQUMvQixDQUFFLENBQUM7VUFFSG9FLE9BQU8sQ0FBQ21DLE1BQU0sQ0FBRSxZQUFZO1lBQzNCLElBQUtyQyxRQUFRLEtBQUt4RSxnQkFBZ0IsSUFBSSxDQUFFdUUsY0FBYyxFQUFHO2NBQ3hEVCxjQUFjLENBQUN1QixRQUFRLEdBQUcsS0FBSztjQUMvQixJQUFLbkIsaUJBQWlCLEVBQUc7Z0JBQ3hCQSxpQkFBaUIsQ0FBQ3RCLFlBQVksQ0FBRSxXQUFXLEVBQUUsT0FBUSxDQUFDO2NBQ3ZEO1lBQ0Q7VUFDRCxDQUFFLENBQUM7UUFDSixDQUFFLENBQUM7TUFDSixDQUFDO01BRUQ7QUFDSDtBQUNBO0FBQ0E7QUFDQTtNQUNHa0UsSUFBSSxFQUFFLFNBQUFBLENBQUEsRUFBWSxDQUFDLENBQUM7TUFFcEI7QUFDSDtBQUNBO0FBQ0E7QUFDQTtNQUNHQyxRQUFRLEVBQUUsU0FBQUEsQ0FBQSxFQUFZO1FBQ3JCLE9BQU8sSUFBSTtNQUNaO0lBQ0QsQ0FBQztFQUNGO0VBRUFwSCxNQUFNLENBQUNxSCx5QkFBeUIsR0FBR3JILE1BQU0sQ0FBQ3FILHlCQUF5QixJQUFJLENBQUMsQ0FBQztFQUN6RXJILE1BQU0sQ0FBQ3FILHlCQUF5QixDQUFDQyxpQkFBaUIsR0FBRztJQUNwREMsTUFBTSxFQUFFM0Q7RUFDVCxDQUFDO0VBRUQsSUFBSzVELE1BQU0sQ0FBQ3dILHFCQUFxQixJQUFJLFVBQVUsS0FBSyxPQUFPeEgsTUFBTSxDQUFDd0gscUJBQXFCLENBQUNDLHFCQUFxQixFQUFHO0lBQy9HekgsTUFBTSxDQUFDd0gscUJBQXFCLENBQUNDLHFCQUFxQixDQUFFN0QsZ0NBQWdDLENBQUUxRCxhQUFjLENBQUUsQ0FBQztFQUN4RztBQUNELENBQUMsRUFBRXdILE1BQU0sRUFBRTFILE1BQU0sRUFBRUMsUUFBUyxDQUFDIiwiaWdub3JlTGlzdCI6W119
333