TimeTrex/interface/html5/dist/employees-user_preference-UserPreferenceViewController.bundle.js

1 line
103 KiB
JavaScript

"use strict";(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["employees-user_preference-UserPreferenceViewController"],{8427:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"UserPreferenceViewController\": () => (/* binding */ UserPreferenceViewController)\n/* harmony export */ });\n/* provided dependency */ var _ = __webpack_require__(9050);\n/* provided dependency */ var $ = __webpack_require__(9755);\nclass UserPreferenceViewController extends BaseViewController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\t\t\tel: '#user_preference_view_container',\n\n\t\t\tdate_format_array: null,\n\t\t\tother_date_format_array: null,\n\t\t\tjs_date_format_array: null,\n\t\t\tflex_date_format_array: null,\n\t\t\tjquery_date_format_array: null,\n\t\t\ttime_format_array: null,\n\t\t\tjs_time_format_array: null,\n\t\t\tflex_time_format_array: null,\n\t\t\tdate_time_format_array: null,\n\t\t\ttime_unit_format_array: null,\n\t\t\tdistance_format_array: null,\n\t\t\ttime_zone_array: null,\n\t\t\tlocation_timezone_array: null,\n\t\t\tarea_code_timezone_array: null,\n\t\t\ttimesheet_view_array: null,\n\t\t\tstart_week_day_array: null,\n\t\t\tschedule_icalendar_type_array: null,\n\t\t\tlanguage_array: null,\n\t\t\tuser_group_array: null,\n\t\t\tcountry_array: null,\n\t\t\tprovince_array: null,\n\n\t\t\tnotification_status_array: null,\n\t\t\tnotification_type_array: null,\n\t\t\tpriority_array: null,\n\t\t\toriginal_user_preference_notification_data: [],\n\n\t\t\te_province_array: null,\n\t\t\tuser_api: null,\n\t\t\tuser_group_api: null,\n\t\t\tcompany_api: null,\n\n\t\t\tapi_date: null,\n\n\t\t\tuser_preference_notification_api: null\n\t\t} );\n\n\t\tsuper( options );\n\t}\n\n\tinit( options ) {\n\n\t\t//this._super('initialize', options );\n\t\tthis.edit_view_tpl = 'UserPreferenceEditView.html';\n\t\tthis.permission_id = 'user_preference';\n\t\tthis.viewId = 'UserPreference';\n\t\tthis.script_name = 'UserPreferenceView';\n\t\tthis.table_name_key = 'user_preference';\n\t\tthis.context_menu_name = $.i18n._( 'Preferences' );\n\t\tthis.navigation_label = $.i18n._( 'Employees' );\n\t\tthis.api = TTAPI.APIUserPreference;\n\t\tthis.api_date = TTAPI.APITTDate;\n\t\tthis.user_api = TTAPI.APIUser;\n\t\tthis.user_group_api = TTAPI.APIUserGroup;\n\t\tthis.company_api = TTAPI.APICompany;\n\t\tthis.user_preference_notification_api = TTAPI.APIUserPreferenceNotification;\n\n\t\tthis.render();\n\n\t\tthis.buildContextMenu();\n\n\t\t//call init data in parent view\n\n\t\tthis.initData();\n\t}\n\n\tgetCustomContextMenuModel() {\n\t\tvar context_menu_model = {\n\t\t\texclude: [\n\t\t\t\t'add',\n\t\t\t\t'copy',\n\t\t\t\t'copy_as_new',\n\t\t\t\t'save_and_copy',\n\t\t\t\t'save_and_new',\n\t\t\t\t'delete_icon',\n\t\t\t\t'delete_and_next'\n\t\t\t],\n\t\t\tinclude: []\n\t\t};\n\n\t\treturn context_menu_model;\n\t}\n\n\tinitOptions() {\n\n\t\tvar $this = this;\n\n\t\tvar options = [\n\t\t\t{ option_name: 'status', api: this.user_api },\n\t\t\t{ option_name: 'country', field_name: 'country', api: this.company_api },\n\t\t\t{ option_name: 'language', api: this.api },\n\t\t\t{ option_name: 'date_format', api: this.api },\n\t\t\t{ option_name: 'time_format', api: this.api },\n\t\t\t{ option_name: 'time_unit_format', api: this.api },\n\t\t\t{ option_name: 'distance_format', api: this.api },\n\t\t\t{ option_name: 'time_zone', api: this.api },\n\t\t\t{ option_name: 'start_week_day', api: this.api },\n\t\t\t{ option_name: 'schedule_icalendar_type', api: this.api },\n\t\t\t{ option_name: 'default_login_screen', api: this.api },\n\t\t\t{ option_name: 'notification_status', api: this.api },\n\t\t\t{ option_name: 'notification_type', api: this.user_preference_notification_api },\n\t\t\t{ option_name: 'priority', api: this.user_preference_notification_api },\n\t\t];\n\n\t\tthis.initDropDownOptions( options );\n\n\t\tthis.user_group_api.getUserGroup( '', false, false, {\n\t\t\tonResult: function( res ) {\n\t\t\t\tres = res.getResult();\n\t\t\t\tres = Global.buildTreeRecord( res );\n\t\t\t\t$this.user_group_array = res;\n\t\t\t\tif ( !$this.sub_view_mode && $this.basic_search_field_ui_dic['group_id'] ) {\n\t\t\t\t\t$this.basic_search_field_ui_dic['group_id'].setSourceData( res );\n\t\t\t\t\t$this.adv_search_field_ui_dic['group_id'].setSourceData( res );\n\t\t\t\t}\n\n\t\t\t}\n\t\t} );\n\t}\n\n\tinitInsideEditorData() {\n\t\tvar $this = this;\n\n\t\tvar filter = {};\n\t\tfilter.filter_data = {};\n\t\tfilter.filter_data.user_id = this.current_edit_record.user_id;\n\n\t\t$this.user_preference_notification_api.getUserPreferenceNotification( filter, true, {\n\t\t\tonResult: function( res ) {\n\n\t\t\t\tvar data = res.getResult();\n\t\t\t\tvar array_data = [];\n\t\t\t\tfor ( var key in data ) {\n\n\t\t\t\t\tif ( !data.hasOwnProperty( key ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tarray_data.push( data[key] );\n\t\t\t\t}\n\t\t\t\tarray_data = array_data.sort( function( a, b ) {\n\t\t\t\t\treturn $this.notification_type_array.findIndex( p => p.id === a.type_id ) - $this.notification_type_array.findIndex( p => p.id === b.type_id );\n\t\t\t\t} );\n\n\t\t\t\t$this.original_user_preference_notification_data = _.map(array_data, _.clone);\n\n\t\t\t\t$this.editor.setValue( array_data );\n\n\t\t\t}\n\t\t} );\n\t}\n\n\tsetProvince( val, m ) {\n\t\tvar $this = this;\n\n\t\tif ( !val || val === '-1' || val === '0' ) {\n\t\t\t$this.province_array = [];\n\t\t\tthis.adv_search_field_ui_dic['province'].setSourceData( [] );\n\t\t} else {\n\t\t\tthis.company_api.getOptions( 'province', val, {\n\t\t\t\tonResult: function( res ) {\n\t\t\t\t\tres = res.getResult();\n\t\t\t\t\tif ( !res ) {\n\t\t\t\t\t\tres = [];\n\t\t\t\t\t}\n\n\t\t\t\t\t$this.province_array = Global.buildRecordArray( res );\n\t\t\t\t\t$this.adv_search_field_ui_dic['province'].setSourceData( $this.province_array );\n\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\teSetProvince( val, refresh ) {\n\t\tvar $this = this;\n\t\tvar province_widget = $this.edit_view_ui_dic['province'];\n\n\t\tif ( !val || val === '-1' || val === '0' ) {\n\t\t\t$this.e_province_array = [];\n\t\t\tprovince_widget.setSourceData( [] );\n\t\t} else {\n\t\t\tthis.company_api.getOptions( 'province', val, {\n\t\t\t\tonResult: function( res ) {\n\t\t\t\t\tres = res.getResult();\n\t\t\t\t\tif ( !res ) {\n\t\t\t\t\t\tres = [];\n\t\t\t\t\t}\n\n\t\t\t\t\t$this.e_province_array = Global.buildRecordArray( res );\n\n\t\t\t\t\tif ( refresh && $this.e_province_array.length > 0 ) {\n\t\t\t\t\t\t$this.current_edit_record.province = $this.e_province_array[0].value;\n\t\t\t\t\t\tprovince_widget.setValue( $this.current_edit_record.province );\n\t\t\t\t\t}\n\t\t\t\t\tprovince_widget.setSourceData( $this.e_province_array );\n\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\tonSetSearchFilterFinished() {\n\n\t\tif ( this.search_panel.getSelectTabIndex() === 1 ) {\n\t\t\tvar combo = this.adv_search_field_ui_dic['country'];\n\t\t\tvar select_value = combo.getValue();\n\t\t\tthis.setProvince( select_value );\n\t\t}\n\t}\n\n\tonBuildAdvUIFinished() {\n\n\t\tthis.adv_search_field_ui_dic['country'].change( $.proxy( function() {\n\t\t\tvar combo = this.adv_search_field_ui_dic['country'];\n\t\t\tvar selectVal = combo.getValue();\n\n\t\t\tthis.setProvince( selectVal );\n\n\t\t\tthis.adv_search_field_ui_dic['province'].setValue( null );\n\n\t\t}, this ) );\n\t}\n\n\tbuildSearchFields() {\n\n\t\tthis.search_fields = [\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Employee' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'user_id',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Status' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'status_id',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'First Name' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'first_name',\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.TEXT_INPUT\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Last Name' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'last_name',\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.TEXT_INPUT\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Employee Number' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'employee_number',\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.TEXT_INPUT\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Group' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tmultiple: true,\n\t\t\t\tfield: 'group_id',\n\t\t\t\tlayout_name: 'global_tree_column',\n\t\t\t\ttree_mode: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Default Branch' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'default_branch_id',\n\t\t\t\tlayout_name: 'global_branch',\n\t\t\t\tapi_class: TTAPI.APIBranch,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Default Department' ),\n\t\t\t\tfield: 'default_department_id',\n\t\t\t\tin_column: 2,\n\t\t\t\tlayout_name: 'global_department',\n\t\t\t\tapi_class: TTAPI.APIDepartment,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: true,\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._( 'Title' ),\n\t\t\t\tfield: 'title_id',\n\t\t\t\tin_column: 2,\n\t\t\t\tlayout_name: 'global_job_title',\n\t\t\t\tapi_class: TTAPI.APIUserTitle,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Country' ),\n\t\t\t\tin_column: 3,\n\t\t\t\tfield: 'country',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.COMBO_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Province/State' ),\n\t\t\t\tin_column: 3,\n\t\t\t\tfield: 'province',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: false,\n\t\t\t\tadv_search: true,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} )\n\n\t\t];\n\t}\n\n\tonFormItemChange( target, doNotValidate ) {\n\t\tthis.setIsChanged( target );\n\t\tthis.setMassEditingFieldsWhenFormChange( target );\n\t\tvar key = target.getField();\n\t\tvar c_value = target.getValue();\n\t\tthis.current_edit_record[key] = c_value;\n\n\t\tif ( key === 'schedule_icalendar_type_id' ) {\n\n\t\t\tthis.onStatusChange();\n\t\t} else if ( key === 'notification_status_id' ) {\n\t\t\tthis.initSubNotificationView();\n\t\t}\n\n\t\tif ( !doNotValidate ) {\n\t\t\tthis.validate();\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_preference': { 'label': $.i18n._( 'Preferences' ) },\n\t\t\t'tab_preferences_notification': {\n\t\t\t\t'label': $.i18n._( 'Notifications' ),\n\t\t\t\t'init_callback': 'initSubNotificationView',\n\t\t\t\t'html_template': this.getPreferencesNotificationTabHtml()\n\t\t\t},\n\t\t\t'tab_schedule_sync': {\n\t\t\t\t'label': $.i18n._( 'Schedule Synchronization' ),\n\t\t\t\t'init_callback': 'initSubScheduleSyncView',\n\t\t\t\t'html_template': this.getScheduleSyncronizationTabHtml()\n\t\t\t},\n\t\t\t'tab_audit': true,\n\t\t};\n\t\tthis.setTabModel( tab_model );\n\n\t\tthis.navigation.AComboBox( {\n\t\t\tid: this.script_name + '_navigation',\n\t\t\tapi_class: TTAPI.APIUserPreference,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_user_preference',\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//Tab 0 start\n\n\t\tvar tab_preference = this.edit_view_tab.find( '#tab_preference' );\n\n\t\tvar tab_preference_column1 = tab_preference.find( '.first-column' );\n\n\t\tthis.edit_view_tabs[0] = [];\n\n\t\tthis.edit_view_tabs[0].push( tab_preference_column1 );\n\n\t\tvar form_item_input;\n\t\tvar widgetContainer;\n\t\tvar label;\n\n\t\tif ( !this.is_mass_editing ) {\n\t\t\t// Employee\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\tform_item_input.TText( { field: 'full_name' } );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Employee' ), form_item_input, tab_preference_column1, '' );\n\t\t}\n\n\t\t// Language\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'language', set_empty: true } );\n\t\tform_item_input.setSourceData( $this.language_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Language' ), form_item_input, tab_preference_column1 );\n\n\t\t// Date Format\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'date_format', set_empty: true } );\n\t\tform_item_input.setSourceData( $this.date_format_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Date Format' ), form_item_input, tab_preference_column1 );\n\n\t\t// Time Format\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'time_format', set_empty: true } );\n\t\tform_item_input.setSourceData( $this.time_format_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Time Format' ), form_item_input, tab_preference_column1 );\n\n\t\t// Time Units\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'time_unit_format', set_empty: true } );\n\t\tform_item_input.setSourceData( $this.time_unit_format_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Time Units' ), form_item_input, tab_preference_column1 );\n\n\t\t// Distance Units\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'distance_format', set_empty: true } );\n\t\tform_item_input.setSourceData( $this.distance_format_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Distance Units' ), form_item_input, tab_preference_column1 );\n\n\t\t// Time Zone\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'time_zone', set_empty: true } );\n\t\tform_item_input.setSourceData( $this.time_zone_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Time Zone' ), form_item_input, tab_preference_column1 );\n\n\t\t// Start Weeks on\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'start_week_day' } );\n\t\tform_item_input.setSourceData( $this.start_week_day_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Calendar Starts On' ), form_item_input, tab_preference_column1 );\n\n\t\t// Rows per page\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'items_per_page', width: 50 } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Rows per page' ), form_item_input, tab_preference_column1 );\n\n\t\t// Default Login Screen\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'default_login_screen' } );\n\t\tform_item_input.setSourceData( $this.default_login_screen_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Default Screen' ), form_item_input, tab_preference_column1 );\n\n\t\t// Save TimeSheet State\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\tform_item_input.TCheckbox( { field: 'enable_save_timesheet_state' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Save TimeSheet State' ), form_item_input, tab_preference_column1 );\n\n\n\t\t//Tab 1 start\n\t\tvar tab_preferences_notification = this.edit_view_tab.find( '#tab_preferences_notification' );\n\n\t\tvar tab_preferences_notification_column1 = tab_preferences_notification.find( '.first-column' );\n\n\t\tthis.edit_view_tabs[1] = [];\n\n\t\tthis.edit_view_tabs[1].push( tab_preferences_notification_column1 );\n\n\t\t// Push Notifications Enabled\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'notification_status_id' } );\n\t\tform_item_input.setSourceData( Global.addFirstItemToArray( $this.notification_status_array ) );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Notification Status' ), form_item_input, tab_preferences_notification_column1 );\n\n\t\t// Notification duration\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'notification_duration', width: 50 } );\n\n\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'> ' + $.i18n._( 'Seconds (Use 0 for infinite)' ) + '</span>' );\n\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Display Notifications For' ), form_item_input, tab_preferences_notification_column1, '', widgetContainer );\n\n\t\tif ( this.is_mass_editing == false ) {\n\t\t\tvar inside_editor_div = tab_preferences_notification.find( '.inside-editor-div' );\n\t\t\tvar args = {\n\t\t\t\tenabled: $.i18n._( 'Enabled' ),\n\t\t\t\tname: $.i18n._( 'Type' ),\n\t\t\t\tweb: $.i18n._( 'Browser' ),\n\t\t\t\temail_work: $.i18n._( 'Work Email' ),\n\t\t\t\temail_home: $.i18n._( 'Home Email' ),\n\t\t\t\tapp: $.i18n._( 'Mobile App' ),\n\t\t\t\tpriority: $.i18n._( 'Priority' ),\n\t\t\t\tsettings: $.i18n._( 'Settings' )\n\t\t\t};\n\n\t\t\tthis.editor = Global.loadWidgetByName( FormItemType.INSIDE_EDITOR );\n\n\t\t\tthis.editor.InsideEditor( {\n\t\t\t\ttitle: '',\n\t\t\t\taddRow: this.insideEditorAddRow,\n\t\t\t\tgetValue: this.insideEditorGetValue,\n\t\t\t\tsetValue: this.insideEditorSetValue,\n\t\t\t\tparent_controller: this,\n\t\t\t\trender: getRender(),\n\t\t\t\trender_args: args,\n\t\t\t\trender_inline_html: true,\n\t\t\t\trow_render: getRowRender()\n\t\t\t} );\n\n\t\t\tfunction getRender() {\n\t\t\t\treturn `\n\t\t\t<table class=\"inside-editor-render\">\n\t\t\t\t<tr class=\"title\">\n\t\t\t\t\t<td style=\"width: 50px\"><%= enabled %></td>\n\t\t\t\t\t<td style=\"width: 400px\"><%= name %></td>\n\t\t\t\t\t<td style=\"width: 150px\"><%= priority %></td>\n\t\t\t\t\t<td style=\"width: 110px\"><%= web %></td>\n\t\t\t\t\t<td style=\"width: 110px\"><%= email_work %></td>\n\t\t\t\t\t<td style=\"width: 110px\"><%= email_home %></td>\n\t\t\t\t\t<td style=\"width: 110px\"><%= app %></td>\n\t\t\t\t\t<td style=\"width: 200px\"><%= settings %></td>\n\t\t\t\t</tr>\n\t\t\t</table>`;\n\t\t\t}\n\n\t\t\tfunction getRowRender() {\n\t\t\t\treturn `\n\t\t\t<tr class=\"inside-editor-row data-row\">\n\t\t\t\t<td class=\"cell\"></td>\n\t\t\t\t<td class=\"cell\"></td>\n\t\t\t\t<td class=\"cell\"></td>\n\t\t\t\t<td class=\"cell\"></td>\n\t\t\t\t<td class=\"cell\"></td>\n\t\t\t\t<td class=\"cell\"></td>\n\t\t\t\t<td class=\"cell\"></td>\n\t\t\t\t<td class=\"cell\"></td>\n\t\t\t</tr>`;\n\t\t\t}\n\n\t\t\tinside_editor_div.append( this.editor );\n\t\t}\n\n\t\t//Tab 2 start\n\n\t\tvar tab_schedule_sync = this.edit_view_tab.find( '#tab_schedule_sync' );\n\n\t\tvar tab_schedule_sync_column1 = tab_schedule_sync.find( '.first-column' );\n\n\t\tthis.edit_view_tabs[2] = [];\n\n\t\tthis.edit_view_tabs[2].push( tab_schedule_sync_column1 );\n\n\t\t//// schedule icalendar type\n\t\t//form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t//form_item_input.TComboBox( {field: 'schedule_icalendar_type_id' } );\n\t\t//form_item_input.setSourceData( $this.schedule_icalendar_type_array );\n\t\t//this.addEditFieldToColumn( $.i18n._( 'Status' ), form_item_input, tab_schedule_sync_column1, 'first-last' );\n\t\t//\n\t\t//// Calendar URL\n\t\t//form_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t//form_item_input.TText( {field: 'calendar_url' } );\n\t\t//form_item_input.addClass( 'link' );\n\t\t//this.addEditFieldToColumn( $.i18n._( 'Calendar URL' ), form_item_input, tab_schedule_sync_column1, '', null, true );\n\n\t\t// Shifts Scheduled to Work\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.SEPARATED_BOX );\n\t\tform_item_input.SeparatedBox( { label: $.i18n._( 'Shifts Scheduled to Work' ) } );\n\t\tthis.addEditFieldToColumn( null, form_item_input, tab_schedule_sync_column1, '', null, true, false, 'shifts_scheduled_to_work' );\n\n\t\t// Alarm 1\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'schedule_icalendar_alarm1_working', width: 90, need_parser_sec: true } );\n\n\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'>( ' + $.i18n._( 'before schedule start time' ) + ' )</span>' );\n\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Alarm 1' ), form_item_input, tab_schedule_sync_column1, '', widgetContainer, true );\n\n\t\t// Alarm 2\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'schedule_icalendar_alarm2_working', width: 90, need_parser_sec: true } );\n\n\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'>( ' + $.i18n._( 'before schedule start time' ) + ' )</span>' );\n\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Alarm 2' ), form_item_input, tab_schedule_sync_column1, '', widgetContainer, true );\n\n\t\t// Shifts Scheduled Absent\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.SEPARATED_BOX );\n\t\tform_item_input.SeparatedBox( { label: $.i18n._( 'Shifts Scheduled Absent' ) } );\n\t\tthis.addEditFieldToColumn( null, form_item_input, tab_schedule_sync_column1, '', null, true, false, 'shifts_scheduled_absent' );\n\n\t\t// Alarm 1\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'schedule_icalendar_alarm1_absence', width: 90, need_parser_sec: true } );\n\n\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'>( ' + $.i18n._( 'before schedule start time' ) + ' )</span>' );\n\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Alarm 1' ), form_item_input, tab_schedule_sync_column1, '', widgetContainer, true );\n\n\t\t// Alarm 2\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'schedule_icalendar_alarm2_absence', width: 90, need_parser_sec: true } );\n\n\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'>( ' + $.i18n._( 'before schedule start time' ) + ' )</span>' );\n\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Alarm 2' ), form_item_input, tab_schedule_sync_column1, '', widgetContainer, true );\n\n\t\t// Modified Shifts\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.SEPARATED_BOX );\n\t\tform_item_input.SeparatedBox( { label: $.i18n._( 'Modified Shifts' ) } );\n\t\tthis.addEditFieldToColumn( null, form_item_input, tab_schedule_sync_column1, '', null, true, false, 'modified_shifts' );\n\n\t\t// Alarm 1\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'schedule_icalendar_alarm1_modified', width: 90, need_parser_sec: true } );\n\n\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'>( ' + $.i18n._( 'before schedule start time' ) + ' )</span>' );\n\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Alarm 1' ), form_item_input, tab_schedule_sync_column1, '', widgetContainer, true );\n\n\t\t// Alarm 2\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'schedule_icalendar_alarm2_modified', width: 90, need_parser_sec: true } );\n\n\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'>( ' + $.i18n._( 'before schedule start time' ) + ' )</span>' );\n\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Alarm 2' ), form_item_input, tab_schedule_sync_column1, '', widgetContainer, true );\n\t}\n\n\tonMassEditClick() {\n\n\t\tvar $this = this;\n\t\t$this.is_add = false;\n\t\t$this.is_viewing = false;\n\t\t$this.is_mass_editing = true;\n\t\tLocalCacheData.current_doing_context_action = 'mass_edit';\n\t\t$this.openEditView();\n\t\tvar filter = {};\n\t\tvar grid_selected_id_array = this.getGridSelectIdArray();\n\t\tvar grid_selected_length = grid_selected_id_array.length;\n\t\tthis.mass_edit_record_ids = [];\n\n\t\t$.each( grid_selected_id_array, function( index, value ) {\n\t\t\t$this.mass_edit_record_ids.push( value );\n\t\t} );\n\n\t\tfilter.filter_data = {};\n\t\tfilter.filter_data.id = this.mass_edit_record_ids;\n\n\t\tthis.api['getCommon' + this.api.key_name + 'Data']( filter, {\n\t\t\tonResult: function( result ) {\n\t\t\t\tvar result_data = result.getResult();\n\n\t\t\t\tif ( !result_data ) {\n\t\t\t\t\tresult_data = [];\n\t\t\t\t}\n\n\t\t\t\t$this.unique_columns = [];\n\t\t\t\t$this.linked_columns = [];\n\n\t\t\t\t$this.current_edit_record = result_data;\n\t\t\t\t$this.initEditView();\n\n\t\t\t}\n\t\t} );\n\t}\n\n\tonStatusChange() {\n\n\t\tif ( this.current_edit_record.schedule_icalendar_type_id == 0 ) {\n\t\t\t//this.edit_view_form_item_dic['calendar_url'].css( 'display', 'none' );\n\t\t\tthis.detachElement( 'schedule_icalendar_alarm1_working' );\n\t\t\tthis.detachElement( 'schedule_icalendar_alarm2_working' );\n\t\t\tthis.detachElement( 'schedule_icalendar_alarm1_absence' );\n\t\t\tthis.detachElement( 'schedule_icalendar_alarm2_absence' );\n\t\t\tthis.detachElement( 'schedule_icalendar_alarm1_modified' );\n\t\t\tthis.detachElement( 'schedule_icalendar_alarm2_modified' );\n\t\t\tthis.detachElement( 'shifts_scheduled_to_work' );\n\t\t\tthis.detachElement( 'shifts_scheduled_absent' );\n\t\t\tthis.detachElement( 'modified_shifts' );\n\n\t\t} else {\n\t\t\t//this.setCalendarURL();\n\t\t\t//this.edit_view_form_item_dic['calendar_url'].css( 'display', 'block' );\n\t\t\tthis.attachElement( 'schedule_icalendar_alarm1_working' );\n\t\t\tthis.attachElement( 'schedule_icalendar_alarm2_working' );\n\t\t\tthis.attachElement( 'schedule_icalendar_alarm1_absence' );\n\t\t\tthis.attachElement( 'schedule_icalendar_alarm2_absence' );\n\t\t\tthis.attachElement( 'schedule_icalendar_alarm1_modified' );\n\t\t\tthis.attachElement( 'schedule_icalendar_alarm2_modified' );\n\t\t\tthis.attachElement( 'shifts_scheduled_to_work' );\n\t\t\tthis.attachElement( 'shifts_scheduled_absent' );\n\t\t\tthis.attachElement( 'modified_shifts' );\n\t\t}\n\n\t\tthis.editFieldResize();\n\t}\n\n\tsetCurrentEditRecordData() {\n\n\t\t//Set current edit record data to all widgets\n\n\t\tfor ( var key in this.current_edit_record ) {\n\t\t\tvar widget = this.edit_view_ui_dic[key];\n\t\t\tif ( Global.isSet( widget ) ) {\n\t\t\t\tswitch ( key ) {\n\t\t\t\t\tcase 'full_name':\n\t\t\t\t\t\twidget.setValue( this.current_edit_record['first_name'] + ' ' + this.current_edit_record['last_name'] );\n\t\t\t\t\t\tbreak;\n//\t\t\t\t\tcase 'schedule_icalendar_alarm1_working':\n//\t\t\t\t\tcase 'schedule_icalendar_alarm2_working':\n//\t\t\t\t\tcase 'schedule_icalendar_alarm1_absence':\n//\t\t\t\t\tcase 'schedule_icalendar_alarm2_absence':\n//\t\t\t\t\tcase 'schedule_icalendar_alarm1_modified':\n//\t\t\t\t\tcase 'schedule_icalendar_alarm2_modified':\n//\t\t\t\t\t\tvar result = Global.getTimeUnit( this.current_edit_record[key] )\n//\t\t\t\t\t\twidget.setValue( result );\n//\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\tthis.collectUIDataToCurrentEditRecord();\n\n\t\tthis.setEditViewDataDone();\n\t}\n\n\tsetEditViewDataDone() {\n\t\tsuper.setEditViewDataDone();\n\t\tthis.onStatusChange();\n\t\tif ( this.is_mass_editing == false ) {\n\t\t\tthis.initInsideEditorData();\n\t\t}\n\t}\n\n\tsetCalendarURL( widget ) {\n\n\t\tif ( !Global.isSet( widget ) ) {\n\t\t\twidget = this.edit_view_ui_dic['calendar_url'];\n\t\t}\n\n\t\tif ( this.is_mass_editing ) {\n\t\t\twidget.setValue( 'Not available when mass editing' );\n\t\t\treturn;\n\t\t}\n\n\t\tthis.api['getScheduleIcalendarURL']( this.current_edit_record.user_name, this.current_edit_record.schedule_icalendar_type_id, {\n\t\t\tonResult: function( result ) {\n\t\t\t\tvar result_data = result.getResult();\n\t\t\t\twidget.setValue( ServiceCaller.root_url + result_data, true );\n\n\t\t\t\twidget.unbind( 'click' ); // First unbind all click events, otherwise, when we change the schedule icalendar type this will trigger several times click events.\n\n\t\t\t\twidget.click( function() {\n\t\t\t\t\twindow.open( widget.text() );\n\t\t\t\t} );\n\n\t\t\t}\n\t\t} );\n\t}\n\n\tinitSubScheduleSyncView() {\n\t\tif ( Global.getProductEdition() >= 15 ) {\n\t\t\tthis.edit_view_tab.find( '#tab_schedule_sync' ).find( '.first-column' ).css( 'display', 'block' );\n\t\t\tthis.edit_view.find( '.permission-defined-div' ).css( 'display', 'none' );\n\t\t\tthis.buildContextMenu( true );\n\t\t\tthis.setEditMenu();\n\t\t} else {\n\t\t\tthis.edit_view_tab.find( '#tab_schedule_sync' ).find( '.first-column' ).css( 'display', 'none' );\n\t\t\tthis.edit_view.find( '.permission-defined-div' ).css( 'display', 'block' );\n\t\t\tthis.edit_view.find( '.permission-message' ).html( Global.getUpgradeMessage() );\n\t\t}\n\t}\n\n\tinitSubNotificationView() {\n\t\tif ( this.current_edit_record.notification_status_id == 0 ) {\n\t\t\tthis.edit_view_tab.find( '#tab_preferences_notification' ).find( '.inside-editor-div' ).css( 'display', 'none' );\n\t\t\tthis.edit_view_ui_dic['notification_duration'].parent().parent().parent().css( 'display', 'none' );\n\t\t} else {\n\t\t\tthis.edit_view_tab.find( '#tab_preferences_notification' ).find( '.inside-editor-div' ).css( 'display', 'block' );\n\t\t\tthis.edit_view_ui_dic['notification_duration'].parent().parent().parent().css( 'display', 'block' );\n\t\t}\n\t}\n\n\tinsideEditorSetValue( val ) {\n\t\tvar len = val.length;\n\n\t\tif ( len === 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.removeAllRows();\n\t\tfor ( var i = 0; i < val.length; i++ ) {\n\t\t\tif ( Global.isSet( val[i] ) ) {\n\t\t\t\tvar row = val[i];\n\t\t\t\t//converting status_id and device_id into boolean values to be used for checkboxes\n\t\t\t\trow.enabled = row.status_id == 10;\n\t\t\t\trow.web_push_enabled = row.device_id.includes( 4 );\n\t\t\t\trow.email_work_enabled = row.device_id.includes( 256 );\n\t\t\t\trow.email_home_enabled = row.device_id.includes( 512 );\n\t\t\t\trow.app_push_enabled = row.device_id.includes( 32768 );\n\t\t\t\tif ( row.type_id.startsWith( 'reminder_' ) ) {\n\t\t\t\t\trow.reminder_delay = row.reminder_delay;\n\t\t\t\t}\n\t\t\t\tthis.addRow( row );\n\t\t\t}\n\t\t}\n\t}\n\n\tinsideEditorAddRow( data, index ) {\n\t\tif ( !data ) {\n\t\t\tdata = {};\n\t\t}\n\n\t\tvar row = this.getRowRender(); //Get Row render\n\t\tvar render = this.getRender(); //get render, should be a table\n\t\tvar widgets = {}; //Save each row's widgets\n\n\t\t//Build row widgets\n\n\t\t//Enabled\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\tform_item_input.TCheckbox( { field: 'enabled' } );\n\t\tform_item_input.setValue( data.enabled );\n\t\twidgets[form_item_input.getField()] = form_item_input;\n\t\trow.children().eq( 0 ).append( form_item_input );\n\t\tthis.setWidgetEnableBaseOnParentController( form_item_input );\n\n\t\t//Type\n\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'type_id' } );\n\t\tform_item_input.setSourceData( Global.addFirstItemToArray( this.parent_controller.notification_type_array ) );\n\t\tform_item_input.setValue( data.type_id );\n\t\tform_item_input.setEnabled( false );\n\t\tform_item_input.css( 'text-align-last', 'center' );\n\t\twidgets[form_item_input.getField()] = form_item_input;\n\t\trow.children().eq( 1 ).append( form_item_input );\n\n\t\t//Priority\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'priority_id', set_empty: false } );\n\t\tform_item_input.setSourceData( this.parent_controller.priority_array );\n\t\tform_item_input.setValue( data.priority_id );\n\t\twidgets[form_item_input.getField()] = form_item_input;\n\t\trow.children().eq( 2 ).append( form_item_input );\n\n\t\t//Web Push\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\tform_item_input.TCheckbox( { field: 'web_push_enabled' } );\n\t\tform_item_input.setValue( data.web_push_enabled );\n\t\twidgets[form_item_input.getField()] = form_item_input;\n\t\trow.children().eq( 3 ).append( form_item_input );\n\n\t\t//Work Email\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\tform_item_input.TCheckbox( { field: 'email_work_enabled' } );\n\t\tform_item_input.setValue( data.email_work_enabled );\n\t\twidgets[form_item_input.getField()] = form_item_input;\n\t\trow.children().eq( 4 ).append( form_item_input );\n\n\t\t//Home Email\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\tform_item_input.TCheckbox( { field: 'email_home_enabled' } );\n\t\tform_item_input.setValue( data.email_home_enabled );\n\t\twidgets[form_item_input.getField()] = form_item_input;\n\t\trow.children().eq( 5 ).append( form_item_input );\n\n\t\t//App Push\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\tform_item_input.TCheckbox( { field: 'app_push_enabled' } );\n\t\tform_item_input.setValue( data.app_push_enabled );\n\t\twidgets[form_item_input.getField()] = form_item_input;\n\t\trow.children().eq( 6 ).append( form_item_input );\n\n\t\t//Settings\n\t\tif ( data.type_id.startsWith( 'reminder_' ) ) {\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\tform_item_input.TTextInput( { field: 'reminder_delay', need_parser_sec: true, mode: 'time_unit' } );\n\t\t\tform_item_input.setValue( data.reminder_delay );\n\t\t\twidgets[form_item_input.getField()] = form_item_input;\n\n\t\t\tvar widgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\t\tvar label = $( '<span class=\\'widget-left-label\\'> ' + $.i18n._( 'Delay' ) + ': </span>' );\n\n\t\t\twidgetContainer.append( label );\n\t\t\twidgetContainer.append( form_item_input );\n\n\t\t\trow.children().eq( 7 ).append( widgetContainer );\n\t\t}\n\n\t\t//Save current set item\n\t\twidgets.current_edit_item = data;\n\n\t\tif ( typeof index != 'undefined' ) {\n\n\t\t\trow.insertAfter( $( render ).find( 'tr' ).eq( index ) );\n\t\t\tthis.rows_widgets_array.splice( ( index ), 0, widgets );\n\n\t\t} else {\n\t\t\t$( render ).append( row );\n\t\t\tthis.rows_widgets_array.push( widgets );\n\t\t}\n\n\t\tif ( this.parent_controller.is_viewing ) {\n\t\t\trow.find( '.control-icon' ).hide();\n\t\t}\n\n\t\tthis.removeLastRowLine();\n\t}\n\n\tinsideEditorGetValue( current_edit_item_id ) {\n\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\t\t\tvar data = row.current_edit_item;\n\t\t\tdata.priority_id = row.priority_id.getValue();\n\t\t\tdata.status_id = row.enabled.getValue() === true ? 10 : 20;\n\t\t\tdata.device_id = [];\n\t\t\tif ( row.web_push_enabled.getValue() === true )\n\t\t\t\tdata.device_id.push( 4 );\n\t\t\tif ( row.email_work_enabled.getValue() === true )\n\t\t\t\tdata.device_id.push( 256 );\n\t\t\tif ( row.email_home_enabled.getValue() === true )\n\t\t\t\tdata.device_id.push( 512 );\n\t\t\tif ( row.app_push_enabled.getValue() === true )\n\t\t\t\tdata.device_id.push( 32768 );\n\n\t\t\tif ( data.type_id.startsWith( 'reminder_' ) && row.reminder_delay ) {\n\t\t\t\tdata.reminder_delay = row.reminder_delay.getValue();\n\t\t\t}\n\n\t\t\tresult.push( data );\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tonSaveResult( result ) {\n\t\tvar $this = this;\n\t\tif ( result.isValid() ) {\n\t\t\tvar result_data = result.getResult();\n\t\t\tif ( result_data === true ) {\n\t\t\t\t$this.refresh_id = $this.current_edit_record.id;\n\n\t\t\t} else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) {\n\t\t\t\t$this.refresh_id = result_data;\n\t\t\t}\n\n\t\t\tif ( this.is_mass_editing == false ) {\n\t\t\t\t$this.saveInsideEditorData( function() {\n\t\t\t\t\tvar on_save_done_result = $this.onSaveDone( result );\n\t\t\t\t\tif ( on_save_done_result == undefined || on_save_done_result == true ) {\n\t\t\t\t\t\t$this.removeEditView();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\t$this.removeEditView();\n\t\t\t}\n\n\t\t} else {\n\t\t\t$this.setErrorMenu();\n\t\t\t$this.setErrorTips( result );\n\t\t}\n\t}\n\n\tsaveInsideEditorData( callBack ) {\n\t\tvar data = this.editor.getValue( this.refresh_id );\n\n\t\tlet changed_data = this.getChangedRecords( data, this.original_user_preference_notification_data, ['enabled', 'web_push_enabled', 'email_work_enabled', 'email_home_enabled', 'app_push_enabled'] );\n\n\t\tif ( Array.isArray( changed_data ) && changed_data.length > 0 ) {\n\t\t\tthis.user_preference_notification_api.setUserPreferenceNotification( changed_data, {\n\t\t\t\tonResult: function( res ) {\n\t\t\t\t\tif ( Global.isSet( callBack ) ) {\n\t\t\t\t\t\tcallBack();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t} else {\n\t\t\tif ( Global.isSet( callBack ) ) {\n\t\t\t\tcallBack();\n\t\t\t}\n\t\t}\n\t}\n\n\tonSaveDone( result ) {\n\t\t// #2224 - Don't use current_edit_record here, use getSelectedItem() instead, or it causes:\n\t\t// Uncaught Error From: UserPreferenceView Error: Unable to get property 'id' of undefined or null reference\n\t\tvar user_id = this.getSelectedItem().id;\n\n\t\tif ( user_id === LocalCacheData.getLoginUser().id ) {\n\t\t\tGlobal.updateUserPreference();\n\t\t}\n\t}\n\n\tonSaveAndContinueDone( result ) {\n\t\tthis.onSaveDone( result );\n\t\tthis.initInsideEditorData();\n\t}\n\n\tonSaveAndNextDone( result ) {\n\t\tthis.onSaveDone( result );\n\t}\n\n\tvalidate() {\n\t\tvar $this = this;\n\n\t\tvar record = {};\n\n\t\tif ( this.is_mass_editing ) {\n\t\t\tfor ( var key in this.edit_view_ui_dic ) {\n\t\t\t\tvar widget = this.edit_view_ui_dic[key];\n\n\t\t\t\tif ( Global.isSet( widget.isChecked ) ) {\n\t\t\t\t\tif ( widget.isChecked() && widget.getEnabled() ) {\n\t\t\t\t\t\trecord[key] = widget.getValue();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( this.mass_edit_record_ids.length > 0 ) {\n\t\t\t\trecord.id = this.mass_edit_record_ids[0];\n\t\t\t}\n\t\t} else {\n\t\t\trecord = this.current_edit_record;\n\t\t}\n\t\tthis.api['validate' + this.api.key_name]( record, {\n\t\t\tonResult: function( result ) {\n\n\t\t\t\t$this.validateResult( result );\n\n\t\t\t}\n\t\t} );\n\t}\n\n\tgetPreferencesNotificationTabHtml() {\n\t\treturn `<div id=\"tab_preferences_notification\" class=\"edit-view-tab-outside\">\n\t\t\t\t\t<div class=\"edit-view-tab\" id=\"tab_preferences_notification_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\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>`;\n\t}\n\n\tgetScheduleSyncronizationTabHtml() {\n\t\treturn `<div id=\"tab_schedule_sync\" class=\"edit-view-tab-outside\">\n\t\t\t\t\t<div class=\"edit-view-tab\" id=\"tab_schedule_sync_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=\"save-and-continue-div permission-defined-div\">\n\t\t\t\t\t\t\t<span class=\"message permission-message\"></span>\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\tsetSubLogViewFilter() {\n\t\tif ( !this.sub_log_view_controller ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.sub_log_view_controller.getSubViewFilter = function( filter ) {\n\t\t\tfilter['table_name_object_id'] = {\n\t\t\t\t'user_preference': [this.parent_edit_record.id],\n\t\t\t\t'user_preference_notification': this.parent_view_controller.editor.getValue( this.refresh_id ).map( preference => preference.id )\n\t\t\t};\n\n\t\t\treturn filter;\n\t\t};\n\n\t\treturn true;\n\t}\n\n}\n\nUserPreferenceViewController.loadView = function() {\n\tGlobal.loadViewSource( 'UserPreference', 'UserPreferenceView.html', function( result ) {\n\t\tvar args = {};\n\t\t//var template = _.template( result, args );\n\n\t\tGlobal.contentContainer().html( result );\n\t} );\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSCIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL2ludGVyZmFjZS9odG1sNS92aWV3cy9lbXBsb3llZXMvdXNlcl9wcmVmZXJlbmNlL1VzZXJQcmVmZXJlbmNlVmlld0NvbnRyb2xsZXIuanM/ZmFhZiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgVXNlclByZWZlcmVuY2VWaWV3Q29udHJvbGxlciBleHRlbmRzIEJhc2VWaWV3Q29udHJvbGxlciB7XG5cdGNvbnN0cnVjdG9yKCBvcHRpb25zID0ge30gKSB7XG5cdFx0Xy5kZWZhdWx0cyggb3B0aW9ucywge1xuXHRcdFx0ZWw6ICcjdXNlcl9wcmVmZXJlbmNlX3ZpZXdfY29udGFpbmVyJyxcblxuXHRcdFx0ZGF0ZV9mb3JtYXRfYXJyYXk6IG51bGwsXG5cdFx0XHRvdGhlcl9kYXRlX2Zvcm1hdF9hcnJheTogbnVsbCxcblx0XHRcdGpzX2RhdGVfZm9ybWF0X2FycmF5OiBudWxsLFxuXHRcdFx0ZmxleF9kYXRlX2Zvcm1hdF9hcnJheTogbnVsbCxcblx0XHRcdGpxdWVyeV9kYXRlX2Zvcm1hdF9hcnJheTogbnVsbCxcblx0XHRcdHRpbWVfZm9ybWF0X2FycmF5OiBudWxsLFxuXHRcdFx0anNfdGltZV9mb3JtYXRfYXJyYXk6IG51bGwsXG5cdFx0XHRmbGV4X3RpbWVfZm9ybWF0X2FycmF5OiBudWxsLFxuXHRcdFx0ZGF0ZV90aW1lX2Zvcm1hdF9hcnJheTogbnVsbCxcblx0XHRcdHRpbWVfdW5pdF9mb3JtYXRfYXJyYXk6IG51bGwsXG5cdFx0XHRkaXN0YW5jZV9mb3JtYXRfYXJyYXk6IG51bGwsXG5cdFx0XHR0aW1lX3pvbmVfYXJyYXk6IG51bGwsXG5cdFx0XHRsb2NhdGlvbl90aW1lem9uZV9hcnJheTogbnVsbCxcblx0XHRcdGFyZWFfY29kZV90aW1lem9uZV9hcnJheTogbnVsbCxcblx0XHRcdHRpbWVzaGVldF92aWV3X2FycmF5OiBudWxsLFxuXHRcdFx0c3RhcnRfd2Vla19kYXlfYXJyYXk6IG51bGwsXG5cdFx0XHRzY2hlZHVsZV9pY2FsZW5kYXJfdHlwZV9hcnJheTogbnVsbCxcblx0XHRcdGxhbmd1YWdlX2FycmF5OiBudWxsLFxuXHRcdFx0dXNlcl9ncm91cF9hcnJheTogbnVsbCxcblx0XHRcdGNvdW50cnlfYXJyYXk6IG51bGwsXG5cdFx0XHRwcm92aW5jZV9hcnJheTogbnVsbCxcblxuXHRcdFx0bm90aWZpY2F0aW9uX3N0YXR1c19hcnJheTogbnVsbCxcblx0XHRcdG5vdGlmaWNhdGlvbl90eXBlX2FycmF5OiBudWxsLFxuXHRcdFx0cHJpb3JpdHlfYXJyYXk6IG51bGwsXG5cdFx0XHRvcmlnaW5hbF91c2VyX3ByZWZlcmVuY2Vfbm90aWZpY2F0aW9uX2RhdGE6IFtdLFxuXG5cdFx0XHRlX3Byb3ZpbmNlX2FycmF5OiBudWxsLFxuXHRcdFx0dXNlcl9hcGk6IG51bGwsXG5cdFx0XHR1c2VyX2dyb3VwX2FwaTogbnVsbCxcblx0XHRcdGNvbXBhbnlfYXBpOiBudWxsLFxuXG5cdFx0XHRhcGlfZGF0ZTogbnVsbCxcblxuXHRcdFx0dXNlcl9wcmVmZXJlbmNlX25vdGlmaWNhdGlvbl9hcGk6IG51bGxcblx0XHR9ICk7XG5cblx0XHRzdXBlciggb3B0aW9ucyApO1xuXHR9XG5cblx0aW5pdCggb3B0aW9ucyApIHtcblxuXHRcdC8vdGhpcy5fc3VwZXIoJ2luaXRpYWxpemUnLCBvcHRpb25zICk7XG5cdFx0dGhpcy5lZGl0X3ZpZXdfdHBsID0gJ1VzZXJQcmVmZXJlbmNlRWRpdFZpZXcuaHRtbCc7XG5cdFx0dGhpcy5wZXJtaXNzaW9uX2lkID0gJ3VzZXJfcHJlZmVyZW5jZSc7XG5cdFx0dGhpcy52aWV3SWQgPSAnVXNlclByZWZlcmVuY2UnO1xuXHRcdHRoaXMuc2NyaXB0X25hbWUgPSAnVXNlclByZWZlcmVuY2VWaWV3Jztcblx0XHR0aGlzLnRhYmxlX25hbWVfa2V5ID0gJ3VzZXJfcHJlZmVyZW5jZSc7XG5cdFx0dGhpcy5jb250ZXh0X21lbnVfbmFtZSA9ICQuaTE4bi5fKCAnUHJlZmVyZW5jZXMnICk7XG5cdFx0dGhpcy5uYXZpZ2F0aW9uX2xhYmVsID0gJC5pMThuLl8oICdFbXBsb3llZXMnICk7XG5cdFx0dGhpcy5hcGkgPSBUVEFQSS5BUElVc2VyUHJlZmVyZW5jZTtcblx0XHR0aGlzLmFwaV9kYXRlID0gVFRBUEkuQVBJVFREYXRlO1xuXHRcdHRoaXMudXNlcl9hcGkgPSBUVEFQSS5BUElVc2VyO1xuXHRcdHRoaXMudXNlcl9ncm91cF9hcGkgPSBUVEFQSS5BUElVc2VyR3JvdXA7XG5cdFx0dGhpcy5jb21wYW55X2FwaSA9IFRUQVBJLkFQSUNvbXBhbnk7XG5cdFx0dGhpcy51c2VyX3ByZWZlcmVuY2Vfbm90aWZpY2F0aW9uX2FwaSA9IFRUQVBJLkFQSVVzZXJQcmVmZXJlbmNlTm90aWZpY2F0aW9uO1xuXG5cdFx0dGhpcy5yZW5kZXIoKTtcblxuXHRcdHRoaXMuYnVpbGRDb250ZXh0TWVudSgpO1xuXG5cdFx0Ly9jYWxsIGluaXQgZGF0YSBpbiBwYXJlbnQgdmlld1xuXG5cdFx0dGhpcy5pbml0RGF0YSgpO1xuXHR9XG5cblx0Z2V0Q3VzdG9tQ29udGV4dE1lbnVNb2RlbCgpIHtcblx0XHR2YXIgY29udGV4dF9tZW51X21vZGVsID0ge1xuXHRcdFx0ZXhjbHVkZTogW1xuXHRcdFx0XHQnYWRkJyxcblx0XHRcdFx0J2NvcHknLFxuXHRcdFx0XHQnY29weV9hc19uZXcnLFxuXHRcdFx0XHQnc2F2ZV9hbmRfY29weScsXG5cdFx0XHRcdCdzYXZlX2FuZF9uZXcnLFxuXHRcdFx0XHQnZGVsZXRlX2ljb24nLFxuXHRcdFx0XHQnZGVsZXRlX2FuZF9uZXh0J1xuXHRcdFx0XSxcblx0XHRcdGluY2x1ZGU6IFtdXG5cdFx0fTtcblxuXHRcdHJldHVybiBjb250ZXh0X21lbnVfbW9kZWw7XG5cdH1cblxuXHRpbml0T3B0aW9ucygpIHtcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHR2YXIgb3B0aW9ucyA9IFtcblx0XHRcdHsgb3B0aW9uX25hbWU6ICdzdGF0dXMnLCBhcGk6IHRoaXMudXNlcl9hcGkgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICdjb3VudHJ5JywgZmllbGRfbmFtZTogJ2NvdW50cnknLCBhcGk6IHRoaXMuY29tcGFueV9hcGkgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICdsYW5ndWFnZScsIGFwaTogdGhpcy5hcGkgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICdkYXRlX2Zvcm1hdCcsIGFwaTogdGhpcy5hcGkgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICd0aW1lX2Zvcm1hdCcsIGFwaTogdGhpcy5hcGkgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICd0aW1lX3VuaXRfZm9ybWF0JywgYXBpOiB0aGlzLmFwaSB9LFxuXHRcdFx0eyBvcHRpb25fbmFtZTogJ2Rpc3RhbmNlX2Zvcm1hdCcsIGFwaTogdGhpcy5hcGkgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICd0aW1lX3pvbmUnLCBhcGk6IHRoaXMuYXBpIH0sXG5cdFx0XHR7IG9wdGlvbl9uYW1lOiAnc3RhcnRfd2Vla19kYXknLCBhcGk6IHRoaXMuYXBpIH0sXG5cdFx0XHR7IG9wdGlvbl9uYW1lOiAnc2NoZWR1bGVfaWNhbGVuZGFyX3R5cGUnLCBhcGk6IHRoaXMuYXBpIH0sXG5cdFx0XHR7IG9wdGlvbl9uYW1lOiAnZGVmYXVsdF9sb2dpbl9zY3JlZW4nLCBhcGk6IHRoaXMuYXBpIH0sXG5cdFx0XHR7IG9wdGlvbl9uYW1lOiAnbm90aWZpY2F0aW9uX3N0YXR1cycsIGFwaTogdGhpcy5hcGkgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICdub3RpZmljYXRpb25fdHlwZScsIGFwaTogdGhpcy51c2VyX3ByZWZlcmVuY2Vfbm90aWZpY2F0aW9uX2FwaSB9LFxuXHRcdFx0eyBvcHRpb25fbmFtZTogJ3ByaW9yaXR5JywgYXBpOiB0aGlzLnVzZXJfcHJlZmVyZW5jZV9ub3RpZmljYXRpb25fYXBpIH0sXG5cdFx0XTtcblxuXHRcdHRoaXMuaW5pdERyb3BEb3duT3B0aW9ucyggb3B0aW9ucyApO1xuXG5cdFx0dGhpcy51c2VyX2dyb3VwX2FwaS5nZXRVc2VyR3JvdXAoICcnLCBmYWxzZSwgZmFsc2UsIHtcblx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRyZXMgPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdHJlcyA9IEdsb2JhbC5idWlsZFRyZWVSZWNvcmQoIHJlcyApO1xuXHRcdFx0XHQkdGhpcy51c2VyX2dyb3VwX2FycmF5ID0gcmVzO1xuXHRcdFx0XHRpZiAoICEkdGhpcy5zdWJfdmlld19tb2RlICYmICR0aGlzLmJhc2ljX3NlYXJjaF9maWVsZF91aV9kaWNbJ2dyb3VwX2lkJ10gKSB7XG5cdFx0XHRcdFx0JHRoaXMuYmFzaWNfc2VhcmNoX2ZpZWxkX3VpX2RpY1snZ3JvdXBfaWQnXS5zZXRTb3VyY2VEYXRhKCByZXMgKTtcblx0XHRcdFx0XHQkdGhpcy5hZHZfc2VhcmNoX2ZpZWxkX3VpX2RpY1snZ3JvdXBfaWQnXS5zZXRTb3VyY2VEYXRhKCByZXMgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG5cblx0aW5pdEluc2lkZUVkaXRvckRhdGEoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHZhciBmaWx0ZXIgPSB7fTtcblx0XHRmaWx0ZXIuZmlsdGVyX2RhdGEgPSB7fTtcblx0XHRmaWx0ZXIuZmlsdGVyX2RhdGEudXNlcl9pZCA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC51c2VyX2lkO1xuXG5cdFx0JHRoaXMudXNlcl9wcmVmZXJlbmNlX25vdGlmaWNhdGlvbl9hcGkuZ2V0VXNlclByZWZlcmVuY2VOb3RpZmljYXRpb24oIGZpbHRlciwgdHJ1ZSwge1xuXHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXMgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdHZhciBhcnJheV9kYXRhID0gW107XG5cdFx0XHRcdGZvciAoIHZhciBrZXkgaW4gZGF0YSApIHtcblxuXHRcdFx0XHRcdGlmICggIWRhdGEuaGFzT3duUHJvcGVydHkoIGtleSApICkge1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YXJyYXlfZGF0YS5wdXNoKCBkYXRhW2tleV0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhcnJheV9kYXRhID0gYXJyYXlfZGF0YS5zb3J0KCBmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdFx0XHRyZXR1cm4gJHRoaXMubm90aWZpY2F0aW9uX3R5cGVfYXJyYXkuZmluZEluZGV4KCBwID0+IHAuaWQgPT09IGEudHlwZV9pZCApIC0gJHRoaXMubm90aWZpY2F0aW9uX3R5cGVfYXJyYXkuZmluZEluZGV4KCBwID0+IHAuaWQgPT09IGIudHlwZV9pZCApO1xuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0JHRoaXMub3JpZ2luYWxfdXNlcl9wcmVmZXJlbmNlX25vdGlmaWNhdGlvbl9kYXRhID0gIF8ubWFwKGFycmF5X2RhdGEsIF8uY2xvbmUpO1xuXG5cdFx0XHRcdCR0aGlzLmVkaXRvci5zZXRWYWx1ZSggYXJyYXlfZGF0YSApO1xuXG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG5cblx0c2V0UHJvdmluY2UoIHZhbCwgbSApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0aWYgKCAhdmFsIHx8IHZhbCA9PT0gJy0xJyB8fCB2YWwgPT09ICcwJyApIHtcblx0XHRcdCR0aGlzLnByb3ZpbmNlX2FycmF5ID0gW107XG5cdFx0XHR0aGlzLmFkdl9zZWFyY2hfZmllbGRfdWlfZGljWydwcm92aW5jZSddLnNldFNvdXJjZURhdGEoIFtdICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuY29tcGFueV9hcGkuZ2V0T3B0aW9ucyggJ3Byb3ZpbmNlJywgdmFsLCB7XG5cdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdHJlcyA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRpZiAoICFyZXMgKSB7XG5cdFx0XHRcdFx0XHRyZXMgPSBbXTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQkdGhpcy5wcm92aW5jZV9hcnJheSA9IEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCByZXMgKTtcblx0XHRcdFx0XHQkdGhpcy5hZHZfc2VhcmNoX2ZpZWxkX3VpX2RpY1sncHJvdmluY2UnXS5zZXRTb3VyY2VEYXRhKCAkdGhpcy5wcm92aW5jZV9hcnJheSApO1xuXG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cdH1cblxuXHRlU2V0UHJvdmluY2UoIHZhbCwgcmVmcmVzaCApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBwcm92aW5jZV93aWRnZXQgPSAkdGhpcy5lZGl0X3ZpZXdfdWlfZGljWydwcm92aW5jZSddO1xuXG5cdFx0aWYgKCAhdmFsIHx8IHZhbCA9PT0gJy0xJyB8fCB2YWwgPT09ICcwJyApIHtcblx0XHRcdCR0aGlzLmVfcHJvdmluY2VfYXJyYXkgPSBbXTtcblx0XHRcdHByb3ZpbmNlX3dpZGdldC5zZXRTb3VyY2VEYXRhKCBbXSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmNvbXBhbnlfYXBpLmdldE9wdGlvbnMoICdwcm92aW5jZScsIHZhbCwge1xuXHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0XHRyZXMgPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0aWYgKCAhcmVzICkge1xuXHRcdFx0XHRcdFx0cmVzID0gW107XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0JHRoaXMuZV9wcm92aW5jZV9hcnJheSA9IEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCByZXMgKTtcblxuXHRcdFx0XHRcdGlmICggcmVmcmVzaCAmJiAkdGhpcy5lX3Byb3ZpbmNlX2FycmF5Lmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdFx0XHQkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnByb3ZpbmNlID0gJHRoaXMuZV9wcm92aW5jZV9hcnJheVswXS52YWx1ZTtcblx0XHRcdFx0XHRcdHByb3ZpbmNlX3dpZGdldC5zZXRWYWx1ZSggJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5wcm92aW5jZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwcm92aW5jZV93aWRnZXQuc2V0U291cmNlRGF0YSggJHRoaXMuZV9wcm92aW5jZV9hcnJheSApO1xuXG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cdH1cblxuXHRvblNldFNlYXJjaEZpbHRlckZpbmlzaGVkKCkge1xuXG5cdFx0aWYgKCB0aGlzLnNlYXJjaF9wYW5lbC5nZXRTZWxlY3RUYWJJbmRleCgpID09PSAxICkge1xuXHRcdFx0dmFyIGNvbWJvID0gdGhpcy5hZHZfc2VhcmNoX2ZpZWxkX3VpX2RpY1snY291bnRyeSddO1xuXHRcdFx0dmFyIHNlbGVjdF92YWx1ZSA9IGNvbWJvLmdldFZhbHVlKCk7XG5cdFx0XHR0aGlzLnNldFByb3ZpbmNlKCBzZWxlY3RfdmFsdWUgKTtcblx0XHR9XG5cdH1cblxuXHRvbkJ1aWxkQWR2VUlGaW5pc2hlZCgpIHtcblxuXHRcdHRoaXMuYWR2X3NlYXJjaF9maWVsZF91aV9kaWNbJ2NvdW50cnknXS5jaGFuZ2UoICQucHJveHkoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGNvbWJvID0gdGhpcy5hZHZfc2VhcmNoX2ZpZWxkX3VpX2RpY1snY291bnRyeSddO1xuXHRcdFx0dmFyIHNlbGVjdFZhbCA9IGNvbWJvLmdldFZhbHVlKCk7XG5cblx0XHRcdHRoaXMuc2V0UHJvdmluY2UoIHNlbGVjdFZhbCApO1xuXG5cdFx0XHR0aGlzLmFkdl9zZWFyY2hfZmllbGRfdWlfZGljWydwcm92aW5jZSddLnNldFZhbHVlKCBudWxsICk7XG5cblx0XHR9LCB0aGlzICkgKTtcblx0fVxuXG5cdGJ1aWxkU2VhcmNoRmllbGRzKCkge1xuXG5cdFx0dGhpcy5zZWFyY2hfZmllbGRzID0gW1xuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0VtcGxveWVlJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDEsXG5cdFx0XHRcdGZpZWxkOiAndXNlcl9pZCcsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3VzZXInLFxuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVVzZXIsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdTdGF0dXMnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICdzdGF0dXNfaWQnLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9vcHRpb25fY29sdW1uJyxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0ZpcnN0IE5hbWUnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICdmaXJzdF9uYW1lJyxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVRcblx0XHRcdH0gKSxcblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdMYXN0IE5hbWUnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICdsYXN0X25hbWUnLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVFxuXHRcdFx0fSApLFxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0VtcGxveWVlIE51bWJlcicgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAxLFxuXHRcdFx0XHRmaWVsZDogJ2VtcGxveWVlX251bWJlcicsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogZmFsc2UsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVFxuXHRcdFx0fSApLFxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0dyb3VwJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRmaWVsZDogJ2dyb3VwX2lkJyxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfdHJlZV9jb2x1bW4nLFxuXHRcdFx0XHR0cmVlX21vZGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0RlZmF1bHQgQnJhbmNoJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGZpZWxkOiAnZGVmYXVsdF9icmFuY2hfaWQnLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9icmFuY2gnLFxuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSUJyYW5jaCxcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0RlZmF1bHQgRGVwYXJ0bWVudCcgKSxcblx0XHRcdFx0ZmllbGQ6ICdkZWZhdWx0X2RlcGFydG1lbnRfaWQnLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2RlcGFydG1lbnQnLFxuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSURlcGFydG1lbnQsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1RpdGxlJyApLFxuXHRcdFx0XHRmaWVsZDogJ3RpdGxlX2lkJyxcblx0XHRcdFx0aW5fY29sdW1uOiAyLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9qb2JfdGl0bGUnLFxuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVVzZXJUaXRsZSxcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogZmFsc2UsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdDb3VudHJ5JyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDMsXG5cdFx0XHRcdGZpZWxkOiAnY291bnRyeScsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9vcHRpb25fY29sdW1uJyxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5DT01CT19CT1hcblx0XHRcdH0gKSxcblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdQcm92aW5jZS9TdGF0ZScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAzLFxuXHRcdFx0XHRmaWVsZDogJ3Byb3ZpbmNlJyxcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogZmFsc2UsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX29wdGlvbl9jb2x1bW4nLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9IClcblxuXHRcdF07XG5cdH1cblxuXHRvbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQsIGRvTm90VmFsaWRhdGUgKSB7XG5cdFx0dGhpcy5zZXRJc0NoYW5nZWQoIHRhcmdldCApO1xuXHRcdHRoaXMuc2V0TWFzc0VkaXRpbmdGaWVsZHNXaGVuRm9ybUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0dmFyIGtleSA9IHRhcmdldC5nZXRGaWVsZCgpO1xuXHRcdHZhciBjX3ZhbHVlID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gPSBjX3ZhbHVlO1xuXG5cdFx0aWYgKCBrZXkgPT09ICdzY2hlZHVsZV9pY2FsZW5kYXJfdHlwZV9pZCcgKSB7XG5cblx0XHRcdHRoaXMub25TdGF0dXNDaGFuZ2UoKTtcblx0XHR9IGVsc2UgaWYgKCBrZXkgPT09ICdub3RpZmljYXRpb25fc3RhdHVzX2lkJyApIHtcblx0XHRcdHRoaXMuaW5pdFN1Yk5vdGlmaWNhdGlvblZpZXcoKTtcblx0XHR9XG5cblx0XHRpZiAoICFkb05vdFZhbGlkYXRlICkge1xuXHRcdFx0dGhpcy52YWxpZGF0ZSgpO1xuXHRcdH1cblx0fVxuXG5cdGJ1aWxkRWRpdFZpZXdVSSgpIHtcblx0XHRzdXBlci5idWlsZEVkaXRWaWV3VUkoKTtcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHR2YXIgdGFiX21vZGVsID0ge1xuXHRcdFx0J3RhYl9wcmVmZXJlbmNlJzogeyAnbGFiZWwnOiAkLmkxOG4uXyggJ1ByZWZlcmVuY2VzJyApIH0sXG5cdFx0XHQndGFiX3ByZWZlcmVuY2VzX25vdGlmaWNhdGlvbic6IHtcblx0XHRcdFx0J2xhYmVsJzogJC5pMThuLl8oICdOb3RpZmljYXRpb25zJyApLFxuXHRcdFx0XHQnaW5pdF9jYWxsYmFjayc6ICdpbml0U3ViTm90aWZpY2F0aW9uVmlldycsXG5cdFx0XHRcdCdodG1sX3RlbXBsYXRlJzogdGhpcy5nZXRQcmVmZXJlbmNlc05vdGlmaWNhdGlvblRhYkh0bWwoKVxuXHRcdFx0fSxcblx0XHRcdCd0YWJfc2NoZWR1bGVfc3luYyc6IHtcblx0XHRcdFx0J2xhYmVsJzogJC5pMThuLl8oICdTY2hlZHVsZSBTeW5jaHJvbml6YXRpb24nICksXG5cdFx0XHRcdCdpbml0X2NhbGxiYWNrJzogJ2luaXRTdWJTY2hlZHVsZVN5bmNWaWV3Jyxcblx0XHRcdFx0J2h0bWxfdGVtcGxhdGUnOiB0aGlzLmdldFNjaGVkdWxlU3luY3Jvbml6YXRpb25UYWJIdG1sKClcblx0XHRcdH0sXG5cdFx0XHQndGFiX2F1ZGl0JzogdHJ1ZSxcblx0XHR9O1xuXHRcdHRoaXMuc2V0VGFiTW9kZWwoIHRhYl9tb2RlbCApO1xuXG5cdFx0dGhpcy5uYXZpZ2F0aW9uLkFDb21ib0JveCgge1xuXHRcdFx0aWQ6IHRoaXMuc2NyaXB0X25hbWUgKyAnX25hdmlnYXRpb24nLFxuXHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElVc2VyUHJlZmVyZW5jZSxcblx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF91c2VyX3ByZWZlcmVuY2UnLFxuXHRcdFx0bmF2aWdhdGlvbl9tb2RlOiB0cnVlLFxuXHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlXG5cdFx0fSApO1xuXG5cdFx0dGhpcy5zZXROYXZpZ2F0aW9uKCk7XG5cblx0XHQvL1RhYiAwIHN0YXJ0XG5cblx0XHR2YXIgdGFiX3ByZWZlcmVuY2UgPSB0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfcHJlZmVyZW5jZScgKTtcblxuXHRcdHZhciB0YWJfcHJlZmVyZW5jZV9jb2x1bW4xID0gdGFiX3ByZWZlcmVuY2UuZmluZCggJy5maXJzdC1jb2x1bW4nICk7XG5cblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzBdID0gW107XG5cblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzBdLnB1c2goIHRhYl9wcmVmZXJlbmNlX2NvbHVtbjEgKTtcblxuXHRcdHZhciBmb3JtX2l0ZW1faW5wdXQ7XG5cdFx0dmFyIHdpZGdldENvbnRhaW5lcjtcblx0XHR2YXIgbGFiZWw7XG5cblx0XHRpZiAoICF0aGlzLmlzX21hc3NfZWRpdGluZyApIHtcblx0XHRcdC8vIEVtcGxveWVlXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2Z1bGxfbmFtZScgfSApO1xuXHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdFbXBsb3llZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcHJlZmVyZW5jZV9jb2x1bW4xLCAnJyApO1xuXHRcdH1cblxuXHRcdC8vIExhbmd1YWdlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVENvbWJvQm94KCB7IGZpZWxkOiAnbGFuZ3VhZ2UnLCBzZXRfZW1wdHk6IHRydWUgfSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5zZXRTb3VyY2VEYXRhKCAkdGhpcy5sYW5ndWFnZV9hcnJheSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnTGFuZ3VhZ2UnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3ByZWZlcmVuY2VfY29sdW1uMSApO1xuXG5cdFx0Ly8gRGF0ZSBGb3JtYXRcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdkYXRlX2Zvcm1hdCcsIHNldF9lbXB0eTogdHJ1ZSB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLmRhdGVfZm9ybWF0X2FycmF5ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdEYXRlIEZvcm1hdCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcHJlZmVyZW5jZV9jb2x1bW4xICk7XG5cblx0XHQvLyBUaW1lIEZvcm1hdFxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ3RpbWVfZm9ybWF0Jywgc2V0X2VtcHR5OiB0cnVlIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMudGltZV9mb3JtYXRfYXJyYXkgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1RpbWUgRm9ybWF0JyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9wcmVmZXJlbmNlX2NvbHVtbjEgKTtcblxuXHRcdC8vIFRpbWUgVW5pdHNcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICd0aW1lX3VuaXRfZm9ybWF0Jywgc2V0X2VtcHR5OiB0cnVlIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMudGltZV91bml0X2Zvcm1hdF9hcnJheSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnVGltZSBVbml0cycgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcHJlZmVyZW5jZV9jb2x1bW4xICk7XG5cblx0XHQvLyBEaXN0YW5jZSBVbml0c1xuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ2Rpc3RhbmNlX2Zvcm1hdCcsIHNldF9lbXB0eTogdHJ1ZSB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLmRpc3RhbmNlX2Zvcm1hdF9hcnJheSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRGlzdGFuY2UgVW5pdHMnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3ByZWZlcmVuY2VfY29sdW1uMSApO1xuXG5cdFx0Ly8gVGltZSBab25lXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVENvbWJvQm94KCB7IGZpZWxkOiAndGltZV96b25lJywgc2V0X2VtcHR5OiB0cnVlIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMudGltZV96b25lX2FycmF5ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdUaW1lIFpvbmUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3ByZWZlcmVuY2VfY29sdW1uMSApO1xuXG5cdFx0Ly8gU3RhcnQgV2Vla3Mgb25cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdzdGFydF93ZWVrX2RheScgfSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5zZXRTb3VyY2VEYXRhKCAkdGhpcy5zdGFydF93ZWVrX2RheV9hcnJheSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQ2FsZW5kYXIgU3RhcnRzIE9uJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9wcmVmZXJlbmNlX2NvbHVtbjEgKTtcblxuXHRcdC8vIFJvd3MgcGVyIHBhZ2Vcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2l0ZW1zX3Blcl9wYWdlJywgd2lkdGg6IDUwIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1Jvd3MgcGVyIHBhZ2UnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3ByZWZlcmVuY2VfY29sdW1uMSApO1xuXG5cdFx0Ly8gRGVmYXVsdCBMb2dpbiBTY3JlZW5cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdkZWZhdWx0X2xvZ2luX3NjcmVlbicgfSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5zZXRTb3VyY2VEYXRhKCAkdGhpcy5kZWZhdWx0X2xvZ2luX3NjcmVlbl9hcnJheSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRGVmYXVsdCBTY3JlZW4nICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3ByZWZlcmVuY2VfY29sdW1uMSApO1xuXG5cdFx0Ly8gU2F2ZSBUaW1lU2hlZXQgU3RhdGVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNIRUNLQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDaGVja2JveCggeyBmaWVsZDogJ2VuYWJsZV9zYXZlX3RpbWVzaGVldF9zdGF0ZScgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnU2F2ZSBUaW1lU2hlZXQgU3RhdGUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3ByZWZlcmVuY2VfY29sdW1uMSApO1xuXG5cblx0XHQvL1RhYiAxIHN0YXJ0XG5cdFx0dmFyIHRhYl9wcmVmZXJlbmNlc19ub3RpZmljYXRpb24gPSB0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfcHJlZmVyZW5jZXNfbm90aWZpY2F0aW9uJyApO1xuXG5cdFx0dmFyIHRhYl9wcmVmZXJlbmNlc19ub3RpZmljYXRpb25fY29sdW1uMSA9IHRhYl9wcmVmZXJlbmNlc19ub3RpZmljYXRpb24uZmluZCggJy5maXJzdC1jb2x1bW4nICk7XG5cblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzFdID0gW107XG5cblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzFdLnB1c2goIHRhYl9wcmVmZXJlbmNlc19ub3RpZmljYXRpb25fY29sdW1uMSApO1xuXG5cdFx0Ly8gUHVzaCBOb3RpZmljYXRpb25zIEVuYWJsZWRcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdub3RpZmljYXRpb25fc3RhdHVzX2lkJyB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoIEdsb2JhbC5hZGRGaXJzdEl0ZW1Ub0FycmF5KCAkdGhpcy5ub3RpZmljYXRpb25fc3RhdHVzX2FycmF5ICkgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ05vdGlmaWNhdGlvbiBTdGF0dXMnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3ByZWZlcmVuY2VzX25vdGlmaWNhdGlvbl9jb2x1bW4xICk7XG5cblx0XHQvLyBOb3RpZmljYXRpb24gZHVyYXRpb25cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ25vdGlmaWNhdGlvbl9kdXJhdGlvbicsIHdpZHRoOiA1MCB9ICk7XG5cblx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXHRcdGxhYmVsID0gJCggJzxzcGFuIGNsYXNzPVxcJ3dpZGdldC1yaWdodC1sYWJlbFxcJz4gJyArICQuaTE4bi5fKCAnU2Vjb25kcyAoVXNlIDAgZm9yIGluZmluaXRlKScgKSArICc8L3NwYW4+JyApO1xuXG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggbGFiZWwgKTtcblxuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRGlzcGxheSBOb3RpZmljYXRpb25zIEZvcicgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfcHJlZmVyZW5jZXNfbm90aWZpY2F0aW9uX2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIgKTtcblxuXHRcdGlmICggdGhpcy5pc19tYXNzX2VkaXRpbmcgPT0gZmFsc2UgKSB7XG5cdFx0XHR2YXIgaW5zaWRlX2VkaXRvcl9kaXYgPSB0YWJfcHJlZmVyZW5jZXNfbm90aWZpY2F0aW9uLmZpbmQoICcuaW5zaWRlLWVkaXRvci1kaXYnICk7XG5cdFx0XHR2YXIgYXJncyA9IHtcblx0XHRcdFx0ZW5hYmxlZDogJC5pMThuLl8oICdFbmFibGVkJyApLFxuXHRcdFx0XHRuYW1lOiAkLmkxOG4uXyggJ1R5cGUnICksXG5cdFx0XHRcdHdlYjogJC5pMThuLl8oICdCcm93c2VyJyApLFxuXHRcdFx0XHRlbWFpbF93b3JrOiAkLmkxOG4uXyggJ1dvcmsgRW1haWwnICksXG5cdFx0XHRcdGVtYWlsX2hvbWU6ICQuaTE4bi5fKCAnSG9tZSBFbWFpbCcgKSxcblx0XHRcdFx0YXBwOiAkLmkxOG4uXyggJ01vYmlsZSBBcHAnICksXG5cdFx0XHRcdHByaW9yaXR5OiAkLmkxOG4uXyggJ1ByaW9yaXR5JyApLFxuXHRcdFx0XHRzZXR0aW5nczogJC5pMThuLl8oICdTZXR0aW5ncycgKVxuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5lZGl0b3IgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLklOU0lERV9FRElUT1IgKTtcblxuXHRcdFx0dGhpcy5lZGl0b3IuSW5zaWRlRWRpdG9yKCB7XG5cdFx0XHRcdHRpdGxlOiAnJyxcblx0XHRcdFx0YWRkUm93OiB0aGlzLmluc2lkZUVkaXRvckFkZFJvdyxcblx0XHRcdFx0Z2V0VmFsdWU6IHRoaXMuaW5zaWRlRWRpdG9yR2V0VmFsdWUsXG5cdFx0XHRcdHNldFZhbHVlOiB0aGlzLmluc2lkZUVkaXRvclNldFZhbHVlLFxuXHRcdFx0XHRwYXJlbnRfY29udHJvbGxlcjogdGhpcyxcblx0XHRcdFx0cmVuZGVyOiBnZXRSZW5kZXIoKSxcblx0XHRcdFx0cmVuZGVyX2FyZ3M6IGFyZ3MsXG5cdFx0XHRcdHJlbmRlcl9pbmxpbmVfaHRtbDogdHJ1ZSxcblx0XHRcdFx0cm93X3JlbmRlcjogZ2V0Um93UmVuZGVyKClcblx0XHRcdH0gKTtcblxuXHRcdFx0ZnVuY3Rpb24gZ2V0UmVuZGVyKCkge1xuXHRcdFx0XHRyZXR1cm4gYFxuXHRcdFx0PHRhYmxlIGNsYXNzPVwiaW5zaWRlLWVkaXRvci1yZW5kZXJcIj5cblx0XHRcdFx0PHRyIGNsYXNzPVwidGl0bGVcIj5cblx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJ3aWR0aDogNTBweFwiPjwlPSBlbmFibGVkICU+PC90ZD5cblx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJ3aWR0aDogNDAwcHhcIj48JT0gbmFtZSAlPjwvdGQ+XG5cdFx0XHRcdFx0PHRkIHN0eWxlPVwid2lkdGg6IDE1MHB4XCI+PCU9IHByaW9yaXR5ICU+PC90ZD5cblx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJ3aWR0aDogMTEwcHhcIj48JT0gd2ViICU+PC90ZD5cblx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJ3aWR0aDogMTEwcHhcIj48JT0gZW1haWxfd29yayAlPjwvdGQ+XG5cdFx0XHRcdFx0PHRkIHN0eWxlPVwid2lkdGg6IDExMHB4XCI+PCU9IGVtYWlsX2hvbWUgJT48L3RkPlxuXHRcdFx0XHRcdDx0ZCBzdHlsZT1cIndpZHRoOiAxMTBweFwiPjwlPSBhcHAgJT48L3RkPlxuXHRcdFx0XHRcdDx0ZCBzdHlsZT1cIndpZHRoOiAyMDBweFwiPjwlPSBzZXR0aW5ncyAlPjwvdGQ+XG5cdFx0XHRcdDwvdHI+XG5cdFx0XHQ8L3RhYmxlPmA7XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGdldFJvd1JlbmRlcigpIHtcblx0XHRcdFx0cmV0dXJuIGBcblx0XHRcdDx0ciBjbGFzcz1cImluc2lkZS1lZGl0b3Itcm93IGRhdGEtcm93XCI+XG5cdFx0XHRcdDx0ZCBjbGFzcz1cImNlbGxcIj48L3RkPlxuXHRcdFx0XHQ8dGQgY2xhc3M9XCJjZWxsXCI+PC90ZD5cblx0XHRcdFx0PHRkIGNsYXNzPVwiY2VsbFwiPjwvdGQ+XG5cdFx0XHRcdDx0ZCBjbGFzcz1cImNlbGxcIj48L3RkPlxuXHRcdFx0XHQ8dGQgY2xhc3M9XCJjZWxsXCI+PC90ZD5cblx0XHRcdFx0PHRkIGNsYXNzPVwiY2VsbFwiPjwvdGQ+XG5cdFx0XHRcdDx0ZCBjbGFzcz1cImNlbGxcIj48L3RkPlxuXHRcdFx0XHQ8dGQgY2xhc3M9XCJjZWxsXCI+PC90ZD5cblx0XHRcdDwvdHI+YDtcblx0XHRcdH1cblxuXHRcdFx0aW5zaWRlX2VkaXRvcl9kaXYuYXBwZW5kKCB0aGlzLmVkaXRvciApO1xuXHRcdH1cblxuXHRcdC8vVGFiIDIgc3RhcnRcblxuXHRcdHZhciB0YWJfc2NoZWR1bGVfc3luYyA9IHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYl9zY2hlZHVsZV9zeW5jJyApO1xuXG5cdFx0dmFyIHRhYl9zY2hlZHVsZV9zeW5jX2NvbHVtbjEgPSB0YWJfc2NoZWR1bGVfc3luYy5maW5kKCAnLmZpcnN0LWNvbHVtbicgKTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMl0gPSBbXTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMl0ucHVzaCggdGFiX3NjaGVkdWxlX3N5bmNfY29sdW1uMSApO1xuXG5cdFx0Ly8vLyBzY2hlZHVsZSBpY2FsZW5kYXIgdHlwZVxuXHRcdC8vZm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHQvL2Zvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHtmaWVsZDogJ3NjaGVkdWxlX2ljYWxlbmRhcl90eXBlX2lkJyB9ICk7XG5cdFx0Ly9mb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMuc2NoZWR1bGVfaWNhbGVuZGFyX3R5cGVfYXJyYXkgKTtcblx0XHQvL3RoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnU3RhdHVzJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9zY2hlZHVsZV9zeW5jX2NvbHVtbjEsICdmaXJzdC1sYXN0JyApO1xuXHRcdC8vXG5cdFx0Ly8vLyBDYWxlbmRhciBVUkxcblx0XHQvL2Zvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdC8vZm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7ZmllbGQ6ICdjYWxlbmRhcl91cmwnIH0gKTtcblx0XHQvL2Zvcm1faXRlbV9pbnB1dC5hZGRDbGFzcyggJ2xpbmsnICk7XG5cdFx0Ly90aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0NhbGVuZGFyIFVSTCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfc2NoZWR1bGVfc3luY19jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0Ly8gU2hpZnRzIFNjaGVkdWxlZCB0byBXb3JrXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5TRVBBUkFURURfQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlNlcGFyYXRlZEJveCggeyBsYWJlbDogJC5pMThuLl8oICdTaGlmdHMgU2NoZWR1bGVkIHRvIFdvcmsnICkgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oIG51bGwsIGZvcm1faXRlbV9pbnB1dCwgdGFiX3NjaGVkdWxlX3N5bmNfY29sdW1uMSwgJycsIG51bGwsIHRydWUsIGZhbHNlLCAnc2hpZnRzX3NjaGVkdWxlZF90b193b3JrJyApO1xuXG5cdFx0Ly8gQWxhcm0gMVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnc2NoZWR1bGVfaWNhbGVuZGFyX2FsYXJtMV93b3JraW5nJywgd2lkdGg6IDkwLCBuZWVkX3BhcnNlcl9zZWM6IHRydWUgfSApO1xuXG5cdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblx0XHRsYWJlbCA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtcmlnaHQtbGFiZWxcXCc+KCAnICsgJC5pMThuLl8oICdiZWZvcmUgc2NoZWR1bGUgc3RhcnQgdGltZScgKSArICcgKTwvc3Bhbj4nICk7XG5cblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBsYWJlbCApO1xuXG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdBbGFybSAxJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9zY2hlZHVsZV9zeW5jX2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIsIHRydWUgKTtcblxuXHRcdC8vIEFsYXJtIDJcblxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnc2NoZWR1bGVfaWNhbGVuZGFyX2FsYXJtMl93b3JraW5nJywgd2lkdGg6IDkwLCBuZWVkX3BhcnNlcl9zZWM6IHRydWUgfSApO1xuXG5cdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblx0XHRsYWJlbCA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtcmlnaHQtbGFiZWxcXCc+KCAnICsgJC5pMThuLl8oICdiZWZvcmUgc2NoZWR1bGUgc3RhcnQgdGltZScgKSArICcgKTwvc3Bhbj4nICk7XG5cblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBsYWJlbCApO1xuXG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdBbGFybSAyJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9zY2hlZHVsZV9zeW5jX2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIsIHRydWUgKTtcblxuXHRcdC8vIFNoaWZ0cyBTY2hlZHVsZWQgQWJzZW50XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlNFUEFSQVRFRF9CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuU2VwYXJhdGVkQm94KCB7IGxhYmVsOiAkLmkxOG4uXyggJ1NoaWZ0cyBTY2hlZHVsZWQgQWJzZW50JyApIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCBudWxsLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9zY2hlZHVsZV9zeW5jX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlLCBmYWxzZSwgJ3NoaWZ0c19zY2hlZHVsZWRfYWJzZW50JyApO1xuXG5cdFx0Ly8gQWxhcm0gMVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnc2NoZWR1bGVfaWNhbGVuZGFyX2FsYXJtMV9hYnNlbmNlJywgd2lkdGg6IDkwLCBuZWVkX3BhcnNlcl9zZWM6IHRydWUgfSApO1xuXG5cdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblx0XHRsYWJlbCA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtcmlnaHQtbGFiZWxcXCc+KCAnICsgJC5pMThuLl8oICdiZWZvcmUgc2NoZWR1bGUgc3RhcnQgdGltZScgKSArICcgKTwvc3Bhbj4nICk7XG5cblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBsYWJlbCApO1xuXG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdBbGFybSAxJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9zY2hlZHVsZV9zeW5jX2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIsIHRydWUgKTtcblxuXHRcdC8vIEFsYXJtIDJcblxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnc2NoZWR1bGVfaWNhbGVuZGFyX2FsYXJtMl9hYnNlbmNlJywgd2lkdGg6IDkwLCBuZWVkX3BhcnNlcl9zZWM6IHRydWUgfSApO1xuXG5cdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblx0XHRsYWJlbCA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtcmlnaHQtbGFiZWxcXCc+KCAnICsgJC5pMThuLl8oICdiZWZvcmUgc2NoZWR1bGUgc3RhcnQgdGltZScgKSArICcgKTwvc3Bhbj4nICk7XG5cblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBsYWJlbCApO1xuXG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdBbGFybSAyJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9zY2hlZHVsZV9zeW5jX2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIsIHRydWUgKTtcblxuXHRcdC8vIE1vZGlmaWVkIFNoaWZ0c1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5TRVBBUkFURURfQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlNlcGFyYXRlZEJveCggeyBsYWJlbDogJC5pMThuLl8oICdNb2RpZmllZCBTaGlmdHMnICkgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oIG51bGwsIGZvcm1faXRlbV9pbnB1dCwgdGFiX3NjaGVkdWxlX3N5bmNfY29sdW1uMSwgJycsIG51bGwsIHRydWUsIGZhbHNlLCAnbW9kaWZpZWRfc2hpZnRzJyApO1xuXG5cdFx0Ly8gQWxhcm0gMVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnc2NoZWR1bGVfaWNhbGVuZGFyX2FsYXJtMV9tb2RpZmllZCcsIHdpZHRoOiA5MCwgbmVlZF9wYXJzZXJfc2VjOiB0cnVlIH0gKTtcblxuXHRcdHdpZGdldENvbnRhaW5lciA9ICQoICc8ZGl2IGNsYXNzPVxcJ3dpZGdldC1oLWJveFxcJz48L2Rpdj4nICk7XG5cdFx0bGFiZWwgPSAkKCAnPHNwYW4gY2xhc3M9XFwnd2lkZ2V0LXJpZ2h0LWxhYmVsXFwnPiggJyArICQuaTE4bi5fKCAnYmVmb3JlIHNjaGVkdWxlIHN0YXJ0IHRpbWUnICkgKyAnICk8L3NwYW4+JyApO1xuXG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggbGFiZWwgKTtcblxuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQWxhcm0gMScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfc2NoZWR1bGVfc3luY19jb2x1bW4xLCAnJywgd2lkZ2V0Q29udGFpbmVyLCB0cnVlICk7XG5cblx0XHQvLyBBbGFybSAyXG5cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ3NjaGVkdWxlX2ljYWxlbmRhcl9hbGFybTJfbW9kaWZpZWQnLCB3aWR0aDogOTAsIG5lZWRfcGFyc2VyX3NlYzogdHJ1ZSB9ICk7XG5cblx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXHRcdGxhYmVsID0gJCggJzxzcGFuIGNsYXNzPVxcJ3dpZGdldC1yaWdodC1sYWJlbFxcJz4oICcgKyAkLmkxOG4uXyggJ2JlZm9yZSBzY2hlZHVsZSBzdGFydCB0aW1lJyApICsgJyApPC9zcGFuPicgKTtcblxuXHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGxhYmVsICk7XG5cblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0FsYXJtIDInICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3NjaGVkdWxlX3N5bmNfY29sdW1uMSwgJycsIHdpZGdldENvbnRhaW5lciwgdHJ1ZSApO1xuXHR9XG5cblx0b25NYXNzRWRpdENsaWNrKCkge1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHQkdGhpcy5pc19hZGQgPSBmYWxzZTtcblx0XHQkdGhpcy5pc192aWV3aW5nID0gZmFsc2U7XG5cdFx0JHRoaXMuaXNfbWFzc19lZGl0aW5nID0gdHJ1ZTtcblx0XHRMb2NhbENhY2hlRGF0YS5jdXJyZW50X2RvaW5nX2NvbnRleHRfYWN0aW9uID0gJ21hc3NfZWRpdCc7XG5cdFx0JHRoaXMub3BlbkVkaXRWaWV3KCk7XG5cdFx0dmFyIGZpbHRlciA9IHt9O1xuXHRcdHZhciBncmlkX3NlbGVjdGVkX2lkX2FycmF5ID0gdGhpcy5nZXRHcmlkU2VsZWN0SWRBcnJheSgpO1xuXHRcdHZhciBncmlkX3NlbGVjdGVkX2xlbmd0aCA9IGdyaWRfc2VsZWN0ZWRfaWRfYXJyYXkubGVuZ3RoO1xuXHRcdHRoaXMubWFzc19lZGl0X3JlY29yZF9pZHMgPSBbXTtcblxuXHRcdCQuZWFjaCggZ3JpZF9zZWxlY3RlZF9pZF9hcnJheSwgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHtcblx0XHRcdCR0aGlzLm1hc3NfZWRpdF9yZWNvcmRfaWRzLnB1c2goIHZhbHVlICk7XG5cdFx0fSApO1xuXG5cdFx0ZmlsdGVyLmZpbHRlcl9kYXRhID0ge307XG5cdFx0ZmlsdGVyLmZpbHRlcl9kYXRhLmlkID0gdGhpcy5tYXNzX2VkaXRfcmVjb3JkX2lkcztcblxuXHRcdHRoaXMuYXBpWydnZXRDb21tb24nICsgdGhpcy5hcGkua2V5X25hbWUgKyAnRGF0YSddKCBmaWx0ZXIsIHtcblx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cblx0XHRcdFx0aWYgKCAhcmVzdWx0X2RhdGEgKSB7XG5cdFx0XHRcdFx0cmVzdWx0X2RhdGEgPSBbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCR0aGlzLnVuaXF1ZV9jb2x1bW5zID0gW107XG5cdFx0XHRcdCR0aGlzLmxpbmtlZF9jb2x1bW5zID0gW107XG5cblx0XHRcdFx0JHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCA9IHJlc3VsdF9kYXRhO1xuXHRcdFx0XHQkdGhpcy5pbml0RWRpdFZpZXcoKTtcblxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdG9uU3RhdHVzQ2hhbmdlKCkge1xuXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc2NoZWR1bGVfaWNhbGVuZGFyX3R5cGVfaWQgPT0gMCApIHtcblx0XHRcdC8vdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1snY2FsZW5kYXJfdXJsJ10uY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnc2NoZWR1bGVfaWNhbGVuZGFyX2FsYXJtMV93b3JraW5nJyApO1xuXHRcdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnc2NoZWR1bGVfaWNhbGVuZGFyX2FsYXJtMl93b3JraW5nJyApO1xuXHRcdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnc2NoZWR1bGVfaWNhbGVuZGFyX2FsYXJtMV9hYnNlbmNlJyApO1xuXHRcdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnc2NoZWR1bGVfaWNhbGVuZGFyX2FsYXJtMl9hYnNlbmNlJyApO1xuXHRcdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnc2NoZWR1bGVfaWNhbGVuZGFyX2FsYXJtMV9tb2RpZmllZCcgKTtcblx0XHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ3NjaGVkdWxlX2ljYWxlbmRhcl9hbGFybTJfbW9kaWZpZWQnICk7XG5cdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdzaGlmdHNfc2NoZWR1bGVkX3RvX3dvcmsnICk7XG5cdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdzaGlmdHNfc2NoZWR1bGVkX2Fic2VudCcgKTtcblx0XHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ21vZGlmaWVkX3NoaWZ0cycgKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvL3RoaXMuc2V0Q2FsZW5kYXJVUkwoKTtcblx0XHRcdC8vdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1snY2FsZW5kYXJfdXJsJ10uY3NzKCAnZGlzcGxheScsICdibG9jaycgKTtcblx0XHRcdHRoaXMuYXR0YWNoRWxlbWVudCggJ3NjaGVkdWxlX2ljYWxlbmRhcl9hbGFybTFfd29ya2luZycgKTtcblx0XHRcdHRoaXMuYXR0YWNoRWxlbWVudCggJ3NjaGVkdWxlX2ljYWxlbmRhcl9hbGFybTJfd29ya2luZycgKTtcblx0XHRcdHRoaXMuYXR0YWNoRWxlbWVudCggJ3NjaGVkdWxlX2ljYWxlbmRhcl9hbGFybTFfYWJzZW5jZScgKTtcblx0XHRcdHRoaXMuYXR0YWNoRWxlbWVudCggJ3NjaGVkdWxlX2ljYWxlbmRhcl9hbGFybTJfYWJzZW5jZScgKTtcblx0XHRcdHRoaXMuYXR0YWNoRWxlbWVudCggJ3NjaGVkdWxlX2ljYWxlbmRhcl9hbGFybTFfbW9kaWZpZWQnICk7XG5cdFx0XHR0aGlzLmF0dGFjaEVsZW1lbnQoICdzY2hlZHVsZV9pY2FsZW5kYXJfYWxhcm0yX21vZGlmaWVkJyApO1xuXHRcdFx0dGhpcy5hdHRhY2hFbGVtZW50KCAnc2hpZnRzX3NjaGVkdWxlZF90b193b3JrJyApO1xuXHRcdFx0dGhpcy5hdHRhY2hFbGVtZW50KCAnc2hpZnRzX3NjaGVkdWxlZF9hYnNlbnQnICk7XG5cdFx0XHR0aGlzLmF0dGFjaEVsZW1lbnQoICdtb2RpZmllZF9zaGlmdHMnICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5lZGl0RmllbGRSZXNpemUoKTtcblx0fVxuXG5cdHNldEN1cnJlbnRFZGl0UmVjb3JkRGF0YSgpIHtcblxuXHRcdC8vU2V0IGN1cnJlbnQgZWRpdCByZWNvcmQgZGF0YSB0byBhbGwgd2lkZ2V0c1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgKSB7XG5cdFx0XHR2YXIgd2lkZ2V0ID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljW2tleV07XG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggd2lkZ2V0ICkgKSB7XG5cdFx0XHRcdHN3aXRjaCAoIGtleSApIHtcblx0XHRcdFx0XHRjYXNlICdmdWxsX25hbWUnOlxuXHRcdFx0XHRcdFx0d2lkZ2V0LnNldFZhbHVlKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2ZpcnN0X25hbWUnXSArICcgJyArIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnbGFzdF9uYW1lJ10gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuLy9cdFx0XHRcdFx0Y2FzZSAnc2NoZWR1bGVfaWNhbGVuZGFyX2FsYXJtMV93b3JraW5nJzpcbi8vXHRcdFx0XHRcdGNhc2UgJ3NjaGVkdWxlX2ljYWxlbmRhcl9hbGFybTJfd29ya2luZyc6XG4vL1x0XHRcdFx0XHRjYXNlICdzY2hlZHVsZV9pY2FsZW5kYXJfYWxhcm0xX2Fic2VuY2UnOlxuLy9cdFx0XHRcdFx0Y2FzZSAnc2NoZWR1bGVfaWNhbGVuZGFyX2FsYXJtMl9hYnNlbmNlJzpcbi8vXHRcdFx0XHRcdGNhc2UgJ3NjaGVkdWxlX2ljYWxlbmRhcl9hbGFybTFfbW9kaWZpZWQnOlxuLy9cdFx0XHRcdFx0Y2FzZSAnc2NoZWR1bGVfaWNhbGVuZGFyX2FsYXJtMl9tb2RpZmllZCc6XG4vL1x0XHRcdFx0XHRcdHZhciByZXN1bHQgPSBHbG9iYWwuZ2V0VGltZVVuaXQoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldIClcbi8vXHRcdFx0XHRcdFx0d2lkZ2V0LnNldFZhbHVlKCByZXN1bHQgKTtcbi8vXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmNvbGxlY3RVSURhdGFUb0N1cnJlbnRFZGl0UmVjb3JkKCk7XG5cblx0XHR0aGlzLnNldEVkaXRWaWV3RGF0YURvbmUoKTtcblx0fVxuXG5cdHNldEVkaXRWaWV3RGF0YURvbmUoKSB7XG5cdFx0c3VwZXIuc2V0RWRpdFZpZXdEYXRhRG9uZSgpO1xuXHRcdHRoaXMub25TdGF0dXNDaGFuZ2UoKTtcblx0XHRpZiAoIHRoaXMuaXNfbWFzc19lZGl0aW5nID09IGZhbHNlICkge1xuXHRcdFx0dGhpcy5pbml0SW5zaWRlRWRpdG9yRGF0YSgpO1xuXHRcdH1cblx0fVxuXG5cdHNldENhbGVuZGFyVVJMKCB3aWRnZXQgKSB7XG5cblx0XHRpZiAoICFHbG9iYWwuaXNTZXQoIHdpZGdldCApICkge1xuXHRcdFx0d2lkZ2V0ID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljWydjYWxlbmRhcl91cmwnXTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuaXNfbWFzc19lZGl0aW5nICkge1xuXHRcdFx0d2lkZ2V0LnNldFZhbHVlKCAnTm90IGF2YWlsYWJsZSB3aGVuIG1hc3MgZWRpdGluZycgKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLmFwaVsnZ2V0U2NoZWR1bGVJY2FsZW5kYXJVUkwnXSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnVzZXJfbmFtZSwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnNjaGVkdWxlX2ljYWxlbmRhcl90eXBlX2lkLCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIFNlcnZpY2VDYWxsZXIucm9vdF91cmwgKyByZXN1bHRfZGF0YSwgdHJ1ZSApO1xuXG5cdFx0XHRcdHdpZGdldC51bmJpbmQoICdjbGljaycgKTsgLy8gRmlyc3QgdW5iaW5kIGFsbCBjbGljayBldmVudHMsIG90aGVyd2lzZSwgd2hlbiB3ZSBjaGFuZ2UgdGhlIHNjaGVkdWxlIGljYWxlbmRhciB0eXBlIHRoaXMgd2lsbCB0cmlnZ2VyIHNldmVyYWwgdGltZXMgY2xpY2sgZXZlbnRzLlxuXG5cdFx0XHRcdHdpZGdldC5jbGljayggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0d2luZG93Lm9wZW4oIHdpZGdldC50ZXh0KCkgKTtcblx0XHRcdFx0fSApO1xuXG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG5cblx0aW5pdFN1YlNjaGVkdWxlU3luY1ZpZXcoKSB7XG5cdFx0aWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSApIHtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYl9zY2hlZHVsZV9zeW5jJyApLmZpbmQoICcuZmlyc3QtY29sdW1uJyApLmNzcyggJ2Rpc3BsYXknLCAnYmxvY2snICk7XG5cdFx0XHR0aGlzLmVkaXRfdmlldy5maW5kKCAnLnBlcm1pc3Npb24tZGVmaW5lZC1kaXYnICkuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0dGhpcy5idWlsZENvbnRleHRNZW51KCB0cnVlICk7XG5cdFx0XHR0aGlzLnNldEVkaXRNZW51KCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYl9zY2hlZHVsZV9zeW5jJyApLmZpbmQoICcuZmlyc3QtY29sdW1uJyApLmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdHRoaXMuZWRpdF92aWV3LmZpbmQoICcucGVybWlzc2lvbi1kZWZpbmVkLWRpdicgKS5jc3MoICdkaXNwbGF5JywgJ2Jsb2NrJyApO1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXcuZmluZCggJy5wZXJtaXNzaW9uLW1lc3NhZ2UnICkuaHRtbCggR2xvYmFsLmdldFVwZ3JhZGVNZXNzYWdlKCkgKTtcblx0XHR9XG5cdH1cblxuXHRpbml0U3ViTm90aWZpY2F0aW9uVmlldygpIHtcblx0XHRpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5ub3RpZmljYXRpb25fc3RhdHVzX2lkID09IDAgKSB7XG5cdFx0XHR0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfcHJlZmVyZW5jZXNfbm90aWZpY2F0aW9uJyApLmZpbmQoICcuaW5zaWRlLWVkaXRvci1kaXYnICkuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydub3RpZmljYXRpb25fZHVyYXRpb24nXS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYl9wcmVmZXJlbmNlc19ub3RpZmljYXRpb24nICkuZmluZCggJy5pbnNpZGUtZWRpdG9yLWRpdicgKS5jc3MoICdkaXNwbGF5JywgJ2Jsb2NrJyApO1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydub3RpZmljYXRpb25fZHVyYXRpb24nXS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5jc3MoICdkaXNwbGF5JywgJ2Jsb2NrJyApO1xuXHRcdH1cblx0fVxuXG5cdGluc2lkZUVkaXRvclNldFZhbHVlKCB2YWwgKSB7XG5cdFx0dmFyIGxlbiA9IHZhbC5sZW5ndGg7XG5cblx0XHRpZiAoIGxlbiA9PT0gMCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLnJlbW92ZUFsbFJvd3MoKTtcblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggdmFsW2ldICkgKSB7XG5cdFx0XHRcdHZhciByb3cgPSB2YWxbaV07XG5cdFx0XHRcdC8vY29udmVydGluZyBzdGF0dXNfaWQgYW5kIGRldmljZV9pZCBpbnRvIGJvb2xlYW4gdmFsdWVzIHRvIGJlIHVzZWQgZm9yIGNoZWNrYm94ZXNcblx0XHRcdFx0cm93LmVuYWJsZWQgPSByb3cuc3RhdHVzX2lkID09IDEwO1xuXHRcdFx0XHRyb3cud2ViX3B1c2hfZW5hYmxlZCA9IHJvdy5kZXZpY2VfaWQuaW5jbHVkZXMoIDQgKTtcblx0XHRcdFx0cm93LmVtYWlsX3dvcmtfZW5hYmxlZCA9IHJvdy5kZXZpY2VfaWQuaW5jbHVkZXMoIDI1NiApO1xuXHRcdFx0XHRyb3cuZW1haWxfaG9tZV9lbmFibGVkID0gcm93LmRldmljZV9pZC5pbmNsdWRlcyggNTEyICk7XG5cdFx0XHRcdHJvdy5hcHBfcHVzaF9lbmFibGVkID0gcm93LmRldmljZV9pZC5pbmNsdWRlcyggMzI3NjggKTtcblx0XHRcdFx0aWYgKCByb3cudHlwZV9pZC5zdGFydHNXaXRoKCAncmVtaW5kZXJfJyApICkge1xuXHRcdFx0XHRcdHJvdy5yZW1pbmRlcl9kZWxheSA9IHJvdy5yZW1pbmRlcl9kZWxheTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmFkZFJvdyggcm93ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aW5zaWRlRWRpdG9yQWRkUm93KCBkYXRhLCBpbmRleCApIHtcblx0XHRpZiAoICFkYXRhICkge1xuXHRcdFx0ZGF0YSA9IHt9O1xuXHRcdH1cblxuXHRcdHZhciByb3cgPSB0aGlzLmdldFJvd1JlbmRlcigpOyAvL0dldCBSb3cgcmVuZGVyXG5cdFx0dmFyIHJlbmRlciA9IHRoaXMuZ2V0UmVuZGVyKCk7IC8vZ2V0IHJlbmRlciwgc2hvdWxkIGJlIGEgdGFibGVcblx0XHR2YXIgd2lkZ2V0cyA9IHt9OyAvL1NhdmUgZWFjaCByb3cncyB3aWRnZXRzXG5cblx0XHQvL0J1aWxkIHJvdyB3aWRnZXRzXG5cblx0XHQvL0VuYWJsZWRcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNIRUNLQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDaGVja2JveCggeyBmaWVsZDogJ2VuYWJsZWQnIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0VmFsdWUoIGRhdGEuZW5hYmxlZCApO1xuXHRcdHdpZGdldHNbZm9ybV9pdGVtX2lucHV0LmdldEZpZWxkKCldID0gZm9ybV9pdGVtX2lucHV0O1xuXHRcdHJvdy5jaGlsZHJlbigpLmVxKCAwICkuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHR0aGlzLnNldFdpZGdldEVuYWJsZUJhc2VPblBhcmVudENvbnRyb2xsZXIoIGZvcm1faXRlbV9pbnB1dCApO1xuXG5cdFx0Ly9UeXBlXG5cdFx0dmFyIGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ3R5cGVfaWQnIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggR2xvYmFsLmFkZEZpcnN0SXRlbVRvQXJyYXkoIHRoaXMucGFyZW50X2NvbnRyb2xsZXIubm90aWZpY2F0aW9uX3R5cGVfYXJyYXkgKSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggZGF0YS50eXBlX2lkICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldEVuYWJsZWQoIGZhbHNlICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LmNzcyggJ3RleHQtYWxpZ24tbGFzdCcsICdjZW50ZXInICk7XG5cdFx0d2lkZ2V0c1tmb3JtX2l0ZW1faW5wdXQuZ2V0RmllbGQoKV0gPSBmb3JtX2l0ZW1faW5wdXQ7XG5cdFx0cm93LmNoaWxkcmVuKCkuZXEoIDEgKS5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXG5cdFx0Ly9Qcmlvcml0eVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ3ByaW9yaXR5X2lkJywgc2V0X2VtcHR5OiBmYWxzZSB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoIHRoaXMucGFyZW50X2NvbnRyb2xsZXIucHJpb3JpdHlfYXJyYXkgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0VmFsdWUoIGRhdGEucHJpb3JpdHlfaWQgKTtcblx0XHR3aWRnZXRzW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9pbnB1dDtcblx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMiApLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHQvL1dlYiBQdXNoXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DSEVDS0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ2hlY2tib3goIHsgZmllbGQ6ICd3ZWJfcHVzaF9lbmFibGVkJyB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCBkYXRhLndlYl9wdXNoX2VuYWJsZWQgKTtcblx0XHR3aWRnZXRzW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9pbnB1dDtcblx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMyApLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHQvL1dvcmsgRW1haWxcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNIRUNLQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDaGVja2JveCggeyBmaWVsZDogJ2VtYWlsX3dvcmtfZW5hYmxlZCcgfSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggZGF0YS5lbWFpbF93b3JrX2VuYWJsZWQgKTtcblx0XHR3aWRnZXRzW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9pbnB1dDtcblx0XHRyb3cuY2hpbGRyZW4oKS5lcSggNCApLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHQvL0hvbWUgRW1haWxcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNIRUNLQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDaGVja2JveCggeyBmaWVsZDogJ2VtYWlsX2hvbWVfZW5hYmxlZCcgfSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggZGF0YS5lbWFpbF9ob21lX2VuYWJsZWQgKTtcblx0XHR3aWRnZXRzW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9pbnB1dDtcblx0XHRyb3cuY2hpbGRyZW4oKS5lcSggNSApLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHQvL0FwcCBQdXNoXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DSEVDS0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ2hlY2tib3goIHsgZmllbGQ6ICdhcHBfcHVzaF9lbmFibGVkJyB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCBkYXRhLmFwcF9wdXNoX2VuYWJsZWQgKTtcblx0XHR3aWRnZXRzW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9pbnB1dDtcblx0XHRyb3cuY2hpbGRyZW4oKS5lcSggNiApLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHQvL1NldHRpbmdzXG5cdFx0aWYgKCBkYXRhLnR5cGVfaWQuc3RhcnRzV2l0aCggJ3JlbWluZGVyXycgKSApIHtcblx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdyZW1pbmRlcl9kZWxheScsIG5lZWRfcGFyc2VyX3NlYzogdHJ1ZSwgbW9kZTogJ3RpbWVfdW5pdCcgfSApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCBkYXRhLnJlbWluZGVyX2RlbGF5ICk7XG5cdFx0XHR3aWRnZXRzW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9pbnB1dDtcblxuXHRcdFx0dmFyIHdpZGdldENvbnRhaW5lciA9ICQoICc8ZGl2IGNsYXNzPVxcJ3dpZGdldC1oLWJveFxcJz48L2Rpdj4nICk7XG5cdFx0XHR2YXIgbGFiZWwgPSAkKCAnPHNwYW4gY2xhc3M9XFwnd2lkZ2V0LWxlZnQtbGFiZWxcXCc+ICcgKyAkLmkxOG4uXyggJ0RlbGF5JyApICsgJzogPC9zcGFuPicgKTtcblxuXHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggbGFiZWwgKTtcblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXG5cdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggNyApLmFwcGVuZCggd2lkZ2V0Q29udGFpbmVyICk7XG5cdFx0fVxuXG5cdFx0Ly9TYXZlIGN1cnJlbnQgc2V0IGl0ZW1cblx0XHR3aWRnZXRzLmN1cnJlbnRfZWRpdF9pdGVtID0gZGF0YTtcblxuXHRcdGlmICggdHlwZW9mIGluZGV4ICE9ICd1bmRlZmluZWQnICkge1xuXG5cdFx0XHRyb3cuaW5zZXJ0QWZ0ZXIoICQoIHJlbmRlciApLmZpbmQoICd0cicgKS5lcSggaW5kZXggKSApO1xuXHRcdFx0dGhpcy5yb3dzX3dpZGdldHNfYXJyYXkuc3BsaWNlKCAoIGluZGV4ICksIDAsIHdpZGdldHMgKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHQkKCByZW5kZXIgKS5hcHBlbmQoIHJvdyApO1xuXHRcdFx0dGhpcy5yb3dzX3dpZGdldHNfYXJyYXkucHVzaCggd2lkZ2V0cyApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5wYXJlbnRfY29udHJvbGxlci5pc192aWV3aW5nICkge1xuXHRcdFx0cm93LmZpbmQoICcuY29udHJvbC1pY29uJyApLmhpZGUoKTtcblx0XHR9XG5cblx0XHR0aGlzLnJlbW92ZUxhc3RSb3dMaW5lKCk7XG5cdH1cblxuXHRpbnNpZGVFZGl0b3JHZXRWYWx1ZSggY3VycmVudF9lZGl0X2l0ZW1faWQgKSB7XG5cblx0XHR2YXIgbGVuID0gdGhpcy5yb3dzX3dpZGdldHNfYXJyYXkubGVuZ3RoO1xuXG5cdFx0dmFyIHJlc3VsdCA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHR2YXIgcm93ID0gdGhpcy5yb3dzX3dpZGdldHNfYXJyYXlbaV07XG5cdFx0XHR2YXIgZGF0YSA9IHJvdy5jdXJyZW50X2VkaXRfaXRlbTtcblx0XHRcdGRhdGEucHJpb3JpdHlfaWQgPSByb3cucHJpb3JpdHlfaWQuZ2V0VmFsdWUoKTtcblx0XHRcdGRhdGEuc3RhdHVzX2lkID0gcm93LmVuYWJsZWQuZ2V0VmFsdWUoKSA9PT0gdHJ1ZSA/IDEwIDogMjA7XG5cdFx0XHRkYXRhLmRldmljZV9pZCA9IFtdO1xuXHRcdFx0aWYgKCByb3cud2ViX3B1c2hfZW5hYmxlZC5nZXRWYWx1ZSgpID09PSB0cnVlIClcblx0XHRcdFx0ZGF0YS5kZXZpY2VfaWQucHVzaCggNCApO1xuXHRcdFx0aWYgKCByb3cuZW1haWxfd29ya19lbmFibGVkLmdldFZhbHVlKCkgPT09IHRydWUgKVxuXHRcdFx0XHRkYXRhLmRldmljZV9pZC5wdXNoKCAyNTYgKTtcblx0XHRcdGlmICggcm93LmVtYWlsX2hvbWVfZW5hYmxlZC5nZXRWYWx1ZSgpID09PSB0cnVlIClcblx0XHRcdFx0ZGF0YS5kZXZpY2VfaWQucHVzaCggNTEyICk7XG5cdFx0XHRpZiAoIHJvdy5hcHBfcHVzaF9lbmFibGVkLmdldFZhbHVlKCkgPT09IHRydWUgKVxuXHRcdFx0XHRkYXRhLmRldmljZV9pZC5wdXNoKCAzMjc2OCApO1xuXG5cdFx0XHRpZiAoIGRhdGEudHlwZV9pZC5zdGFydHNXaXRoKCAncmVtaW5kZXJfJyApICYmIHJvdy5yZW1pbmRlcl9kZWxheSApIHtcblx0XHRcdFx0ZGF0YS5yZW1pbmRlcl9kZWxheSA9IHJvdy5yZW1pbmRlcl9kZWxheS5nZXRWYWx1ZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHQucHVzaCggZGF0YSApO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRvblNhdmVSZXN1bHQoIHJlc3VsdCApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdGlmICggcmVzdWx0LmlzVmFsaWQoKSApIHtcblx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdGlmICggcmVzdWx0X2RhdGEgPT09IHRydWUgKSB7XG5cdFx0XHRcdCR0aGlzLnJlZnJlc2hfaWQgPSAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBUVFVVSUQuaXNVVUlEKCByZXN1bHRfZGF0YSApICYmIHJlc3VsdF9kYXRhICE9IFRUVVVJRC56ZXJvX2lkICYmIHJlc3VsdF9kYXRhICE9IFRUVVVJRC5ub3RfZXhpc3RfaWQgKSB7XG5cdFx0XHRcdCR0aGlzLnJlZnJlc2hfaWQgPSByZXN1bHRfZGF0YTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aGlzLmlzX21hc3NfZWRpdGluZyA9PSBmYWxzZSApIHtcblx0XHRcdFx0JHRoaXMuc2F2ZUluc2lkZUVkaXRvckRhdGEoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHZhciBvbl9zYXZlX2RvbmVfcmVzdWx0ID0gJHRoaXMub25TYXZlRG9uZSggcmVzdWx0ICk7XG5cdFx0XHRcdFx0aWYgKCBvbl9zYXZlX2RvbmVfcmVzdWx0ID09IHVuZGVmaW5lZCB8fCBvbl9zYXZlX2RvbmVfcmVzdWx0ID09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHQkdGhpcy5yZW1vdmVFZGl0VmlldygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JHRoaXMucmVtb3ZlRWRpdFZpZXcoKTtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cdFx0XHQkdGhpcy5zZXRFcnJvck1lbnUoKTtcblx0XHRcdCR0aGlzLnNldEVycm9yVGlwcyggcmVzdWx0ICk7XG5cdFx0fVxuXHR9XG5cblx0c2F2ZUluc2lkZUVkaXRvckRhdGEoIGNhbGxCYWNrICkge1xuXHRcdHZhciBkYXRhID0gdGhpcy5lZGl0b3IuZ2V0VmFsdWUoIHRoaXMucmVmcmVzaF9pZCApO1xuXG5cdFx0bGV0IGNoYW5nZWRfZGF0YSA9IHRoaXMuZ2V0Q2hhbmdlZFJlY29yZHMoIGRhdGEsIHRoaXMub3JpZ2luYWxfdXNlcl9wcmVmZXJlbmNlX25vdGlmaWNhdGlvbl9kYXRhLCBbJ2VuYWJsZWQnLCAnd2ViX3B1c2hfZW5hYmxlZCcsICdlbWFpbF93b3JrX2VuYWJsZWQnLCAnZW1haWxfaG9tZV9lbmFibGVkJywgJ2FwcF9wdXNoX2VuYWJsZWQnXSApO1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBjaGFuZ2VkX2RhdGEgKSAmJiBjaGFuZ2VkX2RhdGEubGVuZ3RoID4gMCApIHtcblx0XHRcdHRoaXMudXNlcl9wcmVmZXJlbmNlX25vdGlmaWNhdGlvbl9hcGkuc2V0VXNlclByZWZlcmVuY2VOb3RpZmljYXRpb24oIGNoYW5nZWRfZGF0YSwge1xuXHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggY2FsbEJhY2sgKSApIHtcblx0XHRcdFx0XHRcdGNhbGxCYWNrKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCBjYWxsQmFjayApICkge1xuXHRcdFx0XHRjYWxsQmFjaygpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdG9uU2F2ZURvbmUoIHJlc3VsdCApIHtcblx0XHQvLyAjMjIyNCAtIERvbid0IHVzZSBjdXJyZW50X2VkaXRfcmVjb3JkIGhlcmUsIHVzZSBnZXRTZWxlY3RlZEl0ZW0oKSBpbnN0ZWFkLCBvciBpdCBjYXVzZXM6XG5cdFx0Ly8gVW5jYXVnaHQgRXJyb3IgRnJvbTogVXNlclByZWZlcmVuY2VWaWV3IEVycm9yOiBVbmFibGUgdG8gZ2V0IHByb3BlcnR5ICdpZCcgb2YgdW5kZWZpbmVkIG9yIG51bGwgcmVmZXJlbmNlXG5cdFx0dmFyIHVzZXJfaWQgPSB0aGlzLmdldFNlbGVjdGVkSXRlbSgpLmlkO1xuXG5cdFx0aWYgKCB1c2VyX2lkID09PSBMb2NhbENhY2hlRGF0YS5nZXRMb2dpblVzZXIoKS5pZCApIHtcblx0XHRcdEdsb2JhbC51cGRhdGVVc2VyUHJlZmVyZW5jZSgpO1xuXHRcdH1cblx0fVxuXG5cdG9uU2F2ZUFuZENvbnRpbnVlRG9uZSggcmVzdWx0ICkge1xuXHRcdHRoaXMub25TYXZlRG9uZSggcmVzdWx0ICk7XG5cdFx0dGhpcy5pbml0SW5zaWRlRWRpdG9yRGF0YSgpO1xuXHR9XG5cblx0b25TYXZlQW5kTmV4dERvbmUoIHJlc3VsdCApIHtcblx0XHR0aGlzLm9uU2F2ZURvbmUoIHJlc3VsdCApO1xuXHR9XG5cblx0dmFsaWRhdGUoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHZhciByZWNvcmQgPSB7fTtcblxuXHRcdGlmICggdGhpcy5pc19tYXNzX2VkaXRpbmcgKSB7XG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIHRoaXMuZWRpdF92aWV3X3VpX2RpYyApIHtcblx0XHRcdFx0dmFyIHdpZGdldCA9IHRoaXMuZWRpdF92aWV3X3VpX2RpY1trZXldO1xuXG5cdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCB3aWRnZXQuaXNDaGVja2VkICkgKSB7XG5cdFx0XHRcdFx0aWYgKCB3aWRnZXQuaXNDaGVja2VkKCkgJiYgd2lkZ2V0LmdldEVuYWJsZWQoKSApIHtcblx0XHRcdFx0XHRcdHJlY29yZFtrZXldID0gd2lkZ2V0LmdldFZhbHVlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIHRoaXMubWFzc19lZGl0X3JlY29yZF9pZHMubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0cmVjb3JkLmlkID0gdGhpcy5tYXNzX2VkaXRfcmVjb3JkX2lkc1swXTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVjb3JkID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkO1xuXHRcdH1cblx0XHR0aGlzLmFwaVsndmFsaWRhdGUnICsgdGhpcy5hcGkua2V5X25hbWVdKCByZWNvcmQsIHtcblx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXG5cdFx0XHRcdCR0aGlzLnZhbGlkYXRlUmVzdWx0KCByZXN1bHQgKTtcblxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdGdldFByZWZlcmVuY2VzTm90aWZpY2F0aW9uVGFiSHRtbCgpIHtcblx0XHRyZXR1cm4gYDxkaXYgaWQ9XCJ0YWJfcHJlZmVyZW5jZXNfbm90aWZpY2F0aW9uXCIgY2xhc3M9XCJlZGl0LXZpZXctdGFiLW91dHNpZGVcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZWRpdC12aWV3LXRhYlwiIGlkPVwidGFiX3ByZWZlcmVuY2VzX25vdGlmaWNhdGlvbl9jb250ZW50X2RpdlwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZpcnN0LWNvbHVtbiBmdWxsLXdpZHRoLWNvbHVtblwiPjwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImluc2lkZS1lZGl0b3ItZGl2IGZ1bGwtd2lkdGgtY29sdW1uXCI+PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PmA7XG5cdH1cblxuXHRnZXRTY2hlZHVsZVN5bmNyb25pemF0aW9uVGFiSHRtbCgpIHtcblx0XHRyZXR1cm4gYDxkaXYgaWQ9XCJ0YWJfc2NoZWR1bGVfc3luY1wiIGNsYXNzPVwiZWRpdC12aWV3LXRhYi1vdXRzaWRlXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImVkaXQtdmlldy10YWJcIiBpZD1cInRhYl9zY2hlZHVsZV9zeW5jX2NvbnRlbnRfZGl2XCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmlyc3QtY29sdW1uIGZ1bGwtd2lkdGgtY29sdW1uXCI+PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic2F2ZS1hbmQtY29udGludWUtZGl2IHBlcm1pc3Npb24tZGVmaW5lZC1kaXZcIj5cblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJtZXNzYWdlIHBlcm1pc3Npb24tbWVzc2FnZVwiPjwvc3Bhbj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5gO1xuXHR9XG5cblx0c2V0U3ViTG9nVmlld0ZpbHRlcigpIHtcblx0XHRpZiAoICF0aGlzLnN1Yl9sb2dfdmlld19jb250cm9sbGVyICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMuc3ViX2xvZ192aWV3X2NvbnRyb2xsZXIuZ2V0U3ViVmlld0ZpbHRlciA9IGZ1bmN0aW9uKCBmaWx0ZXIgKSB7XG5cdFx0XHRmaWx0ZXJbJ3RhYmxlX25hbWVfb2JqZWN0X2lkJ10gPSB7XG5cdFx0XHRcdCd1c2VyX3ByZWZlcmVuY2UnOiBbdGhpcy5wYXJlbnRfZWRpdF9yZWNvcmQuaWRdLFxuXHRcdFx0XHQndXNlcl9wcmVmZXJlbmNlX25vdGlmaWNhdGlvbic6IHRoaXMucGFyZW50X3ZpZXdfY29udHJvbGxlci5lZGl0b3IuZ2V0VmFsdWUoIHRoaXMucmVmcmVzaF9pZCApLm1hcCggcHJlZmVyZW5jZSA9PiBwcmVmZXJlbmNlLmlkIClcblx0XHRcdH07XG5cblx0XHRcdHJldHVybiBmaWx0ZXI7XG5cdFx0fTtcblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cbn1cblxuVXNlclByZWZlcmVuY2VWaWV3Q29udHJvbGxlci5sb2FkVmlldyA9IGZ1bmN0aW9uKCkge1xuXHRHbG9iYWwubG9hZFZpZXdTb3VyY2UoICdVc2VyUHJlZmVyZW5jZScsICdVc2VyUHJlZmVyZW5jZVZpZXcuaHRtbCcsIGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0dmFyIGFyZ3MgPSB7fTtcblx0XHQvL3ZhciB0ZW1wbGF0ZSA9IF8udGVtcGxhdGUoIHJlc3VsdCwgYXJncyApO1xuXG5cdFx0R2xvYmFsLmNvbnRlbnRDb250YWluZXIoKS5odG1sKCByZXN1bHQgKTtcblx0fSApO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8427\n")}}]);