PluginProbe
Booking Calendar / 11.0
Booking Calendar v11.0
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 / _dist / all / _out / wpbc_all.js

wpbc_all.js in Booking Calendar 11.0, at _dist/all/_out/wpbc_all.js

1,509 lines 569.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 "use strict";/**
2 * =====================================================================================================================
3 * JavaScript Util Functions ../includes/__js/utils/wpbc_utils.js
4 * =====================================================================================================================
5 *//**
6 * Trim strings and array joined with (,)
7 *
8 * @param string_to_trim string / array
9 * @returns string
10 */function wpbc_trim(string_to_trim){if(Array.isArray(string_to_trim)){string_to_trim=string_to_trim.join(',');}if('string'==typeof string_to_trim){string_to_trim=string_to_trim.trim();}return string_to_trim;}/**
11 * Check if element in array
12 *
13 * @param array_here array
14 * @param p_val element to check
15 * @returns {boolean}
16 */function wpbc_in_array(array_here,p_val){for(var i=0,l=array_here.length;i<l;i++){if(array_here[i]==p_val){return true;}}return false;}/**
17 * Prevent opening blank windows on WordPress playground for pseudo links like this: <a href="javascript:void(0)"> or # to stay in the same tab.
18 */(function(){'use strict';function is_playground_origin(){return location.origin==='https://playground.wordpress.net';}function is_pseudo_link(a){if(!a||!a.getAttribute)return true;var href=(a.getAttribute('href')||'').trim().toLowerCase();return!href||href==='#'||href.indexOf('#')===0||href.indexOf('javascript:')===0||href.indexOf('mailto:')===0||href.indexOf('tel:')===0;}function fix_target(a){if(!a)return;if(is_pseudo_link(a)||a.hasAttribute('data-wp-no-blank')){a.target='_self';}}function init_fix(){// Optional: clean up current DOM (harmless—affects only pseudo/datamarked links).
19 var nodes=document.querySelectorAll('a[href]');for(var i=0;i<nodes.length;i++)fix_target(nodes[i]);// Late bubble-phase listeners (run after Playground's handlers)
20 document.addEventListener('click',function(e){var a=e.target&&e.target.closest?e.target.closest('a[href]'):null;if(a)fix_target(a);},false);document.addEventListener('focusin',function(e){var a=e.target&&e.target.closest?e.target.closest('a[href]'):null;if(a)fix_target(a);});}function schedule_init(){if(!is_playground_origin())return;setTimeout(init_fix,1000);// ensure we attach after Playground's script.
21 }if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',schedule_init);}else{schedule_init();}})();"use strict";/**
22 * =====================================================================================================================
23 * includes/__js/wpbc/wpbc.js
24 * =====================================================================================================================
25 *//**
26 * Deep Clone of object or array
27 *
28 * @param obj
29 * @returns {any}
30 */function wpbc_clone_obj(obj){return JSON.parse(JSON.stringify(obj));}/**
31 * Main _wpbc JS object
32 */var _wpbc=function(obj,$){// Secure parameters for Ajax ------------------------------------------------------------------------------------
33 var p_secure=obj.security_obj=obj.security_obj||{user_id:0,nonce:'',locale:''};obj.set_secure_param=function(param_key,param_val){p_secure[param_key]=param_val;};obj.get_secure_param=function(param_key){return p_secure[param_key];};// Calendars ----------------------------------------------------------------------------------------------------
34 var p_calendars=obj.calendars_obj=obj.calendars_obj||{// sort : "booking_id",
35 // sort_type : "DESC",
36 // page_num : 1,
37 // page_items_count: 10,
38 // create_date : "",
39 // keyword : "",
40 // source : ""
41 };/**
42 * Check if calendar for specific booking resource defined :: true | false
43 *
44 * @param {string|int} resource_id
45 * @returns {boolean}
46 */obj.calendar__is_defined=function(resource_id){return'undefined'!==typeof p_calendars['calendar_'+resource_id];};/**
47 * Create Calendar initializing
48 *
49 * @param {string|int} resource_id
50 */obj.calendar__init=function(resource_id){p_calendars['calendar_'+resource_id]={};p_calendars['calendar_'+resource_id]['id']=resource_id;p_calendars['calendar_'+resource_id]['pending_days_selectable']=false;};/**
51 * Check if the type of this property is INT
52 * @param property_name
53 * @returns {boolean}
54 */obj.calendar__is_prop_int=function(property_name){// FixIn: 9.9.0.29.
55 var p_calendar_int_properties=['dynamic__days_min','dynamic__days_max','fixed__days_num'];var is_include=p_calendar_int_properties.includes(property_name);return is_include;};/**
56 * Set params for all calendars
57 *
58 * @param {object} calendars_obj Object { calendar_1: {} }
59 * calendar_3: {}, ... }
60 */obj.calendars_all__set=function(calendars_obj){p_calendars=calendars_obj;};/**
61 * Get bookings in all calendars
62 *
63 * @returns {object|{}}
64 */obj.calendars_all__get=function(){return p_calendars;};/**
65 * Get calendar object :: { id: 1, … }
66 *
67 * @param {string|int} resource_id '2'
68 * @returns {object|boolean} { id: 2 ,… }
69 */obj.calendar__get_parameters=function(resource_id){if(obj.calendar__is_defined(resource_id)){return p_calendars['calendar_'+resource_id];}else{return false;}};/**
70 * Set calendar object :: { dates: Object { "2023-07-21": {…}, "2023-07-22": {…}, "2023-07-23": {…}, … }
71 *
72 * if calendar object not defined, then it's will be defined and ID set
73 * if calendar exist, then system set as new or overwrite only properties from calendar_property_obj parameter, but other properties will be existed and not overwrite, like 'id'
74 *
75 * @param {string|int} resource_id '2'
76 * @param {object} calendar_property_obj { dates: Object { "2023-07-21": {…}, "2023-07-22": {…}, "2023-07-23": {…}, … } }
77 * @param {boolean} is_complete_overwrite if 'true' (default: 'false'), then only overwrite or add new properties in calendar_property_obj
78 * @returns {*}
79 *
80 * Examples:
81 *
82 * Common usage in PHP:
83 * echo " _wpbc.calendar__set( " .intval( $resource_id ) . ", { 'dates': " . wp_json_encode( $availability_per_days_arr ) . " } );";
84 */obj.calendar__set_parameters=function(resource_id,calendar_property_obj,is_complete_overwrite=false){if(!obj.calendar__is_defined(resource_id)||true===is_complete_overwrite){obj.calendar__init(resource_id);}for(var prop_name in calendar_property_obj){p_calendars['calendar_'+resource_id][prop_name]=calendar_property_obj[prop_name];}return p_calendars['calendar_'+resource_id];};/**
85 * Set property to calendar
86 * @param resource_id "1"
87 * @param prop_name name of property
88 * @param prop_value value of property
89 * @returns {*} calendar object
90 */obj.calendar__set_param_value=function(resource_id,prop_name,prop_value){if(!obj.calendar__is_defined(resource_id)){obj.calendar__init(resource_id);}p_calendars['calendar_'+resource_id][prop_name]=prop_value;return p_calendars['calendar_'+resource_id];};/**
91 * Get calendar property value :: mixed | null
92 *
93 * @param {string|int} resource_id '1'
94 * @param {string} prop_name 'selection_mode'
95 * @returns {*|null} mixed | null
96 */obj.calendar__get_param_value=function(resource_id,prop_name){if(obj.calendar__is_defined(resource_id)&&'undefined'!==typeof p_calendars['calendar_'+resource_id][prop_name]){// FixIn: 9.9.0.29.
97 if(obj.calendar__is_prop_int(prop_name)){p_calendars['calendar_'+resource_id][prop_name]=parseInt(p_calendars['calendar_'+resource_id][prop_name]);}return p_calendars['calendar_'+resource_id][prop_name];}return null;// If some property not defined, then null;
98 };// -----------------------------------------------------------------------------------------------------------------
99 // Bookings ----------------------------------------------------------------------------------------------------
100 var p_bookings=obj.bookings_obj=obj.bookings_obj||{// calendar_1: Object {
101 // id: 1
102 // , dates: Object { "2023-07-21": {…}, "2023-07-22": {…}, "2023-07-23": {…}, …
103 // }
104 };/**
105 * Check if bookings for specific booking resource defined :: true | false
106 *
107 * @param {string|int} resource_id
108 * @returns {boolean}
109 */obj.bookings_in_calendar__is_defined=function(resource_id){return'undefined'!==typeof p_bookings['calendar_'+resource_id];};/**
110 * Get bookings calendar object :: { id: 1 , dates: Object { "2023-07-21": {…}, "2023-07-22": {…}, "2023-07-23": {…}, … }
111 *
112 * @param {string|int} resource_id '2'
113 * @returns {object|boolean} { id: 2 , dates: Object { "2023-07-21": {…}, "2023-07-22": {…}, "2023-07-23": {…}, … }
114 */obj.bookings_in_calendar__get=function(resource_id){if(obj.bookings_in_calendar__is_defined(resource_id)){return p_bookings['calendar_'+resource_id];}else{return false;}};/**
115 * Set bookings calendar object :: { dates: Object { "2023-07-21": {…}, "2023-07-22": {…}, "2023-07-23": {…}, … }
116 *
117 * if calendar object not defined, then it's will be defined and ID set
118 * if calendar exist, then system set as new or overwrite only properties from calendar_obj parameter, but other properties will be existed and not overwrite, like 'id'
119 *
120 * @param {string|int} resource_id '2'
121 * @param {object} calendar_obj { dates: Object { "2023-07-21": {…}, "2023-07-22": {…}, "2023-07-23": {…}, … } }
122 * @returns {*}
123 *
124 * Examples:
125 *
126 * Common usage in PHP:
127 * echo " _wpbc.bookings_in_calendar__set( " .intval( $resource_id ) . ", { 'dates': " . wp_json_encode( $availability_per_days_arr ) . " } );";
128 */obj.bookings_in_calendar__set=function(resource_id,calendar_obj){if(!obj.bookings_in_calendar__is_defined(resource_id)){p_bookings['calendar_'+resource_id]={};p_bookings['calendar_'+resource_id]['id']=resource_id;}for(var prop_name in calendar_obj){p_bookings['calendar_'+resource_id][prop_name]=calendar_obj[prop_name];}return p_bookings['calendar_'+resource_id];};// Dates
129 /**
130 * Get bookings data for ALL Dates in calendar :: false | { "2023-07-22": {…}, "2023-07-23": {…}, … }
131 *
132 * @param {string|int} resource_id '1'
133 * @returns {object|boolean} false | Object {
134 "2023-07-24": Object { ['summary']['status_for_day']: "available", day_availability: 1, max_capacity: 1, … }
135 "2023-07-26": Object { ['summary']['status_for_day']: "full_day_booking", ['summary']['status_for_bookings']: "pending", day_availability: 0, … }
136 "2023-07-29": Object { ['summary']['status_for_day']: "resource_availability", day_availability: 0, max_capacity: 1, … }
137 "2023-07-30": {…}, "2023-07-31": {…}, …
138 }
139 */obj.bookings_in_calendar__get_dates=function(resource_id){if(obj.bookings_in_calendar__is_defined(resource_id)&&'undefined'!==typeof p_bookings['calendar_'+resource_id]['dates']){return p_bookings['calendar_'+resource_id]['dates'];}return false;// If some property not defined, then false;
140 };/**
141 * Set bookings dates in calendar object :: { "2023-07-21": {…}, "2023-07-22": {…}, "2023-07-23": {…}, … }
142 *
143 * if calendar object not defined, then it's will be defined and 'id', 'dates' set
144 * if calendar exist, then system add a new or overwrite only dates from dates_obj parameter,
145 * but other dates not from parameter dates_obj will be existed and not overwrite.
146 *
147 * @param {string|int} resource_id '2'
148 * @param {object} dates_obj { "2023-07-21": {…}, "2023-07-22": {…}, "2023-07-23": {…}, … }
149 * @param {boolean} is_complete_overwrite if false, then only overwrite or add dates from dates_obj
150 * @returns {*}
151 *
152 * Examples:
153 * _wpbc.bookings_in_calendar__set_dates( resource_id, { "2023-07-21": {…}, "2023-07-22": {…}, … } ); <- overwrite ALL dates
154 * _wpbc.bookings_in_calendar__set_dates( resource_id, { "2023-07-22": {…} }, false ); <- add or overwrite only "2023-07-22": {}
155 *
156 * Common usage in PHP:
157 * echo " _wpbc.bookings_in_calendar__set_dates( " . intval( $resource_id ) . ", " . wp_json_encode( $availability_per_days_arr ) . " ); ";
158 */obj.bookings_in_calendar__set_dates=function(resource_id,dates_obj,is_complete_overwrite=true){if(!obj.bookings_in_calendar__is_defined(resource_id)){obj.bookings_in_calendar__set(resource_id,{'dates':{}});}if('undefined'===typeof p_bookings['calendar_'+resource_id]['dates']){p_bookings['calendar_'+resource_id]['dates']={};}if(is_complete_overwrite){// Complete overwrite all booking dates
159 p_bookings['calendar_'+resource_id]['dates']=dates_obj;}else{// Add only new or overwrite exist booking dates from parameter. Booking dates not from parameter will be without chnanges
160 for(var prop_name in dates_obj){p_bookings['calendar_'+resource_id]['dates'][prop_name]=dates_obj[prop_name];}}return p_bookings['calendar_'+resource_id];};/**
161 * Get bookings data for specific date in calendar :: false | { day_availability: 1, ... }
162 *
163 * @param {string|int} resource_id '1'
164 * @param {string} sql_class_day '2023-07-21'
165 * @returns {object|boolean} false | {
166 day_availability: 4
167 max_capacity: 4 // >= Business Large
168 2: Object { is_day_unavailable: false, _day_status: "available" }
169 10: Object { is_day_unavailable: false, _day_status: "available" } // >= Business Large ...
170 11: Object { is_day_unavailable: false, _day_status: "available" }
171 12: Object { is_day_unavailable: false, _day_status: "available" }
172 }
173 */obj.bookings_in_calendar__get_for_date=function(resource_id,sql_class_day){if(obj.bookings_in_calendar__is_defined(resource_id)&&'undefined'!==typeof p_bookings['calendar_'+resource_id]['dates']&&'undefined'!==typeof p_bookings['calendar_'+resource_id]['dates'][sql_class_day]){return p_bookings['calendar_'+resource_id]['dates'][sql_class_day];}return false;// If some property not defined, then false;
174 };// Any PARAMS in bookings
175 /**
176 * Set property to booking
177 * @param resource_id "1"
178 * @param prop_name name of property
179 * @param prop_value value of property
180 * @returns {*} booking object
181 */obj.booking__set_param_value=function(resource_id,prop_name,prop_value){if(!obj.bookings_in_calendar__is_defined(resource_id)){p_bookings['calendar_'+resource_id]={};p_bookings['calendar_'+resource_id]['id']=resource_id;}p_bookings['calendar_'+resource_id][prop_name]=prop_value;return p_bookings['calendar_'+resource_id];};/**
182 * Get booking property value :: mixed | null
183 *
184 * @param {string|int} resource_id '1'
185 * @param {string} prop_name 'selection_mode'
186 * @returns {*|null} mixed | null
187 */obj.booking__get_param_value=function(resource_id,prop_name){if(obj.bookings_in_calendar__is_defined(resource_id)&&'undefined'!==typeof p_bookings['calendar_'+resource_id][prop_name]){return p_bookings['calendar_'+resource_id][prop_name];}return null;// If some property not defined, then null;
188 };/**
189 * Set bookings for all calendars
190 *
191 * @param {object} calendars_obj Object { calendar_1: { id: 1, dates: Object { "2023-07-22": {…}, "2023-07-23": {…}, "2023-07-24": {…}, … } }
192 * calendar_3: {}, ... }
193 */obj.bookings_in_calendars__set_all=function(calendars_obj){p_bookings=calendars_obj;};/**
194 * Get bookings in all calendars
195 *
196 * @returns {object|{}}
197 */obj.bookings_in_calendars__get_all=function(){return p_bookings;};// -----------------------------------------------------------------------------------------------------------------
198 // Seasons ----------------------------------------------------------------------------------------------------
199 var p_seasons=obj.seasons_obj=obj.seasons_obj||{// calendar_1: Object {
200 // id: 1
201 // , dates: Object { "2023-07-21": {…}, "2023-07-22": {…}, "2023-07-23": {…}, …
202 // }
203 };/**
204 * Add season names for dates in calendar object :: { "2023-07-21": [ 'wpbc_season_september_2023', 'wpbc_season_september_2024' ], "2023-07-22": [...], ... }
205 *
206 *
207 * @param {string|int} resource_id '2'
208 * @param {object} dates_obj { "2023-07-21": {…}, "2023-07-22": {…}, "2023-07-23": {…}, … }
209 * @param {boolean} is_complete_overwrite if false, then only add dates from dates_obj
210 * @returns {*}
211 *
212 * Examples:
213 * _wpbc.seasons__set( resource_id, { "2023-07-21": [ 'wpbc_season_september_2023', 'wpbc_season_september_2024' ], "2023-07-22": [...], ... } );
214 */obj.seasons__set=function(resource_id,dates_obj,is_complete_overwrite=false){if('undefined'===typeof p_seasons['calendar_'+resource_id]){p_seasons['calendar_'+resource_id]={};}if(is_complete_overwrite){// Complete overwrite all season dates
215 p_seasons['calendar_'+resource_id]=dates_obj;}else{// Add only new or overwrite exist booking dates from parameter. Booking dates not from parameter will be without chnanges
216 for(var prop_name in dates_obj){if('undefined'===typeof p_seasons['calendar_'+resource_id][prop_name]){p_seasons['calendar_'+resource_id][prop_name]=[];}for(var season_name_key in dates_obj[prop_name]){p_seasons['calendar_'+resource_id][prop_name].push(dates_obj[prop_name][season_name_key]);}}}return p_seasons['calendar_'+resource_id];};/**
217 * Get bookings data for specific date in calendar :: [] | [ 'wpbc_season_september_2023', 'wpbc_season_september_2024' ]
218 *
219 * @param {string|int} resource_id '1'
220 * @param {string} sql_class_day '2023-07-21'
221 * @returns {object|boolean} [] | [ 'wpbc_season_september_2023', 'wpbc_season_september_2024' ]
222 */obj.seasons__get_for_date=function(resource_id,sql_class_day){if('undefined'!==typeof p_seasons['calendar_'+resource_id]&&'undefined'!==typeof p_seasons['calendar_'+resource_id][sql_class_day]){return p_seasons['calendar_'+resource_id][sql_class_day];}return[];// If not defined, then [];
223 };// Other parameters ------------------------------------------------------------------------------------
224 var p_other=obj.other_obj=obj.other_obj||{};obj.set_other_param=function(param_key,param_val){p_other[param_key]=param_val;};obj.get_other_param=function(param_key){return p_other[param_key];};/**
225 * Get all other params
226 *
227 * @returns {object|{}}
228 */obj.get_other_param__all=function(){return p_other;};// Messages ------------------------------------------------------------------------------------
229 var p_messages=obj.messages_obj=obj.messages_obj||{};obj.set_message=function(param_key,param_val){p_messages[param_key]=param_val;};obj.get_message=function(param_key){return p_messages[param_key];};/**
230 * Get all other params
231 *
232 * @returns {object|{}}
233 */obj.get_messages__all=function(){return p_messages;};// -----------------------------------------------------------------------------------------------------------------
234 return obj;}(_wpbc||{},jQuery);window.__WPBC_DEV=true;/**
235 * Extend _wpbc with new methods
236 *
237 * @type {*|{}}
238 * @private
239 */_wpbc=function(obj,$){/**
240 * Dev logger (no-op unless window.__WPBC_DEV = true)
241 *
242 * @type {*|{warn: (function(*, *, *): void), error: (function(*, *, *): void), once: obj.dev.once, try: ((function(*, *, *): (*|undefined))|*)}}
243 */obj.dev=obj.dev||(()=>{const seen=new Set();const enabled=()=>!!window.__WPBC_DEV;function out(level,code,msg,extra){if(!enabled())return;try{(console[level]||console.warn)(`[WPBC][${code}] ${msg}`,extra??'');}catch{}}return{log:(code,msg,extra)=>out('log',code,msg,extra),debug:(code,msg,extra)=>out('debug',code,msg,extra),warn:(code,msg,extra)=>out('warn',code,msg,extra),error:(code,errOrMsg,extra)=>out('error',code,errOrMsg instanceof Error?errOrMsg.message:String(errOrMsg),errOrMsg instanceof Error?errOrMsg:extra),once:(code,msg,extra)=>{if(!enabled())return;const key=`${code}|${msg}`;if(seen.has(key))return;seen.add(key);out('error',code,msg,extra);},try:(code,fn,extra)=>{try{return fn();}catch(e){out('error',code,e,extra);}}};})();// Optional: global traps in dev.
244 if(window.__WPBC_DEV){window.addEventListener('error',e=>{try{_wpbc?.dev?.error('GLOBAL-ERROR',e?.error||e?.message,e);}catch(_){}});window.addEventListener('unhandledrejection',e=>{try{_wpbc?.dev?.error('GLOBAL-REJECTION',e?.reason);}catch(_){}});}return obj;}(_wpbc||{},jQuery);/**
245 * Extend _wpbc with new methods // FixIn: 9.8.6.2.
246 *
247 * @type {*|{}}
248 * @private
249 */_wpbc=function(obj,$){// Load Balancer -----------------------------------------------------------------------------------------------
250 var p_balancer=obj.balancer_obj=obj.balancer_obj||{'max_threads':2,'in_process':[],'wait':[]};/**
251 * Set max parallel request to load
252 *
253 * @param max_threads
254 */obj.balancer__set_max_threads=function(max_threads){p_balancer['max_threads']=max_threads;};/**
255 * Check if balancer for specific booking resource defined :: true | false
256 *
257 * @param {string|int} resource_id
258 * @returns {boolean}
259 */obj.balancer__is_defined=function(resource_id){return'undefined'!==typeof p_balancer['balancer_'+resource_id];};/**
260 * Create balancer initializing
261 *
262 * @param {string|int} resource_id
263 */obj.balancer__init=function(resource_id,function_name,params={}){var balance_obj={};balance_obj['resource_id']=resource_id;balance_obj['priority']=1;balance_obj['function_name']=function_name;balance_obj['params']=wpbc_clone_obj(params);if(obj.balancer__is_already_run(resource_id,function_name)){return'run';}if(obj.balancer__is_already_wait(resource_id,function_name)){return'wait';}if(obj.balancer__can_i_run()){obj.balancer__add_to__run(balance_obj);return'run';}else{obj.balancer__add_to__wait(balance_obj);return'wait';}};/**
264 * Can I Run ?
265 * @returns {boolean}
266 */obj.balancer__can_i_run=function(){return p_balancer['in_process'].length<p_balancer['max_threads'];};/**
267 * Add to WAIT
268 * @param balance_obj
269 */obj.balancer__add_to__wait=function(balance_obj){p_balancer['wait'].push(balance_obj);};/**
270 * Remove from Wait
271 *
272 * @param resource_id
273 * @param function_name
274 * @returns {*|boolean}
275 */obj.balancer__remove_from__wait_list=function(resource_id,function_name){var removed_el=false;if(p_balancer['wait'].length){// FixIn: 9.8.10.1.
276 for(var i in p_balancer['wait']){if(resource_id===p_balancer['wait'][i]['resource_id']&&function_name===p_balancer['wait'][i]['function_name']){removed_el=p_balancer['wait'].splice(i,1);removed_el=removed_el.pop();p_balancer['wait']=p_balancer['wait'].filter(function(v){return v;});// Reindex array
277 return removed_el;}}}return removed_el;};/**
278 * Is already WAIT
279 *
280 * @param resource_id
281 * @param function_name
282 * @returns {boolean}
283 */obj.balancer__is_already_wait=function(resource_id,function_name){if(p_balancer['wait'].length){// FixIn: 9.8.10.1.
284 for(var i in p_balancer['wait']){if(resource_id===p_balancer['wait'][i]['resource_id']&&function_name===p_balancer['wait'][i]['function_name']){return true;}}}return false;};/**
285 * Add to RUN
286 * @param balance_obj
287 */obj.balancer__add_to__run=function(balance_obj){p_balancer['in_process'].push(balance_obj);};/**
288 * Remove from RUN list
289 *
290 * @param resource_id
291 * @param function_name
292 * @returns {*|boolean}
293 */obj.balancer__remove_from__run_list=function(resource_id,function_name){var removed_el=false;if(p_balancer['in_process'].length){// FixIn: 9.8.10.1.
294 for(var i in p_balancer['in_process']){if(resource_id===p_balancer['in_process'][i]['resource_id']&&function_name===p_balancer['in_process'][i]['function_name']){removed_el=p_balancer['in_process'].splice(i,1);removed_el=removed_el.pop();p_balancer['in_process']=p_balancer['in_process'].filter(function(v){return v;});// Reindex array
295 return removed_el;}}}return removed_el;};/**
296 * Is already RUN
297 *
298 * @param resource_id
299 * @param function_name
300 * @returns {boolean}
301 */obj.balancer__is_already_run=function(resource_id,function_name){if(p_balancer['in_process'].length){// FixIn: 9.8.10.1.
302 for(var i in p_balancer['in_process']){if(resource_id===p_balancer['in_process'][i]['resource_id']&&function_name===p_balancer['in_process'][i]['function_name']){return true;}}}return false;};obj.balancer__run_next=function(){// Get 1st from Wait list
303 var removed_el=false;if(p_balancer['wait'].length){// FixIn: 9.8.10.1.
304 for(var i in p_balancer['wait']){removed_el=obj.balancer__remove_from__wait_list(p_balancer['wait'][i]['resource_id'],p_balancer['wait'][i]['function_name']);break;}}if(false!==removed_el){// Run
305 obj.balancer__run(removed_el);}};/**
306 * Run
307 * @param balance_obj
308 */obj.balancer__run=function(balance_obj){switch(balance_obj['function_name']){case'wpbc_calendar__load_data__ajx':// Add to run list
309 obj.balancer__add_to__run(balance_obj);wpbc_calendar__load_data__ajx(balance_obj['params']);break;default:}};return obj;}(_wpbc||{},jQuery);/**
310 * -- Help functions ----------------------------------------------------------------------------------------------
311 */function wpbc_balancer__is_wait(params,function_name){//console.log('::wpbc_balancer__is_wait',params , function_name );
312 if('undefined'!==typeof params['resource_id']){var balancer_status=_wpbc.balancer__init(params['resource_id'],function_name,params);return'wait'===balancer_status;}return false;}function wpbc_balancer__completed(resource_id,function_name){//console.log('::wpbc_balancer__completed',resource_id , function_name );
313 _wpbc.balancer__remove_from__run_list(resource_id,function_name);_wpbc.balancer__run_next();}/**
314 * =====================================================================================================================
315 * includes/__js/cal/wpbc_cal.js
316 * =====================================================================================================================
317 *//**
318 * Order or child booking resources saved here: _wpbc.booking__get_param_value( resource_id,
319 * 'resources_id_arr__in_dates' ) [2,10,12,11]
320 *//**
321 * How to check booked times on specific date: ?
322 *
323 _wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21');
324
325 console.log(
326 _wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[2].booked_time_slots.merged_seconds,
327 _wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[10].booked_time_slots.merged_seconds,
328 _wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[11].booked_time_slots.merged_seconds,
329 _wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[12].booked_time_slots.merged_seconds
330 );
331 * OR
332 console.log(
333 _wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[2].booked_time_slots.merged_readable,
334 _wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[10].booked_time_slots.merged_readable,
335 _wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[11].booked_time_slots.merged_readable,
336 _wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[12].booked_time_slots.merged_readable
337 );
338 *
339 *//**
340 * Days selection:
341 * wpbc_calendar__unselect_all_dates( resource_id );
342 *
343 * var resource_id = 1;
344 * Example 1: var num_selected_days = wpbc_auto_select_dates_in_calendar( resource_id, '2024-05-15',
345 * '2024-05-25' ); Example 2: var num_selected_days = wpbc_auto_select_dates_in_calendar( resource_id,
346 * ['2024-05-09','2024-05-19','2024-05-25'] );
347 *
348 *//**
349 * C A L E N D A R ---------------------------------------------------------------------------------------------------
350 *//**
351 * Show WPBC Calendar
352 *
353 * @param resource_id - resource ID
354 * @returns {boolean}
355 */function wpbc_calendar_show(resource_id){// If no calendar HTML tag, then exit
356 if(0===jQuery('#calendar_booking'+resource_id).length){return false;}// If the calendar with the same Booking resource is activated already, then exit. But in Elementor the class can be stale, so verify instance.
357 if(jQuery('#calendar_booking'+resource_id).hasClass('hasDatepick')){var existing_inst=null;try{existing_inst=jQuery.datepick._getInst(jQuery('#calendar_booking'+resource_id).get(0));}catch(e){existing_inst=null;}if(existing_inst){return false;}// Stale marker: remove and continue with init.
358 jQuery('#calendar_booking'+resource_id).removeClass('hasDatepick');}// -----------------------------------------------------------------------------------------------------------------
359 // Days selection
360 // -----------------------------------------------------------------------------------------------------------------
361 var local__is_range_select=false;var local__multi_days_select_num=365;// multiple | fixed
362 if('dynamic'===_wpbc.calendar__get_param_value(resource_id,'days_select_mode')){local__is_range_select=true;local__multi_days_select_num=0;}if('single'===_wpbc.calendar__get_param_value(resource_id,'days_select_mode')){local__multi_days_select_num=0;}// -----------------------------------------------------------------------------------------------------------------
363 // Min - Max days to scroll/show
364 // -----------------------------------------------------------------------------------------------------------------
365 var local__min_date=0;local__min_date=new Date(_wpbc.get_other_param('today_arr')[0],parseInt(_wpbc.get_other_param('today_arr')[1])-1,_wpbc.get_other_param('today_arr')[2],0,0,0);// FixIn: 9.9.0.17.
366 //console.log( local__min_date );
367 var local__max_date=_wpbc.calendar__get_param_value(resource_id,'booking_max_monthes_in_calendar');//local__max_date = new Date(2024, 5, 28); It is here issue of not selectable dates, but some dates showing in calendar as available, but we can not select it.
368 //// Define last day in calendar (as a last day of month (and not date, which is related to actual 'Today' date).
369 //// E.g. if today is 2023-09-25, and we set 'Number of months to scroll' as 5 months, then last day will be 2024-02-29 and not the 2024-02-25.
370 // var cal_last_day_in_month = jQuery.datepick._determineDate( null, local__max_date, new Date() );
371 // cal_last_day_in_month = new Date( cal_last_day_in_month.getFullYear(), cal_last_day_in_month.getMonth() + 1, 0 );
372 // local__max_date = cal_last_day_in_month; // FixIn: 10.0.0.26.
373 // Get start / end dates from the Booking Calendar shortcode. Example: [booking calendar_dates_start='2026-01-01' calendar_dates_end='2026-12-31' resource_id=1] // FixIn: 10.13.1.4.
374 if(false!==wpbc_calendar__get_dates_start(resource_id)){local__min_date=wpbc_calendar__get_dates_start(resource_id);// E.g. - local__min_date = new Date( 2025, 0, 1 );
375 }if(false!==wpbc_calendar__get_dates_end(resource_id)){local__max_date=wpbc_calendar__get_dates_end(resource_id);// E.g. - local__max_date = new Date( 2025, 11, 31 );
376 }// In case we edit booking in past or have specific parameter in URL.
377 var wpbc_edit_booking_hash=_wpbc.get_other_param('this_page_booking_hash');var wpbc_is_edit_booking_context='undefined'!==typeof wpbc_edit_booking_hash&&''!==wpbc_edit_booking_hash;var wpbc_is_add_booking_admin_page=location.href.indexOf('page=wpbc')!=-1&&location.href.indexOf('tab=add-booking')!=-1;if((wpbc_is_add_booking_admin_page||wpbc_is_edit_booking_context)&&(wpbc_is_edit_booking_context||location.href.indexOf('booking_hash')!=-1// Comment this line for ability to add booking in past days at Booking > Add booking page.
378 ||location.href.indexOf('allow_past')!=-1// FixIn: 10.7.1.2.
379 )){// local__min_date = null;
380 // FixIn: 10.14.1.4.
381 local__min_date=new Date(_wpbc.get_other_param('time_local_arr')[0],parseInt(_wpbc.get_other_param('time_local_arr')[1])-1,_wpbc.get_other_param('time_local_arr')[2],_wpbc.get_other_param('time_local_arr')[3],_wpbc.get_other_param('time_local_arr')[4],0);local__max_date=null;}var local__start_weekday=_wpbc.calendar__get_param_value(resource_id,'booking_start_day_weeek');var local__number_of_months=parseInt(_wpbc.calendar__get_param_value(resource_id,'calendar_number_of_months'));jQuery('#calendar_booking'+resource_id).text('');// Remove all HTML in calendar tag
382 // -----------------------------------------------------------------------------------------------------------------
383 // Show calendar
384 // -----------------------------------------------------------------------------------------------------------------
385 jQuery('#calendar_booking'+resource_id).datepick({beforeShowDay:function(js_date){return wpbc__calendar__apply_css_to_days(js_date,{'resource_id':resource_id},this);},onSelect:function(string_dates,js_dates_arr){/**
386 * string_dates = '23.08.2023 - 26.08.2023'
387 * | '23.08.2023 - 23.08.2023' |
388 * '19.09.2023, 24.08.2023, 30.09.2023'
389 * js_dates_arr = range: [ Date (Aug 23 2023),
390 * Date (Aug 25 2023)] | multiple: [
391 * Date(Oct 24 2023), Date(Oct 20 2023), Date(Oct
392 * 16 2023) ]
393 */return wpbc__calendar__on_select_days(string_dates,{'resource_id':resource_id},this);},onHover:function(string_date,js_date){return wpbc__calendar__on_hover_days(string_date,js_date,{'resource_id':resource_id},this);},onChangeMonthYear:function(year,real_month,js_date__1st_day_in_month){},showOn:'both',numberOfMonths:local__number_of_months,stepMonths:1,// prevText : '&laquo;',
394 // nextText : '&raquo;',
395 prevText:'&lsaquo;',nextText:'&rsaquo;',dateFormat:'dd.mm.yy',changeMonth:false,changeYear:false,minDate:local__min_date,maxDate:local__max_date,// '1Y',
396 // minDate: new Date(2020, 2, 1), maxDate: new Date(2020, 9, 31), // Ability to set any start and end date in calendar
397 showStatus:false,multiSeparator:', ',closeAtTop:false,firstDay:local__start_weekday,gotoCurrent:false,hideIfNoPrevNext:true,multiSelect:local__multi_days_select_num,rangeSelect:local__is_range_select,// showWeeks: true,
398 useThemeRoller:false});// -----------------------------------------------------------------------------------------------------------------
399 // Clear today date highlighting
400 // -----------------------------------------------------------------------------------------------------------------
401 setTimeout(function(){wpbc_calendars__clear_days_highlighting(resource_id);},500);// FixIn: 7.1.2.8.
402 // -----------------------------------------------------------------------------------------------------------------
403 // Scroll calendar to specific month
404 // -----------------------------------------------------------------------------------------------------------------
405 var start_bk_month=_wpbc.calendar__get_param_value(resource_id,'calendar_scroll_to');if(false!==start_bk_month){wpbc_calendar__scroll_to(resource_id,start_bk_month[0],start_bk_month[1]);}}/**
406 * Get booking statuses as array from the structured summary field, with fallback to the legacy string field.
407 *
408 * @param date_bookings_obj
409 * @returns {[]}
410 */function wpbc_get_booking_statuses__as_arr(date_bookings_obj){if(!date_bookings_obj||'undefined'===typeof date_bookings_obj['summary']){return[];}if(Array.isArray(date_bookings_obj['summary']['status_for_bookings_arr'])){return date_bookings_obj['summary']['status_for_bookings_arr'].filter(function(booking_status){return''!==booking_status;});}if(!date_bookings_obj['summary']['status_for_bookings']){return[];}return date_bookings_obj['summary']['status_for_bookings'].toString().trim().split(/\s+/).filter(function(booking_status){return''!==booking_status;});}/**
411 * Check exact booking status in statuses array.
412 *
413 * @param {[]} booking_statuses_arr
414 * @param {string} booking_status
415 * @returns {boolean}
416 */function wpbc_booking_statuses__has(booking_statuses_arr,booking_status){return booking_statuses_arr.indexOf(booking_status)>-1;}/**
417 * Check booking status part, e.g. "pending" in "approved_pending".
418 *
419 * @param {[]} booking_statuses_arr
420 * @param {string} booking_status_part
421 * @returns {boolean}
422 */function wpbc_booking_statuses__has_part(booking_statuses_arr,booking_status_part){for(var i=0;i<booking_statuses_arr.length;i++){if(booking_statuses_arr[i].split('_').indexOf(booking_status_part)>-1){return true;}}return false;}/**
423 * Apply CSS to calendar date cells
424 *
425 * @param date - JavaScript Date Obj: Mon Dec 11 2023 00:00:00
426 * GMT+0200 (Eastern European Standard Time)
427 * @param calendar_params_arr - Calendar Settings Object: {
428 * "resource_id": 4
429 * }
430 * @param datepick_this - this of datepick Obj
431 * @returns {(*|string)[]|(boolean|string)[]} - [ {true -available | false - unavailable}, 'CSS classes for
432 * calendar day cell' ]
433 */function wpbc__calendar__apply_css_to_days(date,calendar_params_arr,datepick_this){var today_date=new Date(_wpbc.get_other_param('today_arr')[0],parseInt(_wpbc.get_other_param('today_arr')[1])-1,_wpbc.get_other_param('today_arr')[2],0,0,0);// Today JS_Date_Obj.
434 var class_day=wpbc__get__td_class_date(date);// '1-9-2023'
435 var sql_class_day=wpbc__get__sql_class_date(date);// '2023-01-09'
436 var resource_id='undefined'!==typeof calendar_params_arr['resource_id']?calendar_params_arr['resource_id']:'1';// '1'
437 // Get Selected dates in calendar
438 var selected_dates_sql=wpbc_get__selected_dates_sql__as_arr(resource_id);// Get Data --------------------------------------------------------------------------------------------------------
439 var date_bookings_obj=_wpbc.bookings_in_calendar__get_for_date(resource_id,sql_class_day);// Array with CSS classes for date ---------------------------------------------------------------------------------
440 var css_classes__for_date=[];css_classes__for_date.push('sql_date_'+sql_class_day);// 'sql_date_2023-07-21'
441 css_classes__for_date.push('cal4date-'+class_day);// 'cal4date-7-21-2023'
442 css_classes__for_date.push('wpbc_weekday_'+date.getDay());// 'wpbc_weekday_4'
443 // Define Selected Check In/Out dates in TD -----------------------------------------------------------------------
444 if(selected_dates_sql.length//&& ( selected_dates_sql[ 0 ] !== selected_dates_sql[ (selected_dates_sql.length - 1) ] )
445 ){if(sql_class_day===selected_dates_sql[0]){css_classes__for_date.push('selected_check_in');css_classes__for_date.push('selected_check_in_out');}if(selected_dates_sql.length>1&&sql_class_day===selected_dates_sql[selected_dates_sql.length-1]){css_classes__for_date.push('selected_check_out');css_classes__for_date.push('selected_check_in_out');}}var is_day_selectable=false;// If something not defined, then this date closed --------------------------------------------------------------- // FixIn: 10.12.4.6.
446 if(false===date_bookings_obj||'undefined'===typeof date_bookings_obj[resource_id]){css_classes__for_date.push('date_user_unavailable');return[is_day_selectable,css_classes__for_date.join(' ')];}// -----------------------------------------------------------------------------------------------------------------
447 // date_bookings_obj - Defined. Dates can be selectable.
448 // -----------------------------------------------------------------------------------------------------------------
449 var booking_statuses_arr=wpbc_get_booking_statuses__as_arr(date_bookings_obj);// -----------------------------------------------------------------------------------------------------------------
450 // Add season names to the day CSS classes -- it is required for correct work of conditional fields --------------
451 var season_names_arr=_wpbc.seasons__get_for_date(resource_id,sql_class_day);for(var season_key in season_names_arr){css_classes__for_date.push(season_names_arr[season_key]);// 'wpdevbk_season_september_2023'
452 }// -----------------------------------------------------------------------------------------------------------------
453 // Cost Rate -------------------------------------------------------------------------------------------------------
454 css_classes__for_date.push('rate_'+date_bookings_obj[resource_id]['date_cost_rate'].toString().replace(/[\.\s]/g,'_'));// 'rate_99_00' -> 99.00
455 if(parseInt(date_bookings_obj['day_availability'])>0){is_day_selectable=true;css_classes__for_date.push('date_available');css_classes__for_date.push('reserved_days_count'+parseInt(date_bookings_obj['max_capacity']-date_bookings_obj['day_availability']));}else{is_day_selectable=false;css_classes__for_date.push('date_user_unavailable');}switch(date_bookings_obj['summary']['status_for_day']){case'available':break;case'time_slots_booking':css_classes__for_date.push('timespartly','times_clock');break;case'full_day_booking':css_classes__for_date.push('full_day_booking');break;case'season_filter':css_classes__for_date.push('date_user_unavailable','season_unavailable');date_bookings_obj['summary']['status_for_bookings']='';// Reset booking status color for possible old bookings on this date
456 date_bookings_obj['summary']['status_for_bookings_arr']=[];booking_statuses_arr=[];break;case'resource_availability':css_classes__for_date.push('date_user_unavailable','resource_unavailable');date_bookings_obj['summary']['status_for_bookings']='';// Reset booking status color for possible old bookings on this date
457 date_bookings_obj['summary']['status_for_bookings_arr']=[];booking_statuses_arr=[];break;case'weekday_unavailable':css_classes__for_date.push('date_user_unavailable','weekday_unavailable');date_bookings_obj['summary']['status_for_bookings']='';// Reset booking status color for possible old bookings on this date
458 date_bookings_obj['summary']['status_for_bookings_arr']=[];booking_statuses_arr=[];break;case'from_today_unavailable':css_classes__for_date.push('date_user_unavailable','from_today_unavailable');date_bookings_obj['summary']['status_for_bookings']='';// Reset booking status color for possible old bookings on this date
459 date_bookings_obj['summary']['status_for_bookings_arr']=[];booking_statuses_arr=[];break;case'limit_available_from_today':css_classes__for_date.push('date_user_unavailable','limit_available_from_today');date_bookings_obj['summary']['status_for_bookings']='';// Reset booking status color for possible old bookings on this date
460 date_bookings_obj['summary']['status_for_bookings_arr']=[];booking_statuses_arr=[];break;case'change_over':/*
461 *
462 // check_out_time_date2approve check_in_time_date2approve
463 // check_out_time_date2approve check_in_time_date_approved
464 // check_in_time_date2approve check_out_time_date_approved
465 // check_out_time_date_approved check_in_time_date_approved
466 */css_classes__for_date.push('timespartly','check_in_time','check_out_time');// FixIn: 10.0.0.2.
467 if(wpbc_booking_statuses__has(booking_statuses_arr,'approved_pending')){css_classes__for_date.push('check_out_time_date_approved','check_in_time_date2approve');}if(wpbc_booking_statuses__has(booking_statuses_arr,'pending_approved')){css_classes__for_date.push('check_out_time_date2approve','check_in_time_date_approved');}break;case'check_in':css_classes__for_date.push('timespartly','check_in_time');// FixIn: 9.9.0.33.
468 if(wpbc_booking_statuses__has_part(booking_statuses_arr,'pending')){css_classes__for_date.push('check_in_time_date2approve');}else if(wpbc_booking_statuses__has_part(booking_statuses_arr,'approved')){css_classes__for_date.push('check_in_time_date_approved');}break;case'check_out':css_classes__for_date.push('timespartly','check_out_time');// FixIn: 9.9.0.33.
469 if(wpbc_booking_statuses__has_part(booking_statuses_arr,'pending')){css_classes__for_date.push('check_out_time_date2approve');}else if(wpbc_booking_statuses__has_part(booking_statuses_arr,'approved')){css_classes__for_date.push('check_out_time_date_approved');}break;default:// mixed statuses: 'change_over check_out' .... variations.... check more in function wpbc_get_availability_per_days_arr()
470 date_bookings_obj['summary']['status_for_day']='available';}if('available'!=date_bookings_obj['summary']['status_for_day']){var is_set_pending_days_selectable=_wpbc.calendar__get_param_value(resource_id,'pending_days_selectable');// set pending days selectable // FixIn: 8.6.1.18.
471 if(wpbc_booking_statuses__has(booking_statuses_arr,'pending')){css_classes__for_date.push('date2approve');is_day_selectable=is_day_selectable?true:is_set_pending_days_selectable;}if(wpbc_booking_statuses__has(booking_statuses_arr,'approved')){css_classes__for_date.push('date_approved');}if(wpbc_booking_statuses__has(booking_statuses_arr,'pending_pending')){css_classes__for_date.push('check_out_time_date2approve','check_in_time_date2approve');is_day_selectable=is_day_selectable?true:is_set_pending_days_selectable;}if(wpbc_booking_statuses__has(booking_statuses_arr,'pending_approved')){css_classes__for_date.push('check_out_time_date2approve','check_in_time_date_approved');is_day_selectable=is_day_selectable?true:is_set_pending_days_selectable;}if(wpbc_booking_statuses__has(booking_statuses_arr,'approved_pending')){css_classes__for_date.push('check_out_time_date_approved','check_in_time_date2approve');is_day_selectable=is_day_selectable?true:is_set_pending_days_selectable;}if(wpbc_booking_statuses__has(booking_statuses_arr,'approved_approved')){css_classes__for_date.push('check_out_time_date_approved','check_in_time_date_approved');}}return[is_day_selectable,css_classes__for_date.join(' ')];}/**
472 * Mouseover calendar date cells
473 *
474 * @param string_date
475 * @param date - JavaScript Date Obj: Mon Dec 11 2023 00:00:00
476 * GMT+0200 (Eastern European Standard Time)
477 * @param calendar_params_arr - Calendar Settings Object: {
478 * "resource_id": 4
479 * }
480 * @param datepick_this - this of datepick Obj
481 * @returns {boolean}
482 */function wpbc__calendar__on_hover_days(string_date,date,calendar_params_arr,datepick_this){if(null===date){wpbc_calendars__clear_days_highlighting('undefined'!==typeof calendar_params_arr['resource_id']?calendar_params_arr['resource_id']:'1');// FixIn: 10.5.2.4.
483 return false;}var class_day=wpbc__get__td_class_date(date);// '1-9-2023'
484 var sql_class_day=wpbc__get__sql_class_date(date);// '2023-01-09'
485 var resource_id='undefined'!==typeof calendar_params_arr['resource_id']?calendar_params_arr['resource_id']:'1';// '1'
486 // Get Data --------------------------------------------------------------------------------------------------------
487 var date_booking_obj=_wpbc.bookings_in_calendar__get_for_date(resource_id,sql_class_day);// {...}
488 if(!date_booking_obj){return false;}// T o o l t i p s -------------------------------------------------------------------------------------------------
489 var tooltip_text='';if(date_booking_obj['summary']['tooltip_availability'].length>0){tooltip_text+=date_booking_obj['summary']['tooltip_availability'];}if(date_booking_obj['summary']['tooltip_day_cost'].length>0){tooltip_text+=date_booking_obj['summary']['tooltip_day_cost'];}if(date_booking_obj['summary']['tooltip_times'].length>0){tooltip_text+=date_booking_obj['summary']['tooltip_times'];}if(date_booking_obj['summary']['tooltip_booking_details'].length>0){tooltip_text+=date_booking_obj['summary']['tooltip_booking_details'];}wpbc_set_tooltip___for__calendar_date(tooltip_text,resource_id,class_day);// U n h o v e r i n g in UNSELECTABLE_CALENDAR ------------------------------------------------------------
490 var is_unselectable_calendar=jQuery('#calendar_booking_unselectable'+resource_id).length>0;// FixIn: 8.0.1.2.
491 var is_booking_form_exist=jQuery('#booking_form_div'+resource_id).length>0;var is_add_booking_modal_calendar=jQuery('#calendar_booking'+resource_id).closest('#wpbc_modal__add_booking__section').length>0;if(is_unselectable_calendar&&!is_booking_form_exist){/**
492 * Un Hover all dates in calendar (without the booking form), if only Availability Calendar here and we do
493 * not insert Booking form by mistake.
494 */wpbc_calendars__clear_days_highlighting(resource_id);// Clear days highlighting
495 var css_of_calendar='.wpbc_only_calendar #calendar_booking'+resource_id;jQuery(css_of_calendar+' .datepick-days-cell, '+css_of_calendar+' .datepick-days-cell a').css('cursor','default');// Set cursor to Default
496 return false;}// D a y s H o v e r i n g ------------------------------------------------------------------------------------
497 if(location.href.indexOf('page=wpbc')==-1||location.href.indexOf('page=wpbc')>0&&location.href.indexOf('tab=add-booking')>0||is_add_booking_modal_calendar||location.href.indexOf('page=wpbc-setup')>0||location.href.indexOf('page=wpbc-availability')>0||location.href.indexOf('page=wpbc-settings')>0&&location.href.indexOf('&tab=form')>0){// The same as dates selection, but for days hovering
498 if('function'==typeof wpbc__calendar__do_days_highlight__bs){wpbc__calendar__do_days_highlight__bs(sql_class_day,date,resource_id);}}}/**
499 * Select calendar date cells
500 *
501 * @param date - JavaScript Date Obj: Mon Dec 11 2023 00:00:00
502 * GMT+0200 (Eastern European Standard Time)
503 * @param calendar_params_arr - Calendar Settings Object: {
504 * "resource_id": 4
505 * }
506 * @param datepick_this - this of datepick Obj
507 *
508 */function wpbc__calendar__on_select_days(date,calendar_params_arr,datepick_this){var resource_id='undefined'!==typeof calendar_params_arr['resource_id']?calendar_params_arr['resource_id']:'1';// '1'
509 // Set unselectable, if only Availability Calendar here (and we do not insert Booking form by mistake).
510 var is_unselectable_calendar=jQuery('#calendar_booking_unselectable'+resource_id).length>0;// FixIn: 8.0.1.2.
511 var is_booking_form_exist=jQuery('#booking_form_div'+resource_id).length>0;if(is_unselectable_calendar&&!is_booking_form_exist){wpbc_calendar__unselect_all_dates(resource_id);// Unselect Dates
512 jQuery('.wpbc_only_calendar .popover_calendar_hover').remove();// Hide all opened popovers
513 return false;}jQuery('#date_booking'+resource_id).val(date);// Add selected dates to hidden textarea
514 if('function'===typeof wpbc__calendar__do_days_select__bs){wpbc__calendar__do_days_select__bs(date,resource_id);}wpbc_disable_time_fields_in_booking_form(resource_id);// Hook -- trigger day selection -----------------------------------------------------------------------------------
515 var mouse_clicked_dates=date;// Can be: "05.10.2023 - 07.10.2023" | "10.10.2023 - 10.10.2023" |
516 var all_selected_dates_arr=wpbc_get__selected_dates_sql__as_arr(resource_id);// Can be: [ "2023-10-05", "2023-10-06", "2023-10-07", … ]
517 jQuery(".booking_form_div").trigger("date_selected",[resource_id,mouse_clicked_dates,all_selected_dates_arr]);}// Mark middle selected dates with 0.5 opacity // FixIn: 10.3.0.9.
518 jQuery(document).ready(function(){jQuery(".booking_form_div").on('date_selected',function(event,resource_id,date){if('fixed'===_wpbc.calendar__get_param_value(resource_id,'days_select_mode')||'dynamic'===_wpbc.calendar__get_param_value(resource_id,'days_select_mode')){var closed_timer=setTimeout(function(){var middle_days_opacity=_wpbc.get_other_param('calendars__days_selection__middle_days_opacity');jQuery('#calendar_booking'+resource_id+' .datepick-current-day').not(".selected_check_in_out").css('opacity',middle_days_opacity);},10);}});});/**
519 * -- T i m e F i e l d s start --------------------------------------------------------------------------
520 *//**
521 * Disable time slots in booking form depend on selected dates and booked dates/times
522 *
523 * @param resource_id
524 */function wpbc_disable_time_fields_in_booking_form(resource_id){/**
525 * 1. Get all time fields in the booking form as array of objects
526 * [
527 * { jquery_option: jQuery_Object {}
528 * name: 'rangetime2[]'
529 * times_as_seconds: [ 21600, 23400 ]
530 * value_option_24h: '06:00 - 06:30'
531 * }
532 * ...
533 * { jquery_option: jQuery_Object {}
534 * name: 'starttime2[]'
535 * times_as_seconds: [ 21600 ]
536 * value_option_24h: '06:00'
537 * }
538 * ]
539 */var time_fields_obj_arr=wpbc_get__time_fields__in_booking_form__as_arr(resource_id);// 2. Get all selected dates in SQL format like this [ "2023-08-23", "2023-08-24", "2023-08-25", ... ]
540 var selected_dates_arr=wpbc_get__selected_dates_sql__as_arr(resource_id);// 3. Get child booking resources or single booking resource that exist in dates
541 var child_resources_arr=wpbc_clone_obj(_wpbc.booking__get_param_value(resource_id,'resources_id_arr__in_dates'));var sql_date;var child_resource_id;var merged_seconds;var time_fields_obj;var is_intersect;var is_check_in;var today_time__real=new Date(_wpbc.get_other_param('time_local_arr')[0],parseInt(_wpbc.get_other_param('time_local_arr')[1])-1,_wpbc.get_other_param('time_local_arr')[2],_wpbc.get_other_param('time_local_arr')[3],_wpbc.get_other_param('time_local_arr')[4],0);var today_time__shift=new Date(_wpbc.get_other_param('today_arr')[0],parseInt(_wpbc.get_other_param('today_arr')[1])-1,_wpbc.get_other_param('today_arr')[2],_wpbc.get_other_param('today_arr')[3],_wpbc.get_other_param('today_arr')[4],0);// 4. Loop all time Fields options // FixIn: 10.3.0.2.
542 for(let field_key=0;field_key<time_fields_obj_arr.length;field_key++){time_fields_obj_arr[field_key].disabled=0;// By default, this time field is not disabled.
543 time_fields_obj=time_fields_obj_arr[field_key];// { times_as_seconds: [ 21600, 23400 ], value_option_24h: '06:00 - 06:30', name: 'rangetime2[]', jquery_option: jQuery_Object {}}
544 // Loop all selected dates.
545 for(var i=0;i<selected_dates_arr.length;i++){// Get Date: '2023-08-18'.
546 sql_date=selected_dates_arr[i];var is_time_in_past=wpbc_check_is_time_in_past(today_time__shift,sql_date,time_fields_obj);// Exception for 'End Time' field, when selected several dates. // FixIn: 10.14.1.5.
547 if('On'!==_wpbc.calendar__get_param_value(resource_id,'booking_recurrent_time')&&-1!==time_fields_obj.name.indexOf('endtime')&&selected_dates_arr.length>1){is_time_in_past=wpbc_check_is_time_in_past(today_time__shift,selected_dates_arr[selected_dates_arr.length-1],time_fields_obj);}if(is_time_in_past){// This time for selected date already in the past.
548 time_fields_obj_arr[field_key].disabled=1;break;// exist from Dates LOOP.
549 }// FixIn: 9.9.0.31.
550 if('Off'===_wpbc.calendar__get_param_value(resource_id,'booking_recurrent_time')&&selected_dates_arr.length>1){//TODO: skip some fields checking if it's start / end time for mulple dates selection mode.
551 //TODO: we need to fix situation for entimes, when user select several dates, and in start time booked 00:00 - 15:00 , but systsme block untill 15:00 the end time as well, which is wrong, because it 2 or 3 dates selection and end date can be fullu available
552 if(0==i&&time_fields_obj['name'].indexOf('endtime')>=0){break;}if(selected_dates_arr.length-1==i&&time_fields_obj['name'].indexOf('starttime')>=0){break;}}var how_many_resources_intersected=0;// Loop all resources ID
553 // for ( var res_key in child_resources_arr ){ // FixIn: 10.3.0.2.
554 if(null===child_resources_arr){child_resources_arr=[];}for(let res_key=0;res_key<child_resources_arr.length;res_key++){child_resource_id=child_resources_arr[res_key];// _wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[12].booked_time_slots.merged_seconds = [ "07:00:11 - 07:30:02", "10:00:11 - 00:00:00" ]
555 // _wpbc.bookings_in_calendar__get_for_date(2,'2023-08-21')[2].booked_time_slots.merged_seconds = [ [ 25211, 27002 ], [ 36011, 86400 ] ]
556 if(false!==_wpbc.bookings_in_calendar__get_for_date(resource_id,sql_date)){merged_seconds=_wpbc.bookings_in_calendar__get_for_date(resource_id,sql_date)[child_resource_id].booked_time_slots.merged_seconds;// [ [ 25211, 27002 ], [ 36011, 86400 ] ]
557 }else{merged_seconds=[];}if(time_fields_obj.times_as_seconds.length>1){is_intersect=wpbc_is_intersect__range_time_interval([[parseInt(time_fields_obj.times_as_seconds[0])+20,parseInt(time_fields_obj.times_as_seconds[1])-20]],merged_seconds);}else{is_check_in=-1!==time_fields_obj.name.indexOf('start');is_intersect=wpbc_is_intersect__one_time_interval(is_check_in?parseInt(time_fields_obj.times_as_seconds)+20:parseInt(time_fields_obj.times_as_seconds)-20,merged_seconds);}if(is_intersect){how_many_resources_intersected++;// Increase
558 }}if(child_resources_arr.length==how_many_resources_intersected){// All resources intersected, then it's means that this time-slot or time must be Disabled, and we can exist from selected_dates_arr LOOP
559 time_fields_obj_arr[field_key].disabled=1;break;// exist from Dates LOOP
560 }}}// 5. Now we can disable time slot in HTML by using ( field.disabled == 1 ) property
561 wpbc__html__time_field_options__set_disabled(time_fields_obj_arr);jQuery(".booking_form_div").trigger('wpbc_hook_timeslots_disabled',[resource_id,selected_dates_arr]);// Trigger hook on disabling timeslots. Usage: jQuery( ".booking_form_div" ).on( 'wpbc_hook_timeslots_disabled', function ( event, bk_type, all_dates ){ ... } ); // FixIn: 8.7.11.9.
562 }/**
563 * Check if specific time(-slot) already in the past for selected date
564 *
565 * @param js_current_time_to_check - JS Date
566 * @param sql_date - '2025-01-26'
567 * @param time_fields_obj - Object
568 * @returns {boolean}
569 */function wpbc_check_is_time_in_past(js_current_time_to_check,sql_date,time_fields_obj){// FixIn: 10.9.6.4
570 var sql_date_arr=sql_date.split('-');var sql_date__midnight=new Date(parseInt(sql_date_arr[0]),parseInt(sql_date_arr[1])-1,parseInt(sql_date_arr[2]),0,0,0);var sql_date__midnight_miliseconds=sql_date__midnight.getTime();var is_intersect=false;if(time_fields_obj.times_as_seconds.length>1){if(js_current_time_to_check.getTime()>sql_date__midnight_miliseconds+(parseInt(time_fields_obj.times_as_seconds[0])+20)*1000){is_intersect=true;}if(js_current_time_to_check.getTime()>sql_date__midnight_miliseconds+(parseInt(time_fields_obj.times_as_seconds[1])-20)*1000){is_intersect=true;}}else{var is_check_in=-1!==time_fields_obj.name.indexOf('start');var times_as_seconds_check=is_check_in?parseInt(time_fields_obj.times_as_seconds)+20:parseInt(time_fields_obj.times_as_seconds)-20;times_as_seconds_check=sql_date__midnight_miliseconds+times_as_seconds_check*1000;if(js_current_time_to_check.getTime()>times_as_seconds_check){is_intersect=true;}}return is_intersect;}/**
571 * Is number inside /intersect of array of intervals ?
572 *
573 * @param time_A - 25800
574 * @param time_interval_B - [ [ 25211, 27002 ], [ 36011, 86400 ] ]
575 * @returns {boolean}
576 */function wpbc_is_intersect__one_time_interval(time_A,time_interval_B){for(var j=0;j<time_interval_B.length;j++){if(parseInt(time_A)>parseInt(time_interval_B[j][0])&&parseInt(time_A)<parseInt(time_interval_B[j][1])){return true;}// if ( ( parseInt( time_A ) == parseInt( time_interval_B[ j ][ 0 ] ) ) || ( parseInt( time_A ) == parseInt( time_interval_B[ j ][ 1 ] ) ) ) {
577 // // Time A just at the border of interval
578 // }
579 }return false;}/**
580 * Is these array of intervals intersected ?
581 *
582 * @param time_interval_A - [ [ 21600, 23400 ] ]
583 * @param time_interval_B - [ [ 25211, 27002 ], [ 36011, 86400 ] ]
584 * @returns {boolean}
585 */function wpbc_is_intersect__range_time_interval(time_interval_A,time_interval_B){var is_intersect;for(var i=0;i<time_interval_A.length;i++){for(var j=0;j<time_interval_B.length;j++){is_intersect=wpbc_intervals__is_intersected(time_interval_A[i],time_interval_B[j]);if(is_intersect){return true;}}}return false;}/**
586 * Get all time fields in the booking form as array of objects
587 *
588 * @param resource_id
589 * @returns []
590 *
591 * Example:
592 * [
593 * {
594 * value_option_24h: '06:00 - 06:30'
595 * times_as_seconds: [ 21600, 23400 ]
596 * jquery_option: jQuery_Object {}
597 * name: 'rangetime2[]'
598 * }
599 * ...
600 * {
601 * value_option_24h: '06:00'
602 * times_as_seconds: [ 21600 ]
603 * jquery_option: jQuery_Object {}
604 * name: 'starttime2[]'
605 * }
606 * ]
607 */function wpbc_get__time_fields__in_booking_form__as_arr(resource_id){/**
608 * Fields with [] like this select[name="rangetime1[]"]
609 * it's when we have 'multiple' in shortcode: [select* rangetime multiple "06:00 - 06:30" ... ]
610 */var time_fields_arr=['select[name="rangetime'+resource_id+'"]','select[name="rangetime'+resource_id+'[]"]','select[name="starttime'+resource_id+'"]','select[name="starttime'+resource_id+'[]"]','select[name="endtime'+resource_id+'"]','select[name="endtime'+resource_id+'[]"]'];var time_fields_obj_arr=[];// Loop all Time Fields
611 for(var ctf=0;ctf<time_fields_arr.length;ctf++){var time_field=time_fields_arr[ctf];var time_option=jQuery(time_field+' option');// Loop all options in time field
612 for(var j=0;j<time_option.length;j++){var jquery_option=jQuery(time_field+' option:eq('+j+')');var value_option_seconds_arr=jquery_option.val().split('-');var times_as_seconds=[];// Get time as seconds
613 if(value_option_seconds_arr.length){// FixIn: 9.8.10.1.
614 for(let i=0;i<value_option_seconds_arr.length;i++){// FixIn: 10.0.0.56.
615 // value_option_seconds_arr[i] = '14:00 ' | ' 16:00' (if from 'rangetime') and '16:00' if (start/end time)
616 var start_end_times_arr=value_option_seconds_arr[i].trim().split(':');var time_in_seconds=parseInt(start_end_times_arr[0])*60*60+parseInt(start_end_times_arr[1])*60;times_as_seconds.push(time_in_seconds);}}time_fields_obj_arr.push({'name':jQuery(time_field).attr('name'),'value_option_24h':jquery_option.val(),'jquery_option':jquery_option,'times_as_seconds':times_as_seconds});}}return time_fields_obj_arr;}/**
617 * Disable HTML options and add booked CSS class
618 *
619 * @param time_fields_obj_arr - this value is from the func:
620 * wpbc_get__time_fields__in_booking_form__as_arr( resource_id )
621 * [
622 * { jquery_option: jQuery_Object {}
623 * name: 'rangetime2[]'
624 * times_as_seconds: [ 21600, 23400 ]
625 * value_option_24h: '06:00 - 06:30'
626 * disabled = 1
627 * }
628 * ...
629 * { jquery_option: jQuery_Object {}
630 * name: 'starttime2[]'
631 * times_as_seconds: [ 21600 ]
632 * value_option_24h: '06:00'
633 * disabled = 0
634 * }
635 * ]
636 *
637 */function wpbc__html__time_field_options__set_disabled(time_fields_obj_arr){var jquery_option;for(var i=0;i<time_fields_obj_arr.length;i++){var jquery_option=time_fields_obj_arr[i].jquery_option;if(1==time_fields_obj_arr[i].disabled){jquery_option.prop('disabled',true);// Make disable some options
638 jquery_option.addClass('booked');// Add "booked" CSS class
639 // if this booked element selected --> then deselect it
640 if(jquery_option.prop('selected')){jquery_option.prop('selected',false);jquery_option.parent().find('option:not([disabled]):first').prop('selected',true).trigger("change");}}else{jquery_option.prop('disabled',false);// Make active all times
641 jquery_option.removeClass('booked');// Remove class "booked"
642 }}}/**
643 * Check if this time_range | Time_Slot is Full Day booked
644 *
645 * @param timeslot_arr_in_seconds - [ 36011, 86400 ]
646 * @returns {boolean}
647 */function wpbc_is_this_timeslot__full_day_booked(timeslot_arr_in_seconds){if(timeslot_arr_in_seconds.length>1&&parseInt(timeslot_arr_in_seconds[0])<30&&parseInt(timeslot_arr_in_seconds[1])>24*60*60-30){return true;}return false;}// -----------------------------------------------------------------------------------------------------------------
648 /* == S e l e c t e d D a t e s / T i m e - F i e l d s ==
649 // ----------------------------------------------------------------------------------------------------------------- *//**
650 * Get all selected dates in SQL format like this [ "2023-08-23", "2023-08-24" , ... ]
651 *
652 * @param resource_id
653 * @returns {[]} [ "2023-08-23", "2023-08-24", "2023-08-25", "2023-08-26", "2023-08-27", "2023-08-28",
654 * "2023-08-29" ]
655 */function wpbc_get__selected_dates_sql__as_arr(resource_id){var selected_dates_arr=[];selected_dates_arr=jQuery('#date_booking'+resource_id).val().split(',');if(selected_dates_arr.length){// FixIn: 9.8.10.1.
656 for(let i=0;i<selected_dates_arr.length;i++){// FixIn: 10.0.0.56.
657 selected_dates_arr[i]=selected_dates_arr[i].trim();selected_dates_arr[i]=selected_dates_arr[i].split('.');if(selected_dates_arr[i].length>1){selected_dates_arr[i]=selected_dates_arr[i][2]+'-'+selected_dates_arr[i][1]+'-'+selected_dates_arr[i][0];}}}// Remove empty elements from an array
658 selected_dates_arr=selected_dates_arr.filter(function(n){return parseInt(n);});selected_dates_arr.sort();return selected_dates_arr;}/**
659 * Get all time fields in the booking form as array of objects
660 *
661 * @param resource_id
662 * @param is_only_selected_time
663 * @returns []
664 *
665 * Example:
666 * [
667 * {
668 * value_option_24h: '06:00 - 06:30'
669 * times_as_seconds: [ 21600, 23400 ]
670 * jquery_option: jQuery_Object {}
671 * name: 'rangetime2[]'
672 * }
673 * ...
674 * {
675 * value_option_24h: '06:00'
676 * times_as_seconds: [ 21600 ]
677 * jquery_option: jQuery_Object {}
678 * name: 'starttime2[]'
679 * }
680 * ]
681 */function wpbc_get__selected_time_fields__in_booking_form__as_arr(resource_id,is_only_selected_time=true){/**
682 * Fields with [] like this select[name="rangetime1[]"]
683 * it's when we have 'multiple' in shortcode: [select* rangetime multiple "06:00 - 06:30" ... ]
684 */var time_fields_arr=['select[name="rangetime'+resource_id+'"]','select[name="rangetime'+resource_id+'[]"]','select[name="starttime'+resource_id+'"]','select[name="starttime'+resource_id+'[]"]','select[name="endtime'+resource_id+'"]','select[name="endtime'+resource_id+'[]"]','select[name="durationtime'+resource_id+'"]','select[name="durationtime'+resource_id+'[]"]'];var time_fields_obj_arr=[];// Loop all Time Fields
685 for(var ctf=0;ctf<time_fields_arr.length;ctf++){var time_field=time_fields_arr[ctf];var time_option;if(is_only_selected_time){time_option=jQuery('#booking_form'+resource_id+' '+time_field+' option:selected');// Exclude conditional fields, because of using '#booking_form3 ...'
686 }else{time_option=jQuery('#booking_form'+resource_id+' '+time_field+' option');// All time fields
687 }// Loop all options in time field
688 for(var j=0;j<time_option.length;j++){var jquery_option=jQuery(time_option[j]);// Get only selected options //jQuery( time_field + ' option:eq(' + j + ')' );
689 var value_option_seconds_arr=jquery_option.val().split('-');var times_as_seconds=[];// Get time as seconds
690 if(value_option_seconds_arr.length){// FixIn: 9.8.10.1.
691 for(let i=0;i<value_option_seconds_arr.length;i++){// FixIn: 10.0.0.56.
692 // value_option_seconds_arr[i] = '14:00 ' | ' 16:00' (if from 'rangetime') and '16:00' if (start/end time)
693 var start_end_times_arr=value_option_seconds_arr[i].trim().split(':');var time_in_seconds=parseInt(start_end_times_arr[0])*60*60+parseInt(start_end_times_arr[1])*60;times_as_seconds.push(time_in_seconds);}}time_fields_obj_arr.push({'name':jQuery('#booking_form'+resource_id+' '+time_field).attr('name'),'value_option_24h':jquery_option.val(),'jquery_option':jquery_option,'times_as_seconds':times_as_seconds});}}// Text: [starttime] - [endtime] -----------------------------------------------------------------------------
694 var text_time_fields_arr=['input[name="starttime'+resource_id+'"]','input[name="endtime'+resource_id+'"]'];for(var tf=0;tf<text_time_fields_arr.length;tf++){var text_jquery=jQuery('#booking_form'+resource_id+' '+text_time_fields_arr[tf]);// Exclude conditional fields, because of using '#booking_form3 ...'
695 if(text_jquery.length>0){var time__h_m__arr=text_jquery.val().trim().split(':');// '14:00'
696 if(0==time__h_m__arr.length){continue;// Not entered time value in a field
697 }if(1==time__h_m__arr.length){if(''===time__h_m__arr[0]){continue;// Not entered time value in a field
698 }time__h_m__arr[1]=0;}var text_time_in_seconds=parseInt(time__h_m__arr[0])*60*60+parseInt(time__h_m__arr[1])*60;var text_times_as_seconds=[];text_times_as_seconds.push(text_time_in_seconds);time_fields_obj_arr.push({'name':text_jquery.attr('name'),'value_option_24h':text_jquery.val(),'jquery_option':text_jquery,'times_as_seconds':text_times_as_seconds});}}return time_fields_obj_arr;}// ---------------------------------------------------------------------------------------------------------------------
699 /* == S U P P O R T for C A L E N D A R ==
700 // --------------------------------------------------------------------------------------------------------------------- *//**
701 * Get Calendar datepick Instance.
702 *
703 * @param {int|string} resource_id
704 * @returns {*|null}
705 */function wpbc_calendar__get_inst(resource_id){if('undefined'===typeof resource_id){resource_id='1';}if(jQuery('#calendar_booking'+resource_id).length>0){try{var inst=jQuery.datepick._getInst(jQuery('#calendar_booking'+resource_id).get(0));return inst?inst:null;}catch(e){return null;}}return null;}/**
706 * Unselect all dates in calendar and visually update this calendar
707 *
708 * @param resource_id ID of booking resource
709 * @returns {boolean} true on success | false, if no such calendar
710 */function wpbc_calendar__unselect_all_dates(resource_id){if('undefined'===typeof resource_id){resource_id='1';}var inst=wpbc_calendar__get_inst(resource_id);if(null!==inst){// Unselect all dates and set properties of Datepick
711 jQuery('#date_booking'+resource_id).val('');//FixIn: 5.4.3
712 inst.stayOpen=false;inst.dates=[];jQuery.datepick._updateDatepick(inst);return true;}return false;}/**
713 * Clear days highlighting in All or specific Calendars
714 *
715 * @param resource_id - can be skiped to clear highlighting in all calendars
716 */function wpbc_calendars__clear_days_highlighting(resource_id){if('undefined'!==typeof resource_id){jQuery('#calendar_booking'+resource_id+' .datepick-days-cell-over').removeClass('datepick-days-cell-over');// Clear in specific calendar
717 }else{jQuery('.datepick-days-cell-over').removeClass('datepick-days-cell-over');// Clear in all calendars
718 }}/**
719 * Scroll to specific month in calendar
720 *
721 * @param resource_id ID of resource
722 * @param year - real year - 2023
723 * @param month - real month - 12
724 * @returns {boolean}
725 */function wpbc_calendar__scroll_to(resource_id,year,month){if('undefined'===typeof resource_id){resource_id='1';}var inst=wpbc_calendar__get_inst(resource_id);if(null!==inst){year=parseInt(year);month=parseInt(month)-1;// In JS date, month -1
726 inst.cursorDate=new Date();// In some cases, the setFullYear can set only Year, and not the Month and day // FixIn: 6.2.3.5.
727 inst.cursorDate.setFullYear(year,month,1);inst.cursorDate.setMonth(month);inst.cursorDate.setDate(1);inst.drawMonth=inst.cursorDate.getMonth();inst.drawYear=inst.cursorDate.getFullYear();jQuery.datepick._notifyChange(inst);jQuery.datepick._adjustInstDate(inst);jQuery.datepick._showDate(inst);jQuery.datepick._updateDatepick(inst);return true;}return false;}/**
728 * Is this date selectable in calendar (mainly it's means AVAILABLE date)
729 *
730 * @param {int|string} resource_id 1
731 * @param {string} sql_class_day '2023-08-11'
732 * @returns {boolean} true | false
733 */function wpbc_is_this_day_selectable(resource_id,sql_class_day){// Get Data --------------------------------------------------------------------------------------------------------
734 var date_bookings_obj=_wpbc.bookings_in_calendar__get_for_date(resource_id,sql_class_day);var is_day_selectable=parseInt(date_bookings_obj['day_availability'])>0;if(typeof date_bookings_obj['summary']==='undefined'){return is_day_selectable;}if('available'!=date_bookings_obj['summary']['status_for_day']){var is_set_pending_days_selectable=_wpbc.calendar__get_param_value(resource_id,'pending_days_selectable');// set pending days selectable // FixIn: 8.6.1.18.
735 var booking_statuses_arr=wpbc_get_booking_statuses__as_arr(date_bookings_obj);if(wpbc_booking_statuses__has(booking_statuses_arr,'pending')||wpbc_booking_statuses__has(booking_statuses_arr,'pending_pending')||wpbc_booking_statuses__has(booking_statuses_arr,'pending_approved')||wpbc_booking_statuses__has(booking_statuses_arr,'approved_pending')){is_day_selectable=is_day_selectable?true:is_set_pending_days_selectable;}}return is_day_selectable;}/**
736 * Is date to check IN array of selected dates
737 *
738 * @param {date}js_date_to_check - JS Date - simple JavaScript Date object
739 * @param {[]} js_dates_arr - [ JSDate, ... ] - array of JS dates
740 * @returns {boolean}
741 */function wpbc_is_this_day_among_selected_days(js_date_to_check,js_dates_arr){for(var date_index=0;date_index<js_dates_arr.length;date_index++){// FixIn: 8.4.5.16.
742 if(js_dates_arr[date_index].getFullYear()===js_date_to_check.getFullYear()&&js_dates_arr[date_index].getMonth()===js_date_to_check.getMonth()&&js_dates_arr[date_index].getDate()===js_date_to_check.getDate()){return true;}}return false;}/**
743 * Get SQL Class Date '2023-08-01' from JS Date
744 *
745 * @param date JS Date
746 * @returns {string} '2023-08-12'
747 */function wpbc__get__sql_class_date(date){var sql_class_day=date.getFullYear()+'-';sql_class_day+=date.getMonth()+1<10?'0':'';sql_class_day+=date.getMonth()+1+'-';sql_class_day+=date.getDate()<10?'0':'';sql_class_day+=date.getDate();return sql_class_day;}/**
748 * Get JS Date from the SQL date format '2024-05-14'
749 * @param sql_class_date
750 * @returns {Date}
751 */function wpbc__get__js_date(sql_class_date){var sql_class_date_arr=sql_class_date.split('-');var date_js=new Date();date_js.setFullYear(parseInt(sql_class_date_arr[0]),parseInt(sql_class_date_arr[1])-1,parseInt(sql_class_date_arr[2]));// year, month, date
752 // Without this time adjust Dates selection in Datepicker can not work!!!
753 date_js.setHours(0);date_js.setMinutes(0);date_js.setSeconds(0);date_js.setMilliseconds(0);return date_js;}/**
754 * Get TD Class Date '1-31-2023' from JS Date
755 *
756 * @param date JS Date
757 * @returns {string} '1-31-2023'
758 */function wpbc__get__td_class_date(date){var td_class_day=date.getMonth()+1+'-'+date.getDate()+'-'+date.getFullYear();// '1-9-2023'
759 return td_class_day;}/**
760 * Get date params from string date
761 *
762 * @param date string date like '31.5.2023'
763 * @param separator default '.' can be skipped.
764 * @returns { {date: number, month: number, year: number} }
765 */function wpbc__get__date_params__from_string_date(date,separator){separator='undefined'!==typeof separator?separator:'.';var date_arr=date.split(separator);var date_obj={'year':parseInt(date_arr[2]),'month':parseInt(date_arr[1])-1,'date':parseInt(date_arr[0])};return date_obj;// for = new Date( date_obj.year , date_obj.month , date_obj.date );
766 }/**
767 * Add Spin Loader to calendar
768 * @param resource_id
769 */function wpbc_calendar__loading__start(resource_id){if(!jQuery('#calendar_booking'+resource_id).next().hasClass('wpbc_spins_loader_wrapper')){jQuery('#calendar_booking'+resource_id).after('<div class="wpbc_spins_loader_wrapper"><div class="wpbc_spin_loader_one_new"></div></div>');}if(!jQuery('#calendar_booking'+resource_id).hasClass('wpbc_calendar_blur_small')){jQuery('#calendar_booking'+resource_id).addClass('wpbc_calendar_blur_small');}wpbc_calendar__blur__start(resource_id);}/**
770 * Remove Spin Loader to calendar
771 * @param resource_id
772 */function wpbc_calendar__loading__stop(resource_id){jQuery('#calendar_booking'+resource_id+' + .wpbc_spins_loader_wrapper').remove();jQuery('#calendar_booking'+resource_id).removeClass('wpbc_calendar_blur_small');wpbc_calendar__blur__stop(resource_id);}/**
773 * Add Blur to calendar
774 * @param resource_id
775 */function wpbc_calendar__blur__start(resource_id){if(!jQuery('#calendar_booking'+resource_id).hasClass('wpbc_calendar_blur')){jQuery('#calendar_booking'+resource_id).addClass('wpbc_calendar_blur');}}/**
776 * Remove Blur in calendar
777 * @param resource_id
778 */function wpbc_calendar__blur__stop(resource_id){jQuery('#calendar_booking'+resource_id).removeClass('wpbc_calendar_blur');}// .................................................................................................................
779 /* == Calendar Update - View ==
780 // ................................................................................................................. *//**
781 * Update look of calendar (safe).
782 *
783 * In Elementor preview the DOM can be re-rendered, so the calendar element may exist
784 * while the Datepick instance is missing. In that case try to (re)initialize.
785 *
786 * @param {int|string} resource_id
787 * @return {boolean} true if updated, false if not possible
788 */function wpbc_calendar__update_look(resource_id){var inst=wpbc_calendar__get_inst(resource_id);// If instance missing, try to re-init calendar once.
789 if(null===inst){var jq_cal=jQuery('#calendar_booking'+resource_id);if(jq_cal.length&&'function'===typeof wpbc_calendar_show){// Elementor sometimes leaves stale class without real instance.
790 if(jq_cal.hasClass('hasDatepick')){jq_cal.removeClass('hasDatepick');}// Try to init datepick markup now.
791 wpbc_calendar_show(resource_id);// Try again.
792 inst=wpbc_calendar__get_inst(resource_id);}}// Still no instance -> do not crash the whole ajax flow.
793 if(null===inst){return false;}jQuery.datepick._updateDatepick(inst);return true;}/**
794 * Update dynamically Number of Months in calendar
795 *
796 * @param resource_id int
797 * @param months_number int
798 */function wpbc_calendar__update_months_number(resource_id,months_number){var inst=wpbc_calendar__get_inst(resource_id);if(null!==inst){inst.settings['numberOfMonths']=months_number;//_wpbc.calendar__set_param_value( resource_id, 'calendar_number_of_months', months_number );
799 wpbc_calendar__update_look(resource_id);}}/**
800 * Show calendar in different Skin
801 *
802 * @param selected_skin_url
803 */function wpbc__calendar__change_skin(selected_skin_url){//console.log( 'SKIN SELECTION ::', selected_skin_url );
804 // Remove CSS skin
805 var stylesheet=document.getElementById('wpbc-calendar-skin-css');stylesheet.parentNode.removeChild(stylesheet);// Add new CSS skin
806 var headID=document.getElementsByTagName("head")[0];var cssNode=document.createElement('link');cssNode.type='text/css';cssNode.setAttribute("id","wpbc-calendar-skin-css");cssNode.rel='stylesheet';cssNode.media='screen';cssNode.href=selected_skin_url;//"http://beta/wp-content/plugins/booking/css/skins/green-01.css";
807 headID.appendChild(cssNode);}function wpbc__css__change_skin(selected_skin_url,stylesheet_id='wpbc-time_picker-skin-css'){// Remove CSS skin
808 var stylesheet=document.getElementById(stylesheet_id);stylesheet.parentNode.removeChild(stylesheet);// Add new CSS skin
809 var headID=document.getElementsByTagName("head")[0];var cssNode=document.createElement('link');cssNode.type='text/css';cssNode.setAttribute("id",stylesheet_id);cssNode.rel='stylesheet';cssNode.media='screen';cssNode.href=selected_skin_url;//"http://beta/wp-content/plugins/booking/css/skins/green-01.css";
810 headID.appendChild(cssNode);}// ---------------------------------------------------------------------------------------------------------------------
811 /* == S U P P O R T M A T H ==
812 // --------------------------------------------------------------------------------------------------------------------- *//**
813 * Merge several intersected intervals or return not intersected:
814 * [[1,3],[2,6],[8,10],[15,18]] -> [[1,6],[8,10],[15,18]]
815 *
816 * @param [] intervals [ [1,3],[2,4],[6,8],[9,10],[3,7] ]
817 * @returns [] [ [1,8],[9,10] ]
818 *
819 * Exmample: wpbc_intervals__merge_inersected( [ [1,3],[2,4],[6,8],[9,10],[3,7] ] );
820 */function wpbc_intervals__merge_inersected(intervals){if(!intervals||intervals.length===0){return[];}var merged=[];intervals.sort(function(a,b){return a[0]-b[0];});var mergedInterval=intervals[0];for(var i=1;i<intervals.length;i++){var interval=intervals[i];if(interval[0]<=mergedInterval[1]){mergedInterval[1]=Math.max(mergedInterval[1],interval[1]);}else{merged.push(mergedInterval);mergedInterval=interval;}}merged.push(mergedInterval);return merged;}/**
821 * Is 2 intervals intersected: [36011, 86392] <=> [1, 43192] => true ( intersected )
822 *
823 * Good explanation here
824 * https://stackoverflow.com/questions/3269434/whats-the-most-efficient-way-to-test-if-two-ranges-overlap
825 *
826 * @param interval_A - [ 36011, 86392 ]
827 * @param interval_B - [ 1, 43192 ]
828 *
829 * @return bool
830 */function wpbc_intervals__is_intersected(interval_A,interval_B){if(0==interval_A.length||0==interval_B.length){return false;}interval_A[0]=parseInt(interval_A[0]);interval_A[1]=parseInt(interval_A[1]);interval_B[0]=parseInt(interval_B[0]);interval_B[1]=parseInt(interval_B[1]);var is_intersected=Math.max(interval_A[0],interval_B[0])-Math.min(interval_A[1],interval_B[1]);// if ( 0 == is_intersected ) {
831 // // Such ranges going one after other, e.g.: [ 12, 15 ] and [ 15, 21 ]
832 // }
833 if(is_intersected<0){return true;// INTERSECTED
834 }return false;// Not intersected
835 }/**
836 * Get the closets ABS value of element in array to the current myValue
837 *
838 * @param myValue - int element to search closet 4
839 * @param myArray - array of elements where to search [5,8,1,7]
840 * @returns int 5
841 */function wpbc_get_abs_closest_value_in_arr(myValue,myArray){if(myArray.length==0){// If the array is empty -> return the myValue
842 return myValue;}var obj=myArray[0];var diff=Math.abs(myValue-obj);// Get distance between 1st element
843 var closetValue=myArray[0];// Save 1st element
844 for(var i=1;i<myArray.length;i++){obj=myArray[i];if(Math.abs(myValue-obj)<diff){// we found closer value -> save it
845 diff=Math.abs(myValue-obj);closetValue=obj;}}return closetValue;}// ---------------------------------------------------------------------------------------------------------------------
846 /* == T O O L T I P S ==
847 // --------------------------------------------------------------------------------------------------------------------- *//**
848 * Define tooltip to show, when mouse over Date in Calendar
849 *
850 * @param tooltip_text - Text to show 'Booked time: 12:00 - 13:00<br>Cost: $20.00'
851 * @param resource_id - ID of booking resource '1'
852 * @param td_class - SQL class '1-9-2023'
853 * @returns {boolean} - defined to show or not
854 */function wpbc_set_tooltip___for__calendar_date(tooltip_text,resource_id,td_class){//TODO: make escaping of text for quot symbols, and JS/HTML...
855 jQuery('#calendar_booking'+resource_id+' td.cal4date-'+td_class).attr('data-content',tooltip_text);var td_el=jQuery('#calendar_booking'+resource_id+' td.cal4date-'+td_class).get(0);// FixIn: 9.0.1.1.
856 if('undefined'!==typeof td_el&&undefined==td_el._tippy&&''!==tooltip_text){wpbc_tippy(td_el,{content(reference){var popover_content=reference.getAttribute('data-content');return'<div class="popover popover_tippy">'+'<div class="popover-content">'+popover_content+'</div>'+'</div>';},allowHTML:true,trigger:'mouseenter focus',interactive:false,hideOnClick:true,interactiveBorder:10,maxWidth:550,theme:'wpbc-tippy-times',placement:'top',delay:[400,0],// FixIn: 9.4.2.2.
857 //delay : [0, 9999999999], // Debuge tooltip
858 ignoreAttributes:true,touch:true,//['hold', 500], // 500ms delay // FixIn: 9.2.1.5.
859 appendTo:()=>document.body});return true;}return false;}// ---------------------------------------------------------------------------------------------------------------------
860 /* == Dates Functions ==
861 // --------------------------------------------------------------------------------------------------------------------- *//**
862 * Get number of dates between 2 JS Dates
863 *
864 * @param date1 JS Date
865 * @param date2 JS Date
866 * @returns {number}
867 */function wpbc_dates__days_between(date1,date2){// The number of milliseconds in one day
868 var ONE_DAY=1000*60*60*24;// Convert both dates to milliseconds
869 var date1_ms=date1.getTime();var date2_ms=date2.getTime();// Calculate the difference in milliseconds
870 var difference_ms=date1_ms-date2_ms;// Convert back to days and return
871 return Math.round(difference_ms/ONE_DAY);}/**
872 * Check if this array of dates is consecutive array of dates or not.
873 * e.g. ['2024-05-09','2024-05-19','2024-05-30'] -> false
874 * e.g. ['2024-05-09','2024-05-10','2024-05-11'] -> true
875 * @param sql_dates_arr array e.g.: ['2024-05-09','2024-05-19','2024-05-30']
876 * @returns {boolean}
877 */function wpbc_dates__is_consecutive_dates_arr_range(sql_dates_arr){// FixIn: 10.0.0.50.
878 if(sql_dates_arr.length>1){var previos_date=wpbc__get__js_date(sql_dates_arr[0]);var current_date;for(var i=1;i<sql_dates_arr.length;i++){current_date=wpbc__get__js_date(sql_dates_arr[i]);if(wpbc_dates__days_between(current_date,previos_date)!=1){return false;}previos_date=current_date;}}return true;}// ---------------------------------------------------------------------------------------------------------------------
879 /* == Auto Dates Selection ==
880 // --------------------------------------------------------------------------------------------------------------------- *//**
881 * == How to use ? ==
882 *
883 * For Dates selection, we need to use this logic! We need select the dates only after booking data loaded!
884 *
885 * Check example bellow.
886 *
887 * // Fire on all booking dates loaded
888 * jQuery( 'body' ).on( 'wpbc_calendar_ajx__loaded_data', function ( event, loaded_resource_id ){
889 *
890 * if ( loaded_resource_id == select_dates_in_calendar_id ){
891 * wpbc_auto_select_dates_in_calendar( select_dates_in_calendar_id, '2024-05-15', '2024-05-25' );
892 * }
893 * } );
894 *
895 *//**
896 * Try to Auto select dates in specific calendar by simulated clicks in datepicker
897 *
898 * @param resource_id 1
899 * @param check_in_ymd '2024-05-09' OR ['2024-05-09','2024-05-19','2024-05-20']
900 * @param check_out_ymd '2024-05-15' Optional
901 *
902 * @returns {number} number of selected dates
903 *
904 * Example 1: var num_selected_days = wpbc_auto_select_dates_in_calendar( 1, '2024-05-15',
905 * '2024-05-25' ); Example 2: var num_selected_days = wpbc_auto_select_dates_in_calendar( 1,
906 * ['2024-05-09','2024-05-19','2024-05-20'] );
907 */function wpbc_auto_select_dates_in_calendar(resource_id,check_in_ymd,check_out_ymd=''){// FixIn: 10.0.0.47.
908 console.log('WPBC_AUTO_SELECT_DATES_IN_CALENDAR( RESOURCE_ID, CHECK_IN_YMD, CHECK_OUT_YMD )',resource_id,check_in_ymd,check_out_ymd);if('2100-01-01'==check_in_ymd||'2100-01-01'==check_out_ymd||''==check_in_ymd&&''==check_out_ymd){return 0;}// -----------------------------------------------------------------------------------------------------------------
909 // If check_in_ymd = [ '2024-05-09','2024-05-19','2024-05-30' ] ARRAY of DATES // FixIn: 10.0.0.50.
910 // -----------------------------------------------------------------------------------------------------------------
911 var dates_to_select_arr=[];if(Array.isArray(check_in_ymd)){dates_to_select_arr=wpbc_clone_obj(check_in_ymd);// -------------------------------------------------------------------------------------------------------------
912 // Exceptions to set MULTIPLE DAYS mode
913 // -------------------------------------------------------------------------------------------------------------
914 // if dates as NOT CONSECUTIVE: ['2024-05-09','2024-05-19','2024-05-30'], -> set MULTIPLE DAYS mode
915 if(dates_to_select_arr.length>0&&''==check_out_ymd&&!wpbc_dates__is_consecutive_dates_arr_range(dates_to_select_arr)){wpbc_cal_days_select__multiple(resource_id);}// if multiple days to select, but enabled SINGLE day mode, -> set MULTIPLE DAYS mode
916 if(dates_to_select_arr.length>1&&''==check_out_ymd&&'single'===_wpbc.calendar__get_param_value(resource_id,'days_select_mode')){wpbc_cal_days_select__multiple(resource_id);}// -------------------------------------------------------------------------------------------------------------
917 check_in_ymd=dates_to_select_arr[0];if(''==check_out_ymd){check_out_ymd=dates_to_select_arr[dates_to_select_arr.length-1];}}// -----------------------------------------------------------------------------------------------------------------
918 if(''==check_in_ymd){check_in_ymd=check_out_ymd;}if(''==check_out_ymd){check_out_ymd=check_in_ymd;}if('undefined'===typeof resource_id){resource_id='1';}var inst=wpbc_calendar__get_inst(resource_id);if(null!==inst){// Unselect all dates and set properties of Datepick
919 jQuery('#date_booking'+resource_id).val('');//FixIn: 5.4.3
920 inst.stayOpen=false;inst.dates=[];var check_in_js=wpbc__get__js_date(check_in_ymd);var td_cell=wpbc_get_clicked_td(inst.id,check_in_js);// Is ome type of error, then select multiple days selection mode.
921 if(''===_wpbc.calendar__get_param_value(resource_id,'days_select_mode')){_wpbc.calendar__set_param_value(resource_id,'days_select_mode','multiple');}// ---------------------------------------------------------------------------------------------------------
922 // == DYNAMIC ==
923 if('dynamic'===_wpbc.calendar__get_param_value(resource_id,'days_select_mode')){// 1-st click
924 inst.stayOpen=false;jQuery.datepick._selectDay(td_cell,'#'+inst.id,check_in_js.getTime());if(0===inst.dates.length){return 0;// First click was unsuccessful, so we must not make other click
925 }// 2-nd click
926 var check_out_js=wpbc__get__js_date(check_out_ymd);var td_cell_out=wpbc_get_clicked_td(inst.id,check_out_js);inst.stayOpen=true;jQuery.datepick._selectDay(td_cell_out,'#'+inst.id,check_out_js.getTime());}// ---------------------------------------------------------------------------------------------------------
927 // == FIXED ==
928 if('fixed'===_wpbc.calendar__get_param_value(resource_id,'days_select_mode')){jQuery.datepick._selectDay(td_cell,'#'+inst.id,check_in_js.getTime());}// ---------------------------------------------------------------------------------------------------------
929 // == SINGLE ==
930 if('single'===_wpbc.calendar__get_param_value(resource_id,'days_select_mode')){//jQuery.datepick._restrictMinMax( inst, jQuery.datepick._determineDate( inst, check_in_js, null ) ); // Do we need to run this ? Please note, check_in_js must have time, min, sec defined to 0!
931 jQuery.datepick._selectDay(td_cell,'#'+inst.id,check_in_js.getTime());}// ---------------------------------------------------------------------------------------------------------
932 // == MULTIPLE ==
933 if('multiple'===_wpbc.calendar__get_param_value(resource_id,'days_select_mode')){var dates_arr;if(dates_to_select_arr.length>0){// Situation, when we have dates array: ['2024-05-09','2024-05-19','2024-05-30']. and not the Check In / Check out dates as parameter in this function
934 dates_arr=wpbc_get_selection_dates_js_str_arr__from_arr(dates_to_select_arr);}else{dates_arr=wpbc_get_selection_dates_js_str_arr__from_check_in_out(check_in_ymd,check_out_ymd,inst);}if(0===dates_arr.dates_js.length){return 0;}// For Calendar Days selection
935 for(var j=0;j<dates_arr.dates_js.length;j++){// Loop array of dates
936 var str_date=wpbc__get__sql_class_date(dates_arr.dates_js[j]);// Date unavailable !
937 if(0==_wpbc.bookings_in_calendar__get_for_date(resource_id,str_date).day_availability){return 0;}if(dates_arr.dates_js[j]!=-1){inst.dates.push(dates_arr.dates_js[j]);}}var check_out_date=dates_arr.dates_js[dates_arr.dates_js.length-1];inst.dates.push(check_out_date);// Need add one additional SAME date for correct works of dates selection !!!!!
938 var checkout_timestamp=check_out_date.getTime();var td_cell=wpbc_get_clicked_td(inst.id,check_out_date);jQuery.datepick._selectDay(td_cell,'#'+inst.id,checkout_timestamp);}if(0!==inst.dates.length){// Scroll to specific month, if we set dates in some future months
939 wpbc_calendar__scroll_to(resource_id,inst.dates[0].getFullYear(),inst.dates[0].getMonth()+1);}return inst.dates.length;}return 0;}/**
940 * Get HTML td element (where was click in calendar day cell)
941 *
942 * @param calendar_html_id 'calendar_booking1'
943 * @param date_js JS Date
944 * @returns {*|jQuery} Dom HTML td element
945 */function wpbc_get_clicked_td(calendar_html_id,date_js){var td_cell=jQuery('#'+calendar_html_id+' .sql_date_'+wpbc__get__sql_class_date(date_js)).get(0);return td_cell;}/**
946 * Get arrays of JS and SQL dates as dates array
947 *
948 * @param check_in_ymd '2024-05-15'
949 * @param check_out_ymd '2024-05-25'
950 * @param inst Datepick Inst. Use wpbc_calendar__get_inst( resource_id );
951 * @returns {{dates_js: *[], dates_str: *[]}}
952 */function wpbc_get_selection_dates_js_str_arr__from_check_in_out(check_in_ymd,check_out_ymd,inst){var original_array=[];var date;var bk_distinct_dates=[];var check_in_date=check_in_ymd.split('-');var check_out_date=check_out_ymd.split('-');date=new Date();date.setFullYear(check_in_date[0],check_in_date[1]-1,check_in_date[2]);// year, month, date
953 var original_check_in_date=date;original_array.push(jQuery.datepick._restrictMinMax(inst,jQuery.datepick._determineDate(inst,date,null)));//add date
954 if(!wpbc_in_array(bk_distinct_dates,check_in_date[2]+'.'+check_in_date[1]+'.'+check_in_date[0])){bk_distinct_dates.push(parseInt(check_in_date[2])+'.'+parseInt(check_in_date[1])+'.'+check_in_date[0]);}var date_out=new Date();date_out.setFullYear(check_out_date[0],check_out_date[1]-1,check_out_date[2]);// year, month, date
955 var original_check_out_date=date_out;var mewDate=new Date(original_check_in_date.getFullYear(),original_check_in_date.getMonth(),original_check_in_date.getDate());mewDate.setDate(original_check_in_date.getDate()+1);while(original_check_out_date>date&&original_check_in_date!=original_check_out_date){date=new Date(mewDate.getFullYear(),mewDate.getMonth(),mewDate.getDate());original_array.push(jQuery.datepick._restrictMinMax(inst,jQuery.datepick._determineDate(inst,date,null)));//add date
956 if(!wpbc_in_array(bk_distinct_dates,date.getDate()+'.'+parseInt(date.getMonth()+1)+'.'+date.getFullYear())){bk_distinct_dates.push(parseInt(date.getDate())+'.'+parseInt(date.getMonth()+1)+'.'+date.getFullYear());}mewDate=new Date(date.getFullYear(),date.getMonth(),date.getDate());mewDate.setDate(mewDate.getDate()+1);}original_array.pop();bk_distinct_dates.pop();return{'dates_js':original_array,'dates_str':bk_distinct_dates};}/**
957 * Get arrays of JS and SQL dates as dates array
958 *
959 * @param dates_to_select_arr = ['2024-05-09','2024-05-19','2024-05-30']
960 *
961 * @returns {{dates_js: *[], dates_str: *[]}}
962 */function wpbc_get_selection_dates_js_str_arr__from_arr(dates_to_select_arr){// FixIn: 10.0.0.50.
963 var original_array=[];var bk_distinct_dates=[];var one_date_str;for(var d=0;d<dates_to_select_arr.length;d++){original_array.push(wpbc__get__js_date(dates_to_select_arr[d]));one_date_str=dates_to_select_arr[d].split('-');if(!wpbc_in_array(bk_distinct_dates,one_date_str[2]+'.'+one_date_str[1]+'.'+one_date_str[0])){bk_distinct_dates.push(parseInt(one_date_str[2])+'.'+parseInt(one_date_str[1])+'.'+one_date_str[0]);}}return{'dates_js':original_array,'dates_str':original_array};}// =====================================================================================================================
964 /* == Auto Fill Fields / Auto Select Dates ==
965 // ===================================================================================================================== */jQuery(document).ready(function(){var url_params=new URLSearchParams(window.location.search);// Disable days selection in calendar, after redirection from the "Search results page, after search availability" // FixIn: 8.8.2.3.
966 if('On'!=_wpbc.get_other_param('is_enabled_booking_search_results_days_select')){if(url_params.has('wpbc_select_check_in')&&url_params.has('wpbc_select_check_out')&&url_params.has('wpbc_select_calendar_id')){var select_dates_in_calendar_id=parseInt(url_params.get('wpbc_select_calendar_id'));// Fire on all booking dates loaded
967 jQuery('body').on('wpbc_calendar_ajx__loaded_data',function(event,loaded_resource_id){if(loaded_resource_id==select_dates_in_calendar_id){wpbc_auto_select_dates_in_calendar(select_dates_in_calendar_id,url_params.get('wpbc_select_check_in'),url_params.get('wpbc_select_check_out'));}});}}if(url_params.has('wpbc_auto_fill')){var wpbc_auto_fill_value=url_params.get('wpbc_auto_fill');// Convert back. Some systems do not like symbol '~' in URL, so we need to replace to some other symbols
968 wpbc_auto_fill_value=wpbc_auto_fill_value.replaceAll('_^_','~');wpbc_auto_fill_booking_fields(wpbc_auto_fill_value);}});/**
969 * Autofill / select booking form fields by values from the GET request parameter: ?wpbc_auto_fill=
970 *
971 * @param auto_fill_str
972 */function wpbc_auto_fill_booking_fields(auto_fill_str){// FixIn: 10.0.0.48.
973 if(''==auto_fill_str){return;}// console.log( 'WPBC_AUTO_FILL_BOOKING_FIELDS( AUTO_FILL_STR )', auto_fill_str);
974 var fields_arr=wpbc_auto_fill_booking_fields__parse(auto_fill_str);for(let i=0;i<fields_arr.length;i++){jQuery('[name="'+fields_arr[i]['name']+'"]').val(fields_arr[i]['value']);}}/**
975 * Parse data from get parameter: ?wpbc_auto_fill=visitors231^2~max_capacity231^2
976 *
977 * @param data_str = 'visitors231^2~max_capacity231^2';
978 * @returns {*}
979 */function wpbc_auto_fill_booking_fields__parse(data_str){var filter_options_arr=[];var data_arr=data_str.split('~');for(var j=0;j<data_arr.length;j++){var my_form_field=data_arr[j].split('^');var filter_name='undefined'!==typeof my_form_field[0]?my_form_field[0]:'';var filter_value='undefined'!==typeof my_form_field[1]?my_form_field[1]:'';filter_options_arr.push({'name':filter_name,'value':filter_value});}return filter_options_arr;}/**
980 * Parse data from get parameter: ?search_get__custom_params=...
981 *
982 * @param data_str = 'text^search_field__display_check_in^23.05.2024~text^search_field__display_check_out^26.05.2024~selectbox-one^search_quantity^2~selectbox-one^location^Spain~selectbox-one^max_capacity^2~selectbox-one^amenity^parking~checkbox^search_field__extend_search_days^5~submit^^Search~hidden^search_get__check_in_ymd^2024-05-23~hidden^search_get__check_out_ymd^2024-05-26~hidden^search_get__time^~hidden^search_get__quantity^2~hidden^search_get__extend^5~hidden^search_get__users_id^~hidden^search_get__custom_params^~';
983 * @returns {*}
984 */function wpbc_auto_fill_search_fields__parse(data_str){var filter_options_arr=[];var data_arr=data_str.split('~');for(var j=0;j<data_arr.length;j++){var my_form_field=data_arr[j].split('^');var filter_type='undefined'!==typeof my_form_field[0]?my_form_field[0]:'';var filter_name='undefined'!==typeof my_form_field[1]?my_form_field[1]:'';var filter_value='undefined'!==typeof my_form_field[2]?my_form_field[2]:'';filter_options_arr.push({'type':filter_type,'name':filter_name,'value':filter_value});}return filter_options_arr;}// ---------------------------------------------------------------------------------------------------------------------
985 /* == Auto Update number of months in calendars ON screen size changed ==
986 // --------------------------------------------------------------------------------------------------------------------- *//**
987 * Auto Update Number of Months in Calendar, e.g.: if ( WINDOW_WIDTH <= 782px ) >>> MONTHS_NUMBER = 1
988 * ELSE: number of months defined in shortcode.
989 * @param resource_id int
990 *
991 */function wpbc_calendar__auto_update_months_number__on_resize(resource_id){if(true===_wpbc.get_other_param('is_allow_several_months_on_mobile')){return false;}var local__number_of_months=parseInt(_wpbc.calendar__get_param_value(resource_id,'calendar_number_of_months'));if(local__number_of_months>1){if(jQuery(window).width()<=782){wpbc_calendar__update_months_number(resource_id,1);}else{wpbc_calendar__update_months_number(resource_id,local__number_of_months);}}}/**
992 * Auto Update Number of Months in ALL Calendars
993 *
994 */function wpbc_calendars__auto_update_months_number(){var all_calendars_arr=_wpbc.calendars_all__get();// This LOOP "for in" is GOOD, because we check here keys 'calendar_' === calendar_id.slice( 0, 9 )
995 for(var calendar_id in all_calendars_arr){if('calendar_'===calendar_id.slice(0,9)){var resource_id=parseInt(calendar_id.slice(9));// 'calendar_3' -> 3
996 if(resource_id>0){wpbc_calendar__auto_update_months_number__on_resize(resource_id);}}}}/**
997 * If browser window changed, then update number of months.
998 */jQuery(window).on('resize',function(){wpbc_calendars__auto_update_months_number();});/**
999 * Auto update calendar number of months on initial page load
1000 */jQuery(document).ready(function(){var closed_timer=setTimeout(function(){wpbc_calendars__auto_update_months_number();},100);});// ---------------------------------------------------------------------------------------------------------------------
1001 /* == Check: calendar_dates_start: "2026-01-01", calendar_dates_end: "2026-12-31" == // FixIn: 10.13.1.4.
1002 // --------------------------------------------------------------------------------------------------------------------- *//**
1003 * Get Start JS Date of starting dates in calendar, from the _wpbc object.
1004 *
1005 * @param integer resource_id - resource ID, e.g.: 1.
1006 */function wpbc_calendar__get_dates_start(resource_id){return wpbc_calendar__get_date_parameter(resource_id,'calendar_dates_start');}/**
1007 * Get End JS Date of ending dates in calendar, from the _wpbc object.
1008 *
1009 * @param integer resource_id - resource ID, e.g.: 1.
1010 */function wpbc_calendar__get_dates_end(resource_id){return wpbc_calendar__get_date_parameter(resource_id,'calendar_dates_end');}/**
1011 * Get validates date parameter.
1012 *
1013 * @param resource_id - 1
1014 * @param parameter_str - 'calendar_dates_start' | 'calendar_dates_end' | ...
1015 */function wpbc_calendar__get_date_parameter(resource_id,parameter_str){var date_expected_ymd=_wpbc.calendar__get_param_value(resource_id,parameter_str);if(!date_expected_ymd){return false;// '' | 0 | null | undefined -> false.
1016 }if(-1!==date_expected_ymd.indexOf('-')){var date_expected_ymd_arr=date_expected_ymd.split('-');// '2025-07-26' -> ['2025', '07', '26']
1017 if(date_expected_ymd_arr.length>0){var year=date_expected_ymd_arr.length>0?parseInt(date_expected_ymd_arr[0]):new Date().getFullYear();// Year.
1018 var month=date_expected_ymd_arr.length>1?parseInt(date_expected_ymd_arr[1])-1:0;// (month - 1) or 0 - Jan.
1019 var day=date_expected_ymd_arr.length>2?parseInt(date_expected_ymd_arr[2]):1;// date or Otherwise 1st of month
1020 var date_js=new Date(year,month,day,0,0,0,0);return date_js;}}return false;// Fallback, if we not parsed this parameter 'calendar_dates_start' = '2025-07-26', for example because of 'calendar_dates_start' = 'sfsdf'.
1021 }/**
1022 * ====================================================================================================================
1023 * includes/__js/cal/days_select_custom.js
1024 * ====================================================================================================================
1025 */// FixIn: 9.8.9.2.
1026 /**
1027 * Re-Init Calendar and Re-Render it.
1028 *
1029 * @param resource_id
1030 */function wpbc_cal__re_init(resource_id){// Remove CLASS for ability to re-render and reinit calendar.
1031 jQuery('#calendar_booking'+resource_id).removeClass('hasDatepick');wpbc_calendar_show(resource_id);}/**
1032 * Re-Init previously saved days selection variables.
1033 *
1034 * @param resource_id
1035 */function wpbc_cal_days_select__re_init(resource_id){_wpbc.calendar__set_param_value(resource_id,'saved_variable___days_select_initial',{'dynamic__days_min':_wpbc.calendar__get_param_value(resource_id,'dynamic__days_min'),'dynamic__days_max':_wpbc.calendar__get_param_value(resource_id,'dynamic__days_max'),'dynamic__days_specific':_wpbc.calendar__get_param_value(resource_id,'dynamic__days_specific'),'dynamic__week_days__start':_wpbc.calendar__get_param_value(resource_id,'dynamic__week_days__start'),'fixed__days_num':_wpbc.calendar__get_param_value(resource_id,'fixed__days_num'),'fixed__week_days__start':_wpbc.calendar__get_param_value(resource_id,'fixed__week_days__start')});}// ---------------------------------------------------------------------------------------------------------------------
1036 /**
1037 * Set Single Day selection - after page load
1038 *
1039 * @param resource_id ID of booking resource
1040 */function wpbc_cal_ready_days_select__single(resource_id){// Re-define selection, only after page loaded with all init vars
1041 jQuery(document).ready(function(){// Wait 1 second, just to be sure, that all init vars defined
1042 setTimeout(function(){wpbc_cal_days_select__single(resource_id);},1000);});}/**
1043 * Set Single Day selection
1044 * Can be run at any time, when calendar defined - useful for console run.
1045 *
1046 * @param resource_id ID of booking resource
1047 */function wpbc_cal_days_select__single(resource_id){_wpbc.calendar__set_parameters(resource_id,{'days_select_mode':'single'});wpbc_cal_days_select__re_init(resource_id);wpbc_cal__re_init(resource_id);}// ---------------------------------------------------------------------------------------------------------------------
1048 /**
1049 * Set Multiple Days selection - after page load
1050 *
1051 * @param resource_id ID of booking resource
1052 */function wpbc_cal_ready_days_select__multiple(resource_id){// Re-define selection, only after page loaded with all init vars
1053 jQuery(document).ready(function(){// Wait 1 second, just to be sure, that all init vars defined
1054 setTimeout(function(){wpbc_cal_days_select__multiple(resource_id);},1000);});}/**
1055 * Set Multiple Days selection
1056 * Can be run at any time, when calendar defined - useful for console run.
1057 *
1058 * @param resource_id ID of booking resource
1059 */function wpbc_cal_days_select__multiple(resource_id){_wpbc.calendar__set_parameters(resource_id,{'days_select_mode':'multiple'});wpbc_cal_days_select__re_init(resource_id);wpbc_cal__re_init(resource_id);}// ---------------------------------------------------------------------------------------------------------------------
1060 /**
1061 * Set Fixed Days selection with 1 mouse click - after page load
1062 *
1063 * @integer resource_id - 1 -- ID of booking resource (calendar) -
1064 * @integer days_number - 3 -- number of days to select -
1065 * @array week_days__start - [-1] | [ 1, 5] -- { -1 - Any | 0 - Su, 1 - Mo, 2 - Tu, 3 - We, 4 - Th, 5 - Fr, 6 - Sat }
1066 */function wpbc_cal_ready_days_select__fixed(resource_id,days_number,week_days__start=[-1]){// Re-define selection, only after page loaded with all init vars
1067 jQuery(document).ready(function(){// Wait 1 second, just to be sure, that all init vars defined
1068 setTimeout(function(){wpbc_cal_days_select__fixed(resource_id,days_number,week_days__start);},1000);});}/**
1069 * Set Fixed Days selection with 1 mouse click
1070 * Can be run at any time, when calendar defined - useful for console run.
1071 *
1072 * @integer resource_id - 1 -- ID of booking resource (calendar) -
1073 * @integer days_number - 3 -- number of days to select -
1074 * @array week_days__start - [-1] | [ 1, 5] -- { -1 - Any | 0 - Su, 1 - Mo, 2 - Tu, 3 - We, 4 - Th, 5 - Fr, 6 - Sat }
1075 */function wpbc_cal_days_select__fixed(resource_id,days_number,week_days__start=[-1]){_wpbc.calendar__set_parameters(resource_id,{'days_select_mode':'fixed'});_wpbc.calendar__set_parameters(resource_id,{'fixed__days_num':parseInt(days_number)});// Number of days selection with 1 mouse click
1076 _wpbc.calendar__set_parameters(resource_id,{'fixed__week_days__start':week_days__start});// { -1 - Any | 0 - Su, 1 - Mo, 2 - Tu, 3 - We, 4 - Th, 5 - Fr, 6 - Sat }
1077 wpbc_cal_days_select__re_init(resource_id);wpbc_cal__re_init(resource_id);}// ---------------------------------------------------------------------------------------------------------------------
1078 /**
1079 * Set Range Days selection with 2 mouse clicks - after page load
1080 *
1081 * @integer resource_id - 1 -- ID of booking resource (calendar)
1082 * @integer days_min - 7 -- Min number of days to select
1083 * @integer days_max - 30 -- Max number of days to select
1084 * @array days_specific - [] | [7,14,21,28] -- Restriction for Specific number of days selection
1085 * @array week_days__start - [-1] | [ 1, 5] -- { -1 - Any | 0 - Su, 1 - Mo, 2 - Tu, 3 - We, 4 - Th, 5 - Fr, 6 - Sat }
1086 */function wpbc_cal_ready_days_select__range(resource_id,days_min,days_max,days_specific=[],week_days__start=[-1]){// Re-define selection, only after page loaded with all init vars
1087 jQuery(document).ready(function(){// Wait 1 second, just to be sure, that all init vars defined
1088 setTimeout(function(){wpbc_cal_days_select__range(resource_id,days_min,days_max,days_specific,week_days__start);},1000);});}/**
1089 * Set Range Days selection with 2 mouse clicks
1090 * Can be run at any time, when calendar defined - useful for console run.
1091 *
1092 * @integer resource_id - 1 -- ID of booking resource (calendar)
1093 * @integer days_min - 7 -- Min number of days to select
1094 * @integer days_max - 30 -- Max number of days to select
1095 * @array days_specific - [] | [7,14,21,28] -- Restriction for Specific number of days selection
1096 * @array week_days__start - [-1] | [ 1, 5] -- { -1 - Any | 0 - Su, 1 - Mo, 2 - Tu, 3 - We, 4 - Th, 5 - Fr, 6 - Sat }
1097 */function wpbc_cal_days_select__range(resource_id,days_min,days_max,days_specific=[],week_days__start=[-1]){_wpbc.calendar__set_parameters(resource_id,{'days_select_mode':'dynamic'});_wpbc.calendar__set_param_value(resource_id,'dynamic__days_min',parseInt(days_min));// Min. Number of days selection with 2 mouse clicks
1098 _wpbc.calendar__set_param_value(resource_id,'dynamic__days_max',parseInt(days_max));// Max. Number of days selection with 2 mouse clicks
1099 _wpbc.calendar__set_param_value(resource_id,'dynamic__days_specific',days_specific);// Example [5,7]
1100 _wpbc.calendar__set_param_value(resource_id,'dynamic__week_days__start',week_days__start);// { -1 - Any | 0 - Su, 1 - Mo, 2 - Tu, 3 - We, 4 - Th, 5 - Fr, 6 - Sat }
1101 wpbc_cal_days_select__re_init(resource_id);wpbc_cal__re_init(resource_id);}/**
1102 * ====================================================================================================================
1103 * includes/__js/cal_ajx_load/wpbc_cal_ajx.js
1104 * ====================================================================================================================
1105 */// ---------------------------------------------------------------------------------------------------------------------
1106 // A j a x L o a d C a l e n d a r D a t a
1107 // ---------------------------------------------------------------------------------------------------------------------
1108 function wpbc_calendar__load_data__ajx(params){// FixIn: 9.8.6.2.
1109 wpbc_calendar__loading__start(params['resource_id']);// Trigger event for calendar before loading Booking data, but after showing Calendar.
1110 if(jQuery('#calendar_booking'+params['resource_id']).length>0){var target_elm=jQuery('body').trigger("wpbc_calendar_ajx__before_loaded_data",[params['resource_id']]);//jQuery( 'body' ).on( 'wpbc_calendar_ajx__before_loaded_data', function( event, resource_id ) { ... } );
1111 }if(wpbc_balancer__is_wait(params,'wpbc_calendar__load_data__ajx')){return false;}// FixIn: 9.8.6.2.
1112 wpbc_calendar__blur__stop(params['resource_id']);// -----------------------------------------------------------------------------------------------------------------
1113 // == Get start / end dates from the Booking Calendar shortcode. ==
1114 // Example: [booking calendar_dates_start='2026-01-01' calendar_dates_end='2026-12-31' resource_id=1] // FixIn: 10.13.1.4.
1115 // -----------------------------------------------------------------------------------------------------------------
1116 if(false!==wpbc_calendar__get_dates_start(params['resource_id'])){if(!params['dates_to_check']){params['dates_to_check']=[];}var dates_start=wpbc_calendar__get_dates_start(params['resource_id']);// E.g. - local__min_date = new Date( 2025, 0, 1 );
1117 if(false!==dates_start){params['dates_to_check'][0]=wpbc__get__sql_class_date(dates_start);}}if(false!==wpbc_calendar__get_dates_end(params['resource_id'])){if(!params['dates_to_check']){params['dates_to_check']=[];}var dates_end=wpbc_calendar__get_dates_end(params['resource_id']);// E.g. - local__min_date = new Date( 2025, 0, 1 );
1118 if(false!==dates_end){params['dates_to_check'][1]=wpbc__get__sql_class_date(dates_end);if(!params['dates_to_check'][0]){params['dates_to_check'][0]=wpbc__get__sql_class_date(new Date());}}}// -----------------------------------------------------------------------------------------------------------------
1119 // console.groupEnd(); console.time('resource_id_' + params['resource_id']);
1120 console.groupCollapsed('WPBC_AJX_CALENDAR_LOAD');console.log(' == Before Ajax Send - calendars_all__get() == ',_wpbc.calendars_all__get());if('function'===typeof wpbc_hook__init_timeselector){wpbc_hook__init_timeselector();}// Start Ajax
1121 jQuery.post(wpbc_url_ajax,{action:'WPBC_AJX_CALENDAR_LOAD',wpbc_ajx_user_id:_wpbc.get_secure_param('user_id'),nonce:_wpbc.get_secure_param('nonce'),wpbc_ajx_locale:_wpbc.get_secure_param('locale'),calendar_request_params:params// Usually like: { 'resource_id': 1, 'max_days_count': 365 }
1122 },/**
1123 * S u c c e s s
1124 *
1125 * @param response_data - its object returned from Ajax - class-live-search.php
1126 * @param textStatus - 'success'
1127 * @param jqXHR - Object
1128 */function(response_data,textStatus,jqXHR){// console.timeEnd('resource_id_' + response_data['resource_id']);
1129 console.log(' == Response WPBC_AJX_CALENDAR_LOAD == ',response_data);console.groupEnd();// FixIn: 9.8.6.2.
1130 var ajx_post_data__resource_id=wpbc_get_resource_id__from_ajx_post_data_url(this.data);wpbc_balancer__completed(ajx_post_data__resource_id,'wpbc_calendar__load_data__ajx');// Probably Error
1131 if(typeof response_data!=='object'||response_data===null){var jq_node=wpbc_get_calendar__jq_node__for_messages(this.data);var message_type='info';if(''===response_data){response_data='The server responds with an empty string. The server probably stopped working unexpectedly. <br>Please check your <strong>error.log</strong> in your server configuration for relative errors.';message_type='warning';}// Show Message
1132 wpbc_front_end__show_message(response_data,{'type':message_type,'show_here':{'jq_node':jq_node,'where':'after'},'is_append':true,'style':'text-align:left;','delay':0});return;}// Show Calendar
1133 wpbc_calendar__loading__stop(response_data['resource_id']);// -------------------------------------------------------------------------------------------------
1134 // Bookings - Dates
1135 _wpbc.bookings_in_calendar__set_dates(response_data['resource_id'],response_data['ajx_data']['dates']);// Bookings - Child or only single booking resource in dates
1136 _wpbc.booking__set_param_value(response_data['resource_id'],'resources_id_arr__in_dates',response_data['ajx_data']['resources_id_arr__in_dates']);// Aggregate booking resources, if any ?
1137 _wpbc.booking__set_param_value(response_data['resource_id'],'aggregate_resource_id_arr',response_data['ajx_data']['aggregate_resource_id_arr']);// -------------------------------------------------------------------------------------------------
1138 // Update calendar
1139 wpbc_calendar__update_look(response_data['resource_id']);if('function'===typeof wpbc_hook__init_timeselector){wpbc_hook__init_timeselector();}if('undefined'!==typeof response_data['ajx_data']['ajx_after_action_message']&&''!=response_data['ajx_data']['ajx_after_action_message'].replace(/\n/g,"<br />")){var jq_node=wpbc_get_calendar__jq_node__for_messages(this.data);// Show Message
1140 wpbc_front_end__show_message(response_data['ajx_data']['ajx_after_action_message'].replace(/\n/g,"<br />"),{'type':'undefined'!==typeof response_data['ajx_data']['ajx_after_action_message_status']?response_data['ajx_data']['ajx_after_action_message_status']:'info','show_here':{'jq_node':jq_node,'where':'after'},'is_append':true,'style':'text-align:left;','delay':10000});}if('function'===typeof wpbc_update_capacity_hint){wpbc_update_capacity_hint(response_data['resource_id']);}// Trigger event that calendar has been // FixIn: 10.0.0.44. // FixIn: 10.14.17.2.
1141 if(jQuery('#calendar_booking'+response_data['resource_id']).length>0||jQuery('#date_booking'+response_data['resource_id']).length>0){var target_elm=jQuery('body').trigger("wpbc_calendar_ajx__loaded_data",[response_data['resource_id']]);//jQuery( 'body' ).on( 'wpbc_calendar_ajx__loaded_data', function( event, resource_id ) { ... } );
1142 }//jQuery( '#ajax_respond' ).html( response_data ); // For ability to show response, add such DIV element to page
1143 }).fail(function(jqXHR,textStatus,errorThrown){if(window.console&&window.console.log){console.log('Ajax_Error',jqXHR,textStatus,errorThrown);}var ajx_post_data__resource_id=wpbc_get_resource_id__from_ajx_post_data_url(this.data);wpbc_balancer__completed(ajx_post_data__resource_id,'wpbc_calendar__load_data__ajx');// Get Content of Error Message
1144 var error_message='<strong>'+'Error!'+'</strong> '+errorThrown;if(jqXHR.status){error_message+=' (<b>'+jqXHR.status+'</b>)';if(403==jqXHR.status){error_message+='<br> Probably nonce for this page has been expired. Please <a href="javascript:void(0)" onclick="javascript:location.reload();">reload the page</a>.';error_message+='<br> Otherwise, please check this <a style="font-weight: 600;" href="https://wpbookingcalendar.com/faq/request-do-not-pass-security-check/?after_update=10.1.1">troubleshooting instruction</a>.<br>';}}var message_show_delay=3000;if(jqXHR.responseText){error_message+=' '+jqXHR.responseText;message_show_delay=10;}error_message=error_message.replace(/\n/g,"<br />");var jq_node=wpbc_get_calendar__jq_node__for_messages(this.data);/**
1145 * If we make fast clicking on different pages,
1146 * then under calendar will show error message with empty text, because ajax was not received.
1147 * To not show such warnings we are set delay in 3 seconds. var message_show_delay = 3000;
1148 */var closed_timer=setTimeout(function(){// Show Message
1149 wpbc_front_end__show_message(error_message,{'type':'error','show_here':{'jq_node':jq_node,'where':'after'},'is_append':true,'style':'text-align:left;','css_class':'wpbc_fe_message_alt','delay':0});},parseInt(message_show_delay));})// .done( function ( data, textStatus, jqXHR ) { if ( window.console && window.console.log ){ console.log( 'second success', data, textStatus, jqXHR ); } })
1150 // .always( function ( data_jqXHR, textStatus, jqXHR_errorThrown ) { if ( window.console && window.console.log ){ console.log( 'always finished', data_jqXHR, textStatus, jqXHR_errorThrown ); } })
1151 ;// End Ajax
1152 }// ---------------------------------------------------------------------------------------------------------------------
1153 // Support
1154 // ---------------------------------------------------------------------------------------------------------------------
1155 /**
1156 * Get Calendar jQuery node for showing messages during Ajax
1157 * This parameter: calendar_request_params[resource_id] parsed from this.data Ajax post data
1158 *
1159 * @param ajx_post_data_url_params 'action=WPBC_AJX_CALENDAR_LOAD...&calendar_request_params%5Bresource_id%5D=2&calendar_request_params%5Bbooking_hash%5D=&calendar_request_params'
1160 * @returns {string} ''#calendar_booking1' | '.booking_form_div' ...
1161 *
1162 * Example var jq_node = wpbc_get_calendar__jq_node__for_messages( this.data );
1163 */function wpbc_get_calendar__jq_node__for_messages(ajx_post_data_url_params){var jq_node='.booking_form_div';var calendar_resource_id=wpbc_get_resource_id__from_ajx_post_data_url(ajx_post_data_url_params);if(calendar_resource_id>0){jq_node='#calendar_booking'+calendar_resource_id;}return jq_node;}/**
1164 * Get resource ID from ajx post data url usually from this.data =
1165 * 'action=WPBC_AJX_CALENDAR_LOAD...&calendar_request_params%5Bresource_id%5D=2&calendar_request_params%5Bbooking_hash%5D=&calendar_request_params'
1166 *
1167 * @param ajx_post_data_url_params 'action=WPBC_AJX_CALENDAR_LOAD...&calendar_request_params%5Bresource_id%5D=2&calendar_request_params%5Bbooking_hash%5D=&calendar_request_params'
1168 * @returns {int} 1 | 0 (if errror then 0)
1169 *
1170 * Example var jq_node = wpbc_get_calendar__jq_node__for_messages( this.data );
1171 */function wpbc_get_resource_id__from_ajx_post_data_url(ajx_post_data_url_params){// Get booking resource ID from Ajax Post Request -> this.data = 'action=WPBC_AJX_CALENDAR_LOAD...&calendar_request_params%5Bresource_id%5D=2&calendar_request_params%5Bbooking_hash%5D=&calendar_request_params'
1172 var calendar_resource_id=wpbc_get_uri_param_by_name('calendar_request_params[resource_id]',ajx_post_data_url_params);if(null!==calendar_resource_id&&''!==calendar_resource_id){calendar_resource_id=parseInt(calendar_resource_id);if(calendar_resource_id>0){return calendar_resource_id;}}return 0;}/**
1173 * Get parameter from URL - parse URL parameters, like this:
1174 * action=WPBC_AJX_CALENDAR_LOAD...&calendar_request_params%5Bresource_id%5D=2&calendar_request_params%5Bbooking_hash%5D=&calendar_request_params
1175 * @param name parameter name, like 'calendar_request_params[resource_id]'
1176 * @param url 'parameter string URL'
1177 * @returns {string|null} parameter value
1178 *
1179 * Example: wpbc_get_uri_param_by_name( 'calendar_request_params[resource_id]', this.data ); -> '2'
1180 */function wpbc_get_uri_param_by_name(name,url){url=decodeURIComponent(url);name=name.replace(/[\[\]]/g,'\\$&');var regex=new RegExp('[?&]'+name+'(=([^&#]*)|&|#|$)'),results=regex.exec(url);if(!results)return null;if(!results[2])return'';return decodeURIComponent(results[2].replace(/\+/g,' '));}/**
1181 * =====================================================================================================================
1182 * includes/__js/front_end_messages/wpbc_fe_messages.js
1183 * =====================================================================================================================
1184 */// ---------------------------------------------------------------------------------------------------------------------
1185 // Show Messages at Front-Edn side
1186 // ---------------------------------------------------------------------------------------------------------------------
1187 /**
1188 * Show message in content
1189 *
1190 * @param message Message HTML
1191 * @param params = {
1192 * 'type' : 'warning', // 'error' | 'warning' | 'info' | 'success'
1193 * 'show_here' : {
1194 * 'jq_node' : '', // any jQuery node definition
1195 * 'where' : 'inside' // 'inside' | 'before' | 'after' | 'right' | 'left'
1196 * },
1197 * 'is_append': true, // Apply only if 'where' : 'inside'
1198 * 'style' : 'text-align:left;', // styles, if needed
1199 * 'css_class': '', // For example can be: 'wpbc_fe_message_alt'
1200 * 'delay' : 0, // how many microsecond to show, if 0 then show forever
1201 * 'if_visible_not_show': false // if true, then do not show message, if previos message was not hided (not apply if 'where' : 'inside' )
1202 * };
1203 * Examples:
1204 * var html_id = wpbc_front_end__show_message( 'You can test days selection in calendar', {} );
1205 *
1206 * var notice_message_id = wpbc_front_end__show_message( _wpbc.get_message( 'message_check_required' ), { 'type': 'warning', 'delay': 10000, 'if_visible_not_show': true,
1207 * 'show_here': {'where': 'right', 'jq_node': el,} } );
1208 *
1209 * wpbc_front_end__show_message( response_data[ 'ajx_data' ][ 'ajx_after_action_message' ].replace( /\n/g, "<br />" ),
1210 * { 'type' : ( 'undefined' !== typeof( response_data[ 'ajx_data' ][ 'ajx_after_action_message_status' ] ) )
1211 * ? response_data[ 'ajx_data' ][ 'ajx_after_action_message_status' ] : 'info',
1212 * 'show_here': {'jq_node': jq_node, 'where': 'after'},
1213 * 'css_class':'wpbc_fe_message_alt',
1214 * 'delay' : 10000
1215 * } );
1216 *
1217 *
1218 * @returns string - HTML ID or 0 if not showing during this time.
1219 */function wpbc_front_end__show_message(message,params={}){var params_default={'type':'warning',// 'error' | 'warning' | 'info' | 'success'
1220 'show_here':{'jq_node':'',// any jQuery node definition
1221 'where':'inside'// 'inside' | 'before' | 'after' | 'right' | 'left'
1222 },'is_append':true,// Apply only if 'where' : 'inside'
1223 'style':'text-align:left;',// styles, if needed
1224 'css_class':'',// For example can be: 'wpbc_fe_message_alt'
1225 'delay':0,// how many microsecond to show, if 0 then show forever
1226 'if_visible_not_show':false,// if true, then do not show message, if previos message was not hided (not apply if 'where' : 'inside' )
1227 'is_scroll':true// is scroll to this element
1228 };for(var p_key in params){params_default[p_key]=params[p_key];}params=params_default;var unique_div_id=new Date();unique_div_id='wpbc_notice_'+unique_div_id.getTime();params['css_class']+=' wpbc_fe_message';if(params['type']=='error'){params['css_class']+=' wpbc_fe_message_error';message='<i class="menu_icon icon-1x wpbc_icn_report_gmailerrorred"></i>'+message;}if(params['type']=='warning'){params['css_class']+=' wpbc_fe_message_warning';message='<i class="menu_icon icon-1x wpbc_icn_warning"></i>'+message;}if(params['type']=='info'){params['css_class']+=' wpbc_fe_message_info';}if(params['type']=='success'){params['css_class']+=' wpbc_fe_message_success';message='<i class="menu_icon icon-1x wpbc_icn_done_outline"></i>'+message;}var scroll_to_element='<div id="'+unique_div_id+'_scroll" style="display:none;"></div>';message='<div id="'+unique_div_id+'" class="wpbc_front_end__message '+params['css_class']+'" style="'+params['style']+'">'+message+'</div>';var jq_el_message=false;var is_show_message=true;if('inside'===params['show_here']['where']){if(params['is_append']){jQuery(params['show_here']['jq_node']).append(scroll_to_element);jQuery(params['show_here']['jq_node']).append(message);}else{jQuery(params['show_here']['jq_node']).html(scroll_to_element+message);}}else if('before'===params['show_here']['where']){jq_el_message=jQuery(params['show_here']['jq_node']).siblings('[id^="wpbc_notice_"]');if(params['if_visible_not_show']&&jq_el_message.is(':visible')){is_show_message=false;unique_div_id=jQuery(jq_el_message.get(0)).attr('id');}if(is_show_message){jQuery(params['show_here']['jq_node']).before(scroll_to_element);jQuery(params['show_here']['jq_node']).before(message);}}else if('after'===params['show_here']['where']){jq_el_message=jQuery(params['show_here']['jq_node']).nextAll('[id^="wpbc_notice_"]');if(params['if_visible_not_show']&&jq_el_message.is(':visible')){is_show_message=false;unique_div_id=jQuery(jq_el_message.get(0)).attr('id');}if(is_show_message){jQuery(params['show_here']['jq_node']).before(scroll_to_element);// We need to set here before(for handy scroll)
1229 jQuery(params['show_here']['jq_node']).after(message);}}else if('right'===params['show_here']['where']){jq_el_message=jQuery(params['show_here']['jq_node']).nextAll('.wpbc_front_end__message_container_right').find('[id^="wpbc_notice_"]');if(params['if_visible_not_show']&&jq_el_message.is(':visible')){is_show_message=false;unique_div_id=jQuery(jq_el_message.get(0)).attr('id');}if(is_show_message){jQuery(params['show_here']['jq_node']).before(scroll_to_element);// We need to set here before(for handy scroll)
1230 jQuery(params['show_here']['jq_node']).after('<div class="wpbc_front_end__message_container_right">'+message+'</div>');}}else if('left'===params['show_here']['where']){jq_el_message=jQuery(params['show_here']['jq_node']).siblings('.wpbc_front_end__message_container_left').find('[id^="wpbc_notice_"]');if(params['if_visible_not_show']&&jq_el_message.is(':visible')){is_show_message=false;unique_div_id=jQuery(jq_el_message.get(0)).attr('id');}if(is_show_message){jQuery(params['show_here']['jq_node']).before(scroll_to_element);// We need to set here before(for handy scroll)
1231 jQuery(params['show_here']['jq_node']).before('<div class="wpbc_front_end__message_container_left">'+message+'</div>');}}if(is_show_message&&parseInt(params['delay'])>0){var closed_timer=setTimeout(function(){jQuery('#'+unique_div_id).fadeOut(1500);},parseInt(params['delay']));var closed_timer2=setTimeout(function(){jQuery('#'+unique_div_id).trigger('hide');},parseInt(params['delay'])+1501);}// Check if showed message in some hidden parent section and show it. But it must be lower than '.wpbc_container'
1232 var parent_els=jQuery('#'+unique_div_id).parents().map(function(){if(!jQuery(this).is('visible')&&jQuery('.wpbc_container').has(this)){jQuery(this).show();}});if(params['is_scroll']){wpbc_do_scroll('#'+unique_div_id+'_scroll');}return unique_div_id;}/**
1233 * Error message. Preset of parameters for real message function.
1234 *
1235 * @param el - any jQuery node definition
1236 * @param message - Message HTML
1237 * @returns string - HTML ID or 0 if not showing during this time.
1238 */function wpbc_front_end__show_message__error(jq_node,message){var notice_message_id=wpbc_front_end__show_message(message,{'type':'error','delay':10000,'if_visible_not_show':true,'show_here':{'where':'right','jq_node':jq_node}});return notice_message_id;}/**
1239 * Error message UNDER element. Preset of parameters for real message function.
1240 *
1241 * @param el - any jQuery node definition
1242 * @param message - Message HTML
1243 * @returns string - HTML ID or 0 if not showing during this time.
1244 */function wpbc_front_end__show_message__error_under_element(jq_node,message,message_delay){if('undefined'===typeof message_delay){message_delay=0;}var notice_message_id=wpbc_front_end__show_message(message,{'type':'error','delay':message_delay,'if_visible_not_show':true,'show_here':{'where':'after','jq_node':jq_node}});return notice_message_id;}/**
1245 * Error message UNDER element. Preset of parameters for real message function.
1246 *
1247 * @param el - any jQuery node definition
1248 * @param message - Message HTML
1249 * @returns string - HTML ID or 0 if not showing during this time.
1250 */function wpbc_front_end__show_message__error_above_element(jq_node,message,message_delay){if('undefined'===typeof message_delay){message_delay=10000;}var notice_message_id=wpbc_front_end__show_message(message,{'type':'error','delay':message_delay,'if_visible_not_show':true,'show_here':{'where':'before','jq_node':jq_node}});return notice_message_id;}/**
1251 * Warning message. Preset of parameters for real message function.
1252 *
1253 * @param el - any jQuery node definition
1254 * @param message - Message HTML
1255 * @returns string - HTML ID or 0 if not showing during this time.
1256 */function wpbc_front_end__show_message__warning(jq_node,message){var notice_message_id=wpbc_front_end__show_message(message,{'type':'warning','delay':10000,'if_visible_not_show':true,'show_here':{'where':'right','jq_node':jq_node}});wpbc_highlight_error_on_form_field(jq_node);return notice_message_id;}/**
1257 * Warning message UNDER element. Preset of parameters for real message function.
1258 *
1259 * @param el - any jQuery node definition
1260 * @param message - Message HTML
1261 * @returns string - HTML ID or 0 if not showing during this time.
1262 */function wpbc_front_end__show_message__warning_under_element(jq_node,message){var notice_message_id=wpbc_front_end__show_message(message,{'type':'warning','delay':10000,'if_visible_not_show':true,'show_here':{'where':'after','jq_node':jq_node}});return notice_message_id;}/**
1263 * Warning message ABOVE element. Preset of parameters for real message function.
1264 *
1265 * @param el - any jQuery node definition
1266 * @param message - Message HTML
1267 * @returns string - HTML ID or 0 if not showing during this time.
1268 */function wpbc_front_end__show_message__warning_above_element(jq_node,message){var notice_message_id=wpbc_front_end__show_message(message,{'type':'warning','delay':10000,'if_visible_not_show':true,'show_here':{'where':'before','jq_node':jq_node}});return notice_message_id;}/**
1269 * Highlight Error in specific field
1270 *
1271 * @param jq_node string or jQuery element, where scroll to
1272 */function wpbc_highlight_error_on_form_field(jq_node){if(!jQuery(jq_node).length){return;}if(!jQuery(jq_node).is(':input')){// Situation with checkboxes or radio buttons
1273 var jq_node_arr=jQuery(jq_node).find(':input');if(!jq_node_arr.length){return;}jq_node=jq_node_arr.get(0);}var params={};params['delay']=10000;if(!jQuery(jq_node).hasClass('wpbc_form_field_error')){jQuery(jq_node).addClass('wpbc_form_field_error');if(parseInt(params['delay'])>0){var closed_timer=setTimeout(function(){jQuery(jq_node).removeClass('wpbc_form_field_error');},parseInt(params['delay']));}}}/**
1274 * Scroll to specific element
1275 *
1276 * @param jq_node string or jQuery element, where scroll to
1277 * @param extra_shift_offset int shift offset from jq_node
1278 */function wpbc_do_scroll(jq_node,extra_shift_offset=0){if(!jQuery(jq_node).length){return;}var targetOffset=jQuery(jq_node).offset().top;if(targetOffset<=0){if(0!=jQuery(jq_node).nextAll(':visible').length){targetOffset=jQuery(jq_node).nextAll(':visible').first().offset().top;}else if(0!=jQuery(jq_node).parent().nextAll(':visible').length){targetOffset=jQuery(jq_node).parent().nextAll(':visible').first().offset().top;}}if(jQuery('#wpadminbar').length>0){targetOffset=targetOffset-50-50;}else{targetOffset=targetOffset-20-50;}targetOffset+=extra_shift_offset;// Scroll only if we did not scroll before
1279 if(!jQuery('html,body').is(':animated')){jQuery('html,body').animate({scrollTop:targetOffset},500);}}// FixIn: 10.2.0.4.
1280 /**
1281 * Define Popovers for Timelines in WP Booking Calendar
1282 *
1283 * @returns {string|boolean}
1284 */function wpbc_define_tippy_popover(){if('function'!==typeof wpbc_tippy){console.log('WPBC Error. wpbc_tippy was not defined.');return false;}wpbc_tippy('.popover_bottom.popover_click',{content(reference){var popover_title=reference.getAttribute('data-original-title');var popover_content=reference.getAttribute('data-content');return'<div class="popover popover_tippy">'+'<div class="popover-close"><a href="javascript:void(0)" onclick="javascript:this.parentElement.parentElement.parentElement.parentElement.parentElement._tippy.hide();" >&times;</a></div>'+popover_content+'</div>';},allowHTML:true,trigger:'manual',interactive:true,hideOnClick:false,interactiveBorder:10,maxWidth:550,theme:'wpbc-tippy-popover',placement:'bottom-start',touch:['hold',500]});jQuery('.popover_bottom.popover_click').on('click',function(){if(this._tippy.state.isVisible){this._tippy.hide();}else{this._tippy.show();}});wpbc_define_hide_tippy_on_scroll();}function wpbc_define_hide_tippy_on_scroll(){jQuery('.flex_tl__scrolling_section2,.flex_tl__scrolling_sections').on('scroll',function(event){if('function'===typeof wpbc_tippy){wpbc_tippy.hideAll();}});}/**
1285 * WPBC calendar loader bootstrap.
1286 * ==============================================================================================
1287 * - Finds every .calendar_loader_frame[data-wpbc-rid] on the page (now or later).
1288 * - For each loader element, waits a "grace" period (data-wpbc-grace, default 8000 ms):
1289 * - If the real calendar appears: do nothing (loader naturally replaced).
1290 * - If not: show a helpful message (missing jQuery/_wpbc/datepick) or a duplicate notice.
1291 * - Works with multiple calendars and even duplicate RIDs on the same page.
1292 * - No inline JS needed in the shortcode/template output.
1293 *
1294 * File: ../includes/__js/client/cal/wpbc_cal_loader.js
1295 *
1296 * @since 10.14.5
1297 * @modified 2025-09-07 12:21
1298 * @version 1.0.0
1299 *
1300 *//**
1301 * WPBC calendar loader bootstrap.
1302 * - Auto-detects .calendar_loader_frame[data-wpbc-rid] blocks.
1303 * - Waits a "grace" period per element before showing a helpful message
1304 * if the real calendar hasn't replaced the loader.
1305 * - Multiple calendars and duplicate RIDs are handled.
1306 */(function(w,d){'use strict';/* ---------------------------------------------------------------------------
1307 * Small utilities (snake_case)
1308 * ------------------------------------------------------------------------ *//** Track processed loader elements; fallback to data flag if WeakSet missing. */var processed_set=typeof WeakSet==='function'?new WeakSet():null;/** Return first match inside optional root. */function query_one(selector,root){return(root||d).querySelector(selector);}/** Return NodeList of matches inside optional root. */function query_all(selector,root){return(root||d).querySelectorAll(selector);}/** Run a callback when DOM is ready. */function on_ready(fn){if(d.readyState==='loading'){d.addEventListener('DOMContentLoaded',fn);}else{fn();}}/** Clear interval safely. */function safe_clear(interval_id){try{w.clearInterval(interval_id);}catch(e){}}/** Mark element processed (WeakSet or data attribute). */function mark_processed(el){if(processed_set){processed_set.add(el);}else{try{el.dataset.wpbcProcessed='1';}catch(e){}}}/** Check if element was processed. */function is_processed(el){return processed_set?processed_set.has(el):el&&el.dataset&&el.dataset.wpbcProcessed==='1';}/* ---------------------------------------------------------------------------
1309 * Messages (fixed English strings; no i18n)
1310 * ------------------------------------------------------------------------ *//**
1311 * Build fixed English messages for a resource.
1312 * @param {string|number} rid
1313 * @return {{duplicate:string,support:string,lib_jq:string,lib_dp:string,lib_wpbc:string}}
1314 */function get_messages(rid){var rid_int=parseInt(rid,10);return{duplicate:'You have added the same calendar (ID = '+rid_int+') more than once on this page. '+'Please keep only one calendar with the same ID on a page to avoid conflicts.',init_failed:'The calendar could not be initialized on this page.'+'\n'+'Please check your browser console for JavaScript errors and conflicts with other scripts/plugins.',support:'',/* 'Contact support@wpbookingcalendar.com if you have any questions.', */lib_jq:'It appears that the "jQuery" library is not loading correctly.'+'\n'+'For more information, please refer to this page: https://wpbookingcalendar.com/faq/',lib_dp:'It appears that the "jQuery.datepick" library is not loading correctly.'+'\n'+'For more information, please refer to this page: https://wpbookingcalendar.com/faq/',lib_wpbc:'It appears that the "_wpbc" library is not loading correctly.'+'\n'+'Please enable the loading of JS/CSS files for this page on the "WP Booking Calendar" - "Settings General" - "Advanced" page'+'\n'+'For more information, please refer to this page: https://wpbookingcalendar.com/faq/'};}/**
1315 * Wrap plain text (with newlines) in a small HTML container.
1316 * @param {string} msg
1317 * @return {string}
1318 */function wrap_html(msg){return'<div style="font-size:13px;margin:10px;">'+String(msg||'').replace(/\n/g,'<br>')+'</div>';}/** Library presence checks (fast & cheap). */function has_jq(){return!!(w.jQuery&&jQuery.fn&&typeof jQuery.fn.on==='function');}function has_dp(){return!!(w.jQuery&&jQuery.datepick);}function has_wpbc(){return!!(w._wpbc&&typeof w._wpbc.set_other_param==='function');}function normalize_rid(rid){var n=parseInt(rid,10);return n>0?String(n):'';}function get_rid_counts(rid){var r=normalize_rid(rid);return{rid:r,loaders:r?query_all('.calendar_loader_frame[data-wpbc-rid="'+r+'"]').length:0,containers:r?query_all('#calendar_booking'+r).length:0};}function is_duplicate_rid(rid){var c=get_rid_counts(rid);return c.loaders>1||c.containers>1;}/**
1319 * Determine if the loader has been replaced by the real calendar.
1320 *
1321 * @param {Element} el Loader element
1322 * @param {string} rid Resource ID
1323 * @param {Element|null} container Optional #calendar_booking{rid} element
1324 * @return {boolean}
1325 */function is_replaced(el,rid,container){var loader_still_in_dom=d.body.contains(el);var calendar_exists=!!query_one('.wpbc_calendar_id_'+rid,container||d);return!loader_still_in_dom||calendar_exists;}/**
1326 * Start watcher for a single loader element.
1327 * - Polls and observes the calendar container.
1328 * - After grace, injects a suitable message if not replaced.
1329 *
1330 * @param {Element} el
1331 */function start_for(el){if(!el||is_processed(el)){return;}mark_processed(el);var rid=el.dataset.wpbcRid;if(!rid){return;}var grace_ms=parseInt(el.dataset.wpbcGrace||'8000',10);if(!(grace_ms>0)){grace_ms=8000;}var container_id='calendar_booking'+rid;var container=d.getElementById(container_id);var text_el=query_one('.calendar_loader_text',el);function replaced_now(){return is_replaced(el,rid,container);}// Already replaced -> nothing to do.
1332 if(replaced_now()){return;}// 1) Cheap polling.
1333 var poll_id=w.setInterval(function(){if(replaced_now()){safe_clear(poll_id);if(observer){try{observer.disconnect();}catch(e){}}}},250);// 2) MutationObserver for faster reaction.
1334 var observer=null;if(container&&'MutationObserver'in w){try{observer=new MutationObserver(function(){if(replaced_now()){safe_clear(poll_id);try{observer.disconnect();}catch(e){}}});observer.observe(container,{childList:true,subtree:true});}catch(e){}}// 3) Final decision after grace period.
1335 w.setTimeout(function finalize_after_grace(){if(replaced_now()){safe_clear(poll_id);if(observer){try{observer.disconnect();}catch(e){}}return;}var M=get_messages(rid);var msg;if(!has_jq()){msg=M.lib_jq;}else if(!has_wpbc()){msg=M.lib_wpbc;}else if(!has_dp()){msg=M.lib_dp;}else{// Libraries are present, but loader wasn't replaced -> decide what is most likely.
1336 if(is_duplicate_rid(rid)){msg=M.duplicate+'\n\n'+M.support;}else{msg=M.init_failed+'\n\n'+M.support;}}try{if(text_el){text_el.innerHTML=wrap_html(msg);}}catch(e){}safe_clear(poll_id);if(observer){try{observer.disconnect();}catch(e){}}},grace_ms);}/**
1337 * Initialize watchers for loader elements already in the DOM.
1338 */function bootstrap_existing(){query_all('.calendar_loader_frame[data-wpbc-rid]').forEach(start_for);}/**
1339 * Observe the document for any new loader elements inserted later (AJAX, block render).
1340 */function observe_new_loaders(){if(!('MutationObserver'in w)){return;}try{var doc_observer=new MutationObserver(function(mutations){for(var i=0;i<mutations.length;i++){var nodes=mutations[i].addedNodes||[];for(var j=0;j<nodes.length;j++){var node=nodes[j];if(!node||node.nodeType!==1){continue;}if(node.matches&&node.matches('.calendar_loader_frame[data-wpbc-rid]')){start_for(node);}if(node.querySelectorAll){var inner=node.querySelectorAll('.calendar_loader_frame[data-wpbc-rid]');if(inner&&inner.length){inner.forEach(start_for);}}}}});doc_observer.observe(d.documentElement,{childList:true,subtree:true});}catch(e){}}/* ---------------------------------------------------------------------------
1341 * Boot
1342 * ------------------------------------------------------------------------ */on_ready(function(){bootstrap_existing();observe_new_loaders();});})(window,document);(function(w){'use strict';if(!w.WPBC_FE){w.WPBC_FE={};}/**
1343 * Auto-fill booking form fields (text/email) based on input "name" patterns.
1344 *
1345 * Form ID format: booking_form{resource_id}
1346 * Skips date field: date_booking{resource_id}
1347 *
1348 * @param {number} resource_id Booking resource ID.
1349 * @param {Object} fill_values Values to inject (strings).
1350 *
1351 * @return {boolean} True if form found and processed, false otherwise.
1352 */w.WPBC_FE.autofill_booking_form_fields=function(resource_id,fill_values){resource_id=parseInt(resource_id,10)||0;fill_values=fill_values||{};var form_id='booking_form'+resource_id;var date_name='date_booking'+resource_id;var submit_form=document.getElementById(form_id);if(!submit_form){/* eslint-disable no-console */console.error('WPBC: No booking form: '+form_id);/* eslint-enable no-console */return false;}// Keep same regex rules and priority order as legacy inline JS.
1353 var rules=array_rules(fill_values);var elements=submit_form.elements||[];var count=elements.length;var el;var i;var j;for(i=0;i<count;i++){el=elements[i];if(!el||!el.name){continue;}// Only text/email inputs.
1354 if(el.type!=='text'&&el.type!=='email'){continue;}// Skip date field.
1355 if(el.name===date_name){continue;}// Fill only empty values (legacy behavior: == "").
1356 if(el.value!==''){continue;}for(j=0;j<rules.length;j++){if(rules[j].re.test(el.name)){if(rules[j].val!==''){el.value=rules[j].val;}break;// Stop at first matching rule (priority).
1357 }}}return true;};/**
1358 * Build rules array for autofill.
1359 *
1360 * @param {Object} fill_values Values to inject.
1361 *
1362 * @return {Array} Rules list.
1363 */function array_rules(fill_values){// Normalize to strings (prevent "undefined" in fields).
1364 var nickname=fill_values.nickname!=null?String(fill_values.nickname):'';var last_name=fill_values.last_name!=null?String(fill_values.last_name):'';var first_name=fill_values.first_name!=null?String(fill_values.first_name):'';var email=fill_values.email!=null?String(fill_values.email):'';var phone=fill_values.phone!=null?String(fill_values.phone):'';var nb_enfant=fill_values.nb_enfant!=null?String(fill_values.nb_enfant):'';var url=fill_values.url!=null?String(fill_values.url):'';return[{re:/^([A-Za-z0-9_\-\.])*(nickname){1}([A-Za-z0-9_\-\.])*$/,val:nickname},{re:/^([A-Za-z0-9_\-\.])*(last|second){1}([_\-\.])?name([A-Za-z0-9_\-\.])*$/,val:last_name},{re:/^name([0-9_\-\.])*$/,val:first_name},{re:/^([A-Za-z0-9_\-\.])*(first|my){1}([_\-\.])?name([A-Za-z0-9_\-\.])*$/,val:first_name},{re:/^(e)?([_\-\.])?mail([0-9_\-\.]*)$/,val:email},{re:/^([A-Za-z0-9_\-\.])*(phone|fone){1}([A-Za-z0-9_\-\.])*$/,val:phone},{re:/^(e)?([_\-\.])?nb_enfant([0-9_\-\.]*)$/,val:nb_enfant},{re:/^([A-Za-z0-9_\-\.])*(URL|site|web|WEB){1}([A-Za-z0-9_\-\.])*$/,val:url}];}})(window);// == Submit Booking Data ==============================================================================================
1365 // Refactored (safe), with new wpbc_* names.
1366 // Backward-compatible wrappers for legacy function names are included at the bottom.
1367 // @file: includes/__js/client/front_end_form/booking_form_submit.js
1368 /**
1369 * Check fields at form and then send request (legacy: mybooking_submit).
1370 *
1371 * @param {HTMLFormElement} submit_form
1372 * @param {number|string} resource_id
1373 * @param {string} wpdev_active_locale
1374 *
1375 * @return {false|undefined} Legacy behavior: returns false in some cases, otherwise undefined.
1376 */function wpbc_booking_form_submit(submit_form,resource_id,wpdev_active_locale){resource_id=parseInt(resource_id,10);// Safety guard (legacy code assumed valid form).
1377 if(!submit_form||!submit_form.elements){/* eslint-disable no-console */console.error('WPBC: Invalid submit form in wpbc_booking_form_submit().');/* eslint-enable no-console */return false;}// -------------------------------------------------------------------------
1378 // External hook: allow pause submit on confirmation/summary step.
1379 // -------------------------------------------------------------------------
1380 var target_elm=jQuery('.booking_form_div').trigger('booking_form_submit_click',[resource_id,submit_form,wpdev_active_locale]);// FixIn: 8.8.3.13.
1381 if(jQuery(target_elm).find('input[name="booking_form_show_summary"]').length>0&&'pause_submit'===jQuery(target_elm).find('input[name="booking_form_show_summary"]').val()){return false;}// FixIn: 8.4.0.2.
1382 var is_error=wpbc_check_errors_in_booking_form(resource_id);if(is_error){return false;}// -------------------------------------------------------------------------
1383 // Show message if no selected days in Calendar(s).
1384 // -------------------------------------------------------------------------
1385 var date_input=document.getElementById('date_booking'+resource_id);var date_value=date_input?date_input.value:'';if(''===date_value){var arr_of_selected_additional_calendars=wpbc_get_arr_of_selected_additional_calendars(resource_id);// FixIn: 8.5.2.26.
1386 if(!arr_of_selected_additional_calendars||arr_of_selected_additional_calendars.length===0){wpbc_front_end__show_message__error_under_element('#booking_form_div'+resource_id+' .bk_calendar_frame',_wpbc.get_message('message_check_no_selected_dates'),3000);return;}}// -------------------------------------------------------------------------
1387 // FixIn: 6.1.1.3. Time selection availability checks.
1388 // -------------------------------------------------------------------------
1389 if(typeof wpbc_is_this_time_selection_not_available==='function'){if(''===date_value){// Primary calendar not selected.
1390 var additional_calendars_el=document.getElementById('additional_calendars'+resource_id);if(additional_calendars_el!==null){// Checking additional calendars.
1391 var id_additional_str=additional_calendars_el.value;var id_additional_arr=id_additional_str.split(',');var is_times_dates_ok=false;for(var ia=0;ia<id_additional_arr.length;ia++){var add_id=id_additional_arr[ia];var add_date_el=document.getElementById('date_booking'+add_id);var add_date_val=add_date_el?add_date_el.value:'';if(''!==add_date_val&&!wpbc_is_this_time_selection_not_available(add_id,submit_form.elements)){is_times_dates_ok=true;}}if(!is_times_dates_ok){return;}}}else{// Primary calendar selected.
1392 if(wpbc_is_this_time_selection_not_available(resource_id,submit_form.elements)){return;}}}// -------------------------------------------------------------------------
1393 // Serialize form (legacy format).
1394 // -------------------------------------------------------------------------
1395 var count=submit_form.elements.length;var formdata='';var inp_value;var inp_title_value;var element;var el_type;// Helper: legacy escaping for the serialized value.
1396 function wpbc_escape_serialized_value(val){val=val==null?'':String(val);// Replace registered characters.
1397 val=val.replace(new RegExp('\\^','g'),'&#94;');val=val.replace(new RegExp('~','g'),'&#126;');// Replace quotes.
1398 val=val.replace(/"/g,'&#34;');val=val.replace(/'/g,'&#39;');return val;}// Helper: determine UI type for title extraction (legacy logic).
1399 function wpbc_get_input_element_type(el){if(!el||!el.tagName){return'';}var tag=String(el.tagName).toLowerCase();if('input'===tag){return el.type?String(el.type).toLowerCase():'text';}// Legacy used "select" string here.
1400 if('select'===tag){return'select';}return tag;}for(var i=0;i<count;i++){// FixIn: 9.1.5.1.
1401 element=submit_form.elements[i];if(!element){continue;}if(jQuery(element).closest('.booking_form_garbage').length){continue;// Skip elements from garbage. FixIn: 7.1.2.14.
1402 }if(element.type!=='button'&&element.type!=='hidden'&&element.name!=='date_booking'+resource_id// && ( jQuery( element ).is( ':visible' ) ) //FixIn: 7.2.1.12.2
1403 ){// -------------------------------------------------------------
1404 // Get element value.
1405 // -------------------------------------------------------------
1406 if(element.type==='checkbox'){if(element.value===''){inp_value=element.checked;}else{inp_value=element.checked?element.value:'';}}else if(element.type==='radio'){if(element.checked){inp_value=element.value;}else{// Required radio: show warning if none checked.
1407 // FixIn: 7.0.1.62.
1408 if(element.className.indexOf('wpdev-validates-as-required')!==-1&&jQuery(element).is(':visible')&&// FixIn: 7.2.1.12.2.
1409 !jQuery(':radio[name="'+element.name+'"]',submit_form).is(':checked')){wpbc_front_end__show_message__warning(element,_wpbc.get_message('message_check_required_for_radio_box'));// FixIn: 8.5.1.3.
1410 return;}// Skip storing empty radio options.
1411 continue;}}else{inp_value=element.value;}inp_title_value='';// -------------------------------------------------------------
1412 // Get human-friendly title value (legacy behavior).
1413 // -------------------------------------------------------------
1414 var input_element_type=wpbc_get_input_element_type(element);switch(input_element_type){case'text':case'email':inp_title_value=inp_value;break;case'select':inp_title_value=jQuery(element).find('option:selected').text();break;case'radio':case'checkbox':if(jQuery(element).is(':checked')){var label_element=jQuery(element).parents('.wpdev-list-item').find('.wpdev-list-item-label');if(label_element.length){inp_title_value=label_element.html();}}break;default:inp_title_value=inp_value;}// -------------------------------------------------------------
1415 // Multiple select value extraction.
1416 // -------------------------------------------------------------
1417 if(element.type==='selectbox-multiple'||element.type==='select-multiple'){inp_value=jQuery('[name="'+element.name+'"]').val();if(inp_value===null||String(inp_value)===''){inp_value='';}}// -------------------------------------------------------------
1418 // Make validation only for visible elements.
1419 // -------------------------------------------------------------
1420 if(jQuery(element).is(':visible')){// FixIn: 7.2.1.12.2.
1421 // Recheck max available visitors selection.
1422 if(typeof wpbc__is_less_than_required__of_max_available_slots__bl==='function'){if(wpbc__is_less_than_required__of_max_available_slots__bl(resource_id,element)){return;}}// Required fields.
1423 if(element.className.indexOf('wpdev-validates-as-required')!==-1){if(element.type==='checkbox'&&element.checked===false){if(!jQuery(':checkbox[name="'+element.name+'"]',submit_form).is(':checked')){wpbc_front_end__show_message__warning(element,_wpbc.get_message('message_check_required_for_check_box'));// FixIn: 8.5.1.3.
1424 return;}}if(element.type==='radio'){if(!jQuery(':radio[name="'+element.name+'"]',submit_form).is(':checked')){wpbc_front_end__show_message__warning(element,_wpbc.get_message('message_check_required_for_radio_box'));// FixIn: 8.5.1.3.
1425 return;}}if(element.type!=='checkbox'&&element.type!=='radio'&&''===wpbc_trim(inp_value)){wpbc_front_end__show_message__warning(element,_wpbc.get_message('message_check_required'));// FixIn: 8.5.1.3.
1426 return;}}// Email format validation.
1427 if(element.className.indexOf('wpdev-validates-as-email')!==-1){inp_value=String(inp_value).replace(/^\s+|\s+$/gm,'');// Trim white space. FixIn: 5.4.5.
1428 var reg_email=/^([A-Za-z0-9_\-\.\+])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,})$/;if(inp_value!==''){if(reg_email.test(inp_value)===false){wpbc_front_end__show_message__warning(element,_wpbc.get_message('message_check_email'));// FixIn: 8.5.1.3.
1429 return;}}}// Same email field validation (verification field).
1430 if(element.className.indexOf('wpdev-validates-as-email')!==-1&&element.className.indexOf('same_as_')!==-1){var primary_email_name=element.className.match(/same_as_([^\s])+/gi);if(primary_email_name!==null){primary_email_name=primary_email_name[0].substr(8);if(jQuery('[name="'+primary_email_name+resource_id+'"]').length>0){if(jQuery('[name="'+primary_email_name+resource_id+'"]').val()!==inp_value){wpbc_front_end__show_message__warning(element,_wpbc.get_message('message_check_same_email'));// FixIn: 8.5.1.3.
1431 return;}}}// Skip one loop for the email verification field.
1432 continue;// FixIn: 8.1.2.15.
1433 }}// -------------------------------------------------------------
1434 // Get Form Data (legacy format).
1435 // -------------------------------------------------------------
1436 if(element.name!=='captcha_input'+resource_id){if(formdata!==''){formdata+='~';}el_type=element.type;if(element.className.indexOf('wpdev-validates-as-email')!==-1){el_type='email';}if(element.className.indexOf('wpdev-validates-as-coupon')!==-1){el_type='coupon';}inp_value=wpbc_escape_serialized_value(inp_value);if(el_type==='select-one'){el_type='selectbox-one';}if(el_type==='select-multiple'){el_type='selectbox-multiple';}formdata+=el_type+'^'+element.name+'^'+inp_value;// Add title/label value (legacy).
1437 var clean_field_name=String(element.name);// BUGFIX: replaceAll(RegExp) is not supported in older browsers.
1438 // Keep legacy intent: remove [] suffix occurrences.
1439 clean_field_name=clean_field_name.replace(/\[\]/gi,'');var resource_id_str=String(resource_id);// Legacy assumed suffix ends with resource_id, make it safe.
1440 if(clean_field_name.length>=resource_id_str.length&&clean_field_name.substr(clean_field_name.length-resource_id_str.length)===resource_id_str){clean_field_name=clean_field_name.substr(0,clean_field_name.length-resource_id_str.length);}formdata+='~'+el_type+'^'+clean_field_name+'_val'+resource_id+'^'+inp_title_value;}}}// TODO: here was function for 'Check if visitor finish dates selection.
1441 // Captcha verify.
1442 var captcha=document.getElementById('wpdev_captcha_challenge_'+resource_id);if(captcha!==null){wpbc_form_submit_send(resource_id,formdata,captcha.value,document.getElementById('captcha_input'+resource_id).value,wpdev_active_locale);}else{wpbc_form_submit_send(resource_id,formdata,'','',wpdev_active_locale);}return;}/**
1443 * Gathering params for sending Ajax request and then send it (legacy: form_submit_send).
1444 *
1445 * @param {number|string} resource_id
1446 * @param {string} formdata
1447 * @param {string} captcha_chalange
1448 * @param {string} user_captcha
1449 * @param {string} wpdev_active_locale
1450 *
1451 * @return {undefined} Legacy behavior.
1452 */function wpbc_form_submit_send(resource_id,formdata,captcha_chalange,user_captcha,wpdev_active_locale){resource_id=parseInt(resource_id,10);var my_booking_form='';var booking_form_type_el=document.getElementById('booking_form_type'+resource_id);if(booking_form_type_el!==null){my_booking_form=booking_form_type_el.value;}var my_booking_hash='';if(_wpbc.get_other_param('this_page_booking_hash')!==''){my_booking_hash=_wpbc.get_other_param('this_page_booking_hash');}var is_send_emeils=1;var $is_send_email_toggle=jQuery('#is_send_email_for_pending');var $modal_send_email_toggle=jQuery('#booking_form'+resource_id).closest('.wpbc_modal__add_booking__section').find('[data-wpbc-add-booking-send-emails]').first();if($modal_send_email_toggle.length){$is_send_email_toggle=$modal_send_email_toggle;}if($is_send_email_toggle.length){// FixIn: 8.7.9.5.
1453 is_send_emeils=$is_send_email_toggle.is(':checked');if(false===is_send_emeils){is_send_emeils=0;}else{is_send_emeils=1;}}var date_el=document.getElementById('date_booking'+resource_id);var date_value=date_el?date_el.value:'';if(''!==date_value){// FixIn: 6.1.1.3.
1454 wpbc_send_ajax_submit(resource_id,formdata,captcha_chalange,user_captcha,is_send_emeils,my_booking_hash,my_booking_form,wpdev_active_locale);}else{jQuery('#booking_form_div'+resource_id).hide();jQuery('#submiting'+resource_id).hide();}// -------------------------------------------------------------------------
1455 // Additional calendars submit.
1456 // -------------------------------------------------------------------------
1457 var additional_calendars_el=document.getElementById('additional_calendars'+resource_id);if(additional_calendars_el===null){return;}var id_additional_str=additional_calendars_el.value;var id_additional_arr=id_additional_str.split(',');// FixIn: 10.9.4.1.
1458 for(var ia=0;ia<id_additional_arr.length;ia++){id_additional_arr[ia]=parseInt(id_additional_arr[ia],10);}if(!jQuery('#booking_form_div'+resource_id).is(':visible')){wpbc_booking_form__spin_loader__show(resource_id);// Show Spinner
1459 }// Helper: rewrite field name suffix from resource_id -> id_additional.
1460 function wpbc_rewrite_field_name_suffix(field_name,old_id,new_id){field_name=String(field_name);var old_id_str=String(old_id);var new_id_str=String(new_id);// Handle fields with [].
1461 if(field_name.length>=old_id_str.length+2&&field_name.substr(field_name.length-(old_id_str.length+2))===old_id_str+'[]'){return field_name.substr(0,field_name.length-(old_id_str.length+2))+new_id_str+'[]';}// Handle fields without [].
1462 if(field_name.length>=old_id_str.length&&field_name.substr(field_name.length-old_id_str.length)===old_id_str){return field_name.substr(0,field_name.length-old_id_str.length)+new_id_str;}// Fallback: return unchanged (safer than breaking name).
1463 return field_name;}for(ia=0;ia<id_additional_arr.length;ia++){var id_additional=id_additional_arr[ia];// FixIn: 10.9.4.1.
1464 if(id_additional<=0){continue;}// Rebuild formdata for each additional calendar (legacy behavior).
1465 var formdata_additional_arr=String(formdata).split('~');var formdata_additional='';for(var j=0;j<formdata_additional_arr.length;j++){var my_form_field=formdata_additional_arr[j].split('^');if(formdata_additional!==''){formdata_additional+='~';}// Safety: ensure we have at least type ^ name ^ value.
1466 if(my_form_field.length<3){formdata_additional+=formdata_additional_arr[j];continue;}my_form_field[1]=wpbc_rewrite_field_name_suffix(my_form_field[1],resource_id,id_additional);formdata_additional+=my_form_field[0]+'^'+my_form_field[1]+'^'+my_form_field[2];}// If payment form for main booking resource is showing, append for additional calendars.
1467 if(jQuery('#gateway_payment_forms'+resource_id).length>0){jQuery('#gateway_payment_forms'+resource_id).after('<div id="gateway_payment_forms'+id_additional+'"></div>');jQuery('#gateway_payment_forms'+resource_id).after('<div id="ajax_respond_insert'+id_additional+'" style="display:none;"></div>');}// FixIn: 8.5.2.17.
1468 wpbc_send_ajax_submit(id_additional,formdata_additional,captcha_chalange,user_captcha,is_send_emeils,my_booking_hash,my_booking_form,wpdev_active_locale);}}/**
1469 * Send Ajax submit (legacy: send_ajax_submit).
1470 *
1471 * @param {number|string} resource_id
1472 * @param {string} formdata
1473 * @param {string} captcha_chalange
1474 * @param {string} user_captcha
1475 * @param {number} is_send_emeils
1476 * @param {string} my_booking_hash
1477 * @param {string} my_booking_form
1478 * @param {string} wpdev_active_locale
1479 *
1480 * @return {undefined} Legacy behavior.
1481 */function wpbc_send_ajax_submit(resource_id,formdata,captcha_chalange,user_captcha,is_send_emeils,my_booking_hash,my_booking_form,wpdev_active_locale){resource_id=parseInt(resource_id,10);// Disable Submit | Show spin loader.
1482 wpbc_booking_form__on_submit__ui_elements_disable(resource_id);// FixIn: 2026-02-05 - pass preview context to booking create Ajax.
1483 var form_status=wpbc__get_form_status_for_submit(resource_id);var preview_args=form_status==='preview'?wpbc__get_bfb_preview_args_from_location():null;var request_params={'resource_id':resource_id,'dates_ddmmyy_csv':document.getElementById('date_booking'+resource_id).value,'formdata':formdata,'booking_hash':my_booking_hash,'custom_form':my_booking_form,'aggregate_resource_id_arr':null!==_wpbc.booking__get_param_value(resource_id,'aggregate_resource_id_arr')?_wpbc.booking__get_param_value(resource_id,'aggregate_resource_id_arr').join(','):'','captcha_chalange':captcha_chalange,'captcha_user_input':user_captcha,'is_emails_send':is_send_emeils,'active_locale':wpdev_active_locale,'form_status':form_status};// If preview, pass session identifiers so PHP can load transient snapshot.
1484 if(preview_args&&preview_args.token&&preview_args.form_id){request_params['wpbc_bfb_preview']=1;request_params['wpbc_bfb_preview_token']=preview_args.token;request_params['wpbc_bfb_preview_form_id']=preview_args.form_id;request_params['wpbc_bfb_preview_nonce']=preview_args.nonce;// note: URL param is `nonce`.
1485 }var is_exit=wpbc_ajx_booking__create(request_params);if(true===is_exit){return;}}// == Helper Functions =================================================================================================
1486 /**
1487 * Parse query string into {key:value} (old-browser safe).
1488 *
1489 * @param {string} qs
1490 * @return {Object}
1491 */function wpbc__parse_query_string(qs){var out={};qs=qs||'';qs=qs.replace(/^\?/,'');if(!qs){return out;}var parts=qs.split('&');for(var i=0;i<parts.length;i++){var kv=parts[i].split('=');var k=decodeURIComponent(kv[0]||'');if(!k){continue;}var v=decodeURIComponent(kv.slice(1).join('=')||'');out[k]=v;}return out;}/**
1492 * Detect preview args from current URL (iframe URL).
1493 *
1494 * @return {Object|null} { token, form_id, nonce } or null
1495 */function wpbc__get_bfb_preview_args_from_location(){try{var p=wpbc__parse_query_string(window.location&&window.location.search?window.location.search:'');if(!p.wpbc_bfb_preview||p.wpbc_bfb_preview==='0'){return null;}if(!p.wpbc_bfb_preview_token||!p.wpbc_bfb_preview_form_id){return null;}return{token:String(p.wpbc_bfb_preview_token),form_id:parseInt(p.wpbc_bfb_preview_form_id,10)||0,nonce:p.nonce?String(p.nonce):''};}catch(e){return null;}}/**
1496 * Resolve form status for submit.
1497 *
1498 * Priority:
1499 * 1) shortcode param exposed via _wpbc.booking__get_param_value(..., 'form_status')
1500 * 2) detect preview URL args
1501 * 3) fallback: published
1502 *
1503 * @param {number} resource_id
1504 * @return {string} 'preview'|'published'
1505 */function wpbc__get_form_status_for_submit(resource_id){var status='';try{if(typeof _wpbc!=='undefined'&&_wpbc.booking__get_param_value){status=_wpbc.booking__get_param_value(resource_id,'form_status');}}catch(e){}status=status==null?'':String(status);status=status.toLowerCase();// URL-based detection for preview iframe.
1506 var preview_args=wpbc__get_bfb_preview_args_from_location();if(preview_args){return'preview';}return status==='preview'?'preview':'published';}// == Backward-compatible wrappers (keep old global names working 100% as before). =====================================
1507 function mybooking_submit(submit_form,resource_id,wpdev_active_locale){return wpbc_booking_form_submit(submit_form,resource_id,wpdev_active_locale);}try{var ev=typeof CustomEvent==='function'?new CustomEvent('wpbc-ready'):document.createEvent('Event');if(ev.initEvent){ev.initEvent('wpbc-ready',true,true);}document.dispatchEvent(ev);console.log('wpbc-ready');}catch(e){console.error("WPBC event 'wpbc-ready' failed!",e);}
1508 //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2Rpc3QvYWxsL19vdXQvd3BiY19hbGwuanMiLCJuYW1lcyI6WyJ3cGJjX3RyaW0iLCJzdHJpbmdfdG9fdHJpbSIsIkFycmF5IiwiaXNBcnJheSIsImpvaW4iLCJ0cmltIiwid3BiY19pbl9hcnJheSIsImFycmF5X2hlcmUiLCJwX3ZhbCIsImkiLCJsIiwibGVuZ3RoIiwiaXNfcGxheWdyb3VuZF9vcmlnaW4iLCJsb2NhdGlvbiIsIm9yaWdpbiIsImlzX3BzZXVkb19saW5rIiwiYSIsImdldEF0dHJpYnV0ZSIsImhyZWYiLCJ0b0xvd2VyQ2FzZSIsImluZGV4T2YiLCJmaXhfdGFyZ2V0IiwiaGFzQXR0cmlidXRlIiwidGFyZ2V0IiwiaW5pdF9maXgiLCJub2RlcyIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvckFsbCIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwiY2xvc2VzdCIsInNjaGVkdWxlX2luaXQiLCJzZXRUaW1lb3V0IiwicmVhZHlTdGF0ZSIsIndwYmNfY2xvbmVfb2JqIiwib2JqIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwiX3dwYmMiLCIkIiwicF9zZWN1cmUiLCJzZWN1cml0eV9vYmoiLCJ1c2VyX2lkIiwibm9uY2UiLCJsb2NhbGUiLCJzZXRfc2VjdXJlX3BhcmFtIiwicGFyYW1fa2V5IiwicGFyYW1fdmFsIiwiZ2V0X3NlY3VyZV9wYXJhbSIsInBfY2FsZW5kYXJzIiwiY2FsZW5kYXJzX29iaiIsImNhbGVuZGFyX19pc19kZWZpbmVkIiwicmVzb3VyY2VfaWQiLCJjYWxlbmRhcl9faW5pdCIsImNhbGVuZGFyX19pc19wcm9wX2ludCIsInByb3BlcnR5X25hbWUiLCJwX2NhbGVuZGFyX2ludF9wcm9wZXJ0aWVzIiwiaXNfaW5jbHVkZSIsImluY2x1ZGVzIiwiY2FsZW5kYXJzX2FsbF9fc2V0IiwiY2FsZW5kYXJzX2FsbF9fZ2V0IiwiY2FsZW5kYXJfX2dldF9wYXJhbWV0ZXJzIiwiY2FsZW5kYXJfX3NldF9wYXJhbWV0ZXJzIiwiY2FsZW5kYXJfcHJvcGVydHlfb2JqIiwiaXNfY29tcGxldGVfb3ZlcndyaXRlIiwicHJvcF9uYW1lIiwiY2FsZW5kYXJfX3NldF9wYXJhbV92YWx1ZSIsInByb3BfdmFsdWUiLCJjYWxlbmRhcl9fZ2V0X3BhcmFtX3ZhbHVlIiwicGFyc2VJbnQiLCJwX2Jvb2tpbmdzIiwiYm9va2luZ3Nfb2JqIiwiYm9va2luZ3NfaW5fY2FsZW5kYXJfX2lzX2RlZmluZWQiLCJib29raW5nc19pbl9jYWxlbmRhcl9fZ2V0IiwiYm9va2luZ3NfaW5fY2FsZW5kYXJfX3NldCIsImNhbGVuZGFyX29iaiIsImJvb2tpbmdzX2luX2NhbGVuZGFyX19nZXRfZGF0ZXMiLCJib29raW5nc19pbl9jYWxlbmRhcl9fc2V0X2RhdGVzIiwiZGF0ZXNfb2JqIiwiYm9va2luZ3NfaW5fY2FsZW5kYXJfX2dldF9mb3JfZGF0ZSIsInNxbF9jbGFzc19kYXkiLCJib29raW5nX19zZXRfcGFyYW1fdmFsdWUiLCJib29raW5nX19nZXRfcGFyYW1fdmFsdWUiLCJib29raW5nc19pbl9jYWxlbmRhcnNfX3NldF9hbGwiLCJib29raW5nc19pbl9jYWxlbmRhcnNfX2dldF9hbGwiLCJwX3NlYXNvbnMiLCJzZWFzb25zX29iaiIsInNlYXNvbnNfX3NldCIsInNlYXNvbl9uYW1lX2tleSIsInB1c2giLCJzZWFzb25zX19nZXRfZm9yX2RhdGUiLCJwX290aGVyIiwib3RoZXJfb2JqIiwic2V0X290aGVyX3BhcmFtIiwiZ2V0X290aGVyX3BhcmFtIiwiZ2V0X290aGVyX3BhcmFtX19hbGwiLCJwX21lc3NhZ2VzIiwibWVzc2FnZXNfb2JqIiwic2V0X21lc3NhZ2UiLCJnZXRfbWVzc2FnZSIsImdldF9tZXNzYWdlc19fYWxsIiwialF1ZXJ5Iiwid2luZG93IiwiX19XUEJDX0RFViIsImRldiIsInNlZW4iLCJTZXQiLCJlbmFibGVkIiwib3V0IiwibGV2ZWwiLCJjb2RlIiwibXNnIiwiZXh0cmEiLCJjb25zb2xlIiwid2FybiIsImxvZyIsImRlYnVnIiwiZXJyb3IiLCJlcnJPck1zZyIsIkVycm9yIiwibWVzc2FnZSIsIlN0cmluZyIsIm9uY2UiLCJrZXkiLCJoYXMiLCJhZGQiLCJ0cnkiLCJmbiIsIl8iLCJyZWFzb24iLCJwX2JhbGFuY2VyIiwiYmFsYW5jZXJfb2JqIiwiYmFsYW5jZXJfX3NldF9tYXhfdGhyZWFkcyIsIm1heF90aHJlYWRzIiwiYmFsYW5jZXJfX2lzX2RlZmluZWQiLCJiYWxhbmNlcl9faW5pdCIsImZ1bmN0aW9uX25hbWUiLCJwYXJhbXMiLCJiYWxhbmNlX29iaiIsImJhbGFuY2VyX19pc19hbHJlYWR5X3J1biIsImJhbGFuY2VyX19pc19hbHJlYWR5X3dhaXQiLCJiYWxhbmNlcl9fY2FuX2lfcnVuIiwiYmFsYW5jZXJfX2FkZF90b19fcnVuIiwiYmFsYW5jZXJfX2FkZF90b19fd2FpdCIsImJhbGFuY2VyX19yZW1vdmVfZnJvbV9fd2FpdF9saXN0IiwicmVtb3ZlZF9lbCIsInNwbGljZSIsInBvcCIsImZpbHRlciIsInYiLCJiYWxhbmNlcl9fcmVtb3ZlX2Zyb21fX3J1bl9saXN0IiwiYmFsYW5jZXJfX3J1bl9uZXh0IiwiYmFsYW5jZXJfX3J1biIsIndwYmNfY2FsZW5kYXJfX2xvYWRfZGF0YV9fYWp4Iiwid3BiY19iYWxhbmNlcl9faXNfd2FpdCIsImJhbGFuY2VyX3N0YXR1cyIsIndwYmNfYmFsYW5jZXJfX2NvbXBsZXRlZCIsIndwYmNfY2FsZW5kYXJfc2hvdyIsImhhc0NsYXNzIiwiZXhpc3RpbmdfaW5zdCIsImRhdGVwaWNrIiwiX2dldEluc3QiLCJnZXQiLCJyZW1vdmVDbGFzcyIsImxvY2FsX19pc19yYW5nZV9zZWxlY3QiLCJsb2NhbF9fbXVsdGlfZGF5c19zZWxlY3RfbnVtIiwibG9jYWxfX21pbl9kYXRlIiwiRGF0ZSIsImxvY2FsX19tYXhfZGF0ZSIsIndwYmNfY2FsZW5kYXJfX2dldF9kYXRlc19zdGFydCIsIndwYmNfY2FsZW5kYXJfX2dldF9kYXRlc19lbmQiLCJ3cGJjX2VkaXRfYm9va2luZ19oYXNoIiwid3BiY19pc19lZGl0X2Jvb2tpbmdfY29udGV4dCIsIndwYmNfaXNfYWRkX2Jvb2tpbmdfYWRtaW5fcGFnZSIsImxvY2FsX19zdGFydF93ZWVrZGF5IiwibG9jYWxfX251bWJlcl9vZl9tb250aHMiLCJ0ZXh0IiwiYmVmb3JlU2hvd0RheSIsImpzX2RhdGUiLCJ3cGJjX19jYWxlbmRhcl9fYXBwbHlfY3NzX3RvX2RheXMiLCJvblNlbGVjdCIsInN0cmluZ19kYXRlcyIsImpzX2RhdGVzX2FyciIsIndwYmNfX2NhbGVuZGFyX19vbl9zZWxlY3RfZGF5cyIsIm9uSG92ZXIiLCJzdHJpbmdfZGF0ZSIsIndwYmNfX2NhbGVuZGFyX19vbl9ob3Zlcl9kYXlzIiwib25DaGFuZ2VNb250aFllYXIiLCJ5ZWFyIiwicmVhbF9tb250aCIsImpzX2RhdGVfXzFzdF9kYXlfaW5fbW9udGgiLCJzaG93T24iLCJudW1iZXJPZk1vbnRocyIsInN0ZXBNb250aHMiLCJwcmV2VGV4dCIsIm5leHRUZXh0IiwiZGF0ZUZvcm1hdCIsImNoYW5nZU1vbnRoIiwiY2hhbmdlWWVhciIsIm1pbkRhdGUiLCJtYXhEYXRlIiwic2hvd1N0YXR1cyIsIm11bHRpU2VwYXJhdG9yIiwiY2xvc2VBdFRvcCIsImZpcnN0RGF5IiwiZ290b0N1cnJlbnQiLCJoaWRlSWZOb1ByZXZOZXh0IiwibXVsdGlTZWxlY3QiLCJyYW5nZVNlbGVjdCIsInVzZVRoZW1lUm9sbGVyIiwid3BiY19jYWxlbmRhcnNfX2NsZWFyX2RheXNfaGlnaGxpZ2h0aW5nIiwic3RhcnRfYmtfbW9udGgiLCJ3cGJjX2NhbGVuZGFyX19zY3JvbGxfdG8iLCJ3cGJjX2dldF9ib29raW5nX3N0YXR1c2VzX19hc19hcnIiLCJkYXRlX2Jvb2tpbmdzX29iaiIsImJvb2tpbmdfc3RhdHVzIiwidG9TdHJpbmciLCJzcGxpdCIsIndwYmNfYm9va2luZ19zdGF0dXNlc19faGFzIiwiYm9va2luZ19zdGF0dXNlc19hcnIiLCJ3cGJjX2Jvb2tpbmdfc3RhdHVzZXNfX2hhc19wYXJ0IiwiYm9va2luZ19zdGF0dXNfcGFydCIsImRhdGUiLCJjYWxlbmRhcl9wYXJhbXNfYXJyIiwiZGF0ZXBpY2tfdGhpcyIsInRvZGF5X2RhdGUiLCJjbGFzc19kYXkiLCJ3cGJjX19nZXRfX3RkX2NsYXNzX2RhdGUiLCJ3cGJjX19nZXRfX3NxbF9jbGFzc19kYXRlIiwic2VsZWN0ZWRfZGF0ZXNfc3FsIiwid3BiY19nZXRfX3NlbGVjdGVkX2RhdGVzX3NxbF9fYXNfYXJyIiwiY3NzX2NsYXNzZXNfX2Zvcl9kYXRlIiwiZ2V0RGF5IiwiaXNfZGF5X3NlbGVjdGFibGUiLCJzZWFzb25fbmFtZXNfYXJyIiwic2Vhc29uX2tleSIsInJlcGxhY2UiLCJpc19zZXRfcGVuZGluZ19kYXlzX3NlbGVjdGFibGUiLCJkYXRlX2Jvb2tpbmdfb2JqIiwidG9vbHRpcF90ZXh0Iiwid3BiY19zZXRfdG9vbHRpcF9fX2Zvcl9fY2FsZW5kYXJfZGF0ZSIsImlzX3Vuc2VsZWN0YWJsZV9jYWxlbmRhciIsImlzX2Jvb2tpbmdfZm9ybV9leGlzdCIsImlzX2FkZF9ib29raW5nX21vZGFsX2NhbGVuZGFyIiwiY3NzX29mX2NhbGVuZGFyIiwiY3NzIiwid3BiY19fY2FsZW5kYXJfX2RvX2RheXNfaGlnaGxpZ2h0X19icyIsIndwYmNfY2FsZW5kYXJfX3Vuc2VsZWN0X2FsbF9kYXRlcyIsInJlbW92ZSIsInZhbCIsIndwYmNfX2NhbGVuZGFyX19kb19kYXlzX3NlbGVjdF9fYnMiLCJ3cGJjX2Rpc2FibGVfdGltZV9maWVsZHNfaW5fYm9va2luZ19mb3JtIiwibW91c2VfY2xpY2tlZF9kYXRlcyIsImFsbF9zZWxlY3RlZF9kYXRlc19hcnIiLCJ0cmlnZ2VyIiwicmVhZHkiLCJvbiIsImV2ZW50IiwiY2xvc2VkX3RpbWVyIiwibWlkZGxlX2RheXNfb3BhY2l0eSIsIm5vdCIsInRpbWVfZmllbGRzX29ial9hcnIiLCJ3cGJjX2dldF9fdGltZV9maWVsZHNfX2luX2Jvb2tpbmdfZm9ybV9fYXNfYXJyIiwic2VsZWN0ZWRfZGF0ZXNfYXJyIiwiY2hpbGRfcmVzb3VyY2VzX2FyciIsInNxbF9kYXRlIiwiY2hpbGRfcmVzb3VyY2VfaWQiLCJtZXJnZWRfc2Vjb25kcyIsInRpbWVfZmllbGRzX29iaiIsImlzX2ludGVyc2VjdCIsImlzX2NoZWNrX2luIiwidG9kYXlfdGltZV9fcmVhbCIsInRvZGF5X3RpbWVfX3NoaWZ0IiwiZmllbGRfa2V5IiwiZGlzYWJsZWQiLCJpc190aW1lX2luX3Bhc3QiLCJ3cGJjX2NoZWNrX2lzX3RpbWVfaW5fcGFzdCIsIm5hbWUiLCJob3dfbWFueV9yZXNvdXJjZXNfaW50ZXJzZWN0ZWQiLCJyZXNfa2V5IiwiYm9va2VkX3RpbWVfc2xvdHMiLCJ0aW1lc19hc19zZWNvbmRzIiwid3BiY19pc19pbnRlcnNlY3RfX3JhbmdlX3RpbWVfaW50ZXJ2YWwiLCJ3cGJjX2lzX2ludGVyc2VjdF9fb25lX3RpbWVfaW50ZXJ2YWwiLCJ3cGJjX19odG1sX190aW1lX2ZpZWxkX29wdGlvbnNfX3NldF9kaXNhYmxlZCIsImpzX2N1cnJlbnRfdGltZV90b19jaGVjayIsInNxbF9kYXRlX2FyciIsInNxbF9kYXRlX19taWRuaWdodCIsInNxbF9kYXRlX19taWRuaWdodF9taWxpc2Vjb25kcyIsImdldFRpbWUiLCJ0aW1lc19hc19zZWNvbmRzX2NoZWNrIiwidGltZV9BIiwidGltZV9pbnRlcnZhbF9CIiwiaiIsInRpbWVfaW50ZXJ2YWxfQSIsIndwYmNfaW50ZXJ2YWxzX19pc19pbnRlcnNlY3RlZCIsInRpbWVfZmllbGRzX2FyciIsImN0ZiIsInRpbWVfZmllbGQiLCJ0aW1lX29wdGlvbiIsImpxdWVyeV9vcHRpb24iLCJ2YWx1ZV9vcHRpb25fc2Vjb25kc19hcnIiLCJzdGFydF9lbmRfdGltZXNfYXJyIiwidGltZV9pbl9zZWNvbmRzIiwiYXR0ciIsInByb3AiLCJhZGRDbGFzcyIsInBhcmVudCIsImZpbmQiLCJ3cGJjX2lzX3RoaXNfdGltZXNsb3RfX2Z1bGxfZGF5X2Jvb2tlZCIsInRpbWVzbG90X2Fycl9pbl9zZWNvbmRzIiwibiIsInNvcnQiLCJ3cGJjX2dldF9fc2VsZWN0ZWRfdGltZV9maWVsZHNfX2luX2Jvb2tpbmdfZm9ybV9fYXNfYXJyIiwiaXNfb25seV9zZWxlY3RlZF90aW1lIiwidGV4dF90aW1lX2ZpZWxkc19hcnIiLCJ0ZiIsInRleHRfanF1ZXJ5IiwidGltZV9faF9tX19hcnIiLCJ0ZXh0X3RpbWVfaW5fc2Vjb25kcyIsInRleHRfdGltZXNfYXNfc2Vjb25kcyIsIndwYmNfY2FsZW5kYXJfX2dldF9pbnN0IiwiaW5zdCIsInN0YXlPcGVuIiwiZGF0ZXMiLCJfdXBkYXRlRGF0ZXBpY2siLCJtb250aCIsImN1cnNvckRhdGUiLCJzZXRGdWxsWWVhciIsInNldE1vbnRoIiwic2V0RGF0ZSIsImRyYXdNb250aCIsImdldE1vbnRoIiwiZHJhd1llYXIiLCJnZXRGdWxsWWVhciIsIl9ub3RpZnlDaGFuZ2UiLCJfYWRqdXN0SW5zdERhdGUiLCJfc2hvd0RhdGUiLCJ3cGJjX2lzX3RoaXNfZGF5X3NlbGVjdGFibGUiLCJ3cGJjX2lzX3RoaXNfZGF5X2Ftb25nX3NlbGVjdGVkX2RheXMiLCJqc19kYXRlX3RvX2NoZWNrIiwiZGF0ZV9pbmRleCIsImdldERhdGUiLCJ3cGJjX19nZXRfX2pzX2RhdGUiLCJzcWxfY2xhc3NfZGF0ZSIsInNxbF9jbGFzc19kYXRlX2FyciIsImRhdGVfanMiLCJzZXRIb3VycyIsInNldE1pbnV0ZXMiLCJzZXRTZWNvbmRzIiwic2V0TWlsbGlzZWNvbmRzIiwidGRfY2xhc3NfZGF5Iiwid3BiY19fZ2V0X19kYXRlX3BhcmFtc19fZnJvbV9zdHJpbmdfZGF0ZSIsInNlcGFyYXRvciIsImRhdGVfYXJyIiwiZGF0ZV9vYmoiLCJ3cGJjX2NhbGVuZGFyX19sb2FkaW5nX19zdGFydCIsIm5leHQiLCJhZnRlciIsIndwYmNfY2FsZW5kYXJfX2JsdXJfX3N0YXJ0Iiwid3BiY19jYWxlbmRhcl9fbG9hZGluZ19fc3RvcCIsIndwYmNfY2FsZW5kYXJfX2JsdXJfX3N0b3AiLCJ3cGJjX2NhbGVuZGFyX191cGRhdGVfbG9vayIsImpxX2NhbCIsIndwYmNfY2FsZW5kYXJfX3VwZGF0ZV9tb250aHNfbnVtYmVyIiwibW9udGhzX251bWJlciIsInNldHRpbmdzIiwid3BiY19fY2FsZW5kYXJfX2NoYW5nZV9za2luIiwic2VsZWN0ZWRfc2tpbl91cmwiLCJzdHlsZXNoZWV0IiwiZ2V0RWxlbWVudEJ5SWQiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJoZWFkSUQiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImNzc05vZGUiLCJjcmVhdGVFbGVtZW50IiwidHlwZSIsInNldEF0dHJpYnV0ZSIsInJlbCIsIm1lZGlhIiwiYXBwZW5kQ2hpbGQiLCJ3cGJjX19jc3NfX2NoYW5nZV9za2luIiwic3R5bGVzaGVldF9pZCIsIndwYmNfaW50ZXJ2YWxzX19tZXJnZV9pbmVyc2VjdGVkIiwiaW50ZXJ2YWxzIiwibWVyZ2VkIiwiYiIsIm1lcmdlZEludGVydmFsIiwiaW50ZXJ2YWwiLCJNYXRoIiwibWF4IiwiaW50ZXJ2YWxfQSIsImludGVydmFsX0IiLCJpc19pbnRlcnNlY3RlZCIsIm1pbiIsIndwYmNfZ2V0X2Fic19jbG9zZXN0X3ZhbHVlX2luX2FyciIsIm15VmFsdWUiLCJteUFycmF5IiwiZGlmZiIsImFicyIsImNsb3NldFZhbHVlIiwidGRfY2xhc3MiLCJ0ZF9lbCIsInVuZGVmaW5lZCIsIl90aXBweSIsIndwYmNfdGlwcHkiLCJjb250ZW50IiwicmVmZXJlbmNlIiwicG9wb3Zlcl9jb250ZW50IiwiYWxsb3dIVE1MIiwiaW50ZXJhY3RpdmUiLCJoaWRlT25DbGljayIsImludGVyYWN0aXZlQm9yZGVyIiwibWF4V2lkdGgiLCJ0aGVtZSIsInBsYWNlbWVudCIsImRlbGF5IiwiaWdub3JlQXR0cmlidXRlcyIsInRvdWNoIiwiYXBwZW5kVG8iLCJib2R5Iiwid3BiY19kYXRlc19fZGF5c19iZXR3ZWVuIiwiZGF0ZTEiLCJkYXRlMiIsIk9ORV9EQVkiLCJkYXRlMV9tcyIsImRhdGUyX21zIiwiZGlmZmVyZW5jZV9tcyIsInJvdW5kIiwid3BiY19kYXRlc19faXNfY29uc2VjdXRpdmVfZGF0ZXNfYXJyX3JhbmdlIiwic3FsX2RhdGVzX2FyciIsInByZXZpb3NfZGF0ZSIsImN1cnJlbnRfZGF0ZSIsIndwYmNfYXV0b19zZWxlY3RfZGF0ZXNfaW5fY2FsZW5kYXIiLCJjaGVja19pbl95bWQiLCJjaGVja19vdXRfeW1kIiwiZGF0ZXNfdG9fc2VsZWN0X2FyciIsIndwYmNfY2FsX2RheXNfc2VsZWN0X19tdWx0aXBsZSIsImNoZWNrX2luX2pzIiwidGRfY2VsbCIsIndwYmNfZ2V0X2NsaWNrZWRfdGQiLCJpZCIsIl9zZWxlY3REYXkiLCJjaGVja19vdXRfanMiLCJ0ZF9jZWxsX291dCIsImRhdGVzX2FyciIsIndwYmNfZ2V0X3NlbGVjdGlvbl9kYXRlc19qc19zdHJfYXJyX19mcm9tX2FyciIsIndwYmNfZ2V0X3NlbGVjdGlvbl9kYXRlc19qc19zdHJfYXJyX19mcm9tX2NoZWNrX2luX291dCIsImRhdGVzX2pzIiwic3RyX2RhdGUiLCJkYXlfYXZhaWxhYmlsaXR5IiwiY2hlY2tfb3V0X2RhdGUiLCJjaGVja291dF90aW1lc3RhbXAiLCJjYWxlbmRhcl9odG1sX2lkIiwib3JpZ2luYWxfYXJyYXkiLCJia19kaXN0aW5jdF9kYXRlcyIsImNoZWNrX2luX2RhdGUiLCJvcmlnaW5hbF9jaGVja19pbl9kYXRlIiwiX3Jlc3RyaWN0TWluTWF4IiwiX2RldGVybWluZURhdGUiLCJkYXRlX291dCIsIm9yaWdpbmFsX2NoZWNrX291dF9kYXRlIiwibWV3RGF0ZSIsIm9uZV9kYXRlX3N0ciIsImQiLCJ1cmxfcGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwic2VhcmNoIiwic2VsZWN0X2RhdGVzX2luX2NhbGVuZGFyX2lkIiwibG9hZGVkX3Jlc291cmNlX2lkIiwid3BiY19hdXRvX2ZpbGxfdmFsdWUiLCJyZXBsYWNlQWxsIiwid3BiY19hdXRvX2ZpbGxfYm9va2luZ19maWVsZHMiLCJhdXRvX2ZpbGxfc3RyIiwiZmllbGRzX2FyciIsIndwYmNfYXV0b19maWxsX2Jvb2tpbmdfZmllbGRzX19wYXJzZSIsImRhdGFfc3RyIiwiZmlsdGVyX29wdGlvbnNfYXJyIiwiZGF0YV9hcnIiLCJteV9mb3JtX2ZpZWxkIiwiZmlsdGVyX25hbWUiLCJmaWx0ZXJfdmFsdWUiLCJ3cGJjX2F1dG9fZmlsbF9zZWFyY2hfZmllbGRzX19wYXJzZSIsImZpbHRlcl90eXBlIiwid3BiY19jYWxlbmRhcl9fYXV0b191cGRhdGVfbW9udGhzX251bWJlcl9fb25fcmVzaXplIiwid2lkdGgiLCJ3cGJjX2NhbGVuZGFyc19fYXV0b191cGRhdGVfbW9udGhzX251bWJlciIsImFsbF9jYWxlbmRhcnNfYXJyIiwiY2FsZW5kYXJfaWQiLCJzbGljZSIsIndwYmNfY2FsZW5kYXJfX2dldF9kYXRlX3BhcmFtZXRlciIsInBhcmFtZXRlcl9zdHIiLCJkYXRlX2V4cGVjdGVkX3ltZCIsImRhdGVfZXhwZWN0ZWRfeW1kX2FyciIsImRheSIsIndwYmNfY2FsX19yZV9pbml0Iiwid3BiY19jYWxfZGF5c19zZWxlY3RfX3JlX2luaXQiLCJ3cGJjX2NhbF9yZWFkeV9kYXlzX3NlbGVjdF9fc2luZ2xlIiwid3BiY19jYWxfZGF5c19zZWxlY3RfX3NpbmdsZSIsIndwYmNfY2FsX3JlYWR5X2RheXNfc2VsZWN0X19tdWx0aXBsZSIsIndwYmNfY2FsX3JlYWR5X2RheXNfc2VsZWN0X19maXhlZCIsImRheXNfbnVtYmVyIiwid2Vla19kYXlzX19zdGFydCIsIndwYmNfY2FsX2RheXNfc2VsZWN0X19maXhlZCIsIndwYmNfY2FsX3JlYWR5X2RheXNfc2VsZWN0X19yYW5nZSIsImRheXNfbWluIiwiZGF5c19tYXgiLCJkYXlzX3NwZWNpZmljIiwid3BiY19jYWxfZGF5c19zZWxlY3RfX3JhbmdlIiwidGFyZ2V0X2VsbSIsImRhdGVzX3N0YXJ0IiwiZGF0ZXNfZW5kIiwiZ3JvdXBDb2xsYXBzZWQiLCJ3cGJjX2hvb2tfX2luaXRfdGltZXNlbGVjdG9yIiwicG9zdCIsIndwYmNfdXJsX2FqYXgiLCJhY3Rpb24iLCJ3cGJjX2FqeF91c2VyX2lkIiwid3BiY19hanhfbG9jYWxlIiwiY2FsZW5kYXJfcmVxdWVzdF9wYXJhbXMiLCJyZXNwb25zZV9kYXRhIiwidGV4dFN0YXR1cyIsImpxWEhSIiwiZ3JvdXBFbmQiLCJhanhfcG9zdF9kYXRhX19yZXNvdXJjZV9pZCIsIndwYmNfZ2V0X3Jlc291cmNlX2lkX19mcm9tX2FqeF9wb3N0X2RhdGFfdXJsIiwiZGF0YSIsImpxX25vZGUiLCJ3cGJjX2dldF9jYWxlbmRhcl9fanFfbm9kZV9fZm9yX21lc3NhZ2VzIiwibWVzc2FnZV90eXBlIiwid3BiY19mcm9udF9lbmRfX3Nob3dfbWVzc2FnZSIsIndwYmNfdXBkYXRlX2NhcGFjaXR5X2hpbnQiLCJmYWlsIiwiZXJyb3JUaHJvd24iLCJlcnJvcl9tZXNzYWdlIiwic3RhdHVzIiwibWVzc2FnZV9zaG93X2RlbGF5IiwicmVzcG9uc2VUZXh0IiwiYWp4X3Bvc3RfZGF0YV91cmxfcGFyYW1zIiwiY2FsZW5kYXJfcmVzb3VyY2VfaWQiLCJ3cGJjX2dldF91cmlfcGFyYW1fYnlfbmFtZSIsInVybCIsImRlY29kZVVSSUNvbXBvbmVudCIsInJlZ2V4IiwiUmVnRXhwIiwicmVzdWx0cyIsImV4ZWMiLCJwYXJhbXNfZGVmYXVsdCIsInBfa2V5IiwidW5pcXVlX2Rpdl9pZCIsInNjcm9sbF90b19lbGVtZW50IiwianFfZWxfbWVzc2FnZSIsImlzX3Nob3dfbWVzc2FnZSIsImFwcGVuZCIsImh0bWwiLCJzaWJsaW5ncyIsImlzIiwiYmVmb3JlIiwibmV4dEFsbCIsImZhZGVPdXQiLCJjbG9zZWRfdGltZXIyIiwicGFyZW50X2VscyIsInBhcmVudHMiLCJtYXAiLCJzaG93Iiwid3BiY19kb19zY3JvbGwiLCJ3cGJjX2Zyb250X2VuZF9fc2hvd19tZXNzYWdlX19lcnJvciIsIm5vdGljZV9tZXNzYWdlX2lkIiwid3BiY19mcm9udF9lbmRfX3Nob3dfbWVzc2FnZV9fZXJyb3JfdW5kZXJfZWxlbWVudCIsIm1lc3NhZ2VfZGVsYXkiLCJ3cGJjX2Zyb250X2VuZF9fc2hvd19tZXNzYWdlX19lcnJvcl9hYm92ZV9lbGVtZW50Iiwid3BiY19mcm9udF9lbmRfX3Nob3dfbWVzc2FnZV9fd2FybmluZyIsIndwYmNfaGlnaGxpZ2h0X2Vycm9yX29uX2Zvcm1fZmllbGQiLCJ3cGJjX2Zyb250X2VuZF9fc2hvd19tZXNzYWdlX193YXJuaW5nX3VuZGVyX2VsZW1lbnQiLCJ3cGJjX2Zyb250X2VuZF9fc2hvd19tZXNzYWdlX193YXJuaW5nX2Fib3ZlX2VsZW1lbnQiLCJqcV9ub2RlX2FyciIsImV4dHJhX3NoaWZ0X29mZnNldCIsInRhcmdldE9mZnNldCIsIm9mZnNldCIsInRvcCIsImZpcnN0IiwiYW5pbWF0ZSIsInNjcm9sbFRvcCIsIndwYmNfZGVmaW5lX3RpcHB5X3BvcG92ZXIiLCJwb3BvdmVyX3RpdGxlIiwic3RhdGUiLCJpc1Zpc2libGUiLCJoaWRlIiwid3BiY19kZWZpbmVfaGlkZV90aXBweV9vbl9zY3JvbGwiLCJoaWRlQWxsIiwidyIsInByb2Nlc3NlZF9zZXQiLCJXZWFrU2V0IiwicXVlcnlfb25lIiwic2VsZWN0b3IiLCJyb290IiwicXVlcnlTZWxlY3RvciIsInF1ZXJ5X2FsbCIsIm9uX3JlYWR5Iiwic2FmZV9jbGVhciIsImludGVydmFsX2lkIiwiY2xlYXJJbnRlcnZhbCIsIm1hcmtfcHJvY2Vzc2VkIiwiZWwiLCJkYXRhc2V0Iiwid3BiY1Byb2Nlc3NlZCIsImlzX3Byb2Nlc3NlZCIsImdldF9tZXNzYWdlcyIsInJpZCIsInJpZF9pbnQiLCJkdXBsaWNhdGUiLCJpbml0X2ZhaWxlZCIsInN1cHBvcnQiLCJsaWJfanEiLCJsaWJfZHAiLCJsaWJfd3BiYyIsIndyYXBfaHRtbCIsImhhc19qcSIsImhhc19kcCIsImhhc193cGJjIiwibm9ybWFsaXplX3JpZCIsImdldF9yaWRfY291bnRzIiwiciIsImxvYWRlcnMiLCJjb250YWluZXJzIiwiaXNfZHVwbGljYXRlX3JpZCIsImMiLCJpc19yZXBsYWNlZCIsImNvbnRhaW5lciIsImxvYWRlcl9zdGlsbF9pbl9kb20iLCJjb250YWlucyIsImNhbGVuZGFyX2V4aXN0cyIsInN0YXJ0X2ZvciIsIndwYmNSaWQiLCJncmFjZV9tcyIsIndwYmNHcmFjZSIsImNvbnRhaW5lcl9pZCIsInRleHRfZWwiLCJyZXBsYWNlZF9ub3ciLCJwb2xsX2lkIiwic2V0SW50ZXJ2YWwiLCJvYnNlcnZlciIsImRpc2Nvbm5lY3QiLCJNdXRhdGlvbk9ic2VydmVyIiwib2JzZXJ2ZSIsImNoaWxkTGlzdCIsInN1YnRyZWUiLCJmaW5hbGl6ZV9hZnRlcl9ncmFjZSIsIk0iLCJpbm5lckhUTUwiLCJib290c3RyYXBfZXhpc3RpbmciLCJmb3JFYWNoIiwib2JzZXJ2ZV9uZXdfbG9hZGVycyIsImRvY19vYnNlcnZlciIsIm11dGF0aW9ucyIsImFkZGVkTm9kZXMiLCJub2RlIiwibm9kZVR5cGUiLCJtYXRjaGVzIiwiaW5uZXIiLCJkb2N1bWVudEVsZW1lbnQiLCJXUEJDX0ZFIiwiYXV0b2ZpbGxfYm9va2luZ19mb3JtX2ZpZWxkcyIsImZpbGxfdmFsdWVzIiwiZm9ybV9pZCIsImRhdGVfbmFtZSIsInN1Ym1pdF9mb3JtIiwicnVsZXMiLCJhcnJheV9ydWxlcyIsImVsZW1lbnRzIiwiY291bnQiLCJ2YWx1ZSIsInJlIiwidGVzdCIsIm5pY2tuYW1lIiwibGFzdF9uYW1lIiwiZmlyc3RfbmFtZSIsImVtYWlsIiwicGhvbmUiLCJuYl9lbmZhbnQiLCJ3cGJjX2Jvb2tpbmdfZm9ybV9zdWJtaXQiLCJ3cGRldl9hY3RpdmVfbG9jYWxlIiwiaXNfZXJyb3IiLCJ3cGJjX2NoZWNrX2Vycm9yc19pbl9ib29raW5nX2Zvcm0iLCJkYXRlX2lucHV0IiwiZGF0ZV92YWx1ZSIsImFycl9vZl9zZWxlY3RlZF9hZGRpdGlvbmFsX2NhbGVuZGFycyIsIndwYmNfZ2V0X2Fycl9vZl9zZWxlY3RlZF9hZGRpdGlvbmFsX2NhbGVuZGFycyIsIndwYmNfaXNfdGhpc190aW1lX3NlbGVjdGlvbl9ub3RfYXZhaWxhYmxlIiwiYWRkaXRpb25hbF9jYWxlbmRhcnNfZWwiLCJpZF9hZGRpdGlvbmFsX3N0ciIsImlkX2FkZGl0aW9uYWxfYXJyIiwiaXNfdGltZXNfZGF0ZXNfb2siLCJpYSIsImFkZF9pZCIsImFkZF9kYXRlX2VsIiwiYWRkX2RhdGVfdmFsIiwiZm9ybWRhdGEiLCJpbnBfdmFsdWUiLCJpbnBfdGl0bGVfdmFsdWUiLCJlbGVtZW50IiwiZWxfdHlwZSIsIndwYmNfZXNjYXBlX3NlcmlhbGl6ZWRfdmFsdWUiLCJ3cGJjX2dldF9pbnB1dF9lbGVtZW50X3R5cGUiLCJ0YWdOYW1lIiwidGFnIiwiY2hlY2tlZCIsImNsYXNzTmFtZSIsImlucHV0X2VsZW1lbnRfdHlwZSIsImxhYmVsX2VsZW1lbnQiLCJ3cGJjX19pc19sZXNzX3RoYW5fcmVxdWlyZWRfX29mX21heF9hdmFpbGFibGVfc2xvdHNfX2JsIiwicmVnX2VtYWlsIiwicHJpbWFyeV9lbWFpbF9uYW1lIiwibWF0Y2giLCJzdWJzdHIiLCJjbGVhbl9maWVsZF9uYW1lIiwicmVzb3VyY2VfaWRfc3RyIiwiY2FwdGNoYSIsIndwYmNfZm9ybV9zdWJtaXRfc2VuZCIsImNhcHRjaGFfY2hhbGFuZ2UiLCJ1c2VyX2NhcHRjaGEiLCJteV9ib29raW5nX2Zvcm0iLCJib29raW5nX2Zvcm1fdHlwZV9lbCIsIm15X2Jvb2tpbmdfaGFzaCIsImlzX3NlbmRfZW1laWxzIiwiJGlzX3NlbmRfZW1haWxfdG9nZ2xlIiwiJG1vZGFsX3NlbmRfZW1haWxfdG9nZ2xlIiwiZGF0ZV9lbCIsIndwYmNfc2VuZF9hamF4X3N1Ym1pdCIsIndwYmNfYm9va2luZ19mb3JtX19zcGluX2xvYWRlcl9fc2hvdyIsIndwYmNfcmV3cml0ZV9maWVsZF9uYW1lX3N1ZmZpeCIsImZpZWxkX25hbWUiLCJvbGRfaWQiLCJuZXdfaWQiLCJvbGRfaWRfc3RyIiwibmV3X2lkX3N0ciIsImlkX2FkZGl0aW9uYWwiLCJmb3JtZGF0YV9hZGRpdGlvbmFsX2FyciIsImZvcm1kYXRhX2FkZGl0aW9uYWwiLCJ3cGJjX2Jvb2tpbmdfZm9ybV9fb25fc3VibWl0X191aV9lbGVtZW50c19kaXNhYmxlIiwiZm9ybV9zdGF0dXMiLCJ3cGJjX19nZXRfZm9ybV9zdGF0dXNfZm9yX3N1Ym1pdCIsInByZXZpZXdfYXJncyIsIndwYmNfX2dldF9iZmJfcHJldmlld19hcmdzX2Zyb21fbG9jYXRpb24iLCJyZXF1ZXN0X3BhcmFtcyIsInRva2VuIiwiaXNfZXhpdCIsIndwYmNfYWp4X2Jvb2tpbmdfX2NyZWF0ZSIsIndwYmNfX3BhcnNlX3F1ZXJ5X3N0cmluZyIsInFzIiwicGFydHMiLCJrdiIsImsiLCJwIiwid3BiY19iZmJfcHJldmlldyIsIndwYmNfYmZiX3ByZXZpZXdfdG9rZW4iLCJ3cGJjX2JmYl9wcmV2aWV3X2Zvcm1faWQiLCJteWJvb2tpbmdfc3VibWl0IiwiZXYiLCJDdXN0b21FdmVudCIsImNyZWF0ZUV2ZW50IiwiaW5pdEV2ZW50IiwiZGlzcGF0Y2hFdmVudCJdLCJzb3VyY2VzIjpbIndwYmNfdXRpbHMuanMiLCJ3cGJjLmpzIiwiZGV2X2xvZy5qcyIsImFqeF9sb2FkX2JhbGFuY2VyLmpzIiwid3BiY19jYWwuanMiLCJkYXlzX3NlbGVjdF9jdXN0b20uanMiLCJ3cGJjX2NhbF9hanguanMiLCJ3cGJjX2ZlX21lc3NhZ2VzLmpzIiwidGltZWxpbmVfcG9wb3Zlci5qcyIsIndwYmNfY2FsX2xvYWRlci5qcyIsImF1dG9maWxsX2ZpZWxkcy5qcyIsImJvb2tpbmdfZm9ybV9zdWJtaXQuanMiLCJ3cGJjX3JlYWR5X2V2ZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogSmF2YVNjcmlwdCBVdGlsIEZ1bmN0aW9uc1x0XHQuLi9pbmNsdWRlcy9fX2pzL3V0aWxzL3dwYmNfdXRpbHMuanNcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRyaW0gIHN0cmluZ3MgYW5kIGFycmF5IGpvaW5lZCB3aXRoICAoLClcclxuICpcclxuICogQHBhcmFtIHN0cmluZ190b190cmltICAgc3RyaW5nIC8gYXJyYXlcclxuICogQHJldHVybnMgc3RyaW5nXHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX3RyaW0oc3RyaW5nX3RvX3RyaW0pIHtcclxuXHJcblx0aWYgKCBBcnJheS5pc0FycmF5KCBzdHJpbmdfdG9fdHJpbSApICkge1xyXG5cdFx0c3RyaW5nX3RvX3RyaW0gPSBzdHJpbmdfdG9fdHJpbS5qb2luKCAnLCcgKTtcclxuXHR9XHJcblxyXG5cdGlmICggJ3N0cmluZycgPT0gdHlwZW9mIChzdHJpbmdfdG9fdHJpbSkgKSB7XHJcblx0XHRzdHJpbmdfdG9fdHJpbSA9IHN0cmluZ190b190cmltLnRyaW0oKTtcclxuXHR9XHJcblxyXG5cdHJldHVybiBzdHJpbmdfdG9fdHJpbTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIGVsZW1lbnQgaW4gYXJyYXlcclxuICpcclxuICogQHBhcmFtIGFycmF5X2hlcmVcdFx0YXJyYXlcclxuICogQHBhcmFtIHBfdmFsXHRcdFx0XHRlbGVtZW50IHRvICBjaGVja1xyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfaW5fYXJyYXkoYXJyYXlfaGVyZSwgcF92YWwpIHtcclxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheV9oZXJlLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcclxuXHRcdGlmICggYXJyYXlfaGVyZVtpXSA9PSBwX3ZhbCApIHtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFByZXZlbnQgb3BlbmluZyBibGFuayB3aW5kb3dzIG9uIFdvcmRQcmVzcyBwbGF5Z3JvdW5kIGZvciBwc2V1ZG8gbGlua3MgbGlrZSB0aGlzOiA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCI+IG9yICMgdG8gc3RheSBpbiB0aGUgc2FtZSB0YWIuXHJcbiAqL1xyXG4oZnVuY3Rpb24gKCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0ZnVuY3Rpb24gaXNfcGxheWdyb3VuZF9vcmlnaW4oKSB7XHJcblx0XHRyZXR1cm4gbG9jYXRpb24ub3JpZ2luID09PSAnaHR0cHM6Ly9wbGF5Z3JvdW5kLndvcmRwcmVzcy5uZXQnO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaXNfcHNldWRvX2xpbmsoYSkge1xyXG5cdFx0aWYgKCAhYSB8fCAhYS5nZXRBdHRyaWJ1dGUgKSByZXR1cm4gdHJ1ZTtcclxuXHRcdHZhciBocmVmID0gKGEuZ2V0QXR0cmlidXRlKCAnaHJlZicgKSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHQhaHJlZiB8fFxyXG5cdFx0XHRocmVmID09PSAnIycgfHxcclxuXHRcdFx0aHJlZi5pbmRleE9mKCAnIycgKSA9PT0gMCB8fFxyXG5cdFx0XHRocmVmLmluZGV4T2YoICdqYXZhc2NyaXB0OicgKSA9PT0gMCB8fFxyXG5cdFx0XHRocmVmLmluZGV4T2YoICdtYWlsdG86JyApID09PSAwIHx8XHJcblx0XHRcdGhyZWYuaW5kZXhPZiggJ3RlbDonICkgPT09IDBcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBmaXhfdGFyZ2V0KGEpIHtcclxuXHRcdGlmICggISBhICkgcmV0dXJuO1xyXG5cdFx0aWYgKCBpc19wc2V1ZG9fbGluayggYSApIHx8IGEuaGFzQXR0cmlidXRlKCAnZGF0YS13cC1uby1ibGFuaycgKSApIHtcclxuXHRcdFx0YS50YXJnZXQgPSAnX3NlbGYnO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdF9maXgoKSB7XHJcblx0XHQvLyBPcHRpb25hbDogY2xlYW4gdXAgY3VycmVudCBET00gKGhhcm1sZXNz4oCUYWZmZWN0cyBvbmx5IHBzZXVkby9kYXRhbWFya2VkIGxpbmtzKS5cclxuXHRcdHZhciBub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdhW2hyZWZdJyApO1xyXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKysgKSBmaXhfdGFyZ2V0KCBub2Rlc1tpXSApO1xyXG5cclxuXHRcdC8vIExhdGUgYnViYmxlLXBoYXNlIGxpc3RlbmVycyAocnVuIGFmdGVyIFBsYXlncm91bmQncyBoYW5kbGVycylcclxuXHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdHZhciBhID0gZS50YXJnZXQgJiYgZS50YXJnZXQuY2xvc2VzdCA/IGUudGFyZ2V0LmNsb3Nlc3QoICdhW2hyZWZdJyApIDogbnVsbDtcclxuXHRcdFx0aWYgKCBhICkgZml4X3RhcmdldCggYSApO1xyXG5cdFx0fSwgZmFsc2UgKTtcclxuXHJcblx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnZm9jdXNpbicsIGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdHZhciBhID0gZS50YXJnZXQgJiYgZS50YXJnZXQuY2xvc2VzdCA/IGUudGFyZ2V0LmNsb3Nlc3QoICdhW2hyZWZdJyApIDogbnVsbDtcclxuXHRcdFx0aWYgKCBhICkgZml4X3RhcmdldCggYSApO1xyXG5cdFx0fSApO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2NoZWR1bGVfaW5pdCgpIHtcclxuXHRcdGlmICggIWlzX3BsYXlncm91bmRfb3JpZ2luKCkgKSByZXR1cm47XHJcblx0XHRzZXRUaW1lb3V0KCBpbml0X2ZpeCwgMTAwMCApOyAvLyBlbnN1cmUgd2UgYXR0YWNoIGFmdGVyIFBsYXlncm91bmQncyBzY3JpcHQuXHJcblx0fVxyXG5cclxuXHRpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJyApIHtcclxuXHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdET01Db250ZW50TG9hZGVkJywgc2NoZWR1bGVfaW5pdCApO1xyXG5cdH0gZWxzZSB7XHJcblx0XHRzY2hlZHVsZV9pbml0KCk7XHJcblx0fVxyXG59KSgpOyIsIlwidXNlIHN0cmljdFwiO1xyXG4vKipcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqXHRpbmNsdWRlcy9fX2pzL3dwYmMvd3BiYy5qc1xyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICovXHJcblxyXG4vKipcclxuICogRGVlcCBDbG9uZSBvZiBvYmplY3Qgb3IgYXJyYXlcclxuICpcclxuICogQHBhcmFtIG9ialxyXG4gKiBAcmV0dXJucyB7YW55fVxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19jbG9uZV9vYmooIG9iaiApe1xyXG5cclxuXHRyZXR1cm4gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIG9iaiApICk7XHJcbn1cclxuXHJcblxyXG5cclxuLyoqXHJcbiAqIE1haW4gX3dwYmMgSlMgb2JqZWN0XHJcbiAqL1xyXG5cclxudmFyIF93cGJjID0gKGZ1bmN0aW9uICggb2JqLCAkKSB7XHJcblxyXG5cdC8vIFNlY3VyZSBwYXJhbWV0ZXJzIGZvciBBamF4XHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHR2YXIgcF9zZWN1cmUgPSBvYmouc2VjdXJpdHlfb2JqID0gb2JqLnNlY3VyaXR5X29iaiB8fCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVzZXJfaWQ6IDAsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG5vbmNlICA6ICcnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsb2NhbGUgOiAnJ1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICB9O1xyXG5cdG9iai5zZXRfc2VjdXJlX3BhcmFtID0gZnVuY3Rpb24gKCBwYXJhbV9rZXksIHBhcmFtX3ZhbCApIHtcclxuXHRcdHBfc2VjdXJlWyBwYXJhbV9rZXkgXSA9IHBhcmFtX3ZhbDtcclxuXHR9O1xyXG5cclxuXHRvYmouZ2V0X3NlY3VyZV9wYXJhbSA9IGZ1bmN0aW9uICggcGFyYW1fa2V5ICkge1xyXG5cdFx0cmV0dXJuIHBfc2VjdXJlWyBwYXJhbV9rZXkgXTtcclxuXHR9O1xyXG5cclxuXHJcblx0Ly8gQ2FsZW5kYXJzIFx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHZhciBwX2NhbGVuZGFycyA9IG9iai5jYWxlbmRhcnNfb2JqID0gb2JqLmNhbGVuZGFyc19vYmogfHwge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBzb3J0ICAgICAgICAgICAgOiBcImJvb2tpbmdfaWRcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gc29ydF90eXBlICAgICAgIDogXCJERVNDXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHBhZ2VfbnVtICAgICAgICA6IDEsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHBhZ2VfaXRlbXNfY291bnQ6IDEwLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBjcmVhdGVfZGF0ZSAgICAgOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBrZXl3b3JkICAgICAgICAgOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBzb3VyY2UgICAgICAgICAgOiBcIlwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogIENoZWNrIGlmIGNhbGVuZGFyIGZvciBzcGVjaWZpYyBib29raW5nIHJlc291cmNlIGRlZmluZWQgICA6OiAgIHRydWUgfCBmYWxzZVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd8aW50fSByZXNvdXJjZV9pZFxyXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxyXG5cdCAqL1xyXG5cdG9iai5jYWxlbmRhcl9faXNfZGVmaW5lZCA9IGZ1bmN0aW9uICggcmVzb3VyY2VfaWQgKSB7XHJcblxyXG5cdFx0cmV0dXJuICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mKCBwX2NhbGVuZGFyc1sgJ2NhbGVuZGFyXycgKyByZXNvdXJjZV9pZCBdICkgKTtcclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiAgQ3JlYXRlIENhbGVuZGFyIGluaXRpYWxpemluZ1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd8aW50fSByZXNvdXJjZV9pZFxyXG5cdCAqL1xyXG5cdG9iai5jYWxlbmRhcl9faW5pdCA9IGZ1bmN0aW9uICggcmVzb3VyY2VfaWQgKSB7XHJcblxyXG5cdFx0cF9jYWxlbmRhcnNbICdjYWxlbmRhcl8nICsgcmVzb3VyY2VfaWQgXSA9IHt9O1xyXG5cdFx0cF9jYWxlbmRhcnNbICdjYWxlbmRhcl8nICsgcmVzb3VyY2VfaWQgXVsgJ2lkJyBdID0gcmVzb3VyY2VfaWQ7XHJcblx0XHRwX2NhbGVuZGFyc1sgJ2NhbGVuZGFyXycgKyByZXNvdXJjZV9pZCBdWyAncGVuZGluZ19kYXlzX3NlbGVjdGFibGUnIF0gPSBmYWxzZTtcclxuXHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogQ2hlY2sgIGlmIHRoZSB0eXBlIG9mIHRoaXMgcHJvcGVydHkgIGlzIElOVFxyXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eV9uYW1lXHJcblx0ICogQHJldHVybnMge2Jvb2xlYW59XHJcblx0ICovXHJcblx0b2JqLmNhbGVuZGFyX19pc19wcm9wX2ludCA9IGZ1bmN0aW9uICggcHJvcGVydHlfbmFtZSApIHtcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZpeEluOiA5LjkuMC4yOS5cclxuXHJcblx0XHR2YXIgcF9jYWxlbmRhcl9pbnRfcHJvcGVydGllcyA9IFsnZHluYW1pY19fZGF5c19taW4nLCAnZHluYW1pY19fZGF5c19tYXgnLCAnZml4ZWRfX2RheXNfbnVtJ107XHJcblxyXG5cdFx0dmFyIGlzX2luY2x1ZGUgPSBwX2NhbGVuZGFyX2ludF9wcm9wZXJ0aWVzLmluY2x1ZGVzKCBwcm9wZXJ0eV9uYW1lICk7XHJcblxyXG5cdFx0cmV0dXJuIGlzX2luY2x1ZGU7XHJcblx0fTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldCBwYXJhbXMgZm9yIGFsbCAgY2FsZW5kYXJzXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge29iamVjdH0gY2FsZW5kYXJzX29ialx0XHRPYmplY3QgeyBjYWxlbmRhcl8xOiB7fSB9XHJcblx0ICogXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IGNhbGVuZGFyXzM6IHt9LCAuLi4gfVxyXG5cdCAqL1xyXG5cdG9iai5jYWxlbmRhcnNfYWxsX19zZXQgPSBmdW5jdGlvbiAoIGNhbGVuZGFyc19vYmogKSB7XHJcblx0XHRwX2NhbGVuZGFycyA9IGNhbGVuZGFyc19vYmo7XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogR2V0IGJvb2tpbmdzIGluIGFsbCBjYWxlbmRhcnNcclxuXHQgKlxyXG5cdCAqIEByZXR1cm5zIHtvYmplY3R8e319XHJcblx0ICovXHJcblx0b2JqLmNhbGVuZGFyc19hbGxfX2dldCA9IGZ1bmN0aW9uICgpIHtcclxuXHRcdHJldHVybiBwX2NhbGVuZGFycztcclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiBHZXQgY2FsZW5kYXIgb2JqZWN0ICAgOjogICB7IGlkOiAxLCDigKYgfVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd8aW50fSByZXNvdXJjZV9pZFx0XHRcdFx0ICAnMidcclxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fGJvb2xlYW59XHRcdFx0XHRcdHsgaWQ6IDIgLOKApiB9XHJcblx0ICovXHJcblx0b2JqLmNhbGVuZGFyX19nZXRfcGFyYW1ldGVycyA9IGZ1bmN0aW9uICggcmVzb3VyY2VfaWQgKSB7XHJcblxyXG5cdFx0aWYgKCBvYmouY2FsZW5kYXJfX2lzX2RlZmluZWQoIHJlc291cmNlX2lkICkgKXtcclxuXHJcblx0XHRcdHJldHVybiBwX2NhbGVuZGFyc1sgJ2NhbGVuZGFyXycgKyByZXNvdXJjZV9pZCBdO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldCBjYWxlbmRhciBvYmplY3QgICA6OiAgIHsgZGF0ZXM6ICBPYmplY3QgeyBcIjIwMjMtMDctMjFcIjoge+KApn0sIFwiMjAyMy0wNy0yMlwiOiB74oCmfSwgXCIyMDIzLTA3LTIzXCI6IHvigKZ9LCDigKYgfVxyXG5cdCAqXHJcblx0ICogaWYgY2FsZW5kYXIgb2JqZWN0ICBub3QgZGVmaW5lZCwgdGhlbiAgaXQncyB3aWxsIGJlIGRlZmluZWQgYW5kIElEIHNldFxyXG5cdCAqIGlmIGNhbGVuZGFyIGV4aXN0LCB0aGVuICBzeXN0ZW0gc2V0ICBhcyBuZXcgb3Igb3ZlcndyaXRlIG9ubHkgcHJvcGVydGllcyBmcm9tIGNhbGVuZGFyX3Byb3BlcnR5X29iaiBwYXJhbWV0ZXIsICBidXQgb3RoZXIgcHJvcGVydGllcyB3aWxsIGJlIGV4aXN0ZWQgYW5kIG5vdCBvdmVyd3JpdGUsIGxpa2UgJ2lkJ1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd8aW50fSByZXNvdXJjZV9pZFx0XHRcdFx0ICAnMidcclxuXHQgKiBAcGFyYW0ge29iamVjdH0gY2FsZW5kYXJfcHJvcGVydHlfb2JqXHRcdFx0XHRcdCAgeyAgZGF0ZXM6ICBPYmplY3QgeyBcIjIwMjMtMDctMjFcIjoge+KApn0sIFwiMjAyMy0wNy0yMlwiOiB74oCmfSwgXCIyMDIzLTA3LTIzXCI6IHvigKZ9LCDigKYgfSAgfVxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNfY29tcGxldGVfb3ZlcndyaXRlXHRcdCAgaWYgJ3RydWUnIChkZWZhdWx0OiAnZmFsc2UnKSwgIHRoZW4gIG9ubHkgb3ZlcndyaXRlIG9yIGFkZCAgbmV3IHByb3BlcnRpZXMgaW4gIGNhbGVuZGFyX3Byb3BlcnR5X29ialxyXG5cdCAqIEByZXR1cm5zIHsqfVxyXG5cdCAqXHJcblx0ICogRXhhbXBsZXM6XHJcblx0ICpcclxuXHQgKiBDb21tb24gdXNhZ2UgaW4gUEhQOlxyXG5cdCAqICAgXHRcdFx0ZWNobyBcIiAgX3dwYmMuY2FsZW5kYXJfX3NldCggIFwiIC5pbnR2YWwoICRyZXNvdXJjZV9pZCApIC4gXCIsIHsgJ2RhdGVzJzogXCIgLiB3cF9qc29uX2VuY29kZSggJGF2YWlsYWJpbGl0eV9wZXJfZGF5c19hcnIgKSAuIFwiIH0gKTtcIjtcclxuXHQgKi9cclxuXHRvYmouY2FsZW5kYXJfX3NldF9wYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCByZXNvdXJjZV9pZCwgY2FsZW5kYXJfcHJvcGVydHlfb2JqLCBpc19jb21wbGV0ZV9vdmVyd3JpdGUgPSBmYWxzZSAgKSB7XHJcblxyXG5cdFx0aWYgKCAoIW9iai5jYWxlbmRhcl9faXNfZGVmaW5lZCggcmVzb3VyY2VfaWQgKSkgfHwgKHRydWUgPT09IGlzX2NvbXBsZXRlX292ZXJ3cml0ZSkgKXtcclxuXHRcdFx0b2JqLmNhbGVuZGFyX19pbml0KCByZXNvdXJjZV9pZCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIHZhciBwcm9wX25hbWUgaW4gY2FsZW5kYXJfcHJvcGVydHlfb2JqICl7XHJcblxyXG5cdFx0XHRwX2NhbGVuZGFyc1sgJ2NhbGVuZGFyXycgKyByZXNvdXJjZV9pZCBdWyBwcm9wX25hbWUgXSA9IGNhbGVuZGFyX3Byb3BlcnR5X29ialsgcHJvcF9uYW1lIF07XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBfY2FsZW5kYXJzWyAnY2FsZW5kYXJfJyArIHJlc291cmNlX2lkIF07XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogU2V0IHByb3BlcnR5ICB0byAgY2FsZW5kYXJcclxuXHQgKiBAcGFyYW0gcmVzb3VyY2VfaWRcdFwiMVwiXHJcblx0ICogQHBhcmFtIHByb3BfbmFtZVx0XHRuYW1lIG9mIHByb3BlcnR5XHJcblx0ICogQHBhcmFtIHByb3BfdmFsdWVcdHZhbHVlIG9mIHByb3BlcnR5XHJcblx0ICogQHJldHVybnMgeyp9XHRcdFx0Y2FsZW5kYXIgb2JqZWN0XHJcblx0ICovXHJcblx0b2JqLmNhbGVuZGFyX19zZXRfcGFyYW1fdmFsdWUgPSBmdW5jdGlvbiAoIHJlc291cmNlX2lkLCBwcm9wX25hbWUsIHByb3BfdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCAoIW9iai5jYWxlbmRhcl9faXNfZGVmaW5lZCggcmVzb3VyY2VfaWQgKSkgKXtcclxuXHRcdFx0b2JqLmNhbGVuZGFyX19pbml0KCByZXNvdXJjZV9pZCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHBfY2FsZW5kYXJzWyAnY2FsZW5kYXJfJyArIHJlc291cmNlX2lkIF1bIHByb3BfbmFtZSBdID0gcHJvcF92YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gcF9jYWxlbmRhcnNbICdjYWxlbmRhcl8nICsgcmVzb3VyY2VfaWQgXTtcclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiAgR2V0IGNhbGVuZGFyIHByb3BlcnR5IHZhbHVlICAgXHQ6OiAgIG1peGVkIHwgbnVsbFxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd8aW50fSAgcmVzb3VyY2VfaWRcdFx0JzEnXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BfbmFtZVx0XHRcdCdzZWxlY3Rpb25fbW9kZSdcclxuXHQgKiBAcmV0dXJucyB7KnxudWxsfVx0XHRcdFx0XHRtaXhlZCB8IG51bGxcclxuXHQgKi9cclxuXHRvYmouY2FsZW5kYXJfX2dldF9wYXJhbV92YWx1ZSA9IGZ1bmN0aW9uKCByZXNvdXJjZV9pZCwgcHJvcF9uYW1lICl7XHJcblxyXG5cdFx0aWYgKFxyXG5cdFx0XHQgICAoIG9iai5jYWxlbmRhcl9faXNfZGVmaW5lZCggcmVzb3VyY2VfaWQgKSApXHJcblx0XHRcdCYmICggJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiAoIHBfY2FsZW5kYXJzWyAnY2FsZW5kYXJfJyArIHJlc291cmNlX2lkIF1bIHByb3BfbmFtZSBdICkgKVxyXG5cdFx0KXtcclxuXHRcdFx0Ly8gRml4SW46IDkuOS4wLjI5LlxyXG5cdFx0XHRpZiAoIG9iai5jYWxlbmRhcl9faXNfcHJvcF9pbnQoIHByb3BfbmFtZSApICl7XHJcblx0XHRcdFx0cF9jYWxlbmRhcnNbICdjYWxlbmRhcl8nICsgcmVzb3VyY2VfaWQgXVsgcHJvcF9uYW1lIF0gPSBwYXJzZUludCggcF9jYWxlbmRhcnNbICdjYWxlbmRhcl8nICsgcmVzb3VyY2VfaWQgXVsgcHJvcF9uYW1lIF0gKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gIHBfY2FsZW5kYXJzWyAnY2FsZW5kYXJfJyArIHJlc291cmNlX2lkIF1bIHByb3BfbmFtZSBdO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBudWxsO1x0XHQvLyBJZiBzb21lIHByb3BlcnR5IG5vdCBkZWZpbmVkLCB0aGVuIG51bGw7XHJcblx0fTtcclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHJcblx0Ly8gQm9va2luZ3MgXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0dmFyIHBfYm9va2luZ3MgPSBvYmouYm9va2luZ3Nfb2JqID0gb2JqLmJvb2tpbmdzX29iaiB8fCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gY2FsZW5kYXJfMTogT2JqZWN0IHtcclxuIFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9cdFx0XHRcdFx0XHQgICBpZDogICAgIDFcclxuIFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9cdFx0XHRcdFx0XHQgLCBkYXRlczogIE9iamVjdCB7IFwiMjAyMy0wNy0yMVwiOiB74oCmfSwgXCIyMDIzLTA3LTIyXCI6IHvigKZ9LCBcIjIwMjMtMDctMjNcIjoge+KApn0sIOKAplxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogIENoZWNrIGlmIGJvb2tpbmdzIGZvciBzcGVjaWZpYyBib29raW5nIHJlc291cmNlIGRlZmluZWQgICA6OiAgIHRydWUgfCBmYWxzZVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd8aW50fSByZXNvdXJjZV9pZFxyXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxyXG5cdCAqL1xyXG5cdG9iai5ib29raW5nc19pbl9jYWxlbmRhcl9faXNfZGVmaW5lZCA9IGZ1bmN0aW9uICggcmVzb3VyY2VfaWQgKSB7XHJcblxyXG5cdFx0cmV0dXJuICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mKCBwX2Jvb2tpbmdzWyAnY2FsZW5kYXJfJyArIHJlc291cmNlX2lkIF0gKSApO1xyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldCBib29raW5ncyBjYWxlbmRhciBvYmplY3QgICA6OiAgIHsgaWQ6IDEgLCBkYXRlczogIE9iamVjdCB7IFwiMjAyMy0wNy0yMVwiOiB74oCmfSwgXCIyMDIzLTA3LTIyXCI6IHvigKZ9LCBcIjIwMjMtMDctMjNcIjoge+KApn0sIOKApiB9XHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ3xpbnR9IHJlc291cmNlX2lkXHRcdFx0XHQgICcyJ1xyXG5cdCAqIEByZXR1cm5zIHtvYmplY3R8Ym9vbGVhbn1cdFx0XHRcdFx0eyBpZDogMiAsIGRhdGVzOiAgT2JqZWN0IHsgXCIyMDIzLTA3LTIxXCI6IHvigKZ9LCBcIjIwMjMtMDctMjJcIjoge+KApn0sIFwiMjAyMy0wNy0yM1wiOiB74oCmfSwg4oCmIH1cclxuXHQgKi9cclxuXHRvYmouYm9va2luZ3NfaW5fY2FsZW5kYXJfX2dldCA9IGZ1bmN0aW9uKCByZXNvdXJjZV9pZCApe1xyXG5cclxuXHRcdGlmICggb2JqLmJvb2tpbmdzX2luX2NhbGVuZGFyX19pc19kZWZpbmVkKCByZXNvdXJjZV9pZCApICl7XHJcblxyXG5cdFx0XHRyZXR1cm4gcF9ib29raW5nc1sgJ2NhbGVuZGFyXycgKyByZXNvdXJjZV9pZCBdO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldCBib29raW5ncyBjYWxlbmRhciBvYmplY3QgICA6OiAgIHsgZGF0ZXM6ICBPYmplY3QgeyBcIjIwMjMtMDctMjFcIjoge+KApn0sIFwiMjAyMy0wNy0yMlwiOiB74oCmfSwgXCIyMDIzLTA3LTIzXCI6IHvigKZ9LCDigKYgfVxyXG5cdCAqXHJcblx0ICogaWYgY2FsZW5kYXIgb2JqZWN0ICBub3QgZGVmaW5lZCwgdGhlbiAgaXQncyB3aWxsIGJlIGRlZmluZWQgYW5kIElEIHNldFxyXG5cdCAqIGlmIGNhbGVuZGFyIGV4aXN0LCB0aGVuICBzeXN0ZW0gc2V0ICBhcyBuZXcgb3Igb3ZlcndyaXRlIG9ubHkgcHJvcGVydGllcyBmcm9tIGNhbGVuZGFyX29iaiBwYXJhbWV0ZXIsICBidXQgb3RoZXIgcHJvcGVydGllcyB3aWxsIGJlIGV4aXN0ZWQgYW5kIG5vdCBvdmVyd3JpdGUsIGxpa2UgJ2lkJ1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd8aW50fSByZXNvdXJjZV9pZFx0XHRcdFx0ICAnMidcclxuXHQgKiBAcGFyYW0ge29iamVjdH0gY2FsZW5kYXJfb2JqXHRcdFx0XHRcdCAgeyAgZGF0ZXM6ICBPYmplY3QgeyBcIjIwMjMtMDctMjFcIjoge+KApn0sIFwiMjAyMy0wNy0yMlwiOiB74oCmfSwgXCIyMDIzLTA3LTIzXCI6IHvigKZ9LCDigKYgfSAgfVxyXG5cdCAqIEByZXR1cm5zIHsqfVxyXG5cdCAqXHJcblx0ICogRXhhbXBsZXM6XHJcblx0ICpcclxuXHQgKiBDb21tb24gdXNhZ2UgaW4gUEhQOlxyXG5cdCAqICAgXHRcdFx0ZWNobyBcIiAgX3dwYmMuYm9va2luZ3NfaW5fY2FsZW5kYXJfX3NldCggIFwiIC5pbnR2YWwoICRyZXNvdXJjZV9pZCApIC4gXCIsIHsgJ2RhdGVzJzogXCIgLiB3cF9qc29uX2VuY29kZSggJGF2YWlsYWJpbGl0eV9wZXJfZGF5c19hcnIgKSAuIFwiIH0gKTtcIjtcclxuXHQgKi9cclxuXHRvYmouYm9va2luZ3NfaW5fY2FsZW5kYXJfX3NldCA9IGZ1bmN0aW9uKCByZXNvdXJjZV9pZCwgY2FsZW5kYXJfb2JqICl7XHJcblxyXG5cdFx0aWYgKCAhIG9iai5ib29raW5nc19pbl9jYWxlbmRhcl9faXNfZGVmaW5lZCggcmVzb3VyY2VfaWQgKSApe1xyXG5cdFx0XHRwX2Jvb2tpbmdzWyAnY2FsZW5kYXJfJyArIHJlc291cmNlX2lkIF0gPSB7fTtcclxuXHRcdFx0cF9ib29raW5nc1sgJ2NhbGVuZGFyXycgKyByZXNvdXJjZV9pZCBdWyAnaWQnIF0gPSByZXNvdXJjZV9pZDtcclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCB2YXIgcHJvcF9uYW1lIGluIGNhbGVuZGFyX29iaiApe1xyXG5cclxuXHRcdFx0cF9ib29raW5nc1sgJ2NhbGVuZGFyXycgKyByZXNvdXJjZV9pZCBdWyBwcm9wX25hbWUgXSA9IGNhbGVuZGFyX29ialsgcHJvcF9uYW1lIF07XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBfYm9va2luZ3NbICdjYWxlbmRhcl8nICsgcmVzb3VyY2VfaWQgXTtcclxuXHR9O1xyXG5cclxuXHQvLyBEYXRlc1xyXG5cclxuXHQvKipcclxuXHQgKiAgR2V0IGJvb2tpbmdzIGRhdGEgZm9yIEFMTCBEYXRlcyBpbiBjYWxlbmRhciAgIDo6ICAgZmFsc2UgfCB7IFwiMjAyMy0wNy0yMlwiOiB74oCmfSwgXCIyMDIzLTA3LTIzXCI6IHvigKZ9LCDigKYgfVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd8aW50fSByZXNvdXJjZV9pZFx0XHRcdCcxJ1xyXG5cdCAqIEByZXR1cm5zIHtvYmplY3R8Ym9vbGVhbn1cdFx0XHRcdGZhbHNlIHwgT2JqZWN0IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDctMjRcIjogT2JqZWN0IHsgWydzdW1tYXJ5J11bJ3N0YXR1c19mb3JfZGF5J106IFwiYXZhaWxhYmxlXCIsIGRheV9hdmFpbGFiaWxpdHk6IDEsIG1heF9jYXBhY2l0eTogMSwg4oCmIH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDctMjZcIjogT2JqZWN0IHsgWydzdW1tYXJ5J11bJ3N0YXR1c19mb3JfZGF5J106IFwiZnVsbF9kYXlfYm9va2luZ1wiLCBbJ3N1bW1hcnknXVsnc3RhdHVzX2Zvcl9ib29raW5ncyddOiBcInBlbmRpbmdcIiwgZGF5X2F2YWlsYWJpbGl0eTogMCwg4oCmIH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDctMjlcIjogT2JqZWN0IHsgWydzdW1tYXJ5J11bJ3N0YXR1c19mb3JfZGF5J106IFwicmVzb3VyY2VfYXZhaWxhYmlsaXR5XCIsIGRheV9hdmFpbGFiaWxpdHk6IDAsIG1heF9jYXBhY2l0eTogMSwg4oCmIH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDctMzBcIjoge+KApn0sIFwiMjAyMy0wNy0zMVwiOiB74oCmfSwg4oCmXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHQgKi9cclxuXHRvYmouYm9va2luZ3NfaW5fY2FsZW5kYXJfX2dldF9kYXRlcyA9IGZ1bmN0aW9uKCByZXNvdXJjZV9pZCl7XHJcblxyXG5cdFx0aWYgKFxyXG5cdFx0XHQgICAoIG9iai5ib29raW5nc19pbl9jYWxlbmRhcl9faXNfZGVmaW5lZCggcmVzb3VyY2VfaWQgKSApXHJcblx0XHRcdCYmICggJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiAoIHBfYm9va2luZ3NbICdjYWxlbmRhcl8nICsgcmVzb3VyY2VfaWQgXVsgJ2RhdGVzJyBdICkgKVxyXG5cdFx0KXtcclxuXHRcdFx0cmV0dXJuICBwX2Jvb2tpbmdzWyAnY2FsZW5kYXJfJyArIHJlc291cmNlX2lkIF1bICdkYXRlcycgXTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHRcdC8vIElmIHNvbWUgcHJvcGVydHkgbm90IGRlZmluZWQsIHRoZW4gZmFsc2U7XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogU2V0IGJvb2tpbmdzIGRhdGVzIGluIGNhbGVuZGFyIG9iamVjdCAgIDo6ICAgIHsgXCIyMDIzLTA3LTIxXCI6IHvigKZ9LCBcIjIwMjMtMDctMjJcIjoge+KApn0sIFwiMjAyMy0wNy0yM1wiOiB74oCmfSwg4oCmIH1cclxuXHQgKlxyXG5cdCAqIGlmIGNhbGVuZGFyIG9iamVjdCAgbm90IGRlZmluZWQsIHRoZW4gIGl0J3Mgd2lsbCBiZSBkZWZpbmVkIGFuZCAnaWQnLCAnZGF0ZXMnIHNldFxyXG5cdCAqIGlmIGNhbGVuZGFyIGV4aXN0LCB0aGVuIHN5c3RlbSBhZGQgYSAgbmV3IG9yIG92ZXJ3cml0ZSBvbmx5IGRhdGVzIGZyb20gZGF0ZXNfb2JqIHBhcmFtZXRlcixcclxuXHQgKiBidXQgb3RoZXIgZGF0ZXMgbm90IGZyb20gcGFyYW1ldGVyIGRhdGVzX29iaiB3aWxsIGJlIGV4aXN0ZWQgYW5kIG5vdCBvdmVyd3JpdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ3xpbnR9IHJlc291cmNlX2lkXHRcdFx0XHQgICcyJ1xyXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBkYXRlc19vYmpcdFx0XHRcdFx0ICB7IFwiMjAyMy0wNy0yMVwiOiB74oCmfSwgXCIyMDIzLTA3LTIyXCI6IHvigKZ9LCBcIjIwMjMtMDctMjNcIjoge+KApn0sIOKApiB9XHJcblx0ICogQHBhcmFtIHtib29sZWFufSBpc19jb21wbGV0ZV9vdmVyd3JpdGVcdFx0ICBpZiBmYWxzZSwgIHRoZW4gIG9ubHkgb3ZlcndyaXRlIG9yIGFkZCAgZGF0ZXMgZnJvbSBcdGRhdGVzX29ialxyXG5cdCAqIEByZXR1cm5zIHsqfVxyXG5cdCAqXHJcblx0ICogRXhhbXBsZXM6XHJcblx0ICogICBcdFx0XHRfd3BiYy5ib29raW5nc19pbl9jYWxlbmRhcl9fc2V0X2RhdGVzKCByZXNvdXJjZV9pZCwgeyBcIjIwMjMtMDctMjFcIjoge+KApn0sIFwiMjAyMy0wNy0yMlwiOiB74oCmfSwg4oCmIH0gICk7XHRcdDwtICAgb3ZlcndyaXRlIEFMTCBkYXRlc1xyXG5cdCAqICAgXHRcdFx0X3dwYmMuYm9va2luZ3NfaW5fY2FsZW5kYXJfX3NldF9kYXRlcyggcmVzb3VyY2VfaWQsIHsgXCIyMDIzLTA3LTIyXCI6IHvigKZ9IH0sICBmYWxzZSAgKTtcdFx0XHRcdFx0PC0gICBhZGQgb3Igb3ZlcndyaXRlIG9ubHkgIFx0XCIyMDIzLTA3LTIyXCI6IHt9XHJcblx0ICpcclxuXHQgKiBDb21tb24gdXNhZ2UgaW4gUEhQOlxyXG5cdCAqICAgXHRcdFx0ZWNobyBcIiAgX3dwYmMuYm9va2luZ3NfaW5fY2FsZW5kYXJfX3NldF9kYXRlcyggIFwiIC4gaW50dmFsKCAkcmVzb3VyY2VfaWQgKSAuIFwiLCAgXCIgLiB3cF9qc29uX2VuY29kZSggJGF2YWlsYWJpbGl0eV9wZXJfZGF5c19hcnIgKSAuIFwiICApOyAgXCI7XHJcblx0ICovXHJcblx0b2JqLmJvb2tpbmdzX2luX2NhbGVuZGFyX19zZXRfZGF0ZXMgPSBmdW5jdGlvbiggcmVzb3VyY2VfaWQsIGRhdGVzX29iaiAsIGlzX2NvbXBsZXRlX292ZXJ3cml0ZSA9IHRydWUgKXtcclxuXHJcblx0XHRpZiAoICFvYmouYm9va2luZ3NfaW5fY2FsZW5kYXJfX2lzX2RlZmluZWQoIHJlc291cmNlX2lkICkgKXtcclxuXHRcdFx0b2JqLmJvb2tpbmdzX2luX2NhbGVuZGFyX19zZXQoIHJlc291cmNlX2lkLCB7ICdkYXRlcyc6IHt9IH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoICd1bmRlZmluZWQnID09PSB0eXBlb2YgKHBfYm9va2luZ3NbICdjYWxlbmRhcl8nICsgcmVzb3VyY2VfaWQgXVsgJ2RhdGVzJyBdKSApe1xyXG5cdFx0XHRwX2Jvb2tpbmdzWyAnY2FsZW5kYXJfJyArIHJlc291cmNlX2lkIF1bICdkYXRlcycgXSA9IHt9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGlzX2NvbXBsZXRlX292ZXJ3cml0ZSl7XHJcblxyXG5cdFx0XHQvLyBDb21wbGV0ZSBvdmVyd3JpdGUgYWxsICBib29raW5nIGRhdGVzXHJcblx0XHRcdHBfYm9va2luZ3NbICdjYWxlbmRhcl8nICsgcmVzb3VyY2VfaWQgXVsgJ2RhdGVzJyBdID0gZGF0ZXNfb2JqO1xyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIEFkZCBvbmx5ICBuZXcgb3Igb3ZlcndyaXRlIGV4aXN0IGJvb2tpbmcgZGF0ZXMgZnJvbSAgcGFyYW1ldGVyLiBCb29raW5nIGRhdGVzIG5vdCBmcm9tICBwYXJhbWV0ZXIgIHdpbGwgIGJlIHdpdGhvdXQgY2huYW5nZXNcclxuXHRcdFx0Zm9yICggdmFyIHByb3BfbmFtZSBpbiBkYXRlc19vYmogKXtcclxuXHJcblx0XHRcdFx0cF9ib29raW5nc1sgJ2NhbGVuZGFyXycgKyByZXNvdXJjZV9pZCBdWydkYXRlcyddWyBwcm9wX25hbWUgXSA9IGRhdGVzX29ialsgcHJvcF9uYW1lIF07XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcF9ib29raW5nc1sgJ2NhbGVuZGFyXycgKyByZXNvdXJjZV9pZCBdO1xyXG5cdH07XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiAgR2V0IGJvb2tpbmdzIGRhdGEgZm9yIHNwZWNpZmljIGRhdGUgaW4gY2FsZW5kYXIgICA6OiAgIGZhbHNlIHwgeyBkYXlfYXZhaWxhYmlsaXR5OiAxLCAuLi4gfVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd8aW50fSByZXNvdXJjZV9pZFx0XHRcdCcxJ1xyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzcWxfY2xhc3NfZGF5XHRcdFx0JzIwMjMtMDctMjEnXHJcblx0ICogQHJldHVybnMge29iamVjdHxib29sZWFufVx0XHRcdFx0ZmFsc2UgfCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRheV9hdmFpbGFiaWxpdHk6IDRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWF4X2NhcGFjaXR5OiA0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gID49IEJ1c2luZXNzIExhcmdlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDI6IE9iamVjdCB7IGlzX2RheV91bmF2YWlsYWJsZTogZmFsc2UsIF9kYXlfc3RhdHVzOiBcImF2YWlsYWJsZVwiIH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0MTA6IE9iamVjdCB7IGlzX2RheV91bmF2YWlsYWJsZTogZmFsc2UsIF9kYXlfc3RhdHVzOiBcImF2YWlsYWJsZVwiIH1cdFx0Ly8gID49IEJ1c2luZXNzIExhcmdlIC4uLlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQxMTogT2JqZWN0IHsgaXNfZGF5X3VuYXZhaWxhYmxlOiBmYWxzZSwgX2RheV9zdGF0dXM6IFwiYXZhaWxhYmxlXCIgfVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQxMjogT2JqZWN0IHsgaXNfZGF5X3VuYXZhaWxhYmxlOiBmYWxzZSwgX2RheV9zdGF0dXM6IFwiYXZhaWxhYmxlXCIgfVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdCAqL1xyXG5cdG9iai5ib29raW5nc19pbl9jYWxlbmRhcl9fZ2V0X2Zvcl9kYXRlID0gZnVuY3Rpb24oIHJlc291cmNlX2lkLCBzcWxfY2xhc3NfZGF5ICl7XHJcblxyXG5cdFx0aWYgKFxyXG5cdFx0XHQgICAoIG9iai5ib29raW5nc19pbl9jYWxlbmRhcl9faXNfZGVmaW5lZCggcmVzb3VyY2VfaWQgKSApXHJcblx0XHRcdCYmICggJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiAoIHBfYm9va2luZ3NbICdjYWxlbmRhcl8nICsgcmVzb3VyY2VfaWQgXVsgJ2RhdGVzJyBdICkgKVxyXG5cdFx0XHQmJiAoICd1bmRlZmluZWQnICE9PSB0eXBlb2YgKCBwX2Jvb2tpbmdzWyAnY2FsZW5kYXJfJyArIHJlc291cmNlX2lkIF1bICdkYXRlcycgXVsgc3FsX2NsYXNzX2RheSBdICkgKVxyXG5cdFx0KXtcclxuXHRcdFx0cmV0dXJuICBwX2Jvb2tpbmdzWyAnY2FsZW5kYXJfJyArIHJlc291cmNlX2lkIF1bICdkYXRlcycgXVsgc3FsX2NsYXNzX2RheSBdO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcdFx0Ly8gSWYgc29tZSBwcm9wZXJ0eSBub3QgZGVmaW5lZCwgdGhlbiBmYWxzZTtcclxuXHR9O1xyXG5cclxuXHJcblx0Ly8gQW55ICBQQVJBTVMgICBpbiBib29raW5nc1xyXG5cclxuXHQvKipcclxuXHQgKiBTZXQgcHJvcGVydHkgIHRvICBib29raW5nXHJcblx0ICogQHBhcmFtIHJlc291cmNlX2lkXHRcIjFcIlxyXG5cdCAqIEBwYXJhbSBwcm9wX25hbWVcdFx0bmFtZSBvZiBwcm9wZXJ0eVxyXG5cdCAqIEBwYXJhbSBwcm9wX3ZhbHVlXHR2YWx1ZSBvZiBwcm9wZXJ0eVxyXG5cdCAqIEByZXR1cm5zIHsqfVx0XHRcdGJvb2tpbmcgb2JqZWN0XHJcblx0ICovXHJcblx0b2JqLmJvb2tpbmdfX3NldF9wYXJhbV92YWx1ZSA9IGZ1bmN0aW9uICggcmVzb3VyY2VfaWQsIHByb3BfbmFtZSwgcHJvcF92YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoICEgb2JqLmJvb2tpbmdzX2luX2NhbGVuZGFyX19pc19kZWZpbmVkKCByZXNvdXJjZV9pZCApICl7XHJcblx0XHRcdHBfYm9va2luZ3NbICdjYWxlbmRhcl8nICsgcmVzb3VyY2VfaWQgXSA9IHt9O1xyXG5cdFx0XHRwX2Jvb2tpbmdzWyAnY2FsZW5kYXJfJyArIHJlc291cmNlX2lkIF1bICdpZCcgXSA9IHJlc291cmNlX2lkO1xyXG5cdFx0fVxyXG5cclxuXHRcdHBfYm9va2luZ3NbICdjYWxlbmRhcl8nICsgcmVzb3VyY2VfaWQgXVsgcHJvcF9uYW1lIF0gPSBwcm9wX3ZhbHVlO1xyXG5cclxuXHRcdHJldHVybiBwX2Jvb2tpbmdzWyAnY2FsZW5kYXJfJyArIHJlc291cmNlX2lkIF07XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogIEdldCBib29raW5nIHByb3BlcnR5IHZhbHVlICAgXHQ6OiAgIG1peGVkIHwgbnVsbFxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd8aW50fSAgcmVzb3VyY2VfaWRcdFx0JzEnXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BfbmFtZVx0XHRcdCdzZWxlY3Rpb25fbW9kZSdcclxuXHQgKiBAcmV0dXJucyB7KnxudWxsfVx0XHRcdFx0XHRtaXhlZCB8IG51bGxcclxuXHQgKi9cclxuXHRvYmouYm9va2luZ19fZ2V0X3BhcmFtX3ZhbHVlID0gZnVuY3Rpb24oIHJlc291cmNlX2lkLCBwcm9wX25hbWUgKXtcclxuXHJcblx0XHRpZiAoXHJcblx0XHRcdCAgICggb2JqLmJvb2tpbmdzX2luX2NhbGVuZGFyX19pc19kZWZpbmVkKCByZXNvdXJjZV9pZCApIClcclxuXHRcdFx0JiYgKCAndW5kZWZpbmVkJyAhPT0gdHlwZW9mICggcF9ib29raW5nc1sgJ2NhbGVuZGFyXycgKyByZXNvdXJjZV9pZCBdWyBwcm9wX25hbWUgXSApIClcclxuXHRcdCl7XHJcblx0XHRcdHJldHVybiAgcF9ib29raW5nc1sgJ2NhbGVuZGFyXycgKyByZXNvdXJjZV9pZCBdWyBwcm9wX25hbWUgXTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbnVsbDtcdFx0Ly8gSWYgc29tZSBwcm9wZXJ0eSBub3QgZGVmaW5lZCwgdGhlbiBudWxsO1xyXG5cdH07XHJcblxyXG5cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldCBib29raW5ncyBmb3IgYWxsICBjYWxlbmRhcnNcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBjYWxlbmRhcnNfb2JqXHRcdE9iamVjdCB7IGNhbGVuZGFyXzE6IHsgaWQ6IDEsIGRhdGVzOiBPYmplY3QgeyBcIjIwMjMtMDctMjJcIjoge+KApn0sIFwiMjAyMy0wNy0yM1wiOiB74oCmfSwgXCIyMDIzLTA3LTI0XCI6IHvigKZ9LCDigKYgfSB9XHJcblx0ICogXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IGNhbGVuZGFyXzM6IHt9LCAuLi4gfVxyXG5cdCAqL1xyXG5cdG9iai5ib29raW5nc19pbl9jYWxlbmRhcnNfX3NldF9hbGwgPSBmdW5jdGlvbiAoIGNhbGVuZGFyc19vYmogKSB7XHJcblx0XHRwX2Jvb2tpbmdzID0gY2FsZW5kYXJzX29iajtcclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiBHZXQgYm9va2luZ3MgaW4gYWxsIGNhbGVuZGFyc1xyXG5cdCAqXHJcblx0ICogQHJldHVybnMge29iamVjdHx7fX1cclxuXHQgKi9cclxuXHRvYmouYm9va2luZ3NfaW5fY2FsZW5kYXJzX19nZXRfYWxsID0gZnVuY3Rpb24gKCkge1xyXG5cdFx0cmV0dXJuIHBfYm9va2luZ3M7XHJcblx0fTtcclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHJcblxyXG5cclxuXHQvLyBTZWFzb25zIFx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHZhciBwX3NlYXNvbnMgPSBvYmouc2Vhc29uc19vYmogPSBvYmouc2Vhc29uc19vYmogfHwge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGNhbGVuZGFyXzE6IE9iamVjdCB7XHJcbiBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vXHRcdFx0XHRcdFx0ICAgaWQ6ICAgICAxXHJcbiBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vXHRcdFx0XHRcdFx0ICwgZGF0ZXM6ICBPYmplY3QgeyBcIjIwMjMtMDctMjFcIjoge+KApn0sIFwiMjAyMy0wNy0yMlwiOiB74oCmfSwgXCIyMDIzLTA3LTIzXCI6IHvigKZ9LCDigKZcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyB9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZCBzZWFzb24gbmFtZXMgZm9yIGRhdGVzIGluIGNhbGVuZGFyIG9iamVjdCAgIDo6ICAgIHsgXCIyMDIzLTA3LTIxXCI6IFsgJ3dwYmNfc2Vhc29uX3NlcHRlbWJlcl8yMDIzJywgJ3dwYmNfc2Vhc29uX3NlcHRlbWJlcl8yMDI0JyBdLCBcIjIwMjMtMDctMjJcIjogWy4uLl0sIC4uLiB9XHJcblx0ICpcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfGludH0gcmVzb3VyY2VfaWRcdFx0XHRcdCAgJzInXHJcblx0ICogQHBhcmFtIHtvYmplY3R9IGRhdGVzX29ialx0XHRcdFx0XHQgIHsgXCIyMDIzLTA3LTIxXCI6IHvigKZ9LCBcIjIwMjMtMDctMjJcIjoge+KApn0sIFwiMjAyMy0wNy0yM1wiOiB74oCmfSwg4oCmIH1cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGlzX2NvbXBsZXRlX292ZXJ3cml0ZVx0XHQgIGlmIGZhbHNlLCAgdGhlbiAgb25seSAgYWRkICBkYXRlcyBmcm9tIFx0ZGF0ZXNfb2JqXHJcblx0ICogQHJldHVybnMgeyp9XHJcblx0ICpcclxuXHQgKiBFeGFtcGxlczpcclxuXHQgKiAgIFx0XHRcdF93cGJjLnNlYXNvbnNfX3NldCggcmVzb3VyY2VfaWQsIHsgXCIyMDIzLTA3LTIxXCI6IFsgJ3dwYmNfc2Vhc29uX3NlcHRlbWJlcl8yMDIzJywgJ3dwYmNfc2Vhc29uX3NlcHRlbWJlcl8yMDI0JyBdLCBcIjIwMjMtMDctMjJcIjogWy4uLl0sIC4uLiB9ICApO1xyXG5cdCAqL1xyXG5cdG9iai5zZWFzb25zX19zZXQgPSBmdW5jdGlvbiggcmVzb3VyY2VfaWQsIGRhdGVzX29iaiAsIGlzX2NvbXBsZXRlX292ZXJ3cml0ZSA9IGZhbHNlICl7XHJcblxyXG5cdFx0aWYgKCAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIChwX3NlYXNvbnNbICdjYWxlbmRhcl8nICsgcmVzb3VyY2VfaWQgXSkgKXtcclxuXHRcdFx0cF9zZWFzb25zWyAnY2FsZW5kYXJfJyArIHJlc291cmNlX2lkIF0gPSB7fTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGlzX2NvbXBsZXRlX292ZXJ3cml0ZSApe1xyXG5cclxuXHRcdFx0Ly8gQ29tcGxldGUgb3ZlcndyaXRlIGFsbCAgc2Vhc29uIGRhdGVzXHJcblx0XHRcdHBfc2Vhc29uc1sgJ2NhbGVuZGFyXycgKyByZXNvdXJjZV9pZCBdID0gZGF0ZXNfb2JqO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHQvLyBBZGQgb25seSAgbmV3IG9yIG92ZXJ3cml0ZSBleGlzdCBib29raW5nIGRhdGVzIGZyb20gIHBhcmFtZXRlci4gQm9va2luZyBkYXRlcyBub3QgZnJvbSAgcGFyYW1ldGVyICB3aWxsICBiZSB3aXRob3V0IGNobmFuZ2VzXHJcblx0XHRcdGZvciAoIHZhciBwcm9wX25hbWUgaW4gZGF0ZXNfb2JqICl7XHJcblxyXG5cdFx0XHRcdGlmICggJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiAocF9zZWFzb25zWyAnY2FsZW5kYXJfJyArIHJlc291cmNlX2lkIF1bIHByb3BfbmFtZSBdKSApe1xyXG5cdFx0XHRcdFx0cF9zZWFzb25zWyAnY2FsZW5kYXJfJyArIHJlc291cmNlX2lkIF1bIHByb3BfbmFtZSBdID0gW107XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGZvciAoIHZhciBzZWFzb25fbmFtZV9rZXkgaW4gZGF0ZXNfb2JqWyBwcm9wX25hbWUgXSApe1xyXG5cdFx0XHRcdFx0cF9zZWFzb25zWyAnY2FsZW5kYXJfJyArIHJlc291cmNlX2lkIF1bIHByb3BfbmFtZSBdLnB1c2goIGRhdGVzX29ialsgcHJvcF9uYW1lIF1bIHNlYXNvbl9uYW1lX2tleSBdICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBfc2Vhc29uc1sgJ2NhbGVuZGFyXycgKyByZXNvdXJjZV9pZCBdO1xyXG5cdH07XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiAgR2V0IGJvb2tpbmdzIGRhdGEgZm9yIHNwZWNpZmljIGRhdGUgaW4gY2FsZW5kYXIgICA6OiAgIFtdIHwgWyAnd3BiY19zZWFzb25fc2VwdGVtYmVyXzIwMjMnLCAnd3BiY19zZWFzb25fc2VwdGVtYmVyXzIwMjQnIF1cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfGludH0gcmVzb3VyY2VfaWRcdFx0XHQnMSdcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc3FsX2NsYXNzX2RheVx0XHRcdCcyMDIzLTA3LTIxJ1xyXG5cdCAqIEByZXR1cm5zIHtvYmplY3R8Ym9vbGVhbn1cdFx0XHRcdFtdICB8ICBbICd3cGJjX3NlYXNvbl9zZXB0ZW1iZXJfMjAyMycsICd3cGJjX3NlYXNvbl9zZXB0ZW1iZXJfMjAyNCcgXVxyXG5cdCAqL1xyXG5cdG9iai5zZWFzb25zX19nZXRfZm9yX2RhdGUgPSBmdW5jdGlvbiggcmVzb3VyY2VfaWQsIHNxbF9jbGFzc19kYXkgKXtcclxuXHJcblx0XHRpZiAoXHJcblx0XHRcdCAgICggJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiAoIHBfc2Vhc29uc1sgJ2NhbGVuZGFyXycgKyByZXNvdXJjZV9pZCBdICkgKVxyXG5cdFx0XHQmJiAoICd1bmRlZmluZWQnICE9PSB0eXBlb2YgKCBwX3NlYXNvbnNbICdjYWxlbmRhcl8nICsgcmVzb3VyY2VfaWQgXVsgc3FsX2NsYXNzX2RheSBdICkgKVxyXG5cdFx0KXtcclxuXHRcdFx0cmV0dXJuICBwX3NlYXNvbnNbICdjYWxlbmRhcl8nICsgcmVzb3VyY2VfaWQgXVsgc3FsX2NsYXNzX2RheSBdO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBbXTtcdFx0Ly8gSWYgbm90IGRlZmluZWQsIHRoZW4gW107XHJcblx0fTtcclxuXHJcblxyXG5cdC8vIE90aGVyIHBhcmFtZXRlcnMgXHRcdFx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0dmFyIHBfb3RoZXIgPSBvYmoub3RoZXJfb2JqID0gb2JqLm90aGVyX29iaiB8fCB7IH07XHJcblxyXG5cdG9iai5zZXRfb3RoZXJfcGFyYW0gPSBmdW5jdGlvbiAoIHBhcmFtX2tleSwgcGFyYW1fdmFsICkge1xyXG5cdFx0cF9vdGhlclsgcGFyYW1fa2V5IF0gPSBwYXJhbV92YWw7XHJcblx0fTtcclxuXHJcblx0b2JqLmdldF9vdGhlcl9wYXJhbSA9IGZ1bmN0aW9uICggcGFyYW1fa2V5ICkge1xyXG5cdFx0cmV0dXJuIHBfb3RoZXJbIHBhcmFtX2tleSBdO1xyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldCBhbGwgb3RoZXIgcGFyYW1zXHJcblx0ICpcclxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fHt9fVxyXG5cdCAqL1xyXG5cdG9iai5nZXRfb3RoZXJfcGFyYW1fX2FsbCA9IGZ1bmN0aW9uICgpIHtcclxuXHRcdHJldHVybiBwX290aGVyO1xyXG5cdH07XHJcblxyXG5cdC8vIE1lc3NhZ2VzIFx0XHRcdCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0dmFyIHBfbWVzc2FnZXMgPSBvYmoubWVzc2FnZXNfb2JqID0gb2JqLm1lc3NhZ2VzX29iaiB8fCB7IH07XHJcblxyXG5cdG9iai5zZXRfbWVzc2FnZSA9IGZ1bmN0aW9uICggcGFyYW1fa2V5LCBwYXJhbV92YWwgKSB7XHJcblx0XHRwX21lc3NhZ2VzWyBwYXJhbV9rZXkgXSA9IHBhcmFtX3ZhbDtcclxuXHR9O1xyXG5cclxuXHRvYmouZ2V0X21lc3NhZ2UgPSBmdW5jdGlvbiAoIHBhcmFtX2tleSApIHtcclxuXHRcdHJldHVybiBwX21lc3NhZ2VzWyBwYXJhbV9rZXkgXTtcclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiBHZXQgYWxsIG90aGVyIHBhcmFtc1xyXG5cdCAqXHJcblx0ICogQHJldHVybnMge29iamVjdHx7fX1cclxuXHQgKi9cclxuXHRvYmouZ2V0X21lc3NhZ2VzX19hbGwgPSBmdW5jdGlvbiAoKSB7XHJcblx0XHRyZXR1cm4gcF9tZXNzYWdlcztcclxuXHR9O1xyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHRyZXR1cm4gb2JqO1xyXG5cclxufSggX3dwYmMgfHwge30sIGpRdWVyeSApKTtcclxuIiwid2luZG93Ll9fV1BCQ19ERVYgPSB0cnVlO1xyXG5cclxuLyoqXHJcbiAqIEV4dGVuZCBfd3BiYyB3aXRoICBuZXcgbWV0aG9kc1xyXG4gKlxyXG4gKiBAdHlwZSB7Knx7fX1cclxuICogQHByaXZhdGVcclxuICovXHJcbl93cGJjID0gKGZ1bmN0aW9uIChvYmosICQpIHtcclxuXHJcblx0LyoqXHJcblx0ICogRGV2IGxvZ2dlciAobm8tb3AgdW5sZXNzIHdpbmRvdy5fX1dQQkNfREVWID0gdHJ1ZSlcclxuXHQgKlxyXG5cdCAqIEB0eXBlIHsqfHt3YXJuOiAoZnVuY3Rpb24oKiwgKiwgKik6IHZvaWQpLCBlcnJvcjogKGZ1bmN0aW9uKCosICosICopOiB2b2lkKSwgb25jZTogb2JqLmRldi5vbmNlLCB0cnk6ICgoZnVuY3Rpb24oKiwgKiwgKik6ICgqfHVuZGVmaW5lZCkpfCopfX1cclxuXHQgKi9cclxuXHRvYmouZGV2ID0gb2JqLmRldiB8fCAoKCkgPT4ge1xyXG5cdFx0Y29uc3Qgc2VlbiAgICA9IG5ldyBTZXQoKTtcclxuXHRcdGNvbnN0IGVuYWJsZWQgPSAoKSA9PiAhIXdpbmRvdy5fX1dQQkNfREVWO1xyXG5cclxuXHRcdGZ1bmN0aW9uIG91dChsZXZlbCwgY29kZSwgbXNnLCBleHRyYSkge1xyXG5cdFx0XHRpZiAoICFlbmFibGVkKCkgKSByZXR1cm47XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0KGNvbnNvbGVbbGV2ZWxdIHx8IGNvbnNvbGUud2FybikoIGBbV1BCQ11bJHtjb2RlfV0gJHttc2d9YCwgZXh0cmEgPz8gJycgKTtcclxuXHRcdFx0fSBjYXRjaCB7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRsb2cgIDogKGNvZGUsIG1zZywgZXh0cmEpID0+IG91dCgnbG9nJywgICBjb2RlLCBtc2csIGV4dHJhKSxcclxuXHRcdFx0ZGVidWc6IChjb2RlLCBtc2csIGV4dHJhKSA9PiBvdXQoJ2RlYnVnJywgY29kZSwgbXNnLCBleHRyYSksXHJcblx0XHRcdHdhcm4gOiAoY29kZSwgbXNnLCBleHRyYSkgPT4gb3V0KCAnd2FybicsIGNvZGUsIG1zZywgZXh0cmEgKSxcclxuXHRcdFx0ZXJyb3I6IChjb2RlLCBlcnJPck1zZywgZXh0cmEpID0+XHJcblx0XHRcdFx0b3V0KCAnZXJyb3InLCBjb2RlLFxyXG5cdFx0XHRcdFx0ZXJyT3JNc2cgaW5zdGFuY2VvZiBFcnJvciA/IGVyck9yTXNnLm1lc3NhZ2UgOiBTdHJpbmcoIGVyck9yTXNnICksXHJcblx0XHRcdFx0XHRlcnJPck1zZyBpbnN0YW5jZW9mIEVycm9yID8gZXJyT3JNc2cgOiBleHRyYSApLFxyXG5cdFx0XHRvbmNlIDogKGNvZGUsIG1zZywgZXh0cmEpID0+IHtcclxuXHRcdFx0XHRpZiAoICFlbmFibGVkKCkgKSByZXR1cm47XHJcblx0XHRcdFx0Y29uc3Qga2V5ID0gYCR7Y29kZX18JHttc2d9YDtcclxuXHRcdFx0XHRpZiAoIHNlZW4uaGFzKCBrZXkgKSApIHJldHVybjtcclxuXHRcdFx0XHRzZWVuLmFkZCgga2V5ICk7XHJcblx0XHRcdFx0b3V0KCAnZXJyb3InLCBjb2RlLCBtc2csIGV4dHJhICk7XHJcblx0XHRcdH0sXHJcblx0XHRcdHRyeSAgOiAoY29kZSwgZm4sIGV4dHJhKSA9PiB7XHJcblx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdHJldHVybiBmbigpO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0XHRcdFx0b3V0KCAnZXJyb3InLCBjb2RlLCBlLCBleHRyYSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHR9KSgpO1xyXG5cclxuXHQvLyBPcHRpb25hbDogZ2xvYmFsIHRyYXBzIGluIGRldi5cclxuXHRpZiAoIHdpbmRvdy5fX1dQQkNfREVWICkge1xyXG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIChlKSA9PiB7XHJcblx0XHRcdHRyeSB7IF93cGJjPy5kZXY/LmVycm9yKCAnR0xPQkFMLUVSUk9SJywgZT8uZXJyb3IgfHwgZT8ubWVzc2FnZSwgZSApOyB9IGNhdGNoICggXyApIHt9XHJcblx0XHR9ICk7XHJcblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3VuaGFuZGxlZHJlamVjdGlvbicsIChlKSA9PiB7XHJcblx0XHRcdHRyeSB7IF93cGJjPy5kZXY/LmVycm9yKCAnR0xPQkFMLVJFSkVDVElPTicsIGU/LnJlYXNvbiApOyB9IGNhdGNoICggXyApIHt9XHJcblx0XHR9ICk7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gb2JqO1xyXG5cdH0oIF93cGJjIHx8IHt9LCBqUXVlcnkgKSk7XHJcbiIsIi8qKlxyXG4gKiBFeHRlbmQgX3dwYmMgd2l0aCAgbmV3IG1ldGhvZHMgICAgICAgIC8vIEZpeEluOiA5LjguNi4yLlxyXG4gKlxyXG4gKiBAdHlwZSB7Knx7fX1cclxuICogQHByaXZhdGVcclxuICovXHJcbiBfd3BiYyA9IChmdW5jdGlvbiAoIG9iaiwgJCkge1xyXG5cclxuXHQvLyBMb2FkIEJhbGFuY2VyIFx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0dmFyIHBfYmFsYW5jZXIgPSBvYmouYmFsYW5jZXJfb2JqID0gb2JqLmJhbGFuY2VyX29iaiB8fCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J21heF90aHJlYWRzJzogMixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnaW5fcHJvY2VzcycgOiBbXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnd2FpdCcgICAgICAgOiBbXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xyXG5cclxuXHQgLyoqXHJcblx0ICAqIFNldCAgbWF4IHBhcmFsbGVsIHJlcXVlc3QgIHRvICBsb2FkXHJcblx0ICAqXHJcblx0ICAqIEBwYXJhbSBtYXhfdGhyZWFkc1xyXG5cdCAgKi9cclxuXHRvYmouYmFsYW5jZXJfX3NldF9tYXhfdGhyZWFkcyA9IGZ1bmN0aW9uICggbWF4X3RocmVhZHMgKXtcclxuXHJcblx0XHRwX2JhbGFuY2VyWyAnbWF4X3RocmVhZHMnIF0gPSBtYXhfdGhyZWFkcztcclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiAgQ2hlY2sgaWYgYmFsYW5jZXIgZm9yIHNwZWNpZmljIGJvb2tpbmcgcmVzb3VyY2UgZGVmaW5lZCAgIDo6ICAgdHJ1ZSB8IGZhbHNlXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ3xpbnR9IHJlc291cmNlX2lkXHJcblx0ICogQHJldHVybnMge2Jvb2xlYW59XHJcblx0ICovXHJcblx0b2JqLmJhbGFuY2VyX19pc19kZWZpbmVkID0gZnVuY3Rpb24gKCByZXNvdXJjZV9pZCApIHtcclxuXHJcblx0XHRyZXR1cm4gKCd1bmRlZmluZWQnICE9PSB0eXBlb2YoIHBfYmFsYW5jZXJbICdiYWxhbmNlcl8nICsgcmVzb3VyY2VfaWQgXSApICk7XHJcblx0fTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqICBDcmVhdGUgYmFsYW5jZXIgaW5pdGlhbGl6aW5nXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ3xpbnR9IHJlc291cmNlX2lkXHJcblx0ICovXHJcblx0b2JqLmJhbGFuY2VyX19pbml0ID0gZnVuY3Rpb24gKCByZXNvdXJjZV9pZCwgZnVuY3Rpb25fbmFtZSAsIHBhcmFtcyA9e30pIHtcclxuXHJcblx0XHR2YXIgYmFsYW5jZV9vYmogPSB7fTtcclxuXHRcdGJhbGFuY2Vfb2JqWyAncmVzb3VyY2VfaWQnIF0gICA9IHJlc291cmNlX2lkO1xyXG5cdFx0YmFsYW5jZV9vYmpbICdwcmlvcml0eScgXSAgICAgID0gMTtcclxuXHRcdGJhbGFuY2Vfb2JqWyAnZnVuY3Rpb25fbmFtZScgXSA9IGZ1bmN0aW9uX25hbWU7XHJcblx0XHRiYWxhbmNlX29ialsgJ3BhcmFtcycgXSAgICAgICAgPSB3cGJjX2Nsb25lX29iaiggcGFyYW1zICk7XHJcblxyXG5cclxuXHRcdGlmICggb2JqLmJhbGFuY2VyX19pc19hbHJlYWR5X3J1biggcmVzb3VyY2VfaWQsIGZ1bmN0aW9uX25hbWUgKSApe1xyXG5cdFx0XHRyZXR1cm4gJ3J1bic7XHJcblx0XHR9XHJcblx0XHRpZiAoIG9iai5iYWxhbmNlcl9faXNfYWxyZWFkeV93YWl0KCByZXNvdXJjZV9pZCwgZnVuY3Rpb25fbmFtZSApICl7XHJcblx0XHRcdHJldHVybiAnd2FpdCc7XHJcblx0XHR9XHJcblxyXG5cclxuXHRcdGlmICggb2JqLmJhbGFuY2VyX19jYW5faV9ydW4oKSApe1xyXG5cdFx0XHRvYmouYmFsYW5jZXJfX2FkZF90b19fcnVuKCBiYWxhbmNlX29iaiApO1xyXG5cdFx0XHRyZXR1cm4gJ3J1bic7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRvYmouYmFsYW5jZXJfX2FkZF90b19fd2FpdCggYmFsYW5jZV9vYmogKTtcclxuXHRcdFx0cmV0dXJuICd3YWl0JztcclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHQgLyoqXHJcblx0ICAqIENhbiBJIFJ1biA/XHJcblx0ICAqIEByZXR1cm5zIHtib29sZWFufVxyXG5cdCAgKi9cclxuXHRvYmouYmFsYW5jZXJfX2Nhbl9pX3J1biA9IGZ1bmN0aW9uICgpe1xyXG5cdFx0cmV0dXJuICggcF9iYWxhbmNlclsgJ2luX3Byb2Nlc3MnIF0ubGVuZ3RoIDwgcF9iYWxhbmNlclsgJ21heF90aHJlYWRzJyBdICk7XHJcblx0fVxyXG5cclxuXHRcdCAvKipcclxuXHRcdCAgKiBBZGQgdG8gV0FJVFxyXG5cdFx0ICAqIEBwYXJhbSBiYWxhbmNlX29ialxyXG5cdFx0ICAqL1xyXG5cdFx0b2JqLmJhbGFuY2VyX19hZGRfdG9fX3dhaXQgPSBmdW5jdGlvbiAoIGJhbGFuY2Vfb2JqICkge1xyXG5cdFx0XHRwX2JhbGFuY2VyWyd3YWl0J10ucHVzaCggYmFsYW5jZV9vYmogKTtcclxuXHRcdH1cclxuXHJcblx0XHQgLyoqXHJcblx0XHQgICogUmVtb3ZlIGZyb20gV2FpdFxyXG5cdFx0ICAqXHJcblx0XHQgICogQHBhcmFtIHJlc291cmNlX2lkXHJcblx0XHQgICogQHBhcmFtIGZ1bmN0aW9uX25hbWVcclxuXHRcdCAgKiBAcmV0dXJucyB7Knxib29sZWFufVxyXG5cdFx0ICAqL1xyXG5cdFx0b2JqLmJhbGFuY2VyX19yZW1vdmVfZnJvbV9fd2FpdF9saXN0ID0gZnVuY3Rpb24gKCByZXNvdXJjZV9pZCwgZnVuY3Rpb25fbmFtZSApe1xyXG5cclxuXHRcdFx0dmFyIHJlbW92ZWRfZWwgPSBmYWxzZTtcclxuXHJcblx0XHRcdGlmICggcF9iYWxhbmNlclsgJ3dhaXQnIF0ubGVuZ3RoICl7XHRcdFx0XHRcdC8vIEZpeEluOiA5LjguMTAuMS5cclxuXHRcdFx0XHRmb3IgKCB2YXIgaSBpbiBwX2JhbGFuY2VyWyAnd2FpdCcgXSApe1xyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHQocmVzb3VyY2VfaWQgPT09IHBfYmFsYW5jZXJbICd3YWl0JyBdWyBpIF1bICdyZXNvdXJjZV9pZCcgXSlcclxuXHRcdFx0XHRcdFx0JiYgKGZ1bmN0aW9uX25hbWUgPT09IHBfYmFsYW5jZXJbICd3YWl0JyBdWyBpIF1bICdmdW5jdGlvbl9uYW1lJyBdKVxyXG5cdFx0XHRcdFx0KXtcclxuXHRcdFx0XHRcdFx0cmVtb3ZlZF9lbCA9IHBfYmFsYW5jZXJbICd3YWl0JyBdLnNwbGljZSggaSwgMSApO1xyXG5cdFx0XHRcdFx0XHRyZW1vdmVkX2VsID0gcmVtb3ZlZF9lbC5wb3AoKTtcclxuXHRcdFx0XHRcdFx0cF9iYWxhbmNlclsgJ3dhaXQnIF0gPSBwX2JhbGFuY2VyWyAnd2FpdCcgXS5maWx0ZXIoIGZ1bmN0aW9uICggdiApe1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB2O1xyXG5cdFx0XHRcdFx0XHR9ICk7XHRcdFx0XHRcdC8vIFJlaW5kZXggYXJyYXlcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlbW92ZWRfZWw7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiByZW1vdmVkX2VsO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0KiBJcyBhbHJlYWR5IFdBSVRcclxuXHRcdCpcclxuXHRcdCogQHBhcmFtIHJlc291cmNlX2lkXHJcblx0XHQqIEBwYXJhbSBmdW5jdGlvbl9uYW1lXHJcblx0XHQqIEByZXR1cm5zIHtib29sZWFufVxyXG5cdFx0Ki9cclxuXHRcdG9iai5iYWxhbmNlcl9faXNfYWxyZWFkeV93YWl0ID0gZnVuY3Rpb24gKCByZXNvdXJjZV9pZCwgZnVuY3Rpb25fbmFtZSApe1xyXG5cclxuXHRcdFx0aWYgKCBwX2JhbGFuY2VyWyAnd2FpdCcgXS5sZW5ndGggKXtcdFx0XHRcdC8vIEZpeEluOiA5LjguMTAuMS5cclxuXHRcdFx0XHRmb3IgKCB2YXIgaSBpbiBwX2JhbGFuY2VyWyAnd2FpdCcgXSApe1xyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHQocmVzb3VyY2VfaWQgPT09IHBfYmFsYW5jZXJbICd3YWl0JyBdWyBpIF1bICdyZXNvdXJjZV9pZCcgXSlcclxuXHRcdFx0XHRcdFx0JiYgKGZ1bmN0aW9uX25hbWUgPT09IHBfYmFsYW5jZXJbICd3YWl0JyBdWyBpIF1bICdmdW5jdGlvbl9uYW1lJyBdKVxyXG5cdFx0XHRcdFx0KXtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0IC8qKlxyXG5cdFx0ICAqIEFkZCB0byBSVU5cclxuXHRcdCAgKiBAcGFyYW0gYmFsYW5jZV9vYmpcclxuXHRcdCAgKi9cclxuXHRcdG9iai5iYWxhbmNlcl9fYWRkX3RvX19ydW4gPSBmdW5jdGlvbiAoIGJhbGFuY2Vfb2JqICkge1xyXG5cdFx0XHRwX2JhbGFuY2VyWydpbl9wcm9jZXNzJ10ucHVzaCggYmFsYW5jZV9vYmogKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCogUmVtb3ZlIGZyb20gUlVOIGxpc3RcclxuXHRcdCpcclxuXHRcdCogQHBhcmFtIHJlc291cmNlX2lkXHJcblx0XHQqIEBwYXJhbSBmdW5jdGlvbl9uYW1lXHJcblx0XHQqIEByZXR1cm5zIHsqfGJvb2xlYW59XHJcblx0XHQqL1xyXG5cdFx0b2JqLmJhbGFuY2VyX19yZW1vdmVfZnJvbV9fcnVuX2xpc3QgPSBmdW5jdGlvbiAoIHJlc291cmNlX2lkLCBmdW5jdGlvbl9uYW1lICl7XHJcblxyXG5cdFx0XHQgdmFyIHJlbW92ZWRfZWwgPSBmYWxzZTtcclxuXHJcblx0XHRcdCBpZiAoIHBfYmFsYW5jZXJbICdpbl9wcm9jZXNzJyBdLmxlbmd0aCApe1x0XHRcdFx0Ly8gRml4SW46IDkuOC4xMC4xLlxyXG5cdFx0XHRcdCBmb3IgKCB2YXIgaSBpbiBwX2JhbGFuY2VyWyAnaW5fcHJvY2VzcycgXSApe1xyXG5cdFx0XHRcdFx0IGlmIChcclxuXHRcdFx0XHRcdFx0IChyZXNvdXJjZV9pZCA9PT0gcF9iYWxhbmNlclsgJ2luX3Byb2Nlc3MnIF1bIGkgXVsgJ3Jlc291cmNlX2lkJyBdKVxyXG5cdFx0XHRcdFx0XHQgJiYgKGZ1bmN0aW9uX25hbWUgPT09IHBfYmFsYW5jZXJbICdpbl9wcm9jZXNzJyBdWyBpIF1bICdmdW5jdGlvbl9uYW1lJyBdKVxyXG5cdFx0XHRcdFx0ICl7XHJcblx0XHRcdFx0XHRcdCByZW1vdmVkX2VsID0gcF9iYWxhbmNlclsgJ2luX3Byb2Nlc3MnIF0uc3BsaWNlKCBpLCAxICk7XHJcblx0XHRcdFx0XHRcdCByZW1vdmVkX2VsID0gcmVtb3ZlZF9lbC5wb3AoKTtcclxuXHRcdFx0XHRcdFx0IHBfYmFsYW5jZXJbICdpbl9wcm9jZXNzJyBdID0gcF9iYWxhbmNlclsgJ2luX3Byb2Nlc3MnIF0uZmlsdGVyKCBmdW5jdGlvbiAoIHYgKXtcclxuXHRcdFx0XHRcdFx0XHQgcmV0dXJuIHY7XHJcblx0XHRcdFx0XHRcdCB9ICk7XHRcdC8vIFJlaW5kZXggYXJyYXlcclxuXHRcdFx0XHRcdFx0IHJldHVybiByZW1vdmVkX2VsO1xyXG5cdFx0XHRcdFx0IH1cclxuXHRcdFx0XHQgfVxyXG5cdFx0XHQgfVxyXG5cdFx0XHQgcmV0dXJuIHJlbW92ZWRfZWw7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQqIElzIGFscmVhZHkgUlVOXHJcblx0XHQqXHJcblx0XHQqIEBwYXJhbSByZXNvdXJjZV9pZFxyXG5cdFx0KiBAcGFyYW0gZnVuY3Rpb25fbmFtZVxyXG5cdFx0KiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuXHRcdCovXHJcblx0XHRvYmouYmFsYW5jZXJfX2lzX2FscmVhZHlfcnVuID0gZnVuY3Rpb24gKCByZXNvdXJjZV9pZCwgZnVuY3Rpb25fbmFtZSApe1xyXG5cclxuXHRcdFx0aWYgKCBwX2JhbGFuY2VyWyAnaW5fcHJvY2VzcycgXS5sZW5ndGggKXtcdFx0XHRcdFx0Ly8gRml4SW46IDkuOC4xMC4xLlxyXG5cdFx0XHRcdGZvciAoIHZhciBpIGluIHBfYmFsYW5jZXJbICdpbl9wcm9jZXNzJyBdICl7XHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdChyZXNvdXJjZV9pZCA9PT0gcF9iYWxhbmNlclsgJ2luX3Byb2Nlc3MnIF1bIGkgXVsgJ3Jlc291cmNlX2lkJyBdKVxyXG5cdFx0XHRcdFx0XHQmJiAoZnVuY3Rpb25fbmFtZSA9PT0gcF9iYWxhbmNlclsgJ2luX3Byb2Nlc3MnIF1bIGkgXVsgJ2Z1bmN0aW9uX25hbWUnIF0pXHJcblx0XHRcdFx0XHQpe1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHJcblxyXG5cdG9iai5iYWxhbmNlcl9fcnVuX25leHQgPSBmdW5jdGlvbiAoKXtcclxuXHJcblx0XHQvLyBHZXQgMXN0IGZyb20gIFdhaXQgbGlzdFxyXG5cdFx0dmFyIHJlbW92ZWRfZWwgPSBmYWxzZTtcclxuXHRcdGlmICggcF9iYWxhbmNlclsgJ3dhaXQnIF0ubGVuZ3RoICl7XHRcdFx0XHRcdC8vIEZpeEluOiA5LjguMTAuMS5cclxuXHRcdFx0Zm9yICggdmFyIGkgaW4gcF9iYWxhbmNlclsgJ3dhaXQnIF0gKXtcclxuXHRcdFx0XHRyZW1vdmVkX2VsID0gb2JqLmJhbGFuY2VyX19yZW1vdmVfZnJvbV9fd2FpdF9saXN0KCBwX2JhbGFuY2VyWyAnd2FpdCcgXVsgaSBdWyAncmVzb3VyY2VfaWQnIF0sIHBfYmFsYW5jZXJbICd3YWl0JyBdWyBpIF1bICdmdW5jdGlvbl9uYW1lJyBdICk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGZhbHNlICE9PSByZW1vdmVkX2VsICl7XHJcblxyXG5cdFx0XHQvLyBSdW5cclxuXHRcdFx0b2JqLmJhbGFuY2VyX19ydW4oIHJlbW92ZWRfZWwgKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdCAvKipcclxuXHQgICogUnVuXHJcblx0ICAqIEBwYXJhbSBiYWxhbmNlX29ialxyXG5cdCAgKi9cclxuXHRvYmouYmFsYW5jZXJfX3J1biA9IGZ1bmN0aW9uICggYmFsYW5jZV9vYmogKXtcclxuXHJcblx0XHRzd2l0Y2ggKCBiYWxhbmNlX29ialsgJ2Z1bmN0aW9uX25hbWUnIF0gKXtcclxuXHJcblx0XHRcdGNhc2UgJ3dwYmNfY2FsZW5kYXJfX2xvYWRfZGF0YV9fYWp4JzpcclxuXHJcblx0XHRcdFx0Ly8gQWRkIHRvIHJ1biBsaXN0XHJcblx0XHRcdFx0b2JqLmJhbGFuY2VyX19hZGRfdG9fX3J1biggYmFsYW5jZV9vYmogKTtcclxuXHJcblx0XHRcdFx0d3BiY19jYWxlbmRhcl9fbG9hZF9kYXRhX19hangoIGJhbGFuY2Vfb2JqWyAncGFyYW1zJyBdIClcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gb2JqO1xyXG5cclxufSggX3dwYmMgfHwge30sIGpRdWVyeSApKTtcclxuXHJcblxyXG4gXHQvKipcclxuIFx0ICogLS0gSGVscCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdCAqL1xyXG5cclxuXHRmdW5jdGlvbiB3cGJjX2JhbGFuY2VyX19pc193YWl0KCBwYXJhbXMsIGZ1bmN0aW9uX25hbWUgKXtcclxuLy9jb25zb2xlLmxvZygnOjp3cGJjX2JhbGFuY2VyX19pc193YWl0JyxwYXJhbXMgLCBmdW5jdGlvbl9uYW1lICk7XHJcblx0XHRpZiAoICd1bmRlZmluZWQnICE9PSB0eXBlb2YgKHBhcmFtc1sgJ3Jlc291cmNlX2lkJyBdKSApe1xyXG5cclxuXHRcdFx0dmFyIGJhbGFuY2VyX3N0YXR1cyA9IF93cGJjLmJhbGFuY2VyX19pbml0KCBwYXJhbXNbICdyZXNvdXJjZV9pZCcgXSwgZnVuY3Rpb25fbmFtZSwgcGFyYW1zICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gKCAnd2FpdCcgPT09IGJhbGFuY2VyX3N0YXR1cyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9XHJcblxyXG5cclxuXHRmdW5jdGlvbiB3cGJjX2JhbGFuY2VyX19jb21wbGV0ZWQoIHJlc291cmNlX2lkICwgZnVuY3Rpb25fbmFtZSApe1xyXG4vL2NvbnNvbGUubG9nKCc6OndwYmNfYmFsYW5jZXJfX2NvbXBsZXRlZCcscmVzb3VyY2VfaWQgLCBmdW5jdGlvbl9uYW1lICk7XHJcblx0XHRfd3BiYy5iYWxhbmNlcl9fcmVtb3ZlX2Zyb21fX3J1bl9saXN0KCByZXNvdXJjZV9pZCwgZnVuY3Rpb25fbmFtZSApO1xyXG5cdFx0X3dwYmMuYmFsYW5jZXJfX3J1bl9uZXh0KCk7XHJcblx0fSIsIi8qKlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICpcdGluY2x1ZGVzL19fanMvY2FsL3dwYmNfY2FsLmpzXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBPcmRlciBvciBjaGlsZCBib29raW5nIHJlc291cmNlcyBzYXZlZCBoZXJlOiAgXHRfd3BiYy5ib29raW5nX19nZXRfcGFyYW1fdmFsdWUoIHJlc291cmNlX2lkLFxyXG4gKiAncmVzb3VyY2VzX2lkX2Fycl9faW5fZGF0ZXMnIClcdFx0WzIsMTAsMTIsMTFdXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEhvdyB0byBjaGVjayAgYm9va2VkIHRpbWVzIG9uICBzcGVjaWZpYyBkYXRlOiA/XHJcbiAqXHJcblx0XHRcdF93cGJjLmJvb2tpbmdzX2luX2NhbGVuZGFyX19nZXRfZm9yX2RhdGUoMiwnMjAyMy0wOC0yMScpO1xyXG5cclxuXHRcdFx0Y29uc29sZS5sb2coXHJcblx0XHRcdFx0XHRcdF93cGJjLmJvb2tpbmdzX2luX2NhbGVuZGFyX19nZXRfZm9yX2RhdGUoMiwnMjAyMy0wOC0yMScpWzJdLmJvb2tlZF90aW1lX3Nsb3RzLm1lcmdlZF9zZWNvbmRzLFxyXG5cdFx0XHRcdFx0XHRfd3BiYy5ib29raW5nc19pbl9jYWxlbmRhcl9fZ2V0X2Zvcl9kYXRlKDIsJzIwMjMtMDgtMjEnKVsxMF0uYm9va2VkX3RpbWVfc2xvdHMubWVyZ2VkX3NlY29uZHMsXHJcblx0XHRcdFx0XHRcdF93cGJjLmJvb2tpbmdzX2luX2NhbGVuZGFyX19nZXRfZm9yX2RhdGUoMiwnMjAyMy0wOC0yMScpWzExXS5ib29rZWRfdGltZV9zbG90cy5tZXJnZWRfc2Vjb25kcyxcclxuXHRcdFx0XHRcdFx0X3dwYmMuYm9va2luZ3NfaW5fY2FsZW5kYXJfX2dldF9mb3JfZGF0ZSgyLCcyMDIzLTA4LTIxJylbMTJdLmJvb2tlZF90aW1lX3Nsb3RzLm1lcmdlZF9zZWNvbmRzXHJcblx0XHRcdFx0XHQpO1xyXG4gKiAgT1JcclxuXHRcdFx0Y29uc29sZS5sb2coXHJcblx0XHRcdFx0XHRcdF93cGJjLmJvb2tpbmdzX2luX2NhbGVuZGFyX19nZXRfZm9yX2RhdGUoMiwnMjAyMy0wOC0yMScpWzJdLmJvb2tlZF90aW1lX3Nsb3RzLm1lcmdlZF9yZWFkYWJsZSxcclxuXHRcdFx0XHRcdFx0X3dwYmMuYm9va2luZ3NfaW5fY2FsZW5kYXJfX2dldF9mb3JfZGF0ZSgyLCcyMDIzLTA4LTIxJylbMTBdLmJvb2tlZF90aW1lX3Nsb3RzLm1lcmdlZF9yZWFkYWJsZSxcclxuXHRcdFx0XHRcdFx0X3dwYmMuYm9va2luZ3NfaW5fY2FsZW5kYXJfX2dldF9mb3JfZGF0ZSgyLCcyMDIzLTA4LTIxJylbMTFdLmJvb2tlZF90aW1lX3Nsb3RzLm1lcmdlZF9yZWFkYWJsZSxcclxuXHRcdFx0XHRcdFx0X3dwYmMuYm9va2luZ3NfaW5fY2FsZW5kYXJfX2dldF9mb3JfZGF0ZSgyLCcyMDIzLTA4LTIxJylbMTJdLmJvb2tlZF90aW1lX3Nsb3RzLm1lcmdlZF9yZWFkYWJsZVxyXG5cdFx0XHRcdFx0KTtcclxuICpcclxuICovXHJcblxyXG4vKipcclxuICogRGF5cyBzZWxlY3Rpb246XHJcbiAqIFx0XHRcdFx0XHR3cGJjX2NhbGVuZGFyX191bnNlbGVjdF9hbGxfZGF0ZXMoIHJlc291cmNlX2lkICk7XHJcbiAqXHJcbiAqXHRcdFx0XHRcdHZhciByZXNvdXJjZV9pZCA9IDE7XHJcbiAqIFx0RXhhbXBsZSAxOlx0XHR2YXIgbnVtX3NlbGVjdGVkX2RheXMgPSB3cGJjX2F1dG9fc2VsZWN0X2RhdGVzX2luX2NhbGVuZGFyKCByZXNvdXJjZV9pZCwgJzIwMjQtMDUtMTUnLFxyXG4gKiAnMjAyNC0wNS0yNScgKTsgRXhhbXBsZSAyOlx0XHR2YXIgbnVtX3NlbGVjdGVkX2RheXMgPSB3cGJjX2F1dG9fc2VsZWN0X2RhdGVzX2luX2NhbGVuZGFyKCByZXNvdXJjZV9pZCxcclxuICogWycyMDI0LTA1LTA5JywnMjAyNC0wNS0xOScsJzIwMjQtMDUtMjUnXSApO1xyXG4gKlxyXG4gKi9cclxuXHJcblxyXG4vKipcclxuICogQyBBIEwgRSBOIEQgQSBSICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICovXHJcblxyXG5cclxuLyoqXHJcbiAqICBTaG93IFdQQkMgQ2FsZW5kYXJcclxuICpcclxuICogQHBhcmFtIHJlc291cmNlX2lkXHRcdFx0LSByZXNvdXJjZSBJRFxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfY2FsZW5kYXJfc2hvdyggcmVzb3VyY2VfaWQgKXtcclxuXHJcblx0Ly8gSWYgbm8gY2FsZW5kYXIgSFRNTCB0YWcsICB0aGVuICBleGl0XHJcblx0aWYgKCAwID09PSBqUXVlcnkoICcjY2FsZW5kYXJfYm9va2luZycgKyByZXNvdXJjZV9pZCApLmxlbmd0aCApeyByZXR1cm4gZmFsc2U7IH1cclxuXHJcblx0Ly8gSWYgdGhlIGNhbGVuZGFyIHdpdGggdGhlIHNhbWUgQm9va2luZyByZXNvdXJjZSBpcyBhY3RpdmF0ZWQgYWxyZWFkeSwgdGhlbiBleGl0LiBCdXQgaW4gRWxlbWVudG9yIHRoZSBjbGFzcyBjYW4gYmUgc3RhbGUsIHNvIHZlcmlmeSBpbnN0YW5jZS5cclxuXHRpZiAoIGpRdWVyeSggJyNjYWxlbmRhcl9ib29raW5nJyArIHJlc291cmNlX2lkICkuaGFzQ2xhc3MoICdoYXNEYXRlcGljaycgKSApIHtcclxuXHJcblx0XHR2YXIgZXhpc3RpbmdfaW5zdCA9IG51bGw7XHJcblxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0ZXhpc3RpbmdfaW5zdCA9IGpRdWVyeS5kYXRlcGljay5fZ2V0SW5zdCggalF1ZXJ5KCAnI2NhbGVuZGFyX2Jvb2tpbmcnICsgcmVzb3VyY2VfaWQgKS5nZXQoIDAgKSApO1xyXG5cdFx0fSBjYXRjaCAoIGUgKSB7XHJcblx0XHRcdGV4aXN0aW5nX2luc3QgPSBudWxsO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZXhpc3RpbmdfaW5zdCApIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFN0YWxlIG1hcmtlcjogcmVtb3ZlIGFuZCBjb250aW51ZSB3aXRoIGluaXQuXHJcblx0XHRqUXVlcnkoICcjY2FsZW5kYXJfYm9va2luZycgKyByZXNvdXJjZV9pZCApLnJlbW92ZUNsYXNzKCAnaGFzRGF0ZXBpY2snICk7XHJcblx0fVxyXG5cclxuXHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gRGF5cyBzZWxlY3Rpb25cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHZhciBsb2NhbF9faXNfcmFuZ2Vfc2VsZWN0ID0gZmFsc2U7XHJcblx0dmFyIGxvY2FsX19tdWx0aV9kYXlzX3NlbGVjdF9udW0gICA9IDM2NTtcdFx0XHRcdFx0Ly8gbXVsdGlwbGUgfCBmaXhlZFxyXG5cdGlmICggJ2R5bmFtaWMnID09PSBfd3BiYy5jYWxlbmRhcl9fZ2V0X3BhcmFtX3ZhbHVlKCByZXNvdXJjZV9pZCwgJ2RheXNfc2VsZWN0X21vZGUnICkgKXtcclxuXHRcdGxvY2FsX19pc19yYW5nZV9zZWxlY3QgPSB0cnVlO1xyXG5cdFx0bG9jYWxfX211bHRpX2RheXNfc2VsZWN0X251bSA9IDA7XHJcblx0fVxyXG5cdGlmICggJ3NpbmdsZScgID09PSBfd3BiYy5jYWxlbmRhcl9fZ2V0X3BhcmFtX3ZhbHVlKCByZXNvdXJjZV9pZCwgJ2RheXNfc2VsZWN0X21vZGUnICkgKXtcclxuXHRcdGxvY2FsX19tdWx0aV9kYXlzX3NlbGVjdF9udW0gPSAwO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvLyBNaW4gLSBNYXggZGF5cyB0byBzY3JvbGwvc2hvd1xyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0dmFyIGxvY2FsX19taW5fZGF0ZSA9IDA7XHJcbiBcdGxvY2FsX19taW5fZGF0ZSA9IG5ldyBEYXRlKCBfd3BiYy5nZXRfb3RoZXJfcGFyYW0oICd0b2RheV9hcnInIClbIDAgXSwgKHBhcnNlSW50KCBfd3BiYy5nZXRfb3RoZXJfcGFyYW0oICd0b2RheV9hcnInIClbIDEgXSApIC0gMSksIF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ3RvZGF5X2FycicgKVsgMiBdLCAwLCAwLCAwICk7XHRcdFx0Ly8gRml4SW46IDkuOS4wLjE3LlxyXG4vL2NvbnNvbGUubG9nKCBsb2NhbF9fbWluX2RhdGUgKTtcclxuXHR2YXIgbG9jYWxfX21heF9kYXRlID0gX3dwYmMuY2FsZW5kYXJfX2dldF9wYXJhbV92YWx1ZSggcmVzb3VyY2VfaWQsICdib29raW5nX21heF9tb250aGVzX2luX2NhbGVuZGFyJyApO1xyXG5cdC8vbG9jYWxfX21heF9kYXRlID0gbmV3IERhdGUoMjAyNCwgNSwgMjgpOyAgSXQgaXMgaGVyZSBpc3N1ZSBvZiBub3Qgc2VsZWN0YWJsZSBkYXRlcywgYnV0IHNvbWUgZGF0ZXMgc2hvd2luZyBpbiBjYWxlbmRhciBhcyBhdmFpbGFibGUsIGJ1dCB3ZSBjYW4gbm90IHNlbGVjdCBpdC5cclxuXHJcblx0Ly8vLyBEZWZpbmUgbGFzdCBkYXkgaW4gY2FsZW5kYXIgKGFzIGEgbGFzdCBkYXkgb2YgbW9udGggKGFuZCBub3QgZGF0ZSwgd2hpY2ggaXMgcmVsYXRlZCB0byBhY3R1YWwgJ1RvZGF5JyBkYXRlKS5cclxuXHQvLy8vIEUuZy4gaWYgdG9kYXkgaXMgMjAyMy0wOS0yNSwgYW5kIHdlIHNldCAnTnVtYmVyIG9mIG1vbnRocyB0byBzY3JvbGwnIGFzIDUgbW9udGhzLCB0aGVuIGxhc3QgZGF5IHdpbGwgYmUgMjAyNC0wMi0yOSBhbmQgbm90IHRoZSAyMDI0LTAyLTI1LlxyXG5cdC8vIHZhciBjYWxfbGFzdF9kYXlfaW5fbW9udGggPSBqUXVlcnkuZGF0ZXBpY2suX2RldGVybWluZURhdGUoIG51bGwsIGxvY2FsX19tYXhfZGF0ZSwgbmV3IERhdGUoKSApO1xyXG5cdC8vIGNhbF9sYXN0X2RheV9pbl9tb250aCA9IG5ldyBEYXRlKCBjYWxfbGFzdF9kYXlfaW5fbW9udGguZ2V0RnVsbFllYXIoKSwgY2FsX2xhc3RfZGF5X2luX21vbnRoLmdldE1vbnRoKCkgKyAxLCAwICk7XHJcblx0Ly8gbG9jYWxfX21heF9kYXRlID0gY2FsX2xhc3RfZGF5X2luX21vbnRoO1x0XHRcdC8vIEZpeEluOiAxMC4wLjAuMjYuXHJcblxyXG5cdC8vIEdldCBzdGFydCAvIGVuZCBkYXRlcyBmcm9tICB0aGUgQm9va2luZyBDYWxlbmRhciBzaG9ydGNvZGUuIEV4YW1wbGU6IFtib29raW5nIGNhbGVuZGFyX2RhdGVzX3N0YXJ0PScyMDI2LTAxLTAxJyBjYWxlbmRhcl9kYXRlc19lbmQ9JzIwMjYtMTItMzEnICByZXNvdXJjZV9pZD0xXSAvLyBGaXhJbjogMTAuMTMuMS40LlxyXG5cdGlmICggZmFsc2UgIT09IHdwYmNfY2FsZW5kYXJfX2dldF9kYXRlc19zdGFydCggcmVzb3VyY2VfaWQgKSApIHtcclxuXHRcdGxvY2FsX19taW5fZGF0ZSA9IHdwYmNfY2FsZW5kYXJfX2dldF9kYXRlc19zdGFydCggcmVzb3VyY2VfaWQgKTsgIC8vIEUuZy4gLSBsb2NhbF9fbWluX2RhdGUgPSBuZXcgRGF0ZSggMjAyNSwgMCwgMSApO1xyXG5cdH1cclxuXHRpZiAoIGZhbHNlICE9PSB3cGJjX2NhbGVuZGFyX19nZXRfZGF0ZXNfZW5kKCByZXNvdXJjZV9pZCApICkge1xyXG5cdFx0bG9jYWxfX21heF9kYXRlID0gd3BiY19jYWxlbmRhcl9fZ2V0X2RhdGVzX2VuZCggcmVzb3VyY2VfaWQgKTsgICAgLy8gRS5nLiAtIGxvY2FsX19tYXhfZGF0ZSA9IG5ldyBEYXRlKCAyMDI1LCAxMSwgMzEgKTtcclxuXHR9XHJcblxyXG5cdC8vIEluIGNhc2Ugd2UgZWRpdCBib29raW5nIGluIHBhc3Qgb3IgaGF2ZSBzcGVjaWZpYyBwYXJhbWV0ZXIgaW4gVVJMLlxyXG5cdHZhciB3cGJjX2VkaXRfYm9va2luZ19oYXNoID0gX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAndGhpc19wYWdlX2Jvb2tpbmdfaGFzaCcgKTtcclxuXHR2YXIgd3BiY19pc19lZGl0X2Jvb2tpbmdfY29udGV4dCA9ICggJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiB3cGJjX2VkaXRfYm9va2luZ19oYXNoICkgJiYgKCAnJyAhPT0gd3BiY19lZGl0X2Jvb2tpbmdfaGFzaCApO1xyXG5cdHZhciB3cGJjX2lzX2FkZF9ib29raW5nX2FkbWluX3BhZ2UgPSAoIGxvY2F0aW9uLmhyZWYuaW5kZXhPZiggJ3BhZ2U9d3BiYycgKSAhPSAtMSApICYmICggbG9jYXRpb24uaHJlZi5pbmRleE9mKCAndGFiPWFkZC1ib29raW5nJyApICE9IC0xICk7XHJcblx0aWYgKCAgICggd3BiY19pc19hZGRfYm9va2luZ19hZG1pbl9wYWdlIHx8IHdwYmNfaXNfZWRpdF9ib29raW5nX2NvbnRleHQgKVxyXG5cdFx0JiYgKFxyXG5cdFx0XHQgIHdwYmNfaXNfZWRpdF9ib29raW5nX2NvbnRleHRcclxuXHRcdCAgIHx8ICggbG9jYXRpb24uaHJlZi5pbmRleE9mKCdib29raW5nX2hhc2gnKSAhPSAtMSApICAgICAgICAgICAgICAgICAgLy8gQ29tbWVudCB0aGlzIGxpbmUgZm9yIGFiaWxpdHkgdG8gYWRkICBib29raW5nIGluIHBhc3QgZGF5cyBhdCAgQm9va2luZyA+IEFkZCBib29raW5nIHBhZ2UuXHJcblx0XHQgICB8fCAoIGxvY2F0aW9uLmhyZWYuaW5kZXhPZignYWxsb3dfcGFzdCcpICE9IC0xICkgICAgICAgICAgICAgICAgLy8gRml4SW46IDEwLjcuMS4yLlxyXG5cdFx0KVxyXG5cdCl7XHJcblx0XHQvLyBsb2NhbF9fbWluX2RhdGUgPSBudWxsO1xyXG5cdFx0Ly8gRml4SW46IDEwLjE0LjEuNC5cclxuXHRcdGxvY2FsX19taW5fZGF0ZSAgPSBuZXcgRGF0ZSggX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAndGltZV9sb2NhbF9hcnInIClbMF0sICggcGFyc2VJbnQoIF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ3RpbWVfbG9jYWxfYXJyJyApWzFdICkgLSAxKSwgX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAndGltZV9sb2NhbF9hcnInIClbMl0sIF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ3RpbWVfbG9jYWxfYXJyJyApWzNdLCBfd3BiYy5nZXRfb3RoZXJfcGFyYW0oICd0aW1lX2xvY2FsX2FycicgKVs0XSwgMCApO1xyXG5cdFx0bG9jYWxfX21heF9kYXRlID0gbnVsbDtcclxuXHR9XHJcblxyXG5cdHZhciBsb2NhbF9fc3RhcnRfd2Vla2RheSAgICA9IF93cGJjLmNhbGVuZGFyX19nZXRfcGFyYW1fdmFsdWUoIHJlc291cmNlX2lkLCAnYm9va2luZ19zdGFydF9kYXlfd2VlZWsnICk7XHJcblx0dmFyIGxvY2FsX19udW1iZXJfb2ZfbW9udGhzID0gcGFyc2VJbnQoIF93cGJjLmNhbGVuZGFyX19nZXRfcGFyYW1fdmFsdWUoIHJlc291cmNlX2lkLCAnY2FsZW5kYXJfbnVtYmVyX29mX21vbnRocycgKSApO1xyXG5cclxuXHRqUXVlcnkoICcjY2FsZW5kYXJfYm9va2luZycgKyByZXNvdXJjZV9pZCApLnRleHQoICcnICk7XHRcdFx0XHRcdC8vIFJlbW92ZSBhbGwgSFRNTCBpbiBjYWxlbmRhciB0YWdcclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8vIFNob3cgY2FsZW5kYXJcclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdGpRdWVyeSgnI2NhbGVuZGFyX2Jvb2tpbmcnKyByZXNvdXJjZV9pZCkuZGF0ZXBpY2soXHJcblx0XHRcdHtcclxuXHRcdFx0XHRiZWZvcmVTaG93RGF5OiBmdW5jdGlvbiAoIGpzX2RhdGUgKXtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHdwYmNfX2NhbGVuZGFyX19hcHBseV9jc3NfdG9fZGF5cygganNfZGF0ZSwgeydyZXNvdXJjZV9pZCc6IHJlc291cmNlX2lkfSwgdGhpcyApO1xyXG5cdFx0XHRcdFx0XHRcdCAgfSxcclxuXHRcdFx0XHRvblNlbGVjdDogZnVuY3Rpb24gKCBzdHJpbmdfZGF0ZXMsIGpzX2RhdGVzX2FyciApeyAgLyoqXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgKlx0c3RyaW5nX2RhdGVzICAgPSAgICcyMy4wOC4yMDIzIC0gMjYuMDguMjAyMydcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAqICAgfCAgICAnMjMuMDguMjAyMyAtIDIzLjA4LjIwMjMnICAgIHxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAqICcxOS4wOS4yMDIzLCAyNC4wOC4yMDIzLCAzMC4wOS4yMDIzJ1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICoganNfZGF0ZXNfYXJyICAgPSAgIHJhbmdlOiBbIERhdGUgKEF1ZyAyMyAyMDIzKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAqIERhdGUgKEF1ZyAyNSAyMDIzKV0gICAgIHwgICAgIG11bHRpcGxlOiBbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgKiBEYXRlKE9jdCAyNCAyMDIzKSwgRGF0ZShPY3QgMjAgMjAyMyksIERhdGUoT2N0XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgKiAxNiAyMDIzKSBdXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHdwYmNfX2NhbGVuZGFyX19vbl9zZWxlY3RfZGF5cyggc3RyaW5nX2RhdGVzLCB7J3Jlc291cmNlX2lkJzogcmVzb3VyY2VfaWR9LCB0aGlzICk7XHJcblx0XHRcdFx0XHRcdFx0ICB9LFxyXG5cdFx0XHRcdG9uSG92ZXI6IGZ1bmN0aW9uICggc3RyaW5nX2RhdGUsIGpzX2RhdGUgKXtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHdwYmNfX2NhbGVuZGFyX19vbl9ob3Zlcl9kYXlzKCBzdHJpbmdfZGF0ZSwganNfZGF0ZSwgeydyZXNvdXJjZV9pZCc6IHJlc291cmNlX2lkfSwgdGhpcyApO1xyXG5cdFx0XHRcdFx0XHRcdCAgfSxcclxuXHRcdFx0XHRvbkNoYW5nZU1vbnRoWWVhcjogZnVuY3Rpb24gKCB5ZWFyLCByZWFsX21vbnRoLCBqc19kYXRlX18xc3RfZGF5X2luX21vbnRoICl7IH0sXHJcblx0XHRcdFx0c2hvd09uICAgICAgICA6ICdib3RoJyxcclxuXHRcdFx0XHRudW1iZXJPZk1vbnRoczogbG9jYWxfX251bWJlcl9vZl9tb250aHMsXHJcblx0XHRcdFx0c3RlcE1vbnRocyAgICA6IDEsXHJcblx0XHRcdFx0Ly8gcHJldlRleHQgICAgICA6ICcmbGFxdW87JyxcclxuXHRcdFx0XHQvLyBuZXh0VGV4dCAgICAgIDogJyZyYXF1bzsnLFxyXG5cdFx0XHRcdHByZXZUZXh0ICAgICAgOiAnJmxzYXF1bzsnLFxyXG5cdFx0XHRcdG5leHRUZXh0ICAgICAgOiAnJnJzYXF1bzsnLFxyXG5cdFx0XHRcdGRhdGVGb3JtYXQgICAgOiAnZGQubW0ueXknLFxyXG5cdFx0XHRcdGNoYW5nZU1vbnRoICAgOiBmYWxzZSxcclxuXHRcdFx0XHRjaGFuZ2VZZWFyICAgIDogZmFsc2UsXHJcblx0XHRcdFx0bWluRGF0ZSAgICAgICA6IGxvY2FsX19taW5fZGF0ZSxcclxuXHRcdFx0XHRtYXhEYXRlICAgICAgIDogbG9jYWxfX21heF9kYXRlLCBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gJzFZJyxcclxuXHRcdFx0XHQvLyBtaW5EYXRlOiBuZXcgRGF0ZSgyMDIwLCAyLCAxKSwgbWF4RGF0ZTogbmV3IERhdGUoMjAyMCwgOSwgMzEpLCAgICAgICAgICAgICBcdC8vIEFiaWxpdHkgdG8gc2V0IGFueSAgc3RhcnQgYW5kIGVuZCBkYXRlIGluIGNhbGVuZGFyXHJcblx0XHRcdFx0c2hvd1N0YXR1cyAgICAgIDogZmFsc2UsXHJcblx0XHRcdFx0bXVsdGlTZXBhcmF0b3IgIDogJywgJyxcclxuXHRcdFx0XHRjbG9zZUF0VG9wICAgICAgOiBmYWxzZSxcclxuXHRcdFx0XHRmaXJzdERheSAgICAgICAgOiBsb2NhbF9fc3RhcnRfd2Vla2RheSxcclxuXHRcdFx0XHRnb3RvQ3VycmVudCAgICAgOiBmYWxzZSxcclxuXHRcdFx0XHRoaWRlSWZOb1ByZXZOZXh0OiB0cnVlLFxyXG5cdFx0XHRcdG11bHRpU2VsZWN0ICAgICA6IGxvY2FsX19tdWx0aV9kYXlzX3NlbGVjdF9udW0sXHJcblx0XHRcdFx0cmFuZ2VTZWxlY3QgICAgIDogbG9jYWxfX2lzX3JhbmdlX3NlbGVjdCxcclxuXHRcdFx0XHQvLyBzaG93V2Vla3M6IHRydWUsXHJcblx0XHRcdFx0dXNlVGhlbWVSb2xsZXI6IGZhbHNlXHJcblx0XHRcdH1cclxuXHQpO1xyXG5cclxuXHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gQ2xlYXIgdG9kYXkgZGF0ZSBoaWdobGlnaHRpbmdcclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpeyAgd3BiY19jYWxlbmRhcnNfX2NsZWFyX2RheXNfaGlnaGxpZ2h0aW5nKCByZXNvdXJjZV9pZCApOyAgfSwgNTAwICk7ICAgICAgICAgICAgICAgICAgICBcdC8vIEZpeEluOiA3LjEuMi44LlxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8vIFNjcm9sbCBjYWxlbmRhciB0byAgc3BlY2lmaWMgbW9udGhcclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHZhciBzdGFydF9ia19tb250aCA9IF93cGJjLmNhbGVuZGFyX19nZXRfcGFyYW1fdmFsdWUoIHJlc291cmNlX2lkLCAnY2FsZW5kYXJfc2Nyb2xsX3RvJyApO1xyXG5cdGlmICggZmFsc2UgIT09IHN0YXJ0X2JrX21vbnRoICl7XHJcblx0XHR3cGJjX2NhbGVuZGFyX19zY3JvbGxfdG8oIHJlc291cmNlX2lkLCBzdGFydF9ia19tb250aFsgMCBdLCBzdGFydF9ia19tb250aFsgMSBdICk7XHJcblx0fVxyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldCBib29raW5nIHN0YXR1c2VzIGFzIGFycmF5IGZyb20gdGhlIHN0cnVjdHVyZWQgc3VtbWFyeSBmaWVsZCwgd2l0aCBmYWxsYmFjayB0byB0aGUgbGVnYWN5IHN0cmluZyBmaWVsZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBkYXRlX2Jvb2tpbmdzX29ialxyXG5cdCAqIEByZXR1cm5zIHtbXX1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2dldF9ib29raW5nX3N0YXR1c2VzX19hc19hcnIoIGRhdGVfYm9va2luZ3Nfb2JqICl7XHJcblxyXG5cdFx0aWYgKFxyXG5cdFx0XHQgICAoICEgZGF0ZV9ib29raW5nc19vYmogKVxyXG5cdFx0XHR8fCAoICd1bmRlZmluZWQnID09PSB0eXBlb2YgKGRhdGVfYm9va2luZ3Nfb2JqWyAnc3VtbWFyeScgXSkgKVxyXG5cdFx0KXtcclxuXHRcdFx0cmV0dXJuIFtdO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggZGF0ZV9ib29raW5nc19vYmpbICdzdW1tYXJ5JyBdWyAnc3RhdHVzX2Zvcl9ib29raW5nc19hcnInIF0gKSApe1xyXG5cdFx0XHRyZXR1cm4gZGF0ZV9ib29raW5nc19vYmpbICdzdW1tYXJ5JyBdWyAnc3RhdHVzX2Zvcl9ib29raW5nc19hcnInIF0uZmlsdGVyKCBmdW5jdGlvbiAoIGJvb2tpbmdfc3RhdHVzICl7XHJcblx0XHRcdFx0cmV0dXJuICcnICE9PSBib29raW5nX3N0YXR1cztcclxuXHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggISBkYXRlX2Jvb2tpbmdzX29ialsgJ3N1bW1hcnknIF1bICdzdGF0dXNfZm9yX2Jvb2tpbmdzJyBdICl7XHJcblx0XHRcdHJldHVybiBbXTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGF0ZV9ib29raW5nc19vYmpbICdzdW1tYXJ5JyBdWyAnc3RhdHVzX2Zvcl9ib29raW5ncycgXS50b1N0cmluZygpLnRyaW0oKS5zcGxpdCggL1xccysvICkuZmlsdGVyKCBmdW5jdGlvbiAoIGJvb2tpbmdfc3RhdHVzICl7XHJcblx0XHRcdHJldHVybiAnJyAhPT0gYm9va2luZ19zdGF0dXM7XHJcblx0XHR9ICk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogQ2hlY2sgZXhhY3QgYm9va2luZyBzdGF0dXMgaW4gc3RhdHVzZXMgYXJyYXkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1tdfSBib29raW5nX3N0YXR1c2VzX2FyclxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBib29raW5nX3N0YXR1c1xyXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfYm9va2luZ19zdGF0dXNlc19faGFzKCBib29raW5nX3N0YXR1c2VzX2FyciwgYm9va2luZ19zdGF0dXMgKXtcclxuXHRcdHJldHVybiBib29raW5nX3N0YXR1c2VzX2Fyci5pbmRleE9mKCBib29raW5nX3N0YXR1cyApID4gLTE7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogQ2hlY2sgYm9va2luZyBzdGF0dXMgcGFydCwgZS5nLiBcInBlbmRpbmdcIiBpbiBcImFwcHJvdmVkX3BlbmRpbmdcIi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7W119IGJvb2tpbmdfc3RhdHVzZXNfYXJyXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGJvb2tpbmdfc3RhdHVzX3BhcnRcclxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2Jvb2tpbmdfc3RhdHVzZXNfX2hhc19wYXJ0KCBib29raW5nX3N0YXR1c2VzX2FyciwgYm9va2luZ19zdGF0dXNfcGFydCApe1xyXG5cclxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGJvb2tpbmdfc3RhdHVzZXNfYXJyLmxlbmd0aDsgaSsrICl7XHJcblx0XHRcdGlmICggYm9va2luZ19zdGF0dXNlc19hcnJbIGkgXS5zcGxpdCggJ18nICkuaW5kZXhPZiggYm9va2luZ19zdGF0dXNfcGFydCApID4gLTEgKXtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBseSBDU1MgdG8gY2FsZW5kYXIgZGF0ZSBjZWxsc1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIGRhdGVcdFx0XHRcdFx0XHRcdFx0XHRcdC0gIEphdmFTY3JpcHQgRGF0ZSBPYmo6ICBcdFx0TW9uIERlYyAxMSAyMDIzIDAwOjAwOjAwXHJcblx0ICogICAgIEdNVCswMjAwIChFYXN0ZXJuIEV1cm9wZWFuIFN0YW5kYXJkIFRpbWUpXHJcblx0ICogQHBhcmFtIGNhbGVuZGFyX3BhcmFtc19hcnJcdFx0XHRcdFx0XHQtICBDYWxlbmRhciBTZXR0aW5ncyBPYmplY3Q6ICBcdHtcclxuXHQgKlx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcdFx0XHRcdFx0XHRcInJlc291cmNlX2lkXCI6IDRcclxuXHQgKlx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHQgKiBAcGFyYW0gZGF0ZXBpY2tfdGhpc1x0XHRcdFx0XHRcdFx0XHQtIHRoaXMgb2YgZGF0ZXBpY2sgT2JqXHJcblx0ICogQHJldHVybnMgeygqfHN0cmluZylbXXwoYm9vbGVhbnxzdHJpbmcpW119XHRcdC0gWyB7dHJ1ZSAtYXZhaWxhYmxlIHwgZmFsc2UgLSB1bmF2YWlsYWJsZX0sICdDU1MgY2xhc3NlcyBmb3JcclxuXHQgKiAgICAgY2FsZW5kYXIgZGF5IGNlbGwnIF1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX19jYWxlbmRhcl9fYXBwbHlfY3NzX3RvX2RheXMoIGRhdGUsIGNhbGVuZGFyX3BhcmFtc19hcnIsIGRhdGVwaWNrX3RoaXMgKXtcclxuXHJcblx0XHR2YXIgdG9kYXlfZGF0ZSA9IG5ldyBEYXRlKCBfd3BiYy5nZXRfb3RoZXJfcGFyYW0oICd0b2RheV9hcnInIClbIDAgXSwgKHBhcnNlSW50KCBfd3BiYy5nZXRfb3RoZXJfcGFyYW0oICd0b2RheV9hcnInIClbIDEgXSApIC0gMSksIF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ3RvZGF5X2FycicgKVsgMiBdLCAwLCAwLCAwICk7XHRcdFx0XHRcdFx0XHRcdC8vIFRvZGF5IEpTX0RhdGVfT2JqLlxyXG5cdFx0dmFyIGNsYXNzX2RheSAgICAgPSB3cGJjX19nZXRfX3RkX2NsYXNzX2RhdGUoIGRhdGUgKTtcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyAnMS05LTIwMjMnXHJcblx0XHR2YXIgc3FsX2NsYXNzX2RheSA9IHdwYmNfX2dldF9fc3FsX2NsYXNzX2RhdGUoIGRhdGUgKTtcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyAnMjAyMy0wMS0wOSdcclxuXHRcdHZhciByZXNvdXJjZV9pZCA9ICggJ3VuZGVmaW5lZCcgIT09IHR5cGVvZihjYWxlbmRhcl9wYXJhbXNfYXJyWyAncmVzb3VyY2VfaWQnIF0pICkgPyBjYWxlbmRhcl9wYXJhbXNfYXJyWyAncmVzb3VyY2VfaWQnIF0gOiAnMSc7IFx0XHQvLyAnMSdcclxuXHJcblx0XHQvLyBHZXQgU2VsZWN0ZWQgZGF0ZXMgaW4gY2FsZW5kYXJcclxuXHRcdHZhciBzZWxlY3RlZF9kYXRlc19zcWwgPSB3cGJjX2dldF9fc2VsZWN0ZWRfZGF0ZXNfc3FsX19hc19hcnIoIHJlc291cmNlX2lkICk7XHJcblxyXG5cdFx0Ly8gR2V0IERhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdHZhciBkYXRlX2Jvb2tpbmdzX29iaiA9IF93cGJjLmJvb2tpbmdzX2luX2NhbGVuZGFyX19nZXRfZm9yX2RhdGUoIHJlc291cmNlX2lkLCBzcWxfY2xhc3NfZGF5ICk7XHJcblxyXG5cclxuXHRcdC8vIEFycmF5IHdpdGggQ1NTIGNsYXNzZXMgZm9yIGRhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0XHR2YXIgY3NzX2NsYXNzZXNfX2Zvcl9kYXRlID0gW107XHJcblx0XHRjc3NfY2xhc3Nlc19fZm9yX2RhdGUucHVzaCggJ3NxbF9kYXRlXycgICAgICsgc3FsX2NsYXNzX2RheSApO1x0XHRcdFx0Ly8gICdzcWxfZGF0ZV8yMDIzLTA3LTIxJ1xyXG5cdFx0Y3NzX2NsYXNzZXNfX2Zvcl9kYXRlLnB1c2goICdjYWw0ZGF0ZS0nICAgICArIGNsYXNzX2RheSApO1x0XHRcdFx0XHQvLyAgJ2NhbDRkYXRlLTctMjEtMjAyMydcclxuXHRcdGNzc19jbGFzc2VzX19mb3JfZGF0ZS5wdXNoKCAnd3BiY193ZWVrZGF5XycgKyBkYXRlLmdldERheSgpICk7XHRcdFx0XHQvLyAgJ3dwYmNfd2Vla2RheV80J1xyXG5cclxuXHRcdC8vIERlZmluZSBTZWxlY3RlZCBDaGVjayBJbi9PdXQgZGF0ZXMgaW4gVEQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0XHRpZiAoXHJcblx0XHRcdFx0KCBzZWxlY3RlZF9kYXRlc19zcWwubGVuZ3RoICApXHJcblx0XHRcdC8vJiYgICggc2VsZWN0ZWRfZGF0ZXNfc3FsWyAwIF0gIT09IHNlbGVjdGVkX2RhdGVzX3NxbFsgKHNlbGVjdGVkX2RhdGVzX3NxbC5sZW5ndGggLSAxKSBdIClcclxuXHRcdCl7XHJcblx0XHRcdGlmICggc3FsX2NsYXNzX2RheSA9PT0gc2VsZWN0ZWRfZGF0ZXNfc3FsWyAwIF0gKXtcclxuXHRcdFx0XHRjc3NfY2xhc3Nlc19fZm9yX2RhdGUucHVzaCggJ3NlbGVjdGVkX2NoZWNrX2luJyApO1xyXG5cdFx0XHRcdGNzc19jbGFzc2VzX19mb3JfZGF0ZS5wdXNoKCAnc2VsZWN0ZWRfY2hlY2tfaW5fb3V0JyApO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICggICggc2VsZWN0ZWRfZGF0ZXNfc3FsLmxlbmd0aCA+IDEgKSAmJiAoIHNxbF9jbGFzc19kYXkgPT09IHNlbGVjdGVkX2RhdGVzX3NxbFsgKHNlbGVjdGVkX2RhdGVzX3NxbC5sZW5ndGggLSAxKSBdICkgKSB7XHJcblx0XHRcdFx0Y3NzX2NsYXNzZXNfX2Zvcl9kYXRlLnB1c2goICdzZWxlY3RlZF9jaGVja19vdXQnICk7XHJcblx0XHRcdFx0Y3NzX2NsYXNzZXNfX2Zvcl9kYXRlLnB1c2goICdzZWxlY3RlZF9jaGVja19pbl9vdXQnICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblxyXG5cdFx0dmFyIGlzX2RheV9zZWxlY3RhYmxlID0gZmFsc2U7XHJcblxyXG5cdFx0Ly8gSWYgc29tZXRoaW5nIG5vdCBkZWZpbmVkLCAgdGhlbiAgdGhpcyBkYXRlIGNsb3NlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8gRml4SW46IDEwLjEyLjQuNi5cclxuXHRcdGlmICggKGZhbHNlID09PSBkYXRlX2Jvb2tpbmdzX29iaikgfHwgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgKGRhdGVfYm9va2luZ3Nfb2JqW3Jlc291cmNlX2lkXSkpICkge1xyXG5cclxuXHRcdFx0Y3NzX2NsYXNzZXNfX2Zvcl9kYXRlLnB1c2goICdkYXRlX3VzZXJfdW5hdmFpbGFibGUnICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gWyBpc19kYXlfc2VsZWN0YWJsZSwgY3NzX2NsYXNzZXNfX2Zvcl9kYXRlLmpvaW4oJyAnKSAgXTtcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdC8vICAgZGF0ZV9ib29raW5nc19vYmogIC0gRGVmaW5lZC4gICAgICAgICAgICBEYXRlcyBjYW4gYmUgc2VsZWN0YWJsZS5cclxuXHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0XHR2YXIgYm9va2luZ19zdGF0dXNlc19hcnIgPSB3cGJjX2dldF9ib29raW5nX3N0YXR1c2VzX19hc19hcnIoIGRhdGVfYm9va2luZ3Nfb2JqICk7XHJcblxyXG5cdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdC8vIEFkZCBzZWFzb24gbmFtZXMgdG8gdGhlIGRheSBDU1MgY2xhc3NlcyAtLSBpdCBpcyByZXF1aXJlZCBmb3IgY29ycmVjdCAgd29yayAgb2YgY29uZGl0aW9uYWwgZmllbGRzIC0tLS0tLS0tLS0tLS0tXHJcblx0XHR2YXIgc2Vhc29uX25hbWVzX2FyciA9IF93cGJjLnNlYXNvbnNfX2dldF9mb3JfZGF0ZSggcmVzb3VyY2VfaWQsIHNxbF9jbGFzc19kYXkgKTtcclxuXHJcblx0XHRmb3IgKCB2YXIgc2Vhc29uX2tleSBpbiBzZWFzb25fbmFtZXNfYXJyICl7XHJcblxyXG5cdFx0XHRjc3NfY2xhc3Nlc19fZm9yX2RhdGUucHVzaCggc2Vhc29uX25hbWVzX2Fyclsgc2Vhc29uX2tleSBdICk7XHRcdFx0XHQvLyAgJ3dwZGV2Ymtfc2Vhc29uX3NlcHRlbWJlcl8yMDIzJ1xyXG5cdFx0fVxyXG5cdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblxyXG5cdFx0Ly8gQ29zdCBSYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdGNzc19jbGFzc2VzX19mb3JfZGF0ZS5wdXNoKCAncmF0ZV8nICsgZGF0ZV9ib29raW5nc19vYmpbIHJlc291cmNlX2lkIF1bICdkYXRlX2Nvc3RfcmF0ZScgXS50b1N0cmluZygpLnJlcGxhY2UoIC9bXFwuXFxzXS9nLCAnXycgKSApO1x0XHRcdFx0XHRcdC8vICAncmF0ZV85OV8wMCcgLT4gOTkuMDBcclxuXHJcblxyXG5cdFx0aWYgKCBwYXJzZUludCggZGF0ZV9ib29raW5nc19vYmpbICdkYXlfYXZhaWxhYmlsaXR5JyBdICkgPiAwICl7XHJcblx0XHRcdGlzX2RheV9zZWxlY3RhYmxlID0gdHJ1ZTtcclxuXHRcdFx0Y3NzX2NsYXNzZXNfX2Zvcl9kYXRlLnB1c2goICdkYXRlX2F2YWlsYWJsZScgKTtcclxuXHRcdFx0Y3NzX2NsYXNzZXNfX2Zvcl9kYXRlLnB1c2goICdyZXNlcnZlZF9kYXlzX2NvdW50JyArIHBhcnNlSW50KCBkYXRlX2Jvb2tpbmdzX29ialsgJ21heF9jYXBhY2l0eScgXSAtIGRhdGVfYm9va2luZ3Nfb2JqWyAnZGF5X2F2YWlsYWJpbGl0eScgXSApICk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpc19kYXlfc2VsZWN0YWJsZSA9IGZhbHNlO1xyXG5cdFx0XHRjc3NfY2xhc3Nlc19fZm9yX2RhdGUucHVzaCggJ2RhdGVfdXNlcl91bmF2YWlsYWJsZScgKTtcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0c3dpdGNoICggZGF0ZV9ib29raW5nc19vYmpbICdzdW1tYXJ5J11bJ3N0YXR1c19mb3JfZGF5JyBdICl7XHJcblxyXG5cdFx0XHRjYXNlICdhdmFpbGFibGUnOlxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAndGltZV9zbG90c19ib29raW5nJzpcclxuXHRcdFx0XHRjc3NfY2xhc3Nlc19fZm9yX2RhdGUucHVzaCggJ3RpbWVzcGFydGx5JywgJ3RpbWVzX2Nsb2NrJyApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnZnVsbF9kYXlfYm9va2luZyc6XHJcblx0XHRcdFx0Y3NzX2NsYXNzZXNfX2Zvcl9kYXRlLnB1c2goICdmdWxsX2RheV9ib29raW5nJyApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnc2Vhc29uX2ZpbHRlcic6XHJcblx0XHRcdFx0Y3NzX2NsYXNzZXNfX2Zvcl9kYXRlLnB1c2goICdkYXRlX3VzZXJfdW5hdmFpbGFibGUnLCAnc2Vhc29uX3VuYXZhaWxhYmxlJyApO1xyXG5cdFx0XHRcdGRhdGVfYm9va2luZ3Nfb2JqWyAnc3VtbWFyeSddWydzdGF0dXNfZm9yX2Jvb2tpbmdzJyBdID0gJyc7XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFJlc2V0IGJvb2tpbmcgc3RhdHVzIGNvbG9yIGZvciBwb3NzaWJsZSBvbGQgYm9va2luZ3Mgb24gdGhpcyBkYXRlXHJcblx0XHRcdFx0ZGF0ZV9ib29raW5nc19vYmpbICdzdW1tYXJ5J11bJ3N0YXR1c19mb3JfYm9va2luZ3NfYXJyJyBdID0gW107XHJcblx0XHRcdFx0Ym9va2luZ19zdGF0dXNlc19hcnIgPSBbXTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ3Jlc291cmNlX2F2YWlsYWJpbGl0eSc6XHJcblx0XHRcdFx0Y3NzX2NsYXNzZXNfX2Zvcl9kYXRlLnB1c2goICdkYXRlX3VzZXJfdW5hdmFpbGFibGUnLCAncmVzb3VyY2VfdW5hdmFpbGFibGUnICk7XHJcblx0XHRcdFx0ZGF0ZV9ib29raW5nc19vYmpbICdzdW1tYXJ5J11bJ3N0YXR1c19mb3JfYm9va2luZ3MnIF0gPSAnJztcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gUmVzZXQgYm9va2luZyBzdGF0dXMgY29sb3IgZm9yIHBvc3NpYmxlIG9sZCBib29raW5ncyBvbiB0aGlzIGRhdGVcclxuXHRcdFx0XHRkYXRlX2Jvb2tpbmdzX29ialsgJ3N1bW1hcnknXVsnc3RhdHVzX2Zvcl9ib29raW5nc19hcnInIF0gPSBbXTtcclxuXHRcdFx0XHRib29raW5nX3N0YXR1c2VzX2FyciA9IFtdO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnd2Vla2RheV91bmF2YWlsYWJsZSc6XHJcblx0XHRcdFx0Y3NzX2NsYXNzZXNfX2Zvcl9kYXRlLnB1c2goICdkYXRlX3VzZXJfdW5hdmFpbGFibGUnLCAnd2Vla2RheV91bmF2YWlsYWJsZScgKTtcclxuXHRcdFx0XHRkYXRlX2Jvb2tpbmdzX29ialsgJ3N1bW1hcnknXVsnc3RhdHVzX2Zvcl9ib29raW5ncycgXSA9ICcnO1x0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBSZXNldCBib29raW5nIHN0YXR1cyBjb2xvciBmb3IgcG9zc2libGUgb2xkIGJvb2tpbmdzIG9uIHRoaXMgZGF0ZVxyXG5cdFx0XHRcdGRhdGVfYm9va2luZ3Nfb2JqWyAnc3VtbWFyeSddWydzdGF0dXNfZm9yX2Jvb2tpbmdzX2FycicgXSA9IFtdO1xyXG5cdFx0XHRcdGJvb2tpbmdfc3RhdHVzZXNfYXJyID0gW107XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdmcm9tX3RvZGF5X3VuYXZhaWxhYmxlJzpcclxuXHRcdFx0XHRjc3NfY2xhc3Nlc19fZm9yX2RhdGUucHVzaCggJ2RhdGVfdXNlcl91bmF2YWlsYWJsZScsICdmcm9tX3RvZGF5X3VuYXZhaWxhYmxlJyApO1xyXG5cdFx0XHRcdGRhdGVfYm9va2luZ3Nfb2JqWyAnc3VtbWFyeSddWydzdGF0dXNfZm9yX2Jvb2tpbmdzJyBdID0gJyc7XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFJlc2V0IGJvb2tpbmcgc3RhdHVzIGNvbG9yIGZvciBwb3NzaWJsZSBvbGQgYm9va2luZ3Mgb24gdGhpcyBkYXRlXHJcblx0XHRcdFx0ZGF0ZV9ib29raW5nc19vYmpbICdzdW1tYXJ5J11bJ3N0YXR1c19mb3JfYm9va2luZ3NfYXJyJyBdID0gW107XHJcblx0XHRcdFx0Ym9va2luZ19zdGF0dXNlc19hcnIgPSBbXTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ2xpbWl0X2F2YWlsYWJsZV9mcm9tX3RvZGF5JzpcclxuXHRcdFx0XHRjc3NfY2xhc3Nlc19fZm9yX2RhdGUucHVzaCggJ2RhdGVfdXNlcl91bmF2YWlsYWJsZScsICdsaW1pdF9hdmFpbGFibGVfZnJvbV90b2RheScgKTtcclxuXHRcdFx0XHRkYXRlX2Jvb2tpbmdzX29ialsgJ3N1bW1hcnknXVsnc3RhdHVzX2Zvcl9ib29raW5ncycgXSA9ICcnO1x0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBSZXNldCBib29raW5nIHN0YXR1cyBjb2xvciBmb3IgcG9zc2libGUgb2xkIGJvb2tpbmdzIG9uIHRoaXMgZGF0ZVxyXG5cdFx0XHRcdGRhdGVfYm9va2luZ3Nfb2JqWyAnc3VtbWFyeSddWydzdGF0dXNfZm9yX2Jvb2tpbmdzX2FycicgXSA9IFtdO1xyXG5cdFx0XHRcdGJvb2tpbmdfc3RhdHVzZXNfYXJyID0gW107XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdjaGFuZ2Vfb3Zlcic6XHJcblx0XHRcdFx0LypcclxuXHRcdFx0XHQgKlxyXG5cdFx0XHRcdC8vICBjaGVja19vdXRfdGltZV9kYXRlMmFwcHJvdmUgXHQgXHRjaGVja19pbl90aW1lX2RhdGUyYXBwcm92ZVxyXG5cdFx0XHRcdC8vICBjaGVja19vdXRfdGltZV9kYXRlMmFwcHJvdmUgXHQgXHRjaGVja19pbl90aW1lX2RhdGVfYXBwcm92ZWRcclxuXHRcdFx0XHQvLyAgY2hlY2tfaW5fdGltZV9kYXRlMmFwcHJvdmUgXHRcdCBcdGNoZWNrX291dF90aW1lX2RhdGVfYXBwcm92ZWRcclxuXHRcdFx0XHQvLyAgY2hlY2tfb3V0X3RpbWVfZGF0ZV9hcHByb3ZlZCBcdCBcdGNoZWNrX2luX3RpbWVfZGF0ZV9hcHByb3ZlZFxyXG5cdFx0XHRcdCAqL1xyXG5cclxuXHRcdFx0XHRjc3NfY2xhc3Nlc19fZm9yX2RhdGUucHVzaCggJ3RpbWVzcGFydGx5JywgJ2NoZWNrX2luX3RpbWUnLCAnY2hlY2tfb3V0X3RpbWUnICk7XHJcblx0XHRcdFx0Ly8gRml4SW46IDEwLjAuMC4yLlxyXG5cdFx0XHRcdGlmICggd3BiY19ib29raW5nX3N0YXR1c2VzX19oYXMoIGJvb2tpbmdfc3RhdHVzZXNfYXJyLCAnYXBwcm92ZWRfcGVuZGluZycgKSApe1xyXG5cdFx0XHRcdFx0Y3NzX2NsYXNzZXNfX2Zvcl9kYXRlLnB1c2goICdjaGVja19vdXRfdGltZV9kYXRlX2FwcHJvdmVkJywgJ2NoZWNrX2luX3RpbWVfZGF0ZTJhcHByb3ZlJyApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoIHdwYmNfYm9va2luZ19zdGF0dXNlc19faGFzKCBib29raW5nX3N0YXR1c2VzX2FyciwgJ3BlbmRpbmdfYXBwcm92ZWQnICkgKXtcclxuXHRcdFx0XHRcdGNzc19jbGFzc2VzX19mb3JfZGF0ZS5wdXNoKCAnY2hlY2tfb3V0X3RpbWVfZGF0ZTJhcHByb3ZlJywgJ2NoZWNrX2luX3RpbWVfZGF0ZV9hcHByb3ZlZCcgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdjaGVja19pbic6XHJcblx0XHRcdFx0Y3NzX2NsYXNzZXNfX2Zvcl9kYXRlLnB1c2goICd0aW1lc3BhcnRseScsICdjaGVja19pbl90aW1lJyApO1xyXG5cclxuXHRcdFx0XHQvLyBGaXhJbjogOS45LjAuMzMuXHJcblx0XHRcdFx0aWYgKCB3cGJjX2Jvb2tpbmdfc3RhdHVzZXNfX2hhc19wYXJ0KCBib29raW5nX3N0YXR1c2VzX2FyciwgJ3BlbmRpbmcnICkgKXtcclxuXHRcdFx0XHRcdGNzc19jbGFzc2VzX19mb3JfZGF0ZS5wdXNoKCAnY2hlY2tfaW5fdGltZV9kYXRlMmFwcHJvdmUnICk7XHJcblx0XHRcdFx0fSBlbHNlIGlmICggd3BiY19ib29raW5nX3N0YXR1c2VzX19oYXNfcGFydCggYm9va2luZ19zdGF0dXNlc19hcnIsICdhcHByb3ZlZCcgKSApe1xyXG5cdFx0XHRcdFx0Y3NzX2NsYXNzZXNfX2Zvcl9kYXRlLnB1c2goICdjaGVja19pbl90aW1lX2RhdGVfYXBwcm92ZWQnICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnY2hlY2tfb3V0JzpcclxuXHRcdFx0XHRjc3NfY2xhc3Nlc19fZm9yX2RhdGUucHVzaCggJ3RpbWVzcGFydGx5JywgJ2NoZWNrX291dF90aW1lJyApO1xyXG5cclxuXHRcdFx0XHQvLyBGaXhJbjogOS45LjAuMzMuXHJcblx0XHRcdFx0aWYgKCB3cGJjX2Jvb2tpbmdfc3RhdHVzZXNfX2hhc19wYXJ0KCBib29raW5nX3N0YXR1c2VzX2FyciwgJ3BlbmRpbmcnICkgKXtcclxuXHRcdFx0XHRcdGNzc19jbGFzc2VzX19mb3JfZGF0ZS5wdXNoKCAnY2hlY2tfb3V0X3RpbWVfZGF0ZTJhcHByb3ZlJyApO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHdwYmNfYm9va2luZ19zdGF0dXNlc19faGFzX3BhcnQoIGJvb2tpbmdfc3RhdHVzZXNfYXJyLCAnYXBwcm92ZWQnICkgKXtcclxuXHRcdFx0XHRcdGNzc19jbGFzc2VzX19mb3JfZGF0ZS5wdXNoKCAnY2hlY2tfb3V0X3RpbWVfZGF0ZV9hcHByb3ZlZCcgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdC8vIG1peGVkIHN0YXR1c2VzOiAnY2hhbmdlX292ZXIgY2hlY2tfb3V0JyAuLi4uIHZhcmlhdGlvbnMuLi4uIGNoZWNrIG1vcmUgaW4gXHRcdGZ1bmN0aW9uIHdwYmNfZ2V0X2F2YWlsYWJpbGl0eV9wZXJfZGF5c19hcnIoKVxyXG5cdFx0XHRcdGRhdGVfYm9va2luZ3Nfb2JqWyAnc3VtbWFyeSddWydzdGF0dXNfZm9yX2RheScgXSA9ICdhdmFpbGFibGUnO1xyXG5cdFx0fVxyXG5cclxuXHJcblxyXG5cdFx0aWYgKCAnYXZhaWxhYmxlJyAhPSBkYXRlX2Jvb2tpbmdzX29ialsgJ3N1bW1hcnknXVsnc3RhdHVzX2Zvcl9kYXknIF0gKXtcclxuXHJcblx0XHRcdHZhciBpc19zZXRfcGVuZGluZ19kYXlzX3NlbGVjdGFibGUgPSBfd3BiYy5jYWxlbmRhcl9fZ2V0X3BhcmFtX3ZhbHVlKCByZXNvdXJjZV9pZCwgJ3BlbmRpbmdfZGF5c19zZWxlY3RhYmxlJyApO1x0Ly8gc2V0IHBlbmRpbmcgZGF5cyBzZWxlY3RhYmxlICAgICAgICAgIC8vIEZpeEluOiA4LjYuMS4xOC5cclxuXHJcblx0XHRcdGlmICggd3BiY19ib29raW5nX3N0YXR1c2VzX19oYXMoIGJvb2tpbmdfc3RhdHVzZXNfYXJyLCAncGVuZGluZycgKSApe1xyXG5cdFx0XHRcdGNzc19jbGFzc2VzX19mb3JfZGF0ZS5wdXNoKCAnZGF0ZTJhcHByb3ZlJyApO1xyXG5cdFx0XHRcdGlzX2RheV9zZWxlY3RhYmxlID0gKGlzX2RheV9zZWxlY3RhYmxlKSA/IHRydWUgOiBpc19zZXRfcGVuZGluZ19kYXlzX3NlbGVjdGFibGU7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCB3cGJjX2Jvb2tpbmdfc3RhdHVzZXNfX2hhcyggYm9va2luZ19zdGF0dXNlc19hcnIsICdhcHByb3ZlZCcgKSApe1xyXG5cdFx0XHRcdGNzc19jbGFzc2VzX19mb3JfZGF0ZS5wdXNoKCAnZGF0ZV9hcHByb3ZlZCcgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIHdwYmNfYm9va2luZ19zdGF0dXNlc19faGFzKCBib29raW5nX3N0YXR1c2VzX2FyciwgJ3BlbmRpbmdfcGVuZGluZycgKSApe1xyXG5cdFx0XHRcdGNzc19jbGFzc2VzX19mb3JfZGF0ZS5wdXNoKCAnY2hlY2tfb3V0X3RpbWVfZGF0ZTJhcHByb3ZlJywgJ2NoZWNrX2luX3RpbWVfZGF0ZTJhcHByb3ZlJyApO1xyXG5cdFx0XHRcdGlzX2RheV9zZWxlY3RhYmxlID0gKGlzX2RheV9zZWxlY3RhYmxlKSA/IHRydWUgOiBpc19zZXRfcGVuZGluZ19kYXlzX3NlbGVjdGFibGU7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCB3cGJjX2Jvb2tpbmdfc3RhdHVzZXNfX2hhcyggYm9va2luZ19zdGF0dXNlc19hcnIsICdwZW5kaW5nX2FwcHJvdmVkJyApICl7XHJcblx0XHRcdFx0Y3NzX2NsYXNzZXNfX2Zvcl9kYXRlLnB1c2goICdjaGVja19vdXRfdGltZV9kYXRlMmFwcHJvdmUnLCAnY2hlY2tfaW5fdGltZV9kYXRlX2FwcHJvdmVkJyApO1xyXG5cdFx0XHRcdGlzX2RheV9zZWxlY3RhYmxlID0gKGlzX2RheV9zZWxlY3RhYmxlKSA/IHRydWUgOiBpc19zZXRfcGVuZGluZ19kYXlzX3NlbGVjdGFibGU7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCB3cGJjX2Jvb2tpbmdfc3RhdHVzZXNfX2hhcyggYm9va2luZ19zdGF0dXNlc19hcnIsICdhcHByb3ZlZF9wZW5kaW5nJyApICl7XHJcblx0XHRcdFx0Y3NzX2NsYXNzZXNfX2Zvcl9kYXRlLnB1c2goICdjaGVja19vdXRfdGltZV9kYXRlX2FwcHJvdmVkJywgJ2NoZWNrX2luX3RpbWVfZGF0ZTJhcHByb3ZlJyApO1xyXG5cdFx0XHRcdGlzX2RheV9zZWxlY3RhYmxlID0gKGlzX2RheV9zZWxlY3RhYmxlKSA/IHRydWUgOiBpc19zZXRfcGVuZGluZ19kYXlzX3NlbGVjdGFibGU7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCB3cGJjX2Jvb2tpbmdfc3RhdHVzZXNfX2hhcyggYm9va2luZ19zdGF0dXNlc19hcnIsICdhcHByb3ZlZF9hcHByb3ZlZCcgKSApe1xyXG5cdFx0XHRcdGNzc19jbGFzc2VzX19mb3JfZGF0ZS5wdXNoKCAnY2hlY2tfb3V0X3RpbWVfZGF0ZV9hcHByb3ZlZCcsICdjaGVja19pbl90aW1lX2RhdGVfYXBwcm92ZWQnICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gWyBpc19kYXlfc2VsZWN0YWJsZSwgY3NzX2NsYXNzZXNfX2Zvcl9kYXRlLmpvaW4oICcgJyApIF07XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogTW91c2VvdmVyIGNhbGVuZGFyIGRhdGUgY2VsbHNcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBzdHJpbmdfZGF0ZVxyXG5cdCAqIEBwYXJhbSBkYXRlXHRcdFx0XHRcdFx0XHRcdFx0XHQtICBKYXZhU2NyaXB0IERhdGUgT2JqOiAgXHRcdE1vbiBEZWMgMTEgMjAyMyAwMDowMDowMFxyXG5cdCAqICAgICBHTVQrMDIwMCAoRWFzdGVybiBFdXJvcGVhbiBTdGFuZGFyZCBUaW1lKVxyXG5cdCAqIEBwYXJhbSBjYWxlbmRhcl9wYXJhbXNfYXJyXHRcdFx0XHRcdFx0LSAgQ2FsZW5kYXIgU2V0dGluZ3MgT2JqZWN0OiAgXHR7XHJcblx0ICpcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgXHRcdFx0XHRcdFx0XCJyZXNvdXJjZV9pZFwiOiA0XHJcblx0ICpcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0ICogQHBhcmFtIGRhdGVwaWNrX3RoaXNcdFx0XHRcdFx0XHRcdFx0LSB0aGlzIG9mIGRhdGVwaWNrIE9ialxyXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfX2NhbGVuZGFyX19vbl9ob3Zlcl9kYXlzKCBzdHJpbmdfZGF0ZSwgZGF0ZSwgY2FsZW5kYXJfcGFyYW1zX2FyciwgZGF0ZXBpY2tfdGhpcyApIHtcclxuXHJcblx0XHRpZiAoIG51bGwgPT09IGRhdGUgKSB7XHJcblx0XHRcdHdwYmNfY2FsZW5kYXJzX19jbGVhcl9kYXlzX2hpZ2hsaWdodGluZyggKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgKGNhbGVuZGFyX3BhcmFtc19hcnJbICdyZXNvdXJjZV9pZCcgXSkpID8gY2FsZW5kYXJfcGFyYW1zX2FyclsgJ3Jlc291cmNlX2lkJyBdIDogJzEnICk7XHRcdC8vIEZpeEluOiAxMC41LjIuNC5cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBjbGFzc19kYXkgICAgID0gd3BiY19fZ2V0X190ZF9jbGFzc19kYXRlKCBkYXRlICk7XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gJzEtOS0yMDIzJ1xyXG5cdFx0dmFyIHNxbF9jbGFzc19kYXkgPSB3cGJjX19nZXRfX3NxbF9jbGFzc19kYXRlKCBkYXRlICk7XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gJzIwMjMtMDEtMDknXHJcblx0XHR2YXIgcmVzb3VyY2VfaWQgPSAoICd1bmRlZmluZWQnICE9PSB0eXBlb2YoY2FsZW5kYXJfcGFyYW1zX2FyclsgJ3Jlc291cmNlX2lkJyBdKSApID8gY2FsZW5kYXJfcGFyYW1zX2FyclsgJ3Jlc291cmNlX2lkJyBdIDogJzEnO1x0XHQvLyAnMSdcclxuXHJcblx0XHQvLyBHZXQgRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0dmFyIGRhdGVfYm9va2luZ19vYmogPSBfd3BiYy5ib29raW5nc19pbl9jYWxlbmRhcl9fZ2V0X2Zvcl9kYXRlKCByZXNvdXJjZV9pZCwgc3FsX2NsYXNzX2RheSApO1x0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyB7Li4ufVxyXG5cclxuXHRcdGlmICggISBkYXRlX2Jvb2tpbmdfb2JqICl7IHJldHVybiBmYWxzZTsgfVxyXG5cclxuXHJcblx0XHQvLyBUIG8gbyBsIHQgaSBwIHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0dmFyIHRvb2x0aXBfdGV4dCA9ICcnO1xyXG5cdFx0aWYgKCBkYXRlX2Jvb2tpbmdfb2JqWyAnc3VtbWFyeSddWyd0b29sdGlwX2F2YWlsYWJpbGl0eScgXS5sZW5ndGggPiAwICl7XHJcblx0XHRcdHRvb2x0aXBfdGV4dCArPSAgZGF0ZV9ib29raW5nX29ialsgJ3N1bW1hcnknXVsndG9vbHRpcF9hdmFpbGFiaWxpdHknIF07XHJcblx0XHR9XHJcblx0XHRpZiAoIGRhdGVfYm9va2luZ19vYmpbICdzdW1tYXJ5J11bJ3Rvb2x0aXBfZGF5X2Nvc3QnIF0ubGVuZ3RoID4gMCApe1xyXG5cdFx0XHR0b29sdGlwX3RleHQgKz0gIGRhdGVfYm9va2luZ19vYmpbICdzdW1tYXJ5J11bJ3Rvb2x0aXBfZGF5X2Nvc3QnIF07XHJcblx0XHR9XHJcblx0XHRpZiAoIGRhdGVfYm9va2luZ19vYmpbICdzdW1tYXJ5J11bJ3Rvb2x0aXBfdGltZXMnIF0ubGVuZ3RoID4gMCApe1xyXG5cdFx0XHR0b29sdGlwX3RleHQgKz0gIGRhdGVfYm9va2luZ19vYmpbICdzdW1tYXJ5J11bJ3Rvb2x0aXBfdGltZXMnIF07XHJcblx0XHR9XHJcblx0XHRpZiAoIGRhdGVfYm9va2luZ19vYmpbICdzdW1tYXJ5J11bJ3Rvb2x0aXBfYm9va2luZ19kZXRhaWxzJyBdLmxlbmd0aCA+IDAgKXtcclxuXHRcdFx0dG9vbHRpcF90ZXh0ICs9ICBkYXRlX2Jvb2tpbmdfb2JqWyAnc3VtbWFyeSddWyd0b29sdGlwX2Jvb2tpbmdfZGV0YWlscycgXTtcclxuXHRcdH1cclxuXHRcdHdwYmNfc2V0X3Rvb2x0aXBfX19mb3JfX2NhbGVuZGFyX2RhdGUoIHRvb2x0aXBfdGV4dCwgcmVzb3VyY2VfaWQsIGNsYXNzX2RheSApO1xyXG5cclxuXHJcblxyXG5cdFx0Ly8gIFUgbiBoIG8gdiBlIHIgaSBuIGcgICAgaW4gICAgVU5TRUxFQ1RBQkxFX0NBTEVOREFSICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdHZhciBpc191bnNlbGVjdGFibGVfY2FsZW5kYXIgPSAoIGpRdWVyeSggJyNjYWxlbmRhcl9ib29raW5nX3Vuc2VsZWN0YWJsZScgKyByZXNvdXJjZV9pZCApLmxlbmd0aCA+IDApO1x0XHRcdFx0Ly8gRml4SW46IDguMC4xLjIuXHJcblx0XHR2YXIgaXNfYm9va2luZ19mb3JtX2V4aXN0ICAgID0gKCBqUXVlcnkoICcjYm9va2luZ19mb3JtX2RpdicgKyByZXNvdXJjZV9pZCApLmxlbmd0aCA+IDAgKTtcclxuXHRcdHZhciBpc19hZGRfYm9va2luZ19tb2RhbF9jYWxlbmRhciA9ICggalF1ZXJ5KCAnI2NhbGVuZGFyX2Jvb2tpbmcnICsgcmVzb3VyY2VfaWQgKS5jbG9zZXN0KCAnI3dwYmNfbW9kYWxfX2FkZF9ib29raW5nX19zZWN0aW9uJyApLmxlbmd0aCA+IDAgKTtcclxuXHJcblx0XHRpZiAoICggaXNfdW5zZWxlY3RhYmxlX2NhbGVuZGFyICkgJiYgKCAhIGlzX2Jvb2tpbmdfZm9ybV9leGlzdCApICl7XHJcblxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogIFVuIEhvdmVyIGFsbCBkYXRlcyBpbiBjYWxlbmRhciAod2l0aG91dCB0aGUgYm9va2luZyBmb3JtKSwgaWYgb25seSBBdmFpbGFiaWxpdHkgQ2FsZW5kYXIgaGVyZSBhbmQgd2UgZG9cclxuXHRcdFx0ICogbm90IGluc2VydCBCb29raW5nIGZvcm0gYnkgbWlzdGFrZS5cclxuXHRcdFx0ICovXHJcblxyXG5cdFx0XHR3cGJjX2NhbGVuZGFyc19fY2xlYXJfZGF5c19oaWdobGlnaHRpbmcoIHJlc291cmNlX2lkICk7IFx0XHRcdFx0XHRcdFx0Ly8gQ2xlYXIgZGF5cyBoaWdobGlnaHRpbmdcclxuXHJcblx0XHRcdHZhciBjc3Nfb2ZfY2FsZW5kYXIgPSAnLndwYmNfb25seV9jYWxlbmRhciAjY2FsZW5kYXJfYm9va2luZycgKyByZXNvdXJjZV9pZDtcclxuXHRcdFx0alF1ZXJ5KCBjc3Nfb2ZfY2FsZW5kYXIgKyAnIC5kYXRlcGljay1kYXlzLWNlbGwsICdcclxuXHRcdFx0XHQgICsgY3NzX29mX2NhbGVuZGFyICsgJyAuZGF0ZXBpY2stZGF5cy1jZWxsIGEnICkuY3NzKCAnY3Vyc29yJywgJ2RlZmF1bHQnICk7XHQvLyBTZXQgY3Vyc29yIHRvIERlZmF1bHRcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHJcblxyXG5cdFx0Ly8gIEQgYSB5IHMgICAgSCBvIHYgZSByIGkgbiBnICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdGlmIChcclxuXHRcdFx0ICAgKCBsb2NhdGlvbi5ocmVmLmluZGV4T2YoICdwYWdlPXdwYmMnICkgPT0gLTEgKVxyXG5cdFx0XHR8fCAoICggbG9jYXRpb24uaHJlZi5pbmRleE9mKCAncGFnZT13cGJjJyApID4gMCApICYmICggbG9jYXRpb24uaHJlZi5pbmRleE9mKCAndGFiPWFkZC1ib29raW5nJyApID4gMCApIClcclxuXHRcdFx0fHwgKCBpc19hZGRfYm9va2luZ19tb2RhbF9jYWxlbmRhciApXHJcblx0XHRcdHx8ICggbG9jYXRpb24uaHJlZi5pbmRleE9mKCAncGFnZT13cGJjLXNldHVwJyApID4gMCApXHJcblx0XHRcdHx8ICggbG9jYXRpb24uaHJlZi5pbmRleE9mKCAncGFnZT13cGJjLWF2YWlsYWJpbGl0eScgKSA+IDAgKVxyXG5cdFx0XHR8fCAoICAoIGxvY2F0aW9uLmhyZWYuaW5kZXhPZiggJ3BhZ2U9d3BiYy1zZXR0aW5ncycgKSA+IDAgKSAgJiZcclxuXHRcdFx0XHQgICggbG9jYXRpb24uaHJlZi5pbmRleE9mKCAnJnRhYj1mb3JtJyApID4gMCApXHJcblx0XHRcdCAgIClcclxuXHRcdCl7XHJcblx0XHRcdC8vIFRoZSBzYW1lIGFzIGRhdGVzIHNlbGVjdGlvbiwgIGJ1dCBmb3IgZGF5cyBob3ZlcmluZ1xyXG5cclxuXHRcdFx0aWYgKCAnZnVuY3Rpb24nID09IHR5cGVvZiggd3BiY19fY2FsZW5kYXJfX2RvX2RheXNfaGlnaGxpZ2h0X19icyApICl7XHJcblx0XHRcdFx0d3BiY19fY2FsZW5kYXJfX2RvX2RheXNfaGlnaGxpZ2h0X19icyggc3FsX2NsYXNzX2RheSwgZGF0ZSwgcmVzb3VyY2VfaWQgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBTZWxlY3QgY2FsZW5kYXIgZGF0ZSBjZWxsc1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIGRhdGVcdFx0XHRcdFx0XHRcdFx0XHRcdC0gIEphdmFTY3JpcHQgRGF0ZSBPYmo6ICBcdFx0TW9uIERlYyAxMSAyMDIzIDAwOjAwOjAwXHJcblx0ICogICAgIEdNVCswMjAwIChFYXN0ZXJuIEV1cm9wZWFuIFN0YW5kYXJkIFRpbWUpXHJcblx0ICogQHBhcmFtIGNhbGVuZGFyX3BhcmFtc19hcnJcdFx0XHRcdFx0XHQtICBDYWxlbmRhciBTZXR0aW5ncyBPYmplY3Q6ICBcdHtcclxuXHQgKlx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcdFx0XHRcdFx0XHRcInJlc291cmNlX2lkXCI6IDRcclxuXHQgKlx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHQgKiBAcGFyYW0gZGF0ZXBpY2tfdGhpc1x0XHRcdFx0XHRcdFx0XHQtIHRoaXMgb2YgZGF0ZXBpY2sgT2JqXHJcblx0ICpcclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX19jYWxlbmRhcl9fb25fc2VsZWN0X2RheXMoIGRhdGUsIGNhbGVuZGFyX3BhcmFtc19hcnIsIGRhdGVwaWNrX3RoaXMgKXtcclxuXHJcblx0XHR2YXIgcmVzb3VyY2VfaWQgPSAoICd1bmRlZmluZWQnICE9PSB0eXBlb2YoY2FsZW5kYXJfcGFyYW1zX2FyclsgJ3Jlc291cmNlX2lkJyBdKSApID8gY2FsZW5kYXJfcGFyYW1zX2FyclsgJ3Jlc291cmNlX2lkJyBdIDogJzEnO1x0XHQvLyAnMSdcclxuXHJcblx0XHQvLyBTZXQgdW5zZWxlY3RhYmxlLCAgaWYgb25seSBBdmFpbGFiaWxpdHkgQ2FsZW5kYXIgIGhlcmUgKGFuZCB3ZSBkbyBub3QgaW5zZXJ0IEJvb2tpbmcgZm9ybSBieSBtaXN0YWtlKS5cclxuXHRcdHZhciBpc191bnNlbGVjdGFibGVfY2FsZW5kYXIgPSAoIGpRdWVyeSggJyNjYWxlbmRhcl9ib29raW5nX3Vuc2VsZWN0YWJsZScgKyByZXNvdXJjZV9pZCApLmxlbmd0aCA+IDApO1x0XHRcdFx0Ly8gRml4SW46IDguMC4xLjIuXHJcblx0XHR2YXIgaXNfYm9va2luZ19mb3JtX2V4aXN0ICAgID0gKCBqUXVlcnkoICcjYm9va2luZ19mb3JtX2RpdicgKyByZXNvdXJjZV9pZCApLmxlbmd0aCA+IDAgKTtcclxuXHRcdGlmICggKCBpc191bnNlbGVjdGFibGVfY2FsZW5kYXIgKSAmJiAoICEgaXNfYm9va2luZ19mb3JtX2V4aXN0ICkgKXtcclxuXHRcdFx0d3BiY19jYWxlbmRhcl9fdW5zZWxlY3RfYWxsX2RhdGVzKCByZXNvdXJjZV9pZCApO1x0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gVW5zZWxlY3QgRGF0ZXNcclxuXHRcdFx0alF1ZXJ5KCcud3BiY19vbmx5X2NhbGVuZGFyIC5wb3BvdmVyX2NhbGVuZGFyX2hvdmVyJykucmVtb3ZlKCk7ICAgICAgICAgICAgICAgICAgICAgIFx0XHRcdFx0XHRcdFx0Ly8gSGlkZSBhbGwgb3BlbmVkIHBvcG92ZXJzXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRqUXVlcnkoICcjZGF0ZV9ib29raW5nJyArIHJlc291cmNlX2lkICkudmFsKCBkYXRlICk7XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBBZGQgc2VsZWN0ZWQgZGF0ZXMgdG8gIGhpZGRlbiB0ZXh0YXJlYVxyXG5cclxuXHJcblx0XHRpZiAoICdmdW5jdGlvbicgPT09IHR5cGVvZiAod3BiY19fY2FsZW5kYXJfX2RvX2RheXNfc2VsZWN0X19icykgKXsgd3BiY19fY2FsZW5kYXJfX2RvX2RheXNfc2VsZWN0X19icyggZGF0ZSwgcmVzb3VyY2VfaWQgKTsgfVxyXG5cclxuXHRcdHdwYmNfZGlzYWJsZV90aW1lX2ZpZWxkc19pbl9ib29raW5nX2Zvcm0oIHJlc291cmNlX2lkICk7XHJcblxyXG5cdFx0Ly8gSG9vayAtLSB0cmlnZ2VyIGRheSBzZWxlY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdHZhciBtb3VzZV9jbGlja2VkX2RhdGVzID0gZGF0ZTtcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhbiBiZTogXCIwNS4xMC4yMDIzIC0gMDcuMTAuMjAyM1wiICB8ICBcIjEwLjEwLjIwMjMgLSAxMC4xMC4yMDIzXCIgIHxcclxuXHRcdHZhciBhbGxfc2VsZWN0ZWRfZGF0ZXNfYXJyID0gd3BiY19nZXRfX3NlbGVjdGVkX2RhdGVzX3NxbF9fYXNfYXJyKCByZXNvdXJjZV9pZCApO1x0XHRcdFx0XHRcdFx0XHRcdC8vIENhbiBiZTogWyBcIjIwMjMtMTAtMDVcIiwgXCIyMDIzLTEwLTA2XCIsIFwiMjAyMy0xMC0wN1wiLCDigKYgXVxyXG5cdFx0alF1ZXJ5KCBcIi5ib29raW5nX2Zvcm1fZGl2XCIgKS50cmlnZ2VyKCBcImRhdGVfc2VsZWN0ZWRcIiwgWyByZXNvdXJjZV9pZCwgbW91c2VfY2xpY2tlZF9kYXRlcywgYWxsX3NlbGVjdGVkX2RhdGVzX2FyciBdICk7XHJcblx0fVxyXG5cclxuXHQvLyBNYXJrIG1pZGRsZSBzZWxlY3RlZCBkYXRlcyB3aXRoIDAuNSBvcGFjaXR5XHRcdC8vIEZpeEluOiAxMC4zLjAuOS5cclxuXHRqUXVlcnkoIGRvY3VtZW50ICkucmVhZHkoIGZ1bmN0aW9uICgpe1xyXG5cdFx0alF1ZXJ5KCBcIi5ib29raW5nX2Zvcm1fZGl2XCIgKS5vbiggJ2RhdGVfc2VsZWN0ZWQnLCBmdW5jdGlvbiAoIGV2ZW50LCByZXNvdXJjZV9pZCwgZGF0ZSApe1xyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdCAgICggICdmaXhlZCcgPT09IF93cGJjLmNhbGVuZGFyX19nZXRfcGFyYW1fdmFsdWUoIHJlc291cmNlX2lkLCAnZGF5c19zZWxlY3RfbW9kZScgKSlcclxuXHRcdFx0XHRcdHx8ICgnZHluYW1pYycgPT09IF93cGJjLmNhbGVuZGFyX19nZXRfcGFyYW1fdmFsdWUoIHJlc291cmNlX2lkLCAnZGF5c19zZWxlY3RfbW9kZScgKSlcclxuXHRcdFx0XHQpe1xyXG5cdFx0XHRcdFx0dmFyIGNsb3NlZF90aW1lciA9IHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpe1xyXG5cdFx0XHRcdFx0XHR2YXIgbWlkZGxlX2RheXNfb3BhY2l0eSA9IF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ2NhbGVuZGFyc19fZGF5c19zZWxlY3Rpb25fX21pZGRsZV9kYXlzX29wYWNpdHknICk7XHJcblx0XHRcdFx0XHRcdGpRdWVyeSggJyNjYWxlbmRhcl9ib29raW5nJyArIHJlc291cmNlX2lkICsgJyAuZGF0ZXBpY2stY3VycmVudC1kYXknICkubm90KCBcIi5zZWxlY3RlZF9jaGVja19pbl9vdXRcIiApLmNzcyggJ29wYWNpdHknLCBtaWRkbGVfZGF5c19vcGFjaXR5ICk7XHJcblx0XHRcdFx0XHR9LCAxMCApO1xyXG5cdFx0XHRcdH1cclxuXHRcdH0gKTtcclxuXHR9ICk7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiAtLSAgVCBpIG0gZSAgICBGIGkgZSBsIGQgcyAgICAgc3RhcnQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0ICovXHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc2FibGUgdGltZSBzbG90cyBpbiBib29raW5nIGZvcm0gZGVwZW5kIG9uIHNlbGVjdGVkIGRhdGVzIGFuZCBib29rZWQgZGF0ZXMvdGltZXNcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSByZXNvdXJjZV9pZFxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfZGlzYWJsZV90aW1lX2ZpZWxkc19pbl9ib29raW5nX2Zvcm0oIHJlc291cmNlX2lkICl7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBcdDEuIEdldCBhbGwgdGltZSBmaWVsZHMgaW4gdGhlIGJvb2tpbmcgZm9ybSBhcyBhcnJheSAgb2Ygb2JqZWN0c1xyXG5cdFx0ICogXHRcdFx0XHRcdFtcclxuXHRcdCAqIFx0XHRcdFx0XHQgXHQgICB7XHRqcXVlcnlfb3B0aW9uOiAgICAgIGpRdWVyeV9PYmplY3Qge31cclxuXHRcdCAqIFx0XHRcdFx0XHRcdFx0XHRuYW1lOiAgICAgICAgICAgICAgICdyYW5nZXRpbWUyW10nXHJcblx0XHQgKiBcdFx0XHRcdFx0XHRcdFx0dGltZXNfYXNfc2Vjb25kczogICBbIDIxNjAwLCAyMzQwMCBdXHJcblx0XHQgKiBcdFx0XHRcdFx0XHRcdFx0dmFsdWVfb3B0aW9uXzI0aDogICAnMDY6MDAgLSAwNjozMCdcclxuXHRcdCAqIFx0XHRcdFx0XHQgICAgIH1cclxuXHRcdCAqIFx0XHRcdFx0XHQgIC4uLlxyXG5cdFx0ICogXHRcdFx0XHRcdFx0ICAge1x0anF1ZXJ5X29wdGlvbjogICAgICBqUXVlcnlfT2JqZWN0IHt9XHJcblx0XHQgKiBcdFx0XHRcdFx0XHRcdFx0bmFtZTogICAgICAgICAgICAgICAnc3RhcnR0aW1lMltdJ1xyXG5cdFx0ICogXHRcdFx0XHRcdFx0XHRcdHRpbWVzX2FzX3NlY29uZHM6ICAgWyAyMTYwMCBdXHJcblx0XHQgKiBcdFx0XHRcdFx0XHRcdFx0dmFsdWVfb3B0aW9uXzI0aDogICAnMDY6MDAnXHJcblx0XHQgKiAgXHRcdFx0XHRcdCAgICB9XHJcblx0XHQgKiBcdFx0XHRcdFx0IF1cclxuXHRcdCAqL1xyXG5cdFx0dmFyIHRpbWVfZmllbGRzX29ial9hcnIgPSB3cGJjX2dldF9fdGltZV9maWVsZHNfX2luX2Jvb2tpbmdfZm9ybV9fYXNfYXJyKCByZXNvdXJjZV9pZCApO1xyXG5cclxuXHRcdC8vIDIuIEdldCBhbGwgc2VsZWN0ZWQgZGF0ZXMgaW4gIFNRTCBmb3JtYXQgIGxpa2UgdGhpcyBbIFwiMjAyMy0wOC0yM1wiLCBcIjIwMjMtMDgtMjRcIiwgXCIyMDIzLTA4LTI1XCIsIC4uLiBdXHJcblx0XHR2YXIgc2VsZWN0ZWRfZGF0ZXNfYXJyID0gd3BiY19nZXRfX3NlbGVjdGVkX2RhdGVzX3NxbF9fYXNfYXJyKCByZXNvdXJjZV9pZCApO1xyXG5cclxuXHRcdC8vIDMuIEdldCBjaGlsZCBib29raW5nIHJlc291cmNlcyAgb3Igc2luZ2xlIGJvb2tpbmcgcmVzb3VyY2UgIHRoYXQgIGV4aXN0ICBpbiBkYXRlc1xyXG5cdFx0dmFyIGNoaWxkX3Jlc291cmNlc19hcnIgPSB3cGJjX2Nsb25lX29iaiggX3dwYmMuYm9va2luZ19fZ2V0X3BhcmFtX3ZhbHVlKCByZXNvdXJjZV9pZCwgJ3Jlc291cmNlc19pZF9hcnJfX2luX2RhdGVzJyApICk7XHJcblxyXG5cdFx0dmFyIHNxbF9kYXRlO1xyXG5cdFx0dmFyIGNoaWxkX3Jlc291cmNlX2lkO1xyXG5cdFx0dmFyIG1lcmdlZF9zZWNvbmRzO1xyXG5cdFx0dmFyIHRpbWVfZmllbGRzX29iajtcclxuXHRcdHZhciBpc19pbnRlcnNlY3Q7XHJcblx0XHR2YXIgaXNfY2hlY2tfaW47XHJcblxyXG5cdFx0dmFyIHRvZGF5X3RpbWVfX3JlYWwgID0gbmV3IERhdGUoIF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ3RpbWVfbG9jYWxfYXJyJyApWzBdLCAoIHBhcnNlSW50KCBfd3BiYy5nZXRfb3RoZXJfcGFyYW0oICd0aW1lX2xvY2FsX2FycicgKVsxXSApIC0gMSksIF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ3RpbWVfbG9jYWxfYXJyJyApWzJdLCBfd3BiYy5nZXRfb3RoZXJfcGFyYW0oICd0aW1lX2xvY2FsX2FycicgKVszXSwgX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAndGltZV9sb2NhbF9hcnInIClbNF0sIDAgKTtcclxuXHRcdHZhciB0b2RheV90aW1lX19zaGlmdCA9IG5ldyBEYXRlKCBfd3BiYy5nZXRfb3RoZXJfcGFyYW0oICd0b2RheV9hcnInICAgICAgKVswXSwgKCBwYXJzZUludCggX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAgICAgICd0b2RheV9hcnInIClbMV0gKSAtIDEpLCBfd3BiYy5nZXRfb3RoZXJfcGFyYW0oICd0b2RheV9hcnInICAgICAgKVsyXSwgX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAndG9kYXlfYXJyJyAgICAgIClbM10sIF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ3RvZGF5X2FycicgICAgICApWzRdLCAwICk7XHJcblxyXG5cdFx0Ly8gNC4gTG9vcCAgYWxsICB0aW1lIEZpZWxkcyBvcHRpb25zXHRcdC8vIEZpeEluOiAxMC4zLjAuMi5cclxuXHRcdGZvciAoIGxldCBmaWVsZF9rZXkgPSAwOyBmaWVsZF9rZXkgPCB0aW1lX2ZpZWxkc19vYmpfYXJyLmxlbmd0aDsgZmllbGRfa2V5KysgKXtcclxuXHJcblx0XHRcdHRpbWVfZmllbGRzX29ial9hcnJbIGZpZWxkX2tleSBdLmRpc2FibGVkID0gMDsgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgdGhpcyB0aW1lIGZpZWxkIGlzIG5vdCBkaXNhYmxlZC5cclxuXHJcblx0XHRcdHRpbWVfZmllbGRzX29iaiA9IHRpbWVfZmllbGRzX29ial9hcnJbIGZpZWxkX2tleSBdO1x0XHQvLyB7IHRpbWVzX2FzX3NlY29uZHM6IFsgMjE2MDAsIDIzNDAwIF0sIHZhbHVlX29wdGlvbl8yNGg6ICcwNjowMCAtIDA2OjMwJywgbmFtZTogJ3JhbmdldGltZTJbXScsIGpxdWVyeV9vcHRpb246IGpRdWVyeV9PYmplY3Qge319XHJcblxyXG5cdFx0XHQvLyBMb29wICBhbGwgIHNlbGVjdGVkIGRhdGVzLlxyXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZF9kYXRlc19hcnIubGVuZ3RoOyBpKysgKSB7XHJcblxyXG5cdFx0XHRcdC8vIEdldCBEYXRlOiAnMjAyMy0wOC0xOCcuXHJcblx0XHRcdFx0c3FsX2RhdGUgPSBzZWxlY3RlZF9kYXRlc19hcnJbaV07XHJcblxyXG5cdFx0XHRcdHZhciBpc190aW1lX2luX3Bhc3QgPSB3cGJjX2NoZWNrX2lzX3RpbWVfaW5fcGFzdCggdG9kYXlfdGltZV9fc2hpZnQsIHNxbF9kYXRlLCB0aW1lX2ZpZWxkc19vYmogKTtcclxuXHRcdFx0XHQvLyBFeGNlcHRpb24gIGZvciAnRW5kIFRpbWUnIGZpZWxkLCAgd2hlbiAgc2VsZWN0ZWQgc2V2ZXJhbCBkYXRlcy4gLy8gRml4SW46IDEwLjE0LjEuNS5cclxuXHRcdFx0XHRpZiAoICgnT24nICE9PSBfd3BiYy5jYWxlbmRhcl9fZ2V0X3BhcmFtX3ZhbHVlKCByZXNvdXJjZV9pZCwgJ2Jvb2tpbmdfcmVjdXJyZW50X3RpbWUnICkpICYmXHJcblx0XHRcdFx0XHQoLTEgIT09IHRpbWVfZmllbGRzX29iai5uYW1lLmluZGV4T2YoICdlbmR0aW1lJyApKSAmJlxyXG5cdFx0XHRcdFx0KHNlbGVjdGVkX2RhdGVzX2Fyci5sZW5ndGggPiAxKVxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0aXNfdGltZV9pbl9wYXN0ID0gd3BiY19jaGVja19pc190aW1lX2luX3Bhc3QoIHRvZGF5X3RpbWVfX3NoaWZ0LCBzZWxlY3RlZF9kYXRlc19hcnJbKHNlbGVjdGVkX2RhdGVzX2Fyci5sZW5ndGggLSAxKV0sIHRpbWVfZmllbGRzX29iaiApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoIGlzX3RpbWVfaW5fcGFzdCApIHtcclxuXHRcdFx0XHRcdC8vIFRoaXMgdGltZSBmb3Igc2VsZWN0ZWQgZGF0ZSBhbHJlYWR5ICBpbiB0aGUgcGFzdC5cclxuXHRcdFx0XHRcdHRpbWVfZmllbGRzX29ial9hcnJbZmllbGRfa2V5XS5kaXNhYmxlZCA9IDE7XHJcblx0XHRcdFx0XHRicmVhaztcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gZXhpc3QgIGZyb20gICBEYXRlcyBMT09QLlxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvLyBGaXhJbjogOS45LjAuMzEuXHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0ICAgKCAnT2ZmJyA9PT0gX3dwYmMuY2FsZW5kYXJfX2dldF9wYXJhbV92YWx1ZSggcmVzb3VyY2VfaWQsICdib29raW5nX3JlY3VycmVudF90aW1lJyApIClcclxuXHRcdFx0XHRcdCYmICggc2VsZWN0ZWRfZGF0ZXNfYXJyLmxlbmd0aD4xIClcclxuXHRcdFx0XHQpe1xyXG5cdFx0XHRcdFx0Ly9UT0RPOiBza2lwIHNvbWUgZmllbGRzIGNoZWNraW5nIGlmIGl0J3Mgc3RhcnQgLyBlbmQgdGltZSBmb3IgbXVscGxlIGRhdGVzICBzZWxlY3Rpb24gIG1vZGUuXHJcblx0XHRcdFx0XHQvL1RPRE86IHdlIG5lZWQgdG8gZml4IHNpdHVhdGlvbiAgZm9yIGVudGltZXMsICB3aGVuICB1c2VyICBzZWxlY3QgIHNldmVyYWwgIGRhdGVzLCAgYW5kIGluIHN0YXJ0ICB0aW1lIGJvb2tlZCAwMDowMCAtIDE1OjAwICwgYnV0IHN5c3RzbWUgYmxvY2sgdW50aWxsIDE1OjAwIHRoZSBlbmQgdGltZSBhcyB3ZWxsLCAgd2hpY2ggIGlzIHdyb25nLCAgYmVjYXVzZSBpdCAyIG9yIDMgZGF0ZXMgc2VsZWN0aW9uICBhbmQgZW5kIGRhdGUgY2FuIGJlIGZ1bGx1ICBhdmFpbGFibGVcclxuXHJcblx0XHRcdFx0XHRpZiAoICgwID09IGkpICYmICh0aW1lX2ZpZWxkc19vYmpbICduYW1lJyBdLmluZGV4T2YoICdlbmR0aW1lJyApID49IDApICl7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCAoIChzZWxlY3RlZF9kYXRlc19hcnIubGVuZ3RoLTEpID09IGkgKSAmJiAodGltZV9maWVsZHNfb2JqWyAnbmFtZScgXS5pbmRleE9mKCAnc3RhcnR0aW1lJyApID49IDApICl7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblxyXG5cclxuXHRcdFx0XHR2YXIgaG93X21hbnlfcmVzb3VyY2VzX2ludGVyc2VjdGVkID0gMDtcclxuXHRcdFx0XHQvLyBMb29wIGFsbCByZXNvdXJjZXMgSURcclxuXHRcdFx0XHRcdC8vIGZvciAoIHZhciByZXNfa2V5IGluIGNoaWxkX3Jlc291cmNlc19hcnIgKXtcdCBcdFx0XHRcdFx0XHQvLyBGaXhJbjogMTAuMy4wLjIuXHJcblx0XHRcdFx0aWYgKCBudWxsID09PSBjaGlsZF9yZXNvdXJjZXNfYXJyICkge1xyXG5cdFx0XHRcdFx0Y2hpbGRfcmVzb3VyY2VzX2FyciA9IFtdO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRmb3IgKCBsZXQgcmVzX2tleSA9IDA7IHJlc19rZXkgPCBjaGlsZF9yZXNvdXJjZXNfYXJyLmxlbmd0aDsgcmVzX2tleSsrICl7XHJcblxyXG5cdFx0XHRcdFx0Y2hpbGRfcmVzb3VyY2VfaWQgPSBjaGlsZF9yZXNvdXJjZXNfYXJyWyByZXNfa2V5IF07XHJcblxyXG5cdFx0XHRcdFx0Ly8gX3dwYmMuYm9va2luZ3NfaW5fY2FsZW5kYXJfX2dldF9mb3JfZGF0ZSgyLCcyMDIzLTA4LTIxJylbMTJdLmJvb2tlZF90aW1lX3Nsb3RzLm1lcmdlZF9zZWNvbmRzXHRcdD0gWyBcIjA3OjAwOjExIC0gMDc6MzA6MDJcIiwgXCIxMDowMDoxMSAtIDAwOjAwOjAwXCIgXVxyXG5cdFx0XHRcdFx0Ly8gX3dwYmMuYm9va2luZ3NfaW5fY2FsZW5kYXJfX2dldF9mb3JfZGF0ZSgyLCcyMDIzLTA4LTIxJylbMl0uYm9va2VkX3RpbWVfc2xvdHMubWVyZ2VkX3NlY29uZHNcdFx0XHQ9IFsgIFsgMjUyMTEsIDI3MDAyIF0sIFsgMzYwMTEsIDg2NDAwIF0gIF1cclxuXHJcblx0XHRcdFx0XHRpZiAoIGZhbHNlICE9PSBfd3BiYy5ib29raW5nc19pbl9jYWxlbmRhcl9fZ2V0X2Zvcl9kYXRlKCByZXNvdXJjZV9pZCwgc3FsX2RhdGUgKSApe1xyXG5cdFx0XHRcdFx0XHRtZXJnZWRfc2Vjb25kcyA9IF93cGJjLmJvb2tpbmdzX2luX2NhbGVuZGFyX19nZXRfZm9yX2RhdGUoIHJlc291cmNlX2lkLCBzcWxfZGF0ZSApWyBjaGlsZF9yZXNvdXJjZV9pZCBdLmJvb2tlZF90aW1lX3Nsb3RzLm1lcmdlZF9zZWNvbmRzO1x0XHQvLyBbICBbIDI1MjExLCAyNzAwMiBdLCBbIDM2MDExLCA4NjQwMCBdICBdXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRtZXJnZWRfc2Vjb25kcyA9IFtdO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCB0aW1lX2ZpZWxkc19vYmoudGltZXNfYXNfc2Vjb25kcy5sZW5ndGggPiAxICl7XHJcblx0XHRcdFx0XHRcdGlzX2ludGVyc2VjdCA9IHdwYmNfaXNfaW50ZXJzZWN0X19yYW5nZV90aW1lX2ludGVydmFsKCAgW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KCBwYXJzZUludCggdGltZV9maWVsZHNfb2JqLnRpbWVzX2FzX3NlY29uZHNbMF0gKSArIDIwICksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KCBwYXJzZUludCggdGltZV9maWVsZHNfb2JqLnRpbWVzX2FzX3NlY29uZHNbMV0gKSAtIDIwIClcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LCBtZXJnZWRfc2Vjb25kcyApO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0aXNfY2hlY2tfaW4gPSAoLTEgIT09IHRpbWVfZmllbGRzX29iai5uYW1lLmluZGV4T2YoICdzdGFydCcgKSk7XHJcblx0XHRcdFx0XHRcdGlzX2ludGVyc2VjdCA9IHdwYmNfaXNfaW50ZXJzZWN0X19vbmVfdGltZV9pbnRlcnZhbChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCggKCBpc19jaGVja19pbiApXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgID8gcGFyc2VJbnQoIHRpbWVfZmllbGRzX29iai50aW1lc19hc19zZWNvbmRzICkgKyAyMFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICA6IHBhcnNlSW50KCB0aW1lX2ZpZWxkc19vYmoudGltZXNfYXNfc2Vjb25kcyApIC0gMjBcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCwgbWVyZ2VkX3NlY29uZHMgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmIChpc19pbnRlcnNlY3Qpe1xyXG5cdFx0XHRcdFx0XHRob3dfbWFueV9yZXNvdXJjZXNfaW50ZXJzZWN0ZWQrKztcdFx0XHQvLyBJbmNyZWFzZVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggY2hpbGRfcmVzb3VyY2VzX2Fyci5sZW5ndGggPT0gaG93X21hbnlfcmVzb3VyY2VzX2ludGVyc2VjdGVkICkge1xyXG5cdFx0XHRcdFx0Ly8gQWxsIHJlc291cmNlcyBpbnRlcnNlY3RlZCwgIHRoZW4gIGl0J3MgbWVhbnMgdGhhdCB0aGlzIHRpbWUtc2xvdCBvciB0aW1lIG11c3QgIGJlICBEaXNhYmxlZCwgYW5kIHdlIGNhbiAgZXhpc3QgIGZyb20gICBzZWxlY3RlZF9kYXRlc19hcnIgTE9PUFxyXG5cclxuXHRcdFx0XHRcdHRpbWVfZmllbGRzX29ial9hcnJbIGZpZWxkX2tleSBdLmRpc2FibGVkID0gMTtcclxuXHRcdFx0XHRcdGJyZWFrO1x0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBleGlzdCAgZnJvbSAgIERhdGVzIExPT1BcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblxyXG5cdFx0Ly8gNS4gTm93IHdlIGNhbiBkaXNhYmxlIHRpbWUgc2xvdCBpbiBIVE1MIGJ5ICB1c2luZyAgKCBmaWVsZC5kaXNhYmxlZCA9PSAxICkgcHJvcGVydHlcclxuXHRcdHdwYmNfX2h0bWxfX3RpbWVfZmllbGRfb3B0aW9uc19fc2V0X2Rpc2FibGVkKCB0aW1lX2ZpZWxkc19vYmpfYXJyICk7XHJcblxyXG5cdFx0alF1ZXJ5KCBcIi5ib29raW5nX2Zvcm1fZGl2XCIgKS50cmlnZ2VyKCAnd3BiY19ob29rX3RpbWVzbG90c19kaXNhYmxlZCcsIFtyZXNvdXJjZV9pZCwgc2VsZWN0ZWRfZGF0ZXNfYXJyXSApO1x0XHRcdFx0XHQvLyBUcmlnZ2VyIGhvb2sgb24gZGlzYWJsaW5nIHRpbWVzbG90cy5cdFx0VXNhZ2U6IFx0alF1ZXJ5KCBcIi5ib29raW5nX2Zvcm1fZGl2XCIgKS5vbiggJ3dwYmNfaG9va190aW1lc2xvdHNfZGlzYWJsZWQnLCBmdW5jdGlvbiAoIGV2ZW50LCBia190eXBlLCBhbGxfZGF0ZXMgKXsgLi4uIH0gKTtcdFx0Ly8gRml4SW46IDguNy4xMS45LlxyXG5cdH1cclxuXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDaGVjayBpZiBzcGVjaWZpYyB0aW1lKC1zbG90KSBhbHJlYWR5ICBpbiB0aGUgcGFzdCBmb3Igc2VsZWN0ZWQgZGF0ZVxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSBqc19jdXJyZW50X3RpbWVfdG9fY2hlY2tcdFx0LSBKUyBEYXRlXHJcblx0XHQgKiBAcGFyYW0gc3FsX2RhdGVcdFx0XHRcdFx0XHQtICcyMDI1LTAxLTI2J1xyXG5cdFx0ICogQHBhcmFtIHRpbWVfZmllbGRzX29ialx0XHRcdFx0LSBPYmplY3RcclxuXHRcdCAqIEByZXR1cm5zIHtib29sZWFufVxyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiB3cGJjX2NoZWNrX2lzX3RpbWVfaW5fcGFzdCgganNfY3VycmVudF90aW1lX3RvX2NoZWNrLCBzcWxfZGF0ZSwgdGltZV9maWVsZHNfb2JqICkge1xyXG5cclxuXHRcdFx0Ly8gRml4SW46IDEwLjkuNi40XHJcblx0XHRcdHZhciBzcWxfZGF0ZV9hcnIgPSBzcWxfZGF0ZS5zcGxpdCggJy0nICk7XHJcblx0XHRcdHZhciBzcWxfZGF0ZV9fbWlkbmlnaHQgPSBuZXcgRGF0ZSggcGFyc2VJbnQoIHNxbF9kYXRlX2FyclswXSApLCAoIHBhcnNlSW50KCBzcWxfZGF0ZV9hcnJbMV0gKSAtIDEgKSwgcGFyc2VJbnQoIHNxbF9kYXRlX2FyclsyXSApLCAwLCAwLCAwICk7XHJcblx0XHRcdHZhciBzcWxfZGF0ZV9fbWlkbmlnaHRfbWlsaXNlY29uZHMgPSBzcWxfZGF0ZV9fbWlkbmlnaHQuZ2V0VGltZSgpO1xyXG5cclxuXHRcdFx0dmFyIGlzX2ludGVyc2VjdCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0aWYgKCB0aW1lX2ZpZWxkc19vYmoudGltZXNfYXNfc2Vjb25kcy5sZW5ndGggPiAxICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGpzX2N1cnJlbnRfdGltZV90b19jaGVjay5nZXRUaW1lKCkgPiAoc3FsX2RhdGVfX21pZG5pZ2h0X21pbGlzZWNvbmRzICsgKHBhcnNlSW50KCB0aW1lX2ZpZWxkc19vYmoudGltZXNfYXNfc2Vjb25kc1swXSApICsgMjApICogMTAwMCkgKSB7XHJcblx0XHRcdFx0XHRpc19pbnRlcnNlY3QgPSB0cnVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoIGpzX2N1cnJlbnRfdGltZV90b19jaGVjay5nZXRUaW1lKCkgPiAoc3FsX2RhdGVfX21pZG5pZ2h0X21pbGlzZWNvbmRzICsgKHBhcnNlSW50KCB0aW1lX2ZpZWxkc19vYmoudGltZXNfYXNfc2Vjb25kc1sxXSApIC0gMjApICogMTAwMCkgKSB7XHJcblx0XHRcdFx0XHRpc19pbnRlcnNlY3QgPSB0cnVlO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dmFyIGlzX2NoZWNrX2luID0gKC0xICE9PSB0aW1lX2ZpZWxkc19vYmoubmFtZS5pbmRleE9mKCAnc3RhcnQnICkpO1xyXG5cclxuXHRcdFx0XHR2YXIgdGltZXNfYXNfc2Vjb25kc19jaGVjayA9IChpc19jaGVja19pbikgPyBwYXJzZUludCggdGltZV9maWVsZHNfb2JqLnRpbWVzX2FzX3NlY29uZHMgKSArIDIwIDogcGFyc2VJbnQoIHRpbWVfZmllbGRzX29iai50aW1lc19hc19zZWNvbmRzICkgLSAyMDtcclxuXHJcblx0XHRcdFx0dGltZXNfYXNfc2Vjb25kc19jaGVjayA9IHNxbF9kYXRlX19taWRuaWdodF9taWxpc2Vjb25kcyArIHRpbWVzX2FzX3NlY29uZHNfY2hlY2sgKiAxMDAwO1xyXG5cclxuXHRcdFx0XHRpZiAoIGpzX2N1cnJlbnRfdGltZV90b19jaGVjay5nZXRUaW1lKCkgPiB0aW1lc19hc19zZWNvbmRzX2NoZWNrICkge1xyXG5cdFx0XHRcdFx0aXNfaW50ZXJzZWN0ID0gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBpc19pbnRlcnNlY3Q7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJcyBudW1iZXIgaW5zaWRlIC9pbnRlcnNlY3QgIG9mIGFycmF5IG9mIGludGVydmFscyA/XHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHRpbWVfQVx0XHQgICAgIFx0LSAyNTgwMFxyXG5cdFx0ICogQHBhcmFtIHRpbWVfaW50ZXJ2YWxfQlx0XHQtIFsgIFsgMjUyMTEsIDI3MDAyIF0sIFsgMzYwMTEsIDg2NDAwIF0gIF1cclxuXHRcdCAqIEByZXR1cm5zIHtib29sZWFufVxyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiB3cGJjX2lzX2ludGVyc2VjdF9fb25lX3RpbWVfaW50ZXJ2YWwoIHRpbWVfQSwgdGltZV9pbnRlcnZhbF9CICl7XHJcblxyXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCB0aW1lX2ludGVydmFsX0IubGVuZ3RoOyBqKysgKXtcclxuXHJcblx0XHRcdFx0aWYgKCAocGFyc2VJbnQoIHRpbWVfQSApID4gcGFyc2VJbnQoIHRpbWVfaW50ZXJ2YWxfQlsgaiBdWyAwIF0gKSkgJiYgKHBhcnNlSW50KCB0aW1lX0EgKSA8IHBhcnNlSW50KCB0aW1lX2ludGVydmFsX0JbIGogXVsgMSBdICkpICl7XHJcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gaWYgKCAoIHBhcnNlSW50KCB0aW1lX0EgKSA9PSBwYXJzZUludCggdGltZV9pbnRlcnZhbF9CWyBqIF1bIDAgXSApICkgfHwgKCBwYXJzZUludCggdGltZV9BICkgPT0gcGFyc2VJbnQoIHRpbWVfaW50ZXJ2YWxfQlsgaiBdWyAxIF0gKSApICkge1xyXG5cdFx0XHRcdC8vIFx0XHRcdC8vIFRpbWUgQSBqdXN0ICBhdCAgdGhlIGJvcmRlciBvZiBpbnRlcnZhbFxyXG5cdFx0XHRcdC8vIH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdCAgICByZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJcyB0aGVzZSBhcnJheSBvZiBpbnRlcnZhbHMgaW50ZXJzZWN0ZWQgP1xyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB0aW1lX2ludGVydmFsX0FcdFx0LSBbIFsgMjE2MDAsIDIzNDAwIF0gXVxyXG5cdFx0ICogQHBhcmFtIHRpbWVfaW50ZXJ2YWxfQlx0XHQtIFsgIFsgMjUyMTEsIDI3MDAyIF0sIFsgMzYwMTEsIDg2NDAwIF0gIF1cclxuXHRcdCAqIEByZXR1cm5zIHtib29sZWFufVxyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiB3cGJjX2lzX2ludGVyc2VjdF9fcmFuZ2VfdGltZV9pbnRlcnZhbCggdGltZV9pbnRlcnZhbF9BLCB0aW1lX2ludGVydmFsX0IgKXtcclxuXHJcblx0XHRcdHZhciBpc19pbnRlcnNlY3Q7XHJcblxyXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aW1lX2ludGVydmFsX0EubGVuZ3RoOyBpKysgKXtcclxuXHJcblx0XHRcdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgdGltZV9pbnRlcnZhbF9CLmxlbmd0aDsgaisrICl7XHJcblxyXG5cdFx0XHRcdFx0aXNfaW50ZXJzZWN0ID0gd3BiY19pbnRlcnZhbHNfX2lzX2ludGVyc2VjdGVkKCB0aW1lX2ludGVydmFsX0FbIGkgXSwgdGltZV9pbnRlcnZhbF9CWyBqIF0gKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGlzX2ludGVyc2VjdCApe1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEdldCBhbGwgdGltZSBmaWVsZHMgaW4gdGhlIGJvb2tpbmcgZm9ybSBhcyBhcnJheSAgb2Ygb2JqZWN0c1xyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSByZXNvdXJjZV9pZFxyXG5cdFx0ICogQHJldHVybnMgW11cclxuXHRcdCAqXHJcblx0XHQgKiBcdFx0RXhhbXBsZTpcclxuXHRcdCAqIFx0XHRcdFx0XHRbXHJcblx0XHQgKiBcdFx0XHRcdFx0IFx0ICAge1xyXG5cdFx0ICogXHRcdFx0XHRcdFx0XHRcdHZhbHVlX29wdGlvbl8yNGg6ICAgJzA2OjAwIC0gMDY6MzAnXHJcblx0XHQgKiBcdFx0XHRcdFx0XHRcdFx0dGltZXNfYXNfc2Vjb25kczogICBbIDIxNjAwLCAyMzQwMCBdXHJcblx0XHQgKiBcdFx0XHRcdFx0IFx0ICAgXHRcdGpxdWVyeV9vcHRpb246ICAgICAgalF1ZXJ5X09iamVjdCB7fVxyXG5cdFx0ICogXHRcdFx0XHRcdFx0XHRcdG5hbWU6ICAgICAgICAgICAgICAgJ3JhbmdldGltZTJbXSdcclxuXHRcdCAqIFx0XHRcdFx0XHQgICAgIH1cclxuXHRcdCAqIFx0XHRcdFx0XHQgIC4uLlxyXG5cdFx0ICogXHRcdFx0XHRcdFx0ICAge1xyXG5cdFx0ICogXHRcdFx0XHRcdFx0XHRcdHZhbHVlX29wdGlvbl8yNGg6ICAgJzA2OjAwJ1xyXG5cdFx0ICogXHRcdFx0XHRcdFx0XHRcdHRpbWVzX2FzX3NlY29uZHM6ICAgWyAyMTYwMCBdXHJcblx0XHQgKiBcdFx0XHRcdFx0XHQgICBcdFx0anF1ZXJ5X29wdGlvbjogICAgICBqUXVlcnlfT2JqZWN0IHt9XHJcblx0XHQgKiBcdFx0XHRcdFx0XHRcdFx0bmFtZTogICAgICAgICAgICAgICAnc3RhcnR0aW1lMltdJ1xyXG5cdFx0ICogIFx0XHRcdFx0XHQgICAgfVxyXG5cdFx0ICogXHRcdFx0XHRcdCBdXHJcblx0XHQgKi9cclxuXHRcdGZ1bmN0aW9uIHdwYmNfZ2V0X190aW1lX2ZpZWxkc19faW5fYm9va2luZ19mb3JtX19hc19hcnIoIHJlc291cmNlX2lkICl7XHJcblx0XHQgICAgLyoqXHJcblx0XHRcdCAqIEZpZWxkcyB3aXRoICBbXSAgbGlrZSB0aGlzICAgc2VsZWN0W25hbWU9XCJyYW5nZXRpbWUxW11cIl1cclxuXHRcdFx0ICogaXQncyB3aGVuIHdlIGhhdmUgJ211bHRpcGxlJyBpbiBzaG9ydGNvZGU6ICAgW3NlbGVjdCogcmFuZ2V0aW1lIG11bHRpcGxlICBcIjA2OjAwIC0gMDY6MzBcIiAuLi4gXVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0dmFyIHRpbWVfZmllbGRzX2Fycj1bXHJcblx0XHRcdFx0XHRcdFx0XHRcdCdzZWxlY3RbbmFtZT1cInJhbmdldGltZScgKyByZXNvdXJjZV9pZCArICdcIl0nLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQnc2VsZWN0W25hbWU9XCJyYW5nZXRpbWUnICsgcmVzb3VyY2VfaWQgKyAnW11cIl0nLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQnc2VsZWN0W25hbWU9XCJzdGFydHRpbWUnICsgcmVzb3VyY2VfaWQgKyAnXCJdJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0J3NlbGVjdFtuYW1lPVwic3RhcnR0aW1lJyArIHJlc291cmNlX2lkICsgJ1tdXCJdJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0J3NlbGVjdFtuYW1lPVwiZW5kdGltZScgKyByZXNvdXJjZV9pZCArICdcIl0nLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQnc2VsZWN0W25hbWU9XCJlbmR0aW1lJyArIHJlc291cmNlX2lkICsgJ1tdXCJdJ1xyXG5cdFx0XHRcdFx0XHRcdFx0XTtcclxuXHJcblx0XHRcdHZhciB0aW1lX2ZpZWxkc19vYmpfYXJyID0gW107XHJcblxyXG5cdFx0XHQvLyBMb29wIGFsbCBUaW1lIEZpZWxkc1xyXG5cdFx0XHRmb3IgKCB2YXIgY3RmPSAwOyBjdGYgPCB0aW1lX2ZpZWxkc19hcnIubGVuZ3RoOyBjdGYrKyApe1xyXG5cclxuXHRcdFx0XHR2YXIgdGltZV9maWVsZCA9IHRpbWVfZmllbGRzX2FyclsgY3RmIF07XHJcblx0XHRcdFx0dmFyIHRpbWVfb3B0aW9uID0galF1ZXJ5KCB0aW1lX2ZpZWxkICsgJyBvcHRpb24nICk7XHJcblxyXG5cdFx0XHRcdC8vIExvb3AgYWxsIG9wdGlvbnMgaW4gdGltZSBmaWVsZFxyXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IHRpbWVfb3B0aW9uLmxlbmd0aDsgaisrICl7XHJcblxyXG5cdFx0XHRcdFx0dmFyIGpxdWVyeV9vcHRpb24gPSBqUXVlcnkoIHRpbWVfZmllbGQgKyAnIG9wdGlvbjplcSgnICsgaiArICcpJyApO1xyXG5cdFx0XHRcdFx0dmFyIHZhbHVlX29wdGlvbl9zZWNvbmRzX2FyciA9IGpxdWVyeV9vcHRpb24udmFsKCkuc3BsaXQoICctJyApO1xyXG5cdFx0XHRcdFx0dmFyIHRpbWVzX2FzX3NlY29uZHMgPSBbXTtcclxuXHJcblx0XHRcdFx0XHQvLyBHZXQgdGltZSBhcyBzZWNvbmRzXHJcblx0XHRcdFx0XHRpZiAoIHZhbHVlX29wdGlvbl9zZWNvbmRzX2Fyci5sZW5ndGggKXtcdFx0XHRcdFx0XHRcdFx0XHQvLyBGaXhJbjogOS44LjEwLjEuXHJcblx0XHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHZhbHVlX29wdGlvbl9zZWNvbmRzX2Fyci5sZW5ndGg7IGkrKyApe1x0XHQvLyBGaXhJbjogMTAuMC4wLjU2LlxyXG5cdFx0XHRcdFx0XHRcdC8vIHZhbHVlX29wdGlvbl9zZWNvbmRzX2FycltpXSA9ICcxNDowMCAnICB8ICcgMTY6MDAnICAgKGlmIGZyb20gJ3JhbmdldGltZScpIGFuZCAnMTY6MDAnICBpZiAoc3RhcnQvZW5kIHRpbWUpXHJcblxyXG5cdFx0XHRcdFx0XHRcdHZhciBzdGFydF9lbmRfdGltZXNfYXJyID0gdmFsdWVfb3B0aW9uX3NlY29uZHNfYXJyWyBpIF0udHJpbSgpLnNwbGl0KCAnOicgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0dmFyIHRpbWVfaW5fc2Vjb25kcyA9IHBhcnNlSW50KCBzdGFydF9lbmRfdGltZXNfYXJyWyAwIF0gKSAqIDYwICogNjAgKyBwYXJzZUludCggc3RhcnRfZW5kX3RpbWVzX2FyclsgMSBdICkgKiA2MDtcclxuXHJcblx0XHRcdFx0XHRcdFx0dGltZXNfYXNfc2Vjb25kcy5wdXNoKCB0aW1lX2luX3NlY29uZHMgKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHRpbWVfZmllbGRzX29ial9hcnIucHVzaCgge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnbmFtZScgICAgICAgICAgICA6IGpRdWVyeSggdGltZV9maWVsZCApLmF0dHIoICduYW1lJyApLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQndmFsdWVfb3B0aW9uXzI0aCc6IGpxdWVyeV9vcHRpb24udmFsKCksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdqcXVlcnlfb3B0aW9uJyAgIDoganF1ZXJ5X29wdGlvbixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3RpbWVzX2FzX3NlY29uZHMnOiB0aW1lc19hc19zZWNvbmRzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9ICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdGltZV9maWVsZHNfb2JqX2FycjtcclxuXHRcdH1cclxuXHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBEaXNhYmxlIEhUTUwgb3B0aW9ucyBhbmQgYWRkIGJvb2tlZCBDU1MgY2xhc3NcclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQHBhcmFtIHRpbWVfZmllbGRzX29ial9hcnIgICAgICAtIHRoaXMgdmFsdWUgaXMgZnJvbSAgdGhlIGZ1bmM6XHJcblx0XHRcdCAqICAgICBcdHdwYmNfZ2V0X190aW1lX2ZpZWxkc19faW5fYm9va2luZ19mb3JtX19hc19hcnIoIHJlc291cmNlX2lkIClcclxuXHRcdFx0ICogXHRcdFx0XHRcdFtcclxuXHRcdFx0ICogXHRcdFx0XHRcdCBcdCAgIHtcdGpxdWVyeV9vcHRpb246ICAgICAgalF1ZXJ5X09iamVjdCB7fVxyXG5cdFx0XHQgKiBcdFx0XHRcdFx0XHRcdFx0bmFtZTogICAgICAgICAgICAgICAncmFuZ2V0aW1lMltdJ1xyXG5cdFx0XHQgKiBcdFx0XHRcdFx0XHRcdFx0dGltZXNfYXNfc2Vjb25kczogICBbIDIxNjAwLCAyMzQwMCBdXHJcblx0XHRcdCAqIFx0XHRcdFx0XHRcdFx0XHR2YWx1ZV9vcHRpb25fMjRoOiAgICcwNjowMCAtIDA2OjMwJ1xyXG5cdFx0XHQgKiBcdCAgXHRcdFx0XHRcdFx0ICAgIGRpc2FibGVkID0gMVxyXG5cdFx0XHQgKiBcdFx0XHRcdFx0ICAgICB9XHJcblx0XHRcdCAqIFx0XHRcdFx0XHQgIC4uLlxyXG5cdFx0XHQgKiBcdFx0XHRcdFx0XHQgICB7XHRqcXVlcnlfb3B0aW9uOiAgICAgIGpRdWVyeV9PYmplY3Qge31cclxuXHRcdFx0ICogXHRcdFx0XHRcdFx0XHRcdG5hbWU6ICAgICAgICAgICAgICAgJ3N0YXJ0dGltZTJbXSdcclxuXHRcdFx0ICogXHRcdFx0XHRcdFx0XHRcdHRpbWVzX2FzX3NlY29uZHM6ICAgWyAyMTYwMCBdXHJcblx0XHRcdCAqIFx0XHRcdFx0XHRcdFx0XHR2YWx1ZV9vcHRpb25fMjRoOiAgICcwNjowMCdcclxuXHRcdFx0ICogICBcdFx0XHRcdFx0XHRcdGRpc2FibGVkID0gMFxyXG5cdFx0XHQgKiAgXHRcdFx0XHRcdCAgICB9XHJcblx0XHRcdCAqIFx0XHRcdFx0XHQgXVxyXG5cdFx0XHQgKlxyXG5cdFx0XHQgKi9cclxuXHRcdFx0ZnVuY3Rpb24gd3BiY19faHRtbF9fdGltZV9maWVsZF9vcHRpb25zX19zZXRfZGlzYWJsZWQoIHRpbWVfZmllbGRzX29ial9hcnIgKXtcclxuXHJcblx0XHRcdFx0dmFyIGpxdWVyeV9vcHRpb247XHJcblxyXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRpbWVfZmllbGRzX29ial9hcnIubGVuZ3RoOyBpKysgKXtcclxuXHJcblx0XHRcdFx0XHR2YXIganF1ZXJ5X29wdGlvbiA9IHRpbWVfZmllbGRzX29ial9hcnJbIGkgXS5qcXVlcnlfb3B0aW9uO1xyXG5cclxuXHRcdFx0XHRcdGlmICggMSA9PSB0aW1lX2ZpZWxkc19vYmpfYXJyWyBpIF0uZGlzYWJsZWQgKXtcclxuXHRcdFx0XHRcdFx0anF1ZXJ5X29wdGlvbi5wcm9wKCAnZGlzYWJsZWQnLCB0cnVlICk7IFx0XHQvLyBNYWtlIGRpc2FibGUgc29tZSBvcHRpb25zXHJcblx0XHRcdFx0XHRcdGpxdWVyeV9vcHRpb24uYWRkQ2xhc3MoICdib29rZWQnICk7ICAgICAgICAgICBcdC8vIEFkZCBcImJvb2tlZFwiIENTUyBjbGFzc1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gaWYgdGhpcyBib29rZWQgZWxlbWVudCBzZWxlY3RlZCAtLT4gdGhlbiBkZXNlbGVjdCAgaXRcclxuXHRcdFx0XHRcdFx0aWYgKCBqcXVlcnlfb3B0aW9uLnByb3AoICdzZWxlY3RlZCcgKSApe1xyXG5cdFx0XHRcdFx0XHRcdGpxdWVyeV9vcHRpb24ucHJvcCggJ3NlbGVjdGVkJywgZmFsc2UgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0anF1ZXJ5X29wdGlvbi5wYXJlbnQoKS5maW5kKCAnb3B0aW9uOm5vdChbZGlzYWJsZWRdKTpmaXJzdCcgKS5wcm9wKCAnc2VsZWN0ZWQnLCB0cnVlICkudHJpZ2dlciggXCJjaGFuZ2VcIiApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0anF1ZXJ5X29wdGlvbi5wcm9wKCAnZGlzYWJsZWQnLCBmYWxzZSApOyAgXHRcdC8vIE1ha2UgYWN0aXZlIGFsbCB0aW1lc1xyXG5cdFx0XHRcdFx0XHRqcXVlcnlfb3B0aW9uLnJlbW92ZUNsYXNzKCAnYm9va2VkJyApOyAgIFx0XHQvLyBSZW1vdmUgY2xhc3MgXCJib29rZWRcIlxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2hlY2sgaWYgdGhpcyB0aW1lX3JhbmdlIHwgVGltZV9TbG90IGlzIEZ1bGwgRGF5ICBib29rZWRcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB0aW1lc2xvdF9hcnJfaW5fc2Vjb25kc1x0XHQtIFsgMzYwMTEsIDg2NDAwIF1cclxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2lzX3RoaXNfdGltZXNsb3RfX2Z1bGxfZGF5X2Jvb2tlZCggdGltZXNsb3RfYXJyX2luX3NlY29uZHMgKXtcclxuXHJcblx0XHRpZiAoXHJcblx0XHRcdFx0KCB0aW1lc2xvdF9hcnJfaW5fc2Vjb25kcy5sZW5ndGggPiAxIClcclxuXHRcdFx0JiYgKCBwYXJzZUludCggdGltZXNsb3RfYXJyX2luX3NlY29uZHNbIDAgXSApIDwgMzAgKVxyXG5cdFx0XHQmJiAoIHBhcnNlSW50KCB0aW1lc2xvdF9hcnJfaW5fc2Vjb25kc1sgMSBdICkgPiAgKCAoMjQgKiA2MCAqIDYwKSAtIDMwKSApXHJcblx0XHQpe1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG5cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvKiAgPT0gIFMgZSBsIGUgYyB0IGUgZCAgICBEIGEgdCBlIHMgIC8gIFQgaSBtIGUgLSBGIGkgZSBsIGQgcyAgPT1cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuXHQvKipcclxuXHQgKiAgR2V0IGFsbCBzZWxlY3RlZCBkYXRlcyBpbiBTUUwgZm9ybWF0IGxpa2UgdGhpcyBbIFwiMjAyMy0wOC0yM1wiLCBcIjIwMjMtMDgtMjRcIiAsIC4uLiBdXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gcmVzb3VyY2VfaWRcclxuXHQgKiBAcmV0dXJucyB7W119XHRcdFx0WyBcIjIwMjMtMDgtMjNcIiwgXCIyMDIzLTA4LTI0XCIsIFwiMjAyMy0wOC0yNVwiLCBcIjIwMjMtMDgtMjZcIiwgXCIyMDIzLTA4LTI3XCIsIFwiMjAyMy0wOC0yOFwiLFxyXG5cdCAqICAgICBcIjIwMjMtMDgtMjlcIiBdXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19nZXRfX3NlbGVjdGVkX2RhdGVzX3NxbF9fYXNfYXJyKCByZXNvdXJjZV9pZCApe1xyXG5cclxuXHRcdHZhciBzZWxlY3RlZF9kYXRlc19hcnIgPSBbXTtcclxuXHRcdHNlbGVjdGVkX2RhdGVzX2FyciA9IGpRdWVyeSggJyNkYXRlX2Jvb2tpbmcnICsgcmVzb3VyY2VfaWQgKS52YWwoKS5zcGxpdCgnLCcpO1xyXG5cclxuXHRcdGlmICggc2VsZWN0ZWRfZGF0ZXNfYXJyLmxlbmd0aCApe1x0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZpeEluOiA5LjguMTAuMS5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgc2VsZWN0ZWRfZGF0ZXNfYXJyLmxlbmd0aDsgaSsrICl7XHRcdFx0XHRcdFx0Ly8gRml4SW46IDEwLjAuMC41Ni5cclxuXHRcdFx0XHRzZWxlY3RlZF9kYXRlc19hcnJbIGkgXSA9IHNlbGVjdGVkX2RhdGVzX2FyclsgaSBdLnRyaW0oKTtcclxuXHRcdFx0XHRzZWxlY3RlZF9kYXRlc19hcnJbIGkgXSA9IHNlbGVjdGVkX2RhdGVzX2FyclsgaSBdLnNwbGl0KCAnLicgKTtcclxuXHRcdFx0XHRpZiAoIHNlbGVjdGVkX2RhdGVzX2FyclsgaSBdLmxlbmd0aCA+IDEgKXtcclxuXHRcdFx0XHRcdHNlbGVjdGVkX2RhdGVzX2FyclsgaSBdID0gc2VsZWN0ZWRfZGF0ZXNfYXJyWyBpIF1bIDIgXSArICctJyArIHNlbGVjdGVkX2RhdGVzX2FyclsgaSBdWyAxIF0gKyAnLScgKyBzZWxlY3RlZF9kYXRlc19hcnJbIGkgXVsgMCBdO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFJlbW92ZSBlbXB0eSBlbGVtZW50cyBmcm9tIGFuIGFycmF5XHJcblx0XHRzZWxlY3RlZF9kYXRlc19hcnIgPSBzZWxlY3RlZF9kYXRlc19hcnIuZmlsdGVyKCBmdW5jdGlvbiAoIG4gKXsgcmV0dXJuIHBhcnNlSW50KG4pOyB9ICk7XHJcblxyXG5cdFx0c2VsZWN0ZWRfZGF0ZXNfYXJyLnNvcnQoKTtcclxuXHJcblx0XHRyZXR1cm4gc2VsZWN0ZWRfZGF0ZXNfYXJyO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldCBhbGwgdGltZSBmaWVsZHMgaW4gdGhlIGJvb2tpbmcgZm9ybSBhcyBhcnJheSAgb2Ygb2JqZWN0c1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIHJlc291cmNlX2lkXHJcblx0ICogQHBhcmFtIGlzX29ubHlfc2VsZWN0ZWRfdGltZVxyXG5cdCAqIEByZXR1cm5zIFtdXHJcblx0ICpcclxuXHQgKiBcdFx0RXhhbXBsZTpcclxuXHQgKiBcdFx0XHRcdFx0W1xyXG5cdCAqIFx0XHRcdFx0XHQgXHQgICB7XHJcblx0ICogXHRcdFx0XHRcdFx0XHRcdHZhbHVlX29wdGlvbl8yNGg6ICAgJzA2OjAwIC0gMDY6MzAnXHJcblx0ICogXHRcdFx0XHRcdFx0XHRcdHRpbWVzX2FzX3NlY29uZHM6ICAgWyAyMTYwMCwgMjM0MDAgXVxyXG5cdCAqIFx0XHRcdFx0XHQgXHQgICBcdFx0anF1ZXJ5X29wdGlvbjogICAgICBqUXVlcnlfT2JqZWN0IHt9XHJcblx0ICogXHRcdFx0XHRcdFx0XHRcdG5hbWU6ICAgICAgICAgICAgICAgJ3JhbmdldGltZTJbXSdcclxuXHQgKiBcdFx0XHRcdFx0ICAgICB9XHJcblx0ICogXHRcdFx0XHRcdCAgLi4uXHJcblx0ICogXHRcdFx0XHRcdFx0ICAge1xyXG5cdCAqIFx0XHRcdFx0XHRcdFx0XHR2YWx1ZV9vcHRpb25fMjRoOiAgICcwNjowMCdcclxuXHQgKiBcdFx0XHRcdFx0XHRcdFx0dGltZXNfYXNfc2Vjb25kczogICBbIDIxNjAwIF1cclxuXHQgKiBcdFx0XHRcdFx0XHQgICBcdFx0anF1ZXJ5X29wdGlvbjogICAgICBqUXVlcnlfT2JqZWN0IHt9XHJcblx0ICogXHRcdFx0XHRcdFx0XHRcdG5hbWU6ICAgICAgICAgICAgICAgJ3N0YXJ0dGltZTJbXSdcclxuXHQgKiAgXHRcdFx0XHRcdCAgICB9XHJcblx0ICogXHRcdFx0XHRcdCBdXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19nZXRfX3NlbGVjdGVkX3RpbWVfZmllbGRzX19pbl9ib29raW5nX2Zvcm1fX2FzX2FyciggcmVzb3VyY2VfaWQsIGlzX29ubHlfc2VsZWN0ZWRfdGltZSA9IHRydWUgKXtcclxuXHRcdC8qKlxyXG5cdFx0ICogRmllbGRzIHdpdGggIFtdICBsaWtlIHRoaXMgICBzZWxlY3RbbmFtZT1cInJhbmdldGltZTFbXVwiXVxyXG5cdFx0ICogaXQncyB3aGVuIHdlIGhhdmUgJ211bHRpcGxlJyBpbiBzaG9ydGNvZGU6ICAgW3NlbGVjdCogcmFuZ2V0aW1lIG11bHRpcGxlICBcIjA2OjAwIC0gMDY6MzBcIiAuLi4gXVxyXG5cdFx0ICovXHJcblx0XHR2YXIgdGltZV9maWVsZHNfYXJyPVtcclxuXHRcdFx0XHRcdFx0XHRcdCdzZWxlY3RbbmFtZT1cInJhbmdldGltZScgKyByZXNvdXJjZV9pZCArICdcIl0nLFxyXG5cdFx0XHRcdFx0XHRcdFx0J3NlbGVjdFtuYW1lPVwicmFuZ2V0aW1lJyArIHJlc291cmNlX2lkICsgJ1tdXCJdJyxcclxuXHRcdFx0XHRcdFx0XHRcdCdzZWxlY3RbbmFtZT1cInN0YXJ0dGltZScgKyByZXNvdXJjZV9pZCArICdcIl0nLFxyXG5cdFx0XHRcdFx0XHRcdFx0J3NlbGVjdFtuYW1lPVwic3RhcnR0aW1lJyArIHJlc291cmNlX2lkICsgJ1tdXCJdJyxcclxuXHRcdFx0XHRcdFx0XHRcdCdzZWxlY3RbbmFtZT1cImVuZHRpbWUnICsgcmVzb3VyY2VfaWQgKyAnXCJdJyxcclxuXHRcdFx0XHRcdFx0XHRcdCdzZWxlY3RbbmFtZT1cImVuZHRpbWUnICsgcmVzb3VyY2VfaWQgKyAnW11cIl0nLFxyXG5cdFx0XHRcdFx0XHRcdFx0J3NlbGVjdFtuYW1lPVwiZHVyYXRpb250aW1lJyArIHJlc291cmNlX2lkICsgJ1wiXScsXHJcblx0XHRcdFx0XHRcdFx0XHQnc2VsZWN0W25hbWU9XCJkdXJhdGlvbnRpbWUnICsgcmVzb3VyY2VfaWQgKyAnW11cIl0nXHJcblx0XHRcdFx0XHRcdFx0XTtcclxuXHJcblx0XHR2YXIgdGltZV9maWVsZHNfb2JqX2FyciA9IFtdO1xyXG5cclxuXHRcdC8vIExvb3AgYWxsIFRpbWUgRmllbGRzXHJcblx0XHRmb3IgKCB2YXIgY3RmPSAwOyBjdGYgPCB0aW1lX2ZpZWxkc19hcnIubGVuZ3RoOyBjdGYrKyApe1xyXG5cclxuXHRcdFx0dmFyIHRpbWVfZmllbGQgPSB0aW1lX2ZpZWxkc19hcnJbIGN0ZiBdO1xyXG5cclxuXHRcdFx0dmFyIHRpbWVfb3B0aW9uO1xyXG5cdFx0XHRpZiAoIGlzX29ubHlfc2VsZWN0ZWRfdGltZSApe1xyXG5cdFx0XHRcdHRpbWVfb3B0aW9uID0galF1ZXJ5KCAnI2Jvb2tpbmdfZm9ybScgKyByZXNvdXJjZV9pZCArICcgJyArIHRpbWVfZmllbGQgKyAnIG9wdGlvbjpzZWxlY3RlZCcgKTtcdFx0XHQvLyBFeGNsdWRlIGNvbmRpdGlvbmFsICBmaWVsZHMsICBiZWNhdXNlIG9mIHVzaW5nICcjYm9va2luZ19mb3JtMyAuLi4nXHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGltZV9vcHRpb24gPSBqUXVlcnkoICcjYm9va2luZ19mb3JtJyArIHJlc291cmNlX2lkICsgJyAnICsgdGltZV9maWVsZCArICcgb3B0aW9uJyApO1x0XHRcdFx0Ly8gQWxsICB0aW1lIGZpZWxkc1xyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdFx0Ly8gTG9vcCBhbGwgb3B0aW9ucyBpbiB0aW1lIGZpZWxkXHJcblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IHRpbWVfb3B0aW9uLmxlbmd0aDsgaisrICl7XHJcblxyXG5cdFx0XHRcdHZhciBqcXVlcnlfb3B0aW9uID0galF1ZXJ5KCB0aW1lX29wdGlvblsgaiBdICk7XHRcdC8vIEdldCBvbmx5ICBzZWxlY3RlZCBvcHRpb25zIFx0Ly9qUXVlcnkoIHRpbWVfZmllbGQgKyAnIG9wdGlvbjplcSgnICsgaiArICcpJyApO1xyXG5cdFx0XHRcdHZhciB2YWx1ZV9vcHRpb25fc2Vjb25kc19hcnIgPSBqcXVlcnlfb3B0aW9uLnZhbCgpLnNwbGl0KCAnLScgKTtcclxuXHRcdFx0XHR2YXIgdGltZXNfYXNfc2Vjb25kcyA9IFtdO1xyXG5cclxuXHRcdFx0XHQvLyBHZXQgdGltZSBhcyBzZWNvbmRzXHJcblx0XHRcdFx0aWYgKCB2YWx1ZV9vcHRpb25fc2Vjb25kc19hcnIubGVuZ3RoICl7XHRcdFx0XHQgXHRcdFx0XHRcdFx0XHRcdC8vIEZpeEluOiA5LjguMTAuMS5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHZhbHVlX29wdGlvbl9zZWNvbmRzX2Fyci5sZW5ndGg7IGkrKyApe1x0XHRcdFx0XHQvLyBGaXhJbjogMTAuMC4wLjU2LlxyXG5cdFx0XHRcdFx0XHQvLyB2YWx1ZV9vcHRpb25fc2Vjb25kc19hcnJbaV0gPSAnMTQ6MDAgJyAgfCAnIDE2OjAwJyAgIChpZiBmcm9tICdyYW5nZXRpbWUnKSBhbmQgJzE2OjAwJyAgaWYgKHN0YXJ0L2VuZCB0aW1lKVxyXG5cclxuXHRcdFx0XHRcdFx0dmFyIHN0YXJ0X2VuZF90aW1lc19hcnIgPSB2YWx1ZV9vcHRpb25fc2Vjb25kc19hcnJbIGkgXS50cmltKCkuc3BsaXQoICc6JyApO1xyXG5cclxuXHRcdFx0XHRcdFx0dmFyIHRpbWVfaW5fc2Vjb25kcyA9IHBhcnNlSW50KCBzdGFydF9lbmRfdGltZXNfYXJyWyAwIF0gKSAqIDYwICogNjAgKyBwYXJzZUludCggc3RhcnRfZW5kX3RpbWVzX2FyclsgMSBdICkgKiA2MDtcclxuXHJcblx0XHRcdFx0XHRcdHRpbWVzX2FzX3NlY29uZHMucHVzaCggdGltZV9pbl9zZWNvbmRzICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0aW1lX2ZpZWxkc19vYmpfYXJyLnB1c2goIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCduYW1lJyAgICAgICAgICAgIDogalF1ZXJ5KCAnI2Jvb2tpbmdfZm9ybScgKyByZXNvdXJjZV9pZCArICcgJyArIHRpbWVfZmllbGQgKS5hdHRyKCAnbmFtZScgKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCd2YWx1ZV9vcHRpb25fMjRoJzoganF1ZXJ5X29wdGlvbi52YWwoKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdqcXVlcnlfb3B0aW9uJyAgIDoganF1ZXJ5X29wdGlvbixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCd0aW1lc19hc19zZWNvbmRzJzogdGltZXNfYXNfc2Vjb25kc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFRleHQ6ICAgW3N0YXJ0dGltZV0gLSBbZW5kdGltZV0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0XHR2YXIgdGV4dF90aW1lX2ZpZWxkc19hcnI9W1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQnaW5wdXRbbmFtZT1cInN0YXJ0dGltZScgKyByZXNvdXJjZV9pZCArICdcIl0nLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQnaW5wdXRbbmFtZT1cImVuZHRpbWUnICsgcmVzb3VyY2VfaWQgKyAnXCJdJyxcclxuXHRcdFx0XHRcdFx0XHRcdF07XHJcblx0XHRmb3IgKCB2YXIgdGY9IDA7IHRmIDwgdGV4dF90aW1lX2ZpZWxkc19hcnIubGVuZ3RoOyB0ZisrICl7XHJcblxyXG5cdFx0XHR2YXIgdGV4dF9qcXVlcnkgPSBqUXVlcnkoICcjYm9va2luZ19mb3JtJyArIHJlc291cmNlX2lkICsgJyAnICsgdGV4dF90aW1lX2ZpZWxkc19hcnJbIHRmIF0gKTtcdFx0XHRcdFx0XHRcdFx0Ly8gRXhjbHVkZSBjb25kaXRpb25hbCAgZmllbGRzLCAgYmVjYXVzZSBvZiB1c2luZyAnI2Jvb2tpbmdfZm9ybTMgLi4uJ1xyXG5cdFx0XHRpZiAoIHRleHRfanF1ZXJ5Lmxlbmd0aCA+IDAgKXtcclxuXHJcblx0XHRcdFx0dmFyIHRpbWVfX2hfbV9fYXJyID0gdGV4dF9qcXVlcnkudmFsKCkudHJpbSgpLnNwbGl0KCAnOicgKTtcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gJzE0OjAwJ1xyXG5cdFx0XHRcdGlmICggMCA9PSB0aW1lX19oX21fX2Fyci5sZW5ndGggKXtcclxuXHRcdFx0XHRcdGNvbnRpbnVlO1x0XHRcdFx0XHRcdFx0XHRcdC8vIE5vdCBlbnRlcmVkIHRpbWUgdmFsdWUgaW4gYSBmaWVsZFxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoIDEgPT0gdGltZV9faF9tX19hcnIubGVuZ3RoICl7XHJcblx0XHRcdFx0XHRpZiAoICcnID09PSB0aW1lX19oX21fX2FyclsgMCBdICl7XHJcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1x0XHRcdFx0XHRcdFx0XHQvLyBOb3QgZW50ZXJlZCB0aW1lIHZhbHVlIGluIGEgZmllbGRcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHRpbWVfX2hfbV9fYXJyWyAxIF0gPSAwO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR2YXIgdGV4dF90aW1lX2luX3NlY29uZHMgPSBwYXJzZUludCggdGltZV9faF9tX19hcnJbIDAgXSApICogNjAgKiA2MCArIHBhcnNlSW50KCB0aW1lX19oX21fX2FyclsgMSBdICkgKiA2MDtcclxuXHJcblx0XHRcdFx0dmFyIHRleHRfdGltZXNfYXNfc2Vjb25kcyA9IFtdO1xyXG5cdFx0XHRcdHRleHRfdGltZXNfYXNfc2Vjb25kcy5wdXNoKCB0ZXh0X3RpbWVfaW5fc2Vjb25kcyApO1xyXG5cclxuXHRcdFx0XHR0aW1lX2ZpZWxkc19vYmpfYXJyLnB1c2goIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCduYW1lJyAgICAgICAgICAgIDogdGV4dF9qcXVlcnkuYXR0ciggJ25hbWUnICksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQndmFsdWVfb3B0aW9uXzI0aCc6IHRleHRfanF1ZXJ5LnZhbCgpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2pxdWVyeV9vcHRpb24nICAgOiB0ZXh0X2pxdWVyeSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCd0aW1lc19hc19zZWNvbmRzJzogdGV4dF90aW1lc19hc19zZWNvbmRzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRpbWVfZmllbGRzX29ial9hcnI7XHJcblx0fVxyXG5cclxuXHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLyogID09ICBTIFUgUCBQIE8gUiBUICAgIGZvciAgICBDIEEgTCBFIE4gRCBBIFIgID09XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuXHQvKipcclxuXHQgKiBHZXQgQ2FsZW5kYXIgZGF0ZXBpY2sgSW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2ludHxzdHJpbmd9IHJlc291cmNlX2lkXHJcblx0ICogQHJldHVybnMgeyp8bnVsbH1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2NhbGVuZGFyX19nZXRfaW5zdChyZXNvdXJjZV9pZCkge1xyXG5cclxuXHRcdGlmICggJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiAocmVzb3VyY2VfaWQpICkge1xyXG5cdFx0XHRyZXNvdXJjZV9pZCA9ICcxJztcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGpRdWVyeSggJyNjYWxlbmRhcl9ib29raW5nJyArIHJlc291cmNlX2lkICkubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0dmFyIGluc3QgPSBqUXVlcnkuZGF0ZXBpY2suX2dldEluc3QoIGpRdWVyeSggJyNjYWxlbmRhcl9ib29raW5nJyArIHJlc291cmNlX2lkICkuZ2V0KCAwICkgKTtcclxuXHRcdFx0XHRyZXR1cm4gaW5zdCA/IGluc3QgOiBudWxsO1xyXG5cdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFVuc2VsZWN0ICBhbGwgZGF0ZXMgaW4gY2FsZW5kYXIgYW5kIHZpc3VhbGx5IHVwZGF0ZSB0aGlzIGNhbGVuZGFyXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gcmVzb3VyY2VfaWRcdFx0SUQgb2YgYm9va2luZyByZXNvdXJjZVxyXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVx0XHR0cnVlIG9uIHN1Y2Nlc3MgfCBmYWxzZSwgIGlmIG5vIHN1Y2ggIGNhbGVuZGFyXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19jYWxlbmRhcl9fdW5zZWxlY3RfYWxsX2RhdGVzKCByZXNvdXJjZV9pZCApe1xyXG5cclxuXHRcdGlmICggJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiAocmVzb3VyY2VfaWQpICl7XHJcblx0XHRcdHJlc291cmNlX2lkID0gJzEnO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBpbnN0ID0gd3BiY19jYWxlbmRhcl9fZ2V0X2luc3QoIHJlc291cmNlX2lkIClcclxuXHJcblx0XHRpZiAoIG51bGwgIT09IGluc3QgKXtcclxuXHJcblx0XHRcdC8vIFVuc2VsZWN0IGFsbCBkYXRlcyBhbmQgc2V0ICBwcm9wZXJ0aWVzIG9mIERhdGVwaWNrXHJcblx0XHRcdGpRdWVyeSggJyNkYXRlX2Jvb2tpbmcnICsgcmVzb3VyY2VfaWQgKS52YWwoICcnICk7ICAgICAgLy9GaXhJbjogNS40LjNcclxuXHRcdFx0aW5zdC5zdGF5T3BlbiA9IGZhbHNlO1xyXG5cdFx0XHRpbnN0LmRhdGVzID0gW107XHJcblx0XHRcdGpRdWVyeS5kYXRlcGljay5fdXBkYXRlRGF0ZXBpY2soIGluc3QgKTtcclxuXHJcblx0XHRcdHJldHVybiB0cnVlXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsZWFyIGRheXMgaGlnaGxpZ2h0aW5nIGluIEFsbCBvciBzcGVjaWZpYyBDYWxlbmRhcnNcclxuXHQgKlxyXG4gICAgICogQHBhcmFtIHJlc291cmNlX2lkICAtIGNhbiBiZSBza2lwZWQgdG8gIGNsZWFyIGhpZ2hsaWdodGluZyBpbiBhbGwgY2FsZW5kYXJzXHJcbiAgICAgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2NhbGVuZGFyc19fY2xlYXJfZGF5c19oaWdobGlnaHRpbmcoIHJlc291cmNlX2lkICl7XHJcblxyXG5cdFx0aWYgKCAndW5kZWZpbmVkJyAhPT0gdHlwZW9mICggcmVzb3VyY2VfaWQgKSApe1xyXG5cclxuXHRcdFx0alF1ZXJ5KCAnI2NhbGVuZGFyX2Jvb2tpbmcnICsgcmVzb3VyY2VfaWQgKyAnIC5kYXRlcGljay1kYXlzLWNlbGwtb3ZlcicgKS5yZW1vdmVDbGFzcyggJ2RhdGVwaWNrLWRheXMtY2VsbC1vdmVyJyApO1x0XHQvLyBDbGVhciBpbiBzcGVjaWZpYyBjYWxlbmRhclxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGpRdWVyeSggJy5kYXRlcGljay1kYXlzLWNlbGwtb3ZlcicgKS5yZW1vdmVDbGFzcyggJ2RhdGVwaWNrLWRheXMtY2VsbC1vdmVyJyApO1x0XHRcdFx0XHRcdFx0XHQvLyBDbGVhciBpbiBhbGwgY2FsZW5kYXJzXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTY3JvbGwgdG8gc3BlY2lmaWMgbW9udGggaW4gY2FsZW5kYXJcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSByZXNvdXJjZV9pZFx0XHRJRCBvZiByZXNvdXJjZVxyXG5cdCAqIEBwYXJhbSB5ZWFyXHRcdFx0XHQtIHJlYWwgeWVhciAgLSAyMDIzXHJcblx0ICogQHBhcmFtIG1vbnRoXHRcdFx0XHQtIHJlYWwgbW9udGggLSAxMlxyXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfY2FsZW5kYXJfX3Njcm9sbF90byggcmVzb3VyY2VfaWQsIHllYXIsIG1vbnRoICl7XHJcblxyXG5cdFx0aWYgKCAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIChyZXNvdXJjZV9pZCkgKXsgcmVzb3VyY2VfaWQgPSAnMSc7IH1cclxuXHRcdHZhciBpbnN0ID0gd3BiY19jYWxlbmRhcl9fZ2V0X2luc3QoIHJlc291cmNlX2lkIClcclxuXHRcdGlmICggbnVsbCAhPT0gaW5zdCApe1xyXG5cclxuXHRcdFx0eWVhciAgPSBwYXJzZUludCggeWVhciApO1xyXG5cdFx0XHRtb250aCA9IHBhcnNlSW50KCBtb250aCApIC0gMTtcdFx0Ly8gSW4gSlMgZGF0ZSwgIG1vbnRoIC0xXHJcblxyXG5cdFx0XHRpbnN0LmN1cnNvckRhdGUgPSBuZXcgRGF0ZSgpO1xyXG5cdFx0XHQvLyBJbiBzb21lIGNhc2VzLCAgdGhlIHNldEZ1bGxZZWFyIGNhbiAgc2V0ICBvbmx5IFllYXIsICBhbmQgbm90IHRoZSBNb250aCBhbmQgZGF5ICAgICAgLy8gRml4SW46IDYuMi4zLjUuXHJcblx0XHRcdGluc3QuY3Vyc29yRGF0ZS5zZXRGdWxsWWVhciggeWVhciwgbW9udGgsIDEgKTtcclxuXHRcdFx0aW5zdC5jdXJzb3JEYXRlLnNldE1vbnRoKCBtb250aCApO1xyXG5cdFx0XHRpbnN0LmN1cnNvckRhdGUuc2V0RGF0ZSggMSApO1xyXG5cclxuXHRcdFx0aW5zdC5kcmF3TW9udGggPSBpbnN0LmN1cnNvckRhdGUuZ2V0TW9udGgoKTtcclxuXHRcdFx0aW5zdC5kcmF3WWVhciA9IGluc3QuY3Vyc29yRGF0ZS5nZXRGdWxsWWVhcigpO1xyXG5cclxuXHRcdFx0alF1ZXJ5LmRhdGVwaWNrLl9ub3RpZnlDaGFuZ2UoIGluc3QgKTtcclxuXHRcdFx0alF1ZXJ5LmRhdGVwaWNrLl9hZGp1c3RJbnN0RGF0ZSggaW5zdCApO1xyXG5cdFx0XHRqUXVlcnkuZGF0ZXBpY2suX3Nob3dEYXRlKCBpbnN0ICk7XHJcblx0XHRcdGpRdWVyeS5kYXRlcGljay5fdXBkYXRlRGF0ZXBpY2soIGluc3QgKTtcclxuXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXMgdGhpcyBkYXRlIHNlbGVjdGFibGUgaW4gY2FsZW5kYXIgKG1haW5seSBpdCdzIG1lYW5zIEFWQUlMQUJMRSBkYXRlKVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtpbnR8c3RyaW5nfSByZXNvdXJjZV9pZFx0XHQxXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNxbF9jbGFzc19kYXlcdFx0JzIwMjMtMDgtMTEnXHJcblx0ICogQHJldHVybnMge2Jvb2xlYW59XHRcdFx0XHRcdHRydWUgfCBmYWxzZVxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfaXNfdGhpc19kYXlfc2VsZWN0YWJsZSggcmVzb3VyY2VfaWQsIHNxbF9jbGFzc19kYXkgKXtcclxuXHJcblx0XHQvLyBHZXQgRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0dmFyIGRhdGVfYm9va2luZ3Nfb2JqID0gX3dwYmMuYm9va2luZ3NfaW5fY2FsZW5kYXJfX2dldF9mb3JfZGF0ZSggcmVzb3VyY2VfaWQsIHNxbF9jbGFzc19kYXkgKTtcclxuXHJcblx0XHR2YXIgaXNfZGF5X3NlbGVjdGFibGUgPSAoIHBhcnNlSW50KCBkYXRlX2Jvb2tpbmdzX29ialsgJ2RheV9hdmFpbGFiaWxpdHknIF0gKSA+IDAgKTtcclxuXHJcblx0XHRpZiAoIHR5cGVvZiAoZGF0ZV9ib29raW5nc19vYmpbICdzdW1tYXJ5JyBdKSA9PT0gJ3VuZGVmaW5lZCcgKXtcclxuXHRcdFx0cmV0dXJuIGlzX2RheV9zZWxlY3RhYmxlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggJ2F2YWlsYWJsZScgIT0gZGF0ZV9ib29raW5nc19vYmpbICdzdW1tYXJ5J11bJ3N0YXR1c19mb3JfZGF5JyBdICl7XHJcblxyXG5cdFx0XHR2YXIgaXNfc2V0X3BlbmRpbmdfZGF5c19zZWxlY3RhYmxlID0gX3dwYmMuY2FsZW5kYXJfX2dldF9wYXJhbV92YWx1ZSggcmVzb3VyY2VfaWQsICdwZW5kaW5nX2RheXNfc2VsZWN0YWJsZScgKTtcdFx0Ly8gc2V0IHBlbmRpbmcgZGF5cyBzZWxlY3RhYmxlICAgICAgICAgIC8vIEZpeEluOiA4LjYuMS4xOC5cclxuXHRcdFx0dmFyIGJvb2tpbmdfc3RhdHVzZXNfYXJyID0gd3BiY19nZXRfYm9va2luZ19zdGF0dXNlc19fYXNfYXJyKCBkYXRlX2Jvb2tpbmdzX29iaiApO1xyXG5cclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdCAgICggd3BiY19ib29raW5nX3N0YXR1c2VzX19oYXMoIGJvb2tpbmdfc3RhdHVzZXNfYXJyLCAncGVuZGluZycgKSApXHJcblx0XHRcdFx0fHwgKCB3cGJjX2Jvb2tpbmdfc3RhdHVzZXNfX2hhcyggYm9va2luZ19zdGF0dXNlc19hcnIsICdwZW5kaW5nX3BlbmRpbmcnICkgKVxyXG5cdFx0XHRcdHx8ICggd3BiY19ib29raW5nX3N0YXR1c2VzX19oYXMoIGJvb2tpbmdfc3RhdHVzZXNfYXJyLCAncGVuZGluZ19hcHByb3ZlZCcgKSApXHJcblx0XHRcdFx0fHwgKCB3cGJjX2Jvb2tpbmdfc3RhdHVzZXNfX2hhcyggYm9va2luZ19zdGF0dXNlc19hcnIsICdhcHByb3ZlZF9wZW5kaW5nJyApIClcclxuXHRcdFx0KXtcclxuXHRcdFx0XHRpc19kYXlfc2VsZWN0YWJsZSA9IChpc19kYXlfc2VsZWN0YWJsZSkgPyB0cnVlIDogaXNfc2V0X3BlbmRpbmdfZGF5c19zZWxlY3RhYmxlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGlzX2RheV9zZWxlY3RhYmxlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXMgZGF0ZSB0byBjaGVjayBJTiBhcnJheSBvZiBzZWxlY3RlZCBkYXRlc1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtkYXRlfWpzX2RhdGVfdG9fY2hlY2tcdFx0LSBKUyBEYXRlXHRcdFx0LSBzaW1wbGUgIEphdmFTY3JpcHQgRGF0ZSBvYmplY3RcclxuXHQgKiBAcGFyYW0ge1tdfSBqc19kYXRlc19hcnJcdFx0XHQtIFsgSlNEYXRlLCAuLi4gXSAgIC0gYXJyYXkgIG9mIEpTIGRhdGVzXHJcblx0ICogQHJldHVybnMge2Jvb2xlYW59XHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19pc190aGlzX2RheV9hbW9uZ19zZWxlY3RlZF9kYXlzKCBqc19kYXRlX3RvX2NoZWNrLCBqc19kYXRlc19hcnIgKXtcclxuXHJcblx0XHRmb3IgKCB2YXIgZGF0ZV9pbmRleCA9IDA7IGRhdGVfaW5kZXggPCBqc19kYXRlc19hcnIubGVuZ3RoIDsgZGF0ZV9pbmRleCsrICl7ICAgICBcdFx0XHRcdFx0XHRcdFx0XHQvLyBGaXhJbjogOC40LjUuMTYuXHJcblx0XHRcdGlmICggKCBqc19kYXRlc19hcnJbIGRhdGVfaW5kZXggXS5nZXRGdWxsWWVhcigpID09PSBqc19kYXRlX3RvX2NoZWNrLmdldEZ1bGxZZWFyKCkgKSAmJlxyXG5cdFx0XHRcdCAoIGpzX2RhdGVzX2FyclsgZGF0ZV9pbmRleCBdLmdldE1vbnRoKCkgPT09IGpzX2RhdGVfdG9fY2hlY2suZ2V0TW9udGgoKSApICYmXHJcblx0XHRcdFx0ICgganNfZGF0ZXNfYXJyWyBkYXRlX2luZGV4IF0uZ2V0RGF0ZSgpID09PSBqc19kYXRlX3RvX2NoZWNrLmdldERhdGUoKSApICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0IFNRTCBDbGFzcyBEYXRlICcyMDIzLTA4LTAxJyBmcm9tICBKUyBEYXRlXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZGF0ZVx0XHRcdFx0SlMgRGF0ZVxyXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XHRcdCcyMDIzLTA4LTEyJ1xyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfX2dldF9fc3FsX2NsYXNzX2RhdGUoIGRhdGUgKXtcclxuXHJcblx0XHR2YXIgc3FsX2NsYXNzX2RheSA9IGRhdGUuZ2V0RnVsbFllYXIoKSArICctJztcclxuXHRcdFx0c3FsX2NsYXNzX2RheSArPSAoICggZGF0ZS5nZXRNb250aCgpICsgMSApIDwgMTAgKSA/ICcwJyA6ICcnO1xyXG5cdFx0XHRzcWxfY2xhc3NfZGF5ICs9ICggZGF0ZS5nZXRNb250aCgpICsgMSApICsgJy0nXHJcblx0XHRcdHNxbF9jbGFzc19kYXkgKz0gKCBkYXRlLmdldERhdGUoKSA8IDEwICkgPyAnMCcgOiAnJztcclxuXHRcdFx0c3FsX2NsYXNzX2RheSArPSBkYXRlLmdldERhdGUoKTtcclxuXHJcblx0XHRcdHJldHVybiBzcWxfY2xhc3NfZGF5O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0IEpTIERhdGUgZnJvbSAgdGhlIFNRTCBkYXRlIGZvcm1hdCAnMjAyNC0wNS0xNCdcclxuXHQgKiBAcGFyYW0gc3FsX2NsYXNzX2RhdGVcclxuXHQgKiBAcmV0dXJucyB7RGF0ZX1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX19nZXRfX2pzX2RhdGUoIHNxbF9jbGFzc19kYXRlICl7XHJcblxyXG5cdFx0dmFyIHNxbF9jbGFzc19kYXRlX2FyciA9IHNxbF9jbGFzc19kYXRlLnNwbGl0KCAnLScgKTtcclxuXHJcblx0XHR2YXIgZGF0ZV9qcyA9IG5ldyBEYXRlKCk7XHJcblxyXG5cdFx0ZGF0ZV9qcy5zZXRGdWxsWWVhciggcGFyc2VJbnQoIHNxbF9jbGFzc19kYXRlX2FyclsgMCBdICksIChwYXJzZUludCggc3FsX2NsYXNzX2RhdGVfYXJyWyAxIF0gKSAtIDEpLCBwYXJzZUludCggc3FsX2NsYXNzX2RhdGVfYXJyWyAyIF0gKSApOyAgLy8geWVhciwgbW9udGgsIGRhdGVcclxuXHJcblx0XHQvLyBXaXRob3V0IHRoaXMgdGltZSBhZGp1c3QgRGF0ZXMgc2VsZWN0aW9uICBpbiBEYXRlcGlja2VyIGNhbiBub3Qgd29yayEhIVxyXG5cdFx0ZGF0ZV9qcy5zZXRIb3VycygwKTtcclxuXHRcdGRhdGVfanMuc2V0TWludXRlcygwKTtcclxuXHRcdGRhdGVfanMuc2V0U2Vjb25kcygwKTtcclxuXHRcdGRhdGVfanMuc2V0TWlsbGlzZWNvbmRzKDApO1xyXG5cclxuXHRcdHJldHVybiBkYXRlX2pzO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0IFREIENsYXNzIERhdGUgJzEtMzEtMjAyMycgZnJvbSAgSlMgRGF0ZVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIGRhdGVcdFx0XHRcdEpTIERhdGVcclxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVx0XHQnMS0zMS0yMDIzJ1xyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfX2dldF9fdGRfY2xhc3NfZGF0ZSggZGF0ZSApe1xyXG5cclxuXHRcdHZhciB0ZF9jbGFzc19kYXkgPSAoZGF0ZS5nZXRNb250aCgpICsgMSkgKyAnLScgKyBkYXRlLmdldERhdGUoKSArICctJyArIGRhdGUuZ2V0RnVsbFllYXIoKTtcdFx0XHRcdFx0XHRcdFx0Ly8gJzEtOS0yMDIzJ1xyXG5cclxuXHRcdHJldHVybiB0ZF9jbGFzc19kYXk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXQgZGF0ZSBwYXJhbXMgZnJvbSAgc3RyaW5nIGRhdGVcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBkYXRlXHRcdFx0c3RyaW5nIGRhdGUgbGlrZSAnMzEuNS4yMDIzJ1xyXG5cdCAqIEBwYXJhbSBzZXBhcmF0b3JcdFx0ZGVmYXVsdCAnLicgIGNhbiBiZSBza2lwcGVkLlxyXG5cdCAqIEByZXR1cm5zIHsgIHtkYXRlOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIHllYXI6IG51bWJlcn0gIH1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX19nZXRfX2RhdGVfcGFyYW1zX19mcm9tX3N0cmluZ19kYXRlKCBkYXRlICwgc2VwYXJhdG9yKXtcclxuXHJcblx0XHRzZXBhcmF0b3IgPSAoICd1bmRlZmluZWQnICE9PSB0eXBlb2YgKHNlcGFyYXRvcikgKSA/IHNlcGFyYXRvciA6ICcuJztcclxuXHJcblx0XHR2YXIgZGF0ZV9hcnIgPSBkYXRlLnNwbGl0KCBzZXBhcmF0b3IgKTtcclxuXHRcdHZhciBkYXRlX29iaiA9IHtcclxuXHRcdFx0J3llYXInIDogIHBhcnNlSW50KCBkYXRlX2FyclsgMiBdICksXHJcblx0XHRcdCdtb250aCc6IChwYXJzZUludCggZGF0ZV9hcnJbIDEgXSApIC0gMSksXHJcblx0XHRcdCdkYXRlJyA6ICBwYXJzZUludCggZGF0ZV9hcnJbIDAgXSApXHJcblx0XHR9O1xyXG5cdFx0cmV0dXJuIGRhdGVfb2JqO1x0XHQvLyBmb3IgXHRcdCA9IG5ldyBEYXRlKCBkYXRlX29iai55ZWFyICwgZGF0ZV9vYmoubW9udGggLCBkYXRlX29iai5kYXRlICk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGQgU3BpbiBMb2FkZXIgdG8gIGNhbGVuZGFyXHJcblx0ICogQHBhcmFtIHJlc291cmNlX2lkXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19jYWxlbmRhcl9fbG9hZGluZ19fc3RhcnQoIHJlc291cmNlX2lkICl7XHJcblx0XHRpZiAoICEgalF1ZXJ5KCAnI2NhbGVuZGFyX2Jvb2tpbmcnICsgcmVzb3VyY2VfaWQgKS5uZXh0KCkuaGFzQ2xhc3MoICd3cGJjX3NwaW5zX2xvYWRlcl93cmFwcGVyJyApICl7XHJcblx0XHRcdGpRdWVyeSggJyNjYWxlbmRhcl9ib29raW5nJyArIHJlc291cmNlX2lkICkuYWZ0ZXIoICc8ZGl2IGNsYXNzPVwid3BiY19zcGluc19sb2FkZXJfd3JhcHBlclwiPjxkaXYgY2xhc3M9XCJ3cGJjX3NwaW5fbG9hZGVyX29uZV9uZXdcIj48L2Rpdj48L2Rpdj4nICk7XHJcblx0XHR9XHJcblx0XHRpZiAoICEgalF1ZXJ5KCAnI2NhbGVuZGFyX2Jvb2tpbmcnICsgcmVzb3VyY2VfaWQgKS5oYXNDbGFzcyggJ3dwYmNfY2FsZW5kYXJfYmx1cl9zbWFsbCcgKSApe1xyXG5cdFx0XHRqUXVlcnkoICcjY2FsZW5kYXJfYm9va2luZycgKyByZXNvdXJjZV9pZCApLmFkZENsYXNzKCAnd3BiY19jYWxlbmRhcl9ibHVyX3NtYWxsJyApO1xyXG5cdFx0fVxyXG5cdFx0d3BiY19jYWxlbmRhcl9fYmx1cl9fc3RhcnQoIHJlc291cmNlX2lkICk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmUgU3BpbiBMb2FkZXIgdG8gIGNhbGVuZGFyXHJcblx0ICogQHBhcmFtIHJlc291cmNlX2lkXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19jYWxlbmRhcl9fbG9hZGluZ19fc3RvcCggcmVzb3VyY2VfaWQgKXtcclxuXHRcdGpRdWVyeSggJyNjYWxlbmRhcl9ib29raW5nJyArIHJlc291cmNlX2lkICsgJyArIC53cGJjX3NwaW5zX2xvYWRlcl93cmFwcGVyJyApLnJlbW92ZSgpO1xyXG5cdFx0alF1ZXJ5KCAnI2NhbGVuZGFyX2Jvb2tpbmcnICsgcmVzb3VyY2VfaWQgKS5yZW1vdmVDbGFzcyggJ3dwYmNfY2FsZW5kYXJfYmx1cl9zbWFsbCcgKTtcclxuXHRcdHdwYmNfY2FsZW5kYXJfX2JsdXJfX3N0b3AoIHJlc291cmNlX2lkICk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGQgQmx1ciB0byAgY2FsZW5kYXJcclxuXHQgKiBAcGFyYW0gcmVzb3VyY2VfaWRcclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2NhbGVuZGFyX19ibHVyX19zdGFydCggcmVzb3VyY2VfaWQgKXtcclxuXHRcdGlmICggISBqUXVlcnkoICcjY2FsZW5kYXJfYm9va2luZycgKyByZXNvdXJjZV9pZCApLmhhc0NsYXNzKCAnd3BiY19jYWxlbmRhcl9ibHVyJyApICl7XHJcblx0XHRcdGpRdWVyeSggJyNjYWxlbmRhcl9ib29raW5nJyArIHJlc291cmNlX2lkICkuYWRkQ2xhc3MoICd3cGJjX2NhbGVuZGFyX2JsdXInICk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmUgQmx1ciBpbiAgY2FsZW5kYXJcclxuXHQgKiBAcGFyYW0gcmVzb3VyY2VfaWRcclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2NhbGVuZGFyX19ibHVyX19zdG9wKCByZXNvdXJjZV9pZCApe1xyXG5cdFx0alF1ZXJ5KCAnI2NhbGVuZGFyX2Jvb2tpbmcnICsgcmVzb3VyY2VfaWQgKS5yZW1vdmVDbGFzcyggJ3dwYmNfY2FsZW5kYXJfYmx1cicgKTtcclxuXHR9XHJcblxyXG5cclxuXHQvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxyXG5cdC8qICA9PSAgQ2FsZW5kYXIgVXBkYXRlICAtIFZpZXcgID09XHJcblx0Ly8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi9cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlIGxvb2sgb2YgY2FsZW5kYXIgKHNhZmUpLlxyXG5cdCAqXHJcblx0ICogSW4gRWxlbWVudG9yIHByZXZpZXcgdGhlIERPTSBjYW4gYmUgcmUtcmVuZGVyZWQsIHNvIHRoZSBjYWxlbmRhciBlbGVtZW50IG1heSBleGlzdFxyXG5cdCAqIHdoaWxlIHRoZSBEYXRlcGljayBpbnN0YW5jZSBpcyBtaXNzaW5nLiBJbiB0aGF0IGNhc2UgdHJ5IHRvIChyZSlpbml0aWFsaXplLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtpbnR8c3RyaW5nfSByZXNvdXJjZV9pZFxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdXBkYXRlZCwgZmFsc2UgaWYgbm90IHBvc3NpYmxlXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19jYWxlbmRhcl9fdXBkYXRlX2xvb2socmVzb3VyY2VfaWQpIHtcclxuXHJcblx0XHR2YXIgaW5zdCA9IHdwYmNfY2FsZW5kYXJfX2dldF9pbnN0KCByZXNvdXJjZV9pZCApO1xyXG5cclxuXHRcdC8vIElmIGluc3RhbmNlIG1pc3NpbmcsIHRyeSB0byByZS1pbml0IGNhbGVuZGFyIG9uY2UuXHJcblx0XHRpZiAoIG51bGwgPT09IGluc3QgKSB7XHJcblxyXG5cdFx0XHR2YXIganFfY2FsID0galF1ZXJ5KCAnI2NhbGVuZGFyX2Jvb2tpbmcnICsgcmVzb3VyY2VfaWQgKTtcclxuXHJcblx0XHRcdGlmICgganFfY2FsLmxlbmd0aCAmJiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHdwYmNfY2FsZW5kYXJfc2hvdykgKSB7XHJcblxyXG5cdFx0XHRcdC8vIEVsZW1lbnRvciBzb21ldGltZXMgbGVhdmVzIHN0YWxlIGNsYXNzIHdpdGhvdXQgcmVhbCBpbnN0YW5jZS5cclxuXHRcdFx0XHRpZiAoIGpxX2NhbC5oYXNDbGFzcyggJ2hhc0RhdGVwaWNrJyApICkge1xyXG5cdFx0XHRcdFx0anFfY2FsLnJlbW92ZUNsYXNzKCAnaGFzRGF0ZXBpY2snICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBUcnkgdG8gaW5pdCBkYXRlcGljayBtYXJrdXAgbm93LlxyXG5cdFx0XHRcdHdwYmNfY2FsZW5kYXJfc2hvdyggcmVzb3VyY2VfaWQgKTtcclxuXHJcblx0XHRcdFx0Ly8gVHJ5IGFnYWluLlxyXG5cdFx0XHRcdGluc3QgPSB3cGJjX2NhbGVuZGFyX19nZXRfaW5zdCggcmVzb3VyY2VfaWQgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFN0aWxsIG5vIGluc3RhbmNlIC0+IGRvIG5vdCBjcmFzaCB0aGUgd2hvbGUgYWpheCBmbG93LlxyXG5cdFx0aWYgKCBudWxsID09PSBpbnN0ICkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0alF1ZXJ5LmRhdGVwaWNrLl91cGRhdGVEYXRlcGljayggaW5zdCApO1xyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZSBkeW5hbWljYWxseSBOdW1iZXIgb2YgTW9udGhzIGluIGNhbGVuZGFyXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gcmVzb3VyY2VfaWQgaW50XHJcblx0ICogQHBhcmFtIG1vbnRoc19udW1iZXIgaW50XHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19jYWxlbmRhcl9fdXBkYXRlX21vbnRoc19udW1iZXIoIHJlc291cmNlX2lkLCBtb250aHNfbnVtYmVyICl7XHJcblx0XHR2YXIgaW5zdCA9IHdwYmNfY2FsZW5kYXJfX2dldF9pbnN0KCByZXNvdXJjZV9pZCApO1xyXG5cdFx0aWYgKCBudWxsICE9PSBpbnN0ICl7XHJcblx0XHRcdGluc3Quc2V0dGluZ3NbICdudW1iZXJPZk1vbnRocycgXSA9IG1vbnRoc19udW1iZXI7XHJcblx0XHRcdC8vX3dwYmMuY2FsZW5kYXJfX3NldF9wYXJhbV92YWx1ZSggcmVzb3VyY2VfaWQsICdjYWxlbmRhcl9udW1iZXJfb2ZfbW9udGhzJywgbW9udGhzX251bWJlciApO1xyXG5cdFx0XHR3cGJjX2NhbGVuZGFyX191cGRhdGVfbG9vayggcmVzb3VyY2VfaWQgKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBTaG93IGNhbGVuZGFyIGluICBkaWZmZXJlbnQgU2tpblxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHNlbGVjdGVkX3NraW5fdXJsXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19fY2FsZW5kYXJfX2NoYW5nZV9za2luKCBzZWxlY3RlZF9za2luX3VybCApe1xyXG5cclxuXHQvL2NvbnNvbGUubG9nKCAnU0tJTiBTRUxFQ1RJT04gOjonLCBzZWxlY3RlZF9za2luX3VybCApO1xyXG5cclxuXHRcdC8vIFJlbW92ZSBDU1Mgc2tpblxyXG5cdFx0dmFyIHN0eWxlc2hlZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3dwYmMtY2FsZW5kYXItc2tpbi1jc3MnICk7XHJcblx0XHRzdHlsZXNoZWV0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHN0eWxlc2hlZXQgKTtcclxuXHJcblxyXG5cdFx0Ly8gQWRkIG5ldyBDU1Mgc2tpblxyXG5cdFx0dmFyIGhlYWRJRCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcImhlYWRcIiApWyAwIF07XHJcblx0XHR2YXIgY3NzTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdsaW5rJyApO1xyXG5cdFx0Y3NzTm9kZS50eXBlID0gJ3RleHQvY3NzJztcclxuXHRcdGNzc05vZGUuc2V0QXR0cmlidXRlKCBcImlkXCIsIFwid3BiYy1jYWxlbmRhci1za2luLWNzc1wiICk7XHJcblx0XHRjc3NOb2RlLnJlbCA9ICdzdHlsZXNoZWV0JztcclxuXHRcdGNzc05vZGUubWVkaWEgPSAnc2NyZWVuJztcclxuXHRcdGNzc05vZGUuaHJlZiA9IHNlbGVjdGVkX3NraW5fdXJsO1x0Ly9cImh0dHA6Ly9iZXRhL3dwLWNvbnRlbnQvcGx1Z2lucy9ib29raW5nL2Nzcy9za2lucy9ncmVlbi0wMS5jc3NcIjtcclxuXHRcdGhlYWRJRC5hcHBlbmRDaGlsZCggY3NzTm9kZSApO1xyXG5cdH1cclxuXHJcblxyXG5cdGZ1bmN0aW9uIHdwYmNfX2Nzc19fY2hhbmdlX3NraW4oIHNlbGVjdGVkX3NraW5fdXJsLCBzdHlsZXNoZWV0X2lkID0gJ3dwYmMtdGltZV9waWNrZXItc2tpbi1jc3MnICl7XHJcblxyXG5cdFx0Ly8gUmVtb3ZlIENTUyBza2luXHJcblx0XHR2YXIgc3R5bGVzaGVldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBzdHlsZXNoZWV0X2lkICk7XHJcblx0XHRzdHlsZXNoZWV0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHN0eWxlc2hlZXQgKTtcclxuXHJcblxyXG5cdFx0Ly8gQWRkIG5ldyBDU1Mgc2tpblxyXG5cdFx0dmFyIGhlYWRJRCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcImhlYWRcIiApWyAwIF07XHJcblx0XHR2YXIgY3NzTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdsaW5rJyApO1xyXG5cdFx0Y3NzTm9kZS50eXBlID0gJ3RleHQvY3NzJztcclxuXHRcdGNzc05vZGUuc2V0QXR0cmlidXRlKCBcImlkXCIsIHN0eWxlc2hlZXRfaWQgKTtcclxuXHRcdGNzc05vZGUucmVsID0gJ3N0eWxlc2hlZXQnO1xyXG5cdFx0Y3NzTm9kZS5tZWRpYSA9ICdzY3JlZW4nO1xyXG5cdFx0Y3NzTm9kZS5ocmVmID0gc2VsZWN0ZWRfc2tpbl91cmw7XHQvL1wiaHR0cDovL2JldGEvd3AtY29udGVudC9wbHVnaW5zL2Jvb2tpbmcvY3NzL3NraW5zL2dyZWVuLTAxLmNzc1wiO1xyXG5cdFx0aGVhZElELmFwcGVuZENoaWxkKCBjc3NOb2RlICk7XHJcblx0fVxyXG5cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vKiAgPT0gIFMgVSBQIFAgTyBSIFQgICAgTSBBIFQgSCAgPT1cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBNZXJnZSBzZXZlcmFsICBpbnRlcnNlY3RlZCBpbnRlcnZhbHMgb3IgcmV0dXJuIG5vdCBpbnRlcnNlY3RlZDpcclxuXHRcdCAqIFtbMSwzXSxbMiw2XSxbOCwxMF0sWzE1LDE4XV0gIC0+ICAgW1sxLDZdLFs4LDEwXSxbMTUsMThdXVxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSBbXSBpbnRlcnZhbHNcdFx0XHQgWyBbMSwzXSxbMiw0XSxbNiw4XSxbOSwxMF0sWzMsN10gXVxyXG5cdFx0ICogQHJldHVybnMgW11cdFx0XHRcdFx0IFsgWzEsOF0sWzksMTBdIF1cclxuXHRcdCAqXHJcblx0XHQgKiBFeG1hbXBsZTogd3BiY19pbnRlcnZhbHNfX21lcmdlX2luZXJzZWN0ZWQoICBbIFsxLDNdLFsyLDRdLFs2LDhdLFs5LDEwXSxbMyw3XSBdICApO1xyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiB3cGJjX2ludGVydmFsc19fbWVyZ2VfaW5lcnNlY3RlZCggaW50ZXJ2YWxzICl7XHJcblxyXG5cdFx0XHRpZiAoICEgaW50ZXJ2YWxzIHx8IGludGVydmFscy5sZW5ndGggPT09IDAgKXtcclxuXHRcdFx0XHRyZXR1cm4gW107XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciBtZXJnZWQgPSBbXTtcclxuXHRcdFx0aW50ZXJ2YWxzLnNvcnQoIGZ1bmN0aW9uICggYSwgYiApe1xyXG5cdFx0XHRcdHJldHVybiBhWyAwIF0gLSBiWyAwIF07XHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHZhciBtZXJnZWRJbnRlcnZhbCA9IGludGVydmFsc1sgMCBdO1xyXG5cclxuXHRcdFx0Zm9yICggdmFyIGkgPSAxOyBpIDwgaW50ZXJ2YWxzLmxlbmd0aDsgaSsrICl7XHJcblx0XHRcdFx0dmFyIGludGVydmFsID0gaW50ZXJ2YWxzWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggaW50ZXJ2YWxbIDAgXSA8PSBtZXJnZWRJbnRlcnZhbFsgMSBdICl7XHJcblx0XHRcdFx0XHRtZXJnZWRJbnRlcnZhbFsgMSBdID0gTWF0aC5tYXgoIG1lcmdlZEludGVydmFsWyAxIF0sIGludGVydmFsWyAxIF0gKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0bWVyZ2VkLnB1c2goIG1lcmdlZEludGVydmFsICk7XHJcblx0XHRcdFx0XHRtZXJnZWRJbnRlcnZhbCA9IGludGVydmFsO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bWVyZ2VkLnB1c2goIG1lcmdlZEludGVydmFsICk7XHJcblx0XHRcdHJldHVybiBtZXJnZWQ7XHJcblx0XHR9XHJcblxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSXMgMiBpbnRlcnZhbHMgaW50ZXJzZWN0ZWQ6ICAgICAgIFszNjAxMSwgODYzOTJdICAgIDw9PiAgICBbMSwgNDMxOTJdICA9PiAgdHJ1ZSAgICAgICggaW50ZXJzZWN0ZWQgKVxyXG5cdFx0ICpcclxuXHRcdCAqIEdvb2QgZXhwbGFuYXRpb24gIGhlcmVcclxuXHRcdCAqIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzMyNjk0MzQvd2hhdHMtdGhlLW1vc3QtZWZmaWNpZW50LXdheS10by10ZXN0LWlmLXR3by1yYW5nZXMtb3ZlcmxhcFxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSAgaW50ZXJ2YWxfQSAgIC0gWyAzNjAxMSwgODYzOTIgXVxyXG5cdFx0ICogQHBhcmFtICBpbnRlcnZhbF9CICAgLSBbICAgICAxLCA0MzE5MiBdXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiBib29sXHJcblx0XHQgKi9cclxuXHRcdGZ1bmN0aW9uIHdwYmNfaW50ZXJ2YWxzX19pc19pbnRlcnNlY3RlZCggaW50ZXJ2YWxfQSwgaW50ZXJ2YWxfQiApIHtcclxuXHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRcdCggMCA9PSBpbnRlcnZhbF9BLmxlbmd0aCApXHJcblx0XHRcdFx0IHx8ICggMCA9PSBpbnRlcnZhbF9CLmxlbmd0aCApXHJcblx0XHRcdCl7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpbnRlcnZhbF9BWyAwIF0gPSBwYXJzZUludCggaW50ZXJ2YWxfQVsgMCBdICk7XHJcblx0XHRcdGludGVydmFsX0FbIDEgXSA9IHBhcnNlSW50KCBpbnRlcnZhbF9BWyAxIF0gKTtcclxuXHRcdFx0aW50ZXJ2YWxfQlsgMCBdID0gcGFyc2VJbnQoIGludGVydmFsX0JbIDAgXSApO1xyXG5cdFx0XHRpbnRlcnZhbF9CWyAxIF0gPSBwYXJzZUludCggaW50ZXJ2YWxfQlsgMSBdICk7XHJcblxyXG5cdFx0XHR2YXIgaXNfaW50ZXJzZWN0ZWQgPSBNYXRoLm1heCggaW50ZXJ2YWxfQVsgMCBdLCBpbnRlcnZhbF9CWyAwIF0gKSAtIE1hdGgubWluKCBpbnRlcnZhbF9BWyAxIF0sIGludGVydmFsX0JbIDEgXSApO1xyXG5cclxuXHRcdFx0Ly8gaWYgKCAwID09IGlzX2ludGVyc2VjdGVkICkge1xyXG5cdFx0XHQvL1x0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VjaCByYW5nZXMgZ29pbmcgb25lIGFmdGVyIG90aGVyLCBlLmcuOiBbIDEyLCAxNSBdIGFuZCBbIDE1LCAyMSBdXHJcblx0XHRcdC8vIH1cclxuXHJcblx0XHRcdGlmICggaXNfaW50ZXJzZWN0ZWQgPCAwICkge1xyXG5cdFx0XHRcdHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgIC8vIElOVEVSU0VDVEVEXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCBpbnRlcnNlY3RlZFxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEdldCB0aGUgY2xvc2V0cyBBQlMgdmFsdWUgb2YgZWxlbWVudCBpbiBhcnJheSB0byB0aGUgY3VycmVudCBteVZhbHVlXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIG15VmFsdWUgXHQtIGludCBlbGVtZW50IHRvIHNlYXJjaCBjbG9zZXQgXHRcdFx0NFxyXG5cdFx0ICogQHBhcmFtIG15QXJyYXlcdC0gYXJyYXkgb2YgZWxlbWVudHMgd2hlcmUgdG8gc2VhcmNoIFx0WzUsOCwxLDddXHJcblx0XHQgKiBAcmV0dXJucyBpbnRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ1XHJcblx0XHQgKi9cclxuXHRcdGZ1bmN0aW9uIHdwYmNfZ2V0X2Fic19jbG9zZXN0X3ZhbHVlX2luX2FyciggbXlWYWx1ZSwgbXlBcnJheSApe1xyXG5cclxuXHRcdFx0aWYgKCBteUFycmF5Lmxlbmd0aCA9PSAwICl7IFx0XHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgYXJyYXkgaXMgZW1wdHkgLT4gcmV0dXJuICB0aGUgbXlWYWx1ZVxyXG5cdFx0XHRcdHJldHVybiBteVZhbHVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgb2JqID0gbXlBcnJheVsgMCBdO1xyXG5cdFx0XHR2YXIgZGlmZiA9IE1hdGguYWJzKCBteVZhbHVlIC0gb2JqICk7ICAgICAgICAgICAgIFx0Ly8gR2V0IGRpc3RhbmNlIGJldHdlZW4gIDFzdCBlbGVtZW50XHJcblx0XHRcdHZhciBjbG9zZXRWYWx1ZSA9IG15QXJyYXlbIDAgXTsgICAgICAgICAgICAgICAgICAgXHRcdFx0Ly8gU2F2ZSAxc3QgZWxlbWVudFxyXG5cclxuXHRcdFx0Zm9yICggdmFyIGkgPSAxOyBpIDwgbXlBcnJheS5sZW5ndGg7IGkrKyApe1xyXG5cdFx0XHRcdG9iaiA9IG15QXJyYXlbIGkgXTtcclxuXHJcblx0XHRcdFx0aWYgKCBNYXRoLmFicyggbXlWYWx1ZSAtIG9iaiApIDwgZGlmZiApeyAgICAgXHRcdFx0Ly8gd2UgZm91bmQgY2xvc2VyIHZhbHVlIC0+IHNhdmUgaXRcclxuXHRcdFx0XHRcdGRpZmYgPSBNYXRoLmFicyggbXlWYWx1ZSAtIG9iaiApO1xyXG5cdFx0XHRcdFx0Y2xvc2V0VmFsdWUgPSBvYmo7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gY2xvc2V0VmFsdWU7XHJcblx0XHR9XHJcblxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8qICA9PSAgVCBPIE8gTCBUIEkgUCBTICA9PVxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lIHRvb2x0aXAgdG8gc2hvdywgIHdoZW4gIG1vdXNlIG92ZXIgRGF0ZSBpbiBDYWxlbmRhclxyXG5cdCAqXHJcblx0ICogQHBhcmFtICB0b29sdGlwX3RleHRcdFx0XHQtIFRleHQgdG8gc2hvd1x0XHRcdFx0J0Jvb2tlZCB0aW1lOiAxMjowMCAtIDEzOjAwPGJyPkNvc3Q6ICQyMC4wMCdcclxuXHQgKiBAcGFyYW0gIHJlc291cmNlX2lkXHRcdFx0LSBJRCBvZiBib29raW5nIHJlc291cmNlXHQnMSdcclxuXHQgKiBAcGFyYW0gIHRkX2NsYXNzXHRcdFx0XHQtIFNRTCBjbGFzc1x0XHRcdFx0XHQnMS05LTIwMjMnXHJcblx0ICogQHJldHVybnMge2Jvb2xlYW59XHRcdFx0XHRcdC0gZGVmaW5lZCB0byBzaG93IG9yIG5vdFxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfc2V0X3Rvb2x0aXBfX19mb3JfX2NhbGVuZGFyX2RhdGUoIHRvb2x0aXBfdGV4dCwgcmVzb3VyY2VfaWQsIHRkX2NsYXNzICl7XHJcblxyXG5cdFx0Ly9UT0RPOiBtYWtlIGVzY2FwaW5nIG9mIHRleHQgZm9yIHF1b3Qgc3ltYm9scywgIGFuZCBKUy9IVE1MLi4uXHJcblxyXG5cdFx0alF1ZXJ5KCAnI2NhbGVuZGFyX2Jvb2tpbmcnICsgcmVzb3VyY2VfaWQgKyAnIHRkLmNhbDRkYXRlLScgKyB0ZF9jbGFzcyApLmF0dHIoICdkYXRhLWNvbnRlbnQnLCB0b29sdGlwX3RleHQgKTtcclxuXHJcblx0XHR2YXIgdGRfZWwgPSBqUXVlcnkoICcjY2FsZW5kYXJfYm9va2luZycgKyByZXNvdXJjZV9pZCArICcgdGQuY2FsNGRhdGUtJyArIHRkX2NsYXNzICkuZ2V0KCAwICk7XHRcdFx0XHRcdC8vIEZpeEluOiA5LjAuMS4xLlxyXG5cclxuXHRcdGlmIChcclxuXHRcdFx0ICAgKCAndW5kZWZpbmVkJyAhPT0gdHlwZW9mKHRkX2VsKSApXHJcblx0XHRcdCYmICggdW5kZWZpbmVkID09IHRkX2VsLl90aXBweSApXHJcblx0XHRcdCYmICggJycgIT09IHRvb2x0aXBfdGV4dCApXHJcblx0XHQpe1xyXG5cclxuXHRcdFx0d3BiY190aXBweSggdGRfZWwgLCB7XHJcblx0XHRcdFx0XHRjb250ZW50KCByZWZlcmVuY2UgKXtcclxuXHJcblx0XHRcdFx0XHRcdHZhciBwb3BvdmVyX2NvbnRlbnQgPSByZWZlcmVuY2UuZ2V0QXR0cmlidXRlKCAnZGF0YS1jb250ZW50JyApO1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuICc8ZGl2IGNsYXNzPVwicG9wb3ZlciBwb3BvdmVyX3RpcHB5XCI+J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQrICc8ZGl2IGNsYXNzPVwicG9wb3Zlci1jb250ZW50XCI+J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsgcG9wb3Zlcl9jb250ZW50XHJcblx0XHRcdFx0XHRcdFx0XHRcdCsgJzwvZGl2PidcclxuXHRcdFx0XHRcdFx0XHQgKyAnPC9kaXY+JztcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRhbGxvd0hUTUwgICAgICAgIDogdHJ1ZSxcclxuXHRcdFx0XHRcdHRyaWdnZXJcdFx0XHQgOiAnbW91c2VlbnRlciBmb2N1cycsXHJcblx0XHRcdFx0XHRpbnRlcmFjdGl2ZSAgICAgIDogZmFsc2UsXHJcblx0XHRcdFx0XHRoaWRlT25DbGljayAgICAgIDogdHJ1ZSxcclxuXHRcdFx0XHRcdGludGVyYWN0aXZlQm9yZGVyOiAxMCxcclxuXHRcdFx0XHRcdG1heFdpZHRoICAgICAgICAgOiA1NTAsXHJcblx0XHRcdFx0XHR0aGVtZSAgICAgICAgICAgIDogJ3dwYmMtdGlwcHktdGltZXMnLFxyXG5cdFx0XHRcdFx0cGxhY2VtZW50ICAgICAgICA6ICd0b3AnLFxyXG5cdFx0XHRcdFx0ZGVsYXlcdFx0XHQgOiBbNDAwLCAwXSxcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBGaXhJbjogOS40LjIuMi5cclxuXHRcdFx0XHRcdC8vZGVsYXlcdFx0XHQgOiBbMCwgOTk5OTk5OTk5OV0sXHRcdFx0XHRcdFx0Ly8gRGVidWdlICB0b29sdGlwXHJcblx0XHRcdFx0XHRpZ25vcmVBdHRyaWJ1dGVzIDogdHJ1ZSxcclxuXHRcdFx0XHRcdHRvdWNoXHRcdFx0IDogdHJ1ZSxcdFx0XHRcdFx0XHRcdFx0Ly9bJ2hvbGQnLCA1MDBdLCAvLyA1MDBtcyBkZWxheVx0XHRcdFx0Ly8gRml4SW46IDkuMi4xLjUuXHJcblx0XHRcdFx0XHRhcHBlbmRUbzogKCkgPT4gZG9jdW1lbnQuYm9keSxcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRyZXR1cm4gIHRydWU7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuICBmYWxzZTtcclxuXHR9XHJcblxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8qICA9PSAgRGF0ZXMgRnVuY3Rpb25zICA9PVxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuXHJcbi8qKlxyXG4gKiBHZXQgbnVtYmVyIG9mIGRhdGVzIGJldHdlZW4gMiBKUyBEYXRlc1xyXG4gKlxyXG4gKiBAcGFyYW0gZGF0ZTFcdFx0SlMgRGF0ZVxyXG4gKiBAcGFyYW0gZGF0ZTJcdFx0SlMgRGF0ZVxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19kYXRlc19fZGF5c19iZXR3ZWVuKGRhdGUxLCBkYXRlMikge1xyXG5cclxuICAgIC8vIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGluIG9uZSBkYXlcclxuICAgIHZhciBPTkVfREFZID0gMTAwMCAqIDYwICogNjAgKiAyNDtcclxuXHJcbiAgICAvLyBDb252ZXJ0IGJvdGggZGF0ZXMgdG8gbWlsbGlzZWNvbmRzXHJcbiAgICB2YXIgZGF0ZTFfbXMgPSBkYXRlMS5nZXRUaW1lKCk7XHJcbiAgICB2YXIgZGF0ZTJfbXMgPSBkYXRlMi5nZXRUaW1lKCk7XHJcblxyXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIGluIG1pbGxpc2Vjb25kc1xyXG4gICAgdmFyIGRpZmZlcmVuY2VfbXMgPSAgZGF0ZTFfbXMgLSBkYXRlMl9tcztcclxuXHJcbiAgICAvLyBDb252ZXJ0IGJhY2sgdG8gZGF5cyBhbmQgcmV0dXJuXHJcbiAgICByZXR1cm4gTWF0aC5yb3VuZChkaWZmZXJlbmNlX21zL09ORV9EQVkpO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIENoZWNrICBpZiB0aGlzIGFycmF5ICBvZiBkYXRlcyBpcyBjb25zZWN1dGl2ZSBhcnJheSAgb2YgZGF0ZXMgb3Igbm90LlxyXG4gKiBcdFx0ZS5nLiAgWycyMDI0LTA1LTA5JywnMjAyNC0wNS0xOScsJzIwMjQtMDUtMzAnXSAtPiBmYWxzZVxyXG4gKiBcdFx0ZS5nLiAgWycyMDI0LTA1LTA5JywnMjAyNC0wNS0xMCcsJzIwMjQtMDUtMTEnXSAtPiB0cnVlXHJcbiAqIEBwYXJhbSBzcWxfZGF0ZXNfYXJyXHQgYXJyYXlcdFx0ZS5nLjogWycyMDI0LTA1LTA5JywnMjAyNC0wNS0xOScsJzIwMjQtMDUtMzAnXVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfZGF0ZXNfX2lzX2NvbnNlY3V0aXZlX2RhdGVzX2Fycl9yYW5nZSggc3FsX2RhdGVzX2FyciApe1x0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRml4SW46IDEwLjAuMC41MC5cclxuXHJcblx0aWYgKCBzcWxfZGF0ZXNfYXJyLmxlbmd0aCA+IDEgKXtcclxuXHRcdHZhciBwcmV2aW9zX2RhdGUgPSB3cGJjX19nZXRfX2pzX2RhdGUoIHNxbF9kYXRlc19hcnJbIDAgXSApO1xyXG5cdFx0dmFyIGN1cnJlbnRfZGF0ZTtcclxuXHJcblx0XHRmb3IgKCB2YXIgaSA9IDE7IGkgPCBzcWxfZGF0ZXNfYXJyLmxlbmd0aDsgaSsrICl7XHJcblx0XHRcdGN1cnJlbnRfZGF0ZSA9IHdwYmNfX2dldF9fanNfZGF0ZSggc3FsX2RhdGVzX2FycltpXSApO1xyXG5cclxuXHRcdFx0aWYgKCB3cGJjX2RhdGVzX19kYXlzX2JldHdlZW4oIGN1cnJlbnRfZGF0ZSwgcHJldmlvc19kYXRlICkgIT0gMSApe1xyXG5cdFx0XHRcdHJldHVybiAgZmFsc2U7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHByZXZpb3NfZGF0ZSA9IGN1cnJlbnRfZGF0ZTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHJldHVybiB0cnVlO1xyXG59XHJcblxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8qICA9PSAgQXV0byBEYXRlcyBTZWxlY3Rpb24gID09XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuLyoqXHJcbiAqICA9PSBIb3cgdG8gIHVzZSA/ID09XHJcbiAqXHJcbiAqICBGb3IgRGF0ZXMgc2VsZWN0aW9uLCB3ZSBuZWVkIHRvIHVzZSB0aGlzIGxvZ2ljISAgICAgV2UgbmVlZCBzZWxlY3QgdGhlIGRhdGVzIG9ubHkgYWZ0ZXIgYm9va2luZyBkYXRhIGxvYWRlZCFcclxuICpcclxuICogIENoZWNrIGV4YW1wbGUgYmVsbG93LlxyXG4gKlxyXG4gKlx0Ly8gRmlyZSBvbiBhbGwgYm9va2luZyBkYXRlcyBsb2FkZWRcclxuICpcdGpRdWVyeSggJ2JvZHknICkub24oICd3cGJjX2NhbGVuZGFyX2FqeF9fbG9hZGVkX2RhdGEnLCBmdW5jdGlvbiAoIGV2ZW50LCBsb2FkZWRfcmVzb3VyY2VfaWQgKXtcclxuICpcclxuICpcdFx0aWYgKCBsb2FkZWRfcmVzb3VyY2VfaWQgPT0gc2VsZWN0X2RhdGVzX2luX2NhbGVuZGFyX2lkICl7XHJcbiAqXHRcdFx0d3BiY19hdXRvX3NlbGVjdF9kYXRlc19pbl9jYWxlbmRhciggc2VsZWN0X2RhdGVzX2luX2NhbGVuZGFyX2lkLCAnMjAyNC0wNS0xNScsICcyMDI0LTA1LTI1JyApO1xyXG4gKlx0XHR9XHJcbiAqXHR9ICk7XHJcbiAqXHJcbiAqL1xyXG5cclxuXHJcbi8qKlxyXG4gKiBUcnkgdG8gQXV0byBzZWxlY3QgZGF0ZXMgaW4gc3BlY2lmaWMgY2FsZW5kYXIgYnkgc2ltdWxhdGVkIGNsaWNrcyBpbiBkYXRlcGlja2VyXHJcbiAqXHJcbiAqIEBwYXJhbSByZXNvdXJjZV9pZFx0XHQxXHJcbiAqIEBwYXJhbSBjaGVja19pbl95bWRcdFx0JzIwMjQtMDUtMDknXHRcdE9SICBcdFsnMjAyNC0wNS0wOScsJzIwMjQtMDUtMTknLCcyMDI0LTA1LTIwJ11cclxuICogQHBhcmFtIGNoZWNrX291dF95bWRcdFx0JzIwMjQtMDUtMTUnXHRcdE9wdGlvbmFsXHJcbiAqXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XHRcdG51bWJlciBvZiBzZWxlY3RlZCBkYXRlc1xyXG4gKlxyXG4gKiBcdEV4YW1wbGUgMTpcdFx0XHRcdHZhciBudW1fc2VsZWN0ZWRfZGF5cyA9IHdwYmNfYXV0b19zZWxlY3RfZGF0ZXNfaW5fY2FsZW5kYXIoIDEsICcyMDI0LTA1LTE1JyxcclxuICogICAgICcyMDI0LTA1LTI1JyApOyBFeGFtcGxlIDI6XHRcdFx0XHR2YXIgbnVtX3NlbGVjdGVkX2RheXMgPSB3cGJjX2F1dG9fc2VsZWN0X2RhdGVzX2luX2NhbGVuZGFyKCAxLFxyXG4gKiAgICAgWycyMDI0LTA1LTA5JywnMjAyNC0wNS0xOScsJzIwMjQtMDUtMjAnXSApO1xyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19hdXRvX3NlbGVjdF9kYXRlc19pbl9jYWxlbmRhciggcmVzb3VyY2VfaWQsIGNoZWNrX2luX3ltZCwgY2hlY2tfb3V0X3ltZCA9ICcnICl7XHRcdFx0XHRcdFx0XHRcdC8vIEZpeEluOiAxMC4wLjAuNDcuXHJcblxyXG5cdGNvbnNvbGUubG9nKCAnV1BCQ19BVVRPX1NFTEVDVF9EQVRFU19JTl9DQUxFTkRBUiggUkVTT1VSQ0VfSUQsIENIRUNLX0lOX1lNRCwgQ0hFQ0tfT1VUX1lNRCApJywgcmVzb3VyY2VfaWQsIGNoZWNrX2luX3ltZCwgY2hlY2tfb3V0X3ltZCApO1xyXG5cclxuXHRpZiAoXHJcblx0XHQgICAoICcyMTAwLTAxLTAxJyA9PSBjaGVja19pbl95bWQgKVxyXG5cdFx0fHwgKCAnMjEwMC0wMS0wMScgPT0gY2hlY2tfb3V0X3ltZCApXHJcblx0XHR8fCAoICggJycgPT0gY2hlY2tfaW5feW1kICkgJiYgKCAnJyA9PSBjaGVja19vdXRfeW1kICkgKVxyXG5cdCl7XHJcblx0XHRyZXR1cm4gMDtcclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gSWYgXHRjaGVja19pbl95bWQgID0gIFsgJzIwMjQtMDUtMDknLCcyMDI0LTA1LTE5JywnMjAyNC0wNS0zMCcgXVx0XHRcdFx0QVJSQVkgb2YgREFURVNcdFx0XHRcdFx0XHQvLyBGaXhJbjogMTAuMC4wLjUwLlxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0dmFyIGRhdGVzX3RvX3NlbGVjdF9hcnIgPSBbXTtcclxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIGNoZWNrX2luX3ltZCApICl7XHJcblx0XHRkYXRlc190b19zZWxlY3RfYXJyID0gd3BiY19jbG9uZV9vYmooIGNoZWNrX2luX3ltZCApO1xyXG5cclxuXHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdC8vIEV4Y2VwdGlvbnMgdG8gIHNldCAgXHRNVUxUSVBMRSBEQVlTIFx0bW9kZVxyXG5cdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0Ly8gaWYgZGF0ZXMgYXMgTk9UIENPTlNFQ1VUSVZFOiBbJzIwMjQtMDUtMDknLCcyMDI0LTA1LTE5JywnMjAyNC0wNS0zMCddLCAtPiBzZXQgTVVMVElQTEUgREFZUyBtb2RlXHJcblx0XHRpZiAoXHJcblx0XHRcdCAgICggZGF0ZXNfdG9fc2VsZWN0X2Fyci5sZW5ndGggPiAwIClcclxuXHRcdFx0JiYgKCAnJyA9PSBjaGVja19vdXRfeW1kIClcclxuXHRcdFx0JiYgKCAhIHdwYmNfZGF0ZXNfX2lzX2NvbnNlY3V0aXZlX2RhdGVzX2Fycl9yYW5nZSggZGF0ZXNfdG9fc2VsZWN0X2FyciApIClcclxuXHRcdCl7XHJcblx0XHRcdHdwYmNfY2FsX2RheXNfc2VsZWN0X19tdWx0aXBsZSggcmVzb3VyY2VfaWQgKTtcclxuXHRcdH1cclxuXHRcdC8vIGlmIG11bHRpcGxlIGRheXMgdG8gc2VsZWN0LCBidXQgZW5hYmxlZCBTSU5HTEUgZGF5IG1vZGUsIC0+IHNldCBNVUxUSVBMRSBEQVlTIG1vZGVcclxuXHRcdGlmIChcclxuXHRcdFx0ICAgKCBkYXRlc190b19zZWxlY3RfYXJyLmxlbmd0aCA+IDEgKVxyXG5cdFx0XHQmJiAoICcnID09IGNoZWNrX291dF95bWQgKVxyXG5cdFx0XHQmJiAoICdzaW5nbGUnID09PSBfd3BiYy5jYWxlbmRhcl9fZ2V0X3BhcmFtX3ZhbHVlKCByZXNvdXJjZV9pZCwgJ2RheXNfc2VsZWN0X21vZGUnICkgKVxyXG5cdFx0KXtcclxuXHRcdFx0d3BiY19jYWxfZGF5c19zZWxlY3RfX211bHRpcGxlKCByZXNvdXJjZV9pZCApO1xyXG5cdFx0fVxyXG5cdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0Y2hlY2tfaW5feW1kID0gZGF0ZXNfdG9fc2VsZWN0X2FyclsgMCBdO1xyXG5cdFx0aWYgKCAnJyA9PSBjaGVja19vdXRfeW1kICl7XHJcblx0XHRcdGNoZWNrX291dF95bWQgPSBkYXRlc190b19zZWxlY3RfYXJyWyAoZGF0ZXNfdG9fc2VsZWN0X2Fyci5sZW5ndGgtMSkgXTtcclxuXHRcdH1cclxuXHR9XHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblxyXG5cdGlmICggJycgPT0gY2hlY2tfaW5feW1kICl7XHJcblx0XHRjaGVja19pbl95bWQgPSBjaGVja19vdXRfeW1kO1xyXG5cdH1cclxuXHRpZiAoICcnID09IGNoZWNrX291dF95bWQgKXtcclxuXHRcdGNoZWNrX291dF95bWQgPSBjaGVja19pbl95bWQ7XHJcblx0fVxyXG5cclxuXHRpZiAoICd1bmRlZmluZWQnID09PSB0eXBlb2YgKHJlc291cmNlX2lkKSApe1xyXG5cdFx0cmVzb3VyY2VfaWQgPSAnMSc7XHJcblx0fVxyXG5cclxuXHJcblx0dmFyIGluc3QgPSB3cGJjX2NhbGVuZGFyX19nZXRfaW5zdCggcmVzb3VyY2VfaWQgKTtcclxuXHJcblx0aWYgKCBudWxsICE9PSBpbnN0ICl7XHJcblxyXG5cdFx0Ly8gVW5zZWxlY3QgYWxsIGRhdGVzIGFuZCBzZXQgIHByb3BlcnRpZXMgb2YgRGF0ZXBpY2tcclxuXHRcdGpRdWVyeSggJyNkYXRlX2Jvb2tpbmcnICsgcmVzb3VyY2VfaWQgKS52YWwoICcnICk7ICAgICAgXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vRml4SW46IDUuNC4zXHJcblx0XHRpbnN0LnN0YXlPcGVuID0gZmFsc2U7XHJcblx0XHRpbnN0LmRhdGVzID0gW107XHJcblx0XHR2YXIgY2hlY2tfaW5fanMgPSB3cGJjX19nZXRfX2pzX2RhdGUoIGNoZWNrX2luX3ltZCApO1xyXG5cdFx0dmFyIHRkX2NlbGwgICAgID0gd3BiY19nZXRfY2xpY2tlZF90ZCggaW5zdC5pZCwgY2hlY2tfaW5fanMgKTtcclxuXHJcblx0XHQvLyBJcyBvbWUgdHlwZSBvZiBlcnJvciwgdGhlbiBzZWxlY3QgbXVsdGlwbGUgZGF5cyBzZWxlY3Rpb24gIG1vZGUuXHJcblx0XHRpZiAoICcnID09PSBfd3BiYy5jYWxlbmRhcl9fZ2V0X3BhcmFtX3ZhbHVlKCByZXNvdXJjZV9pZCwgJ2RheXNfc2VsZWN0X21vZGUnICkgKSB7XHJcbiBcdFx0XHRfd3BiYy5jYWxlbmRhcl9fc2V0X3BhcmFtX3ZhbHVlKCByZXNvdXJjZV9pZCwgJ2RheXNfc2VsZWN0X21vZGUnLCAnbXVsdGlwbGUnICk7XHJcblx0XHR9XHJcblxyXG5cclxuXHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0Ly8gID09IERZTkFNSUMgPT1cclxuXHRcdGlmICggJ2R5bmFtaWMnID09PSBfd3BiYy5jYWxlbmRhcl9fZ2V0X3BhcmFtX3ZhbHVlKCByZXNvdXJjZV9pZCwgJ2RheXNfc2VsZWN0X21vZGUnICkgKXtcclxuXHRcdFx0Ly8gMS1zdCBjbGlja1xyXG5cdFx0XHRpbnN0LnN0YXlPcGVuID0gZmFsc2U7XHJcblx0XHRcdGpRdWVyeS5kYXRlcGljay5fc2VsZWN0RGF5KCB0ZF9jZWxsLCAnIycgKyBpbnN0LmlkLCBjaGVja19pbl9qcy5nZXRUaW1lKCkgKTtcclxuXHRcdFx0aWYgKCAwID09PSBpbnN0LmRhdGVzLmxlbmd0aCApe1xyXG5cdFx0XHRcdHJldHVybiAwOyAgXHRcdFx0XHRcdFx0XHRcdC8vIEZpcnN0IGNsaWNrICB3YXMgdW5zdWNjZXNzZnVsLCBzbyB3ZSBtdXN0IG5vdCBtYWtlIG90aGVyIGNsaWNrXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIDItbmQgY2xpY2tcclxuXHRcdFx0dmFyIGNoZWNrX291dF9qcyA9IHdwYmNfX2dldF9fanNfZGF0ZSggY2hlY2tfb3V0X3ltZCApO1xyXG5cdFx0XHR2YXIgdGRfY2VsbF9vdXQgPSB3cGJjX2dldF9jbGlja2VkX3RkKCBpbnN0LmlkLCBjaGVja19vdXRfanMgKTtcclxuXHRcdFx0aW5zdC5zdGF5T3BlbiA9IHRydWU7XHJcblx0XHRcdGpRdWVyeS5kYXRlcGljay5fc2VsZWN0RGF5KCB0ZF9jZWxsX291dCwgJyMnICsgaW5zdC5pZCwgY2hlY2tfb3V0X2pzLmdldFRpbWUoKSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0Ly8gID09IEZJWEVEID09XHJcblx0XHRpZiAoICAnZml4ZWQnID09PSBfd3BiYy5jYWxlbmRhcl9fZ2V0X3BhcmFtX3ZhbHVlKCByZXNvdXJjZV9pZCwgJ2RheXNfc2VsZWN0X21vZGUnICkpIHtcclxuXHRcdFx0alF1ZXJ5LmRhdGVwaWNrLl9zZWxlY3REYXkoIHRkX2NlbGwsICcjJyArIGluc3QuaWQsIGNoZWNrX2luX2pzLmdldFRpbWUoKSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0Ly8gID09IFNJTkdMRSA9PVxyXG5cdFx0aWYgKCAnc2luZ2xlJyA9PT0gX3dwYmMuY2FsZW5kYXJfX2dldF9wYXJhbV92YWx1ZSggcmVzb3VyY2VfaWQsICdkYXlzX3NlbGVjdF9tb2RlJyApICl7XHJcblx0XHRcdC8valF1ZXJ5LmRhdGVwaWNrLl9yZXN0cmljdE1pbk1heCggaW5zdCwgalF1ZXJ5LmRhdGVwaWNrLl9kZXRlcm1pbmVEYXRlKCBpbnN0LCBjaGVja19pbl9qcywgbnVsbCApICk7XHRcdC8vIERvIHdlIG5lZWQgdG8gcnVuICB0aGlzID8gUGxlYXNlIG5vdGUsIGNoZWNrX2luX2pzIG11c3QgIGhhdmUgdGltZSwgIG1pbiwgc2VjIGRlZmluZWQgdG8gMCFcclxuXHRcdFx0alF1ZXJ5LmRhdGVwaWNrLl9zZWxlY3REYXkoIHRkX2NlbGwsICcjJyArIGluc3QuaWQsIGNoZWNrX2luX2pzLmdldFRpbWUoKSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0Ly8gID09IE1VTFRJUExFID09XHJcblx0XHRpZiAoICdtdWx0aXBsZScgPT09IF93cGJjLmNhbGVuZGFyX19nZXRfcGFyYW1fdmFsdWUoIHJlc291cmNlX2lkLCAnZGF5c19zZWxlY3RfbW9kZScgKSApe1xyXG5cclxuXHRcdFx0dmFyIGRhdGVzX2FycjtcclxuXHJcblx0XHRcdGlmICggZGF0ZXNfdG9fc2VsZWN0X2Fyci5sZW5ndGggPiAwICl7XHJcblx0XHRcdFx0Ly8gU2l0dWF0aW9uLCB3aGVuIHdlIGhhdmUgZGF0ZXMgYXJyYXk6IFsnMjAyNC0wNS0wOScsJzIwMjQtMDUtMTknLCcyMDI0LTA1LTMwJ10uICBhbmQgbm90IHRoZSBDaGVjayBJbiAvIENoZWNrICBvdXQgZGF0ZXMgYXMgcGFyYW1ldGVyIGluIHRoaXMgZnVuY3Rpb25cclxuXHRcdFx0XHRkYXRlc19hcnIgPSB3cGJjX2dldF9zZWxlY3Rpb25fZGF0ZXNfanNfc3RyX2Fycl9fZnJvbV9hcnIoIGRhdGVzX3RvX3NlbGVjdF9hcnIgKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRkYXRlc19hcnIgPSB3cGJjX2dldF9zZWxlY3Rpb25fZGF0ZXNfanNfc3RyX2Fycl9fZnJvbV9jaGVja19pbl9vdXQoIGNoZWNrX2luX3ltZCwgY2hlY2tfb3V0X3ltZCwgaW5zdCApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIDAgPT09IGRhdGVzX2Fyci5kYXRlc19qcy5sZW5ndGggKXtcclxuXHRcdFx0XHRyZXR1cm4gMDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gRm9yIENhbGVuZGFyIERheXMgc2VsZWN0aW9uXHJcblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IGRhdGVzX2Fyci5kYXRlc19qcy5sZW5ndGg7IGorKyApeyAgICAgICAvLyBMb29wIGFycmF5IG9mIGRhdGVzXHJcblxyXG5cdFx0XHRcdHZhciBzdHJfZGF0ZSA9IHdwYmNfX2dldF9fc3FsX2NsYXNzX2RhdGUoIGRhdGVzX2Fyci5kYXRlc19qc1sgaiBdICk7XHJcblxyXG5cdFx0XHRcdC8vIERhdGUgdW5hdmFpbGFibGUgIVxyXG5cdFx0XHRcdGlmICggMCA9PSBfd3BiYy5ib29raW5nc19pbl9jYWxlbmRhcl9fZ2V0X2Zvcl9kYXRlKCByZXNvdXJjZV9pZCwgc3RyX2RhdGUgKS5kYXlfYXZhaWxhYmlsaXR5ICl7XHJcblx0XHRcdFx0XHRyZXR1cm4gMDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggZGF0ZXNfYXJyLmRhdGVzX2pzWyBqIF0gIT0gLTEgKSB7XHJcblx0XHRcdFx0XHRpbnN0LmRhdGVzLnB1c2goIGRhdGVzX2Fyci5kYXRlc19qc1sgaiBdICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgY2hlY2tfb3V0X2RhdGUgPSBkYXRlc19hcnIuZGF0ZXNfanNbIChkYXRlc19hcnIuZGF0ZXNfanMubGVuZ3RoIC0gMSkgXTtcclxuXHJcblx0XHRcdGluc3QuZGF0ZXMucHVzaCggY2hlY2tfb3V0X2RhdGUgKTsgXHRcdFx0Ly8gTmVlZCBhZGQgb25lIGFkZGl0aW9uYWwgU0FNRSBkYXRlIGZvciBjb3JyZWN0ICB3b3JrcyBvZiBkYXRlcyBzZWxlY3Rpb24gISEhISFcclxuXHJcblx0XHRcdHZhciBjaGVja291dF90aW1lc3RhbXAgPSBjaGVja19vdXRfZGF0ZS5nZXRUaW1lKCk7XHJcblx0XHRcdHZhciB0ZF9jZWxsID0gd3BiY19nZXRfY2xpY2tlZF90ZCggaW5zdC5pZCwgY2hlY2tfb3V0X2RhdGUgKTtcclxuXHJcblx0XHRcdGpRdWVyeS5kYXRlcGljay5fc2VsZWN0RGF5KCB0ZF9jZWxsLCAnIycgKyBpbnN0LmlkLCBjaGVja291dF90aW1lc3RhbXAgKTtcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0aWYgKCAwICE9PSBpbnN0LmRhdGVzLmxlbmd0aCApe1xyXG5cdFx0XHQvLyBTY3JvbGwgdG8gc3BlY2lmaWMgbW9udGgsIGlmIHdlIHNldCBkYXRlcyBpbiBzb21lIGZ1dHVyZSBtb250aHNcclxuXHRcdFx0d3BiY19jYWxlbmRhcl9fc2Nyb2xsX3RvKCByZXNvdXJjZV9pZCwgaW5zdC5kYXRlc1sgMCBdLmdldEZ1bGxZZWFyKCksIGluc3QuZGF0ZXNbIDAgXS5nZXRNb250aCgpKzEgKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gaW5zdC5kYXRlcy5sZW5ndGg7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gMDtcclxufVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXQgSFRNTCB0ZCBlbGVtZW50ICh3aGVyZSB3YXMgY2xpY2sgaW4gY2FsZW5kYXIgIGRheSAgY2VsbClcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBjYWxlbmRhcl9odG1sX2lkXHRcdFx0J2NhbGVuZGFyX2Jvb2tpbmcxJ1xyXG5cdCAqIEBwYXJhbSBkYXRlX2pzXHRcdFx0XHRcdEpTIERhdGVcclxuXHQgKiBAcmV0dXJucyB7KnxqUXVlcnl9XHRcdFx0XHREb20gSFRNTCB0ZCBlbGVtZW50XHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19nZXRfY2xpY2tlZF90ZCggY2FsZW5kYXJfaHRtbF9pZCwgZGF0ZV9qcyApe1xyXG5cclxuXHQgICAgdmFyIHRkX2NlbGwgPSBqUXVlcnkoICcjJyArIGNhbGVuZGFyX2h0bWxfaWQgKyAnIC5zcWxfZGF0ZV8nICsgd3BiY19fZ2V0X19zcWxfY2xhc3NfZGF0ZSggZGF0ZV9qcyApICkuZ2V0KCAwICk7XHJcblxyXG5cdFx0cmV0dXJuIHRkX2NlbGw7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXQgYXJyYXlzIG9mIEpTIGFuZCBTUUwgZGF0ZXMgYXMgZGF0ZXMgYXJyYXlcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBjaGVja19pbl95bWRcdFx0XHRcdFx0XHRcdCcyMDI0LTA1LTE1J1xyXG5cdCAqIEBwYXJhbSBjaGVja19vdXRfeW1kXHRcdFx0XHRcdFx0XHQnMjAyNC0wNS0yNSdcclxuXHQgKiBAcGFyYW0gaW5zdFx0XHRcdFx0XHRcdFx0XHRcdERhdGVwaWNrIEluc3QuIFVzZSB3cGJjX2NhbGVuZGFyX19nZXRfaW5zdCggcmVzb3VyY2VfaWQgKTtcclxuXHQgKiBAcmV0dXJucyB7e2RhdGVzX2pzOiAqW10sIGRhdGVzX3N0cjogKltdfX1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2dldF9zZWxlY3Rpb25fZGF0ZXNfanNfc3RyX2Fycl9fZnJvbV9jaGVja19pbl9vdXQoIGNoZWNrX2luX3ltZCwgY2hlY2tfb3V0X3ltZCAsIGluc3QgKXtcclxuXHJcblx0XHR2YXIgb3JpZ2luYWxfYXJyYXkgPSBbXTtcclxuXHRcdHZhciBkYXRlO1xyXG5cdFx0dmFyIGJrX2Rpc3RpbmN0X2RhdGVzID0gW107XHJcblxyXG5cdFx0dmFyIGNoZWNrX2luX2RhdGUgPSBjaGVja19pbl95bWQuc3BsaXQoICctJyApO1xyXG5cdFx0dmFyIGNoZWNrX291dF9kYXRlID0gY2hlY2tfb3V0X3ltZC5zcGxpdCggJy0nICk7XHJcblxyXG5cdFx0ZGF0ZSA9IG5ldyBEYXRlKCk7XHJcblx0XHRkYXRlLnNldEZ1bGxZZWFyKCBjaGVja19pbl9kYXRlWyAwIF0sIChjaGVja19pbl9kYXRlWyAxIF0gLSAxKSwgY2hlY2tfaW5fZGF0ZVsgMiBdICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8geWVhciwgbW9udGgsIGRhdGVcclxuXHRcdHZhciBvcmlnaW5hbF9jaGVja19pbl9kYXRlID0gZGF0ZTtcclxuXHRcdG9yaWdpbmFsX2FycmF5LnB1c2goIGpRdWVyeS5kYXRlcGljay5fcmVzdHJpY3RNaW5NYXgoIGluc3QsIGpRdWVyeS5kYXRlcGljay5fZGV0ZXJtaW5lRGF0ZSggaW5zdCwgZGF0ZSwgbnVsbCApICkgKTsgLy9hZGQgZGF0ZVxyXG5cdFx0aWYgKCAhIHdwYmNfaW5fYXJyYXkoIGJrX2Rpc3RpbmN0X2RhdGVzLCAoY2hlY2tfaW5fZGF0ZVsgMiBdICsgJy4nICsgY2hlY2tfaW5fZGF0ZVsgMSBdICsgJy4nICsgY2hlY2tfaW5fZGF0ZVsgMCBdKSApICl7XHJcblx0XHRcdGJrX2Rpc3RpbmN0X2RhdGVzLnB1c2goIHBhcnNlSW50KGNoZWNrX2luX2RhdGVbIDIgXSkgKyAnLicgKyBwYXJzZUludChjaGVja19pbl9kYXRlWyAxIF0pICsgJy4nICsgY2hlY2tfaW5fZGF0ZVsgMCBdICk7XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGRhdGVfb3V0ID0gbmV3IERhdGUoKTtcclxuXHRcdGRhdGVfb3V0LnNldEZ1bGxZZWFyKCBjaGVja19vdXRfZGF0ZVsgMCBdLCAoY2hlY2tfb3V0X2RhdGVbIDEgXSAtIDEpLCBjaGVja19vdXRfZGF0ZVsgMiBdICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8geWVhciwgbW9udGgsIGRhdGVcclxuXHRcdHZhciBvcmlnaW5hbF9jaGVja19vdXRfZGF0ZSA9IGRhdGVfb3V0O1xyXG5cclxuXHRcdHZhciBtZXdEYXRlID0gbmV3IERhdGUoIG9yaWdpbmFsX2NoZWNrX2luX2RhdGUuZ2V0RnVsbFllYXIoKSwgb3JpZ2luYWxfY2hlY2tfaW5fZGF0ZS5nZXRNb250aCgpLCBvcmlnaW5hbF9jaGVja19pbl9kYXRlLmdldERhdGUoKSApO1xyXG5cdFx0bWV3RGF0ZS5zZXREYXRlKCBvcmlnaW5hbF9jaGVja19pbl9kYXRlLmdldERhdGUoKSArIDEgKTtcclxuXHJcblx0XHR3aGlsZSAoXHJcblx0XHRcdChvcmlnaW5hbF9jaGVja19vdXRfZGF0ZSA+IGRhdGUpICYmXHJcblx0XHRcdChvcmlnaW5hbF9jaGVja19pbl9kYXRlICE9IG9yaWdpbmFsX2NoZWNrX291dF9kYXRlKSApe1xyXG5cdFx0XHRkYXRlID0gbmV3IERhdGUoIG1ld0RhdGUuZ2V0RnVsbFllYXIoKSwgbWV3RGF0ZS5nZXRNb250aCgpLCBtZXdEYXRlLmdldERhdGUoKSApO1xyXG5cclxuXHRcdFx0b3JpZ2luYWxfYXJyYXkucHVzaCggalF1ZXJ5LmRhdGVwaWNrLl9yZXN0cmljdE1pbk1heCggaW5zdCwgalF1ZXJ5LmRhdGVwaWNrLl9kZXRlcm1pbmVEYXRlKCBpbnN0LCBkYXRlLCBudWxsICkgKSApOyAvL2FkZCBkYXRlXHJcblx0XHRcdGlmICggIXdwYmNfaW5fYXJyYXkoIGJrX2Rpc3RpbmN0X2RhdGVzLCAoZGF0ZS5nZXREYXRlKCkgKyAnLicgKyBwYXJzZUludCggZGF0ZS5nZXRNb250aCgpICsgMSApICsgJy4nICsgZGF0ZS5nZXRGdWxsWWVhcigpKSApICl7XHJcblx0XHRcdFx0YmtfZGlzdGluY3RfZGF0ZXMucHVzaCggKHBhcnNlSW50KGRhdGUuZ2V0RGF0ZSgpKSArICcuJyArIHBhcnNlSW50KCBkYXRlLmdldE1vbnRoKCkgKyAxICkgKyAnLicgKyBkYXRlLmdldEZ1bGxZZWFyKCkpICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG1ld0RhdGUgPSBuZXcgRGF0ZSggZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpICk7XHJcblx0XHRcdG1ld0RhdGUuc2V0RGF0ZSggbWV3RGF0ZS5nZXREYXRlKCkgKyAxICk7XHJcblx0XHR9XHJcblx0XHRvcmlnaW5hbF9hcnJheS5wb3AoKTtcclxuXHRcdGJrX2Rpc3RpbmN0X2RhdGVzLnBvcCgpO1xyXG5cclxuXHRcdHJldHVybiB7J2RhdGVzX2pzJzogb3JpZ2luYWxfYXJyYXksICdkYXRlc19zdHInOiBia19kaXN0aW5jdF9kYXRlc307XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXQgYXJyYXlzIG9mIEpTIGFuZCBTUUwgZGF0ZXMgYXMgZGF0ZXMgYXJyYXlcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBkYXRlc190b19zZWxlY3RfYXJyXHQ9IFsnMjAyNC0wNS0wOScsJzIwMjQtMDUtMTknLCcyMDI0LTA1LTMwJ11cclxuXHQgKlxyXG5cdCAqIEByZXR1cm5zIHt7ZGF0ZXNfanM6ICpbXSwgZGF0ZXNfc3RyOiAqW119fVxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfZ2V0X3NlbGVjdGlvbl9kYXRlc19qc19zdHJfYXJyX19mcm9tX2FyciggZGF0ZXNfdG9fc2VsZWN0X2FyciApe1x0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRml4SW46IDEwLjAuMC41MC5cclxuXHJcblx0XHR2YXIgb3JpZ2luYWxfYXJyYXkgICAgPSBbXTtcclxuXHRcdHZhciBia19kaXN0aW5jdF9kYXRlcyA9IFtdO1xyXG5cdFx0dmFyIG9uZV9kYXRlX3N0cjtcclxuXHJcblx0XHRmb3IgKCB2YXIgZCA9IDA7IGQgPCBkYXRlc190b19zZWxlY3RfYXJyLmxlbmd0aDsgZCsrICl7XHJcblxyXG5cdFx0XHRvcmlnaW5hbF9hcnJheS5wdXNoKCB3cGJjX19nZXRfX2pzX2RhdGUoIGRhdGVzX3RvX3NlbGVjdF9hcnJbIGQgXSApICk7XHJcblxyXG5cdFx0XHRvbmVfZGF0ZV9zdHIgPSBkYXRlc190b19zZWxlY3RfYXJyWyBkIF0uc3BsaXQoJy0nKVxyXG5cdFx0XHRpZiAoICEgd3BiY19pbl9hcnJheSggYmtfZGlzdGluY3RfZGF0ZXMsIChvbmVfZGF0ZV9zdHJbIDIgXSArICcuJyArIG9uZV9kYXRlX3N0clsgMSBdICsgJy4nICsgb25lX2RhdGVfc3RyWyAwIF0pICkgKXtcclxuXHRcdFx0XHRia19kaXN0aW5jdF9kYXRlcy5wdXNoKCBwYXJzZUludChvbmVfZGF0ZV9zdHJbIDIgXSkgKyAnLicgKyBwYXJzZUludChvbmVfZGF0ZV9zdHJbIDEgXSkgKyAnLicgKyBvbmVfZGF0ZV9zdHJbIDAgXSApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHsnZGF0ZXNfanMnOiBvcmlnaW5hbF9hcnJheSwgJ2RhdGVzX3N0cic6IG9yaWdpbmFsX2FycmF5fTtcclxuXHR9XHJcblxyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuLyogID09ICBBdXRvIEZpbGwgRmllbGRzIC8gQXV0byBTZWxlY3QgRGF0ZXMgID09XHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxualF1ZXJ5KCBkb2N1bWVudCApLnJlYWR5KCBmdW5jdGlvbiAoKXtcclxuXHJcblx0dmFyIHVybF9wYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCB3aW5kb3cubG9jYXRpb24uc2VhcmNoICk7XHJcblxyXG5cdC8vIERpc2FibGUgZGF5cyBzZWxlY3Rpb24gIGluIGNhbGVuZGFyLCAgYWZ0ZXIgIHJlZGlyZWN0aW9uICBmcm9tICB0aGUgXCJTZWFyY2ggcmVzdWx0cyBwYWdlLCAgYWZ0ZXIgIHNlYXJjaCAgYXZhaWxhYmlsaXR5XCIgXHRcdFx0Ly8gRml4SW46IDguOC4yLjMuXHJcblx0aWYgICggJ09uJyAhPSBfd3BiYy5nZXRfb3RoZXJfcGFyYW0oICdpc19lbmFibGVkX2Jvb2tpbmdfc2VhcmNoX3Jlc3VsdHNfZGF5c19zZWxlY3QnICkgKSB7XHJcblx0XHRpZiAoXHJcblx0XHRcdCggdXJsX3BhcmFtcy5oYXMoICd3cGJjX3NlbGVjdF9jaGVja19pbicgKSApICYmXHJcblx0XHRcdCggdXJsX3BhcmFtcy5oYXMoICd3cGJjX3NlbGVjdF9jaGVja19vdXQnICkgKSAmJlxyXG5cdFx0XHQoIHVybF9wYXJhbXMuaGFzKCAnd3BiY19zZWxlY3RfY2FsZW5kYXJfaWQnICkgKVxyXG5cdFx0KXtcclxuXHJcblx0XHRcdHZhciBzZWxlY3RfZGF0ZXNfaW5fY2FsZW5kYXJfaWQgPSBwYXJzZUludCggdXJsX3BhcmFtcy5nZXQoICd3cGJjX3NlbGVjdF9jYWxlbmRhcl9pZCcgKSApO1xyXG5cclxuXHRcdFx0Ly8gRmlyZSBvbiBhbGwgYm9va2luZyBkYXRlcyBsb2FkZWRcclxuXHRcdFx0alF1ZXJ5KCAnYm9keScgKS5vbiggJ3dwYmNfY2FsZW5kYXJfYWp4X19sb2FkZWRfZGF0YScsIGZ1bmN0aW9uICggZXZlbnQsIGxvYWRlZF9yZXNvdXJjZV9pZCApe1xyXG5cclxuXHRcdFx0XHRpZiAoIGxvYWRlZF9yZXNvdXJjZV9pZCA9PSBzZWxlY3RfZGF0ZXNfaW5fY2FsZW5kYXJfaWQgKXtcclxuXHRcdFx0XHRcdHdwYmNfYXV0b19zZWxlY3RfZGF0ZXNfaW5fY2FsZW5kYXIoIHNlbGVjdF9kYXRlc19pbl9jYWxlbmRhcl9pZCwgdXJsX3BhcmFtcy5nZXQoICd3cGJjX3NlbGVjdF9jaGVja19pbicgKSwgdXJsX3BhcmFtcy5nZXQoICd3cGJjX3NlbGVjdF9jaGVja19vdXQnICkgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGlmICggdXJsX3BhcmFtcy5oYXMoICd3cGJjX2F1dG9fZmlsbCcgKSApe1xyXG5cclxuXHRcdHZhciB3cGJjX2F1dG9fZmlsbF92YWx1ZSA9IHVybF9wYXJhbXMuZ2V0KCAnd3BiY19hdXRvX2ZpbGwnICk7XHJcblxyXG5cdFx0Ly8gQ29udmVydCBiYWNrLiAgICAgU29tZSBzeXN0ZW1zIGRvIG5vdCBsaWtlIHN5bWJvbCAnficgaW4gVVJMLCBzbyAgd2UgbmVlZCB0byByZXBsYWNlIHRvICBzb21lIG90aGVyIHN5bWJvbHNcclxuXHRcdHdwYmNfYXV0b19maWxsX3ZhbHVlID0gd3BiY19hdXRvX2ZpbGxfdmFsdWUucmVwbGFjZUFsbCggJ19eXycsICd+JyApO1xyXG5cclxuXHRcdHdwYmNfYXV0b19maWxsX2Jvb2tpbmdfZmllbGRzKCB3cGJjX2F1dG9fZmlsbF92YWx1ZSApO1xyXG5cdH1cclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBBdXRvZmlsbCAvIHNlbGVjdCBib29raW5nIGZvcm0gIGZpZWxkcyBieSAgdmFsdWVzIGZyb20gIHRoZSBHRVQgcmVxdWVzdCAgcGFyYW1ldGVyOiA/d3BiY19hdXRvX2ZpbGw9XHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRvX2ZpbGxfc3RyXHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2F1dG9fZmlsbF9ib29raW5nX2ZpZWxkcyggYXV0b19maWxsX3N0ciApe1x0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRml4SW46IDEwLjAuMC40OC5cclxuXHJcblx0aWYgKCAnJyA9PSBhdXRvX2ZpbGxfc3RyICl7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuLy8gY29uc29sZS5sb2coICdXUEJDX0FVVE9fRklMTF9CT09LSU5HX0ZJRUxEUyggQVVUT19GSUxMX1NUUiApJywgYXV0b19maWxsX3N0cik7XHJcblxyXG5cdHZhciBmaWVsZHNfYXJyID0gd3BiY19hdXRvX2ZpbGxfYm9va2luZ19maWVsZHNfX3BhcnNlKCBhdXRvX2ZpbGxfc3RyICk7XHJcblxyXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IGZpZWxkc19hcnIubGVuZ3RoOyBpKysgKXtcclxuXHRcdGpRdWVyeSggJ1tuYW1lPVwiJyArIGZpZWxkc19hcnJbIGkgXVsgJ25hbWUnIF0gKyAnXCJdJyApLnZhbCggZmllbGRzX2FyclsgaSBdWyAndmFsdWUnIF0gKTtcclxuXHR9XHJcbn1cclxuXHJcblx0LyoqXHJcblx0ICogUGFyc2UgZGF0YSBmcm9tICBnZXQgcGFyYW1ldGVyOlx0P3dwYmNfYXV0b19maWxsPXZpc2l0b3JzMjMxXjJ+bWF4X2NhcGFjaXR5MjMxXjJcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBkYXRhX3N0ciAgICAgID0gICAndmlzaXRvcnMyMzFeMn5tYXhfY2FwYWNpdHkyMzFeMic7XHJcblx0ICogQHJldHVybnMgeyp9XHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19hdXRvX2ZpbGxfYm9va2luZ19maWVsZHNfX3BhcnNlKCBkYXRhX3N0ciApe1xyXG5cclxuXHRcdHZhciBmaWx0ZXJfb3B0aW9uc19hcnIgPSBbXTtcclxuXHJcblx0XHR2YXIgZGF0YV9hcnIgPSBkYXRhX3N0ci5zcGxpdCggJ34nICk7XHJcblxyXG5cdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgZGF0YV9hcnIubGVuZ3RoOyBqKysgKXtcclxuXHJcblx0XHRcdHZhciBteV9mb3JtX2ZpZWxkID0gZGF0YV9hcnJbIGogXS5zcGxpdCggJ14nICk7XHJcblxyXG5cdFx0XHR2YXIgZmlsdGVyX25hbWUgID0gKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgKG15X2Zvcm1fZmllbGRbIDAgXSkpID8gbXlfZm9ybV9maWVsZFsgMCBdIDogJyc7XHJcblx0XHRcdHZhciBmaWx0ZXJfdmFsdWUgPSAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiAobXlfZm9ybV9maWVsZFsgMSBdKSkgPyBteV9mb3JtX2ZpZWxkWyAxIF0gOiAnJztcclxuXHJcblx0XHRcdGZpbHRlcl9vcHRpb25zX2Fyci5wdXNoKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCduYW1lJyAgOiBmaWx0ZXJfbmFtZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCd2YWx1ZScgOiBmaWx0ZXJfdmFsdWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHQgICApO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGZpbHRlcl9vcHRpb25zX2FycjtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhcnNlIGRhdGEgZnJvbSAgZ2V0IHBhcmFtZXRlcjpcdD9zZWFyY2hfZ2V0X19jdXN0b21fcGFyYW1zPS4uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIGRhdGFfc3RyICAgICAgPSAgICd0ZXh0XnNlYXJjaF9maWVsZF9fZGlzcGxheV9jaGVja19pbl4yMy4wNS4yMDI0fnRleHRec2VhcmNoX2ZpZWxkX19kaXNwbGF5X2NoZWNrX291dF4yNi4wNS4yMDI0fnNlbGVjdGJveC1vbmVec2VhcmNoX3F1YW50aXR5XjJ+c2VsZWN0Ym94LW9uZV5sb2NhdGlvbl5TcGFpbn5zZWxlY3Rib3gtb25lXm1heF9jYXBhY2l0eV4yfnNlbGVjdGJveC1vbmVeYW1lbml0eV5wYXJraW5nfmNoZWNrYm94XnNlYXJjaF9maWVsZF9fZXh0ZW5kX3NlYXJjaF9kYXlzXjV+c3VibWl0Xl5TZWFyY2h+aGlkZGVuXnNlYXJjaF9nZXRfX2NoZWNrX2luX3ltZF4yMDI0LTA1LTIzfmhpZGRlbl5zZWFyY2hfZ2V0X19jaGVja19vdXRfeW1kXjIwMjQtMDUtMjZ+aGlkZGVuXnNlYXJjaF9nZXRfX3RpbWVefmhpZGRlbl5zZWFyY2hfZ2V0X19xdWFudGl0eV4yfmhpZGRlbl5zZWFyY2hfZ2V0X19leHRlbmReNX5oaWRkZW5ec2VhcmNoX2dldF9fdXNlcnNfaWRefmhpZGRlbl5zZWFyY2hfZ2V0X19jdXN0b21fcGFyYW1zXn4nO1xyXG5cdCAqIEByZXR1cm5zIHsqfVxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfYXV0b19maWxsX3NlYXJjaF9maWVsZHNfX3BhcnNlKCBkYXRhX3N0ciApe1xyXG5cclxuXHRcdHZhciBmaWx0ZXJfb3B0aW9uc19hcnIgPSBbXTtcclxuXHJcblx0XHR2YXIgZGF0YV9hcnIgPSBkYXRhX3N0ci5zcGxpdCggJ34nICk7XHJcblxyXG5cdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgZGF0YV9hcnIubGVuZ3RoOyBqKysgKXtcclxuXHJcblx0XHRcdHZhciBteV9mb3JtX2ZpZWxkID0gZGF0YV9hcnJbIGogXS5zcGxpdCggJ14nICk7XHJcblxyXG5cdFx0XHR2YXIgZmlsdGVyX3R5cGUgID0gKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgKG15X2Zvcm1fZmllbGRbIDAgXSkpID8gbXlfZm9ybV9maWVsZFsgMCBdIDogJyc7XHJcblx0XHRcdHZhciBmaWx0ZXJfbmFtZSAgPSAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiAobXlfZm9ybV9maWVsZFsgMSBdKSkgPyBteV9mb3JtX2ZpZWxkWyAxIF0gOiAnJztcclxuXHRcdFx0dmFyIGZpbHRlcl92YWx1ZSA9ICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIChteV9mb3JtX2ZpZWxkWyAyIF0pKSA/IG15X2Zvcm1fZmllbGRbIDIgXSA6ICcnO1xyXG5cclxuXHRcdFx0ZmlsdGVyX29wdGlvbnNfYXJyLnB1c2goXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3R5cGUnICA6IGZpbHRlcl90eXBlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J25hbWUnICA6IGZpbHRlcl9uYW1lLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3ZhbHVlJyA6IGZpbHRlcl92YWx1ZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdCAgICk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZmlsdGVyX29wdGlvbnNfYXJyO1xyXG5cdH1cclxuXHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLyogID09ICBBdXRvIFVwZGF0ZSBudW1iZXIgb2YgbW9udGhzIGluIGNhbGVuZGFycyBPTiBzY3JlZW4gc2l6ZSBjaGFuZ2VkICA9PVxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuXHJcbi8qKlxyXG4gKiBBdXRvIFVwZGF0ZSBOdW1iZXIgb2YgTW9udGhzIGluIENhbGVuZGFyLCBlLmcuOiAgXHRcdGlmICAgICggV0lORE9XX1dJRFRIIDw9IDc4MnB4ICkgICA+Pj4gXHRNT05USFNfTlVNQkVSID0gMVxyXG4gKiAgIEVMU0U6ICBudW1iZXIgb2YgbW9udGhzIGRlZmluZWQgaW4gc2hvcnRjb2RlLlxyXG4gKiBAcGFyYW0gcmVzb3VyY2VfaWQgaW50XHJcbiAqXHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2NhbGVuZGFyX19hdXRvX3VwZGF0ZV9tb250aHNfbnVtYmVyX19vbl9yZXNpemUoIHJlc291cmNlX2lkICl7XHJcblxyXG5cdGlmICggdHJ1ZSA9PT0gX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAnaXNfYWxsb3dfc2V2ZXJhbF9tb250aHNfb25fbW9iaWxlJyApICkge1xyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0dmFyIGxvY2FsX19udW1iZXJfb2ZfbW9udGhzID0gcGFyc2VJbnQoIF93cGJjLmNhbGVuZGFyX19nZXRfcGFyYW1fdmFsdWUoIHJlc291cmNlX2lkLCAnY2FsZW5kYXJfbnVtYmVyX29mX21vbnRocycgKSApO1xyXG5cclxuXHRpZiAoIGxvY2FsX19udW1iZXJfb2ZfbW9udGhzID4gMSApe1xyXG5cclxuXHRcdGlmICggalF1ZXJ5KCB3aW5kb3cgKS53aWR0aCgpIDw9IDc4MiApe1xyXG5cdFx0XHR3cGJjX2NhbGVuZGFyX191cGRhdGVfbW9udGhzX251bWJlciggcmVzb3VyY2VfaWQsIDEgKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHdwYmNfY2FsZW5kYXJfX3VwZGF0ZV9tb250aHNfbnVtYmVyKCByZXNvdXJjZV9pZCwgbG9jYWxfX251bWJlcl9vZl9tb250aHMgKTtcclxuXHRcdH1cclxuXHJcblx0fVxyXG59XHJcblxyXG4vKipcclxuICogQXV0byBVcGRhdGUgTnVtYmVyIG9mIE1vbnRocyBpbiAgIEFMTCAgIENhbGVuZGFyc1xyXG4gKlxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19jYWxlbmRhcnNfX2F1dG9fdXBkYXRlX21vbnRoc19udW1iZXIoKXtcclxuXHJcblx0dmFyIGFsbF9jYWxlbmRhcnNfYXJyID0gX3dwYmMuY2FsZW5kYXJzX2FsbF9fZ2V0KCk7XHJcblxyXG5cdC8vIFRoaXMgTE9PUCBcImZvciBpblwiIGlzIEdPT0QsIGJlY2F1c2Ugd2UgY2hlY2sgIGhlcmUga2V5cyAgICAnY2FsZW5kYXJfJyA9PT0gY2FsZW5kYXJfaWQuc2xpY2UoIDAsIDkgKVxyXG5cdGZvciAoIHZhciBjYWxlbmRhcl9pZCBpbiBhbGxfY2FsZW5kYXJzX2FyciApe1xyXG5cdFx0aWYgKCAnY2FsZW5kYXJfJyA9PT0gY2FsZW5kYXJfaWQuc2xpY2UoIDAsIDkgKSApe1xyXG5cdFx0XHR2YXIgcmVzb3VyY2VfaWQgPSBwYXJzZUludCggY2FsZW5kYXJfaWQuc2xpY2UoIDkgKSApO1x0XHRcdC8vICAnY2FsZW5kYXJfMycgLT4gM1xyXG5cdFx0XHRpZiAoIHJlc291cmNlX2lkID4gMCApe1xyXG5cdFx0XHRcdHdwYmNfY2FsZW5kYXJfX2F1dG9fdXBkYXRlX21vbnRoc19udW1iZXJfX29uX3Jlc2l6ZSggcmVzb3VyY2VfaWQgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqIElmIGJyb3dzZXIgd2luZG93IGNoYW5nZWQsICB0aGVuICB1cGRhdGUgbnVtYmVyIG9mIG1vbnRocy5cclxuICovXHJcbmpRdWVyeSggd2luZG93ICkub24oICdyZXNpemUnLCBmdW5jdGlvbiAoKXtcclxuXHR3cGJjX2NhbGVuZGFyc19fYXV0b191cGRhdGVfbW9udGhzX251bWJlcigpO1xyXG59ICk7XHJcblxyXG4vKipcclxuICogQXV0byB1cGRhdGUgY2FsZW5kYXIgbnVtYmVyIG9mIG1vbnRocyBvbiBpbml0aWFsIHBhZ2UgbG9hZFxyXG4gKi9cclxualF1ZXJ5KCBkb2N1bWVudCApLnJlYWR5KCBmdW5jdGlvbiAoKXtcclxuXHR2YXIgY2xvc2VkX3RpbWVyID0gc2V0VGltZW91dCggZnVuY3Rpb24gKCl7XHJcblx0XHR3cGJjX2NhbGVuZGFyc19fYXV0b191cGRhdGVfbW9udGhzX251bWJlcigpO1xyXG5cdH0sIDEwMCApO1xyXG59KTtcclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vKiAgPT0gIENoZWNrOiBjYWxlbmRhcl9kYXRlc19zdGFydDogXCIyMDI2LTAxLTAxXCIsIGNhbGVuZGFyX2RhdGVzX2VuZDogXCIyMDI2LTEyLTMxXCIgPT0gIC8vIEZpeEluOiAxMC4xMy4xLjQuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cdC8qKlxyXG5cdCAqIEdldCBTdGFydCBKUyBEYXRlIG9mIHN0YXJ0aW5nIGRhdGVzIGluIGNhbGVuZGFyLCBmcm9tIHRoZSBfd3BiYyBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gaW50ZWdlciByZXNvdXJjZV9pZCAtIHJlc291cmNlIElELCBlLmcuOiAxLlxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfY2FsZW5kYXJfX2dldF9kYXRlc19zdGFydCggcmVzb3VyY2VfaWQgKSB7XHJcblx0XHRyZXR1cm4gd3BiY19jYWxlbmRhcl9fZ2V0X2RhdGVfcGFyYW1ldGVyKCByZXNvdXJjZV9pZCwgJ2NhbGVuZGFyX2RhdGVzX3N0YXJ0JyApO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0IEVuZCBKUyBEYXRlIG9mIGVuZGluZyBkYXRlcyBpbiBjYWxlbmRhciwgZnJvbSB0aGUgX3dwYmMgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIGludGVnZXIgcmVzb3VyY2VfaWQgLSByZXNvdXJjZSBJRCwgZS5nLjogMS5cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2NhbGVuZGFyX19nZXRfZGF0ZXNfZW5kKHJlc291cmNlX2lkKSB7XHJcblx0XHRyZXR1cm4gd3BiY19jYWxlbmRhcl9fZ2V0X2RhdGVfcGFyYW1ldGVyKCByZXNvdXJjZV9pZCwgJ2NhbGVuZGFyX2RhdGVzX2VuZCcgKTtcclxuXHR9XHJcblxyXG4vKipcclxuICogR2V0IHZhbGlkYXRlcyBkYXRlIHBhcmFtZXRlci5cclxuICpcclxuICogQHBhcmFtIHJlc291cmNlX2lkICAgLSAxXHJcbiAqIEBwYXJhbSBwYXJhbWV0ZXJfc3RyIC0gJ2NhbGVuZGFyX2RhdGVzX3N0YXJ0JyB8ICdjYWxlbmRhcl9kYXRlc19lbmQnIHwgLi4uXHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2NhbGVuZGFyX19nZXRfZGF0ZV9wYXJhbWV0ZXIocmVzb3VyY2VfaWQsIHBhcmFtZXRlcl9zdHIpIHtcclxuXHJcblx0dmFyIGRhdGVfZXhwZWN0ZWRfeW1kID0gX3dwYmMuY2FsZW5kYXJfX2dldF9wYXJhbV92YWx1ZSggcmVzb3VyY2VfaWQsIHBhcmFtZXRlcl9zdHIgKTtcclxuXHJcblx0aWYgKCAhIGRhdGVfZXhwZWN0ZWRfeW1kICkge1xyXG5cdFx0cmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAvLyAnJyB8IDAgfCBudWxsIHwgdW5kZWZpbmVkICAtPiBmYWxzZS5cclxuXHR9XHJcblxyXG5cdGlmICggLTEgIT09IGRhdGVfZXhwZWN0ZWRfeW1kLmluZGV4T2YoICctJyApICkge1xyXG5cclxuXHRcdHZhciBkYXRlX2V4cGVjdGVkX3ltZF9hcnIgPSBkYXRlX2V4cGVjdGVkX3ltZC5zcGxpdCggJy0nICk7XHQvLyAnMjAyNS0wNy0yNicgLT4gWycyMDI1JywgJzA3JywgJzI2J11cclxuXHJcblx0XHRpZiAoIGRhdGVfZXhwZWN0ZWRfeW1kX2Fyci5sZW5ndGggPiAwICkge1xyXG5cdFx0XHR2YXIgeWVhciAgPSAoZGF0ZV9leHBlY3RlZF95bWRfYXJyLmxlbmd0aCA+IDApID8gcGFyc2VJbnQoIGRhdGVfZXhwZWN0ZWRfeW1kX2FyclswXSApIDogbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1x0Ly8gWWVhci5cclxuXHRcdFx0dmFyIG1vbnRoID0gKGRhdGVfZXhwZWN0ZWRfeW1kX2Fyci5sZW5ndGggPiAxKSA/IChwYXJzZUludCggZGF0ZV9leHBlY3RlZF95bWRfYXJyWzFdICkgLSAxKSA6IDA7ICAvLyAobW9udGggLSAxKSBvciAwIC0gSmFuLlxyXG5cdFx0XHR2YXIgZGF5ICAgPSAoZGF0ZV9leHBlY3RlZF95bWRfYXJyLmxlbmd0aCA+IDIpID8gcGFyc2VJbnQoIGRhdGVfZXhwZWN0ZWRfeW1kX2FyclsyXSApIDogMTsgIC8vIGRhdGUgb3IgT3RoZXJ3aXNlIDFzdCBvZiBtb250aFxyXG5cclxuXHRcdFx0dmFyIGRhdGVfanMgPSBuZXcgRGF0ZSggeWVhciwgbW9udGgsIGRheSwgMCwgMCwgMCwgMCApO1xyXG5cclxuXHRcdFx0cmV0dXJuIGRhdGVfanM7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZmFsc2U7ICAvLyBGYWxsYmFjaywgIGlmIHdlIG5vdCBwYXJzZWQgdGhpcyBwYXJhbWV0ZXIgICdjYWxlbmRhcl9kYXRlc19zdGFydCcgPSAnMjAyNS0wNy0yNicsICBmb3IgZXhhbXBsZSBiZWNhdXNlIG9mICdjYWxlbmRhcl9kYXRlc19zdGFydCcgPSAnc2ZzZGYnLlxyXG59XHJcbiIsIi8qKlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKlx0aW5jbHVkZXMvX19qcy9jYWwvZGF5c19zZWxlY3RfY3VzdG9tLmpzXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqL1xyXG5cclxuLy8gRml4SW46IDkuOC45LjIuXHJcblxyXG4vKipcclxuICogUmUtSW5pdCBDYWxlbmRhciBhbmQgUmUtUmVuZGVyIGl0LlxyXG4gKlxyXG4gKiBAcGFyYW0gcmVzb3VyY2VfaWRcclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfY2FsX19yZV9pbml0KCByZXNvdXJjZV9pZCApe1xyXG5cclxuXHQvLyBSZW1vdmUgQ0xBU1MgIGZvciBhYmlsaXR5IHRvIHJlLXJlbmRlciBhbmQgcmVpbml0IGNhbGVuZGFyLlxyXG5cdGpRdWVyeSggJyNjYWxlbmRhcl9ib29raW5nJyArIHJlc291cmNlX2lkICkucmVtb3ZlQ2xhc3MoICdoYXNEYXRlcGljaycgKTtcclxuXHR3cGJjX2NhbGVuZGFyX3Nob3coIHJlc291cmNlX2lkICk7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogUmUtSW5pdCBwcmV2aW91c2x5ICBzYXZlZCBkYXlzIHNlbGVjdGlvbiAgdmFyaWFibGVzLlxyXG4gKlxyXG4gKiBAcGFyYW0gcmVzb3VyY2VfaWRcclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfY2FsX2RheXNfc2VsZWN0X19yZV9pbml0KCByZXNvdXJjZV9pZCApe1xyXG5cclxuXHRfd3BiYy5jYWxlbmRhcl9fc2V0X3BhcmFtX3ZhbHVlKCByZXNvdXJjZV9pZCwgJ3NhdmVkX3ZhcmlhYmxlX19fZGF5c19zZWxlY3RfaW5pdGlhbCdcclxuXHRcdCwge1xyXG5cdFx0XHQnZHluYW1pY19fZGF5c19taW4nICAgICAgICA6IF93cGJjLmNhbGVuZGFyX19nZXRfcGFyYW1fdmFsdWUoIHJlc291cmNlX2lkLCAnZHluYW1pY19fZGF5c19taW4nICksXHJcblx0XHRcdCdkeW5hbWljX19kYXlzX21heCcgICAgICAgIDogX3dwYmMuY2FsZW5kYXJfX2dldF9wYXJhbV92YWx1ZSggcmVzb3VyY2VfaWQsICdkeW5hbWljX19kYXlzX21heCcgKSxcclxuXHRcdFx0J2R5bmFtaWNfX2RheXNfc3BlY2lmaWMnICAgOiBfd3BiYy5jYWxlbmRhcl9fZ2V0X3BhcmFtX3ZhbHVlKCByZXNvdXJjZV9pZCwgJ2R5bmFtaWNfX2RheXNfc3BlY2lmaWMnICksXHJcblx0XHRcdCdkeW5hbWljX193ZWVrX2RheXNfX3N0YXJ0JzogX3dwYmMuY2FsZW5kYXJfX2dldF9wYXJhbV92YWx1ZSggcmVzb3VyY2VfaWQsICdkeW5hbWljX193ZWVrX2RheXNfX3N0YXJ0JyApLFxyXG5cdFx0XHQnZml4ZWRfX2RheXNfbnVtJyAgICAgICAgICA6IF93cGJjLmNhbGVuZGFyX19nZXRfcGFyYW1fdmFsdWUoIHJlc291cmNlX2lkLCAnZml4ZWRfX2RheXNfbnVtJyApLFxyXG5cdFx0XHQnZml4ZWRfX3dlZWtfZGF5c19fc3RhcnQnICA6IF93cGJjLmNhbGVuZGFyX19nZXRfcGFyYW1fdmFsdWUoIHJlc291cmNlX2lkLCAnZml4ZWRfX3dlZWtfZGF5c19fc3RhcnQnIClcclxuXHRcdH1cclxuXHQpO1xyXG59XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbi8qKlxyXG4gKiBTZXQgU2luZ2xlIERheSBzZWxlY3Rpb24gLSBhZnRlciBwYWdlIGxvYWRcclxuICpcclxuICogQHBhcmFtIHJlc291cmNlX2lkXHRcdElEIG9mIGJvb2tpbmcgcmVzb3VyY2VcclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfY2FsX3JlYWR5X2RheXNfc2VsZWN0X19zaW5nbGUoIHJlc291cmNlX2lkICl7XHJcblxyXG5cdC8vIFJlLWRlZmluZSBzZWxlY3Rpb24sIG9ubHkgYWZ0ZXIgcGFnZSBsb2FkZWQgd2l0aCBhbGwgaW5pdCB2YXJzXHJcblx0alF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpe1xyXG5cclxuXHRcdC8vIFdhaXQgMSBzZWNvbmQsIGp1c3QgdG8gIGJlIHN1cmUsIHRoYXQgYWxsIGluaXQgdmFycyBkZWZpbmVkXHJcblx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XHJcblxyXG5cdFx0XHR3cGJjX2NhbF9kYXlzX3NlbGVjdF9fc2luZ2xlKCByZXNvdXJjZV9pZCApO1xyXG5cclxuXHRcdH0sIDEwMDApO1xyXG5cdH0pO1xyXG59XHJcblxyXG4vKipcclxuICogU2V0IFNpbmdsZSBEYXkgc2VsZWN0aW9uXHJcbiAqIENhbiBiZSBydW4gYXQgYW55ICB0aW1lLCAgd2hlbiAgY2FsZW5kYXIgZGVmaW5lZCAtIHVzZWZ1bCBmb3IgY29uc29sZSBydW4uXHJcbiAqXHJcbiAqIEBwYXJhbSByZXNvdXJjZV9pZFx0XHRJRCBvZiBib29raW5nIHJlc291cmNlXHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2NhbF9kYXlzX3NlbGVjdF9fc2luZ2xlKCByZXNvdXJjZV9pZCApe1xyXG5cclxuXHRfd3BiYy5jYWxlbmRhcl9fc2V0X3BhcmFtZXRlcnMoIHJlc291cmNlX2lkLCB7J2RheXNfc2VsZWN0X21vZGUnOiAnc2luZ2xlJ30gKTtcclxuXHJcblx0d3BiY19jYWxfZGF5c19zZWxlY3RfX3JlX2luaXQoIHJlc291cmNlX2lkICk7XHJcblx0d3BiY19jYWxfX3JlX2luaXQoIHJlc291cmNlX2lkICk7XHJcbn1cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuLyoqXHJcbiAqIFNldCBNdWx0aXBsZSBEYXlzIHNlbGVjdGlvbiAgLSBhZnRlciBwYWdlIGxvYWRcclxuICpcclxuICogQHBhcmFtIHJlc291cmNlX2lkXHRcdElEIG9mIGJvb2tpbmcgcmVzb3VyY2VcclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfY2FsX3JlYWR5X2RheXNfc2VsZWN0X19tdWx0aXBsZSggcmVzb3VyY2VfaWQgKXtcclxuXHJcblx0Ly8gUmUtZGVmaW5lIHNlbGVjdGlvbiwgb25seSBhZnRlciBwYWdlIGxvYWRlZCB3aXRoIGFsbCBpbml0IHZhcnNcclxuXHRqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7XHJcblxyXG5cdFx0Ly8gV2FpdCAxIHNlY29uZCwganVzdCB0byAgYmUgc3VyZSwgdGhhdCBhbGwgaW5pdCB2YXJzIGRlZmluZWRcclxuXHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcclxuXHJcblx0XHRcdHdwYmNfY2FsX2RheXNfc2VsZWN0X19tdWx0aXBsZSggcmVzb3VyY2VfaWQgKTtcclxuXHJcblx0XHR9LCAxMDAwKTtcclxuXHR9KTtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBTZXQgTXVsdGlwbGUgRGF5cyBzZWxlY3Rpb25cclxuICogQ2FuIGJlIHJ1biBhdCBhbnkgIHRpbWUsICB3aGVuICBjYWxlbmRhciBkZWZpbmVkIC0gdXNlZnVsIGZvciBjb25zb2xlIHJ1bi5cclxuICpcclxuICogQHBhcmFtIHJlc291cmNlX2lkXHRcdElEIG9mIGJvb2tpbmcgcmVzb3VyY2VcclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfY2FsX2RheXNfc2VsZWN0X19tdWx0aXBsZSggcmVzb3VyY2VfaWQgKXtcclxuXHJcblx0X3dwYmMuY2FsZW5kYXJfX3NldF9wYXJhbWV0ZXJzKCByZXNvdXJjZV9pZCwgeydkYXlzX3NlbGVjdF9tb2RlJzogJ211bHRpcGxlJ30gKTtcclxuXHJcblx0d3BiY19jYWxfZGF5c19zZWxlY3RfX3JlX2luaXQoIHJlc291cmNlX2lkICk7XHJcblx0d3BiY19jYWxfX3JlX2luaXQoIHJlc291cmNlX2lkICk7XHJcbn1cclxuXHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbi8qKlxyXG4gKiBTZXQgRml4ZWQgRGF5cyBzZWxlY3Rpb24gd2l0aCAgMSBtb3VzZSBjbGljayAgLSBhZnRlciBwYWdlIGxvYWRcclxuICpcclxuICogQGludGVnZXIgcmVzb3VyY2VfaWRcdFx0XHQtIDFcdFx0XHRcdCAgIC0tIElEIG9mIGJvb2tpbmcgcmVzb3VyY2UgKGNhbGVuZGFyKSAtXHJcbiAqIEBpbnRlZ2VyIGRheXNfbnVtYmVyXHRcdFx0LSAzXHRcdFx0XHQgICAtLSBudW1iZXIgb2YgZGF5cyB0byAgc2VsZWN0XHQtXHJcbiAqIEBhcnJheSB3ZWVrX2RheXNfX3N0YXJ0XHQtIFstMV0gfCBbIDEsIDVdICAgLS0gIHsgLTEgLSBBbnkgfCAwIC0gU3UsICAxIC0gTW8sICAyIC0gVHUsIDMgLSBXZSwgNCAtIFRoLCA1IC0gRnIsIDYgLSBTYXQgfVxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19jYWxfcmVhZHlfZGF5c19zZWxlY3RfX2ZpeGVkKCByZXNvdXJjZV9pZCwgZGF5c19udW1iZXIsIHdlZWtfZGF5c19fc3RhcnQgPSBbLTFdICl7XHJcblxyXG5cdC8vIFJlLWRlZmluZSBzZWxlY3Rpb24sIG9ubHkgYWZ0ZXIgcGFnZSBsb2FkZWQgd2l0aCBhbGwgaW5pdCB2YXJzXHJcblx0alF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpe1xyXG5cclxuXHRcdC8vIFdhaXQgMSBzZWNvbmQsIGp1c3QgdG8gIGJlIHN1cmUsIHRoYXQgYWxsIGluaXQgdmFycyBkZWZpbmVkXHJcblx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XHJcblxyXG5cdFx0XHR3cGJjX2NhbF9kYXlzX3NlbGVjdF9fZml4ZWQoIHJlc291cmNlX2lkLCBkYXlzX251bWJlciwgd2Vla19kYXlzX19zdGFydCApO1xyXG5cclxuXHRcdH0sIDEwMDApO1xyXG5cdH0pO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIFNldCBGaXhlZCBEYXlzIHNlbGVjdGlvbiB3aXRoICAxIG1vdXNlIGNsaWNrXHJcbiAqIENhbiBiZSBydW4gYXQgYW55ICB0aW1lLCAgd2hlbiAgY2FsZW5kYXIgZGVmaW5lZCAtIHVzZWZ1bCBmb3IgY29uc29sZSBydW4uXHJcbiAqXHJcbiAqIEBpbnRlZ2VyIHJlc291cmNlX2lkXHRcdFx0LSAxXHRcdFx0XHQgICAtLSBJRCBvZiBib29raW5nIHJlc291cmNlIChjYWxlbmRhcikgLVxyXG4gKiBAaW50ZWdlciBkYXlzX251bWJlclx0XHRcdC0gM1x0XHRcdFx0ICAgLS0gbnVtYmVyIG9mIGRheXMgdG8gIHNlbGVjdFx0LVxyXG4gKiBAYXJyYXkgd2Vla19kYXlzX19zdGFydFx0LSBbLTFdIHwgWyAxLCA1XSAgIC0tICB7IC0xIC0gQW55IHwgMCAtIFN1LCAgMSAtIE1vLCAgMiAtIFR1LCAzIC0gV2UsIDQgLSBUaCwgNSAtIEZyLCA2IC0gU2F0IH1cclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfY2FsX2RheXNfc2VsZWN0X19maXhlZCggcmVzb3VyY2VfaWQsIGRheXNfbnVtYmVyLCB3ZWVrX2RheXNfX3N0YXJ0ID0gWy0xXSApe1xyXG5cclxuXHRfd3BiYy5jYWxlbmRhcl9fc2V0X3BhcmFtZXRlcnMoIHJlc291cmNlX2lkLCB7J2RheXNfc2VsZWN0X21vZGUnOiAnZml4ZWQnfSApO1xyXG5cclxuXHRfd3BiYy5jYWxlbmRhcl9fc2V0X3BhcmFtZXRlcnMoIHJlc291cmNlX2lkLCB7J2ZpeGVkX19kYXlzX251bSc6IHBhcnNlSW50KCBkYXlzX251bWJlciApfSApO1x0XHRcdC8vIE51bWJlciBvZiBkYXlzIHNlbGVjdGlvbiB3aXRoIDEgbW91c2UgY2xpY2tcclxuXHRfd3BiYy5jYWxlbmRhcl9fc2V0X3BhcmFtZXRlcnMoIHJlc291cmNlX2lkLCB7J2ZpeGVkX193ZWVrX2RheXNfX3N0YXJ0Jzogd2Vla19kYXlzX19zdGFydH0gKTsgXHQvLyB7IC0xIC0gQW55IHwgMCAtIFN1LCAgMSAtIE1vLCAgMiAtIFR1LCAzIC0gV2UsIDQgLSBUaCwgNSAtIEZyLCA2IC0gU2F0IH1cclxuXHJcblx0d3BiY19jYWxfZGF5c19zZWxlY3RfX3JlX2luaXQoIHJlc291cmNlX2lkICk7XHJcblx0d3BiY19jYWxfX3JlX2luaXQoIHJlc291cmNlX2lkICk7XHJcbn1cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuLyoqXHJcbiAqIFNldCBSYW5nZSBEYXlzIHNlbGVjdGlvbiAgd2l0aCAgMiBtb3VzZSBjbGlja3MgIC0gYWZ0ZXIgcGFnZSBsb2FkXHJcbiAqXHJcbiAqIEBpbnRlZ2VyIHJlc291cmNlX2lkXHRcdFx0LSAxXHRcdFx0XHQgICBcdFx0LS0gSUQgb2YgYm9va2luZyByZXNvdXJjZSAoY2FsZW5kYXIpXHJcbiAqIEBpbnRlZ2VyIGRheXNfbWluXHRcdFx0LSA3XHRcdFx0XHQgICBcdFx0LS0gTWluIG51bWJlciBvZiBkYXlzIHRvIHNlbGVjdFxyXG4gKiBAaW50ZWdlciBkYXlzX21heFx0XHRcdC0gMzBcdFx0XHQgICBcdFx0LS0gTWF4IG51bWJlciBvZiBkYXlzIHRvIHNlbGVjdFxyXG4gKiBAYXJyYXkgZGF5c19zcGVjaWZpY1x0XHRcdC0gW10gfCBbNywxNCwyMSwyOF1cdFx0LS0gUmVzdHJpY3Rpb24gZm9yIFNwZWNpZmljIG51bWJlciBvZiBkYXlzIHNlbGVjdGlvblxyXG4gKiBAYXJyYXkgd2Vla19kYXlzX19zdGFydFx0XHQtIFstMV0gfCBbIDEsIDVdICAgXHRcdC0tICB7IC0xIC0gQW55IHwgMCAtIFN1LCAgMSAtIE1vLCAgMiAtIFR1LCAzIC0gV2UsIDQgLSBUaCwgNSAtIEZyLCA2IC0gU2F0IH1cclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfY2FsX3JlYWR5X2RheXNfc2VsZWN0X19yYW5nZSggcmVzb3VyY2VfaWQsIGRheXNfbWluLCBkYXlzX21heCwgZGF5c19zcGVjaWZpYyA9IFtdLCB3ZWVrX2RheXNfX3N0YXJ0ID0gWy0xXSApe1xyXG5cclxuXHQvLyBSZS1kZWZpbmUgc2VsZWN0aW9uLCBvbmx5IGFmdGVyIHBhZ2UgbG9hZGVkIHdpdGggYWxsIGluaXQgdmFyc1xyXG5cdGpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXtcclxuXHJcblx0XHQvLyBXYWl0IDEgc2Vjb25kLCBqdXN0IHRvICBiZSBzdXJlLCB0aGF0IGFsbCBpbml0IHZhcnMgZGVmaW5lZFxyXG5cdFx0c2V0VGltZW91dChmdW5jdGlvbigpe1xyXG5cclxuXHRcdFx0d3BiY19jYWxfZGF5c19zZWxlY3RfX3JhbmdlKCByZXNvdXJjZV9pZCwgZGF5c19taW4sIGRheXNfbWF4LCBkYXlzX3NwZWNpZmljLCB3ZWVrX2RheXNfX3N0YXJ0ICk7XHJcblx0XHR9LCAxMDAwKTtcclxuXHR9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNldCBSYW5nZSBEYXlzIHNlbGVjdGlvbiAgd2l0aCAgMiBtb3VzZSBjbGlja3NcclxuICogQ2FuIGJlIHJ1biBhdCBhbnkgIHRpbWUsICB3aGVuICBjYWxlbmRhciBkZWZpbmVkIC0gdXNlZnVsIGZvciBjb25zb2xlIHJ1bi5cclxuICpcclxuICogQGludGVnZXIgcmVzb3VyY2VfaWRcdFx0XHQtIDFcdFx0XHRcdCAgIFx0XHQtLSBJRCBvZiBib29raW5nIHJlc291cmNlIChjYWxlbmRhcilcclxuICogQGludGVnZXIgZGF5c19taW5cdFx0XHQtIDdcdFx0XHRcdCAgIFx0XHQtLSBNaW4gbnVtYmVyIG9mIGRheXMgdG8gc2VsZWN0XHJcbiAqIEBpbnRlZ2VyIGRheXNfbWF4XHRcdFx0LSAzMFx0XHRcdCAgIFx0XHQtLSBNYXggbnVtYmVyIG9mIGRheXMgdG8gc2VsZWN0XHJcbiAqIEBhcnJheSBkYXlzX3NwZWNpZmljXHRcdFx0LSBbXSB8IFs3LDE0LDIxLDI4XVx0XHQtLSBSZXN0cmljdGlvbiBmb3IgU3BlY2lmaWMgbnVtYmVyIG9mIGRheXMgc2VsZWN0aW9uXHJcbiAqIEBhcnJheSB3ZWVrX2RheXNfX3N0YXJ0XHRcdC0gWy0xXSB8IFsgMSwgNV0gICBcdFx0LS0gIHsgLTEgLSBBbnkgfCAwIC0gU3UsICAxIC0gTW8sICAyIC0gVHUsIDMgLSBXZSwgNCAtIFRoLCA1IC0gRnIsIDYgLSBTYXQgfVxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19jYWxfZGF5c19zZWxlY3RfX3JhbmdlKCByZXNvdXJjZV9pZCwgZGF5c19taW4sIGRheXNfbWF4LCBkYXlzX3NwZWNpZmljID0gW10sIHdlZWtfZGF5c19fc3RhcnQgPSBbLTFdICl7XHJcblxyXG5cdF93cGJjLmNhbGVuZGFyX19zZXRfcGFyYW1ldGVycyggIHJlc291cmNlX2lkLCB7J2RheXNfc2VsZWN0X21vZGUnOiAnZHluYW1pYyd9ICApO1xyXG5cdF93cGJjLmNhbGVuZGFyX19zZXRfcGFyYW1fdmFsdWUoIHJlc291cmNlX2lkLCAnZHluYW1pY19fZGF5c19taW4nICAgICAgICAgLCBwYXJzZUludCggZGF5c19taW4gKSAgKTsgICAgICAgICAgIFx0XHQvLyBNaW4uIE51bWJlciBvZiBkYXlzIHNlbGVjdGlvbiB3aXRoIDIgbW91c2UgY2xpY2tzXHJcblx0X3dwYmMuY2FsZW5kYXJfX3NldF9wYXJhbV92YWx1ZSggcmVzb3VyY2VfaWQsICdkeW5hbWljX19kYXlzX21heCcgICAgICAgICAsIHBhcnNlSW50KCBkYXlzX21heCApICApOyAgICAgICAgICBcdFx0Ly8gTWF4LiBOdW1iZXIgb2YgZGF5cyBzZWxlY3Rpb24gd2l0aCAyIG1vdXNlIGNsaWNrc1xyXG5cdF93cGJjLmNhbGVuZGFyX19zZXRfcGFyYW1fdmFsdWUoIHJlc291cmNlX2lkLCAnZHluYW1pY19fZGF5c19zcGVjaWZpYycgICAgLCBkYXlzX3NwZWNpZmljICApO1x0ICAgICAgXHRcdFx0XHQvLyBFeGFtcGxlIFs1LDddXHJcblx0X3dwYmMuY2FsZW5kYXJfX3NldF9wYXJhbV92YWx1ZSggcmVzb3VyY2VfaWQsICdkeW5hbWljX193ZWVrX2RheXNfX3N0YXJ0JyAsIHdlZWtfZGF5c19fc3RhcnQgICk7ICBcdFx0XHRcdFx0Ly8geyAtMSAtIEFueSB8IDAgLSBTdSwgIDEgLSBNbywgIDIgLSBUdSwgMyAtIFdlLCA0IC0gVGgsIDUgLSBGciwgNiAtIFNhdCB9XHJcblxyXG5cdHdwYmNfY2FsX2RheXNfc2VsZWN0X19yZV9pbml0KCByZXNvdXJjZV9pZCApO1xyXG5cdHdwYmNfY2FsX19yZV9pbml0KCByZXNvdXJjZV9pZCApO1xyXG59XHJcbiIsIi8qKlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKlx0aW5jbHVkZXMvX19qcy9jYWxfYWp4X2xvYWQvd3BiY19jYWxfYWp4LmpzXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqL1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vICBBIGogYSB4ICAgIEwgbyBhIGQgICAgQyBhIGwgZSBuIGQgYSByICAgIEQgYSB0IGFcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5mdW5jdGlvbiB3cGJjX2NhbGVuZGFyX19sb2FkX2RhdGFfX2FqeCggcGFyYW1zICl7XHJcblxyXG5cdC8vIEZpeEluOiA5LjguNi4yLlxyXG5cdHdwYmNfY2FsZW5kYXJfX2xvYWRpbmdfX3N0YXJ0KCBwYXJhbXNbJ3Jlc291cmNlX2lkJ10gKTtcclxuXHJcblx0Ly8gVHJpZ2dlciBldmVudCBmb3IgY2FsZW5kYXIgYmVmb3JlIGxvYWRpbmcgQm9va2luZyBkYXRhLCAgYnV0IGFmdGVyIHNob3dpbmcgQ2FsZW5kYXIuXHJcblx0aWYgKCBqUXVlcnkoICcjY2FsZW5kYXJfYm9va2luZycgKyBwYXJhbXNbJ3Jlc291cmNlX2lkJ10gKS5sZW5ndGggPiAwICl7XHJcblx0XHR2YXIgdGFyZ2V0X2VsbSA9IGpRdWVyeSggJ2JvZHknICkudHJpZ2dlciggXCJ3cGJjX2NhbGVuZGFyX2FqeF9fYmVmb3JlX2xvYWRlZF9kYXRhXCIsIFtwYXJhbXNbJ3Jlc291cmNlX2lkJ11dICk7XHJcblx0XHQgLy9qUXVlcnkoICdib2R5JyApLm9uKCAnd3BiY19jYWxlbmRhcl9hanhfX2JlZm9yZV9sb2FkZWRfZGF0YScsIGZ1bmN0aW9uKCBldmVudCwgcmVzb3VyY2VfaWQgKSB7IC4uLiB9ICk7XHJcblx0fVxyXG5cclxuXHRpZiAoIHdwYmNfYmFsYW5jZXJfX2lzX3dhaXQoIHBhcmFtcyAsICd3cGJjX2NhbGVuZGFyX19sb2FkX2RhdGFfX2FqeCcgKSApe1xyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0Ly8gRml4SW46IDkuOC42LjIuXHJcblx0d3BiY19jYWxlbmRhcl9fYmx1cl9fc3RvcCggcGFyYW1zWydyZXNvdXJjZV9pZCddICk7XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gPT0gR2V0IHN0YXJ0IC8gZW5kIGRhdGVzIGZyb20gIHRoZSBCb29raW5nIENhbGVuZGFyIHNob3J0Y29kZS4gPT1cclxuXHQvLyBFeGFtcGxlOiBbYm9va2luZyBjYWxlbmRhcl9kYXRlc19zdGFydD0nMjAyNi0wMS0wMScgY2FsZW5kYXJfZGF0ZXNfZW5kPScyMDI2LTEyLTMxJyAgcmVzb3VyY2VfaWQ9MV0gICAgICAgICAgICAgIC8vIEZpeEluOiAxMC4xMy4xLjQuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRpZiAoIGZhbHNlICE9PSB3cGJjX2NhbGVuZGFyX19nZXRfZGF0ZXNfc3RhcnQoIHBhcmFtc1sncmVzb3VyY2VfaWQnXSApICkge1xyXG5cdFx0aWYgKCAhIHBhcmFtc1snZGF0ZXNfdG9fY2hlY2snXSApIHsgcGFyYW1zWydkYXRlc190b19jaGVjayddID0gW107IH1cclxuXHRcdHZhciBkYXRlc19zdGFydCA9IHdwYmNfY2FsZW5kYXJfX2dldF9kYXRlc19zdGFydCggcGFyYW1zWydyZXNvdXJjZV9pZCddICk7ICAvLyBFLmcuIC0gbG9jYWxfX21pbl9kYXRlID0gbmV3IERhdGUoIDIwMjUsIDAsIDEgKTtcclxuXHRcdGlmICggZmFsc2UgIT09IGRhdGVzX3N0YXJ0ICl7XHJcblx0XHRcdHBhcmFtc1snZGF0ZXNfdG9fY2hlY2snXVswXSA9IHdwYmNfX2dldF9fc3FsX2NsYXNzX2RhdGUoIGRhdGVzX3N0YXJ0ICk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmICggZmFsc2UgIT09IHdwYmNfY2FsZW5kYXJfX2dldF9kYXRlc19lbmQoIHBhcmFtc1sncmVzb3VyY2VfaWQnXSApICkge1xyXG5cdFx0aWYgKCAhcGFyYW1zWydkYXRlc190b19jaGVjayddICkgeyBwYXJhbXNbJ2RhdGVzX3RvX2NoZWNrJ10gPSBbXTsgfVxyXG5cdFx0dmFyIGRhdGVzX2VuZCA9IHdwYmNfY2FsZW5kYXJfX2dldF9kYXRlc19lbmQoIHBhcmFtc1sncmVzb3VyY2VfaWQnXSApOyAgLy8gRS5nLiAtIGxvY2FsX19taW5fZGF0ZSA9IG5ldyBEYXRlKCAyMDI1LCAwLCAxICk7XHJcblx0XHRpZiAoIGZhbHNlICE9PSBkYXRlc19lbmQgKSB7XHJcblx0XHRcdHBhcmFtc1snZGF0ZXNfdG9fY2hlY2snXVsxXSA9IHdwYmNfX2dldF9fc3FsX2NsYXNzX2RhdGUoIGRhdGVzX2VuZCApO1xyXG5cdFx0XHRpZiAoICFwYXJhbXNbJ2RhdGVzX3RvX2NoZWNrJ11bMF0gKSB7XHJcblx0XHRcdFx0cGFyYW1zWydkYXRlc190b19jaGVjayddWzBdID0gd3BiY19fZ2V0X19zcWxfY2xhc3NfZGF0ZSggbmV3IERhdGUoKSApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4vLyBjb25zb2xlLmdyb3VwRW5kKCk7IGNvbnNvbGUudGltZSgncmVzb3VyY2VfaWRfJyArIHBhcmFtc1sncmVzb3VyY2VfaWQnXSk7XHJcbmNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoICdXUEJDX0FKWF9DQUxFTkRBUl9MT0FEJyApOyBjb25zb2xlLmxvZyggJyA9PSBCZWZvcmUgQWpheCBTZW5kIC0gY2FsZW5kYXJzX2FsbF9fZ2V0KCkgPT0gJyAsIF93cGJjLmNhbGVuZGFyc19hbGxfX2dldCgpICk7XHJcblx0aWYgKCAnZnVuY3Rpb24nID09PSB0eXBlb2YgKHdwYmNfaG9va19faW5pdF90aW1lc2VsZWN0b3IpICkge1xyXG5cdFx0d3BiY19ob29rX19pbml0X3RpbWVzZWxlY3RvcigpO1xyXG5cdH1cclxuXHJcblx0Ly8gU3RhcnQgQWpheFxyXG5cdGpRdWVyeS5wb3N0KCB3cGJjX3VybF9hamF4LFxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdGFjdGlvbiAgICAgICAgICA6ICdXUEJDX0FKWF9DQUxFTkRBUl9MT0FEJyxcclxuXHRcdFx0XHRcdHdwYmNfYWp4X3VzZXJfaWQ6IF93cGJjLmdldF9zZWN1cmVfcGFyYW0oICd1c2VyX2lkJyApLFxyXG5cdFx0XHRcdFx0bm9uY2UgICAgICAgICAgIDogX3dwYmMuZ2V0X3NlY3VyZV9wYXJhbSggJ25vbmNlJyApLFxyXG5cdFx0XHRcdFx0d3BiY19hanhfbG9jYWxlIDogX3dwYmMuZ2V0X3NlY3VyZV9wYXJhbSggJ2xvY2FsZScgKSxcclxuXHJcblx0XHRcdFx0XHRjYWxlbmRhcl9yZXF1ZXN0X3BhcmFtcyA6IHBhcmFtcyBcdFx0XHRcdFx0XHQvLyBVc3VhbGx5IGxpa2U6IHsgJ3Jlc291cmNlX2lkJzogMSwgJ21heF9kYXlzX2NvdW50JzogMzY1IH1cclxuXHRcdFx0XHR9LFxyXG5cclxuXHRcdFx0XHQvKipcclxuXHRcdFx0XHQgKiBTIHUgYyBjIGUgcyBzXHJcblx0XHRcdFx0ICpcclxuXHRcdFx0XHQgKiBAcGFyYW0gcmVzcG9uc2VfZGF0YVx0XHQtXHRpdHMgb2JqZWN0IHJldHVybmVkIGZyb20gIEFqYXggLSBjbGFzcy1saXZlLXNlYXJjaC5waHBcclxuXHRcdFx0XHQgKiBAcGFyYW0gdGV4dFN0YXR1c1x0XHQtXHQnc3VjY2VzcydcclxuXHRcdFx0XHQgKiBAcGFyYW0ganFYSFJcdFx0XHRcdC1cdE9iamVjdFxyXG5cdFx0XHRcdCAqL1xyXG5cdFx0XHRcdGZ1bmN0aW9uICggcmVzcG9uc2VfZGF0YSwgdGV4dFN0YXR1cywganFYSFIgKSB7XHJcbi8vIGNvbnNvbGUudGltZUVuZCgncmVzb3VyY2VfaWRfJyArIHJlc3BvbnNlX2RhdGFbJ3Jlc291cmNlX2lkJ10pO1xyXG5jb25zb2xlLmxvZyggJyA9PSBSZXNwb25zZSBXUEJDX0FKWF9DQUxFTkRBUl9MT0FEID09ICcsIHJlc3BvbnNlX2RhdGEgKTsgY29uc29sZS5ncm91cEVuZCgpO1xyXG5cclxuXHRcdFx0XHRcdC8vIEZpeEluOiA5LjguNi4yLlxyXG5cdFx0XHRcdFx0dmFyIGFqeF9wb3N0X2RhdGFfX3Jlc291cmNlX2lkID0gd3BiY19nZXRfcmVzb3VyY2VfaWRfX2Zyb21fYWp4X3Bvc3RfZGF0YV91cmwoIHRoaXMuZGF0YSApO1xyXG5cdFx0XHRcdFx0d3BiY19iYWxhbmNlcl9fY29tcGxldGVkKCBhanhfcG9zdF9kYXRhX19yZXNvdXJjZV9pZCAsICd3cGJjX2NhbGVuZGFyX19sb2FkX2RhdGFfX2FqeCcgKTtcclxuXHJcblx0XHRcdFx0XHQvLyBQcm9iYWJseSBFcnJvclxyXG5cdFx0XHRcdFx0aWYgKCAodHlwZW9mIHJlc3BvbnNlX2RhdGEgIT09ICdvYmplY3QnKSB8fCAocmVzcG9uc2VfZGF0YSA9PT0gbnVsbCkgKXtcclxuXHJcblx0XHRcdFx0XHRcdHZhciBqcV9ub2RlICA9IHdwYmNfZ2V0X2NhbGVuZGFyX19qcV9ub2RlX19mb3JfbWVzc2FnZXMoIHRoaXMuZGF0YSApO1xyXG5cdFx0XHRcdFx0XHR2YXIgbWVzc2FnZV90eXBlID0gJ2luZm8nO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCAnJyA9PT0gcmVzcG9uc2VfZGF0YSApe1xyXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlX2RhdGEgPSAnVGhlIHNlcnZlciByZXNwb25kcyB3aXRoIGFuIGVtcHR5IHN0cmluZy4gVGhlIHNlcnZlciBwcm9iYWJseSBzdG9wcGVkIHdvcmtpbmcgdW5leHBlY3RlZGx5LiA8YnI+UGxlYXNlIGNoZWNrIHlvdXIgPHN0cm9uZz5lcnJvci5sb2c8L3N0cm9uZz4gaW4geW91ciBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmb3IgcmVsYXRpdmUgZXJyb3JzLic7XHJcblx0XHRcdFx0XHRcdFx0bWVzc2FnZV90eXBlID0gJ3dhcm5pbmcnO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBTaG93IE1lc3NhZ2VcclxuXHRcdFx0XHRcdFx0d3BiY19mcm9udF9lbmRfX3Nob3dfbWVzc2FnZSggcmVzcG9uc2VfZGF0YSAsIHsgJ3R5cGUnICAgICA6IG1lc3NhZ2VfdHlwZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3Nob3dfaGVyZSc6IHsnanFfbm9kZSc6IGpxX25vZGUsICd3aGVyZSc6ICdhZnRlcid9LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnaXNfYXBwZW5kJzogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3N0eWxlJyAgICA6ICd0ZXh0LWFsaWduOmxlZnQ7JyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2RlbGF5JyAgICA6IDBcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIFNob3cgQ2FsZW5kYXJcclxuXHRcdFx0XHRcdHdwYmNfY2FsZW5kYXJfX2xvYWRpbmdfX3N0b3AoIHJlc3BvbnNlX2RhdGFbICdyZXNvdXJjZV9pZCcgXSApO1xyXG5cclxuXHRcdFx0XHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0XHRcdC8vIEJvb2tpbmdzIC0gRGF0ZXNcclxuXHRcdFx0XHRcdF93cGJjLmJvb2tpbmdzX2luX2NhbGVuZGFyX19zZXRfZGF0ZXMoICByZXNwb25zZV9kYXRhWyAncmVzb3VyY2VfaWQnIF0sIHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsnZGF0ZXMnXSAgKTtcclxuXHJcblx0XHRcdFx0XHQvLyBCb29raW5ncyAtIENoaWxkIG9yIG9ubHkgc2luZ2xlIGJvb2tpbmcgcmVzb3VyY2UgaW4gZGF0ZXNcclxuXHRcdFx0XHRcdF93cGJjLmJvb2tpbmdfX3NldF9wYXJhbV92YWx1ZSggcmVzcG9uc2VfZGF0YVsgJ3Jlc291cmNlX2lkJyBdLCAncmVzb3VyY2VzX2lkX2Fycl9faW5fZGF0ZXMnLCByZXNwb25zZV9kYXRhWyAnYWp4X2RhdGEnIF1bICdyZXNvdXJjZXNfaWRfYXJyX19pbl9kYXRlcycgXSApO1xyXG5cclxuXHRcdFx0XHRcdC8vIEFnZ3JlZ2F0ZSBib29raW5nIHJlc291cmNlcywgIGlmIGFueSA/XHJcblx0XHRcdFx0XHRfd3BiYy5ib29raW5nX19zZXRfcGFyYW1fdmFsdWUoIHJlc3BvbnNlX2RhdGFbICdyZXNvdXJjZV9pZCcgXSwgJ2FnZ3JlZ2F0ZV9yZXNvdXJjZV9pZF9hcnInLCByZXNwb25zZV9kYXRhWyAnYWp4X2RhdGEnIF1bICdhZ2dyZWdhdGVfcmVzb3VyY2VfaWRfYXJyJyBdICk7XHJcblx0XHRcdFx0XHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdFx0XHRcdFx0Ly8gVXBkYXRlIGNhbGVuZGFyXHJcblx0XHRcdFx0XHR3cGJjX2NhbGVuZGFyX191cGRhdGVfbG9vayggcmVzcG9uc2VfZGF0YVsgJ3Jlc291cmNlX2lkJyBdICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAnZnVuY3Rpb24nID09PSB0eXBlb2YgKHdwYmNfaG9va19faW5pdF90aW1lc2VsZWN0b3IpICkge1xyXG5cdFx0XHRcdFx0XHR3cGJjX2hvb2tfX2luaXRfdGltZXNlbGVjdG9yKCk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdCggJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiAocmVzcG9uc2VfZGF0YVsgJ2FqeF9kYXRhJyBdWyAnYWp4X2FmdGVyX2FjdGlvbl9tZXNzYWdlJyBdKSApXHJcblx0XHRcdFx0XHRcdCAmJiAoICcnICE9IHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsgJ2FqeF9hZnRlcl9hY3Rpb25fbWVzc2FnZScgXS5yZXBsYWNlKCAvXFxuL2csIFwiPGJyIC8+XCIgKSApXHJcblx0XHRcdFx0XHQpe1xyXG5cclxuXHRcdFx0XHRcdFx0dmFyIGpxX25vZGUgID0gd3BiY19nZXRfY2FsZW5kYXJfX2pxX25vZGVfX2Zvcl9tZXNzYWdlcyggdGhpcy5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBTaG93IE1lc3NhZ2VcclxuXHRcdFx0XHRcdFx0d3BiY19mcm9udF9lbmRfX3Nob3dfbWVzc2FnZSggcmVzcG9uc2VfZGF0YVsgJ2FqeF9kYXRhJyBdWyAnYWp4X2FmdGVyX2FjdGlvbl9tZXNzYWdlJyBdLnJlcGxhY2UoIC9cXG4vZywgXCI8YnIgLz5cIiApLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0eyAgICd0eXBlJyAgICAgOiAoICd1bmRlZmluZWQnICE9PSB0eXBlb2YoIHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsgJ2FqeF9hZnRlcl9hY3Rpb25fbWVzc2FnZV9zdGF0dXMnIF0gKSApXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgPyByZXNwb25zZV9kYXRhWyAnYWp4X2RhdGEnIF1bICdhanhfYWZ0ZXJfYWN0aW9uX21lc3NhZ2Vfc3RhdHVzJyBdIDogJ2luZm8nLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnc2hvd19oZXJlJzogeydqcV9ub2RlJzoganFfbm9kZSwgJ3doZXJlJzogJ2FmdGVyJ30sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdpc19hcHBlbmQnOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnc3R5bGUnICAgIDogJ3RleHQtYWxpZ246bGVmdDsnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnZGVsYXknICAgIDogMTAwMDBcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoICdmdW5jdGlvbicgPT09IHR5cGVvZiAod3BiY191cGRhdGVfY2FwYWNpdHlfaGludCkgKSB7XHJcblx0XHRcdFx0XHRcdHdwYmNfdXBkYXRlX2NhcGFjaXR5X2hpbnQoIHJlc3BvbnNlX2RhdGFbJ3Jlc291cmNlX2lkJ10gKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBUcmlnZ2VyIGV2ZW50IHRoYXQgY2FsZW5kYXIgaGFzIGJlZW5cdFx0IC8vIEZpeEluOiAxMC4wLjAuNDQuICAvLyBGaXhJbjogMTAuMTQuMTcuMi5cclxuXHRcdFx0XHRcdGlmICggKGpRdWVyeSggJyNjYWxlbmRhcl9ib29raW5nJyArIHJlc3BvbnNlX2RhdGFbJ3Jlc291cmNlX2lkJ10gKS5sZW5ndGggPiAwKSB8fCAoalF1ZXJ5KCAnI2RhdGVfYm9va2luZycgKyByZXNwb25zZV9kYXRhWydyZXNvdXJjZV9pZCddICkubGVuZ3RoID4gMCkgKSB7XHJcblx0XHRcdFx0XHRcdHZhciB0YXJnZXRfZWxtID0galF1ZXJ5KCAnYm9keScgKS50cmlnZ2VyKCBcIndwYmNfY2FsZW5kYXJfYWp4X19sb2FkZWRfZGF0YVwiLCBbcmVzcG9uc2VfZGF0YVsgJ3Jlc291cmNlX2lkJyBdXSApO1xyXG5cdFx0XHRcdFx0XHQgLy9qUXVlcnkoICdib2R5JyApLm9uKCAnd3BiY19jYWxlbmRhcl9hanhfX2xvYWRlZF9kYXRhJywgZnVuY3Rpb24oIGV2ZW50LCByZXNvdXJjZV9pZCApIHsgLi4uIH0gKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvL2pRdWVyeSggJyNhamF4X3Jlc3BvbmQnICkuaHRtbCggcmVzcG9uc2VfZGF0YSApO1x0XHQvLyBGb3IgYWJpbGl0eSB0byBzaG93IHJlc3BvbnNlLCBhZGQgc3VjaCBESVYgZWxlbWVudCB0byBwYWdlXHJcblx0XHRcdFx0fVxyXG5cdFx0XHQgICkuZmFpbCggZnVuY3Rpb24gKCBqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24gKSB7ICAgIGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUubG9nICl7IGNvbnNvbGUubG9nKCAnQWpheF9FcnJvcicsIGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93biApOyB9XHJcblxyXG5cdFx0XHRcdFx0dmFyIGFqeF9wb3N0X2RhdGFfX3Jlc291cmNlX2lkID0gd3BiY19nZXRfcmVzb3VyY2VfaWRfX2Zyb21fYWp4X3Bvc3RfZGF0YV91cmwoIHRoaXMuZGF0YSApO1xyXG5cdFx0XHRcdFx0d3BiY19iYWxhbmNlcl9fY29tcGxldGVkKCBhanhfcG9zdF9kYXRhX19yZXNvdXJjZV9pZCAsICd3cGJjX2NhbGVuZGFyX19sb2FkX2RhdGFfX2FqeCcgKTtcclxuXHJcblx0XHRcdFx0XHQvLyBHZXQgQ29udGVudCBvZiBFcnJvciBNZXNzYWdlXHJcblx0XHRcdFx0XHR2YXIgZXJyb3JfbWVzc2FnZSA9ICc8c3Ryb25nPicgKyAnRXJyb3IhJyArICc8L3N0cm9uZz4gJyArIGVycm9yVGhyb3duIDtcclxuXHRcdFx0XHRcdGlmICgganFYSFIuc3RhdHVzICl7XHJcblx0XHRcdFx0XHRcdGVycm9yX21lc3NhZ2UgKz0gJyAoPGI+JyArIGpxWEhSLnN0YXR1cyArICc8L2I+KSc7XHJcblx0XHRcdFx0XHRcdGlmICg0MDMgPT0ganFYSFIuc3RhdHVzICl7XHJcblx0XHRcdFx0XHRcdFx0ZXJyb3JfbWVzc2FnZSArPSAnPGJyPiBQcm9iYWJseSBub25jZSBmb3IgdGhpcyBwYWdlIGhhcyBiZWVuIGV4cGlyZWQuIFBsZWFzZSA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgb25jbGljaz1cImphdmFzY3JpcHQ6bG9jYXRpb24ucmVsb2FkKCk7XCI+cmVsb2FkIHRoZSBwYWdlPC9hPi4nO1xyXG5cdFx0XHRcdFx0XHRcdGVycm9yX21lc3NhZ2UgKz0gJzxicj4gT3RoZXJ3aXNlLCBwbGVhc2UgY2hlY2sgdGhpcyA8YSBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7XCIgaHJlZj1cImh0dHBzOi8vd3Bib29raW5nY2FsZW5kYXIuY29tL2ZhcS9yZXF1ZXN0LWRvLW5vdC1wYXNzLXNlY3VyaXR5LWNoZWNrLz9hZnRlcl91cGRhdGU9MTAuMS4xXCI+dHJvdWJsZXNob290aW5nIGluc3RydWN0aW9uPC9hPi48YnI+J1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR2YXIgbWVzc2FnZV9zaG93X2RlbGF5ID0gMzAwMDtcclxuXHRcdFx0XHRcdGlmICgganFYSFIucmVzcG9uc2VUZXh0ICl7XHJcblx0XHRcdFx0XHRcdGVycm9yX21lc3NhZ2UgKz0gJyAnICsganFYSFIucmVzcG9uc2VUZXh0O1xyXG5cdFx0XHRcdFx0XHRtZXNzYWdlX3Nob3dfZGVsYXkgPSAxMDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGVycm9yX21lc3NhZ2UgPSBlcnJvcl9tZXNzYWdlLnJlcGxhY2UoIC9cXG4vZywgXCI8YnIgLz5cIiApO1xyXG5cclxuXHRcdFx0XHRcdHZhciBqcV9ub2RlICA9IHdwYmNfZ2V0X2NhbGVuZGFyX19qcV9ub2RlX19mb3JfbWVzc2FnZXMoIHRoaXMuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdC8qKlxyXG5cdFx0XHRcdFx0ICogSWYgd2UgbWFrZSBmYXN0IGNsaWNraW5nIG9uIGRpZmZlcmVudCBwYWdlcyxcclxuXHRcdFx0XHRcdCAqIHRoZW4gdW5kZXIgY2FsZW5kYXIgd2lsbCBzaG93IGVycm9yIG1lc3NhZ2Ugd2l0aCAgZW1wdHkgIHRleHQsIGJlY2F1c2UgYWpheCB3YXMgbm90IHJlY2VpdmVkLlxyXG5cdFx0XHRcdFx0ICogVG8gIG5vdCBzaG93IHN1Y2ggd2FybmluZ3Mgd2UgYXJlIHNldCBkZWxheSAgaW4gMyBzZWNvbmRzLiAgdmFyIG1lc3NhZ2Vfc2hvd19kZWxheSA9IDMwMDA7XHJcblx0XHRcdFx0XHQgKi9cclxuXHRcdFx0XHRcdHZhciBjbG9zZWRfdGltZXIgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKXtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU2hvdyBNZXNzYWdlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0d3BiY19mcm9udF9lbmRfX3Nob3dfbWVzc2FnZSggZXJyb3JfbWVzc2FnZSAsIHsgJ3R5cGUnICAgICA6ICdlcnJvcicsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3Nob3dfaGVyZSc6IHsnanFfbm9kZSc6IGpxX25vZGUsICd3aGVyZSc6ICdhZnRlcid9LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdpc19hcHBlbmQnOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdzdHlsZScgICAgOiAndGV4dC1hbGlnbjpsZWZ0OycsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2Nzc19jbGFzcyc6J3dwYmNfZmVfbWVzc2FnZV9hbHQnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdkZWxheScgICAgOiAwXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgIH0gLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICAgcGFyc2VJbnQoIG1lc3NhZ2Vfc2hvd19kZWxheSApICAgKTtcclxuXHJcblx0XHRcdCAgfSlcclxuXHQgICAgICAgICAgLy8gLmRvbmUoICAgZnVuY3Rpb24gKCBkYXRhLCB0ZXh0U3RhdHVzLCBqcVhIUiApIHsgICBpZiAoIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLmxvZyApeyBjb25zb2xlLmxvZyggJ3NlY29uZCBzdWNjZXNzJywgZGF0YSwgdGV4dFN0YXR1cywganFYSFIgKTsgfSAgICB9KVxyXG5cdFx0XHQgIC8vIC5hbHdheXMoIGZ1bmN0aW9uICggZGF0YV9qcVhIUiwgdGV4dFN0YXR1cywganFYSFJfZXJyb3JUaHJvd24gKSB7ICAgaWYgKCB3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS5sb2cgKXsgY29uc29sZS5sb2coICdhbHdheXMgZmluaXNoZWQnLCBkYXRhX2pxWEhSLCB0ZXh0U3RhdHVzLCBqcVhIUl9lcnJvclRocm93biApOyB9ICAgICB9KVxyXG5cdFx0XHQgIDsgIC8vIEVuZCBBamF4XHJcbn1cclxuXHJcblxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIFN1cHBvcnRcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldCBDYWxlbmRhciBqUXVlcnkgbm9kZSBmb3Igc2hvd2luZyBtZXNzYWdlcyBkdXJpbmcgQWpheFxyXG5cdCAqIFRoaXMgcGFyYW1ldGVyOiAgIGNhbGVuZGFyX3JlcXVlc3RfcGFyYW1zW3Jlc291cmNlX2lkXSAgIHBhcnNlZCBmcm9tIHRoaXMuZGF0YSBBamF4IHBvc3QgIGRhdGFcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBhanhfcG9zdF9kYXRhX3VybF9wYXJhbXNcdFx0ICdhY3Rpb249V1BCQ19BSlhfQ0FMRU5EQVJfTE9BRC4uLiZjYWxlbmRhcl9yZXF1ZXN0X3BhcmFtcyU1QnJlc291cmNlX2lkJTVEPTImY2FsZW5kYXJfcmVxdWVzdF9wYXJhbXMlNUJib29raW5nX2hhc2glNUQ9JmNhbGVuZGFyX3JlcXVlc3RfcGFyYW1zJ1xyXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XHQnJyNjYWxlbmRhcl9ib29raW5nMScgIHwgICAnLmJvb2tpbmdfZm9ybV9kaXYnIC4uLlxyXG5cdCAqXHJcblx0ICogRXhhbXBsZSAgICB2YXIganFfbm9kZSAgPSB3cGJjX2dldF9jYWxlbmRhcl9fanFfbm9kZV9fZm9yX21lc3NhZ2VzKCB0aGlzLmRhdGEgKTtcclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2dldF9jYWxlbmRhcl9fanFfbm9kZV9fZm9yX21lc3NhZ2VzKCBhanhfcG9zdF9kYXRhX3VybF9wYXJhbXMgKXtcclxuXHJcblx0XHR2YXIganFfbm9kZSA9ICcuYm9va2luZ19mb3JtX2Rpdic7XHJcblxyXG5cdFx0dmFyIGNhbGVuZGFyX3Jlc291cmNlX2lkID0gd3BiY19nZXRfcmVzb3VyY2VfaWRfX2Zyb21fYWp4X3Bvc3RfZGF0YV91cmwoIGFqeF9wb3N0X2RhdGFfdXJsX3BhcmFtcyApO1xyXG5cclxuXHRcdGlmICggY2FsZW5kYXJfcmVzb3VyY2VfaWQgPiAwICl7XHJcblx0XHRcdGpxX25vZGUgPSAnI2NhbGVuZGFyX2Jvb2tpbmcnICsgY2FsZW5kYXJfcmVzb3VyY2VfaWQ7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGpxX25vZGU7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogR2V0IHJlc291cmNlIElEIGZyb20gYWp4IHBvc3QgZGF0YSB1cmwgICB1c3VhbGx5ICBmcm9tICB0aGlzLmRhdGEgID1cclxuXHQgKiAnYWN0aW9uPVdQQkNfQUpYX0NBTEVOREFSX0xPQUQuLi4mY2FsZW5kYXJfcmVxdWVzdF9wYXJhbXMlNUJyZXNvdXJjZV9pZCU1RD0yJmNhbGVuZGFyX3JlcXVlc3RfcGFyYW1zJTVCYm9va2luZ19oYXNoJTVEPSZjYWxlbmRhcl9yZXF1ZXN0X3BhcmFtcydcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBhanhfcG9zdF9kYXRhX3VybF9wYXJhbXNcdFx0ICdhY3Rpb249V1BCQ19BSlhfQ0FMRU5EQVJfTE9BRC4uLiZjYWxlbmRhcl9yZXF1ZXN0X3BhcmFtcyU1QnJlc291cmNlX2lkJTVEPTImY2FsZW5kYXJfcmVxdWVzdF9wYXJhbXMlNUJib29raW5nX2hhc2glNUQ9JmNhbGVuZGFyX3JlcXVlc3RfcGFyYW1zJ1xyXG5cdCAqIEByZXR1cm5zIHtpbnR9XHRcdFx0XHRcdFx0IDEgfCAwICAoaWYgZXJycm9yIHRoZW4gIDApXHJcblx0ICpcclxuXHQgKiBFeGFtcGxlICAgIHZhciBqcV9ub2RlICA9IHdwYmNfZ2V0X2NhbGVuZGFyX19qcV9ub2RlX19mb3JfbWVzc2FnZXMoIHRoaXMuZGF0YSApO1xyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfZ2V0X3Jlc291cmNlX2lkX19mcm9tX2FqeF9wb3N0X2RhdGFfdXJsKCBhanhfcG9zdF9kYXRhX3VybF9wYXJhbXMgKXtcclxuXHJcblx0XHQvLyBHZXQgYm9va2luZyByZXNvdXJjZSBJRCBmcm9tIEFqYXggUG9zdCBSZXF1ZXN0ICAtPiB0aGlzLmRhdGEgPSAnYWN0aW9uPVdQQkNfQUpYX0NBTEVOREFSX0xPQUQuLi4mY2FsZW5kYXJfcmVxdWVzdF9wYXJhbXMlNUJyZXNvdXJjZV9pZCU1RD0yJmNhbGVuZGFyX3JlcXVlc3RfcGFyYW1zJTVCYm9va2luZ19oYXNoJTVEPSZjYWxlbmRhcl9yZXF1ZXN0X3BhcmFtcydcclxuXHRcdHZhciBjYWxlbmRhcl9yZXNvdXJjZV9pZCA9IHdwYmNfZ2V0X3VyaV9wYXJhbV9ieV9uYW1lKCAnY2FsZW5kYXJfcmVxdWVzdF9wYXJhbXNbcmVzb3VyY2VfaWRdJywgYWp4X3Bvc3RfZGF0YV91cmxfcGFyYW1zICk7XHJcblx0XHRpZiAoIChudWxsICE9PSBjYWxlbmRhcl9yZXNvdXJjZV9pZCkgJiYgKCcnICE9PSBjYWxlbmRhcl9yZXNvdXJjZV9pZCkgKXtcclxuXHRcdFx0Y2FsZW5kYXJfcmVzb3VyY2VfaWQgPSBwYXJzZUludCggY2FsZW5kYXJfcmVzb3VyY2VfaWQgKTtcclxuXHRcdFx0aWYgKCBjYWxlbmRhcl9yZXNvdXJjZV9pZCA+IDAgKXtcclxuXHRcdFx0XHRyZXR1cm4gY2FsZW5kYXJfcmVzb3VyY2VfaWQ7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiAwO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldCBwYXJhbWV0ZXIgZnJvbSBVUkwgIC0gIHBhcnNlIFVSTCBwYXJhbWV0ZXJzLCAgbGlrZSB0aGlzOlxyXG5cdCAqIGFjdGlvbj1XUEJDX0FKWF9DQUxFTkRBUl9MT0FELi4uJmNhbGVuZGFyX3JlcXVlc3RfcGFyYW1zJTVCcmVzb3VyY2VfaWQlNUQ9MiZjYWxlbmRhcl9yZXF1ZXN0X3BhcmFtcyU1QmJvb2tpbmdfaGFzaCU1RD0mY2FsZW5kYXJfcmVxdWVzdF9wYXJhbXNcclxuXHQgKiBAcGFyYW0gbmFtZSAgcGFyYW1ldGVyICBuYW1lLCAgbGlrZSAnY2FsZW5kYXJfcmVxdWVzdF9wYXJhbXNbcmVzb3VyY2VfaWRdJ1xyXG5cdCAqIEBwYXJhbSB1cmxcdCdwYXJhbWV0ZXIgIHN0cmluZyBVUkwnXHJcblx0ICogQHJldHVybnMge3N0cmluZ3xudWxsfSAgIHBhcmFtZXRlciB2YWx1ZVxyXG5cdCAqXHJcblx0ICogRXhhbXBsZTogXHRcdHdwYmNfZ2V0X3VyaV9wYXJhbV9ieV9uYW1lKCAnY2FsZW5kYXJfcmVxdWVzdF9wYXJhbXNbcmVzb3VyY2VfaWRdJywgdGhpcy5kYXRhICk7ICAtPiAnMidcclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2dldF91cmlfcGFyYW1fYnlfbmFtZSggbmFtZSwgdXJsICl7XHJcblxyXG5cdFx0dXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KCB1cmwgKTtcclxuXHJcblx0XHRuYW1lID0gbmFtZS5yZXBsYWNlKCAvW1xcW1xcXV0vZywgJ1xcXFwkJicgKTtcclxuXHRcdHZhciByZWdleCA9IG5ldyBSZWdFeHAoICdbPyZdJyArIG5hbWUgKyAnKD0oW14mI10qKXwmfCN8JCknICksXHJcblx0XHRcdHJlc3VsdHMgPSByZWdleC5leGVjKCB1cmwgKTtcclxuXHRcdGlmICggIXJlc3VsdHMgKSByZXR1cm4gbnVsbDtcclxuXHRcdGlmICggIXJlc3VsdHNbIDIgXSApIHJldHVybiAnJztcclxuXHRcdHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoIHJlc3VsdHNbIDIgXS5yZXBsYWNlKCAvXFwrL2csICcgJyApICk7XHJcblx0fVxyXG4iLCIvKipcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqXHRpbmNsdWRlcy9fX2pzL2Zyb250X2VuZF9tZXNzYWdlcy93cGJjX2ZlX21lc3NhZ2VzLmpzXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKi9cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBTaG93IE1lc3NhZ2VzIGF0IEZyb250LUVkbiBzaWRlXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuLyoqXHJcbiAqIFNob3cgbWVzc2FnZSBpbiBjb250ZW50XHJcbiAqXHJcbiAqIEBwYXJhbSBtZXNzYWdlXHRcdFx0XHRNZXNzYWdlIEhUTUxcclxuICogQHBhcmFtIHBhcmFtcyA9IHtcclxuICpcdFx0XHRcdFx0XHRcdFx0J3R5cGUnICAgICA6ICd3YXJuaW5nJyxcdFx0XHRcdFx0XHRcdC8vICdlcnJvcicgfCAnd2FybmluZycgfCAnaW5mbycgfCAnc3VjY2VzcydcclxuICpcdFx0XHRcdFx0XHRcdFx0J3Nob3dfaGVyZScgOiB7XHJcbiAqXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnanFfbm9kZScgOiAnJyxcdFx0XHRcdC8vIGFueSBqUXVlcnkgbm9kZSBkZWZpbml0aW9uXHJcbiAqXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnd2hlcmUnICAgOiAnaW5zaWRlJ1x0XHQvLyAnaW5zaWRlJyB8ICdiZWZvcmUnIHwgJ2FmdGVyJyB8ICdyaWdodCcgfCAnbGVmdCdcclxuICpcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICB9LFxyXG4gKlx0XHRcdFx0XHRcdFx0XHQnaXNfYXBwZW5kJzogdHJ1ZSxcdFx0XHRcdFx0XHRcdFx0Ly8gQXBwbHkgIG9ubHkgaWYgXHQnd2hlcmUnICAgOiAnaW5zaWRlJ1xyXG4gKlx0XHRcdFx0XHRcdFx0XHQnc3R5bGUnICAgIDogJ3RleHQtYWxpZ246bGVmdDsnLFx0XHRcdFx0Ly8gc3R5bGVzLCBpZiBuZWVkZWRcclxuICpcdFx0XHRcdFx0XHRcdCAgICAnY3NzX2NsYXNzJzogJycsXHRcdFx0XHRcdFx0XHRcdC8vIEZvciBleGFtcGxlIGNhbiAgYmU6ICd3cGJjX2ZlX21lc3NhZ2VfYWx0J1xyXG4gKlx0XHRcdFx0XHRcdFx0XHQnZGVsYXknICAgIDogMCxcdFx0XHRcdFx0XHRcdFx0XHQvLyBob3cgbWFueSBtaWNyb3NlY29uZCB0byAgc2hvdywgIGlmIDAgIHRoZW4gIHNob3cgZm9yZXZlclxyXG4gKlx0XHRcdFx0XHRcdFx0XHQnaWZfdmlzaWJsZV9ub3Rfc2hvdyc6IGZhbHNlXHRcdFx0XHRcdC8vIGlmIHRydWUsICB0aGVuIGRvIG5vdCBzaG93IG1lc3NhZ2UsICBpZiBwcmV2aW9zIG1lc3NhZ2Ugd2FzIG5vdCBoaWRlZCAobm90IGFwcGx5IGlmICd3aGVyZScgICA6ICdpbnNpZGUnIClcclxuICpcdFx0XHRcdH07XHJcbiAqIEV4YW1wbGVzOlxyXG4gKiBcdFx0XHR2YXIgaHRtbF9pZCA9IHdwYmNfZnJvbnRfZW5kX19zaG93X21lc3NhZ2UoICdZb3UgY2FuIHRlc3QgZGF5cyBzZWxlY3Rpb24gaW4gY2FsZW5kYXInLCB7fSApO1xyXG4gKlxyXG4gKlx0XHRcdHZhciBub3RpY2VfbWVzc2FnZV9pZCA9IHdwYmNfZnJvbnRfZW5kX19zaG93X21lc3NhZ2UoIF93cGJjLmdldF9tZXNzYWdlKCAnbWVzc2FnZV9jaGVja19yZXF1aXJlZCcgKSwgeyAndHlwZSc6ICd3YXJuaW5nJywgJ2RlbGF5JzogMTAwMDAsICdpZl92aXNpYmxlX25vdF9zaG93JzogdHJ1ZSxcclxuICpcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgJ3Nob3dfaGVyZSc6IHsnd2hlcmUnOiAncmlnaHQnLCAnanFfbm9kZSc6IGVsLH0gfSApO1xyXG4gKlxyXG4gKlx0XHRcdHdwYmNfZnJvbnRfZW5kX19zaG93X21lc3NhZ2UoIHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsgJ2FqeF9hZnRlcl9hY3Rpb25fbWVzc2FnZScgXS5yZXBsYWNlKCAvXFxuL2csIFwiPGJyIC8+XCIgKSxcclxuICpcdFx0XHRcdFx0XHRcdFx0XHRcdFx0eyAgICd0eXBlJyAgICAgOiAoICd1bmRlZmluZWQnICE9PSB0eXBlb2YoIHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsgJ2FqeF9hZnRlcl9hY3Rpb25fbWVzc2FnZV9zdGF0dXMnIF0gKSApXHJcbiAqXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICA/IHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsgJ2FqeF9hZnRlcl9hY3Rpb25fbWVzc2FnZV9zdGF0dXMnIF0gOiAnaW5mbycsXHJcbiAqXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3Nob3dfaGVyZSc6IHsnanFfbm9kZSc6IGpxX25vZGUsICd3aGVyZSc6ICdhZnRlcid9LFxyXG4gKlx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdjc3NfY2xhc3MnOid3cGJjX2ZlX21lc3NhZ2VfYWx0JyxcclxuICpcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnZGVsYXknICAgIDogMTAwMDBcclxuICpcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSApO1xyXG4gKlxyXG4gKlxyXG4gKiBAcmV0dXJucyBzdHJpbmcgIC0gSFRNTCBJRFx0XHRvciAwIGlmIG5vdCBzaG93aW5nIGR1cmluZyB0aGlzIHRpbWUuXHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2Zyb250X2VuZF9fc2hvd19tZXNzYWdlKCBtZXNzYWdlLCBwYXJhbXMgPSB7fSApe1xyXG5cclxuXHR2YXIgcGFyYW1zX2RlZmF1bHQgPSB7XHJcblx0XHRcdFx0XHRcdFx0XHQndHlwZScgICAgIDogJ3dhcm5pbmcnLFx0XHRcdFx0XHRcdFx0Ly8gJ2Vycm9yJyB8ICd3YXJuaW5nJyB8ICdpbmZvJyB8ICdzdWNjZXNzJ1xyXG5cdFx0XHRcdFx0XHRcdFx0J3Nob3dfaGVyZScgOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2pxX25vZGUnIDogJycsXHRcdFx0XHQvLyBhbnkgalF1ZXJ5IG5vZGUgZGVmaW5pdGlvblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCd3aGVyZScgICA6ICdpbnNpZGUnXHRcdC8vICdpbnNpZGUnIHwgJ2JlZm9yZScgfCAnYWZ0ZXInIHwgJ3JpZ2h0JyB8ICdsZWZ0J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICB9LFxyXG5cdFx0XHRcdFx0XHRcdFx0J2lzX2FwcGVuZCc6IHRydWUsXHRcdFx0XHRcdFx0XHRcdC8vIEFwcGx5ICBvbmx5IGlmIFx0J3doZXJlJyAgIDogJ2luc2lkZSdcclxuXHRcdFx0XHRcdFx0XHRcdCdzdHlsZScgICAgOiAndGV4dC1hbGlnbjpsZWZ0OycsXHRcdFx0XHQvLyBzdHlsZXMsIGlmIG5lZWRlZFxyXG5cdFx0XHRcdFx0XHRcdCAgICAnY3NzX2NsYXNzJzogJycsXHRcdFx0XHRcdFx0XHRcdC8vIEZvciBleGFtcGxlIGNhbiAgYmU6ICd3cGJjX2ZlX21lc3NhZ2VfYWx0J1xyXG5cdFx0XHRcdFx0XHRcdFx0J2RlbGF5JyAgICA6IDAsXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaG93IG1hbnkgbWljcm9zZWNvbmQgdG8gIHNob3csICBpZiAwICB0aGVuICBzaG93IGZvcmV2ZXJcclxuXHRcdFx0XHRcdFx0XHRcdCdpZl92aXNpYmxlX25vdF9zaG93JzogZmFsc2UsXHRcdFx0XHRcdC8vIGlmIHRydWUsICB0aGVuIGRvIG5vdCBzaG93IG1lc3NhZ2UsICBpZiBwcmV2aW9zIG1lc3NhZ2Ugd2FzIG5vdCBoaWRlZCAobm90IGFwcGx5IGlmICd3aGVyZScgICA6ICdpbnNpZGUnIClcclxuXHRcdFx0XHRcdFx0XHRcdCdpc19zY3JvbGwnOiB0cnVlXHRcdFx0XHRcdFx0XHRcdC8vIGlzIHNjcm9sbCAgdG8gIHRoaXMgZWxlbWVudFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdGZvciAoIHZhciBwX2tleSBpbiBwYXJhbXMgKXtcclxuXHRcdHBhcmFtc19kZWZhdWx0WyBwX2tleSBdID0gcGFyYW1zWyBwX2tleSBdO1xyXG5cdH1cclxuXHRwYXJhbXMgPSBwYXJhbXNfZGVmYXVsdDtcclxuXHJcbiAgICB2YXIgdW5pcXVlX2Rpdl9pZCA9IG5ldyBEYXRlKCk7XHJcbiAgICB1bmlxdWVfZGl2X2lkID0gJ3dwYmNfbm90aWNlXycgKyB1bmlxdWVfZGl2X2lkLmdldFRpbWUoKTtcclxuXHJcblx0cGFyYW1zWydjc3NfY2xhc3MnXSArPSAnIHdwYmNfZmVfbWVzc2FnZSc7XHJcblx0aWYgKCBwYXJhbXNbJ3R5cGUnXSA9PSAnZXJyb3InICl7XHJcblx0XHRwYXJhbXNbJ2Nzc19jbGFzcyddICs9ICcgd3BiY19mZV9tZXNzYWdlX2Vycm9yJztcclxuXHRcdG1lc3NhZ2UgPSAnPGkgY2xhc3M9XCJtZW51X2ljb24gaWNvbi0xeCB3cGJjX2ljbl9yZXBvcnRfZ21haWxlcnJvcnJlZFwiPjwvaT4nICsgbWVzc2FnZTtcclxuXHR9XHJcblx0aWYgKCBwYXJhbXNbJ3R5cGUnXSA9PSAnd2FybmluZycgKXtcclxuXHRcdHBhcmFtc1snY3NzX2NsYXNzJ10gKz0gJyB3cGJjX2ZlX21lc3NhZ2Vfd2FybmluZyc7XHJcblx0XHRtZXNzYWdlID0gJzxpIGNsYXNzPVwibWVudV9pY29uIGljb24tMXggd3BiY19pY25fd2FybmluZ1wiPjwvaT4nICsgbWVzc2FnZTtcclxuXHR9XHJcblx0aWYgKCBwYXJhbXNbJ3R5cGUnXSA9PSAnaW5mbycgKXtcclxuXHRcdHBhcmFtc1snY3NzX2NsYXNzJ10gKz0gJyB3cGJjX2ZlX21lc3NhZ2VfaW5mbyc7XHJcblx0fVxyXG5cdGlmICggcGFyYW1zWyd0eXBlJ10gPT0gJ3N1Y2Nlc3MnICl7XHJcblx0XHRwYXJhbXNbJ2Nzc19jbGFzcyddICs9ICcgd3BiY19mZV9tZXNzYWdlX3N1Y2Nlc3MnO1xyXG5cdFx0bWVzc2FnZSA9ICc8aSBjbGFzcz1cIm1lbnVfaWNvbiBpY29uLTF4IHdwYmNfaWNuX2RvbmVfb3V0bGluZVwiPjwvaT4nICsgbWVzc2FnZTtcclxuXHR9XHJcblxyXG5cdHZhciBzY3JvbGxfdG9fZWxlbWVudCA9ICc8ZGl2IGlkPVwiJyArIHVuaXF1ZV9kaXZfaWQgKyAnX3Njcm9sbFwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPjwvZGl2Pic7XHJcblx0bWVzc2FnZSA9ICc8ZGl2IGlkPVwiJyArIHVuaXF1ZV9kaXZfaWQgKyAnXCIgY2xhc3M9XCJ3cGJjX2Zyb250X2VuZF9fbWVzc2FnZSAnICsgcGFyYW1zWydjc3NfY2xhc3MnXSArICdcIiBzdHlsZT1cIicgKyBwYXJhbXNbICdzdHlsZScgXSArICdcIj4nICsgbWVzc2FnZSArICc8L2Rpdj4nO1xyXG5cclxuXHJcblx0dmFyIGpxX2VsX21lc3NhZ2UgPSBmYWxzZTtcclxuXHR2YXIgaXNfc2hvd19tZXNzYWdlID0gdHJ1ZTtcclxuXHJcblx0aWYgKCAnaW5zaWRlJyA9PT0gcGFyYW1zWyAnc2hvd19oZXJlJyBdWyAnd2hlcmUnIF0gKXtcclxuXHJcblx0XHRpZiAoIHBhcmFtc1sgJ2lzX2FwcGVuZCcgXSApe1xyXG5cdFx0XHRqUXVlcnkoIHBhcmFtc1sgJ3Nob3dfaGVyZScgXVsgJ2pxX25vZGUnIF0gKS5hcHBlbmQoIHNjcm9sbF90b19lbGVtZW50ICk7XHJcblx0XHRcdGpRdWVyeSggcGFyYW1zWyAnc2hvd19oZXJlJyBdWyAnanFfbm9kZScgXSApLmFwcGVuZCggbWVzc2FnZSApO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0alF1ZXJ5KCBwYXJhbXNbICdzaG93X2hlcmUnIF1bICdqcV9ub2RlJyBdICkuaHRtbCggc2Nyb2xsX3RvX2VsZW1lbnQgKyBtZXNzYWdlICk7XHJcblx0XHR9XHJcblxyXG5cdH0gZWxzZSBpZiAoICdiZWZvcmUnID09PSBwYXJhbXNbICdzaG93X2hlcmUnIF1bICd3aGVyZScgXSApe1xyXG5cclxuXHRcdGpxX2VsX21lc3NhZ2UgPSBqUXVlcnkoIHBhcmFtc1sgJ3Nob3dfaGVyZScgXVsgJ2pxX25vZGUnIF0gKS5zaWJsaW5ncyggJ1tpZF49XCJ3cGJjX25vdGljZV9cIl0nICk7XHJcblx0XHRpZiAoIChwYXJhbXNbICdpZl92aXNpYmxlX25vdF9zaG93JyBdKSAmJiAoanFfZWxfbWVzc2FnZS5pcyggJzp2aXNpYmxlJyApKSApe1xyXG5cdFx0XHRpc19zaG93X21lc3NhZ2UgPSBmYWxzZTtcclxuXHRcdFx0dW5pcXVlX2Rpdl9pZCA9IGpRdWVyeSgganFfZWxfbWVzc2FnZS5nZXQoIDAgKSApLmF0dHIoICdpZCcgKTtcclxuXHRcdH1cclxuXHRcdGlmICggaXNfc2hvd19tZXNzYWdlICl7XHJcblx0XHRcdGpRdWVyeSggcGFyYW1zWyAnc2hvd19oZXJlJyBdWyAnanFfbm9kZScgXSApLmJlZm9yZSggc2Nyb2xsX3RvX2VsZW1lbnQgKTtcclxuXHRcdFx0alF1ZXJ5KCBwYXJhbXNbICdzaG93X2hlcmUnIF1bICdqcV9ub2RlJyBdICkuYmVmb3JlKCBtZXNzYWdlICk7XHJcblx0XHR9XHJcblxyXG5cdH0gZWxzZSBpZiAoICdhZnRlcicgPT09IHBhcmFtc1sgJ3Nob3dfaGVyZScgXVsgJ3doZXJlJyBdICl7XHJcblxyXG5cdFx0anFfZWxfbWVzc2FnZSA9IGpRdWVyeSggcGFyYW1zWyAnc2hvd19oZXJlJyBdWyAnanFfbm9kZScgXSApLm5leHRBbGwoICdbaWRePVwid3BiY19ub3RpY2VfXCJdJyApO1xyXG5cdFx0aWYgKCAocGFyYW1zWyAnaWZfdmlzaWJsZV9ub3Rfc2hvdycgXSkgJiYgKGpxX2VsX21lc3NhZ2UuaXMoICc6dmlzaWJsZScgKSkgKXtcclxuXHRcdFx0aXNfc2hvd19tZXNzYWdlID0gZmFsc2U7XHJcblx0XHRcdHVuaXF1ZV9kaXZfaWQgPSBqUXVlcnkoIGpxX2VsX21lc3NhZ2UuZ2V0KCAwICkgKS5hdHRyKCAnaWQnICk7XHJcblx0XHR9XHJcblx0XHRpZiAoIGlzX3Nob3dfbWVzc2FnZSApe1xyXG5cdFx0XHRqUXVlcnkoIHBhcmFtc1sgJ3Nob3dfaGVyZScgXVsgJ2pxX25vZGUnIF0gKS5iZWZvcmUoIHNjcm9sbF90b19lbGVtZW50ICk7XHRcdC8vIFdlIG5lZWQgdG8gIHNldCAgaGVyZSBiZWZvcmUoZm9yIGhhbmR5IHNjcm9sbClcclxuXHRcdFx0alF1ZXJ5KCBwYXJhbXNbICdzaG93X2hlcmUnIF1bICdqcV9ub2RlJyBdICkuYWZ0ZXIoIG1lc3NhZ2UgKTtcclxuXHRcdH1cclxuXHJcblx0fSBlbHNlIGlmICggJ3JpZ2h0JyA9PT0gcGFyYW1zWyAnc2hvd19oZXJlJyBdWyAnd2hlcmUnIF0gKXtcclxuXHJcblx0XHRqcV9lbF9tZXNzYWdlID0galF1ZXJ5KCBwYXJhbXNbICdzaG93X2hlcmUnIF1bICdqcV9ub2RlJyBdICkubmV4dEFsbCggJy53cGJjX2Zyb250X2VuZF9fbWVzc2FnZV9jb250YWluZXJfcmlnaHQnICkuZmluZCggJ1tpZF49XCJ3cGJjX25vdGljZV9cIl0nICk7XHJcblx0XHRpZiAoIChwYXJhbXNbICdpZl92aXNpYmxlX25vdF9zaG93JyBdKSAmJiAoanFfZWxfbWVzc2FnZS5pcyggJzp2aXNpYmxlJyApKSApe1xyXG5cdFx0XHRpc19zaG93X21lc3NhZ2UgPSBmYWxzZTtcclxuXHRcdFx0dW5pcXVlX2Rpdl9pZCA9IGpRdWVyeSgganFfZWxfbWVzc2FnZS5nZXQoIDAgKSApLmF0dHIoICdpZCcgKTtcclxuXHRcdH1cclxuXHRcdGlmICggaXNfc2hvd19tZXNzYWdlICl7XHJcblx0XHRcdGpRdWVyeSggcGFyYW1zWyAnc2hvd19oZXJlJyBdWyAnanFfbm9kZScgXSApLmJlZm9yZSggc2Nyb2xsX3RvX2VsZW1lbnQgKTtcdFx0Ly8gV2UgbmVlZCB0byAgc2V0ICBoZXJlIGJlZm9yZShmb3IgaGFuZHkgc2Nyb2xsKVxyXG5cdFx0XHRqUXVlcnkoIHBhcmFtc1sgJ3Nob3dfaGVyZScgXVsgJ2pxX25vZGUnIF0gKS5hZnRlciggJzxkaXYgY2xhc3M9XCJ3cGJjX2Zyb250X2VuZF9fbWVzc2FnZV9jb250YWluZXJfcmlnaHRcIj4nICsgbWVzc2FnZSArICc8L2Rpdj4nICk7XHJcblx0XHR9XHJcblx0fSBlbHNlIGlmICggJ2xlZnQnID09PSBwYXJhbXNbICdzaG93X2hlcmUnIF1bICd3aGVyZScgXSApe1xyXG5cclxuXHRcdGpxX2VsX21lc3NhZ2UgPSBqUXVlcnkoIHBhcmFtc1sgJ3Nob3dfaGVyZScgXVsgJ2pxX25vZGUnIF0gKS5zaWJsaW5ncyggJy53cGJjX2Zyb250X2VuZF9fbWVzc2FnZV9jb250YWluZXJfbGVmdCcgKS5maW5kKCAnW2lkXj1cIndwYmNfbm90aWNlX1wiXScgKTtcclxuXHRcdGlmICggKHBhcmFtc1sgJ2lmX3Zpc2libGVfbm90X3Nob3cnIF0pICYmIChqcV9lbF9tZXNzYWdlLmlzKCAnOnZpc2libGUnICkpICl7XHJcblx0XHRcdGlzX3Nob3dfbWVzc2FnZSA9IGZhbHNlO1xyXG5cdFx0XHR1bmlxdWVfZGl2X2lkID0galF1ZXJ5KCBqcV9lbF9tZXNzYWdlLmdldCggMCApICkuYXR0ciggJ2lkJyApO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCBpc19zaG93X21lc3NhZ2UgKXtcclxuXHRcdFx0alF1ZXJ5KCBwYXJhbXNbICdzaG93X2hlcmUnIF1bICdqcV9ub2RlJyBdICkuYmVmb3JlKCBzY3JvbGxfdG9fZWxlbWVudCApO1x0XHQvLyBXZSBuZWVkIHRvICBzZXQgIGhlcmUgYmVmb3JlKGZvciBoYW5keSBzY3JvbGwpXHJcblx0XHRcdGpRdWVyeSggcGFyYW1zWyAnc2hvd19oZXJlJyBdWyAnanFfbm9kZScgXSApLmJlZm9yZSggJzxkaXYgY2xhc3M9XCJ3cGJjX2Zyb250X2VuZF9fbWVzc2FnZV9jb250YWluZXJfbGVmdFwiPicgKyBtZXNzYWdlICsgJzwvZGl2PicgKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGlmICggICAoIGlzX3Nob3dfbWVzc2FnZSApICAmJiAgKCBwYXJzZUludCggcGFyYW1zWyAnZGVsYXknIF0gKSA+IDAgKSAgICl7XHJcblx0XHR2YXIgY2xvc2VkX3RpbWVyID0gc2V0VGltZW91dCggZnVuY3Rpb24gKCl7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0alF1ZXJ5KCAnIycgKyB1bmlxdWVfZGl2X2lkICkuZmFkZU91dCggMTUwMCApO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gLCBwYXJzZUludCggcGFyYW1zWyAnZGVsYXknIF0gKSAgICk7XHJcblxyXG5cdFx0dmFyIGNsb3NlZF90aW1lcjIgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKXtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggJyMnICsgdW5pcXVlX2Rpdl9pZCApLnRyaWdnZXIoICdoaWRlJyApO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sICggcGFyc2VJbnQoIHBhcmFtc1sgJ2RlbGF5JyBdICkgKyAxNTAxICkgKTtcclxuXHR9XHJcblxyXG5cdC8vIENoZWNrICBpZiBzaG93ZWQgbWVzc2FnZSBpbiBzb21lIGhpZGRlbiBwYXJlbnQgc2VjdGlvbiBhbmQgc2hvdyBpdC4gQnV0IGl0IG11c3QgIGJlIGxvd2VyIHRoYW4gJy53cGJjX2NvbnRhaW5lcidcclxuXHR2YXIgcGFyZW50X2VscyA9IGpRdWVyeSggJyMnICsgdW5pcXVlX2Rpdl9pZCApLnBhcmVudHMoKS5tYXAoIGZ1bmN0aW9uICgpe1xyXG5cdFx0aWYgKCAoIWpRdWVyeSggdGhpcyApLmlzKCAndmlzaWJsZScgKSkgJiYgKGpRdWVyeSggJy53cGJjX2NvbnRhaW5lcicgKS5oYXMoIHRoaXMgKSkgKXtcclxuXHRcdFx0alF1ZXJ5KCB0aGlzICkuc2hvdygpO1xyXG5cdFx0fVxyXG5cdH0gKTtcclxuXHJcblx0aWYgKCBwYXJhbXNbICdpc19zY3JvbGwnIF0gKXtcclxuXHRcdHdwYmNfZG9fc2Nyb2xsKCAnIycgKyB1bmlxdWVfZGl2X2lkICsgJ19zY3JvbGwnICk7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gdW5pcXVlX2Rpdl9pZDtcclxufVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogRXJyb3IgbWVzc2FnZS4gXHRQcmVzZXQgb2YgcGFyYW1ldGVycyBmb3IgcmVhbCBtZXNzYWdlIGZ1bmN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIGVsXHRcdC0gYW55IGpRdWVyeSBub2RlIGRlZmluaXRpb25cclxuXHQgKiBAcGFyYW0gbWVzc2FnZVx0LSBNZXNzYWdlIEhUTUxcclxuXHQgKiBAcmV0dXJucyBzdHJpbmcgIC0gSFRNTCBJRFx0XHRvciAwIGlmIG5vdCBzaG93aW5nIGR1cmluZyB0aGlzIHRpbWUuXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19mcm9udF9lbmRfX3Nob3dfbWVzc2FnZV9fZXJyb3IoIGpxX25vZGUsIG1lc3NhZ2UgKXtcclxuXHJcblx0XHR2YXIgbm90aWNlX21lc3NhZ2VfaWQgPSB3cGJjX2Zyb250X2VuZF9fc2hvd19tZXNzYWdlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3R5cGUnICAgICAgICAgICAgICAgOiAnZXJyb3InLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2RlbGF5JyAgICAgICAgICAgICAgOiAxMDAwMCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdpZl92aXNpYmxlX25vdF9zaG93JzogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdzaG93X2hlcmUnICAgICAgICAgIDoge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3doZXJlJyAgOiAncmlnaHQnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2pxX25vZGUnOiBqcV9ub2RlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICAgfVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRyZXR1cm4gbm90aWNlX21lc3NhZ2VfaWQ7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogRXJyb3IgbWVzc2FnZSBVTkRFUiBlbGVtZW50LiBcdFByZXNldCBvZiBwYXJhbWV0ZXJzIGZvciByZWFsIG1lc3NhZ2UgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZWxcdFx0LSBhbnkgalF1ZXJ5IG5vZGUgZGVmaW5pdGlvblxyXG5cdCAqIEBwYXJhbSBtZXNzYWdlXHQtIE1lc3NhZ2UgSFRNTFxyXG5cdCAqIEByZXR1cm5zIHN0cmluZyAgLSBIVE1MIElEXHRcdG9yIDAgaWYgbm90IHNob3dpbmcgZHVyaW5nIHRoaXMgdGltZS5cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2Zyb250X2VuZF9fc2hvd19tZXNzYWdlX19lcnJvcl91bmRlcl9lbGVtZW50KCBqcV9ub2RlLCBtZXNzYWdlLCBtZXNzYWdlX2RlbGF5ICl7XHJcblxyXG5cdFx0aWYgKCAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIChtZXNzYWdlX2RlbGF5KSApe1xyXG5cdFx0XHRtZXNzYWdlX2RlbGF5ID0gMFxyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBub3RpY2VfbWVzc2FnZV9pZCA9IHdwYmNfZnJvbnRfZW5kX19zaG93X21lc3NhZ2UoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQndHlwZScgICAgICAgICAgICAgICA6ICdlcnJvcicsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnZGVsYXknICAgICAgICAgICAgICA6IG1lc3NhZ2VfZGVsYXksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnaWZfdmlzaWJsZV9ub3Rfc2hvdyc6IHRydWUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnc2hvd19oZXJlJyAgICAgICAgICA6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCd3aGVyZScgIDogJ2FmdGVyJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdqcV9ub2RlJzoganFfbm9kZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgIH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0cmV0dXJuIG5vdGljZV9tZXNzYWdlX2lkO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEVycm9yIG1lc3NhZ2UgVU5ERVIgZWxlbWVudC4gXHRQcmVzZXQgb2YgcGFyYW1ldGVycyBmb3IgcmVhbCBtZXNzYWdlIGZ1bmN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIGVsXHRcdC0gYW55IGpRdWVyeSBub2RlIGRlZmluaXRpb25cclxuXHQgKiBAcGFyYW0gbWVzc2FnZVx0LSBNZXNzYWdlIEhUTUxcclxuXHQgKiBAcmV0dXJucyBzdHJpbmcgIC0gSFRNTCBJRFx0XHRvciAwIGlmIG5vdCBzaG93aW5nIGR1cmluZyB0aGlzIHRpbWUuXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19mcm9udF9lbmRfX3Nob3dfbWVzc2FnZV9fZXJyb3JfYWJvdmVfZWxlbWVudCgganFfbm9kZSwgbWVzc2FnZSwgbWVzc2FnZV9kZWxheSApe1xyXG5cclxuXHRcdGlmICggJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiAobWVzc2FnZV9kZWxheSkgKXtcclxuXHRcdFx0bWVzc2FnZV9kZWxheSA9IDEwMDAwXHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIG5vdGljZV9tZXNzYWdlX2lkID0gd3BiY19mcm9udF9lbmRfX3Nob3dfbWVzc2FnZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCd0eXBlJyAgICAgICAgICAgICAgIDogJ2Vycm9yJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdkZWxheScgICAgICAgICAgICAgIDogbWVzc2FnZV9kZWxheSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdpZl92aXNpYmxlX25vdF9zaG93JzogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdzaG93X2hlcmUnICAgICAgICAgIDoge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3doZXJlJyAgOiAnYmVmb3JlJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdqcV9ub2RlJzoganFfbm9kZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgIH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0cmV0dXJuIG5vdGljZV9tZXNzYWdlX2lkO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFdhcm5pbmcgbWVzc2FnZS4gXHRQcmVzZXQgb2YgcGFyYW1ldGVycyBmb3IgcmVhbCBtZXNzYWdlIGZ1bmN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIGVsXHRcdC0gYW55IGpRdWVyeSBub2RlIGRlZmluaXRpb25cclxuXHQgKiBAcGFyYW0gbWVzc2FnZVx0LSBNZXNzYWdlIEhUTUxcclxuXHQgKiBAcmV0dXJucyBzdHJpbmcgIC0gSFRNTCBJRFx0XHRvciAwIGlmIG5vdCBzaG93aW5nIGR1cmluZyB0aGlzIHRpbWUuXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19mcm9udF9lbmRfX3Nob3dfbWVzc2FnZV9fd2FybmluZygganFfbm9kZSwgbWVzc2FnZSApe1xyXG5cclxuXHRcdHZhciBub3RpY2VfbWVzc2FnZV9pZCA9IHdwYmNfZnJvbnRfZW5kX19zaG93X21lc3NhZ2UoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQndHlwZScgICAgICAgICAgICAgICA6ICd3YXJuaW5nJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdkZWxheScgICAgICAgICAgICAgIDogMTAwMDAsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnaWZfdmlzaWJsZV9ub3Rfc2hvdyc6IHRydWUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnc2hvd19oZXJlJyAgICAgICAgICA6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCd3aGVyZScgIDogJ3JpZ2h0JyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdqcV9ub2RlJzoganFfbm9kZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgIH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0d3BiY19oaWdobGlnaHRfZXJyb3Jfb25fZm9ybV9maWVsZCgganFfbm9kZSApO1xyXG5cdFx0cmV0dXJuIG5vdGljZV9tZXNzYWdlX2lkO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFdhcm5pbmcgbWVzc2FnZSBVTkRFUiBlbGVtZW50LiBcdFByZXNldCBvZiBwYXJhbWV0ZXJzIGZvciByZWFsIG1lc3NhZ2UgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZWxcdFx0LSBhbnkgalF1ZXJ5IG5vZGUgZGVmaW5pdGlvblxyXG5cdCAqIEBwYXJhbSBtZXNzYWdlXHQtIE1lc3NhZ2UgSFRNTFxyXG5cdCAqIEByZXR1cm5zIHN0cmluZyAgLSBIVE1MIElEXHRcdG9yIDAgaWYgbm90IHNob3dpbmcgZHVyaW5nIHRoaXMgdGltZS5cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2Zyb250X2VuZF9fc2hvd19tZXNzYWdlX193YXJuaW5nX3VuZGVyX2VsZW1lbnQoIGpxX25vZGUsIG1lc3NhZ2UgKXtcclxuXHJcblx0XHR2YXIgbm90aWNlX21lc3NhZ2VfaWQgPSB3cGJjX2Zyb250X2VuZF9fc2hvd19tZXNzYWdlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3R5cGUnICAgICAgICAgICAgICAgOiAnd2FybmluZycsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnZGVsYXknICAgICAgICAgICAgICA6IDEwMDAwLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2lmX3Zpc2libGVfbm90X3Nob3cnOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3Nob3dfaGVyZScgICAgICAgICAgOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnd2hlcmUnICA6ICdhZnRlcicsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnanFfbm9kZSc6IGpxX25vZGVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgICB9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdHJldHVybiBub3RpY2VfbWVzc2FnZV9pZDtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBXYXJuaW5nIG1lc3NhZ2UgQUJPVkUgZWxlbWVudC4gXHRQcmVzZXQgb2YgcGFyYW1ldGVycyBmb3IgcmVhbCBtZXNzYWdlIGZ1bmN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIGVsXHRcdC0gYW55IGpRdWVyeSBub2RlIGRlZmluaXRpb25cclxuXHQgKiBAcGFyYW0gbWVzc2FnZVx0LSBNZXNzYWdlIEhUTUxcclxuXHQgKiBAcmV0dXJucyBzdHJpbmcgIC0gSFRNTCBJRFx0XHRvciAwIGlmIG5vdCBzaG93aW5nIGR1cmluZyB0aGlzIHRpbWUuXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19mcm9udF9lbmRfX3Nob3dfbWVzc2FnZV9fd2FybmluZ19hYm92ZV9lbGVtZW50KCBqcV9ub2RlLCBtZXNzYWdlICl7XHJcblxyXG5cdFx0dmFyIG5vdGljZV9tZXNzYWdlX2lkID0gd3BiY19mcm9udF9lbmRfX3Nob3dfbWVzc2FnZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCd0eXBlJyAgICAgICAgICAgICAgIDogJ3dhcm5pbmcnLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2RlbGF5JyAgICAgICAgICAgICAgOiAxMDAwMCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdpZl92aXNpYmxlX25vdF9zaG93JzogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdzaG93X2hlcmUnICAgICAgICAgIDoge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3doZXJlJyAgOiAnYmVmb3JlJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdqcV9ub2RlJzoganFfbm9kZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgIH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0cmV0dXJuIG5vdGljZV9tZXNzYWdlX2lkO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSGlnaGxpZ2h0IEVycm9yIGluIHNwZWNpZmljIGZpZWxkXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ganFfbm9kZVx0XHRcdFx0XHRzdHJpbmcgb3IgalF1ZXJ5IGVsZW1lbnQsICB3aGVyZSBzY3JvbGwgIHRvXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19oaWdobGlnaHRfZXJyb3Jfb25fZm9ybV9maWVsZCgganFfbm9kZSApe1xyXG5cclxuXHRcdGlmICggIWpRdWVyeSgganFfbm9kZSApLmxlbmd0aCApe1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRpZiAoICEgalF1ZXJ5KCBqcV9ub2RlICkuaXMoICc6aW5wdXQnICkgKXtcclxuXHRcdFx0Ly8gU2l0dWF0aW9uIHdpdGggIGNoZWNrYm94ZXMgb3IgcmFkaW8gIGJ1dHRvbnNcclxuXHRcdFx0dmFyIGpxX25vZGVfYXJyID0galF1ZXJ5KCBqcV9ub2RlICkuZmluZCggJzppbnB1dCcgKTtcclxuXHRcdFx0aWYgKCAhanFfbm9kZV9hcnIubGVuZ3RoICl7XHJcblx0XHRcdFx0cmV0dXJuXHJcblx0XHRcdH1cclxuXHRcdFx0anFfbm9kZSA9IGpxX25vZGVfYXJyLmdldCggMCApO1xyXG5cdFx0fVxyXG5cdFx0dmFyIHBhcmFtcyA9IHt9O1xyXG5cdFx0cGFyYW1zWyAnZGVsYXknIF0gPSAxMDAwMDtcclxuXHJcblx0XHRpZiAoICFqUXVlcnkoIGpxX25vZGUgKS5oYXNDbGFzcyggJ3dwYmNfZm9ybV9maWVsZF9lcnJvcicgKSApe1xyXG5cclxuXHRcdFx0alF1ZXJ5KCBqcV9ub2RlICkuYWRkQ2xhc3MoICd3cGJjX2Zvcm1fZmllbGRfZXJyb3InIClcclxuXHJcblx0XHRcdGlmICggcGFyc2VJbnQoIHBhcmFtc1sgJ2RlbGF5JyBdICkgPiAwICl7XHJcblx0XHRcdFx0dmFyIGNsb3NlZF90aW1lciA9IHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgalF1ZXJ5KCBqcV9ub2RlICkucmVtb3ZlQ2xhc3MoICd3cGJjX2Zvcm1fZmllbGRfZXJyb3InICk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgICwgcGFyc2VJbnQoIHBhcmFtc1sgJ2RlbGF5JyBdIClcclxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG4vKipcclxuICogU2Nyb2xsIHRvIHNwZWNpZmljIGVsZW1lbnRcclxuICpcclxuICogQHBhcmFtIGpxX25vZGVcdFx0XHRcdFx0c3RyaW5nIG9yIGpRdWVyeSBlbGVtZW50LCAgd2hlcmUgc2Nyb2xsICB0b1xyXG4gKiBAcGFyYW0gZXh0cmFfc2hpZnRfb2Zmc2V0XHRcdGludCBzaGlmdCBvZmZzZXQgZnJvbSAganFfbm9kZVxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19kb19zY3JvbGwoIGpxX25vZGUgLCBleHRyYV9zaGlmdF9vZmZzZXQgPSAwICl7XHJcblxyXG5cdGlmICggIWpRdWVyeSgganFfbm9kZSApLmxlbmd0aCApe1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHR2YXIgdGFyZ2V0T2Zmc2V0ID0galF1ZXJ5KCBqcV9ub2RlICkub2Zmc2V0KCkudG9wO1xyXG5cclxuXHRpZiAoIHRhcmdldE9mZnNldCA8PSAwICl7XHJcblx0XHRpZiAoIDAgIT0galF1ZXJ5KCBqcV9ub2RlICkubmV4dEFsbCggJzp2aXNpYmxlJyApLmxlbmd0aCApe1xyXG5cdFx0XHR0YXJnZXRPZmZzZXQgPSBqUXVlcnkoIGpxX25vZGUgKS5uZXh0QWxsKCAnOnZpc2libGUnICkuZmlyc3QoKS5vZmZzZXQoKS50b3A7XHJcblx0XHR9IGVsc2UgaWYgKCAwICE9IGpRdWVyeSgganFfbm9kZSApLnBhcmVudCgpLm5leHRBbGwoICc6dmlzaWJsZScgKS5sZW5ndGggKXtcclxuXHRcdFx0dGFyZ2V0T2Zmc2V0ID0galF1ZXJ5KCBqcV9ub2RlICkucGFyZW50KCkubmV4dEFsbCggJzp2aXNpYmxlJyApLmZpcnN0KCkub2Zmc2V0KCkudG9wO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aWYgKCBqUXVlcnkoICcjd3BhZG1pbmJhcicgKS5sZW5ndGggPiAwICl7XHJcblx0XHR0YXJnZXRPZmZzZXQgPSB0YXJnZXRPZmZzZXQgLSA1MCAtIDUwO1xyXG5cdH0gZWxzZSB7XHJcblx0XHR0YXJnZXRPZmZzZXQgPSB0YXJnZXRPZmZzZXQgLSAyMCAtIDUwO1xyXG5cdH1cclxuXHR0YXJnZXRPZmZzZXQgKz0gZXh0cmFfc2hpZnRfb2Zmc2V0O1xyXG5cclxuXHQvLyBTY3JvbGwgb25seSAgaWYgd2UgZGlkIG5vdCBzY3JvbGwgYmVmb3JlXHJcblx0aWYgKCAhIGpRdWVyeSggJ2h0bWwsYm9keScgKS5pcyggJzphbmltYXRlZCcgKSApe1xyXG5cdFx0alF1ZXJ5KCAnaHRtbCxib2R5JyApLmFuaW1hdGUoIHtzY3JvbGxUb3A6IHRhcmdldE9mZnNldH0sIDUwMCApO1xyXG5cdH1cclxufVxyXG5cclxuIiwiXHJcbi8vIEZpeEluOiAxMC4yLjAuNC5cclxuLyoqXHJcbiAqIERlZmluZSBQb3BvdmVycyBmb3IgVGltZWxpbmVzIGluIFdQIEJvb2tpbmcgQ2FsZW5kYXJcclxuICpcclxuICogQHJldHVybnMge3N0cmluZ3xib29sZWFufVxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19kZWZpbmVfdGlwcHlfcG9wb3Zlcigpe1xyXG5cdGlmICggJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mICh3cGJjX3RpcHB5KSApe1xyXG5cdFx0Y29uc29sZS5sb2coICdXUEJDIEVycm9yLiB3cGJjX3RpcHB5IHdhcyBub3QgZGVmaW5lZC4nICk7XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG5cdHdwYmNfdGlwcHkoICcucG9wb3Zlcl9ib3R0b20ucG9wb3Zlcl9jbGljaycsIHtcclxuXHRcdGNvbnRlbnQoIHJlZmVyZW5jZSApe1xyXG5cdFx0XHR2YXIgcG9wb3Zlcl90aXRsZSA9IHJlZmVyZW5jZS5nZXRBdHRyaWJ1dGUoICdkYXRhLW9yaWdpbmFsLXRpdGxlJyApO1xyXG5cdFx0XHR2YXIgcG9wb3Zlcl9jb250ZW50ID0gcmVmZXJlbmNlLmdldEF0dHJpYnV0ZSggJ2RhdGEtY29udGVudCcgKTtcclxuXHRcdFx0cmV0dXJuICc8ZGl2IGNsYXNzPVwicG9wb3ZlciBwb3BvdmVyX3RpcHB5XCI+J1xyXG5cdFx0XHRcdCsgJzxkaXYgY2xhc3M9XCJwb3BvdmVyLWNsb3NlXCI+PGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIG9uY2xpY2s9XCJqYXZhc2NyaXB0OnRoaXMucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50Ll90aXBweS5oaWRlKCk7XCIgPiZ0aW1lczs8L2E+PC9kaXY+J1xyXG5cdFx0XHRcdCsgcG9wb3Zlcl9jb250ZW50XHJcblx0XHRcdFx0KyAnPC9kaXY+JztcclxuXHRcdH0sXHJcblx0XHRhbGxvd0hUTUwgICAgICAgIDogdHJ1ZSxcclxuXHRcdHRyaWdnZXIgICAgICAgICAgOiAnbWFudWFsJyxcclxuXHRcdGludGVyYWN0aXZlICAgICAgOiB0cnVlLFxyXG5cdFx0aGlkZU9uQ2xpY2sgICAgICA6IGZhbHNlLFxyXG5cdFx0aW50ZXJhY3RpdmVCb3JkZXI6IDEwLFxyXG5cdFx0bWF4V2lkdGggICAgICAgICA6IDU1MCxcclxuXHRcdHRoZW1lICAgICAgICAgICAgOiAnd3BiYy10aXBweS1wb3BvdmVyJyxcclxuXHRcdHBsYWNlbWVudCAgICAgICAgOiAnYm90dG9tLXN0YXJ0JyxcclxuXHRcdHRvdWNoICAgICAgICAgICAgOiBbJ2hvbGQnLCA1MDBdLFxyXG5cdH0gKTtcclxuXHRqUXVlcnkoICcucG9wb3Zlcl9ib3R0b20ucG9wb3Zlcl9jbGljaycgKS5vbiggJ2NsaWNrJywgZnVuY3Rpb24gKCl7XHJcblx0XHRpZiAoIHRoaXMuX3RpcHB5LnN0YXRlLmlzVmlzaWJsZSApe1xyXG5cdFx0XHR0aGlzLl90aXBweS5oaWRlKCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLl90aXBweS5zaG93KCk7XHJcblx0XHR9XHJcblx0fSApO1xyXG5cdHdwYmNfZGVmaW5lX2hpZGVfdGlwcHlfb25fc2Nyb2xsKCk7XHJcbn1cclxuXHJcblxyXG5cclxuZnVuY3Rpb24gd3BiY19kZWZpbmVfaGlkZV90aXBweV9vbl9zY3JvbGwoKXtcclxuXHRqUXVlcnkoICcuZmxleF90bF9fc2Nyb2xsaW5nX3NlY3Rpb24yLC5mbGV4X3RsX19zY3JvbGxpbmdfc2VjdGlvbnMnICkub24oICdzY3JvbGwnLCBmdW5jdGlvbiAoIGV2ZW50ICl7XHJcblx0XHRpZiAoICdmdW5jdGlvbicgPT09IHR5cGVvZiAod3BiY190aXBweSkgKXtcclxuXHRcdFx0d3BiY190aXBweS5oaWRlQWxsKCk7XHJcblx0XHR9XHJcblx0fSApO1xyXG59XHJcbiIsIi8qKlxyXG4gKiBXUEJDIGNhbGVuZGFyIGxvYWRlciBib290c3RyYXAuXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogLSBGaW5kcyBldmVyeSAuY2FsZW5kYXJfbG9hZGVyX2ZyYW1lW2RhdGEtd3BiYy1yaWRdIG9uIHRoZSBwYWdlIChub3cgb3IgbGF0ZXIpLlxyXG4gKiAtIEZvciBlYWNoIGxvYWRlciBlbGVtZW50LCB3YWl0cyBhIFwiZ3JhY2VcIiBwZXJpb2QgKGRhdGEtd3BiYy1ncmFjZSwgZGVmYXVsdCA4MDAwIG1zKTpcclxuICogICAgIC0gSWYgdGhlIHJlYWwgY2FsZW5kYXIgYXBwZWFyczogZG8gbm90aGluZyAobG9hZGVyIG5hdHVyYWxseSByZXBsYWNlZCkuXHJcbiAqICAgICAtIElmIG5vdDogc2hvdyBhIGhlbHBmdWwgbWVzc2FnZSAobWlzc2luZyBqUXVlcnkvX3dwYmMvZGF0ZXBpY2spIG9yIGEgZHVwbGljYXRlIG5vdGljZS5cclxuICogLSBXb3JrcyB3aXRoIG11bHRpcGxlIGNhbGVuZGFycyBhbmQgZXZlbiBkdXBsaWNhdGUgUklEcyBvbiB0aGUgc2FtZSBwYWdlLlxyXG4gKiAtIE5vIGlubGluZSBKUyBuZWVkZWQgaW4gdGhlIHNob3J0Y29kZS90ZW1wbGF0ZSBvdXRwdXQuXHJcbiAqXHJcbiAqIEZpbGU6ICAuLi9pbmNsdWRlcy9fX2pzL2NsaWVudC9jYWwvd3BiY19jYWxfbG9hZGVyLmpzXHJcbiAqXHJcbiAqIEBzaW5jZSAgICAxMC4xNC41XHJcbiAqIEBtb2RpZmllZCAyMDI1LTA5LTA3IDEyOjIxXHJcbiAqIEB2ZXJzaW9uICAxLjAuMFxyXG4gKlxyXG4gKi9cclxuLyoqXHJcbiAqIFdQQkMgY2FsZW5kYXIgbG9hZGVyIGJvb3RzdHJhcC5cclxuICogLSBBdXRvLWRldGVjdHMgLmNhbGVuZGFyX2xvYWRlcl9mcmFtZVtkYXRhLXdwYmMtcmlkXSBibG9ja3MuXHJcbiAqIC0gV2FpdHMgYSBcImdyYWNlXCIgcGVyaW9kIHBlciBlbGVtZW50IGJlZm9yZSBzaG93aW5nIGEgaGVscGZ1bCBtZXNzYWdlXHJcbiAqICAgaWYgdGhlIHJlYWwgY2FsZW5kYXIgaGFzbid0IHJlcGxhY2VkIHRoZSBsb2FkZXIuXHJcbiAqIC0gTXVsdGlwbGUgY2FsZW5kYXJzIGFuZCBkdXBsaWNhdGUgUklEcyBhcmUgaGFuZGxlZC5cclxuICovXHJcbihmdW5jdGlvbiAodywgZCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0ICogU21hbGwgdXRpbGl0aWVzIChzbmFrZV9jYXNlKVxyXG5cdCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuXHQvKiogVHJhY2sgcHJvY2Vzc2VkIGxvYWRlciBlbGVtZW50czsgZmFsbGJhY2sgdG8gZGF0YSBmbGFnIGlmIFdlYWtTZXQgbWlzc2luZy4gKi9cclxuXHR2YXIgcHJvY2Vzc2VkX3NldCA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nID8gbmV3IFdlYWtTZXQoKSA6IG51bGw7XHJcblxyXG5cdC8qKiBSZXR1cm4gZmlyc3QgbWF0Y2ggaW5zaWRlIG9wdGlvbmFsIHJvb3QuICovXHJcblx0ZnVuY3Rpb24gcXVlcnlfb25lKHNlbGVjdG9yLCByb290KSB7XHJcblx0XHRyZXR1cm4gKHJvb3QgfHwgZCkucXVlcnlTZWxlY3Rvciggc2VsZWN0b3IgKTtcclxuXHR9XHJcblxyXG5cdC8qKiBSZXR1cm4gTm9kZUxpc3Qgb2YgbWF0Y2hlcyBpbnNpZGUgb3B0aW9uYWwgcm9vdC4gKi9cclxuXHRmdW5jdGlvbiBxdWVyeV9hbGwoc2VsZWN0b3IsIHJvb3QpIHtcclxuXHRcdHJldHVybiAocm9vdCB8fCBkKS5xdWVyeVNlbGVjdG9yQWxsKCBzZWxlY3RvciApO1xyXG5cdH1cclxuXHJcblx0LyoqIFJ1biBhIGNhbGxiYWNrIHdoZW4gRE9NIGlzIHJlYWR5LiAqL1xyXG5cdGZ1bmN0aW9uIG9uX3JlYWR5KGZuKSB7XHJcblx0XHRpZiAoIGQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnICkge1xyXG5cdFx0XHRkLmFkZEV2ZW50TGlzdGVuZXIoICdET01Db250ZW50TG9hZGVkJywgZm4gKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGZuKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKiogQ2xlYXIgaW50ZXJ2YWwgc2FmZWx5LiAqL1xyXG5cdGZ1bmN0aW9uIHNhZmVfY2xlYXIoaW50ZXJ2YWxfaWQpIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdHcuY2xlYXJJbnRlcnZhbCggaW50ZXJ2YWxfaWQgKTtcclxuXHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqIE1hcmsgZWxlbWVudCBwcm9jZXNzZWQgKFdlYWtTZXQgb3IgZGF0YSBhdHRyaWJ1dGUpLiAqL1xyXG5cdGZ1bmN0aW9uIG1hcmtfcHJvY2Vzc2VkKGVsKSB7XHJcblx0XHRpZiAoIHByb2Nlc3NlZF9zZXQgKSB7XHJcblx0XHRcdHByb2Nlc3NlZF9zZXQuYWRkKCBlbCApO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRlbC5kYXRhc2V0LndwYmNQcm9jZXNzZWQgPSAnMSc7XHJcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKiogQ2hlY2sgaWYgZWxlbWVudCB3YXMgcHJvY2Vzc2VkLiAqL1xyXG5cdGZ1bmN0aW9uIGlzX3Byb2Nlc3NlZChlbCkge1xyXG5cdFx0cmV0dXJuIHByb2Nlc3NlZF9zZXQgPyBwcm9jZXNzZWRfc2V0LmhhcyggZWwgKSA6IChlbCAmJiBlbC5kYXRhc2V0ICYmIGVsLmRhdGFzZXQud3BiY1Byb2Nlc3NlZCA9PT0gJzEnKTtcclxuXHR9XHJcblxyXG5cdC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdCAqIE1lc3NhZ2VzIChmaXhlZCBFbmdsaXNoIHN0cmluZ3M7IG5vIGkxOG4pXHJcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXHJcblxyXG5cdC8qKlxyXG5cdCAqIEJ1aWxkIGZpeGVkIEVuZ2xpc2ggbWVzc2FnZXMgZm9yIGEgcmVzb3VyY2UuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSByaWRcclxuXHQgKiBAcmV0dXJuIHt7ZHVwbGljYXRlOnN0cmluZyxzdXBwb3J0OnN0cmluZyxsaWJfanE6c3RyaW5nLGxpYl9kcDpzdHJpbmcsbGliX3dwYmM6c3RyaW5nfX1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiBnZXRfbWVzc2FnZXMocmlkKSB7XHJcblx0XHR2YXIgcmlkX2ludCA9IHBhcnNlSW50KCByaWQsIDEwICk7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRkdXBsaWNhdGUgIDpcclxuXHRcdFx0XHQnWW91IGhhdmUgYWRkZWQgdGhlIHNhbWUgY2FsZW5kYXIgKElEID0gJyArIHJpZF9pbnQgKyAnKSBtb3JlIHRoYW4gb25jZSBvbiB0aGlzIHBhZ2UuICcgK1xyXG5cdFx0XHRcdCdQbGVhc2Uga2VlcCBvbmx5IG9uZSBjYWxlbmRhciB3aXRoIHRoZSBzYW1lIElEIG9uIGEgcGFnZSB0byBhdm9pZCBjb25mbGljdHMuJyxcclxuXHRcdFx0aW5pdF9mYWlsZWQ6XHJcblx0XHRcdFx0J1RoZSBjYWxlbmRhciBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQgb24gdGhpcyBwYWdlLicgKyAnXFxuJyArXHJcblx0XHRcdFx0J1BsZWFzZSBjaGVjayB5b3VyIGJyb3dzZXIgY29uc29sZSBmb3IgSmF2YVNjcmlwdCBlcnJvcnMgYW5kIGNvbmZsaWN0cyB3aXRoIG90aGVyIHNjcmlwdHMvcGx1Z2lucy4nLFxyXG5cdFx0XHRzdXBwb3J0ICAgIDogJycsIC8qICdDb250YWN0IHN1cHBvcnRAd3Bib29raW5nY2FsZW5kYXIuY29tIGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMuJywgKi9cclxuXHRcdFx0bGliX2pxICAgICA6XHJcblx0XHRcdFx0J0l0IGFwcGVhcnMgdGhhdCB0aGUgXCJqUXVlcnlcIiBsaWJyYXJ5IGlzIG5vdCBsb2FkaW5nIGNvcnJlY3RseS4nICsgJ1xcbicgK1xyXG5cdFx0XHRcdCdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIHRoaXMgcGFnZTogaHR0cHM6Ly93cGJvb2tpbmdjYWxlbmRhci5jb20vZmFxLycsXHJcblx0XHRcdGxpYl9kcCAgICAgOlxyXG5cdFx0XHRcdCdJdCBhcHBlYXJzIHRoYXQgdGhlIFwialF1ZXJ5LmRhdGVwaWNrXCIgbGlicmFyeSBpcyBub3QgbG9hZGluZyBjb3JyZWN0bHkuJyArICdcXG4nICtcclxuXHRcdFx0XHQnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0byB0aGlzIHBhZ2U6IGh0dHBzOi8vd3Bib29raW5nY2FsZW5kYXIuY29tL2ZhcS8nLFxyXG5cdFx0XHRsaWJfd3BiYyAgIDpcclxuXHRcdFx0XHQnSXQgYXBwZWFycyB0aGF0IHRoZSBcIl93cGJjXCIgbGlicmFyeSBpcyBub3QgbG9hZGluZyBjb3JyZWN0bHkuJyArICdcXG4nICtcclxuXHRcdFx0XHQnUGxlYXNlIGVuYWJsZSB0aGUgbG9hZGluZyBvZiBKUy9DU1MgZmlsZXMgZm9yIHRoaXMgcGFnZSBvbiB0aGUgXCJXUCBCb29raW5nIENhbGVuZGFyXCIgLSBcIlNldHRpbmdzIEdlbmVyYWxcIiAtIFwiQWR2YW5jZWRcIiBwYWdlJyArICdcXG4nICtcclxuXHRcdFx0XHQnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0byB0aGlzIHBhZ2U6IGh0dHBzOi8vd3Bib29raW5nY2FsZW5kYXIuY29tL2ZhcS8nXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV3JhcCBwbGFpbiB0ZXh0ICh3aXRoIG5ld2xpbmVzKSBpbiBhIHNtYWxsIEhUTUwgY29udGFpbmVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtc2dcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3JhcF9odG1sKG1zZykge1xyXG5cdFx0cmV0dXJuICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjEzcHg7bWFyZ2luOjEwcHg7XCI+JyArIFN0cmluZyggbXNnIHx8ICcnICkucmVwbGFjZSggL1xcbi9nLCAnPGJyPicgKSArICc8L2Rpdj4nO1xyXG5cdH1cclxuXHJcblx0LyoqIExpYnJhcnkgcHJlc2VuY2UgY2hlY2tzIChmYXN0ICYgY2hlYXApLiAqL1xyXG5cdGZ1bmN0aW9uIGhhc19qcSgpIHtcclxuXHRcdHJldHVybiAhISh3LmpRdWVyeSAmJiBqUXVlcnkuZm4gJiYgdHlwZW9mIGpRdWVyeS5mbi5vbiA9PT0gJ2Z1bmN0aW9uJyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBoYXNfZHAoKSB7XHJcblx0XHRyZXR1cm4gISEody5qUXVlcnkgJiYgalF1ZXJ5LmRhdGVwaWNrKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGhhc193cGJjKCkge1xyXG5cdFx0cmV0dXJuICEhKHcuX3dwYmMgJiYgdHlwZW9mIHcuX3dwYmMuc2V0X290aGVyX3BhcmFtID09PSAnZnVuY3Rpb24nKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIG5vcm1hbGl6ZV9yaWQocmlkKSB7XHJcblx0XHR2YXIgbiA9IHBhcnNlSW50KCByaWQsIDEwICk7XHJcblx0XHRyZXR1cm4gKG4gPiAwKSA/IFN0cmluZyggbiApIDogJyc7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXRfcmlkX2NvdW50cyhyaWQpIHtcclxuXHRcdHZhciByID0gbm9ybWFsaXplX3JpZCggcmlkICk7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRyaWQgICAgICAgOiByLFxyXG5cdFx0XHRsb2FkZXJzICAgOiByID8gcXVlcnlfYWxsKCAnLmNhbGVuZGFyX2xvYWRlcl9mcmFtZVtkYXRhLXdwYmMtcmlkPVwiJyArIHIgKyAnXCJdJyApLmxlbmd0aCA6IDAsXHJcblx0XHRcdGNvbnRhaW5lcnM6IHIgPyBxdWVyeV9hbGwoICcjY2FsZW5kYXJfYm9va2luZycgKyByICkubGVuZ3RoIDogMFxyXG5cdFx0fTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGlzX2R1cGxpY2F0ZV9yaWQocmlkKSB7XHJcblx0XHR2YXIgYyA9IGdldF9yaWRfY291bnRzKCByaWQgKTtcclxuXHRcdHJldHVybiAoYy5sb2FkZXJzID4gMSkgfHwgKGMuY29udGFpbmVycyA+IDEpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGV0ZXJtaW5lIGlmIHRoZSBsb2FkZXIgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIHJlYWwgY2FsZW5kYXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0VsZW1lbnR9IGVsICAgICAgIExvYWRlciBlbGVtZW50XHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHJpZCAgICAgICBSZXNvdXJjZSBJRFxyXG5cdCAqIEBwYXJhbSB7RWxlbWVudHxudWxsfSBjb250YWluZXIgT3B0aW9uYWwgI2NhbGVuZGFyX2Jvb2tpbmd7cmlkfSBlbGVtZW50XHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiBpc19yZXBsYWNlZChlbCwgcmlkLCBjb250YWluZXIpIHtcclxuXHRcdHZhciBsb2FkZXJfc3RpbGxfaW5fZG9tID0gZC5ib2R5LmNvbnRhaW5zKCBlbCApO1xyXG5cdFx0dmFyIGNhbGVuZGFyX2V4aXN0cyAgICAgPSAhIXF1ZXJ5X29uZSggJy53cGJjX2NhbGVuZGFyX2lkXycgKyByaWQsIGNvbnRhaW5lciB8fCBkICk7XHJcblx0XHRyZXR1cm4gKCFsb2FkZXJfc3RpbGxfaW5fZG9tKSB8fCBjYWxlbmRhcl9leGlzdHM7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydCB3YXRjaGVyIGZvciBhIHNpbmdsZSBsb2FkZXIgZWxlbWVudC5cclxuXHQgKiAtIFBvbGxzIGFuZCBvYnNlcnZlcyB0aGUgY2FsZW5kYXIgY29udGFpbmVyLlxyXG5cdCAqIC0gQWZ0ZXIgZ3JhY2UsIGluamVjdHMgYSBzdWl0YWJsZSBtZXNzYWdlIGlmIG5vdCByZXBsYWNlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RWxlbWVudH0gZWxcclxuXHQgKi9cclxuXHRmdW5jdGlvbiBzdGFydF9mb3IoZWwpIHtcclxuXHRcdGlmICggISBlbCB8fCBpc19wcm9jZXNzZWQoIGVsICkgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdG1hcmtfcHJvY2Vzc2VkKCBlbCApO1xyXG5cclxuXHRcdHZhciByaWQgPSBlbC5kYXRhc2V0LndwYmNSaWQ7XHJcblx0XHRpZiAoICEgcmlkICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGdyYWNlX21zID0gcGFyc2VJbnQoIGVsLmRhdGFzZXQud3BiY0dyYWNlIHx8ICc4MDAwJywgMTAgKTtcclxuXHRcdGlmICggISAoZ3JhY2VfbXMgPiAwKSApIHtcclxuXHRcdFx0Z3JhY2VfbXMgPSA4MDAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBjb250YWluZXJfaWQgPSAnY2FsZW5kYXJfYm9va2luZycgKyByaWQ7XHJcblx0XHR2YXIgY29udGFpbmVyICAgID0gZC5nZXRFbGVtZW50QnlJZCggY29udGFpbmVyX2lkICk7XHJcblx0XHR2YXIgdGV4dF9lbCAgICAgID0gcXVlcnlfb25lKCAnLmNhbGVuZGFyX2xvYWRlcl90ZXh0JywgZWwgKTtcclxuXHJcblx0XHRmdW5jdGlvbiByZXBsYWNlZF9ub3coKSB7XHJcblx0XHRcdHJldHVybiBpc19yZXBsYWNlZCggZWwsIHJpZCwgY29udGFpbmVyICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQWxyZWFkeSByZXBsYWNlZCAtPiBub3RoaW5nIHRvIGRvLlxyXG5cdFx0aWYgKCByZXBsYWNlZF9ub3coKSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIDEpIENoZWFwIHBvbGxpbmcuXHJcblx0XHR2YXIgcG9sbF9pZCA9IHcuc2V0SW50ZXJ2YWwoIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0aWYgKCByZXBsYWNlZF9ub3coKSApIHtcclxuXHRcdFx0XHRzYWZlX2NsZWFyKCBwb2xsX2lkICk7XHJcblx0XHRcdFx0aWYgKCBvYnNlcnZlciApIHtcclxuXHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuXHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSwgMjUwICk7XHJcblxyXG5cdFx0Ly8gMikgTXV0YXRpb25PYnNlcnZlciBmb3IgZmFzdGVyIHJlYWN0aW9uLlxyXG5cdFx0dmFyIG9ic2VydmVyID0gbnVsbDtcclxuXHRcdGlmICggY29udGFpbmVyICYmICdNdXRhdGlvbk9ic2VydmVyJyBpbiB3ICkge1xyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdGlmICggcmVwbGFjZWRfbm93KCkgKSB7XHJcblx0XHRcdFx0XHRcdHNhZmVfY2xlYXIoIHBvbGxfaWQgKTtcclxuXHRcdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdG9ic2VydmVyLm9ic2VydmUoIGNvbnRhaW5lciwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSApO1xyXG5cdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIDMpIEZpbmFsIGRlY2lzaW9uIGFmdGVyIGdyYWNlIHBlcmlvZC5cclxuXHRcdHcuc2V0VGltZW91dCggZnVuY3Rpb24gZmluYWxpemVfYWZ0ZXJfZ3JhY2UoKSB7XHJcblx0XHRcdGlmICggcmVwbGFjZWRfbm93KCkgKSB7XHJcblx0XHRcdFx0c2FmZV9jbGVhciggcG9sbF9pZCApO1xyXG5cdFx0XHRcdGlmICggb2JzZXJ2ZXIgKSB7XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcblx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgTSA9IGdldF9tZXNzYWdlcyggcmlkICk7XHJcblx0XHRcdHZhciBtc2c7XHJcblx0XHRcdGlmICggISBoYXNfanEoKSApIHtcclxuXHRcdFx0XHRtc2cgPSBNLmxpYl9qcTtcclxuXHRcdFx0fSBlbHNlIGlmICggISBoYXNfd3BiYygpICkge1xyXG5cdFx0XHRcdG1zZyA9IE0ubGliX3dwYmM7XHJcblx0XHRcdH0gZWxzZSBpZiAoICEgaGFzX2RwKCkgKSB7XHJcblx0XHRcdFx0bXNnID0gTS5saWJfZHA7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gTGlicmFyaWVzIGFyZSBwcmVzZW50LCBidXQgbG9hZGVyIHdhc24ndCByZXBsYWNlZCAtPiBkZWNpZGUgd2hhdCBpcyBtb3N0IGxpa2VseS5cclxuXHRcdFx0XHRpZiAoIGlzX2R1cGxpY2F0ZV9yaWQoIHJpZCApICkge1xyXG5cdFx0XHRcdFx0bXNnID0gTS5kdXBsaWNhdGUgKyAnXFxuXFxuJyArIE0uc3VwcG9ydDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0bXNnID0gTS5pbml0X2ZhaWxlZCArICdcXG5cXG4nICsgTS5zdXBwb3J0O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRpZiAoIHRleHRfZWwgKSB7XHJcblx0XHRcdFx0XHR0ZXh0X2VsLmlubmVySFRNTCA9IHdyYXBfaHRtbCggbXNnICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c2FmZV9jbGVhciggcG9sbF9pZCApO1xyXG5cdFx0XHRpZiAoIG9ic2VydmVyICkge1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9LCBncmFjZV9tcyApO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5pdGlhbGl6ZSB3YXRjaGVycyBmb3IgbG9hZGVyIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIERPTS5cclxuXHQgKi9cclxuXHRmdW5jdGlvbiBib290c3RyYXBfZXhpc3RpbmcoKSB7XHJcblx0XHRxdWVyeV9hbGwoICcuY2FsZW5kYXJfbG9hZGVyX2ZyYW1lW2RhdGEtd3BiYy1yaWRdJyApLmZvckVhY2goIHN0YXJ0X2ZvciApO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT2JzZXJ2ZSB0aGUgZG9jdW1lbnQgZm9yIGFueSBuZXcgbG9hZGVyIGVsZW1lbnRzIGluc2VydGVkIGxhdGVyIChBSkFYLCBibG9jayByZW5kZXIpLlxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIG9ic2VydmVfbmV3X2xvYWRlcnMoKSB7XHJcblx0XHRpZiAoICEgKCdNdXRhdGlvbk9ic2VydmVyJyBpbiB3KSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0dmFyIGRvY19vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCBmdW5jdGlvbiAobXV0YXRpb25zKSB7XHJcblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbXV0YXRpb25zLmxlbmd0aDsgaSsrICkge1xyXG5cdFx0XHRcdFx0dmFyIG5vZGVzID0gbXV0YXRpb25zW2ldLmFkZGVkTm9kZXMgfHwgW107XHJcblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBub2Rlcy5sZW5ndGg7IGorKyApIHtcclxuXHRcdFx0XHRcdFx0dmFyIG5vZGUgPSBub2Rlc1tqXTtcclxuXHRcdFx0XHRcdFx0aWYgKCAhIG5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSApIHtcclxuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAoIG5vZGUubWF0Y2hlcyAmJiBub2RlLm1hdGNoZXMoICcuY2FsZW5kYXJfbG9hZGVyX2ZyYW1lW2RhdGEtd3BiYy1yaWRdJyApICkge1xyXG5cdFx0XHRcdFx0XHRcdHN0YXJ0X2Zvciggbm9kZSApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmICggbm9kZS5xdWVyeVNlbGVjdG9yQWxsICkge1xyXG5cdFx0XHRcdFx0XHRcdHZhciBpbm5lciA9IG5vZGUucXVlcnlTZWxlY3RvckFsbCggJy5jYWxlbmRhcl9sb2FkZXJfZnJhbWVbZGF0YS13cGJjLXJpZF0nICk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCBpbm5lciAmJiBpbm5lci5sZW5ndGggKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpbm5lci5mb3JFYWNoKCBzdGFydF9mb3IgKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gKTtcclxuXHRcdFx0ZG9jX29ic2VydmVyLm9ic2VydmUoIGQuZG9jdW1lbnRFbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9ICk7XHJcblx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdCAqIEJvb3RcclxuXHQgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuXHRvbl9yZWFkeSggZnVuY3Rpb24gKCkge1xyXG5cdFx0Ym9vdHN0cmFwX2V4aXN0aW5nKCk7XHJcblx0XHRvYnNlcnZlX25ld19sb2FkZXJzKCk7XHJcblx0fSApO1xyXG5cclxufSkoIHdpbmRvdywgZG9jdW1lbnQgKTtcclxuIiwiKGZ1bmN0aW9uKCB3ICkge1xyXG5cclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdGlmICggISB3LldQQkNfRkUgKSB7XHJcblx0XHR3LldQQkNfRkUgPSB7fTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEF1dG8tZmlsbCBib29raW5nIGZvcm0gZmllbGRzICh0ZXh0L2VtYWlsKSBiYXNlZCBvbiBpbnB1dCBcIm5hbWVcIiBwYXR0ZXJucy5cclxuXHQgKlxyXG5cdCAqIEZvcm0gSUQgZm9ybWF0OiBib29raW5nX2Zvcm17cmVzb3VyY2VfaWR9XHJcblx0ICogU2tpcHMgZGF0ZSBmaWVsZDogZGF0ZV9ib29raW5ne3Jlc291cmNlX2lkfVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHJlc291cmNlX2lkIEJvb2tpbmcgcmVzb3VyY2UgSUQuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGZpbGxfdmFsdWVzIFZhbHVlcyB0byBpbmplY3QgKHN0cmluZ3MpLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBmb3JtIGZvdW5kIGFuZCBwcm9jZXNzZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuXHQgKi9cclxuXHR3LldQQkNfRkUuYXV0b2ZpbGxfYm9va2luZ19mb3JtX2ZpZWxkcyA9IGZ1bmN0aW9uKCByZXNvdXJjZV9pZCwgZmlsbF92YWx1ZXMgKSB7XHJcblxyXG5cdFx0cmVzb3VyY2VfaWQgID0gcGFyc2VJbnQoIHJlc291cmNlX2lkLCAxMCApIHx8IDA7XHJcblx0XHRmaWxsX3ZhbHVlcyAgPSBmaWxsX3ZhbHVlcyB8fCB7fTtcclxuXHJcblx0XHR2YXIgZm9ybV9pZCAgID0gJ2Jvb2tpbmdfZm9ybScgKyByZXNvdXJjZV9pZDtcclxuXHRcdHZhciBkYXRlX25hbWUgPSAnZGF0ZV9ib29raW5nJyArIHJlc291cmNlX2lkO1xyXG5cclxuXHRcdHZhciBzdWJtaXRfZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBmb3JtX2lkICk7XHJcblxyXG5cdFx0aWYgKCAhIHN1Ym1pdF9mb3JtICkge1xyXG5cdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdXUEJDOiBObyBib29raW5nIGZvcm06ICcgKyBmb3JtX2lkICk7XHJcblx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gS2VlcCBzYW1lIHJlZ2V4IHJ1bGVzIGFuZCBwcmlvcml0eSBvcmRlciBhcyBsZWdhY3kgaW5saW5lIEpTLlxyXG5cdFx0dmFyIHJ1bGVzID0gYXJyYXlfcnVsZXMoIGZpbGxfdmFsdWVzICk7XHJcblxyXG5cdFx0dmFyIGVsZW1lbnRzID0gc3VibWl0X2Zvcm0uZWxlbWVudHMgfHwgW107XHJcblx0XHR2YXIgY291bnQgICAgPSBlbGVtZW50cy5sZW5ndGg7XHJcblx0XHR2YXIgZWw7XHJcblx0XHR2YXIgaTtcclxuXHRcdHZhciBqO1xyXG5cclxuXHRcdGZvciAoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApIHtcclxuXHJcblx0XHRcdGVsID0gZWxlbWVudHNbIGkgXTtcclxuXHJcblx0XHRcdGlmICggISBlbCB8fCAhIGVsLm5hbWUgKSB7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE9ubHkgdGV4dC9lbWFpbCBpbnB1dHMuXHJcblx0XHRcdGlmICggKCBlbC50eXBlICE9PSAndGV4dCcgKSAmJiAoIGVsLnR5cGUgIT09ICdlbWFpbCcgKSApIHtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gU2tpcCBkYXRlIGZpZWxkLlxyXG5cdFx0XHRpZiAoIGVsLm5hbWUgPT09IGRhdGVfbmFtZSApIHtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gRmlsbCBvbmx5IGVtcHR5IHZhbHVlcyAobGVnYWN5IGJlaGF2aW9yOiA9PSBcIlwiKS5cclxuXHRcdFx0aWYgKCBlbC52YWx1ZSAhPT0gJycgKSB7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZvciAoIGogPSAwOyBqIDwgcnVsZXMubGVuZ3RoOyBqKysgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcnVsZXNbIGogXS5yZS50ZXN0KCBlbC5uYW1lICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBydWxlc1sgaiBdLnZhbCAhPT0gJycgKSB7XHJcblx0XHRcdFx0XHRcdGVsLnZhbHVlID0gcnVsZXNbIGogXS52YWw7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7IC8vIFN0b3AgYXQgZmlyc3QgbWF0Y2hpbmcgcnVsZSAocHJpb3JpdHkpLlxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJ1aWxkIHJ1bGVzIGFycmF5IGZvciBhdXRvZmlsbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBmaWxsX3ZhbHVlcyBWYWx1ZXMgdG8gaW5qZWN0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXJyYXl9IFJ1bGVzIGxpc3QuXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gYXJyYXlfcnVsZXMoIGZpbGxfdmFsdWVzICkge1xyXG5cclxuXHRcdC8vIE5vcm1hbGl6ZSB0byBzdHJpbmdzIChwcmV2ZW50IFwidW5kZWZpbmVkXCIgaW4gZmllbGRzKS5cclxuXHRcdHZhciBuaWNrbmFtZSAgPSAoIGZpbGxfdmFsdWVzLm5pY2tuYW1lICE9IG51bGwgKSA/IFN0cmluZyggZmlsbF92YWx1ZXMubmlja25hbWUgKSA6ICcnO1xyXG5cdFx0dmFyIGxhc3RfbmFtZSA9ICggZmlsbF92YWx1ZXMubGFzdF9uYW1lICE9IG51bGwgKSA/IFN0cmluZyggZmlsbF92YWx1ZXMubGFzdF9uYW1lICkgOiAnJztcclxuXHRcdHZhciBmaXJzdF9uYW1lID0gKCBmaWxsX3ZhbHVlcy5maXJzdF9uYW1lICE9IG51bGwgKSA/IFN0cmluZyggZmlsbF92YWx1ZXMuZmlyc3RfbmFtZSApIDogJyc7XHJcblx0XHR2YXIgZW1haWwgICAgID0gKCBmaWxsX3ZhbHVlcy5lbWFpbCAhPSBudWxsICkgPyBTdHJpbmcoIGZpbGxfdmFsdWVzLmVtYWlsICkgOiAnJztcclxuXHRcdHZhciBwaG9uZSAgICAgPSAoIGZpbGxfdmFsdWVzLnBob25lICE9IG51bGwgKSA/IFN0cmluZyggZmlsbF92YWx1ZXMucGhvbmUgKSA6ICcnO1xyXG5cdFx0dmFyIG5iX2VuZmFudCA9ICggZmlsbF92YWx1ZXMubmJfZW5mYW50ICE9IG51bGwgKSA/IFN0cmluZyggZmlsbF92YWx1ZXMubmJfZW5mYW50ICkgOiAnJztcclxuXHRcdHZhciB1cmwgICAgICAgPSAoIGZpbGxfdmFsdWVzLnVybCAhPSBudWxsICkgPyBTdHJpbmcoIGZpbGxfdmFsdWVzLnVybCApIDogJyc7XHJcblxyXG5cdFx0cmV0dXJuIFtcclxuXHRcdFx0eyByZTogL14oW0EtWmEtejAtOV9cXC1cXC5dKSoobmlja25hbWUpezF9KFtBLVphLXowLTlfXFwtXFwuXSkqJC8sIHZhbDogbmlja25hbWUgfSxcclxuXHRcdFx0eyByZTogL14oW0EtWmEtejAtOV9cXC1cXC5dKSoobGFzdHxzZWNvbmQpezF9KFtfXFwtXFwuXSk/bmFtZShbQS1aYS16MC05X1xcLVxcLl0pKiQvLCB2YWw6IGxhc3RfbmFtZSB9LFxyXG5cdFx0XHR7IHJlOiAvXm5hbWUoWzAtOV9cXC1cXC5dKSokLywgdmFsOiBmaXJzdF9uYW1lIH0sXHJcblx0XHRcdHsgcmU6IC9eKFtBLVphLXowLTlfXFwtXFwuXSkqKGZpcnN0fG15KXsxfShbX1xcLVxcLl0pP25hbWUoW0EtWmEtejAtOV9cXC1cXC5dKSokLywgdmFsOiBmaXJzdF9uYW1lIH0sXHJcblx0XHRcdHsgcmU6IC9eKGUpPyhbX1xcLVxcLl0pP21haWwoWzAtOV9cXC1cXC5dKikkLywgdmFsOiBlbWFpbCB9LFxyXG5cdFx0XHR7IHJlOiAvXihbQS1aYS16MC05X1xcLVxcLl0pKihwaG9uZXxmb25lKXsxfShbQS1aYS16MC05X1xcLVxcLl0pKiQvLCB2YWw6IHBob25lIH0sXHJcblx0XHRcdHsgcmU6IC9eKGUpPyhbX1xcLVxcLl0pP25iX2VuZmFudChbMC05X1xcLVxcLl0qKSQvLCB2YWw6IG5iX2VuZmFudCB9LFxyXG5cdFx0XHR7IHJlOiAvXihbQS1aYS16MC05X1xcLVxcLl0pKihVUkx8c2l0ZXx3ZWJ8V0VCKXsxfShbQS1aYS16MC05X1xcLVxcLl0pKiQvLCB2YWw6IHVybCB9XHJcblx0XHRdO1xyXG5cdH1cclxuXHJcbn0pKCB3aW5kb3cgKTtcclxuIiwiLy8gPT0gU3VibWl0IEJvb2tpbmcgRGF0YSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbi8vIFJlZmFjdG9yZWQgKHNhZmUpLCB3aXRoIG5ldyB3cGJjXyogbmFtZXMuXHJcbi8vIEJhY2t3YXJkLWNvbXBhdGlibGUgd3JhcHBlcnMgZm9yIGxlZ2FjeSBmdW5jdGlvbiBuYW1lcyBhcmUgaW5jbHVkZWQgYXQgdGhlIGJvdHRvbS5cclxuLy8gQGZpbGU6IGluY2x1ZGVzL19fanMvY2xpZW50L2Zyb250X2VuZF9mb3JtL2Jvb2tpbmdfZm9ybV9zdWJtaXQuanNcclxuXHJcbi8qKlxyXG4gKiBDaGVjayBmaWVsZHMgYXQgZm9ybSBhbmQgdGhlbiBzZW5kIHJlcXVlc3QgKGxlZ2FjeTogbXlib29raW5nX3N1Ym1pdCkuXHJcbiAqXHJcbiAqIEBwYXJhbSB7SFRNTEZvcm1FbGVtZW50fSBzdWJtaXRfZm9ybVxyXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9ICAgcmVzb3VyY2VfaWRcclxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgIHdwZGV2X2FjdGl2ZV9sb2NhbGVcclxuICpcclxuICogQHJldHVybiB7ZmFsc2V8dW5kZWZpbmVkfSBMZWdhY3kgYmVoYXZpb3I6IHJldHVybnMgZmFsc2UgaW4gc29tZSBjYXNlcywgb3RoZXJ3aXNlIHVuZGVmaW5lZC5cclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfYm9va2luZ19mb3JtX3N1Ym1pdCggc3VibWl0X2Zvcm0sIHJlc291cmNlX2lkLCB3cGRldl9hY3RpdmVfbG9jYWxlICkge1xyXG5cclxuXHRyZXNvdXJjZV9pZCA9IHBhcnNlSW50KCByZXNvdXJjZV9pZCwgMTAgKTtcclxuXHJcblx0Ly8gU2FmZXR5IGd1YXJkIChsZWdhY3kgY29kZSBhc3N1bWVkIHZhbGlkIGZvcm0pLlxyXG5cdGlmICggISBzdWJtaXRfZm9ybSB8fCAhIHN1Ym1pdF9mb3JtLmVsZW1lbnRzICkge1xyXG5cdFx0LyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xyXG5cdFx0Y29uc29sZS5lcnJvciggJ1dQQkM6IEludmFsaWQgc3VibWl0IGZvcm0gaW4gd3BiY19ib29raW5nX2Zvcm1fc3VibWl0KCkuJyApO1xyXG5cdFx0LyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gRXh0ZXJuYWwgaG9vazogYWxsb3cgcGF1c2Ugc3VibWl0IG9uIGNvbmZpcm1hdGlvbi9zdW1tYXJ5IHN0ZXAuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHZhciB0YXJnZXRfZWxtID0galF1ZXJ5KCAnLmJvb2tpbmdfZm9ybV9kaXYnICkudHJpZ2dlciggJ2Jvb2tpbmdfZm9ybV9zdWJtaXRfY2xpY2snLCBbIHJlc291cmNlX2lkLCBzdWJtaXRfZm9ybSwgd3BkZXZfYWN0aXZlX2xvY2FsZSBdICk7IC8vIEZpeEluOiA4LjguMy4xMy5cclxuXHJcblx0aWYgKFxyXG5cdFx0KCBqUXVlcnkoIHRhcmdldF9lbG0gKS5maW5kKCAnaW5wdXRbbmFtZT1cImJvb2tpbmdfZm9ybV9zaG93X3N1bW1hcnlcIl0nICkubGVuZ3RoID4gMCApICYmXHJcblx0XHQoICdwYXVzZV9zdWJtaXQnID09PSBqUXVlcnkoIHRhcmdldF9lbG0gKS5maW5kKCAnaW5wdXRbbmFtZT1cImJvb2tpbmdfZm9ybV9zaG93X3N1bW1hcnlcIl0nICkudmFsKCkgKVxyXG5cdCkge1xyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0Ly8gRml4SW46IDguNC4wLjIuXHJcblx0dmFyIGlzX2Vycm9yID0gd3BiY19jaGVja19lcnJvcnNfaW5fYm9va2luZ19mb3JtKCByZXNvdXJjZV9pZCApO1xyXG5cdGlmICggaXNfZXJyb3IgKSB7XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gU2hvdyBtZXNzYWdlIGlmIG5vIHNlbGVjdGVkIGRheXMgaW4gQ2FsZW5kYXIocykuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHZhciBkYXRlX2lucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICdkYXRlX2Jvb2tpbmcnICsgcmVzb3VyY2VfaWQgKTtcclxuXHR2YXIgZGF0ZV92YWx1ZSA9ICggZGF0ZV9pbnB1dCApID8gZGF0ZV9pbnB1dC52YWx1ZSA6ICcnO1xyXG5cclxuXHRpZiAoICcnID09PSBkYXRlX3ZhbHVlICkge1xyXG5cclxuXHRcdHZhciBhcnJfb2Zfc2VsZWN0ZWRfYWRkaXRpb25hbF9jYWxlbmRhcnMgPSB3cGJjX2dldF9hcnJfb2Zfc2VsZWN0ZWRfYWRkaXRpb25hbF9jYWxlbmRhcnMoIHJlc291cmNlX2lkICk7IC8vIEZpeEluOiA4LjUuMi4yNi5cclxuXHJcblx0XHRpZiAoICEgYXJyX29mX3NlbGVjdGVkX2FkZGl0aW9uYWxfY2FsZW5kYXJzIHx8ICggYXJyX29mX3NlbGVjdGVkX2FkZGl0aW9uYWxfY2FsZW5kYXJzLmxlbmd0aCA9PT0gMCApICkge1xyXG5cdFx0XHR3cGJjX2Zyb250X2VuZF9fc2hvd19tZXNzYWdlX19lcnJvcl91bmRlcl9lbGVtZW50KFxyXG5cdFx0XHRcdCcjYm9va2luZ19mb3JtX2RpdicgKyByZXNvdXJjZV9pZCArICcgLmJrX2NhbGVuZGFyX2ZyYW1lJyxcclxuXHRcdFx0XHRfd3BiYy5nZXRfbWVzc2FnZSggJ21lc3NhZ2VfY2hlY2tfbm9fc2VsZWN0ZWRfZGF0ZXMnICksXHJcblx0XHRcdFx0MzAwMFxyXG5cdFx0XHQpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gRml4SW46IDYuMS4xLjMuIFRpbWUgc2VsZWN0aW9uIGF2YWlsYWJpbGl0eSBjaGVja3MuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdGlmICggdHlwZW9mIHdwYmNfaXNfdGhpc190aW1lX3NlbGVjdGlvbl9ub3RfYXZhaWxhYmxlID09PSAnZnVuY3Rpb24nICkge1xyXG5cclxuXHRcdGlmICggJycgPT09IGRhdGVfdmFsdWUgKSB7IC8vIFByaW1hcnkgY2FsZW5kYXIgbm90IHNlbGVjdGVkLlxyXG5cclxuXHRcdFx0dmFyIGFkZGl0aW9uYWxfY2FsZW5kYXJzX2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICdhZGRpdGlvbmFsX2NhbGVuZGFycycgKyByZXNvdXJjZV9pZCApO1xyXG5cclxuXHRcdFx0aWYgKCBhZGRpdGlvbmFsX2NhbGVuZGFyc19lbCAhPT0gbnVsbCApIHsgLy8gQ2hlY2tpbmcgYWRkaXRpb25hbCBjYWxlbmRhcnMuXHJcblxyXG5cdFx0XHRcdHZhciBpZF9hZGRpdGlvbmFsX3N0ciA9IGFkZGl0aW9uYWxfY2FsZW5kYXJzX2VsLnZhbHVlO1xyXG5cdFx0XHRcdHZhciBpZF9hZGRpdGlvbmFsX2FyciA9IGlkX2FkZGl0aW9uYWxfc3RyLnNwbGl0KCAnLCcgKTtcclxuXHRcdFx0XHR2YXIgaXNfdGltZXNfZGF0ZXNfb2sgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0Zm9yICggdmFyIGlhID0gMDsgaWEgPCBpZF9hZGRpdGlvbmFsX2Fyci5sZW5ndGg7IGlhKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0dmFyIGFkZF9pZCA9IGlkX2FkZGl0aW9uYWxfYXJyWyBpYSBdO1xyXG5cclxuXHRcdFx0XHRcdHZhciBhZGRfZGF0ZV9lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnZGF0ZV9ib29raW5nJyArIGFkZF9pZCApO1xyXG5cdFx0XHRcdFx0dmFyIGFkZF9kYXRlX3ZhbCA9ICggYWRkX2RhdGVfZWwgKSA/IGFkZF9kYXRlX2VsLnZhbHVlIDogJyc7XHJcblxyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHQoICcnICE9PSBhZGRfZGF0ZV92YWwgKSAmJlxyXG5cdFx0XHRcdFx0XHQoICEgd3BiY19pc190aGlzX3RpbWVfc2VsZWN0aW9uX25vdF9hdmFpbGFibGUoIGFkZF9pZCwgc3VibWl0X2Zvcm0uZWxlbWVudHMgKSApXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0aXNfdGltZXNfZGF0ZXNfb2sgPSB0cnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCAhIGlzX3RpbWVzX2RhdGVzX29rICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7IC8vIFByaW1hcnkgY2FsZW5kYXIgc2VsZWN0ZWQuXHJcblxyXG5cdFx0XHRpZiAoIHdwYmNfaXNfdGhpc190aW1lX3NlbGVjdGlvbl9ub3RfYXZhaWxhYmxlKCByZXNvdXJjZV9pZCwgc3VibWl0X2Zvcm0uZWxlbWVudHMgKSApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvLyBTZXJpYWxpemUgZm9ybSAobGVnYWN5IGZvcm1hdCkuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHZhciBjb3VudCAgICA9IHN1Ym1pdF9mb3JtLmVsZW1lbnRzLmxlbmd0aDtcclxuXHR2YXIgZm9ybWRhdGEgPSAnJztcclxuXHR2YXIgaW5wX3ZhbHVlO1xyXG5cdHZhciBpbnBfdGl0bGVfdmFsdWU7XHJcblx0dmFyIGVsZW1lbnQ7XHJcblx0dmFyIGVsX3R5cGU7XHJcblxyXG5cdC8vIEhlbHBlcjogbGVnYWN5IGVzY2FwaW5nIGZvciB0aGUgc2VyaWFsaXplZCB2YWx1ZS5cclxuXHRmdW5jdGlvbiB3cGJjX2VzY2FwZV9zZXJpYWxpemVkX3ZhbHVlKCB2YWwgKSB7XHJcblxyXG5cdFx0dmFsID0gKCB2YWwgPT0gbnVsbCApID8gJycgOiBTdHJpbmcoIHZhbCApO1xyXG5cclxuXHRcdC8vIFJlcGxhY2UgcmVnaXN0ZXJlZCBjaGFyYWN0ZXJzLlxyXG5cdFx0dmFsID0gdmFsLnJlcGxhY2UoIG5ldyBSZWdFeHAoICdcXFxcXicsICdnJyApLCAnJiM5NDsnICk7XHJcblx0XHR2YWwgPSB2YWwucmVwbGFjZSggbmV3IFJlZ0V4cCggJ34nLCAnZycgKSwgJyYjMTI2OycgKTtcclxuXHJcblx0XHQvLyBSZXBsYWNlIHF1b3Rlcy5cclxuXHRcdHZhbCA9IHZhbC5yZXBsYWNlKCAvXCIvZywgJyYjMzQ7JyApO1xyXG5cdFx0dmFsID0gdmFsLnJlcGxhY2UoIC8nL2csICcmIzM5OycgKTtcclxuXHJcblx0XHRyZXR1cm4gdmFsO1xyXG5cdH1cclxuXHJcblx0Ly8gSGVscGVyOiBkZXRlcm1pbmUgVUkgdHlwZSBmb3IgdGl0bGUgZXh0cmFjdGlvbiAobGVnYWN5IGxvZ2ljKS5cclxuXHRmdW5jdGlvbiB3cGJjX2dldF9pbnB1dF9lbGVtZW50X3R5cGUoIGVsICkge1xyXG5cclxuXHRcdGlmICggISBlbCB8fCAhIGVsLnRhZ05hbWUgKSB7XHJcblx0XHRcdHJldHVybiAnJztcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgdGFnID0gU3RyaW5nKCBlbC50YWdOYW1lICkudG9Mb3dlckNhc2UoKTtcclxuXHJcblx0XHRpZiAoICdpbnB1dCcgPT09IHRhZyApIHtcclxuXHRcdFx0cmV0dXJuICggZWwudHlwZSApID8gU3RyaW5nKCBlbC50eXBlICkudG9Mb3dlckNhc2UoKSA6ICd0ZXh0JztcclxuXHRcdH1cclxuXHJcblx0XHQvLyBMZWdhY3kgdXNlZCBcInNlbGVjdFwiIHN0cmluZyBoZXJlLlxyXG5cdFx0aWYgKCAnc2VsZWN0JyA9PT0gdGFnICkge1xyXG5cdFx0XHRyZXR1cm4gJ3NlbGVjdCc7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRhZztcclxuXHR9XHJcblxyXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IGNvdW50OyBpKysgKSB7IC8vIEZpeEluOiA5LjEuNS4xLlxyXG5cclxuXHRcdGVsZW1lbnQgPSBzdWJtaXRfZm9ybS5lbGVtZW50c1sgaSBdO1xyXG5cclxuXHRcdGlmICggISBlbGVtZW50ICkge1xyXG5cdFx0XHRjb250aW51ZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGpRdWVyeSggZWxlbWVudCApLmNsb3Nlc3QoICcuYm9va2luZ19mb3JtX2dhcmJhZ2UnICkubGVuZ3RoICkge1xyXG5cdFx0XHRjb250aW51ZTsgLy8gU2tpcCBlbGVtZW50cyBmcm9tIGdhcmJhZ2UuIEZpeEluOiA3LjEuMi4xNC5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoXHJcblx0XHRcdCggZWxlbWVudC50eXBlICE9PSAnYnV0dG9uJyApICYmXHJcblx0XHRcdCggZWxlbWVudC50eXBlICE9PSAnaGlkZGVuJyApICYmXHJcblx0XHRcdCggZWxlbWVudC5uYW1lICE9PSAoICdkYXRlX2Jvb2tpbmcnICsgcmVzb3VyY2VfaWQgKSApXHJcblx0XHRcdC8vICYmICggalF1ZXJ5KCBlbGVtZW50ICkuaXMoICc6dmlzaWJsZScgKSApIC8vRml4SW46IDcuMi4xLjEyLjJcclxuXHRcdCkge1xyXG5cclxuXHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0XHQvLyBHZXQgZWxlbWVudCB2YWx1ZS5cclxuXHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0XHRpZiAoIGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBlbGVtZW50LnZhbHVlID09PSAnJyApIHtcclxuXHRcdFx0XHRcdGlucF92YWx1ZSA9IGVsZW1lbnQuY2hlY2tlZDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0aW5wX3ZhbHVlID0gKCBlbGVtZW50LmNoZWNrZWQgKSA/IGVsZW1lbnQudmFsdWUgOiAnJztcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBlbGVtZW50LnR5cGUgPT09ICdyYWRpbycgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggZWxlbWVudC5jaGVja2VkICkge1xyXG5cdFx0XHRcdFx0aW5wX3ZhbHVlID0gZWxlbWVudC52YWx1ZTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIFJlcXVpcmVkIHJhZGlvOiBzaG93IHdhcm5pbmcgaWYgbm9uZSBjaGVja2VkLlxyXG5cdFx0XHRcdFx0Ly8gRml4SW46IDcuMC4xLjYyLlxyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHQoIGVsZW1lbnQuY2xhc3NOYW1lLmluZGV4T2YoICd3cGRldi12YWxpZGF0ZXMtYXMtcmVxdWlyZWQnICkgIT09IC0xICkgJiZcclxuXHRcdFx0XHRcdFx0KCBqUXVlcnkoIGVsZW1lbnQgKS5pcyggJzp2aXNpYmxlJyApICkgJiYgLy8gRml4SW46IDcuMi4xLjEyLjIuXHJcblx0XHRcdFx0XHRcdCggISBqUXVlcnkoICc6cmFkaW9bbmFtZT1cIicgKyBlbGVtZW50Lm5hbWUgKyAnXCJdJywgc3VibWl0X2Zvcm0gKS5pcyggJzpjaGVja2VkJyApIClcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHR3cGJjX2Zyb250X2VuZF9fc2hvd19tZXNzYWdlX193YXJuaW5nKCBlbGVtZW50LCBfd3BiYy5nZXRfbWVzc2FnZSggJ21lc3NhZ2VfY2hlY2tfcmVxdWlyZWRfZm9yX3JhZGlvX2JveCcgKSApOyAvLyBGaXhJbjogOC41LjEuMy5cclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIFNraXAgc3RvcmluZyBlbXB0eSByYWRpbyBvcHRpb25zLlxyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRpbnBfdmFsdWUgPSBlbGVtZW50LnZhbHVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpbnBfdGl0bGVfdmFsdWUgPSAnJztcclxuXHJcblx0XHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0Ly8gR2V0IGh1bWFuLWZyaWVuZGx5IHRpdGxlIHZhbHVlIChsZWdhY3kgYmVoYXZpb3IpLlxyXG5cdFx0XHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0XHRcdHZhciBpbnB1dF9lbGVtZW50X3R5cGUgPSB3cGJjX2dldF9pbnB1dF9lbGVtZW50X3R5cGUoIGVsZW1lbnQgKTtcclxuXHJcblx0XHRcdHN3aXRjaCAoIGlucHV0X2VsZW1lbnRfdHlwZSApIHtcclxuXHJcblx0XHRcdFx0Y2FzZSAndGV4dCc6XHJcblx0XHRcdFx0Y2FzZSAnZW1haWwnOlxyXG5cdFx0XHRcdFx0aW5wX3RpdGxlX3ZhbHVlID0gaW5wX3ZhbHVlO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgJ3NlbGVjdCc6XHJcblx0XHRcdFx0XHRpbnBfdGl0bGVfdmFsdWUgPSBqUXVlcnkoIGVsZW1lbnQgKS5maW5kKCAnb3B0aW9uOnNlbGVjdGVkJyApLnRleHQoKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlICdyYWRpbyc6XHJcblx0XHRcdFx0Y2FzZSAnY2hlY2tib3gnOlxyXG5cdFx0XHRcdFx0aWYgKCBqUXVlcnkoIGVsZW1lbnQgKS5pcyggJzpjaGVja2VkJyApICkge1xyXG5cdFx0XHRcdFx0XHR2YXIgbGFiZWxfZWxlbWVudCA9IGpRdWVyeSggZWxlbWVudCApLnBhcmVudHMoICcud3BkZXYtbGlzdC1pdGVtJyApLmZpbmQoICcud3BkZXYtbGlzdC1pdGVtLWxhYmVsJyApO1xyXG5cdFx0XHRcdFx0XHRpZiAoIGxhYmVsX2VsZW1lbnQubGVuZ3RoICkge1xyXG5cdFx0XHRcdFx0XHRcdGlucF90aXRsZV92YWx1ZSA9IGxhYmVsX2VsZW1lbnQuaHRtbCgpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdGlucF90aXRsZV92YWx1ZSA9IGlucF92YWx1ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0XHQvLyBNdWx0aXBsZSBzZWxlY3QgdmFsdWUgZXh0cmFjdGlvbi5cclxuXHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0XHRpZiAoICggZWxlbWVudC50eXBlID09PSAnc2VsZWN0Ym94LW11bHRpcGxlJyApIHx8ICggZWxlbWVudC50eXBlID09PSAnc2VsZWN0LW11bHRpcGxlJyApICkge1xyXG5cdFx0XHRcdGlucF92YWx1ZSA9IGpRdWVyeSggJ1tuYW1lPVwiJyArIGVsZW1lbnQubmFtZSArICdcIl0nICkudmFsKCk7XHJcblx0XHRcdFx0aWYgKCAoIGlucF92YWx1ZSA9PT0gbnVsbCApIHx8ICggU3RyaW5nKCBpbnBfdmFsdWUgKSA9PT0gJycgKSApIHtcclxuXHRcdFx0XHRcdGlucF92YWx1ZSA9ICcnO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0XHQvLyBNYWtlIHZhbGlkYXRpb24gb25seSBmb3IgdmlzaWJsZSBlbGVtZW50cy5cclxuXHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0XHRpZiAoIGpRdWVyeSggZWxlbWVudCApLmlzKCAnOnZpc2libGUnICkgKSB7IC8vIEZpeEluOiA3LjIuMS4xMi4yLlxyXG5cclxuXHRcdFx0XHQvLyBSZWNoZWNrIG1heCBhdmFpbGFibGUgdmlzaXRvcnMgc2VsZWN0aW9uLlxyXG5cdFx0XHRcdGlmICggdHlwZW9mIHdwYmNfX2lzX2xlc3NfdGhhbl9yZXF1aXJlZF9fb2ZfbWF4X2F2YWlsYWJsZV9zbG90c19fYmwgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0XHRpZiAoIHdwYmNfX2lzX2xlc3NfdGhhbl9yZXF1aXJlZF9fb2ZfbWF4X2F2YWlsYWJsZV9zbG90c19fYmwoIHJlc291cmNlX2lkLCBlbGVtZW50ICkgKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIFJlcXVpcmVkIGZpZWxkcy5cclxuXHRcdFx0XHRpZiAoIGVsZW1lbnQuY2xhc3NOYW1lLmluZGV4T2YoICd3cGRldi12YWxpZGF0ZXMtYXMtcmVxdWlyZWQnICkgIT09IC0xICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggKCBlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcgKSAmJiAoIGVsZW1lbnQuY2hlY2tlZCA9PT0gZmFsc2UgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggISBqUXVlcnkoICc6Y2hlY2tib3hbbmFtZT1cIicgKyBlbGVtZW50Lm5hbWUgKyAnXCJdJywgc3VibWl0X2Zvcm0gKS5pcyggJzpjaGVja2VkJyApICkge1xyXG5cdFx0XHRcdFx0XHRcdHdwYmNfZnJvbnRfZW5kX19zaG93X21lc3NhZ2VfX3dhcm5pbmcoIGVsZW1lbnQsIF93cGJjLmdldF9tZXNzYWdlKCAnbWVzc2FnZV9jaGVja19yZXF1aXJlZF9mb3JfY2hlY2tfYm94JyApICk7IC8vIEZpeEluOiA4LjUuMS4zLlxyXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggZWxlbWVudC50eXBlID09PSAncmFkaW8nICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCAhIGpRdWVyeSggJzpyYWRpb1tuYW1lPVwiJyArIGVsZW1lbnQubmFtZSArICdcIl0nLCBzdWJtaXRfZm9ybSApLmlzKCAnOmNoZWNrZWQnICkgKSB7XHJcblx0XHRcdFx0XHRcdFx0d3BiY19mcm9udF9lbmRfX3Nob3dfbWVzc2FnZV9fd2FybmluZyggZWxlbWVudCwgX3dwYmMuZ2V0X21lc3NhZ2UoICdtZXNzYWdlX2NoZWNrX3JlcXVpcmVkX2Zvcl9yYWRpb19ib3gnICkgKTsgLy8gRml4SW46IDguNS4xLjMuXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAoIGVsZW1lbnQudHlwZSAhPT0gJ2NoZWNrYm94JyApICYmICggZWxlbWVudC50eXBlICE9PSAncmFkaW8nICkgJiYgKCAnJyA9PT0gd3BiY190cmltKCBpbnBfdmFsdWUgKSApICkge1xyXG5cdFx0XHRcdFx0XHR3cGJjX2Zyb250X2VuZF9fc2hvd19tZXNzYWdlX193YXJuaW5nKCBlbGVtZW50LCBfd3BiYy5nZXRfbWVzc2FnZSggJ21lc3NhZ2VfY2hlY2tfcmVxdWlyZWQnICkgKTsgLy8gRml4SW46IDguNS4xLjMuXHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIEVtYWlsIGZvcm1hdCB2YWxpZGF0aW9uLlxyXG5cdFx0XHRcdGlmICggZWxlbWVudC5jbGFzc05hbWUuaW5kZXhPZiggJ3dwZGV2LXZhbGlkYXRlcy1hcy1lbWFpbCcgKSAhPT0gLTEgKSB7XHJcblxyXG5cdFx0XHRcdFx0aW5wX3ZhbHVlID0gU3RyaW5nKCBpbnBfdmFsdWUgKS5yZXBsYWNlKCAvXlxccyt8XFxzKyQvZ20sICcnICk7IC8vIFRyaW0gd2hpdGUgc3BhY2UuIEZpeEluOiA1LjQuNS5cclxuXHRcdFx0XHRcdHZhciByZWdfZW1haWwgPSAvXihbQS1aYS16MC05X1xcLVxcLlxcK10pK1xcQChbQS1aYS16MC05X1xcLVxcLl0pK1xcLihbQS1aYS16XXsyLH0pJC87XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpbnBfdmFsdWUgIT09ICcnICkge1xyXG5cdFx0XHRcdFx0XHRpZiAoIHJlZ19lbWFpbC50ZXN0KCBpbnBfdmFsdWUgKSA9PT0gZmFsc2UgKSB7XHJcblx0XHRcdFx0XHRcdFx0d3BiY19mcm9udF9lbmRfX3Nob3dfbWVzc2FnZV9fd2FybmluZyggZWxlbWVudCwgX3dwYmMuZ2V0X21lc3NhZ2UoICdtZXNzYWdlX2NoZWNrX2VtYWlsJyApICk7IC8vIEZpeEluOiA4LjUuMS4zLlxyXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gU2FtZSBlbWFpbCBmaWVsZCB2YWxpZGF0aW9uICh2ZXJpZmljYXRpb24gZmllbGQpLlxyXG5cdFx0XHRcdGlmICggKCBlbGVtZW50LmNsYXNzTmFtZS5pbmRleE9mKCAnd3BkZXYtdmFsaWRhdGVzLWFzLWVtYWlsJyApICE9PSAtMSApICYmICggZWxlbWVudC5jbGFzc05hbWUuaW5kZXhPZiggJ3NhbWVfYXNfJyApICE9PSAtMSApICkge1xyXG5cclxuXHRcdFx0XHRcdHZhciBwcmltYXJ5X2VtYWlsX25hbWUgPSBlbGVtZW50LmNsYXNzTmFtZS5tYXRjaCggL3NhbWVfYXNfKFteXFxzXSkrL2dpICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBwcmltYXJ5X2VtYWlsX25hbWUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRwcmltYXJ5X2VtYWlsX25hbWUgPSBwcmltYXJ5X2VtYWlsX25hbWVbIDAgXS5zdWJzdHIoIDggKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggalF1ZXJ5KCAnW25hbWU9XCInICsgcHJpbWFyeV9lbWFpbF9uYW1lICsgcmVzb3VyY2VfaWQgKyAnXCJdJyApLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5KCAnW25hbWU9XCInICsgcHJpbWFyeV9lbWFpbF9uYW1lICsgcmVzb3VyY2VfaWQgKyAnXCJdJyApLnZhbCgpICE9PSBpbnBfdmFsdWUgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR3cGJjX2Zyb250X2VuZF9fc2hvd19tZXNzYWdlX193YXJuaW5nKCBlbGVtZW50LCBfd3BiYy5nZXRfbWVzc2FnZSggJ21lc3NhZ2VfY2hlY2tfc2FtZV9lbWFpbCcgKSApOyAvLyBGaXhJbjogOC41LjEuMy5cclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBTa2lwIG9uZSBsb29wIGZvciB0aGUgZW1haWwgdmVyaWZpY2F0aW9uIGZpZWxkLlxyXG5cdFx0XHRcdFx0Y29udGludWU7IC8vIEZpeEluOiA4LjEuMi4xNS5cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0Ly8gR2V0IEZvcm0gRGF0YSAobGVnYWN5IGZvcm1hdCkuXHJcblx0XHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0aWYgKCBlbGVtZW50Lm5hbWUgIT09ICggJ2NhcHRjaGFfaW5wdXQnICsgcmVzb3VyY2VfaWQgKSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBmb3JtZGF0YSAhPT0gJycgKSB7XHJcblx0XHRcdFx0XHRmb3JtZGF0YSArPSAnfic7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRlbF90eXBlID0gZWxlbWVudC50eXBlO1xyXG5cclxuXHRcdFx0XHRpZiAoIGVsZW1lbnQuY2xhc3NOYW1lLmluZGV4T2YoICd3cGRldi12YWxpZGF0ZXMtYXMtZW1haWwnICkgIT09IC0xICkge1xyXG5cdFx0XHRcdFx0ZWxfdHlwZSA9ICdlbWFpbCc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmICggZWxlbWVudC5jbGFzc05hbWUuaW5kZXhPZiggJ3dwZGV2LXZhbGlkYXRlcy1hcy1jb3Vwb24nICkgIT09IC0xICkge1xyXG5cdFx0XHRcdFx0ZWxfdHlwZSA9ICdjb3Vwb24nO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aW5wX3ZhbHVlID0gd3BiY19lc2NhcGVfc2VyaWFsaXplZF92YWx1ZSggaW5wX3ZhbHVlICk7XHJcblxyXG5cdFx0XHRcdGlmICggZWxfdHlwZSA9PT0gJ3NlbGVjdC1vbmUnICkge1xyXG5cdFx0XHRcdFx0ZWxfdHlwZSA9ICdzZWxlY3Rib3gtb25lJztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKCBlbF90eXBlID09PSAnc2VsZWN0LW11bHRpcGxlJyApIHtcclxuXHRcdFx0XHRcdGVsX3R5cGUgPSAnc2VsZWN0Ym94LW11bHRpcGxlJztcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZvcm1kYXRhICs9IGVsX3R5cGUgKyAnXicgKyBlbGVtZW50Lm5hbWUgKyAnXicgKyBpbnBfdmFsdWU7XHJcblxyXG5cdFx0XHRcdC8vIEFkZCB0aXRsZS9sYWJlbCB2YWx1ZSAobGVnYWN5KS5cclxuXHRcdFx0XHR2YXIgY2xlYW5fZmllbGRfbmFtZSA9IFN0cmluZyggZWxlbWVudC5uYW1lICk7XHJcblxyXG5cdFx0XHRcdC8vIEJVR0ZJWDogcmVwbGFjZUFsbChSZWdFeHApIGlzIG5vdCBzdXBwb3J0ZWQgaW4gb2xkZXIgYnJvd3NlcnMuXHJcblx0XHRcdFx0Ly8gS2VlcCBsZWdhY3kgaW50ZW50OiByZW1vdmUgW10gc3VmZml4IG9jY3VycmVuY2VzLlxyXG5cdFx0XHRcdGNsZWFuX2ZpZWxkX25hbWUgPSBjbGVhbl9maWVsZF9uYW1lLnJlcGxhY2UoIC9cXFtcXF0vZ2ksICcnICk7XHJcblxyXG5cdFx0XHRcdHZhciByZXNvdXJjZV9pZF9zdHIgPSBTdHJpbmcoIHJlc291cmNlX2lkICk7XHJcblxyXG5cdFx0XHRcdC8vIExlZ2FjeSBhc3N1bWVkIHN1ZmZpeCBlbmRzIHdpdGggcmVzb3VyY2VfaWQsIG1ha2UgaXQgc2FmZS5cclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHQoIGNsZWFuX2ZpZWxkX25hbWUubGVuZ3RoID49IHJlc291cmNlX2lkX3N0ci5sZW5ndGggKSAmJlxyXG5cdFx0XHRcdFx0KCBjbGVhbl9maWVsZF9uYW1lLnN1YnN0ciggY2xlYW5fZmllbGRfbmFtZS5sZW5ndGggLSByZXNvdXJjZV9pZF9zdHIubGVuZ3RoICkgPT09IHJlc291cmNlX2lkX3N0ciApXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRjbGVhbl9maWVsZF9uYW1lID0gY2xlYW5fZmllbGRfbmFtZS5zdWJzdHIoIDAsIGNsZWFuX2ZpZWxkX25hbWUubGVuZ3RoIC0gcmVzb3VyY2VfaWRfc3RyLmxlbmd0aCApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Zm9ybWRhdGEgKz0gJ34nICsgZWxfdHlwZSArICdeJyArIGNsZWFuX2ZpZWxkX25hbWUgKyAnX3ZhbCcgKyByZXNvdXJjZV9pZCArICdeJyArIGlucF90aXRsZV92YWx1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gVE9ETzogaGVyZSB3YXMgZnVuY3Rpb24gZm9yICdDaGVjayBpZiB2aXNpdG9yIGZpbmlzaCBkYXRlcyBzZWxlY3Rpb24uXHJcblxyXG5cdC8vIENhcHRjaGEgdmVyaWZ5LlxyXG5cdHZhciBjYXB0Y2hhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGRldl9jYXB0Y2hhX2NoYWxsZW5nZV8nICsgcmVzb3VyY2VfaWQgKTtcclxuXHJcblx0aWYgKCBjYXB0Y2hhICE9PSBudWxsICkge1xyXG5cdFx0d3BiY19mb3JtX3N1Ym1pdF9zZW5kKCByZXNvdXJjZV9pZCwgZm9ybWRhdGEsIGNhcHRjaGEudmFsdWUsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnY2FwdGNoYV9pbnB1dCcgKyByZXNvdXJjZV9pZCApLnZhbHVlLCB3cGRldl9hY3RpdmVfbG9jYWxlICk7XHJcblx0fSBlbHNlIHtcclxuXHRcdHdwYmNfZm9ybV9zdWJtaXRfc2VuZCggcmVzb3VyY2VfaWQsIGZvcm1kYXRhLCAnJywgJycsIHdwZGV2X2FjdGl2ZV9sb2NhbGUgKTtcclxuXHR9XHJcblxyXG5cdHJldHVybjtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBHYXRoZXJpbmcgcGFyYW1zIGZvciBzZW5kaW5nIEFqYXggcmVxdWVzdCBhbmQgdGhlbiBzZW5kIGl0IChsZWdhY3k6IGZvcm1fc3VibWl0X3NlbmQpLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHJlc291cmNlX2lkXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgZm9ybWRhdGFcclxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICBjYXB0Y2hhX2NoYWxhbmdlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgdXNlcl9jYXB0Y2hhXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgd3BkZXZfYWN0aXZlX2xvY2FsZVxyXG4gKlxyXG4gKiBAcmV0dXJuIHt1bmRlZmluZWR9IExlZ2FjeSBiZWhhdmlvci5cclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfZm9ybV9zdWJtaXRfc2VuZCggcmVzb3VyY2VfaWQsIGZvcm1kYXRhLCBjYXB0Y2hhX2NoYWxhbmdlLCB1c2VyX2NhcHRjaGEsIHdwZGV2X2FjdGl2ZV9sb2NhbGUgKSB7XHJcblxyXG5cdHJlc291cmNlX2lkID0gcGFyc2VJbnQoIHJlc291cmNlX2lkLCAxMCApO1xyXG5cclxuXHR2YXIgbXlfYm9va2luZ19mb3JtID0gJyc7XHJcblx0dmFyIGJvb2tpbmdfZm9ybV90eXBlX2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICdib29raW5nX2Zvcm1fdHlwZScgKyByZXNvdXJjZV9pZCApO1xyXG5cdGlmICggYm9va2luZ19mb3JtX3R5cGVfZWwgIT09IG51bGwgKSB7XHJcblx0XHRteV9ib29raW5nX2Zvcm0gPSBib29raW5nX2Zvcm1fdHlwZV9lbC52YWx1ZTtcclxuXHR9XHJcblxyXG5cdHZhciBteV9ib29raW5nX2hhc2ggPSAnJztcclxuXHRpZiAoIF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ3RoaXNfcGFnZV9ib29raW5nX2hhc2gnICkgIT09ICcnICkge1xyXG5cdFx0bXlfYm9va2luZ19oYXNoID0gX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAndGhpc19wYWdlX2Jvb2tpbmdfaGFzaCcgKTtcclxuXHR9XHJcblxyXG5cdHZhciBpc19zZW5kX2VtZWlscyA9IDE7XHJcblx0dmFyICRpc19zZW5kX2VtYWlsX3RvZ2dsZSA9IGpRdWVyeSggJyNpc19zZW5kX2VtYWlsX2Zvcl9wZW5kaW5nJyApO1xyXG5cdHZhciAkbW9kYWxfc2VuZF9lbWFpbF90b2dnbGUgPSBqUXVlcnkoICcjYm9va2luZ19mb3JtJyArIHJlc291cmNlX2lkICkuY2xvc2VzdCggJy53cGJjX21vZGFsX19hZGRfYm9va2luZ19fc2VjdGlvbicgKS5maW5kKCAnW2RhdGEtd3BiYy1hZGQtYm9va2luZy1zZW5kLWVtYWlsc10nICkuZmlyc3QoKTtcclxuXHRpZiAoICRtb2RhbF9zZW5kX2VtYWlsX3RvZ2dsZS5sZW5ndGggKSB7XHJcblx0XHQkaXNfc2VuZF9lbWFpbF90b2dnbGUgPSAkbW9kYWxfc2VuZF9lbWFpbF90b2dnbGU7XHJcblx0fVxyXG5cdGlmICggJGlzX3NlbmRfZW1haWxfdG9nZ2xlLmxlbmd0aCApIHsgLy8gRml4SW46IDguNy45LjUuXHJcblxyXG5cdFx0aXNfc2VuZF9lbWVpbHMgPSAkaXNfc2VuZF9lbWFpbF90b2dnbGUuaXMoICc6Y2hlY2tlZCcgKTtcclxuXHJcblx0XHRpZiAoIGZhbHNlID09PSBpc19zZW5kX2VtZWlscyApIHtcclxuXHRcdFx0aXNfc2VuZF9lbWVpbHMgPSAwO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0aXNfc2VuZF9lbWVpbHMgPSAxO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dmFyIGRhdGVfZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ2RhdGVfYm9va2luZycgKyByZXNvdXJjZV9pZCApO1xyXG5cdHZhciBkYXRlX3ZhbHVlID0gKCBkYXRlX2VsICkgPyBkYXRlX2VsLnZhbHVlIDogJyc7XHJcblxyXG5cdGlmICggJycgIT09IGRhdGVfdmFsdWUgKSB7IC8vIEZpeEluOiA2LjEuMS4zLlxyXG5cdFx0d3BiY19zZW5kX2FqYXhfc3VibWl0KCByZXNvdXJjZV9pZCwgZm9ybWRhdGEsIGNhcHRjaGFfY2hhbGFuZ2UsIHVzZXJfY2FwdGNoYSwgaXNfc2VuZF9lbWVpbHMsIG15X2Jvb2tpbmdfaGFzaCwgbXlfYm9va2luZ19mb3JtLCB3cGRldl9hY3RpdmVfbG9jYWxlICk7XHJcblx0fSBlbHNlIHtcclxuXHRcdGpRdWVyeSggJyNib29raW5nX2Zvcm1fZGl2JyArIHJlc291cmNlX2lkICkuaGlkZSgpO1xyXG5cdFx0alF1ZXJ5KCAnI3N1Ym1pdGluZycgKyByZXNvdXJjZV9pZCApLmhpZGUoKTtcclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvLyBBZGRpdGlvbmFsIGNhbGVuZGFycyBzdWJtaXQuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHZhciBhZGRpdGlvbmFsX2NhbGVuZGFyc19lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnYWRkaXRpb25hbF9jYWxlbmRhcnMnICsgcmVzb3VyY2VfaWQgKTtcclxuXHRpZiAoIGFkZGl0aW9uYWxfY2FsZW5kYXJzX2VsID09PSBudWxsICkge1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHJcblx0dmFyIGlkX2FkZGl0aW9uYWxfc3RyID0gYWRkaXRpb25hbF9jYWxlbmRhcnNfZWwudmFsdWU7XHJcblx0dmFyIGlkX2FkZGl0aW9uYWxfYXJyID0gaWRfYWRkaXRpb25hbF9zdHIuc3BsaXQoICcsJyApO1xyXG5cclxuXHQvLyBGaXhJbjogMTAuOS40LjEuXHJcblx0Zm9yICggdmFyIGlhID0gMDsgaWEgPCBpZF9hZGRpdGlvbmFsX2Fyci5sZW5ndGg7IGlhKysgKSB7XHJcblx0XHRpZF9hZGRpdGlvbmFsX2FyclsgaWEgXSA9IHBhcnNlSW50KCBpZF9hZGRpdGlvbmFsX2FyclsgaWEgXSwgMTAgKTtcclxuXHR9XHJcblxyXG5cdGlmICggISBqUXVlcnkoICcjYm9va2luZ19mb3JtX2RpdicgKyByZXNvdXJjZV9pZCApLmlzKCAnOnZpc2libGUnICkgKSB7XHJcblx0XHR3cGJjX2Jvb2tpbmdfZm9ybV9fc3Bpbl9sb2FkZXJfX3Nob3coIHJlc291cmNlX2lkICk7IC8vIFNob3cgU3Bpbm5lclxyXG5cdH1cclxuXHJcblx0Ly8gSGVscGVyOiByZXdyaXRlIGZpZWxkIG5hbWUgc3VmZml4IGZyb20gcmVzb3VyY2VfaWQgLT4gaWRfYWRkaXRpb25hbC5cclxuXHRmdW5jdGlvbiB3cGJjX3Jld3JpdGVfZmllbGRfbmFtZV9zdWZmaXgoIGZpZWxkX25hbWUsIG9sZF9pZCwgbmV3X2lkICkge1xyXG5cclxuXHRcdGZpZWxkX25hbWUgPSBTdHJpbmcoIGZpZWxkX25hbWUgKTtcclxuXHJcblx0XHR2YXIgb2xkX2lkX3N0ciA9IFN0cmluZyggb2xkX2lkICk7XHJcblx0XHR2YXIgbmV3X2lkX3N0ciA9IFN0cmluZyggbmV3X2lkICk7XHJcblxyXG5cdFx0Ly8gSGFuZGxlIGZpZWxkcyB3aXRoIFtdLlxyXG5cdFx0aWYgKFxyXG5cdFx0XHQoIGZpZWxkX25hbWUubGVuZ3RoID49ICggb2xkX2lkX3N0ci5sZW5ndGggKyAyICkgKSAmJlxyXG5cdFx0XHQoIGZpZWxkX25hbWUuc3Vic3RyKCBmaWVsZF9uYW1lLmxlbmd0aCAtICggb2xkX2lkX3N0ci5sZW5ndGggKyAyICkgKSA9PT0gKCBvbGRfaWRfc3RyICsgJ1tdJyApIClcclxuXHRcdCkge1xyXG5cdFx0XHRyZXR1cm4gZmllbGRfbmFtZS5zdWJzdHIoIDAsIGZpZWxkX25hbWUubGVuZ3RoIC0gKCBvbGRfaWRfc3RyLmxlbmd0aCArIDIgKSApICsgbmV3X2lkX3N0ciArICdbXSc7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gSGFuZGxlIGZpZWxkcyB3aXRob3V0IFtdLlxyXG5cdFx0aWYgKFxyXG5cdFx0XHQoIGZpZWxkX25hbWUubGVuZ3RoID49IG9sZF9pZF9zdHIubGVuZ3RoICkgJiZcclxuXHRcdFx0KCBmaWVsZF9uYW1lLnN1YnN0ciggZmllbGRfbmFtZS5sZW5ndGggLSBvbGRfaWRfc3RyLmxlbmd0aCApID09PSBvbGRfaWRfc3RyIClcclxuXHRcdCkge1xyXG5cdFx0XHRyZXR1cm4gZmllbGRfbmFtZS5zdWJzdHIoIDAsIGZpZWxkX25hbWUubGVuZ3RoIC0gb2xkX2lkX3N0ci5sZW5ndGggKSArIG5ld19pZF9zdHI7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRmFsbGJhY2s6IHJldHVybiB1bmNoYW5nZWQgKHNhZmVyIHRoYW4gYnJlYWtpbmcgbmFtZSkuXHJcblx0XHRyZXR1cm4gZmllbGRfbmFtZTtcclxuXHR9XHJcblxyXG5cdGZvciAoIGlhID0gMDsgaWEgPCBpZF9hZGRpdGlvbmFsX2Fyci5sZW5ndGg7IGlhKysgKSB7XHJcblxyXG5cdFx0dmFyIGlkX2FkZGl0aW9uYWwgPSBpZF9hZGRpdGlvbmFsX2FyclsgaWEgXTtcclxuXHJcblx0XHQvLyBGaXhJbjogMTAuOS40LjEuXHJcblx0XHRpZiAoIGlkX2FkZGl0aW9uYWwgPD0gMCApIHtcclxuXHRcdFx0Y29udGludWU7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUmVidWlsZCBmb3JtZGF0YSBmb3IgZWFjaCBhZGRpdGlvbmFsIGNhbGVuZGFyIChsZWdhY3kgYmVoYXZpb3IpLlxyXG5cdFx0dmFyIGZvcm1kYXRhX2FkZGl0aW9uYWxfYXJyID0gU3RyaW5nKCBmb3JtZGF0YSApLnNwbGl0KCAnficgKTtcclxuXHRcdHZhciBmb3JtZGF0YV9hZGRpdGlvbmFsID0gJyc7XHJcblxyXG5cdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgZm9ybWRhdGFfYWRkaXRpb25hbF9hcnIubGVuZ3RoOyBqKysgKSB7XHJcblxyXG5cdFx0XHR2YXIgbXlfZm9ybV9maWVsZCA9IGZvcm1kYXRhX2FkZGl0aW9uYWxfYXJyWyBqIF0uc3BsaXQoICdeJyApO1xyXG5cclxuXHRcdFx0aWYgKCBmb3JtZGF0YV9hZGRpdGlvbmFsICE9PSAnJyApIHtcclxuXHRcdFx0XHRmb3JtZGF0YV9hZGRpdGlvbmFsICs9ICd+JztcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gU2FmZXR5OiBlbnN1cmUgd2UgaGF2ZSBhdCBsZWFzdCB0eXBlIF4gbmFtZSBeIHZhbHVlLlxyXG5cdFx0XHRpZiAoIG15X2Zvcm1fZmllbGQubGVuZ3RoIDwgMyApIHtcclxuXHRcdFx0XHRmb3JtZGF0YV9hZGRpdGlvbmFsICs9IGZvcm1kYXRhX2FkZGl0aW9uYWxfYXJyWyBqIF07XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG15X2Zvcm1fZmllbGRbIDEgXSA9IHdwYmNfcmV3cml0ZV9maWVsZF9uYW1lX3N1ZmZpeCggbXlfZm9ybV9maWVsZFsgMSBdLCByZXNvdXJjZV9pZCwgaWRfYWRkaXRpb25hbCApO1xyXG5cdFx0XHRmb3JtZGF0YV9hZGRpdGlvbmFsICs9IG15X2Zvcm1fZmllbGRbIDAgXSArICdeJyArIG15X2Zvcm1fZmllbGRbIDEgXSArICdeJyArIG15X2Zvcm1fZmllbGRbIDIgXTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBJZiBwYXltZW50IGZvcm0gZm9yIG1haW4gYm9va2luZyByZXNvdXJjZSBpcyBzaG93aW5nLCBhcHBlbmQgZm9yIGFkZGl0aW9uYWwgY2FsZW5kYXJzLlxyXG5cdFx0aWYgKCBqUXVlcnkoICcjZ2F0ZXdheV9wYXltZW50X2Zvcm1zJyArIHJlc291cmNlX2lkICkubGVuZ3RoID4gMCApIHtcclxuXHRcdFx0alF1ZXJ5KCAnI2dhdGV3YXlfcGF5bWVudF9mb3JtcycgKyByZXNvdXJjZV9pZCApLmFmdGVyKCAnPGRpdiBpZD1cImdhdGV3YXlfcGF5bWVudF9mb3JtcycgKyBpZF9hZGRpdGlvbmFsICsgJ1wiPjwvZGl2PicgKTtcclxuXHRcdFx0alF1ZXJ5KCAnI2dhdGV3YXlfcGF5bWVudF9mb3JtcycgKyByZXNvdXJjZV9pZCApLmFmdGVyKCAnPGRpdiBpZD1cImFqYXhfcmVzcG9uZF9pbnNlcnQnICsgaWRfYWRkaXRpb25hbCArICdcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj48L2Rpdj4nICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRml4SW46IDguNS4yLjE3LlxyXG5cdFx0d3BiY19zZW5kX2FqYXhfc3VibWl0KCBpZF9hZGRpdGlvbmFsLCBmb3JtZGF0YV9hZGRpdGlvbmFsLCBjYXB0Y2hhX2NoYWxhbmdlLCB1c2VyX2NhcHRjaGEsIGlzX3NlbmRfZW1laWxzLCBteV9ib29raW5nX2hhc2gsIG15X2Jvb2tpbmdfZm9ybSwgd3BkZXZfYWN0aXZlX2xvY2FsZSApO1xyXG5cdH1cclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBTZW5kIEFqYXggc3VibWl0IChsZWdhY3k6IHNlbmRfYWpheF9zdWJtaXQpLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHJlc291cmNlX2lkXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgZm9ybWRhdGFcclxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICBjYXB0Y2hhX2NoYWxhbmdlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgdXNlcl9jYXB0Y2hhXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSAgICAgICAgaXNfc2VuZF9lbWVpbHNcclxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICBteV9ib29raW5nX2hhc2hcclxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICBteV9ib29raW5nX2Zvcm1cclxuICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICB3cGRldl9hY3RpdmVfbG9jYWxlXHJcbiAqXHJcbiAqIEByZXR1cm4ge3VuZGVmaW5lZH0gTGVnYWN5IGJlaGF2aW9yLlxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19zZW5kX2FqYXhfc3VibWl0KHJlc291cmNlX2lkLCBmb3JtZGF0YSwgY2FwdGNoYV9jaGFsYW5nZSwgdXNlcl9jYXB0Y2hhLCBpc19zZW5kX2VtZWlscywgbXlfYm9va2luZ19oYXNoLCBteV9ib29raW5nX2Zvcm0sIHdwZGV2X2FjdGl2ZV9sb2NhbGUpIHtcclxuXHJcblx0cmVzb3VyY2VfaWQgPSBwYXJzZUludCggcmVzb3VyY2VfaWQsIDEwICk7XHJcblxyXG5cdC8vIERpc2FibGUgU3VibWl0IHwgU2hvdyBzcGluIGxvYWRlci5cclxuXHR3cGJjX2Jvb2tpbmdfZm9ybV9fb25fc3VibWl0X191aV9lbGVtZW50c19kaXNhYmxlKCByZXNvdXJjZV9pZCApO1xyXG5cclxuXHQvLyBGaXhJbjogMjAyNi0wMi0wNSAtIHBhc3MgcHJldmlldyBjb250ZXh0IHRvIGJvb2tpbmcgY3JlYXRlIEFqYXguXHJcblx0dmFyIGZvcm1fc3RhdHVzICA9IHdwYmNfX2dldF9mb3JtX3N0YXR1c19mb3Jfc3VibWl0KCByZXNvdXJjZV9pZCApO1xyXG5cdHZhciBwcmV2aWV3X2FyZ3MgPSAoZm9ybV9zdGF0dXMgPT09ICdwcmV2aWV3JykgPyB3cGJjX19nZXRfYmZiX3ByZXZpZXdfYXJnc19mcm9tX2xvY2F0aW9uKCkgOiBudWxsO1xyXG5cclxuXHR2YXIgcmVxdWVzdF9wYXJhbXMgPSB7XHJcblx0XHQncmVzb3VyY2VfaWQnICAgICAgICAgICAgICA6IHJlc291cmNlX2lkLFxyXG5cdFx0J2RhdGVzX2RkbW15eV9jc3YnICAgICAgICAgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ2RhdGVfYm9va2luZycgKyByZXNvdXJjZV9pZCApLnZhbHVlLFxyXG5cdFx0J2Zvcm1kYXRhJyAgICAgICAgICAgICAgICAgOiBmb3JtZGF0YSxcclxuXHRcdCdib29raW5nX2hhc2gnICAgICAgICAgICAgIDogbXlfYm9va2luZ19oYXNoLFxyXG5cdFx0J2N1c3RvbV9mb3JtJyAgICAgICAgICAgICAgOiBteV9ib29raW5nX2Zvcm0sXHJcblx0XHQnYWdncmVnYXRlX3Jlc291cmNlX2lkX2Fycic6ICggKCBudWxsICE9PSBfd3BiYy5ib29raW5nX19nZXRfcGFyYW1fdmFsdWUoIHJlc291cmNlX2lkLCAnYWdncmVnYXRlX3Jlc291cmNlX2lkX2FycicgKSApID8gX3dwYmMuYm9va2luZ19fZ2V0X3BhcmFtX3ZhbHVlKCByZXNvdXJjZV9pZCwgJ2FnZ3JlZ2F0ZV9yZXNvdXJjZV9pZF9hcnInICkuam9pbiggJywnICkgOiAnJyApLFxyXG5cdFx0J2NhcHRjaGFfY2hhbGFuZ2UnICAgICAgICAgOiBjYXB0Y2hhX2NoYWxhbmdlLFxyXG5cdFx0J2NhcHRjaGFfdXNlcl9pbnB1dCcgICAgICAgOiB1c2VyX2NhcHRjaGEsXHJcblx0XHQnaXNfZW1haWxzX3NlbmQnICAgICAgICAgICA6IGlzX3NlbmRfZW1laWxzLFxyXG5cdFx0J2FjdGl2ZV9sb2NhbGUnICAgICAgICAgICAgOiB3cGRldl9hY3RpdmVfbG9jYWxlLFxyXG5cdFx0J2Zvcm1fc3RhdHVzJyAgICAgICAgICAgICAgOiBmb3JtX3N0YXR1c1xyXG5cdH07XHJcblxyXG5cdC8vIElmIHByZXZpZXcsIHBhc3Mgc2Vzc2lvbiBpZGVudGlmaWVycyBzbyBQSFAgY2FuIGxvYWQgdHJhbnNpZW50IHNuYXBzaG90LlxyXG5cdGlmICggcHJldmlld19hcmdzICYmIHByZXZpZXdfYXJncy50b2tlbiAmJiBwcmV2aWV3X2FyZ3MuZm9ybV9pZCApIHtcclxuXHRcdHJlcXVlc3RfcGFyYW1zWyd3cGJjX2JmYl9wcmV2aWV3J10gICAgICAgICA9IDE7XHJcblx0XHRyZXF1ZXN0X3BhcmFtc1snd3BiY19iZmJfcHJldmlld190b2tlbiddICAgPSBwcmV2aWV3X2FyZ3MudG9rZW47XHJcblx0XHRyZXF1ZXN0X3BhcmFtc1snd3BiY19iZmJfcHJldmlld19mb3JtX2lkJ10gPSBwcmV2aWV3X2FyZ3MuZm9ybV9pZDtcclxuXHRcdHJlcXVlc3RfcGFyYW1zWyd3cGJjX2JmYl9wcmV2aWV3X25vbmNlJ10gICA9IHByZXZpZXdfYXJncy5ub25jZTsgLy8gbm90ZTogVVJMIHBhcmFtIGlzIGBub25jZWAuXHJcblx0fVxyXG5cclxuXHR2YXIgaXNfZXhpdCA9IHdwYmNfYWp4X2Jvb2tpbmdfX2NyZWF0ZSggcmVxdWVzdF9wYXJhbXMgKTtcclxuXHJcblx0aWYgKCB0cnVlID09PSBpc19leGl0ICkge1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxufVxyXG5cclxuXHJcblxyXG4vLyA9PSBIZWxwZXIgRnVuY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbi8qKlxyXG4gKiBQYXJzZSBxdWVyeSBzdHJpbmcgaW50byB7a2V5OnZhbHVlfSAob2xkLWJyb3dzZXIgc2FmZSkuXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBxc1xyXG4gKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX19wYXJzZV9xdWVyeV9zdHJpbmcocXMpIHtcclxuXHR2YXIgb3V0ID0ge307XHJcblx0cXMgICAgICA9IChxcyB8fCAnJyk7XHJcblx0cXMgICAgICA9IHFzLnJlcGxhY2UoIC9eXFw/LywgJycgKTtcclxuXHRpZiAoICEgcXMgKSB7XHJcblx0XHRyZXR1cm4gb3V0O1xyXG5cdH1cclxuXHJcblx0dmFyIHBhcnRzID0gcXMuc3BsaXQoICcmJyApO1xyXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrICkge1xyXG5cdFx0dmFyIGt2ID0gcGFydHNbaV0uc3BsaXQoICc9JyApO1xyXG5cdFx0dmFyIGsgID0gZGVjb2RlVVJJQ29tcG9uZW50KCBrdlswXSB8fCAnJyApO1xyXG5cdFx0aWYgKCAhIGsgKSB7XHJcblx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0fVxyXG5cdFx0dmFyIHYgID0gZGVjb2RlVVJJQ29tcG9uZW50KCBrdi5zbGljZSggMSApLmpvaW4oICc9JyApIHx8ICcnICk7XHJcblx0XHRvdXRba10gPSB2O1xyXG5cdH1cclxuXHRyZXR1cm4gb3V0O1xyXG59XHJcblxyXG4vKipcclxuICogRGV0ZWN0IHByZXZpZXcgYXJncyBmcm9tIGN1cnJlbnQgVVJMIChpZnJhbWUgVVJMKS5cclxuICpcclxuICogQHJldHVybiB7T2JqZWN0fG51bGx9IHsgdG9rZW4sIGZvcm1faWQsIG5vbmNlIH0gb3IgbnVsbFxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19fZ2V0X2JmYl9wcmV2aWV3X2FyZ3NfZnJvbV9sb2NhdGlvbigpIHtcclxuXHR0cnkge1xyXG5cdFx0dmFyIHAgPSB3cGJjX19wYXJzZV9xdWVyeV9zdHJpbmcoICh3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLnNlYXJjaCkgPyB3aW5kb3cubG9jYXRpb24uc2VhcmNoIDogJycgKTtcclxuXHJcblx0XHRpZiAoICEgcC53cGJjX2JmYl9wcmV2aWV3IHx8IChwLndwYmNfYmZiX3ByZXZpZXcgPT09ICcwJykgKSB7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggISBwLndwYmNfYmZiX3ByZXZpZXdfdG9rZW4gfHwgISBwLndwYmNfYmZiX3ByZXZpZXdfZm9ybV9pZCApIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0dG9rZW4gIDogU3RyaW5nKCBwLndwYmNfYmZiX3ByZXZpZXdfdG9rZW4gKSxcclxuXHRcdFx0Zm9ybV9pZDogcGFyc2VJbnQoIHAud3BiY19iZmJfcHJldmlld19mb3JtX2lkLCAxMCApIHx8IDAsXHJcblx0XHRcdG5vbmNlICA6IChwLm5vbmNlKSA/IFN0cmluZyggcC5ub25jZSApIDogJydcclxuXHRcdH07XHJcblx0fSBjYXRjaCAoIGUgKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXNvbHZlIGZvcm0gc3RhdHVzIGZvciBzdWJtaXQuXHJcbiAqXHJcbiAqIFByaW9yaXR5OlxyXG4gKiAxKSBzaG9ydGNvZGUgcGFyYW0gZXhwb3NlZCB2aWEgX3dwYmMuYm9va2luZ19fZ2V0X3BhcmFtX3ZhbHVlKC4uLiwgJ2Zvcm1fc3RhdHVzJylcclxuICogMikgZGV0ZWN0IHByZXZpZXcgVVJMIGFyZ3NcclxuICogMykgZmFsbGJhY2s6IHB1Ymxpc2hlZFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcmVzb3VyY2VfaWRcclxuICogQHJldHVybiB7c3RyaW5nfSAncHJldmlldyd8J3B1Ymxpc2hlZCdcclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfX2dldF9mb3JtX3N0YXR1c19mb3Jfc3VibWl0KHJlc291cmNlX2lkKSB7XHJcblxyXG5cdHZhciBzdGF0dXMgPSAnJztcclxuXHJcblx0dHJ5IHtcclxuXHRcdGlmICggKHR5cGVvZiBfd3BiYyAhPT0gJ3VuZGVmaW5lZCcpICYmIF93cGJjLmJvb2tpbmdfX2dldF9wYXJhbV92YWx1ZSApIHtcclxuXHRcdFx0c3RhdHVzID0gX3dwYmMuYm9va2luZ19fZ2V0X3BhcmFtX3ZhbHVlKCByZXNvdXJjZV9pZCwgJ2Zvcm1fc3RhdHVzJyApO1xyXG5cdFx0fVxyXG5cdH0gY2F0Y2ggKCBlICkge31cclxuXHJcblx0c3RhdHVzID0gKHN0YXR1cyA9PSBudWxsKSA/ICcnIDogU3RyaW5nKCBzdGF0dXMgKTtcclxuXHRzdGF0dXMgPSBzdGF0dXMudG9Mb3dlckNhc2UoKTtcclxuXHJcblx0Ly8gVVJMLWJhc2VkIGRldGVjdGlvbiBmb3IgcHJldmlldyBpZnJhbWUuXHJcblx0dmFyIHByZXZpZXdfYXJncyA9IHdwYmNfX2dldF9iZmJfcHJldmlld19hcmdzX2Zyb21fbG9jYXRpb24oKTtcclxuXHRpZiAoIHByZXZpZXdfYXJncyApIHtcclxuXHRcdHJldHVybiAncHJldmlldyc7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gKHN0YXR1cyA9PT0gJ3ByZXZpZXcnKSA/ICdwcmV2aWV3JyA6ICdwdWJsaXNoZWQnO1xyXG59XHJcblxyXG5cclxuXHJcbi8vID09IEJhY2t3YXJkLWNvbXBhdGlibGUgd3JhcHBlcnMgKGtlZXAgb2xkIGdsb2JhbCBuYW1lcyB3b3JraW5nIDEwMCUgYXMgYmVmb3JlKS4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5mdW5jdGlvbiBteWJvb2tpbmdfc3VibWl0KCBzdWJtaXRfZm9ybSwgcmVzb3VyY2VfaWQsIHdwZGV2X2FjdGl2ZV9sb2NhbGUgKSB7XHJcblx0cmV0dXJuIHdwYmNfYm9va2luZ19mb3JtX3N1Ym1pdCggc3VibWl0X2Zvcm0sIHJlc291cmNlX2lkLCB3cGRldl9hY3RpdmVfbG9jYWxlICk7XHJcbn1cclxuIiwidHJ5IHtcclxuXHR2YXIgZXYgPSAodHlwZW9mIEN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSA/IG5ldyBDdXN0b21FdmVudCggJ3dwYmMtcmVhZHknICkgOiBkb2N1bWVudC5jcmVhdGVFdmVudCggJ0V2ZW50JyApO1xyXG5cdGlmICggZXYuaW5pdEV2ZW50ICkge1xyXG5cdFx0ZXYuaW5pdEV2ZW50KCAnd3BiYy1yZWFkeScsIHRydWUsIHRydWUgKTtcclxuXHR9XHJcblx0ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCggZXYgKTtcclxuXHRjb25zb2xlLmxvZyggJ3dwYmMtcmVhZHknICk7XHJcbn0gY2F0Y2ggKCBlICkge1xyXG5cdGNvbnNvbGUuZXJyb3IoIFwiV1BCQyBldmVudCAnd3BiYy1yZWFkeScgZmFpbGVkIVwiLCBlICk7XHJcbn1cclxuIl0sIm1hcHBpbmdzIjoiYUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQ0EsU0FBQUEsVUFBQUMsY0FBQSxFQUVBLEdBQUFDLEtBQUEsQ0FBQUMsT0FBQSxDQUFBRixjQUFBLEdBQ0FBLGNBQUEsQ0FBQUEsY0FBQSxDQUFBRyxJQUFBLE1BQ0EsQ0FFQSxvQkFBQUgsY0FBQSxFQUNBQSxjQUFBLENBQUFBLGNBQUEsQ0FBQUksSUFBQSxHQUNBLENBRUEsT0FBQUosY0FBQSxDQUNBLENBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FDQSxTQUFBSyxjQUFBQyxVQUFBLENBQUFDLEtBQUEsRUFDQSxRQUFBQyxDQUFBLEdBQUFDLENBQUEsQ0FBQUgsVUFBQSxD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
1509