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-form-builder / preview / _out / bfb-inline-preview.js

bfb-inline-preview.js in Booking Calendar 11.9, at includes/page-form-builder/preview/_out/bfb-inline-preview.js

236 lines 37.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 "use strict";
2
3 /**
4 * Replace request-local Form Builder previews using a data-only WPBC bootstrap.
5 *
6 * The helper owns only domain-neutral DOM and Booking Calendar initialization
7 * mechanics. It never evaluates returned JavaScript. Callers remain responsible
8 * for authorization, request validation, stale-response ownership, and visible
9 * user interface state.
10 *
11 * @package Booking Calendar
12 */
13 (function (window, document, $) {
14 'use strict';
15
16 /**
17 * Return a rejected jQuery promise with one controlled message.
18 *
19 * @param {string} message Error message.
20 * @return {Object} Rejected promise.
21 */
22 function rejected_preview(message) {
23 var deferred = $.Deferred();
24 deferred.reject(new Error(message || ''));
25 return deferred.promise();
26 }
27
28 /**
29 * Destroy Datepick instances before their preview DOM is removed.
30 *
31 * @param {HTMLElement} container Inline preview content container.
32 * @return {void}
33 */
34 function cleanup_calendars(container) {
35 if (!container || !$.datepick) {
36 return;
37 }
38 $(container).find('[id^="calendar_booking"]').each(function () {
39 var $calendar = $(this);
40 if (typeof $calendar.datepick !== 'function') {
41 return;
42 }
43 try {
44 if ('function' === typeof $.datepick._getInst && $.datepick._getInst(this)) {
45 $calendar.datepick('destroy');
46 }
47 } catch (error) {
48 $calendar.removeClass('hasDatepick');
49 }
50 });
51 }
52
53 /**
54 * Convert one value to a finite integer with a bounded fallback.
55 *
56 * @param {*} value Candidate value.
57 * @param {number} fallback Fallback value.
58 * @return {number} Normalized integer.
59 */
60 function to_integer(value, fallback) {
61 var parsed = parseInt(value, 10);
62 return isFinite(parsed) ? parsed : fallback;
63 }
64
65 /**
66 * Copy only scalar request values from the server-owned bootstrap contract.
67 *
68 * @param {Object} request_values Candidate request values.
69 * @return {Object} Allow-listed calendar AJAX request.
70 */
71 function get_calendar_request(request_values) {
72 var source = request_values && 'object' === typeof request_values ? request_values : {};
73 var request = {
74 resource_id: Math.max(1, to_integer(source.resource_id, 1)),
75 booking_hash: String(source.booking_hash || ''),
76 request_uri: String(source.request_uri || ''),
77 custom_form: String(source.custom_form || 'standard'),
78 aggregate_resource_id_str: String(source.aggregate_resource_id_str || ''),
79 aggregate_type: String(source.aggregate_type || 'all'),
80 skip_general_availability: source.skip_general_availability ? 1 : 0,
81 classic_booking_context_token: String(source.classic_booking_context_token || '')
82 };
83 var marker_keys = ['wpbc_settings_calendar_preview', 'wpbc_setup_wizard_date_selection_preview'];
84 var toggle_keys = ['wpbc_settings_calendar_preview_changeover', 'wpbc_settings_calendar_preview_triangles', 'wpbc_settings_calendar_preview_recurrent_time', 'wpbc_settings_calendar_preview_last_checkout', 'wpbc_settings_calendar_preview_show_legend', 'wpbc_settings_calendar_preview_legend_show_numbers', 'wpbc_settings_calendar_preview_legend_vertical', 'wpbc_settings_calendar_preview_legend_show_available', 'wpbc_settings_calendar_preview_legend_show_pending', 'wpbc_settings_calendar_preview_legend_show_approved', 'wpbc_settings_calendar_preview_legend_show_partially', 'wpbc_settings_calendar_preview_legend_show_unavailable'];
85 var text_keys = ['wpbc_setup_wizard_date_selection_preview_nonce', 'wpbc_settings_calendar_preview_legend_text_available', 'wpbc_settings_calendar_preview_legend_text_pending', 'wpbc_settings_calendar_preview_legend_text_approved', 'wpbc_settings_calendar_preview_legend_text_partially', 'wpbc_settings_calendar_preview_legend_text_unavailable'];
86 $.each(marker_keys, function (index, key) {
87 if (source[key]) {
88 request[key] = 1;
89 }
90 });
91 $.each(toggle_keys, function (index, key) {
92 if ('On' === source[key] || 'Off' === source[key]) {
93 request[key] = source[key];
94 }
95 });
96 $.each(text_keys, function (index, key) {
97 if (Object.prototype.hasOwnProperty.call(source, key)) {
98 request[key] = String(source[key] || '');
99 }
100 });
101 return request;
102 }
103
104 /**
105 * Set one calendar parameter through the established WPBC state API.
106 *
107 * @param {number} resource_id Booking resource ID.
108 * @param {string} key Allow-listed parameter key.
109 * @param {*} value JSON-safe parameter value.
110 * @return {void}
111 */
112 function set_calendar_parameter(resource_id, key, value) {
113 if (window._wpbc && 'function' === typeof window._wpbc.calendar__set_param_value) {
114 window._wpbc.calendar__set_param_value(resource_id, key, value);
115 }
116 }
117
118 /**
119 * Apply the fixed calendar-parameter contract returned by the server.
120 *
121 * @param {number} resource_id Booking resource ID.
122 * @param {Object} calendar_parameters Validated server parameter map.
123 * @return {void}
124 */
125 function apply_calendar_parameters(resource_id, calendar_parameters) {
126 var parameters = calendar_parameters && 'object' === typeof calendar_parameters ? calendar_parameters : {};
127 var allowed_keys = ['is_enabled_change_over', 'calendar_scroll_to', 'calendar_dates_start', 'calendar_dates_end', 'booking_max_monthes_in_calendar', 'booking_start_day_weeek', 'calendar_number_of_months', 'days_select_mode', 'fixed__days_num', 'fixed__week_days__start', 'dynamic__days_min', 'dynamic__days_max', 'dynamic__days_specific', 'dynamic__week_days__start', 'range_selection_guidance_is_enabled', 'booking_date_format', 'booking_time_format', 'is_parent_resource', 'booking_capacity_field', 'booking_is_dissbale_booking_for_different_sub_resources', 'booking_recurrent_time'];
128 $.each(allowed_keys, function (index, key) {
129 if (Object.prototype.hasOwnProperty.call(parameters, key)) {
130 set_calendar_parameter(resource_id, key, parameters[key]);
131 }
132 });
133 }
134
135 /**
136 * Initialize a rendered form through known Booking Calendar functions only.
137 *
138 * @param {Object} bootstrap JSON-safe bootstrap data returned by WPBC.
139 * @return {Object} Resolved or rejected jQuery promise.
140 */
141 function initialize_booking_form(bootstrap) {
142 var config = bootstrap && 'object' === typeof bootstrap ? bootstrap : {};
143 var calendar_request = get_calendar_request(config.calendar_request);
144 var resource_id = calendar_request.resource_id;
145 var secure_parameters = config.secure_parameters && 'object' === typeof config.secure_parameters ? config.secure_parameters : {};
146 if (!window._wpbc || 'function' !== typeof window.wpbc_calendar_show || 'function' !== typeof window.wpbc_calendar__load_data__ajx || 'function' !== typeof window._wpbc.set_secure_param) {
147 return rejected_preview('');
148 }
149 if ('function' === typeof window._wpbc.balancer__set_max_threads) {
150 window._wpbc.balancer__set_max_threads(Math.max(1, to_integer(config.balancer_max_threads, 1)));
151 }
152 apply_calendar_parameters(resource_id, config.calendar_parameters);
153 if (window._wpbc.booking__set_param_value && 'function' === typeof window._wpbc.booking__set_param_value) {
154 window._wpbc.booking__set_param_value(resource_id, 'classic_booking_context_token', String(config.classic_booking_context_token || ''));
155 }
156 if ('function' === typeof window._wpbc.set_other_param && Object.prototype.hasOwnProperty.call(config, 'is_enabled_change_over')) {
157 window._wpbc.set_other_param('is_enabled_change_over', Boolean(config.is_enabled_change_over));
158 }
159 if ('function' === typeof window.wpbc__conditions__SAVE_INITIAL__days_selection_params__bm) {
160 window.wpbc__conditions__SAVE_INITIAL__days_selection_params__bm(resource_id);
161 }
162 window.wpbc_calendar_show(String(resource_id));
163 window._wpbc.set_secure_param('nonce', String(secure_parameters.nonce || ''));
164 window._wpbc.set_secure_param('user_id', String(secure_parameters.user_id || ''));
165 window._wpbc.set_secure_param('locale', String(secure_parameters.locale || ''));
166 window.wpbc_calendar__load_data__ajx(calendar_request);
167 if ('function' === typeof window.wpbc_hook__init_booking_form_wizard_buttons) {
168 window.wpbc_hook__init_booking_form_wizard_buttons();
169 }
170 return $.Deferred().resolve().promise();
171 }
172
173 /**
174 * Create a reusable inline Form Builder preview renderer.
175 *
176 * Only server-rendered HTML and structured bootstrap data from an authorized
177 * WPBC endpoint may be passed to `replace()`. Script elements are always
178 * discarded; this component never evaluates response code.
179 *
180 * @param {HTMLElement} container Inline preview content container.
181 * @return {Object|null} Preview renderer API, or null for invalid input.
182 */
183 function create_inline_preview(container) {
184 var replacement_sequence = 0;
185 if (!container || 1 !== container.nodeType) {
186 return null;
187 }
188 container.setAttribute('data-wpbc-inline-booking-preview', '1');
189
190 /**
191 * Replace preview markup and initialize its known WPBC components.
192 *
193 * @param {string} html Trusted server-rendered preview HTML.
194 * @param {Object} bootstrap JSON-safe WPBC bootstrap contract.
195 * @param {Function} owns_request Callback returning whether the request remains current.
196 * @return {Object} jQuery promise.
197 */
198 function replace(html, bootstrap, owns_request) {
199 var replacement_id = ++replacement_sequence;
200 var parsed = $.parseHTML(String(html || ''), document, false) || [];
201 var $parsed_container = $('<div>').append(parsed);
202 var owns_preview = function () {
203 return replacement_id === replacement_sequence && (!owns_request || owns_request());
204 };
205 if (!owns_preview()) {
206 return rejected_preview('');
207 }
208 $parsed_container.find('script').addBack('script').remove();
209 cleanup_calendars(container);
210 $(container).empty().append($parsed_container.contents());
211 if (!owns_preview()) {
212 return rejected_preview('');
213 }
214 return initialize_booking_form(bootstrap);
215 }
216
217 /**
218 * Invalidate pending replacements and release calendar instances.
219 *
220 * @return {void}
221 */
222 function destroy() {
223 replacement_sequence += 1;
224 cleanup_calendars(container);
225 }
226 return {
227 replace: replace,
228 destroy: destroy
229 };
230 }
231 window.wpbc_bfb_inline_preview = {
232 create: create_inline_preview
233 };
234 })(window, document, window.jQuery);
235 //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvcHJldmlldy9fb3V0L2JmYi1pbmxpbmUtcHJldmlldy5qcyIsIm5hbWVzIjpbIndpbmRvdyIsImRvY3VtZW50IiwiJCIsInJlamVjdGVkX3ByZXZpZXciLCJtZXNzYWdlIiwiZGVmZXJyZWQiLCJEZWZlcnJlZCIsInJlamVjdCIsIkVycm9yIiwicHJvbWlzZSIsImNsZWFudXBfY2FsZW5kYXJzIiwiY29udGFpbmVyIiwiZGF0ZXBpY2siLCJmaW5kIiwiZWFjaCIsIiRjYWxlbmRhciIsIl9nZXRJbnN0IiwiZXJyb3IiLCJyZW1vdmVDbGFzcyIsInRvX2ludGVnZXIiLCJ2YWx1ZSIsImZhbGxiYWNrIiwicGFyc2VkIiwicGFyc2VJbnQiLCJpc0Zpbml0ZSIsImdldF9jYWxlbmRhcl9yZXF1ZXN0IiwicmVxdWVzdF92YWx1ZXMiLCJzb3VyY2UiLCJyZXF1ZXN0IiwicmVzb3VyY2VfaWQiLCJNYXRoIiwibWF4IiwiYm9va2luZ19oYXNoIiwiU3RyaW5nIiwicmVxdWVzdF91cmkiLCJjdXN0b21fZm9ybSIsImFnZ3JlZ2F0ZV9yZXNvdXJjZV9pZF9zdHIiLCJhZ2dyZWdhdGVfdHlwZSIsInNraXBfZ2VuZXJhbF9hdmFpbGFiaWxpdHkiLCJjbGFzc2ljX2Jvb2tpbmdfY29udGV4dF90b2tlbiIsIm1hcmtlcl9rZXlzIiwidG9nZ2xlX2tleXMiLCJ0ZXh0X2tleXMiLCJpbmRleCIsImtleSIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInNldF9jYWxlbmRhcl9wYXJhbWV0ZXIiLCJfd3BiYyIsImNhbGVuZGFyX19zZXRfcGFyYW1fdmFsdWUiLCJhcHBseV9jYWxlbmRhcl9wYXJhbWV0ZXJzIiwiY2FsZW5kYXJfcGFyYW1ldGVycyIsInBhcmFtZXRlcnMiLCJhbGxvd2VkX2tleXMiLCJpbml0aWFsaXplX2Jvb2tpbmdfZm9ybSIsImJvb3RzdHJhcCIsImNvbmZpZyIsImNhbGVuZGFyX3JlcXVlc3QiLCJzZWN1cmVfcGFyYW1ldGVycyIsIndwYmNfY2FsZW5kYXJfc2hvdyIsIndwYmNfY2FsZW5kYXJfX2xvYWRfZGF0YV9fYWp4Iiwic2V0X3NlY3VyZV9wYXJhbSIsImJhbGFuY2VyX19zZXRfbWF4X3RocmVhZHMiLCJiYWxhbmNlcl9tYXhfdGhyZWFkcyIsImJvb2tpbmdfX3NldF9wYXJhbV92YWx1ZSIsInNldF9vdGhlcl9wYXJhbSIsIkJvb2xlYW4iLCJpc19lbmFibGVkX2NoYW5nZV9vdmVyIiwid3BiY19fY29uZGl0aW9uc19fU0FWRV9JTklUSUFMX19kYXlzX3NlbGVjdGlvbl9wYXJhbXNfX2JtIiwibm9uY2UiLCJ1c2VyX2lkIiwibG9jYWxlIiwid3BiY19ob29rX19pbml0X2Jvb2tpbmdfZm9ybV93aXphcmRfYnV0dG9ucyIsInJlc29sdmUiLCJjcmVhdGVfaW5saW5lX3ByZXZpZXciLCJyZXBsYWNlbWVudF9zZXF1ZW5jZSIsIm5vZGVUeXBlIiwic2V0QXR0cmlidXRlIiwicmVwbGFjZSIsImh0bWwiLCJvd25zX3JlcXVlc3QiLCJyZXBsYWNlbWVudF9pZCIsInBhcnNlSFRNTCIsIiRwYXJzZWRfY29udGFpbmVyIiwiYXBwZW5kIiwib3duc19wcmV2aWV3IiwiYWRkQmFjayIsInJlbW92ZSIsImVtcHR5IiwiY29udGVudHMiLCJkZXN0cm95Iiwid3BiY19iZmJfaW5saW5lX3ByZXZpZXciLCJjcmVhdGUiLCJqUXVlcnkiXSwic291cmNlcyI6WyJpbmNsdWRlcy9wYWdlLWZvcm0tYnVpbGRlci9wcmV2aWV3L19zcmMvYmZiLWlubGluZS1wcmV2aWV3LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVwbGFjZSByZXF1ZXN0LWxvY2FsIEZvcm0gQnVpbGRlciBwcmV2aWV3cyB1c2luZyBhIGRhdGEtb25seSBXUEJDIGJvb3RzdHJhcC5cbiAqXG4gKiBUaGUgaGVscGVyIG93bnMgb25seSBkb21haW4tbmV1dHJhbCBET00gYW5kIEJvb2tpbmcgQ2FsZW5kYXIgaW5pdGlhbGl6YXRpb25cbiAqIG1lY2hhbmljcy4gSXQgbmV2ZXIgZXZhbHVhdGVzIHJldHVybmVkIEphdmFTY3JpcHQuIENhbGxlcnMgcmVtYWluIHJlc3BvbnNpYmxlXG4gKiBmb3IgYXV0aG9yaXphdGlvbiwgcmVxdWVzdCB2YWxpZGF0aW9uLCBzdGFsZS1yZXNwb25zZSBvd25lcnNoaXAsIGFuZCB2aXNpYmxlXG4gKiB1c2VyIGludGVyZmFjZSBzdGF0ZS5cbiAqXG4gKiBAcGFja2FnZSBCb29raW5nIENhbGVuZGFyXG4gKi9cbiggZnVuY3Rpb24gKCB3aW5kb3csIGRvY3VtZW50LCAkICkge1xuXHQndXNlIHN0cmljdCc7XG5cblx0LyoqXG5cdCAqIFJldHVybiBhIHJlamVjdGVkIGpRdWVyeSBwcm9taXNlIHdpdGggb25lIGNvbnRyb2xsZWQgbWVzc2FnZS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgRXJyb3IgbWVzc2FnZS5cblx0ICogQHJldHVybiB7T2JqZWN0fSBSZWplY3RlZCBwcm9taXNlLlxuXHQgKi9cblx0ZnVuY3Rpb24gcmVqZWN0ZWRfcHJldmlldyggbWVzc2FnZSApIHtcblx0XHR2YXIgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cblx0XHRkZWZlcnJlZC5yZWplY3QoIG5ldyBFcnJvciggbWVzc2FnZSB8fCAnJyApICk7XG5cdFx0cmV0dXJuIGRlZmVycmVkLnByb21pc2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZXN0cm95IERhdGVwaWNrIGluc3RhbmNlcyBiZWZvcmUgdGhlaXIgcHJldmlldyBET00gaXMgcmVtb3ZlZC5cblx0ICpcblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyIElubGluZSBwcmV2aWV3IGNvbnRlbnQgY29udGFpbmVyLlxuXHQgKiBAcmV0dXJuIHt2b2lkfVxuXHQgKi9cblx0ZnVuY3Rpb24gY2xlYW51cF9jYWxlbmRhcnMoIGNvbnRhaW5lciApIHtcblx0XHRpZiAoICEgY29udGFpbmVyIHx8ICEgJC5kYXRlcGljayApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQkKCBjb250YWluZXIgKS5maW5kKCAnW2lkXj1cImNhbGVuZGFyX2Jvb2tpbmdcIl0nICkuZWFjaCggZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyICRjYWxlbmRhciA9ICQoIHRoaXMgKTtcblxuXHRcdFx0aWYgKCB0eXBlb2YgJGNhbGVuZGFyLmRhdGVwaWNrICE9PSAnZnVuY3Rpb24nICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmICggJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mICQuZGF0ZXBpY2suX2dldEluc3QgJiYgJC5kYXRlcGljay5fZ2V0SW5zdCggdGhpcyApICkge1xuXHRcdFx0XHRcdCRjYWxlbmRhci5kYXRlcGljayggJ2Rlc3Ryb3knICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblx0XHRcdFx0JGNhbGVuZGFyLnJlbW92ZUNsYXNzKCAnaGFzRGF0ZXBpY2snICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnQgb25lIHZhbHVlIHRvIGEgZmluaXRlIGludGVnZXIgd2l0aCBhIGJvdW5kZWQgZmFsbGJhY2suXG5cdCAqXG5cdCAqIEBwYXJhbSB7Kn0gICAgICB2YWx1ZSAgICBDYW5kaWRhdGUgdmFsdWUuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBmYWxsYmFjayBGYWxsYmFjayB2YWx1ZS5cblx0ICogQHJldHVybiB7bnVtYmVyfSBOb3JtYWxpemVkIGludGVnZXIuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b19pbnRlZ2VyKCB2YWx1ZSwgZmFsbGJhY2sgKSB7XG5cdFx0dmFyIHBhcnNlZCA9IHBhcnNlSW50KCB2YWx1ZSwgMTAgKTtcblxuXHRcdHJldHVybiBpc0Zpbml0ZSggcGFyc2VkICkgPyBwYXJzZWQgOiBmYWxsYmFjaztcblx0fVxuXG5cdC8qKlxuXHQgKiBDb3B5IG9ubHkgc2NhbGFyIHJlcXVlc3QgdmFsdWVzIGZyb20gdGhlIHNlcnZlci1vd25lZCBib290c3RyYXAgY29udHJhY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSByZXF1ZXN0X3ZhbHVlcyBDYW5kaWRhdGUgcmVxdWVzdCB2YWx1ZXMuXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQWxsb3ctbGlzdGVkIGNhbGVuZGFyIEFKQVggcmVxdWVzdC5cblx0ICovXG5cdGZ1bmN0aW9uIGdldF9jYWxlbmRhcl9yZXF1ZXN0KCByZXF1ZXN0X3ZhbHVlcyApIHtcblx0XHR2YXIgc291cmNlID0gcmVxdWVzdF92YWx1ZXMgJiYgJ29iamVjdCcgPT09IHR5cGVvZiByZXF1ZXN0X3ZhbHVlcyA/IHJlcXVlc3RfdmFsdWVzIDoge307XG5cdFx0dmFyIHJlcXVlc3QgPSB7XG5cdFx0XHRyZXNvdXJjZV9pZDogTWF0aC5tYXgoIDEsIHRvX2ludGVnZXIoIHNvdXJjZS5yZXNvdXJjZV9pZCwgMSApICksXG5cdFx0XHRib29raW5nX2hhc2g6IFN0cmluZyggc291cmNlLmJvb2tpbmdfaGFzaCB8fCAnJyApLFxuXHRcdFx0cmVxdWVzdF91cmk6IFN0cmluZyggc291cmNlLnJlcXVlc3RfdXJpIHx8ICcnICksXG5cdFx0XHRjdXN0b21fZm9ybTogU3RyaW5nKCBzb3VyY2UuY3VzdG9tX2Zvcm0gfHwgJ3N0YW5kYXJkJyApLFxuXHRcdFx0YWdncmVnYXRlX3Jlc291cmNlX2lkX3N0cjogU3RyaW5nKCBzb3VyY2UuYWdncmVnYXRlX3Jlc291cmNlX2lkX3N0ciB8fCAnJyApLFxuXHRcdFx0YWdncmVnYXRlX3R5cGU6IFN0cmluZyggc291cmNlLmFnZ3JlZ2F0ZV90eXBlIHx8ICdhbGwnICksXG5cdFx0XHRza2lwX2dlbmVyYWxfYXZhaWxhYmlsaXR5OiBzb3VyY2Uuc2tpcF9nZW5lcmFsX2F2YWlsYWJpbGl0eSA/IDEgOiAwLFxuXHRcdFx0Y2xhc3NpY19ib29raW5nX2NvbnRleHRfdG9rZW46IFN0cmluZyggc291cmNlLmNsYXNzaWNfYm9va2luZ19jb250ZXh0X3Rva2VuIHx8ICcnIClcblx0XHR9O1xuXHRcdHZhciBtYXJrZXJfa2V5cyA9IFtcblx0XHRcdCd3cGJjX3NldHRpbmdzX2NhbGVuZGFyX3ByZXZpZXcnLFxuXHRcdFx0J3dwYmNfc2V0dXBfd2l6YXJkX2RhdGVfc2VsZWN0aW9uX3ByZXZpZXcnXG5cdFx0XTtcblx0XHR2YXIgdG9nZ2xlX2tleXMgPSBbXG5cdFx0XHQnd3BiY19zZXR0aW5nc19jYWxlbmRhcl9wcmV2aWV3X2NoYW5nZW92ZXInLFxuXHRcdFx0J3dwYmNfc2V0dGluZ3NfY2FsZW5kYXJfcHJldmlld190cmlhbmdsZXMnLFxuXHRcdFx0J3dwYmNfc2V0dGluZ3NfY2FsZW5kYXJfcHJldmlld19yZWN1cnJlbnRfdGltZScsXG5cdFx0XHQnd3BiY19zZXR0aW5nc19jYWxlbmRhcl9wcmV2aWV3X2xhc3RfY2hlY2tvdXQnLFxuXHRcdFx0J3dwYmNfc2V0dGluZ3NfY2FsZW5kYXJfcHJldmlld19zaG93X2xlZ2VuZCcsXG5cdFx0XHQnd3BiY19zZXR0aW5nc19jYWxlbmRhcl9wcmV2aWV3X2xlZ2VuZF9zaG93X251bWJlcnMnLFxuXHRcdFx0J3dwYmNfc2V0dGluZ3NfY2FsZW5kYXJfcHJldmlld19sZWdlbmRfdmVydGljYWwnLFxuXHRcdFx0J3dwYmNfc2V0dGluZ3NfY2FsZW5kYXJfcHJldmlld19sZWdlbmRfc2hvd19hdmFpbGFibGUnLFxuXHRcdFx0J3dwYmNfc2V0dGluZ3NfY2FsZW5kYXJfcHJldmlld19sZWdlbmRfc2hvd19wZW5kaW5nJyxcblx0XHRcdCd3cGJjX3NldHRpbmdzX2NhbGVuZGFyX3ByZXZpZXdfbGVnZW5kX3Nob3dfYXBwcm92ZWQnLFxuXHRcdFx0J3dwYmNfc2V0dGluZ3NfY2FsZW5kYXJfcHJldmlld19sZWdlbmRfc2hvd19wYXJ0aWFsbHknLFxuXHRcdFx0J3dwYmNfc2V0dGluZ3NfY2FsZW5kYXJfcHJldmlld19sZWdlbmRfc2hvd191bmF2YWlsYWJsZSdcblx0XHRdO1xuXHRcdHZhciB0ZXh0X2tleXMgPSBbXG5cdFx0XHQnd3BiY19zZXR1cF93aXphcmRfZGF0ZV9zZWxlY3Rpb25fcHJldmlld19ub25jZScsXG5cdFx0XHQnd3BiY19zZXR0aW5nc19jYWxlbmRhcl9wcmV2aWV3X2xlZ2VuZF90ZXh0X2F2YWlsYWJsZScsXG5cdFx0XHQnd3BiY19zZXR0aW5nc19jYWxlbmRhcl9wcmV2aWV3X2xlZ2VuZF90ZXh0X3BlbmRpbmcnLFxuXHRcdFx0J3dwYmNfc2V0dGluZ3NfY2FsZW5kYXJfcHJldmlld19sZWdlbmRfdGV4dF9hcHByb3ZlZCcsXG5cdFx0XHQnd3BiY19zZXR0aW5nc19jYWxlbmRhcl9wcmV2aWV3X2xlZ2VuZF90ZXh0X3BhcnRpYWxseScsXG5cdFx0XHQnd3BiY19zZXR0aW5nc19jYWxlbmRhcl9wcmV2aWV3X2xlZ2VuZF90ZXh0X3VuYXZhaWxhYmxlJ1xuXHRcdF07XG5cblx0XHQkLmVhY2goIG1hcmtlcl9rZXlzLCBmdW5jdGlvbiAoIGluZGV4LCBrZXkgKSB7XG5cdFx0XHRpZiAoIHNvdXJjZVsga2V5IF0gKSB7XG5cdFx0XHRcdHJlcXVlc3RbIGtleSBdID0gMTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdFx0JC5lYWNoKCB0b2dnbGVfa2V5cywgZnVuY3Rpb24gKCBpbmRleCwga2V5ICkge1xuXHRcdFx0aWYgKCAnT24nID09PSBzb3VyY2VbIGtleSBdIHx8ICdPZmYnID09PSBzb3VyY2VbIGtleSBdICkge1xuXHRcdFx0XHRyZXF1ZXN0WyBrZXkgXSA9IHNvdXJjZVsga2V5IF07XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdCQuZWFjaCggdGV4dF9rZXlzLCBmdW5jdGlvbiAoIGluZGV4LCBrZXkgKSB7XG5cdFx0XHRpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggc291cmNlLCBrZXkgKSApIHtcblx0XHRcdFx0cmVxdWVzdFsga2V5IF0gPSBTdHJpbmcoIHNvdXJjZVsga2V5IF0gfHwgJycgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cblx0XHRyZXR1cm4gcmVxdWVzdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgb25lIGNhbGVuZGFyIHBhcmFtZXRlciB0aHJvdWdoIHRoZSBlc3RhYmxpc2hlZCBXUEJDIHN0YXRlIEFQSS5cblx0ICpcblx0ICogQHBhcmFtIHtudW1iZXJ9IHJlc291cmNlX2lkIEJvb2tpbmcgcmVzb3VyY2UgSUQuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgICAgICAgICBBbGxvdy1saXN0ZWQgcGFyYW1ldGVyIGtleS5cblx0ICogQHBhcmFtIHsqfSAgICAgIHZhbHVlICAgICAgIEpTT04tc2FmZSBwYXJhbWV0ZXIgdmFsdWUuXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRmdW5jdGlvbiBzZXRfY2FsZW5kYXJfcGFyYW1ldGVyKCByZXNvdXJjZV9pZCwga2V5LCB2YWx1ZSApIHtcblx0XHRpZiAoIHdpbmRvdy5fd3BiYyAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2Ygd2luZG93Ll93cGJjLmNhbGVuZGFyX19zZXRfcGFyYW1fdmFsdWUgKSB7XG5cdFx0XHR3aW5kb3cuX3dwYmMuY2FsZW5kYXJfX3NldF9wYXJhbV92YWx1ZSggcmVzb3VyY2VfaWQsIGtleSwgdmFsdWUgKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQXBwbHkgdGhlIGZpeGVkIGNhbGVuZGFyLXBhcmFtZXRlciBjb250cmFjdCByZXR1cm5lZCBieSB0aGUgc2VydmVyLlxuXHQgKlxuXHQgKiBAcGFyYW0ge251bWJlcn0gcmVzb3VyY2VfaWQgICAgICAgICBCb29raW5nIHJlc291cmNlIElELlxuXHQgKiBAcGFyYW0ge09iamVjdH0gY2FsZW5kYXJfcGFyYW1ldGVycyBWYWxpZGF0ZWQgc2VydmVyIHBhcmFtZXRlciBtYXAuXG5cdCAqIEByZXR1cm4ge3ZvaWR9XG5cdCAqL1xuXHRmdW5jdGlvbiBhcHBseV9jYWxlbmRhcl9wYXJhbWV0ZXJzKCByZXNvdXJjZV9pZCwgY2FsZW5kYXJfcGFyYW1ldGVycyApIHtcblx0XHR2YXIgcGFyYW1ldGVycyA9IGNhbGVuZGFyX3BhcmFtZXRlcnMgJiYgJ29iamVjdCcgPT09IHR5cGVvZiBjYWxlbmRhcl9wYXJhbWV0ZXJzID8gY2FsZW5kYXJfcGFyYW1ldGVycyA6IHt9O1xuXHRcdHZhciBhbGxvd2VkX2tleXMgPSBbXG5cdFx0XHQnaXNfZW5hYmxlZF9jaGFuZ2Vfb3ZlcicsXG5cdFx0XHQnY2FsZW5kYXJfc2Nyb2xsX3RvJyxcblx0XHRcdCdjYWxlbmRhcl9kYXRlc19zdGFydCcsXG5cdFx0XHQnY2FsZW5kYXJfZGF0ZXNfZW5kJyxcblx0XHRcdCdib29raW5nX21heF9tb250aGVzX2luX2NhbGVuZGFyJyxcblx0XHRcdCdib29raW5nX3N0YXJ0X2RheV93ZWVlaycsXG5cdFx0XHQnY2FsZW5kYXJfbnVtYmVyX29mX21vbnRocycsXG5cdFx0XHQnZGF5c19zZWxlY3RfbW9kZScsXG5cdFx0XHQnZml4ZWRfX2RheXNfbnVtJyxcblx0XHRcdCdmaXhlZF9fd2Vla19kYXlzX19zdGFydCcsXG5cdFx0XHQnZHluYW1pY19fZGF5c19taW4nLFxuXHRcdFx0J2R5bmFtaWNfX2RheXNfbWF4Jyxcblx0XHRcdCdkeW5hbWljX19kYXlzX3NwZWNpZmljJyxcblx0XHRcdCdkeW5hbWljX193ZWVrX2RheXNfX3N0YXJ0Jyxcblx0XHRcdCdyYW5nZV9zZWxlY3Rpb25fZ3VpZGFuY2VfaXNfZW5hYmxlZCcsXG5cdFx0XHQnYm9va2luZ19kYXRlX2Zvcm1hdCcsXG5cdFx0XHQnYm9va2luZ190aW1lX2Zvcm1hdCcsXG5cdFx0XHQnaXNfcGFyZW50X3Jlc291cmNlJyxcblx0XHRcdCdib29raW5nX2NhcGFjaXR5X2ZpZWxkJyxcblx0XHRcdCdib29raW5nX2lzX2Rpc3NiYWxlX2Jvb2tpbmdfZm9yX2RpZmZlcmVudF9zdWJfcmVzb3VyY2VzJyxcblx0XHRcdCdib29raW5nX3JlY3VycmVudF90aW1lJ1xuXHRcdF07XG5cblx0XHQkLmVhY2goIGFsbG93ZWRfa2V5cywgZnVuY3Rpb24gKCBpbmRleCwga2V5ICkge1xuXHRcdFx0aWYgKCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIHBhcmFtZXRlcnMsIGtleSApICkge1xuXHRcdFx0XHRzZXRfY2FsZW5kYXJfcGFyYW1ldGVyKCByZXNvdXJjZV9pZCwga2V5LCBwYXJhbWV0ZXJzWyBrZXkgXSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplIGEgcmVuZGVyZWQgZm9ybSB0aHJvdWdoIGtub3duIEJvb2tpbmcgQ2FsZW5kYXIgZnVuY3Rpb25zIG9ubHkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBib290c3RyYXAgSlNPTi1zYWZlIGJvb3RzdHJhcCBkYXRhIHJldHVybmVkIGJ5IFdQQkMuXG5cdCAqIEByZXR1cm4ge09iamVjdH0gUmVzb2x2ZWQgb3IgcmVqZWN0ZWQgalF1ZXJ5IHByb21pc2UuXG5cdCAqL1xuXHRmdW5jdGlvbiBpbml0aWFsaXplX2Jvb2tpbmdfZm9ybSggYm9vdHN0cmFwICkge1xuXHRcdHZhciBjb25maWcgPSBib290c3RyYXAgJiYgJ29iamVjdCcgPT09IHR5cGVvZiBib290c3RyYXAgPyBib290c3RyYXAgOiB7fTtcblx0XHR2YXIgY2FsZW5kYXJfcmVxdWVzdCA9IGdldF9jYWxlbmRhcl9yZXF1ZXN0KCBjb25maWcuY2FsZW5kYXJfcmVxdWVzdCApO1xuXHRcdHZhciByZXNvdXJjZV9pZCA9IGNhbGVuZGFyX3JlcXVlc3QucmVzb3VyY2VfaWQ7XG5cdFx0dmFyIHNlY3VyZV9wYXJhbWV0ZXJzID0gY29uZmlnLnNlY3VyZV9wYXJhbWV0ZXJzICYmICdvYmplY3QnID09PSB0eXBlb2YgY29uZmlnLnNlY3VyZV9wYXJhbWV0ZXJzID8gY29uZmlnLnNlY3VyZV9wYXJhbWV0ZXJzIDoge307XG5cblx0XHRpZiAoXG5cdFx0XHQhIHdpbmRvdy5fd3BiYyB8fFxuXHRcdFx0J2Z1bmN0aW9uJyAhPT0gdHlwZW9mIHdpbmRvdy53cGJjX2NhbGVuZGFyX3Nob3cgfHxcblx0XHRcdCdmdW5jdGlvbicgIT09IHR5cGVvZiB3aW5kb3cud3BiY19jYWxlbmRhcl9fbG9hZF9kYXRhX19hanggfHxcblx0XHRcdCdmdW5jdGlvbicgIT09IHR5cGVvZiB3aW5kb3cuX3dwYmMuc2V0X3NlY3VyZV9wYXJhbVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHJlamVjdGVkX3ByZXZpZXcoICcnICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAnZnVuY3Rpb24nID09PSB0eXBlb2Ygd2luZG93Ll93cGJjLmJhbGFuY2VyX19zZXRfbWF4X3RocmVhZHMgKSB7XG5cdFx0XHR3aW5kb3cuX3dwYmMuYmFsYW5jZXJfX3NldF9tYXhfdGhyZWFkcyggTWF0aC5tYXgoIDEsIHRvX2ludGVnZXIoIGNvbmZpZy5iYWxhbmNlcl9tYXhfdGhyZWFkcywgMSApICkgKTtcblx0XHR9XG5cblx0XHRhcHBseV9jYWxlbmRhcl9wYXJhbWV0ZXJzKCByZXNvdXJjZV9pZCwgY29uZmlnLmNhbGVuZGFyX3BhcmFtZXRlcnMgKTtcblxuXHRcdGlmICggd2luZG93Ll93cGJjLmJvb2tpbmdfX3NldF9wYXJhbV92YWx1ZSAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2Ygd2luZG93Ll93cGJjLmJvb2tpbmdfX3NldF9wYXJhbV92YWx1ZSApIHtcblx0XHRcdHdpbmRvdy5fd3BiYy5ib29raW5nX19zZXRfcGFyYW1fdmFsdWUoXG5cdFx0XHRcdHJlc291cmNlX2lkLFxuXHRcdFx0XHQnY2xhc3NpY19ib29raW5nX2NvbnRleHRfdG9rZW4nLFxuXHRcdFx0XHRTdHJpbmcoIGNvbmZpZy5jbGFzc2ljX2Jvb2tpbmdfY29udGV4dF90b2tlbiB8fCAnJyApXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmICggJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHdpbmRvdy5fd3BiYy5zZXRfb3RoZXJfcGFyYW0gJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBjb25maWcsICdpc19lbmFibGVkX2NoYW5nZV9vdmVyJyApICkge1xuXHRcdFx0d2luZG93Ll93cGJjLnNldF9vdGhlcl9wYXJhbSggJ2lzX2VuYWJsZWRfY2hhbmdlX292ZXInLCBCb29sZWFuKCBjb25maWcuaXNfZW5hYmxlZF9jaGFuZ2Vfb3ZlciApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAnZnVuY3Rpb24nID09PSB0eXBlb2Ygd2luZG93LndwYmNfX2NvbmRpdGlvbnNfX1NBVkVfSU5JVElBTF9fZGF5c19zZWxlY3Rpb25fcGFyYW1zX19ibSApIHtcblx0XHRcdHdpbmRvdy53cGJjX19jb25kaXRpb25zX19TQVZFX0lOSVRJQUxfX2RheXNfc2VsZWN0aW9uX3BhcmFtc19fYm0oIHJlc291cmNlX2lkICk7XG5cdFx0fVxuXG5cdFx0d2luZG93LndwYmNfY2FsZW5kYXJfc2hvdyggU3RyaW5nKCByZXNvdXJjZV9pZCApICk7XG5cdFx0d2luZG93Ll93cGJjLnNldF9zZWN1cmVfcGFyYW0oICdub25jZScsIFN0cmluZyggc2VjdXJlX3BhcmFtZXRlcnMubm9uY2UgfHwgJycgKSApO1xuXHRcdHdpbmRvdy5fd3BiYy5zZXRfc2VjdXJlX3BhcmFtKCAndXNlcl9pZCcsIFN0cmluZyggc2VjdXJlX3BhcmFtZXRlcnMudXNlcl9pZCB8fCAnJyApICk7XG5cdFx0d2luZG93Ll93cGJjLnNldF9zZWN1cmVfcGFyYW0oICdsb2NhbGUnLCBTdHJpbmcoIHNlY3VyZV9wYXJhbWV0ZXJzLmxvY2FsZSB8fCAnJyApICk7XG5cdFx0d2luZG93LndwYmNfY2FsZW5kYXJfX2xvYWRfZGF0YV9fYWp4KCBjYWxlbmRhcl9yZXF1ZXN0ICk7XG5cblx0XHRpZiAoICdmdW5jdGlvbicgPT09IHR5cGVvZiB3aW5kb3cud3BiY19ob29rX19pbml0X2Jvb2tpbmdfZm9ybV93aXphcmRfYnV0dG9ucyApIHtcblx0XHRcdHdpbmRvdy53cGJjX2hvb2tfX2luaXRfYm9va2luZ19mb3JtX3dpemFyZF9idXR0b25zKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKCkucHJvbWlzZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIHJldXNhYmxlIGlubGluZSBGb3JtIEJ1aWxkZXIgcHJldmlldyByZW5kZXJlci5cblx0ICpcblx0ICogT25seSBzZXJ2ZXItcmVuZGVyZWQgSFRNTCBhbmQgc3RydWN0dXJlZCBib290c3RyYXAgZGF0YSBmcm9tIGFuIGF1dGhvcml6ZWRcblx0ICogV1BCQyBlbmRwb2ludCBtYXkgYmUgcGFzc2VkIHRvIGByZXBsYWNlKClgLiBTY3JpcHQgZWxlbWVudHMgYXJlIGFsd2F5c1xuXHQgKiBkaXNjYXJkZWQ7IHRoaXMgY29tcG9uZW50IG5ldmVyIGV2YWx1YXRlcyByZXNwb25zZSBjb2RlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXIgSW5saW5lIHByZXZpZXcgY29udGVudCBjb250YWluZXIuXG5cdCAqIEByZXR1cm4ge09iamVjdHxudWxsfSBQcmV2aWV3IHJlbmRlcmVyIEFQSSwgb3IgbnVsbCBmb3IgaW52YWxpZCBpbnB1dC5cblx0ICovXG5cdGZ1bmN0aW9uIGNyZWF0ZV9pbmxpbmVfcHJldmlldyggY29udGFpbmVyICkge1xuXHRcdHZhciByZXBsYWNlbWVudF9zZXF1ZW5jZSA9IDA7XG5cblx0XHRpZiAoICEgY29udGFpbmVyIHx8IDEgIT09IGNvbnRhaW5lci5ub2RlVHlwZSApIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtaW5saW5lLWJvb2tpbmctcHJldmlldycsICcxJyApO1xuXG5cdFx0LyoqXG5cdFx0ICogUmVwbGFjZSBwcmV2aWV3IG1hcmt1cCBhbmQgaW5pdGlhbGl6ZSBpdHMga25vd24gV1BCQyBjb21wb25lbnRzLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9ICAgaHRtbCAgICAgICAgIFRydXN0ZWQgc2VydmVyLXJlbmRlcmVkIHByZXZpZXcgSFRNTC5cblx0XHQgKiBAcGFyYW0ge09iamVjdH0gICBib290c3RyYXAgICAgSlNPTi1zYWZlIFdQQkMgYm9vdHN0cmFwIGNvbnRyYWN0LlxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IG93bnNfcmVxdWVzdCBDYWxsYmFjayByZXR1cm5pbmcgd2hldGhlciB0aGUgcmVxdWVzdCByZW1haW5zIGN1cnJlbnQuXG5cdFx0ICogQHJldHVybiB7T2JqZWN0fSBqUXVlcnkgcHJvbWlzZS5cblx0XHQgKi9cblx0XHRmdW5jdGlvbiByZXBsYWNlKCBodG1sLCBib290c3RyYXAsIG93bnNfcmVxdWVzdCApIHtcblx0XHRcdHZhciByZXBsYWNlbWVudF9pZCA9ICsrcmVwbGFjZW1lbnRfc2VxdWVuY2U7XG5cdFx0XHR2YXIgcGFyc2VkID0gJC5wYXJzZUhUTUwoIFN0cmluZyggaHRtbCB8fCAnJyApLCBkb2N1bWVudCwgZmFsc2UgKSB8fCBbXTtcblx0XHRcdHZhciAkcGFyc2VkX2NvbnRhaW5lciA9ICQoICc8ZGl2PicgKS5hcHBlbmQoIHBhcnNlZCApO1xuXHRcdFx0dmFyIG93bnNfcHJldmlldyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHJlcGxhY2VtZW50X2lkID09PSByZXBsYWNlbWVudF9zZXF1ZW5jZSAmJiAoICEgb3duc19yZXF1ZXN0IHx8IG93bnNfcmVxdWVzdCgpICk7XG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAoICEgb3duc19wcmV2aWV3KCkgKSB7XG5cdFx0XHRcdHJldHVybiByZWplY3RlZF9wcmV2aWV3KCAnJyApO1xuXHRcdFx0fVxuXG5cdFx0XHQkcGFyc2VkX2NvbnRhaW5lci5maW5kKCAnc2NyaXB0JyApLmFkZEJhY2soICdzY3JpcHQnICkucmVtb3ZlKCk7XG5cdFx0XHRjbGVhbnVwX2NhbGVuZGFycyggY29udGFpbmVyICk7XG5cdFx0XHQkKCBjb250YWluZXIgKS5lbXB0eSgpLmFwcGVuZCggJHBhcnNlZF9jb250YWluZXIuY29udGVudHMoKSApO1xuXG5cdFx0XHRpZiAoICEgb3duc19wcmV2aWV3KCkgKSB7XG5cdFx0XHRcdHJldHVybiByZWplY3RlZF9wcmV2aWV3KCAnJyApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gaW5pdGlhbGl6ZV9ib29raW5nX2Zvcm0oIGJvb3RzdHJhcCApO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEludmFsaWRhdGUgcGVuZGluZyByZXBsYWNlbWVudHMgYW5kIHJlbGVhc2UgY2FsZW5kYXIgaW5zdGFuY2VzLlxuXHRcdCAqXG5cdFx0ICogQHJldHVybiB7dm9pZH1cblx0XHQgKi9cblx0XHRmdW5jdGlvbiBkZXN0cm95KCkge1xuXHRcdFx0cmVwbGFjZW1lbnRfc2VxdWVuY2UgKz0gMTtcblx0XHRcdGNsZWFudXBfY2FsZW5kYXJzKCBjb250YWluZXIgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVwbGFjZTogcmVwbGFjZSxcblx0XHRcdGRlc3Ryb3k6IGRlc3Ryb3lcblx0XHR9O1xuXHR9XG5cblx0d2luZG93LndwYmNfYmZiX2lubGluZV9wcmV2aWV3ID0ge1xuXHRcdGNyZWF0ZTogY3JlYXRlX2lubGluZV9wcmV2aWV3XG5cdH07XG59KCB3aW5kb3csIGRvY3VtZW50LCB3aW5kb3cualF1ZXJ5ICkgKTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFLFdBQVdBLE1BQU0sRUFBRUMsUUFBUSxFQUFFQyxDQUFDLEVBQUc7RUFDbEMsWUFBWTs7RUFFWjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQyxTQUFTQyxnQkFBZ0JBLENBQUVDLE9BQU8sRUFBRztJQUNwQyxJQUFJQyxRQUFRLEdBQUdILENBQUMsQ0FBQ0ksUUFBUSxDQUFDLENBQUM7SUFFM0JELFFBQVEsQ0FBQ0UsTUFBTSxDQUFFLElBQUlDLEtBQUssQ0FBRUosT0FBTyxJQUFJLEVBQUcsQ0FBRSxDQUFDO0lBQzdDLE9BQU9DLFFBQVEsQ0FBQ0ksT0FBTyxDQUFDLENBQUM7RUFDMUI7O0VBRUE7QUFDRDtBQUNBO0FB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
236