"use strict";(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["attendance-timesheet-UserDateTotalViewController"],{827:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"UserDateTotalViewController\": () => (/* binding */ UserDateTotalViewController)\n/* harmony export */ });\n/* provided dependency */ var _ = __webpack_require__(9050);\n/* provided dependency */ var $ = __webpack_require__(9755);\nclass UserDateTotalViewController extends BaseViewController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\t\t\tel: '#user_date_total_view_container', //Must set el here and can only set string, so events can work\n\n\t\t\tpunch_tag_api: null,\n\t\t\tdefault_punch_tag: [],\n\t\t\tprevious_punch_tag_selection: []\n\t\t} );\n\n\t\tsuper( options );\n\t}\n\n\tinit( options ) {\n\t\t//this._super('initialize', options );\n\t\tthis.edit_view_tpl = 'UserDateTotalEditView.html';\n\t\tthis.permission_id = 'user_date_total';\n\t\tthis.script_name = 'UserDateTotalView';\n\t\tthis.viewId = 'UserDateTotal';\n\t\tthis.table_name_key = 'user_date_total';\n\t\tthis.context_menu_name = $.i18n._( 'Accumulated Time' );\n\t\tthis.navigation_label = $.i18n._( 'Accumulated Time' );\n\t\tthis.api = TTAPI.APIUserDateTotal;\n\t\tthis.currency_api = TTAPI.APICurrency;\n\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\tthis.job_api = TTAPI.APIJob;\n\t\t\tthis.job_item_api = TTAPI.APIJobItem;\n\t\t\tthis.punch_tag_api = TTAPI.APIPunchTag;\n\t\t}\n\n\t\tif ( PermissionManager.validate( this.permission_id, 'add' ) || PermissionManager.validate( this.permission_id, 'edit' ) ) {\n\t\t\t$( this.el ).find( '.warning-message' ).text( $.i18n._( 'WARNING: Manually modifying Accumulated Time records may prevent policies from being calculated properly and should only be done as a last resort when instructed to do so by a support representative.' ) );\n\t\t} else {\n\t\t\t$( this.el ).find( '.warning-message' ).hide();\n\t\t}\n\n\t\tthis.initPermission();\n\t\tthis.render();\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\tsetGridSize() {\n\t\t// if ( ( !this.grid || !this.grid.grid.is( ':visible' ) ) ) {\n\t\t// \treturn;\n\t\t// }\n\t\t//this.grid.grid.setGridWidth( $( this.el ).parent().width() - 2 );\n\n\t\tvar message_offset = ( $( this.el ).find( '.warning-message' ).outerHeight() * 2 ) + 27;\n\t\tthis.grid.grid.setGridHeight( $( this.el ).parents( '#tab_user_date_total_parent' ).height() - message_offset );\n\t}\n\n\tsetGridCellBackGround() {\n\n\t\tvar data = this.grid.getGridParam( 'data' );\n\n\t\t//Error: TypeError: data is undefined in /interface/html5/framework/jquery.min.js?v=7.4.6-20141027-074127 line 2 > eval line 70\n\t\tif ( !data ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar len = data.length;\n\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tvar item = data[i];\n\n\t\t\tif ( item.is_override === true ) {\n\t\t\t\t$( 'tr[id=\\'' + item.id + '\\']' ).addClass( 'user-data-total-override' );\n\t\t\t}\n\t\t}\n\t}\n\n\tinitOptions() {\n\t\tvar $this = this;\n\n\t\tthis.initDropDownOption( 'object_type' );\n\t}\n\n\tgetCustomContextMenuModel() {\n\t\tvar context_menu_model = {\n\t\t\texclude: ['copy', 'export_excel'],\n\t\t\tinclude: ['default']\n\t\t};\n\n\t\treturn context_menu_model;\n\t}\n\n\tonFormItemChange( target, doNotValidate ) {\n\t\tvar $this = this;\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\t\t\tcase 'object_type_id':\n\t\t\t\tthis.onTypeChange( true );\n\t\t\t\tbreak;\n\t\t\tcase 'regular_policy_id':\n\t\t\tcase 'absence_policy_id':\n\t\t\tcase 'overtime_policy_id':\n\t\t\tcase 'premium_policy_id':\n\t\t\tcase 'break_policy_id':\n\t\t\tcase 'meal_policy_id':\n\t\t\t\tthis.current_edit_record.src_object_id = c_value;\n\t\t\t\tdelete this.current_edit_record[key];\n\t\t\t\tthis.onSrcObjectChange( key );\n\t\t\t\tbreak;\n\t\t\tcase 'total_time':\n\t\t\t\tif ( this.current_edit_record.total_time == 0 ) {\n\t\t\t\t\tthis.edit_view_ui_dic.start_time_stamp.setValue( '' );\n\t\t\t\t\tthis.edit_view_ui_dic.end_time_stamp.setValue( '' );\n\t\t\t\t\tthis.current_edit_record.start_time_stamp = '';\n\t\t\t\t\tthis.current_edit_record.end_time_stamp = '';\n\n\t\t\t\t\t//Trigger onChange event for above fields, so in mass edit they are marked as changed.\n\t\t\t\t\tthis.edit_view_form_item_dic.start_time_stamp.find( 'input' ).trigger( 'change', '' );\n\t\t\t\t\tthis.edit_view_form_item_dic.end_time_stamp.find( 'input' ).trigger( 'change', '' );\n\t\t\t\t}\n\t\t\t\tthis.calculateAmount();\n\t\t\t\tbreak;\n\t\t\tcase 'hourly_rate':\n\t\t\t\tthis.calculateAmount();\n\t\t\t\tbreak;\n\t\t\tcase 'job_id':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.edit_view_ui_dic['job_quick_search'].setValue( target.getValue( true ) ? ( target.getValue( true ).manual_id ? target.getValue( true ).manual_id : '' ) : '' );\n\t\t\t\t\tthis.setJobItemValueWhenJobChanged( target.getValue( true ), 'job_item_id', {\n\t\t\t\t\t\tstatus_id: 10,\n\t\t\t\t\t\tjob_id: this.current_edit_record.job_id\n\t\t\t\t\t} );\n\t\t\t\t\tthis.edit_view_ui_dic['job_quick_search'].setCheckBox( true );\n\t\t\t\t\tthis.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tcase 'job_item_id':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.edit_view_ui_dic['job_item_quick_search'].setValue( target.getValue( true ) ? ( target.getValue( true ).manual_id ? target.getValue( true ).manual_id : '' ) : '' );\n\t\t\t\t\tthis.edit_view_ui_dic['job_item_quick_search'].setCheckBox( true );\n\t\t\t\t\tthis.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'punch_tag_id':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tif ( c_value !== TTUUID.zero_id && c_value !== false && c_value.length > 0 ) {\n\t\t\t\t\t\tthis.setPunchTagQuickSearchManualIds( target.getSelectItems() );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.edit_view_ui_dic['punch_tag_quick_search'].setValue( '' );\n\t\t\t\t\t}\n\t\t\t\t\t$this.previous_punch_tag_selection = c_value;\n\t\t\t\t\t//Reset source data to make sure correct punch tags are always shown.\n\t\t\t\t\tthis.edit_view_ui_dic['punch_tag_id'].setSourceData( null );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'user_id':\n\t\t\tcase 'branch_id':\n\t\t\tcase 'department_id':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );\n\t\t\t\t\tthis.setJobValueWhenCriteriaChanged( 'job_id', {\n\t\t\t\t\t\tstatus_id: 10,\n\t\t\t\t\t\tuser_id: this.current_edit_record.user_id,\n\t\t\t\t\t\tpunch_branch_id: this.current_edit_record.branch_id,\n\t\t\t\t\t\tpunch_department_id: this.current_edit_record.department_id\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'job_quick_search':\n\t\t\tcase 'job_item_quick_search':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.onJobQuickSearch( key, c_value );\n\t\t\t\t\tTTPromise.wait( 'BaseViewController', 'onJobQuickSearch', function() {\n\t\t\t\t\t\t$this.setPunchTagValuesWhenCriteriaChanged( $this.getPunchTagFilterData(), 'punch_tag_id' );\n\t\t\t\t\t} );\n\t\t\t\t\t//Don't validate immediately as onJobQuickSearch is doing async API calls, and it would cause a guaranteed validation failure.\n\t\t\t\t\tdoNotValidate = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'punch_tag_quick_search':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.onPunchTagQuickSearch( c_value, this.getPunchTagFilterData(), 'punch_tag_id' );\n\n\t\t\t\t\t//Don't validate immediately as onPunchTagQuickSearch is doing async API calls, and it would cause a guaranteed validation failure.\n\t\t\t\t\tdoNotValidate = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( key !== 'override' ) {\n\t\t\tthis.edit_view_ui_dic.override.setValue( true );\n\t\t\tthis.current_edit_record.override = true;\n\t\t\tthis.edit_view_form_item_dic.override.find( 'input' ).trigger( 'change', '1' ); //Trigger onChange event for above fields, so in mass edit they are marked as changed.\n\t\t}\n\n\t\tif ( !doNotValidate ) {\n\t\t\tthis.validate();\n\t\t}\n\t}\n\n\tcalculateAmount() {\n\t\tthis.current_edit_record.total_time_amount = ( this.current_edit_record.total_time / 3600 ) * parseFloat( this.current_edit_record.hourly_rate );\n\t\tthis.edit_view_ui_dic.total_time_amount.setValue( this.current_edit_record.total_time_amount.toFixed( 4 ) );\n\t}\n\n\tonAddClick() {\n\t\tvar $this = this;\n\t\tthis.setCurrentEditViewState( 'new' );\n\t\t$this.openEditView();\n\n\t\t//Error: Uncaught TypeError: undefined is not a function in /interface/html5/views/BaseViewController.js?v=8.0.0-20141117-111140 line 897\n\t\tif ( $this.api ) {\n\t\t\t$this.api['get' + $this.api.key_name + 'DefaultData'](\n\t\t\t\tthis.parent_edit_record.user_id,\n\t\t\t\tthis.parent_edit_record.date_stamp, {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t$this.onAddResult( result );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}\n\t}\n\n\tonAddResult( result ) {\n\t\tvar $this = this;\n\t\tvar result_data = result.getResult();\n\n\t\tif ( !result_data ) {\n\t\t\tresult_data = [];\n\t\t}\n\n\t\tresult_data.company = LocalCacheData.current_company.name;\n\n\t\tif ( $this.sub_view_mode && $this.parent_key ) {\n\t\t\tresult_data[$this.parent_key] = $this.parent_value;\n\t\t}\n\n\t\tif ( !result_data.date_stamp ) {\n\t\t\tresult_data.date_stamp = this.parent_edit_record.date_stamp;\n\t\t}\n\n\t\t$this.current_edit_record = result_data;\n\t\t$this.initEditView();\n\t}\n\n\t/* jshint ignore:end */\n\n\tinitPermission() {\n\t\tsuper.initPermission();\n\n\t\tif ( this.jobUIValidate() ) {\n\t\t\tthis.show_job_ui = true;\n\t\t} else {\n\t\t\tthis.show_job_ui = false;\n\t\t}\n\n\t\tif ( this.jobItemUIValidate() ) {\n\t\t\tthis.show_job_item_ui = true;\n\t\t} else {\n\t\t\tthis.show_job_item_ui = false;\n\t\t}\n\n\t\tif ( this.punchTagUIValidate() ) {\n\t\t\tthis.show_punch_tag_ui = true;\n\t\t} else {\n\t\t\tthis.show_punch_tag_ui = false;\n\t\t}\n\n\t\tif ( this.branchUIValidate() ) {\n\t\t\tthis.show_branch_ui = true;\n\t\t} else {\n\t\t\tthis.show_branch_ui = false;\n\t\t}\n\n\t\tif ( this.departmentUIValidate() ) {\n\t\t\tthis.show_department_ui = true;\n\t\t} else {\n\t\t\tthis.show_department_ui = false;\n\t\t}\n\n\t\tif ( this.goodQuantityUIValidate() ) {\n\t\t\tthis.show_good_quantity_ui = true;\n\t\t} else {\n\t\t\tthis.show_good_quantity_ui = false;\n\t\t}\n\n\t\tif ( this.badQuantityUIValidate() ) {\n\t\t\tthis.show_bad_quantity_ui = true;\n\t\t} else {\n\t\t\tthis.show_bad_quantity_ui = false;\n\t\t}\n\n\t\tif ( this.noteUIValidate() ) {\n\t\t\tthis.show_note_ui = true;\n\t\t} else {\n\t\t\tthis.show_note_ui = false;\n\t\t}\n\t}\n\n\tnoteUIValidate( p_id ) {\n\n\t\tif ( !p_id ) {\n\t\t\tp_id = 'punch';\n\t\t}\n\n\t\tif ( PermissionManager.validate( p_id, 'edit_note' ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tbranchUIValidate( p_id ) {\n\n\t\tif ( !p_id ) {\n\t\t\tp_id = 'punch';\n\t\t}\n\n\t\tif ( PermissionManager.validate( p_id, 'edit_branch' ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tdepartmentUIValidate( p_id ) {\n\n\t\tif ( !p_id ) {\n\t\t\tp_id = 'punch';\n\t\t}\n\n\t\tif ( PermissionManager.validate( p_id, 'edit_department' ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tjobUIValidate( p_id ) {\n\n\t\tif ( !p_id ) {\n\t\t\tp_id = 'punch';\n\t\t}\n\n\t\tif ( PermissionManager.validate( 'job', 'enabled' ) &&\n\t\t\tPermissionManager.validate( p_id, 'edit_job' ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tjobItemUIValidate( p_id ) {\n\n\t\tif ( !p_id ) {\n\t\t\tp_id = 'punch';\n\t\t}\n\n\t\tif ( PermissionManager.validate( p_id, 'edit_job_item' ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpunchTagUIValidate( p_id ) {\n\n\t\tif ( !p_id ) {\n\t\t\tp_id = 'punch';\n\t\t}\n\n\t\tif ( PermissionManager.validate( p_id, 'edit_punch_tag' ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tgoodQuantityUIValidate( p_id ) {\n\n\t\tif ( !p_id ) {\n\t\t\tp_id = 'punch';\n\t\t}\n\n\t\tif ( PermissionManager.validate( p_id, 'edit_quantity' ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tbadQuantityUIValidate( p_id ) {\n\n\t\tif ( !p_id ) {\n\t\t\tp_id = 'punch';\n\t\t}\n\n\t\tif ( PermissionManager.validate( p_id, 'edit_quantity' ) &&\n\t\t\tPermissionManager.validate( p_id, 'edit_bad_quantity' ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tsetCurrency() {\n\t\tvar $this = this;\n\t\tif ( Global.isSet( this.current_edit_record.user_id ) ) {\n\t\t\tvar filter = {};\n\t\t\tfilter.filter_data = { user_id: this.current_edit_record.user_id };\n\t\t\tthis.currency_api.getCurrency( filter, false, false, {\n\t\t\t\tonResult: function( res ) {\n\t\t\t\t\tres = res.getResult();\n\t\t\t\t\tif ( Global.isArray( res ) ) {\n\t\t\t\t\t\t$( '.userDateTotal-currency' ).text( res[0].symbol );\n\t\t\t\t\t\t$( '.userDateTotal-code' ).text( res[0].iso_code );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$( '.userDateTotal-currency' ).text( '' );\n\t\t\t\t\t\t$( '.userDateTotal-code' ).text( '' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\tsetCurrentEditRecordData() {\n\t\tvar $this = this;\n\t\tthis.setCurrency();\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\t\t\tvar widget = this.edit_view_ui_dic[key];\n\t\t\tswitch ( key ) {\n\t\t\t\tcase 'user_id':\n\t\t\t\t\tvar current_widget = this.edit_view_ui_dic['first_last_name'];\n\t\t\t\t\tTTAPI.APIUser.getUser( { filter_data: { id: this.current_edit_record[key] } }, {\n\t\t\t\t\t\tonResult: function( result ) {\n\n\t\t\t\t\t\t\tif ( result.isValid() ) {\n\t\t\t\t\t\t\t\tvar user_data = result.getResult()[0];\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t//Error: Unable to get property 'first_name' of undefined or null reference in /interface/html5/ line 511\n\t\t\t\t\t\t\tif ( user_data && user_data.first_name ) {\n\t\t\t\t\t\t\t\tcurrent_widget.setValue( user_data.first_name + ' ' + user_data.last_name );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcurrent_widget.setValue( '' );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'job_id':\n\t\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\t\tvar args = {};\n\t\t\t\t\t\targs.filter_data = {\n\t\t\t\t\t\t\tstatus_id: 10,\n\t\t\t\t\t\t\tuser_id: this.current_edit_record.user_id,\n\t\t\t\t\t\t\tpunch_branch_id: this.current_edit_record.branch_id,\n\t\t\t\t\t\t\tpunch_department_id: this.current_edit_record.department_id\n\t\t\t\t\t\t};\n\t\t\t\t\t\twidget.setDefaultArgs( args );\n\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'date_stamp':\n\t\t\t\t\twidget.setEnabled( false );\n\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'punch_tag_id':\n\t\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\tthis.previous_punch_tag_selection = this.current_edit_record[key];\n\n\t\t\t\t\t\tvar punch_tag_widget = widget;\n\t\t\t\t\t\tTTPromise.wait( null, null, function() {\n\t\t\t\t\t\t\t//Update default args for punch tags AComboBox last as they rely on data from job, job item and related fields.\n\t\t\t\t\t\t\tvar args = {};\n\t\t\t\t\t\t\targs.filter_data = $this.getPunchTagFilterData();\n\t\t\t\t\t\t\tpunch_tag_widget.setDefaultArgs( args );\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tif ( widget ) {\n\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.collectUIDataToCurrentEditRecord();\n\t\tthis.setEditViewDataDone();\n\t}\n\n\tsetEditViewDataDone() {\n\t\tvar $this = this;\n\t\tsuper.setEditViewDataDone();\n\t\tthis.onTypeChange();\n\t}\n\n\tonTypeChange( reset ) {\n\t\tthis.detachElement( 'regular_policy_id' );\n\t\tthis.detachElement( 'absence_policy_id' );\n\t\tthis.detachElement( 'overtime_policy_id' );\n\t\tthis.detachElement( 'premium_policy_id' );\n\t\tthis.detachElement( 'meal_policy_id' );\n\t\tthis.detachElement( 'break_policy_id' );\n\t\tvar key = '';\n\t\tif ( this.current_edit_record['object_type_id'] == 20 ) {\n\t\t\tkey = 'regular_policy_id';\n\t\t} else if ( this.current_edit_record['object_type_id'] == 25 || this.current_edit_record['object_type_id'] == 50 ) {\n\t\t\tkey = 'absence_policy_id';\n\t\t} else if ( this.current_edit_record['object_type_id'] == 30 ) {\n\t\t\tkey = 'overtime_policy_id';\n\t\t} else if ( this.current_edit_record['object_type_id'] == 40 ) {\n\t\t\tkey = 'premium_policy_id';\n\t\t} else if ( this.current_edit_record['object_type_id'] == 100 || this.current_edit_record['object_type_id'] == 101 ) {\n\t\t\tkey = 'meal_policy_id';\n\t\t} else if ( this.current_edit_record['object_type_id'] == 110 || this.current_edit_record['object_type_id'] == 111 ) {\n\t\t\tkey = 'break_policy_id';\n\t\t}\n\t\tif ( key ) {\n\t\t\tthis.attachElement( key );\n\t\t\tif ( reset ) {\n\t\t\t\tthis.edit_view_ui_dic[key].setValue( '' );\n\t\t\t\tthis.edit_view_ui_dic['pay_code_id'].setValue( '' );\n\t\t\t\tthis.current_edit_record.src_object_id = false;\n\t\t\t\tthis.current_edit_record.pay_code_id = false;\n\t\t\t\tthis.edit_view_ui_dic['pay_code_id'].setEnabled( true );\n\t\t\t} else if ( this.current_edit_record.src_object_id ) {\n\t\t\t\tthis.edit_view_ui_dic[key].setValue( this.current_edit_record.src_object_id );\n\t\t\t\tthis.edit_view_ui_dic['pay_code_id'].setEnabled( false );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.edit_view_ui_dic['pay_code_id'].setEnabled( true );\n\t\t\tthis.current_edit_record.src_object_id = false;\n\t\t}\n\t\tthis.editFieldResize();\n\t}\n\n\tonSrcObjectChange( key ) {\n\t\tvar full_value = this.edit_view_ui_dic[key].getValue( true );\n\t\tif ( full_value && full_value.pay_code_id ) {\n\t\t\tthis.edit_view_ui_dic['pay_code_id'].setEnabled( false );\n\t\t\tthis.edit_view_ui_dic['pay_code_id'].setValue( full_value.pay_code_id );\n\t\t\tthis.current_edit_record.pay_code_id = full_value.pay_code_id;\n\t\t} else {\n\t\t\tthis.edit_view_ui_dic['pay_code_id'].setEnabled( true );\n\t\t\tthis.edit_view_ui_dic['pay_code_id'].setValue( '' );\n\t\t\tthis.current_edit_record.pay_code_id = false;\n\t\t}\n\t}\n\n\tsearch( set_default_menu, page_action, page_number, callBack ) {\n\t\tthis.refresh_id = null;\n\t\tsuper.search( set_default_menu, page_action, page_number, callBack );\n\t}\n\n\tgetProperObjectType() {\n\t\tvar array = [];\n\n\t\tfor ( var i = 0; i < this.object_type_array.length; i++ ) {\n\t\t\tvar item = this.object_type_array[i];\n\n\t\t\tif ( item.value == 20 ||\n\t\t\t\titem.value == 25 ||\n\t\t\t\titem.value == 30 ||\n\t\t\t\titem.value == 40 ||\n\t\t\t\titem.value == 100 ||\n\t\t\t\titem.value == 110 ) {\n\t\t\t\tarray.push( item );\n\t\t\t}\n\n\t\t}\n\n\t\treturn array;\n\t}\n\n\tbuildEditViewUI() {\n\n\t\tsuper.buildEditViewUI();\n\n\t\tvar $this = this;\n\n\t\tvar tab_model = {\n\t\t\t'tab_user_date_total': { 'label': $.i18n._( 'Accumulated Time' ), 'is_multi_column': true },\n\t\t\t'tab_audit': true,\n\t\t};\n\t\tthis.setTabModel( tab_model );\n\n\t\tthis.navigation.AComboBox( {\n\t\t\tapi_class: TTAPI.APIUserDateTotal,\n\t\t\tid: this.script_name + '_navigation',\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_wage',\n\t\t\tshow_search_inputs: true,\n\t\t\tnavigation_mode: true\n\t\t} );\n\n\t\tthis.setNavigation();\n\n\t\tvar form_item_input;\n\t\tvar widgetContainer;\n\n\t\t//Tab 0 start\n\t\tvar tab_user_date_total = this.edit_view_tab.find( '#tab_user_date_total' );\n\n\t\tvar tab_user_date_total_column1 = tab_user_date_total.find( '.first-column' );\n\t\tvar tab_user_date_total_column2 = tab_user_date_total.find( '.second-column' );\n\n\t\t//Employee\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( { field: 'first_last_name' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Employee' ), form_item_input, tab_user_date_total_column1, '' );\n\n\t\t//Date\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );\n\t\tform_item_input.TDatePicker( { field: 'date_stamp' } );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Date' ), form_item_input, tab_user_date_total_column1 );\n\n\t\t//Time\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'total_time', mode: 'time_unit', need_parser_sec: true } );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Time' ), form_item_input, tab_user_date_total_column1, '', null, true );\n\n\t\t//Type\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\n\t\tform_item_input.TComboBox( { field: 'object_type_id' } );\n\t\tform_item_input.setSourceData( this.getProperObjectType() );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Type' ), form_item_input, tab_user_date_total_column1 );\n\n\t\t//Regular Policy\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIRegularTimePolicy,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_regular_time',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'regular_policy_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Policy' ), form_item_input, tab_user_date_total_column1, null, null, true );\n\t\tthis.detachElement( 'regular_policy_id' );\n\n\t\t//Absence Policy\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIAbsencePolicy,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_absences',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'absence_policy_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Policy' ), form_item_input, tab_user_date_total_column1, null, null, true );\n\t\tthis.detachElement( 'absence_policy_id' );\n\n\t\t//Overtime Policy\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIOverTimePolicy,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_over_time',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'overtime_policy_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Policy' ), form_item_input, tab_user_date_total_column1, null, null, true );\n\t\tthis.detachElement( 'overtime_policy_id' );\n\n\t\t//Premium Policy\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIPremiumPolicy,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_premium',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'premium_policy_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Policy' ), form_item_input, tab_user_date_total_column1, null, null, true );\n\t\tthis.detachElement( 'premium_policy_id' );\n\n\t\t//Meal Policy\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIMealPolicy,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_meal',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'meal_policy_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Policy' ), form_item_input, tab_user_date_total_column1, null, null, true );\n\t\tthis.detachElement( 'meal_policy_id' );\n\n\t\t//Break Policy\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIBreakPolicy,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_break',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'break_policy_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Policy' ), form_item_input, tab_user_date_total_column1, null, null, true );\n\t\tthis.detachElement( 'break_policy_id' );\n\n\t\t//Pay Code\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIPayCode,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_pay_code',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'pay_code_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Pay Code' ), form_item_input, tab_user_date_total_column1 );\n\n\t\t//Default Branch\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIBranch,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_branch',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'branch_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Branch' ), form_item_input, tab_user_date_total_column1, '', null, true );\n\n\t\tif ( !this.show_branch_ui ) {\n\t\t\tthis.detachElement( 'branch_id' );\n\t\t}\n\n\t\t//Department\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIDepartment,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_department',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'department_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Department' ), form_item_input, tab_user_date_total_column1, '', null, true );\n\n\t\tif ( !this.show_department_ui ) {\n\t\t\tthis.detachElement( 'department_id' );\n\t\t}\n\n\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\n\t\t\t//Job\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIJob,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_job',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tsetRealValueCallBack: ( function( val ) {\n\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\tjob_coder.setValue( val.manual_id );\n\t\t\t\t\t}\n\t\t\t\t} ),\n\t\t\t\tfield: 'job_id'\n\t\t\t} );\n\n\t\t\twidgetContainer = $( '
' );\n\n\t\t\tvar job_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\tjob_coder.TTextInput( { field: 'job_quick_search', disable_keyup_event: true } );\n\t\t\tjob_coder.addClass( 'job-coder' );\n\n\t\t\twidgetContainer.append( job_coder );\n\t\t\twidgetContainer.append( form_item_input );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Job' ), [form_item_input, job_coder], tab_user_date_total_column1, '', widgetContainer, true );\n\n\t\t\tif ( !this.show_job_ui ) {\n\t\t\t\tthis.detachElement( 'job_id' );\n\t\t\t}\n\n\t\t\t//Job Item\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIJobItem,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_job_item',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tsetRealValueCallBack: ( function( val ) {\n\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\tjob_item_coder.setValue( val.manual_id );\n\t\t\t\t\t}\n\t\t\t\t} ),\n\t\t\t\tfield: 'job_item_id'\n\t\t\t} );\n\n\t\t\twidgetContainer = $( '
' );\n\n\t\t\tvar job_item_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\tjob_item_coder.TTextInput( { field: 'job_item_quick_search', disable_keyup_event: true } );\n\t\t\tjob_item_coder.addClass( 'job-coder' );\n\n\t\t\twidgetContainer.append( job_item_coder );\n\t\t\twidgetContainer.append( form_item_input );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Task' ), [form_item_input, job_item_coder], tab_user_date_total_column1, '', widgetContainer, true );\n\n\t\t\tif ( !this.show_job_item_ui ) {\n\t\t\t\tthis.detachElement( 'job_item_id' );\n\t\t\t}\n\n\t\t\t//Punch Tag\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIPunchTag,\n\t\t\t\tallow_multiple_selection: true,\n\t\t\t\tlayout_name: 'global_punch_tag',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tget_real_data_on_multi: true,\n\t\t\t\tsetRealValueCallBack: ( ( punch_tags, get_real_data ) => {\n\t\t\t\t\tif ( punch_tags ) {\n\t\t\t\t\t\tthis.setPunchTagQuickSearchManualIds( punch_tags, get_real_data );\n\t\t\t\t\t}\n\t\t\t\t} ),\n\t\t\t\tfield: 'punch_tag_id'\n\t\t\t} );\n\n\t\t\twidgetContainer = $( '
' );\n\n\t\t\tvar punch_tag_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\tpunch_tag_coder.TTextInput( { field: 'punch_tag_quick_search', disable_keyup_event: true } );\n\t\t\tpunch_tag_coder.addClass( 'job-coder' );\n\n\t\t\twidgetContainer.append( punch_tag_coder );\n\t\t\twidgetContainer.append( form_item_input );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Tags' ), [form_item_input, punch_tag_coder], tab_user_date_total_column1, '', widgetContainer, true );\n\n\t\t\tif ( !this.show_punch_tag_ui ) {\n\t\t\t\tthis.detachElement( 'punch_tag_id' );\n\t\t\t}\n\t\t}\n\n\t\t//Start Date Time\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );\n\t\tform_item_input.TDatePicker( { field: 'start_time_stamp', mode: 'date_time' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Start Date/Time' ), form_item_input, tab_user_date_total_column2, '', null, true, true );\n\n\t\t//End Date Time\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );\n\t\tform_item_input.TDatePicker( { field: 'end_time_stamp', mode: 'date_time' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'End Date/Time' ), form_item_input, tab_user_date_total_column2, '', null, true, true );\n\n\t\t//Currency\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APICurrency,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_currency',\n\t\t\tshow_search_inputs: true,\n\t\t\tfield: 'currency_id',\n\t\t\tset_empty: true\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Currency' ), form_item_input, tab_user_date_total_column2 );\n\n\t\t//Base Hourly Rate\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'base_hourly_rate', width: 90 } );\n\n\t\twidgetContainer = $( '
' );\n\t\tvar currency = $( '' );\n\t\tvar code = $( '' );\n\t\twidgetContainer.append( currency );\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( code );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Base Hourly Rate' ), form_item_input, tab_user_date_total_column2, '', widgetContainer, true );\n\n\t\t//Hourly Rate\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'hourly_rate', width: 90 } );\n\n\t\twidgetContainer = $( '
' );\n\t\tcurrency = $( '' );\n\t\tcode = $( '' );\n\t\twidgetContainer.append( currency );\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( code );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Hourly Rate' ), form_item_input, tab_user_date_total_column2, '', widgetContainer, true );\n\n\t\t//Total Amount\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( { field: 'total_time_amount' } );\n\t\twidgetContainer = $( '
' );\n\t\tcurrency = $( '' );\n\t\tcode = $( '' );\n\t\twidgetContainer.append( currency );\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( code );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Total Amount' ), form_item_input, tab_user_date_total_column2, '', widgetContainer, true );\n\n\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\n\t\t\t//Quanitity\n\t\t\tvar good = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\tgood.TTextInput( { field: 'quantity', width: 50 } );\n\t\t\tgood.addClass( 'quantity-input' );\n\n\t\t\tvar good_label = $( '' + $.i18n._( 'Good' ) + ': ' );\n\n\t\t\tvar bad = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\tbad.TTextInput( { field: 'bad_quantity', width: 50 } );\n\t\t\tbad.addClass( 'quantity-input' );\n\n\t\t\tvar bad_label = $( '/ ' + $.i18n._( 'Bad' ) + ': ' );\n\n\t\t\twidgetContainer = $( '
' );\n\n\t\t\twidgetContainer.append( good_label );\n\t\t\twidgetContainer.append( good );\n\t\t\twidgetContainer.append( bad_label );\n\t\t\twidgetContainer.append( bad );\n\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Quantity' ), [good, bad], tab_user_date_total_column2, '', widgetContainer, true );\n\n\t\t\tif ( !this.show_bad_quantity_ui && !this.show_good_quantity_ui ) {\n\t\t\t\tthis.detachElement( 'quantity' );\n\t\t\t} else {\n\t\t\t\tif ( !this.show_bad_quantity_ui ) {\n\t\t\t\t\tbad_label.hide();\n\t\t\t\t\tbad.hide();\n\t\t\t\t}\n\n\t\t\t\tif ( !this.show_good_quantity_ui ) {\n\t\t\t\t\tgood_label.hide();\n\t\t\t\t\tgood.hide();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t//Note\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_AREA );\n\t\tform_item_input.TTextArea( { field: 'note', width: '100%' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Note' ), form_item_input, tab_user_date_total_column2, '', null, true, true );\n\t\tform_item_input.parent().width( '45%' );\n\n\t\tif ( !this.show_note_ui ) {\n\t\t\tthis.detachElement( 'note' );\n\t\t}\n\n\t\t//Override\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\tform_item_input.TCheckbox( { field: 'override' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Override' ), form_item_input, tab_user_date_total_column2, '', null, true, true );\n\t}\n\n\tcleanWhenUnloadView( callBack ) {\n\n\t\t$( '#user_date_total_view_container' ).remove();\n\t\tsuper.cleanWhenUnloadView( callBack );\n\n\t}\n}\n\nUserDateTotalViewController.loadView = function( container ) {\n\n\tGlobal.loadViewSource( 'UserDateTotal', 'UserDateTotalView.html', function( result ) {\n\n\t\tvar args = {};\n\t\tvar template = _.template( result );\n\n\t\tif ( Global.isSet( container ) ) {\n\t\t\tcontainer.html( template( args ) );\n\t\t} else {\n\t\t\tGlobal.contentContainer().html( template( args ) );\n\t\t}\n\n\t} );\n\n};\n\nUserDateTotalViewController.loadSubView = function( container, beforeViewLoadedFun, afterViewLoadedFun ) {\n\n\tGlobal.loadViewSource( 'UserDateTotal', 'SubUserDateTotalView.html', function( result ) {\n\n\t\tvar args = {};\n\t\tvar template = _.template( result );\n\n\t\tif ( Global.isSet( beforeViewLoadedFun ) ) {\n\t\t\tbeforeViewLoadedFun();\n\t\t}\n\n\t\tif ( Global.isSet( container ) ) {\n\t\t\tcontainer.html( template( args ) );\n\n\t\t\tif ( Global.isSet( afterViewLoadedFun ) ) {\n\n\t\t\t\tTTPromise.wait( 'BaseViewController', 'initialize', function() {\n\t\t\t\t\tafterViewLoadedFun( sub_user_date_total_view_controller );\n\t\t\t\t} );\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODI3LmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFPO0FBQ1AsMkJBQTJCO0FBQzNCLEVBQUUsQ0FBQztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixDQUFDO0FBQzVCLDBCQUEwQixDQUFDO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRyxDQUFDLDZDQUE2QyxDQUFDO0FBQ2xELElBQUk7QUFDSixHQUFHLENBQUM7QUFDSjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEseUJBQXlCLENBQUM7QUFDMUIsZ0NBQWdDLENBQUM7QUFDakM7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsbUJBQW1CLFNBQVM7QUFDNUI7O0FBRUE7QUFDQSxJQUFJLENBQUM7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtRkFBbUY7QUFDbkY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxDQUFDO0FBQ1AsTUFBTSxDQUFDO0FBQ1AsT0FBTztBQUNQLE1BQU0sQ0FBQztBQUNQLE1BQU0sQ0FBQztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGVBQWUscUNBQXFDO0FBQ2xGOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUJBQW1CLG1DQUFtQztBQUN0RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSw0QkFBNEIsU0FBUyxDQUFDLHdEQUF3RDtBQUM5RjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsMkJBQTJCLDJCQUEyQjtBQUN0RCw2QkFBNkIsQ0FBQzs7QUFFOUI7QUFDQTtBQUNBLGlDQUFpQyxzQkFBc0I7O0FBRXZELDZCQUE2QixDQUFDOztBQUU5QjtBQUNBO0FBQ0EsZ0NBQWdDLGdFQUFnRTs7QUFFaEcsNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7O0FBRUEsK0JBQStCLDBCQUEwQjtBQUN6RDtBQUNBLDZCQUE2QixDQUFDOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osNkJBQTZCLENBQUM7QUFDOUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLDZCQUE2QixDQUFDO0FBQzlCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSiw2QkFBNkIsQ0FBQztBQUM5Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osNkJBQTZCLENBQUM7QUFDOUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLDZCQUE2QixDQUFDO0FBQzlCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSiw2QkFBNkIsQ0FBQztBQUM5Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLDZCQUE2QixDQUFDOztBQUU5QjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxLQUFLOztBQUVMLHFCQUFxQixDQUFDOztBQUV0QjtBQUNBLDJCQUEyQix1REFBdUQ7QUFDbEY7O0FBRUE7QUFDQTtBQUNBLDhCQUE4QixDQUFDOztBQUUvQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxLQUFLOztBQUVMLHFCQUFxQixDQUFDOztBQUV0QjtBQUNBLGdDQUFnQyw0REFBNEQ7QUFDNUY7O0FBRUE7QUFDQTtBQUNBLDhCQUE4QixDQUFDOztBQUUvQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsS0FBSzs7QUFFTCxxQkFBcUIsQ0FBQzs7QUFFdEI7QUFDQSxpQ0FBaUMsNkRBQTZEO0FBQzlGOztBQUVBO0FBQ0E7QUFDQSw4QkFBOEIsQ0FBQzs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlDQUFpQywrQ0FBK0M7QUFDaEYsNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7QUFDQSxpQ0FBaUMsNkNBQTZDO0FBQzlFLDZCQUE2QixDQUFDOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7QUFDQSxnQ0FBZ0MsdUNBQXVDOztBQUV2RSxvQkFBb0IsQ0FBQztBQUNyQixpQkFBaUIsQ0FBQztBQUNsQixhQUFhLENBQUM7QUFDZDtBQUNBO0FBQ0E7O0FBRUEsNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7QUFDQSxnQ0FBZ0Msa0NBQWtDOztBQUVsRSxvQkFBb0IsQ0FBQztBQUNyQixhQUFhLENBQUM7QUFDZCxTQUFTLENBQUM7QUFDVjtBQUNBO0FBQ0E7O0FBRUEsNkJBQTZCLENBQUM7O0FBRTlCO0FBQ0E7QUFDQSwyQkFBMkIsNkJBQTZCO0FBQ3hELG9CQUFvQixDQUFDO0FBQ3JCLGFBQWEsQ0FBQztBQUNkLFNBQVMsQ0FBQztBQUNWO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixDQUFDOztBQUU5Qjs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCLCtCQUErQjtBQUNyRDs7QUFFQSxvQkFBb0IsQ0FBQywwQ0FBMEMsQ0FBQzs7QUFFaEU7QUFDQSxxQkFBcUIsbUNBQW1DO0FBQ3hEOztBQUVBLG1CQUFtQixDQUFDLDRDQUE0QyxDQUFDOztBQUVqRSxxQkFBcUIsQ0FBQzs7QUFFdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCLENBQUM7O0FBRS9CO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiwrQkFBK0I7QUFDOUQsNkJBQTZCLENBQUM7QUFDOUI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0Isb0JBQW9CO0FBQ25ELDZCQUE2QixDQUFDO0FBQzlCOztBQUVBOztBQUVBLEVBQUUsQ0FBQztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxpQkFBaUIsQ0FBQzs7QUFFbEI7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBLEdBQUc7O0FBRUg7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxpQkFBaUIsQ0FBQzs7QUFFbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTs7QUFFQSxHQUFHOztBQUVIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vaW50ZXJmYWNlL2h0bWw1L3ZpZXdzL2F0dGVuZGFuY2UvdGltZXNoZWV0L1VzZXJEYXRlVG90YWxWaWV3Q29udHJvbGxlci5qcz9iYzllIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBVc2VyRGF0ZVRvdGFsVmlld0NvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlVmlld0NvbnRyb2xsZXIge1xuXHRjb25zdHJ1Y3Rvciggb3B0aW9ucyA9IHt9ICkge1xuXHRcdF8uZGVmYXVsdHMoIG9wdGlvbnMsIHtcblx0XHRcdGVsOiAnI3VzZXJfZGF0ZV90b3RhbF92aWV3X2NvbnRhaW5lcicsIC8vTXVzdCBzZXQgZWwgaGVyZSBhbmQgY2FuIG9ubHkgc2V0IHN0cmluZywgc28gZXZlbnRzIGNhbiB3b3JrXG5cblx0XHRcdHB1bmNoX3RhZ19hcGk6IG51bGwsXG5cdFx0XHRkZWZhdWx0X3B1bmNoX3RhZzogW10sXG5cdFx0XHRwcmV2aW91c19wdW5jaF90YWdfc2VsZWN0aW9uOiBbXVxuXHRcdH0gKTtcblxuXHRcdHN1cGVyKCBvcHRpb25zICk7XG5cdH1cblxuXHRpbml0KCBvcHRpb25zICkge1xuXHRcdC8vdGhpcy5fc3VwZXIoJ2luaXRpYWxpemUnLCBvcHRpb25zICk7XG5cdFx0dGhpcy5lZGl0X3ZpZXdfdHBsID0gJ1VzZXJEYXRlVG90YWxFZGl0Vmlldy5odG1sJztcblx0XHR0aGlzLnBlcm1pc3Npb25faWQgPSAndXNlcl9kYXRlX3RvdGFsJztcblx0XHR0aGlzLnNjcmlwdF9uYW1lID0gJ1VzZXJEYXRlVG90YWxWaWV3Jztcblx0XHR0aGlzLnZpZXdJZCA9ICdVc2VyRGF0ZVRvdGFsJztcblx0XHR0aGlzLnRhYmxlX25hbWVfa2V5ID0gJ3VzZXJfZGF0ZV90b3RhbCc7XG5cdFx0dGhpcy5jb250ZXh0X21lbnVfbmFtZSA9ICQuaTE4bi5fKCAnQWNjdW11bGF0ZWQgVGltZScgKTtcblx0XHR0aGlzLm5hdmlnYXRpb25fbGFiZWwgPSAkLmkxOG4uXyggJ0FjY3VtdWxhdGVkIFRpbWUnICk7XG5cdFx0dGhpcy5hcGkgPSBUVEFQSS5BUElVc2VyRGF0ZVRvdGFsO1xuXHRcdHRoaXMuY3VycmVuY3lfYXBpID0gVFRBUEkuQVBJQ3VycmVuY3k7XG5cdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgKSB7XG5cdFx0XHR0aGlzLmpvYl9hcGkgPSBUVEFQSS5BUElKb2I7XG5cdFx0XHR0aGlzLmpvYl9pdGVtX2FwaSA9IFRUQVBJLkFQSUpvYkl0ZW07XG5cdFx0XHR0aGlzLnB1bmNoX3RhZ19hcGkgPSBUVEFQSS5BUElQdW5jaFRhZztcblx0XHR9XG5cblx0XHRpZiAoIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCB0aGlzLnBlcm1pc3Npb25faWQsICdhZGQnICkgfHwgUGVybWlzc2lvbk1hbmFnZXIudmFsaWRhdGUoIHRoaXMucGVybWlzc2lvbl9pZCwgJ2VkaXQnICkgKSB7XG5cdFx0XHQkKCB0aGlzLmVsICkuZmluZCggJy53YXJuaW5nLW1lc3NhZ2UnICkudGV4dCggJC5pMThuLl8oICdXQVJOSU5HOiBNYW51YWxseSBtb2RpZnlpbmcgQWNjdW11bGF0ZWQgVGltZSByZWNvcmRzIG1heSBwcmV2ZW50IHBvbGljaWVzIGZyb20gYmVpbmcgY2FsY3VsYXRlZCBwcm9wZXJseSBhbmQgc2hvdWxkIG9ubHkgYmUgZG9uZSBhcyBhIGxhc3QgcmVzb3J0IHdoZW4gaW5zdHJ1Y3RlZCB0byBkbyBzbyBieSBhIHN1cHBvcnQgcmVwcmVzZW50YXRpdmUuJyApICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCQoIHRoaXMuZWwgKS5maW5kKCAnLndhcm5pbmctbWVzc2FnZScgKS5oaWRlKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5pbml0UGVybWlzc2lvbigpO1xuXHRcdHRoaXMucmVuZGVyKCk7XG5cblx0XHRpZiAoIHRoaXMuc3ViX3ZpZXdfbW9kZSApIHtcblx0XHRcdHRoaXMuYnVpbGRDb250ZXh0TWVudSggdHJ1ZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmJ1aWxkQ29udGV4dE1lbnUoKTtcblx0XHR9XG5cblx0XHQvL2NhbGwgaW5pdCBkYXRhIGluIHBhcmVudCB2aWV3XG5cdFx0aWYgKCAhdGhpcy5zdWJfdmlld19tb2RlICkge1xuXHRcdFx0dGhpcy5pbml0RGF0YSgpO1xuXHRcdH1cblx0fVxuXG5cdHNldEdyaWRTaXplKCkge1xuXHRcdC8vIGlmICggKCAhdGhpcy5ncmlkIHx8ICF0aGlzLmdyaWQuZ3JpZC5pcyggJzp2aXNpYmxlJyApICkgKSB7XG5cdFx0Ly8gXHRyZXR1cm47XG5cdFx0Ly8gfVxuXHRcdC8vdGhpcy5ncmlkLmdyaWQuc2V0R3JpZFdpZHRoKCAkKCB0aGlzLmVsICkucGFyZW50KCkud2lkdGgoKSAtIDIgKTtcblxuXHRcdHZhciBtZXNzYWdlX29mZnNldCA9ICggJCggdGhpcy5lbCApLmZpbmQoICcud2FybmluZy1tZXNzYWdlJyApLm91dGVySGVpZ2h0KCkgKiAyICkgKyAyNztcblx0XHR0aGlzLmdyaWQuZ3JpZC5zZXRHcmlkSGVpZ2h0KCAkKCB0aGlzLmVsICkucGFyZW50cyggJyN0YWJfdXNlcl9kYXRlX3RvdGFsX3BhcmVudCcgKS5oZWlnaHQoKSAtIG1lc3NhZ2Vfb2Zmc2V0ICk7XG5cdH1cblxuXHRzZXRHcmlkQ2VsbEJhY2tHcm91bmQoKSB7XG5cblx0XHR2YXIgZGF0YSA9IHRoaXMuZ3JpZC5nZXRHcmlkUGFyYW0oICdkYXRhJyApO1xuXG5cdFx0Ly9FcnJvcjogVHlwZUVycm9yOiBkYXRhIGlzIHVuZGVmaW5lZCBpbiAvaW50ZXJmYWNlL2h0bWw1L2ZyYW1ld29yay9qcXVlcnkubWluLmpzP3Y9Ny40LjYtMjAxNDEwMjctMDc0MTI3IGxpbmUgMiA+IGV2YWwgbGluZSA3MFxuXHRcdGlmICggIWRhdGEgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGxlbiA9IGRhdGEubGVuZ3RoO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHR2YXIgaXRlbSA9IGRhdGFbaV07XG5cblx0XHRcdGlmICggaXRlbS5pc19vdmVycmlkZSA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0JCggJ3RyW2lkPVxcJycgKyBpdGVtLmlkICsgJ1xcJ10nICkuYWRkQ2xhc3MoICd1c2VyLWRhdGEtdG90YWwtb3ZlcnJpZGUnICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aW5pdE9wdGlvbnMoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHRoaXMuaW5pdERyb3BEb3duT3B0aW9uKCAnb2JqZWN0X3R5cGUnICk7XG5cdH1cblxuXHRnZXRDdXN0b21Db250ZXh0TWVudU1vZGVsKCkge1xuXHRcdHZhciBjb250ZXh0X21lbnVfbW9kZWwgPSB7XG5cdFx0XHRleGNsdWRlOiBbJ2NvcHknLCAnZXhwb3J0X2V4Y2VsJ10sXG5cdFx0XHRpbmNsdWRlOiBbJ2RlZmF1bHQnXVxuXHRcdH07XG5cblx0XHRyZXR1cm4gY29udGV4dF9tZW51X21vZGVsO1xuXHR9XG5cblx0b25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0LCBkb05vdFZhbGlkYXRlICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHR0aGlzLnNldElzQ2hhbmdlZCggdGFyZ2V0ICk7XG5cdFx0dGhpcy5zZXRNYXNzRWRpdGluZ0ZpZWxkc1doZW5Gb3JtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHR2YXIga2V5ID0gdGFyZ2V0LmdldEZpZWxkKCk7XG5cdFx0dmFyIGNfdmFsdWUgPSB0YXJnZXQuZ2V0VmFsdWUoKTtcblx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSA9IGNfdmFsdWU7XG5cblx0XHRzd2l0Y2ggKCBrZXkgKSB7XG5cdFx0XHRjYXNlICdvYmplY3RfdHlwZV9pZCc6XG5cdFx0XHRcdHRoaXMub25UeXBlQ2hhbmdlKCB0cnVlICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncmVndWxhcl9wb2xpY3lfaWQnOlxuXHRcdFx0Y2FzZSAnYWJzZW5jZV9wb2xpY3lfaWQnOlxuXHRcdFx0Y2FzZSAnb3ZlcnRpbWVfcG9saWN5X2lkJzpcblx0XHRcdGNhc2UgJ3ByZW1pdW1fcG9saWN5X2lkJzpcblx0XHRcdGNhc2UgJ2JyZWFrX3BvbGljeV9pZCc6XG5cdFx0XHRjYXNlICdtZWFsX3BvbGljeV9pZCc6XG5cdFx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5zcmNfb2JqZWN0X2lkID0gY192YWx1ZTtcblx0XHRcdFx0ZGVsZXRlIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldO1xuXHRcdFx0XHR0aGlzLm9uU3JjT2JqZWN0Q2hhbmdlKCBrZXkgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd0b3RhbF90aW1lJzpcblx0XHRcdFx0aWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudG90YWxfdGltZSA9PSAwICkge1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy5zdGFydF90aW1lX3N0YW1wLnNldFZhbHVlKCAnJyApO1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy5lbmRfdGltZV9zdGFtcC5zZXRWYWx1ZSggJycgKTtcblx0XHRcdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc3RhcnRfdGltZV9zdGFtcCA9ICcnO1xuXHRcdFx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5lbmRfdGltZV9zdGFtcCA9ICcnO1xuXG5cdFx0XHRcdFx0Ly9UcmlnZ2VyIG9uQ2hhbmdlIGV2ZW50IGZvciBhYm92ZSBmaWVsZHMsIHNvIGluIG1hc3MgZWRpdCB0aGV5IGFyZSBtYXJrZWQgYXMgY2hhbmdlZC5cblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljLnN0YXJ0X3RpbWVfc3RhbXAuZmluZCggJ2lucHV0JyApLnRyaWdnZXIoICdjaGFuZ2UnLCAnJyApO1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWMuZW5kX3RpbWVfc3RhbXAuZmluZCggJ2lucHV0JyApLnRyaWdnZXIoICdjaGFuZ2UnLCAnJyApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuY2FsY3VsYXRlQW1vdW50KCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnaG91cmx5X3JhdGUnOlxuXHRcdFx0XHR0aGlzLmNhbGN1bGF0ZUFtb3VudCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2pvYl9pZCc6XG5cdFx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApICkge1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snam9iX3F1aWNrX3NlYXJjaCddLnNldFZhbHVlKCB0YXJnZXQuZ2V0VmFsdWUoIHRydWUgKSA/ICggdGFyZ2V0LmdldFZhbHVlKCB0cnVlICkubWFudWFsX2lkID8gdGFyZ2V0LmdldFZhbHVlKCB0cnVlICkubWFudWFsX2lkIDogJycgKSA6ICcnICk7XG5cdFx0XHRcdFx0dGhpcy5zZXRKb2JJdGVtVmFsdWVXaGVuSm9iQ2hhbmdlZCggdGFyZ2V0LmdldFZhbHVlKCB0cnVlICksICdqb2JfaXRlbV9pZCcsIHtcblx0XHRcdFx0XHRcdHN0YXR1c19pZDogMTAsXG5cdFx0XHRcdFx0XHRqb2JfaWQ6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5qb2JfaWRcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydqb2JfcXVpY2tfc2VhcmNoJ10uc2V0Q2hlY2tCb3goIHRydWUgKTtcblx0XHRcdFx0XHR0aGlzLnNldFB1bmNoVGFnVmFsdWVzV2hlbkNyaXRlcmlhQ2hhbmdlZCggdGhpcy5nZXRQdW5jaFRhZ0ZpbHRlckRhdGEoKSwgJ3B1bmNoX3RhZ19pZCcgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnam9iX2l0ZW1faWQnOlxuXHRcdFx0XHRpZiAoICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSApIHtcblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ2pvYl9pdGVtX3F1aWNrX3NlYXJjaCddLnNldFZhbHVlKCB0YXJnZXQuZ2V0VmFsdWUoIHRydWUgKSA/ICggdGFyZ2V0LmdldFZhbHVlKCB0cnVlICkubWFudWFsX2lkID8gdGFyZ2V0LmdldFZhbHVlKCB0cnVlICkubWFudWFsX2lkIDogJycgKSA6ICcnICk7XG5cdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydqb2JfaXRlbV9xdWlja19zZWFyY2gnXS5zZXRDaGVja0JveCggdHJ1ZSApO1xuXHRcdFx0XHRcdHRoaXMuc2V0UHVuY2hUYWdWYWx1ZXNXaGVuQ3JpdGVyaWFDaGFuZ2VkKCB0aGlzLmdldFB1bmNoVGFnRmlsdGVyRGF0YSgpLCAncHVuY2hfdGFnX2lkJyApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncHVuY2hfdGFnX2lkJzpcblx0XHRcdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBjX3ZhbHVlICE9PSBUVFVVSUQuemVyb19pZCAmJiBjX3ZhbHVlICE9PSBmYWxzZSAmJiBjX3ZhbHVlLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNldFB1bmNoVGFnUXVpY2tTZWFyY2hNYW51YWxJZHMoIHRhcmdldC5nZXRTZWxlY3RJdGVtcygpICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1sncHVuY2hfdGFnX3F1aWNrX3NlYXJjaCddLnNldFZhbHVlKCAnJyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQkdGhpcy5wcmV2aW91c19wdW5jaF90YWdfc2VsZWN0aW9uID0gY192YWx1ZTtcblx0XHRcdFx0XHQvL1Jlc2V0IHNvdXJjZSBkYXRhIHRvIG1ha2Ugc3VyZSBjb3JyZWN0IHB1bmNoIHRhZ3MgYXJlIGFsd2F5cyBzaG93bi5cblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ3B1bmNoX3RhZ19pZCddLnNldFNvdXJjZURhdGEoIG51bGwgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3VzZXJfaWQnOlxuXHRcdFx0Y2FzZSAnYnJhbmNoX2lkJzpcblx0XHRcdGNhc2UgJ2RlcGFydG1lbnRfaWQnOlxuXHRcdFx0XHRpZiAoICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSApIHtcblx0XHRcdFx0XHR0aGlzLnNldFB1bmNoVGFnVmFsdWVzV2hlbkNyaXRlcmlhQ2hhbmdlZCggdGhpcy5nZXRQdW5jaFRhZ0ZpbHRlckRhdGEoKSwgJ3B1bmNoX3RhZ19pZCcgKTtcblx0XHRcdFx0XHR0aGlzLnNldEpvYlZhbHVlV2hlbkNyaXRlcmlhQ2hhbmdlZCggJ2pvYl9pZCcsIHtcblx0XHRcdFx0XHRcdHN0YXR1c19pZDogMTAsXG5cdFx0XHRcdFx0XHR1c2VyX2lkOiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZCxcblx0XHRcdFx0XHRcdHB1bmNoX2JyYW5jaF9pZDogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmJyYW5jaF9pZCxcblx0XHRcdFx0XHRcdHB1bmNoX2RlcGFydG1lbnRfaWQ6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5kZXBhcnRtZW50X2lkXG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnam9iX3F1aWNrX3NlYXJjaCc6XG5cdFx0XHRjYXNlICdqb2JfaXRlbV9xdWlja19zZWFyY2gnOlxuXHRcdFx0XHRpZiAoICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSApIHtcblx0XHRcdFx0XHR0aGlzLm9uSm9iUXVpY2tTZWFyY2goIGtleSwgY192YWx1ZSApO1xuXHRcdFx0XHRcdFRUUHJvbWlzZS53YWl0KCAnQmFzZVZpZXdDb250cm9sbGVyJywgJ29uSm9iUXVpY2tTZWFyY2gnLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdCR0aGlzLnNldFB1bmNoVGFnVmFsdWVzV2hlbkNyaXRlcmlhQ2hhbmdlZCggJHRoaXMuZ2V0UHVuY2hUYWdGaWx0ZXJEYXRhKCksICdwdW5jaF90YWdfaWQnICk7XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdC8vRG9uJ3QgdmFsaWRhdGUgaW1tZWRpYXRlbHkgYXMgb25Kb2JRdWlja1NlYXJjaCBpcyBkb2luZyBhc3luYyBBUEkgY2FsbHMsIGFuZCBpdCB3b3VsZCBjYXVzZSBhIGd1YXJhbnRlZWQgdmFsaWRhdGlvbiBmYWlsdXJlLlxuXHRcdFx0XHRcdGRvTm90VmFsaWRhdGUgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAncHVuY2hfdGFnX3F1aWNrX3NlYXJjaCc6XG5cdFx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApICkge1xuXHRcdFx0XHRcdHRoaXMub25QdW5jaFRhZ1F1aWNrU2VhcmNoKCBjX3ZhbHVlLCB0aGlzLmdldFB1bmNoVGFnRmlsdGVyRGF0YSgpLCAncHVuY2hfdGFnX2lkJyApO1xuXG5cdFx0XHRcdFx0Ly9Eb24ndCB2YWxpZGF0ZSBpbW1lZGlhdGVseSBhcyBvblB1bmNoVGFnUXVpY2tTZWFyY2ggaXMgZG9pbmcgYXN5bmMgQVBJIGNhbGxzLCBhbmQgaXQgd291bGQgY2F1c2UgYSBndWFyYW50ZWVkIHZhbGlkYXRpb24gZmFpbHVyZS5cblx0XHRcdFx0XHRkb05vdFZhbGlkYXRlID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRpZiAoIGtleSAhPT0gJ292ZXJyaWRlJyApIHtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy5vdmVycmlkZS5zZXRWYWx1ZSggdHJ1ZSApO1xuXHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLm92ZXJyaWRlID0gdHJ1ZTtcblx0XHRcdHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWMub3ZlcnJpZGUuZmluZCggJ2lucHV0JyApLnRyaWdnZXIoICdjaGFuZ2UnLCAnMScgKTsgLy9UcmlnZ2VyIG9uQ2hhbmdlIGV2ZW50IGZvciBhYm92ZSBmaWVsZHMsIHNvIGluIG1hc3MgZWRpdCB0aGV5IGFyZSBtYXJrZWQgYXMgY2hhbmdlZC5cblx0XHR9XG5cblx0XHRpZiAoICFkb05vdFZhbGlkYXRlICkge1xuXHRcdFx0dGhpcy52YWxpZGF0ZSgpO1xuXHRcdH1cblx0fVxuXG5cdGNhbGN1bGF0ZUFtb3VudCgpIHtcblx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudG90YWxfdGltZV9hbW91bnQgPSAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC50b3RhbF90aW1lIC8gMzYwMCApICogcGFyc2VGbG9hdCggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmhvdXJseV9yYXRlICk7XG5cdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljLnRvdGFsX3RpbWVfYW1vdW50LnNldFZhbHVlKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudG90YWxfdGltZV9hbW91bnQudG9GaXhlZCggNCApICk7XG5cdH1cblxuXHRvbkFkZENsaWNrKCkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dGhpcy5zZXRDdXJyZW50RWRpdFZpZXdTdGF0ZSggJ25ldycgKTtcblx0XHQkdGhpcy5vcGVuRWRpdFZpZXcoKTtcblxuXHRcdC8vRXJyb3I6IFVuY2F1Z2h0IFR5cGVFcnJvcjogdW5kZWZpbmVkIGlzIG5vdCBhIGZ1bmN0aW9uIGluIC9pbnRlcmZhY2UvaHRtbDUvdmlld3MvQmFzZVZpZXdDb250cm9sbGVyLmpzP3Y9OC4wLjAtMjAxNDExMTctMTExMTQwIGxpbmUgODk3XG5cdFx0aWYgKCAkdGhpcy5hcGkgKSB7XG5cdFx0XHQkdGhpcy5hcGlbJ2dldCcgKyAkdGhpcy5hcGkua2V5X25hbWUgKyAnRGVmYXVsdERhdGEnXShcblx0XHRcdFx0dGhpcy5wYXJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZCxcblx0XHRcdFx0dGhpcy5wYXJlbnRfZWRpdF9yZWNvcmQuZGF0ZV9zdGFtcCwge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0JHRoaXMub25BZGRSZXN1bHQoIHJlc3VsdCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdH1cblx0fVxuXG5cdG9uQWRkUmVzdWx0KCByZXN1bHQgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cblx0XHRpZiAoICFyZXN1bHRfZGF0YSApIHtcblx0XHRcdHJlc3VsdF9kYXRhID0gW107XG5cdFx0fVxuXG5cdFx0cmVzdWx0X2RhdGEuY29tcGFueSA9IExvY2FsQ2FjaGVEYXRhLmN1cnJlbnRfY29tcGFueS5uYW1lO1xuXG5cdFx0aWYgKCAkdGhpcy5zdWJfdmlld19tb2RlICYmICR0aGlzLnBhcmVudF9rZXkgKSB7XG5cdFx0XHRyZXN1bHRfZGF0YVskdGhpcy5wYXJlbnRfa2V5XSA9ICR0aGlzLnBhcmVudF92YWx1ZTtcblx0XHR9XG5cblx0XHRpZiAoICFyZXN1bHRfZGF0YS5kYXRlX3N0YW1wICkge1xuXHRcdFx0cmVzdWx0X2RhdGEuZGF0ZV9zdGFtcCA9IHRoaXMucGFyZW50X2VkaXRfcmVjb3JkLmRhdGVfc3RhbXA7XG5cdFx0fVxuXG5cdFx0JHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCA9IHJlc3VsdF9kYXRhO1xuXHRcdCR0aGlzLmluaXRFZGl0VmlldygpO1xuXHR9XG5cblx0LyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuXHRpbml0UGVybWlzc2lvbigpIHtcblx0XHRzdXBlci5pbml0UGVybWlzc2lvbigpO1xuXG5cdFx0aWYgKCB0aGlzLmpvYlVJVmFsaWRhdGUoKSApIHtcblx0XHRcdHRoaXMuc2hvd19qb2JfdWkgPSB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNob3dfam9iX3VpID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmpvYkl0ZW1VSVZhbGlkYXRlKCkgKSB7XG5cdFx0XHR0aGlzLnNob3dfam9iX2l0ZW1fdWkgPSB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNob3dfam9iX2l0ZW1fdWkgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMucHVuY2hUYWdVSVZhbGlkYXRlKCkgKSB7XG5cdFx0XHR0aGlzLnNob3dfcHVuY2hfdGFnX3VpID0gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zaG93X3B1bmNoX3RhZ191aSA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5icmFuY2hVSVZhbGlkYXRlKCkgKSB7XG5cdFx0XHR0aGlzLnNob3dfYnJhbmNoX3VpID0gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zaG93X2JyYW5jaF91aSA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5kZXBhcnRtZW50VUlWYWxpZGF0ZSgpICkge1xuXHRcdFx0dGhpcy5zaG93X2RlcGFydG1lbnRfdWkgPSB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNob3dfZGVwYXJ0bWVudF91aSA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5nb29kUXVhbnRpdHlVSVZhbGlkYXRlKCkgKSB7XG5cdFx0XHR0aGlzLnNob3dfZ29vZF9xdWFudGl0eV91aSA9IHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2hvd19nb29kX3F1YW50aXR5X3VpID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJhZFF1YW50aXR5VUlWYWxpZGF0ZSgpICkge1xuXHRcdFx0dGhpcy5zaG93X2JhZF9xdWFudGl0eV91aSA9IHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2hvd19iYWRfcXVhbnRpdHlfdWkgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMubm90ZVVJVmFsaWRhdGUoKSApIHtcblx0XHRcdHRoaXMuc2hvd19ub3RlX3VpID0gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zaG93X25vdGVfdWkgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRub3RlVUlWYWxpZGF0ZSggcF9pZCApIHtcblxuXHRcdGlmICggIXBfaWQgKSB7XG5cdFx0XHRwX2lkID0gJ3B1bmNoJztcblx0XHR9XG5cblx0XHRpZiAoIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCBwX2lkLCAnZWRpdF9ub3RlJyApICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGJyYW5jaFVJVmFsaWRhdGUoIHBfaWQgKSB7XG5cblx0XHRpZiAoICFwX2lkICkge1xuXHRcdFx0cF9pZCA9ICdwdW5jaCc7XG5cdFx0fVxuXG5cdFx0aWYgKCBQZXJtaXNzaW9uTWFuYWdlci52YWxpZGF0ZSggcF9pZCwgJ2VkaXRfYnJhbmNoJyApICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGRlcGFydG1lbnRVSVZhbGlkYXRlKCBwX2lkICkge1xuXG5cdFx0aWYgKCAhcF9pZCApIHtcblx0XHRcdHBfaWQgPSAncHVuY2gnO1xuXHRcdH1cblxuXHRcdGlmICggUGVybWlzc2lvbk1hbmFnZXIudmFsaWRhdGUoIHBfaWQsICdlZGl0X2RlcGFydG1lbnQnICkgKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0am9iVUlWYWxpZGF0ZSggcF9pZCApIHtcblxuXHRcdGlmICggIXBfaWQgKSB7XG5cdFx0XHRwX2lkID0gJ3B1bmNoJztcblx0XHR9XG5cblx0XHRpZiAoIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCAnam9iJywgJ2VuYWJsZWQnICkgJiZcblx0XHRcdFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCBwX2lkLCAnZWRpdF9qb2InICkgKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0am9iSXRlbVVJVmFsaWRhdGUoIHBfaWQgKSB7XG5cblx0XHRpZiAoICFwX2lkICkge1xuXHRcdFx0cF9pZCA9ICdwdW5jaCc7XG5cdFx0fVxuXG5cdFx0aWYgKCBQZXJtaXNzaW9uTWFuYWdlci52YWxpZGF0ZSggcF9pZCwgJ2VkaXRfam9iX2l0ZW0nICkgKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cHVuY2hUYWdVSVZhbGlkYXRlKCBwX2lkICkge1xuXG5cdFx0aWYgKCAhcF9pZCApIHtcblx0XHRcdHBfaWQgPSAncHVuY2gnO1xuXHRcdH1cblxuXHRcdGlmICggUGVybWlzc2lvbk1hbmFnZXIudmFsaWRhdGUoIHBfaWQsICdlZGl0X3B1bmNoX3RhZycgKSApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRnb29kUXVhbnRpdHlVSVZhbGlkYXRlKCBwX2lkICkge1xuXG5cdFx0aWYgKCAhcF9pZCApIHtcblx0XHRcdHBfaWQgPSAncHVuY2gnO1xuXHRcdH1cblxuXHRcdGlmICggUGVybWlzc2lvbk1hbmFnZXIudmFsaWRhdGUoIHBfaWQsICdlZGl0X3F1YW50aXR5JyApICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGJhZFF1YW50aXR5VUlWYWxpZGF0ZSggcF9pZCApIHtcblxuXHRcdGlmICggIXBfaWQgKSB7XG5cdFx0XHRwX2lkID0gJ3B1bmNoJztcblx0XHR9XG5cblx0XHRpZiAoIFBlcm1pc3Npb25NYW5hZ2VyLnZhbGlkYXRlKCBwX2lkLCAnZWRpdF9xdWFudGl0eScgKSAmJlxuXHRcdFx0UGVybWlzc2lvbk1hbmFnZXIudmFsaWRhdGUoIHBfaWQsICdlZGl0X2JhZF9xdWFudGl0eScgKSApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRzZXRDdXJyZW5jeSgpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdGlmICggR2xvYmFsLmlzU2V0KCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZCApICkge1xuXHRcdFx0dmFyIGZpbHRlciA9IHt9O1xuXHRcdFx0ZmlsdGVyLmZpbHRlcl9kYXRhID0geyB1c2VyX2lkOiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudXNlcl9pZCB9O1xuXHRcdFx0dGhpcy5jdXJyZW5jeV9hcGkuZ2V0Q3VycmVuY3koIGZpbHRlciwgZmFsc2UsIGZhbHNlLCB7XG5cdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdHJlcyA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRpZiAoIEdsb2JhbC5pc0FycmF5KCByZXMgKSApIHtcblx0XHRcdFx0XHRcdCQoICcudXNlckRhdGVUb3RhbC1jdXJyZW5jeScgKS50ZXh0KCByZXNbMF0uc3ltYm9sICk7XG5cdFx0XHRcdFx0XHQkKCAnLnVzZXJEYXRlVG90YWwtY29kZScgKS50ZXh0KCByZXNbMF0uaXNvX2NvZGUgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0JCggJy51c2VyRGF0ZVRvdGFsLWN1cnJlbmN5JyApLnRleHQoICcnICk7XG5cdFx0XHRcdFx0XHQkKCAnLnVzZXJEYXRlVG90YWwtY29kZScgKS50ZXh0KCAnJyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblx0fVxuXG5cdHNldEN1cnJlbnRFZGl0UmVjb3JkRGF0YSgpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHRoaXMuc2V0Q3VycmVuY3koKTtcblx0XHQvL1NldCBjdXJyZW50IGVkaXQgcmVjb3JkIGRhdGEgdG8gYWxsIHdpZGdldHNcblx0XHRmb3IgKCB2YXIga2V5IGluIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCApIHtcblxuXHRcdFx0aWYgKCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmhhc093blByb3BlcnR5KCBrZXkgKSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHR2YXIgd2lkZ2V0ID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljW2tleV07XG5cdFx0XHRzd2l0Y2ggKCBrZXkgKSB7XG5cdFx0XHRcdGNhc2UgJ3VzZXJfaWQnOlxuXHRcdFx0XHRcdHZhciBjdXJyZW50X3dpZGdldCA9IHRoaXMuZWRpdF92aWV3X3VpX2RpY1snZmlyc3RfbGFzdF9uYW1lJ107XG5cdFx0XHRcdFx0VFRBUEkuQVBJVXNlci5nZXRVc2VyKCB7IGZpbHRlcl9kYXRhOiB7IGlkOiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSB9IH0sIHtcblx0XHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXG5cdFx0XHRcdFx0XHRcdGlmICggcmVzdWx0LmlzVmFsaWQoKSApIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgdXNlcl9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpWzBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly9FcnJvcjogVW5hYmxlIHRvIGdldCBwcm9wZXJ0eSAnZmlyc3RfbmFtZScgb2YgdW5kZWZpbmVkIG9yIG51bGwgcmVmZXJlbmNlIGluIC9pbnRlcmZhY2UvaHRtbDUvIGxpbmUgNTExXG5cdFx0XHRcdFx0XHRcdGlmICggdXNlcl9kYXRhICYmIHVzZXJfZGF0YS5maXJzdF9uYW1lICkge1xuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRfd2lkZ2V0LnNldFZhbHVlKCB1c2VyX2RhdGEuZmlyc3RfbmFtZSArICcgJyArIHVzZXJfZGF0YS5sYXN0X25hbWUgKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50X3dpZGdldC5zZXRWYWx1ZSggJycgKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdqb2JfaWQnOlxuXHRcdFx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApICkge1xuXHRcdFx0XHRcdFx0dmFyIGFyZ3MgPSB7fTtcblx0XHRcdFx0XHRcdGFyZ3MuZmlsdGVyX2RhdGEgPSB7XG5cdFx0XHRcdFx0XHRcdHN0YXR1c19pZDogMTAsXG5cdFx0XHRcdFx0XHRcdHVzZXJfaWQ6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC51c2VyX2lkLFxuXHRcdFx0XHRcdFx0XHRwdW5jaF9icmFuY2hfaWQ6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5icmFuY2hfaWQsXG5cdFx0XHRcdFx0XHRcdHB1bmNoX2RlcGFydG1lbnRfaWQ6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5kZXBhcnRtZW50X2lkXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0d2lkZ2V0LnNldERlZmF1bHRBcmdzKCBhcmdzICk7XG5cdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdkYXRlX3N0YW1wJzpcblx0XHRcdFx0XHR3aWRnZXQuc2V0RW5hYmxlZCggZmFsc2UgKTtcblx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3B1bmNoX3RhZ19pZCc6XG5cdFx0XHRcdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgKSB7XG5cdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldICk7XG5cdFx0XHRcdFx0XHR0aGlzLnByZXZpb3VzX3B1bmNoX3RhZ19zZWxlY3Rpb24gPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XTtcblxuXHRcdFx0XHRcdFx0dmFyIHB1bmNoX3RhZ193aWRnZXQgPSB3aWRnZXQ7XG5cdFx0XHRcdFx0XHRUVFByb21pc2Uud2FpdCggbnVsbCwgbnVsbCwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdC8vVXBkYXRlIGRlZmF1bHQgYXJncyBmb3IgcHVuY2ggdGFncyBBQ29tYm9Cb3ggbGFzdCBhcyB0aGV5IHJlbHkgb24gZGF0YSBmcm9tIGpvYiwgam9iIGl0ZW0gYW5kIHJlbGF0ZWQgZmllbGRzLlxuXHRcdFx0XHRcdFx0XHR2YXIgYXJncyA9IHt9O1xuXHRcdFx0XHRcdFx0XHRhcmdzLmZpbHRlcl9kYXRhID0gJHRoaXMuZ2V0UHVuY2hUYWdGaWx0ZXJEYXRhKCk7XG5cdFx0XHRcdFx0XHRcdHB1bmNoX3RhZ193aWRnZXQuc2V0RGVmYXVsdEFyZ3MoIGFyZ3MgKTtcblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0aWYgKCB3aWRnZXQgKSB7XG5cdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuY29sbGVjdFVJRGF0YVRvQ3VycmVudEVkaXRSZWNvcmQoKTtcblx0XHR0aGlzLnNldEVkaXRWaWV3RGF0YURvbmUoKTtcblx0fVxuXG5cdHNldEVkaXRWaWV3RGF0YURvbmUoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRzdXBlci5zZXRFZGl0Vmlld0RhdGFEb25lKCk7XG5cdFx0dGhpcy5vblR5cGVDaGFuZ2UoKTtcblx0fVxuXG5cdG9uVHlwZUNoYW5nZSggcmVzZXQgKSB7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAncmVndWxhcl9wb2xpY3lfaWQnICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnYWJzZW5jZV9wb2xpY3lfaWQnICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnb3ZlcnRpbWVfcG9saWN5X2lkJyApO1xuXHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ3ByZW1pdW1fcG9saWN5X2lkJyApO1xuXHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ21lYWxfcG9saWN5X2lkJyApO1xuXHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ2JyZWFrX3BvbGljeV9pZCcgKTtcblx0XHR2YXIga2V5ID0gJyc7XG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ29iamVjdF90eXBlX2lkJ10gPT0gMjAgKSB7XG5cdFx0XHRrZXkgPSAncmVndWxhcl9wb2xpY3lfaWQnO1xuXHRcdH0gZWxzZSBpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnb2JqZWN0X3R5cGVfaWQnXSA9PSAyNSB8fCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ29iamVjdF90eXBlX2lkJ10gPT0gNTAgKSB7XG5cdFx0XHRrZXkgPSAnYWJzZW5jZV9wb2xpY3lfaWQnO1xuXHRcdH0gZWxzZSBpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnb2JqZWN0X3R5cGVfaWQnXSA9PSAzMCApIHtcblx0XHRcdGtleSA9ICdvdmVydGltZV9wb2xpY3lfaWQnO1xuXHRcdH0gZWxzZSBpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnb2JqZWN0X3R5cGVfaWQnXSA9PSA0MCApIHtcblx0XHRcdGtleSA9ICdwcmVtaXVtX3BvbGljeV9pZCc7XG5cdFx0fSBlbHNlIGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydvYmplY3RfdHlwZV9pZCddID09IDEwMCB8fCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ29iamVjdF90eXBlX2lkJ10gPT0gMTAxICkge1xuXHRcdFx0a2V5ID0gJ21lYWxfcG9saWN5X2lkJztcblx0XHR9IGVsc2UgaWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ29iamVjdF90eXBlX2lkJ10gPT0gMTEwIHx8IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnb2JqZWN0X3R5cGVfaWQnXSA9PSAxMTEgKSB7XG5cdFx0XHRrZXkgPSAnYnJlYWtfcG9saWN5X2lkJztcblx0XHR9XG5cdFx0aWYgKCBrZXkgKSB7XG5cdFx0XHR0aGlzLmF0dGFjaEVsZW1lbnQoIGtleSApO1xuXHRcdFx0aWYgKCByZXNldCApIHtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljW2tleV0uc2V0VmFsdWUoICcnICk7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1sncGF5X2NvZGVfaWQnXS5zZXRWYWx1ZSggJycgKTtcblx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnNyY19vYmplY3RfaWQgPSBmYWxzZTtcblx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnBheV9jb2RlX2lkID0gZmFsc2U7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1sncGF5X2NvZGVfaWQnXS5zZXRFbmFibGVkKCB0cnVlICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc3JjX29iamVjdF9pZCApIHtcblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljW2tleV0uc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5zcmNfb2JqZWN0X2lkICk7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1sncGF5X2NvZGVfaWQnXS5zZXRFbmFibGVkKCBmYWxzZSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ3BheV9jb2RlX2lkJ10uc2V0RW5hYmxlZCggdHJ1ZSApO1xuXHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnNyY19vYmplY3RfaWQgPSBmYWxzZTtcblx0XHR9XG5cdFx0dGhpcy5lZGl0RmllbGRSZXNpemUoKTtcblx0fVxuXG5cdG9uU3JjT2JqZWN0Q2hhbmdlKCBrZXkgKSB7XG5cdFx0dmFyIGZ1bGxfdmFsdWUgPSB0aGlzLmVkaXRfdmlld191aV9kaWNba2V5XS5nZXRWYWx1ZSggdHJ1ZSApO1xuXHRcdGlmICggZnVsbF92YWx1ZSAmJiBmdWxsX3ZhbHVlLnBheV9jb2RlX2lkICkge1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydwYXlfY29kZV9pZCddLnNldEVuYWJsZWQoIGZhbHNlICk7XG5cdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ3BheV9jb2RlX2lkJ10uc2V0VmFsdWUoIGZ1bGxfdmFsdWUucGF5X2NvZGVfaWQgKTtcblx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5wYXlfY29kZV9pZCA9IGZ1bGxfdmFsdWUucGF5X2NvZGVfaWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1sncGF5X2NvZGVfaWQnXS5zZXRFbmFibGVkKCB0cnVlICk7XG5cdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ3BheV9jb2RlX2lkJ10uc2V0VmFsdWUoICcnICk7XG5cdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQucGF5X2NvZGVfaWQgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRzZWFyY2goIHNldF9kZWZhdWx0X21lbnUsIHBhZ2VfYWN0aW9uLCBwYWdlX251bWJlciwgY2FsbEJhY2sgKSB7XG5cdFx0dGhpcy5yZWZyZXNoX2lkID0gbnVsbDtcblx0XHRzdXBlci5zZWFyY2goIHNldF9kZWZhdWx0X21lbnUsIHBhZ2VfYWN0aW9uLCBwYWdlX251bWJlciwgY2FsbEJhY2sgKTtcblx0fVxuXG5cdGdldFByb3Blck9iamVjdFR5cGUoKSB7XG5cdFx0dmFyIGFycmF5ID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLm9iamVjdF90eXBlX2FycmF5Lmxlbmd0aDsgaSsrICkge1xuXHRcdFx0dmFyIGl0ZW0gPSB0aGlzLm9iamVjdF90eXBlX2FycmF5W2ldO1xuXG5cdFx0XHRpZiAoIGl0ZW0udmFsdWUgPT0gMjAgfHxcblx0XHRcdFx0aXRlbS52YWx1ZSA9PSAyNSB8fFxuXHRcdFx0XHRpdGVtLnZhbHVlID09IDMwIHx8XG5cdFx0XHRcdGl0ZW0udmFsdWUgPT0gNDAgfHxcblx0XHRcdFx0aXRlbS52YWx1ZSA9PSAxMDAgfHxcblx0XHRcdFx0aXRlbS52YWx1ZSA9PSAxMTAgKSB7XG5cdFx0XHRcdGFycmF5LnB1c2goIGl0ZW0gKTtcblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBhcnJheTtcblx0fVxuXG5cdGJ1aWxkRWRpdFZpZXdVSSgpIHtcblxuXHRcdHN1cGVyLmJ1aWxkRWRpdFZpZXdVSSgpO1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHZhciB0YWJfbW9kZWwgPSB7XG5cdFx0XHQndGFiX3VzZXJfZGF0ZV90b3RhbCc6IHsgJ2xhYmVsJzogJC5pMThuLl8oICdBY2N1bXVsYXRlZCBUaW1lJyApLCAnaXNfbXVsdGlfY29sdW1uJzogdHJ1ZSB9LFxuXHRcdFx0J3RhYl9hdWRpdCc6IHRydWUsXG5cdFx0fTtcblx0XHR0aGlzLnNldFRhYk1vZGVsKCB0YWJfbW9kZWwgKTtcblxuXHRcdHRoaXMubmF2aWdhdGlvbi5BQ29tYm9Cb3goIHtcblx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJVXNlckRhdGVUb3RhbCxcblx0XHRcdGlkOiB0aGlzLnNjcmlwdF9uYW1lICsgJ19uYXZpZ2F0aW9uJyxcblx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF93YWdlJyxcblx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdG5hdmlnYXRpb25fbW9kZTogdHJ1ZVxuXHRcdH0gKTtcblxuXHRcdHRoaXMuc2V0TmF2aWdhdGlvbigpO1xuXG5cdFx0dmFyIGZvcm1faXRlbV9pbnB1dDtcblx0XHR2YXIgd2lkZ2V0Q29udGFpbmVyO1xuXG5cdFx0Ly9UYWIgMCBzdGFydFxuXHRcdHZhciB0YWJfdXNlcl9kYXRlX3RvdGFsID0gdGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX3VzZXJfZGF0ZV90b3RhbCcgKTtcblxuXHRcdHZhciB0YWJfdXNlcl9kYXRlX3RvdGFsX2NvbHVtbjEgPSB0YWJfdXNlcl9kYXRlX3RvdGFsLmZpbmQoICcuZmlyc3QtY29sdW1uJyApO1xuXHRcdHZhciB0YWJfdXNlcl9kYXRlX3RvdGFsX2NvbHVtbjIgPSB0YWJfdXNlcl9kYXRlX3RvdGFsLmZpbmQoICcuc2Vjb25kLWNvbHVtbicgKTtcblxuXHRcdC8vRW1wbG95ZWVcblxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2ZpcnN0X2xhc3RfbmFtZScgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRW1wbG95ZWUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3VzZXJfZGF0ZV90b3RhbF9jb2x1bW4xLCAnJyApO1xuXG5cdFx0Ly9EYXRlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5EQVRFX1BJQ0tFUiApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5URGF0ZVBpY2tlciggeyBmaWVsZDogJ2RhdGVfc3RhbXAnIH0gKTtcblxuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRGF0ZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfdXNlcl9kYXRlX3RvdGFsX2NvbHVtbjEgKTtcblxuXHRcdC8vVGltZVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAndG90YWxfdGltZScsIG1vZGU6ICd0aW1lX3VuaXQnLCBuZWVkX3BhcnNlcl9zZWM6IHRydWUgfSApO1xuXG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdUaW1lJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl91c2VyX2RhdGVfdG90YWxfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vVHlwZVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuVENvbWJvQm94KCB7IGZpZWxkOiAnb2JqZWN0X3R5cGVfaWQnIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggdGhpcy5nZXRQcm9wZXJPYmplY3RUeXBlKCkgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1R5cGUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3VzZXJfZGF0ZV90b3RhbF9jb2x1bW4xICk7XG5cblx0XHQvL1JlZ3VsYXIgUG9saWN5XG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJUmVndWxhclRpbWVQb2xpY3ksXG5cdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfcmVndWxhcl90aW1lJyxcblx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdGZpZWxkOiAncmVndWxhcl9wb2xpY3lfaWQnXG5cdFx0fSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnUG9saWN5JyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl91c2VyX2RhdGVfdG90YWxfY29sdW1uMSwgbnVsbCwgbnVsbCwgdHJ1ZSApO1xuXHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ3JlZ3VsYXJfcG9saWN5X2lkJyApO1xuXG5cdFx0Ly9BYnNlbmNlIFBvbGljeVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSUFic2VuY2VQb2xpY3ksXG5cdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfYWJzZW5jZXMnLFxuXHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0ZmllbGQ6ICdhYnNlbmNlX3BvbGljeV9pZCdcblx0XHR9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQb2xpY3knICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3VzZXJfZGF0ZV90b3RhbF9jb2x1bW4xLCBudWxsLCBudWxsLCB0cnVlICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnYWJzZW5jZV9wb2xpY3lfaWQnICk7XG5cblx0XHQvL092ZXJ0aW1lIFBvbGljeVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSU92ZXJUaW1lUG9saWN5LFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX292ZXJfdGltZScsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRmaWVsZDogJ292ZXJ0aW1lX3BvbGljeV9pZCdcblx0XHR9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQb2xpY3knICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3VzZXJfZGF0ZV90b3RhbF9jb2x1bW4xLCBudWxsLCBudWxsLCB0cnVlICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnb3ZlcnRpbWVfcG9saWN5X2lkJyApO1xuXG5cdFx0Ly9QcmVtaXVtIFBvbGljeVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVByZW1pdW1Qb2xpY3ksXG5cdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfcHJlbWl1bScsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRmaWVsZDogJ3ByZW1pdW1fcG9saWN5X2lkJ1xuXHRcdH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1BvbGljeScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfdXNlcl9kYXRlX3RvdGFsX2NvbHVtbjEsIG51bGwsIG51bGwsIHRydWUgKTtcblx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdwcmVtaXVtX3BvbGljeV9pZCcgKTtcblxuXHRcdC8vTWVhbCBQb2xpY3lcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElNZWFsUG9saWN5LFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX21lYWwnLFxuXHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0ZmllbGQ6ICdtZWFsX3BvbGljeV9pZCdcblx0XHR9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQb2xpY3knICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3VzZXJfZGF0ZV90b3RhbF9jb2x1bW4xLCBudWxsLCBudWxsLCB0cnVlICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAnbWVhbF9wb2xpY3lfaWQnICk7XG5cblx0XHQvL0JyZWFrIFBvbGljeVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSUJyZWFrUG9saWN5LFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2JyZWFrJyxcblx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdGZpZWxkOiAnYnJlYWtfcG9saWN5X2lkJ1xuXHRcdH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1BvbGljeScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfdXNlcl9kYXRlX3RvdGFsX2NvbHVtbjEsIG51bGwsIG51bGwsIHRydWUgKTtcblx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdicmVha19wb2xpY3lfaWQnICk7XG5cblx0XHQvL1BheSBDb2RlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJUGF5Q29kZSxcblx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9wYXlfY29kZScsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRmaWVsZDogJ3BheV9jb2RlX2lkJ1xuXHRcdH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1BheSBDb2RlJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl91c2VyX2RhdGVfdG90YWxfY29sdW1uMSApO1xuXG5cdFx0Ly9EZWZhdWx0IEJyYW5jaFxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblxuXHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJQnJhbmNoLFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2JyYW5jaCcsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRmaWVsZDogJ2JyYW5jaF9pZCdcblx0XHR9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdCcmFuY2gnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3VzZXJfZGF0ZV90b3RhbF9jb2x1bW4xLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0aWYgKCAhdGhpcy5zaG93X2JyYW5jaF91aSApIHtcblx0XHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ2JyYW5jaF9pZCcgKTtcblx0XHR9XG5cblx0XHQvL0RlcGFydG1lbnRcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSURlcGFydG1lbnQsXG5cdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfZGVwYXJ0bWVudCcsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRmaWVsZDogJ2RlcGFydG1lbnRfaWQnXG5cdFx0fSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRGVwYXJ0bWVudCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfdXNlcl9kYXRlX3RvdGFsX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHRpZiAoICF0aGlzLnNob3dfZGVwYXJ0bWVudF91aSApIHtcblx0XHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ2RlcGFydG1lbnRfaWQnICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgKSB7XG5cblx0XHRcdC8vSm9iXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElKb2IsXG5cdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2pvYicsXG5cdFx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0XHRzZXRSZWFsVmFsdWVDYWxsQmFjazogKCBmdW5jdGlvbiggdmFsICkge1xuXG5cdFx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRqb2JfY29kZXIuc2V0VmFsdWUoIHZhbC5tYW51YWxfaWQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKSxcblx0XHRcdFx0ZmllbGQ6ICdqb2JfaWQnXG5cdFx0XHR9ICk7XG5cblx0XHRcdHdpZGdldENvbnRhaW5lciA9ICQoICc8ZGl2IGNsYXNzPVxcJ3dpZGdldC1oLWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdHZhciBqb2JfY29kZXIgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdGpvYl9jb2Rlci5UVGV4dElucHV0KCB7IGZpZWxkOiAnam9iX3F1aWNrX3NlYXJjaCcsIGRpc2FibGVfa2V5dXBfZXZlbnQ6IHRydWUgfSApO1xuXHRcdFx0am9iX2NvZGVyLmFkZENsYXNzKCAnam9iLWNvZGVyJyApO1xuXG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBqb2JfY29kZXIgKTtcblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdKb2InICksIFtmb3JtX2l0ZW1faW5wdXQsIGpvYl9jb2Rlcl0sIHRhYl91c2VyX2RhdGVfdG90YWxfY29sdW1uMSwgJycsIHdpZGdldENvbnRhaW5lciwgdHJ1ZSApO1xuXG5cdFx0XHRpZiAoICF0aGlzLnNob3dfam9iX3VpICkge1xuXHRcdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdqb2JfaWQnICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vSm9iIEl0ZW1cblx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSUpvYkl0ZW0sXG5cdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2pvYl9pdGVtJyxcblx0XHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRcdHNldFJlYWxWYWx1ZUNhbGxCYWNrOiAoIGZ1bmN0aW9uKCB2YWwgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHZhbCApIHtcblx0XHRcdFx0XHRcdGpvYl9pdGVtX2NvZGVyLnNldFZhbHVlKCB2YWwubWFudWFsX2lkICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICksXG5cdFx0XHRcdGZpZWxkOiAnam9iX2l0ZW1faWQnXG5cdFx0XHR9ICk7XG5cblx0XHRcdHdpZGdldENvbnRhaW5lciA9ICQoICc8ZGl2IGNsYXNzPVxcJ3dpZGdldC1oLWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdHZhciBqb2JfaXRlbV9jb2RlciA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0am9iX2l0ZW1fY29kZXIuVFRleHRJbnB1dCggeyBmaWVsZDogJ2pvYl9pdGVtX3F1aWNrX3NlYXJjaCcsIGRpc2FibGVfa2V5dXBfZXZlbnQ6IHRydWUgfSApO1xuXHRcdFx0am9iX2l0ZW1fY29kZXIuYWRkQ2xhc3MoICdqb2ItY29kZXInICk7XG5cblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGpvYl9pdGVtX2NvZGVyICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnVGFzaycgKSwgW2Zvcm1faXRlbV9pbnB1dCwgam9iX2l0ZW1fY29kZXJdLCB0YWJfdXNlcl9kYXRlX3RvdGFsX2NvbHVtbjEsICcnLCB3aWRnZXRDb250YWluZXIsIHRydWUgKTtcblxuXHRcdFx0aWYgKCAhdGhpcy5zaG93X2pvYl9pdGVtX3VpICkge1xuXHRcdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdqb2JfaXRlbV9pZCcgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly9QdW5jaCBUYWdcblx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVB1bmNoVGFnLFxuXHRcdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IHRydWUsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3B1bmNoX3RhZycsXG5cdFx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0XHRnZXRfcmVhbF9kYXRhX29uX211bHRpOiB0cnVlLFxuXHRcdFx0XHRzZXRSZWFsVmFsdWVDYWxsQmFjazogKCAoIHB1bmNoX3RhZ3MsIGdldF9yZWFsX2RhdGEgKSA9PiB7XG5cdFx0XHRcdFx0aWYgKCBwdW5jaF90YWdzICkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZXRQdW5jaFRhZ1F1aWNrU2VhcmNoTWFudWFsSWRzKCBwdW5jaF90YWdzLCBnZXRfcmVhbF9kYXRhICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICksXG5cdFx0XHRcdGZpZWxkOiAncHVuY2hfdGFnX2lkJ1xuXHRcdFx0fSApO1xuXG5cdFx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHR2YXIgcHVuY2hfdGFnX2NvZGVyID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRwdW5jaF90YWdfY29kZXIuVFRleHRJbnB1dCggeyBmaWVsZDogJ3B1bmNoX3RhZ19xdWlja19zZWFyY2gnLCBkaXNhYmxlX2tleXVwX2V2ZW50OiB0cnVlIH0gKTtcblx0XHRcdHB1bmNoX3RhZ19jb2Rlci5hZGRDbGFzcyggJ2pvYi1jb2RlcicgKTtcblxuXHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggcHVuY2hfdGFnX2NvZGVyICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnVGFncycgKSwgW2Zvcm1faXRlbV9pbnB1dCwgcHVuY2hfdGFnX2NvZGVyXSwgdGFiX3VzZXJfZGF0ZV90b3RhbF9jb2x1bW4xLCAnJywgd2lkZ2V0Q29udGFpbmVyLCB0cnVlICk7XG5cblx0XHRcdGlmICggIXRoaXMuc2hvd19wdW5jaF90YWdfdWkgKSB7XG5cdFx0XHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ3B1bmNoX3RhZ19pZCcgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvL1N0YXJ0IERhdGUgVGltZVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuREFURV9QSUNLRVIgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVERhdGVQaWNrZXIoIHsgZmllbGQ6ICdzdGFydF90aW1lX3N0YW1wJywgbW9kZTogJ2RhdGVfdGltZScgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnU3RhcnQgRGF0ZS9UaW1lJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl91c2VyX2RhdGVfdG90YWxfY29sdW1uMiwgJycsIG51bGwsIHRydWUsIHRydWUgKTtcblxuXHRcdC8vRW5kIERhdGUgVGltZVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuREFURV9QSUNLRVIgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVERhdGVQaWNrZXIoIHsgZmllbGQ6ICdlbmRfdGltZV9zdGFtcCcsIG1vZGU6ICdkYXRlX3RpbWUnIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0VuZCBEYXRlL1RpbWUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3VzZXJfZGF0ZV90b3RhbF9jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0Ly9DdXJyZW5jeVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSUN1cnJlbmN5LFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2N1cnJlbmN5Jyxcblx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdGZpZWxkOiAnY3VycmVuY3lfaWQnLFxuXHRcdFx0c2V0X2VtcHR5OiB0cnVlXG5cdFx0fSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQ3VycmVuY3knICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX3VzZXJfZGF0ZV90b3RhbF9jb2x1bW4yICk7XG5cblx0XHQvL0Jhc2UgSG91cmx5IFJhdGVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2Jhc2VfaG91cmx5X3JhdGUnLCB3aWR0aDogOTAgfSApO1xuXG5cdFx0d2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblx0XHR2YXIgY3VycmVuY3kgPSAkKCAnPHNwYW4gY2xhc3M9XFwndXNlckRhdGVUb3RhbC1jdXJyZW5jeSB3aWRnZXQtbGVmdC1sYWJlbFxcJz48L3NwYW4+JyApO1xuXHRcdHZhciBjb2RlID0gJCggJzxzcGFuIGNsYXNzPVxcJ3VzZXJEYXRlVG90YWwtY29kZSB3aWRnZXQtcmlnaHQtbGFiZWxcXCc+PC9zcGFuPicgKTtcblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBjdXJyZW5jeSApO1xuXHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGNvZGUgKTtcblxuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQmFzZSBIb3VybHkgUmF0ZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfdXNlcl9kYXRlX3RvdGFsX2NvbHVtbjIsICcnLCB3aWRnZXRDb250YWluZXIsIHRydWUgKTtcblxuXHRcdC8vSG91cmx5IFJhdGVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2hvdXJseV9yYXRlJywgd2lkdGg6IDkwIH0gKTtcblxuXHRcdHdpZGdldENvbnRhaW5lciA9ICQoICc8ZGl2IGNsYXNzPVxcJ3dpZGdldC1oLWJveFxcJz48L2Rpdj4nICk7XG5cdFx0Y3VycmVuY3kgPSAkKCAnPHNwYW4gY2xhc3M9XFwndXNlckRhdGVUb3RhbC1jdXJyZW5jeSB3aWRnZXQtbGVmdC1sYWJlbFxcJz48L3NwYW4+JyApO1xuXHRcdGNvZGUgPSAkKCAnPHNwYW4gY2xhc3M9XFwndXNlckRhdGVUb3RhbC1jb2RlIHdpZGdldC1yaWdodC1sYWJlbFxcJz48L3NwYW4+JyApO1xuXHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGN1cnJlbmN5ICk7XG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggY29kZSApO1xuXG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdIb3VybHkgUmF0ZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfdXNlcl9kYXRlX3RvdGFsX2NvbHVtbjIsICcnLCB3aWRnZXRDb250YWluZXIsIHRydWUgKTtcblxuXHRcdC8vVG90YWwgQW1vdW50XG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0KCB7IGZpZWxkOiAndG90YWxfdGltZV9hbW91bnQnIH0gKTtcblx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXHRcdGN1cnJlbmN5ID0gJCggJzxzcGFuIGNsYXNzPVxcJ3VzZXJEYXRlVG90YWwtY3VycmVuY3kgd2lkZ2V0LWxlZnQtbGFiZWxcXCc+PC9zcGFuPicgKTtcblx0XHRjb2RlID0gJCggJzxzcGFuIGNsYXNzPVxcJ3VzZXJEYXRlVG90YWwtY29kZSB3aWRnZXQtcmlnaHQtbGFiZWxcXCc+PC9zcGFuPicgKTtcblx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBjdXJyZW5jeSApO1xuXHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGNvZGUgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1RvdGFsIEFtb3VudCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfdXNlcl9kYXRlX3RvdGFsX2NvbHVtbjIsICcnLCB3aWRnZXRDb250YWluZXIsIHRydWUgKTtcblxuXHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApICkge1xuXG5cdFx0XHQvL1F1YW5pdGl0eVxuXHRcdFx0dmFyIGdvb2QgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRcdGdvb2QuVFRleHRJbnB1dCggeyBmaWVsZDogJ3F1YW50aXR5Jywgd2lkdGg6IDUwIH0gKTtcblx0XHRcdGdvb2QuYWRkQ2xhc3MoICdxdWFudGl0eS1pbnB1dCcgKTtcblxuXHRcdFx0dmFyIGdvb2RfbGFiZWwgPSAkKCAnPHNwYW4gY2xhc3M9XFwnd2lkZ2V0LXJpZ2h0LWxhYmVsXFwnPicgKyAkLmkxOG4uXyggJ0dvb2QnICkgKyAnOiA8L3NwYW4+JyApO1xuXG5cdFx0XHR2YXIgYmFkID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRiYWQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2JhZF9xdWFudGl0eScsIHdpZHRoOiA1MCB9ICk7XG5cdFx0XHRiYWQuYWRkQ2xhc3MoICdxdWFudGl0eS1pbnB1dCcgKTtcblxuXHRcdFx0dmFyIGJhZF9sYWJlbCA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtcmlnaHQtbGFiZWxcXCc+LyAnICsgJC5pMThuLl8oICdCYWQnICkgKyAnOiA8L3NwYW4+JyApO1xuXG5cdFx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBnb29kX2xhYmVsICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBnb29kICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBiYWRfbGFiZWwgKTtcblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGJhZCApO1xuXG5cdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1F1YW50aXR5JyApLCBbZ29vZCwgYmFkXSwgdGFiX3VzZXJfZGF0ZV90b3RhbF9jb2x1bW4yLCAnJywgd2lkZ2V0Q29udGFpbmVyLCB0cnVlICk7XG5cblx0XHRcdGlmICggIXRoaXMuc2hvd19iYWRfcXVhbnRpdHlfdWkgJiYgIXRoaXMuc2hvd19nb29kX3F1YW50aXR5X3VpICkge1xuXHRcdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdxdWFudGl0eScgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICggIXRoaXMuc2hvd19iYWRfcXVhbnRpdHlfdWkgKSB7XG5cdFx0XHRcdFx0YmFkX2xhYmVsLmhpZGUoKTtcblx0XHRcdFx0XHRiYWQuaGlkZSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCAhdGhpcy5zaG93X2dvb2RfcXVhbnRpdHlfdWkgKSB7XG5cdFx0XHRcdFx0Z29vZF9sYWJlbC5oaWRlKCk7XG5cdFx0XHRcdFx0Z29vZC5oaWRlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly9Ob3RlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0FSRUEgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRBcmVhKCB7IGZpZWxkOiAnbm90ZScsIHdpZHRoOiAnMTAwJScgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnTm90ZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfdXNlcl9kYXRlX3RvdGFsX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlLCB0cnVlICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnBhcmVudCgpLndpZHRoKCAnNDUlJyApO1xuXG5cdFx0aWYgKCAhdGhpcy5zaG93X25vdGVfdWkgKSB7XG5cdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdub3RlJyApO1xuXHRcdH1cblxuXHRcdC8vT3ZlcnJpZGVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNIRUNLQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDaGVja2JveCggeyBmaWVsZDogJ292ZXJyaWRlJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdPdmVycmlkZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfdXNlcl9kYXRlX3RvdGFsX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlLCB0cnVlICk7XG5cdH1cblxuXHRjbGVhbldoZW5VbmxvYWRWaWV3KCBjYWxsQmFjayApIHtcblxuXHRcdCQoICcjdXNlcl9kYXRlX3RvdGFsX3ZpZXdfY29udGFpbmVyJyApLnJlbW92ZSgpO1xuXHRcdHN1cGVyLmNsZWFuV2hlblVubG9hZFZpZXcoIGNhbGxCYWNrICk7XG5cblx0fVxufVxuXG5Vc2VyRGF0ZVRvdGFsVmlld0NvbnRyb2xsZXIubG9hZFZpZXcgPSBmdW5jdGlvbiggY29udGFpbmVyICkge1xuXG5cdEdsb2JhbC5sb2FkVmlld1NvdXJjZSggJ1VzZXJEYXRlVG90YWwnLCAnVXNlckRhdGVUb3RhbFZpZXcuaHRtbCcsIGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cblx0XHR2YXIgYXJncyA9IHt9O1xuXHRcdHZhciB0ZW1wbGF0ZSA9IF8udGVtcGxhdGUoIHJlc3VsdCApO1xuXG5cdFx0aWYgKCBHbG9iYWwuaXNTZXQoIGNvbnRhaW5lciApICkge1xuXHRcdFx0Y29udGFpbmVyLmh0bWwoIHRlbXBsYXRlKCBhcmdzICkgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0R2xvYmFsLmNvbnRlbnRDb250YWluZXIoKS5odG1sKCB0ZW1wbGF0ZSggYXJncyApICk7XG5cdFx0fVxuXG5cdH0gKTtcblxufTtcblxuVXNlckRhdGVUb3RhbFZpZXdDb250cm9sbGVyLmxvYWRTdWJWaWV3ID0gZnVuY3Rpb24oIGNvbnRhaW5lciwgYmVmb3JlVmlld0xvYWRlZEZ1biwgYWZ0ZXJWaWV3TG9hZGVkRnVuICkge1xuXG5cdEdsb2JhbC5sb2FkVmlld1NvdXJjZSggJ1VzZXJEYXRlVG90YWwnLCAnU3ViVXNlckRhdGVUb3RhbFZpZXcuaHRtbCcsIGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cblx0XHR2YXIgYXJncyA9IHt9O1xuXHRcdHZhciB0ZW1wbGF0ZSA9IF8udGVtcGxhdGUoIHJlc3VsdCApO1xuXG5cdFx0aWYgKCBHbG9iYWwuaXNTZXQoIGJlZm9yZVZpZXdMb2FkZWRGdW4gKSApIHtcblx0XHRcdGJlZm9yZVZpZXdMb2FkZWRGdW4oKTtcblx0XHR9XG5cblx0XHRpZiAoIEdsb2JhbC5pc1NldCggY29udGFpbmVyICkgKSB7XG5cdFx0XHRjb250YWluZXIuaHRtbCggdGVtcGxhdGUoIGFyZ3MgKSApO1xuXG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggYWZ0ZXJWaWV3TG9hZGVkRnVuICkgKSB7XG5cblx0XHRcdFx0VFRQcm9taXNlLndhaXQoICdCYXNlVmlld0NvbnRyb2xsZXInLCAnaW5pdGlhbGl6ZScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGFmdGVyVmlld0xvYWRlZEZ1biggc3ViX3VzZXJfZGF0ZV90b3RhbF92aWV3X2NvbnRyb2xsZXIgKTtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0gKTtcblxufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///827\n")}}]);