| 1 |
"use strict"; |
| 2 |
|
| 3 |
/** Add Booking administrator inspector interactions. */ |
| 4 |
(function ($) { |
| 5 |
'use strict'; |
| 6 |
|
| 7 |
var active_days_selection_override = ''; |
| 8 |
var days_selection_enforcement_timers = []; |
| 9 |
|
| 10 |
/** |
| 11 |
* Show the panel controlled by one compact right-sidebar tab. |
| 12 |
* |
| 13 |
* @param {jQuery} $tab Selected tab button. |
| 14 |
* @return {void} |
| 15 |
*/ |
| 16 |
function switch_right_panel($tab) { |
| 17 |
var panel_id = $tab.attr('aria-controls'); |
| 18 |
var $tabs = $tab.closest('.wpbc_add_booking__rightbar_tabs').find('[role="tab"]'); |
| 19 |
var $panels = $('.wpbc_add_booking__rightbar').find('[role="tabpanel"]'); |
| 20 |
if (!panel_id || !$('#' + panel_id).length) { |
| 21 |
return; |
| 22 |
} |
| 23 |
$tabs.attr('aria-selected', 'false'); |
| 24 |
$tab.attr('aria-selected', 'true'); |
| 25 |
$panels.attr({ |
| 26 |
hidden: true, |
| 27 |
'aria-hidden': 'true' |
| 28 |
}); |
| 29 |
$('#' + panel_id).removeAttr('hidden').attr('aria-hidden', 'false'); |
| 30 |
} |
| 31 |
|
| 32 |
/** |
| 33 |
* Expand an inspector group and focus one of its controls. |
| 34 |
* |
| 35 |
* The shared collapsible controller is used when available so exclusive |
| 36 |
* groups and ARIA state stay synchronized. The header click is a safe |
| 37 |
* fallback for older Booking Calendar admin bundles. |
| 38 |
* |
| 39 |
* @param {string} group_name Group data key. |
| 40 |
* @param {string} focus_selector Optional control to focus after expansion. |
| 41 |
* @return {void} |
| 42 |
*/ |
| 43 |
function open_settings_group(group_name, focus_selector) { |
| 44 |
var $group = $('.wpbc_add_booking__inspector_settings .wpbc_ui__collapsible_group[data-group="' + group_name + '"]').first(); |
| 45 |
var root; |
| 46 |
var controller; |
| 47 |
if (!$group.length) { |
| 48 |
return; |
| 49 |
} |
| 50 |
root = $group.closest('.wpbc_collapsible').get(0); |
| 51 |
controller = root && root.__wpbc_collapsible_instance ? root.__wpbc_collapsible_instance : null; |
| 52 |
if (controller && 'function' === typeof controller.expand) { |
| 53 |
controller.expand($group.get(0)); |
| 54 |
} else { |
| 55 |
$group.siblings('.wpbc_ui__collapsible_group').each(function () { |
| 56 |
var $sibling = $(this); |
| 57 |
$sibling.removeClass('is-open'); |
| 58 |
$sibling.children('.group__header').attr('aria-expanded', 'false'); |
| 59 |
$sibling.children('.group__fields').attr({ |
| 60 |
hidden: true, |
| 61 |
'aria-hidden': 'true' |
| 62 |
}); |
| 63 |
}); |
| 64 |
$group.addClass('is-open'); |
| 65 |
$group.children('.group__header').attr('aria-expanded', 'true'); |
| 66 |
$group.children('.group__fields').removeAttr('hidden').attr('aria-hidden', 'false'); |
| 67 |
} |
| 68 |
window.requestAnimationFrame(function () { |
| 69 |
$group.get(0).scrollIntoView({ |
| 70 |
behavior: 'smooth', |
| 71 |
block: 'start' |
| 72 |
}); |
| 73 |
if (focus_selector) { |
| 74 |
window.setTimeout(function () { |
| 75 |
$(focus_selector).first().trigger('focus'); |
| 76 |
}, 250); |
| 77 |
} |
| 78 |
}); |
| 79 |
} |
| 80 |
|
| 81 |
/** |
| 82 |
* Synchronize Booking Tools status links with their current toggle values. |
| 83 |
* |
| 84 |
* @return {void} |
| 85 |
*/ |
| 86 |
function refresh_booking_tools_summary() { |
| 87 |
var $summary = $('.wpbc_add_booking__setup_summary').first(); |
| 88 |
var enabled_label; |
| 89 |
var disabled_label; |
| 90 |
if (!$summary.length) { |
| 91 |
return; |
| 92 |
} |
| 93 |
enabled_label = $summary.attr('data-wpbc-add-booking-enabled-label') || 'Enabled'; |
| 94 |
disabled_label = $summary.attr('data-wpbc-add-booking-disabled-label') || 'Disabled'; |
| 95 |
$summary.find('[data-wpbc-add-booking-summary="emails"]').text($('#is_send_email_for_pending').is(':checked') ? enabled_label : disabled_label); |
| 96 |
$summary.find('[data-wpbc-add-booking-summary="allow-past"]').text($('#is_allow_bookings_in_past').is(':checked') ? enabled_label : disabled_label); |
| 97 |
} |
| 98 |
|
| 99 |
/** |
| 100 |
* Get the Add Booking date-selection radio container. |
| 101 |
* |
| 102 |
* @return {jQuery} Date-selection container, when rendered. |
| 103 |
*/ |
| 104 |
function get_days_selection_container() { |
| 105 |
return $('[data-wpbc-add-booking-days-selection="1"]').first(); |
| 106 |
} |
| 107 |
|
| 108 |
/** |
| 109 |
* Normalize calendar engine modes to the three administrator radio choices. |
| 110 |
* |
| 111 |
* @param {string} mode Calendar or radio mode. |
| 112 |
* @return {string} single, multiple, range, or an empty string. |
| 113 |
*/ |
| 114 |
function normalize_days_selection_mode(mode) { |
| 115 |
mode = String(mode || ''); |
| 116 |
if ('fixed' === mode || 'dynamic' === mode || 'range' === mode) { |
| 117 |
return 'range'; |
| 118 |
} |
| 119 |
return 'single' === mode || 'multiple' === mode ? mode : ''; |
| 120 |
} |
| 121 |
|
| 122 |
/** |
| 123 |
* Get the current Add Booking resource ID from the radio control context. |
| 124 |
* |
| 125 |
* @return {number} Positive resource ID, or zero when unavailable. |
| 126 |
*/ |
| 127 |
function get_days_selection_resource_id() { |
| 128 |
var resource_id = parseInt(get_days_selection_container().attr('data-wpbc-resource-id'), 10); |
| 129 |
if (!resource_id && window.wpbc_add_booking_component_context) { |
| 130 |
resource_id = parseInt(window.wpbc_add_booking_component_context.resource_id, 10); |
| 131 |
} |
| 132 |
return resource_id > 0 ? resource_id : 0; |
| 133 |
} |
| 134 |
|
| 135 |
/** |
| 136 |
* Read one calendar parameter without exposing page state globally. |
| 137 |
* |
| 138 |
* @param {number} resource_id Booking resource ID. |
| 139 |
* @param {string} parameter_name Calendar parameter name. |
| 140 |
* @return {*} Current parameter value, or null when the calendar is unavailable. |
| 141 |
*/ |
| 142 |
function get_calendar_parameter(resource_id, parameter_name) { |
| 143 |
if (!window._wpbc || !window._wpbc.calendar || 'function' !== typeof window._wpbc.calendar__get_param_value) { |
| 144 |
return null; |
| 145 |
} |
| 146 |
return window._wpbc.calendar__get_param_value(resource_id, parameter_name); |
| 147 |
} |
| 148 |
|
| 149 |
/** |
| 150 |
* Normalize an array or comma-separated calendar parameter into integers. |
| 151 |
* |
| 152 |
* @param {Array|number|string} parameter_value Calendar parameter value. |
| 153 |
* @param {Array} fallback_value Value returned when no valid numbers exist. |
| 154 |
* @return {Array} Integer values. |
| 155 |
*/ |
| 156 |
function normalize_calendar_number_list(parameter_value, fallback_value) { |
| 157 |
var values = Array.isArray(parameter_value) ? parameter_value : String(parameter_value || '').split(','); |
| 158 |
var normalized_values = []; |
| 159 |
$.each(values, function (index, number_value) { |
| 160 |
var parsed_number = parseInt(number_value, 10); |
| 161 |
if (!isNaN(parsed_number)) { |
| 162 |
normalized_values.push(parsed_number); |
| 163 |
} |
| 164 |
}); |
| 165 |
return normalized_values.length ? normalized_values : fallback_value; |
| 166 |
} |
| 167 |
|
| 168 |
/** |
| 169 |
* Get the fixed/dynamic engine to use for the Range days radio choice. |
| 170 |
* |
| 171 |
* @return {string} fixed or dynamic. |
| 172 |
*/ |
| 173 |
function get_range_engine_mode() { |
| 174 |
var range_engine_mode = String(get_days_selection_container().attr('data-wpbc-range-engine-mode') || 'dynamic'); |
| 175 |
return 'fixed' === range_engine_mode ? 'fixed' : 'dynamic'; |
| 176 |
} |
| 177 |
|
| 178 |
/** |
| 179 |
* Update the checked radio and visible setup summary from an effective mode. |
| 180 |
* |
| 181 |
* @param {string} mode Calendar or radio mode. |
| 182 |
* @return {void} |
| 183 |
*/ |
| 184 |
function sync_days_selection_controls(mode) { |
| 185 |
var normalized_mode = normalize_days_selection_mode(mode); |
| 186 |
var $container = get_days_selection_container(); |
| 187 |
var $radio; |
| 188 |
var mode_label; |
| 189 |
if (!normalized_mode || !$container.length) { |
| 190 |
return; |
| 191 |
} |
| 192 |
$radio = $container.find('input[name="wpbc_add_booking_days_selection_mode"][value="' + normalized_mode + '"]'); |
| 193 |
if (1 !== $radio.length) { |
| 194 |
return; |
| 195 |
} |
| 196 |
$radio.prop('checked', true); |
| 197 |
mode_label = $radio.attr('data-wpbc-days-selection-label') || normalized_mode; |
| 198 |
$('[data-wpbc-add-booking-summary="days-selection"]').text(mode_label); |
| 199 |
} |
| 200 |
|
| 201 |
/** |
| 202 |
* Clear selected dates before changing their selection semantics. |
| 203 |
* |
| 204 |
* Customer fields remain untouched. Existing calendar helpers are used when |
| 205 |
* available so Datepick state and the hidden selected-date field stay aligned. |
| 206 |
* |
| 207 |
* @param {number} resource_id Booking resource ID. |
| 208 |
* @return {void} |
| 209 |
*/ |
| 210 |
function clear_selected_booking_dates(resource_id) { |
| 211 |
var $date_field = $('#date_booking' + resource_id); |
| 212 |
if (!$date_field.length || !String($date_field.val() || '').trim()) { |
| 213 |
return; |
| 214 |
} |
| 215 |
if ('function' === typeof window.wpbc_calendar__unselect_all_dates) { |
| 216 |
window.wpbc_calendar__unselect_all_dates(resource_id); |
| 217 |
} else { |
| 218 |
$date_field.val(''); |
| 219 |
} |
| 220 |
if ('function' === typeof window.wpbc_disable_time_fields_in_booking_form) { |
| 221 |
window.wpbc_disable_time_fields_in_booking_form(resource_id); |
| 222 |
} |
| 223 |
} |
| 224 |
|
| 225 |
/** |
| 226 |
* Apply one radio mode through the shared immediate calendar helpers. |
| 227 |
* |
| 228 |
* Range mode retains the configured fixed/dynamic subtype and its existing |
| 229 |
* number-of-days and weekday parameters. No settings are saved. |
| 230 |
* |
| 231 |
* @param {string} mode Requested radio mode. |
| 232 |
* @param {boolean} clear_dates Whether an existing selection must be cleared. |
| 233 |
* @return {boolean} True when the requested helper was applied or already active. |
| 234 |
*/ |
| 235 |
function apply_days_selection_mode(mode, clear_dates) { |
| 236 |
var normalized_mode = normalize_days_selection_mode(mode); |
| 237 |
var resource_id = get_days_selection_resource_id(); |
| 238 |
var desired_engine_mode = 'range' === normalized_mode ? get_range_engine_mode() : normalized_mode; |
| 239 |
var current_engine_mode; |
| 240 |
var fixed_days_number; |
| 241 |
if (!normalized_mode || !resource_id) { |
| 242 |
return false; |
| 243 |
} |
| 244 |
current_engine_mode = String(get_calendar_parameter(resource_id, 'days_select_mode') || ''); |
| 245 |
if (desired_engine_mode === current_engine_mode) { |
| 246 |
sync_days_selection_controls(normalized_mode); |
| 247 |
return true; |
| 248 |
} |
| 249 |
if (clear_dates) { |
| 250 |
clear_selected_booking_dates(resource_id); |
| 251 |
} |
| 252 |
if ('single' === normalized_mode && 'function' === typeof window.wpbc_cal_days_select__single) { |
| 253 |
window.wpbc_cal_days_select__single(resource_id); |
| 254 |
} else if ('multiple' === normalized_mode && 'function' === typeof window.wpbc_cal_days_select__multiple) { |
| 255 |
window.wpbc_cal_days_select__multiple(resource_id); |
| 256 |
} else if ('range' === normalized_mode && 'fixed' === desired_engine_mode && 'function' === typeof window.wpbc_cal_days_select__fixed) { |
| 257 |
fixed_days_number = parseInt(get_calendar_parameter(resource_id, 'fixed__days_num'), 10); |
| 258 |
window.wpbc_cal_days_select__fixed(resource_id, fixed_days_number > 0 ? fixed_days_number : 3, normalize_calendar_number_list(get_calendar_parameter(resource_id, 'fixed__week_days__start'), [-1])); |
| 259 |
} else if ('range' === normalized_mode && 'function' === typeof window.wpbc_cal_days_select__range_mode) { |
| 260 |
window.wpbc_cal_days_select__range_mode(resource_id); |
| 261 |
} else { |
| 262 |
return false; |
| 263 |
} |
| 264 |
sync_days_selection_controls(normalized_mode); |
| 265 |
return true; |
| 266 |
} |
| 267 |
|
| 268 |
/** |
| 269 |
* Synchronize controls with the calendar, or enforce a user-selected override. |
| 270 |
* |
| 271 |
* @return {void} |
| 272 |
*/ |
| 273 |
function synchronize_days_selection_mode() { |
| 274 |
var resource_id = get_days_selection_resource_id(); |
| 275 |
var current_engine_mode; |
| 276 |
if (!resource_id) { |
| 277 |
return; |
| 278 |
} |
| 279 |
if (active_days_selection_override) { |
| 280 |
apply_days_selection_mode(active_days_selection_override, false); |
| 281 |
return; |
| 282 |
} |
| 283 |
current_engine_mode = get_calendar_parameter(resource_id, 'days_select_mode'); |
| 284 |
sync_days_selection_controls(current_engine_mode); |
| 285 |
} |
| 286 |
|
| 287 |
/** |
| 288 |
* Recheck mode after the selected Booking Form's legacy delayed initializer. |
| 289 |
* |
| 290 |
* Existing timers are cancelled so repeated clicks cannot accumulate work. |
| 291 |
* Reapplication occurs only when the calendar engine mode was changed by a |
| 292 |
* later initializer, avoiding unnecessary calendar renders. |
| 293 |
* |
| 294 |
* @return {void} |
| 295 |
*/ |
| 296 |
function schedule_days_selection_synchronization() { |
| 297 |
$.each(days_selection_enforcement_timers, function (index, timer_id) { |
| 298 |
window.clearTimeout(timer_id); |
| 299 |
}); |
| 300 |
days_selection_enforcement_timers = []; |
| 301 |
$.each([0, 120, 1150, 2200], function (index, delay) { |
| 302 |
days_selection_enforcement_timers.push(window.setTimeout(synchronize_days_selection_mode, delay)); |
| 303 |
}); |
| 304 |
} |
| 305 |
|
| 306 |
/** |
| 307 |
* Copy the authoritative cost-correction number into its convenience slider. |
| 308 |
* |
| 309 |
* The slider intentionally keeps its 0-1000 exploration range. Exact values, |
| 310 |
* including decimals and totals above 1000, remain unchanged in the number input. |
| 311 |
* |
| 312 |
* @return {void} |
| 313 |
*/ |
| 314 |
function synchronize_cost_correction_range() { |
| 315 |
var $number_field = $('#wpbc_add_booking_cost_correction'); |
| 316 |
var $range = $('.wpbc_add_booking__cost_correction [data-wpbc-admin-cost-correction-range="1"]').first(); |
| 317 |
var number_value; |
| 318 |
if (!$number_field.length || !$range.length) { |
| 319 |
return; |
| 320 |
} |
| 321 |
number_value = Number($number_field.val()); |
| 322 |
if ('' === String($number_field.val() || '').trim() || !isFinite(number_value)) { |
| 323 |
$range.val('0'); |
| 324 |
return; |
| 325 |
} |
| 326 |
$range.val(String(number_value)); |
| 327 |
} |
| 328 |
|
| 329 |
/** |
| 330 |
* Copy the convenience slider into the authoritative number input. |
| 331 |
* |
| 332 |
* @return {void} |
| 333 |
*/ |
| 334 |
function synchronize_cost_correction_number() { |
| 335 |
var $number_field = $('#wpbc_add_booking_cost_correction'); |
| 336 |
var $range = $('.wpbc_add_booking__cost_correction [data-wpbc-admin-cost-correction-range="1"]').first(); |
| 337 |
if (!$number_field.length || !$range.length) { |
| 338 |
return; |
| 339 |
} |
| 340 |
$number_field.val($range.val()).trigger('input'); |
| 341 |
} |
| 342 |
|
| 343 |
/** |
| 344 |
* Add an explicitly entered correction to the outgoing Add Booking request. |
| 345 |
* |
| 346 |
* The control is outside the Booking Form element and therefore is not part of |
| 347 |
* the legacy serialized form data. The server authorizes and normalizes this |
| 348 |
* dedicated value before it reaches the Business Small cost pipeline. |
| 349 |
* |
| 350 |
* @param {Event} event jQuery event. |
| 351 |
* @param {number} resource_id Submitted Booking resource ID. |
| 352 |
* @param {Object} params Mutable booking-create request parameters. |
| 353 |
* @return {void} |
| 354 |
*/ |
| 355 |
function add_cost_correction_to_booking_request(event, resource_id, params) { |
| 356 |
var number_field = document.getElementById('wpbc_add_booking_cost_correction'); |
| 357 |
var raw_cost; |
| 358 |
if (!params || !number_field) { |
| 359 |
return; |
| 360 |
} |
| 361 |
delete params.wpbc_admin_cost_correction; |
| 362 |
raw_cost = String(number_field.value || '').trim(); |
| 363 |
if ('' === raw_cost || !number_field.checkValidity()) { |
| 364 |
return; |
| 365 |
} |
| 366 |
params.wpbc_admin_cost_correction = raw_cost; |
| 367 |
} |
| 368 |
$(document).on('click', '.wpbc_add_booking__rightbar_tabs [role="tab"]', function () { |
| 369 |
switch_right_panel($(this)); |
| 370 |
}); |
| 371 |
$(document).on('click', '.wpbc_add_booking__setup_summary_link', function (event) { |
| 372 |
event.preventDefault(); |
| 373 |
open_settings_group($(this).attr('data-wpbc-add-booking-open-group'), $(this).attr('data-wpbc-add-booking-focus') || ''); |
| 374 |
}); |
| 375 |
$(document).on('change', '#is_send_email_for_pending, #is_allow_bookings_in_past', refresh_booking_tools_summary); |
| 376 |
$(document).on('input', '#wpbc_add_booking_cost_correction', synchronize_cost_correction_range); |
| 377 |
$(document).on('input', '.wpbc_add_booking__cost_correction [data-wpbc-admin-cost-correction-range="1"]', synchronize_cost_correction_number); |
| 378 |
$('body').on('wpbc_before_booking_create.wpbc_add_booking_cost_correction', add_cost_correction_to_booking_request); |
| 379 |
$(document).on('click', 'input[name="wpbc_add_booking_days_selection_mode"]', function () { |
| 380 |
active_days_selection_override = normalize_days_selection_mode($(this).val()); |
| 381 |
apply_days_selection_mode(active_days_selection_override, true); |
| 382 |
schedule_days_selection_synchronization(); |
| 383 |
}); |
| 384 |
$(refresh_booking_tools_summary); |
| 385 |
$(synchronize_cost_correction_range); |
| 386 |
$(schedule_days_selection_synchronization); |
| 387 |
})(jQuery); |
| 388 |
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1hZGQtYm9va2luZy9fb3V0L2FkZF9ib29raW5nX3BhZ2UuanMiLCJuYW1lcyI6WyIkIiwiYWN0aXZlX2RheXNfc2VsZWN0aW9uX292ZXJyaWRlIiwiZGF5c19zZWxlY3Rpb25fZW5mb3JjZW1lbnRfdGltZXJzIiwic3dpdGNoX3JpZ2h0X3BhbmVsIiwiJHRhYiIsInBhbmVsX2lkIiwiYXR0ciIsIiR0YWJzIiwiY2xvc2VzdCIsImZpbmQiLCIkcGFuZWxzIiwibGVuZ3RoIiwiaGlkZGVuIiwicmVtb3ZlQXR0ciIsIm9wZW5fc2V0dGluZ3NfZ3JvdXAiLCJncm91cF9uYW1lIiwiZm9jdXNfc2VsZWN0b3IiLCIkZ3JvdXAiLCJmaXJzdCIsInJvb3QiLCJjb250cm9sbGVyIiwiZ2V0IiwiX193cGJjX2NvbGxhcHNpYmxlX2luc3RhbmNlIiwiZXhwYW5kIiwic2libGluZ3MiLCJlYWNoIiwiJHNpYmxpbmciLCJyZW1vdmVDbGFzcyIsImNoaWxkcmVuIiwiYWRkQ2xhc3MiLCJ3aW5kb3ciLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJzY3JvbGxJbnRvVmlldyIsImJlaGF2aW9yIiwiYmxvY2siLCJzZXRUaW1lb3V0IiwidHJpZ2dlciIsInJlZnJlc2hfYm9va2luZ190b29sc19zdW1tYXJ5IiwiJHN1bW1hcnkiLCJlbmFibGVkX2xhYmVsIiwiZGlzYWJsZWRfbGFiZWwiLCJ0ZXh0IiwiaXMiLCJnZXRfZGF5c19zZWxlY3Rpb25fY29udGFpbmVyIiwibm9ybWFsaXplX2RheXNfc2VsZWN0aW9uX21vZGUiLCJtb2RlIiwiU3RyaW5nIiwiZ2V0X2RheXNfc2VsZWN0aW9uX3Jlc291cmNlX2lkIiwicmVzb3VyY2VfaWQiLCJwYXJzZUludCIsIndwYmNfYWRkX2Jvb2tpbmdfY29tcG9uZW50X2NvbnRleHQiLCJnZXRfY2FsZW5kYXJfcGFyYW1ldGVyIiwicGFyYW1ldGVyX25hbWUiLCJfd3BiYyIsImNhbGVuZGFyIiwiY2FsZW5kYXJfX2dldF9wYXJhbV92YWx1ZSIsIm5vcm1hbGl6ZV9jYWxlbmRhcl9udW1iZXJfbGlzdCIsInBhcmFtZXRlcl92YWx1ZSIsImZhbGxiYWNrX3ZhbHVlIiwidmFsdWVzIiwiQXJyYXkiLCJpc0FycmF5Iiwic3BsaXQiLCJub3JtYWxpemVkX3ZhbHVlcyIsImluZGV4IiwibnVtYmVyX3ZhbHVlIiwicGFyc2VkX251bWJlciIsImlzTmFOIiwicHVzaCIsImdldF9yYW5nZV9lbmdpbmVfbW9kZSIsInJhbmdlX2VuZ2luZV9tb2RlIiwic3luY19kYXlzX3NlbGVjdGlvbl9jb250cm9scyIsIm5vcm1hbGl6ZWRfbW9kZSIsIiRjb250YWluZXIiLCIkcmFkaW8iLCJtb2RlX2xhYmVsIiwicHJvcCIsImNsZWFyX3NlbGVjdGVkX2Jvb2tpbmdfZGF0ZXMiLCIkZGF0ZV9maWVsZCIsInZhbCIsInRyaW0iLCJ3cGJjX2NhbGVuZGFyX191bnNlbGVjdF9hbGxfZGF0ZXMiLCJ3cGJjX2Rpc2FibGVfdGltZV9maWVsZHNfaW5fYm9va2luZ19mb3JtIiwiYXBwbHlfZGF5c19zZWxlY3Rpb25fbW9kZSIsImNsZWFyX2RhdGVzIiwiZGVzaXJlZF9lbmdpbmVfbW9kZSIsImN1cnJlbnRfZW5naW5lX21vZGUiLCJmaXhlZF9kYXlzX251bWJlciIsIndwYmNfY2FsX2RheXNfc2VsZWN0X19zaW5nbGUiLCJ3cGJjX2NhbF9kYXlzX3NlbGVjdF9fbXVsdGlwbGUiLCJ3cGJjX2NhbF9kYXlzX3NlbGVjdF9fZml4ZWQiLCJ3cGJjX2NhbF9kYXlzX3NlbGVjdF9fcmFuZ2VfbW9kZSIsInN5bmNocm9uaXplX2RheXNfc2VsZWN0aW9uX21vZGUiLCJzY2hlZHVsZV9kYXlzX3NlbGVjdGlvbl9zeW5jaHJvbml6YXRpb24iLCJ0aW1lcl9pZCIsImNsZWFyVGltZW91dCIsImRlbGF5Iiwic3luY2hyb25pemVfY29zdF9jb3JyZWN0aW9uX3JhbmdlIiwiJG51bWJlcl9maWVsZCIsIiRyYW5nZSIsIk51bWJlciIsImlzRmluaXRlIiwic3luY2hyb25pemVfY29zdF9jb3JyZWN0aW9uX251bWJlciIsImFkZF9jb3N0X2NvcnJlY3Rpb25fdG9fYm9va2luZ19yZXF1ZXN0IiwiZXZlbnQiLCJwYXJhbXMiLCJudW1iZXJfZmllbGQiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwicmF3X2Nvc3QiLCJ3cGJjX2FkbWluX2Nvc3RfY29ycmVjdGlvbiIsInZhbHVlIiwiY2hlY2tWYWxpZGl0eSIsIm9uIiwicHJldmVudERlZmF1bHQiLCJqUXVlcnkiXSwic291cmNlcyI6WyJpbmNsdWRlcy9wYWdlLWFkZC1ib29raW5nL19zcmMvYWRkX2Jvb2tpbmdfcGFnZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQWRkIEJvb2tpbmcgYWRtaW5pc3RyYXRvciBpbnNwZWN0b3IgaW50ZXJhY3Rpb25zLiAqL1xuKCBmdW5jdGlvbiAoICQgKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgYWN0aXZlX2RheXNfc2VsZWN0aW9uX292ZXJyaWRlID0gJyc7XG5cdHZhciBkYXlzX3NlbGVjdGlvbl9lbmZvcmNlbWVudF90aW1lcnMgPSBbXTtcblxuXHQvKipcblx0ICogU2hvdyB0aGUgcGFuZWwgY29udHJvbGxlZCBieSBvbmUgY29tcGFjdCByaWdodC1zaWRlYmFyIHRhYi5cblx0ICpcblx0ICogQHBhcmFtIHtqUXVlcnl9ICR0YWIgU2VsZWN0ZWQgdGFiIGJ1dHRvbi5cblx0ICogQHJldHVybiB7dm9pZH1cblx0ICovXG5cdGZ1bmN0aW9uIHN3aXRjaF9yaWdodF9wYW5lbCggJHRhYiApIHtcblx0XHR2YXIgcGFuZWxfaWQgPSAkdGFiLmF0dHIoICdhcmlhLWNvbnRyb2xzJyApO1xuXHRcdHZhciAkdGFicyA9ICR0YWIuY2xvc2VzdCggJy53cGJjX2FkZF9ib29raW5nX19yaWdodGJhcl90YWJzJyApLmZpbmQoICdbcm9sZT1cInRhYlwiXScgKTtcblx0XHR2YXIgJHBhbmVscyA9ICQoICcud3BiY19hZGRfYm9va2luZ19fcmlnaHRiYXInICkuZmluZCggJ1tyb2xlPVwidGFicGFuZWxcIl0nICk7XG5cblx0XHRpZiAoICEgcGFuZWxfaWQgfHwgISAkKCAnIycgKyBwYW5lbF9pZCApLmxlbmd0aCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQkdGFicy5hdHRyKCAnYXJpYS1zZWxlY3RlZCcsICdmYWxzZScgKTtcblx0XHQkdGFiLmF0dHIoICdhcmlhLXNlbGVjdGVkJywgJ3RydWUnICk7XG5cdFx0JHBhbmVscy5hdHRyKCB7IGhpZGRlbjogdHJ1ZSwgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0gKTtcblx0XHQkKCAnIycgKyBwYW5lbF9pZCApLnJlbW92ZUF0dHIoICdoaWRkZW4nICkuYXR0ciggJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyApO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4cGFuZCBhbiBpbnNwZWN0b3IgZ3JvdXAgYW5kIGZvY3VzIG9uZSBvZiBpdHMgY29udHJvbHMuXG5cdCAqXG5cdCAqIFRoZSBzaGFyZWQgY29sbGFwc2libGUgY29udHJvbGxlciBpcyB1c2VkIHdoZW4gYXZhaWxhYmxlIHNvIGV4Y2x1c2l2ZVxuXHQgKiBncm91cHMgYW5kIEFSSUEgc3RhdGUgc3RheSBzeW5jaHJvbml6ZWQuIFRoZSBoZWFkZXIgY2xpY2sgaXMgYSBzYWZlXG5cdCAqIGZhbGxiYWNrIGZvciBvbGRlciBCb29raW5nIENhbGVuZGFyIGFkbWluIGJ1bmRsZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBncm91cF9uYW1lIEdyb3VwIGRhdGEga2V5LlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZm9jdXNfc2VsZWN0b3IgT3B0aW9uYWwgY29udHJvbCB0byBmb2N1cyBhZnRlciBleHBhbnNpb24uXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRmdW5jdGlvbiBvcGVuX3NldHRpbmdzX2dyb3VwKCBncm91cF9uYW1lLCBmb2N1c19zZWxlY3RvciApIHtcblx0XHR2YXIgJGdyb3VwID0gJCggJy53cGJjX2FkZF9ib29raW5nX19pbnNwZWN0b3Jfc2V0dGluZ3MgLndwYmNfdWlfX2NvbGxhcHNpYmxlX2dyb3VwW2RhdGEtZ3JvdXA9XCInICsgZ3JvdXBfbmFtZSArICdcIl0nICkuZmlyc3QoKTtcblx0XHR2YXIgcm9vdDtcblx0XHR2YXIgY29udHJvbGxlcjtcblxuXHRcdGlmICggISAkZ3JvdXAubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHJvb3QgPSAkZ3JvdXAuY2xvc2VzdCggJy53cGJjX2NvbGxhcHNpYmxlJyApLmdldCggMCApO1xuXHRcdGNvbnRyb2xsZXIgPSByb290ICYmIHJvb3QuX193cGJjX2NvbGxhcHNpYmxlX2luc3RhbmNlID8gcm9vdC5fX3dwYmNfY29sbGFwc2libGVfaW5zdGFuY2UgOiBudWxsO1xuXG5cdFx0aWYgKCBjb250cm9sbGVyICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBjb250cm9sbGVyLmV4cGFuZCApIHtcblx0XHRcdGNvbnRyb2xsZXIuZXhwYW5kKCAkZ3JvdXAuZ2V0KCAwICkgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0JGdyb3VwLnNpYmxpbmdzKCAnLndwYmNfdWlfX2NvbGxhcHNpYmxlX2dyb3VwJyApLmVhY2goIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dmFyICRzaWJsaW5nID0gJCggdGhpcyApO1xuXG5cdFx0XHRcdCRzaWJsaW5nLnJlbW92ZUNsYXNzKCAnaXMtb3BlbicgKTtcblx0XHRcdFx0JHNpYmxpbmcuY2hpbGRyZW4oICcuZ3JvdXBfX2hlYWRlcicgKS5hdHRyKCAnYXJpYS1leHBhbmRlZCcsICdmYWxzZScgKTtcblx0XHRcdFx0JHNpYmxpbmcuY2hpbGRyZW4oICcuZ3JvdXBfX2ZpZWxkcycgKS5hdHRyKCB7IGhpZGRlbjogdHJ1ZSwgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0gKTtcblx0XHRcdH0gKTtcblx0XHRcdCRncm91cC5hZGRDbGFzcyggJ2lzLW9wZW4nICk7XG5cdFx0XHQkZ3JvdXAuY2hpbGRyZW4oICcuZ3JvdXBfX2hlYWRlcicgKS5hdHRyKCAnYXJpYS1leHBhbmRlZCcsICd0cnVlJyApO1xuXHRcdFx0JGdyb3VwLmNoaWxkcmVuKCAnLmdyb3VwX19maWVsZHMnICkucmVtb3ZlQXR0ciggJ2hpZGRlbicgKS5hdHRyKCAnYXJpYS1oaWRkZW4nLCAnZmFsc2UnICk7XG5cdFx0fVxuXG5cdFx0d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSggZnVuY3Rpb24gKCkge1xuXHRcdFx0JGdyb3VwLmdldCggMCApLnNjcm9sbEludG9WaWV3KCB7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSApO1xuXHRcdFx0aWYgKCBmb2N1c19zZWxlY3RvciApIHtcblx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQkKCBmb2N1c19zZWxlY3RvciApLmZpcnN0KCkudHJpZ2dlciggJ2ZvY3VzJyApO1xuXHRcdFx0XHR9LCAyNTAgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cblxuXHQvKipcblx0ICogU3luY2hyb25pemUgQm9va2luZyBUb29scyBzdGF0dXMgbGlua3Mgd2l0aCB0aGVpciBjdXJyZW50IHRvZ2dsZSB2YWx1ZXMuXG5cdCAqXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRmdW5jdGlvbiByZWZyZXNoX2Jvb2tpbmdfdG9vbHNfc3VtbWFyeSgpIHtcblx0XHR2YXIgJHN1bW1hcnkgPSAkKCAnLndwYmNfYWRkX2Jvb2tpbmdfX3NldHVwX3N1bW1hcnknICkuZmlyc3QoKTtcblx0XHR2YXIgZW5hYmxlZF9sYWJlbDtcblx0XHR2YXIgZGlzYWJsZWRfbGFiZWw7XG5cblx0XHRpZiAoICEgJHN1bW1hcnkubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGVuYWJsZWRfbGFiZWwgPSAkc3VtbWFyeS5hdHRyKCAnZGF0YS13cGJjLWFkZC1ib29raW5nLWVuYWJsZWQtbGFiZWwnICkgfHwgJ0VuYWJsZWQnO1xuXHRcdGRpc2FibGVkX2xhYmVsID0gJHN1bW1hcnkuYXR0ciggJ2RhdGEtd3BiYy1hZGQtYm9va2luZy1kaXNhYmxlZC1sYWJlbCcgKSB8fCAnRGlzYWJsZWQnO1xuXG5cdFx0JHN1bW1hcnkuZmluZCggJ1tkYXRhLXdwYmMtYWRkLWJvb2tpbmctc3VtbWFyeT1cImVtYWlsc1wiXScgKS50ZXh0KFxuXHRcdFx0JCggJyNpc19zZW5kX2VtYWlsX2Zvcl9wZW5kaW5nJyApLmlzKCAnOmNoZWNrZWQnICkgPyBlbmFibGVkX2xhYmVsIDogZGlzYWJsZWRfbGFiZWxcblx0XHQpO1xuXHRcdCRzdW1tYXJ5LmZpbmQoICdbZGF0YS13cGJjLWFkZC1ib29raW5nLXN1bW1hcnk9XCJhbGxvdy1wYXN0XCJdJyApLnRleHQoXG5cdFx0XHQkKCAnI2lzX2FsbG93X2Jvb2tpbmdzX2luX3Bhc3QnICkuaXMoICc6Y2hlY2tlZCcgKSA/IGVuYWJsZWRfbGFiZWwgOiBkaXNhYmxlZF9sYWJlbFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBBZGQgQm9va2luZyBkYXRlLXNlbGVjdGlvbiByYWRpbyBjb250YWluZXIuXG5cdCAqXG5cdCAqIEByZXR1cm4ge2pRdWVyeX0gRGF0ZS1zZWxlY3Rpb24gY29udGFpbmVyLCB3aGVuIHJlbmRlcmVkLlxuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0X2RheXNfc2VsZWN0aW9uX2NvbnRhaW5lcigpIHtcblx0XHRyZXR1cm4gJCggJ1tkYXRhLXdwYmMtYWRkLWJvb2tpbmctZGF5cy1zZWxlY3Rpb249XCIxXCJdJyApLmZpcnN0KCk7XG5cdH1cblxuXHQvKipcblx0ICogTm9ybWFsaXplIGNhbGVuZGFyIGVuZ2luZSBtb2RlcyB0byB0aGUgdGhyZWUgYWRtaW5pc3RyYXRvciByYWRpbyBjaG9pY2VzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbW9kZSBDYWxlbmRhciBvciByYWRpbyBtb2RlLlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IHNpbmdsZSwgbXVsdGlwbGUsIHJhbmdlLCBvciBhbiBlbXB0eSBzdHJpbmcuXG5cdCAqL1xuXHRmdW5jdGlvbiBub3JtYWxpemVfZGF5c19zZWxlY3Rpb25fbW9kZSggbW9kZSApIHtcblx0XHRtb2RlID0gU3RyaW5nKCBtb2RlIHx8ICcnICk7XG5cblx0XHRpZiAoICdmaXhlZCcgPT09IG1vZGUgfHwgJ2R5bmFtaWMnID09PSBtb2RlIHx8ICdyYW5nZScgPT09IG1vZGUgKSB7XG5cdFx0XHRyZXR1cm4gJ3JhbmdlJztcblx0XHR9XG5cblx0XHRyZXR1cm4gJ3NpbmdsZScgPT09IG1vZGUgfHwgJ211bHRpcGxlJyA9PT0gbW9kZSA/IG1vZGUgOiAnJztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGN1cnJlbnQgQWRkIEJvb2tpbmcgcmVzb3VyY2UgSUQgZnJvbSB0aGUgcmFkaW8gY29udHJvbCBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFBvc2l0aXZlIHJlc291cmNlIElELCBvciB6ZXJvIHdoZW4gdW5hdmFpbGFibGUuXG5cdCAqL1xuXHRmdW5jdGlvbiBnZXRfZGF5c19zZWxlY3Rpb25fcmVzb3VyY2VfaWQoKSB7XG5cdFx0dmFyIHJlc291cmNlX2lkID0gcGFyc2VJbnQoIGdldF9kYXlzX3NlbGVjdGlvbl9jb250YWluZXIoKS5hdHRyKCAnZGF0YS13cGJjLXJlc291cmNlLWlkJyApLCAxMCApO1xuXG5cdFx0aWYgKCAhIHJlc291cmNlX2lkICYmIHdpbmRvdy53cGJjX2FkZF9ib29raW5nX2NvbXBvbmVudF9jb250ZXh0ICkge1xuXHRcdFx0cmVzb3VyY2VfaWQgPSBwYXJzZUludCggd2luZG93LndwYmNfYWRkX2Jvb2tpbmdfY29tcG9uZW50X2NvbnRleHQucmVzb3VyY2VfaWQsIDEwICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc291cmNlX2lkID4gMCA/IHJlc291cmNlX2lkIDogMDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWFkIG9uZSBjYWxlbmRhciBwYXJhbWV0ZXIgd2l0aG91dCBleHBvc2luZyBwYWdlIHN0YXRlIGdsb2JhbGx5LlxuXHQgKlxuXHQgKiBAcGFyYW0ge251bWJlcn0gcmVzb3VyY2VfaWQgQm9va2luZyByZXNvdXJjZSBJRC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtZXRlcl9uYW1lIENhbGVuZGFyIHBhcmFtZXRlciBuYW1lLlxuXHQgKiBAcmV0dXJuIHsqfSBDdXJyZW50IHBhcmFtZXRlciB2YWx1ZSwgb3IgbnVsbCB3aGVuIHRoZSBjYWxlbmRhciBpcyB1bmF2YWlsYWJsZS5cblx0ICovXG5cdGZ1bmN0aW9uIGdldF9jYWxlbmRhcl9wYXJhbWV0ZXIoIHJlc291cmNlX2lkLCBwYXJhbWV0ZXJfbmFtZSApIHtcblx0XHRpZiAoICEgd2luZG93Ll93cGJjIHx8ICEgd2luZG93Ll93cGJjLmNhbGVuZGFyIHx8ICdmdW5jdGlvbicgIT09IHR5cGVvZiB3aW5kb3cuX3dwYmMuY2FsZW5kYXJfX2dldF9wYXJhbV92YWx1ZSApIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdHJldHVybiB3aW5kb3cuX3dwYmMuY2FsZW5kYXJfX2dldF9wYXJhbV92YWx1ZSggcmVzb3VyY2VfaWQsIHBhcmFtZXRlcl9uYW1lICk7XG5cdH1cblxuXHQvKipcblx0ICogTm9ybWFsaXplIGFuIGFycmF5IG9yIGNvbW1hLXNlcGFyYXRlZCBjYWxlbmRhciBwYXJhbWV0ZXIgaW50byBpbnRlZ2Vycy5cblx0ICpcblx0ICogQHBhcmFtIHtBcnJheXxudW1iZXJ8c3RyaW5nfSBwYXJhbWV0ZXJfdmFsdWUgQ2FsZW5kYXIgcGFyYW1ldGVyIHZhbHVlLlxuXHQgKiBAcGFyYW0ge0FycmF5fSBmYWxsYmFja192YWx1ZSBWYWx1ZSByZXR1cm5lZCB3aGVuIG5vIHZhbGlkIG51bWJlcnMgZXhpc3QuXG5cdCAqIEByZXR1cm4ge0FycmF5fSBJbnRlZ2VyIHZhbHVlcy5cblx0ICovXG5cdGZ1bmN0aW9uIG5vcm1hbGl6ZV9jYWxlbmRhcl9udW1iZXJfbGlzdCggcGFyYW1ldGVyX3ZhbHVlLCBmYWxsYmFja192YWx1ZSApIHtcblx0XHR2YXIgdmFsdWVzID0gQXJyYXkuaXNBcnJheSggcGFyYW1ldGVyX3ZhbHVlICkgPyBwYXJhbWV0ZXJfdmFsdWUgOiBTdHJpbmcoIHBhcmFtZXRlcl92YWx1ZSB8fCAnJyApLnNwbGl0KCAnLCcgKTtcblx0XHR2YXIgbm9ybWFsaXplZF92YWx1ZXMgPSBbXTtcblxuXHRcdCQuZWFjaCggdmFsdWVzLCBmdW5jdGlvbiAoIGluZGV4LCBudW1iZXJfdmFsdWUgKSB7XG5cdFx0XHR2YXIgcGFyc2VkX251bWJlciA9IHBhcnNlSW50KCBudW1iZXJfdmFsdWUsIDEwICk7XG5cblx0XHRcdGlmICggISBpc05hTiggcGFyc2VkX251bWJlciApICkge1xuXHRcdFx0XHRub3JtYWxpemVkX3ZhbHVlcy5wdXNoKCBwYXJzZWRfbnVtYmVyICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdFx0cmV0dXJuIG5vcm1hbGl6ZWRfdmFsdWVzLmxlbmd0aCA/IG5vcm1hbGl6ZWRfdmFsdWVzIDogZmFsbGJhY2tfdmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBmaXhlZC9keW5hbWljIGVuZ2luZSB0byB1c2UgZm9yIHRoZSBSYW5nZSBkYXlzIHJhZGlvIGNob2ljZS5cblx0ICpcblx0ICogQHJldHVybiB7c3RyaW5nfSBmaXhlZCBvciBkeW5hbWljLlxuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0X3JhbmdlX2VuZ2luZV9tb2RlKCkge1xuXHRcdHZhciByYW5nZV9lbmdpbmVfbW9kZSA9IFN0cmluZyggZ2V0X2RheXNfc2VsZWN0aW9uX2NvbnRhaW5lcigpLmF0dHIoICdkYXRhLXdwYmMtcmFuZ2UtZW5naW5lLW1vZGUnICkgfHwgJ2R5bmFtaWMnICk7XG5cblx0XHRyZXR1cm4gJ2ZpeGVkJyA9PT0gcmFuZ2VfZW5naW5lX21vZGUgPyAnZml4ZWQnIDogJ2R5bmFtaWMnO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZSB0aGUgY2hlY2tlZCByYWRpbyBhbmQgdmlzaWJsZSBzZXR1cCBzdW1tYXJ5IGZyb20gYW4gZWZmZWN0aXZlIG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlIENhbGVuZGFyIG9yIHJhZGlvIG1vZGUuXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRmdW5jdGlvbiBzeW5jX2RheXNfc2VsZWN0aW9uX2NvbnRyb2xzKCBtb2RlICkge1xuXHRcdHZhciBub3JtYWxpemVkX21vZGUgPSBub3JtYWxpemVfZGF5c19zZWxlY3Rpb25fbW9kZSggbW9kZSApO1xuXHRcdHZhciAkY29udGFpbmVyID0gZ2V0X2RheXNfc2VsZWN0aW9uX2NvbnRhaW5lcigpO1xuXHRcdHZhciAkcmFkaW87XG5cdFx0dmFyIG1vZGVfbGFiZWw7XG5cblx0XHRpZiAoICEgbm9ybWFsaXplZF9tb2RlIHx8ICEgJGNvbnRhaW5lci5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0JHJhZGlvID0gJGNvbnRhaW5lci5maW5kKCAnaW5wdXRbbmFtZT1cIndwYmNfYWRkX2Jvb2tpbmdfZGF5c19zZWxlY3Rpb25fbW9kZVwiXVt2YWx1ZT1cIicgKyBub3JtYWxpemVkX21vZGUgKyAnXCJdJyApO1xuXHRcdGlmICggMSAhPT0gJHJhZGlvLmxlbmd0aCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQkcmFkaW8ucHJvcCggJ2NoZWNrZWQnLCB0cnVlICk7XG5cdFx0bW9kZV9sYWJlbCA9ICRyYWRpby5hdHRyKCAnZGF0YS13cGJjLWRheXMtc2VsZWN0aW9uLWxhYmVsJyApIHx8IG5vcm1hbGl6ZWRfbW9kZTtcblx0XHQkKCAnW2RhdGEtd3BiYy1hZGQtYm9va2luZy1zdW1tYXJ5PVwiZGF5cy1zZWxlY3Rpb25cIl0nICkudGV4dCggbW9kZV9sYWJlbCApO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsZWFyIHNlbGVjdGVkIGRhdGVzIGJlZm9yZSBjaGFuZ2luZyB0aGVpciBzZWxlY3Rpb24gc2VtYW50aWNzLlxuXHQgKlxuXHQgKiBDdXN0b21lciBmaWVsZHMgcmVtYWluIHVudG91Y2hlZC4gRXhpc3RpbmcgY2FsZW5kYXIgaGVscGVycyBhcmUgdXNlZCB3aGVuXG5cdCAqIGF2YWlsYWJsZSBzbyBEYXRlcGljayBzdGF0ZSBhbmQgdGhlIGhpZGRlbiBzZWxlY3RlZC1kYXRlIGZpZWxkIHN0YXkgYWxpZ25lZC5cblx0ICpcblx0ICogQHBhcmFtIHtudW1iZXJ9IHJlc291cmNlX2lkIEJvb2tpbmcgcmVzb3VyY2UgSUQuXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRmdW5jdGlvbiBjbGVhcl9zZWxlY3RlZF9ib29raW5nX2RhdGVzKCByZXNvdXJjZV9pZCApIHtcblx0XHR2YXIgJGRhdGVfZmllbGQgPSAkKCAnI2RhdGVfYm9va2luZycgKyByZXNvdXJjZV9pZCApO1xuXG5cdFx0aWYgKCAhICRkYXRlX2ZpZWxkLmxlbmd0aCB8fCAhIFN0cmluZyggJGRhdGVfZmllbGQudmFsKCkgfHwgJycgKS50cmltKCkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCAnZnVuY3Rpb24nID09PSB0eXBlb2Ygd2luZG93LndwYmNfY2FsZW5kYXJfX3Vuc2VsZWN0X2FsbF9kYXRlcyApIHtcblx0XHRcdHdpbmRvdy53cGJjX2NhbGVuZGFyX191bnNlbGVjdF9hbGxfZGF0ZXMoIHJlc291cmNlX2lkICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCRkYXRlX2ZpZWxkLnZhbCggJycgKTtcblx0XHR9XG5cblx0XHRpZiAoICdmdW5jdGlvbicgPT09IHR5cGVvZiB3aW5kb3cud3BiY19kaXNhYmxlX3RpbWVfZmllbGRzX2luX2Jvb2tpbmdfZm9ybSApIHtcblx0XHRcdHdpbmRvdy53cGJjX2Rpc2FibGVfdGltZV9maWVsZHNfaW5fYm9va2luZ19mb3JtKCByZXNvdXJjZV9pZCApO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBBcHBseSBvbmUgcmFkaW8gbW9kZSB0aHJvdWdoIHRoZSBzaGFyZWQgaW1tZWRpYXRlIGNhbGVuZGFyIGhlbHBlcnMuXG5cdCAqXG5cdCAqIFJhbmdlIG1vZGUgcmV0YWlucyB0aGUgY29uZmlndXJlZCBmaXhlZC9keW5hbWljIHN1YnR5cGUgYW5kIGl0cyBleGlzdGluZ1xuXHQgKiBudW1iZXItb2YtZGF5cyBhbmQgd2Vla2RheSBwYXJhbWV0ZXJzLiBObyBzZXR0aW5ncyBhcmUgc2F2ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlIFJlcXVlc3RlZCByYWRpbyBtb2RlLlxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGNsZWFyX2RhdGVzIFdoZXRoZXIgYW4gZXhpc3Rpbmcgc2VsZWN0aW9uIG11c3QgYmUgY2xlYXJlZC5cblx0ICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSB3aGVuIHRoZSByZXF1ZXN0ZWQgaGVscGVyIHdhcyBhcHBsaWVkIG9yIGFscmVhZHkgYWN0aXZlLlxuXHQgKi9cblx0ZnVuY3Rpb24gYXBwbHlfZGF5c19zZWxlY3Rpb25fbW9kZSggbW9kZSwgY2xlYXJfZGF0ZXMgKSB7XG5cdFx0dmFyIG5vcm1hbGl6ZWRfbW9kZSA9IG5vcm1hbGl6ZV9kYXlzX3NlbGVjdGlvbl9tb2RlKCBtb2RlICk7XG5cdFx0dmFyIHJlc291cmNlX2lkID0gZ2V0X2RheXNfc2VsZWN0aW9uX3Jlc291cmNlX2lkKCk7XG5cdFx0dmFyIGRlc2lyZWRfZW5naW5lX21vZGUgPSAncmFuZ2UnID09PSBub3JtYWxpemVkX21vZGUgPyBnZXRfcmFuZ2VfZW5naW5lX21vZGUoKSA6IG5vcm1hbGl6ZWRfbW9kZTtcblx0XHR2YXIgY3VycmVudF9lbmdpbmVfbW9kZTtcblx0XHR2YXIgZml4ZWRfZGF5c19udW1iZXI7XG5cblx0XHRpZiAoICEgbm9ybWFsaXplZF9tb2RlIHx8ICEgcmVzb3VyY2VfaWQgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y3VycmVudF9lbmdpbmVfbW9kZSA9IFN0cmluZyggZ2V0X2NhbGVuZGFyX3BhcmFtZXRlciggcmVzb3VyY2VfaWQsICdkYXlzX3NlbGVjdF9tb2RlJyApIHx8ICcnICk7XG5cdFx0aWYgKCBkZXNpcmVkX2VuZ2luZV9tb2RlID09PSBjdXJyZW50X2VuZ2luZV9tb2RlICkge1xuXHRcdFx0c3luY19kYXlzX3NlbGVjdGlvbl9jb250cm9scyggbm9ybWFsaXplZF9tb2RlICk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGNsZWFyX2RhdGVzICkge1xuXHRcdFx0Y2xlYXJfc2VsZWN0ZWRfYm9va2luZ19kYXRlcyggcmVzb3VyY2VfaWQgKTtcblx0XHR9XG5cblx0XHRpZiAoICdzaW5nbGUnID09PSBub3JtYWxpemVkX21vZGUgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHdpbmRvdy53cGJjX2NhbF9kYXlzX3NlbGVjdF9fc2luZ2xlICkge1xuXHRcdFx0d2luZG93LndwYmNfY2FsX2RheXNfc2VsZWN0X19zaW5nbGUoIHJlc291cmNlX2lkICk7XG5cdFx0fSBlbHNlIGlmICggJ211bHRpcGxlJyA9PT0gbm9ybWFsaXplZF9tb2RlICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiB3aW5kb3cud3BiY19jYWxfZGF5c19zZWxlY3RfX211bHRpcGxlICkge1xuXHRcdFx0d2luZG93LndwYmNfY2FsX2RheXNfc2VsZWN0X19tdWx0aXBsZSggcmVzb3VyY2VfaWQgKTtcblx0XHR9IGVsc2UgaWYgKCAncmFuZ2UnID09PSBub3JtYWxpemVkX21vZGUgJiYgJ2ZpeGVkJyA9PT0gZGVzaXJlZF9lbmdpbmVfbW9kZSAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2Ygd2luZG93LndwYmNfY2FsX2RheXNfc2VsZWN0X19maXhlZCApIHtcblx0XHRcdGZpeGVkX2RheXNfbnVtYmVyID0gcGFyc2VJbnQoIGdldF9jYWxlbmRhcl9wYXJhbWV0ZXIoIHJlc291cmNlX2lkLCAnZml4ZWRfX2RheXNfbnVtJyApLCAxMCApO1xuXHRcdFx0d2luZG93LndwYmNfY2FsX2RheXNfc2VsZWN0X19maXhlZChcblx0XHRcdFx0cmVzb3VyY2VfaWQsXG5cdFx0XHRcdGZpeGVkX2RheXNfbnVtYmVyID4gMCA/IGZpeGVkX2RheXNfbnVtYmVyIDogMyxcblx0XHRcdFx0bm9ybWFsaXplX2NhbGVuZGFyX251bWJlcl9saXN0KCBnZXRfY2FsZW5kYXJfcGFyYW1ldGVyKCByZXNvdXJjZV9pZCwgJ2ZpeGVkX193ZWVrX2RheXNfX3N0YXJ0JyApLCBbIC0xIF0gKVxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKCAncmFuZ2UnID09PSBub3JtYWxpemVkX21vZGUgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHdpbmRvdy53cGJjX2NhbF9kYXlzX3NlbGVjdF9fcmFuZ2VfbW9kZSApIHtcblx0XHRcdHdpbmRvdy53cGJjX2NhbF9kYXlzX3NlbGVjdF9fcmFuZ2VfbW9kZSggcmVzb3VyY2VfaWQgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHN5bmNfZGF5c19zZWxlY3Rpb25fY29udHJvbHMoIG5vcm1hbGl6ZWRfbW9kZSApO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN5bmNocm9uaXplIGNvbnRyb2xzIHdpdGggdGhlIGNhbGVuZGFyLCBvciBlbmZvcmNlIGEgdXNlci1zZWxlY3RlZCBvdmVycmlkZS5cblx0ICpcblx0ICogQHJldHVybiB7dm9pZH1cblx0ICovXG5cdGZ1bmN0aW9uIHN5bmNocm9uaXplX2RheXNfc2VsZWN0aW9uX21vZGUoKSB7XG5cdFx0dmFyIHJlc291cmNlX2lkID0gZ2V0X2RheXNfc2VsZWN0aW9uX3Jlc291cmNlX2lkKCk7XG5cdFx0dmFyIGN1cnJlbnRfZW5naW5lX21vZGU7XG5cblx0XHRpZiAoICEgcmVzb3VyY2VfaWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBhY3RpdmVfZGF5c19zZWxlY3Rpb25fb3ZlcnJpZGUgKSB7XG5cdFx0XHRhcHBseV9kYXlzX3NlbGVjdGlvbl9tb2RlKCBhY3RpdmVfZGF5c19zZWxlY3Rpb25fb3ZlcnJpZGUsIGZhbHNlICk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y3VycmVudF9lbmdpbmVfbW9kZSA9IGdldF9jYWxlbmRhcl9wYXJhbWV0ZXIoIHJlc291cmNlX2lkLCAnZGF5c19zZWxlY3RfbW9kZScgKTtcblx0XHRzeW5jX2RheXNfc2VsZWN0aW9uX2NvbnRyb2xzKCBjdXJyZW50X2VuZ2luZV9tb2RlICk7XG5cdH1cblxuXHQvKipcblx0ICogUmVjaGVjayBtb2RlIGFmdGVyIHRoZSBzZWxlY3RlZCBCb29raW5nIEZvcm0ncyBsZWdhY3kgZGVsYXllZCBpbml0aWFsaXplci5cblx0ICpcblx0ICogRXhpc3RpbmcgdGltZXJzIGFyZSBjYW5jZWxsZWQgc28gcmVwZWF0ZWQgY2xpY2tzIGNhbm5vdCBhY2N1bXVsYXRlIHdvcmsuXG5cdCAqIFJlYXBwbGljYXRpb24gb2NjdXJzIG9ubHkgd2hlbiB0aGUgY2FsZW5kYXIgZW5naW5lIG1vZGUgd2FzIGNoYW5nZWQgYnkgYVxuXHQgKiBsYXRlciBpbml0aWFsaXplciwgYXZvaWRpbmcgdW5uZWNlc3NhcnkgY2FsZW5kYXIgcmVuZGVycy5cblx0ICpcblx0ICogQHJldHVybiB7dm9pZH1cblx0ICovXG5cdGZ1bmN0aW9uIHNjaGVkdWxlX2RheXNfc2VsZWN0aW9uX3N5bmNocm9uaXphdGlvbigpIHtcblx0XHQkLmVhY2goIGRheXNfc2VsZWN0aW9uX2VuZm9yY2VtZW50X3RpbWVycywgZnVuY3Rpb24gKCBpbmRleCwgdGltZXJfaWQgKSB7XG5cdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lcl9pZCApO1xuXHRcdH0gKTtcblx0XHRkYXlzX3NlbGVjdGlvbl9lbmZvcmNlbWVudF90aW1lcnMgPSBbXTtcblxuXHRcdCQuZWFjaCggWyAwLCAxMjAsIDExNTAsIDIyMDAgXSwgZnVuY3Rpb24gKCBpbmRleCwgZGVsYXkgKSB7XG5cdFx0XHRkYXlzX3NlbGVjdGlvbl9lbmZvcmNlbWVudF90aW1lcnMucHVzaCggd2luZG93LnNldFRpbWVvdXQoIHN5bmNocm9uaXplX2RheXNfc2VsZWN0aW9uX21vZGUsIGRlbGF5ICkgKTtcblx0XHR9ICk7XG5cdH1cblxuXHQvKipcblx0ICogQ29weSB0aGUgYXV0aG9yaXRhdGl2ZSBjb3N0LWNvcnJlY3Rpb24gbnVtYmVyIGludG8gaXRzIGNvbnZlbmllbmNlIHNsaWRlci5cblx0ICpcblx0ICogVGhlIHNsaWRlciBpbnRlbnRpb25hbGx5IGtlZXBzIGl0cyAwLTEwMDAgZXhwbG9yYXRpb24gcmFuZ2UuIEV4YWN0IHZhbHVlcyxcblx0ICogaW5jbHVkaW5nIGRlY2ltYWxzIGFuZCB0b3RhbHMgYWJvdmUgMTAwMCwgcmVtYWluIHVuY2hhbmdlZCBpbiB0aGUgbnVtYmVyIGlucHV0LlxuXHQgKlxuXHQgKiBAcmV0dXJuIHt2b2lkfVxuXHQgKi9cblx0ZnVuY3Rpb24gc3luY2hyb25pemVfY29zdF9jb3JyZWN0aW9uX3JhbmdlKCkge1xuXHRcdHZhciAkbnVtYmVyX2ZpZWxkID0gJCggJyN3cGJjX2FkZF9ib29raW5nX2Nvc3RfY29ycmVjdGlvbicgKTtcblx0XHR2YXIgJHJhbmdlID0gJCggJy53cGJjX2FkZF9ib29raW5nX19jb3N0X2NvcnJlY3Rpb24gW2RhdGEtd3BiYy1hZG1pbi1jb3N0LWNvcnJlY3Rpb24tcmFuZ2U9XCIxXCJdJyApLmZpcnN0KCk7XG5cdFx0dmFyIG51bWJlcl92YWx1ZTtcblxuXHRcdGlmICggISAkbnVtYmVyX2ZpZWxkLmxlbmd0aCB8fCAhICRyYW5nZS5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bnVtYmVyX3ZhbHVlID0gTnVtYmVyKCAkbnVtYmVyX2ZpZWxkLnZhbCgpICk7XG5cdFx0aWYgKCAnJyA9PT0gU3RyaW5nKCAkbnVtYmVyX2ZpZWxkLnZhbCgpIHx8ICcnICkudHJpbSgpIHx8ICEgaXNGaW5pdGUoIG51bWJlcl92YWx1ZSApICkge1xuXHRcdFx0JHJhbmdlLnZhbCggJzAnICk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0JHJhbmdlLnZhbCggU3RyaW5nKCBudW1iZXJfdmFsdWUgKSApO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvcHkgdGhlIGNvbnZlbmllbmNlIHNsaWRlciBpbnRvIHRoZSBhdXRob3JpdGF0aXZlIG51bWJlciBpbnB1dC5cblx0ICpcblx0ICogQHJldHVybiB7dm9pZH1cblx0ICovXG5cdGZ1bmN0aW9uIHN5bmNocm9uaXplX2Nvc3RfY29ycmVjdGlvbl9udW1iZXIoKSB7XG5cdFx0dmFyICRudW1iZXJfZmllbGQgPSAkKCAnI3dwYmNfYWRkX2Jvb2tpbmdfY29zdF9jb3JyZWN0aW9uJyApO1xuXHRcdHZhciAkcmFuZ2UgPSAkKCAnLndwYmNfYWRkX2Jvb2tpbmdfX2Nvc3RfY29ycmVjdGlvbiBbZGF0YS13cGJjLWFkbWluLWNvc3QtY29ycmVjdGlvbi1yYW5nZT1cIjFcIl0nICkuZmlyc3QoKTtcblxuXHRcdGlmICggISAkbnVtYmVyX2ZpZWxkLmxlbmd0aCB8fCAhICRyYW5nZS5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0JG51bWJlcl9maWVsZC52YWwoICRyYW5nZS52YWwoKSApLnRyaWdnZXIoICdpbnB1dCcgKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYW4gZXhwbGljaXRseSBlbnRlcmVkIGNvcnJlY3Rpb24gdG8gdGhlIG91dGdvaW5nIEFkZCBCb29raW5nIHJlcXVlc3QuXG5cdCAqXG5cdCAqIFRoZSBjb250cm9sIGlzIG91dHNpZGUgdGhlIEJvb2tpbmcgRm9ybSBlbGVtZW50IGFuZCB0aGVyZWZvcmUgaXMgbm90IHBhcnQgb2Zcblx0ICogdGhlIGxlZ2FjeSBzZXJpYWxpemVkIGZvcm0gZGF0YS4gVGhlIHNlcnZlciBhdXRob3JpemVzIGFuZCBub3JtYWxpemVzIHRoaXNcblx0ICogZGVkaWNhdGVkIHZhbHVlIGJlZm9yZSBpdCByZWFjaGVzIHRoZSBCdXNpbmVzcyBTbWFsbCBjb3N0IHBpcGVsaW5lLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudCBqUXVlcnkgZXZlbnQuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSByZXNvdXJjZV9pZCBTdWJtaXR0ZWQgQm9va2luZyByZXNvdXJjZSBJRC5cblx0ICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBNdXRhYmxlIGJvb2tpbmctY3JlYXRlIHJlcXVlc3QgcGFyYW1ldGVycy5cblx0ICogQHJldHVybiB7dm9pZH1cblx0ICovXG5cdGZ1bmN0aW9uIGFkZF9jb3N0X2NvcnJlY3Rpb25fdG9fYm9va2luZ19yZXF1ZXN0KCBldmVudCwgcmVzb3VyY2VfaWQsIHBhcmFtcyApIHtcblx0XHR2YXIgbnVtYmVyX2ZpZWxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2FkZF9ib29raW5nX2Nvc3RfY29ycmVjdGlvbicgKTtcblx0XHR2YXIgcmF3X2Nvc3Q7XG5cblx0XHRpZiAoICEgcGFyYW1zIHx8ICEgbnVtYmVyX2ZpZWxkICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGRlbGV0ZSBwYXJhbXMud3BiY19hZG1pbl9jb3N0X2NvcnJlY3Rpb247XG5cdFx0cmF3X2Nvc3QgPSBTdHJpbmcoIG51bWJlcl9maWVsZC52YWx1ZSB8fCAnJyApLnRyaW0oKTtcblx0XHRpZiAoICcnID09PSByYXdfY29zdCB8fCAhIG51bWJlcl9maWVsZC5jaGVja1ZhbGlkaXR5KCkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cGFyYW1zLndwYmNfYWRtaW5fY29zdF9jb3JyZWN0aW9uID0gcmF3X2Nvc3Q7XG5cdH1cblxuXHQkKCBkb2N1bWVudCApLm9uKCAnY2xpY2snLCAnLndwYmNfYWRkX2Jvb2tpbmdfX3JpZ2h0YmFyX3RhYnMgW3JvbGU9XCJ0YWJcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0c3dpdGNoX3JpZ2h0X3BhbmVsKCAkKCB0aGlzICkgKTtcblx0fSApO1xuXG5cdCQoIGRvY3VtZW50ICkub24oICdjbGljaycsICcud3BiY19hZGRfYm9va2luZ19fc2V0dXBfc3VtbWFyeV9saW5rJywgZnVuY3Rpb24gKCBldmVudCApIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdG9wZW5fc2V0dGluZ3NfZ3JvdXAoICQoIHRoaXMgKS5hdHRyKCAnZGF0YS13cGJjLWFkZC1ib29raW5nLW9wZW4tZ3JvdXAnICksICQoIHRoaXMgKS5hdHRyKCAnZGF0YS13cGJjLWFkZC1ib29raW5nLWZvY3VzJyApIHx8ICcnICk7XG5cdH0gKTtcblxuXHQkKCBkb2N1bWVudCApLm9uKCAnY2hhbmdlJywgJyNpc19zZW5kX2VtYWlsX2Zvcl9wZW5kaW5nLCAjaXNfYWxsb3dfYm9va2luZ3NfaW5fcGFzdCcsIHJlZnJlc2hfYm9va2luZ190b29sc19zdW1tYXJ5ICk7XG5cdCQoIGRvY3VtZW50ICkub24oICdpbnB1dCcsICcjd3BiY19hZGRfYm9va2luZ19jb3N0X2NvcnJlY3Rpb24nLCBzeW5jaHJvbml6ZV9jb3N0X2NvcnJlY3Rpb25fcmFuZ2UgKTtcblx0JCggZG9jdW1lbnQgKS5vbiggJ2lucHV0JywgJy53cGJjX2FkZF9ib29raW5nX19jb3N0X2NvcnJlY3Rpb24gW2RhdGEtd3BiYy1hZG1pbi1jb3N0LWNvcnJlY3Rpb24tcmFuZ2U9XCIxXCJdJywgc3luY2hyb25pemVfY29zdF9jb3JyZWN0aW9uX251bWJlciApO1xuXHQkKCAnYm9keScgKS5vbiggJ3dwYmNfYmVmb3JlX2Jvb2tpbmdfY3JlYXRlLndwYmNfYWRkX2Jvb2tpbmdfY29zdF9jb3JyZWN0aW9uJywgYWRkX2Nvc3RfY29ycmVjdGlvbl90b19ib29raW5nX3JlcXVlc3QgKTtcblx0JCggZG9jdW1lbnQgKS5vbiggJ2NsaWNrJywgJ2lucHV0W25hbWU9XCJ3cGJjX2FkZF9ib29raW5nX2RheXNfc2VsZWN0aW9uX21vZGVcIl0nLCBmdW5jdGlvbiAoKSB7XG5cdFx0YWN0aXZlX2RheXNfc2VsZWN0aW9uX292ZXJyaWRlID0gbm9ybWFsaXplX2RheXNfc2VsZWN0aW9uX21vZGUoICQoIHRoaXMgKS52YWwoKSApO1xuXHRcdGFwcGx5X2RheXNfc2VsZWN0aW9uX21vZGUoIGFjdGl2ZV9kYXlzX3NlbGVjdGlvbl9vdmVycmlkZSwgdHJ1ZSApO1xuXHRcdHNjaGVkdWxlX2RheXNfc2VsZWN0aW9uX3N5bmNocm9uaXphdGlvbigpO1xuXHR9ICk7XG5cdCQoIHJlZnJlc2hfYm9va2luZ190b29sc19zdW1tYXJ5ICk7XG5cdCQoIHN5bmNocm9uaXplX2Nvc3RfY29ycmVjdGlvbl9yYW5nZSApO1xuXHQkKCBzY2hlZHVsZV9kYXlzX3NlbGVjdGlvbl9zeW5jaHJvbml6YXRpb24gKTtcbn0oIGpRdWVyeSApICk7XG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDRSxXQUFXQSxDQUFDLEVBQUc7RUFDaEIsWUFBWTs7RUFFWixJQUFJQyw4QkFBOEIsR0FBRyxFQUFFO0VBQ3ZDLElBQUlDLGlDQUFpQyxHQUFHLEVBQUU7O0VBRTFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNDLFNBQVNDLGtCQUFrQkEsQ0FBRUMsSUFBSSxFQUFHO0lBQ25DLElBQUlDLFFBQVEsR0FBR0QsSUFBSSxDQUFDRSxJQUFJLENBQUUsZUFBZ0IsQ0FBQztJQUMzQyxJQUFJQyxLQUFLLEdBQUdILElBQUksQ0FBQ0ksT0FBTyxDQUFFLGtDQUFtQyxDQUFDLENBQUNDLElBQUksQ0FBRSxjQUFlLENBQUM7SUFDckYsSUFBSUMsT0FBTyxHQUFHVixDQUFDLENBQUUsNkJBQThCLENBQUMsQ0FBQ1MsSUFBSSxDQUFFLG1CQUFvQixDQUFDO0lBRTVFLElBQUssQ0FBRUosUUFBUSxJQUFJLENBQUVMLENBQUMsQ0FBRSxHQUFHLEdBQUdLLFFBQVMsQ0FBQyxDQUFDTSxNQUFNLEVBQUc7TUFDakQ7SUFDRDtJQUVBSixLQUFLLENBQUNELElBQUksQ0FBRSxlQUFlLEVBQUUsT0FBUSxDQUFDO0lBQ3RDRixJQUFJLENBQUNFLElBQUksQ0FBRSxlQUFlLEVBQUUsTUFBTyxDQUFDO0lBQ3BDSSxPQUFPLENBQUNKLElBQUksQ0FBRTtNQUFFTSxNQUFNLEVBQUUsSUFBSTtNQUFFLGFBQWEsRUFBRTtJQUFPLENBQUUsQ0FBQztJQUN2RFos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 |
| 389 |
|