1 line
102 KiB
JavaScript
1 line
102 KiB
JavaScript
"use strict";(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["attendance-recurring_schedule_template_control-RecurringScheduleTemplateControlViewController"],{7067:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"RecurringScheduleTemplateControlViewController\": () => (/* binding */ RecurringScheduleTemplateControlViewController)\n/* harmony export */ });\n/* provided dependency */ var _ = __webpack_require__(9050);\n/* provided dependency */ var $ = __webpack_require__(9755);\nclass RecurringScheduleTemplateControlViewController extends BaseViewController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\t\t\tel: '#recurring_schedule_template_control_view_container',\n\n\n\t\t\tsub_document_view_controller: null,\n\n\t\t\tdocument_object_type_id: null,\n\n\t\t\trecurring_schedule_template_api: null,\n\n\t\t\tschedule_api: null,\n\n\t\t\trecurring_schedule_status_array: null\n\t\t} );\n\n\t\tsuper( options );\n\t}\n\n\tinit( options ) {\n\t\t//this._super('initialize', options );\n\t\tthis.edit_view_tpl = 'RecurringScheduleTemplateControlEditView.html';\n\t\tthis.permission_id = 'recurring_schedule_template';\n\t\tthis.viewId = 'RecurringScheduleTemplateControl';\n\t\tthis.script_name = 'RecurringScheduleTemplateControlView';\n\t\tthis.table_name_key = 'recurring_schedule_template_control';\n\t\tthis.context_menu_name = $.i18n._( 'Recurring Templates' );\n\t\tthis.navigation_label = $.i18n._( 'Recurring Template' );\n\t\tthis.api = TTAPI.APIRecurringScheduleTemplateControl;\n\t\tthis.schedule_api = TTAPI.APISchedule;\n\t\tthis.recurring_schedule_template_api = TTAPI.APIRecurringScheduleTemplate;\n\n\t\tthis.document_object_type_id = 10;\n\t\tthis.event_bus = new TTEventBus({ view_id: this.viewId });\n\n\t\tthis.render();\n\t\tthis.buildContextMenu();\n\n\t\tthis.initData();\n\t}\n\n\tinitOptions() {\n\t\tvar $this = this;\n\n\t\tthis.initDropDownOption( 'status', null, this.recurring_schedule_template_api, function( res ) {\n\t\t\tres = res.getResult();\n\t\t\t$this.recurring_schedule_status_array = Global.buildRecordArray( res );\n\t\t} );\n\t}\n\n\tbuildEditViewUI() {\n\t\tsuper.buildEditViewUI();\n\n\t\tvar $this = this;\n\n\t\tvar tab_model = {\n\t\t\t'tab_recurring_template': {\n\t\t\t\t'label': $.i18n._( 'Recurring Template' ),\n\t\t\t\t'html_template': this.getRecurringTemplateTabHtml()\n\t\t\t},\n\t\t\t'tab_attachment': true,\n\t\t\t'tab_audit': true,\n\t\t};\n\t\tthis.setTabModel( tab_model );\n\n\t\tvar form_item_input;\n\n\t\tthis.navigation.AComboBox( {\n\t\t\tapi_class: TTAPI.APIRecurringScheduleTemplateControl,\n\t\t\tid: this.script_name + '_navigation',\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_recurring_template_control',\n\t\t\tnavigation_mode: true,\n\t\t\tshow_search_inputs: true\n\t\t} );\n\n\t\tthis.setNavigation();\n\n\t\t//These width changes can cause crashes when tab is hidden on selenium screenshot unit test mode.\n\t\t//Left menu would not be clickable due to elements overlapping.\n\t\tif ( Global.UNIT_TEST_MODE == false ){\n\t\t\tthis.edit_view_tab.css( 'max-width', 'none' );\n\n\t\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t\tthis.edit_view_tab.css( 'min-width', '1250px' );\n\t\t\t} else if ( Global.getProductEdition() >= 15 ) {\n\t\t\t\tthis.edit_view_tab.css( 'min-width', '1050px' );\n\t\t\t} else {\n\t\t\t\tthis.edit_view_tab.css( 'min-width', '950px' );\n\t\t\t}\n\t\t}\n\n\t\t//Tab 0 start\n\n\t\tvar tab_recurring_template = this.edit_view_tab.find( '#tab_recurring_template' );\n\n\t\tvar tab_recurring_template_column1 = tab_recurring_template.find( '.first-column' );\n\n\t\tthis.edit_view_tabs[0] = [];\n\n\t\tthis.edit_view_tabs[0].push( tab_recurring_template_column1 );\n\n\t\t//Name\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\n\t\tform_item_input.TTextInput( { field: 'name', width: '100%' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Name' ), form_item_input, tab_recurring_template_column1, '' );\n\n\t\tform_item_input.parent().width( '45%' );\n\n\t\t// Description\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\n\t\tform_item_input.TTextInput( { field: 'description', width: '100%' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Description' ), form_item_input, tab_recurring_template_column1 );\n\n\t\tform_item_input.parent().width( '45%' );\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIUser,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_user',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'created_by_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Created By' ), form_item_input, tab_recurring_template_column1 );\n\n\t\tform_item_input.parent().width( '45%' );\n\n\t\t//Inside editor\n\n\t\tvar inside_editor_div = tab_recurring_template.find( '.inside-editor-div' );\n\n\t\tvar args = {\n\t\t\tweek: $.i18n._( 'Week' ),\n\t\t\tstatus: $.i18n._( 'Status' ),\n\t\t\tweek_names: 'S M T W T  F S',\n\t\t\tshift_time: $.i18n._( 'Shift Time' ),\n\t\t\ttotal: $.i18n._( 'Total' ),\n\t\t\tschedule_policy: $.i18n._( 'Schedule Policy' ),\n\t\t\tbranch_department: $.i18n._( 'Branch/Department' ),\n\t\t\tjob_task: $.i18n._( 'Job/Task/Tags' ),\n\t\t\topen_shift_multiplier: $.i18n._( 'Open Shift Multiplier' )\n\t\t};\n\n\t\tthis.editor = Global.loadWidgetByName( FormItemType.INSIDE_EDITOR );\n\n\t\tthis.editor.InsideEditor( {\n\t\t\ttitle: $.i18n._( 'NOTE: To set different In/Out times for each day of the week, add additional weeks all with the same week number.' ),\n\t\t\taddRow: this.insideEditorAddRow,\n\t\t\tremoveRow: this.insideEditorRemoveRow,\n\t\t\tgetValue: this.insideEditorGetValue,\n\t\t\tsetValue: this.insideEditorSetValue,\n\t\t\tparent_controller: this,\n\t\t\tapi: this.recurring_schedule_template_api,\n\t\t\trender: getRender(),\n\t\t\trender_args: args,\n\t\t\trender_inline_html: true,\n\t\t\trow_render: getRowRender()\n\n\t\t} );\n\n\t\tfunction getRender() {\n\t\t\tvar render = ''\n\n\t\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t\trender = `\n\t\t\t\t<table class=\"inside-editor-render\">\n\t\t\t\t\t<tr class=\"title\">\n\t\t\t\t\t\t<td style=\"width: 50px\"><%= week %></td>\n\t\t\t\t\t\t<td style=\"width: 100px\"><%= status %></td>\n\t\t\t\t\t\t<td style=\"width: 153px\"><%= week_names %></td>\n\t\t\t\t\t\t<td style=\"width: 140px\"><%= shift_time %></td>\n\t\t\t\t\t\t<td style=\"width: 45px\"><%= total %></td>\n\t\t\t\t\t\t<td style=\"width: 140px\"><%= schedule_policy %></td>\n\t\t\t\t\t\t<td style=\"width: 230px\"><%= branch_department %></td>\n\t\t\t\t\t\t<td style=\"width: 190px\"><%= job_task %></td>\n\t\t\t\t\t\t<td style=\"width: 100px\"><%= open_shift_multiplier %></td>\n\t\t\t\t\t</tr>\n\t\t\t\t</table>`;\n\t\t\t} else if ( Global.getProductEdition() >= 15 ) {\n\t\t\t\trender = `\n\t\t\t\t<table class=\"inside-editor-render\">\n\t\t\t\t\t<tr class=\"title\">\n\t\t\t\t\t\t<td style=\"width: 50px\"><%= week %></td>\n\t\t\t\t\t\t<td style=\"width: 100px\"><%= status %></td>\n\t\t\t\t\t\t<td style=\"width: 153px\"><%= week_names %></td>\n\t\t\t\t\t\t<td style=\"width: 140px\"><%= shift_time %></td>\n\t\t\t\t\t\t<td style=\"width: 45px\"><%= total %></td>\n\t\t\t\t\t\t<td style=\"width: 140px\"><%= schedule_policy %></td>\n\t\t\t\t\t\t<td style=\"width: 230px\"><%= branch_department %></td>\n\t\t\t\t\t\t<td style=\"width: 100px\"><%= open_shift_multiplier %></td>\n\t\t\t\t\t</tr>\n\t\t\t\t</table>`;\n\t\t\t} else {\n\t\t\t\trender = `\n\t\t\t\t<table class=\"inside-editor-render\">\n\t\t\t\t\t<tr class=\"title\">\n\t\t\t\t\t\t<td style=\"width: 50px\"><%= week %></td>\n\t\t\t\t\t\t<td style=\"width: 100px\"><%= status %></td>\n\t\t\t\t\t\t<td style=\"width: 153px\"><%= week_names %></td>\n\t\t\t\t\t\t<td style=\"width: 140px\"><%= shift_time %></td>\n\t\t\t\t\t\t<td style=\"width: 45px\"><%= total %></td>\n\t\t\t\t\t\t<td style=\"width: 140px\"><%= schedule_policy %></td>\n\t\t\t\t\t\t<td style=\"width: 230px\"><%= branch_department %></td>\n\t\t\t\t\t</tr>\n\t\t\t\t</table>`;\n\t\t\t}\n\t\t\treturn render;\n\t\t}\n\n\t\tfunction getRowRender() {\n\t\t\tvar render = '';\n\n\t\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t\trender = `<tr class=\"inside-editor-row data-row\">\n\t\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t\t<td class=\"week-cell\"></td>\n\t\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t\t<td class=\"cell control-icon\">\n\t\t\t\t\t\t\t\t<button class=\"plus-icon\" onclick=\"\"></button>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td class=\"cell control-icon\">\n\t\t\t\t\t\t\t\t<button class=\"minus-icon \" onclick=\"\"></button>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>`;\n\t\t\t} else if ( Global.getProductEdition() >= 15 ) {\n\t\t\t\trender = `<tr class=\"inside-editor-row data-row\">\n\t\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t\t<td class=\"week-cell\"></td>\n\t\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t\t<td class=\"cell control-icon\">\n\t\t\t\t\t\t\t\t<button class=\"plus-icon\" onclick=\"\"></button>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td class=\"cell control-icon\">\n\t\t\t\t\t\t\t\t<button class=\"minus-icon \" onclick=\"\"></button>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>`;\n\t\t\t} else {\n\t\t\t\trender = `\n\t\t\t\t\t<tr class=\"inside-editor-row data-row\">\n\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t<td class=\"week-cell\"></td>\n\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t<td class=\"\"></td>\n\t\t\t\t\t\t<td class=\"cell control-icon\">\n\t\t\t\t\t\t\t<button class=\"plus-icon\" onclick=\"\"></button>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td class=\"cell control-icon\">\n\t\t\t\t\t\t\t<button class=\"minus-icon \" onclick=\"\"></button>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>`;\n\t\t\t}\n\t\t\treturn render;\n\t\t}\n\n\t\tinside_editor_div.append( this.editor );\n\t}\n\n\tsetEditViewDataDone() {\n\t\tsuper.setEditViewDataDone();\n\t\tif ( !this.is_mass_editing ) {\n\t\t\tthis.initInsideEditorData();\n\t\t\tthis.edit_view.find( '.inside-editor-div' ).show();\n\t\t} else {\n\t\t\tthis.edit_view.find( '.inside-editor-div' ).hide();\n\t\t}\n\t}\n\n\tinitInsideEditorData() {\n\t\tvar $this = this;\n\t\tvar args = {};\n\t\targs.filter_data = {};\n\n\t\tif ( ( !this.current_edit_record || !this.current_edit_record.id ) && !this.copied_record_id ) {\n\t\t\t$this.editor.removeAllRows();\n\t\t\t$this.editor.getDefaultData();\n\n\t\t} else {\n\n\t\t\targs.filter_data.recurring_schedule_template_control_id = this.current_edit_record.id ? this.current_edit_record.id : this.copied_record_id;\n\t\t\tthis.copied_record_id = '';\n\t\t\t$this.recurring_schedule_template_api['get' + $this.recurring_schedule_template_api.key_name]( args, {\n\t\t\t\tonResult: function( res ) {\n\t\t\t\t\tif ( !$this.edit_view ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tvar data = res.getResult();\n\t\t\t\t\t$this.editor.setValue( data );\n\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\t}\n\n\tinsideEditorAddRow( data, index ) {\n\n\t\tvar form_item_input;\n\n\t\tvar $this = this;\n\t\tif ( !data ) {\n\t\t\tthis.getDefaultData( index );\n\t\t} else {\n\t\t\tvar form_item_input;\n\t\t\tvar widgetContainer;\n\n\t\t\tvar row_id = ( data.id && this.parent_controller.current_edit_record.id ) ? data.id : TTUUID.generateUUID();\n\t\t\tvar row = this.getRowRender(); //Get Row render\n\t\t\tvar render = this.getRender(); //get render, should be a table\n\t\t\tvar widgets = {}; //Save each row's widgets\n\n\t\t\t//Build row widgets\n\n\t\t\t// Week\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\tform_item_input.TTextInput( { field: 'week', width: 40 } );\n\t\t\tform_item_input.setValue( data.week ? data.week : 1 );\n\t\t\twidgets[form_item_input.getField()] = form_item_input;\n\t\t\trow.children().eq( 0 ).append( form_item_input );\n\t\t\tform_item_input.attr( 'recurring_schedule_template_id', row_id );\n\t\t\tform_item_input.attr( 'date_stamp', data.date_stamp ); //Needed to prepend start/end times with so they can be parsed properly and calculate Total Time.\n\n\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_input );\n\n\t\t\t// Status\n\t\t\twidgetContainer = $( '<div class=\\'recurring-template-status-div\\'></div>' );\n\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\tform_item_input.TComboBox( { field: 'status_id' } );\n\t\t\tform_item_input.setSourceData( this.parent_controller.recurring_schedule_status_array );\n\t\t\tform_item_input.setValue( data.status_id ? data.status_id : 10 );\n\t\t\twidgets[form_item_input.getField()] = form_item_input;\n\n\t\t\tform_item_input.bind( 'formItemChange', function( e, target ) {\n\t\t\t\tif ( target.getValue() == 10 ) {\n\t\t\t\t\twidgets['absence_policy_id'].hide();\n\t\t\t\t} else if ( target.getValue() == 20 ) {\n\t\t\t\t\twidgets['absence_policy_id'].show();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\twidgetContainer.append( form_item_input );\n\n\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_input );\n\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIAbsencePolicy,\n\t\t\t\twidth: 132,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_absences',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tfield: 'absence_policy_id'\n\t\t\t} );\n\n\t\t\tform_item_input.css( 'position', 'absolute' );\n\t\t\tform_item_input.css( 'left', '0' );\n\t\t\tform_item_input.css( 'top', '30px' );\n\t\t\tform_item_input.css( 'z-index', '1' ); //For some reason if this overlaps with the \"checkboxes\", it goes behind that div and makes the down arrow unclickable.\n\t\t\tform_item_input.setValue( data.absence_policy_id ? data.absence_policy_id : '' );\n\t\t\twidgets[form_item_input.getField()] = form_item_input;\n\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_input );\n\t\t\twidgetContainer.append( form_item_input );\n\n\t\t\trow.children().eq( 1 ).append( widgetContainer );\n\n\t\t\t// sun mon tue wed thu fri sat\n\t\t\tvar widgetContainer2 = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\t\t// Sun\n\t\t\tvar form_item_sun_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_sun_checkbox.TCheckbox( { field: 'sun' } );\n\t\t\tform_item_sun_checkbox.setValue( data.sun ? data.sun : false );\n\t\t\twidgets[form_item_sun_checkbox.getField()] = form_item_sun_checkbox;\n\t\t\twidgetContainer2.append( form_item_sun_checkbox );\n\n\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_sun_checkbox );\n\t\t\t// Mon\n\t\t\tvar form_item_mon_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_mon_checkbox.TCheckbox( { field: 'mon' } );\n\t\t\tform_item_mon_checkbox.setValue( data.mon ? data.mon : false );\n\t\t\twidgets[form_item_mon_checkbox.getField()] = form_item_mon_checkbox;\n\t\t\twidgetContainer2.append( form_item_mon_checkbox );\n\n\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_mon_checkbox );\n\t\t\t// Tue\n\t\t\tvar form_item_tue_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_tue_checkbox.TCheckbox( { field: 'tue' } );\n\t\t\tform_item_tue_checkbox.setValue( data.tue ? data.tue : false );\n\t\t\twidgets[form_item_tue_checkbox.getField()] = form_item_tue_checkbox;\n\t\t\twidgetContainer2.append( form_item_tue_checkbox );\n\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_tue_checkbox );\n\t\t\t// Wed\n\t\t\tvar form_item_wed_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_wed_checkbox.TCheckbox( { field: 'wed' } );\n\t\t\tform_item_wed_checkbox.setValue( data.wed ? data.wed : false );\n\t\t\twidgets[form_item_wed_checkbox.getField()] = form_item_wed_checkbox;\n\t\t\twidgetContainer2.append( form_item_wed_checkbox );\n\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_wed_checkbox );\n\t\t\t// Thu\n\t\t\tvar form_item_thu_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_thu_checkbox.TCheckbox( { field: 'thu' } );\n\t\t\tform_item_thu_checkbox.setValue( data.thu ? data.thu : false );\n\t\t\twidgets[form_item_thu_checkbox.getField()] = form_item_thu_checkbox;\n\t\t\twidgetContainer2.append( form_item_thu_checkbox );\n\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_thu_checkbox );\n\t\t\t// Fri\n\t\t\tvar form_item_fri_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_fri_checkbox.TCheckbox( { field: 'fri' } );\n\t\t\tform_item_fri_checkbox.setValue( data.fri ? data.fri : false );\n\t\t\twidgets[form_item_fri_checkbox.getField()] = form_item_fri_checkbox;\n\t\t\twidgetContainer2.append( form_item_fri_checkbox );\n\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_fri_checkbox );\n\t\t\t// Sat\n\t\t\tvar form_item_sat_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\t\tform_item_sat_checkbox.TCheckbox( { field: 'sat' } );\n\t\t\tform_item_sat_checkbox.setValue( data.sat ? data.sat : false );\n\t\t\twidgets[form_item_sat_checkbox.getField()] = form_item_sat_checkbox;\n\t\t\twidgetContainer2.append( form_item_sat_checkbox );\n\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_sat_checkbox );\n\n\t\t\trow.children().eq( 2 ).append( widgetContainer2 );\n\n\t\t\t// Shift Time\n\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\n\t\t\tvar divContainer1 = $( '<div style=\\'text-align: left; \\'></div>' );\n\n\t\t\tvar label_1 = $( '<span class=\\'widget-right-label recurring-template-widget-right-label\\' style=\\'display: inline-block; width: 28px; vertical-align: middle;\\'> ' + $.i18n._( 'In' ) + ' </span>' );\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TIME_PICKER );\n\t\t\tform_item_input.TTimePicker( { field: 'start_time' } );\n\t\t\tform_item_input.setValue( data.start_time ? data.start_time : '' );\n\n\t\t\tform_item_input.bind( 'formItemChange', function( e, target ) {\n\n\t\t\t\tvar rows_widgets = $this.rows_widgets_array[target.parent().parent().parent().parent().index() - 1];\n\n\t\t\t\t$this.parent_controller.onRowChanges( rows_widgets );\n\t\t\t} );\n\n\t\t\twidgets[form_item_input.getField() + row_id] = form_item_input;\n\t\t\tthis.parent_controller.edit_view_ui_validation_field_dic[form_item_input.getField() + row_id] = form_item_input;\n\n\t\t\tdivContainer1.append( label_1 );\n\t\t\tdivContainer1.append( form_item_input );\n\n\t\t\twidgetContainer.append( divContainer1 );\n\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_input );\n\n\t\t\tvar divContainer2 = $( '<div style=\\'text-align: left; margin-top: 5px;\\'></div>' );\n\n\t\t\tvar label_2 = $( '<span class=\\'widget-right-label recurring-template-widget-right-label\\' style=\\'display: inline-block; width: 28px; vertical-align: middle;\\' > ' + $.i18n._( 'Out' ) + ' </span>' );\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TIME_PICKER );\n\t\t\tform_item_input.TTimePicker( { field: 'end_time' } );\n\t\t\tform_item_input.setValue( data.end_time ? data.end_time : '' );\n\n\t\t\tform_item_input.bind( 'formItemChange', function( e, target ) {\n\t\t\t\tvar rows_widgets = $this.rows_widgets_array[target.parent().parent().parent().parent().index() - 1];\n\n\t\t\t\t$this.parent_controller.onRowChanges( rows_widgets );\n\t\t\t} );\n\n\t\t\twidgets[form_item_input.getField() + row_id] = form_item_input;\n\t\t\tthis.parent_controller.edit_view_ui_validation_field_dic[form_item_input.getField() + row_id] = form_item_input;\n\n\t\t\tdivContainer2.append( label_2 );\n\t\t\tdivContainer2.append( form_item_input );\n\n\t\t\twidgetContainer.append( divContainer2 );\n\n\t\t\trow.children().eq( 3 ).append( widgetContainer );\n\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_input );\n\n\t\t\t// Total\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\tform_item_input.TText( { field: 'total_time' } );\n\t\t\tform_item_input.setValue( data.total_time ? Global.getTimeUnit( data.total_time ) : '' ); //\n\t\t\twidgets[form_item_input.getField()] = form_item_input;\n\n\t\t\trow.children().eq( 4 ).append( form_item_input );\n\n\t\t\t// Schedule Policy\n\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APISchedulePolicy,\n\t\t\t\twidth: 80,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_schedule',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tfield: 'schedule_policy_id'\n\t\t\t} );\n\n\t\t\tform_item_input.setValue( data.schedule_policy_id ? data.schedule_policy_id : '' );\n\t\t\twidgets[form_item_input.getField()] = form_item_input;\n\n\t\t\trow.children().eq( 5 ).append( form_item_input );\n\n\t\t\tform_item_input.bind( 'formItemChange', function( e, target ) {\n\t\t\t\tvar rows_widgets = $this.rows_widgets_array[target.parent().parent().index() - 1];\n\n\t\t\t\t$this.parent_controller.onRowChanges( rows_widgets );\n\t\t\t} );\n\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_input );\n\n\t\t\t// Branch / Department\n\n\t\t\twidgetContainer = $( '<div class=\\'widget-h-box recurring-template-widget-h-box\\'></div>' );\n\n\t\t\tdivContainer1 = $( '<div></div>' );\n\n\t\t\tlabel_1 = $( '<span class=\\'widget-right-label\\' style=\\'float: left; height: 24px; line-height: 24px; min-width: 74px;\\'> ' + $.i18n._( 'Branch' ) + ' </span>' );\n\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIBranch,\n\t\t\t\twidth: 80,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_branch',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_any: true,\n\t\t\t\tfield: 'branch_id',\n\t\t\t\tcustom_first_label: Global.default_item\n\t\t\t} );\n\n\t\t\tif ( data.branch_id.toUpperCase() === TTUUID.not_exist_id.toUpperCase() ) {\n\t\t\t\tform_item_input.set_default_value = true;\n\t\t\t} else {\n\t\t\t\tform_item_input.setValue( data.branch_id ? data.branch_id : '' );\n\t\t\t}\n\t\t\twidgets[form_item_input.getField()] = form_item_input;\n\n\t\t\tdivContainer1.append( label_1 );\n\t\t\tdivContainer1.append( form_item_input );\n\n\t\t\twidgetContainer.append( divContainer1 );\n\n\t\t\tdivContainer2 = $( '<div style=\\'margin-top: 5px; float: left\\'></div>' );\n\n\t\t\tlabel_2 = $( '<span class=\\'widget-right-label\\' style=\\'float: left; height: 24px; line-height: 24px; min-width: 74px;\\'> ' + $.i18n._( 'Department' ) + ' </span>' );\n\n\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_input );\n\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIDepartment,\n\t\t\t\twidth: 80,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_department',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_any: true,\n\t\t\t\tfield: 'department_id',\n\t\t\t\tcustom_first_label: Global.default_item\n\t\t\t} );\n\t\t\tform_item_input.setValue( ( data.department_id ) ? data.department_id : '' );\n\t\t\twidgets[form_item_input.getField()] = form_item_input;\n\n\t\t\tdivContainer2.append( label_2 );\n\t\t\tdivContainer2.append( form_item_input );\n\n\t\t\twidgetContainer.append( divContainer2 );\n\n\t\t\trow.children().eq( 6 ).append( widgetContainer );\n\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_input );\n\n\t\t\t// Job/Task/Punch Tag\n\n\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\n\t\t\t\twidgetContainer = $( '<div class=\\'widget-h-box recurring-template-widget-h-box\\'></div>' );\n\n\t\t\t\tdivContainer1 = $( '<div></div>' );\n\n\t\t\t\tlabel_1 = $( '<span class=\\'widget-right-label\\' style=\\'float: left; height: 24px; line-height: 24px; min-width: 32px;\\'> ' + $.i18n._( 'Job' ) + ' </span>' );\n\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\t\tform_item_input.AComboBox( {\n\t\t\t\t\tapi_class: TTAPI.APIJob,\n\t\t\t\t\twidth: 80,\n\t\t\t\t\tallow_multiple_selection: false,\n\t\t\t\t\tlayout_name: 'global_job',\n\t\t\t\t\tshow_search_inputs: true,\n\t\t\t\t\tset_any: true,\n\t\t\t\t\tfield: 'job_id',\n\t\t\t\t\tcustom_first_label: Global.default_item\n\t\t\t\t} );\n\t\t\t\tform_item_input.setValue( data.job_id ? data.job_id : '' );\n\t\t\t\twidgets[form_item_input.getField()] = form_item_input;\n\n\t\t\t\tdivContainer1.append( label_1 );\n\t\t\t\tdivContainer1.append( form_item_input );\n\n\t\t\t\twidgetContainer.append( divContainer1 );\n\n\t\t\t\tdivContainer2 = $( '<div style=\\'margin-top: 5px; float: left\\'></div>' );\n\n\t\t\t\tlabel_2 = $( '<span class=\\'widget-right-label\\' style=\\'float: left; height: 24px; line-height: 24px; min-width: 32px;\\'> ' + $.i18n._( 'Task' ) + ' </span>' );\n\t\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_input );\n\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\t\tform_item_input.AComboBox( {\n\t\t\t\t\tapi_class: TTAPI.APIJobItem,\n\t\t\t\t\twidth: 80,\n\t\t\t\t\tallow_multiple_selection: false,\n\t\t\t\t\tlayout_name: 'global_job_item',\n\t\t\t\t\tshow_search_inputs: true,\n\t\t\t\t\tset_any: true,\n\t\t\t\t\tfield: 'job_item_id',\n\t\t\t\t\tcustom_first_label: Global.default_item\n\t\t\t\t} );\n\t\t\t\tform_item_input.setValue( data.job_item_id ? data.job_item_id : '' );\n\t\t\t\twidgets[form_item_input.getField()] = form_item_input;\n\n\t\t\t\tdivContainer2.append( label_2 );\n\t\t\t\tdivContainer2.append( form_item_input );\n\n\t\t\t\twidgetContainer.append( divContainer2 );\n\n\t\t\t\tvar divContainer3 = $( '<div style=\\'margin-top: 5px; float: left\\'></div>' );\n\n\t\t\t\tvar label_3 = $( '<span class=\\'widget-right-label\\' style=\\'float: left; height: 24px; line-height: 24px; min-width: 32px;\\'> ' + $.i18n._( 'Tags' ) + ' </span>' );\n\t\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_input );\n\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\t\tform_item_input.AComboBox( {\n\t\t\t\t\tapi_class: TTAPI.APIPunchTag,\n\t\t\t\t\twidth: 80,\n\t\t\t\t\tallow_multiple_selection: true,\n\t\t\t\t\tlayout_name: 'global_punch_tag',\n\t\t\t\t\tshow_search_inputs: true,\n\t\t\t\t\tset_any: true,\n\t\t\t\t\tsetRealValueCallBack: ( ( punch_tags ) => {\n\t\t\t\t\t\tif ( punch_tags ) {\n\t\t\t\t\t\t\tthis.setPunchTagQuickSearchManualIds( punch_tags );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ),\n\t\t\t\t\tfield: 'punch_tag_id',\n\t\t\t\t\tcustom_first_label: Global.default_item\n\t\t\t\t} );\n\t\t\t\tform_item_input.setValue( data.punch_tag_id ? data.punch_tag_id : '' );\n\t\t\t\twidgets[form_item_input.getField()] = form_item_input;\n\n\t\t\t\tdivContainer3.append( label_3 );\n\t\t\t\tdivContainer3.append( form_item_input );\n\n\t\t\t\twidgetContainer.append( divContainer3 );\n\n\t\t\t\trow.children().eq( 7 ).append( widgetContainer );\n\t\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_input );\n\n\t\t\t}\n\n\t\t\tif ( Global.getProductEdition() >= 15 ) {\n\t\t\t\t// Open Shift Multiplier\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'open_shift_multiplier', width: 20 } );\n\t\t\t\tform_item_input.setValue( data.open_shift_multiplier ? data.open_shift_multiplier : 1 );\n\t\t\t\twidgets[form_item_input.getField()] = form_item_input;\n\n\t\t\t\tif ( Global.getProductEdition() <= 15 ) {\n\t\t\t\t\trow.children().eq( 7 ).append( form_item_input );\n\t\t\t\t} else {\n\t\t\t\t\trow.children().eq( 8 ).append( form_item_input );\n\t\t\t\t}\n\n\t\t\t\tthis.setWidgetEnableBaseOnParentController( form_item_input );\n\t\t\t}\n\n\t\t\tif ( typeof index != 'undefined' ) {\n\n\t\t\t\trow.insertAfter( $( render ).find( 'tr' ).eq( index ) );\n\t\t\t\tthis.rows_widgets_array.splice( ( index ), 0, widgets );\n\n\t\t\t} else {\n\t\t\t\t$( render ).append( row );\n\t\t\t\tthis.rows_widgets_array.push( widgets );\n\t\t\t}\n\n\t\t\tif ( this.parent_controller.is_viewing ) {\n\t\t\t\trow.find( '.control-icon' ).hide();\n\t\t\t}\n\n\t\t\tif ( widgets.status_id.getValue() == 10 ) {\n\t\t\t\twidgets.absence_policy_id.css( 'display', 'none' );\n\t\t\t} else if ( widgets.status_id.getValue() == 20 ) {\n\t\t\t\twidgets.absence_policy_id.css( 'display', 'block' );\n\t\t\t}\n\n\t\t\tthis.addIconsEvent( row ); //Bind event to add and minus icon\n\t\t\tthis.removeLastRowLine();\n\t\t}\n\t}\n\n\tonRowChanges( row_widgets ) {\n\t\tvar recurring_schedule_template_id = row_widgets.week.attr( 'recurring_schedule_template_id' );\n\t\tvar date_stamp = row_widgets.week.attr( 'date_stamp' );\n\n\t\tif ( recurring_schedule_template_id ) {\n\t\t\tvar startTime = date_stamp +' '+ row_widgets['start_time' + recurring_schedule_template_id].getValue();\n\t\t\tvar endTime = date_stamp +' '+ row_widgets['end_time' + recurring_schedule_template_id].getValue();\n\t\t\tvar schedulePolicyId = row_widgets.schedule_policy_id.getValue();\n\n\t\t\tif ( startTime !== '' && endTime !== '' && schedulePolicyId !== '' ) {\n\t\t\t\tvar result = this.schedule_api.getScheduleTotalTime( startTime, endTime, schedulePolicyId, { async: false } );\n\t\t\t\tif ( result ) {\n\t\t\t\t\tvar total_time = result.getResult();\n\n\t\t\t\t\trow_widgets.total_time.setValue( Global.getTimeUnit( total_time ) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.validate();\n\t\t}\n\t}\n\n\tinsideEditorGetValue( current_edit_item_id ) {\n\t\tvar len = this.rows_widgets_array.length;\n\n\t\tvar result = [];\n\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tvar row = this.rows_widgets_array[i];\n\n\t\t\tvar recurring_schedule_template_id = row.week.attr( 'recurring_schedule_template_id' );\n\t\t\tvar date_stamp = row.week.attr( 'date_stamp' );\n\n\t\t\tif ( recurring_schedule_template_id ) {\n\t\t\t\tvar data = {\n\t\t\t\t\tid: recurring_schedule_template_id,\n\n\t\t\t\t\tweek: row.week.getValue(),\n\t\t\t\t\tstatus_id: row.status_id.getValue(),\n\n\t\t\t\t\tmon: row.mon.getValue(),\n\t\t\t\t\ttue: row.tue.getValue(),\n\t\t\t\t\twed: row.wed.getValue(),\n\t\t\t\t\tthu: row.thu.getValue(),\n\t\t\t\t\tfri: row.fri.getValue(),\n\t\t\t\t\tsat: row.sat.getValue(),\n\t\t\t\t\tsun: row.sun.getValue(),\n\n\t\t\t\t\tdate_stamp: date_stamp,\n\t\t\t\t\tstart_time: row['start_time' + recurring_schedule_template_id].getValue(),\n\t\t\t\t\tend_time: row['end_time' + recurring_schedule_template_id].getValue(),\n\t\t\t\t\ttotal_time: null,\n\n\t\t\t\t\tbranch_id: row.branch_id.getValue(),\n\t\t\t\t\tdepartment_id: row.department_id.getValue(),\n\n\t\t\t\t\tabsence_policy_id: row.absence_policy_id.getValue(),\n\t\t\t\t\tschedule_policy_id: row.schedule_policy_id.getValue()\n\t\t\t\t};\n\n\t\t\t\tif ( Global.getProductEdition() >= 15 ) {\n\t\t\t\t\tdata.open_shift_multiplier = row.open_shift_multiplier.getValue();\n\t\t\t\t}\n\n\t\t\t\tif ( Global.getProductEdition() >= 20 ) {\n\t\t\t\t\tdata.job_id = row.job_id.getValue();\n\t\t\t\t\tdata.job_item_id = row.job_item_id.getValue();\n\t\t\t\t\tdata.punch_tag_id = row.punch_tag_id.getValue();\n\t\t\t\t}\n\n\t\t\t\tdata.recurring_schedule_template_control_id = current_edit_item_id;\n\t\t\t\tresult.push( data );\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tinsideEditorSetValue( val ) {\n\t\tvar len = val.length;\n\t\tthis.removeAllRows();\n\n\t\tif ( len > 0 ) {\n\t\t\tfor ( var i = 0; i < val.length; i++ ) {\n\t\t\t\tif ( Global.isSet( val[i] ) ) {\n\t\t\t\t\tvar row = val[i];\n\t\t\t\t\tthis.addRow( row );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.getDefaultData();\n\t\t}\n\t}\n\n\tinsideEditorRemoveRow( row ) {\n\t\tvar index = row[0].rowIndex - 1;\n\t\tvar remove_id = this.rows_widgets_array[index].week.attr( 'recurring_schedule_template_id' );\n\t\tif ( TTUUID.isUUID( remove_id ) && remove_id != TTUUID.zero_id && remove_id != TTUUID.not_exist_id ) {\n\t\t\tthis.delete_ids.push( remove_id );\n\t\t}\n\t\trow.remove();\n\t\tthis.rows_widgets_array.splice( index, 1 );\n\n\t\tthis.removeLastRowLine();\n\t}\n\n\tuniformVariable( records ) {\n\t\tif ( !this.is_mass_editing ) {\n\t\t\trecords.recurring_schedule_template = this.editor.getValue( this.refresh_id );\n\t\t}\n\t\treturn records;\n\t}\n\n\trenameObjectKey( obj, old_key, new_key ) {\n\t\tif ( old_key !== new_key ) {\n\t\t\tObject.defineProperty( obj, new_key,\n\t\t\t\tObject.getOwnPropertyDescriptor( obj, old_key ) );\n\t\t\tdelete obj[old_key];\n\t\t}\n\t}\n\n\t_continueDoCopyAsNew() {\n\t\tthis.setCurrentEditViewState( 'new' );\n\t\tLocalCacheData.current_doing_context_action = 'copy_as_new';\n\n\t\tif ( Global.isSet( this.edit_view ) ) {\n\t\t\tfor ( var i = 0; i < this.editor.rows_widgets_array.length; i++ ) {\n\t\t\t\t//Fix JS exception: Uncaught TypeError: Cannot read property 'getValue' of undefined\n\t\t\t\t//start_time,end_time object keys are appended with the recurring_schedule_template_id, so when copying records we need to rename them to use the new recurring_schedule_template_id\n\t\t\t\tvar new_uuid = TTUUID.generateUUID();\n\t\t\t\tvar old_recurring_schedule_template_id = this.editor.rows_widgets_array[i].week.attr( 'recurring_schedule_template_id' );\n\n\t\t\t\tthis.renameObjectKey( this.editor.rows_widgets_array[i], 'start_time' + old_recurring_schedule_template_id, 'start_time' + new_uuid );\n\t\t\t\tthis.renameObjectKey( this.editor.rows_widgets_array[i], 'end_time' + old_recurring_schedule_template_id, 'end_time' + new_uuid );\n\n\t\t\t\tthis.editor.rows_widgets_array[i].week.attr( 'recurring_schedule_template_id', new_uuid );\n\t\t\t}\n\t\t}\n\t\tsuper._continueDoCopyAsNew();\n\t}\n\n\tonCopyAsNewResult( result ) {\n\t\tvar $this = this;\n\t\tvar result_data = result.getResult();\n\n\t\tif ( !result_data ) {\n\t\t\tTAlertManager.showAlert( $.i18n._( 'Record does not exist' ) );\n\t\t\t$this.onCancelClick();\n\t\t\treturn;\n\t\t}\n\n\t\t$this.openEditView(); // Put it here is to avoid if the selected one is not existed in data or have deleted by other pragram. in this case, the edit view should not be opend.\n\n\t\tresult_data = result_data[0];\n\t\tthis.copied_record_id = result_data.id;\n\t\tresult_data.id = '';\n\t\tif ( $this.sub_view_mode && $this.parent_key ) {\n\t\t\tresult_data[$this.parent_key] = $this.parent_value;\n\t\t}\n\n\t\t$this.current_edit_record = result_data;\n\t\t$this.initEditView();\n\t}\n\n\tbuildSearchFields() {\n\n\t\tsuper.buildSearchFields();\n\t\tthis.search_fields = [\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Name' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'name',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.TEXT_INPUT\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Description' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'description',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.TEXT_INPUT\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Template' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'id',\n\t\t\t\tlayout_name: 'global_recurring_template_control',\n\t\t\t\tapi_class: TTAPI.APIRecurringScheduleTemplateControl,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Schedule Policy' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'schedule_policy_id',\n\t\t\t\tlayout_name: 'global_schedule',\n\t\t\t\tapi_class: TTAPI.APISchedulePolicy,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Created By' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'created_by',\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Updated By' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'updated_by',\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} )\n\t\t];\n\t}\n\n\tgetCustomContextMenuModel() {\n\t\tvar context_menu_model = {\n\t\t\texclude: [],\n\t\t\tinclude: [\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Jump To' ),\n\t\t\t\t\tid: 'jump_to_header',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'jump_to',\n\t\t\t\t\taction_group_header: true,\n\t\t\t\t\tpermission_result: false // to hide it in legacy context menu and avoid errors in legacy parsers.\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: $.i18n._( 'Recurring Schedules' ),\n\t\t\t\t\tid: 'recurring_schedule',\n\t\t\t\t\tmenu_align: 'right',\n\t\t\t\t\taction_group: 'jump_to',\n\t\t\t\t\tgroup: 'navigation',\n\t\t\t\t}]\n\t\t};\n\n\t\treturn context_menu_model;\n\t}\n\n\tonCustomContextClick( id ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'recurring_schedule':\n\t\t\t\tthis.onNavigationClick( id );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tonNavigationClick( iconName ) {\n\n\t\tvar $this = this;\n\n\t\tvar grid_selected_id_array;\n\n\t\tvar filter = { filter_data: {} };\n\n\t\tvar recurring_schedule_template_control_ids = [];\n\n\t\tif ( $this.edit_view && $this.current_edit_record.id ) {\n\t\t\trecurring_schedule_template_control_ids.push( $this.current_edit_record.id );\n\t\t} else {\n\t\t\tgrid_selected_id_array = this.getGridSelectIdArray();\n\t\t\t$.each( grid_selected_id_array, function( index, value ) {\n\t\t\t\tvar grid_selected_row = $this.getRecordFromGridById( value );\n\t\t\t\trecurring_schedule_template_control_ids.push( grid_selected_row.id );\n\t\t\t} );\n\t\t}\n\n\t\tfilter.filter_data.recurring_schedule_template_control_id = recurring_schedule_template_control_ids;\n\n\t\tswitch ( iconName ) {\n\t\t\tcase 'recurring_schedule':\n\t\t\t\tGlobal.addViewTab( this.viewId, $.i18n._( 'Recurring Templates' ), window.location.href );\n\t\t\t\tIndexViewController.goToView( 'RecurringScheduleControl', filter );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetCustomDefaultMenuIcon( id, context_btn, grid_selected_length ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'recurring_schedule':\n\t\t\t\tthis.setDefaultMenuRecurringScheduleIcon( context_btn, grid_selected_length );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetDefaultMenuRecurringScheduleIcon( context_btn, grid_selected_length, pId ) {\n\t\tif ( !PermissionManager.checkTopLevelPermission( 'RecurringScheduleControl' ) || this.edit_only_mode ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\n\t\tif ( grid_selected_length > 0 ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t} else {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tsetCustomEditMenuIcon( id, context_btn ) {\n\t\tswitch ( id ) {\n\t\t\tcase 'recurring_schedule':\n\t\t\t\tthis.setEditMenuRecurringScheduleIcon( context_btn );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetEditMenuRecurringScheduleIcon( context_btn, pId ) {\n\t\tif ( !this.viewPermissionValidate( pId ) || this.edit_only_mode ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\n\t\tif ( !this.current_edit_record || !this.current_edit_record.id ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\n\t}\n\n\tonSaveResult( result ) {\n\t\tsuper.onSaveResult( result );\n\t\tif ( result && result.isValid() ) {\n\t\t\tvar system_job_queue = result.getAttributeInAPIDetails( 'system_job_queue' );\n\t\t\tif ( system_job_queue ) {\n\t\t\t\tthis.event_bus.emit( 'tt_topbar', 'toggle_job_queue_spinner', {\n\t\t\t\t\tshow: true,\n\t\t\t\t\tget_job_data: true\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t}\n\n\tgetRecurringTemplateTabHtml() {\n\t\treturn `<div id=\"tab_recurring_template\" class=\"edit-view-tab-outside\">\n\t\t\t\t\t<div class=\"edit-view-tab\" id=\"tab_recurring_template_content_div\">\n\t\t\t\t\t\t<div class=\"first-column full-width-column\"></div>\n\t\t\t\t\t\t<div class=\"inside-editor-div full-width-column\">\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>`;\n\t}\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzA2Ny5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBTztBQUNQLDJCQUEyQjtBQUMzQixFQUFFLENBQUM7QUFDSDs7O0FBR0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsQ0FBQztBQUM1QiwwQkFBMEIsQ0FBQztBQUMzQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQ0FBb0Msc0JBQXNCOztBQUUxRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxDQUFDO0FBQ2Q7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsZ0NBQWdDLCtCQUErQjtBQUMvRCw2QkFBNkIsQ0FBQzs7QUFFOUI7O0FBRUE7QUFDQTs7QUFFQSxnQ0FBZ0Msc0NBQXNDO0FBQ3RFLDZCQUE2QixDQUFDOztBQUU5Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLDZCQUE2QixDQUFDOztBQUU5Qjs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLFNBQVMsQ0FBQztBQUNWLFdBQVcsQ0FBQztBQUNaLHVCQUF1QixNQUFNLE9BQU8sTUFBTSxPQUFPLE1BQU0sT0FBTyxNQUFNLFlBQVksT0FBTyxNQUFNO0FBQzdGLGVBQWUsQ0FBQztBQUNoQixVQUFVLENBQUM7QUFDWCxvQkFBb0IsQ0FBQztBQUNyQixzQkFBc0IsQ0FBQztBQUN2QixhQUFhLENBQUM7QUFDZCwwQkFBMEIsQ0FBQztBQUMzQjs7QUFFQTs7QUFFQTtBQUNBLFVBQVUsQ0FBQztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtB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Q0EsS0FBSzs7QUFFTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxDQUFDO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLFlBQVksQ0FBQztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEsaUJBQWlCOztBQUVqQjs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsR0FBRyxDQUFDO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esb0NBQW9DLENBQUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vaW50ZXJmYWNlL2h0bWw1L3ZpZXdzL2F0dGVuZGFuY2UvcmVjdXJyaW5nX3NjaGVkdWxlX3RlbXBsYXRlX2NvbnRyb2wvUmVjdXJyaW5nU2NoZWR1bGVUZW1wbGF0ZUNvbnRyb2xWaWV3Q29udHJvbGxlci5qcz9mYWRiIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBSZWN1cnJpbmdTY2hlZHVsZVRlbXBsYXRlQ29udHJvbFZpZXdDb250cm9sbGVyIGV4dGVuZHMgQmFzZVZpZXdDb250cm9sbGVyIHtcblx0Y29uc3RydWN0b3IoIG9wdGlvbnMgPSB7fSApIHtcblx0XHRfLmRlZmF1bHRzKCBvcHRpb25zLCB7XG5cdFx0XHRlbDogJyNyZWN1cnJpbmdfc2NoZWR1bGVfdGVtcGxhdGVfY29udHJvbF92aWV3X2NvbnRhaW5lcicsXG5cblxuXHRcdFx0c3ViX2RvY3VtZW50X3ZpZXdfY29udHJvbGxlcjogbnVsbCxcblxuXHRcdFx0ZG9jdW1lbnRfb2JqZWN0X3R5cGVfaWQ6IG51bGwsXG5cblx0XHRcdHJlY3VycmluZ19zY2hlZHVsZV90ZW1wbGF0ZV9hcGk6IG51bGwsXG5cblx0XHRcdHNjaGVkdWxlX2FwaTogbnVsbCxcblxuXHRcdFx0cmVjdXJyaW5nX3NjaGVkdWxlX3N0YXR1c19hcnJheTogbnVsbFxuXHRcdH0gKTtcblxuXHRcdHN1cGVyKCBvcHRpb25zICk7XG5cdH1cblxuXHRpbml0KCBvcHRpb25zICkge1xuXHRcdC8vdGhpcy5fc3VwZXIoJ2luaXRpYWxpemUnLCBvcHRpb25zICk7XG5cdFx0dGhpcy5lZGl0X3ZpZXdfdHBsID0gJ1JlY3VycmluZ1NjaGVkdWxlVGVtcGxhdGVDb250cm9sRWRpdFZpZXcuaHRtbCc7XG5cdFx0dGhpcy5wZXJtaXNzaW9uX2lkID0gJ3JlY3VycmluZ19zY2hlZHVsZV90ZW1wbGF0ZSc7XG5cdFx0dGhpcy52aWV3SWQgPSAnUmVjdXJyaW5nU2NoZWR1bGVUZW1wbGF0ZUNvbnRyb2wnO1xuXHRcdHRoaXMuc2NyaXB0X25hbWUgPSAnUmVjdXJyaW5nU2NoZWR1bGVUZW1wbGF0ZUNvbnRyb2xWaWV3Jztcblx0XHR0aGlzLnRhYmxlX25hbWVfa2V5ID0gJ3JlY3VycmluZ19zY2hlZHVsZV90ZW1wbGF0ZV9jb250cm9sJztcblx0XHR0aGlzLmNvbnRleHRfbWVudV9uYW1lID0gJC5pMThuLl8oICdSZWN1cnJpbmcgVGVtcGxhdGVzJyApO1xuXHRcdHRoaXMubmF2aWdhdGlvbl9sYWJlbCA9ICQuaTE4bi5fKCAnUmVjdXJyaW5nIFRlbXBsYXRlJyApO1xuXHRcdHRoaXMuYXBpID0gVFRBUEkuQVBJUmVjdXJyaW5nU2NoZWR1bGVUZW1wbGF0ZUNvbnRyb2w7XG5cdFx0dGhpcy5zY2hlZHVsZV9hcGkgPSBUVEFQSS5BUElTY2hlZHVsZTtcblx0XHR0aGlzLnJlY3VycmluZ19zY2hlZHVsZV90ZW1wbGF0ZV9hcGkgPSBUVEFQSS5BUElSZWN1cnJpbmdTY2hlZHVsZVRlbXBsYXRlO1xuXG5cdFx0dGhpcy5kb2N1bWVudF9vYmplY3RfdHlwZV9pZCA9IDEwO1xuXHRcdHRoaXMuZXZlbnRfYnVzID0gbmV3IFRURXZlbnRCdXMoeyB2aWV3X2lkOiB0aGlzLnZpZXdJZCB9KTtcblxuXHRcdHRoaXMucmVuZGVyKCk7XG5cdFx0dGhpcy5idWlsZENvbnRleHRNZW51KCk7XG5cblx0XHR0aGlzLmluaXREYXRhKCk7XG5cdH1cblxuXHRpbml0T3B0aW9ucygpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0dGhpcy5pbml0RHJvcERvd25PcHRpb24oICdzdGF0dXMnLCBudWxsLCB0aGlzLnJlY3VycmluZ19zY2hlZHVsZV90ZW1wbGF0ZV9hcGksIGZ1bmN0aW9uKCByZXMgKSB7XG5cdFx0XHRyZXMgPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHQkdGhpcy5yZWN1cnJpbmdfc2NoZWR1bGVfc3RhdHVzX2FycmF5ID0gR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlcyApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGJ1aWxkRWRpdFZpZXdVSSgpIHtcblx0XHRzdXBlci5idWlsZEVkaXRWaWV3VUkoKTtcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHR2YXIgdGFiX21vZGVsID0ge1xuXHRcdFx0J3RhYl9yZWN1cnJpbmdfdGVtcGxhdGUnOiB7XG5cdFx0XHRcdCdsYWJlbCc6ICQuaTE4bi5fKCAnUmVjdXJyaW5nIFRlbXBsYXRlJyApLFxuXHRcdFx0XHQnaHRtbF90ZW1wbGF0ZSc6IHRoaXMuZ2V0UmVjdXJyaW5nVGVtcGxhdGVUYWJIdG1sKClcblx0XHRcdH0sXG5cdFx0XHQndGFiX2F0dGFjaG1lbnQnOiB0cnVlLFxuXHRcdFx0J3RhYl9hdWRpdCc6IHRydWUsXG5cdFx0fTtcblx0XHR0aGlzLnNldFRhYk1vZGVsKCB0YWJfbW9kZWwgKTtcblxuXHRcdHZhciBmb3JtX2l0ZW1faW5wdXQ7XG5cblx0XHR0aGlzLm5hdmlnYXRpb24uQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVJlY3VycmluZ1NjaGVkdWxlVGVtcGxhdGVDb250cm9sLFxuXHRcdFx0aWQ6IHRoaXMuc2NyaXB0X25hbWUgKyAnX25hdmlnYXRpb24nLFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3JlY3VycmluZ190ZW1wbGF0ZV9jb250cm9sJyxcblx0XHRcdG5hdmlnYXRpb25fbW9kZTogdHJ1ZSxcblx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZVxuXHRcdH0gKTtcblxuXHRcdHRoaXMuc2V0TmF2aWdhdGlvbigpO1xuXG5cdFx0Ly9UaGVzZSB3aWR0aCBjaGFuZ2VzIGNhbiBjYXVzZSBjcmFzaGVzIHdoZW4gdGFiIGlzIGhpZGRlbiBvbiBzZWxlbml1bSBzY3JlZW5zaG90IHVuaXQgdGVzdCBtb2RlLlxuXHRcdC8vTGVmdCBtZW51IHdvdWxkIG5vdCBiZSBjbGlja2FibGUgZHVlIHRvIGVsZW1lbnRzIG92ZXJsYXBwaW5nLlxuXHRcdGlmICggR2xvYmFsLlVOSVRfVEVTVF9NT0RFID09IGZhbHNlICl7XG5cdFx0XHR0aGlzLmVkaXRfdmlld190YWIuY3NzKCAnbWF4LXdpZHRoJywgJ25vbmUnICk7XG5cblx0XHRcdGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSB7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3RhYi5jc3MoICdtaW4td2lkdGgnLCAnMTI1MHB4JyApO1xuXHRcdFx0fSBlbHNlIGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMTUgKSB7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3RhYi5jc3MoICdtaW4td2lkdGgnLCAnMTA1MHB4JyApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdGFiLmNzcyggJ21pbi13aWR0aCcsICc5NTBweCcgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvL1RhYiAwIHN0YXJ0XG5cblx0XHR2YXIgdGFiX3JlY3VycmluZ190ZW1wbGF0ZSA9IHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYl9yZWN1cnJpbmdfdGVtcGxhdGUnICk7XG5cblx0XHR2YXIgdGFiX3JlY3VycmluZ190ZW1wbGF0ZV9jb2x1bW4xID0gdGFiX3JlY3VycmluZ190ZW1wbGF0ZS5maW5kKCAnLmZpcnN0LWNvbHVtbicgKTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0gPSBbXTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0ucHVzaCggdGFiX3JlY3VycmluZ190ZW1wbGF0ZV9jb2x1bW4xICk7XG5cblx0XHQvL05hbWVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblxuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnbmFtZScsIHdpZHRoOiAnMTAwJScgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnTmFtZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcmVjdXJyaW5nX3RlbXBsYXRlX2NvbHVtbjEsICcnICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQucGFyZW50KCkud2lkdGgoICc0NSUnICk7XG5cblx0XHQvLyBEZXNjcmlwdGlvblxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdkZXNjcmlwdGlvbicsIHdpZHRoOiAnMTAwJScgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRGVzY3JpcHRpb24nICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3JlY3VycmluZ190ZW1wbGF0ZV9jb2x1bW4xICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQucGFyZW50KCkud2lkdGgoICc0NSUnICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElVc2VyLFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3VzZXInLFxuXHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0ZmllbGQ6ICdjcmVhdGVkX2J5X2lkJ1xuXHRcdH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0NyZWF0ZWQgQnknICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3JlY3VycmluZ190ZW1wbGF0ZV9jb2x1bW4xICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQucGFyZW50KCkud2lkdGgoICc0NSUnICk7XG5cblx0XHQvL0luc2lkZSBlZGl0b3JcblxuXHRcdHZhciBpbnNpZGVfZWRpdG9yX2RpdiA9IHRhYl9yZWN1cnJpbmdfdGVtcGxhdGUuZmluZCggJy5pbnNpZGUtZWRpdG9yLWRpdicgKTtcblxuXHRcdHZhciBhcmdzID0ge1xuXHRcdFx0d2VlazogJC5pMThuLl8oICdXZWVrJyApLFxuXHRcdFx0c3RhdHVzOiAkLmkxOG4uXyggJ1N0YXR1cycgKSxcblx0XHRcdHdlZWtfbmFtZXM6ICdTJm5ic3A7Jm5ic3A7TSZuYnNwOyZuYnNwO1QmbmJzcDsmbmJzcDtXJm5ic3A7Jm5ic3A7VCZuYnNwJm5ic3A7RiZuYnNwOyZuYnNwO1MnLFxuXHRcdFx0c2hpZnRfdGltZTogJC5pMThuLl8oICdTaGlmdCBUaW1lJyApLFxuXHRcdFx0dG90YWw6ICQuaTE4bi5fKCAnVG90YWwnICksXG5cdFx0XHRzY2hlZHVsZV9wb2xpY3k6ICQuaTE4bi5fKCAnU2NoZWR1bGUgUG9saWN5JyApLFxuXHRcdFx0YnJhbmNoX2RlcGFydG1lbnQ6ICQuaTE4bi5fKCAnQnJhbmNoL0RlcGFydG1lbnQnICksXG5cdFx0XHRqb2JfdGFzazogJC5pMThuLl8oICdKb2IvVGFzay9UYWdzJyApLFxuXHRcdFx0b3Blbl9zaGlmdF9tdWx0aXBsaWVyOiAkLmkxOG4uXyggJ09wZW4gU2hpZnQgTXVsdGlwbGllcicgKVxuXHRcdH07XG5cblx0XHR0aGlzLmVkaXRvciA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuSU5TSURFX0VESVRPUiApO1xuXG5cdFx0dGhpcy5lZGl0b3IuSW5zaWRlRWRpdG9yKCB7XG5cdFx0XHR0aXRsZTogJC5pMThuLl8oICdOT1RFOiBUbyBzZXQgZGlmZmVyZW50IEluL091dCB0aW1lcyBmb3IgZWFjaCBkYXkgb2YgdGhlIHdlZWssIGFkZCBhZGRpdGlvbmFsIHdlZWtzIGFsbCB3aXRoIHRoZSBzYW1lIHdlZWsgbnVtYmVyLicgKSxcblx0XHRcdGFkZFJvdzogdGhpcy5pbnNpZGVFZGl0b3JBZGRSb3csXG5cdFx0XHRyZW1vdmVSb3c6IHRoaXMuaW5zaWRlRWRpdG9yUmVtb3ZlUm93LFxuXHRcdFx0Z2V0VmFsdWU6IHRoaXMuaW5zaWRlRWRpdG9yR2V0VmFsdWUsXG5cdFx0XHRzZXRWYWx1ZTogdGhpcy5pbnNpZGVFZGl0b3JTZXRWYWx1ZSxcblx0XHRcdHBhcmVudF9jb250cm9sbGVyOiB0aGlzLFxuXHRcdFx0YXBpOiB0aGlzLnJlY3VycmluZ19zY2hlZHVsZV90ZW1wbGF0ZV9hcGksXG5cdFx0XHRyZW5kZXI6IGdldFJlbmRlcigpLFxuXHRcdFx0cmVuZGVyX2FyZ3M6IGFyZ3MsXG5cdFx0XHRyZW5kZXJfaW5saW5lX2h0bWw6IHRydWUsXG5cdFx0XHRyb3dfcmVuZGVyOiBnZXRSb3dSZW5kZXIoKVxuXG5cdFx0fSApO1xuXG5cdFx0ZnVuY3Rpb24gZ2V0UmVuZGVyKCkge1xuXHRcdFx0dmFyIHJlbmRlciA9ICcnXG5cblx0XHRcdGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSB7XG5cdFx0XHRcdHJlbmRlciA9IGBcblx0XHRcdFx0PHRhYmxlIGNsYXNzPVwiaW5zaWRlLWVkaXRvci1yZW5kZXJcIj5cblx0XHRcdFx0XHQ8dHIgY2xhc3M9XCJ0aXRsZVwiPlxuXHRcdFx0XHRcdFx0PHRkIHN0eWxlPVwid2lkdGg6IDUwcHhcIj48JT0gd2VlayAlPjwvdGQ+XG5cdFx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJ3aWR0aDogMTAwcHhcIj48JT0gc3RhdHVzICU+PC90ZD5cblx0XHRcdFx0XHRcdDx0ZCBzdHlsZT1cIndpZHRoOiAxNTNweFwiPjwlPSB3ZWVrX25hbWVzICU+PC90ZD5cblx0XHRcdFx0XHRcdDx0ZCBzdHlsZT1cIndpZHRoOiAxNDBweFwiPjwlPSBzaGlmdF90aW1lICU+PC90ZD5cblx0XHRcdFx0XHRcdDx0ZCBzdHlsZT1cIndpZHRoOiA0NXB4XCI+PCU9IHRvdGFsICU+PC90ZD5cblx0XHRcdFx0XHRcdDx0ZCBzdHlsZT1cIndpZHRoOiAxNDBweFwiPjwlPSBzY2hlZHVsZV9wb2xpY3kgJT48L3RkPlxuXHRcdFx0XHRcdFx0PHRkIHN0eWxlPVwid2lkdGg6IDIzMHB4XCI+PCU9IGJyYW5jaF9kZXBhcnRtZW50ICU+PC90ZD5cblx0XHRcdFx0XHRcdDx0ZCBzdHlsZT1cIndpZHRoOiAxOTBweFwiPjwlPSBqb2JfdGFzayAlPjwvdGQ+XG5cdFx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJ3aWR0aDogMTAwcHhcIj48JT0gb3Blbl9zaGlmdF9tdWx0aXBsaWVyICU+PC90ZD5cblx0XHRcdFx0XHQ8L3RyPlxuXHRcdFx0XHQ8L3RhYmxlPmA7XG5cdFx0XHR9IGVsc2UgaWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSApIHtcblx0XHRcdFx0cmVuZGVyID0gYFxuXHRcdFx0XHQ8dGFibGUgY2xhc3M9XCJpbnNpZGUtZWRpdG9yLXJlbmRlclwiPlxuXHRcdFx0XHRcdDx0ciBjbGFzcz1cInRpdGxlXCI+XG5cdFx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJ3aWR0aDogNTBweFwiPjwlPSB3ZWVrICU+PC90ZD5cblx0XHRcdFx0XHRcdDx0ZCBzdHlsZT1cIndpZHRoOiAxMDBweFwiPjwlPSBzdGF0dXMgJT48L3RkPlxuXHRcdFx0XHRcdFx0PHRkIHN0eWxlPVwid2lkdGg6IDE1M3B4XCI+PCU9IHdlZWtfbmFtZXMgJT48L3RkPlxuXHRcdFx0XHRcdFx0PHRkIHN0eWxlPVwid2lkdGg6IDE0MHB4XCI+PCU9IHNoaWZ0X3RpbWUgJT48L3RkPlxuXHRcdFx0XHRcdFx0PHRkIHN0eWxlPVwid2lkdGg6IDQ1cHhcIj48JT0gdG90YWwgJT48L3RkPlxuXHRcdFx0XHRcdFx0PHRkIHN0eWxlPVwid2lkdGg6IDE0MHB4XCI+PCU9IHNjaGVkdWxlX3BvbGljeSAlPjwvdGQ+XG5cdFx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJ3aWR0aDogMjMwcHhcIj48JT0gYnJhbmNoX2RlcGFydG1lbnQgJT48L3RkPlxuXHRcdFx0XHRcdFx0PHRkIHN0eWxlPVwid2lkdGg6IDEwMHB4XCI+PCU9IG9wZW5fc2hpZnRfbXVsdGlwbGllciAlPjwvdGQ+XG5cdFx0XHRcdFx0PC90cj5cblx0XHRcdFx0PC90YWJsZT5gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVuZGVyID0gYFxuXHRcdFx0XHQ8dGFibGUgY2xhc3M9XCJpbnNpZGUtZWRpdG9yLXJlbmRlclwiPlxuXHRcdFx0XHRcdDx0ciBjbGFzcz1cInRpdGxlXCI+XG5cdFx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJ3aWR0aDogNTBweFwiPjwlPSB3ZWVrICU+PC90ZD5cblx0XHRcdFx0XHRcdDx0ZCBzdHlsZT1cIndpZHRoOiAxMDBweFwiPjwlPSBzdGF0dXMgJT48L3RkPlxuXHRcdFx0XHRcdFx0PHRkIHN0eWxlPVwid2lkdGg6IDE1M3B4XCI+PCU9IHdlZWtfbmFtZXMgJT48L3RkPlxuXHRcdFx0XHRcdFx0PHRkIHN0eWxlPVwid2lkdGg6IDE0MHB4XCI+PCU9IHNoaWZ0X3RpbWUgJT48L3RkPlxuXHRcdFx0XHRcdFx0PHRkIHN0eWxlPVwid2lkdGg6IDQ1cHhcIj48JT0gdG90YWwgJT48L3RkPlxuXHRcdFx0XHRcdFx0PHRkIHN0eWxlPVwid2lkdGg6IDE0MHB4XCI+PCU9IHNjaGVkdWxlX3BvbGljeSAlPjwvdGQ+XG5cdFx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJ3aWR0aDogMjMwcHhcIj48JT0gYnJhbmNoX2RlcGFydG1lbnQgJT48L3RkPlxuXHRcdFx0XHRcdDwvdHI+XG5cdFx0XHRcdDwvdGFibGU+YDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZW5kZXI7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0Um93UmVuZGVyKCkge1xuXHRcdFx0dmFyIHJlbmRlciA9ICcnO1xuXG5cdFx0XHRpZiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkge1xuXHRcdFx0XHRyZW5kZXIgPSBgPHRyIGNsYXNzPVwiaW5zaWRlLWVkaXRvci1yb3cgZGF0YS1yb3dcIj5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwid2Vlay1jZWxsXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiY2VsbCBjb250cm9sLWljb25cIj5cblx0XHRcdFx0XHRcdFx0XHQ8YnV0dG9uIGNsYXNzPVwicGx1cy1pY29uXCIgb25jbGljaz1cIlwiPjwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJjZWxsIGNvbnRyb2wtaWNvblwiPlxuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gY2xhc3M9XCJtaW51cy1pY29uIFwiIG9uY2xpY2s9XCJcIj48L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0PC90ZD5cblx0XHRcdFx0XHRcdDwvdHI+YDtcblx0XHRcdH0gZWxzZSBpZiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDE1ICkge1xuXHRcdFx0XHRyZW5kZXIgPSBgPHRyIGNsYXNzPVwiaW5zaWRlLWVkaXRvci1yb3cgZGF0YS1yb3dcIj5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwid2Vlay1jZWxsXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiY2VsbCBjb250cm9sLWljb25cIj5cblx0XHRcdFx0XHRcdFx0XHQ8YnV0dG9uIGNsYXNzPVwicGx1cy1pY29uXCIgb25jbGljaz1cIlwiPjwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJjZWxsIGNvbnRyb2wtaWNvblwiPlxuXHRcdFx0XHRcdFx0XHRcdDxidXR0b24gY2xhc3M9XCJtaW51cy1pY29uIFwiIG9uY2xpY2s9XCJcIj48L2J1dHRvbj5cblx0XHRcdFx0XHRcdFx0PC90ZD5cblx0XHRcdFx0XHRcdDwvdHI+YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbmRlciA9IGBcblx0XHRcdFx0XHQ8dHIgY2xhc3M9XCJpbnNpZGUtZWRpdG9yLXJvdyBkYXRhLXJvd1wiPlxuXHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cIlwiPjwvdGQ+XG5cdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJ3ZWVrLWNlbGxcIj48L3RkPlxuXHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cIlwiPjwvdGQ+XG5cdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJcIj48L3RkPlxuXHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiXCI+PC90ZD5cblx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cImNlbGwgY29udHJvbC1pY29uXCI+XG5cdFx0XHRcdFx0XHRcdDxidXR0b24gY2xhc3M9XCJwbHVzLWljb25cIiBvbmNsaWNrPVwiXCI+PC9idXR0b24+XG5cdFx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwiY2VsbCBjb250cm9sLWljb25cIj5cblx0XHRcdFx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cIm1pbnVzLWljb24gXCIgb25jbGljaz1cIlwiPjwvYnV0dG9uPlxuXHRcdFx0XHRcdFx0PC90ZD5cblx0XHRcdFx0XHQ8L3RyPmA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVuZGVyO1xuXHRcdH1cblxuXHRcdGluc2lkZV9lZGl0b3JfZGl2LmFwcGVuZCggdGhpcy5lZGl0b3IgKTtcblx0fVxuXG5cdHNldEVkaXRWaWV3RGF0YURvbmUoKSB7XG5cdFx0c3VwZXIuc2V0RWRpdFZpZXdEYXRhRG9uZSgpO1xuXHRcdGlmICggIXRoaXMuaXNfbWFzc19lZGl0aW5nICkge1xuXHRcdFx0dGhpcy5pbml0SW5zaWRlRWRpdG9yRGF0YSgpO1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXcuZmluZCggJy5pbnNpZGUtZWRpdG9yLWRpdicgKS5zaG93KCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZWRpdF92aWV3LmZpbmQoICcuaW5zaWRlLWVkaXRvci1kaXYnICkuaGlkZSgpO1xuXHRcdH1cblx0fVxuXG5cdGluaXRJbnNpZGVFZGl0b3JEYXRhKCkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIGFyZ3MgPSB7fTtcblx0XHRhcmdzLmZpbHRlcl9kYXRhID0ge307XG5cblx0XHRpZiAoICggIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZCB8fCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkgJiYgIXRoaXMuY29waWVkX3JlY29yZF9pZCApIHtcblx0XHRcdCR0aGlzLmVkaXRvci5yZW1vdmVBbGxSb3dzKCk7XG5cdFx0XHQkdGhpcy5lZGl0b3IuZ2V0RGVmYXVsdERhdGEoKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGFyZ3MuZmlsdGVyX2RhdGEucmVjdXJyaW5nX3NjaGVkdWxlX3RlbXBsYXRlX2NvbnRyb2xfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgPyB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgOiB0aGlzLmNvcGllZF9yZWNvcmRfaWQ7XG5cdFx0XHR0aGlzLmNvcGllZF9yZWNvcmRfaWQgPSAnJztcblx0XHRcdCR0aGlzLnJlY3VycmluZ19zY2hlZHVsZV90ZW1wbGF0ZV9hcGlbJ2dldCcgKyAkdGhpcy5yZWN1cnJpbmdfc2NoZWR1bGVfdGVtcGxhdGVfYXBpLmtleV9uYW1lXSggYXJncywge1xuXHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0XHRpZiAoICEkdGhpcy5lZGl0X3ZpZXcgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHZhciBkYXRhID0gcmVzLmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdCR0aGlzLmVkaXRvci5zZXRWYWx1ZSggZGF0YSApO1xuXG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblxuXHRcdH1cblx0fVxuXG5cdGluc2lkZUVkaXRvckFkZFJvdyggZGF0YSwgaW5kZXggKSB7XG5cblx0XHR2YXIgZm9ybV9pdGVtX2lucHV0O1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRpZiAoICFkYXRhICkge1xuXHRcdFx0dGhpcy5nZXREZWZhdWx0RGF0YSggaW5kZXggKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIGZvcm1faXRlbV9pbnB1dDtcblx0XHRcdHZhciB3aWRnZXRDb250YWluZXI7XG5cblx0XHRcdHZhciByb3dfaWQgPSAoIGRhdGEuaWQgJiYgdGhpcy5wYXJlbnRfY29udHJvbGxlci5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkgPyBkYXRhLmlkIDogVFRVVUlELmdlbmVyYXRlVVVJRCgpO1xuXHRcdFx0dmFyIHJvdyA9IHRoaXMuZ2V0Um93UmVuZGVyKCk7IC8vR2V0IFJvdyByZW5kZXJcblx0XHRcdHZhciByZW5kZXIgPSB0aGlzLmdldFJlbmRlcigpOyAvL2dldCByZW5kZXIsIHNob3VsZCBiZSBhIHRhYmxlXG5cdFx0XHR2YXIgd2lkZ2V0cyA9IHt9OyAvL1NhdmUgZWFjaCByb3cncyB3aWRnZXRzXG5cblx0XHRcdC8vQnVpbGQgcm93IHdpZGdldHNcblxuXHRcdFx0Ly8gV2Vla1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ3dlZWsnLCB3aWR0aDogNDAgfSApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCBkYXRhLndlZWsgPyBkYXRhLndlZWsgOiAxICk7XG5cdFx0XHR3aWRnZXRzW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9pbnB1dDtcblx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCAwICkuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5hdHRyKCAncmVjdXJyaW5nX3NjaGVkdWxlX3RlbXBsYXRlX2lkJywgcm93X2lkICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuYXR0ciggJ2RhdGVfc3RhbXAnLCBkYXRhLmRhdGVfc3RhbXAgKTsgLy9OZWVkZWQgdG8gcHJlcGVuZCBzdGFydC9lbmQgdGltZXMgd2l0aCBzbyB0aGV5IGNhbiBiZSBwYXJzZWQgcHJvcGVybHkgYW5kIGNhbGN1bGF0ZSBUb3RhbCBUaW1lLlxuXG5cdFx0XHR0aGlzLnNldFdpZGdldEVuYWJsZUJhc2VPblBhcmVudENvbnRyb2xsZXIoIGZvcm1faXRlbV9pbnB1dCApO1xuXG5cdFx0XHQvLyBTdGF0dXNcblx0XHRcdHdpZGdldENvbnRhaW5lciA9ICQoICc8ZGl2IGNsYXNzPVxcJ3JlY3VycmluZy10ZW1wbGF0ZS1zdGF0dXMtZGl2XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdzdGF0dXNfaWQnIH0gKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRTb3VyY2VEYXRhKCB0aGlzLnBhcmVudF9jb250cm9sbGVyLnJlY3VycmluZ19zY2hlZHVsZV9zdGF0dXNfYXJyYXkgKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggZGF0YS5zdGF0dXNfaWQgPyBkYXRhLnN0YXR1c19pZCA6IDEwICk7XG5cdFx0XHR3aWRnZXRzW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9pbnB1dDtcblxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdGlmICggdGFyZ2V0LmdldFZhbHVlKCkgPT0gMTAgKSB7XG5cdFx0XHRcdFx0d2lkZ2V0c1snYWJzZW5jZV9wb2xpY3lfaWQnXS5oaWRlKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIHRhcmdldC5nZXRWYWx1ZSgpID09IDIwICkge1xuXHRcdFx0XHRcdHdpZGdldHNbJ2Fic2VuY2VfcG9saWN5X2lkJ10uc2hvdygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXG5cdFx0XHR0aGlzLnNldFdpZGdldEVuYWJsZUJhc2VPblBhcmVudENvbnRyb2xsZXIoIGZvcm1faXRlbV9pbnB1dCApO1xuXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElBYnNlbmNlUG9saWN5LFxuXHRcdFx0XHR3aWR0aDogMTMyLFxuXHRcdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9hYnNlbmNlcycsXG5cdFx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0XHRmaWVsZDogJ2Fic2VuY2VfcG9saWN5X2lkJ1xuXHRcdFx0fSApO1xuXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuY3NzKCAncG9zaXRpb24nLCAnYWJzb2x1dGUnICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuY3NzKCAnbGVmdCcsICcwJyApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LmNzcyggJ3RvcCcsICczMHB4JyApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LmNzcyggJ3otaW5kZXgnLCAnMScgKTsgLy9Gb3Igc29tZSByZWFzb24gaWYgdGhpcyBvdmVybGFwcyB3aXRoIHRoZSBcImNoZWNrYm94ZXNcIiwgaXQgZ29lcyBiZWhpbmQgdGhhdCBkaXYgYW5kIG1ha2VzIHRoZSBkb3duIGFycm93IHVuY2xpY2thYmxlLlxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCBkYXRhLmFic2VuY2VfcG9saWN5X2lkID8gZGF0YS5hYnNlbmNlX3BvbGljeV9pZCA6ICcnICk7XG5cdFx0XHR3aWRnZXRzW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9pbnB1dDtcblx0XHRcdHRoaXMuc2V0V2lkZ2V0RW5hYmxlQmFzZU9uUGFyZW50Q29udHJvbGxlciggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblxuXHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDEgKS5hcHBlbmQoIHdpZGdldENvbnRhaW5lciApO1xuXG5cdFx0XHQvLyBzdW4gbW9uIHR1ZSB3ZWQgdGh1IGZyaSBzYXRcblx0XHRcdHZhciB3aWRnZXRDb250YWluZXIyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblx0XHRcdC8vIFN1blxuXHRcdFx0dmFyIGZvcm1faXRlbV9zdW5fY2hlY2tib3ggPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNIRUNLQk9YICk7XG5cdFx0XHRmb3JtX2l0ZW1fc3VuX2NoZWNrYm94LlRDaGVja2JveCggeyBmaWVsZDogJ3N1bicgfSApO1xuXHRcdFx0Zm9ybV9pdGVtX3N1bl9jaGVja2JveC5zZXRWYWx1ZSggZGF0YS5zdW4gPyBkYXRhLnN1biA6IGZhbHNlICk7XG5cdFx0XHR3aWRnZXRzW2Zvcm1faXRlbV9zdW5fY2hlY2tib3guZ2V0RmllbGQoKV0gPSBmb3JtX2l0ZW1fc3VuX2NoZWNrYm94O1xuXHRcdFx0d2lkZ2V0Q29udGFpbmVyMi5hcHBlbmQoIGZvcm1faXRlbV9zdW5fY2hlY2tib3ggKTtcblxuXHRcdFx0dGhpcy5zZXRXaWRnZXRFbmFibGVCYXNlT25QYXJlbnRDb250cm9sbGVyKCBmb3JtX2l0ZW1fc3VuX2NoZWNrYm94ICk7XG5cdFx0XHQvLyBNb25cblx0XHRcdHZhciBmb3JtX2l0ZW1fbW9uX2NoZWNrYm94ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DSEVDS0JPWCApO1xuXHRcdFx0Zm9ybV9pdGVtX21vbl9jaGVja2JveC5UQ2hlY2tib3goIHsgZmllbGQ6ICdtb24nIH0gKTtcblx0XHRcdGZvcm1faXRlbV9tb25fY2hlY2tib3guc2V0VmFsdWUoIGRhdGEubW9uID8gZGF0YS5tb24gOiBmYWxzZSApO1xuXHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1fbW9uX2NoZWNrYm94LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX21vbl9jaGVja2JveDtcblx0XHRcdHdpZGdldENvbnRhaW5lcjIuYXBwZW5kKCBmb3JtX2l0ZW1fbW9uX2NoZWNrYm94ICk7XG5cblx0XHRcdHRoaXMuc2V0V2lkZ2V0RW5hYmxlQmFzZU9uUGFyZW50Q29udHJvbGxlciggZm9ybV9pdGVtX21vbl9jaGVja2JveCApO1xuXHRcdFx0Ly8gVHVlXG5cdFx0XHR2YXIgZm9ybV9pdGVtX3R1ZV9jaGVja2JveCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ0hFQ0tCT1ggKTtcblx0XHRcdGZvcm1faXRlbV90dWVfY2hlY2tib3guVENoZWNrYm94KCB7IGZpZWxkOiAndHVlJyB9ICk7XG5cdFx0XHRmb3JtX2l0ZW1fdHVlX2NoZWNrYm94LnNldFZhbHVlKCBkYXRhLnR1ZSA/IGRhdGEudHVlIDogZmFsc2UgKTtcblx0XHRcdHdpZGdldHNbZm9ybV9pdGVtX3R1ZV9jaGVja2JveC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV90dWVfY2hlY2tib3g7XG5cdFx0XHR3aWRnZXRDb250YWluZXIyLmFwcGVuZCggZm9ybV9pdGVtX3R1ZV9jaGVja2JveCApO1xuXHRcdFx0dGhpcy5zZXRXaWRnZXRFbmFibGVCYXNlT25QYXJlbnRDb250cm9sbGVyKCBmb3JtX2l0ZW1fdHVlX2NoZWNrYm94ICk7XG5cdFx0XHQvLyBXZWRcblx0XHRcdHZhciBmb3JtX2l0ZW1fd2VkX2NoZWNrYm94ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DSEVDS0JPWCApO1xuXHRcdFx0Zm9ybV9pdGVtX3dlZF9jaGVja2JveC5UQ2hlY2tib3goIHsgZmllbGQ6ICd3ZWQnIH0gKTtcblx0XHRcdGZvcm1faXRlbV93ZWRfY2hlY2tib3guc2V0VmFsdWUoIGRhdGEud2VkID8gZGF0YS53ZWQgOiBmYWxzZSApO1xuXHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1fd2VkX2NoZWNrYm94LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX3dlZF9jaGVja2JveDtcblx0XHRcdHdpZGdldENvbnRhaW5lcjIuYXBwZW5kKCBmb3JtX2l0ZW1fd2VkX2NoZWNrYm94ICk7XG5cdFx0XHR0aGlzLnNldFdpZGdldEVuYWJsZUJhc2VPblBhcmVudENvbnRyb2xsZXIoIGZvcm1faXRlbV93ZWRfY2hlY2tib3ggKTtcblx0XHRcdC8vIFRodVxuXHRcdFx0dmFyIGZvcm1faXRlbV90aHVfY2hlY2tib3ggPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNIRUNLQk9YICk7XG5cdFx0XHRmb3JtX2l0ZW1fdGh1X2NoZWNrYm94LlRDaGVja2JveCggeyBmaWVsZDogJ3RodScgfSApO1xuXHRcdFx0Zm9ybV9pdGVtX3RodV9jaGVja2JveC5zZXRWYWx1ZSggZGF0YS50aHUgPyBkYXRhLnRodSA6IGZhbHNlICk7XG5cdFx0XHR3aWRnZXRzW2Zvcm1faXRlbV90aHVfY2hlY2tib3guZ2V0RmllbGQoKV0gPSBmb3JtX2l0ZW1fdGh1X2NoZWNrYm94O1xuXHRcdFx0d2lkZ2V0Q29udGFpbmVyMi5hcHBlbmQoIGZvcm1faXRlbV90aHVfY2hlY2tib3ggKTtcblx0XHRcdHRoaXMuc2V0V2lkZ2V0RW5hYmxlQmFzZU9uUGFyZW50Q29udHJvbGxlciggZm9ybV9pdGVtX3RodV9jaGVja2JveCApO1xuXHRcdFx0Ly8gRnJpXG5cdFx0XHR2YXIgZm9ybV9pdGVtX2ZyaV9jaGVja2JveCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ0hFQ0tCT1ggKTtcblx0XHRcdGZvcm1faXRlbV9mcmlfY2hlY2tib3guVENoZWNrYm94KCB7IGZpZWxkOiAnZnJpJyB9ICk7XG5cdFx0XHRmb3JtX2l0ZW1fZnJpX2NoZWNrYm94LnNldFZhbHVlKCBkYXRhLmZyaSA/IGRhdGEuZnJpIDogZmFsc2UgKTtcblx0XHRcdHdpZGdldHNbZm9ybV9pdGVtX2ZyaV9jaGVja2JveC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9mcmlfY2hlY2tib3g7XG5cdFx0XHR3aWRnZXRDb250YWluZXIyLmFwcGVuZCggZm9ybV9pdGVtX2ZyaV9jaGVja2JveCApO1xuXHRcdFx0dGhpcy5zZXRXaWRnZXRFbmFibGVCYXNlT25QYXJlbnRDb250cm9sbGVyKCBmb3JtX2l0ZW1fZnJpX2NoZWNrYm94ICk7XG5cdFx0XHQvLyBTYXRcblx0XHRcdHZhciBmb3JtX2l0ZW1fc2F0X2NoZWNrYm94ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DSEVDS0JPWCApO1xuXHRcdFx0Zm9ybV9pdGVtX3NhdF9jaGVja2JveC5UQ2hlY2tib3goIHsgZmllbGQ6ICdzYXQnIH0gKTtcblx0XHRcdGZvcm1faXRlbV9zYXRfY2hlY2tib3guc2V0VmFsdWUoIGRhdGEuc2F0ID8gZGF0YS5zYXQgOiBmYWxzZSApO1xuXHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1fc2F0X2NoZWNrYm94LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX3NhdF9jaGVja2JveDtcblx0XHRcdHdpZGdldENvbnRhaW5lcjIuYXBwZW5kKCBmb3JtX2l0ZW1fc2F0X2NoZWNrYm94ICk7XG5cdFx0XHR0aGlzLnNldFdpZGdldEVuYWJsZUJhc2VPblBhcmVudENvbnRyb2xsZXIoIGZvcm1faXRlbV9zYXRfY2hlY2tib3ggKTtcblxuXHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDIgKS5hcHBlbmQoIHdpZGdldENvbnRhaW5lcjIgKTtcblxuXHRcdFx0Ly8gU2hpZnQgVGltZVxuXHRcdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0dmFyIGRpdkNvbnRhaW5lcjEgPSAkKCAnPGRpdiBzdHlsZT1cXCd0ZXh0LWFsaWduOiBsZWZ0OyBcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHR2YXIgbGFiZWxfMSA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtcmlnaHQtbGFiZWwgcmVjdXJyaW5nLXRlbXBsYXRlLXdpZGdldC1yaWdodC1sYWJlbFxcJyBzdHlsZT1cXCdkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiAyOHB4OyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcJz4gJyArICQuaTE4bi5fKCAnSW4nICkgKyAnIDwvc3Bhbj4nICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRJTUVfUElDS0VSICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRpbWVQaWNrZXIoIHsgZmllbGQ6ICdzdGFydF90aW1lJyB9ICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0VmFsdWUoIGRhdGEuc3RhcnRfdGltZSA/IGRhdGEuc3RhcnRfdGltZSA6ICcnICk7XG5cblx0XHRcdGZvcm1faXRlbV9pbnB1dC5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXG5cdFx0XHRcdHZhciByb3dzX3dpZGdldHMgPSAkdGhpcy5yb3dzX3dpZGdldHNfYXJyYXlbdGFyZ2V0LnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLmluZGV4KCkgLSAxXTtcblxuXHRcdFx0XHQkdGhpcy5wYXJlbnRfY29udHJvbGxlci5vblJvd0NoYW5nZXMoIHJvd3Nfd2lkZ2V0cyApO1xuXHRcdFx0fSApO1xuXG5cdFx0XHR3aWRnZXRzW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpICsgcm93X2lkXSA9IGZvcm1faXRlbV9pbnB1dDtcblx0XHRcdHRoaXMucGFyZW50X2NvbnRyb2xsZXIuZWRpdF92aWV3X3VpX3ZhbGlkYXRpb25fZmllbGRfZGljW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpICsgcm93X2lkXSA9IGZvcm1faXRlbV9pbnB1dDtcblxuXHRcdFx0ZGl2Q29udGFpbmVyMS5hcHBlbmQoIGxhYmVsXzEgKTtcblx0XHRcdGRpdkNvbnRhaW5lcjEuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblxuXHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZGl2Q29udGFpbmVyMSApO1xuXHRcdFx0dGhpcy5zZXRXaWRnZXRFbmFibGVCYXNlT25QYXJlbnRDb250cm9sbGVyKCBmb3JtX2l0ZW1faW5wdXQgKTtcblxuXHRcdFx0dmFyIGRpdkNvbnRhaW5lcjIgPSAkKCAnPGRpdiBzdHlsZT1cXCd0ZXh0LWFsaWduOiBsZWZ0OyBtYXJnaW4tdG9wOiA1cHg7XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0dmFyIGxhYmVsXzIgPSAkKCAnPHNwYW4gY2xhc3M9XFwnd2lkZ2V0LXJpZ2h0LWxhYmVsIHJlY3VycmluZy10ZW1wbGF0ZS13aWRnZXQtcmlnaHQtbGFiZWxcXCcgc3R5bGU9XFwnZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogMjhweDsgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXCcgPiAnICsgJC5pMThuLl8oICdPdXQnICkgKyAnIDwvc3Bhbj4nICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRJTUVfUElDS0VSICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuVFRpbWVQaWNrZXIoIHsgZmllbGQ6ICdlbmRfdGltZScgfSApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCBkYXRhLmVuZF90aW1lID8gZGF0YS5lbmRfdGltZSA6ICcnICk7XG5cblx0XHRcdGZvcm1faXRlbV9pbnB1dC5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHR2YXIgcm93c193aWRnZXRzID0gJHRoaXMucm93c193aWRnZXRzX2FycmF5W3RhcmdldC5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5pbmRleCgpIC0gMV07XG5cblx0XHRcdFx0JHRoaXMucGFyZW50X2NvbnRyb2xsZXIub25Sb3dDaGFuZ2VzKCByb3dzX3dpZGdldHMgKTtcblx0XHRcdH0gKTtcblxuXHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1faW5wdXQuZ2V0RmllbGQoKSArIHJvd19pZF0gPSBmb3JtX2l0ZW1faW5wdXQ7XG5cdFx0XHR0aGlzLnBhcmVudF9jb250cm9sbGVyLmVkaXRfdmlld191aV92YWxpZGF0aW9uX2ZpZWxkX2RpY1tmb3JtX2l0ZW1faW5wdXQuZ2V0RmllbGQoKSArIHJvd19pZF0gPSBmb3JtX2l0ZW1faW5wdXQ7XG5cblx0XHRcdGRpdkNvbnRhaW5lcjIuYXBwZW5kKCBsYWJlbF8yICk7XG5cdFx0XHRkaXZDb250YWluZXIyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGRpdkNvbnRhaW5lcjIgKTtcblxuXHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDMgKS5hcHBlbmQoIHdpZGdldENvbnRhaW5lciApO1xuXHRcdFx0dGhpcy5zZXRXaWRnZXRFbmFibGVCYXNlT25QYXJlbnRDb250cm9sbGVyKCBmb3JtX2l0ZW1faW5wdXQgKTtcblxuXHRcdFx0Ly8gVG90YWxcblx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAndG90YWxfdGltZScgfSApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCBkYXRhLnRvdGFsX3RpbWUgPyBHbG9iYWwuZ2V0VGltZVVuaXQoIGRhdGEudG90YWxfdGltZSApIDogJycgKTsgLy9cblx0XHRcdHdpZGdldHNbZm9ybV9pdGVtX2lucHV0LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX2lucHV0O1xuXG5cdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggNCApLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHRcdC8vIFNjaGVkdWxlIFBvbGljeVxuXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElTY2hlZHVsZVBvbGljeSxcblx0XHRcdFx0d2lkdGg6IDgwLFxuXHRcdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9zY2hlZHVsZScsXG5cdFx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0XHRmaWVsZDogJ3NjaGVkdWxlX3BvbGljeV9pZCdcblx0XHRcdH0gKTtcblxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCBkYXRhLnNjaGVkdWxlX3BvbGljeV9pZCA/IGRhdGEuc2NoZWR1bGVfcG9saWN5X2lkIDogJycgKTtcblx0XHRcdHdpZGdldHNbZm9ybV9pdGVtX2lucHV0LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX2lucHV0O1xuXG5cdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggNSApLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHRcdGZvcm1faXRlbV9pbnB1dC5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHR2YXIgcm93c193aWRnZXRzID0gJHRoaXMucm93c193aWRnZXRzX2FycmF5W3RhcmdldC5wYXJlbnQoKS5wYXJlbnQoKS5pbmRleCgpIC0gMV07XG5cblx0XHRcdFx0JHRoaXMucGFyZW50X2NvbnRyb2xsZXIub25Sb3dDaGFuZ2VzKCByb3dzX3dpZGdldHMgKTtcblx0XHRcdH0gKTtcblx0XHRcdHRoaXMuc2V0V2lkZ2V0RW5hYmxlQmFzZU9uUGFyZW50Q29udHJvbGxlciggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHRcdC8vIEJyYW5jaCAvIERlcGFydG1lbnRcblxuXHRcdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94IHJlY3VycmluZy10ZW1wbGF0ZS13aWRnZXQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHRkaXZDb250YWluZXIxID0gJCggJzxkaXY+PC9kaXY+JyApO1xuXG5cdFx0XHRsYWJlbF8xID0gJCggJzxzcGFuIGNsYXNzPVxcJ3dpZGdldC1yaWdodC1sYWJlbFxcJyBzdHlsZT1cXCdmbG9hdDogbGVmdDsgaGVpZ2h0OiAyNHB4OyBsaW5lLWhlaWdodDogMjRweDsgbWluLXdpZHRoOiA3NHB4O1xcJz4gJyArICQuaTE4bi5fKCAnQnJhbmNoJyApICsgJyA8L3NwYW4+JyApO1xuXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElCcmFuY2gsXG5cdFx0XHRcdHdpZHRoOiA4MCxcblx0XHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfYnJhbmNoJyxcblx0XHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0XHRzZXRfYW55OiB0cnVlLFxuXHRcdFx0XHRmaWVsZDogJ2JyYW5jaF9pZCcsXG5cdFx0XHRcdGN1c3RvbV9maXJzdF9sYWJlbDogR2xvYmFsLmRlZmF1bHRfaXRlbVxuXHRcdFx0fSApO1xuXG5cdFx0XHRpZiAoIGRhdGEuYnJhbmNoX2lkLnRvVXBwZXJDYXNlKCkgPT09IFRUVVVJRC5ub3RfZXhpc3RfaWQudG9VcHBlckNhc2UoKSApIHtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldF9kZWZhdWx0X3ZhbHVlID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggZGF0YS5icmFuY2hfaWQgPyBkYXRhLmJyYW5jaF9pZCA6ICcnICk7XG5cdFx0XHR9XG5cdFx0XHR3aWRnZXRzW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9pbnB1dDtcblxuXHRcdFx0ZGl2Q29udGFpbmVyMS5hcHBlbmQoIGxhYmVsXzEgKTtcblx0XHRcdGRpdkNvbnRhaW5lcjEuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblxuXHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZGl2Q29udGFpbmVyMSApO1xuXG5cdFx0XHRkaXZDb250YWluZXIyID0gJCggJzxkaXYgc3R5bGU9XFwnbWFyZ2luLXRvcDogNXB4OyBmbG9hdDogbGVmdFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdGxhYmVsXzIgPSAkKCAnPHNwYW4gY2xhc3M9XFwnd2lkZ2V0LXJpZ2h0LWxhYmVsXFwnIHN0eWxlPVxcJ2Zsb2F0OiBsZWZ0OyBoZWlnaHQ6IDI0cHg7IGxpbmUtaGVpZ2h0OiAyNHB4OyBtaW4td2lkdGg6IDc0cHg7XFwnPiAnICsgJC5pMThuLl8oICdEZXBhcnRtZW50JyApICsgJyA8L3NwYW4+JyApO1xuXG5cdFx0XHR0aGlzLnNldFdpZGdldEVuYWJsZUJhc2VPblBhcmVudENvbnRyb2xsZXIoIGZvcm1faXRlbV9pbnB1dCApO1xuXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElEZXBhcnRtZW50LFxuXHRcdFx0XHR3aWR0aDogODAsXG5cdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2RlcGFydG1lbnQnLFxuXHRcdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRcdHNldF9hbnk6IHRydWUsXG5cdFx0XHRcdGZpZWxkOiAnZGVwYXJ0bWVudF9pZCcsXG5cdFx0XHRcdGN1c3RvbV9maXJzdF9sYWJlbDogR2xvYmFsLmRlZmF1bHRfaXRlbVxuXHRcdFx0fSApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCAoIGRhdGEuZGVwYXJ0bWVudF9pZCApID8gZGF0YS5kZXBhcnRtZW50X2lkIDogJycgKTtcblx0XHRcdHdpZGdldHNbZm9ybV9pdGVtX2lucHV0LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX2lucHV0O1xuXG5cdFx0XHRkaXZDb250YWluZXIyLmFwcGVuZCggbGFiZWxfMiApO1xuXHRcdFx0ZGl2Q29udGFpbmVyMi5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBkaXZDb250YWluZXIyICk7XG5cblx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCA2ICkuYXBwZW5kKCB3aWRnZXRDb250YWluZXIgKTtcblx0XHRcdHRoaXMuc2V0V2lkZ2V0RW5hYmxlQmFzZU9uUGFyZW50Q29udHJvbGxlciggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHRcdC8vIEpvYi9UYXNrL1B1bmNoIFRhZ1xuXG5cdFx0XHRpZiAoICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSApIHtcblxuXHRcdFx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3ggcmVjdXJyaW5nLXRlbXBsYXRlLXdpZGdldC1oLWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdFx0ZGl2Q29udGFpbmVyMSA9ICQoICc8ZGl2PjwvZGl2PicgKTtcblxuXHRcdFx0XHRsYWJlbF8xID0gJCggJzxzcGFuIGNsYXNzPVxcJ3dpZGdldC1yaWdodC1sYWJlbFxcJyBzdHlsZT1cXCdmbG9hdDogbGVmdDsgaGVpZ2h0OiAyNHB4OyBsaW5lLWhlaWdodDogMjRweDsgbWluLXdpZHRoOiAzMnB4O1xcJz4gJyArICQuaTE4bi5fKCAnSm9iJyApICsgJyA8L3NwYW4+JyApO1xuXG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElKb2IsXG5cdFx0XHRcdFx0d2lkdGg6IDgwLFxuXHRcdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfam9iJyxcblx0XHRcdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRcdFx0c2V0X2FueTogdHJ1ZSxcblx0XHRcdFx0XHRmaWVsZDogJ2pvYl9pZCcsXG5cdFx0XHRcdFx0Y3VzdG9tX2ZpcnN0X2xhYmVsOiBHbG9iYWwuZGVmYXVsdF9pdGVtXG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCBkYXRhLmpvYl9pZCA/IGRhdGEuam9iX2lkIDogJycgKTtcblx0XHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1faW5wdXQuZ2V0RmllbGQoKV0gPSBmb3JtX2l0ZW1faW5wdXQ7XG5cblx0XHRcdFx0ZGl2Q29udGFpbmVyMS5hcHBlbmQoIGxhYmVsXzEgKTtcblx0XHRcdFx0ZGl2Q29udGFpbmVyMS5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXG5cdFx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGRpdkNvbnRhaW5lcjEgKTtcblxuXHRcdFx0XHRkaXZDb250YWluZXIyID0gJCggJzxkaXYgc3R5bGU9XFwnbWFyZ2luLXRvcDogNXB4OyBmbG9hdDogbGVmdFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdFx0bGFiZWxfMiA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtcmlnaHQtbGFiZWxcXCcgc3R5bGU9XFwnZmxvYXQ6IGxlZnQ7IGhlaWdodDogMjRweDsgbGluZS1oZWlnaHQ6IDI0cHg7IG1pbi13aWR0aDogMzJweDtcXCc+ICcgKyAkLmkxOG4uXyggJ1Rhc2snICkgKyAnIDwvc3Bhbj4nICk7XG5cdFx0XHRcdHRoaXMuc2V0V2lkZ2V0RW5hYmxlQmFzZU9uUGFyZW50Q29udHJvbGxlciggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSUpvYkl0ZW0sXG5cdFx0XHRcdFx0d2lkdGg6IDgwLFxuXHRcdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfam9iX2l0ZW0nLFxuXHRcdFx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdFx0XHRzZXRfYW55OiB0cnVlLFxuXHRcdFx0XHRcdGZpZWxkOiAnam9iX2l0ZW1faWQnLFxuXHRcdFx0XHRcdGN1c3RvbV9maXJzdF9sYWJlbDogR2xvYmFsLmRlZmF1bHRfaXRlbVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggZGF0YS5qb2JfaXRlbV9pZCA/IGRhdGEuam9iX2l0ZW1faWQgOiAnJyApO1xuXHRcdFx0XHR3aWRnZXRzW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9pbnB1dDtcblxuXHRcdFx0XHRkaXZDb250YWluZXIyLmFwcGVuZCggbGFiZWxfMiApO1xuXHRcdFx0XHRkaXZDb250YWluZXIyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZGl2Q29udGFpbmVyMiApO1xuXG5cdFx0XHRcdHZhciBkaXZDb250YWluZXIzID0gJCggJzxkaXYgc3R5bGU9XFwnbWFyZ2luLXRvcDogNXB4OyBmbG9hdDogbGVmdFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdFx0dmFyIGxhYmVsXzMgPSAkKCAnPHNwYW4gY2xhc3M9XFwnd2lkZ2V0LXJpZ2h0LWxhYmVsXFwnIHN0eWxlPVxcJ2Zsb2F0OiBsZWZ0OyBoZWlnaHQ6IDI0cHg7IGxpbmUtaGVpZ2h0OiAyNHB4OyBtaW4td2lkdGg6IDMycHg7XFwnPiAnICsgJC5pMThuLl8oICdUYWdzJyApICsgJyA8L3NwYW4+JyApO1xuXHRcdFx0XHR0aGlzLnNldFdpZGdldEVuYWJsZUJhc2VPblBhcmVudENvbnRyb2xsZXIoIGZvcm1faXRlbV9pbnB1dCApO1xuXG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElQdW5jaFRhZyxcblx0XHRcdFx0XHR3aWR0aDogODAsXG5cdFx0XHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiB0cnVlLFxuXHRcdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3B1bmNoX3RhZycsXG5cdFx0XHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0XHRcdHNldF9hbnk6IHRydWUsXG5cdFx0XHRcdFx0c2V0UmVhbFZhbHVlQ2FsbEJhY2s6ICggKCBwdW5jaF90YWdzICkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKCBwdW5jaF90YWdzICkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnNldFB1bmNoVGFnUXVpY2tTZWFyY2hNYW51YWxJZHMoIHB1bmNoX3RhZ3MgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICksXG5cdFx0XHRcdFx0ZmllbGQ6ICdwdW5jaF90YWdfaWQnLFxuXHRcdFx0XHRcdGN1c3RvbV9maXJzdF9sYWJlbDogR2xvYmFsLmRlZmF1bHRfaXRlbVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggZGF0YS5wdW5jaF90YWdfaWQgPyBkYXRhLnB1bmNoX3RhZ19pZCA6ICcnICk7XG5cdFx0XHRcdHdpZGdldHNbZm9ybV9pdGVtX2lucHV0LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX2lucHV0O1xuXG5cdFx0XHRcdGRpdkNvbnRhaW5lcjMuYXBwZW5kKCBsYWJlbF8zICk7XG5cdFx0XHRcdGRpdkNvbnRhaW5lcjMuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblxuXHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBkaXZDb250YWluZXIzICk7XG5cblx0XHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDcgKS5hcHBlbmQoIHdpZGdldENvbnRhaW5lciApO1xuXHRcdFx0XHR0aGlzLnNldFdpZGdldEVuYWJsZUJhc2VPblBhcmVudENvbnRyb2xsZXIoIGZvcm1faXRlbV9pbnB1dCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMTUgKSB7XG5cdFx0XHRcdC8vIE9wZW4gU2hpZnQgTXVsdGlwbGllclxuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdvcGVuX3NoaWZ0X211bHRpcGxpZXInLCB3aWR0aDogMjAgfSApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0VmFsdWUoIGRhdGEub3Blbl9zaGlmdF9tdWx0aXBsaWVyID8gZGF0YS5vcGVuX3NoaWZ0X211bHRpcGxpZXIgOiAxICk7XG5cdFx0XHRcdHdpZGdldHNbZm9ybV9pdGVtX2lucHV0LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX2lucHV0O1xuXG5cdFx0XHRcdGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPD0gMTUgKSB7XG5cdFx0XHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDcgKS5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCA4ICkuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuc2V0V2lkZ2V0RW5hYmxlQmFzZU9uUGFyZW50Q29udHJvbGxlciggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggdHlwZW9mIGluZGV4ICE9ICd1bmRlZmluZWQnICkge1xuXG5cdFx0XHRcdHJvdy5pbnNlcnRBZnRlciggJCggcmVuZGVyICkuZmluZCggJ3RyJyApLmVxKCBpbmRleCApICk7XG5cdFx0XHRcdHRoaXMucm93c193aWRnZXRzX2FycmF5LnNwbGljZSggKCBpbmRleCApLCAwLCB3aWRnZXRzICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCQoIHJlbmRlciApLmFwcGVuZCggcm93ICk7XG5cdFx0XHRcdHRoaXMucm93c193aWRnZXRzX2FycmF5LnB1c2goIHdpZGdldHMgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aGlzLnBhcmVudF9jb250cm9sbGVyLmlzX3ZpZXdpbmcgKSB7XG5cdFx0XHRcdHJvdy5maW5kKCAnLmNvbnRyb2wtaWNvbicgKS5oaWRlKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggd2lkZ2V0cy5zdGF0dXNfaWQuZ2V0VmFsdWUoKSA9PSAxMCApIHtcblx0XHRcdFx0d2lkZ2V0cy5hYnNlbmNlX3BvbGljeV9pZC5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB3aWRnZXRzLnN0YXR1c19pZC5nZXRWYWx1ZSgpID09IDIwICkge1xuXHRcdFx0XHR3aWRnZXRzLmFic2VuY2VfcG9saWN5X2lkLmNzcyggJ2Rpc3BsYXknLCAnYmxvY2snICk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYWRkSWNvbnNFdmVudCggcm93ICk7IC8vQmluZCBldmVudCB0byBhZGQgYW5kIG1pbnVzIGljb25cblx0XHRcdHRoaXMucmVtb3ZlTGFzdFJvd0xpbmUoKTtcblx0XHR9XG5cdH1cblxuXHRvblJvd0NoYW5nZXMoIHJvd193aWRnZXRzICkge1xuXHRcdHZhciByZWN1cnJpbmdfc2NoZWR1bGVfdGVtcGxhdGVfaWQgPSByb3dfd2lkZ2V0cy53ZWVrLmF0dHIoICdyZWN1cnJpbmdfc2NoZWR1bGVfdGVtcGxhdGVfaWQnICk7XG5cdFx0dmFyIGRhdGVfc3RhbXAgPSByb3dfd2lkZ2V0cy53ZWVrLmF0dHIoICdkYXRlX3N0YW1wJyApO1xuXG5cdFx0aWYgKCByZWN1cnJpbmdfc2NoZWR1bGVfdGVtcGxhdGVfaWQgKSB7XG5cdFx0XHR2YXIgc3RhcnRUaW1lID0gZGF0ZV9zdGFtcCArJyAnKyByb3dfd2lkZ2V0c1snc3RhcnRfdGltZScgKyByZWN1cnJpbmdfc2NoZWR1bGVfdGVtcGxhdGVfaWRdLmdldFZhbHVlKCk7XG5cdFx0XHR2YXIgZW5kVGltZSA9IGRhdGVfc3RhbXAgKycgJysgcm93X3dpZGdldHNbJ2VuZF90aW1lJyArIHJlY3VycmluZ19zY2hlZHVsZV90ZW1wbGF0ZV9pZF0uZ2V0VmFsdWUoKTtcblx0XHRcdHZhciBzY2hlZHVsZVBvbGljeUlkID0gcm93X3dpZGdldHMuc2NoZWR1bGVfcG9saWN5X2lkLmdldFZhbHVlKCk7XG5cblx0XHRcdGlmICggc3RhcnRUaW1lICE9PSAnJyAmJiBlbmRUaW1lICE9PSAnJyAmJiBzY2hlZHVsZVBvbGljeUlkICE9PSAnJyApIHtcblx0XHRcdFx0dmFyIHJlc3VsdCA9IHRoaXMuc2NoZWR1bGVfYXBpLmdldFNjaGVkdWxlVG90YWxUaW1lKCBzdGFydFRpbWUsIGVuZFRpbWUsIHNjaGVkdWxlUG9saWN5SWQsIHsgYXN5bmM6IGZhbHNlIH0gKTtcblx0XHRcdFx0aWYgKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0dmFyIHRvdGFsX3RpbWUgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cblx0XHRcdFx0XHRyb3dfd2lkZ2V0cy50b3RhbF90aW1lLnNldFZhbHVlKCBHbG9iYWwuZ2V0VGltZVVuaXQoIHRvdGFsX3RpbWUgKSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMudmFsaWRhdGUoKTtcblx0XHR9XG5cdH1cblxuXHRpbnNpZGVFZGl0b3JHZXRWYWx1ZSggY3VycmVudF9lZGl0X2l0ZW1faWQgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMucm93c193aWRnZXRzX2FycmF5Lmxlbmd0aDtcblxuXHRcdHZhciByZXN1bHQgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0dmFyIHJvdyA9IHRoaXMucm93c193aWRnZXRzX2FycmF5W2ldO1xuXG5cdFx0XHR2YXIgcmVjdXJyaW5nX3NjaGVkdWxlX3RlbXBsYXRlX2lkID0gcm93LndlZWsuYXR0ciggJ3JlY3VycmluZ19zY2hlZHVsZV90ZW1wbGF0ZV9pZCcgKTtcblx0XHRcdHZhciBkYXRlX3N0YW1wID0gcm93LndlZWsuYXR0ciggJ2RhdGVfc3RhbXAnICk7XG5cblx0XHRcdGlmICggcmVjdXJyaW5nX3NjaGVkdWxlX3RlbXBsYXRlX2lkICkge1xuXHRcdFx0XHR2YXIgZGF0YSA9IHtcblx0XHRcdFx0XHRpZDogcmVjdXJyaW5nX3NjaGVkdWxlX3RlbXBsYXRlX2lkLFxuXG5cdFx0XHRcdFx0d2Vlazogcm93LndlZWsuZ2V0VmFsdWUoKSxcblx0XHRcdFx0XHRzdGF0dXNfaWQ6IHJvdy5zdGF0dXNfaWQuZ2V0VmFsdWUoKSxcblxuXHRcdFx0XHRcdG1vbjogcm93Lm1vbi5nZXRWYWx1ZSgpLFxuXHRcdFx0XHRcdHR1ZTogcm93LnR1ZS5nZXRWYWx1ZSgpLFxuXHRcdFx0XHRcdHdlZDogcm93LndlZC5nZXRWYWx1ZSgpLFxuXHRcdFx0XHRcdHRodTogcm93LnRodS5nZXRWYWx1ZSgpLFxuXHRcdFx0XHRcdGZyaTogcm93LmZyaS5nZXRWYWx1ZSgpLFxuXHRcdFx0XHRcdHNhdDogcm93LnNhdC5nZXRWYWx1ZSgpLFxuXHRcdFx0XHRcdHN1bjogcm93LnN1bi5nZXRWYWx1ZSgpLFxuXG5cdFx0XHRcdFx0ZGF0ZV9zdGFtcDogZGF0ZV9zdGFtcCxcblx0XHRcdFx0XHRzdGFydF90aW1lOiByb3dbJ3N0YXJ0X3RpbWUnICsgcmVjdXJyaW5nX3NjaGVkdWxlX3RlbXBsYXRlX2lkXS5nZXRWYWx1ZSgpLFxuXHRcdFx0XHRcdGVuZF90aW1lOiByb3dbJ2VuZF90aW1lJyArIHJlY3VycmluZ19zY2hlZHVsZV90ZW1wbGF0ZV9pZF0uZ2V0VmFsdWUoKSxcblx0XHRcdFx0XHR0b3RhbF90aW1lOiBudWxsLFxuXG5cdFx0XHRcdFx0YnJhbmNoX2lkOiByb3cuYnJhbmNoX2lkLmdldFZhbHVlKCksXG5cdFx0XHRcdFx0ZGVwYXJ0bWVudF9pZDogcm93LmRlcGFydG1lbnRfaWQuZ2V0VmFsdWUoKSxcblxuXHRcdFx0XHRcdGFic2VuY2VfcG9saWN5X2lkOiByb3cuYWJzZW5jZV9wb2xpY3lfaWQuZ2V0VmFsdWUoKSxcblx0XHRcdFx0XHRzY2hlZHVsZV9wb2xpY3lfaWQ6IHJvdy5zY2hlZHVsZV9wb2xpY3lfaWQuZ2V0VmFsdWUoKVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMTUgKSB7XG5cdFx0XHRcdFx0ZGF0YS5vcGVuX3NoaWZ0X211bHRpcGxpZXIgPSByb3cub3Blbl9zaGlmdF9tdWx0aXBsaWVyLmdldFZhbHVlKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkge1xuXHRcdFx0XHRcdGRhdGEuam9iX2lkID0gcm93LmpvYl9pZC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdGRhdGEuam9iX2l0ZW1faWQgPSByb3cuam9iX2l0ZW1faWQuZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHRkYXRhLnB1bmNoX3RhZ19pZCA9IHJvdy5wdW5jaF90YWdfaWQuZ2V0VmFsdWUoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRhdGEucmVjdXJyaW5nX3NjaGVkdWxlX3RlbXBsYXRlX2NvbnRyb2xfaWQgPSBjdXJyZW50X2VkaXRfaXRlbV9pZDtcblx0XHRcdFx0cmVzdWx0LnB1c2goIGRhdGEgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0aW5zaWRlRWRpdG9yU2V0VmFsdWUoIHZhbCApIHtcblx0XHR2YXIgbGVuID0gdmFsLmxlbmd0aDtcblx0XHR0aGlzLnJlbW92ZUFsbFJvd3MoKTtcblxuXHRcdGlmICggbGVuID4gMCApIHtcblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHZhbFtpXSApICkge1xuXHRcdFx0XHRcdHZhciByb3cgPSB2YWxbaV07XG5cdFx0XHRcdFx0dGhpcy5hZGRSb3coIHJvdyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZ2V0RGVmYXVsdERhdGEoKTtcblx0XHR9XG5cdH1cblxuXHRpbnNpZGVFZGl0b3JSZW1vdmVSb3coIHJvdyApIHtcblx0XHR2YXIgaW5kZXggPSByb3dbMF0ucm93SW5kZXggLSAxO1xuXHRcdHZhciByZW1vdmVfaWQgPSB0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheVtpbmRleF0ud2Vlay5hdHRyKCAncmVjdXJyaW5nX3NjaGVkdWxlX3RlbXBsYXRlX2lkJyApO1xuXHRcdGlmICggVFRVVUlELmlzVVVJRCggcmVtb3ZlX2lkICkgJiYgcmVtb3ZlX2lkICE9IFRUVVVJRC56ZXJvX2lkICYmIHJlbW92ZV9pZCAhPSBUVFVVSUQubm90X2V4aXN0X2lkICkge1xuXHRcdFx0dGhpcy5kZWxldGVfaWRzLnB1c2goIHJlbW92ZV9pZCApO1xuXHRcdH1cblx0XHRyb3cucmVtb3ZlKCk7XG5cdFx0dGhpcy5yb3dzX3dpZGdldHNfYXJyYXkuc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0dGhpcy5yZW1vdmVMYXN0Um93TGluZSgpO1xuXHR9XG5cblx0dW5pZm9ybVZhcmlhYmxlKCByZWNvcmRzICkge1xuXHRcdGlmICggIXRoaXMuaXNfbWFzc19lZGl0aW5nICkge1xuXHRcdFx0cmVjb3Jkcy5yZWN1cnJpbmdfc2NoZWR1bGVfdGVtcGxhdGUgPSB0aGlzLmVkaXRvci5nZXRWYWx1ZSggdGhpcy5yZWZyZXNoX2lkICk7XG5cdFx0fVxuXHRcdHJldHVybiByZWNvcmRzO1xuXHR9XG5cblx0cmVuYW1lT2JqZWN0S2V5KCBvYmosIG9sZF9rZXksIG5ld19rZXkgKSB7XG5cdFx0aWYgKCBvbGRfa2V5ICE9PSBuZXdfa2V5ICkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBvYmosIG5ld19rZXksXG5cdFx0XHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoIG9iaiwgb2xkX2tleSApICk7XG5cdFx0XHRkZWxldGUgb2JqW29sZF9rZXldO1xuXHRcdH1cblx0fVxuXG5cdF9jb250aW51ZURvQ29weUFzTmV3KCkge1xuXHRcdHRoaXMuc2V0Q3VycmVudEVkaXRWaWV3U3RhdGUoICduZXcnICk7XG5cdFx0TG9jYWxDYWNoZURhdGEuY3VycmVudF9kb2luZ19jb250ZXh0X2FjdGlvbiA9ICdjb3B5X2FzX25ldyc7XG5cblx0XHRpZiAoIEdsb2JhbC5pc1NldCggdGhpcy5lZGl0X3ZpZXcgKSApIHtcblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuZWRpdG9yLnJvd3Nfd2lkZ2V0c19hcnJheS5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0Ly9GaXggSlMgZXhjZXB0aW9uOiBVbmNhdWdodCBUeXBlRXJyb3I6IENhbm5vdCByZWFkIHByb3BlcnR5ICdnZXRWYWx1ZScgb2YgdW5kZWZpbmVkXG5cdFx0XHRcdC8vc3RhcnRfdGltZSxlbmRfdGltZSBvYmplY3Qga2V5cyBhcmUgYXBwZW5kZWQgd2l0aCB0aGUgcmVjdXJyaW5nX3NjaGVkdWxlX3RlbXBsYXRlX2lkLCBzbyB3aGVuIGNvcHlpbmcgcmVjb3JkcyB3ZSBuZWVkIHRvIHJlbmFtZSB0aGVtIHRvIHVzZSB0aGUgbmV3IHJlY3VycmluZ19zY2hlZHVsZV90ZW1wbGF0ZV9pZFxuXHRcdFx0XHR2YXIgbmV3X3V1aWQgPSBUVFVVSUQuZ2VuZXJhdGVVVUlEKCk7XG5cdFx0XHRcdHZhciBvbGRfcmVjdXJyaW5nX3NjaGVkdWxlX3RlbXBsYXRlX2lkID0gdGhpcy5lZGl0b3Iucm93c193aWRnZXRzX2FycmF5W2ldLndlZWsuYXR0ciggJ3JlY3VycmluZ19zY2hlZHVsZV90ZW1wbGF0ZV9pZCcgKTtcblxuXHRcdFx0XHR0aGlzLnJlbmFtZU9iamVjdEtleSggdGhpcy5lZGl0b3Iucm93c193aWRnZXRzX2FycmF5W2ldLCAnc3RhcnRfdGltZScgKyBvbGRfcmVjdXJyaW5nX3NjaGVkdWxlX3RlbXBsYXRlX2lkLCAnc3RhcnRfdGltZScgKyBuZXdfdXVpZCApO1xuXHRcdFx0XHR0aGlzLnJlbmFtZU9iamVjdEtleSggdGhpcy5lZGl0b3Iucm93c193aWRnZXRzX2FycmF5W2ldLCAnZW5kX3RpbWUnICsgb2xkX3JlY3VycmluZ19zY2hlZHVsZV90ZW1wbGF0ZV9pZCwgJ2VuZF90aW1lJyArIG5ld191dWlkICk7XG5cblx0XHRcdFx0dGhpcy5lZGl0b3Iucm93c193aWRnZXRzX2FycmF5W2ldLndlZWsuYXR0ciggJ3JlY3VycmluZ19zY2hlZHVsZV90ZW1wbGF0ZV9pZCcsIG5ld191dWlkICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHN1cGVyLl9jb250aW51ZURvQ29weUFzTmV3KCk7XG5cdH1cblxuXHRvbkNvcHlBc05ld1Jlc3VsdCggcmVzdWx0ICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXG5cdFx0aWYgKCAhcmVzdWx0X2RhdGEgKSB7XG5cdFx0XHRUQWxlcnRNYW5hZ2VyLnNob3dBbGVydCggJC5pMThuLl8oICdSZWNvcmQgZG9lcyBub3QgZXhpc3QnICkgKTtcblx0XHRcdCR0aGlzLm9uQ2FuY2VsQ2xpY2soKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQkdGhpcy5vcGVuRWRpdFZpZXcoKTsgLy8gUHV0IGl0IGhlcmUgaXMgdG8gYXZvaWQgaWYgdGhlIHNlbGVjdGVkIG9uZSBpcyBub3QgZXhpc3RlZCBpbiBkYXRhIG9yIGhhdmUgZGVsZXRlZCBieSBvdGhlciBwcmFncmFtLiBpbiB0aGlzIGNhc2UsIHRoZSBlZGl0IHZpZXcgc2hvdWxkIG5vdCBiZSBvcGVuZC5cblxuXHRcdHJlc3VsdF9kYXRhID0gcmVzdWx0X2RhdGFbMF07XG5cdFx0dGhpcy5jb3BpZWRfcmVjb3JkX2lkID0gcmVzdWx0X2RhdGEuaWQ7XG5cdFx0cmVzdWx0X2RhdGEuaWQgPSAnJztcblx0XHRpZiAoICR0aGlzLnN1Yl92aWV3X21vZGUgJiYgJHRoaXMucGFyZW50X2tleSApIHtcblx0XHRcdHJlc3VsdF9kYXRhWyR0aGlzLnBhcmVudF9rZXldID0gJHRoaXMucGFyZW50X3ZhbHVlO1xuXHRcdH1cblxuXHRcdCR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgPSByZXN1bHRfZGF0YTtcblx0XHQkdGhpcy5pbml0RWRpdFZpZXcoKTtcblx0fVxuXG5cdGJ1aWxkU2VhcmNoRmllbGRzKCkge1xuXG5cdFx0c3VwZXIuYnVpbGRTZWFyY2hGaWVsZHMoKTtcblx0XHR0aGlzLnNlYXJjaF9maWVsZHMgPSBbXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdOYW1lJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDEsXG5cdFx0XHRcdGZpZWxkOiAnbmFtZScsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVRcblx0XHRcdH0gKSxcblxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0Rlc2NyaXB0aW9uJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDEsXG5cdFx0XHRcdGZpZWxkOiAnZGVzY3JpcHRpb24nLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdUZW1wbGF0ZScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAxLFxuXHRcdFx0XHRmaWVsZDogJ2lkJyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfcmVjdXJyaW5nX3RlbXBsYXRlX2NvbnRyb2wnLFxuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVJlY3VycmluZ1NjaGVkdWxlVGVtcGxhdGVDb250cm9sLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnU2NoZWR1bGUgUG9saWN5JyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGZpZWxkOiAnc2NoZWR1bGVfcG9saWN5X2lkJyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfc2NoZWR1bGUnLFxuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVNjaGVkdWxlUG9saWN5LFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnQ3JlYXRlZCBCeScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAyLFxuXHRcdFx0XHRmaWVsZDogJ2NyZWF0ZWRfYnknLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF91c2VyJyxcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElVc2VyLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnVXBkYXRlZCBCeScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAyLFxuXHRcdFx0XHRmaWVsZDogJ3VwZGF0ZWRfYnknLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF91c2VyJyxcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElVc2VyLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApXG5cdFx0XTtcblx0fVxuXG5cdGdldEN1c3RvbUNvbnRleHRNZW51TW9kZWwoKSB7XG5cdFx0dmFyIGNvbnRleHRfbWVudV9tb2RlbCA9IHtcblx0XHRcdGV4Y2x1ZGU6IFtdLFxuXHRcdFx0aW5jbHVkZTogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnSnVtcCBUbycgKSxcblx0XHRcdFx0XHRpZDogJ2p1bXBfdG9faGVhZGVyJyxcblx0XHRcdFx0XHRtZW51X2FsaWduOiAncmlnaHQnLFxuXHRcdFx0XHRcdGFjdGlvbl9ncm91cDogJ2p1bXBfdG8nLFxuXHRcdFx0XHRcdGFjdGlvbl9ncm91cF9oZWFkZXI6IHRydWUsXG5cdFx0XHRcdFx0cGVybWlzc2lvbl9yZXN1bHQ6IGZhbHNlIC8vIHRvIGhpZGUgaXQgaW4gbGVnYWN5IGNvbnRleHQgbWVudSBhbmQgYXZvaWQgZXJyb3JzIGluIGxlZ2FjeSBwYXJzZXJzLlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnUmVjdXJyaW5nIFNjaGVkdWxlcycgKSxcblx0XHRcdFx0XHRpZDogJ3JlY3VycmluZ19zY2hlZHVsZScsXG5cdFx0XHRcdFx0bWVudV9hbGlnbjogJ3JpZ2h0Jyxcblx0XHRcdFx0XHRhY3Rpb25fZ3JvdXA6ICdqdW1wX3RvJyxcblx0XHRcdFx0XHRncm91cDogJ25hdmlnYXRpb24nLFxuXHRcdFx0XHR9XVxuXHRcdH07XG5cblx0XHRyZXR1cm4gY29udGV4dF9tZW51X21vZGVsO1xuXHR9XG5cblx0b25DdXN0b21Db250ZXh0Q2xpY2soIGlkICkge1xuXHRcdHN3aXRjaCAoIGlkICkge1xuXHRcdFx0Y2FzZSAncmVjdXJyaW5nX3NjaGVkdWxlJzpcblx0XHRcdFx0dGhpcy5vbk5hdmlnYXRpb25DbGljayggaWQgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0b25OYXZpZ2F0aW9uQ2xpY2soIGljb25OYW1lICkge1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHZhciBncmlkX3NlbGVjdGVkX2lkX2FycmF5O1xuXG5cdFx0dmFyIGZpbHRlciA9IHsgZmlsdGVyX2RhdGE6IHt9IH07XG5cblx0XHR2YXIgcmVjdXJyaW5nX3NjaGVkdWxlX3RlbXBsYXRlX2NvbnRyb2xfaWRzID0gW107XG5cblx0XHRpZiAoICR0aGlzLmVkaXRfdmlldyAmJiAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkge1xuXHRcdFx0cmVjdXJyaW5nX3NjaGVkdWxlX3RlbXBsYXRlX2NvbnRyb2xfaWRzLnB1c2goICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Z3JpZF9zZWxlY3RlZF9pZF9hcnJheSA9IHRoaXMuZ2V0R3JpZFNlbGVjdElkQXJyYXkoKTtcblx0XHRcdCQuZWFjaCggZ3JpZF9zZWxlY3RlZF9pZF9hcnJheSwgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIGdyaWRfc2VsZWN0ZWRfcm93ID0gJHRoaXMuZ2V0UmVjb3JkRnJvbUdyaWRCeUlkKCB2YWx1ZSApO1xuXHRcdFx0XHRyZWN1cnJpbmdfc2NoZWR1bGVfdGVtcGxhdGVfY29udHJvbF9pZHMucHVzaCggZ3JpZF9zZWxlY3RlZF9yb3cuaWQgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRmaWx0ZXIuZmlsdGVyX2RhdGEucmVjdXJyaW5nX3NjaGVkdWxlX3RlbXBsYXRlX2NvbnRyb2xfaWQgPSByZWN1cnJpbmdfc2NoZWR1bGVfdGVtcGxhdGVfY29udHJvbF9pZHM7XG5cblx0XHRzd2l0Y2ggKCBpY29uTmFtZSApIHtcblx0XHRcdGNhc2UgJ3JlY3VycmluZ19zY2hlZHVsZSc6XG5cdFx0XHRcdEdsb2JhbC5hZGRWaWV3VGFiKCB0aGlzLnZpZXdJZCwgJC5pMThuLl8oICdSZWN1cnJpbmcgVGVtcGxhdGVzJyApLCB3aW5kb3cubG9jYXRpb24uaHJlZiApO1xuXHRcdFx0XHRJbmRleFZpZXdDb250cm9sbGVyLmdvVG9WaWV3KCAnUmVjdXJyaW5nU2NoZWR1bGVDb250cm9sJywgZmlsdGVyICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdHNldEN1c3RvbURlZmF1bHRNZW51SWNvbiggaWQsIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApIHtcblx0XHRzd2l0Y2ggKCBpZCApIHtcblx0XHRcdGNhc2UgJ3JlY3VycmluZ19zY2hlZHVsZSc6XG5cdFx0XHRcdHRoaXMuc2V0RGVmYXVsdE1lbnVSZWN1cnJpbmdTY2hlZHVsZUljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCApO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRzZXREZWZhdWx0TWVudVJlY3VycmluZ1NjaGVkdWxlSWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoLCBwSWQgKSB7XG5cdFx0aWYgKCAhUGVybWlzc2lvbk1hbmFnZXIuY2hlY2tUb3BMZXZlbFBlcm1pc3Npb24oICdSZWN1cnJpbmdTY2hlZHVsZUNvbnRyb2wnICkgfHwgdGhpcy5lZGl0X29ubHlfbW9kZSApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5oaWRlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlIClcblx0XHR9XG5cblx0XHRpZiAoIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoID4gMCApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIHRydWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9XG5cdH1cblxuXHRzZXRDdXN0b21FZGl0TWVudUljb24oIGlkLCBjb250ZXh0X2J0biApIHtcblx0XHRzd2l0Y2ggKCBpZCApIHtcblx0XHRcdGNhc2UgJ3JlY3VycmluZ19zY2hlZHVsZSc6XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1lbnVSZWN1cnJpbmdTY2hlZHVsZUljb24oIGNvbnRleHRfYnRuICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdHNldEVkaXRNZW51UmVjdXJyaW5nU2NoZWR1bGVJY29uKCBjb250ZXh0X2J0biwgcElkICkge1xuXHRcdGlmICggIXRoaXMudmlld1Blcm1pc3Npb25WYWxpZGF0ZSggcElkICkgfHwgdGhpcy5lZGl0X29ubHlfbW9kZSApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5oaWRlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlIClcblx0XHR9XG5cblx0XHRpZiAoICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgfHwgIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdFx0fVxuXG5cdH1cblxuXHRvblNhdmVSZXN1bHQoIHJlc3VsdCApIHtcblx0XHRzdXBlci5vblNhdmVSZXN1bHQoIHJlc3VsdCApO1xuXHRcdGlmICggcmVzdWx0ICYmIHJlc3VsdC5pc1ZhbGlkKCkgKSB7XG5cdFx0XHR2YXIgc3lzdGVtX2pvYl9xdWV1ZSA9IHJlc3VsdC5nZXRBdHRyaWJ1dGVJbkFQSURldGFpbHMoICdzeXN0ZW1fam9iX3F1ZXVlJyApO1xuXHRcdFx0aWYgKCBzeXN0ZW1fam9iX3F1ZXVlICkge1xuXHRcdFx0XHR0aGlzLmV2ZW50X2J1cy5lbWl0KCAndHRfdG9wYmFyJywgJ3RvZ2dsZV9qb2JfcXVldWVfc3Bpbm5lcicsIHtcblx0XHRcdFx0XHRzaG93OiB0cnVlLFxuXHRcdFx0XHRcdGdldF9qb2JfZGF0YTogdHJ1ZVxuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Z2V0UmVjdXJyaW5nVGVtcGxhdGVUYWJIdG1sKCkge1xuXHRcdHJldHVybiBgPGRpdiBpZD1cInRhYl9yZWN1cnJpbmdfdGVtcGxhdGVcIiBjbGFzcz1cImVkaXQtdmlldy10YWItb3V0c2lkZVwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJlZGl0LXZpZXctdGFiXCIgaWQ9XCJ0YWJfcmVjdXJyaW5nX3RlbXBsYXRlX2NvbnRlbnRfZGl2XCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmlyc3QtY29sdW1uIGZ1bGwtd2lkdGgtY29sdW1uXCI+PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5zaWRlLWVkaXRvci1kaXYgZnVsbC13aWR0aC1jb2x1bW5cIj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5gO1xuXHR9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7067\n")}}]); |