PluginProbe
Booking Calendar / 11.2
Booking Calendar v11.2
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 10.11 All 204 releases
booking / includes / page-form-builder / form-settings / _out / settings_effects.js

settings_effects.js in Booking Calendar 11.2, at includes/page-form-builder/form-settings/_out/settings_effects.js

361 lines 43.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 "use strict";
2
3 /**
4 * Applies effects in Canvas, after changing some settings in the right sidebar in BFB.
5 *
6 * @file ../includes/page-form-builder/form-settings/_src/settings_effects.js
7 */
8 (function (w, d) {
9 'use strict';
10
11 const Effects = w.WPBC_BFB_Settings_Effects = w.WPBC_BFB_Settings_Effects || {};
12 const map = Effects.map = Effects.map || Object.create(null);
13 Effects.register = function (key, fn) {
14 if (key && typeof fn === 'function') {
15 map[String(key)] = fn;
16 }
17 };
18 function get_canvas_root() {
19 return d.querySelector('#wpbc_bfb__pages_container') || d.querySelector('.wpbc_bfb__panel--preview') || d.getElementById('wpbc_bfb__preview') || d.body || d.documentElement;
20 }
21 Effects.apply_one = function (key, value, ctx) {
22 const fn = map[String(key)];
23 if (!fn) {
24 return;
25 }
26 try {
27 fn(value, Object.assign({
28 key,
29 value,
30 canvas: get_canvas_root()
31 }, ctx || {}));
32 } catch (e) {
33 // keep silent in production if you prefer
34 console.error('WPBC Effects error:', key, e);
35 }
36 };
37 Effects.apply_all = function (options, ctx) {
38 if (!options || typeof options !== 'object') {
39 return;
40 }
41 Object.keys(options).forEach(function (k) {
42 Effects.apply_one(k, options[k], ctx);
43 });
44 };
45
46 /**
47 * Normalize settings pack to the minimum required shape:
48 * { options: {}, css_vars: {} }
49 *
50 * @param {*} pack
51 * @return {{options:Object, css_vars:Object, bfb_options?:Object}|null}
52 */
53 Effects.normalize_pack = function (pack) {
54 if (pack === null || typeof pack === 'undefined' || pack === '') {
55 return null;
56 }
57
58 // Parse JSON string if needed.
59 if (typeof pack === 'string') {
60 try {
61 pack = JSON.parse(pack);
62 } catch (_e) {
63 return null;
64 }
65 }
66 if (!pack || typeof pack !== 'object') {
67 return null;
68 }
69
70 // If user passed just {key:value} options map, wrap it.
71 const has_shape = Object.prototype.hasOwnProperty.call(pack, 'options') || Object.prototype.hasOwnProperty.call(pack, 'css_vars') || Object.prototype.hasOwnProperty.call(pack, 'bfb_options');
72 if (!has_shape) {
73 pack = {
74 options: pack,
75 css_vars: {}
76 };
77 }
78 if (!pack.options || typeof pack.options !== 'object') {
79 pack.options = {};
80 }
81 if (!pack.css_vars || typeof pack.css_vars !== 'object') {
82 pack.css_vars = {};
83 }
84
85 // bfb_options is optional; keep if valid.
86 if (pack.bfb_options && typeof pack.bfb_options !== 'object') {
87 delete pack.bfb_options;
88 }
89 return pack;
90 };
91
92 /**
93 * Re-apply settings effects after a canvas rebuild / structure load.
94 *
95 * This is needed because structure loading can replace DOM nodes that effects target.
96 *
97 * @param {*} settings_pack string|object settings_json pack (or plain options map)
98 * @param {Object} [ctx]
99 */
100 Effects.reapply_after_canvas = function (settings_pack, ctx) {
101 const pack = Effects.normalize_pack(settings_pack);
102 if (!pack) {
103 return;
104 }
105
106 // Apply immediately (best effort).
107 Effects.apply_all(pack.options, Object.assign({
108 source: 'reapply_after_canvas'
109 }, ctx || {}));
110
111 // Some modules/hydration may run shortly after; do one more pass.
112 setTimeout(function () {
113 Effects.apply_all(pack.options, Object.assign({
114 source: 'reapply_after_canvas_delayed'
115 }, ctx || {}));
116 }, 60);
117 };
118
119 // 1) Apply from AJAX load.
120 d.addEventListener('wpbc:bfb:form_settings:apply', function (e) {
121 const pack = e && e.detail ? e.detail.settings : null;
122 if (pack && pack.options) {
123 Effects.apply_all(pack.options, {
124 source: 'apply'
125 });
126 }
127 });
128
129 // 2) Apply live from UI change (delegated).
130 function css_escape(value) {
131 const v = String(value == null ? '' : value);
132 if (w.CSS && typeof w.CSS.escape === 'function') {
133 return w.CSS.escape(v);
134 }
135 return v.replace(/[^a-zA-Z0-9_\-]/g, '\\$&');
136 }
137 function find_fs_root(el) {
138 if (!el || !el.closest) {
139 return null;
140 }
141
142 // 1) Direct: element or ancestor carries FS key (input/select/textarea writer, radio wrapper, etc.)
143 const direct = el.closest('[data-wpbc-bfb-fs-key]');
144 if (direct) {
145 return direct;
146 }
147
148 // 2) Length: event came from number/unit/range inside .wpbc_slider_len_group
149 const len_group = el.closest('.wpbc_slider_len_group');
150 if (len_group) {
151 return len_group.querySelector('input[data-wpbc_slider_len_writer][data-wpbc-bfb-fs-key]') || len_group.querySelector('input[data-wpbc-bfb-fs-type="length"][data-wpbc-bfb-fs-key]') || null;
152 }
153
154 // 3) Range: event came from range input inside .wpbc_slider_range_group
155 const range_group = el.closest('.wpbc_slider_range_group');
156 if (range_group) {
157 return range_group.querySelector('input[data-wpbc_slider_range_writer][data-wpbc-bfb-fs-key]') || range_group.querySelector('input[data-wpbc_slider_range_writer]') || null;
158 }
159 return null;
160 }
161 function read_value_from_fs_root(fs_root, original_target) {
162 if (!fs_root) {
163 return '';
164 }
165 const fs_type = String(fs_root.getAttribute('data-wpbc-bfb-fs-type') || '');
166
167 // RADIO: read checked within wrapper.
168 if (fs_type === 'radio') {
169 const control_id = fs_root.getAttribute('data-wpbc-bfb-fs-controlid') || '';
170 const selector = control_id ? 'input[type="radio"][name="' + css_escape(control_id) + '"]:checked' : 'input[type="radio"]:checked';
171 const checked = fs_root.querySelector(selector);
172 return checked ? String(checked.value || '') : '';
173 }
174
175 // CHECKBOX / TOGGLE
176 if (original_target && original_target.type === 'checkbox' || fs_root.type === 'checkbox') {
177 const cb = original_target && original_target.type === 'checkbox' ? original_target : fs_root;
178 return cb.checked ? 'On' : 'Off';
179 }
180
181 // DEFAULT: writer/input/textarea/select
182 if (fs_root.value != null) {
183 return String(fs_root.value);
184 }
185 if (original_target && original_target.value != null) {
186 return String(original_target.value);
187 }
188 return '';
189 }
190 function on_change(ev) {
191 // Ignore events dispatched by code (apply/reapply, slider sync, etc.). Effects should react only to real user input + explicit wpbc:bfb:form_settings:apply.
192 if (ev && ev.isTrusted === false) {
193 return;
194 }
195 const target = ev && ev.target;
196 if (!target) {
197 return;
198 }
199 const fs_root = find_fs_root(target);
200 if (!fs_root) {
201 return;
202 }
203
204 // Normalize events so each control produces exactly one effect call.
205 // - toggle/select/radio/checkbox => "change" only.
206 // - everything else => "input" only.
207 const fs_type = String(fs_root.getAttribute('data-wpbc-bfb-fs-type') || '');
208 const tag = String(target.tagName || '').toLowerCase();
209 const type = String(target.type || '').toLowerCase();
210 const use_change = fs_type === 'toggle' || fs_type === 'select' || fs_type === 'radio' || type === 'checkbox' || type === 'radio' || tag === 'select';
211 if (use_change && ev.type !== 'change') {
212 return;
213 }
214 if (!use_change && ev.type !== 'input') {
215 return;
216 }
217 // -------------------------------------------------------------------------------------------
218
219 const key = fs_root.getAttribute('data-wpbc-bfb-fs-key');
220 if (!key) {
221 return;
222 }
223 const scope = fs_root.getAttribute('data-wpbc-bfb-fs-scope') || '';
224 const value = read_value_from_fs_root(fs_root, target);
225 Effects.apply_one(key, value, {
226 source: 'ui',
227 scope: scope,
228 control: target,
229 fs_root: fs_root
230 });
231 }
232 d.addEventListener('input', on_change, false);
233 d.addEventListener('change', on_change, false);
234 })(window, document);
235
236 // BOOKING_FORM_THEME.
237 WPBC_BFB_Settings_Effects.register('booking_form_theme', function (value, ctx) {
238 // const root = ctx.canvas;
239 const root = document.getElementById('wpbc_bfb__theme_scope');
240 if (!root || !root.querySelectorAll) {
241 return;
242 }
243
244 // const wraps = root.querySelectorAll( '.wpbc_container.wpbc_form' );
245 const wraps = root.querySelectorAll('.wpbc_bfb__pages_panel');
246 if (!wraps.length) {
247 return;
248 }
249 wraps.forEach(function (wrap) {
250 // remove any previous theme classes (simple + future-proof).
251 Array.from(wrap.classList).forEach(function (cls) {
252 if (/^wpbc_theme_/.test(cls)) {
253 wrap.classList.remove(cls);
254 }
255 });
256 if (value) {
257 wrap.classList.add(String(value));
258 }
259 });
260 });
261
262 // BOOKING_FORM_LAYOUT_WIDTH — Form width: applies combined "100%" / "600px" / "40rem" to the booking form containers.
263 WPBC_BFB_Settings_Effects.register('booking_form_layout_width', function (value, ctx) {
264 const root = ctx && ctx.canvas;
265 if (!root || !root.querySelectorAll) {
266 return;
267 }
268 const wraps = root.querySelectorAll('.wpbc_bfb__form_preview_section_container');
269 if (!wraps.length) {
270 return;
271 }
272 const v = String(value == null ? '' : value).trim();
273
274 // allow only "number + unit".
275 if (v && !/^-?\d+(?:\.\d+)?(?:%|px|rem|em|vw|vh)$/.test(v)) {
276 return;
277 }
278 wraps.forEach(function (wrap) {
279 if (!wrap || !wrap.style) {
280 return;
281 }
282 if (!v) {
283 wrap.style.removeProperty('--wpbc-bfb-booking_form_layout_width');
284 } else {
285 wrap.style.setProperty('--wpbc-bfb-booking_form_layout_width', v);
286 }
287 });
288 });
289
290 // Debug Preview Mode.
291 WPBC_BFB_Settings_Effects.register('booking_bfb_preview_mode', function (value, ctx) {
292 const root = ctx.canvas;
293 if (!root || !root.querySelectorAll) {
294 return;
295 }
296 const wraps = root.querySelectorAll('.wpbc_container.wpbc_form');
297 if (!wraps.length) {
298 return;
299 }
300
301 // Get builder async.
302 wpbc_bfb_api.with_builder(function (Builder) {
303 /**
304 * Capture active right sidebar tab and return restore handle.
305 *
306 * @return {{restore:function():void}|null}
307 */
308 function capture_right_sidebar_active_tab_restore_handle() {
309 var tablist_el = document.querySelector('.wpbc_bfb__rightbar_tabs[role="tablist"]');
310 if (!tablist_el) {
311 return null;
312 }
313 var active_tab_el = tablist_el.querySelector('[role="tab"][aria-selected="true"]');
314 if (!active_tab_el) {
315 active_tab_el = tablist_el.querySelector('[role="tab"][aria-controls="wpbc_bfb__palette_add_new"]');
316 }
317 if (!active_tab_el || typeof active_tab_el.click !== 'function') {
318 return null;
319 }
320 return {
321 restore: function () {
322 try {
323 active_tab_el.click();
324 } catch (_e) {}
325 }
326 };
327 }
328 var tab_restore_handle = capture_right_sidebar_active_tab_restore_handle();
329 let restored = false;
330 var EVS = window.WPBC_BFB_Core && window.WPBC_BFB_Core.WPBC_BFB_Events ? window.WPBC_BFB_Core.WPBC_BFB_Events : {};
331 var EV_DONE = EVS.STRUCTURE_LOADED || EVS.CANVAS_REFRESHED || 'wpbc:bfb:structure-loaded';
332 function do_restore() {
333 if (restored) {
334 return;
335 }
336 restored = true;
337 try {
338 Builder?.bus?.off?.(EV_DONE, do_restore);
339 } catch (_) {}
340 requestAnimationFrame(function () {
341 if (!tab_restore_handle) {
342 return;
343 }
344 tab_restore_handle.restore();
345 });
346 }
347
348 // Listen once (best), plus a fallback in case event isn't fired.
349 try {
350 Builder?.bus?.on?.(EV_DONE, do_restore);
351 } catch (_) {}
352 var enabled = 'On' === value;
353 Builder.set_preview_mode(enabled, {
354 rebuild: true,
355 reinit: true,
356 source: 'settings-effects'
357 });
358 });
359 });
360 //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvZm9ybS1zZXR0aW5ncy9fb3V0L3NldHRpbmdzX2VmZmVjdHMuanMiLCJuYW1lcyI6WyJ3IiwiZCIsIkVmZmVjdHMiLCJXUEJDX0JGQl9TZXR0aW5nc19FZmZlY3RzIiwibWFwIiwiT2JqZWN0IiwiY3JlYXRlIiwicmVnaXN0ZXIiLCJrZXkiLCJmbiIsIlN0cmluZyIsImdldF9jYW52YXNfcm9vdCIsInF1ZXJ5U2VsZWN0b3IiLCJnZXRFbGVtZW50QnlJZCIsImJvZHkiLCJkb2N1bWVudEVsZW1lbnQiLCJhcHBseV9vbmUiLCJ2YWx1ZSIsImN0eCIsImFzc2lnbiIsImNhbnZhcyIsImUiLCJjb25zb2xlIiwiZXJyb3IiLCJhcHBseV9hbGwiLCJvcHRpb25zIiwia2V5cyIsImZvckVhY2giLCJrIiwibm9ybWFsaXplX3BhY2siLCJwYWNrIiwiSlNPTiIsInBhcnNlIiwiX2UiLCJoYXNfc2hhcGUiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJjc3NfdmFycyIsImJmYl9vcHRpb25zIiwicmVhcHBseV9hZnRlcl9jYW52YXMiLCJzZXR0aW5nc19wYWNrIiwic291cmNlIiwic2V0VGltZW91dCIsImFkZEV2ZW50TGlzdGVuZXIiLCJkZXRhaWwiLCJzZXR0aW5ncyIsImNzc19lc2NhcGUiLCJ2IiwiQ1NTIiwiZXNjYXBlIiwicmVwbGFjZSIsImZpbmRfZnNfcm9vdCIsImVsIiwiY2xvc2VzdCIsImRpcmVjdCIsImxlbl9ncm91cCIsInJhbmdlX2dyb3VwIiwicmVhZF92YWx1ZV9mcm9tX2ZzX3Jvb3QiLCJmc19yb290Iiwib3JpZ2luYWxfdGFyZ2V0IiwiZnNfdHlwZSIsImdldEF0dHJpYnV0ZSIsImNvbnRyb2xfaWQiLCJzZWxlY3RvciIsImNoZWNrZWQiLCJ0eXBlIiwiY2IiLCJvbl9jaGFuZ2UiLCJldiIsImlzVHJ1c3RlZCIsInRhcmdldCIsInRhZyIsInRhZ05hbWUiLCJ0b0xvd2VyQ2FzZSIsInVzZV9jaGFuZ2UiLCJzY29wZSIsImNvbnRyb2wiLCJ3aW5kb3ciLCJkb2N1bWVudCIsInJvb3QiLCJxdWVyeVNlbGVjdG9yQWxsIiwid3JhcHMiLCJsZW5ndGgiLCJ3cmFwIiwiQXJyYXkiLCJmcm9tIiwiY2xhc3NMaXN0IiwiY2xzIiwidGVzdCIsInJlbW92ZSIsImFkZCIsInRyaW0iLCJzdHlsZSIsInJlbW92ZVByb3BlcnR5Iiwic2V0UHJvcGVydHkiLCJ3cGJjX2JmYl9hcGkiLCJ3aXRoX2J1aWxkZXIiLCJCdWlsZGVyIiwiY2FwdHVyZV9yaWdodF9zaWRlYmFyX2FjdGl2ZV90YWJfcmVzdG9yZV9oYW5kbGUiLCJ0YWJsaXN0X2VsIiwiYWN0aXZlX3RhYl9lbCIsImNsaWNrIiwicmVzdG9yZSIsInRhYl9yZXN0b3JlX2hhbmRsZSIsInJlc3RvcmVkIiwiRVZTIiwiV1BCQ19CRkJfQ29yZSIsIldQQkNfQkZCX0V2ZW50cyIsIkVWX0RPTkUiLCJTVFJVQ1RVUkVfTE9BREVEIiwiQ0FOVkFTX1JFRlJFU0hFRCIsImRvX3Jlc3RvcmUiLCJidXMiLCJvZmYiLCJfIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwib24iLCJlbmFibGVkIiwic2V0X3ByZXZpZXdfbW9kZSIsInJlYnVpbGQiLCJyZWluaXQiXSwic291cmNlcyI6WyJpbmNsdWRlcy9wYWdlLWZvcm0tYnVpbGRlci9mb3JtLXNldHRpbmdzL19zcmMvc2V0dGluZ3NfZWZmZWN0cy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQXBwbGllcyBlZmZlY3RzIGluIENhbnZhcywgYWZ0ZXIgY2hhbmdpbmcgc29tZSBzZXR0aW5ncyBpbiB0aGUgcmlnaHQgc2lkZWJhciBpbiBCRkIuXHJcbiAqXHJcbiAqIEBmaWxlIC4uL2luY2x1ZGVzL3BhZ2UtZm9ybS1idWlsZGVyL2Zvcm0tc2V0dGluZ3MvX3NyYy9zZXR0aW5nc19lZmZlY3RzLmpzXHJcbiAqL1xyXG4oZnVuY3Rpb24gKHcsIGQpIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdGNvbnN0IEVmZmVjdHMgPSAody5XUEJDX0JGQl9TZXR0aW5nc19FZmZlY3RzID0gdy5XUEJDX0JGQl9TZXR0aW5nc19FZmZlY3RzIHx8IHt9KTtcclxuXHRjb25zdCBtYXAgICAgID0gKEVmZmVjdHMubWFwID0gRWZmZWN0cy5tYXAgfHwgT2JqZWN0LmNyZWF0ZSggbnVsbCApKTtcclxuXHJcblx0RWZmZWN0cy5yZWdpc3RlciA9IGZ1bmN0aW9uIChrZXksIGZuKSB7XHJcblx0XHRpZiAoIGtleSAmJiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdG1hcFtTdHJpbmcoIGtleSApXSA9IGZuO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdGZ1bmN0aW9uIGdldF9jYW52YXNfcm9vdCgpIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdGQucXVlcnlTZWxlY3RvciggJyN3cGJjX2JmYl9fcGFnZXNfY29udGFpbmVyJyApIHx8XHJcblx0XHRcdGQucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9fcGFuZWwtLXByZXZpZXcnICkgfHxcclxuXHRcdFx0ZC5nZXRFbGVtZW50QnlJZCggJ3dwYmNfYmZiX19wcmV2aWV3JyApIHx8XHJcblx0XHRcdGQuYm9keSB8fCBkLmRvY3VtZW50RWxlbWVudFxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdEVmZmVjdHMuYXBwbHlfb25lID0gZnVuY3Rpb24gKGtleSwgdmFsdWUsIGN0eCkge1xyXG5cdFx0Y29uc3QgZm4gPSBtYXBbU3RyaW5nKCBrZXkgKV07XHJcblx0XHRpZiAoICEgZm4gKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdHRyeSB7XHJcblx0XHRcdGZuKCB2YWx1ZSwgT2JqZWN0LmFzc2lnbiggeyBrZXksIHZhbHVlLCBjYW52YXM6IGdldF9jYW52YXNfcm9vdCgpIH0sIGN0eCB8fCB7fSApICk7XHJcblx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0Ly8ga2VlcCBzaWxlbnQgaW4gcHJvZHVjdGlvbiBpZiB5b3UgcHJlZmVyXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdXUEJDIEVmZmVjdHMgZXJyb3I6Jywga2V5LCBlICk7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0RWZmZWN0cy5hcHBseV9hbGwgPSBmdW5jdGlvbiAob3B0aW9ucywgY3R4KSB7XHJcblx0XHRpZiAoICEgb3B0aW9ucyB8fCB0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdE9iamVjdC5rZXlzKCBvcHRpb25zICkuZm9yRWFjaCggZnVuY3Rpb24gKGspIHtcclxuXHRcdFx0RWZmZWN0cy5hcHBseV9vbmUoIGssIG9wdGlvbnNba10sIGN0eCApO1xyXG5cdFx0fSApO1xyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIE5vcm1hbGl6ZSBzZXR0aW5ncyBwYWNrIHRvIHRoZSBtaW5pbXVtIHJlcXVpcmVkIHNoYXBlOlxyXG5cdCAqIHsgb3B0aW9uczoge30sIGNzc192YXJzOiB7fSB9XHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyp9IHBhY2tcclxuXHQgKiBAcmV0dXJuIHt7b3B0aW9uczpPYmplY3QsIGNzc192YXJzOk9iamVjdCwgYmZiX29wdGlvbnM/Ok9iamVjdH18bnVsbH1cclxuXHQgKi9cclxuXHRFZmZlY3RzLm5vcm1hbGl6ZV9wYWNrID0gZnVuY3Rpb24gKHBhY2spIHtcclxuXHJcblx0XHRpZiAoIHBhY2sgPT09IG51bGwgfHwgdHlwZW9mIHBhY2sgPT09ICd1bmRlZmluZWQnIHx8IHBhY2sgPT09ICcnICkge1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBQYXJzZSBKU09OIHN0cmluZyBpZiBuZWVkZWQuXHJcblx0XHRpZiAoIHR5cGVvZiBwYWNrID09PSAnc3RyaW5nJyApIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRwYWNrID0gSlNPTi5wYXJzZSggcGFjayApO1xyXG5cdFx0XHR9IGNhdGNoICggX2UgKSB7XHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoICEgcGFjayB8fCB0eXBlb2YgcGFjayAhPT0gJ29iamVjdCcgKSB7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIElmIHVzZXIgcGFzc2VkIGp1c3Qge2tleTp2YWx1ZX0gb3B0aW9ucyBtYXAsIHdyYXAgaXQuXHJcblx0XHRjb25zdCBoYXNfc2hhcGUgPVxyXG5cdFx0XHRcdCAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBwYWNrLCAnb3B0aW9ucycgKSB8fFxyXG5cdFx0XHRcdCAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBwYWNrLCAnY3NzX3ZhcnMnICkgfHxcclxuXHRcdFx0XHQgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggcGFjaywgJ2JmYl9vcHRpb25zJyApO1xyXG5cclxuXHRcdGlmICggISBoYXNfc2hhcGUgKSB7XHJcblx0XHRcdHBhY2sgPSB7IG9wdGlvbnM6IHBhY2ssIGNzc192YXJzOiB7fSB9O1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggISBwYWNrLm9wdGlvbnMgfHwgdHlwZW9mIHBhY2sub3B0aW9ucyAhPT0gJ29iamVjdCcgKSB7XHJcblx0XHRcdHBhY2sub3B0aW9ucyA9IHt9O1xyXG5cdFx0fVxyXG5cdFx0aWYgKCAhIHBhY2suY3NzX3ZhcnMgfHwgdHlwZW9mIHBhY2suY3NzX3ZhcnMgIT09ICdvYmplY3QnICkge1xyXG5cdFx0XHRwYWNrLmNzc192YXJzID0ge307XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYmZiX29wdGlvbnMgaXMgb3B0aW9uYWw7IGtlZXAgaWYgdmFsaWQuXHJcblx0XHRpZiAoIHBhY2suYmZiX29wdGlvbnMgJiYgdHlwZW9mIHBhY2suYmZiX29wdGlvbnMgIT09ICdvYmplY3QnICkge1xyXG5cdFx0XHRkZWxldGUgcGFjay5iZmJfb3B0aW9ucztcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcGFjaztcclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiBSZS1hcHBseSBzZXR0aW5ncyBlZmZlY3RzIGFmdGVyIGEgY2FudmFzIHJlYnVpbGQgLyBzdHJ1Y3R1cmUgbG9hZC5cclxuXHQgKlxyXG5cdCAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc3RydWN0dXJlIGxvYWRpbmcgY2FuIHJlcGxhY2UgRE9NIG5vZGVzIHRoYXQgZWZmZWN0cyB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyp9IHNldHRpbmdzX3BhY2sgIHN0cmluZ3xvYmplY3Qgc2V0dGluZ3NfanNvbiBwYWNrIChvciBwbGFpbiBvcHRpb25zIG1hcClcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW2N0eF1cclxuXHQgKi9cclxuXHRFZmZlY3RzLnJlYXBwbHlfYWZ0ZXJfY2FudmFzID0gZnVuY3Rpb24gKHNldHRpbmdzX3BhY2ssIGN0eCkge1xyXG5cclxuXHRcdGNvbnN0IHBhY2sgPSBFZmZlY3RzLm5vcm1hbGl6ZV9wYWNrKCBzZXR0aW5nc19wYWNrICk7XHJcblx0XHRpZiAoICEgcGFjayApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEFwcGx5IGltbWVkaWF0ZWx5IChiZXN0IGVmZm9ydCkuXHJcblx0XHRFZmZlY3RzLmFwcGx5X2FsbCggcGFjay5vcHRpb25zLCBPYmplY3QuYXNzaWduKCB7IHNvdXJjZTogJ3JlYXBwbHlfYWZ0ZXJfY2FudmFzJyB9LCBjdHggfHwge30gKSApO1xyXG5cclxuXHRcdC8vIFNvbWUgbW9kdWxlcy9oeWRyYXRpb24gbWF5IHJ1biBzaG9ydGx5IGFmdGVyOyBkbyBvbmUgbW9yZSBwYXNzLlxyXG5cdFx0c2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRFZmZlY3RzLmFwcGx5X2FsbCggcGFjay5vcHRpb25zLCBPYmplY3QuYXNzaWduKCB7IHNvdXJjZTogJ3JlYXBwbHlfYWZ0ZXJfY2FudmFzX2RlbGF5ZWQnIH0sIGN0eCB8fCB7fSApICk7XHJcblx0XHR9LCA2MCApO1xyXG5cdH07XHJcblxyXG5cdC8vIDEpIEFwcGx5IGZyb20gQUpBWCBsb2FkLlxyXG5cdGQuYWRkRXZlbnRMaXN0ZW5lciggJ3dwYmM6YmZiOmZvcm1fc2V0dGluZ3M6YXBwbHknLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0Y29uc3QgcGFjayA9IGUgJiYgZS5kZXRhaWwgPyBlLmRldGFpbC5zZXR0aW5ncyA6IG51bGw7XHJcblx0XHRpZiAoIHBhY2sgJiYgcGFjay5vcHRpb25zICkge1xyXG5cdFx0XHRFZmZlY3RzLmFwcGx5X2FsbCggcGFjay5vcHRpb25zLCB7IHNvdXJjZTogJ2FwcGx5JyB9ICk7XHJcblx0XHR9XHJcblx0fSApO1xyXG5cclxuXHQvLyAyKSBBcHBseSBsaXZlIGZyb20gVUkgY2hhbmdlIChkZWxlZ2F0ZWQpLlxyXG5cdGZ1bmN0aW9uIGNzc19lc2NhcGUodmFsdWUpIHtcclxuXHRcdGNvbnN0IHYgPSBTdHJpbmcoIHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlICk7XHJcblx0XHRpZiAoIHcuQ1NTICYmIHR5cGVvZiB3LkNTUy5lc2NhcGUgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdHJldHVybiB3LkNTUy5lc2NhcGUoIHYgKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB2LnJlcGxhY2UoIC9bXmEtekEtWjAtOV9cXC1dL2csICdcXFxcJCYnICk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBmaW5kX2ZzX3Jvb3QoZWwpIHtcclxuXHRcdGlmICggISBlbCB8fCAhIGVsLmNsb3Nlc3QgKSB7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIDEpIERpcmVjdDogZWxlbWVudCBvciBhbmNlc3RvciBjYXJyaWVzIEZTIGtleSAoaW5wdXQvc2VsZWN0L3RleHRhcmVhIHdyaXRlciwgcmFkaW8gd3JhcHBlciwgZXRjLilcclxuXHRcdGNvbnN0IGRpcmVjdCA9IGVsLmNsb3Nlc3QoICdbZGF0YS13cGJjLWJmYi1mcy1rZXldJyApO1xyXG5cdFx0aWYgKCBkaXJlY3QgKSB7XHJcblx0XHRcdHJldHVybiBkaXJlY3Q7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gMikgTGVuZ3RoOiBldmVudCBjYW1lIGZyb20gbnVtYmVyL3VuaXQvcmFuZ2UgaW5zaWRlIC53cGJjX3NsaWRlcl9sZW5fZ3JvdXBcclxuXHRcdGNvbnN0IGxlbl9ncm91cCA9IGVsLmNsb3Nlc3QoICcud3BiY19zbGlkZXJfbGVuX2dyb3VwJyApO1xyXG5cdFx0aWYgKCBsZW5fZ3JvdXAgKSB7XHJcblx0XHRcdHJldHVybiAoXHJcblx0XHRcdFx0bGVuX2dyb3VwLnF1ZXJ5U2VsZWN0b3IoICdpbnB1dFtkYXRhLXdwYmNfc2xpZGVyX2xlbl93cml0ZXJdW2RhdGEtd3BiYy1iZmItZnMta2V5XScgKSB8fFxyXG5cdFx0XHRcdGxlbl9ncm91cC5xdWVyeVNlbGVjdG9yKCAnaW5wdXRbZGF0YS13cGJjLWJmYi1mcy10eXBlPVwibGVuZ3RoXCJdW2RhdGEtd3BiYy1iZmItZnMta2V5XScgKSB8fFxyXG5cdFx0XHRcdG51bGxcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyAzKSBSYW5nZTogZXZlbnQgY2FtZSBmcm9tIHJhbmdlIGlucHV0IGluc2lkZSAud3BiY19zbGlkZXJfcmFuZ2VfZ3JvdXBcclxuXHRcdGNvbnN0IHJhbmdlX2dyb3VwID0gZWwuY2xvc2VzdCggJy53cGJjX3NsaWRlcl9yYW5nZV9ncm91cCcgKTtcclxuXHRcdGlmICggcmFuZ2VfZ3JvdXAgKSB7XHJcblx0XHRcdHJldHVybiAoXHJcblx0XHRcdFx0cmFuZ2VfZ3JvdXAucXVlcnlTZWxlY3RvciggJ2lucHV0W2RhdGEtd3BiY19zbGlkZXJfcmFuZ2Vfd3JpdGVyXVtkYXRhLXdwYmMtYmZiLWZzLWtleV0nICkgfHxcclxuXHRcdFx0XHRyYW5nZV9ncm91cC5xdWVyeVNlbGVjdG9yKCAnaW5wdXRbZGF0YS13cGJjX3NsaWRlcl9yYW5nZV93cml0ZXJdJyApIHx8XHJcblx0XHRcdFx0bnVsbFxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVhZF92YWx1ZV9mcm9tX2ZzX3Jvb3QoZnNfcm9vdCwgb3JpZ2luYWxfdGFyZ2V0KSB7XHJcblx0XHRpZiAoICEgZnNfcm9vdCApIHtcclxuXHRcdFx0cmV0dXJuICcnO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGZzX3R5cGUgPSBTdHJpbmcoIGZzX3Jvb3QuZ2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWJmYi1mcy10eXBlJyApIHx8ICcnICk7XHJcblxyXG5cdFx0Ly8gUkFESU86IHJlYWQgY2hlY2tlZCB3aXRoaW4gd3JhcHBlci5cclxuXHRcdGlmICggZnNfdHlwZSA9PT0gJ3JhZGlvJyApIHtcclxuXHRcdFx0Y29uc3QgY29udHJvbF9pZCA9IGZzX3Jvb3QuZ2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWJmYi1mcy1jb250cm9saWQnICkgfHwgJyc7XHJcblx0XHRcdGNvbnN0IHNlbGVjdG9yICAgPSBjb250cm9sX2lkXHJcblx0XHRcdFx0PyAnaW5wdXRbdHlwZT1cInJhZGlvXCJdW25hbWU9XCInICsgY3NzX2VzY2FwZSggY29udHJvbF9pZCApICsgJ1wiXTpjaGVja2VkJ1xyXG5cdFx0XHRcdDogJ2lucHV0W3R5cGU9XCJyYWRpb1wiXTpjaGVja2VkJztcclxuXHJcblx0XHRcdGNvbnN0IGNoZWNrZWQgPSBmc19yb290LnF1ZXJ5U2VsZWN0b3IoIHNlbGVjdG9yICk7XHJcblx0XHRcdHJldHVybiBjaGVja2VkID8gU3RyaW5nKCBjaGVja2VkLnZhbHVlIHx8ICcnICkgOiAnJztcclxuXHRcdH1cclxuXHJcblx0XHQvLyBDSEVDS0JPWCAvIFRPR0dMRVxyXG5cdFx0aWYgKCAob3JpZ2luYWxfdGFyZ2V0ICYmIG9yaWdpbmFsX3RhcmdldC50eXBlID09PSAnY2hlY2tib3gnKSB8fCBmc19yb290LnR5cGUgPT09ICdjaGVja2JveCcgKSB7XHJcblx0XHRcdGNvbnN0IGNiID0gKG9yaWdpbmFsX3RhcmdldCAmJiBvcmlnaW5hbF90YXJnZXQudHlwZSA9PT0gJ2NoZWNrYm94JykgPyBvcmlnaW5hbF90YXJnZXQgOiBmc19yb290O1xyXG5cdFx0XHRyZXR1cm4gY2IuY2hlY2tlZCA/ICdPbicgOiAnT2ZmJztcclxuXHRcdH1cclxuXHJcblx0XHQvLyBERUZBVUxUOiB3cml0ZXIvaW5wdXQvdGV4dGFyZWEvc2VsZWN0XHJcblx0XHRpZiAoIGZzX3Jvb3QudmFsdWUgIT0gbnVsbCApIHtcclxuXHRcdFx0cmV0dXJuIFN0cmluZyggZnNfcm9vdC52YWx1ZSApO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCBvcmlnaW5hbF90YXJnZXQgJiYgb3JpZ2luYWxfdGFyZ2V0LnZhbHVlICE9IG51bGwgKSB7XHJcblx0XHRcdHJldHVybiBTdHJpbmcoIG9yaWdpbmFsX3RhcmdldC52YWx1ZSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAnJztcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIG9uX2NoYW5nZShldikge1xyXG5cdFx0Ly8gSWdub3JlIGV2ZW50cyBkaXNwYXRjaGVkIGJ5IGNvZGUgKGFwcGx5L3JlYXBwbHksIHNsaWRlciBzeW5jLCBldGMuKS4gRWZmZWN0cyBzaG91bGQgcmVhY3Qgb25seSB0byByZWFsIHVzZXIgaW5wdXQgKyBleHBsaWNpdCB3cGJjOmJmYjpmb3JtX3NldHRpbmdzOmFwcGx5LlxyXG5cdFx0aWYgKCBldiAmJiBldi5pc1RydXN0ZWQgPT09IGZhbHNlICkgeyByZXR1cm47IH1cclxuXHRcdGNvbnN0IHRhcmdldCA9IGV2ICYmIGV2LnRhcmdldDtcclxuXHRcdGlmICggISB0YXJnZXQgKSB7IHJldHVybjsgfVxyXG5cclxuXHRcdGNvbnN0IGZzX3Jvb3QgPSBmaW5kX2ZzX3Jvb3QoIHRhcmdldCApO1xyXG5cdFx0aWYgKCAhIGZzX3Jvb3QgKSB7IHJldHVybjsgfVxyXG5cclxuXHJcblx0XHQvLyBOb3JtYWxpemUgZXZlbnRzIHNvIGVhY2ggY29udHJvbCBwcm9kdWNlcyBleGFjdGx5IG9uZSBlZmZlY3QgY2FsbC5cclxuXHRcdC8vIC0gdG9nZ2xlL3NlbGVjdC9yYWRpby9jaGVja2JveCA9PiBcImNoYW5nZVwiIG9ubHkuXHJcblx0XHQvLyAtIGV2ZXJ5dGhpbmcgZWxzZSAgICAgICAgICAgICAgPT4gXCJpbnB1dFwiIG9ubHkuXHJcblx0XHRjb25zdCBmc190eXBlID0gU3RyaW5nKCBmc19yb290LmdldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1iZmItZnMtdHlwZScgKSB8fCAnJyApO1xyXG5cdFx0Y29uc3QgdGFnICAgICA9IFN0cmluZyggdGFyZ2V0LnRhZ05hbWUgfHwgJycgKS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0Y29uc3QgdHlwZSAgICA9IFN0cmluZyggdGFyZ2V0LnR5cGUgfHwgJycgKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuXHRcdGNvbnN0IHVzZV9jaGFuZ2UgPSAoZnNfdHlwZSA9PT0gJ3RvZ2dsZScpIHx8IChmc190eXBlID09PSAnc2VsZWN0JykgfHwgKGZzX3R5cGUgPT09ICdyYWRpbycpIHx8ICh0eXBlID09PSAnY2hlY2tib3gnKSB8fCAodHlwZSA9PT0gJ3JhZGlvJykgfHwgKHRhZyA9PT0gJ3NlbGVjdCcpO1xyXG5cclxuXHRcdGlmICggdXNlX2NoYW5nZSAmJiBldi50eXBlICE9PSAnY2hhbmdlJyApIHsgcmV0dXJuOyB9XHJcblx0XHRpZiAoICEgdXNlX2NoYW5nZSAmJiBldi50eXBlICE9PSAnaW5wdXQnICkgeyByZXR1cm47IH1cclxuXHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0XHRjb25zdCBrZXkgPSBmc19yb290LmdldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1iZmItZnMta2V5JyApO1xyXG5cdFx0aWYgKCAhIGtleSApIHsgcmV0dXJuOyB9XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSBmc19yb290LmdldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1iZmItZnMtc2NvcGUnICkgfHwgJyc7XHJcblx0XHRjb25zdCB2YWx1ZSA9IHJlYWRfdmFsdWVfZnJvbV9mc19yb290KCBmc19yb290LCB0YXJnZXQgKTtcclxuXHJcblx0XHRFZmZlY3RzLmFwcGx5X29uZSgga2V5LCB2YWx1ZSwgeyBzb3VyY2U6ICd1aScsIHNjb3BlOiBzY29wZSwgY29udHJvbDogdGFyZ2V0LCBmc19yb290OiBmc19yb290IH0gKTtcclxuXHR9XHJcblxyXG5cdGQuYWRkRXZlbnRMaXN0ZW5lciggJ2lucHV0Jywgb25fY2hhbmdlLCBmYWxzZSApO1xyXG5cdGQuYWRkRXZlbnRMaXN0ZW5lciggJ2NoYW5nZScsIG9uX2NoYW5nZSwgZmFsc2UgKTtcclxuXHJcbn0pKCB3aW5kb3csIGRvY3VtZW50ICk7XHJcblxyXG5cclxuLy8gQk9PS0lOR19GT1JNX1RIRU1FLlxyXG5XUEJDX0JGQl9TZXR0aW5nc19FZmZlY3RzLnJlZ2lzdGVyKCAnYm9va2luZ19mb3JtX3RoZW1lJywgZnVuY3Rpb24gKHZhbHVlLCBjdHgpIHtcclxuXHQvLyBjb25zdCByb290ID0gY3R4LmNhbnZhcztcclxuXHRjb25zdCByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2JmYl9fdGhlbWVfc2NvcGUnICk7XHJcblx0aWYgKCAhIHJvb3QgfHwgISByb290LnF1ZXJ5U2VsZWN0b3JBbGwgKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHQvLyBjb25zdCB3cmFwcyA9IHJvb3QucXVlcnlTZWxlY3RvckFsbCggJy53cGJjX2NvbnRhaW5lci53cGJjX2Zvcm0nICk7XHJcblx0Y29uc3Qgd3JhcHMgPSByb290LnF1ZXJ5U2VsZWN0b3JBbGwoICcud3BiY19iZmJfX3BhZ2VzX3BhbmVsJyApO1xyXG5cdGlmICggISB3cmFwcy5sZW5ndGggKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHR3cmFwcy5mb3JFYWNoKCBmdW5jdGlvbiAod3JhcCkge1xyXG5cdFx0Ly8gcmVtb3ZlIGFueSBwcmV2aW91cyB0aGVtZSBjbGFzc2VzIChzaW1wbGUgKyBmdXR1cmUtcHJvb2YpLlxyXG5cdFx0QXJyYXkuZnJvbSggd3JhcC5jbGFzc0xpc3QgKS5mb3JFYWNoKCBmdW5jdGlvbiAoY2xzKSB7XHJcblx0XHRcdGlmICggL153cGJjX3RoZW1lXy8udGVzdCggY2xzICkgKSB7XHJcblx0XHRcdFx0d3JhcC5jbGFzc0xpc3QucmVtb3ZlKCBjbHMgKTtcclxuXHRcdFx0fVxyXG5cdFx0fSApO1xyXG5cclxuXHRcdGlmICggdmFsdWUgKSB7XHJcblx0XHRcdHdyYXAuY2xhc3NMaXN0LmFkZCggU3RyaW5nKCB2YWx1ZSApICk7XHJcblx0XHR9XHJcblx0fSApO1xyXG59ICk7XHJcblxyXG5cclxuLy8gQk9PS0lOR19GT1JNX0xBWU9VVF9XSURUSCDigJQgRm9ybSB3aWR0aDogYXBwbGllcyBjb21iaW5lZCBcIjEwMCVcIiAvIFwiNjAwcHhcIiAvIFwiNDByZW1cIiB0byB0aGUgYm9va2luZyBmb3JtIGNvbnRhaW5lcnMuXHJcbldQQkNfQkZCX1NldHRpbmdzX0VmZmVjdHMucmVnaXN0ZXIoICdib29raW5nX2Zvcm1fbGF5b3V0X3dpZHRoJywgZnVuY3Rpb24gKHZhbHVlLCBjdHgpIHtcclxuXHRjb25zdCByb290ID0gY3R4ICYmIGN0eC5jYW52YXM7XHJcblx0aWYgKCAhIHJvb3QgfHwgISByb290LnF1ZXJ5U2VsZWN0b3JBbGwgKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHRjb25zdCB3cmFwcyA9IHJvb3QucXVlcnlTZWxlY3RvckFsbCggJy53cGJjX2JmYl9fZm9ybV9wcmV2aWV3X3NlY3Rpb25fY29udGFpbmVyJyApO1xyXG5cdGlmICggISB3cmFwcy5sZW5ndGggKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHRjb25zdCB2ID0gU3RyaW5nKCB2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZSApLnRyaW0oKTtcclxuXHJcblx0Ly8gYWxsb3cgb25seSBcIm51bWJlciArIHVuaXRcIi5cclxuXHRpZiAoIHYgJiYgISAvXi0/XFxkKyg/OlxcLlxcZCspPyg/OiV8cHh8cmVtfGVtfHZ3fHZoKSQvLnRlc3QoIHYgKSApIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdHdyYXBzLmZvckVhY2goXHJcblx0XHRmdW5jdGlvbiAod3JhcCkge1xyXG5cdFx0XHRpZiAoICEgd3JhcCB8fCAhIHdyYXAuc3R5bGUgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoICEgdiApIHtcclxuXHRcdFx0XHR3cmFwLnN0eWxlLnJlbW92ZVByb3BlcnR5KCAnLS13cGJjLWJmYi1ib29raW5nX2Zvcm1fbGF5b3V0X3dpZHRoJyApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHdyYXAuc3R5bGUuc2V0UHJvcGVydHkoICctLXdwYmMtYmZiLWJvb2tpbmdfZm9ybV9sYXlvdXRfd2lkdGgnLCB2ICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHQpO1xyXG59ICk7XHJcblxyXG5cclxuLy8gRGVidWcgUHJldmlldyBNb2RlLlxyXG5XUEJDX0JGQl9TZXR0aW5nc19FZmZlY3RzLnJlZ2lzdGVyKCAnYm9va2luZ19iZmJfcHJldmlld19tb2RlJywgZnVuY3Rpb24gKHZhbHVlLCBjdHgpIHtcclxuXHRjb25zdCByb290ID0gY3R4LmNhbnZhcztcclxuXHRpZiAoICEgcm9vdCB8fCAhIHJvb3QucXVlcnlTZWxlY3RvckFsbCApIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdGNvbnN0IHdyYXBzID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCAnLndwYmNfY29udGFpbmVyLndwYmNfZm9ybScgKTtcclxuXHRpZiAoICEgd3JhcHMubGVuZ3RoICkge1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHJcblx0Ly8gR2V0IGJ1aWxkZXIgYXN5bmMuXHJcblx0d3BiY19iZmJfYXBpLndpdGhfYnVpbGRlcihcclxuXHRcdGZ1bmN0aW9uIChCdWlsZGVyKSB7XHJcblxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogQ2FwdHVyZSBhY3RpdmUgcmlnaHQgc2lkZWJhciB0YWIgYW5kIHJldHVybiByZXN0b3JlIGhhbmRsZS5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQHJldHVybiB7e3Jlc3RvcmU6ZnVuY3Rpb24oKTp2b2lkfXxudWxsfVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0ZnVuY3Rpb24gY2FwdHVyZV9yaWdodF9zaWRlYmFyX2FjdGl2ZV90YWJfcmVzdG9yZV9oYW5kbGUoKSB7XHJcblxyXG5cdFx0XHRcdHZhciB0YWJsaXN0X2VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9fcmlnaHRiYXJfdGFic1tyb2xlPVwidGFibGlzdFwiXScgKTtcclxuXHRcdFx0XHRpZiAoICEgdGFibGlzdF9lbCApIHtcclxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dmFyIGFjdGl2ZV90YWJfZWwgPSB0YWJsaXN0X2VsLnF1ZXJ5U2VsZWN0b3IoICdbcm9sZT1cInRhYlwiXVthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXScgKTtcclxuXHJcblx0XHRcdFx0aWYgKCAhIGFjdGl2ZV90YWJfZWwgKSB7XHJcblx0XHRcdFx0XHRhY3RpdmVfdGFiX2VsID0gdGFibGlzdF9lbC5xdWVyeVNlbGVjdG9yKCAnW3JvbGU9XCJ0YWJcIl1bYXJpYS1jb250cm9scz1cIndwYmNfYmZiX19wYWxldHRlX2FkZF9uZXdcIl0nICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoICEgYWN0aXZlX3RhYl9lbCB8fCB0eXBlb2YgYWN0aXZlX3RhYl9lbC5jbGljayAhPT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdHJlc3RvcmU6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdFx0dHJ5IHsgYWN0aXZlX3RhYl9lbC5jbGljaygpOyB9IGNhdGNoICggX2UgKSB7fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH07XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciB0YWJfcmVzdG9yZV9oYW5kbGUgPSBjYXB0dXJlX3JpZ2h0X3NpZGViYXJfYWN0aXZlX3RhYl9yZXN0b3JlX2hhbmRsZSgpO1xyXG5cclxuXHRcdFx0bGV0IHJlc3RvcmVkICA9IGZhbHNlO1xyXG5cdFx0XHR2YXIgRVZTICAgICAgPSB3aW5kb3cuV1BCQ19CRkJfQ29yZSAmJiB3aW5kb3cuV1BCQ19CRkJfQ29yZS5XUEJDX0JGQl9FdmVudHMgPyB3aW5kb3cuV1BCQ19CRkJfQ29yZS5XUEJDX0JGQl9FdmVudHMgOiB7fTtcclxuXHRcdFx0dmFyIEVWX0RPTkUgID0gRVZTLlNUUlVDVFVSRV9MT0FERUQgfHwgRVZTLkNBTlZBU19SRUZSRVNIRUQgfHwgJ3dwYmM6YmZiOnN0cnVjdHVyZS1sb2FkZWQnO1xyXG5cclxuXHJcblx0XHRcdGZ1bmN0aW9uIGRvX3Jlc3RvcmUoKSB7XHJcblx0XHRcdFx0aWYgKCByZXN0b3JlZCApIHsgcmV0dXJuOyB9XHJcblx0XHRcdFx0cmVzdG9yZWQgPSB0cnVlO1xyXG5cdFx0XHRcdHRyeSB7IEJ1aWxkZXI/LmJ1cz8ub2ZmPy4oIEVWX0RPTkUsIGRvX3Jlc3RvcmUgKTsgfSBjYXRjaCAoIF8gKSB7fVxyXG5cdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSggZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0aWYgKCAhIHRhYl9yZXN0b3JlX2hhbmRsZSApIHsgcmV0dXJuOyB9XHJcblx0XHRcdFx0XHR0YWJfcmVzdG9yZV9oYW5kbGUucmVzdG9yZSgpO1xyXG5cdFx0XHRcdH0gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gTGlzdGVuIG9uY2UgKGJlc3QpLCBwbHVzIGEgZmFsbGJhY2sgaW4gY2FzZSBldmVudCBpc24ndCBmaXJlZC5cclxuXHRcdFx0dHJ5IHsgQnVpbGRlcj8uYnVzPy5vbj8uKCBFVl9ET05FLCBkb19yZXN0b3JlICk7IH0gY2F0Y2ggKCBfICkge31cclxuXHJcblxyXG5cdFx0XHR2YXIgZW5hYmxlZCA9ICgnT24nID09PSB2YWx1ZSk7XHJcblx0XHRcdEJ1aWxkZXIuc2V0X3ByZXZpZXdfbW9kZSggZW5hYmxlZCwgeyByZWJ1aWxkOiB0cnVlLCByZWluaXQ6IHRydWUsIHNvdXJjZTogJ3NldHRpbmdzLWVmZmVjdHMnIH0gKTtcclxuXHRcdH1cclxuXHQpO1xyXG5cclxufSApO1xyXG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsVUFBVUEsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDaEIsWUFBWTs7RUFFWixNQUFNQyxPQUFPLEdBQUlGLENBQUMsQ0FBQ0cseUJBQXlCLEdBQUdILENBQUMsQ0FBQ0cseUJBQXlCLElBQUksQ0FBQyxDQUFFO0VBQ2pGLE1BQU1DLEdBQUcsR0FBUUYsT0FBTyxDQUFDRSxHQUFHLEdBQUdGLE9BQU8sQ0FBQ0UsR0FBRyxJQUFJQyxNQUFNLENBQUNDLE1BQU0sQ0FBRSxJQUFLLENBQUU7RUFFcEVKLE9BQU8sQ0FBQ0ssUUFBUSxHQUFHLFVBQVVDLEdBQUcsRUFBRUMsRUFBRSxFQUFFO0lBQ3JDLElBQUtELEdBQUcsSUFBSSxPQUFPQyxFQUFFLEtBQUssVUFBVSxFQUFHO01BQ3RDTCxHQUFHLENBQUNNLE1BQU0sQ0FBRUYsR0FBSSxDQUFDLENBQUMsR0FBR0MsRUFBRTtJQUN4QjtFQUNELENBQUM7RUFFRCxTQUFTRSxlQUFlQSxDQUFBLEVBQUc7SUFDMUIsT0FDQ1YsQ0FBQyxDQUFDVyxhQUFhLENBQUUsNEJBQTZCLENBQUMsSUFDL0NYLENBQUMsQ0FBQ1csYUFBYSxDQUFFLDJCQUE0QixDQUFDLElBQzlDWCxDQUFD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
361