TimeTrex/interface/html5/dist/payroll-company_tax_deduction-CompanyTaxDeductionViewController.bundle.js

1 line
227 KiB
JavaScript

"use strict";(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["payroll-company_tax_deduction-CompanyTaxDeductionViewController"],{9706:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"CompanyTaxDeductionViewController\": () => (/* binding */ CompanyTaxDeductionViewController)\n/* harmony export */ });\n/* harmony import */ var _global_Global__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9490);\n/* provided dependency */ var _ = __webpack_require__(9050);\n/* provided dependency */ var $ = __webpack_require__(9755);\n\n\nclass CompanyTaxDeductionViewController extends BaseViewController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\t\t\tel: '#company_tax_deduction_view_container', //Must set el here and can only set string, so events can work\n\n\t\t\ttype_array: null,\n\t\t\tstatus_array: null,\n\t\t\ttax_formula_type_array: null,\n\t\t\tcalculation_array: null,\n\t\t\taccount_amount_type_array: null,\n\t\t\tyes_no_array: null,\n\t\t\tapply_frequency_array: null,\n\t\t\tapply_payroll_run_type_array: null,\n\t\t\tlength_of_service_unit_array: null,\n\t\t\tmonth_of_year_array: null,\n\t\t\tday_of_month_array: null,\n\t\t\tmonth_of_quarter_array: null,\n\t\t\tcountry_array: null,\n\t\t\tprovince_array: null,\n\t\t\te_province_array: null,\n\t\t\tcompany_api: null,\n\t\t\tdate_api: null,\n\t\t\tuser_deduction_api: null,\n\t\t\tuser_api: null,\n\t\t\tpayroll_remittance_agency_api: null,\n\t\t\temployee_setting_grid: null,\n\t\t\temployee_setting_result: null,\n\t\t\tshow_c: false,\n\t\t\tshow_p: false,\n\t\t\tshow_dc: false,\n\n\t\t\tprovince_district_array: null,\n\n\t\t\toriginal_current_record: null, //set when setCurrentEditRecordData, to keep the original data of the edit record\n\n\t\t\tlength_dates: null,\n\t\t\tstart_dates: null,\n\t\t\tend_dates: null,\n\n\t\t\tgrid_parent: '.grid-div'\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 = 'CompanyTaxDeductionEditView.html';\n\t\tif ( this.sub_view_mode ) {\n\t\t\tthis.permission_id = 'user_tax_deduction';\n\t\t} else {\n\t\t\tthis.permission_id = 'company_tax_deduction';\n\t\t}\n\t\tthis.viewId = 'CompanyTaxDeduction';\n\t\tthis.script_name = 'CompanyTaxDeductionView';\n\t\tthis.table_name_key = 'company_deduction';\n\t\tthis.context_menu_name = $.i18n._( 'Tax / Deductions' );\n\t\tthis.navigation_label = $.i18n._( 'Tax / Deductions' );\n\t\tthis.api = TTAPI.APICompanyDeduction;\n\t\tthis.date_api = TTAPI.APITTDate;\n\t\tthis.company_api = TTAPI.APICompany;\n\t\tthis.user_deduction_api = TTAPI.APIUserDeduction;\n\t\tthis.user_api = TTAPI.APIUser;\n\t\tthis.payroll_remittance_agency_api = TTAPI.APIPayrollRemittanceAgency;\n\t\tthis.month_of_quarter_array = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.buildRecordArray */ .x.buildRecordArray( { 1: 1, 2: 2, 3: 3 } );\n\t\tthis.document_object_type_id = 300;\n\n\t\tthis.render();\n\n\t\t//Load the FormulaBuilder as early as possible to help avoid some race conditions with input box not appearing, or appearing out of order when clicking \"new\" after a fresh reload.\n\t\tif ( ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getProductEdition */ .x.getProductEdition() >= 15 ) ) {\n\t\t\t_global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadScript */ .x.loadScript( 'global/widgets/formula_builder/FormulaBuilder.js' );\n\t\t}\n\n\t\tif ( this.sub_view_mode ) {\n\t\t\tthis.buildContextMenu( true );\n\t\t} else {\n\t\t\tthis.buildContextMenu();\n\t\t}\n\n\t\t//call init data in parent view\n\t\tif ( !this.sub_view_mode ) {\n\t\t\tthis.initData();\n\t\t}\n\t}\n\n\tgetCustomContextMenuModel() {\n\t\tvar context_menu_model = {\n\t\t\texclude: ['mass_edit'],\n\t\t\tinclude: []\n\t\t};\n\n\t\tif ( this.sub_view_mode ) {\n\t\t\tcontext_menu_model.exclude.push(\n\t\t\t\t'view',\n\t\t\t\t'save_and_new',\n\t\t\t\t'save_and_copy',\n\t\t\t\t'copy_as_new',\n\t\t\t\t'copy'\n\t\t\t);\n\t\t}\n\n\t\treturn context_menu_model;\n\t}\n\n\tinitOptions() {\n\t\tvar $this = this;\n\n\t\tvar options = [\n\t\t\t{ option_name: 'type', api: this.api },\n\t\t\t{ option_name: 'status', api: this.api },\n\t\t\t{ option_name: 'calculation', api: this.api },\n\t\t\t{ option_name: 'apply_frequency', api: this.api },\n\t\t\t{ option_name: 'apply_payroll_run_type', api: this.api },\n\t\t\t{ option_name: 'account_amount_type', api: this.api },\n\t\t\t{ option_name: 'length_of_service_unit', api: this.api },\n\t\t\t{ option_name: 'look_back_unit', api: this.api },\n\t\t\t{ option_name: 'country', field_name: 'country', api: this.company_api },\n\t\t\t{ option_name: 'apply_payroll_run_type', api: this.api },\n\t\t\t{ option_name: 'yes_no', api: this.api },\n\n\t\t\t{ option_name: 'tax_formula_type', api: this.api },\n\t\t];\n\n\t\tthis.initDropDownOptions( options );\n\n\t\tthis.company_api.getOptions( 'district', {\n\t\t\tonResult: function( res ) {\n\t\t\t\tres = res.getResult();\n\t\t\t\t$this.district_array = res;\n\t\t\t}\n\t\t} );\n\n\t\tthis.date_api.getMonthOfYearArray( false, {\n\t\t\tonResult: function( res ) {\n\t\t\t\tres = res.getResult();\n\t\t\t\t$this.month_of_year_array = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.buildRecordArray */ .x.buildRecordArray( res );\n\t\t\t}\n\t\t} );\n\t\tthis.date_api.getDayOfMonthArray( {\n\t\t\tonResult: function( res ) {\n\t\t\t\tres = res.getResult();\n\t\t\t\t$this.day_of_month_array = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.buildRecordArray */ .x.buildRecordArray( res );\n\t\t\t}\n\t\t} );\n\t}\n\n\t//Override for: Do not show a few of the default columns when in Edit Employee sub-view \"Tax\" tab.\n\tsetSelectLayout() {\n\t\tif ( this.sub_view_mode ) {\n\t\t\tsuper.setSelectLayout( ['legal_entity_legal_name', 'total_users'] );\n\t\t} else {\n\t\t\tsuper.setSelectLayout();\n\t\t}\n\t}\n\n\tsetEditMenuSaveAndContinueIcon( context_btn, pId ) {\n\t\tthis.saveAndContinueValidate( context_btn, pId );\n\n\t\tif ( this.is_mass_editing || this.is_viewing || ( this.sub_view_mode && ( !this.current_edit_record || !this.current_edit_record.id ) ) ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tsetEditMenuAddIcon( context_btn, pId ) {\n\t\tif ( !this.addPermissionValidate( pId ) || this.edit_only_mode ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t}\n\n\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t}\n\n\t// The following functions are to disable various buttons on Employee Settings tab.\n\t// This was due to users getting confused as to what they were deleting (employee entry in table vs tax/deduc record). See issue #2688\n\tdisableIconOnEmployeeSettingsTab( context_btn ) {\n\t\tif ( this.getEditViewActiveTabName() === 'tab_employee_setting' ) {\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );\n\t\t}\n\t}\n\n\tsetEditMenuDeleteIcon( context_btn ) {\n\t\tthis.disableIconOnEmployeeSettingsTab( context_btn );\n\t}\n\n\tsetEditMenuDeleteAndNextIcon( context_btn ) {\n\t\tthis.disableIconOnEmployeeSettingsTab( context_btn );\n\t}\n\n\tsetEditMenuCopyIcon( context_btn ) {\n\t\tthis.disableIconOnEmployeeSettingsTab( context_btn );\n\t}\n\n\tsetEditMenuCopyAndAddIcon( context_btn ) {\n\t\tthis.disableIconOnEmployeeSettingsTab( context_btn );\n\t}\n\n\tsetEditMenuSaveAndCopyIcon( context_btn ) {\n\t\tthis.disableIconOnEmployeeSettingsTab( context_btn );\n\t}\n\n\tenableIconOnEmployeeSettingsTab( context_btn ) {\n\t\tif ( this.getEditViewActiveTabName() === 'tab_employee_setting' ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t\tContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );\n\t\t}\n\t}\n\n\tsetEditMenuExportIcon( context_btn ) {\n\t\tthis.enableIconOnEmployeeSettingsTab( context_btn );\n\t}\n\n\tonExportClick() {\n\t\tif ( this.is_edit == true && this.getEditViewActiveTabName() === 'tab_employee_setting' ) {\n\t\t\tthis.employee_setting_grid.grid2csv( 'export_user_deduction' );\n\t\t} else {\n\t\t\tsuper.onExportClick( 'export' + this.api.key_name );\n\t\t}\n\t}\n\n\tsaveInsideEditorData( callBack ) {\n\t\tvar $this = this;\n\n\t\t// #2764 do not check for this.sub_view_mode as Save icon will fail to save. Save and Save&Continue should have the same logic regardless of sub_view. See issue or commit ee0102be0f45f954a78b7f96b6cf2f2350b73dd7 context on this.sub_view_mode and save&continue.\n\t\t// if ( !this.current_edit_record || !this.current_edit_record.id || this.sub_view_mode ) {\n\t\tif ( !this.current_edit_record || !this.current_edit_record.id ) {\n\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( callBack ) ) {\n\t\t\t\tcallBack();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !this.employee_setting_grid ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar data = this.employee_setting_grid.getGridParam( 'data' );\n\t\tvar columns = this.employee_setting_grid.getGridParam( 'colModel' );\n\n\t\tfor ( var i = 0; i < data.length; i++ ) {\n\t\t\tvar item = data[i];\n\t\t\tif ( this.start_dates && this.start_dates.length > 0 ) {\n\t\t\t\titem.start_date = this.start_dates[i].getValue();\n\t\t\t}\n\t\t\tif ( this.length_dates && this.length_dates.length > 0 ) {\n\t\t\t\titem.length_of_service_date = this.length_dates[i].getValue();\n\t\t\t}\n\t\t\tif ( this.end_dates && this.end_dates.length > 0 ) {\n\t\t\t\titem.end_date = this.end_dates[i].getValue();\n\t\t\t}\n\t\t\tfor ( var j = 1; j < columns.length; j++ ) {\n\t\t\t\tvar column = columns[j];\n\t\t\t\tif ( item[column.name] === this.original_current_record[column.name] ) {\n\t\t\t\t\titem[column.name] = false; //Default column setting\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( data && data.length > 0 ) {\n\t\t\t//Only send data from the Employee Settings tab to the API that has changed.\n\t\t\tlet changed_data = this.getChangedRecords( data, this.employee_setting_result, [] );\n\n\t\t\tif ( Array.isArray( changed_data ) && changed_data.length > 0 ) {\n\t\t\t\tthis.user_deduction_api.setUserDeduction( changed_data, {\n\t\t\t\t\tonResult: function() {\n\t\t\t\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( callBack ) ) {\n\t\t\t\t\t\t\tcallBack();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\t//Still execute the callback so Save & Next can move to the next record when there is no Employees assigned to it\n\t\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( callBack ) ) {\n\t\t\t\t\tcallBack();\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t//Still execute the callback so Save & Next can move to the next record when there is no Employees assigned to it\n\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( callBack ) ) {\n\t\t\t\tcallBack();\n\t\t\t}\n\t\t}\n\t}\n\n\tonContextMenuClick( context_btn, menu_name ) {\n\t\tif ( this.select_grid_last_row ) {\n\t\t\tthis.employee_setting_grid.grid.jqGrid( 'saveRow', this.select_grid_last_row );\n\t\t\tthis.setDateCellsEnabled( false, this.select_grid_last_row );\n\t\t\tthis.select_grid_last_row = null;\n\t\t}\n\n\t\treturn super.onContextMenuClick( context_btn, menu_name );\n\t}\n\n\tgetDeleteSelectedRecordId() {\n\t\tif ( !this.sub_view_mode ) {\n\t\t\treturn super.getDeleteSelectedRecordId();\n\t\t} else {\n\t\t\tvar retval = [];\n\n\t\t\tif ( this.edit_view ) {\n\t\t\t\tretval.push( this.employee_setting_result[0].id );\n\t\t\t} else {\n\t\t\t\tvar args = { filter_data: {} };\n\t\t\t\tvar tax_ids = this.getGridSelectIdArray().slice();\n\t\t\t\targs.filter_data.company_deduction_id = tax_ids;\n\t\t\t\targs.filter_data.user_id = this.parent_value;\n\n\t\t\t\tvar res = this.user_deduction_api.getUserDeduction( args, true, { async: false } ).getResult();\n\n\t\t\t\tfor ( var i = 0; i < res.length; i++ ) {\n\t\t\t\t\tvar item = res[i];\n\t\t\t\t\tretval.push( item.id );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn retval;\n\t\t}\n\t}\n\n\tdoDeleteAPICall( remove_ids, callback ) {\n\t\tif ( !this.sub_view_mode ) {\n\t\t\treturn super.doDeleteAPICall( remove_ids, callback );\n\t\t} else {\n\t\t\tif ( !callback ) {\n\t\t\t\tcallback = {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tthis.onDeleteResult( result, remove_ids );\n\t\t\t\t\t}.bind( this )\n\t\t\t\t};\n\t\t\t}\n\t\t\t// return this.api['delete' + this.api.key_name]( remove_ids, callback );\n\t\t\treturn this.user_deduction_api.deleteUserDeduction( remove_ids, callback );\n\t\t}\n\t}\n\n\tonSaveClick( ignoreWarning ) {\n\t\tvar $this = this;\n\t\tvar record;\n\t\tif ( !_global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( ignoreWarning ) ) {\n\t\t\tignoreWarning = false;\n\t\t}\n\t\t//Setting is_add false too early can cause determineContextMenuMountAttributes() to have unexpected side effects. However not setting it here might have other side effects.\n\t\t//this.is_add = false;\n\t\tLocalCacheData.current_doing_context_action = 'save';\n\t\tif ( this.is_mass_editing ) {\n\t\t\tvar changed_fields = this.getChangedFields();\n\t\t\trecord = this.buildMassEditSaveRecord( this.mass_edit_record_ids, changed_fields );\n\t\t\t// var check_fields = {};\n\t\t\t// for ( var key in this.edit_view_ui_dic ) {\n\t\t\t// \tvar widget = this.edit_view_ui_dic[key];\n\t\t\t//\n\t\t\t// \tif ( Global.isSet( widget.isChecked ) ) {\n\t\t\t// \t\tif ( widget.isChecked() ) {\n\t\t\t// \t\t\tcheck_fields[key] = this.current_edit_record[key];\n\t\t\t// \t\t}\n\t\t\t// \t}\n\t\t\t// }\n\t\t\t// record = [];\n\t\t\t// $.each( this.mass_edit_record_ids, function( index, value ) {\n\t\t\t// \tvar common_record = Global.clone( check_fields );\n\t\t\t// \tcommon_record.id = value;\n\t\t\t// \trecord.push( common_record );\n\t\t\t//\n\t\t\t// } );\n\t\t} else {\n\t\t\trecord = this.current_edit_record;\n\t\t}\n\t\trecord = this.uniformVariable( record );\n\t\tif ( !this.sub_view_mode ) {\n\t\t\tthis.api['set' + this.api.key_name]( record, false, ignoreWarning, {\n\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t$this.onSaveResult( result );\n\t\t\t\t}\n\t\t\t} );\n\t\t} else {\n\t\t\tif ( !this.current_edit_record.id ) {\n\t\t\t\tthis.user_deduction_api.setUserDeduction( record, false, ignoreWarning, {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t$this.onSaveResult( result );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\t$this.saveInsideEditorData( function() {\n\t\t\t\t\t$this.refresh_id = $this.current_edit_record.id; // as add\n\t\t\t\t\t$this.search();\n\n\t\t\t\t\t$this.removeEditView();\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t}\n\n\tonSaveAndContinue( ignoreWarning ) {\n\t\tvar $this = this;\n\t\tif ( !_global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( ignoreWarning ) ) {\n\t\t\tignoreWarning = false;\n\t\t}\n\t\tthis.is_changed = false;\n\t\tthis.is_add = false;\n\t\tLocalCacheData.current_doing_context_action = 'save_and_continue';\n\t\tvar record = this.current_edit_record;\n\t\trecord = this.uniformVariable( record );\n\t\tif ( !this.sub_view_mode ) {\n\t\t\tthis.api['set' + this.api.key_name]( record, false, ignoreWarning, {\n\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t$this.onSaveAndContinueResult( result );\n\t\t\t\t}\n\t\t\t} );\n\t\t} else {\n\t\t\t// Only edit record can go here\n\t\t\t$this.saveInsideEditorData( function() {\n\t\t\t\t$this.refresh_id = $this.current_edit_record.id;\n\t\t\t\t$this.search( false );\n\t\t\t\t$this.onEditClick( $this.refresh_id, true );\n\t\t\t} );\n\t\t}\n\t}\n\n\tonSaveAndNextClick( ignoreWarning ) {\n\t\tvar $this = this;\n\t\tif ( !_global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( ignoreWarning ) ) {\n\t\t\tignoreWarning = false;\n\t\t}\n\t\tthis.is_add = false;\n\t\tthis.is_changed = false;\n\n\t\tvar record = this.current_edit_record;\n\t\tLocalCacheData.current_doing_context_action = 'save_and_next';\n\t\trecord = this.uniformVariable( record );\n\n\t\tif ( !this.sub_view_mode ) {\n\t\t\tthis.api['set' + this.api.key_name]( record, false, ignoreWarning, {\n\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t$this.onSaveAndNextResult( result );\n\t\t\t\t}\n\t\t\t} );\n\t\t} else {\n\t\t\t// Only edit record can go here\n\t\t\t$this.saveInsideEditorData( function() {\n\t\t\t\t$this.refresh_id = $this.current_edit_record.id;\n\t\t\t\t$this.onRightArrowClick();\n\t\t\t\t$this.search( false );\n\t\t\t} );\n\t\t}\n\t}\n\n\t//Make sure this.current_edit_record is updated before validate\n\tvalidate() {\n\t\tvar $this = this;\n\t\tvar record = {};\n\t\tif ( this.is_mass_editing ) {\n\t\t\tfor ( var key in this.edit_view_ui_dic ) {\n\t\t\t\tif ( !this.edit_view_ui_dic.hasOwnProperty( key ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tvar widget = this.edit_view_ui_dic[key];\n\t\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.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} else {\n\t\t\trecord = this.current_edit_record;\n\t\t}\n\t\trecord = this.uniformVariable( record );\n\t\tif ( !this.sub_view_mode ) {\n\t\t\tthis.api['validate' + this.api.key_name]( record, {\n\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t$this.validateResult( result );\n\t\t\t\t}\n\t\t\t} );\n\t\t} else {\n\t\t\tthis.user_deduction_api.validateUserDeduction( record, {\n\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t$this.validateResult( result );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\tuniformVariable( record ) {\n\t\tif ( this.sub_view_mode && ( !this.current_edit_record || !this.current_edit_record.id ) ) {\n\n\t\t\trecord = [];\n\n\t\t\tvar selected_items = this.edit_view_ui_dic.company_tax_deduction_ids.getValue();\n\t\t\tfor ( var i = 0; i < selected_items.length; i++ ) {\n\t\t\t\tvar new_record = {};\n\t\t\t\tnew_record.user_id = this.parent_value;\n\t\t\t\tnew_record.company_deduction_id = selected_items[i].id;\n\t\t\t\trecord.push( new_record );\n\t\t\t}\n\n\t\t}\n\n\t\treturn record;\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\n\t\t\tif ( !this.sub_view_mode ) {\n\t\t\t\tif ( result_data === true ) {\n\t\t\t\t\t$this.refresh_id = $this.current_edit_record.id; // as add\n\t\t\t\t} else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) { // as new\n\t\t\t\t\t$this.refresh_id = result_data;\n\t\t\t\t}\n\t\t\t\t$this.saveInsideEditorData( function() {\n\t\t\t\t\t$this.search();\n\t\t\t\t\t$this.onSaveDone( result );\n\n\t\t\t\t\t$this.removeEditView();\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\t$this.refresh_id = null;\n\t\t\t\t$this.search();\n\t\t\t\t$this.onSaveDone( result );\n\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\n\t\t}\n\t}\n\n\tonSaveAndCopyResult( 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\t$this.saveInsideEditorData( function() {\n\t\t\t\t$this.search( false );\n\t\t\t\t$this.onCopyAsNewClick();\n\n\t\t\t} );\n\n\t\t} else {\n\t\t\t$this.setErrorTips( result );\n\t\t\t$this.setErrorMenu();\n\t\t}\n\t}\n\n\t_continueDoCopyAsNew() {\n\t\tthis.setCurrentEditViewState( 'new' );\n\t\tLocalCacheData.current_doing_context_action = 'copy_as_new';\n\n\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( this.edit_view ) ) {\n\t\t\tthis.employee_setting_grid.clearGridData();\n\t\t\tthis.edit_view_ui_dic.calculation_id.setEnabled( true );\n\t\t}\n\t\tsuper._continueDoCopyAsNew();\n\t}\n\n\tclearEditViewData() {\n\n\t\tfor ( var key in this.edit_view_ui_dic ) {\n\n\t\t\tif ( !this.edit_view_ui_dic.hasOwnProperty( key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.edit_view_ui_dic[key].setValue( null );\n\t\t\tthis.edit_view_ui_dic[key].clearErrorStyle();\n\t\t}\n\n\t\tif ( this.employee_setting_grid ) {\n\t\t\tthis.employee_setting_grid.clearGridData();\n\t\t}\n\t}\n\n\tcheckTabPermissions( tab ) {\n\t\tvar retval = false;\n\n\t\tswitch ( tab ) {\n\t\t\tcase 'tab_attachment':\n\t\t\t\tif ( this.subDocumentValidate() ) {\n\t\t\t\t\tretval = !this.sub_view_mode;\n\t\t\t\t} else {\n\t\t\t\t\tretval = false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'tab_tax_deductions':\n\t\t\tcase 'tab_eligibility':\n\t\t\tcase 'tab_employee_setting':\n\t\t\tcase 'tab_audit':\n\t\t\t\t//Don't show these tabs when under Edit Employee, Tax tab.\n\t\t\t\tif ( this.sub_view_mode ) {\n\t\t\t\t\tif ( tab == 'tab_employee_setting' && this.current_edit_record.id ) {\n\t\t\t\t\t\tretval = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tretval = false;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tretval = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'tab5':\n\t\t\t\tif ( this.sub_view_mode ) {\n\t\t\t\t\tif ( tab == 'tab5' && this.current_edit_record.id ) {\n\t\t\t\t\t\tretval = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tretval = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tretval = super.checkTabPermissions( tab );\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn retval;\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\n\t\t} else {\n\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_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.buildRecordArray */ .x.buildRecordArray( res );\n\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\teSetProvince( val, refresh ) {\n\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_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.buildRecordArray */ .x.buildRecordArray( res );\n\t\t\t\t\tprovince_widget.setSourceData( $this.e_province_array );\n\t\t\t\t\t$this.setProvinceVisibility();\n\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\tonFormItemChange( target, doNotValidate ) {\n\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\tswitch ( key ) {\n\n\t\t\tcase 'country':\n\t\t\t\tvar widget = this.edit_view_ui_dic['province'];\n\t\t\t\tvar widget_2 = this.edit_view_ui_dic['district'];\n\t\t\t\twidget.setValue( null );\n\t\t\t\twidget_2.setValue( null );\n\t\t\t\tthis.current_edit_record.province = false;\n\t\t\t\tthis.current_edit_record.district = false;\n\t\t\t\tthis.setDynamicFields( null, true );\n\t\t\t\tbreak;\n\t\t\tcase 'province':\n\t\t\t\twidget_2 = this.edit_view_ui_dic['district'];\n\t\t\t\tthis.setDistrict( this.current_edit_record['country'] );\n\t\t\t\twidget_2.setValue( null );\n\t\t\t\tthis.setDynamicFields( null, true );\n\t\t\t\tbreak;\n\t\t\tcase 'calculation_id':\n\t\t\t\tthis.setDynamicFields();\n\t\t\t\tbreak;\n\t\t\tcase 'apply_frequency_id':\n\t\t\t\tthis.onApplyFrequencyChange();\n\t\t\t\tbreak;\n\t\t\tcase 'minimum_length_of_service_unit_id':\n\t\t\tcase 'maximum_length_of_service_unit_id':\n\t\t\t\tthis.onLengthOfServiceChange();\n\t\t\t\tbreak;\n\t\t\tcase 'start_date':\n\t\t\tcase 'end_date':\n\t\t\tcase 'minimum_length_of_service':\n\t\t\tcase 'maximum_length_of_service':\n\t\t\t\tthis.resetEmployeeSettingGridColumns();\n\t\t\t\tbreak;\n\t\t\tcase 'legal_entity_id':\n\t\t\t\tthis.onLegalEntityChange();\n\t\t\t\tthis.updateEmployeeData();\n\t\t\t\tbreak;\n\t\t\tcase 'user_value10':\n\t\t\t\tthis.onFormW4VersionChange();\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( key === 'country' ) {\n\t\t\tthis.onCountryChange();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !doNotValidate ) {\n\t\t\tthis.validate();\n\t\t}\n\t}\n\n\tsetCurrentEditRecordData() {\n\t\tvar $this = this;\n\n\t\tthis.original_current_record = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.clone */ .x.clone( this.current_edit_record );\n\t\t//Set current edit record data to all widgets\n\t\tfor ( var key in this.current_edit_record ) {\n\n\t\t\tif ( !this.current_edit_record.hasOwnProperty( key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar widget = this.edit_view_ui_dic[key];\n\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( widget ) ) {\n\t\t\t\tswitch ( key ) {\n\t\t\t\t\tcase 'country':\n\t\t\t\t\t\tthis.eSetProvince( this.current_edit_record[key] );\n\t\t\t\t\t\tthis.setDistrict( this.current_edit_record[key] );\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\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\tif ( $this.current_edit_record.id ) {\n\t\t\t$this.edit_view_ui_dic.calculation_id.setEnabled( false );\n\t\t} else {\n\t\t\t$this.edit_view_ui_dic.calculation_id.setEnabled( true );\n\t\t}\n\n\t\tthis.setDynamicFields( function() {\n\t\t\t$this.collectUIDataToCurrentEditRecord();\n\t\t\t$this.onLengthOfServiceChange();\n\t\t\t$this.setEditViewDataDone();\n\t\t\t$this.edit_view_ui_dic.company_tax_deduction_ids.setGridColumnsWidths();\n\t\t\t$this.onLegalEntityChange();\n\t\t} );\n\n\t\tif ( this.sub_view_mode && ( !this.current_edit_record || !this.current_edit_record.id ) ) {\n\t\t\tthis.initCompanyTaxDeductionData();\n\t\t}\n\t}\n\n\tonLegalEntityChange() {\n\t\tvar pra_value = this.edit_view_ui_dic.payroll_remittance_agency_id.getValue();\n\t\tvar new_arg = {};\n\t\tnew_arg.filter_data = { legal_entity_id: this.edit_view_ui_dic.legal_entity_id.getValue() };\n\t\tnew_arg.filter_columns = this.edit_view_ui_dic.payroll_remittance_agency_id.getColumnFilter();\n\n\t\tvar $this = this;\n\t\tif ( this.edit_view_ui_dic.legal_entity_id.getValue() != TTUUID.zero_id ) {\n\t\t\tthis.payroll_remittance_agency_api.getPayrollRemittanceAgency( new_arg, {\n\t\t\t\tonResult: function( task_result ) {\n\t\t\t\t\tvar data = task_result.getResult();\n\n\t\t\t\t\tif ( $this.edit_view_ui_dic.payroll_remittance_agency_id ) {\n\t\t\t\t\t\tif ( data.length > 0 ) {\n\t\t\t\t\t\t\t$this.edit_view_ui_dic.payroll_remittance_agency_id.setSourceData( data );\n\n\t\t\t\t\t\t\tvar id_in_result = false;\n\t\t\t\t\t\t\tfor ( var i in data ) {\n\t\t\t\t\t\t\t\tif ( data[i].id == pra_value ) {\n\t\t\t\t\t\t\t\t\tid_in_result = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( id_in_result === false ) {\n\t\t\t\t\t\t\t\tpra_value = TTUUID.zero_id;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t$this.current_edit_record.payroll_remittance_agency_id = pra_value;\n\t\t\t\t\t\t\t$this.edit_view_ui_dic.payroll_remittance_agency_id.setValue( pra_value );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this.edit_view_ui_dic.payroll_remittance_agency_id.setValue( TTUUID.zero_id );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$this.edit_view_ui_dic.payroll_remittance_agency_id.setEnabled( true );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t} else {\n\t\t\tpra_value = TTUUID.zero_id;\n\t\t\t$this.edit_view_ui_dic.payroll_remittance_agency_id.setSourceData( [TTUUID.zero_id] ); //wipe the box\n\t\t\t$this.edit_view_ui_dic.payroll_remittance_agency_id.setValue( pra_value );\n\t\t\t$this.edit_view_ui_dic.payroll_remittance_agency_id.setEnabled( false );\n\t\t}\n\t}\n\n\tupdateEmployeeData() {\n\t\tvar request_data = { filter_data: {} };\n\t\tif ( this.edit_view_ui_dic && this.edit_view_ui_dic.legal_entity_id && this.edit_view_ui_dic.legal_entity_id.getValue() && this.edit_view_ui_dic.legal_entity_id.getValue() != TTUUID.zero_id ) {\n\t\t\trequest_data.filter_data.legal_entity_id = this.edit_view_ui_dic.legal_entity_id.getValue();\n\t\t}\n\t\tif ( this.edit_view_ui_dic.user ) {\n\t\t\tthis.edit_view_ui_dic.user.setDefaultArgs( request_data );\n\t\t\tthis.edit_view_ui_dic.user.setSourceData( null );\n\t\t}\n\t}\n\n\tonLengthOfServiceChange() {\n\n\t\tif ( this.sub_view_mode ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.current_edit_record['minimum_length_of_service_unit_id'] == 50 || this.current_edit_record['maximum_length_of_service_unit_id'] == 50 ) {\n\t\t\tthis.attachElement( 'length_of_service_contributing_pay_code_policy_id' );\n\t\t} else {\n\t\t\tthis.detachElement( 'length_of_service_contributing_pay_code_policy_id' );\n\t\t}\n\n\t\tthis.editFieldResize();\n\t}\n\n\tinitCompanyTaxDeductionData() {\n\n\t\tvar $this = this;\n\n\t\tvar request_data = {\n\t\t\tfilter_data: {\n\t\t\t\tlegal_entity_id: [this.parent_edit_record.legal_entity_id, TTUUID.zero_id, TTUUID.not_exist_id],\n\t\t\t\texclude_user_id: this.parent_edit_record.id //Don't show records the employee is already assinged to. Helps prevent duplicate mappings.\n\t\t\t},\n\t\t\tfilter_columns: { //Make sure we limit the columns, otherwise this can be slow to load since it tries to count the number of employees assigned to each Tax/Deduction record.\n\t\t\t\tid: true,\n\t\t\t\tname: true,\n\t\t\t}\n\t\t};\n\n\t\tthis.api.getCompanyDeduction( request_data, true, {\n\t\t\tonResult: function( result ) {\n\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t$this.edit_view_ui_dic.company_tax_deduction_ids.setUnselectedGridData( result_data );\n\t\t\t}\n\t\t} );\n\t}\n\n\tsetEditViewDataDone() {\n\t\tsuper.setEditViewDataDone();\n\t\tthis.onApplyFrequencyChange();\n\t\tthis.initEmployeeSetting();\n\t\tthis.updateEmployeeData();\n\t}\n\n\tsetDistrict( c ) {\n\t\tvar $this = this;\n\t\tvar district_widget = $this.edit_view_ui_dic['district'];\n\n\t\t$this.province_district_array = [];\n\t\tdistrict_widget.setSourceData( $this.province_district_array );\n\t\tif ( c ) {\n\t\t\tvar pd_array = this.district_array[c];\n\n\t\t\tif ( pd_array ) {\n\t\t\t\tvar pd_array_item = pd_array[$this.current_edit_record.province];\n\n\t\t\t\tif ( pd_array_item ) {\n\t\t\t\t\t$this.province_district_array = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.buildRecordArray */ .x.buildRecordArray( pd_array_item );\n\t\t\t\t\tdistrict_widget.setSourceData( $this.province_district_array );\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\t$this.setDistrictVisibility();\n\t}\n\n\thideAllDynamicFields( keepC, keepP ) {\n\n\t\tif ( !this.edit_view ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !keepC ) {\n\t\t\tthis.show_c = false;\n\t\t\tthis.detachElement( 'country' );\n\t\t}\n\n\t\tif ( !keepP ) {\n\t\t\tthis.show_p = false;\n\t\t\tthis.show_dc = false;\n\t\t\tthis.detachElement( 'province' );\n\t\t\tthis.detachElement( 'district' );\n\t\t}\n\n\t\tthis.detachElement( 'df_0' );\n\t\tthis.detachElement( 'df_1' );\n\t\tthis.detachElement( 'df_2' );\n\t\tthis.detachElement( 'df_3' );\n\t\tthis.detachElement( 'df_4' );\n\t\tthis.detachElement( 'df_5' );\n\t\tthis.detachElement( 'df_6' );\n\t\tthis.detachElement( 'df_7' );\n\t\tthis.detachElement( 'df_8' );\n\t\tthis.detachElement( 'df_9' );\n\t\tthis.detachElement( 'df_10' );\n\t\tthis.detachElement( 'df_11' );\n\t\tthis.detachElement( 'df_12' );\n\t\tthis.detachElement( 'df_14' );\n\t\tthis.detachElement( 'df_15' );\n\n\t\tthis.detachElement( 'df_20' );\n\t\tthis.detachElement( 'df_21' );\n\t\tthis.detachElement( 'df_22' );\n\t\tthis.detachElement( 'df_23' );\n\t\tthis.detachElement( 'df_24' );\n\t\tthis.detachElement( 'df_25' );\n\n\t\tif ( !( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getProductEdition */ .x.getProductEdition() >= 15 ) ) {\n\t\t\tthis.detachElement( 'df_100' );\n\t\t}\n\t}\n\n\tinitEmployeeSetting() {\n\t\tvar $this = this;\n\n\t\tif ( !$this.edit_view ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !this.current_edit_record || !this.current_edit_record.id ) {\n\t\t\t$this.employee_setting_result = [];\n\t\t\t//Don't display the Employee Settings grid headers when its a new record.\n\t\t\t//$this.setEmployeeSettingGridData( $this.buildEmployeeSettingGrid() );\n\t\t\treturn;\n\t\t}\n\n\t\t// Specify which menu to use for Employee Settings tab, and use disableIconOnEmployeeSettingsTab() to disable certain icons. Related to #2688\n\t\tthis.buildContextMenu( true );\n\t\tthis.setEditMenu();\n\t\tvar context_menu_array = ContextMenuManager.getMenuModelByMenuId( this.determineContextMenuMountAttributes().id );\n\t\tvar len = context_menu_array.length;\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tlet context_btn = context_menu_array[i];\n\t\t\tlet id = context_menu_array[i].id;\n\n\t\t\tif ( id === 'export_excel' ) {\n\t\t\t\tthis.setEditMenuExportIcon( context_btn );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\n\t\tvar args = { filter_data: {} };\n\n\t\targs.filter_data.company_deduction_id = this.current_edit_record.id;\n\n\t\tif ( this.sub_view_mode ) {\n\t\t\targs.filter_data.user_id = this.parent_value;\n\t\t}\n\n\t\tthis.user_deduction_api.getUserDeduction( args, true, {\n\t\t\tonResult: function( result ) {\n\n\t\t\t\tif ( !$this.edit_view ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t$this.employee_setting_result = result.getResult();\n\t\t\t\t$this.setEmployeeSettingGridData( $this.buildEmployeeSettingGrid() );\n\t\t\t}\n\t\t} );\n\t}\n\n\tresetEmployeeSettingGridColumns() {\n\t\tif ( this.employee_setting_grid ) {\n\t\t\tvar data = this.employee_setting_grid.getGridParam( 'data' );\n\t\t\t_global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.formatGridData */ .x.formatGridData( data, this.api.key_name );\n\t\t\tthis.buildEmployeeSettingGrid();\n\t\t\tthis.employee_setting_grid.setData( data );\n\t\t\tthis.removeEmployeeSettingNoResultCover();\n\t\t\tthis.setEmployeeGridDateColumns();\n\t\t\tthis.setEmployeeGridSize();\n\t\t\tif ( data.length < 1 && this.current_edit_record.id ) {\n\t\t\t\tthis.showEmployeeSettingNoResultCover();\n\t\t\t}\n\t\t}\n\t}\n\n\tgetColumnOptionsString( column_options_arr ) {\n\t\tvar column_options_string = '';\n\t\tfor ( var i = 0; i < column_options_arr.length; i++ ) {\n\t\t\tif ( i !== column_options_arr.length - 1 ) {\n\t\t\t\tcolumn_options_string += column_options_arr[i].fullValue + ':' + column_options_arr[i].label + ';';\n\t\t\t} else {\n\t\t\t\tcolumn_options_string += column_options_arr[i].fullValue + ':' + column_options_arr[i].label;\n\t\t\t}\n\t\t}\n\n\t\treturn column_options_string;\n\t}\n\n\t/* jshint ignore:start */\n\tbuildEmployeeSettingGrid() {\n\t\tvar $this = this;\n\t\tvar column_info_array = [];\n\n\t\tvar column_info = {\n\t\t\tname: 'employee_number',\n\t\t\tindex: 'employee_number',\n\t\t\tlabel: $.i18n._( 'Employee Number' ),\n\t\t\twidth: 100,\n\t\t\tsortable: false,\n\t\t\ttitle: false\n\t\t};\n\t\tcolumn_info_array.push( column_info );\n\n\t\tvar column_info = {\n\t\t\tname: 'user_name',\n\t\t\tindex: 'user_name',\n\t\t\tlabel: $.i18n._( 'Employee' ),\n\t\t\twidth: 100,\n\t\t\tsortable: false,\n\t\t\ttitle: false\n\t\t};\n\t\tcolumn_info_array.push( column_info );\n\n\t\t$this.api.getOptions( 'calculation_type_column_meta_data', {\n\t\t\t'calculation_id': $this.current_edit_record.calculation_id,\n\t\t\t'country': $this.current_edit_record.country,\n\t\t\t'province': $this.current_edit_record.province\n\t\t}, {\n\t\t\t//Issue #3302 - Opening tax/deduction record on Employee -> Employees would not always show correct data on first opening the record. (Only after this call was cached)\n\t\t\t//This call needs to be synchronous so that the column_info_array is populated with all relevant data before the grid is built and function returns.\n\t\t\tasync: false,\n\t\t\tonResult: function( result ) {\n\t\t\t\tresult = result.getResult();\n\n\t\t\t\tfor ( var key in result ) {\n\t\t\t\t\tlet meta_data = result[key];\n\t\t\t\t\tlet dynamic_field_id = meta_data['dynamic_field_id'];\n\n\t\t\t\t\tif ( meta_data.type_id == 2100 ) {\n\t\t\t\t\t\t//$this.edit_view_ui_dic[dynamic_field_id].setSourceData( Global.buildRecordArray( meta_data.multi_select_items ) );\n\t\t\t\t\t\tcolumn_info = {\n\t\t\t\t\t\t\tname: key,\n\t\t\t\t\t\t\tindex: key,\n\t\t\t\t\t\t\tlabel: meta_data.name,\n\t\t\t\t\t\t\twidth: meta_data.width,\n\t\t\t\t\t\t\tsortable: false,\n\t\t\t\t\t\t\tformatter: 'select',\n\t\t\t\t\t\t\teditable: true,\n\t\t\t\t\t\t\ttitle: false,\n\t\t\t\t\t\t\tedittype: 'select',\n\t\t\t\t\t\t\teditoptions: {\n\t\t\t\t\t\t\t\tdefaultValue: meta_data.default_value, //This is required to prevent a blank cell from appearing if they haven't saved the Tax/Deduction record since the upgrade.\n\t\t\t\t\t\t\t\tvalue: $this.getColumnOptionsString( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.buildRecordArray */ .x.buildRecordArray( meta_data.multi_select_items ) ),\n\t\t\t\t\t\t\t\t//dataEvents: [ {type: 'change', fn:function(e) { $this.onFormItemChange( e.target, true )}} ],\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcolumn_info = {\n\t\t\t\t\t\t\tname: key,\n\t\t\t\t\t\t\tindex: key,\n\t\t\t\t\t\t\tlabel: meta_data.name,\n\t\t\t\t\t\t\twidth: meta_data.width,\n\t\t\t\t\t\t\tsortable: false,\n\t\t\t\t\t\t\ttitle: false,\n\t\t\t\t\t\t\teditable: true,\n\t\t\t\t\t\t\tedittype: 'text'\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tcolumn_info_array.push( column_info );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\tif ( ( this.current_edit_record.minimum_length_of_service && this.current_edit_record.minimum_length_of_service != 0 ) ||\n\t\t\t( this.current_edit_record.maximum_length_of_service && this.current_edit_record.maximum_length_of_service ) != 0 ) {\n\t\t\tcolumn_info = {\n\t\t\t\tname: 'length_of_service_date',\n\t\t\t\tindex: 'length_of_service_date',\n\t\t\t\tlabel: $.i18n._( 'Length of Service Date' ),\n\t\t\t\twidth: 110,\n\t\t\t\tsortable: false,\n\t\t\t\ttitle: false,\n\t\t\t\teditable: false,\n\t\t\t\tformatter: this.onLengthDateCellFormat\n\t\t\t};\n\t\t\tcolumn_info_array.push( column_info );\n\t\t} else {\n\t\t\t$( '.row-date-picker-length-of-service-date' ).remove();\n\t\t}\n\n\t\tif ( this.current_edit_record.start_date || this.current_edit_record.end_date ) {\n\t\t\tcolumn_info = {\n\t\t\t\tname: 'start_date',\n\t\t\t\tindex: 'start_date',\n\t\t\t\tlabel: $.i18n._( 'Start Date' ),\n\t\t\t\twidth: 110,\n\t\t\t\tsortable: false,\n\t\t\t\ttitle: false,\n\t\t\t\teditable: false,\n\t\t\t\tformatter: this.onStartDateCellFormat\n\t\t\t};\n\t\t\tcolumn_info_array.push( column_info );\n\n\t\t\tcolumn_info = {\n\t\t\t\tname: 'end_date',\n\t\t\t\tindex: 'end_date',\n\t\t\t\tlabel: $.i18n._( 'End Date' ),\n\t\t\t\twidth: 110,\n\t\t\t\tsortable: false,\n\t\t\t\ttitle: false,\n\t\t\t\teditable: false,\n\t\t\t\tformatter: this.onEndDateCellFormat\n\t\t\t};\n\t\t\tcolumn_info_array.push( column_info );\n\t\t} else {\n\t\t\t$( '.row-date-picker-start-date' ).remove();\n\t\t\t$( '.row-date-picker-end-date' ).remove();\n\t\t}\n\n\t\t//Add Exempt column to all Federal/Provincial/State/District taxes.\n\t\tif ( ( this.current_edit_record.calculation_id == 100 || this.current_edit_record.calculation_id == 200 || this.current_edit_record.calculation_id == 300 ) && this.current_edit_record.country == 'US' ) {\n\t\t\tcolumn_info = {\n\t\t\t\tname: 'user_value10',\n\t\t\t\tindex: 'user_value10',\n\t\t\t\tlabel: $.i18n._( 'Exempt' ),\n\t\t\t\twidth: 30,\n\t\t\t\tsortable: false,\n\t\t\t\tformatter: 'select',\n\t\t\t\teditable: true,\n\t\t\t\ttitle: false,\n\t\t\t\tedittype: 'select',\n\t\t\t\teditoptions: { value: this.getColumnOptionsString( this.yes_no_array ) }\n\t\t\t};\n\t\t\tcolumn_info_array.push( column_info );\n\t\t}\n\n\t\tif ( this.employee_setting_grid ) {\n\t\t\tthis.employee_setting_grid.grid.jqGrid( 'GridUnload' );\n\t\t\tthis.employee_setting_grid = null;\n\t\t}\n\n\t\tthis.employee_setting_grid = new TTGrid( 'employee_setting_grid', {\n\t\t\tcontainer_selector: '.edit-view-tab',\n\t\t\tmultiselect: false,\n\t\t\twinMultiSelect: false,\n\t\t\tcolModel: column_info_array,\n\t\t\tediturl: 'clientArray',\n\t\t\tonSelectRow: function( id ) {\n\t\t\t\tif ( id && !$this.is_viewing ) {\n\n\t\t\t\t\tif ( $this.select_grid_last_row ) {\n\t\t\t\t\t\t$this.employee_setting_grid.grid.jqGrid( 'saveRow', $this.select_grid_last_row );\n\t\t\t\t\t\t$this.setDateCellsEnabled( false, $this.select_grid_last_row );\n\t\t\t\t\t}\n\n\t\t\t\t\t$this.employee_setting_grid.grid.jqGrid( 'editRow', id, true );\n\t\t\t\t\t$this.setDateCellsEnabled( true, id );\n\t\t\t\t\t$this.select_grid_last_row = id;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonEndEditRow: function( id ) {\n\t\t\t\t$this.setDateCellsEnabled( false, id );\n\t\t\t},\n\t\t\tgridComplete: function() {\n\t\t\t\t$this.setEmployeeGridSize();\n\t\t\t}\n\t\t}, column_info_array );\n\n\t\treturn column_info_array;\n\t}\n\n\tsetEditViewTabSize() {\n\t\tsuper.setEditViewTabSize();\n\t\tthis.setEmployeeGridSize();\n\t}\n\n\tsetDateCellsEnabled( flag, row_id ) {\n\t\tthis.length_dates_dic[row_id] && this.length_dates_dic[row_id].setEnabled( flag );\n\t\tthis.start_dates_dic[row_id] && this.start_dates_dic[row_id].setEnabled( flag );\n\t\tthis.end_dates_dic[row_id] && this.end_dates_dic[row_id].setEnabled( flag );\n\t}\n\n\tonLengthDateCellFormat( cell_value, related_data, row ) {\n\n\t\tvar form_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.DATE_PICKER );\n\t\tform_item_input.addClass( 'row-date-picker-length-of-service-date' );\n\t\tform_item_input.attr( 'widget-value', cell_value );\n\t\treturn form_item_input.get( 0 ).outerHTML;\n\t}\n\n\tonStartDateCellFormat( cell_value, related_data, row ) {\n\n\t\tvar form_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.DATE_PICKER );\n\t\tform_item_input.addClass( 'row-date-picker-start-date' );\n\t\tform_item_input.attr( 'widget-value', cell_value );\n\t\treturn form_item_input.get( 0 ).outerHTML;\n\t}\n\n\tonEndDateCellFormat( cell_value, related_data, row ) {\n\n\t\tvar form_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.DATE_PICKER );\n\t\tform_item_input.addClass( 'row-date-picker-end-date' );\n\t\tform_item_input.attr( 'widget-value', cell_value );\n\t\treturn form_item_input.get( 0 ).outerHTML;\n\t}\n\n\tsetEmployeeSettingGridData( column_info_array ) {\n\n\t\tvar $this = this;\n\t\tvar grid_source = [];\n\t\tif ( $.type( this.employee_setting_result ) === 'array' ) {\n\t\t\tgrid_source = this.employee_setting_result.slice();\n\t\t}\n\n\t\tvar len = grid_source.length;\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tvar item = grid_source[i];\n\t\t\titem.user_name = ( ( item.user_status_id != 10 ) ? '(' + item.user_status + ') ' : '' ) + item.full_name;\n\t\t\tfor ( var j = 1; j < column_info_array.length; j++ ) {\n\n\t\t\t\tvar column = column_info_array[j];\n\t\t\t\tif ( !item[column.name] ) {\n\t\t\t\t\titem[column.name] = ( this.current_edit_record.hasOwnProperty( column.name ) && this.current_edit_record[column.name] !== false ) ? this.current_edit_record[column.name] : '';\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t$this.employee_setting_grid.setData( grid_source );\n\t\tthis.removeEmployeeSettingNoResultCover();\n\t\tthis.setEmployeeGridDateColumns();\n\n\t\tthis.setEmployeeGridSize();\n\n\t\tif ( grid_source.length < 1 && this.current_edit_record.id ) {\n\t\t\tthis.showEmployeeSettingNoResultCover();\n\t\t}\n\t}\n\n\tsetEmployeeGridDateColumns() {\n\t\tvar i, date_picker;\n\t\tthis.length_dates = [];\n\t\tthis.start_dates = [];\n\t\tthis.end_dates = [];\n\t\tthis.length_dates_dic = {};\n\t\tthis.start_dates_dic = {};\n\t\tthis.end_dates_dic = {};\n\t\tvar date_pickers = $( '.row-date-picker-length-of-service-date' );\n\t\tfor ( var i = 0; i < date_pickers.length; i++ ) {\n\t\t\tdate_picker = $( date_pickers[i] ).TDatePicker( { field: 'length_of_service_date' + i } );\n\t\t\tdate_picker.setEnabled( false );\n\t\t\tthis.length_dates.push( date_picker );\n\t\t\tthis.length_dates_dic[date_picker.parent().parent().attr( 'id' )] = date_picker;\n\t\t}\n\t\tdate_pickers = $( '.row-date-picker-start-date' );\n\t\tfor ( var i = 0; i < date_pickers.length; i++ ) {\n\t\t\tdate_picker = $( date_pickers[i] ).TDatePicker( { field: 'start_date' + i } );\n\t\t\tdate_picker.setEnabled( false );\n\t\t\tthis.start_dates.push( date_picker );\n\t\t\tthis.start_dates_dic[date_picker.parent().parent().attr( 'id' )] = date_picker;\n\t\t}\n\t\tdate_pickers = $( '.row-date-picker-end-date' );\n\t\tfor ( var i = 0; i < date_pickers.length; i++ ) {\n\t\t\tdate_picker = $( date_pickers[i] ).TDatePicker( { field: 'end_date' + i } );\n\t\t\tdate_picker.setEnabled( false );\n\t\t\tthis.end_dates.push( date_picker );\n\t\t\tthis.end_dates_dic[date_picker.parent().parent().attr( 'id' )] = date_picker;\n\t\t}\n\t}\n\n\tshowEmployeeSettingNoResultCover() {\n\n\t\tthis.removeEmployeeSettingNoResultCover();\n\t\tthis.employee_setting_no_result_box = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( WidgetNamesDic.NO_RESULT_BOX );\n\t\tthis.employee_setting_no_result_box.NoResultBox( { related_view_controller: this, is_new: false } );\n\t\tthis.employee_setting_no_result_box.attr( 'id', this.ui_id + 'employee_setting_no_result_box' );\n\t\tvar grid_div = this.edit_view.find( '.employee-setting-grid-div' );\n\n\t\tgrid_div.append( this.employee_setting_no_result_box );\n\t}\n\n\tremoveEmployeeSettingNoResultCover() {\n\t\tif ( this.employee_setting_no_result_box && this.employee_setting_no_result_box.length > 0 ) {\n\t\t\tthis.employee_setting_no_result_box.remove();\n\t\t}\n\t\tthis.employee_setting_no_result_box = null;\n\t}\n\n\tsetEmployeeGridSize() {\n\t\tif ( !this.employee_setting_grid ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar tab_employee_setting = this.edit_view.find( '#tab_employee_setting_content_div' );\n\t\tthis.employee_setting_grid.grid.setGridWidth( tab_employee_setting.width() );\n\t\tthis.employee_setting_grid.grid.setGridHeight( tab_employee_setting.height() );\n\t}\n\n\tsetCountryVisibility() {\n\n\t\tif ( this.show_c ) {\n\t\t\tthis.attachElement( 'country' );\n\t\t} else {\n\t\t\tthis.detachElement( 'country' );\n\t\t}\n\t}\n\n\tsetProvinceVisibility() {\n\t\tif ( this.show_p && this.e_province_array && this.e_province_array.length > 1 ) {\n\t\t\tthis.attachElement( 'province' );\n\t\t} else {\n\t\t\tthis.detachElement( 'province' );\n\t\t}\n\t}\n\n\tsetDistrictVisibility() {\n\n\t\tif ( this.show_dc && this.province_district_array && this.province_district_array.length > 0 ) {\n\t\t\tthis.attachElement( 'district' );\n\t\t} else {\n\t\t\tthis.detachElement( 'district' );\n\t\t\tthis.current_edit_record.district = false;\n\t\t}\n\t}\n\n\tsetDynamicFields( callBack, countryOrP ) {\n\n\t\tvar $this = this;\n\t\tif ( !this.current_edit_record.calculation_id ) {\n\t\t\tthis.current_edit_record.calculation_id = '10';\n\t\t\tthis.edit_view_ui_dic.calculation_id.setValue( 10 );\n\t\t}\n\n\t\tvar c_id = this.current_edit_record.calculation_id;\n\n\t\tif ( c_id == 20 ) {\n\t\t\tthis.detachElement( 'include_account_amount_type_id' );\n\t\t\tthis.detachElement( 'exclude_account_amount_type_id' );\n\t\t} else {\n\t\t\tthis.attachElement( 'include_account_amount_type_id' );\n\t\t\tthis.attachElement( 'exclude_account_amount_type_id' );\n\t\t}\n\n\t\tif ( !countryOrP ) {\n\t\t\tthis.hideAllDynamicFields();\n\t\t\tthis.api.isCountryCalculationID( c_id, {\n\t\t\t\tonResult: function( result_1 ) {\n\t\t\t\t\tvar res_data_1 = result_1.getResult();\n\n\t\t\t\t\tif ( res_data_1 === true ) {\n\t\t\t\t\t\t$this.show_c = true;\n\t\t\t\t\t\t$this.setCountryVisibility();\n\t\t\t\t\t\t$this.api.isProvinceCalculationID( c_id, {\n\t\t\t\t\t\t\tonResult: function( result_2 ) {\n\t\t\t\t\t\t\t\tvar res_data_2 = result_2.getResult();\n\t\t\t\t\t\t\t\tif ( res_data_2 === true ) {\n\t\t\t\t\t\t\t\t\t$this.show_p = true;\n\n\t\t\t\t\t\t\t\t\tif ( $this.current_edit_record.country ) {\n\t\t\t\t\t\t\t\t\t\t$this.eSetProvince( $this.current_edit_record.country );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t$this.api.isDistrictCalculationID( c_id, {\n\t\t\t\t\t\t\t\t\t\tonResult: function( result_3 ) {\n\t\t\t\t\t\t\t\t\t\t\tvar res_data_3 = result_3.getResult();\n\n\t\t\t\t\t\t\t\t\t\t\tif ( res_data_3 === true ) {\n\t\t\t\t\t\t\t\t\t\t\t\t$this.show_dc = true;\n\n\t\t\t\t\t\t\t\t\t\t\t\tif ( $this.current_edit_record.country ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t$this.setDistrict( $this.current_edit_record.country );\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\thandleDynamicFields();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tif ( $this.current_edit_record ) {\n\t\t\t\t\t\t\t\t\t\thandleDynamicFields();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$this.hideAllDynamicFields();\n\t\t\t\t\t\thandleDynamicFields();\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t} );\n\t\t} else {\n\t\t\tif ( !this.show_p ) {\n\t\t\t\t$this.hideAllDynamicFields( true, false );\n\t\t\t\thandleDynamicFields();\n\t\t\t} else {\n\t\t\t\t$this.hideAllDynamicFields( true, true );\n\t\t\t\thandleDynamicFields();\n\t\t\t}\n\t\t}\n\n\t\tfunction handleDynamicFields() {\n\t\t\tif ( !$this.edit_view ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( $this.current_edit_record.calculation_id == '100' || $this.current_edit_record.calculation_id == '200' || $this.current_edit_record.calculation_id == '300' ) {\n\t\t\t\t$this.attachElement( 'df_15' );\n\t\t\t\t$this.edit_view_form_item_dic.df_15.find( '.edit-view-form-item-label' ).text( $.i18n._( 'Formula Type' ) );\n\t\t\t\t$this.edit_view_ui_dic.df_15.setField( 'company_value1' );\n\t\t\t\t$this.edit_view_ui_dic.df_15.setValue( $this.current_edit_record.company_value1 );\n\t\t\t}\n\n\t\t\tif ( $this.current_edit_record.calculation_id == '69' && _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getProductEdition */ .x.getProductEdition() == 10 ) {\n\t\t\t\t$this.attachElement( 'df_100' );\n\t\t\t\t$this.edit_view_ui_dic.df_100.html( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getUpgradeMessage */ .x.getUpgradeMessage() );\n\t\t\t} else {\n\t\t\t\t$this.api.getOptions( 'calculation_type_column_meta_data', {\n\t\t\t\t\t'calculation_id': $this.current_edit_record.calculation_id,\n\t\t\t\t\t'country': $this.current_edit_record.country,\n\t\t\t\t\t'province': $this.current_edit_record.province,\n\n\t\t\t\t}, {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tresult = result.getResult();\n\n\t\t\t\t\t\tfor ( var key in result ) {\n\t\t\t\t\t\t\tlet meta_data = result[key];\n\t\t\t\t\t\t\tlet dynamic_field_id = meta_data['dynamic_field_id'];\n\n\t\t\t\t\t\t\t$this.attachElement( dynamic_field_id );\n\t\t\t\t\t\t\t$this.edit_view_form_item_dic[dynamic_field_id].find( '.edit-view-form-item-label' ).text( meta_data.name.replace('<br>', ' ') );\n\t\t\t\t\t\t\tif ( meta_data.type_id == 2100 ) {\n\t\t\t\t\t\t\t\t$this.edit_view_ui_dic[dynamic_field_id].setSourceData( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.buildRecordArray */ .x.buildRecordArray( meta_data.multi_select_items ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$this.edit_view_ui_dic[dynamic_field_id].setField( key );\n\t\t\t\t\t\t\t$this.edit_view_ui_dic[dynamic_field_id].setValue( $this.current_edit_record[key] );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( $this.current_edit_record.calculation_id == '69' ) { //69=Custom Formula.\n\t\t\t\t\t\t\t$this.attachElement( 'df_11' );\n\t\t\t\t\t\t\t$this.edit_view_form_item_dic.df_11.find( '.edit-view-form-item-label' ).text( $.i18n._( 'Formula' ) );\n\t\t\t\t\t\t\t$this.edit_view_ui_dic.df_11.setField( 'company_value1' );\n\t\t\t\t\t\t\t$this.edit_view_ui_dic.df_11.setValue( $this.current_edit_record.company_value1 );\n\n\t\t\t\t\t\t\t$this.attachElement( 'df_12' );\n\t\t\t\t\t\t\t$this.edit_view_form_item_dic.df_12.find( '.edit-view-form-item-label' ).text( $.i18n._( 'Look Back Period' ) );\n\t\t\t\t\t\t\t$this.edit_view_ui_dic.df_12.setField( 'company_value2' );\n\t\t\t\t\t\t\t$this.edit_view_ui_dic.df_12.setValue( $this.current_edit_record.company_value2 );\n\t\t\t\t\t\t\t$this.edit_view_ui_dic.df_13.setField( 'company_value3' );\n\t\t\t\t\t\t\t$this.edit_view_ui_dic.df_13.setValue( $this.current_edit_record.company_value3 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$this.editFieldResize( $this.getEditViewTabIndex() );\n\t\t\t\t\t\tif ( callBack ) {\n\t\t\t\t\t\t\tcallBack();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t}\n\n\t//When its a 2020 or later Form W4, try to disable the Allowance field as its not on the form.\n\t// This is most important when using the Employee Settings tab though.\n\tonFormW4VersionChange() {\n\t\tif ( this.current_edit_record.calculation_id == 100 && this.current_edit_record.country == 'US' ) {\n\t\t\t// if ( this.edit_view_ui_dic.df_20.getValue() == 2020 ) {\n\t\t\t// \tthis.edit_view_ui_dic.df_1.setEnabled( false );\n\t\t\t// \tthis.edit_view_ui_dic.df_21.setEnabled( true );\n\t\t\t// \tthis.edit_view_ui_dic.df_22.setEnabled( true );\n\t\t\t// \tthis.edit_view_ui_dic.df_23.setEnabled( true );\n\t\t\t// \tthis.edit_view_ui_dic.df_24.setEnabled( true );\n\t\t\t// \tthis.edit_view_ui_dic.df_25.setEnabled( true );\n\t\t\t// } else {\n\t\t\t// \tthis.edit_view_ui_dic.df_1.setEnabled( true );\n\t\t\t// \tthis.edit_view_ui_dic.df_21.setEnabled( false );\n\t\t\t// \tthis.edit_view_ui_dic.df_22.setEnabled( false );\n\t\t\t// \tthis.edit_view_ui_dic.df_23.setEnabled( false );\n\t\t\t// \tthis.edit_view_ui_dic.df_24.setEnabled( false );\n\t\t\t// \tthis.edit_view_ui_dic.df_25.setEnabled( false );\n\t\t\t// }\n\t\t}\n\t}\n\n\tonApplyFrequencyChange() {\n\t\tthis.edit_view_ui_dic['apply_frequency_day_of_month1'].parent().parent().css( 'display', 'none' ); //Special fields for Semi-Monthly\n\t\tthis.edit_view_ui_dic['apply_frequency_day_of_month2'].parent().parent().css( 'display', 'none' ); //Special fields for Semi-Monthly\n\n\t\tif ( this.current_edit_record.apply_frequency_id == 10 ||\n\t\t\tthis.current_edit_record.apply_frequency_id == 100 ||\n\t\t\tthis.current_edit_record.apply_frequency_id == 110 ||\n\t\t\tthis.current_edit_record.apply_frequency_id == 120 ||\n\t\t\tthis.current_edit_record.apply_frequency_id == 130 ) {\n\n\t\t\tthis.edit_view_ui_dic['apply_frequency_month'].parent().parent().css( 'display', 'none' );\n\t\t\tthis.edit_view_ui_dic['apply_frequency_day_of_month'].parent().parent().css( 'display', 'none' );\n\t\t\tthis.edit_view_ui_dic['apply_frequency_quarter_month'].parent().parent().css( 'display', 'none' );\n\t\t} else if ( this.current_edit_record.apply_frequency_id == 20 ) {\n\t\t\tthis.edit_view_ui_dic['apply_frequency_month'].parent().parent().css( 'display', 'block' );\n\t\t\tthis.edit_view_ui_dic['apply_frequency_day_of_month'].parent().parent().css( 'display', 'block' );\n\t\t\tthis.edit_view_ui_dic['apply_frequency_quarter_month'].parent().parent().css( 'display', 'none' );\n\t\t} else if ( this.current_edit_record.apply_frequency_id == 25 ) {\n\t\t\tthis.edit_view_ui_dic['apply_frequency_month'].parent().parent().css( 'display', 'none' );\n\t\t\tthis.edit_view_ui_dic['apply_frequency_day_of_month'].parent().parent().css( 'display', 'block' );\n\t\t\tthis.edit_view_ui_dic['apply_frequency_quarter_month'].parent().parent().css( 'display', 'block' );\n\t\t} else if ( this.current_edit_record.apply_frequency_id == 30 ) {\n\t\t\tthis.edit_view_ui_dic['apply_frequency_month'].parent().parent().css( 'display', 'none' );\n\t\t\tthis.edit_view_ui_dic['apply_frequency_day_of_month'].parent().parent().css( 'display', 'block' );\n\t\t\tthis.edit_view_ui_dic['apply_frequency_quarter_month'].parent().parent().css( 'display', 'none' );\n\t\t} else if ( this.current_edit_record.apply_frequency_id == 35 ) {\n\t\t\tthis.edit_view_ui_dic['apply_frequency_day_of_month1'].parent().parent().css( 'display', 'block' ); //Special fields for Semi-Monthly\n\t\t\tthis.edit_view_ui_dic['apply_frequency_day_of_month2'].parent().parent().css( 'display', 'block' ); //Special fields for Semi-Monthly\n\n\t\t\tthis.edit_view_ui_dic['apply_frequency_month'].parent().parent().css( 'display', 'none' );\n\t\t\tthis.edit_view_ui_dic['apply_frequency_day_of_month'].parent().parent().css( 'display', 'none' );\n\t\t\tthis.edit_view_ui_dic['apply_frequency_quarter_month'].parent().parent().css( 'display', 'none' );\n\t\t}\n\n\t\tthis.editFieldResize();\n\t}\n\n\tonCalculationChange() {\n\t}\n\n\tbuildEditViewUI() {\n\t\tTTPromise.add( 'CompanyTaxDeduction', 'buildEditViewUI' );\n\n\t\tsuper.buildEditViewUI();\n\n\t\tvar $this = this;\n\n\t\tvar tab_model = {\n\t\t\t'tab_tax_deductions': {\n\t\t\t\t'label': $.i18n._( 'Tax / Deductions' )\n\t\t\t},\n\t\t\t'tab_eligibility': { 'label': $.i18n._( 'Eligibility' ) },\n\t\t\t'tab_employee_setting': {\n\t\t\t\t'label': $.i18n._( 'Employee Settings' ),\n\t\t\t\t'init_callback': 'initEmployeeSetting',\n\t\t\t\t'display_on_mass_edit': false,\n\t\t\t\t'html_template': this.getCompanyTaxDeductionEmployeeSettingTabHtml()\n\t\t\t}, //Callback was: setEmployeeGridSize\n\t\t\t'tab5': {\n\t\t\t\t'label': $.i18n._( 'Tax / Deductions' ),\n\t\t\t\t'display_on_mass_edit': false\n\t\t\t},\n\t\t\t'tab_attachment': true,\n\t\t\t'tab_audit': true,\n\t\t};\n\t\tthis.setTabModel( tab_model );\n\n\t\tthis.edit_view.children().eq( 0 ).css( 'min-width', 1170 );\n\n\t\tthis.navigation.AComboBox( {\n\t\t\tid: this.script_name + '_navigation',\n\t\t\tapi_class: TTAPI.APICompanyDeduction,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_deduction',\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_tax_deductions = this.edit_view_tab.find( '#tab_tax_deductions' );\n\n\t\tvar tab_tax_deductions_column1 = tab_tax_deductions.find( '.first-column' );\n\t\tthis.edit_view_tabs[0] = [];\n\n\t\tthis.edit_view_tabs[0].push( tab_tax_deductions_column1 );\n\n\t\tvar form_item_input;\n\t\tvar widgetContainer;\n\t\tvar label;\n\n\t\t// Status\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\n\t\tform_item_input.TComboBox( { field: 'status_id', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.status_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Status' ), form_item_input, tab_tax_deductions_column1, '' );\n\n\t\t// Type\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\n\t\tform_item_input.TComboBox( { field: 'type_id', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.type_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Type' ), form_item_input, tab_tax_deductions_column1 );\n\n\t\t//Legal entity\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\tform_item_input.TText( { field: 'legal_entity_id' } );\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APILegalEntity,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_legal_entity',\n\t\t\tshow_search_inputs: false,\n\t\t\tset_empty: true,\n\t\t\tfield: 'legal_entity_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Legal Entity' ), form_item_input, tab_tax_deductions_column1 );\n\n\t\t//Payroll Remittance Agency\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIPayrollRemittanceAgency,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_payroll_remittance_agency',\n\t\t\tset_empty: true,\n\t\t\tfield: 'payroll_remittance_agency_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Remittance Agency' ), form_item_input, tab_tax_deductions_column1 );\n\n\t\t//Name\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'name', width: '100%' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Name' ), form_item_input, tab_tax_deductions_column1 );\n\n\t\tform_item_input.parent().width( '45%' );\n\n\t\t// Description\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_AREA );\n\t\tform_item_input.TTextArea( { field: 'description', width: '100%' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Description' ), form_item_input, tab_tax_deductions_column1, '', null, null, true );\n\t\tform_item_input.parent().width( '45%' );\n\n\t\t//Pay Stub Note (Public)\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'pay_stub_entry_description', width: 300 } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Pay Stub Note (Public)' ), form_item_input, tab_tax_deductions_column1 );\n\n\t\t//Calculation Settings label\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.SEPARATED_BOX );\n\t\tform_item_input.SeparatedBox( { label: $.i18n._( 'Calculation Settings' ) } );\n\t\tthis.addEditFieldToColumn( null, form_item_input, tab_tax_deductions_column1, '', null, true, false, 'separated_2' );\n\n\t\t//Calculation\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'calculation_id', set_empty: false, width: 400 } );\n\t\tform_item_input.setSourceData( $this.calculation_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Calculation' ), form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Dynamic Field 15\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'df_15', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.tax_formula_type_array );\n\t\tthis.addEditFieldToColumn( 'df_15', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Country\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'country', set_empty: true } );\n\t\tform_item_input.setSourceData( $this.country_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Country' ), form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Province\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'province' } );\n\t\tform_item_input.setSourceData( [] );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Province/State' ), form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// District\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'district', set_empty: false } );\n\t\tform_item_input.setSourceData( [] );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'District' ), form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Dynamic Field 0\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'df_0' } );\n\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'> %</span>' );\n\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\t\tthis.addEditFieldToColumn( 'df_0', form_item_input, tab_tax_deductions_column1, '', widgetContainer, true );\n\n\t\t//Dynamic Field 20 -- Form W-4 Version (Should go above Filing Status)\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'df_20', set_empty: false } );\n\t\tthis.addEditFieldToColumn( 'df_20', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t//Dynamic Field 14 -- Filing Status\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'df_14', set_empty: false } ); //Don't show empty value (NONE), so a filing status will always selected.\n\t\tthis.addEditFieldToColumn( 'df_14', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Dynamic Field 1\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'df_1' } );\n\t\tthis.addEditFieldToColumn( 'df_1', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Dynamic Field 2\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'df_2' } );\n\t\tthis.addEditFieldToColumn( 'df_2', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Dynamic Field 3\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'df_3' } );\n\t\tthis.addEditFieldToColumn( 'df_3', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Dynamic Field 4\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'df_4' } );\n\t\tthis.addEditFieldToColumn( 'df_4', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Dynamic Field 5\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'df_5' } );\n\t\tthis.addEditFieldToColumn( 'df_5', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Dynamic Field 6\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'df_6' } );\n\t\tthis.addEditFieldToColumn( 'df_6', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Dynamic Field 7\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'df_7' } );\n\t\tthis.addEditFieldToColumn( 'df_7', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Dynamic Field 8\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'df_8' } );\n\t\tthis.addEditFieldToColumn( 'df_8', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Dynamic Field 9\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'df_9' } );\n\t\tthis.addEditFieldToColumn( 'df_9', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Dynamic Field 10\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'df_10' } );\n\t\tthis.addEditFieldToColumn( 'df_10', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\tif ( ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.getProductEdition */ .x.getProductEdition() >= 15 ) ) {\n\t\t\tTTPromise.add( 'CompanyTaxDeduction', 'df_11' );\n\t\t\t_global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadScript */ .x.loadScript( 'global/widgets/formula_builder/FormulaBuilder.js', function() {\n\t\t\t\t// Dynamic Field 11\n\t\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.FORMULA_BUILDER );\n\t\t\t\tform_item_input.FormulaBuilder( {\n\t\t\t\t\tfield: 'df_11', width: '100%', onFormulaBtnClick: function() {\n\n\t\t\t\t\t\tvar custom_column_api = TTAPI.APIReportCustomColumn;\n\n\t\t\t\t\t\tcustom_column_api.getOptions( 'formula_functions', {\n\t\t\t\t\t\t\tonResult: function( fun_result ) {\n\t\t\t\t\t\t\t\tvar fun_res_data = fun_result.getResult();\n\n\t\t\t\t\t\t\t\t$this.api.getOptions( 'formula_variables', { onResult: onColumnsResult } );\n\n\t\t\t\t\t\t\t\tfunction onColumnsResult( col_result ) {\n\t\t\t\t\t\t\t\t\tvar col_res_data = col_result.getResult();\n\n\t\t\t\t\t\t\t\t\tvar default_args = {};\n\t\t\t\t\t\t\t\t\tdefault_args.functions = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.buildRecordArray */ .x.buildRecordArray( fun_res_data );\n\t\t\t\t\t\t\t\t\tdefault_args.variables = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.buildRecordArray */ .x.buildRecordArray( col_res_data );\n\t\t\t\t\t\t\t\t\tdefault_args.formula = $this.current_edit_record.company_value1;\n\t\t\t\t\t\t\t\t\tdefault_args.current_edit_record = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.clone */ .x.clone( $this.current_edit_record );\n\t\t\t\t\t\t\t\t\tdefault_args.api = $this.api;\n\n\t\t\t\t\t\t\t\t\tIndexViewController.openWizard( 'FormulaBuilderWizard', default_args, function( val ) {\n\t\t\t\t\t\t\t\t\t\t$this.current_edit_record.company_value1 = val;\n\t\t\t\t\t\t\t\t\t\t$this.edit_view_ui_dic.df_11.setValue( val );\n\t\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t$this.addEditFieldToColumn( 'df_11', form_item_input, tab_tax_deductions_column1, '', null, true );\n\t\t\t\t$this.detachElement( 'df_11' );\n\t\t\t\tform_item_input.parent().width( '45%' );\n\t\t\t\tTTPromise.resolve( 'CompanyTaxDeduction', 'df_11' );\n\t\t\t} );\n\t\t} else {\n\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_AREA );\n\t\t\tform_item_input.TTextInput( { field: 'df_11' } );\n\t\t\tthis.addEditFieldToColumn( 'df_11', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT );\n\t\t\tform_item_input.TText( { field: 'df_100' } );\n\t\t\tthis.addEditFieldToColumn( 'Warning', form_item_input, tab_tax_deductions_column1, '', null, true );\n\t\t}\n\n\t\t//Dynamic Field 12,13\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'df_12', width: 30 } );\n\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'> ' + ' ' + ' </span>' );\n\n\t\tvar widget_combo_box = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\twidget_combo_box.TComboBox( { field: 'df_13' } );\n\t\twidget_combo_box.setSourceData( $this.look_back_unit_array );\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\t\twidgetContainer.append( widget_combo_box );\n\t\tthis.addEditFieldToColumn( 'df_12', [form_item_input, widget_combo_box], tab_tax_deductions_column1, '', widgetContainer, true );\n\n\t\t//Dynamic Field 21 -- Multiple Jobs or Spouse Works\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'df_21', set_empty: false } );\n\t\tthis.addEditFieldToColumn( 'df_21', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Dynamic Field 22\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'df_22' } );\n\t\tthis.addEditFieldToColumn( 'df_22', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Dynamic Field 23\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'df_23' } );\n\t\tthis.addEditFieldToColumn( 'df_23', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Dynamic Field 24\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'df_24' } );\n\t\tthis.addEditFieldToColumn( 'df_24', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\t// Dynamic Field 25\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'df_25' } );\n\t\tthis.addEditFieldToColumn( 'df_25', form_item_input, tab_tax_deductions_column1, '', null, true );\n\n\t\tif ( !this.sub_view_mode ) {\n\t\t\t//Pay Stub Account\n\n\t\t\tvar default_args = {};\n\t\t\tdefault_args.filter_data = {};\n\t\t\tdefault_args.filter_data.type_id = [10, 20, 30, 50, 80];\n\n\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIPayStubEntryAccount,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_PayStubAccount',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tfield: 'pay_stub_entry_account_id'\n\n\t\t\t} );\n\t\t\tform_item_input.setDefaultArgs( default_args );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Pay Stub Account' ), form_item_input, tab_tax_deductions_column1 );\n\t\t}\n\n\t\t// Calculation Order\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'calculation_order', width: 30 } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Calculation Order' ), form_item_input, tab_tax_deductions_column1 );\n\n\t\t// Include Pay Stub Accounts\n\t\tvar v_box = $( '<div class=\\'v-box\\'></div>' );\n\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'include_account_amount_type_id', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.account_amount_type_array );\n\n\t\tvar form_item = this.putInputToInsideFormItem( form_item_input, $.i18n._( 'Pay Stub Account Value' ) );\n\n\t\tv_box.append( form_item );\n\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\n\t\tif ( !this.sub_view_mode ) {\n\t\t\tvar form_item_input_1 = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tform_item_input_1.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIPayStubEntryAccount,\n\t\t\t\tallow_multiple_selection: true,\n\t\t\t\tlayout_name: 'global_PayStubAccount',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tfield: 'include_pay_stub_entry_account'\n\t\t\t} );\n\t\t\tform_item = this.putInputToInsideFormItem( form_item_input_1, $.i18n._( 'Selection' ) );\n\t\t\tv_box.append( form_item );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Include Pay Stub Accounts' ), [form_item_input, form_item_input_1], tab_tax_deductions_column1, null, v_box, true, true );\n\n\t\t}\n\n\t\t// Exclude Pay Stub Accounts\n\t\tv_box = $( '<div class=\\'v-box\\'></div>' );\n\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'exclude_account_amount_type_id', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.account_amount_type_array );\n\n\t\tform_item = this.putInputToInsideFormItem( form_item_input, $.i18n._( 'Pay Stub Account Value' ) );\n\n\t\tv_box.append( form_item );\n\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\tif ( !this.sub_view_mode ) {\n\t\t\tform_item_input_1 = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\t\tform_item_input_1.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIPayStubEntryAccount,\n\t\t\t\tallow_multiple_selection: true,\n\t\t\t\tlayout_name: 'global_PayStubAccount',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tfield: 'exclude_pay_stub_entry_account'\n\t\t\t} );\n\n\t\t\tform_item = this.putInputToInsideFormItem( form_item_input_1, $.i18n._( 'Selection' ) );\n\t\t\tv_box.append( form_item );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Exclude Pay Stub Accounts' ), [form_item_input, form_item_input_1], tab_tax_deductions_column1, null, v_box, true, true );\n\t\t}\n\n\t\tif ( !this.sub_view_mode ) {\n\t\t\t// employees\n\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tallow_multiple_selection: true,\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tfield: 'user'\n\t\t\t} );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Employees' ), form_item_input, tab_tax_deductions_column1, '' );\n\t\t}\n\t\t// Tab1 start\n\n\t\tvar tab_eligibility = this.edit_view_tab.find( '#tab_eligibility' );\n\n\t\tvar tab_eligibility_column1 = tab_eligibility.find( '.first-column' );\n\n\t\tthis.edit_view_tabs[1] = [];\n\n\t\tthis.edit_view_tabs[1].push( tab_eligibility_column1 );\n\n\t\t// Apply Frequency\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\n\t\tform_item_input.TComboBox( { field: 'apply_frequency_id', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.apply_frequency_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Apply Frequency' ), form_item_input, tab_eligibility_column1, '' );\n\n\t\t// Month\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\n\t\tform_item_input.TComboBox( { field: 'apply_frequency_month', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.month_of_year_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Month' ), form_item_input, tab_eligibility_column1, '', null, true );\n\n\t\t// Day of Month\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\n\t\tform_item_input.TComboBox( { field: 'apply_frequency_day_of_month', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.day_of_month_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Day of Month' ), form_item_input, tab_eligibility_column1, '', null, true );\n\n\t\t// Semi-Monthly: Primary Day of Month\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'apply_frequency_day_of_month1', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.day_of_month_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Primary Day of Month' ), form_item_input, tab_eligibility_column1, '', null, true );\n\n\t\t// Semi-Monthly: Secondary Day of Month\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'apply_frequency_day_of_month2', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.day_of_month_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Secondary Day of Month' ), form_item_input, tab_eligibility_column1, '', null, true );\n\n\t\t// Month of Quarter\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\n\t\tform_item_input.TComboBox( { field: 'apply_frequency_quarter_month', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.month_of_quarter_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Month of Quarter' ), form_item_input, tab_eligibility_column1, '', null, true );\n\n\t\t// Payroll Run Type\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\n\t\tform_item_input.TComboBox( {\n\t\t\tfield: 'apply_payroll_run_type_id',\n\t\t\tset_empty: true,\n\t\t\tcustomFirstItemLabel: _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.any_item */ .x.any_item\n\t\t} );\n\t\tform_item_input.setSourceData( $this.apply_payroll_run_type_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Payroll Run Type' ), form_item_input, tab_eligibility_column1, '' );\n\n\t\t// Start Date\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.DATE_PICKER );\n\n\t\tform_item_input.TDatePicker( { field: 'start_date' } );\n\n\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'>' + $.i18n._( '(Leave blank for no start date)' ) + '</span>' );\n\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Start Date' ), form_item_input, tab_eligibility_column1, '', widgetContainer );\n\n\t\t// End Date\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.DATE_PICKER );\n\n\t\tform_item_input.TDatePicker( { field: 'end_date' } );\n\n\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'>' + $.i18n._( '(Leave blank for no end date)' ) + '</span>' );\n\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'End Date' ), form_item_input, tab_eligibility_column1, '', widgetContainer );\n\n\t\t// Minimum Length Of Service\n\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'minimum_length_of_service', width: 30 } );\n\n\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'> ' + ' ' + ' </span>' );\n\n\t\twidget_combo_box = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\twidget_combo_box.TComboBox( { field: 'minimum_length_of_service_unit_id' } );\n\t\twidget_combo_box.setSourceData( $this.length_of_service_unit_array );\n\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\t\twidgetContainer.append( widget_combo_box );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Minimum Length Of Service' ), [form_item_input, widget_combo_box], tab_eligibility_column1, '', widgetContainer );\n\n\t\t// Maximum Length Of Service\n\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'maximum_length_of_service', width: 30 } );\n\n\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'> ' + ' ' + ' </span>' );\n\n\t\twidget_combo_box = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\twidget_combo_box.TComboBox( { field: 'maximum_length_of_service_unit_id' } );\n\t\twidget_combo_box.setSourceData( $this.length_of_service_unit_array );\n\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\t\twidgetContainer.append( widget_combo_box );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Maximum Length Of Service' ), [form_item_input, widget_combo_box], tab_eligibility_column1, '', widgetContainer );\n\t\tif ( !this.sub_view_mode ) {\n\t\t\t//Length of Service contributing pay codes.\n\t\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIContributingPayCodePolicy,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_contributing_pay_code_policy',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tset_default: true,\n\t\t\t\tfield: 'length_of_service_contributing_pay_code_policy_id'\n\t\t\t} );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Length Of Service Hours Based On' ), form_item_input, tab_eligibility_column1, '', null, true );\n\t\t}\n\t\t// Minimum Employee Age\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'minimum_user_age', width: 30 } );\n\n\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'>' + $.i18n._( 'years' ) + '</span>' );\n\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Minimum Employee Age' ), form_item_input, tab_eligibility_column1, '', widgetContainer );\n\n\t\t// Maximum Employee Age\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'maximum_user_age', width: 30 } );\n\n\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'>' + $.i18n._( 'years' ) + '</span>' );\n\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Maximum Employee Age' ), form_item_input, tab_eligibility_column1, '', widgetContainer );\n\n\t\t//Tab 5\n\n\t\tvar tab5 = this.edit_view_tab.find( '#tab5' );\n\n\t\tvar tab5_column1 = tab5.find( '.first-column' );\n\n\t\tthis.edit_view_tabs[5] = [];\n\n\t\tthis.edit_view_tabs[5].push( tab5_column1 );\n\n\t\t//Permissions\n\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_DROPDOWN );\n\n\t\tvar display_columns = ALayoutCache.getDefaultColumn( 'global_deduction' ); //Get Default columns base on different layout name\n\t\tdisplay_columns = _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.convertColumnsTojGridFormat */ .x.convertColumnsTojGridFormat( display_columns, 'global_deduction' ); //Convert to jQgrid format\n\n\t\tform_item_input.ADropDown( {\n\t\t\tfield: 'company_tax_deduction_ids',\n\t\t\tdisplay_show_all: false,\n\t\t\tid: 'company_tax_deduction_ids',\n\t\t\tkey: 'id',\n\t\t\tdisplay_close_btn: false,\n\t\t\tallow_drag_to_order: false,\n\t\t\tdisplay_column_settings: false\n\t\t} );\n\t\tform_item_input.addClass( 'splayed-adropdown' );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Taxes / Deductions' ), form_item_input, tab5_column1, '', null, false, true );\n\n\t\tform_item_input.setColumns( display_columns );\n//\t\tform_item_input.setUnselectedGridData( [] );\n\t\tTTPromise.resolve( 'CompanyTaxDeduction', 'buildEditViewUI' );\n\t}\n\n\tsetEditViewTabHeight() {\n\t\tsuper.setEditViewTabHeight();\n\n\t\tvar tax_grid = this.edit_view_ui_dic.company_tax_deduction_ids;\n\n\t\ttax_grid.setHeight( ( this.edit_view_tab.find( '.context-border' ).height() - $( this.$el )[0].getBoundingClientRect().top ) - 20 );\n\t}\n\n\tputInputToInsideFormItem( form_item_input, label ) {\n\t\tvar form_item = $( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadWidgetByName */ .x.loadWidgetByName( WidgetNamesDic.EDIT_VIEW_SUB_FORM_ITEM ) );\n\t\tvar form_item_label_div = form_item.find( '.edit-view-form-item-label-div' );\n\n\t\tform_item_label_div.attr( 'class', 'edit-view-form-item-sub-label-div' );\n\n\t\tvar form_item_label = form_item.find( '.edit-view-form-item-label' );\n\t\tvar form_item_input_div = form_item.find( '.edit-view-form-item-input-div' );\n\t\tform_item.addClass( 'remove-margin' );\n\n\t\tform_item_label.text( $.i18n._( label ) );\n\t\tform_item_input_div.append( form_item_input );\n\n\t\treturn form_item;\n\t}\n\n\tbuildSearchFields() {\n\n\t\tsuper.buildSearchFields();\n\n\t\tthis.search_fields = [\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\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._( 'Type' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'type_id',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_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._( 'Name' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'name',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.TEXT_INPUT\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Legal Entity' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'legal_entity_id',\n\t\t\t\tlayout_name: 'global_legal_entity',\n\t\t\t\tapi_class: TTAPI.APILegalEntity,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Pay Stub Account' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'pay_stub_entry_name_id',\n\t\t\t\tlayout_name: 'global_PayStubAccount',\n\t\t\t\tapi_class: TTAPI.APIPayStubEntryAccount,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Remittance Agency' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'payroll_remittance_agency_id',\n\t\t\t\tlayout_name: 'global_payroll_remittance_agency',\n\t\t\t\tapi_class: TTAPI.APIPayrollRemittanceAgency,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tscript_name: 'PayrollRemittanceAgencyView',\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._( 'Calculation' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'calculation_id',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_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._( 'Created By' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'created_by',\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tscript_name: 'EmployeeView',\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._( 'Updated By' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'updated_by',\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tscript_name: 'EmployeeView',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} )\n\n\t\t];\n\t}\n\n\tsearchDone() {\n\t\tTTPromise.resolve( 'TaxView', 'init' );\n\t\tsuper.searchDone();\n\t}\n\n\tgetCompanyTaxDeductionEmployeeSettingTabHtml() {\n\t\treturn `<div id=\"tab_employee_setting\" class=\"edit-view-tab-outside\">\n\t\t\t\t\t<div class=\"edit-view-tab\" id=\"tab_employee_setting_content_div\">\n\t\t\t\t\t\t<div class=\"inside-editor-div full-width-column\">\n\t\t\t\t\t\t\t<div class=\"grid-div employee-setting-grid-div\">\n\t\t\t\t\t\t\t\t<table id=\"employee_setting_grid\"></table>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"save-and-continue-div\">\n\t\t\t\t\t\t\t<span class=\"message\"></span>\n\t\t\t\t\t\t\t<div class=\"save-and-continue-button-div\">\n\t\t\t\t\t\t\t\t<button class=\"tt-button p-button p-component\" type=\"button\">\n\t\t\t\t\t\t\t\t\t<span class=\"icon\"></span>\n\t\t\t\t\t\t\t\t\t<span class=\"p-button-label\"></span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\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}\n\nCompanyTaxDeductionViewController.loadSubView = function( container, beforeViewLoadedFun, afterViewLoadedFun ) {\n\n\t_global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.loadViewSource */ .x.loadViewSource( 'CompanyTaxDeduction', 'SubCompanyTaxDeductionView.html', function( result ) {\n\n\t\tvar args = {};\n\t\tvar template = _.template( result );\n\n\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( beforeViewLoadedFun ) ) {\n\t\t\tbeforeViewLoadedFun();\n\t\t}\n\n\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( container ) ) {\n\t\t\tcontainer.html( template( args ) );\n\n\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_0__/* .Global.isSet */ .x.isSet( afterViewLoadedFun ) ) {\n\t\t\t\tafterViewLoadedFun( sub_company_tax_deduction_view_controller );\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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STs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCLDZGQUF1Qjs7QUFFbkQ7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCLDZGQUF1QjtBQUNyRDtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQ0FBaUMsdUVBQVk7QUFDN0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRLHVFQUFZO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Es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QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUEsQ0FBQyx5RkFBcUI7O0FBRXRCO0FBQ0EsaUJBQWlCLENBQUM7O0FBRWxCLE9BQU8sdUVBQVk7QUFDbkI7QUFDQTs7QUFFQSxPQUFPLHVFQUFZO0FBQ25COztBQUVBLFFBQVEsdUVBQVk7QUFDcEI7QUFDQTs7QUFFQTs7QUFFQSxHQUFHOztBQUVIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vaW50ZXJmYWNlL2h0bWw1L3ZpZXdzL3BheXJvbGwvY29tcGFueV90YXhfZGVkdWN0aW9uL0NvbXBhbnlUYXhEZWR1Y3Rpb25WaWV3Q29udHJvbGxlci5qcz9mOGRkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdsb2JhbCB9IGZyb20gJ0AvZ2xvYmFsL0dsb2JhbCc7XG5cbmV4cG9ydCBjbGFzcyBDb21wYW55VGF4RGVkdWN0aW9uVmlld0NvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlVmlld0NvbnRyb2xsZXIge1xuXHRjb25zdHJ1Y3Rvciggb3B0aW9ucyA9IHt9ICkge1xuXHRcdF8uZGVmYXVsdHMoIG9wdGlvbnMsIHtcblx0XHRcdGVsOiAnI2NvbXBhbnlfdGF4X2RlZHVjdGlvbl92aWV3X2NvbnRhaW5lcicsIC8vTXVzdCBzZXQgZWwgaGVyZSBhbmQgY2FuIG9ubHkgc2V0IHN0cmluZywgc28gZXZlbnRzIGNhbiB3b3JrXG5cblx0XHRcdHR5cGVfYXJyYXk6IG51bGwsXG5cdFx0XHRzdGF0dXNfYXJyYXk6IG51bGwsXG5cdFx0XHR0YXhfZm9ybXVsYV90eXBlX2FycmF5OiBudWxsLFxuXHRcdFx0Y2FsY3VsYXRpb25fYXJyYXk6IG51bGwsXG5cdFx0XHRhY2NvdW50X2Ftb3VudF90eXBlX2FycmF5OiBudWxsLFxuXHRcdFx0eWVzX25vX2FycmF5OiBudWxsLFxuXHRcdFx0YXBwbHlfZnJlcXVlbmN5X2FycmF5OiBudWxsLFxuXHRcdFx0YXBwbHlfcGF5cm9sbF9ydW5fdHlwZV9hcnJheTogbnVsbCxcblx0XHRcdGxlbmd0aF9vZl9zZXJ2aWNlX3VuaXRfYXJyYXk6IG51bGwsXG5cdFx0XHRtb250aF9vZl95ZWFyX2FycmF5OiBudWxsLFxuXHRcdFx0ZGF5X29mX21vbnRoX2FycmF5OiBudWxsLFxuXHRcdFx0bW9udGhfb2ZfcXVhcnRlcl9hcnJheTogbnVsbCxcblx0XHRcdGNvdW50cnlfYXJyYXk6IG51bGwsXG5cdFx0XHRwcm92aW5jZV9hcnJheTogbnVsbCxcblx0XHRcdGVfcHJvdmluY2VfYXJyYXk6IG51bGwsXG5cdFx0XHRjb21wYW55X2FwaTogbnVsbCxcblx0XHRcdGRhdGVfYXBpOiBudWxsLFxuXHRcdFx0dXNlcl9kZWR1Y3Rpb25fYXBpOiBudWxsLFxuXHRcdFx0dXNlcl9hcGk6IG51bGwsXG5cdFx0XHRwYXlyb2xsX3JlbWl0dGFuY2VfYWdlbmN5X2FwaTogbnVsbCxcblx0XHRcdGVtcGxveWVlX3NldHRpbmdfZ3JpZDogbnVsbCxcblx0XHRcdGVtcGxveWVlX3NldHRpbmdfcmVzdWx0OiBudWxsLFxuXHRcdFx0c2hvd19jOiBmYWxzZSxcblx0XHRcdHNob3dfcDogZmFsc2UsXG5cdFx0XHRzaG93X2RjOiBmYWxzZSxcblxuXHRcdFx0cHJvdmluY2VfZGlzdHJpY3RfYXJyYXk6IG51bGwsXG5cblx0XHRcdG9yaWdpbmFsX2N1cnJlbnRfcmVjb3JkOiBudWxsLCAvL3NldCB3aGVuIHNldEN1cnJlbnRFZGl0UmVjb3JkRGF0YSwgdG8ga2VlcCB0aGUgb3JpZ2luYWwgZGF0YSBvZiB0aGUgZWRpdCByZWNvcmRcblxuXHRcdFx0bGVuZ3RoX2RhdGVzOiBudWxsLFxuXHRcdFx0c3RhcnRfZGF0ZXM6IG51bGwsXG5cdFx0XHRlbmRfZGF0ZXM6IG51bGwsXG5cblx0XHRcdGdyaWRfcGFyZW50OiAnLmdyaWQtZGl2J1xuXHRcdH0gKTtcblxuXHRcdHN1cGVyKCBvcHRpb25zICk7XG5cdH1cblxuXHRpbml0KCBvcHRpb25zICkge1xuXG5cdFx0Ly90aGlzLl9zdXBlcignaW5pdGlhbGl6ZScsIG9wdGlvbnMgKTtcblx0XHR0aGlzLmVkaXRfdmlld190cGwgPSAnQ29tcGFueVRheERlZHVjdGlvbkVkaXRWaWV3Lmh0bWwnO1xuXHRcdGlmICggdGhpcy5zdWJfdmlld19tb2RlICkge1xuXHRcdFx0dGhpcy5wZXJtaXNzaW9uX2lkID0gJ3VzZXJfdGF4X2RlZHVjdGlvbic7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucGVybWlzc2lvbl9pZCA9ICdjb21wYW55X3RheF9kZWR1Y3Rpb24nO1xuXHRcdH1cblx0XHR0aGlzLnZpZXdJZCA9ICdDb21wYW55VGF4RGVkdWN0aW9uJztcblx0XHR0aGlzLnNjcmlwdF9uYW1lID0gJ0NvbXBhbnlUYXhEZWR1Y3Rpb25WaWV3Jztcblx0XHR0aGlzLnRhYmxlX25hbWVfa2V5ID0gJ2NvbXBhbnlfZGVkdWN0aW9uJztcblx0XHR0aGlzLmNvbnRleHRfbWVudV9uYW1lID0gJC5pMThuLl8oICdUYXggLyBEZWR1Y3Rpb25zJyApO1xuXHRcdHRoaXMubmF2aWdhdGlvbl9sYWJlbCA9ICQuaTE4bi5fKCAnVGF4IC8gRGVkdWN0aW9ucycgKTtcblx0XHR0aGlzLmFwaSA9IFRUQVBJLkFQSUNvbXBhbnlEZWR1Y3Rpb247XG5cdFx0dGhpcy5kYXRlX2FwaSA9IFRUQVBJLkFQSVRURGF0ZTtcblx0XHR0aGlzLmNvbXBhbnlfYXBpID0gVFRBUEkuQVBJQ29tcGFueTtcblx0XHR0aGlzLnVzZXJfZGVkdWN0aW9uX2FwaSA9IFRUQVBJLkFQSVVzZXJEZWR1Y3Rpb247XG5cdFx0dGhpcy51c2VyX2FwaSA9IFRUQVBJLkFQSVVzZXI7XG5cdFx0dGhpcy5wYXlyb2xsX3JlbWl0dGFuY2VfYWdlbmN5X2FwaSA9IFRUQVBJLkFQSVBheXJvbGxSZW1pdHRhbmNlQWdlbmN5O1xuXHRcdHRoaXMubW9udGhfb2ZfcXVhcnRlcl9hcnJheSA9IEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCB7IDE6IDEsIDI6IDIsIDM6IDMgfSApO1xuXHRcdHRoaXMuZG9jdW1lbnRfb2JqZWN0X3R5cGVfaWQgPSAzMDA7XG5cblx0XHR0aGlzLnJlbmRlcigpO1xuXG5cdFx0Ly9Mb2FkIHRoZSBGb3JtdWxhQnVpbGRlciBhcyBlYXJseSBhcyBwb3NzaWJsZSB0byBoZWxwIGF2b2lkIHNvbWUgcmFjZSBjb25kaXRpb25zIHdpdGggaW5wdXQgYm94IG5vdCBhcHBlYXJpbmcsIG9yIGFwcGVhcmluZyBvdXQgb2Ygb3JkZXIgd2hlbiBjbGlja2luZyBcIm5ld1wiIGFmdGVyIGEgZnJlc2ggcmVsb2FkLlxuXHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSApICkge1xuXHRcdFx0R2xvYmFsLmxvYWRTY3JpcHQoICdnbG9iYWwvd2lkZ2V0cy9mb3JtdWxhX2J1aWxkZXIvRm9ybXVsYUJ1aWxkZXIuanMnICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnN1Yl92aWV3X21vZGUgKSB7XG5cdFx0XHR0aGlzLmJ1aWxkQ29udGV4dE1lbnUoIHRydWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5idWlsZENvbnRleHRNZW51KCk7XG5cdFx0fVxuXG5cdFx0Ly9jYWxsIGluaXQgZGF0YSBpbiBwYXJlbnQgdmlld1xuXHRcdGlmICggIXRoaXMuc3ViX3ZpZXdfbW9kZSApIHtcblx0XHRcdHRoaXMuaW5pdERhdGEoKTtcblx0XHR9XG5cdH1cblxuXHRnZXRDdXN0b21Db250ZXh0TWVudU1vZGVsKCkge1xuXHRcdHZhciBjb250ZXh0X21lbnVfbW9kZWwgPSB7XG5cdFx0XHRleGNsdWRlOiBbJ21hc3NfZWRpdCddLFxuXHRcdFx0aW5jbHVkZTogW11cblx0XHR9O1xuXG5cdFx0aWYgKCB0aGlzLnN1Yl92aWV3X21vZGUgKSB7XG5cdFx0XHRjb250ZXh0X21lbnVfbW9kZWwuZXhjbHVkZS5wdXNoKFxuXHRcdFx0XHQndmlldycsXG5cdFx0XHRcdCdzYXZlX2FuZF9uZXcnLFxuXHRcdFx0XHQnc2F2ZV9hbmRfY29weScsXG5cdFx0XHRcdCdjb3B5X2FzX25ldycsXG5cdFx0XHRcdCdjb3B5J1xuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29udGV4dF9tZW51X21vZGVsO1xuXHR9XG5cblx0aW5pdE9wdGlvbnMoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHZhciBvcHRpb25zID0gW1xuXHRcdFx0eyBvcHRpb25fbmFtZTogJ3R5cGUnLCBhcGk6IHRoaXMuYXBpIH0sXG5cdFx0XHR7IG9wdGlvbl9uYW1lOiAnc3RhdHVzJywgYXBpOiB0aGlzLmFwaSB9LFxuXHRcdFx0eyBvcHRpb25fbmFtZTogJ2NhbGN1bGF0aW9uJywgYXBpOiB0aGlzLmFwaSB9LFxuXHRcdFx0eyBvcHRpb25fbmFtZTogJ2FwcGx5X2ZyZXF1ZW5jeScsIGFwaTogdGhpcy5hcGkgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICdhcHBseV9wYXlyb2xsX3J1bl90eXBlJywgYXBpOiB0aGlzLmFwaSB9LFxuXHRcdFx0eyBvcHRpb25fbmFtZTogJ2FjY291bnRfYW1vdW50X3R5cGUnLCBhcGk6IHRoaXMuYXBpIH0sXG5cdFx0XHR7IG9wdGlvbl9uYW1lOiAnbGVuZ3RoX29mX3NlcnZpY2VfdW5pdCcsIGFwaTogdGhpcy5hcGkgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICdsb29rX2JhY2tfdW5pdCcsIGFwaTogdGhpcy5hcGkgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICdjb3VudHJ5JywgZmllbGRfbmFtZTogJ2NvdW50cnknLCBhcGk6IHRoaXMuY29tcGFueV9hcGkgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICdhcHBseV9wYXlyb2xsX3J1bl90eXBlJywgYXBpOiB0aGlzLmFwaSB9LFxuXHRcdFx0eyBvcHRpb25fbmFtZTogJ3llc19ubycsIGFwaTogdGhpcy5hcGkgfSxcblxuXHRcdFx0eyBvcHRpb25fbmFtZTogJ3RheF9mb3JtdWxhX3R5cGUnLCBhcGk6IHRoaXMuYXBpIH0sXG5cdFx0XTtcblxuXHRcdHRoaXMuaW5pdERyb3BEb3duT3B0aW9ucyggb3B0aW9ucyApO1xuXG5cdFx0dGhpcy5jb21wYW55X2FwaS5nZXRPcHRpb25zKCAnZGlzdHJpY3QnLCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0cmVzID0gcmVzLmdldFJlc3VsdCgpO1xuXHRcdFx0XHQkdGhpcy5kaXN0cmljdF9hcnJheSA9IHJlcztcblx0XHRcdH1cblx0XHR9ICk7XG5cblx0XHR0aGlzLmRhdGVfYXBpLmdldE1vbnRoT2ZZZWFyQXJyYXkoIGZhbHNlLCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0cmVzID0gcmVzLmdldFJlc3VsdCgpO1xuXHRcdFx0XHQkdGhpcy5tb250aF9vZl95ZWFyX2FycmF5ID0gR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0XHR0aGlzLmRhdGVfYXBpLmdldERheU9mTW9udGhBcnJheSgge1xuXHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXMgKSB7XG5cdFx0XHRcdHJlcyA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0JHRoaXMuZGF5X29mX21vbnRoX2FycmF5ID0gR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdC8vT3ZlcnJpZGUgZm9yOiBEbyBub3Qgc2hvdyBhIGZldyBvZiB0aGUgZGVmYXVsdCBjb2x1bW5zIHdoZW4gaW4gRWRpdCBFbXBsb3llZSBzdWItdmlldyBcIlRheFwiIHRhYi5cblx0c2V0U2VsZWN0TGF5b3V0KCkge1xuXHRcdGlmICggdGhpcy5zdWJfdmlld19tb2RlICkge1xuXHRcdFx0c3VwZXIuc2V0U2VsZWN0TGF5b3V0KCBbJ2xlZ2FsX2VudGl0eV9sZWdhbF9uYW1lJywgJ3RvdGFsX3VzZXJzJ10gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3VwZXIuc2V0U2VsZWN0TGF5b3V0KCk7XG5cdFx0fVxuXHR9XG5cblx0c2V0RWRpdE1lbnVTYXZlQW5kQ29udGludWVJY29uKCBjb250ZXh0X2J0biwgcElkICkge1xuXHRcdHRoaXMuc2F2ZUFuZENvbnRpbnVlVmFsaWRhdGUoIGNvbnRleHRfYnRuLCBwSWQgKTtcblxuXHRcdGlmICggdGhpcy5pc19tYXNzX2VkaXRpbmcgfHwgdGhpcy5pc192aWV3aW5nIHx8ICggdGhpcy5zdWJfdmlld19tb2RlICYmICggIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZCB8fCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkgKSApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdFx0fVxuXHR9XG5cblx0c2V0RWRpdE1lbnVBZGRJY29uKCBjb250ZXh0X2J0biwgcElkICkge1xuXHRcdGlmICggIXRoaXMuYWRkUGVybWlzc2lvblZhbGlkYXRlKCBwSWQgKSB8fCB0aGlzLmVkaXRfb25seV9tb2RlICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmhpZGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKVxuXHRcdH1cblxuXHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIGZhbHNlICk7XG5cdH1cblxuXHQvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdG8gZGlzYWJsZSB2YXJpb3VzIGJ1dHRvbnMgb24gRW1wbG95ZWUgU2V0dGluZ3MgdGFiLlxuXHQvLyBUaGlzIHdhcyBkdWUgdG8gdXNlcnMgZ2V0dGluZyBjb25mdXNlZCBhcyB0byB3aGF0IHRoZXkgd2VyZSBkZWxldGluZyAoZW1wbG95ZWUgZW50cnkgaW4gdGFibGUgdnMgdGF4L2RlZHVjIHJlY29yZCkuIFNlZSBpc3N1ZSAjMjY4OFxuXHRkaXNhYmxlSWNvbk9uRW1wbG95ZWVTZXR0aW5nc1RhYiggY29udGV4dF9idG4gKSB7XG5cdFx0aWYgKCB0aGlzLmdldEVkaXRWaWV3QWN0aXZlVGFiTmFtZSgpID09PSAndGFiX2VtcGxveWVlX3NldHRpbmcnICkge1xuXHRcdFx0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc2FibGVNZW51SXRlbSggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkLCBjb250ZXh0X2J0bi5pZCwgZmFsc2UgKTtcblx0XHR9XG5cdH1cblxuXHRzZXRFZGl0TWVudURlbGV0ZUljb24oIGNvbnRleHRfYnRuICkge1xuXHRcdHRoaXMuZGlzYWJsZUljb25PbkVtcGxveWVlU2V0dGluZ3NUYWIoIGNvbnRleHRfYnRuICk7XG5cdH1cblxuXHRzZXRFZGl0TWVudURlbGV0ZUFuZE5leHRJY29uKCBjb250ZXh0X2J0biApIHtcblx0XHR0aGlzLmRpc2FibGVJY29uT25FbXBsb3llZVNldHRpbmdzVGFiKCBjb250ZXh0X2J0biApO1xuXHR9XG5cblx0c2V0RWRpdE1lbnVDb3B5SWNvbiggY29udGV4dF9idG4gKSB7XG5cdFx0dGhpcy5kaXNhYmxlSWNvbk9uRW1wbG95ZWVTZXR0aW5nc1RhYiggY29udGV4dF9idG4gKTtcblx0fVxuXG5cdHNldEVkaXRNZW51Q29weUFuZEFkZEljb24oIGNvbnRleHRfYnRuICkge1xuXHRcdHRoaXMuZGlzYWJsZUljb25PbkVtcGxveWVlU2V0dGluZ3NUYWIoIGNvbnRleHRfYnRuICk7XG5cdH1cblxuXHRzZXRFZGl0TWVudVNhdmVBbmRDb3B5SWNvbiggY29udGV4dF9idG4gKSB7XG5cdFx0dGhpcy5kaXNhYmxlSWNvbk9uRW1wbG95ZWVTZXR0aW5nc1RhYiggY29udGV4dF9idG4gKTtcblx0fVxuXG5cdGVuYWJsZUljb25PbkVtcGxveWVlU2V0dGluZ3NUYWIoIGNvbnRleHRfYnRuICkge1xuXHRcdGlmICggdGhpcy5nZXRFZGl0Vmlld0FjdGl2ZVRhYk5hbWUoKSA9PT0gJ3RhYl9lbXBsb3llZV9zZXR0aW5nJyApIHtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5oaWRlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIHRydWUgKTtcblx0XHRcdENvbnRleHRNZW51TWFuYWdlci5kaXNhYmxlTWVudUl0ZW0oIHRoaXMuZGV0ZXJtaW5lQ29udGV4dE1lbnVNb3VudEF0dHJpYnV0ZXMoKS5pZCwgY29udGV4dF9idG4uaWQsIHRydWUgKTtcblx0XHR9XG5cdH1cblxuXHRzZXRFZGl0TWVudUV4cG9ydEljb24oIGNvbnRleHRfYnRuICkge1xuXHRcdHRoaXMuZW5hYmxlSWNvbk9uRW1wbG95ZWVTZXR0aW5nc1RhYiggY29udGV4dF9idG4gKTtcblx0fVxuXG5cdG9uRXhwb3J0Q2xpY2soKSB7XG5cdFx0aWYgKCB0aGlzLmlzX2VkaXQgPT0gdHJ1ZSAmJiB0aGlzLmdldEVkaXRWaWV3QWN0aXZlVGFiTmFtZSgpID09PSAndGFiX2VtcGxveWVlX3NldHRpbmcnICkge1xuXHRcdFx0dGhpcy5lbXBsb3llZV9zZXR0aW5nX2dyaWQuZ3JpZDJjc3YoICdleHBvcnRfdXNlcl9kZWR1Y3Rpb24nICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHN1cGVyLm9uRXhwb3J0Q2xpY2soICdleHBvcnQnICsgdGhpcy5hcGkua2V5X25hbWUgKTtcblx0XHR9XG5cdH1cblxuXHRzYXZlSW5zaWRlRWRpdG9yRGF0YSggY2FsbEJhY2sgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdC8vICMyNzY0IGRvIG5vdCBjaGVjayBmb3IgdGhpcy5zdWJfdmlld19tb2RlIGFzIFNhdmUgaWNvbiB3aWxsIGZhaWwgdG8gc2F2ZS4gU2F2ZSBhbmQgU2F2ZSZDb250aW51ZSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsb2dpYyByZWdhcmRsZXNzIG9mIHN1Yl92aWV3LiBTZWUgaXNzdWUgb3IgY29tbWl0IGVlMDEwMmJlMGY0NWY5NTRhNzhiN2Y5NmI2Y2YyZjIzNTBiNzNkZDcgY29udGV4dCBvbiB0aGlzLnN1Yl92aWV3X21vZGUgYW5kIHNhdmUmY29udGludWUuXG5cdFx0Ly8gaWYgKCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkIHx8ICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgfHwgdGhpcy5zdWJfdmlld19tb2RlICkge1xuXHRcdGlmICggIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZCB8fCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkge1xuXHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIGNhbGxCYWNrICkgKSB7XG5cdFx0XHRcdGNhbGxCYWNrKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCAhdGhpcy5lbXBsb3llZV9zZXR0aW5nX2dyaWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGRhdGEgPSB0aGlzLmVtcGxveWVlX3NldHRpbmdfZ3JpZC5nZXRHcmlkUGFyYW0oICdkYXRhJyApO1xuXHRcdHZhciBjb2x1bW5zID0gdGhpcy5lbXBsb3llZV9zZXR0aW5nX2dyaWQuZ2V0R3JpZFBhcmFtKCAnY29sTW9kZWwnICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0dmFyIGl0ZW0gPSBkYXRhW2ldO1xuXHRcdFx0aWYgKCB0aGlzLnN0YXJ0X2RhdGVzICYmIHRoaXMuc3RhcnRfZGF0ZXMubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0aXRlbS5zdGFydF9kYXRlID0gdGhpcy5zdGFydF9kYXRlc1tpXS5nZXRWYWx1ZSgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCB0aGlzLmxlbmd0aF9kYXRlcyAmJiB0aGlzLmxlbmd0aF9kYXRlcy5sZW5ndGggPiAwICkge1xuXHRcdFx0XHRpdGVtLmxlbmd0aF9vZl9zZXJ2aWNlX2RhdGUgPSB0aGlzLmxlbmd0aF9kYXRlc1tpXS5nZXRWYWx1ZSgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCB0aGlzLmVuZF9kYXRlcyAmJiB0aGlzLmVuZF9kYXRlcy5sZW5ndGggPiAwICkge1xuXHRcdFx0XHRpdGVtLmVuZF9kYXRlID0gdGhpcy5lbmRfZGF0ZXNbaV0uZ2V0VmFsdWUoKTtcblx0XHRcdH1cblx0XHRcdGZvciAoIHZhciBqID0gMTsgaiA8IGNvbHVtbnMubGVuZ3RoOyBqKysgKSB7XG5cdFx0XHRcdHZhciBjb2x1bW4gPSBjb2x1bW5zW2pdO1xuXHRcdFx0XHRpZiAoIGl0ZW1bY29sdW1uLm5hbWVdID09PSB0aGlzLm9yaWdpbmFsX2N1cnJlbnRfcmVjb3JkW2NvbHVtbi5uYW1lXSApIHtcblx0XHRcdFx0XHRpdGVtW2NvbHVtbi5uYW1lXSA9IGZhbHNlOyAgLy9EZWZhdWx0IGNvbHVtbiBzZXR0aW5nXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwICkge1xuXHRcdFx0Ly9Pbmx5IHNlbmQgZGF0YSBmcm9tIHRoZSBFbXBsb3llZSBTZXR0aW5ncyB0YWIgdG8gdGhlIEFQSSB0aGF0IGhhcyBjaGFuZ2VkLlxuXHRcdFx0bGV0IGNoYW5nZWRfZGF0YSA9IHRoaXMuZ2V0Q2hhbmdlZFJlY29yZHMoIGRhdGEsIHRoaXMuZW1wbG95ZWVfc2V0dGluZ19yZXN1bHQsIFtdICk7XG5cblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggY2hhbmdlZF9kYXRhICkgJiYgY2hhbmdlZF9kYXRhLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdHRoaXMudXNlcl9kZWR1Y3Rpb25fYXBpLnNldFVzZXJEZWR1Y3Rpb24oIGNoYW5nZWRfZGF0YSwge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCBjYWxsQmFjayApICkge1xuXHRcdFx0XHRcdFx0XHRjYWxsQmFjaygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly9TdGlsbCBleGVjdXRlIHRoZSBjYWxsYmFjayBzbyBTYXZlICYgTmV4dCBjYW4gbW92ZSB0byB0aGUgbmV4dCByZWNvcmQgd2hlbiB0aGVyZSBpcyBubyBFbXBsb3llZXMgYXNzaWduZWQgdG8gaXRcblx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIGNhbGxCYWNrICkgKSB7XG5cdFx0XHRcdFx0Y2FsbEJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvL1N0aWxsIGV4ZWN1dGUgdGhlIGNhbGxiYWNrIHNvIFNhdmUgJiBOZXh0IGNhbiBtb3ZlIHRvIHRoZSBuZXh0IHJlY29yZCB3aGVuIHRoZXJlIGlzIG5vIEVtcGxveWVlcyBhc3NpZ25lZCB0byBpdFxuXHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIGNhbGxCYWNrICkgKSB7XG5cdFx0XHRcdGNhbGxCYWNrKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0b25Db250ZXh0TWVudUNsaWNrKCBjb250ZXh0X2J0biwgbWVudV9uYW1lICkge1xuXHRcdGlmICggdGhpcy5zZWxlY3RfZ3JpZF9sYXN0X3JvdyApIHtcblx0XHRcdHRoaXMuZW1wbG95ZWVfc2V0dGluZ19ncmlkLmdyaWQuanFHcmlkKCAnc2F2ZVJvdycsIHRoaXMuc2VsZWN0X2dyaWRfbGFzdF9yb3cgKTtcblx0XHRcdHRoaXMuc2V0RGF0ZUNlbGxzRW5hYmxlZCggZmFsc2UsIHRoaXMuc2VsZWN0X2dyaWRfbGFzdF9yb3cgKTtcblx0XHRcdHRoaXMuc2VsZWN0X2dyaWRfbGFzdF9yb3cgPSBudWxsO1xuXHRcdH1cblxuXHRcdHJldHVybiBzdXBlci5vbkNvbnRleHRNZW51Q2xpY2soIGNvbnRleHRfYnRuLCBtZW51X25hbWUgKTtcblx0fVxuXG5cdGdldERlbGV0ZVNlbGVjdGVkUmVjb3JkSWQoKSB7XG5cdFx0aWYgKCAhdGhpcy5zdWJfdmlld19tb2RlICkge1xuXHRcdFx0cmV0dXJuIHN1cGVyLmdldERlbGV0ZVNlbGVjdGVkUmVjb3JkSWQoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIHJldHZhbCA9IFtdO1xuXG5cdFx0XHRpZiAoIHRoaXMuZWRpdF92aWV3ICkge1xuXHRcdFx0XHRyZXR2YWwucHVzaCggdGhpcy5lbXBsb3llZV9zZXR0aW5nX3Jlc3VsdFswXS5pZCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIGFyZ3MgPSB7IGZpbHRlcl9kYXRhOiB7fSB9O1xuXHRcdFx0XHR2YXIgdGF4X2lkcyA9IHRoaXMuZ2V0R3JpZFNlbGVjdElkQXJyYXkoKS5zbGljZSgpO1xuXHRcdFx0XHRhcmdzLmZpbHRlcl9kYXRhLmNvbXBhbnlfZGVkdWN0aW9uX2lkID0gdGF4X2lkcztcblx0XHRcdFx0YXJncy5maWx0ZXJfZGF0YS51c2VyX2lkID0gdGhpcy5wYXJlbnRfdmFsdWU7XG5cblx0XHRcdFx0dmFyIHJlcyA9IHRoaXMudXNlcl9kZWR1Y3Rpb25fYXBpLmdldFVzZXJEZWR1Y3Rpb24oIGFyZ3MsIHRydWUsIHsgYXN5bmM6IGZhbHNlIH0gKS5nZXRSZXN1bHQoKTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdFx0dmFyIGl0ZW0gPSByZXNbaV07XG5cdFx0XHRcdFx0cmV0dmFsLnB1c2goIGl0ZW0uaWQgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmV0dmFsO1xuXHRcdH1cblx0fVxuXG5cdGRvRGVsZXRlQVBJQ2FsbCggcmVtb3ZlX2lkcywgY2FsbGJhY2sgKSB7XG5cdFx0aWYgKCAhdGhpcy5zdWJfdmlld19tb2RlICkge1xuXHRcdFx0cmV0dXJuIHN1cGVyLmRvRGVsZXRlQVBJQ2FsbCggcmVtb3ZlX2lkcywgY2FsbGJhY2sgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCAhY2FsbGJhY2sgKSB7XG5cdFx0XHRcdGNhbGxiYWNrID0ge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0dGhpcy5vbkRlbGV0ZVJlc3VsdCggcmVzdWx0LCByZW1vdmVfaWRzICk7XG5cdFx0XHRcdFx0fS5iaW5kKCB0aGlzIClcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdC8vIHJldHVybiB0aGlzLmFwaVsnZGVsZXRlJyArIHRoaXMuYXBpLmtleV9uYW1lXSggcmVtb3ZlX2lkcywgY2FsbGJhY2sgKTtcblx0XHRcdHJldHVybiB0aGlzLnVzZXJfZGVkdWN0aW9uX2FwaS5kZWxldGVVc2VyRGVkdWN0aW9uKCByZW1vdmVfaWRzLCBjYWxsYmFjayApO1xuXHRcdH1cblx0fVxuXG5cdG9uU2F2ZUNsaWNrKCBpZ25vcmVXYXJuaW5nICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIHJlY29yZDtcblx0XHRpZiAoICFHbG9iYWwuaXNTZXQoIGlnbm9yZVdhcm5pbmcgKSApIHtcblx0XHRcdGlnbm9yZVdhcm5pbmcgPSBmYWxzZTtcblx0XHR9XG5cdFx0Ly9TZXR0aW5nIGlzX2FkZCBmYWxzZSB0b28gZWFybHkgY2FuIGNhdXNlIGRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkgdG8gaGF2ZSB1bmV4cGVjdGVkIHNpZGUgZWZmZWN0cy4gSG93ZXZlciBub3Qgc2V0dGluZyBpdCBoZXJlIG1pZ2h0IGhhdmUgb3RoZXIgc2lkZSBlZmZlY3RzLlxuXHRcdC8vdGhpcy5pc19hZGQgPSBmYWxzZTtcblx0XHRMb2NhbENhY2hlRGF0YS5jdXJyZW50X2RvaW5nX2NvbnRleHRfYWN0aW9uID0gJ3NhdmUnO1xuXHRcdGlmICggdGhpcy5pc19tYXNzX2VkaXRpbmcgKSB7XG5cdFx0XHR2YXIgY2hhbmdlZF9maWVsZHMgPSB0aGlzLmdldENoYW5nZWRGaWVsZHMoKTtcblx0XHRcdHJlY29yZCA9IHRoaXMuYnVpbGRNYXNzRWRpdFNhdmVSZWNvcmQoIHRoaXMubWFzc19lZGl0X3JlY29yZF9pZHMsIGNoYW5nZWRfZmllbGRzICk7XG5cdFx0XHQvLyB2YXIgY2hlY2tfZmllbGRzID0ge307XG5cdFx0XHQvLyBmb3IgKCB2YXIga2V5IGluIHRoaXMuZWRpdF92aWV3X3VpX2RpYyApIHtcblx0XHRcdC8vIFx0dmFyIHdpZGdldCA9IHRoaXMuZWRpdF92aWV3X3VpX2RpY1trZXldO1xuXHRcdFx0Ly9cblx0XHRcdC8vIFx0aWYgKCBHbG9iYWwuaXNTZXQoIHdpZGdldC5pc0NoZWNrZWQgKSApIHtcblx0XHRcdC8vIFx0XHRpZiAoIHdpZGdldC5pc0NoZWNrZWQoKSApIHtcblx0XHRcdC8vIFx0XHRcdGNoZWNrX2ZpZWxkc1trZXldID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV07XG5cdFx0XHQvLyBcdFx0fVxuXHRcdFx0Ly8gXHR9XG5cdFx0XHQvLyB9XG5cdFx0XHQvLyByZWNvcmQgPSBbXTtcblx0XHRcdC8vICQuZWFjaCggdGhpcy5tYXNzX2VkaXRfcmVjb3JkX2lkcywgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHtcblx0XHRcdC8vIFx0dmFyIGNvbW1vbl9yZWNvcmQgPSBHbG9iYWwuY2xvbmUoIGNoZWNrX2ZpZWxkcyApO1xuXHRcdFx0Ly8gXHRjb21tb25fcmVjb3JkLmlkID0gdmFsdWU7XG5cdFx0XHQvLyBcdHJlY29yZC5wdXNoKCBjb21tb25fcmVjb3JkICk7XG5cdFx0XHQvL1xuXHRcdFx0Ly8gfSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZWNvcmQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQ7XG5cdFx0fVxuXHRcdHJlY29yZCA9IHRoaXMudW5pZm9ybVZhcmlhYmxlKCByZWNvcmQgKTtcblx0XHRpZiAoICF0aGlzLnN1Yl92aWV3X21vZGUgKSB7XG5cdFx0XHR0aGlzLmFwaVsnc2V0JyArIHRoaXMuYXBpLmtleV9uYW1lXSggcmVjb3JkLCBmYWxzZSwgaWdub3JlV2FybmluZywge1xuXHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHQkdGhpcy5vblNhdmVSZXN1bHQoIHJlc3VsdCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCApIHtcblx0XHRcdFx0dGhpcy51c2VyX2RlZHVjdGlvbl9hcGkuc2V0VXNlckRlZHVjdGlvbiggcmVjb3JkLCBmYWxzZSwgaWdub3JlV2FybmluZywge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0JHRoaXMub25TYXZlUmVzdWx0KCByZXN1bHQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCR0aGlzLnNhdmVJbnNpZGVFZGl0b3JEYXRhKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHQkdGhpcy5yZWZyZXNoX2lkID0gJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZDsgLy8gYXMgYWRkXG5cdFx0XHRcdFx0JHRoaXMuc2VhcmNoKCk7XG5cblx0XHRcdFx0XHQkdGhpcy5yZW1vdmVFZGl0VmlldygpO1xuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0b25TYXZlQW5kQ29udGludWUoIGlnbm9yZVdhcm5pbmcgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRpZiAoICFHbG9iYWwuaXNTZXQoIGlnbm9yZVdhcm5pbmcgKSApIHtcblx0XHRcdGlnbm9yZVdhcm5pbmcgPSBmYWxzZTtcblx0XHR9XG5cdFx0dGhpcy5pc19jaGFuZ2VkID0gZmFsc2U7XG5cdFx0dGhpcy5pc19hZGQgPSBmYWxzZTtcblx0XHRMb2NhbENhY2hlRGF0YS5jdXJyZW50X2RvaW5nX2NvbnRleHRfYWN0aW9uID0gJ3NhdmVfYW5kX2NvbnRpbnVlJztcblx0XHR2YXIgcmVjb3JkID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkO1xuXHRcdHJlY29yZCA9IHRoaXMudW5pZm9ybVZhcmlhYmxlKCByZWNvcmQgKTtcblx0XHRpZiAoICF0aGlzLnN1Yl92aWV3X21vZGUgKSB7XG5cdFx0XHR0aGlzLmFwaVsnc2V0JyArIHRoaXMuYXBpLmtleV9uYW1lXSggcmVjb3JkLCBmYWxzZSwgaWdub3JlV2FybmluZywge1xuXHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHQkdGhpcy5vblNhdmVBbmRDb250aW51ZVJlc3VsdCggcmVzdWx0ICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gT25seSBlZGl0IHJlY29yZCBjYW4gZ28gaGVyZVxuXHRcdFx0JHRoaXMuc2F2ZUluc2lkZUVkaXRvckRhdGEoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQkdGhpcy5yZWZyZXNoX2lkID0gJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZDtcblx0XHRcdFx0JHRoaXMuc2VhcmNoKCBmYWxzZSApO1xuXHRcdFx0XHQkdGhpcy5vbkVkaXRDbGljayggJHRoaXMucmVmcmVzaF9pZCwgdHJ1ZSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblx0fVxuXG5cdG9uU2F2ZUFuZE5leHRDbGljayggaWdub3JlV2FybmluZyApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdGlmICggIUdsb2JhbC5pc1NldCggaWdub3JlV2FybmluZyApICkge1xuXHRcdFx0aWdub3JlV2FybmluZyA9IGZhbHNlO1xuXHRcdH1cblx0XHR0aGlzLmlzX2FkZCA9IGZhbHNlO1xuXHRcdHRoaXMuaXNfY2hhbmdlZCA9IGZhbHNlO1xuXG5cdFx0dmFyIHJlY29yZCA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZDtcblx0XHRMb2NhbENhY2hlRGF0YS5jdXJyZW50X2RvaW5nX2NvbnRleHRfYWN0aW9uID0gJ3NhdmVfYW5kX25leHQnO1xuXHRcdHJlY29yZCA9IHRoaXMudW5pZm9ybVZhcmlhYmxlKCByZWNvcmQgKTtcblxuXHRcdGlmICggIXRoaXMuc3ViX3ZpZXdfbW9kZSApIHtcblx0XHRcdHRoaXMuYXBpWydzZXQnICsgdGhpcy5hcGkua2V5X25hbWVdKCByZWNvcmQsIGZhbHNlLCBpZ25vcmVXYXJuaW5nLCB7XG5cdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdCR0aGlzLm9uU2F2ZUFuZE5leHRSZXN1bHQoIHJlc3VsdCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE9ubHkgZWRpdCByZWNvcmQgY2FuIGdvIGhlcmVcblx0XHRcdCR0aGlzLnNhdmVJbnNpZGVFZGl0b3JEYXRhKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQ7XG5cdFx0XHRcdCR0aGlzLm9uUmlnaHRBcnJvd0NsaWNrKCk7XG5cdFx0XHRcdCR0aGlzLnNlYXJjaCggZmFsc2UgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cdH1cblxuXHQvL01ha2Ugc3VyZSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgaXMgdXBkYXRlZCBiZWZvcmUgdmFsaWRhdGVcblx0dmFsaWRhdGUoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgcmVjb3JkID0ge307XG5cdFx0aWYgKCB0aGlzLmlzX21hc3NfZWRpdGluZyApIHtcblx0XHRcdGZvciAoIHZhciBrZXkgaW4gdGhpcy5lZGl0X3ZpZXdfdWlfZGljICkge1xuXHRcdFx0XHRpZiAoICF0aGlzLmVkaXRfdmlld191aV9kaWMuaGFzT3duUHJvcGVydHkoIGtleSApICkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhciB3aWRnZXQgPSB0aGlzLmVkaXRfdmlld191aV9kaWNba2V5XTtcblx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHdpZGdldC5pc0NoZWNrZWQgKSApIHtcblx0XHRcdFx0XHRpZiAoIHdpZGdldC5pc0NoZWNrZWQoKSAmJiB3aWRnZXQuZ2V0RW5hYmxlZCgpICkge1xuXHRcdFx0XHRcdFx0cmVjb3JkW2tleV0gPSB3aWRnZXQuZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVjb3JkID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkO1xuXHRcdH1cblx0XHRyZWNvcmQgPSB0aGlzLnVuaWZvcm1WYXJpYWJsZSggcmVjb3JkICk7XG5cdFx0aWYgKCAhdGhpcy5zdWJfdmlld19tb2RlICkge1xuXHRcdFx0dGhpcy5hcGlbJ3ZhbGlkYXRlJyArIHRoaXMuYXBpLmtleV9uYW1lXSggcmVjb3JkLCB7XG5cdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdCR0aGlzLnZhbGlkYXRlUmVzdWx0KCByZXN1bHQgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnVzZXJfZGVkdWN0aW9uX2FwaS52YWxpZGF0ZVVzZXJEZWR1Y3Rpb24oIHJlY29yZCwge1xuXHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHQkdGhpcy52YWxpZGF0ZVJlc3VsdCggcmVzdWx0ICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cdH1cblxuXHR1bmlmb3JtVmFyaWFibGUoIHJlY29yZCApIHtcblx0XHRpZiAoIHRoaXMuc3ViX3ZpZXdfbW9kZSAmJiAoICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgfHwgIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCApICkge1xuXG5cdFx0XHRyZWNvcmQgPSBbXTtcblxuXHRcdFx0dmFyIHNlbGVjdGVkX2l0ZW1zID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmNvbXBhbnlfdGF4X2RlZHVjdGlvbl9pZHMuZ2V0VmFsdWUoKTtcblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHNlbGVjdGVkX2l0ZW1zLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHR2YXIgbmV3X3JlY29yZCA9IHt9O1xuXHRcdFx0XHRuZXdfcmVjb3JkLnVzZXJfaWQgPSB0aGlzLnBhcmVudF92YWx1ZTtcblx0XHRcdFx0bmV3X3JlY29yZC5jb21wYW55X2RlZHVjdGlvbl9pZCA9IHNlbGVjdGVkX2l0ZW1zW2ldLmlkO1xuXHRcdFx0XHRyZWNvcmQucHVzaCggbmV3X3JlY29yZCApO1xuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlY29yZDtcblx0fVxuXG5cdG9uU2F2ZVJlc3VsdCggcmVzdWx0ICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0aWYgKCByZXN1bHQuaXNWYWxpZCgpICkge1xuXHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXG5cdFx0XHRpZiAoICF0aGlzLnN1Yl92aWV3X21vZGUgKSB7XG5cdFx0XHRcdGlmICggcmVzdWx0X2RhdGEgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQ7IC8vIGFzIGFkZFxuXHRcdFx0XHR9IGVsc2UgaWYgKCBUVFVVSUQuaXNVVUlEKCByZXN1bHRfZGF0YSApICYmIHJlc3VsdF9kYXRhICE9IFRUVVVJRC56ZXJvX2lkICYmIHJlc3VsdF9kYXRhICE9IFRUVVVJRC5ub3RfZXhpc3RfaWQgKSB7IC8vIGFzIG5ld1xuXHRcdFx0XHRcdCR0aGlzLnJlZnJlc2hfaWQgPSByZXN1bHRfZGF0YTtcblx0XHRcdFx0fVxuXHRcdFx0XHQkdGhpcy5zYXZlSW5zaWRlRWRpdG9yRGF0YSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0JHRoaXMuc2VhcmNoKCk7XG5cdFx0XHRcdFx0JHRoaXMub25TYXZlRG9uZSggcmVzdWx0ICk7XG5cblx0XHRcdFx0XHQkdGhpcy5yZW1vdmVFZGl0VmlldygpO1xuXHRcdFx0XHR9ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkdGhpcy5yZWZyZXNoX2lkID0gbnVsbDtcblx0XHRcdFx0JHRoaXMuc2VhcmNoKCk7XG5cdFx0XHRcdCR0aGlzLm9uU2F2ZURvbmUoIHJlc3VsdCApO1xuXG5cdFx0XHRcdCR0aGlzLnJlbW92ZUVkaXRWaWV3KCk7XG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0JHRoaXMuc2V0RXJyb3JNZW51KCk7XG5cdFx0XHQkdGhpcy5zZXRFcnJvclRpcHMoIHJlc3VsdCApO1xuXG5cdFx0fVxuXHR9XG5cblx0b25TYXZlQW5kQ29weVJlc3VsdCggcmVzdWx0ICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0aWYgKCByZXN1bHQuaXNWYWxpZCgpICkge1xuXHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0aWYgKCByZXN1bHRfZGF0YSA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQ7XG5cblx0XHRcdH0gZWxzZSBpZiAoIFRUVVVJRC5pc1VVSUQoIHJlc3VsdF9kYXRhICkgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELnplcm9faWQgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELm5vdF9leGlzdF9pZCApIHtcblx0XHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9IHJlc3VsdF9kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQkdGhpcy5zYXZlSW5zaWRlRWRpdG9yRGF0YSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdCR0aGlzLnNlYXJjaCggZmFsc2UgKTtcblx0XHRcdFx0JHRoaXMub25Db3B5QXNOZXdDbGljaygpO1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0JHRoaXMuc2V0RXJyb3JUaXBzKCByZXN1bHQgKTtcblx0XHRcdCR0aGlzLnNldEVycm9yTWVudSgpO1xuXHRcdH1cblx0fVxuXG5cdF9jb250aW51ZURvQ29weUFzTmV3KCkge1xuXHRcdHRoaXMuc2V0Q3VycmVudEVkaXRWaWV3U3RhdGUoICduZXcnICk7XG5cdFx0TG9jYWxDYWNoZURhdGEuY3VycmVudF9kb2luZ19jb250ZXh0X2FjdGlvbiA9ICdjb3B5X2FzX25ldyc7XG5cblx0XHRpZiAoIEdsb2JhbC5pc1NldCggdGhpcy5lZGl0X3ZpZXcgKSApIHtcblx0XHRcdHRoaXMuZW1wbG95ZWVfc2V0dGluZ19ncmlkLmNsZWFyR3JpZERhdGEoKTtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy5jYWxjdWxhdGlvbl9pZC5zZXRFbmFibGVkKCB0cnVlICk7XG5cdFx0fVxuXHRcdHN1cGVyLl9jb250aW51ZURvQ29weUFzTmV3KCk7XG5cdH1cblxuXHRjbGVhckVkaXRWaWV3RGF0YSgpIHtcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gdGhpcy5lZGl0X3ZpZXdfdWlfZGljICkge1xuXG5cdFx0XHRpZiAoICF0aGlzLmVkaXRfdmlld191aV9kaWMuaGFzT3duUHJvcGVydHkoIGtleSApICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljW2tleV0uc2V0VmFsdWUoIG51bGwgKTtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1trZXldLmNsZWFyRXJyb3JTdHlsZSgpO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5lbXBsb3llZV9zZXR0aW5nX2dyaWQgKSB7XG5cdFx0XHR0aGlzLmVtcGxveWVlX3NldHRpbmdfZ3JpZC5jbGVhckdyaWREYXRhKCk7XG5cdFx0fVxuXHR9XG5cblx0Y2hlY2tUYWJQZXJtaXNzaW9ucyggdGFiICkge1xuXHRcdHZhciByZXR2YWwgPSBmYWxzZTtcblxuXHRcdHN3aXRjaCAoIHRhYiApIHtcblx0XHRcdGNhc2UgJ3RhYl9hdHRhY2htZW50Jzpcblx0XHRcdFx0aWYgKCB0aGlzLnN1YkRvY3VtZW50VmFsaWRhdGUoKSApIHtcblx0XHRcdFx0XHRyZXR2YWwgPSAhdGhpcy5zdWJfdmlld19tb2RlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHZhbCA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndGFiX3RheF9kZWR1Y3Rpb25zJzpcblx0XHRcdGNhc2UgJ3RhYl9lbGlnaWJpbGl0eSc6XG5cdFx0XHRjYXNlICd0YWJfZW1wbG95ZWVfc2V0dGluZyc6XG5cdFx0XHRjYXNlICd0YWJfYXVkaXQnOlxuXHRcdFx0XHQvL0Rvbid0IHNob3cgdGhlc2UgdGFicyB3aGVuIHVuZGVyIEVkaXQgRW1wbG95ZWUsIFRheCB0YWIuXG5cdFx0XHRcdGlmICggdGhpcy5zdWJfdmlld19tb2RlICkge1xuXHRcdFx0XHRcdGlmICggdGFiID09ICd0YWJfZW1wbG95ZWVfc2V0dGluZycgJiYgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkge1xuXHRcdFx0XHRcdFx0cmV0dmFsID0gdHJ1ZTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dmFsID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHZhbCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd0YWI1Jzpcblx0XHRcdFx0aWYgKCB0aGlzLnN1Yl92aWV3X21vZGUgKSB7XG5cdFx0XHRcdFx0aWYgKCB0YWIgPT0gJ3RhYjUnICYmIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCApIHtcblx0XHRcdFx0XHRcdHJldHZhbCA9IGZhbHNlO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR2YWwgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHZhbCA9IHN1cGVyLmNoZWNrVGFiUGVybWlzc2lvbnMoIHRhYiApO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRyZXR1cm4gcmV0dmFsO1xuXHR9XG5cblx0c2V0UHJvdmluY2UoIHZhbCwgbSApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0aWYgKCAhdmFsIHx8IHZhbCA9PT0gJy0xJyB8fCB2YWwgPT09ICcwJyApIHtcblx0XHRcdCR0aGlzLnByb3ZpbmNlX2FycmF5ID0gW107XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmNvbXBhbnlfYXBpLmdldE9wdGlvbnMoICdwcm92aW5jZScsIHZhbCwge1xuXHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0XHRyZXMgPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0aWYgKCAhcmVzICkge1xuXHRcdFx0XHRcdFx0cmVzID0gW107XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0JHRoaXMucHJvdmluY2VfYXJyYXkgPSBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggcmVzICk7XG5cblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblx0fVxuXG5cdGVTZXRQcm92aW5jZSggdmFsLCByZWZyZXNoICkge1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgcHJvdmluY2Vfd2lkZ2V0ID0gJHRoaXMuZWRpdF92aWV3X3VpX2RpY1sncHJvdmluY2UnXTtcblxuXHRcdGlmICggIXZhbCB8fCB2YWwgPT09ICctMScgfHwgdmFsID09PSAnMCcgKSB7XG5cdFx0XHQkdGhpcy5lX3Byb3ZpbmNlX2FycmF5ID0gW107XG5cdFx0XHRwcm92aW5jZV93aWRnZXQuc2V0U291cmNlRGF0YSggW10gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5jb21wYW55X2FwaS5nZXRPcHRpb25zKCAncHJvdmluY2UnLCB2YWwsIHtcblx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXMgKSB7XG5cdFx0XHRcdFx0cmVzID0gcmVzLmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdGlmICggIXJlcyApIHtcblx0XHRcdFx0XHRcdHJlcyA9IFtdO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCR0aGlzLmVfcHJvdmluY2VfYXJyYXkgPSBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggcmVzICk7XG5cdFx0XHRcdFx0cHJvdmluY2Vfd2lkZ2V0LnNldFNvdXJjZURhdGEoICR0aGlzLmVfcHJvdmluY2VfYXJyYXkgKTtcblx0XHRcdFx0XHQkdGhpcy5zZXRQcm92aW5jZVZpc2liaWxpdHkoKTtcblxuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fVxuXHR9XG5cblx0b25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0LCBkb05vdFZhbGlkYXRlICkge1xuXG5cdFx0dGhpcy5zZXRJc0NoYW5nZWQoIHRhcmdldCApO1xuXHRcdHRoaXMuc2V0TWFzc0VkaXRpbmdGaWVsZHNXaGVuRm9ybUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0dmFyIGtleSA9IHRhcmdldC5nZXRGaWVsZCgpO1xuXHRcdHZhciBjX3ZhbHVlID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gPSBjX3ZhbHVlO1xuXG5cdFx0c3dpdGNoICgga2V5ICkge1xuXG5cdFx0XHRjYXNlICdjb3VudHJ5Jzpcblx0XHRcdFx0dmFyIHdpZGdldCA9IHRoaXMuZWRpdF92aWV3X3VpX2RpY1sncHJvdmluY2UnXTtcblx0XHRcdFx0dmFyIHdpZGdldF8yID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljWydkaXN0cmljdCddO1xuXHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIG51bGwgKTtcblx0XHRcdFx0d2lkZ2V0XzIuc2V0VmFsdWUoIG51bGwgKTtcblx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnByb3ZpbmNlID0gZmFsc2U7XG5cdFx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5kaXN0cmljdCA9IGZhbHNlO1xuXHRcdFx0XHR0aGlzLnNldER5bmFtaWNGaWVsZHMoIG51bGwsIHRydWUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwcm92aW5jZSc6XG5cdFx0XHRcdHdpZGdldF8yID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljWydkaXN0cmljdCddO1xuXHRcdFx0XHR0aGlzLnNldERpc3RyaWN0KCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2NvdW50cnknXSApO1xuXHRcdFx0XHR3aWRnZXRfMi5zZXRWYWx1ZSggbnVsbCApO1xuXHRcdFx0XHR0aGlzLnNldER5bmFtaWNGaWVsZHMoIG51bGwsIHRydWUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjYWxjdWxhdGlvbl9pZCc6XG5cdFx0XHRcdHRoaXMuc2V0RHluYW1pY0ZpZWxkcygpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2FwcGx5X2ZyZXF1ZW5jeV9pZCc6XG5cdFx0XHRcdHRoaXMub25BcHBseUZyZXF1ZW5jeUNoYW5nZSgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ21pbmltdW1fbGVuZ3RoX29mX3NlcnZpY2VfdW5pdF9pZCc6XG5cdFx0XHRjYXNlICdtYXhpbXVtX2xlbmd0aF9vZl9zZXJ2aWNlX3VuaXRfaWQnOlxuXHRcdFx0XHR0aGlzLm9uTGVuZ3RoT2ZTZXJ2aWNlQ2hhbmdlKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc3RhcnRfZGF0ZSc6XG5cdFx0XHRjYXNlICdlbmRfZGF0ZSc6XG5cdFx0XHRjYXNlICdtaW5pbXVtX2xlbmd0aF9vZl9zZXJ2aWNlJzpcblx0XHRcdGNhc2UgJ21heGltdW1fbGVuZ3RoX29mX3NlcnZpY2UnOlxuXHRcdFx0XHR0aGlzLnJlc2V0RW1wbG95ZWVTZXR0aW5nR3JpZENvbHVtbnMoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdsZWdhbF9lbnRpdHlfaWQnOlxuXHRcdFx0XHR0aGlzLm9uTGVnYWxFbnRpdHlDaGFuZ2UoKTtcblx0XHRcdFx0dGhpcy51cGRhdGVFbXBsb3llZURhdGEoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd1c2VyX3ZhbHVlMTAnOlxuXHRcdFx0XHR0aGlzLm9uRm9ybVc0VmVyc2lvbkNoYW5nZSgpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRpZiAoIGtleSA9PT0gJ2NvdW50cnknICkge1xuXHRcdFx0dGhpcy5vbkNvdW50cnlDaGFuZ2UoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoICFkb05vdFZhbGlkYXRlICkge1xuXHRcdFx0dGhpcy52YWxpZGF0ZSgpO1xuXHRcdH1cblx0fVxuXG5cdHNldEN1cnJlbnRFZGl0UmVjb3JkRGF0YSgpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0dGhpcy5vcmlnaW5hbF9jdXJyZW50X3JlY29yZCA9IEdsb2JhbC5jbG9uZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkICk7XG5cdFx0Ly9TZXQgY3VycmVudCBlZGl0IHJlY29yZCBkYXRhIHRvIGFsbCB3aWRnZXRzXG5cdFx0Zm9yICggdmFyIGtleSBpbiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgKSB7XG5cblx0XHRcdGlmICggIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgd2lkZ2V0ID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljW2tleV07XG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggd2lkZ2V0ICkgKSB7XG5cdFx0XHRcdHN3aXRjaCAoIGtleSApIHtcblx0XHRcdFx0XHRjYXNlICdjb3VudHJ5Jzpcblx0XHRcdFx0XHRcdHRoaXMuZVNldFByb3ZpbmNlKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSApO1xuXHRcdFx0XHRcdFx0dGhpcy5zZXREaXN0cmljdCggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKTtcblx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkge1xuXHRcdFx0JHRoaXMuZWRpdF92aWV3X3VpX2RpYy5jYWxjdWxhdGlvbl9pZC5zZXRFbmFibGVkKCBmYWxzZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQkdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmNhbGN1bGF0aW9uX2lkLnNldEVuYWJsZWQoIHRydWUgKTtcblx0XHR9XG5cblx0XHR0aGlzLnNldER5bmFtaWNGaWVsZHMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0JHRoaXMuY29sbGVjdFVJRGF0YVRvQ3VycmVudEVkaXRSZWNvcmQoKTtcblx0XHRcdCR0aGlzLm9uTGVuZ3RoT2ZTZXJ2aWNlQ2hhbmdlKCk7XG5cdFx0XHQkdGhpcy5zZXRFZGl0Vmlld0RhdGFEb25lKCk7XG5cdFx0XHQkdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmNvbXBhbnlfdGF4X2RlZHVjdGlvbl9pZHMuc2V0R3JpZENvbHVtbnNXaWR0aHMoKTtcblx0XHRcdCR0aGlzLm9uTGVnYWxFbnRpdHlDaGFuZ2UoKTtcblx0XHR9ICk7XG5cblx0XHRpZiAoIHRoaXMuc3ViX3ZpZXdfbW9kZSAmJiAoICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgfHwgIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCApICkge1xuXHRcdFx0dGhpcy5pbml0Q29tcGFueVRheERlZHVjdGlvbkRhdGEoKTtcblx0XHR9XG5cdH1cblxuXHRvbkxlZ2FsRW50aXR5Q2hhbmdlKCkge1xuXHRcdHZhciBwcmFfdmFsdWUgPSB0aGlzLmVkaXRfdmlld191aV9kaWMucGF5cm9sbF9yZW1pdHRhbmNlX2FnZW5jeV9pZC5nZXRWYWx1ZSgpO1xuXHRcdHZhciBuZXdfYXJnID0ge307XG5cdFx0bmV3X2FyZy5maWx0ZXJfZGF0YSA9IHsgbGVnYWxfZW50aXR5X2lkOiB0aGlzLmVkaXRfdmlld191aV9kaWMubGVnYWxfZW50aXR5X2lkLmdldFZhbHVlKCkgfTtcblx0XHRuZXdfYXJnLmZpbHRlcl9jb2x1bW5zID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljLnBheXJvbGxfcmVtaXR0YW5jZV9hZ2VuY3lfaWQuZ2V0Q29sdW1uRmlsdGVyKCk7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdGlmICggdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmxlZ2FsX2VudGl0eV9pZC5nZXRWYWx1ZSgpICE9IFRUVVVJRC56ZXJvX2lkICkge1xuXHRcdFx0dGhpcy5wYXlyb2xsX3JlbWl0dGFuY2VfYWdlbmN5X2FwaS5nZXRQYXlyb2xsUmVtaXR0YW5jZUFnZW5jeSggbmV3X2FyZywge1xuXHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHRhc2tfcmVzdWx0ICkge1xuXHRcdFx0XHRcdHZhciBkYXRhID0gdGFza19yZXN1bHQuZ2V0UmVzdWx0KCk7XG5cblx0XHRcdFx0XHRpZiAoICR0aGlzLmVkaXRfdmlld191aV9kaWMucGF5cm9sbF9yZW1pdHRhbmNlX2FnZW5jeV9pZCApIHtcblx0XHRcdFx0XHRcdGlmICggZGF0YS5sZW5ndGggPiAwICkge1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5lZGl0X3ZpZXdfdWlfZGljLnBheXJvbGxfcmVtaXR0YW5jZV9hZ2VuY3lfaWQuc2V0U291cmNlRGF0YSggZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRcdHZhciBpZF9pbl9yZXN1bHQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgaW4gZGF0YSApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGRhdGFbaV0uaWQgPT0gcHJhX3ZhbHVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWRfaW5fcmVzdWx0ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICggaWRfaW5fcmVzdWx0ID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0XHRwcmFfdmFsdWUgPSBUVFVVSUQuemVyb19pZDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdCR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQucGF5cm9sbF9yZW1pdHRhbmNlX2FnZW5jeV9pZCA9IHByYV92YWx1ZTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuZWRpdF92aWV3X3VpX2RpYy5wYXlyb2xsX3JlbWl0dGFuY2VfYWdlbmN5X2lkLnNldFZhbHVlKCBwcmFfdmFsdWUgKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0JHRoaXMuZWRpdF92aWV3X3VpX2RpYy5wYXlyb2xsX3JlbWl0dGFuY2VfYWdlbmN5X2lkLnNldFZhbHVlKCBUVFVVSUQuemVyb19pZCApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0JHRoaXMuZWRpdF92aWV3X3VpX2RpYy5wYXlyb2xsX3JlbWl0dGFuY2VfYWdlbmN5X2lkLnNldEVuYWJsZWQoIHRydWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJhX3ZhbHVlID0gVFRVVUlELnplcm9faWQ7XG5cdFx0XHQkdGhpcy5lZGl0X3ZpZXdfdWlfZGljLnBheXJvbGxfcmVtaXR0YW5jZV9hZ2VuY3lfaWQuc2V0U291cmNlRGF0YSggW1RUVVVJRC56ZXJvX2lkXSApOyAvL3dpcGUgdGhlIGJveFxuXHRcdFx0JHRoaXMuZWRpdF92aWV3X3VpX2RpYy5wYXlyb2xsX3JlbWl0dGFuY2VfYWdlbmN5X2lkLnNldFZhbHVlKCBwcmFfdmFsdWUgKTtcblx0XHRcdCR0aGlzLmVkaXRfdmlld191aV9kaWMucGF5cm9sbF9yZW1pdHRhbmNlX2FnZW5jeV9pZC5zZXRFbmFibGVkKCBmYWxzZSApO1xuXHRcdH1cblx0fVxuXG5cdHVwZGF0ZUVtcGxveWVlRGF0YSgpIHtcblx0XHR2YXIgcmVxdWVzdF9kYXRhID0geyBmaWx0ZXJfZGF0YToge30gfTtcblx0XHRpZiAoIHRoaXMuZWRpdF92aWV3X3VpX2RpYyAmJiB0aGlzLmVkaXRfdmlld191aV9kaWMubGVnYWxfZW50aXR5X2lkICYmIHRoaXMuZWRpdF92aWV3X3VpX2RpYy5sZWdhbF9lbnRpdHlfaWQuZ2V0VmFsdWUoKSAmJiB0aGlzLmVkaXRfdmlld191aV9kaWMubGVnYWxfZW50aXR5X2lkLmdldFZhbHVlKCkgIT0gVFRVVUlELnplcm9faWQgKSB7XG5cdFx0XHRyZXF1ZXN0X2RhdGEuZmlsdGVyX2RhdGEubGVnYWxfZW50aXR5X2lkID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmxlZ2FsX2VudGl0eV9pZC5nZXRWYWx1ZSgpO1xuXHRcdH1cblx0XHRpZiAoIHRoaXMuZWRpdF92aWV3X3VpX2RpYy51c2VyICkge1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLnVzZXIuc2V0RGVmYXVsdEFyZ3MoIHJlcXVlc3RfZGF0YSApO1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLnVzZXIuc2V0U291cmNlRGF0YSggbnVsbCApO1xuXHRcdH1cblx0fVxuXG5cdG9uTGVuZ3RoT2ZTZXJ2aWNlQ2hhbmdlKCkge1xuXG5cdFx0aWYgKCB0aGlzLnN1Yl92aWV3X21vZGUgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ21pbmltdW1fbGVuZ3RoX29mX3NlcnZpY2VfdW5pdF9pZCddID09IDUwIHx8IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnbWF4aW11bV9sZW5ndGhfb2Zfc2VydmljZV91bml0X2lkJ10gPT0gNTAgKSB7XG5cdFx0XHR0aGlzLmF0dGFjaEVsZW1lbnQoICdsZW5ndGhfb2Zfc2VydmljZV9jb250cmlidXRpbmdfcGF5X2NvZGVfcG9saWN5X2lkJyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdsZW5ndGhfb2Zfc2VydmljZV9jb250cmlidXRpbmdfcGF5X2NvZGVfcG9saWN5X2lkJyApO1xuXHRcdH1cblxuXHRcdHRoaXMuZWRpdEZpZWxkUmVzaXplKCk7XG5cdH1cblxuXHRpbml0Q29tcGFueVRheERlZHVjdGlvbkRhdGEoKSB7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0dmFyIHJlcXVlc3RfZGF0YSA9IHtcblx0XHRcdGZpbHRlcl9kYXRhOiB7XG5cdFx0XHRcdGxlZ2FsX2VudGl0eV9pZDogW3RoaXMucGFyZW50X2VkaXRfcmVjb3JkLmxlZ2FsX2VudGl0eV9pZCwgVFRVVUlELnplcm9faWQsIFRUVVVJRC5ub3RfZXhpc3RfaWRdLFxuXHRcdFx0XHRleGNsdWRlX3VzZXJfaWQ6IHRoaXMucGFyZW50X2VkaXRfcmVjb3JkLmlkIC8vRG9uJ3Qgc2hvdyByZWNvcmRzIHRoZSBlbXBsb3llZSBpcyBhbHJlYWR5IGFzc2luZ2VkIHRvLiBIZWxwcyBwcmV2ZW50IGR1cGxpY2F0ZSBtYXBwaW5ncy5cblx0XHRcdH0sXG5cdFx0XHRmaWx0ZXJfY29sdW1uczogeyAvL01ha2Ugc3VyZSB3ZSBsaW1pdCB0aGUgY29sdW1ucywgb3RoZXJ3aXNlIHRoaXMgY2FuIGJlIHNsb3cgdG8gbG9hZCBzaW5jZSBpdCB0cmllcyB0byBjb3VudCB0aGUgbnVtYmVyIG9mIGVtcGxveWVlcyBhc3NpZ25lZCB0byBlYWNoIFRheC9EZWR1Y3Rpb24gcmVjb3JkLlxuXHRcdFx0XHRpZDogdHJ1ZSxcblx0XHRcdFx0bmFtZTogdHJ1ZSxcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGhpcy5hcGkuZ2V0Q29tcGFueURlZHVjdGlvbiggcmVxdWVzdF9kYXRhLCB0cnVlLCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHQkdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmNvbXBhbnlfdGF4X2RlZHVjdGlvbl9pZHMuc2V0VW5zZWxlY3RlZEdyaWREYXRhKCByZXN1bHRfZGF0YSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdHNldEVkaXRWaWV3RGF0YURvbmUoKSB7XG5cdFx0c3VwZXIuc2V0RWRpdFZpZXdEYXRhRG9uZSgpO1xuXHRcdHRoaXMub25BcHBseUZyZXF1ZW5jeUNoYW5nZSgpO1xuXHRcdHRoaXMuaW5pdEVtcGxveWVlU2V0dGluZygpO1xuXHRcdHRoaXMudXBkYXRlRW1wbG95ZWVEYXRhKCk7XG5cdH1cblxuXHRzZXREaXN0cmljdCggYyApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBkaXN0cmljdF93aWRnZXQgPSAkdGhpcy5lZGl0X3ZpZXdfdWlfZGljWydkaXN0cmljdCddO1xuXG5cdFx0JHRoaXMucHJvdmluY2VfZGlzdHJpY3RfYXJyYXkgPSBbXTtcblx0XHRkaXN0cmljdF93aWRnZXQuc2V0U291cmNlRGF0YSggJHRoaXMucHJvdmluY2VfZGlzdHJpY3RfYXJyYXkgKTtcblx0XHRpZiAoIGMgKSB7XG5cdFx0XHR2YXIgcGRfYXJyYXkgPSB0aGlzLmRpc3RyaWN0X2FycmF5W2NdO1xuXG5cdFx0XHRpZiAoIHBkX2FycmF5ICkge1xuXHRcdFx0XHR2YXIgcGRfYXJyYXlfaXRlbSA9IHBkX2FycmF5WyR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQucHJvdmluY2VdO1xuXG5cdFx0XHRcdGlmICggcGRfYXJyYXlfaXRlbSApIHtcblx0XHRcdFx0XHQkdGhpcy5wcm92aW5jZV9kaXN0cmljdF9hcnJheSA9IEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCBwZF9hcnJheV9pdGVtICk7XG5cdFx0XHRcdFx0ZGlzdHJpY3Rfd2lkZ2V0LnNldFNvdXJjZURhdGEoICR0aGlzLnByb3ZpbmNlX2Rpc3RyaWN0X2FycmF5ICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdCR0aGlzLnNldERpc3RyaWN0VmlzaWJpbGl0eSgpO1xuXHR9XG5cblx0aGlkZUFsbER5bmFtaWNGaWVsZHMoIGtlZXBDLCBrZWVwUCApIHtcblxuXHRcdGlmICggIXRoaXMuZWRpdF92aWV3ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggIWtlZXBDICkge1xuXHRcdFx0dGhpcy5zaG93X2MgPSBmYWxzZTtcblx0XHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ2NvdW50cnknICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAha2VlcFAgKSB7XG5cdFx0XHR0aGlzLnNob3dfcCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5zaG93X2RjID0gZmFsc2U7XG5cdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdwcm92aW5jZScgKTtcblx0XHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ2Rpc3RyaWN0JyApO1xuXHRcdH1cblxuXHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ2RmXzAnICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnZGZfMScgKTtcblx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdkZl8yJyApO1xuXHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ2RmXzMnICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnZGZfNCcgKTtcblx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdkZl81JyApO1xuXHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ2RmXzYnICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnZGZfNycgKTtcblx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdkZl84JyApO1xuXHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ2RmXzknICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnZGZfMTAnICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnZGZfMTEnICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnZGZfMTInICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnZGZfMTQnICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnZGZfMTUnICk7XG5cblx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdkZl8yMCcgKTtcblx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdkZl8yMScgKTtcblx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdkZl8yMicgKTtcblx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdkZl8yMycgKTtcblx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdkZl8yNCcgKTtcblx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdkZl8yNScgKTtcblxuXHRcdGlmICggISggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMTUgKSApIHtcblx0XHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ2RmXzEwMCcgKTtcblx0XHR9XG5cdH1cblxuXHRpbml0RW1wbG95ZWVTZXR0aW5nKCkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHRpZiAoICEkdGhpcy5lZGl0X3ZpZXcgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkIHx8ICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKSB7XG5cdFx0XHQkdGhpcy5lbXBsb3llZV9zZXR0aW5nX3Jlc3VsdCA9IFtdO1xuXHRcdFx0Ly9Eb24ndCBkaXNwbGF5IHRoZSBFbXBsb3llZSBTZXR0aW5ncyBncmlkIGhlYWRlcnMgd2hlbiBpdHMgYSBuZXcgcmVjb3JkLlxuXHRcdFx0Ly8kdGhpcy5zZXRFbXBsb3llZVNldHRpbmdHcmlkRGF0YSggJHRoaXMuYnVpbGRFbXBsb3llZVNldHRpbmdHcmlkKCkgKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBTcGVjaWZ5IHdoaWNoIG1lbnUgdG8gdXNlIGZvciBFbXBsb3llZSBTZXR0aW5ncyB0YWIsIGFuZCB1c2UgZGlzYWJsZUljb25PbkVtcGxveWVlU2V0dGluZ3NUYWIoKSB0byBkaXNhYmxlIGNlcnRhaW4gaWNvbnMuIFJlbGF0ZWQgdG8gIzI2ODhcblx0XHR0aGlzLmJ1aWxkQ29udGV4dE1lbnUoIHRydWUgKTtcblx0XHR0aGlzLnNldEVkaXRNZW51KCk7XG5cdFx0dmFyIGNvbnRleHRfbWVudV9hcnJheSA9IENvbnRleHRNZW51TWFuYWdlci5nZXRNZW51TW9kZWxCeU1lbnVJZCggdGhpcy5kZXRlcm1pbmVDb250ZXh0TWVudU1vdW50QXR0cmlidXRlcygpLmlkICk7XG5cdFx0dmFyIGxlbiA9IGNvbnRleHRfbWVudV9hcnJheS5sZW5ndGg7XG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRsZXQgY29udGV4dF9idG4gPSBjb250ZXh0X21lbnVfYXJyYXlbaV07XG5cdFx0XHRsZXQgaWQgPSBjb250ZXh0X21lbnVfYXJyYXlbaV0uaWQ7XG5cblx0XHRcdGlmICggaWQgPT09ICdleHBvcnRfZXhjZWwnICkge1xuXHRcdFx0XHR0aGlzLnNldEVkaXRNZW51RXhwb3J0SWNvbiggY29udGV4dF9idG4gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cblx0XHR2YXIgYXJncyA9IHsgZmlsdGVyX2RhdGE6IHt9IH07XG5cblx0XHRhcmdzLmZpbHRlcl9kYXRhLmNvbXBhbnlfZGVkdWN0aW9uX2lkID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkO1xuXG5cdFx0aWYgKCB0aGlzLnN1Yl92aWV3X21vZGUgKSB7XG5cdFx0XHRhcmdzLmZpbHRlcl9kYXRhLnVzZXJfaWQgPSB0aGlzLnBhcmVudF92YWx1ZTtcblx0XHR9XG5cblx0XHR0aGlzLnVzZXJfZGVkdWN0aW9uX2FwaS5nZXRVc2VyRGVkdWN0aW9uKCBhcmdzLCB0cnVlLCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblxuXHRcdFx0XHRpZiAoICEkdGhpcy5lZGl0X3ZpZXcgKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0JHRoaXMuZW1wbG95ZWVfc2V0dGluZ19yZXN1bHQgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdCR0aGlzLnNldEVtcGxveWVlU2V0dGluZ0dyaWREYXRhKCAkdGhpcy5idWlsZEVtcGxveWVlU2V0dGluZ0dyaWQoKSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxuXG5cdHJlc2V0RW1wbG95ZWVTZXR0aW5nR3JpZENvbHVtbnMoKSB7XG5cdFx0aWYgKCB0aGlzLmVtcGxveWVlX3NldHRpbmdfZ3JpZCApIHtcblx0XHRcdHZhciBkYXRhID0gdGhpcy5lbXBsb3llZV9zZXR0aW5nX2dyaWQuZ2V0R3JpZFBhcmFtKCAnZGF0YScgKTtcblx0XHRcdEdsb2JhbC5mb3JtYXRHcmlkRGF0YSggZGF0YSwgdGhpcy5hcGkua2V5X25hbWUgKTtcblx0XHRcdHRoaXMuYnVpbGRFbXBsb3llZVNldHRpbmdHcmlkKCk7XG5cdFx0XHR0aGlzLmVtcGxveWVlX3NldHRpbmdfZ3JpZC5zZXREYXRhKCBkYXRhICk7XG5cdFx0XHR0aGlzLnJlbW92ZUVtcGxveWVlU2V0dGluZ05vUmVzdWx0Q292ZXIoKTtcblx0XHRcdHRoaXMuc2V0RW1wbG95ZWVHcmlkRGF0ZUNvbHVtbnMoKTtcblx0XHRcdHRoaXMuc2V0RW1wbG95ZWVHcmlkU2l6ZSgpO1xuXHRcdFx0aWYgKCBkYXRhLmxlbmd0aCA8IDEgJiYgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkge1xuXHRcdFx0XHR0aGlzLnNob3dFbXBsb3llZVNldHRpbmdOb1Jlc3VsdENvdmVyKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Z2V0Q29sdW1uT3B0aW9uc1N0cmluZyggY29sdW1uX29wdGlvbnNfYXJyICkge1xuXHRcdHZhciBjb2x1bW5fb3B0aW9uc19zdHJpbmcgPSAnJztcblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjb2x1bW5fb3B0aW9uc19hcnIubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRpZiAoIGkgIT09IGNvbHVtbl9vcHRpb25zX2Fyci5sZW5ndGggLSAxICkge1xuXHRcdFx0XHRjb2x1bW5fb3B0aW9uc19zdHJpbmcgKz0gY29sdW1uX29wdGlvbnNfYXJyW2ldLmZ1bGxWYWx1ZSArICc6JyArIGNvbHVtbl9vcHRpb25zX2FycltpXS5sYWJlbCArICc7Jztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbHVtbl9vcHRpb25zX3N0cmluZyArPSBjb2x1bW5fb3B0aW9uc19hcnJbaV0uZnVsbFZhbHVlICsgJzonICsgY29sdW1uX29wdGlvbnNfYXJyW2ldLmxhYmVsO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjb2x1bW5fb3B0aW9uc19zdHJpbmc7XG5cdH1cblxuXHQvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG5cdGJ1aWxkRW1wbG95ZWVTZXR0aW5nR3JpZCgpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBjb2x1bW5faW5mb19hcnJheSA9IFtdO1xuXG5cdFx0dmFyIGNvbHVtbl9pbmZvID0ge1xuXHRcdFx0bmFtZTogJ2VtcGxveWVlX251bWJlcicsXG5cdFx0XHRpbmRleDogJ2VtcGxveWVlX251bWJlcicsXG5cdFx0XHRsYWJlbDogJC5pMThuLl8oICdFbXBsb3llZSBOdW1iZXInICksXG5cdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0c29ydGFibGU6IGZhbHNlLFxuXHRcdFx0dGl0bGU6IGZhbHNlXG5cdFx0fTtcblx0XHRjb2x1bW5faW5mb19hcnJheS5wdXNoKCBjb2x1bW5faW5mbyApO1xuXG5cdFx0dmFyIGNvbHVtbl9pbmZvID0ge1xuXHRcdFx0bmFtZTogJ3VzZXJfbmFtZScsXG5cdFx0XHRpbmRleDogJ3VzZXJfbmFtZScsXG5cdFx0XHRsYWJlbDogJC5pMThuLl8oICdFbXBsb3llZScgKSxcblx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHR0aXRsZTogZmFsc2Vcblx0XHR9O1xuXHRcdGNvbHVtbl9pbmZvX2FycmF5LnB1c2goIGNvbHVtbl9pbmZvICk7XG5cblx0XHQkdGhpcy5hcGkuZ2V0T3B0aW9ucyggJ2NhbGN1bGF0aW9uX3R5cGVfY29sdW1uX21ldGFfZGF0YScsIHtcblx0XHRcdCdjYWxjdWxhdGlvbl9pZCc6ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuY2FsY3VsYXRpb25faWQsXG5cdFx0XHQnY291bnRyeSc6ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuY291bnRyeSxcblx0XHRcdCdwcm92aW5jZSc6ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQucHJvdmluY2Vcblx0XHR9LCB7XG5cdFx0XHQvL0lzc3VlICMzMzAyIC0gT3BlbmluZyB0YXgvZGVkdWN0aW9uIHJlY29yZCBvbiBFbXBsb3llZSAtPiBFbXBsb3llZXMgd291bGQgbm90IGFsd2F5cyBzaG93IGNvcnJlY3QgZGF0YSBvbiBmaXJzdCBvcGVuaW5nIHRoZSByZWNvcmQuIChPbmx5IGFmdGVyIHRoaXMgY2FsbCB3YXMgY2FjaGVkKVxuXHRcdFx0Ly9UaGlzIGNhbGwgbmVlZHMgdG8gYmUgc3luY2hyb25vdXMgc28gdGhhdCB0aGUgY29sdW1uX2luZm9fYXJyYXkgaXMgcG9wdWxhdGVkIHdpdGggYWxsIHJlbGV2YW50IGRhdGEgYmVmb3JlIHRoZSBncmlkIGlzIGJ1aWx0IGFuZCBmdW5jdGlvbiByZXR1cm5zLlxuXHRcdFx0YXN5bmM6IGZhbHNlLFxuXHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdHJlc3VsdCA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblxuXHRcdFx0XHRmb3IgKCB2YXIga2V5IGluIHJlc3VsdCApIHtcblx0XHRcdFx0XHRsZXQgbWV0YV9kYXRhID0gcmVzdWx0W2tleV07XG5cdFx0XHRcdFx0bGV0IGR5bmFtaWNfZmllbGRfaWQgPSBtZXRhX2RhdGFbJ2R5bmFtaWNfZmllbGRfaWQnXTtcblxuXHRcdFx0XHRcdGlmICggbWV0YV9kYXRhLnR5cGVfaWQgPT0gMjEwMCApIHtcblx0XHRcdFx0XHRcdC8vJHRoaXMuZWRpdF92aWV3X3VpX2RpY1tkeW5hbWljX2ZpZWxkX2lkXS5zZXRTb3VyY2VEYXRhKCBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggbWV0YV9kYXRhLm11bHRpX3NlbGVjdF9pdGVtcyApICk7XG5cdFx0XHRcdFx0XHRjb2x1bW5faW5mbyA9IHtcblx0XHRcdFx0XHRcdFx0bmFtZToga2V5LFxuXHRcdFx0XHRcdFx0XHRpbmRleDoga2V5LFxuXHRcdFx0XHRcdFx0XHRsYWJlbDogbWV0YV9kYXRhLm5hbWUsXG5cdFx0XHRcdFx0XHRcdHdpZHRoOiBtZXRhX2RhdGEud2lkdGgsXG5cdFx0XHRcdFx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0Zm9ybWF0dGVyOiAnc2VsZWN0Jyxcblx0XHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdHRpdGxlOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0ZWRpdHR5cGU6ICdzZWxlY3QnLFxuXHRcdFx0XHRcdFx0XHRlZGl0b3B0aW9uczoge1xuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZTogbWV0YV9kYXRhLmRlZmF1bHRfdmFsdWUsIC8vVGhpcyBpcyByZXF1aXJlZCB0byBwcmV2ZW50IGEgYmxhbmsgY2VsbCBmcm9tIGFwcGVhcmluZyBpZiB0aGV5IGhhdmVuJ3Qgc2F2ZWQgdGhlIFRheC9EZWR1Y3Rpb24gcmVjb3JkIHNpbmNlIHRoZSB1cGdyYWRlLlxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAkdGhpcy5nZXRDb2x1bW5PcHRpb25zU3RyaW5nKCBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggbWV0YV9kYXRhLm11bHRpX3NlbGVjdF9pdGVtcyApICksXG5cdFx0XHRcdFx0XHRcdFx0Ly9kYXRhRXZlbnRzOiBbIHt0eXBlOiAnY2hhbmdlJywgZm46ZnVuY3Rpb24oZSkgeyAkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCBlLnRhcmdldCwgdHJ1ZSApfX0gXSxcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29sdW1uX2luZm8gPSB7XG5cdFx0XHRcdFx0XHRcdG5hbWU6IGtleSxcblx0XHRcdFx0XHRcdFx0aW5kZXg6IGtleSxcblx0XHRcdFx0XHRcdFx0bGFiZWw6IG1ldGFfZGF0YS5uYW1lLFxuXHRcdFx0XHRcdFx0XHR3aWR0aDogbWV0YV9kYXRhLndpZHRoLFxuXHRcdFx0XHRcdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdHRpdGxlOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGVkaXR0eXBlOiAndGV4dCdcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbHVtbl9pbmZvX2FycmF5LnB1c2goIGNvbHVtbl9pbmZvICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cblx0XHRpZiAoICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLm1pbmltdW1fbGVuZ3RoX29mX3NlcnZpY2UgJiYgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLm1pbmltdW1fbGVuZ3RoX29mX3NlcnZpY2UgIT0gMCApIHx8XG5cdFx0XHQoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5tYXhpbXVtX2xlbmd0aF9vZl9zZXJ2aWNlICYmIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5tYXhpbXVtX2xlbmd0aF9vZl9zZXJ2aWNlICkgIT0gMCApIHtcblx0XHRcdGNvbHVtbl9pbmZvID0ge1xuXHRcdFx0XHRuYW1lOiAnbGVuZ3RoX29mX3NlcnZpY2VfZGF0ZScsXG5cdFx0XHRcdGluZGV4OiAnbGVuZ3RoX29mX3NlcnZpY2VfZGF0ZScsXG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0xlbmd0aCBvZiBTZXJ2aWNlIERhdGUnICksXG5cdFx0XHRcdHdpZHRoOiAxMTAsXG5cdFx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdFx0dGl0bGU6IGZhbHNlLFxuXHRcdFx0XHRlZGl0YWJsZTogZmFsc2UsXG5cdFx0XHRcdGZvcm1hdHRlcjogdGhpcy5vbkxlbmd0aERhdGVDZWxsRm9ybWF0XG5cdFx0XHR9O1xuXHRcdFx0Y29sdW1uX2luZm9fYXJyYXkucHVzaCggY29sdW1uX2luZm8gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0JCggJy5yb3ctZGF0ZS1waWNrZXItbGVuZ3RoLW9mLXNlcnZpY2UtZGF0ZScgKS5yZW1vdmUoKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5zdGFydF9kYXRlIHx8IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5lbmRfZGF0ZSApIHtcblx0XHRcdGNvbHVtbl9pbmZvID0ge1xuXHRcdFx0XHRuYW1lOiAnc3RhcnRfZGF0ZScsXG5cdFx0XHRcdGluZGV4OiAnc3RhcnRfZGF0ZScsXG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1N0YXJ0IERhdGUnICksXG5cdFx0XHRcdHdpZHRoOiAxMTAsXG5cdFx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdFx0dGl0bGU6IGZhbHNlLFxuXHRcdFx0XHRlZGl0YWJsZTogZmFsc2UsXG5cdFx0XHRcdGZvcm1hdHRlcjogdGhpcy5vblN0YXJ0RGF0ZUNlbGxGb3JtYXRcblx0XHRcdH07XG5cdFx0XHRjb2x1bW5faW5mb19hcnJheS5wdXNoKCBjb2x1bW5faW5mbyApO1xuXG5cdFx0XHRjb2x1bW5faW5mbyA9IHtcblx0XHRcdFx0bmFtZTogJ2VuZF9kYXRlJyxcblx0XHRcdFx0aW5kZXg6ICdlbmRfZGF0ZScsXG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0VuZCBEYXRlJyApLFxuXHRcdFx0XHR3aWR0aDogMTEwLFxuXHRcdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHRcdHRpdGxlOiBmYWxzZSxcblx0XHRcdFx0ZWRpdGFibGU6IGZhbHNlLFxuXHRcdFx0XHRmb3JtYXR0ZXI6IHRoaXMub25FbmREYXRlQ2VsbEZvcm1hdFxuXHRcdFx0fTtcblx0XHRcdGNvbHVtbl9pbmZvX2FycmF5LnB1c2goIGNvbHVtbl9pbmZvICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCQoICcucm93LWRhdGUtcGlja2VyLXN0YXJ0LWRhdGUnICkucmVtb3ZlKCk7XG5cdFx0XHQkKCAnLnJvdy1kYXRlLXBpY2tlci1lbmQtZGF0ZScgKS5yZW1vdmUoKTtcblx0XHR9XG5cblx0XHQvL0FkZCBFeGVtcHQgY29sdW1uIHRvIGFsbCBGZWRlcmFsL1Byb3ZpbmNpYWwvU3RhdGUvRGlzdHJpY3QgdGF4ZXMuXG5cdFx0aWYgKCAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5jYWxjdWxhdGlvbl9pZCA9PSAxMDAgfHwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmNhbGN1bGF0aW9uX2lkID09IDIwMCB8fCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuY2FsY3VsYXRpb25faWQgPT0gMzAwICkgJiYgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmNvdW50cnkgPT0gJ1VTJyApIHtcblx0XHRcdGNvbHVtbl9pbmZvID0ge1xuXHRcdFx0XHRuYW1lOiAndXNlcl92YWx1ZTEwJyxcblx0XHRcdFx0aW5kZXg6ICd1c2VyX3ZhbHVlMTAnLFxuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdFeGVtcHQnICksXG5cdFx0XHRcdHdpZHRoOiAzMCxcblx0XHRcdFx0c29ydGFibGU6IGZhbHNlLFxuXHRcdFx0XHRmb3JtYXR0ZXI6ICdzZWxlY3QnLFxuXHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0dGl0bGU6IGZhbHNlLFxuXHRcdFx0XHRlZGl0dHlwZTogJ3NlbGVjdCcsXG5cdFx0XHRcdGVkaXRvcHRpb25zOiB7IHZhbHVlOiB0aGlzLmdldENvbHVtbk9wdGlvbnNTdHJpbmcoIHRoaXMueWVzX25vX2FycmF5ICkgfVxuXHRcdFx0fTtcblx0XHRcdGNvbHVtbl9pbmZvX2FycmF5LnB1c2goIGNvbHVtbl9pbmZvICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmVtcGxveWVlX3NldHRpbmdfZ3JpZCApIHtcblx0XHRcdHRoaXMuZW1wbG95ZWVfc2V0dGluZ19ncmlkLmdyaWQuanFHcmlkKCAnR3JpZFVubG9hZCcgKTtcblx0XHRcdHRoaXMuZW1wbG95ZWVfc2V0dGluZ19ncmlkID0gbnVsbDtcblx0XHR9XG5cblx0XHR0aGlzLmVtcGxveWVlX3NldHRpbmdfZ3JpZCA9IG5ldyBUVEdyaWQoICdlbXBsb3llZV9zZXR0aW5nX2dyaWQnLCB7XG5cdFx0XHRjb250YWluZXJfc2VsZWN0b3I6ICcuZWRpdC12aWV3LXRhYicsXG5cdFx0XHRtdWx0aXNlbGVjdDogZmFsc2UsXG5cdFx0XHR3aW5NdWx0aVNlbGVjdDogZmFsc2UsXG5cdFx0XHRjb2xNb2RlbDogY29sdW1uX2luZm9fYXJyYXksXG5cdFx0XHRlZGl0dXJsOiAnY2xpZW50QXJyYXknLFxuXHRcdFx0b25TZWxlY3RSb3c6IGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdFx0aWYgKCBpZCAmJiAhJHRoaXMuaXNfdmlld2luZyApIHtcblxuXHRcdFx0XHRcdGlmICggJHRoaXMuc2VsZWN0X2dyaWRfbGFzdF9yb3cgKSB7XG5cdFx0XHRcdFx0XHQkdGhpcy5lbXBsb3llZV9zZXR0aW5nX2dyaWQuZ3JpZC5qcUdyaWQoICdzYXZlUm93JywgJHRoaXMuc2VsZWN0X2dyaWRfbGFzdF9yb3cgKTtcblx0XHRcdFx0XHRcdCR0aGlzLnNldERhdGVDZWxsc0VuYWJsZWQoIGZhbHNlLCAkdGhpcy5zZWxlY3RfZ3JpZF9sYXN0X3JvdyApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCR0aGlzLmVtcGxveWVlX3NldHRpbmdfZ3JpZC5ncmlkLmpxR3JpZCggJ2VkaXRSb3cnLCBpZCwgdHJ1ZSApO1xuXHRcdFx0XHRcdCR0aGlzLnNldERhdGVDZWxsc0VuYWJsZWQoIHRydWUsIGlkICk7XG5cdFx0XHRcdFx0JHRoaXMuc2VsZWN0X2dyaWRfbGFzdF9yb3cgPSBpZDtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdG9uRW5kRWRpdFJvdzogZnVuY3Rpb24oIGlkICkge1xuXHRcdFx0XHQkdGhpcy5zZXREYXRlQ2VsbHNFbmFibGVkKCBmYWxzZSwgaWQgKTtcblx0XHRcdH0sXG5cdFx0XHRncmlkQ29tcGxldGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQkdGhpcy5zZXRFbXBsb3llZUdyaWRTaXplKCk7XG5cdFx0XHR9XG5cdFx0fSwgY29sdW1uX2luZm9fYXJyYXkgKTtcblxuXHRcdHJldHVybiBjb2x1bW5faW5mb19hcnJheTtcblx0fVxuXG5cdHNldEVkaXRWaWV3VGFiU2l6ZSgpIHtcblx0XHRzdXBlci5zZXRFZGl0Vmlld1RhYlNpemUoKTtcblx0XHR0aGlzLnNldEVtcGxveWVlR3JpZFNpemUoKTtcblx0fVxuXG5cdHNldERhdGVDZWxsc0VuYWJsZWQoIGZsYWcsIHJvd19pZCApIHtcblx0XHR0aGlzLmxlbmd0aF9kYXRlc19kaWNbcm93X2lkXSAmJiB0aGlzLmxlbmd0aF9kYXRlc19kaWNbcm93X2lkXS5zZXRFbmFibGVkKCBmbGFnICk7XG5cdFx0dGhpcy5zdGFydF9kYXRlc19kaWNbcm93X2lkXSAmJiB0aGlzLnN0YXJ0X2RhdGVzX2RpY1tyb3dfaWRdLnNldEVuYWJsZWQoIGZsYWcgKTtcblx0XHR0aGlzLmVuZF9kYXRlc19kaWNbcm93X2lkXSAmJiB0aGlzLmVuZF9kYXRlc19kaWNbcm93X2lkXS5zZXRFbmFibGVkKCBmbGFnICk7XG5cdH1cblxuXHRvbkxlbmd0aERhdGVDZWxsRm9ybWF0KCBjZWxsX3ZhbHVlLCByZWxhdGVkX2RhdGEsIHJvdyApIHtcblxuXHRcdHZhciBmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkRBVEVfUElDS0VSICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LmFkZENsYXNzKCAncm93LWRhdGUtcGlja2VyLWxlbmd0aC1vZi1zZXJ2aWNlLWRhdGUnICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LmF0dHIoICd3aWRnZXQtdmFsdWUnLCBjZWxsX3ZhbHVlICk7XG5cdFx0cmV0dXJuIGZvcm1faXRlbV9pbnB1dC5nZXQoIDAgKS5vdXRlckhUTUw7XG5cdH1cblxuXHRvblN0YXJ0RGF0ZUNlbGxGb3JtYXQoIGNlbGxfdmFsdWUsIHJlbGF0ZWRfZGF0YSwgcm93ICkge1xuXG5cdFx0dmFyIGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuREFURV9QSUNLRVIgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuYWRkQ2xhc3MoICdyb3ctZGF0ZS1waWNrZXItc3RhcnQtZGF0ZScgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuYXR0ciggJ3dpZGdldC12YWx1ZScsIGNlbGxfdmFsdWUgKTtcblx0XHRyZXR1cm4gZm9ybV9pdGVtX2lucHV0LmdldCggMCApLm91dGVySFRNTDtcblx0fVxuXG5cdG9uRW5kRGF0ZUNlbGxGb3JtYXQoIGNlbGxfdmFsdWUsIHJlbGF0ZWRfZGF0YSwgcm93ICkge1xuXG5cdFx0dmFyIGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuREFURV9QSUNLRVIgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuYWRkQ2xhc3MoICdyb3ctZGF0ZS1waWNrZXItZW5kLWRhdGUnICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LmF0dHIoICd3aWRnZXQtdmFsdWUnLCBjZWxsX3ZhbHVlICk7XG5cdFx0cmV0dXJuIGZvcm1faXRlbV9pbnB1dC5nZXQoIDAgKS5vdXRlckhUTUw7XG5cdH1cblxuXHRzZXRFbXBsb3llZVNldHRpbmdHcmlkRGF0YSggY29sdW1uX2luZm9fYXJyYXkgKSB7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBncmlkX3NvdXJjZSA9IFtdO1xuXHRcdGlmICggJC50eXBlKCB0aGlzLmVtcGxveWVlX3NldHRpbmdfcmVzdWx0ICkgPT09ICdhcnJheScgKSB7XG5cdFx0XHRncmlkX3NvdXJjZSA9IHRoaXMuZW1wbG95ZWVfc2V0dGluZ19yZXN1bHQuc2xpY2UoKTtcblx0XHR9XG5cblx0XHR2YXIgbGVuID0gZ3JpZF9zb3VyY2UubGVuZ3RoO1xuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0dmFyIGl0ZW0gPSBncmlkX3NvdXJjZVtpXTtcblx0XHRcdGl0ZW0udXNlcl9uYW1lID0gKCAoIGl0ZW0udXNlcl9zdGF0dXNfaWQgIT0gMTAgKSA/ICcoJyArIGl0ZW0udXNlcl9zdGF0dXMgKyAnKSAnIDogJycgKSArIGl0ZW0uZnVsbF9uYW1lO1xuXHRcdFx0Zm9yICggdmFyIGogPSAxOyBqIDwgY29sdW1uX2luZm9fYXJyYXkubGVuZ3RoOyBqKysgKSB7XG5cblx0XHRcdFx0dmFyIGNvbHVtbiA9IGNvbHVtbl9pbmZvX2FycmF5W2pdO1xuXHRcdFx0XHRpZiAoICFpdGVtW2NvbHVtbi5uYW1lXSApIHtcblx0XHRcdFx0XHRpdGVtW2NvbHVtbi5uYW1lXSA9ICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmhhc093blByb3BlcnR5KCBjb2x1bW4ubmFtZSApICYmIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtjb2x1bW4ubmFtZV0gIT09IGZhbHNlICkgPyB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbY29sdW1uLm5hbWVdIDogJyc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdCR0aGlzLmVtcGxveWVlX3NldHRpbmdfZ3JpZC5zZXREYXRhKCBncmlkX3NvdXJjZSApO1xuXHRcdHRoaXMucmVtb3ZlRW1wbG95ZWVTZXR0aW5nTm9SZXN1bHRDb3ZlcigpO1xuXHRcdHRoaXMuc2V0RW1wbG95ZWVHcmlkRGF0ZUNvbHVtbnMoKTtcblxuXHRcdHRoaXMuc2V0RW1wbG95ZWVHcmlkU2l6ZSgpO1xuXG5cdFx0aWYgKCBncmlkX3NvdXJjZS5sZW5ndGggPCAxICYmIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZCApIHtcblx0XHRcdHRoaXMuc2hvd0VtcGxveWVlU2V0dGluZ05vUmVzdWx0Q292ZXIoKTtcblx0XHR9XG5cdH1cblxuXHRzZXRFbXBsb3llZUdyaWREYXRlQ29sdW1ucygpIHtcblx0XHR2YXIgaSwgZGF0ZV9waWNrZXI7XG5cdFx0dGhpcy5sZW5ndGhfZGF0ZXMgPSBbXTtcblx0XHR0aGlzLnN0YXJ0X2RhdGVzID0gW107XG5cdFx0dGhpcy5lbmRfZGF0ZXMgPSBbXTtcblx0XHR0aGlzLmxlbmd0aF9kYXRlc19kaWMgPSB7fTtcblx0XHR0aGlzLnN0YXJ0X2RhdGVzX2RpYyA9IHt9O1xuXHRcdHRoaXMuZW5kX2RhdGVzX2RpYyA9IHt9O1xuXHRcdHZhciBkYXRlX3BpY2tlcnMgPSAkKCAnLnJvdy1kYXRlLXBpY2tlci1sZW5ndGgtb2Ytc2VydmljZS1kYXRlJyApO1xuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGRhdGVfcGlja2Vycy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdGRhdGVfcGlja2VyID0gJCggZGF0ZV9waWNrZXJzW2ldICkuVERhdGVQaWNrZXIoIHsgZmllbGQ6ICdsZW5ndGhfb2Zfc2VydmljZV9kYXRlJyArIGkgfSApO1xuXHRcdFx0ZGF0ZV9waWNrZXIuc2V0RW5hYmxlZCggZmFsc2UgKTtcblx0XHRcdHRoaXMubGVuZ3RoX2RhdGVzLnB1c2goIGRhdGVfcGlja2VyICk7XG5cdFx0XHR0aGlzLmxlbmd0aF9kYXRlc19kaWNbZGF0ZV9waWNrZXIucGFyZW50KCkucGFyZW50KCkuYXR0ciggJ2lkJyApXSA9IGRhdGVfcGlja2VyO1xuXHRcdH1cblx0XHRkYXRlX3BpY2tlcnMgPSAkKCAnLnJvdy1kYXRlLXBpY2tlci1zdGFydC1kYXRlJyApO1xuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGRhdGVfcGlja2Vycy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdGRhdGVfcGlja2VyID0gJCggZGF0ZV9waWNrZXJzW2ldICkuVERhdGVQaWNrZXIoIHsgZmllbGQ6ICdzdGFydF9kYXRlJyArIGkgfSApO1xuXHRcdFx0ZGF0ZV9waWNrZXIuc2V0RW5hYmxlZCggZmFsc2UgKTtcblx0XHRcdHRoaXMuc3RhcnRfZGF0ZXMucHVzaCggZGF0ZV9waWNrZXIgKTtcblx0XHRcdHRoaXMuc3RhcnRfZGF0ZXNfZGljW2RhdGVfcGlja2VyLnBhcmVudCgpLnBhcmVudCgpLmF0dHIoICdpZCcgKV0gPSBkYXRlX3BpY2tlcjtcblx0XHR9XG5cdFx0ZGF0ZV9waWNrZXJzID0gJCggJy5yb3ctZGF0ZS1waWNrZXItZW5kLWRhdGUnICk7XG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZGF0ZV9waWNrZXJzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0ZGF0ZV9waWNrZXIgPSAkKCBkYXRlX3BpY2tlcnNbaV0gKS5URGF0ZVBpY2tlciggeyBmaWVsZDogJ2VuZF9kYXRlJyArIGkgfSApO1xuXHRcdFx0ZGF0ZV9waWNrZXIuc2V0RW5hYmxlZCggZmFsc2UgKTtcblx0XHRcdHRoaXMuZW5kX2RhdGVzLnB1c2goIGRhdGVfcGlja2VyICk7XG5cdFx0XHR0aGlzLmVuZF9kYXRlc19kaWNbZGF0ZV9waWNrZXIucGFyZW50KCkucGFyZW50KCkuYXR0ciggJ2lkJyApXSA9IGRhdGVfcGlja2VyO1xuXHRcdH1cblx0fVxuXG5cdHNob3dFbXBsb3llZVNldHRpbmdOb1Jlc3VsdENvdmVyKCkge1xuXG5cdFx0dGhpcy5yZW1vdmVFbXBsb3llZVNldHRpbmdOb1Jlc3VsdENvdmVyKCk7XG5cdFx0dGhpcy5lbXBsb3llZV9zZXR0aW5nX25vX3Jlc3VsdF9ib3ggPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggV2lkZ2V0TmFtZXNEaWMuTk9fUkVTVUxUX0JPWCApO1xuXHRcdHRoaXMuZW1wbG95ZWVfc2V0dGluZ19ub19yZXN1bHRfYm94Lk5vUmVzdWx0Qm94KCB7IHJlbGF0ZWRfdmlld19jb250cm9sbGVyOiB0aGlzLCBpc19uZXc6IGZhbHNlIH0gKTtcblx0XHR0aGlzLmVtcGxveWVlX3NldHRpbmdfbm9fcmVzdWx0X2JveC5hdHRyKCAnaWQnLCB0aGlzLnVpX2lkICsgJ2VtcGxveWVlX3NldHRpbmdfbm9fcmVzdWx0X2JveCcgKTtcblx0XHR2YXIgZ3JpZF9kaXYgPSB0aGlzLmVkaXRfdmlldy5maW5kKCAnLmVtcGxveWVlLXNldHRpbmctZ3JpZC1kaXYnICk7XG5cblx0XHRncmlkX2Rpdi5hcHBlbmQoIHRoaXMuZW1wbG95ZWVfc2V0dGluZ19ub19yZXN1bHRfYm94ICk7XG5cdH1cblxuXHRyZW1vdmVFbXBsb3llZVNldHRpbmdOb1Jlc3VsdENvdmVyKCkge1xuXHRcdGlmICggdGhpcy5lbXBsb3llZV9zZXR0aW5nX25vX3Jlc3VsdF9ib3ggJiYgdGhpcy5lbXBsb3llZV9zZXR0aW5nX25vX3Jlc3VsdF9ib3gubGVuZ3RoID4gMCApIHtcblx0XHRcdHRoaXMuZW1wbG95ZWVfc2V0dGluZ19ub19yZXN1bHRfYm94LnJlbW92ZSgpO1xuXHRcdH1cblx0XHR0aGlzLmVtcGxveWVlX3NldHRpbmdfbm9fcmVzdWx0X2JveCA9IG51bGw7XG5cdH1cblxuXHRzZXRFbXBsb3llZUdyaWRTaXplKCkge1xuXHRcdGlmICggIXRoaXMuZW1wbG95ZWVfc2V0dGluZ19ncmlkICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciB0YWJfZW1wbG95ZWVfc2V0dGluZyA9IHRoaXMuZWRpdF92aWV3LmZpbmQoICcjdGFiX2VtcGxveWVlX3NldHRpbmdfY29udGVudF9kaXYnICk7XG5cdFx0dGhpcy5lbXBsb3llZV9zZXR0aW5nX2dyaWQuZ3JpZC5zZXRHcmlkV2lkdGgoIHRhYl9lbXBsb3llZV9zZXR0aW5nLndpZHRoKCkgKTtcblx0XHR0aGlzLmVtcGxveWVlX3NldHRpbmdfZ3JpZC5ncmlkLnNldEdyaWRIZWlnaHQoIHRhYl9lbXBsb3llZV9zZXR0aW5nLmhlaWdodCgpICk7XG5cdH1cblxuXHRzZXRDb3VudHJ5VmlzaWJpbGl0eSgpIHtcblxuXHRcdGlmICggdGhpcy5zaG93X2MgKSB7XG5cdFx0XHR0aGlzLmF0dGFjaEVsZW1lbnQoICdjb3VudHJ5JyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdjb3VudHJ5JyApO1xuXHRcdH1cblx0fVxuXG5cdHNldFByb3ZpbmNlVmlzaWJpbGl0eSgpIHtcblx0XHRpZiAoIHRoaXMuc2hvd19wICYmIHRoaXMuZV9wcm92aW5jZV9hcnJheSAmJiB0aGlzLmVfcHJvdmluY2VfYXJyYXkubGVuZ3RoID4gMSApIHtcblx0XHRcdHRoaXMuYXR0YWNoRWxlbWVudCggJ3Byb3ZpbmNlJyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdwcm92aW5jZScgKTtcblx0XHR9XG5cdH1cblxuXHRzZXREaXN0cmljdFZpc2liaWxpdHkoKSB7XG5cblx0XHRpZiAoIHRoaXMuc2hvd19kYyAmJiB0aGlzLnByb3ZpbmNlX2Rpc3RyaWN0X2FycmF5ICYmIHRoaXMucHJvdmluY2VfZGlzdHJpY3RfYXJyYXkubGVuZ3RoID4gMCApIHtcblx0XHRcdHRoaXMuYXR0YWNoRWxlbWVudCggJ2Rpc3RyaWN0JyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdkaXN0cmljdCcgKTtcblx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5kaXN0cmljdCA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHNldER5bmFtaWNGaWVsZHMoIGNhbGxCYWNrLCBjb3VudHJ5T3JQICkge1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRpZiAoICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuY2FsY3VsYXRpb25faWQgKSB7XG5cdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuY2FsY3VsYXRpb25faWQgPSAnMTAnO1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLmNhbGN1bGF0aW9uX2lkLnNldFZhbHVlKCAxMCApO1xuXHRcdH1cblxuXHRcdHZhciBjX2lkID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmNhbGN1bGF0aW9uX2lkO1xuXG5cdFx0aWYgKCBjX2lkID09IDIwICkge1xuXHRcdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnaW5jbHVkZV9hY2NvdW50X2Ftb3VudF90eXBlX2lkJyApO1xuXHRcdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnZXhjbHVkZV9hY2NvdW50X2Ftb3VudF90eXBlX2lkJyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmF0dGFjaEVsZW1lbnQoICdpbmNsdWRlX2FjY291bnRfYW1vdW50X3R5cGVfaWQnICk7XG5cdFx0XHR0aGlzLmF0dGFjaEVsZW1lbnQoICdleGNsdWRlX2FjY291bnRfYW1vdW50X3R5cGVfaWQnICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhY291bnRyeU9yUCApIHtcblx0XHRcdHRoaXMuaGlkZUFsbER5bmFtaWNGaWVsZHMoKTtcblx0XHRcdHRoaXMuYXBpLmlzQ291bnRyeUNhbGN1bGF0aW9uSUQoIGNfaWQsIHtcblx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHRfMSApIHtcblx0XHRcdFx0XHR2YXIgcmVzX2RhdGFfMSA9IHJlc3VsdF8xLmdldFJlc3VsdCgpO1xuXG5cdFx0XHRcdFx0aWYgKCByZXNfZGF0YV8xID09PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0JHRoaXMuc2hvd19jID0gdHJ1ZTtcblx0XHRcdFx0XHRcdCR0aGlzLnNldENvdW50cnlWaXNpYmlsaXR5KCk7XG5cdFx0XHRcdFx0XHQkdGhpcy5hcGkuaXNQcm92aW5jZUNhbGN1bGF0aW9uSUQoIGNfaWQsIHtcblx0XHRcdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHRfMiApIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgcmVzX2RhdGFfMiA9IHJlc3VsdF8yLmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggcmVzX2RhdGFfMiA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLnNob3dfcCA9IHRydWU7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICggJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5jb3VudHJ5ICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5lU2V0UHJvdmluY2UoICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuY291bnRyeSApO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5hcGkuaXNEaXN0cmljdENhbGN1bGF0aW9uSUQoIGNfaWQsIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHRfMyApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgcmVzX2RhdGFfMyA9IHJlc3VsdF8zLmdldFJlc3VsdCgpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCByZXNfZGF0YV8zID09PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuc2hvd19kYyA9IHRydWU7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5jb3VudHJ5ICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5zZXREaXN0cmljdCggJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5jb3VudHJ5ICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRoYW5kbGVEeW5hbWljRmllbGRzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGhhbmRsZUR5bmFtaWNGaWVsZHMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQkdGhpcy5oaWRlQWxsRHluYW1pY0ZpZWxkcygpO1xuXHRcdFx0XHRcdFx0aGFuZGxlRHluYW1pY0ZpZWxkcygpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggIXRoaXMuc2hvd19wICkge1xuXHRcdFx0XHQkdGhpcy5oaWRlQWxsRHluYW1pY0ZpZWxkcyggdHJ1ZSwgZmFsc2UgKTtcblx0XHRcdFx0aGFuZGxlRHluYW1pY0ZpZWxkcygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JHRoaXMuaGlkZUFsbER5bmFtaWNGaWVsZHMoIHRydWUsIHRydWUgKTtcblx0XHRcdFx0aGFuZGxlRHluYW1pY0ZpZWxkcygpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGhhbmRsZUR5bmFtaWNGaWVsZHMoKSB7XG5cdFx0XHRpZiAoICEkdGhpcy5lZGl0X3ZpZXcgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmNhbGN1bGF0aW9uX2lkID09ICcxMDAnIHx8ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuY2FsY3VsYXRpb25faWQgPT0gJzIwMCcgfHwgJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5jYWxjdWxhdGlvbl9pZCA9PSAnMzAwJyApIHtcblx0XHRcdFx0JHRoaXMuYXR0YWNoRWxlbWVudCggJ2RmXzE1JyApO1xuXHRcdFx0XHQkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpYy5kZl8xNS5maW5kKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tbGFiZWwnICkudGV4dCggJC5pMThuLl8oICdGb3JtdWxhIFR5cGUnICkgKTtcblx0XHRcdFx0JHRoaXMuZWRpdF92aWV3X3VpX2RpYy5kZl8xNS5zZXRGaWVsZCggJ2NvbXBhbnlfdmFsdWUxJyApO1xuXHRcdFx0XHQkdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmRmXzE1LnNldFZhbHVlKCAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmNvbXBhbnlfdmFsdWUxICk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5jYWxjdWxhdGlvbl9pZCA9PSAnNjknICYmIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID09IDEwICkge1xuXHRcdFx0XHQkdGhpcy5hdHRhY2hFbGVtZW50KCAnZGZfMTAwJyApO1xuXHRcdFx0XHQkdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmRmXzEwMC5odG1sKCBHbG9iYWwuZ2V0VXBncmFkZU1lc3NhZ2UoKSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JHRoaXMuYXBpLmdldE9wdGlvbnMoICdjYWxjdWxhdGlvbl90eXBlX2NvbHVtbl9tZXRhX2RhdGEnLCB7XG5cdFx0XHRcdFx0J2NhbGN1bGF0aW9uX2lkJzogJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5jYWxjdWxhdGlvbl9pZCxcblx0XHRcdFx0XHQnY291bnRyeSc6ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuY291bnRyeSxcblx0XHRcdFx0XHQncHJvdmluY2UnOiAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnByb3ZpbmNlLFxuXG5cdFx0XHRcdH0sIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdHJlc3VsdCA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGtleSBpbiByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHRcdGxldCBtZXRhX2RhdGEgPSByZXN1bHRba2V5XTtcblx0XHRcdFx0XHRcdFx0bGV0IGR5bmFtaWNfZmllbGRfaWQgPSBtZXRhX2RhdGFbJ2R5bmFtaWNfZmllbGRfaWQnXTtcblxuXHRcdFx0XHRcdFx0XHQkdGhpcy5hdHRhY2hFbGVtZW50KCBkeW5hbWljX2ZpZWxkX2lkICk7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljW2R5bmFtaWNfZmllbGRfaWRdLmZpbmQoICcuZWRpdC12aWV3LWZvcm0taXRlbS1sYWJlbCcgKS50ZXh0KCBtZXRhX2RhdGEubmFtZS5yZXBsYWNlKCc8YnI+JywgJyAnKSApO1xuXHRcdFx0XHRcdFx0XHRpZiAoIG1ldGFfZGF0YS50eXBlX2lkID09IDIxMDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMuZWRpdF92aWV3X3VpX2RpY1tkeW5hbWljX2ZpZWxkX2lkXS5zZXRTb3VyY2VEYXRhKCBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggbWV0YV9kYXRhLm11bHRpX3NlbGVjdF9pdGVtcyApICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0JHRoaXMuZWRpdF92aWV3X3VpX2RpY1tkeW5hbWljX2ZpZWxkX2lkXS5zZXRGaWVsZCgga2V5ICk7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmVkaXRfdmlld191aV9kaWNbZHluYW1pY19maWVsZF9pZF0uc2V0VmFsdWUoICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuY2FsY3VsYXRpb25faWQgPT0gJzY5JyApIHsgLy82OT1DdXN0b20gRm9ybXVsYS5cblx0XHRcdFx0XHRcdFx0JHRoaXMuYXR0YWNoRWxlbWVudCggJ2RmXzExJyApO1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpYy5kZl8xMS5maW5kKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tbGFiZWwnICkudGV4dCggJC5pMThuLl8oICdGb3JtdWxhJyApICk7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmVkaXRfdmlld191aV9kaWMuZGZfMTEuc2V0RmllbGQoICdjb21wYW55X3ZhbHVlMScgKTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuZWRpdF92aWV3X3VpX2RpYy5kZl8xMS5zZXRWYWx1ZSggJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5jb21wYW55X3ZhbHVlMSApO1xuXG5cdFx0XHRcdFx0XHRcdCR0aGlzLmF0dGFjaEVsZW1lbnQoICdkZl8xMicgKTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWMuZGZfMTIuZmluZCggJy5lZGl0LXZpZXctZm9ybS1pdGVtLWxhYmVsJyApLnRleHQoICQuaTE4bi5fKCAnTG9vayBCYWNrIFBlcmlvZCcgKSApO1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmRmXzEyLnNldEZpZWxkKCAnY29tcGFueV92YWx1ZTInICk7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmVkaXRfdmlld191aV9kaWMuZGZfMTIuc2V0VmFsdWUoICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuY29tcGFueV92YWx1ZTIgKTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuZWRpdF92aWV3X3VpX2RpYy5kZl8xMy5zZXRGaWVsZCggJ2NvbXBhbnlfdmFsdWUzJyApO1xuXHRcdFx0XHRcdFx0XHQkdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmRmXzEzLnNldFZhbHVlKCAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmNvbXBhbnlfdmFsdWUzICk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdCR0aGlzLmVkaXRGaWVsZFJlc2l6ZSggJHRoaXMuZ2V0RWRpdFZpZXdUYWJJbmRleCgpICk7XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxCYWNrICkge1xuXHRcdFx0XHRcdFx0XHRjYWxsQmFjaygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vV2hlbiBpdHMgYSAyMDIwIG9yIGxhdGVyIEZvcm0gVzQsIHRyeSB0byBkaXNhYmxlIHRoZSBBbGxvd2FuY2UgZmllbGQgYXMgaXRzIG5vdCBvbiB0aGUgZm9ybS5cblx0Ly8gIFRoaXMgaXMgbW9zdCBpbXBvcnRhbnQgd2hlbiB1c2luZyB0aGUgRW1wbG95ZWUgU2V0dGluZ3MgdGFiIHRob3VnaC5cblx0b25Gb3JtVzRWZXJzaW9uQ2hhbmdlKCkge1xuXHRcdGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmNhbGN1bGF0aW9uX2lkID09IDEwMCAmJiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuY291bnRyeSA9PSAnVVMnICkge1xuXHRcdFx0Ly8gaWYgKCB0aGlzLmVkaXRfdmlld191aV9kaWMuZGZfMjAuZ2V0VmFsdWUoKSA9PSAyMDIwICkge1xuXHRcdFx0Ly8gXHR0aGlzLmVkaXRfdmlld191aV9kaWMuZGZfMS5zZXRFbmFibGVkKCBmYWxzZSApO1xuXHRcdFx0Ly8gXHR0aGlzLmVkaXRfdmlld191aV9kaWMuZGZfMjEuc2V0RW5hYmxlZCggdHJ1ZSApO1xuXHRcdFx0Ly8gXHR0aGlzLmVkaXRfdmlld191aV9kaWMuZGZfMjIuc2V0RW5hYmxlZCggdHJ1ZSApO1xuXHRcdFx0Ly8gXHR0aGlzLmVkaXRfdmlld191aV9kaWMuZGZfMjMuc2V0RW5hYmxlZCggdHJ1ZSApO1xuXHRcdFx0Ly8gXHR0aGlzLmVkaXRfdmlld191aV9kaWMuZGZfMjQuc2V0RW5hYmxlZCggdHJ1ZSApO1xuXHRcdFx0Ly8gXHR0aGlzLmVkaXRfdmlld191aV9kaWMuZGZfMjUuc2V0RW5hYmxlZCggdHJ1ZSApO1xuXHRcdFx0Ly8gfSBlbHNlIHtcblx0XHRcdC8vIFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLmRmXzEuc2V0RW5hYmxlZCggdHJ1ZSApO1xuXHRcdFx0Ly8gXHR0aGlzLmVkaXRfdmlld191aV9kaWMuZGZfMjEuc2V0RW5hYmxlZCggZmFsc2UgKTtcblx0XHRcdC8vIFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLmRmXzIyLnNldEVuYWJsZWQoIGZhbHNlICk7XG5cdFx0XHQvLyBcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy5kZl8yMy5zZXRFbmFibGVkKCBmYWxzZSApO1xuXHRcdFx0Ly8gXHR0aGlzLmVkaXRfdmlld191aV9kaWMuZGZfMjQuc2V0RW5hYmxlZCggZmFsc2UgKTtcblx0XHRcdC8vIFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLmRmXzI1LnNldEVuYWJsZWQoIGZhbHNlICk7XG5cdFx0XHQvLyB9XG5cdFx0fVxuXHR9XG5cblx0b25BcHBseUZyZXF1ZW5jeUNoYW5nZSgpIHtcblx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ2FwcGx5X2ZyZXF1ZW5jeV9kYXlfb2ZfbW9udGgxJ10ucGFyZW50KCkucGFyZW50KCkuY3NzKCAnZGlzcGxheScsICdub25lJyApOyAvL1NwZWNpYWwgZmllbGRzIGZvciBTZW1pLU1vbnRobHlcblx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ2FwcGx5X2ZyZXF1ZW5jeV9kYXlfb2ZfbW9udGgyJ10ucGFyZW50KCkucGFyZW50KCkuY3NzKCAnZGlzcGxheScsICdub25lJyApOyAvL1NwZWNpYWwgZmllbGRzIGZvciBTZW1pLU1vbnRobHlcblxuXHRcdGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmFwcGx5X2ZyZXF1ZW5jeV9pZCA9PSAxMCB8fFxuXHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmFwcGx5X2ZyZXF1ZW5jeV9pZCA9PSAxMDAgfHxcblx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5hcHBseV9mcmVxdWVuY3lfaWQgPT0gMTEwIHx8XG5cdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuYXBwbHlfZnJlcXVlbmN5X2lkID09IDEyMCB8fFxuXHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmFwcGx5X2ZyZXF1ZW5jeV9pZCA9PSAxMzAgKSB7XG5cblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snYXBwbHlfZnJlcXVlbmN5X21vbnRoJ10ucGFyZW50KCkucGFyZW50KCkuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydhcHBseV9mcmVxdWVuY3lfZGF5X29mX21vbnRoJ10ucGFyZW50KCkucGFyZW50KCkuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydhcHBseV9mcmVxdWVuY3lfcXVhcnRlcl9tb250aCddLnBhcmVudCgpLnBhcmVudCgpLmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHR9IGVsc2UgaWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuYXBwbHlfZnJlcXVlbmN5X2lkID09IDIwICkge1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydhcHBseV9mcmVxdWVuY3lfbW9udGgnXS5wYXJlbnQoKS5wYXJlbnQoKS5jc3MoICdkaXNwbGF5JywgJ2Jsb2NrJyApO1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydhcHBseV9mcmVxdWVuY3lfZGF5X29mX21vbnRoJ10ucGFyZW50KCkucGFyZW50KCkuY3NzKCAnZGlzcGxheScsICdibG9jaycgKTtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snYXBwbHlfZnJlcXVlbmN5X3F1YXJ0ZXJfbW9udGgnXS5wYXJlbnQoKS5wYXJlbnQoKS5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0fSBlbHNlIGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmFwcGx5X2ZyZXF1ZW5jeV9pZCA9PSAyNSApIHtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snYXBwbHlfZnJlcXVlbmN5X21vbnRoJ10ucGFyZW50KCkucGFyZW50KCkuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydhcHBseV9mcmVxdWVuY3lfZGF5X29mX21vbnRoJ10ucGFyZW50KCkucGFyZW50KCkuY3NzKCAnZGlzcGxheScsICdibG9jaycgKTtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snYXBwbHlfZnJlcXVlbmN5X3F1YXJ0ZXJfbW9udGgnXS5wYXJlbnQoKS5wYXJlbnQoKS5jc3MoICdkaXNwbGF5JywgJ2Jsb2NrJyApO1xuXHRcdH0gZWxzZSBpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5hcHBseV9mcmVxdWVuY3lfaWQgPT0gMzAgKSB7XG5cdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ2FwcGx5X2ZyZXF1ZW5jeV9tb250aCddLnBhcmVudCgpLnBhcmVudCgpLmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snYXBwbHlfZnJlcXVlbmN5X2RheV9vZl9tb250aCddLnBhcmVudCgpLnBhcmVudCgpLmNzcyggJ2Rpc3BsYXknLCAnYmxvY2snICk7XG5cdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ2FwcGx5X2ZyZXF1ZW5jeV9xdWFydGVyX21vbnRoJ10ucGFyZW50KCkucGFyZW50KCkuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdH0gZWxzZSBpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5hcHBseV9mcmVxdWVuY3lfaWQgPT0gMzUgKSB7XG5cdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ2FwcGx5X2ZyZXF1ZW5jeV9kYXlfb2ZfbW9udGgxJ10ucGFyZW50KCkucGFyZW50KCkuY3NzKCAnZGlzcGxheScsICdibG9jaycgKTsgLy9TcGVjaWFsIGZpZWxkcyBmb3IgU2VtaS1Nb250aGx5XG5cdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ2FwcGx5X2ZyZXF1ZW5jeV9kYXlfb2ZfbW9udGgyJ10ucGFyZW50KCkucGFyZW50KCkuY3NzKCAnZGlzcGxheScsICdibG9jaycgKTsgLy9TcGVjaWFsIGZpZWxkcyBmb3IgU2VtaS1Nb250aGx5XG5cblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snYXBwbHlfZnJlcXVlbmN5X21vbnRoJ10ucGFyZW50KCkucGFyZW50KCkuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydhcHBseV9mcmVxdWVuY3lfZGF5X29mX21vbnRoJ10ucGFyZW50KCkucGFyZW50KCkuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydhcHBseV9mcmVxdWVuY3lfcXVhcnRlcl9tb250aCddLnBhcmVudCgpLnBhcmVudCgpLmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHR9XG5cblx0XHR0aGlzLmVkaXRGaWVsZFJlc2l6ZSgpO1xuXHR9XG5cblx0b25DYWxjdWxhdGlvbkNoYW5nZSgpIHtcblx0fVxuXG5cdGJ1aWxkRWRpdFZpZXdVSSgpIHtcblx0XHRUVFByb21pc2UuYWRkKCAnQ29tcGFueVRheERlZHVjdGlvbicsICdidWlsZEVkaXRWaWV3VUknICk7XG5cblx0XHRzdXBlci5idWlsZEVkaXRWaWV3VUkoKTtcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHR2YXIgdGFiX21vZGVsID0ge1xuXHRcdFx0J3RhYl90YXhfZGVkdWN0aW9ucyc6IHtcblx0XHRcdFx0J2xhYmVsJzogJC5pMThuLl8oICdUYXggLyBEZWR1Y3Rpb25zJyApXG5cdFx0XHR9LFxuXHRcdFx0J3RhYl9lbGlnaWJpbGl0eSc6IHsgJ2xhYmVsJzogJC5pMThuLl8oICdFbGlnaWJpbGl0eScgKSB9LFxuXHRcdFx0J3RhYl9lbXBsb3llZV9zZXR0aW5nJzoge1xuXHRcdFx0XHQnbGFiZWwnOiAkLmkxOG4uXyggJ0VtcGxveWVlIFNldHRpbmdzJyApLFxuXHRcdFx0XHQnaW5pdF9jYWxsYmFjayc6ICdpbml0RW1wbG95ZWVTZXR0aW5nJyxcblx0XHRcdFx0J2Rpc3BsYXlfb25fbWFzc19lZGl0JzogZmFsc2UsXG5cdFx0XHRcdCdodG1sX3RlbXBsYXRlJzogdGhpcy5nZXRDb21wYW55VGF4RGVkdWN0aW9uRW1wbG95ZWVTZXR0aW5nVGFiSHRtbCgpXG5cdFx0XHR9LCAvL0NhbGxiYWNrIHdhczogc2V0RW1wbG95ZWVHcmlkU2l6ZVxuXHRcdFx0J3RhYjUnOiB7XG5cdFx0XHRcdCdsYWJlbCc6ICQuaTE4bi5fKCAnVGF4IC8gRGVkdWN0aW9ucycgKSxcblx0XHRcdFx0J2Rpc3BsYXlfb25fbWFzc19lZGl0JzogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHQndGFiX2F0dGFjaG1lbnQnOiB0cnVlLFxuXHRcdFx0J3RhYl9hdWRpdCc6IHRydWUsXG5cdFx0fTtcblx0XHR0aGlzLnNldFRhYk1vZGVsKCB0YWJfbW9kZWwgKTtcblxuXHRcdHRoaXMuZWRpdF92aWV3LmNoaWxkcmVuKCkuZXEoIDAgKS5jc3MoICdtaW4td2lkdGgnLCAxMTcwICk7XG5cblx0XHR0aGlzLm5hdmlnYXRpb24uQUNvbWJvQm94KCB7XG5cdFx0XHRpZDogdGhpcy5zY3JpcHRfbmFtZSArICdfbmF2aWdhdGlvbicsXG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSUNvbXBhbnlEZWR1Y3Rpb24sXG5cdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfZGVkdWN0aW9uJyxcblx0XHRcdG5hdmlnYXRpb25fbW9kZTogdHJ1ZSxcblx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZVxuXHRcdH0gKTtcblxuXHRcdHRoaXMuc2V0TmF2aWdhdGlvbigpO1xuXG5cdFx0Ly9UYWIgMCBzdGFydFxuXG5cdFx0dmFyIHRhYl90YXhfZGVkdWN0aW9ucyA9IHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYl90YXhfZGVkdWN0aW9ucycgKTtcblxuXHRcdHZhciB0YWJfdGF4X2RlZHVjdGlvbnNfY29sdW1uMSA9IHRhYl90YXhfZGVkdWN0aW9ucy5maW5kKCAnLmZpcnN0LWNvbHVtbicgKTtcblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzBdID0gW107XG5cblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzBdLnB1c2goIHRhYl90YXhfZGVkdWN0aW9uc19jb2x1bW4xICk7XG5cblx0XHR2YXIgZm9ybV9pdGVtX2lucHV0O1xuXHRcdHZhciB3aWRnZXRDb250YWluZXI7XG5cdFx0dmFyIGxhYmVsO1xuXG5cdFx0Ly8gU3RhdHVzXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblxuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdzdGF0dXNfaWQnLCBzZXRfZW1wdHk6IGZhbHNlIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMuc3RhdHVzX2FycmF5ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdTdGF0dXMnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEsICcnICk7XG5cblx0XHQvLyBUeXBlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblxuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICd0eXBlX2lkJywgc2V0X2VtcHR5OiBmYWxzZSB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLnR5cGVfYXJyYXkgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1R5cGUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEgKTtcblxuXHRcdC8vTGVnYWwgZW50aXR5XG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2xlZ2FsX2VudGl0eV9pZCcgfSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJTGVnYWxFbnRpdHksXG5cdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfbGVnYWxfZW50aXR5Jyxcblx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogZmFsc2UsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRmaWVsZDogJ2xlZ2FsX2VudGl0eV9pZCdcblx0XHR9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdMZWdhbCBFbnRpdHknICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEgKTtcblxuXHRcdC8vUGF5cm9sbCBSZW1pdHRhbmNlIEFnZW5jeVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVBheXJvbGxSZW1pdHRhbmNlQWdlbmN5LFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3BheXJvbGxfcmVtaXR0YW5jZV9hZ2VuY3knLFxuXHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0ZmllbGQ6ICdwYXlyb2xsX3JlbWl0dGFuY2VfYWdlbmN5X2lkJ1xuXHRcdH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1JlbWl0dGFuY2UgQWdlbmN5JyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl90YXhfZGVkdWN0aW9uc19jb2x1bW4xICk7XG5cblx0XHQvL05hbWVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ25hbWUnLCB3aWR0aDogJzEwMCUnIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ05hbWUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEgKTtcblxuXHRcdGZvcm1faXRlbV9pbnB1dC5wYXJlbnQoKS53aWR0aCggJzQ1JScgKTtcblxuXHRcdC8vIERlc2NyaXB0aW9uXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0FSRUEgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRBcmVhKCB7IGZpZWxkOiAnZGVzY3JpcHRpb24nLCB3aWR0aDogJzEwMCUnIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0Rlc2NyaXB0aW9uJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl90YXhfZGVkdWN0aW9uc19jb2x1bW4xLCAnJywgbnVsbCwgbnVsbCwgdHJ1ZSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5wYXJlbnQoKS53aWR0aCggJzQ1JScgKTtcblxuXHRcdC8vUGF5IFN0dWIgTm90ZSAoUHVibGljKVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAncGF5X3N0dWJfZW50cnlfZGVzY3JpcHRpb24nLCB3aWR0aDogMzAwIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1BheSBTdHViIE5vdGUgKFB1YmxpYyknICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEgKTtcblxuXHRcdC8vQ2FsY3VsYXRpb24gU2V0dGluZ3MgbGFiZWxcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlNFUEFSQVRFRF9CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuU2VwYXJhdGVkQm94KCB7IGxhYmVsOiAkLmkxOG4uXyggJ0NhbGN1bGF0aW9uIFNldHRpbmdzJyApIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCBudWxsLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl90YXhfZGVkdWN0aW9uc19jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSwgZmFsc2UsICdzZXBhcmF0ZWRfMicgKTtcblxuXHRcdC8vQ2FsY3VsYXRpb25cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdjYWxjdWxhdGlvbl9pZCcsIHNldF9lbXB0eTogZmFsc2UsIHdpZHRoOiA0MDAgfSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5zZXRTb3VyY2VEYXRhKCAkdGhpcy5jYWxjdWxhdGlvbl9hcnJheSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQ2FsY3VsYXRpb24nICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHQvLyBEeW5hbWljIEZpZWxkIDE1XG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVENvbWJvQm94KCB7IGZpZWxkOiAnZGZfMTUnLCBzZXRfZW1wdHk6IGZhbHNlIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMudGF4X2Zvcm11bGFfdHlwZV9hcnJheSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICdkZl8xNScsIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHQvLyBDb3VudHJ5XG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVENvbWJvQm94KCB7IGZpZWxkOiAnY291bnRyeScsIHNldF9lbXB0eTogdHJ1ZSB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLmNvdW50cnlfYXJyYXkgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0NvdW50cnknICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHQvLyBQcm92aW5jZVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ3Byb3ZpbmNlJyB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoIFtdICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQcm92aW5jZS9TdGF0ZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfdGF4X2RlZHVjdGlvbnNfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vIERpc3RyaWN0XG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVENvbWJvQm94KCB7IGZpZWxkOiAnZGlzdHJpY3QnLCBzZXRfZW1wdHk6IGZhbHNlIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggW10gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0Rpc3RyaWN0JyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl90YXhfZGVkdWN0aW9uc19jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0Ly8gRHluYW1pYyBGaWVsZCAwXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdkZl8wJyB9ICk7XG5cdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblx0XHRsYWJlbCA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtcmlnaHQtbGFiZWxcXCc+ICU8L3NwYW4+JyApO1xuXG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggbGFiZWwgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAnZGZfMCcsIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIsIHRydWUgKTtcblxuXHRcdC8vRHluYW1pYyBGaWVsZCAyMCAtLSBGb3JtIFctNCBWZXJzaW9uIChTaG91bGQgZ28gYWJvdmUgRmlsaW5nIFN0YXR1cylcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdkZl8yMCcsIHNldF9lbXB0eTogZmFsc2UgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICdkZl8yMCcsIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHQvL0R5bmFtaWMgRmllbGQgMTQgLS0gRmlsaW5nIFN0YXR1c1xuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ2RmXzE0Jywgc2V0X2VtcHR5OiBmYWxzZSB9ICk7IC8vRG9uJ3Qgc2hvdyBlbXB0eSB2YWx1ZSAoTk9ORSksIHNvIGEgZmlsaW5nIHN0YXR1cyB3aWxsIGFsd2F5cyBzZWxlY3RlZC5cblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAnZGZfMTQnLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl90YXhfZGVkdWN0aW9uc19jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0Ly8gIER5bmFtaWMgRmllbGQgMVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnZGZfMScgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICdkZl8xJywgZm9ybV9pdGVtX2lucHV0LCB0YWJfdGF4X2RlZHVjdGlvbnNfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vICBEeW5hbWljIEZpZWxkIDJcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2RmXzInIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAnZGZfMicsIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHQvLyAgRHluYW1pYyBGaWVsZCAzXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdkZl8zJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJ2RmXzMnLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl90YXhfZGVkdWN0aW9uc19jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0Ly8gIER5bmFtaWMgRmllbGQgNFxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnZGZfNCcgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICdkZl80JywgZm9ybV9pdGVtX2lucHV0LCB0YWJfdGF4X2RlZHVjdGlvbnNfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vICBEeW5hbWljIEZpZWxkIDVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2RmXzUnIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAnZGZfNScsIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHQvLyAgRHluYW1pYyBGaWVsZCA2XG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdkZl82JyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJ2RmXzYnLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl90YXhfZGVkdWN0aW9uc19jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0Ly8gIER5bmFtaWMgRmllbGQgN1xuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnZGZfNycgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICdkZl83JywgZm9ybV9pdGVtX2lucHV0LCB0YWJfdGF4X2RlZHVjdGlvbnNfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vICBEeW5hbWljIEZpZWxkIDhcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2RmXzgnIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAnZGZfOCcsIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHQvLyAgRHluYW1pYyBGaWVsZCA5XG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdkZl85JyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJ2RmXzknLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl90YXhfZGVkdWN0aW9uc19jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0Ly8gIER5bmFtaWMgRmllbGQgMTBcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2RmXzEwJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJ2RmXzEwJywgZm9ybV9pdGVtX2lucHV0LCB0YWJfdGF4X2RlZHVjdGlvbnNfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSApICkge1xuXHRcdFx0VFRQcm9taXNlLmFkZCggJ0NvbXBhbnlUYXhEZWR1Y3Rpb24nLCAnZGZfMTEnICk7XG5cdFx0XHRHbG9iYWwubG9hZFNjcmlwdCggJ2dsb2JhbC93aWRnZXRzL2Zvcm11bGFfYnVpbGRlci9Gb3JtdWxhQnVpbGRlci5qcycsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQvLyBEeW5hbWljIEZpZWxkIDExXG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuRk9STVVMQV9CVUlMREVSICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5Gb3JtdWxhQnVpbGRlcigge1xuXHRcdFx0XHRcdGZpZWxkOiAnZGZfMTEnLCB3aWR0aDogJzEwMCUnLCBvbkZvcm11bGFCdG5DbGljazogZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHRcdHZhciBjdXN0b21fY29sdW1uX2FwaSA9IFRUQVBJLkFQSVJlcG9ydEN1c3RvbUNvbHVtbjtcblxuXHRcdFx0XHRcdFx0Y3VzdG9tX2NvbHVtbl9hcGkuZ2V0T3B0aW9ucyggJ2Zvcm11bGFfZnVuY3Rpb25zJywge1xuXHRcdFx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIGZ1bl9yZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIGZ1bl9yZXNfZGF0YSA9IGZ1bl9yZXN1bHQuZ2V0UmVzdWx0KCk7XG5cblx0XHRcdFx0XHRcdFx0XHQkdGhpcy5hcGkuZ2V0T3B0aW9ucyggJ2Zvcm11bGFfdmFyaWFibGVzJywgeyBvblJlc3VsdDogb25Db2x1bW5zUmVzdWx0IH0gKTtcblxuXHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uIG9uQ29sdW1uc1Jlc3VsdCggY29sX3Jlc3VsdCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHZhciBjb2xfcmVzX2RhdGEgPSBjb2xfcmVzdWx0LmdldFJlc3VsdCgpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgZGVmYXVsdF9hcmdzID0ge307XG5cdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0X2FyZ3MuZnVuY3Rpb25zID0gR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIGZ1bl9yZXNfZGF0YSApO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdF9hcmdzLnZhcmlhYmxlcyA9IEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCBjb2xfcmVzX2RhdGEgKTtcblx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRfYXJncy5mb3JtdWxhID0gJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5jb21wYW55X3ZhbHVlMTtcblx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRfYXJncy5jdXJyZW50X2VkaXRfcmVjb3JkID0gR2xvYmFsLmNsb25lKCAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0X2FyZ3MuYXBpID0gJHRoaXMuYXBpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRJbmRleFZpZXdDb250cm9sbGVyLm9wZW5XaXphcmQoICdGb3JtdWxhQnVpbGRlcldpemFyZCcsIGRlZmF1bHRfYXJncywgZnVuY3Rpb24oIHZhbCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5jb21wYW55X3ZhbHVlMSA9IHZhbDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuZWRpdF92aWV3X3VpX2RpYy5kZl8xMS5zZXRWYWx1ZSggdmFsICk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQkdGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJ2RmXzExJywgZm9ybV9pdGVtX2lucHV0LCB0YWJfdGF4X2RlZHVjdGlvbnNfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblx0XHRcdFx0JHRoaXMuZGV0YWNoRWxlbWVudCggJ2RmXzExJyApO1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQucGFyZW50KCkud2lkdGgoICc0NSUnICk7XG5cdFx0XHRcdFRUUHJvbWlzZS5yZXNvbHZlKCAnQ29tcGFueVRheERlZHVjdGlvbicsICdkZl8xMScgKTtcblx0XHRcdH0gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0FSRUEgKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnZGZfMTEnIH0gKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICdkZl8xMScsIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAnZGZfMTAwJyB9ICk7XG5cdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAnV2FybmluZycsIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlICk7XG5cdFx0fVxuXG5cdFx0Ly9EeW5hbWljIEZpZWxkIDEyLDEzXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdkZl8xMicsIHdpZHRoOiAzMCB9ICk7XG5cdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblx0XHRsYWJlbCA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtcmlnaHQtbGFiZWxcXCc+ICcgKyAnICcgKyAnIDwvc3Bhbj4nICk7XG5cblx0XHR2YXIgd2lkZ2V0X2NvbWJvX2JveCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0d2lkZ2V0X2NvbWJvX2JveC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdkZl8xMycgfSApO1xuXHRcdHdpZGdldF9jb21ib19ib3guc2V0U291cmNlRGF0YSggJHRoaXMubG9va19iYWNrX3VuaXRfYXJyYXkgKTtcblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBsYWJlbCApO1xuXHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIHdpZGdldF9jb21ib19ib3ggKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAnZGZfMTInLCBbZm9ybV9pdGVtX2lucHV0LCB3aWRnZXRfY29tYm9fYm94XSwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIsIHRydWUgKTtcblxuXHRcdC8vRHluYW1pYyBGaWVsZCAyMSAtLSBNdWx0aXBsZSBKb2JzIG9yIFNwb3VzZSBXb3Jrc1xuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ2RmXzIxJywgc2V0X2VtcHR5OiBmYWxzZSB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJ2RmXzIxJywgZm9ybV9pdGVtX2lucHV0LCB0YWJfdGF4X2RlZHVjdGlvbnNfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vICBEeW5hbWljIEZpZWxkIDIyXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdkZl8yMicgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICdkZl8yMicsIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHQvLyAgRHluYW1pYyBGaWVsZCAyM1xuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnZGZfMjMnIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAnZGZfMjMnLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl90YXhfZGVkdWN0aW9uc19jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0Ly8gIER5bmFtaWMgRmllbGQgMjRcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2RmXzI0JyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJ2RmXzI0JywgZm9ybV9pdGVtX2lucHV0LCB0YWJfdGF4X2RlZHVjdGlvbnNfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vICBEeW5hbWljIEZpZWxkIDI1XG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdkZl8yNScgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICdkZl8yNScsIGZvcm1faXRlbV9pbnB1dCwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHRpZiAoICF0aGlzLnN1Yl92aWV3X21vZGUgKSB7XG5cdFx0XHQvL1BheSBTdHViIEFjY291bnRcblxuXHRcdFx0dmFyIGRlZmF1bHRfYXJncyA9IHt9O1xuXHRcdFx0ZGVmYXVsdF9hcmdzLmZpbHRlcl9kYXRhID0ge307XG5cdFx0XHRkZWZhdWx0X2FyZ3MuZmlsdGVyX2RhdGEudHlwZV9pZCA9IFsxMCwgMjAsIDMwLCA1MCwgODBdO1xuXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJUGF5U3R1YkVudHJ5QWNjb3VudCxcblx0XHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfUGF5U3R1YkFjY291bnQnLFxuXHRcdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdFx0ZmllbGQ6ICdwYXlfc3R1Yl9lbnRyeV9hY2NvdW50X2lkJ1xuXG5cdFx0XHR9ICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0RGVmYXVsdEFyZ3MoIGRlZmF1bHRfYXJncyApO1xuXHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQYXkgU3R1YiBBY2NvdW50JyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl90YXhfZGVkdWN0aW9uc19jb2x1bW4xICk7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsY3VsYXRpb24gT3JkZXJcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2NhbGN1bGF0aW9uX29yZGVyJywgd2lkdGg6IDMwIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0NhbGN1bGF0aW9uIE9yZGVyJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl90YXhfZGVkdWN0aW9uc19jb2x1bW4xICk7XG5cblx0XHQvLyBJbmNsdWRlIFBheSBTdHViIEFjY291bnRzXG5cdFx0dmFyIHZfYm94ID0gJCggJzxkaXYgY2xhc3M9XFwndi1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVENvbWJvQm94KCB7IGZpZWxkOiAnaW5jbHVkZV9hY2NvdW50X2Ftb3VudF90eXBlX2lkJywgc2V0X2VtcHR5OiBmYWxzZSB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLmFjY291bnRfYW1vdW50X3R5cGVfYXJyYXkgKTtcblxuXHRcdHZhciBmb3JtX2l0ZW0gPSB0aGlzLnB1dElucHV0VG9JbnNpZGVGb3JtSXRlbSggZm9ybV9pdGVtX2lucHV0LCAkLmkxOG4uXyggJ1BheSBTdHViIEFjY291bnQgVmFsdWUnICkgKTtcblxuXHRcdHZfYm94LmFwcGVuZCggZm9ybV9pdGVtICk7XG5cdFx0dl9ib3guYXBwZW5kKCAnPGRpdiBjbGFzcz1cXCdjbGVhci1ib3RoLWRpdlxcJz48L2Rpdj4nICk7XG5cblx0XHRpZiAoICF0aGlzLnN1Yl92aWV3X21vZGUgKSB7XG5cdFx0XHR2YXIgZm9ybV9pdGVtX2lucHV0XzEgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRcdGZvcm1faXRlbV9pbnB1dF8xLkFDb21ib0JveCgge1xuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVBheVN0dWJFbnRyeUFjY291bnQsXG5cdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogdHJ1ZSxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfUGF5U3R1YkFjY291bnQnLFxuXHRcdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdFx0ZmllbGQ6ICdpbmNsdWRlX3BheV9zdHViX2VudHJ5X2FjY291bnQnXG5cdFx0XHR9ICk7XG5cdFx0XHRmb3JtX2l0ZW0gPSB0aGlzLnB1dElucHV0VG9JbnNpZGVGb3JtSXRlbSggZm9ybV9pdGVtX2lucHV0XzEsICQuaTE4bi5fKCAnU2VsZWN0aW9uJyApICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoIGZvcm1faXRlbSApO1xuXHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdJbmNsdWRlIFBheSBTdHViIEFjY291bnRzJyApLCBbZm9ybV9pdGVtX2lucHV0LCBmb3JtX2l0ZW1faW5wdXRfMV0sIHRhYl90YXhfZGVkdWN0aW9uc19jb2x1bW4xLCBudWxsLCB2X2JveCwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gRXhjbHVkZSBQYXkgU3R1YiBBY2NvdW50c1xuXHRcdHZfYm94ID0gJCggJzxkaXYgY2xhc3M9XFwndi1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVENvbWJvQm94KCB7IGZpZWxkOiAnZXhjbHVkZV9hY2NvdW50X2Ftb3VudF90eXBlX2lkJywgc2V0X2VtcHR5OiBmYWxzZSB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLmFjY291bnRfYW1vdW50X3R5cGVfYXJyYXkgKTtcblxuXHRcdGZvcm1faXRlbSA9IHRoaXMucHV0SW5wdXRUb0luc2lkZUZvcm1JdGVtKCBmb3JtX2l0ZW1faW5wdXQsICQuaTE4bi5fKCAnUGF5IFN0dWIgQWNjb3VudCBWYWx1ZScgKSApO1xuXG5cdFx0dl9ib3guYXBwZW5kKCBmb3JtX2l0ZW0gKTtcblx0XHR2X2JveC5hcHBlbmQoICc8ZGl2IGNsYXNzPVxcJ2NsZWFyLWJvdGgtZGl2XFwnPjwvZGl2PicgKTtcblx0XHRpZiAoICF0aGlzLnN1Yl92aWV3X21vZGUgKSB7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXRfMSA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dF8xLkFDb21ib0JveCgge1xuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVBheVN0dWJFbnRyeUFjY291bnQsXG5cdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogdHJ1ZSxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfUGF5U3R1YkFjY291bnQnLFxuXHRcdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdFx0ZmllbGQ6ICdleGNsdWRlX3BheV9zdHViX2VudHJ5X2FjY291bnQnXG5cdFx0XHR9ICk7XG5cblx0XHRcdGZvcm1faXRlbSA9IHRoaXMucHV0SW5wdXRUb0luc2lkZUZvcm1JdGVtKCBmb3JtX2l0ZW1faW5wdXRfMSwgJC5pMThuLl8oICdTZWxlY3Rpb24nICkgKTtcblx0XHRcdHZfYm94LmFwcGVuZCggZm9ybV9pdGVtICk7XG5cdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0V4Y2x1ZGUgUGF5IFN0dWIgQWNjb3VudHMnICksIFtmb3JtX2l0ZW1faW5wdXQsIGZvcm1faXRlbV9pbnB1dF8xXSwgdGFiX3RheF9kZWR1Y3Rpb25zX2NvbHVtbjEsIG51bGwsIHZfYm94LCB0cnVlLCB0cnVlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhdGhpcy5zdWJfdmlld19tb2RlICkge1xuXHRcdFx0Ly8gZW1wbG95ZWVzXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJVXNlcixcblx0XHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiB0cnVlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF91c2VyJyxcblx0XHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRcdGZpZWxkOiAndXNlcidcblx0XHRcdH0gKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRW1wbG95ZWVzJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl90YXhfZGVkdWN0aW9uc19jb2x1bW4xLCAnJyApO1xuXHRcdH1cblx0XHQvLyBUYWIxICBzdGFydFxuXG5cdFx0dmFyIHRhYl9lbGlnaWJpbGl0eSA9IHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYl9lbGlnaWJpbGl0eScgKTtcblxuXHRcdHZhciB0YWJfZWxpZ2liaWxpdHlfY29sdW1uMSA9IHRhYl9lbGlnaWJpbGl0eS5maW5kKCAnLmZpcnN0LWNvbHVtbicgKTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMV0gPSBbXTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMV0ucHVzaCggdGFiX2VsaWdpYmlsaXR5X2NvbHVtbjEgKTtcblxuXHRcdC8vIEFwcGx5IEZyZXF1ZW5jeVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuVENvbWJvQm94KCB7IGZpZWxkOiAnYXBwbHlfZnJlcXVlbmN5X2lkJywgc2V0X2VtcHR5OiBmYWxzZSB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLmFwcGx5X2ZyZXF1ZW5jeV9hcnJheSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQXBwbHkgRnJlcXVlbmN5JyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9lbGlnaWJpbGl0eV9jb2x1bW4xLCAnJyApO1xuXG5cdFx0Ly8gTW9udGhcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ2FwcGx5X2ZyZXF1ZW5jeV9tb250aCcsIHNldF9lbXB0eTogZmFsc2UgfSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5zZXRTb3VyY2VEYXRhKCAkdGhpcy5tb250aF9vZl95ZWFyX2FycmF5ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdNb250aCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfZWxpZ2liaWxpdHlfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vIERheSBvZiBNb250aFxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuVENvbWJvQm94KCB7IGZpZWxkOiAnYXBwbHlfZnJlcXVlbmN5X2RheV9vZl9tb250aCcsIHNldF9lbXB0eTogZmFsc2UgfSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5zZXRTb3VyY2VEYXRhKCAkdGhpcy5kYXlfb2ZfbW9udGhfYXJyYXkgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0RheSBvZiBNb250aCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfZWxpZ2liaWxpdHlfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vIFNlbWktTW9udGhseTogUHJpbWFyeSBEYXkgb2YgTW9udGhcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdhcHBseV9mcmVxdWVuY3lfZGF5X29mX21vbnRoMScsIHNldF9lbXB0eTogZmFsc2UgfSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5zZXRTb3VyY2VEYXRhKCAkdGhpcy5kYXlfb2ZfbW9udGhfYXJyYXkgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1ByaW1hcnkgRGF5IG9mIE1vbnRoJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9lbGlnaWJpbGl0eV9jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0Ly8gU2VtaS1Nb250aGx5OiBTZWNvbmRhcnkgRGF5IG9mIE1vbnRoXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVENvbWJvQm94KCB7IGZpZWxkOiAnYXBwbHlfZnJlcXVlbmN5X2RheV9vZl9tb250aDInLCBzZXRfZW1wdHk6IGZhbHNlIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMuZGF5X29mX21vbnRoX2FycmF5ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdTZWNvbmRhcnkgRGF5IG9mIE1vbnRoJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9lbGlnaWJpbGl0eV9jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0Ly8gTW9udGggb2YgUXVhcnRlclxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuVENvbWJvQm94KCB7IGZpZWxkOiAnYXBwbHlfZnJlcXVlbmN5X3F1YXJ0ZXJfbW9udGgnLCBzZXRfZW1wdHk6IGZhbHNlIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMubW9udGhfb2ZfcXVhcnRlcl9hcnJheSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnTW9udGggb2YgUXVhcnRlcicgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfZWxpZ2liaWxpdHlfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vIFBheXJvbGwgUnVuIFR5cGVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCgge1xuXHRcdFx0ZmllbGQ6ICdhcHBseV9wYXlyb2xsX3J1bl90eXBlX2lkJyxcblx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdGN1c3RvbUZpcnN0SXRlbUxhYmVsOiBHbG9iYWwuYW55X2l0ZW1cblx0XHR9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLmFwcGx5X3BheXJvbGxfcnVuX3R5cGVfYXJyYXkgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1BheXJvbGwgUnVuIFR5cGUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2VsaWdpYmlsaXR5X2NvbHVtbjEsICcnICk7XG5cblx0XHQvLyBTdGFydCBEYXRlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5EQVRFX1BJQ0tFUiApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlREYXRlUGlja2VyKCB7IGZpZWxkOiAnc3RhcnRfZGF0ZScgfSApO1xuXG5cdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblx0XHRsYWJlbCA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtcmlnaHQtbGFiZWxcXCc+JyArICQuaTE4bi5fKCAnKExlYXZlIGJsYW5rIGZvciBubyBzdGFydCBkYXRlKScgKSArICc8L3NwYW4+JyApO1xuXG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggbGFiZWwgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1N0YXJ0IERhdGUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2VsaWdpYmlsaXR5X2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIgKTtcblxuXHRcdC8vIEVuZCBEYXRlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5EQVRFX1BJQ0tFUiApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlREYXRlUGlja2VyKCB7IGZpZWxkOiAnZW5kX2RhdGUnIH0gKTtcblxuXHRcdHdpZGdldENvbnRhaW5lciA9ICQoICc8ZGl2IGNsYXNzPVxcJ3dpZGdldC1oLWJveFxcJz48L2Rpdj4nICk7XG5cdFx0bGFiZWwgPSAkKCAnPHNwYW4gY2xhc3M9XFwnd2lkZ2V0LXJpZ2h0LWxhYmVsXFwnPicgKyAkLmkxOG4uXyggJyhMZWF2ZSBibGFuayBmb3Igbm8gZW5kIGRhdGUpJyApICsgJzwvc3Bhbj4nICk7XG5cblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBsYWJlbCApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRW5kIERhdGUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2VsaWdpYmlsaXR5X2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIgKTtcblxuXHRcdC8vIE1pbmltdW0gTGVuZ3RoIE9mIFNlcnZpY2VcblxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnbWluaW11bV9sZW5ndGhfb2Zfc2VydmljZScsIHdpZHRoOiAzMCB9ICk7XG5cblx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXHRcdGxhYmVsID0gJCggJzxzcGFuIGNsYXNzPVxcJ3dpZGdldC1yaWdodC1sYWJlbFxcJz4gJyArICcgJyArICcgPC9zcGFuPicgKTtcblxuXHRcdHdpZGdldF9jb21ib19ib3ggPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdHdpZGdldF9jb21ib19ib3guVENvbWJvQm94KCB7IGZpZWxkOiAnbWluaW11bV9sZW5ndGhfb2Zfc2VydmljZV91bml0X2lkJyB9ICk7XG5cdFx0d2lkZ2V0X2NvbWJvX2JveC5zZXRTb3VyY2VEYXRhKCAkdGhpcy5sZW5ndGhfb2Zfc2VydmljZV91bml0X2FycmF5ICk7XG5cblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBsYWJlbCApO1xuXHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIHdpZGdldF9jb21ib19ib3ggKTtcblxuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnTWluaW11bSBMZW5ndGggT2YgU2VydmljZScgKSwgW2Zvcm1faXRlbV9pbnB1dCwgd2lkZ2V0X2NvbWJvX2JveF0sIHRhYl9lbGlnaWJpbGl0eV9jb2x1bW4xLCAnJywgd2lkZ2V0Q29udGFpbmVyICk7XG5cblx0XHQvLyBNYXhpbXVtIExlbmd0aCBPZiBTZXJ2aWNlXG5cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ21heGltdW1fbGVuZ3RoX29mX3NlcnZpY2UnLCB3aWR0aDogMzAgfSApO1xuXG5cdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblx0XHRsYWJlbCA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtcmlnaHQtbGFiZWxcXCc+ICcgKyAnICcgKyAnIDwvc3Bhbj4nICk7XG5cblx0XHR3aWRnZXRfY29tYm9fYm94ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHR3aWRnZXRfY29tYm9fYm94LlRDb21ib0JveCggeyBmaWVsZDogJ21heGltdW1fbGVuZ3RoX29mX3NlcnZpY2VfdW5pdF9pZCcgfSApO1xuXHRcdHdpZGdldF9jb21ib19ib3guc2V0U291cmNlRGF0YSggJHRoaXMubGVuZ3RoX29mX3NlcnZpY2VfdW5pdF9hcnJheSApO1xuXG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggbGFiZWwgKTtcblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCB3aWRnZXRfY29tYm9fYm94ICk7XG5cblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ01heGltdW0gTGVuZ3RoIE9mIFNlcnZpY2UnICksIFtmb3JtX2l0ZW1faW5wdXQsIHdpZGdldF9jb21ib19ib3hdLCB0YWJfZWxpZ2liaWxpdHlfY29sdW1uMSwgJycsIHdpZGdldENvbnRhaW5lciApO1xuXHRcdGlmICggIXRoaXMuc3ViX3ZpZXdfbW9kZSApIHtcblx0XHRcdC8vTGVuZ3RoIG9mIFNlcnZpY2UgY29udHJpYnV0aW5nIHBheSBjb2Rlcy5cblx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElDb250cmlidXRpbmdQYXlDb2RlUG9saWN5LFxuXHRcdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9jb250cmlidXRpbmdfcGF5X2NvZGVfcG9saWN5Jyxcblx0XHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRcdHNldF9kZWZhdWx0OiB0cnVlLFxuXHRcdFx0XHRmaWVsZDogJ2xlbmd0aF9vZl9zZXJ2aWNlX2NvbnRyaWJ1dGluZ19wYXlfY29kZV9wb2xpY3lfaWQnXG5cdFx0XHR9ICk7XG5cdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0xlbmd0aCBPZiBTZXJ2aWNlIEhvdXJzIEJhc2VkIE9uJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9lbGlnaWJpbGl0eV9jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXHRcdH1cblx0XHQvLyBNaW5pbXVtIEVtcGxveWVlIEFnZVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnbWluaW11bV91c2VyX2FnZScsIHdpZHRoOiAzMCB9ICk7XG5cblx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXHRcdGxhYmVsID0gJCggJzxzcGFuIGNsYXNzPVxcJ3dpZGdldC1yaWdodC1sYWJlbFxcJz4nICsgJC5pMThuLl8oICd5ZWFycycgKSArICc8L3NwYW4+JyApO1xuXG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggbGFiZWwgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ01pbmltdW0gRW1wbG95ZWUgQWdlJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9lbGlnaWJpbGl0eV9jb2x1bW4xLCAnJywgd2lkZ2V0Q29udGFpbmVyICk7XG5cblx0XHQvLyBNYXhpbXVtIEVtcGxveWVlIEFnZVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnbWF4aW11bV91c2VyX2FnZScsIHdpZHRoOiAzMCB9ICk7XG5cblx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXHRcdGxhYmVsID0gJCggJzxzcGFuIGNsYXNzPVxcJ3dpZGdldC1yaWdodC1sYWJlbFxcJz4nICsgJC5pMThuLl8oICd5ZWFycycgKSArICc8L3NwYW4+JyApO1xuXG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggbGFiZWwgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ01heGltdW0gRW1wbG95ZWUgQWdlJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9lbGlnaWJpbGl0eV9jb2x1bW4xLCAnJywgd2lkZ2V0Q29udGFpbmVyICk7XG5cblx0XHQvL1RhYiA1XG5cblx0XHR2YXIgdGFiNSA9IHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYjUnICk7XG5cblx0XHR2YXIgdGFiNV9jb2x1bW4xID0gdGFiNS5maW5kKCAnLmZpcnN0LWNvbHVtbicgKTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbNV0gPSBbXTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbNV0ucHVzaCggdGFiNV9jb2x1bW4xICk7XG5cblx0XHQvL1Blcm1pc3Npb25zXG5cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfRFJPUERPV04gKTtcblxuXHRcdHZhciBkaXNwbGF5X2NvbHVtbnMgPSBBTGF5b3V0Q2FjaGUuZ2V0RGVmYXVsdENvbHVtbiggJ2dsb2JhbF9kZWR1Y3Rpb24nICk7IC8vR2V0IERlZmF1bHQgY29sdW1ucyBiYXNlIG9uIGRpZmZlcmVudCBsYXlvdXQgbmFtZVxuXHRcdGRpc3BsYXlfY29sdW1ucyA9IEdsb2JhbC5jb252ZXJ0Q29sdW1uc1RvakdyaWRGb3JtYXQoIGRpc3BsYXlfY29sdW1ucywgJ2dsb2JhbF9kZWR1Y3Rpb24nICk7IC8vQ29udmVydCB0byBqUWdyaWQgZm9ybWF0XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuQURyb3BEb3duKCB7XG5cdFx0XHRmaWVsZDogJ2NvbXBhbnlfdGF4X2RlZHVjdGlvbl9pZHMnLFxuXHRcdFx0ZGlzcGxheV9zaG93X2FsbDogZmFsc2UsXG5cdFx0XHRpZDogJ2NvbXBhbnlfdGF4X2RlZHVjdGlvbl9pZHMnLFxuXHRcdFx0a2V5OiAnaWQnLFxuXHRcdFx0ZGlzcGxheV9jbG9zZV9idG46IGZhbHNlLFxuXHRcdFx0YWxsb3dfZHJhZ190b19vcmRlcjogZmFsc2UsXG5cdFx0XHRkaXNwbGF5X2NvbHVtbl9zZXR0aW5nczogZmFsc2Vcblx0XHR9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LmFkZENsYXNzKCAnc3BsYXllZC1hZHJvcGRvd24nICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdUYXhlcyAvIERlZHVjdGlvbnMnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiNV9jb2x1bW4xLCAnJywgbnVsbCwgZmFsc2UsIHRydWUgKTtcblxuXHRcdGZvcm1faXRlbV9pbnB1dC5zZXRDb2x1bW5zKCBkaXNwbGF5X2NvbHVtbnMgKTtcbi8vXHRcdGZvcm1faXRlbV9pbnB1dC5zZXRVbnNlbGVjdGVkR3JpZERhdGEoIFtdICk7XG5cdFx0VFRQcm9taXNlLnJlc29sdmUoICdDb21wYW55VGF4RGVkdWN0aW9uJywgJ2J1aWxkRWRpdFZpZXdVSScgKTtcblx0fVxuXG5cdHNldEVkaXRWaWV3VGFiSGVpZ2h0KCkge1xuXHRcdHN1cGVyLnNldEVkaXRWaWV3VGFiSGVpZ2h0KCk7XG5cblx0XHR2YXIgdGF4X2dyaWQgPSB0aGlzLmVkaXRfdmlld191aV9kaWMuY29tcGFueV90YXhfZGVkdWN0aW9uX2lkcztcblxuXHRcdHRheF9ncmlkLnNldEhlaWdodCggKCB0aGlzLmVkaXRfdmlld190YWIuZmluZCggJy5jb250ZXh0LWJvcmRlcicgKS5oZWlnaHQoKSAtICQoIHRoaXMuJGVsIClbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICkgLSAyMCApO1xuXHR9XG5cblx0cHV0SW5wdXRUb0luc2lkZUZvcm1JdGVtKCBmb3JtX2l0ZW1faW5wdXQsIGxhYmVsICkge1xuXHRcdHZhciBmb3JtX2l0ZW0gPSAkKCBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggV2lkZ2V0TmFtZXNEaWMuRURJVF9WSUVXX1NVQl9GT1JNX0lURU0gKSApO1xuXHRcdHZhciBmb3JtX2l0ZW1fbGFiZWxfZGl2ID0gZm9ybV9pdGVtLmZpbmQoICcuZWRpdC12aWV3LWZvcm0taXRlbS1sYWJlbC1kaXYnICk7XG5cblx0XHRmb3JtX2l0ZW1fbGFiZWxfZGl2LmF0dHIoICdjbGFzcycsICdlZGl0LXZpZXctZm9ybS1pdGVtLXN1Yi1sYWJlbC1kaXYnICk7XG5cblx0XHR2YXIgZm9ybV9pdGVtX2xhYmVsID0gZm9ybV9pdGVtLmZpbmQoICcuZWRpdC12aWV3LWZvcm0taXRlbS1sYWJlbCcgKTtcblx0XHR2YXIgZm9ybV9pdGVtX2lucHV0X2RpdiA9IGZvcm1faXRlbS5maW5kKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0taW5wdXQtZGl2JyApO1xuXHRcdGZvcm1faXRlbS5hZGRDbGFzcyggJ3JlbW92ZS1tYXJnaW4nICk7XG5cblx0XHRmb3JtX2l0ZW1fbGFiZWwudGV4dCggJC5pMThuLl8oIGxhYmVsICkgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXRfZGl2LmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHRyZXR1cm4gZm9ybV9pdGVtO1xuXHR9XG5cblx0YnVpbGRTZWFyY2hGaWVsZHMoKSB7XG5cblx0XHRzdXBlci5idWlsZFNlYXJjaEZpZWxkcygpO1xuXG5cdFx0dGhpcy5zZWFyY2hfZmllbGRzID0gW1xuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1N0YXR1cycgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAxLFxuXHRcdFx0XHRmaWVsZDogJ3N0YXR1c19pZCcsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX29wdGlvbl9jb2x1bW4nLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnVHlwZScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAxLFxuXHRcdFx0XHRmaWVsZDogJ3R5cGVfaWQnLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9vcHRpb25fY29sdW1uJyxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ05hbWUnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICduYW1lJyxcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogZmFsc2UsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVFxuXHRcdFx0fSApLFxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0xlZ2FsIEVudGl0eScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAxLFxuXHRcdFx0XHRmaWVsZDogJ2xlZ2FsX2VudGl0eV9pZCcsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2xlZ2FsX2VudGl0eScsXG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJTGVnYWxFbnRpdHksXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnUGF5IFN0dWIgQWNjb3VudCcgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAxLFxuXHRcdFx0XHRmaWVsZDogJ3BheV9zdHViX2VudHJ5X25hbWVfaWQnLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9QYXlTdHViQWNjb3VudCcsXG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJUGF5U3R1YkVudHJ5QWNjb3VudCxcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogZmFsc2UsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdSZW1pdHRhbmNlIEFnZW5jeScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAyLFxuXHRcdFx0XHRmaWVsZDogJ3BheXJvbGxfcmVtaXR0YW5jZV9hZ2VuY3lfaWQnLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9wYXlyb2xsX3JlbWl0dGFuY2VfYWdlbmN5Jyxcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElQYXlyb2xsUmVtaXR0YW5jZUFnZW5jeSxcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0c2NyaXB0X25hbWU6ICdQYXlyb2xsUmVtaXR0YW5jZUFnZW5jeVZpZXcnLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnQ2FsY3VsYXRpb24nICksXG5cdFx0XHRcdGluX2NvbHVtbjogMixcblx0XHRcdFx0ZmllbGQ6ICdjYWxjdWxhdGlvbl9pZCcsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX29wdGlvbl9jb2x1bW4nLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnQ3JlYXRlZCBCeScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAyLFxuXHRcdFx0XHRmaWVsZDogJ2NyZWF0ZWRfYnknLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF91c2VyJyxcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElVc2VyLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRzY3JpcHRfbmFtZTogJ0VtcGxveWVlVmlldycsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdVcGRhdGVkIEJ5JyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGZpZWxkOiAndXBkYXRlZF9ieScsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3VzZXInLFxuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVVzZXIsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdHNjcmlwdF9uYW1lOiAnRW1wbG95ZWVWaWV3Jyxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApXG5cblx0XHRdO1xuXHR9XG5cblx0c2VhcmNoRG9uZSgpIHtcblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ1RheFZpZXcnLCAnaW5pdCcgKTtcblx0XHRzdXBlci5zZWFyY2hEb25lKCk7XG5cdH1cblxuXHRnZXRDb21wYW55VGF4RGVkdWN0aW9uRW1wbG95ZWVTZXR0aW5nVGFiSHRtbCgpIHtcblx0XHRyZXR1cm4gYDxkaXYgaWQ9XCJ0YWJfZW1wbG95ZWVfc2V0dGluZ1wiIGNsYXNzPVwiZWRpdC12aWV3LXRhYi1vdXRzaWRlXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImVkaXQtdmlldy10YWJcIiBpZD1cInRhYl9lbXBsb3llZV9zZXR0aW5nX2NvbnRlbnRfZGl2XCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5zaWRlLWVkaXRvci1kaXYgZnVsbC13aWR0aC1jb2x1bW5cIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImdyaWQtZGl2IGVtcGxveWVlLXNldHRpbmctZ3JpZC1kaXZcIj5cblx0XHRcdFx0XHRcdFx0XHQ8dGFibGUgaWQ9XCJlbXBsb3llZV9zZXR0aW5nX2dyaWRcIj48L3RhYmxlPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInNhdmUtYW5kLWNvbnRpbnVlLWRpdlwiPlxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1lc3NhZ2VcIj48L3NwYW4+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzYXZlLWFuZC1jb250aW51ZS1idXR0b24tZGl2XCI+XG5cdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cInR0LWJ1dHRvbiBwLWJ1dHRvbiBwLWNvbXBvbmVudFwiIHR5cGU9XCJidXR0b25cIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaWNvblwiPjwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwicC1idXR0b24tbGFiZWxcIj48L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0PC9idXR0b24+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PmA7XG5cdH1cblxufVxuXG5Db21wYW55VGF4RGVkdWN0aW9uVmlld0NvbnRyb2xsZXIubG9hZFN1YlZpZXcgPSBmdW5jdGlvbiggY29udGFpbmVyLCBiZWZvcmVWaWV3TG9hZGVkRnVuLCBhZnRlclZpZXdMb2FkZWRGdW4gKSB7XG5cblx0R2xvYmFsLmxvYWRWaWV3U291cmNlKCAnQ29tcGFueVRheERlZHVjdGlvbicsICdTdWJDb21wYW55VGF4RGVkdWN0aW9uVmlldy5odG1sJywgZnVuY3Rpb24oIHJlc3VsdCApIHtcblxuXHRcdHZhciBhcmdzID0ge307XG5cdFx0dmFyIHRlbXBsYXRlID0gXy50ZW1wbGF0ZSggcmVzdWx0ICk7XG5cblx0XHRpZiAoIEdsb2JhbC5pc1NldCggYmVmb3JlVmlld0xvYWRlZEZ1biApICkge1xuXHRcdFx0YmVmb3JlVmlld0xvYWRlZEZ1bigpO1xuXHRcdH1cblxuXHRcdGlmICggR2xvYmFsLmlzU2V0KCBjb250YWluZXIgKSApIHtcblx0XHRcdGNvbnRhaW5lci5odG1sKCB0ZW1wbGF0ZSggYXJncyApICk7XG5cblx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCBhZnRlclZpZXdMb2FkZWRGdW4gKSApIHtcblx0XHRcdFx0YWZ0ZXJWaWV3TG9hZGVkRnVuKCBzdWJfY29tcGFueV90YXhfZGVkdWN0aW9uX3ZpZXdfY29udHJvbGxlciApO1xuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0gKTtcblxufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9706\n")}}]);